{
  "version": 3,
  "sources": ["../vendor/fflate/fflate.esm.js", "../vendor/upng/upng.esm.js", "../src/version.ts", "../src/app/pwa-shell.ts", "../src/score/paper.ts", "../src/keyboard/latch.ts", "../src/score/pitch.ts", "../src/score/repeats.ts", "../src/score/song.ts", "../src/score/arrange.ts", "../src/score/grooves.gen.ts", "../src/score/groove.ts", "../src/score/commands.ts", "../src/keyboard/keys.ts", "../src/keyboard/midi.ts", "../src/ui/perf-trace.ts", "../src/score/lyrics.ts", "../src/score/lyric-check.ts", "../src/singer/packs.gen.ts", "../src/format/performance.ts", "../src/score/perform.ts", "../src/gm/percussion.gen.ts", "../src/gm/percussion.ts", "../src/render/smufl.ts", "../src/score/clef.ts", "../src/score/merge.ts", "../src/render/engrave.ts", "../src/render/svg.ts", "../src/render/lyric-font.ts", "../src/ui/lyric-editor.ts", "../src/score/marks.ts", "../src/keyboard/drum.ts", "../src/ui/metronome.ts", "../src/ui/mark-editor.ts", "../src/ui/title-editor.ts", "../src/app/workspace.ts", "../src/ui/part-colors.ts", "../src/ui/score-view.ts", "../src/ui/platform-guards.ts", "../src/keyboard/pad-layout.ts", "../src/keyboard/wheel.ts", "../src/keyboard/pad.ts", "../src/keyboard/chords.ts", "../src/score/scales.ts", "../src/app/pad-music.ts", "../src/app/pad-keys.ts", "../node_modules/@internal/workbench-elements/dist/host-floors.js", "../node_modules/@internal/workbench-elements/dist/anchored-popup.js", "../node_modules/@internal/workbench-elements/dist/icon.js", "../node_modules/@internal/workbench-elements/dist/popup-menu.js", "../node_modules/@internal/workbench-elements/dist/notice.js", "../node_modules/@internal/gallery/dist/core/text.js", "../node_modules/@internal/gallery/dist/core/device-kv.js", "../node_modules/@internal/store/dist/base/substrate.js", "../node_modules/@internal/store/dist/works/local-head.js", "../node_modules/@internal/store/dist/base/error-handling.js", "../node_modules/@internal/store/dist/works/seal.js", "../node_modules/@internal/store/dist/base/identifiers.js", "../node_modules/@internal/store/dist/works/safe-resolve.js", "../node_modules/@internal/store/dist/works/push.js", "../node_modules/@internal/store/dist/works/freshness.js", "../node_modules/@internal/store/dist/works/fresh-hints.js", "../node_modules/@internal/store/dist/base/move-aside.js", "../node_modules/@internal/store/dist/works/delete.js", "../node_modules/@internal/store/dist/base/is-hidden.js", "../node_modules/@internal/store/dist/base/errors.js", "../node_modules/@internal/store/dist/works/cloud-sync.js", "../node_modules/@internal/store/dist/works/identity.js", "../node_modules/@internal/store/dist/works/trash.js", "../node_modules/@internal/store/dist/works/offload.js", "../node_modules/@internal/store/dist/works/reconcile.js", "../node_modules/@internal/store/dist/works/pending-gone.js", "../node_modules/@internal/store/dist/works/folder-merge.js", "../node_modules/@internal/store/dist/works/folder-flow.js", "../node_modules/@internal/store/dist/works/collection.js", "../node_modules/@internal/store/dist/works/listing.js", "../node_modules/@internal/store/dist/works/upload-queue.js", "../node_modules/@internal/store/dist/works/trash-merge.js", "../node_modules/@internal/store/dist/base/idb-store.js", "../node_modules/@internal/store/dist/base/blob-partition.js", "../node_modules/@internal/store/dist/base/local-cache.js", "../node_modules/@internal/store/dist/stream/chunk-scheduler.js", "../node_modules/@internal/store/dist/stream/download-session.js", "../node_modules/@internal/store/dist/base/kv-namespace.js", "../node_modules/@internal/store/dist/works/migration.js", "../node_modules/@internal/store/dist/works/zip-peek.js", "../node_modules/@internal/store/dist/base/persistence.js", "../node_modules/@internal/store/dist/base/ui-text.js", "../node_modules/@internal/store/dist/create-store.js", "../node_modules/@internal/store/dist/works/maintenance.js", "../node_modules/@internal/store/dist/base/providers/range-body.js", "../node_modules/@internal/store/dist/base/providers/graph.js", "../node_modules/@internal/store/dist/base/providers/auth.js", "../node_modules/@internal/store/dist/base/folder-delete.js", "../node_modules/@internal/store/dist/base/onedrive-provider.js", "../node_modules/@internal/store/dist/base/providers/index.js", "../node_modules/@internal/gallery/dist/core/model/gallery-model.js", "../node_modules/@internal/gallery/dist/core/model/gallery-path.js", "../node_modules/@internal/gallery/dist/core/model/natural-order.js", "../node_modules/@internal/gallery/dist/core/model/gallery-view-model.js", "../node_modules/@internal/gallery/dist/core/model/cloud-image-model.js", "../node_modules/@internal/gallery/dist/core/guards/frame-gate.js", "../node_modules/@internal/gallery/dist/core/guards/first-frame-watchdog.js", "../node_modules/@internal/gallery/dist/core/guards/diag-log.js", "../node_modules/@internal/gallery/dist/core/library/gallery-registry.js", "../node_modules/@internal/gallery/dist/core/backup/library-backup.js", "../node_modules/@internal/gallery/dist/core/model/aside.js", "../node_modules/@internal/gallery/dist/core/data-face.js", "../node_modules/@internal/gallery/dist/core/verbs.js", "../node_modules/@internal/gallery/dist/core/thumbs/thumb-store.js", "../node_modules/@internal/gallery/dist/core/thumbs/thumb-cache.js", "../node_modules/@internal/gallery/dist/core/thumbs/png-text.js", "../node_modules/@internal/gallery/dist/core/thumbs/make-thumb.js", "../node_modules/@internal/gallery/dist/core/facts/facts-cache.js", "../node_modules/@internal/gallery/dist/ui/store-ui.js", "../node_modules/@internal/gallery/dist/ui/templates.js", "../node_modules/@internal/gallery/dist/ui/templates.compiled.js", "../node_modules/@internal/gallery/dist/ui/gallery-screen.js", "../node_modules/@internal/gallery/dist/create-gallery.js", "../src/device-kv.ts", "../src/app/report-error.ts", "../src/app/pad-host.ts", "../src/score/lab-score.ts", "../src/singer/audio.ts", "../src/singer/client.ts", "../src/app/resource-watch.ts", "../src/export/mp3.ts", "../src/export/id3.ts", "../node_modules/@internal/model-packs/dist/sha256.js", "../node_modules/@internal/model-packs/dist/pack-store.js", "../src/singer/credit-translations.ts", "../src/gm/sounds.gen.ts", "../src/gm/sound-cache.ts", "../src/gm/sf2-subset.ts", "../src/sources/sha256.ts", "../src/sources/sounds.ts", "../src/sources/models.ts", "../src/score/roles.ts", "../src/format/project.ts", "../src/score/lang.ts", "../src/format/xml.ts", "../src/format/musicxml.ts", "../src/format/contract.ts", "../src/format/sha256-sync.ts", "../src/format/final.ts", "../src/format/migrate/index.ts", "../src/format/credits.ts", "../src/gm/tsf-standalone.ts", "../src/engine/fx.ts", "../src/engine/studio.ts", "../src/engine/studio-client.ts", "../src/performers/registry.ts", "../src/performers/tsukuyomi.ts", "../src/gm/sf-key.ts", "../src/engine/timeline.ts", "../src/performers/vowel-sampler.ts", "../src/gm/instruments.gen.ts", "../src/gm/catalog.ts", "../src/performers/soundfont.ts", "../src/engine/chain.ts", "../src/core/render.ts", "../src/engine/scheduler.ts", "../src/app/names.ts", "../src/ui/render-progress.ts", "../src/score/history.ts", "../src/app/performance.ts", "../src/app/overlay.ts", "../src/engine/vowel-table.ts", "../src/ui/finder.ts", "../src/ui/spectrum.ts", "../src/ui/plugins.ts", "../src/keyboard/param-row.ts", "../src/ui/scopes.ts", "../src/ui/studio.ts", "../src/core/version.ts", "../src/app/doc-file.ts", "../src/app/main.ts", "../src/config.ts", "../src/identifiers.ts", "../src/ui/sheets.ts", "../src/store-ui.ts", "../node_modules/@internal/encryption/dist/encryption.js", "../src/encryption.ts", "../src/app-store.ts", "../vendor/vue/vue.esm-browser.prod.js", "../src/ui/icon.ts", "../src/ui/song-cover.ts", "../src/app/song-player.ts", "../src/gallery-host.ts", "../src/editor-session/editor-session.ts", "../node_modules/@internal/reference-window/dist/pointer-gesture.js", "../node_modules/@internal/reference-window/dist/deck/deck.js", "../node_modules/@internal/reference-window/dist/deck/import.js", "../node_modules/@internal/reference-window/dist/reference-window.js", "../node_modules/@internal/reference-window/dist/deck/manifest.js", "../src/image/codec.ts", "../src/image/shrink.ts", "../src/app/ref-transcode.ts", "../src/app/reference-host.ts", "../src/export/pdf.ts", "../src/export/score-pdf.ts", "../src/export/pdf-assets.ts", "../src/export/ttf.ts", "../src/app/diag-ui.ts", "../src/image/cover.ts", "../src/score/clipboard.ts", "../src/app/document.ts", "../src/app/home.ts", "../src/format/encode-client.ts", "../src/app/factory-reset.ts", "../src/score/desk.ts", "../src/ui/sel-bar.ts"],
  "sourcesContent": ["// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n    var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n        c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n    ], { type: 'text/javascript' }))));\n    w.onmessage = function (e) {\n        var d = e.data, ed = d.$e$;\n        if (ed) {\n            var err = new Error(ed[0]);\n            err['code'] = ed[1];\n            err.stack = ed[2];\n            cb(err, null);\n        }\n        else\n            cb(null, d);\n    };\n    w.postMessage(msg, transfer);\n    return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n    var b = new u16(31);\n    for (var i = 0; i < 31; ++i) {\n        b[i] = start += 1 << eb[i - 1];\n    }\n    // numbers here are at max 18 bits\n    var r = new i32(b[30]);\n    for (var i = 1; i < 30; ++i) {\n        for (var j = b[i]; j < b[i + 1]; ++j) {\n            r[j] = ((j - b[i]) << 5) | i;\n        }\n    }\n    return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n    // reverse table algorithm from SO\n    var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n    x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n    x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n    rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n    var s = cd.length;\n    // index\n    var i = 0;\n    // u16 \"map\": index -> # of codes with bit length = index\n    var l = new u16(mb);\n    // length of cd must be 288 (total # of codes)\n    for (; i < s; ++i) {\n        if (cd[i])\n            ++l[cd[i] - 1];\n    }\n    // u16 \"map\": index -> minimum code for bit length = index\n    var le = new u16(mb);\n    for (i = 1; i < mb; ++i) {\n        le[i] = (le[i - 1] + l[i - 1]) << 1;\n    }\n    var co;\n    if (r) {\n        // u16 \"map\": index -> number of actual bits, symbol for code\n        co = new u16(1 << mb);\n        // bits to remove for reverser\n        var rvb = 15 - mb;\n        for (i = 0; i < s; ++i) {\n            // ignore 0 lengths\n            if (cd[i]) {\n                // num encoding both symbol and bits read\n                var sv = (i << 4) | cd[i];\n                // free bits\n                var r_1 = mb - cd[i];\n                // start value\n                var v = le[cd[i] - 1]++ << r_1;\n                // m is end value\n                for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n                    // every 16 bit value starting with the code yields the same result\n                    co[rev[v] >> rvb] = sv;\n                }\n            }\n        }\n    }\n    else {\n        co = new u16(s);\n        for (i = 0; i < s; ++i) {\n            if (cd[i]) {\n                co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n            }\n        }\n    }\n    return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n    flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n    flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n    flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n    flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n    fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n    var m = a[0];\n    for (var i = 1; i < a.length; ++i) {\n        if (a[i] > m)\n            m = a[i];\n    }\n    return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n    var o = (p / 8) | 0;\n    return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n    if (s == null || s < 0)\n        s = 0;\n    if (e == null || e > v.length)\n        e = v.length;\n    // can't use .constructor in case user-supplied\n    return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n    UnexpectedEOF: 0,\n    InvalidBlockType: 1,\n    InvalidLengthLiteral: 2,\n    InvalidDistance: 3,\n    StreamFinished: 4,\n    NoStreamHandler: 5,\n    InvalidHeader: 6,\n    NoCallback: 7,\n    InvalidUTF8: 8,\n    ExtraFieldTooLong: 9,\n    InvalidDate: 10,\n    FilenameTooLong: 11,\n    StreamFinishing: 12,\n    InvalidZipData: 13,\n    UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n    'unexpected EOF',\n    'invalid block type',\n    'invalid length/literal',\n    'invalid distance',\n    'stream finished',\n    'no stream handler',\n    ,\n    'no callback',\n    'invalid UTF-8 data',\n    'extra field too long',\n    'date not in range 1980-2099',\n    'filename too long',\n    'stream finishing',\n    'invalid zip data'\n    // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n    var e = new Error(msg || ec[ind]);\n    e.code = ind;\n    if (Error.captureStackTrace)\n        Error.captureStackTrace(e, err);\n    if (!nt)\n        throw e;\n    return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n    // source length       dict length\n    var sl = dat.length, dl = dict ? dict.length : 0;\n    if (!sl || st.f && !st.l)\n        return buf || new u8(0);\n    var noBuf = !buf;\n    // have to estimate size\n    var resize = noBuf || st.i != 2;\n    // no state\n    var noSt = st.i;\n    // Assumes roughly 33% compression ratio average\n    if (noBuf)\n        buf = new u8(sl * 3);\n    // ensure buffer can fit at least l elements\n    var cbuf = function (l) {\n        var bl = buf.length;\n        // need to increase size to fit\n        if (l > bl) {\n            // Double or set to necessary, whichever is greater\n            var nbuf = new u8(Math.max(bl * 2, l));\n            nbuf.set(buf);\n            buf = nbuf;\n        }\n    };\n    //  last chunk         bitpos           bytes\n    var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n    // total bits\n    var tbts = sl * 8;\n    do {\n        if (!lm) {\n            // BFINAL - this is only 1 when last chunk is next\n            final = bits(dat, pos, 1);\n            // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n            var type = bits(dat, pos + 1, 3);\n            pos += 3;\n            if (!type) {\n                // go to end of byte boundary\n                var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n                if (t > sl) {\n                    if (noSt)\n                        err(0);\n                    break;\n                }\n                // ensure size\n                if (resize)\n                    cbuf(bt + l);\n                // Copy over uncompressed data\n                buf.set(dat.subarray(s, t), bt);\n                // Get new bitpos, update byte count\n                st.b = bt += l, st.p = pos = t * 8, st.f = final;\n                continue;\n            }\n            else if (type == 1)\n                lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n            else if (type == 2) {\n                //  literal                            lengths\n                var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n                var tl = hLit + bits(dat, pos + 5, 31) + 1;\n                pos += 14;\n                // length+distance tree\n                var ldt = new u8(tl);\n                // code length tree\n                var clt = new u8(19);\n                for (var i = 0; i < hcLen; ++i) {\n                    // use index map to get real code\n                    clt[clim[i]] = bits(dat, pos + i * 3, 7);\n                }\n                pos += hcLen * 3;\n                // code lengths bits\n                var clb = max(clt), clbmsk = (1 << clb) - 1;\n                // code lengths map\n                var clm = hMap(clt, clb, 1);\n                for (var i = 0; i < tl;) {\n                    var r = clm[bits(dat, pos, clbmsk)];\n                    // bits read\n                    pos += r & 15;\n                    // symbol\n                    var s = r >> 4;\n                    // code length to copy\n                    if (s < 16) {\n                        ldt[i++] = s;\n                    }\n                    else {\n                        //  copy   count\n                        var c = 0, n = 0;\n                        if (s == 16)\n                            n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n                        else if (s == 17)\n                            n = 3 + bits(dat, pos, 7), pos += 3;\n                        else if (s == 18)\n                            n = 11 + bits(dat, pos, 127), pos += 7;\n                        while (n--)\n                            ldt[i++] = c;\n                    }\n                }\n                //    length tree                 distance tree\n                var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n                // max length bits\n                lbt = max(lt);\n                // max dist bits\n                dbt = max(dt);\n                lm = hMap(lt, lbt, 1);\n                dm = hMap(dt, dbt, 1);\n            }\n            else\n                err(1);\n            if (pos > tbts) {\n                if (noSt)\n                    err(0);\n                break;\n            }\n        }\n        // Make sure the buffer can hold this + the largest possible addition\n        // Maximum chunk size (practically, theoretically infinite) is 2^17\n        if (resize)\n            cbuf(bt + 131072);\n        var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n        var lpos = pos;\n        for (;; lpos = pos) {\n            // bits read, code\n            var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n            pos += c & 15;\n            if (pos > tbts) {\n                if (noSt)\n                    err(0);\n                break;\n            }\n            if (!c)\n                err(2);\n            if (sym < 256)\n                buf[bt++] = sym;\n            else if (sym == 256) {\n                lpos = pos, lm = null;\n                break;\n            }\n            else {\n                var add = sym - 254;\n                // no extra bits needed if less\n                if (sym > 264) {\n                    // index\n                    var i = sym - 257, b = fleb[i];\n                    add = bits(dat, pos, (1 << b) - 1) + fl[i];\n                    pos += b;\n                }\n                // dist\n                var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n                if (!d)\n                    err(3);\n                pos += d & 15;\n                var dt = fd[dsym];\n                if (dsym > 3) {\n                    var b = fdeb[dsym];\n                    dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n                }\n                if (pos > tbts) {\n                    if (noSt)\n                        err(0);\n                    break;\n                }\n                if (resize)\n                    cbuf(bt + 131072);\n                var end = bt + add;\n                if (bt < dt) {\n                    var shift = dl - dt, dend = Math.min(dt, end);\n                    if (shift + bt < 0)\n                        err(3);\n                    for (; bt < dend; ++bt)\n                        buf[bt] = dict[shift + bt];\n                }\n                for (; bt < end; ++bt)\n                    buf[bt] = buf[bt - dt];\n            }\n        }\n        st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n        if (lm)\n            final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n    } while (!final);\n    // don't reallocate for streams or user buffers\n    return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n    v <<= p & 7;\n    var o = (p / 8) | 0;\n    d[o] |= v;\n    d[o + 1] |= v >> 8;\n    d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n    // Need extra info to make a tree\n    var t = [];\n    for (var i = 0; i < d.length; ++i) {\n        if (d[i])\n            t.push({ s: i, f: d[i] });\n    }\n    var s = t.length;\n    var t2 = t.slice();\n    if (!s)\n        return { t: et, l: 0 };\n    if (s == 1) {\n        var v = new u8(t[0].s + 1);\n        v[t[0].s] = 1;\n        return { t: v, l: 1 };\n    }\n    t.sort(function (a, b) { return a.f - b.f; });\n    // after i2 reaches last ind, will be stopped\n    // freq must be greater than largest possible number of symbols\n    t.push({ s: -1, f: 25001 });\n    var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n    t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n    // efficient algorithm from UZIP.js\n    // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n    // symbols that combined have high freq, will start processing i2 (high-freq,\n    // non-composite) symbols instead\n    // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n    while (i1 != s - 1) {\n        l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n        r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n        t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n    }\n    var maxSym = t2[0].s;\n    for (var i = 1; i < s; ++i) {\n        if (t2[i].s > maxSym)\n            maxSym = t2[i].s;\n    }\n    // code lengths\n    var tr = new u16(maxSym + 1);\n    // max bits in tree\n    var mbt = ln(t[i1 - 1], tr, 0);\n    if (mbt > mb) {\n        // more algorithms from UZIP.js\n        // TODO: find out how this code works (debt)\n        //  ind    debt\n        var i = 0, dt = 0;\n        //    left            cost\n        var lft = mbt - mb, cst = 1 << lft;\n        t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n        for (; i < s; ++i) {\n            var i2_1 = t2[i].s;\n            if (tr[i2_1] > mb) {\n                dt += cst - (1 << (mbt - tr[i2_1]));\n                tr[i2_1] = mb;\n            }\n            else\n                break;\n        }\n        dt >>= lft;\n        while (dt > 0) {\n            var i2_2 = t2[i].s;\n            if (tr[i2_2] < mb)\n                dt -= 1 << (mb - tr[i2_2]++ - 1);\n            else\n                ++i;\n        }\n        for (; i >= 0 && dt; --i) {\n            var i2_3 = t2[i].s;\n            if (tr[i2_3] == mb) {\n                --tr[i2_3];\n                ++dt;\n            }\n        }\n        mbt = mb;\n    }\n    return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n    return n.s == -1\n        ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n        : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n    var s = c.length;\n    // Note that the semicolon was intentional\n    while (s && !c[--s])\n        ;\n    var cl = new u16(++s);\n    //  ind      num         streak\n    var cli = 0, cln = c[0], cls = 1;\n    var w = function (v) { cl[cli++] = v; };\n    for (var i = 1; i <= s; ++i) {\n        if (c[i] == cln && i != s)\n            ++cls;\n        else {\n            if (!cln && cls > 2) {\n                for (; cls > 138; cls -= 138)\n                    w(32754);\n                if (cls > 2) {\n                    w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n                    cls = 0;\n                }\n            }\n            else if (cls > 3) {\n                w(cln), --cls;\n                for (; cls > 6; cls -= 6)\n                    w(8304);\n                if (cls > 2)\n                    w(((cls - 3) << 5) | 8208), cls = 0;\n            }\n            while (cls--)\n                w(cln);\n            cls = 1;\n            cln = c[i];\n        }\n    }\n    return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n    var l = 0;\n    for (var i = 0; i < cl.length; ++i)\n        l += cf[i] * cl[i];\n    return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n    // no need to write 00 as type: TypedArray defaults to 0\n    var s = dat.length;\n    var o = shft(pos + 2);\n    out[o] = s & 255;\n    out[o + 1] = s >> 8;\n    out[o + 2] = out[o] ^ 255;\n    out[o + 3] = out[o + 1] ^ 255;\n    for (var i = 0; i < s; ++i)\n        out[o + i + 4] = dat[i];\n    return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n    wbits(out, p++, final);\n    ++lf[256];\n    var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n    var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n    var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n    var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n    var lcfreq = new u16(19);\n    for (var i = 0; i < lclt.length; ++i)\n        ++lcfreq[lclt[i] & 31];\n    for (var i = 0; i < lcdt.length; ++i)\n        ++lcfreq[lcdt[i] & 31];\n    var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n    var nlcc = 19;\n    for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n        ;\n    var flen = (bl + 5) << 3;\n    var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n    var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n    if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n        return wfblk(out, p, dat.subarray(bs, bs + bl));\n    var lm, ll, dm, dl;\n    wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n    if (dtlen < ftlen) {\n        lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n        var llm = hMap(lct, mlcb, 0);\n        wbits(out, p, nlc - 257);\n        wbits(out, p + 5, ndc - 1);\n        wbits(out, p + 10, nlcc - 4);\n        p += 14;\n        for (var i = 0; i < nlcc; ++i)\n            wbits(out, p + 3 * i, lct[clim[i]]);\n        p += 3 * nlcc;\n        var lcts = [lclt, lcdt];\n        for (var it = 0; it < 2; ++it) {\n            var clct = lcts[it];\n            for (var i = 0; i < clct.length; ++i) {\n                var len = clct[i] & 31;\n                wbits(out, p, llm[len]), p += lct[len];\n                if (len > 15)\n                    wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n            }\n        }\n    }\n    else {\n        lm = flm, ll = flt, dm = fdm, dl = fdt;\n    }\n    for (var i = 0; i < li; ++i) {\n        var sym = syms[i];\n        if (sym > 255) {\n            var len = (sym >> 18) & 31;\n            wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n            if (len > 7)\n                wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n            var dst = sym & 31;\n            wbits16(out, p, dm[dst]), p += dl[dst];\n            if (dst > 3)\n                wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n        }\n        else {\n            wbits16(out, p, lm[sym]), p += ll[sym];\n        }\n    }\n    wbits16(out, p, lm[256]);\n    return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n    var s = st.z || dat.length;\n    var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n    // writing to this writes to the output buffer\n    var w = o.subarray(pre, o.length - post);\n    var lst = st.l;\n    var pos = (st.r || 0) & 7;\n    if (lvl) {\n        if (pos)\n            w[0] = st.r >> 3;\n        var opt = deo[lvl - 1];\n        var n = opt >> 13, c = opt & 8191;\n        var msk_1 = (1 << plvl) - 1;\n        //    prev 2-byte val map    curr 2-byte val map\n        var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n        var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n        var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n        // 24576 is an arbitrary number of maximum symbols per block\n        // 424 buffer for last block\n        var syms = new i32(25000);\n        // length/literal freq   distance freq\n        var lf = new u16(288), df = new u16(32);\n        //  l/lcnt  exbits  index          l/lind  waitdx          blkpos\n        var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n        for (; i + 2 < s; ++i) {\n            // hash value\n            var hv = hsh(i);\n            // index mod 32768    previous index mod\n            var imod = i & 32767, pimod = head[hv];\n            prev[imod] = pimod;\n            head[hv] = imod;\n            // We always should modify head and prev, but only add symbols if\n            // this data is not yet processed (\"wait\" for wait index)\n            if (wi <= i) {\n                // bytes remaining\n                var rem = s - i;\n                if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n                    pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n                    li = lc_1 = eb = 0, bs = i;\n                    for (var j = 0; j < 286; ++j)\n                        lf[j] = 0;\n                    for (var j = 0; j < 30; ++j)\n                        df[j] = 0;\n                }\n                //  len    dist   chain\n                var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n                if (rem > 2 && hv == hsh(i - dif)) {\n                    var maxn = Math.min(n, rem) - 1;\n                    var maxd = Math.min(32767, i);\n                    // max possible length\n                    // not capped at dif because decompressors implement \"rolling\" index population\n                    var ml = Math.min(258, rem);\n                    while (dif <= maxd && --ch_1 && imod != pimod) {\n                        if (dat[i + l] == dat[i + l - dif]) {\n                            var nl = 0;\n                            for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n                                ;\n                            if (nl > l) {\n                                l = nl, d = dif;\n                                // break out early when we reach \"nice\" (we are satisfied enough)\n                                if (nl > maxn)\n                                    break;\n                                // now, find the rarest 2-byte sequence within this\n                                // length of literals and search for that instead.\n                                // Much faster than just using the start\n                                var mmd = Math.min(dif, nl - 2);\n                                var md = 0;\n                                for (var j = 0; j < mmd; ++j) {\n                                    var ti = i - dif + j & 32767;\n                                    var pti = prev[ti];\n                                    var cd = ti - pti & 32767;\n                                    if (cd > md)\n                                        md = cd, pimod = ti;\n                                }\n                            }\n                        }\n                        // check the previous match\n                        imod = pimod, pimod = prev[imod];\n                        dif += imod - pimod & 32767;\n                    }\n                }\n                // d will be nonzero only when a match was found\n                if (d) {\n                    // store both dist and len data in one int32\n                    // Make sure this is recognized as a len/dist with 28th bit (2^28)\n                    syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n                    var lin = revfl[l] & 31, din = revfd[d] & 31;\n                    eb += fleb[lin] + fdeb[din];\n                    ++lf[257 + lin];\n                    ++df[din];\n                    wi = i + l;\n                    ++lc_1;\n                }\n                else {\n                    syms[li++] = dat[i];\n                    ++lf[dat[i]];\n                }\n            }\n        }\n        for (i = Math.max(i, wi); i < s; ++i) {\n            syms[li++] = dat[i];\n            ++lf[dat[i]];\n        }\n        pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n        if (!lst) {\n            st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n            // shft(pos) now 1 less if pos & 7 != 0\n            pos -= 7;\n            st.h = head, st.p = prev, st.i = i, st.w = wi;\n        }\n    }\n    else {\n        for (var i = st.w || 0; i < s + lst; i += 65535) {\n            // end\n            var e = i + 65535;\n            if (e >= s) {\n                // write final block\n                w[(pos / 8) | 0] = lst;\n                e = s;\n            }\n            pos = wfblk(w, pos + 1, dat.subarray(i, e));\n        }\n        st.i = s;\n    }\n    return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n    var t = new Int32Array(256);\n    for (var i = 0; i < 256; ++i) {\n        var c = i, k = 9;\n        while (--k)\n            c = ((c & 1) && -306674912) ^ (c >>> 1);\n        t[i] = c;\n    }\n    return t;\n})();\n// CRC32\nvar crc = function () {\n    var c = -1;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var cr = c;\n            for (var i = 0; i < d.length; ++i)\n                cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n            c = cr;\n        },\n        d: function () { return ~c; }\n    };\n};\n// Adler32\nvar adler = function () {\n    var a = 1, b = 0;\n    return {\n        p: function (d) {\n            // closures have awful performance\n            var n = a, m = b;\n            var l = d.length | 0;\n            for (var i = 0; i != l;) {\n                var e = Math.min(i + 2655, l);\n                for (; i < e; ++i)\n                    m += n += d[i];\n                n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n            }\n            a = n, b = m;\n        },\n        d: function () {\n            a %= 65521, b %= 65521;\n            return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n        }\n    };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n    if (!st) {\n        st = { l: 1 };\n        if (opt.dictionary) {\n            var dict = opt.dictionary.subarray(-32768);\n            var newDat = new u8(dict.length + dat.length);\n            newDat.set(dict);\n            newDat.set(dat, dict.length);\n            dat = newDat;\n            st.w = dict.length;\n        }\n    }\n    return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n    var o = {};\n    for (var k in a)\n        o[k] = a[k];\n    for (var k in b)\n        o[k] = b[k];\n    return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n    var dt = fn();\n    var st = fn.toString();\n    var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n    for (var i = 0; i < dt.length; ++i) {\n        var v = dt[i], k = ks[i];\n        if (typeof v == 'function') {\n            fnStr += ';' + k + '=';\n            var st_1 = v.toString();\n            if (v.prototype) {\n                // for global objects\n                if (st_1.indexOf('[native code]') != -1) {\n                    var spInd = st_1.indexOf(' ', 8) + 1;\n                    fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n                }\n                else {\n                    fnStr += st_1;\n                    for (var t in v.prototype)\n                        fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n                }\n            }\n            else\n                fnStr += st_1;\n        }\n        else\n            td[k] = v;\n    }\n    return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n    var tl = [];\n    for (var k in v) {\n        if (v[k].buffer) {\n            tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n        }\n    }\n    return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n    if (!ch[id]) {\n        var fnStr = '', td_1 = {}, m = fns.length - 1;\n        for (var i = 0; i < m; ++i)\n            fnStr = wcln(fns[i], fnStr, td_1);\n        ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n    }\n    var td = mrg({}, ch[id].e);\n    return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n    out: o.size && new u8(o.size),\n    dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n    var w = wrkr(fns, init, id, function (err, dat) {\n        w.terminate();\n        cb(err, dat);\n    });\n    w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n    return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n    strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n    return function (ev) {\n        if (ev.data.length) {\n            strm.push(ev.data[0], ev.data[1]);\n            postMessage([ev.data[0].length]);\n        }\n        else\n            strm.flush();\n    };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n    var t;\n    var w = wrkr(fns, init, id, function (err, dat) {\n        if (err)\n            w.terminate(), strm.ondata.call(strm, err);\n        else if (!Array.isArray(dat))\n            ext(dat);\n        else if (dat.length == 1) {\n            strm.queuedSize -= dat[0];\n            if (strm.ondrain)\n                strm.ondrain(dat[0]);\n        }\n        else {\n            if (dat[1])\n                w.terminate();\n            strm.ondata.call(strm, err, dat[0], dat[1]);\n        }\n    });\n    w.postMessage(opts);\n    strm.queuedSize = 0;\n    strm.push = function (d, f) {\n        if (!strm.ondata)\n            err(5);\n        if (t)\n            strm.ondata(err(4, 0, 1), null, !!f);\n        strm.queuedSize += d.length;\n        w.postMessage([d, t = f], [d.buffer]);\n    };\n    strm.terminate = function () { w.terminate(); };\n    if (flush) {\n        strm.flush = function () { w.postMessage([]); };\n    }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n    for (; v; ++b)\n        d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n    var fn = o.filename;\n    c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n    if (o.mtime != 0)\n        wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n    if (fn) {\n        c[3] = 8;\n        for (var i = 0; i <= fn.length; ++i)\n            c[i + 10] = fn.charCodeAt(i);\n    }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n    if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n        err(6, 'invalid gzip data');\n    var flg = d[3];\n    var st = 10;\n    if (flg & 4)\n        st += (d[10] | d[11] << 8) + 2;\n    for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n        ;\n    return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n    var l = d.length;\n    return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n    var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n    c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n    c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n    if (o.dictionary) {\n        var h = adler();\n        h.p(o.dictionary);\n        wbytes(c, 2, h.d());\n    }\n};\n// zlib start\nvar zls = function (d, dict) {\n    if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n        err(6, 'invalid zlib data');\n    if ((d[1] >> 5 & 1) == +!dict)\n        err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n    return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n    if (typeof opts == 'function')\n        cb = opts, opts = {};\n    this.ondata = cb;\n    return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n    function Deflate(opts, cb) {\n        if (typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        this.o = opts || {};\n        this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n        // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n        // 98304 = 32768 (lookback) + 65536 (common chunk size)\n        this.b = new u8(98304);\n        if (this.o.dictionary) {\n            var dict = this.o.dictionary.subarray(-32768);\n            this.b.set(dict, 32768 - dict.length);\n            this.s.i = 32768 - dict.length;\n        }\n    }\n    Deflate.prototype.p = function (c, f) {\n        this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Deflate.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (this.s.l)\n            err(4);\n        var endLen = chunk.length + this.s.z;\n        if (endLen > this.b.length) {\n            if (endLen > 2 * this.b.length - 32768) {\n                var newBuf = new u8(endLen & -32768);\n                newBuf.set(this.b.subarray(0, this.s.z));\n                this.b = newBuf;\n            }\n            var split = this.b.length - this.s.z;\n            this.b.set(chunk.subarray(0, split), this.s.z);\n            this.s.z = this.b.length;\n            this.p(this.b, false);\n            this.b.set(this.b.subarray(-32768));\n            this.b.set(chunk.subarray(split), 32768);\n            this.s.z = chunk.length - split + 32768;\n            this.s.i = 32766, this.s.w = 32768;\n        }\n        else {\n            this.b.set(chunk, this.s.z);\n            this.s.z += chunk.length;\n        }\n        this.s.l = final & 1;\n        if (this.s.z > this.s.w + 8191 || final) {\n            this.p(this.b, final || false);\n            this.s.w = this.s.i, this.s.i -= 2;\n        }\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * deflated output for small inputs.\n     */\n    Deflate.prototype.flush = function () {\n        if (!this.ondata)\n            err(5);\n        if (this.s.l)\n            err(4);\n        this.p(this.b, false);\n        this.s.w = this.s.i, this.s.i -= 2;\n    };\n    return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n    function AsyncDeflate(opts, cb) {\n        astrmify([\n            bDflt,\n            function () { return [astrm, Deflate]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Deflate(ev.data);\n            onmessage = astrm(strm);\n        }, 6, 1);\n    }\n    return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n    ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n    return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n    function Inflate(opts, cb) {\n        // no StrmOpt here to avoid adding to workerizer\n        if (typeof opts == 'function')\n            cb = opts, opts = {};\n        this.ondata = cb;\n        var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n        this.s = { i: 0, b: dict ? dict.length : 0 };\n        this.o = new u8(32768);\n        this.p = new u8(0);\n        if (dict)\n            this.o.set(dict);\n    }\n    Inflate.prototype.e = function (c) {\n        if (!this.ondata)\n            err(5);\n        if (this.d)\n            err(4);\n        if (!this.p.length)\n            this.p = c;\n        else if (c.length) {\n            var n = new u8(this.p.length + c.length);\n            n.set(this.p), n.set(c, this.p.length), this.p = n;\n        }\n    };\n    Inflate.prototype.c = function (final) {\n        this.s.i = +(this.d = final || false);\n        var bts = this.s.b;\n        var dt = inflt(this.p, this.s, this.o);\n        this.ondata(slc(dt, bts, this.s.b), this.d);\n        this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n        this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n    };\n    /**\n     * Pushes a chunk to be inflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the final chunk\n     */\n    Inflate.prototype.push = function (chunk, final) {\n        this.e(chunk), this.c(final);\n    };\n    return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n    function AsyncInflate(opts, cb) {\n        astrmify([\n            bInflt,\n            function () { return [astrm, Inflate]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Inflate(ev.data);\n            onmessage = astrm(strm);\n        }, 7, 0);\n    }\n    return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt\n    ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\n/**\n * Expands DEFLATE data with no wrapper\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function inflateSync(data, opts) {\n    return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n    function Gzip(opts, cb) {\n        this.c = crc();\n        this.l = 0;\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gzip.prototype.push = function (chunk, final) {\n        this.c.p(chunk);\n        this.l += chunk.length;\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Gzip.prototype.p = function (c, f) {\n        var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n        if (this.v)\n            gzh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n        this.ondata(raw, f);\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * GZIPped output for small inputs.\n     */\n    Gzip.prototype.flush = function () {\n        Deflate.prototype.flush.call(this);\n    };\n    return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n    function AsyncGzip(opts, cb) {\n        astrmify([\n            bDflt,\n            gze,\n            function () { return [astrm, Deflate, Gzip]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Gzip(ev.data);\n            onmessage = astrm(strm);\n        }, 8, 1);\n    }\n    return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n        gze,\n        function () { return [gzipSync]; }\n    ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var c = crc(), l = data.length;\n    c.p(data);\n    var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n    return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n    function Gunzip(opts, cb) {\n        this.v = 1;\n        this.r = 0;\n        Inflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be GUNZIPped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Gunzip.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        this.r += chunk.length;\n        if (this.v) {\n            var p = this.p.subarray(this.v - 1);\n            var s = p.length > 3 ? gzs(p) : 4;\n            if (s > p.length) {\n                if (!final)\n                    return;\n            }\n            else if (this.v > 1 && this.onmember) {\n                this.onmember(this.r - p.length);\n            }\n            this.p = p.subarray(s), this.v = 0;\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n        // process concatenated GZIP\n        if (this.s.f && !this.s.l && !final) {\n            this.v = shft(this.s.p) + 9;\n            this.s = { i: 0 };\n            this.o = new u8(0);\n            this.push(new u8(0), final);\n        }\n    };\n    return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n    function AsyncGunzip(opts, cb) {\n        var _this = this;\n        astrmify([\n            bInflt,\n            guze,\n            function () { return [astrm, Inflate, Gunzip]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Gunzip(ev.data);\n            strm.onmember = function (offset) { return postMessage(offset); };\n            onmessage = astrm(strm);\n        }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n    }\n    return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt,\n        guze,\n        function () { return [gunzipSync]; }\n    ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\n/**\n * Expands GZIP data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function gunzipSync(data, opts) {\n    var st = gzs(data);\n    if (st + 8 > data.length)\n        err(6, 'invalid gzip data');\n    return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n    function Zlib(opts, cb) {\n        this.c = adler();\n        this.v = 1;\n        Deflate.call(this, opts, cb);\n    }\n    /**\n     * Pushes a chunk to be zlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Zlib.prototype.push = function (chunk, final) {\n        this.c.p(chunk);\n        Deflate.prototype.push.call(this, chunk, final);\n    };\n    Zlib.prototype.p = function (c, f) {\n        var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n        if (this.v)\n            zlh(raw, this.o), this.v = 0;\n        if (f)\n            wbytes(raw, raw.length - 4, this.c.d());\n        this.ondata(raw, f);\n    };\n    /**\n     * Flushes buffered uncompressed data. Useful to immediately retrieve the\n     * zlibbed output for small inputs.\n     */\n    Zlib.prototype.flush = function () {\n        Deflate.prototype.flush.call(this);\n    };\n    return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n    function AsyncZlib(opts, cb) {\n        astrmify([\n            bDflt,\n            zle,\n            function () { return [astrm, Deflate, Zlib]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Zlib(ev.data);\n            onmessage = astrm(strm);\n        }, 10, 1);\n    }\n    return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bDflt,\n        zle,\n        function () { return [zlibSync]; }\n    ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var a = adler();\n    a.p(data);\n    var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n    return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n    function Unzlib(opts, cb) {\n        Inflate.call(this, opts, cb);\n        this.v = opts && opts.dictionary ? 2 : 1;\n    }\n    /**\n     * Pushes a chunk to be unzlibbed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzlib.prototype.push = function (chunk, final) {\n        Inflate.prototype.e.call(this, chunk);\n        if (this.v) {\n            if (this.p.length < 6 && !final)\n                return;\n            this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n        }\n        if (final) {\n            if (this.p.length < 4)\n                err(6, 'invalid zlib data');\n            this.p = this.p.subarray(0, -4);\n        }\n        // necessary to prevent TS from using the closure value\n        // This allows for workerization to function correctly\n        Inflate.prototype.c.call(this, final);\n    };\n    return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n    function AsyncUnzlib(opts, cb) {\n        astrmify([\n            bInflt,\n            zule,\n            function () { return [astrm, Inflate, Unzlib]; }\n        ], this, StrmOpt.call(this, opts, cb), function (ev) {\n            var strm = new Unzlib(ev.data);\n            onmessage = astrm(strm);\n        }, 11, 0);\n    }\n    return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return cbify(data, opts, [\n        bInflt,\n        zule,\n        function () { return [unzlibSync]; }\n    ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\n/**\n * Expands Zlib data\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function unzlibSync(data, opts) {\n    return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n    function Decompress(opts, cb) {\n        this.o = StrmOpt.call(this, opts, cb) || {};\n        this.G = Gunzip;\n        this.I = Inflate;\n        this.Z = Unzlib;\n    }\n    // init substream\n    // overriden by AsyncDecompress\n    Decompress.prototype.i = function () {\n        var _this = this;\n        this.s.ondata = function (dat, final) {\n            _this.ondata(dat, final);\n        };\n    };\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Decompress.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (!this.s) {\n            if (this.p && this.p.length) {\n                var n = new u8(this.p.length + chunk.length);\n                n.set(this.p), n.set(chunk, this.p.length);\n            }\n            else\n                this.p = chunk;\n            if (this.p.length > 2) {\n                this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n                    ? new this.G(this.o)\n                    : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n                        ? new this.I(this.o)\n                        : new this.Z(this.o);\n                this.i();\n                this.s.push(this.p, final);\n                this.p = null;\n            }\n        }\n        else\n            this.s.push(chunk, final);\n    };\n    return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n    function AsyncDecompress(opts, cb) {\n        Decompress.call(this, opts, cb);\n        this.queuedSize = 0;\n        this.G = AsyncGunzip;\n        this.I = AsyncInflate;\n        this.Z = AsyncUnzlib;\n    }\n    AsyncDecompress.prototype.i = function () {\n        var _this = this;\n        this.s.ondata = function (err, dat, final) {\n            _this.ondata(err, dat, final);\n        };\n        this.s.ondrain = function (size) {\n            _this.queuedSize -= size;\n            if (_this.ondrain)\n                _this.ondrain(size);\n        };\n    };\n    /**\n     * Pushes a chunk to be decompressed\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncDecompress.prototype.push = function (chunk, final) {\n        this.queuedSize += chunk.length;\n        Decompress.prototype.push.call(this, chunk, final);\n    };\n    return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzip(data, opts, cb)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflate(data, opts, cb)\n            : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n    return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n        ? gunzipSync(data, opts)\n        : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n            ? inflateSync(data, opts)\n            : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n    for (var k in d) {\n        var val = d[k], n = p + k, op = o;\n        if (Array.isArray(val))\n            op = mrg(o, val[1]), val = val[0];\n        if (val instanceof u8)\n            t[n] = [val, op];\n        else {\n            t[n += '/'] = [new u8(0), op];\n            fltn(val, n, t, o);\n        }\n    }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n    td.decode(et, { stream: true });\n    tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n    for (var r = '', i = 0;;) {\n        var c = d[i++];\n        var eb = (c > 127) + (c > 223) + (c > 239);\n        if (i + eb > d.length)\n            return { s: r, r: slc(d, i - 1) };\n        if (!eb)\n            r += String.fromCharCode(c);\n        else if (eb == 3) {\n            c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n                r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n        }\n        else if (eb & 1)\n            r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n        else\n            r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n    }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is decoded\n     */\n    function DecodeUTF8(cb) {\n        this.ondata = cb;\n        if (tds)\n            this.t = new TextDecoder();\n        else\n            this.p = et;\n    }\n    /**\n     * Pushes a chunk to be decoded from UTF-8 binary\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    DecodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        final = !!final;\n        if (this.t) {\n            this.ondata(this.t.decode(chunk, { stream: true }), final);\n            if (final) {\n                if (this.t.decode().length)\n                    err(8);\n                this.t = null;\n            }\n            return;\n        }\n        if (!this.p)\n            err(4);\n        var dat = new u8(this.p.length + chunk.length);\n        dat.set(this.p);\n        dat.set(chunk, this.p.length);\n        var _a = dutf8(dat), s = _a.s, r = _a.r;\n        if (final) {\n            if (r.length)\n                err(8);\n            this.p = null;\n        }\n        else\n            this.p = r;\n        this.ondata(s, final);\n    };\n    return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n    /**\n     * Creates a UTF-8 decoding stream\n     * @param cb The callback to call whenever data is encoded\n     */\n    function EncodeUTF8(cb) {\n        this.ondata = cb;\n    }\n    /**\n     * Pushes a chunk to be encoded to UTF-8\n     * @param chunk The string data to push\n     * @param final Whether this is the last chunk\n     */\n    EncodeUTF8.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        if (this.d)\n            err(4);\n        this.ondata(strToU8(chunk), this.d = final || false);\n    };\n    return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n    if (latin1) {\n        var ar_1 = new u8(str.length);\n        for (var i = 0; i < str.length; ++i)\n            ar_1[i] = str.charCodeAt(i);\n        return ar_1;\n    }\n    if (te)\n        return te.encode(str);\n    var l = str.length;\n    var ar = new u8(str.length + (str.length >> 1));\n    var ai = 0;\n    var w = function (v) { ar[ai++] = v; };\n    for (var i = 0; i < l; ++i) {\n        if (ai + 5 > ar.length) {\n            var n = new u8(ai + 8 + ((l - i) << 1));\n            n.set(ar);\n            ar = n;\n        }\n        var c = str.charCodeAt(i);\n        if (c < 128 || latin1)\n            w(c);\n        else if (c < 2048)\n            w(192 | (c >> 6)), w(128 | (c & 63));\n        else if (c > 55295 && c < 57344)\n            c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n                w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n        else\n            w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n    }\n    return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n *               not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n    if (latin1) {\n        var r = '';\n        for (var i = 0; i < dat.length; i += 16384)\n            r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n        return r;\n    }\n    else if (td) {\n        return td.decode(dat);\n    }\n    else {\n        var _a = dutf8(dat), s = _a.s, r = _a.r;\n        if (r.length)\n            err(8);\n        return s;\n    }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n    var fnl = b2(d, b + 28), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl, bs = b4(d, b + 20);\n    var _a = z && bs == 4294967295 ? z64e(d, es) : [bs, b4(d, b + 24), b4(d, b + 42)], sc = _a[0], su = _a[1], off = _a[2];\n    return [b2(d, b + 10), sc, su, fn, es + b2(d, b + 30) + b2(d, b + 32), off];\n};\n// read zip64 extra field\nvar z64e = function (d, b) {\n    for (; b2(d, b) != 1; b += 4 + b2(d, b + 2))\n        ;\n    return [b8(d, b + 12), b8(d, b + 4), b8(d, b + 20)];\n};\n// extra field length\nvar exfl = function (ex) {\n    var le = 0;\n    if (ex) {\n        for (var k in ex) {\n            var l = ex[k].length;\n            if (l > 65535)\n                err(9);\n            le += l + 4;\n        }\n    }\n    return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n    var fl = fn.length, ex = f.extra, col = co && co.length;\n    var exl = exfl(ex);\n    wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n    if (ce != null)\n        d[b++] = 20, d[b++] = f.os;\n    d[b] = 20, b += 2; // spec compliance? what's that?\n    d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n    d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n    var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n    if (y < 0 || y > 119)\n        err(10);\n    wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n    if (c != -1) {\n        wbytes(d, b, f.crc);\n        wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n        wbytes(d, b + 8, f.size);\n    }\n    wbytes(d, b + 12, fl);\n    wbytes(d, b + 14, exl), b += 16;\n    if (ce != null) {\n        wbytes(d, b, col);\n        wbytes(d, b + 6, f.attrs);\n        wbytes(d, b + 10, ce), b += 14;\n    }\n    d.set(fn, b);\n    b += fl;\n    if (exl) {\n        for (var k in ex) {\n            var exf = ex[k], l = exf.length;\n            wbytes(d, b, +k);\n            wbytes(d, b + 2, l);\n            d.set(exf, b + 4), b += 4 + l;\n        }\n    }\n    if (col)\n        d.set(co, b), b += col;\n    return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n    wbytes(o, b, 0x6054B50); // skip disk\n    wbytes(o, b + 8, c);\n    wbytes(o, b + 10, c);\n    wbytes(o, b + 12, d);\n    wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n    /**\n     * Creates a pass-through stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     */\n    function ZipPassThrough(filename) {\n        this.filename = filename;\n        this.c = crc();\n        this.size = 0;\n        this.compression = 0;\n    }\n    /**\n     * Processes a chunk and pushes to the output stream. You can override this\n     * method in a subclass for custom behavior, but by default this passes\n     * the data through. You must call this.ondata(err, chunk, final) at some\n     * point in this method.\n     * @param chunk The chunk to process\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.process = function (chunk, final) {\n        this.ondata(null, chunk, final);\n    };\n    /**\n     * Pushes a chunk to be added. If you are subclassing this with a custom\n     * compression algorithm, note that you must push data from the source\n     * file only, pre-compression.\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipPassThrough.prototype.push = function (chunk, final) {\n        if (!this.ondata)\n            err(5);\n        this.c.p(chunk);\n        this.size += chunk.length;\n        if (final)\n            this.crc = this.c.d();\n        this.process(chunk, final || false);\n    };\n    return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function ZipDeflate(filename, opts) {\n        var _this = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new Deflate(opts, function (dat, final) {\n            _this.ondata(null, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n    }\n    ZipDeflate.prototype.process = function (chunk, final) {\n        try {\n            this.d.push(chunk, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    ZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n     * @param filename The filename to associate with this data stream\n     * @param opts The compression options\n     */\n    function AsyncZipDeflate(filename, opts) {\n        var _this = this;\n        if (!opts)\n            opts = {};\n        ZipPassThrough.call(this, filename);\n        this.d = new AsyncDeflate(opts, function (err, dat, final) {\n            _this.ondata(err, dat, final);\n        });\n        this.compression = 8;\n        this.flag = dbf(opts.level);\n        this.terminate = this.d.terminate;\n    }\n    AsyncZipDeflate.prototype.process = function (chunk, final) {\n        this.d.push(chunk, final);\n    };\n    /**\n     * Pushes a chunk to be deflated\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    AsyncZipDeflate.prototype.push = function (chunk, final) {\n        ZipPassThrough.prototype.push.call(this, chunk, final);\n    };\n    return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n    /**\n     * Creates an empty ZIP archive to which files can be added\n     * @param cb The callback to call whenever data for the generated ZIP archive\n     *           is available\n     */\n    function Zip(cb) {\n        this.ondata = cb;\n        this.u = [];\n        this.d = 1;\n    }\n    /**\n     * Adds a file to the ZIP archive\n     * @param file The file stream to add\n     */\n    Zip.prototype.add = function (file) {\n        var _this = this;\n        if (!this.ondata)\n            err(5);\n        // finishing or finished\n        if (this.d & 2)\n            this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n        else {\n            var f = strToU8(file.filename), fl_1 = f.length;\n            var com = file.comment, o = com && strToU8(com);\n            var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n            var hl_1 = fl_1 + exfl(file.extra) + 30;\n            if (fl_1 > 65535)\n                this.ondata(err(11, 0, 1), null, false);\n            var header = new u8(hl_1);\n            wzh(header, 0, file, f, u, -1);\n            var chks_1 = [header];\n            var pAll_1 = function () {\n                for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n                    var chk = chks_2[_i];\n                    _this.ondata(null, chk, false);\n                }\n                chks_1 = [];\n            };\n            var tr_1 = this.d;\n            this.d = 0;\n            var ind_1 = this.u.length;\n            var uf_1 = mrg(file, {\n                f: f,\n                u: u,\n                o: o,\n                t: function () {\n                    if (file.terminate)\n                        file.terminate();\n                },\n                r: function () {\n                    pAll_1();\n                    if (tr_1) {\n                        var nxt = _this.u[ind_1 + 1];\n                        if (nxt)\n                            nxt.r();\n                        else\n                            _this.d = 1;\n                    }\n                    tr_1 = 1;\n                }\n            });\n            var cl_1 = 0;\n            file.ondata = function (err, dat, final) {\n                if (err) {\n                    _this.ondata(err, dat, final);\n                    _this.terminate();\n                }\n                else {\n                    cl_1 += dat.length;\n                    chks_1.push(dat);\n                    if (final) {\n                        var dd = new u8(16);\n                        wbytes(dd, 0, 0x8074B50);\n                        wbytes(dd, 4, file.crc);\n                        wbytes(dd, 8, cl_1);\n                        wbytes(dd, 12, file.size);\n                        chks_1.push(dd);\n                        uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n                        if (tr_1)\n                            uf_1.r();\n                        tr_1 = 1;\n                    }\n                    else if (tr_1)\n                        pAll_1();\n                }\n            };\n            this.u.push(uf_1);\n        }\n    };\n    /**\n     * Ends the process of adding files and prepares to emit the final chunks.\n     * This *must* be called after adding all desired files for the resulting\n     * ZIP file to work properly.\n     */\n    Zip.prototype.end = function () {\n        var _this = this;\n        if (this.d & 2) {\n            this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n            return;\n        }\n        if (this.d)\n            this.e();\n        else\n            this.u.push({\n                r: function () {\n                    if (!(_this.d & 1))\n                        return;\n                    _this.u.splice(-1, 1);\n                    _this.e();\n                },\n                t: function () { }\n            });\n        this.d = 3;\n    };\n    Zip.prototype.e = function () {\n        var bt = 0, l = 0, tl = 0;\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n        }\n        var out = new u8(tl + 22);\n        for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n            var f = _c[_b];\n            wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n            bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n        }\n        wzf(out, bt, this.u.length, tl, l);\n        this.ondata(null, out, true);\n        this.d = 2;\n    };\n    /**\n     * A method to terminate any internal workers used by the stream. Subsequent\n     * calls to add() will fail.\n     */\n    Zip.prototype.terminate = function () {\n        for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n            var f = _a[_i];\n            f.t();\n        }\n        this.d = 2;\n    };\n    return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    var r = {};\n    fltn(data, '', r, opts);\n    var k = Object.keys(r);\n    var lft = k.length, o = 0, tot = 0;\n    var slft = lft, files = new Array(lft);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var cbd = function (a, b) {\n        mt(function () { cb(a, b); });\n    };\n    mt(function () { cbd = cb; });\n    var cbf = function () {\n        var out = new u8(tot + 22), oe = o, cdl = tot - o;\n        tot = 0;\n        for (var i = 0; i < slft; ++i) {\n            var f = files[i];\n            try {\n                var l = f.c.length;\n                wzh(out, tot, f, f.f, f.u, l);\n                var badd = 30 + f.f.length + exfl(f.extra);\n                var loc = tot + badd;\n                out.set(f.c, loc);\n                wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n            }\n            catch (e) {\n                return cbd(e, null);\n            }\n        }\n        wzf(out, o, files.length, cdl, oe);\n        cbd(null, out);\n    };\n    if (!lft)\n        cbf();\n    var _loop_1 = function (i) {\n        var fn = k[i];\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var c = crc(), size = file.length;\n        c.p(file);\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        var compression = p.level == 0 ? 0 : 8;\n        var cbl = function (e, d) {\n            if (e) {\n                tAll();\n                cbd(e, null);\n            }\n            else {\n                var l = d.length;\n                files[i] = mrg(p, {\n                    size: size,\n                    crc: c.d(),\n                    c: d,\n                    f: f,\n                    m: m,\n                    u: s != fn.length || (m && (com.length != ms)),\n                    compression: compression\n                });\n                o += 30 + s + exl + l;\n                tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n                if (!--lft)\n                    cbf();\n            }\n        };\n        if (s > 65535)\n            cbl(err(11, 0, 1), null);\n        if (!compression)\n            cbl(null, file);\n        else if (size < 160000) {\n            try {\n                cbl(null, deflateSync(file, p));\n            }\n            catch (e) {\n                cbl(e, null);\n            }\n        }\n        else\n            term.push(deflate(file, p, cbl));\n    };\n    // Cannot use lft because it can decrease\n    for (var i = 0; i < slft; ++i) {\n        _loop_1(i);\n    }\n    return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n    if (!opts)\n        opts = {};\n    var r = {};\n    var files = [];\n    fltn(data, '', r, opts);\n    var o = 0;\n    var tot = 0;\n    for (var fn in r) {\n        var _a = r[fn], file = _a[0], p = _a[1];\n        var compression = p.level == 0 ? 0 : 8;\n        var f = strToU8(fn), s = f.length;\n        var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n        var exl = exfl(p.extra);\n        if (s > 65535)\n            err(11);\n        var d = compression ? deflateSync(file, p) : file, l = d.length;\n        var c = crc();\n        c.p(file);\n        files.push(mrg(p, {\n            size: file.length,\n            crc: c.d(),\n            c: d,\n            f: f,\n            m: m,\n            u: s != fn.length || (m && (com.length != ms)),\n            o: o,\n            compression: compression\n        }));\n        o += 30 + s + exl + l;\n        tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n    }\n    var out = new u8(tot + 22), oe = o, cdl = tot - o;\n    for (var i = 0; i < files.length; ++i) {\n        var f = files[i];\n        wzh(out, f.o, f, f.f, f.u, f.c.length);\n        var badd = 30 + f.f.length + exfl(f.extra);\n        out.set(f.c, f.o + badd);\n        wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n    }\n    wzf(out, o, files.length, cdl, oe);\n    return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n    function UnzipPassThrough() {\n    }\n    UnzipPassThrough.prototype.push = function (data, final) {\n        this.ondata(null, data, final);\n    };\n    UnzipPassThrough.compression = 0;\n    return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function UnzipInflate() {\n        var _this = this;\n        this.i = new Inflate(function (dat, final) {\n            _this.ondata(null, dat, final);\n        });\n    }\n    UnzipInflate.prototype.push = function (data, final) {\n        try {\n            this.i.push(data, final);\n        }\n        catch (e) {\n            this.ondata(e, null, final);\n        }\n    };\n    UnzipInflate.compression = 8;\n    return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n    /**\n     * Creates a DEFLATE decompression that can be used in ZIP archives\n     */\n    function AsyncUnzipInflate(_, sz) {\n        var _this = this;\n        if (sz < 320000) {\n            this.i = new Inflate(function (dat, final) {\n                _this.ondata(null, dat, final);\n            });\n        }\n        else {\n            this.i = new AsyncInflate(function (err, dat, final) {\n                _this.ondata(err, dat, final);\n            });\n            this.terminate = this.i.terminate;\n        }\n    }\n    AsyncUnzipInflate.prototype.push = function (data, final) {\n        if (this.i.terminate)\n            data = slc(data, 0);\n        this.i.push(data, final);\n    };\n    AsyncUnzipInflate.compression = 8;\n    return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n    /**\n     * Creates a ZIP decompression stream\n     * @param cb The callback to call whenever a file in the ZIP archive is found\n     */\n    function Unzip(cb) {\n        this.onfile = cb;\n        this.k = [];\n        this.o = {\n            0: UnzipPassThrough\n        };\n        this.p = et;\n    }\n    /**\n     * Pushes a chunk to be unzipped\n     * @param chunk The chunk to push\n     * @param final Whether this is the last chunk\n     */\n    Unzip.prototype.push = function (chunk, final) {\n        var _this = this;\n        if (!this.onfile)\n            err(5);\n        if (!this.p)\n            err(4);\n        if (this.c > 0) {\n            var len = Math.min(this.c, chunk.length);\n            var toAdd = chunk.subarray(0, len);\n            this.c -= len;\n            if (this.d)\n                this.d.push(toAdd, !this.c);\n            else\n                this.k[0].push(toAdd);\n            chunk = chunk.subarray(len);\n            if (chunk.length)\n                return this.push(chunk, final);\n        }\n        else {\n            var f = 0, i = 0, is = void 0, buf = void 0;\n            if (!this.p.length)\n                buf = chunk;\n            else if (!chunk.length)\n                buf = this.p;\n            else {\n                buf = new u8(this.p.length + chunk.length);\n                buf.set(this.p), buf.set(chunk, this.p.length);\n            }\n            var l = buf.length, oc = this.c, add = oc && this.d;\n            var _loop_2 = function () {\n                var _a;\n                var sig = b4(buf, i);\n                if (sig == 0x4034B50) {\n                    f = 1, is = i;\n                    this_1.d = null;\n                    this_1.c = 0;\n                    var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n                    if (l > i + 30 + fnl + es) {\n                        var chks_3 = [];\n                        this_1.k.unshift(chks_3);\n                        f = 2;\n                        var sc_1 = b4(buf, i + 18), su_1 = b4(buf, i + 22);\n                        var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n                        if (sc_1 == 4294967295) {\n                            _a = dd ? [-2] : z64e(buf, i), sc_1 = _a[0], su_1 = _a[1];\n                        }\n                        else if (dd)\n                            sc_1 = -1;\n                        i += es;\n                        this_1.c = sc_1;\n                        var d_1;\n                        var file_1 = {\n                            name: fn_1,\n                            compression: cmp_1,\n                            start: function () {\n                                if (!file_1.ondata)\n                                    err(5);\n                                if (!sc_1)\n                                    file_1.ondata(null, et, true);\n                                else {\n                                    var ctr = _this.o[cmp_1];\n                                    if (!ctr)\n                                        file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n                                    d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n                                    d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n                                    for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n                                        var dat = chks_4[_i];\n                                        d_1.push(dat, false);\n                                    }\n                                    if (_this.k[0] == chks_3 && _this.c)\n                                        _this.d = d_1;\n                                    else\n                                        d_1.push(et, true);\n                                }\n                            },\n                            terminate: function () {\n                                if (d_1 && d_1.terminate)\n                                    d_1.terminate();\n                            }\n                        };\n                        if (sc_1 >= 0)\n                            file_1.size = sc_1, file_1.originalSize = su_1;\n                        this_1.onfile(file_1);\n                    }\n                    return \"break\";\n                }\n                else if (oc) {\n                    if (sig == 0x8074B50) {\n                        is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                    else if (sig == 0x2014B50) {\n                        is = i -= 4, f = 3, this_1.c = 0;\n                        return \"break\";\n                    }\n                }\n            };\n            var this_1 = this;\n            for (; i < l - 4; ++i) {\n                var state_1 = _loop_2();\n                if (state_1 === \"break\")\n                    break;\n            }\n            this.p = et;\n            if (oc < 0) {\n                var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n                if (add)\n                    add.push(dat, !!f);\n                else\n                    this.k[+(f == 2)].push(dat);\n            }\n            if (f & 2)\n                return this.push(buf.subarray(i), final);\n            this.p = buf.subarray(i);\n        }\n        if (final) {\n            if (this.c)\n                err(13);\n            this.p = null;\n        }\n    };\n    /**\n     * Registers a decoder with the stream, allowing for files compressed with\n     * the compression type provided to be expanded correctly\n     * @param decoder The decoder constructor\n     */\n    Unzip.prototype.register = function (decoder) {\n        this.o[decoder.compression] = decoder;\n    };\n    return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n    if (!cb)\n        cb = opts, opts = {};\n    if (typeof cb != 'function')\n        err(7);\n    var term = [];\n    var tAll = function () {\n        for (var i = 0; i < term.length; ++i)\n            term[i]();\n    };\n    var files = {};\n    var cbd = function (a, b) {\n        mt(function () { cb(a, b); });\n    };\n    mt(function () { cbd = cb; });\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558) {\n            cbd(err(13, 0, 1), null);\n            return tAll;\n        }\n    }\n    ;\n    var lft = b2(data, e + 8);\n    if (lft) {\n        var c = lft;\n        var o = b4(data, e + 16);\n        var z = o == 4294967295 || c == 65535;\n        if (z) {\n            var ze = b4(data, e - 12);\n            z = b4(data, ze) == 0x6064B50;\n            if (z) {\n                c = lft = b4(data, ze + 32);\n                o = b4(data, ze + 48);\n            }\n        }\n        var fltr = opts && opts.filter;\n        var _loop_3 = function (i) {\n            var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n            o = no;\n            var cbl = function (e, d) {\n                if (e) {\n                    tAll();\n                    cbd(e, null);\n                }\n                else {\n                    if (d)\n                        files[fn] = d;\n                    if (!--lft)\n                        cbd(null, files);\n                }\n            };\n            if (!fltr || fltr({\n                name: fn,\n                size: sc,\n                originalSize: su,\n                compression: c_1\n            })) {\n                if (!c_1)\n                    cbl(null, slc(data, b, b + sc));\n                else if (c_1 == 8) {\n                    var infl = data.subarray(b, b + sc);\n                    // Synchronously decompress under 512KB, or barely-compressed data\n                    if (su < 524288 || sc > 0.8 * su) {\n                        try {\n                            cbl(null, inflateSync(infl, { out: new u8(su) }));\n                        }\n                        catch (e) {\n                            cbl(e, null);\n                        }\n                    }\n                    else\n                        term.push(inflate(infl, { size: su }, cbl));\n                }\n                else\n                    cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n            }\n            else\n                cbl(null, null);\n        };\n        for (var i = 0; i < c; ++i) {\n            _loop_3(i);\n        }\n    }\n    else\n        cbd(null, {});\n    return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n    var files = {};\n    var e = data.length - 22;\n    for (; b4(data, e) != 0x6054B50; --e) {\n        if (!e || data.length - e > 65558)\n            err(13);\n    }\n    ;\n    var c = b2(data, e + 8);\n    if (!c)\n        return {};\n    var o = b4(data, e + 16);\n    var z = o == 4294967295 || c == 65535;\n    if (z) {\n        var ze = b4(data, e - 12);\n        z = b4(data, ze) == 0x6064B50;\n        if (z) {\n            c = b4(data, ze + 32);\n            o = b4(data, ze + 48);\n        }\n    }\n    var fltr = opts && opts.filter;\n    for (var i = 0; i < c; ++i) {\n        var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n        o = no;\n        if (!fltr || fltr({\n            name: fn,\n            size: sc,\n            originalSize: su,\n            compression: c_2\n        })) {\n            if (!c_2)\n                files[fn] = slc(data, b, b + sc);\n            else if (c_2 == 8)\n                files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n            else\n                err(14, 'unknown compression type ' + c_2);\n        }\n    }\n    return files;\n}\n", "// UPNG.js\uFF08Photopea\uFF0CMIT\uFF09ESM \u9002\u914D\u7248\u3002\n// \u4E0A\u6E38\uFF1Agithub.com/photopea/UPNG.js @ 88f504b6577b726975f593caa38ba85d327c7c1f\uFF082026-07-29 vendored\uFF09\n// \u539F\u4EF6\u539F\u6837\u4FDD\u5B58\u5728 ./UPNG.upstream.js\uFF1B\u672C\u6587\u4EF6 = \u539F\u4EF6 + \u4E09\u5904\u9002\u914D\uFF08\u5BB6\u65CF vendor \u7EA6\u5B9A\uFF0C\u522B\u5728\u522B\u5904\u6539\uFF09\uFF1A\n//   \u2460 \u5934\u90E8\u6CE8\u5165 pako shim \u2014\u2014 UPNG \u89E3\u7801\u81EA\u5E26 inflate\uFF0C\u4EC5\u7F16\u7801\u7528 pako.deflate(zlib)\uFF1A\n//      \u7528\u5DF2 vendor \u7684 fflate zlibSync \u9876\u4E0A\uFF08\u96F6\u65B0\u4F9D\u8D56\uFF1BUZIP \u5927\u6587\u4EF6\u5206\u652F\u6C38\u4E0D\u89E6\u53D1\uFF0Cwindow.UZIP \u77ED\u8DEF\uFF09\u3002\n//   \u2461 setDeflateLevel(0-9)\uFF1A\u538B\u7F29\u7EA7\u65CB\u94AE\uFF08user\u300C\u4E13\u4E1A\u7ED8\u56FE\u8F6F\u4EF6\u81EA\u5B9A\u4E49\u538B\u7F29\u6BD4\u300D\u7684\u5165\u53E3\uFF1B\u9ED8\u8BA4 6\uFF09\u3002\n//   \u2462 \u5C3E\u90E8 export\u3002\n//   \u2463 quantize \u7684 estats \u5E42\u8FED\u4EE3\u8D77\u70B9 Math.random \u00D74 \u2192 \u56FA\u5B9A\u901A\u7528\u5411\u91CF\uFF08WXHW 2026-09-10\uFF0CClaude Fable 5.1\uFF09\uFF1A\u8C03\u8272\u677F\u7F16\u7801\u786E\u5B9A\u6027\uFF0C\u540C\u5185\u5BB9\u540C\u5B57\u8282\uFF1B\n//      WXHW \u5C01\u9762\u5224\u5B9A\uFF08ADR-0012 \u00A75\uFF09\u9760\u300C\u91CD\u7B97 thumb \u6BD4\u5BF9\u5B57\u8282\u300D\uFF0C\u975E\u786E\u5B9A\u6027\u4F1A\u8BA9\u5B83\u6C38\u8FDC\u5224\u5426\u3002\u8D28\u91CF\u4E0D\u53D7\u5F71\u54CD\uFF08\u8D77\u70B9\u53EA\u8981\u4E0D\u4E0E\u4E3B\u7279\u5F81\u5411\u91CF\u6B63\u4EA4\u5373\u53EF\uFF09\u3002\u5176\u4F59\u9010\u5B57\u8282 = \u4E0A\u6E38\u3002\nimport { zlibSync } from \"../fflate/fflate.esm.js\";\nlet _level = 6;\nexport function setDeflateLevel(l) { _level = Math.max(0, Math.min(9, l | 0)); }\nconst pako = { deflate: (d) => zlibSync(d instanceof Uint8Array ? d : new Uint8Array(d), { level: _level }) };\n\n\n\nvar UPNG = (function() {\n\t\n\tvar _bin = {\n\t\tnextZero   : function(data,p)  {  while(data[p]!=0) p++;  return p;  },\n\t\treadUshort : function(buff,p)  {  return (buff[p]<< 8) | buff[p+1];  },\n\t\twriteUshort: function(buff,p,n){  buff[p] = (n>>8)&255;  buff[p+1] = n&255;  },\n\t\treadUint   : function(buff,p)  {  return (buff[p]*(256*256*256)) + ((buff[p+1]<<16) | (buff[p+2]<< 8) | buff[p+3]);  },\n\t\twriteUint  : function(buff,p,n){  buff[p]=(n>>24)&255;  buff[p+1]=(n>>16)&255;  buff[p+2]=(n>>8)&255;  buff[p+3]=n&255;  },\n\t\treadASCII  : function(buff,p,l){  var s = \"\";  for(var i=0; i<l; i++) s += String.fromCharCode(buff[p+i]);  return s;    },\n\t\twriteASCII : function(data,p,s){  for(var i=0; i<s.length; i++) data[p+i] = s.charCodeAt(i);  },\n\t\treadBytes  : function(buff,p,l){  var arr = [];   for(var i=0; i<l; i++) arr.push(buff[p+i]);   return arr;  },\n\t\tpad : function(n) { return n.length < 2 ? \"0\" + n : n; },\n\t\treadUTF8 : function(buff, p, l) {\n\t\t\tvar s = \"\", ns;\n\t\t\tfor(var i=0; i<l; i++) s += \"%\" + _bin.pad(buff[p+i].toString(16));\n\t\t\ttry {  ns = decodeURIComponent(s); }\n\t\t\tcatch(e) {  return _bin.readASCII(buff, p, l);  }\n\t\t\treturn  ns;\n\t\t}\n\t}\n\n\tfunction toRGBA8(out)\n\t{\n\t\tvar w = out.width, h = out.height;\n\t\tif(out.tabs.acTL==null) return [decodeImage(out.data, w, h, out).buffer];\n\t\t\n\t\tvar frms = [];\n\t\tif(out.frames[0].data==null) out.frames[0].data = out.data;\n\t\t\n\t\tvar len = w*h*4, img = new Uint8Array(len), empty = new Uint8Array(len), prev=new Uint8Array(len);\n\t\tfor(var i=0; i<out.frames.length; i++)\n\t\t{\n\t\t\tvar frm = out.frames[i];\n\t\t\tvar fx=frm.rect.x, fy=frm.rect.y, fw = frm.rect.width, fh = frm.rect.height;\n\t\t\tvar fdata = decodeImage(frm.data, fw,fh, out);\n\t\t\t\n\t\t\tif(i!=0) for(var j=0; j<len; j++) prev[j]=img[j];\n\t\t\t\n\t\t\tif     (frm.blend==0) _copyTile(fdata, fw, fh, img, w, h, fx, fy, 0);\n\t\t\telse if(frm.blend==1) _copyTile(fdata, fw, fh, img, w, h, fx, fy, 1);\n\t\t\t\n\t\t\tfrms.push(img.buffer.slice(0));\n\t\t\t\n\t\t\tif     (frm.dispose==0) {}\n\t\t\telse if(frm.dispose==1) _copyTile(empty, fw, fh, img, w, h, fx, fy, 0);\n\t\t\telse if(frm.dispose==2) for(var j=0; j<len; j++) img[j]=prev[j];\n\t\t}\n\t\treturn frms;\n\t}\n\tfunction decodeImage(data, w, h, out)\n\t{\n\t\tvar area = w*h, bpp = _getBPP(out);\n\t\tvar bpl = Math.ceil(w*bpp/8);\t// bytes per line\n\n\t\tvar bf = new Uint8Array(area*4), bf32 = new Uint32Array(bf.buffer);\n\t\tvar ctype = out.ctype, depth = out.depth;\n\t\tvar rs = _bin.readUshort;\n\t\t\n\t\t//console.log(ctype, depth);\n\t\tvar time = Date.now();\n\n\t\tif     (ctype==6) { // RGB + alpha\n\t\t\tvar qarea = area<<2;\n\t\t\tif(depth== 8) for(var i=0; i<qarea;i+=4) {  bf[i] = data[i];  bf[i+1] = data[i+1];  bf[i+2] = data[i+2];  bf[i+3] = data[i+3]; }\n\t\t\tif(depth==16) for(var i=0; i<qarea;i++ ) {  bf[i] = data[i<<1];  }\n\t\t}\n\t\telse if(ctype==2) {\t// RGB\n\t\t\tvar ts=out.tabs[\"tRNS\"];\n\t\t\tif(ts==null) {\n\t\t\t\tif(depth== 8) for(var i=0; i<area; i++) {  var ti=i*3;  bf32[i] = (255<<24)|(data[ti+2]<<16)|(data[ti+1]<<8)|data[ti];  }\n\t\t\t\tif(depth==16) for(var i=0; i<area; i++) {  var ti=i*6;  bf32[i] = (255<<24)|(data[ti+4]<<16)|(data[ti+2]<<8)|data[ti];  }\n\t\t\t}\n\t\t\telse {  var tr=ts[0], tg=ts[1], tb=ts[2];\n\t\t\t\tif(depth== 8) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*3;  bf32[i] = (255<<24)|(data[ti+2]<<16)|(data[ti+1]<<8)|data[ti];\n\t\t\t\t\tif(data[ti]   ==tr && data[ti+1]   ==tg && data[ti+2]   ==tb) bf[qi+3] = 0;  }\n\t\t\t\tif(depth==16) for(var i=0; i<area; i++) {  var qi=i<<2, ti=i*6;  bf32[i] = (255<<24)|(data[ti+4]<<16)|(data[ti+2]<<8)|data[ti];\n\t\t\t\t\tif(rs(data,ti)==tr && rs(data,ti+2)==tg && rs(data,ti+4)==tb) bf[qi+3] = 0;  }\n\t\t\t}\n\t\t}\n\t\telse if(ctype==3) {\t// palette\n\t\t\tvar p=out.tabs[\"PLTE\"], ap=out.tabs[\"tRNS\"], tl=ap?ap.length:0;\n\t\t\t//console.log(p, ap);\n\t\t\tif(depth==1) for(var y=0; y<h; y++) {  var s0 = y*bpl, t0 = y*w;\n\t\t\t\tfor(var i=0; i<w; i++) { var qi=(t0+i)<<2, j=((data[s0+(i>>3)]>>(7-((i&7)<<0)))& 1), cj=3*j;  bf[qi]=p[cj];  bf[qi+1]=p[cj+1];  bf[qi+2]=p[cj+2];  bf[qi+3]=(j<tl)?ap[j]:255;  }\n\t\t\t}\n\t\t\tif(depth==2) for(var y=0; y<h; y++) {  var s0 = y*bpl, t0 = y*w;\n\t\t\t\tfor(var i=0; i<w; i++) { var qi=(t0+i)<<2, j=((data[s0+(i>>2)]>>(6-((i&3)<<1)))& 3), cj=3*j;  bf[qi]=p[cj];  bf[qi+1]=p[cj+1];  bf[qi+2]=p[cj+2];  bf[qi+3]=(j<tl)?ap[j]:255;  }\n\t\t\t}\n\t\t\tif(depth==4) for(var y=0; y<h; y++) {  var s0 = y*bpl, t0 = y*w;\n\t\t\t\tfor(var i=0; i<w; i++) { var qi=(t0+i)<<2, j=((data[s0+(i>>1)]>>(4-((i&1)<<2)))&15), cj=3*j;  bf[qi]=p[cj];  bf[qi+1]=p[cj+1];  bf[qi+2]=p[cj+2];  bf[qi+3]=(j<tl)?ap[j]:255;  }\n\t\t\t}\n\t\t\tif(depth==8) for(var i=0; i<area; i++ ) {  var qi=i<<2, j=data[i]                      , cj=3*j;  bf[qi]=p[cj];  bf[qi+1]=p[cj+1];  bf[qi+2]=p[cj+2];  bf[qi+3]=(j<tl)?ap[j]:255;  }\n\t\t}\n\t\telse if(ctype==4) {\t// gray + alpha\n\t\t\tif(depth== 8)  for(var i=0; i<area; i++) {  var qi=i<<2, di=i<<1, gr=data[di];  bf[qi]=gr;  bf[qi+1]=gr;  bf[qi+2]=gr;  bf[qi+3]=data[di+1];  }\n\t\t\tif(depth==16)  for(var i=0; i<area; i++) {  var qi=i<<2, di=i<<2, gr=data[di];  bf[qi]=gr;  bf[qi+1]=gr;  bf[qi+2]=gr;  bf[qi+3]=data[di+2];  }\n\t\t}\n\t\telse if(ctype==0) {\t// gray\n\t\t\tvar tr = out.tabs[\"tRNS\"] ? out.tabs[\"tRNS\"] : -1;\n\t\t\tfor(var y=0; y<h; y++) {\n\t\t\t\tvar off = y*bpl, to = y*w;\n\t\t\t\tif     (depth== 1) for(var x=0; x<w; x++) {  var gr=255*((data[off+(x>>>3)]>>>(7 -((x&7)   )))& 1), al=(gr==tr*255)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n\t\t\t\telse if(depth== 2) for(var x=0; x<w; x++) {  var gr= 85*((data[off+(x>>>2)]>>>(6 -((x&3)<<1)))& 3), al=(gr==tr* 85)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n\t\t\t\telse if(depth== 4) for(var x=0; x<w; x++) {  var gr= 17*((data[off+(x>>>1)]>>>(4 -((x&1)<<2)))&15), al=(gr==tr* 17)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n\t\t\t\telse if(depth== 8) for(var x=0; x<w; x++) {  var gr=data[off+     x], al=(gr                 ==tr)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n\t\t\t\telse if(depth==16) for(var x=0; x<w; x++) {  var gr=data[off+(x<<1)], al=(rs(data,off+(x<<1))==tr)?0:255;  bf32[to+x]=(al<<24)|(gr<<16)|(gr<<8)|gr;  }\n\t\t\t}\n\t\t}\n\t\t//console.log(Date.now()-time);\n\t\treturn bf;\n\t}\n\n\n\n\tfunction decode(buff)\n\t{\n\t\tvar data = new Uint8Array(buff), offset = 8, bin = _bin, rUs = bin.readUshort, rUi = bin.readUint;\n\t\tvar out = {tabs:{}, frames:[]};\n\t\tvar dd = new Uint8Array(data.length), doff = 0;\t // put all IDAT data into it\n\t\tvar fd, foff = 0;\t// frames\n\t\t\n\t\tvar mgck = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n\t\tfor(var i=0; i<8; i++) if(data[i]!=mgck[i]) throw \"The input is not a PNG file!\";\n\n\t\twhile(offset<data.length)\n\t\t{\n\t\t\tvar len  = bin.readUint(data, offset);  offset += 4;\n\t\t\tvar type = bin.readASCII(data, offset, 4);  offset += 4;\n\t\t\t//console.log(type,len);\n\t\t\t\n\t\t\tif     (type==\"IHDR\")  {  _IHDR(data, offset, out);  }\n\t\t\telse if(type==\"iCCP\")  {\n\t\t\t\tvar off = offset;  while(data[off]!=0) off++;\n\t\t\t\tvar nam = bin.readASCII(data,offset,off-offset);\n\t\t\t\tvar cpr = data[off+1];\n\t\t\t\tvar fil = data.slice(off+2,offset+len);\n\t\t\t\tvar res = null;\n\t\t\t\ttry { res = _inflate(fil); } catch(e) {  res = inflateRaw(fil);  }\n\t\t\t\tout.tabs[type] = res;\n\t\t\t}\n\t\t\telse if(type==\"CgBI\")  {  out.tabs[type] = data.slice(offset,offset+4);  }\n\t\t\telse if(type==\"IDAT\") {\n\t\t\t\tfor(var i=0; i<len; i++) dd[doff+i] = data[offset+i];\n\t\t\t\tdoff += len;\n\t\t\t}\n\t\t\telse if(type==\"acTL\")  {\n\t\t\t\tout.tabs[type] = {  num_frames:rUi(data, offset), num_plays:rUi(data, offset+4)  };\n\t\t\t\tfd = new Uint8Array(data.length);\n\t\t\t}\n\t\t\telse if(type==\"fcTL\")  {\n\t\t\t\tif(foff!=0) {  var fr = out.frames[out.frames.length-1];\n\t\t\t\t\tfr.data = _decompress(out, fd.slice(0,foff), fr.rect.width, fr.rect.height);  foff=0;\n\t\t\t\t}\n\t\t\t\tvar rct = {x:rUi(data, offset+12),y:rUi(data, offset+16),width:rUi(data, offset+4),height:rUi(data, offset+8)};\n\t\t\t\tvar del = rUs(data, offset+22);  del = rUs(data, offset+20) / (del==0?100:del);\n\t\t\t\tvar frm = {rect:rct, delay:Math.round(del*1000), dispose:data[offset+24], blend:data[offset+25]};\n\t\t\t\t//console.log(frm);\n\t\t\t\tout.frames.push(frm);\n\t\t\t}\n\t\t\telse if(type==\"fdAT\") {\n\t\t\t\tfor(var i=0; i<len-4; i++) fd[foff+i] = data[offset+i+4];\n\t\t\t\tfoff += len-4;\n\t\t\t}\n\t\t\telse if(type==\"pHYs\") {\n\t\t\t\tout.tabs[type] = [bin.readUint(data, offset), bin.readUint(data, offset+4), data[offset+8]];\n\t\t\t}\n\t\t\telse if(type==\"cHRM\") {\n\t\t\t\tout.tabs[type] = [];\n\t\t\t\tfor(var i=0; i<8; i++) out.tabs[type].push(bin.readUint(data, offset+i*4));\n\t\t\t}\n\t\t\telse if(type==\"tEXt\" || type==\"zTXt\") {\n\t\t\t\tif(out.tabs[type]==null) out.tabs[type] = {};\n\t\t\t\tvar nz = bin.nextZero(data, offset);\n\t\t\t\tvar keyw = bin.readASCII(data, offset, nz-offset);\n\t\t\t\tvar text, tl=offset+len-nz-1;\n\t\t\t\tif(type==\"tEXt\") text = bin.readASCII(data, nz+1, tl);\n\t\t\t\telse {\n\t\t\t\t\tvar bfr = _inflate(data.slice(nz+2,nz+2+tl));\n\t\t\t\t\ttext = bin.readUTF8(bfr,0,bfr.length);\n\t\t\t\t}\n\t\t\t\tout.tabs[type][keyw] = text;\n\t\t\t}\n\t\t\telse if(type==\"iTXt\") {\n\t\t\t\tif(out.tabs[type]==null) out.tabs[type] = {};\n\t\t\t\tvar nz = 0, off = offset;\n\t\t\t\tnz = bin.nextZero(data, off);\n\t\t\t\tvar keyw = bin.readASCII(data, off, nz-off);  off = nz + 1;\n\t\t\t\tvar cflag = data[off], cmeth = data[off+1];  off+=2;\n\t\t\t\tnz = bin.nextZero(data, off);\n\t\t\t\tvar ltag = bin.readASCII(data, off, nz-off);  off = nz + 1;\n\t\t\t\tnz = bin.nextZero(data, off);\n\t\t\t\tvar tkeyw = bin.readUTF8(data, off, nz-off);  off = nz + 1;\n\t\t\t\tvar text, tl=len-(off-offset);\n\t\t\t\tif(cflag==0) text  = bin.readUTF8(data, off, tl);\n\t\t\t\telse {\n\t\t\t\t\tvar bfr = _inflate(data.slice(off,off+tl));\n\t\t\t\t\ttext = bin.readUTF8(bfr,0,bfr.length);\n\t\t\t\t}\n\t\t\t\tout.tabs[type][keyw] = text;\n\t\t\t}\n\t\t\telse if(type==\"PLTE\") {\n\t\t\t\tout.tabs[type] = bin.readBytes(data, offset, len);\n\t\t\t}\n\t\t\telse if(type==\"hIST\") {\n\t\t\t\tvar pl = out.tabs[\"PLTE\"].length/3;\n\t\t\t\tout.tabs[type] = [];  for(var i=0; i<pl; i++) out.tabs[type].push(rUs(data, offset+i*2));\n\t\t\t}\n\t\t\telse if(type==\"tRNS\") {\n\t\t\t\tif     (out.ctype==3) out.tabs[type] = bin.readBytes(data, offset, len);\n\t\t\t\telse if(out.ctype==0) out.tabs[type] = rUs(data, offset);\n\t\t\t\telse if(out.ctype==2) out.tabs[type] = [ rUs(data,offset),rUs(data,offset+2),rUs(data,offset+4) ];\n\t\t\t\t//else console.log(\"tRNS for unsupported color type\",out.ctype, len);\n\t\t\t}\n\t\t\telse if(type==\"gAMA\") out.tabs[type] = bin.readUint(data, offset)/100000;\n\t\t\telse if(type==\"sRGB\") out.tabs[type] = data[offset];\n\t\t\telse if(type==\"bKGD\")\n\t\t\t{\n\t\t\t\tif     (out.ctype==0 || out.ctype==4) out.tabs[type] = [rUs(data, offset)];\n\t\t\t\telse if(out.ctype==2 || out.ctype==6) out.tabs[type] = [rUs(data, offset), rUs(data, offset+2), rUs(data, offset+4)];\n\t\t\t\telse if(out.ctype==3) out.tabs[type] = data[offset];\n\t\t\t}\n\t\t\telse if(type==\"IEND\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t//else {  console.log(\"unknown chunk type\", type, len);  out.tabs[type]=data.slice(offset,offset+len);  }\n\t\t\toffset += len;\n\t\t\tvar crc = bin.readUint(data, offset);  offset += 4;\n\t\t}\n\t\tif(foff!=0) {  var fr = out.frames[out.frames.length-1];\n\t\t\tfr.data = _decompress(out, fd.slice(0,foff), fr.rect.width, fr.rect.height);\n\t\t}\t\n\t\tout.data = _decompress(out, dd, out.width, out.height);\n\t\t\n\t\tdelete out.compress;  delete out.interlace;  delete out.filter;\n\t\treturn out;\n\t}\n\n\tfunction _decompress(out, dd, w, h) {\n\t\tvar time = Date.now();\n\t\tvar bpp = _getBPP(out), bpl = Math.ceil(w*bpp/8), buff = new Uint8Array((bpl+1+out.interlace)*h);\n\t\tif(out.tabs[\"CgBI\"]) dd = inflateRaw(dd,buff);\n\t\telse                 dd = _inflate(dd,buff);\n\t\t//console.log(dd.length, buff.length);\n\t\t//console.log(Date.now()-time);\n\n\t\tvar time=Date.now();\n\t\tif     (out.interlace==0) dd = _filterZero(dd, out, 0, w, h);\n\t\telse if(out.interlace==1) dd = _readInterlace(dd, out);\n\t\t//console.log(Date.now()-time);\n\t\treturn dd;\n\t}\n\n\tfunction _inflate(data, buff) {  var out=inflateRaw(new Uint8Array(data.buffer, 2,data.length-6),buff);  return out;  }\n\t\n\tvar inflateRaw=function(){var D=function(){var o=Uint16Array,j=Uint32Array;return{m:new o(16),v:new o(16),\n\td:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],o:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],\n\tz:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],B:new o(32),\n\tp:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],\n\tw:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],h:new j(32),g:new o(512),s:[],A:new o(32),t:[],k:new o(32768),c:[],\n\ta:[],n:new o(32768),e:[],C:new o(512),b:[],i:new o(1<<15),r:new j(286),f:new j(30),l:new j(19),u:new j(15e3),q:new o(1<<16),j:new o(1<<15)}}();\nfunction C(o,j){var I=o.length,A,r,i,y,G,f=D.v;for(var y=0;y<=j;y++)f[y]=0;for(y=1;y<I;y+=2)f[o[y]]++;\nvar a=D.m;A=0;f[0]=0;for(r=1;r<=j;r++){A=A+f[r-1]<<1;a[r]=A}for(i=0;i<I;i+=2){G=o[i+1];if(G!=0){o[i]=a[G];\na[G]++}}}function t(o,j,I){var A=o.length,r=D.i;for(var i=0;i<A;i+=2)if(o[i+1]!=0){var y=i>>1,G=o[i+1],f=y<<4|G,a=j-G,k=o[i]<<a,N=k+(1<<a);\nwhile(k!=N){var x=r[k]>>>15-j;I[x]=f;k++}}}function g(o,j){var I=D.i,A=15-j;for(var r=0;r<o.length;r+=2){var i=o[r]<<j-o[r+1];\no[r]=I[i]>>>A}}(function(){var o=1<<15;for(var j=0;j<o;j++){var I=j;I=(I&2863311530)>>>1|(I&1431655765)<<1;\nI=(I&3435973836)>>>2|(I&858993459)<<2;I=(I&4042322160)>>>4|(I&252645135)<<4;I=(I&4278255360)>>>8|(I&16711935)<<8;\nD.i[j]=(I>>>16|I<<16)>>>17}function A(r,i,y){while(i--!=0)r.push(0,y)}for(var j=0;j<32;j++){D.B[j]=D.o[j]<<3|D.z[j];\nD.h[j]=D.p[j]<<4|D.w[j]}A(D.s,144,8);A(D.s,255-143,9);A(D.s,279-255,7);A(D.s,287-279,8);C(D.s,9);t(D.s,9,D.g);\ng(D.s,9);A(D.t,32,5);C(D.t,5);t(D.t,5,D.A);g(D.t,5);A(D.b,19,0);A(D.c,286,0);A(D.e,30,0);A(D.a,320,0)}());\nfunction F(o,j,I){return(o[j>>>3]|o[(j>>>3)+1]<<8)>>>(j&7)&(1<<I)-1}function s(o,j,I){return(o[j>>>3]|o[(j>>>3)+1]<<8|o[(j>>>3)+2]<<16)>>>(j&7)&(1<<I)-1}\nfunction w(o,j){return(o[j>>>3]|o[(j>>>3)+1]<<8|o[(j>>>3)+2]<<16)>>>(j&7)}function b(o,j){return(o[j>>>3]|o[(j>>>3)+1]<<8|o[(j>>>3)+2]<<16|o[(j>>>3)+3]<<24)>>>(j&7)}\nfunction v(o,j){var I=Uint8Array,r=0,i=0,y=0,G=0,f=0,a=0,k=0,N=0,x=0,P,J;\nif(o[0]==3&&o[1]==0)return j?j:new I(0);var A=j==null;if(A)j=new I(o.length>>>2<<3);while(r==0){r=s(o,x,1);\ni=s(o,x+1,2);x+=3;if(i==0){if((x&7)!=0)x+=8-(x&7);var K=(x>>>3)+4,m=o[K-4]|o[K-3]<<8;if(A)j=H(j,N+m);\nj.set(new I(o.buffer,o.byteOffset+K,m),N);x=K+m<<3;N+=m;continue}if(A)j=H(j,N+(1<<17));if(i==1){P=D.g;\nJ=D.A;a=(1<<9)-1;k=(1<<5)-1}if(i==2){y=F(o,x,5)+257;G=F(o,x+5,5)+1;f=F(o,x+10,4)+4;x+=14;var O=x,Q=1;\nfor(var p=0;p<38;p+=2){D.b[p]=0;D.b[p+1]=0}for(var p=0;p<f;p++){var l=F(o,x+p*3,3);D.b[(D.d[p]<<1)+1]=l;\nif(l>Q)Q=l}x+=3*f;C(D.b,Q);t(D.b,Q,D.C);P=D.k;J=D.n;x=B(D.C,(1<<Q)-1,y+G,o,x,D.a);var u=d(D.a,0,y,D.c);\na=(1<<u)-1;var n=d(D.a,y,G,D.e);k=(1<<n)-1;C(D.c,u);t(D.c,u,P);C(D.e,n);t(D.e,n,J)}while(!0){var h=P[w(o,x)&a];\nx+=h&15;var L=h>>>4;if(L>>>8==0){j[N++]=L}else if(L==256){break}else{var M=N+L-254;if(L>264){var z=D.B[L-257];\nM=N+(z>>>3)+F(o,x,z&7);x+=z&7}var e=J[w(o,x)&k];x+=e&15;var E=e>>>4,c=D.h[E],q=(c>>>4)+s(o,x,c&15);x+=c&15;\nif(A)j=H(j,N+(1<<17));while(N<M){j[N]=j[N++-q];j[N]=j[N++-q];j[N]=j[N++-q];j[N]=j[N++-q]}N=M}}}return j.length==N?j:j.slice(0,N)}function H(o,j){var I=o.length;\nif(j<=I)return o;var A=new Uint8Array(Math.max(I<<1,j));A.set(o,0);return A}function B(o,j,I,A,r,i){var y=0;\nwhile(y<I){var G=o[w(A,r)&j];r+=G&15;var f=G>>>4;if(f<=15){i[y]=f;y++}else{var a=0,k=0;if(f==16){k=3+F(A,r,2);\nr+=2;a=i[y-1]}else if(f==17){k=3+F(A,r,3);r+=3}else if(f==18){k=11+F(A,r,7);r+=7}var N=y+k;while(y<N){i[y]=a;\ny++}}}return r}function d(o,j,I,A){var r=0,i=0,y=A.length>>>1;while(i<I){var G=o[i+j];A[i<<1]=0;A[(i<<1)+1]=G;\nif(G>r)r=G;i++}while(i<y){A[i<<1]=0;A[(i<<1)+1]=0;i++}return r}return v}();\n\n\n\tfunction _readInterlace(data, out)\n\t{\n\t\tvar w = out.width, h = out.height;\n\t\tvar bpp = _getBPP(out), cbpp = bpp>>3, bpl = Math.ceil(w*bpp/8);\n\t\tvar img = new Uint8Array( h * bpl );\n\t\tvar di = 0;\n\n\t\tvar starting_row  = [ 0, 0, 4, 0, 2, 0, 1 ];\n\t\tvar starting_col  = [ 0, 4, 0, 2, 0, 1, 0 ];\n\t\tvar row_increment = [ 8, 8, 8, 4, 4, 2, 2 ];\n\t\tvar col_increment = [ 8, 8, 4, 4, 2, 2, 1 ];\n\n\t\tvar pass=0;\n\t\twhile(pass<7)\n\t\t{\n\t\t\tvar ri = row_increment[pass], ci = col_increment[pass];\n\t\t\tvar sw = 0, sh = 0;\n\t\t\tvar cr = starting_row[pass];  while(cr<h) {  cr+=ri;  sh++;  }\n\t\t\tvar cc = starting_col[pass];  while(cc<w) {  cc+=ci;  sw++;  }\n\t\t\tvar bpll = Math.ceil(sw*bpp/8);\n\t\t\t_filterZero(data, out, di, sw, sh);\n\n\t\t\tvar y=0, row = starting_row[pass];\n\t\t\twhile(row<h)\n\t\t\t{\n\t\t\t\tvar col = starting_col[pass];\n\t\t\t\tvar cdi = (di+y*bpll)<<3;\n\n\t\t\t\twhile(col<w)\n\t\t\t\t{\n\t\t\t\t\tif(bpp==1) {\n\t\t\t\t\t\tvar val = data[cdi>>3];  val = (val>>(7-(cdi&7)))&1;\n\t\t\t\t\t\timg[row*bpl + (col>>3)] |= (val << (7-((col&7)<<0)));\n\t\t\t\t\t}\n\t\t\t\t\tif(bpp==2) {\n\t\t\t\t\t\tvar val = data[cdi>>3];  val = (val>>(6-(cdi&7)))&3;\n\t\t\t\t\t\timg[row*bpl + (col>>2)] |= (val << (6-((col&3)<<1)));\n\t\t\t\t\t}\n\t\t\t\t\tif(bpp==4) {\n\t\t\t\t\t\tvar val = data[cdi>>3];  val = (val>>(4-(cdi&7)))&15;\n\t\t\t\t\t\timg[row*bpl + (col>>1)] |= (val << (4-((col&1)<<2)));\n\t\t\t\t\t}\n\t\t\t\t\tif(bpp>=8) {\n\t\t\t\t\t\tvar ii = row*bpl+col*cbpp;\n\t\t\t\t\t\tfor(var j=0; j<cbpp; j++) img[ii+j] = data[(cdi>>3)+j];\n\t\t\t\t\t}\n\t\t\t\t\tcdi+=bpp;  col+=ci;\n\t\t\t\t}\n\t\t\t\ty++;  row += ri;\n\t\t\t}\n\t\t\tif(sw*sh!=0) di += sh * (1 + bpll);\n\t\t\tpass = pass + 1;\n\t\t}\n\t\treturn img;\n\t}\n\n\tfunction _getBPP(out) {\n\t\tvar noc = [1,null,3,1,2,null,4][out.ctype];\n\t\treturn noc * out.depth;\n\t}\n\n\tfunction _filterZero(data, out, off, w, h)\n\t{\n\t\tvar bpp = _getBPP(out), bpl = Math.ceil(w*bpp/8);\n\t\tbpp = Math.ceil(bpp/8);\n\t\t\n\t\tvar i,di, type=data[off], x=0;\n\t\t\n\t\tif(type>1) data[off]=[0,0,1][type-2];  \n\t\tif(type==3) for(x=bpp; x<bpl; x++) data[x+1] = (data[x+1] + (data[x+1-bpp]>>>1) )&255;\n\n\t\tfor(var y=0; y<h; y++)  {\n\t\t\ti = off+y*bpl; di = i+y+1;\n\t\t\ttype = data[di-1]; x=0;\n\n\t\t\tif     (type==0)   for(; x<bpl; x++) data[i+x] = data[di+x];\n\t\t\telse if(type==1) { for(; x<bpp; x++) data[i+x] = data[di+x];\n\t\t\t\t\t\t\t   for(; x<bpl; x++) data[i+x] = (data[di+x] + data[i+x-bpp]);  }\n\t\t\telse if(type==2) { for(; x<bpl; x++) data[i+x] = (data[di+x] + data[i+x-bpl]);  }\n\t\t\telse if(type==3) { for(; x<bpp; x++) data[i+x] = (data[di+x] + ( data[i+x-bpl]>>>1));\n\t\t\t\t\t\t\t   for(; x<bpl; x++) data[i+x] = (data[di+x] + ((data[i+x-bpl]+data[i+x-bpp])>>>1) );  }\n\t\t\telse             { for(; x<bpp; x++) data[i+x] = (data[di+x] + _paeth(0, data[i+x-bpl], 0));\n\t\t\t\t\t\t\t   for(; x<bpl; x++) data[i+x] = (data[di+x] + _paeth(data[i+x-bpp], data[i+x-bpl], data[i+x-bpp-bpl]) );  }\n\t\t}\n\t\treturn data;\n\t}\n\n\tfunction _paeth(a,b,c)\n\t{\n\t\tvar p = a+b-c, pa = (p-a), pb = (p-b), pc = (p-c);\n\t\tif (pa*pa <= pb*pb && pa*pa <= pc*pc)  return a;\n\t\telse if (pb*pb <= pc*pc)  return b;\n\t\treturn c;\n\t}\n\n\tfunction _IHDR(data, offset, out)\n\t{\n\t\tout.width  = _bin.readUint(data, offset);  offset += 4;\n\t\tout.height = _bin.readUint(data, offset);  offset += 4;\n\t\tout.depth     = data[offset];  offset++;\n\t\tout.ctype     = data[offset];  offset++;\n\t\tout.compress  = data[offset];  offset++;\n\t\tout.filter    = data[offset];  offset++;\n\t\tout.interlace = data[offset];  offset++;\n\t}\n\n\tfunction _copyTile(sb, sw, sh, tb, tw, th, xoff, yoff, mode)\n\t{\n\t\tvar w = Math.min(sw,tw), h = Math.min(sh,th);\n\t\tvar si=0, ti=0;\n\t\tfor(var y=0; y<h; y++)\n\t\t\tfor(var x=0; x<w; x++)\n\t\t\t{\n\t\t\t\tif(xoff>=0 && yoff>=0) {  si = (y*sw+x)<<2;  ti = (( yoff+y)*tw+xoff+x)<<2;  }\n\t\t\t\telse                   {  si = ((-yoff+y)*sw-xoff+x)<<2;  ti = (y*tw+x)<<2;  }\n\t\t\t\t\n\t\t\t\tif     (mode==0) {  tb[ti] = sb[si];  tb[ti+1] = sb[si+1];  tb[ti+2] = sb[si+2];  tb[ti+3] = sb[si+3];  }\n\t\t\t\telse if(mode==1) {\n\t\t\t\t\tvar fa = sb[si+3]*(1/255), fr=sb[si]*fa, fg=sb[si+1]*fa, fb=sb[si+2]*fa; \n\t\t\t\t\tvar ba = tb[ti+3]*(1/255), br=tb[ti]*ba, bg=tb[ti+1]*ba, bb=tb[ti+2]*ba; \n\t\t\t\t\t\n\t\t\t\t\tvar ifa=1-fa, oa = fa+ba*ifa, ioa = (oa==0?0:1/oa);\n\t\t\t\t\ttb[ti+3] = 255*oa;  \n\t\t\t\t\ttb[ti+0] = (fr+br*ifa)*ioa;  \n\t\t\t\t\ttb[ti+1] = (fg+bg*ifa)*ioa;   \n\t\t\t\t\ttb[ti+2] = (fb+bb*ifa)*ioa;  \n\t\t\t\t}\n\t\t\t\telse if(mode==2){\t// copy only differences, otherwise zero\n\t\t\t\t\tvar fa = sb[si+3], fr=sb[si], fg=sb[si+1], fb=sb[si+2]; \n\t\t\t\t\tvar ba = tb[ti+3], br=tb[ti], bg=tb[ti+1], bb=tb[ti+2]; \n\t\t\t\t\tif(fa==ba && fr==br && fg==bg && fb==bb) {  tb[ti]=0;  tb[ti+1]=0;  tb[ti+2]=0;  tb[ti+3]=0;  }\n\t\t\t\t\telse {  tb[ti]=fr;  tb[ti+1]=fg;  tb[ti+2]=fb;  tb[ti+3]=fa;  }\n\t\t\t\t}\n\t\t\t\telse if(mode==3){\t// check if can be blended\n\t\t\t\t\tvar fa = sb[si+3], fr=sb[si], fg=sb[si+1], fb=sb[si+2]; \n\t\t\t\t\tvar ba = tb[ti+3], br=tb[ti], bg=tb[ti+1], bb=tb[ti+2]; \n\t\t\t\t\tif(fa==ba && fr==br && fg==bg && fb==bb) continue;\n\t\t\t\t\t//if(fa!=255 && ba!=0) return false;\n\t\t\t\t\tif(fa<220 && ba>20) return false;\n\t\t\t\t}\n\t\t\t}\n\t\treturn true;\n\t}\n\t\n\treturn {\n\t\tdecode:decode,\n\t\ttoRGBA8:toRGBA8,\n\t\t_paeth:_paeth,\n\t\t_copyTile:_copyTile,\n\t\t_bin:_bin\n\t};\n\n})();\n\n\n\n\n\n\n\n\n\n(function() {\n\tvar _copyTile = UPNG._copyTile, _bin=UPNG._bin, paeth = UPNG._paeth;\n\tvar crcLib = {\n\t\ttable : ( function() {\n\t\t   var tab = new Uint32Array(256);\n\t\t   for (var n=0; n<256; n++) {\n\t\t\t\tvar c = n;\n\t\t\t\tfor (var k=0; k<8; k++) {\n\t\t\t\t\tif (c & 1)  c = 0xedb88320 ^ (c >>> 1);\n\t\t\t\t\telse        c = c >>> 1;\n\t\t\t\t}\n\t\t\t\ttab[n] = c;  }\n\t\t\treturn tab;  })(),\n\t\tupdate : function(c, buf, off, len) {\n\t\t\tfor (var i=0; i<len; i++)  c = crcLib.table[(c ^ buf[off+i]) & 0xff] ^ (c >>> 8);\n\t\t\treturn c;\n\t\t},\n\t\tcrc : function(b,o,l)  {  return crcLib.update(0xffffffff,b,o,l) ^ 0xffffffff;  }\n\t}\n\t\n\t\n\tfunction addErr(er, tg, ti, f) {\n\t\ttg[ti]+=(er[0]*f)>>4;  tg[ti+1]+=(er[1]*f)>>4;  tg[ti+2]+=(er[2]*f)>>4;  tg[ti+3]+=(er[3]*f)>>4;  \n\t}\n\tfunction N(x) {  return Math.max(0, Math.min(255, x));  }\n\tfunction D(a,b) {  var dr=a[0]-b[0], dg=a[1]-b[1], db=a[2]-b[2], da=a[3]-b[3];  return (dr*dr + dg*dg + db*db + da*da);  }\n\t\t\n\t// MTD: 0: None, 1: floyd-steinberg, 2: Bayer\n\tfunction dither(sb, w, h, plte, tb, oind, MTD) {\n\t\tif(MTD==null) MTD=1;\t\t\n\t\t\n\t\tvar pc=plte.length, nplt = [], rads=[];\n\t\tfor(var i=0; i<pc; i++) {\n\t\t\tvar c = plte[i];\n\t\t\tnplt.push([((c>>>0)&255), ((c>>>8)&255), ((c>>>16)&255), ((c>>>24)&255)]);\n\t\t}\n\t\tfor(var i=0; i<pc; i++) {\n\t\t\tvar ne=0xffffffff, ni=0;\n\t\t\tfor(var j=0; j<pc; j++) {  var ce=D(nplt[i],nplt[j]);  if(j!=i && ce<ne) {  ne=ce;  ni=j;  }  }\n\t\t\tvar hd = Math.sqrt(ne)/2;\n\t\t\trads[i] = ~~(hd*hd);\n\t\t}\n\t\t\t\n\t\tvar tb32 = new Uint32Array(tb.buffer);\n\t\tvar err = new Int16Array(w*h*4);\n\t\t\n\t\t/*\n\t\tvar S=2, M = [\n\t\t\t0,2,\n\t\t    3,1];  //*/\n\t\t//*\n\t\tvar S=4, M = [\n\t\t\t 0, 8, 2,10,\n\t\t    12, 4,14, 6,\n\t\t\t 3,11, 1, 9,\n\t\t\t15, 7,13, 5 ];  //*/\n\t\tfor(var i=0; i<M.length; i++) M[i] = 255*(-0.5 + (M[i]+0.5)/(S*S));\n\t\t\n\t\tfor(var y=0; y<h; y++) {\n\t\t\tfor(var x=0; x<w; x++) {\n\t\t\t\tvar i = (y*w+x)*4;\n\t\t\t\t\n\t\t\t\tvar cc;\n\t\t\t\tif(MTD!=2) cc = [N(sb[i]+err[i]), N(sb[i+1]+err[i+1]), N(sb[i+2]+err[i+2]), N(sb[i+3]+err[i+3])];\n\t\t\t\telse {\n\t\t\t\t\tvar ce = M[(y&(S-1))*S+(x&(S-1))];\n\t\t\t\t\tcc = [N(sb[i]+ce), N(sb[i+1]+ce), N(sb[i+2]+ce), N(sb[i+3]+ce)];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar ni=0, nd = 0xffffff;\n\t\t\t\tfor(var j=0; j<pc; j++) {\n\t\t\t\t\tvar cd = D(cc,nplt[j]);\n\t\t\t\t\tif(cd<nd) {  nd=cd;  ni=j;  }\n\t\t\t\t}  \n\t\t\t\t\n\t\t\t\tvar nc = nplt[ni];\n\t\t\t\tvar er = [cc[0]-nc[0], cc[1]-nc[1], cc[2]-nc[2], cc[3]-nc[3]];\n\t\t\t\t\n\t\t\t\tif(MTD==1) {\n\t\t\t\t\t//addErr(er, err, i+4, 16);\n\t\t\t\t\tif(x!=w-1) addErr(er, err, i+4    , 7);\n\t\t\t\t\tif(y!=h-1) {\n\t\t\t\t\t\tif(x!=  0) addErr(er, err, i+4*w-4, 3);\n\t\t\t\t\t\t\t\t   addErr(er, err, i+4*w  , 5);\n\t\t\t\t\t\tif(x!=w-1) addErr(er, err, i+4*w+4, 1);  \n\t\t\t\t\t}//*/\n\t\t\t\t}\n\t\t\t\toind[i>>2] = ni;  tb32[i>>2] = plte[ni];\n\t\t\t}\n\t\t}\n\t}\n\n\t\n\tfunction encode(bufs, w, h, ps, dels, tabs, forbidPlte)\n\t{\n\t\tif(ps==null) ps=0;\n\t\tif(forbidPlte==null) forbidPlte = false;\n\n\t\tvar nimg = compress(bufs, w, h, ps, [false, false, false, 0, forbidPlte,false]);\n\t\tcompressPNG(nimg, -1);\n\t\t\n\t\treturn _main(nimg, w, h, dels, tabs);\n\t}\n\n\tfunction encodeLL(bufs, w, h, cc, ac, depth, dels, tabs) {\n\t\tvar nimg = {  ctype: 0 + (cc==1 ? 0 : 2) + (ac==0 ? 0 : 4),      depth: depth,  frames: []  };\n\t\t\n\t\tvar time = Date.now();\n\t\tvar bipp = (cc+ac)*depth, bipl = bipp * w;\n\t\tfor(var i=0; i<bufs.length; i++)\n\t\t\tnimg.frames.push({  rect:{x:0,y:0,width:w,height:h},  img:new Uint8Array(bufs[i]), blend:0, dispose:1, bpp:Math.ceil(bipp/8), bpl:Math.ceil(bipl/8)  });\n\t\t\n\t\tcompressPNG(nimg, 0, true);\n\t\t\n\t\tvar out = _main(nimg, w, h, dels, tabs);\n\t\treturn out;\n\t}\n\n\tfunction _main(nimg, w, h, dels, tabs) {\n\t\tif(tabs==null) tabs={};\n\t\tvar crc = crcLib.crc, wUi = _bin.writeUint, wUs = _bin.writeUshort, wAs = _bin.writeASCII;\n\t\tvar offset = 8, anim = nimg.frames.length>1, pltAlpha = false;\n\t\t\n\t\tvar cicc;\n\t\t\n\t\tvar leng = 8 + (16+5+4) /*+ (9+4)*/ + (anim ? 20 : 0);\n\t\tif(tabs[\"sRGB\"]!=null) leng += 8+1+4;\n\t\tif(tabs[\"pHYs\"]!=null) leng += 8+9+4;\n\t\tif(tabs[\"iCCP\"]!=null) {  cicc = pako.deflate(tabs[\"iCCP\"]);  leng += 8 + 11 + 2 + cicc.length + 4;  }\n\t\tif(nimg.ctype==3) {\n\t\t\tvar dl = nimg.plte.length;\n\t\t\tfor(var i=0; i<dl; i++) if((nimg.plte[i]>>>24)!=255) pltAlpha = true;\n\t\t\tleng += (8 + dl*3 + 4) + (pltAlpha ? (8 + dl*1 + 4) : 0);\n\t\t}\n\t\tfor(var j=0; j<nimg.frames.length; j++)\n\t\t{\n\t\t\tvar fr = nimg.frames[j];\n\t\t\tif(anim) leng += 38;\n\t\t\tleng += fr.cimg.length + 12;\n\t\t\tif(j!=0) leng+=4;\n\t\t}\n\t\tleng += 12; \n\t\t\n\t\tvar data = new Uint8Array(leng);\n\t\tvar wr=[0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n\t\tfor(var i=0; i<8; i++) data[i]=wr[i];\n\t\t\n\t\twUi(data,offset, 13);     offset+=4;\n\t\twAs(data,offset,\"IHDR\");  offset+=4;\n\t\twUi(data,offset,w);  offset+=4;\n\t\twUi(data,offset,h);  offset+=4;\n\t\tdata[offset] = nimg.depth;  offset++;  // depth\n\t\tdata[offset] = nimg.ctype;  offset++;  // ctype\n\t\tdata[offset] = 0;  offset++;  // compress\n\t\tdata[offset] = 0;  offset++;  // filter\n\t\tdata[offset] = 0;  offset++;  // interlace\n\t\twUi(data,offset,crc(data,offset-17,17));  offset+=4; // crc\n\n\t\t// 13 bytes to say, that it is sRGB\n\t\tif(tabs[\"sRGB\"]!=null) {\n\t\t\twUi(data,offset, 1);      offset+=4;\n\t\t\twAs(data,offset,\"sRGB\");  offset+=4;\n\t\t\tdata[offset] = tabs[\"sRGB\"];  offset++;\n\t\t\twUi(data,offset,crc(data,offset-5,5));  offset+=4; // crc\n\t\t}\n\t\tif(tabs[\"iCCP\"]!=null) {\n\t\t\tvar sl = 11+2+cicc.length;\n\t\t\twUi(data,offset, sl);  offset+=4;\n\t\t\twAs(data,offset,\"iCCP\");  offset+=4;\n\t\t\twAs(data,offset,\"ICC profile\");  offset+=11;  offset+=2;\n\t\t\tdata.set(cicc, offset);  offset+=cicc.length;\n\t\t\twUi(data,offset,crc(data,offset-(sl+4),sl+4));  offset+=4; // crc\n\t\t}\n\t\tif(tabs[\"pHYs\"]!=null) {\n\t\t\twUi(data,offset, 9);      offset+=4;\n\t\t\twAs(data,offset,\"pHYs\");  offset+=4;\n\t\t\twUi(data,offset, tabs[\"pHYs\"][0]);      offset+=4;\n\t\t\twUi(data,offset, tabs[\"pHYs\"][1]);      offset+=4;\n\t\t\tdata[offset]=tabs[\"pHYs\"][2];\t\t\toffset++;\n\t\t\twUi(data,offset,crc(data,offset-13,13));  offset+=4; // crc\n\t\t}\n\n\t\tif(anim) {\n\t\t\twUi(data,offset, 8);      offset+=4;\n\t\t\twAs(data,offset,\"acTL\");  offset+=4;\n\t\t\twUi(data,offset, nimg.frames.length);     offset+=4;\n\t\t\twUi(data,offset, tabs[\"loop\"]!=null?tabs[\"loop\"]:0);      offset+=4;\n\t\t\twUi(data,offset,crc(data,offset-12,12));  offset+=4; // crc\n\t\t}\n\n\t\tif(nimg.ctype==3) {\n\t\t\tvar dl = nimg.plte.length;\n\t\t\twUi(data,offset, dl*3);  offset+=4;\n\t\t\twAs(data,offset,\"PLTE\");  offset+=4;\n\t\t\tfor(var i=0; i<dl; i++){\n\t\t\t\tvar ti=i*3, c=nimg.plte[i], r=(c)&255, g=(c>>>8)&255, b=(c>>>16)&255;\n\t\t\t\tdata[offset+ti+0]=r;  data[offset+ti+1]=g;  data[offset+ti+2]=b;\n\t\t\t}\n\t\t\toffset+=dl*3;\n\t\t\twUi(data,offset,crc(data,offset-dl*3-4,dl*3+4));  offset+=4; // crc\n\n\t\t\tif(pltAlpha) {\n\t\t\t\twUi(data,offset, dl);  offset+=4;\n\t\t\t\twAs(data,offset,\"tRNS\");  offset+=4;\n\t\t\t\tfor(var i=0; i<dl; i++)  data[offset+i]=(nimg.plte[i]>>>24)&255;\n\t\t\t\toffset+=dl;\n\t\t\t\twUi(data,offset,crc(data,offset-dl-4,dl+4));  offset+=4; // crc\n\t\t\t}\n\t\t}\n\t\t\n\t\tvar fi = 0;\n\t\tfor(var j=0; j<nimg.frames.length; j++)\n\t\t{\n\t\t\tvar fr = nimg.frames[j];\n\t\t\tif(anim) {\n\t\t\t\twUi(data, offset, 26);     offset+=4;\n\t\t\t\twAs(data, offset,\"fcTL\");  offset+=4;\n\t\t\t\twUi(data, offset, fi++);   offset+=4;\n\t\t\t\twUi(data, offset, fr.rect.width );   offset+=4;\n\t\t\t\twUi(data, offset, fr.rect.height);   offset+=4;\n\t\t\t\twUi(data, offset, fr.rect.x);   offset+=4;\n\t\t\t\twUi(data, offset, fr.rect.y);   offset+=4;\n\t\t\t\twUs(data, offset, dels[j]);   offset+=2;\n\t\t\t\twUs(data, offset,  1000);   offset+=2;\n\t\t\t\tdata[offset] = fr.dispose;  offset++;\t// dispose\n\t\t\t\tdata[offset] = fr.blend  ;  offset++;\t// blend\n\t\t\t\twUi(data,offset,crc(data,offset-30,30));  offset+=4; // crc\n\t\t\t}\n\t\t\t\t\t\n\t\t\tvar imgd = fr.cimg, dl = imgd.length;\n\t\t\twUi(data,offset, dl+(j==0?0:4));     offset+=4;\n\t\t\tvar ioff = offset;\n\t\t\twAs(data,offset,(j==0)?\"IDAT\":\"fdAT\");  offset+=4;\n\t\t\tif(j!=0) {  wUi(data, offset, fi++);  offset+=4;  }\n\t\t\tdata.set(imgd,offset);\n\t\t\toffset += dl;\n\t\t\twUi(data,offset,crc(data,ioff,offset-ioff));  offset+=4; // crc\n\t\t}\n\n\t\twUi(data,offset, 0);     offset+=4;\n\t\twAs(data,offset,\"IEND\");  offset+=4;\n\t\twUi(data,offset,crc(data,offset-4,4));  offset+=4; // crc\n\n\t\treturn data.buffer;\n\t}\n\n\tfunction compressPNG(out, filter, levelZero) {\n\t\tfor(var i=0; i<out.frames.length; i++) {\n\t\t\tvar frm = out.frames[i], nw=frm.rect.width, nh=frm.rect.height;\n\t\t\tvar fdata = new Uint8Array(nh*frm.bpl+nh);\n\t\t\tfrm.cimg = _filterZero(frm.img,nh,frm.bpp,frm.bpl,fdata, filter, levelZero);\n\t\t}\n\t}\n\n\n\n\tfunction compress(bufs, w, h, ps, prms) // prms:  onlyBlend, minBits, forbidPlte\n\t{\n\t\t//var time = Date.now();\n\t\tvar onlyBlend = prms[0], evenCrd = prms[1], forbidPrev = prms[2], minBits = prms[3], forbidPlte = prms[4], dith=prms[5];\n\t\t\n\t\tvar ctype = 6, depth = 8, alphaAnd=255\n\t\t\n\t\tfor(var j=0; j<bufs.length; j++)  {  // when not quantized, other frames can contain colors, that are not in an initial frame\n\t\t\tvar img = new Uint8Array(bufs[j]), ilen = img.length;\n\t\t\tfor(var i=0; i<ilen; i+=4) alphaAnd &= img[i+3];\n\t\t}\n\t\tvar gotAlpha = (alphaAnd!=255);\n\t\t\n\t\t//console.log(\"alpha check\", Date.now()-time);  time = Date.now();\n\t\t\n\t\t//var brute = gotAlpha && forGIF;\t\t// brute : frames can only be copied, not \"blended\"\n\t\tvar frms = framize(bufs, w, h, onlyBlend, evenCrd, forbidPrev);\n\t\t//console.log(\"framize\", Date.now()-time);  time = Date.now();\n\t\t\n\t\tvar cmap={}, plte=[], inds=[]; \n\t\t\n\t\tif(ps!=0) {\n\t\t\tvar nbufs = [];  for(var i=0; i<frms.length; i++) nbufs.push(frms[i].img.buffer);\n\t\t\t\n\t\t\tvar abuf = concatRGBA(nbufs), qres = quantize(abuf, ps);\n\t\t\t\n\t\t\tfor(var i=0; i<qres.plte.length; i++) plte.push(qres.plte[i].est.rgba);\n\t\t\t\n\t\t\tvar cof = 0;\n\t\t\tfor(var i=0; i<frms.length; i++) {  \n\t\t\t\tvar frm=frms[i], bln=frm.img.length, ind = new Uint8Array(qres.inds.buffer, cof>>2, bln>>2);  inds.push(ind);\n\t\t\t\tvar bb = new Uint8Array(qres.abuf,cof,bln);\n\t\t\t\t\n\t\t\t\t//console.log(frm.img, frm.width, frm.height);\n\t\t\t\t//var time = Date.now();\n\t\t\t\tif(dith) dither(frm.img, frm.rect.width, frm.rect.height, plte, bb, ind);\n\t\t\t\t//console.log(Date.now()-time);\n\t\t\t\tfrm.img.set(bb);  cof+=bln;  \n\t\t\t}\n\t\t\t\n\t\t\t//console.log(\"quantize\", Date.now()-time);  time = Date.now();\n\t\t}\n\t\telse {\n\t\t\t// what if ps==0, but there are <=256 colors?  we still need to detect, if the palette could be used\n\t\t\tfor(var j=0; j<frms.length; j++)  {  // when not quantized, other frames can contain colors, that are not in an initial frame\n\t\t\t\tvar frm = frms[j], img32 = new Uint32Array(frm.img.buffer), nw=frm.rect.width, ilen = img32.length;\n\t\t\t\tvar ind = new Uint8Array(ilen);  inds.push(ind);\n\t\t\t\tfor(var i=0; i<ilen; i++) {\n\t\t\t\t\tvar c = img32[i];\n\t\t\t\t\tif     (i!=0 && c==img32[i- 1]) ind[i]=ind[i-1];\n\t\t\t\t\telse if(i>nw && c==img32[i-nw]) ind[i]=ind[i-nw];\n\t\t\t\t\telse {\n\t\t\t\t\t\tvar cmc = cmap[c];\n\t\t\t\t\t\tif(cmc==null) {  cmap[c]=cmc=plte.length;  plte.push(c);  if(plte.length>=300) break;  }\n\t\t\t\t\t\tind[i]=cmc;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t//console.log(\"make palette\", Date.now()-time);  time = Date.now();\n\t\t}\n\t\t\n\t\tvar cc=plte.length; //console.log(\"colors:\",cc);\n\t\tif(cc<=256 && forbidPlte==false) {\n\t\t\tif(cc<= 2) depth=1;  else if(cc<= 4) depth=2;  else if(cc<=16) depth=4;  else depth=8;\n\t\t\tdepth =  Math.max(depth, minBits);\n\t\t}\n\t\t\n\t\tfor(var j=0; j<frms.length; j++)\n\t\t{\n\t\t\tvar frm = frms[j], nx=frm.rect.x, ny=frm.rect.y, nw=frm.rect.width, nh=frm.rect.height;\n\t\t\tvar cimg = frm.img, cimg32 = new Uint32Array(cimg.buffer);\n\t\t\tvar bpl = 4*nw, bpp=4;\n\t\t\tif(cc<=256 && forbidPlte==false) {\n\t\t\t\tbpl = Math.ceil(depth*nw/8);\n\t\t\t\tvar nimg = new Uint8Array(bpl*nh);\n\t\t\t\tvar inj = inds[j];\n\t\t\t\tfor(var y=0; y<nh; y++) {  var i=y*bpl, ii=y*nw;\n\t\t\t\t\tif     (depth==8) for(var x=0; x<nw; x++) nimg[i+(x)   ]   =  (inj[ii+x]             );\n\t\t\t\t\telse if(depth==4) for(var x=0; x<nw; x++) nimg[i+(x>>1)]  |=  (inj[ii+x]<<(4-(x&1)*4));\n\t\t\t\t\telse if(depth==2) for(var x=0; x<nw; x++) nimg[i+(x>>2)]  |=  (inj[ii+x]<<(6-(x&3)*2));\n\t\t\t\t\telse if(depth==1) for(var x=0; x<nw; x++) nimg[i+(x>>3)]  |=  (inj[ii+x]<<(7-(x&7)*1));\n\t\t\t\t}\n\t\t\t\tcimg=nimg;  ctype=3;  bpp=1;\n\t\t\t}\n\t\t\telse if(gotAlpha==false && frms.length==1) {\t// some next \"reduced\" frames may contain alpha for blending\n\t\t\t\tvar nimg = new Uint8Array(nw*nh*3), area=nw*nh;\n\t\t\t\tfor(var i=0; i<area; i++) { var ti=i*3, qi=i*4;  nimg[ti]=cimg[qi];  nimg[ti+1]=cimg[qi+1];  nimg[ti+2]=cimg[qi+2];  }\n\t\t\t\tcimg=nimg;  ctype=2;  bpp=3;  bpl=3*nw;\n\t\t\t}\n\t\t\tfrm.img=cimg;  frm.bpl=bpl;  frm.bpp=bpp;\n\t\t}\n\t\t//console.log(\"colors => palette indices\", Date.now()-time);  time = Date.now();\n\t\t\n\t\treturn {ctype:ctype, depth:depth, plte:plte, frames:frms  };\n\t}\n\tfunction framize(bufs,w,h,alwaysBlend,evenCrd,forbidPrev) {\n\t\t/*  DISPOSE\n\t\t\t- 0 : no change\n\t\t\t- 1 : clear to transparent\n\t\t\t- 2 : retstore to content before rendering (previous frame disposed)\n\t\t\tBLEND\n\t\t\t- 0 : replace\n\t\t\t- 1 : blend\n\t\t*/\n\t\tvar frms = [];\n\t\tfor(var j=0; j<bufs.length; j++) {\n\t\t\tvar cimg = new Uint8Array(bufs[j]), cimg32 = new Uint32Array(cimg.buffer);\n\t\t\tvar nimg;\n\t\t\t\n\t\t\tvar nx=0, ny=0, nw=w, nh=h, blend=alwaysBlend?1:0;\n\t\t\tif(j!=0) {\n\t\t\t\tvar tlim = (forbidPrev || alwaysBlend || j==1 || frms[j-2].dispose!=0)?1:2, tstp = 0, tarea = 1e9;\n\t\t\t\tfor(var it=0; it<tlim; it++)\n\t\t\t\t{\n\t\t\t\t\tvar pimg = new Uint8Array(bufs[j-1-it]), p32 = new Uint32Array(bufs[j-1-it]);\n\t\t\t\t\tvar mix=w,miy=h,max=-1,may=-1;\n\t\t\t\t\tfor(var y=0; y<h; y++) for(var x=0; x<w; x++) {\n\t\t\t\t\t\tvar i = y*w+x;\n\t\t\t\t\t\tif(cimg32[i]!=p32[i]) {\n\t\t\t\t\t\t\tif(x<mix) mix=x;  if(x>max) max=x;\n\t\t\t\t\t\t\tif(y<miy) miy=y;  if(y>may) may=y;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(max==-1) mix=miy=max=may=0;\n\t\t\t\t\tif(evenCrd) {  if((mix&1)==1)mix--;  if((miy&1)==1)miy--;  }\n\t\t\t\t\tvar sarea = (max-mix+1)*(may-miy+1);\n\t\t\t\t\tif(sarea<tarea) {\n\t\t\t\t\t\ttarea = sarea;  tstp = it;\n\t\t\t\t\t\tnx = mix; ny = miy; nw = max-mix+1; nh = may-miy+1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// alwaysBlend: pokud zjist\u00EDm, \u017Ee blendit nelze, nastav\u00EDm p\u0159edchoz\u00EDmu sn\u00EDmku dispose=1. Zajist\u00EDm, aby obsahoval m\u016Fj obd\u00E9ln\u00EDk.\n\t\t\t\tvar pimg = new Uint8Array(bufs[j-1-tstp]);\n\t\t\t\tif(tstp==1) frms[j-1].dispose = 2;\n\t\t\t\t\n\t\t\t\tnimg = new Uint8Array(nw*nh*4);\n\t\t\t\t_copyTile(pimg,w,h, nimg,nw,nh, -nx,-ny, 0);\n\t\t\t\t\n\t\t\t\tblend =  _copyTile(cimg,w,h, nimg,nw,nh, -nx,-ny, 3) ? 1 : 0;\n\t\t\t\tif(blend==1) _prepareDiff(cimg,w,h,nimg,{x:nx,y:ny,width:nw,height:nh});\n\t\t\t\telse         _copyTile(cimg,w,h, nimg,nw,nh, -nx,-ny, 0);\n\t\t\t}\n\t\t\telse nimg = cimg.slice(0);\t// img may be rewritten further ... don't rewrite input\n\t\t\t\n\t\t\tfrms.push({rect:{x:nx,y:ny,width:nw,height:nh}, img:nimg, blend:blend, dispose:0});\n\t\t}\n\t\t\n\t\t\n\t\tif(alwaysBlend) for(var j=0; j<frms.length; j++) {\n\t\t\tvar frm = frms[j];  if(frm.blend==1) continue;\n\t\t\tvar r0 = frm.rect, r1 = frms[j-1].rect\n\t\t\tvar miX = Math.min(r0.x, r1.x), miY = Math.min(r0.y, r1.y);\n\t\t\tvar maX = Math.max(r0.x+r0.width, r1.x+r1.width), maY = Math.max(r0.y+r0.height, r1.y+r1.height);\n\t\t\tvar r = {x:miX, y:miY, width:maX-miX, height:maY-miY};\n\t\t\t\n\t\t\tfrms[j-1].dispose = 1;\n\t\t\tif(j-1!=0) \n\t\t\t_updateFrame(bufs, w,h,frms, j-1,r, evenCrd);\n\t\t\t_updateFrame(bufs, w,h,frms, j  ,r, evenCrd);\n\t\t}\n\t\tvar area = 0;\n\t\tif(bufs.length!=1) for(var i=0; i<frms.length; i++) {\n\t\t\tvar frm = frms[i];\n\t\t\tarea += frm.rect.width*frm.rect.height;\n\t\t\t//if(i==0 || frm.blend!=1) continue;\n\t\t\t//var ob = new Uint8Array(\n\t\t\t//console.log(frm.blend, frm.dispose, frm.rect);\n\t\t}\n\t\t//if(area!=0) console.log(area);\n\t\treturn frms;\n\t}\n\tfunction _updateFrame(bufs, w,h, frms, i, r, evenCrd) {\n\t\tvar U8 = Uint8Array, U32 = Uint32Array;\n\t\tvar pimg = new U8(bufs[i-1]), pimg32 = new U32(bufs[i-1]), nimg = i+1<bufs.length ? new U8(bufs[i+1]):null;\n\t\tvar cimg = new U8(bufs[i]), cimg32 = new U32(cimg.buffer);\n\t\t\n\t\tvar mix=w,miy=h,max=-1,may=-1;\n\t\tfor(var y=0; y<r.height; y++) for(var x=0; x<r.width; x++) {\n\t\t\tvar cx = r.x+x, cy = r.y+y;\n\t\t\tvar j = cy*w+cx, cc = cimg32[j];\n\t\t\t// no need to draw transparency, or to dispose it. Or, if writing the same color and the next one does not need transparency.\n\t\t\tif(cc==0 || (frms[i-1].dispose==0 && pimg32[j]==cc && (nimg==null || nimg[j*4+3]!=0))/**/) {}\n\t\t\telse {\n\t\t\t\tif(cx<mix) mix=cx;  if(cx>max) max=cx;\n\t\t\t\tif(cy<miy) miy=cy;  if(cy>may) may=cy;\n\t\t\t}\n\t\t}\n\t\tif(max==-1) mix=miy=max=may=0;\n\t\tif(evenCrd) {  if((mix&1)==1)mix--;  if((miy&1)==1)miy--;  }\n\t\tr = {x:mix, y:miy, width:max-mix+1, height:may-miy+1};\n\t\t\n\t\tvar fr = frms[i];  fr.rect = r;  fr.blend = 1;  fr.img = new Uint8Array(r.width*r.height*4);\n\t\tif(frms[i-1].dispose==0) {\n\t\t\t_copyTile(pimg,w,h, fr.img,r.width,r.height, -r.x,-r.y, 0);\n\t\t\t_prepareDiff(cimg,w,h,fr.img,r);\n\t\t}\n\t\telse\n\t\t\t_copyTile(cimg,w,h, fr.img,r.width,r.height, -r.x,-r.y, 0);\n\t}\n\tfunction _prepareDiff(cimg, w,h, nimg, rec) {\n\t\t_copyTile(cimg,w,h, nimg,rec.width,rec.height, -rec.x,-rec.y, 2);\n\t}\n\n\tfunction _filterZero(img,h,bpp,bpl,data, filter, levelZero)\n\t{\n\t\tvar fls = [], ftry=[0,1,2,3,4];\n\t\tif     (filter!=-1)             ftry=[filter];\n\t\telse if(h*bpl>500000 || bpp==1) ftry=[0];\n\t\tvar opts;  if(levelZero) opts={level:0};\n\t\t\n\t\t\n\t\tvar CMPR = (data.length>10e6 && window.UZIP!=null) ? window.UZIP : pako;\n\t\t\n\t\tvar time = Date.now();\n\t\tfor(var i=0; i<ftry.length; i++) {\n\t\t\tfor(var y=0; y<h; y++) _filterLine(data, img, y, bpl, bpp, ftry[i]);\n\t\t\t//var nimg = new Uint8Array(data.length);\n\t\t\t//var sz = UZIP.F.deflate(data, nimg);  fls.push(nimg.slice(0,sz));\n\t\t\t//var dfl = pako[\"deflate\"](data), dl=dfl.length-4;\n\t\t\t//var crc = (dfl[dl+3]<<24)|(dfl[dl+2]<<16)|(dfl[dl+1]<<8)|(dfl[dl+0]<<0);\n\t\t\t//console.log(crc, UZIP.adler(data,2,data.length-6));\n\t\t\tfls.push(CMPR[\"deflate\"](data,opts));\n\t\t}\n\t\t\n\t\tvar ti, tsize=1e9;\n\t\tfor(var i=0; i<fls.length; i++) if(fls[i].length<tsize) {  ti=i;  tsize=fls[i].length;  }\n\t\treturn fls[ti];\n\t}\n\tfunction _filterLine(data, img, y, bpl, bpp, type)\n\t{\n\t\tvar i = y*bpl, di = i+y;\n\t\tdata[di]=type;  di++;\n\n\t\tif(type==0) {\n\t\t\tif(bpl<500) for(var x=0; x<bpl; x++) data[di+x] = img[i+x];\n\t\t\telse data.set(new Uint8Array(img.buffer,i,bpl),di);\n\t\t}\n\t\telse if(type==1) {\n\t\t\tfor(var x=  0; x<bpp; x++) data[di+x] =  img[i+x];\n\t\t\tfor(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x]-img[i+x-bpp]+256)&255;\n\t\t}\n\t\telse if(y==0) {\n\t\t\tfor(var x=  0; x<bpp; x++) data[di+x] = img[i+x];\n\n\t\t\tif(type==2) for(var x=bpp; x<bpl; x++) data[di+x] = img[i+x];\n\t\t\tif(type==3) for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x] - (img[i+x-bpp]>>1) +256)&255;\n\t\t\tif(type==4) for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x] - paeth(img[i+x-bpp], 0, 0) +256)&255;\n\t\t}\n\t\telse {\n\t\t\tif(type==2) { for(var x=  0; x<bpl; x++) data[di+x] = (img[i+x]+256 - img[i+x-bpl])&255;  }\n\t\t\tif(type==3) { for(var x=  0; x<bpp; x++) data[di+x] = (img[i+x]+256 - (img[i+x-bpl]>>1))&255;\n\t\t\t\t\t\t  for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x]+256 - ((img[i+x-bpl]+img[i+x-bpp])>>1))&255;  }\n\t\t\tif(type==4) { for(var x=  0; x<bpp; x++) data[di+x] = (img[i+x]+256 - paeth(0, img[i+x-bpl], 0))&255;\n\t\t\t\t\t\t  for(var x=bpp; x<bpl; x++) data[di+x] = (img[i+x]+256 - paeth(img[i+x-bpp], img[i+x-bpl], img[i+x-bpp-bpl]))&255;  }\n\t\t}\n\t}\n\n\n\tfunction quantize(abuf, ps, doKmeans)\n\t{\t\n\t\tvar time = Date.now();\n\t\tvar sb = new Uint8Array(abuf), tb = sb.slice(0), tb32 = new Uint32Array(tb.buffer);\n\t\t\n\t\tvar KD = getKDtree(tb, ps);\n\t\tvar root = KD[0], leafs = KD[1], K=leafs.length;\n\t\t\n\t\t//console.log(Date.now()-time, \"tree made\");  time = Date.now();\n\t\t\n\t\tvar cl32 = new Uint32Array(K), clr8=new Uint8Array(cl32.buffer);\n\t\tfor(var i=0; i<K; i++) cl32[i]=leafs[i].est.rgba;\n\t\t\n\t\tvar len=sb.length;\n\t\t\t\n\t\tvar inds = new Uint8Array(len>>2), nd;\n\t\tif(K<=60) {  findNearest(sb,inds,clr8);  remap(inds,tb32,cl32);  }\n\t\telse if(sb.length<32e6)  // precise, but slow :(\n\t\t\t//for(var j=0; j<4; j++) \n\t\t\tfor(var i=0; i<len; i+=4) {\n\t\t\t\tvar r=sb[i]*(1/255), g=sb[i+1]*(1/255), b=sb[i+2]*(1/255), a=sb[i+3]*(1/255);\n\t\t\t\t\n\t\t\t\tnd = getNearest(root, r, g, b, a);\n\t\t\t\tinds[i>>2] = nd.ind;  tb32[i>>2] = nd.est.rgba;\n\t\t\t}\n\t\telse \n\t\t\tfor(var i=0; i<len; i+=4) {\n\t\t\t\tvar r=sb[i]*(1/255), g=sb[i+1]*(1/255), b=sb[i+2]*(1/255), a=sb[i+3]*(1/255);\n\t\t\t\t\n\t\t\t\tnd = root;  while(nd.left) nd = (planeDst(nd.est,r,g,b,a)<=0) ? nd.left : nd.right;\n\t\t\t\tinds[i>>2] = nd.ind;  tb32[i>>2] = nd.est.rgba;\n\t\t\t}\n\t\t\t\n\t\t//console.log(Date.now()-time, \"nearest found\");  time = Date.now();\n\t\t\n\t\tif(doKmeans || sb.length*K<10*4e6) {\n\t\t\tvar le = 1e9;\n\t\t\tfor(var i=0; i<10; i++) {\n\t\t\t\tvar ce = kmeans(sb, inds, clr8);  //console.log(i,ce);\n\t\t\t\tif(ce/le>0.997) break;  le=ce;\n\t\t\t}\n\t\t\tfor(var i=0; i<K; i++) leafs[i].est.rgba = cl32[i];\n\t\t\tremap(inds,tb32,cl32);\n\t\t\t//console.log(Date.now()-time, \"k-means\");\n\t\t}\n\t\t\n\t\treturn {  abuf:tb.buffer, inds:inds, plte:leafs  };\n\t}\n\t\n\tfunction remap(inds,tb32,pl32) {  for(var i=0; i<inds.length; i++) tb32[i]=pl32[inds[i]];  }\n\tfunction kmeans(sb,inds,plte) {\n\t\tupdatePalette(sb,inds,plte);\n\t\tvar err = findNearest(sb,inds,plte);\n\t\treturn err;\n\t}\n\t\n\tfunction updatePalette(sb,inds,plte) {\n\t\tvar K = plte.length>>>2;\n\t\tvar sums = new Uint32Array(K*4), cnts = new Uint32Array(K);\n\t\t\n\t\tfor(var i=0; i<sb.length; i+=4) {\n\t\t\tvar ind = inds[i>>>2], qi=ind*4;\n\t\t\tcnts[ind]++;\n\t\t\tsums[qi  ]+=sb[i  ];  sums[qi+1]+=sb[i+1];\n\t\t\tsums[qi+2]+=sb[i+2];  sums[qi+3]+=sb[i+3];\n\t\t}\n\t\tfor(var i=0; i<plte.length; i++) plte[i]=Math.round(sums[i]/cnts[i>>>2]);\n\t}\n\t\n\tfunction findNearest(sb,inds,plte) {\n\t\tvar terr = 0, K=plte.length>>>2;\n\t\t\n\t\tvar nd = [];  // squared half-distance to the nearest color\n\t\tfor(var i=0; i<K; i++) {\n\t\t\tvar qi=i*4;\n\t\t\tvar r=plte[qi], g=plte[qi+1], b=plte[qi+2], a=plte[qi+3], ti=0, te=1e9;\n\t\t\tfor(var j=0; j<K; j++) {\n\t\t\t\tif(i==j) continue;\n\t\t\t\tvar qj=j*4, dr=r-plte[qj], dg=g-plte[qj+1], db=b-plte[qj+2], da=a-plte[qj+3];\n\t\t\t\tvar err = dr*dr+dg*dg+db*db+da*da;\n\t\t\t\tif(err<te) {te=err;  ti=j;}\n\t\t\t}\n\t\t\tnd[i] = Math.sqrt(te)*0.5;  nd[i]=nd[i]*nd[i];\n\t\t}\n\t\t\n\t\tfor(var i=0; i<sb.length; i+=4) {\n\t\t\tvar r=sb[i  ], g=sb[i+1], b=sb[i+2], a=sb[i+3];\n\t\t\tvar ti=inds[i>>>2], qi=ti*4, dr=r-plte[qi], dg=g-plte[qi+1], db=b-plte[qi+2], da=a-plte[qi+3], te = dr*dr+dg*dg+db*db+da*da;\n\t\t\tif(te>nd[ti]) for(var j=0; j<K; j++) {\n\t\t\t\tqi=j*4; dr=r-plte[qi]; dg=g-plte[qi+1]; db=b-plte[qi+2]; da=a-plte[qi+3];\n\t\t\t\tvar err = dr*dr+dg*dg+db*db+da*da;\n\t\t\t\tif(err<te) {te=err;  ti=j;  if(te<nd[j]) break; }\n\t\t\t}\n\t\t\tinds[i>>>2]=ti;\n\t\t\tterr+=te;\n\t\t}\n\t\treturn terr/(sb.length>>>2);\n\t}\n\n\tfunction getKDtree(nimg, ps, err) {\n\t\tif(err==null) err = 0.0001;\n\t\tvar nimg32 = new Uint32Array(nimg.buffer);\n\t\t\n\t\tvar root = {i0:0, i1:nimg.length, bst:null, est:null, tdst:0, left:null, right:null };  // basic statistic, extra statistic\n\t\troot.bst = stats(  nimg,root.i0, root.i1  );  root.est = estats( root.bst );\n\t\tvar leafs = [root];\n\t\t\n\t\twhile(leafs.length<ps)\n\t\t{\n\t\t\tvar maxL = 0, mi=0;\n\t\t\tfor(var i=0; i<leafs.length; i++) if(leafs[i].est.L > maxL) {  maxL=leafs[i].est.L;  mi=i;  }\n\t\t\tif(maxL<err) break;\n\t\t\tvar node = leafs[mi];\n\t\t\t\n\t\t\tvar s0 = splitPixels(nimg,nimg32, node.i0, node.i1, node.est.e, node.est.eMq255);\n\t\t\tvar s0wrong = (node.i0>=s0 || node.i1<=s0);\n\t\t\t//console.log(maxL, leafs.length, mi);\n\t\t\tif(s0wrong) {  node.est.L=0;  continue;  }\n\t\t\t\n\t\t\t\n\t\t\tvar ln = {i0:node.i0, i1:s0, bst:null, est:null, tdst:0, left:null, right:null };  ln.bst = stats( nimg, ln.i0, ln.i1 );  \n\t\t\tln.est = estats( ln.bst );\n\t\t\tvar rn = {i0:s0, i1:node.i1, bst:null, est:null, tdst:0, left:null, right:null };  rn.bst = {R:[], m:[], N:node.bst.N-ln.bst.N};\n\t\t\tfor(var i=0; i<16; i++) rn.bst.R[i] = node.bst.R[i]-ln.bst.R[i];\n\t\t\tfor(var i=0; i< 4; i++) rn.bst.m[i] = node.bst.m[i]-ln.bst.m[i];\n\t\t\trn.est = estats( rn.bst );\n\t\t\t\n\t\t\tnode.left = ln;  node.right = rn;\n\t\t\tleafs[mi]=ln;  leafs.push(rn);\n\t\t}\n\t\tleafs.sort(function(a,b) {  return b.bst.N-a.bst.N;  });\n\t\tfor(var i=0; i<leafs.length; i++) leafs[i].ind=i;\n\t\treturn [root, leafs];\n\t}\n\n\tfunction getNearest(nd, r,g,b,a)\n\t{\n\t\tif(nd.left==null) {  nd.tdst = dist(nd.est.q,r,g,b,a);  return nd;  }\n\t\tvar pd = planeDst(nd.est,r,g,b,a);\n\t\t\n\t\tvar node0 = nd.left, node1 = nd.right;\n\t\tif(pd>0) {  node0=nd.right;  node1=nd.left;  }\n\t\t\n\t\tvar ln = getNearest(node0, r,g,b,a);\n\t\tif(ln.tdst<=pd*pd) return ln;\n\t\tvar rn = getNearest(node1, r,g,b,a);\n\t\treturn rn.tdst<ln.tdst ? rn : ln;\n\t}\n\tfunction planeDst(est, r,g,b,a) {  var e = est.e;  return e[0]*r + e[1]*g + e[2]*b + e[3]*a - est.eMq;  }\n\tfunction dist    (q,   r,g,b,a) {  var d0=r-q[0], d1=g-q[1], d2=b-q[2], d3=a-q[3];  return d0*d0+d1*d1+d2*d2+d3*d3;  }\n\n\tfunction splitPixels(nimg, nimg32, i0, i1, e, eMq)\n\t{\n\t\ti1-=4;\n\t\tvar shfs = 0;\n\t\twhile(i0<i1)\n\t\t{\n\t\t\twhile(vecDot(nimg, i0, e)<=eMq) i0+=4;\n\t\t\twhile(vecDot(nimg, i1, e)> eMq) i1-=4;\n\t\t\tif(i0>=i1) break;\n\t\t\t\n\t\t\tvar t = nimg32[i0>>2];  nimg32[i0>>2] = nimg32[i1>>2];  nimg32[i1>>2]=t;\n\t\t\t\n\t\t\ti0+=4;  i1-=4;\n\t\t}\n\t\twhile(vecDot(nimg, i0, e)>eMq) i0-=4;\n\t\treturn i0+4;\n\t}\n\tfunction vecDot(nimg, i, e)\n\t{\n\t\treturn nimg[i]*e[0] + nimg[i+1]*e[1] + nimg[i+2]*e[2] + nimg[i+3]*e[3];\n\t}\n\tfunction stats(nimg, i0, i1){\n\t\tvar R = [0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0];\n\t\tvar m = [0,0,0,0];\n\t\tvar N = (i1-i0)>>2;\n\t\tfor(var i=i0; i<i1; i+=4)\n\t\t{\n\t\t\tvar r = nimg[i]*(1/255), g = nimg[i+1]*(1/255), b = nimg[i+2]*(1/255), a = nimg[i+3]*(1/255);\n\t\t\t//var r = nimg[i], g = nimg[i+1], b = nimg[i+2], a = nimg[i+3];\n\t\t\tm[0]+=r;  m[1]+=g;  m[2]+=b;  m[3]+=a;\n\t\t\t\n\t\t\tR[ 0] += r*r;  R[ 1] += r*g;  R[ 2] += r*b;  R[ 3] += r*a;  \n\t\t\t\t\t\t   R[ 5] += g*g;  R[ 6] += g*b;  R[ 7] += g*a; \n\t\t\t\t\t\t\t\t\t\t  R[10] += b*b;  R[11] += b*a;  \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t R[15] += a*a;  \n\t\t}\n\t\tR[4]=R[1];  R[8]=R[2];  R[9]=R[6];  R[12]=R[3];  R[13]=R[7];  R[14]=R[11];\n\t\t\n\t\treturn {R:R, m:m, N:N};\n\t}\n\tfunction estats(stats){\n\t\tvar R = stats.R, m = stats.m, N = stats.N;\n\t\t\n\t\t// when all samples are equal, but N is large (millions), the Rj can be non-zero ( 0.0003.... - precission error)\n\t\tvar m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], iN = (N==0 ? 0 : 1/N);\n\t\tvar Rj = [\n\t\t\tR[ 0] - m0*m0*iN,  R[ 1] - m0*m1*iN,  R[ 2] - m0*m2*iN,  R[ 3] - m0*m3*iN,  \n\t\t\tR[ 4] - m1*m0*iN,  R[ 5] - m1*m1*iN,  R[ 6] - m1*m2*iN,  R[ 7] - m1*m3*iN,\n\t\t\tR[ 8] - m2*m0*iN,  R[ 9] - m2*m1*iN,  R[10] - m2*m2*iN,  R[11] - m2*m3*iN,  \n\t\t\tR[12] - m3*m0*iN,  R[13] - m3*m1*iN,  R[14] - m3*m2*iN,  R[15] - m3*m3*iN \n\t\t];\n\t\t\n\t\tvar A = Rj, M = M4;\n\t\tvar b = [0.6180339887, 0.3819660113, 0.7320508076, 0.4142135624], mi = 0, tmi = 0;   // \u2463 WXHW 2026-09-10\uFF1A\u5E42\u8FED\u4EE3\u8D77\u70B9\u4ECE Math.random \u6539\u6210\u56FA\u5B9A\u901A\u7528\u5411\u91CF \u2192 \u8C03\u8272\u677F\u91CF\u5316\u786E\u5B9A\u6027\uFF08\u540C\u5185\u5BB9\u540C\u5B57\u8282\uFF1B\u5C01\u9762\u5224\u5B9A\u9760\u5B57\u8282\u6BD4\u5BF9\uFF09\u3002\u4EFB\u4F55\u975E\u9000\u5316\u8D77\u70B9\u90FD\u6536\u655B\u5230\u4E3B\u7279\u5F81\u5411\u91CF\uFF0C\u8D28\u91CF\u4E0D\u53D8\u3002\n\t\t\n\t\tif(N!=0)\n\t\tfor(var i=0; i<16; i++) {\n\t\t\tb = M.multVec(A, b);  tmi = Math.sqrt(M.dot(b,b));  b = M.sml(1/tmi,  b);\n\t\t\tif(i!=0 && Math.abs(tmi-mi)<1e-9) break;  mi = tmi;\n\t\t}\t\n\t\t//b = [0,0,1,0];  mi=N;\n\t\tvar q = [m0*iN, m1*iN, m2*iN, m3*iN];\n\t\tvar eMq255 = M.dot(M.sml(255,q),b);\n\t\t\n\t\treturn {  Cov:Rj, q:q, e:b, L:mi,  eMq255:eMq255, eMq : M.dot(b,q),\n\t\t\t\t\trgba: (((Math.round(255*q[3])<<24) | (Math.round(255*q[2])<<16) |  (Math.round(255*q[1])<<8) | (Math.round(255*q[0])<<0))>>>0)  };\n\t}\n\tvar M4 = {\n\t\tmultVec : function(m,v) {\n\t\t\t\treturn [\n\t\t\t\t\tm[ 0]*v[0] + m[ 1]*v[1] + m[ 2]*v[2] + m[ 3]*v[3],\n\t\t\t\t\tm[ 4]*v[0] + m[ 5]*v[1] + m[ 6]*v[2] + m[ 7]*v[3],\n\t\t\t\t\tm[ 8]*v[0] + m[ 9]*v[1] + m[10]*v[2] + m[11]*v[3],\n\t\t\t\t\tm[12]*v[0] + m[13]*v[1] + m[14]*v[2] + m[15]*v[3]\n\t\t\t\t];\n\t\t},\n\t\tdot : function(x,y) {  return  x[0]*y[0]+x[1]*y[1]+x[2]*y[2]+x[3]*y[3];  },\n\t\tsml : function(a,y) {  return [a*y[0],a*y[1],a*y[2],a*y[3]];  }\n\t}\n\n\tfunction concatRGBA(bufs) {\n\t\tvar tlen = 0;\n\t\tfor(var i=0; i<bufs.length; i++) tlen += bufs[i].byteLength;\n\t\tvar nimg = new Uint8Array(tlen), noff=0;\n\t\tfor(var i=0; i<bufs.length; i++) {\n\t\t\tvar img = new Uint8Array(bufs[i]), il = img.length;\n\t\t\tfor(var j=0; j<il; j+=4) {  \n\t\t\t\tvar r=img[j], g=img[j+1], b=img[j+2], a = img[j+3];\n\t\t\t\tif(a==0) r=g=b=0;\n\t\t\t\tnimg[noff+j]=r;  nimg[noff+j+1]=g;  nimg[noff+j+2]=b;  nimg[noff+j+3]=a;  }\n\t\t\tnoff += il;\n\t\t}\n\t\treturn nimg.buffer;\n\t}\n\t\n\tUPNG.encode = encode;\n\tUPNG.encodeLL = encodeLL;\n\tUPNG.encode.compress = compress;\n\tUPNG.encode.dither = dither;\n\t\n\tUPNG.quantize = quantize;\n\tUPNG.quantize.findNearest=findNearest;\n\tUPNG.quantize.getKDtree=getKDtree;\n\tUPNG.quantize.getNearest=getNearest;\n})();\n\n\nexport default UPNG;\nexport { UPNG };\n", "// \u7248\u672C SSoT\u3002created 2026-10-06 by Claude Opus 5.5\n// \u5BB6\u65CF\u7EA6\u5B9A\uFF1Amajor.minor.patch\uFF1Bpatch \u4F8B\u884C\uFF0Cminor = \u65B0\u529F\u80FD\u7EAA\u5143\uFF08AI \u63D0\u8BAE\u3001user \u6279\uFF09\uFF0Cmajor = \u5403\u4E66\uFF08\u53EA\u7531 user \u63D0\uFF09\u3002\nexport const APP_VERSION = \"v0.14.8-2026-10-21\";\n", "// \u9875\u9762\u4FA7 PWA shell\uFF1A\u6CE8\u518C service worker + 4 \u8DEF\u66F4\u65B0\u68C0\u6D4B \u2192 onUpdateAvailable \u56DE\u8C03\uFF08JRP \u51FD\u6570\u5F62 + WeebPaint \u6559\u8BAD\uFF09\u3002\n// created 2026-09-03 by Claude Fable 5.1\uFF08WXHW\uFF09\u00B7 2026-09-19 \u62F7\u5165 JRB by Claude Fable 5.1 \u00B7 2026-10-07 \u62F7\u5165 MoonSinger by Claude Opus 5.5\n//   \u8DEF\u5F84 1 \u51B7\u542F\u52A8\u9047 registration.waiting \u00B7 2 updatefound\u2192installed \u00B7 3 SW postMessage asset-updated \u00B7 4 \u56DE\u524D\u53F0/\u7126\u70B9/10min poke\n//   \uFF084 = iPad/Quest \u547D\u95E8\uFF1Astandalone PWA \u4E0D\u4F1A\u81EA\u5DF1 updatefound\uFF09\u3002\n//   prod \u4E0E dev(/dev/) \u90FD\u6CE8\u518C\uFF08worker \u6309 scope \u5206 cache-first / network-first\uFF09\uFF1B\u53EA\u8DF3 localhost\uFF08dev server \u65E0 SW\uFF09\u3002\n//   onForeground **\u65E0\u6761\u4EF6\u6302**\uFF08\u4E0D\u5BC4\u751F\u5728 SW \u6CE8\u518C\u6210\u529F\u8DEF\u5F84\u4E0A\u2014\u2014WeebPaint v409 \u5751\uFF09\u3002\n//   \u6A21\u5757\u9876\u5C42\u8C03\u7528\uFF08\u4E0D\u8FDB window.load\uFF1Atype=module \u65F6 load \u53EF\u80FD\u65E9\u5DF2\u8FC7\u53BB\u2014\u2014RealHome \u5751 #0\uFF09\u3002\n\n\nconst LOCAL_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"::1\", \"\"]);\n\n/** \u672C app \u58F3\u7F13\u5B58\u7684\u540D\u5B57\u524D\u7F00\uFF08= service-worker.js \u7684 `moonsinger-<hash>` / `moonsinger-boot`\uFF09\u3002\u6E05\u7F13\u5B58\u53EA\u8BB8\u52A8\u8FD9\u4E2A\u524D\u7F00\u3002 */\nconst SHELL_CACHE_PREFIX = \"moonsinger-\";\n\nexport interface PwaShellOptions {\n  onUpdateAvailable: () => void;\n  onForeground?: () => void;\n  onBeforeReload?: () => void | Promise<void>;\n}\nexport interface PwaShell {\n  readonly isDevRoute: boolean;\n  /** \u5E94\u7528\u7B49\u5F85\u4E2D\u7684\u65B0 SW \u5E76 reload\uFF08toast\u300C\u5237\u65B0\u300D\u6309\u94AE\u8C03\uFF09\u3002 */\n  reload: () => Promise<void>;\n  /** \u6E05\u7F13\u5B58\u91CD\u542F\uFF08PWA \u5361\u65E7\u7248\u7684\u9003\u751F\u8231\uFF09\uFF1A\u6CE8\u9500\u7BA1\u7740\u672C\u9875\u7684 SW + \u6E05\u81EA\u5DF1\u524D\u7F00\u7684\u58F3\u7F13\u5B58 + reload\u3002\u6A21\u578B\u5305\uFF08`pwa-models`\uFF09\u4E0D\u78B0\u3002 */\n  forceReset: () => Promise<void>;\n  /** \u53EA\u6E05\u81EA\u5DF1\u7684\u79BB\u7EBF\u58F3\uFF08\u6CE8\u9500\u7BA1\u7740\u672C\u9875\u7684 SW + \u5220 `moonsinger-` \u524D\u7F00\u7684 Cache\uFF09\uFF0C\u4E0D reload\u3001\u4E0D flush\u2014\u2014\u8FD8\u539F\u51FA\u5382\u6700\u540E\u4E00\u6B65\u7528\uFF08WeebPaint shell-reset.ts \u540C\u5F62\uFF1B2026-10-21\uFF09\u3002 */\n  clearOwnShell: () => Promise<void>;\n  /** \u624B\u52A8\u68C0\u67E5\u66F4\u65B0\uFF08\u8BBE\u7F6E\u91CC\u7684\u6309\u94AE\uFF09\uFF1Apoke registration.update()\uFF0C\u7B49\u65B0 SW \u88C5\u5B8C\u3002\n   *  \"found\" = \u6709\u65B0\u7248\u5F85\u5E94\u7528\uFF08\u8C03\u7528\u65B9\u5F39\u300C\u6709\u65B0\u7248\u672C\u300Dtoast\uFF09\uFF1B\"latest\" = \u5DF2\u662F\u6700\u65B0\uFF1B\"unavailable\" = \u6CA1\u6709 SW\uFF08localhost / \u4E0D\u652F\u6301\uFF09\u3002 */\n  checkForUpdate: () => Promise<\"found\" | \"latest\" | \"unavailable\">;\n}\n\nexport function initPwaShell(opts: PwaShellOptions): PwaShell {\n  const isDevRoute = location.pathname.includes(\"/dev/\") || LOCAL_HOSTS.has(location.hostname);\n  let registration: ServiceWorkerRegistration | null = null;\n\n  async function reload(): Promise<void> {\n    try { await opts.onBeforeReload?.(); } catch { /* \u843D\u76D8\u5931\u8D25\u4E5F\u5F97\u8BA9\u7528\u6237\u80FD\u5237 */ }\n    const reg = registration ?? (await navigator.serviceWorker?.getRegistration()) ?? null;\n    if (!reg || !reg.waiting) { location.reload(); return; }\n    let done = false;\n    const doReload = () => { if (done) return; done = true; location.reload(); };\n    navigator.serviceWorker.addEventListener(\"controllerchange\", doReload, { once: true });\n    reg.waiting.postMessage({ type: \"skip-waiting\" });\n    setTimeout(doReload, 5000);\n  }\n\n  // \u52A0\u56FA\uFF08user 2026-09-04 Quest\u300C\u70B9\u5F3A\u5236\u5237\u65B0\u6CA1\u6709\u81EA\u52A8\u91CD\u542F\u300D\uFF0C\u539F\u56E0\u4E0D\u660E\u4E14\u65E0\u6CD5\u8FDC\u7A0B\u590D\u73B0\uFF09\uFF1A\u8FD9\u6761\u94FE\u4E0D\u8BB8\u65E0\u58F0\u2014\u2014\n  //   \u524D\u7F6E flush \u52A0\u8D85\u65F6\uFF08\u6302\u4F4F\u4E5F\u8D70\uFF09\uFF1B\u5BFC\u822A\u7528\u5E26\u65F6\u95F4\u6233\u7684 replace\uFF08\u7ED5 HTTP \u7F13\u5B58\uFF1Breload \u88AB\u541E\u4E5F\u80FD\u8D70\uFF09\uFF1B2.5s \u770B\u95E8\u72D7\u518D\u8E22\u4E00\u811A\uFF1B\n  //   \u91CD\u542F\u540E\u6807\u9898\u680F\u7684\u7248\u672C\u53F7\u5C31\u662F\u5230\u4E86\u54EA\u4E00\u7248\u3002\n  /** \u53EA\u52A8\u81EA\u5DF1\u7684\uFF1A\u5BB6\u65CF\u7684 app \u51E0\u4E4E\u90FD\u6302\u5728\u540C\u4E00\u4E2A\u57DF\u540D\u4E0B\uFF0C\u7F13\u5B58\u548C service worker \u662F\u6309\u57DF\u540D\u7B97\u7684\u2014\u2014\u300C\u5168\u90E8\u6CE8\u9500 / \u5168\u90E8\u5220\u9664\u300D\u4F1A\u628A\u5144\u5F1F app \u7684\u79BB\u7EBF\u58F3\u3001\u5BB6\u65CF\u5171\u4EAB\u7684\u6A21\u578B\u7F13\u5B58 `pwa-models` \u4E00\u8D77\u6E05\u6389\u3002\n   *  \u81EA\u5DF1\u7684 = \u7BA1\u7740\u5F53\u524D\u9875\u9762\u7684\u90A3\u4E00\u4E2A service worker + \u540D\u5B57\u4EE5 `moonsinger-` \u5F00\u5934\u7684\u7F13\u5B58\uFF08service-worker.js \u7684\u58F3\u7F13\u5B58\u524D\u7F00\uFF09\u3002\u5931\u8D25\u53EA\u541E\u5355\u9879\u3002 */\n  async function clearOwnShell(): Promise<void> {\n    if (navigator.serviceWorker) { const r = await navigator.serviceWorker.getRegistration(); if (r) await r.unregister().catch(() => {}); }\n    if (typeof caches !== \"undefined\") for (const k of await caches.keys()) { if (k.startsWith(SHELL_CACHE_PREFIX)) await caches.delete(k).catch(() => {}); }\n  }\n  async function forceReset(): Promise<void> {\n    const settle = (p: void | Promise<void>, ms: number) => Promise.race([Promise.resolve(p).catch(() => undefined), new Promise<void>((r) => setTimeout(r, ms))]);\n    await settle(opts.onBeforeReload?.(), 4000);\n    try { await clearOwnShell(); } catch { /* best-effort \u2014 reload anyway */ }\n    const target = `${location.pathname}?reset=${Date.now()}`;\n    setTimeout(() => location.replace(target), 150);\n    setTimeout(() => { location.href = target; }, 2500);   // \u770B\u95E8\u72D7\uFF1A\u7B2C\u4E00\u811A\u6CA1\u8D70\u518D\u8E22\u4E00\u6B21\n  }\n\n  async function checkForUpdate(): Promise<\"found\" | \"latest\" | \"unavailable\"> {\n    const reg = registration ?? (await navigator.serviceWorker?.getRegistration()) ?? null;\n    if (!reg) return \"unavailable\";\n    if (reg.waiting) return \"found\";\n    try { await reg.update(); } catch { return \"unavailable\"; }\n    if (reg.waiting) return \"found\";\n    const sw = reg.installing;\n    if (!sw) return \"latest\";\n    // \u65B0 SW \u6B63\u5728\u88C5\uFF1A\u7B49\u5B83 installed\uFF08\u226415s\uFF0C\u6162\u7F51\u515C\u5E95\uFF09\u2014\u2014\u88C5\u5B8C = \u6709\u65B0\u7248\n    return await new Promise((resolve) => {\n      const timer = setTimeout(() => resolve(reg.waiting ? \"found\" : \"latest\"), 15000);\n      sw.addEventListener(\"statechange\", () => {\n        if (sw.state === \"installed\") { clearTimeout(timer); resolve(\"found\"); }\n        else if (sw.state === \"redundant\") { clearTimeout(timer); resolve(\"latest\"); }\n      });\n    });\n  }\n\n  const onFg = () => {\n    registration?.update().catch(() => {});\n    opts.onForeground?.();\n  };\n  document.addEventListener(\"visibilitychange\", () => { if (document.visibilityState === \"visible\") onFg(); });\n  window.addEventListener(\"focus\", onFg);\n\n  if (\"serviceWorker\" in navigator && !LOCAL_HOSTS.has(location.hostname)) {\n    navigator.serviceWorker.addEventListener(\"message\", (e: MessageEvent) => {\n      if ((e.data as { type?: string } | null)?.type === \"asset-updated\") opts.onUpdateAvailable();\n    });\n    navigator.serviceWorker.register(\"./service-worker.js\").then((reg) => {\n      registration = reg;\n      if (reg.waiting && navigator.serviceWorker.controller) opts.onUpdateAvailable();\n      reg.addEventListener(\"updatefound\", () => {\n        const sw = reg.installing;\n        if (!sw) return;\n        sw.addEventListener(\"statechange\", () => {\n          if (sw.state === \"installed\" && navigator.serviceWorker.controller) opts.onUpdateAvailable();\n        });\n      });\n      setInterval(() => { reg.update().catch(() => {}); }, 10 * 60 * 1000);\n    }).catch((err: unknown) => { console.warn(\"[pwa] SW register failed\", err); });\n  }\n\n  return { isDevRoute, reload, forceReset, clearOwnShell, checkForUpdate };\n}\n", "// paper.ts \u2014\u2014 \u7EB8\uFF1AA4 / A5 / A6\uFF08\u9ED8\u8BA4 A5\uFF09\u3002created 2026-10-07 by Claude Opus 5.5\n// user 2026-10-07\u300C\u4E94\u7EBF\u8C31\u5BBD\u5EA6\uFF1A\u8981\u4E0D\u8FD8\u662F\u6309\u7167\u56FA\u5B9A\u7269\u7406\u9875\u6846\uFF1F\u770B\u770Bwebxiaoheiwu\u7684\u9009\u9879\u3002\u6B63\u7ECF\u7EB8\u548C\u5C0F\u518C\u5B50\uFF1F\u300D\u2192\u300C\u55EFA4 A5 A6\u4E09\u79CD\uFF0C\u53EF\u4EE5\u5B9A\u300D\n//   \u300C\u9ED8\u8BA4A5\u540C\u610F\u300D\u300C\u975E\u6253\u5370\u7684\u65F6\u5019\u4E0D\u7528\u65AD\u9875\u300D\uFF1B\u7EB8\u7684\u6A21\u578B\uFF08\u6570\u636E\u5951\u7EA6\u8349\u7A3F \u00A76\u00BE\uFF09\uFF1A\u7EB8\u53EA\u5C5E\u4E8E\u8C31\u8FD9\u4E00\u5C42\uFF0C\u6574\u9996\u6B4C\u4E00\u4E2A\u7EB8\u5F20\u8BBE\u7F6E\u3002\n// \u00B7 \u7167 WXHW\u300C\u5B57\u53F7\u7EDD\u5BF9\u300D\uFF1A\u4E94\u7EBF\u8C31\u7684\u5B9E\u9645\u5927\u5C0F\u4E09\u6863\u4E00\u6837\uFF08STAFF_MM\uFF09\uFF0C\u7EB8\u8D8A\u5927\u4E00\u884C\u653E\u7684\u5C0F\u8282\u8D8A\u591A\u3002\n// \u00B7 \u5C4F\u4E0A\uFF1A\u653E\u5F97\u4E0B\u5C31\u4E25\u683C\u6309\u7EB8\u7684\u7248\u5FC3\u5BBD\u6392\uFF08\u6240\u89C1\u5373\u6240\u5F97\uFF09\uFF0C\u653E\u4E0D\u4E0B\uFF08\u624B\u673A\uFF09\u6309\u5C4F\u5BBD\u91CD\u65B0\u6298\u884C\u2014\u2014\u90A3\u662F score-view \u7684\u4E8B\uFF0C\u8FD9\u91CC\u53EA\u7ED9\u6570\u3002\n// \u00B7 \u5B58\u6863 = MusicXML \u6807\u51C6\u7684 <defaults>\uFF08<scaling> \u4E94\u7EBF\u8C31\u591A\u5927 + <page-layout> \u9875\u5BBD\u9AD8\u3001\u8FB9\u8DDD\uFF09\uFF0C\u4E0D\u52A0\u6269\u5C55\uFF1B\u522B\u7684\u8F6F\u4EF6\u7684\u522B\u7684\u7EB8\u539F\u6837\u4FDD\u7559\uFF08kind = \"other\"\uFF09\u3002\n\nexport type PaperKind = \"A3L\" | \"A4\" | \"A5\" | \"A6\";   // A3 \u7AD6 2026-10-08 user\u300C\u4E0D\u8981A3\u7AD6\u76F4\u300D\n/** density = \u7248\u5F0F\u4E24\u6863\uFF1A\u8212\u9002\uFF08\u9ED8\u8BA4\uFF09/ \u7D27\u51D1\uFF08\u8C31\u5C0F\u4E00\u53F7\u3001\u884C\u8DDD / \u8C31\u8DDD / \u6B4C\u8BCD\u8DDD\u90FD\u6536\u7D27\u3001\u6CA1\u6B4C\u8BCD\u7684\u58F0\u90E8\u4E0D\u7559\u6B4C\u8BCD\u4F4D\uFF09\u2014\u20142026-10-08 user\u300C\u6392\u7248\u5F15\u64CE\u8FD8\u662F\u8981\u652F\u6301\u5C0F\u5B57\u53F7\u3002\u4E0D\u7136\u7684\u8BDD\u4EA4\u54CD\u603B\u8C31\u7684\u8BDDA3\u4E5F\u627F\u91CD\u4E0D\u4E86\u5427\u300D\n *  \u2192\u300C\u6BD4\u8D77\u5B57\u53F7\uFF0C\u5C31\u4E00\u4E2A\u8212\u9002\u4E00\u4E2A\u7D27\u51D1\u4E24\u4E2A\u9009\u9879\uFF1F\u7136\u540E\u7D27\u51D1\u4F60\u53EF\u4EE5\u591A\u5E2E\u6211\u4F18\u5316\u4E00\u4E9B\uFF0C\u5305\u62EC\u5B57\u53F7\uFF0C\u884C\u8DDD\u4E4B\u7C7B\u7684\u300D\u3002\n *  staffMm = \u4E94\u7EBF\u8C31\u9AD8\uFF08\u56DB\u4E2A\u7EBF\u95F4\u8DDD\uFF09mm\uFF1A\u522B\u7684\u8F6F\u4EF6\u7684\u6587\u4EF6\u5E26\u7684\u5927\u5C0F\u539F\u6837\u7559\u7740\uFF1B\u81EA\u5BB6\u53EA\u6309 density \u5B9A\uFF08\u6CA1\u6709 = \u8212\u9002 7 / \u7D27\u51D1 5\uFF09\u3002 */\nexport type Density = \"cozy\" | \"compact\";\nexport interface Paper { kind: PaperKind | \"other\"; widthMm: number; heightMm: number; marginMm: { l: number; r: number; t: number; b: number }; density?: Density; staffMm?: number }\n\n/** \u4E94\u7EBF\u8C31\u9AD8\uFF08\u56DB\u4E2A\u7EBF\u95F4\u8DDD\uFF09mm\uFF1A7 mm = \u4E00\u4E2A\u7EBF\u95F4\u8DDD 1.75 mm\uFF08\u6253\u8C31\u8F6F\u4EF6\u7684\u5E38\u7528\u5927\u5C0F\uFF09= \u8212\u9002\u6863\uFF1B\u7D27\u51D1 5 mm\u3002 */\nexport const STAFF_MM = 7, STAFF_MM_COMPACT = 5;\nexport const DENSITIES: { id: Density; label: string; note: string }[] = [{ id: \"cozy\", label: \"\u8212\u9002\", note: \"\u8C31\u5927\" }, { id: \"compact\", label: \"\u7D27\u51D1\", note: \"\u8C31\u5C0F\u4E00\u53F7\u3001\u884C\u8DDD\u518D\u5377\u4E00\u70B9\uFF1B\u603B\u8C31\u58F0\u90E8\u591A\u7528\u8FD9\u4E2A\" }];\nexport const densityOf = (p: Paper): Density => p.density ?? \"cozy\";\nexport const staffMmOf = (p: Paper): number => p.staffMm ?? (densityOf(p) === \"compact\" ? STAFF_MM_COMPACT : STAFF_MM);\n/** \u4E00\u4E2A\u7EBF\u95F4\u8DDD mm\uFF08\u6309\u8FD9\u5F20\u7EB8\u7684\u8C31\u5927\u5C0F\uFF09\u3002 */\nexport const spMm = (p: Paper): number => staffMmOf(p) / 4;\n/** \u5BBD\u3001\u9AD8\u3001\u56DB\u8FB9\u8FB9\u8DDD\uFF08mm\uFF09\u3002A5 \u7684\u8FB9\u8DDD\u8BA9\u7248\u5FC3\u6B63\u597D\u653E\u5F97\u8FDB iPad mini \u7AD6\u5C4F\uFF08\u89E6\u5C4F 11 px \u4E00\u683C \u2248 729 px\uFF09\u3002A3 \u6A2A = \u4EA4\u54CD\u603B\u8C31 / \u5927\u7535\u89C6\uFF08user 2026-10-08\u300C\u52A0\u4E00\u4E2AA3\u6A2A\u7248\u300D\uFF09\u3002 */\nconst SIZES: Record<PaperKind, { w: number; h: number; m: number }> = { A3L: { w: 420, h: 297, m: 18 }, A4: { w: 210, h: 297, m: 15 }, A5: { w: 148, h: 210, m: 16 }, A6: { w: 105, h: 148, m: 10 } };\nexport const PAPER_KINDS: PaperKind[] = [\"A3L\", \"A4\", \"A5\", \"A6\"];\nexport const DEFAULT_PAPER: PaperKind = \"A5\";\n/** \u6863\u540D\u540E\u9762\u7684\u4E00\u53E5\u8BDD\uFF08\u7EB8\u7684\u8BBE\u7F6E\u9762\u677F\u91CC\uFF09\u3002 */\nexport const PAPER_NOTE: Record<PaperKind, string> = { A3L: \"\u6A2A\u653E\uFF1A\u603B\u8C31 / \u5927\u5C4F\", A4: \"\u6B63\u7ECF\u7EB8\", A5: \"\u5C0F\u518C\u5B50\uFF08A4 \u5BF9\u6298\uFF09\", A6: \"\u53E3\u888B\u672C\" };\nexport const PAPER_LABEL: Record<PaperKind, string> = { A3L: \"A3 \u6A2A\", A4: \"A4\", A5: \"A5\", A6: \"A6\" };\n\nexport function paperOf(kind: PaperKind, density: Density = \"cozy\"): Paper {\n  const s = SIZES[kind];\n  return { kind, widthMm: s.w, heightMm: s.h, marginMm: { l: s.m, r: s.m, t: s.m, b: s.m }, ...(density === \"compact\" ? { density } : {}) };\n}\n/** \u4E00\u884C\uFF08\u7248\u5FC3\uFF09\u591A\u5BBD\uFF0C\u5355\u4F4D = \u7EBF\u95F4\u8DDD\uFF08\u8C31\u8D8A\u5C0F\u4E00\u884C\u653E\u5F97\u8D8A\u591A\uFF09\u3002 */\nexport const lineSp = (p: Paper): number => (p.widthMm - p.marginMm.l - p.marginMm.r) / spMm(p);\n/** \u5206\u9875\u6392\u7248\u7684\u9875\u9762\u51E0\u4F55\uFF08\u5355\u4F4D = \u7EBF\u95F4\u8DDD\uFF09\uFF1A\u9875\u9AD8 + \u56DB\u8FB9\u8FB9\u8DDD\u3002\u5206\u9875\u9884\u89C8\u548C PDF \u5171\u7528\uFF08\u4E00\u5904\u7B97\uFF0C\u4E24\u8FB9\u4E00\u6837\uFF09\u3002 */\nexport const pageGeoOf = (p: Paper): { h: number; l: number; r: number; t: number; b: number } => { const mm = spMm(p), m = p.marginMm; return { h: p.heightMm / mm, l: m.l / mm, r: m.r / mm, t: m.t / mm, b: m.b / mm }; };\n\n/** \u6309\u9875\u9762\u5C3A\u5BF8\u8BA4\u6863\uFF1A\u5DEE 2 mm \u5185\u7B97\u540C\u4E00\u6863\uFF08\u8FB9\u8DDD\u7167\u6587\u4EF6\u91CC\u7684\uFF09\uFF1B\u90FD\u4E0D\u662F = other\uFF08\u539F\u6837\u4FDD\u7559\uFF09\u3002\n *  density \u7167\u6587\u4EF6\u91CC\u7684 staff-distance \u8BA4\uFF08musicxml.ts\uFF09\uFF1B\u8C31\u7684\u5927\u5C0F\u6B63\u597D\u662F\u90A3\u4E00\u6863\u7684\u5C31\u4E0D\u53E6\u8BB0 staffMm\uFF0C\u522B\u7684\u5927\u5C0F\uFF08\u522B\u7684\u8F6F\u4EF6\u7684\uFF09\u539F\u6837\u8BB0\u4E0B\u6765\u3002 */\nexport function detectPaper(widthMm: number, heightMm: number, marginMm: Paper[\"marginMm\"], staffMm = STAFF_MM, density: Density = \"cozy\"): Paper {\n  const near = (a: number, b: number) => Math.abs(a - b) <= 2;\n  const kind = PAPER_KINDS.find((k) => near(widthMm, SIZES[k].w) && near(heightMm, SIZES[k].h));\n  const want = density === \"compact\" ? STAFF_MM_COMPACT : STAFF_MM;\n  const extra = { ...(density === \"compact\" ? { density } : {}), ...(Math.abs(staffMm - want) < 0.05 ? {} : { staffMm: +staffMm.toFixed(2) }) };\n  return kind ? { ...paperOf(kind), marginMm, ...extra } : { kind: \"other\", widthMm, heightMm, marginMm, ...extra };\n}\n/** \u300C\u5176\u4ED6\u300D\u7EB8\u7684\u6837\u5B50\uFF1A\u300C216 \u00D7 279 mm\u300D\u3002 */\nexport const paperSizeText = (p: Paper): string => `${Math.round(p.widthMm)} \u00D7 ${Math.round(p.heightMm)} mm`;\n", "// latch.ts \u2014\u2014 \u952E\u76D8\u4E0A\u7684\u300C\u9501\u300D\uFF1AShift \u5F0F\u4FEE\u9970\u952E\u7684\u90A3\u4E00\u6761\u89C4\u5219\uFF0C\u5199\u4E00\u4EFD\u3001\u4E09\u628A\u9501\uFF08/2\u3001\u5347\u964D\u3001\u6E10\u5230\uFF09\u5404\u4E00\u4E2A\u5B9E\u4F8B\u3002created 2026-10-15 by Claude Fable 5.1\n//   \u7F16\u8F91\u72B6\u6001\u673A\u6574\u7406\u7B2C 2 \u671F\uFF08\u7B56\u5212\u7A3F ai-docs/20261013-edit-state-machine-survey.md \u00A71b / \u00A73\uFF1B\u4E0D\u53D8\u91CF I3\u300C\u4E00\u628A\u9501\u4E00\u6761\u89C4\u5219\u300D\uFF09\uFF1B\u952E\u76D8\u6A21\u5757\uFF08src/keyboard/\uFF0C\u9879\u76EE\u5185\u90E8\u6A21\u5757\uFF0C\n//   user 2026-10-15\u300C\u8FD9\u4E2A\u662F\u9879\u76EE\u5185\u90E8\u5E93\u2026\u66F4\u50CF\u662F\u6A21\u5757\u300D\uFF09\u7684\u7B2C\u4E00\u5757\u3002\u7EAF\u51FD\u6570\u3001\u4E0D\u78B0 DOM\u3001\u4E0D\u61C2\u97F3\u4E50\u3002\n//   \u89C4\u5219\uFF08user 2026-10-07\u300C\u56E0\u4E3Aaccessibility\u7684issue\u53EF\u80FD\u6309\u4F4F\u4E0D\u65B9\u4FBF\u2026\u548C\u952E\u76D8shift\u7684\u903B\u8F91\u4E00\u6837\u300D\uFF1B10-09\u300C\u7B26\u53F7\u952E\u76D8\u5E94\u8BE5\u53EA\u6709caps\u6A21\u5F0F\u6CA1\u6709shift\u6A21\u5F0F\u300D\u2014\u2014caps \u4E0D\u5728\u8FD9\u91CC\uFF0C\u5B83\u662F\u4E2A\u5E03\u5C14\uFF09\uFF1A\n//     \u00B7 \u70B9\u4E00\u4E0B = \u53EA\u7BA1\u63A5\u4E0B\u6765\u7684 uses \u6B21\u5199\uFF08/2 = 2\uFF1A\u4E24\u4E2A\u51CF\u534A\u7684\u51D1\u4E00\u4EFD\uFF1B\u5347\u964D / \u6E10\u5230 = 1\uFF09\uFF1B\n//     \u00B7 350 ms \u5185\u518D\u70B9\u4E00\u4E0B = \u9501\u4F4F\uFF08\u4E4B\u540E\u4E00\u76F4\u7BA1\uFF0C\u518D\u70B9\u4E00\u4E0B\u5173\uFF09\uFF1B\u8FC7\u4E86\u7A97\u53E3\u518D\u70B9 = \u5173\uFF1B\n//     \u00B7 \u6309\u4F4F\u5199 = \u6309\u4F4F\u671F\u95F4\u5199\u7684\u90FD\u7B97\u3001\u677E\u624B\u56DE\u53BB\uFF08\u540C iOS \u6309\u4F4F Shift \u6253\u5B57\uFF09\uFF1B\u6309\u4F4F\u6CA1\u5199 = \u677E\u624B\u7B49\u4E8E\u70B9\u4E86\u4E00\u4E0B\uFF1B\n//     \u00B7 \u632A\u5149\u6807 / \u62E8\u65CB\u94AE = \u300C\u53EA\u7BA1\u63A5\u4E0B\u6765\u51E0\u6B21\u300D\u4F5C\u5E9F\uFF08\u9501\u4F4F\u7684\u4E0D\u52A8\uFF09\u3002\n\nexport type LatchMode = \"off\" | \"once\" | \"lock\";\nexport interface Latch {\n  readonly mode: LatchMode;\n  /** \u4E0A\u4E00\u6B21\u6309\u4E0B\u7684\u65F6\u523B\uFF08\u8FDE\u70B9\u5224\u5B9A\uFF09\u3002 */\n  readonly at: number;\n  /** \u6B63\u6309\u7740\u3002 */\n  readonly held: boolean;\n  /** \u6309\u7740\u7684\u65F6\u5019\u5199\u8FC7\uFF08\u677E\u624B\u8981\u56DE\u53BB\uFF09\u3002 */\n  readonly wrote: boolean;\n  /** once \u8FD8\u7BA1\u51E0\u6B21\u5199\u3002 */\n  readonly left: number;\n}\nexport const DOUBLE_TAP_MS = 350;\nexport const LATCH_OFF: Latch = { mode: \"off\", at: 0, held: false, wrote: false, left: 0 };\n\n/** \u6309\u4E0B\uFF08\u70B9\u4E00\u4E0B\u7684\u524D\u534A\uFF09\uFF1Aoff \u2192 once\uFF1Bonce \u4E14\u5728\u8FDE\u70B9\u7A97\u53E3\u91CC \u2192 lock\uFF1B\u5176\u4F59 \u2192 off\u3002 */\nexport function latchDown(l: Latch, now: number, uses = 1): Latch {\n  const mode: LatchMode = l.mode === \"off\" ? \"once\" : l.mode === \"once\" && now - l.at < DOUBLE_TAP_MS ? \"lock\" : \"off\";\n  return { mode, at: now, held: true, wrote: false, left: mode === \"once\" ? uses : 0 };\n}\n/** \u677E\u624B\uFF1A\u6309\u7740\u7684\u65F6\u5019\u5199\u8FC7\u4E14\u6CA1\u9501\u4F4F = \u56DE\u53BB\uFF08off\uFF09\uFF1B\u6CA1\u5199\u8FC7 = \u70B9\u4E86\u4E00\u4E0B\u7684\u540E\u534A\uFF0C\u72B6\u6001\u7167 down \u5B9A\u7684\u3002 */\nexport function latchUp(l: Latch): Latch {\n  if (!l.held) return l;\n  return l.wrote && l.mode !== \"lock\" ? { ...LATCH_OFF, at: l.at } : { ...l, held: false };\n}\n/** \u70B9\u4E00\u4E0B\uFF08\u6309\u4E0B\u9A6C\u4E0A\u677E\u5F00\uFF1Bpad \u7684\u683C\u5B50\uFF09\u3002 */\nexport const latchTap = (l: Latch, now: number, uses = 1): Latch => latchUp(latchDown(l, now, uses));\n/** \u5199\u4E86\u4E00\u4E2A\uFF08\u97F3 / \u4F11\u6B62 / \u62C9\u957F / \u529B\u5EA6\u2026\uFF09\uFF1A\u6309\u7740 = \u8BB0\u4E00\u7B14\uFF08\u677E\u624B\u518D\u56DE\u53BB\uFF0C\u4E0D\u6D88\u8017\uFF09\uFF1Bonce = \u7528\u6389\u4E00\u6B21\uFF0C\u7528\u5B8C\u5173\uFF1Block / off \u4E0D\u52A8\u3002 */\nexport function latchWrite(l: Latch): Latch {\n  if (l.held) return l.wrote ? l : { ...l, wrote: true };\n  if (l.mode === \"once\") return l.left <= 1 ? { ...LATCH_OFF, at: l.at } : { ...l, left: l.left - 1 };\n  return l;\n}\n/** \u632A\u5149\u6807 / \u62E8\u65CB\u94AE\uFF1A\u300C\u53EA\u7BA1\u63A5\u4E0B\u6765\u51E0\u6B21\u300D\u4F5C\u5E9F\uFF1B\u9501\u4F4F\u7684\u4E0D\u52A8\u3002 */\nexport const latchCancel = (l: Latch): Latch => (l.mode === \"once\" ? { ...LATCH_OFF, at: l.at, held: l.held } : l);\nexport const latchOn = (l: Latch): boolean => l.mode !== \"off\";\n", "// pitch.ts \u2014\u2014 \u5E26\u62FC\u5199\u7684\u7EDD\u5BF9\u97F3\u9AD8\uFF08\u540C MusicXML\uFF1Astep + alter + octave\uFF09\u4E0E\u8C03\u53F7\u6362\u7B97\u3002created 2026-10-06 by Claude Opus 5.5\n// grill \u8D26\u672C \u00A77\u2013\u00A78\uFF1A\u6570\u636E\u5B58\u300C\u4E0D\u9700\u8981\u89E3\u91CA\u7684\u4E1C\u897F\u300D= \u5E26\u62FC\u5199\u7684\u7EDD\u5BF9\u97F3\u9AD8 + \u8C03\u53F7\uFF1B\u300C\u7B2C\u51E0\u7EA7\u300D\u662F\u89E3\u8BFB\uFF0C\u5F52\u8F93\u5165 / \u663E\u793A\u5C42\u4ECE\u8C03\u53F7\u63A8\u3002\n// \u8F93\u5165\u89C4\u5219\uFF08\u8D26\u672C Q5 / \u65B9\u5411\u8BED\u4E49\uFF09\uFF1A\u4E0D\u6309\u4FEE\u9970\u952E = \u5C31\u8FD1\uFF08\u79BB\u4E0A\u4E00\u4E2A\u97F3\u6700\u8FD1\u3001\u4E0D\u8D85\u8FC7\u56DB\u5EA6\uFF0C\u6309\u4E94\u7EBF\u8C31\u7684\u7EA7\u6570\u7B97\uFF09\uFF1B\n// \u5F80\u4E0A = \u4ECE\u4E0A\u4E00\u4E2A\u97F3\u51FA\u53D1\u5F80\u4E0A\u7B2C\u4E00\u4E2A\u8FD9\u4E2A\u97F3\uFF1B\u5F80\u4E0B = \u5F80\u4E0B\u7B2C\u4E00\u4E2A\u3002\u7B2C\u4E00\u4E2A\u97F3\u4EE5\u5979\u7684\u300C\u5BB6\u300D\u4E3A\u53C2\u7167\u3002\n\nexport const STEPS = [\"C\", \"D\", \"E\", \"F\", \"G\", \"A\", \"B\"] as const;\nexport type Step = (typeof STEPS)[number];\nconst STEP_SEMI = [0, 2, 4, 5, 7, 9, 11];\n\n/** \u5E26\u62FC\u5199\u7684\u7EDD\u5BF9\u97F3\u9AD8\u3002alter\uFF1A-2..2\uFF08\u91CD\u964D..\u91CD\u5347\uFF09\uFF1Boctave\uFF1A\u79D1\u5B66\u97F3\u9AD8\u8BB0\u53F7\uFF08\u4E2D\u592E C = C4\uFF09\u3002 */\nexport interface Pitch { step: Step; alter: number; octave: number }\n\nexport type Dir = \"near\" | \"up\" | \"down\";\n\n/** \u6708\u8BFB\u8BF4\u8BDD\u97F3\u9AD8\u4E2D\u4F4D \u2248 295 Hz \u2248 D4\uFF08Lab \u5B9E\u6D4B\uFF0CREADME\u300C\u6708\u8BFB\u8BF4\u8BDD\u7684\u97F3\u9AD8\u300D\uFF09\u2014\u2014\u6CA1\u6709\u4E0A\u4E00\u4E2A\u97F3\u65F6\u7684\u53C2\u7167\u3002 */\nexport const HOME: Pitch = { step: \"D\", alter: 0, octave: 4 };\n\nexport const stepIndex = (s: Step): number => STEPS.indexOf(s);\n\n/** MIDI \u53F7\uFF08\u4E2D\u592E C = 60\uFF09\u3002 */\nexport function midiOf(p: Pitch): number { return (p.octave + 1) * 12 + STEP_SEMI[stepIndex(p.step)] + p.alter; }\n\n/** \u4E94\u7EBF\u8C31\u4E0A\u7684\u4F4D\u7F6E\uFF08\u6BCF\u7EA7 +1\uFF0CC4 = 28\uFF09\uFF1A\u6BD4\u8F83\u300C\u5C31\u8FD1\u300D\u548C\u753B\u8C31\u90FD\u7528\u5B83\u3002 */\nexport function diatonicIndex(p: Pitch): number { return p.octave * 7 + stepIndex(p.step); }\n\nconst SHARP_ORDER: Step[] = [\"F\", \"C\", \"G\", \"D\", \"A\", \"E\", \"B\"];\nconst FLAT_ORDER: Step[] = [\"B\", \"E\", \"A\", \"D\", \"G\", \"C\", \"F\"];\n\n/** \u8C03\u53F7\uFF08fifths\uFF1A-7..7\uFF0C\u540C MusicXML <key><fifths>\uFF09\u7ED9\u8FD9\u4E2A\u97F3\u7EA7\u7684\u9ED8\u8BA4\u5347\u964D\u3002 */\nexport function keyAlter(step: Step, fifths: number): number {\n  if (fifths > 0) return SHARP_ORDER.slice(0, fifths).includes(step) ? 1 : 0;\n  if (fifths < 0) return FLAT_ORDER.slice(0, -fifths).includes(step) ? -1 : 0;\n  return 0;\n}\n\n/** \u8C03\u53F7\u91CC\u300C1\u300D\u7684\u97F3\u7EA7\uFF08\u5927\u8C03\u4E3B\u97F3\uFF1B\u5C0F\u8C03\u4E3B\u97F3\u662F 6\uFF0C\u8D26\u672C \u00A77\u300C6 \u5F53\u4E3B\u97F3\u300D\uFF09\u3002\u6BCF\u5347\u4E00\u4E2A\u4E94\u5EA6\u5F80\u4E0A\u8D70 4 \u7EA7\u3002 */\nexport function tonicStepIndex(fifths: number): number { return (((4 * fifths) % 7) + 7) % 7; }\n\n/** \u4ECE\u4E94\u7EBF\u8C31\u4F4D\u7F6E + \u8C03\u53F7\u9020\u4E00\u4E2A\u97F3\uFF08\u5347\u964D\u7167\u8C03\u53F7\uFF09\u3002 */\nexport function fromDiatonic(d: number, fifths: number): Pitch {\n  const octave = Math.floor(d / 7), step = STEPS[((d % 7) + 7) % 7];\n  return { step, alter: keyAlter(step, fifths), octave };\n}\n\n/** \u8C03\u91CC\u7B2C\u51E0\u7EA7\uFF081\u20137\uFF09\u2192 \u4E94\u7EBF\u8C31\u4E0A\u7684\u97F3\u7EA7\u4E0B\u6807\u3002 */\nexport function degreeStepIndex(degree: number, fifths: number): number { return (tonicStepIndex(fifths) + degree - 1) % 7; }\n\n/** \u628A\u300C\u7B2C\u51E0\u7EA7\u300D\u653E\u5230\u5177\u4F53\u7684\u516B\u5EA6\uFF1A\u5C31\u8FD1 / \u5F80\u4E0A / \u5F80\u4E0B\uFF08\u53C2\u7167 = \u4E0A\u4E00\u4E2A\u6709\u97F3\u9AD8\u7684\u97F3\uFF0C\u6CA1\u6709\u5C31\u662F HOME\uFF09\u3002 */\nexport function placeDegree(degree: number, fifths: number, prev: Pitch | null, dir: Dir): Pitch {\n  const s = degreeStepIndex(degree, fifths);\n  const ref = diatonicIndex(prev ?? HOME);\n  const base = Math.floor(ref / 7) * 7 + s;          // ref \u540C\u4E00\u4E2A\u516B\u5EA6\u91CC\u7684\u8FD9\u4E2A\u97F3\u7EA7\n  const cands = [base - 7, base, base + 7];\n  let d: number;\n  if (dir === \"near\") d = cands.reduce((a, b) => (Math.abs(b - ref) < Math.abs(a - ref) ? b : a));\n  else if (dir === \"up\") d = cands.find((c) => c > ref)!;\n  else d = [...cands].reverse().find((c) => c < ref)!;\n  return fromDiatonic(d, fifths);\n}\n\n/** \u4E0A\u4E0B\u632A\u4E00\u7EA7\uFF08\u2191\u2193\uFF09\uFF1A\u5347\u964D\u56DE\u5230\u8C03\u53F7\u9ED8\u8BA4\u3002 */\nexport function stepBy(p: Pitch, steps: number, fifths: number): Pitch { return fromDiatonic(diatonicIndex(p) + steps, fifths); }\n\n/** \u632A\u534A\u97F3\uFF08Shift+\u2191\u2193\uFF09\uFF1A\u97F3\u7EA7\u4E0D\u52A8\uFF0C\u53EA\u6539\u5347\u964D\uFF0C\u5939\u5728 -2..2\u3002 */\nexport function alterBy(p: Pitch, d: number): Pitch { return { ...p, alter: Math.max(-2, Math.min(2, p.alter + d)) }; }\n\n/** \u6309\u8C03\u62FC\u5199\u4E00\u4E2A MIDI \u97F3\uFF1A\u8C03\u5185\u97F3\u7528\u8C03\u91CC\u7684\u62FC\u6CD5\uFF1B\u8C03\u5916\u97F3\u6309\u65B9\u5411\uFF08prefer 1 = \u266F\u3001-1 = \u266D\uFF1B\u9ED8\u8BA4\u5347\u53F7\u8C03\u7528 \u266F\u3001\u964D\u53F7\u8C03\u7528 \u266D\uFF09\u3002 */\nexport function spellMidi(midi: number, fifths: number, prefer: 1 | -1 = fifths < 0 ? -1 : 1): Pitch {\n  const cands: Pitch[] = [];\n  for (const step of STEPS) for (let o = Math.floor(midi / 12) - 2; o <= Math.floor(midi / 12); o++) {\n    const alter = midi - midiOf({ step, alter: 0, octave: o });\n    if (Math.abs(alter) <= 1) cands.push({ step, alter, octave: o });\n  }\n  return cands.find((p) => p.alter === keyAlter(p.step, fifths))   // \u8C03\u5185\u97F3\n    ?? cands.find((p) => p.alter === prefer)                       // \u8C03\u5916\uFF1A\u6309\u65B9\u5411\n    ?? cands.find((p) => p.alter === 0) ?? cands[0];\n}\n/** \u6309\u8C31\u4E0A\u7684\u8C03\u53F7\u7B80\u5316\u62FC\u5199\uFF1A\u8FD9\u4E2A\u97F3\uFF08\u540C\u97F3\u6362\u5199\u540E\uFF09\u5728\u8C03\u53F7\u91CC = \u7528\u8C03\u53F7\u7684\u5199\u6CD5\uFF1B\u4E0D\u5728\u8C03\u91CC = \u7167\u539F\u6837\uFF08\u4EBA\u5199\u7684 \u266F / \u266D \u4E0D\u52A8\uFF09\u3002\n *  \u4F8B\uFF1A\u4E94\u4E2A\u5347\u53F7\u7684\u8C03\u91CC A\u266D = G\u266F\uFF08\u4E0D\u6302\u4E34\u65F6\u8BB0\u53F7\uFF09\uFF1BG\u266E \u4E0D\u5728\u8C03\u91CC = \u8FD8\u662F G\u266E\u3002user 2026-10-08\u300C\u5347\u964D\u53F7\u7684\u6B67\u4E49\u5BFC\u81F4\u7684\u6CA1\u6709\u81EA\u52A8\u7B80\u5316\u600E\u4E48\u529E\u300D\u3002\n *  \u91CD\u5347 / \u91CD\u964D\u4E0D\u52A8\uFF1A\u5355\u4E2A \u266F / \u266D \u591A\u534A\u53EA\u662F\u5728 pad \u4E0A\u591F\u9ED1\u952E\uFF0C\uD834\uDD2A / \uD834\uDD2B \u4E00\u5B9A\u662F\u6709\u610F\u7684\u62FC\u6CD5\uFF08\u5347 G \u5C0F\u8C03\u7684\u5BFC\u97F3 F\uD834\uDD2A\uFF09\u3002 */\nexport function keySpell(p: Pitch, fifths: number): Pitch {\n  if (Math.abs(p.alter) === 2) return p;\n  const k = spellMidi(midiOf(p), fifths);\n  return k.alter === keyAlter(k.step, fifths) && (k.step !== p.step || k.alter !== p.alter) ? k : p;\n}\n/** \u79FB\u51E0\u4E2A\u534A\u97F3\uFF0C\u6309\u8C03\u91CD\u65B0\u62FC\u5199\uFF08Shift+\u2191\u2193\u3001\u79FB\u8C03\u7684\u534A\u97F3 / \u5168\u97F3\uFF09\uFF1A\u5F80\u4E0A\u7528 \u266F\u3001\u5F80\u4E0B\u7528 \u266D\uFF0C\u8C03\u5185\u97F3\u7528\u8C03\u91CC\u7684\u62FC\u6CD5\uFF08C \u5927\u8C03 E \u5347\u534A\u97F3 = F\uFF0C\u4E0D\u662F E\u266F\uFF09\u3002 */\nexport function transposeSemis(p: Pitch, semis: number, fifths: number): Pitch {\n  return semis === 0 ? p : spellMidi(midiOf(p) + semis, fifths, semis > 0 ? 1 : -1);\n}\n/** \u6309\u97F3\u7A0B\u79FB\uFF08\u8F6C\u8C03\u7528\uFF09\uFF1A\u5B57\u6BCD\u8D70 steps \u7EA7\u3001\u97F3\u9AD8\u8D70 semis \u4E2A\u534A\u97F3\u2014\u2014\u62FC\u5199\u5173\u7CFB\u4E0D\u53D8\uFF08F\u266F \u4E0A\u5927\u4E8C\u5EA6 = G\u266F\uFF0C\u4E0D\u662F A\u266D\uFF09\u3002 */\nexport function transposeInterval(p: Pitch, steps: number, semis: number): Pitch {\n  const d = diatonicIndex(p) + steps, step = STEPS[((d % 7) + 7) % 7], octave = Math.floor(d / 7);\n  return { step, alter: midiOf(p) + semis - midiOf({ step, alter: 0, octave }), octave };\n}\n/** \u4ECE\u8C03 f0 \u8F6C\u5230\u8C03 f1\uFF1A\u4E3B\u97F3\u4E4B\u95F4\u7684\u97F3\u7A0B\uFF08\u5C31\u8FD1\u65B9\u5411\uFF0C-6..+6 \u4E2A\u534A\u97F3\uFF09+ \u5B57\u6BCD\u8D70\u51E0\u7EA7\u3002 */\nexport function keyInterval(f0: number, f1: number): { steps: number; semis: number } {\n  let semis = (((7 * (f1 - f0)) % 12) + 12) % 12; if (semis > 6) semis -= 12;\n  let steps = (((tonicStepIndex(f1) - tonicStepIndex(f0)) % 7) + 7) % 7;\n  if (semis < 0 && steps > 0) steps -= 7;\n  return { steps, semis };\n}\n\n/** \u632A\u516B\u5EA6\uFF08Alt+\u2191\u2193\uFF09\u3002 */\nexport function octaveBy(p: Pitch, d: number): Pitch { return { ...p, octave: p.octave + d }; }\n\nexport function pitchName(p: Pitch): string { return `${p.step}${p.alter > 0 ? \"#\".repeat(p.alter) : \"b\".repeat(-p.alter)}${p.octave}`; }\n\nexport const samePitch = (a: Pitch | null, b: Pitch | null): boolean =>\n  !!a && !!b && a.step === b.step && a.alter === b.alter && a.octave === b.octave;\n\n/** \u8C03\u540D\uFF08\u300C1=\u300D\u540E\u9762\u90A3\u4E2A\u5B57\u6BCD\uFF09\uFF1A\u4E94\u5EA6\u6570 \u2192 \u540D\u5B57\uFF08-7 \u2026 7\uFF09\u3002pad\u3001\u8C31\u9762\u3001\u8BB0\u53F7\u7F16\u8F91\u6846\u5171\u7528\u3002 */\nexport const KEY_LABEL: Record<number, string> = { [-7]: \"C\u266D\", [-6]: \"G\u266D\", [-5]: \"D\u266D\", [-4]: \"A\u266D\", [-3]: \"E\u266D\", [-2]: \"B\u266D\", [-1]: \"F\", 0: \"C\", 1: \"G\", 2: \"D\", 3: \"A\", 4: \"E\", 5: \"B\", 6: \"F\u266F\", 7: \"C\u266F\" };\n", "// repeats.ts \u2014\u2014 \u8C31\u5185\u53CD\u590D / \u8DF3\u8F6C\u7684\u5C55\u5F00\uFF08\u653E\u7684\u65F6\u5019\u7528\uFF1B\u7EAF\u51FD\u6570\uFF09\u3002created 2026-10-09 by Claude Opus 5.5\n// user\u300C\u987A\u4FBF\u4E00\u63D0\u8C31\u5185\u7684\u5FAA\u73AF\u548C\u6807\u51C6\u7684dc\u8FD9\u79CD\u662F\u4E0D\u662F\u652F\u6301\u4E0B\u4E5F\u4E0D\u96BE\uFF1F\u8FD9\u4E2A\u53EF\u4EE5\u53C2\u8003\u7A97\u597D\u4E86\u52A0\u3002\u4E0D\u7136\u9047\u5230\u5F31\u8D77\u4EC0\u4E48\u5176\u5B9EAAABBB\u4E0D\u662F\u5F88\u65B9\u4FBF\u300D\n//   \u300C\u5C31\u662F\u666E\u901A\u8BB0\u8C31\u8F6F\u4EF6\u652F\u6301\u7684\u90A3\u79CD\u3002\u8FD9\u6837\uFF0C\u4E0D\u8D85\u8FC7sheet\u8FB9\u754C\u3002\u7B49\u53C2\u8003\u7A97\u597D\u4E86\u5F53\u5C0F\u4E1C\u897F\u52A0\u300D\u300C\u4F60\u5148\u628A\u4E09\u4E2A\u5C0F\u4EF6\u505A\u4E86\u300D\u3002\n// \u89C4\u77E9\uFF1A\n//   \u00B7 \u4E00\u5F20\u7EB8\u81EA\u5DF1\u7684\u4E8B\uFF0C\u4E0D\u8DE8\u7EB8\uFF1B\u7ED3\u6784\u770B\u8FD9\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4F4D\u5728\u573A\u7684\u6B4C\u624B\u90A3\u4E00\u884C\uFF08\u540C\u901F\u5EA6\u8BB0\u53F7\uFF0Csong.ts tempoOwner\uFF09\uFF0C\u522B\u7684\u58F0\u90E8\u6309 tick \u8DDF\u7740\u5207\uFF1B\n//     \u522B\u7684\u884C\u91CC\u5199\u7684\u53CD\u590D / \u8DF3\u8F6C\u4E0D\u8D77\u4F5C\u7528\uFF08\u8C31\u4E0A\u753B\u7070\u3001\u70B9\u5F00\u8BF4\u4E3A\u4EC0\u4E48\u2014\u2014\u7EAA\u5F8B\u300C\u505A\u4E0D\u5230\u7684\u4E00\u5F8B\u753B\u7070 + \u660E\u8BF4\u300D\uFF09\u3002\n//   \u00B7 \u7167\u666E\u901A\u8BB0\u8C31\u8F6F\u4EF6\u7684\u8BFB\u6CD5\uFF1A|: \u2026 :| \u53CD\u590D\uFF08:| \u53EF\u4EE5\u5199\u4E00\u5171\u653E\u51E0\u904D\uFF09\uFF1B\u623F\u5B50\uFF081. 2.\uFF09\u7B2C\u51E0\u904D\u8D70\u54EA\u4E2A\uFF1BD.C. / D.S. \u8DF3\u56DE\u5F00\u5934 / Segno\uFF0C\n//     al Fine = \u8DF3\u56DE\u6765\u4E4B\u540E\u5728 Fine \u505C\uFF0Cal Coda = \u8DF3\u56DE\u6765\u4E4B\u540E\u5728 To Coda \u53BB Coda\uFF1B**\u8DF3\u56DE\u6765\u4E4B\u540E\u53CD\u590D\u4E0D\u518D\u53CD\u590D**\uFF08MuseScore \u7B49\u7684\u9ED8\u8BA4\uFF09\uFF1BD.C. / D.S. \u53EA\u8DF3\u4E00\u6B21\u3002\n//   \u00B7 \u5C55\u5F00 = \u6309\u6BB5\uFF08tick \u533A\u95F4\uFF09\u5207\u6BCF\u4E00\u6761 track \u518D\u63A5\u8D77\u6765\uFF1A\u6BB5\u91CC\u7684\u97F3\u7167\u6284\uFF08\u7B2C\u4E8C\u6B21\u8D77\u6362\u8D1F id\uFF0C\u540C\u7F16\u6392\u91CD\u590D\u7684\u7EB8\uFF09\uFF1B\u8DF3\u8FC7\u53BB\u7684\u5730\u65B9\u8865\u4E0A\u90A3\u4E00\u523B\u751F\u6548\u7684\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6 / \u529B\u5EA6 / \u98CE\u683C\uFF1B\n//     \u6BB5\u5C3E\u622A\u9F50\u3001\u6BB5\u91CC\u77ED\u4E86\u8865\u4F11\u6B62\uFF08\u6240\u6709\u58F0\u90E8\u4E00\u6837\u957F\uFF09\uFF1B\u53CD\u590D\u5C0F\u8282\u7EBF\u53D8\u56DE\u666E\u901A\u5C0F\u8282\u7EBF\uFF0C\u623F\u5B50 / \u8DF3\u8F6C\u8BB0\u53F7\u62FF\u6389\uFF08\u5C55\u5F00\u5B8C\u5C31\u7528\u6389\u4E86\uFF09\u3002\nimport { type Token, type PaperSeg, type Song, type NavTok, type BarTok, type NavWhat, isTimed, tempoOwner, paperTicks } from \"./song.ts\";\n\nexport interface Seg { t0: number; t1: number }\ntype Ev = { i: number; tick: number; k: \"start\" | \"end\" | \"nav\"; times?: number; what?: NavWhat; nums?: number[] };\n\n/** \u6BCF\u4E2A token \u524D\u9762\u7684 tick\uFF08\u97F3 / \u4F11\u6B62 = \u8D77\u70B9\uFF1B\u8BB0\u53F7 = \u5B83\u6240\u5728\u7684\u4F4D\u7F6E\uFF09\u3002 */\nexport function tickOf(tokens: readonly Token[]): number[] {\n  const out: number[] = []; let t = 0;\n  for (const x of tokens) { out.push(t); if (isTimed(x)) t += x.dur; }\n  return out;\n}\n/** \u8FD9\u6761 track \u4E0A\u6709\u6CA1\u6709\u53CD\u590D / \u8DF3\u8F6C\u3002 */\nexport const hasRepeats = (tokens: readonly Token[]): boolean => tokens.some((t) => t.kind === \"nav\" || (t.kind === \"bar\" && !!t.repeat));\n\n/** \u4E00\u6761 track \u7684\u53CD\u590D\u7ED3\u6784 \u2192 \u653E\u7684\u987A\u5E8F\uFF08tick \u6BB5\uFF0C[t0, t1)\uFF09\u3002\u6CA1\u6709\u53CD\u590D / \u8DF3\u8F6C = null\uFF08\u7167\u539F\u6837\u653E\uFF09\u3002len = \u8FD9\u5F20\u7EB8\u7684\u957F\u5EA6\u3002 */\nexport function playSegments(tokens: readonly Token[], len: number): Seg[] | null {\n  if (!hasRepeats(tokens)) return null;\n  const ticks = tickOf(tokens), ev: Ev[] = [];\n  tokens.forEach((t, i) => {\n    if (t.kind === \"bar\" && t.repeat) {\n      if (t.repeat === \"end\" || t.repeat === \"both\") ev.push({ i, tick: ticks[i], k: \"end\", times: Math.max(2, t.times ?? 2) });\n      if (t.repeat === \"start\" || t.repeat === \"both\") ev.push({ i, tick: ticks[i], k: \"start\" });\n    } else if (t.kind === \"nav\") ev.push({ i, tick: ticks[i], k: \"nav\", what: t.what, nums: t.nums ?? [1] });\n  });\n  const segs: Seg[] = [];\n  const emit = (a: number, b: number) => { if (b > a) segs.push({ t0: a, t1: Math.min(b, len) }); };\n  const find = (pred: (e: Ev) => boolean, from = 0) => { for (let k = from; k < ev.length; k++) if (pred(ev[k])) return k; return -1; };\n  const segno = find((e) => e.k === \"nav\" && e.what === \"segno\");\n  // secStart / secP = \u8FD9\u4E00\u6BB5\u53CD\u590D\u4ECE\u54EA\u513F\u8D77\uFF08tick / \u8DF3\u56DE\u53BB\u4ECE\u54EA\u4E2A\u4E8B\u4EF6\u63A5\u7740\u8BFB\uFF09\uFF1A\u6700\u8FD1\u7684 |:\uFF0C\u6CA1\u6709 = \u7EB8\u5934\u6216\u4E0A\u4E00\u4E2A\u653E\u5B8C\u4E86\u7684 :| \u540E\u9762\uFF1Blanded = \u521A\u8DF3\u56DE\u5230\u7684\u90A3\u4E2A |:\uFF08\u904D\u6570\u4E0D\u91CD\u6765\uFF09\n  let p = 0, segStart = 0, secStart = 0, secP = 0, pass = 1, jumped = false, mode: \"fine\" | \"coda\" | null = null, landed = -1, guard = 0;\n  const count = new Map<number, number>();   // \u6BCF\u4E2A :|\uFF08ev \u4E0B\u6807\uFF09\u5DF2\u7ECF\u8DF3\u56DE\u53BB\u51E0\u6B21\n  while (p < ev.length && guard++ < 512 && segs.length < 256) {\n    const e = ev[p];\n    if (e.k === \"start\") {\n      if (p !== landed) { secStart = e.tick; secP = p; pass = 1; }   // \u8DF3\u56DE\u5230\u8FD9\u513F = \u8FD8\u662F\u8FD9\u4E00\u6BB5\uFF0C\u904D\u6570\u4E0D\u91CD\u6765\n      p++; continue;\n    }\n    if (e.k === \"end\") {\n      const n = count.get(p) ?? 0;\n      if (!jumped && n < (e.times ?? 2) - 1) {\n        count.set(p, n + 1); emit(segStart, e.tick); segStart = secStart; pass++;\n        p = secP; landed = ev[secP]?.k === \"start\" && ev[secP].tick === secStart ? secP : -1; continue;\n      }\n      secStart = e.tick; secP = p + 1; pass = 1; p++; continue;   // \u653E\u591F\u4E86\uFF1A\u5F80\u540E\u8D70\uFF0C\u540E\u9762\u662F\u65B0\u7684\u4E00\u6BB5\uFF08\u518D\u9047\u5230\u6CA1\u6709 |: \u7684 :| = \u4ECE\u8FD9\u513F\u91CD\u6765\uFF09\n    }\n    const w = e.what!;\n    if (w === \"ending\") {\n      if ((e.nums ?? [1]).includes(pass)) { p++; continue; }\n      // \u8FD9\u4E00\u904D\u4E0D\u8D70\u8FD9\u4E2A\u623F\u5B50\uFF1A\u8DF3\u5230\u5B83\u7684\u5C3D\u5934\u2014\u2014\u4E0B\u4E00\u4E2A :|\uFF08\u90A3\u6761 :| \u4E0D\u7B97\uFF09/ \u4E0B\u4E00\u4E2A\u623F\u5B50 / \u4E0B\u4E00\u6761\u5C0F\u8282\u7EBF / \u7EB8\u5C3E\n      const close = find((x) => x.k === \"end\" || x.k === \"start\" || (x.k === \"nav\" && x.what === \"ending\"), p + 1);   // \u65B0\u7684 |: = \u8FD9\u4E2A\u623F\u5B50\u5230\u6B64\u4E3A\u6B62\n      let to: number, np: number;\n      if (close >= 0) { to = ev[close].tick; np = ev[close].k === \"end\" ? close + 1 : close; }\n      else { const bi = tokens.findIndex((t, i) => i > e.i && t.kind === \"bar\"); to = bi >= 0 ? ticks[bi] : len; np = find((x) => x.tick >= to, p + 1); if (np < 0) np = ev.length; }\n      emit(segStart, e.tick); segStart = to; p = np; continue;\n    }\n    if ((w === \"dc\" || w === \"dcFine\" || w === \"dcCoda\" || w === \"ds\" || w === \"dsFine\" || w === \"dsCoda\") && !jumped) {\n      const toSegno = w.startsWith(\"ds\");\n      if (toSegno && segno < 0) { p++; continue; }   // \u6CA1\u6709 Segno \u8DF3\u4E0D\u4E86\uFF08\u8C31\u4E0A\u753B\u7070\u8BF4\u4E3A\u4EC0\u4E48\uFF09\n      emit(segStart, e.tick); jumped = true; mode = w.endsWith(\"Fine\") ? \"fine\" : w.endsWith(\"Coda\") ? \"coda\" : null;\n      p = toSegno ? segno : 0; segStart = toSegno ? ev[segno].tick : 0; secStart = segStart; secP = p; pass = 1; landed = -1; continue;\n    }\n    if (w === \"fine\" && jumped && mode === \"fine\") { emit(segStart, e.tick); return segs; }\n    if (w === \"toCoda\" && jumped && mode === \"coda\") {\n      let c = find((x) => x.k === \"nav\" && x.what === \"coda\", p + 1); if (c < 0) c = find((x) => x.k === \"nav\" && x.what === \"coda\");\n      if (c >= 0) { emit(segStart, e.tick); segStart = ev[c].tick; p = c + 1; mode = null; continue; }\n    }\n    p++;\n  }\n  emit(segStart, len);\n  return segs;\n}\n\nconst STATE_KINDS = new Set([\"key\", \"time\", \"tempo\", \"dyn\", \"groove\", \"clef\", \"ottava\"]);   // \u8C31\u53F7 / \u516B\u5EA6\u7EBF\uFF08v0.9.28\uFF09\uFF1A\u8DF3\u8FC7\u53BB\u4E5F\u8981\u63A5\u4E0A\u90A3\u4E00\u523B\u7684\u753B\u6CD5\n/** \u4E00\u6761 track \u6309\u6BB5\u5207\u5F00\u518D\u63A5\u8D77\u6765\uFF08\u89C1\u6587\u4EF6\u5934\uFF09\u3002newId = \u6284\u51FA\u6765\u7684\u7ED9\u8D1F id\u3002 */\nexport function sliceBySegments(tokens: readonly Token[], segs: readonly Seg[], newId: () => number): Token[] {\n  const ticks = tickOf(tokens), out: Token[] = [], used = new Set<number>();\n  const copy = <T extends Token>(t: T): T => { if (used.has(t.id)) return { ...t, id: newId() }; used.add(t.id); return t; };\n  const total = tokens.reduce((a, t) => a + (isTimed(t) ? t.dur : 0), 0);\n  let prevEnd = 0;\n  segs.forEach((s, k) => {\n    let cur = s.t0, first = true;\n    const jump = k > 0 && s.t0 !== prevEnd;\n    if (jump) {   // \u8DF3\u8FC7\u6765\u7684\uFF1A\u8865\u4E0A t0 \u8FD9\u4E00\u523B\u751F\u6548\u7684\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6 / \u529B\u5EA6 / \u98CE\u683C\uFF08\u5404\u53D6 t0 \u4E4B\u524D\u6700\u540E\u4E00\u4E2A\uFF09\n      const last = new Map<string, Token>();\n      tokens.forEach((t, i) => { if (STATE_KINDS.has(t.kind) && ticks[i] < s.t0) last.set(t.kind, t); });\n      for (const kind of [\"key\", \"time\", \"tempo\", \"groove\", \"dyn\", \"clef\", \"ottava\"]) { const t = last.get(kind); if (t) out.push({ ...t, id: newId() }); }\n    }\n    tokens.forEach((t, i) => {\n      const at = ticks[i];\n      if (t.kind === \"nav\") return;   // \u623F\u5B50 / \u8DF3\u8F6C\uFF1A\u5C55\u5F00\u5B8C\u5C31\u7528\u6389\u4E86\n      if (t.kind === \"bar\") {   // \u5C0F\u8282\u7EBF\uFF1A\u6BB5\u5C3E\u90A3\u6761\u7559\u7740\uFF08\u5C0F\u8282\u4ECE\u90A3\u513F\u91CD\u65B0\u6570\uFF09\uFF1B\u6BB5\u5934\u7684\u2014\u2014\u8DF3\u8FC7\u6765\u7684 / \u539F\u6765\u662F\u53CD\u590D\u8BB0\u53F7\u7684\u2014\u2014\u4E0D\u8981\uFF08\u4E0A\u4E00\u6BB5\u7ED3\u5C3E\u5DF2\u7ECF\u6709\u4E00\u6761\uFF1B\u7EB8\u5934\u7684 |: \u4E0D\u5360\u5C0F\u8282\uFF09\n        if (at < s.t0 || at > s.t1 || (at === s.t0 && (k > 0 || !!t.repeat))) return;\n        const b = copy(t as BarTok); const { repeat: _r, times: _t, ...plain } = b; out.push(plain); return;\n      }\n      const inside = at >= s.t0 && (at < s.t1 || (k === segs.length - 1 && s.t1 >= total && at === s.t1 && !isTimed(t)));   // \u7EB8\u5C3E\u90A3\u4E00\u523B\u7684\u8BB0\u53F7\u53EA\u5F52\u6700\u540E\u4E00\u6BB5\n      if (!inside) return;\n      if (!isTimed(t)) { out.push(copy(t)); return; }\n      if (at > cur) out.push({ kind: \"rest\", id: newId(), dur: at - cur });\n      let x = copy(t); const room = s.t1 - at;\n      if (x.dur > room) x = { ...x, dur: room };   // \u6BB5\u5C3E\u622A\u9F50\uFF08\u53CD\u590D\u8BB0\u5728\u5C0F\u8282\u7EBF\u4E0A\uFF0C\u6B63\u5E38\u4E0D\u4F1A\u622A\u5230\uFF09\n      if (first && jump && x.kind === \"note\" && x.tie) { const { tie: _t, ...rest } = x; x = rest as typeof x; }   // \u8DF3\u8FC7\u6765\u7684\u7B2C\u4E00\u4E2A\u97F3\u4E0D\u63A5\u524D\u9762\u7684\u8FDE\u97F3\u7EBF\n      out.push(x); cur = at + x.dur; first = false;\n    });\n    if (s.t1 > cur) out.push({ kind: \"rest\", id: newId(), dur: s.t1 - cur });\n    prevEnd = s.t1;\n  });\n  return out;\n}\n\n/** \u4E00\u5F20\u7EB8\u6309\u53CD\u590D\u7ED3\u6784\u5C55\u5F00\uFF08\u653E / \u538B\u5E73\u4EF6\u7528\uFF09\uFF1A\u7ED3\u6784\u770B\u6700\u4E0A\u9762\u90A3\u4F4D\u5728\u573A\u7684\u6B4C\u624B\uFF1B\u6CA1\u6709\u53CD\u590D = \u539F\u6837\u8FD4\u56DE\u3002 */\nexport function expandPaper(song: Song, paper: PaperSeg, newId: () => number): PaperSeg {\n  const owner = tempoOwner(song, paper); if (!owner) return paper;\n  const segs = playSegments(paper.tracks[owner], paperTicks(paper));\n  if (!segs) {   // \u4E3B\u4EBA\u90A3\u4E00\u884C\u6CA1\u6709\u7ED3\u6784\uFF1A\u522B\u7684\u884C\u91CC\u7684\u53CD\u590D\u8BB0\u53F7\u4E5F\u4E0D\u8D77\u4F5C\u7528\uFF0C\u4F46\u8981\u62FF\u6389\uFF08\u538B\u5E73\u4EF6\u91CC\u522B\u753B\u6210\u53CD\u590D\uFF09\n    if (!Object.values(paper.tracks).some(hasRepeats)) return paper;\n    return { ...paper, tracks: Object.fromEntries(Object.entries(paper.tracks).map(([k, t]) => [k, t.filter((x) => x.kind !== \"nav\").map((x) => (x.kind === \"bar\" && x.repeat ? { kind: \"bar\" as const, id: x.id } : x))])) };\n  }\n  return { ...paper, tracks: Object.fromEntries(Object.entries(paper.tracks).map(([k, t]) => [k, sliceBySegments(t, segs, newId)])) };\n}\n/** \u8C31\u4E0A\u753B\u7070\u7528\uFF1A\u8FD9\u4E00\u884C\u7684\u53CD\u590D / \u8DF3\u8F6C\u8BB0\u53F7\u8D77\u4E0D\u8D77\u4F5C\u7528\uFF1B\u4E0D\u8D77 = \u4E3A\u4EC0\u4E48\u3002 */\nexport function navWhy(song: Song, paper: PaperSeg, partId: string, t: Token): string | null {\n  if (!(t.kind === \"nav\" || (t.kind === \"bar\" && t.repeat))) return null;\n  const owner = tempoOwner(song, paper);\n  if (owner && owner !== partId) return \"\u53CD\u590D / \u8DF3\u8F6C\u53EA\u770B\u8FD9\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4F4D\u6B4C\u624B\u90A3\u4E00\u884C\";\n  if (t.kind === \"nav\" && (t.what === \"ds\" || t.what === \"dsFine\" || t.what === \"dsCoda\") && !paper.tracks[partId]?.some((x) => x.kind === \"nav\" && x.what === \"segno\")) return \"\u8FD9\u5F20\u7EB8\u4E0A\u6CA1\u6709 Segno\uFF0CD.S. \u8DF3\u4E0D\u4E86\";\n  if (t.kind === \"nav\" && (t.what === \"dcCoda\" || t.what === \"dsCoda\") && !paper.tracks[partId]?.some((x) => x.kind === \"nav\" && x.what === \"toCoda\")) return \"\u6CA1\u6709 To Coda\uFF1A\u8DF3\u56DE\u6765\u4E4B\u540E\u4E00\u8DEF\u653E\u5230\u7EB8\u5C3E\";\n  return null;\n}\nexport type { NavTok };\n", "// song.ts \u2014\u2014 \u4E00\u9996\u6B4C = \u4E00\u4E32 token\uFF08\u97F3\u7B26 / \u4F11\u6B62 / \u5C0F\u8282\u7EBF / \u8BB0\u53F7\uFF1A\u8C03\u53F7 \u00B7 \u62CD\u53F7 \u00B7 \u901F\u5EA6\uFF09\u3002created 2026-10-06 by Claude Opus 5.5\n// 2026-10-07 UX-2 \u91CD\u5199\uFF08grill \u8D26\u672C \u00A79\u00BE\uFF0Cuser \u539F\u8BDD\u89C1\u8D26\u672C\uFF09\uFF1A\n//   \u00B7 \u6570\u636E\u53EA\u5B58\u65F6\u957F + tie\uFF08\u300C\u8FDE\u7740\u524D\u4E00\u4E2A\u97F3\u300D\uFF09+ hyph\uFF08\u300C\u8FD9\u4E2A\u8BCD\u63A5\u5230\u4E0B\u4E00\u4E2A\u97F3\u300D\uFF09\u2014\u2014\u5355\u4F4D\u3001\u4EFD\u6570\u4E0D\u8FDB\u6570\u636E\uFF08user\u300C\u4E0D\u8981hidden landmine\uFF0C\u6240\u4EE5\u4F60\u8BF4\u7684\u4EFD\u6570\u53EF\u80FD\u5C31\u662F\u7F16\u8F91\u7684\u7ACB\u5373\u5B58\u7684\uFF0C\u800C\u4E0D\u662F\u97F3\u7684\u5C5E\u6027\uFF1F\u300D\uFF09\uFF1B\n//   \u00B7 \u65F6\u95F4\u7CBE\u5EA6 = \u6BCF\u56DB\u5206 1680 \u683C\uFF082\u2074\u00B73\u00B75\u00B77\uFF1A\u4E09\u5341\u4E8C\u5206\u3001\u4E09 / \u4E94 / \u4E03\u8FDE\u97F3\u90FD\u662F\u6574\u6570\uFF1Buser\u300C\u6240\u4EE5\u4F60\u662F\u60F3\u79BB\u6563\u65F6\u95F4\u7CBE\u5EA6\u2026\u90A3\u4E48\u53EF\u4EE5\u554A\u300D\uFF09\uFF1B\n//   \u00B7 \u8C03\u53F7\u53D8\u5316\u662F token\uFF0C\u548C\u5C0F\u8282\u7EBF\u4E00\u6837\uFF08user\u300C\u663E\u793A\u7684\u8C03\u53F7\u8FB9\u754C\u80FD\u4E0D\u80FD\u4E5F\u662F\u4E00\u4E2A\u8BB0\u8C31\u7684token\uFF0C\u548C\u5C0F\u8282\u7EBF\u4E00\u6837\u300D\uFF09\uFF1B\n//   \u00B7 \u9009\u4E2D = \u6539\uFF0C\u5149\u6807 = \u5199\uFF08user\u300C\u667A\u80FD\u8BC6\u522B\uFF0C\u9009\u4E2D\u97F3\u7B26\u5C31\u662F\u6539\uFF0C\u5149\u6807\u5C31\u662F\u5199 \u5BF9\u300D\uFF09\uFF1A\u6709\u9009\u4E2D\u5C31\u4F5C\u7528\u5728\u9009\u4E2D\u4E0A\uFF0C\u6CA1\u9009\u4E2D\u5C31\u4F5C\u7528\u5728\u4E0B\u4E00\u4E2A\u8981\u5199\u7684\u97F3\u4E0A\uFF1B\n//   \u00B7 \u5199\u7684\u65F6\u5019\uFF1A\u957F\u77ED = \u8F93\u5165\u72B6\u6001\uFF08\u4E09\u5341\u4E8C\u5206\u2026\u5168\u97F3\u7B26\u516D\u6863\uFF0C\u9ED8\u8BA4\u516B\u5206\uFF09\uFF0C\u300C\u2212\u300D\u628A\u521A\u5199\u7684\u97F3\u52A0\u4E00\u4EFD\u5B83\u5199\u5165\u65F6\u7684\u5355\u4F4D\u3001\u8DE8\u5C0F\u8282\u7EBF\u5C31\u65B0\u5F00\u4E00\u4E2A tie \u7740\u7684\u97F3\uFF0C\n//     \u9000\u683C\u64A4\u56DE\u300C\u672C\u6B21\u8F93\u5165\u8BB0\u5F55\u300D\u7684\u6700\u540E\u4E00\u7B14\uFF1B\u8BB0\u5F55\u5728\u79BB\u5F00\u5199\uFF08\u9009\u4E2D\u3001\u632A\u5149\u6807\uFF09\u65F6\u6E05\u7A7A\u2014\u2014\u5199\u5B57\u5934\u5728\uFF0C\u8BB0\u5F55\u5C31\u5728\u3002\n// 2026-10-07\uFF1A\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\u5168\u662F token\uFF0C\u6CA1\u6709\u5168\u5C40\u8BBE\u7F6E\uFF08user\u300C\u8C31\u5B50\u7684\u8C03\u53F7\u5E94\u8BE5\u4E5F\u662F\u4E00\u4E2A\u6309\u4E86\u53EF\u4EE5\u4E0B\u62C9\u7684\u6587\u672C\u6846\u3002\u4E0D\u662F\u5168\u5C40\u7684\uFF0Cbpm\u4E5F\u662F\uFF0C\u90FD\u662Ftoken\u300D\u300C\u8FD9\u4E48\u8BF4\u62CD\u53F7\u4E5F\u662F\u300D\uFF09\u3002\n//   \u4E00\u9996\u6B4C\u5F00\u5934\u56FA\u5B9A\u4E09\u4E2A\u8BB0\u53F7\uFF08\u8C31\u5934\uFF09\uFF1A\u5149\u6807\u8FDB\u4E0D\u53BB\u3001\u5220\u4E0D\u6389\uFF0C\u53EA\u80FD\u5C31\u5730\u6539\uFF1B\u4E2D\u9014\u53EF\u4EE5\u63D2\uFF0C\u63D2\u7684\u5730\u65B9\u65C1\u8FB9\u5DF2\u6709\u540C\u7C7B\u8BB0\u53F7\u5C31\u6539\u5B83\u800C\u4E0D\u662F\u518D\u63D2\u4E00\u4E2A\u3002\n// \u7F16\u8F91\u5668\u72B6\u6001\u662F\u7EAF\u6570\u636E\uFF0C\u6240\u6709\u547D\u4EE4\u662F\u7EAF\u51FD\u6570\uFF1A\u65E7\u72B6\u6001 \u2192 \u65B0\u72B6\u6001\u3002\n// 2026-10-08 \u591A\u58F0\u90E8\u591A\u7EB8\uFF080.5.0\uFF1Buser\u300C\u9996\u5148\u5C31\u662F\u4E0D\u540C\u7684\u58F0\u90E8\u89C6\u56FE\u548C\u51FA\u58F0\u5E94\u8BE5\u5206\u522B\u53EF\u4EE5solo\u548Chide\u300D\u300C\u603B\u8C31\u5F0F\u4E0A\u4E0B\u53E0\u300D\u300C\u6211\u4EE5\u4E3A\u7EB8\u5C31\u662F\u66F2\u6BB5\u300D\uFF09\uFF1A\n//   \u00B7 \u4E00\u9996\u6B4C = \u6309\u987A\u5E8F\u7684\u51E0\u5F20\u7EB8\uFF08\u7EB8 = \u66F2\u6BB5\uFF09\u00D7 \u6B4C\u7EA7\u7684\u58F0\u90E8\u5E76\u96C6\uFF1B\u6BCF\u5F20\u7EB8\u4E0A\u6BCF\u4E2A\u58F0\u90E8\u4E00\u4E32 token\uFF08\u5F00\u5934\u4E09\u4E2A\u8C31\u5934\u8BB0\u53F7\u7167\u65E7\uFF09\uFF1B\u67D0\u5F20\u7EB8\u6CA1\u67D0\u58F0\u90E8 = \u6CA1\u90A3\u4E32\u3002\n//   \u00B7 \u7F16\u8F91\u5668\u7684\u5149\u6807 / \u9009\u4E2D\u843D\u5728**\u4E00\u6761 track**\uFF08\u54EA\u5F20\u7EB8 \u00D7 \u54EA\u4E2A\u58F0\u90E8 = EditorState.at\uFF09\uFF1B\u6240\u6709\u5199 / \u6539\u547D\u4EE4\u53EA\u78B0\u90A3\u4E00\u6761\uFF08tr(st) \u53D6\u3001withTrack \u5199\u56DE\uFF09\u3002\n//   \u00B7 \u7EB8\u5185\u5404\u58F0\u90E8\u6309 tick \u5BF9\u9F50\uFF08\u4ECE\u7EB8\u7684\u5F00\u5934\u6570\uFF1B\u4E0D\u6309\u5C0F\u8282\u7EBF\u5BF9\u9F50\u2014\u2014\u5C0F\u8282\u7EBF\u53EA\u662F\u5404\u81EA\u7684\u8BB0\u8C31\uFF09\uFF1B\u7EB8\u754C = \u786C\u5BF9\u9F50\u70B9\uFF08\u77ED\u7684\u8865\u4F11\u6B62\u5230\u6700\u957F\u7684\u90A3\u6761\uFF0C\u5951\u7EA6 \u00A76\u00BE\uFF09\u3002\n//   \u00B7 \u901F\u5EA6 = \u7B2C\u4E00\u4E2A\u58F0\u90E8\u7684\u72B6\u6001\u673A\uFF08\u5176\u4F59\u58F0\u90E8\u7684\u901F\u5EA6\u8BB0\u53F7\u53EA\u662F\u8DDF\u7740\u6284\u3001\u4E0D\u51FA\u58F0\u4E0D\u753B\uFF09\u3002\n\nimport { type Paper, type PaperKind, type Density, DEFAULT_PAPER, paperOf, densityOf } from \"./paper.ts\";\nimport { latchDown, latchWrite, LATCH_OFF } from \"../keyboard/latch.ts\";   // \u5347\u964D Shift \u7684\u90A3\u6761\u89C4\u5219\u548C /2\u3001\u6E10\u5230\u540C\u4E00\u4EFD\uFF08\u7F16\u8F91\u72B6\u6001\u673A\u7B2C 2 \u671F\uFF0C2026-10-15\uFF09\nimport { type Dir, type Pitch, HOME, placeDegree, stepBy, alterBy, octaveBy, transposeSemis, transposeInterval, keyInterval, midiOf, keySpell, keyAlter } from \"./pitch.ts\";\nimport { expandPaper } from \"./repeats.ts\";   // \u8C31\u5185\u53CD\u590D\uFF08\u5FAA\u73AF import\uFF1Arepeats.ts \u53EA\u5728\u51FD\u6570\u91CC\u7528 song.ts \u7684\u4E1C\u897F\uFF0C\u52A0\u8F7D\u987A\u5E8F\u65E0\u6240\u8C13\uFF09\n\n/** \u4E00\u4E2A\u56DB\u5206\u97F3\u7B26\u7684 tick \u6570\u3002 */\nexport const TPQ = 1680;\n/** \u7B2C\u4E00\u7248\u62CD\u5B50\u5355\u4F4D = \u56DB\u5206\u97F3\u7B26\uFF08x/4 \u62CD\u53F7\uFF09\u3002 */\nexport const BEAT = TPQ;\nexport const WHOLE = TPQ * 4;\n/** \u957F\u77ED\u516D\u6863\uFF08plain \u503C\uFF09\uFF1A\u4E09\u5341\u4E8C\u5206 \u00B7 \u5341\u516D\u5206 \u00B7 \u516B\u5206 \u00B7 \u56DB\u5206 \u00B7 \u4E8C\u5206 \u00B7 \u5168\u97F3\u7B26\uFF08user\u300C\u957F\u7684\u8BDD\u6700\u591A\u5168\u97F3\u7B26\u540C\u610F\uFF0C\u518D\u6709\u9700\u6C42\u7528\u8FDE\u97F3\u300D\uFF09\u3002 */\nexport const LADDER = [TPQ / 8, TPQ / 4, TPQ / 2, TPQ, TPQ * 2, WHOLE] as const;\nexport const DEFAULT_UNIT = 2;   // \u516B\u5206\uFF08user\u300C\u9ED8\u8BA4\u53EF\u4EE5\u662F\u516B\u5206\u97F3\u7B26\u5417\u300D\uFF09\n/** \u8FDE\u97F3\uFF1An \u4E2A\u5360 m \u4E2A\u7684\u4F4D\u7F6E \u2192 \u6BCF\u4E2A \u00D7 m/n\uFF08\u4E09\u8FDE \u00D7\u2154\u3001\u4E94\u8FDE \u00D7\u2158\u3001\u516D\u8FDE \u00D7\u2154\uFF084 \u62CD\u5206 6\uFF09\u3001\u4E03\u8FDE \u00D74/7\uFF09\u3002 */\nexport const TUPLET: Record<number, [number, number]> = { 3: [2, 3], 5: [4, 5], 6: [4, 6], 7: [4, 7] };\n/** \u6570\u636E\u4E0A\u7684\u65F6\u503C\u4E0B\u9650 / \u4E0A\u9650\uFF08\u4E0B\u9650 = \u4E09\u5341\u4E8C\u5206\u4E03\u8FDE\u97F3\uFF1B\u4E0A\u9650 = \u56DB\u4E2A\u5168\u97F3\u7B26\uFF0C\u518D\u957F\u7528\u8FDE\u97F3\u7EBF\uFF09\u3002 */\nexport const MIN_DUR = (TPQ / 8) * 4 / 7;\nexport const MAX_DUR = WHOLE * 4;\n\n/** lang = \u8FD9\u4E2A\u97F3\u8282\u5531\u54EA\u79CD\u8BED\u8A00\uFF0C**\u53EA\u5728\u548C\u81EA\u52A8\u8BA4\u7684\u4E0D\u4E00\u6837\u65F6\u624D\u6709**\uFF08\u6301\u4E45\u5316\u7B2C 6 \u9898\uFF1A\u5B58\u6863\u65F6\u6BCF\u4E2A\u97F3\u8282\u90FD\u5199\u660E\uFF0C\u7F16\u8F91\u65F6\u81EA\u52A8\u8BA4\u3001\u8BA4\u9519\u4E86\u624D\u6539\uFF1B\u89C4\u5219\u89C1 score/lang.ts\uFF09\u3002 */\nexport interface NoteTok { kind: \"note\"; id: number; pitch: Pitch | null; dur: number; lyric: string | null; hyph?: boolean; tie?: boolean; lang?: string; staff?: Staff; chord?: Pitch[]; art?: Art[]; slur?: boolean; inhale?: \"soft\" | \"big\" }   // staff = \u5927\u8C31\u8868\u91CC\u624B\u52A8\u6307\u5B9A\u7684\u4E0A / \u4E0B\uFF08\u6CA1\u6709 = \u6309\u97F3\u9AD8\u81EA\u52A8\uFF09\n//   inhale\uFF082026-10-10\uFF0CClaude Opus 5.5\uFF1Buser\u300Cwishlist\u91CC\u9762\u8FD8\u6709\u5438\u6C14\u58F0\uFF0C\u4E5F\u4E00\u8D77\u652F\u6301\u4E0B\u2026\u4F46\u662F\u4E0D\u5E94\u8BE5\u6BCF\u4E2A\u9017\u53F7\u90FD\u5927\u5598\u6C14\u300D\u2192 AI \u63D0\u300C\u9017\u53F7\u9ED8\u8BA4\u9759\u9ED8\u3001\u8981\u51FA\u58F0\u7684\u5904\u5904\u660E\u5199\u300D\uFF0Cuser\u300C\u6C14\u58F0\u540C\u610F\u300D\uFF09\n//     = \u8FD9\u4E2A\u97F3\u540E\u9762\u7684\u547C\u5438\uFF08art \u91CC\u7684 breath\uFF09\u6362\u6C14\u65F6\u542C\u5F97\u89C1\uFF1Asoft = \u8F7B\u5438\u3001big = \u6DF1\u5438\u3002\u53EA\u8DDF\u7740 breath \u6709\u610F\u4E49\uFF08\u53BB\u6389\u547C\u5438 = \u4E00\u8D77\u53BB\u6389\uFF09\uFF1BMusicXML <other-articulation>inhale / inhale-big\u3002\n//   slur\uFF082026-10-08 \u8FDE\u65AD\uFF0CClaude Opus 5.5\uFF09= \u8FDE\u7EBF\uFF1A\u8FD9\u4E2A\u97F3\u8FDE\u5230\u4E0B\u4E00\u4E2A\u97F3\uFF08\u4E0D\u7559\u7F1D\uFF09\uFF1B\u4E00\u4E32\u8FDE\u7740\u7684 = \u4E00\u6761\u8FDE\u7EBF\u3002MusicXML <slur type=\"start/stop\"> \u539F\u751F\u3002\n//     user\u300C\u8FDE\u548C\u65AD\uFF0C\u55EF\u5C31\u662F\u6211\u60F3\u7684\uFF0C\u80FD\u505A\u5417\u300D\u300C\u8FDE\u65AD \u9884\u8BBE \u90FD\u540C\u610F\u300D\uFF1A\u5E95\u8272\u5F52\u6F14\u594F\u8005\uFF08articulation.gapSec\uFF09\uFF0C\u8C31\u4E0A\u7684\u8FDE\u7EBF\u53EA\u6539\u5C40\u90E8\u3002\n//   swell\uFF082026-10-08\uFF0CClaude Opus 5.5\uFF1Buser\u300C\u4E00\u4E2A\u97F3\u91CC\u9762\u7684\u53D1\u5C55\u2026\u8981\u8981\u6211\u90FD\u8981\u300D\uFF09= \u97F3\u5185\u7684\u529B\u5EA6\u8D77\u4F0F\uFF1A< \u8D8A\u6765\u8D8A\u5F3A\u3001> \u8D8A\u6765\u8D8A\u5F31\uFF08\u952F\u9F7F\uFF09\u3001<> \u9F13\u8D77\u6765\u518D\u843D\uFF08messa di voce\uFF09\uFF1B\n//     \u97F3\u81EA\u5DF1\u7684\u4E8B\uFF08\u548C\u6BB5\u843D\u7EA7\u7684\u6E10\u5F3A\u6E10\u5F31\u8BB0\u53F7\u662F\u4E24\u5C42\uFF0C\u53EF\u4EE5\u53E0\uFF09\u3002\u5B58\u5728 .moonsinger/score.json\uFF08MusicXML \u91CC\u8868\u8FBE\u4E0D\u4E86\u97F3\u5185\u7684\u53D1\u5939\uFF09\u3002\n//   chord\uFF082026-10-08 polyphony\uFF09= \u53E0\u97F3\uFF1Apitch \u4E4B\u5916\u7684\u97F3\u9AD8\uFF0C\u90FD\u6BD4 pitch \u4F4E\u3001\u4ECE\u9AD8\u5230\u4F4E\uFF1Bpitch = \u6700\u9AD8\u7684\u90A3\u4E2A = \u65CB\u5F8B\u7EBF\uFF08\u5531\u7684\u4EBA\u53EA\u8BFB\u5B83\uFF1Auser\u300C\u4E00\u4E2A Polyphony \u6362\u6708\u8BFB\u2026\u5E94\u8BE5\u662F\u53EA\u8BFB\u4E0A\u9762\u7684\u65CB\u5F8B\u7EBF\u300D\uFF09\u3002MusicXML = <chord/>\u3002\nexport interface RestTok { kind: \"rest\"; id: number; dur: number; staff?: Staff }\n/** style\uFF08v0.9.32\uFF09\uFF1Adouble = \u6BB5\u843D\u7EBF \u2016\uFF08\u5206\u6BB5\uFF0C\u4E0D\u662F\u4E24\u6839\u5C0F\u8282\u7EBF\uFF09\uFF1Bfinal = \u7EC8\u6B62\u7EBF\uFF08user\u300C\u55EF\u53CC\u5C0F\u8282\u7EBF\u7684\u8BED\u4E49\u4E0D\u662F\u4E24\u4E2A\u5C0F\u8282\u7EBF\uFF0C\u540C\u610F\u4F60\u7684\u5F52\u7C7B\u300D= \u4ECE\u300C\u53CD\u590D\u300D\u83DC\u5355\u8FDB\uFF09\u3002\u548C repeat \u4E0D\u540C\u65F6\u6709\u3002 */\nexport interface BarTok { kind: \"bar\"; id: number; repeat?: Repeat; times?: number; style?: \"double\" | \"final\" }   // repeat = \u53CD\u590D\u5C0F\u8282\u7EBF\uFF08|: / :| / :|:\uFF09\uFF1Btimes = :| \u8FD9\u4E00\u6BB5\u4E00\u5171\u653E\u51E0\u904D\uFF08\u6CA1\u5199 = 2\uFF09\n/** \u8C31\u5185\u53CD\u590D / \u8DF3\u8F6C\uFF082026-10-09 Opus 5.5\uFF1Buser\u300C\u987A\u4FBF\u4E00\u63D0\u8C31\u5185\u7684\u5FAA\u73AF\u548C\u6807\u51C6\u7684dc\u8FD9\u79CD\u662F\u4E0D\u662F\u652F\u6301\u4E0B\u4E5F\u4E0D\u96BE\uFF1F\u2026\u4E0D\u7136\u9047\u5230\u5F31\u8D77\u4EC0\u4E48\u5176\u5B9EAAABBB\u4E0D\u662F\u5F88\u65B9\u4FBF\u300D\n *  \u300C\u5C31\u662F\u666E\u901A\u8BB0\u8C31\u8F6F\u4EF6\u652F\u6301\u7684\u90A3\u79CD\u3002\u8FD9\u6837\uFF0C\u4E0D\u8D85\u8FC7sheet\u8FB9\u754C\u3002\u7B49\u53C2\u8003\u7A97\u597D\u4E86\u5F53\u5C0F\u4E1C\u897F\u52A0\u300D\uFF09\uFF1A\u4E0D\u8DE8\u7EB8\uFF1B\u653E\u7684\u65F6\u5019\u6309\u8FD9\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4F4D\u5728\u573A\u6B4C\u624B\u90A3\u4E00\u884C\u7684\u7ED3\u6784\u5C55\u5F00\uFF08src/score/repeats.ts\uFF09\uFF0C\n *  \u522B\u7684\u58F0\u90E8\u6309 tick \u8DDF\uFF1BMusicXML \u539F\u751F\uFF08<repeat> / <ending> / segno / coda / D.C. / Fine\uFF09\u3002 */\nexport type Repeat = \"start\" | \"end\" | \"both\";\n/** ending = \u623F\u5B50\uFF08\u7B2C\u51E0\u904D\u8D70\u8FD9\u4E2A\u62EC\u53F7\uFF0Cnums\uFF09\uFF1B\u5176\u4F59 = \u8DF3\u8F6C\u8BB0\u53F7\uFF1Asegno / coda = \u4F4D\u7F6E\uFF1Bfine / toCoda = \u8DF3\u56DE\u6765\u4E4B\u540E\u5728\u8FD9\u513F\u505C / \u53BB Coda\uFF1Bdc / ds = \u5728\u8FD9\u513F\u8DF3\u56DE\u5F00\u5934 / Segno\uFF08al Fine / al Coda = \u8DF3\u56DE\u6765\u4E4B\u540E\u5728 Fine \u505C / \u5728 To Coda \u53BB Coda\uFF09\u3002 */\nexport type NavWhat = \"ending\" | \"segno\" | \"coda\" | \"fine\" | \"toCoda\" | \"dc\" | \"dcFine\" | \"dcCoda\" | \"ds\" | \"dsFine\" | \"dsCoda\";\nexport interface NavTok { kind: \"nav\"; id: number; what: NavWhat; nums?: number[] }\nexport const NAV_LABEL: Record<Exclude<NavWhat, \"ending\">, string> = { segno: \"Segno\", coda: \"Coda\", fine: \"Fine\", toCoda: \"To Coda\", dc: \"D.C.\", dcFine: \"D.C. al Fine\", dcCoda: \"D.C. al Coda\", ds: \"D.S.\", dsFine: \"D.S. al Fine\", dsCoda: \"D.S. al Coda\" };\n/** \u623F\u5B50\u4E0A\u5199\u7684\u5B57\uFF1A[1] \u2192 \u300C1.\u300D\uFF0C[1, 2] \u2192 \u300C1. 2.\u300D\u3002 */\nexport const endingLabel = (nums: readonly number[] | undefined): string => (nums && nums.length ? nums.map((n) => `${n}.`).join(\" \") : \"1.\");\n/** \u53E5\u53F7\uFF082026-10-08\uFF0CClaude Fable 5.1\uFF1Buser\u300C\u73B0\u5728 || \u6CA1\u6709\u8FD9\u4E2A\u6211\u78B0\u5230\u7A0D\u5FAE\u957F\u4E00\u70B9\u7684\u66F2\u5B50\u90FD\u5FEB\u75AF\u4E86\u300D\u300C\u6B4C\u8BCD\u7684\u53E5\u53F7\u53EF\u80FD\u9700\u8981\u8FD9\u4E2A\u300D\u300C\u547C\u5438\u5C31\u662F\u547C\u5438\uFF0C\u7136\u540E\u53E5\u53F7\u53E6\u5916\u7B97\uFF0C\u4E0D\u81EA\u52A8\u547C\u5438\uFF0C\u6CA1\u6709\u8BED\u4E49\uFF0C\u6216\u8005\u53EA\u63D0\u793A\u6708\u8BFB\uFF0C\u4E0D\u7B97\u6253\u8C31\u7B26\u53F7\u300D\uFF09\uFF1A\n *  \u8FD9\u4E00\u53E5\u5230\u8FD9\u513F\u3002**\u6CA1\u6709\u8BED\u4E49**\uFF1A\u4E0D\u6362\u884C\uFF08\u300C\u4E0D\u5E94\u8BE5\u6309\u7167\u53E5\u6362\u884C\uFF0C\u6253\u8C31\u8F6F\u4EF6\u6CA1\u8FD9\u4E48\u5E72\u7684\u300D\uFF09\u3001\u4E0D\u6362\u6C14\u3001\u4E0D\u662F\u5C0F\u8282\u7EBF\uFF08\u4E0D\u6570\u62CD\u3001\u5F31\u8D77\u7167\u65E7\uFF09\uFF1B\u53EA\u7ED9\u300C\u5408\u300D\u632A\u5B57\u5F53\u8FB9\u754C\uFF0C\u753B\u6210\u6B4C\u8BCD\u884C\u4E0A\u4E00\u4E2A\u5C0F\u300C\u3002\u300D\u3002\n *  pad \u7B26\u53F7\u5C42\u7684\u300C\u53E5\u53F7\u300D\u952E / Shift+Enter / \u6B4C\u8BCD\u91CC\u6253\u53E5\u8BFB\u63D2\u5165\u3002**\u4E0D\u8FDB MusicXML**\uFF08\u4E0D\u7B97\u6253\u8C31\u7B26\u53F7\uFF09\uFF0C\u5B58 .moonsinger/score.json\uFF08papers[].phrases\uFF09\u3002 */\nexport interface PhraseTok { kind: \"phrase\"; id: number }\nexport interface KeyTok { kind: \"key\"; id: number; fifths: number }\nexport interface TimeTok { kind: \"time\"; id: number; beats: number; beatType: number }\nexport interface TempoTok { kind: \"tempo\"; id: number; bpm: number }   // \u6BCF\u5206\u949F\u51E0\u4E2A\u56DB\u5206\u97F3\u7B26\nexport type MarkTok = KeyTok | TimeTok | TempoTok;\n/** \u300C\u4FEE\u300D\u7684\u8BB0\u53F7\uFF082026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u547C\u5438\u8BB0\u53F7 \u8DF3\u97F3 / \u529B\u5EA6\u8FD9\u7C7B\u4FEE\u7684\u8BB0\u53F7\u8FDB\u9009\u533A\u6761\u300D\u300Cflow \u8FD8\u662F\u4E3B\u65CB\u5F8B\uFF0C\u4FEE\u624D\u7BA1\u8FD9\u4E9B\u300D\u2192 \u62CD\u300C\u6302\u5728\u97F3\u4E0A + \u9009\u533A\u6761\u300D\u300C\u6708\u8BFB\u5728\u90A3\u513F\u6362\u6C14\u300D\uFF09\uFF1A\n *  \u6F14\u594F\u6CD5 = \u6302\u5728\u97F3\u4E0A\uFF08art\uFF0C\u6309 ARTS \u7684\u987A\u5E8F\u3001\u4E0D\u91CD\u590D\uFF09\uFF1BMusicXML <notations><articulations> \u539F\u751F\u2014\u2014\u547C\u5438 = <breath-mark/>\uFF0C\u6302\u5728\u547C\u5438\u524D\u7684\u90A3\u4E2A\u97F3\u4E0A\u3002\n *  \u51FA\u58F0\uFF1A\u8DF3\u97F3 = \u622A\u77ED\uFF08\u5019\u9009\u7684 articulation.staccatoGate\uFF09\u3001\u91CD\u97F3 = \u97F3\u5934\u52A0 accentDb\u3001\u4FDD\u6301 = \u6EE1\u957F\uFF1B\u547C\u5438 = \u6708\u8BFB\u5728\u4E0B\u4E00\u4E2A\u5B57\u524D\u6362\u4E00\u53E3\u6C14\uFF08\u5531\u6CD5\u6838\u5FC3\u7684\u300Cv\u300D\uFF09\uFF0C\u4E50\u5668\u4E0D\u53D7\u5F71\u54CD\u3002 */\nexport type Swell = \"<\" | \">\" | \"<>\";\nexport const SWELL_NAME: Record<Swell, string> = { \"<\": \"\u97F3\u5185\u6E10\u5F3A\", \">\": \"\u97F3\u5185\u6E10\u5F31\", \"<>\": \"\u97F3\u5185\u9F13\u8D77\" };\nexport type Art = \"staccato\" | \"accent\" | \"marcato\" | \"sfz\" | \"fp\" | \"tenuto\" | \"breath\" | \"stress\" | \"unstress\" | \"ghost\" | \"whisper\" | \"swellUp\" | \"swellDown\" | \"swellBoth\" | \"arpeggio\";\n   // arpeggio = \u7436\u97F3\uFF08\u548C\u5F26\u5DE6\u8FB9\u4E00\u6761\u7AD6\u7684\u6CE2\u6D6A\u7EBF\uFF1A\u4ECE\u4F4E\u5230\u9AD8\u4F9D\u6B21\u594F\u51FA\uFF1Bv0.9.45\uFF0Cuser\u300C\u548C\u5F26\u7684\u6CE2\u6D6A\u7EBF\u8FD8\u662F\u6CA1\u6709\u505A\uFF0C\u505A\u4E00\u4E0B\uFF0C\u7EFF\u8896\u5B50\u8981\u3002\u8FD9\u4E2A\u662F\u6807\u51C6\u7684\u8BB0\u53F7\u5427\u300D\uFF1BMusicXML <arpeggiate/>\uFF09\n   // swellUp / swellDown / swellBoth = \u97F3\u5185\u6E10\u5F3A < / \u97F3\u5185\u6E10\u5F31 > / \u97F3\u5185\u9F13\u8D77 <>\uFF08v0.9.44 \u8D77\u5F52\u6F14\u594F\u6CD5\uFF1Auser\u300C\u97F3\u5185\u6E10\u5F3A\u6E10\u5F31\u548C\u9F13\u8D77\u5E94\u8BE5\u5C5E\u4E8E\u6F14\u594F\u6CD5\uFF0C\u6570\u636E\u7ED3\u6784\u548C\u903B\u8F91\u4E0A\u4E5F\u5E94\u8BE5\uFF0C\u56E0\u4E3A\u662F\u8DDF\u7740\u97F3\u7B26\u7684\u300D\uFF1B\n   //   \u539F\u6765\u662F NoteTok.swell\u3002\u4E09\u4E2A\u4E92\u65A5\uFF08\u4E00\u4E2A\u97F3\u4E00\u79CD\u8D77\u4F0F\uFF09\u3001\u548C\u97F3\u5934\u90A3\u4E00\u7EC4\u4E0D\u4E92\u65A5\uFF08fp + < \u7167\u65E7\uFF09\u3002\u6587\u4EF6\u4E0D\u53D8\uFF1A\u7167\u65E7\u5B58 score.json papers[].swells\uFF0C\u4E0D\u8FDB MusicXML\uFF09   // whisper = \u6C14\u58F0\uFF08\u00D7 \u7B26\u5934\uFF1A\u8FD9\u4E2A\u5B57\u4E0D\u5531\u97F3\u9AD8\uFF1B2026-10-10 Opus 5.5\uFF0Cuser\u300Cx\u540C\u610F\uFF0C\u505A\u652F\u6301\u300D\uFF09\n   // marcato = \u5F3A\u97F3\uFF08^\uFF0C\u6BD4\u91CD\u97F3\u66F4\u91CD\uFF1BMusicXML <strong-accent/>\uFF1B2026-10-08 \u52A0\uFF09\n//   stress = \u6B21\u91CD\u97F3\uFF08\u6BD4\u91CD\u97F3\u8F7B\uFF1BMusicXML <stress/>\uFF09\u3001unstress = \u5F31\u5316\uFF08<unstress/>\uFF09\u3001ghost = \u5E7D\u7075\u97F3\uFF08\u62EC\u53F7\u7B26\u5934\uFF0C\u5F88\u8F7B\uFF1B<notehead parentheses=\"yes\">\uFF09\u2014\u2014\n//   2026-10-08 \u6DF1\u591C Opus 5.5\uFF0Cuser\u300C\u91CD\u97F3\u80FD\u4E0D\u80FD\u6709\u4E0D\u540C\u7684\u9636\u68AF\uFF08\u7ED9\u4E00\u4E2A\u6BD4\u8FD9\u4E2A\u8F7B\u7684\u6B21\u91CD\u97F3\uFF0C\u60F3\u4E00\u4E0B\u56DB\u62CD\u5B50\u7684\u5F3A\u5F31\u6B21\u5F3A\u5F31\u300D\u300C\u90FD\u505A\u300D\u300C\u5404\u79CD\u5F31\u5316\u4E5F\u505A\u300D\u300C\u97F3\u7684\u5F3A\u5EA6\u53EA\u80FD\u6709\u4E00\u79CD\uFF0C\u4F46\u662F\u53EF\u80FD\u6709\u5F88\u591A\u7EA7\u300D\uFF1A\n//   \u4E00\u4E2A\u97F3\u7684\u300C\u5F3A\u5EA6\u300D\u53EA\u6709\u4E00\u4E2A\u3001\u6709\u5F88\u591A\u7EA7\uFF1A\u5E7D\u7075\u97F3 < \u5F31\u5316 < \uFF08\u4E0D\u5199\uFF09< \u6B21\u91CD\u97F3 < \u91CD\u97F3 < \u5F3A\u97F3\uFF08= \u8D85\u7EA7\u91CD\u97F3\uFF0CMusicXML \u53EB strong-accent\uFF09\uFF0C\u7A81\u5F3A / \u5F3A\u540E\u5373\u5F31\u662F\u5E26\u529B\u5EA6\u5F62\u72B6\u7684\u90A3\u4E24\u4E2A\u3002\n//   sfz = \u7A81\u5F3A\u3001fp = \u5F3A\u540E\u5373\u5F31\uFF082026-10-08\uFF0Cuser\u300C\u97F3\u5934\u5148\u51B2\u4E00\u4E0B\uFF0C\u518D\u56DE\u843D\u2026\u8981\uFF0C\u8981\uFF0C\u6211\u90FD\u8981\u300D\uFF09\uFF1A\u97F3\u5934\u7684\u529B\u5EA6\u5F62\u72B6\uFF0CMusicXML <notations><dynamics>\uFF1B\n//   \u97F3\u5934\u90A3\u4E00\u7EC4\uFF08\u91CD\u97F3 / \u5F3A\u97F3 / sfz / fp\uFF09\u4E92\u65A5\u2014\u2014\u5F00\u4E00\u4E2A\u5C31\u5173\u6389\u522B\u7684\uFF08ATTACKS\uFF09\u3002\nexport const ARTS: readonly Art[] = [\"staccato\", \"accent\", \"marcato\", \"sfz\", \"fp\", \"tenuto\", \"breath\", \"stress\", \"unstress\", \"ghost\", \"whisper\", \"swellUp\", \"swellDown\", \"swellBoth\", \"arpeggio\"];\nexport const ATTACKS: readonly Art[] = [\"ghost\", \"unstress\", \"stress\", \"accent\", \"marcato\", \"sfz\", \"fp\"];   // \u4E00\u4E2A\u97F3\u7684\u5F3A\u5EA6\u53EA\u6709\u4E00\u79CD\uFF08\u4E92\u65A5\uFF09\nexport const ART_NAME: Record<Art, string> = { staccato: \"\u8DF3\u97F3\", accent: \"\u91CD\u97F3\", marcato: \"\u5F3A\u97F3\", sfz: \"\u7A81\u5F3A\", fp: \"\u5F3A\u540E\u5373\u5F31\", tenuto: \"\u4FDD\u6301\", breath: \"\u547C\u5438\", stress: \"\u6B21\u91CD\u97F3\", unstress: \"\u5F31\u5316\", ghost: \"\u5E7D\u7075\u97F3\", whisper: \"\u6C14\u58F0\", swellUp: \"\u97F3\u5185\u6E10\u5F3A\", swellDown: \"\u97F3\u5185\u6E10\u5F31\", swellBoth: \"\u97F3\u5185\u9F13\u8D77\", arpeggio: \"\u7436\u97F3\" };\n/** \u97F3\u5185\u7684\u8D77\u4F0F\u8FD9\u4E00\u7EC4\uFF08\u4E92\u65A5\uFF09\uFF1A\u6F14\u594F\u6CD5\u7684\u503C \u2194 \u8BB0\u53F7\uFF08< / > / <>\uFF0Cscore.json \u548C\u753B\u6CD5\u7528\uFF09\u3002 */\nexport const SWELL_ART: Record<Swell, Art> = { \"<\": \"swellUp\", \">\": \"swellDown\", \"<>\": \"swellBoth\" };\nexport const SWELL_ARTS: readonly Art[] = [\"swellUp\", \"swellDown\", \"swellBoth\"];\n/** \u8FD9\u4E2A\u97F3\u7684\u97F3\u5185\u8D77\u4F0F\uFF08\u6CA1\u6709 = undefined\uFF09\u3002 */\nexport function swellOf(t: Token | undefined): Swell | undefined {\n  if (t?.kind !== \"note\" || !t.art) return undefined;\n  return t.art.includes(\"swellUp\") ? \"<\" : t.art.includes(\"swellDown\") ? \">\" : t.art.includes(\"swellBoth\") ? \"<>\" : undefined;\n}\n/** \u529B\u5EA6 = \u4E00\u4E2A\u8BB0\u53F7 token\uFF08\u4E0D\u5360\u65F6\u503C\uFF0C\u7BA1\u5230\u4E0B\u4E00\u4E2A\u529B\u5EA6\u4E3A\u6B62\uFF1B\u4E00\u9996\u6CA1\u5199 = mf\uFF09\u3002MusicXML <direction><dynamics>\u3002\u51FA\u58F0 = \u5019\u9009\u7684 dynamicsDb\uFF08mf = 0 dB\uFF09\u3002 */\nexport type Dyn = \"ppp\" | \"pp\" | \"p\" | \"mp\" | \"mf\" | \"f\" | \"ff\" | \"fff\";   // ppp / fff\uFF1Av0.9.23\uFF082026-10-10 user\u300Cwishlist: ppp fff\uFF0C\u4EE5\u53CA\u5E2E\u6211\u79D1\u666E\u8FD9\u4E9B\u548Cdb\u7684\u6362\u7B97\u5173\u7CFB\uFF0C\u7136\u540E\u5E94\u8BE5\u5411\u7528\u6237\u63ED\u9732\uFF0C\u65B9\u4FBF\u5BF9\u6BD4\u300D\uFF09\nexport const DYNS: readonly Dyn[] = [\"ppp\", \"pp\", \"p\", \"mp\", \"mf\", \"f\", \"ff\", \"fff\"];\nexport const DEFAULT_DYN: Dyn = \"mf\";\nexport interface DynTok { kind: \"dyn\"; id: number; value: Dyn; ramp?: true }   // ramp = \u6E10\u5230\uFF1A\u4ECE\u8FD9\u5F20\u7EB8\u91CC\u4E0A\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u90A3\u513F\u4E00\u8DEF\u6E10\u53D8\u5230\u8FD9\u91CC\uFF08\u5173\u952E\u5E27\u7684\u7EBF\u6027\u63D2\u503C\uFF1B2026-10-08 \u6DF1\u591C Opus 5.5\uFF0Cuser\u300C\u6E10\u5230 \u505A\u300D\uFF09\n/** \u6E10\u5F3A / \u6E10\u5F31\uFF082026-10-08 \u6539\u6210\u8BB0\u53F7\uFF0CClaude Opus 5.5\uFF1Buser\u300C\u6240\u4EE5<>\u662F\u4E00\u4E2A\u8BED\u4E49\uFF0C\u5C31\u662F\u4ECE\u8FD9\u4E00\u523B\u5F00\u59CB\u8FDE\u7EED\u53D8\u5230\u4E0B\u4E00\u4E2A\u5F3A\u5EA6/\u901F\u5EA6\u6807\u8BB0\uFF1F\u300D\u300C\u5927\u4E8E\u5C0F\u4E8E\u53F7\u4E0D\u7528\u7CBE\u786E\u6307\u5B9A\u8303\u56F4\uFF0C\u800C\u662F\u8BFB\u6700\u8FD1\u7684pf\u300D\uFF09\uFF1A\n *  \u72B6\u6001\u7684\u8FC7\u6E21\u2014\u2014\u4ECE\u8FD9\u513F\u8D77\u8FDE\u7EED\u53D8\u5230\u540C\u4E00\u5F20\u7EB8\u91CC\u7684\u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\uFF1B\u4E2D\u95F4\u53C8\u9047\u5230\u4E00\u4E2A\u6E10\u5F3A\u6E10\u5F31 = \u8FD9\u4E00\u6BB5\u5230\u90A3\u513F\u4E3A\u6B62\uFF1B\u90FD\u6CA1\u6709 = \u8D70\u4E00\u6863\uFF08\u6F14\u594F\u8005\u7684 wedgeStep\uFF09\uFF0C\u8C31\u4E0A\u7070\u5B57\u62AB\u9732\u3002 */\nexport interface HairpinTok { kind: \"hairpin\"; id: number; dir: \"cresc\" | \"dim\" }\n/** \u98CE\u683C\u8BB0\u53F7 = \u62CD\u5B50\u8F7B\u91CD\uFF082026-10-08 \u6DF1\u591C Opus 5.5\uFF1Buser\u300C\u5148\u8BA8\u8BBA\u6E05\u695A\u518D\u505A\uFF0C\u4E0D\u540C\u7684\u6D41\u6D3E\u4F1A\u4E0D\u4E00\u6837\u300D\u2192 \u98CE\u683C\u662F\u4E00\u4E2A\u50CF\u901F\u5EA6\u4E00\u6837\u7684\u6587\u5B57\u8BB0\u53F7\u3001\u300C\u53EA\u5BF9\u5F53\u524Dsheet\u6709\u7528\u300D\u300C\u4E2D\u95F4\u6362\u540C\u610F\u300D\n *  \u300C\u70B9\u5F00\u4E4B\u540E\u53EF\u4EE5\u8BBE\u7F6E\u5177\u4F53\u7684\u7EC6\u8282\u300D\u300C\u9884\u8BBE\u53EF\u4EE5\u2026\u505A\u6210\u6570\u636E\u9A71\u52A8\u7684\u300D\uFF09\uFF1A\u4ECE\u8FD9\u513F\u8D77\u5230\u8FD9\u5F20\u7EB8\u7ED3\u5C3E\uFF08\u6216\u4E0B\u4E00\u4E2A\u98CE\u683C\u8BB0\u53F7\uFF09\uFF0C\u6BCF\u4E2A\u97F3\u6309\u5B83\u5728\u5C0F\u8282\u91CC\u7684\u4F4D\u7F6E\u8F7B\u4E00\u70B9 / \u91CD\u4E00\u70B9\n *  \uFF08\u9884\u8BBE = \u97F3\u4E50\u4ED3\u9F20\u7684 grooves-vN.json\uFF0Csrc/score/groove.ts\uFF09\u3002\u6574\u5F20\u7EB8\u4E00\u8D77\u542C\uFF08\u5199\u5728\u54EA\u4E00\u884C\u90FD\u7BA1\u5168\u90E8\u6B4C\u624B\uFF1B\u540C\u4E00\u65F6\u523B\u4E24\u884C\u90FD\u5199\u4E86 = \u4E0A\u9762\u90A3\u884C\u7B97\uFF09\u3002\n *  style = \u9884\u8BBE id\uFF08\"pop\"\u2026\uFF1B\"none\" = \u8FD9\u513F\u8D77\u4E0D\u52A0\uFF09\uFF1Bamount = \u5E45\u5EA6\uFF081 = \u9884\u8BBE\u672C\u8EAB\uFF1B\u4E0D\u5199 = 1\uFF09\u3002\u4E0D\u5360\u65F6\u503C\u3001\u4E0D\u5360\u6A2A\u5411\u5730\u65B9\u3002MusicXML <direction><words id=\"groove.\u2026\">\u3002 */\nexport interface GrooveTok { kind: \"groove\"; id: number; style: string; amount?: number; shift?: true }   // shift = \u9519\u5F00\u4E00\u5C0F\u8282\uFF08\u4E24\u5C0F\u8282\u4E00\u8F6E\u7684\u98CE\u683C\uFF1A3-2 \u2192 2-3\uFF1B2026-10-09\uFF09\n/** \u8C31\u53F7\u8BB0\u53F7\uFF08v0.9.28\uFF1Buser 2026-10-10\u300C\u8C31\u53F7\u7684\u663E\u793A\u6A21\u5F0F\u8DDF\u7740\u8C31\u53F7\u800C\u4E0D\u662F\u4E50\u5668\u300D\u300C\u9ED8\u8BA4\u81EA\u52A8\u540C\u610F\u300D\u300C\u52A0\u683C\u5F0F\u540C\u610F\u300D\uFF09\uFF1A\u4ECE\u8FD9\u513F\u8D77\u6362\u8C31\u53F7\uFF08\u53EA\u7BA1\u753B\uFF0C\u97F3\u9AD8\u6570\u636E\u4E0D\u52A8\uFF09\u3002\n *  \u58F0\u90E8\u81EA\u5DF1\u7684\u8C31\u53F7\uFF08PartDef.clef\uFF0C\u6CA1\u6709 = \u81EA\u52A8\uFF09\u7BA1\u6BCF\u5F20\u7EB8\u5F00\u5934\uFF1B\u7EB8\u4E2D\u95F4\u8981\u6362\u5C31\u63D2\u8FD9\u4E2A\u3002MusicXML \u539F\u751F <attributes><clef>\u3002 */\nexport interface ClefTok { kind: \"clef\"; id: number; clef: ClefName }\n/** \u516B\u5EA6\u7EBF\uFF08v0.9.28\uFF1Buser\u300C\u94C3\u94DB\u4F1A\u5F88\u9AD8\u30028va\u53EF\u4EE5\u505A\u4E86\u5417\u300D\uFF09\uFF1A\u4ECE\u8FD9\u513F\u8D77\u8C31\u4E0A\u753B\u4F4E\uFF088va / 15ma\uFF09/ \u9AD8\uFF088vb\uFF09\u51E0\u4E2A\u516B\u5EA6\uFF0C\u76F4\u5230\u4E0B\u4E00\u4E2A\u516B\u5EA6\u7EBF\u8BB0\u53F7\uFF08shift 0 = \u7ED3\u675F\uFF09\uFF1B\u53EA\u7BA1\u753B\u3002\n *  shift\uFF1A1 = 8va\uFF08\u5B9E\u9645\u9AD8\u516B\u5EA6\uFF09\u30012 = 15ma\u3001\u22121 = 8vb\u30010 = \u7ED3\u675F\u3002MusicXML \u539F\u751F <octave-shift>\u3002 */\nexport interface OttavaTok { kind: \"ottava\"; id: number; shift: -1 | 0 | 1 | 2; /** \u81EA\u52A8\u753B\u7684\uFF08v0.9.37\uFF09\uFF1A\u53EA\u5728\u5BFC\u51FA MusicXML \u65F6\u4E34\u65F6\u63D2\u8FDB\u53BB\uFF08\u5E26 ms-auto id\uFF09\uFF0C\u8C31\u91CC\u6C38\u8FDC\u6CA1\u6709\u3002 */ auto?: true }\nexport type Token = NoteTok | RestTok | BarTok | PhraseTok | MarkTok | DynTok | HairpinTok | GrooveTok | NavTok | ClefTok | OttavaTok;\nexport type Timed = NoteTok | RestTok;\n/** \u4E00\u4E2A\u8BB0\u53F7\u7684\u503C\uFF08\u4E0D\u5E26 id\uFF09\u3002 */\nexport type MarkVal = Omit<KeyTok, \"id\"> | Omit<TimeTok, \"id\"> | Omit<TempoTok, \"id\">;\n\n/** \u300C\u54FC\u7684\u5B57\u300D\uFF1A\u8DDF\u8BED\u8A00\u65E0\u5173\u7684\u4E94\u6863\uFF0C\u5531\u7684\u65F6\u5019\u6309\u8BED\u8A00\u6362\u5B57\uFF08lab-score.ts HUM_SYLLABLE\uFF09\u3002o = 2026-10-07 \u52A0\uFF08user\u300CGM\u4E0D\u662F\u8FD8\u6709\u4E00\u4E2Aooo\u5417\u300D\u300C\u5BF9\uFF0C\u54E6 / \u304A\u300D\uFF09\u3002 */\nexport type Hum = \"la\" | \"n\" | \"u\" | \"o\" | \"a\";\n\n/** \u6B4C\u7EA7\u7684\u4E00\u4E2A\u58F0\u90E8\uFF08\u8C31\u4E0A\u7684\u4E00\u884C\uFF1B\u987A\u5E8F = \u603B\u8C31\u4ECE\u4E0A\u5230\u4E0B\uFF09\uFF1Arole = \u4F11\u606F\u5BA4\u89D2\u8272 id\uFF08\u8C01\u6765\u6F14\u3001\u53EB\u4EC0\u4E48\uFF09\uFF0Cmic = \u5F55\u97F3\u623F\u9EA6\u514B\u98CE id\u3002 */\nexport interface PartDef { id: string; role: string; mic: string; clef?: Clef; staves?: 2; /** \u81EA\u52A8\u516B\u5EA6\u7EBF\uFF08v0.9.37\uFF09\uFF1A\u6CA1\u5199 = \u5F00\uFF1Bfalse = \u8FD9\u4F4D\u4E0D\u81EA\u52A8\uFF08score.json parts[].autoOttava\uFF09\u3002 */ autoOttava?: false;\n  /** \u5408\u79DF\uFF08v0.10.24\uFF09\uFF1A\u6302\u5728\u54EA\u4F4D\uFF08\u4E3B\u4EBA\uFF09\u7684\u8C31\u7EBF\u4E0A\u753B\uFF08\u4E3B\u4EBA\u81EA\u5DF1\u4E0D\u80FD\u518D\u662F\u623F\u5BA2\uFF09\u3002\u53EA\u7BA1\u753B\uFF1A\u8F68 / \u4E50\u5668 / \u6DF7\u97F3\u53F0\u7167\u65E7\u5404\u662F\u5404\u7684\uFF08ai-docs/20261010-shared-staff-percussion-design.md \u00A71\uFF09\u3002 */\n  host?: string }   // clef = \u8FD9\u4E2A\u58F0\u90E8\u7684\u8C31\u53F7\uFF08\u6CA1\u6709 = \u9AD8\u97F3\uFF1B\u5B58 MusicXML <clef>\uFF09\uFF1Bstaves = 2 \u2192 \u5927\u8C31\u8868\uFF08\u4E0A\u9AD8\u97F3\u4E0B\u4F4E\u97F3\uFF0Cclef \u4E0D\u770B\uFF1BMusicXML <staves>\uFF09\n/** \u8C31\u53F7\uFF1A\u9AD8\u97F3 / \u9AD8\u97F3\u4E0B\u52A0 8\uFF08\u5409\u4ED6\u3001\u7537\u9AD8\u97F3\uFF1A\u5B9E\u9645\u4F4E\u516B\u5EA6\uFF09/ \u4E0A\u52A0 8 / \u4E0A\u52A0 15\uFF08\u949F\u7434\uFF09/ \u4F4E\u97F3 / \u4F4E\u97F3\u4E0B\u52A0 8\uFF08\u4F4E\u97F3\u63D0\u7434\u3001\u8D1D\u65AF\uFF09\u3002\u4E2D\u97F3\u8C31\u53F7\u4E0D\u505A\uFF08user\u300C\u4E2D\u97F3\u8FD9\u4E2A\u51B7\u95E8\u6CA1\u4EBA\u7528\u5427\u300D\uFF09\u3002 */\nexport type ClefName = \"G\" | \"G8vb\" | \"G8va\" | \"G15ma\" | \"F\" | \"F8vb\";\nexport const CLEFS: readonly ClefName[] = [\"G\", \"G8vb\", \"G8va\", \"G15ma\", \"F\", \"F8vb\"];\nexport type Clef = ClefName;\nexport type Staff = 1 | 2;\n/** \u5927\u8C31\u8868\u7684\u5206\u754C\uFF1A\u4E2D\u592E C \u4EE5\u4E0B\u81EA\u52A8\u843D\u5230\u4E0B\u8C31\u8868\uFF08\u97F3\u53EF\u4EE5\u624B\u52A8\u6307\u5B9A staff \u8986\u76D6\uFF1Buser 2026-10-08\u300C\u94A2\u7434\u8FD9\u79CD\u5DE6\u53F3\u624B\u8981\u4E24\u4E2A\u8C31\u53F7\u300D\u300Cmusicxml\u539F\u751F\u652F\u6301\u90A3\u5C31\u4E0D\u7EA0\u7ED3\u4E86\u76F4\u63A5\u4E0A\u300D\uFF09\u3002 */\nexport const SPLIT_MIDI = 60;\n/** \u4E00\u5F20\u7EB8 = \u4E00\u4E2A\u66F2\u6BB5\uFF1Aname = \u66F2\u6BB5\u540D\uFF08\u7EB8\u9876\u90A3\u4E00\u6761\uFF0C\u53EF\u7A7A\uFF09\uFF1Btracks = \u58F0\u90E8 id \u2192 \u8FD9\u5F20\u7EB8\u4E0A\u8FD9\u4E2A\u58F0\u90E8\u7684 token \u4E32\uFF08\u5F00\u5934\u4E09\u4E2A\u8C31\u5934\u8BB0\u53F7\uFF09\u3002 */\nexport interface PaperSeg { id: string; name: string; tracks: Record<string, Token[]>; hidden?: boolean }   // hidden = \u4E0D\u653E\uFF08\u538B\u5E73 / \u64AD\u653E / \u5BFC\u51FA\u7684\u538B\u5E73\u4EF6\u90FD\u8DF3\u8FC7\uFF09\uFF1B\u5168\u90E8\u89C6\u56FE\u91CC\u6298\u53E0\u7740\u3001\u7FFB\u9875\u80FD\u8FDB\u53BB\uFF08user 2026-10-08\uFF09\nexport interface Song {\n  /** \u6B4C\u540D\uFF08\u53EF\u4E0D\u586B\uFF1B\u7EB8\u9762\u6700\u4E0A\u9762\u90A3\u4E00\u884C\uFF0C\u5B58\u6863 = MusicXML <work-title>\uFF1Buser 2026-10-07\u300C\u7EB8\u5F20\u7684\u6700\u4E0A\u9762\u52A0\u4E00\u4E2A\u53EF\u9009\u7684\u6B4C\u540D\u5427\uFF0C\u672A\u6765\u4E5F\u662F\u6587\u4EF6\u540D\u300D\uFF09\u3002 */\n  title?: string;\n  /** \u7EB8\uFF08A4 / A5 / A6 / \u522B\u7684\u8F6F\u4EF6\u7684\u522B\u7684\u7EB8\uFF09\uFF1B\u6CA1\u6709 = \u9ED8\u8BA4 A5\uFF08src/score/paper.ts\uFF1B\u5B58\u6863 = MusicXML <defaults>\uFF09\u3002\u6574\u9996\u6B4C\u4E00\u4E2A\u3002 */\n  paper?: Paper;\n  /** \u4F5C\u8005\u680F\uFF1A\u4E00\u5757\u7EAF\u6587\u672C\u3001\u51E0\u884C\u90FD\u884C\uFF08\u4F5C\u8BCD\u4F5C\u66F2\u3001\u6F14\u5531\u3001\u6708\u8BFB\u7684\u7F72\u540D\u3001\u58F0\u660E\u2026\uFF09\uFF0C\u7EB8\u4E0A\u7167\u5199\u7684\u663E\u793A\uFF08\u6807\u9898\u4E0B\u9762\u9760\u53F3\uFF09\uFF1B\u53EF\u4E0D\u586B\u3002\n   *  \u4E0D\u81EA\u52A8\u8BA4\u300C\u4F5C\u8BCD\uFF1A\u300D\u8FD9\u7C7B\u5199\u6CD5\uFF08user\u300C\u4F60\u6743\u8861\u4E00\u4E2Aplain multiline text vs\u81EA\u52A8\u8BC6\u522B\uFF08\u4F46\u662F\u8FD9\u6837\u6709hidden convention\uFF09\uFF0C\u4F60\u770B\u4E00\u4E0B\u600E\u4E48\u529E\u300D\u2192 AI \u9009\u7EAF\u6587\u672C\u3001\u6240\u89C1\u5373\u6240\u5F97\uFF09\u3002\n   *  \u5B58\u6863 = MusicXML <credit><credit-words>\uFF08\u5370\u5728\u9875\u9762\u4E0A\u7684\u5B57\uFF09\u3002 */\n  credits?: string;\n  /** \u8FD9\u9996\u6B4C\u81EA\u5DF1\uFF08\u8BCD / \u66F2 / \u7F16\u2014\u2014\u7528\u6237\u5199\u7684\u90A3\u90E8\u5206\uFF09\u7684\u8BB8\u53EF\uFF0C\u4E00\u6BB5\u6587\u5B57\uFF0C\u7528\u6237\u9009\u6216\u81EA\u5DF1\u5199\uFF1B\u6CA1\u6709 = \u6CA1\u58F0\u660E\uFF08\u4E0D\u66FF\u7528\u6237\u9009\uFF09\u3002\n   *  \u5B58\u6863 = MusicXML <identification><rights>\uFF08\u6807\u51C6\u4F4D\u7F6E\uFF0C\u522B\u7684\u8F6F\u4EF6\u4E5F\u8BA4\uFF09\uFF1B\u7F72\u540D\u63A8\u6F14\u548C mp3 \u6807\u7B7E\u91CC\u6392\u7B2C\u4E00\u6761\uFF082026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u4F60\u8BA1\u7B97\u7684\u65F6\u5019\u522B\u5FD8\u4E86\u7528\u6237\u81EA\u5DF1\u5199\u7684\u90A3\u4E00\u90E8\u5206\uFF0C\u7528\u6237\u53EF\u4EE5\u9009\u300D\uFF09\u3002 */\n  rights?: string;\n  /** \u7F16\u6392\uFF1A\u6309\u4EC0\u4E48\u987A\u5E8F\u653E\u54EA\u51E0\u5F20\u7EB8\uFF08\u4E00\u884C\u5B57\uFF1A\u66F2\u6BB5\u540D / \u5E8F\u53F7\u3001\u00D7N\u3001\u62EC\u53F7\u3001\u6700\u540E\u4E00\u4E2A [\u5FAA\u73AF\u6BB5]\uFF1Bsrc/score/arrange.ts\uFF09\u3002\u6CA1\u6709 = \u6BCF\u5F20\u7EB8\u6309\u987A\u5E8F\u5404\u653E\u4E00\u904D\u3002\n   *  \u5B58\u6863 = score.json \u53EF\u9009\u5B57\u6BB5 arrangement\uFF082026-10-08 \u6DF1\u591C Opus 5.5\uFF0Cuser\u300Ca flat \u7F16\u6392 list \u540C\u610F\u300D\u300C\u7F16\u6392\u2026\u5C31\u662F\u603Bpaper\u7684\u9876\u4E0A\u8BF4\u4E00\u4E0B\u2026\u5C31\u662F\u4E00\u884C\u300D\uFF09\u3002 */\n  arrangement?: string;\n  /** \u6B4C\u8BCD\u600E\u4E48\u6392\uFF08v0.9.40\uFF1Buser 2026-10-10\u300C\u5148\u8BD5\u4E0B\u4F60\u8BF4\u7684\u4E24\u4E2A\u6B4C\u8BCD\u5F00\u5173\u5427\uFF0Capproved\u300D\u2192\u300C\u9ED8\u8BA4\u7528\u4FEE\u6B4C\u8BCD\u7684\u90A3\u4E2A\u6392\u7248\u65B9\u5F0F\u5427\u300D\uFF09\uFF1A\u6CA1\u6709 = \u6309\u8282\u594F\uFF08\u9ED8\u8BA4\uFF1A\u97F3\u7684\u4F4D\u7F6E\u53EA\u770B\u65F6\u503C\uFF0C\n   *  \u6B4C\u8BCD\u8BA9\u8DEF\uFF1A\u501F\u65C1\u8FB9\u7684\u7A7A \u2192 \u5C0F\u4E00\u53F7 \u2192 \u4E0A\u4E0B\u9519\u5F00 \u2192 \u8FD8\u653E\u4E0D\u4E0B\u753B\u7070\u8BF4\u300C\u6324\u4E86\u300D\uFF09\uFF1Blyrics = \u6309\u6B4C\u8BCD\uFF08\u957F\u5B57\u628A\u97F3\u63A8\u5F00\uFF0C\u51FA\u7248\u8C31\u7684\u8001\u89C4\u77E9\uFF09\u3002\u5B58\u6863 = score.json \u53EF\u9009\u5B57\u6BB5 lyricFit\uFF08\u53EA\u5199 \"lyrics\"\uFF09\u3002 */\n  lyricFit?: \"lyrics\";\n  /** \u5C0F\u8282\u53F7\uFF08v0.9.42\uFF1Buser\u300C\u5C0F\u8282\u53F7\u8981\uFF0C\u53EF\u4EE5\u9875\u9762\u8BBE\u7F6Etoggle\uFF0C\u9ED8\u8BA4\u662F\u6BCF\u884C\u5F00\u5934\u6709\u300D\uFF09\uFF1A\u6CA1\u6709 = \u6BCF\u884C\u5F00\u5934\u5370\uFF1Boff = \u4E0D\u5370\u3002\u5B58\u6863 = score.json \u53EF\u9009\u5B57\u6BB5 barNumbers\uFF08\u53EA\u5199 \"off\"\uFF09\u3002 */\n  barNumbers?: \"off\";\n  hum: Hum;              // \u6CA1\u5199\u6B4C\u8BCD\u7684\u97F3\u5531\u4EC0\u4E48\uFF08\u4E00\u9996\u6B4C\u4E00\u4E2A\uFF09\n  parts: PartDef[];      // \u58F0\u90E8\u5E76\u96C6\uFF08\u603B\u8C31\u4ECE\u4E0A\u5230\u4E0B\u7684\u987A\u5E8F\uFF09\n  papers: PaperSeg[];    // \u7EB8\uFF08\u66F2\u6BB5\uFF09\u7684\u987A\u5E8F\u8868\n}\n/** \u5149\u6807 / \u9009\u4E2D\u843D\u5728\u54EA\u6761 track\uFF08\u54EA\u5F20\u7EB8 \u00D7 \u54EA\u4E2A\u58F0\u90E8\uFF09\u3002 */\nexport interface Focus { paper: string; part: string }\nexport const DEFAULT_KEY = 0, DEFAULT_TIME = { beats: 4, beatType: 4 }, DEFAULT_BPM = 90;\n\n/** \u8F93\u5165\u72B6\u6001\uFF08\u4E0D\u8FDB\u6570\u636E\uFF09\uFF1A\u5199\u7684\u65F6\u5019\u4E0B\u4E00\u4E2A\u97F3\u957F\u4EC0\u4E48\u6837\u3002 */\nexport type Acc = -2 | -1 | 0 | 1 | 2;\nexport interface InputState {\n  unit: number;                       // LADDER \u4E0B\u6807\n  tuplet: 0 | 3 | 5 | 6 | 7;          // 0 = \u4E0D\u8FDE\u97F3\uFF1B\u9501\u5B9A\u5F0F\n  acc: Acc;                           // \u266F / \u266D Shift\uFF08pad \u7684\u5347\u964D\u952E\u8FD8\u80FD \uD834\uDD2A / \uD834\uDD2B = \u00B12\uFF09\n  accMode: \"off\" | \"once\" | \"lock\";   // \u70B9\u4E00\u4E0B\u53EA\u7BA1\u4E0B\u4E00\u4E2A\u97F3\uFF0C\u8FDE\u70B9\u4E24\u4E0B\u9501\u4F4F\uFF08user\u300Cdouble tap shift is \"capslock\"\u300D\uFF09\n  accAt: number;                      // \u4E0A\u4E00\u6B21\u70B9 Shift \u7684\u65F6\u523B\uFF08ms\uFF0C\u5224\u8FDE\u70B9\uFF09\n  inputFifths: number;                // \u300C1=\u300D= \u8F93\u5165\u8BBE\u5907\uFF08pad / \u7535\u8111\u952E\u76D8\uFF09\u81EA\u5DF1\u7684\u8C03\uFF0C\u9ED8\u8BA4 C\uFF1B\u4E0D\u8DDF\u8C31\u4E0A\u7684\u8C03\u53F7\uFF082026-10-07 user\u300C\u628Apad\u60F3\u6210\u4E00\u4E2A\u72EC\u7ACB\u7684medo\u5F0F\u7684\u8F93\u5165\u8BBE\u5907\uFF0C\u5047\u8BBE\u6CA1\u6709\u8C31\u300D\u300C\u5982\u679C\u4E00\u4E2A\u8C31\u6709\u597D\u51E0\u4E2A\u8C03\u600E\u4E48\u7B97\u300D\uFF09\n  inputScale: string;                 // pad \u7684\u8C03\u5F0F\uFF08src/score/scales.ts \u7684 id\uFF09\uFF0C\u9ED8\u8BA4\u5927\u8C03\uFF1B\u53EA\u7BA1 pad \u4E0A\u6392\u54EA\u4E9B\u97F3\uFF08user\u300C1=F\u80FD\u4E0D\u80FD\u4E5F\u505A\u6210\u4E24\u4E2A\u7684\u6EDA\u8F6E\uFF0C\u53F3\u8FB9\u53EF\u4EE5\u6362\u8C03\u6027\u300D\uFF09\n}\n\n/** \u672C\u6B21\u8F93\u5165\u8BB0\u5F55\uFF1A\u9000\u683C\u64A4\u56DE\u6700\u540E\u4E00\u7B14\uFF08\u5199\u5B57\u5934\u5728\uFF0C\u8BB0\u5F55\u5C31\u5728\uFF09\u3002 */\nexport type LogEntry =\n  | { k: \"ins\"; id: number; unit: number; ate?: number }   // \u5199\u4E86\u4E00\u4E2A\u97F3 / \u4F11\u6B62\uFF08unit = \u5199\u5165\u65F6\u7684\u65F6\u957F\uFF1Bate = \u5403\u6389\u4E86\u540E\u9762\u591A\u5C11\u4F11\u6B62\uFF0C\u64A4\u56DE\u65F6\u539F\u6837\u653E\u56DE\u53BB\uFF09\n  | { k: \"fill\"; id: number; unit: number }         // \u586B\u4E86\u4E00\u4E2A\u7A7A\u97F3\u9AD8\u7684\u97F3\uFF08\u8A5E\u5148\uFF09\n  | { k: \"ext\"; id: number; by: number; ate?: number }      // \u300C\u2212\u300D\u52A0\u957F\uFF08ate \u540C\u4E0A\uFF09\n  | { k: \"tie\"; id: number; unit: number };         // \u300C\u2212\u300D\u8DE8\u5C0F\u8282\u7EBF\u65B0\u5F00\u7684 tie \u97F3\n\nexport interface EditorState {\n  song: Song;\n  at: Focus;                                        // \u6B63\u5728\u5199 / \u6539\u7684\u90A3\u6761 track\n  caret: number;                                    // \u63D2\u5165\u70B9 0..tokens.length\uFF08sel \u4E3A null \u65F6 = \u5199\uFF09\n  sel: { from: number; to: number } | null;   // \u9009\u4E2D\u8303\u56F4 [from, to)\uFF08= \u6539\uFF09\uFF1B\u6B63\u597D\u4E00\u4E2A\u97F3 / \u4F11\u6B62 = \u6539\u8FD9\u4E2A\u97F3\uFF08singleSel\uFF09\n  nextId: number;\n  log: LogEntry[];\n  input: InputState;\n  /** \u70B9\u7684\u662F\u58F0\u90E8\u672B\u5C3E\u540E\u9762\u8865\u9F50\u7684\u6DE1\u8272\u5C0F\u8282\uFF08v0.10.6\uFF1Buser\u300C\u70B9\u5C0F\u8282\u5199\u8FD9\u91CC\u597D\u300D\u300C\u65B0\u8F68\u5728\u663E\u793A\u7684\u65F6\u5019\u81EA\u52A8\u8865\u9F50\u5C0F\u8282\u53F7\u3002\u7136\u540E\u81EA\u52A8\u8865\u7684\u4F11\u6B62\u4E5F\u662F\u81EA\u52A8\u7684\u6DE1\u8272\u300D\uFF09\uFF1A\n   *  \u5149\u6807\u5728 track \u5C3E\u5DF4\uFF0C\u4E0B\u4E00\u6B21\u5199\u97F3 / \u4F11\u6B62\u4E4B\u524D\u5148\u8865\u8FD9\u4E48\u957F\u7684\u4F11\u6B62\uFF08tick\uFF1B\u6309\u5C0F\u8282\u5207\u5F00\uFF09\u3002\u70B9\u4E00\u4E0B\u4E0D\u6539\u8C31\uFF0C\u5199\u7684\u90A3\u4E00\u523B\u624D\u843D\u8FDB\u53BB\uFF1B\u632A\u5149\u6807 / \u9009\u4E2D / \u4EFB\u4F55\u7F16\u8F91\u90FD\u6E05\u6389\u3002 */\n  lead?: number;\n}\n\n/** \u4E00\u6761 track \u5F00\u5934\u7684\u4E09\u4E2A\u8C31\u5934\u8BB0\u53F7\uFF08id \u4ECE id0 \u8D77\u8FDE\u7740\u7F16\uFF09\u3002 */\nexport function headTokens(m: { fifths?: number; beats?: number; beatType?: number; bpm?: number } = {}, id0 = 1): Token[] {\n  return [\n    { kind: \"key\", id: id0, fifths: m.fifths ?? DEFAULT_KEY },\n    { kind: \"time\", id: id0 + 1, beats: m.beats ?? DEFAULT_TIME.beats, beatType: m.beatType ?? DEFAULT_TIME.beatType },\n    { kind: \"tempo\", id: id0 + 2, bpm: m.bpm ?? DEFAULT_BPM },\n  ];\n}\nexport const FIRST_PART = \"P1\", FIRST_PAPER = \"p1\";\n/** \u65B0\u6B4C\uFF1A\u4E00\u5F20\u7EB8\u3001\u4E00\u4E2A\u58F0\u90E8\uFF08P1 \u2192 \u89D2\u8272 r1 \u2192 \u9EA6\u514B\u98CE m1\uFF09\uFF0C\u54FC\u7684\u5B57\u9ED8\u8BA4\u300C\u55EF\u300D\uFF08user 2026-10-07\u300C\u6708\u8BFB\u4E0D\u662F\u6709\u5566\u55EF\u54E6\u5417\uFF0C\u9ED8\u8BA4\u55EF\u300D\uFF09\u3002 */\nexport function emptySong(m: { fifths?: number; beats?: number; beatType?: number; bpm?: number } = {}): Song {\n  return { hum: \"n\", parts: [{ id: FIRST_PART, role: \"r1\", mic: \"m1\" }], papers: [{ id: FIRST_PAPER, name: \"\", tracks: { [FIRST_PART]: headTokens(m) } }] };\n}\n/** \u5355 track \u7684\u6B4C\uFF08\u6D4B\u8BD5 / \u8BFB\u522B\u5BB6\u5355\u58F0\u90E8\u8C31\u65F6\u987A\u624B\u7528\uFF09\u3002 */\nexport function songOf(tokens: Token[], rest: Partial<Omit<Song, \"parts\" | \"papers\">> = {}): Song {\n  return { hum: \"n\", ...rest, parts: [{ id: FIRST_PART, role: \"r1\", mic: \"m1\" }], papers: [{ id: FIRST_PAPER, name: \"\", tracks: { [FIRST_PART]: tokens } }] };\n}\nexport function initInput(): InputState { return { unit: DEFAULT_UNIT, tuplet: 0, acc: 0, accMode: \"off\", accAt: 0, inputFifths: 0, inputScale: \"major\" }; }\n/** \u6574\u9996\u6B4C\u6700\u5927\u7684 token id\uFF08\u65B0 id \u4ECE\u5B83\u540E\u9762\u7F16\uFF1B\u6240\u6709\u7EB8\u3001\u6240\u6709\u58F0\u90E8\u4E00\u8D77\u7B97\uFF0Cid \u5168\u6B4C\u552F\u4E00\uFF09\u3002 */\nexport function maxId(song: Song): number { let m = 0; for (const p of song.papers) for (const ts of Object.values(p.tracks)) for (const t of ts) m = Math.max(m, t.id); return m; }\n/** \u7B2C\u4E00\u6761\u6709\u5185\u5BB9\u7684 track\uFF08\u7B2C\u4E00\u5F20\u7EB8\u4E0A\u7B2C\u4E00\u4E2A\u5728\u573A\u7684\u58F0\u90E8\uFF09\u3002 */\nexport function firstFocus(song: Song): Focus {\n  const p = song.papers[0], part = song.parts.find((x) => p && p.tracks[x.id]) ?? song.parts[0];\n  return { paper: p?.id ?? FIRST_PAPER, part: part?.id ?? FIRST_PART };\n}\nexport function initState(song: Song = emptySong(), at: Focus = firstFocus(song)): EditorState {\n  return { song, at, caret: trackOf(song, at.paper, at.part).length, sel: null, nextId: maxId(song) + 1, log: [], input: initInput() };\n}\n/** \u67D0\u5F20\u7EB8\u4E0A\u67D0\u58F0\u90E8\u7684 token \u4E32\uFF08\u6CA1\u6709\u8FD9\u6761 = \u7A7A\uFF09\u3002 */\nexport function trackOf(song: Song, paper: string, part: string): Token[] { return song.papers.find((p) => p.id === paper)?.tracks[part] ?? []; }\n/** \u7B2C\u4E00\u5F20\u7EB8\u4E0A\u7B2C\u4E00\u4E2A\u58F0\u90E8\u7684\u90A3\u6761\uFF08\u5355 track \u7684\u6B4C\u5C31\u662F\u300C\u90A3\u4E32 token\u300D\uFF1B\u6D4B\u8BD5 / \u8BFB\u522B\u5BB6\u8C31\u7528\uFF09\u3002 */\nexport const firstTrack = (song: Song): Token[] => { const f = firstFocus(song); return trackOf(song, f.paper, f.part); };\n/** \u5149\u6807\u6240\u5728\u7684\u90A3\u6761 track\u3002 */\nexport const tr = (st: EditorState): Token[] => trackOf(st.song, st.at.paper, st.at.part);\n/** \u628A\u4E00\u6761 track \u6362\u6389\uFF08\u7EAF\u51FD\u6570\uFF09\u3002 */\nexport function withTrack(song: Song, paper: string, part: string, tokens: Token[]): Song {\n  return { ...song, papers: song.papers.map((p) => (p.id === paper ? { ...p, tracks: { ...p.tracks, [part]: tokens } } : p)) };\n}\n/** \u6362\u5230\u53E6\u4E00\u6761 track\uFF08\u70B9\u4E86\u522B\u7684\u8C31\u884C / \u522B\u7684\u7EB8\uFF09\uFF1A\u6E05\u9009\u4E2D\u3001\u6E05\u672C\u6B21\u8F93\u5165\u8BB0\u5F55\uFF1Bcaret \u9ED8\u8BA4\u653E\u5230\u90A3\u6761\u7684\u672B\u5C3E\u3002 */\nexport function setFocus(st: EditorState, paper: string, part: string, caret?: number): EditorState {\n  if (st.at.paper === paper && st.at.part === part && caret === undefined) return st;\n  const toks = trackOf(st.song, paper, part);\n  return { ...leave(st), at: { paper, part }, sel: null, caret: Math.max(headLen(toks), Math.min(toks.length, caret ?? toks.length)), lead: undefined };\n}\n\nexport const isTimed = (t: Token): t is Timed => t.kind === \"note\" || t.kind === \"rest\";\nexport const isMark = (t: Token): t is MarkTok => t.kind === \"key\" || t.kind === \"time\" || t.kind === \"tempo\";\n/** \u8C31\u5934 = \u5F00\u5934\u8FDE\u7740\u7684\u8BB0\u53F7\uFF1B\u5149\u6807\u6700\u5DE6\u53EA\u80FD\u5230\u5B83\u540E\u9762\u3002 */\nexport function headLen(tokens: Token[]): number { let n = 0; while (n < tokens.length && isMark(tokens[n])) n++; return n; }\nexport const isWriting = (st: EditorState): boolean => st.sel === null;\n\n// \u2500\u2500 \u67E5\u8BE2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u5149\u6807\u524D\u6700\u8FD1\u7684\u97F3\u7B26 / \u4F11\u6B62\uFF08\u8DF3\u8FC7\u5C0F\u8282\u7EBF\u3001\u8C03\u53F7\uFF09\u3002 */\nexport function currentIndex(st: EditorState): number {\n  for (let i = st.caret - 1; i >= 0; i--) if (isTimed(tr(st)[i])) return i;\n  return -1;\n}\n/** \u4E0B\u6807 i \u4E4B\u524D\u6700\u8FD1\u4E00\u4E2A\u6709\u97F3\u9AD8\u7684\u97F3\uFF08\u5C31\u8FD1\u89C4\u5219\u7684\u53C2\u7167\uFF09\u3002 */\nexport function prevPitch(tokens: Token[], i: number): Pitch | null {\n  for (let j = i - 1; j >= 0; j--) { const t = tokens[j]; if (t.kind === \"note\" && t.pitch) return t.pitch; }\n  return null;\n}\n/** \u7A7A\u97F3\u9AD8\u7684\u97F3\uFF1A\u663E\u793A\u548C\u64AD\u653E\u65F6\u6CBF\u7528\u524D\u4E00\u4E2A\u6709\u97F3\u9AD8\u7684\u97F3\uFF0C\u4EC0\u4E48\u90FD\u6CA1\u6709\u5C31\u662F HOME\u3002 */\nexport function effectivePitch(tokens: Token[], i: number): Pitch {\n  const t = tokens[i];\n  if (t.kind === \"note\" && t.pitch) return t.pitch;\n  return prevPitch(tokens, i) ?? HOME;\n}\n// \u2500\u2500 \u53E0\u97F3\uFF08polyphony\uFF0C2026-10-08\uFF1Buser\u300C\u540C\u65F6\u6309\u540C\u610F\u300D\u300C\u53E0 = \u53C8\u4E00\u4E2A shift lock \u952E\u2026\u5F00\u7684\u65F6\u5019\u5C31\u5F80\u524D\u4E00\u4E2A\u97F3\u4E0A\u9762\u53E0\uFF0C\u7136\u540E\u662F xor \u7684\u53E0\uFF08\u4F46\u662F\u4E0D\u4F1A\u5220\u6700\u540E\u4E00\u4E2A\u97F3\uFF09\u300D\uFF09 \u2500\u2500\n/** \u8FD9\u4E2A\u97F3\u4E0A\u7684\u5168\u90E8\u97F3\u9AD8\uFF08\u6700\u9AD8\u7684\u5728\u524D = pitch\uFF09\uFF1B\u6CA1\u97F3\u9AD8 = []\u3002 */\nexport const allPitches = (t: NoteTok): Pitch[] => (t.pitch ? [t.pitch, ...(t.chord ?? [])] : []);\n/** \u4E00\u7EC4\u97F3\u9AD8 \u2192 \u89C4\u8303\u5F62\uFF1A\u6309 midi \u4ECE\u9AD8\u5230\u4F4E\u3001\u540C midi \u53BB\u91CD\uFF1B\u6700\u9AD8\u7684 = pitch\uFF0C\u5176\u4F59 = chord\uFF08\u53EA\u6709\u4E00\u4E2A = \u4E0D\u5E26 chord\uFF09\u3002 */\nexport function withPitches(t: NoteTok, ps: Pitch[]): NoteTok {\n  const seen = new Set<number>(), sorted = [...ps].sort((a, b) => midiOf(b) - midiOf(a)).filter((p) => { const m = midiOf(p); if (seen.has(m)) return false; seen.add(m); return true; });\n  const { chord: _chord, ...rest } = t; void _chord;\n  if (!sorted.length) return noArp({ ...rest, pitch: null });\n  return sorted.length > 1 ? { ...rest, pitch: sorted[0], chord: sorted.slice(1) } : noArp({ ...rest, pitch: sorted[0] });\n}\n/** \u7436\u97F3\u53EA\u6302\u5728\u548C\u5F26\u4E0A\uFF08v0.9.46\uFF1Buser\u300C\u53EA\u6709\u548C\u5F26\u624D\u6709\uFF0C\u53D8\u6210\u5355\u97F3\u65F6\u81EA\u52A8\u4E22\uFF0C\u5BF9\u5427\uFF1F\u300D\uFF09\uFF1A\u53D8\u6210\u5355\u97F3 = \u53BB\u6389\u3002\u6539\u97F3\u9AD8\u90FD\u8D70 withPitches\uFF0C\u5728\u8FD9\u91CC\u4E00\u5904\u6536\u3002 */\nfunction noArp(t: NoteTok): NoteTok {\n  if (!t.art?.includes(\"arpeggio\")) return t;\n  const art = t.art.filter((a) => a !== \"arpeggio\"); if (art.length) return { ...t, art };\n  const { art: _a, ...rest } = t; return rest;\n}\n/** \u53E0 / \u62FF\u6389\u4E00\u4E2A\u97F3\u9AD8\uFF08XOR\uFF1B\u6700\u540E\u4E00\u4E2A\u6C38\u8FDC\u7559\u7740\uFF09\u3002 */\nexport function toggleChordPitch(st: EditorState, i: number, p: Pitch): EditorState {\n  const t = tr(st)[i]; if (!t || t.kind !== \"note\" || !t.pitch) return st;\n  const ps = allPitches(t), m = midiOf(p), has = ps.some((q) => midiOf(q) === m);\n  if (has && ps.length <= 1) return st;\n  const nt = tr(st).slice(); nt[i] = withPitches(t, has ? ps.filter((q) => midiOf(q) !== m) : [...ps, p]);\n  return next(st, nt);\n}\n/** pad \u7684\u300C\u53E0\u300D\uFF1A\u5F80\u524D\u4E00\u4E2A\u97F3\uFF08\u6709\u9009\u4E2D = \u9009\u4E2D\u7684\u7B2C\u4E00\u4E2A\u97F3\uFF09\u4E0A\u53E0\uFF08\u6302\u7740\u7684\u5347\u964D\u4E00\u6837\u7528\u6389\uFF09\u3002 */\n/** \u7535\u8111\u952E\u76D8 Shift+1\u20137 = \u53E0\u4E00\u7EA7\u4E0A\u53BB\uFF082026-10-10 user\u300Cshift\u65E7\u7684\u529F\u80FD\u4E0D\u8981\uFF0Cshift\u7528\u6765\u53E0\u97F3\u8F93\u5165\u548C\u5F26\uFF0C\u4EE5\u53CApc\u4E0A\u9762\u53E0\u529F\u80FD\u627E\u4E0D\u5230\u4E86\u300D\uFF09\uFF1A\n *  \u53E0\u5230\u54EA\u4E2A\u97F3 = \u540C stackPitch\uFF08\u6709\u9009\u533A = \u5199\u5B57\u5934\u524D\u90A3\u4E2A / \u9009\u533A\u7B2C\u4E00\u4E2A\u97F3\uFF1B\u6CA1\u6709 = \u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF09\uFF1B\u97F3\u9AD8 = \u8FD9\u4E00\u7EA7\u79BB\u90A3\u4E2A\u97F3\u73B0\u6709\u7684\u51E0\u4E2A\u97F3\u91CC\u6700\u8FD1\u7684\u90A3\u4E2A\u7684\u4F4D\u7F6E\uFF08\u4E00\u6837\u8FD1\u53D6\u4E0A\u9762\uFF09\uFF0C\n *  \u6240\u4EE5 C \u2192 Shift+3 = E\uFF08\u4E0A\u9762\uFF09\u3001G \u2192 Shift+3 = E\uFF08\u4E0B\u9762\uFF09\u3001C E \u2192 Shift+5 = G\u3002\u5DF2\u7ECF\u6709\u8FD9\u4E2A\u97F3 = \u53BB\u6389\uFF08XOR\uFF0C\u540C pad\u300C\u53E0\u300D\uFF09\u3002 */\nexport function stackDegree(st: EditorState, degree: number): EditorState {\n  const toks = tr(st), one = singleSel(st), i = st.sel ? (one >= 0 ? one : firstNoteIn(st)) : currentIndex(st);\n  const t = i >= 0 ? toks[i] : undefined;\n  if (t?.kind !== \"note\" || !t.pitch) return st;\n  let best: Pitch | null = null, bestD = Infinity;\n  for (const ref of [t.pitch, ...(t.chord ?? [])]) {\n    const c = placeDegree(degree, inputKey(st), ref, \"near\"), d = Math.abs(midiOf(c) - midiOf(ref));\n    if (d < bestD || (d === bestD && best && midiOf(c) > midiOf(best))) { best = c; bestD = d; }\n  }\n  return best ? stackPitch(st, best) : st;\n}\nexport function stackPitch(st: EditorState, pitch0: Pitch): EditorState {\n  const input = consumeAcc(st.input);\n  if (singleSel(st) >= 0) return writePitch(st, pitch0);   // \u53EA\u9009\u4E86\u4E00\u4E2A = \u6539\u8FD9\u4E2A\u97F3\uFF08XOR\uFF0C\u6700\u540E\u4E00\u4E2A\u62FF\u6389 = \u4F11\u6B62\uFF09\n  if (st.sel) {   // \u9009\u4E86\u597D\u51E0\u4E2A = \u53E0\u5230\u9009\u533A\u91CC\u7B2C\u4E00\u4E2A\u97F3\u4E0A\uFF08\u952E\u76D8\u53EA\u7BA1\u6253\u8C31\uFF0C\u6574\u7EC4\u7684\u64CD\u4F5C\u5728\u9009\u533A\u6761\u91CC\uFF09\n    const i = firstNoteIn(st);\n    if (i < 0 || tr(st)[i].kind !== \"note\") return { ...st, input };\n    return toggleChordPitch({ ...st, input }, i, keySpell(applyAcc(pitch0, st.input), keyAt(tr(st), i)));\n  }\n  const i = currentIndex(st);\n  if (i < 0 || tr(st)[i].kind !== \"note\") return { ...st, input };\n  const pitch = keySpell(applyAcc(pitch0, st.input), keyAt(tr(st), i));   // \u6309\u8C31\u4E0A\u7684\u8C03\u53F7\u7B80\u5316\u62FC\u5199\uFF08\u540C writePitch\uFF09\n  return toggleChordPitch({ ...st, input }, i, pitch);\n}\n/** \u53EA\u6709\u8FD9\u4E00\u5F20\u7EB8\u7684\u6B4C\uFF08\u672C\u6BB5\u89C6\u56FE\u7684\u64AD\u653E\u8303\u56F4\uFF1Buser 2026-10-08\u300C\u4E3A\u4EC0\u4E48\u5728\u672C\u6BB5\u89C6\u56FE\u4E0B\u64AD\u653E\u8FD8\u662F\u64AD\u653E\u5168\u90E8\u4E86\uFF1F\u300D\uFF09\u3002 */\n/** \u53EA\u8981\u8FD9\u4E00\u5F20\u7EB8\uFF08\u300C\u672C\u6BB5\u300D\u653E / \u5BFC\u51FA\u8FD9\u4E00\u6BB5\uFF09\u3002\u70B9\u540D\u8981\u5B83 = \u9690\u85CF\u7684\u4E5F\u653E\uFF08user 2026-10-08\u300C\u9690\u85CF\u7684\u6B4C\u6BB5\u5728solo\u9884\u89C8\u7684\u65F6\u5019\u8FD8\u662F\u5E94\u8BE5\u53EF\u4EE5\u653E\u7684\u300D\uFF09\uFF1A\u9690\u85CF\u53EA\u7BA1\u6574\u9996\u653E / \u538B\u5E73\u4EF6\u8DF3\u8FC7\u5B83\u3002 */\nexport const songOnlyPaper = (song: Song, paperId: string): Song => { const { arrangement: _a, ...rest } = song; return { ...rest, papers: song.papers.filter((p) => p.id === paperId).map(({ hidden: _h, ...p }) => p) }; };   // \u672C\u6BB5 = \u53EA\u8FD9\u4E00\u5F20\uFF0C\u7F16\u6392\u4E0D\u7BA1\n\n/** \u4E0B\u6807 i \u5904\uFF08i \u4E4B\u524D\u6700\u8FD1\u7684\u90A3\u4E2A\u8BB0\u53F7\uFF09\u751F\u6548\u7684\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\uFF08\u4E00\u6761 track \u5185\uFF09\u3002 */\nexport function keyAt(tokens: Token[], i: number): number {\n  let f = DEFAULT_KEY;\n  for (let j = 0; j < i && j < tokens.length; j++) { const t = tokens[j]; if (t.kind === \"key\") f = t.fifths; }\n  return f;\n}\nexport function timeAt(tokens: Token[], i: number): { beats: number; beatType: number } {\n  let v = DEFAULT_TIME;\n  for (let j = 0; j < i && j < tokens.length; j++) { const t = tokens[j]; if (t.kind === \"time\") v = t; }\n  return { beats: v.beats, beatType: v.beatType };\n}\nexport function tempoAt(tokens: Token[], i: number): number {\n  let v = DEFAULT_BPM;\n  for (let j = 0; j < i && j < tokens.length; j++) { const t = tokens[j]; if (t.kind === \"tempo\") v = t.bpm; }\n  return v;\n}\n/** \u901F\u5EA6\u7684\u300C\u8BED\u4E49\u300D\uFF1A\u6570\u636E\u53EA\u5B58 bpm\uFF08\u7EDD\u5BF9\u7684\u90A3\u4E2A\u6570\uFF09\uFF0C\u8BCD\u6309 bpm \u843D\u5728\u54EA\u4E00\u6863\u63A8\u51FA\u6765\uFF0C\u8C31\u4E0A\u753B\u300C\u8BCD \u2669 = \u6570\u300D\n *  \uFF08user\u300C\u901F\u5EA6\u8BB0\u53F7\u53EF\u4EE5\u7528\u8BED\u4E49+\u6570\u5B57\u5417\u3002\u7EDD\u5BF9\u96F6\u5EA6\u3002\u300D\uFF09\u3002typical = \u5019\u9009\u91CC\u70B9\u8FD9\u4E2A\u8BCD\u65F6\u7ED9\u7684 bpm\uFF1B\u6863\u7684\u8FB9\u754C\u662F\u5E38\u89C1\u8303\u56F4\u53D6\u7684\u6574\u6570\u3002 */\nexport const TEMPO_WORDS: { from: number; it: string; zh: string; typical: number }[] = [\n  { from: 0, it: \"Largo\", zh: \"\u5E7F\u677F\", typical: 50 },\n  { from: 60, it: \"Larghetto\", zh: \"\u5C0F\u5E7F\u677F\", typical: 63 },\n  { from: 66, it: \"Adagio\", zh: \"\u67D4\u677F\", typical: 70 },\n  { from: 76, it: \"Andante\", zh: \"\u884C\u677F\", typical: 88 },\n  { from: 100, it: \"Moderato\", zh: \"\u4E2D\u677F\", typical: 108 },\n  { from: 112, it: \"Allegretto\", zh: \"\u5C0F\u5FEB\u677F\", typical: 116 },\n  { from: 120, it: \"Allegro\", zh: \"\u5FEB\u677F\", typical: 132 },\n  { from: 156, it: \"Vivace\", zh: \"\u6D3B\u677F\", typical: 160 },\n  { from: 176, it: \"Presto\", zh: \"\u6025\u677F\", typical: 184 },\n  { from: 200, it: \"Prestissimo\", zh: \"\u6700\u6025\u677F\", typical: 208 },\n];\n/** \u901F\u5EA6\u80FD\u5199\u591A\u5C11\uFF08\u2669 = \u6BCF\u5206\u949F\u51E0\u4E2A\u56DB\u5206\u97F3\u7B26\uFF09\uFF1A\u6253\u5B57\u548C\u901F\u5EA6\u6846\u7684\u6EDA\u8F6E\u540C\u4E00\u4E2A\u8303\u56F4\uFF08user 2026-10-07\u300Ctyping\u5230400\u7684\u8BDDwheel\u4E5F\u5230400\u6216\u8005\u90FD300\u2026\u53CD\u6B63\u5BF9\u9F50\u4E00\u70B9\u300D\uFF09\u3002\n *  \u4E0A\u9650 400\uFF1A2/2 \u7684\u5FEB\u6B4C\u300C\u4E8C\u5206\u97F3\u7B26 = 160\u300D\u5728\u8FD9\u91CC\u662F \u2669 = 320\uFF0Cbebop / \u901F\u6838\u4E5F\u8FC7 300\uFF1B\u5531\u6B4C\u672C\u8EAB\u7528\u4E0D\u5230\u8FD9\u4E48\u5FEB\uFF0C\u4F46\u6CA1\u6709\u6280\u672F\u7406\u7531\u5361\u3002 */\nexport const TEMPO_MIN = 20, TEMPO_MAX = 400;\nexport function tempoWord(bpm: number): { it: string; zh: string } {\n  let w = TEMPO_WORDS[0];\n  for (const x of TEMPO_WORDS) if (bpm >= x.from) w = x;\n  return w;\n}\n/** \u4E00\u62CD\u591A\u5C11 tick\uFF08\u7B26\u6760\u6309\u62CD\u5206\u7EC4\u7528\uFF09\uFF1Ax/2 x/4 x/8 = \u90A3\u4E2A\u97F3\u7B26\uFF1B6/8 9/8 12/8 \u8FD9\u7C7B\u590D\u62CD\u5B50 = \u9644\u70B9\u56DB\u5206\u3002 */\nexport function beatTicks(beats: number, beatType: number): number {\n  return beatType === 8 && beats > 3 && beats % 3 === 0 ? (WHOLE * 3) / 8 : WHOLE / beatType;\n}\n/** \u5199\u7684\u65F6\u5019\u300C1=\u300D= \u624B\u52A8\u8BBE\u8FC7\u7684\uFF0C\u5426\u5219\u8DDF\u5149\u6807\u5904\u7684\u8C03\u53F7\u3002 */\nexport const inputKey = (st: EditorState): number => st.input.inputFifths;\n/** \u4E0B\u4E00\u4E2A\u8981\u5199\u7684\u97F3\u7684\u65F6\u957F = \u5F53\u524D\u6863 \u00D7\uFF08\u8FDE\u97F3\u6BD4\u4F8B\uFF09\u3002 */\nexport function unitDur(input: InputState): number {\n  const plain = LADDER[input.unit];\n  if (!input.tuplet) return plain;\n  const [m, n] = TUPLET[input.tuplet];\n  return (plain * m) / n;\n}\nconst indexOfId = (tokens: Token[], id: number) => tokens.findIndex((t) => t.id === id);\n\n// \u2500\u2500 \u5C0F\u5DE5\u5177 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction next(st: EditorState, tokens: Token[], patch: Partial<EditorState> = {}): EditorState {\n  const caret = Math.max(headLen(tokens), Math.min(tokens.length, patch.caret ?? st.caret));\n  return { ...st, ...patch, song: withTrack(st.song, st.at.paper, st.at.part, tokens), caret, lead: patch.lead };\n}\n/** \u632A\u5149\u6807 / \u9009\u4E2D = \u79BB\u5F00\u300C\u672C\u6B21\u8F93\u5165\u300D\uFF0C\u8BB0\u5F55\u6E05\u7A7A\u3002 */\nconst leave = (st: EditorState): EditorState => (st.log.length ? { ...st, log: [] } : st);\nconst validDur = (d: number) => Number.isInteger(d) && d >= MIN_DUR && d <= MAX_DUR;\n\n/** \u53EA\u54CD\u4E0D\u5199\uFF08\u5373\u5174\uFF09\u7684\u90A3\u4E2A\u97F3\uFF1A\u5E26\u4E0A\u6302\u7740\u7684 \u266F / \u266D\uFF0C\u300C\u53EA\u7BA1\u4E0B\u4E00\u4E2A\u97F3\u300D\u7684\u90A3\u4E00\u6B21\u7167\u6837\u7528\u6389\uFF08user\u300C\u5347\u964D\u53F7\u4E3A\u4EC0\u4E48\u5BF9preview\u6CA1\u7528\uFF0C\u4E5F\u6CA1\u6709ui\u4E0A\u9762\u7684\u53CD\u5E94\u300D\uFF09\u3002 */\nexport function soundingPitch(st: EditorState, p: Pitch): { pitch: Pitch; st: EditorState } {\n  if (!st.input.acc) return { pitch: p, st };\n  return { pitch: applyAcc(p, st.input), st: { ...st, input: consumeAcc(st.input) } };\n}\n/** \u7528\u6389\u4E00\u6B21 Shift\uFF1A\u4E00\u6B21\u6027\u7684\u7528\u5B8C\u5C31\u5173\uFF0C\u9501\u5B9A\u7684\u7559\u7740\u3002 */\nfunction consumeAcc(input: InputState): InputState { const l = latchWrite({ ...LATCH_OFF, mode: input.accMode, at: input.accAt, left: 1 }); return l.mode === input.accMode ? input : { ...input, acc: l.mode === \"off\" ? 0 : input.acc, accMode: l.mode }; }\nfunction applyAcc(p: Pitch, input: InputState): Pitch { return input.acc ? alterBy(p, input.acc) : p; }\n\n/** \u5199\u7684\u65F6\u5019\uFF1A\u5149\u6807\u540E\uFF08\u8DF3\u8FC7\u5C0F\u8282\u7EBF\u3001\u8BB0\u53F7\uFF09\u7B2C\u4E00\u4E2A\u662F\u7A7A\u97F3\u9AD8\u7684\u97F3\u7B26\uFF0C\u5C31\u586B\u5B83\u800C\u4E0D\u662F\u63D2\uFF08\u8A5E\u5148\uFF09\u3002 */\nfunction fillTarget(st: EditorState): number {\n  for (let i = st.caret; i < tr(st).length; i++) {\n    const t = tr(st)[i];\n    if (t.kind === \"bar\" || t.kind === \"phrase\" || t.kind === \"dyn\" || t.kind === \"hairpin\" || t.kind === \"groove\" || t.kind === \"nav\" || t.kind === \"clef\" || t.kind === \"ottava\" || isMark(t)) continue;\n    return t.kind === \"note\" && t.pitch === null ? i : -1;\n  }\n  return -1;\n}\n\n// \u2500\u2500 \u5199\uFF08\u5149\u6807\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u5199\u4E00\u4E2A\u97F3\uFF08\u7ED9\u5B9A\u97F3\u9AD8\uFF1Apad / \u6307\u9488\uFF09\uFF08v0.10.5\uFF0Cai-docs/20261010-keyboard-selection-rules.md\uFF09\uFF1A\n *  \u00B7 \u5149\u6807 = \u5199\u97F3\u9ED8\u8BA4\u8986\u76D6\u4F11\u6B62\uFF08overwriteInsert\uFF1A\u5149\u6807\u540E\u7D27\u6328\u7740\u7684\u4F11\u6B62\u5148\u5403\uFF0C\u4E0D\u591F\u624D\u63A8\u540E\u9762\u7684\uFF09\uFF1B\n *  \u00B7 \u53EA\u9009\u4E86\u4E00\u4E2A\u97F3 / \u4F11\u6B62 = \u6539\u8FD9\u4E2A\u97F3\uFF08XOR\uFF1A\u53E0\u4E0A / \u62FF\u6389\uFF0C\u6700\u540E\u4E00\u4E2A\u62FF\u6389 = \u4E00\u6837\u957F\u7684\u4F11\u6B62\uFF0C\u4F11\u6B62\u4E0A\u6309 = \u53D8\u56DE\u97F3\uFF1Bmono = \u5355\u58F0\u4E50\u5668\u7684\u58F0\u90E8\uFF0C\u6362\u97F3\u9AD8\u4E0D\u53E0\uFF09\uFF1B\n *  \u00B7 \u9009\u4E86\u597D\u51E0\u4E2A = \u66FF\u6362\u6574\u6BB5\uFF08\u9009\u4E2D\u7684\u5168\u53D8\u4F11\u6B62\u3001\u6536\u6210\u5F00\u5934\u7684\u5149\u6807\uFF0C\u518D\u6309\u8986\u76D6\u4F11\u6B62\u5199\uFF1B\u65B0\u97F3\u63A5\u8FC7\u539F\u6765\u7B2C\u4E00\u4E2A\u97F3\u7684\u6B4C\u8BCD\uFF09\u3002\n *  raw = \u97F3\u9AD8\u5DF2\u7ECF\u5E26\u597D\u4E86 \u266F / \u266D\uFF08\u53E0\u97F3\u5224\u636E\u300C\u89C2\u671B\u300D\u540E\u8865\u5199\u7684\u90A3\u4E00\u4E0B\uFF1A\u6309\u4E0B\u65F6\u5C31\u7B97\u8FC7\u4E00\u6B21 Shift \u4E86\uFF09\uFF0C\u4E0D\u518D\u5957\u3001\u4E0D\u518D\u7528\u6389 Shift\u3002 */\nexport function writePitch(st: EditorState, pitch0: Pitch, raw = false, mono = false): EditorState {\n  const one = singleSel(st);\n  if (one >= 0) return xorSingle(st, one, keySpell(raw ? pitch0 : applyAcc(pitch0, st.input), keyAt(tr(st), one)), raw ? st.input : consumeAcc(st.input), mono);\n  if (st.sel) { const n = fillSel({ ...st, input: raw ? st.input : consumeAcc(st.input) }, { kind: \"note\", pitch: keySpell(raw ? pitch0 : applyAcc(pitch0, st.input), keyAt(tr(st), st.sel.from)) }); return n; }   // \u9009\u4E86\u597D\u51E0\u4E2A = \u6362\u6210\u4E00\u4E2A\u4E00\u6837\u957F\u7684\u97F3\uFF0C\u63A5\u7740\u6539\u5B83\n  if (st.lead) st = materializeLead(st);   // \u70B9\u7684\u662F\u540E\u9762\u8865\u9F50\u7684\u6DE1\u8272\u5C0F\u8282\uFF1A\u5148\u628A\u524D\u9762\u7A7A\u7740\u7684\u843D\u6210\u4F11\u6B62\n  const f = fillTarget(st), at = f >= 0 ? f : st.caret;\n  // \u6309\u8C31\u4E0A\u7684\u8C03\u53F7\u7B80\u5316\u62FC\u5199\uFF1Apad \u7684\u300C1=\u300D\u662F\u5B83\u81EA\u5DF1\u7684\uFF08user\u300C\u628Apad\u60F3\u6210\u4E00\u4E2A\u72EC\u7ACB\u7684medo\u5F0F\u7684\u8F93\u5165\u8BBE\u5907\u300D\uFF09\uFF0C\u97F3\u843D\u8FDB\u8C31\u65F6\u8C03\u5185\u7684\u97F3\u7528\u8C31\u4E0A\u8C03\u53F7\u7684\u5199\u6CD5\u2014\u2014\n  //   pad 1=C \u6309 \u266D \u5199\u7684 A\u266D \u5728\u4E94\u4E2A\u5347\u53F7\u7684\u8C03\u91CC = G\u266F\uFF08user 2026-10-08\u300C\u5347\u964D\u53F7\u7684\u6B67\u4E49\u5BFC\u81F4\u7684\u6CA1\u6709\u81EA\u52A8\u7B80\u5316\u600E\u4E48\u529E\u300D\uFF09\uFF1B\u8C03\u5916\u97F3\u7167 pad \u5199\u7684\n  const pitch = keySpell(raw ? pitch0 : applyAcc(pitch0, st.input), keyAt(tr(st), at)), input = raw ? st.input : consumeAcc(st.input);\n  if (f >= 0) {\n    const t = tr(st)[f] as NoteTok, tokens = tr(st).slice(); tokens[f] = { ...t, pitch };\n    return next(st, tokens, { caret: f + 1, input, log: [...st.log, { k: \"fill\", id: t.id, unit: t.dur }] });\n  }\n  const dur = unitDur(st.input), id = st.nextId, o = overwriteInsert(tr(st), st.caret, { kind: \"note\", id, pitch, dur, lyric: null });\n  return next(st, o.tokens, { caret: o.at + 1, nextId: id + 1, input, log: [...st.log, { k: \"ins\", id, unit: dur, ...(o.ate ? { ate: o.ate } : {}) }] });\n}\n\n/** \u5199\u4E00\u4E2A\u97F3\uFF1A\u8C03\u91CC\u7B2C\u51E0\u7EA7 + \u65B9\u5411\uFF08\u952E\u76D8\u6570\u5B57 / QWERTYU / Shift\uFF1Bpad \u4E5F\u80FD\u8D70\u8FD9\u91CC\uFF09\u3002\u53C2\u7167 = \u843D\u70B9\u524D\u6700\u8FD1\u4E00\u4E2A\u6709\u97F3\u9AD8\u7684\u97F3\u3002 */\nexport function writeDegree(st: EditorState, degree: number, dir: Dir, mono = false): EditorState {\n  const one = singleSel(st);\n  if (one >= 0) {   // \u6539\u8FD9\u4E2A\u97F3\uFF1A\u53C2\u7167 = \u5B83\u81EA\u5DF1\u7684\u51E0\u4E2A\u97F3\u91CC\u79BB\u8FD9\u4E00\u7EA7\u6700\u8FD1\u7684\u90A3\u4E2A\uFF08\u540C Shift+\u7EA7\u6570 \u53E0\uFF09\uFF1B\u4F11\u6B62 = \u524D\u9762\u90A3\u4E2A\u97F3\n    const t = tr(st)[one], refs = t.kind === \"note\" && t.pitch ? allPitches(t) : [prevPitch(tr(st), one)];\n    let best: Pitch | null = null, bestD = Infinity;\n    for (const ref of refs) { const c = placeDegree(degree, inputKey(st), ref, ref ? \"near\" : dir), d = ref ? Math.abs(midiOf(c) - midiOf(ref)) : 0; if (d < bestD || (d === bestD && best && midiOf(c) > midiOf(best))) { best = c; bestD = d; } }\n    return best ? writePitch(st, best, false, mono) : st;\n  }\n  let at: number;\n  if (st.sel) at = st.sel.from;   // \u9009\u4E86\u597D\u51E0\u4E2A\uFF1A\u53C2\u7167 = \u9009\u533A\u524D\u9762\u90A3\u4E2A\u97F3\n  else { const f = fillTarget(st); at = f >= 0 ? f : st.caret; }\n  if (at < 0) return st;\n  return writePitch(st, placeDegree(degree, inputKey(st), prevPitch(tr(st), at), dir), false, mono);\n}\n\nexport function writeRest(st: EditorState): EditorState {\n  const one = singleSel(st);\n  if (one >= 0) { const t = tr(st)[one]; if (t.kind !== \"note\") return st; const nt = tr(st).slice(); nt[one] = { kind: \"rest\", id: t.id, dur: t.dur }; dropTieAfter(nt, one); return next(st, nt); }   // \u6539\u8FD9\u4E2A\u97F3\uFF1A\u53D8\u6210\u4E00\u6837\u957F\u7684\u4F11\u6B62\n  if (st.sel) return fillSel(st, { kind: \"rest\" });   // \u9009\u4E86\u597D\u51E0\u4E2A = \u6362\u6210\u4E00\u6837\u957F\u7684\u4F11\u6B62\n  if (st.lead) st = materializeLead(st);\n  // \u5149\u6807\u5904\u6253\u4F11\u6B62\uFF08v0.10.40\uFF09\uFF1A\u548C\u5199\u97F3\u540C\u4E00\u4E2A overwriteInsert\u2014\u2014\u5149\u6807\u540E\u9762\uFF08\u8DF3\u8FC7\u4E0D\u5360\u65F6\u503C\u7684\u8BB0\u53F7\uFF09\u7D27\u6328\u7740\u4F11\u6B62 = \u53EA\u5F80\u524D\u8D70\u3001\u5403\u6389\u90A3\u4E48\u957F\u7684\u4F11\u6B62\uFF08\u62C6\u5F00\uFF0C\u540E\u9762\u4E0D\u632A\uFF1B\u4E0D\u591F\u7684\u90A3\u622A\u624D\u63A8\uFF09\uFF1B\n  //   \u540E\u9762\u662F\u97F3 = \u63D2\u8FDB\u53BB\u3001\u540E\u9762\u7684\u5F80\u540E\u63A8\uFF08v0.10.19 user\u300Ctype 0: push forward\u300D\u7BA1\u7684\u662F\u8FD9\u79CD\uFF09\u3002user\u300C\u5149\u6807\u540E\u9762\u662F\u4F11\u6B62\u65F6\uFF0C\u5199\u4F11\u6B62\u53EA\u5F80\u524D\u8D70\u3001\u5403\u6389\u90A3\u4E48\u957F\u7684\u4F11\u6B62\uFF08\u4E0D\u5F80\u540E\u63A8\uFF09\uFF1B\n  //   \u540E\u9762\u662F\u97F3\u5219\u7167\u65E7\u63D2\u5165\u3002\u8FD9\u6837\u5728\u5DF2\u7ECF\u4E71\u4E86\u7684\u5C0F\u8282\u91CC\u4E5F\u80FD\u6570\u5230\u7B2C\u51E0\u62CD\u518D\u5199\u3002\u5BF9\u300D\u3002\u232B \u64A4\u56DE = \u5403\u6389\u7684\u653E\u56DE\u53BB\uFF08\u540C\u5199\u97F3\uFF09\u3002\n  const dur = unitDur(st.input), id = st.nextId, o = overwriteInsert(tr(st), st.caret, { kind: \"rest\", id, dur } as Timed);\n  return next(st, o.tokens, { caret: o.at + 1, nextId: id + 1, log: [...st.log, { k: \"ins\", id, unit: dur, ...(o.ate ? { ate: o.ate } : {}) }] });\n}\n\n// \u2500\u2500 \u5199\u97F3\u8986\u76D6\u4F11\u6B62 / \u9009\u533A\u8F93\u5165 / \u6539\u4E00\u4E2A\u97F3\uFF08v0.10.5\uFF0Cai-docs/20261010-keyboard-selection-rules.md\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// user 2026-10-10\u300C\u8981\u4E0D\u8981\u8F93\u5165\u4F1A\u9ED8\u8BA4\u8986\u76D6\u4F11\u6B62\u7A7A\u95F4\uFF1F\u2026\u53EA\u6709\u6CA1\u6709\u4F11\u6B62\u7A7A\u95F4\u65F6\u624D\u4F1A\u63A8\u540E\u9762\u7684\u3002\u7136\u540E\u53EA\u5728\u9009\u533A\u91CC\u9762\u6539\u7684\u529F\u80FD\u4E0D\u8981\u4E86\uFF0C\u9009\u62E9\u7684\u65F6\u5019\u8F93\u5165\u97F3\u7B26\u53D8\u6210\u66FF\u6362\u65E7\u7684\uFF0C\u5269\u4E0B\u7684\u7A7A\u95F4\u53D8\u6210\u4F11\u6B62\u3002\u9009\u533A\u53D8\u6210\u5149\u6807\u300D\n//   \u300C\u9009\u4E2D\u5355\u97F3\u7684\u65F6\u5019\u2026\u53EF\u4EE5xor\u5230\u4FDD\u7559\u65F6\u957F\u7684\u4F11\u6B62\u7B26\u2026\u53E0\u8FD9\u4E2A\u5B57\u5C31\u7528\u6765\u9009\u4E2D\u4E0A\u4E2A\uFF0C\u7136\u540E\u4F60\u4E5F\u53EF\u4EE5\u8C03\u65F6\u957F\u300D\u2192 AI \u63D0\u8BAE \u2192 user\u300C\u540C\u610F\u300D\u3002\n\n/** \u53EA\u9009\u4E86\u4E00\u4E2A\u97F3 / \u4F11\u6B62\uFF08= \u6539\u8FD9\u4E2A\u97F3\uFF09\uFF1A\u5B83\u7684\u4E0B\u6807\uFF1B\u4E0D\u662F = -1\u3002\u9009\u533A\u91CC\u4E0D\u5360\u65F6\u503C\u7684\u8BB0\u53F7\u4E0D\u7B97\u3002 */\nexport function singleSel(st: EditorState): number {\n  if (!st.sel) return -1;\n  let k = -1; const tk = tr(st);\n  for (let i = st.sel.from; i < st.sel.to; i++) if (isTimed(tk[i])) { if (k >= 0) return -1; k = i; }\n  return k;\n}\n/** \u4ECE i \u8D77\u5403\u6389\u7D27\u6328\u7740\u7684\u4F11\u6B62\uFF0C\u6700\u591A need \u90A3\u4E48\u957F\u3002\u53EA\u5403\u4F11\u6B62\uFF1A\u78B0\u5230\u97F3 / \u4EBA\u63D2\u7684\u300C|\u300D\u5C31\u505C\uFF1B\u4E2D\u95F4\u4E0D\u5360\u65F6\u503C\u7684\u8BB0\u53F7\u539F\u6837\u7559\u7740\uFF08keep\uFF0C\u6309\u539F\u6765\u7684\u987A\u5E8F\uFF09\u3002\n *  \u5403\u4E00\u534A\u7684\u4F11\u6B62\u7559\u4E0B\u5269\u7684\u90A3\u622A\uFF08\u4E5F\u5728 keep \u91CC\uFF09\uFF1B\u5269\u7684\u90A3\u622A\u4E0D\u662F\u5408\u6CD5\u65F6\u503C = \u8FD9\u4E2A\u4F11\u6B62\u4E0D\u5403\u3002end = \u5403\u5230\u54EA\uFF08\u4E0D\u542B\uFF09\u3002 */\nfunction eatRests(tk: Token[], i: number, need: number): { got: number; end: number; keep: Token[] } {\n  let got = 0, j = i, end = i, kept = 0; const keep: Token[] = [];\n  while (j < tk.length && got < need) {\n    const t = tk[j];\n    if (t.kind === \"bar\" || t.kind === \"note\") break;\n    if (t.kind !== \"rest\") { keep.push(t); j++; continue; }\n    const left = t.dur - (need - got);\n    if (left > 0) { if (!validDur(left)) break; keep.push({ ...t, dur: left }); got = need; end = j + 1; kept = keep.length; break; }\n    got += t.dur; j++; end = j; kept = keep.length;\n  }\n  return { got, end, keep: keep.slice(0, kept) };\n}\n/** \u66F2\u7EA7\u8BB0\u53F7\uFF08\u529B\u5EA6\u5B57 / \u6E10\u5F3A\u6E10\u5F31 / \u98CE\u683C\uFF09\u8DDF\u7740\u5B83\u540E\u9762\u90A3\u4E2A\u97F3\uFF08\u590D\u5236\u3001\u6E05\u8BB0\u53F7\u90FD\u8FD9\u4E48\u7B97\uFF09\u3002 */\nconst isPhraseMark = (t: Token | undefined): boolean => !!t && (t.kind === \"dyn\" || t.kind === \"hairpin\" || t.kind === \"groove\");\n/** \u5149\u6807\u5904\u653E\u8FDB\u4E00\u4E2A\u6709\u65F6\u503C\u7684 token\uFF08\u5199\u97F3\u9ED8\u8BA4\u8986\u76D6\u4F11\u6B62\uFF09\uFF1A\u5149\u6807\u540E\uFF08\u8DF3\u8FC7\u4E0D\u5360\u65F6\u503C\u7684\u8BB0\u53F7\uFF09\u7D27\u6328\u7740\u7684\u662F\u4F11\u6B62 = \u653E\u5728\u90A3\u4E9B\u8BB0\u53F7\u540E\u9762\u3001\u5403\u6389 tok.dur \u90A3\u4E48\u957F\u7684\u4F11\u6B62\uFF0C\n *  \u4E0D\u591F\u7684\u90A3\u622A\u624D\u628A\u540E\u9762\u7684\u5F80\u540E\u63A8\uFF1B\u540E\u9762\u4E0D\u662F\u4F11\u6B62 = \u7167\u65E7\u63D2\u5728\u5149\u6807\u5904\uFF08\u5168\u63A8\uFF09\u3002at = \u65B0 token \u7684\u4E0B\u6807\uFF1Bate = \u5403\u4E86\u591A\u5C11\u4F11\u6B62\u3002 */\nfunction overwriteInsert(tk: Token[], caret: number, tok: Timed): { tokens: Token[]; at: number; ate: number } {\n  // \u7EB8\u4E0A\u8FD8\u6CA1\u6709\u97F3 / \u4F11\u6B62\uFF08\u5149\u6807\u524D\u9762\u53EA\u6709\u8C31\u5934\u548C\u8BB0\u53F7\uFF09+ \u5149\u6807\u540E\u9762\u7D27\u6328\u7740\u66F2\u7EA7\u8BB0\u53F7\uFF08\u7EB8\u5934\u5F3A\u5236\u7684\u529B\u5EA6\u2026\uFF09= \u5199\u5728\u5B83\u4EEC\u540E\u9762\uFF1A\u90A3\u4E2A\u529B\u5EA6\u662F\u7ED9\u7B2C\u4E00\u4E2A\u97F3\u7684\u3002\n  //   \u4E0D\u7136\u5199\u5728\u5B83\u524D\u9762 = \u7B2C\u4E00\u4E2A\u97F3\u524D\u9762\u6CA1\u529B\u5EA6 \u2192 \u53C8\u8865\u4E00\u4E2A\uFF08v0.10.41\uFF1Buser\u300C\u4E3A\u4EC0\u4E48\u7A7A\u6587\u6863\u6253\u5B57\u7684\u65F6\u5019\u4F1A\u6709\u4E24\u4E2Amf?\u300D\u300C\u5220\u4E86\u4E00\u4E2A\u8FD8\u6709\u4E00\u4E2A\u300D\u300C\u7136\u540E\u4E00\u6253\u5B57\u53C8duplicate\u4E86\u300D\uFF09\n  if (!tk.slice(headLen(tk), caret).some(isTimed)) while (caret < tk.length && isPhraseMark(tk[caret])) caret++;\n  let i = caret; while (i < tk.length && !isTimed(tk[i]) && tk[i].kind !== \"bar\") i++;\n  const e = tk[i]?.kind === \"rest\" ? eatRests(tk, i, tok.dur) : null;\n  if (!e || !e.got) { const nt = tk.slice(); nt.splice(caret, 0, tok); return { tokens: nt, at: caret, ate: 0 }; }\n  return { tokens: [...tk.slice(0, i), tok, ...e.keep, ...tk.slice(e.end)], at: i, ate: e.got };\n}\n/** i \u540E\u9762\u90A3\u4E2A\u6709\u65F6\u503C\u7684\u662F\u8FDE\u7740 i \u7684\u97F3\uFF08\u8FDE\u97F3\u7EBF\uFF09\u3001i \u4E0D\u518D\u662F\u90A3\u4E2A\u97F3\u4E86 = \u65AD\u5F00\uFF08\u539F\u5730\u6539 nt\uFF09\u3002 */\nfunction dropTieAfter(nt: Token[], i: number): void {\n  for (let j = i + 1; j < nt.length; j++) { const t = nt[j]; if (!isTimed(t)) continue; if (t.kind === \"note\" && t.tie) { const { tie: _t, ...rest } = t; void _t; nt[j] = rest as Token; } return; }\n}\n/** \u9009\u4E86\u597D\u51E0\u4E2A\u65F6\uFF1A\u6309\u97F3\u952E = \u6574\u6BB5\u6362\u6210\u4E00\u4E2A\u4E00\u6837\u957F\u7684\u97F3\u3001\u232B / \u4F11\u6B62\u952E = \u4E00\u6837\u957F\u7684\u4F11\u6B62\uFF0C\u7136\u540E\u9009\u4E2D\u5B83\uFF08= \u6539\u8FD9\u4E2A\u97F3\uFF1A\u63A5\u7740\u6309\u97F3\u952E\u53E0\u3001\u2014 / \u232B \u957F\u77ED\u4E00\u6B65\uFF09\u3002\n *  \u540E\u9762\u7684\u4E1C\u897F\u4E00\u4E2A tick \u90FD\u4E0D\u632A\uFF08v0.10.7\uFF1Buser\u300C\u6211\u77E5\u9053\u591A\u9009\u600E\u4E48\u529E\u4E86\uFF1A\u5982\u679C\u662F\u9000\u683C\u5C31\u66FF\u6362\u6210\u7B49\u957F\u7684\u4F11\u6B62\uFF0C\u4E0D\u7136\u7684\u8BDD\u5C31\u662F\u66FF\u6362\u6210\u7B49\u957F\u7684\u5355\u97F3\u3002\u7136\u540E\u63A5\u4E0B\u6765\u5C31\u53D8\u6210\u5355\u97F3\u9009\u62E9\u6A21\u5F0F\u4E86\u300D\uFF09\u3002\n *  \u4EBA\u63D2\u7684\u300C|\u300D\u7167\u65E7\u6321\u7740\uFF1A\u8DE8\u4E86\u5C0F\u8282\u7EBF = \u6BCF\u6BB5\u4E00\u4E2A\uFF0C\u97F3\u7528\u8FDE\u97F3\u7EBF\u8FDE\u8D77\u6765\uFF1B\u6BB5\u91CC\u4E0D\u5360\u65F6\u503C\u7684\u8BB0\u53F7\u7559\u7740\uFF08\u6BB5\u5934\u7684\u5728\u65B0\u97F3\u524D\u9762\uFF0C\u4E2D\u95F4\u7684\u632A\u5230\u65B0\u97F3\u540E\u9762\uFF09\u3002\n *  \u65B0\u97F3\u63A5\u8FC7\u539F\u6765\u7B2C\u4E00\u4E2A\u97F3\u7684\u6B4C\u8BCD\uFF08\u53EA\u6539\u97F3\u9AD8\u65F6\u6B4C\u8BCD\u4E0D\u4E22\uFF0C10-08 \u66FF\u6362\u6A21\u5F0F\u7559\u4E0B\u7684\u89C4\u77E9\uFF09\u3002\u4E00\u6BB5\u592A\u957F\uFF08\u8D85\u8FC7\u6700\u957F\u65F6\u503C\uFF09= \u4E0D\u52A8\u3002 */\nfunction fillSel(st: EditorState, what: { kind: \"note\"; pitch: Pitch } | { kind: \"rest\" }): EditorState {\n  const sel = st.sel!, tk = tr(st), out: Token[] = [];\n  let id = st.nextId, first = -1, inherit: { lyric: string; hyph?: boolean } | null = null, sawTimed = false;\n  let seg = 0, lead: Token[] = [], mid: Token[] = [];\n  const flush = (): boolean => {\n    if (seg <= 0) { out.push(...lead, ...mid); lead = []; mid = []; return true; }\n    if (!validDur(seg)) return false;\n    const tie = what.kind === \"note\" && first >= 0;\n    const tok = (what.kind === \"note\" ? { kind: \"note\", id: id++, pitch: what.pitch, dur: seg, lyric: first < 0 ? inherit?.lyric ?? null : null, ...(first < 0 && inherit?.hyph ? { hyph: true } : {}), ...(tie ? { tie: true } : {}) } : { kind: \"rest\", id: id++, dur: seg }) as Token;\n    out.push(...lead); if (first < 0) first = sel.from + out.length; out.push(tok, ...mid);\n    seg = 0; lead = []; mid = []; return true;\n  };\n  for (let i = sel.from; i < sel.to; i++) {\n    const t = tk[i];\n    if (t.kind === \"bar\") { if (!flush()) return st; out.push(t); continue; }\n    if (isTimed(t)) { if (!sawTimed && t.kind === \"note\" && t.lyric) inherit = { lyric: t.lyric, ...(t.hyph ? { hyph: true } : {}) }; sawTimed = true; seg += t.dur; continue; }\n    (seg > 0 ? mid : lead).push(t);\n  }\n  if (!flush() || first < 0) return st;\n  const nt = [...tk.slice(0, sel.from), ...out, ...tk.slice(sel.to)];\n  dropTieAfter(nt, sel.from + out.length - 1);\n  return next({ ...st, log: [] }, nt, { sel: { from: first, to: first + 1 }, caret: first + 1, nextId: id });\n}\n/** \u6539\u8FD9\u4E2A\u97F3\uFF08\u53EA\u9009\u4E86\u4E00\u4E2A\uFF09\uFF1AXOR \u97F3\u9AD8\u3002\u4F11\u6B62 = \u53D8\u6210\u8FD9\u4E2A\u97F3\uFF08\u4E00\u6837\u957F\uFF09\uFF1B\u7A7A\u97F3\u9AD8\u7684\u97F3\uFF08\u8A5E\u5148\uFF09= \u586B\u4E0A\uFF1B\u6709\u8FD9\u4E2A\u97F3\u9AD8 = \u62FF\u6389\uFF0C\u6700\u540E\u4E00\u4E2A\u62FF\u6389 = \u4E00\u6837\u957F\u7684\u4F11\u6B62\uFF1B\n *  \u6CA1\u6709 = \u53E0\u4E0A\u53BB\uFF08mono = \u5355\u58F0\u4E50\u5668\u7684\u58F0\u90E8\uFF1A\u6362\u6389\uFF0C\u4E0D\u53E0\uFF09\u3002\u9009\u533A\u7559\u5728\u5B83\u8EAB\u4E0A\u3002 */\nfunction xorSingle(st: EditorState, i: number, pitch: Pitch, input: InputState, mono: boolean): EditorState {\n  const tk = tr(st), t = tk[i], nt = tk.slice();\n  if (t.kind === \"rest\") nt[i] = { kind: \"note\", id: t.id, pitch, dur: t.dur, lyric: null } as Token;\n  else if (t.kind === \"note\" && !t.pitch) nt[i] = { ...t, pitch };\n  else if (t.kind === \"note\") {\n    const ps = allPitches(t), m = midiOf(pitch), has = ps.some((q) => midiOf(q) === m);\n    if (mono) { if (has && ps.length === 1) return { ...st, input }; nt[i] = withPitches(t, [pitch]); }\n    else if (has && ps.length === 1) { nt[i] = { kind: \"rest\", id: t.id, dur: t.dur } as Token; dropTieAfter(nt, i); }\n    else nt[i] = withPitches(t, has ? ps.filter((q) => midiOf(q) !== m) : [...ps, pitch]);\n  } else return st;\n  return next({ ...st, input }, nt, { sel: { from: i, to: i + 1 }, caret: i + 1 });\n}\n/** \u6539\u8FD9\u4E2A\u97F3\u7684\u957F\u77ED\uFF08\u53EA\u9009\u4E86\u4E00\u4E2A\uFF09\uFF1Aby > 0 = \u957F\u4E00\u6B65\uFF08\u5148\u5403\u540E\u9762\u7D27\u6328\u7740\u7684\u4F11\u6B62\uFF0C\u4E0D\u591F\u624D\u63A8\uFF09\uFF1Bby < 0 = \u77ED\u4E00\u6B65\uFF08\u7A7A\u51FA\u6765\u7684\u90A3\u622A\u53D8\u6210\u4F11\u6B62\uFF0C\u540E\u9762\u4E0D\u632A\uFF1B\u77ED\u5230\u4E0D\u5408\u6CD5 = \u4E0D\u52A8\uFF09\u3002 */\nfunction resizeSingle(st: EditorState, i: number, by: number): EditorState {\n  const tk = tr(st), t = tk[i] as Timed, d = t.dur + by;\n  if (!validDur(d)) return st;\n  if (by < 0) { const nt = tk.slice(); nt[i] = { ...t, dur: d } as Token; nt.splice(i + 1, 0, { kind: \"rest\", id: st.nextId, dur: -by } as Token); return next(st, nt, { nextId: st.nextId + 1, sel: { from: i, to: i + 1 }, caret: i + 1 }); }\n  const e = eatRests(tk, i + 1, by), nt = [...tk.slice(0, i), { ...t, dur: d } as Token, ...e.keep, ...tk.slice(e.end)];\n  return next(st, nt, { sel: { from: i, to: i + 1 }, caret: i + 1 });\n}\n\n/** \u7ED3\u6784\u8BB0\u53F7\uFF08\u5C0F\u8282\u7EBF / \u53CD\u590D / \u8DF3\u8F6C\uFF09\u63D2\u5728\u5149\u6807\u5904\u65F6\uFF0C\u5149\u6807\u524D\u9762\u7D27\u6328\u7740\u7684\u66F2\u7EA7\u8BB0\u53F7\u8BA9\u5230\u5B83\u540E\u9762\uFF08v0.10.39\uFF1A\u7EB8\u5934\u5F3A\u5236\u5199\u4E86\u529B\u5EA6\u4E4B\u540E\uFF0C\u5728\u7EB8\u5934\u63D2 |: \u4F1A\u843D\u5728\u529B\u5EA6\u540E\u9762 = \u7B2C\u4E8C\u904D\u4E0D\u91CD\u8BFB\u8FD9\u4E2A\u529B\u5EA6\uFF09\u3002 */\nconst behindPhrase = (toks: Token[], at: number, h: number): number => { let i = at; while (i > h && isPhraseMark(toks[i - 1])) i--; return i; };\n/** \u53CD\u590D\u5C0F\u8282\u7EBF\uFF08pad \u7B26\u53F7\u5C42\u300C\u53CD\u590D\u300D\u83DC\u5355\uFF09\uFF1A\u5149\u6807\u7D27\u6328\u7740\u4E00\u6761\u5C0F\u8282\u7EBF\uFF08\u524D\u9762\u6216\u540E\u9762\uFF09= \u628A\u5B83\u6539\u6210\u53CD\u590D\u7684\uFF08|: \u548C :| \u649E\u5728\u540C\u4E00\u6761\u4E0A = :|:\uFF09\uFF1B\u5426\u5219\u5728\u5149\u6807\u5904\u63D2\u4E00\u6761\u3002\n *  repeat = null = \u6539\u56DE\u666E\u901A\u5C0F\u8282\u7EBF\u3002times \u53EA\u7ED9 :|\uFF08\u4E00\u5171\u653E\u51E0\u904D\uFF0C2 = \u4E0D\u5199\uFF09\u3002 */\nexport function setRepeatBar(st: EditorState, repeat: Repeat | null, times?: number): EditorState {\n  const toks = tr(st), h = headLen(toks), was = st.sel ? st.sel.to : st.caret, at = behindPhrase(toks, was, h);\n  const near = toks[at - 1]?.kind === \"bar\" && at - 1 >= h ? at - 1 : toks[at]?.kind === \"bar\" ? at : -1;\n  const mk = (b: BarTok): BarTok => {\n    let r: Repeat | null = repeat;\n    if (repeat && b.repeat && b.repeat !== repeat) r = \"both\";   // |: + :| \u540C\u4E00\u6761 = :|:\n    const { repeat: _r, times: _t, style: _st, ...rest } = b;   // \u6539\u6210\u53CD\u590D\u7684 = \u6BB5\u843D\u7EBF / \u7EC8\u6B62\u7EBF\u7684\u6837\u5B50\u53BB\u6389\n    const tm = r === \"end\" || r === \"both\" ? (times ?? b.times) : undefined;\n    return { ...rest, ...(r ? { repeat: r } : {}), ...(tm && tm > 2 ? { times: tm } : {}) };\n  };\n  const nt = toks.slice();\n  if (near >= 0) { nt[near] = mk(toks[near] as BarTok); return next(st, nt, { sel: null }); }\n  if (!repeat) return st;\n  const id = st.nextId;\n  nt.splice(at, 0, mk({ kind: \"bar\", id }));\n  return next(st, nt, { caret: was + 1, sel: null, nextId: id + 1, log: [] });\n}\n/** \u6BB5\u843D\u7EBF \u2016 / \u7EC8\u6B62\u7EBF\uFF08v0.9.32\uFF09\uFF1A\u5149\u6807\u6328\u7740\u4E00\u6761\u5C0F\u8282\u7EBF\uFF08\u524D\u9762\u6216\u540E\u9762\uFF09= \u628A\u5B83\u6539\u6210\u8FD9\u79CD\uFF08\u53CD\u590D\u53BB\u6389\uFF09\uFF1B\u5426\u5219\u5728\u5149\u6807\u5904\u63D2\u4E00\u6761\u3002null = \u6539\u56DE\u666E\u901A\u5C0F\u8282\u7EBF\u3002 */\nexport function setBarStyle(st: EditorState, style: \"double\" | \"final\" | null): EditorState {\n  const toks = tr(st), h = headLen(toks), was = st.sel ? st.sel.to : st.caret, at = behindPhrase(toks, was, h);\n  const near = toks[at - 1]?.kind === \"bar\" && at - 1 >= h ? at - 1 : toks[at]?.kind === \"bar\" ? at : -1;\n  const nt = toks.slice();\n  if (near >= 0) { const { repeat: _r, times: _t, style: _s, ...rest } = toks[near] as BarTok; nt[near] = { ...rest, ...(style ? { style } : {}) }; return next(st, nt, { sel: null }); }\n  if (!style) return st;\n  const id = st.nextId; nt.splice(at, 0, { kind: \"bar\", id, style });\n  return next(st, nt, { caret: was + 1, sel: null, nextId: id + 1, log: [] });\n}\n/** \u623F\u5B50 / \u8DF3\u8F6C\u8BB0\u53F7\uFF1A\u63D2\u5728\u5149\u6807\u5904\uFF08\u540C\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\uFF0C\u662F\u7ED3\u6784\u4E0D\u662F\u8868\u60C5\uFF09\u3002\u5149\u6807\u540E\u9762\u7D27\u6328\u7740\u5C0F\u8282\u7EBF = \u63D2\u5728\u5C0F\u8282\u7EBF\u540E\u9762\uFF08\u623F\u5B50\u4ECE\u4E0B\u4E00\u5C0F\u8282\u5F00\u5934\u8D77\uFF09\u3002 */\nexport function insertNav(st: EditorState, what: NavWhat, nums?: number[]): EditorState {\n  const toks = tr(st), was = st.sel ? st.sel.from : st.caret; let at = behindPhrase(toks, was, headLen(toks));\n  if (what === \"ending\" && toks[at]?.kind === \"bar\") at++;\n  const id = st.nextId, nt = toks.slice();\n  nt.splice(at, 0, { kind: \"nav\", id, what, ...(what === \"ending\" ? { nums: nums && nums.length ? [...nums].sort((a, b) => a - b) : [1] } : {}) });\n  return next(st, nt, { caret: Math.max(at, was) + 1, sel: null, nextId: id + 1, log: [] });\n}\n/** \u9009\u533A\u91CC\u6E05\u6389\u8BB0\u53F7\uFF082026-10-10 user\u300C\u6279\u91CF\u4FEE\u6539\uFF0C\u5220\u9664\u66F2\u7EA7\uFF08\u4F60\u4E4B\u524D\u5206\u4E86\u66F2\u7EA7vs\u97F3\u7B26\u7EA7\uFF09\u529B\u5EA6\u8BB0\u53F7\u7684\u65B9\u6CD5\uFF0C\u800C\u4E0D\u662F\u5F97\u4E00\u4E2A\u4E2A\u624B\u5220 \u573A\u666F\u662F\u6211\u628A\u4EBA\u58F0\u7684notes\u7ED9\u590D\u5236\u5230\u5176\u4ED6\u7684\u8F68\u91CC\u9762\u4E4B\u540E\uFF0C\n *  \u60F3\u628A\u4E4B\u524D\u8C03\u6821\u7684\u529B\u5EA6\u548Carticulation\u7ED9\u5220\u4E86\u6309\u65B0\u4E50\u5668\u7684\u7279\u6027\u5199\u300D\uFF09\u3002phrase = \u66F2\u7EA7\uFF1A\u529B\u5EA6\u5B57 / \u6E10\u5F3A\u6E10\u5F31 / \u6E10\u5230 / \u98CE\u683C\uFF08\u9009\u533A\u8D77\u70B9\u524D\u7D27\u6328\u7740\u7B2C\u4E00\u4E2A\u97F3\u7684\u4E5F\u7B97\uFF0C\u540C\u590D\u5236\uFF09\uFF1B\n *  note = \u97F3\u7EA7\uFF1A\u6F14\u594F\u6CD5 / \u97F3\u5934 / \u97F3\u5185\u8D77\u4F0F / \u8FDE\u7EBF / \u547C\u5438 / \u51FA\u58F0\u7684\u6362\u6C14 / \u6C14\u58F0\uFF1Ball = \u4E24\u6837\u3002\u97F3\u3001\u6B4C\u8BCD\u3001\u53E0\u97F3\u3001\u7ED3\u6784\u8BB0\u53F7\uFF08\u8C03\u53F7\u62CD\u53F7\u901F\u5EA6\u3001\u53CD\u590D\u3001\u53E5\u53F7\uFF09\u4E0D\u52A8\u3002\u6CA1\u4E1C\u897F\u53EF\u6E05 = \u539F\u6837\u3002 */\nexport function clearMarks(st: EditorState, which: \"phrase\" | \"note\" | \"all\"): EditorState {\n  if (!st.sel) return st;\n  const toks = tr(st), h = headLen(toks), { from, to } = st.sel;\n  const isPhrase = isPhraseMark;\n  let a = from; while (a > h && isPhrase(toks[a - 1])) a--;\n  const out: Token[] = []; let before = 0, inside = 0, touched = false;\n  toks.forEach((t, i) => {\n    if (which !== \"note\" && i >= a && i < to && isPhrase(t)) { if (i < from) before++; else inside++; return; }\n    if (which !== \"phrase\" && i >= from && i < to && t.kind === \"note\" && (t.art || t.slur || t.inhale)) {\n      const { art: _a, slur: _s, inhale: _i, ...rest } = t; out.push(rest as Token); touched = true; return;   // \u97F3\u5185\u8D77\u4F0F\u5728\u6F14\u594F\u6CD5\u91CC\uFF08v0.9.44\uFF09\uFF0C\u4E00\u8D77\u6E05\n    }\n    out.push(t);\n  });\n  if (!before && !inside && !touched) return st;\n  const f = from - before, e = to - before - inside;\n  return next(st, out, e > f ? { sel: { from: f, to: e }, caret: e, log: [] } : { sel: null, caret: f, log: [] });\n}\nexport function writeBar(st: EditorState): EditorState {\n  const at = st.sel ? st.sel.to : st.caret, id = st.nextId, tokens = tr(st).slice();\n  // \u5C0F\u8282\u7EBF\u4E5F\u662F XOR\uFF082026-10-10 user\u300Cwishlist \u5C0F\u8282\u7EBF\u5E94\u8BE5\u4E5F\u662Fxor\uFF0C\u6709\u65F6\u5019\u8BEF\u52A0\u7684\u5C0F\u8282\u7EBF\u4E00\u76F4\u5220\u4E0D\u6389\u300D\uFF09\uFF1A\u5149\u6807\u7D27\u6328\u5728\u4E00\u6839\u4EBA\u63D2\u7684\u666E\u901A\u5C0F\u8282\u7EBF\u540E\u9762 = \u518D\u6309\u4E00\u4E0B\u53BB\u6389\u5B83\uFF08\u53CD\u590D\u5C0F\u8282\u7EBF\u8D70\u300C\u53CD\u590D\u300D\u83DC\u5355\uFF0C\u4E0D\u52A8\uFF09\n  const prev = tokens[at - 1];\n  if (!st.sel && at - 1 >= headLen(tokens) && prev?.kind === \"bar\" && !prev.repeat && !prev.style) { tokens.splice(at - 1, 1); return next(st, tokens, { caret: at - 1, sel: null, log: [] }); }\n  tokens.splice(at, 0, { kind: \"bar\", id });\n  return next(st, tokens, { caret: at + 1, sel: null, nextId: id + 1, log: [] });\n}\n/** \u53E5\uFF08pad \u7B26\u53F7\u5C42 / Shift+Enter\uFF09\uFF1A\u63D2\u5728\u5149\u6807\u5904\uFF08\u6709\u9009\u4E2D = \u9009\u4E2D\u540E\u9762\uFF09\uFF1B\u524D\u9762\u5DF2\u7ECF\u662F\u53E5 = \u539F\u6837\u3002\u65AD\u53E5\u5E38\u5728\u5C0F\u8282\u4E2D\u95F4\uFF0C\u6240\u4EE5\u4E0D\u7ED1\u5C0F\u8282\u7EBF\uFF08user 2026-10-08\u300C\u65AD\u53E5\u53EF\u80FD\u5728\u975E\u5C0F\u8282\u7EBF\u5904\uFF0C\u5EFA\u8BAE\u4E0D\u8981\u7528\u5C0F\u8282\u7EBF\u300D\uFF09\u3002 */\nexport function writePhrase(st: EditorState): EditorState {\n  const at = st.sel ? st.sel.to : st.caret, tokens = tr(st).slice();\n  if (tokens[at - 1]?.kind === \"phrase\" || at <= headLen(tokens)) return st;\n  const id = st.nextId;\n  tokens.splice(at, 0, { kind: \"phrase\", id });\n  return next(st, tokens, { caret: at + 1, sel: null, nextId: id + 1, log: [] });\n}\n/** \u5728\u4E0B\u6807 i \u7684 token \u540E\u9762\u63D2\u4E00\u4E2A\u53E5\uFF08\u6B4C\u8BCD\u91CC\u6253\u4E86\u53E5\u53F7\uFF09\uFF1B\u540E\u9762\u5DF2\u7ECF\u662F\u53E5 = \u539F\u6837\u3002\u5149\u6807 / \u9009\u4E2D\u5728\u5B83\u540E\u9762\u7684\u5F80\u540E\u632A\u4E00\u683C\u3002 */\nexport function insertPhraseAfter(st: EditorState, i: number): EditorState {\n  const tokens = tr(st).slice();\n  if (!tokens[i] || tokens[i + 1]?.kind === \"phrase\") return st;\n  const id = st.nextId;\n  tokens.splice(i + 1, 0, { kind: \"phrase\", id });\n  const sel = st.sel ? { from: st.sel.from > i ? st.sel.from + 1 : st.sel.from, to: st.sel.to > i ? st.sel.to + 1 : st.sel.to } : null;\n  return next({ ...st, nextId: id + 1 }, tokens, { caret: st.caret > i ? st.caret + 1 : st.caret, sel });\n}\n// \u2500\u2500 \u4FEE\uFF1A\u6F14\u594F\u6CD5 / \u529B\u5EA6 / \u547C\u5438\uFF082026-10-08 by Claude Opus 5.5\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/** \u4E00\u4E2A\u97F3\u7684\u6F14\u594F\u6CD5\uFF08\u6309 ARTS \u7684\u987A\u5E8F\uFF09\u3002 */\nexport const artOf = (t: NoteTok): Art[] => t.art ?? [];\n/** \u5F00 / \u5173\u4E00\u79CD\u6F14\u594F\u6CD5\uFF08\u7A7A\u4E86 = \u53BB\u6389 art \u5B57\u6BB5\uFF0C\u5B58\u6863\u4E0D\u591A\u51FA\u7A7A\u6570\u7EC4\uFF09\u3002 */\nexport function withArt(t: NoteTok, a: Art, on: boolean): NoteTok {\n  if (on && a === \"arpeggio\" && !t.chord?.length) return t;   // \u7436\u97F3\u53EA\u6302\u5728\u548C\u5F26\u4E0A\uFF08v0.9.46\uFF09\n  const set = new Set(artOf(t)); if (on) { for (const g of [ATTACKS, SWELL_ARTS]) if (g.includes(a)) for (const x of g) set.delete(x); set.add(a); } else set.delete(a);   // \u97F3\u5934\u90A3\u4E00\u7EC4\u4E92\u65A5\uFF1B\u97F3\u5185\u8D77\u4F0F\u90A3\u4E00\u7EC4\u4E92\u65A5\n  const art = ARTS.filter((x) => set.has(x));\n  const base = !set.has(\"breath\") && t.inhale ? (({ inhale: _i, ...r }) => r)(t) : t;   // \u547C\u5438\u53BB\u6389 = \u51FA\u58F0\u7684\u6362\u6C14\u4E00\u8D77\u53BB\u6389\n  if (art.length) return { ...base, art };\n  const { art: _a, ...rest } = base; return rest;\n}\n/** \u9009\u533A\u91CC\u7684\u97F3\u7684\u4E0B\u6807\u3002 */\nconst selNoteIdx = (st: EditorState): number[] => { if (!st.sel) return []; const out: number[] = []; for (let i = st.sel.from; i < st.sel.to; i++) if (tr(st)[i]?.kind === \"note\") out.push(i); return out; };\n/** \u9009\u533A\u91CC\u6BCF\u79CD\u6F14\u594F\u6CD5\uFF1A\u90FD\u6709 / \u6709\u7684\u6709 / \u90FD\u6CA1\u6709\uFF08\u9009\u533A\u6761\u7684\u5F00\u5173\u4EAE\u4E0D\u4EAE\uFF09\u3002 */\nexport function artStateSel(st: EditorState): Record<Art, \"all\" | \"some\" | \"none\"> {\n  const idx = selNoteIdx(st), toks = tr(st), out = {} as Record<Art, \"all\" | \"some\" | \"none\">;\n  for (const a of ARTS) { const n = idx.filter((i) => artOf(toks[i] as NoteTok).includes(a)).length; out[a] = !idx.length || n === 0 ? \"none\" : n === idx.length ? \"all\" : \"some\"; }\n  return out;\n}\n/** \u9009\u533A\u91CC\u7684\u97F3\u5207\u4E00\u79CD\u6F14\u594F\u6CD5\uFF1A\u90FD\u6709 = \u90FD\u53BB\u6389\uFF0C\u5426\u5219\u90FD\u52A0\u4E0A\uFF08\u9009\u533A\u7559\u7740\uFF0C\u63A5\u7740\u6539\u522B\u7684\uFF09\u3002 */\nexport function toggleArtSel(st: EditorState, a: Art): EditorState {\n  const idx = selNoteIdx(st); if (!idx.length) return st;\n  const on = artStateSel(st)[a] !== \"all\", nt = tr(st).slice();\n  let changed = false; for (const i of idx) { const u = withArt(nt[i] as NoteTok, a, on); if (u !== nt[i]) { nt[i] = u; changed = true; } }\n  return changed ? next(st, nt) : st;   // \u4E00\u4E2A\u90FD\u6CA1\u53D8\uFF08\u6BD4\u5982\u5355\u97F3\u6302\u7436\u97F3\uFF09= \u539F\u6837\uFF0C\u4E0D\u8BB0\u4E00\u6B65\n}\n/** \u6F14\u594F\u6CD5\uFF08pad \u7B26\u53F7\u5C42\uFF1A\u8DF3\u97F3 / \u91CD\u97F3 / \u4FDD\u6301 / \u547C\u5438\uFF09\uFF1A\u6709\u9009\u533A = \u9009\u4E2D\u7684\u97F3\u6574\u7EC4\u5207\uFF08\u540C\u9009\u533A\u6761\u300C\u4FEE\u300D\uFF09\uFF1B\u6CA1\u9009\u533A = \u5149\u6807\u524D\u6700\u8FD1\u7684\u90A3\u4E2A\u97F3\u5207\n *  \uFF08\u4E2D\u95F4\u53EA\u9694\u7740\u53E5\u53F7 / \u529B\u5EA6 / \u5C0F\u8282\u7EBF\u8FD9\u7C7B\u4E0D\u5360\u65F6\u503C\u7684\u4E5F\u7B97\uFF09\uFF1B\u524D\u9762\u662F\u4F11\u6B62\u6216\u6CA1\u6709\u97F3 = \u539F\u6837\uFF08\u8FD4\u56DE null \u8BA9\u754C\u9762\u8BF4\u4E00\u58F0\uFF09\u3002 */\nexport function toggleArtBefore(st: EditorState, a: Art): EditorState | null {\n  if (st.sel) { const nx = toggleArtSel(st, a); return nx === st ? null : nx; }\n  const toks = tr(st);\n  for (let i = st.caret - 1; i >= headLen(toks); i--) {\n    const t = toks[i];\n    if (t.kind === \"rest\") return null;\n    if (t.kind !== \"note\") continue;\n    const u = withArt(t, a, !artOf(t).includes(a)); if (u === t) return null;   // \u6CA1\u53D8\uFF08\u5355\u97F3\u6302\u7436\u97F3\uFF09= null\uFF0C\u8BA9\u754C\u9762\u8BF4\u4E00\u58F0\n    const nt = toks.slice(); nt[i] = u;\n    return next(st, nt);\n  }\n  return null;\n}\nexport const toggleBreath = (st: EditorState): EditorState | null => toggleArtBefore(st, \"breath\");\n/** \u51FA\u58F0\u7684\u6362\u6C14\uFF08\u8F7B\u5438 / \u6DF1\u5438\uFF09\uFF1A\u7ED9\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\u97F3\uFF09\u52A0\u4E00\u4E2A\u542C\u5F97\u89C1\u7684\u547C\u5438\u2014\u2014\u6CA1\u6709\u547C\u5438\u8BB0\u53F7\u5C31\u8FDE\u9017\u53F7\u4E00\u8D77\u52A0\u4E0A\uFF1B\n *  \u5DF2\u7ECF\u662F\u8FD9\u4E00\u6863 = \u6574\u4E2A\u547C\u5438\u53BB\u6389\uFF08\u540C\u300C\u518D\u70B9 = \u53BB\u6389\u300D\uFF09\uFF1B\u662F\u53E6\u4E00\u6863 = \u6362\u6863\u3002\u524D\u9762\u662F\u4F11\u6B62 / \u6CA1\u6709\u97F3 = null\u3002 */\nexport function toggleInhaleBefore(st: EditorState, level: \"soft\" | \"big\"): EditorState | null {\n  const set = (t: NoteTok, on: boolean): NoteTok => (on ? { ...withArt(t, \"breath\", true), inhale: level } : withArt(t, \"breath\", false));\n  if (st.sel) {\n    const idx = selNoteIdx(st); if (!idx.length) return null;\n    const on = !idx.every((i) => (tr(st)[i] as NoteTok).inhale === level), nt = tr(st).slice();\n    for (const i of idx) nt[i] = set(nt[i] as NoteTok, on);\n    return next(st, nt);\n  }\n  const toks = tr(st);\n  for (let i = st.caret - 1; i >= headLen(toks); i--) {\n    const t = toks[i];\n    if (t.kind === \"rest\") return null;\n    if (t.kind !== \"note\") continue;\n    const nt = toks.slice(); nt[i] = set(t, t.inhale !== level);\n    return next(st, nt);\n  }\n  return null;\n}\n/** \u8FDE\u7EBF\uFF08\u9009\u533A\uFF09\uFF1A\u9009\u4E2D\u7684\u97F3\u8FDE\u8D77\u6765\u2014\u2014\u524D n\u22121 \u4E2A\u6807\u300C\u8FDE\u5230\u4E0B\u4E00\u4E2A\u300D\uFF1B\u53EA\u9009\u4E86\u4E00\u4E2A = \u5B83\u8FDE\u5230\u4E0B\u4E00\u4E2A\u97F3\u3002\u90FD\u8FDE\u7740 = \u90FD\u53BB\u6389\u3002\u6CA1\u9009\u97F3 = \u539F\u6837\u3002 */\nexport function toggleSlurSel(st: EditorState): EditorState {\n  const idx = selNoteIdx(st); if (!idx.length) return st;\n  const on = idx.length === 1 ? idx : idx.slice(0, -1), toks = tr(st), nt = toks.slice();\n  const all = on.every((i) => (toks[i] as NoteTok).slur);\n  for (const i of on) nt[i] = withSlur(nt[i] as NoteTok, !all);\n  return next(st, nt);\n}\n/** \u8FDE\u7EBF\uFF08pad \u7B26\u53F7\u5C42\uFF09\uFF1A\u6709\u9009\u533A = \u9009\u533A\u90A3\u6837\uFF1B\u6CA1\u6709 = \u5149\u6807\u524D\u6700\u8FD1\u7684\u90A3\u4E2A\u97F3\u8FDE\u5230\u4E0B\u4E00\u4E2A\u97F3\uFF08\u518D\u70B9 = \u53BB\u6389\uFF09\uFF1B\u524D\u9762\u662F\u4F11\u6B62 / \u6CA1\u6709\u97F3 = null\u3002 */\nexport function toggleSlurBefore(st: EditorState): EditorState | null {\n  if (st.sel) { const nx = toggleSlurSel(st); return nx === st ? null : nx; }\n  const toks = tr(st);\n  for (let i = st.caret - 1; i >= headLen(toks); i--) {\n    const t = toks[i];\n    if (t.kind === \"rest\") return null;\n    if (t.kind !== \"note\") continue;\n    const nt = toks.slice(); nt[i] = withSlur(t, !t.slur); return next(st, nt);\n  }\n  return null;\n}\n/** \u9009\u533A\u91CC\u7684\u8FDE\u7EBF\u72B6\u6001\uFF08\u300C\u4FEE\u300D\u90A3\u4E00\u6392\u7684\u5F00\u5173\uFF09\uFF1A\u90FD\u8FDE\u7740 / \u6709\u4E9B / \u6CA1\u6709\u3002\u76EE\u6807 = \u540C toggleSlurSel\uFF08\u524D n\u22121 \u4E2A\uFF1B\u53EA\u9009\u4E00\u4E2A = \u5B83\u81EA\u5DF1\uFF09\u3002 */\nexport function slurStateSel(st: EditorState): \"all\" | \"some\" | \"none\" {\n  const idx = selNoteIdx(st); if (!idx.length) return \"none\";\n  const on = idx.length === 1 ? idx : idx.slice(0, -1), n = on.filter((i) => (tr(st)[i] as NoteTok).slur).length;\n  return n === 0 ? \"none\" : n === on.length ? \"all\" : \"some\";\n}\n/** \u97F3\u5185\u7684\u529B\u5EA6\u8D77\u4F0F\uFF08pad \u7B26\u53F7\u5C42\uFF09\uFF1A\u6709\u9009\u533A = \u9009\u4E2D\u7684\u97F3\u90FD\u5207\u6210\u8FD9\u4E2A\uFF08\u90FD\u662F = \u53BB\u6389\uFF09\uFF1B\u6CA1\u6709 = \u5149\u6807\u524D\u6700\u8FD1\u7684\u90A3\u4E2A\u97F3\u5207\uFF08\u518D\u70B9 = \u53BB\u6389\uFF0C\u6362\u4E00\u79CD = \u6362\uFF09\uFF1B\u524D\u9762\u662F\u4F11\u6B62 / \u6CA1\u97F3 = null\u3002 */\nexport function toggleSwell(st: EditorState, w: Swell): EditorState | null {\n  const set = (t: NoteTok, on: boolean): NoteTok => (on ? withArt(t, SWELL_ART[w], true) : SWELL_ARTS.reduce((u, a) => withArt(u, a, false), t));   // \u6F14\u594F\u6CD5\u91CC\u7684\u4E00\u7EC4\uFF08v0.9.44\uFF09\n  if (st.sel) {\n    const idx = selNoteIdx(st); if (!idx.length) return null;\n    const toks = tr(st), all = idx.every((i) => swellOf(toks[i]) === w), nt = toks.slice();\n    for (const i of idx) nt[i] = set(nt[i] as NoteTok, !all);\n    return next(st, nt);\n  }\n  const toks = tr(st);\n  for (let i = st.caret - 1; i >= headLen(toks); i--) {\n    const t = toks[i];\n    if (t.kind === \"rest\") return null;\n    if (t.kind !== \"note\") continue;\n    const nt = toks.slice(); nt[i] = set(t, swellOf(t) !== w); return next(st, nt);\n  }\n  return null;\n}\nexport function withSlur(t: NoteTok, on: boolean): NoteTok { if (on) return { ...t, slur: true }; const { slur: _s, ...rest } = t; return rest; }\n/** \u7B2C i \u4E2A token \u90A3\u513F\u751F\u6548\u7684\u529B\u5EA6\uFF08\u5F80\u524D\u627E\u6700\u8FD1\u7684\u529B\u5EA6\u8BB0\u53F7\uFF1B\u6CA1\u6709 = mf\uFF09\u3002 */\n/** \u7B2C i \u4E2A token \u90A3\u513F\u751F\u6548\u7684\u529B\u5EA6\u8BB0\u53F7\uFF08\u5F80\u524D\u627E\u6700\u8FD1\u7684\uFF09\uFF1B\u524D\u9762\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u90FD\u6CA1\u6709 = null\uFF08= \u7528\u6F14\u594F\u8005\u7684\u9ED8\u8BA4\u529B\u5EA6\uFF0C\u4E0D\u5F53 mf \u7B97\uFF09\u3002 */\nexport function dynMarkAt(tokens: Token[], i: number): Dyn | null {\n  for (let j = Math.min(i, tokens.length) - 1; j >= 0; j--) { const t = tokens[j]; if (t.kind === \"dyn\") return t.value; }\n  return null;\n}\nexport function dynAt(tokens: Token[], i: number): Dyn {\n  for (let j = Math.min(i, tokens.length) - 1; j >= 0; j--) { const t = tokens[j]; if (t.kind === \"dyn\") return t.value; }\n  return DEFAULT_DYN;\n}\n/** \u7B26\u53F7\u5C42\u7684\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\u6302\u5728\u54EA\u4E2A\u97F3\uFF08\u6216\u4F11\u6B62\uFF09\u4E0A\uFF082026-10-08 \u6DF1\u591C Opus 5.5\uFF1BAI \u63D0\u300C\u529B\u5EA6\u6539\u6210\u843D\u5728\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u548C\u97F3\u5934\u8BB0\u53F7\u4E00\u6837\uFF09\u300D\uFF0Cuser\u300C\u505A\u300D\uFF09\uFF1A\n *  \u6709\u9009\u533A = \u9009\u533A\u91CC\u7B2C\u4E00\u4E2A\u97F3\uFF1B\u6CA1\u9009\u533A = **\u5149\u6807\u524D\u90A3\u4E2A\u97F3**\uFF08\u5199\u5B8C\u4E00\u4E2A\u97F3\u6309 f = \u8FD9\u4E2A\u97F3\u8D77\u662F f\uFF0C\u540C\u8DF3\u97F3 / \u91CD\u97F3\uFF09\uFF1B\u5149\u6807\u5728\u6700\u524D\u9762\uFF08\u524D\u9762\u6CA1\u6709\u97F3\uFF09= \u540E\u9762\u7B2C\u4E00\u4E2A\u97F3\u3002\u6CA1\u6709\u97F3 = -1\u3002 */\nexport function markAnchor(st: EditorState): number {\n  const toks = tr(st), h = headLen(toks);\n  if (st.sel) { for (let i = Math.max(h, st.sel.from); i < Math.min(toks.length, st.sel.to); i++) if (isTimed(toks[i])) return i; return -1; }\n  for (let i = Math.min(st.caret, toks.length) - 1; i >= h; i--) if (isTimed(toks[i])) return i;\n  for (let i = Math.max(h, st.caret); i < toks.length; i++) if (isTimed(toks[i])) return i;\n  return -1;\n}\n/** \u90A3\u4E2A\u97F3\u524D\u9762\u7D27\u6328\u7740\u7684\u4E00\u4E32\u4E0D\u5360\u65F6\u503C\u7684 token\uFF08\u529B\u5EA6 / \u6E10\u5F3A\u6E10\u5F31 / \u53E5\u53F7 / \u4E2D\u9014\u8BB0\u53F7\uFF09= [a, anchor)\uFF1B\u4E0D\u8FC7\u5C0F\u8282\u7EBF\u3002 */\nfunction runBefore(toks: Token[], anchor: number): number {\n  let a = anchor; while (a > headLen(toks) && !isTimed(toks[a - 1]) && toks[a - 1].kind !== \"bar\") a--;\n  return a;\n}\n/** \u5220 / \u63D2\u4E00\u4E2A token \u4E4B\u540E\u5149\u6807\u548C\u9009\u533A\u8DDF\u7740\u632A\uFF08pos = \u63D2 / \u5220\u7684\u4F4D\u7F6E\uFF0Cd = \u00B11\uFF09\u3002 */\nconst shiftAt = (st: EditorState, d: number, pos: number) => ({ sel: st.sel ? { from: st.sel.from + (st.sel.from >= pos ? d : 0), to: st.sel.to + (st.sel.to > pos || (st.sel.to === pos && d > 0) ? d : 0) } : null, caret: st.caret + (st.caret >= pos ? d : 0) });\n/** \u529B\u5EA6\u8BB0\u53F7\u653E\u5728 markAnchor \u90A3\u4E2A\u97F3\u4E0A\uFF1A\u90A3\u513F\u5DF2\u7ECF\u6709\u529B\u5EA6\u8BB0\u53F7 = \u6539\u5B83\uFF1Bvalue null = \u53BB\u6389\u3002\u6392\u5728\u90A3\u513F\u7684\u6E10\u5F3A\u6E10\u5F31\u524D\u9762\uFF08\u300Cmp <\u300D\u7684\u987A\u5E8F\uFF09\u3002 */\nexport function setDynSel(st: EditorState, value: Dyn | null, ramp?: boolean): EditorState {\n  const toks = tr(st), an = markAnchor(st);\n  if (an < 0) return st;\n  const a = runBefore(toks, an), nt = toks.slice();\n  let k = -1; for (let i = a; i < an; i++) if (toks[i].kind === \"dyn\") k = i;\n  if (k >= 0) {\n    if (value === null) { nt.splice(k, 1); return next(st, nt, shiftAt(st, -1, k)); }\n    const d = { ...(nt[k] as DynTok), value }; if (ramp === true) d.ramp = true; else if (ramp === false) delete d.ramp;\n    nt[k] = d; return next(st, nt);\n  }\n  if (value === null) return st;\n  let at = an; for (let i = a; i < an; i++) if (toks[i].kind === \"hairpin\") { at = i; break; }\n  const id = st.nextId; nt.splice(at, 0, { kind: \"dyn\", id, value, ...(ramp ? { ramp: true as const } : {}) });\n  return next({ ...st, nextId: id + 1 }, nt, shiftAt(st, 1, at));\n}\n/** \u6E10\u5F3A / \u6E10\u5F31\u8BB0\u53F7\u653E\u5728 markAnchor \u90A3\u4E2A\u97F3\u4E0A\uFF08\u4ECE\u8FD9\u4E2A\u97F3\u8D77\uFF09\uFF1A\u90A3\u513F\u5DF2\u7ECF\u6709\u540C\u65B9\u5411\u7684 = \u53BB\u6389\uFF0C\u53CD\u65B9\u5411\u7684 = \u6362\u3002 */\nexport function toggleHairpin(st: EditorState, dir: \"cresc\" | \"dim\"): EditorState {\n  const toks = tr(st), an = markAnchor(st);\n  if (an < 0) return st;\n  const a = runBefore(toks, an), nt = toks.slice();\n  let k = -1; for (let i = a; i < an; i++) if (toks[i].kind === \"hairpin\") { k = i; break; }\n  if (k >= 0) {\n    const h = toks[k] as HairpinTok;\n    if (h.dir === dir) { nt.splice(k, 1); return next(st, nt, shiftAt(st, -1, k)); }\n    nt[k] = { ...h, dir }; return next(st, nt);\n  }\n  const id = st.nextId; nt.splice(an, 0, { kind: \"hairpin\", id, dir });\n  return next({ ...st, nextId: id + 1 }, nt, shiftAt(st, 1, an));\n}\n/** \u98CE\u683C\u8BB0\u53F7\uFF08\u62CD\u5B50\u8F7B\u91CD\uFF1B2026-10-08 \u6DF1\u591C Opus 5.5\uFF09\uFF1A\u653E\u5728\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u4E0A\uFF08\u540C\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\uFF0CmarkAnchor\uFF09\u2014\u2014\u4ECE\u8FD9\u4E2A\u97F3\u8D77\u5230\u8FD9\u5F20\u7EB8\u7ED3\u5C3E\uFF08\u6216\u4E0B\u4E00\u4E2A\u98CE\u683C\u8BB0\u53F7\uFF09\u3002\n *  \u90A3\u513F\u5DF2\u7ECF\u6709\u4E00\u4E2A\uFF1A\u540C\u4E00\u4E2A\u98CE\u683C = \u53BB\u6389\uFF0C\u522B\u7684 = \u6362\uFF08\u5E45\u5EA6\u7559\u7740\uFF09\u3002 */\nexport function setGroove(st: EditorState, style: string): EditorState {\n  const toks = tr(st), an = markAnchor(st);\n  if (an < 0) return st;\n  const a = runBefore(toks, an), nt = toks.slice();\n  let k = -1; for (let i = a; i < an; i++) if (toks[i].kind === \"groove\") { k = i; break; }\n  if (k >= 0) {\n    const g = toks[k] as GrooveTok;\n    if (g.style === style) { nt.splice(k, 1); return next(st, nt, shiftAt(st, -1, k)); }\n    nt[k] = { ...g, style }; return next(st, nt);\n  }\n  const id = st.nextId; nt.splice(a, 0, { kind: \"groove\", id, style });   // \u6392\u5728\u8FD9\u4E32\u8BB0\u53F7\u6700\u524D\u9762\uFF08\u529B\u5EA6\u5B57 / \u53D1\u5939\u5728\u5B83\u540E\u9762\uFF0C\u6328\u7740\u97F3\uFF09\n  return next({ ...st, nextId: id + 1 }, nt, shiftAt(st, 1, a));\n}\n/** \u6E10\u5230\uFF082026-10-08 \u6DF1\u591C Opus 5.5\uFF09\uFF1A\u4E0B\u6807 i \u90A3\u4E2A\u529B\u5EA6\u8BB0\u53F7\u540E\u9762\uFF0C\u8FD9\u5F20\u7EB8\u91CC\uFF08\u5230 end \u4E3A\u6B62\uFF09\u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u5199\u7740\u6E10\u5230\u3001\u4E2D\u95F4\u6CA1\u6709\u624B\u5199\u7684\u6E10\u5F3A\u6E10\u5F31 = \u5B83\u7684\u4E0B\u6807\uFF1B\u5426\u5219 -1\u3002 */\nexport function rampTarget(tokens: Token[], i: number, end = tokens.length): number {\n  for (let j = i + 1; j < end; j++) { const t = tokens[j]; if (t.kind === \"hairpin\") return -1; if (t.kind === \"dyn\") return t.ramp ? j : -1; }\n  return -1;\n}\n/** \u6E10\u5230\u7684\u8D77\u70B9\uFF1A\u4E0B\u6807 j \u90A3\u4E2A\uFF08\u5199\u7740\u6E10\u5230\u7684\uFF09\u529B\u5EA6\u8BB0\u53F7\u524D\u9762\uFF0C\u8FD9\u5F20\u7EB8\u91CC\uFF08\u4ECE start \u8D77\uFF09\u4E0A\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u7684\u4E0B\u6807\u3002\n *  \u6CA1\u6709 = \"none\"\uFF08\u524D\u9762\u6CA1\u6709\u529B\u5EA6\u8BB0\u53F7\uFF0C\u6E10\u5230\u4E0D\u8D77\u4F5C\u7528\uFF09\uFF1B\u4E2D\u95F4\u9694\u7740\u624B\u5199\u7684\u6E10\u5F3A\u6E10\u5F31 = \"hairpin\"\uFF08\u624B\u5199\u7684\u8BF4\u4E86\u7B97\uFF0C\u6E10\u5230\u4E0D\u8D77\u4F5C\u7528\uFF09\u3002 */\nexport function rampSource(tokens: Token[], j: number, start = 0): number | \"none\" | \"hairpin\" {\n  for (let k = j - 1; k >= start; k--) { const t = tokens[k]; if (t.kind === \"hairpin\") return \"hairpin\"; if (t.kind === \"dyn\") return k; }\n  return \"none\";\n}\n/** markAnchor \u90A3\u4E2A\u97F3\u4E0A\u5199\u7740\u7684\u529B\u5EA6\u8BB0\u53F7\uFF08\u6CA1\u6709 = null\uFF1B\u9009\u533A\u6761 / \u7B26\u53F7\u5C42\u4E0A\u4EAE\u54EA\u4E00\u4E2A\uFF09\u3002 */\nexport function dynMarkSel(st: EditorState): Dyn | null {\n  const toks = tr(st), an = markAnchor(st); if (an < 0) return null;\n  let v: Dyn | null = null; for (let i = runBefore(toks, an); i < an; i++) { const t = toks[i]; if (t.kind === \"dyn\") v = t.value; }\n  return v;\n}\n\n/** \u7EB8\u9690\u85CF / \u663E\u793A\uFF08\u9690\u85CF = \u4E0D\u653E\uFF1B\u8C31\u4E0A\u8FD8\u5728\u3001\u6298\u53E0\u7740\uFF09\u3002 */\nexport function setPaperHidden(st: EditorState, paperId: string, hidden: boolean): EditorState {\n  const papers = st.song.papers.map((p) => (p.id !== paperId ? p : hidden ? { ...p, hidden: true } : (({ hidden: _h, ...rest }) => rest)(p)));\n  return { ...st, song: { ...st.song, papers } };\n}\n\n/** \u5728\u5149\u6807\u5904\uFF08\u6709\u9009\u4E2D = \u9009\u4E2D\u5F00\u5934\uFF09\u63D2\u4E00\u4E2A\u8BB0\u53F7\u3002\u63D2\u7684\u5730\u65B9\u524D\u540E\u8FDE\u7740\u7684\u8BB0\u53F7\u91CC\u5DF2\u6709\u540C\u7C7B \u2192 \u6539\u5B83\uFF0C\u4E0D\u518D\u63D2\u4E00\u4E2A\uFF08\u8C31\u5934\u5C31\u662F\u8FD9\u6837\u88AB\u6539\u7684\uFF09\u3002\n *  \u8FD4\u56DE\u8BB0\u53F7\u7684\u4E0B\u6807\uFF0Cfresh = \u65B0\u63D2\u7684\uFF08\u754C\u9762\u6253\u5F00\u5B83\u7684\u7F16\u8F91\u6846\uFF1B\u6CA1\u6539\u503C\u5C31\u5173 = \u64A4\u6389\uFF09\u3002 */\nexport function writeMark(st: EditorState, v: MarkVal): { st: EditorState; index: number; fresh: boolean } {\n  const at = st.sel ? st.sel.from : st.caret, tokens = tr(st);\n  let a = at, b = at;\n  while (a > 0 && isMark(tokens[a - 1])) a--;\n  while (b < tokens.length && isMark(tokens[b])) b++;\n  for (let i = a; i < b; i++) if (tokens[i].kind === v.kind) return { st: setMark({ ...leave(st), sel: null }, i, v), index: i, fresh: false };\n  const id = st.nextId, nt = tokens.slice();\n  nt.splice(at, 0, { ...v, id } as MarkTok);\n  if (v.kind === \"key\") respellFrom(nt, at);   // \u63D2\u8C03\u53F7\uFF1A\u5B83\u7BA1\u7684\u97F3\u8DDF\u7740\u6309\u8C03\u53F7\u62FC\u5199\n  return { st: next(st, nt, { caret: at + 1, sel: null, nextId: id + 1, log: [] }), index: at, fresh: true };\n}\n/** \u8C03\u53F7 i \u7BA1\u7684\u90A3\u4E00\u6BB5\u97F3\uFF08\u5230\u4E0B\u4E00\u4E2A\u8C03\u53F7\u4E3A\u6B62\uFF09\u6309\u5B83\u7B80\u5316\u62FC\u5199\uFF08\u97F3\u9AD8\u4E0D\u52A8\uFF1B\u8C03\u5916\u97F3\u3001\uD834\uDD2A / \uD834\uDD2B \u7167\u5199\uFF09\u3002\u539F\u5730\u6539 nt\u3002\n *  user 2026-10-08\u300C\u521A\u624D\u90A3\u4E2A\u662F\u6211\u79FB\u8C03\u4E4B\u540E\u6CA1\u6709\u81EA\u52A8\u5339\u914D\u2026\u56E0\u4E3A\u6211\u79FB\u4E86\u597D\u51E0\u4E2A\u8C03\u627E\u542C\u7684\u5BF9\u7684\u300D\uFF1A\u534A\u97F3\u79FB\u8C03\u4E0D\u52A8\u8C03\u53F7\uFF08\u97F3\u6309\u65E7\u8C03\u62FC\u6210\u4E00\u7247 \u266D\uFF09\uFF0C\n *  \u518D\u628A\u8C03\u53F7\u6539\u6210\u542C\u7740\u5BF9\u7684\u90A3\u4E2A\u8C03\u2014\u2014\u97F3\u8FD8\u662F\u65E7\u62FC\u6CD5\u3001\u6EE1\u7BC7\u4E34\u65F6\u8BB0\u53F7\u3002\u73B0\u5728\u6539 / \u63D2\u8C03\u53F7\u65F6\u5B83\u7BA1\u7684\u97F3\u987A\u624B\u6362\u6210\u8C03\u53F7\u91CC\u7684\u5199\u6CD5\u3002 */\nfunction respellFrom(nt: Token[], i: number): void {\n  const k = nt[i]; if (k?.kind !== \"key\") return;\n  for (let j = i + 1; j < nt.length && nt[j].kind !== \"key\"; j++) {\n    const t = nt[j]; if (t.kind !== \"note\" || !t.pitch) continue;\n    const ps = allPitches(t), qs = ps.map((q) => keySpell(q, k.fifths));\n    if (qs.some((q, n) => q !== ps[n])) nt[j] = withPitches(t, qs);\n  }\n}\n/** \u6362\u8C03\u53F7\uFF08\u63D2\u4E00\u4E2A\u8C03\u53F7\u8BB0\u53F7\uFF09\u3002 */\nexport const writeKey = (st: EditorState, fifths: number): EditorState => writeMark(st, { kind: \"key\", fifths }).st;\n/** \u6539\u4E00\u4E2A\u8BB0\u53F7\u7684\u503C\uFF08\u79CD\u7C7B\u4E0D\u53D8\uFF09\u3002\u8F93\u5165\u7684\u300C1=\u300D\u4E0D\u8DDF\u7740\u53D8\uFF08\u8F93\u5165\u8BBE\u5907\u81EA\u5DF1\u7684\u8C03\uFF09\u3002 */\nexport function setMark(st: EditorState, i: number, v: MarkVal): EditorState {\n  const t = tr(st)[i];\n  if (!t || t.kind !== v.kind) return st;\n  const nt = tr(st).slice(); nt[i] = { ...v, id: t.id } as MarkTok;\n  if (v.kind === \"key\") respellFrom(nt, i);   // \u6539\u8C03\u53F7\uFF1A\u5B83\u7BA1\u7684\u97F3\u8DDF\u7740\u6309\u8C03\u53F7\u62FC\u5199\uFF08\u540C\u4E00\u6B65\uFF0C\u80FD\u64A4\u9500\uFF09\n  const n2 = next(st, nt, {});\n  if (v.kind === \"tempo\" && i < headLen(nt)) {   // \u6539\u8FD9\u5F20\u7EB8\u5F00\u5934\u7684\u901F\u5EA6 = \u8FD9\u5F20\u7EB8\u6BCF\u4E00\u884C\u7684\u8C31\u5934\u90FD\u5199\u9F50\uFF08\u901F\u5EA6\u662F\u8FD9\u5F20\u7EB8\u7684\uFF09\n    const paper = n2.song.papers.find((p) => p.id === st.at.paper);\n    if (paper) return { ...n2, song: { ...n2.song, papers: n2.song.papers.map((p) => (p.id === paper.id ? withSheetBpm(p, v.bpm) : p)) } };\n  }\n  return n2;\n}\n/** \u5220\u4E00\u4E2A\u4E2D\u9014\u7684\u8BB0\u53F7\uFF08\u8C31\u5934\u7684\u5220\u4E0D\u6389\uFF09\u3002 */\nexport function deleteMark(st: EditorState, i: number): EditorState {\n  const t = tr(st)[i];\n  if (!t || !isMark(t) || i < headLen(tr(st))) return st;\n  const nt = tr(st).slice(); nt.splice(i, 1);\n  return next(st, nt, { caret: i < st.caret ? st.caret - 1 : st.caret, sel: null });\n}\n\n/** \u300C\u2212\u300D\uFF1A\u5199\u7684\u65F6\u5019 = \u521A\u5199\u7684\u90A3\u4E2A\u97F3\u52A0\u4E00\u4EFD\u5B83\u5199\u5165\u65F6\u7684\u5355\u4F4D\uFF08\u5148\u5403\u540E\u9762\u7D27\u6328\u7740\u7684\u4F11\u6B62\uFF0C\u4E0D\u591F\u624D\u63A8\uFF1Bv0.10.5\uFF09\uFF1B\u4E2D\u95F4\u9694\u7740\u5C0F\u8282\u7EBF = \u65B0\u5F00\u4E00\u4E2A tie \u7740\u7684\u540C\u97F3\u3002\n *  half = pad \u7684\u300C/2\u300D\u5F00\u7740\uFF1A\u52A0**\u534A\u4EFD**\uFF08\u516B\u5206 + \u534A\u4EFD = \u9644\u70B9\u516B\u5206\uFF1B\u63A5\u7740\u518D\u5199\u4E00\u4E2A\u51CF\u534A\u7684\u97F3 = \u9644\u70B9\u516B\u5206 + \u5341\u516D\u5206\uFF0C\u51D1\u6EE1\u4E24\u4EFD\u539F\u6765\u7684\uFF09\u3002\n *  \u53EA\u9009\u4E86\u4E00\u4E2A\u97F3 = \u957F\u4E00\u6B65\uFF08\u4E00\u6B65 = \u957F\u77ED\u65CB\u94AE\u73B0\u5728\u90A3\u4E00\u6863\uFF09\uFF1B\u9009\u4E86\u597D\u51E0\u4E2A = \u4E0D\u52A8\uFF08\u6574\u7EC4\u6539\u65F6\u503C\u5728\u9009\u533A\u6761\u91CC\uFF09\u3002 */\nexport function extend(st: EditorState, half = false): EditorState {\n  const one = singleSel(st);\n  if (one >= 0) return resizeSingle(st, one, unitDur(st.input));\n  if (st.sel) return st;\n  const tokens = tr(st);\n  // \u76EE\u6807 = \u672C\u6B21\u8F93\u5165\u8BB0\u5F55\u91CC\u6700\u540E\u4E00\u4E2A\u97F3\uFF08\u8FD8\u5728\u7684\u8BDD\uFF09\uFF0C\u5426\u5219\u5149\u6807\u524D\u6700\u8FD1\u7684\u97F3 / \u4F11\u6B62\n  let target = -1, unit = unitDur(st.input), fromLog = false;\n  for (let k = st.log.length - 1; k >= 0 && target < 0; k--) {\n    const e = st.log[k], i = indexOfId(tokens, e.id);\n    if (i < 0) continue;\n    target = i;\n    // \u5355\u4F4D = \u8FD9\u4E2A\u97F3\u5199\u5165\u65F6\u7684\u90A3\u4E00\u7B14\uFF08ins / fill / tie\uFF09\u8BB0\u4E0B\u7684\uFF1B\u6700\u540E\u4E00\u7B14\u662F\u300C\u2212\u300D\u5C31\u5F80\u56DE\u627E\u5B83\n    for (let q = k; q >= 0; q--) { const f = st.log[q]; if (f.id === e.id && f.k !== \"ext\") { unit = f.unit; fromLog = true; break; } }\n  }\n  if (target < 0) target = currentIndex(st);\n  if (target < 0) return st;\n  const t = tokens[target] as Timed;\n  const by = half && fromLog ? unit / 2 : unit;   // \u6CA1\u6709\u8BB0\u5F55\u53EF\u67E5\u65F6 unit \u5DF2\u662F\u5F53\u524D\u5355\u4F4D\uFF08\u300C/2\u300D\u632A\u77ED\u8FC7\uFF09\uFF0C\u4E0D\u518D\u6298\u534A\n  // \u76EE\u6807\u548C\u5149\u6807\u4E4B\u95F4\u6709\u5C0F\u8282\u7EBF \u2192 \u65B0\u5F00 tie \u97F3\uFF08\u4F11\u6B62\u8DE8\u5C0F\u8282\u5C31\u518D\u5199\u4E00\u4E2A\u4F11\u6B62\uFF09\n  const barBetween = tokens.slice(target + 1, st.caret).some((x) => x.kind === \"bar\");\n  if (barBetween) {\n    const id = st.nextId;\n    const tok: Timed = t.kind === \"note\" ? { kind: \"note\", id, pitch: t.pitch, dur: by, lyric: null, tie: true } : { kind: \"rest\", id, dur: by };\n    const o = overwriteInsert(tokens, st.caret, tok);\n    return next(st, o.tokens, { caret: o.at + 1, nextId: id + 1, log: [...st.log, { k: \"tie\", id, unit }] });\n  }\n  const d = t.dur + by;\n  if (!validDur(d)) return st;\n  const e = eatRests(tokens, target + 1, by), nt = [...tokens.slice(0, target), { ...t, dur: d } as Token, ...e.keep, ...tokens.slice(e.end)];\n  return next(st, nt, { log: [...st.log, { k: \"ext\", id: t.id, by, ...(e.got ? { ate: e.got } : {}) }] });   // \u5403\u6389\u7684\u4F11\u6B62\u90FD\u5728\u5149\u6807\u540E\u9762\uFF1A\u5149\u6807\u4E0D\u7528\u632A\n}\n\n/** \u9000\u683C\uFF1A\u53EA\u9009\u4E86\u4E00\u4E2A\u97F3 = \u77ED\u4E00\u6B65\uFF08v0.10.5\uFF1Buser\u300C\u4E0D\uFF0C\u6211\u8BF4\u7684\u5C31\u662F\u9000\u683C\uFF0C\u4E0D\u8FC7\u5728\u8FD9\u4E2Acontext\u4E0B\u9762\u53EF\u4EE5\u6539\u56FE\u6807\u300D\uFF09\uFF1B\u9009\u4E86\u597D\u51E0\u4E2A = \u5220\u9009\u4E2D\uFF1B\n *  \u5199\u7684\u65F6\u5019 = \u64A4\u56DE\u672C\u6B21\u8F93\u5165\u8BB0\u5F55\u7684\u6700\u540E\u4E00\u7B14\uFF08\u5199\u7684\u65F6\u5019\u5403\u6389\u7684\u4F11\u6B62\u539F\u6837\u653E\u56DE\u53BB\uFF0C\u540E\u9762\u4E0D\u632A\uFF09\uFF0C\u8BB0\u5F55\u7A7A\u4E86\u5C31\u5220\u5149\u6807\u524D\u4E00\u4E2A token\u3002 */\nexport function backspace(st: EditorState): EditorState {\n  const one = singleSel(st);\n  if (one >= 0) return resizeSingle(st, one, -unitDur(st.input));\n  if (st.sel) return fillSel(st, { kind: \"rest\" });   // \u9009\u4E86\u597D\u51E0\u4E2A = \u6362\u6210\u4E00\u6837\u957F\u7684\u4F11\u6B62\uFF08\u540E\u9762\u4E0D\u632A\uFF1B\u60F3\u5408\u62E2 = Delete\uFF09\n  const tokens = tr(st);\n  while (st.log.length) {\n    const e = st.log[st.log.length - 1], log = st.log.slice(0, -1), i = indexOfId(tokens, e.id);\n    if (i < 0) { st = { ...st, log }; continue; }   // \u8BB0\u5F55\u91CC\u7684\u4E1C\u897F\u5DF2\u7ECF\u4E0D\u5728\u4E86\uFF08\u522B\u5904\u5220\u8FC7\uFF09\uFF1A\u8DF3\u8FC7\u8FD9\u7B14\n    const nt = tokens.slice();\n    if (e.k === \"ext\") { const t = nt[i] as Timed; nt[i] = { ...t, dur: t.dur - e.by }; if (e.ate) nt.splice(i + 1, 0, { kind: \"rest\", id: st.nextId, dur: e.ate } as Token); return next(st, nt, { log, ...(e.ate ? { nextId: st.nextId + 1 } : {}) }); }\n    if (e.k === \"fill\") { const t = nt[i] as NoteTok; nt[i] = { ...t, pitch: null }; return next(st, nt, { log, caret: i }); }\n    if (e.k === \"ins\" && e.ate) { nt[i] = { kind: \"rest\", id: nt[i].id, dur: e.ate } as Token; return next(st, nt, { log, caret: i }); }   // \u5199\u7684\u65F6\u5019\u5403\u6389\u4E86\u4F11\u6B62 = \u653E\u56DE\u53BB\uFF08\u540E\u9762\u4E0D\u632A\uFF09\n    nt.splice(i, 1);                                // ins / tie\uFF1A\u5220\u6389\u90A3\u4E2A token\n    return next(st, nt, { log, caret: i < st.caret ? st.caret - 1 : st.caret });\n  }\n  if (st.caret <= headLen(tokens)) return st;   // \u8C31\u5934\u5220\u4E0D\u6389\n  // \u5149\u6807\u524D\u6700\u8FD1\u7684\u97F3 / \u4F11\u6B62 / \u624B\u52A8\u5C0F\u8282\u7EBF\uFF08\u4E2D\u95F4\u9694\u7740\u7684\u4E0D\u5360\u65F6\u503C\u7684\u8BB0\u53F7\u7559\u7740\uFF09\u3002\n  // v0.10.7\uFF08user 2026-10-10 \u9009\u300C\u7559\u4F11\u6B62\u300D\uFF1A\u5149\u6807\u4E0B \u232B \u5220\u4E00\u4E2A\u97F3 = \u7559\u4E00\u6837\u957F\u7684\u4F11\u6B62\uFF0C\u540E\u9762\u4E0D\u632A\uFF0C\u548C\u5199\u97F3\u8986\u76D6\u4F11\u6B62\u5BF9\u79F0\uFF1B\u60F3\u5408\u62E2 = Delete\uFF09\uFF1A\n  //   \u97F3 \u2192 \u4E00\u6837\u957F\u7684\u4F11\u6B62\u3001\u5149\u6807\u9000\u5230\u5B83\u524D\u9762\uFF08\u63A5\u7740\u6309 = \u63A5\u7740\u5F80\u524D\u6539\uFF1B\u63A5\u7740\u5199 = \u8986\u76D6\u5B83\uFF09\uFF1B\u4EBA\u63D2\u7684\u300C|\u300D\u7167\u65E7\u5220\u6389\uFF08\u4E0D\u5360\u65F6\u503C\uFF09\u3002\n  //   \u4F11\u6B62 \u2192 \u6309\u952E\u76D8\u90A3\u4E00\u6863\uFF08\u957F\u77ED\u65CB\u94AE\uFF09\u4E00\u6B65\u4E00\u6B65\u5220\u3001\u540E\u9762\u7684\u5F80\u524D\u5408\u62E2\uFF1B\u5269\u7684\u4E0D\u5230\u4E00\u6B65 = \u6574\u4E2A\u5220\u6389\uFF08v0.10.19\uFF0Cuser\u300Cbackspace: remove the note or the mute.\n  //   perhaps for mute backspace removes it by step duration of the keyboard. or the minimal mute left?\u300D\uFF1Bv0.10.17 \u662F\u4E00\u4E0B\u6574\u4E2A\u5220\u6389\uFF0C\u66F4\u65E9\u662F\u5149\u6807\u632A\u8FC7\u5B83\u3001\u6C38\u8FDC\u5220\u4E0D\u6389\uFF09\u3002\n  let i = st.caret - 1; while (i >= headLen(tokens) && !stopTok(tokens[i])) i--;\n  if (i < headLen(tokens)) return st;\n  const t = tokens[i];\n  if (t.kind === \"note\") { const nt = tokens.slice(); nt[i] = { kind: \"rest\", id: t.id, dur: t.dur } as Token; dropTieAfter(nt, i); return next(leave(st), nt, { caret: i }); }\n  if (t.kind === \"rest\") {\n    const step = unitDur(st.input), nt = tokens.slice();\n    if (t.dur > step + 1e-6) { nt[i] = { ...t, dur: t.dur - step }; return next(leave(st), nt, {}); }   // \u77ED\u4E00\u6B65\uFF0C\u5149\u6807\u8FD8\u5728\u5B83\u540E\u9762\uFF08\u63A5\u7740\u6309 = \u63A5\u7740\u5220\uFF09\n  }\n  const nt = tokens.slice(); nt.splice(i, 1);   // \u4F11\u6B62\uFF08\u5269\u7684\u4E0D\u5230\u4E00\u6B65\uFF09/\u300C|\u300D\uFF1A\u5220\u6389\n  return afterDelete(st, nt, { caret: st.caret - 1 });\n}\nexport function deleteForward(st: EditorState): EditorState {\n  if (st.sel) return deleteSel(st);\n  if (st.caret >= tr(st).length) return st;\n  const toks = tr(st); let i = st.caret; while (i < toks.length && !stopTok(toks[i])) i++;   // \u540C\u9000\u683C\uFF1A\u53EA\u5220\u97F3 / \u4F11\u6B62 / \u5C0F\u8282\u7EBF\n  if (i >= toks.length) return st;\n  const nt = toks.slice(); nt.splice(i, 1);\n  return afterDelete(leave(st), nt, { caret: st.caret });\n}\n\n// \u2500\u2500 \u8F93\u5165\u72B6\u6001\uFF08\u5199\u7684\u65F6\u5019\u6539\u7684\u662F\u4E0B\u4E00\u4E2A\u97F3\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u957F\u77ED\u57FA\u7EBF\u76F4\u63A5\u8BBE\u6210\u7B2C\u51E0\u6863\uFF08pad \u7684\u957F\u77ED\u65CB\u94AE\u70B9\u5F00\u9009\uFF09\u3002 */\nexport function setUnit(st: EditorState, unit: number): EditorState { return { ...st, input: { ...st.input, unit: Math.max(0, Math.min(LADDER.length - 1, unit)) } }; }\n/** \u957F\u77ED = \u8F93\u5165\u6863\u4F4D\uFF08\u63A5\u4E0B\u6765\u5199\u7684\u957F\u77ED\uFF1B\u5230\u5934\u4E0D\u52A8\uFF09\u3002\u6709\u9009\u533A\u4E5F\u4E00\u6837\u2014\u2014\u9009\u533A\u91CC\u5199 = \u66FF\u6362\u6A21\u5F0F\u6309\u8FD9\u4E00\u6863\u5403\uFF08\u952E\u76D8\u53EA\u7BA1\u6253\u8C31\uFF1B\n *  \u6574\u7EC4\u6539\u65F6\u503C = \u9009\u533A\u83DC\u5355 scaleSelDur / setSelDur\uFF1B2026-10-08 user\u300C\u79FB\u8C03\u8F6C\u8C03\u548C\u957F\u5EA6\u4EE5\u53CA\u5176\u4ED6\u7684\u64CD\u4F5C\u4E0D\u8981\u7528keyboard\uFF0C\u800C\u662F\u4E00\u4E2A\u5C0F\u7684\u4E0A\u4E0B\u6587\u83DC\u5355\u300D\uFF09\u3002 */\nexport function shorter(st: EditorState): EditorState {\n  return st.input.unit > 0 ? { ...st, input: { ...st.input, unit: st.input.unit - 1 } } : st;\n}\nexport function longer(st: EditorState): EditorState {\n  return st.input.unit < LADDER.length - 1 ? { ...st, input: { ...st.input, unit: st.input.unit + 1 } } : st;\n}\n/** \u9009\u533A\u83DC\u5355\u300C\u00F72 / \u00D72\u300D\uFF1A\u9009\u4E2D\u7684\u97F3 / \u4F11\u6B62\u90FD\u4E58\u8FD9\u4E2A\u6570\uFF08\u8D85\u51FA\u5168\u97F3\u7B26 / \u4E09\u5341\u4E8C\u5206\u7684\u90A3\u4E2A\u4E0D\u52A8\uFF09\u3002 */\nexport function scaleSelDur(st: EditorState, f: 0.5 | 2): EditorState { return mapSelDur(st, (d) => d * f); }\n/** \u9644\u70B9\uFF08\u9009\u533A\u90A3\u4E00\u6392\u5FAE\u8C03\uFF0Cv0.10.1\uFF09\uFF1A\u9009\u4E2D\u7684\u90FD\u5E26\u9644\u70B9 = \u90FD\u53BB\u6389\uFF1B\u5426\u5219\u4E0D\u5E26\u9644\u70B9\u7684\u666E\u901A\u65F6\u503C\u90FD\u52A0\u4E0A\uFF08\u8FDE\u97F3\u7B49\u522B\u7684\u65F6\u503C\u4E0D\u52A8\uFF09\u3002 */\nexport function toggleSelDot(st: EditorState): EditorState {\n  if (!st.sel) return st;\n  const plain = (d: number) => { for (let k = 0; k <= 6; k++) if (d === WHOLE / 2 ** k) return true; return false; };\n  const timed = tr(st).slice(st.sel.from, st.sel.to).filter(isTimed), dotted = (d: number) => d % 3 === 0 && plain((d * 2) / 3);\n  const allDotted = timed.length > 0 && timed.every((t) => dotted(t.dur));\n  return mapSelDur(st, (d) => (allDotted ? (d * 2) / 3 : plain(d) ? d * 1.5 : d));\n}\n/** \u8FDE\u97F3\uFF1A\u8BBE\u6210 0 / 3 / 5 / 6 / 7\uFF08\u9501\u5B9A\u5F0F\uFF1B\u5019\u9009\u7531\u754C\u9762\u5F39\uFF09\u3002 */\nexport function setTuplet(st: EditorState, n: InputState[\"tuplet\"]): EditorState { return { ...st, input: { ...st.input, tuplet: n } }; }\n/** \u266F / \u266D Shift\uFF1A\u5173 \u2192 \u4E00\u6B21\uFF1B\u4E00\u6B21\u4E14 350 ms \u5185\u518D\u70B9 \u2192 \u9501\uFF1B\u5176\u4F59 \u2192 \u5173\u3002\u6709\u9009\u4E2D = \u9009\u4E2D\u7684\u97F3\u76F4\u63A5\u5347\u964D\u534A\u97F3\u3002 */\nexport function tapAcc(st: EditorState, acc: Exclude<Acc, 0>, now: number): EditorState {\n  if (st.sel) return mapSelPitch(st, (p) => alterBy(p, acc));\n  const i = st.input, l = latchDown({ ...LATCH_OFF, mode: i.acc === acc ? i.accMode : \"off\", at: i.accAt }, now);   // \u6362\u4E86\u4E00\u79CD\u5347\u964D = \u4ECE\u5934\u7B97\uFF08off \u2192 once\uFF09\n  return { ...st, input: { ...i, acc: l.mode === \"off\" ? 0 : acc, accMode: l.mode, accAt: now } };\n}\n/** \u76F4\u63A5\u8BBE\u5347\u964D Shift \u7684\u72B6\u6001\uFF08pad \u5347\u964D\u952E\u6309\u4F4F / \u6ED1\u7740\u6362\u7684\u65F6\u5019\u7528\uFF1BaccAt \u4E0D\u52A8\uFF0C\u8FDE\u70B9\u5224\u5B9A\u7167\u65E7\uFF09\u3002 */\nexport function setAccState(st: EditorState, acc: Acc, mode: InputState[\"accMode\"]): EditorState {\n  const i = st.input;\n  return i.acc === acc && i.accMode === mode ? st : { ...st, input: { ...i, acc: mode === \"off\" ? 0 : acc, accMode: mode === \"off\" || acc === 0 ? \"off\" : mode } };\n}\n/** \u300C1=\u300D\uFF1A\u53EA\u7BA1\u8F93\u5165\uFF08user\u300Cafter you change the 1=???, the original inputted note should not be changed\u300D\uFF09\u3002 */\nexport function setInputKey(st: EditorState, fifths: number): EditorState { return { ...st, input: { ...st.input, inputFifths: Math.max(-7, Math.min(7, fifths)) } }; }\n/** pad \u7684\u8C03\u5F0F\uFF1A\u53EA\u7BA1 pad \u4E0A\u6392\u54EA\u4E9B\u97F3\u3002 */\nexport function setInputScale(st: EditorState, id: string): EditorState { return { ...st, input: { ...st.input, inputScale: id } }; }\n\n// \u2500\u2500 \u6539\uFF08\u9009\u4E2D\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction firstNoteIn(st: EditorState): number {\n  if (!st.sel) return -1;\n  for (let i = st.sel.from; i < st.sel.to; i++) if (tr(st)[i].kind === \"note\") return i;\n  return -1;\n}\n/** \u9009\u4E2D\u7684\u97F3 / \u4F11\u6B62\u5168\u90E8\u6539\u6210\u8FD9\u4E00\u6863\uFF08\u9009\u533A\u83DC\u5355\u300C\u90FD\u6539\u6210 \u266A\u300D= pad \u957F\u77ED\u65CB\u94AE\u73B0\u5728\u90A3\u4E00\u6863\uFF1B\u8FDE\u97F3\u8DDF pad \u73B0\u5728\u7684\u8FDE\u97F3\u8BBE\u7F6E\uFF09\u3002 */\nexport function setSelDur(st: EditorState, unit: number): EditorState {\n  const d = unitDur({ ...st.input, unit: Math.max(0, Math.min(LADDER.length - 1, unit)) });\n  return mapSelDur(st, () => d);\n}\n/** \u9009\u4E2D\u7684\u97F3 / \u4F11\u6B62\u73B0\u5728\u662F\u54EA\u4E00\u6863\uFF08\u90FD\u4E00\u6837\u624D\u6709\uFF1B\u957F\u77ED\u4E0D\u4E00 / \u4E0D\u662F\u6574\u6863 / \u6CA1\u9009 = null\uFF09\uFF1A\u9009\u533A\u83DC\u5355\u663E\u793A\u7528\u3002 */\nexport function selUnit(st: EditorState): number | null {\n  if (!st.sel) return null;\n  let u: number | null = null;\n  for (let i = st.sel.from; i < st.sel.to; i++) {\n    const t = tr(st)[i]; if (!isTimed(t)) continue;\n    const k = LADDER.indexOf(t.dur as (typeof LADDER)[number]); if (k < 0) return null;\n    if (u === null) u = k; else if (u !== k) return null;\n  }\n  return u;\n}\nfunction mapSelDur(st: EditorState, f: (d: number) => number): EditorState {\n  if (!st.sel) return st;\n  const nt = tr(st).slice(); let changed = false;\n  for (let i = st.sel.from; i < st.sel.to; i++) { const t = nt[i]; if (!isTimed(t)) continue; const d = f(t.dur); if (validDur(d)) { nt[i] = { ...t, dur: d }; changed = true; } }\n  return changed ? next(st, nt) : st;\n}\nfunction mapSelPitch(st: EditorState, f: (p: Pitch) => Pitch): EditorState {\n  if (!st.sel) return st;\n  const nt = tr(st).slice();\n  for (let i = st.sel.from; i < st.sel.to; i++) { const t = nt[i]; if (t.kind === \"note\") nt[i] = withPitches(t, (t.pitch ? allPitches(t) : [effectivePitch(nt, i)]).map(f)); }\n  return next(st, nt);\n}\nfunction deleteSel(st: EditorState): EditorState {\n  if (!st.sel) return st;\n  const nt = tr(st).slice(); nt.splice(st.sel.from, st.sel.to - st.sel.from);\n  return afterDelete(st, nt, { sel: null, caret: st.sel.from, log: [] });\n}\n\n/** \u6539\u97F3\u9AD8\uFF08\u2191\u2193 \u4E00\u7EA7 / Shift \u534A\u97F3 / Alt \u516B\u5EA6\uFF09\uFF1A\u6709\u9009\u4E2D = \u5168\u90E8\u9009\u4E2D\uFF1B\u5199\u7684\u65F6\u5019 = \u5149\u6807\u524D\u90A3\u4E2A\u97F3\u3002 */\nfunction mapTargetPitch(st: EditorState, f: (p: Pitch, fifths: number) => Pitch): EditorState {\n  if (st.sel) { const from = st.sel.from; return mapSelPitch(st, (p) => f(p, keyAt(tr(st), from))); }\n  const i = currentIndex(st);\n  if (i < 0 || tr(st)[i].kind !== \"note\") return st;\n  const nt = tr(st).slice(), t = nt[i] as NoteTok; nt[i] = withPitches(t, (t.pitch ? allPitches(t) : [effectivePitch(nt, i)]).map((p) => f(p, keyAt(tr(st), i))));\n  return next(st, nt);\n}\nexport const stepTarget = (st: EditorState, steps: number) => mapTargetPitch(st, (p, k) => stepBy(p, steps, k));\nexport const alterTarget = (st: EditorState, d: number) => mapTargetPitch(st, (p, k) => transposeSemis(p, d, k));   // \u6309\u8C03\u62FC\u5199\uFF08E \u5347\u534A\u97F3 = F\uFF09\nexport const octaveTarget = (st: EditorState, d: number) => mapTargetPitch(st, (p) => octaveBy(p, d));\n\n// \u2500\u2500 \u79FB\u8C03 / \u8F6C\u8C03\uFF08\u9009\u4E2D\u7684\u4E00\u6BB5\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// user\u300C\u7136\u540E\u5F88\u5FEB\u6211\u9700\u8981\u6846\u9009\u548C\u6574\u4F53\u79FB\u8C03\u8F6C\u8C03\u300D\u300C\u6846\u9009 + \u6574\u4F53\u79FB\u8C03 / \u8F6C\u8C03 \u4E5F\u5148\u505A\u300D\u3002\n\n/** \u79FB\u8C03\uFF1A\u9009\u4E2D\u7684\u97F3\u6574\u4F53\u79FB\u51E0\u4E2A\u534A\u97F3\uFF0C\u6309\u5404\u81EA\u6240\u5728\u7684\u8C03\u91CD\u65B0\u62FC\u5199\uFF1B\u8C03\u53F7\u4E0D\u52A8\u3002 */\nexport function transposeSel(st: EditorState, semis: number): EditorState {\n  if (!st.sel || !semis) return st;\n  const nt = tr(st).slice();\n  for (let i = st.sel.from; i < st.sel.to; i++) { const t = nt[i]; if (t.kind === \"note\" && t.pitch) nt[i] = withPitches(t, allPitches(t).map((p) => transposeSemis(p, semis, keyAt(tr(st), i)))); }\n  return next(st, nt);\n}\n/** \u6309\u8C03\u53F7\u62FC\u5199\uFF08\u9009\u4E2D\u7684\u4E00\u6BB5\uFF09\uFF1A\u8C03\u5185\u7684\u97F3\u6362\u6210\u8C03\u53F7\u91CC\u7684\u5199\u6CD5\uFF0C\u8C03\u5916\u7684\u4E0D\u52A8\uFF1B\u97F3\u9AD8\u4E0D\u53D8\uFF08\u5DF2\u7ECF\u5199\u4E0B\u7684\u8C31\u7528\u5B83\u6536\u62FE\uFF0C\u6BD4\u5982\u4E94\u4E2A\u5347\u53F7\u7684\u8C03\u91CC\u5168\u5199\u6210\u964D\u53F7\u7684\uFF09\u3002 */\nexport function respellSel(st: EditorState): EditorState {\n  if (!st.sel) return st;\n  const nt = tr(st).slice(); let changed = false;\n  for (let i = st.sel.from; i < st.sel.to; i++) {\n    const t = nt[i]; if (t.kind !== \"note\" || !t.pitch) continue;\n    const k = keyAt(tr(st), i), ps = allPitches(t), qs = ps.map((p) => keySpell(p, k));\n    if (qs.some((q, j) => q !== ps[j])) { nt[i] = withPitches(t, qs); changed = true; }\n  }\n  return changed ? next(st, nt) : st;\n}\n/** \u8F6C\u8C03\uFF1A\u9009\u4E2D\u7684\u4E00\u6BB5\u4ECE\u5F00\u5934\u751F\u6548\u7684\u8C03\u8F6C\u5230 toFifths\u2014\u2014\u97F3\u6309\u4E24\u4E2A\u4E3B\u97F3\u4E4B\u95F4\u7684\u97F3\u7A0B\u632A\uFF08\u5C31\u8FD1\u65B9\u5411\uFF0C\u62FC\u5199\u5173\u7CFB\u4E0D\u53D8\uFF09\uFF0C\n *  \u9009\u4E2D\u5F00\u5934\u7684\u8C03\u53F7\u6539\u6210\u65B0\u8C03\uFF08\u65C1\u8FB9\u5DF2\u6709\u8C03\u53F7 = \u6539\u5B83\uFF1B\u4ECE\u6B4C\u5F00\u5934\u9009 = \u6539\u8C31\u5934\uFF09\uFF0C\u9009\u4E2D\u540E\u9762\u63D2\u56DE\u539F\u6765\u7684\u8C03\uFF08\u540E\u9762\u672C\u6765\u5C31\u6709\u8C03\u53F7\u7684\u4E0D\u63D2\uFF09\uFF1B\n *  \u9009\u4E2D\u91CC\u9762\u7684\u8C03\u53F7\u8DDF\u7740\u4E00\u8D77\u632A\u3002\u9009\u4E2D\u4FDD\u6301\u5728\u632A\u8FC7\u7684\u90A3\u4E00\u6BB5\u4E0A\u3002 */\nexport function modulateSel(st: EditorState, toFifths: number): EditorState {\n  if (!st.sel) return st;\n  const { from, to } = st.sel, old = tr(st), f0 = keyAt(old, from), df = toFifths - f0;\n  if (!df) return st;\n  const { steps, semis } = keyInterval(f0, toFifths);\n  const wrap = (f: number) => (f > 7 ? f - 12 : f < -7 ? f + 12 : f);   // \u8D85\u51FA \u00B17 \u7528\u7B49\u97F3\u8C03\n  const nt = old.slice();\n  for (let i = from; i < to; i++) {\n    const t = nt[i];\n    if (t.kind === \"note\" && t.pitch) nt[i] = withPitches(t, allPitches(t).map((p) => transposeInterval(p, steps, semis)));\n    else if (t.kind === \"key\") nt[i] = { ...t, fifths: wrap(t.fifths + df) };\n  }\n  let nextId = st.nextId;\n  // \u540E\u9762\uFF1A\u63D2\u56DE\u539F\u6765\u7684\u8C03\uFF08\u540E\u9762\u8FDE\u7740\u7684\u8BB0\u53F7\u91CC\u5DF2\u6709\u8C03\u53F7 = \u5B83\u81EA\u5DF1\u8BF4\u4E86\u7B97\uFF09\n  if (to < nt.length) {\n    let hasKey = false; for (let i = to; i < nt.length && isMark(nt[i]); i++) if (nt[i].kind === \"key\") hasKey = true;\n    let after = toFifths; for (let i = from; i < to; i++) { const t = nt[i]; if (t.kind === \"key\") after = t.fifths; }   // \u9009\u4E2D\u672B\u5C3E\u751F\u6548\u7684\u65B0\u8C03\n    const back = keyAt(old, to);\n    if (!hasKey && back !== after) nt.splice(to, 0, { kind: \"key\", id: nextId++, fifths: back });\n  }\n  // \u5F00\u5934\uFF1A\u65C1\u8FB9\u8FDE\u7740\u7684\u8BB0\u53F7\u91CC\u6709\u8C03\u53F7 = \u6539\u5B83\uFF0C\u5426\u5219\u63D2\u4E00\u4E2A\n  let a = from; while (a > 0 && isMark(nt[a - 1])) a--;\n  let b = from; while (b < nt.length && isMark(nt[b])) b++;\n  let shift = 0, keyIdx = -1;\n  for (let i = a; i < b; i++) if (nt[i].kind === \"key\") keyIdx = i;\n  if (keyIdx >= 0 && keyIdx < from) nt[keyIdx] = { ...(nt[keyIdx] as KeyTok), fifths: toFifths };\n  else if (keyIdx < 0) { nt.splice(from, 0, { kind: \"key\", id: nextId++, fifths: toFifths }); shift = 1; }\n  const sel = { from: from + shift, to: to + shift };\n  // \u6536\u5C3E\uFF1A\u6309\u632A\u5B8C\u4E4B\u540E\u5404\u81EA\u6240\u5728\u7684\u8C03\u7B80\u5316\u62FC\u5199\uFF08\u9009\u4E2D\u91CC\u7684\u8C03\u53F7\u4F1A\u88AB\u6362\u6210\u7B49\u97F3\u8C03\uFF0C\u6309\u97F3\u7A0B\u632A\u7684\u62FC\u6CD5\u53EF\u80FD\u548C\u5B83\u5BF9\u4E0D\u4E0A\uFF09\n  for (let i = sel.from; i < sel.to; i++) {\n    const t = nt[i]; if (t.kind !== \"note\" || !t.pitch) continue;\n    const k = keyAt(nt, i), ps = allPitches(t), qs = ps.map((q) => keySpell(q, k));\n    if (qs.some((q, n) => q !== ps[n])) nt[i] = withPitches(t, qs);\n  }\n  return next({ ...st, nextId }, nt, { sel, caret: sel.to });\n}\n\n// \u2500\u2500 \u6574\u6BB5 / \u6574\u9996\u79FB\u8C03\u8F6C\u8C03\uFF08v0.9.33\uFF1Buser 2026-10-09\u300C\u6742\u4E8B\u8BB0\u8D26\uFF1A\u6BB5\u7EA7\u522B\u548C\u5DE5\u7A0B\u7EA7\u522B\u7684\u6574\u4F53\u79FB\u8C03\u8F6C\u8C03\u300D\u2192 10-10\u300C\u5C0F\u4EF6\u505A\u300D\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u7B49\u97F3\u8C03\u91CC\u6311\u5347\u964D\u53F7\u5C11\u7684\uFF08\u00B16 \u5E73\u624B = \u8DDF raw \u7684\u53F7\uFF09\u3002 */\nfunction plainKey(raw: number): number {\n  const r = ((raw % 12) + 12) % 12, c = [r, r - 12].filter((f) => f >= -7 && f <= 7);\n  return c.reduce((a, b) => (Math.abs(b) < Math.abs(a) || (Math.abs(b) === Math.abs(a) && Math.sign(b) === Math.sign(raw)) ? b : a));\n}\n/** \u53C2\u7167\u8C03 = \u8303\u56F4\u91CC\u7B2C\u4E00\u5F20\u7EB8\u5F00\u5934\u3001\u6700\u4E0A\u9762\u90A3\u4F4D\u5728\u573A\u6B4C\u624B\u90A3\u4E00\u884C\u7684\u8C03\u53F7\uFF08\u540C\u901F\u5EA6\u8BB0\u53F7\u7684\u89C4\u77E9\uFF09\u3002 */\nexport function scopeKey(song: Song, paperIds: readonly string[]): number {\n  const paper = song.papers.find((p) => p.id === paperIds[0]); if (!paper) return 0;\n  const owner = tempoOwner(song, paper), toks = owner ? paper.tracks[owner] ?? [] : [];\n  return keyAt(toks, toks.length ? headLen(toks) : 0);\n}\n/** \u79FB\u8C03 semis \u4E2A\u534A\u97F3\u4E4B\u540E\uFF0C\u53C2\u7167\u8C03\u53D8\u6210\u54EA\u4E2A\uFF08\u5347\u964D\u53F7\u5C11\u7684\u5199\u6CD5\uFF09\u3002 */\nexport const keyAfterSemis = (f0: number, semis: number): number => (semis % 12 === 0 ? f0 : plainKey(f0 + 7 * semis));   // \u632A\u516B\u5EA6 = \u8C03\u53F7\u4E0D\u53D8\n/** \u51E0\u5F20\u7EB8\u4E0A\u6240\u6709\u58F0\u90E8\u4E00\u8D77\u79FB\u8C03 / \u8F6C\u8C03\u3002how = { semis }\uFF1A\u6574\u4F53\u632A\u51E0\u4E2A\u534A\u97F3\uFF08\u8C03\u53F7\u8DDF\u7740\u632A\uFF0C\u53D6\u5347\u964D\u53F7\u5C11\u7684\u5199\u6CD5\uFF1B\u00B112 = \u632A\u516B\u5EA6\u3001\u8C03\u53F7\u4E0D\u53D8\uFF09\uFF1B\n *  { toFifths }\uFF1A\u53C2\u7167\u8C03\u8F6C\u5230\u8FD9\u4E2A\u8C03\uFF08\u97F3\u6309\u4E24\u4E2A\u4E3B\u97F3\u4E4B\u95F4\u7684\u97F3\u7A0B\u632A\uFF0C\u5C31\u8FD1\u65B9\u5411\uFF09\u3002\u8303\u56F4\u91CC\u6BCF\u4E2A\u8C03\u53F7\uFF08\u8C31\u5934\u7684\u3001\u4E2D\u9014\u7684\uFF09\u632A\u540C\u6837\u7684\u91CF\uFF0C\n *  \u97F3\u6309\u540C\u4E00\u4E2A\u97F3\u7A0B\u632A\uFF08\u62FC\u5199\u5173\u7CFB\u4E0D\u53D8\uFF09\uFF0C\u632A\u5B8C\u6309\u5404\u81EA\u7684\u8C03\u53F7\u7B80\u5316\u62FC\u5199\u3002skip = \u4E0D\u52A8\u7684\u58F0\u90E8\uFF08\u53F0\u4E0A\u56FA\u5B9A\u6572\u4E00\u4E2A\u952E\u7684\uFF1A\u8C31\u4E0A\u7684\u97F3\u9AD8\u4E0D\u62FF\u6765\u51FA\u58F0\uFF09\u3002\n *  \u53EA\u6539\u97F3\u9AD8\u548C\u8C03\u53F7\uFF1A\u4E0D\u63D2\u4E0D\u5220 token\uFF0C\u5149\u6807 / \u9009\u533A\u539F\u6837\uFF1B\u6B4C\u8BCD\u3001\u8BB0\u53F7\u3001\u8C31\u53F7\u3001\u516B\u5EA6\u7EBF\u4E0D\u52A8\u3002 */\nexport function transposePapers(st: EditorState, paperIds: readonly string[], how: { semis: number } | { toFifths: number }, skip?: ReadonlySet<string>): EditorState {\n  const f0 = scopeKey(st.song, paperIds);\n  let f1: number, steps: number, semis: number;\n  if (\"semis\" in how) {\n    if (!how.semis) return st;\n    f1 = keyAfterSemis(f0, how.semis);\n    const iv = keyInterval(f0, f1), rem = how.semis - iv.semis;   // rem = 12 \u7684\u500D\u6570\uFF08keyInterval \u53D6\u5C31\u8FD1\u65B9\u5411\uFF09\n    steps = iv.steps + (7 * rem) / 12; semis = how.semis;\n  } else {\n    f1 = how.toFifths; ({ steps, semis } = keyInterval(f0, f1));\n    if (f1 === f0) return st;\n  }\n  const df = f1 - f0, want = new Set(paperIds);\n  let changed = false;\n  const papers = st.song.papers.map((paper) => {\n    if (!want.has(paper.id)) return paper;\n    const tracks: Record<string, Token[]> = {};\n    for (const [pid, toks] of Object.entries(paper.tracks)) {\n      if (skip?.has(pid)) { tracks[pid] = toks; continue; }\n      const nt = toks.map((t): Token => {\n        if (t.kind === \"key\") return df ? { ...t, fifths: plainKey(t.fifths + df) } : t;\n        if (t.kind === \"note\" && t.pitch) return withPitches(t, allPitches(t).map((p) => transposeInterval(p, steps, semis)));\n        return t;\n      });\n      if (df) for (let i = 0; i < nt.length; i++) {   // \u6309\u632A\u5B8C\u4E4B\u540E\u5404\u81EA\u7684\u8C03\u53F7\u7B80\u5316\u62FC\u5199\uFF08\u632A\u516B\u5EA6\u4E0D\u52A8\u62FC\u5199\uFF09\uFF08\u8C03\u53F7\u6362\u6210\u4E86\u7B49\u97F3\u8C03\u65F6\uFF0C\u6309\u97F3\u7A0B\u632A\u7684\u62FC\u6CD5\u53EF\u80FD\u548C\u5B83\u5BF9\u4E0D\u4E0A\uFF09\n        const t = nt[i]; if (t.kind !== \"note\" || !t.pitch) continue;\n        const k = keyAt(nt, i), ps = allPitches(t), qs = ps.map((q) => keySpell(q, k));\n        if (qs.some((q, n) => q !== ps[n])) nt[i] = withPitches(t, qs);\n      }\n      if (nt.some((t, i) => t !== toks[i])) changed = true;\n      tracks[pid] = nt;\n    }\n    return { ...paper, tracks };\n  });\n  return changed ? { ...st, song: { ...st.song, papers } } : st;\n}\n\n// \u2500\u2500 \u5149\u6807\u4E0E\u9009\u4E2D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u653E\u5149\u6807\uFF08= \u5199\uFF09\uFF1A\u6E05\u9009\u4E2D\u3001\u6E05\u672C\u6B21\u8F93\u5165\u8BB0\u5F55\u3002 */\nexport const setCaret = (st: EditorState, caret: number): EditorState =>\n  ({ ...leave(st), sel: null, caret: Math.max(headLen(tr(st)), Math.min(tr(st).length, caret)), lead: undefined });\n/** \u5149\u6807\u653E\u5230\u8FD9\u6761 track \u5C3E\u5DF4\u540E\u9762\u8865\u9F50\u7684\u6DE1\u8272\u5C0F\u8282\u91CC\uFF08v0.10.6\uFF09\uFF1Alead = \u79BB\u5C3E\u5DF4\u591A\u5C11 tick\uFF08\u70B9\u7684\u90A3\u4E2A\u5C0F\u8282\u7684\u5F00\u5934\uFF09\uFF1B0 = \u5C31\u662F\u5C3E\u5DF4\u3002 */\nexport const setCaretLead = (st: EditorState, lead: number): EditorState => { const c = setCaret(st, tr(st).length); return lead > 1e-6 ? { ...c, lead } : c; };\n/** \u8FD9\u6761 track \u5C3E\u5DF4\u5728\u5C0F\u8282\u91CC\u8D70\u5230\u54EA\u4E86 + \u90A3\u91CC\u7684\u5C0F\u8282\u957F\uFF08\u540C\u6392\u7248\uFF1A\u62CD\u53F7 / \u4EBA\u63D2\u7684\u300C|\u300D/ \u5199\u6EE1\u81EA\u52A8\u6362\uFF1B\u62CD\u53F7\u4E2D\u9014\u53D8 = \u6CA1\u5199\u5B8C\u7684\u5C0F\u8282\u5C31\u6B64\u7ED3\u675F\uFF09\u3002 */\nfunction barPosAtEnd(tokens: Token[]): { inBar: number; len: number } {\n  let len = (DEFAULT_TIME.beats * WHOLE) / DEFAULT_TIME.beatType, inBar = 0;\n  for (const t of tokens) {\n    if (t.kind === \"time\") { inBar = 0; len = (t.beats * WHOLE) / t.beatType; }\n    else if (t.kind === \"bar\") inBar = 0;\n    else if (isTimed(t)) { inBar += t.dur; while (inBar >= len - 1e-6) inBar -= len; if (inBar < 1e-6) inBar = 0; }\n  }\n  return { inBar, len };\n}\n/** \u5728\u7B2C i \u4E2A token \u524D\u9762\u5199\u97F3\u9AD8 p\uFF0C\u8C31\u4E0A\u8981\u753B\u7684\u4E34\u65F6\u8BB0\u53F7\uFF08v0.10.23\u300C\u5F39\u300D\u7684\u9B3C\u97F3\u7B26\u7528\uFF1Buser\u300C\u9B3C\u97F3\u7B26\u5E94\u8BE5\u6309\u7167\u5BF9\u5E94\u7684\u8C31\u53F7\u548C\u4E34\u65F6\u5347\u964D\u53F7\u6765\u663E\u793A\u5347\u964D\u53F7\u3002\u548C\u5BF9\u5E94\u7684\u771F\u97F3\u7B26\u8981\u4E00\u81F4\u300D\uFF09\uFF1A\n *  \u548C\u6392\u7248\uFF08engrave.ts unitsOf\uFF09\u540C\u4E00\u4E2A\u89C4\u77E9\u2014\u2014\u6309\u8C03\u53F7 + \u8FD9\u4E00\u5C0F\u8282\u91CC\u524D\u9762\u540C\u4E00\u4E2A\u97F3\u7EA7\u51FA\u73B0\u8FC7\u7684\u4E34\u65F6\u8BB0\u53F7\uFF1B\u6BCF\u5C0F\u8282\uFF08\u81EA\u52A8 / \u4EBA\u63D2\u7684\u5C0F\u8282\u7EBF\u3001\u6362\u62CD\u53F7\u3001\u6362\u8C03\u53F7\uFF09\u91CD\u65B0\u7B97\uFF1B\n *  \u8FDE\u97F3\u7EBF\u8FDE\u8FC7\u6765\u7684\u3001\u8DE8\u8FC7\u5C0F\u8282\u7EBF\u90A3\u540E\u534A\u622A\u4E0D\u7B97\u3002\u8FD4\u56DE\u8981\u753B\u7684 alter\uFF080 = \u8FD8\u539F\u53F7\uFF09\uFF1B\u4E0D\u7528\u753B = null\u3002 */\nexport function shownAccAt(tokens: Token[], i: number, p: Pitch): number | null {\n  let len = (DEFAULT_TIME.beats * WHOLE) / DEFAULT_TIME.beatType, inBar = 0, fifths = 0, acc = new Map<string, number>();\n  for (let k = 0; k < Math.min(i, tokens.length); k++) {\n    const t = tokens[k];\n    if (t.kind === \"key\") { fifths = t.fifths; acc = new Map(); continue; }\n    if (t.kind === \"time\") { len = (t.beats * WHOLE) / t.beatType; inBar = 0; acc = new Map(); continue; }\n    if (t.kind === \"bar\") { inBar = 0; acc = new Map(); continue; }\n    if (!isTimed(t)) continue;\n    if (inBar >= len - 1e-6) { inBar = 0; acc = new Map(); }   // \u4E0A\u4E00\u4E2A\u97F3\u6B63\u597D\u586B\u6EE1\u8FD9\u4E00\u5C0F\u8282\n    if (t.kind === \"note\" && !t.tie) for (const q of allPitches(t)) { const key = `${q.step}${q.octave}`, cur = acc.has(key) ? acc.get(key)! : keyAlter(q.step, fifths); if (q.alter !== cur) acc.set(key, q.alter); }\n    inBar += t.dur;\n    if (inBar > len + 1e-6) { while (inBar > len + 1e-6) inBar -= len; acc = new Map(); }   // \u8DE8\u8FC7\u4E86\u81EA\u52A8\u5C0F\u8282\u7EBF\uFF1A\u65B0\u7684\u4E00\u5C0F\u8282\u4ECE\u5934\u7B97\n  }\n  if (inBar >= len - 1e-6) acc = new Map();\n  const key = `${p.step}${p.octave}`, cur = acc.has(key) ? acc.get(key)! : keyAlter(p.step, fifths);\n  return p.alter === cur ? null : p.alter;\n}\n/** \u5199\u4E4B\u524D\u628A lead \u843D\u6210\u4F11\u6B62\uFF1A\u5148\u8865\u6EE1\u5C3E\u5DF4\u6240\u5728\u7684\u5C0F\u8282\uFF0C\u518D\u4E00\u5C0F\u8282\u4E00\u4E2A\uFF08\u6574\u5C0F\u8282\u4F11\u6B62\uFF09\uFF0C\u6700\u540E\u5269\u7684\u4E00\u622A\u3002\u5149\u6807\u5728\u65B0\u4F11\u6B62\u540E\u9762\u3002 */\nexport function materializeLead(st: EditorState): EditorState {\n  const lead = st.lead; if (!lead || st.sel || st.caret !== tr(st).length) return st.lead ? { ...st, lead: undefined } : st;\n  const tk = tr(st).slice(), { inBar, len } = barPosAtEnd(tk); let left = lead, id = st.nextId;\n  let piece = inBar > 0 ? Math.min(left, len - inBar) : Math.min(left, len);\n  while (left > 1e-6) { if (!validDur(piece)) break; tk.push({ kind: \"rest\", id: id++, dur: piece } as Token); left -= piece; piece = Math.min(left, len); }\n  return next(st, tk, { caret: tk.length, nextId: id });\n}\n/** \u9009\u4E2D\u4E00\u6BB5\uFF08= \u6539\uFF09\u3002 */\nexport function select(st: EditorState, from: number, to: number): EditorState {\n  const n = tr(st).length, a = Math.max(headLen(tr(st)), Math.min(from, to)), b = Math.min(n, Math.max(from, to));\n  if (b <= a) return setCaret(st, a);\n  return { ...leave(st), sel: { from: a, to: b }, caret: b, lead: undefined };\n}\n/** \u2190\u2192\uFF1A\u6709\u9009\u4E2D = \u6536\u6210\u5DE6 / \u53F3\u8FB9\u7684\u5149\u6807\uFF1B\u6CA1\u6709 = \u632A\u5149\u6807\u3002 */\n/** \u5149\u6807\u7684\u843D\u811A\u70B9\uFF082026-10-08\uFF0Cuser\u300C\u591A\u4E2A\u975E\u97F3\u8BB0\u53F7\u4F1A\u5F71\u54CD\u6B65\u8FDB\u5417\u300D\u300C\u5199\u97F3\u548C\u7B26\u53F7\uFF1A\u55EF\u7B80\u5316\u7684\u5FC3\u667A\u6A21\u578B\u597D\u300D\u300C\u624B\u52A8\u7684\u300C|\u300D\uFF1A\u5C5E\u4E8E\u5199\u97F3\u5C42\u2026\u540C\u610F\u300D\uFF09\uFF1A\n *  \u2190 \u2192 \u53EA\u505C\u5728\u97F3 / \u4F11\u6B62 / \u624B\u52A8\u5C0F\u8282\u7EBF\u540E\u9762\uFF08\u548C\u8C31\u5934\u540E\u9762\uFF09\uFF1B\u4E0D\u5360\u65F6\u503C\u7684\u8BB0\u53F7\uFF08\u529B\u5EA6\u3001\u6E10\u5F3A\u6E10\u5F31\u3001\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\u3001\u53E5\u53F7\uFF09\u6302\u5728\u540E\u9762\u90A3\u4E2A\u97F3\u4E0A\uFF0C\u4E0D\u5355\u72EC\u5360\u4E00\u6B65\u3002\n *  \u843D\u4E0B\u6765\u7684\u4F4D\u7F6E\u5728\u90A3\u4E9B\u8BB0\u53F7\u524D\u9762\uFF08\u5728\u90A3\u513F\u5199\u7684\u65B0\u97F3 = \u524D\u4E00\u4E2A\u72B6\u6001\u91CC\u7684\uFF0C\u8BB0\u53F7\u8FD8\u8DDF\u7740\u539F\u6765\u90A3\u4E2A\u97F3\uFF09\uFF1B\u521A\u63D2\u5B8C\u8BB0\u53F7\uFF0C\u5149\u6807\u5728\u8BB0\u53F7\u540E\u9762\uFF08\u63A5\u7740\u5199\u7684\u97F3\u5728\u8BB0\u53F7\u91CC\uFF0Cflow \u7167\u65E7\uFF09\u3002 */\nconst stopTok = (t: Token) => isTimed(t) || t.kind === \"bar\";\nexport function moveCaret(st: EditorState, d: number): EditorState {\n  const one = singleSel(st);\n  if (one >= 0) {   // \u6539\u4E00\u4E2A\u97F3\uFF1A\u2190 \u2192 \u6362\u5230\u524D\u4E00\u4E2A / \u540E\u4E00\u4E2A\u97F3\uFF08\u7EE7\u7EED\u5728\u6539\uFF1Bv0.10.5\uFF09\uFF1B\u5230\u5934 = \u4E0D\u52A8\n    const tk = tr(st); let j = one;\n    do j += d < 0 ? -1 : 1; while (j >= headLen(tk) && j < tk.length && !isTimed(tk[j]));\n    return j >= headLen(tk) && j < tk.length ? { ...select(st, j, j + 1), input: st.input } : st;\n  }\n  if (st.sel) return setCaret(st, d < 0 ? st.sel.from : st.sel.to);\n  const toks = tr(st), h = headLen(toks);\n  let c = st.caret;\n  for (let n = 0; n < Math.abs(d); n++) {\n    if (d < 0) {\n      let i = c - 1; while (i >= h && !stopTok(toks[i])) i--;   // \u5149\u6807\u524D\u6700\u8FD1\u7684\u97F3 / \u5C0F\u8282\u7EBF\n      if (i < h) { c = h; break; }\n      let j = i - 1; while (j >= h && !stopTok(toks[j])) j--;   // \u518D\u5F80\u524D\u4E00\u4E2A\u843D\u811A\u70B9\n      c = j < h ? h : j + 1;\n    } else {\n      let i = c; while (i < toks.length && !stopTok(toks[i])) i++;\n      c = i < toks.length ? i + 1 : toks.length;\n    }\n  }\n  return setCaret(st, c);\n}\n/** \u5220\u97F3\u4E4B\u540E\uFF1A\u4E0D\u518D\u7BA1\u4EFB\u4F55\u97F3\u7684\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\u300C\u6E6E\u706D\u300D\uFF082026-10-08\uFF0Cuser\u300C\u5927\u6279\u91CF\u5220\u97F3\u7684\u65F6\u5019\u4F1A\u4E0D\u4F1A\u5806\u4E00\u5806\u5F3A\u5EA6\u7B26\u53F7\u2026p f\u5220\u7B2C\u4E8C\u4E2A\u97F3\uFF0C\u4F1A\u53D8\u6210\uFF0C\u4F60\u89C9\u5F97\u662Fp\u8FD8\u662Ff?\u300D\uFF09\uFF1A\n *  \u4E24\u4E2A\u529B\u5EA6\u8BB0\u53F7\u4E4B\u95F4\u4E00\u4E2A\u97F3\u90FD\u6CA1\u6709 = \u524D\u9762\u90A3\u4E2A\u4E0D\u7BA1\u4EFB\u4F55\u97F3\uFF0C\u53BB\u6389\uFF0C\u7559\u540E\u9762\u90A3\u4E2A\uFF08p A f B C \u5220\u6389 A\u3001B \u2192 \u7559 f\uFF0CC \u672C\u6765\u5C31\u5728 f \u4E0B\u9762\uFF09\uFF1B\n *  \u6E10\u5F3A\u6E10\u5F31\u548C\u5B83\u7684\u7EC8\u70B9\uFF08\u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7 / \u4E0B\u4E00\u4E2A\u6E10\u5F3A\u6E10\u5F31 / \u8C31\u5C3E\uFF09\u4E4B\u95F4\u4E00\u4E2A\u97F3\u90FD\u6CA1\u6709 = \u53BB\u6389\u3002\u8FD4\u56DE\u53BB\u6389\u4E86\u51E0\u4E2A\u3001\u5404\u5728\u54EA\uFF08\u4E0B\u6807\uFF0C\u6309\u539F\u6765\u7684\u4E32\uFF09\u3002 */\nexport function annihilate(tokens: Token[]): { tokens: Token[]; removed: number[] } {\n  const drop = new Set<number>();\n  let lastDyn = -1, timedSince = true;\n  tokens.forEach((t, i) => {\n    if (isTimed(t)) { timedSince = true; return; }\n    if (t.kind === \"dyn\") { if (lastDyn >= 0 && !timedSince) drop.add(lastDyn); lastDyn = i; timedSince = false; }\n  });\n  tokens.forEach((t, i) => {\n    if (t.kind !== \"hairpin\") return;\n    for (let j = i + 1; j < tokens.length; j++) { const u = tokens[j]; if (isTimed(u)) return; if (u.kind === \"dyn\" || u.kind === \"hairpin\") break; }\n    drop.add(i);\n  });\n  if (!drop.size) return { tokens, removed: [] };\n  return { tokens: tokens.filter((_, i) => !drop.has(i)), removed: [...drop].sort((x, y) => x - y) };\n}\n/** \u5220\u4E86\u4E1C\u897F\u4E4B\u540E\u7EDF\u4E00\u6536\u5C3E\uFF1A\u6E6E\u706D + \u5149\u6807\u8DDF\u7740\u5F80\u56DE\u632A\uFF08\u88AB\u53BB\u6389\u7684\u5728\u5149\u6807\u524D\u9762\u7684\u90A3\u4E9B\uFF09\u3002 */\nfunction afterDelete(st: EditorState, nt: Token[], over: Partial<EditorState>): EditorState {\n  const a = annihilate(nt), caret = (over.caret ?? st.caret) - a.removed.filter((k) => k < (over.caret ?? st.caret)).length;\n  return next(st, a.tokens, { ...over, caret });\n}\n/** \u957F\u6309\u62D6\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\uFF082026-10-08 Opus 5.5\uFF1Buser \u6279\u300C\u529B\u5EA6\u548C\u6E10\u5F3A\u6E10\u5F31\u80FD\u957F\u6309\u62D6\u52A8\u300D\uFF09\uFF1A\u4E0B\u6807 from \u7684\u8BB0\u53F7\u632A\u5230\u4E0B\u6807 before \u90A3\u4E2A\u97F3\uFF08\u6216\u4F11\u6B62\uFF09\u524D\u9762 = \u4ECE\u90A3\u4E2A\u97F3\u8D77\u3002\n *  \u529B\u5EA6\u653E\u5728\u90A3\u513F\u5DF2\u6709\u7684\u6E10\u5F3A\u6E10\u5F31\u524D\u9762\uFF08\u300Cmp <\u300D\u7684\u987A\u5E8F\uFF09\uFF0C\u6E10\u5F3A\u6E10\u5F31\u653E\u6700\u540E\uFF1B\u632A\u5B8C\u6E6E\u706D\u2014\u2014\u843D\u5230\u5DF2\u7ECF\u6709\u529B\u5EA6\u8BB0\u53F7\u7684\u97F3\u4E0A = \u632A\u8FC7\u53BB\u7684\u90A3\u4E2A\u7B97\u6570\u3001\u539F\u6765\u90A3\u4E2A\u53BB\u6389\u3002\n *  removed = \u6E6E\u706D\u6389\u4E86\u51E0\u4E2A\uFF08\u8C03\u7528\u65B9\u8BF4\u4E00\u58F0\uFF09\u3002\u6CA1\u632A\u52A8\uFF08\u540C\u4E00\u4E2A\u97F3 / \u4E0D\u662F\u8FD9\u4E24\u79CD\u8BB0\u53F7\uFF09= \u539F\u6837\u3002\u9009\u533A\u6536\u6389\uFF0C\u5149\u6807\u8DDF\u7740\u540C\u4E00\u4E2A\u97F3\u3002 */\nexport function moveMark(st: EditorState, from: number, before: number): { st: EditorState; removed: number } {\n  const toks = tr(st), m = toks[from];\n  if (!m || (m.kind !== \"dyn\" && m.kind !== \"hairpin\" && m.kind !== \"groove\") || !toks[before] || !isTimed(toks[before])) return { st, removed: 0 };\n  const nt = toks.slice(); nt.splice(from, 1);\n  let at = before - (before > from ? 1 : 0);   // \u90A3\u4E2A\u97F3\u73B0\u5728\u7684\u4E0B\u6807\n  if (m.kind === \"dyn\") { let a = at; while (a > headLen(nt) && !isTimed(nt[a - 1]) && nt[a - 1].kind !== \"bar\") a--; for (let k = a; k < at; k++) if (nt[k].kind === \"hairpin\") { at = k; break; } }\n  nt.splice(at, 0, m);\n  if (nt.every((t, k) => t === toks[k])) return { st, removed: 0 };\n  const c1 = st.caret - (st.caret > from ? 1 : 0), c2 = c1 + (c1 > at ? 1 : 0), a = annihilate(nt);\n  return { st: next(st, a.tokens, { caret: c2 - a.removed.filter((k) => k < c2).length, sel: null }), removed: a.removed.length };\n}\n/** \u70B9\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\u7684\u5C0F\u83DC\u5355\uFF1A\u6539\u6210\u522B\u7684\u529B\u5EA6 / \u6362\u65B9\u5411\uFF1Bnull = \u5220\u6389\uFF08\u5149\u6807\u8DDF\u7740\uFF09\u3002 */\nexport function editMarkAt(st: EditorState, i: number, change: { value: Dyn } | { dir: \"cresc\" | \"dim\" } | { ramp: boolean } | { style: string } | { amount: number } | { shift: boolean } | { nav: Exclude<NavWhat, \"ending\"> } | { nums: number[] } | null): EditorState {\n  const toks = tr(st), m = toks[i];\n  if (!m || (m.kind !== \"dyn\" && m.kind !== \"hairpin\" && m.kind !== \"groove\" && m.kind !== \"nav\")) return st;\n  const nt = toks.slice();\n  if (change === null) { nt.splice(i, 1); return next(st, nt, { caret: st.caret - (i < st.caret ? 1 : 0), sel: null }); }\n  if (m.kind === \"dyn\" && \"value\" in change) { if (m.value === change.value) return st; nt[i] = { ...m, value: change.value }; return next(st, nt); }\n  if (m.kind === \"dyn\" && \"ramp\" in change) { if (!!m.ramp === change.ramp) return st; const { ramp: _r, ...rest } = m; nt[i] = change.ramp ? { ...rest, ramp: true } : rest; return next(st, nt); }\n  if (m.kind === \"hairpin\" && \"dir\" in change) { if (m.dir === change.dir) return st; nt[i] = { ...m, dir: change.dir }; return next(st, nt); }\n  if (m.kind === \"nav\" && \"nav\" in change && m.what !== \"ending\") { if (m.what === change.nav) return st; nt[i] = { ...m, what: change.nav }; return next(st, nt); }\n  if (m.kind === \"nav\" && \"nums\" in change && m.what === \"ending\") { const nums = [...new Set(change.nums)].sort((a, b) => a - b); if (!nums.length || nums.join() === (m.nums ?? [1]).join()) return st; nt[i] = { ...m, nums }; return next(st, nt); }\n  if (m.kind === \"groove\" && \"shift\" in change) { if (!!m.shift === change.shift) return st; const { shift: _s, ...rest } = m; nt[i] = change.shift ? { ...rest, shift: true } : rest; return next(st, nt); }\n  if (m.kind === \"groove\" && \"style\" in change) { if (m.style === change.style) return st; nt[i] = { ...m, style: change.style }; return next(st, nt); }\n  if (m.kind === \"groove\" && \"amount\" in change) { const a = Math.round(change.amount * 100) / 100; if ((m.amount ?? 1) === a) return st; const { amount: _a, ...rest } = m; nt[i] = a === 1 ? rest : { ...rest, amount: a }; return next(st, nt); }\n  return st;\n}\n/** \u7B26\u53F7\u6A21\u5F0F\u7684\u9000\u683C\uFF082026-10-08\uFF0Cuser\u300C\u9000\u683C\u53EA\u5220\u7B26\u53F7\u6216\u8005\u6CA1\u7B26\u53F7\u7684\u65F6\u5019\u9000\u4E00\u6B65\uFF0C\u4E0D\u5220\u97F3\u7B26\u300D\uFF09\uFF1A\n *  \u2460 \u5149\u6807\u524D\u9762\u7D27\u6328\u7740\u7684\u4E0D\u5360\u65F6\u503C\u7684\u8BB0\u53F7\uFF08\u529B\u5EA6 / \u6E10\u5F3A\u6E10\u5F31 / \u53E5\u53F7 / \u4E2D\u9014\u7684\u8C03\u53F7\u62CD\u53F7\u901F\u5EA6\uFF09\u2192 \u5220\u6700\u540E\u4E00\u4E2A\uFF1B\n *  \u2461 \u6CA1\u6709 = \u6302\u5728\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u4E0A\u7684\u529B\u5EA6 / \u6E10\u5F3A\u6E10\u5F31 / \u98CE\u683C\uFF08\u7D27\u6328\u5728\u5B83\u524D\u9762\uFF09\uFF0C\u518D\u662F\u90A3\u4E2A\u97F3\u8EAB\u4E0A\u7684\u88C5\u9970\uFF0C\u4E00\u6B21\u4E00\u4E2A\u3001\u4ECE\u6700\u5916\u5C42\u5F00\u59CB\uFF1A\u97F3\u5185\u8D77\u4F0F \u2192 \u97F3\u5934\uFF08\u5F3A\u97F3 / \u91CD\u97F3 / \u7A81\u5F3A / \u5F3A\u540E\u5373\u5F31\uFF09\u2192 \u4FDD\u6301 \u2192 \u8DF3\u97F3 \u2192 \u6C14\u58F0 \u2192 \u51FA\u58F0\u7684\u6362\u6C14 \u2192 \u547C\u5438 \u2192 \u8FDE\u7EBF\uFF1B\n *  \u2462 \u90FD\u6CA1\u6709 = \u5149\u6807\u5F80\u56DE\u4E00\u6B65\u3002\u6C38\u8FDC\u4E0D\u5220\u97F3\u3002 */\nexport function symBackspace(st: EditorState): EditorState {\n  if (st.sel) return st;\n  const toks = tr(st), h = headLen(toks), i = st.caret - 1;\n  if (i >= h && !stopTok(toks[i])) { const nt = toks.slice(); nt.splice(i, 1); return next(st, nt, { caret: st.caret - 1 }); }\n  const t = toks[i];\n  if (i >= h && t?.kind === \"note\") {\n    const nt = toks.slice(), art = artOf(t);\n    // \u6302\u5728\u8FD9\u4E2A\u97F3\u4E0A\u7684\u529B\u5EA6 / \u6E10\u5F3A\u6E10\u5F31 / \u98CE\u683C\uFF08v0.7.27 \u8D77\u8BB0\u53F7\u843D\u5728\u300C\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u300D= \u63D2\u5728\u5B83\u524D\u9762\uFF09\u5148\u5220\u2014\u2014user 2026-10-10\u300C\u6211\u65E9\u5C31\u60F3\u7528\u9000\u683C\u5220\u5F3A\u5EA6\u66F2\u7EBF\u4E86\u300D\n    const j = i - 1, mk = toks[j];\n    if (j >= h && (mk?.kind === \"dyn\" || mk?.kind === \"hairpin\" || mk?.kind === \"groove\")) { nt.splice(j, 1); return next(st, nt, { caret: st.caret - 1 }); }\n    const strip = (k: \"slur\") => { const { [k]: _x, ...rest } = t; return rest as NoteTok; };\n    { const sw = swellOf(t); if (sw) { nt[i] = withArt(t, SWELL_ART[sw], false); return next(st, nt); } }   // \u97F3\u5185\u8D77\u4F0F\uFF08\u6F14\u594F\u6CD5\u91CC\uFF0C\u6700\u5916\u9762\u90A3\u5C42\u5148\u9000\uFF09\n    for (const a of [\"arpeggio\", \"marcato\", \"accent\", \"stress\", \"unstress\", \"ghost\", \"sfz\", \"fp\", \"tenuto\", \"staccato\", \"whisper\"] as Art[]) if (art.includes(a)) { nt[i] = withArt(t, a, false); return next(st, nt); }\n    if (t.inhale) { const { inhale: _i, ...rest } = t; nt[i] = rest; return next(st, nt); }   // \u51FA\u58F0\u7684\u6362\u6C14 \u2192 \u53D8\u56DE\u9759\u9ED8\u7684\u547C\u5438\uFF0C\u518D\u9000\u4E00\u4E0B\u624D\u53BB\u6389\u9017\u53F7\n    if (art.includes(\"breath\")) { nt[i] = withArt(t, \"breath\", false); return next(st, nt); }\n    if (t.slur) { nt[i] = strip(\"slur\"); return next(st, nt); }\n  }\n  return moveCaret(st, -1);\n}\n/** Shift+\u2190\u2192\uFF1A\u4ECE\u5149\u6807\uFF08\u6216\u5DF2\u6709\u9009\u4E2D\uFF09\u5F80\u4E00\u8FB9\u6269\u4E00\u4E2A token\u3002 */\nexport function extendSelection(st: EditorState, d: number): EditorState {\n  if (!st.sel) return d < 0 ? select(st, st.caret - 1, st.caret) : select(st, st.caret, st.caret + 1);\n  return d < 0 ? select(st, st.sel.from - 1, st.sel.to) : select(st, st.sel.from, st.sel.to + 1);\n}\n/** Shift+Home / Shift+End\uFF1A\u4ECE\u5149\u6807\uFF08\u6216\u5DF2\u6709\u9009\u4E2D\u7684\u53E6\u4E00\u5934\uFF09\u9009\u5230\u5F00\u5934 / \u672B\u5C3E\uFF08\u914D Home \u5C31\u662F\u5168\u9009\uFF09\u3002 */\nexport function selectToEdge(st: EditorState, d: -1 | 1): EditorState {\n  const n = tr(st).length;\n  if (d < 0) return select(st, headLen(tr(st)), st.sel ? st.sel.to : st.caret);\n  return select(st, st.sel ? st.sel.from : st.caret, n);\n}\n/** Esc\uFF1A\u5199 \u2192 \u9009\u4E2D\u5149\u6807\u524D\u90A3\u4E2A token\uFF08\u6539\uFF09\u3002 */\nexport function escape(st: EditorState): EditorState {\n  if (st.sel) return st;\n  return st.caret > headLen(tr(st)) ? select(st, st.caret - 1, st.caret) : st;\n}\n\n// \u2500\u2500 \u76F4\u63A5\u6539\uFF08\u6307\u9488\u62D6\u52A8 / \u6B4C\u8BCD\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function setNote(st: EditorState, i: number, patch: Partial<Pick<NoteTok, \"pitch\" | \"dur\" | \"lyric\" | \"hyph\">>): EditorState {\n  const t = tr(st)[i];\n  if (!t || t.kind !== \"note\") return st;\n  const nt = tr(st).slice(), merged: NoteTok = { ...t, ...patch };\n  nt[i] = patch.pitch !== undefined && merged.pitch ? withPitches(merged, [merged.pitch, ...(t.chord ?? [])]) : merged;   // \u62D6\u65CB\u5F8B\u97F3\u8D8A\u8FC7\u53E0\u97F3\u91CC\u7684\u97F3\uFF1A\u91CD\u65B0\u6392\u9AD8\u4F4E\n  return next(st, nt);\n}\nexport function setDur(st: EditorState, i: number, dur: number): EditorState {\n  const t = tr(st)[i];\n  if (!t || !isTimed(t) || !validDur(dur)) return st;\n  const nt = tr(st).slice(); nt[i] = { ...t, dur };\n  return next(st, nt);\n}\nexport function setHum(st: EditorState, hum: Hum): EditorState { return { ...st, song: { ...st.song, hum } }; }\n/** \u6539\u6B4C\u540D\uFF08\u7A7A = \u4E0D\u586B\uFF09\u3002 */\n/** \u6362\u7EB8\uFF08\u6574\u9996\u6B4C\u4E00\u4E2A\uFF09\uFF1AA5 = \u9ED8\u8BA4\uFF0C\u5B58\u6210\u300C\u6CA1\u6709\u300D\u3002 */\nexport function setPaper(st: EditorState, kind: PaperKind): EditorState {\n  const song = { ...st.song }, density = densityOf(st.song.paper ?? paperOf(DEFAULT_PAPER));\n  if (kind === DEFAULT_PAPER && density === \"cozy\") delete song.paper; else song.paper = paperOf(kind, density);\n  return (st.song.paper?.kind ?? DEFAULT_PAPER) === kind ? st : { ...st, song };\n}\n/** \u7248\u5F0F\uFF1A\u8212\u9002 / \u7D27\u51D1\uFF08\u6574\u9996\u6B4C\u4E00\u4E2A\uFF1B\u8212\u9002 = \u9ED8\u8BA4\uFF0C\u5B58\u6210\u300C\u6CA1\u6709\u300D\uFF1B\u81EA\u5BB6\u6587\u4EF6\u4E0D\u53E6\u8BB0 staffMm\uFF09\u3002 */\nexport function setDensity(st: EditorState, d: Density): EditorState {\n  const cur = st.song.paper ?? paperOf(DEFAULT_PAPER);\n  if (densityOf(cur) === d) return st;\n  const paper: Paper = { ...cur }; delete paper.staffMm; if (d === \"cozy\") delete paper.density; else paper.density = d;\n  const song = { ...st.song };\n  if (paper.kind === DEFAULT_PAPER && !paper.density) delete song.paper; else song.paper = paper;\n  return { ...st, song };\n}\n/** \u6539\u4F5C\u8005\u680F\uFF08\u6BCF\u884C\u53BB\u6389\u884C\u5C3E\u7A7A\u767D\u3001\u53BB\u6389\u5934\u5C3E\u7A7A\u884C\uFF1B\u5168\u7A7A = \u4E0D\u586B\uFF09\u3002 */\nexport function setCredits(st: EditorState, text: string): EditorState {\n  const lines = text.replace(/\\r/g, \"\").split(\"\\n\").map((l) => l.replace(/\\s+$/, \"\"));\n  while (lines.length && !lines[0]) lines.shift();\n  while (lines.length && !lines[lines.length - 1]) lines.pop();\n  const t = lines.join(\"\\n\");\n  if ((st.song.credits ?? \"\") === t) return st;\n  const song = { ...st.song };\n  if (t) song.credits = t; else delete song.credits;\n  return { ...st, song };\n}\n/** \u8FD9\u9996\u6B4C\u81EA\u5DF1\u7684\u8BB8\u53EF\uFF08\u7A7A = \u4E0D\u58F0\u660E\uFF09\u3002 */\nexport function setRights(st: EditorState, text: string): EditorState {\n  const t = text.replace(/\\r/g, \"\").trim();\n  if ((st.song.rights ?? \"\") === t) return st;\n  const song = { ...st.song };\n  if (t) song.rights = t; else delete song.rights;\n  return { ...st, song };\n}\n/** \u7F16\u6392\u90A3\u4E00\u884C\uFF08\u7A7A = \u4E0D\u5199 = \u6BCF\u5F20\u7EB8\u6309\u987A\u5E8F\u5404\u653E\u4E00\u904D\uFF1Bsrc/score/arrange.ts\uFF09\u3002 */\nexport function setArrangement(st: EditorState, text: string): EditorState {\n  const t = text.trim(), song = { ...st.song };\n  if (t) song.arrangement = t; else delete song.arrangement;\n  return (st.song.arrangement ?? \"\") === t ? st : { ...st, song };\n}\nexport function setTitle(st: EditorState, title: string): EditorState {\n  const t = title.trim(), song = { ...st.song };\n  if (t) song.title = t; else delete song.title;\n  return (st.song.title ?? \"\") === t ? st : { ...st, song };\n}\n\n// \u2500\u2500 \u7EB8 / \u58F0\u90E8\uFF080.5.0\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u4E00\u5F20\u7EB8\u7684\u901F\u5EA6\u770B\u8C01\uFF1A\u8FD9\u5F20\u7EB8\u4E0A\u5728\u573A\u7684\u3001\u5168\u66F2\u987A\u5E8F\u91CC\u6700\u4E0A\u9762\u90A3\u4F4D\uFF08\u901F\u5EA6\u8BB0\u53F7\u53EA\u5199\u5728\u5B83\u90A3\u4E00\u884C\uFF09\u3002 */\nexport function tempoOwner(song: Song, paper: PaperSeg): string | null { return song.parts.find((p) => paper.tracks[p.id])?.id ?? null; }\n/** \u4E00\u5F20\u7EB8\u5F00\u5934\u7684\u901F\u5EA6\uFF08\u770B tempoOwner \u90A3\u4E00\u884C\u7684\u8C31\u5934\uFF09\uFF1B\u7EB8\u4E0A\u6CA1\u4EBA = null\u3002 */\nexport function sheetStartBpm(song: Song, paper: PaperSeg): number | null {\n  const o = tempoOwner(song, paper); if (!o) return null;\n  const t = paper.tracks[o].slice(0, headLen(paper.tracks[o])).find((x) => x.kind === \"tempo\") as Extract<Token, { kind: \"tempo\" }> | undefined;\n  return t ? t.bpm : null;\n}\n/** \u4E00\u5F20\u7EB8\u7ED3\u5C3E\u751F\u6548\u7684\u901F\u5EA6\uFF08tempoOwner \u90A3\u4E00\u884C\u8D70\u5230\u5E95\uFF09\u3002 */\nexport function sheetEndBpm(song: Song, paper: PaperSeg): number | null { const o = tempoOwner(song, paper); return o ? tempoAt(paper.tracks[o], paper.tracks[o].length) : null; }\n/** \u8FD9\u5F20\u7EB8\u4E0A\u6BCF\u4E00\u884C\u8C31\u5934\u7684\u901F\u5EA6\u90FD\u5199\u6210 bpm\uFF08\u8C31\u5934\u7684\u901F\u5EA6\u662F\u8FD9\u5F20\u7EB8\u7684\u3001\u4E0D\u662F\u54EA\u4E00\u884C\u7684\uFF1B\u53EA\u6709 tempoOwner \u90A3\u4E00\u884C\u7B97\u6570\uFF0C\u5176\u4F59\u8DDF\u7740\u5199\u9F50\uFF0C\u514D\u5F97\u6362\u4E86\u8C01\u5728\u6700\u4E0A\u9762\u901F\u5EA6\u5C31\u53D8\uFF09\u3002 */\nfunction withSheetBpm(paper: PaperSeg, bpm: number): PaperSeg {\n  let changed = false;\n  const tracks: Record<string, Token[]> = {};\n  for (const [k, toks] of Object.entries(paper.tracks)) {   // \u5DF2\u7ECF\u5BF9\u7684\u90A3\u4E00\u884C\u539F\u6837\u7559\u7740\uFF08\u540C\u4E00\u4E2A\u6570\u7EC4\uFF1A\u7ED3\u6784\u5171\u4EAB\uFF0Cundo \u5FEB\u7167\u4E0D\u591A\u5360\uFF09\n    const h = headLen(toks), i = toks.findIndex((t, j) => j < h && t.kind === \"tempo\" && t.bpm !== bpm);\n    if (i < 0) { tracks[k] = toks; continue; }\n    changed = true; tracks[k] = toks.map((t, j) => (j < h && t.kind === \"tempo\" && t.bpm !== bpm ? { ...t, bpm } : t));\n  }\n  return changed ? { ...paper, tracks } : paper;\n}\n/** \u6362\u4E86\u4E00\u5F20\u7EB8\u4E0A\u6709\u8C01 / \u8C01\u5728\u6700\u4E0A\u9762\uFF08\u53BB\u6389\u4E00\u884C\u3001\u6362\u7ED1\u3001\u632A\u987A\u5E8F\u3001\u52A0\u4E00\u884C\uFF09\u4E4B\u540E\uFF1A\u6BCF\u5F20\u7EB8\u5F00\u5934\u7684\u901F\u5EA6\u4FDD\u6301\u6539\u4E4B\u524D\u7684\u6837\u5B50\uFF082026-10-08 Opus 5.5\uFF1B\n *  user\u300C\u7B2C\u56DB\u7AE0sheet\u53EA\u6709\u7B2C\u4E8C\u4E2A\u58F0\u90E8\u7684\u65F6\u5019\u901F\u5EA6\u8BB0\u53F7\u5931\u8E2A\u4E86\u800C\u4E14\u597D\u50CF\u901F\u5EA6\u4E0D\u5BF9\u300D\u2014\u2014\u539F\u6765\u901F\u5EA6\u53EA\u770B\u6700\u4E0A\u9762\u90A3\u4E00\u884C\uFF0C\u522B\u7684\u884C\u8C31\u5934\u662F\u6CA1\u4EBA\u770B\u89C1\u7684\u65E7\u6570\uFF0C\u6700\u4E0A\u9762\u90A3\u4F4D\u4E00\u8D70\u5C31\u8DF3\u6210\u65E7\u6570\uFF09\u3002 */\nfunction keepSheetTempos(before: Song, after: Song): Song {\n  return { ...after, papers: after.papers.map((p) => { const b = before.papers.find((x) => x.id === p.id), bpm = b ? sheetStartBpm(before, b) : null; return bpm === null ? p : withSheetBpm(p, bpm); }) };\n}\nconst nextKey = (ids: string[], prefix: string) => `${prefix}${Math.max(0, ...ids.map((x) => Number(new RegExp(`^${prefix}(\\\\d+)$`).exec(x)?.[1] ?? 0))) + 1}`;\n/** \u4E00\u6761 track \u672B\u5C3E\u751F\u6548\u7684\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\uFF08\u65B0\u7EB8 / \u65B0\u58F0\u90E8\u7684\u8C31\u5934\u7167\u6284\u5B83\uFF09\u3002 */\nconst endMarks = (toks: Token[]) => ({ fifths: keyAt(toks, toks.length), ...timeAt(toks, toks.length), bpm: tempoAt(toks, toks.length) });\n/** \u52A0\u4E00\u4E2A\u58F0\u90E8 = \u52A0\u4E00\u4F4D\u6B4C\u624B\uFF08**\u58F0\u90E8\u5C31\u662F\u6B4C\u624B**\uFF1A\u4E00\u4E2A\u58F0\u90E8\u7ED1\u4E00\u4E2A\u89D2\u8272\u3001\u4E00\u4E2A\u9EA6\u514B\u98CE\uFF0C\u8DE8\u7EB8\u6309\u5B83\u8FDE\u8D77\u6765\uFF1B2026-10-08 user\u300C\u55EF\u58F0\u90E8\u5C31\u662F\u6B4C\u624B\u300D\uFF09\u3002\n *  \u53EA\u5728 onPaper \u8FD9\u5F20\u7EB8\u4E0A\u7ED9\u5B83\u4E00\u6761\u53EA\u6709\u8C31\u5934\u7684 track\uFF08\u8C31\u5934\u6284\u90A3\u5F20\u7EB8\u7B2C\u4E00\u4E2A\u5728\u573A\u58F0\u90E8\u7684\u5F00\u5934\uFF1Buser\u300C\u65B0\u6B4C\u624B\u53EA\u51FA\u73B0\u5728\u5F53\u524D\u8FD9\u5F20\u7EB8\u55EF\u300D\u2014\u2014\u6B64\u524D\u662F\u6BCF\u5F20\u7EB8\u90FD\u7ED9\uFF09\uFF1B\n *  onPaper = null = \u54EA\u5F20\u7EB8\u90FD\u8FD8\u6CA1\u6709\u5B83\uFF08\u300C\u4EA4\u7ED9\u65B0\u6B4C\u624B\u300D\uFF1A\u63A5\u7740 rebindTrack \u628A\u4E00\u6761\u4EA4\u7ED9\u5B83\uFF09\u3002\u5728\u5168\u66F2\u7684\u987A\u5E8F\u91CC\u6392\u6700\u540E\u3002\u5149\u6807\u8DF3\u5230\u5B83\u90A3\u6761\uFF08\u6709\u7684\u8BDD\uFF09\u3002\n *  role / mic \u7684 id \u7531\u8C03\u7528\u65B9\uFF08\u4F11\u606F\u5BA4 / \u5F55\u97F3\u623F\uFF09\u914D\u597D\u3002 */\n/** after = \u63D2\u5728\u54EA\u4F4D\u6B4C\u624B\u540E\u9762\uFF08\u9ED8\u8BA4 = \u5149\u6807\u6240\u5728\u7684\u90A3\u4F4D\uFF1B\u627E\u4E0D\u5230 = \u52A0\u5728\u6700\u540E\uFF09\uFF1Auser 2026-10-10\u300C\u52A0\u6B4C\u624B\u7684\u65F6\u5019\u5E94\u8BE5\u662Finsert next\u800C\u4E0D\u662Fappend last\u300D\u3002 */\nexport function addPart(st: EditorState, part: PartDef, onPaper: string | null = st.at.paper, after: string | null = st.at.part): EditorState {\n  if (st.song.parts.some((p) => p.id === part.id)) return st;\n  let id = st.nextId;\n  const papers = st.song.papers.map((p) => {\n    if (p.id !== onPaper) return p;\n    const src = st.song.parts.map((x) => p.tracks[x.id]).find((x) => x) ?? [];\n    const h = src.slice(0, headLen(src));\n    const toks = h.length ? h.map((t) => ({ ...t, id: id++ })) : headTokens({}, (id += 3) - 3);\n    return { ...p, tracks: { ...p.tracks, [part.id]: toks } };\n  });\n  const k = after === null ? -1 : st.song.parts.findIndex((p) => p.id === after);\n  const parts = k < 0 ? [...st.song.parts, part] : [...st.song.parts.slice(0, k + 1), part, ...st.song.parts.slice(k + 1)];\n  const song = { ...st.song, parts, papers };\n  return onPaper && papers.some((p) => p.id === onPaper) ? setFocus({ ...st, song, nextId: id }, onPaper, part.id) : { ...st, song, nextId: id };\n}\n/** \u6362\u7ED1\uFF1A\u8FD9\u5F20\u7EB8\u4E0A from \u90A3\u4E00\u884C\u4EA4\u7ED9 to \u8FD9\u4F4D\u6B4C\u624B\uFF08\u97F3\u3001\u6B4C\u8BCD\u3001\u8BB0\u53F7\u539F\u6837\uFF0C\u53EA\u6362\u4E3B\u4EBA\uFF1B\u53EA\u6539\u8FD9\u4E00\u5F20\u7EB8\u3002user 2026-10-08\u300C\u5DF2\u6709\u7684track\u7ED1\u6362\u4E0D\u540C\u7684\u58F0\u90E8\u300D\uFF09\u3002\n *  to \u5728\u8FD9\u5F20\u7EB8\u4E0A\u5DF2\u7ECF\u6709\u4E00\u884C = \u4E24\u884C\u5BF9\u8C03\u4E3B\u4EBA\uFF08\u4E00\u5F20\u7EB8\u4E0A\u4E00\u4F4D\u6B4C\u624B\u6700\u591A\u4E00\u884C\uFF1B\u4EC0\u4E48\u90FD\u4E0D\u4E22\uFF09\u3002\u5149\u6807\u8DDF\u7740\u90A3\u4E00\u884C\u8D70\uFF08\u540C\u4E00\u4E2A\u4F4D\u7F6E\uFF09\u3002 */\nexport function rebindTrack(st: EditorState, paperId: string, from: string, to: string): EditorState {\n  const p = st.song.papers.find((x) => x.id === paperId);\n  if (!p || from === to || !p.tracks[from] || !st.song.parts.some((x) => x.id === to)) return st;\n  const tracks = { ...p.tracks }, mine = tracks[from], theirs = tracks[to];\n  if (theirs) { tracks[from] = theirs; tracks[to] = mine; } else { delete tracks[from]; tracks[to] = mine; }\n  const song = keepSheetTempos(st.song, { ...st.song, papers: st.song.papers.map((x) => (x.id === paperId ? { ...x, tracks } : x)) });\n  const followMe = st.at.paper === paperId && st.at.part === from;\n  return followMe ? setFocus({ ...st, song }, paperId, to, st.caret) : { ...st, song };\n}\n/** \u5220\u4E00\u4E2A\u58F0\u90E8\uFF08\u6700\u540E\u4E00\u4E2A\u4E0D\u80FD\u5220\uFF09\uFF1A\u6240\u6709\u7EB8\u4E0A\u5B83\u90A3\u6761\u4E00\u8D77\u6CA1\u4E86\u3002 */\nexport function removePart(st: EditorState, partId: string): EditorState {\n  if (st.song.parts.length <= 1 || !st.song.parts.some((p) => p.id === partId)) return st;\n  const papers = st.song.papers.map((p) => { const tracks = { ...p.tracks }; delete tracks[partId]; return { ...p, tracks }; });\n  const song = { ...st.song, parts: st.song.parts.filter((p) => p.id !== partId).map((p) => (p.host === partId ? (({ host: _h, ...rest }) => rest)(p) : p)), papers };   // \u5220\u4E86\u4E3B\u4EBA = \u623F\u5BA2\u642C\u51FA\u6765\u81EA\u5DF1\u4E00\u884C\n  const at = st.at.part === partId ? { paper: st.at.paper, part: song.parts[0].id } : st.at;\n  return setFocus({ ...st, song }, at.paper, at.part, st.at.part === partId ? undefined : st.caret);\n}\n/** \u58F0\u90E8\u4E0A\u4E0B\u632A\u4E00\u683C\uFF08\u8C31\u4E0A\u4ECE\u4E0A\u5230\u4E0B = Song.parts \u7684\u987A\u5E8F\uFF1Buser 2026-10-08\u300C\u58F0\u90E8\u987A\u5E8F\u5E94\u8BE5\u80FD\u91CD\u6392\u300D\uFF09\u3002\u6BCF\u5F20\u7EB8\u3001\u6BCF\u6761 track \u90FD\u4E0D\u52A8\uFF0C\u53EA\u6362\u987A\u5E8F\u3002\n *  \u901F\u5EA6\u53EA\u770B\u6BCF\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4E00\u884C\uFF08tempoOwner\uFF09\uFF1B\u632A\u4E86\u8C01\u5728\u6700\u4E0A\u9762\uFF0C\u6BCF\u5F20\u7EB8\u5F00\u5934\u7684\u901F\u5EA6\u7167\u65E7\uFF08keepSheetTempos \u628A\u5404\u884C\u8C31\u5934\u5199\u9F50\uFF09\u3002 */\n/** \u6BCF\u5F20\u7EB8\uFF08\u66F2\u6BB5\uFF09\u5F00\u5934\u5F3A\u5236\u5199\u660E\u529B\u5EA6\uFF08v0.10.39\uFF1Buser wishlist\u300C\u5F3A\u5236\u8981\u6C42\u5F00\u5934\u6709\u529B\u5EA6\u6807\u8BB0\u300D\u2192\u300C\u6BCF\u5F20\u7EB8\uFF08\u66F2\u6BB5\uFF09\u5F00\u5934\uFF0C\u5BF9\u300D\uFF09\uFF1A\n *  \u6BCF\u4F4D\u6B4C\u624B\u5728\u6BCF\u5F20\u7EB8\u4E0A\u7B2C\u4E00\u4E2A\u97F3\u4E4B\u524D\u6CA1\u6709\u529B\u5EA6\u8BB0\u53F7 = \u5728\u7B2C\u4E00\u4E2A\u97F3\u524D\u9762\u8865\u4E00\u4E2A\u2014\u2014**\u8865\u7684\u662F\u8FD9\u91CC\u672C\u6765\u5C31\u751F\u6548\u7684\u90A3\u4E2A**\uFF08\u8FD9\u4F4D\u5728\u524D\u4E00\u5F20\u7EB8\uFF08\u6B4C\u91CC\u7684\u987A\u5E8F\uFF09\u6700\u540E\u4E00\u4E2A\u529B\u5EA6\uFF1B\u6700\u524D\u9762 = mf\uFF0C\u540C\u64AD\u653E\u7684\u9ED8\u8BA4\uFF09\uFF0C\u542C\u8D77\u6765\u4E0D\u53D8\u3001\u53EA\u662F\u5199\u660E\u4E86\u3002\n *  \u8FD4\u56DE\u8865\u4E86\u54EA\u51E0\u5904\uFF08\u7EB8 / \u6B4C\u624B / \u4E0B\u6807\uFF09\u3002\u7EAF\u51FD\u6570\uFF1Amain \u5728\u6BCF\u6B21\u6539\u8C31\uFF08update\uFF09\u548C\u6253\u5F00\u6B4C\u65F6\u8FC7\u4E00\u904D\u3002 */\nexport function ensureStartDyns(song: Song, nextId: number): { song: Song; nextId: number; added: { paper: string; part: string; index: number }[] } {\n  let id = nextId; const added: { paper: string; part: string; index: number }[] = [], last = new Map<string, Dyn>();\n  const papers = song.papers.map((pp) => {\n    let tracks = pp.tracks, changed = false;\n    for (const part of song.parts) {\n      const t = tracks[part.id]; if (!t) continue;\n      let first = -1, has = false;\n      for (let i = headLen(t); i < t.length; i++) { const k = t[i]; if (k.kind === \"dyn\") { has = true; break; } if (k.kind === \"note\") { first = i; break; } }\n      if (!has && first >= 0) {\n        tracks = { ...tracks, [part.id]: [...t.slice(0, first), { kind: \"dyn\", id: id++, value: last.get(part.id) ?? \"mf\" } as Token, ...t.slice(first)] };\n        changed = true; added.push({ paper: pp.id, part: part.id, index: first });\n      }\n      const tt = tracks[part.id]; for (let i = tt.length - 1; i >= 0; i--) { const k = tt[i]; if (k.kind === \"dyn\") { last.set(part.id, k.value); break; } }\n    }\n    return changed ? { ...pp, tracks } : pp;\n  });\n  return added.length ? { song: { ...song, papers }, nextId: id, added } : { song, nextId, added };\n}\n/** \u4E00\u5BB6\u6328\u5728\u4E00\u8D77\uFF08v0.10.36\uFF09\uFF1A\u6BCF\u4F4D\u4E3B\u4EBA\u540E\u9762\u7D27\u8DDF\u5B83\u7684\u623F\u5BA2\uFF08\u623F\u5BA2\u4E4B\u95F4\u3001\u5404\u5BB6\u4E4B\u95F4\u539F\u6765\u7684\u5148\u540E\u4E0D\u53D8\uFF09\u3002\u8BFB\u6863 / \u632A / \u6302\u7684\u65F6\u5019\u90FD\u7406\u4E00\u904D\u2014\u2014\n *  \u4EE5\u524D\u623F\u5BA2\u6CA1\u6328\u7740\u4E3B\u4EBA\u65F6\u300C\u632A\u300D\u628A\u5B83\u5F53\u6210\u5355\u72EC\u4E00\u5757\u8D8A\u632A\u8D8A\u6563\uFF0C\u6DF7\u97F3\u53F0\u5361\u7247\u8DDF\u7740\u4E71\u5E8F\uFF08user\u300C\u5361\u7247\u6392\u5E8F\u5728\u6709\u5408\u79DF\u7684\u65F6\u5019\u6709\u95EE\u9898\u4F1A\u4E71\u5E8F\uFF0C\u53EF\u80FD\u5408\u79DF\u7684\u65F6\u5019\u6CA1\u6709\u6B63\u786E\u6392\u597D\u5E8F\u300D\uFF09\u3002 */\nexport function familyOrder(parts: readonly PartDef[]): PartDef[] {\n  const ids = new Set(parts.map((p) => p.id)), out: PartDef[] = [];\n  for (const p of parts) { if (p.host && ids.has(p.host)) continue; out.push(p); for (const t of parts) if (t.host === p.id) out.push(t); }\n  return out.length === parts.length ? out : [...parts];   // \u9632\u5FA1\uFF1A\u5BF9\u4E0D\u4E0A\uFF08\u4E0D\u8BE5\u53D1\u751F\uFF09= \u539F\u6837\n}\nexport function movePart(st: EditorState, partId: string, d: -1 | 1): EditorState {\n  const ps = familyOrder(st.song.parts), me = ps.find((p) => p.id === partId); if (!me) return st;\n  // \u5408\u79DF\uFF08v0.10.24\uFF1Buser\u300C\u6392\u5E8F\u540C\u610F\u300D\uFF09\uFF1A\u4E3B\u4EBA\u548C\u623F\u5BA2\u662F\u4E00\u5BB6\uFF0C\u632A\u4E3B\u4EBA = \u6574\u5BB6\u632A\u8FC7\u90BB\u5C45\uFF08\u90BB\u5C45\u4E5F\u6309\u4E00\u5BB6\u7B97\uFF09\uFF1B\u623F\u5BA2\u53EA\u5728\u81EA\u5BB6\u91CC\u632A\n  if (me.host) {\n    const i = ps.indexOf(me), j = i + d, other = ps[j];\n    if (!other || other.host !== me.host) return st;\n    const parts = ps.slice(); [parts[i], parts[j]] = [parts[j], parts[i]];\n    return { ...st, song: { ...st.song, parts } };\n  }\n  const blocks: PartDef[][] = []; for (const p of ps) { if (p.host && blocks.length && blocks[blocks.length - 1][0].id === p.host) blocks[blocks.length - 1].push(p); else blocks.push([p]); }\n  const bi = blocks.findIndex((b) => b[0].id === partId), bj = bi + d;\n  if (bi < 0 || bj < 0 || bj >= blocks.length) return st;\n  [blocks[bi], blocks[bj]] = [blocks[bj], blocks[bi]];\n  return { ...st, song: keepSheetTempos(st.song, { ...st.song, parts: blocks.flat() }) };   // \u632A\u4E86\u8C01\u5728\u6700\u4E0A\u9762\uFF1A\u6BCF\u5F20\u7EB8\u7684\u901F\u5EA6\u4E0D\u8DDF\u7740\u53D8\n}\n/** \u5408\u79DF\uFF1ApartId \u6302\u5230 host \u7684\u8C31\u7EBF\u4E0A\uFF08host = null = \u642C\u51FA\u6765\u81EA\u5DF1\u4E00\u884C\uFF09\u3002\u4E3B\u4EBA\u4E0D\u80FD\u662F\u623F\u5BA2\u3001\u4E0D\u80FD\u6302\u81EA\u5DF1\u3001\u6709\u623F\u5BA2\u7684\u4E0D\u80FD\u518D\u53BB\u5F53\u623F\u5BA2\uFF1B\u6302\u4E0A = \u6392\u5230\u4E3B\u4EBA\u90A3\u4E00\u5BB6\u6700\u540E\uFF08v0.10.24\uFF09\u3002 */\nexport function setPartHost(st: EditorState, partId: string, host: string | null): EditorState {\n  const ps = st.song.parts, me = ps.find((p) => p.id === partId); if (!me) return st;\n  if (host === null) { if (!me.host) return st; const { host: _h, ...rest } = me; void _h; return { ...st, song: { ...st.song, parts: ps.map((p) => (p.id === partId ? rest : p)) } }; }\n  const h = ps.find((p) => p.id === host);\n  if (!h || h.id === partId || h.host || ps.some((p) => p.host === partId)) return st;\n  const others = ps.filter((p) => p.id !== partId), hi = others.indexOf(h);\n  let at = hi + 1; while (at < others.length && others[at].host === host) at++;\n  const parts = familyOrder([...others.slice(0, at), { ...me, host }, ...others.slice(at)]);\n  return { ...st, song: keepSheetTempos(st.song, { ...st.song, parts }) };\n}\n/** \u8FD9\u5F20\u7EB8\u4E0A\u52A0\u4E0A\u67D0\u4E2A\uFF08\u6B4C\u91CC\u5DF2\u6709\u7684\uFF09\u58F0\u90E8\uFF1A\u4E00\u6761\u53EA\u6709\u8C31\u5934\u7684 track\uFF08\u8C31\u5934\u6284\u8FD9\u5F20\u7EB8\u7B2C\u4E00\u4E2A\u5728\u573A\u58F0\u90E8\u7684\u5F00\u5934\uFF09\u3002user 2026-10-08\u300C\u6BCF\u4E2Asheet\u7684track\u6570\u91CF\u5F53\u7136\u4E0D\u540C\u300D\u3002 */\nexport function addTrack(st: EditorState, paperId: string, partId: string): EditorState {\n  const p = st.song.papers.find((x) => x.id === paperId);\n  if (!p || p.tracks[partId] || !st.song.parts.some((x) => x.id === partId)) return st;\n  const src = st.song.parts.map((x) => p.tracks[x.id]).find((x) => x) ?? [], h = src.slice(0, headLen(src));\n  let id = st.nextId;\n  const toks = h.length ? h.map((t) => ({ ...t, id: id++ })) : headTokens({}, (id += 3) - 3);\n  return setFocus({ ...st, song: keepSheetTempos(st.song, withTrack(st.song, paperId, partId, toks)), nextId: id }, paperId, partId);\n}\n/** \u8FD9\u5F20\u7EB8\u4E0A\u53BB\u6389\u67D0\u4E2A\u58F0\u90E8\u7684\u90A3\u6761 track\uFF08\u7EB8\u4E0A\u6700\u540E\u4E00\u6761\u4E0D\u80FD\u53BB\uFF09\u3002\u58F0\u90E8\u672C\u8EAB\u8FD8\u5728\u6B4C\u91CC\uFF08\u522B\u7684\u7EB8\u7167\u65E7\uFF09\u3002 */\nexport function removeTrack(st: EditorState, paperId: string, partId: string): EditorState {\n  const p = st.song.papers.find((x) => x.id === paperId);\n  if (!p || !p.tracks[partId] || Object.keys(p.tracks).length <= 1) return st;\n  const tracks = { ...p.tracks }; delete tracks[partId];\n  const song = keepSheetTempos(st.song, { ...st.song, papers: st.song.papers.map((x) => (x.id === paperId ? { ...x, tracks } : x)) });\n  if (st.at.paper !== paperId || st.at.part !== partId) return { ...st, song };\n  return setFocus({ ...st, song }, paperId, st.song.parts.find((x) => tracks[x.id])!.id);\n}\n/** \u65B0\u7684\u4E00\u5F20\u7EB8\uFF08\u63A5\u5728 after \u540E\u9762\uFF1B\u6CA1\u7ED9 = \u6700\u540E\uFF09\uFF1A\u6BCF\u4E2A\u58F0\u90E8\u4E00\u6761\u53EA\u6709\u8C31\u5934\u7684 track\uFF0C\u8C31\u5934\u7167\u6284\u4E0A\u4E00\u5F20\u7EB8\u90A3\u4E2A\u58F0\u90E8\u7ED3\u5C3E\u65F6\u7684\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\n *  \uFF08\u5951\u7EA6 \u00A76\u00BE\uFF1A\u901F\u5EA6\u6BCF\u5F20\u7EB8\u5F00\u5934\u660E\u786E\u5199\u4E00\u4E2A\uFF0C\u65B0\u5EFA\u65F6\u7167\u6284\u4E0A\u4E00\u5F20\u7EB8\u7ED3\u5C3E\u7684\uFF09\u3002\u5149\u6807\u8DF3\u5230\u65B0\u7EB8\u4E0A\u5F53\u524D\u58F0\u90E8\u3002 */\nexport function addPaper(st: EditorState, after?: string): EditorState {\n  const papers = st.song.papers, k = after ? papers.findIndex((p) => p.id === after) : papers.length - 1;\n  const prev = papers[k] ?? papers[papers.length - 1], id = nextKey(papers.map((p) => p.id), \"p\");\n  let nid = st.nextId;\n  const tracks: Record<string, Token[]> = {};\n  const bpmEnd = prev ? sheetEndBpm(st.song, prev) : null;   // \u901F\u5EA6 = \u4E0A\u4E00\u5F20\u7EB8\u7ED3\u5C3E\u771F\u6B63\u751F\u6548\u7684\uFF08\u6700\u4E0A\u9762\u90A3\u4F4D\u90A3\u4E00\u884C\uFF09\uFF0C\u4E0D\u662F\u5404\u884C\u81EA\u5DF1\u8C31\u5934\u91CC\u6CA1\u4EBA\u770B\u89C1\u7684\u65E7\u6570\n  for (const part of st.song.parts) {\n    const src = prev?.tracks[part.id] ?? st.song.parts.map((x) => prev?.tracks[x.id]).find((x) => x) ?? [];\n    tracks[part.id] = headTokens({ ...endMarks(src), ...(bpmEnd !== null ? { bpm: bpmEnd } : {}) }, nid); nid += 3;\n  }\n  // \u66F2\u6BB5\u540D\u81EA\u52A8\u8D77 A B C D\uFF082026-10-08 \u6DF1\u591C Opus 5.5\uFF0Cuser\u300C\u66F2\u6BB5\u540D\u81EA\u52A8\u547D\u540DABCD\u300D\uFF09\uFF1A\u6CA1\u540D\u5B57\u7684\u7EB8\uFF08\u591A\u534A\u662F\u7B2C\u4E00\u5F20\uFF09\u5148\u6309\u987A\u5E8F\u8865\u4E0A\uFF0C\u65B0\u7EB8\u53D6\u4E0B\u4E00\u4E2A\u6CA1\u7528\u8FC7\u7684\uFF1B\u8D77\u8FC7\u540D\u7684\u4E0D\u52A8\n  const used = new Set(papers.map((p) => p.name.trim()).filter(Boolean));\n  const nextName = () => { for (let r = 1; ; r++) for (let c = 0; c < 26; c++) { const n = String.fromCharCode(65 + c) + (r > 1 ? r : \"\"); if (!used.has(n)) { used.add(n); return n; } } };\n  const named = papers.map((p) => (p.name.trim() ? p : { ...p, name: nextName() }));\n  const paper: PaperSeg = { id, name: nextName(), tracks };\n  const list = named.slice(); list.splice(k + 1, 0, paper);\n  return setFocus({ ...st, song: { ...st.song, papers: list }, nextId: nid }, id, st.at.part);\n}\n/** \u5220\u4E00\u5F20\u7EB8\uFF08\u6700\u540E\u4E00\u5F20\u4E0D\u80FD\u5220\uFF09\u3002 */\nexport function removePaper(st: EditorState, paperId: string): EditorState {\n  const papers = st.song.papers; if (papers.length <= 1) return st;\n  const k = papers.findIndex((p) => p.id === paperId); if (k < 0) return st;\n  const list = papers.filter((p) => p.id !== paperId), song = { ...st.song, papers: list };\n  if (st.at.paper !== paperId) return { ...st, song };\n  const to = list[Math.min(k, list.length - 1)];\n  return setFocus({ ...st, song }, to.id, st.at.part);\n}\n/** \u7EB8\u632A\u4E00\u4F4D\uFF08\u4E0A / \u4E0B\uFF09\u3002 */\nexport function movePaper(st: EditorState, paperId: string, d: -1 | 1): EditorState {\n  const list = st.song.papers.slice(), k = list.findIndex((p) => p.id === paperId), j = k + d;\n  if (k < 0 || j < 0 || j >= list.length) return st;\n  [list[k], list[j]] = [list[j], list[k]];\n  return { ...st, song: { ...st.song, papers: list } };\n}\n/** \u6539\u4E00\u4E2A\u58F0\u90E8\u7684\u8C31\u53F7\uFF08\u9AD8\u97F3 = \u9ED8\u8BA4\uFF0C\u5B58\u6210\u300C\u6CA1\u6709\u300D\uFF09\u3002 */\n/** \u58F0\u90E8\u81EA\u5DF1\u7684\u8C31\u53F7\uFF08\u6BCF\u5F20\u7EB8\u5F00\u5934\u7528\u5B83\uFF09\uFF1Anull = \u81EA\u52A8\uFF08v0.9.28 \u8D77\u6CA1\u5199 = \u81EA\u52A8\uFF1Buser\u300C\u9ED8\u8BA4\u81EA\u52A8\u540C\u610F\u300D\uFF09\u3002 */\nexport function setPartClef(st: EditorState, partId: string, clef: ClefName | null): EditorState {\n  const p = st.song.parts.find((x) => x.id === partId); if (!p || (p.clef ?? null) === clef) return st;\n  const np: PartDef = { ...p }; if (clef === null) delete np.clef; else np.clef = clef;\n  return { ...st, song: { ...st.song, parts: st.song.parts.map((x) => (x.id === partId ? np : x)) } };\n}\n/** \u5C0F\u8282\u53F7\u5370\u4E0D\u5370\uFF08v0.9.42\uFF1B\u9ED8\u8BA4\u6BCF\u884C\u5F00\u5934\u5370\uFF09\u3002 */\nexport function setBarNumbers(st: EditorState, on: boolean): EditorState {\n  if ((st.song.barNumbers !== \"off\") === on) return st;\n  const song = { ...st.song }; if (on) delete song.barNumbers; else song.barNumbers = \"off\";\n  return { ...st, song };\n}\n/** \u6B4C\u8BCD\u600E\u4E48\u6392\uFF08v0.9.40\uFF09\uFF1A\u6309\u8282\u594F\uFF08\u9ED8\u8BA4\uFF09/ \u6309\u6B4C\u8BCD\u3002 */\nexport function setLyricFit(st: EditorState, v: \"lyrics\" | \"rhythm\"): EditorState {\n  if ((st.song.lyricFit ?? \"rhythm\") === v) return st;\n  const song = { ...st.song }; if (v === \"lyrics\") song.lyricFit = \"lyrics\"; else delete song.lyricFit;\n  return { ...st, song };\n}\n/** \u8FD9\u4F4D\u6B4C\u624B\u7684\u81EA\u52A8\u516B\u5EA6\u7EBF\u5F00 / \u5173\uFF08v0.9.37\uFF1B\u9ED8\u8BA4\u5F00\uFF09\u3002 */\nexport function setPartAutoOttava(st: EditorState, partId: string, on: boolean): EditorState {\n  const p = st.song.parts.find((x) => x.id === partId); if (!p || (p.autoOttava !== false) === on) return st;\n  const np: PartDef = { ...p }; if (on) delete np.autoOttava; else np.autoOttava = false;\n  return { ...st, song: { ...st.song, parts: st.song.parts.map((x) => (x.id === partId ? np : x)) } };\n}\n/** \u8C31\u53F7\u8BB0\u53F7\u63D2\u5728\u5149\u6807\u5904\uFF08\u6709\u9009\u533A = \u9009\u533A\u5F00\u5934\uFF09\uFF1B\u5149\u6807\u524D\u7D27\u6328\u7740\u5C31\u662F\u4E00\u4E2A\u8C31\u53F7\u8BB0\u53F7 = \u6539\u5B83\uFF08v0.9.28\uFF09\u3002 */\nexport function insertClef(st: EditorState, clef: ClefName): EditorState {\n  const toks = tr(st), at = st.sel ? st.sel.from : st.caret, h = headLen(toks), prev = toks[at - 1];\n  if (at - 1 >= h && prev?.kind === \"clef\") { if (prev.clef === clef) return st; const nt = toks.slice(); nt[at - 1] = { ...prev, clef }; return next(st, nt, { sel: null }); }\n  const id = st.nextId, nt = toks.slice(); nt.splice(Math.max(h, at), 0, { kind: \"clef\", id, clef });\n  return next(st, nt, { caret: Math.max(h, at) + 1, sel: null, nextId: id + 1, log: [] });\n}\n/** \u516B\u5EA6\u7EBF\u63D2\u5728\u5149\u6807\u5904\uFF08\u6709\u9009\u533A = \u9009\u533A\u5F00\u5934\u8D77\u3001\u9009\u533A\u5C3E\u7ED3\u675F\uFF09\uFF1B\u5149\u6807\u524D\u7D27\u6328\u7740\u5C31\u662F\u4E00\u4E2A\u516B\u5EA6\u7EBF\u8BB0\u53F7 = \u6539\u5B83\uFF08v0.9.28\uFF09\u3002 */\nexport function insertOttava(st: EditorState, shift: -1 | 0 | 1 | 2): EditorState {\n  const toks = tr(st), h = headLen(toks);\n  if (st.sel && shift !== 0) {   // \u9009\u4E86\u4E00\u6BB5 = \u8FD9\u4E00\u6BB5\u753B\u516B\u5EA6\u7EBF\uFF08\u5F00\u5934\u4E00\u4E2A\u3001\u7ED3\u5C3E\u4E00\u4E2A\u300C\u7ED3\u675F\u300D\uFF09\n    let id = st.nextId; const nt = toks.slice(), a = Math.max(h, st.sel.from), b = st.sel.to;\n    nt.splice(b, 0, { kind: \"ottava\", id: id++, shift: 0 }); nt.splice(a, 0, { kind: \"ottava\", id: id++, shift });\n    return next(st, nt, { sel: null, caret: b + 2, nextId: id, log: [] });\n  }\n  const at = st.sel ? st.sel.from : st.caret, prev = toks[at - 1];\n  if (at - 1 >= h && prev?.kind === \"ottava\") { if (prev.shift === shift) return st; const nt = toks.slice(); nt[at - 1] = { ...prev, shift }; return next(st, nt, { sel: null }); }\n  const id = st.nextId, nt = toks.slice(); nt.splice(Math.max(h, at), 0, { kind: \"ottava\", id, shift });\n  return next(st, nt, { caret: Math.max(h, at) + 1, sel: null, nextId: id + 1, log: [] });\n}\n/** \u6539 / \u5220\u67D0\u5F20\u7EB8\u67D0\u4E2A\u58F0\u90E8\u7B2C i \u4E2A token\uFF08\u8C31\u53F7\u8BB0\u53F7 / \u516B\u5EA6\u7EBF\u8BB0\u53F7\uFF1Bnull = \u5220\uFF09\u3002\u5149\u6807\u6240\u5728 track \u7684\u5149\u6807\u8DDF\u7740\u632A\u3002 */\nexport function setDisplayMark(st: EditorState, paperId: string, partId: string, i: number, value: ClefName | -1 | 0 | 1 | 2 | null): EditorState {\n  const paper = st.song.papers.find((p) => p.id === paperId), toks = paper?.tracks[partId], t = toks?.[i];\n  if (!toks || !t || (t.kind !== \"clef\" && t.kind !== \"ottava\")) return st;\n  const nt = toks.slice();\n  if (value === null) nt.splice(i, 1);\n  else if (t.kind === \"clef\" && typeof value === \"string\") { if (t.clef === value) return st; nt[i] = { ...t, clef: value }; }\n  else if (t.kind === \"ottava\" && typeof value === \"number\") { if (t.shift === value) return st; nt[i] = { ...t, shift: value }; }\n  else return st;\n  const here = st.at.paper === paperId && st.at.part === partId;\n  return { ...st, song: withTrack(st.song, paperId, partId, nt), ...(here && value === null && st.caret > i ? { caret: st.caret - 1 } : {}) };\n}\n/** \u5927\u8C31\u8868\uFF1A\u6BCF\u4E2A token \u843D\u5728\u4E0A\uFF081\uFF09\u8FD8\u662F\u4E0B\uFF082\uFF09\u8C31\u8868\u2014\u2014\u6309\u97F3\u9AD8\u81EA\u52A8\uFF08\u4E2D\u592E C \u4EE5\u4E0B = \u4E0B\uFF09\uFF0C\u624B\u52A8\u6307\u5B9A\u7684\u4F18\u5148\uFF1B\u4F11\u6B62 / \u8BB0\u53F7\u8DDF\u524D\u4E00\u4E2A\u97F3\u3002\u5355\u8C31\u8868 = \u5168 1\u3002 */\nexport function autoStaffs(tokens: Token[], staves: 1 | 2): Staff[] {\n  let last: Staff = 1;\n  return tokens.map((t, i) => {\n    if (staves !== 2) return 1;\n    if (t.kind === \"note\") last = midiOf(effectivePitch(tokens, i)) < SPLIT_MIDI ? 2 : 1;\n    return last;\n  });\n}\nexport function staffOfTokens(tokens: Token[], staves: 1 | 2): Staff[] {\n  const auto = autoStaffs(tokens, staves);\n  let last: Staff = 1;\n  return tokens.map((t, i) => {\n    if (staves !== 2) return 1;\n    const s = (t.kind === \"note\" || t.kind === \"rest\") && t.staff ? t.staff : t.kind === \"note\" ? auto[i] : last;\n    last = s; return s;\n  });\n}\n/** \u5355\u8C31\u8868 \u2194 \u5927\u8C31\u8868\u3002 */\nexport function setPartStaves(st: EditorState, partId: string, n: 1 | 2): EditorState {\n  const p = st.song.parts.find((x) => x.id === partId); if (!p || (p.staves ?? 1) === n) return st;\n  const np: PartDef = { ...p }; if (n === 1) delete np.staves; else np.staves = 2;\n  return { ...st, song: { ...st.song, parts: st.song.parts.map((x) => (x.id === partId ? np : x)) } };\n}\n/** \u300C\u6362\u8C31\u8868\u300D\uFF1A\u9009\u4E2D\u7684\u97F3 / \u521A\u5199\u7684\u97F3\u632A\u5230\u53E6\u4E00\u5F20\u8C31\u8868\uFF08\u624B\u52A8\u6307\u5B9A\uFF09\uFF1B\u5DF2\u7ECF\u624B\u52A8\u6307\u5B9A\u7684 = \u53D6\u6D88\u6307\u5B9A\uFF08\u56DE\u5230\u6309\u97F3\u9AD8\u81EA\u52A8\uFF09\u3002 */\nexport function toggleStaff(st: EditorState, staves: 1 | 2): EditorState {\n  if (staves !== 2) return st;\n  const toks = tr(st), targets: number[] = [];\n  if (st.sel) { for (let i = st.sel.from; i < st.sel.to; i++) if (isTimed(toks[i])) targets.push(i); }\n  else { const i = currentIndex(st); if (i >= 0) targets.push(i); }\n  if (!targets.length) return st;\n  const auto = autoStaffs(toks, 2), nt = toks.slice();\n  for (const i of targets) {\n    const t = nt[i] as Timed;\n    if (t.staff) { const c = { ...t }; delete c.staff; nt[i] = c; }\n    else nt[i] = { ...t, staff: auto[i] === 1 ? 2 : 1 };\n  }\n  return next(st, nt);\n}\n/** \u6539\u66F2\u6BB5\u540D\uFF08\u7EB8\u9876\u90A3\u4E00\u6761\uFF1B\u7A7A = \u4E0D\u586B\uFF09\u3002 */\nexport function setPaperName(st: EditorState, paperId: string, name: string): EditorState {\n  const t = name.trim(), p = st.song.papers.find((x) => x.id === paperId);\n  if (!p || p.name === t) return st;\n  return { ...st, song: { ...st.song, papers: st.song.papers.map((x) => (x.id === paperId ? { ...x, name: t } : x)) } };\n}\n\n// \u2500\u2500 \u65F6\u95F4\u8F74\uFF08\u64AD\u653E\u3001\u753B\u8C31\u3001\u5C0F\u8282\u5BF9\u8D26\u90FD\u7528\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface TimedAt {\n  index: number; tok: Timed;\n  start: number;            // tick\uFF0C\u4ECE\u5934\u7B97\n  inBar: number;            // tick\uFF0C\u4ECE\u4E0A\u4E00\u6761\u5C0F\u8282\u7EBF\u7B97\n  bpm: number;              // \u8FD9\u91CC\u751F\u6548\u7684\u901F\u5EA6\n  t0: number; t1: number;   // \u79D2\uFF08\u6309\u901F\u5EA6\u8BB0\u53F7\u4E00\u6BB5\u4E00\u6BB5\u7B97\uFF1B\u6447\u6446\u7684\u97F3\u5DF2\u7ECF\u626D\u8FC7\uFF09\n  /** \u6447\u6446\uFF08v0.9.36\uFF09\uFF1A\u8D77 / \u6B62\u88AB\u626D\u4E86\u591A\u5C11\uFF08tick\uFF1B\u6B63 = \u5F80\u540E\uFF09\u3002\u6CA1\u6447 = \u6CA1\u6709\u8FD9\u4E24\u4E2A\u5B57\u6BB5\uFF08\u65E7\u6B4C\u9010\u6837\u672C\u4E0D\u53D8\uFF09\u3002\u6708\u8BFB\u7684\u5531\u8C31\u6309\u5B83\u6362\u7B97\u957F\u5EA6\uFF08lab-score.ts\uFF09\u3002 */\n  dw0?: number; dw1?: number;\n}\n\n/** \u901F\u5EA6\u8868\uFF1Atick \u2192 \u4ECE\u8FD9\u91CC\u8D77\u7684 bpm\uFF08\u7B2C\u4E00\u4E2A\u58F0\u90E8\u538B\u5E73\u540E\u7684\u901F\u5EA6\u8BB0\u53F7\uFF1B\u5176\u4F59\u58F0\u90E8\u6309\u5B83\u7B97\u79D2\u6570\uFF0C\u81EA\u5DF1\u4E32\u91CC\u7684\u901F\u5EA6\u8BB0\u53F7\u4E0D\u7B97\u6570\uFF09\u3002\n *  swing / origin\uFF08v0.9.36\uFF0C\u6447\u6446\uFF1Bgroove.ts timeMapOf \u52A0\uFF09\uFF1A\u4ECE\u8FD9\u91CC\u8D77\u4E00\u62CD\u91CC\u524D\u4E00\u4E2A\u516B\u5206\u5360\u591A\u5C11\uFF080 = \u76F4\uFF09\uFF0C\u62CD\u7684\u7F51\u683C\u4ECE origin \u8D77\u6570\uFF08\u5F31\u8D77\u5DF2\u7ECF\u5BF9\u9F50\u5230\u5C0F\u8282\u7EBF\uFF09\u3002 */\nexport type TempoMap = { tick: number; bpm: number; swing?: number; origin?: number }[];\n/** \u6447\u6446\u7684\u65F6\u95F4\u626D\u66F2\uFF08v0.9.36\uFF1Buser 2026-10-10\u300C\u5168\u91CF\u6447\u6446\u540C\u610F\uFF0C\u653E\u5728\u4E00\u53F7\u8F68\uFF1F\u300D\uFF09\uFF1A\u4E00\u62CD\uFF08\u56DB\u5206\u97F3\u7B26\uFF09\u91CC\u524D\u4E00\u4E2A\u516B\u5206\u5360 r\uFF080.5 = \u76F4\u3001\u22480.667 = \u4E09\u8FDE\u97F3\u611F\uFF09\uFF0C\u62CD\u5934\u62CD\u5C3E\u4E0D\u52A8\uFF1B\n *  \u62CD\u5185\u5206\u6BB5\u7EBF\u6027\uFF08\u524D\u534A\u62CD\u62C9\u5230 r\u3001\u540E\u534A\u62CD\u538B\u5230 1 \u2212 r\uFF09\uFF0C\u5341\u516D\u5206\u8DDF\u7740\u4E00\u8D77\u626D\u3002\u8FD4\u56DE tick \u4F4D\u7F6E T \u88AB\u632A\u4E86\u591A\u5C11\uFF08tick\uFF09\u3002\u4E09\u79CD\u6F14\u594F\u8005\uFF08\u4E50\u5668 / \u5143\u97F3\u7248 / \u6708\u8BFB\uFF09\u90FD\u8D70\u8FD9\u4E00\u4E2A\u3002 */\nexport function swingDelta(T: number, origin: number, r: number): number {\n  const u = (((T - origin) % TPQ) + TPQ) % TPQ, h = TPQ / 2;\n  return (u <= h ? u * 2 * r : r * TPQ + (u - h) * 2 * (1 - r)) - u;\n}\n/** \u8FD9\u4E2A\u65F6\u503C\u6447\u4E0D\u6447\uFF1A\u5199\u6210\u8FDE\u97F3\u7684\uFF08\u65F6\u503C\u4E0D\u5728 64 \u5206\u97F3\u7B26\u7684\u7F51\u683C\u4E0A\uFF1A\u4E09\u8FDE\u97F3 / \u4E94\u8FDE\u97F3\u2026\uFF09\u4E0D\u6447\uFF08user \u540C\u610F\u7684\u8BBE\u8BA1\uFF1A\u5DF2\u7ECF\u5199\u6210\u4E09\u8FDE\u97F3\u7684\u4E0D\u518D\u6447\uFF09\u3002 */\nconst SWING_GRID = TPQ / 16;\nexport function timeline(tokens: Token[], tempoMap?: TempoMap): TimedAt[] {\n  const out: TimedAt[] = [];\n  let t = 0, bar = 0, sec = 0, bpm = DEFAULT_BPM, k = 0, sw = 0, org = 0, bt = DEFAULT_TIME.beatType;\n  tokens.forEach((tok, index) => {\n    if (tok.kind === \"bar\") { bar = t; return; }\n    if (tok.kind === \"tempo\") { if (!tempoMap) bpm = tok.bpm; return; }\n    if (tok.kind === \"time\") { bt = tok.beatType; return; }\n    if (!isTimed(tok)) return;\n    if (tempoMap) { while (k < tempoMap.length && tempoMap[k].tick <= t) { const e = tempoMap[k]; bpm = e.bpm; if (e.swing !== undefined) { sw = e.swing; org = e.origin ?? 0; } k++; } }\n    const len = (tok.dur / TPQ) * (60 / bpm);\n    // \u6447\u6446\uFF1A\u53EA\u5728\u62CD\u5B50\u662F\u56DB\u5206 / \u4E8C\u5206\uFF086/8 \u8FD9\u7C7B\u590D\u5408\u62CD\u672C\u6765\u5C31\u662F\u4E09\u8FDE\u97F3\u7684\u611F\u89C9\uFF0C\u4E0D\u6447\uFF09\u3001\u65F6\u503C\u5728\u7F51\u683C\u4E0A\u7684\u97F3\n    const swOn = sw !== 0 && (bt === 4 || bt === 2) && tok.dur % SWING_GRID === 0;\n    const d0 = swOn ? swingDelta(t, org, sw) : 0, d1 = swOn ? swingDelta(t + tok.dur, org, sw) : 0;\n    if (d0 || d1) { const spt = 60 / (bpm * TPQ); out.push({ index, tok, start: t, inBar: t - bar, bpm, t0: sec + d0 * spt, t1: sec + len + d1 * spt, dw0: d0, dw1: d1 }); }\n    else out.push({ index, tok, start: t, inBar: t - bar, bpm, t0: sec, t1: sec + len });\n    t += tok.dur; sec += len;\n  });\n  return out;\n}\n/** \u4E00\u6761 track \u7684\u603B\u957F\uFF08tick\uFF09\u3002 */\nexport const trackTicks = (tokens: Token[]): number => tokens.reduce((a, t) => a + (isTimed(t) ? t.dur : 0), 0);\n/** \u4E00\u5F20\u7EB8\u7684\u957F\u5EA6 = \u4E0A\u9762\u6700\u957F\u7684\u90A3\u6761 track\uFF08\u7EB8\u754C = \u786C\u5BF9\u9F50\u70B9\uFF0C\u77ED\u7684\u8865\u5230\u8FD9\u4E48\u957F\uFF09\u3002 */\nexport const paperTicks = (p: PaperSeg): number => Math.max(0, ...Object.values(p.tracks).map(trackTicks));\n/** \u4E00\u4E2A\u58F0\u90E8\u538B\u5E73\u6210\u4E00\u4E32\uFF08\u64AD\u653E / \u6D3E\u751F\u7684 score.musicxml \u7528\uFF09\uFF1A\u5404\u7EB8\u6309\u5E8F\u63A5\u8D77\u6765\uFF0C\u540E\u9762\u7EB8\u7684\u8C31\u5934\u8BB0\u53F7\u53D8\u6210\u4E2D\u9014\u7684\u8BB0\u53F7\uFF1B\n *  \u67D0\u5F20\u7EB8\u6CA1\u8FD9\u4E2A\u58F0\u90E8 = \u53EA\u6709\u8C31\u5934\uFF08\u6284\u8FD9\u5F20\u7EB8\u7B2C\u4E00\u4E2A\u5728\u573A\u58F0\u90E8\u7684\uFF09+ \u6574\u7EB8\u4F11\u6B62\uFF1B\u77ED\u7684\u8865\u4F11\u6B62\u5230\u7EB8\u7684\u957F\u5EA6\u3002starts = \u6BCF\u5F20\u7EB8\u5728\u8FD9\u4E32\u91CC\u4ECE\u54EA\u4E2A\u4E0B\u6807\u8D77\u3002 */\n/** opts.order = \u7F16\u6392\u5C55\u5F00\u540E\u7684\u653E\u7684\u987A\u5E8F\uFF08\u7EB8 id\uFF0C\u53EF\u4EE5\u91CD\u590D\uFF1Bsrc/score/arrange.ts\uFF09\uFF1A\u7167\u5B83\u63A5\uFF1B\u6CA1\u7ED9 = \u6BCF\u5F20\u4E0D\u9690\u85CF\u7684\u7EB8\u6309\u987A\u5E8F\u5404\u4E00\u904D\u3002\n *  \u540C\u4E00\u5F20\u7EB8\u7B2C\u4E8C\u6B21\u8D77\uFF1A\u97F3 / \u8BB0\u53F7\u6284\u4E00\u4EFD\u3001\u6362\u8D1F id\uFF08\u538B\u5E73\u4EF6\u91CC id \u4E0D\u91CD\u590D\uFF1B\u4E0D\u843D\u5730\uFF09\u3002 */\nexport function flattenPart(song: Song, partId: string, opts: { tempo?: boolean; order?: readonly string[] } = {}): { tokens: Token[]; starts: { index: number; paper: PaperSeg }[] } {\n  const out: Token[] = [], starts: { index: number; paper: PaperSeg }[] = [];\n  let id = -1;   // \u8865\u7684\u4F11\u6B62 / \u6284\u7684\u8BB0\u53F7\u7528\u8D1F id\uFF08\u4E0D\u843D\u5730\uFF0C\u53EA\u5728\u8FD9\u4E00\u4E32\u91CC\uFF1B\u6587\u4EF6\u91CC\u7684 id \u7531\u5199\u7684\u90A3\u8FB9\u7F16\uFF09\n  let k = -1;\n  const seq = opts.order ? opts.order.flatMap((pid) => song.papers.filter((p) => p.id === pid)) : song.papers.filter((p) => !p.hidden);   // \u7F16\u6392\u91CC\u70B9\u540D\u7684\u7167\u653E\uFF08\u9690\u85CF\u7684\u4E5F\u653E\uFF09\n  const seen = new Set<string>();\n  seq.forEach((p00) => {\n    const again = seen.has(p00.id); seen.add(p00.id);\n    const p0 = expandPaper(song, p00, () => id--);   // \u8C31\u5185\u53CD\u590D / \u8DF3\u8F6C\uFF1A\u8FD9\u5F20\u7EB8\u5148\u6309\u5B83\u7684\u7ED3\u6784\u5C55\u5F00\u6210\u76F4\u7EBF\uFF08src/score/repeats.ts\uFF1B2026-10-09\uFF09\n    const p: PaperSeg = again ? { ...p0, tracks: Object.fromEntries(Object.entries(p0.tracks).map(([k2, t]) => [k2, t.map((x) => ({ ...x, id: id-- }))])) } : p0;\n    k++;\n    const have = p.tracks[partId], len = paperTicks(p);\n    starts.push({ index: out.length, paper: p });\n    let toks: Token[];\n    if (have) toks = have;\n    else {\n      const src = song.parts.map((x) => p.tracks[x.id]).find((x) => x) ?? [];\n      toks = src.slice(0, headLen(src)).map((t) => ({ ...t, id: id-- }));\n      // tempo\uFF1A\u8FD9\u5F20\u7EB8\u4E0A\u6CA1\u8FD9\u4F4D\u6B4C\u624B\uFF0C\u4F46\u8981\u5B83\u5E26\u7740\u901F\u5EA6\uFF08\u901F\u5EA6\u8868 / \u538B\u5E73\u4EF6\u7684\u7B2C\u4E00\u4E2A\u58F0\u90E8\uFF09\u2014\u2014\u7167\u8FD9\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4F4D\u5728\u573A\u6B4C\u624B\u7684\u4E2D\u9014\u901F\u5EA6\u8BB0\u53F7\uFF0C\u8865\u7684\u4F11\u6B62\u5728\u90A3\u51E0\u5904\u65AD\u5F00\n      //   \uFF082026-10-08 Opus 5.5\uFF1A\u65B0\u6B4C\u624B\u53EA\u51FA\u73B0\u5728\u5F53\u524D\u7EB8\u4EE5\u540E\uFF0C\u6700\u4E0A\u9762\u90A3\u4F4D\u5E38\u5E38\u4E0D\u5728\u67D0\u5F20\u7EB8\u4E0A\uFF0C\u539F\u6765\u53EA\u6284\u8C31\u5934\u4F1A\u4E22\u6389\u90A3\u5F20\u7EB8\u4E2D\u9014\u7684\u53D8\u901F\uFF09\n      if (opts.tempo) {\n        let t = 0, at = 0;\n        for (const u of src.slice(headLen(src))) {\n          if (u.kind === \"tempo\") { if (t > at) toks.push({ kind: \"rest\", id: id--, dur: t - at }); toks.push({ ...u, id: id-- }); at = t; }\n          else if (isTimed(u)) t += u.dur;\n        }\n        if (at > 0 && len > at) { toks.push({ kind: \"rest\", id: id--, dur: len - at }); }\n      }\n    }\n    if (k === 0) out.push(...toks);\n    else { const h = headLen(toks); out.push(...toks.slice(0, h).map((t) => ({ ...t, id: id-- })), ...toks.slice(h)); }   // \u540E\u9762\u7EB8\u7684\u8C31\u5934\uFF1A\u6284\u4E00\u4EFD\u5F53\u4E2D\u9014\u8BB0\u53F7\uFF08id \u4E0D\u649E\uFF09\n    const pad = len - trackTicks(toks);\n    if (pad > 0) out.push({ kind: \"rest\", id: id--, dur: pad });\n  });\n  return { tokens: out, starts };\n}\n/** \u7B2C\u4E00\u4E2A\u58F0\u90E8\u7684\u901F\u5EA6\u8868\uFF08\u538B\u5E73\u540E\u7684\u901F\u5EA6\u8BB0\u53F7\u6309 tick \u5217\u51FA\u6765\uFF1B\u522B\u7684\u58F0\u90E8\u6309\u5B83\u7B97\u79D2\u6570\uFF09\u3002 */\nexport function tempoMapOf(song: Song, order?: readonly string[]): TempoMap {\n  const first = song.parts[0]; if (!first) return [];\n  const { tokens } = flattenPart(song, first.id, { tempo: true, ...(order ? { order } : {}) }), map: TempoMap = [];\n  let t = 0;\n  for (const tok of tokens) { if (tok.kind === \"tempo\") map.push({ tick: t, bpm: tok.bpm }); else if (isTimed(tok)) t += tok.dur; }\n  return map;\n}\n\n/** \u6BCF\u4E2A\u5C0F\u8282\uFF08\u4E24\u6761\u5C0F\u8282\u7EBF\u4E4B\u95F4\uFF09\u5B9E\u9645\u62CD\u6570\u548C\u90A3\u91CC\u7684\u62CD\u53F7\u662F\u5426\u5BF9\u5F97\u4E0A\u2014\u2014\u53EA\u7528\u6765\u8F7B\u6807\uFF0C\u4E0D\u62E6\uFF08\u5BB6\u89C4\uFF1A\u4E0D\u8BB8\u89C4\u8BAD\uFF09\u3002 */\nexport function barFill(tokens: Token[]): { from: number; to: number; ticks: number; full: boolean }[] {\n  const wantOf = (b: number, bt: number) => (b * WHOLE) / bt;\n  let want = wantOf(DEFAULT_TIME.beats, DEFAULT_TIME.beatType);\n  const out: { from: number; to: number; ticks: number; full: boolean }[] = [];\n  let from = 0, ticks = 0;\n  tokens.forEach((tok, i) => {\n    if (tok.kind === \"bar\") { out.push({ from, to: i, ticks, full: ticks === want }); from = i + 1; ticks = 0; }\n    else if (tok.kind === \"time\") want = wantOf(tok.beats, tok.beatType);\n    else if (isTimed(tok)) ticks += tok.dur;\n  });\n  return out;\n}\n", "// arrange.ts \u2014\u2014 \u7F16\u6392\uFF1A\u8FD9\u9996\u6B4C\u6309\u4EC0\u4E48\u987A\u5E8F\u653E\u54EA\u51E0\u5F20\u7EB8\uFF082026-10-08 \u6DF1\u591C\uFF0CClaude Opus 5.5\uFF09\u3002\n// user\uFF1A\u300Ca flat \u7F16\u6392 list \u540C\u610F\uFF0C\u6211\u4E5F\u559C\u6B22\uFF0C\u548C\u6211\u60F3\u7684\u4E00\u6837\u300D\u300C\u7F16\u6392\u6211\u5EFA\u8BAE\u5C31\u662F\u603Bpaper\u7684\u9876\u4E0A\u8BF4\u4E00\u4E0B\uFF0C\u7136\u540E\u53EA\u6709\u5168\u90E8paper\u7684\u65F6\u5019\u53EF\u89C1\uFF0C\u5C31\u662F\u4E00\u884C\uFF0C\u5BF9\u5427\uFF0C\u5C31\u548Ctitle\u4E00\u6837\u300D\n//   \u300C\u670912\u623F\u5B50\uFF0Cmaster list\u80FD\u8C03\u7528A.1 x3 A.2 x5\u8FD9\u6837\u5417\uFF1F\u4E5F\u8BB8\u4E0D\u8981\u5F04\u5F97\u592A\u590D\u6742\u300D\u300C\u53EF\u4EE5\uFF0C\u7136\u540E\u65E0\u7A77\u5FAA\u73AF\u548C\u5FAA\u73AF\u8D70\u5E26\u90FD\u505A\u300D\u3002\n// \u5199\u6CD5\u53EA\u6709\u4E09\u6837\uFF08\u4E00\u68F5\u53EA\u6709\u300C\u987A\u5E8F\u300D\u300C\u91CD\u590D\u300D\u4E24\u79CD\u8282\u70B9\u7684\u5C0F\u6811 + \u4E00\u4E2A\u5FAA\u73AF\u6BB5\uFF1B\u5C55\u5F00\u5C31\u662F\u4E00\u6761\u64AD\u653E\u987A\u5E8F\uFF0C\u6CA1\u6709 D.C. / D.S. \u90A3\u79CD\u8DF3\u8F6C\u3001\u6CA1\u6709\u6B67\u4E49\uFF09\uFF1A\n//   \u00B7 \u7EB8\uFF1A\u66F2\u6BB5\u540D\uFF08\u7EB8\u9876\u90A3\u4E00\u6761\uFF09\uFF0C\u6216\u8005\u7B2C\u51E0\u5F20\u7EB8\u7684\u5E8F\u53F7\uFF081 \u8D77\uFF09\uFF1B\u7A7A\u683C / \u3001 / , / \u2192 \u9694\u5F00\uFF1B\n//   \u00B7 \u91CD\u590D\uFF1A\u540D\u5B57\u6216\u62EC\u53F7\u540E\u9762\u8DDF \u00D7N\uFF08x / X / * \u4E5F\u8BA4\uFF09\uFF0C\u5982 A\u00D72\u3001(A A1)\u00D73\u2014\u2014\u623F\u5B50 = \u7ED3\u5C3E\u5355\u72EC\u505A\u6210\u4E00\u5F20\u5C0F\u7EB8\uFF0C\u4E3B\u4F53\u5171\u7528\uFF0C\u62EC\u8D77\u6765\u91CD\u590D\uFF1B\n//   \u00B7 \u5FAA\u73AF\u6BB5\uFF1A[ \u2026 ]\uFF0C\u53EA\u80FD\u4E00\u4E2A\u3001\u653E\u5728\u6700\u540E\uFF1A\u524D\u9762\u653E\u4E00\u904D\uFF0C\u62EC\u4F4F\u7684\u4E00\u76F4\u5FAA\u73AF\uFF08\u5355\u66F2\u5FAA\u73AF / \u6E38\u620F\u7684\u300C\u524D\u594F + \u5FAA\u73AF\u6BB5\u300D\uFF09\u3002\n// \u4E0D\u5199 = \u6BCF\u5F20\u7EB8\u6309\u987A\u5E8F\u5404\u653E\u4E00\u904D\uFF08\u9690\u85CF\u7684\u4E0D\u653E\uFF1B\u548C\u4EE5\u524D\u4E00\u6837\uFF09\u3002\u5199\u9519\u7684\uFF08\u627E\u4E0D\u5230\u8FD9\u5F20\u7EB8\u3001\u5FAA\u73AF\u6BB5\u540E\u9762\u8FD8\u6709\u4E1C\u897F\u2026\uFF09\u7167\u5199\u7167\u5B58\u3001\u8C31\u4E0A\u90A3\u4E00\u884C\u753B\u51FA\u6765\u3001\u8BF4\u4E3A\u4EC0\u4E48\uFF0C\u653E\u7684\u65F6\u5019\u8DF3\u8FC7\uFF08\u7EAA\u5F8B\u300C\u505A\u4E0D\u5230\u7684\u4E00\u5F8B\u753B\u7070 + \u660E\u8BF4\u300D\uFF09\u3002\nimport { type PaperSeg, type Token, type TempoMap, timeline } from \"./song.ts\";\n\nexport type ArrNode = { kind: \"ref\"; paper: string; text: string; at: number } | { kind: \"rep\"; body: ArrNode[]; n: number };\nexport interface ArrIssue { at: number; len: number; why: string }\nexport interface Arrangement { order: string[]; loop: string[] | null; issues: ArrIssue[]; explicit: boolean }\n\nconst REP = /^(?:[\u00D7xX*])(\\d+)/;\n/** \u89E3\u6790\u7F16\u6392\u90A3\u4E00\u884C\u3002papers = \u6B4C\u91CC\u7684\u7EB8\uFF08\u6309\u987A\u5E8F\uFF09\u3002 */\nexport function parseArrangement(text: string | undefined, papers: readonly PaperSeg[]): Arrangement {\n  const src = (text ?? \"\").trim();\n  if (!src) return { order: papers.filter((p) => !p.hidden).map((p) => p.id), loop: null, issues: [], explicit: false };\n  const issues: ArrIssue[] = [];\n  let i = 0;\n  const ws = () => { while (i < src.length && /[\\s\u3001,\uFF0C\u2192]/.test(src[i])) i++; };\n  const findPaper = (name: string): string | null => {\n    const byName = papers.find((p) => p.name.trim() === name);\n    if (byName) return byName.id;\n    if (/^\\d+$/.test(name)) { const k = Number(name); if (k >= 1 && k <= papers.length) return papers[k - 1].id; }\n    return null;\n  };\n  const rep = (): number | null => {   // \u00D7N \u524D\u9762\u53EF\u4EE5\u6709\u7A7A\u683C\uFF08\u300CA x2\u300D\uFF09\n    const save = i; while (src[i] === \" \") i++;\n    const m = REP.exec(src.slice(i)); if (!m) { i = save; return null; }\n    i += m[0].length; return Number(m[1]);\n  };\n  const seq = (close: string | null): ArrNode[] => {\n    const out: ArrNode[] = [];\n    for (;;) {\n      ws();\n      if (i >= src.length) { if (close) issues.push({ at: src.length, len: 0, why: `\u5C11\u4E86\u300C${close}\u300D` }); return out; }\n      const c = src[i];\n      if (close && c === close) { i++; return out; }\n      if (c === \")\" || c === \"]\") { issues.push({ at: i, len: 1, why: `\u591A\u4E86\u300C${c}\u300D` }); i++; continue; }\n      if (c === \"[\") return out;   // \u5FAA\u73AF\u6BB5\u7531\u5916\u5C42\u5904\u7406\n      let node: ArrNode;\n      const at = i;\n      if (c === \"(\") { i++; node = { kind: \"rep\", body: seq(\")\"), n: 1 }; }\n      else {\n        let name = \"\"; while (i < src.length && !/[\\s\u3001,\uFF0C\u2192()[\\]\u00D7*]/.test(src[i]) && !(/[xX]/.test(src[i]) && /\\d/.test(src[i + 1] ?? \"\") && name)) name += src[i++];\n        if (!name) { issues.push({ at: i, len: 1, why: `\u770B\u4E0D\u61C2\u300C${src[i]}\u300D` }); i++; continue; }\n        const paper = findPaper(name);\n        if (!paper) { issues.push({ at, len: name.length, why: `\u6CA1\u6709\u53EB\u300C${name}\u300D\u7684\u7EB8\uFF08\u5199\u66F2\u6BB5\u540D\uFF0C\u6216\u8005\u7B2C\u51E0\u5F20\u7EB8\u7684\u5E8F\u53F7\uFF09` }); node = { kind: \"rep\", body: [], n: 1 }; }\n        else node = { kind: \"ref\", paper, text: name, at };\n      }\n      const n = rep();\n      if (n !== null) { if (n < 1 || n > 99) issues.push({ at, len: i - at, why: \"\u91CD\u590D\u6B21\u6570\u8981\u5728 1 \u5230 99 \u4E4B\u95F4\" }); if (n >= 1) node = { kind: \"rep\", body: [node], n: Math.min(99, n) }; }\n      out.push(node);\n    }\n  };\n  const main = seq(null);\n  let loopNodes: ArrNode[] | null = null;\n  ws();\n  if (i < src.length && src[i] === \"[\") {\n    const at = i; i++;\n    loopNodes = seq(\"]\");\n    if (!loopNodes.length) issues.push({ at, len: i - at, why: \"\u5FAA\u73AF\u6BB5\u662F\u7A7A\u7684\" });\n    ws();\n    if (i < src.length) { issues.push({ at: i, len: src.length - i, why: \"\u5FAA\u73AF\u6BB5\u53EA\u80FD\u653E\u5728\u6700\u540E\uFF1A\u540E\u9762\u7684\u6C38\u8FDC\u653E\u4E0D\u5230\" }); }\n  }\n  const expand = (ns: ArrNode[]): string[] => ns.flatMap((n) => (n.kind === \"ref\" ? [n.paper] : Array.from({ length: n.n }, () => expand(n.body)).flat()));\n  const loop = loopNodes ? expand(loopNodes) : null;\n  return { order: expand(main), loop: loop && loop.length ? loop : null, issues, explicit: true };\n}\n\n/** \u653E\u7684\u987A\u5E8F\uFF08\u5FAA\u73AF\u6BB5\u653E\u4E00\u904D\uFF09\uFF1A\u7ED9\u538B\u5E73\u4EF6 / \u5BFC\u51FA\u7528\u3002 */\nexport const playOrder = (a: Arrangement): string[] => [...a.order, ...(a.loop ?? [])];\n/** \u4E00\u9996\u6B4C\u6574\u9996\u653E\u7684\u987A\u5E8F\uFF08\u6CA1\u5199\u7F16\u6392 = \u6BCF\u5F20\u6CA1\u85CF\u7684\u7EB8\u5404\u4E00\u904D\uFF09\u3002 */\nexport const songPlayOrder = (song: { arrangement?: string; papers: readonly PaperSeg[] }): string[] => playOrder(parseArrangement(song.arrangement, song.papers));\n\n/** \u5FAA\u73AF\u653E\uFF08\u8D70\u5E26\u300C\u5FAA\u73AF\u300D\u5F00\u7740\uFF1Buser\u300C\u6211\u786E\u5B9E\u5E0C\u671B\u80FD\u5355\u66F2\u5FAA\u73AF\uFF0C\u6216\u8005\u6D4B\u8BD5\u6218\u6597\u5FAA\u73AF\u5207\u5272\u300D\u300C\u65E0\u7A77\u5FAA\u73AF\u548C\u5FAA\u73AF\u8D70\u5E26\u90FD\u505A\u300D\uFF09\uFF1A\n *  \u6E32\u67D3\u7684\u987A\u5E8F = \u524D\u9762\u90A3\u6BB5 + \u5FAA\u73AF\u6BB5**\u653E\u4E24\u904D**\uFF1B\u5FAA\u73AF\u533A\u95F4 = \u7B2C\u4E8C\u904D\u3002\u7B2C\u4E00\u904D\u7684\u5C3E\u97F3\uFF08\u6DF7\u54CD\u3001\u6CA1\u6536\u5B8C\u7684\u97F3\uFF09\u81EA\u7136\u6E17\u8FDB\u7B2C\u4E8C\u904D\u7684\u5F00\u5934\uFF0C\n *  \u6240\u4EE5\u6BCF\u6B21\u4ECE\u7B2C\u4E8C\u904D\u7684\u7ED3\u5C3E\u8DF3\u56DE\u7B2C\u4E8C\u904D\u7684\u5F00\u5934\uFF0C\u542C\u5230\u7684\u63A5\u7F1D\u548C\u771F\u7684\u4E00\u904D\u904D\u8FDE\u7740\u653E\u4E00\u6A21\u4E00\u6837\uFF08\u6E38\u620F\u91CC\u5FAA\u73AF\u97F3\u4E50\u5207\u6CD5\u7684\u540C\u4E00\u4E2A\u9053\u7406\uFF09\u3002\n *  \u6CA1\u5199\u5FAA\u73AF\u6BB5 = \u6574\u9996\u5FAA\u73AF\uFF1B\u672C\u6BB5\u89C6\u56FE\uFF08\u6B4C\u53EA\u5269\u4E00\u5F20\u7EB8\u3001\u6CA1\u6709\u7F16\u6392\uFF09= \u8FD9\u4E00\u5F20\u5FAA\u73AF\u3002intro / body = \u7EB8\u7684\u5F20\u6570\u3002 */\nexport function loopPlan(song: { arrangement?: string; papers: readonly PaperSeg[] }): { order: string[]; intro: number; body: number } {\n  const a = parseArrangement(song.arrangement, song.papers);\n  const intro = a.loop ? a.order : [], body = a.loop ?? a.order;\n  return { order: [...intro, ...body, ...body], intro: intro.length, body: body.length };\n}\n/** \u5FAA\u73AF\u533A\u95F4\uFF08\u8C31\u4E0A\u7684\u79D2\uFF09\uFF1Atokens / map / starts = \u7167 loopPlan \u7684\u987A\u5E8F\u538B\u5E73\u7684\u7B2C\u4E00\u4E2A\u58F0\u90E8\uFF1B\u7B2C\u4E8C\u904D\u4ECE starts[intro + body] \u8D77\u3001\u5230\u6574\u4E32\u7ED3\u5C3E\u3002 */\nexport function loopWindow(tokens: Token[], map: TempoMap, starts: readonly { index: number }[], plan: { intro: number; body: number }): { start: number; end: number } | null {\n  if (!plan.body) return null;\n  const tl = timeline(tokens, map), end = tl.length ? tl[tl.length - 1].t1 : 0, from = starts[plan.intro + plan.body]?.index ?? tokens.length;\n  const start = tl.find((x) => x.index >= from)?.t0 ?? end;\n  return end - start > 0.05 ? { start, end } : null;   // \u5FAA\u73AF\u6BB5\u662F\u7A7A\u7684\uFF08\u4E00\u4E2A\u97F3\u90FD\u6CA1\u6709\u3001\u4E5F\u6CA1\u6709\u4F11\u6B62\uFF09= \u4E0D\u5FAA\u73AF\n}\n", "// \u751F\u6210\u7269\uFF1Anode scripts/gen-grooves.mjs\uFF08\u6E90 = ../20260813 MyLlamaReborn/20261007 \u97F3\u4E50\u53F2/export/moonsinger/grooves-v2.json\uFF0C\u62F7\u5728 vendor/grooves/\uFF09\u3002\u52FF\u624B\u6539\u3002\n// \u62CD\u5B50\u8F7B\u91CD\u7684\u9884\u8BBE\uFF08\u97F3\u4E50\u4ED3\u9F20\u51FA\uFF1B\u5F3A\u5F31\u5148\u540E\u5F15\u7EF4\u57FA\u539F\u6587\u3001\u5177\u4F53\u6570\u503C AI \u6309\u5C42\u7EA7\u53D6\uFF1B\u5F15\u6587 / \u4F9D\u636E / \u8BB8\u53EF\u8BC1\u89C1 vendor/grooves/grooves-v2.json\uFF09\u3002\nexport const GROOVES_VERSION = 2;\nexport const GROOVES_FILE = {\"file\":\"vendor/grooves/grooves-v2.json\",\"bytes\":42822,\"sha256\":\"95c8f7fc050dc0512ee31bd6044bb1059393b80bdb2c289dbfd48001954b098b\"} as const;\nexport interface GrooveStyle {\n  id: string; name: { zh: string; en: string; ja: string }; aliases: string[];\n  /** \u62CD\u53F7\uFF08\"4/4\"\uFF09\u2192 \u4E00\u5C0F\u8282\u51E0\u4E2A\u5341\u516D\u5206\u683C\u5B50 + \u6BCF\u683C\u4E0A\u5F00\u59CB\u7684\u97F3\u7684\u76F8\u5BF9\u8F7B\u91CD\uFF08\u22121\u20261\uFF09\uFF1Bbars = \u51E0\u5C0F\u8282\u4E00\u8F6E\uFF08\u514B\u62C9\u7EF4 = 2\uFF0Cweights = \u4E24\u5C0F\u8282\u7684\u683C\u5B50\u63A5\u8D77\u6765\uFF09\u3002 */\n  meters: Record<string, { grid: number; weights: number[]; bars?: number }>;\n  /** \u4E24\u5C0F\u8282\u4E00\u8F6E\u7684\u9ED8\u8BA4\u65B9\u5411\uFF08\"3-2\" = \u7B2C\u4E00\u5C0F\u8282\u662F\u4E09\u51FB\u90A3\u8FB9\uFF09\uFF1B\u300C\u9519\u5F00\u4E00\u5C0F\u8282\u300D= \u4E24\u5C0F\u8282\u5BF9\u8C03\uFF082-3\uFF09\u3002\u6CA1\u6709 = \u4E00\u5C0F\u8282\u4E00\u8F6E\u3002 */\n  phase: string | null;\n  /** \u6CA1\u5217\u7684\u62CD\u53F7\uFF1Aclassical = \u6309\u53E4\u5178\u5C42\u7EA7\u63A8\uFF1Bnone = \u4E0D\u52A0\u3002 */\n  fallback: \"classical\" | \"none\";\n  /** \u5404\u7C7B\u4E50\u5668\u8DDF\u591A\u5C11\uFF080\u20131\uFF09\uFF1A\u952E = GM \u5BB6\u65CF\uFF08gm-map defs.families\uFF09+ voice\uFF08\u4EBA\u58F0\u7C7B\uFF0C\u4F18\u5148\uFF09\u3002 */\n  follow: Record<string, number>;\n  /** \u6447\u6446\uFF08\u65F6\u503C\uFF0C\u4E0D\u662F\u8F7B\u91CD\uFF09\uFF1A\u4E00\u5BF9\u97F3\u91CC\u524D\u4E00\u4E2A\u5360\u7684\u6BD4\u4F8B\u3002 */\n  swing: { unit: string; ratio: number; range: [number, number] } | null;\n}\nexport const GROOVE_STYLES: GrooveStyle[] = [\n {\n  \"id\": \"none\",\n  \"name\": {\n   \"zh\": \"\u65E0\",\n   \"en\": \"None\",\n   \"ja\": \"\u306A\u3057\"\n  },\n  \"aliases\": [\n   \"\u65E0\u98CE\u683C\",\n   \"Off\"\n  ],\n  \"meters\": {},\n  \"phase\": null,\n  \"fallback\": \"none\",\n  \"follow\": {\n   \"piano\": 0,\n   \"chromatic-percussion\": 0,\n   \"organ\": 0,\n   \"guitar\": 0,\n   \"bass\": 0,\n   \"strings\": 0,\n   \"ensemble\": 0,\n   \"brass\": 0,\n   \"reed\": 0,\n   \"pipe\": 0,\n   \"synth-lead\": 0,\n   \"synth-pad\": 0,\n   \"synth-effects\": 0,\n   \"ethnic\": 0,\n   \"percussive\": 0,\n   \"sound-effects\": 0,\n   \"percussion\": 0,\n   \"voice\": 0\n  },\n  \"swing\": null\n },\n {\n  \"id\": \"classical\",\n  \"name\": {\n   \"zh\": \"\u53E4\u5178\",\n   \"en\": \"Classical\",\n   \"ja\": \"\u30AF\u30E9\u30B7\u30C3\u30AF\"\n  },\n  \"aliases\": [\n   \"Classic\",\n   \"\u53E4\u5178\u6D3E\"\n  ],\n  \"meters\": {\n   \"4/4\": {\n    \"grid\": 16,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.25,\n     -0.5,\n     0,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     0,\n     -0.5,\n     -0.25,\n     -0.5\n    ]\n   },\n   \"3/4\": {\n    \"grid\": 12,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.25,\n     -0.5,\n     0,\n     -0.5,\n     -0.25,\n     -0.5,\n     0,\n     -0.5,\n     -0.25,\n     -0.5\n    ]\n   },\n   \"2/4\": {\n    \"grid\": 8,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.25,\n     -0.5,\n     0,\n     -0.5,\n     -0.25,\n     -0.5\n    ]\n   },\n   \"2/2\": {\n    \"grid\": 16,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.5,\n     -0.5,\n     0,\n     -0.5,\n     -0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.5,\n     -0.5\n    ]\n   },\n   \"6/8\": {\n    \"grid\": 12,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     0,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5\n    ]\n   },\n   \"12/8\": {\n    \"grid\": 24,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     0,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     0,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5\n    ]\n   }\n  },\n  \"phase\": null,\n  \"fallback\": \"classical\",\n  \"follow\": {\n   \"piano\": 0.5,\n   \"chromatic-percussion\": 0.6,\n   \"organ\": 0.2,\n   \"guitar\": 0.6,\n   \"bass\": 0.6,\n   \"strings\": 0.5,\n   \"ensemble\": 0.3,\n   \"brass\": 0.5,\n   \"reed\": 0.4,\n   \"pipe\": 0.4,\n   \"synth-lead\": 0.4,\n   \"synth-pad\": 0,\n   \"synth-effects\": 0,\n   \"ethnic\": 0.5,\n   \"percussive\": 1,\n   \"sound-effects\": 0,\n   \"percussion\": 1,\n   \"voice\": 0.3\n  },\n  \"swing\": null\n },\n {\n  \"id\": \"pop\",\n  \"name\": {\n   \"zh\": \"\u6D41\u884C\",\n   \"en\": \"Pop\",\n   \"ja\": \"\u30DD\u30C3\u30D7\u30B9\"\n  },\n  \"aliases\": [\n   \"Rock\",\n   \"\u6447\u6EDA\",\n   \"\u30ED\u30C3\u30AF\",\n   \"R&B\",\n   \"Backbeat\",\n   \"\u53CD\u62CD\"\n  ],\n  \"meters\": {\n   \"4/4\": {\n    \"grid\": 16,\n    \"weights\": [\n     0.5,\n     -0.25,\n     0,\n     -0.25,\n     1,\n     -0.25,\n     0,\n     -0.25,\n     0.5,\n     -0.25,\n     0,\n     -0.25,\n     1,\n     -0.25,\n     0,\n     -0.25\n    ]\n   },\n   \"12/8\": {\n    \"grid\": 24,\n    \"weights\": [\n     0.5,\n     -0.25,\n     0,\n     -0.25,\n     0,\n     -0.25,\n     1,\n     -0.25,\n     0,\n     -0.25,\n     0,\n     -0.25,\n     0.5,\n     -0.25,\n     0,\n     -0.25,\n     0,\n     -0.25,\n     1,\n     -0.25,\n     0,\n     -0.25,\n     0,\n     -0.25\n    ]\n   }\n  },\n  \"phase\": null,\n  \"fallback\": \"classical\",\n  \"follow\": {\n   \"piano\": 0.6,\n   \"chromatic-percussion\": 0.5,\n   \"organ\": 0.3,\n   \"guitar\": 0.8,\n   \"bass\": 1,\n   \"strings\": 0.2,\n   \"ensemble\": 0.1,\n   \"brass\": 0.6,\n   \"reed\": 0.3,\n   \"pipe\": 0.2,\n   \"synth-lead\": 0.3,\n   \"synth-pad\": 0,\n   \"synth-effects\": 0,\n   \"ethnic\": 0.5,\n   \"percussive\": 0.8,\n   \"sound-effects\": 0,\n   \"percussion\": 1,\n   \"voice\": 0.3\n  },\n  \"swing\": null\n },\n {\n  \"id\": \"waltz\",\n  \"name\": {\n   \"zh\": \"\u534E\u5C14\u5179\",\n   \"en\": \"Waltz\",\n   \"ja\": \"\u30EF\u30EB\u30C4\"\n  },\n  \"aliases\": [\n   \"\u5706\u821E\u66F2\",\n   \"Valse\",\n   \"Walzer\"\n  ],\n  \"meters\": {\n   \"3/4\": {\n    \"grid\": 12,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.5,\n     -0.5\n    ]\n   }\n  },\n  \"phase\": null,\n  \"fallback\": \"classical\",\n  \"follow\": {\n   \"piano\": 0.8,\n   \"chromatic-percussion\": 0.6,\n   \"organ\": 0.3,\n   \"guitar\": 0.8,\n   \"bass\": 1,\n   \"strings\": 0.5,\n   \"ensemble\": 0.3,\n   \"brass\": 0.5,\n   \"reed\": 0.3,\n   \"pipe\": 0.3,\n   \"synth-lead\": 0.3,\n   \"synth-pad\": 0,\n   \"synth-effects\": 0,\n   \"ethnic\": 0.5,\n   \"percussive\": 0.8,\n   \"sound-effects\": 0,\n   \"percussion\": 1,\n   \"voice\": 0.3\n  },\n  \"swing\": null\n },\n {\n  \"id\": \"march\",\n  \"name\": {\n   \"zh\": \"\u8FDB\u884C\u66F2\",\n   \"en\": \"March\",\n   \"ja\": \"\u30DE\u30FC\u30C1\"\n  },\n  \"aliases\": [\n   \"\u884C\u8FDB\u66F2\",\n   \"Marcia\",\n   \"\u884C\u9032\u66F2\"\n  ],\n  \"meters\": {\n   \"2/4\": {\n    \"grid\": 8,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.5,\n     -0.5,\n     -0.25,\n     -0.5\n    ]\n   },\n   \"2/2\": {\n    \"grid\": 16,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.5,\n     -0.5,\n     0.5,\n     -0.5,\n     -0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.5,\n     -0.5\n    ]\n   },\n   \"4/4\": {\n    \"grid\": 16,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.5,\n     -0.5,\n     -0.25,\n     -0.5\n    ]\n   },\n   \"6/8\": {\n    \"grid\": 12,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5\n    ]\n   }\n  },\n  \"phase\": null,\n  \"fallback\": \"classical\",\n  \"follow\": {\n   \"piano\": 0.6,\n   \"chromatic-percussion\": 0.6,\n   \"organ\": 0.3,\n   \"guitar\": 0.6,\n   \"bass\": 1,\n   \"strings\": 0.5,\n   \"ensemble\": 0.3,\n   \"brass\": 0.8,\n   \"reed\": 0.6,\n   \"pipe\": 0.6,\n   \"synth-lead\": 0.4,\n   \"synth-pad\": 0,\n   \"synth-effects\": 0,\n   \"ethnic\": 0.5,\n   \"percussive\": 1,\n   \"sound-effects\": 0,\n   \"percussion\": 1,\n   \"voice\": 0.4\n  },\n  \"swing\": null\n },\n {\n  \"id\": \"swing\",\n  \"name\": {\n   \"zh\": \"Swing\",\n   \"en\": \"Swing\",\n   \"ja\": \"\u30B9\u30A6\u30A3\u30F3\u30B0\"\n  },\n  \"aliases\": [\n   \"\u6447\u6446\",\n   \"\u7235\u58EB\",\n   \"Jazz\",\n   \"\u30B8\u30E3\u30BA\"\n  ],\n  \"meters\": {\n   \"4/4\": {\n    \"grid\": 16,\n    \"weights\": [\n     0.25,\n     -0.25,\n     0,\n     -0.25,\n     1,\n     -0.25,\n     0,\n     -0.25,\n     0.25,\n     -0.25,\n     0,\n     -0.25,\n     1,\n     -0.25,\n     0,\n     -0.25\n    ]\n   }\n  },\n  \"phase\": null,\n  \"fallback\": \"classical\",\n  \"follow\": {\n   \"piano\": 0.5,\n   \"chromatic-percussion\": 0.4,\n   \"organ\": 0.3,\n   \"guitar\": 0.6,\n   \"bass\": 0.4,\n   \"strings\": 0.2,\n   \"ensemble\": 0.1,\n   \"brass\": 0.5,\n   \"reed\": 0.5,\n   \"pipe\": 0.3,\n   \"synth-lead\": 0.3,\n   \"synth-pad\": 0,\n   \"synth-effects\": 0,\n   \"ethnic\": 0.4,\n   \"percussive\": 0.6,\n   \"sound-effects\": 0,\n   \"percussion\": 1,\n   \"voice\": 0.2\n  },\n  \"swing\": {\n   \"unit\": \"8th\",\n   \"ratio\": 0.667,\n   \"range\": [\n    0.5,\n    0.75\n   ]\n  }\n },\n {\n  \"id\": \"four-on-the-floor\",\n  \"name\": {\n   \"zh\": \"\u56DB\u62CD\u5E95\u9F13\",\n   \"en\": \"Four on the floor\",\n   \"ja\": \"4\u3064\u6253\u3061\"\n  },\n  \"aliases\": [\n   \"\u7535\u5B50\",\n   \"\u8FEA\u65AF\u79D1\",\n   \"Disco\",\n   \"EDM\",\n   \"House\",\n   \"\u30C7\u30A3\u30B9\u30B3\"\n  ],\n  \"meters\": {\n   \"4/4\": {\n    \"grid\": 16,\n    \"weights\": [\n     1,\n     0,\n     0.5,\n     0,\n     1,\n     0,\n     0.5,\n     0,\n     1,\n     0,\n     0.5,\n     0,\n     1,\n     0,\n     0.5,\n     0\n    ]\n   }\n  },\n  \"phase\": null,\n  \"fallback\": \"classical\",\n  \"follow\": {\n   \"piano\": 0.6,\n   \"chromatic-percussion\": 0.4,\n   \"organ\": 0.3,\n   \"guitar\": 0.6,\n   \"bass\": 0.8,\n   \"strings\": 0.2,\n   \"ensemble\": 0.1,\n   \"brass\": 0.5,\n   \"reed\": 0.3,\n   \"pipe\": 0.2,\n   \"synth-lead\": 0.5,\n   \"synth-pad\": 0,\n   \"synth-effects\": 0,\n   \"ethnic\": 0.4,\n   \"percussive\": 0.8,\n   \"sound-effects\": 0,\n   \"percussion\": 1,\n   \"voice\": 0.2\n  },\n  \"swing\": null\n },\n {\n  \"id\": \"bossa-nova\",\n  \"name\": {\n   \"zh\": \"\u6CE2\u8428\",\n   \"en\": \"Bossa nova\",\n   \"ja\": \"\u30DC\u30B5\u30CE\u30F4\u30A1\"\n  },\n  \"aliases\": [\n   \"Bossa\",\n   \"\u5DF4\u8428\u8BFA\u74E6\",\n   \"\u30DC\u30B5\u30CE\u30D0\",\n   \"Samba-reggae\"\n  ],\n  \"meters\": {\n   \"2/4\": {\n    \"grid\": 8,\n    \"weights\": [\n     1,\n     -0.25,\n     -0.25,\n     0.75,\n     0.5,\n     -0.25,\n     0.75,\n     0.25,\n     0.5,\n     -0.25,\n     0.75,\n     0.25,\n     0.5,\n     0.75,\n     -0.25,\n     0.25\n    ],\n    \"bars\": 2\n   },\n   \"2/2\": {\n    \"grid\": 16,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     0.25,\n     -0.5,\n     0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     0.25,\n     -0.5,\n     0.5,\n     -0.5,\n     0.75,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.25,\n     -0.5\n    ],\n    \"bars\": 2\n   },\n   \"4/4\": {\n    \"grid\": 16,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     0.25,\n     -0.5,\n     0.5,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     0.25,\n     -0.5,\n     0.5,\n     -0.5,\n     0.75,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.25,\n     -0.5\n    ],\n    \"bars\": 2\n   }\n  },\n  \"phase\": \"3-2\",\n  \"fallback\": \"classical\",\n  \"follow\": {\n   \"piano\": 0.6,\n   \"chromatic-percussion\": 0.4,\n   \"organ\": 0.3,\n   \"guitar\": 1,\n   \"bass\": 0.6,\n   \"strings\": 0.1,\n   \"ensemble\": 0.1,\n   \"brass\": 0.3,\n   \"reed\": 0.3,\n   \"pipe\": 0.3,\n   \"synth-lead\": 0.3,\n   \"synth-pad\": 0,\n   \"synth-effects\": 0,\n   \"ethnic\": 0.5,\n   \"percussive\": 1,\n   \"sound-effects\": 0,\n   \"percussion\": 1,\n   \"voice\": 0.1\n  },\n  \"swing\": null\n },\n {\n  \"id\": \"latin\",\n  \"name\": {\n   \"zh\": \"\u62C9\u4E01\uFF08\u514B\u62C9\u7EF4\uFF09\",\n   \"en\": \"Latin (son clave)\",\n   \"ja\": \"\u30E9\u30C6\u30F3\uFF08\u30BD\u30F3\u30FB\u30AF\u30E9\u30FC\u30D9\uFF09\"\n  },\n  \"aliases\": [\n   \"\u62C9\u4E01\",\n   \"Latin\",\n   \"Son\",\n   \"Salsa\",\n   \"\u8428\u5C14\u8428\",\n   \"Mambo\",\n   \"\u66FC\u6CE2\",\n   \"\u30B5\u30EB\u30B5\",\n   \"\u30E9\u30C6\u30F3\",\n   \"Clave\",\n   \"\u514B\u62C9\u7EF4\"\n  ],\n  \"meters\": {\n   \"2/4\": {\n    \"grid\": 8,\n    \"weights\": [\n     1,\n     -0.25,\n     -0.25,\n     0.75,\n     0,\n     -0.25,\n     0.75,\n     -0.25,\n     0.25,\n     -0.25,\n     0.75,\n     -0.25,\n     0.75,\n     -0.25,\n     -0.25,\n     -0.25\n    ],\n    \"bars\": 2\n   },\n   \"2/2\": {\n    \"grid\": 16,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     0,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5\n    ],\n    \"bars\": 2\n   },\n   \"4/4\": {\n    \"grid\": 16,\n    \"weights\": [\n     1,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     0,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     -0.25,\n     -0.5,\n     0.75,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5,\n     -0.25,\n     -0.5\n    ],\n    \"bars\": 2\n   }\n  },\n  \"phase\": \"3-2\",\n  \"fallback\": \"classical\",\n  \"follow\": {\n   \"piano\": 0.8,\n   \"chromatic-percussion\": 0.5,\n   \"organ\": 0.3,\n   \"guitar\": 0.6,\n   \"bass\": 0.8,\n   \"strings\": 0.3,\n   \"ensemble\": 0.1,\n   \"brass\": 0.6,\n   \"reed\": 0.4,\n   \"pipe\": 0.4,\n   \"synth-lead\": 0.3,\n   \"synth-pad\": 0,\n   \"synth-effects\": 0,\n   \"ethnic\": 0.6,\n   \"percussive\": 1,\n   \"sound-effects\": 0,\n   \"percussion\": 1,\n   \"voice\": 0.3\n  },\n  \"swing\": null\n }\n];\n", "// groove.ts \u2014\u2014 \u62CD\u5B50\u8F7B\u91CD\uFF1A\u98CE\u683C\u8BB0\u53F7 \u2192 \u6BCF\u4E2A\u97F3\u6309\u5B83\u5728\u5C0F\u8282\u91CC\u7684\u4F4D\u7F6E\u8F7B\u4E00\u70B9 / \u91CD\u4E00\u70B9\uFF08\u7EAF\u51FD\u6570\uFF0CNode \u91CC\u53EF\u6D4B\uFF09\u3002created 2026-10-08 \u6DF1\u591C by Claude Opus 5.5\n// user\uFF1A\u300C\u5148\u8BA8\u8BBA\u6E05\u695A\u518D\u505A\uFF0C\u4E0D\u540C\u7684\u6D41\u6D3E\u4F1A\u4E0D\u4E00\u6837\u300D\u2192 \u98CE\u683C = \u50CF\u901F\u5EA6\u4E00\u6837\u7684\u6587\u5B57\u8BB0\u53F7\uFF0C\u300C\u53EA\u5BF9\u5F53\u524Dsheet\u6709\u7528\u300D\u300C\u4E2D\u95F4\u6362\u540C\u610F\u300D\u300C\u70B9\u5F00\u4E4B\u540E\u53EF\u4EE5\u8BBE\u7F6E\u5177\u4F53\u7684\u7EC6\u8282\u300D\uFF1B\n//   \u300C\u9884\u8BBE\u53EF\u4EE5\uFF0C\u4F60\u7ED9\u97F3\u4E50\u4ED3\u9F20\u53D1\u4E00\u4E2A\u5DE5\u5355\uFF0C\u505A\u6210\u6570\u636E\u9A71\u52A8\u7684\u300D\u2192 \u9884\u8BBE = \u4ED3\u9F20\u7684 grooves-vN.json\uFF08src/score/grooves.gen.ts\uFF1B\u5F3A\u5F31\u5148\u540E\u5F15\u7EF4\u57FA\u539F\u6587\u3001\u6570\u503C AI \u6309\u5C42\u7EA7\u53D6\uFF09\u3002\n// \u600E\u4E48\u51FA\u58F0\uFF08perform.ts \u7528\uFF09\uFF1A\u6743\u91CD w\uFF08\u22121\u20261\uFF09\u00D7 \u8BB0\u53F7\u7684\u5E45\u5EA6 \u00D7 \u8FD9\u4F4D\u6F14\u594F\u8005\u8DDF\u591A\u5C11\uFF08\u9884\u8BBE\u6309\u4E50\u5668\u7C7B\u522B\u7ED9\uFF0Cfollow\uFF09= \u8FD9\u4E2A\u97F3\u7684\u300C\u62CD\u5B50\u8F7B\u91CD\u300D\uFF1B\n//   w > 0 = \u6309\u6B21\u91CD\u97F3\u7684\u91CF\u52A0\uFF08w = 1 \u5C31\u662F\u4E00\u4E2A\u6B21\u91CD\u97F3\uFF09\uFF0Cw < 0 = \u6309\u5F31\u5316\u7684\u91CF\u51CF\uFF08w = \u22121 \u5C31\u662F\u4E00\u4E2A\u5F31\u5316\uFF09\u2014\u2014\u540C\u4E00\u628A\u5C3A\u5B50\uFF0C\u6F14\u594F\u8005\u914D\u7F6E\u91CC\u6B21\u91CD\u97F3 / \u5F31\u5316\u8C03\u591A\u5C11\uFF0C\u8FD9\u91CC\u8DDF\u7740\u53D8\u3002\n//   \u8C31\u4E0A\u5199\u4E86\u97F3\u5934\u8BB0\u53F7\uFF08\u5E7D\u7075\u97F3 / \u5F31\u5316 / \u6B21\u91CD\u97F3 / \u91CD\u97F3 / \u5F3A\u97F3 / \u7A81\u5F3A / \u5F3A\u540E\u5373\u5F31\uFF09\u7684\u97F3 = \u5199\u7684\u8BF4\u4E86\u7B97\uFF0C\u62CD\u5B50\u8F7B\u91CD\u4E0D\u53E0\u4E0A\u53BB\uFF08\u300C\u97F3\u7684\u5F3A\u5EA6\u53EA\u80FD\u6709\u4E00\u79CD\u300D\uFF09\u3002\n//   \u8FDE\u8FC7\u6765\u7684\u97F3\uFF08tie\uFF09\u4E0D\u662F\u65B0\u7684\u97F3\u5934\uFF0C\u4E0D\u7B97\u3002\u6447\u6446\uFF08\u65F6\u503C\uFF09v0.9.36 \u8D77\u63A5\u4E86\uFF1AtimeMapOf\uFF08\u4E0B\u9762\uFF09\u628A\u5B83\u505A\u8FDB\u653E\u7684\u65F6\u5019\u7684\u65F6\u95F4\u8868\uFF0C\u4E09\u79CD\u6F14\u594F\u8005\u540C\u4E00\u4E2A\u626D\u66F2\uFF08song.ts swingDelta\uFF09\u3002\nimport { type Token, type NoteTok, type Song, type PaperSeg, type GrooveTok, type TempoMap, WHOLE, TPQ, ATTACKS, DEFAULT_TIME, DEFAULT_BPM, artOf, isTimed, paperTicks, tempoMapOf, tempoOwner } from \"./song.ts\";\nimport { expandPaper } from \"./repeats.ts\";\nimport { GROOVE_STYLES, type GrooveStyle } from \"./grooves.gen.ts\";\n\nexport { GROOVE_STYLES, type GrooveStyle };\nexport const grooveStyle = (id: string): GrooveStyle | null => GROOVE_STYLES.find((s) => s.id === id) ?? null;\n/** \u9884\u8BBE\u7684\u540D\u5B57\uFF08\"none\" = \u300C\u4E0D\u52A0\u8F7B\u91CD\u300D\uFF0C\u6BD4\u9884\u8BBE\u540D\u300C\u65E0\u300D\u597D\u61C2\uFF09\uFF1B\u4E0D\u8BA4\u8BC6\u7684\u9884\u8BBE\uFF08\u4EE5\u540E\u7684\u7248\u672C\u5199\u7684\uFF09= \u539F\u6837\u663E\u793A id\u3002 */\nexport const grooveName = (style: string): string => { const s = grooveStyle(style); return style === \"none\" ? \"\u4E0D\u52A0\u8F7B\u91CD\" : s ? s.name.zh : style; };\n/** \u9884\u8BBE\u7684\u82F1\u6587\u540D\uFF08\u8C31\u9762\u8BED\u8A00\uFF0C\u540C\u901F\u5EA6\u7684 Andante\uFF1Buser\u300C\u98CE\u683C\u540D\u7528\u82F1\u6587\u300D\uFF09\uFF1A\"none\" = none\uFF1B\u4E0D\u8BA4\u8BC6\u7684\u9884\u8BBE = \u539F\u6837 id\u3002 */\nexport const grooveNameEn = (style: string): string => { const s = grooveStyle(style); return style === \"none\" ? \"none\" : s ? s.name.en : style; };\n/** \u8C31\u4E0A / MusicXML \u91CC\u5199\u7684\u5B57\uFF1A\u300CStyle: Classical\u300D\uFF08\u5149\u5199\u540D\u5B57\u50CF\u8C1C\u8BED\uFF0Cuser\u300C\u5149\u8BF4\u4E00\u4E2A\u53E4\u5178\u6BD4\u8F83\u8C1C\u8BED\u4EBA\uFF0C\u8BF4\u98CE\u683C\uFF1A\u53E4\u5178\u300D\uFF1B\n *  \u8BED\u8A00\u5BF9\u9F50\u8BB0\u8C31\uFF1A\u62C9\u4E01\u4E0D\u7528\u4E8E\u6F14\u594F\u6307\u793A\uFF0C\u53E4\u5178\u4F20\u7EDF\u662F\u610F\u5927\u5229\u6587\u3001\u6D41\u884C / \u7235\u58EB\u8C31\u7684\u98CE\u683C\u5199\u82F1\u6587\u2014\u2014user\u300C\u98CE\u683C\u540D\u7528\u82F1\u6587\u300D\uFF09\u3002 */\nexport const grooveLabel = (t: Pick<GrooveTok, \"style\" | \"amount\" | \"shift\">): string =>\n  `Style: ${grooveNameEn(t.style)}${t.shift && grooveHasPhase(grooveStyle(t.style)) ? \" 2-3\" : \"\"}${t.amount !== undefined && t.amount !== 1 && t.style !== \"none\" ? ` \u00D7${t.amount}` : \"\"}`;\n/** \u8FD9\u4E2A\u98CE\u683C\u6709\u6CA1\u6709\u4E24\u5C0F\u8282\u4E00\u8F6E\u7684\u62CD\u53F7\uFF08\u514B\u62C9\u7EF4\uFF09\uFF1A\u6709 = \u83DC\u5355\u91CC\u7ED9\u300C3-2 / 2-3\u300D\uFF08\u9519\u5F00\u4E00\u5C0F\u8282\uFF09\u3002 */\nexport const grooveHasPhase = (s: GrooveStyle | null): boolean => !!s && Object.values(s.meters).some((m) => (m.bars ?? 1) > 1);\n/** \u4E00\u62CD\u62CD\u5206\u7EC4\uFF08\u540C classicalWeights\uFF09\uFF1A\u6BCF\u62CD\u51E0\u4E2A\u5341\u516D\u5206 + \u62CD\u91CC\u7B2C\u4E00\u5C42\u7EC6\u5206\u7684\u6B65\u957F\u3002 */\nfunction beatGroups(beats: number, beatType: number): { groups: number[]; sub: number } | null {\n  if (!Number.isInteger((beats * 16) / beatType)) return null;\n  if (beatType === 8 && beats > 3 && beats % 3 === 0) return { groups: Array(beats / 3).fill(6), sub: 2 };\n  if (beatType === 8 && beats > 3) { const n = Math.floor(beats / 2), g = Array(n).fill(4); if (beats % 2) g[n - 1] = 6; return { groups: g, sub: 2 }; }\n  const L = 16 / beatType; return { groups: Array(beats).fill(L), sub: L / 2 };\n}\nconst WORD = (w: number) => (w >= 0.95 ? \"\u6700\u91CD\" : w >= 0.7 ? \"\u5F88\u91CD\" : w >= 0.45 ? \"\u91CD\" : w > 0.05 ? \"\u7A0D\u91CD\" : w > -0.05 ? \"\u4E0D\u53D8\" : w > -0.35 ? \"\u7A0D\u8F7B\" : \"\u8F7B\");\nconst BEAT_NO = [\"\u4E00\", \"\u4E8C\", \"\u4E09\", \"\u56DB\", \"\u4E94\", \"\u516D\", \"\u4E03\", \"\u516B\", \"\u4E5D\", \"\u5341\", \"\u5341\u4E00\", \"\u5341\u4E8C\"];\n/** \u4EBA\u8BDD\u8BF4\u8FD9\u4E2A\u98CE\u683C\u5728\u8FD9\u4E2A\u62CD\u53F7\u4E0B\u600E\u4E48\u8F7B\u91CD\uFF08\u4ECE\u6570\u636E\u73B0\u7B97\uFF0C\u6570\u636E\u53D8\u4E86\u8BF4\u660E\u8DDF\u7740\u53D8\uFF09\uFF1A\u300C\u4E00\u62CD \u6700\u91CD \u00B7 \u4E8C\u62CD \u4E0D\u53D8 \u00B7 \u2026\uFF1B\u534A\u62CD \u7A0D\u8F7B\uFF1B\u66F4\u7EC6\u7684 \u8F7B\u300D\u3002 */\nexport function describeGroove(s: GrooveStyle, beats: number, beatType: number): string | null {\n  const tb = grooveTable(s, beats, beatType), bg = beatGroups(beats, beatType);\n  if (!tb || !bg) return null;\n  const starts: number[] = []; let at = 0; for (const g of bg.groups) { starts.push(at); at += g; }\n  if (tb.bars > 1) {   // \u4E24\u5C0F\u8282\u4E00\u8F6E\uFF08\u514B\u62C9\u7EF4\uFF09\uFF1A\u4E24\u5C0F\u8282\u5404\u8BF4\u4E00\u53E5\u62CD\u4E0A\u7684\u8F7B\u91CD\uFF0C\u518D\u8BF4\u54EA\u51E0\u4E2A\u683C\u5B50\u6700\u91CD\uFF08\u514B\u62C9\u7EF4\u7684\u51FB\u70B9\uFF09\n    const bar = (b: number) => starts.map((st, k) => `${BEAT_NO[k] ?? k + 1}\u62CD ${WORD(tb.weights[b * tb.grid + st])}`).join(\" \u00B7 \");\n    const hits = tb.weights.map((w, k) => (w >= 0.7 ? k : -1)).filter((k) => k >= 0).map((k) => `${Math.floor(k / tb.grid) + 1}-${(k % tb.grid) + 1}`);\n    return `\u4E24\u5C0F\u8282\u4E00\u8F6E\uFF1A\u7B2C\u4E00\u5C0F\u8282 ${bar(0)}\uFF1B\u7B2C\u4E8C\u5C0F\u8282 ${bar(1)}\uFF1B\u91CD\u7684\u683C\u5B50\uFF08\u5C0F\u8282-\u7B2C\u51E0\u4E2A\u5341\u516D\u5206\uFF09${hits.join(\" \")}`;\n  }\n  const beatsTxt = starts.map((st, k) => `${BEAT_NO[k] ?? k + 1}\u62CD ${WORD(tb.weights[st])}`).join(\" \u00B7 \");\n  const subs: number[] = [], finer: number[] = [];\n  starts.forEach((st, k) => { for (let q = 1; q < bg.groups[k]; q++) (bg.sub >= 1 && Number.isInteger(bg.sub) && q % bg.sub === 0 ? subs : finer).push(tb.weights[st + q]); });\n  const one = (xs: number[]) => { const ws = [...new Set(xs.map(WORD))]; return ws.length === 1 ? ws[0] : ws.join(\" / \"); };\n  const subName = bg.groups.some((g) => g === 6) ? \"\u62CD\u91CC\u7684\u516B\u5206\" : \"\u534A\u62CD\";\n  return `${beatsTxt}${subs.length ? `\uFF1B${subName} ${one(subs)}` : \"\"}${finer.length ? `\uFF1B\u66F4\u7EC6\u7684 ${one(finer)}` : \"\"}`;\n}\n\n/** \u6CA1\u5217\u7684\u62CD\u53F7\u6309\u53E4\u5178\u5C42\u7EA7\u63A8\uFF08\u4ED3\u9F20 meterFallback.rule = \"classical\" \u7684\u8BF4\u6CD5\uFF09\uFF1A\u5C0F\u8282\u7B2C\u4E00\u62CD 1\uFF1B\u56DB\u62CD\u7684\u7B2C\u4E09\u62CD 0.5\uFF1B\u5176\u4F59\u62CD 0\uFF1B\n *  \u62CD\u91CC\u7B2C\u4E00\u5C42\u7EC6\u5206 \u22120.25\u3001\u518D\u5F80\u4E0B \u22120.5\u3002\u590D\u62CD\u5B50\uFF086/8 9/8 12/8\uFF09\u4E00\u62CD = \u4E09\u4E2A\u516B\u5206\uFF0C\u6BCF\u4E2A\u516B\u5206\u662F\u7B2C\u4E00\u5C42\u7EC6\u5206\uFF1B\n *  x/8 \u4E0D\u662F 3 \u7684\u500D\u6570\uFF085/8 7/8\uFF09= \u52A0\u6CD5\u62CD\u5B50\uFF1A\u4E24\u4E2A\u516B\u5206\u4E00\u7EC4\u3001\u5355\u6570\u7684\u8BDD\u6700\u540E\u4E00\u7EC4\u4E09\u4E2A\uFF08\u8C31\u4E0A\u6CA1\u8BB0\u5206\u7EC4\uFF0C\u6309\u8FD9\u4E2A\u63A8\uFF1B\u9762\u677F\u91CC\u660E\u8BF4\uFF09\u3002\n *  \u4E00\u5C0F\u8282\u4E0D\u662F\u6574\u6570\u4E2A\u5341\u516D\u5206\uFF08\u5982 x/32\uFF09= null\uFF08\u4E0D\u52A0\uFF09\u3002 */\nexport function classicalWeights(beats: number, beatType: number): { grid: number; weights: number[] } | null {\n  const grid = (beats * 16) / beatType;\n  if (!Number.isInteger(grid) || grid <= 0) return null;\n  let groups: number[];   // \u6BCF\u62CD\u51E0\u4E2A\u5341\u516D\u5206\n  let sub: (len: number) => number;   // \u62CD\u91CC\u7B2C\u4E00\u5C42\u7EC6\u5206\u7684\u6B65\u957F\uFF08\u5341\u516D\u5206\u6570\uFF09\n  if (beatType === 8 && beats > 3 && beats % 3 === 0) { groups = Array(beats / 3).fill(6); sub = () => 2; }\n  else if (beatType === 8 && beats > 3) { const n = Math.floor(beats / 2); groups = Array(n).fill(4); if (beats % 2) groups[n - 1] = 6; sub = () => 2; }\n  else { const L = 16 / beatType; groups = Array(beats).fill(L); sub = (len) => len / 2; }\n  const weights: number[] = [];\n  groups.forEach((len, b) => {\n    const step = sub(len);\n    for (let p = 0; p < len; p++) weights.push(p === 0 ? (b === 0 ? 1 : groups.length === 4 && b === 2 ? 0.5 : 0) : step >= 1 && Number.isInteger(step) && p % step === 0 ? -0.25 : -0.5);\n  });\n  return { grid, weights };\n}\n/** \u8FD9\u4E2A\u98CE\u683C\u5728\u8FD9\u4E2A\u62CD\u53F7\u4E0B\u7684\u8868\uFF1A\u5217\u4E86\u7684\u7528\u5217\u7684\uFF1B\u6CA1\u5217 = \u6309 fallback\uFF08\u53E4\u5178\u5C42\u7EA7\u63A8 / \u4E0D\u52A0\uFF09\u3002 */\nexport function grooveTable(s: GrooveStyle, beats: number, beatType: number): { grid: number; weights: number[]; bars: number; derived: boolean } | null {\n  const m = s.meters[`${beats}/${beatType}`];\n  if (m) return { grid: m.grid, weights: m.weights, bars: m.bars ?? 1, derived: false };\n  const c = s.fallback === \"classical\" ? classicalWeights(beats, beatType) : null;\n  return c ? { ...c, bars: 1, derived: true } : null;\n}\n\n/** \u6BCF\u4E2A\u97F3\u5934\uFF08\u4E0D\u542B\u8FDE\u8FC7\u6765\u7684\u97F3\uFF09\u5728\u5C0F\u8282\u91CC\u7684\u4F4D\u7F6E\uFF08tick\uFF09+ \u90A3\u91CC\u7684\u62CD\u53F7\u3002bounds = \u7EB8\u754C\uFF08\u6BCF\u5F20\u7EB8\u5404\u81EA\u4ECE\u5934\u6570\uFF0C\u540C\u753B\u8C31\uFF09\u3002\u89C4\u5219\u540C engrave unitsOf\uFF1A\n *  \u4EBA\u63D2\u7684\u300C|\u300D/ \u62CD\u53F7\u53D8 = \u65B0\u7684\u4E00\u5C0F\u8282\uFF1B\u5199\u6EE1\u4E00\u5C0F\u8282 = \u81EA\u52A8\u5C0F\u8282\u7EBF\uFF1B\u6BCF\u5F20\u7EB8\u7684\u7B2C\u4E00\u5C0F\u8282\u8FD8\u6CA1\u5199\u6EE1\u5C31\u78B0\u5230\u300C|\u300D= \u5F31\u8D77\u2014\u2014\u4F4D\u7F6E\u6309\u5C0F\u8282\u5C3E\u5BF9\u9F50\uFF08\u5F31\u8D77\u7684\u90A3\u4E00\u62CD\u662F\u6700\u540E\u4E00\u62CD\uFF09\u3002 */\nexport function meterPositions(tokens: readonly Token[], bounds: readonly number[] = [0]): Map<number, { pos: number; beats: number; beatType: number; bar: number; pickup?: true }> {\n  // bar = \u8FD9\u5F20\u7EB8\u91CC\u7B2C\u51E0\u5C0F\u8282\uFF080 \u8D77\uFF1B\u6709\u5F31\u8D77\u65F6\u5F31\u8D77\u662F\u7B2C 0 \u5C0F\u8282\u3001\u7B2C\u4E00\u4E2A\u6574\u5C0F\u8282\u662F\u7B2C 1 \u5C0F\u8282\uFF09\uFF1Bpickup = \u5F31\u8D77\u7684\u97F3\u3002\u4E24\u5C0F\u8282\u4E00\u8F6E\u7684\u98CE\u683C\u6309 bar \u6570\u5355\u53CC\n  const out = new Map<number, { pos: number; beats: number; beatType: number; bar: number; pickup?: true }>(), starts = new Set(bounds);\n  let time = { ...DEFAULT_TIME }, len = (time.beats * WHOLE) / time.beatType, inBar = 0, measureNo = 0, first: number[] = [];\n  tokens.forEach((t, i) => {\n    if (starts.has(i)) { inBar = 0; measureNo = 0; first = []; }\n    if (t.kind === \"bar\") {\n      if (measureNo === 0 && inBar > 0 && inBar < len) for (const k of first) { const e = out.get(k)!; e.pos += len - inBar; e.pickup = true; }   // \u5F31\u8D77\n      inBar = 0; measureNo++; first = []; return;\n    }\n    if (t.kind === \"time\") { if (inBar > 0) { inBar = 0; measureNo++; } time = { beats: t.beats, beatType: t.beatType }; len = (t.beats * WHOLE) / t.beatType; return; }\n    if (!isTimed(t)) return;\n    while (inBar >= len && inBar > 0) { inBar -= len; measureNo++; }\n    if (t.kind === \"note\" && !t.tie) { out.set(i, { pos: inBar, ...time, bar: measureNo }); if (measureNo === 0) first.push(i); }\n    inBar += t.dur;\n  });\n  return out;\n}\n\n/** \u6574\u9996\uFF08\u7167\u653E\u7684\u987A\u5E8F\uFF09\u7684\u98CE\u683C\u8BB0\u53F7\uFF1A\u6BCF\u5F20\u7EB8\u5F00\u5934\u56DE\u5230\u300C\u4E0D\u52A0\u300D\uFF08\u98CE\u683C\u53EA\u7BA1\u5B83\u90A3\u5F20\u7EB8\uFF09\uFF1B\u7EB8\u91CC\u4EFB\u4F55\u4E00\u884C\u5199\u7684\u90FD\u7B97\uFF08\u6574\u5F20\u7EB8\u4E00\u8D77\u542C\uFF09\uFF0C\u540C\u4E00\u65F6\u523B\u4E24\u884C\u90FD\u5199\u4E86 = \u4E0A\u9762\u90A3\u884C\u3002\n *  tick = \u538B\u5E73\u540E\u4ECE\u5934\u6570\uFF08flattenPart \u628A\u6BCF\u5F20\u7EB8\u8865\u5230\u6700\u957F\u90A3\u6761\u7684\u957F\u5EA6\uFF0C\u6240\u4EE5\u7EB8\u7684\u8D77\u70B9 = \u524D\u9762\u5404\u5F20\u7EB8\u957F\u5EA6\u4E4B\u548C\uFF09\u3002 */\nexport type GrooveMap = { tick: number; style: string | null; amount: number; shift?: boolean }[];   // shift = \u9519\u5F00\u4E00\u5C0F\u8282\uFF082-3\uFF09\nexport function grooveMapOf(song: Song, order?: readonly string[]): GrooveMap {\n  const seq: PaperSeg[] = order ? order.flatMap((id) => song.papers.filter((p) => p.id === id)) : song.papers.filter((p) => !p.hidden);\n  const out: GrooveMap = [];\n  let at = 0;\n  for (const p0 of seq) {\n    const p = expandPaper(song, p0, () => -1);   // \u8C31\u5185\u53CD\u590D\uFF1A\u548C\u538B\u5E73\uFF08flattenPart\uFF09\u540C\u4E00\u4E2A\u5C55\u5F00\uFF0Ctick \u624D\u5BF9\u5F97\u4E0A\n    out.push({ tick: at, style: null, amount: 1 });\n    const here: { tick: number; style: string; amount: number; shift: boolean; row: number }[] = [];\n    song.parts.forEach((part, row) => {\n      let t = 0;\n      for (const tok of p.tracks[part.id] ?? []) { if (tok.kind === \"groove\") here.push({ tick: at + t, style: tok.style, amount: tok.amount ?? 1, shift: !!tok.shift, row }); else if (isTimed(tok)) t += tok.dur; }\n    });\n    here.sort((a, b) => a.tick - b.tick || b.row - a.row);   // \u540C\u4E00\u65F6\u523B\uFF1A\u4E0B\u9762\u7684\u5148\u3001\u4E0A\u9762\u7684\u540E\uFF08\u540E\u6765\u7684\u7B97\u6570\uFF09\n    for (const g of here) out.push({ tick: g.tick, style: g.style === \"none\" ? null : g.style, amount: g.amount, ...(g.shift ? { shift: true } : {}) });\n    at += paperTicks(p);\n  }\n  return out;\n}\n\n/** \u4E00\u4E2A\u58F0\u90E8\uFF08\u538B\u5E73\u3001\u7167\u540C\u4E00\u4E2A\u987A\u5E8F\uFF09\u6BCF\u4E2A\u97F3\u7684\u62CD\u5B50\u8F7B\u91CD\uFF08index \u2192 \u6743\u91CD \u00D7 \u5E45\u5EA6 \u00D7 \u8DDF\u591A\u5C11\uFF1B0 \u7684\u4E0D\u653E\uFF09\u3002follow = \u8FD9\u4F4D\u6F14\u594F\u8005\u5BF9\u8FD9\u4E2A\u98CE\u683C\u8DDF\u591A\u5C11\uFF080\u20131\uFF09\u3002 */\nexport function grooveWeights(tokens: readonly Token[], bounds: readonly number[], map: GrooveMap, follow: (s: GrooveStyle) => number): Map<number, number> {\n  const out = new Map<number, number>();\n  if (!map.some((g) => g.style)) return out;\n  const pos = meterPositions(tokens, bounds);\n  let tick = 0, k = -1, bar0: number | null = null;   // bar0 = \u8FD9\u4E2A\u98CE\u683C\u8BB0\u53F7\u4ECE\u7B2C\u51E0\u5C0F\u8282\u8D77\uFF08\u4E24\u5C0F\u8282\u4E00\u8F6E\u7684\u98CE\u683C\u6309\u5B83\u6570\u5355\u53CC\uFF09\n  tokens.forEach((t, i) => {\n    if (!isTimed(t)) return;\n    while (k + 1 < map.length && map[k + 1].tick <= tick) { k++; bar0 = null; }\n    const g = k >= 0 ? map[k] : null; tick += t.dur;\n    if (!g?.style || t.kind !== \"note\") return;\n    const p = pos.get(i), s = grooveStyle(g.style); if (!p || !s) return;\n    if (bar0 === null) bar0 = p.pickup ? p.bar + 1 : p.bar;   // \u8BB0\u53F7\u4E4B\u540E\u7B2C\u4E00\u4E2A\u97F3\u6240\u5728\u7684\u5C0F\u8282 = \u4E00\u8F6E\u7684\u7B2C\u4E00\u5C0F\u8282\uFF08\u662F\u5F31\u8D77 = \u4ECE\u4E0B\u4E00\u4E2A\u6574\u5C0F\u8282\u8D77\uFF0C\u5F31\u8D77\u7B97\u524D\u4E00\u8F6E\u7684\u7B2C\u4E8C\u5C0F\u8282\uFF09\n    if (artOf(t as NoteTok).some((a) => ATTACKS.includes(a))) return;   // \u5199\u4E86\u97F3\u5934\u8BB0\u53F7 = \u5199\u7684\u8BF4\u4E86\u7B97\n    const tb = grooveTable(s, p.beats, p.beatType); if (!tb) return;\n    const slot = (p.pos * tb.grid) / ((p.beats * WHOLE) / p.beatType), on = Math.abs(slot - Math.round(slot)) < 1e-6;\n    const half = tb.bars > 1 ? ((((p.bar - bar0 + (g.shift ? 1 : 0)) % tb.bars) + tb.bars) % tb.bars) : 0;   // \u4E24\u5C0F\u8282\u4E00\u8F6E\uFF1A\u8FD9\u662F\u4E00\u8F6E\u91CC\u7684\u7B2C\u51E0\u5C0F\u8282\uFF08\u9519\u5F00\u4E00\u5C0F\u8282 = 2-3\uFF09\n    const w = on ? tb.weights[half * tb.grid + (Math.round(slot) % tb.grid)] : Math.min(...tb.weights);   // \u4E0D\u5728\u5341\u516D\u5206\u683C\u5B50\u4E0A\uFF08\u4E09\u8FDE\u97F3\u91CC\u9762\u7684\uFF09= \u6700\u8F7B\u7684\u90A3\u4E00\u6863\n    const v = w * g.amount * follow(s);\n    if (v) out.set(i, v);\n  });\n  return out;\n}\n\n/** \u6F14\u594F\u8005\u5C5E\u4E8E\u54EA\u4E00\u7C7B\uFF08\u9884\u8BBE\u7684 follow \u952E\uFF09\uFF1A\u63D2\u4EF6\u81EA\u62A5 voice = \u4EBA\u58F0\u4E00\u6863\uFF1Bgm = GM \u5BB6\u65CF\uFF08bank 128 = \u9F13\u4EF6 percussion\uFF1B\u5176\u4F59\u6309 GM \u97F3\u8272\u53F7\u6BCF 8 \u4E2A\u4E00\u65CF\uFF09\uFF1B\u6CA1\u4EBA\u4E0A\u573A = null\uFF08\u4E0D\u8DDF\uFF09\u3002 */\nconst GM_FAMILIES = [\"piano\", \"chromatic-percussion\", \"organ\", \"guitar\", \"bass\", \"strings\", \"ensemble\", \"brass\", \"reed\", \"pipe\", \"synth-lead\", \"synth-pad\", \"synth-effects\", \"ethnic\", \"percussive\", \"sound-effects\"] as const;\nexport function grooveCategory(cat: \"voice\" | \"gm\" | null | undefined, gm?: { bank: number; program: number } | null): string | null {\n  if (cat === \"voice\") return \"voice\";\n  if (cat === \"gm\" && gm) return gm.bank === 128 ? \"percussion\" : GM_FAMILIES[Math.max(0, Math.min(127, gm.program)) >> 3];\n  return null;\n}\n/** \u7C7B\u522B\u91CC\u9884\u8BBE\u6CA1\u5199\u7684 = 0\uFF08\u4E0D\u8DDF\uFF09\u3002 */\nexport const followOf = (s: GrooveStyle, category: string | null): number => (category ? s.follow[category] ?? 0 : 0);\n\n// \u2500\u2500 \u6447\u6446\uFF08v0.9.36\uFF0C2026-10-10 Opus 5.5\uFF1Buser\u300C\u5168\u91CF\u6447\u6446\u540C\u610F\uFF0C\u653E\u5728\u4E00\u53F7\u8F68\uFF1F\u300D\u2192 \u662F\uFF1A\u8DDF\u7740\u98CE\u683C\u8BB0\u53F7\u8D70\uFF08\u98CE\u683C\u8BB0\u53F7\u5199\u5728\u6BCF\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4F4D\u8EAB\u4E0A\u3001\u7BA1\u6574\u5F20\u7EB8\uFF09 \u2500\u2500\n/** \u6447\u591A\u5C11\uFF1A\u98CE\u683C\u6570\u636E\u7684 swing.ratio\uFF08\u4E00\u62CD\u91CC\u524D\u4E00\u4E2A\u516B\u5206\u5360\u591A\u5C11\uFF1B\u4ED3\u9F20 grooves\uFF0CSwing = 0.667\u3001\u8303\u56F4 0.5\u20130.75\uFF09\uFF0C\u5E45\u5EA6\u653E\u5927 / \u7F29\u5C0F\u300C\u6BD4\u76F4\u7684\u591A\u51FA\u6765\u7684\u90A3\u4E00\u622A\u300D\uFF0C\n *  \u5939\u5728\u6570\u636E\u7ED9\u7684\u8303\u56F4\u91CC\uFF1B\u8FD9\u4E2A\u98CE\u683C\u4E0D\u6447 = 0\u3002 */\nexport function swingRatio(style: string | null, amount = 1): number {\n  const w = style ? grooveStyle(style)?.swing : null; if (!w) return 0;\n  return Math.min(w.range[1], Math.max(w.range[0], 0.5 + (w.ratio - 0.5) * amount));\n}\n/** \u653E\u7684\u65F6\u5019\u7528\u7684\u65F6\u95F4\u8868 = \u901F\u5EA6\u8868\uFF08tempoMapOf\uFF09+ \u6447\u6446\uFF1A\u98CE\u683C\u8BB0\u53F7\u5E26\u6447\u6446\u7684\u90A3\u4E00\u6BB5\uFF0C**\u6574\u5F20\u7EB8\u6240\u6709\u6B4C\u624B\u4E00\u8D77\u6447**\uFF08\u65F6\u95F4\u4E0D\u5206\u8C01\u8DDF\u591A\u5C11\uFF0C\u4E0D\u7136\u5BF9\u4E0D\u4E0A\u62CD\uFF1B\u8DDF\u591A\u5C11\u53EA\u7BA1\u8F7B\u91CD\uFF09\u3002\n *  \u62CD\u7684\u7F51\u683C\u4ECE\u7EB8\u5934\u8D77\u6570\uFF1B\u7EB8\u7684\u7B2C\u4E00\u5C0F\u8282\u662F\u5F31\u8D77\uFF08\u8FD8\u6CA1\u5199\u6EE1\u5C31\u78B0\u5230\u300C|\u300D\uFF09= \u7F51\u683C\u5BF9\u9F50\u5230\u90A3\u6761\u5C0F\u8282\u7EBF\uFF08\u5F31\u8D77\u7684\u90A3\u4E2A\u516B\u5206\u662F\u540E\u534A\u62CD\uFF09\u3002\n *  \u6574\u9996\u6CA1\u6709\u54EA\u4E00\u6BB5\u6447 = \u539F\u6837\u8FD4\u56DE\u901F\u5EA6\u8868\uFF08\u65E7\u6B4C\u9010\u6837\u672C\u4E0D\u53D8\uFF09\u3002 */\nexport function timeMapOf(song: Song, order?: readonly string[]): TempoMap {\n  const tempo = tempoMapOf(song, order), g = grooveMapOf(song, order);\n  if (!g.some((e) => swingRatio(e.style, e.amount))) return tempo;\n  const seq: PaperSeg[] = order ? order.flatMap((id) => song.papers.filter((p) => p.id === id)) : song.papers.filter((p) => !p.hidden);   // \u540C grooveMapOf\n  const spans: { at: number; end: number; origin: number }[] = []; let at = 0;\n  for (const p0 of seq) {\n    const p = expandPaper(song, p0, () => -1), len = paperTicks(p), owner = tempoOwner(song, p), toks = owner ? p.tracks[owner] ?? [] : [];\n    let t = 0, b1 = -1, measure = (DEFAULT_TIME.beats * WHOLE) / DEFAULT_TIME.beatType;\n    for (const tok of toks) {\n      if (tok.kind === \"time\" && t === 0) measure = (tok.beats * WHOLE) / tok.beatType;\n      if (tok.kind === \"bar\") { b1 = t; break; }\n      if (isTimed(tok)) { t += tok.dur; if (t >= measure) break; }\n    }\n    spans.push({ at, end: at + len, origin: at + (b1 > 0 && b1 < measure ? b1 % TPQ : 0) }); at += len;\n  }\n  const originAt = (tick: number) => (spans.find((s) => tick >= s.at && tick < s.end) ?? spans[spans.length - 1])?.origin ?? 0;\n  const bpmAt = (tick: number) => { let b = tempo[0]?.bpm ?? DEFAULT_BPM; for (const e of tempo) if (e.tick <= tick) b = e.bpm; return b; };\n  const out: TempoMap = [...tempo, ...g.map((e) => ({ tick: e.tick, bpm: bpmAt(e.tick), swing: swingRatio(e.style, e.amount), origin: originAt(e.tick) }))];\n  return out.sort((a, b) => a.tick - b.tick || (a.swing === undefined ? 0 : 1) - (b.swing === undefined ? 0 : 1));   // \u540C\u4E00\u65F6\u523B\uFF1A\u901F\u5EA6\u5148\u3001\u6447\u6446\u540E\n}\n", "// commands.ts \u2014\u2014 \u952E\u76D8 / pad / \u6309\u94AE\u6761\u53D1\u6765\u7684\u547D\u4EE4 \u2192 \u7F16\u8F91\u5668\u72B6\u6001\u3002created 2026-10-06 by Claude Opus 5.5\uFF1B2026-10-07 UX-2 \u6539\n// \u952E\u76D8\u600E\u4E48\u53D8\u6210\u547D\u4EE4 = src/keyboard/keys.ts\uFF08\u4E00\u5F20\u8868\uFF09\uFF1B\u8FD9\u91CC\u53EA\u7BA1\u547D\u4EE4\u505A\u4EC0\u4E48\u3002\nimport type { Dir } from \"./pitch.ts\";\nimport { type EditorState, type Art, type Dyn, setDynSel, dynMarkSel, toggleSlurBefore, toggleHairpin, toggleSwell, symBackspace, writeDegree, writeRest, writeBar, writePhrase, shorter, longer, setTuplet, extend, tapAcc, octaveTarget, stepTarget, alterTarget, moveCaret, extendSelection, setCaret, escape, backspace, deleteForward, transposeSel, respellSel, modulateSel, selectToEdge, tr, toggleStaff, toggleArtBefore, toggleInhaleBefore, setSelDur, scaleSelDur } from \"./song.ts\";\n\nexport type Command =\n  | { k: \"degree\"; degree: number; dir: Dir; /** \u5355\u58F0\u4E50\u5668\u7684\u58F0\u90E8\uFF1A\u6539\u4E00\u4E2A\u97F3\u65F6\u6362\u97F3\u9AD8\u3001\u4E0D\u53E0\uFF08v0.10.5\uFF09\u3002 */ mono?: boolean }\n  | { k: \"rest\" } | { k: \"bar\" } | { k: \"phrase\" } | { k: \"art\"; a: Art } | { k: \"inhale\"; v: \"soft\" | \"big\" } | { k: \"slur\" } | { k: \"wedge\"; w: \"cresc\" | \"dim\" } | { k: \"dyn\"; v: Dyn; ramp?: boolean } | { k: \"swell\"; w: \"<\" | \">\" | \"<>\" }   // art = \u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\uFF09\u5207\u6F14\u594F\u6CD5\uFF08pad \u7B26\u53F7\u5C42\uFF1B\u524D\u9762\u4E0D\u662F\u97F3 = \u539F\u6837\uFF09\n  | { k: \"shorter\" } | { k: \"longer\" } | { k: \"tuplet\" } | { k: \"extend\"; half?: boolean }   // half = pad \u7684\u300C/2\u300D\u5F00\u7740\uFF1A\u62C9\u957F\u534A\u4EFD\uFF08= \u9644\u70B9\uFF09\n  | { k: \"acc\"; acc: 1 | -1 }\n  | { k: \"octave\"; d: number } | { k: \"step\"; d: number } | { k: \"alter\"; d: number }\n  | { k: \"caret\"; d: number } | { k: \"selext\"; d: number } | { k: \"home\" } | { k: \"end\" } | { k: \"escape\" }\n  | { k: \"backspace\" } | { k: \"delete\" } | { k: \"symBackspace\" }\n  | { k: \"transpose\"; semis: number } | { k: \"respell\" } | { k: \"seldur\" } | { k: \"selscale\"; f: 0.5 | 2 } | { k: \"modulate\"; fifths: number } | { k: \"seledge\"; d: -1 | 1 }\n  | { k: \"staff\" };   // \u5927\u8C31\u8868\uFF1A\u8FD9\u4E2A\u97F3\u6362\u5230\u53E6\u4E00\u5F20\u8C31\u8868\n\n/** \u5E94\u7528\u4E00\u6761\u7F16\u8F91\u547D\u4EE4\u3002now = \u5224 Shift \u8FDE\u70B9\u7528\u7684\u65F6\u523B\uFF08ms\uFF09\u3002 */\nexport function apply(st: EditorState, c: Command, now = Date.now()): EditorState {\n  switch (c.k) {\n    case \"degree\": return writeDegree(st, c.degree, c.dir, !!c.mono);\n    case \"rest\": return writeRest(st);\n    case \"bar\": return writeBar(st);\n    case \"phrase\": return writePhrase(st);\n    case \"art\": return toggleArtBefore(st, c.a) ?? st;\n    case \"inhale\": return toggleInhaleBefore(st, c.v) ?? st;\n    case \"slur\": return toggleSlurBefore(st) ?? st;\n    case \"swell\": return toggleSwell(st, c.w) ?? st;   // \u97F3\u5185\u7684\u8D77\u4F0F\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\uFF09\n    case \"wedge\": return toggleHairpin(st, c.w);   // \u6E10\u5F3A / \u6E10\u5F31\u8BB0\u53F7\uFF1A\u5149\u6807\u5904\uFF08\u6709\u9009\u533A = \u9009\u533A\u5F00\u5934\uFF09\u653E\u4E00\u4E2A\uFF0C\u4ECE\u8FD9\u513F\u53D8\u5230\u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\n    case \"dyn\": return c.ramp ? setDynSel(st, c.v, true) : setDynSel(st, dynMarkSel(st) === c.v ? null : c.v);   // \u6E10\u5230 = \u653E / \u6539\u6210\u8FD9\u4E2A\u529B\u5EA6\u5E76\u4E14\u4ECE\u4E0A\u4E00\u4E2A\u6E10\u53D8\u8FC7\u6765\uFF08\u4E0D\u5F53\u300C\u518D\u6309\u4E00\u6B21\u53BB\u6389\u300D\uFF09   // \u529B\u5EA6\uFF1A\u5149\u6807\u5904\uFF08\u6709\u9009\u533A = \u9009\u533A\u5F00\u5934\uFF09\u653E\u8FD9\u4E2A\u8BB0\u53F7\uFF0C\u7BA1\u5230\u4E0B\u4E00\u4E2A\uFF1B\u90A3\u513F\u5DF2\u7ECF\u662F\u5B83 = \u53BB\u6389   // \u5149\u6807\u524D\u90A3\u4E2A\u97F3\u8FDE\u5230\u4E0B\u4E00\u4E2A\uFF08\u6709\u9009\u533A = \u9009\u533A\u90A3\u6837\uFF09\n    case \"shorter\": return shorter(st);\n    case \"longer\": return longer(st);\n    case \"tuplet\": return setTuplet(st, st.input.tuplet ? 0 : 3);\n    case \"extend\": return extend(st, !!c.half);\n    case \"acc\": return tapAcc(st, c.acc, now);\n    case \"octave\": return octaveTarget(st, c.d);\n    case \"step\": return stepTarget(st, c.d);\n    case \"alter\": return alterTarget(st, c.d);\n    case \"caret\": return moveCaret(st, c.d);\n    case \"selext\": return extendSelection(st, c.d);\n    case \"home\": return setCaret(st, 0);   // setCaret \u81EA\u5DF1\u5939\u5230\u8C31\u5934\u540E\u9762\n    case \"end\": return setCaret(st, tr(st).length);\n    case \"staff\": return toggleStaff(st, 2);\n    case \"escape\": return escape(st);\n    case \"backspace\": return backspace(st);\n    case \"symBackspace\": return symBackspace(st);   // \u7B26\u53F7\u6A21\u5F0F\uFF1A\u53EA\u5220\u8BB0\u53F7\uFF0C\u6CA1\u6709\u5C31\u5F80\u56DE\u9000\u4E00\u6B65\n    case \"delete\": return deleteForward(st);\n    case \"transpose\": return transposeSel(st, c.semis);\n    case \"respell\": return respellSel(st);\n    case \"seldur\": return setSelDur(st, st.input.unit);   // \u9009\u533A\u83DC\u5355\u300C\u90FD\u6539\u6210 \u266A\u300D= \u957F\u77ED\u65CB\u94AE\u73B0\u5728\u90A3\u4E00\u6863\n    case \"selscale\": return scaleSelDur(st, c.f);          // \u9009\u533A\u83DC\u5355\u300C\u00F72 / \u00D72\u300D\n    case \"modulate\": return modulateSel(st, c.fifths);\n    case \"seledge\": return selectToEdge(st, c.d);\n  }\n}\n", "// keys.ts \u2014\u2014 \u952E\u76D8\u6620\u5C04\uFF1A\u4E00\u5F20\u8868 = \u552F\u4E00\u771F\u7406\u6E90\u3002\u6309\u952E\u5206\u53D1\uFF08route\uFF09\u3001\u6587\u6863 docs/keys.md\uFF08renderKeysDoc \u2192 scripts/gen-keys-doc.mjs\uFF09\u3001\n// pad \u6309\u94AE\u63D0\u793A\u91CC\u7684\u952E\u540D\uFF08hint\uFF09\u90FD\u8BFB\u5B83\u3002\u52A0 / \u6539\u5FEB\u6377\u952E\u53EA\u6539 BINDINGS \u8FD9\u4E00\u5F20\u8868\u3002created 2026-10-07 by Claude Opus 5.5\n// user\u300C\u952E\u76D8\u6620\u5C04\u53C2\u8003weebpaint\u505A\u4E00\u4E0B\u6DF1\u6A21\u5757\u4EE5\u540Ereadme\u53EF\u4EE5\u81EA\u52A8\u751F\u6210\uFF0C\u60F3\u4E00\u4E0B\u5982\u4F55\u5BF9\u4E0D\u540C\u6A21\u5F0F\u8FDB\u884C\u8DEF\u7531\u300D\n//   \u53C2\u8003 = WeebPaint src/input.ts \u7684 KEYBOARD_SHORTCUTS\uFF08\u4E00\u5F20\u8868 + when \u5B88\u536B + \u83DC\u5355\u9762\u677F / \u6587\u6863\u4ECE\u8868\u751F\u6210\uFF09\u3002\n//   \u548C\u5B83\u7684\u5DEE\u522B\uFF1A\u6587\u6863\u751F\u6210\u76F4\u63A5 import \u8FD9\u5F20\u8868\uFF08\u4E0D\u9760\u6B63\u5219\u62BD\u6E90\u7801\u6587\u672C\uFF09\uFF1B\u6A21\u5F0F\u4E0D\u5199\u6210 when \u51FD\u6570\uFF0C\u800C\u662F\u8868\u91CC\u7684\u4E00\u5217\u4E00\u5217\u3002\n//\n// \u8DEF\u7531 = \u300C\u73B0\u5728\u952E\u76D8\u5F52\u8C01\u300D\uFF08Where\uFF0C\u5BBF\u4E3B\u6309\u8C01\u5728\u6700\u4E0A\u9762\u7B97\u597D\u4F20\u8FDB\u6765\uFF09\uFF1A\n//   \u5BFC\u51FA\u9762\u677F sheet > \u8BB0\u53F7\u6846 mark > \u6B4C\u8BCD\u6846 lyric > \u8C31\u9762\uFF1B\u8C31\u9762\u518D\u5206 \u5199 write\uFF08\u5149\u6807\uFF09/ \u6539 edit\uFF08\u9009\u4E2D\uFF09/ \u5F39 impro\uFF08\u5373\u5174\u5F00\u5173\u5F00\u7740\uFF09\u3002\n//   \u540C\u4E00\u4E2A\u952E\u5728\u4E0D\u540C\u6A21\u5F0F\u4E0B\u505A\u4E0D\u540C\u7684\u4E8B = \u540C\u4E00\u884C\u91CC\u4E0D\u540C\u7684\u5217\uFF08does[where]\uFF09\uFF1B\u6CA1\u5199\u7684\u5217 = \u8FD9\u4E2A\u952E\u5728\u90A3\u91CC\u4E0D\u7BA1\uFF08\u6587\u672C\u6846\u91CC\u5C31\u7167\u5E38\u6253\u5B57\uFF09\u3002\n//   \u300C\u5F39\u300D\u53EA\u6539\u53D8\u97F3\u7B26\u952E\uFF08\u53EA\u5531\u4E0D\u5199\uFF0Cuser\u300C\u5373\u5174\u505A\u6210 pad \u4E0A\u7684\u4E00\u4E2A\u5F00\u5173\uFF08\u6309\u4F4F\u65F6\u53EA\u5531\u4E0D\u5199\uFF09\u300D\uFF09\uFF1A\u5F39\u7684\u90A3\u4E00\u5217\u6CA1\u5199\u7684\u952E\uFF0C\u7167\u5199 / \u6539\u8D70\u3002\n// \u53EA\u8BA4\u7269\u7406\u952E\u4F4D\uFF08KeyboardEvent.code\uFF09\uFF0C\u4E0D\u8BA4\u6253\u51FA\u6765\u7684\u5B57\uFF08\u6362\u8F93\u5165\u6CD5 / \u952E\u76D8\u5E03\u5C40\u4E0D\u4E71\uFF09\uFF1BCtrl / Cmd \u7EC4\u5408\u53EA\u63A5\u8868\u91CC\u6807\u4E86 mod \u7684\uFF08\u5B58 / \u5BFC\u51FA / \u6253\u5F00\uFF0C2026-10-07 \u65E0\u5730\u9003\u751F\u53E3\uFF09\uFF0C\n//   \u5176\u4F59\u4E00\u5F8B\u4E0D\u63A5\uFF08\u6D4F\u89C8\u5668\u7684\uFF0CCtrl+1\u20138 \u662F\u5207\u6807\u7B7E\u9875\uFF09\uFF1B\n// \u8F93\u5165\u6CD5\u6B63\u5728\u62FC\uFF08isComposing\uFF09\u7684\u65F6\u5019\u4E00\u5F8B\u4E0D\u63A5\uFF08\u62FC\u97F3\u3001\u5047\u540D\u8F93\u5165\u6CD5\u4E0D\u88AB\u6253\u65AD\uFF09\u3002\n\nimport type { Command } from \"../score/commands.ts\";\nimport type { Dir } from \"../score/pitch.ts\";\n\nexport type Mode = \"write\" | \"edit\" | \"impro\";\nexport type Where = Mode | \"lyric\" | \"mark\" | \"sheet\";\n\n/** \u4E00\u4E2A\u6309\u952E\uFF1A\u7269\u7406\u952E\u4F4D + Shift / Alt / mod\uFF08Windows\u00B7Linux \u7684 Ctrl \u6216 Mac \u7684 \u2318\uFF09\uFF08\u5FC5\u987B\u5B8C\u5168\u4E00\u81F4\uFF09\u3002 */\nexport interface Chord { code: string; shift?: boolean; alt?: boolean; mod?: boolean }\n\n/** \u8DEF\u7531\u7684\u7ED3\u679C\uFF1A\u5BBF\u4E3B\u7167\u7740\u505A\u3002 */\nexport type Action =\n  | { k: \"cmd\"; cmd: Command }                      // \u7F16\u8F91\u547D\u4EE4\uFF08score/commands.ts apply\uFF09\n  | { k: \"audition\"; degree: number; dir: Dir }     // \u5F39\uFF1A\u53EA\u5531\u8FD9\u4E00\u7EA7\uFF0C\u4E0D\u5199\n  | { k: \"stack\"; degree: number }                  // Shift+1\u20137\uFF1A\u8FD9\u4E00\u7EA7\u53E0\u5230\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u4E0A\uFF08\u548C\u5F26\uFF1B\u5BBF\u4E3B\u7BA1\u5355\u58F0\u62A4\u680F\uFF09\n  | { k: \"play\" } | { k: \"impro\" }\n  | { k: \"file\"; a: \"open\" | \"save\" | \"export\" }   // \u65E0\u5730\u9003\u751F\u53E3\uFF08\u6253\u5F00 / \u5B58 .mxl / \u5BFC\u51FA hub\uFF1B\u53E6\u5B58\u4E3A\u4F4F\u5BFC\u51FA\u91CC\uFF0Cuser 2026-08-20\u300C\u53E6\u5B58\u4E3A\u4E5F\u53D8\u6210\u5BFC\u51FA\u300D\uFF09\n  | { k: \"clip\"; a: \"copy\" | \"cut\" | \"paste\" | \"all\" }   // \u9009\u533A\u6761\u7684\u952E\u76D8\u5165\u53E3\uFF082026-10-08\uFF1Buser\u300C\u5FEB\u6377\u952E\u5176\u5B9E\u73B0\u5728\u6211\u90FD\u6CA1\u7528\u8FC7\u300D\uFF0C\u89E6\u5C4F\u4F18\u5148\uFF09\n  | { k: \"undo\" } | { k: \"redo\" }\n  | { k: \"lyric\"; a: \"commit\" | \"cancel\" | \"next\" | \"prev\" | \"hyphen\" | \"back\" }\n  | { k: \"mark\"; a: \"commit\" | \"cancel\" }\n  | { k: \"sheet\"; a: \"close\" };\n\nexport interface Binding {\n  id: string;\n  keys: Chord[];\n  show?: string;                                     // \u6587\u6863\u91CC\u952E\u4F4D\u7684\u5199\u6CD5\uFF08\u4E0D\u5199 = \u7531 keys \u62FC\uFF09\n  group: string;                                     // \u6587\u6863\u5206\u7EC4\n  does: Partial<Record<Where, string>>;              // \u6BCF\u4E2A\u573A\u5408 / \u6A21\u5F0F\u4E0B\u505A\u4EC0\u4E48\uFF08\u6587\u6863\u7684\u683C\u5B50\uFF09\uFF1B\u6CA1\u5199 = \u4E0D\u7BA1\n  act: (i: number, where: Where) => Action;          // i = \u547D\u4E2D\u7684\u662F keys \u91CC\u7B2C\u51E0\u4E2A\n  sound?: boolean;                                   // \u6309\u4F4F\u54CD\u3001\u677E\u5F00\u505C\uFF08keyup \u8981\u505C\u58F0\uFF09\n}\n\nconst range = (codes: string[], m: Omit<Chord, \"code\"> = {}) => codes.map((code) => ({ code, ...m }));\nconst DIGITS = [\"Digit1\", \"Digit2\", \"Digit3\", \"Digit4\", \"Digit5\", \"Digit6\", \"Digit7\"];\nconst NUMPAD = [\"Numpad1\", \"Numpad2\", \"Numpad3\", \"Numpad4\", \"Numpad5\", \"Numpad6\", \"Numpad7\"];\nconst DOWN_ROW = [\"KeyQ\", \"KeyW\", \"KeyE\", \"KeyR\", \"KeyT\", \"KeyY\", \"KeyU\"];\nconst cmd = (c: Command) => (): Action => ({ k: \"cmd\", cmd: c });\n/** \u97F3\u7B26\u952E\uFF1A\u5199 / \u6539 = \u7F16\u8F91\u547D\u4EE4\uFF1B\u5F39 = \u53EA\u5531\u3002 */\nconst degree = (dir: Dir) => (i: number, where: Where): Action =>\n  where === \"impro\" ? { k: \"audition\", degree: (i % 7) + 1, dir } : { k: \"cmd\", cmd: { k: \"degree\", degree: (i % 7) + 1, dir } };\n\n// grill \u8D26\u672C Q/UX-1/UX-2 \u7684\u952E\u4F4D\uFF1Buser \u539F\u8BDD\u5728\u8D26\u672C\u91CC\uFF081\u20137 \u5C31\u8FD1\u3001Shift \u5F80\u4E0A\u3001QWERTYU \u5F80\u4E0B\u300C\u8D5E\u300D\u30010 \u4F11\u6B62\u30018 / 9 \u8BFA\u57FA\u4E9A\u77ED\u957F\u3001- \u7B80\u8C31\u6A2A\u7EBF\u2026\u2026\uFF09\nexport const BINDINGS: Binding[] = [\n  // \u2500\u2500 \u5199\u97F3 \u2500\u2500\n  { id: \"degree.near\", group: \"\u5199\u97F3\", keys: [...range(DIGITS), ...range(NUMPAD)], show: \"1\u20137\uFF08\u5C0F\u952E\u76D8\u4E5F\u884C\uFF09\", sound: true, act: degree(\"near\"),\n    does: { write: \"\u5199\u4E00\u4E2A\u97F3\uFF1A\u8C03\u91CC\u7B2C\u51E0\u7EA7\uFF0C\u843D\u5728\u79BB\u4E0A\u4E00\u4E2A\u97F3\u6700\u8FD1\u5904\", edit: \"\u628A\u9009\u4E2D\u7684\u7B2C\u4E00\u4E2A\u97F3\u6539\u6210\u8FD9\u4E00\u7EA7\uFF0C\u9009\u4E2D\u8DF3\u5230\u4E0B\u4E00\u4E2A\u97F3\", impro: \"\u53EA\u5531\u4E0D\u5199\" } },\n  // Shift = \u53E0\uFF082026-10-10 user\u300Cshift\u65E7\u7684\u529F\u80FD\u4E0D\u8981\uFF0Cshift\u7528\u6765\u53E0\u97F3\u8F93\u5165\u548C\u5F26\uFF0C\u4EE5\u53CApc\u4E0A\u9762\u53E0\u529F\u80FD\u627E\u4E0D\u5230\u4E86\u300D\uFF09\uFF1A\u539F\u6765 Shift+1\u20137 = \u5F80\u4E0A\u627E\uFF0C\u64A4\u4E86\uFF08\u5F80\u4E0B\u627E\u7684 QWERTYU \u7559\u7740\uFF09\n  { id: \"stack\", group: \"\u5199\u97F3\", keys: range(DIGITS, { shift: true }), show: \"Shift+1\u20137\", act: (i, where) => (where === \"impro\" ? { k: \"audition\", degree: (i % 7) + 1, dir: \"near\" } : { k: \"stack\", degree: (i % 7) + 1 }),\n    does: { write: \"\u53E0\uFF1A\u8FD9\u4E00\u7EA7\u53E0\u5230\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u4E0A\uFF08\u548C\u5F26\uFF0C\u843D\u5728\u79BB\u5B83\u73B0\u6709\u7684\u97F3\u6700\u8FD1\u5904\uFF1B\u5DF2\u7ECF\u6709 = \u53BB\u6389\uFF09\u3002\u540C pad\u300C\u53E0\u300D\", edit: \"\u53E0\u5230\u521A\u5199\u7684\u90A3\u4E2A / \u9009\u533A\u7B2C\u4E00\u4E2A\u97F3\u4E0A\", impro: \"\u53EA\u5531\u4E0D\u5199\" } },\n  { id: \"degree.down\", group: \"\u5199\u97F3\", keys: range(DOWN_ROW), show: \"Q W E R T Y U\", sound: true, act: degree(\"down\"),\n    does: { write: \"\u540C\u4E0A\uFF0C\u5F80\u4E0B\u627E\uFF08\u6570\u5B57\u6B63\u4E0B\u65B9\u90A3\u4E00\u6392\uFF09\", edit: \"\u540C\u4E0A\uFF0C\u5F80\u4E0B\u627E\", impro: \"\u53EA\u5531\u4E0D\u5199\uFF08\u5F80\u4E0B\u627E\uFF09\" } },\n  { id: \"rest\", group: \"\u5199\u97F3\", keys: [{ code: \"Digit0\" }, { code: \"Numpad0\" }], act: cmd({ k: \"rest\" }),\n    does: { write: \"\u4F11\u6B62\", edit: \"\u9009\u533A\u91CC\u5199\u4E00\u4E2A\u4F11\u6B62\uFF08\u66FF\u6362\u6A21\u5F0F\uFF1A\u6309\u957F\u77ED\u6863\u5403\u6389\u9009\u533A\u91CC\u7684\u97F3\uFF0C\u4E0D\u5199\u51FA\u9009\u533A\uFF09\" } },\n  { id: \"bar\", group: \"\u5199\u97F3\", keys: [{ code: \"Enter\" }, { code: \"NumpadEnter\" }, { code: \"Backslash\", shift: true }], show: \"Enter / |\", act: cmd({ k: \"bar\" }),\n    does: { write: \"\u5C0F\u8282\u7EBF\", edit: \"\u5728\u9009\u4E2D\u540E\u9762\u63D2\u5C0F\u8282\u7EBF\" } },\n  { id: \"phrase\", group: \"\u5199\u97F3\", keys: [{ code: \"Enter\", shift: true }, { code: \"NumpadEnter\", shift: true }], show: \"Shift+Enter\", act: cmd({ k: \"phrase\" }),\n    does: { write: \"\u53E5\u53F7\uFF08\u8FD9\u4E00\u53E5\u5230\u8FD9\u513F\uFF1A\u300C\u5408\u300D\u632A\u5B57\u7684\u8FB9\u754C\uFF1B\u6CA1\u6709\u8BED\u4E49\uFF1A\u4E0D\u6362\u6C14\u3001\u4E0D\u6362\u884C\u3001\u4E0D\u662F\u5C0F\u8282\u7EBF\uFF09\", edit: \"\u5728\u9009\u4E2D\u540E\u9762\u63D2\u53E5\u53F7\" } },\n  // \u2500\u2500 \u65F6\u503C \u2500\u2500\n  { id: \"shorter\", group: \"\u65F6\u503C\", keys: [{ code: \"Digit8\" }, { code: \"Numpad8\" }], act: cmd({ k: \"shorter\" }),\n    does: { write: \"\u77ED\uFF1A\u4E0B\u4E00\u4E2A\u97F3\u7684\u65F6\u503C\u51CF\u534A\uFF08\u5230\u4E09\u5341\u4E8C\u5206\u4E3A\u6B62\uFF09\", edit: \"\u77ED\uFF1A\u63A5\u4E0B\u6765\u5199\u7684\u51CF\u534A\uFF08\u9009\u533A\u91CC\u5199 = \u6309\u8FD9\u4E00\u6863\u66FF\u6362\uFF1B\u6574\u7EC4\u6539\u65F6\u503C\u8D70\u9009\u533A\u83DC\u5355\uFF09\" } },\n  { id: \"longer\", group: \"\u65F6\u503C\", keys: [{ code: \"Digit9\" }, { code: \"Numpad9\" }], act: cmd({ k: \"longer\" }),\n    does: { write: \"\u957F\uFF1A\u4E0B\u4E00\u4E2A\u97F3\u7684\u65F6\u503C\u52A0\u500D\uFF08\u5230\u5168\u97F3\u7B26\u4E3A\u6B62\uFF09\", edit: \"\u957F\uFF1A\u63A5\u4E0B\u6765\u5199\u7684\u52A0\u500D\uFF08\u9009\u533A\u91CC\u5199 = \u6309\u8FD9\u4E00\u6863\u66FF\u6362\uFF1B\u6574\u7EC4\u6539\u65F6\u503C\u8D70\u9009\u533A\u83DC\u5355\uFF09\" } },\n  { id: \"tuplet\", group: \"\u65F6\u503C\", keys: [{ code: \"Digit8\", shift: true }], act: cmd({ k: \"tuplet\" }),\n    does: { write: \"\u4E09\u8FDE\u97F3\u5F00 / \u5173\uFF08\u4E0B\u4E00\u4E2A\u97F3\u8D77\uFF09\", edit: \"\u4E09\u8FDE\u97F3\u5F00 / \u5173\uFF08\u4E0B\u4E00\u4E2A\u97F3\u8D77\uFF09\" } },\n  { id: \"extend\", group: \"\u65F6\u503C\", keys: [{ code: \"Minus\" }, { code: \"NumpadSubtract\" }], act: cmd({ k: \"extend\" }),\n    does: { write: \"\u521A\u5199\u7684\u97F3\u52A0\u4E00\u4EFD\uFF08\u7B80\u8C31\u7684\u6A2A\u7EBF\uFF09\uFF1B\u9694\u7740\u5C0F\u8282\u7EBF = \u65B0\u5F00\u4E00\u4E2A\u8FDE\u7740\u7684\u540C\u97F3\", edit: \"\u9009\u4E2D\u7684\u97F3\u5404\u52A0\u4E00\u4EFD\" } },\n  // \u2500\u2500 \u97F3\u9AD8 \u2500\u2500\n  { id: \"sharp\", group: \"\u97F3\u9AD8\", keys: [{ code: \"BracketRight\" }], act: cmd({ k: \"acc\", acc: 1 }),\n    does: { write: \"\u266F\uFF1A\u70B9\u4E00\u4E0B\u7BA1\u4E0B\u4E00\u4E2A\u97F3\uFF0C\u8FDE\u70B9\u4E24\u4E0B\u9501\u4F4F\uFF0C\u518D\u70B9\u89E3\u5F00\", edit: \"\u9009\u4E2D\u7684\u97F3\u5347\u534A\u97F3\" } },\n  { id: \"flat\", group: \"\u97F3\u9AD8\", keys: [{ code: \"BracketLeft\" }], act: cmd({ k: \"acc\", acc: -1 }),\n    does: { write: \"\u266D\uFF1A\u540C\u4E0A\", edit: \"\u9009\u4E2D\u7684\u97F3\u964D\u534A\u97F3\" } },\n  { id: \"octave.up\", group: \"\u97F3\u9AD8\", keys: [{ code: \"Quote\" }, { code: \"NumpadMultiply\" }, { code: \"ArrowUp\", alt: true }], act: cmd({ k: \"octave\", d: 1 }),\n    does: { write: \"\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u9AD8\u516B\u5EA6\", edit: \"\u9009\u4E2D\u7684\u97F3\u9AD8\u516B\u5EA6\" } },\n  { id: \"octave.down\", group: \"\u97F3\u9AD8\", keys: [{ code: \"Comma\" }, { code: \"NumpadDivide\" }, { code: \"ArrowDown\", alt: true }], act: cmd({ k: \"octave\", d: -1 }),\n    does: { write: \"\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u4F4E\u516B\u5EA6\", edit: \"\u9009\u4E2D\u7684\u97F3\u4F4E\u516B\u5EA6\" } },\n  { id: \"step.up\", group: \"\u97F3\u9AD8\", keys: [{ code: \"ArrowUp\" }], act: cmd({ k: \"step\", d: 1 }), does: { write: \"\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u5F80\u4E0A\u4E00\u7EA7\", edit: \"\u9009\u4E2D\u7684\u97F3\u5F80\u4E0A\u4E00\u7EA7\" } },\n  { id: \"step.down\", group: \"\u97F3\u9AD8\", keys: [{ code: \"ArrowDown\" }], act: cmd({ k: \"step\", d: -1 }), does: { write: \"\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u5F80\u4E0B\u4E00\u7EA7\", edit: \"\u9009\u4E2D\u7684\u97F3\u5F80\u4E0B\u4E00\u7EA7\" } },\n  { id: \"alter.up\", group: \"\u97F3\u9AD8\", keys: [{ code: \"ArrowUp\", shift: true }], act: cmd({ k: \"alter\", d: 1 }), does: { write: \"\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u5347\u534A\u97F3\uFF08\u6309\u8C03\u62FC\u5199\uFF1AC \u5927\u8C03 E \u2192 F\uFF09\", edit: \"\u9009\u4E2D\u7684\u97F3\u6574\u4F53\u5347\u534A\u97F3\uFF08\u6309\u8C03\u62FC\u5199\uFF09\" } },\n  { id: \"alter.down\", group: \"\u97F3\u9AD8\", keys: [{ code: \"ArrowDown\", shift: true }], act: cmd({ k: \"alter\", d: -1 }), does: { write: \"\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u964D\u534A\u97F3\uFF08\u6309\u8C03\u62FC\u5199\uFF09\", edit: \"\u9009\u4E2D\u7684\u97F3\u6574\u4F53\u964D\u534A\u97F3\uFF08\u6309\u8C03\u62FC\u5199\uFF09\" } },\n  // \u2500\u2500 \u5149\u6807\u4E0E\u9009\u4E2D \u2500\u2500\n  { id: \"left\", group: \"\u5149\u6807\u4E0E\u9009\u4E2D\", keys: [{ code: \"ArrowLeft\" }], act: cmd({ k: \"caret\", d: -1 }), does: { write: \"\u5149\u6807\u5DE6\u79FB\", edit: \"\u6536\u6210\u9009\u4E2D\u5DE6\u8FB9\u7684\u5149\u6807\uFF08\u56DE\u5230\u5199\uFF09\" } },\n  { id: \"right\", group: \"\u5149\u6807\u4E0E\u9009\u4E2D\", keys: [{ code: \"ArrowRight\" }], act: cmd({ k: \"caret\", d: 1 }), does: { write: \"\u5149\u6807\u53F3\u79FB\", edit: \"\u6536\u6210\u9009\u4E2D\u53F3\u8FB9\u7684\u5149\u6807\uFF08\u56DE\u5230\u5199\uFF09\" } },\n  { id: \"sel.left\", group: \"\u5149\u6807\u4E0E\u9009\u4E2D\", keys: [{ code: \"ArrowLeft\", shift: true }], act: cmd({ k: \"selext\", d: -1 }), does: { write: \"\u9009\u4E2D\u5149\u6807\u524D\u90A3\u4E2A\uFF08\u5199 \u2192 \u6539\uFF09\", edit: \"\u9009\u4E2D\u5F80\u5DE6\u6269\u4E00\u4E2A\" } },\n  { id: \"sel.right\", group: \"\u5149\u6807\u4E0E\u9009\u4E2D\", keys: [{ code: \"ArrowRight\", shift: true }], act: cmd({ k: \"selext\", d: 1 }), does: { write: \"\u9009\u4E2D\u5149\u6807\u540E\u90A3\u4E2A\uFF08\u5199 \u2192 \u6539\uFF09\", edit: \"\u9009\u4E2D\u5F80\u53F3\u6269\u4E00\u4E2A\" } },\n  { id: \"sel.home\", group: \"\u5149\u6807\u4E0E\u9009\u4E2D\", keys: [{ code: \"Home\", shift: true }], act: cmd({ k: \"seledge\", d: -1 }), does: { write: \"\u4ECE\u5149\u6807\u9009\u5230\u5F00\u5934\uFF08\u5199 \u2192 \u6539\uFF09\", edit: \"\u9009\u5230\u5F00\u5934\" } },\n  { id: \"sel.end\", group: \"\u5149\u6807\u4E0E\u9009\u4E2D\", keys: [{ code: \"End\", shift: true }], act: cmd({ k: \"seledge\", d: 1 }), does: { write: \"\u4ECE\u5149\u6807\u9009\u5230\u672B\u5C3E\uFF08Home \u518D Shift+End = \u5168\u9009\uFF09\", edit: \"\u9009\u5230\u672B\u5C3E\" } },\n  { id: \"home\", group: \"\u5149\u6807\u4E0E\u9009\u4E2D\", keys: [{ code: \"Home\" }], act: cmd({ k: \"home\" }), does: { write: \"\u5149\u6807\u5230\u5F00\u5934\", edit: \"\u5149\u6807\u5230\u5F00\u5934\" } },\n  { id: \"end\", group: \"\u5149\u6807\u4E0E\u9009\u4E2D\", keys: [{ code: \"End\" }], act: cmd({ k: \"end\" }), does: { write: \"\u5149\u6807\u5230\u672B\u5C3E\", edit: \"\u5149\u6807\u5230\u672B\u5C3E\" } },\n  { id: \"escape\", group: \"\u5149\u6807\u4E0E\u9009\u4E2D\", keys: [{ code: \"Escape\" }], act: (_i, w) => (w === \"lyric\" ? { k: \"lyric\", a: \"cancel\" } : w === \"mark\" ? { k: \"mark\", a: \"cancel\" } : w === \"sheet\" ? { k: \"sheet\", a: \"close\" } : { k: \"cmd\", cmd: { k: \"escape\" } }),\n    does: { write: \"\u9009\u4E2D\u5149\u6807\u524D\u90A3\u4E2A\uFF08\u5199 \u2192 \u6539\uFF09\", lyric: \"\u6536\u8D77\uFF0C\u4E0D\u8D34\u6846\u91CC\u7684\u5B57\", mark: \"\u6536\u8D77\uFF0C\u4E0D\u6539\uFF08\u521A\u63D2\u7684\u8BB0\u53F7 = \u64A4\u6389\uFF09\", sheet: \"\u5173\u6389\u9762\u677F\" } },\n  { id: \"backspace\", group: \"\u5149\u6807\u4E0E\u9009\u4E2D\", keys: [{ code: \"Backspace\" }], act: (_i, w) => (w === \"lyric\" ? { k: \"lyric\", a: \"back\" } : { k: \"cmd\", cmd: { k: \"backspace\" } }),\n    does: { write: \"\u64A4\u56DE\u672C\u6B21\u8F93\u5165\u7684\u6700\u540E\u4E00\u7B14\uFF08\u300C\u2212\u300D\u3001\u97F3\uFF09\uFF1B\u632A\u8FC7\u5149\u6807\u540E = \u5220\u5149\u6807\u524D\u4E00\u4E2A\", edit: \"\u5220\u6389\u9009\u4E2D\", lyric: \"\u6846\u662F\u7A7A\u7684\uFF1A\u56DE\u5230\u4E0A\u4E00\u4E2A\u97F3\uFF0C\u628A\u5B83\u7684\u5B57\u62FF\u51FA\u6765\u63A5\u7740\u5220\" } },\n  { id: \"delete\", group: \"\u5149\u6807\u4E0E\u9009\u4E2D\", keys: [{ code: \"Delete\" }], act: cmd({ k: \"delete\" }), does: { write: \"\u5220\u5149\u6807\u540E\u4E00\u4E2A\", edit: \"\u5220\u6389\u9009\u4E2D\" } },\n  // \u2500\u2500 \u64AD\u653E \u2500\u2500\n  { id: \"play\", group: \"\u64AD\u653E\", keys: [{ code: \"Space\" }], act: () => ({ k: \"play\" }), does: { write: \"\u5C0F\u6708\u76F8\u5531 / \u505C\", edit: \"\u5C0F\u6708\u76F8\u5531 / \u505C\" } },\n  { id: \"impro\", group: \"\u64AD\u653E\", keys: [{ code: \"Backquote\" }], show: \"`\", act: () => ({ k: \"impro\" }), does: { write: \"\u300C\u5F39\u300D\u5F00 / \u5173\uFF08\u97F3\u7B26\u952E\u53EA\u5531\u4E0D\u5199\uFF09\", edit: \"\u300C\u5F39\u300D\u5F00 / \u5173\", impro: \"\u300C\u5F39\u300D\u5173\" } },\n  // \u2500\u2500 \u6587\u4EF6\uFF08\u65E0\u5730\u9003\u751F\u53E3\uFF1A.mxl\uFF1Buser 2026-10-07\u300C\u5148\u6309\u7167\u65E0\u5730\u89C4\u8303\u5BFC\u5165\u5BFC\u51FA\u505A\u9003\u751F\u53E3\u300D\uFF09\u3002\u65B0\u5EFA\u53EA\u5728\u83DC\u5355\u91CC\uFF08Ctrl+N \u6D4F\u89C8\u5668\u4E0D\u8BA9\u62E6\uFF09 \u2500\u2500\n  { id: \"file.save\", group: \"\u6587\u4EF6\", keys: [{ code: \"KeyS\", mod: true }], show: \"Ctrl / \u2318+S\", act: () => ({ k: \"file\", a: \"save\" }),\n    does: { write: \"\u5B58\uFF08\u5B58\u56DE\u6253\u5F00\u7684\u90A3\u4E2A\u6587\u4EF6\uFF1B\u8FD8\u6CA1\u6709\u5BB6 = \u95EE\u5B58\u5230\u54EA / iPad \u4E0B\u8F7D\uFF09\", edit: \"\u5B58\", impro: \"\u5B58\", lyric: \"\u5B58\", mark: \"\u5B58\" } },\n  { id: \"file.export\", group: \"\u6587\u4EF6\", keys: [{ code: \"KeyS\", mod: true, shift: true }], show: \"Ctrl / \u2318+Shift+S\", act: () => ({ k: \"file\", a: \"export\" }),\n    does: { write: \"\u5BFC\u51FA\u2026\uFF08\u6B4C\u58F0 mp3 / \u5B58\u4E00\u4EFD .mxl \u526F\u672C\uFF1B\u539F\u6765\u7684\u300C\u53E6\u5B58\u4E3A\u300D\u4F4F\u8FD9\u91CC\uFF09\", edit: \"\u5BFC\u51FA\u2026\", impro: \"\u5BFC\u51FA\u2026\", lyric: \"\u5BFC\u51FA\u2026\", mark: \"\u5BFC\u51FA\u2026\" } },\n  { id: \"file.open\", group: \"\u6587\u4EF6\", keys: [{ code: \"KeyO\", mod: true }], show: \"Ctrl / \u2318+O\", act: () => ({ k: \"file\", a: \"open\" }),\n    does: { write: \"\u6253\u5F00\u2026\uFF08.mxl / .musicxml\uFF09\", edit: \"\u6253\u5F00\u2026\", impro: \"\u6253\u5F00\u2026\", lyric: \"\u6253\u5F00\u2026\", mark: \"\u6253\u5F00\u2026\" } },\n  // \u2500\u2500 \u9009\u533A\uFF082026-10-08 \u6539\u7684\u624B\u611F\uFF1A\u957F\u6309\u9009\u3001\u9009\u533A\u6761\u4E0A\u7684\u52A8\u8BCD\uFF1B\u8FD9\u91CC\u53EA\u662F\u952E\u76D8\u5165\u53E3\uFF09 \u2500\u2500\n  { id: \"clip.copy\", group: \"\u9009\u533A\", keys: [{ code: \"KeyC\", mod: true }], show: \"Ctrl / \u2318+C\", act: () => ({ k: \"clip\", a: \"copy\" }), does: { edit: \"\u590D\u5236\u9009\u4E2D\uFF08app \u5185\u539F\u6837 + \u7CFB\u7EDF\u526A\u8D34\u677F\u4E00\u884C\u7B80\u8C31\uFF09\" } },\n  { id: \"clip.cut\", group: \"\u9009\u533A\", keys: [{ code: \"KeyX\", mod: true }], show: \"Ctrl / \u2318+X\", act: () => ({ k: \"clip\", a: \"cut\" }), does: { edit: \"\u526A\u5207\u9009\u4E2D\" } },\n  { id: \"clip.paste\", group: \"\u9009\u533A\", keys: [{ code: \"KeyV\", mod: true }], show: \"Ctrl / \u2318+V\", act: () => ({ k: \"clip\", a: \"paste\" }), does: { write: \"\u8D34\u5728\u5149\u6807\u5904\uFF08app \u5185\u590D\u5236\u8FC7\u7684\uFF1B\u6CA1\u6709\u5C31\u8BD5\u7740\u8BFB\u7CFB\u7EDF\u526A\u8D34\u677F\u91CC\u7684\u7B80\u8C31\u6587\u5B57\uFF09\", edit: \"\u8D34 = \u66FF\u6362\u9009\u4E2D\" } },\n  { id: \"clip.all\", group: \"\u9009\u533A\", keys: [{ code: \"KeyA\", mod: true }], show: \"Ctrl / \u2318+A\", act: () => ({ k: \"clip\", a: \"all\" }), does: { write: \"\u5168\u9009\uFF08\u8FD9\u5F20\u7EB8\u4E0A\u8FD9\u4E2A\u58F0\u90E8\uFF09\", edit: \"\u5168\u9009\" } },\n  // \u2500\u2500 \u64A4\u9500 / \u91CD\u505A\uFF082026-10-08\uFF1B\u9876\u680F \u21B6 \u21B7 \u540C\u4E00\u5165\u53E3\uFF09 \u2500\u2500\n  { id: \"undo\", group: \"\u64A4\u9500\", keys: [{ code: \"KeyZ\", mod: true }], show: \"Ctrl / \u2318+Z\", act: () => ({ k: \"undo\" }), does: { write: \"\u64A4\u9500\u4E0A\u4E00\u6B65\uFF08\u62D6 / \u8FDE\u6253\u6B4C\u8BCD\u7B97\u4E00\u6B65\uFF09\", edit: \"\u64A4\u9500\", impro: \"\u64A4\u9500\" } },\n  { id: \"redo\", group: \"\u64A4\u9500\", keys: [{ code: \"KeyZ\", mod: true, shift: true }, { code: \"KeyY\", mod: true }], show: \"Ctrl / \u2318+Shift+Z / Ctrl+Y\", act: () => ({ k: \"redo\" }), does: { write: \"\u91CD\u505A\", edit: \"\u91CD\u505A\", impro: \"\u91CD\u505A\" } },\n  // \u2500\u2500 \u6B4C\u8BCD\u6846\uFF08\u70B9\u8C31\u4E0B\u9762\u6253\u5F00\uFF1B\u8F93\u5165\u6CD5\u7167\u5E38\u7528\uFF0C\u4E2D\u6587 / \u65E5\u6587\u9009\u5B9A\u4E00\u6BB5\u5B57\u5C31\u6309\u5B57\u5F80\u540E\u8D34\uFF09 \u2500\u2500\n  { id: \"lyric.next\", group: \"\u6B4C\u8BCD\u6846\", keys: [{ code: \"Space\" }, { code: \"Tab\" }], show: \"\u7A7A\u683C / Tab\", act: () => ({ k: \"lyric\", a: \"next\" }),\n    does: { lyric: \"\u8FD9\u4E2A\u8BCD\u5B8C\u4E86\uFF1A\u8D34\u4E0A\u3001\u8DF3\u4E0B\u4E00\u4E2A\u97F3\uFF08\u6846\u662F\u7A7A\u7684 = \u53EA\u8DF3\uFF09\" } },\n  { id: \"lyric.prev\", group: \"\u6B4C\u8BCD\u6846\", keys: [{ code: \"Tab\", shift: true }], act: () => ({ k: \"lyric\", a: \"prev\" }), does: { lyric: \"\u56DE\u4E0A\u4E00\u4E2A\u97F3\" } },\n  { id: \"lyric.hyphen\", group: \"\u6B4C\u8BCD\u6846\", keys: [{ code: \"Minus\" }], show: \"-\", act: () => ({ k: \"lyric\", a: \"hyphen\" }),\n    does: { lyric: \"\u8DDF\u5728\u5B57\u6BCD\u540E\u9762\uFF1A\u97F3\u8282\u5B8C\u4E86\u3001\u8BCD\u6CA1\u5B8C\uFF08\u8C31\u4E0A\u753B\u8FDE\u5B57\u7B26\uFF09\uFF0C\u8DF3\u4E0B\u4E00\u4E2A\u97F3\" } },\n  { id: \"lyric.commit\", group: \"\u6B4C\u8BCD\u6846\", keys: [{ code: \"Enter\" }, { code: \"NumpadEnter\" }], act: () => ({ k: \"lyric\", a: \"commit\" }), does: { lyric: \"\u8D34\u4E0A\u3001\u6536\u8D77\" } },\n  // \u2500\u2500 \u8BB0\u53F7\u6846\uFF08\u70B9\u8C31\u4E0A\u7684\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\u6253\u5F00\uFF09 \u2500\u2500\n  { id: \"mark.commit\", group: \"\u8BB0\u53F7\u6846\", keys: [{ code: \"Enter\" }, { code: \"NumpadEnter\" }], act: () => ({ k: \"mark\", a: \"commit\" }), does: { mark: \"\u6309\u6846\u91CC\u7684\u5B57\u6539\uFF081=D / Bb / 2# \u00B7 3/4 \u00B7 90 \u6216 Andante\uFF09\u3001\u6536\u8D77\" } },\n];\n\n/** \u952E\u540D\uFF08\u6587\u6863 / \u63D0\u793A\u7528\uFF09\u3002 */\nconst NAME: Record<string, string> = {\n  Minus: \"-\", BracketRight: \"]\", BracketLeft: \"[\", Backslash: \"\\\\\", Quote: \"'\", Comma: \",\", Backquote: \"`\", Space: \"\u7A7A\u683C\",\n  Enter: \"Enter\", NumpadEnter: \"\u5C0F\u952E\u76D8 Enter\", Escape: \"Esc\", Backspace: \"\u9000\u683C\", Delete: \"Delete\", Home: \"Home\", End: \"End\", Tab: \"Tab\",\n  ArrowUp: \"\u2191\", ArrowDown: \"\u2193\", ArrowLeft: \"\u2190\", ArrowRight: \"\u2192\",\n  NumpadSubtract: \"\u5C0F\u952E\u76D8 -\", NumpadMultiply: \"\u5C0F\u952E\u76D8 *\", NumpadDivide: \"\u5C0F\u952E\u76D8 /\",\n};\nexport function chordName(c: Chord): string {\n  const base = NAME[c.code] ?? c.code.replace(/^Digit/, \"\").replace(/^Key/, \"\").replace(/^Numpad(\\d)$/, \"\u5C0F\u952E\u76D8 $1\");\n  return `${c.mod ? \"Ctrl / \u2318+\" : \"\"}${c.alt ? \"Alt+\" : \"\"}${c.shift ? \"Shift+\" : \"\"}${base}`;\n}\n/** pad \u6309\u94AE\u63D0\u793A\u7528\uFF1A\u67D0\u6761\u6620\u5C04\u7684\u7B2C\u4E00\u4E2A\u952E\uFF08\u6CA1\u6709 = \"\"\uFF09\u3002 */\nexport function hint(id: string): string {\n  const b = BINDINGS.find((x) => x.id === id);\n  return b ? (b.show?.split(\" / \")[0] ?? chordName(b.keys[0])) : \"\";\n}\n\nexport interface KeyLike { code: string; key: string; shiftKey: boolean; altKey: boolean; ctrlKey: boolean; metaKey: boolean; isComposing?: boolean }\n\nfunction matches(c: Chord, e: KeyLike): boolean {\n  if (c.code !== e.code || !!c.shift !== e.shiftKey || !!c.alt !== e.altKey || !!c.mod !== (e.ctrlKey || e.metaKey)) return false;\n  // \u5C0F\u952E\u76D8\u6570\u5B57\uFF1ANumLock \u5173\u7740\u65F6\u5B83\u4EEC\u662F\u65B9\u5411\u952E\uFF08key \u4E0D\u662F\u6570\u5B57\uFF09\uFF0C\u4E0D\u63A5\n  if (/^Numpad\\d$/.test(c.code) && !/^\\d$/.test(e.key)) return false;\n  return true;\n}\n\n/** \u8DEF\u7531\uFF1A\u8FD9\u4E2A\u6309\u952E\u5728 where \u8BE5\u505A\u4EC0\u4E48\uFF08null = \u4E0D\u7BA1\uFF0C\u8BA9\u6D4F\u89C8\u5668 / \u6587\u672C\u6846\u7167\u5E38\uFF09\u3002\u5F39\u6CA1\u5199\u7684\u952E\u7167\u5199 / \u6539\u8D70\uFF08base\uFF09\u3002 */\nexport function route(e: KeyLike, where: Where, base: \"write\" | \"edit\" = \"write\"): Action | null {\n  if (e.isComposing) return null;   // Ctrl / \u2318 \u7EC4\u5408\uFF1A\u53EA\u6709\u8868\u91CC\u6807\u4E86 mod \u7684\u952E\u80FD\u547D\u4E2D\uFF08matches \u91CC\u6BD4\uFF09\uFF0C\u5176\u4F59\u7167\u65E7\u4EA4\u7ED9\u6D4F\u89C8\u5668\n  const tryWhere = (w: Where): Action | null => {\n    for (const b of BINDINGS) {\n      if (!b.does[w]) continue;\n      const i = b.keys.findIndex((c) => matches(c, e));\n      if (i >= 0) return b.act(i, w);\n    }\n    return null;\n  };\n  return tryWhere(where) ?? (where === \"impro\" ? tryWhere(base) : null);\n}\n/** \u677E\u5F00\u7684\u8FD9\u4E2A\u952E\u662F\u4E0D\u662F\u300C\u6309\u4F4F\u54CD\u300D\u7684\u952E\uFF08\u8C31\u9762\u4E0A\uFF1A\u5199 / \u6539 / \u5F39\uFF09\u3002 */\nexport function isSoundKey(e: KeyLike): boolean {\n  return BINDINGS.some((b) => b.sound && b.keys.some((c) => c.code === e.code));\n}\n\n// \u2500\u2500 \u6587\u6863\uFF08scripts/gen-keys-doc.mjs \u5199\u6210 docs/keys.md\uFF1Btest/keys.test.ts \u5B88\u7740\u5B83\u4E0D\u8FC7\u671F\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst WHERE_TITLE: Record<\"lyric\" | \"mark\" | \"sheet\", string> = { lyric: \"\u6B4C\u8BCD\u6846\", mark: \"\u8BB0\u53F7\u6846\", sheet: \"\u9762\u677F\uFF08\u5BFC\u51FA\u597D\u4E86\uFF09\" };\nconst keysOf = (b: Binding) => b.show ?? b.keys.map(chordName).join(\" / \");\n/** \u8868\u683C\u91CC\u7684\u952E\uFF1A\u4EE3\u7801\u6837\u5F0F\uFF1B\u53CD\u5F15\u53F7\u952E\u7528\u53CC\u53CD\u5F15\u53F7\u5305\uFF1B\u300C|\u300D\u5728\u8868\u683C\u91CC\u5373\u4F7F\u5728\u4EE3\u7801\u91CC\u4E5F\u8981\u8F6C\u4E49\uFF08GFM\uFF09\u3002 */\nconst code = (k: string) => (k.includes(\"`\") ? `\\`\\` ${k} \\`\\`` : `\\`${k}\\``).replace(/\\|/g, \"\\\\|\");\nconst cell = (s: string | undefined) => (s ?? \"\u2014\").replace(/\\|/g, \"\\\\|\");\n\nexport function renderKeysDoc(): string {\n  let md = `<!-- \u81EA\u52A8\u751F\u6210\uFF1Anode scripts/gen-keys-doc.mjs \u4ECE src/keyboard/keys.ts \u7684 BINDINGS \u751F\u6210\u2014\u2014\u522B\u624B\u6539\uFF0C\u6539\u8868\u518D\u91CD\u8DD1\uFF08\u6D4B\u8BD5\u5B88\u7740\u5B83\u4E0D\u8FC7\u671F\uFF09\u3002 -->\\n\\n`;\n  md += `# \u952E\u76D8\\n\\n> \u751F\u6210\u81EA \\`src/keyboard/keys.ts\\`\\n\\n`;\n  md += `\u8C31\u9762\u4E0A\u6709\u4E09\u79CD\u72B6\u6001\uFF1A**\u5199**\uFF08\u5149\u6807\uFF0C\u6253\u7684\u97F3\u63D2\u5728\u5149\u6807\u5904\uFF09\u3001**\u6539**\uFF08\u9009\u4E2D\u4E86\u4E00\u6BB5\uFF0C\u6253\u7684\u97F3\u8986\u76D6\u9009\u4E2D\uFF09\u3001**\u5F39**\uFF08\u300C\u5F39\u300D\u5F00\u7740\uFF1A\u97F3\u7B26\u952E\u53EA\u5531\u4E0D\u5199\uFF0C\u5176\u4F59\u952E\u7167\u5199 / \u6539\uFF09\u3002\\n`;\n  md += `\u6309\u7269\u7406\u952E\u4F4D\u8BA4\uFF08\u6362\u8F93\u5165\u6CD5 / \u952E\u76D8\u5E03\u5C40\u4E0D\u4E71\uFF09\uFF1BCtrl / \u2318 \u7EC4\u5408\u53EA\u63A5\u5B58 / \u5BFC\u51FA / \u6253\u5F00\uFF0C\u5176\u4F59\u4EA4\u7ED9\u6D4F\u89C8\u5668\u3002\\n\\n`;\n  md += `**MIDI \u952E\u76D8**\uFF08\u7535\u5B50\u7434 / MIDI \u952E\u76D8\u7528 USB \u63D2\u7535\u8111\uFF0C\u70B9\u9876\u680F\u7684\u300CMIDI\u300D\u2192\u300C\u8FDE\u63A5\u300D\uFF08\u8BBE\u7F6E\u91CC\u4E5F\u6709\uFF09\uFF1Bsrc/keyboard/midi.ts\uFF09\uFF1A\u7434\u952E\u5C31\u662F\u97F3\u7B26\u952E\u2014\u2014\u5199 / \u6539 / \u5F39\u540C\u4E0A\uFF0C\u6309\u54EA\u4E2A\u952E\u5199\u54EA\u4E2A\u97F3\uFF08\u6309\u5149\u6807\u5904\u7684\u8C03\u53F7\u62FC\u5199\uFF09\uFF1B\u8BCD / \u542C\u91CC\u53EA\u51FA\u58F0\u3002iPad / iPhone \u4E0A\u7684\u6D4F\u89C8\u5668\u6CA1\u6709 Web MIDI\u3002\\n\\n`;\n  const score = BINDINGS.filter((b) => b.does.write || b.does.edit || b.does.impro);\n  const groups = [...new Set(score.map((b) => b.group))];\n  for (const g of groups) {\n    md += `## ${g}\\n\\n| \u952E | \u5199 | \u6539 | \u5F39 |\\n|---|---|---|---|\\n`;\n    for (const b of score.filter((x) => x.group === g)) md += `| ${code(keysOf(b))} | ${cell(b.does.write)} | ${cell(b.does.edit)} | ${b.does.impro ? cell(b.does.impro) : \"\u7167\u5E38\"} |\\n`;\n    md += \"\\n\";\n  }\n  for (const w of [\"lyric\", \"mark\", \"sheet\"] as const) {\n    const rows = BINDINGS.filter((b) => b.does[w]);\n    if (!rows.length) continue;\n    md += `## ${WHERE_TITLE[w]}\\n\\n| \u952E | \u505A\u4EC0\u4E48 |\\n|---|---|\\n`;\n    for (const b of rows) md += `| ${code(keysOf(b))} | ${cell(b.does[w])} |\\n`;\n    md += \"\\n\";\n  }\n  return md;\n}\n", "// midi.ts \u2014\u2014 MIDI \u952E\u76D8\uFF08Web MIDI\uFF09\uFF1A\u63D2\u5728\u7535\u8111\u4E0A\u7684\u7535\u5B50\u7434 / MIDI \u952E\u76D8 = \u53C8\u4E00\u4E2A\u53EA\u53D1\u6309\u952E\u7684\u8F93\u5165\u8BBE\u5907\u3002created 2026-10-16 by Claude Opus 5.5\n//   user 2026-10-16\u300C\u4ECA\u5929\u628Amidi\u952E\u76D8\u505A\u4E00\u4E0B\u5427\uFF0C\u6700\u597Dipad\u4E5F\u80FD\u652F\u6301\uFF0C\u53EF\u4EE5\u63D2\u7535\u5B50\u7434\u4E0A\u5F04\u300D\uFF0810-09 \u6742\u4E8B\u8D26\u300Cmidi\u952E\u76D8\u80FD\u505A\u5C31\u505A\u300D\uFF09\u3002\n// \u952E\u76D8\u6A21\u5757\u7684\u89C4\u77E9\u7167\u65E7\uFF08ai-docs/20261014-editing-mental-model.md \u00A72\uFF09\uFF1A\u53EA\u7BA1\u4EA4\u4E92\uFF0C\u4E0D\u61C2\u97F3\u4E50\u2014\u2014\u53D1\u51FA\u6765\u7684\u662F\u300C\u7B2C\u51E0\u53F7\u7434\u952E\u6309\u4E0B / \u677E\u5F00\u300D\uFF0C\n//   \u7434\u952E\u53F7\u600E\u4E48\u62FC\u6210\u8C31\u4E0A\u7684\u97F3\u3001\u5199\u8FD8\u662F\u53EA\u54CD\uFF0C\u5F52\u5BBF\u4E3B\uFF08main.ts \u2192 pad-host.ts \u7684\u540C\u4E00\u4E2A\u7FFB\u8BD1\u5C42\uFF1A\u5199 / \u6539 / \u53E0\u97F3\u89C2\u671B / \u5355\u58F0\u62A4\u680F / \u5F39\uFF09\u3002\n// \u7EBF\u7A0B\uFF1A\u6D4F\u89C8\u5668\u53EA\u5728\u4E3B\u7EBF\u7A0B\u7ED9 MIDI \u6D88\u606F\uFF08requestMIDIAccess \u53EA\u5728 window \u7684 navigator \u4E0A\uFF0C\u7AEF\u53E3\u4E0D\u80FD\u4EA4\u7ED9 worker\uFF09\uFF0C\u6240\u4EE5\u8FD9\u91CC\u4E5F\u5728\u4E3B\u7EBF\u7A0B\u3002\n// iPad / iPhone\uFF1ASafari\uFF08\u4EE5\u53CA iOS \u4E0A\u6240\u6709\u6D4F\u89C8\u5668\uFF0C\u90FD\u662F\u540C\u4E00\u4E2A WebKit\uFF09\u6CA1\u6709 Web MIDI\u2014\u2014status \u62A5 unsupported\uFF0C\u5BBF\u4E3B\u7167\u5B9E\u8BF4\uFF1B\u7ED5\u8DEF\u662F wishlist\u3002\n// \u8BB8\u53EF\uFF1AChrome \u7CFB\u7B2C\u4E00\u6B21 requestMIDIAccess \u4F1A\u5F39\u6D4F\u89C8\u5668\u81EA\u5DF1\u7684\u8BB8\u53EF\u6846\uFF0C\u6240\u4EE5\u53EA\u5728\u4EBA\u70B9\u300C\u8FDE\u63A5\u300D\u65F6\u95EE\uFF1B\u6D4F\u89C8\u5668\u8BB0\u4F4F\u300C\u5141\u8BB8\u300D\u4EE5\u540E\uFF0C\u5F00 app \u65F6 resume() \u9759\u9ED8\u63A5\u4E0A\u3002\n// \u53EA\u8BA4\u97F3\u7B26\u7684\u6309\u4E0B / \u677E\u5F00\uFF08\u4EFB\u4F55\u901A\u9053\uFF09\uFF1B\u63A7\u5236\u5668\uFF08\u63A8\u5B50 / \u65CB\u94AE / \u8E0F\u677F\uFF09\u89E3\u6790\u51FA\u6765\u4F46\u4E0D\u63A5\uFF08\u4EE5\u540E\u8DEF\u7531\u63A8\u5B50 = wishlist\uFF09\uFF0C\u65F6\u949F / \u5FC3\u8DF3\u7B49\u7CFB\u7EDF\u6D88\u606F\u4E22\u6389\u3002\n\n/** \u4E00\u6761 MIDI \u6D88\u606F\uFF08\u53EA\u89E3\u6790\u7528\u5F97\u5230\u7684\uFF09\u3002vel 0\u2013127\u3002 */\nexport type MidiMsg =\n  | { k: \"on\"; ch: number; note: number; vel: number }\n  | { k: \"off\"; ch: number; note: number }\n  | { k: \"cc\"; ch: number; cc: number; value: number };\n\n/** \u89E3\u6790\u4E00\u6761\u6D88\u606F\uFF1A\u6309\u4E0B\u529B\u5EA6 0 = \u677E\u5F00\uFF08\u5F88\u591A\u7434\u8FD9\u6837\u53D1\u677E\u5F00\uFF09\uFF1B\u522B\u7684\uFF08\u5F2F\u97F3 / \u89E6\u540E / \u7CFB\u7EDF\u6D88\u606F / \u4E0D\u5B8C\u6574\u7684\uFF09= null\u3002 */\nexport function parseMidi(data: ArrayLike<number>): MidiMsg | null {\n  if (data.length < 3) return null;\n  const st = data[0] & 0xf0, ch = data[0] & 0x0f, a = data[1] & 0x7f, b = data[2] & 0x7f;\n  if (st === 0x90) return b > 0 ? { k: \"on\", ch, note: a, vel: b } : { k: \"off\", ch, note: a };\n  if (st === 0x80) return { k: \"off\", ch, note: a };\n  if (st === 0xb0) return { k: \"cc\", ch, cc: a, value: b };\n  return null;\n}\n\nexport type MidiStatus =\n  | { k: \"unsupported\" }                    // \u8FD9\u4E2A\u6D4F\u89C8\u5668\u6CA1\u6709 Web MIDI\uFF08iPad / iPhone\uFF09\n  | { k: \"off\" }                            // \u8FD8\u6CA1\u8FDE\uFF08\u6CA1\u95EE\u8FC7 / \u6D4F\u89C8\u5668\u6CA1\u8BB0\u4F4F\u5141\u8BB8\uFF09\n  | { k: \"asking\" }                         // \u7B49\u6D4F\u89C8\u5668\u7684\u8BB8\u53EF\u6846\n  | { k: \"denied\"; why: string }            // \u6CA1\u7ED9 / \u51FA\u9519\n  | { k: \"on\"; inputs: string[] };          // \u8FDE\u4E0A\u4E86\uFF1Binputs = \u73B0\u5728\u63D2\u7740\u7684\u7434\uFF08\u53EF\u4EE5\u662F\u7A7A\u7684\uFF1A\u63D2\u4E0A\u5C31\u8BA4\uFF09\n\nexport interface MidiHandlers {\n  /** \u4E00\u4E2A\u7434\u952E\u6309\u4E0B\uFF1Anote = \u7434\u952E\u53F7\uFF0860 = \u4E2D\u592E C\uFF09\uFF0Cvel = \u529B\u5EA6 0\u20131\uFF0Cid = \u8FD9\u4E2A\u952E\u7684\u6765\u6E90 id\uFF08\u677E\u5F00\u65F6\u540C\u4E00\u4E2A\uFF09\u3002 */\n  down(note: number, vel: number, id: string): void;\n  up(id: string): void;\n  /** \u63D2\u4E0A / \u62D4\u6389\u4E00\u53F0\uFF08\u8FDE\u4E0A\u4EE5\u540E\u624D\u62A5\uFF1B\u8FDE\u4E0A\u90A3\u4E00\u523B\u5DF2\u7ECF\u63D2\u7740\u7684\u4E0D\u62A5\uFF09\u3002 */\n  plug?(name: string, on: boolean): void;\n  status?(s: MidiStatus): void;\n}\n\nexport interface MidiKeyboard {\n  readonly status: MidiStatus;\n  /** \u4EBA\u70B9\u4E86\u300C\u8FDE\u63A5\u300D\uFF1A\u95EE\u6D4F\u89C8\u5668\u8981\u8BB8\u53EF\uFF08\u7B2C\u4E00\u6B21\u4F1A\u5F39\u6D4F\u89C8\u5668\u81EA\u5DF1\u7684\u6846\uFF09\u3002 */\n  connect(): Promise<MidiStatus>;\n  /** \u5F00 app \u65F6\uFF1A\u6D4F\u89C8\u5668\u5DF2\u7ECF\u8BB0\u4F4F\u300C\u5141\u8BB8\u300D\u5C31\u9759\u9ED8\u63A5\u4E0A\uFF0C\u6CA1\u8BB0\u4F4F\u4EC0\u4E48\u4E5F\u4E0D\u505A\uFF08\u4E0D\u5F39\u6846\uFF09\u3002 */\n  resume(): Promise<void>;\n}\n\n// \u53EA\u7528\u5230\u7684\u90A3\u4E00\u5C0F\u5757 Web MIDI \u5F62\u72B6\uFF08lib.dom \u91CC\u6709\uFF0C\u4F46\u5199\u5728\u8FD9\u91CC\u6D4B\u8BD5\u597D\u9020\u5047\u7684\uFF09\ninterface PortLike { id: string; name?: string | null; manufacturer?: string | null; state?: string; type?: string; onmidimessage: ((e: { data: Uint8Array | null }) => void) | null }\ninterface AccessLike { inputs: { forEach(cb: (p: PortLike) => void): void }; onstatechange: ((e: { port: PortLike | null }) => void) | null }\nexport interface MidiNavigator {\n  requestMIDIAccess?: (o?: { sysex?: boolean }) => Promise<AccessLike>;\n  permissions?: { query(d: { name: string }): Promise<{ state: string }> };\n}\n\nconst portName = (p: PortLike): string => (p.name || p.manufacturer || \"MIDI \u952E\u76D8\").trim();\n\nexport function createMidiKeyboard(h: MidiHandlers, nav: MidiNavigator = navigator as unknown as MidiNavigator): MidiKeyboard {\n  let status: MidiStatus = typeof nav.requestMIDIAccess === \"function\" ? { k: \"off\" } : { k: \"unsupported\" };\n  let access: AccessLike | null = null;\n  const ports = new Map<string, PortLike>();          // \u63A5\u7740\u7684\u8F93\u5165\u53E3\n  const held = new Map<string, string>();             // \u6309\u7740\u7684\u952E id \u2192 \u54EA\u4E2A\u53E3\uFF08\u62D4\u6389\u65F6\u677E\u5F00\u5B83\u7684\uFF09\n  const set = (s: MidiStatus): void => { status = s; h.status?.(s); };\n  const report = (): void => { if (access) set({ k: \"on\", inputs: [...ports.values()].map(portName) }); };\n  const release = (portId: string): void => { for (const [id, p] of [...held]) if (p === portId) { held.delete(id); h.up(id); } };\n\n  function attach(p: PortLike): boolean {\n    if (ports.has(p.id)) return false;\n    ports.set(p.id, p);\n    p.onmidimessage = (e) => {\n      const m = e.data ? parseMidi(e.data) : null;\n      if (!m || m.k === \"cc\") return;\n      const id = `midi:${p.id}:${m.ch}:${m.note}`;\n      if (m.k === \"off\") { if (held.delete(id)) h.up(id); return; }\n      if (held.has(id)) h.up(id);                     // \u540C\u4E00\u4E2A\u952E\u6CA1\u677E\u53C8\u6309\uFF08\u6709\u7684\u7434\u8FD9\u6837\u53D1\uFF09\uFF1A\u5148\u677E\u518D\u6309\n      held.set(id, p.id); h.down(m.note, m.vel / 127, id);\n    };\n    return true;\n  }\n  function detach(p: PortLike): boolean {\n    const had = ports.get(p.id); if (!had) return false;\n    had.onmidimessage = null; ports.delete(p.id); release(p.id);\n    return true;\n  }\n  function adopt(a: AccessLike): void {\n    access = a;\n    a.inputs.forEach((p) => { if (p.state !== \"disconnected\") attach(p); });\n    a.onstatechange = (e) => {\n      const p = e.port; if (!p || (p.type && p.type !== \"input\")) return;\n      const changed = p.state === \"disconnected\" ? detach(p) : attach(p);\n      if (changed) { h.plug?.(portName(p), p.state !== \"disconnected\"); report(); }\n    };\n    report();\n  }\n\n  let pending: Promise<MidiStatus> | null = null;\n  function connect(): Promise<MidiStatus> {\n    if (access || status.k === \"unsupported\") return Promise.resolve(status);\n    if (pending) return pending;\n    set({ k: \"asking\" });\n    pending = nav.requestMIDIAccess!({ sysex: false })\n      .then((a) => { adopt(a); return status; })\n      .catch((e: unknown) => { set({ k: \"denied\", why: e instanceof Error ? e.message || e.name : String(e) }); return status; })\n      .finally(() => { pending = null; });\n    return pending;\n  }\n  async function resume(): Promise<void> {\n    if (access || status.k === \"unsupported\" || !nav.permissions) return;\n    let state = \"\";\n    try { state = (await nav.permissions.query({ name: \"midi\" })).state; } catch { return; }   // \u4E0D\u8BA4\u8BC6 \"midi\" \u8FD9\u4E2A\u540D\u5B57\u7684\u6D4F\u89C8\u5668\uFF1A\u7B49\u4EBA\u70B9\u300C\u8FDE\u63A5\u300D\n    if (state === \"granted\") await connect();\n  }\n  return { get status() { return status; }, connect, resume };\n}\n", "// perf-trace.ts \u2014\u2014 \u70ED\u8DEF\u5F84\u7684\u79D2\u8868\uFF1Aspan(name, fn) \u8BB0\u6700\u8FD1\u51E0\u5341\u6B21\u8017\u65F6\uFF0C`__moonsinger.perf()` \u8BFB\u3002created 2026-10-17 by Claude Fable 5.1\n//   \u7ED9\u300C\u6309\u952E \u2192 \u51FA\u58F0 / \u4E0A\u5C4F\u300D\u8FD9\u6761\u8DEF\u5206\u8D26\u7528\uFF08ai-docs/20261017-input-latency-probe.md\uFF09\uFF1A\u5148\u91CF\u540E\u4F18\u3002\u5E38\u6570\u5F00\u9500\uFF08\u4E24\u6B21 performance.now + \u4E00\u4E2A\u6570\u7EC4\u5199\uFF09\uFF0C\u5E38\u9A7B\u4E0D\u788D\u4E8B\u3002\n\nconst KEEP = 64;\nconst spans = new Map<string, number[]>();\n\nexport function span<T>(name: string, fn: () => T): T {\n  const t = performance.now();\n  try { return fn(); } finally { record(name, performance.now() - t); }\n}\nexport function record(name: string, ms: number): void {\n  let a = spans.get(name); if (!a) { a = []; spans.set(name, a); }\n  a.push(ms); if (a.length > KEEP) a.shift();\n}\nexport interface PerfRow { n: number; med: number; max: number; last: number }\n/** \u6BCF\u4E2A\u540D\u5B57\u6700\u8FD1 KEEP \u6B21\u7684 \u4E2D\u4F4D / \u6700\u5927 / \u6700\u540E\u4E00\u6B21\uFF08ms\uFF0C\u4FDD\u7559\u4E00\u4F4D\u5C0F\u6570\uFF09\u3002 */\nexport function perfReport(): Record<string, PerfRow> {\n  const out: Record<string, PerfRow> = {};\n  for (const [k, a] of spans) { const s = [...a].sort((x, y) => x - y); out[k] = { n: a.length, med: r1(s[s.length >> 1]), max: r1(s[s.length - 1]), last: r1(a[a.length - 1]) }; }\n  return out;\n}\nexport function perfReset(): void { spans.clear(); }\nconst r1 = (x: number): number => Math.round(x * 10) / 10;\n", "// lyrics.ts \u2014\u2014 \u6B4C\u8BCD\uFF1A\u4E00\u4E32\u6587\u5B57 \u2192 \u4E00\u4E2A\u4E2A\u97F3\u8282\uFF08\u5E26\u300C\u8FD9\u4E2A\u8BCD\u63A5\u5230\u4E0B\u4E00\u4E2A\u97F3\u300D\u6807\u8BB0\uFF09\uFF0C\u8D34\u5230\u97F3\u7B26\u4E0A\u3002created 2026-10-06 by Claude Opus 5.5\uFF1B2026-10-07 UX-2 \u6539\n// \u8BB0\u8C31\u5C42\u7684\u89C4\u77E9\uFF08user\u300C\u6708\u8BFB\u6211\u8BB0\u5F97\u80FD\u8BFB\u82F1\u6587\u7684\u2026\u4EE5\u53CA\u672A\u6765\u4E5F\u6709\u975E\u6708\u8BFB\uFF0C\u73B0\u5728\u8BF4\u7684\u662F\u5982\u4F55\u8BB0\u8C31\u300D\u300C\u8F93\u5165 \u540C\u610F\uFF0C\u62D6\u4E3A\u4EC0\u4E48\u4E0D\u7528~\uFF1F\u300D\uFF09\u2014\u2014\u548C\u55D3\u5B50\u65E0\u5173\uFF0C\u540C MusicXML <syllabic>\uFF1A\n//   \u00B7 \u6C49\u5B57\u4E00\u4E2A\u5B57\u4E00\u4E2A\u97F3\u8282\uFF1B\u5047\u540D\u4E00\u4E2A\u300C\u62CD\u300D\u4E00\u4E2A\uFF08\u3083\u3085\u3087\u7B49\u5C0F\u5B57\u3001\u3063 \u5E76\u8FDB\u524D\u4E00\u4E2A\uFF1B\u3093 \u81EA\u5DF1\u4E00\u4E2A\uFF09\uFF1B\n//   \u00B7 \u62C9\u4E01\u5B57\u6BCD\uFF1A\u7A7A\u683C\u5206\u8BCD\uFF1B\u8BCD\u91CC\u7684\u300C-\u300D= \u97F3\u8282\u7ED3\u675F\u3001\u8BCD\u6CA1\u5B8C\uFF08hyph\uFF0C\u8C31\u9762\u753B\u8FDE\u5B57\u7B26\uFF09\uFF0C\u5982 hap-py\uFF1B\n//   \u00B7 \u62D6\u8154 = \u300C~\u300D\uFF08\u4E3B\u952E\uFF0Cuser \u81EA\u5DF1\u5199\u8FC7 2153~\uFF09\uFF0C\u300C\uFF5E\u300D\u300C_\u300D\u300C\u30FC\u300D\u548C\u5355\u72EC\u7684\u300C-\u300D\u4E5F\u8BA4\uFF1A\u8FD9\u4E2A\u97F3\u5EF6\u7EED\u4E0A\u4E00\u4E2A\u97F3\u8282\uFF0C\u8C31\u9762\u753B\u5EF6\u957F\u7EBF\uFF1B\n//   \u00B7 \u6807\u70B9\u3001\u7A7A\u683C\uFF08\u62C9\u4E01\u4E4B\u5916\uFF09\u8DF3\u8FC7\u3002\n//   \u00B7 \u300C+\u300D\uFF08\u5168\u89D2\u300C\uFF0B\u300D\u4E5F\u8BA4\uFF09= \u540E\u9762\u90A3\u4E2A\u5B57\u548C\u524D\u9762\u7684\u653E\u540C\u4E00\u4E2A\u97F3\uFF08elision\uFF1Buser\u300C\u65E5\u8BED\u6B4C\u8BCD\u9700\u652F\u6301\u4E00\u4E2A\u97F3\u5BF9\u5E94\u4E24\u4E2A\u5047\u540D \u4E5F\u8BB8\u4E0D\u4E00\u5B9A\u4E24\u4E2A\uFF0C\u7136\u540E\u4E2D\u6587\u4E5F\u4E00\u6837\uFF0C\n//     \u8FD9\u6837\u4E4B\u524D\u7684\u81EA\u52A8\u8F93\u5165\u600E\u4E48\u529E\u5462\uFF1F\u4E4B\u524D\u7684\u81EA\u52A8\u8F93\u5165\u5176\u5B9E\u86EE\u8212\u670D\u7684\u300D\u2192 AI \u7B54\u300C\u7167\u5E38\u8FDE\u7740\u6253\u3001\u5B57\u4E2D\u95F4\u6253 +\u300D\u2192\u300C\u70B9\u5934\u300D\uFF09\uFF1A\u6570\u636E\u91CC\u7528\u6807\u51C6\u7684\u8FDE\u5B57\u5F27\u300C\u203F\u300D\uFF08U+203F\uFF09\u8FDE\u7740\uFF0C\n//     MusicXML = \u4E00\u4E2A <lyric> \u91CC <text>\u2026<elision/>\u2026<text>\uFF1B\u7EB8\u4E0A\u4E2D\u65E5\u6587\u4E24\u4E2A\u5B57\u4E4B\u95F4\u4E0D\u753B\u5F27\uFF08\u65E5\u6587\u8C31\u7684\u4E60\u60EF\uFF09\uFF0C\u62C9\u4E01\u5B57\u6BCD\u4E4B\u95F4\u753B\u300C\u203F\u300D\uFF1B\u5531\u7684\u65F6\u5019\u8FD9\u4E2A\u97F3\u5E73\u5206\u7ED9\u8FD9\u51E0\u62CD\u5B57\u3002\n// \u8D34\u7684\u89C4\u5219\uFF1A\u4ECE\u67D0\u4E2A\u97F3\u7B26\u5F00\u59CB\u5F80\u540E\u8D34\uFF0C\u8986\u76D6\u539F\u6765\u7684\u6B4C\u8BCD\uFF1B\u8FDE\u97F3\u7EBF\u8FDE\u7740\u7684\u97F3\uFF08tie\uFF09\u4E0D\u5403\u6B4C\u8BCD\uFF1B\u97F3\u7B26\u4E0D\u591F\u5C31\u5728\u672B\u5C3E\u8865\u65B0\u97F3\uFF08\u97F3\u9AD8\u7A7A\u7740 = \u7EE7\u627F\u4E0A\u4E00\u4E2A\uFF09\u3002\n\nimport { type EditorState, type NoteTok, type Token, unitDur, tr, withTrack } from \"./song.ts\";\n\nexport interface Syl { text: string; hyph: boolean; joinPrev?: boolean }   // joinPrev = \u8FD9\u6BB5\u6587\u5B57\u4E00\u5F00\u5934\u5C31\u662F\u300C+\u300D\uFF1A\u7B2C\u4E00\u4E2A\u5B57\u5E76\u8FDB\u524D\u4E00\u4E2A\u97F3\uFF08\u6B4C\u8BCD\u6846\u5DF2\u7ECF\u8DF3\u5230\u4E0B\u4E00\u4E2A\u97F3\u7684\u65F6\u5019\uFF09\nexport const MELISMA_MARK = \"\u30FC\";\n/** \u4E00\u4E2A\u97F3\u4E0A\u51E0\u4E2A\u97F3\u8282\u4E4B\u95F4\u7684\u8FDE\u5B57\u5F27\uFF08\u6570\u636E\u91CC\u7684\u5206\u9694\uFF09\u3002 */\nexport const ELISION = \"\u203F\";\nconst JOINERS = new Set([\"+\", \"\uFF0B\"]);\nconst CJK_CHAR = /[\u3040-\u30FF\\p{Script=Han}]/u;\n/** \u7EB8\u4E0A\u600E\u4E48\u5199\uFF1A\u4E2D\u65E5\u6587\u4E24\u4E2A\u5B57\u4E4B\u95F4\u4E0D\u753B\u5F27\uFF0C\u62C9\u4E01\u5B57\u6BCD\u4E4B\u95F4\u753B\u300C\u203F\u300D\u3002 */\nexport const lyricShow = (s: string): string => s.split(ELISION).reduce((a, b) => (!a ? b : CJK_CHAR.test(a.slice(-1)) && CJK_CHAR.test(b.slice(0, 1)) ? a + b : `${a}${ELISION}${b}`), \"\");\n/** \u6B4C\u8BCD\u6846\u91CC\u600E\u4E48\u5199\uFF1A\u8FDE\u5B57\u5F27\u5199\u56DE\u300C+\u300D\uFF08\u597D\u6539\uFF09\u3002 */\nexport const lyricEdit = (s: string): string => s.split(ELISION).join(\"+\");\n\nconst SMALL = new Set([...\"\u3083\u3085\u3087\u3041\u3043\u3045\u3047\u3049\u308E\u3095\u3096\u30E3\u30E5\u30E7\u30A1\u30A3\u30A5\u30A7\u30A9\u30EE\u30F5\u30F6\", \"\u3063\", \"\u30C3\"]);\n/** \u6574\u6BB5\u90FD\u662F\u5C0F\u5B57\uFF08\u3063 / \u3083\u3085\u3087 / \u3041\u3043\u3045\u3047\u3049\u2026\uFF09\uFF1A\u5531\u7684\u65F6\u5019\u81EA\u5DF1\u4E0D\u6210\u62CD\uFF0C\u5F52\u524D\u4E00\u4E2A\u97F3\u8282\uFF08lab-score.ts\uFF09\u3002\u4FC3\u97F3 = \u3063 / \u30C3\uFF08\u5531\u51FA\u6765\u662F\u524D\u4E00\u4E2A\u97F3\u8282\u540E\u9762\u7684\u4E00\u4E0B\u505C\u987F\uFF09\u3002\n *  \u6253\u5B57\u7167\u539F\u6837\uFF08\u8F93\u5165\u6CD5\u4E0A\u5C4F\u51E0\u6B21\u3001\u5C0F\u5B57\u843D\u5728\u54EA\u4E2A\u97F3\u4E0A\u5C31\u5728\u54EA\u4E2A\u97F3\u4E0A\uFF1Buser 2026-10-08\u300C\u6211\u5927tsu\u5C0Ftsu\u5927yo\u5C0Fyo\u786E\u5B9E\u5206\u4E0D\u6E05\u300D\u2014\u2014\u4E0D\u66FF\u4EBA\u6539\u6B4C\u8BCD\uFF0C\u5531\u7684\u90A3\u4E00\u8DEF\u515C\u4F4F\uFF09\u3002 */\nexport const isSmallKana = (s: string): boolean => !!s && [...s].every((c) => SMALL.has(c));\nexport const isSokuon = (s: string): boolean => !!s && [...s].every((c) => c === \"\u3063\" || c === \"\u30C3\");\nconst MELISMA = new Set([\"\u30FC\", \"~\", \"\uFF5E\", \"_\", \"\uFF3F\"]);\nconst isKana = (c: string) => /[\u3040-\u309F\u30A0-\u30FF]/.test(c);\nconst isHan = (c: string) => /\\p{Script=Han}/u.test(c);\nconst isLatin = (c: string) => /[A-Za-z'\u2019]/.test(c);\n\nexport function splitSyllables(text: string): Syl[] {\n  const out: Syl[] = [];\n  const chars = [...text.normalize(\"NFC\")];\n  let join = false, leadJoin = false;\n  const push = (s: Syl) => {   // \u524D\u9762\u6709\u300C+\u300D= \u5E76\u8FDB\u4E0A\u4E00\u4E2A\u97F3\u8282\uFF08\u8FD9\u4E00\u6BB5\u91CC\u8FD8\u6CA1\u6709\u4E0A\u4E00\u4E2A = \u8BB0\u6210 joinPrev\uFF0C\u4EA4\u7ED9\u8C03\u7528\u65B9\u5E76\u8FDB\u524D\u4E00\u4E2A\u97F3\uFF09\n    if (join && s.text !== MELISMA_MARK) {\n      const last = out[out.length - 1];\n      if (last && last.text !== MELISMA_MARK) { last.text += ELISION + s.text; last.hyph = s.hyph; join = false; return; }\n      if (!last && leadJoin) { out.push({ ...s, joinPrev: true }); join = false; return; }\n    }\n    join = false; out.push(s);\n  };\n  for (let i = 0; i < chars.length; i++) {\n    const c = chars[i];\n    if (JOINERS.has(c)) { join = true; if (!out.length) leadJoin = true; continue; }\n    if (MELISMA.has(c)) { push({ text: MELISMA_MARK, hyph: false }); continue; }\n    if (c === \"-\" || c === \"\uFF0D\") { push({ text: MELISMA_MARK, hyph: false }); continue; }   // \u5355\u72EC\u7684 -\uFF08\u8BCD\u91CC\u7684 - \u5728\u62C9\u4E01\u5206\u652F\u5904\u7406\uFF09\n    if (SMALL.has(c)) { const last = out[out.length - 1]; if (last && last.text !== MELISMA_MARK) last.text += c; else out.push({ text: c, hyph: false }); continue; }\n    if (isKana(c) || isHan(c)) { push({ text: c, hyph: false }); continue; }\n    if (isLatin(c)) {\n      let w = c;\n      while (i + 1 < chars.length) {\n        const n = chars[i + 1];\n        if (isLatin(n)) { w += n; i++; continue; }\n        if ((n === \"-\" || n === \"\uFF0D\") && i + 2 < chars.length && isLatin(chars[i + 2])) { push({ text: w, hyph: true }); w = \"\"; i++; continue; }\n        break;\n      }\n      if (w) push({ text: w, hyph: false });\n      continue;\n    }\n    // \u7A7A\u683C\u3001\u6807\u70B9\u3001\u6570\u5B57\uFF1A\u8DF3\u8FC7\uFF08\u4EE5\u540E\u53EF\u4EE5\u53D8\u6210\u547C\u5438\u8BB0\u53F7\uFF09\n  }\n  return out;\n}\n\nconst lyricSlot = (t: Token): t is NoteTok => t.kind === \"note\" && !t.tie;\n\n/** \u4ECE\u4E0B\u6807 start \u8D77\uFF08\u542B\uFF09\u5F80\u540E\u628A\u97F3\u8282\u8D34\u5230\u97F3\u7B26\u4E0A\uFF1B\u4E0D\u591F\u5C31\u5728\u672B\u5C3E\u8865\u7A7A\u97F3\u9AD8\u7684\u65B0\u97F3\u3002\u8FD4\u56DE\u65B0\u72B6\u6001 + \u6700\u540E\u8D34\u5230\u7684\u4E0B\u6807\u3002 */\nexport function distributeFrom(st: EditorState, start: number, syl: Syl[]): { st: EditorState; last: number } {\n  const tokens: Token[] = tr(st).slice();\n  let nextId = st.nextId, i = start, last = -1;\n  for (const s of syl) {\n    while (i < tokens.length && !lyricSlot(tokens[i])) i++;\n    if (i < tokens.length) tokens[i] = { ...(tokens[i] as NoteTok), lyric: s.text, hyph: s.hyph || undefined };\n    else tokens.push({ kind: \"note\", id: nextId++, pitch: null, dur: unitDur(st.input), lyric: s.text, hyph: s.hyph || undefined });\n    last = i; i++;\n  }\n  return { st: { ...st, song: withTrack(st.song, st.at.paper, st.at.part, tokens), nextId }, last };\n}\n\n/** \u4E00\u6574\u884C\u6B4C\u8BCD\u8D34\u5230\u8C31\u4E0A\uFF08\u7C98\u8D34\u7528\uFF09\uFF1A\u5149\u6807\u540E\u7B2C\u4E00\u4E2A\u97F3\u8D77\uFF1B\u5149\u6807\u5728\u672B\u5C3E\u65F6\u4ECE\u7B2C\u4E00\u4E2A\u8FD8\u6CA1\u6709\u6B4C\u8BCD\u7684\u97F3\u8D77\u3002\u5149\u6807\u4E0D\u52A8\uFF08\u8A5E\u5148\u4E4B\u540E\u63A5\u7740\u7528\u6570\u5B57\u586B\u97F3\u9AD8\uFF09\u3002 */\nexport function applyLyricLine(st: EditorState, text: string): EditorState {\n  const syl = splitSyllables(text);\n  if (!syl.length) return st;\n  const tokens = tr(st);\n  let start: number;\n  if (st.caret >= tokens.length && !st.sel) { start = tokens.findIndex((t) => lyricSlot(t) && t.lyric === null); if (start < 0) start = tokens.length; }\n  else start = st.sel ? st.sel.from : st.caret;\n  return distributeFrom(st, start, syl).st;\n}\n\n/** \u300C+\u300D\u5F00\u5934\u7684\u90A3\u4E2A\u5B57\u5E76\u8FDB\u4E0B\u6807 i \u4E4B\u524D\u6700\u8FD1\u7684\u90A3\u4E2A\u6709\u6B4C\u8BCD\u7684\u97F3\uFF08\u6B4C\u8BCD\u6846\u5DF2\u7ECF\u8DF3\u5230\u4E0B\u4E00\u4E2A\u97F3\u4E86\uFF09\uFF1B\u524D\u9762\u6CA1\u6709 = \u539F\u6837\u3002 */\nexport function joinIntoPrev(st: EditorState, i: number, text: string): EditorState {\n  const p = prevLyricSlot(tr(st), i), t = tr(st)[p] as NoteTok | undefined;\n  if (!t || !t.lyric || t.lyric === MELISMA_MARK) return st;\n  const tokens = tr(st).slice();\n  tokens[p] = { ...t, lyric: t.lyric + ELISION + text };\n  return { ...st, song: withTrack(st.song, st.at.paper, st.at.part, tokens) };\n}\n/** \u300C\u5408\u300D\uFF1A\u4E0B\u6807 i \u90A3\u4E2A\u97F3\u7684\u5B57\u5E76\u8FDB\u524D\u4E00\u4E2A\u6709\u5B57\u7684\u97F3\uFF08\u4E00\u4E2A\u97F3\u4E0A\u51E0\u4E2A\u5B57\uFF09\uFF0C\u8FD9\u4E00\u53E5\uFF08\u5230\u4E0B\u4E00\u4E2A\u4F11\u6B62\u4E3A\u6B62\uFF09\u540E\u9762\u7684\u5B57\u4F9D\u6B21\u5F80\u524D\u632A\u4E00\u4E2A\u97F3\u3001\u8FD9\u4E00\u53E5\u6700\u540E\u4E00\u4E2A\u97F3\u7A7A\u51FA\u6765\n *  \uFF08user\u300C\u6253\u5B8C\u56DE\u5934\u6539\u540C\u610F\u3002\u8FD9\u91CC\u7684\u5FC3\u6D41\u53CD\u800C\u662F\u8F93\u5165\u3002\u6240\u4EE5\u4E0D\u5E94\u8BE5\u63D0\u524D\u6309\u300D\uFF1A\u6253\u5B57\u7167\u5E38\u81EA\u52A8\u5206\uFF0C\u56DE\u5934\u70B9\u4E00\u4E2A\u5B57\u518D\u5408\uFF09\u3002\u8FD9\u4E2A\u97F3 / \u524D\u4E00\u4E2A\u97F3\u6CA1\u6709\u5B57\uFF08\u6216\u662F\u62D6\u8154\uFF09= \u539F\u6837\u3002 */\nexport function mergeIntoPrev(st: EditorState, i: number): EditorState {\n  const toks = tr(st), cur = toks[i], p = prevLyricSlot(toks, i), prev = toks[p];\n  if (!cur || !lyricSlot(cur) || !cur.lyric || cur.lyric === MELISMA_MARK || !prev || !lyricSlot(prev) || !prev.lyric || prev.lyric === MELISMA_MARK) return st;\n  const slots = [i];   // \u8FD9\u4E00\u53E5\u540E\u9762\u7684\u6B4C\u8BCD\u4F4D\uFF1A\u4ECE i \u5F80\u540E\u3001\u5230\u4E0B\u4E00\u4E2A\u300C\u53E5\u300D\u4E3A\u6B62\uFF08\u8DE8\u4F11\u6B62\u7B26\uFF1Buser 2026-10-08\u300C\u5E94\u8BE5\u8DE8\u4F11\u6B62\u7B26\u300D\uFF1B\u6B64\u524D\u5230\u4F11\u6B62\u4E3A\u6B62\uFF09\n  for (let j = i + 1; j < toks.length; j++) { const t = toks[j]; if (t.kind === \"phrase\") break; if (lyricSlot(t)) slots.push(j); }\n  const tokens = toks.slice();\n  const merged: NoteTok = { ...prev, lyric: prev.lyric + ELISION + cur.lyric };\n  if (cur.hyph) merged.hyph = true; else delete merged.hyph;\n  tokens[p] = merged;\n  slots.forEach((at, k) => {   // \u5B57\u5F80\u524D\u632A\u4E00\u4E2A\u97F3\uFF08\u300C\u8BCD\u6CA1\u5B8C\u300D\u548C\u624B\u52A8\u6539\u8FC7\u7684\u8BED\u8A00\u8DDF\u7740\u5B57\u8D70\uFF09\n    const from = k + 1 < slots.length ? (toks[slots[k + 1]] as NoteTok) : null, t: NoteTok = { ...(toks[at] as NoteTok), lyric: from ? from.lyric : null };\n    if (from?.hyph) t.hyph = true; else delete t.hyph;\n    if (from?.lang) t.lang = from.lang; else delete t.lang;\n    tokens[at] = t;\n  });\n  return { ...st, song: withTrack(st.song, st.at.paper, st.at.part, tokens) };\n}\n/** \u4E00\u4E2A\u97F3\u4E0A\u7684\u300C\u4E00\u9897\u5B57\u300D\uFF1A\u5B57 + \u8BCD\u6CA1\u5B8C + \u624B\u52A8\u6539\u8FC7\u7684\u8BED\u8A00\uFF08\u632A\u7684\u65F6\u5019\u4E00\u8D77\u8D70\uFF09\u3002 */\ninterface Bead { lyric: string | null; hyph?: boolean; lang?: string }\nconst beadOf = (t: NoteTok): Bead => ({ lyric: t.lyric, hyph: t.hyph, lang: t.lang });\nfunction put(t: NoteTok, b: Bead): NoteTok {\n  const o: NoteTok = { ...t, lyric: b.lyric };\n  if (b.hyph) o.hyph = true; else delete o.hyph;\n  if (b.lang) o.lang = b.lang; else delete o.lang;\n  return o;\n}\nconst hasText = (t: Token | undefined): boolean => !!t && t.kind === \"note\" && !!t.lyric && t.lyric !== MELISMA_MARK;\n/** \u8FD9\u4E00\u53E5\u91CC i \u540E\u9762\u7684\u6B4C\u8BCD\u4F4D\uFF08\u5230\u300C\u53E5\u300D\u4E3A\u6B62\uFF09/ i \u524D\u9762\u6700\u8FD1\u7684\u90A3\u4E2A\uFF08\u9694\u7740\u300C\u53E5\u300D= -1\uFF09\u3002 */\nfunction slotsAfter(toks: Token[], i: number): number[] { const out: number[] = []; for (let j = i + 1; j < toks.length; j++) { if (toks[j].kind === \"phrase\") break; if (lyricSlot(toks[j])) out.push(j); } return out; }\nfunction slotBefore(toks: Token[], i: number): number { for (let j = i - 1; j >= 0; j--) { if (toks[j].kind === \"phrase\") return -1; if (lyricSlot(toks[j])) return j; } return -1; }\n/** \u5F80\u540E\u4E00\u4E2A\u97F3\uFF1A\u8FD9\u4E2A\u5B57\u665A\u4E00\u4E2A\u97F3\u8D77\u3002\u540E\u9762\u7684\u5B57\u88AB\u63A8\u7740\u8D70\uFF0C\u63A8\u5230\u7B2C\u4E00\u4E2A\u7A7A\u7740\u7684\u97F3\uFF08\u6CA1\u5B57 / \u62D6\u8154\uFF09\u4E3A\u6B62\uFF0C\u90A3\u4E2A\u7A7A\u4F4D\u88AB\u5403\u6389\uFF1B\n *  \u7A7A\u51FA\u6765\u7684\u97F3 = \u62D6\u8154\uFF08\u524D\u9762\u8FD9\u4E00\u53E5\u91CC\u6709\u5B57\u53EF\u62D6\uFF09\uFF0C\u5426\u5219\u7A7A\u7740\u3002\u4E00\u4E2A\u97F3\u4E0A\u51E0\u4E2A\u5B57\uFF08\u5408\u8FC7\u7684\uFF09= \u53EA\u62FF\u6700\u540E\u4E00\u4E2A\u5B57\u5F80\u540E\u632A\uFF08\u300C\u5408\u300D\u7684\u53CD\u64CD\u4F5C\uFF09\u3002\u63A8\u4E0D\u52A8\uFF08\u540E\u9762\u6CA1\u7A7A\u4F4D / \u662F\u53E5\u5C3E\uFF09= null\u3002 */\nfunction stepRight(st: EditorState, i: number): { st: EditorState; at: number } | null {\n  const toks = tr(st), cur = toks[i];\n  if (!cur || !lyricSlot(cur) || !hasText(cur)) return null;\n  const after = slotsAfter(toks, i), g = after.findIndex((j) => !hasText(toks[j]));\n  if (g < 0) return null;\n  const tokens = toks.slice(), parts = cur.lyric!.split(ELISION);\n  let carry: Bead;\n  if (parts.length > 1) { carry = { lyric: parts[parts.length - 1], hyph: cur.hyph, lang: cur.lang }; tokens[i] = put(cur, { lyric: parts.slice(0, -1).join(ELISION), lang: cur.lang }); }\n  else { carry = beadOf(cur); const p = slotBefore(toks, i); tokens[i] = put(cur, { lyric: p >= 0 && (toks[p] as NoteTok).lyric !== null ? MELISMA_MARK : null }); }\n  for (let n = 0; n <= g; n++) { const t = tokens[after[n]] as NoteTok, was = beadOf(t); tokens[after[n]] = put(t, carry); carry = was; }\n  return { st: { ...st, song: withTrack(st.song, st.at.paper, st.at.part, tokens) }, at: after[0] };\n}\n/** \u5F80\u524D\u4E00\u4E2A\u97F3\uFF1A\u90A3\u4E2A\u97F3\u6709\u5B57 =\u300C\u5408\u300D\uFF08mergeIntoPrev\uFF1A\u5E76\u6210\u4E00\u4E2A\u97F3\u4E0A\u51E0\u4E2A\u5B57\uFF0C\u8FD9\u4E00\u53E5\u540E\u9762\u7684\u5B57\u5F80\u524D\u632A\uFF09\uFF1B\u7A7A\u7740 / \u62D6\u8154 = \u8FD9\u4E2A\u5B57\u65E9\u4E00\u4E2A\u97F3\u8D77\uFF0C\u539F\u6765\u90A3\u4E2A\u97F3\u53D8\u6210\u5B83\u7684\u62D6\u8154\u3002 */\nfunction stepLeft(st: EditorState, i: number): { st: EditorState; at: number; merged: boolean } | null {\n  const toks = tr(st), cur = toks[i];\n  if (!cur || !lyricSlot(cur) || !hasText(cur)) return null;\n  const p = slotBefore(toks, i);\n  if (p < 0) return null;\n  if (hasText(toks[p])) { const n = mergeIntoPrev(st, i); return n === st ? null : { st: n, at: p, merged: true }; }\n  const tokens = toks.slice();\n  tokens[p] = put(toks[p] as NoteTok, beadOf(cur)); tokens[i] = put(cur, { lyric: MELISMA_MARK });\n  return { st: { ...st, song: withTrack(st.song, st.at.paper, st.at.part, tokens) }, at: p, merged: false };\n}\n/** \u957F\u6309\u4E00\u4E2A\u5B57\u62D6\uFF082026-10-08 Opus 5.5\uFF1Buser\u300C\u6B4C\u8BCD\u7684\u5408\u80FD\u4E0D\u80FD\u4E5F\u6539\u6210\u957F\u6309\u62D6\u52A8\u3002\u4E0D\u7136\u6BCF\u6B21\u70B9\u6587\u672C\u6846\u662F\u8D85\u7EA7\u9EBB\u70E6\u7684\u300D\uFF09\uFF1A\u4E0B\u6807 i \u90A3\u4E2A\u97F3\u4E0A\u7684\u5B57\u632A k \u4E2A\u97F3\uFF08k > 0 \u5F80\u540E\u3001k < 0 \u5F80\u524D\uFF09\uFF0C\n *  \u4E00\u6B65\u4E00\u6B65\u8D70\uFF08\u89C1 stepRight / stepLeft\uFF09\uFF0C\u90FD\u53EA\u5728\u8FD9\u4E00\u53E5\u91CC\uFF08\u53E5\u53F7\u662F\u8FB9\u754C\uFF09\u3002\u300C\u5408\u300D\u4E86\u5C31\u505C\uFF08\u5B57\u5DF2\u7ECF\u4E0D\u5355\u72EC\u5728\u4E00\u4E2A\u97F3\u4E0A\u4E86\uFF09\uFF1B\u63A8\u4E0D\u52A8\u4E5F\u505C\u3002\n *  \u8FD4\u56DE at = \u5B57\u73B0\u5728\u5728\u54EA\u4E2A\u97F3\u3001done = \u5B9E\u9645\u8D70\u4E86\u51E0\u6B65\uFF08< |k| = \u6CA1\u8D70\u5B8C\uFF0C\u8C03\u7528\u65B9\u8BF4\u4E00\u58F0\uFF09\u3002 */\nexport function moveSyllable(st: EditorState, i: number, k: number): { st: EditorState; at: number; done: number } {\n  let cur = st, at = i, done = 0;\n  for (; done < Math.abs(k); done++) {\n    if (k > 0) { const r = stepRight(cur, at); if (!r) break; cur = r.st; at = r.at; }\n    else { const r = stepLeft(cur, at); if (!r) break; cur = r.st; at = r.at; if (r.merged) { done++; break; } }\n  }\n  return { st: cur, at, done };\n}\n/** \u4E0B\u4E00\u4E2A\u80FD\u653E\u6B4C\u8BCD\u7684\u97F3\uFF08\u8DF3\u8FC7\u4F11\u6B62\u3001\u5C0F\u8282\u7EBF\u3001\u8C03\u53F7\u3001tie \u97F3\uFF09\uFF1B\u6CA1\u6709 = -1\u3002 */\nexport function nextLyricSlot(tokens: Token[], i: number): number { for (let j = i + 1; j < tokens.length; j++) if (lyricSlot(tokens[j])) return j; return -1; }\nexport function prevLyricSlot(tokens: Token[], i: number): number { for (let j = i - 1; j >= 0; j--) if (lyricSlot(tokens[j])) return j; return -1; }\nexport { lyricSlot };\n", "// lyric-check.ts \u2014\u2014 \u53F0\u4E0A\u8FD9\u4F4D\u5531\u4E0D\u51FA\u6765\u7684\u6B4C\u8BCD\uFF08\u753B\u7070 + \u660E\u8BF4\uFF09\u3002created 2026-10-08 by Claude Opus 5.5\n// \u7EAA\u5F8B\uFF08user 2026-10-08\u300C\u4E0D\u80FD\u6210\u529F\u53D1\u97F3\u8BC6\u522B\u7684\u6B4C\u8BCD\u4E5F\u6807\u7070\uFF0C\u6211\u89C9\u5F97\u8FD9\u4E2A\u53EF\u4EE5\u53D8\u6210\u8FD9\u4E2A\u9879\u76EE\u7684\u7EAA\u5F8B\u4E86\u54C8\u54C8\u300D\uFF1BCLAUDE.md\u300C\u7EAA\u5F8B\uFF1A\u505A\u4E0D\u5230\u7684\u4E00\u5F8B\u753B\u7070 + \u660E\u8BF4\u300D\uFF09\uFF1A\n//   \u7167\u5199\u3001\u7167\u5B58\u3001\u4E0D\u66FF\u4EBA\u6539\uFF0C\u53EA\u662F\u5728\u8C31\u4E0A\u753B\u7070\u3001\u5728\u770B\u5F97\u89C1\u7684\u5730\u65B9\u8BF4\u6E05\u695A\u4E3A\u4EC0\u4E48\u3002\n// \u53EA\u6709\u6708\u8BFB\u5531\u5B57\uFF1A\u5143\u97F3\u7248\u53EA\u54FC\uFF08\u3089 / \u3093 / \u3046 / \u3042\uFF09\u3001\u4E50\u5668\u4E0D\u5531 \u2192 \u6574\u6761\u6B4C\u8BCD\u90FD\u7070\uFF08\u8FD9\u4F4D\u4E0D\u5531\u5B57\uFF09\u3002\n// \u8BED\u8A00\u6309\u5C0F\u6708\u76F8\u5531\u7684\u90A3\u4E00\u6BB5\u5224\uFF08engine/timeline.ts sungPlan\uFF1A\u4E00\u6BB5\u91CC\u6709\u5047\u540D = \u65E5\u3001\u53EA\u6709\u6C49\u5B57 = \u4E2D\u3001\u53EA\u6709\u5B57\u6BCD = \u82F1\uFF1B\u5531\u548C\u753B\u7070\u540C\u4E00\u4EFD\uFF09\uFF0ClangAt \u7531\u8C03\u7528\u65B9\u7ED9\u3002\n//   2026-10-13 \u4E4B\u524D\u6574\u6761\u58F0\u90E8\u4E00\u79CD\u8BED\u8A00\uFF08songLangOf\uFF09\uFF1A\u65E5\u6587\u6B4C\u6362\u4E2D\u6587\u7FFB\u8BD1\u65F6\u6BCF\u4E2A\u6C49\u5B57\u90FD\u7070\uFF08user\u300C\u6BCF\u4E00\u6BB5\u91CC\u9762\u6709\u5047\u540D\u5C31\u7B97\u65E5\u6587\u300D\u300C\u5C31\u662F\u53E5\u5B50\u7684\u5355\u4F4D\u300D\u300C\u7528\u540C\u4E00\u4E2A\u6DF1\u6A21\u5757\u300D\uFF1Bedited by Claude Fable 5.1 / Claude Opus 5.5\uFF09\u3002\n// \u5531\u6CD5\u6838\u5FC3\u6309\u8BFB\u97F3\u6570\u62CD\uFF0C\u4E00\u4E2A\u97F3\u4E00\u62CD\uFF08src/singer/sing-core.mjs\u300Csung syllables in the text\u300D\uFF09\uFF1A\n//   \u65E5\u8BED\uFF1A\u6C49\u5B57\u7684\u8BFB\u97F3\u51E0\u62CD\u8BF4\u4E0D\u51C6\uFF08\u661F = \u307B\u3057 \u4E24\u62CD\uFF09\u3001\u5B57\u6BCD / \u6570\u5B57\u4F1A\u88AB\u5FF5\u6210\u522B\u7684\u3001\u4E00\u4E2A\u97F3\u4E0A\u4E24\u62CD\uFF08\u30E9\u30FC\uFF09\u2192 \u62CD\u6570\u5BF9\u4E0D\u4E0A\uFF0C\u6574\u6761\u4E0D\u51FA\u58F0\uFF1B\n//   \u4E2D\u6587\uFF1A\u4E00\u4E2A\u97F3\u4E00\u4E2A\u6C49\u5B57\uFF1B\u82F1\u6587\uFF1A\u62C9\u4E01\u5B57\u6BCD\uFF08\u8BCD\u5178\u67E5\u4E0D\u5230\u7684\u73B0\u5728\u67E5\u4E0D\u51FA\u6765\uFF09\u3002\u5C0F\u5B57 / \u4FC3\u97F3\u81EA\u5DF1\u5360\u4E00\u4E2A\u97F3\u662F\u53EF\u4EE5\u7684\uFF08lab-score \u515C\u4F4F\uFF09\u3002\nimport type { Token } from \"./song.ts\";\nimport { MELISMA_MARK, ELISION, isSmallKana } from \"./lyrics.ts\";\n\nexport type LyricWhy = \"notSung\" | \"kanji\" | \"beats\" | \"script\";\nexport type LyricLang = \"ja\" | \"zh\" | \"en\";\nexport interface LyricIssue { why: LyricWhy; beats?: number; /** \u8FD9\u4E2A\u5B57\u6240\u5728\u7684\u53E5\u6309\u54EA\u79CD\u8BED\u8A00\u5531\uFF08\u63D0\u793A\u6587\u6848\u7528\uFF09\u3002 */ lang: LyricLang }\nconst HAN = /\\p{Script=Han}/u, KANA = /[\u3040-\u30FF]/, LATIN = /[A-Za-z]/;\n\n/** \u4E00\u6BB5\u5047\u540D\u51E0\u62CD\uFF1A\u5C0F\u5B57\uFF08\u3083 / \u3063\u2026\uFF09\u4E0D\u7B97\u3001\u30FC \u7B97\u4E00\u62CD\u3002 */\nexport const kanaBeats = (s: string): number => [...s].filter((c) => !isSmallKana(c)).length;\n\n/** engine = \u53F0\u4E0A\u8FD9\u4F4D\u7684\u5F15\u64CE\uFF08tsukuyomi / vowel-sampler / soundfont\uFF1B\u6CA1\u4EBA / \u8BA4\u4E0D\u51FA = \u4E0D\u9010\u4E2A\u753B\u7070\uFF0C\u6574\u6761\u672C\u6765\u5C31\u4E0D\u51FA\u58F0\uFF09\uFF1BlangAt = \u4E0B\u6807 i \u7684\u5B57\u6240\u5728\u7684\u53E5\u6309\u54EA\u79CD\u8BED\u8A00\u5531\uFF08\u4E00\u79CD\u8BED\u8A00\u4E5F\u884C\uFF1A\u76F4\u63A5\u7ED9\u5B57\u7B26\u4E32\uFF09\u3002\n *  \u8FD4\u56DE \u4E0B\u6807 \u2192 \u4E3A\u4EC0\u4E48\u3002 */\n/** lyrics = \u53F0\u4E0A\u8FD9\u4F4D\u5531\u4E0D\u5531\u5B57\uFF08\u63D2\u4EF6\u80FD\u529B\uFF0CADR-0004\uFF1Awords \u5531\u5B57 / hum \u53EA\u54FC / none \u4E0D\u5531\uFF09\uFF1Bnull = \u6CA1\u4EBA\u4E0A\u573A = \u4E0D\u753B\u7070\uFF08\u7167\u65E7\u80FD\u5199\uFF0C\u591A\u534A\u7B49\u7740\u8BF7\u4EBA\uFF09\u3002 */\nexport function lyricIssues(tokens: Token[], lyrics: \"words\" | \"hum\" | \"none\" | null | undefined, langAt: LyricLang | ((i: number) => LyricLang)): Map<number, LyricIssue> {\n  const out = new Map<number, LyricIssue>();\n  if (!lyrics) return out;\n  tokens.forEach((t, i) => {\n    if (t.kind !== \"note\" || t.tie || !t.lyric || t.lyric === MELISMA_MARK) return;\n    const lang = typeof langAt === \"string\" ? langAt : langAt(i);\n    if (lyrics !== \"words\") { out.set(i, { why: \"notSung\", lang }); return; }\n    for (const part of t.lyric.split(ELISION).filter(Boolean)) {\n      if (lang === \"ja\") {\n        if (isSmallKana(part)) continue;   // \u5C0F\u5B57 / \u4FC3\u97F3\u81EA\u5DF1\u5360\u4E00\u4E2A\u97F3\uFF1A\u5531\u7684\u90A3\u4E00\u8DEF\u5E76\u8FDB\u524D\u4E00\u4E2A\u97F3\u8282\n        if (HAN.test(part)) { out.set(i, { why: \"kanji\", lang }); return; }\n        if (!/^[\u3040-\u30FF\u30FC]+$/.test(part)) { out.set(i, { why: \"script\", lang }); return; }\n        const b = kanaBeats(part); if (b !== 1) { out.set(i, { why: \"beats\", beats: b, lang }); return; }\n      } else if (lang === \"zh\") {\n        if (KANA.test(part) || LATIN.test(part) || !HAN.test(part)) { out.set(i, { why: \"script\", lang }); return; }\n        const b = [...part].filter((c) => HAN.test(c)).length; if (b !== 1) { out.set(i, { why: \"beats\", beats: b, lang }); return; }\n      } else if (HAN.test(part) || KANA.test(part) || !LATIN.test(part)) { out.set(i, { why: \"script\", lang }); return; }\n    }\n  });\n  return out;\n}\n\n/** \u7ED9\u4EBA\u770B\u7684\u90A3\u53E5\u8BDD\u3002 */\nexport function lyricWhyText(x: LyricIssue, engineName: string): string {\n  if (x.why === \"notSung\") return `${engineName}\u4E0D\u5531\u6B4C\u8BCD\uFF08\u53EA\u54FC / \u53EA\u5F39\uFF09\uFF1B\u6B4C\u8BCD\u7167\u5199\u7167\u5B58`;\n  if (x.why === \"kanji\") return \"\u8FD9\u4E00\u6BB5\u6709\u5047\u540D\u3001\u6309\u65E5\u8BED\u5531\uFF1A\u6C49\u5B57\u5C0F\u6708\u76F8\u6309\u8BFB\u97F3\u6570\u62CD\uFF0C\u4E00\u4E2A\u5B57\u53EF\u80FD\u597D\u51E0\u62CD\u3001\u5BF9\u4E0D\u4E0A\u97F3\u2014\u2014\u5199\u6210\u5047\u540D\uFF08\u4E00\u6BB5\u90FD\u662F\u6C49\u5B57\u624D\u6309\u4E2D\u6587\u5531\uFF1B\u6BB5 = \u6B4C\u624B\u724C\u91CC\u7684\u300C\u5206\u6BB5\u5531\u300D\uFF09\";\n  if (x.why === \"beats\") return `\u4E00\u4E2A\u97F3\u4E0A ${x.beats} \u62CD\uFF1A\u5C0F\u6708\u76F8\u4E00\u4E2A\u97F3\u5531\u4E00\u62CD\u2014\u2014\u62C6\u6210 ${x.beats} \u4E2A\u97F3\uFF0C\u6216\u8005\u7528\u300C+\u300D\u8FDE\u7740\u5199`;\n  return x.lang === \"ja\" ? \"\u8FD9\u4E00\u6BB5\u6309\u65E5\u8BED\u5531\uFF1A\u5B57\u6BCD / \u6570\u5B57 / \u7B26\u53F7\u5FF5\u4E0D\u51C6\u2014\u2014\u5199\u6210\u5047\u540D\" : x.lang === \"zh\" ? \"\u8FD9\u4E00\u6BB5\u6309\u4E2D\u6587\u5531\uFF1A\u4E00\u4E2A\u97F3\u5199\u4E00\u4E2A\u6C49\u5B57\" : \"\u8FD9\u4E00\u6BB5\u6309\u82F1\u6587\u5531\uFF1A\u5199\u62C9\u4E01\u5B57\u6BCD\";\n}\n\n/** \u5F15\u64CE\u5FF5\u6210\u4EC0\u4E48\u7684\u663E\u793A\uFF08v0.9.34\uFF0C\u6B4C\u8BCD\u6846\u4E0B\u9762\u90A3\u6761\uFF09\uFF1A\u65E5\u8BED\u524D\u7AEF\u7684\u97F3\u7D20\u5199\u6210\u597D\u8BA4\u7684\u6837\u5B50\u2014\u2014\u3093\uFF08N_n / N_m / N_ng\u2026\uFF09= n\uFF0C\u4FC3\u97F3 cl = \u53CC\u5199\u4E0B\u4E00\u4E2A\u8F85\u97F3\uFF08cl + ch = tch\uFF09\uFF1B\n *  \u51E0\u62CD\u7684\u300C-\u300D\u7167\u7559\u3002\u4E2D\u6587\u7167\u539F\u6837\uFF08\u56FD\u9645\u97F3\u6807 + \u58F0\u8C03\u6570\u5B57\uFF0C\u4E0D\u786C\u8F6C\u62FC\u97F3\uFF1A\u8F6C\u9519\u4E86\u6BD4\u4E0D\u8F6C\u66F4\u8BEF\u5BFC\uFF09\u3002 */\nexport function prettyReading(lang: string, x: string): string {\n  return lang !== \"ja\" ? x : x.split(\"-\").map((y) => y.replace(/N_[a-z]+/g, \"n\").replace(/^clch/, \"tch\").replace(/^cl([a-z])/, \"$1$1\")).join(\"-\");\n}\n", "// \u751F\u6210\u7269\uFF1Anode scripts/gen-packs.mjs\uFF08\u6E90 = ../20260903 PWA Models \u7684 packs/*/manifest.json + voices/tsukuyomi-chan-zhen.json \u7684\u7F72\u540D\uFF09\u3002\u52FF\u624B\u6539\u3002\n// packId = sha256(manifest.json \u539F\u5B57\u8282) = app \u9489\u6B7B\u7684\u4FE1\u4EFB\u6839\u3002\nimport type { EmbeddedPack } from \"@internal/model-packs\";\nexport const SINGER = {\"voice\":\"voice-tsukuyomi-chan-zhen-dur-6lang-fp16-20261007\",\"runtime\":\"runtime-onnxruntime-web-1.30.0-20261001\",\"lang\":{\"ja\":\"lang-ja-pyopenjtalk-plus-0.4.1.post9-20261001\",\"zh\":\"lang-zh-pinyin-20261001\",\"en\":\"lang-en-cmudict-20261001\"}} as const;\nexport const PACKS: Record<string, EmbeddedPack> = {\n  \"voice-tsukuyomi-chan-zhen-dur-6lang-fp16-20261007\": {\"packId\":\"56d81c8eb51e693e937397e2557ac3af4dff328e420b761c6e5df8b8b5b80ca6\",\"manifest\":{\"chunkBytes\":25165824,\"chunks\":[{\"bytes\":25165824,\"name\":\"chunk-000\",\"sha256\":\"269d70de8efb9ef41cdfd5de0a4acd220eb263163c8d1586c2b627c8cb1eaec6\"},{\"bytes\":14503410,\"name\":\"chunk-001\",\"sha256\":\"56131bbd5133d34a5d7cf4bd668c83a2da1fe8157fbbb849a94c4d1b9569b4ff\"}],\"createdAt\":\"2026-10-07\",\"createdBy\":\"tools/pack.py (Claude Fable 5.1)\",\"engine\":\"piper-plus\",\"engineConfig\":{\"kind\":\"piper-plus-voice\",\"sampleRate\":22050,\"speakers\":1},\"files\":[{\"bytes\":39662905,\"offset\":0,\"path\":\"model.onnx\",\"sha256\":\"d10f3806abeda0ec9ee294d0e39ef5f3884c47b4b09028d23375b71db4107712\"},{\"bytes\":6329,\"offset\":39662905,\"path\":\"config.json\",\"sha256\":\"f6a373726beef08f9094e97f434185b1f9840b76ced0a73281fc40023b02d02d\"}],\"lang\":[\"ja\",\"en\",\"zh\",\"es\",\"fr\",\"pt\"],\"license\":{\"attribution\":\"\u3064\u304F\u3088\u307F\u3061\u3083\u3093\u30B3\u30FC\u30D1\u30B9\uFF08CV.\u5922\u524D\u9ECE\uFF09https://tyc.rei-yumesaki.net/material/corpus/ \uFF1Bmodel: derivative of ayousanz/piper-plus-tsukuyomi-chan; zh/en language vectors from ayousanz/piper-plus-base (CC-BY-4.0)\",\"file\":\"LICENSE.txt\",\"name\":\"\u3064\u304F\u3088\u307F\u3061\u3083\u3093\u30B3\u30FC\u30D1\u30B9\u5229\u7528\u898F\u7D04\uFF08\u884D\u751F\u6A21\u578B\uFF1Bmodel card: license other / tsukuyomi-chan-corpus\uFF09+ base model CC-BY-4.0\",\"sha256\":\"ff76774a797dfedbd00d6b0b167cebf5ceb341d380d865ed4cba495310ace4d9\"},\"name\":\"\u6708\u8BFB\uFF08\u4E2D\u82F1\u589E\u5F3A\uFF0C\u65F6\u957F\u53EF\u63A5\u7BA1\uFF09\u2014 \u3064\u304F\u3088\u307F\u3061\u3083\u3093 piper-plus \u516D\u8BED\u5355\u97F3\u8272\uFF0Cfp16\uFF0C\u4E2D\u82F1\u6539\u8BFB\u5E95\u6A21\u7684\u8BED\u8A00\u5411\u91CF + dur_override \u8F93\u5165\uFF08\u5531\u6B4C\u7528\uFF09\",\"notes\":\"Modified model (see LICENSE.txt \u00A7[4]). Needs the runtime pack (onnxruntime-web) and one text-frontend pack per language. With dur_override all zeros it reads exactly like voice-tsukuyomi-chan-zhen-6lang-fp16-20261002. The credit block and the four prohibited uses must be shown in the product UI.\",\"sha256\":\"466803b3eba2be734c26955c1b701a7e64e566a3e997474c4c744666768e56f9\",\"slug\":\"voice-tsukuyomi-chan-zhen-dur-6lang-fp16-20261007\",\"source\":{\"converted\":\"dur_override input on top of voice-tsukuyomi-chan-zhen-6lang-fp16-20261002 (see LICENSE.txt \u00A7[4]); all zeros = that pack, sample-identical\",\"file\":\"voice-tsukuyomi-chan-zhen-6lang-fp16-20261002/model.onnx @ sha256 ae7ab68a\u2026 + piper-plus/dur-override-exp/make_dur_override.py; config.json = that pack's\",\"model\":\"https://huggingface.co/ayousanz/piper-plus-tsukuyomi-chan\"},\"task\":\"tts\",\"totalBytes\":39669234,\"v\":1}},\n  \"runtime-onnxruntime-web-1.30.0-20261001\": {\"packId\":\"f76668f9383b922aef483f4c0a374fb727b9a9203d230cb2fceabb34fc4459be\",\"manifest\":{\"chunkBytes\":25165824,\"chunks\":[{\"bytes\":3687160,\"name\":\"chunk-000\",\"sha256\":\"09e7a4d1376f589d6f6d4005d49db7d33b707175acb13e475c8a47858efdf788\"}],\"createdAt\":\"2026-10-01\",\"createdBy\":\"tools/pack.py (Claude Fable 5.1)\",\"engine\":\"onnxruntime-web\",\"engineConfig\":{\"kind\":\"wasm-runtime\",\"version\":\"1.30.0\"},\"files\":[{\"bytes\":3687160,\"offset\":0,\"path\":\"ort-wasm-simd-threaded.wasm.gz\",\"sha256\":\"09e7a4d1376f589d6f6d4005d49db7d33b707175acb13e475c8a47858efdf788\"}],\"lang\":[\"\"],\"license\":{\"attribution\":\"ONNX Runtime (Microsoft)\",\"file\":\"LICENSE.txt\",\"name\":\"MIT (Microsoft, onnxruntime)\",\"sha256\":\"2f07c72751aed99790b8a4869cf2311df85a860b22ded05fa22803587a48922c\"},\"name\":\"onnxruntime-web 1.30.0\uFF08WASM \u63A8\u7406\u8FD0\u884C\u65F6\uFF0C\u5355\u7EBF\u7A0B SIMD\uFF09\",\"notes\":\"Engine binary. The matching JS glue (ort.wasm.bundle.min.mjs) is vendored in the app, not in this pack.\",\"sha256\":\"09e7a4d1376f589d6f6d4005d49db7d33b707175acb13e475c8a47858efdf788\",\"slug\":\"runtime-onnxruntime-web-1.30.0-20261001\",\"source\":{\"converted\":\"\",\"file\":\"dist/ort-wasm-simd-threaded.wasm (unmodified)\",\"model\":\"https://www.npmjs.com/package/onnxruntime-web/v/1.30.0\"},\"task\":\"runtime\",\"totalBytes\":3687160,\"v\":1}},\n  \"lang-ja-pyopenjtalk-plus-0.4.1.post9-20261001\": {\"packId\":\"b66632d8ab153a865e2727d745794da248a9c748558920bfd004443cdb9f2d4c\",\"manifest\":{\"chunkBytes\":25165824,\"chunks\":[{\"bytes\":24471527,\"name\":\"chunk-000\",\"sha256\":\"3e1d7f8ff18204a56d4170da09258cf655bb01bb61114bcd84e8bb2441941b60\"}],\"createdAt\":\"2026-10-01\",\"createdBy\":\"tools/pack.py (Claude Fable 5.1)\",\"engine\":\"piper-plus\",\"engineConfig\":{\"kind\":\"text-frontend\",\"lang\":\"ja\"},\"files\":[{\"bytes\":22438129,\"offset\":0,\"path\":\"ja/sys.dic.gz\",\"sha256\":\"b1804e8c2e6244bb36c7c24eb5af9d4307a80acfb481dcffdc71c7aa60ede055\"},{\"bytes\":1867237,\"offset\":22438129,\"path\":\"ja/matrix.bin.gz\",\"sha256\":\"824f60e50360fb2b186b16d1fe5fd6312919f03c33a73bc86ece37a301b3f0b8\"},{\"bytes\":643,\"offset\":24305366,\"path\":\"ja/char.bin.gz\",\"sha256\":\"335d6f4a6c6cd50ab1d0782dbf6b13ab9e2bed08ed1fd34c97d499d4a05fb665\"},{\"bytes\":782,\"offset\":24306009,\"path\":\"ja/unk.dic.gz\",\"sha256\":\"03721395b79e257fbd2b0e742a4faaed6073ecb79b0cf615fbe352995581b603\"},{\"bytes\":147207,\"offset\":24306791,\"path\":\"ja/ojt.wasm.gz\",\"sha256\":\"97a8738abbdc773b4785b1f6ba849c432a5764cf13c1637df4da630a82f45f8a\"},{\"bytes\":17529,\"offset\":24453998,\"path\":\"ja/nani-model.json.gz\",\"sha256\":\"0427c6cfe53f6c4d771f6c3e50fea06ddeaac96f5e24bdab4f49493395c9630a\"}],\"lang\":[\"ja\"],\"license\":{\"attribution\":\"Open JTalk (Nagoya Institute of Technology); MeCab (Taku Kudo, NTT); NAIST Japanese Dictionary; pyopenjtalk / pyopenjtalk-plus (tsukumijima et al.)\",\"file\":\"LICENSE.txt\",\"name\":\"Modified BSD (Open JTalk) + BSD (MeCab) + BSD-3-Clause style (NAIST-jdic / Open JTalk dictionary) + MIT (pyopenjtalk-plus)\",\"sha256\":\"b8dd3d66249df450fc71f3f8f8f29da02b5b01b8b47c03f412af8bc16090c1bb\"},\"name\":\"\u65E5\u8BED\u6587\u672C\u524D\u7AEF\uFF08OpenJTalk + pyopenjtalk-plus \u8BCD\u5178\uFF09\",\"notes\":\"ojt.wasm is an engine binary built on 2026-10-01 from the upstream sources (wrapper source: backend/vendor/ojt/ojt_wasm.c). 160 MB initial heap.\",\"sha256\":\"3e1d7f8ff18204a56d4170da09258cf655bb01bb61114bcd84e8bb2441941b60\",\"slug\":\"lang-ja-pyopenjtalk-plus-0.4.1.post9-20261001\",\"source\":{\"converted\":\"\",\"file\":\"dictionary: wheel pyopenjtalk/dictionary/; ojt.wasm: built from the sdist (sha256 cdcb0746659857554c6dad23956cad77e21f76c9f3dfa000ea2f8d4f0ba11d99) with Emscripten 6.0.10; nani-model.json: exported from pyopenjtalk/yomi_model/\",\"model\":\"https://pypi.org/project/pyopenjtalk-plus/0.4.1.post9/\"},\"task\":\"tts-frontend\",\"totalBytes\":24471527,\"v\":1}},\n  \"lang-zh-pinyin-20261001\": {\"packId\":\"a84c73d781c805a65b73deb3b39ac9f5fedd15f0cdf3d66b925005c8152af9e3\",\"manifest\":{\"chunkBytes\":25165824,\"chunks\":[{\"bytes\":686220,\"name\":\"chunk-000\",\"sha256\":\"acad023c61ddf4ed42720c63be1b35737cff734cbf4a6c8ab671b50f7fe39ae1\"}],\"createdAt\":\"2026-10-01\",\"createdBy\":\"tools/pack.py (Claude Fable 5.1)\",\"engine\":\"piper-plus\",\"engineConfig\":{\"kind\":\"text-frontend\",\"lang\":\"zh\"},\"files\":[{\"bytes\":186217,\"offset\":0,\"path\":\"zh/pinyin_single.tone3.json.gz\",\"sha256\":\"ec5c44ed3cd18eda41a04a7831f8d069600cdfb19e55e5b001a42bbdf3a4ad82\"},{\"bytes\":500003,\"offset\":186217,\"path\":\"zh/pinyin_phrases.tone3.json.gz\",\"sha256\":\"43dd0534a63c6bddb4c0f20ee88f19f5933875ff3979acc777652028a66f5ba8\"}],\"lang\":[\"zh\"],\"license\":{\"attribution\":\"pypinyin, pinyin-data, phrase-pinyin-data (mozillazg)\",\"file\":\"LICENSE.txt\",\"name\":\"MIT (pypinyin / pinyin-data / phrase-pinyin-data)\",\"sha256\":\"82783f291266e986df7494586db072217e2940227f93208f4f920a53b7a7d91e\"},\"name\":\"\u4E2D\u6587\u62FC\u97F3\u8BCD\u5178\uFF08pypinyin \u6570\u636E\uFF09\",\"notes\":\"Tone marks converted to tone-number style (the form the model's phoneme table expects).\",\"sha256\":\"acad023c61ddf4ed42720c63be1b35737cff734cbf4a6c8ab671b50f7fe39ae1\",\"slug\":\"lang-zh-pinyin-20261001\",\"source\":{\"converted\":\"\",\"file\":\"piper-plus 82ee4e7 src/rust/piper-plus-g2p/data/pinyin_{single,phrases}.json, tone marks converted to tone numbers\",\"model\":\"https://github.com/ayutaz/piper-plus\"},\"task\":\"tts-frontend\",\"totalBytes\":686220,\"v\":1}},\n  \"lang-en-cmudict-20261001\": {\"packId\":\"e54e7243870cef39d5015a51fe7fc57917da946908223a3d5baa5cab85956226\",\"manifest\":{\"chunkBytes\":25165824,\"chunks\":[{\"bytes\":868090,\"name\":\"chunk-000\",\"sha256\":\"21dc3f65ea440c904746ee1ee59a2e24c88aaf0696b1450b0aedcc001aca1926\"}],\"createdAt\":\"2026-10-01\",\"createdBy\":\"tools/pack.py (Claude Fable 5.1)\",\"engine\":\"piper-plus\",\"engineConfig\":{\"kind\":\"text-frontend\",\"lang\":\"en\"},\"files\":[{\"bytes\":863232,\"offset\":0,\"path\":\"en/cmudict_data.json.gz\",\"sha256\":\"3083a0cf26e01398a6877c8834150f03a230baf6965832b00bfae699063208f4\"},{\"bytes\":4858,\"offset\":863232,\"path\":\"en/homographs.json.gz\",\"sha256\":\"2ef14b6d49476790fdb2008150d417cb9069f7dcb74c25706a43bcc3fe5c4187\"}],\"lang\":[\"en\"],\"license\":{\"attribution\":\"CMU Pronouncing Dictionary (Carnegie Mellon University); g2p-en (Kyubyong Park & Jongseok Kim)\",\"file\":\"LICENSE.txt\",\"name\":\"BSD-2-Clause style (CMU Pronouncing Dictionary) + Apache-2.0 (g2p-en homographs)\",\"sha256\":\"3d3a944042879fa3c5a25c317ea7e609c0efa7cf0900c0c298ba331953c27039\"},\"name\":\"\u82F1\u8BED\u53D1\u97F3\u8BCD\u5178\uFF08CMUdict + \u540C\u5F62\u5F02\u97F3\u8868\uFF09\",\"notes\":\"homographs.json is a format conversion of g2p-en's homographs.en (Apache-2.0 \u00A74: modified file notice).\",\"sha256\":\"21dc3f65ea440c904746ee1ee59a2e24c88aaf0696b1450b0aedcc001aca1926\",\"slug\":\"lang-en-cmudict-20261001\",\"source\":{\"converted\":\"\",\"file\":\"cmudict_data.json: piper-plus 82ee4e7 src/rust/piper-plus-g2p/data/; homographs.json: PyPI g2p-en 2.1.0 g2p_en/homographs.en converted to JSON (content unchanged)\",\"model\":\"https://github.com/ayutaz/piper-plus\"},\"task\":\"tts-frontend\",\"totalBytes\":868090,\"v\":1}},\n};\n/** \u6708\u8BFB\uFF08\u3064\u304F\u3088\u307F\u3061\u3083\u3093\uFF09\u7684\u7F72\u540D\u5757\u548C\u7981\u6B62\u7528\u9014\uFF1A\u51FA\u8D27\u65F6\u5FC5\u987B\u663E\u793A\u5728\u754C\u9762\u4E0A\uFF08\u5305\u5185 LICENSE.txt [1][2]\uFF09\u3002 */\nexport const CREDIT = {\"credit\":\"\u672C\u30BD\u30D5\u30C8\u30A6\u30A7\u30A2\u306E\u97F3\u58F0\u5408\u6210\u306B\u306F\u3001\u30D5\u30EA\u30FC\u7D20\u6750\u30AD\u30E3\u30E9\u30AF\u30BF\u30FC\u300C\u3064\u304F\u3088\u307F\u3061\u3083\u3093\u300D\uFF08\u00A9 Rei Yumesaki\uFF09\u304C\u7121\u6599\u516C\u958B\u3057\u3066\u3044\u308B\u97F3\u58F0\u30C7\u30FC\u30BF\u3092\u4F7F\u7528\u3057\u3066\u3044\u307E\u3059\u3002\\n\u25A0\u3064\u304F\u3088\u307F\u3061\u3083\u3093\u30B3\u30FC\u30D1\u30B9\uFF08CV.\u5922\u524D\u9ECE\uFF09\\nhttps://tyc.rei-yumesaki.net/material/corpus/\",\"terms\":\"\u3064\u304F\u3088\u307F\u3061\u3083\u3093\u306E\u58F0\u8CEA\u3092\u4F7F\u7528\u3059\u308B\u5834\u5408\u306F\u3001\u51FA\u529B\u3057\u305F\u97F3\u58F0\u3092\u6B21\u306E\u76EE\u7684\u3067\u4F7F\u7528\u3059\u308B\u3053\u3068\u3092\u7981\u6B62\u3057\u307E\u3059\u3002\\n\u3010\u7981\u6B62\u4E8B\u9805\u3011\\n\u25A0\u4EBA\u3092\u6279\u5224\u30FB\u653B\u6483\u3059\u308B\u3053\u3068\u3002\uFF08\u300C\u6279\u5224\u30FB\u653B\u6483\u300D\u306E\u5B9A\u7FA9\u306F\u3001\u3064\u304F\u3088\u307F\u3061\u3083\u3093\u30AD\u30E3\u30E9\u30AF\u30BF\u30FC\u30E9\u30A4\u30BB\u30F3\u30B9\u306B\u6E96\u3058\u307E\u3059\uFF09\\n\u25A0\u7279\u5B9A\u306E\u653F\u6CBB\u7684\u7ACB\u5834\u30FB\u5B97\u6559\u30FB\u601D\u60F3\u3078\u306E\u8CDB\u540C\u307E\u305F\u306F\u53CD\u5BFE\u3092\u547C\u3073\u304B\u3051\u308B\u3053\u3068\u3002\\n\u25A0\u523A\u6FC0\u306E\u5F37\u3044\u8868\u73FE\u3092\u30BE\u30FC\u30CB\u30F3\u30B0\u306A\u3057\u3067\u516C\u958B\u3059\u308B\u3053\u3068\u3002\\n\u25A0\u4ED6\u8005\u306B\u5BFE\u3057\u3066\u4E8C\u6B21\u5229\u7528\uFF08\u7D20\u6750\u3068\u3057\u3066\u306E\u5229\u7528\uFF09\u3092\u8A31\u53EF\u3059\u308B\u5F62\u3067\u516C\u958B\u3059\u308B\u3053\u3068\u3002\",\"termsUrl\":\"https://tyc.rei-yumesaki.net/material/corpus/\",\"attribution\":[\"ayousanz/piper-plus-tsukuyomi-chan \u2014 \u3064\u304F\u3088\u307F\u3061\u3083\u3093\u30B3\u30FC\u30D1\u30B9\u5229\u7528\u898F\u7D04 (modified: zh / en language vectors)\",\"ayousanz/piper-plus-base \u2014 CC-BY-4.0 (zh / en language vectors)\",\"Open JTalk \u00B7 MeCab \u00B7 NAIST-jdic \u00B7 pyopenjtalk-plus \u00B7 CMUdict \u00B7 g2p-en \u00B7 pypinyin \u00B7 ONNX Runtime\"]};\n", "// performance.ts \u2014\u2014 \u65B0\u5EFA\u5019\u9009\uFF08\u4E50\u5668\uFF09\u65F6 by value \u6284\u8FDB\u6B4C\u91CC\u7684\u9ED8\u8BA4\u6570\uFF1A\u529B\u5EA6\u8868\u3001\u6F14\u594F\u6CD5\u3001\u6708\u8BFB\u7684\u7F72\u540D / \u89C4\u683C\u3001SoundFont \u7684\u89C4\u683C\u3002\n// created 2026-10-07 by Claude Fable 5.1\u3002\u5951\u7EA6\u8349\u7A3F \u00A78\uFF1A\u6E32\u67D3 = \u7EAF\u51FD\u6570(\u6587\u4EF6)\uFF0C\u5019\u9009\u5FEB\u7167\u91CC\u5199\u5168\u7EAF\u51FD\u6570\u8981\u7684\u4E00\u5207\uFF0C\u4E0D\u4F9D\u8D56 app \u91CC\u7684\u9ED8\u8BA4\u8868\u2014\u2014\n//   \u8FD9\u4E9B\u5E38\u91CF\u53EA\u5728\u300C\u65B0\u5EFA\u5019\u9009\u90A3\u4E00\u523B\u300D\u7528\u4E00\u6B21\uFF0C\u4E4B\u540E\u6B4C\u91CC\u7684\u6570\u5C31\u662F\u6B4C\u81EA\u5DF1\u7684\uFF08app \u5347\u7EA7\u6539\u4E86\u8FD9\u91CC\u4E5F\u52A8\u4E0D\u5230\u65E7\u6B4C\uFF0C\u300Clater edits \u2026 dont nuke us\u300D\uFF09\u3002\nimport { CREDIT, SINGER, PACKS } from \"../singer/packs.gen.ts\";\nimport { APP_VERSION } from \"../version.ts\";\nimport type { Credit, Spec, Dynamic } from \"./contract.ts\";\n\n/** \u529B\u5EA6\u5B57\u6BCD \u2192 dB\uFF08\u76F8\u5BF9 mf = 0\uFF1B\u00A77.7 \u8BB0\u53F7 \u2194 \u66F2\u7EBF\u7684\u6362\u7B97\u8868\uFF0Cby value\uFF09\u3002\u5E38\u89C1\u6253\u8C31\u8F6F\u4EF6\u7684\u9ED8\u8BA4\u5927\u81F4\u662F\u6BCF\u6863 6 dB\u3002 */\n//   ppp / fff\uFF08v0.9.23\uFF0C2026-10-10 user\u300Cwishlist: ppp fff\uFF0C\u4EE5\u53CA\u5E2E\u6211\u79D1\u666E\u8FD9\u4E9B\u548Cdb\u7684\u6362\u7B97\u5173\u7CFB\uFF0C\u7136\u540E\u5E94\u8BE5\u5411\u7528\u6237\u63ED\u9732\uFF0C\u65B9\u4FBF\u5BF9\u6BD4\u300D\uFF09\uFF1A\u987A\u7740\u4E00\u6863 6 dB \u5F80\u5916\u63A8\uFF1B\u65E7\u6F14\u594F\u8005\u7684\u8868\u91CC\u6CA1\u6709\u8FD9\u4E24\u683C = \u6309\u5B83\u81EA\u5DF1\u7684\u95F4\u9694\u63A8\uFF08project.ts activePerfSpec\uFF09\u3002\nexport const DYNAMICS_DB: Record<Dynamic, number> = { ppp: -24, pp: -18, p: -12, mp: -6, mf: 0, f: 6, ff: 12, fff: 18 };\n/** \u6F14\u594F\u6CD5\uFF1A\u8DF3\u97F3 / \u4FDD\u6301\u5404\u5403\u6389\u65F6\u503C\u7684\u591A\u5C11\uFF080\u20131\uFF09\u3001\u91CD\u97F3\u52A0\u591A\u5C11 dB\u3002 */\nexport const ARTICULATION = { staccatoGate: 0.5, tenutoGate: 1.0, accentDb: 4 } as const;\n/** \u8BB0\u53F7\u600E\u4E48\u89E3\u8BFB\u7684\u5176\u4F59\u7684\u6570\uFF082026-10-08 Claude Opus 5.5\uFF1Buser\u300C\u8BB0\u53F7\u600E\u4E48\u89E3\u8BFB\u5E94\u8BE5\u4E50\u5668\u91CC\u9762\u6709explicit\u7684\u914D\u7F6E\uFF0C\u800C\u4E0D\u662F\u4EE3\u7801\u5199\u6B7B\u300D\u300C\u5148\u770B\u770B\u8BB0\u53F7\u627F\u91CD\u80FD\u8D70\u591A\u8FDC\u300D\uFF09\uFF1A\n *  \u65B0\u5EFA\u6F14\u594F\u8005\u65F6 by value \u6284\u8FDB articulation\uFF1B\u65E7\u6F14\u594F\u8005\u6CA1\u5199\u7684\u952E = \u8FD9\u91CC\u7684\u503C\uFF08= \u8FD9\u4E00\u7248\u4E4B\u524D\u5199\u6B7B\u5728\u4EE3\u7801\u91CC\u7684\u6570\uFF0C\u65E7\u6B4C\u9010\u6837\u672C\u4E0D\u53D8\uFF09\u3002\u597D\u4E0D\u597D\u542C\u5F52 user \u8033\u6735\u3002 */\nexport const MARK_DEFAULTS = {\n  accentSec: 0.12,                  // \u91CD\u97F3 / \u5F3A\u97F3\uFF1A\u97F3\u5934\u52A0\u91CD\u6301\u7EED\u591A\u4E45\uFF08\u79D2\uFF1B\u6708\u8BFB / \u5143\u97F3\u7248 / \u65E7\u4E50\u5668\u7684 dB \u90A3\u4E00\u8DEF\uFF09\n  breathSec: 0.16, breathShare: 0.25,   // \u547C\u5438\uFF1A\u524D\u4E00\u4E2A\u97F3\u6536\u77ED\u591A\u5C11\uFF08\u79D2\uFF09\uFF0C\u6700\u591A\u5360\u8FD9\u4E2A\u97F3\u7684\u51E0\u5206\u4E4B\u51E0\uFF08\u5143\u97F3\u7248 / \u4E50\u5668\uFF09\n  gapShare: 0.25,                   // \u8FDE\u65AD\u5E95\u8272\u7684\u7F1D\u6700\u591A\u5403\u6389\u8FD9\u4E2A\u97F3\u7684\u51E0\u5206\u4E4B\u51E0\n  wedgeStepDb: 6, wedgeStepVel: 16, // \u6E10\u5F3A\u6E10\u5F31\u540E\u9762\u6CA1\u5199\u529B\u5EA6\u8BB0\u53F7 = \u8D70\u4E00\u6863\uFF1AdB \u90A3\u4E00\u8DEF / \u529B\u5EA6\u90A3\u4E00\u8DEF\u5404\u8D70\u591A\u5C11\n  sfzDb: 9, sfzVel: 32, sfzSec: 0.2,     // \u7A81\u5F3A\uFF1A\u97F3\u5934\u6BD4\u5F53\u4E0B\u9AD8\u591A\u5C11\uFF08dB \u90A3\u4E00\u8DEF\uFF0CsfzSec \u91CC\u843D\u56DE\u6765\uFF09/ \u529B\u5EA6\u90A3\u4E00\u8DEF\u52A0\u591A\u5C11\n  fpSec: 0.2,                       // \u5F3A\u540E\u5373\u5F31\uFF1A\u97F3\u5934\u6309\u8FD9\u4F4D\u7684 f\uFF0C\u8FD9\u4E48\u4E45\u843D\u5230 p\uFF08\u4E4B\u540E\u7684\u97F3\u90FD\u662F p\uFF09\n  arpeggioSec: 0.035,               // \u7436\u97F3\uFF08v0.9.45 / v0.9.48\uFF09\uFF1A\u65CB\u5F8B\uFF08\u6700\u4E0A\u9762\uFF09\u51C6\u65F6\u843D\u62CD\uFF0C\u4E0B\u9762\u7684\u4ECE\u4F4E\u5230\u9AD8\u6BCF\u4E2A\u63D0\u65E9\u8FD9\u4E48\u591A\u79D2\uFF08\u6700\u591A\u644A\u5230\u8FD9\u4E2A\u97F3\u4E00\u534A\u957F\uFF09\uFF1B35 ms = user \u5B9A\u7684\n  swellDb: 6,                       // \u97F3\u5185\u8D77\u4F0F\uFF1A< \u8D70\u5230 +swellDb\u3001> \u8D70\u5230 \u2212swellDb\u3001<> \u4E2D\u95F4\u5230 +swellDb \u518D\u56DE\u6765\n  // \u5F3A\u5EA6\u7684\u5176\u4F59\u51E0\u7EA7\uFF082026-10-08 \u6DF1\u591C Opus 5.5\uFF09\uFF1A\u6B21\u91CD\u97F3 = \u91CD\u97F3\u7684\u4E00\u534A\uFF08\u97F3\u5934 accentSec \u90A3\u4E00\u6BB5 / \u529B\u5EA6\uFF09\uFF1B\u5F31\u5316 / \u5E7D\u7075\u97F3 = \u6574\u4E2A\u97F3\u8F7B\u4E0B\u53BB\uFF08\u5E7D\u7075\u97F3 \u2248 \u5F3A\u97F3\u53CD\u8FC7\u6765\uFF09\n  stressDb: 2, stressVel: 8, unstressDb: -3, unstressVel: -10, ghostDb: -9, ghostVel: -28,\n} as const;\n/** \u6708\u8BFB\uFF1A\u8C31\u4E0A\u7684\u8BB0\u53F7 \u2192 \u5531\u6CD5\u6838\u5FC3\u8BA4\u7684\u5B57\u524D\u8BB0\u53F7\uFF08^ = \u987F\u4E00\u4E0B\u3001\u4E0D\u6362\u6C14\uFF1Bv = \u6362\u6C14\uFF1BO = \u5927\u53E3\u6362\u6C14\uFF09\u3001\u653E\u5728\u54EA\u4E2A\u5B57\u524D\uFF08this = \u8FD9\u4E2A\u5B57\uFF0Cnext = \u4E0B\u4E00\u4E2A\u5B57\uFF09\u3002\n *  user\u300C\u8DF3\u97F3\u5C31\u662F\u987F\u4E00\u4E0B\u300D\u300C\u55EF\u91CD\u97F3\u4E5F\u987F\u300D\u300C\u6708\u8BFB\u5728\u90A3\u513F\u6362\u6C14\u300D\u3002\u540C\u4E00\u4E2A\u5B57\u524D\u9762\u6709\u51E0\u4E2A\uFF1A\u6362\u6C14\u4F18\u5148\uFF08v / O \u672C\u6765\u5C31\u5E26\u4E00\u4E2A\u7A7A\u5F53\uFF09\u3002 */\nexport type SingMark = { mark: \"^\" | \"v\" | \"O\"; at: \"this\" | \"next\" };\nexport const SING_MARKS: Record<\"staccato\" | \"accent\" | \"marcato\" | \"breath\" | \"sfz\" | \"fp\", SingMark> = {\n  staccato: { mark: \"^\", at: \"next\" }, accent: { mark: \"^\", at: \"this\" }, marcato: { mark: \"^\", at: \"this\" }, breath: { mark: \"v\", at: \"next\" },\n  sfz: { mark: \"^\", at: \"this\" }, fp: { mark: \"^\", at: \"this\" },   // \u97F3\u5934\u90A3\u4E00\u7EC4\u90FD\u987F\u4E00\u4E0B\uFF08\u540C\u91CD\u97F3\uFF0Cuser\u300C\u55EF\u91CD\u97F3\u4E5F\u987F\u300D\uFF09\n};\n/** \u529B\u5EA6\u8BB0\u53F7 \u2192 MIDI \u529B\u5EA6\uFF081\u2013127\uFF09\uFF1ASoundFont \u6F14\u594F\u8005 by value \u5E26\u7684\u8868\uFF082026-10-08 Claude Opus 5.5\uFF1Buser\u300C\u5E94\u8BE5send\u7684\u5C31\u662Fvelocity\uFF01\u300D\u300C\u529B\u5EA6\u5C31\u662Fvelocity\u300D\n *  \u300Cmp mf \u5927\u4E8E\u5C0F\u4E8E\u53F7\u8FD9\u79CD\uFF0C\u53EF\u4EE5preliminary\u7684\u63A7\u5236\u529B\u5EA6\u3002\u7136\u540E\u8DF3\u97F3\u5F3A\u97F3\u91CD\u97F3\u4E5F\u5E94\u8BE5\u662F\u8FD9\u4E2A\u300D\uFF09\u3002\u8D77\u70B9 = MuseScore \u7684\u7ECF\u5178\u9ED8\u8BA4\u503C\uFF0C\u597D\u4E0D\u597D\u542C\u5F52 user \u8033\u6735\u3002\n *  \u53EA\u7ED9\u65B0\u5EFA\u7684 SoundFont \u5019\u9009\uFF1B\u65E7\u5019\u9009\u6CA1\u6709\u8FD9\u5F20\u8868 = \u7167\u65E7\uFF08\u529B\u5EA6\u8BB0\u53F7\u8D70 dB\u3001\u529B\u5EA6 0.8\uFF09\uFF0C\u65E7\u6B4C\u9010\u6837\u672C\u4E0D\u53D8\u3002GS \u5F88\u591A\u97F3\u8272\u6309\u529B\u5EA6\u6362\u5F55\u97F3\u5C42\uFF08\u4ED3\u9F20 v11 velLayers\uFF09\u3002 */\nexport const DYNAMICS_VEL: Record<Dynamic, number> = { ppp: 16, pp: 33, p: 49, mp: 64, mf: 80, f: 96, ff: 112, fff: 126 };   // ppp 16 / fff 126 = MuseScore \u7684\u7ECF\u5178\u503C\uFF08v0.9.23\uFF09\n/** \u91CD\u97F3 / \u5F3A\u97F3\u5728\u529B\u5EA6\u4E0A\u52A0\u591A\u5C11\uFF08MIDI \u683C\uFF1BSoundFont \u8FD9\u4E00\u8DEF\uFF09\u3002\u6708\u8BFB / \u5143\u97F3\u7248\u8FD9\u4E00\u8DEF\u662F\u97F3\u5934\u52A0 dB\uFF1A\u91CD\u97F3 accentDb\u3001\u5F3A\u97F3 MARCATO_DB\u3002 */\nexport const ACCENT_VEL = 16, MARCATO_VEL = 28, MARCATO_DB = 7;\n/** \u6CA1\u753B\u66F2\u7EBF\u7684\u97F3\u7528\u7684\u9ED8\u8BA4\u6570\uFF08\u5355\u4F4D\u540C curves.json \u7684 units\uFF09\uFF1Asoundfont \u7684 velocity = MIDI \u529B\u5EA6\u6BD4\u4F8B 0\u20131\u3002 */\nexport const SOUNDFONT_DEFAULTS: Record<string, number> = { velocity: 0.8 };\n/** \u65B0\u5EFA SoundFont \u5019\u9009\u7684\u54CD\u5EA6\u6821\u51C6\uFF08dB\uFF09\uFF1A\u6708\u8BFB\u5F53\u57FA\u51C6\uFF080\uFF09\uFF0C\u4E50\u5668\u9ED8\u8BA4\u8BA9\u4E00\u70B9\uFF082026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u611F\u89C9\u4E50\u5668\u8FDB\u6765\u4E4B\u540E\u597D\u50CF\u6708\u8BFB\u53D8\u8F7B\u4E86\u300D\uFF09\u3002\n *  \u53EA\u662F\u8D77\u70B9\uFF1A\u597D\u4E0D\u597D\u542C\u5F52 user \u8033\u6735\uFF0C\u6B4C\u624B\u724C\u4E0A\u770B\u5F97\u89C1\u3001\u80FD\u8C03\uFF08\u5951\u7EA6\u300C\u6821\u51C6 = \u770B\u5F97\u89C1\u3001\u80FD\u8C03\u7684\u9ED8\u8BA4\uFF0C\u4E0D\u5077\u5077\u81EA\u52A8\u300D\uFF09\uFF1B\u8FDB\u6B4C by value\uFF0C\u4EE5\u540E\u6539\u8FD9\u4E2A\u6570\u52A8\u4E0D\u5230\u65E7\u6B4C\u3002 */\nexport const SOUNDFONT_CALIBRATION_DB = -6;\n/** \u65B0\u5EFA\u7684\u6F14\u594F\u8005\uFF08\u6708\u8BFB\u4E5F\u662F\uFF09\u9ED8\u8BA4\u7684\u54CD\u5EA6\u6821\u51C6\uFF0C\u4E5F\u662F\u300C\u6CA1\u5199\u300D\u65F6\u7684\u503C\uFF082026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u6708\u8BFB\u4E5F\u5F97-6db\uFF0C\u4E0D\u7136\u4E00\u548C\u522B\u7684\u4E50\u5668\u5728\u4E00\u8D77\uFF0C\n *  \u5C31\u4F1A\u97F3\u8272\u53D8\u6210\u53E6\u5916\u4E00\u4E2A\u4EBA\u300D\uFF09\uFF1A\u51E0\u4E2A\u58F0\u90E8\u76F8\u52A0\u8D85\u8FC7\u6BCD\u7EBF\u5929\u82B1\u677F\u65F6\u9650\u5E45\u5668\uFF08src/audio/mix.ts\uFF0C\u8D77\u538B 3 ms\uFF09\u538B\u7684\u662F\u6574\u6761\u6DF7\u97F3\u2014\u2014\u6708\u8BFB\u6700\u54CD\uFF0C\u538B\u7684\u4E3B\u8981\u662F\u5979\u7684\u5CF0\uFF0C\n *  3 ms \u53EA\u591F\u5979\u4E00\u4E24\u4E2A\u58F0\u95E8\u5468\u671F\uFF0C\u7B49\u4E8E\u63B0\u5F2F\u5979\u7684\u6CE2\u5F62\uFF1B\u5148\u8BA9 6 dB = \u53E0\u5728\u4E00\u8D77\u4E5F\u5F88\u5C11\u9876\u5230\u5929\u82B1\u677F\u3002\u53EA\u7BA1\u65B0\u5EFA\u7684\uFF1A\u65E7\u6B4C\u91CC\u5B58\u7684 0 \u7167\u65E7\uFF08\u4E0D\u5077\u5077\u6539\uFF0C\u4EBA\u80FD\u8C03\uFF09\u3002 */\nexport const DEFAULT_CALIBRATION_DB = -6;\n/** \u5C0F\u6708\u76F8\u5531\u6CD5\u6838\u5FC3\u7684\u65CB\u94AE\uFF08by value \u5B58\u5728\u5019\u9009\u7684 defaults \u91CC\uFF0C\u4E50\u5668\u9875\u300C\u9AD8\u7EA7\u300D\u91CC\u6539\uFF1B\u6CA1\u5199 = \u8FD9\u5F20\u8868\uFF1B\u65B0\u5EFA\u65F6\u6284\u8FDB\u53BB\uFF09\u30022026-10-15 user \u62CD\u677F\uFF1A\u300C\u5E94\u8BE5leverage\u5C31\u662F\u9F50\u5E73\uFF0C\u6211\u89C9\u5F97\u4E0D\u5F00\u6CA1\u4EC0\u4E48\u5F71\u54CD\u5427\uFF0C\n *  \u9ED8\u8BA4\u4E0D\u5F00\uFF0C\u7136\u540E\u6708\u76F8\u53EF\u4EE5\u8BBE\u7F6E\uFF0C\u9F50\u5E73\u548C\u5176\u4ED6\u7684\u4E5F\u90FD\u653E\u5728\u9AD8\u7EA7\u8BBE\u7F6E\u91CC\u9762\u53EF\u4EE5\u6301\u4E45\u5316\u300D\u300C\u55EF\u4F60\u8BD5\u4E00\u4E0B\u8FDE\u7EED\u4E5F\u884C\u300D\u3002\u7269\u7406\u610F\u4E49\u89C1 ai-docs/20261013-dango-c10-pop-probe.md \u00A76\uFF1A\n *  level = \u6BCF\u4E2A\u5B57\u7684\u54CD\u5EA6\u5F80\u6574\u53E5\u4E2D\u4F4D\u6570\u62C9\u51E0\u6210\uFF080 = \u5173 = \u7167\u5FF5\u7684\u8F7B\u91CD\uFF1B\u5531\u6CD5\u6838\u5FC3\u81EA\u5DF1\u7684\u9ED8\u8BA4 0.8 \u53EA\u7ED9 Lab \u547D\u4EE4\u884C\uFF09\uFF1BlevelMaxDb = \u6700\u591A\u62C9\u51E0 dB\uFF1BlevelContinuous = 1 \u65F6\u589E\u76CA\u4ECE\u524D\u4E00\u4E2A\u5B57\u8FDE\u7EED\u8FC7\u6E21\u5230\u8FD9\u4E2A\u5B57\uFF08\u4E0D\u6BCF\u5B57\u8DF3\u56DE 0\uFF09\uFF1B\n *  cleanMax = \u4E00\u4E2A\u5B57\u81EA\u5DF1\u7684\u5143\u97F3\u6742\u5230\u8FD9\u4E2A\u6570\u4EE5\u4E0A\u5C31\u501F\u540C\u53E5\u5E72\u51C0\u7684\u540C\u5143\u97F3\u6765\u5531\uFF1Bbreath = \u5408\u6210\u524D\u628A\u6742\u5EA6\u538B\u5230\u6700\u5E72\u51C0\u90A3\u51E0\u5E27\u7684\u7A0B\u5EA6\uFF080 = \u5168\u538B\u6210\u5B9E\u58F0\uFF0C1 = \u7167 piper \u5FF5\u7684\u7559\u7740\uFF09\u3002\n *  2026-10-17 \u6539\u56DE\u9F50\u5E73\u5F00 + \u8FDE\u7EED\uFF08Claude Opus 5.5\uFF09\uFF1Auser\u300C\u90A3\u4E2A\u7834\u97F3\u662F\u56E0\u4E3A\u9ED8\u8BA4\u5173\u4E86\u9F50\u5E73\u5BFC\u81F4\u7684\uFF0C\u80FD\u4E0D\u80FD\u8003\u53E4\u4E00\u4E0B\u4FEE\u9F50\u5E73\u4E4B\u524D\u7684\u9ED8\u8BA4\u662F\u4EC0\u4E48\uFF1F\u52A0\u4E0A\u8FDE\u7EED\u8FC7\u6E21\u7136\u540E\u7528\u90A3\u4E2A\u9ED8\u8BA4\uFF1F\u300D\u300C\u9F50\u5E73\u8FD8\u662F\u9ED8\u8BA4\u5F00\u5427\u3002\u7206\u97F3\u81F3\u5C11\u6BD4\u54CD\u5EA6\u4E0D\u53EF\u63A7\u597D\u300D\u2014\u2014\n *  \u8003\u53E4 = v0.12.9 \u4E4B\u524D\u7F16\u8F91\u5668\u7528\u5531\u6CD5\u6838\u5FC3\u81EA\u5DF1\u7684\u9ED8\u8BA4\uFF08level 0.8 / levelMaxDb 6 / cleanMax 0.4 / breath 0\uFF0C\u90A3\u65F6\u6CA1\u6709 levelContinuous = \u6BCF\u5B57\u91CD\u8D77\uFF09\uFF0Cv0.12.9 \u53EA\u628A level \u6539\u6210 0\uFF1B\n *  \u73B0\u5728 = \u90A3\u4E00\u5957 + levelContinuous 1\uFF08\u6BCF\u5B57\u91CD\u8D77\u5728\u5B57\u8FB9\u754C\u4E0A\u5148\u8DF3\u56DE 0 \u518D\u722C = \u300C\u305D\u300D\u7834\u97F3\u7684\u6765\u8DEF\uFF0C\u8FDE\u7EED\u4E0D\u8DF3\uFF09\u3002\u5019\u9009\u91CC\u5199\u4E86\u503C\u7684\u6B4C\uFF08v0.12.9 \u8D77\u65B0\u5EFA\u7684\u4F1A\u6284\u8FDB level 0\uFF09\u7167\u65E7\uFF0C\u4E0D\u5077\u5077\u6539\u3002 */\nexport const TSUKUYOMI_DEFAULTS: Record<string, number> = { level: 0.8, levelMaxDb: 6, cleanMax: 0.4, breath: 0, levelContinuous: 1 };\n\nconst REPO = \"https://github.com/fangzhangmnm/moonsinger\";\n/** \u6708\u8BFB\u7684\u7F72\u540D\u5757 + \u6761\u6B3E\uFF08\u5305\u5185 LICENSE \u8981\u6C42\u663E\u793A\uFF1B\u51FA\u5904 = \u6A21\u578B\u4ED3 voices/tsukuyomi-chan-zhen.json\uFF0C\u7ECF packs.gen.ts \u5185\u5D4C\uFF09\u3002 */\nexport const TSUKUYOMI_CREDIT: Credit = {\n  attribution: [CREDIT.credit, ...CREDIT.attribution],\n  license: { name: \"\u3064\u304F\u3088\u307F\u3061\u3083\u3093\u30B3\u30FC\u30D1\u30B9\u5229\u7528\u898F\u7D04\uFF08\u884D\u751F\u6A21\u578B\uFF09\", url: CREDIT.termsUrl, text: CREDIT.terms },\n};\n/** \u6708\u8BFB\u5B8C\u6574\u7248 = \u6211\u4EEC\u5199\u7684\u5F15\u64CE\uFF08piper \u65F6\u957F\u63A5\u7BA1 + WORLD \u91CD\u5EFA\uFF1B\u5531\u6CD5 src/singer/sing-core.mjs\uFF09\uFF1B\u00A710.6 vault\uFF1A\u6307\u5411\u6E90\u7801\u51FA\u5904 + \u6587\u6863\u7AE0\u8282\u3002 */\nexport const TSUKUYOMI_SPEC: Spec = { kind: \"ours\", doc: \"#tsukuyomi\", source: { repo: REPO, ref: APP_VERSION, path: \"src/singer/sing-core.mjs\" } };\nexport const VOWEL_SAMPLER_SPEC: Spec = { kind: \"ours\", doc: \"#vowel-sampler\", source: { repo: REPO, ref: APP_VERSION, path: \"src/singer/sampler.ts\" } };\nexport const SOUNDFONT_SPEC: Spec = { kind: \"standard\", name: \"SoundFont\", version: \"2.04\" };\n/** \u6708\u8BFB\u6A21\u578B = \u5BB6\u65CF\u6A21\u578B\u5305\uFF08packId = manifest \u7684 sha256\uFF1Bapp \u9489\u7684\u4FE1\u4EFB\u6839\uFF09\u3002 */\nexport const TSUKUYOMI_MODEL = { pack: SINGER.voice, sha256: PACKS[SINGER.voice].packId };\n", "// perform.ts \u2014\u2014 \u8C31\u4E0A\u7684\u300C\u4FEE\u300D\u2192 \u51FA\u58F0\u7684\u6570\uFF08\u7EAF\u51FD\u6570\uFF0CNode \u91CC\u53EF\u6D4B\uFF09\u3002created 2026-10-08 by Claude Opus 5.5\n// user 2026-10-08 \u62CD\u300C\u6302\u5728\u97F3\u4E0A + \u9009\u533A\u6761\u300D\u300C\u6708\u8BFB\u5728\u90A3\u513F\u6362\u6C14\u300D\u3002\u6570\u4ECE\u54EA\u6765\uFF1A\u4E0A\u573A\u90A3\u4F4D by value \u5E26\u7740\u7684\u529B\u5EA6\u8868\uFF08dynamicsDb\uFF0Cmf = 0 dB\uFF09\u548C\u6F14\u594F\u6CD5\uFF08articulation\uFF1A\n//   staccatoGate \u8DF3\u97F3\u5403\u6389\u65F6\u503C\u7684\u591A\u5C11\u3001accentDb \u91CD\u97F3\u52A0\u591A\u5C11\uFF09\u2014\u2014\u5951\u7EA6 CandidateV2\uFF0Capp \u6539\u9ED8\u8BA4\u52A8\u4E0D\u5230\u65E7\u6B4C\u3002\n// \u600E\u4E48\u51FA\u58F0\uFF08\u5404\u5F15\u64CE\u4E00\u6837\u7684\u90E8\u5206\u5728\u8FD9\u91CC\uFF0C\u5F15\u64CE\u7279\u6709\u7684\u5728\u8C03\u7528\u65B9\uFF09\uFF1A\n//   \u529B\u5EA6 + \u91CD\u97F3 = \u4E00\u6761\u6309\u65F6\u95F4\u7684\u97F3\u91CF\u66F2\u7EBF\uFF08\u8C31\u7684\u65F6\u949F\uFF0C\u79D2\uFF09\uFF0C\u6E32\u67D3\u5B8C\u4E58\u4E0A\u53BB\uFF08src/audio/mix.ts applyGain\uFF09\uFF1B\u4E00\u4E2A\u529B\u5EA6 / \u91CD\u97F3\u90FD\u6CA1\u6709 = null = \u4E0D\u78B0\u58F0\u97F3\uFF08\u548C\u4EE5\u524D\u9010\u6837\u672C\u4E00\u6837\uFF09\u3002\n//   \u8DF3\u97F3\uFF1ASoundFont / \u5143\u97F3\u7248\u628A\u97F3\u622A\u77ED\uFF08lightNotes\uFF0C\u4E50\u5668\u81EA\u5DF1\u7684\u4F59\u97F3\u7167\u5E38\u6536\uFF09\uFF1B\u6708\u8BFB\u622A\u4E0D\u77ED\uFF08\u5531\u6CD5\u6838\u5FC3\u6309\u8C31\u5531\u6EE1\uFF09\u2192 \u66F2\u7EBF\u5728\u97F3\u7684\u540E\u534A\u6BB5\u6536\u58F0\uFF08gateStaccato\uFF09\u3002\n//   \u547C\u5438\uFF1A\u6708\u8BFB = \u4E0B\u4E00\u4E2A\u5B57\u524D\u300Cv\u300D\uFF08lab-score.ts\uFF09\uFF1B\u5143\u97F3\u7248\u548C\u4E50\u5668 = \u524D\u4E00\u4E2A\u97F3\u6536\u77ED\u4E00\u70B9\uFF08lightNotes\uFF1B\u4E50\u5668\u4E0A\u7684\u9017\u53F7 = \u7A0D\u5FAE\u65AD\u5F00\u518D\u8FDB\u4E0B\u4E00\u4E2A\u97F3\uFF0C\u7BA1\u4E50 / \u4EBA\u58F0\u5C31\u662F\u6362\u6C14\uFF1B\n//   2026-10-08 user\u300Cbreath\u662F\u5426\u5E94\u8BE5\u5BF9\u5927\u91CFGS\u4E50\u5668\u4E5F\u751F\u6548\u3002\u6BD5\u7ADF\u4E0D\u65AD\u6C14\u4E00\u76F4\u62D6\u7740\u4E5F\u4E0D\u5BF9\uFF0Cfl\u4F60\u8FD8\u5F97\u624B\u52A8\u8C03\u4E00\u4E0B\u65F6\u957F\u300D\uFF09\u3002\nimport { type Token, type NoteTok, type TempoMap, type Dyn, timeline, artOf, swellOf, DEFAULT_DYN, rampTarget, isTimed } from \"./song.ts\";\nimport { MARK_DEFAULTS } from \"../format/performance.ts\";\nconst DEFAULT_DYN_KEY: Dyn = DEFAULT_DYN;\n\nexport interface PerfSpec { dynamicsDb: Record<Dyn, number>; staccatoGate: number; accentDb: number; marcatoDb?: number;\n  /** \u8BB0\u53F7\u600E\u4E48\u89E3\u8BFB\u7684\u5176\u4F59\u7684\u6570\uFF08\u5019\u9009 articulation by value\uFF1B\u6CA1\u7ED9 = MARK_DEFAULTS\uFF09\u3002 */\n  accentSec?: number; breathSec?: number; breathShare?: number; gapShare?: number; wedgeStepDb?: number; wedgeStepVel?: number;\n  sfzDb?: number; sfzVel?: number; sfzSec?: number; fpSec?: number; swellDb?: number; canSwell?: boolean;\n  stressDb?: number; stressVel?: number; unstressDb?: number; unstressVel?: number; ghostDb?: number; ghostVel?: number;\n  /** \u6709 = \u529B\u5EA6\u8BB0\u53F7 / \u91CD\u97F3 / \u5F3A\u97F3\u8D70 MIDI \u529B\u5EA6\uFF08SoundFont \u65B0\u5019\u9009\uFF09\uFF0C\u97F3\u91CF\u66F2\u7EBF\u5C31\u4E0D\u518D\u7BA1\u5B83\u4EEC\uFF1B\u6CA1\u6709 = \u8D70 dB\uFF08\u6708\u8BFB / \u5143\u97F3\u7248 / \u65E7\u5019\u9009\uFF09\u3002 */\n  dynamicsVel?: Record<Dyn, number> | null; accentVel?: number; marcatoVel?: number }\nconst M = MARK_DEFAULTS;   // \u6F14\u594F\u8005\u6CA1\u5199\u7684\u952E\u7528\u5B83\uFF08= \u8FD9\u4E00\u7248\u4E4B\u524D\u5199\u6B7B\u7684\u6570\uFF09\n/** \u97F3\u91CF\u66F2\u7EBF\u7684\u4E00\u6BB5\uFF1At0\u2013t1\uFF08\u79D2\uFF0C\u8C31\u7684\u65F6\u949F\uFF09\u8FD9\u6BB5\u591A\u5C11 dB\uFF1B-Infinity = \u9759\u97F3\u3002 */\nexport interface GainSeg { t0: number; t1: number; dB: number }\n\n/** \u4E00\u4E2A\u58F0\u90E8\u7684\u97F3\u91CF\u66F2\u7EBF\u3002gateStaccato = \u8DF3\u97F3\u9760\u6536\u58F0\uFF08\u6708\u8BFB\uFF09\u3002\u5168\u7A0B 0 dB = null\u3002\n *  groove = \u62CD\u5B50\u8F7B\u91CD\uFF08\u4E0B\u6807 \u2192 \u6743\u91CD\uFF0Csrc/score/groove.ts\uFF1B\u5DF2\u4E58\u8FC7\u5E45\u5EA6\u548C\u8DDF\u591A\u5C11\uFF09\uFF1A\u6B63\u7684 = \u6309\u6B21\u91CD\u97F3\u7684\u91CF\u5728\u97F3\u5934\u52A0\uFF0C\u8D1F\u7684 = \u6309\u5F31\u5316\u7684\u91CF\u6574\u4E2A\u97F3\u8F7B\u4E0B\u53BB\uFF08\u5199\u4E86\u97F3\u5934\u8BB0\u53F7\u7684\u97F3\u4E0D\u5728\u91CC\u9762\uFF09\u3002 */\nexport function gainSegments(tokens: Token[], map: TempoMap | undefined, spec: PerfSpec, bounds?: readonly number[], groove?: ReadonlyMap<number, number>): GainSeg[] | null {\n  const segs: GainSeg[] = [];\n  let any = false;\n  const vel = !!spec.dynamicsVel;   // \u529B\u5EA6\u8BB0\u53F7 / \u91CD\u97F3 / \u5F3A\u97F3 / \u6E10\u5F3A\u6E10\u5F31\u8D70 MIDI \u529B\u5EA6\uFF08noteVelocities\uFF09\uFF1A\u8FD9\u6761\u66F2\u7EBF\u53EA\u5269\u8DF3\u97F3\u6536\u58F0\n  const levels = vel ? null : dynLevels(tokens, map, spec.dynamicsDb, spec.dynamicsDb[DEFAULT_DYN_KEY] ?? 0, spec.wedgeStepDb ?? M.wedgeStepDb, bounds);\n  /** \u6E10\u5F3A\u6E10\u5F31\uFF1A\u4E00\u4E2A\u97F3\u91CC\u9762\u7684 dB \u4ECE a \u8D70\u5230 b\uFF08\u5207\u6210\u5C0F\u6BB5\uFF1B\u6708\u8BFB\u4E00\u4E2A\u957F\u97F3\u4E5F\u80FD\u6E10\u5F3A\uFF09\u3002 */\n  const ramp = (a: number, b: number, s0: number, s1: number) => { const n = Math.max(1, Math.min(32, Math.ceil((s1 - s0) / 0.03))); for (let k = 0; k < n; k++) segs.push({ t0: s0 + ((s1 - s0) * k) / n, t1: s0 + ((s1 - s0) * (k + 1)) / n, dB: a + ((b - a) * (k + 0.5)) / n }); };\n  for (const { index, tok, t0, t1 } of timeline(tokens, map)) {\n    const gw = vel ? 0 : groove?.get(index) ?? 0;   // \u62CD\u5B50\u8F7B\u91CD\uFF08dB \u90A3\u4E00\u8DEF\uFF1B\u529B\u5EA6\u90A3\u4E00\u8DEF\u5728 noteVel\uFF09\n    const L = levels?.get(index), soft = tok.kind === \"note\" && !vel ? (artOf(tok).includes(\"ghost\") ? spec.ghostDb ?? M.ghostDb : artOf(tok).includes(\"unstress\") ? spec.unstressDb ?? M.unstressDb : gw < 0 ? -gw * (spec.unstressDb ?? M.unstressDb) : 0) : 0;\n    const base = (L ? L.at0 : 0) + soft, baseEnd = (L ? L.at1 : 0) + soft;   // \u5F31\u5316 / \u5E7D\u7075\u97F3\uFF1A\u6574\u4E2A\u97F3\u8F7B\u4E0B\u53BB\uFF08dB \u90A3\u4E00\u8DEF\uFF1B\u529B\u5EA6\u90A3\u4E00\u8DEF\u5728 noteVel\uFF09\n    if (base !== 0 || baseEnd !== 0) any = true;\n    if (tok.kind !== \"note\") { if (baseEnd !== base) ramp(base, baseEnd, t0, t1); else segs.push({ t0, t1, dB: base }); continue; }\n    const art = artOf(tok);\n    let cur = t0;\n    // \u97F3\u5934\u90A3\u4E00\u7EC4\uFF08\u4E92\u65A5\uFF09\uFF1A\u91CD\u97F3 / \u5F3A\u97F3 = \u97F3\u5934\u4E00\u5C0F\u6BB5\u52A0 dB\uFF1B\u7A81\u5F3A = \u51B2\u9AD8 sfzDb\u3001sfzSec \u91CC\u843D\u56DE\u5F53\u4E0B\uFF1B\u5F3A\u540E\u5373\u5F31 = \u97F3\u5934\u8FD9\u4F4D\u7684 f\u3001fpSec \u91CC\u843D\u5230 p\uFF08\u4E4B\u540E\u90FD\u662F p\uFF0CdynLevels \u7BA1\uFF09\n    // \u97F3\u5185\u7684\u529B\u5EA6\u8D77\u4F0F\uFF08< / > / <>\uFF0C\u97F3\u81EA\u5DF1\u7684\u4E8B\uFF1BswellDb \u7531\u6F14\u594F\u8005\u914D\u7F6E\uFF09\uFF1A\u505A\u4E0D\u5230\u5728\u4E00\u4E2A\u97F3\u91CC\u53D8\u5F3A\u7684\uFF08canSwell = false\uFF1A\u94A2\u7434\u3001\u62E8\u5F26\u2026\uFF09\u53EA\u505A >\n    const sw0 = swellOf(tok), sw = sw0 && !(spec.canSwell === false && sw0 !== \">\") ? sw0 : null, D = spec.swellDb ?? M.swellDb;\n    // \u5305\u7EDC\u53EA\u5F80\u4E0B\u4E58\uFF08v0.9.29\uFF1Buser 2026-10-10\u300C\u97F3\u5185\u51CF\u5F31\u6E10\u5F3A\u548C\u9F13\u8D77\u90FD\u662F\u6700\u5927\u503C\u5BF9\u5E94\u7684\u672C\u6765\u539F\u59CB\u503C\uFF0C\u5C31\u662F\u4E58\u4E00\u4E2A\u5C0F\u4E8E\u4E00\u7684\u5305\u7F57\uFF0C\u800C\u4E0D\u662F\u5927\u4E8E\u4E00\u7684\u300D\u2192\u300C\u9F13\u5305\u6539\u300D\uFF09\uFF1A\n    //   \u5199\u7684\u529B\u5EA6 = \u8FD9\u4E2A\u97F3\u7684\u6700\u9AD8\u70B9\uFF1B< \u4ECE \u2212D \u957F\u5230\u5199\u7684\u529B\u5EA6\u3001> \u4ECE\u5199\u7684\u529B\u5EA6\u6536\u5230 \u2212D\u3001<> \u4E24\u5934 \u2212D \u4E2D\u95F4\u56DE\u5230\u5199\u7684\u529B\u5EA6\u3002\u4E00\u4E2A\u97F3\u6C38\u8FDC\u4E0D\u6BD4\u5199\u7684\u529B\u5EA6\u66F4\u54CD\u3002\n    const swOff = (fr: number) => (sw === \"<\" ? -D * (1 - fr) : sw === \">\" ? -D * fr : sw === \"<>\" ? -D * Math.abs(2 * fr - 1) : 0);\n    const shaped = (a0: number, a1: number, s0: number, s1: number) => {   // s0\u2013s1 \u8FD9\u6BB5\uFF1A\u5E95\u4E0B\u7684\u6C34\u5E73\u4ECE a0 \u8D70\u5230 a1\uFF08\u6309\u6574\u4E2A\u97F3\u7684\u8FDB\u5EA6\uFF09\uFF0C\u518D\u53E0\u4E0A\u97F3\u5185\u8D77\u4F0F\n      const n = Math.max(2, Math.min(48, Math.ceil((s1 - s0) / 0.03)));\n      for (let k = 0; k < n; k++) { const a = s0 + ((s1 - s0) * k) / n, b = s0 + ((s1 - s0) * (k + 1)) / n, m = (a + b) / 2, fr = (m - t0) / Math.max(1e-9, t1 - t0), fs = (m - s0) / Math.max(1e-9, s1 - s0);\n        segs.push({ t0: a, t1: b, dB: a0 + (a1 - a0) * fs + swOff(fr) }); }\n      any = true;\n    };\n    if (art.includes(\"fp\")) {\n      const f = spec.dynamicsDb.f ?? 6, p = spec.dynamicsDb.p ?? -12, e = Math.min(t1, t0 + (spec.fpSec ?? M.fpSec));\n      if (vel) ramp(0, p - f, t0, e); else ramp(f, p, t0, e);   // \u529B\u5EA6\u90A3\u4E00\u8DEF\uFF1A\u97F3\u5934\u5DF2\u7ECF\u6309 f \u7684\u529B\u5EA6\u5F39\u4E86\uFF0C\u8FD9\u91CC\u53EA\u628A\u5B83\u538B\u5230 p\n      if (t1 > e) {   // fp \u4E4B\u540E\u518D <\uFF08\u8D1D\u591A\u82AC\u5E38\u7528\uFF09\uFF1A\u4ECE p \u957F\u56DE\u53BB\uFF0C\u6700\u591A\u56DE\u5230\u97F3\u5934\u7684 f\uFF08\u4E0D\u8D85\u8FC7\u5199\u7684\uFF09\uFF1B<> = p \u2192 f \u2192 p\uFF1B> = \u5728 p \u4E0A\u518D\u5F80\u4E0B\u6536\n        const lo = vel ? p - f : p, hi = vel ? 0 : f;\n        if (sw === \"<\") ramp(lo, hi, e, t1);\n        else if (sw === \"<>\") { const m = (e + t1) / 2; ramp(lo, hi, e, m); ramp(hi, lo, m, t1); }\n        else if (sw) shaped(lo, lo, e, t1); else segs.push({ t0: e, t1, dB: lo });\n      }\n      any = true; continue;\n    }\n    if (art.includes(\"sfz\") && !vel) { const e = Math.min(t1, t0 + (spec.sfzSec ?? M.sfzSec)), b = spec.sfzDb ?? M.sfzDb; ramp(base + b, baseEnd === base ? base : base + ((baseEnd - base) * (e - t0)) / Math.max(1e-9, t1 - t0), t0, e); cur = e; any = true; }\n    const boost = vel ? 0 : art.includes(\"marcato\") ? (spec.marcatoDb ?? spec.accentDb + 3) : art.includes(\"accent\") ? spec.accentDb : art.includes(\"stress\") ? (spec.stressDb ?? M.stressDb) : gw > 0 ? gw * (spec.stressDb ?? M.stressDb) : 0;   // \u5F3A\u97F3\u6BD4\u91CD\u97F3\u91CD\u3001\u6B21\u91CD\u97F3\u6BD4\u91CD\u97F3\u8F7B\uFF1B\u62CD\u5B50\u8F7B\u91CD = \u6B21\u91CD\u97F3\u7684\u51E0\u5206\u4E4B\u51E0\n    if (boost) { const e = Math.min(t1, t0 + (spec.accentSec ?? M.accentSec)); segs.push({ t0, t1: e, dB: base + boost }); cur = e; any = true; }\n    if (t1 > cur) {\n      const a0 = base + ((baseEnd - base) * (cur - t0)) / Math.max(1e-9, t1 - t0);\n      if (sw) shaped(a0, baseEnd, cur, t1); else if (baseEnd !== base) ramp(a0, baseEnd, cur, t1); else segs.push({ t0: cur, t1, dB: base });\n    }\n  }\n  return any ? segs : null;\n}\n\n/** \u8F7B\u91CF\u7248 / SoundFont \u4E00\u4E2A\u97F3\u7684\u7ED3\u675F\u65F6\u523B\uFF08\u79D2\uFF09\uFF1A\u8DF3\u97F3\u622A\u5230 staccatoGate\uFF1B\u547C\u5438\uFF08\u53EA\u7ED9\u5143\u97F3\u7248\uFF09= \u6536\u77ED\u4E00\u53E3\u6C14\u7684\u7A7A\u5F53\uFF08\u540C\u5531\u6CD5\u6838\u5FC3\u7684 v\uFF1A\u81F3\u591A 0.16 s / 25%\uFF09\u3002 */\nexport function noteEnd(t0: number, t1: number, art: readonly string[], o: { staccatoGate: number; breath: boolean; gapSec?: number; gapShare?: number; breathSec?: number; breathShare?: number }, slur = false): number {\n  let end = t1;\n  if (art.includes(\"staccato\")) end = t0 + (t1 - t0) * o.staccatoGate;\n  // \u8FDE\u65AD\u7684\u5E95\u8272\uFF1A\u4E0D\u5199\u8BB0\u53F7\u7684\u97F3\u7559 gapSec \u7684\u7F1D\uFF08\u6700\u591A\u5403\u6389\u8FD9\u4E2A\u97F3\u7684 1/4\uFF0C\u77ED\u97F3\u4E0D\u88AB\u5403\u5149\uFF09\uFF1B\u8FDE\u7EBF\uFF08\u8FDE\u5230\u4E0B\u4E00\u4E2A\uFF09/ \u4FDD\u6301 = \u4E0D\u7559\uFF082026-10-08\uFF0Cuser\u300C\u8FDE\u65AD \u9884\u8BBE \u90FD\u540C\u610F\u300D\uFF09\n  else if (!slur && !art.includes(\"tenuto\") && (o.gapSec ?? 0) > 0) end = t1 - Math.min(o.gapSec!, (o.gapShare ?? M.gapShare) * (t1 - t0));\n  if (o.breath && art.includes(\"breath\")) end = Math.min(end, t1 - Math.min(o.breathSec ?? M.breathSec, (o.breathShare ?? M.breathShare) * (t1 - t0)));\n  return end;\n}\n\n/** \u6E10\u5F3A\u6E10\u5F31\u7684\u7EC8\u70B9\uFF1A\u540C\u4E00\u5F20\u7EB8\u91CC\uFF08bounds = \u6BCF\u5F20\u7EB8\u5728\u8FD9\u4E00\u4E32\u91CC\u4ECE\u7B2C\u51E0\u4E2A\u8D77\uFF1B\u4E0D\u7ED9 = \u6574\u4E32\u4E00\u5F20\uFF09\uFF0C\u540E\u9762\u7B2C\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7 / \u4E0B\u4E00\u4E2A\u6E10\u5F3A\u6E10\u5F31 / \u7EB8\u5C3E\u3002 */\nexport function hairpinEnd(tokens: Token[], i: number, bounds?: readonly number[]): { kind: \"dyn\" | \"hairpin\" | \"end\"; at: number } {\n  const pe = paperEndOf(i, tokens.length, bounds);\n  for (let j = i + 1; j < pe; j++) { const k = tokens[j].kind; if (k === \"dyn\" || k === \"hairpin\") return { kind: k, at: j }; }\n  return { kind: \"end\", at: pe };\n}\nconst paperEndOf = (i: number, n: number, bounds?: readonly number[]) => { for (const b of bounds ?? []) if (b > i) return b; return n; };\n/** \u6BCF\u4E2A\u6709\u65F6\u503C\u7684 token\uFF08\u97F3 / \u4F11\u6B62\uFF09\u7684\u529B\u5EA6\u6C34\u5E73\uFF1A\u97F3\u5934 at0\u3001\u97F3\u5C3E at1\uFF08\u5355\u4F4D = \u8868\u7684\u5355\u4F4D\uFF1AMIDI \u529B\u5EA6\u6216 dB\uFF09\u3002\u529B\u5EA6\u8BB0\u53F7\uFF08\u67E5 table\uFF09= \u72B6\u6001\uFF0C\u4ECE\u8FD9\u513F\u8D77\uFF1B\n *  \u6E10\u5F3A / \u6E10\u5F31\u8BB0\u53F7 = \u8FC7\u6E21\uFF1A\u4ECE\u5B83\u540E\u9762\u7B2C\u4E00\u4E2A\u97F3\u7684\u97F3\u5934\uFF0C\u7EBF\u6027\u53D8\u5230\u540C\u4E00\u5F20\u7EB8\u91CC\u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u751F\u6548\u7684\u90A3\u4E2A\u97F3\u7684\u97F3\u5934\uFF1B\u5148\u9047\u5230\u53E6\u4E00\u4E2A\u6E10\u5F3A\u6E10\u5F31 = \u5230\u90A3\u513F\u4E3A\u6B62\u3001\u8D70\u4E00\u6863\uFF1B\n *  \u90FD\u6CA1\u6709 = \u5230\u7EB8\u5C3E\u3001\u8D70\u4E00\u6863\uFF08step\uFF0C\u5361\u5728\u8868\u7684\u6700\u5C0F\u6700\u5927\u4E4B\u95F4\uFF1B\u8C31\u4E0A\u7070\u5B57\u62AB\u9732\uFF09\u3002\u524D\u9762\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u90FD\u6CA1\u6709 = def\uFF08\u6F14\u594F\u8005\u7684\u9ED8\u8BA4 / \u65CB\u94AE\uFF09\u3002\n *  2026-10-08\uFF0Cuser\u300C\u6240\u4EE5<>\u662F\u4E00\u4E2A\u8BED\u4E49\uFF0C\u5C31\u662F\u4ECE\u8FD9\u4E00\u523B\u5F00\u59CB\u8FDE\u7EED\u53D8\u5230\u4E0B\u4E00\u4E2A\u5F3A\u5EA6/\u901F\u5EA6\u6807\u8BB0\uFF1F\u300D\u300C\u8FC7\u6E21\u5230\u8FD9\u5F20\u7EB8\u7684\u7ED3\u5C3E\u2026\u8D70\u4E00\u6863\u4E5F\u884C\uFF0C\u66F4\u5408\u7406\uFF0C\u9700\u8981\u5411\u7528\u6237\u62AB\u9732\u300D\u3002 */\nexport function dynLevels(tokens: Token[], map: TempoMap | undefined, table: Record<Dyn, number>, def: number, step: number, bounds?: readonly number[]): Map<number, { at0: number; at1: number }> {\n  const out = new Map<number, { at0: number; at1: number }>(), tl = timeline(tokens, map), at = new Map(tl.map((x) => [x.index, x]));\n  const lo = Math.min(...Object.values(table)), hi = Math.max(...Object.values(table));\n  const onsetFrom = (j: number, stop = tokens.length) => { for (let k = j; k < stop; k++) { const x = at.get(k); if (x) return x; } return null; };   // j \u8D77\u7B2C\u4E00\u4E2A\u6709\u65F6\u503C\u7684\n  const endBefore = (j: number) => { for (let k = j - 1; k >= 0; k--) { const x = at.get(k); if (x) return x.t1; } return 0; };\n  let cur = def, ramp: { from: number; to: number; T0: number; T1: number; end: number } | null = null;\n  const lvl = (t: number) => (ramp ? ramp.from + (ramp.to - ramp.from) * Math.max(0, Math.min(1, ramp.T1 > ramp.T0 ? (t - ramp.T0) / (ramp.T1 - ramp.T0) : 1)) : cur);\n  for (let i = 0; i < tokens.length; i++) {\n    if (ramp && i >= ramp.end) { cur = ramp.to; ramp = null; }\n    const t = tokens[i];\n    if (t.kind === \"dyn\") {\n      if (!ramp) cur = table[t.value];\n      // \u6E10\u5230\uFF1A\u8FD9\u5F20\u7EB8\u91CC\u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u5199\u7740\u300C\u4ECE\u4E0A\u4E00\u4E2A\u6E10\u53D8\u8FC7\u6765\u300D\u3001\u4E2D\u95F4\u6CA1\u6709\u624B\u5199\u7684\u6E10\u5F3A\u6E10\u5F31 = \u4ECE\u8FD9\u513F\u540E\u9762\u7B2C\u4E00\u4E2A\u97F3\u4E00\u8DEF\u53D8\u5230\u5B83\u90A3\u4E2A\u97F3\u7684\u97F3\u5934\uFF08\u5173\u952E\u5E27\u7EBF\u6027\u63D2\u503C\uFF1B\n      //   user\u300C\u6E10\u5230 \u540C\u610F\u2026\u5176\u5B9E\u5C31\u662F\u6709\u4E00\u4E2Astart\u4F4D\u7F6E\u548C\u4E00\u5F00\u59CB\u5C31\u5747\u5300\u63D2\u503C\u7684\u95EE\u9898\u300D\uFF1BdB / \u529B\u5EA6\u672C\u6765\u5C31\u662F\u5BF9\u6570\u7684\u91CF\uFF0C\u7EBF\u6027\u63D2\u5C31\u662F\u542C\u611F\u4E0A\u5747\u5300\uFF09\n      const pe = paperEndOf(i, tokens.length, bounds), j: number = ramp ? -1 : rampTarget(tokens, i, pe), start = j >= 0 ? onsetFrom(i + 1, j) : null;\n      if (j >= 0 && start) ramp = { from: cur, to: table[(tokens[j] as Extract<Token, { kind: \"dyn\" }>).value], T0: start.t0, T1: onsetFrom(j, pe)?.t0 ?? endBefore(j), end: j };\n      continue;\n    }\n    if (t.kind === \"hairpin\") {\n      const e = hairpinEnd(tokens, i, bounds), start = onsetFrom(i + 1, e.at);\n      if (!start) continue;   // \u5B83\u548C\u7EC8\u70B9\u4E4B\u95F4\u4E00\u4E2A\u97F3\u90FD\u6CA1\u6709 = \u4E0D\u8D77\u4F5C\u7528\n      // \u7EC8\u70B9\u662F\u529B\u5EA6\u8BB0\u53F7\u3001\u4F46\u548C\u65B9\u5411\u53CD\u7740\uFF08\u6E10\u5F31\u540E\u9762\u63A5\u66F4\u5F3A\u7684 / \u4E00\u6837\u7684\uFF1B\u6E10\u5F3A\u540E\u9762\u63A5\u66F4\u5F31\u7684 / \u4E00\u6837\u7684\uFF09= **\u8BB0\u53F7\u7684\u65B9\u5411\u8BF4\u4E86\u7B97**\uFF1A\u5148\u6309\u65B9\u5411\u8D70\u4E00\u6863\uFF0C\u5230\u90A3\u4E2A\u529B\u5EA6\u8BB0\u53F7\u518D\u7A81\u53D8\uFF08subito\uFF09\n      //   \uFF082026-10-08 user \u62CD\uFF1A\u300C\u8BB0\u53F7\u7684\u65B9\u5411\u8BF4\u4E86\u7B97\u3002\u5148\u6309\u6E10\u5F31\u65B9\u5411\u8D70\u4E00\u6863\uFF0C\u5230\u90A3\u4E2A f \u518D\u7A81\u53D8\u2026\u540C\u610F\u300D\uFF1B\u8D1D\u591A\u82AC\u7684\u300Ccresc. \u2026 subito p\u300D\uFF09\u3002\u8C31\u4E0A\u53D1\u5939\u672B\u7AEF\u753B\u7070\u5B57\u63A8\u5B9A\u7684\u90A3\u4E00\u6863\uFF08engrave\uFF09\n      const endVal = e.kind === \"dyn\" ? table[(tokens[e.at] as Extract<Token, { kind: \"dyn\" }>).value] : null, oneStep = Math.max(lo, Math.min(hi, cur + (t.dir === \"cresc\" ? step : -step)));\n      const agrees = endVal !== null && (t.dir === \"cresc\" ? endVal > cur : endVal < cur);\n      const to = agrees ? endVal! : oneStep;\n      const T1 = e.kind === \"end\" ? endBefore(e.at) : (onsetFrom(e.at, paperEndOf(i, tokens.length, bounds))?.t0 ?? endBefore(e.at));\n      ramp = { from: cur, to, T0: start.t0, T1, end: e.at };\n      continue;\n    }\n    const x = at.get(i); if (!x) continue;\n    out.set(i, { at0: lvl(x.t0), at1: lvl(x.t1) });\n    if (t.kind === \"note\" && !ramp && artOf(t).includes(\"fp\")) cur = table.p;   // \u5F3A\u540E\u5373\u5F31\uFF1A\u4E4B\u540E\u7684\u97F3\u90FD\u662F p\uFF08\u5B83\u4E5F\u662F\u4E00\u4E2A\u65B0\u72B6\u6001\uFF09\n  }\n  return out;\n}\n/** \u88AB\u5F3A\u540E\u5373\u5F31\u76D6\u6389\u3001\u4E0D\u8D77\u4F5C\u7528\u7684\u529B\u5EA6\u8BB0\u53F7\uFF08\u4E0B\u6807\uFF09\uFF1A\u7D27\u8DDF\u7740\u7684\u90A3\u4E2A\u97F3\u662F fp\uFF08\u97F3\u5934\u6309 f\u3001\u968F\u540E\u843D\u5230 p\uFF0C\u4E4B\u540E\u90FD\u662F p\u2014\u2014\u4E0D\u770B\u524D\u9762\u7684\u529B\u5EA6\uFF09\uFF0C\n *  \u800C\u4E14\u5B83\u4E5F\u4E0D\u662F\u6E10\u5F3A\u6E10\u5F31 / \u6E10\u5230\u7684\u8D77\u70B9\u6216\u7EC8\u70B9\u3002\u5224\u6CD5 = \u628A\u5B83\u6362\u6210\u522B\u7684\u503C\uFF0C\u9664\u4E86 fp \u90A3\u4E2A\u97F3\u4EE5\u5916\u6BCF\u4E2A\u97F3\u7684\u529B\u5EA6\u6C34\u5E73\u90FD\u4E0D\u53D8\uFF08\u548C\u51FA\u58F0\u540C\u4E00\u4E2A\u51FD\u6570 dynLevels\uFF0C\u4E0D\u53E6\u5199\u89C4\u5219\uFF09\u3002\n *  \u8C31\u4E0A\u753B\u7070\u3001\u70B9\u5F00\u8BF4\u4E3A\u4EC0\u4E48\uFF08\u7EAA\u5F8B\u300C\u505A\u4E0D\u5230\u7684\u4E00\u5F8B\u753B\u7070 + \u660E\u8BF4\u300D\uFF1B2026-10-09 user\u300C\u8981\u4E0D\u8981\u6309\u7EAA\u5F8B\u628A mf \u753B\u7070\u3001\u8BF4\u4E00\u53E5\uFF1F \u8981\u300D\uFF09\u3002 */\nexport function dynOverridden(tokens: Token[], bounds?: readonly number[]): Set<number> {\n  const out = new Set<number>();\n  const T: Record<Dyn, number> = { ppp: 0, pp: 1, p: 2, mp: 3, mf: 4, f: 5, ff: 6, fff: 7 };\n  const fpNotes = new Set<number>(); tokens.forEach((t, k) => { if (t.kind === \"note\" && artOf(t).includes(\"fp\")) fpNotes.add(k); });\n  if (!fpNotes.size) return out;\n  const levels = (ts: Token[]) => [...dynLevels(ts, undefined, T, 0, 0.5, bounds)].filter(([k]) => !fpNotes.has(k)).map(([k, l]) => `${k}:${l.at0}:${l.at1}`).join(\"|\");\n  let base: string | null = null;\n  for (let i = 0; i < tokens.length; i++) {\n    const t = tokens[i]; if (t.kind !== \"dyn\") continue;\n    let j = i + 1; while (j < tokens.length && !isTimed(tokens[j])) j++;\n    if (!fpNotes.has(j)) continue;   // \u5148\u7B5B\uFF1A\u53EA\u6709\u7D27\u8DDF\u7740 fp \u7684\u624D\u53EF\u80FD\u88AB\u76D6\u6389\n    base ??= levels(tokens);\n    const alt = (v: Dyn) => levels(tokens.map((x, k) => (k === i ? { ...t, value: v } : x)));\n    if (alt(t.value === \"pp\" ? \"ff\" : \"pp\") === base && alt(t.value === \"mf\" ? \"p\" : \"mf\") === base) out.add(i);\n  }\n  return out;\n}\n/** \u4E00\u4E2A\u97F3\u7684 MIDI \u529B\u5EA6\uFF080\u20131\uFF0C= \u529B\u5EA6 \u00F7 127\uFF1BSoundFont \u8FD9\u4E00\u8DEF\uFF09\u3002\u6709\u529B\u5EA6\u8868\uFF1A\u524D\u9762\u6700\u8FD1\u7684\u529B\u5EA6\u8BB0\u53F7\u67E5\u8868\uFF0C\u6CA1\u6709\u8BB0\u53F7 = \u6F14\u594F\u8005\u7684\u9ED8\u8BA4\u529B\u5EA6\uFF08defaultVel\uFF0C\u4E50\u5668\u9875\u7684\u65CB\u94AE\uFF09\uFF1B\n *  \u518D\u52A0\u91CD\u97F3 / \u5F3A\u97F3\u3002\u6CA1\u6709\u529B\u5EA6\u8868\uFF08\u65E7\u5019\u9009\uFF09= \u4E00\u5F8B defaultVel\uFF08\u529B\u5EA6\u8BB0\u53F7\u7167\u65E7\u8D70 dB\uFF09\u30022026-10-08 user\u300C\u5E94\u8BE5send\u7684\u5C31\u662Fvelocity\uFF01\u300D\u300C\u529B\u5EA6\u5C31\u662Fvelocity\u300D\u3002 */\nexport function noteVelocity(tokens: Token[], index: number, art: readonly string[], spec: PerfSpec, defaultVel: number): number {\n  if (!spec.dynamicsVel) return defaultVel;\n  const l = dynLevels(tokens, undefined, spec.dynamicsVel, defaultVel * 127, spec.wedgeStepVel ?? M.wedgeStepVel).get(index);\n  return noteVel(l ? l.at0 : defaultVel * 127, art, spec);\n}\n/** \u4E00\u6574\u6761\u7684\u6BCF\u4E2A\u97F3\u7684\u529B\u5EA6\uFF08index \u2192 0\u20131\uFF09\uFF1A\u529B\u5EA6\u8BB0\u53F7 + \u6E10\u5F3A\u6E10\u5F31\uFF08dynLevels\uFF0C\u53D6\u97F3\u5934\uFF09+ \u91CD\u97F3 / \u5F3A\u97F3 + \u62CD\u5B50\u8F7B\u91CD\uFF08groove\uFF0C\u540C gainSegments\uFF09\u3002\u6CA1\u6709\u529B\u5EA6\u8868 = \u4E00\u5F8B defaultVel\uFF08\u62CD\u5B50\u8F7B\u91CD\u8D70 dB\uFF09\u3002 */\nexport function noteVelocities(tokens: Token[], map: TempoMap | undefined, spec: PerfSpec, defaultVel: number, bounds?: readonly number[], groove?: ReadonlyMap<number, number>): Map<number, number> {\n  const out = new Map<number, number>();\n  if (!spec.dynamicsVel) { tokens.forEach((t, i) => { if (t.kind === \"note\") out.set(i, defaultVel); }); return out; }\n  for (const [i, l] of dynLevels(tokens, map, spec.dynamicsVel, defaultVel * 127, spec.wedgeStepVel ?? M.wedgeStepVel, bounds)) { const t = tokens[i]; if (t.kind === \"note\") out.set(i, noteVel(l.at0, artOf(t), spec, groove?.get(i) ?? 0)); }\n  return out;\n}\nconst noteVel = (v: number, art: readonly string[], spec: PerfSpec, gw = 0) => {\n  if (art.includes(\"fp\")) v = spec.dynamicsVel?.f ?? v;   // \u5F3A\u540E\u5373\u5F31\uFF1A\u97F3\u5934\u6309 f \u5F39\uFF08\u4E4B\u540E gainSegments \u538B\u5230 p\uFF09\n  else if (art.includes(\"sfz\")) v += spec.sfzVel ?? M.sfzVel;\n  else if (art.includes(\"marcato\")) v += spec.marcatoVel ?? 0; else if (art.includes(\"accent\")) v += spec.accentVel ?? 0;\n  else if (art.includes(\"stress\")) v += spec.stressVel ?? M.stressVel; else if (art.includes(\"unstress\")) v += spec.unstressVel ?? M.unstressVel; else if (art.includes(\"ghost\")) v += spec.ghostVel ?? M.ghostVel;\n  else if (gw > 0) v += gw * (spec.stressVel ?? M.stressVel); else if (gw < 0) v += -gw * (spec.unstressVel ?? M.unstressVel);   // \u62CD\u5B50\u8F7B\u91CD\uFF1Aw = 1 \u4E00\u4E2A\u6B21\u91CD\u97F3\u3001w = \u22121 \u4E00\u4E2A\u5F31\u5316\n  return Math.max(1, Math.min(127, Math.round(v))) / 127;\n};\n/** \u8C01\u8BA4\u54EA\u4E9B\u8BB0\u53F7\uFF082026-10-08 Opus 5.5\uFF1Buser \u62CD\u300C\u6F14\u594F\u8005\u4E0D\u8BA4\u7684\u8BB0\u53F7\u4E5F\u53D8\u7070\uFF0C\u4E0D\u9759\u9ED8\u5931\u6548\uFF0C\u800C\u662F\u5411\u7528\u6237\u62AB\u9732\u300D\uFF09\u3002\n *  \u8FD9\u5F20\u8868\u5FC5\u987B\u548C\u4E0A\u9762\u771F\u505A\u7684\u4E8B\u4E00\u81F4\u2014\u2014\u8DF3\u97F3\uFF1A\u6708\u8BFB = gainSegments \u540E\u534A\u6BB5\u6536\u58F0\uFF0C\u5143\u97F3\u7248 / SoundFont = noteEnd \u622A\u77ED\uFF1B\u91CD\u97F3\u3001\u529B\u5EA6\uFF1A\u6240\u6709\u5F15\u64CE\u8D70 gainSegments\uFF1B\n *  \u547C\u5438\uFF1A\u6708\u8BFB = \u5531\u6CD5\u6838\u5FC3\u6362\u6C14\uFF08lab-score\uFF09\uFF0C\u5143\u97F3\u7248 / SoundFont = noteEnd \u6536\u77ED\uFF08lightMarks\uFF09\uFF1B\n *  \u4FDD\u6301 / \u8FDE\u7EBF\uFF1A\u5143\u97F3\u7248 / SoundFont = \u8FD9\u4E2A\u97F3\u4E0D\u7559\u5E95\u8272\u7684\u7F1D\uFF08gapSec > 0 \u624D\u6709\u533A\u522B\uFF09\uFF0C\u6708\u8BFB\u8FD8\u4E0D\u8BA4\uFF08\u8FDE\u65AD\u7B2C 3 \u6B65\uFF09\u3002test/honors.test.ts \u5B88\u7740\u3002\n *  \u4E0D\u5728\u8868\u91CC\u7684\u5F15\u64CE\uFF08\u6CA1\u4EBA\u4E0A\u573A / \u8BA4\u4E0D\u51FA\u7684\uFF09= null\uFF1A\u6574\u4E2A\u58F0\u90E8\u672C\u6765\u5C31\u4E0D\u51FA\u58F0\uFF0C\u4E0D\u518D\u9010\u4E2A\u8BB0\u53F7\u753B\u7070\u3002 */\n/** \u8C01\u8BA4\u54EA\u4E9B\u8BB0\u53F7 = \u6F14\u594F\u8005\u63D2\u4EF6\u81EA\u62A5\uFF08ADR-0004\uFF0C2026-10-14 \u8D77\u8868\u4F4F\u5728 src/performers/*.ts \u7684 honors\uFF1Bconnected = \u672C\u6765\u5C31\u8FDE\u7740\u5531\uFF0C\u8FDE\u7EBF / \u4FDD\u6301\u5BF9\u5B83\u6CA1\u610F\u4E49\uFF09\u3002 */\nexport interface HonorsOf { readonly honors: readonly string[]; readonly connected: boolean }\n/** \u8FDE\u7EBF / \u4FDD\u6301\u53EA\u6539\u300C\u7559\u4E0D\u7559\u7F1D\u300D\uFF1A\u8FD9\u4F4D\u5E95\u8272\u672C\u6765\u5C31\u4E0D\u7559\u7F1D\uFF08gapSec = 0\uFF09= \u5199\u4E86\u4E5F\u4E0D\u53D8 \u2192 \u4E00\u6837\u753B\u7070\u3001\u660E\u8BF4\u3002 */\nconst GAP_ONLY = [\"tenuto\", \"slur\"];\nexport const ALL_MARKS = [\"staccato\", \"accent\", \"marcato\", \"sfz\", \"fp\", \"tenuto\", \"breath\", \"slur\", \"swellGrow\", \"swellFade\", \"stress\", \"unstress\", \"ghost\", \"whisper\", \"inhale\", \"arpeggio\"] as const;   // inhale = \u547C\u5438\u51FA\u58F0\uFF08NoteTok.inhale\uFF0C\u53EA\u8DDF\u7740 breath\uFF09   // swellGrow = \u97F3\u5185 < / <>\uFF0CswellFade = \u97F3\u5185 >\nexport type Mark = (typeof ALL_MARKS)[number];\n/** \u8FD9\u4F4D\u4E0D\u8BA4\u7684\u8BB0\u53F7\uFF08\u5199\u5728\u8C31\u4E0A\u7167\u753B\u3001\u753B\u7070\uFF0C\u51FA\u58F0\u4E0D\u53D7\u5F71\u54CD\uFF09\uFF1A\u5F15\u64CE\u6CA1\u5B9E\u73B0\u7684 + \u5E95\u8272\u4E0D\u7559\u7F1D\u65F6\u7684\u8FDE\u7EBF / \u4FDD\u6301\u3002 */\nexport function ignoredArts(p: HonorsOf | null | undefined, gapSec = 0, canSwell = true): Mark[] {\n  const h = p?.honors;\n  return h ? ALL_MARKS.filter((a) => !h.includes(a) || (GAP_ONLY.includes(a) && !(gapSec > 0)) || (a === \"swellGrow\" && !canSwell)) : [];\n}\n/** \u4E3A\u4EC0\u4E48\u4E0D\u8BA4\uFF08\u660E\u8BF4\u7528\uFF09\uFF1A\u5F15\u64CE\u6CA1\u5B9E\u73B0 = \"engine\"\uFF1B\u5E95\u8272\u4E0D\u7559\u7F1D = \"gap\"\uFF1B\u6708\u8BFB\u7684\u8FDE\u7EBF / \u4FDD\u6301 = \"sung\"\u2014\u2014\u5979\u672C\u6765\u5C31\u8FDE\u7740\u5531\uFF0C\u8FDE\u7EBF / \u4FDD\u6301\u5BF9\u5979\u4E0D\u6539\u53D8\u4EC0\u4E48\uFF0C\n *  \u65AD\u53E5\u7528\u547C\u5438\uFF08\u8FDE\u7EBF\u548C\u547C\u5438\u662F\u540C\u4E00\u4EF6\u4E8B\u7684\u4E24\u5934\uFF1A\u97F3\u548C\u4E0B\u4E00\u4E2A\u97F3\u4E4B\u95F4\u8FDE\u8FD8\u662F\u65AD\uFF1B2026-10-08 user\u300C\u8FDE\u7EBFvs\u547C\u5438\u8FD9\u4E24\u4E2A\u5E72\u7684\u662F\u4E0D\u662F\u4E00\u4EF6\u4E8B\u2026\u6708\u8BFB\u662F\u6700\u9700\u8981\u65AD\u53E5\u7684\u300D\uFF09\u3002 */\nexport function whyIgnored(p: HonorsOf | null | undefined, m: Mark): \"engine\" | \"gap\" | \"sung\" | \"decay\" {\n  if (m === \"swellGrow\" && p?.honors.includes(m)) return \"decay\";   // \u6309\u4E0B\u53BB\u5C31\u81EA\u7136\u8870\u51CF\u7684\u4E50\u5668\uFF1A\u97F3\u5185\u53D8\u5F3A\u505A\u4E0D\u5230\n  if (p?.connected && GAP_ONLY.includes(m)) return \"sung\";\n  return p?.honors.includes(m) ? \"gap\" : \"engine\";\n}\n/** \u5143\u97F3\u7248 / SoundFont \u8FD9\u4E00\u8DEF\uFF08lightNotes\uFF09\u600E\u4E48\u843D\u4FEE\u7684\u8BB0\u53F7\uFF1A\u8DF3\u97F3\u622A\u5230 staccatoGate\u3001\u547C\u5438\u6536\u77ED\u4E00\u53E3\u6C14\uFF08\u4E24\u79CD\u5F15\u64CE\u4E00\u6837\uFF1B\u6708\u8BFB\u4E0D\u8D70\u8FD9\u6761\uFF0C\u8D70\u5531\u8C31 + \u97F3\u91CF\u66F2\u7EBF\uFF09\u3002\n *  main.ts \u7684\u51FA\u58F0\u548C test/honors.test.ts \u90FD\u4ECE\u8FD9\u91CC\u53D6\uFF0C\u4E0D\u5404\u5199\u4E00\u4EFD\u3002 */\nexport function lightMarks(spec: { staccatoGate: number; gapSec?: number; gapShare?: number; breathSec?: number; breathShare?: number; arpeggioSec?: number }): { staccatoGate: number; breath: boolean; gapSec: number; arpeggioSec: number; gapShare: number; breathSec: number; breathShare: number } {\n  return { staccatoGate: spec.staccatoGate, breath: true, gapSec: spec.gapSec ?? 0, arpeggioSec: spec.arpeggioSec ?? M.arpeggioSec, gapShare: spec.gapShare ?? M.gapShare, breathSec: spec.breathSec ?? M.breathSec, breathShare: spec.breathShare ?? M.breathShare };\n}\n", "// \u751F\u6210\u7269\uFF1Anode scripts/gen-instruments.mjs\uFF08\u6E90 = vendor/instruments/gm-map-v13.json \u7684 percussion / hitSec + extraDrumKeys\uFF09\u3002\u52FF\u624B\u6539\u3002\n// \u9F13\u8C31\u8868\uFF1A\u952E = \"bank:program[:note]\"\uFF08\u9F13\u4EF6 = 128:0:\u952E\uFF1B\u97F3\u6548 = 0:119\u2026 \u4E0D\u5E26\u952E\uFF09\u3002line = MuseScore <Drum><line> \u7684\u7EA6\u5B9A\uFF080 = \u6700\u4E0A\u9762\u90A3\u6761\u7EBF\uFF0C\u5F80\u4E0B +1 \u8D70\u534A\u683C\uFF1B\u4E94\u7EBF\u8C31\u6700\u4E0B\u9762\u4E00\u7EBF = 8\uFF0C\u4E00\u7EBF\u8C31\u90A3\u6761\u7EBF = 0\uFF09\u3002\n// hitSec = \u91C7\u6837\u5F00\u5934\u5230\u300C\u7838\u4E0B\u53BB\u90A3\u4E00\u4E0B\u300D\u51E0\u79D2\uFF08TinySoundFont + GeneralUser GS \u5B9E\u6D4B\uFF1B\u53CD\u5411\u9572 = \u5FEB\u7ED3\u5C3E\uFF09\u3002\nexport type PercHead = \"normal\" | \"x\" | \"circle-x\" | \"slash\" | \"slashed1\" | \"slashed2\" | \"diamond\" | \"triangle-up\" | \"triangle-down\" | \"plus\" | \"la\" | \"ti\" | \"custom\";\nexport interface PercInfo { staff: 1 | 5; line: number; head: PercHead; stem: \"up\" | \"down\"; smufl?: string; hitSec?: number; /** \u5E76\u6210\u4E00\u5957\u9F13\u65F6\u753B\u5728\u54EA\u4E2A\u9F13\u952E\u90A3\u4E00\u7EBF\uFF08\u6982\u5FF5\u7684 mainKey\uFF09\u3002 */ kitKey?: number; /** \u8FD9\u4E00\u884C\u7684\u5199\u6CD5\u501F\u7684\u662F\u54EA\u4E2A\u6982\u5FF5\uFF08gm-map \u90A3\u4E00\u884C\u6CA1\u5199\uFF09\u3002 */ from?: string }\nexport const PERC_VERSION = 13;\nexport const PERC: Record<string, PercInfo> = {\"0:119\":{\"staff\":1,\"line\":0,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":1.389,\"kitKey\":57},\"0:120\":{\"staff\":1,\"line\":0,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.057},\"0:121\":{\"staff\":1,\"line\":0,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.077},\"0:122\":{\"staff\":1,\"line\":0,\"head\":\"normal\",\"stem\":\"up\"},\"0:123\":{\"staff\":1,\"line\":0,\"head\":\"normal\",\"stem\":\"up\"},\"0:124\":{\"staff\":1,\"line\":0,\"head\":\"normal\",\"stem\":\"up\"},\"0:125\":{\"staff\":1,\"line\":0,\"head\":\"normal\",\"stem\":\"up\"},\"0:126\":{\"staff\":1,\"line\":0,\"head\":\"normal\",\"stem\":\"up\"},\"0:127\":{\"staff\":1,\"line\":0,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.007},\"128:0:35\":{\"staff\":5,\"line\":8,\"head\":\"normal\",\"stem\":\"down\",\"hitSec\":0.037},\"128:0:36\":{\"staff\":5,\"line\":7,\"head\":\"normal\",\"stem\":\"down\",\"hitSec\":0.007},\"128:0:37\":{\"staff\":5,\"line\":3,\"head\":\"slashed1\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:38\":{\"staff\":5,\"line\":3,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.007},\"128:0:39\":{\"staff\":5,\"line\":-2,\"head\":\"plus\",\"stem\":\"up\",\"hitSec\":0.012},\"128:0:40\":{\"staff\":5,\"line\":3,\"head\":\"slash\",\"stem\":\"up\",\"hitSec\":0.007},\"128:0:41\":{\"staff\":5,\"line\":6,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.017},\"128:0:42\":{\"staff\":5,\"line\":-1,\"head\":\"x\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:43\":{\"staff\":5,\"line\":5,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.017},\"128:0:44\":{\"staff\":5,\"line\":9,\"head\":\"x\",\"stem\":\"down\",\"hitSec\":0.012},\"128:0:45\":{\"staff\":5,\"line\":4,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.012},\"128:0:46\":{\"staff\":5,\"line\":-1,\"head\":\"circle-x\",\"stem\":\"up\",\"hitSec\":0.022},\"128:0:47\":{\"staff\":5,\"line\":2,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.007},\"128:0:48\":{\"staff\":5,\"line\":1,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.012},\"128:0:49\":{\"staff\":5,\"line\":-2,\"head\":\"x\",\"stem\":\"up\",\"hitSec\":0.057},\"128:0:50\":{\"staff\":5,\"line\":0,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:51\":{\"staff\":5,\"line\":0,\"head\":\"x\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:52\":{\"staff\":5,\"line\":-3,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.027},\"128:0:53\":{\"staff\":5,\"line\":0,\"head\":\"diamond\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:54\":{\"staff\":5,\"line\":1,\"head\":\"diamond\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:55\":{\"staff\":5,\"line\":-4,\"head\":\"x\",\"stem\":\"up\",\"hitSec\":0.067},\"128:0:56\":{\"staff\":5,\"line\":1,\"head\":\"triangle-down\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:57\":{\"staff\":5,\"line\":-3,\"head\":\"x\",\"stem\":\"up\",\"hitSec\":0.057},\"128:0:58\":{\"staff\":5,\"line\":0,\"head\":\"ti\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:59\":{\"staff\":5,\"line\":2,\"head\":\"x\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:60\":{\"staff\":5,\"line\":-1,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:61\":{\"staff\":5,\"line\":0,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.007},\"128:0:62\":{\"staff\":5,\"line\":1,\"head\":\"custom\",\"stem\":\"up\",\"smufl\":\"noteheadXOrnate\",\"hitSec\":0.012},\"128:0:63\":{\"staff\":5,\"line\":1,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.012},\"128:0:64\":{\"staff\":5,\"line\":2,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.017},\"128:0:65\":{\"staff\":5,\"line\":5,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.012},\"128:0:66\":{\"staff\":5,\"line\":7,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:67\":{\"staff\":5,\"line\":-2,\"head\":\"triangle-down\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:68\":{\"staff\":5,\"line\":-1,\"head\":\"triangle-down\",\"stem\":\"up\",\"hitSec\":0.007},\"128:0:69\":{\"staff\":5,\"line\":2,\"head\":\"diamond\",\"stem\":\"up\",\"hitSec\":0.032},\"128:0:70\":{\"staff\":5,\"line\":4,\"head\":\"diamond\",\"stem\":\"up\",\"hitSec\":0.032},\"128:0:71\":{\"staff\":5,\"line\":-3,\"head\":\"x\",\"stem\":\"up\",\"hitSec\":0.072},\"128:0:72\":{\"staff\":5,\"line\":-3,\"head\":\"ti\",\"stem\":\"up\",\"hitSec\":0.022},\"128:0:73\":{\"staff\":5,\"line\":-1,\"head\":\"x\",\"stem\":\"up\",\"hitSec\":0.012},\"128:0:74\":{\"staff\":5,\"line\":-1,\"head\":\"slashed1\",\"stem\":\"up\",\"hitSec\":0.222},\"128:0:75\":{\"staff\":5,\"line\":0,\"head\":\"la\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:76\":{\"staff\":5,\"line\":5,\"head\":\"la\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:77\":{\"staff\":5,\"line\":7,\"head\":\"la\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:78\":{\"staff\":5,\"line\":8,\"head\":\"x\",\"stem\":\"up\",\"hitSec\":0.062},\"128:0:79\":{\"staff\":5,\"line\":8,\"head\":\"slashed2\",\"stem\":\"up\",\"hitSec\":0.042},\"128:0:80\":{\"staff\":5,\"line\":0,\"head\":\"x\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:81\":{\"staff\":5,\"line\":0,\"head\":\"triangle-up\",\"stem\":\"up\",\"hitSec\":0.022},\"128:0:27\":{\"staff\":5,\"line\":8,\"head\":\"slash\",\"stem\":\"up\",\"hitSec\":0.012},\"128:0:28\":{\"staff\":5,\"line\":4,\"head\":\"custom\",\"stem\":\"up\",\"smufl\":\"noteheadSlashX\",\"hitSec\":0.012},\"128:0:29\":{\"staff\":5,\"line\":6,\"head\":\"slash\",\"stem\":\"up\",\"hitSec\":0.092},\"128:0:30\":{\"staff\":5,\"line\":6,\"head\":\"slash\",\"stem\":\"up\",\"hitSec\":0.077},\"128:0:31\":{\"staff\":5,\"line\":-1,\"head\":\"plus\",\"stem\":\"up\",\"hitSec\":0.007},\"128:0:32\":{\"staff\":5,\"line\":10,\"head\":\"plus\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:33\":{\"staff\":5,\"line\":10,\"head\":\"x\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:34\":{\"staff\":5,\"line\":10,\"head\":\"triangle-up\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:82\":{\"staff\":5,\"line\":5,\"head\":\"diamond\",\"stem\":\"up\",\"hitSec\":0.027},\"128:0:83\":{\"staff\":5,\"line\":3,\"head\":\"triangle-down\",\"stem\":\"up\",\"hitSec\":0.072},\"128:0:84\":{\"staff\":5,\"line\":2,\"head\":\"ti\",\"stem\":\"up\"},\"128:0:85\":{\"staff\":5,\"line\":2,\"head\":\"la\",\"stem\":\"up\",\"hitSec\":0.002},\"128:0:86\":{\"staff\":5,\"line\":4,\"head\":\"custom\",\"stem\":\"up\",\"smufl\":\"noteheadSlashX\",\"hitSec\":0.007},\"128:0:87\":{\"staff\":5,\"line\":4,\"head\":\"slash\",\"stem\":\"up\",\"hitSec\":0.027},\"0:112\":{\"staff\":1,\"line\":0,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.002,\"kitKey\":84,\"from\":\"Q1621499\"},\"0:113\":{\"staff\":1,\"line\":-1,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.007,\"kitKey\":67,\"from\":\"Q395212\"},\"0:115\":{\"staff\":1,\"line\":-1,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.002,\"kitKey\":76,\"from\":\"Q957212\"},\"0:116\":{\"staff\":1,\"line\":0,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.027,\"kitKey\":87,\"from\":\"Q221769\"},\"0:117\":{\"staff\":5,\"line\":5,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.007,\"kitKey\":45,\"from\":\"Q849349\"},\"0:118\":{\"staff\":5,\"line\":0,\"head\":\"normal\",\"stem\":\"up\",\"hitSec\":0.007,\"from\":\"Q1327480\"}};\n", "// percussion.ts \u2014\u2014 \u4E0D\u5206\u97F3\u9AD8\u7684\u300C\u4E00\u4E0B\u300D\uFF1A\u53F0\u4E0A\u90A3\u4F4D\u662F\u9F13 / \u97F3\u6548\u65F6\uFF0C\u8C31\u4E0A\u600E\u4E48\u5199\uFF08\u51E0\u7EBF\u8C31\u3001\u54EA\u4E00\u7EBF\u3001\u4EC0\u4E48\u7B26\u5934\u3001\u7B26\u5E72\u671D\u54EA\uFF09+ \u7740\u529B\u70B9\uFF08\u5F55\u97F3\u623F\u63D0\u524D\u591A\u5C11\u79D2\u5F00\u59CB\u653E\uFF09\u3002\n// created 2026-10-10 by Claude Opus 5.5\uFF08user\u300C\u8FD9\u4E2A\u505A\u597D\u4E4B\u540E\u9F13\u8C31\u505A\u4E00\u4E0B\u3002\u56E2\u5B50\u53EA\u5269\u4E0B\u9F13\u548C\u97F3\u6548\u4E86\u300D\u300C\u5355\u4E50\u5668\u4E00\u7EBF\u8C31\u540C\u610F\u300D\uFF1B\u8BBE\u8BA1\u8D26 ai-docs/20261010-shared-staff-percussion-design.md \u00A72\u20133\uFF09\u3002\n// \u6570\u636E = \u97F3\u4E50\u4ED3\u9F20 export v13\uFF08percussion.gen.ts\uFF0C\u6309\u503C\u70E4\u8FDB\u6E90\u7801\uFF09\u3002\u8FD9\u91CC\u53EA\u6309\u300C\u53F0\u4E0A\u90A3\u4F4D\u662F\u8C01\uFF08SoundFont \u7684 bank / program / \u56FA\u5B9A\u7684\u952E\uFF09\u300D\u67E5\u8868\uFF0C\u4E0D\u8FDB\u6B4C\u3002\nimport { PERC, type PercInfo } from \"./percussion.gen.ts\";\nexport type { PercInfo, PercHead } from \"./percussion.gen.ts\";\n\n/** \u4E00\u4E2A SoundFont \u9884\u8BBE + \u6572\u7684\u952E \u2192 \u9F13\u8C31\u5199\u6CD5\uFF08\u6CA1\u6709 = \u6709\u97F3\u9AD8\u7684\u4E50\u5668\uFF0C\u7167\u4E94\u7EBF\u8C31\uFF09\u3002\u9F13\u7EC4\uFF08bank 128\uFF09\u5404\u5957\u90FD\u6309 GM \u6807\u51C6\u9F13\u7EC4\u7684\u952E\u4F4D\uFF08GS \u7684 Room / Power / Jazz\u2026\u952E\u4F4D\u4E00\u6837\uFF09\u3002 */\nexport function percOf(bank: number, program: number, note?: number): PercInfo | null {\n  if (bank === 128) return note === undefined ? null : PERC[`128:0:${note}`] ?? null;\n  return (note !== undefined ? PERC[`${bank}:${program}:${note}`] : undefined) ?? PERC[`${bank}:${program}`] ?? null;\n}\n\n/** \u53F0\u4E0A\u90A3\u4F4D\u600E\u4E48\u8BB0\u8C31\uFF1Akit = \u6574\u5957\u9F13\uFF08bank 128 \u6CA1\u56FA\u5B9A\u952E\uFF1A\u5199\u7684\u97F3\u9AD8 = \u6572\u54EA\u4E2A\u9F13\uFF0C\u4E94\u7EBF\u9F13\u8C31\uFF09\uFF1Bone = \u56FA\u5B9A\u6572\u4E00\u4EF6\uFF08\u9F13\u4EF6 / \u56FA\u5B9A\u539F\u901F\u7684\u97F3\u6548\uFF1A\u4E00\u7EBF\u8C31\uFF0C\u5199\u7684\u97F3\u9AD8\u4E0D\u51FA\u58F0\uFF09\uFF1Bnull = \u6709\u97F3\u9AD8\u3002 */\nexport type PercKind = { kind: \"kit\" } | { kind: \"one\"; info: PercInfo; key: number };   // key = \u56FA\u5B9A\u6572\u7684\u90A3\u4E2A\u952E\nexport function percKindOf(inst: { bank: number; program: number; note?: number }): PercKind | null {\n  if (inst.bank === 128 && inst.note === undefined) return { kind: \"kit\" };\n  if (inst.note === undefined) return null;   // note = \u6BCF\u4E2A\u97F3\u90FD\u6572\u8FD9\u4E2A\u952E\uFF08\u9F13\u4EF6 / \u97F3\u6548\u300C\u56FA\u5B9A\u539F\u901F\u300D\uFF09\uFF1B\u97F3\u6548\u5173\u4E86\u56FA\u5B9A\u539F\u901F\uFF08\u732B\u53EB\u6B4C\uFF09= \u6309\u5199\u7684\u97F3\u53D8\u8C03 = \u6709\u97F3\u9AD8\n  const info = percOf(inst.bank, inst.program, inst.bank === 128 ? inst.note : undefined);\n  return info ? { kind: \"one\", info, key: inst.note } : null;\n}\n", "// smufl.ts \u2014\u2014 Bravura\uFF08SMuFL\uFF09\u7801\u4F4D\u4E0E\u51E0\u4E2A\u5EA6\u91CF\u3002created 2026-10-06 by Claude Opus 5.5\n// \u7801\u4F4D\u89C1 SMuFL \u89C4\u8303\uFF1B\u5EA6\u91CF\uFF08\u5355\u4F4D = \u4E94\u7EBF\u8C31\u95F4\u8DDD staff space\uFF0Cy \u5411\u4E0A\u4E3A\u6B63\uFF09\u6284\u81EA\u5B98\u65B9\u5143\u6570\u636E redist/Bravura.json\uFF082026-10-06 \u4E0B\u8F7D\u6838\u5BF9\uFF09\uFF0C\n// \u5143\u6570\u636E\u6587\u4EF6\u672C\u8EAB\u4E0D\u8FDB\u4ED3\uFF08vendor/fonts/bravura/README.md\uFF09\u3002SMuFL \u7EA6\u5B9A\uFF1A\u5B57\u53F7 = 4 \u4E2A staff space\uFF081 em = 4 sp\uFF09\u3002\n\nexport const GLYPH = {\n  metNoteQuarterUp: \"\\u{ECA5}\",   // \u901F\u5EA6\u8BB0\u53F7\u91CC\u7684\u56DB\u5206\u97F3\u7B26\uFF08metronome mark\uFF09\n  gClef: \"\uE050\", fClef: \"\\u{E062}\",   // \u4F4E\u97F3\u8C31\u53F7\uFF082026-10-08\uFF09\n  gClef8vb: \"\\u{E052}\", gClef8va: \"\\u{E053}\", gClef15ma: \"\\u{E054}\", fClef8vb: \"\\u{E064}\",   // \u516B\u5EA6\u8C31\u53F7\uFF082026-10-10 v0.9.28\uFF1A\u5409\u4ED6 / \u7537\u9AD8\u97F3 8vb\u3001\u77ED\u7B1B 8va\u3001\u949F\u7434 15ma\u3001\u8D1D\u65AF 8vb\uFF09\n  ottavaAlta: \"\\u{E511}\", ottavaBassa: \"\\u{E512}\", quindicesimaAlta: \"\\u{E515}\",   // \u516B\u5EA6\u7EBF\u5F00\u5934\u7684\u5B57\uFF1A8va / 8vb / 15ma\n  noteheadWhole: \"\uE0A2\", noteheadHalf: \"\uE0A3\", noteheadBlack: \"\uE0A4\",\n  noteheadXWhole: \"\\u{E0A7}\", noteheadXHalf: \"\\u{E0A8}\", noteheadXBlack: \"\\u{E0A9}\",   // \u00D7 \u7B26\u5934\uFF082026-10-08\uFF1A\u6F14\u594F\u8005\u56FA\u5B9A\u6572\u4E00\u4E2A\u952E\u7684\u58F0\u90E8\uFF1Buser\u300C\u62AB\u9732\u5C31\u7528x\u300D\uFF09\n  augmentationDot: \"\uE1E7\",\n  flag8thUp: \"\uE240\", flag8thDown: \"\uE241\", flag16thUp: \"\uE242\", flag16thDown: \"\uE243\", flag32ndUp: \"\uE244\", flag32ndDown: \"\uE245\",\n  accidentalFlat: \"\uE260\", accidentalNatural: \"\uE261\", accidentalSharp: \"\uE262\", accidentalDoubleSharp: \"\uE263\", accidentalDoubleFlat: \"\uE264\",\n  restWhole: \"\uE4E3\", restHalf: \"\uE4E4\", restQuarter: \"\uE4E5\", rest8th: \"\uE4E6\", rest16th: \"\uE4E7\", rest32nd: \"\uE4E8\",\n} as const;\n\nexport const timeSigDigits = (n: number): string => [...String(n)].map((d) => String.fromCodePoint(0xe080 + Number(d))).join(\"\");\n\n/** \u9F13\u8C31\uFF082026-10-10 v0.10.27\uFF0CClaude Opus 5.5\uFF09\uFF1A\u6253\u51FB\u4E50\u8C31\u53F7 + \u97F3\u4E50\u4ED3\u9F20 v13 \u7684\u7B26\u5934\u540D \u2192 SMuFL \u7801\u4F4D [\u9ED1, \u4E8C\u5206, \u5168] \u548C\u5BBD\uFF08sp = Bravura advance / 250\uFF09\u3002\n *  \u7801\u4F4D\u5728\u6D4F\u89C8\u5668\u91CC\u6E32\u4E86\u4E00\u904D\u5BF9\u8FC7\u5F62\u72B6\uFF08\u4E0D\u76F2\u753B\uFF09\uFF1Ala = \u65B9\u5757\u3001ti = \u5706\u5E95\u5012\u4E09\u89D2\uFF08MuseScore \u7684\u5F62\u72B6\u97F3\u7B26\uFF09\uFF1Bcustom \u6309 smufl \u540D\u67E5 PERC_SMUFL\u3002 */\nexport const PERC_CLEF = \"\\u{E069}\";   // unpitchedPercussionClef1\uFF08\u4E24\u7AD6\u6760\uFF09\nexport const PERC_HEAD: Record<string, { ch: [string, string, string]; w: [number, number, number] }> = {\n  normal: { ch: [\"\\u{E0A4}\", \"\\u{E0A3}\", \"\\u{E0A2}\"], w: [1.18, 1.18, 1.688] },\n  x: { ch: [\"\\u{E0A9}\", \"\\u{E0A8}\", \"\\u{E0A7}\"], w: [1.16, 1.34, 1.51] },\n  \"circle-x\": { ch: [\"\\u{E0B3}\", \"\\u{E0B2}\", \"\\u{E0B1}\"], w: [0.996, 1.0, 0.996] },\n  slash: { ch: [\"\\u{E101}\", \"\\u{E103}\", \"\\u{E102}\"], w: [2.124, 3.12, 3.92] },\n  slashed1: { ch: [\"\\u{E0CF}\", \"\\u{E0D1}\", \"\\u{E0D3}\"], w: [1.18, 1.168, 1.672] },\n  slashed2: { ch: [\"\\u{E0D0}\", \"\\u{E0D2}\", \"\\u{E0D4}\"], w: [1.18, 1.172, 1.672] },\n  diamond: { ch: [\"\\u{E0DB}\", \"\\u{E0D9}\", \"\\u{E0D8}\"], w: [0.98, 0.98, 1.664] },\n  \"triangle-up\": { ch: [\"\\u{E0BE}\", \"\\u{E0BC}\", \"\\u{E0BB}\"], w: [1.172, 1.14, 1.276] },\n  \"triangle-down\": { ch: [\"\\u{E0C7}\", \"\\u{E0C5}\", \"\\u{E0C4}\"], w: [1.168, 1.14, 1.276] },\n  plus: { ch: [\"\\u{E0AF}\", \"\\u{E0AE}\", \"\\u{E0AD}\"], w: [0.996, 1.044, 1.14] },\n  la: { ch: [\"\\u{E0B9}\", \"\\u{E0B8}\", \"\\u{E0B8}\"], w: [1.252, 1.252, 1.252] },\n  ti: { ch: [\"\\u{E0CD}\", \"\\u{E0CC}\", \"\\u{E0CC}\"], w: [1.112, 1.112, 1.112] },\n};\nexport const PERC_SMUFL: Record<string, { ch: [string, string, string]; w: [number, number, number] }> = {\n  noteheadXOrnate: { ch: [\"\\u{E0AA}\", \"\\u{E0AA}\", \"\\u{E0AA}\"], w: [0.992, 0.992, 0.992] },\n  noteheadSlashX: { ch: [\"\\u{E106}\", \"\\u{E106}\", \"\\u{E106}\"], w: [2.124, 2.124, 2.124] },\n};\n\n/** \u5BBD\u5EA6\uFF08sp\uFF09\u3002 */\nexport const W = {\n  noteheadBlack: 1.18, noteheadHalf: 1.18, noteheadWhole: 1.688,\n  noteheadXBlack: 1.16, noteheadXHalf: 1.34, noteheadXWhole: 1.51,   // 2026-10-08 \u5728\u6D4F\u89C8\u5668\u91CC\u7528 measureText \u91CF\u7684 advance\uFF08400px Bravura\uFF1B\u9ED1\u7B26\u5934\u540C\u6CD5\u91CF\u5F97 1.18 = \u4E0A\u9762\u90A3\u884C\uFF0C\u65B9\u6CD5\u5BF9\u5F97\u4E0A\uFF09\n  gClef: 2.684, fClef: 2.736, sharp: 0.996, flat: 0.904, natural: 0.672, doubleSharp: 1.0, doubleFlat: 1.644,\n  dot: 0.4, timeSigDigit: 1.8,\n  restWhole: 1.128, restHalf: 1.128, restQuarter: 1.08, rest8th: 0.988, rest16th: 1.28, rest32nd: 1.452,\n} as const;\n\n/** engravingDefaults\uFF08sp\uFF09\u3002 */\nexport const ENGRAVE = {\n  staffLine: 0.13, stem: 0.12, ledger: 0.16, ledgerExt: 0.4, beam: 0.5, beamGap: 0.25, thinBar: 0.16, tieMid: 0.22,\n} as const;\n\n/** \u7B26\u5E72\u63A5\u70B9\uFF08\u7B26\u5934\u539F\u70B9\u4E3A 0,0\uFF09\uFF1A\u4E0A\u7B26\u5E72\u63A5\u53F3\u8FB9 y=+0.168\uFF1B\u4E0B\u7B26\u5E72\u63A5\u5DE6\u8FB9 y=-0.168\uFF08\u9ED1 / \u767D\u7B26\u5934\u76F8\u540C\uFF09\u3002 */\nexport const STEM_UP_SE: [number, number] = [1.18, 0.168];\nexport const STEM_DOWN_NW: [number, number] = [0, -0.168];\n/** \u7B26\u5C3E\u63A5\u70B9\uFF08\u7B26\u5C3E\u539F\u70B9\u4E3A 0,0\uFF09\uFF1A\u4E0A\u7B26\u5C3E stemUpNW\uFF0C\u4E0B\u7B26\u5C3E stemDownSW\u3002 */\nexport const FLAG_ANCHOR_UP: Record<number, number> = { 1: -0.04, 2: -0.088, 3: 0.376 };\nexport const FLAG_ANCHOR_DOWN: Record<number, number> = { 1: 0.132, 2: 0.128, 3: -0.448 };\n", "// clef.ts \u2014\u2014 \u8C31\u53F7 / \u516B\u5EA6\u7EBF\uFF1A\u53EA\u7BA1\u753B\uFF0C\u97F3\u9AD8\u6570\u636E\u6C38\u8FDC\u662F\u5B9E\u9645\u97F3\u9AD8\u3002\u7EAF\u51FD\u6570\uFF08node \u6D4B\u8BD5 test/clef.test.ts\uFF09\u3002created 2026-10-10 by Claude Opus 5.5\n// user 2026-10-10\uFF1A\u300C\u8C31\u53F7\u7684\u663E\u793A\u6A21\u5F0F\u8DDF\u7740\u8C31\u53F7\u800C\u4E0D\u662F\u4E50\u5668\uFF0C\u7136\u540E\u5148\u4E0D\u8981\u53CC\u8C31\u7EBF\u6A21\u5F0F\uFF0C\u7136\u540E\u52A0\u4E00\u4E2A\u53EF\u4EE5\u79FB\u516B\u5EA6\u663E\u793A\u7684\u529F\u80FD\uFF08\u6216\u8005\u5176\u5B9E\u8FD9\u4E2A\u5C31\u662F\u7528\u6807\u51C6\u7684\u97F3\u4E50\u8BB0\u53F7\uFF0C\u7136\u540E\u7CFB\u7EDF\u81EA\u5DF1\u5224\u65AD\uFF1F\u80FD\u4E0D\u80FD\u8FD9\u6837\uFF1F\u300D\n//   \u2192\u300C\u9ED8\u8BA4\u81EA\u52A8\u540C\u610F\u300D\u300C\u52A0\u683C\u5F0F\u540C\u610F\u300D\u300C\u4E2D\u97F3\u8FD9\u4E2A\u51B7\u95E8\u6CA1\u4EBA\u7528\u5427\uFF0C\u5373\u4F7F\u505A\uFF0C\u81EA\u52A8\u4E5F\u4E0D\u4F1A\u9009\u300D\u300C\u94C3\u94DB\u4F1A\u5F88\u9AD8\u30028va\u53EF\u4EE5\u505A\u4E86\u5417\u300D\u3002\n// \u4F4D\u7F6E\u7684\u5355\u4F4D = diatonicIndex\uFF08C0 = 0\uFF0C\u4E00\u7EA7 = \u4E00\u4E2A\u7EBF\u6216\u95F4\uFF09\uFF1A\u9AD8\u97F3\u8C31\u53F7\u7B2C\u4E00\u7EBF E4 = 30\u3001\u7B2C\u4E94\u7EBF F5 = 38\u3002\nimport { type ClefName, type Token, type Song, CLEFS, isTimed } from \"./song.ts\";\nimport { type Pitch, diatonicIndex } from \"./pitch.ts\";\n\n/** \u8FD9\u4E2A\u8C31\u53F7\u4E0B\uFF0C\u540C\u4E00\u4E2A\u5B9E\u9645\u97F3\u9AD8\u5728\u8C31\u4E0A\u8981\u5F80\u4E0A\u632A\u51E0\u7EA7\uFF08\u9AD8\u97F3\u8C31\u53F7 = 0\uFF09\u3002\u4E0B\u52A0 8 = \u8C31\u4E0A\u5199\u9AD8\u4E00\u4E2A\u516B\u5EA6\uFF08\u5B9E\u9645\u4F4E\u516B\u5EA6\uFF09= +7\u3002 */\nexport const CLEF_SHIFT: Record<ClefName, number> = { G: 0, G8vb: 7, G8va: -7, G15ma: -14, F: 12, F8vb: 19 };\nexport const isFClef = (c: ClefName): boolean => c === \"F\" || c === \"F8vb\";\n/** \u8C31\u53F7\u7684\u300C\u672C\u5BB6\u300D\uFF08\u8C03\u53F7\u7684\u4F4D\u7F6E\u3001\u8C31\u53F7\u5B57\u5F62\u6302\u5728\u54EA\u6761\u7EBF\u8DDF\u5B83\u8D70\uFF09\u3002 */\nexport const baseClef = (c: ClefName): \"G\" | \"F\" => (isFClef(c) ? \"F\" : \"G\");\n/** \u516B\u5EA6\u7EBF\uFF1A8va\uFF081\uFF09= \u8C31\u4E0A\u753B\u4F4E\u4E00\u4E2A\u516B\u5EA6 \u2192 \u22127\uFF1B15ma\uFF082\uFF09\u2192 \u221214\uFF1B8vb\uFF08\u22121\uFF09\u2192 +7\uFF1B\u7ED3\u675F\uFF080\uFF09\u2192 0\u3002 */\nexport const ottavaShift = (s: number): number => -7 * s;\nexport const CLEF_LABEL: Record<ClefName, string> = { G: \"\u9AD8\u97F3\", G8vb: \"\u9AD8\u97F3 8vb\", G8va: \"\u9AD8\u97F3 8va\", G15ma: \"\u9AD8\u97F3 15ma\", F: \"\u4F4E\u97F3\", F8vb: \"\u4F4E\u97F3 8vb\" };\nexport const CLEF_TITLE: Record<ClefName, string> = {\n  G: \"\u9AD8\u97F3\u8C31\u53F7\", G8vb: \"\u9AD8\u97F3\u8C31\u53F7\u4E0B\u9762\u6302 8\uFF1A\u8C31\u4E0A\u5199\u7684\u97F3\u5B9E\u9645\u4F4E\u4E00\u4E2A\u516B\u5EA6\u54CD\uFF08\u5409\u4ED6\u3001\u7537\u9AD8\u97F3\uFF09\", G8va: \"\u9AD8\u97F3\u8C31\u53F7\u4E0A\u9762\u6302 8\uFF1A\u5B9E\u9645\u9AD8\u4E00\u4E2A\u516B\u5EA6\uFF08\u77ED\u7B1B\uFF09\",\n  G15ma: \"\u9AD8\u97F3\u8C31\u53F7\u4E0A\u9762\u6302 15\uFF1A\u5B9E\u9645\u9AD8\u4E24\u4E2A\u516B\u5EA6\uFF08\u949F\u7434\u3001\u94C3\uFF09\", F: \"\u4F4E\u97F3\u8C31\u53F7\", F8vb: \"\u4F4E\u97F3\u8C31\u53F7\u4E0B\u9762\u6302 8\uFF1A\u5B9E\u9645\u4F4E\u4E00\u4E2A\u516B\u5EA6\uFF08\u4F4E\u97F3\u63D0\u7434\u3001\u8D1D\u65AF\uFF09\",\n};\nexport const OTTAVA_LABEL: Record<number, string> = { 1: \"8va\", 2: \"15ma\", [-1]: \"8vb\", 0: \"\u7ED3\u675F\u516B\u5EA6\u7EBF\" };\n\nconst BOTTOM = 30, TOP = 38;\n/** \u8C31\u4E0A\u8FD9\u4E2A\u4F4D\u7F6E\u8981\u51E0\u6761\u52A0\u7EBF\u3002 */\nexport const ledgerLines = (pos: number): number => (pos > TOP ? Math.floor((pos - TOP) / 2) : pos < BOTTOM ? Math.floor((BOTTOM - pos) / 2) : 0);\n/** \u52A0\u7EBF\u8D8A\u591A\u8D8A\u96BE\u8BFB\uFF1A\u4E00\u6761 = 1\u3001\u4E24\u6761 = 3\u3001\u4E09\u6761 = 6\u3001\u56DB\u6761 = 10\uFF08\u4E09\u89D2\u6570\uFF09\u3002 */\nconst ledgerCost = (pos: number): number => { const l = ledgerLines(pos); return (l * (l + 1)) / 2; };\n/** \u5E73\u5E38\u7684\u8C31\u53F7\u5148\uFF1A\u6302 8 / 15 \u7684\u8C31\u53F7\u8981\u5E73\u5747\u6BCF\u4E2A\u97F3\u7701\u4E0B\u4E00\u6761\u4EE5\u4E0A\u7684\u52A0\u7EBF\u624D\u6362\uFF08\u4E2D\u592E C \u4E00\u6761\u52A0\u7EBF\u7167\u6837\u9AD8\u97F3\u8C31\u53F7\uFF09\u3002 */\nconst BIAS: Record<ClefName, number> = { G: 0, F: 0.1, G8vb: 1, G8va: 1, G15ma: 1.5, F8vb: 1.5 };\n\n/** \u81EA\u52A8\u8C31\u53F7\uFF1A\u7ED9\u4E00\u4E32\u8C31\u4E0A\u7684\u4F4D\u7F6E\uFF08diatonicIndex\uFF0C\u5DF2\u7ECF\u7B97\u4E0A\u516B\u5EA6\u7EBF\uFF09\uFF0C\u6311\u52A0\u7EBF\u6700\u7701\u7684\u90A3\u4E2A\u8C31\u53F7\uFF08\u52A0\u7EBF\u8D8A\u591A\u8D8A\u96BE\u8BFB\uFF0C\u6309\u4E09\u89D2\u6570\u7B97\uFF09\uFF1B\u6CA1\u6709\u97F3 = \u4E0A\u4E00\u5F20\u7EB8\u7684\uFF08\u6CA1\u6709 = \u9AD8\u97F3\uFF09\u3002\n *  \u6EDE\u540E\uFF1A\u4E0A\u4E00\u5F20\u7EB8\u7528\u7684\u8C31\u53F7\u53EA\u8981\u4E0D\u6BD4\u6700\u597D\u7684\u591A\u592A\u591A\uFF08\u591A max(1, \u4E00\u6210) \u6761\u4EE5\u5185\uFF09\u5C31\u63A5\u7740\u7528\uFF0C\u7FFB\u7EB8\u4E0D\u6765\u56DE\u8DF3\u3002 */\nexport function autoClef(positions: readonly number[], prev: ClefName | null = null): ClefName {\n  if (!positions.length) return prev ?? \"G\";\n  return pickClef((c) => positions.reduce((a, x) => a + ledgerCost(x + CLEF_SHIFT[c]) + BIAS[c], 0), positions.length, prev);\n}\nfunction pickClef(cost: (c: ClefName) => number, n: number, prev: ClefName | null): ClefName {\n  let best: ClefName = \"G\", bc = Infinity;\n  for (const c of CLEFS) { const v = cost(c); if (v < bc - 1e-9) { bc = v; best = c; } }\n  if (prev && cost(prev) <= bc + Math.max(1, 0.1 * n)) return prev;\n  return best;\n}\n/** \u4E00\u6BB5\u81EA\u52A8\u516B\u5EA6\u7EBF\u7684\u9605\u8BFB\u6210\u672C\uFF08\u52A0\u7EBF\u7684\u5355\u4F4D\uFF09\uFF1A\u6BD4\u4E3A\u4E86\u51E0\u4E2A\u97F3\u6362\u8C31\u53F7\u4FBF\u5B9C\uFF0C\u6BD4\u4E00\u4E24\u6761\u52A0\u7EBF\u8D35\u3002 */\nconst RUN_COST = 3;\n\n/** \u8FD9\u6761 track\uFF08\u4E00\u5F20\u7EB8\uFF09\u5F00\u5934\u7684\u8C31\u53F7\uFF1A\u58F0\u90E8\u5199\u4E86 = \u5B83\uFF1B\u6CA1\u5199 = \u81EA\u52A8\uFF08\u6309\u5F00\u5934\u5230\u7B2C\u4E00\u4E2A\u8C31\u53F7\u8BB0\u53F7\u4E4B\u524D\u7684\u97F3\u6311\uFF0C\u7B97\u4E0A\u516B\u5EA6\u7EBF\uFF09\u3002\n *  autoOtt\uFF08v0.9.37\uFF09= \u8FD9\u4F4D\u5F00\u7740\u81EA\u52A8\u516B\u5EA6\u7EBF\uFF1A\u6BD4\u8F83\u6BCF\u4E2A\u8C31\u53F7\u65F6\uFF0C\u5148\u5728\u90A3\u4E2A\u8C31\u53F7\u4E0B\u628A\u81EA\u52A8\u516B\u5EA6\u7EBF\u753B\u4E0A\u518D\u6570\u52A0\u7EBF\uFF08\u6BCF\u6BB5\u8BB0 RUN_COST\uFF09\u2014\u2014\n *  \u4E34\u65F6\u5192\u51FA\u53BB\u51E0\u4E2A\u97F3 = \u539F\u6765\u7684\u8C31\u53F7 + 8va\uFF1B\u6574\u6BB5\u90FD\u9AD8\uFF08\u81EA\u52A8\u516B\u5EA6\u7EBF\u4E0D\u753B\uFF0C\u8D85\u8FC7\u4E09\u5206\u4E4B\u4E00\uFF09= \u6362\u8C31\u53F7\uFF08\u8BBE\u8BA1\u7A3F\uFF1A\u300C\u4E3A\u4E86\u8FD9\u51E0\u4E2A\u97F3\u6362\u8C31\u53F7\u8BFB\u8D77\u6765\u66F4\u7D2F\u300D\uFF09\u3002 */\nexport function startClef(tokens: readonly Token[], partClef: ClefName | undefined, prev: ClefName | null, autoOtt = false): ClefName {\n  if (partClef) return partClef;\n  if (autoOtt) {\n    const cut = tokens.findIndex((t) => t.kind === \"clef\"), seg = cut < 0 ? tokens : tokens.slice(0, cut);\n    let n = 0; for (const t of seg) if (t.kind === \"note\" && t.pitch) n += 1 + (t.chord?.length ?? 0);\n    if (!n) return prev ?? \"G\";\n    return pickClef((c) => {\n      const ao = autoOttava(seg, displayStates(seg, c));\n      let v = ao.runs.length * RUN_COST;\n      seg.forEach((t, i) => { if (t.kind === \"note\" && t.pitch) for (const p of [t.pitch, ...(t.chord ?? [])]) v += ledgerCost(diatonicIndex(p as Pitch) + CLEF_SHIFT[c] + ottavaShift(ao.ott[i] ?? 0)) + BIAS[c]; });\n      return v;\n    }, n, prev);\n  }\n  const pos: number[] = [];\n  let o = 0;\n  for (const t of tokens) {\n    if (t.kind === \"clef\") break;\n    if (t.kind === \"ottava\") { o = t.shift; continue; }\n    if (t.kind === \"note\" && t.pitch) for (const p of [t.pitch, ...(t.chord ?? [])]) pos.push(diatonicIndex(p as Pitch) + ottavaShift(o));\n  }\n  return autoClef(pos, prev);\n}\n\n/** \u53CC\u624B\u8C31\u591A\u5360\u4E00\u5F20\u8C31\u7684\u4EE3\u4EF7\uFF08\u6BCF\u4E2A\u97F3\u6298\u51E0\u6761\u52A0\u7EBF\u7684\u6210\u672C\uFF09\u3002 */\nconst GRAND_BIAS = 0.5;\n/** \u5408\u79DF\u53E0\u8D77\u6765\u7684\u90A3\u4E00\u884C\uFF08v0.10.28\uFF0Csrc/score/merge.ts\uFF09\u7528\u4E0D\u7528\u53CC\u624B\u8C31\uFF1A\u4E00\u4E2A\u8C31\u53F7\uFF08\u81EA\u52A8\u6311 + \u81EA\u52A8\u516B\u5EA6\u7EBF\uFF09\u7684\u9605\u8BFB\u6210\u672C vs \u53CC\u624B\u8C31\uFF08\u4E2D\u592E C \u4EE5\u4E0A\u4E0A\u8C31\u3001\u4EE5\u4E0B\u4E0B\u8C31\uFF09+ \u6BCF\u4E2A\u97F3 GRAND_BIAS\u3002\n *  user\u300Cshare\u4E4B\u540E\u80FD\u4E0D\u80FD\u9009\u53CC\u624B\u8C31\u53F7\uFF0C\u8FD9\u6837\u723D\u4E00\u70B9\u300D\u2192\u300Cfor shared clef i dont know why there is data contract. it is just the proper way of showing multi teanants\u300D\uFF1A\u6309\u97F3\u81EA\u52A8\uFF0C\u4E0D\u5B58\u3002 */\nexport function wantsGrand(tokens: readonly Token[]): boolean {\n  const pos: number[] = []; for (const t of tokens) if (t.kind === \"note\" && t.pitch) for (const p of [t.pitch, ...(t.chord ?? [])]) pos.push(diatonicIndex(p as Pitch));\n  if (pos.length < 2) return false;\n  const c = startClef(tokens, undefined, null, true), ao = autoOttava(tokens, displayStates(tokens, c));\n  let single = ao.runs.length * RUN_COST;\n  tokens.forEach((t, i) => { if (t.kind === \"note\" && t.pitch) for (const p of [t.pitch, ...(t.chord ?? [])]) single += ledgerCost(diatonicIndex(p as Pitch) + CLEF_SHIFT[c] + ottavaShift(ao.ott[i] ?? 0)); });\n  const grand = pos.reduce((a, d) => a + ledgerCost(d >= MIDDLE_C ? d : d + CLEF_SHIFT.F), 0) + GRAND_BIAS * pos.length;\n  return grand < single;\n}\nconst MIDDLE_C = 28;   // diatonicIndex(C4)\n\n/** \u6BCF\u4E2A\u4E0B\u6807\u5904\u751F\u6548\u7684\u8C31\u53F7\u548C\u516B\u5EA6\u7EBF\uFF08\u5F00\u5934 = start\uFF09\uFF1A\u753B\u7684\u65F6\u5019\u6BCF\u4E2A\u97F3\u6309\u8FD9\u4E24\u4E2A\u632A\u4F4D\u7F6E\u3002 */\nexport function displayStates(tokens: readonly Token[], start: ClefName): { clef: ClefName[]; ott: number[] } {\n  const clef: ClefName[] = new Array(tokens.length), ott: number[] = new Array(tokens.length);\n  let c = start, o = 0;\n  tokens.forEach((t, i) => { if (t.kind === \"clef\") c = t.clef; else if (t.kind === \"ottava\") o = t.shift; clef[i] = c; ott[i] = o; });\n  return { clef, ott };\n}\n\n/** \u81EA\u52A8\u516B\u5EA6\u7EBF\uFF08v0.9.37\uFF1Buser 2026-10-10\u300C\u81EA\u52A8\u52A0\u300D\uFF0C\u8BBE\u8BA1 = ai-docs/20261010-design-answers.md\u300C8va \u81EA\u52A8\u600E\u4E48\u505A\u3001\u4EC0\u4E48\u7C92\u5EA6\u300D\uFF09\uFF1A\u5728\u5DF2\u7ECF\u6311\u597D\u7684\u8C31\u53F7\u4E0B\uFF0C\n *  \u8FDE\u7EED\u4E24\u4E2A\u4EE5\u4E0A\u3001\u6BCF\u4E2A\u90FD\u8981\u4E09\u6761\u4EE5\u4E0A\u52A0\u7EBF\u7684\u97F3\uFF08\u5F80\u4E0A = 8va\uFF0C\u5F80\u4E0B = 8vb\uFF1B8va \u4E4B\u540E\u8FD8\u8981\u4E09\u6761\u4EE5\u4E0A = 15ma\uFF09\u753B\u4E00\u6BB5\u516B\u5EA6\u7EBF\uFF1B\u4E2D\u95F4\u53EA\u9694\u4E00\u4E2A\u97F3\u6216\u4E00\u4E2A\u4F11\u6B62\u7684\u4E24\u4E32\u5E76\u6210\u4E00\u6BB5\n *  \uFF08\u9694\u7740\u7684\u90A3\u4E2A\u97F3\u632A\u4E86\u516B\u5EA6\u4E5F\u4E0D\u80FD\u53CD\u8FC7\u6765\u8981\u4E09\u6761\u4EE5\u4E0A\u52A0\u7EBF\uFF09\uFF1B\u8FD9\u79CD\u97F3\u8D85\u8FC7\u8FD9\u5F20\u7EB8\u7684\u4E09\u5206\u4E4B\u4E00 = \u6574\u6BB5\u90FD\u9AD8\uFF0C\u5F52\u81EA\u52A8\u8C31\u53F7\u7BA1\uFF0C\u4E0D\u753B\uFF1B\u624B\u5199\u7684\u516B\u5EA6\u7EBF\u8BF4\u4E86\u7B97\uFF08\u90A3\u4E00\u6BB5\u91CC\u4E0D\u81EA\u52A8\uFF09\u3002\n *  \u53EA\u7BA1\u753B\uFF0C\u4E0D\u5B58\u8FDB\u8C31\uFF08\u968F\u65F6\u91CD\u7B97\uFF09\u3002\u8FD4\u56DE\u65B0\u7684 ott\uFF08\u624B\u5199\u7684\u7167\u65E7\uFF09+ auto\uFF08\u54EA\u4E9B\u4E0B\u6807\u662F\u81EA\u52A8\u7684\uFF09+ runs\uFF08\u6BCF\u4E00\u6BB5\uFF1A\u8D77\u6B62\u4E0B\u6807\u3001\u51E0\u5EA6\uFF09\u3002 */\nexport function autoOttava(tokens: readonly Token[], ds: { clef: ClefName[]; ott: number[] }): { ott: number[]; auto: boolean[]; runs: { from: number; to: number; shift: 1 | 2 | -1 }[] } {\n  const ott = ds.ott.slice(), auto: boolean[] = new Array(tokens.length).fill(false), runs: { from: number; to: number; shift: 1 | 2 | -1 }[] = [];\n  type It = { i: number; note: boolean; hi: number; lo: number; dir: 1 | -1 | 0; manual: boolean };\n  const items: It[] = [];\n  tokens.forEach((t, i) => {\n    if (!isTimed(t)) return;\n    const manual = (ds.ott[i] ?? 0) !== 0;\n    if (t.kind !== \"note\" || !t.pitch) { items.push({ i, note: false, hi: NaN, lo: NaN, dir: 0, manual }); return; }\n    const pos = [t.pitch, ...(t.chord ?? [])].map((p) => diatonicIndex(p as Pitch) + CLEF_SHIFT[ds.clef[i]]);\n    const hi = Math.max(...pos), lo = Math.min(...pos);\n    const up = hi > TOP && ledgerLines(hi) >= 3, down = lo < BOTTOM && ledgerLines(lo) >= 3;\n    items.push({ i, note: true, hi, lo, dir: up && !down ? 1 : down && !up ? -1 : 0, manual });\n  });\n  const notes = items.filter((x) => x.note).length, cands = items.filter((x) => x.dir && !x.manual).length;\n  if (cands < 2 || cands * 3 > notes) return { ott, auto, runs };\n  // \u9694\u7740\u7684\u90A3\u4E00\u4E2A\u80FD\u4E0D\u80FD\u5E76\u8FDB\u6765\uFF1A\u4F11\u6B62\u968F\u4FBF\uFF1B\u97F3\u632A\u4E86\u516B\u5EA6\uFF08\u5F80\u4E0A\u7684\u6BB5 = \u8C31\u4E0A\u4F4E\u4E03\u7EA7\uFF09\u4E0D\u80FD\u5728\u53E6\u4E00\u5934\u8981\u4E09\u6761\u4EE5\u4E0A\u52A0\u7EBF\n  const okGap = (x: It, dir: 1 | -1) => !x.manual && (!x.note || (dir === 1 ? !(x.lo - 7 < BOTTOM && ledgerLines(x.lo - 7) >= 3) : !(x.hi + 7 > TOP && ledgerLines(x.hi + 7) >= 3)));\n  for (let k = 0; k < items.length; ) {\n    const it = items[k];\n    if (!it.dir || it.manual) { k++; continue; }\n    const dir = it.dir; let e = k, n = 1;\n    for (;;) {\n      const a = items[e + 1], b = items[e + 2];\n      if (a && a.dir === dir && !a.manual) { e += 1; n++; continue; }\n      if (a && b && b.dir === dir && !b.manual && okGap(a, dir)) { e += 2; n++; continue; }\n      break;\n    }\n    if (n >= 2) {\n      const span = items.slice(k, e + 1).filter((x) => x.note);\n      const shift: 1 | 2 | -1 = dir === -1 ? -1 : span.some((x) => x.hi - 7 > TOP && ledgerLines(x.hi - 7) >= 3) ? 2 : 1;\n      const from = items[k].i, to = items[e].i;\n      for (let j = from; j <= to; j++) { ott[j] = shift; auto[j] = true; }\n      runs.push({ from, to, shift });\n    }\n    k = e + 1;\n  }\n  return { ott, auto, runs };\n}\n\n/** \u5BFC\u51FA\u7528\uFF08v0.9.37\uFF09\uFF1A\u628A\u81EA\u52A8\u516B\u5EA6\u7EBF\u4E34\u65F6\u63D2\u6210\u8BB0\u53F7\uFF08auto: true\uFF0C\u5199 MusicXML \u65F6\u5E26 ms-auto id\uFF09\uFF0C\u522B\u7684\u8F6F\u4EF6\u7167\u6837\u770B\u5F97\u5230\uFF1B\u8BFB\u56DE\u6765\u8BA4\u51FA\u662F\u81EA\u52A8\u7684\u5C31\u8DF3\u8FC7\u3002\n *  \u8FD9\u4E00\u6BB5\u7ED3\u675F\u5728\u6574\u6761\u6700\u540E\u4E00\u4E2A\u97F3\u4E0A = \u4E0D\u63D2\u300C\u7ED3\u675F\u300D\uFF08\u4E0D\u7136\u672B\u5C3E\u591A\u51FA\u4E00\u4E2A\u7A7A\u5C0F\u8282\uFF09\u3002 */\nexport function withAutoOttava(tokens: readonly Token[], start: ClefName): Token[] {\n  const { runs } = autoOttava(tokens, displayStates(tokens, start));\n  if (!runs.length) return tokens as Token[];\n  const out = tokens.slice() as Token[];\n  for (const r of [...runs].reverse()) {\n    if (tokens.slice(r.to + 1).some((t) => isTimed(t))) out.splice(r.to + 1, 0, { kind: \"ottava\", id: 0, shift: 0, auto: true });\n    out.splice(r.from, 0, { kind: \"ottava\", id: 0, shift: r.shift, auto: true });\n  }\n  return out;\n}\n\n/** \u6574\u9996\uFF1A\u6BCF\u5F20\u7EB8\u6BCF\u4E2A\u58F0\u90E8\u5F00\u5934\u7684\u8C31\u53F7\uFF08\u6309\u7EB8\u7684\u987A\u5E8F\u4E00\u8DEF\u63A5\uFF1A\u81EA\u52A8\u7684\u6EDE\u540E\u770B\u8FD9\u4E2A\u58F0\u90E8\u5728\u4E0A\u4E00\u5F20\u7EB8\u7ED3\u5C3E\u7684\u8C31\u53F7\uFF09\u3002\u548C\u89C6\u56FE\u65E0\u5173\u2014\u2014\u672C\u6BB5 / \u5168\u90E8 / PDF \u6311\u7684\u4E00\u6837\u3002\n *  \u5927\u8C31\u8868\u7684\u58F0\u90E8\u4E0D\u5728\u91CC\u9762\uFF08\u4E0A\u9AD8\u97F3\u4E0B\u4F4E\u97F3\uFF0C\u7167\u65E7\uFF1Buser\u300C\u5148\u4E0D\u8981\u53CC\u8C31\u7EBF\u6A21\u5F0F\u300D\uFF09\u3002 */\nexport function resolveSongClefs(song: Song): Map<string, Map<string, ClefName>> {\n  const out = new Map<string, Map<string, ClefName>>(), last = new Map<string, ClefName>();\n  for (const paper of song.papers) {\n    const m = new Map<string, ClefName>(); out.set(paper.id, m);\n    for (const part of song.parts) {\n      const toks = paper.tracks[part.id]; if (!toks || part.staves === 2) continue;\n      const c = startClef(toks, part.clef, last.get(part.id) ?? null, part.autoOttava !== false);\n      m.set(part.id, c);\n      const ds = displayStates(toks, c); last.set(part.id, ds.clef.length ? ds.clef[ds.clef.length - 1] : c);\n    }\n  }\n  return out;\n}\n", "// merge.ts \u2014\u2014 \u5408\u79DF\u53E0\u8D77\u6765 = \u4E00\u6761\u865A\u62DF\u7684\u591A\u58F0\u90E8 track\uFF08v0.10.28\uFF09\uFF1A\u4E00\u5BB6\uFF08\u4E3B\u4EBA + \u623F\u5BA2\uFF09\u5728\u4E00\u5F20\u7EB8\u4E0A\u7684\u97F3\u5E76\u6210\u4E00\u6761\uFF0C\u4EA4\u7ED9\u666E\u901A\u7684\u6392\u8C31\u6D41\u7A0B\u753B\uFF08\u81EA\u5DF1\u6311\u8C31\u53F7\u3001\u592A\u5BBD = \u53CC\u624B\u8C31\u3001\u81EA\u52A8\u516B\u5EA6\u7EBF\uFF09\u3002\u53EA\u8BFB\u770B\u3002\n// created 2026-10-10 by Claude Opus 5.5\u3002user\u300Ci think it is wiser to just \u805A\u5408 all the notes and render them as they are a single polyphonic track\u300D\n//   \u300Ci dont believe one need to build a lot of wheels, just concatenate the notes and use the already-have rendering procedure for that virtual track\u300D\n//   \u300Cfor shared clef i dont know why there is data contract. it is just the proper way of showing multi teanants\u300D\uFF08= \u4E0D\u5B58\u4E1C\u897F\uFF0C\u7EAF\u770B\u6CD5\uFF09\u3002\n// \u4EE5\u524D\uFF08v0.10.24\u201327\uFF09\u5404\u4EBA\u7684\u97F3\u5404\u753B\u5404\u7684\u3001\u53E0\u5728\u4E3B\u4EBA\u90A3\u4E00\u884C = \u7B26\u5E72\u6253\u67B6\uFF08user\u300C\u874C\u86AA\u7684\u5C3E\u5DF4\u5728\u6253\u67B6\u300D\uFF09\u3002\nimport { headLen, isTimed, WHOLE, type Token, type NoteTok, type Art } from \"./song.ts\";\nimport { midiOf, type Pitch } from \"./pitch.ts\";\n\ninterface Ev { t0: number; t1: number; ps: Pitch[]; host: NoteTok | null; heads: Art[] }\n/** \u7B26\u5934\u4E0A\u770B\u5F97\u51FA\u6765\u7684\u90A3\u51E0\u79CD\u6F14\u594F\u6CD5\uFF08\u5E7D\u7075\u97F3 = \u62EC\u53F7\u3001\u6C14\u58F0 = \u00D7\uFF09\uFF1A\u5E76\u8FDB\u6765\u7684\u548C\u5F26\u91CC\u65B0\u8D77\u7684\u97F3\u90FD\u6709 = \u548C\u5F26\u5E26\u4E0A\uFF08v0.10.33\uFF1Buser\u300C\u7B26\u5934\u5C5E\u6027\u6BD4\u5982\u5E7D\u7075\u97F3\u8FD9\u79CD\u80FD\u663E\u793A\u7684\u53EF\u4EE5\u5728\u5408\u79DF\u8C31\u4E0A\u663E\u793A\u300D\uFF09\u3002 */\nconst HEAD_ARTS: readonly Art[] = [\"ghost\", \"whisper\"];\n\n/** \u51E0\u6761 track\uFF08\u7B2C\u4E00\u6761 = \u4E3B\u4EBA\uFF09\u2192 \u4E00\u6761\uFF1A\n *  \u00B7 \u5207\u70B9 = \u4EFB\u4F55\u4EBA\u7684\u97F3\u5F00\u59CB / \u7ED3\u675F\u7684\u5730\u65B9 + \u4E3B\u4EBA\u7684\u8BB0\u53F7\u6240\u5728\u7684\u5730\u65B9\uFF1B\u6BCF\u4E00\u6BB5 = \u90A3\u4E00\u523B\u6B63\u5728\u54CD\u7684\u6240\u6709\u97F3\u5E76\u6210\u4E00\u4E2A\u548C\u5F26\uFF08\u4ECE\u9AD8\u5230\u4F4E\u3001\u540C\u97F3\u53EA\u7559\u4E00\u4E2A\uFF09\uFF0C\u6CA1\u4EBA\u54CD = \u4F11\u6B62\uFF1B\n *  \u00B7 \u8FD9\u4E00\u6BB5\u6CA1\u6709\u65B0\u8D77\u7684\u97F3\uFF08\u53EA\u662F\u522B\u4EBA\u90A3\u8FB9\u7ED3\u675F\u4E86 / \u8BB0\u53F7\u5207\u5F00\u7684\uFF09= \u8FDE\u7740\u4E0A\u4E00\u6BB5\uFF08tie\uFF09\uFF1B\u6709\u65B0\u8D77\u7684\u97F3\u65F6\u8FD8\u5728\u54CD\u7684\u957F\u97F3\u7167\u6837\u753B\u8FDB\u548C\u5F26\uFF08\u5355\u58F0\u90E8\u5199\u6CD5\u8868\u8FBE\u4E0D\u4E86\u300C\u53EA\u8FDE\u5176\u4E2D\u4E00\u4E2A\u97F3\u300D\uFF09\uFF1B\n *  \u00B7 \u4E3B\u4EBA\u7684\u8BB0\u53F7\uFF08\u529B\u5EA6 / \u6E10\u5F3A\u6E10\u5F31 / \u5C0F\u8282\u7EBF / \u53CD\u590D / \u98CE\u683C / \u901F\u5EA6 / \u8C03\u53F7 / \u62CD\u53F7\u2026\uFF09\u6309\u539F\u6765\u7684\u4F4D\u7F6E\u7559\u7740\uFF08\u539F token\uFF0Cid \u4E0D\u53D8\uFF09\uFF1B\u8C31\u53F7 / \u516B\u5EA6\u7EBF\u4E0D\u8981\uFF08\u8FD9\u4E00\u884C\u81EA\u5DF1\u6311\uFF09\uFF1B\n *  \u00B7 \u6B4C\u8BCD = \u4E3B\u4EBA\u5728\u8FD9\u4E00\u523B\u8D77\u7684\u90A3\u4E2A\u97F3\u7684\uFF1B\n *  \u00B7 keyOf\uFF1A\u628A\u67D0\u4E00\u4F4D\u7684\u97F3\u6362\u6210\u522B\u7684\u97F3\u9AD8\uFF08\u4E00\u5BB6\u5168\u662F\u9F13\uFF1A\u56FA\u5B9A\u6572\u4E00\u4EF6\u7684 = \u90A3\u4E00\u4EF6\u7684\u9F13\u952E\uFF0C\u597D\u753B\u5728\u4E94\u7EBF\u9F13\u8C31\u4E0A\u5B83\u90A3\u4E00\u7EBF\uFF09\uFF1B\n *  \u00B7 pick\uFF1A\u53EA\u8981\u7B2C\u51E0\u4F4D\u3001\u4ECE\u54EA\u4E00\u523B\u8D77\u7684\u90A3\u4E9B\u97F3\uFF08\u53CC\u624B\u8C31\u4E0A / \u4E0B\u90A3\u5F20\u3001\u58F0\u90E8 1 / 2 \u5404\u5E76\u4E00\u6761\u2014\u2014\u89C1 planHands\uFF09\uFF1Bmarks = \"bars\"\uFF1A\u53EA\u7559\u5C0F\u8282\u7EBF / \u8C03\u53F7 / \u62CD\u53F7\uFF08\u529B\u5EA6\u3001\u6B4C\u8BCD\u5F52\u6700\u4E0A\u9762\u90A3\u6761\uFF09\u3002\n *  \u65B0\u9020\u7684\u97F3 / \u4F11\u6B62 id \u662F\u8D1F\u6570\uFF08\u4E0D\u548C\u771F token \u649E\uFF09\u3002 */\nexport interface MergeOpts { keyOf?: (member: number, p: Pitch) => Pitch; pick?: (member: number, t0: number) => boolean; marks?: \"all\" | \"bars\" }\n\n/** \u5408\u79DF\u53E0\u8D77\u6765\u600E\u4E48\u5206\u624B / \u5206\u58F0\u90E8\uFF08v0.10.31\uFF1Buser\u300C\u6211\u73B0\u5728\u89C9\u5F97\u5408\u79DF\u7684\u65F6\u5019\u8FD8\u662F\u667A\u80FD\u5206\u5DE6\u53F3\u624B\u548C\u58F0\u90E8\u7684\u5BF9\u5E94\u5173\u7CFB\u6BD4\u8F83\u597D\u300D\u300C\u4EE5\u53CA\u4F60\u4E5F\u53EF\u4EE5\u9009\u62E9\u5408\u79DF\u7684\u65F6\u5019\u4E0D\u7528\u53CC\u624B\u8C31\u300D\n *  \u300C\u53CC\u624B\u8C31\u7EBF\u7684\u5206\u5DE5\u80FD\u4E0D\u80FD\u66F4\u667A\u80FD\u4E00\u70B9\uFF0C\u6BD4\u5982\u5982\u679C\u6708\u8BFB\u51E0\u4E4E\u90FD\u662F\u9AD8\u97F3\u8C31\u53F7\uFF0C\u53E6\u5916\u4E00\u4E2A\u51E0\u4E4E\u90FD\u662F\u4F4E\u97F3\u8C31\u53F7\uFF0C\u90A3\u4E48\u51E0\u4E2Aoutlier\u4E0D\u8981\u4E71\u8BA4\u9886\u3002\u4F60\u89C9\u5F97\u5C0F\u8282\u7684\u7C92\u5EA6\u7B97\uFF1F\u300D\u300Cpiano3\u2026\u786E\u5B9E\u4F1A\u9AD8\u4F4E\u58F0\u90E8\u4E71\u8DD1\u300D\uFF09\uFF1A\n *  \u00B7 \u6BCF\u4F4D\u4E00\u5F20\u300C\u5BB6\u300D\u8C31\uFF1A\u8FD9\u5F20\u7EB8\u4E0A\u5B83\u6240\u6709\u97F3\u7684\u4E2D\u4F4D\u6570\u5728\u4E2D\u592E C \u4EE5\u4E0A = \u4E0A\u8C31\uFF0C\u4EE5\u4E0B = \u4E0B\u8C31\u3002\u5927\u5BB6\u90FD\u5728\u540C\u4E00\u8FB9\u3001\u6216\u8005\u4E00\u5F20\u8C31\u8BFB\u5F97\u4E0B\uFF08clef.ts wantsGrand\uFF09= \u4E00\u5F20\u8C31\uFF0C\u4E0D\u7528\u53CC\u624B\u8C31\uFF1B\n *  \u00B7 \u53CC\u624B\u8C31\u65F6\u6309**\u5C0F\u8282**\u6362\uFF1A\u8FD9\u4E00\u5C0F\u8282\u5B83\u7684\u97F3\u660E\u663E\u5728\u53E6\u4E00\u8FB9\uFF08\u4E2D\u4F4D\u6570\u79BB\u4E2D\u592E C \u8D85\u8FC7\u4E00\u4E2A\u56DB\u5EA6\uFF09\u624D\u6362\u8FC7\u53BB\uFF0C\u51E0\u4E2A\u51FA\u683C\u7684\u97F3\u4E0D\u6362\uFF08\u4E71\u8DD1\u7684\u90A3\u4F4D\u4E00\u5C0F\u8282\u4E00\u5C0F\u8282\u8DDF\u7740\u8D70\uFF09\uFF1B\n *  \u00B7 \u540C\u4E00\u5F20\u8C31\u4E0A\u540C\u4E00\u5C0F\u8282\u6709\u4E24\u4F4D\u4EE5\u4E0A = \u6309\u5404\u4EBA\u7684\u4E2D\u4F4D\u6570\u5728\u6700\u5927\u7684\u7A7A\u5F53\u5904\u5206\u4E24\u7EC4\uFF1A\u4E0A\u9762\u90A3\u7EC4 = \u58F0\u90E8 1\uFF08\u7B26\u5E72\u671D\u4E0A\uFF09\u3001\u4E0B\u9762\u90A3\u7EC4 = \u58F0\u90E8 2\uFF08\u7B26\u5E72\u671D\u4E0B\uFF09\uFF1B\u540C\u7EC4\u7684\u5E76\u6210\u548C\u5F26\u3002\n *  pick(\u8C31 0 \u4E0A / 1 \u4E0B, \u58F0\u90E8 1 / 2) = \u7ED9 mergeTracks \u7684 pick\u3002 */\nexport interface HandPlan { grand: boolean; pick: (staff: 0 | 1, voice: 1 | 2) => (member: number, t0: number) => boolean }\nconst SWITCH = 5;   // \u6362\u8C31\u7684\u95E8\u69DB\uFF08\u534A\u97F3\uFF0C\u4E00\u4E2A\u56DB\u5EA6\uFF09\n/** homes\uFF08\u53EF\u9009\uFF09\uFF1A\u5404\u4F4D\u7684\u5BB6\u8C31 = \u5B83\u62C6\u5F00\u6765\u65F6\u7684\u8C31\u53F7\uFF08\u4F4E\u97F3\u8C31\u53F7 = \u4E0B\u8C31\u3001\u9AD8\u97F3\u8C31\u53F7 = \u4E0A\u8C31\uFF1Bnull = \u5B83\u81EA\u5DF1\u662F\u5927\u8C31\u8868 / \u4E0D\u77E5\u9053 \u2192 \u6309\u97F3\u9AD8\u4E2D\u4F4D\u6570\uFF09\u3002v0.10.38\uFF1Buser\u300C\u6240\u4EE5\u5408\u79DF\u7684\u65F6\u5019\u5206\u8C31\u53F7\u4F60\u7528\u7684\u662F\u5206\u8F68\u7684\u65F6\u5019\u7684\u8C31\u53F7\u5206\u914D\u5BF9\u5427\uFF0C\u806A\u660E\uFF01\u300D\u2014\u2014\n *  \u539F\u6765\u53EA\u6309\u4E2D\u4F4D\u6570\uFF0C\u8FD9\u4E00\u7248\u7167\u8FD9\u4E2A\u601D\u8DEF\u6539\u6210\u5148\u770B\u5404\u4F4D\u81EA\u5DF1\u7684\u8C31\u53F7\uFF08\u548C\u62C6\u5F00\u6765\u770B\u7684\u4E00\u81F4\uFF0C\u624B\u52A8\u8BBE\u8FC7\u7684\u8C31\u53F7\u4E5F\u7B97\u6570\uFF09\u3002 */\n/** force\uFF08v0.10.42\uFF09\uFF1A\u4E3B\u4EBA\u81EA\u5DF1\u8BBE\u6210\u5927\u8C31\u8868 = \u8FD9\u4E00\u884C\u4E00\u5B9A\u662F\u53CC\u624B\u8C31\uFF08user\u300C\u5C31\u662F\u6211\u5E0C\u671B\u8BA9\u5408\u79DF\u662Fgrand staff\u8C03piano1\u6CA1\u7528\u9700\u8981\u8C032\uFF0C\u5F88\u5947\u602A\u300D\u2014\u2014\u539F\u6765\u53EA\u770B\u5404\u4F4D\u7684\u5BB6\u8C31\u5206\u4E0D\u5206\u4E24\u8FB9\uFF0C\n *  \u4E3B\u4EBA\u8BBE\u5927\u8C31\u8868\u4E0D\u7B97\u6570\uFF1B\u623F\u5BA2\u91CC\u8C01\u8BBE\u6210\u5927\u8C31\u8868\u624D\u4F1A\u6309\u97F3\u9AD8\u6389\u5230\u4E0B\u8C31\uFF09\u3002\u5404\u4F4D\u7684\u8C31\u53F7\u90FD\u5728\u540C\u4E00\u8FB9\u65F6 = \u6309\u97F3\u9AD8\u4E2D\u4F4D\u6570\u5728\u6700\u5927\u7684\u7A7A\u5F53\u5904\u5206\u4E0A\u4E0B\uFF08\u4E0A\u9762\u90A3\u7EC4 = \u4E0A\u8C31\uFF09\u3002 */\nexport function planHands(tracks: Token[][], wantsGrand: (merged: Token[]) => boolean, homes?: readonly (0 | 1 | null)[], force = false): HandPlan {\n  const host = tracks[0] ?? [], time = host.find((t) => t.kind === \"time\") as { beats?: number; beatType?: number } | undefined;\n  const bar = ((time?.beats ?? 4) * WHOLE) / (time?.beatType ?? 4), meas = (t: number) => Math.floor(t / bar + 1e-9);\n  const med = (xs: number[]) => { const a = [...xs].sort((x, y) => x - y); return a.length ? a[a.length >> 1] : NaN; };\n  const per = tracks.map((toks) => { const notes: { t: number; m: number[] }[] = []; let t = 0;\n    for (let i = headLen(toks); i < toks.length; i++) { const k = toks[i]; if (!isTimed(k)) continue; if (k.kind === \"note\" && k.pitch) notes.push({ t, m: [k.pitch, ...(k.chord ?? [])].map(midiOf) }); t += k.dur; }\n    return notes; });\n  const mid = per.map((ns) => med(ns.flatMap((n) => n.m))), home = mid.map((x, i) => homes?.[i] ?? ((Number.isNaN(x) || x >= 60 ? 0 : 1) as 0 | 1));\n  const present = mid.map((x, i) => (Number.isNaN(x) ? -1 : i)).filter((i) => i >= 0);\n  if (force && present.length >= 2 && new Set(present.map((i) => home[i])).size < 2) {\n    const order = [...present].sort((x, y) => mid[y] - mid[x]); let cut = 1, g = -1;\n    for (let k = 0; k + 1 < order.length; k++) { const d = mid[order[k]] - mid[order[k + 1]]; if (d > g) { g = d; cut = k + 1; } }\n    order.forEach((m, k) => { home[m] = k < cut ? 0 : 1; });\n  }\n  const grand = force || (new Set(present.map((i) => home[i])).size > 1 && wantsGrand(mergeTracks(tracks)));\n  const staffCache = new Map<string, 0 | 1>(), staffOf = (m: number, ms: number): 0 | 1 => {\n    if (!grand) return 0;\n    const key = `${m}:${ms}`, hit = staffCache.get(key); if (hit !== undefined) return hit;\n    const mm = med(per[m].filter((n) => meas(n.t) === ms).flatMap((n) => n.m));\n    const st: 0 | 1 = Number.isNaN(mm) ? home[m] : home[m] === 1 && mm >= 60 + SWITCH ? 0 : home[m] === 0 && mm < 60 - SWITCH ? 1 : home[m];\n    staffCache.set(key, st); return st;\n  };\n  const voiceCache = new Map<string, 1 | 2>(), voiceOf = (m: number, ms: number): 1 | 2 => {\n    const key = `${m}:${ms}`, hit = voiceCache.get(key); if (hit !== undefined) return hit;\n    const s = staffOf(m, ms), mates = present.filter((j) => staffOf(j, ms) === s && per[j].some((n) => meas(n.t) === ms)).sort((x, y) => mid[y] - mid[x]);\n    let cut = mates.length;   // \u5206\u7EC4\uFF1A\u6700\u5927\u7684\u7A7A\u5F53\u5904\uFF08\u53EA\u6709\u4E00\u4F4D = \u90FD\u662F\u58F0\u90E8 1\uFF09\n    if (mates.length >= 2) { let g = -1; for (let i = 0; i + 1 < mates.length; i++) { const d = mid[mates[i]] - mid[mates[i + 1]]; if (d > g) { g = d; cut = i + 1; } } }\n    for (let i = 0; i < mates.length; i++) voiceCache.set(`${mates[i]}:${ms}`, i < cut ? 1 : 2);\n    return voiceCache.get(key) ?? 1;\n  };\n  return { grand, pick: (staff, voice) => (m, t) => staffOf(m, meas(t)) === staff && voiceOf(m, meas(t)) === voice };\n}\nexport function mergeTracks(tracks: Token[][], opt: MergeOpts = {}): Token[] {\n  const { keyOf, pick } = opt, barsOnly = opt.marks === \"bars\";\n  const host = tracks[0] ?? [], head = host.slice(0, headLen(host));\n  const evs: Ev[] = [], marks: { t: number; tok: Token }[] = [];\n  let end = 0;\n  tracks.forEach((toks, m) => {\n    let t = 0;\n    for (let i = headLen(toks); i < toks.length; i++) {\n      const k = toks[i];\n      if (isTimed(k)) {\n        if (k.kind === \"note\" && k.pitch) {\n          const ps = [k.pitch, ...(k.chord ?? [])].map((p) => (keyOf ? keyOf(m, p) : p));\n          if (!pick || pick(m, t)) evs.push({ t0: t, t1: t + k.dur, ps, host: m === 0 && !barsOnly ? k : null, heads: (k.art ?? []).filter((a) => HEAD_ARTS.includes(a)) });\n        }\n        t += k.dur;\n      } else if (m === 0 && k.kind !== \"clef\" && k.kind !== \"ottava\" && (!barsOnly || k.kind === \"bar\" || k.kind === \"key\" || k.kind === \"time\")) marks.push({ t, tok: k });\n    }\n    end = Math.max(end, t);\n  });\n  const cuts = [...new Set([0, end, ...evs.flatMap((e) => [e.t0, e.t1]), ...marks.map((x) => x.t)])].filter((x) => x <= end).sort((a, b) => a - b);\n  const out: Token[] = [...head];\n  let id = -1000, prevChord = false;\n  for (let i = 0; i < cuts.length; i++) {\n    const a = cuts[i], b = cuts[i + 1];\n    for (const x of marks) if (x.t === a) out.push(x.tok);\n    if (b === undefined) break;\n    const on = evs.filter((e) => e.t0 <= a && e.t1 > a);\n    if (!on.length) {\n      const last = out[out.length - 1];\n      if (last && last.kind === \"rest\" && last.id <= -1000) out[out.length - 1] = { ...last, dur: last.dur + (b - a) };   // \u8FDE\u7740\u7684\u7A7A\u5E76\u6210\u4E00\u4E2A\u4F11\u6B62\n      else out.push({ kind: \"rest\", id: id--, dur: b - a } as Token);\n      prevChord = false; continue;\n    }\n    const freshK = new Set<number>(), seen = new Set<number>();\n    for (const e of on) if (e.t0 === a) for (const p of e.ps) freshK.add(midiOf(p));\n    const all = on.flatMap((e) => e.ps).filter((p) => { const k = midiOf(p); if (seen.has(k)) return false; seen.add(k); return true; }).sort((x, y) => midiOf(y) - midiOf(x));\n    const ps = all;\n    const fresh = ps.some((p) => freshK.has(midiOf(p))), h = on.find((e) => e.host && e.t0 === a)?.host ?? null;\n    const src = on.filter((e) => e.t0 === a).length ? on.filter((e) => e.t0 === a) : on, art = HEAD_ARTS.filter((x) => src.every((e) => e.heads.includes(x)));   // \u65B0\u8D77\u7684\u90A3\u51E0\u4E2A\u90FD\u6709\u624D\u7B97\uFF08\u8FDE\u7740\u7684\u6BB5\u8DDF\u7740\u8D77\u5934\u90A3\u51E0\u4E2A\uFF09\n    out.push({ kind: \"note\", id: id--, pitch: ps[0], ...(ps.length > 1 ? { chord: ps.slice(1) } : {}), dur: b - a, lyric: h?.lyric ?? null, ...(h?.hyph ? { hyph: true } : {}), ...(!fresh && prevChord ? { tie: true } : {}), ...(art.length ? { art } : {}) } as Token);\n    prevChord = true;\n  }\n  return out;\n}\n", "// engrave.ts \u2014\u2014 \u4E00\u9996\u6B4C\uFF08\u51E0\u5F20\u7EB8 \u00D7 \u51E0\u4E2A\u58F0\u90E8\uFF09\u2192 \u4E94\u7EBF\u8C31\u7684\u7ED8\u56FE\u6307\u4EE4 + \u547D\u4E2D\u6570\u636E\uFF08\u7EAF\u51FD\u6570\uFF0CNode \u91CC\u53EF\u6D4B\uFF09\u3002created 2026-10-06 by Claude Opus 5.5\uFF1B2026-10-07 UX-2 \u91CD\u5199\uFF1B\n//   2026-10-08 \u591A\u58F0\u90E8\u591A\u7EB8\uFF080.5.0\uFF0CClaude Fable 5.1\uFF1Buser\u300C\u603B\u8C31\u5F0F\u4E0A\u4E0B\u53E0\u300D\u300Ctoggle visibility, mute, solo\u300D\u300C\u6211\u4EE5\u4E3A\u7EB8\u5C31\u662F\u66F2\u6BB5\u300D\u300C\u6BCF\u4E2Asheet\u7684track\u6570\u91CF\u5F53\u7136\u4E0D\u540C\u300D\uFF09\u3002\n// \u8303\u56F4\uFF1A\u9AD8\u97F3\u8C31\u8868\uFF1B\u8C31\u5934\uFF08\u6BCF\u6761 track \u5F00\u5934\u4E09\u4E2A\u8BB0\u53F7 token\uFF1A\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\uFF09+ \u4E2D\u9014\u7684\u8BB0\u53F7 token\uFF1B\u7B26\u5934 / \u7B26\u5E72 / \u7B26\u5C3E / \u7B26\u6760 / \u9644\u70B9 / \u4E34\u65F6\u8BB0\u53F7\uFF08\u5C0F\u8282\u5185\u8BB0\u5FC6\uFF09/ \u52A0\u7EBF / \u4F11\u6B62\uFF1B\n// \u62C6\u5F00\u7684\u65F6\u503C\u7528\u8FDE\u97F3\u7EBF\u8FDE\uFF1B\u6570\u636E\u91CC\u7684 tie\uFF08\u300C\u2212\u300D\u8DE8\u5C0F\u8282\u7EBF\u5F00\u7684\u97F3\uFF09\u4E5F\u753B\u8FDE\u97F3\u7EBF\uFF1B\u4E09 / \u4E94 / \u516D / \u4E03\u8FDE\u97F3\u753B\u62EC\u53F7\u548C\u6570\u5B57\uFF1B\n// \u5C0F\u8282\u7EBF\uFF1A\u6309\u62CD\u53F7\u81EA\u52A8\u6570\uFF08autoBars\uFF0C\u9ED8\u8BA4\u5F00\uFF1B\u53EA\u753B\u3001\u4E0D\u8FDB\u6570\u636E\uFF0C\u548C\u5B58 MusicXML \u65F6\u5207\u5C0F\u8282\u540C\u4E00\u4E2A\u89C4\u5219\uFF09+ \u4EBA\u63D2\u7684\u300C|\u300D= \u4ECE\u8FD9\u91CC\u91CD\u65B0\u6570\n//   \uFF08\u5F31\u8D77 = \u5199\u5B8C\u5F31\u8D77\u7684\u97F3\u6309\u4E00\u4E0B\u300C|\u300D\uFF1Buser\u300C\u6309\u62CD\u53F7\u81EA\u52A8\u753B\u5C0F\u8282\u7EBF\uFF0C\u624B\u63D2\u300C|\u300D= \u4ECE\u8FD9\u91CC\u91CD\u65B0\u6570 \u53EF\u4EE5\u554A\uFF0C\u8BD5\u8BD5\uFF0C\u7136\u540E\u81EA\u52A8\u52A0\u5C0F\u8282\u4E5F\u662F\u53EF\u4EE5toggle\u7684\uFF0C\u9ED8\u8BA4\u5F00\u300D\n//   \u300C\u55EF\u5F31\u8D77\u5C31\u662F\u4F60\u5199\u4E24\u4E2A\u97F3\u7136\u540E\u52A0\u4E00\u4E2A\u5C0F\u8282\u7EBF\uFF0C\u7535\u8111\u5C31\u81EA\u52A8\u9002\u5E94\u4E86\u300D\uFF09\u3002\u8DE8\u8FC7\u81EA\u52A8\u5C0F\u8282\u7EBF\u7684\u97F3\u753B\u6210\u8FDE\u8D77\u6765\u7684\u4E24\u6BB5\uFF08\u6570\u636E\u91CC\u8FD8\u662F\u4E00\u4E2A\u97F3\uFF09\u3002\n//   \u62CD\u6570\u548C\u62CD\u53F7\u5BF9\u4E0D\u4E0A\u7684\u5C0F\u8282\u53EA\u8F7B\u6807\uFF08\u7B2C\u4E00\u5C0F\u8282\u5F53\u5F31\u8D77\u4E0D\u6807\uFF09\uFF1B\u6B4C\u8BCD\u5728\u97F3\u7B26\u4E0B\uFF0C\u82F1\u6587\u65AD\u5F00\u5904\u753B\u8FDE\u5B57\u7B26\uFF0C\u62D6\u8154\u753B\u5EF6\u957F\u7EBF\uFF1B\u7A7A\u97F3\u9AD8\u7684\u97F3\u753B\u6DE1\u8272\u3002\n// \u5199\uFF08\u5149\u6807\uFF09\uFF1A\u5149\u6807 = \u4E00\u6761\u96F6\u5BBD\u7684\u7AD6\u7EBF\uFF0C\u4E0D\u5360\u6392\u7248\u5BBD\u5EA6\u3001\u4E0D\u753B\u9884\u89C8\u3001\u4E0D\u6253\u65AD\u7B26\u6760\u2014\u2014\u632A\u5149\u6807\u3001\u5199 / \u6539\u5207\u6362\u65F6\u8C31\u9762\u4E00\u52A8\u4E0D\u52A8\n//   \uFF08user\u300C\u63D2\u5165\u4E0D\u8981\u5728\u8C31\u4E0A\u663E\u793A\u97F3\u7B26\u9884\u89C8\uFF0C\u4E5F\u4E0D\u8981\u8BA9\u8C31\u7684\u6392\u7248\u6296\u52A8\u300D\uFF1B\u4E0B\u4E00\u4E2A\u97F3\u7684\u65F6\u503C / \u5347\u964D\u5728 pad \u5DE5\u5177\u6761\u548C\u72B6\u6001\u884C\uFF09\uFF1B\n//   \u70B9\u8C31\u9762\u5199\u97F3 2026-10-07 \u62FF\u6389\uFF08user\u300C\u5148\u53BB\u6389\u89E6\u78B0\u52A0\u97F3\u7B26\u7684\u529F\u80FD\uFF0C\u4EE5\u540E\u7528\u4E13\u95E8\u7684toolstate\u505A\u300D\uFF09\u3002\u6539\uFF08\u9009\u4E2D\uFF09\uFF1A\u9009\u4E2D\u7684\u4E00\u6BB5\u9AD8\u4EAE\u3002\n// \u653E\u4E0D\u4E0B\u5C31\u50CF\u6587\u5B57\u4E00\u6837\u6298\u884C\uFF0C\u4F18\u5148\u5728\u5C0F\u8282\u7EBF\u5904\u6298\uFF1B\u53EA\u8D85\u51FA\u4E00\u70B9\u7684\u5C0F\u8282\u538B\u8FDB\u8FD9\u4E00\u884C\uFF08\u6574\u884C\u538B\u7D27 \u2264 15%\uFF09\u3002\u53F3\u7AEF\u5BF9\u9F50\u53EA\u7ED9\u300C\u4E0D\u662F\u6700\u540E\u4E00\u884C\u3001\u800C\u4E14\u5DF2\u7ECF\u6392\u5230\u516D\u6210\u4EE5\u4E0A\u300D\u7684\u884C\uFF08user\u300CiPhone SE2 \u4E00\u884C\u53EA\u6709\u4E00\u5C0F\u8282\u52A0\u4E00\u5927\u7247\u7A7A\u767D \u51E0\u4E2A\u7B80\u6613\u8BD5\u4E00\u4E0B\u300D\uFF09\uFF1A\n//   \u6B63\u5728\u5199\u7684\u6700\u540E\u4E00\u884C\u4E0D\u5BF9\u9F50 = \u6253\u5B57\u65F6\u524D\u9762\u7684\u97F3\u4E0D\u6643\uFF1B\u4E00\u884C\u5199\u6EE1\u6298\u5230\u4E0B\u4E00\u884C\u65F6\uFF0C\u4E0A\u4E00\u884C\u4F1A\u62C9\u5F00\u4E00\u6B21\u3002\n// \u591A\u58F0\u90E8\uFF08\u603B\u8C31\u5F0F\uFF09\uFF1A\u4E00\u5F20\u7EB8 = \u4E00\u5757\uFF1B\u7EB8\u5185\u5404\u58F0\u90E8\u6309 **tick**\uFF08\u4ECE\u7EB8\u7684\u5F00\u5934\u6570\uFF09\u5BF9\u9F50\u6210\u5217\u2014\u2014\u540C\u4E00\u5217\u91CC\u5404\u58F0\u90E8\u7684\u4E1C\u897F\u5DE6\u8FB9\u5BF9\u9F50\u3001\u5217\u5BBD = \u6700\u5BBD\u7684\u90A3\u4E2A\uFF1B\n//   \u4E00\u884C = \u51E0\u6761\u8C31\uFF08\u6BCF\u4E2A\u663E\u793A\u7684\u58F0\u90E8\u4E00\u6761\uFF09\u4E0A\u4E0B\u53E0\uFF0C\u5DE6\u8FB9\u4E00\u6839\u7AD6\u7EBF\u8FDE\u7740\uFF1B\u6298\u884C\u53EA\u5728\u300C\u6709\u5C0F\u8282\u7EBF\u3001\u4E14\u6CA1\u6709\u54EA\u4E2A\u58F0\u90E8\u7684\u97F3\u8DE8\u8FC7\u8FD9\u4E00\u62CD\u300D\u7684\u5217\u540E\u9762\u3002\n//   \u5C0F\u8282\u7EBF\u3001\u8C03\u53F7\u3001\u62CD\u53F7\u662F\u5404\u58F0\u90E8\u81EA\u5DF1\u7684\u753B\u6CD5\uFF08\u5951\u7EA6 \u00A77.8\uFF09\uFF1B\u901F\u5EA6\u53EA\u753B\u5728\u7B2C\u4E00\u4E2A\u58F0\u90E8\u4E0A\u9762\uFF1B\u6B4C\u624B\u724C\uFF08\u58F0\u90E8\u540D\uFF09\u5728\u6BCF\u5F20\u7EB8\u7B2C\u4E00\u884C\u5404\u6761\u8C31\u7684\u5DE6\u8FB9\u3002\n//   \u7EB8\u9876\u4E00\u6761\u66F2\u6BB5\u540D\uFF08\u591A\u4E8E\u4E00\u5F20\u7EB8\u6216\u586B\u4E86\u540D\u5B57\u624D\u753B\uFF09+ \u53F3\u8FB9\u300C\u22EF\u300D\uFF08\u7EB8\u7684\u83DC\u5355\uFF09\uFF1B\u6700\u5E95\u4E0B\u300C\uFF0B \u65B0\u7684\u7EB8\u300D\uFF08\u53EA\u5728\u7F16\u8F91\u5668\u91CC\u753B\uFF09\u3002\n\nimport { DYNS, swellOf, type ClefName, type Song, type NoteTok, type Token, type GrooveTok, type BarTok, type NavTok, type Repeat, NAV_LABEL, endingLabel, type Art, type Dyn, type Focus, type Staff, TPQ, WHOLE, DEFAULT_KEY, DEFAULT_TIME, DEFAULT_BPM, effectivePitch, isTimed, headLen, beatTicks, tempoWord, staffOfTokens, allPitches, tempoOwner, sheetEndBpm, rampSource } from \"../score/song.ts\";\nimport { grooveLabel, grooveStyle } from \"../score/groove.ts\";\nimport { dynOverridden } from \"../score/perform.ts\";\nimport { navWhy } from \"../score/repeats.ts\";\nimport { parseArrangement } from \"../score/arrange.ts\";\nimport { densityOf, type Density } from \"../score/paper.ts\";\nimport { type Pitch, diatonicIndex, keyAlter, midiOf, spellMidi } from \"../score/pitch.ts\";\nimport { percOf, type PercInfo } from \"../gm/percussion.ts\";\nimport { MELISMA_MARK, lyricShow } from \"../score/lyrics.ts\";\nimport { GLYPH, W, ENGRAVE, STEM_UP_SE, STEM_DOWN_NW, FLAG_ANCHOR_UP, FLAG_ANCHOR_DOWN, timeSigDigits, PERC_CLEF, PERC_HEAD, PERC_SMUFL } from \"./smufl.ts\";\nimport { KEY_LABEL } from \"../score/pitch.ts\";\nimport { resolveSongClefs, displayStates, autoOttava, CLEF_SHIFT, baseClef, isFClef, ottavaShift, startClef, wantsGrand } from \"../score/clef.ts\";\nimport { mergeTracks, planHands, type MergeOpts } from \"../score/merge.ts\";\n\n/** tok = \u8FD9\u4E2A\u56FE\u5143\u5C5E\u4E8E\u54EA\u4E2A token\uFF08id\uFF09\uFF1A\u5199\u5B57\u5934 / \u9009\u533A / \u5F3A\u8C03\u8272\u4E0D\u8FDB\u6392\u7248\uFF0Cscore-view \u6309 data-tok \u5728 DOM \u4E0A\u5F00\u5173 class\uFF08W-17 \u7B2C 1 \u5200\uFF0C2026-10-15\uFF09\u3002 */\nexport type Prim =\n  | { t: \"line\"; x1: number; y1: number; x2: number; y2: number; w: number; cls?: string; tok?: number }\n  | { t: \"glyph\"; x: number; y: number; ch: string; cls?: string; size?: number /* px\uFF0C\u9ED8\u8BA4 4 sp */; tok?: number }\n  | { t: \"text\"; x: number; y: number; s: string; cls?: string; size?: number /* px\uFF0C\u9ED8\u8BA4\u6B4C\u8BCD\u5B57\u53F7 */; anchor?: \"start\" | \"middle\" | \"end\"; tok?: number }\n  | { t: \"path\"; d: string; cls?: string; tok?: number }\n  | { t: \"rect\"; x: number; y: number; w: number; h: number; cls?: string; tok?: number }\n  | { t: \"icon\"; id: string; x: number; y: number; size: number; cls?: string; title?: string; tok?: number };   // \u5BB6\u65CF\u56FE\u6807\u5E93\u7684\u4E00\u4E2A\u56FE\u6807\uFF08\u9875\u9762\u91CC\u5185\u8054\u7684 sprite\uFF0C<use href=\"#id\">\uFF09\n\n/** \u8981\u753B\u7684\u4E00\u4E2A\u58F0\u90E8\uFF08\u987A\u5E8F = \u603B\u8C31\u4ECE\u4E0A\u5230\u4E0B\uFF1B\u9690\u85CF\u7684\u4E0D\u5728\u8FD9\u91CC\uFF09\u3002 */\nexport interface PartView { id: string; name: string; abbr?: string; colorIdx?: number; empty?: boolean; first?: boolean; clef?: ClefName; staves?: 2; hidden?: boolean; badges?: string[]; mono?: boolean; xHead?: boolean; perc?: PartPerc; ignores?: readonly string[]; lyricMute?: ReadonlySet<number>; noLyrics?: string }   // noLyrics = \u53F0\u4E0A\u8FD9\u4F4D\u4E0D\u5531\u5B57\uFF08\u4E50\u5668 / \u5143\u97F3\u7248\uFF09\uFF1A\u503C = \u8BF4\u7ED9\u4EBA\u542C\u7684\u90A3\u53E5   // lyricMute = \u53F0\u4E0A\u8FD9\u4F4D\u5531\u4E0D\u51FA\u6765\u7684\u6B4C\u8BCD\uFF08\u97F3\u7684 token id\uFF1B\u753B\u7070\uFF0Csrc/score/lyric-check.ts\uFF09   // mono = \u53F0\u4E0A\u7684\u662F\u5355\u58F0\u4E50\u5668\uFF08\u6708\u8BFB / \u5143\u97F3\u2026\uFF09\uFF1A\u53E0\u97F3\u91CC\u4E0B\u9762\u7684\u97F3\u753B\u7070\uFF08\u53EA\u5531\u6700\u4E0A\u9762\uFF09   // staves 2 = \u5927\u8C31\u8868\uFF08\u4E24\u884C\u4E00\u7EC4\u3001\u82B1\u62EC\u53F7\uFF1B\u4E0A\u9AD8\u97F3\u4E0B\u4F4E\u97F3\uFF09\n//   empty = \u8FD8\u6CA1\u4EBA\u4E0A\u573A\uFF08\u540D\u5B57\u753B\u6DE1\u8272\uFF09\uFF1Bfirst = \u6B4C\u91CC\u7B2C\u4E00\u4E2A\u58F0\u90E8\uFF08\u901F\u5EA6\u753B\u5728\u5B83\u4E0A\u9762\uFF09\uFF1Bclef = \u8C31\u53F7\uFF1Bhidden = \u9690\u85CF\u7684\uFF1A\u4E0D\u753B\u8C31\u3001\u7F29\u6210\u4E00\u6761\u7EC6\u884C\uFF08\u70B9\u5B83\u5F00\u6B4C\u624B\u724C\uFF09\uFF1Bbadges = \u540D\u5B57\u4E0B\u9762\u7684\u89D2\u6807\uFF08\u9759 / \u72EC / \u53EA\u770B\u5B83\uFF09\n/** \u53F0\u4E0A\u90A3\u4F4D\u662F\u9F13 / \u97F3\u6548\uFF08v0.10.27\uFF1Bsrc/gm/percussion.ts percKindOf\uFF09\uFF1Akit = \u6574\u5957\u9F13\uFF08\u5199\u7684\u97F3\u9AD8 = \u6572\u54EA\u4E2A\u9F13\uFF0C\u4E94\u7EBF\u9F13\u8C31\uFF09\uFF1Bone = \u56FA\u5B9A\u6572\u4E00\u4EF6\uFF08\u4E00\u7EBF\u8C31\uFF09\u3002 */\nexport type PartPerc = { kind: \"kit\" } | { kind: \"one\"; info: PercInfo; key: number };   // key = \u56FA\u5B9A\u6572\u7684\u90A3\u4E2A\u952E\uFF08\u5408\u79DF\u5168\u662F\u9F13\u65F6\u5E76\u6210\u4E00\u5957\u9F13\u7528\uFF09\nexport interface EngraveOpts {\n  width: number;                         // px\uFF0C\u8C31\u9762\u677F\u5BBD\n  sp: number;                            // px\uFF0C\u4E94\u7EBF\u8C31\u95F4\u8DDD\n  at: Focus;                             // \u5149\u6807 / \u9009\u4E2D\u5728\u54EA\u6761 track\n  /** \u5199\u5B57\u5934\u5728\u5149\u6807\u6240\u5728\u58F0\u90E8\u7684\u5C3E\u5DF4\u540E\u9762\uFF08\u5199\u7740\u5199\u7740\u5F80\u540E\u957F\uFF09\uFF1A\u6700\u540E\u4E00\u884C\u7167\u65E7\u753B\u5230\u53F3\u8FB9\uFF08\u5199\u7684\u5730\u65B9\uFF09\u3002\u5149\u6807 / \u9009\u533A / \u5199\u5B57\u5934\u7684\u84DD / \u5F3A\u8C03\u8272\u90FD\u4E0D\u8FDB\u6392\u7248\u2014\u2014\n   *  \u6392\u7248\u53EA\u770B\u8C31\uFF0Cscore-view \u5728 ink \u5C42\u753B\u5149\u6807\u548C\u9009\u533A\u5E26\u3001\u6309 data-tok \u5F00\u5173 class\uFF08W-17 \u7B2C 1 \u5200\uFF0C2026-10-15 Claude Fable 5.1\uFF09\u3002 */\n  tailOpen?: boolean;\n  parts: PartView[];                     // \u663E\u793A\u7684\u58F0\u90E8\n  measureLyric: (s: string) => number;   // px\uFF0C\u6B4C\u8BCD\u5B57\u53F7 = LYRIC_EM \u00D7 sp\n  titlePlaceholder?: boolean;            // \u6B4C\u540D / \u8BCD\u66F2 / \u66F2\u6BB5\u540D\u7A7A\u7740\u65F6\u753B\u6D45\u8272\u63D0\u793A + \u300C\uFF0B \u65B0\u7684\u7EB8\u300D\uFF08\u7F16\u8F91\u5668\u91CC\uFF1B\u5BFC\u51FA / \u6253\u5370\u4E0D\u753B\uFF09\n  /** \u5408\u79DF\u7684\u6BCF\u4E00\u5BB6\u90FD\u53E0\u8D77\u6765\u3001\u4E0D\u770B\u5149\u6807\u5728\u54EA\uFF08v0.10.29\uFF1A\u542C\u6A21\u5F0F\uFF1Buser\u300C\u6BCF\u4E00\u5BB6\u70B9\u5F00\u6536\u62E2\u7684ux\u600E\u4E48\u7B97\u300D\u2192 AI \u63D0\u300C\u542C\u6A21\u5F0F\u91CC\u6240\u6709\u5BB6\u4E00\u5F8B\u53E0\u8D77\u6765 / \u5199\u7684\u6A21\u5F0F\u5149\u6807\u5728\u54EA\u5BB6\u54EA\u5BB6\u5C55\u5F00\u300D\u2192\u300C12 \u540C\u610F\u300D\uFF09\u3002 */\n  foldAll?: boolean;\n  autoBars?: boolean;                    // \u6309\u62CD\u53F7\u81EA\u52A8\u753B\u5C0F\u8282\u7EBF\uFF08\u9ED8\u8BA4\u5F00\uFF09\uFF1B\u5173 = \u53EA\u753B\u4EBA\u63D2\u7684\u300C|\u300D\n  /** \u5206\u9875\u6392\u6CD5\uFF08user 2026-10-08\u300C\u663E\u793A\u6CD5\u8FD8\u52A0\u4E00\u4E2A\u5206\u9875\uFF1F\u53EF\u4EE5\u9884\u89C8\u6253\u5370\uFF0C\u8981\u6C42\u548C\u4E4B\u540E\u751F\u6210\u7684pdf wysiwyg\u300D\uFF09\uFF1A\u6309\u7EB8\u9AD8\u5206\u9875\u3001\u753B\u9875\u6846 + \u9875\u7801\uFF1Bh = \u6574\u9875\u9AD8\u3001l r t b = \u56DB\u8FB9\u8FB9\u8DDD\uFF08sp\uFF09\u3002\u6CA1\u6709 = \u8FDE\u7EED\uFF08\u4E00\u5F20\u957F\u7EB8\uFF09\u3002 */\n  page?: { h: number; l: number; r: number; t: number; b: number };\n  /** \u6B4C\u8BCD\u884C\u518D\u5F80\u4E0B\u8BA9\u591A\u5C11\uFF08sp\uFF09\uFF1APDF \u9009\u4E86\u840C\u795E\u62FC\u97F3\u65F6\uFF0C\u6C49\u5B57\u5934\u4E0A\u90A3\u4E00\u622A\u62FC\u97F3\u8981\u5730\u65B9\uFF08src/export/score-pdf.ts \u6309\u5B57\u5F62\u58A8\u8FF9\u7B97\uFF1B\u5C4F\u5E55\u4E0A = 0\uFF09\u3002 */\n  lyricRaise?: number;\n  /** \u53EA\u753B\u8FD9\u4E00\u5F20\u7EB8\uFF08\u66F2\u6BB5\uFF09\uFF1A\u89C6\u56FE\u8303\u56F4\u300C\u672C\u6BB5\u300D\uFF08user 2026-10-08\u300C\u4E0D\u540C\u66F2\u6BB5\u5E94\u8BE5\u662F\u4E0D\u540C\u9875\uFF0C\u800C\u4E0D\u662F\u4E00\u8D77\u663E\u793A\u300D\u300C\u89C6\u56FE\u91CC\u9762\u5E94\u8BE5\u4E5F\u6709\u4E2A\u8FDE\u7EED\u548C\u5206\u6BB5\u300D\uFF09\u3002 */\n  onlyPaper?: string;\n  /** \u6A2A\u5377\uFF08v0.9.35\uFF1Buser 2026-10-10\u300C\u90A3\u4E2A\u65E0\u9650\u5F80\u53F3\u7684\u603B\u8C31\u6A21\u5F0F\u4E5F\u505A\u4E00\u4E0B\u300D\uFF09\uFF1A\u4E0D\u6298\u884C\uFF0C\u6BCF\u5F20\u7EB8\u4E00\u884C\u3001\u4E00\u76F4\u5F80\u53F3\uFF1Bwidth \u53EA\u7BA1\u6B4C\u540D / \u4F5C\u8005\u680F / \u7EB8\u7684\u63A7\u4EF6\u90A3\u4E00\u5C4F\uFF0C\n   *  \u6392\u51FA\u6765\u7684 Layout.width = \u6700\u957F\u90A3\u5F20\u7EB8\u7684\u53F3\u7AEF\uFF08+ \u5C3E\u5DF4\uFF0C\u5149\u6807\u505C\u5728\u6700\u540E\u80FD\u63A5\u7740\u70B9\uFF09\u3002 */\n  scroll?: boolean;\n  /** \u8FDE\u7EED\u6392\u6CD5\u7684\u7EB8\u8FB9\u8DDD\uFF08sp\uFF09\uFF1A\u548C\u5206\u9875\u540C\u4E00\u5F20\u7EB8\u7684\u51E0\u4F55\uFF0C\u53EA\u662F\u4E0D\u65AD\u9875\uFF08user 2026-10-08\u300C\u8FDE\u7EED\u548C\u5206\u9875\u770B\u5230\u7684\u884C\u5BBD\u5E94\u8BE5\u662F\u4E00\u6837\u7684\u300D\u300C\u8FDE\u7EED\u53EA\u662F\u6CA1\u6709\u4E86\u65AD\u9875\uFF0C\u4F46\u662F\u6BCF\u4E00\u884C\u8FD8\u662F\u4E00\u6837\u7684\u300D\uFF09\u3002 */\n  margins?: { l: number; r: number; t: number; b: number };\n  paperLabel?: string;                   // \u7EB8\u53F3\u4E0A\u89D2\u7684\u5C0F\u94AE\uFF08\u6273\u624B\uFF1B\u8FD9\u91CC\u7684\u5B57\u53EA\u8FDB\u60AC\u505C\u63D0\u793A\u300C\u7EB8\uFF1AA5\u300D\uFF09\uFF1B\u70B9\u4E86 = \u7EB8\u7684\u8BBE\u7F6E\uFF08user\u300C\u8FD9\u79CD\u5E94\u8BE5\u662F\u7EB8\u7684\u53F3\u4E0A\u89D2\u6709\u4E00\u4E2A\u53EF\u4EE5\u8BBE\u7F6E\u7EB8\u7684\u5C5E\u6027\u5427\u3002\u52A0\u56FE\u7247\u7684\u5165\u53E3\u4EE5\u540E\u4E5F\u53EF\u4EE5\u653E\u90A3\u91CC\u300D\uFF1B\n                                         //   2026-10-07\u300C\u7136\u540E\u90A3\u4E2AA5\u6539\u6210\u6273\u624B\uFF0C\u662F\u5BF9\u7EB8\u7684\u914D\u7F6E\u300D\u2014\u2014\u5BB6\u65CF\u91CC\u6273\u624B = \u914D\u7F6E\u8FD9\u4E00\u6837\u4E1C\u897F\uFF0C\u540C WeebPaint \u5957\u7D22 / \u5BFC\u51FA\u56FE\u7247\u7684\u914D\u7F6E\u94AE\uFF09\n}\nexport const LYRIC_EM = 1.6;\n/** \u6309\u8282\u594F\u6392\u65F6\u9519\u5F00\u5230\u7B2C\u4E8C\u884C\u7684\u6B4C\u8BCD\u5F80\u4E0B\u632A\u591A\u5C11\uFF08sp\uFF09\u3002 */\nconst LYRIC_ROW2 = LYRIC_EM * 1.2;\nexport interface LyricFit { dx: number; scale: number; row: 0 | 1; tight: boolean }\n/** \u6B4C\u8BCD\u6309\u8282\u594F\u6392\u7684\u8BA9\u8DEF\uFF08v0.9.40\uFF1B\u8BBE\u8BA1 = ai-docs/20261010-design-answers.md\u300C\u6B4C\u8BCD\u4E0D\u60F3\u5F71\u54CD\u97F3\u7B26\u7684\u4F4D\u7F6E\u300D\uFF0Cuser approved\uFF09\uFF1A\u4E00\u884C\u91CC\u7684\u5B57\uFF08\u4E2D\u5FC3 cx\u3001\u5BBD w\uFF0C\u5355\u4F4D sp\uFF1Bhy = \u540E\u9762\u6709\u8FDE\u5B57\u7B26 = \u591A\u7559\u4E00\u70B9\uFF09\u3002\n *  \u4F9D\u6B21\uFF1A\u2460 \u5DE6\u53F3\u501F\u7A7A\uFF08\u5B57\u5F80\u65C1\u8FB9\u632A\uFF0C\u6700\u591A\u632A\u81EA\u5DF1\u5BBD\u7684 45% \u6216 0.8\uFF0C\u4E0D\u518D\u6B7B\u6B7B\u5C45\u4E2D\uFF09\u2461 \u8FD8\u6324 = \u6324\u7684\u90A3\u51E0\u4E2A\u5C0F\u4E00\u53F7\uFF08\u516B\u6210\uFF09\u2462 \u8FD8\u6324 = \u6324\u6210\u4E00\u4E32\u7684\u8F6E\u6D41\u653E\u5230\u7B2C\u4E8C\u884C\n *  \u2463 \u7B2C\u4E8C\u884C\u4E5F\u653E\u4E0D\u4E0B = \u7167\u5199\uFF0C\u6807 tight\uFF08\u753B\u7070\u3001\u6B4C\u8BCD\u6846\u4E0A\u8BF4\u300C\u6324\u4E86\u300D\uFF09\u3002\u7EAF\u51FD\u6570\u3002 */\nexport function fitLyrics(items: readonly { cx: number; w: number; hy?: boolean }[], gap = 0.5): LyricFit[] {\n  const out: LyricFit[] = items.map(() => ({ dx: 0, scale: 1, row: 0, tight: false })), scale = items.map(() => 1);\n  const g = (i: number) => gap + (items[i].hy ? 0.9 : 0);\n  const place = (idx: number[]): { pos: number[]; bad: Set<number> } => {\n    const pos = idx.map((i) => items[i].cx), half = idx.map((i) => (items[i].w * scale[i]) / 2), cap = idx.map((i) => Math.max(0.8, 0.45 * items[i].w));   // \u80FD\u632A\u591A\u8FDC\u6309\u539F\u6765\u7684\u5B57\u5BBD\uFF08\u7F29\u5C0F\u4E86\u4E5F\u7167\u6837\u80FD\u632A\u90A3\u4E48\u8FDC\uFF0C\u4E0D\u7136\u300C\u5C0F\u4E00\u53F7\u300D\u51E0\u4E4E\u4E0D\u8D77\u4F5C\u7528\uFF09\n    for (let pass = 0; pass < 4; pass++) {\n      for (let k = 1; k < idx.length; k++) { const need = pos[k - 1] + half[k - 1] + g(idx[k - 1]) + half[k]; if (pos[k] < need) pos[k] = Math.min(need, items[idx[k]].cx + cap[k]); }\n      for (let k = idx.length - 2; k >= 0; k--) { const need = pos[k + 1] - half[k + 1] - g(idx[k]) - half[k]; if (pos[k] > need) pos[k] = Math.max(need, items[idx[k]].cx - cap[k]); }\n    }\n    const bad = new Set<number>();\n    for (let k = 1; k < idx.length; k++) if (pos[k] - half[k] < pos[k - 1] + half[k - 1] + g(idx[k - 1]) - 1e-6) { bad.add(idx[k]); bad.add(idx[k - 1]); }\n    return { pos, bad };\n  };\n  const all = items.map((_, i) => i);\n  let r = place(all);\n  if (r.bad.size) { for (const i of r.bad) scale[i] = 0.8; r = place(all); }\n  if (!r.bad.size) { all.forEach((i, k) => { out[i] = { dx: r.pos[k] - items[i].cx, scale: scale[i], row: 0, tight: false }; }); return out; }\n  const row = items.map(() => 0 as 0 | 1);\n  let flip = 0; for (let i = 0; i < items.length; i++) { if (r.bad.has(i)) row[i] = (flip++ % 2) as 0 | 1; else flip = 0; }\n  for (const rr of [0, 1] as const) {\n    const idx = all.filter((i) => row[i] === rr), res = place(idx);\n    idx.forEach((i, k) => { out[i] = { dx: res.pos[k] - items[i].cx, scale: scale[i], row: rr, tight: res.bad.has(i) }; });\n  }\n  return out;\n}\nconst SCROLL_TAIL = 6;\n/** \u8C31\u524D\u7B80\u5199\u90A3\u4E00\u5217\u7684\u5BBD\u5EA6\u53C2\u7167\uFF087 \u4E2A\u534A\u89D2\u5BBD = part-colors.ts ABBR_W\uFF09\u3002 */\nconst ABBR_REF = \"Vln.Vc.\";   // sp\uFF1A\u6A2A\u5377\u6BCF\u5F20\u7EB8\u5185\u5BB9\u540E\u9762\u7559\u7684\u5C3E\u5DF4\nconst NAME_MAX = 6.5;   // sp\uFF1A\u8C31\u524D\u58F0\u90E8\u540D\u4E00\u5217\u6700\u5BBD\uFF08\u518D\u957F\u6298\u884C\uFF1Bengrave() \u91CC nameLines\uFF09\nconst TEMPO_EM = 1.35;   // \u901F\u5EA6\u8BB0\u53F7\u7684\u5B57\u53F7\uFF08sp\uFF09\n\n/** \u4E00\u6761\u8C31\u884C\uFF08\u67D0\u5F20\u7EB8\u3001\u67D0\u884C\u3001\u67D0\u4E2A\u58F0\u90E8\uFF09\uFF1Atop/bottom = \u8FD9\u4E00\u6761\u5360\u7684\u7AD6\u76F4\u8303\u56F4\uFF08\u542B\u6B4C\u8BCD\uFF09\u3002 */\nexport interface SystemBox { top: number; staffTop: number; bottom: number; paper: string; part: string; sys: number; staff: Staff; /** \u4E94\u7EBF\u8C31\u53F3\u7AEF\uFF08px\uFF1B\u64AD\u653E\u65F6\u7684\u5C0F\u8282\u5E95\u8272\u53F3\u8FB9\u754C\u7528\uFF0Cv0.10.12\uFF09\u3002 */ x1?: number;\n  /** \u8FD9\u4E00\u884C\u8C31\u4E0A\u771F\u6709\u58A8\u7684\u4E0A\u4E0B\u6CBF\uFF08px\uFF09\uFF1A\u97F3\uFF08\u542B\u53E0\u7740\u7684\u623F\u5BA2\uFF09\u3001\u7B26\u5E72\u3001\u8DF3\u97F3 / \u91CD\u97F3\u3001\u529B\u5EA6\u90A3\u51E0\u9053\u3001\u516B\u5EA6\u7EBF\u3001\u6B4C\u8BCD\uFF1B\u4E0D\u542B\u901F\u5EA6 / \u98CE\u683C\u8BB0\u53F7\uFF08\u90A3\u662F\u6574\u5F20\u8C31\u7684\uFF09\u3002\u64AD\u653E\u7684\u7070\u5757\u6309\u8FD9\u4E2A\uFF08v0.10.26\uFF09\u3002 */\n  inkTop?: number; inkBottom?: number }   // staff = \u5927\u8C31\u8868\u91CC\u662F\u4E0A\uFF081\uFF09\u8FD8\u662F\u4E0B\uFF082\uFF09\nexport interface HitNote { index: number; system: number; x: number; y: number; w: number; d: number; /** \u5408\u79DF\u7684\u58F0\u90E8 2\uFF08v0.10.28\uFF09\uFF1A\u4E0B\u6807\u6307\u8FD9\u6761\u865A\u62DF track\uFF08`\u2026~v2`\uFF09\uFF0C\u4E0D\u662F\u8FD9\u4E00\u884C\u90A3\u4E00\u4F4D\u7684\u3002 */ part?: string }\nexport interface Slot { caret: number; system: number; x: number; end?: true; /** \u8865\u9F50\u7684\u6DE1\u8272\u5C0F\u8282\u7684\u5F00\u5934\uFF1A\u70B9\u8FD9\u91CC = \u5149\u6807\u5728\u5C3E\u5DF4 + \u5148\u8865\u8FD9\u4E48\u957F\uFF08tick\uFF09\u7684\u4F11\u6B62\u518D\u5199\uFF08v0.10.6\uFF09\u3002 */ lead?: number }   // end = \u884C\u672B\u90A3\u4E2A\u843D\u70B9\uFF08\u5149\u6807\u5728\u4E0B\u4E00\u884C\u5F00\u5934\u7684\u90A3\u4E2A\u4F4D\u7F6E\uFF0C\u70B9\u5728\u8FD9\u4E00\u884C\u884C\u672B\u65F6\u753B\u5728\u8FD9\u513F\uFF09\n/** \u5149\u6807\u753B\u5728\u54EA\uFF08W-17 \u7B2C 1 \u5200\uFF1A\u6392\u7248\u4E0D\u8BA4\u5149\u6807\uFF0C\u53EA\u7ED9\u51FA\u6BCF\u4E2A caret \u4F4D\u7F6E\u8BE5\u753B\u7684\u5730\u65B9\uFF0Cscore-view \u6309 EditorState \u6311\uFF09\uFF1A\u8001\u89C4\u77E9 = \u540C\u4E00 tick \u4E0A\u6392\u5728\u5C0F\u8282\u7EBF / \u8BB0\u53F7\u540E\u9762\u3001\u97F3\u524D\u9762\uFF1B\n *  end = \u70B9\u5728\u884C\u672B\u653E\u7684\uFF08\u753B\u5728\u4E0A\u4E00\u884C\u672B\u5C3E\uFF09\uFF1Blead = \u8865\u9F50\u7684\u5C0F\u8282\u91CC\uFF1Bshift = \u90A3\u91CC\u7684\u8C31\u53F7 / \u516B\u5EA6\u7EBF\u4F4D\u79FB\uFF08\u9B3C\u97F3\u7B26\u7528\uFF09\u3002 */\nexport interface CaretHead { caret: number; system: number; x: number; shift: number; end?: true; lead?: number }\nexport interface LyricHit { index: number; system: number; x: number; y: number; tight?: true }   // x = \u6B4C\u8BCD\u4E2D\u5FC3\uFF0Cy = \u57FA\u7EBF\uFF1Btight = \u6309\u8282\u594F\u6392\u65F6\u8FD9\u4E2A\u5B57\u6324\uFF08\u753B\u7070\uFF0C\u6B4C\u8BCD\u6846\u4E0A\u8BF4\u4E00\u58F0\uFF09\n/** \u8BB0\u53F7\uFF08\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\uFF09\u7684\u70B9\u51FB\u533A\u57DF\uFF08px\uFF09\uFF1A\u70B9\u4E86\u5C31\u5730\u6539\u3002\u8C31\u5934\u7684\u8C03\u53F7 = \u8C31\u53F7 + \u8C03\u53F7\u90A3\u4E00\u5757\uFF08C \u5927\u8C03\u6CA1\u6709\u5347\u964D\u53F7\u4E5F\u70B9\u5F97\u5230\uFF09\u3002 */\nexport interface MarkHit { index: number; kind: \"key\" | \"time\" | \"tempo\"; system: number; x: number; y: number; w: number; h: number }\n/** \u8C31\u53F7 / \u516B\u5EA6\u7EBF\u7684\u70B9\u51FB\u533A\u57DF\uFF08v0.9.28\uFF09\uFF1Astart = \u6BCF\u884C\u5F00\u5934\u7684\u8C31\u53F7\uFF08index = \u7BA1\u7740\u5B83\u7684\u8C31\u53F7\u8BB0\u53F7\uFF0C\u22121 = \u58F0\u90E8\u81EA\u5DF1\u7684\u8C31\u53F7\uFF09\uFF1Bmid = \u884C\u4E2D\u95F4\u7684\u8C31\u53F7\u8BB0\u53F7\uFF1Bottava = \u516B\u5EA6\u7EBF\u5F00\u5934\u7684\u5B57\u3002 */\nexport interface ClefHit { kind: \"start\" | \"mid\" | \"ottava\"; paper: string; part: string; index: number; system: number; x: number; y: number; w: number; h: number; /** \u81EA\u52A8\u753B\u7684\u516B\u5EA6\u7EBF\uFF08v0.9.37\uFF09\uFF1Aindex = \u22121\uFF0C\u8FD9\u4E00\u6BB5\u7684\u8D77\u6B62\u4E0B\u6807\u548C\u51E0\u5EA6\u3002 */ run?: { from: number; to: number; shift: 1 | 2 | -1 } }\n/** \u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\u7684\u70B9\u51FB\u533A\u57DF\uFF08px\uFF09\uFF1A\u70B9 = \u5C0F\u83DC\u5355\uFF08\u6539 / \u5220\uFF09\uFF0C\u957F\u6309\u62D6 = \u632A\u5230\u522B\u7684\u97F3\u4E0A\uFF082026-10-08 Opus 5.5\uFF09\u3002\u6E10\u5F3A\u6E10\u5F31\u8DE8\u884C = \u6BCF\u884C\u4E00\u5757\u3002 */\nexport interface DynHit { index: number; kind: \"dyn\" | \"hairpin\" | \"groove\" | \"nav\"; system: number; x: number; y: number; w: number; h: number }   // groove = \u98CE\u683C\u8BB0\u53F7\uFF08\u62CD\u5B50\u8F7B\u91CD\uFF1B\u70B9\u4E86\u540C\u4E00\u4E2A\u5C0F\u83DC\u5355\u3001\u957F\u6309\u62D6\uFF09\n/** \u4F11\u6B62\u7684\u4F4D\u7F6E\uFF08px\uFF09\uFF1A\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\u80FD\u62D6\u5230\u4F11\u6B62\u4E0A\uFF082026-10-08 user\u300C\u529B\u5EA6\u7B26\u53F7\u5E94\u8BE5\u80FD\u62D6\u52A8\u5230\u4F11\u6B62\u7B26\u4E0A\u300D\uFF09\u3002 */\nexport interface RestHit { index: number; system: number; x: number; y: number; w: number }   // y = \u8C31\u7684\u4E2D\u7EBF\uFF08\u70B9 / \u6846\u9009\u7528\uFF09\n/** \u7EB8\u9762\u6700\u4E0A\u9762\u7684\u6B4C\u540D\u90A3\u4E00\u6761\uFF08\u70B9\u4E86\u5C31\u5730\u6539\uFF09\u3002 */\nexport interface TitleHit { x: number; y: number; w: number; h: number; baseline: number; size: number }\nexport interface Box { x: number; y: number; w: number; h: number }\nexport interface Layout {\n  prims: Prim[]; width: number; height: number; sp: number;\n  /** \u548C\u5F26\u91CC\u4E3B\u97F3\u4EE5\u5916\u7684\u90A3\u51E0\u4E2A\u7B26\u5934\uFF08\u64AD\u653E\u65F6\u4E00\u8D77\u4EAE\uFF1B\u4E0D\u8FDB notes\u2014\u2014\u70B9 / \u62D6\u8FD8\u662F\u6309\u6574\u4E2A\u97F3\uFF1Bv0.10.23\uFF0Cuser\u300C\u97F3\u7B26\u9AD8\u4EAE\u5FD8\u4E86\u505A\u548C\u5F26\u7684\u5176\u4ED6\u97F3\u7684\u9AD8\u4EAE\u300D\uFF09\u3002 */\n  chordHeads: { index: number; system: number; x: number; y: number; w: number; part?: string }[];\n  /** \u5408\u79DF\u53E0\u8D77\u6765\u7684\u8C31\u884C\uFF08\u4E0B\u6807 = systems \u91CC\u7684\uFF09\uFF1A\u53EA\u8BFB\u2014\u2014\u70B9\u4E86\u4E0D\u5199\u3001\u4E0D\u653E\u5149\u6807\uFF0C\u70B9\u540D\u5B57\u62C6\u5F00\uFF08v0.10.25\uFF0Cuser\u300Chost\u4E5F\u5E94\u8BE5\u53EA\u8BFB\uFF0C\u53EA\u6709\u5C55\u5F00\u65F6\u624D\u80FD\u7F16\u8F91\u300D\uFF09\u3002 */\n  sharedRows: number[];\n  /** \u5408\u79DF\u53E0\u8D77\u6765\u7684\u90A3\u4E00\u884C\u753B\u7684\u662F\u54EA\u6761\u865A\u62DF track\uFF08\u952E = \"\u7EB8 id:\u4E3B\u4EBA id\"\uFF1Bv0.10.28\uFF0Csrc/score/merge.ts\uFF09\uFF1A\u8FD9\u4E00\u884C\u70B9\u51FB\u533A\u7684\u4E0B\u6807\u6307\u7684\u662F\u5B83\uFF0C\u4E0D\u662F\u4E3B\u4EBA\u81EA\u5DF1\u7684 track\u3002 */\n  virtual: Record<string, Token[]>;\n  /** \u6BCF\u4E2A\u5C0F\u8282\u5728\u54EA\uFF08v0.10.28\uFF09\uFF1A\u8FD9\u5F20\u7EB8\u4E0A\u7684 tick \u533A\u95F4 + \u753B\u5728\u54EA\u4E00\u884C\uFF08systems \u4E0B\u6807\uFF09\u3001\u5C0F\u8282\u91CC\u7B2C\u4E00\u4E2A\u4E1C\u897F\u7684 x\uFF08px\uFF09\u3002\u64AD\u653E\u7684\u5C0F\u8282\u5E95\u8272\u6309\u64AD\u653E\u7684 tick \u67E5\u8FD9\u4E2A\u2014\u2014\n   *  \u4E0D\u518D\u6309\u300C\u6700\u665A\u5F00\u59CB\u7684\u90A3\u4E2A\u97F3\u300D\u627E\uFF08\u8DE8\u5C0F\u8282\u7684\u957F\u97F3 / \u8FDE\u97F3\u7EBF\u540E\u534A\u622A\u6CA1\u6709\u81EA\u5DF1\u7684\u70B9\u51FB\u533A\uFF0C\u5C0F\u8282\u5E95\u8272\u5C31\u505C\u5728\u4E0A\u4E00\u5C0F\u8282\uFF1Buser\u300C\u5C0F\u8282\u9AD8\u4EAE\u4E5F\u7B97\u9519\u4E86\u2026\u78B0\u5230\u8DE8\u5C0F\u8282\u7684\u97F3\u5C0F\u8282\u9AD8\u4EAE\u6CA1\u6709update\u300D\uFF09\u3002 */\n  measures: { paper: string; t0: number; t1: number; row: number; x: number }[];\n  /** \u5408\u79DF\u5C55\u5F00\u7740\u7684\u90A3\u4E00\u5BB6\uFF08v0.10.29\uFF09\uFF1A\u6BCF\u884C\u5DE6\u8FB9\u4E00\u6761\u62EC\u53F7\u628A\u8FD9\u4E00\u5BB6\u7684\u51E0\u884C\u62EC\u5728\u4E00\u8D77\uFF1B\u70B9\u5B83 = \u5149\u6807\u632A\u51FA\u8FD9\u4E00\u5BB6\uFF08\u53E0\u56DE\u53BB\uFF09\u3002user\u300C\u628A\u8FD9\u4E00\u5BB6\u7684\u51E0\u884C\u62EC\u5728\u4E00\u8D77\u2026\u70B9\u8FD9\u6761\u62EC\u53F7\u7B49\u4E8E\u300C\u5149\u6807\u632A\u5230\u8FD9\u4E00\u5BB6\u540E\u9762\u7D27\u6328\u7740\u7684\u90A3\u4F4D\u300D\u2026\u53EF\u4EE5\u300D\u3002 */\n  families: { paper: string; host: string; x: number; y: number; w: number; h: number }[];\n  systems: SystemBox[]; notes: HitNote[]; slots: Slot[]; heads: CaretHead[]; lyrics: LyricHit[]; marks: MarkHit[]; dyns: DynHit[]; rests: RestHit[]; title: TitleHit; clefs: ClefHit[];\n  arrangement: TitleHit | null;                 // \u7F16\u6392\u90A3\u4E00\u884C\uFF08\u53EA\u5728\u300C\u5168\u90E8\u300D\u89C6\u56FE\u91CC\u6709\uFF1B\u70B9\u4E86\u5C31\u5730\u6539\uFF09\n  credits: Box | null;                           // \u4F5C\u8005\u680F\u90A3\u4E00\u5757\u7684\u70B9\u51FB\u533A\u57DF\uFF08px\uFF1B\u7A7A\u7740\u65F6\u662F\u6D45\u8272\u63D0\u793A\uFF09\n  /** \u6BCF\u884C\u6BCF\u6839\u5C0F\u8282\u7EBF\u7684 x\uFF08px\uFF1B\u64AD\u653E\u65F6\u7684\u5C0F\u8282\u5E95\u8272\u7528\uFF0Cv0.10.12\uFF1B\u53EA\u662F\u591A\u5E26\u7684\u6570\u636E\uFF0C\u4E0D\u6539\u4EFB\u4F55\u4F4D\u7F6E\uFF09\u3002 */\n  bars: { system: number; x: number }[];\n  parts: (Box & { paper: string; part: string })[];   // \u6B4C\u624B\u724C\uFF08\u6BCF\u5F20\u7EB8\u7B2C\u4E00\u884C\u5404\u6761\u8C31\u5DE6\u8FB9\u7684\u58F0\u90E8\u540D\uFF09\u7684\u70B9\u51FB\u533A\u57DF\n  papers: { id: string; title: (TitleHit & { shown: boolean }); menu: Box | null; top: number; bottom: number; prev?: Box | null; next?: Box | null; scope?: Box }[];   // \u591A\u5F20\u7EB8\uFF1A\u6BCF\u5F20\u7EB8\u66F2\u6BB5\u540D\u90A3\u4E00\u884C\u53F3\u8FB9\u4E00\u7EC4\u300C\u2039 k/n \u203A \u672C\u6BB5 \u22EF\u300D   // \u6BCF\u5F20\u7EB8\uFF1A\u66F2\u6BB5\u540D\u90A3\u4E00\u6761\uFF08shown = \u753B\u4E86\uFF09\u3001\u300C\u22EF\u300D\u3001\u5360\u7684\u7AD6\u76F4\u8303\u56F4\n  addPaper: Box | null;                          // \u6273\u624B\u65C1\u8FB9\u7684\u300C\uFF0B\u300D\uFF08\u65B0\u7684\u7EB8\uFF1Buser\u300C\u8FD9\u4E2A\u5F88\u4F4E\u9891\u7684\uFF0C\u53EF\u4EE5\u5C0F\u52A0\u53F7\u653E\u5728\u6273\u624B\u65C1\u8FB9\u300D\uFF09\n  nav: { prev: Box | null; next: Box | null; scope: Box } | null;   // \u6B4C\u540D\u5DE6\u8FB9\u7684\u300C\u2039 2/3 \u203A\u300D+ \u7D27\u8DDF\u7740\u300C\u672C\u6BB5\u300D\u5F00\u5173\uFF08\u591A\u4E8E\u4E00\u5F20\u7EB8\u624D\u753B\uFF09\n  paperMenu: Box | null;   // \u66F2\u6BB5\u63A7\u4EF6\u6700\u540E\u7684\u300C\u22EF\u300D= \u5149\u6807\u6240\u5728\u90A3\u5F20\u7EB8\u7684\u83DC\u5355\uFF08\u7F16\u8F91\u5668\u91CC\u603B\u753B\uFF1B\u53EA\u6709\u4E00\u5F20\u7EB8\u65F6\u66F2\u6BB5\u63A7\u4EF6\u5C31\u53EA\u6709\u5B83\uFF09\n  pageX: { left: number; right: number };        // \u5206\u9875\u65F6\u7248\u5FC3\u5DE6\u53F3\u7684\u8FB9\u8DDD\uFF08px\uFF1Bsvg \u7684 viewBox \u5F80\u5DE6\u6269\u8FD9\u4E48\u591A\uFF0C\u9875\u6846\u753B\u5728\u8D1F x\uFF09\uFF1B\u8FDE\u7EED = 0\n  pages: { top: number; h: number }[];           // \u5206\u9875\u65F6\u6BCF\u9875\u5360\u7684\u7AD6\u76F4\u8303\u56F4\uFF08px\uFF09\uFF1B\u8FDE\u7EED = []\n  paperChip: Box | null;                         // \u7EB8\u53F3\u4E0A\u89D2\u5C0F\u94AE\u7684\u70B9\u51FB\u533A\u57DF\uFF08px\uFF09\n  shortBars: number;   // \u62CD\u6570\u548C\u62CD\u53F7\u5BF9\u4E0D\u4E0A\u7684\u5C0F\u8282\u6709\u51E0\u4E2A\uFF08\u72B6\u6001\u884C\u7528\uFF1B\u7B2C\u4E00\u5C0F\u8282\u5F53\u5F31\u8D77\u4E0D\u7B97\uFF09\n  /** \u6BCF\u884C\u6B4C\u8BCD\u7684\u57FA\u7EBF y\uFF08px\uFF1B= lyricY(system) \u7684\u5E73\u6570\u636E\uFF0C\u6392\u7248\u8FDB worker \u540E\u4E3B\u7EBF\u7A0B\u9760\u5B83\u91CD\u5EFA lyricY\uFF1B2026-10-21\uFF09\u3002 */\n  lyricYs: number[];\n  lyricY: (system: number) => number;\n  yOf: (system: number, d: number) => number;\n  dOf: (system: number, y: number) => number;\n}\n/** \u6392\u7248\u8FC7\u7EBF\u7528\u7684\u5E73\u6570\u636E\uFF08worker \u2192 \u4E3B\u7EBF\u7A0B structuredClone\uFF09\uFF1ALayout \u53BB\u6389\u4E09\u4E2A\u95ED\u5305\u30022026-10-21 by Claude Fable 5.1\uFF08\u6392\u7248\u8FDB worker\uFF1Buser 10-21\u300C\u8FD9\u4E2A\u6D3B\u4E5F\u52A0\u8FDB\u53BB\u300D\uFF09\u3002 */\nexport type LayoutData = Omit<Layout, \"lyricY\" | \"yOf\" | \"dOf\">;\nexport function stripLayoutFns(l: Layout): LayoutData { const { lyricY: _a, yOf: _b, dOf: _c, ...d } = l; return d; }\n/** \u628A\u4E09\u4E2A\u95ED\u5305\u88C5\u56DE\u53BB\uFF1AyOf / dOf \u53EA\u770B\u90A3\u4E00\u884C\u7684 staffTop \u548C sp\uFF08\u548C engrave \u91CC\u7684\u5B9A\u4E49\u9010\u5B57\u76F8\u540C\uFF09\uFF0ClyricY \u8BFB lyricYs\u3002test/layout-worker.test.ts \u5BF9\u7740 engrave \u539F\u88C5\u7684\u95ED\u5305\u9010\u884C\u6838\u3002 */\nexport function attachLayoutFns(d: LayoutData): Layout {\n  const half = d.sp * 0.5;\n  const yOf = (r: number, dd: number): number => d.systems[r].staffTop + (TOP_LINE - dd) * half;\n  return { ...d, yOf, dOf: (r, y) => Math.round(TOP_LINE - (y - d.systems[r].staffTop) / half), lyricY: (r) => d.lyricYs[r] };\n}\n\n// \u2500\u2500 \u5C3A\u5BF8\uFF08\u5355\u4F4D sp\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst SQUEEZE = 0.15;   // \u4E00\u884C\u6700\u591A\u538B\u7D27\u591A\u5C11\uFF08\u97F3\u7B26\u603B\u5BBD\u7684\u6BD4\u4F8B\uFF09\nconst MARGIN = 1.2, BAR_W = 1.6, TITLE_H = 5.4;   // TITLE_H = \u7EB8\u9762\u6700\u4E0A\u9762\u6B4C\u540D\u90A3\u4E00\u6761\uFF08v0.10.23\uFF1A\u6B4C\u540D\u653E\u5927\u4E86\uFF0C\u8FD9\u4E00\u6761\u8DDF\u7740\u9AD8\uFF09\nconst PAPER_H = 3.4, PAPER_GAP = 1.6, STUB_H = 2.4;\n/** \u7EB8\u4E0A\u7684\u5C0F\u63A7\u4EF6\uFF08\u4E0D\u5370\uFF09\uFF1A\u5728\u81EA\u5DF1\u90A3\u4E00\u6761\u91CC\u5C3D\u91CF\u5927\uFF082026-10-10 user\u300C\u7EB8\u5F20\u4E0A\u7684\u5C0F\u63A7\u4EF6\u65E2\u7136\u6253\u5370\u7684\u65F6\u5019\u4E0D\u663E\u793A\u3002\u5728\u4E0D\u5F71\u54CD\u70B9\u51FB\u548C\u6392\u7248\u7684\u65F6\u5019\u4E3A\u4EC0\u4E48\u4E0D\u505A\u5927\u4E00\u70B9\uFF0C\u597D\u70B9\u300D\uFF09\u2014\u2014\n *  \u9AD8 = \u66F2\u6BB5\u540D\u90A3\u4E00\u6761\uFF083.4\uFF09\u51CF\u4E0A\u4E0B\u5404 0.2\uFF1B\u5B57\u653E\u5927\uFF1B\u90A3\u4E00\u6761\u672C\u8EAB\u4E0D\u53D8\u9AD8\uFF08\u6392\u7248 / \u5206\u9875 / PDF \u90FD\u4E0D\u52A8\uFF09\u3002 */\nconst CTL_H = 3.0, CTL_GLYPH = 2.0, CTL_TEXT = 1.4;   // \u66F2\u6BB5\u540D\u90A3\u4E00\u6761\uFF1B\u7EB8\u4E0E\u7EB8\u4E4B\u95F4\u591A\u7A7A\u7684\uFF1B\u9690\u85CF\u58F0\u90E8\u7684\u7EC6\u884C\n/** \u7248\u5F0F\uFF08sp\uFF09\uFF1A\u8212\u9002 = \u8C31 7 mm\u3001\u884C\u8DDD\u7528\u539F\u6765\u7D27\u51D1\u90A3\u4E00\u6863\uFF08user 2026-10-08\u300C\u8212\u9002\u7684\u884C\u8DDD\u592A\u5BBD\u4E86\uFF0C\u53CD\u800C\u4E0D\u8212\u9002\u3002\u548C\u7D27\u51D1\u7684\u5BF9\u9F50\u300D\uFF1B0.2.x \u7684 17 sp \u9000\u5F79\uFF09\uFF1B\n *  \u7D27\u51D1 = \u8C31 5 mm\u3001\u518D\u5377\u4E00\u70B9\uFF08\u300C\u7D27\u51D1\u4E5F\u8BB8\u53EF\u4EE5\u518D\u5377\u4E00\u70B9\u300D\uFF09\uFF1A\u8C31\u4E0A\u9762 / \u6B4C\u8BCD\u4E0B\u9762\u90FD\u6536\u3001\u884C\u4E0E\u884C\u4E4B\u95F4\u4E0D\u7559\u3001\u6CA1\u6B4C\u8BCD\u7684\u90A3\u6761\u8C31\u66F4\u77EE\u3002 */\nconst SPACING: Record<Density, { staffAbove: number; rowH: number; rowHNoLyric: number; graveUpper: number; lyricBelow: number; sysGap: number }> = {\n  cozy: { staffAbove: 4.6, rowH: 13.4, rowHNoLyric: 11, graveUpper: 9.4, lyricBelow: 4.4, sysGap: 0.4 },   // graveUpper = \u5927\u8C31\u8868\u4E0A\u9762\u90A3\u6761\uFF08\u6CA1\u6B4C\u8BCD\u3001\u7D27\u6328\u7740\u4E0B\u9762\u90A3\u6761\uFF09\n  compact: { staffAbove: 4, rowH: 12.2, rowHNoLyric: 9.6, graveUpper: 8.6, lyricBelow: 4, sysGap: 0 },\n};\nexport const TOP_LINE = 38;   // \u4E94\u7EBF\u8C31\u6700\u4E0A\u9762\u90A3\u6761\u7EBF\u7684 d\uFF08attachLayoutFns \u91CD\u5EFA yOf / dOf \u8981\u5B83\uFF1B2026-10-21 \u6392\u7248\u8FDB worker\uFF09\nconst MID_LINE = 34, BOTTOM_LINE = 30;\n// \u4FEE\u7684\u5B57\u5F62\uFF08SMuFL\uFF1B\u5BBD / \u9AD8 = staff space\uFF0C\u6D4F\u89C8\u5668\u91CC\u91CF\u7684 Bravura\uFF1A\u91CD\u97F3 1.36 \u00D7 0.99\u3001\u8DF3\u97F3\u70B9 0.28\u3001\u4FDD\u6301\u7EBF 1.35 \u00D7 0.17\uFF09\u3002Above \u7684\u4ECE\u57FA\u7EBF\u5F80\u4E0A\u957F\uFF0CBelow \u7684\u5F80\u4E0B\u957F\nconst ART_GLYPH: Record<Exclude<Art, \"breath\" | \"sfz\" | \"fp\" | \"ghost\" | \"whisper\" | \"swellUp\" | \"swellDown\" | \"swellBoth\" | \"arpeggio\">, { above: string; below: string; w: number; h: number }> = {\n  stress: { above: \"\\u{E4B6}\", below: \"\\u{E4B7}\", w: 1.0, h: 1.0 },     // \u6B21\u91CD\u97F3\uFF082026-10-08 \u6DF1\u591C\uFF1B\u5BBD\u9AD8 = canvas \u91CF\u7684 Bravura \u58A8\u8FF9\uFF09\n  unstress: { above: \"\\u{E4B8}\", below: \"\\u{E4B9}\", w: 1.6, h: 0.9 },   // \u5F31\u5316\n  accent: { above: \"\\u{E4A0}\", below: \"\\u{E4A1}\", w: 1.36, h: 0.99 },\n  marcato: { above: \"\\u{E4AC}\", below: \"\\u{E4AD}\", w: 1.0, h: 1.08 },   // \u5F3A\u97F3\uFF082026-10-08\uFF1B\u5BBD\u6309\u540C\u5B57\u53F7\u548C\u91CD\u97F3\u6BD4\u7740\u91CF\u7684\uFF09\n  staccato: { above: \"\\u{E4A2}\", below: \"\\u{E4A3}\", w: 0.28, h: 0.28 },\n  tenuto: { above: \"\\u{E4A4}\", below: \"\\u{E4A5}\", w: 1.35, h: 0.17 },\n};\nconst GLYPH_BREATH = \"\\u{E4CE}\";   // breathMarkComma\n/** \u98CE\u683C\u8BB0\u53F7\u6324\u4E86\u5F80\u4E0A\u9519\u5F00\u4E00\u6761\u9053\uFF1A\u4E00\u6761\u9053\u591A\u9AD8\uFF08\u8C31\u4E0A\u7684\u7EA7\u6570\uFF0C2 \u7EA7 = 1 \u4E2A\u95F4\u8DDD\uFF09\u3002 */\nconst GROOVE_LANE = 3.4;\nconst DYN_LANE = 4.8;   // \u529B\u5EA6\u4E24\u9053\uFF1A\u5916\u9053\uFF08\u5927\u7684\u5F3A\u5F31\u7EBF\uFF09\u6BD4\u91CC\u9053\uFF08\u97F3\u7684\u4FEE\u9970\uFF09\u9AD8\u591A\u5C11\uFF08\u8C31\u4E0A\u7684\u7EA7\u6570 = 2.4 \u4E2A\u7EBF\u95F4\u8DDD\uFF09\n/** \u5F3A\u5EA6\u90A3\u4E00\u7EC4\uFF08\u91CD\u97F3 / \u5F3A\u97F3 / \u6B21\u91CD\u97F3 / \u5F31\u5316\uFF09\uFF1A\u4E00\u5F8B\u753B\u5728\u8C31\u4E0A\u65B9\uFF08user\u300C\u5F3A\u5EA6\u8BB0\u53F7\u7EDF\u4E00\u653E\u4E0A\u9762\u5427\uFF0C\u4E0D\u7136\u5BB9\u6613misleading\u300D\uFF09\u3002 */\nconst isStrength = (a: string) => a === \"accent\" || a === \"marcato\" || a === \"stress\" || a === \"unstress\";\nconst DYN_GLYPH: Record<Dyn, string> = { ppp: \"\\u{E52A}\", pp: \"\\u{E52B}\", p: \"\\u{E520}\", mp: \"\\u{E52C}\", mf: \"\\u{E52D}\", f: \"\\u{E522}\", ff: \"\\u{E52F}\", fff: \"\\u{E530}\" };     // F5 / B4 / E4 \u7684\u4E94\u7EBF\u8C31\u4F4D\u7F6E\n/** \u529B\u5EA6\u5B57\u7684\u58A8\u8FF9\uFF08sp\uFF0C\u76F8\u5BF9\u5B57\u7684\u539F\u70B9\uFF1A\u5DE6\u3001\u53F3\u3001\u57FA\u7EBF\u4EE5\u4E0A\u3001\u57FA\u7EBF\u4EE5\u4E0B\uFF09\uFF1A\u6D4F\u89C8\u5668\u91CC canvas measureText \u91CF\u7684 Bravura\uFF082026-10-08 Opus 5.5\uFF1B\u6B64\u524D\u4F30\u7684\u5BBD\u5EA6\u5C0F\u4E86\u4E00\u622A\uFF0C\u6E10\u5F3A\u6E10\u5F31\u538B\u5230\u5B57\u4E0A\uFF09\u3002\n *  \u6E10\u5F3A\u6E10\u5F31\u548C\u4E24\u5934\u7684\u5B57\u4E4B\u95F4\u7559 PIN_GAP\uFF1B\u70B9\u51FB\u533A\u57DF\u6309\u5B83\u3002 */\nconst DYN_INK: Record<string, [number, number, number, number]> = { ppp: [-0.4, 4.3, 1.1, 0.6], fff: [-0.6, 3.4, 1.8, 0.6], pp: [-0.4, 3, 1.1, 0.6], p: [-0.4, 1.5, 1.1, 0.6], mp: [-0.1, 3.3, 1.1, 0.6], mf: [-0.1, 3.3, 1.7, 0.7], f: [-0.6, 1.5, 1.8, 0.6], ff: [-0.6, 2.5, 1.8, 0.6] };\nconst PIN_GAP = 0.7;\n/** \u6E10\u5F3A\u6E10\u5F31\u6BD4\u4E00\u6574\u884C\u8FD8\u957F = \u4E0D\u753B\u53D1\u5939\uFF0C\u5199\u300Ccresc. - - -\u300D/\u300Cdim. - - -\u300D\uFF08user 2026-10-08\u300C\u5982\u679C\u4E00\u4E2A\u8D85\u7EA7\u957F\u7684<\u53F7\u4E0D\u8981\u8BA9\u5B83\u592Aawkward\u300D\uFF1B\n *  \u8BB0\u8C31\u7684\u8001\u89C4\u77E9\uFF1A\u957F\u7684\u6E10\u53D8\u7528\u6587\u5B57\u52A0\u865A\u7EBF\uFF0C\u53D1\u5939\u7559\u7ED9\u77ED\u7684\uFF09\u3002\u5B57\u53F7 / \u5927\u6982\u5B57\u5BBD\uFF08sp\uFF09\u3001\u865A\u7EBF\u4E00\u8282\u591A\u957F / \u9694\u591A\u8FDC\u3002 */\nconst PIN_WORD = { size: 2.0, w: { cresc: 4.7, dim: 3.5 } } as const, DASH = { len: 0.6, gap: 1.0 } as const;\nconst RAMP_DASH = { len: 0.5, gap: 0.4 } as const;   // \u6E10\u5230\u53D1\u5939\u7684\u865A\u7EBF\uFF08sp\uFF1B\u539F CSS 4px / 3px \u5728\u9ED8\u8BA4\u7F29\u653E\u4E0B\u5DEE\u4E0D\u591A\uFF09\nconst SHARP_POS = [38, 35, 39, 36, 33, 37, 34], FLAT_POS = [34, 37, 33, 36, 32, 35, 31];\nconst GLYPH_TUPLET = (n: number) => [...String(n)].map((d) => String.fromCodePoint(0xe880 + Number(d))).join(\"\");\n\n// \u2500\u2500 \u65F6\u503C\u8BB0\u6CD5 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst MIN_PLAIN = TPQ / 8;\nconst NOTATABLE: { ticks: number; base: number; dotted: boolean }[] = [];\nfor (let b = WHOLE; b >= MIN_PLAIN; b /= 2) { NOTATABLE.push({ ticks: b * 1.5, base: b, dotted: true }, { ticks: b, base: b, dotted: false }); }\nNOTATABLE.sort((a, b) => b.ticks - a.ticks);\n/** \u628A\u4E00\u4E2A\uFF08\u5199\u51FA\u6765\u7684\uFF09\u65F6\u503C\u62C6\u6210\u80FD\u8BB0\u7684\u51E0\u6BB5\uFF08\u8D2A\u5FC3\u53D6\u6700\u5927\u7684\uFF1B\u6BB5\u4E4B\u95F4\u753B\u8FDE\u97F3\u7EBF\uFF09\u3002 */\nexport function splitDur(dur: number): { base: number; dotted: boolean; ticks: number }[] {\n  const out: { base: number; dotted: boolean; ticks: number }[] = [];\n  let left = dur;\n  while (left > 0) {\n    const n = NOTATABLE.find((v) => v.ticks <= left && (v.dotted ? v.base >= MIN_PLAIN * 2 : true));\n    if (!n) { out.push({ base: MIN_PLAIN, dotted: false, ticks: left }); break; }\n    out.push(n); left -= n.ticks;\n  }\n  return out;\n}\n/** \u8FDE\u97F3\uFF1An \u4E2A\u5360 m \u4E2A\uFF08\u7167 song.ts TUPLET\uFF09\u3002\u65F6\u503C\u4E0D\u662F\u4E09\u5341\u4E8C\u5206\u7684\u6574\u6570\u500D\u65F6\uFF0C\u627E\u4E00\u4E2A\u6BD4\u4F8B\u8BA9\u300C\u5199\u51FA\u6765\u7684\u65F6\u503C\u300D\u80FD\u8BB0\u3002 */\nconst RATIOS: [number, number][] = [[3, 2], [5, 4], [6, 4], [7, 4]];\nexport function notate(dur: number): { ratio: [number, number] | null; chunks: { base: number; dotted: boolean; ticks: number }[] } {\n  if (dur % MIN_PLAIN === 0) return { ratio: null, chunks: splitDur(dur) };\n  for (const [n, m] of RATIOS) {\n    const written = (dur * n) / m;\n    if (Number.isInteger(written) && written % MIN_PLAIN === 0) return { ratio: [n, m], chunks: splitDur(written).map((c) => ({ ...c, ticks: (c.ticks * m) / n })) };\n  }\n  return { ratio: null, chunks: [{ base: MIN_PLAIN, dotted: false, ticks: dur }] };\n}\nconst flagLevel = (base: number) => (base >= TPQ ? 0 : Math.round(Math.log2(TPQ / base)));\nconst baseWidth = (base: number) => Math.max(2.2, 3.6 + 0.75 * Math.log2(base / TPQ));   // \u56DB\u5206 3.6\uFF0C\u6BCF\u7FFB\u500D +0.75\uFF082026-10-07 \u6536\u7D27\u4E00\u70B9\uFF1A\u539F 4.0 / +0.8\uFF0CSE2 \u4E00\u884C\u653E\u4E0D\u4E0B\u4E00\u5C0F\u8282\u516B\u5206\uFF09\n\n// \u2500\u2500 \u6392\u7248\u5355\u5143 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ninterface Chunk {\n  kind: \"chunk\"; index: number; j: number; last: boolean; base: number; dotted: boolean; note: boolean; ratio: [number, number] | null; ticks: number;\n  pitch: Pitch | null; ghost: boolean; tie: boolean; lyric: string | null; hyph: boolean; inBar: number; beat: number; acc: number | null; w: number; accW: number;\n  m?: number;   // \u7B2C\u51E0\u5C0F\u8282\uFF080 \u8D77\uFF1B\u7EB8\u5934\u5F31\u8D77 = \u7B2C 0 \u5C0F\u8282\uFF09\u2014\u2014\u6BCF\u884C\u5F00\u5934\u7684\u5C0F\u8282\u53F7\u7528\uFF08v0.9.42\uFF09\n  pad?: true;   // \u8865\u9F50\u7684\u6DE1\u8272\u4F11\u6B62\uFF08\u4E0D\u5728\u8C31\u91CC\uFF1A\u8FD9\u5F20\u7EB8\u522B\u7684\u58F0\u90E8\u66F4\u957F\uFF0C\u8FD9\u4F4D\u540E\u9762\u7A7A\u7740\u7684\u90A3\u51E0\u4E2A\u5C0F\u8282\uFF1B\u53EA\u753B\u3001\u4E0D\u80FD\u70B9\uFF09\n  pitches: Pitch[]; accs: (number | null)[];   // \u53E0\u97F3\uFF1A\u5168\u90E8\u7B26\u5934\uFF08\u4ECE\u9AD8\u5230\u4F4E\uFF0C\u7B2C\u4E00\u4E2A = pitch\uFF09+ \u5404\u81EA\u7684\u4E34\u65F6\u8BB0\u53F7\n  art: Art[]; breath: boolean;                 // \u4FEE\uFF1A\u7B2C\u4E00\u6BB5\u753B\u8DF3\u97F3 / \u91CD\u97F3 / \u4FDD\u6301\uFF0C\u6700\u540E\u4E00\u6BB5\u540E\u9762\u753B\u547C\u5438\uFF082026-10-08\uFF09\n  inhale?: \"soft\" | \"big\";                     // \u547C\u5438\u51FA\u58F0\uFF1A\u9017\u53F7\u540E\u9762\u5199\u300C\u5438\u300D/\u300C\u6DF1\u5438\u300D\uFF082026-10-10\uFF09\n  whisper?: boolean;                           // \u6C14\u58F0\uFF1A\u8FD9\u4E2A\u97F3\uFF08\u62C6\u5F00\u7684\u6BCF\u4E00\u6BB5\uFF09\u753B \u00D7 \u7B26\u5934\uFF082026-10-10\uFF09\n  x: number; system: number; tick: number; staff: Staff;   // staff = \u5927\u8C31\u8868\u91CC\u5728\u4E0A\u8FD8\u662F\u4E0B\uFF08\u5355\u8C31\u8868 = 1\uFF09\n}\ninterface BarU { kind: \"bar\"; index: number; w: number; x: number; system: number; tick: number; staff: Staff; warn: boolean; auto: boolean; repeat?: Repeat; times?: number; style?: \"double\" | \"final\" }   // repeat = \u53CD\u590D\u5C0F\u8282\u7EBF\uFF08Bravura \u7684\u53CD\u590D\u8BB0\u53F7\u5B57\u5F62\uFF0C\u6BD4\u7EC6\u7EBF\u5BBD\uFF09   // auto = \u6309\u62CD\u53F7\u81EA\u52A8\u753B\u7684\uFF08index = -1\uFF0C\u4E0D\u662F token\uFF09\ninterface KeyU { kind: \"key\"; index: number; fifths: number; prev: number; w: number; x: number; system: number; tick: number; staff: Staff }\ninterface TimeU { kind: \"time\"; index: number; beats: number; beatType: number; w: number; x: number; system: number; tick: number; staff: Staff }\ninterface TempoU { kind: \"tempo\"; index: number; bpm: number; w: number; x: number; system: number; tick: number; staff: Staff }\ninterface HeadU { kind: \"head\"; index: -1; w: 0; x: number; system: number; tick: number; staff: Staff }   // \u5149\u6807\uFF1A\u96F6\u5BBD\ninterface PhraseU { kind: \"phrase\"; index: number; w: number; x: number; system: number; tick: number; staff: Staff }   // \u53E5\u53F7\uFF1A\u6B4C\u8BCD\u884C\u4E0A\u4E00\u4E2A\u5C0F\u300C\u3002\u300D\uFF08\u4E0D\u6362\u884C\u3001\u4E0D\u6362\u6C14\uFF09\ninterface DynU { kind: \"dyn\"; index: number; value: Dyn; w: number; x: number; system: number; tick: number; staff: Staff }   // \u529B\u5EA6\uFF1A\u8C31\u4E0A\u65B9\u4E00\u4E2A\u5B57\uFF08\u4E0D\u5360\u5730\u65B9\uFF0C\u548C\u540E\u9762\u90A3\u4E2A\u97F3\u5BF9\u9F50\uFF09\ninterface HairpinU { kind: \"hairpin\"; index: number; dir: \"cresc\" | \"dim\"; w: number; x: number; system: number; tick: number; staff: Staff }   // \u6E10\u5F3A\u6E10\u5F31\uFF1A\u529B\u5EA6\u90A3\u4E00\u884C\uFF0C\u4ECE\u8FD9\u513F\u753B\u5230\u7EC8\u70B9\uFF08\u4E0D\u5360\u5730\u65B9\uFF09\ninterface GrooveU { kind: \"groove\"; index: number; w: number; x: number; system: number; tick: number; staff: Staff }   // \u98CE\u683C\u8BB0\u53F7\uFF1A\u8C31\u4E0A\u65B9\u4E00\u884C\u659C\u4F53\u5B57\uFF08\u4E0D\u5360\u5730\u65B9\uFF0C\u548C\u540E\u9762\u90A3\u4E2A\u97F3\u5BF9\u9F50\uFF09\ninterface NavU { kind: \"nav\"; index: number; w: number; x: number; system: number; tick: number; staff: Staff; slot: number }   // slot\uFF1AD.C. / D.S. / Fine / To Coda \u5728\u5C0F\u8282\u7EBF\u524D\uFF08\u8FD9\u5C0F\u8282\u5C3E\uFF09\uFF0C\u623F\u5B50 / Segno / Coda \u5728\u540E\uFF08\u4E0B\u4E00\u5C0F\u8282\u5934\uFF09   // \u623F\u5B50 / \u8DF3\u8F6C\u8BB0\u53F7\uFF08\u8C31\u5185\u53CD\u590D\uFF09\uFF1A\u753B\u5728\u8C31\u4E0A\u65B9\u7684\u53CD\u590D\u90A3\u4E00\u9053\uFF0C\u4E0D\u5360\u5730\u65B9\ninterface ClefU { kind: \"clef\"; index: number; clef: ClefName; w: number; x: number; system: number; tick: number; staff: Staff }   // \u884C\u4E2D\u95F4\u6362\u8C31\u53F7\uFF1A\u753B\u4E00\u4E2A\u5C0F\u4E00\u53F7\u7684\u8C31\u53F7\uFF08v0.9.28\uFF09\ninterface OttavaU { kind: \"ottava\"; index: number; w: number; x: number; system: number; tick: number; staff: Staff }   // \u516B\u5EA6\u7EBF\uFF1A\u4E0D\u5360\u5730\u65B9\uFF08\u7EBF\u5728\u8C31\u4E0A / \u4E0B\uFF0C\u6309\u97F3\u7684\u8303\u56F4\u753B\uFF09\ntype Unit = Chunk | BarU | KeyU | TimeU | TempoU | HeadU | PhraseU | DynU | HairpinU | GrooveU | NavU | ClefU | OttavaU;\nconst SLOT: Record<Unit[\"kind\"], number> = { phrase: -1, bar: 0, nav: 0.5, clef: 0.8, key: 1, time: 2, tempo: 3, groove: 3.3, dyn: 3.5, ottava: 3.6, hairpin: 3.7, head: 4, chunk: 5 };\n/** \u884C\u4E2D\u95F4\u6362\u8C31\u53F7\uFF1A\u5C0F\u4E00\u53F7\u7684\u8C31\u53F7\uFF08\u8C31\u53F7\u7684 0.72\uFF09\u5360\u591A\u5BBD\uFF08sp\uFF09\u3002 */\nconst CLEF_CUE = 0.72, CLEF_CUE_W = 2.74 * CLEF_CUE + 0.9;\nconst CLEF_GLYPH: Record<ClefName, string> = { G: GLYPH.gClef, G8vb: GLYPH.gClef8vb, G8va: GLYPH.gClef8va, G15ma: GLYPH.gClef15ma, F: GLYPH.fClef, F8vb: GLYPH.fClef8vb };   // \u540C\u4E00 tick \u4E0A\u7684\u5148\u540E\uFF08\u53E5\u5728\u5C0F\u8282\u7EBF\u524D\uFF1A\u6362\u6C14\u753B\u5728\u4E0A\u4E00\u4E2A\u97F3\u540E\u9762\uFF09\nconst keyWidth = (fifths: number, prev: number) => (fifths === 0 ? Math.abs(prev) * 0.8 : Math.abs(fifths) * 1.05) + 1.0;\nconst timeWidth = (beats: number, beatType: number) => Math.max([...String(beats)].length, [...String(beatType)].length) * W.timeSigDigit;\n\ninterface Head { key: number; time: { beats: number; beatType: number }; bpm: number; idx: Partial<Record<\"key\" | \"time\" | \"tempo\", number>> }\n/** \u4E00\u6761 track \u2192 \u6392\u7248\u5355\u5143\uFF08\u7B2C 1 \u6B65\uFF1A\u5207\u65F6\u503C\u3001\u4E34\u65F6\u8BB0\u53F7\u3001\u81EA\u52A8\u5C0F\u8282\u7EBF\uFF1Btick = \u4ECE\u8FD9\u6761\u7684\u5F00\u5934\u6570\uFF09\u3002tail = \u5199\u5B57\u5934\u5728\u8FD9\u6761\u7684\u5C3E\u5DF4\u540E\u9762\uFF08\u6392\u4E00\u4E2A\u96F6\u5BBD\u7684 head \u5355\u5143\uFF1A\u4E94\u7EBF\u753B\u5230\u53F3\u8FB9\uFF09\u3002 */\nfunction unitsOf(tokens: Token[], o: { tail: boolean; autoBars: boolean; measureLyric: (s: string) => number; sp: number; rhythm?: boolean; /** \u4ECE\u8FD9\u4E2A\u4E0B\u6807\u8D77\u662F\u8865\u9F50\u7684\u6DE1\u8272\u4F11\u6B62\uFF08\u4E0D\u5728\u8C31\u91CC\uFF09\u3002 */ padFrom?: number }): { units: Unit[]; head: Head; shortBars: number; pickup: boolean } {\n  const H = headLen(tokens);\n  let fifths = DEFAULT_KEY, time = { ...DEFAULT_TIME }, bpm = DEFAULT_BPM;\n  const headIdx: Head[\"idx\"] = {};\n  for (let i = 0; i < H; i++) {\n    const t = tokens[i];\n    if (t.kind === \"key\") fifths = t.fifths; else if (t.kind === \"time\") time = { beats: t.beats, beatType: t.beatType }; else if (t.kind === \"tempo\") bpm = t.bpm;\n    if (t.kind === \"key\" || t.kind === \"time\" || t.kind === \"tempo\") headIdx[t.kind] = i;\n  }\n  const head: Head = { key: fifths, time, bpm, idx: headIdx };\n  //   inBar = \u8FD9\u4E2A\u5C0F\u8282\u91CC\u5DF2\u7ECF\u8D70\u4E86\u591A\u5C11\uFF1B\u6EE1\u4E86\uFF08= len\uFF09\u4E0D\u9A6C\u4E0A\u753B\u5C0F\u8282\u7EBF\uFF0C\u7B49\u4E0B\u4E00\u4E2A\u97F3 / \u8BB0\u53F7 / \u5199\u5B57\u5934 / \u66F2\u5C3E\u6765\u4E86\u518D\u753B\u2014\u2014\n  //   \u7D27\u8DDF\u7740\u7684\u662F\u4EBA\u63D2\u7684\u300C|\u300D\u5C31\u7528\u5B83\u90A3\u4E00\u6761\uFF08\u4E0D\u753B\u4E24\u6761\uFF09\u3002\u62CD\u53F7\u4E2D\u9014\u53D8\u4E86\uFF1A\u6CA1\u5199\u5B8C\u7684\u8FD9\u4E2A\u5C0F\u8282\u5C31\u6B64\u7ED3\u675F\uFF08\u540C\u5B58 MusicXML\uFF09\u3002\n  const units: Unit[] = [], measureLen = (b: number, bt: number) => (b * WHOLE) / bt;\n  let accState = new Map<string, number>(), inBar = 0, measureNo = 0, shortBars = 0, tick = 0, pickup = false;\n  let beat = beatTicks(time.beats, time.beatType), len = measureLen(time.beats, time.beatType);\n  const pushHead = () => { units.push({ kind: \"head\", index: -1, w: 0, x: 0, system: 0, tick, staff: 1 }); };\n  const pushBar = (index: number, auto: boolean) => {\n    const rb = index >= 0 ? (tokens[index] as BarTok) : null, repeat = rb?.repeat;\n    const warn = inBar !== len && measureNo > 0 && !(repeat === \"start\" && inBar === 0);   // \u7B2C\u4E00\u5C0F\u8282 = \u5F31\u8D77\uFF0C\u4E0D\u6807\uFF1B\u5F00\u5934\u7684 |: \u4E0D\u7B97\u4E00\u4E2A\u5C0F\u8282\n    if (warn) shortBars++;\n    // \u53CD\u590D\u5C0F\u8282\u7EBF\uFF1A\u5B57\u5F62\u5BBD 1.47\uFF08:|: 2.43\uFF09+ \u4E24\u8FB9\u7559\u4E00\u70B9\uFF08Bravura repeatLeft / repeatRight / repeatRightLeft\uFF09\n    const style = !repeat ? rb?.style : undefined;   // \u6BB5\u843D\u7EBF / \u7EC8\u6B62\u7EBF\uFF08v0.9.32\uFF09\uFF1A\u6BD4\u4E00\u6839\u5C0F\u8282\u7EBF\u5BBD\u4E00\u70B9\n    units.push({ kind: \"bar\", index, w: repeat ? (repeat === \"both\" ? 2.43 : 1.47) + 0.8 : style ? BAR_W + 0.7 : BAR_W, x: 0, system: 0, tick, staff: 1, warn, auto, ...(repeat ? { repeat, ...(rb?.times ? { times: rb.times } : {}) } : {}), ...(style ? { style } : {}) });\n    const empty = inBar === 0;\n    if (measureNo === 0 && inBar > 0 && inBar < len) pickup = true;   // \u7EB8\u5934\u8FD8\u6CA1\u5199\u6EE1\u5C31\u78B0\u5230\u300C|\u300D= \u5F31\u8D77\uFF08\u5C0F\u8282\u53F7\uFF1A\u5F31\u8D77\u7B97\u7B2C 0 \u5C0F\u8282\uFF09\n    accState = new Map(); inBar = 0; if (!(repeat === \"start\" && empty)) measureNo++;   // \u5C0F\u8282\u5F00\u5934\u7684 |:\uFF08\u524D\u9762\u90A3\u6761\u5C0F\u8282\u7EBF\u4E4B\u540E\u7D27\u8DDF\u7740 / \u7EB8\u5934\uFF09\u4E0D\u591A\u6570\u4E00\u4E2A\u5C0F\u8282\n  };\n  const flushFull = () => { if (o.autoBars && inBar >= len && inBar > 0) pushBar(-1, true); };\n  tokens.forEach((t, i) => {\n    if (i < H) return;\n    if (t.kind === \"bar\") { pushBar(i, false); return; }\n    if (t.kind === \"key\") {\n      flushFull();\n      units.push({ kind: \"key\", index: i, fifths: t.fifths, prev: fifths, w: keyWidth(t.fifths, fifths), x: 0, system: 0, tick, staff: 1 });\n      fifths = t.fifths; accState = new Map(); return;\n    }\n    if (t.kind === \"time\") {\n      if (o.autoBars && inBar > 0) pushBar(-1, true);\n      units.push({ kind: \"time\", index: i, beats: t.beats, beatType: t.beatType, w: timeWidth(t.beats, t.beatType) + 1.2, x: 0, system: 0, tick, staff: 1 });\n      beat = beatTicks(t.beats, t.beatType); len = measureLen(t.beats, t.beatType); return;\n    }\n    if (t.kind === \"tempo\") { flushFull(); units.push({ kind: \"tempo\", index: i, bpm: t.bpm, w: 0.3, x: 0, system: 0, tick, staff: 1 }); return; }\n    if (t.kind === \"phrase\") { flushFull(); units.push({ kind: \"phrase\", index: i, w: 1.0, x: 0, system: 0, tick, staff: 1 }); return; }\n    // \u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\u4E0D\u5360\u6A2A\u5411\u7684\u5730\u65B9\uFF08\u753B\u5728\u8C31\u4E0A\u4E0B\uFF0C\u4E0D\u5728\u97F3\u548C\u97F3\u4E4B\u95F4\uFF09\uFF1A\u63D2 / \u632A / \u5220\u5B83\u4EEC\uFF0C\u97F3\u7684\u4F4D\u7F6E\u3001\u95F4\u8DDD\u3001\u6298\u884C\u4E00\u70B9\u90FD\u4E0D\u53D8\n    //   \uFF082026-10-08 Opus 5.5\uFF0Cuser\u300C\u79FB\u52A8\u529B\u5EA6\u6807\u8BC6\u7684\u65F6\u5019\u6700\u597D\u97F3\u7B26\u7684\u6E32\u67D3\u5E03\u5C40\u4E00\u70B9\u4E5F\u4E0D\u6539\u2026\u5C24\u5176\u662F\u95F4\u9694\u4E4B\u7C7B\u7684\uFF0C\u4E0D\u8981\u88AB\u529B\u5EA6\u6807\u8BC6\u7684\u63D2\u5165\u5F71\u54CD\u300D\uFF1B\u4EE5\u524D\u5404\u5360 0.3 \u4E2A\u95F4\u8DDD\uFF09\n    if (t.kind === \"dyn\") { flushFull(); units.push({ kind: \"dyn\", index: i, value: t.value, w: 0, x: 0, system: 0, tick, staff: 1 }); return; }\n    if (t.kind === \"hairpin\") { flushFull(); units.push({ kind: \"hairpin\", index: i, dir: t.dir, w: 0, x: 0, system: 0, tick, staff: 1 }); return; }\n    if (t.kind === \"groove\") { flushFull(); units.push({ kind: \"groove\", index: i, w: 0, x: 0, system: 0, tick, staff: 1 }); return; }\n    if (t.kind === \"clef\") { flushFull(); units.push({ kind: \"clef\", index: i, clef: t.clef, w: CLEF_CUE_W, x: 0, system: 0, tick, staff: 1 }); return; }   // \u8C31\u53F7\u8BB0\u53F7\uFF08v0.9.28\uFF09\n    if (t.kind === \"ottava\") { flushFull(); units.push({ kind: \"ottava\", index: i, w: 0, x: 0, system: 0, tick, staff: 1 }); return; }   // \u516B\u5EA6\u7EBF\uFF08v0.9.28\uFF09\uFF1A\u4E0D\u5360\u6A2A\u5411\u5730\u65B9   // \u98CE\u683C\u8BB0\u53F7\uFF08\u62CD\u5B50\u8F7B\u91CD\uFF09\uFF1A\u540C\u529B\u5EA6\u5B57\uFF0C\u4E0D\u5360\u6A2A\u5411\u5730\u65B9\n    if (t.kind === \"nav\") { const head = t.what === \"ending\" || t.what === \"segno\" || t.what === \"coda\"; if (head) flushFull(); units.push({ kind: \"nav\", index: i, w: 0, x: 0, system: 0, tick, staff: 1, slot: head ? 0.5 : -0.5 }); return; }   // \u623F\u5B50 / \u8DF3\u8F6C\uFF1A\u8C31\u4E0A\u65B9\uFF0C\u4E0D\u5360\u5730\u65B9\uFF08\u623F\u5B50\u4ECE\u4E0B\u4E00\u5C0F\u8282\u5F00\u5934\u8D77\uFF1A\u6EE1\u4E86\u7684\u5C0F\u8282\u5148\u753B\u5C0F\u8282\u7EBF\uFF09\n    const isNote = t.kind === \"note\", nt = t as NoteTok;\n    const pitch = isNote ? effectivePitch(tokens, i) : null;\n    const pitches = isNote ? (nt.pitch ? allPitches(nt) : [pitch!]) : [];\n    // \u4E00\u4E2A\u97F3\u6309\u81EA\u52A8\u5C0F\u8282\u7EBF\u5207\u6210\u51E0\u6BB5\uFF08\u4E0D\u5207 = \u6574\u4E2A\u4E00\u6BB5\uFF0C\u548C\u4EE5\u524D\u4E00\u6837\u8BB0\uFF09\uFF1B\u6BCF\u6BB5\u518D\u62C6\u6210\u80FD\u8BB0\u7684\u65F6\u503C\n    let left = t.dur, j = 0, lastChunk: Chunk | null = null;\n    while (left > 1e-6) {\n      flushFull();\n      const piece = o.autoBars ? Math.min(left, len - inBar) : left;\n      const { ratio, chunks } = notate(piece);\n      let off = 0;\n      for (const c of chunks) {\n        const accs: (number | null)[] = pitches.map((pp) => {\n          if (j !== 0 || (isNote && nt.tie)) return null;\n          const key = `${pp.step}${pp.octave}`, cur = accState.has(key) ? accState.get(key)! : keyAlter(pp.step, fifths);\n          if (pp.alter !== cur) { accState.set(key, pp.alter); return pp.alter; }\n          return null;\n        });\n        const acc = accs[0] ?? null;\n        const lyric = isNote && j === 0 && !nt.tie ? nt.lyric : null;\n        const accW = accs.some((a) => a !== null) ? 1.3 : 0;\n        let w = accW + baseWidth(c.base) + (c.dotted ? 0.6 : 0);\n        if (lyric && lyric !== MELISMA_MARK && !o.rhythm) w = Math.max(w, accW + o.measureLyric(lyricShow(lyric)) / o.sp + (nt.hyph ? 1.4 : 0.7));   // \u6309\u6B4C\u8BCD\u6392\uFF1A\u5B57\u628A\u97F3\u63A8\u5F00\uFF1B\u6309\u8282\u594F\u6392\uFF08v0.9.40\uFF09= \u97F3\u53EA\u770B\u65F6\u503C\n        const u: Chunk = { kind: \"chunk\", index: i, j, last: false, m: measureNo, base: c.base, dotted: c.dotted, note: isNote, ratio, ticks: c.ticks, pitch,\n          ghost: isNote && nt.pitch === null, tie: isNote && !!nt.tie && j === 0, lyric, hyph: !!(isNote && nt.hyph && j === 0), inBar: inBar + off, beat, acc, w, accW, x: 0, system: 0, tick: tick + off, staff: 1, pitches, accs,\n          art: isNote && j === 0 ? (nt.art ?? []).filter((a) => a !== \"breath\") : [], breath: false, ...(isNote && nt.art?.includes(\"whisper\") ? { whisper: true } : {}), ...(o.padFrom !== undefined && i >= o.padFrom ? { pad: true as const } : {}) };\n        units.push(u); lastChunk = u;\n        off += c.ticks; j++;\n      }\n      inBar += piece; left -= piece; tick += piece;\n    }\n    if (lastChunk) { lastChunk.last = true; if (isNote && nt.art?.includes(\"breath\")) { lastChunk.breath = true; lastChunk.w += 0.8; if (nt.inhale) { lastChunk.inhale = nt.inhale; lastChunk.w += nt.inhale === \"big\" ? 2.1 : 1.2; } } }   // \u51FA\u58F0\u7684\u6362\u6C14\uFF1A\u9017\u53F7\u540E\u9762\u7684\u5B57\u4E5F\u7559\u5730\u65B9   // \u547C\u5438\u9017\u53F7\u753B\u5728\u8FD9\u4E2A\u97F3\u540E\u9762\uFF1A\u7559\u4E00\u70B9\u5730\u65B9\n  });\n  flushFull();   // \u66F2\u5C3E\u6B63\u597D\u5199\u6EE1\uFF1A\u753B\u4E0A\u8FD9\u4E00\u6761\u5C0F\u8282\u7EBF\n  if (o.tail) pushHead();   // \u5199\u5B57\u5934\u5728\u5C3E\u5DF4\u540E\u9762\uFF1A\u96F6\u5BBD\u7684 head \u5355\u5143\u8BA9\u8FD9\u4E00\u884C\u4E94\u7EBF\u753B\u5230\u53F3\u8FB9\uFF08staffEnd\uFF09\uFF1B\u5149\u6807\u672C\u8EAB\u5728 score-view \u7684 ink \u5C42\u753B\n  return { units, head, shortBars, pickup };\n}\n\n/** \u4E00\u5217\uFF1A\u540C\u4E00 tick\u3001\u540C\u4E00\u79CD\u4E1C\u897F\uFF08\u5C0F\u8282\u7EBF / \u8BB0\u53F7 / \u97F3\uFF09\u5404\u58F0\u90E8\u5BF9\u9F50\u5728\u4E00\u8D77\uFF1B\u5BBD = \u6700\u5BBD\u7684\u90A3\u4E2A\u3002 */\ninterface Col { tick: number; slot: number; n: number; w: number; x: number; system: number; units: Unit[]; bar: boolean; chunk: boolean; phrase: boolean }\n\nexport function engrave(song: Song, o: EngraveOpts): Layout {\n  const clefStarts = resolveSongClefs(song);   // \u6BCF\u5F20\u7EB8\u6BCF\u4E2A\u58F0\u90E8\u5F00\u5934\u7684\u8C31\u53F7\uFF08\u81EA\u52A8\u7684\u6309\u6574\u9996\u4E00\u8DEF\u6311\uFF0C\u548C\u89C6\u56FE\u65E0\u5173\uFF09\n  const sp = o.sp, P = (v: number) => v * sp;\n  const SPC = SPACING[densityOf(song.paper ?? { kind: \"A5\", widthMm: 0, heightMm: 0, marginMm: { l: 0, r: 0, t: 0, b: 0 } })];\n  // \u5206\u9875\uFF1A\u7B2C k \u9875\u4ECE pageTopY(k) \u8D77\u3001\u9AD8 PG.h\uFF1B\u5185\u5BB9\u53EA\u653E\u5728\u4E0A\u4E0B\u8FB9\u8DDD\u4E4B\u95F4\uFF1B\u653E\u4E0D\u4E0B\u7684\u6574\u5757\uFF08\u4E00\u884C\u8C31 / \u66F2\u6BB5\u540D + \u7B2C\u4E00\u884C / \u7EC6\u884C\uFF09\u632A\u5230\u4E0B\u4E00\u9875\n  const PG = o.page ?? null, PAGE_GAP = 3, MX = o.page ?? o.margins ?? { l: 0, r: 0, t: 0, b: 1.5 };   // MX = \u7EB8\u7684\u8FB9\u8DDD\uFF08\u8FDE\u7EED / \u5206\u9875\u540C\u4E00\u5957\uFF09\n  const pageTopY = (k: number) => P(k * ((PG?.h ?? 0) + PAGE_GAP));\n  const contentTop = (k: number) => pageTopY(k) + P(PG?.t ?? 0), contentBottom = (k: number) => pageTopY(k) + P((PG?.h ?? 0) - (PG?.b ?? 0));\n  let pageNo = 0;\n  const TOP = P(MX.t);\n  const STAFF_ABOVE = SPC.staffAbove, LYRIC_BELOW = SPC.lyricBelow, SYS_GAP = SPC.sysGap;\n  const prims: Prim[] = [];\n  const autoBars = o.autoBars !== false;\n  const baseRight = o.width / sp - MARGIN;\n  let right = baseRight, sheetRight = baseRight;   // \u6A2A\u5377\uFF1A\u6BCF\u5F20\u7EB8\u6392\u5B8C right = \u8FD9\u5F20\u7EB8\u5185\u5BB9\u7684\u53F3\u7AEF + SCROLL_TAIL\uFF1BsheetRight = \u6700\u957F\u90A3\u5F20\n  const PART_EM = LYRIC_EM * 0.85;\n  const nameW = (s: string) => (o.measureLyric(s) * PART_EM) / LYRIC_EM / sp;\n  /** \u58F0\u90E8\u540D\u4E00\u5217\u6700\u5BBD NAME_MAX\uFF08sp\uFF09\uFF0C\u518D\u957F\u5C31\u6298\u884C\uFF0C\u4E0D\u5360\u4E94\u7EBF\u8C31\u7684\u5730\u65B9\uFF08user 2026-10-08\u300C\u8C31\u5B50\u524D\u9762\u7684\u4E50\u5668\u540D\u5B57\u5982\u679C\u5F88\u957F\u7684\u8BDD\u5E94\u8BE5\u6362\u884C\u800C\u4E0D\u662F\u5360\u7528\u4E94\u7EBF\u8C31\u7684\u7A7A\u95F4\u300D\uFF09\u3002\n   *  \u82F1\u6587\u6309\u8BCD\u6298\u3001\u6C49\u5B57\u6309\u5B57\u6298\u3001\u4E00\u4E2A\u8BCD\u672C\u8EAB\u592A\u957F\u518D\u6309\u5B57\u6BCD\u6298\uFF1B\u5355\u8C31\u8868\u6700\u591A 3 \u884C\u3001\u5927\u8C31\u8868 5 \u884C\uFF0C\u518D\u591A\u672B\u5C3E\u300C\u2026\u300D\uFF08\u5168\u540D\u5728\u6B4C\u624B\u724C\u91CC\uFF09\u3002 */\n  const nameLines = (name: string, staves: number): string[] => {\n    if (nameW(name) <= NAME_MAX) return [name];\n    const toks = name.match(/[A-Za-z0-9'\u2019.\\-()&]+\\s*|\\s+|./gu) ?? [name], lines: string[] = [];\n    let cur = \"\";\n    for (const t of toks) { if (!cur.trim() || nameW((cur + t).trimEnd()) <= NAME_MAX) cur += t; else { lines.push(cur.trimEnd()); cur = t.trimStart(); } }\n    if (cur.trim()) lines.push(cur.trimEnd());\n    const out = lines.flatMap((l) => {\n      if (nameW(l) <= NAME_MAX) return [l];\n      const ps: string[] = []; let c = \"\";\n      for (const ch of [...l]) { if (c && nameW(c + ch) > NAME_MAX) { ps.push(c); c = ch; } else c += ch; }\n      if (c) ps.push(c);\n      return ps;\n    });\n    const max = staves === 2 ? 5 : 3;\n    if (out.length > max) { out.length = max; let last = out[max - 1]; while (last && nameW(`${last}\u2026`) > NAME_MAX) last = [...last].slice(0, -1).join(\"\"); out[max - 1] = `${last}\u2026`; }\n    return out;\n  };\n\n  // \u7EB8\u9762\u6700\u4E0A\u9762\uFF1A\u6B4C\u540D + \u4F5C\u8005\u680F + \u7EB8\u7684\u5C0F\u94AE\n  // \u6B4C\u540D 2.8 \u4E2A\u8C31\u7EBF\u95F4\u8DDD\uFF08\u539F\u6765 1.9 \u2248 \u66F2\u6BB5\u540D 1.6\uFF0C\u770B\u4E0D\u51FA\u8C01\u5927\uFF1B\u51FA\u7248\u603B\u8C31\u7684\u6B4C\u540D\u6BD4\u8C31\u4E0A\u522B\u7684\u5B57\u5927\u4E00\u5927\u622A\uFF1Buser\u300C\u6B4C\u66F2\u6807\u9898\u5B57\u4F53\u5927\u5C0F\u4E0D\u5408\u7406\u300D\uFF09\n  const titleSize = P(2.8), titleBase = TOP + P(TITLE_H * 0.62);\n  if (song.title) prims.push({ t: \"text\", x: o.width / 2, y: titleBase, s: song.title, cls: \"song-title\", size: titleSize, anchor: \"middle\" });\n  else if (o.titlePlaceholder) prims.push({ t: \"text\", x: o.width / 2, y: titleBase, s: \"\u6B4C\u540D\", cls: \"song-title empty\", size: titleSize * 0.8, anchor: \"middle\" });   // user\u300C\u865A\u6846\u66F4\u4E0D\u8212\u670D\uFF0C\u6362\u56DE\u5B57\u63D0\u793A\uFF08\u4E0D\u8FC7\u7B80\u77ED\u4E00\u70B9\uFF09\u300D\n  let paperChip: Box | null = null, addPaper: Box | null = null, nav: Layout[\"nav\"] = null, paperMenu: Box | null = null;\n  if (o.paperLabel) {   // \u7EB8\u53F3\u4E0A\u89D2\uFF1A\u4E00\u4E2A\u6273\u624B\u5C0F\u94AE\uFF08\u7EB8\u7684\u8BBE\u7F6E\uFF09+ \u5DE6\u8FB9\u4E00\u4E2A\u300C\uFF0B\u300D\uFF08\u65B0\u7684\u7EB8\uFF0C\u4F4E\u9891\uFF0C\u6536\u5728\u89D2\u4E0A\uFF09\n    const ch = P(CTL_H), cw = ch, cx = o.width - P(MARGIN) - cw, cy = TOP + P(0.8), is = P(CTL_GLYPH);\n    prims.push({ t: \"rect\", x: cx, y: cy, w: cw, h: ch, cls: \"paper-chip\" });\n    prims.push({ t: \"icon\", id: \"wrench\", x: cx + (cw - is) / 2, y: cy + (ch - is) / 2, size: is, cls: \"paper-chip-icon\", title: `\u7EB8\uFF1A${o.paperLabel}` });\n    paperChip = { x: cx - P(0.5), y: cy - P(0.5), w: cw + P(1), h: ch + P(1) };\n    if (o.titlePlaceholder) {\n      const ax = cx - cw - P(0.6);\n      prims.push({ t: \"rect\", x: ax, y: cy, w: cw, h: ch, cls: \"paper-chip\" });\n      prims.push({ t: \"text\", x: ax + cw / 2, y: cy + ch * 0.74, s: \"\uFF0B\", cls: \"paper-chip-text\", size: P(CTL_GLYPH), anchor: \"middle\" });\n      addPaper = { x: ax - P(0.5), y: cy - P(0.5), w: cw + P(1), h: ch + P(1) };\n    }\n  }\n  if (o.titlePlaceholder && song.papers.length === 1) {   // \u53EA\u6709\u4E00\u5F20\u7EB8\uFF08\u6CA1\u6709\u66F2\u6BB5\u540D\u90A3\u4E00\u884C\uFF09\uFF1A\u7EB8\u7684\u300C\u22EF\u300D\u5728\u6B4C\u540D\u5DE6\u8FB9\uFF1B\u591A\u5F20\u7EB8 = \u6BCF\u5F20\u7EB8\u81EA\u5DF1\u90A3\u4E00\u884C\u4E0A\u4E00\u7EC4\u66F2\u6BB5\u63A7\u4EF6\uFF08\u4E0B\u9762 drawPaperTitle\uFF09\n    const ch = P(CTL_H), cw = P(CTL_H + 0.6), cy = TOP + P(0.8), mx = P(MARGIN);\n    prims.push({ t: \"rect\", x: mx, y: cy, w: cw, h: ch, cls: \"paper-chip\" });\n    prims.push({ t: \"text\", x: mx + cw / 2, y: cy + ch * 0.72, s: \"\u22EF\", cls: \"paper-chip-text\", size: P(CTL_GLYPH), anchor: \"middle\" });\n    paperMenu = { x: mx - P(0.3), y: cy - P(0.4), w: cw + P(0.6), h: ch + P(0.8) };\n  }\n  const title: TitleHit = { x: P(MARGIN), y: TOP + P(0.3), w: o.width - P(2 * MARGIN), h: P(TITLE_H), baseline: titleBase, size: titleSize };\n  // \u4F5C\u8005\u680F\uFF1A\u6807\u9898\u4E0B\u9762\u9760\u53F3\uFF0C\u7167\u5199\u7684\u4E00\u884C\u4E00\u884C\u663E\u793A\uFF08\u7EAF\u6587\u672C\uFF0C\u4E0D\u8BA4\u683C\u5F0F\uFF1Buser\u300C\u55EF\u6240\u89C1\u5373\u6240\u5F97\u300D\uFF09\uFF1B\u7A7A\u7740\u65F6\u7F16\u8F91\u5668\u91CC\u753B\u6D45\u8272\u77ED\u63D0\u793A\u300C\u4F5C\u8005\u300D\n  const lines = song.credits ? song.credits.split(\"\\n\") : [];\n  let credits: Box | null = null;\n  const cs = P(1.25), rx = o.width - P(MARGIN), y0 = TOP + P(TITLE_H + 1.0);\n  if (lines.length) {\n    lines.forEach((s, k) => prims.push({ t: \"text\", x: rx, y: y0 + k * cs * 1.35, s, cls: \"credits\", size: cs, anchor: \"end\" }));\n    const w = Math.max(...lines.map((s) => (o.measureLyric(s) * 1.25) / LYRIC_EM)) + P(0.6);\n    credits = { x: rx - w, y: y0 - cs * 1.1, w: w + P(0.3), h: cs * 1.35 * lines.length + cs * 0.4 };\n  } else if (o.titlePlaceholder) {\n    prims.push({ t: \"text\", x: rx, y: y0, s: \"\u4F5C\u8005\", cls: \"credits empty\", size: cs, anchor: \"end\" });\n    const w = (o.measureLyric(\"\u4F5C\u8005\") * 1.25) / LYRIC_EM + P(0.6);\n    credits = { x: rx - w, y: y0 - cs * 1.1, w: w + P(0.3), h: cs * 1.75 };\n  }\n  // \u7F16\u6392\uFF082026-10-08 \u6DF1\u591C Opus 5.5\uFF1Buser\u300C\u7F16\u6392\u6211\u5EFA\u8BAE\u5C31\u662F\u603Bpaper\u7684\u9876\u4E0A\u8BF4\u4E00\u4E0B\uFF0C\u7136\u540E\u53EA\u6709\u5168\u90E8paper\u7684\u65F6\u5019\u53EF\u89C1\uFF0C\u5C31\u662F\u4E00\u884C\uFF0C\u5BF9\u5427\uFF0C\u5C31\u548Ctitle\u4E00\u6837\u300D\uFF09\uFF1A\n  //   \u4F5C\u8005\u680F\u4E0B\u9762\u5355\u72EC\u4E00\u884C\u3001\u9760\u5DE6\uFF1B\u5199\u9519\u7684\uFF08\u627E\u4E0D\u5230\u7684\u7EB8\u3001\u5FAA\u73AF\u6BB5\u4E0D\u5728\u6700\u540E\u2026\uFF09\u7070\u5B57\u8BF4\u4E3A\u4EC0\u4E48\uFF08\u653E\u4E0D\u4E0B = \u4E0B\u4E00\u884C\uFF09\uFF0C\u653E\u7684\u65F6\u5019\u8DF3\u8FC7\uFF08\u7EAA\u5F8B\uFF09\n  let arrangement: TitleHit | null = null, arrLast = 0;   // arrLast = \u7F16\u6392\u90A3\u4E00\u5757\u6700\u540E\u4E00\u884C\u7684\u57FA\u7EBF\uFF08px\uFF1B\u4E94\u7EBF\u8C31\u4ECE\u5B83\u4E0B\u9762\u5F00\u59CB\uFF09\n  if (!o.onlyPaper) {\n    const as = P(1.25), wOf = (t: string, size: number) => (o.measureLyric(t) * size) / LYRIC_EM, row = Math.max(lines.length, 1), base = y0 + row * cs * 1.35;\n    const arr = parseArrangement(song.arrangement, song.papers), txt = song.arrangement?.trim() ?? \"\";\n    const label = \"\u7F16\u6392\u3000\", lw = wOf(label, 1.25), x0 = P(MARGIN) + lw, avail = o.width - P(2 * MARGIN) - lw;\n    prims.push({ t: \"text\", x: P(MARGIN), y: base, s: label, cls: txt ? \"arr-label\" : \"arr-label empty\", size: as, anchor: \"start\" });   // \u6CA1\u5199\u7F16\u6392 = \u8FD9\u4E2A\u6807\u7B7E\u53EA\u662F\u5165\u53E3\uFF08\u63D0\u793A\uFF09\uFF0CPDF \u4E0D\u5370\n    arrLast = base;\n    if (txt) {\n      prims.push({ t: \"text\", x: x0, y: base, s: txt, cls: \"arr\", size: as, anchor: \"start\" });\n      if (arr.issues.length) {\n        const why = `\u00B7 ${arr.issues[0].why}${arr.issues.length > 1 ? ` \u7B49 ${arr.issues.length} \u5904` : \"\"}`, tw = wOf(txt, 1.25) + P(0.8), fits = tw + wOf(why, 1.1) <= avail;\n        prims.push({ t: \"text\", x: fits ? x0 + tw : x0, y: fits ? base : base + cs * 1.35, s: why, cls: \"arr-issue\", size: P(1.1), anchor: \"start\" });\n        if (!fits) arrLast = base + cs * 1.35;\n      }\n    } else if (o.titlePlaceholder) {\n      const full = \"\u4E0D\u5199 = \u6BCF\u5F20\u7EB8\u6309\u987A\u5E8F\u5404\u653E\u4E00\u904D\uFF08\u4F8B\uFF1A\u524D\u594F (A A1)\u00D73 A A2 [\u526F\u6B4C]\uFF09\", short = \"\u4E0D\u5199 = \u6BCF\u5F20\u7EB8\u6309\u987A\u5E8F\u5404\u653E\u4E00\u904D\";\n      prims.push({ t: \"text\", x: x0, y: base, s: wOf(full, 1.25) <= avail ? full : short, cls: \"arr-empty\", size: as, anchor: \"start\" });\n    }\n    arrangement = { x: x0 - P(0.3), y: base - as * 1.15, w: avail + P(0.3), h: as * 1.6, baseline: base, size: as };\n  }\n  // \u4F5C\u8005\u680F\u6709\u51E0\u884C\uFF1A\u7B2C\u4E00\u5F20\u7EB8\u4ECE\u5B83\u4E0B\u9762\u5F00\u59CB\uFF08v0.10.23\uFF1A\u539F\u6765\u53EA\u7ED9\u7B2C\u4E09\u884C\u8D77\u8BA9\u4F4D\uFF0C\u672C\u6BB5\u89C6\u56FE\u6CA1\u6709\u7F16\u6392\u90A3\u4E00\u884C\u57AB\u7740 = \u4E24\u884C\u4F5C\u8005\u5C31\u538B\u5728\u66F2\u6BB5\u63A7\u4EF6\u4E0A\uFF1Buser\u300C\u8BCD\u66F2\u7684\u8F93\u5165\u548C\u672C\u6BB5\u663E\u793A\u7684\u63A7\u4EF6\u649E\u8F66\u4E86\u300D\uFF09\uFF1B\n  //   \u7F16\u6392\u90A3\u4E00\u884C\u9760\u5DE6\uFF0C\u4F1A\u548C\u901F\u5EA6\u8BB0\u53F7\u649E = \u4E94\u7EBF\u8C31\u4ECE\u5B83\u4E0B\u9762\u5F00\u59CB\n  let yCur = Math.max(TOP + P(TITLE_H + 0.5), credits && lines.length ? credits.y + credits.h + P(0.3) : 0, arrangement ? arrLast + P(0.8) : 0);   // px\uFF0C\u5F80\u4E0B\u6392\u7684\u6E38\u6807\n  /** \u5206\u9875\uFF1A\u8FD9\u4E00\u5757\uFF08\u9AD8 h px\uFF09\u5728\u8FD9\u9875\u653E\u4E0D\u4E0B = \u7FFB\u9875\uFF08\u9875\u9876\u4E0A\u4EC0\u4E48\u90FD\u8FD8\u6CA1\u653E\u65F6\u4E0D\u7FFB\uFF09\u3002 */\n  const ensure = (h: number) => { if (PG && yCur + h > contentBottom(pageNo) && yCur > contentTop(pageNo) + 1) { pageNo++; yCur = contentTop(pageNo); } };\n\n  const bars: Layout[\"bars\"] = [];\n  const chordHeads: Layout[\"chordHeads\"] = [];\n  const sharedRows: number[] = [], virtualOut: Record<string, Token[]> = {}, measures: Layout[\"measures\"] = [], families: Layout[\"families\"] = [];   // \u5408\u79DF\u53E0\u8D77\u6765\u7684\u90A3\u51E0\u884C\uFF08\u53EA\u8BFB\uFF1A\u70B9\u4E86\u4E0D\u5199\u3001\u4E0D\u653E\u5149\u6807\uFF1Bv0.10.25\uFF09\n  const rows: SystemBox[] = [], notes: HitNote[] = [], slots: Slot[] = [], heads: CaretHead[] = [], lyrics: LyricHit[] = [], marks: MarkHit[] = [], dyns: DynHit[] = [], rests: RestHit[] = [], clefs: ClefHit[] = [];\n  const partsHit: Layout[\"parts\"] = [], papersHit: Layout[\"papers\"] = [];\n  let shortBars = 0;\n  const rowTop = new Map<number, number>();   // \u884C\u53F7 \u2192 top\uFF08px\uFF09\n  const rowAbove = new Map<number, number>(), lyricOff = new Map<number, number>(), dynYAt = new Map<number, number>(), noteDynYAt = new Map<number, number>(), navYAt = new Map<number, number>(), ottYAt = new Map<number, number>(), ottDownYAt = new Map<number, number>(), tempoYAt = new Map<number, number>(), grooveYAt = new Map<number, number>();   // + \u901F\u5EA6\u8BB0\u53F7\u7684\u57FA\u7EBF\uFF08px\uFF1B\u7B2C\u4E00\u4E2A\u58F0\u90E8\uFF09   // \u884C\u53F7 \u2192 \u8C31\u4E0A\u9762\u7559\u591A\u5C11\uFF08sp\uFF09/ \u6B4C\u8BCD\u57FA\u7EBF\u5728\u7B2C\u4E00\u7EBF\u4E0B\u591A\u5C11\uFF08sp\uFF09\uFF1B\u58F0\u90E8\u7B2C\u4E00\u6761\u8C31\u884C\u53F7 \u2192 \u529B\u5EA6\u5B57\u57FA\u7EBF\uFF08px\uFF09\n  const staffTop = (r: number) => rowTop.get(r)! + P(rowAbove.get(r) ?? STAFF_ABOVE);\n  const yOf = (r: number, d: number) => staffTop(r) + (TOP_LINE - d) * P(0.5);\n  const dOf = (r: number, y: number) => Math.round(TOP_LINE - (y - staffTop(r)) / P(0.5));\n  const lyricY = (r: number) => yOf(r, BOTTOM_LINE) + P(lyricOff.get(r) ?? LYRIC_BELOW);\n  const staffHit = (r: number) => ({ y: yOf(r, TOP_LINE) - P(1.2), h: yOf(r, BOTTOM_LINE) - yOf(r, TOP_LINE) + P(2.4) });\n  const drawTime = (r: number, x0: number, beats: number, beatType: number, cls: string) => {\n    const num = timeSigDigits(beats), den = timeSigDigits(beatType);\n    const wn = [...num].length * W.timeSigDigit, wd = [...den].length * W.timeSigDigit, cw = Math.max(wn, wd);\n    prims.push({ t: \"glyph\", x: P(x0 + (cw - wn) / 2), y: yOf(r, 36), ch: num, cls });\n    prims.push({ t: \"glyph\", x: P(x0 + (cw - wd) / 2), y: yOf(r, 32), ch: den, cls });\n    return cw;\n  };\n  /** \u300CAndante \u2669 = 88\u300D\uFF1A\u8BCD + \u56DB\u5206\u97F3\u7B26 + \u6570\uFF08user\u300C\u901F\u5EA6\u8BB0\u53F7\u53EF\u4EE5\u7528\u8BED\u4E49+\u6570\u5B57\u5417\u300D\uFF09\u3002 */\n  const drawTempo = (r: number, x0: number, v: number, cls: string, index: number, change?: \"up\" | \"down\") => {\n    const fs = TEMPO_EM * sp, word = tempoWord(v).it, y = tempoYAt.get(r) ?? staffTop(r) - P(2.4);   // \u901F\u5EA6\u8BB0\u53F7\u5728\u6700\u4E0A\u9762\uFF1A\u9AD8\u97F3\u3001\u529B\u5EA6\u5B57\uFF08\u5199\u4E0A\u9762\u7684\u65F6\u5019\uFF09\u90FD\u5728\u5B83\u4E0B\u9762\n    // \u8FD9\u4E00\u6BB5\u5F00\u5934\u7684\u901F\u5EA6\u548C\u4E0A\u4E00\u6BB5\u4E0D\u4E00\u6837 = \u524D\u9762\u6807\u4E00\u4E2A\u5F3A\u8C03\u8272\u7684 \u2191\uFF08\u5FEB\u4E86\uFF09/ \u2193\uFF08\u6162\u4E86\uFF09\u63D0\u793A\uFF08user 2026-10-08\u300C\u4E0D\u8981grey out\uFF0C\u800C\u662F\u6709\u53D8\u5316\u7684\u65F6\u5019\u4F1A\u6807\u4E00\u4E2A\u4E1C\u897F\u63D0\u793A\u7528\u6237\u300D\uFF1B\u4E00\u6837 = \u7167\u5E38\u753B\uFF0C\u4E0D\u6807\uFF09\n    if (change) prims.push({ t: \"text\", x: P(x0 - 0.3), y, s: change === \"up\" ? \"\u2191\" : \"\u2193\", cls: \"tempo-change\", size: fs, anchor: \"end\" });\n    const ww = (o.measureLyric(word) * TEMPO_EM) / LYRIC_EM / sp, num = `= ${v}`, nw = (o.measureLyric(num) * TEMPO_EM) / LYRIC_EM / sp;\n    prims.push({ t: \"text\", x: P(x0), y, s: word, cls: `${cls} tempo-word`, size: fs, anchor: \"start\" });\n    const gx = x0 + ww + 0.7;\n    prims.push({ t: \"glyph\", x: P(gx), y: y - P(0.3), ch: GLYPH.metNoteQuarterUp, cls, size: fs * 1.75 });\n    prims.push({ t: \"text\", x: P(gx + 1.3), y, s: num, cls: `${cls} tempo-num`, size: fs, anchor: \"start\" });\n    marks.push({ index, kind: \"tempo\", system: r, x: P(x0 - 0.3), y: y - P(TEMPO_EM * 1.1), w: P(gx + 1.3 + nw + 0.6 - x0), h: P(TEMPO_EM * 1.5) });\n  };\n  const drawKeySig = (r: number, x0: number, f: number, cls: string, clef: \"G\" | \"F\" = \"G\") => {   // \u4F4E\u97F3\u8C31\u53F7\u7684\u5347\u964D\u53F7\u6BD4\u9AD8\u97F3\u4F4E\u4E24\u7EA7\n    const pos = f > 0 ? SHARP_POS : FLAT_POS, ch = f > 0 ? GLYPH.accidentalSharp : GLYPH.accidentalFlat, off = clef === \"F\" ? -2 : 0;\n    for (let k = 0; k < Math.abs(f); k++) prims.push({ t: \"glyph\", x: P(x0 + k * 1.05), y: yOf(r, pos[k] + off), ch, cls });\n  };\n\n  const showPaperLine = song.papers.length > 1 || song.papers.some((p) => p.name);\n  let drawn = 0;\n  song.papers.forEach((paper, paperK) => {\n    right = baseRight;\n    if (o.onlyPaper && paper.id !== o.onlyPaper) return;   // \u4E00\u6B21\u53EA\u770B\u4E00\u5F20\u7EB8\uFF08\u66F2\u6BB5\uFF09\n    if (drawn++ > 0) yCur += P(PAPER_GAP);\n    // \u901F\u5EA6\u8BB0\u53F7\u753B\u5728\u8FD9\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4F4D\u5728\u573A\u7684\u6B4C\u624B\u90A3\u4E00\u884C\uFF08\u5B83\u7684\u901F\u5EA6\u624D\u7B97\u6570\uFF1B2026-10-08 user\u300C\u7B2C\u56DB\u7AE0sheet\u53EA\u6709\u7B2C\u4E8C\u4E2A\u58F0\u90E8\u7684\u65F6\u5019\u901F\u5EA6\u8BB0\u53F7\u5931\u8E2A\u4E86\u300D\u2014\u2014\u539F\u6765\u53EA\u753B\u5168\u66F2\u7B2C\u4E00\u4E2A\u58F0\u90E8\u7684\uFF09\u3002\n    //   \u5F00\u5934\u7684\u901F\u5EA6\u548C\u4E0A\u4E00\u6BB5\uFF08\u524D\u9762\u6700\u8FD1\u4E00\u5F20\u4E0D\u9690\u85CF\u7684\u7EB8\uFF09\u7ED3\u5C3E\u4E0D\u4E00\u6837 = \u524D\u9762\u6807 \u2191 / \u2193\uFF08user\u300C\u7136\u540E\u5982\u679C\u901F\u5EA6\u548C\u4E0A\u4E00\u6BB5\u4E00\u6837\u548C\u4E0D\u4E00\u6837\u7684\u8BDD\u5E94\u8BE5\u4E5F\u6709ui\u4E0A\u7684\u5DEE\u522B\u300D\u2192\u300C\u4E0D\u8981grey out\uFF0C\u800C\u662F\u6709\u53D8\u5316\u7684\u65F6\u5019\u4F1A\u6807\u4E00\u4E2A\u4E1C\u897F\u63D0\u793A\u7528\u6237\u300D\uFF09\n    const owner = tempoOwner(song, paper), prevPaper = song.papers.slice(0, paperK).reverse().find((x) => !x.hidden), prevBpm = prevPaper ? sheetEndBpm(song, prevPaper) : null;\n    const paperTop = yCur;\n    // \u66F2\u6BB5\u540D\u90A3\u4E00\u6761\uFF08\u591A\u4E8E\u4E00\u5F20\u7EB8\u6216\u586B\u4E86\u540D\u5B57\u624D\u753B\uFF1B\u7A7A\u7740\u753B\u6D45\u8272\u63D0\u793A\uFF1B\u53F3\u8FB9\u300C\u22EF\u300D= \u7EB8\u7684\u83DC\u5355\uFF09\u3002\u5206\u9875\u65F6\u548C\u7B2C\u4E00\u884C\u8C31\u4E00\u8D77\u632A\uFF0C\u6240\u4EE5\u7B49\u7B97\u5B8C\u884C\u9AD8\u518D\u753B\n    const pSize = P(1.6);\n    let menu: Box | null = null;\n    const paperNav: { prev?: Box | null; next?: Box | null; scope?: Box } = {};\n    const pTitle: TitleHit & { shown: boolean } = { x: P(MARGIN), y: yCur, w: o.width - P(2 * MARGIN) - P(o.titlePlaceholder && song.papers.length > 1 ? 16 : 4), h: P(PAPER_H), baseline: 0, size: pSize, shown: showPaperLine };   // \u53F3\u8FB9\u8BA9\u51FA\u66F2\u6BB5\u63A7\u4EF6\u7EC4\n    const drawPaperTitle = (firstBlock: number) => {\n      if (!showPaperLine) return;\n      ensure(P(PAPER_H) + firstBlock);\n      const pBase = yCur + P(PAPER_H * 0.68);\n      pTitle.y = yCur; pTitle.baseline = pBase;\n      if (paper.name) prims.push({ t: \"text\", x: P(MARGIN), y: pBase, s: paper.name, cls: paper.hidden && !o.onlyPaper ? \"paper-name hidden-paper\" : \"paper-name\", size: pSize, anchor: \"start\" });   // \u6298\u53E0\u7684\u9690\u85CF\u7EB8 = \u63A7\u4EF6\uFF08\u70B9\u4E86\u8FDB\u53BB\uFF09\uFF0CPDF \u4E0D\u5370\n      else if (o.titlePlaceholder) prims.push({ t: \"text\", x: P(MARGIN), y: pBase, s: \"\u66F2\u6BB5\u540D\", cls: \"paper-name empty\", size: pSize, anchor: \"start\" });\n      // \u66F2\u6BB5\u63A7\u4EF6\u7EC4\uFF082026-10-08 user\u300C\u2026\u80FD\u4E0D\u80FD\u653E\u5728\u548C\u66F2\u6BB5\u5BFC\u822A\u5728\u4E00\u8D77\u300D\u300C\u5C31\u4E00\u4E2A\u6309\u94AEtoggle\u300D\u300C\u7C7B\u4F3Csolo toggle\u300D\u300C\u7136\u540E\u66F2\u6BB5\u7684...\u4E5F\u653E\u5728\u66F2\u6BB5\u63A7\u4EF6\u90A3\u91CC\u300D\n      //   \u300C\u591A\u66F2\u6BB5\u6A21\u5F0F\u4E0B\u9762\u5E94\u8BE5\u6BCF\u4E2A\u66F2\u6BB5\u90FD\u6709\u5BF9\u5E94\u7684\u5C0F\u63A7\u4EF6\u7EC4\u300D\uFF09\uFF1A\u6BCF\u5F20\u7EB8\u81EA\u5DF1\u90A3\u4E00\u884C\u53F3\u8FB9\u300C\u2039 k/n \u203A \u672C\u6BB5 \u22EF\u300D\u2014\u2014\u2039 \u203A \u4ECE\u8FD9\u5F20\u8DF3\uFF1B\u672C\u6BB5 = \u53EA\u770B\u8FD9\u5F20\uFF08\u4EAE\uFF09/ \u56DE\u5230\u5168\u90E8\uFF1B\u22EF = \u8FD9\u5F20\u7EB8\u7684\u83DC\u5355\n      if (o.titlePlaceholder && song.papers.length > 1) {\n        const k = song.papers.findIndex((p) => p.id === paper.id), n = song.papers.length, ch = P(CTL_H), cw = P(CTL_H), cy = yCur + P((PAPER_H - CTL_H) / 2);\n        const lab = `${k + 1}/${n}`, lw = (o.measureLyric(lab) * CTL_TEXT) / LYRIC_EM + P(1.0), sw = (o.measureLyric(\"\u672C\u6BB5\") * CTL_TEXT) / LYRIC_EM + P(1.6), mw = P(CTL_H + 0.6);\n        const segOn = o.onlyPaper === paper.id, total = cw + lw + cw + P(1.0) + sw + P(0.6) + mw;\n        let x = o.width - P(MARGIN) - total;\n        const hit = (bx: number, w: number): Box => ({ x: bx - P(0.3), y: cy - P(0.2), w: w + P(0.6), h: ch + P(0.4) });   // \u4E0A\u4E0B\u53EA\u591A 0.2\uFF1A\u4E0D\u51FA\u66F2\u6BB5\u540D\u90A3\u4E00\u6761\uFF0C\u4E0D\u62A2\u4E0B\u9762\u8C31\u7684\u70B9\n        prims.push({ t: \"rect\", x, y: cy, w: cw, h: ch, cls: k > 0 ? \"paper-chip\" : \"paper-chip off\" });\n        prims.push({ t: \"text\", x: x + cw / 2, y: cy + ch * 0.72, s: \"\u2039\", cls: \"paper-chip-text\", size: P(CTL_GLYPH), anchor: \"middle\" });\n        const prev = k > 0 ? hit(x, cw) : null; x += cw;\n        prims.push({ t: \"text\", x: x + lw / 2, y: cy + ch * 0.7, s: lab, cls: \"nav-text\", size: P(CTL_TEXT), anchor: \"middle\" }); x += lw;\n        prims.push({ t: \"rect\", x, y: cy, w: cw, h: ch, cls: k < n - 1 ? \"paper-chip\" : \"paper-chip off\" });\n        prims.push({ t: \"text\", x: x + cw / 2, y: cy + ch * 0.72, s: \"\u203A\", cls: \"paper-chip-text\", size: P(CTL_GLYPH), anchor: \"middle\" });\n        const next = k < n - 1 ? hit(x, cw) : null; x += cw + P(1.0);\n        prims.push({ t: \"rect\", x, y: cy, w: sw, h: ch, cls: segOn ? \"paper-chip on\" : \"paper-chip\" });\n        prims.push({ t: \"text\", x: x + sw / 2, y: cy + ch * 0.7, s: \"\u672C\u6BB5\", cls: segOn ? \"nav-text on\" : \"nav-text\", size: P(CTL_TEXT), anchor: \"middle\" });\n        const scope = hit(x, sw); x += sw + P(0.6);\n        prims.push({ t: \"rect\", x, y: cy, w: mw, h: ch, cls: \"paper-chip\" });\n        prims.push({ t: \"text\", x: x + mw / 2, y: cy + ch * 0.72, s: \"\u22EF\", cls: \"paper-chip-text\", size: P(CTL_GLYPH), anchor: \"middle\" });\n        menu = hit(x, mw);\n        Object.assign(paperNav, { prev, next, scope });\n      }\n      yCur += P(PAPER_H);\n    };\n    // \u9690\u85CF\u7684\u7EB8\uFF08\u4E0D\u653E\uFF09\uFF1A\u5168\u90E8\u89C6\u56FE\u91CC\u6298\u53E0\u6210\u66F2\u6BB5\u540D + \u4E00\u6761\u7EC6\u884C\uFF08\u70B9\u66F2\u6BB5\u540D\u8FDB\u53BB\uFF09\uFF1B\u672C\u6BB5\u89C6\u56FE\u91CC\u7167\u5E38\u753B\u3001\u9876\u4E0A\u4E00\u884C\u8BF4\u660E\uFF08user 2026-10-08\u300C\u8981\u660E\u767D\u7684\u660E\u767D\u8FD9\u662F\u9690\u85CF\u7684\u300D\uFF09\n    if (paper.hidden && !o.onlyPaper) {\n      drawPaperTitle(P(STUB_H));\n      ensure(P(STUB_H));\n      prims.push({ t: \"text\", x: P(MARGIN), y: yCur + P(STUB_H * 0.7), s: \"\u9690\u85CF \u00B7 \u4E0D\u653E\uFF08\u70B9\u66F2\u6BB5\u540D\u8FDB\u53BB\uFF09\", cls: \"part-stub\", size: P(1.1), anchor: \"start\" });\n      prims.push({ t: \"line\", x1: P(MARGIN + 0.2) + (o.measureLyric(\"\u9690\u85CF \u00B7 \u4E0D\u653E\uFF08\u70B9\u66F2\u6BB5\u540D\u8FDB\u53BB\uFF09\") * 1.1) / LYRIC_EM + P(0.8), y1: yCur + P(STUB_H * 0.5), x2: P(right), y2: yCur + P(STUB_H * 0.5), w: P(0.08), cls: \"part-stub-line\" });\n      yCur += P(STUB_H);\n      papersHit.push({ id: paper.id, title: pTitle, menu, top: paperTop, bottom: yCur, ...paperNav });\n      return;\n    }\n    const present = o.parts.filter((p) => paper.tracks[p.id]), visible = present.filter((p) => !p.hidden), hiddenParts = present.filter((p) => p.hidden);\n    // \u5408\u79DF\uFF08v0.10.28 \u6539\uFF1B\u8BBE\u8BA1\u8D26 ai-docs/20261010-shared-staff-percussion-design.md \u00A71\uFF09\uFF1A\u4E00\u5BB6\uFF08\u4E3B\u4EBA + \u8FD9\u5F20\u7EB8\u4E0A\u770B\u5F97\u89C1\u7684\u623F\u5BA2\uFF09\u53E0\u8D77\u6765 = \u4E00\u6761\u865A\u62DF\u7684\u591A\u58F0\u90E8 track\n    //   \uFF08src/score/merge.ts\uFF1A\u5404\u4EBA\u7684\u97F3\u6309\u65F6\u95F4\u5E76\u6210\u548C\u5F26\uFF09\uFF0C\u5F53\u6210\u4E3B\u4EBA\u90A3\u4E00\u4F4D\u4EA4\u7ED9\u4E0B\u9762\u666E\u901A\u7684\u6392\u8C31\u6D41\u7A0B\u2014\u2014\u81EA\u5DF1\u6311\u8C31\u53F7\u3001\u592A\u5BBD = \u53CC\u624B\u8C31\u3001\u81EA\u52A8\u516B\u5EA6\u7EBF\u3001\u5168\u662F\u9F13 = \u4E94\u7EBF\u9F13\u8C31\uFF1B\u623F\u5BA2\u4E0D\u518D\u81EA\u5DF1\u753B\u3002\n    //   user\u300Ci think it is wiser to just \u805A\u5408 all the notes and render them as they are a single polyphonic track\u300D\u300C\u2026use the already-have rendering procedure for that virtual track\u300D\n    //   \u300Cfor shared clef i dont know why there is data contract. it is just the proper way of showing multi teanants\u300D\uFF08\u4E0D\u5B58\u4E1C\u897F\uFF09\u3002\u4EE5\u524D\uFF08v0.10.24\u201327\uFF09\u5404\u753B\u5404\u7684 = \u7B26\u5E72\u6253\u67B6\uFF08\u300C\u874C\u86AA\u7684\u5C3E\u5DF4\u5728\u6253\u67B6\u300D\uFF09\u3002\n    //   \u4E00\u5BB6\u91CC\u6709\u8C01\u662F\u73B0\u5728\u5728\u5199\u7684 = \u6574\u5BB6\u62C6\u5F00\uFF08\u5404\u81EA\u4E00\u884C\u3001\u80FD\u5199\uFF09\uFF1B\u90FD\u4E0D\u662F = \u53E0\u8D77\u6765\u3001\u6574\u884C\u53EA\u8BFB\uFF08v0.10.25\uFF0Cuser\u300Chost\u4E5F\u5E94\u8BE5\u53EA\u8BFB\uFF0C\u53EA\u6709\u5C55\u5F00\u65F6\u624D\u80FD\u7F16\u8F91\u300D\uFF09\u3002\n    const hostOf = (id: string) => song.parts.find((x) => x.id === id)?.host;\n    const editingHere = !o.foldAll && o.at.paper === paper.id ? o.at.part : null;   // \u542C\u6A21\u5F0F = \u4E00\u5F8B\u53E0\u8D77\u6765\n    const absorbed = new Map<string, PartView[]>(), virt = new Map<string, Token[]>(), lowOf = new Map<string, string>();   // \u4E3B\u4EBA id \u2192 \u53E0\u8FDB\u6765\u7684\u623F\u5BA2 / \u5E76\u597D\u7684\u865A\u62DF track / \u53CC\u624B\u8C31\u4E0B\u9762\u90A3\u5F20\u7684\u5047 id\n    const voice2Of = new Map<string, string>(), shareWith = new Map<string, string>(), startFor = new Map<string, ClefName>();   // \u4E00\u5F20\u8C31\u8868 \u2192 \u5B83\u7684\u58F0\u90E8 2 / \u58F0\u90E8 2 \u2192 \u753B\u5728\u54EA\u4E00\u4F4D\u90A3\u884C / \u865A\u62DF\u90A3\u51E0\u6761\u7684\u8C31\u53F7\n    // \u6309\u4E00\u5BB6\u6536\uFF08\u4E3B\u4EBA id\uFF09\uFF1A\u8FD9\u5F20\u7EB8\u4E0A\u8FD9\u4E00\u5BB6\u5728\u573A\u7684\u6709\u4E24\u4F4D\u4EE5\u4E0A\u5C31\u53E0\u2014\u2014\u4E3B\u4EBA\u4E0D\u5728\u8FD9\u5F20\u7EB8\u4E0A\u4E5F\u7167\u6837\u53E0\uFF0C\u6253\u5934\u7684\u90A3\u4F4D\u5728\u573A\u7684\u5F53\u8FD9\u4E00\u884C\uFF08v0.10.31\uFF1Buser\u300Cpiano1\u4E0D\u5728\u7684\u65F6\u5019piano2\u548C3\u6CA1\u6709\u6210\u529F\u5408\u5E76\u300D\uFF09\n    const famOf = (id: string) => hostOf(id) ?? (song.parts.some((x) => x.host === id) ? id : null);\n    const famIds = [...new Set(visible.map((p) => famOf(p.id)).filter((x): x is string => !!x))];\n    const famHere = (fid: string) => visible.filter((p) => famOf(p.id) === fid);   // \u6309\u6B4C\u91CC\u7684\u987A\u5E8F\uFF08\u4E3B\u4EBA\u5728\u524D\uFF09\n    for (const fid of famIds) {\n      const ms = famHere(fid); if (ms.length < 2) continue;\n      if (editingHere !== null && famOf(editingHere) === fid) continue;\n      const hp = ms[0], ten = ms.slice(1), drums = ms.every((m) => !!m.perc);\n      // \u4E00\u5BB6\u5168\u662F\u9F13\uFF1A\u56FA\u5B9A\u6572\u4E00\u4EF6\u7684\u6362\u6210\u90A3\u4E00\u4EF6\u7684\u9F13\u952E\uFF08\u4E94\u7EBF\u9F13\u8C31\u4E0A\u5B83\u90A3\u4E00\u7EBF\uFF09\uFF1B\u97F3\u6548\uFF08\u4E0D\u662F\u9F13\u952E\uFF09= \u4E00\u4E2A\u8868\u91CC\u6CA1\u6709\u7684\u952E\uFF08\u753B\u5728\u4E2D\u95F4\u90A3\u6761\u7EBF\uFF09\n      //   \u5355\u4EF6\u4E50\u5668\uFF08\u6728\u9C7C / \u592A\u9F13\u2026\uFF09= \u5B83\u5728\u4E00\u5957\u9F13\u91CC\u7684\u90A3\u4E2A\u952E\uFF08\u6982\u5FF5\u7684 mainKey \u2192 kitKey\uFF09\uFF1B\u9F13\u4EF6 = \u5B83\u81EA\u5DF1\u7684\u952E\uFF1B\u90FD\u6CA1\u6709\uFF08\u97F3\u6548\uFF09= \u4E00\u4E2A\u8868\u91CC\u6CA1\u6709\u7684\u952E\uFF08\u753B\u5728\u4E2D\u95F4\u90A3\u6761\u7EBF\uFF09\n      const keyOf = drums ? (m: number, p: Pitch): Pitch => { const pk = ms[m].perc!; return pk.kind === \"one\" ? spellMidi(pk.info.kitKey ?? (pk.info.staff === 5 && !pk.info.from ? pk.key : 0), 0) : p; } : undefined;\n      const tracksM = ms.map((m) => paper.tracks[m.id]);\n      absorbed.set(hp.id, ten);\n      // \u4E00\u5F20\u8C31\u8868\u7684\u4E00\u6761\uFF1A\u8C31\u53F7\u6309\u8FD9\u5F20\u8C31\u4E0A\u6240\u6709\u7684\u97F3\u6311\uFF1B\u58F0\u90E8 1 = \u8FD9\u4E00\u4F4D\uFF08\u7B26\u5E72\u671D\u4E0A\uFF09\u3001\u58F0\u90E8 2 = \u5047\u7684\u4E00\u4F4D `\u2026~v2`\uFF0C\u753B\u5728\u58F0\u90E8 1 \u90A3\u4E00\u884C\u4E0A\uFF08\u7B26\u5E72\u671D\u4E0B\u3001\u4E0D\u753B\u4F11\u6B62 / \u5C0F\u8282\u7EBF / \u540D\u5B57\uFF09\n      const staffOf = (sid: string, mo: (v: 1 | 2) => MergeOpts, all: MergeOpts) => {\n        startFor.set(sid, startClef(mergeTracks(tracksM, all), undefined, null, true));\n        const v1 = mergeTracks(tracksM, mo(1)), v2 = mergeTracks(tracksM, mo(2));\n        virt.set(sid, v1); virtualOut[`${paper.id}:${sid}`] = v1;\n        if (v2.some((t) => t.kind === \"note\")) { const vid = `${sid}~v2`; virt.set(vid, v2); virtualOut[`${paper.id}:${vid}`] = v2; voice2Of.set(sid, vid); shareWith.set(vid, sid); startFor.set(vid, startFor.get(sid)!); }\n      };\n      if (drums) {   // \u4E00\u5BB6\u5168\u662F\u9F13 = \u5E76\u6210\u4E00\u5957\u9F13\uFF08\u4E94\u7EBF\u9F13\u8C31\u3001\u6BCF\u4EF6\u5728\u81EA\u5DF1\u90A3\u4E00\u7EBF\uFF1B\u4E0D\u5206\u58F0\u90E8\uFF0C\u7B26\u5E72\u6309\u9F13\u8C31\u8868\uFF09\n        const whole = mergeTracks(tracksM, { keyOf }); virt.set(hp.id, whole); virtualOut[`${paper.id}:${hp.id}`] = whole; startFor.set(hp.id, \"G\");\n      } else {\n        // \u5206\u624B / \u5206\u58F0\u90E8\u6309\u4EBA\uFF08merge.ts planHands\uFF1Buser\u300C\u6211\u73B0\u5728\u89C9\u5F97\u5408\u79DF\u7684\u65F6\u5019\u8FD8\u662F\u667A\u80FD\u5206\u5DE6\u53F3\u624B\u548C\u58F0\u90E8\u7684\u5BF9\u5E94\u5173\u7CFB\u6BD4\u8F83\u597D\u300D\u300C\u4EE5\u53CA\u4F60\u4E5F\u53EF\u4EE5\u9009\u62E9\u5408\u79DF\u7684\u65F6\u5019\u4E0D\u7528\u53CC\u624B\u8C31\u300D\uFF09\uFF1A\n        //   \u6BCF\u4F4D\u4E00\u5F20\u5BB6\u8C31\u3001\u6309\u5C0F\u8282\u6362\u3001\u51E0\u4E2A\u51FA\u683C\u7684\u97F3\u4E0D\u4E71\u8BA4\u9886\uFF1B\u4E00\u5F20\u8C31\u8BFB\u5F97\u4E0B = \u4E0D\u7528\u53CC\u624B\u8C31\uFF1B\u540C\u4E00\u5F20\u8C31\u4E0A\u4E24\u7EC4\u4EBA = \u4E24\u4E2A\u58F0\u90E8\uFF08\u4E0A\u9762\u671D\u4E0A\u3001\u4E0B\u9762\u671D\u4E0B\uFF09\n        // \u5404\u4F4D\u7684\u5BB6\u8C31 = \u5B83\u62C6\u5F00\u6765\u65F6\u7684\u8C31\u53F7\uFF08\u4F4E\u97F3\u8C31\u53F7 = \u4E0B\u8C31\uFF1B\u81EA\u5DF1\u662F\u5927\u8C31\u8868 = \u6309\u97F3\u9AD8\uFF09\n        // \u4E3B\u4EBA\uFF08fid\uFF0C\u4E0D\u7BA1\u5728\u4E0D\u5728\u8FD9\u5F20\u7EB8\u4E0A\uFF09\u8BBE\u6210\u5927\u8C31\u8868 = \u8FD9\u4E00\u884C\u4E00\u5B9A\u53CC\u624B\u8C31\uFF08v0.10.42\uFF1Buser\u300C\u5C31\u662F\u6211\u5E0C\u671B\u8BA9\u5408\u79DF\u662Fgrand staff\u8C03piano1\u6CA1\u7528\u9700\u8981\u8C032\uFF0C\u5F88\u5947\u602A\u300D\uFF09\n        const homes = ms.map((m): 0 | 1 | null => { if (m.staves === 2) return null; const c = m.clef ?? clefStarts.get(paper.id)?.get(m.id); return c ? (isFClef(c) ? 1 : 0) : null; });\n        const plan = planHands(tracksM, wantsGrand, homes, song.parts.find((x) => x.id === fid)?.staves === 2), staffOpts = (S: 0 | 1, top: boolean) => (v: 1 | 2): MergeOpts => ({ pick: plan.pick(S, v), marks: top && v === 1 ? \"all\" : \"bars\" });\n        const both = (S: 0 | 1): MergeOpts => ({ pick: (m, t) => plan.pick(S, 1)(m, t) || plan.pick(S, 2)(m, t), marks: \"bars\" });\n        staffOf(hp.id, staffOpts(0, true), both(0));\n        if (plan.grand) { const lid = `${hp.id}~lo`; lowOf.set(hp.id, lid); staffOf(lid, staffOpts(1, false), both(1)); }   // \u4E0B\u9762\u90A3\u5F20 + \u5DE6\u8FB9\u4E00\u4E2A\u82B1\u62EC\u53F7\n      }\n    }\n    // \u5C55\u5F00\u7740\u7684\u90A3\u51E0\u5BB6\uFF08\u4E00\u5BB6\u91CC\u6709\u4EBA\u5728\u5199\uFF09\uFF1A\u62EC\u53F7\u753B\u5728\u54EA\u51E0\u884C\uFF08\u4E3B\u4EBA \u2192 \u8FD9\u5F20\u7EB8\u4E0A\u770B\u5F97\u89C1\u7684\u6700\u540E\u4E00\u4F4D\u623F\u5BA2\uFF09\n    const openFams = famIds.filter((fid) => famHere(fid).length >= 2 && !absorbed.has(famHere(fid)[0].id)).map((fid) => ({ host: fid, ids: famHere(fid).map((p) => p.id) }));\n    const gone = new Set([...absorbed.values()].flat().map((p) => p.id));   // \u53E0\u8FDB\u522B\u4EBA\u90A3\u4E00\u884C\u7684\n    const parts: PartView[] = visible.filter((p) => !gone.has(p.id)).flatMap((p): PartView[] => {\n      if (!virt.has(p.id)) return [p];\n      const drums = [p, ...absorbed.get(p.id)!].every((m) => !!m.perc), lid = lowOf.get(p.id);   // \u865A\u62DF\u7684\u90A3\u4E00\u4F4D\uFF1A\u8C31\u53F7\u81EA\u52A8\u3001\u4E0D\u7070\u4EFB\u4F55\u4E1C\u897F\uFF08\u53E0\u7740\u53EA\u662F\u770B\uFF09\n      const v: PartView = { ...p, clef: undefined, staves: undefined, perc: drums ? { kind: \"kit\" } : undefined, mono: false, xHead: false, ignores: [], lyricMute: undefined };\n      const fake = (id: string): PartView => ({ id, name: \"\", empty: false, first: false, hidden: false, badges: [] }), v2 = (sid: string) => (voice2Of.has(sid) ? [fake(voice2Of.get(sid)!)] : []);\n      return [v, ...v2(p.id), ...(lid ? [fake(lid), ...v2(lid)] : [])];\n    });\n    const loIds = new Set(lowOf.values());\n    const trackOf = (id: string): Token[] => virt.get(id) ?? paper.tracks[id];\n    // \u9690\u85CF\u7684\u58F0\u90E8\u4E0D\u6D88\u5931\uFF1A\u7F29\u6210\u4E00\u6761\u7EC6\u884C\uFF08\u7070\u540D\u5B57 + \u300C\u9690\u85CF\u300D\uFF09\uFF0C\u70B9\u5B83\u5F00\u6B4C\u624B\u724C\uFF08user\u300Chide\u7684track\u600E\u4E48\u770B\u89C1\u300D\uFF09\n    const stubs = () => {\n      for (const p of hiddenParts) {\n        ensure(P(STUB_H));\n        prims.push({ t: \"text\", x: P(MARGIN), y: yCur + P(STUB_H * 0.7), s: `${p.name} \u00B7 \u9690\u85CF`, cls: \"part-stub\", size: P(1.1), anchor: \"start\" });\n        prims.push({ t: \"line\", x1: P(MARGIN + 0.2) + (o.measureLyric(`${p.name} \u00B7 \u9690\u85CF`) * 1.1) / LYRIC_EM + P(0.8), y1: yCur + P(STUB_H * 0.5), x2: P(right), y2: yCur + P(STUB_H * 0.5), w: P(0.08), cls: \"part-stub-line\" });\n        partsHit.push({ paper: paper.id, part: p.id, x: P(MARGIN - 0.4), y: yCur, w: P(right - MARGIN + 0.4), h: P(STUB_H) });\n        yCur += P(STUB_H);\n      }\n    };\n    if (!parts.length) {   // \u8FD9\u5F20\u7EB8\u4E0A\u6CA1\u6709\u663E\u793A\u7684\u58F0\u90E8\uFF1A\u53EA\u6709\u7EC6\u884C\uFF08\u90FD\u9690\u85CF\u4E86\uFF09\u6216\u4E00\u884C\u5B57\uFF08\u538B\u6839\u6CA1\u58F0\u90E8\uFF09\n      drawPaperTitle(P(hiddenParts.length ? STUB_H : 3.2));\n      if (!hiddenParts.length) { prims.push({ t: \"text\", x: P(MARGIN), y: yCur + P(2.2), s: \"\uFF08\u8FD9\u5F20\u7EB8\u4E0A\u6CA1\u6709\u58F0\u90E8\uFF09\", cls: \"paper-name empty\", size: P(1.3), anchor: \"start\" }); yCur += P(3.2); }\n      stubs();\n      papersHit.push({ id: paper.id, title: pTitle, menu, top: paperTop, bottom: yCur, ...paperNav });\n      return;\n    }\n    // 1. \u6BCF\u4E2A\u58F0\u90E8\u7684\u6392\u7248\u5355\u5143\n    //   \u8865\u9F50\uFF08v0.10.6\uFF1Buser\u300C\u70B9\u5C0F\u8282\u5199\u8FD9\u91CC\u597D\u300D\u300C\u8FD9\u6837\u7684\u8BDD\u8981\u4E0D\u8981\u505A\u65B0\u8F68\u5728\u663E\u793A\u7684\u65F6\u5019\u81EA\u52A8\u8865\u9F50\u5C0F\u8282\u53F7\u3002\u7136\u540E\u81EA\u52A8\u8865\u7684\u4F11\u6B62\u4E5F\u662F\u81EA\u52A8\u7684\u6DE1\u8272\u300D\u300C\u5C0F\u8282\u53F7\uFF08\u7528\u5C0F\u5B57\u4F53\uFF09\u4E5F\u505A\u4E00\u4E0B\u300D\uFF09\uFF1A\u8FD9\u5F20\u7EB8\u4E0A\u77ED\u7684\u58F0\u90E8\uFF0C\u540E\u9762\u7A7A\u7740\u7684\u65F6\u503C\u753B\u6210\u6DE1\u8272\u4F11\u6B62\uFF08\u6309\u5C0F\u8282\u5207\uFF0C\u5C0F\u8282\u7EBF / \u6298\u884C / \u6BCF\u884C\u5F00\u5934\u7684\u5C0F\u8282\u53F7\u90FD\u8DDF\u7740\uFF09\uFF0C\u53EA\u753B\u4E0D\u5B58\uFF1B\n    //   \u70B9\u90A3\u51E0\u4E2A\u5C0F\u8282 = \u5149\u6807\u5728\u5C3E\u5DF4 + lead\uFF08\u5199\u7684\u90A3\u4E00\u523B\u624D\u843D\u6210\u4F11\u6B62\uFF0Csong.ts materializeLead\uFF09\u3002\n    const lenOf = (t: Token[]) => t.reduce((n, x) => n + (isTimed(x) ? x.dur : 0), 0);\n    const lens = parts.map((p) => lenOf(trackOf(p.id) ?? [])), paperLen = Math.max(0, ...lens);\n    const per = parts.map((p, pi) => {\n      const real = trackOf(p.id), vrt = virt.has(p.id), focused = !vrt && o.at.paper === paper.id && o.at.part === p.id, staves: 1 | 2 = p.staves === 2 ? 2 : 1;\n      const gap = paperLen - lens[pi];\n      const padT = (dur: number, id: number): Token => ({ kind: \"rest\", id, dur }) as Token;\n      const tokens = gap > 1e-6 ? [...real, padT(gap, -2)] : real;   // \u8865\u9F50\u7684\u4E00\u6BB5 = \u4E00\u4E2A\u957F\u4F11\u6B62\uFF08\u6309\u5C0F\u8282\u5207\u5F00\u753B\uFF1B\u5149\u6807\u5728\u91CC\u9762\u7684\u4F4D\u7F6E = \u843D\u70B9 Slot.lead\uFF0C\u4E0D\u8FDB\u6392\u7248\uFF09\n      const u = unitsOf(tokens, { tail: focused && !!o.tailOpen, autoBars, measureLyric: o.measureLyric, sp, rhythm: song.lyricFit !== \"lyrics\", padFrom: real.length });\n      shortBars += u.shortBars;\n      if (staves === 2) {   // \u5927\u8C31\u8868\uFF1A\u6BCF\u4E2A\u97F3\u5728\u4E0A\u8FD8\u662F\u4E0B\uFF08\u6309\u97F3\u9AD8\u81EA\u52A8 / \u624B\u52A8\u6307\u5B9A\uFF09\uFF1B\u5149\u6807\u8DDF\u7740\u524D\u4E00\u4E2A\u97F3\n        const stf = staffOfTokens(tokens, 2); let last: Staff = 1;\n        for (const x of u.units) { if (x.kind === \"chunk\") { x.staff = stf[x.index]; last = x.staff; } else if (x.kind === \"head\") x.staff = last; }\n      }\n      // \u8C31\u53F7\uFF08v0.9.28\uFF09\uFF1A\u8FD9\u5F20\u7EB8\u5F00\u5934\u7684\uFF08\u58F0\u90E8\u5199\u4E86 = \u5B83\uFF0C\u6CA1\u5199 = \u81EA\u52A8\uFF09+ \u6BCF\u4E2A\u4E0B\u6807\u5904\u751F\u6548\u7684\u8C31\u53F7 / \u516B\u5EA6\u7EBF\uFF1B\u5927\u8C31\u8868\u7167\u65E7\u4E0A\u9AD8\u97F3\u4E0B\u4F4E\u97F3\n      const start: ClefName = staves === 2 ? \"G\" : vrt ? startFor.get(p.id) ?? startClef(tokens, undefined, null, true) : clefStarts.get(paper.id)?.get(p.id) ?? \"G\";\n      // \u81EA\u52A8\u516B\u5EA6\u7EBF\uFF08v0.9.37\uFF1Buser\u300C\u81EA\u52A8\u52A0\u300D\uFF09\uFF1A\u5728\u6311\u597D\u7684\u8C31\u53F7\u4E0B\uFF0C\u4E00\u4E32\u5F88\u9AD8 / \u5F88\u4F4E\u7684\u97F3\u753B 8va / 15ma / 8vb\uFF1B\u624B\u5199\u7684\u8BF4\u4E86\u7B97\uFF1B\u8FD9\u4F4D\u5173\u4E86 / \u5927\u8C31\u8868 = \u4E0D\u81EA\u52A8\u3002\u53EA\u7BA1\u753B\uFF0C\u4E0D\u5B58\u8FDB\u8C31\n      const ds0 = displayStates(tokens, start), ao = staves === 2 || p.perc || shareWith.has(p.id) || (!vrt && song.parts.find((x) => x.id === p.id)?.autoOttava === false) ? null : autoOttava(tokens, ds0);   // \u58F0\u90E8 2 \u4E0D\u53E6\u753B\u516B\u5EA6\u7EBF\uFF08\u548C\u58F0\u90E8 1 \u540C\u4E00\u5F20\u8C31\uFF09\n      const ds = ao ? { clef: ds0.clef, ott: ao.ott, auto: ao.auto as boolean[] | null, runs: ao.runs } : { ...ds0, auto: null as boolean[] | null, runs: [] as { from: number; to: number; shift: 1 | 2 | -1 }[] };\n      const fFam = staves === 2 || isFClef(start) || tokens.some((t) => t.kind === \"clef\" && isFClef(t.clef));\n      return { p, tokens, realLen: real.length, realTicks: lens[pi], focused, staves, start, ds, fFam, vrt, ...u };\n    });\n    /** \u540C\u4E00\u4E2A\u5B9E\u9645\u97F3\u9AD8\u5728\u8C31\u4E0A\u8981\u632A\u51E0\u7EA7\uFF1A\u8C31\u53F7 + \u516B\u5EA6\u7EBF\uFF08index < 0 = \u8FD9\u5F20\u7EB8\u5F00\u5934\u7684\u8C31\u53F7\uFF09\u3002\u5927\u8C31\u8868 = \u4E0A\u9AD8\u97F3\u4E0B\u4F4E\u97F3\u3002 */\n    const shAt = (q: (typeof per)[number], staff: Staff, index: number): number => {\n      return q.staves === 2 ? (staff === 2 ? 12 : 0) : CLEF_SHIFT[(index >= 0 ? q.ds.clef[index] : undefined) ?? q.start] + ottavaShift(index >= 0 ? q.ds.ott[index] ?? 0 : 0);\n    };\n    // \u9F13\u8C31\uFF08v0.10.27\uFF1Buser\u300C\u8FD9\u4E2A\u505A\u597D\u4E4B\u540E\u9F13\u8C31\u505A\u4E00\u4E0B\u3002\u56E2\u5B50\u53EA\u5269\u4E0B\u9F13\u548C\u97F3\u6548\u4E86\u300D\u300C\u5355\u4E50\u5668\u4E00\u7EBF\u8C31\u540C\u610F\u300D\uFF1B\u8BBE\u8BA1\u8D26 \u00A72\uFF09\uFF1A\u8FD9\u4E00\u884C\u753B\u6210\u51E0\u7EBF\u7684\u9F13\u8C31\u3002\n    //   \u4E00\u4F4D\u56FA\u5B9A\u6572\u4E00\u4EF6\u7684\uFF08\u9F13\u4EF6 / \u97F3\u6548\uFF09= \u4E00\u7EBF\u8C31\uFF1B\u6574\u5957\u9F13 = \u4E94\u7EBF\u9F13\u8C31\uFF1B\u4E00\u5BB6\u5408\u79DF\u5168\u662F\u9F13 = \u5E76\u6210\u4E00\u5957\u9F13\uFF08\u4E0A\u9762\u7684 keyOf\uFF09= \u4E94\u7EBF\u9F13\u8C31\u3001\u6BCF\u4EF6\u5728\u81EA\u5DF1\u90A3\u4E00\u7EBF\u3002\n    const pmode = per.map((q) => (!q.p.perc ? null : q.p.perc.kind === \"kit\" ? \"five\" : \"one\"));\n    /** \u58F0\u90E8 2 \u753B\u5728\u54EA\u4E00\u4F4D\u90A3\u884C\uFF08per \u91CC\u7684\u4E0B\u6807\uFF09\uFF1B-1 = \u81EA\u5DF1\u4E00\u884C\u3002 */\n    const rowHost = per.map((q) => { const h = shareWith.get(q.p.id); return h ? per.findIndex((x) => x.p.id === h) : -1; });\n    const hasV2 = per.map((q) => voice2Of.has(q.p.id));\n    /** \u8FD9\u4E2A\u97F3\u5728\u9F13\u8C31\u4E0A\u7684\u5199\u6CD5\uFF08\u54EA\u4E00\u7EBF / \u7B26\u5934 / \u7B26\u5E72\uFF09\uFF1A\u6574\u5957\u9F13\u6309\u5199\u7684\u97F3\u9AD8\uFF08= GM \u9F13\u952E\uFF09\u67E5\uFF1B\u56FA\u5B9A\u6572\u4E00\u4EF6\u7684\u5C31\u662F\u90A3\u4E00\u4EF6\u3002 */\n    const percAt = (q: (typeof per)[number], p: Pitch): PercInfo | null => { const pk = q.p.perc; return !pk ? null : pk.kind === \"kit\" ? percOf(128, 0, midiOf(p)) : pk.info; };\n    /** \u8C31\u4E0A\u7684\u4F4D\u7F6E\uFF08\u7EA7\u6570\uFF09\uFF1A\u9F13\u8C31 = \u4E00\u7EBF\u8C31\u90A3\u6761\u7EBF\uFF08\u4E00\u7EBF\u8C31\u7684\u9AD8 / \u4F4E\u97F3 \u00B11\uFF09/ \u4E94\u7EBF\u9F13\u8C31\u6309 MuseScore \u7684 line\uFF080 = \u7B2C\u4E94\u7EBF\uFF0C\u5F80\u4E0B +1 \u8D70\u534A\u683C\uFF09\uFF1B\u6709\u97F3\u9AD8 = \u5B9E\u9645\u97F3\u9AD8 + \u8C31\u53F7 / \u516B\u5EA6\u7EBF\u3002 */\n    const posD = (q: (typeof per)[number], p: Pitch, staff: Staff, index: number): number => {\n      const m = pmode[per.indexOf(q)];\n      if (m && q.p.perc) { const pi = percAt(q, p); return m === \"one\" ? MID_LINE - (pi && pi.staff === 1 ? pi.line : 0) : TOP_LINE - (pi ? pi.line : 4); }\n      return diatonicIndex(p) + shAt(q, staff, index);\n    };\n    /** \u7B2C s \u884C\u5F00\u5934\u7684\u8C31\u53F7\uFF08\u8FD9\u4E00\u884C\u7B2C\u4E00\u4E2A\u4E1C\u897F\u90A3\u91CC\u751F\u6548\u7684\uFF09\u3002 */\n    const clefAtSys = (q: (typeof per)[number], s: number): ClefName => {\n      const u = q.units.find((x) => x.system === s && x.index >= 0); if (u) return q.ds.clef[u.index] ?? q.start;\n      let c = q.start; for (const x of q.units) if (x.system < s && x.index >= 0) c = q.ds.clef[x.index] ?? c; return c;\n    };\n    /** \u7B2C s \u884C\u5F00\u5934\u7684\u8C31\u53F7\u662F\u8C01\u7BA1\u7684\uFF1A\u6700\u8FD1\u7684\u4E00\u4E2A\u8C31\u53F7\u8BB0\u53F7\u7684\u4E0B\u6807\uFF08\u22121 = \u58F0\u90E8\u81EA\u5DF1\u7684\u8C31\u53F7 / \u81EA\u52A8\uFF09\u3002 */\n    const clefSrcAtSys = (q: (typeof per)[number], s: number): number => {\n      const u = q.units.find((x) => x.system === s && x.index >= 0), upto = u ? u.index : q.tokens.length - 1;\n      for (let i = upto; i >= 0; i--) if (q.tokens[i]?.kind === \"clef\") return i; return -1;\n    };\n    // 2. \u5408\u6210\u5217\uFF1A\u540C tick \u540C\u79CD\u4E1C\u897F\u5BF9\u9F50\uFF08\u4E00\u6761 track \u91CC\u540C\u4E00 tick \u540C\u4E00\u79CD\u7684\u7B2C n \u4E2A = \u7B2C n \u5217\uFF09\n    const colMap = new Map<string, Col>();\n    for (const q of per) {\n      const seen = new Map<string, number>();\n      for (const u of q.units) {\n        const sl = u.kind === \"nav\" ? u.slot : SLOT[u.kind], base = `${u.tick}:${sl}`, n = seen.get(base) ?? 0; seen.set(base, n + 1);\n        const key = `${base}:${n}`;\n        let c = colMap.get(key);\n        if (!c) { c = { tick: u.tick, slot: sl, n, w: 0, x: 0, system: 0, units: [], bar: false, chunk: false, phrase: false }; colMap.set(key, c); }\n        c.units.push(u); c.w = Math.max(c.w, u.w); if (u.kind === \"bar\") c.bar = true; if (u.kind === \"chunk\") c.chunk = true; if (u.kind === \"phrase\") c.phrase = true;\n      }\n    }\n    const cols = [...colMap.values()].sort((a, b) => a.tick - b.tick || a.slot - b.slot || a.n - b.n);\n    // \u54EA\u4E9B\u5C0F\u8282\u7EBF\u5217\u540E\u9762\u80FD\u6298\u884C\uFF1A\u6CA1\u6709\u54EA\u4E2A\u58F0\u90E8\u7684\u97F3\u8DE8\u8FC7\u8FD9\u4E00\u62CD\n    const spans = per.flatMap((q) => q.units.filter((u): u is Chunk => u.kind === \"chunk\").map((u) => [u.tick, u.tick + u.ticks] as const));\n    const breakableAt = (tick: number) => !spans.some(([a, b]) => a < tick - 1e-6 && b > tick + 1e-6);\n    // 3. \u6298\u884C\uFF08\u50CF\u6587\u5B57\uFF1A\u4F18\u5148\u5728\u5C0F\u8282\u7EBF\u540E\u6298\uFF1B\u4E00\u4E2A\u5C0F\u8282\u90FD\u653E\u4E0D\u4E0B\u5C31\u9010\u5217\u6298\uFF09\u3002\u6BCF\u884C\u5F00\u5934\u7684\u8C03\u53F7 = \u5404\u58F0\u90E8\u90A3\u91CC\u751F\u6548\u7684\u8C03\u53F7\uFF1B\u884C\u9996\u5BBD = \u6700\u5BBD\u7684\u90A3\u4E2A\u58F0\u90E8\n    const FAM_W = openFams.length && o.titlePlaceholder ? 0.8 : 0;   // \u6709\u5C55\u5F00\u7740\u7684\u4E00\u5BB6\uFF1A\u540D\u5B57\u548C\u8C31\u4E4B\u95F4\u591A\u8BA9\u4E00\u70B9\u7ED9\u62EC\u53F7\n    const ind0 = Math.max(...parts.map((p) => Math.max(...nameLines(p.name, p.staves ?? 1).map(nameW)))) + 1.4 + FAM_W;   // \u7B2C\u4E00\u884C\u8BA9\u7ED9\u58F0\u90E8\u540D\u7684\u7F29\u8FDB\uFF08sp\uFF1B\u540D\u5B57\u6298\u884C\u540E\u6700\u5BBD\u7684\u90A3\u4E00\u884C\uFF09\n    // \u7B2C\u4E8C\u884C\u8D77\u6BCF\u884C\u5199\u7B80\u5199\uFF08v0.9.31\uFF1Buser\u300Ctodo \u603B\u8C31\u7684\u6BCF\u4E00\u884C\u90FD\u653E\u4E50\u5668\u540D\u7684\u7701\u7A7A\u95F4\u7B80\u5199\u300D\u2192\u300C\u4E50\u624B\u540D\u548C\u989C\u8272\u540C\u610F\u300D\uFF09\uFF1A\u7F29\u8FDB = \u6700\u5BBD\u7684\u90A3\u4E2A\u7B80\u5199\uFF1B\u6CA1\u7ED9\u7B80\u5199\uFF08\u6D4B\u8BD5 / \u8001\u8C03\u7528\uFF09= 0\uFF0C\u7167\u65E7\n    //   v0.9.41\uFF1A\u5B9A\u5BBD\uFF08user \u7ECF\u4ED3\u9F20\u8F6C\u8FBE\u300C\u6CA1\u7B80\u5199\u7684\u80FD\u4E0D\u80FD\u60F3\u529E\u6CD5\u4E5F\u6309\u5B9A\u5BBD\u88C1\u4E00\u4E0B\uFF0C\u4E0D\u7136\u6709\u4E00\u4E2A\u6CA1\u67E5\u5230\u7B80\u5199\u5C31beat the propose\u4E86\u300D\uFF09\u2014\u2014\u7B80\u5199\u5DF2\u6309 ABBR_W \u88C1\u597D\uFF08part-colors.ts fitAbbr\uFF09\uFF0C\n    //   \u5217\u5BBD = \u4E00\u4E2A ABBR_W \u5BBD\u7684\u53C2\u7167\uFF08Vln.Vc.\uFF09\uFF0C\u4E0D\u968F\u8C01\u6700\u957F\u53D8\uFF1B\u5B57\u5F62\u7279\u522B\u5BBD\u3001\u91CF\u51FA\u6765\u8D85\u4E86\u53C2\u7167\u7684\u90A3\u4E2A\u624D\u6491\u4E00\u70B9\uFF08\u4E0D\u53E0\u5230\u8C31\u4E0A\uFF09\n    const indN = parts.some((p) => p.abbr) ? Math.max(nameW(ABBR_REF), ...parts.map((p) => nameW(p.abbr ?? \"\"))) + 1.4 + FAM_W : 0;\n    const keyNow = new Map<string, number>(per.map((q) => [q.p.id, q.head.key]));\n    const clefW = (q: { fFam: boolean }) => (q.fFam ? W.fClef : W.gClef);\n    const headerOf = (first: boolean) => Math.max(...per.map((q) => {\n      const f = keyNow.get(q.p.id)!;\n      return (first ? ind0 : indN) + MARGIN + 0.6 + clefW(q) + 1.0 + Math.abs(f) * 1.05 + (f ? 0.8 : 0) + (first ? timeWidth(q.head.time.beats, q.head.time.beatType) + 1.2 : 0.4);\n    }));\n    let system = 0, x = headerOf(true);\n    const sysStarts: number[] = [x], sysKeys: Map<string, number>[] = [new Map(keyNow)];\n    const newline = () => { system++; x = headerOf(false); sysStarts.push(x); sysKeys.push(new Map(keyNow)); };\n    const placedCols: Col[] = [];\n    const place = (c: Col) => { c.x = x; c.system = system; x += c.w; placedCols.push(c); for (const u of c.units) { u.x = c.x; u.system = system; if (u.kind === \"key\") keyNow.set(per.find((q) => q.units.includes(u))!.p.id, u.fifths); } };\n    const chunkW = (cs: Col[]) => cs.reduce((a, c) => a + (c.chunk ? c.w : 0), 0);\n    let seg: Col[] = [];\n    // \u6324\u4E00\u6324\uFF08user\u300C\u300C\u7A0D\u5FAE\u8D85\u51FA\u4E00\u70B9\u7684\u5C0F\u8282\u300D\u538B\u8FDB\u5F53\u524D\u884C \u8FD9\u4E2A\u5C31\u662F\u6211\u60F3\u8981\u7684\u300D\uFF09\uFF1A\u4E0B\u4E00\u4E2A\u5C0F\u8282\u53EA\u8D85\u51FA\u8FD9\u4E00\u884C\u97F3\u7B26\u603B\u5BBD\u7684 SQUEEZE \u4EE5\u5185 = \u7559\u5728\u8FD9\u4E00\u884C\u3001\u6574\u884C\u538B\u7D27\u4E00\u70B9\uFF08\u4E0B\u9762\u53F3\u7AEF\u5BF9\u9F50\u90A3\u4E00\u6B65\u538B\uFF09\u3002\n    const brk = o.scroll ? Infinity : right;   // \u6A2A\u5377 = \u4E0D\u6298\u884C\n    const flush = () => {\n      const segW = seg.reduce((s, c) => s + c.w, 0), closed = seg.length > 0 && seg[seg.length - 1].bar;\n      const over = x + segW + (closed ? 0 : BAR_W) - brk;\n      if (over > 0 && x > sysStarts[system] + 0.01) {\n        const lineChunks = chunkW(placedCols.filter((c) => c.system === system)) + chunkW(seg);\n        if (over <= lineChunks * SQUEEZE) { for (const c of seg) place(c); seg = []; return; }\n        newline();\n      }\n      for (const c of seg) { if (x + c.w > brk && x > sysStarts[system] + 0.01) newline(); place(c); }\n      seg = [];\n    };\n    // \u53E5\u4E0D\u6362\u884C\uFF08user 2026-10-08\u300C\u4E0D\u5E94\u8BE5\u6309\u7167\u53E5\u6362\u884C\uFF0C\u6253\u8C31\u8F6F\u4EF6\u6CA1\u8FD9\u4E48\u5E72\u7684\u300D\uFF09\uFF1A\u53EA\u662F\u6362\u6C14\u8BB0\u53F7 + \u300C\u5408\u300D\u7684\u8FB9\u754C\uFF1B\u6298\u884C\u7167\u65E7\u53EA\u5728\u5C0F\u8282\u7EBF\u540E\n    for (const c of cols) { seg.push(c); if (c.bar && breakableAt(c.tick)) flush(); }\n    flush();\n    const nSys = system + 1;\n    // \u53F3\u7AEF\u5BF9\u9F50\uFF1A\u591A\u51FA\u6765\u7684\u5730\u65B9\u6309\u5BBD\u5EA6\u5206\u7ED9\u8FD9\u4E00\u884C\u7684\u97F3 / \u4F11\u6B62\uFF08\u5C0F\u8282\u7EBF\u3001\u8BB0\u53F7\u4E0D\u62C9\u5BBD\uFF09\uFF1B\u6324\u8FDB\u6765\u8D85\u51FA\u7684\u884C\uFF08\u6700\u540E\u4E00\u884C\u4E5F\u7B97\uFF09\u540C\u6837\u6309\u5BBD\u5EA6\u538B\u56DE\u6765\n    for (let s = 0; s < nSys; s++) {\n      const row = cols.filter((c) => c.system === s);\n      const end = row.reduce((m, c) => Math.max(m, c.x + c.w), sysStarts[s]), avail = brk - sysStarts[s], used = end - sysStarts[s];\n      if (used <= avail + 1e-6 && (s === nSys - 1 || used < avail * 0.6)) continue;\n      const gw = chunkW(row);\n      if (!gw) continue;\n      const k = (avail - used) / gw;\n      let xx = sysStarts[s];\n      for (const c of row) { c.x = xx; if (c.chunk) c.w *= 1 + k; xx += c.w; for (const u of c.units) { u.x = c.x; if (u.kind === \"chunk\") u.w = c.w; } }\n    }\n    // \u6A2A\u5377\uFF1A\u8FD9\u5F20\u7EB8\u7684\u53F3\u7AEF = \u5185\u5BB9\u7684\u53F3\u7AEF + \u5C3E\u5DF4\uFF08\u5149\u6807\u505C\u5728\u6700\u540E\u90A3\u513F\u7167\u65E7\u753B\u5230\u53F3\u8FB9\u3001\u80FD\u70B9\u7740\u63A5\u7740\u5199\uFF09\n    if (o.scroll) { right = Math.max(baseRight, ...cols.map((c) => c.x + c.w)) + SCROLL_TAIL; sheetRight = Math.max(sheetRight, right); }\n    // 4. \u884C\u53F7\u4E0E\u5750\u6807\uFF1A\u8FD9\u5F20\u7EB8\u7B2C s \u884C\u7B2C r \u4E2A\u58F0\u90E8\u7684\u7B2C k \u5F20\u8C31\u8868 = \u4E00\u6761\u8C31\u884C\uFF08\u5927\u8C31\u8868\u4E24\u6761\uFF1B\u7D27\u51D1\u7248\u5F0F\u91CC\u8FD9\u5F20\u7EB8\u4E0A\u6CA1\u5199\u6B4C\u8BCD\u7684\u58F0\u90E8\u90A3\u6761\u66F4\u77EE\uFF09\n    const rowBase = rows.length, nR = parts.length;\n    const effStaves = (i: number) => (rowHost[i] >= 0 ? 0 : per[i].staves);   // \u58F0\u90E8 2 \u4E0D\u5360\u8C31\u884C\n    const rowStart = per.map((_, i) => per.slice(0, i).reduce((a, _q, j) => a + effStaves(j), 0)), nRowsSys = per.reduce((a, _q, j) => a + effStaves(j), 0);\n    const rowOf = (s: number, r: number, k = 0) => rowBase + s * nRowsSys + rowStart[rowHost[r] >= 0 ? rowHost[r] : r] + k;\n    // 4\u00BD. \u884C\u8DDD\u6309\u5185\u5BB9\uFF082026-10-08 Opus 5.5\uFF1Buser\u300C\u548C\u6B4C\u8BCD\u4E00\u6837\u80FD\u4E0D\u80FD\u6839\u636E\u6709\u6CA1\u6709\u6765\u81EA\u52A8\u8C03\u6574\u884C\u8DDD\u300D\u300C\u884C\u8DDD\u8BA1\u7B97\u5E94\u8BE5\u8003\u8651\u5230\u6709\u6CA1\u6709\u6B4C\u8BCD\uFF0C\u6700\u9AD8\u6700\u4F4E\u7B26\u53F7\u7684\u4F4D\u7F6E\u4E4B\u7C7B\u7684\u300D\uFF09\uFF1A\n    //   \u6BCF\u4E00\u884C\uFF08\u8FD9\u5F20\u7EB8\u7B2C s \u884C \u00D7 \u58F0\u90E8 \u00D7 \u8C31\u8868\uFF09\u4F30\u6700\u9AD8 / \u6700\u4F4E\uFF08\u7B26\u5934\u3001\u7B26\u5E72\u7684\u5927\u6982\u3001\u52A0\u7EBF\u3001\u6F14\u594F\u6CD5\uFF09\uFF1B\u8C31\u4E0A\u4E0B\u7684\u7A7A\u4ECE\u7248\u5F0F\u7684\u6700\u5C0F\u503C\u8D77\uFF0C\u5185\u5BB9\u8981\u66F4\u591A\u624D\u52A0\u3002\n    //   \u529B\u5EA6\u90A3\u4E00\u884C\u4E00\u5F8B\u5199\u5728\u8C31\u4E0A\u9762\uFF08\u5927\u8C31\u8868 = \u4E0A\u9762\u90A3\u6761\u8C31\u7684\u4E0A\u9762\uFF09\uFF1Auser 2026-10-09\u300C\u6709\u6CA1\u6709\u6B4C\u8BCD\u7684\u65F6\u5019\u5F3A\u5EA6\u7B26\u53F7\u90FD\u7EDF\u4E00\u653E\u8C31\u5B50\u4E0A\u9762\u300D\n    //   \uFF08v0.7.8 \u8D77\u662F\u6709\u6B4C\u8BCD\u4E0A\u9762\u3001\u5927\u8C31\u8868\u4E2D\u95F4\u3001\u5176\u4F59\u4E0B\u9762\u2014\u2014\u6309 user \u90A3\u65F6\u95EE\u7684\u300C\u611F\u89C9\u4E00\u822C\u5F3A\u5F31\u662F\u5199\u4E0B\u9762\u800C\u4E0D\u662F\u4E0A\u9762\u7684\u5427\uFF1F\u7136\u540E\u540C\u65F6\u6709\u4E24\u4E2A\u8C31\u53F7\u5C31\u662F\u5199\u4E2D\u95F4\uFF1F\u300D\u505A\u7684\uFF0C\u8FD9\u6B21\u7EDF\u4E00\u4E86\uFF09\uFF1B\n    //   \u8FD9\u4E00\u884C\u8FD9\u4E2A\u58F0\u90E8\u771F\u6709\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31 / sfz fp \u624D\u7559\u5730\u65B9\u3002\n    const lyricsOf = per.map((q) => q.tokens.some((t) => t.kind === \"note\" && t.lyric));\n    // \u6B4C\u8BCD\u6309\u8282\u594F\u6392\uFF08v0.9.40\uFF1Buser\u300C\u5148\u8BD5\u4E0B\u4F60\u8BF4\u7684\u4E24\u4E2A\u6B4C\u8BCD\u5F00\u5173\u5427\uFF0Capproved\u300D\uFF09\uFF1A\u97F3\u7684\u4F4D\u7F6E\u53EA\u770B\u65F6\u503C\uFF0C\u6B4C\u8BCD\u8BA9\u8DEF\uFF08fitLyrics\uFF09\u3002\u5728\u7B97\u884C\u9AD8\u4E4B\u524D\u6392\u597D\uFF1A\u9519\u5F00\u5230\u7B2C\u4E8C\u884C\u7684\u90A3\u4E00\u884C\u8981\u591A\u7559\u4E00\u884C\u5B57\n    const lyrPlan = new Map<string, LyricFit>(), lyr2 = new Set<string>();   // \u952E = \u58F0\u90E8\u5E8F\u53F7:\u4E0B\u6807 / \u58F0\u90E8\u5E8F\u53F7:\u884C\n    if (song.lyricFit !== \"lyrics\") per.forEach((q, r) => {\n      if (!lyricsOf[r]) return;\n      const bySys = new Map<number, { index: number; cx: number; w: number; hy?: boolean }[]>();\n      for (const u of q.units) if (u.kind === \"chunk\" && u.lyric && u.lyric !== MELISMA_MARK) {\n        const arr = bySys.get(u.system) ?? []; bySys.set(u.system, arr);\n        arr.push({ index: u.index, cx: u.x + u.accW + 0.6, w: o.measureLyric(lyricShow(u.lyric)) / sp, hy: u.hyph });\n      }\n      for (const [sy, items] of bySys) {\n        items.sort((a, b) => a.cx - b.cx);\n        fitLyrics(items).forEach((f, k) => { lyrPlan.set(`${r}:${items[k].index}`, f); if (f.row) lyr2.add(`${r}:${sy}`); });\n      }\n    });\n    const extentOf = (q: (typeof per)[number], s: number, k: number) => {\n      let top = TOP_LINE, bot = BOTTOM_LINE;\n      for (const u of q.units) {\n        if (u.kind !== \"chunk\" || u.system !== s || !u.note || (u.staff ?? 1) !== k + 1) continue;\n        const ds = (u.pitches.length ? u.pitches : u.pitch ? [u.pitch] : []).map((pp) => posD(q, pp, (k + 1) as Staff, u.index)); if (!ds.length) continue;\n        const hi = Math.max(...ds), lo = Math.min(...ds), stem = u.base < WHOLE, up = (hi + lo) / 2 < MID_LINE;\n        top = Math.max(top, hi + (stem && up ? 7 : 1)); bot = Math.min(bot, lo - (stem && !up ? 7 : 1));\n        if (u.art.some((a) => a === \"staccato\" || a === \"tenuto\")) { if (up) bot = Math.min(bot, lo - 3); else top = Math.max(top, hi + 3); }   // \u8DF3\u97F3 / \u4FDD\u6301\u5728\u7B26\u5E72\u53E6\u4E00\u4FA7\n        if (u.art.some(isStrength)) top = Math.max(top, (stem && up ? hi + 7 : hi + 3) + 4, TOP_LINE + 5);   // \u5F3A\u5EA6\u90A3\u4E00\u7EC4\u4E00\u5F8B\u5728\u4E0A\u9762\uFF08\u8D8A\u8FC7\u671D\u4E0A\u7684\u7B26\u5E72\uFF09\n      }\n      return { top, bot };\n    };\n    // \u529B\u5EA6\u4E24\u9053\uFF082026-10-09\uFF0Cuser\u300C\u97F3\u5185\u6E10\u5F3A\u548Cmf\u53E0\u4E00\u5757\uFF0C\u6709\u7A7A\u60F3\u4E00\u4E0B\u97F3\u7684\u5F3A\u5F31\u4FEE\u9970\u548C\u5927\u7684\u5F3A\u5F31\u7EBF\u600E\u4E48\u5904\u7406\u300D\u2192 AI \u63D0 A \u4E00\u6761\u7EBF\u6A2A\u7740\u6392 / B \u4E24\u9053\uFF0Cuser\u300C\u4E24\u9053 \u53EF\u4EE5\u300D\uFF09\uFF1A\n    //   \u91CC\u9053 = \u97F3\u7684\u4FEE\u9970\uFF08sfz / fp / \u97F3\u5185\u8D77\u4F0F\uFF1A\u53EA\u5C5E\u4E8E\u8FD9\u4E00\u4E2A\u97F3\uFF0C\u5728\u8FD9\u4E2A\u97F3\u7684\u5BBD\u5EA6\u91CC\uFF09\uFF0C\u9760\u8C31\uFF1B\u5916\u9053 = \u5927\u7684\u5F3A\u5F31\u7EBF\uFF08pp\u2026ff\u3001\u6E10\u5F3A\u6E10\u5F31\u3001\u6E10\u5230\uFF1A\u72B6\u6001\uFF0C\u7BA1\u5230\u4E0B\u4E00\u4E2A\uFF09\uFF0C\u5728\u91CC\u9053\u4E0A\u9762\u3002\n    //   \u4E24\u5C42\u4E0D\u5728\u540C\u4E00\u9053\u91CC\u62A2\u5730\u65B9\uFF1B\u8FD9\u4E00\u884C\u771F\u6709\u97F3\u7684\u4FEE\u9970\u624D\u591A\u5360\u4E00\u9053\u3002\n    const bigDynIn = (q: (typeof per)[number], s: number) => q.units.some((u) => u.system === s && (u.kind === \"dyn\" || u.kind === \"hairpin\"));\n    const noteDynIn = (q: (typeof per)[number], s: number) => q.units.some((u) => u.system === s && u.kind === \"chunk\" && u.note && (u.art.includes(\"sfz\") || u.art.includes(\"fp\") || !!swellOf(q.tokens[u.index])));\n    /** \u7B2C s \u884C\uFF1A\u6BCF\u4E2A\u58F0\u90E8\u6BCF\u5F20\u8C31\u8868\u7684\u300C\u4E0A\u9762\u7559\u591A\u5C11 / \u4E0B\u9762\u7559\u591A\u5C11 / \u6B4C\u8BCD\u57FA\u7EBF\u300D\uFF08sp\uFF09+ \u529B\u5EA6\u5B57\u57FA\u7EBF\u7684\u4F4D\u7F6E\uFF08\u8C31\u4E0A\u7684\u7EA7\u6570\uFF1B\u4E2D\u95F4\u90A3\u79CD\u653E\u597D\u4E86\u518D\u7B97\uFF09\u3002 */\n    const ottIn = (q: (typeof per)[number], s: number, up: boolean) => q.staves === 1 && q.units.some((u) => u.system === s && u.kind === \"chunk\" && (up ? (q.ds.ott[u.index] ?? 0) > 0 : (q.ds.ott[u.index] ?? 0) < 0));\n    const geoOf = (s: number) => per.map((q, r) => {\n      const ex = Array.from({ length: q.staves }, (_, k) => extentOf(q, s, k)), big = bigDynIn(q, s), own = noteDynIn(q, s), dyn = big || own;\n      per.forEach((t, j) => { if (rowHost[j] !== r) return; for (let k = 0; k < ex.length; k++) { const e = extentOf(t, s, k); ex[k] = { top: Math.max(ex[k].top, e.top), bot: Math.min(ex[k].bot, e.bot) }; } });   // \u58F0\u90E8 2 \u7684\u97F3\u4E5F\u5728\u8FD9\u4E00\u884C\n      const ottUp = ottIn(q, s, true), ottDown = ottIn(q, s, false);   // \u516B\u5EA6\u7EBF\uFF08v0.9.28\uFF09\uFF1A8va / 15ma \u5728\u8C31\u4E0A\u9762\u4E00\u9053\uFF0C8vb \u5728\u8C31\u4E0B\u9762\uFF08\u6B4C\u8BCD\u5F80\u4E0B\u8BA9\uFF09\n      const g = ex.map((e, k) => {\n        const minBelow = q.staves === 2 && k === 0 ? SPC.graveUpper - STAFF_ABOVE - 4 : (lyricsOf[r] ? SPC.rowH : SPC.rowHNoLyric) - STAFF_ABOVE - 4;\n        let above = Math.max(STAFF_ABOVE, (e.top - TOP_LINE) / 2 + 0.8), below = Math.max(minBelow, (BOTTOM_LINE - e.bot) / 2 + 0.8), lyric: number | null = null;\n        if (ottDown) below = Math.max(below, (BOTTOM_LINE - e.bot) / 2 + 3.0);\n        if (lyricsOf[r] && k === q.staves - 1) { lyric = Math.max(LYRIC_BELOW, (BOTTOM_LINE - e.bot) / 2 + 2.0 + (ottDown ? 2.4 : 0)) + (o.lyricRaise ?? 0); below = Math.max(below, lyric + (SPC.rowH - STAFF_ABOVE - 4 - LYRIC_BELOW)) + (lyr2.has(`${r}:${s}`) ? LYRIC_ROW2 : 0); }\n        return { above, below, lyric, dynD: null as number | null, noteDynD: null as number | null, navD: null as number | null, tempoD: null as number | null, grooveD: null as number | null, ottD: null as number | null, ottDownD: null as number | null };\n      });\n      const lane0 = Math.max(TOP_LINE + 2.4, ex[0].top + 3);   // \u6700\u9760\u8C31\u7684\u90A3\u4E00\u9053\uFF08f \u8FD9\u79CD\u5B57\u6709\u4E0B\u4F38\uFF1A\u79BB\u97F3\u8FDC\u4E00\u70B9\uFF09\n      if (own) g[0].noteDynD = lane0;\n      if (big) g[0].dynD = own ? lane0 + DYN_LANE : lane0;\n      if (ottUp) g[0].ottD = Math.max(TOP_LINE + 4.4, ex[0].top + 3, (g[0].dynD ?? g[0].noteDynD ?? -99) + 4.4);   // 8va / 15ma\uFF1A\u529B\u5EA6\u5916\u9053\u4E0A\u9762\n      if (ottDown) g[0].ottDownD = Math.min(BOTTOM_LINE - 3.2, ex[0].bot - 3.2);\n      // \u8C31\u5185\u53CD\u590D\u90A3\u4E00\u9053\uFF08\u623F\u5B50 / Segno / Coda / D.C.\u2026 / \u00D73\uFF09\uFF1A\u529B\u5EA6\u5916\u9053\u4E0A\u9762\uFF1B\u8FD9\u4E00\u884C\u771F\u6709\u624D\u7559\u5730\u65B9\n      if (q.units.some((u) => u.system === s && (u.kind === \"nav\" || (u.kind === \"bar\" && !!u.times && u.times > 2)))) g[0].navD = Math.max(TOP_LINE + 5.4, ex[0].top + 4, (g[0].ottD ?? g[0].dynD ?? g[0].noteDynD ?? -99) + 5.2);\n      const topDyn = g[0].navD ?? g[0].ottD ?? g[0].dynD ?? g[0].noteDynD;   // \u6700\u4E0A\u9762\u90A3\u4E00\u9053\uFF08\u901F\u5EA6 / \u98CE\u683C\u8BB0\u53F7\u5728\u5B83\u4E0A\u9762\uFF09\n      if (topDyn !== null) g[0].above = Math.max(g[0].above, (topDyn - TOP_LINE) / 2 + 2.2);\n      if (q.p.id === owner) {   // \u901F\u5EA6\u8BB0\u53F7\uFF08\u8FD9\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4F4D\u5728\u573A\u7684\u6B4C\u624B\u4E0A\u9762\uFF09\uFF1A\u5728\u6700\u9AD8\u7684\u97F3\u548C\u5199\u5728\u4E0A\u9762\u7684\u529B\u5EA6\u5B57\u4E4B\u4E0A\n        const t = Math.max(TOP_LINE + 4.8, ex[0].top + 3, topDyn !== null ? topDyn + 4.6 : 0); g[0].tempoD = t; g[0].above = Math.max(g[0].above, (t - TOP_LINE) / 2 + 1.6);\n      }\n      const nGroove = q.units.filter((u) => u.system === s && u.kind === \"groove\").length;\n      if (nGroove) {   // \u98CE\u683C\u8BB0\u53F7\uFF1A\u901F\u5EA6\u8BB0\u53F7\u90A3\u4E00\u884C\u518D\u4E0A\u9762\u4E00\u884C\uFF1B\u6CA1\u6709\u901F\u5EA6\u8BB0\u53F7 = \u548C\u901F\u5EA6\u8BB0\u53F7\u4E00\u6837\u7684\u9AD8\u5EA6\uFF1B\u4E00\u884C\u8C31\u91CC\u4E24\u4E2A\u4EE5\u4E0A = \u591A\u7559\u4E00\u884C\uFF08\u6324\u4E86\u9519\u5F00\uFF0C\u89C1\u4E0B\u9762\u753B\u7684\u5730\u65B9\uFF09\n        const t = g[0].tempoD !== null ? g[0].tempoD + 4.6 : Math.max(TOP_LINE + 4.8, ex[0].top + 3, topDyn !== null ? topDyn + 4.6 : 0); g[0].grooveD = t; g[0].above = Math.max(g[0].above, (t + (nGroove > 1 ? GROOVE_LANE : 0) - TOP_LINE) / 2 + 1.6);\n      }\n      return { g, ex, dyn };\n    });\n    const sysHOf = (G: ReturnType<typeof geoOf>) => P(G.reduce((n, x, r) => n + (rowHost[r] >= 0 ? 0 : x.g.reduce((m, y) => m + y.above + 4 + y.below, 0)), 0) + SYS_GAP);\n    const geos = Array.from({ length: nSys }, (_, s) => geoOf(s));\n    drawPaperTitle(geos.length ? sysHOf(geos[0]) : P(SPC.rowH));\n    if (paper.hidden) { ensure(P(STUB_H)); prims.push({ t: \"text\", x: P(MARGIN), y: yCur + P(STUB_H * 0.7), s: \"\u8FD9\u5F20\u7EB8\u9690\u85CF\u7740\uFF1A\u4E0D\u653E\u3001\u4E0D\u8FDB\u538B\u5E73\u4EF6\uFF08\u300C\u22EF\u300D\u91CC\u663E\u793A\uFF09\", cls: \"part-stub hidden-note\", size: P(1.1), anchor: \"start\" }); yCur += P(STUB_H); }\n    for (let s = 0; s < nSys; s++) {\n      const G = geos[s];\n      ensure(sysHOf(G));   // \u5206\u9875\uFF1A\u4E00\u884C\u8C31\u6574\u5757\u653E\u4E0D\u4E0B\u5C31\u7FFB\u9875\n      for (let r = 0; r < nR; r++) for (let k = 0; k < effStaves(r); k++) {\n        const top = yCur, row = rowOf(s, r, k), g = G[r].g[k], h = g.above + 4 + g.below;\n        rowTop.set(row, top); rowAbove.set(row, g.above); if (g.lyric !== null) lyricOff.set(row, g.lyric);\n        const e = G[r].ex[k], lane = k === 0 ? (g.navD ?? g.ottD ?? g.dynD ?? g.noteDynD) : null;\n        const inkAbove = Math.max(0, (e.top - TOP_LINE) / 2, lane !== null ? (lane - TOP_LINE) / 2 + 1.3 : 0);   // \u529B\u5EA6\u5B57\u7684\u57FA\u7EBF\u5728\u90A3\u4E00\u9053\uFF1A\u5B57\u5F80\u4E0A\u518D\u9AD8\u4E00\u70B9\n        const inkBelow = Math.max(0, (BOTTOM_LINE - e.bot) / 2, g.lyric !== null ? g.lyric + 0.5 + (lyr2.has(`${r}:${s}`) ? LYRIC_ROW2 : 0) : 0, g.ottDownD !== null ? (BOTTOM_LINE - g.ottDownD) / 2 + 0.6 : 0);\n        rows.push({ top, staffTop: top + P(g.above), bottom: top + P(h), paper: paper.id, part: parts[r].id, sys: s, staff: (k + 1) as Staff, inkTop: top + P(g.above - inkAbove), inkBottom: top + P(g.above + 4 + inkBelow) }); yCur += P(h);\n        if (per[r].vrt) sharedRows.push(row);   // \u53E0\u8D77\u6765\u7684\u90A3\u4E00\u884C\u53EA\u8BFB\n      }\n      for (let r = 0; r < nR; r++) {   // \u529B\u5EA6\u5B57\u7684\u57FA\u7EBF\uFF08px\uFF09\uFF1A\u6309\u7B97\u597D\u7684\u7EA7\u6570\uFF08\u8C31\u4E0A\u9762\uFF09\n        if (rowHost[r] >= 0) continue;\n        const x = G[r], r0 = rowOf(s, r, 0);\n        if (x.g[0].tempoD !== null) tempoYAt.set(r0, yOf(r0, x.g[0].tempoD));\n        if (x.g[0].grooveD !== null) grooveYAt.set(r0, yOf(r0, x.g[0].grooveD));\n        dynYAt.set(r0, yOf(r0, x.g[0].dynD ?? TOP_LINE + 2.4));\n        noteDynYAt.set(r0, yOf(r0, x.g[0].noteDynD ?? TOP_LINE + 2.4));\n        if (x.g[0].navD !== null) navYAt.set(r0, yOf(r0, x.g[0].navD));\n        if (x.g[0].ottD !== null) ottYAt.set(r0, yOf(r0, x.g[0].ottD));\n        if (x.g[0].ottDownD !== null) ottDownYAt.set(r0, yOf(r0, x.g[0].ottDownD));\n      }\n      yCur += P(SYS_GAP);\n    }\n    // \u6BCF\u884C\u4E94\u7EBF\u753B\u5230\u54EA\uFF1A\u8FD9\u4E00\u884C\u6700\u540E\u4E00\u5217\u662F\u5C0F\u8282\u7EBF = \u5230\u90A3\u6839\u5C0F\u8282\u7EBF\u4E3A\u6B62\uFF08\u4E0D\u51FA\u5934\uFF1Buser 2026-10-08\u300C\u6BCF\u884C\u4E94\u7EBF\u8C31\u6700\u597D\u8FC7\u4E86\u6700\u540E\u4E00\u4E2A\u5C0F\u8282\u7EBF\u80FD\u4E0D\u80FD\u4E0D\u51FA\u5934\u300D\uFF09\uFF1B\n    //   \u540E\u9762\u8FD8\u6709\u97F3 / \u5199\u5B57\u5934\uFF08\u5149\u6807\u505C\u5728\u6700\u540E\u4E00\u6839\u5C0F\u8282\u7EBF\u540E\u9762\uFF09= \u7167\u65E7\u753B\u5230\u53F3\u8FB9\uFF08\u5199\u7684\u5730\u65B9\uFF09\u3002\u5C0F\u8282\u7EBF\u753B\u5728\u5217\u7684 x + 0.7\uFF08\u89C1\u4E0B\u9762\u7B2C 6 \u6B65\uFF09\n    const staffEnd = Array.from({ length: nSys }, (_, s) => {\n      const row = placedCols.filter((c) => c.system === s); if (!row.length) return right;\n      const last = row.reduce((a, c) => (c.x > a.x || (c.x === a.x && (c.slot > a.slot || (c.slot === a.slot && c.n > a.n))) ? c : a));\n      return last.bar ? Math.min(right, last.x + 0.7) : right;\n    });\n    // 5. \u6BCF\u6761\u8C31\uFF1A\u4E94\u7EBF\u3001\u8C31\u53F7\u3001\u8C03\u53F7\u3001\u62CD\u53F7\uFF08\u7B2C\u4E00\u884C\uFF09\u3001\u901F\u5EA6\uFF08\u7B2C\u4E00\u4E2A\u58F0\u90E8\uFF09\u3001\u6B4C\u624B\u724C\uFF08\u7B2C\u4E00\u884C\uFF09\uFF1B\u51E0\u6761\u8C31\u5DE6\u8FB9\u4E00\u6839\u7AD6\u7EBF\u8FDE\u7740\n    for (let s = 0; s < nSys; s++) {\n      const ind = s === 0 ? ind0 : indN;\n      // \u5C0F\u8282\u53F7\uFF08v0.9.42\uFF1Buser 2026-10-10\u300C\u5C0F\u8282\u53F7\u8981\uFF0C\u53EF\u4EE5\u9875\u9762\u8BBE\u7F6Etoggle\uFF0C\u9ED8\u8BA4\u662F\u6BCF\u884C\u5F00\u5934\u6709\u3002\u5B57\u5C0F\u4E00\u70B9\u300D\uFF09\uFF1A\u6BCF\u884C\u6700\u4E0A\u9762\u90A3\u6761\u8C31\u7684\u5DE6\u4E0A\u89D2\uFF0C\u5370\u8FD9\u4E00\u884C\u7B2C\u4E00\u4E2A\u5C0F\u8282\u7684\u53F7\uFF1B\n      //   \u6BCF\u5F20\u7EB8\u4ECE 1 \u6570\uFF08\u7EB8 = \u66F2\u6BB5\uFF09\uFF0C\u5F31\u8D77\u7B97\u7B2C 0 \u5C0F\u8282\uFF1B\u7B2C\u4E00\u884C\u662F 1 / 0 \u5C31\u4E0D\u5370\uFF08\u51FA\u7248\u8C31\u7684\u8001\u89C4\u77E9\uFF09\n      if (song.barNumbers !== \"off\" && per[0]) {   // \u53D6\u8FD9\u4E00\u884C\u7B2C\u4E00\u4F4D\u6709\u4E1C\u897F\u7684\u6B4C\u624B\uFF08\u8865\u9F50\u4E4B\u540E\u4EBA\u4EBA\u90FD\u6709\uFF1Bv0.10.6\uFF09\n        const q0 = per.find((q) => q.units.some((u) => u.kind === \"chunk\" && u.system === s)) ?? per[0];\n        const c0 = q0.units.find((u): u is Chunk => u.kind === \"chunk\" && u.system === s);\n        const num = c0 ? (c0.m ?? 0) + (q0.pickup ? 0 : 1) : null;\n        if (num !== null && !(s === 0 && num <= 1)) prims.push({ t: \"text\", x: P(MARGIN + ind), y: yOf(rowOf(s, 0, 0), TOP_LINE + 3.2), s: String(num), cls: \"bar-no\", size: P(1.05), anchor: \"start\" });\n      }\n      per.forEach((q, r) => {\n        if (rowHost[r] >= 0) return;   // \u58F0\u90E8 2\uFF1A\u8C31\u8868 / \u8C31\u53F7 / \u540D\u5B57\u90FD\u662F\u58F0\u90E8 1 \u90A3\u4E00\u884C\u7684\n        const ten = absorbed.get(q.p.id) ?? [];   // \u53E0\u5728\u8FD9\u4E00\u884C\u4E0A\u7684\u623F\u5BA2\uFF08\u540D\u5B57\u5199\u5728\u4E3B\u4EBA\u4E0B\u9762\uFF09\n        const pr = lowOf.has(q.p.id) ? per.findIndex((x) => x.p.id === lowOf.get(q.p.id)) : r, rEnd = (sy: number) => rowOf(sy, pr, per[pr].staves - 1);   // \u53CC\u624B\u8C31\uFF1A\u540D\u5B57 / \u8272\u6761 / \u82B1\u62EC\u53F7\u8DE8\u5230\u4E0B\u9762\u90A3\u5F20\n        const f = sysKeys[s].get(q.p.id) ?? q.head.key;\n        for (let k = 0; k < q.staves; k++) {\n          const row = rowOf(s, r, k), clef: ClefName = q.staves === 2 ? (k ? \"F\" : \"G\") : clefAtSys(q, s), base = baseClef(clef);\n          if (rows[row]) rows[row].x1 = P(staffEnd[s]);\n          const pm = pmode[r];   // \u9F13\u8C31\uFF1A\u4E00\u7EBF\u8C31 = \u4E2D\u95F4\u90A3\u4E00\u6761\uFF1B\u6253\u51FB\u4E50\u8C31\u53F7\uFF1B\u6CA1\u6709\u8C03\u53F7\u3001\u4E0D\u80FD\u70B9\u8C31\u53F7\u6362\n          for (let L = 0; L < 5; L++) { if (pm === \"one\" && L !== 2) continue; const y = yOf(row, BOTTOM_LINE + 2 * L); prims.push({ t: \"line\", x1: P(MARGIN + ind), y1: y, x2: P(staffEnd[s]), y2: y, w: P(ENGRAVE.staffLine), cls: \"staff\" }); }\n          let hx = MARGIN + ind + 0.6;\n          if (pm) prims.push({ t: \"glyph\", x: P(hx), y: yOf(row, MID_LINE), ch: PERC_CLEF, cls: \"clef perc-clef\" });\n          else prims.push({ t: \"glyph\", x: P(hx), y: yOf(row, base === \"F\" ? 36 : 32), ch: CLEF_GLYPH[clef], cls: \"clef\" });   // \u9AD8\u97F3\u8C31\u53F7\u6302 G \u7EBF\uFF08\u7B2C 2 \u7EBF\uFF09\u3001\u4F4E\u97F3\u8C31\u53F7\u6302 F \u7EBF\uFF08\u7B2C 4 \u7EBF\uFF09\uFF1B\u516B\u5EA6\u8C31\u53F7\u7684\u5C0F 8 / 15 \u5728\u5B57\u5F62\u91CC\n          if (q.staves === 1 && !pm && !q.vrt) clefs.push({ kind: \"start\", paper: paper.id, part: q.p.id, index: clefSrcAtSys(q, s), system: row, x: P(hx - 0.3), ...staffHit(row), w: P(clefW(q) + 0.6) });   // \u70B9\u8C31\u53F7 = \u6362\u8C31\u53F7\uFF08v0.9.28\uFF09\n          hx += clefW(q) + 1.0;\n          const keyX0 = hx;\n          const fk = pm ? 0 : f;\n          drawKeySig(row, hx, fk, \"keysig\", base); hx += Math.abs(fk) * 1.05;\n          if (s === 0) {\n            // \u8C31\u5934\u8BB0\u53F7\u7684\u70B9\u51FB\u533A\u57DF\uFF1A\u8C31\u53F7 + \u8C03\u53F7\u4E00\u5757\uFF08\u6539\u8C03\u53F7\uFF09\u3001\u62CD\u53F7\uFF08\u6539\u62CD\u53F7\uFF09\u3001\u4E0A\u65B9\u901F\u5EA6\uFF08\u6539\u901F\u5EA6\uFF09\n            if (q.head.idx.key !== undefined) marks.push({ index: q.head.idx.key, kind: \"key\", system: row, x: P(keyX0 - 0.3), ...staffHit(row), w: P(Math.max(1.2, hx - keyX0 + 0.3)) });   // \u8C03\u53F7\uFF08\u8C31\u53F7\u90A3\u4E00\u5757\u5F52\u8C31\u53F7\uFF0Cv0.9.28\uFF09\n            if (fk) hx += 0.8;\n            const cw = drawTime(row, hx, q.head.time.beats, q.head.time.beatType, \"timesig\");\n            if (q.head.idx.time !== undefined) marks.push({ index: q.head.idx.time, kind: \"time\", system: row, x: P(hx - 0.3), ...staffHit(row), w: P(cw + 0.6) });\n            if (k === 0 && q.p.id === owner && q.head.idx.tempo !== undefined) drawTempo(row, MARGIN + ind + 0.6, q.head.bpm, \"tempo\", q.head.idx.tempo, prevBpm === null || prevBpm === q.head.bpm ? undefined : q.head.bpm > prevBpm ? \"up\" : \"down\");\n          }\n        }\n        if (loIds.has(q.p.id)) return;   // \u53CC\u624B\u8C31\u4E0B\u9762\u90A3\u5F20\uFF1A\u53EA\u6709\u8C31\u8868\u672C\u8EAB\uFF08\u540D\u5B57 / \u8272\u6761 / \u82B1\u62EC\u53F7\u5F52\u4E0A\u9762\u90A3\u5F20\uFF09\n        if (s === 0) {\n          // \u6B4C\u624B\u724C\uFF1A\u58F0\u90E8\u540D\u5728\u7B2C\u4E00\u884C\u8C31\u53F7\u5DE6\u8FB9\u3001\u7AD6\u7740\u5C45\u4E2D\uFF08\u5927\u8C31\u8868 = \u4E24\u6761\u8C31\u8868\u4E4B\u95F4\uFF09\uFF08user\u300C\u6B4C\u624B\u724C\u540C\u610F\uFF0C\u548C\u6253\u8C31\u8F6F\u4EF6\u5BF9\u9F50\u300D\u300C\u4E50\u5668\u540D\u53EF\u4EE5\u9009\u62E9\u4E00\u5927\u5806\u4E50\u5668\uFF0C\u7136\u540E\u4E0B\u9762\u53EF\u4EE5in place\u6539\u300D\uFF09\n          const r0 = rowOf(s, r, 0), r1 = rEnd(s), lines = nameLines(q.p.name, pr !== r ? 2 : q.staves), LH = PART_EM * 1.15;\n          // \u5408\u79DF\uFF1A\u4E3B\u4EBA\u7684\u540D\u5B57\u4E0B\u9762\u63A5\u7740\u5199\u623F\u5BA2\u7684\u540D\u5B57\uFF08user\u300C\u8C31\u53F7\u5DE6\u8FB9\u653E\u6B4C\u624B\u540D\u7684\u65F6\u5019\u5728folded\u7684\u6A21\u5F0F\u4E0B\u4F1A\u540C\u65F6\u663E\u793A\u6240\u6709\u6B4C\u624B\u7684\u540D\u5B57\u300D\uFF09\uFF1B\u6BCF\u4E2A\u540D\u5B57\u5404\u81EA\u80FD\u70B9\uFF08\u70B9\u623F\u5BA2 = \u53BB\u5199\u5B83\uFF0C\u5B83\u5C31\u62C6\u5F00\uFF09\n          const tl = ten.map((t) => nameLines(t.name, 1)[0] ?? \"\"), nAll = lines.length + tl.length;\n          const ny = (yOf(r0, MID_LINE) + yOf(r1, MID_LINE)) / 2 + P(0.55 * PART_EM) - P((LH * (nAll - 1)) / 2);   // \u51E0\u884C\u4E00\u8D77\u7AD6\u7740\u5C45\u4E2D\n          const ncls = q.p.empty ? \"part-name empty\" : q.focused ? \"part-name focus\" : \"part-name\";\n          lines.forEach((ln, k) => prims.push({ t: \"text\", x: P(MARGIN), y: ny + P(LH * k), s: ln, cls: ncls, size: PART_EM * sp, anchor: \"start\" }));\n          tl.forEach((ln, k) => prims.push({ t: \"text\", x: P(MARGIN), y: ny + P(LH * (lines.length + k)), s: ln, cls: \"part-name tenant\", size: PART_EM * sp, anchor: \"start\" }));\n          if (ten.length) {\n            const lineTop = (i: number) => ny + P(LH * i) - P(PART_EM * 0.95);\n            ten.forEach((t, k) => partsHit.push({ paper: paper.id, part: t.id, x: P(MARGIN - 0.4), y: lineTop(lines.length + k), w: P(ind0 + 0.2), h: P(LH) }));\n          }\n          if (q.p.badges?.length) prims.push({ t: \"text\", x: P(MARGIN), y: ny + P(LH * (nAll - 1)) + P(1.5), s: q.p.badges.join(\" \"), cls: \"part-badge\", size: P(1.0), anchor: \"start\" });   // \u51FA\u58F0 / \u663E\u793A\u72B6\u6001\u7684\u89D2\u6807\uFF08user\u300Chide, mute solo\u8FD9\u4E9B\u89C6\u56FE\u5C42\u7684\u4E1C\u897F\u5E94\u8BE5\u662F\u5728\u8C31\u5B50\u4E0A\u80FD\u770B\u5230\u300D\uFF09\n          { const y0 = yOf(r0, TOP_LINE) - P(1.2), yEnd = ten.length ? ny + P(LH * lines.length) - P(PART_EM * 0.95) : yOf(r1, BOTTOM_LINE) + P(1.2);   // \u6709\u623F\u5BA2 = \u4E3B\u4EBA\u7684\u70B9\u51FB\u533A\u53EA\u5230\u5B83\u81EA\u5DF1\u7684\u540D\u5B57\n            partsHit.push({ paper: paper.id, part: q.p.id, x: P(MARGIN - 0.4), y: y0, w: P(ind0 + 0.2), h: yEnd - y0 }); }\n          if (q.p.colorIdx !== undefined) prims.push({ t: \"rect\", x: P(MARGIN - 0.95), y: ny - P(PART_EM * 0.62), w: P(0.6), h: P(0.6), cls: `cat-dot cat-${q.p.colorIdx}` });   // \u540D\u5B57\u524D\u4E00\u4E2A\u5C0F\u8272\u70B9\uFF08\u4E0D\u5370\uFF09\n        } else if (q.p.abbr) {   // \u7B2C\u4E8C\u884C\u8D77\uFF1A\u7B80\u5199\uFF08\u4E00\u884C\uFF0C\u7AD6\u7740\u5C45\u4E2D\uFF09\uFF0C\u70B9\u5B83\u540C\u6837\u5F00\u6B4C\u624B\u724C\n          const r0 = rowOf(s, r, 0), r1 = rEnd(s), LH = PART_EM * 1.15, ta = ten.map((t) => t.abbr ?? \"\");\n          const ny = (yOf(r0, MID_LINE) + yOf(r1, MID_LINE)) / 2 + P(0.55 * PART_EM) - P((LH * ta.length) / 2);\n          prims.push({ t: \"text\", x: P(MARGIN), y: ny, s: q.p.abbr, cls: q.p.empty ? \"part-name abbr empty\" : q.focused ? \"part-name abbr focus\" : \"part-name abbr\", size: PART_EM * sp, anchor: \"start\" });\n          ta.forEach((a, k) => { prims.push({ t: \"text\", x: P(MARGIN), y: ny + P(LH * (k + 1)), s: a, cls: \"part-name abbr tenant\", size: PART_EM * sp, anchor: \"start\" }); partsHit.push({ paper: paper.id, part: ten[k].id, x: P(MARGIN - 0.4), y: ny + P(LH * (k + 1)) - P(PART_EM * 0.95), w: P(indN + 0.2), h: P(LH) }); });   // \u5408\u79DF\uFF1A\u623F\u5BA2\u7684\u7B80\u5199\u8DDF\u5728\u4E0B\u9762\n          if (q.p.colorIdx !== undefined) prims.push({ t: \"rect\", x: P(MARGIN - 0.95), y: ny - P(PART_EM * 0.62), w: P(0.6), h: P(0.6), cls: `cat-dot cat-${q.p.colorIdx}` });\n          partsHit.push({ paper: paper.id, part: q.p.id, x: P(MARGIN - 0.4), y: yOf(r0, TOP_LINE) - P(1.2), w: P(indN + 0.2), h: yOf(r1, BOTTOM_LINE) - yOf(r0, TOP_LINE) + P(2.4) });\n        }\n        if (q.p.colorIdx !== undefined) {   // \u6BCF\u884C\u5DE6\u8FB9\u4E00\u6761\u7EC6\u8272\u6761\uFF08\u7C7B\u522B\u8272\uFF1B\u4E0D\u5370\uFF09\uFF1A\u8C31\u53F7\u5DE6\u8FB9\u3001\u4ECE\u7B2C\u4E00\u7EBF\u5230\u6700\u540E\u4E00\u7EBF\n          const r0 = rowOf(s, r, 0), r1 = rEnd(s);\n          prims.push({ t: \"rect\", x: P(MARGIN + ind - 0.8), y: yOf(r0, TOP_LINE), w: P(0.3), h: yOf(r1, BOTTOM_LINE) - yOf(r0, TOP_LINE), cls: `cat-bar cat-${q.p.colorIdx}` });\n        }\n        if (q.staves === 2 || pr !== r) {   // \u5927\u8C31\u8868\uFF08\u6216\u5408\u79DF\u7684\u53CC\u624B\u8C31\uFF09\u7684\u82B1\u62EC\u53F7\uFF1A\u4E24\u6761\u8C31\u8868\u5DE6\u8FB9\u4E00\u6839\u7C97\u7EBF + \u4E24\u5934\u5C0F\u94A9\n          const bx = P(MARGIN + ind - 0.7), y0 = yOf(rowOf(s, r, 0), TOP_LINE), y1 = yOf(rEnd(s), BOTTOM_LINE);\n          prims.push({ t: \"path\", d: `M${bx + P(0.5)},${y0}Q${bx - P(0.3)},${y0 + P(0.6)} ${bx},${(y0 + y1) / 2}Q${bx - P(0.3)},${y1 - P(0.6)} ${bx + P(0.5)},${y1}`, cls: \"brace\" });\n        }\n      });\n      // \u5C55\u5F00\u7740\u7684\u4E00\u5BB6\uFF1A\u4E00\u6761\u62EC\u53F7\uFF08\u7C97\u7AD6\u7EBF + \u4E24\u5934\u5F80\u53F3\u7684\u5C0F\u94A9\uFF09\uFF0C\u5728\u540D\u5B57\u548C\u8C31\u4E4B\u95F4\uFF1B\u70B9\u5B83 = \u5149\u6807\u632A\u51FA\u8FD9\u4E00\u5BB6\uFF08score-view\uFF09\n      if (ind > 0 && o.titlePlaceholder) for (const fam of openFams) {   // \u7F16\u8F91\u5668\u7684\u63D0\u793A\uFF08\u5BFC\u51FA / \u6253\u5370\u4E0D\u753B\uFF09\n        const rs = fam.ids.map((id) => per.findIndex((q) => q.p.id === id)).filter((i) => i >= 0); if (rs.length < 2) continue;\n        const r0 = Math.min(...rs), r1 = Math.max(...rs), x = P(MARGIN + ind - 1.55), y0 = yOf(rowOf(s, r0, 0), TOP_LINE) - P(0.6), y1 = yOf(rowOf(s, r1, per[r1].staves - 1), BOTTOM_LINE) + P(0.6);\n        prims.push({ t: \"path\", d: `M${x + P(0.55)},${y0}L${x},${y0}L${x},${y1}L${x + P(0.55)},${y1}`, cls: \"family-bracket\" });\n        families.push({ paper: paper.id, host: fam.host, x: x - P(0.6), y: y0, w: P(1.3), h: y1 - y0 });\n      }\n      if (nRowsSys > 1) prims.push({ t: \"line\", x1: P(MARGIN + ind), y1: yOf(rowOf(s, 0, 0), TOP_LINE), x2: P(MARGIN + ind), y2: yOf(rowOf(s, nR - 1, per[nR - 1].staves - 1), BOTTOM_LINE), w: P(ENGRAVE.thinBar * 1.4), cls: \"bar\" });\n    }\n    // 5\u00BE. \u6BCF\u4E2A\u5C0F\u8282\u7684 tick \u533A\u95F4\u548C\u4F4D\u7F6E\uFF1A\u62FF\u7B2C\u4E00\u4F4D\uFF08\u8865\u9F50\u8FC7\uFF0C\u4EBA\u4EBA\u4E00\u6837\u957F\uFF09\u7684\u6392\u7248\u5355\u5143\u6570\uFF08\u6BCF\u4E00\u6BB5 chunk \u81EA\u5DF1\u7684 ticks\u3001\u7B2C\u51E0\u5C0F\u8282 m\uFF09\n    { const q0 = per.find((q) => rowHost[per.indexOf(q)] < 0) ?? per[0]; let t = 0, cur: Layout[\"measures\"][number] | null = null;\n      for (const u of q0.units) {\n        if (u.kind !== \"chunk\") continue;\n        const m = u.m ?? 0;\n        if (!cur || (cur as { m?: number }).m !== m) { cur = { paper: paper.id, t0: t, t1: t, row: rowOf(u.system, per.indexOf(q0), 0), x: P(u.x) }; (cur as { m?: number }).m = m; measures.push(cur); }\n        t += u.ticks; cur.t1 = t;\n      }\n      for (const x of measures) delete (x as { m?: number }).m; }\n    // 6. \u5404\u58F0\u90E8\u7684\u5185\u5BB9\n    per.forEach((q, r) => {\n      const tokens = q.tokens, focused = q.focused, v2 = rowHost[r] >= 0;   // \u58F0\u90E8 2\uFF1A\u53EA\u753B\u97F3\uFF08\u5C0F\u8282\u7EBF / \u8C03\u53F7 / \u62CD\u53F7 / \u4F11\u6B62\u5F52\u58F0\u90E8 1\uFF09\n      const units = q.units, tag = v2 ? { part: q.p.id } : {};\n      const dynOff = dynOverridden(tokens);   // \u88AB\u7D27\u8DDF\u7740\u7684\u5F3A\u540E\u5373\u5F31\uFF08fp\uFF09\u76D6\u6389\u7684\u529B\u5EA6\u8BB0\u53F7\uFF1A\u753B\u7070\uFF08\u7EAA\u5F8B\uFF1A\u753B\u7070 + \u660E\u8BF4\uFF1B\u70B9\u5F00\u5C0F\u83DC\u5355\u8BF4\u4E3A\u4EC0\u4E48\uFF09\n      const clefOf = (staff: Staff, index = -1): \"G\" | \"F\" => (q.staves === 2 ? (staff === 2 ? \"F\" : \"G\") : baseClef((index >= 0 ? q.ds.clef[index] : undefined) ?? q.start));\n      // \u8C31\u53F7 + \u516B\u5EA6\u7EBF\uFF08v0.9.28\uFF09\uFF1A\u540C\u4E00\u4E2A\u5B9E\u9645\u97F3\u9AD8\u5728\u8C31\u4E0A\u632A\u51E0\u7EA7\uFF08\u4F4E\u97F3\u8C31\u53F7 +12\u3001\u4E0B\u52A0 8 +7\u30018va \u7EBF \u22127\u2026\uFF1B\u9AD8\u97F3\u8C31\u53F7\u9876\u7EBF F5 = 38\uFF09\n      const dIdx = (p: Pitch, staff: Staff, index = -1) => posD(q, p, staff, index);\n      const dynRight = new Map<number, number>();   // \u6BCF\u4E00\u884C\u4E0A\u4E00\u4E2A\u529B\u5EA6\u5B57\u7684\u53F3\u8FB9\uFF08px\uFF09\uFF1A\u9632\u53E0\n      const grooveRight = new Map<number, number[]>();   // \u6BCF\u4E00\u884C\u98CE\u683C\u8BB0\u53F7\u4E24\u6761\u9053\u5404\u81EA\u5199\u5230\u54EA\uFF08px\uFF09\uFF1A\u9632\u53E0\n      const RW = (u: Unit) => rowOf(u.system, r, u.staff - 1);\n      const lyricRow = (s: number) => rowOf(s, r, q.staves - 1);   // \u6B4C\u8BCD\u5728\u6700\u4E0B\u9762\u90A3\u6761\u8C31\u8868\u4E0B\u9762\n      // \u8C31\u5185\u53CD\u590D / \u8DF3\u8F6C\uFF082026-10-09\uFF09\uFF1A\u753B\u5728\u53CD\u590D\u90A3\u4E00\u9053\uFF08\u529B\u5EA6\u5916\u9053\u4E0A\u9762\uFF09\uFF1B\u4E0D\u8D77\u4F5C\u7528\u7684\uFF08\u4E0D\u662F\u6700\u4E0A\u9762\u90A3\u4F4D\u7684\u884C / D.S. \u6CA1 Segno\u2026\uFF09\u753B\u7070\uFF0C\u70B9\u5F00\u8BF4\u4E3A\u4EC0\u4E48\uFF08repeats.ts navWhy\uFF09\n      const navY = (s: number) => navYAt.get(rowOf(s, r, 0)) ?? yOf(rowOf(s, r, 0), TOP_LINE + 6);\n      const navMute = (i: number) => (navWhy(song, paper, q.p.id, tokens[i]) ? \" art-mute\" : \"\");\n      const drawNav = (u: NavU) => {\n        const t = tokens[u.index] as NavTok, y = navY(u.system), cls = \"nav-mark\" + navMute(u.index), tok = t.id;\n        const fs = P(TEMPO_EM * 1.05), x = P(u.x + 0.4);\n        if (t.what === \"ending\") {   // \u623F\u5B50\uFF1A\u5DE6\u8FB9\u4E00\u9053\u7AD6\u94A9 + \u6A2A\u7EBF + \u300C1.\u300D\uFF1B\u5230\u5B83\u7684\u5C3D\u5934\u2014\u2014\u4E0B\u4E00\u6761 :|\uFF08\u53F3\u8FB9\u4E5F\u94A9\u4E0B\u6765\uFF09/ \u4E0B\u4E00\u4E2A\u623F\u5B50 / \u6700\u540E\u4E00\u4E2A\u623F\u5B50\u5230\u4E0B\u4E00\u6761\u5C0F\u8282\u7EBF\uFF08\u53F3\u8FB9\u5F00\u53E3\uFF09\n          const ui = units.indexOf(u);\n          let end: Unit | null = null, closed = false, fallback: Unit | null = null, sawNote = false;\n          for (let k = ui + 1; k < units.length; k++) {\n            const v = units[k];\n            if (v.kind === \"chunk\") sawNote = true;\n            if (v.kind === \"bar\" && (v.repeat === \"end\" || v.repeat === \"both\")) { end = v; closed = true; break; }\n            if (v.kind === \"nav\" && (tokens[v.index] as NavTok).what === \"ending\") { end = v; closed = true; break; }\n            if (v.kind === \"bar\" && v.repeat === \"start\") { if (!fallback) fallback = v; break; }   // \u65B0\u7684 |: = \u8FD9\u4E2A\u623F\u5B50\u5230\u6B64\u4E3A\u6B62\uFF08\u5F00\u53E3\uFF09\n            if (v.kind === \"bar\" && sawNote && !fallback) fallback = v;   // \u6700\u540E\u4E00\u4E2A\u623F\u5B50\uFF1A\u5230\u5B83\u540E\u9762\u7B2C\u4E00\u6761\u5C0F\u8282\u7EBF\n          }\n          if (!end) end = fallback;\n          const top = y - P(1.5), h = P(1.6);\n          const endX = (v: Unit | null, sys: number) => (v && v.system === sys ? (v.kind === \"bar\" ? P(v.x + (v.repeat ? 0.4 + (v.repeat === \"both\" ? 1.2 : 1.47) : 0.7)) : P(v.x) - P(0.3)) : P(right));\n          const seg = (sys: number, xa: number, openL: boolean, xb: number, hookR: boolean) => {\n            const yy = sys === u.system ? top : navY(sys) - P(1.5);\n            prims.push({ t: \"path\", d: `${openL ? `M${xa},${yy}` : `M${xa},${yy + h}L${xa},${yy}`}L${xb},${yy}${hookR ? `L${xb},${yy + h}` : \"\"}`, cls: \"volta\" + navMute(u.index) });\n          };\n          const endSys = end ? end.system : u.system;\n          seg(u.system, x - P(0.2), false, endX(endSys === u.system ? end : null, u.system), closed && endSys === u.system);\n          for (let s2 = u.system + 1; s2 <= endSys; s2++) { const first = units.find((w) => w.system === s2); seg(s2, P((first?.x ?? MARGIN) - 0.3), true, endX(s2 === endSys ? end : null, s2), closed && s2 === endSys); }\n          prims.push({ tok, t: \"text\", x: x + P(0.3), y: top + P(1.25), s: endingLabel(t.nums), cls, size: fs, anchor: \"start\" });\n          dyns.push({ index: u.index, kind: \"nav\", system: rowOf(u.system, r, 0), x: x - P(0.4), y: top - P(0.4), w: P(3), h: h + P(0.8) });\n          return;\n        }\n        if (t.what === \"segno\" || t.what === \"coda\") {   // Segno / Coda\uFF1ABravura \u5B57\u5F62\uFF08\u7F29\u5230 0.7\uFF09\n          const gs = 4 * sp * 0.7;\n          prims.push({ tok, t: \"glyph\", x, y, ch: t.what === \"segno\" ? \"\\u{E047}\" : \"\\u{E048}\", cls: cls.replace(\"nav-mark\", \"nav-sign\"), size: gs });\n          dyns.push({ index: u.index, kind: \"nav\", system: rowOf(u.system, r, 0), x: x - P(0.3), y: y - gs * 0.8, w: gs * (t.what === \"segno\" ? 0.6 : 1.0), h: gs * 0.95 });\n          return;\n        }\n        const label = NAV_LABEL[t.what], tw = (o.measureLyric(label) * TEMPO_EM * 1.05) / LYRIC_EM, atEnd = x - tw > P(MARGIN + 6);   // \u5B83\u6392\u5728\u5C0F\u8282\u7EBF\u524D\u9762\uFF1Ax \u2248 \u5C0F\u8282\u7EBF   // D.C. / Fine / To Coda\u2026\uFF1A\u659C\u4F53\u5B57\uFF0C\u9760\u53F3\u5BF9\u9F50\u5728\u5B83\u7684\u4F4D\u7F6E\uFF08\u5C0F\u8282\u5C3E\uFF09\uFF1B\u524D\u9762\u653E\u4E0D\u4E0B\u5C31\u9760\u5DE6\n        prims.push({ tok, t: \"text\", x: atEnd ? x : x - P(0.2), y, s: label, cls: cls + \" nav-word\", size: fs, anchor: atEnd ? \"end\" : \"start\" });\n        dyns.push({ index: u.index, kind: \"nav\", system: rowOf(u.system, r, 0), x: atEnd ? x - tw - P(0.3) : x - P(0.5), y: y - P(TEMPO_EM * 1.1), w: tw + P(0.8), h: P(TEMPO_EM * 1.5) });\n      };\n      const nhX = (c: Chunk) => P(c.x + c.accW + 0.35);\n      // \u00D7 \u7B26\u5934\uFF1A\u8FD9\u4E2A\u58F0\u90E8\u53F0\u4E0A\u90A3\u4F4D\u56FA\u5B9A\u6572\u4E00\u4E2A\u952E\uFF08\u9F13\u4EF6 / \u97F3\u6548\u56FA\u5B9A\u539F\u901F\uFF09\u2014\u2014\u8C31\u4E0A\u5199\u7684\u97F3\u9AD8\u7167\u7559\u3001\u53EA\u662F\u4E0D\u62FF\u6765\u51FA\u58F0\uFF0C\u753B\u6210 \u00D7 \u8BA9\u4EBA\u4E00\u773C\u770B\u51FA\u6765\uFF08user 2026-10-08\u300C\u62AB\u9732\u5C31\u7528x\u300D\uFF09\n      const pm = pmode[r], percHere = !!pm && !!q.p.perc;   // \u9F13\u8C31\uFF1A\u7B26\u5934\u6309\u4ED3\u9F20\u7684\u8868\uFF08\u6BCF\u4E2A\u97F3\u5404\u81EA\u7684\uFF09\u3001\u4E0D\u753B\u5347\u964D\u53F7\n      const xHead = !!q.p.xHead && !percHere;\n      /** \u9F13\u8C31\u4E0A\u8FD9\u4E2A\u97F3\u7684\u7B26\u5934\u5B57\u5F62 + \u5BBD\uFF08\u6309\u65F6\u503C\u6311\u9ED1 / \u4E8C\u5206 / \u5168\uFF09\u3002 */\n      const percHead = (c: Chunk, p: Pitch) => { const pi = percAt(q, p), hd = (pi?.head === \"custom\" && pi.smufl ? PERC_SMUFL[pi.smufl] : undefined) ?? PERC_HEAD[pi?.head ?? \"normal\"] ?? PERC_HEAD.normal, k = c.base >= WHOLE ? 2 : c.base >= TPQ * 2 ? 1 : 0; return { ch: hd.ch[k], w: hd.w[k] }; };\n      // \u6C14\u58F0\uFF082026-10-10\uFF0Cuser\u300Cx\u540C\u610F\uFF0C\u505A\u652F\u6301\u300D\uFF09\uFF1A\u8FD9\u4E2A\u97F3\u753B \u00D7 \u7B26\u5934\uFF08\u5FF5\u767D / \u8BF4\u5531\u7684\u6807\u51C6\u5199\u6CD5\uFF09\u2014\u2014\u548C\u4E0A\u9762\u7684 \u00D7 \u540C\u4E00\u4E2A\u610F\u601D\uFF1A\u8C31\u4E0A\u7684\u97F3\u9AD8\u4E0D\u62FF\u6765\u51FA\u58F0\n      const xOf = (c: Chunk) => xHead || !!c.whisper;\n      const nhW = (c: Chunk) => P(xOf(c) ? (c.base >= WHOLE ? W.noteheadXWhole : c.base >= TPQ * 2 ? W.noteheadXHalf : W.noteheadXBlack) : percHere && c.pitch ? percHead(c, c.pitch).w : c.base >= WHOLE ? W.noteheadWhole : W.noteheadBlack);\n      const whisperMute = (q.p.ignores ?? []).includes(\"whisper\");   // \u53F0\u4E0A\u8FD9\u4F4D\u505A\u4E0D\u5230\u6C14\u58F0\uFF1A\u00D7 \u7167\u753B\u3001\u753B\u7070\n      const clsOf = (c: Chunk) => [c.ghost ? \"ghost\" : \"\", c.pad ? \"pad-rest\" : \"\"].filter(Boolean).join(\" \") || undefined;\n      /** \u8FD9\u4E2A\u97F3\u5C5E\u4E8E\u54EA\u4E2A token\uFF08\u8865\u9F50\u7684\u6DE1\u8272\u4F11\u6B62\u4E0D\u7B97\uFF09\uFF1A\u5199\u5B57\u5934 / \u9009\u533A / \u5F3A\u8C03\u8272\u7531 score-view \u6309 data-tok \u5F00\u5173 class\u3002 */\n      const tokOf = (c: Chunk): number | undefined => (c.index >= 0 && !c.pad ? tokens[c.index]?.id : undefined);\n      const partLyrics: LyricHit[] = [];\n      const drawChunk = (c: Chunk) => {\n        const cls = clsOf(c), row = RW(c);\n        if (!c.note) {\n          if (c.pad || v2) return;   // \u8865\u9F50\u7684\u7A7A\u5C0F\u8282\u4E0D\u753B\u4F11\u6B62\uFF1B\u58F0\u90E8 2 \u7684\u7A7A\u4E5F\u4E0D\u753B\uFF08\u9694\u5F97\u8FDC\u7684\u97F3\u624D\u5728\u8FD9\u513F\uFF09\uFF08v0.10.19\uFF1Buser\u300Cremove the ghost mute idea\u300D\u300Cdont display them. once you insert a note later in a new section, all the previous mute materialized\u300D\uFF09\uFF1A\u4F4D\u7F6E\u548C\u843D\u70B9\u7167\u7559\uFF0C\u5728\u90A3\u513F\u5199 = \u524D\u9762\u7684\u7A7A\u843D\u6210\u771F\u4F11\u6B62\n          const g = c.base >= WHOLE ? GLYPH.restWhole : c.base >= TPQ * 2 ? GLYPH.restHalf : c.base >= TPQ ? GLYPH.restQuarter\n            : c.base >= TPQ / 2 ? GLYPH.rest8th : c.base >= TPQ / 4 ? GLYPH.rest16th : GLYPH.rest32nd;\n          const ry = c.base >= WHOLE && pm !== \"one\" ? yOf(row, 36) : yOf(row, MID_LINE);   // \u5168\u4F11\u6B62\u6302\u5728\u7B2C\u56DB\u7EBF\u4E0B\uFF1B\u4E00\u7EBF\u8C31 = \u6302\u5728\u90A3\u6761\u7EBF\u4E0B\n          prims.push({ tok: tokOf(c), t: \"glyph\", x: P(c.x + 0.35), y: ry, ch: g, cls: cls ? `rest ${cls}` : \"rest\" });\n          if (c.j === 0 && c.index >= 0 && !c.pad) rests.push({ index: c.index, system: row, x: P(c.x + 0.35), y: yOf(row, MID_LINE), w: P(1.2) });   // \u8865\u9F50\u7684\u6DE1\u8272\u4F11\u6B62\u4E0D\u80FD\u70B9\uFF08\u70B9\u5B83 = \u70B9\u7A7A\u767D\uFF1A\u843D\u5230\u90A3\u4E2A\u5C0F\u8282\u5F00\u5934\u7684\u843D\u70B9\uFF09\n          if (c.dotted) prims.push({ tok: tokOf(c), t: \"glyph\", x: P(c.x + 0.35 + 1.5), y: yOf(row, 35), ch: GLYPH.augmentationDot, cls });\n          return;\n        }\n        const ds = (c.pitches.length ? c.pitches : [c.pitch!]).map((pp) => dIdx(pp, c.staff, c.index));   // \u53E0\u97F3\u7684\u7B26\u5934\u4ECE\u9AD8\u5230\u4F4E\uFF1B\u7B2C\u4E00\u4E2A = \u65CB\u5F8B\u7EBF\n        const d = ds[0], y = yOf(row, d), x0 = nhX(c);\n        c.accs.forEach((a, k) => {\n          if (a === null || percHere) return;\n          const ag = a === 1 ? GLYPH.accidentalSharp : a === -1 ? GLYPH.accidentalFlat : a === 2 ? GLYPH.accidentalDoubleSharp : a === -2 ? GLYPH.accidentalDoubleFlat : GLYPH.accidentalNatural;\n          const near = c.accs.slice(0, k).some((b, kk) => b !== null && Math.abs(ds[kk] - ds[k]) < 3);   // \u6328\u5F97\u8FD1\u7684\u4E24\u4E2A\u4E34\u65F6\u8BB0\u53F7\u9519\u5F00\u4E00\u5217\n          prims.push({ tok: tokOf(c), t: \"glyph\", x: P(c.x + 0.2) - (near ? P(1.1) : 0) - (c.art.includes(\"ghost\") ? P(0.6) : 0), y: yOf(row, ds[k]), ch: ag, cls });   // \u5E7D\u7075\u97F3\uFF1A\u7ED9\u5DE6\u62EC\u53F7\u8BA9\u4F4D\n        });\n        const ledgers = new Set<number>();\n        for (const dd of ds) { for (let L = 28; L >= dd; L -= 2) ledgers.add(L); for (let L = 40; L <= dd; L += 2) ledgers.add(L); }\n        for (const L of ledgers) prims.push({ t: \"line\", x1: x0 - P(ENGRAVE.ledgerExt), y1: yOf(row, L), x2: x0 + nhW(c) + P(ENGRAVE.ledgerExt), y2: yOf(row, L), w: P(ENGRAVE.ledger), cls: \"ledger\" });\n        const ng = xOf(c) ? (c.base >= WHOLE ? GLYPH.noteheadXWhole : c.base >= TPQ * 2 ? GLYPH.noteheadXHalf : GLYPH.noteheadXBlack) : c.base >= WHOLE ? GLYPH.noteheadWhole : c.base >= TPQ * 2 ? GLYPH.noteheadHalf : GLYPH.noteheadBlack;\n        let shifted = false;\n        ds.forEach((dd, k) => {\n          const second = k > 0 && Math.abs(ds[k - 1] - dd) === 1 && !shifted; shifted = second;   // \u4E8C\u5EA6\uFF1A\u4E0B\u9762\u90A3\u4E2A\u7B26\u5934\u5F80\u53F3\u9519\u5F00\uFF08\u8FDE\u7740\u7684\u4E8C\u5EA6\u4EA4\u9519\uFF09\n          const mute = k > 0 && !!q.p.mono;   // \u5355\u58F0\u4E50\u5668\u7684\u58F0\u90E8\uFF1A\u4E0B\u9762\u7684\u97F3\u7070\u6389\u3001\u53EA\u5531\u6700\u4E0A\u9762\uFF08user\u300C\u53E0\u97F3\u58F0\u90E8\u6362\u5355\u58F0\u4E50\u5668\u65F6\u4E0B\u65B9\u97F3\u6570\u636E\u7ED3\u6784\u4E0A\u4FDD\u7559\uFF0C\u4F46\u662F\u53D8\u7070\u300D\uFF09\n          if (c.j === 0 && k > 0) chordHeads.push({ ...tag, index: c.index, system: row, x: second ? x0 + nhW(c) * 0.95 : x0, y: yOf(row, dd), w: nhW(c) });\n          const hch = percHere && !xOf(c) ? percHead(c, (c.pitches.length ? c.pitches : [c.pitch!])[k]).ch : ng;\n          prims.push({ tok: tokOf(c), t: \"glyph\", x: second ? x0 + nhW(c) * 0.95 : x0, y: yOf(row, dd), ch: hch, cls: [\"note\", cls ?? \"\", mute ? \"chord-mute\" : \"\", c.whisper && whisperMute ? \"art-mute\" : \"\"].filter(Boolean).join(\" \") });\n          if (c.art.includes(\"ghost\")) {   // \u5E7D\u7075\u97F3 = \u7B26\u5934\u4E24\u8FB9\u4E00\u5BF9\u62EC\u53F7\uFF08SMuFL noteheadParenthesisLeft / Right\uFF1B\u58A8\u8FF9\u6309 canvas \u91CF\u7684\uFF09\n            const hx = second ? x0 + nhW(c) * 0.95 : x0, pc = [\"note-paren\", cls ?? \"\"].filter(Boolean).join(\" \");\n            prims.push({ tok: tokOf(c), t: \"glyph\", x: hx - P(0.6), y: yOf(row, dd), ch: \"\\u{E0F5}\", cls: pc });\n            prims.push({ tok: tokOf(c), t: \"glyph\", x: hx + nhW(c) + P(0.25), y: yOf(row, dd), ch: \"\\u{E0F6}\", cls: pc });\n          }\n        });\n        if (c.dotted) prims.push({ tok: tokOf(c), t: \"glyph\", x: x0 + nhW(c) + P(0.3), y: yOf(row, d % 2 === 0 ? d + 1 : d), ch: GLYPH.augmentationDot, cls });\n        if (c.j === 0) notes.push({ ...tag, index: c.index, system: row, x: x0, y, w: nhW(c), d: diatonicIndex(c.pitch!) });   // d = \u771F\u7684\u97F3\u7EA7\uFF08\u62D6\u97F3\u9AD8\u7528\uFF09\uFF0C\u4E0D\u5E26\u8C31\u53F7\u4F4D\u79FB\n        if (c.j === 0 && !c.tie) {\n          const fit = lyrPlan.get(`${r}:${c.index}`), ly0 = lyricY(lyricRow(c.system)), cx0 = x0 + nhW(c) / 2;   // \u6309\u8282\u594F\u6392\uFF1A\u8BA9\u8FC7\u8DEF\u7684\u4F4D\u7F6E\n          const ly = ly0 + (fit?.row ? P(LYRIC_ROW2) : 0), cx = cx0 + (fit ? P(fit.dx) : 0);\n          partLyrics.push({ index: c.index, system: row, x: cx, y: ly, ...(fit?.tight ? { tight: true as const } : {}) });\n          if (c.lyric === MELISMA_MARK) prims.push({ t: \"line\", x1: x0 - P(0.6), y1: ly0, x2: x0 + nhW(c) + P(0.4), y2: ly0, w: P(0.12), cls: \"melisma\" });\n          else if (c.lyric) prims.push({ tok: tokOf(c), t: \"text\", x: cx, y: ly, s: lyricShow(c.lyric), ...(fit && fit.scale < 1 ? { size: P(LYRIC_EM * fit.scale) } : {}), cls: [\"lyric\", q.p.lyricMute?.has(tokens[c.index]?.id ?? -1) || fit?.tight ? \"lyric-mute\" : \"\", fit?.tight ? \"lyric-tight\" : \"\", cls ?? \"\"].filter(Boolean).join(\" \") });\n        }\n      };\n      for (const u of units) {\n        const row = RW(u);\n        if (u.kind === \"phrase\") {   // \u53E5\u53F7\uFF08\u6CA1\u6709\u8BED\u4E49\uFF0C\u53EA\u7ED9\u300C\u5408\u300D\u5F53\u8FB9\u754C\uFF09\uFF1A\u6B4C\u8BCD\u884C\u4E0A\u4E00\u4E2A\u5C0F\u7070\u300C\u3002\u300D\uFF0C\u8DDF\u5728\u4E0A\u4E00\u4E2A\u97F3\u540E\u9762\n          prims.push({ t: \"text\", x: P(u.x + 0.1), y: lyricY(lyricRow(u.system)), s: \"\u3002\", cls: \"phrase-mark\", size: P(1.3), anchor: \"start\" });\n          continue;\n        }\n        if (u.kind === \"dyn\") {   // \u529B\u5EA6\uFF1A\u8C31\u4E0A\u65B9\uFF08\u58F0\u4E50\u8C31\u7684\u4E0B\u9762\u662F\u6B4C\u8BCD\uFF09\uFF0C\u548C\u540E\u9762\u90A3\u4E2A\u97F3\u5DE6\u5BF9\u9F50\uFF1B\u57FA\u7EBF\u5728\u7B2C\u4E94\u7EBF\u4E0A\u65B9 1.2 \u4E2A\u95F4\u8DDD\u2014\u2014\u518D\u9AD8\u5C31\u649E\u5F00\u5934\u7684\u901F\u5EA6\u8BB0\u53F7\uFF08\u5B83\u7684\u57FA\u7EBF\u7EA6 2.9\uFF09\n          const dr = rowOf(u.system, r, 0), [cl0, cr0] = DYN_INK[u.value];\n          let dy = dynYAt.get(dr) ?? yOf(row, TOP_LINE + 2.4);\n          // \u529B\u5EA6\u8BB0\u53F7\u4E0D\u5360\u6A2A\u5411\u7684\u5730\u65B9\uFF08\u97F3\u7684\u95F4\u8DDD\u4E0D\u56E0\u5B83\u53D8\uFF09\u2192 \u6328\u5F97\u592A\u8FD1\u7684\u4E24\u4E2A\uFF08\u76F8\u90BB\u7684\u77ED\u97F3\u4E0A\uFF09\u4F1A\u53E0\u5728\u4E00\u8D77\uFF1A\u540E\u4E00\u4E2A\u5F80\u79BB\u8C31\u8FDC\u7684\u90A3\u8FB9\u632A\u4E00\u884C\uFF0C\u8FD8\u548C\u81EA\u5DF1\u7684\u97F3\u5BF9\u9F50\n          const lx = P(u.x + 0.3 + cl0), prev = dynRight.get(dr);\n          if (prev !== undefined && lx < prev + P(0.3)) dy += dy < yOf(dr, MID_LINE) ? -P(1.9) : P(1.9);\n          else dynRight.set(dr, P(u.x + 0.3 + cr0));\n          prims.push({ t: \"glyph\", x: P(u.x + 0.3), y: dy, ch: DYN_GLYPH[u.value], tok: tokens[u.index].id, cls: \"dyn\" + (dynOff.has(u.index) ? \" art-mute\" : \"\") });\n          const [il, ir, iu, id] = DYN_INK[u.value];\n          dyns.push({ index: u.index, kind: \"dyn\", system: dr, x: P(u.x + 0.3 + il - 0.3), y: dy - P(iu + 0.4), w: P(ir - il + 0.6), h: P(iu + id + 0.8) });\n          continue;\n        }\n        if (u.kind === \"groove\") {   // \u98CE\u683C\u8BB0\u53F7\uFF08\u62CD\u5B50\u8F7B\u91CD\uFF09\uFF1A\u659C\u4F53\u5B57\u3001\u548C\u540E\u9762\u90A3\u4E2A\u97F3\u5DE6\u5BF9\u9F50\uFF1B\u4E0D\u8BA4\u8BC6\u7684\u9884\u8BBE\uFF08\u4EE5\u540E\u7684\u7248\u672C\u5199\u7684\uFF09= \u7070\u5B57 + \u8BF4\u660E\uFF08\u7EAA\u5F8B\uFF09\n          const gt = tokens[u.index] as GrooveTok, gr = rowOf(u.system, r, 0), label = grooveLabel(gt), known = !!grooveStyle(gt.style);\n          const fs = TEMPO_EM * sp, gw = (o.measureLyric(label) * TEMPO_EM) / LYRIC_EM, gx = P(u.x + 0.3);\n          // \u4E0D\u5360\u6A2A\u5411\u5730\u65B9 \u2192 \u6328\u5F97\u8FD1\u7684\u4E24\u4E2A\u4F1A\u53E0\uFF1A\u5148\u653E\u4E0B\u9762\u90A3\u6761\u9053\uFF0C\u6324\u4E86\u653E\u4E0A\u9762\u90A3\u6761\u9053\uFF08\u8FD8\u548C\u81EA\u5DF1\u7684\u97F3\u5BF9\u9F50\uFF1B\u540C\u529B\u5EA6\u5B57\u7684\u9519\u5F00\uFF09\n          const lanes = grooveRight.get(gr) ?? [-Infinity, -Infinity], lane = gx >= lanes[0] + P(0.8) ? 0 : 1;\n          lanes[lane] = gx + gw; grooveRight.set(gr, lanes);\n          const gy = (grooveYAt.get(gr) ?? staffTop(gr) - P(2.4)) - lane * P(GROOVE_LANE / 2);\n          prims.push({ t: \"text\", x: gx, y: gy, s: label, tok: gt.id, cls: [\"groove-mark\", known ? \"\" : \"groove-unknown\"].filter(Boolean).join(\" \"), size: fs, anchor: \"start\" });\n          dyns.push({ index: u.index, kind: \"groove\", system: gr, x: P(u.x), y: gy - P(TEMPO_EM * 1.1), w: gw + P(0.6), h: P(TEMPO_EM * 1.5) });\n          continue;\n        }\n        if (u.kind === \"head\") continue;   // \u5199\u5B57\u5934\uFF08\u96F6\u5BBD\uFF0C\u53EA\u5728\u5C3E\u5DF4\uFF09\uFF1A\u53EA\u4E3A\u4E94\u7EBF\u753B\u5230\u53F3\u8FB9\uFF1B\u5149\u6807\u672C\u8EAB score-view \u5728 ink \u5C42\u6309\u843D\u70B9\uFF08slots\uFF09\u753B\n        if (v2 && (u.kind === \"bar\" || u.kind === \"key\" || u.kind === \"time\")) continue;   // \u58F0\u90E8 2\uFF1A\u5C0F\u8282\u7EBF / \u8C03\u53F7 / \u62CD\u53F7\u662F\u58F0\u90E8 1 \u753B\u7684\uFF08\u5355\u4F4D\u7559\u7740\uFF1A\u7B26\u6760\u7167\u6837\u5728\u5C0F\u8282\u7EBF\u5904\u65AD\uFF09\n        if (u.kind === \"bar\" || u.kind === \"key\" || u.kind === \"time\") {   // \u5C0F\u8282\u7EBF / \u8C03\u53F7 / \u62CD\u53F7\uFF1A\u6BCF\u5F20\u8C31\u8868\u5404\u753B\u4E00\u4EFD\n          for (let k = 0; k < q.staves; k++) {\n            const rr = rowOf(u.system, r, k), clef = clefOf((k + 1) as Staff, u.index), sh = clef === \"F\" ? 12 : 0;\n            if (u.kind === \"bar\") bars.push({ system: rr, x: P(u.x + 0.7) });\n            if (u.kind === \"bar\" && u.repeat) {   // \u53CD\u590D\u5C0F\u8282\u7EBF\uFF1ABravura \u5B57\u5F62\uFF08|: = E040\u3001:| = E041\u3001:|: = E042\uFF1B\u4E00\u6761\u8C31\u9AD8\uFF09\uFF1B:| \u4E00\u5171\u653E\u51E0\u904D > 2 = \u4E0A\u9762\u5199\u300C\u00D73\u300D\n              prims.push({ t: \"glyph\", x: P(u.x + 0.4), y: yOf(rr, BOTTOM_LINE), ch: u.repeat === \"start\" ? \"\\u{E040}\" : u.repeat === \"end\" ? \"\\u{E041}\" : \"\\u{E042}\", cls: \"repeat-bar\" + navMute(u.index), tok: tokens[u.index].id });\n              if (u.times && u.times > 2 && k === 0) prims.push({ t: \"text\", x: P(u.x + 0.4 + (u.repeat === \"both\" ? 1.2 : 1.47)), y: navY(u.system), s: `\u00D7${u.times}`, cls: \"nav-mark\" + navMute(u.index), size: P(TEMPO_EM * 1.05), anchor: \"end\" });\n            } else if (u.kind === \"bar\") {\n              const bx = P(u.x + 0.7), bcls = u.auto ? \"bar auto\" : \"bar\";\n              const [bt, bb] = pmode[r] === \"one\" ? [MID_LINE + 2, MID_LINE - 2] : [TOP_LINE, BOTTOM_LINE];   // \u4E00\u7EBF\u8C31\uFF1A\u5C0F\u8282\u7EBF\u4E0A\u4E0B\u5404\u51FA\u4E00\u683C\n              prims.push({ t: \"line\", x1: bx, y1: yOf(rr, bt), x2: bx, y2: yOf(rr, bb), w: P(ENGRAVE.thinBar), cls: bcls });\n              if (u.style === \"double\") prims.push({ t: \"line\", x1: bx + P(0.45), y1: yOf(rr, bt), x2: bx + P(0.45), y2: yOf(rr, bb), w: P(ENGRAVE.thinBar), cls: bcls });   // \u6BB5\u843D\u7EBF \u2016\n              if (u.style === \"final\") prims.push({ t: \"line\", x1: bx + P(0.6), y1: yOf(rr, bt), x2: bx + P(0.6), y2: yOf(rr, bb), w: P(0.5), cls: bcls });   // \u7EC8\u6B62\u7EBF\uFF1A\u7EC6 + \u7C97\n              if (u.warn && k === 0) prims.push({ t: \"rect\", x: bx - P(0.3), y: yOf(rr, TOP_LINE) - P(1.6), w: P(0.6), h: P(0.6), cls: \"warn\" });\n            } else if (u.kind === \"key\") {\n              if (pmode[r]) { marks.push({ index: u.index, kind: \"key\", system: rr, x: P(u.x), ...staffHit(rr), w: P(Math.max(u.w, 1.6)) }); continue; }   // \u9F13\u8C31\u6CA1\u6709\u8C03\u53F7\uFF08\u8BB0\u53F7\u7167\u7559\u3001\u80FD\u70B9\uFF09\n              const cls = \"keysig\";\n              if (u.fifths === 0) { const pos = u.prev > 0 ? SHARP_POS : FLAT_POS; for (let j = 0; j < Math.abs(u.prev); j++) prims.push({ t: \"glyph\", x: P(u.x + 0.4 + j * 0.8), y: yOf(rr, pos[j] - (sh ? 2 : 0)), ch: GLYPH.accidentalNatural, cls }); }\n              else drawKeySig(rr, u.x + 0.4, u.fifths, cls, clef);\n              // \u6362\u5230\u540C\u4E00\u4E2A\u8C03\u3001\u53C8\u6CA1\u6709\u5347\u964D\u53F7\uFF08C \u2192 C\uFF09\uFF1A\u4EC0\u4E48\u90FD\u753B\u4E0D\u51FA\u6765 \u2192 \u5199\u4E2A\u5C0F\u5B57\uFF0C\u514D\u5F97\u6210\u4E86\u770B\u4E0D\u89C1\u7684\u8BB0\u53F7\n              if (u.fifths === 0 && u.prev === 0 && k === 0) prims.push({ t: \"text\", x: P(u.x + 0.2), y: staffTop(rr) - P(0.8), s: `1=${KEY_LABEL[0]}`, cls: `${cls} key-label`, size: TEMPO_EM * sp * 0.85, anchor: \"start\" });\n              marks.push({ index: u.index, kind: \"key\", system: rr, x: P(u.x), ...staffHit(rr), w: P(Math.max(u.w, 1.6)) });\n            } else {\n              const cls = \"timesig\";\n              drawTime(rr, u.x + 0.6, u.beats, u.beatType, cls);\n              marks.push({ index: u.index, kind: \"time\", system: rr, x: P(u.x), ...staffHit(rr), w: P(u.w) });\n            }\n          }\n          continue;\n        }\n        if (u.kind === \"tempo\") { if (q.p.id === owner) drawTempo(row, u.x + 0.3, u.bpm, \"tempo\", u.index); continue; }\n        if (u.kind === \"hairpin\") continue;   // \u6E10\u5F3A\u6E10\u5F31\u5728 8\u00BE \u753B\uFF08\u8981\u77E5\u9053\u7EC8\u70B9\uFF09\n        if (u.kind === \"nav\") { drawNav(u); continue; }\n        if (u.kind === \"ottava\") continue;   // \u516B\u5EA6\u7EBF\u5728\u4E0B\u9762\u6309\u97F3\u7684\u8303\u56F4\u753B\n        if (u.kind === \"clef\") {   // \u884C\u4E2D\u95F4\u6362\u8C31\u53F7\uFF08v0.9.28\uFF09\uFF1A\u5C0F\u4E00\u53F7\u7684\u8C31\u53F7\uFF1B\u6B63\u597D\u5728\u4E00\u884C\u5F00\u5934 = \u884C\u9996\u7684\u8C31\u53F7\u5DF2\u7ECF\u662F\u5B83\uFF0C\u4E0D\u91CD\u753B\n          if (q.staves === 2) continue;\n          const first = !units.some((x) => x.system === u.system && x.index >= 0 && x.index < u.index && x.kind !== \"ottava\");\n          const base = baseClef(u.clef), cls = \"clef cue\";\n          if (!first) prims.push({ t: \"glyph\", x: P(u.x + 0.35), y: yOf(row, base === \"F\" ? 36 : 32), ch: CLEF_GLYPH[u.clef], cls, size: P(4 * CLEF_CUE) });\n          clefs.push({ kind: \"mid\", paper: paper.id, part: q.p.id, index: u.index, system: row, x: P(u.x), ...staffHit(row), w: P(Math.max(u.w, 1.6)) });\n          continue;\n        }\n        drawChunk(u);\n      }\n      // 7\u00BC. \u516B\u5EA6\u7EBF\uFF08v0.9.28\uFF09\uFF1A8va / 15ma \u5728\u8C31\u4E0A\u9762\u30018vb \u5728\u8C31\u4E0B\u9762\uFF1B\u4E00\u884C\u91CC\u8FDE\u7740\u7684\u540C\u4E00\u79CD\u753B\u6210\u4E00\u6BB5\uFF08\u5F00\u5934\u7684\u5B57 + \u865A\u7EBF + \u6536\u5C3E\u7684\u94A9\uFF09\uFF1B\u63A5\u7740\u4E0A\u4E00\u884C\u7684\u5B57\u52A0\u62EC\u53F7\n      if (q.staves === 1) {\n        const SIG: Record<number, string> = { 1: GLYPH.ottavaAlta, 2: GLYPH.quindicesimaAlta, [-1]: GLYPH.ottavaBassa };\n        const SIG_W: Record<number, number> = { 1: 3.54, 2: 5.26, [-1]: 3.36 };\n        for (let sy = 0; sy < nSys; sy++) {\n          const row0 = rowOf(sy, r, 0);\n          const us = units.filter((x) => x.system === sy && x.kind === \"chunk\").sort((a, b) => a.x - b.x) as Chunk[];\n          let k = 0;\n          while (k < us.length) {\n            const v = q.ds.ott[us[k].index] ?? 0; if (!v) { k++; continue; }\n            const isAuto = !!q.ds.auto?.[us[k].index];   // \u81EA\u52A8\u7684\u548C\u6328\u7740\u7684\u624B\u5199\u7684\u5206\u5F00\u753B\n            let e = k; while (e + 1 < us.length && (q.ds.ott[us[e + 1].index] ?? 0) === v && !!q.ds.auto?.[us[e + 1].index] === isAuto) e++;\n            const up = v > 0, y = up ? ottYAt.get(row0) : ottDownYAt.get(row0);\n            if (y !== undefined) {\n              const prevIdx = us[k].index - 1, cont = k === 0 && prevIdx >= 0 && (q.ds.ott[prevIdx] ?? 0) === v && units.some((x) => x.index >= 0 && x.index <= prevIdx && x.system < sy);\n              const nextU = us[e + 1], lastIdx = us[e].index, endsHere = !!nextU || (q.ds.ott[lastIdx + 1] ?? 0) !== v || lastIdx + 1 >= q.tokens.length || !units.some((x) => x.system > sy && x.index > lastIdx);\n              const x0 = P(us[k].x - 0.2), x1 = P(us[e].x + us[e].w - 0.3), sz = P(4 * 0.85), gw = P(SIG_W[v] * 0.85);\n              const src = units.find((x) => x.kind === \"ottava\" && x.index <= us[k].index && (q.ds.ott[x.index] ?? 0) === v && x.system === sy) ?? null;\n              if (cont) prims.push({ t: \"text\", x: x0, y: y + P(0.5), s: `(${v === 2 ? \"15ma\" : v > 0 ? \"8va\" : \"8vb\"})`, cls: \"ottava cont\", size: P(1.3), anchor: \"start\" });\n              else prims.push({ t: \"glyph\", x: x0, y: y + P(up ? 0.4 : 0.4), ch: SIG[v], cls: isAuto ? \"ottava auto\" : \"ottava\", size: sz });\n              const lx = x0 + (cont ? P(4.2) : gw) + P(0.4), ly = y - P(up ? 0.55 : 0.55);\n              for (let x = lx; x + P(0.6) <= x1; x += P(1.0)) prims.push({ t: \"line\", x1: x, y1: ly, x2: x + P(0.6), y2: ly, w: P(0.1), cls: \"ottava-line\" });\n              if (endsHere) prims.push({ t: \"line\", x1: x1, y1: ly, x2: x1, y2: ly + P(up ? 1.1 : -1.1), w: P(0.1), cls: \"ottava-line\" });\n              const hitIdx = src ? src.index : (() => { for (let i = us[k].index; i >= 0; i--) if (q.tokens[i]?.kind === \"ottava\") return i; return -1; })();\n              const run = isAuto ? q.ds.runs.find((rr) => us[k].index >= rr.from && us[k].index <= rr.to) : undefined;\n              if (q.vrt) { /* \u53E0\u8D77\u6765\u7684\u90A3\u4E00\u884C\uFF1A\u81EA\u52A8\u516B\u5EA6\u7EBF\u53EA\u770B\uFF0C\u4E0D\u80FD\u70B9\uFF08\u53EA\u8BFB\uFF09 */ } else if (run) clefs.push({ kind: \"ottava\", paper: paper.id, part: q.p.id, index: -1, run, system: row0, x: x0, y: y - P(1.6), w: Math.max(gw, P(3)), h: P(2.2) });\n              else if (hitIdx >= 0) clefs.push({ kind: \"ottava\", paper: paper.id, part: q.p.id, index: hitIdx, system: row0, x: x0, y: y - P(1.6), w: Math.max(gw, P(3)), h: P(2.2) });\n            }\n            k = e + 1;\n          }\n        }\n      }\n      // 7. \u7B26\u5E72\u3001\u7B26\u6760\u3001\u7B26\u5C3E\uFF08\u6309\u62CD\u5206\u7EC4\uFF1A\u540C\u4E00\u62CD\u91CC\u8FDE\u7740\u7684\u516B\u5206\u53CA\u66F4\u77ED\u7684\u97F3\u7B26\u5171\u7528\u7B26\u6760\uFF09\n      type Stemmed = { c: Chunk; x0: number; y: number; d: number; yLow: number; dLow: number };   // y / d = \u6700\u9AD8\u7684\u7B26\u5934\uFF1ByLow / dLow = \u6700\u4F4E\u7684\uFF08\u53E0\u97F3\u7684\u7B26\u5E72\u8FDE\u7740\u4E24\u5934\uFF09\n      const stemmed: Stemmed[][] = [];\n      let group: Stemmed[] = [], groupBeat = -1, groupSys = -1;\n      const endGroup = () => { if (group.length) stemmed.push(group); group = []; groupBeat = -1; };\n      const chunksInOrder: (Chunk | null)[] = [];\n      // \u6253\u65AD\u7B26\u6760\u7684\u53EA\u6709\u5C0F\u8282\u7EBF\u548C\u4E2D\u9014\u7684\u8C03\u53F7 / \u62CD\u53F7\uFF1B\u5149\u6807\u3001\u529B\u5EA6\u8BB0\u53F7\u3001\u6E10\u5F3A\u6E10\u5F31\u3001\u53E5\u53F7\u3001\u901F\u5EA6\u90FD\u4E0D\u6253\u65AD\uFF082026-10-08 Opus 5.5\uFF0Cuser\u300C\u4E3A\u4EC0\u4E48\u2026\u529B\u5EA6\u6807\u8BC6\u4F1A\u7834\u574F\u516B\u5206\u97F3\u7B26\u5C3E\u5DF4\u7684\u8FDE\u97F3\uFF1F\u300D\uFF09\n      for (const u of units) { if (u.kind === \"chunk\") chunksInOrder.push(u); else if (u.kind === \"bar\" || u.kind === \"key\" || u.kind === \"time\") chunksInOrder.push(null); }\n      for (const u of chunksInOrder) {\n        if (!u || !u.note || u.base >= WHOLE) { endGroup(); continue; }\n        const dsU = (u.pitches.length ? u.pitches : [u.pitch!]).map((pp) => dIdx(pp, u.staff, u.index));\n        const s: Stemmed = { c: u, x0: nhX(u), y: yOf(RW(u), dsU[0]), d: dsU[0], yLow: yOf(RW(u), dsU[dsU.length - 1]), dLow: dsU[dsU.length - 1] };\n        if (u.base > TPQ / 2) { endGroup(); stemmed.push([s]); continue; }\n        const beat = Math.floor(u.inBar / u.beat);\n        if (group.length && (beat !== groupBeat || u.system !== groupSys || u.staff !== group[0].c.staff)) endGroup();   // \u6362\u8C31\u8868 = \u7B26\u6760\u65AD\u5F00\uFF08\u8DE8\u8C31\u8868\u7B26\u6760\u4E0B\u4E00\u8F6E\uFF09\n        group.push(s); groupBeat = beat; groupSys = u.system;\n      }\n      endGroup();\n      const stemCls = (s: Stemmed) => clsOf(s.c);\n      const upOf = new Map<Chunk, boolean>();   // \u7B26\u5E72\u671D\u4E0A\uFF1F\uFF08\u6F14\u594F\u6CD5\u753B\u5728\u53E6\u4E00\u4FA7\uFF09\n      const tipOf = new Map<Chunk, number>();\n      for (const g of stemmed) {\n        const row = RW(g[0].c), mid = yOf(row, MID_LINE);\n        const up = v2 ? false : hasV2[r] ? true : percHere ? pm === \"one\" || g.some((s) => (s.c.pitches.length ? s.c.pitches : [s.c.pitch!]).some((p) => percAt(q, p)?.stem !== \"down\"))   // \u9F13\u8C31\uFF1A\u624B\u6253\u671D\u4E0A\u3001\u811A\u8E29\u671D\u4E0B\uFF08\u4E00\u7EC4\u91CC\u6709\u624B\u6253\u7684 = \u671D\u4E0A\uFF09\uFF1B\u4E00\u7EBF\u8C31\u4E00\u5F8B\u671D\u4E0A\n          : g.reduce((a, s) => a + (s.d + s.dLow) / 2, 0) / g.length < MID_LINE;\n        for (const s of g) upOf.set(s.c, up);\n        const sx = (s: Stemmed) => (up ? s.x0 + P(STEM_UP_SE[0] - ENGRAVE.stem / 2) : s.x0 + P(STEM_DOWN_NW[0] + ENGRAVE.stem / 2));\n        const sy0 = (s: Stemmed) => (up ? s.yLow - P(STEM_UP_SE[1]) : s.y - P(STEM_DOWN_NW[1]));   // \u7B26\u5E72\u4ECE\u8FDC\u7AEF\u7684\u90A3\u4E2A\u7B26\u5934\u8D77\n        if (g.length === 1) {\n          const s = g[0];\n          let tip = up ? s.y - P(3.5) : s.yLow + P(3.5);\n          if (up && s.d < 27) tip = Math.min(tip, mid); if (!up && s.dLow > 41) tip = Math.max(tip, mid);\n          tipOf.set(s.c, tip);\n          prims.push({ tok: tokOf(s.c), t: \"line\", x1: sx(s), y1: sy0(s), x2: sx(s), y2: tip, w: P(ENGRAVE.stem), cls: stemCls(s) });\n          const lv = flagLevel(s.c.base);\n          if (lv > 0) {\n            const fx = sx(s) - P(ENGRAVE.stem / 2);\n            const fg = up ? [GLYPH.flag8thUp, GLYPH.flag16thUp, GLYPH.flag32ndUp][lv - 1] : [GLYPH.flag8thDown, GLYPH.flag16thDown, GLYPH.flag32ndDown][lv - 1];\n            prims.push({ tok: tokOf(s.c), t: \"glyph\", x: fx, y: up ? tip + P(FLAG_ANCHOR_UP[lv]) : tip + P(FLAG_ANCHOR_DOWN[lv]), ch: fg, cls: stemCls(s) });\n          }\n          continue;\n        }\n        const xa = sx(g[0]), xb = sx(g[g.length - 1]);\n        const k = Math.max(-0.2, Math.min(0.2, ((g[g.length - 1].y - g[0].y) / (xb - xa)) * 0.5));\n        const at = (xx: number, yy0: number) => yy0 + k * (xx - xa);\n        const yb0 = up ? Math.min(...g.map((s) => s.y - P(3.5) - k * (sx(s) - xa))) : Math.max(...g.map((s) => s.yLow + P(3.5) - k * (sx(s) - xa)));\n        for (const s of g) { tipOf.set(s.c, at(sx(s), yb0)); prims.push({ tok: tokOf(s.c), t: \"line\", x1: sx(s), y1: sy0(s), x2: sx(s), y2: at(sx(s), yb0), w: P(ENGRAVE.stem), cls: stemCls(s) }); }\n        const step = P(ENGRAVE.beam + ENGRAVE.beamGap) * (up ? 1 : -1), th = P(ENGRAVE.beam) * (up ? 1 : -1);\n        const beamPath = (xL: number, xR: number, lvl: number) => {\n          const of = step * lvl; const a = at(xL, yb0) + of, b = at(xR, yb0) + of;\n          return `M${xL - P(ENGRAVE.stem / 2)},${a}L${xR + P(ENGRAVE.stem / 2)},${b}L${xR + P(ENGRAVE.stem / 2)},${b + th}L${xL - P(ENGRAVE.stem / 2)},${a + th}Z`;\n        };\n        const gcls = [\"beam\", g.every((s) => s.c.ghost) ? \"ghost\" : \"\"].filter(Boolean).join(\" \");\n        prims.push({ t: \"path\", d: beamPath(xa, xb, 0), cls: gcls });\n        const maxLv = Math.max(...g.map((s) => flagLevel(s.c.base)));\n        for (let lvl = 2; lvl <= maxLv; lvl++) {\n          let runStart = -1;\n          for (let n = 0; n <= g.length; n++) {\n            const has = n < g.length && flagLevel(g[n].c.base) >= lvl;\n            if (has && runStart < 0) runStart = n;\n            if (!has && runStart >= 0) {\n              const L = runStart, R = n - 1;\n              if (L === R) { const stub = P(1.1), toRight = L < g.length - 1;   // \u5355\u72EC\u4E00\u4E2A\u66F4\u77ED\u7684\u97F3\uFF1A\u534A\u622A\u6760\uFF0C\u7EC4\u91CC\u6700\u540E\u4E00\u4E2A\u671D\u5DE6\uFF0C\u5176\u4F59\u671D\u53F3\n                prims.push({ t: \"path\", d: beamPath(toRight ? sx(g[L]) : sx(g[L]) - stub, toRight ? sx(g[L]) + stub : sx(g[L]), lvl - 1), cls: gcls }); }\n              else prims.push({ t: \"path\", d: beamPath(sx(g[L]), sx(g[R]), lvl - 1), cls: gcls });\n              runStart = -1;\n            }\n          }\n        }\n      }\n      // 7\u00BD. \u4FEE\uFF082026-10-08\uFF09\uFF1A\u8DF3\u97F3 / \u4FDD\u6301\u5728\u7B26\u5934\u5916\u4E00\u683C\uFF08\u8C31\u5185\u843D\u5728\u95F4\u91CC\uFF09\uFF1B\u7B26\u5E72\u671D\u4E0A = \u753B\u5728\u4E0B\u9762\uFF0C\u671D\u4E0B / \u6CA1\u6709\u7B26\u5E72 = \u4E0A\u9762\u3002\u547C\u5438 = \u97F3\u540E\u9762\u3001\u8C31\u7EBF\u4E0A\u65B9\u4E00\u4E2A\u9017\u53F7\u3002\n      //   \u5F3A\u5EA6\u90A3\u4E00\u7EC4\uFF08\u91CD\u97F3 / \u5F3A\u97F3 / \u6B21\u91CD\u97F3 / \u5F31\u5316\uFF09**\u4E00\u5F8B\u753B\u5728\u8C31\u4E0A\u65B9**\uFF082026-10-08 \u6DF1\u591C Opus 5.5\uFF0Cuser\u300C\u5F3A\u5EA6\u8BB0\u53F7\u7EDF\u4E00\u653E\u4E0A\u9762\u5427\uFF0C\u4E0D\u7136\u5BB9\u6613misleading\u300D\uFF09\uFF1A\n      //   \u7B26\u5E72\u671D\u4E0A = \u8D8A\u8FC7\u7B26\u5E72\u5C16\u518D\u5F80\u4E0A\uFF1B\u90FD\u51FA\u4E86\u8C31\uFF08\u7B2C\u4E94\u7EBF\u4E0A\u9762\uFF09\n      const ign = new Set(q.p.ignores ?? []);   // \u53F0\u4E0A\u90A3\u4F4D\u4E0D\u8BA4\u7684\u8BB0\u53F7\uFF1A\u7167\u753B\u3001\u753B\u7070\uFF08user\u300C\u6F14\u594F\u8005\u4E0D\u8BA4\u7684\u8BB0\u53F7\u4E5F\u53D8\u7070\uFF0C\u4E0D\u9759\u9ED8\u5931\u6548\uFF0C\u800C\u662F\u5411\u7528\u6237\u62AB\u9732\u300D\uFF09\n      for (const c of units) {\n        if (c.kind !== \"chunk\" || !c.note || (!c.art.length && !c.breath)) continue;\n        const row = RW(c), cls = clsOf(c), cx = nhX(c) + nhW(c) / 2;\n        const dsC = (c.pitches.length ? c.pitches : [c.pitch!]).map((pp) => dIdx(pp, c.staff, c.index)), dHi = dsC[0], dLo = dsC[dsC.length - 1];\n        const below = upOf.get(c) ?? false, sgn = below ? -1 : 1;\n        const inStaff = (d: number) => d >= BOTTOM_LINE && d <= TOP_LINE;\n        let d = below ? dLo - 2 : dHi + 2;\n        const artCls = (a: string) => [\"art\", ign.has(a) ? \"art-mute\" : \"\", cls ?? \"\"].filter(Boolean).join(\" \");\n        for (const a of ([\"staccato\", \"tenuto\"] as const).filter((x) => c.art.includes(x))) {   // \u8DF3\u97F3 / \u4FDD\u6301\uFF1A\u7B26\u5934\u5916\u4E00\u683C\uFF0C\u8DDF\u7740\u7B26\u5E72\u7684\u53E6\u4E00\u4FA7\n          if (inStaff(d) && d % 2 === 0) d += sgn;                                                   // \u8C31\u5185\u843D\u5728\u95F4\u91CC\n          const m = ART_GLYPH[a], g = below ? m.below : m.above;\n          prims.push({ tok: tokOf(c), t: \"glyph\", x: cx - P(m.w / 2), y: yOf(row, d) + (below ? -P(m.h / 2) : P(m.h / 2)), ch: g, cls: artCls(a) });\n          d += sgn * 2;\n        }\n        // \u5F3A\u5EA6\u90A3\u4E00\u7EC4\uFF1A\u4E00\u5F8B\u4E0A\u9762\u3002\u8D77\u70B9\uFF08\u5B57\u5F62\u4E2D\u5FC3\uFF0Cpx\uFF09= \u7B2C\u4E94\u7EBF\u4E0A\u4E00\u683C\uFF0C\u548C\u300C\u4E0A\u9762\u5DF2\u7ECF\u5360\u4E86\u7684\u300D\uFF08\u671D\u4E0A\u7684\u7B26\u5E72\u5C16 / \u671D\u4E0B\u65F6\u8DF3\u97F3\u4FDD\u6301\u4E4B\u4E0A\uFF09\u53D6\u66F4\u9AD8\u7684\n        let yS = Math.min(yOf(row, TOP_LINE + 2), below ? (tipOf.get(c) ?? yOf(row, dHi + 7)) - P(1.1) : yOf(row, d));\n        for (const a of ([\"accent\", \"marcato\", \"stress\", \"unstress\"] as const).filter((x) => c.art.includes(x))) {\n          const m = ART_GLYPH[a];\n          prims.push({ tok: tokOf(c), t: \"glyph\", x: cx - P(m.w / 2), y: yS + P(m.h / 2), ch: m.above, cls: artCls(a) });\n          yS -= P(1.5);\n        }\n        // \u97F3\u5185\u7684\u8D77\u4F0F\uFF08< / > / <>\uFF09\uFF1A\u91CC\u9053\uFF0C\u8FD9\u4E2A\u97F3\u81EA\u5DF1\u7684\u5BBD\u5EA6\u91CC\u4E00\u4E2A\u5C0F\u53D1\u5939\uFF08sfz / fp \u5728\u540C\u4E00\u9053\u7684\u524D\u9762\uFF09\uFF1B\u505A\u4E0D\u5230\u7684\uFF08canSwell = false \u7684 < / <>\uFF09\u753B\u7070\n        const swl = c.j === 0 ? swellOf(tokens[c.index]) : undefined;   // \u97F3\u5185\u8D77\u4F0F = \u6F14\u594F\u6CD5\u91CC\u7684\u90A3\u4E00\u7EC4\uFF08v0.9.44\uFF09\n        if (swl) {\n          const y = (noteDynYAt.get(rowOf(c.system, r, 0)) ?? yOf(RW(c), TOP_LINE + 2.4)) - P(0.5), xa = nhX(c) + (c.art.some((a) => a === \"sfz\" || a === \"fp\") ? P(2.4) : 0), xb = Math.max(xa + P(1.6), nhX(c) + P(c.w) - P(0.8)), H = P(0.35);\n          const cl = [\"hairpin\", ign.has(swl === \">\" ? \"swellFade\" : \"swellGrow\") ? \"art-mute\" : \"\"].filter(Boolean).join(\" \"), mx = (xa + xb) / 2;\n          const d = swl === \"<\" ? `M${xb},${y - H}L${xa},${y}L${xb},${y + H}` : swl === \">\" ? `M${xa},${y - H}L${xb},${y}L${xa},${y + H}` : `M${xa},${y}L${mx},${y - H}L${xb},${y}M${xa},${y}L${mx},${y + H}L${xb},${y}`;\n          prims.push({ t: \"path\", d, cls: cl });\n        }\n        // \u7436\u97F3\uFF08v0.9.45\uFF09\uFF1A\u548C\u5F26\u5DE6\u8FB9\uFF08\u4E34\u65F6\u8BB0\u53F7\u518D\u5DE6\u8FB9\uFF09\u4E00\u6761\u7AD6\u7684\u6CE2\u6D6A\u7EBF\uFF0C\u4ECE\u6700\u4F4E\u7684\u7B26\u5934\u5230\u6700\u9AD8\u7684\uFF1B\u505A\u4E0D\u5230\u7684\uFF08\u5355\u58F0\u7684\u6B4C\u624B\uFF09\u753B\u7070\n        if (c.art.includes(\"arpeggio\")) {\n          const yTop = yOf(row, dHi) - P(0.7), yBot = yOf(row, dLo) + P(0.7), x0 = nhX(c) - P(c.accW + 0.9), amp = P(0.28), step = P(0.5);\n          let dd = `M${x0},${yBot}`; for (let y = yBot, k = 0; y > yTop; y -= step, k++) dd += `Q${x0 + (k % 2 ? -amp : amp) * 2},${y - step / 2} ${x0},${Math.max(yTop, y - step)}`;\n          prims.push({ tok: tokOf(c), t: \"path\", d: dd, cls: [\"arpeggio\", ign.has(\"arpeggio\") ? \"art-mute\" : \"\", cls ?? \"\"].filter(Boolean).join(\" \") });\n        }\n        // \u7A81\u5F3A / \u5F3A\u540E\u5373\u5F31\uFF1A\u97F3\u5934\u7684\u529B\u5EA6\u5F62\u72B6\uFF0C\u753B\u5728\u91CC\u9053\uFF08\u97F3\u7684\u4FEE\u9970\u90A3\u4E00\u9053\uFF09\u3001\u548C\u8FD9\u4E2A\u97F3\u5DE6\u5BF9\u9F50\n        for (const a of ([\"sfz\", \"fp\"] as const).filter((x) => c.art.includes(x)))\n          prims.push({ tok: tokOf(c), t: \"glyph\", x: nhX(c) - P(0.2), y: noteDynYAt.get(rowOf(c.system, r, 0)) ?? yOf(RW(c), TOP_LINE + 2.4), ch: a === \"sfz\" ? \"\\u{E539}\" : \"\\u{E534}\", cls: [\"dyn\", ign.has(a) ? \"art-mute\" : \"\", cls ?? \"\"].filter(Boolean).join(\" \") });\n        if (c.breath) prims.push({ tok: tokOf(c), t: \"glyph\", x: nhX(c) + nhW(c) + P(0.55), y: yOf(row, TOP_LINE + 1), ch: GLYPH_BREATH, cls: [\"breath\", ign.has(\"breath\") ? \"art-mute\" : \"\", cls ?? \"\"].filter(Boolean).join(\" \") });\n        // \u51FA\u58F0\u7684\u6362\u6C14\uFF1A\u9017\u53F7\u540E\u9762\u4E00\u4E2A\u5C0F\u5B57\u300C\u5438\u300D/\u300C\u6DF1\u5438\u300D\uFF08\u51FA\u7248\u8C31\u7684\u505A\u6CD5 = \u9017\u53F7 + \u6587\u5B57\uFF1B\u6CA1\u6709\u901A\u7528\u7684\u5355\u4E2A\u8BB0\u53F7\uFF09\uFF1B\u505A\u4E0D\u5230\u7684\u4EBA\u753B\u7070\n        if (c.breath && c.inhale) prims.push({ tok: tokOf(c), t: \"text\", x: nhX(c) + nhW(c) + P(1.35), y: yOf(row, TOP_LINE + 1) + P(0.45), s: c.inhale === \"big\" ? \"\u6DF1\u5438\" : \"\u5438\", cls: [\"breath-label\", ign.has(\"inhale\") ? \"art-mute\" : \"\", cls ?? \"\"].filter(Boolean).join(\" \"), size: P(1.15), anchor: \"start\" });\n      }\n      // 8. \u8FDE\u97F3\u7EBF\uFF1A\u540C\u4E00\u4E2A token \u62C6\u5F00\u7684\u51E0\u6BB5\u4E4B\u95F4 + \u6570\u636E\u91CC\u7684 tie\uFF08\u8FDE\u7740\u524D\u4E00\u4E2A\u97F3\uFF09\u3002\u8DE8\u884C = \u4E24\u534A\uFF1A\u8FD9\u4E00\u884C\u4ECE\u97F3\u5230\u884C\u5C3E\u3001\u4E0B\u4E00\u884C\u4ECE\u884C\u5934\u5230\u97F3\n      //   \uFF082026-10-08 Opus 5.5\uFF0Cuser\u300C\u8DE8\u884C\u7684\u8FDE\u97F3\u7B26\u663E\u793A\u4E0D\u6B63\u5E38\u300D\u2014\u2014\u4EE5\u524D\u8DE8\u884C\u7684\u6574\u6761\u4E0D\u753B\uFF09\n      const tieArc = (row: number, d: number, x1: number, x2: number, ghost: boolean) => {\n        const sgn = d < MID_LINE ? 1 : -1, y = yOf(row, d) + sgn * P(0.8), h = Math.min(P(1.0), Math.abs(x2 - x1) * 0.25);   // \u77ED\u7684\uFF08\u884C\u5934\u90A3\u534A\u622A\uFF09\u538B\u6241\u4E00\u70B9\uFF0C\u522B\u50CF\u4E2A\u300C^\u300D\n        prims.push({ t: \"path\", d: `M${x1},${y}Q${(x1 + x2) / 2},${y + sgn * h} ${x2},${y}`, cls: ghost ? \"tie ghost\" : \"tie\" });\n      };\n      const tieBetween = (a: Chunk, b: Chunk) => {\n        if (a.staff !== b.staff || !a.pitch || !b.pitch) return;\n        const da = dIdx(a.pitch, a.staff, a.index), db = dIdx(b.pitch, b.staff, b.index);\n        if (a.system === b.system) { tieArc(RW(b), db, nhX(a) + nhW(a) * 0.8, nhX(b) + nhW(b) * 0.2, b.ghost); return; }\n        tieArc(RW(a), da, nhX(a) + nhW(a) * 0.8, Math.max(nhX(a) + nhW(a) * 0.8 + P(2), P(right) - P(0.3)), b.ghost);   // \u884C\u5C3E\u5F00\u53E3\n        tieArc(RW(b), db, Math.max(P((sysStarts[b.system] ?? 0) - 1.6), nhX(b) - P(3)), nhX(b) + nhW(b) * 0.2, b.ghost);      // \u884C\u5934\u5F00\u53E3\uFF08\u4ECE\u8C03\u53F7\u90A3\u513F\u8D77\uFF09\n      };\n      const realChunks = units.filter((u): u is Chunk => u.kind === \"chunk\");\n      for (let n = 1; n < realChunks.length; n++) {\n        const a = realChunks[n - 1], b = realChunks[n];\n        if (!a.note || !b.note) continue;\n        if ((b.j > 0 && a.index === b.index) || (b.tie && a.last)) tieBetween(a, b);\n      }\n      // 8\u00BD. \u8FDE\u7EBF\uFF082026-10-08 \u8FDE\u65AD\uFF09\uFF1A\u4E00\u4E32\u300C\u8FDE\u5230\u4E0B\u4E00\u4E2A\u300D\u7684\u97F3 = \u4E00\u6761\u5F27\uFF0C\u4ECE\u7B2C\u4E00\u4E2A\u97F3\u7684\u7B26\u5934\u5230\u88AB\u8FDE\u5230\u7684\u90A3\u4E2A\u97F3\u7684\u7B26\u5934\uFF1B\u753B\u5728\u7B26\u5E72\u7684\u53E6\u4E00\u4FA7\u3001\u8D8A\u8FC7\u4E2D\u95F4\u7684\u97F3\uFF1B\n      //   \u8DE8\u884C = \u6BCF\u884C\u4E00\u6BB5\uFF08\u884C\u5C3E / \u884C\u5934\u5F00\u53E3\uFF09\u3002\u53F0\u4E0A\u90A3\u4F4D\u4E0D\u8BA4\uFF08\u6708\u8BFB\u8FD8\u6CA1\u63A5 / \u672C\u6765\u5C31\u4E0D\u7559\u7F1D\uFF09= \u753B\u7070\uFF08user\u300C\u6F14\u594F\u8005\u4E0D\u8BA4\u7684\u8BB0\u53F7\u4E5F\u53D8\u7070\u300D\uFF09\n      const headOf = new Map<number, Chunk>();\n      for (const c of realChunks) if (c.note && c.j === 0 && !headOf.has(c.index)) headOf.set(c.index, c);\n      const noteIdx = [...headOf.keys()].sort((x, y) => x - y), slurOf = (k: number) => !!(tokens[noteIdx[k]] as NoteTok).slur;\n      const ext = (c: Chunk, below: boolean) => { const ds = (c.pitches.length ? c.pitches : [c.pitch!]).map((pp) => dIdx(pp, c.staff, c.index)); return yOf(RW(c), below ? Math.min(...ds) : Math.max(...ds)); };\n      for (let k = 0; k < noteIdx.length; k++) {\n        if (!slurOf(k) || (k > 0 && slurOf(k - 1))) continue;   // \u4E00\u4E32\u7684\u5934\n        let e = k; while (e < noteIdx.length - 1 && slurOf(e)) e++;\n        if (e === k) continue;                                  // \u540E\u9762\u6CA1\u6709\u97F3\u53EF\u8FDE\n        const run = noteIdx.slice(k, e + 1).map((x) => headOf.get(x)!).filter((c) => c.pitch), below = upOf.get(run[0]) ?? false, sgn = below ? 1 : -1;\n        const groups: Chunk[][] = [];\n        for (const c of run) { const g = groups[groups.length - 1]; if (g && g[0].system === c.system) g.push(c); else groups.push([c]); }\n        groups.forEach((g, gi) => {\n          const f = g[0], l = g[g.length - 1], openL = gi > 0, openR = gi < groups.length - 1;\n          const xa = openL ? nhX(f) - P(2) : nhX(f) + nhW(f) / 2, xb = openR ? nhX(l) + nhW(l) + P(2) : nhX(l) + nhW(l) / 2;\n          if (xb - xa < P(1)) return;\n          const ya = ext(f, below) + sgn * P(1.2), yb = ext(l, below) + sgn * P(1.2);\n          const peak = g.map((c) => ext(c, below) + sgn * P(2.2)), cy = below ? Math.max(ya, yb, ...peak) + P(0.6) : Math.min(ya, yb, ...peak) - P(0.6);\n          prims.push({ t: \"path\", d: `M${xa},${ya}C${xa + (xb - xa) * 0.2},${cy} ${xb - (xb - xa) * 0.2},${cy} ${xb},${yb}`, cls: [\"slur\", ign.has(\"slur\") ? \"art-mute\" : \"\"].filter(Boolean).join(\" \") });\n        });\n      }\n      // 8\u00BE. \u6E10\u5F3A\u6E10\u5F31\uFF08\u8BB0\u53F7\uFF0C2026-10-08\uFF09\uFF1A\u4ECE\u8FD9\u4E2A\u8BB0\u53F7\u753B\u5230\u7EC8\u70B9\u2014\u2014\u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\uFF08\u8BA9\u5F00\u5B83\u7684\u5B57\uFF09/ \u4E0B\u4E00\u4E2A\u6E10\u5F3A\u6E10\u5F31\uFF1B\u90FD\u6CA1\u6709 = \u753B\u5230\u8FD9\u5F20\u7EB8\u6700\u540E\u4E00\u4E2A\u97F3\uFF0C\n      //   \u540E\u9762\u7070\u5B57\u300C(f)\u300D= \u8D70\u4E00\u6863\u63A8\u5B9A\u7684\u7EC8\u70B9\uFF08user\u300C\u8D70\u4E00\u6863\u4E5F\u884C\uFF0C\u66F4\u5408\u7406\uFF0C\u9700\u8981\u5411\u7528\u6237\u62AB\u9732\u300D\uFF09\u3002\u8DE8\u884C = \u6BCF\u884C\u753B\u5B83\u90A3\u4E00\u4EFD\u5F00\u53E3\uFF08\u6309\u6A2A\u5411\u957F\u5EA6\u5206\uFF09\u3002\n      //   \u548C\u4E24\u5934\u7684\u529B\u5EA6\u5B57\u4E4B\u95F4\u7559\u7A7A\uFF08user 2026-10-08\u300C< \u53F7\u4E0D\u7528\u9760\u7740\u4E00\u70B9\u7A7A\u9699\u90FD\u6CA1\u6709\u300D\uFF1A\u6309\u91CF\u8FC7\u7684\u58A8\u8FF9\u8BA9\u5F00 PIN_GAP\uFF09\uFF1B\u6BD4\u4E00\u6574\u884C\u8FD8\u957F = \u5199\u6210\u300Ccresc. - - -\u300D\uFF08PIN_WORD\uFF09\u3002\n      const LEVELS = DYNS;   // ppp\u2026fff\uFF08v0.9.23\uFF09\uFF1A\u8D70\u4E00\u6863\u63A8\u5B9A\u7684\u7070\u5B57\u4E5F\u80FD\u63A8\u5230 ppp / fff\n      const lastChunk = [...units].reverse().find((u): u is Chunk => u.kind === \"chunk\");\n      // \u53D1\u5939\uFF08\u6216\u592A\u957F\u65F6\u7684\u300Ccresc. - - -\u300D\uFF09\u4ECE (s0, startX) \u753B\u5230 (s1, endX)\uFF1A\u8DE8\u884C\u6BCF\u884C\u4E00\u6BB5\uFF08\u6309\u6A2A\u5411\u957F\u5EA6\u5206\u5F00\u53E3\uFF09\uFF1Bindex = \u70B9\u5B83\u5F00\u54EA\u4E2A\u8BB0\u53F7\u7684\u5C0F\u83DC\u5355\uFF1B\n      //   ramp = \u6E10\u5230\u753B\u7684\uFF08\u865A\u7EBF\uFF1B2026-10-08 \u6DF1\u591C Opus 5.5\uFF0Cuser\u300C\u6E10\u5230\u2026\u548C\u624B\u52A8\u52A0\u7684\u53EF\u4EE5\u5206\u5F00\u6765\u300D\u300C\u5982\u4F55\u4E0D\u6DF7\u6DC6\u7684\u641E\u6E05\u695A<\u5230\u5E95\u662F\u54EA\u91CC\u5F00\u59CB\u7684\u300D\u2014\u2014\u624B\u5199\u7684\u5B9E\u7EBF\u3001\u6E10\u5230\u865A\u7EBF\uFF0C\u90FD\u4ECE\u770B\u5F97\u89C1\u7684\u8BB0\u53F7\u8D77\uFF09\n      const drawWedge = (index: number, dir: \"cresc\" | \"dim\", s0: number, startX: number, s1: number, endX: number, ramp: boolean) => {\n        const leftOf = (sy: number) => Math.min(...units.filter((u): u is Chunk => u.kind === \"chunk\" && u.system === sy).map((c) => nhX(c)), P(right)) - P(1);\n        const segs: [number, number, number][] = [];\n        for (let sy = s0; sy <= s1; sy++) segs.push([sy, sy === s0 ? startX : leftOf(sy), sy === s1 ? endX : P(right) - P(0.3)]);\n        const total = segs.reduce((n, [, a, b]) => n + Math.max(0, b - a), 0) || 1, H = P(0.5);\n        const midY = (sy: number) => (dynYAt.get(rowOf(sy, r, 0)) ?? yOf(rowOf(sy, r, 0), TOP_LINE + 2.4)) - P(0.5);   // \u53D1\u5939 / \u865A\u7EBF\u7684\u4E2D\u7EBF\uFF1A\u529B\u5EA6\u5B57\u7684\u534A\u8170\n        if (total > P(right - MARGIN)) {   // \u592A\u957F\uFF1A\u300Ccresc.\u300D+ \u865A\u7EBF\uFF0C\u8DE8\u884C\u63A5\u7740\u753B\u865A\u7EBF\n          const word = dir === \"cresc\" ? \"cresc.\" : \"dim.\", ww = P(PIN_WORD.w[dir === \"cresc\" ? \"cresc\" : \"dim\"]);\n          let said = false;\n          for (const [sy, a0, b] of segs) {\n            if (b - a0 < P(0.3)) continue;\n            let a = a0;\n            if (!said && b - a >= ww + P(1)) {   // \u7B2C\u4E00\u6BB5\u653E\u5F97\u4E0B\u5B57\u624D\u5199\uFF08\u884C\u5C3E\u5269\u4E00\u70B9\u70B9 = \u5B57\u632A\u5230\u4E0B\u4E00\u884C\u5F00\u5934\uFF09\n              prims.push({ t: \"text\", x: a, y: midY(sy) + P(0.5), s: word, tok: tokens[index].id, cls: [\"dyn-word\", ramp ? \"ramp\" : \"\"].filter(Boolean).join(\" \"), size: P(PIN_WORD.size), anchor: \"start\" });\n              a += ww + P(0.6); said = true;\n            }\n            for (let x = a; x + P(DASH.len) <= b; x += P(DASH.len + DASH.gap)) prims.push({ t: \"line\", x1: x, y1: midY(sy), x2: x + P(DASH.len), y2: midY(sy), w: P(0.12), cls: \"dyn-dash\" });\n            dyns.push({ index, kind: \"hairpin\", system: rowOf(sy, r, 0), x: a0, y: midY(sy) - P(1.4), w: b - a0, h: P(2.8) });\n          }\n        } else {\n          let acc = 0;\n          for (const [sy, a, b] of segs) {\n            if (b - a < P(0.3)) continue;\n            const f0 = acc / total, f1 = (acc + b - a) / total; acc += b - a;\n            const [h0, h1] = dir === \"cresc\" ? [H * f0, H * f1] : [H * (1 - f0), H * (1 - f1)], y = midY(sy);\n            // \u6E10\u5230 = \u865A\u7EBF\uFF1A\u4E24\u6761\u8FB9\u7684\u6BCF\u4E00\u5C0F\u6BB5\u5728\u540C\u4E00\u4E2A x \u4E0A\uFF08\u4EE5\u524D\u9760 CSS stroke-dasharray\u2014\u2014iPad Safari \u4E0A\u7B2C\u4E8C\u6761\u8FB9\u7684\u865A\u7EBF\u63A5\u7740\u7B2C\u4E00\u6761\u7684\u76F8\u4F4D\u8D70\uFF0C\n            //   \u5C16\u5934\u90A3\u8FB9\u4E24\u6761\u5FEB\u91CD\u5408\u65F6\u4E00\u6BB5\u6BB5\u9519\u5F00\u6253\u67B6\uFF0Cuser\u300C\u874C\u86AA\u7684\u5C3E\u5DF4\u5728\u6253\u67B6\u300D\uFF0Cv0.10.26\uFF09\u3002PDF / SVG \u5BFC\u51FA\u4E5F\u5C31\u4E00\u6837\u662F\u865A\u7EBF\u4E86\n            let d = `M${a},${y - h0}L${b},${y - h1}M${a},${y + h0}L${b},${y + h1}`;\n            if (ramp) {\n              const hAt = (x: number) => h0 + (h1 - h0) * ((x - a) / (b - a)), on = P(RAMP_DASH.len), per = P(RAMP_DASH.len + RAMP_DASH.gap);\n              d = \"\";\n              for (let x = a; x < b - P(0.05); x += per) { const x2 = Math.min(b, x + on); d += `M${x},${y - hAt(x)}L${x2},${y - hAt(x2)}M${x},${y + hAt(x)}L${x2},${y + hAt(x2)}`; }\n            }\n            prims.push({ tok: tokens[index].id, t: \"path\", d, cls: [\"hairpin\", ramp ? \"ramp\" : \"\"].filter(Boolean).join(\" \") });\n            dyns.push({ index, kind: \"hairpin\", system: rowOf(sy, r, 0), x: a, y: y - P(1.4), w: b - a, h: P(2.8) });\n          }\n        }\n      };\n      units.forEach((h, hi) => {\n        if (h.kind !== \"hairpin\" || !lastChunk) return;\n        // \u7D27\u6328\u5728\u524D\u9762\u7684\u529B\u5EA6\u8BB0\u53F7\uFF08mp < \u8FD9\u79CD\uFF09\uFF1A\u4ECE\u5B83\u7684\u5B57\u540E\u9762\u8D77\u753B\uFF0C\u522B\u538B\u5728\u5B57\u4E0A\n        const prevU = units[hi - 1];\n        const dynBefore = prevU && prevU.kind === \"dyn\" && prevU.system === h.system ? prevU : null;\n        const startX = Math.max(P(h.x + 0.3), dynBefore ? P(dynBefore.x + 0.3 + DYN_INK[dynBefore.value][1] + PIN_GAP) : 0), s0 = h.system;\n        const endU = units.slice(hi + 1).find((u) => u.kind === \"dyn\" || u.kind === \"hairpin\");\n        // \u7EC8\u70B9\u7684\u529B\u5EA6\u548C\u65B9\u5411\u53CD\u7740\uFF08\u6E10\u5F31\u540E\u9762\u66F4\u5F3A / \u4E00\u6837\uFF09= \u65B9\u5411\u8BF4\u4E86\u7B97\uFF1A\u8D70\u4E00\u6863\u3001\u5230\u90A3\u513F\u7A81\u53D8\uFF08perform.ts dynLevels\uFF09\u2192 \u53D1\u5939\u672B\u7AEF\u7167\u6837\u753B\u7070\u5B57\u63A8\u5B9A\u7684\u90A3\u4E00\u6863\uFF0C\u8BA9\u5F00\u5B83\uFF082026-10-08 user\u300C\u540C\u610F\u300D\uFF09\n        let curDyn: string = \"mf\"; for (let j = h.index - 1; j >= 0; j--) { const u = tokens[j]; if (u.kind === \"dyn\") { curDyn = u.value; break; } }\n        const ci = LEVELS.indexOf(curDyn as (typeof LEVELS)[number]), against = !!endU && endU.kind === \"dyn\" && (h.dir === \"cresc\" ? LEVELS.indexOf(endU.value) <= ci : LEVELS.indexOf(endU.value) >= ci);\n        const IMPLIED_W = 3;   // \u7070\u5B57\u300C(mp)\u300D\u5927\u6982\u591A\u5BBD\uFF08sp\uFF0C1.3 \u53F7\u659C\u4F53\uFF09\n        const endX = endU ? P(endU.x + 0.3 + (endU.kind === \"dyn\" ? DYN_INK[endU.value][0] : 0) - PIN_GAP - (against ? IMPLIED_W + 0.4 : 0)) : nhX(lastChunk) + nhW(lastChunk) + P(0.8), s1 = endU ? endU.system : lastChunk.system;   // \u7EC8\u70B9\u7684\u5B57\u753B\u5728 x + 0.3\n        if (s1 < s0) return;\n        // \u592A\u77ED\u4E5F\u7167\u6837\u753B\uFF08\u4EE5\u524D\u4E0D\u5230 1 \u4E2A\u95F4\u8DDD\u5C31\u6574\u6761\u4E0D\u753B = \u9759\u9ED8\u6CA1\u4E86\uFF09\uFF1A\u81F3\u5C11 MIN_PIN\uFF1B\u7070\u5B57\u653E\u4E0D\u4E0B\u5C31\u632A\u5230\u53D1\u5939\u672B\u7AEF\u4E0A\u9762\n        let endXd = endX, labelAbove = false;\n        const MIN_PIN = P(1.4);\n        if (s1 === s0 && endXd - startX < MIN_PIN) {\n          const roomy = against ? endXd + P(IMPLIED_W + 0.4) : endXd;   // \u4E0D\u8BA9\u7070\u5B57\u5360\u5730\u65B9\u65F6\u80FD\u6709\u591A\u957F\n          if (against) labelAbove = true;\n          endXd = Math.max(startX + MIN_PIN, Math.min(roomy, startX + MIN_PIN * 2));\n        }\n        drawWedge(h.index, h.dir, s0, startX, s1, endXd, false);\n        if (!endU || against) {   // \u63A8\u5B9A\u7684\u7EC8\u70B9\uFF1A\u73B0\u5728\u7684\u529B\u5EA6\u5F80\u4E0A / \u5F80\u4E0B\u4E00\u6863\uFF08\u6CA1\u6709\u7EC8\u70B9 / \u7EC8\u70B9\u548C\u65B9\u5411\u53CD\u7740\uFF09\n          const k = Math.max(0, Math.min(LEVELS.length - 1, ci + (h.dir === \"cresc\" ? 1 : -1)));\n          prims.push({ t: \"text\", x: labelAbove ? endXd - P(1.2) : endXd + P(0.4), y: (dynYAt.get(rowOf(s1, r, 0)) ?? yOf(rowOf(s1, r, 0), TOP_LINE + 2.4)) + P(labelAbove ? -1.9 : 0.1), s: `(${LEVELS[k]})`, cls: \"dyn-implied\", size: P(1.3), anchor: \"start\" });\n        }\n      });\n      // 8\u215E. \u6E10\u5230\uFF1A\u5199\u7740\u300C\u4ECE\u4E0A\u4E00\u4E2A\u6E10\u53D8\u8FC7\u6765\u300D\u7684\u529B\u5EA6\u8BB0\u53F7 = \u4ECE\u4E0A\u4E00\u4E2A\u529B\u5EA6\u5B57\u540E\u9762\u753B\u4E00\u6761\u865A\u7EBF\u53D1\u5939\u5230\u5B83\u524D\u9762\uFF08\u65B9\u5411\u6309\u4E24\u4E2A\u529B\u5EA6\u7684\u9AD8\u4F4E\uFF1B\u4E00\u6837\u9AD8 = \u4E0D\u753B\uFF0C\u6E10\u5230\u4E0D\u8D77\u4F5C\u7528\uFF09\u3002\n      //   \u524D\u9762\u6CA1\u6709\u529B\u5EA6\u8BB0\u53F7 / \u4E2D\u95F4\u9694\u7740\u624B\u5199\u7684\u6E10\u5F3A\u6E10\u5F31 = \u4E0D\u753B\uFF08\u624B\u5199\u7684\u8BF4\u4E86\u7B97\uFF1B\u5C0F\u83DC\u5355\u91CC\u90A3\u4E2A\u5F00\u5173\u753B\u7070\u3001\u8BF4\u4E3A\u4EC0\u4E48\u2014\u2014perform.ts \u4E5F\u4E0D\u6E10\uFF09\n      for (const u of units) {\n        if (u.kind !== \"dyn\" || !(tokens[u.index] as { ramp?: true }).ramp) continue;\n        const src = rampSource(tokens, u.index); if (typeof src !== \"number\") continue;\n        const pu = units.find((x): x is DynU => x.kind === \"dyn\" && x.index === src); if (!pu) continue;\n        const a = LEVELS.indexOf(pu.value as (typeof LEVELS)[number]), b = LEVELS.indexOf(u.value as (typeof LEVELS)[number]); if (a === b) continue;\n        const sx = P(pu.x + 0.3 + DYN_INK[pu.value][1] + PIN_GAP);\n        let ex = P(u.x + 0.3 + DYN_INK[u.value][0] - PIN_GAP);\n        if (u.system === pu.system && ex - sx < P(1.4)) ex = sx + P(1.4);\n        if (u.system < pu.system) continue;\n        drawWedge(u.index, b > a ? \"cresc\" : \"dim\", pu.system, sx, u.system, ex, true);\n      }\n      // 9. \u6B4C\u8BCD\u8FDE\u5B57\u7B26\uFF08\u82F1\u6587\u65AD\u5F00\u7684\u97F3\u8282\uFF09\uFF1A\u753B\u5728\u4E24\u4E2A\u6B4C\u8BCD\u4E2D\u95F4\n      for (let n = 0; n < partLyrics.length; n++) {\n        const L = partLyrics[n], tok = tokens[L.index] as NoteTok;\n        if (!tok.hyph) continue;\n        const R = partLyrics[n + 1];\n        const xx = R && R.system === L.system ? (L.x + R.x) / 2 : L.x + P(1.6);\n        prims.push({ t: \"text\", x: xx, y: L.y, s: \"-\", cls: \"lyric hyphen\" });\n      }\n      lyrics.push(...partLyrics);\n      // 10. \u8FDE\u97F3\u62EC\u53F7\uFF1A\u540C\u4E00\u6BD4\u4F8B\u8FDE\u7740\u7684\u4E00\u4E32\uFF0C\u51D1\u6EE1\u300Cm \u4E2A\u6700\u5C0F\u5199\u51FA\u5355\u4F4D\u300D\u5C31\u6536\u4E00\u7EC4\u3002\u4E00\u7EC4\u8DE8\u884C\uFF082026-10-08 Opus 5.5\uFF0Cuser\u300C\u8DE8\u884C\u7684\u8FDE\u97F3\u7B26\u663E\u793A\u4E0D\u6B63\u5E38\u300D\uFF09=\n      //   \u7167\u6837\u63A5\u7740\u6570\uFF08\u4EE5\u524D\u5230\u884C\u5C3E\u5C31\u6536\u7EC4\u3001\u4E0B\u4E00\u884C\u4ECE\u5934\u6570\uFF0C\u540E\u9762\u7684\u7EC4\u5168\u9519\u4F4D\uFF09\uFF0C\u6BCF\u884C\u753B\u4E00\u6BB5\u62EC\u53F7\uFF1A\u8FD9\u4E00\u884C\u53F3\u8FB9\u5F00\u53E3\u3001\u5E26\u6570\u5B57\uFF0C\u4E0B\u4E00\u884C\u5DE6\u8FB9\u5F00\u53E3\n      const bracket = (cs: Chunk[], openL: boolean, openR: boolean, num: boolean) => {\n        const row = RW(cs[0]), n = cs[0].ratio![0];\n        const xa = openL ? Math.min(nhX(cs[0]) - P(1.2), nhX(cs[0])) : nhX(cs[0]), last = cs[cs.length - 1], xb = openR ? nhX(last) + nhW(last) + P(1.2) : nhX(last) + nhW(last);\n        const top = Math.min(...cs.map((c) => Math.min(c.pitch ? yOf(row, dIdx(c.pitch, c.staff, c.index)) : yOf(row, MID_LINE), tipOf.get(c) ?? Infinity)), yOf(row, TOP_LINE)) - P(1.6);\n        const mid = (xa + xb) / 2, gap = num ? P(1.0) : 0;\n        const left = openL ? `M${xa},${top}` : `M${xa},${top + P(0.6)}L${xa},${top}`, right = openR ? `L${xb},${top}` : `L${xb},${top}L${xb},${top + P(0.6)}`;\n        prims.push({ t: \"path\", d: num ? `${left}L${mid - gap},${top}M${mid + gap},${top}${right}` : `${left}${right}`, cls: \"tuplet-bracket\" });\n        if (num) prims.push({ t: \"glyph\", x: mid - P(0.55), y: top + P(0.55), ch: GLYPH_TUPLET(n), cls: \"tuplet\" });\n      };\n      let run: Chunk[] = [], runRatio: string | null = null, acc = 0, minBase = Infinity, segStart = 0;\n      const flushSeg = (openR: boolean) => { const cs = run.slice(segStart); if (cs.length && cs[0].ratio) bracket(cs, segStart > 0, openR, segStart === 0); segStart = run.length; };\n      const closeRun = () => { if (run.length) flushSeg(false); run = []; runRatio = null; acc = 0; minBase = Infinity; segStart = 0; };\n      for (const c of realChunks) {\n        const rr = c.ratio ? c.ratio.join(\":\") : null;\n        if (rr !== runRatio || (run.length && c.staff !== run[0].staff)) closeRun();\n        else if (run.length && c.system !== run[run.length - 1].system) flushSeg(true);   // \u8DE8\u884C\uFF1A\u8FD9\u4E00\u884C\u5148\u753B\u5230\u884C\u5C3E\uFF08\u53F3\u8FB9\u5F00\u53E3\uFF09\uFF0C\u7EC4\u63A5\u7740\u6570\n        if (!rr) continue;\n        run.push(c); runRatio = rr; acc += c.ticks; minBase = Math.min(minBase, c.base);\n        if (acc >= c.ratio![1] * minBase - 1e-6) closeRun();\n      }\n      closeRun();\n      // 11. \u5149\u6807\u843D\u70B9\uFF08\u70B9\u5728\u54EA\u4E2A\u7A7A\u9699\uFF09\u2014\u2014\u6BCF\u6761 track \u90FD\u6709\uFF08\u70B9\u5230\u522B\u7684\u58F0\u90E8 = \u6362\u5230\u90A3\u6761\uFF09\n      const H = headLen(tokens);\n      const firstUnitOf = new Map<number, Unit>();\n      for (const u of units) if (u.kind !== \"head\" && u.index >= 0 && !firstUnitOf.has(u.index)) firstUnitOf.set(u.index, u);\n      const realLen = q.realLen;\n      for (let c = H; c <= realLen; c++) {   // \u5927\u8C31\u8868\uFF1A\u4E24\u6761\u8C31\u8868\u4E0A\u90FD\u653E\u843D\u70B9\uFF08\u70B9\u54EA\u6761\u90FD\u662F\u8FD9\u4E2A\u58F0\u90E8\uFF09\uFF1B\u8865\u9F50\u7684\u90A3\u6BB5\u53E6\u653E\uFF08\u4E0B\u9762\uFF09\n        const u = c < tokens.length ? firstUnitOf.get(c) : undefined;\n        const last = u ? null : [...units].reverse().find((v) => v.kind !== \"head\");\n        const sys = u ? u.system : last ? last.system : 0, x = u ? P(u.x) : last ? P(last.x + last.w) : P(sysStarts[0]);\n        for (let k = 0; k < q.staves; k++) slots.push({ caret: c, system: rowOf(sys, r, k), x });\n      }\n      // 11\u00BD. \u5199\u5B57\u5934\u753B\u5728\u54EA\uFF08W-17 \u7B2C 1 \u5200\uFF0C2026-10-15\uFF09\uFF1A\u6392\u7248\u4E0D\u8BA4\u5149\u6807\uFF0C\u53EA\u7ED9\u6BCF\u4E2A caret \u4F4D\u7F6E\u8BE5\u753B\u7684\u5730\u65B9\u3002\u8001\u89C4\u77E9\uFF08\u539F\u6765\u96F6\u5BBD head \u5355\u5143\u7684 SLOT = 4\uFF09\uFF1A\n      //   \u540C\u4E00 tick \u4E0A\u6392\u5728\u5C0F\u8282\u7EBF / \u8BB0\u53F7\uFF08\u53E5\u53F7 / \u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6 / \u529B\u5EA6\u2026\uFF09\u540E\u9762\u3001\u97F3\u524D\u9762\u2014\u2014\u5149\u6807\u505C\u5728\u884C\u672B\u7684\u5C0F\u8282\u7EBF\u524D = \u753B\u5728\u4E0B\u4E00\u884C\u5F00\u5934\uFF082026-10-10 user\u300C\u5149\u6807\u5E94\u8BE5\u5728\u6BCF\u884C\u7684\u5F00\u5934\u300D\uFF09\uFF1B\n      //   \u90A3\u4E00 tick \u4E0A\u6CA1\u6709\u97F3 = \u6392\u5728\u8FD9\u4E00 tick \u6700\u540E\u4E00\u4E2A\u5355\u5143\u540E\u9762\uFF1B\u5C3E\u5DF4 = \u6700\u540E\u4E00\u4E2A\u5355\u5143\u540E\u9762\u3002shift = \u524D\u4E00\u4E2A\u97F3\u5904\u7684\u8C31\u53F7 / \u516B\u5EA6\u7EBF\u4F4D\u79FB\uFF08\u540C\u539F\u6765\u7684 head.shift\uFF09\n      const shiftAt = (c: number): number[] => { const kk = Math.min(c, realLen) - 1, si = kk >= H ? kk : -1; return Array.from({ length: q.staves }, (_, k) => shAt(q, (k + 1) as Staff, si)); };\n      for (let c = H; c <= realLen; c++) {\n        const u0 = c < tokens.length ? firstUnitOf.get(c) : undefined;\n        let sys: number, x: number;\n        if (!u0) { const last = [...units].reverse().find((v) => v.kind !== \"head\"); sys = last ? last.system : 0; x = last ? P(last.x + last.w) : P(sysStarts[0]); }\n        else if (u0.kind === \"chunk\") { sys = u0.system; x = P(u0.x); }\n        else {\n          const T = u0.tick, ch = units.find((v) => v.kind === \"chunk\" && v.index >= c && Math.abs(v.tick - T) < 1e-6);\n          if (ch) { sys = ch.system; x = P(ch.x); }\n          else { const same = units.filter((v) => v.kind !== \"head\" && v.index >= c && Math.abs(v.tick - T) < 1e-6), lastT = same[same.length - 1] ?? u0; sys = lastT.system; x = P(lastT.x + lastT.w); }\n        }\n        const sh = shiftAt(c);\n        for (let k = 0; k < q.staves; k++) heads.push({ caret: c, system: rowOf(sys, r, k), x, shift: sh[k] });\n      }\n      // \u8865\u9F50\u7684\u6DE1\u8272\u5C0F\u8282\uFF1A\u6BCF\u4E2A\u5C0F\u8282\u5F00\u5934\u4E00\u4E2A\u843D\u70B9\uFF08caret = \u5C3E\u5DF4\u3001lead = \u79BB\u5C3E\u5DF4\u591A\u5C11 tick\uFF09\n      for (const u of units) if (u.kind === \"chunk\" && u.pad && u.inBar < 1e-6 && u.tick - q.realTicks > 1e-6) { const sh = shiftAt(realLen); for (let k = 0; k < q.staves; k++) { slots.push({ caret: realLen, system: rowOf(u.system, r, k), x: P(u.x), lead: u.tick - q.realTicks }); heads.push({ caret: realLen, system: rowOf(u.system, r, k), x: P(u.x), shift: sh[k], lead: u.tick - q.realTicks }); } }\n      // \u884C\u672B\u843D\u70B9\uFF1A\u8FD9\u4E00\u884C\u6700\u540E\u4E00\u4E2A\u4E1C\u897F\u540E\u9762 = \u4E0B\u4E00\u884C\u7B2C\u4E00\u4E2A\u5149\u6807\u4F4D\u7F6E\uFF0C\u70B9\u5728\u8FD9\u91CC = \u5149\u6807\u753B\u5728\u8FD9\u4E00\u884C\u672B\u5C3E\uFF08caretEnd\uFF09\u3002\u539F\u6765\u8FD9\u91CC\u6CA1\u6709\u843D\u70B9\uFF0C\u70B9\u884C\u672B\u7A7A\u767D\u4F1A\u843D\u5230\u6700\u540E\u4E00\u4E2A\u97F3\u524D\u9762\u3002\n      let lastSys = -1;\n      for (let c = H; c < Math.min(tokens.length, realLen + 1); c++) {\n        const u = firstUnitOf.get(c); if (!u) continue;\n        const crossed = lastSys >= 0 && u.system > lastSys; lastSys = u.system;\n        if (!crossed) continue;\n        const prevRow = cols.filter((cc) => cc.system === u.system - 1);\n        if (!prevRow.length) continue;\n        const x = P(Math.max(...prevRow.map((cc) => cc.x + cc.w)));\n        const sh = shiftAt(c);\n        for (let k = 0; k < q.staves; k++) { slots.push({ caret: c, system: rowOf(u.system - 1, r, k), x, end: true }); heads.push({ caret: c, system: rowOf(u.system - 1, r, k), x, shift: sh[k], end: true }); }\n      }\n    });\n    stubs();\n    papersHit.push({ id: paper.id, title: pTitle, menu, top: paperTop, bottom: yCur, ...paperNav });\n  });\n  // \u5206\u9875\uFF1A\u9875\u6846\uFF08\u538B\u5728\u6700\u5E95\u4E0B\uFF09+ \u9875\u7801\uFF1B\u9AD8 = \u6700\u540E\u4E00\u9875\u7684\u5E95\n  const pages: Layout[\"pages\"] = [];\n  if (PG) {\n    const frames: Prim[] = [];\n    for (let k = 0; k <= pageNo; k++) {\n      const top = pageTopY(k);\n      frames.push({ t: \"rect\", x: -P(PG.l), y: top, w: o.width + P(PG.l + PG.r), h: P(PG.h), cls: \"page\" });\n      prims.push({ t: \"text\", x: o.width / 2, y: top + P(PG.h - PG.b / 2), s: String(k + 1), cls: \"page-no\", size: P(1.2), anchor: \"middle\" });\n      pages.push({ top, h: P(PG.h) });\n    }\n    prims.unshift(...frames);\n  }\n  const height = PG ? pageTopY(pageNo) + P(PG.h) : yCur + P(MX.b);\n  return { prims, width: o.scroll ? P(sheetRight + MARGIN) : o.width, height, sp, systems: rows, bars, notes, chordHeads, sharedRows, virtual: virtualOut, measures, families, slots, heads, lyrics, marks, dyns, rests, title, clefs, arrangement, credits, parts: partsHit, papers: papersHit, addPaper, nav, paperMenu, pageX: { left: P(MX.l), right: P(MX.r) }, pages, paperChip, shortBars, lyricYs: rows.map((_, r) => lyricY(r)), lyricY, yOf, dOf };\n}\n\nexport type { Token };\n", "// svg.ts \u2014\u2014 \u6392\u7248\u7ED3\u679C \u2192 SVG \u5B57\u7B26\u4E32\uFF08\u6D4F\u89C8\u5668 innerHTML \u7528\uFF1BNode \u91CC\u4E5F\u80FD\u76F4\u63A5\u5199\u6587\u4EF6\u770B\u56FE\uFF09\u3002created 2026-10-06 by Claude Opus 5.5\nimport { type Layout, LYRIC_EM } from \"./engrave.ts\";\n\nconst esc = (s: string) => s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\nconst n = (v: number) => (Math.round(v * 100) / 100).toString();\n\n/** \u4E00\u4E2A\u56FE\u5143\u7684 SVG \u5143\u7D20\u5B57\u7B26\u4E32\uFF08\u6D4B\u8BD5\u4E5F\u7528\u5B83\u5BF9\u5206\u7EC4\uFF09\u3002 */\nexport function primSvg(p: Layout[\"prims\"][number], fs: string, lfs: string, rx: string): string {\n  const c = (p.cls ? ` class=\"${p.cls}\"` : \"\") + (p.tok !== undefined ? ` data-tok=\"${p.tok}\"` : \"\");   // data-tok\uFF1Ascore-view \u6309\u5B83\u5F00\u5173\u5199\u5B57\u5934 / \u9009\u533A / \u5F3A\u8C03\u8272\u7684 class\uFF08W-17 \u7B2C 1 \u5200\uFF09\n  switch (p.t) {\n    case \"line\": return `<line${c} x1=\"${n(p.x1)}\" y1=\"${n(p.y1)}\" x2=\"${n(p.x2)}\" y2=\"${n(p.y2)}\" stroke-width=\"${n(p.w)}\"/>`;\n    case \"glyph\": return `<text${c} x=\"${n(p.x)}\" y=\"${n(p.y)}\" font-family=\"Bravura\" font-size=\"${p.size ? n(p.size) : fs}\">${p.ch}</text>`;\n    case \"text\": return `<text${c} x=\"${n(p.x)}\" y=\"${n(p.y)}\" font-size=\"${p.size ? n(p.size) : lfs}\" text-anchor=\"${p.anchor ?? \"middle\"}\">${esc(p.s)}</text>`;\n    case \"path\": return `<path${c} d=\"${p.d}\"/>`;\n    case \"rect\": return `<rect${c} x=\"${n(p.x)}\" y=\"${n(p.y)}\" width=\"${n(p.w)}\" height=\"${n(p.h)}\" rx=\"${rx}\"/>`;\n    case \"icon\": return `<use${c} href=\"#${p.id}\" x=\"${n(p.x)}\" y=\"${n(p.y)}\" width=\"${n(p.size)}\" height=\"${n(p.size)}\">${p.title ? `<title>${esc(p.title)}</title>` : \"\"}</use>`;\n  }\n}\n/** \u4E00\u4E2A\u56FE\u5143\u5927\u6982\u5728\u54EA\u4E2A y\uFF08\u5206\u7EC4\u7528\uFF09\uFF1A\u7EBF\u53D6\u4E2D\u70B9\u3001\u77E9\u5F62\u53D6\u4E2D\u5FC3\u3001\u8DEF\u5F84\u53D6\u7B2C\u4E00\u4E2A\u70B9\uFF1B\u62FF\u4E0D\u5230 = null\uFF08\u8FDB\u6742\u9879\u7EC4\uFF09\u3002 */\nfunction yOfPrim(p: Layout[\"prims\"][number]): number | null {\n  switch (p.t) {\n    case \"line\": return (p.y1 + p.y2) / 2;\n    case \"glyph\": case \"text\": return p.y;\n    case \"rect\": return p.y + p.h / 2;\n    case \"icon\": return p.y + p.size / 2;\n    case \"path\": { const m = /^\\s*M\\s*-?[\\d.]+[\\s,]+(-?[\\d.]+)/.exec(p.d); return m ? Number(m[1]) : null; }\n  }\n}\n/** \u6392\u7248\u7ED3\u679C \u2192 \u5F00\u6807\u7B7E + \u6BCF\u7EC4\u4E00\u4E2A `<g>` + \u6536\u5C3E\uFF08W-17 \u667A\u80FD\u91CD\u753B\u7B2C\u4E00\u5200\uFF0C2026-10-14 Claude Fable 5.1\uFF09\uFF1A\n *  \u56FE\u5143\u6309\u843D\u5728\u54EA\u4E00\u884C\u8C31\uFF08Layout.systems \u7684\u4E0A\u4E0B\u754C\uFF09\u5206\u7EC4\uFF0C\u4E0D\u5728\u4EFB\u4F55\u4E00\u884C\u91CC\u7684\uFF08\u6B4C\u540D / \u4F5C\u8005\u680F / \u66F2\u6BB5\u63A7\u4EF6 / \u9875\u6846\u2026\uFF09\u8FDB\u7B2C 0 \u7EC4\u300C\u6742\u9879\u300D\uFF1B\u7EC4\u5185\u4FDD\u6301\u539F\u6765\u7684\u5148\u540E\uFF08z \u5E8F\u4E0D\u53D8\uFF09\u3002\n *  \u5BBF\u4E3B\uFF08score-view\uFF09\u62FF\u7740\u4E0A\u4E00\u6B21\u7684\u7EC4\u5B57\u7B26\u4E32\u9010\u7EC4\u6BD4\uFF0C\u53EA\u6362\u53D8\u4E86\u7684\u90A3\u51E0\u7EC4\u2014\u2014\u632A\u4E00\u683C\u5149\u6807 = \u6362\u4E24\u7EC4\uFF0C\u4E0D\u518D\u6574\u5F20 SVG \u91CD\u5EFA\uFF085000 \u4E2A\u8282\u70B9 / 500 KB\uFF09\u3002\n *  z \u5E8F\u552F\u4E00\u7684\u53D8\u5316\uFF1A\u6742\u9879\u7EC4\u753B\u5728\u6240\u6709\u884C\u524D\u9762\uFF08\u5B83\u4EEC\u672C\u6765\u5C31\u662F\u80CC\u666F / \u4E0D\u548C\u97F3\u7B26\u91CD\u53E0\u7684\u4E1C\u897F\uFF09\u3002 */\nexport function toSvgParts(l: Layout): { open: string; groups: string[]; close: string } {\n  const L = l.pageX?.left ?? 0, R = l.pageX?.right ?? 0, W = l.width + L + R;   // \u5206\u9875\uFF1A\u7248\u5FC3\u5DE6\u53F3\u7559\u8FB9\u8DDD\uFF0C\u9875\u6846\u753B\u5728\u8D1F x\n  const open = `<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"staff-svg\" width=\"${n(W)}\" height=\"${n(l.height)}\" viewBox=\"${n(-L)} 0 ${n(W)} ${n(l.height)}\">`;\n  const fs = n(4 * l.sp), lfs = n(LYRIC_EM * l.sp), rx = n(l.sp * 0.6);\n  const boxes = l.systems.map((s) => [s.top, s.bottom] as const);\n  const buckets: string[][] = Array.from({ length: boxes.length + 1 }, () => []);\n  for (const p of l.prims) {\n    const y = yOfPrim(p); let k = 0;\n    if (y !== null) for (let i = 0; i < boxes.length; i++) if (y >= boxes[i][0] && y < boxes[i][1]) { k = i + 1; break; }\n    buckets[k].push(primSvg(p, fs, lfs, rx));\n  }\n  return { open, groups: buckets.map((b, k) => `<g data-sys=\"${k - 1}\">${b.join(\"\")}</g>`), close: \"</svg>\" };\n}\n/** \u989C\u8272\u8D70 CSS \u53D8\u91CF\uFF08styles.css \u5B9A\u4E49\uFF09\uFF1BNode \u91CC\u79BB\u7EBF\u770B\u56FE\u65F6\u7528 inlineStyle=true \u628A\u9ED8\u8BA4\u989C\u8272\u5199\u8FDB\u53BB\u3002 */\nexport function toSvg(l: Layout, inlineStyle = false): string {\n  const { open, groups, close } = toSvgParts(l);\n  return open + (inlineStyle ? `<style>${STANDALONE_CSS}</style>` : \"\") + groups.join(\"\") + close;\n}\n\n/** \u548C styles.css \u91CC .staff-svg \u90A3\u6BB5\u540C\u4E49\u7684\u9ED8\u8BA4\u989C\u8272\uFF08\u79BB\u7EBF\u770B\u56FE\u7528\uFF09\u3002 */\nexport const STANDALONE_CSS = `\n.staff-svg{background:#fff}\n.staff-svg line{stroke:#2a2a2a;stroke-linecap:butt}\n.staff-svg text{fill:#2a2a2a}\n.staff-svg path{fill:#2a2a2a}\n.staff-svg line.staff{stroke:#666}\n.staff-svg path.tie{fill:none;stroke:#2a2a2a;stroke-width:1.4}\n.staff-svg .ghost{fill:#a9b4c2;stroke:#a9b4c2}\n.staff-svg path.tie.ghost{fill:none}\n.staff-svg .cur{fill:#2b6cb0;stroke:#2b6cb0}\n.staff-svg path.tie.cur{fill:none}\n.staff-svg line.caret{stroke:#2b6cb0}\n.staff-svg rect.warn{fill:#d9a23a}\n.staff-svg text.lyric{font-family:system-ui,\"Hiragino Sans\",\"Noto Sans CJK JP\",sans-serif}\n.staff-svg line.melisma{stroke:#2a2a2a}\n.staff-svg .sel{fill:#1d5fa8;stroke:#1d5fa8}\n.staff-svg rect.selbox{fill:#e3edf9;opacity:.8}\n.staff-svg path.tuplet-bracket{fill:none;stroke:#2a2a2a;stroke-width:1}\n.staff-svg text.tempo-word{font-weight:600;font-family:system-ui,sans-serif}\n.staff-svg text.tempo-num,.staff-svg text.key-label{font-family:system-ui,sans-serif}\n.staff-svg path.hairpin{fill:none;stroke:#2a2a2a;stroke-width:1.1}\n.staff-svg text.dyn-word{font-style:italic;font-family:\"Times New Roman\",Georgia,serif}\n`;\n", "// lyric-font.ts \u2014\u2014 \u91CF\u6B4C\u8BCD / \u540D\u5B57\u5BBD\u5EA6\u7528\u7684\u5B57\u4F53\u4E32\uFF08\u5C4F\u5E55\u3001PDF\u3001\u6392\u7248 worker \u4E09\u5904\u5FC5\u987B\u662F\u540C\u4E00\u4E32\uFF0C\u4E0D\u7136\u65AD\u884C\u4E0D\u540C\uFF09\u3002created 2026-10-21 by Claude Fable 5.1\uFF08\u6392\u7248\u8FDB worker\uFF09\n//   \u5168\u662F\u7CFB\u7EDF\u5B57\u4F53\u3001\u4E0D\u542B Bravura\uFF08\u529B\u5EA6\u5B57\u7684\u58A8\u8FF9\u662F engrave \u91CC\u7684\u5E38\u6570\u8868\uFF09\u30022026-10-17 \u6838\u8FC7\uFF1A\u540C\u4E00\u4E32\u5B57\u4F53 OffscreenCanvas\uFF08worker\uFF09\u548C\u4E3B\u7EBF\u7A0B canvas \u91CF\u51FA\u6765\u9010\u4F4D\u76F8\u540C\uFF08\u65E0\u5934 Chromium\uFF09\u3002\nexport const lyricFont = (px: number): string => `${px}px system-ui, \"Hiragino Sans\", \"PingFang SC\", \"Noto Sans CJK JP\", sans-serif`;\n/** \u4E00\u628A\u5C3A\u5B50\uFF1A\u540C\u4E00\u4E2A 2D \u4E0A\u4E0B\u6587\uFF08canvas / OffscreenCanvas\uFF09\u4E0A\u6309\u8FD9\u4E2A\u5B57\u4F53\u91CF\u5BBD\uFF08\u53EA\u5728\u5B57\u4F53\u53D8\u4E86\u65F6\u6539 ctx.font\uFF09\u3002 */\nexport function measurerOn(ctx: { font: string; measureText(s: string): { width: number } }, font: string): (s: string) => number {\n  return (s) => { if (ctx.font !== font) ctx.font = font; return ctx.measureText(s).width; };\n}\n", "// lyric-editor.ts \u2014\u2014 \u5728\u4E94\u7EBF\u8C31\u4E0B\u9762\u5C31\u5730\u5199\u6B4C\u8BCD\u3002created 2026-10-07 by Claude Opus 5.5\n// user\u300C\u6B4C\u8BCD\u8F93\u5165\u4E0D\u5E94\u8BE5\u653E\u5728\u952E\u76D8\u4E0A\uFF0C\u800C\u662F\u653E\u5728\u4E94\u7EBF\u8C31\u4E0B\u9762\u70B9\u8FDB\u53BB\u4E00\u4E2A\u4E00\u4E2A\u5199\u6216\u8005\u5220\u300D\uFF1B\u8BB0\u8C31\u89C4\u77E9\u7167 MusicXML / MuseScore\uFF08user\u300C\u8F93\u5165 \u540C\u610F\uFF0C\u62D6\u4E3A\u4EC0\u4E48\u4E0D\u7528~\uFF1F\u300D\uFF09\uFF1A\n//   \u00B7 \u70B9\u67D0\u4E2A\u97F3\u4E0B\u9762 \u2192 \u90A3\u91CC\u51FA\u4E00\u4E2A\u8F93\u5165\u6846\uFF08iPad \u5F39\u7CFB\u7EDF\u952E\u76D8\uFF0C\u8F93\u5165\u6CD5\u7167\u5E38\u7528\uFF09\uFF1B\n//   \u00B7 \u4E2D\u6587 / \u65E5\u6587\uFF1A\u8F93\u5165\u6CD5\u9009\u5B9A\u4E00\u6BB5\u5B57\uFF08compositionend\uFF09\u5C31\u6309\u5B57\u5F80\u540E\u8D34\uFF0C\u6846\u8DDF\u5230\u4E0B\u4E00\u4E2A\u7A7A\u4F4D\u2014\u2014\u4E00\u5B57\uFF08\u4E00\u62CD\uFF09\u4E00\u4E2A\u97F3\uFF1B\n//   \u00B7 \u82F1\u6587\uFF1A\u7A7A\u683C = \u8FD9\u4E2A\u8BCD\u5B8C\u4E86\u3001\u8DF3\u4E0B\u4E00\u4E2A\u97F3\uFF1B\u300C-\u300D= \u97F3\u8282\u5B8C\u4E86\u3001\u8BCD\u6CA1\u5B8C\uFF08\u8C31\u9762\u753B\u8FDE\u5B57\u7B26\uFF09\u3001\u8DF3\u4E0B\u4E00\u4E2A\u97F3\uFF1B\n//   \u00B7 \u300C~\u300D\uFF08\u6216 _ \u30FC\uFF09= \u62D6\u8154\uFF1A\u8FD9\u4E2A\u97F3\u5EF6\u7EED\u4E0A\u4E00\u4E2A\u5B57\uFF1B\n//   \u00B7 \u7A7A\u6846\u91CC\u9000\u683C = \u56DE\u5230\u4E0A\u4E00\u4E2A\u97F3\uFF0C\u628A\u5B83\u7684\u5B57\u62FF\u51FA\u6765\u63A5\u7740\u5220\uFF1B\u56DE\u8F66 / \u70B9\u522B\u5904 = \u6536\u8D77\uFF1BEsc = \u6536\u8D77\u4E0D\u8D34\uFF1BTab / Shift+Tab = \u524D\u540E\u632A\u3002\n//   \u952E\u4F4D\u5728 src/keyboard/keys.ts\uFF08\u4E00\u5F20\u8868\uFF09\uFF1B\u8FD9\u91CC\u53EA\u6536\u8DEF\u7531\u6765\u7684\u52A8\u4F5C\uFF08act\uFF09\u3002\n// \u8F93\u5165\u6CD5\u8FD8\u5728\u62FC\uFF08isComposing\uFF09\u7684\u65F6\u5019\u4EC0\u4E48\u90FD\u4E0D\u505A\u2014\u2014\u62FC\u97F3\u3001\u5047\u540D\u8F93\u5165\u6CD5\u90FD\u4E0D\u88AB\u6253\u65AD\u3002\n\nimport { type EditorState, type NoteTok, tr, withTrack } from \"../score/song.ts\";\nimport { splitSyllables, distributeFrom, nextLyricSlot, prevLyricSlot, lyricSlot, MELISMA_MARK, type Syl, joinIntoPrev, lyricEdit, mergeIntoPrev } from \"../score/lyrics.ts\";\nimport { insertPhraseAfter } from \"../score/song.ts\";\n/** \u6B4C\u8BCD\u91CC\u7684\u53E5\u8BFB = \u8FD9\u4E00\u53E5\u5230\u8FD9\u513F\uFF08\u63D2\u300C\u53E5\u300D\uFF1A\u6362\u884C / \u6362\u6C14 / \u300C\u5408\u300D\u7684\u8FB9\u754C\uFF1Buser 2026-10-08\u300C\u6B4C\u8BCD\u7684\u53E5\u53F7\u53EF\u80FD\u9700\u8981\u8FD9\u4E2A\u300D\uFF09\u3002\u5B57\u4E0D\u8FDB\u6B4C\u8BCD\u3002 */\nconst PUNCT = /[\u3002\uFF0E\uFF0C\u3001,.!\uFF01?\uFF1F;\uFF1B:\uFF1A]+$/;\nconst splitPunct = (v: string): { text: string; phrase: boolean } => { const m = PUNCT.exec(v); return m ? { text: v.slice(0, m.index), phrase: true } : { text: v, phrase: false }; };\nimport type { Layout } from \"../render/engrave.ts\";\n\n/** \u8FD9\u4E00\u53E5\u5F15\u64CE\u5FF5\u6210\u4EC0\u4E48\uFF08v0.9.34\uFF09\uFF1Aparts = \u6BCF\u4E2A\u97F3\u8282\u7684\u97F3\u7D20\uFF0Cat = \u6846\u91CC\u8FD9\u4E2A\u5B57\u662F\u7B2C\u51E0\u4E2A\uFF08-1 = \u5BF9\u4E0D\u4E0A\u3001\u4E0D\u6807\uFF09\uFF1Bnote = \u524D\u9762\u90A3\u53E5\u8BDD\u3002 */\nexport interface LyricReading { parts: string[]; at: number; note: string }\ninterface Host { get(): EditorState; set(next: EditorState, opts?: { gesture?: string }): void; lyricHint?(i: number): string | null; lyricReading?(i: number): LyricReading | null }   // gesture \"lyric\"\uFF1A\u8FDE\u6253\u7684\u6B4C\u8BCD\u5728 undo \u91CC\u662F\u4E00\u6B65\nconst CJK = /[\\p{Script=Han}\u3040-\u30FF]/u;\n\nexport class LyricEditor {\n  private input: HTMLInputElement;\n  /** \u300C\u5408\u300D\uFF1A\u8FD9\u4E2A\u5B57\u5E76\u8FDB\u524D\u4E00\u4E2A\u97F3\uFF08\u56DE\u5934\u6539\u7528\uFF1B\u6253\u5B57\u7684\u65F6\u5019\u6846\u5728\u7A7A\u7684\u97F3\u4E0A\uFF0C\u5B83\u4E0D\u51FA\u6765\uFF09\u3002 */\n  private merge: HTMLButtonElement;\n  /** \u6846\u4E0A\u9762\u7684\u5C0F\u5B57\uFF1A\u8FD9\u4E2A\u97F3\u7684\u5B57\u53F0\u4E0A\u8FD9\u4F4D\u5531\u4E0D\u51FA\u6765\u7684\u90A3\u53E5\u8BDD\uFF08\u7EAA\u5F8B\u300C\u505A\u4E0D\u5230\u7684\u4E00\u5F8B\u753B\u7070 + \u660E\u8BF4\u300D\uFF1B2026-10-08 Opus 5.5\uFF09\u3002 */\n  private hint: HTMLDivElement;\n  /** \u6846\u4E0B\u9762\u7684\u5C0F\u5B57\uFF1A\u8FD9\u4E00\u53E5\u6708\u8BFB\u5FF5\u6210\u4EC0\u4E48\uFF08v0.9.34\uFF1B\u5168\u5047\u540D\u65F6\u52A9\u8BCD \u306F \u4F1A\u88AB\u6CE8\u6210 ha\uFF0C\u770B\u5F97\u89C1\u624D\u6539\u5F97\u4E86\uFF09\u3002 */\n  private reading: HTMLDivElement;\n  private index = -1;\n  system = 0;\n\n  constructor(private parent: HTMLElement, private host: Host, private layout: () => Layout | null, private rerender: () => void) {\n    const i = document.createElement(\"input\");\n    i.className = \"lyric-input\"; i.type = \"text\"; i.autocomplete = \"off\"; i.spellcheck = false; i.hidden = true;\n    i.setAttribute(\"autocapitalize\", \"off\"); i.setAttribute(\"enterkeyhint\", \"done\");\n    parent.appendChild(i);\n    this.input = i;\n    const m = document.createElement(\"button\");\n    m.className = \"btn lyric-merge\"; m.type = \"button\"; m.textContent = \"\u5408\"; m.hidden = true;\n    m.title = \"\u8FD9\u4E2A\u5B57\u5E76\u8FDB\u524D\u4E00\u4E2A\u97F3\uFF08\u4E00\u4E2A\u97F3\u4E0A\u51E0\u4E2A\u5B57\uFF09\uFF1B\u8FD9\u4E00\u53E5\u540E\u9762\u7684\u5B57\u5F80\u524D\u632A\u4E00\u4E2A\u97F3\";\n    m.addEventListener(\"pointerdown\", (e) => { e.preventDefault(); e.stopPropagation(); this.mergeNow(); });   // \u4E0D\u62A2\u7126\u70B9\uFF1A\u6846\u7167\u5E38\u5F00\u7740\n    parent.appendChild(m);\n    this.merge = m;\n    const h = document.createElement(\"div\"); h.className = \"lyric-hint\"; h.hidden = true; parent.appendChild(h); this.hint = h;\n    const rd = document.createElement(\"div\"); rd.className = \"lyric-hint lyric-reading\"; rd.hidden = true; parent.appendChild(rd); this.reading = rd;\n    i.addEventListener(\"compositionend\", () => this.absorb());\n    i.addEventListener(\"input\", (e) => { if (!(e as InputEvent).isComposing) this.absorb(); });\n    i.addEventListener(\"blur\", () => { if (this.open) setTimeout(() => { if (document.activeElement !== this.input) this.commitAndClose(); }, 0); });\n  }\n\n  get open(): boolean { return this.index >= 0; }\n\n  /** \u5728\u4E0B\u6807 i \u7684\u97F3\u4E0B\u9762\u6253\u5F00\uFF08\u6846\u91CC\u653E\u7740\u5B83\u73B0\u5728\u7684\u5B57\uFF0C\u5168\u9009\uFF0C\u65B9\u4FBF\u76F4\u63A5\u6539\u5199\uFF09\u3002 */\n  openAt(i: number): void {\n    const st = this.host.get(), t = tr(st)[i];\n    if (!t || !lyricSlot(t)) return;\n    this.index = i;\n    this.input.value = this.slotText(i);\n    this.input.hidden = false;\n    this.reposition();\n    this.input.focus({ preventScroll: true });\n    this.input.select();\n  }\n\n  /** \u91CD\u753B\u4E4B\u540E\u628A\u6846\u632A\u56DE\u90A3\u4E2A\u97F3\u4E0B\u9762\u3002 */\n  reposition(): void {\n    if (!this.open) { this.merge.hidden = true; this.hint.hidden = true; this.reading.hidden = true; return; }   // \u6846\u6536\u4E86\uFF08\u5305\u62EC\u6253\u5B8C\u6700\u540E\u4E00\u4E2A\u5B57\u81EA\u5DF1\u6536\u7684\uFF09=\u300C\u5408\u300D\u4E5F\u6536\n    const L = this.layout(), at = this.host.get().at, h = L?.lyrics.find((x) => x.index === this.index && L.systems[x.system]?.paper === at.paper && L.systems[x.system]?.part === at.part);\n    if (!L || !h) { this.close(); return; }\n    this.system = h.system;\n    const w = Math.max(48, this.input.value.length * L.sp * 1.6 + 24);\n    Object.assign(this.input.style, { left: `${h.x - w / 2}px`, top: `${h.y - L.sp * 2.1}px`, width: `${w}px`, fontSize: `${L.sp * 1.6}px` });\n    const hint = [this.host.lyricHint?.(this.index) ?? null, h.tight ? \"\u6324\u4E86\uFF1A\u6309\u8282\u594F\u6392\uFF0C\u8FD9\u4E2A\u5B57\u653E\u4E0D\u4E0B\uFF08\u7EB8\u7684\u8BBE\u7F6E\u91CC\u6362\u6210\u300C\u6309\u6B4C\u8BCD\u300D= \u628A\u97F3\u63A8\u5F00\uFF09\" : null].filter(Boolean).join(\"\uFF1B\") || null;   // \u6309\u8282\u594F\u6392\u65F6\u6324\u7684\u5B57\uFF08v0.9.40\uFF09\n    this.hint.hidden = !hint;\n    if (hint) {   // \u6846\u4E0A\u9762\uFF1A\u5148\u653E\u5B57\u518D\u91CF\u9AD8\uFF0C\u5E95\u8FB9\u8D34\u7740\u6846\u7684\u4E0A\u6CBF\n      this.hint.textContent = hint; this.hint.style.left = `${h.x - w / 2}px`;\n      this.hint.style.top = `${h.y - L.sp * 2.1 - this.hint.offsetHeight - 4}px`;\n    }\n    const can = mergeIntoPrev(this.host.get(), this.index) !== this.host.get(), mh = L.sp * 1.6 * 2;\n    this.merge.hidden = !can;\n    // \u653E\u5728\u6846\u7684\u6B63\u4E0B\u65B9\uFF08\u4E0D\u6321\u524D\u9762\u90A3\u51E0\u4E2A\u5B57\u2014\u2014\u8981\u5408\u7684\u5C31\u662F\u5B83\u4EEC\uFF09\n    if (can) Object.assign(this.merge.style, { left: `${h.x - w / 2}px`, top: `${h.y - L.sp * 2.1 + L.sp * 1.6 * 2 + 4}px`, width: `${mh}px`, height: `${mh * 0.8}px` });\n    // \u8BFB\u97F3\uFF1A\u300C\u5408\u300D\u7684\u4E0B\u9762\uFF08\u6CA1\u6709\u300C\u5408\u300D= \u6846\u7684\u6B63\u4E0B\u65B9\uFF09\uFF1B\u8FD9\u4E2A\u5B57\u52A0\u7C97\n    const rd = this.host.lyricReading?.(this.index) ?? null;\n    this.reading.hidden = !rd;\n    if (rd) {\n      this.reading.replaceChildren(document.createTextNode(rd.note), ...rd.parts.flatMap((x, k) => { const e = document.createElement(k === rd.at ? \"b\" : \"span\"); e.textContent = x; return [document.createTextNode(\" \"), e]; }));\n      Object.assign(this.reading.style, { left: `${h.x - w / 2}px`, top: `${h.y - L.sp * 2.1 + L.sp * 1.6 * 2 + 4 + (can ? mh * 0.8 + 4 : 0)}px` });\n    }\n  }\n  /** \u70B9\u300C\u5408\u300D\uFF1A\u6846\u91CC\u6539\u8FC7\u7684\u5148\u8D34\u4E0A\uFF0C\u518D\u628A\u8FD9\u4E2A\u5B57\u5E76\u8FDB\u524D\u4E00\u4E2A\u97F3\u3001\u8FD9\u4E00\u53E5\u540E\u9762\u7684\u5B57\u5F80\u524D\u632A\uFF1B\u6846\u7559\u5728\u8FD9\u4E2A\u97F3\u4E0A\uFF08\u73B0\u5728\u662F\u632A\u8FC7\u6765\u7684\u5B57\uFF09\u3002 */\n  private mergeNow(): void {\n    if (!this.open) return;\n    this.commitOnly();\n    const st = this.host.get(), next = mergeIntoPrev(st, this.index);\n    if (next === st) return;\n    this.host.set(next);\n    this.input.value = this.slotText(this.index); this.rerender(); this.input.select();\n  }\n\n  /** \u628A\u6846\u91CC\u7684\u5B57\u8D34\u5230\u5F53\u524D\u8FD9\u4E2A\u97F3\uFF08\u53EF\u80FD\u4E00\u6B21\u8D34\u597D\u51E0\u4E2A\u97F3\u8282\uFF0C\u5F80\u540E\u632A\uFF09\uFF0C\u5E76\u8DF3\u5230\u4E0B\u4E00\u4E2A\u7A7A\u4F4D\u3002 */\n  private place(text: string, hyphEnd: boolean, phraseEnd = false): void {\n    let syl: Syl[] = splitSyllables(text);\n    if (!syl.length) { if (phraseEnd) this.endPhraseHere(); return; }\n    if (hyphEnd) syl = syl.map((s, k) => (k === syl.length - 1 ? { ...s, hyph: true } : s));\n    if (syl[0].joinPrev) {   // \u300C+\u300D\u5F00\u5934\uFF1A\u7B2C\u4E00\u4E2A\u5B57\u5E76\u8FDB\u524D\u4E00\u4E2A\u97F3\uFF08\u6846\u5DF2\u7ECF\u8DF3\u5230\u8FD9\u4E2A\u97F3\u4E86\uFF09\uFF1B\u5269\u4E0B\u7684\u7167\u5E38\u4ECE\u8FD9\u4E2A\u97F3\u5F80\u540E\u8D34\n      this.host.set(joinIntoPrev(this.host.get(), this.index, syl[0].text));\n      syl = syl.slice(1);\n      if (!syl.length) { this.input.value = this.slotText(this.index); this.rerender(); this.input.select(); return; }\n    }\n    const r = distributeFrom(this.host.get(), this.index, syl), st = phraseEnd ? insertPhraseAfter(r.st, r.last) : r.st, last = r.last;\n    this.host.set(st, { gesture: \"lyric\" });\n    const nx = nextLyricSlot(tr(st), last);\n    this.input.value = \"\";\n    if (nx >= 0) { this.index = nx; this.input.value = this.slotText(nx); this.rerender(); this.input.select(); }\n    else { this.index = -1; this.input.hidden = true; this.merge.hidden = true; this.rerender(); }   // \u6CA1\u6709\u4E0B\u4E00\u4E2A\u97F3\u4E86\uFF1A\u6536\u8D77\uFF08\u591A\u51FA\u6765\u7684\u5B57\u5DF2\u7ECF\u8865\u6210\u65B0\u97F3\uFF09\n  }\n  /** \u6846\u662F\u7A7A\u7684\u3001\u6253\u4E86\u4E2A\u53E5\u53F7\uFF1A\u53E5\u63D2\u5728\u524D\u4E00\u4E2A\u6709\u5B57\u4F4D\u7684\u97F3\u540E\u9762\uFF08\u6846\u7559\u5728\u539F\u6765\u7684\u97F3\u4E0A\uFF09\u3002 */\n  private endPhraseHere(): void {\n    const st = this.host.get(), p = prevLyricSlot(tr(st), this.index);\n    if (p < 0) return;\n    const st2 = insertPhraseAfter(st, p);\n    if (st2 === st) return;\n    this.index++;   // \u5148\u632A\u4E0B\u6807\u518D set\uFF1Aset \u4F1A\u540C\u6B65\u91CD\u753B \u2192 reposition \u6309\u4E0B\u6807\u627E\u6846\u7684\u4F4D\u7F6E\uFF0C\u65E7\u4E0B\u6807\u73B0\u5728\u662F\u300C\u53E5\u300D\u90A3\u4E2A token\uFF08\u627E\u4E0D\u5230 = \u6846\u4F1A\u88AB\u6536\u6389\uFF09\n    this.host.set(st2); this.rerender();\n  }\n  private slotText(i: number): string {\n    const t = tr(this.host.get())[i] as NoteTok;\n    return t.lyric === MELISMA_MARK ? \"~\" : lyricEdit(t.lyric ?? \"\") + (t.hyph ? \"-\" : \"\");\n  }\n\n  /** \u8F93\u5165\u6CD5\u9009\u5B9A / \u76F4\u63A5\u6253\u5B57\u4E4B\u540E\uFF1A\u4E2D\u65E5\u6587\u5B57\u7ACB\u523B\u8D34\uFF1B\u62D6\u8154\u8BB0\u53F7\u7ACB\u523B\u8D34\uFF1B\u82F1\u6587\u7B49\u7A7A\u683C\u6216\u300C-\u300D\u3002 */\n  private absorb(): void {\n    if (!this.open) return;\n    const v = this.input.value;\n    if (!v) return;\n    if (/^[~\uFF5E_\uFF3F\u30FC]$/.test(v)) { this.place(v, false); return; }\n    const { text, phrase } = splitPunct(v);\n    if (phrase) { this.input.value = \"\"; this.place(text, false, true); return; }   // \u53E5\u8BFB\uFF1A\u8D34\u5B57 + \u63D2\u300C\u53E5\u300D\uFF08\u82F1\u6587\u7684\u300Clove,\u300D\u4E5F\u5728\u8FD9\u513F\u6536\uFF09\n    if (CJK.test(v) && !/[A-Za-z]/.test(v)) { this.place(v, false); return; }\n    this.reposition();\n  }\n\n  /** \u952E\u76D8\u8DEF\u7531\u6765\u7684\u52A8\u4F5C\uFF08src/keyboard/keys.ts \u7684\u300C\u6B4C\u8BCD\u6846\u300D\u90A3\u51E0\u884C\uFF09\u3002\u8FD4\u56DE false = \u8FD9\u4E00\u4E0B\u4E0D\u5F52\u6B4C\u8BCD\u6846\u7BA1\uFF08\u8BA9\u8F93\u5165\u6846\u7167\u5E38\u6253\u5B57\uFF09\u3002 */\n  act(a: \"commit\" | \"cancel\" | \"next\" | \"prev\" | \"hyphen\" | \"back\"): boolean {\n    if (!this.open) return false;\n    const v = this.input.value;\n    switch (a) {\n      case \"commit\": this.commitAndClose(); return true;\n      case \"cancel\": this.close(); return true;\n      case \"next\": if (v.trim()) { const { text, phrase } = splitPunct(v.trim()); this.place(text, false, phrase); } else this.step(1); return true;\n      case \"prev\": this.commitOnly(); this.step(-1); return true;\n      case \"hyphen\": if (!/[A-Za-z']$/.test(v)) return false; this.place(v, true); return true;\n      case \"back\": {\n        if (v) return false;\n        const st = this.host.get(), cur = tr(st)[this.index] as NoteTok;\n        if (cur?.lyric) this.host.set({ ...st, song: withTrack(st.song, st.at.paper, st.at.part, tr(st).map((t, k) => (k === this.index ? { ...cur, lyric: null, hyph: undefined } : t))) });\n        this.step(-1); return true;\n      }\n    }\n  }\n\n  /** \u524D\u540E\u632A\u4E00\u4E2A\u6B4C\u8BCD\u4F4D\uFF08\u4E0D\u8D34\u5B57\uFF09\u3002 */\n  private step(d: number): void {\n    const toks = tr(this.host.get());\n    const j = d > 0 ? nextLyricSlot(toks, this.index) : prevLyricSlot(toks, this.index);\n    if (j < 0) { this.rerender(); return; }\n    this.index = j; this.input.value = this.slotText(j); this.rerender(); this.input.select();\n  }\n\n  /** \u6846\u91CC\u6709\u5B57\u5C31\u7167\u539F\u6837\u8D34\u5230\u5F53\u524D\u8FD9\u4E2A\u97F3\uFF08\u4E0D\u5F80\u540E\u632A\uFF09\uFF1B\u7A7A\u6846 = \u6E05\u6389\u8FD9\u4E2A\u97F3\u7684\u5B57\u3002 */\n  private commitOnly(): void {\n    if (!this.open) return;\n    const st = this.host.get(), cur = tr(st)[this.index] as NoteTok, sp = splitPunct(this.input.value.trim()), v = sp.text;\n    if (!cur) return;\n    if (sp.phrase) { if (v) this.host.set(distributeFrom(st, this.index, splitSyllables(v)).st); this.host.set(insertPhraseAfter(this.host.get(), this.index)); return; }\n    if (!v) { if (cur.lyric) this.host.set({ ...st, song: withTrack(st.song, st.at.paper, st.at.part, tr(st).map((t, k) => (k === this.index ? { ...cur, lyric: null, hyph: undefined } : t))) }); return; }\n    if (v === this.slotText(this.index)) return;\n    // \u5B57\u6BCD\u540E\u9762\u7684\u300C-\u300D= \u8BCD\u6CA1\u5B8C\uFF08\u540C\u300C-\u300D\u952E\uFF09\uFF1B\u522B\u7684\u300C-\u300D\uFF08\u4E2D\u65E5\u6587\u540E\u9762\u3001\u5355\u72EC\u4E00\u4E2A\uFF09\u4EA4\u7ED9 splitSyllables = \u62D6\u8154\uFF0C\u548C\u7A7A\u683C\u90A3\u6761\u8DEF\u4E00\u6837\n    //   \uFF082026-10-13 Opus 5.5\uFF1Buser\u300C-\u7A7A\u683C\u663E\u793A -\u56DE\u8F66\u4E0D\u663E\u793A\u300D\uFF1A\u6B64\u524D\u56DE\u8F66\u4E00\u5F8B\u5265\u6389\u7ED3\u5C3E\u7684\u300C-\u300D\uFF0C\u5355\u72EC\u4E00\u4E2A\u300C-\u300D\u5265\u5B8C\u662F\u7A7A\u7684\u3001\u4EC0\u4E48\u90FD\u6CA1\u5199\uFF09\n    const hy = /[A-Za-z'\u2019]-$/.test(v);\n    const syl = splitSyllables(hy ? v.slice(0, -1) : v).map((s, k, a) => (k === a.length - 1 && hy ? { ...s, hyph: true } : s));\n    if (syl.length) this.host.set(distributeFrom(st, this.index, syl).st);\n  }\n\n  commitAndClose(): void { if (!this.open) return; this.commitOnly(); this.close(); }\n  close(): void { this.index = -1; this.input.value = \"\"; this.input.hidden = true; this.merge.hidden = true; this.hint.hidden = true; this.reading.hidden = true; this.rerender(); }\n}\n", "// marks.ts \u2014\u2014 \u8BB0\u53F7\uFF08\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\uFF09\u548C\u6587\u5B57\u4E4B\u95F4\u4E92\u8F6C\uFF1A\u8BB0\u53F7\u6846\u91CC\u663E\u793A\u4EC0\u4E48\u3001\u6253\u8FDB\u53BB\u7684\u5B57\u8BA4\u6210\u4EC0\u4E48\u3002\u7EAF\u51FD\u6570\uFF08Node \u91CC\u53EF\u6D4B\uFF09\u3002\n// created 2026-10-07 by Claude Opus 5.5\uFF08\u4ECE src/ui/mark-editor.ts \u62C6\u51FA\u6765\uFF09\nimport { type MarkTok, type MarkVal, TEMPO_WORDS, TEMPO_MIN, TEMPO_MAX } from \"./song.ts\";\nimport { KEY_LABEL } from \"./pitch.ts\";\n\n/** \u8BB0\u53F7 \u2192 \u6846\u91CC\u7684\u5B57\u3002 */\nexport function markText(t: MarkTok): string {\n  if (t.kind === \"key\") return `1=${KEY_LABEL[t.fifths]}`;\n  if (t.kind === \"time\") return `${t.beats}/${t.beatType}`;\n  return String(t.bpm);\n}\n/** \u6846\u91CC\u7684\u5B57 \u2192 \u8BB0\u53F7\u7684\u503C\uFF08\u8BA4\u4E0D\u51FA = null\uFF09\u3002 */\nexport function parseMark(kind: MarkTok[\"kind\"], raw: string): MarkVal | null {\n  const s = raw.trim().replace(/\\s+/g, \"\").replace(/\u266F/g, \"#\").replace(/\u266D/g, \"b\");\n  if (kind === \"key\") {\n    const v = s.replace(/^1=/, \"\");\n    let m = /^([+-]?\\d)$/.exec(v);\n    if (m) { const f = Number(m[1]); return f >= -7 && f <= 7 ? { kind, fifths: f } : null; }\n    m = /^(\\d)([#b])$/.exec(v);\n    if (m) { const f = Number(m[1]) * (m[2] === \"#\" ? 1 : -1); return f >= -7 && f <= 7 ? { kind, fifths: f } : null; }\n    const name = v.charAt(0).toUpperCase() + v.slice(1).toLowerCase();\n    for (const [f, label] of Object.entries(KEY_LABEL)) if (label.replace(\"\u266F\", \"#\").replace(\"\u266D\", \"b\") === name) return { kind, fifths: Number(f) };\n    return null;\n  }\n  if (kind === \"time\") {\n    const m = /^(\\d{1,2})\\/(\\d{1,2})$/.exec(s);\n    if (!m) return null;\n    const beats = Number(m[1]), beatType = Number(m[2]);\n    return beats >= 1 && beats <= 32 && [1, 2, 4, 8, 16, 32].includes(beatType) ? { kind, beats, beatType } : null;\n  }\n  const n = /(\\d{2,3})/.exec(s);\n  if (n) { const bpm = Number(n[1]); return bpm >= TEMPO_MIN && bpm <= TEMPO_MAX ? { kind, bpm } : null; }\n  const w = TEMPO_WORDS.find((x) => x.it.toLowerCase() === s.toLowerCase() || x.zh === s);\n  return w ? { kind, bpm: w.typical } : null;\n}\n\n", "// drum.ts \u2014\u2014 \u7AD6\u76F4\u6EDA\u8F6E\uFF08\u50CF iOS \u9009\u65E5\u671F\u7684\u90A3\u79CD\uFF09\uFF1A\u70B9\u5F00 pad \u7684\u65CB\u94AE\uFF0C\u4EE5\u90A3\u4E00\u683C\u4E3A\u4E2D\u5FC3\u5C55\u5F00\uFF08\u653E\u4E0D\u4E0B\u5C31\u5F80\u91CC\u632A\uFF09\u3001\u548C\u65CB\u94AE\u4E00\u6837\u5BBD\uFF0C\u6D6E\u5728\u97F3\u952E\u4E0A\u9762\u3002created 2026-10-07 by Claude Opus 5.5\n// user 2026-10-07\u300C\u6211\u60F3\u7684\u662F\u70B9\u4E86\u4E4B\u540E\u53D8\u6210\u4E00\u4E2Aoverlay\u7684\u540C\u6837\u5BBD\u5EA6\u7684\u7AD6\u76F4\u6EDA\u52A8\u6876\uFF1F\u300D\u2192\u300C2\u597D\u4E3B\u610F\uFF01 \u8BD5\u4E00\u4E0B\u5427\u300D\u300C1\u4E5F\u540C\u610F\u300D\u2192\n//   \u300C\u5BBD\u5EA6\u6BD4\u4F8B\u4E0D\u5408\u7406\uFF0C\u80FD\u4E0D\u80FD\u5171\u7528\u539F\u6765\u7684\u5BBD\u5EA6\u300D\uFF08\u51E0\u5217\u5408\u8D77\u6765 = \u65CB\u94AE\u90A3\u4E00\u683C\u7684\u5BBD\u5EA6\uFF09\u2192\n//   \u300C\u70B9\u4E86\u4E4B\u540E\u653E\u5B8C\u52A8\u753B\u518D\u56DE\u53BB\u54CD\u5E94\u592A\u6162\u4E86\uFF0C\u62D6\u52A8\u7684\u7269\u7406\u4E5F\u5F88\u96BE\u53D7\uFF0C\u80FD\u4E0D\u80FD\u6362\u6210\u6807\u51C6\u7684\u300D\u2192 \u7528\u6D4F\u89C8\u5668\u539F\u751F\u7684\u6EDA\u52A8 + \u5438\u9644\uFF08scroll-snap\uFF09\uFF0C\n//   \u60EF\u6027 / \u624B\u611F\u548C\u7CFB\u7EDF\u91CC\u522B\u7684\u5217\u8868\u4E00\u6837\uFF1B\u70B9\u4E00\u683C = \u7ACB\u523B\u9009\u4E2D\u3001\u7ACB\u523B\u6536\u8D77\uFF1B\u70B9\u5916\u9762 / Esc = \u6536\u8D77\uFF08\u70B9\u5916\u9762\u8FD9\u4E00\u4E0B\u5403\u6389\uFF0C\u4E0D\u987A\u624B\u6309\u5230\u97F3\u952E\uFF09\u3002\n//   \u4E0D\u6309\u65F6\u95F4\u81EA\u5DF1\u6536\u8D77\uFF08user\u300C\u70B9\u5F00\u4E4B\u540E\u5F39\u51FA\u6765\u7684\u6EDA\u8F6E\u4E0D\u5E94\u8BE5\u9650\u65F6\u81EA\u52A8\u5173\uFF0C\u8FD9\u6837\u6211\u51E0\u4E4E\u70B9\u4E0D\u4E86\u300D\uFF09\u3002\n// \u00B7 \u505C\u5728\u4E2D\u95F4\u9AD8\u4EAE\u5E26\u91CC\u7684\u90A3\u683C = \u9009\u4E2D\uFF0C\u4E00\u53D8\u5C31\u751F\u6548\uFF08\u65CB\u94AE\u4E0A\u7684\u5B57\u8DDF\u7740\u53D8 = \u9884\u89C8\uFF09\u3002\n// \u00B7 \u53EA\u5728\u70B9\u4E00\u4E0B\u65CB\u94AE\u65F6\u5C55\u5F00\uFF08\u6309\u4F4F\u6ED1 = \u5728\u65CB\u94AE\u90A3\u4E00\u683C\u91CC\u539F\u5730\u6ED1\uFF0C\u89C1 pad.ts\uFF1Buser\u300C\u6211\u5E0C\u671B\u624B\u6307\u677E\u4E86\u7ACB\u523B\u505C\uFF0C\u4E0D\u8981\u987F\u4E00\u4E0B\uFF0C\u8FD9\u662F\u5FEB\u901F\u8F93\u5165\u3002\u8981\u4E0D\u8FD8\u662F\u505A\u6210in place \u6ED1\u52A8\u53EA\u5728\u7A97\u683C\u91CC\u9762\u9884\u89C8\u300D\uFF09\u3002\n// \u00B7 \u4E00\u6839\u6EDA\u8F6E\u53EF\u4EE5\u5E76\u51E0\u5217\uFF08\u957F\u77ED + \u8FDE\u97F3\uFF09\uFF1A\u6BCF\u5217\u5404\u6EDA\u5404\u7684\u3002\n// \u00B7 loop \u5217 = \u73AF\uFF08\u4E94\u5EA6\u5708\uFF1Buser\u300C\u4E94\u5EA6\u5708\u5E94\u8BE5\u662F\u4E00\u4E2A\u73AF\u5427\u300D\uFF09\uFF1A\u5185\u5BB9\u6446 LOOP_COPIES \u4EFD\uFF0C\u4ECE\u4E2D\u95F4\u90A3\u4EFD\u5F00\u59CB\uFF1B\u6EDA\u505C\u4E86\u6084\u6084\u632A\u56DE\u4E2D\u95F4\u90A3\u4EFD\uFF08\u770B\u8D77\u6765\u4E00\u6837\uFF09\uFF0C\u4E00\u76F4\u8F6C\u90FD\u8F6C\u4E0D\u5230\u5934\u3002\n\nexport interface DrumColumn { items: string[]; index: number; width: number; title?: string; loop?: boolean }   // items = \u6BCF\u683C\u7684 HTML\uFF1Bloop = \u9996\u5C3E\u76F8\u63A5\nexport interface DrumOpts { onChange(col: number, index: number): void; onClose?(): void }\n/** setItems\uFF1A\u6362\u67D0\u4E00\u5217\u7684\u5185\u5BB9\uFF08\u4F4D\u7F6E\u4E0D\u53D8\uFF09\u2014\u2014\u957F\u77ED\u4E00\u53D8\uFF0C\u8FDE\u97F3\u90A3\u5217\u7684\u5C0F\u874C\u86AA\u8DDF\u7740\u53D8\uFF08user\u300C\u4E09\u8054\u4E94\u8054\u7684\u5C0F\u874C\u86AA\u5E94\u8BE5\u8DDF\u7740base\u65F6\u503Cadaptive\u7684\u53D8\u300D\uFF09\u3002 */\nexport interface DrumHandle { close(): void; setItems(col: number, items: string[]): void }\n\nconst ROW = 44, VISIBLE = 5;   // \u6BCF\u683C\u9AD8\u3001\u770B\u5F97\u89C1\u51E0\u683C\uFF08\u4E2D\u95F4\u90A3\u683C = \u9009\u4E2D\uFF09\nconst LOOP_COPIES = 7, RECENTER_MS = 140;   // \u73AF\uFF1A\u6446\u51E0\u4EFD\uFF1B\u6EDA\u505C\u4E86\u591A\u4E45\u632A\u56DE\u4E2D\u95F4\u90A3\u4EFD\n\nlet current: { close(): void } | null = null;\n\n/** \u5728 anchor\uFF08\u65CB\u94AE\uFF09\u90A3\u91CC\u5C55\u5F00\uFF1A\u9009\u4E2D\u5E26\u5BF9\u7740\u65CB\u94AE\uFF08\u65CB\u94AE\u5728\u6700\u4E0B\u9762\u4E00\u6392\u65F6\u653E\u4E0D\u4E0B\uFF0C\u5C31\u6574\u6839\u5F80\u4E0A\u632A\uFF09\u3002\u540C\u65F6\u53EA\u5F00\u4E00\u6839\uFF0C\u518D\u5F00\u4F1A\u5148\u6536\u8D77\u65E7\u7684\u3002 */\nexport function openDrum(anchor: HTMLElement, cols: DrumColumn[], o: DrumOpts): DrumHandle {\n  current?.close();\n  const r = anchor.getBoundingClientRect();\n  const box = document.createElement(\"div\");\n  box.className = \"drum\";\n  const total = cols.reduce((s, c) => s + c.width, 0) + (cols.length - 1) * 2;\n  let left = r.left;\n  if (left + total > innerWidth - 4) left = Math.max(4, r.right - total);   // \u53F3\u8FB9\u653E\u4E0D\u4E0B\uFF1A\u4ECE\u53F3\u5F80\u5DE6\u5C55\u5F00\n  Object.assign(box.style, { left: `${left}px`, top: `${Math.max(4, Math.min(r.top + r.height / 2 - (ROW * VISIBLE) / 2, innerHeight - ROW * VISIBLE - 4))}px`, height: `${ROW * VISIBLE}px` });\n  document.body.appendChild(box);\n  let closed = false;\n  const close = () => {\n    if (closed) return; closed = true;\n    box.remove(); document.removeEventListener(\"pointerdown\", outside, true); removeEventListener(\"keydown\", esc, true);\n    if (current === handle) current = null;\n    o.onClose?.();\n  };\n  // \u70B9\u5916\u9762 = \u53EA\u6536\u8D77\uFF1A\u8FD9\u4E00\u4E0B\u5403\u6389\uFF0C\u4E0D\u987A\u624B\u6309\u5230\u5E95\u4E0B\u7684\u97F3\u952E\uFF08\u4E0D\u7136\u6536\u4E2A\u6EDA\u8F6E\u5C31\u591A\u5199\u4E00\u4E2A\u97F3\uFF09\n  //   \u70B9\u5230\u53E6\u4E00\u4E2A\u65CB\u94AE\u4E0D\u5403\uFF1A\u65E7\u7684\u6536\u8D77\u3001\u90A3\u4E2A\u65CB\u94AE\u7167\u5E38\u5C55\u5F00\u81EA\u5DF1\u7684\n  const outside = (e: PointerEvent) => {\n    if (box.contains(e.target as Node)) return;\n    if (!(e.target as HTMLElement).closest?.(\"[data-knob]\")) { e.preventDefault(); e.stopPropagation(); }\n    close();\n  };\n  const esc = (e: KeyboardEvent) => { if (e.key === \"Escape\") { e.preventDefault(); e.stopPropagation(); close(); } };\n  setTimeout(() => document.addEventListener(\"pointerdown\", outside, true), 0);   // \u6253\u5F00\u5B83\u7684\u90A3\u4E00\u4E0B\u4E0D\u7B97\u300C\u70B9\u5916\u9762\u300D\n  addEventListener(\"keydown\", esc, true);\n\n  const wheels = cols.map((c, ci) => {\n    const col = document.createElement(\"div\");\n    col.className = \"drum-col\"; col.style.width = `${c.width}px`;\n    if (c.title) col.title = c.title;\n    box.appendChild(col);\n    return mountWheel(col, { items: c.items, index: c.index, loop: c.loop, onChange: (i) => o.onChange(ci, i), onPick: () => close() });   // \u70B9\u4E00\u683C = \u7ACB\u523B\u9009\u4E2D\u3001\u7ACB\u523B\u6536\u8D77\uFF08\u4E0D\u7B49\u52A8\u753B\uFF09\n  });\n  const handle: DrumHandle = {\n    close,\n    setItems: (ci, items) => wheels[ci]?.setItems(items),\n  };\n  current = handle;\n  return handle;\n}\nexport const closeDrum = () => current?.close();\n\nexport interface WheelOpts { items: string[]; index: number; row?: number; visible?: number; loop?: boolean; onChange(i: number): void; onPick?(i: number): void }\nexport interface WheelHandle { setItems(items: string[]): void; scrollTo(i: number): void }\n/** \u4E00\u6839\u6EDA\u8F6E\uFF08\u6D4F\u89C8\u5668\u539F\u751F\u6EDA\u52A8 + \u5438\u9644\uFF1A\u624B\u611F = \u7CFB\u7EDF\u91CC\u522B\u7684\u5217\u8868\uFF1B\u6162\u62D6\u5FAE\u8C03\u3001\u4E00\u7529\u9760\u60EF\u6027\u6ED1\u4E00\u5927\u6BB5\uFF09\u3002\u5F39\u51FA\u7684\u6EDA\u8F6E\uFF08\u4E0A\u9762\uFF09\u548C\u901F\u5EA6\u9762\u677F\u91CC\u5D4C\u7740\u7684\u5171\u7528\u4E00\u4EFD\u3002\n *  col = \u4E00\u4E2A class \u4E3A drum-col \u7684\u7A7A\u5143\u7D20\uFF08CSS \u7BA1\u6EDA\u52A8\u548C\u5438\u9644\uFF09\uFF0C\u9AD8\u5EA6 = row \u00D7 visible\u3002\u505C\u5728\u4E2D\u95F4\u90A3\u683C = \u9009\u4E2D\uFF0C\u4E00\u53D8\u5C31 onChange\uFF1B\u70B9\u4E00\u683C = onPick\u3002 */\nexport function mountWheel(col: HTMLElement, c: WheelOpts): WheelHandle {\n  const row = c.row ?? ROW, visible = c.visible ?? VISIBLE, padRows = Math.floor(visible / 2), n = c.items.length;\n  const copies = c.loop ? LOOP_COPIES : 1, mid = Math.floor(copies / 2) * n;\n  col.style.height = `${row * visible}px`;\n  col.innerHTML = `<div class=\"drum-pad\" style=\"height:${row * padRows}px\"></div>` +\n    Array.from({ length: n * copies }, (_, r) => `<div class=\"drum-item\" data-i=\"${r}\" style=\"height:${row}px\">${c.items[r % n]}</div>`).join(\"\") +\n    `<div class=\"drum-pad\" style=\"height:${row * padRows}px\"></div>`;\n  const items = [...col.querySelectorAll<HTMLElement>(\".drum-item\")], total = items.length;\n  const raw = () => Math.max(0, Math.min(total - 1, Math.round(col.scrollTop / row)));\n  let shown = c.index, recenter = 0;\n  const paint = () => {\n    const top = col.scrollTop, a = raw();\n    items.forEach((el, i) => { el.style.opacity = String(Math.max(0.25, 1 - (Math.abs(i * row - top) / row) * 0.3)); el.classList.toggle(\"on\", i === a); });\n  };\n  col.scrollTop = (c.index + mid) * row;\n  paint();\n  col.addEventListener(\"scroll\", () => {\n    paint();\n    const i = raw() % n; if (i !== shown) { shown = i; c.onChange(i); }\n    if (c.loop) {   // \u73AF\uFF1A\u6EDA\u505C\u4E86\u632A\u56DE\u4E2D\u95F4\u90A3\u4EFD\uFF08\u5185\u5BB9\u4E00\u6837\uFF0C\u770B\u4E0D\u51FA\u6765\uFF09\n      clearTimeout(recenter);\n      recenter = window.setTimeout(() => { const r = raw(); if (Math.abs(r - (r % n) - mid) >= n) col.scrollTop = ((r % n) + mid) * row; }, RECENTER_MS);\n    }\n  }, { passive: true });\n  col.addEventListener(\"click\", (e) => {\n    const it = (e.target as HTMLElement).closest<HTMLElement>(\".drum-item\"); if (!it) return;\n    const i = Number(it.dataset.i) % n;\n    if (i !== shown) { shown = i; c.onChange(i); }\n    if (c.onPick) c.onPick(i); else col.scrollTop = (i + mid) * row;\n  });\n  return {\n    setItems: (its) => items.forEach((el, i) => { const h = its[i % its.length]; if (h !== undefined) el.innerHTML = h; }),\n    scrollTo: (i) => { shown = i; col.scrollTop = (i + mid) * row; paint(); },   // \u5916\u9762\u6539\u4E86\u503C\uFF08\u70B9\u5019\u9009 / \u6253\u5B57\uFF09\uFF1A\u6EDA\u8FC7\u53BB\uFF0C\u4E0D\u518D\u56DE\u62A5 onChange\n  };\n}\n", "// metronome.ts \u2014\u2014 \u901F\u5EA6\u6846\u91CC\u7684\u5C0F\u8282\u62CD\u5668\uFF1A\u4E00\u4E2A\u81EA\u5DF1\u7EF4\u6301\u6446\u5E45\u7684\u6446\uFF08\u64D2\u7EB5\u5F0F\uFF09\uFF0C\u9891\u7387\u8DDF\u7740\u76EE\u6807\u901F\u5EA6\u5E73\u6ED1\u5730\u8FFD\u3002created 2026-10-10 by Claude Opus 5.5\n// user 2026-10-07\uFF08wishlist W-12\uFF09\uFF1A\u300C\u8C03\u901F\u5EA6\u7684\u65F6\u5019\u90A3\u4E2A\u5C0F\u8282\u62CD\u5668\u7684\u52A8\u753B\u5E94\u8BE5\u6709\u7269\u7406\u52A8\u753B\uFF0C\u4F60\u53EF\u4EE5\u60F3\u60F3\u6709\u4EC0\u4E48\u53D7\u8FEB\u7269\u7406\u6A21\u578B\u8BA9\u5C0F\u8282\u62CD\u5668\u8DDF\u4E0A\u4F60\u7684\u4E71\u8C03\u300D\u3002\n// \u95EE\u9898\u9648\u8FF0\uFF1A\u8F93\u5165 = \u76EE\u6807\u901F\u5EA6\uFF08\u6BCF\u5E27\u90FD\u53EF\u80FD\u53D8\uFF0C\u6EDA\u8F6E\u4E71\u62E8\u65F6\u4E00\u5E27\u4E00\u4E2A\u6570\uFF09\uFF1B\u8F93\u51FA = \u6446\u6746\u89D2\u5EA6\u3002\u8981\u6C42\uFF1A\u2460 \u7A33\u5B9A\u65F6\u6446\u5230\u4E00\u5934 = \u4E00\u62CD\uFF08\u6574\u4E2A\u6765\u56DE = \u4E24\u62CD\uFF09\u3001\u6446\u5E45 \u00B1AMP\uFF1B\n//   \u2461 \u901F\u5EA6\u600E\u4E48\u4E71\u53D8\uFF0C\u6446\u6746\u7684\u89D2\u5EA6\u548C\u89D2\u901F\u5EA6\u90FD\u8FDE\u7EED\uFF08\u4E0D\u8DF3\u3001\u4E0D\u91CD\u65B0\u8D77\u6446\uFF09\uFF1B\u2462 \u53D8\u4E86\u4E4B\u540E\u51E0\u767E\u6BEB\u79D2\u5185\u8FFD\u4E0A\u65B0\u7684\u901F\u5EA6\u3002\n// \u6A21\u578B\uFF1A\u03B8'' = \u2212\u03C9\u00B2\u03B8 + \u03BC(1 \u2212 r\u00B2)\u03B8'\uFF0Cr\u00B2 = (\u03B8/A)\u00B2 + (\u03B8'/(\u03C9A))\u00B2\uFF08van der Pol \u5F0F\u7684\u81EA\u6FC0\u632F\u5B50 = \u771F\u8282\u62CD\u5668\u7684\u64D2\u7EB5\uFF1A\u6446\u5E45\u5C0F\u4E86\u63A8\u4E00\u628A\u3001\u5927\u4E86\u8017\u4E00\u70B9\uFF0C\u6781\u9650\u73AF = \u6446\u5E45 A\u3001\u9891\u7387 \u03C9\uFF09\uFF1B\n//   \u03C9 \u672C\u8EAB\u4E00\u9636\u8FFD\u76EE\u6807\uFF08\u65F6\u95F4\u5E38\u6570 TAU\uFF09\uFF1A\u50CF\u5728\u6446\u7740\u7684\u65F6\u5019\u628A\u6446\u9524\u632A\u4E0A\u632A\u4E0B\uFF0C\u4E0D\u4F1A\u77AC\u79FB\u3002\u7EAF\u51FD\u6570\uFF0Cnode \u6D4B\u8BD5\uFF08test/metronome.test.ts\uFF09\u3002\nexport const AMP = 32;          // \u5EA6\uFF1A\u6446\u5230\u4E00\u5934\u7684\u89D2\u5EA6\uFF08\u540C\u539F\u6765\u7684 CSS \u52A8\u753B\uFF09\nconst TAU = 0.15;               // \u79D2\uFF1A\u9891\u7387\u8FFD\u76EE\u6807\u7684\u65F6\u95F4\u5E38\u6570\nconst MU = 4;                   // 1/\u79D2\uFF1A\u6446\u5E45\u56DE\u5230 AMP \u7684\u5FEB\u6162\nconst SUB = 1 / 480;            // \u79D2\uFF1A\u79EF\u5206\u6B65\u957F\u4E0A\u9650\uFF08rAF \u4E00\u5E27\u5207\u51E0\u5C0F\u6B65\uFF0C\u534A\u9690\u5F0F\u6B27\u62C9\uFF09\n\nexport interface MetroState { th: number; v: number; w: number }   // \u89D2\u5EA6\uFF08\u5EA6\uFF09\u3001\u89D2\u901F\u5EA6\uFF08\u5EA6 / \u79D2\uFF09\u3001\u5F53\u524D\u89D2\u9891\u7387\uFF08\u5F27\u5EA6 / \u79D2\uFF09\n/** \u901F\u5EA6\uFF08\u6BCF\u5206\u949F\u62CD\u6570\uFF09\u2192 \u89D2\u9891\u7387\uFF1A\u6446\u5230\u4E00\u5934 = \u4E00\u62CD \u2192 \u534A\u4E2A\u5468\u671F = \u4E00\u62CD\u3002 */\nexport const omegaOf = (bpm: number): number => (Math.PI * bpm) / 60;\n/** \u521A\u51FA\u73B0\uFF1A\u4ECE\u4E00\u5934\u653E\u624B\uFF08\u9759\u6B62\u5728 \u2212AMP\uFF09\uFF0C\u9891\u7387\u76F4\u63A5 = \u76EE\u6807\u3002 */\nexport const metroStart = (bpm: number): MetroState => ({ th: -AMP, v: 0, w: omegaOf(bpm) });\n/** \u5F80\u524D\u8D70 dt \u79D2\uFF08\u76EE\u6807\u901F\u5EA6 bpm\uFF09\u3002\n *  \u81EA\u6108\uFF082026-10-10 user\u300C\u5982\u679C\u4F60\u901A\u8FC7\u5FEB\u901F\u8C03\u9891\u7387abuse\u8282\u62CD\u5668\u7684\u8BDD\u5E94\u8BE5\u53EF\u4EE5\u81EA\u6108\uFF0C\u800C\u4E0D\u662F\u5361\u5728\u4E00\u4E2A\u5947\u602A\u7684\u52A8\u529B\u5B66\u4F4D\u7F6E\u91CC\u9762\u300D\uFF09\uFF1A\n *  \u2460 \u6781\u9650\u73AF\u5BF9\u6240\u6709\u72B6\u6001\u90FD\u662F\u5438\u5F15\u7684\uFF0C\u53EA\u6709\u6B63\u4E2D\u9759\u6B62\uFF08\u03B8 = 0\u3001\u03B8' = 0\uFF09\u8FD9\u4E00\u4E2A\u70B9\u4E0D\u52A8 \u2192 \u843D\u5230\u5B83\u9644\u8FD1\u5C31\u8F7B\u63A8\u4E00\u4E0B\uFF1B\n *  \u2461 \u6446\u5E45\u5927\u4E86\u7684\u300C\u8017\u300D\u90A3\u4E00\u9879\u6309\u9690\u5F0F\u7B97\uFF08\u65E0\u6761\u4EF6\u7A33\u5B9A\uFF1A\u901F\u5EA6\u4E71\u8DF3\u3001\u9891\u7387\u731B\u964D\u90FD\u4E0D\u4F1A\u7B97\u70B8\uFF09\uFF0Cr\u00B2 \u5C01\u9876\uFF1B\n *  \u2462 \u7B97\u51FA\u975E\u6570 / \u65E0\u7A77 = \u4ECE\u5934\u653E\u624B\u3002\u76EE\u6807\u901F\u5EA6\u672C\u8EAB\u4E5F\u5939\u5728\u5408\u7406\u8303\u56F4\u91CC\uFF0820\u2013400\uFF09\u3002 */\nexport function metroStep(s: MetroState, bpm: number, dt: number): MetroState {\n  let { th, v, w } = s;\n  if (!Number.isFinite(th) || !Number.isFinite(v) || !Number.isFinite(w) || w <= 0) ({ th, v, w } = metroStart(bpm));\n  const wt = omegaOf(Math.max(20, Math.min(400, Number.isFinite(bpm) ? bpm : 90))), n = Math.max(1, Math.ceil(Math.min(dt, 0.1) / SUB)), h = Math.min(dt, 0.1) / n;\n  for (let i = 0; i < n; i++) {\n    w += (wt - w) * (1 - Math.exp(-h / TAU));\n    const r2 = Math.min(50, (th / AMP) ** 2 + (v / (w * AMP)) ** 2);\n    if (r2 < 1e-4) v += w * AMP * 0.05;                       // \u2460 \u6B63\u4E2D\u9759\u6B62\uFF1A\u8F7B\u63A8\n    const c = MU * (1 - r2);\n    v = c >= 0 ? v + (-w * w * th + c * v) * h : (v - w * w * th * h) / (1 - c * h);   // \u2461 \u63A8 = \u663E\u5F0F\uFF1B\u8017 = \u9690\u5F0F\n    th += v * h;                                              // \u534A\u9690\u5F0F\uFF1A\u7528\u65B0\u901F\u5EA6\u8D70\u89D2\u5EA6\uFF08\u80FD\u91CF\u4E0D\u6F02\uFF09\n  }\n  return { th, v, w };\n}\n", "// mark-editor.ts \u2014\u2014 \u70B9\u8C31\u4E0A\u7684\u8BB0\u53F7\uFF08\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\uFF09\u5C31\u5730\u6539\uFF1A\u4E00\u4E2A\u6587\u672C\u6846 + \u4E00\u6392\u5019\u9009\u3002created 2026-10-07 by Claude Opus 5.5\n// user\u300C\u8C31\u5B50\u7684\u8C03\u53F7\u5E94\u8BE5\u4E5F\u662F\u4E00\u4E2A\u6309\u4E86\u53EF\u4EE5\u4E0B\u62C9\u7684\u6587\u672C\u6846\u3002\u4E0D\u662F\u5168\u5C40\u7684\uFF0Cbpm\u4E5F\u662F\uFF0C\u90FD\u662Ftoken\uFF0C\u53EF\u4EE5\u5417\u300D\u300C\u8FD9\u4E48\u8BF4\u62CD\u53F7\u4E5F\u662F\u300D\n//   \u300C\u901F\u5EA6\u8BB0\u53F7\u53EF\u4EE5\u7528\u8BED\u4E49+\u6570\u5B57\u5417\u3002\u7EDD\u5BF9\u96F6\u5EA6\u3002\u300D\u2192 \u901F\u5EA6\u5019\u9009 = \u8BCD + \u6570\uFF08\u6570\u636E\u53EA\u5B58\u6570\uFF0C\u8BCD\u6309\u6570\u63A8\uFF09\u3002\n// \u00B7 \u70B9\u5019\u9009 = \u7ACB\u523B\u6539\u3001\u6536\u8D77\uFF1B\u5728\u6846\u91CC\u6253\u5B57 + \u56DE\u8F66 = \u6539\uFF08\u8C03\u53F7\u8BA4 1=D / D / Bb / B\u266D / 2# / -3\uFF1B\u62CD\u53F7\u8BA4 3/4\uFF1B\u901F\u5EA6\u8BA4\u6570\u5B57\u6216\u901F\u5EA6\u8BCD\uFF09\uFF1B\n// \u00B7 Esc / \u70B9\u522B\u5904 = \u6536\u8D77\uFF08\u6846\u91CC\u6253\u4E86\u5408\u6CD5\u7684\u503C\u5C31\u7B97\u6539\uFF09\uFF1B\u65B0\u63D2\u7684\u8BB0\u53F7\uFF08pad\u300C\uFF0B\u300D\u63D2\u7684\uFF09\u6CA1\u6539\u503C\u5C31\u6536\u8D77 = \u64A4\u6389\u8FD9\u6B21\u63D2\u5165\uFF08\u6253\u65AD = \u53D6\u6D88\uFF09\uFF1B\n// \u00B7 \u4E2D\u9014\u7684\u8BB0\u53F7\u591A\u4E00\u4E2A\u300C\u5220\u9664\u300D\uFF1B\u8C31\u5934\u4E09\u4E2A\u5220\u4E0D\u6389\uFF1B\n// \u00B7 \u624B\u6307\uFF08\u7C97\u6307\u9488\uFF09\u4E0D\u81EA\u52A8\u5F39\u7CFB\u7EDF\u952E\u76D8\uFF0C\u514D\u5F97\u76D6\u4F4F\u5019\u9009\uFF1B\u8981\u6253\u5B57\u5C31\u70B9\u6846\u3002\n// \u00B7 \u901F\u5EA6\uFF082026-10-07 user\u300C\u9009\u901F\u5EA6\u7684\u65F6\u5019\u80FD\u4E0D\u80FD\u6709\u4E00\u4E2A\u6587\u672C\u6846\u65C1\u8FB9\u7684\u8282\u62CD\u5668\u52A8\u753B\u8BA9\u4F60\u53C2\u8003\uFF0C\u7136\u540E\u6709\u4E00\u4E2A\u786E\u8BA4\u6309\u94AE\u624Dcommit\uFF0C\u8FD9\u6837\u4F60\u53EF\u4EE5\u8BD5\u54EA\u4E2A\u5BF9\u300D\uFF09\uFF1A\n//   \u70B9\u5019\u9009 / \u6253\u5B57\u53EA\u6539\u300C\u8BD5\u542C\u503C\u300D\uFF0C\u6846\u65C1\u8FB9\u7684\u8282\u62CD\u5668\u6309\u5B83\u6446\uFF1B\u6309\u300C\u786E\u5B9A\u300D\uFF08\u6216\u56DE\u8F66\uFF09\u624D\u5199\u8FDB\u8C31\uFF1B\u70B9\u522B\u5904 / Esc = \u4E0D\u6539\uFF08\u65B0\u63D2\u7684 = \u64A4\u6389\uFF09\u3002\n//   2026-10-07 \u52A0\u6EDA\u8F6E\uFF08user\u300C\u901F\u5EA6\u8F93\u5165\u6846\u80FD\u4E0D\u80FD\u4E5F\u505A\u6210\u8FD9\u79CD\u80FDdial\u7684\u2026\u300D\uFF1B\u5206\u5F00\u6BCF\u4E00\u4F4D\u7684\u62E8\u6CD5 AI \u6CA1\u505A = \u4E00\u6839\u6EDA\u8F6E\uFF09\uFF1A\n//   \u5019\u9009\u5DE6\u8FB9\u4E00\u6839 \u2669 = TEMPO_MIN\uFF5ETEMPO_MAX\uFF0820\uFF5E400\uFF0C\u548C\u6253\u5B57\u540C\u4E00\u4E2A\u8303\u56F4\uFF1Auser\u300Ctyping\u5230400\u7684\u8BDDwheel\u4E5F\u5230400\u6216\u8005\u90FD300\u2026\u53CD\u6B63\u5BF9\u9F50\u4E00\u70B9\u300D\uFF09\u7684\u6EDA\u8F6E\n//   \uFF08\u548C pad \u5F39\u51FA\u7684\u6EDA\u8F6E\u540C\u4E00\u4EFD mountWheel\uFF1A\u6162\u62D6\u4E00\u683C \u00B11\u3001\u4E00\u7529\u9760\u60EF\u6027\u6ED1\u4E00\u5927\u6BB5\uFF09\uFF0C\u62E8\u5230\u5934\u5C31\u505C\uFF1B\u62E8\u5230\u54EA\u8BD5\u5230\u54EA\uFF0C\u540C\u6837\u6309\u300C\u786E\u5B9A\u300D\u624D\u5199\uFF1B\u6EDA\u8F6E / \u5019\u9009 / \u6253\u5B57\u4E09\u8FB9\u4E92\u76F8\u8DDF\u3002\n// \u8DDF\u8E2A\u7684\u662F token id\uFF08\u8C31\u6539\u4E86\u4E0B\u6807\u4F1A\u53D8\uFF09\u3002\n\nimport { type EditorState, type MarkTok, type MarkVal, setMark, deleteMark, headLen, TEMPO_WORDS, tempoWord, TEMPO_MIN, TEMPO_MAX, tr } from \"../score/song.ts\";\nimport { KEY_LABEL } from \"../score/pitch.ts\";\nimport { markText, parseMark } from \"../score/marks.ts\";\nimport type { Layout } from \"../render/engrave.ts\";\nimport { mountWheel, type WheelHandle } from \"../keyboard/drum.ts\";\nimport { metroStart, metroStep, type MetroState } from \"./metronome.ts\";\n\ninterface Host { get(): EditorState; set(next: EditorState): void }\n\nconst KEY_ORDER = [0, 1, 2, 3, 4, 5, 6, 7, -1, -2, -3, -4, -5, -6, -7];\nconst TIMES: [number, number][] = [[2, 4], [3, 4], [4, 4], [5, 4], [3, 8], [6, 8], [9, 8], [12, 8], [7, 8], [2, 2]];\nconst accName = (f: number) => (f > 0 ? `${f}\u266F` : f < 0 ? `${-f}\u266D` : \"\u65E0\u5347\u964D\");\nconst WHEEL_MIN = TEMPO_MIN, WHEEL_MAX = TEMPO_MAX, WHEEL_ROW = 40, WHEEL_VISIBLE = 5;\nconst WHEEL_ITEMS = Array.from({ length: WHEEL_MAX - WHEEL_MIN + 1 }, (_, i) => String(WHEEL_MIN + i));\nconst wheelIndex = (bpm: number) => Math.max(WHEEL_MIN, Math.min(WHEEL_MAX, Math.round(bpm))) - WHEEL_MIN;\n/** \u901F\u5EA6\u8BD5\u542C\u503C\u662F\u4ECE\u54EA\u8FB9\u6539\u7684\uFF1A\u90A3\u4E00\u8FB9\u81EA\u5DF1\u5DF2\u7ECF\u662F\u8FD9\u4E2A\u503C\uFF0C\u522B\u7684\u8FB9\u8DDF\u4E0A\u3002 */\ntype TempoSrc = \"open\" | \"chip\" | \"type\" | \"wheel\";\n\nexport class MarkEditor {\n  private box: HTMLDivElement;\n  private input: HTMLInputElement;\n  private list: HTMLDivElement;\n  private id = -1;\n  private fresh = false;\n  private initial = \"\";\n  private kind: MarkTok[\"kind\"] | null = null;\n  private pending: number | null = null;   // \u901F\u5EA6\uFF1A\u6B63\u5728\u8BD5\u7684 bpm\uFF08\u8FD8\u6CA1\u5199\u8FDB\u8C31\uFF09\n  private metro: HTMLDivElement;\n  private ok: HTMLButtonElement;\n  private wheelBox: HTMLDivElement;\n  private wheel: WheelHandle | null = null;\n  /** \u8282\u62CD\u5668\u6446\u6746\uFF1A\u4E00\u4E2A\u81EA\u6FC0\u7684\u6446\uFF0C\u9891\u7387\u8FFD\u7740\u8BD5\u542C\u7684\u901F\u5EA6\u8D70\uFF08W-12\uFF1Bsrc/ui/metronome.ts\uFF09\u3002raf = 0 = \u6CA1\u5728\u6446\u3002 */\n  private metroRaf = 0; private metroS: MetroState | null = null; private metroBpm = 90; private metroLast = 0;\n  system = 0;\n\n  constructor(parent: HTMLElement, private host: Host, private layout: () => Layout | null, private rerender: () => void) {\n    this.box = document.createElement(\"div\");\n    this.box.className = \"mark-ed\"; this.box.hidden = true;\n    this.box.innerHTML = `<div class=\"mark-row\"><input class=\"mark-in\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" autocapitalize=\"off\" enterkeyhint=\"done\" />` +\n      `<div class=\"metro\" hidden title=\"\u6309\u8FD9\u4E2A\u901F\u5EA6\u6446\uFF1A\u6446\u5230\u4E00\u5934 = \u4E00\u62CD\"><div class=\"metro-arm\"></div></div><button class=\"btn primary mark-ok\" hidden>\u786E\u5B9A</button></div>` +\n      `<div class=\"mark-body\"><div class=\"tempo-wheel\" hidden title=\"\u62E8\u901F\u5EA6\uFF1A\u4E00\u683C = 1\uFF0C\u4E00\u7529\u6ED1\u4E00\u5927\u6BB5\"></div><div class=\"mark-cands\"></div></div>`;\n    parent.appendChild(this.box);\n    this.input = this.box.querySelector(\"input\")!;\n    this.list = this.box.querySelector(\".mark-cands\")!;\n    this.metro = this.box.querySelector(\".metro\")!;\n    this.ok = this.box.querySelector(\".mark-ok\")!;\n    this.wheelBox = this.box.querySelector(\".tempo-wheel\")!;\n    this.ok.addEventListener(\"pointerdown\", (e) => { e.preventDefault(); this.confirmTempo(); });\n    this.input.addEventListener(\"input\", () => {   // \u901F\u5EA6\uFF1A\u6253\u5B57\u5C31\u8BD5\uFF08\u5408\u6CD5\u624D\u6362\u8282\u62CD\u5668\uFF09\uFF0C\u4E0D\u5199\u8FDB\u8C31\n      if (this.kind !== \"tempo\") return;\n      const v = parseMark(\"tempo\", this.input.value);\n      if (v && v.kind === \"tempo\") this.setPending(v.bpm, \"type\");\n    });\n    // \u5019\u9009\uFF1A\u6309\u4E0B\u5C31\u6539\uFF08pointerdown\uFF0C\u4E0D\u7B49 click\uFF0C\u514D\u5F97\u8F93\u5165\u6846\u5148\u5931\u7126\uFF09\n    this.list.addEventListener(\"pointerdown\", (e) => {\n      const b = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\"); if (!b) return;\n      e.preventDefault();\n      if (b.dataset.v === \"delete\") { this.remove(); return; }\n      const v = JSON.parse(b.dataset.v!) as MarkVal;\n      if (v.kind === \"tempo\") { this.setPending(v.bpm, \"chip\"); return; }   // \u901F\u5EA6\uFF1A\u53EA\u8BD5\uFF0C\u6309\u300C\u786E\u5B9A\u300D\u624D\u5199\n      this.apply(v); this.close();\n    });\n  }\n\n  get open(): boolean { return this.id >= 0; }\n  /** \u952E\u76D8\u8DEF\u7531\u6765\u7684\u52A8\u4F5C\uFF08src/keyboard/keys.ts \u7684\u300C\u8BB0\u53F7\u6846\u300D\u90A3\u51E0\u884C\uFF09\u3002 */\n  act(a: \"commit\" | \"cancel\"): void { if (a !== \"commit\") this.close(); else if (this.kind === \"tempo\") this.confirmTempo(); else this.commitAndClose(); }\n  private indexNow(): number { return tr(this.host.get()).findIndex((t) => t.id === this.id); }\n\n  /** \u6253\u5F00\u4E0B\u6807 i \u7684\u8BB0\u53F7\u3002fresh = \u521A\u63D2\u8FDB\u53BB\u7684\uFF08\u6CA1\u6539\u5C31\u6536\u8D77 = \u64A4\u6389\uFF09\u3002 */\n  openAt(i: number, fresh = false): void {\n    const st = this.host.get(), t = tr(st)[i];\n    if (!t || (t.kind !== \"key\" && t.kind !== \"time\" && t.kind !== \"tempo\")) return;\n    this.id = t.id; this.fresh = fresh;\n    this.initial = this.input.value = markText(t);\n    this.input.inputMode = t.kind === \"tempo\" ? \"numeric\" : \"text\";\n    this.input.placeholder = t.kind === \"key\" ? \"1=D / Bb / 2#\" : t.kind === \"time\" ? \"3/4\" : \"90\";\n    this.kind = t.kind;\n    this.fill(t, i >= headLen(tr(st)));\n    this.metro.hidden = this.ok.hidden = this.wheelBox.hidden = t.kind !== \"tempo\";\n    this.pending = null; this.wheel = null;\n    this.box.hidden = false;\n    this.reposition();\n    if (t.kind === \"tempo\") {   // \u6EDA\u8F6E\u8981\u7B49\u6846\u9732\u51FA\u6765\u624D\u80FD\u6EDA\u5230\u4F4D\n      const col = document.createElement(\"div\"); col.className = \"drum-col\";\n      this.wheelBox.replaceChildren(col);\n      this.wheel = mountWheel(col, { items: WHEEL_ITEMS, index: wheelIndex(t.bpm), row: WHEEL_ROW, visible: WHEEL_VISIBLE, onChange: (i) => this.setPending(WHEEL_MIN + i, \"wheel\") });\n      this.setPending(t.bpm, \"open\");\n    }\n    // \u6846\u6BD4\u8C31\u7684\u53EF\u89C1\u533A\u57DF\u4F4E\uFF08\u5C0F\u624B\u673A\uFF1Apad \u5360\u4E86\u4E0B\u534A\u5C4F\uFF09\uFF1A\u628A\u8C31\u5F80\u4E0A\u6EDA\u5230\u6846\u7684\u5E95\u9732\u51FA\u6765\uFF08\u6846\u9876\u4E0D\u6EDA\u51FA\u53BB\uFF09\n    const sc = this.box.closest<HTMLElement>(\".score\");\n    if (sc) {\n      const b = this.box.getBoundingClientRect(), v = sc.getBoundingClientRect();\n      const over = Math.min(b.bottom + 8 - v.bottom, b.top - v.top - 4);\n      if (over > 0) sc.scrollTop += over;\n    }\n    if (!matchMedia(\"(pointer: coarse)\").matches) { this.input.focus({ preventScroll: true }); this.input.select(); }\n  }\n\n  private fill(t: MarkTok, deletable: boolean): void {\n    const chip = (v: MarkVal, label: string, on: boolean, title = \"\") => `<button class=\"btn cand${on ? \" is-on\" : \"\"}\" data-v='${JSON.stringify(v)}' title=\"${title}\">${label}</button>`;\n    let h = \"\";\n    if (t.kind === \"key\") h = KEY_ORDER.map((f) => chip({ kind: \"key\", fifths: f }, `1=${KEY_LABEL[f]}`, f === t.fifths, accName(f))).join(\"\");\n    else if (t.kind === \"time\") h = TIMES.map(([b, bt]) => chip({ kind: \"time\", beats: b, beatType: bt }, `${b}/${bt}`, b === t.beats && bt === t.beatType)).join(\"\");\n    else {\n      const cur = tempoWord(t.bpm).it;\n      h = TEMPO_WORDS.map((w) => chip({ kind: \"tempo\", bpm: w.typical }, `<b>${w.it}</b><small>${w.zh} ${w.typical}</small>`, w.it === cur, `${w.from} \u8D77`)).join(\"\");\n    }\n    if (deletable) h += `<button class=\"btn cand danger\" data-v=\"delete\">\u5220\u9664</button>`;\n    this.list.innerHTML = h;\n    this.list.className = `mark-cands ${t.kind}`;\n  }\n\n  /** \u901F\u5EA6\uFF1A\u6362\u8BD5\u542C\u503C\u2014\u2014\u8282\u62CD\u5668\u6309\u5B83\u6446\uFF08\u91CD\u65B0\u8D77\u6446\uFF0C\u548C\u6570\u5B57\u5BF9\u5F97\u4E0A\uFF09\uFF0C\u5019\u9009\u9AD8\u4EAE\u5B83\u90A3\u4E00\u6863\uFF1B\u6846\u91CC\u7684\u6570\u5B57\u3001\u6EDA\u8F6E\u8DDF\u4E0A\uFF08\u6539\u7684\u90A3\u4E00\u8FB9\u4E0D\u52A8\uFF09\u3002 */\n  private setPending(bpm: number, src: TempoSrc): void {\n    this.pending = bpm;\n    if (src === \"chip\" || src === \"wheel\") this.input.value = String(bpm);\n    if (src !== \"wheel\") this.wheel?.scrollTo(wheelIndex(bpm));\n    // \u8282\u62CD\u5668\uFF1A\u4E0D\u518D\u91CD\u65B0\u8D77\u6446\u2014\u2014\u6446\u7740\u7684\u65F6\u5019\u6362\u901F\u5EA6 = \u6446\u9524\u632A\u4E86\uFF0C\u6446\u6746\u8FDE\u7EED\u5730\u8FFD\u4E0A\u65B0\u901F\u5EA6\uFF082026-10-07 user\u300C\u5C0F\u8282\u62CD\u5668\u7684\u52A8\u753B\u5E94\u8BE5\u6709\u7269\u7406\u52A8\u753B\u2026\u53D7\u8FEB\u7269\u7406\u6A21\u578B\u8BA9\u5C0F\u8282\u62CD\u5668\u8DDF\u4E0A\u4F60\u7684\u4E71\u8C03\u300D\uFF09\n    this.metroBpm = bpm;\n    if (!this.metroRaf) this.metroGo();\n    const word = tempoWord(bpm).it;\n    this.list.querySelectorAll<HTMLElement>(\"[data-v]\").forEach((b) => {\n      const v = b.dataset.v === \"delete\" ? null : (JSON.parse(b.dataset.v!) as MarkVal);\n      b.classList.toggle(\"is-on\", v?.kind === \"tempo\" && tempoWord(v.bpm).it === word);\n    });\n  }\n  /** \u901F\u5EA6\uFF1A\u300C\u786E\u5B9A\u300D= \u628A\u8BD5\u542C\u503C\u5199\u8FDB\u8C31\u3001\u6536\u8D77\u3002 */\n  private confirmTempo(): void {\n    if (this.pending !== null) {\n      const t = tr(this.host.get())[this.indexNow()];\n      if (t?.kind === \"tempo\" && t.bpm !== this.pending) this.apply({ kind: \"tempo\", bpm: this.pending });\n      else if (t?.kind === \"tempo\") this.fresh = false;   // \u65B0\u63D2\u7684\u3001\u8BD5\u8FC7\u4EE5\u540E\u786E\u5B9A\u7528\u539F\u503C\uFF1A\u4E5F\u7559\u4E0B\n    }\n    this.close();\n  }\n\n  /** \u91CD\u753B\u4E4B\u540E\u628A\u6846\u632A\u56DE\u90A3\u4E2A\u8BB0\u53F7\u4E0B\u9762\uFF08\u8BB0\u53F7\u6CA1\u4E86 = \u6536\u8D77\uFF09\u3002 */\n  reposition(): void {\n    if (!this.open) return;\n    const L = this.layout(), i = this.indexNow(), at = this.host.get().at, h = L?.marks.find((m) => m.index === i && L.systems[m.system]?.paper === at.paper && L.systems[m.system]?.part === at.part);\n    if (!L || !h) { this.id = -1; this.box.hidden = true; return; }\n    this.system = h.system;\n    const parentW = (this.box.parentElement?.clientWidth ?? 400), w = Math.min(340, parentW - 16);\n    Object.assign(this.box.style, { left: `${Math.max(8, Math.min(h.x, parentW - w - 8))}px`, top: `${h.y + h.h + 4}px`, width: `${w}px` });\n  }\n\n  private apply(v: MarkVal): void {\n    const i = this.indexNow(); if (i < 0) return;\n    this.fresh = false;   // \u6539\u8FC7\u4E86\uFF1A\u4E0D\u518D\u662F\u300C\u6CA1\u6539\u5C31\u64A4\u6389\u300D\n    this.host.set(setMark(this.host.get(), i, v));\n  }\n  private remove(): void {\n    const i = this.indexNow();\n    this.id = -1; this.box.hidden = true;\n    if (i >= 0) this.host.set(deleteMark(this.host.get(), i)); else this.rerender();\n  }\n\n  /** \u6536\u8D77\uFF1A\u6846\u91CC\u6253\u4E86\u5408\u6CD5\u7684\u65B0\u503C\u5C31\u5148\u6539\uFF08\u901F\u5EA6\u4F8B\u5916\uFF1A\u6CA1\u6309\u300C\u786E\u5B9A\u300D= \u4E0D\u6539\uFF09\u3002 */\n  commitAndClose(): void {\n    if (!this.open) return;\n    if (this.kind === \"tempo\") { this.close(); return; }\n    const t = tr(this.host.get())[this.indexNow()];\n    if (t && this.input.value.trim() !== this.initial) {\n      const v = parseMark(t.kind as MarkTok[\"kind\"], this.input.value);\n      if (v) this.apply(v);\n    }\n    this.close();\n  }\n  private metroGo(): void {\n    this.metroS ??= metroStart(this.metroBpm); this.metroLast = performance.now();\n    const arm = this.metro.firstElementChild as HTMLElement;\n    const tick = (now: number) => {\n      if (!this.open || this.metro.hidden) { this.metroStop(); return; }\n      const dt = Math.min(0.05, Math.max(0, (now - this.metroLast) / 1000)); this.metroLast = now;   // \u5207\u540E\u53F0\u56DE\u6765\u4E0D\u4E00\u53E3\u6C14\u8865\u51E0\u79D2\n      this.metroS = metroStep(this.metroS!, this.metroBpm, dt);\n      arm.style.transform = `rotate(${this.metroS.th.toFixed(2)}deg)`;\n      this.metroRaf = requestAnimationFrame(tick);\n    };\n    this.metroRaf = requestAnimationFrame(tick);\n  }\n  private metroStop(): void { if (this.metroRaf) cancelAnimationFrame(this.metroRaf); this.metroRaf = 0; this.metroS = null; }\n  /** \u6536\u8D77\u4E0D\u6539\uFF1B\u65B0\u63D2\u7684\u8BB0\u53F7\u6CA1\u6539\u8FC7 = \u64A4\u6389\u3002 */\n  close(): void {\n    if (!this.open) return;\n    this.metroStop(); this.wheel = null;\n    if (this.fresh) { this.remove(); return; }\n    this.id = -1; this.box.hidden = true; this.rerender();\n  }\n}\n", "// title-editor.ts \u2014\u2014 \u70B9\u7EB8\u9762\u6700\u4E0A\u9762\u7684\u6B4C\u540D\u5C31\u5730\u6539\uFF08\u53EF\u4E0D\u586B\uFF09\uFF1B2026-10-08 \u8D77\u4E5F\u7BA1\u6BCF\u5F20\u7EB8\u9876\u4E0A\u7684\u66F2\u6BB5\u540D\uFF08Claude Fable 5.1\uFF09\u3002created 2026-10-07 by Claude Opus 5.5\n// user 2026-10-07\u300C\u7EB8\u5F20\u7684\u6700\u4E0A\u9762\u52A0\u4E00\u4E2A\u53EF\u9009\u7684\u6B4C\u540D\u5427\uFF0C\u672A\u6765\u4E5F\u662F\u6587\u4EF6\u540D\u300D\u3002\n// \u56DE\u8F66 / \u70B9\u522B\u5904 = \u5199\u8FDB\u8C31\uFF08\u7A7A = \u4E0D\u586B\uFF09\uFF1BEsc = \u4E0D\u6539\u3002\u6B4C\u540D\u662F\u8C31\u4E0A\u7684\uFF08\u5B58\u6863 = MusicXML <work-title>\uFF09\uFF0C\u6539\u4E86\u5C31\u7B97\u6539\u8FC7\u6CA1\u5B58\u3002\nimport { type EditorState, setTitle, setPaperName, setArrangement } from \"../score/song.ts\";\nimport type { Layout } from \"../render/engrave.ts\";\n\ninterface Host { get(): EditorState; set(next: EditorState): void }\n\nexport class TitleEditor {\n  private input: HTMLInputElement;\n  open = false;\n  private paper: string | null = null;   // \u6B63\u5728\u6539\u54EA\u5F20\u7EB8\u7684\u66F2\u6BB5\u540D\uFF1Bnull = \u6B4C\u540D\n  private arr = false;                   // \u6B63\u5728\u6539\u7F16\u6392\u90A3\u4E00\u884C\uFF082026-10-08 \u6DF1\u591C Opus 5.5\uFF09\n\n  constructor(parent: HTMLElement, private host: Host, private layout: () => Layout | null) {\n    this.input = document.createElement(\"input\");\n    this.input.className = \"title-input\"; this.input.type = \"text\"; this.input.hidden = true;\n    this.input.placeholder = \"\";   // \u7A7A\u6846\u672C\u8EAB\u5C31\u662F\u63D0\u793A\uFF08user\u300Cdashed boxes\u5C31\u4E0D\u7528\u5B57\u4E86\u54C8\u54C8\u300D\uFF09 this.input.autocomplete = \"off\"; this.input.spellcheck = false; this.input.enterKeyHint = \"done\";\n    parent.appendChild(this.input);\n    this.input.addEventListener(\"keydown\", (e) => {\n      if (e.isComposing) return;\n      if (e.key === \"Enter\") { e.preventDefault(); e.stopPropagation(); this.commitAndClose(); }\n      else if (e.key === \"Escape\") { e.preventDefault(); e.stopPropagation(); this.close(); }\n    });\n    this.input.addEventListener(\"blur\", () => { if (this.open) this.commitAndClose(); });\n  }\n\n  /** \u5F00\u6846\uFF1A\u4E0D\u7ED9 paperId = \u6B4C\u540D\uFF1B\u7ED9\u4E86 = \u90A3\u5F20\u7EB8\u7684\u66F2\u6BB5\u540D\u3002 */\n  openNow(paperId: string | null = null): void {\n    this.open = true; this.paper = paperId; this.arr = false;\n    const song = this.host.get().song;\n    this.input.value = (paperId ? song.papers.find((p) => p.id === paperId)?.name : song.title) ?? \"\";\n    this.input.classList.toggle(\"paper\", !!paperId); this.input.classList.remove(\"arr\");\n    this.input.hidden = false;\n    this.reposition();\n    this.input.focus({ preventScroll: true }); this.input.select();\n  }\n  /** \u5F00\u7F16\u6392\u90A3\u4E00\u884C\u7684\u6846\uFF08\u66F2\u6BB5\u540D / \u5E8F\u53F7\u3001\u00D7N\u3001\u62EC\u53F7\u3001\u6700\u540E\u4E00\u4E2A [\u5FAA\u73AF\u6BB5]\uFF09\u3002 */\n  openArrangement(): void {\n    this.open = true; this.paper = null; this.arr = true;\n    this.input.value = this.host.get().song.arrangement ?? \"\";\n    this.input.classList.remove(\"paper\"); this.input.classList.add(\"arr\");\n    this.input.hidden = false;\n    this.reposition();\n    this.input.focus({ preventScroll: true }); this.input.select();\n  }\n  commitAndClose(): void {\n    if (!this.open) return;\n    const v = this.input.value, paper = this.paper, arr = this.arr;\n    this.close();\n    this.host.set(arr ? setArrangement(this.host.get(), v) : paper ? setPaperName(this.host.get(), paper, v) : setTitle(this.host.get(), v));\n  }\n  private close(): void { this.open = false; this.input.hidden = true; }\n  reposition(): void {\n    const L = this.layout(); if (!this.open || !L) return;\n    const t = this.arr ? L.arrangement : this.paper ? L.papers.find((p) => p.id === this.paper)?.title : L.title;\n    if (!t) { this.close(); return; }\n    Object.assign(this.input.style, { left: `${t.x}px`, top: `${t.y}px`, width: `${t.w}px`, height: `${t.h}px`, fontSize: `${t.size}px` });\n  }\n}\n", "// workspace.ts \u2014\u2014 \u7F16\u8F91\u6A21\u5F0F + \u5E95\u5EA7\uFF08pad \u90A3\u4E2A\u4F4D\u5B50\u653E\u4EC0\u4E48\uFF09\u7684\u552F\u4E00\u89C4\u5219\u8868\u3002created 2026-10-10 by Claude Opus 5.5\n// user 2026-10-10\uFF1A\u300C\u6A21\u5F0F\uFF01\u97F3\uFF0C\u6B4C\u8BCD\uFF0C\u5F3A\u5EA6\u548Carticulation\uFF01\u6211\u65E9\u5C31\u60F3\u7528\u9000\u683C\u5220\u5F3A\u5EA6\u66F2\u7EBF\u4E86\u3002\u8FD8\u6709\u4E00\u4E2A\u5C31\u662F\u64AD\u653E\u6A21\u5F0F\uFF0C\u9501\u5199\u8C31\uFF0C\u4F46\u662F\u53EF\u4EE5\u8C03\u5F55\u97F3\u5BA4\u300D\n//   \u2192\u300C\u5F3A\u5EA6\u548C\u6F14\u594F\u6CD5\u80FD\u4E0D\u80FD\u5408\u5E76\uFF0C\u5C31\u662F\u7B26\u53F7\u7F16\u8F91\uFF0C\u548C\u522B\u7684\u7B26\u53F7\u4E5F\u5408\u5E76\u300D\u2192\u300C\u5F55\u97F3\u5BA4\u7684\u952E\u76D8\u4F4D\u5316\uFF0C\u548C\u952E\u76D8\u4E92\u76F8\u6392\u65A5\uFF0C\u6216\u8005\u4E0D\u5982\u8BF4\u5C31\u662F\u952E\u76D8\u7684\u6A21\u5F0F\u548C\u7F16\u8F91\u6A21\u5F0F\u597D\u597D\u5BF9\u9F50\u4E00\u4E0B\u3002\n//   \u4E0D\u8FC7\u5F55\u97F3\u5BA4\u4E0D\u662F\u952E\u76D8\u3002\u8FD9\u4E48\u8BF4\u952E\u76D8\u7684\u6A21\u5F0F\u952E\u662F\u4E0D\u662F\u80FD\u6458\u4E0B\u6765\u3002\u597D\u597D\u7406\u4E00\u4E0B\u67B6\u6784\uFF0C\u53EF\u80FD\u5F97\u6536\u4E00\u4E0B\u5C4E\u5C71\u300D\u3002\n// \u6839\u95EE\u9898\uFF08\u8D26\u672C\u300C\u8F7B\u70B9\u6253\u67B6\u300D\uFF09\uFF1A\u4E00\u6B21\u8F7B\u70B9\u5728\u540C\u4E00\u5757\u5730\u65B9\u8981\u670D\u52A1\u592A\u591A\u4E1C\u897F\uFF08\u5149\u6807 / \u6B4C\u8BCD\u6846 / \u8BB0\u53F7\u83DC\u5355 / \u62D6\u97F3\u2026\uFF09\uFF0C\u9760\u547D\u4E2D\u533A\u5148\u540E\u987A\u5E8F\u5206 = \u8BEF\u70B9\u3002\n//   \u505A\u6CD5 = \u6A21\u5F0F\u5B9A\u300C\u8FD9\u4E00\u4E0B\u70B9\u7684\u662F\u54EA\u4E00\u5C42\u300D\uFF1A\u8C31\u9762\uFF08score-view\uFF09\u3001\u9000\u683C\u3001\u5E95\u5EA7\u90FD\u53EA\u770B\u8FD9\u5F20\u8868\uFF0C\u4E0D\u5728\u5404\u5904\u53E6\u5199\u5224\u65AD\u3002\n// \u7EAF\u6570\u636E + \u7EAF\u51FD\u6570\uFF08node \u6D4B\u8BD5\uFF09\uFF1BDOM \u5F52 main.ts\uFF08applyWorkspace\uFF09\u3002\n\n/** \u97F3 = \u5199\u97F3\uFF08\u97F3 / \u4F11\u6B62 / \u5C0F\u8282\u7EBF\uFF1Bpad \u97F3\u952E\uFF09\uFF1B\u8BCD = \u5199\u6B4C\u8BCD\uFF1B\u7B26 = \u4E00\u5207\u4E0D\u5360\u65F6\u503C\u7684\u8BB0\u53F7\uFF08\u529B\u5EA6 / \u6E10\u5F3A\u6E10\u5F31 / \u6F14\u594F\u6CD5 / \u8C03\u53F7\u62CD\u53F7\u901F\u5EA6 / \u53CD\u590D / \u98CE\u683C / \u53E5\u53F7\uFF1Bpad \u7B26\u53F7\u683C\uFF09\uFF1B\u542C = \u9501\u4F4F\u8C31\u53EA\u542C\u3002 */\nexport type Mode = \"notes\" | \"lyrics\" | \"symbols\" | \"listen\";\nexport const MODES: readonly Mode[] = [\"notes\", \"lyrics\", \"symbols\", \"listen\"];\n/** \u6A21\u5F0F\u6761\u4E0A\u7684\u94AE\uFF08v0.10.37\uFF09\uFF1A\u97F3 / \u8BCD / \u542C\u2014\u2014\u300C\u7B26\u300D\u4E0D\u518D\u662F\u4E00\u4E2A\u6A21\u5F0F\uFF0C\u662F\u300C\u97F3\u300D\u91CC\u7684\u53E6\u4E00\u9762\u952E\u76D8\uFF08\u5C0F\u952E\u76D8\u9876\u4E0A\u300C\u7B26 / \u97F3\u300D\u5207\uFF1Buser\u300C\u97F3\u548C\u7B26\u5E94\u8BE5\u53EA\u662F\u662F\u4E2A\u6A21\u5F0F\uFF0C\u4F60\u770B\u4E00\u4E0B\u5207\u6362\u653E\u54EA\u91CC\uFF0C\u53CD\u6B63\u4E0D\u5E94\u8BE5\u7528\u6A21\u5F0F\u6765\u5207\u300D\uFF09\u3002 */\nexport const MODE_BAR: readonly Mode[] = [\"notes\", \"lyrics\", \"listen\"];\n/** \u6A21\u5F0F\u6761\u4E0A\u54EA\u4E2A\u94AE\u4EAE\uFF1A\u7528\u7B26\u53F7\u683C\u65F6\u300C\u97F3\u300D\u4EAE\u3002 */\nexport const barMode = (m: Mode): Mode => (m === \"symbols\" ? \"notes\" : m);\nexport const MODE_LABEL: Record<Mode, string> = { notes: \"\u97F3\", lyrics: \"\u8BCD\", symbols: \"\u7B26\", listen: \"\u542C\" };\nexport const MODE_TITLE: Record<Mode, string> = {\n  notes: \"\u97F3\uFF1A\u5199\u97F3\u548C\u8BB0\u53F7\u2014\u2014\u8C31\u4E0A\u97F3\u548C\u8BB0\u53F7\u90FD\u80FD\u6539\uFF08\u70B9\u97F3 = \u5149\u6807\uFF0C\u7B14 / \u9F20\u6807\u62D6\u97F3 = \u6539\u97F3\u9AD8 / \u65F6\u503C\uFF1B\u70B9\u8BB0\u53F7 = \u5B83\u7684\u83DC\u5355\u3001\u6309\u4F4F\u62D6 = \u632A\uFF09\uFF1B\u5C0F\u952E\u76D8\u9876\u4E0A\u300C\u7B26 / \u97F3\u300D\u5207\u97F3\u952E / \u7B26\u53F7\u683C\uFF0C\u9000\u683C\u5220\u4EC0\u4E48\u8DDF\u7740\u952E\u76D8\",\n  lyrics: \"\u8BCD\uFF1A\u70B9\u97F3\u6216\u5B83\u4E0B\u9762 = \u5199\u8FD9\u4E2A\u97F3\u7684\u6B4C\u8BCD\uFF1B\u6309\u4F4F\u5B57\u62D6 = \u632A / \u5408\uFF1B\u9000\u683C = \u5220\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u7684\u5B57\",\n  symbols: \"\u7B26\uFF1A\u952E\u76D8 = \u7B26\u53F7\u683C\uFF08\u529B\u5EA6\u3001\u6E10\u5F3A\u6E10\u5F31\u3001\u6F14\u594F\u6CD5\u3001\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\u3001\u53CD\u590D\u3001\u98CE\u683C\u3001\u53E5\u53F7\uFF1B\u9000\u683C = \u5220\u8BB0\u53F7\uFF09\u3002\u8C31\u4E0A\u548C\u300C\u97F3\u300D\u4E00\u6837\uFF1A\u97F3\u548C\u8BB0\u53F7\u90FD\u80FD\u6539\",\n  listen: \"\u542C\uFF1A\u8C31\u9501\u4F4F\u9632\u8BEF\u89E6\u2014\u2014\u8F7B\u70B9\u53EA\u8BA4\u770B\u8C31\u7684\uFF08\u6B4C\u624B\u724C / \u7FFB\u7EB8 / \u672C\u6BB5\uFF09\uFF0C\u4E0D\u8DF3\u64AD\uFF1B\u957F\u6309 / \u53F3\u952E\u8C31\u9762 = \u4ECE\u8FD9\u513F\u653E / \u63A5\u7740\u653E / \u4ECE\u5934\u653E\uFF1B\u7A7A\u683C = \u653E / \u505C\uFF1B\u5E95\u4E0B\u662F\u6DF7\u97F3\u53F0\uFF08Esc \u56DE\u5230\u5199\uFF09\",\n};\n\n/** \u4E00\u4E2A\u6A21\u5F0F\u4E0B\u8C31\u9762\u7684\u6BCF\u79CD\u624B\u52BF\u5F52\u8C01\uFF08score-view \u53EA\u770B\u8FD9\u4E2A\uFF09\u3002 */\nexport interface ModeRules {\n  /** \u80FD\u6539\u8C31\uFF08false = \u542C\uFF1A\u8F7B\u70B9\u53EA\u8BA4\u770B\u8C31\u7684\u3001\u4E0D\u8DF3\u64AD\uFF1B\u957F\u6309 / \u53F3\u952E = \u4ECE\u8FD9\u513F\u653E\u7684\u5C0F\u83DC\u5355\uFF1B\u62D6 = \u6EDA\u52A8\uFF1B\u522B\u7684\u4E0D\u63A5\uFF09\u3002 */\n  edit: boolean;\n  /** \u7B14 / \u9F20\u6807\u6309\u5728\u97F3\u4E0A\u62D6 = \u6539\u97F3\u9AD8 / \u65F6\u503C\u3002 */\n  noteDrag: boolean;\n  /** \u70B9\u97F3 / \u6B4C\u8BCD\u4F4D = \u5F00\u6B4C\u8BCD\u6846\uFF1B\u6309\u4F4F\u5B57\u62D6 = \u632A / \u5408\u3002 */\n  lyrics: boolean;\n  /** \u70B9\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31 / \u8C03\u53F7\u62CD\u53F7\u901F\u5EA6 / \u53CD\u590D / \u98CE\u683C = \u5B83\u7684\u83DC\u5355\u6216\u6846\uFF1B\u6309\u4F4F\u62D6 = \u632A\u3002 */\n  symbols: boolean;\n  /** \u9000\u683C\u5220\u4EC0\u4E48\u3002 */\n  backspace: \"notes\" | \"lyrics\" | \"symbols\" | null;\n}\nexport const RULES: Record<Mode, ModeRules> = {\n  // \u97F3 / \u7B26\u5728\u8C31\u9762\u4E0A\u4E00\u8D77\u7F16\u8F91\uFF08v0.10.36\uFF1Buser\u300C\u97F3\u548C\u7B26\u5E94\u8BE5\u53EF\u4EE5\u4E00\u8D77\u7F16\u8F91\uFF0C\u800C\u4E0D\u662F\u5206\u5F00\u6765\uFF0C\u4E0D\u77E5\u9053\u8FD9\u6837\u4F1A\u9891\u7E41\u8BEF\u89E6\u5417\uFF0C\u6211\u89C9\u5F97\u4E0D\u5927\u4F1A\u3002\u7136\u540E\u8FD9\u91CC\u5C31\u662F\u952E\u76D8\u8FD8\u662F\u9700\u8981\u90A3\u4E2A\u5207\u6362\u673A\u5236\u300D\uFF09\uFF1A\n  //   \u4E24\u4E2A\u6A21\u5F0F\u8C31\u9762\u4E0A\u4E00\u6837\uFF08\u62D6\u97F3 + \u70B9 / \u62D6\u8BB0\u53F7\u90FD\u8BA4\uFF09\uFF1B\u53EA\u5DEE\u5E95\u4E0B\u7684\u952E\u76D8\uFF08\u97F3\u952E / \u7B26\u53F7\u683C\uFF09\u548C\u9000\u683C\u5220\u4EC0\u4E48\uFF08\u8DDF\u7740\u952E\u76D8\uFF09\n  notes: { edit: true, noteDrag: true, lyrics: false, symbols: true, backspace: \"notes\" },\n  lyrics: { edit: true, noteDrag: false, lyrics: true, symbols: false, backspace: \"lyrics\" },\n  symbols: { edit: true, noteDrag: true, lyrics: false, symbols: true, backspace: \"symbols\" },\n  listen: { edit: false, noteDrag: false, lyrics: false, symbols: false, backspace: null },\n};\n\n/** \u5E95\u5EA7\uFF08pad \u90A3\u4E2A\u4F4D\u5B50\uFF09\uFF1A\u97F3\u952E / \u7B26\u53F7\u683C / \u5F55\u97F3\u5BA4 / \u7A7A\uFF08\u6536\u8D77\uFF09\u3002\u5F55\u97F3\u5BA4\u4E0D\u662F\u952E\u76D8\uFF0C\u4F46\u5360\u540C\u4E00\u4E2A\u4F4D\u5B50\u3001\u548C\u952E\u76D8\u4E92\u65A5\u3002 */\nexport type Dock = \"keys\" | \"symbols\" | \"studio\" | \"none\";\nexport interface WorkspaceState {\n  mode: Mode;\n  /** \u952E\u76D8\u6536\u8D77\u4E86\uFF08pad \u7684\u300C\u6536\u8D77\u300D\uFF1B\u70B9\u8C31 / \u5E95\u4E0B\u7684\u300C\u952E\u76D8\u300D\u518D\u5F39\u51FA\u6765\uFF09\u3002 */\n  collapsed: boolean;\n  /** \u8BD5\u97F3\u4E2D\uFF08\u4E50\u5668\u76EE\u5F55 / \u4E50\u5668\u9875\u5F00\u7740\uFF1A\u5E95\u5EA7\u653E\u97F3\u952E\uFF0C\u53EA\u5F39\u4E0D\u5199\uFF09\u3002 */\n  tryout: boolean;\n}\n/** \u5E95\u5EA7\u653E\u4EC0\u4E48\uFF1A\u8BD5\u97F3 > \u6536\u8D77 > \u6309\u6A21\u5F0F\u2014\u2014\u6BCF\u4E2A\u6A21\u5F0F\u81EA\u5DF1\u7684\u952E\u76D8\uFF08v0.10.2\uFF1Buser\u300C\u80FD\u4E0D\u80FD\u6DF7\u97F3\u53F0\u5C31\u662F\u542C\u7684\u952E\u76D8\uFF0C\u4E0D\u7528\u5355\u72EC\u4E00\u4E2A\u952E\uFF0C\u5C31\u662F\u4E0D\u540C\u529F\u80FD\u6709\u4E0D\u540C\u952E\u76D8\u3002\u6B4C\u8BCD\u7684\u65F6\u5019\u662Fipad\u952E\u76D8\u300D\uFF09\uFF1A\n *  \u97F3 = \u97F3\u952E\u3001\u7B26 = \u7B26\u53F7\u683C\u3001\u542C = \u6DF7\u97F3\u53F0\u3001\u8BCD = \u7A7A\uFF08\u7528\u7CFB\u7EDF\u952E\u76D8\uFF09\u3002 */\nexport function dockOf(s: WorkspaceState): Dock {\n  if (s.tryout) return \"keys\";\n  if (s.collapsed) return \"none\";\n  return s.mode === \"notes\" ? \"keys\" : s.mode === \"symbols\" ? \"symbols\" : s.mode === \"listen\" ? \"studio\" : \"none\";\n}\n/** \u8FD9\u4E2A\u6A21\u5F0F\u5E95\u4E0B\u6709\u4E1C\u897F\u53EF\u6536\u8D77 / \u5F39\u51FA\u5417\uFF08\u5E95\u4E0B\u90A3\u7C92 tab \u9732\u4E0D\u9732\uFF1B\u542C = \u6DF7\u97F3\u53F0\uFF09\u3002 */\nexport const hasKeys = (m: Mode): boolean => m === \"notes\" || m === \"symbols\" || m === \"listen\";\n\n/** \u5E95\u5EA7\uFF08\u952E\u76D8 / \u6DF7\u97F3\u53F0\uFF09\u8D34\u53F3\u8FB9\u4E00\u680F\u7684\u5224\u65AD\u3002\u9ED8\u8BA4\u8D34\u5E95\uFF08user 2026-10-21\u300Cui\u9ED8\u8BA4\u952E\u76D8\u5728\u4E0B\u9762\uFF0C\u5C31\u662F\u5F88\u957F\u5F88\u5BBD\u7684\u5C4F\u5E55\uFF0C\u952E\u76D8\uFF0C\u6DF7\u97F3\u53F0\uFF0C\u90FD\u5728\u4E0B\u9762\u300D\uFF09\uFF1B\n *  \u540C\u65E5\u4E0B\u5348 user\u300C\u5B9E\u5728\u505A\u4E0D\u5230\u518D\u8D34\u53F3\u8FB9\u3002\u6BD4\u5982\u53EA\u80FD\u770B\u5230\u4E00\u884C\u8C31\u5B50\u300D\u2192 \u53D6\u4EE3\u4E0A\u5348\u90A3\u7248\u7684\u56FA\u5B9A\u9608\u503C\u300C\u6A2A\u5C4F\u4E14 \u2264 720 \u9AD8\u653E\u5DE6\u8FB9\u300D\uFF1A\n *  \u8D34\u5E95\u4E4B\u540E\u8C31\u9762\u5269\u4E0B\u7684\u9AD8\u770B\u4E0D\u5230 SIDE_DOCK_LINES \u884C\u8C31\uFF08\u4E00\u884C\u8C31 \u2248 LINE_SP \u4E2A\u7EBF\u95F4\u8DDD\uFF1A\u4E94\u7EBF 4 + \u4E0A\u4E0B\u7559\u767D + \u6B4C\u8BCD\uFF0C\u5355\u58F0\u90E8\uFF09= \u53EA\u5269\u7EA6\u4E00\u884C \u2192 \u5E95\u5EA7\u6539\u8D34**\u53F3\u8FB9**\uFF1B\n *  \u5C4F\u5E55\u4E0D\u591F\u5BBD\u653E\u53F3\u8FB9\u4E00\u680F\uFF08\u7AD6\u5C4F / \u624B\u673A\u7AD6\u7740\uFF09= \u7167\u65E7\u8D34\u5E95\u3002\u5E95\u5EA7\u7684\u9AD8\u6309\u952E\u76D8\u8D34\u5E95\u65F6\u91CF\uFF08\u6DF7\u97F3\u53F0\u8DDF\u952E\u76D8\u540C\u4E00\u4E2A\u5224\u65AD\uFF0C\u5207\u6A21\u5F0F\u5E95\u5EA7\u4E0D\u8DF3\uFF09\uFF1B\n *  \u4E00\u683C\u51E0 px \u6309\u8D34\u5E95\u65F6\u8C31\u9762\u7684\u81EA\u52A8\u5927\u5C0F\u7B97\uFF08\u548C\u7528\u6237\u7684\u7F29\u653E\u65E0\u5173\uFF09\u2014\u2014\u6240\u4EE5\u53EA\u8DDF\u8BBE\u5907\uFF08\u5C4F\u5E55\u5927\u5C0F + \u952E\u76D8\u6392\u6570\uFF09\u8D70\uFF0C\u4E0D\u8DDF\u6B4C\u8D70\u3002\n *  styles.css \u90A3\u4E00\u6863\u7684\u89C4\u5219\u5168\u6302\u5728 #stage[data-side=\"right\"] \u4E0A\uFF08main.ts syncDock \u5199\uFF1Btest/dock-layout.test.ts \u5B88\u7740 CSS \u91CC\u4E0D\u518D\u6709\u6309\u957F\u5BBD\u6BD4 / \u9AD8\u5EA6\u5206\u7684\u5E95\u5EA7 @media\uFF09\u3002added 2026-10-21 by Claude Fable 5.1 */\nexport const SIDE_DOCK_W = 340, SIDE_DOCK_LINES = 2, LINE_SP = 14, SIDE_DOCK_MIN_SCORE_W = 360;\nexport function sideDock(stageW: number, stageH: number, dockH: number, spPx: number): boolean {\n  if (stageW - SIDE_DOCK_W < SIDE_DOCK_MIN_SCORE_W) return false;\n  return stageH - dockH < SIDE_DOCK_LINES * LINE_SP * spPx;\n}\n/** \u73B0\u5728\u5E95\u5EA7\u5728\u53F3\u8FB9\u4E00\u680F\u5417\uFF08main.ts syncDock \u7B97\u597D\u5199\u5728 #stage \u7684 data-side \u4E0A\uFF1Bstudio.ts / layoutWidth \u8BFB\u8FD9\u91CC\uFF0C\u4E0D\u81EA\u5DF1\u7B97\uFF09\u3002 */\nexport const sideDocked = (stage: HTMLElement | null | undefined): boolean => stage?.dataset.side === \"right\";\n", "// part-colors.ts \u2014\u2014 \u6B4C\u624B\u7684\u989C\u8272\uFF08\u514B\u5236\u7684\u7C7B\u522B\u8272\uFF09+ \u8C31\u524D\u7684\u7B80\u5199\u3002\u7EAF\u51FD\u6570\uFF08node \u6D4B\u8BD5 test/part-colors.test.ts\uFF09\u3002created 2026-10-10 by Claude Opus 5.5\n// user 2026-10-10\u300C\u6211\u5E0C\u671B\u6709\u975E\u5E38\u514B\u5236\u7684color coding\uFF0C mpl\u7684 tab20\uFF1F \u7136\u540E\u4E0D\u540C\u989C\u8272\u9ED8\u8BA4\u7ED1\u4E0D\u540C\u4E50\u5668\u7C7B\u522B\u300D\u2192 AI \u63D0\u7684\u753B\u6CD5\uFF08\u6BCF\u884C\u5DE6\u8FB9\u7EC6\u8272\u6761 / \u540D\u5B57\u524D\u5C0F\u8272\u70B9 / \u64AD\u653E\u9AD8\u4EAE / \u5F55\u97F3\u5BA4\u5361\u7247\u9876\u8FB9\uFF1B\u97F3\u7B26\u7167\u65E7\u9ED1\uFF09\u2192 user\u300C\u4E50\u624B\u540D\u548C\u989C\u8272\u540C\u610F\u300D\u3002\n// \u7C7B\u522B = \u89D2\u8272\u7684 MusicXML sound id \u7684\u524D\u7F00\uFF08voice. / keyboard. / pluck. / strings. / brass. / wind. / synth. / drum. / metal. \u2026\uFF09\uFF0C\u4E0D\u7528\u7B49\u76EE\u5F55\u8F7D\u8FDB\u6765\u3002\n\n/** matplotlib \u7684 tab20\uFF1A\u5341\u79CD\u989C\u8272\uFF0C\u6BCF\u79CD\u4E00\u6DF1\u4E00\u6D45\u3002 */\nexport const TAB20 = [\"#1f77b4\", \"#aec7e8\", \"#ff7f0e\", \"#ffbb78\", \"#2ca02c\", \"#98df8a\", \"#d62728\", \"#ff9896\", \"#9467bd\", \"#c5b0d5\",\n  \"#8c564b\", \"#c49c94\", \"#e377c2\", \"#f7b6d2\", \"#7f7f7f\", \"#c7c7c7\", \"#bcbd22\", \"#dbdb8d\", \"#17becf\", \"#9edae5\"] as const;\n/** \u7C7B\u522B \u2192 tab20 \u7684\u7B2C\u51E0\u79CD\u989C\u8272\uFF080\u20139\uFF09\u3002 */\nconst HUE: Record<string, number> = { keys: 0, voice: 1, strings: 2, brass: 3, wind: 4, pluck: 5, synth: 6, perc: 7, mallet: 8, fx: 9 };\nexport type PartCategory = keyof typeof HUE;\nexport const CATEGORY_LABEL: Record<string, string> = { keys: \"\u952E\u76D8\", voice: \"\u4EBA\u58F0\", strings: \"\u5F26\u4E50\", brass: \"\u94DC\u7BA1\", wind: \"\u6728\u7BA1\", pluck: \"\u5F39\u62E8\", synth: \"\u5408\u6210\", perc: \"\u6253\u51FB\", mallet: \"\u6709\u97F3\u9AD8\u6253\u51FB / \u94C3\", fx: \"\u97F3\u6548 / \u5176\u4ED6\" };\n\n/** \u89D2\u8272\u7684 sound id \u2192 \u7C7B\u522B\u3002 */\nexport function categoryOfSound(sound: string): PartCategory {\n  const head = sound.split(\".\")[0];\n  if (head === \"voice\") return \"voice\";\n  if (head === \"keyboard\") return \"keys\";\n  if (head === \"pluck\") return \"pluck\";\n  if (head === \"strings\") return \"strings\";\n  if (head === \"brass\") return \"brass\";\n  if (head === \"wind\") return \"wind\";\n  if (head === \"synth\") return \"synth\";\n  if (head === \"drum\" || head === \"rattle\" || head === \"wood\" || head === \"percussion\") return \"perc\";\n  if (head === \"metal\" || head === \"pitched-percussion\") return \"mallet\";\n  return \"fx\";\n}\n/** \u6BCF\u4E2A\u58F0\u90E8\u5728 tab20 \u91CC\u7684\u4E0B\u6807\uFF1A\u540C\u4E00\u7C7B\u90FD\u7528\u6DF1\u7684\u90A3\u4E2A\uFF08v0.10.43\uFF1B\u6D45\u7684\u90A3\u534A\u4E0D\u7528\u4E86\u2014\u2014user 10-10\u300C\u6211\u4E0D\u592A\u559C\u6B22\u6DE1\u8272alternative\uFF0C\u53EF\u8BFB\u6027\u592A\u5DEE\u300D\u300110-11\u300C\u6211\u4E4B\u524D\u8BF4\u4E86\u4E8C\u53F7\u540C\u6837\u4E50\u5668\u4E0D\u8981\u7528\u5F31\u989C\u8272\uFF0C\u5B81\u613F\u7528\u548C\u4E00\u53F7\u4E00\u6837\u7684\u300D\uFF1B\n *  \u8D77\u56E0\uFF1A\u4E3B\u4EBA\u4E0D\u5728\u65F6\u5408\u79DF\u90A3\u4E00\u884C\u5F52 Piano 2\uFF0C\u5B83\u7684\u6D45\u84DD\u64AD\u653E\u9AD8\u4EAE\u5728\u7EB8\u4E0A\u51E0\u4E4E\u770B\u4E0D\u89C1\uFF0Cuser\u300Cpiano1\u4E0D\u5728\u7684\u65F6\u501923\u7684\u9AD8\u4EAE\u52A8\u753B\u6CA1\u6709\u300D\uFF09\u3002 */\nexport function partColorIndices(sounds: readonly string[]): number[] {\n  return sounds.map((s) => HUE[categoryOfSound(s)] * 2);\n}\n\n/** \u5408\u5531 / \u4EBA\u58F0\u9884\u8BBE\u7684\u8C31\u524D\u7B80\u5199\uFF08\u51FA\u7248\u8C31\u7684\u8001\u89C4\u77E9\uFF09\u3002 */\nconst VOICE_ABBR: Record<string, string> = { Vocals: \"Vo.\", \"Backing Vocals\": \"B. Vo.\", Soprano: \"S.\", Alto: \"A.\", Tenor: \"T.\", Bass: \"B.\" };\n/** \u540D\u5B57\u81EA\u5DF1\u7F29\u77ED\uFF08\u76EE\u5F55\u91CC\u6CA1\u6709\u7B80\u5199\u3001\u6216\u8005\u7528\u6237\u81EA\u5DF1\u8D77\u4E86\u540D\u5B57\uFF09\uFF1A\u4E2D\u6587 / \u65E5\u6587 = \u524D\u4E24\u4E2A\u5B57\uFF1B\u82F1\u6587\u4E00\u4E2A\u8BCD \u2264 5 \u4E2A\u5B57\u6BCD = \u539F\u6837\uFF0C\u957F\u7684 = \u524D\u4E09\u4E2A\u5B57\u6BCD\u52A0\u70B9\uFF1B\u51E0\u4E2A\u8BCD = \u9996\u5B57\u6BCD\u52A0\u70B9\u3002 */\nexport function shortName(name: string): string {\n  const t = name.trim(); if (!t) return t;\n  if (/[\u3040-\u30FF\u3400-\u9FFF\uAC00-\uD7AF]/.test(t)) return [...t].slice(0, 2).join(\"\");\n  const w = t.split(/\\s+/).filter(Boolean);\n  if (w.length > 1) return w.map((x) => x[0]).join(\"\").toUpperCase() + \".\";\n  return t.length <= 5 ? t : `${t.slice(0, 3)}.`;\n}\n/** \u663E\u793A\u5BBD\u5EA6\uFF1A\u534A\u89D2 = 1\uFF0C\u5168\u89D2\uFF08\u6C49\u5B57 / \u5047\u540D / \u8C1A\u6587 / \u5168\u89D2\u7B26\u53F7\uFF09= 2\u3002 */\nexport const dispWidth = (s: string): number => [...s].reduce((n, ch) => n + (/[\\u1100-\\u115f\\u2e80-\\ua4cf\\uac00-\\ud7a3\\uf900-\\ufaff\\ufe30-\\ufe4f\\uff00-\\uff60\\uffe0-\\uffe6]/.test(ch) ? 2 : 1), 0);\n/** \u7B80\u5199\u90A3\u4E00\u5217\u7684\u5B9A\u5BBD\uFF08\u663E\u793A\u5BBD\u5EA6\uFF1Bv0.9.41\uFF0Cuser \u7ECF\u4ED3\u9F20\u8F6C\u8FBE\u300C\u6CA1\u7B80\u5199\u7684\u80FD\u4E0D\u80FD\u60F3\u529E\u6CD5\u4E5F\u6309\u5B9A\u5BBD\u88C1\u4E00\u4E0B\uFF0C\u4E0D\u7136\u6709\u4E00\u4E2A\u6CA1\u67E5\u5230\u7B80\u5199\u5C31beat the propose\u4E86\uFF0C\u7136\u540E\u8BA9opus\u4E5F\u5904\u7406\u4E0B\u7528\u6237\u7684\u81EA\u5B9A\u4E49\u8F93\u5165\uFF0C\u4E5F\u8981\u5904\u7406\u5B9A\u5BBD\u300D\uFF09\u3002\n *  7\uFF1A\u4ED3\u9F20 v12 \u6709\u51FA\u5904\u7684 123 \u4E2A\u7B80\u5199\u91CC \u2264 7 \u7684\u7EA6\u516B\u6210\uFF0C\u53BB\u6389\u53E5\u70B9\u540E\u7684\u7A7A\u683C\u4E4B\u540E\u66F4\u591A\uFF1B\u518D\u5BBD\u8C31\u524D\u5C31\u592A\u5360\u5730\u65B9\uFF08iPad mini\uFF09\u3002 */\nexport const ABBR_W = 7;\n/** \u6309\u5B9A\u5BBD\u88C1\uFF08\u53F7\u4E5F\u7B97\u5728\u5BBD\u5EA6\u91CC\uFF09\uFF1A\u2460 \u653E\u5F97\u4E0B = \u539F\u6837 \u2461 \u53BB\u6389\u53E5\u70B9\u540E\u7684\u7A7A\u683C\uFF08Bar. Sax. \u2192 Bar.Sax.\uFF09\u2462 \u8FD8\u5BBD\u5C31\u622A\u2014\u2014\u62C9\u4E01\u5B57\u622A\u5230 W \u2212 1 \u518D\u8865\u300C.\u300D\uFF0C\u5168\u89D2\u5B57\u622A\u5230\u653E\u5F97\u4E0B\u4E3A\u6B62\uFF08\u4E0D\u8865\u70B9\uFF09\u3002 */\nexport function fitAbbr(base: string, num = \"\", W = ABBR_W): string {\n  if (dispWidth(base + num) <= W) return base + num;\n  const b = base.replace(/\\.\\s+/g, \".\");\n  if (dispWidth(b + num) <= W) return b + num;\n  const budget = Math.max(2, W - dispWidth(num)), cjk = dispWidth(b) > [...b].length;\n  let out = \"\", wd = 0;\n  for (const ch of b) { const cw = dispWidth(ch); if (wd + cw > (cjk ? budget : budget - 1)) break; out += ch; wd += cw; }\n  out = out.replace(/[\\s.]+$/, \"\");\n  return (cjk ? out : `${out}.`) + num;\n}\n/** \u8C31\u524D\u7684\u7B80\u5199\uFF1A\u540D\u5B57\u5C31\u662F\u4E50\u5668\u81EA\u5DF1\u7684\u540D\u5B57 = \u76EE\u5F55\u7ED9\u7684\u51FA\u7248\u8C31\u7B80\u5199\uFF08\u4ED3\u9F20 v12\uFF09\uFF1B\u4EBA\u58F0\u9884\u8BBE = \u8001\u89C4\u77E9\uFF1B\u522B\u7684\uFF08\u81EA\u5DF1\u8D77\u7684\u540D\u5B57\uFF09= \u540D\u5B57\u7F29\u77ED\u3002\u540D\u5B57\u540E\u9762\u7684\u53F7\uFF08Vocals 2\uFF09\u8DDF\u7740\u3002\u6700\u540E\u90FD\u6309\u5B9A\u5BBD\u88C1\uFF08fitAbbr\uFF09\u3002\n *  \u540D\u5B57\u6BD4\u8F83\u4E0D\u5206\u5927\u5C0F\u5199\uFF08v0.9.41 \u4FEE\uFF1A\u8C31\u4E0A\u300CPiano\u300D\u3001\u76EE\u5F55\u82F1\u6587\u540D\u7167 Wikidata \u60EF\u4F8B\u5C0F\u5199\u300Cpiano\u300D\uFF0C\u539F\u6765\u9010\u5B57\u6BD4 = 118 \u4E2A\u76EE\u5F55\u7B80\u5199\u4E00\u4E2A\u90FD\u6CA1\u7528\u4E0A\uFF1B\u4ED3\u9F20\u67E5\u51FA\u6765\u7684\uFF09\u3002 */\nexport function partAbbr(label: string, o: { conceptNames?: readonly string[]; conceptAbbr?: string; voice?: boolean }): string {\n  const m = / (\\d+)$/.exec(label), base = m ? label.slice(0, -m[0].length) : label, num = m ? ` ${m[1]}` : \"\", low = base.toLowerCase();\n  if (o.conceptAbbr && o.conceptNames?.some((n) => n.toLowerCase() === low)) return fitAbbr(o.conceptAbbr, num);\n  if (o.voice && VOICE_ABBR[base]) return fitAbbr(VOICE_ABBR[base], num);\n  return fitAbbr(shortName(base), num);\n}\n", "// score-view.ts \u2014\u2014 \u8C31\u9762\u677F\uFF1A\u753B\u8C31\u3001\u6307\u9488\u3001\u5149\u6807\u8DDF\u968F\u3001\u5C31\u5730\u5199\u6B4C\u8BCD\u3002created 2026-10-06 by Claude Opus 5.5\uFF1B2026-10-07 UX-2 \u6539\uFF1B2026-10-08 \u591A\u58F0\u90E8\u591A\u7EB8\uFF08Claude Fable 5.1\uFF09\n// \u9009\u4E2D = \u6539\uFF0C\u5149\u6807 = \u5199\uFF08user\u300C\u667A\u80FD\u8BC6\u522B\uFF0C\u9009\u4E2D\u97F3\u7B26\u5C31\u662F\u6539\uFF0C\u5149\u6807\u5C31\u662F\u5199 \u5BF9\u300D\uFF09\uFF1A\n//   2026-10-08 \u6539\u7684\u624B\u611F\uFF08user\u300C\u957F\u6309\u4E00\u4E2A\u97F3 = \u9009\u4E2D\u5B83\u3001\u8FDB\u9009\u533A\u6001\u3002\u8F7B\u70B9\u6C38\u8FDC\u4E0D\u9009\u4E2D\uFF0C\u53EA\u653E\u5149\u6807 + \u51FA\u58F0\u2026\u540C\u610F\uFF0C\u7B14\u4E5F\u957F\u6309\u300D\u300C\u5E26\u5B50 + \u68D2\u68D2\u7CD6\u628A\u624B \u548C\u6211\u60F3\u7684\u4E00\u6837\u300D\uFF09\uFF1A\n//   **\u8F7B\u70B9\u97F3\u7B26 = \u5149\u6807\u653E\u5230\u5B83\u540E\u9762\uFF08\u4E0D\u54CD\u3001\u4E0D\u9009\u4E2D\uFF1B\u624B\u6307 / \u7B14 / \u9F20\u6807\u90FD\u4E00\u6837\uFF09\uFF1B\u957F\u6309\uFF080.42 s \u4E0D\u52A8\uFF09= \u9009\u4E2D\u5B83\u3001\u8FDB\u9009\u533A\u6001\uFF0C\u4E0D\u62AC\u624B\u63A5\u7740\u62D6 = \u6269\u9009\uFF1B\u9009\u533A\u4E24\u7AEF\u5404\u4E00\u4E2A\u68D2\u68D2\u7CD6\u628A\u624B\uFF08\u62D6 = \u6269 / \u7F29\uFF09\uFF1B\n//   Shift+\u70B9 = \u628A\u9009\u4E2D\u6269\u5230\u5B83\uFF08\u7B14 / \u9F20\u6807\uFF09\uFF1B\u70B9\u522B\u5904 = \u653E\u5149\u6807\uFF08\u9009\u533A\u6D88\u5931\uFF09\u3002\u7B14 / \u9F20\u6807\u6309\u4F4F\u97F3\u7B26\u7ACB\u523B\u62D6 = \u6539\u97F3\u9AD8 / \u65F6\u503C\uFF08\u548C\u957F\u6309\u7528\u65F6\u95F4\u5206\u5F00\uFF1A0.42 s \u5185\u52A8\u4E86\u5C31\u662F\u62D6\uFF09\u3002\n//   \u70B9\u6B4C\u8BCD\u90A3\u4E00\u884C = \u5728\u90A3\u4E2A\u97F3\u4E0B\u9762\u6253\u5F00\u6B4C\u8BCD\u6846\uFF1B\n//   \u70B9\u8C31\u9762\u5199\u97F3 2026-10-07 \u62FF\u6389\uFF08user\u300C\u5148\u53BB\u6389\u89E6\u78B0\u52A0\u97F3\u7B26\u7684\u529F\u80FD\uFF0C\u4EE5\u540E\u7528\u4E13\u95E8\u7684toolstate\u505A\u300D\uFF09\u2014\u2014\u6307\u9488\u73B0\u5728\u53EA\u9009\u3001\u53EA\u62D6\u3001\u53EA\u653E\u5149\u6807\uFF1B\n//   \u70B9\u522B\u5904 = \u653E\u5149\u6807\u3002\u7B14 / \u9F20\u6807\u62D6\u7B26\u5934\uFF1A\u4E0A\u4E0B\u6539\u97F3\u9AD8\uFF08\u6309\u4E94\u7EBF\u8C31\u4E00\u7EA7\u4E00\u7EA7\u5438\u9644\uFF09\u3001\u5DE6\u53F3\u6539\u65F6\u503C\uFF08\u79BB\u6563\u9636\u68AF\uFF09\uFF1B\u624B\u6307\u62D6 = \u6EDA\u52A8\uFF0C\u624B\u6307\u8F7B\u70B9\u548C\u7B14\u4E00\u6837\u3002\n// \u591A\u58F0\u90E8\uFF08\u603B\u8C31\u5F0F\uFF09\uFF1A\u70B9\u54EA\u6761\u8C31\uFF0C\u5149\u6807 / \u9009\u4E2D\u5C31\u5230\u90A3\u6761 track\uFF08\u90A3\u5F20\u7EB8 \u00D7 \u90A3\u4E2A\u58F0\u90E8\uFF09\u2014\u2014\u4E0D\u53E6\u505A\u5207\u6362\u5668\uFF1Bpad \u5F80\u5149\u6807\u6240\u5728\u7684\u90A3\u6761\u5199\u3002\n// \u6B4C\u8BCD\u5C31\u5730\u5199\uFF08user\u300C\u6B4C\u8BCD\u8F93\u5165\u4E0D\u5E94\u8BE5\u653E\u5728\u952E\u76D8\u4E0A\uFF0C\u800C\u662F\u653E\u5728\u4E94\u7EBF\u8C31\u4E0B\u9762\u70B9\u8FDB\u53BB\u4E00\u4E2A\u4E00\u4E2A\u5199\u6216\u8005\u5220\u300D\uFF09\uFF1A\u89C1 lyric-editor.ts\u3002\n// \u70B9\u8BB0\u53F7\uFF08\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\uFF09= \u5C31\u5730\u6539\uFF1A\u89C1 mark-editor.ts\u3002\u70B9\u66F2\u6BB5\u540D = \u5C31\u5730\u6539\uFF08title-editor.ts\uFF09\uFF1B\u300C\u22EF\u300D= \u7EB8\u7684\u83DC\u5355\uFF1B\u300C\uFF0B \u65B0\u7684\u7EB8\u300D= \u52A0\u4E00\u5F20\u3002\n// \u6846\u9009\uFF08user\u300C\u6846\u9009 + \u6574\u4F53\u79FB\u8C03 / \u8F6C\u8C03 \u4E5F\u5148\u505A\u300D\uFF09\uFF1A\u7B14 / \u9F20\u6807\u5728\u7A7A\u767D\u5904\u62D6 = \u62C9\u4E00\u4E2A\u6846\uFF0C\u6846\u4F4F\u7684\u97F3\uFF08\u7B2C\u4E00\u4E2A\u5230\u6700\u540E\u4E00\u4E2A\u4E4B\u95F4\u7684\u4E00\u6574\u6BB5\uFF1B\u53EA\u7B97\u6846\u8D77\u70B9\u90A3\u6761\u8C31\u7684\uFF09\u5B9E\u65F6\u9009\u4E2D\uFF1B\n//   \u7A7A\u767D\u5904\u4E0D\u62D6 = \u653E\u5149\u6807\uFF08\u677E\u5F00\u65F6\u624D\u653E\uFF09\uFF1B\u624B\u6307\u62D6\u7167\u65E7\u662F\u6EDA\u52A8\u3002\n// \u89E6\u5C4F\u7F29\u653E\uFF082026-10-08 user\u300C\u624B\u673A\u4E4B\u7C7B\u4F60\u53EF\u4EE5\u653E\u5927pan pinch\u300D\u300C\u9ED8\u8BA4\u5F00\u300D\uFF09\uFF1A\u53CC\u6307\u634F\u5408 = \u653E\u5927 / \u7F29\u5C0F\u8FD9\u5F20\u7EB8\uFF08\u89C6\u56FE\u72B6\u6001\uFF0CCSS zoom\uFF0C\u4E0D\u8FDB\u6587\u4EF6\u3001\u548C\u300C\u8C31\u7684\u5927\u5C0F\u300D\u662F\u4E24\u56DE\u4E8B\uFF09\uFF0C\n//   \u53CC\u6307\u62D6 = \u5E73\u79FB\uFF1B\u653E\u5927\u540E\u5355\u6307\u62D6\u4E5F\u80FD\u6A2A\u7740\u6EDA\uFF1B\u89D2\u4E0A\u300C1:1\u300D\u590D\u4F4D\u3002\u53EA\u6709\u4E24\u6839\u624B\u6307\u624D\u89E6\u53D1\uFF0C\u4E0D\u78B0\u5355\u6307\u6EDA\u52A8 / \u8F7B\u70B9 / \u7B14\u3002\n// \u957F\u6309\u62D6\uFF082026-10-08 Opus 5.5\uFF1Buser\u300C\u6B4C\u8BCD\u7684\u5408\u80FD\u4E0D\u80FD\u4E5F\u6539\u6210\u957F\u6309\u62D6\u52A8\u3002\u4E0D\u7136\u6BCF\u6B21\u70B9\u6587\u672C\u6846\u662F\u8D85\u7EA7\u9EBB\u70E6\u7684\u300D\uFF0CAI \u63D0\u7684\u6574\u5957\u624B\u52BF user \u8BF4\u5F00\u5DE5\uFF09\uFF1A\n//   \u6B4C\u8BCD\uFF1A\u957F\u6309\u4E00\u4E2A\u5B57\uFF08\u7B14 / \u9F20\u6807\u6309\u4F4F\u76F4\u63A5\u62D6\uFF09\u5F80\u5DE6\u62D6\u5230\u524D\u4E00\u4E2A\u97F3 = \u5408 / \u65E9\u4E00\u4E2A\u97F3\u8D77\uFF0C\u5F80\u53F3 = \u665A\u4E00\u4E2A\u97F3\u8D77\uFF08\u7A7A\u51FA\u6765\u7684\u97F3\u53D8\u6210\u62D6\u8154\uFF09\uFF1B\u539F\u5730\u677E\u624B = \u9009\u4E2D\u8FD9\u4E2A\u97F3\u3002\u8F7B\u70B9\u7167\u65E7\u5F00\u6B4C\u8BCD\u6846\u3002\n//   \u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\uFF1A\u8F7B\u70B9 = \u5C0F\u83DC\u5355\uFF08\u6539 / \u5220\uFF09\uFF1B\u957F\u6309\u62D6 = \u632A\u5230\u522B\u7684\u97F3\u4E0A\uFF08\u4ECE\u90A3\u4E2A\u97F3\u8D77\uFF09\uFF1B\u539F\u5730\u677E\u624B = \u5C0F\u83DC\u5355\u3002\u62D6\u7684\u65F6\u5019\u8C31\u4E0A\u5B9E\u65F6\u5C31\u662F\u632A\u8FC7\u53BB\u7684\u6837\u5B50\uFF08undo \u4E00\u6B65\uFF09\u3002\n// \u8BD5\u542C\uFF1A\u7B14 / \u9F20\u6807\u6309\u4F4F\u97F3\u7B26 = \u4E00\u76F4\u54CD\uFF0C\u4E0A\u4E0B\u62D6\u5230\u65B0\u97F3\u9AD8\u5C31\u6362\u6210\u65B0\u7684\uFF08\u4E00\u5F20\u5634\uFF0C\u65B0\u7684\u9876\u6389\u65E7\u7684\uFF09\uFF0C\u677E\u624B\u505C\uFF1B\u6A2A\u62D6\u6539\u65F6\u957F\u4E0D\u51FA\u58F0\n//   \uFF08user\u300C\u62D6\u52A8\u97F3\u9AD8\u7684\u65F6\u5019\u6700\u597D\u4E5F\u6709\u9884\u89C8\u3002\u65B0\u7684\u62A2\u5360\u65E7\u7684\u3002\u7136\u540E\u6539\u65F6\u957F\u548Cvelocity\u5C31\u4E0D\u7528\u9884\u89C8\u4E86\u300D\uFF09\u3002\u624B\u6307\u8F7B\u70B9 = \u54CD\u4E00\u4E0B\u3002\n\nimport { DEFAULT_PAPER, paperOf, lineSp, spMm, staffMmOf, STAFF_MM, PAPER_LABEL, pageGeoOf } from \"../score/paper.ts\";\nimport { type EditorState, type NoteTok, type Song, setCaret, setCaretLead, setFocus, select, singleSel, setNote, setDur, keyAt, tr, TPQ, moveMark, trackOf, isTimed, shownAccAt } from \"../score/song.ts\";\nimport { moveSyllable, lyricSlot, MELISMA_MARK } from \"../score/lyrics.ts\";\nimport { fromDiatonic, diatonicIndex, keySpell, type Pitch } from \"../score/pitch.ts\";\nimport { engrave, attachLayoutFns, LYRIC_EM, type EngraveOpts, type Layout, type PartView, type HitNote, type LyricHit, type DynHit, type Slot, type CaretHead, type ClefHit, type SystemBox } from \"../render/engrave.ts\";\nimport { toSvg, toSvgParts } from \"../render/svg.ts\";\nimport { lyricFont, measurerOn } from \"../render/lyric-font.ts\";\nimport type { LayoutJob, LayoutReply, SvgParts } from \"../render/layout-worker.ts\";\n/** \u8FD9\u4E00\u6B21\u6392\u7248\u7528\u7684\u51E0\u4F55\uFF08\u8C31\u5927\u5C0F / \u7EB8\u5BBD / \u4E25\u683C\u6309\u7EB8 / \u5206\u9875 / \u8FB9\u8DDD / \u6A2A\u5377\uFF09\u3002 */\ntype FrameNow = { sp: number; width: number; strict: boolean; page: { h: number; l: number; r: number; t: number; b: number } | null; margins: { l: number; r: number; t: number; b: number }; hscroll: boolean };\nimport { span, record } from \"./perf-trace.ts\";\nimport { LyricEditor } from \"./lyric-editor.ts\";\nimport { MarkEditor } from \"./mark-editor.ts\";\nimport { TitleEditor } from \"./title-editor.ts\";\nimport { RULES, type ModeRules } from \"../app/workspace.ts\";\nimport { TAB20 } from \"./part-colors.ts\";\n/** \u4E00\u4E2A\u5149\u6807\u4F4D\u7F6E\u7684\u8EAB\u4EFD\uFF08\u7EB8 | \u58F0\u90E8 | \u4E0B\u6807\uFF09\uFF1A\u884C\u672B / \u884C\u9996\u7684\u753B\u6CD5\u53EA\u5BF9\u8FD9\u4E00\u4E2A\u4F4D\u7F6E\u6709\u6548\u3002 */\nconst caretKey = (st: EditorState): string => `${st.at.paper}|${st.at.part}|${st.caret}`;\n\n/** \u8FDE\u7EED\u6392\u6CD5\u7684\u8FB9\u8DDD\uFF08sp\uFF09\uFF1A\u7EB8\u7684\u771F\u8FB9\u8DDD\u53EA\u5728\u5206\u9875\u91CC\u753B\uFF08\u6240\u89C1\u5373\u6240\u5F97\uFF09\uFF1B\u8FDE\u7EED = \u4E00\u5708\u8212\u670D\u7684\u7A84\u8FB9\uFF0C\u884C\u5BBD\u7167\u65E7\u662F\u7248\u5FC3\u3002 */\nconst CONT_MARGIN = { l: 1.5, r: 1.5, t: 1.5, b: 2 } as const;\n/** \u62D6\u65F6\u503C\u7684\u9636\u68AF\uFF1A\u4E09\u5341\u4E8C\u5206\u8D77\uFF0Cplain \u4E0E\u9644\u70B9\u4EA4\u66FF\uFF08\u90FD\u753B\u5F97\u51FA\u6765\uFF09\u3002 */\nconst DUR_LADDER = [6, 12, 18, 24, 36, 48, 72, 96, 144, 192].map((v) => (v * TPQ) / 48);\n\nexport interface ScoreViewHost {\n  get(): EditorState; set(next: EditorState, opts?: { gesture?: string }): void;   // gesture = \u8FDE\u7EED\u52A8\u4F5C\u7684\u540D\u5B57\uFF08\u62D6 = \"drag\"\uFF09\uFF1A\u5BBF\u4E3B\u7684 undo \u628A\u5B83\u4EEC\u5E76\u6210\u4E00\u6B65\n  /** \u5531\u4E0B\u6807 i \u90A3\u4E2A\u97F3\uFF08\u5149\u6807\u6240\u5728\u90A3\u6761 track \u7684\uFF09\uFF1Ahold = \u6309\u4F4F\u4E00\u76F4\u54CD\uFF08\u7B49 release\uFF09\uFF0C\u5426\u5219\u54CD\u4E00\u4E0B\u3002 */\n  audition?(i: number, hold?: boolean): void;\n  /** \u62D6\u97F3\u9AD8\u65F6\u6362\u5230\u4E0B\u6807 i \u7684\u65B0\u97F3\u9AD8\uFF08\u65B0\u7684\u9876\u6389\u65E7\u7684\uFF1B\u600E\u4E48\u9876\u7531\u91C7\u6837\u5668\u5B9A\uFF1A\u6ED1\u8FC7\u53BB\u6216\u91CD\u65B0\u8D77\u97F3\uFF09\u3002 */\n  glide?(i: number): void;\n  release?(): void;\n  /** \u542C\u6A21\u5F0F\u91CC\u957F\u6309 / \u53F3\u952E\u8C31\u9762\uFF08\u8F7B\u70B9\u4E0D\u8DF3\u64AD\uFF0C\u9632\u8BEF\u89E6\uFF1Buser 2026-10-10\u300C\u542C\u6A21\u5F0F\u4E5F\u4E0D\u5E94\u8BE5\u8BEF\u89E6\u6478\u5BFC\u81F4\u8DF3\u64AD\u3002\u53EF\u4EE5\u8FD8\u662F\u7528\u957F\u6309/\u53F3\u952Econtext menu\u300D\uFF09\uFF1A\n   *  \u70B9\u5728\u97F3 / \u4F11\u6B62\u4E0A = index\uFF08\u5B83\u6240\u5728\u7684\u58F0\u90E8\uFF09\uFF1B\u7A7A\u767D = caret\uFF08\u90A3\u4E00\u884C\u5149\u6807\u4F1A\u843D\u7684\u4F4D\u7F6E\uFF09\u3002\u5BBF\u4E3B\u5F00\u5C0F\u83DC\u5355\uFF08\u4ECE\u8FD9\u513F\u653E\u2026\uFF09\u3002 */\n  onListenMenu?(at: { x: number; y: number }, target: { paper: string; part: string; index: number | null; caret: number; tick: number }): void;   // tick = \u70B9\u7684\u90A3\u4E00\u523B\uFF08\u8FD9\u5F20\u7EB8\u4E0A\uFF1B\u8865\u9F50\u7684\u7A7A\u5C0F\u8282 / \u5408\u79DF\u53E0\u8D77\u6765\u7684\u884C\u90FD\u7B97\u5BF9\uFF09\n  /** \u4E94\u7EBF\u8C31\u50CF\u6587\u672C\u6846\uFF08user\u300C\u53EF\u4EE5\u60F3\u8C61\u4E94\u7EBF\u8C31\u662F\u6587\u672C\u6846\uFF0C\u4F60touch\u70B9\u4E86\u4F1A\u5F39\u952E\u76D8\u3002\u7136\u540E\u70B9\u522B\u7684\u5730\u65B9\u4F1A\u9690\u85CF\u300D\uFF09\uFF1A\n   *  staff = \u70B9\u5728\u8C31\u4E0A\uFF08\u97F3 / \u7A7A\u767D / \u6846\u9009\uFF09\uFF1Btext = \u6253\u5F00\u4E86\u8981\u7CFB\u7EDF\u952E\u76D8\u7684\u6846\uFF08\u6B4C\u8BCD / \u6B4C\u540D\uFF09\u3002\u8BB0\u53F7\u6846\u4E0D\u7B97\uFF08\u89E6\u5C4F\u4E0A\u4E0D\u5F39\u7CFB\u7EDF\u952E\u76D8\uFF09\u3002 */\n  focus?(where: \"staff\" | \"text\"): void;\n  /** \u6309\u62CD\u53F7\u81EA\u52A8\u753B\u5C0F\u8282\u7EBF\u5F00\u7740\u6CA1\u6709\uFF08\u9ED8\u8BA4\u5F00\uFF09\u3002 */\n  autoBars?(): boolean;\n  /** \u8981\u753B\u7684\u58F0\u90E8\uFF08\u9690\u85CF\u7684\u4E0D\u5728\u91CC\u9762\uFF1B\u987A\u5E8F = \u603B\u8C31\u4ECE\u4E0A\u5230\u4E0B\uFF09\u3002 */\n  parts(): PartView[];\n  /** \u6B4C\u624B\u724C\uFF1A\u67D0\u5F20\u7EB8\u7B2C\u4E00\u884C\u67D0\u6761\u8C31\u5DE6\u8FB9\u7684\u58F0\u90E8\u540D\u70B9\u4E86\uFF08\u90A3\u6761\u5DF2\u7ECF\u6210\u4E86\u5149\u6807\u6240\u5728\u7684 track\uFF09\u3002 */\n  onPart?(paper: string, part: string, at?: { left: number; top: number; right: number; bottom: number }): void;   // at = \u6B4C\u624B\u724C\u5728\u5C4F\u5E55\u4E0A\u7684\u6846\uFF08\u8F68\u7684\u5C0F\u5361\u6328\u7740\u5B83\u5F00\uFF09\n  /** \u7EB8\u9876\u300C\u22EF\u300D\u70B9\u4E86\uFF08\u7EB8\u7684\u83DC\u5355\uFF09\uFF1B\u6273\u624B\u65C1\u7684\u300C\uFF0B\u300D\u70B9\u4E86\uFF08\u65B0\u7684\u7EB8\uFF09\uFF1B\u6B4C\u540D\u5DE6\u8FB9\u300C\u2039 \u203A\u300D\u70B9\u4E86\uFF08\u4E0A\u4E00\u5F20 / \u4E0B\u4E00\u5F20\u7EB8\uFF09\u3002 */\n  onPaperMenu?(paper: string): void;\n  onAddPaper?(): void;\n  onNav?(dir: -1 | 1): void;\n  /** \u300C\u2039 2/3 \u203A\u300D\u65C1\u8FB9\u7684\u300C\u672C\u6BB5\u300D\u5F00\u5173\u70B9\u4E86\uFF08\u89C6\u56FE\u8303\u56F4\uFF1A\u672C\u6BB5 \u21C4 \u5168\u90E8\uFF09\u3002 */\n  onScopeToggle?(): void;\n  /** \u6BCF\u5F20\u7EB8\u81EA\u5DF1\u90A3\u7EC4\u66F2\u6BB5\u63A7\u4EF6\uFF1A\u4ECE\u8FD9\u5F20\u7EB8\u5F80\u524D / \u5F80\u540E\u8DF3\uFF1B\u300C\u672C\u6BB5\u300D= \u53EA\u770B\u8FD9\u5F20\uFF08\u5DF2\u7ECF\u662F = \u56DE\u5230\u5168\u90E8\uFF09\u3002 */\n  onNavFrom?(paper: string, dir: -1 | 1): void;\n  onScopeOf?(paper: string): void;\n  /** \u7EB8\u53F3\u4E0A\u89D2\u7684\u5C0F\u94AE\uFF08\u7EB8\u5F20\uFF09\u70B9\u4E86\u3002 */\n  onPaper?(): void;\n  /** \u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\u70B9\u4E86\uFF08\u6216\u957F\u6309\u539F\u5730\u677E\u624B\uFF09\uFF1A\u5F00\u5C0F\u83DC\u5355\uFF08at = \u5C4F\u5E55\u5750\u6807\uFF1B\u90A3\u6761 track \u5DF2\u7ECF\u662F\u5149\u6807\u6240\u5728\u7684\u4E86\uFF09\u3002 */\n  onMarkPress?(index: number, at: { x: number; y: number }): void;\n  /** \u8BF4\u4E00\u58F0\uFF08\u62D6\u6B4C\u8BCD\u632A\u4E0D\u52A8\u3001\u632A\u529B\u5EA6\u8BB0\u53F7\u9876\u6389\u4E86\u539F\u6765\u7684\uFF09\u3002 */\n  notice?(text: string): void;\n  /** \u70B9\u4E86\u8C31\u53F7\uFF08\u884C\u9996 / \u884C\u4E2D\u95F4\uFF09\u6216\u516B\u5EA6\u7EBF\u5F00\u5934\u7684\u5B57\uFF08v0.9.28\uFF09\uFF1Aat = \u5C4F\u5E55\u5750\u6807\uFF08\u5C0F\u83DC\u5355\u5F00\u5728\u90A3\uFF09\u3002 */\n  onClef?(hit: ClefHit, at: { x: number; y: number }): void;\n  /** \u5149\u6807\u6240\u5728\u90A3\u6761\u4E0B\u6807 i \u7684\u6B4C\u8BCD\u53F0\u4E0A\u8FD9\u4F4D\u5531\u4E0D\u51FA\u6765\u7684\u90A3\u53E5\u8BDD\uFF08\u6B4C\u8BCD\u6846\u4E0A\u9762\u7684\u5C0F\u5B57\uFF09\uFF1B\u5531\u5F97\u51FA\u6765 = null\u3002 */\n  lyricHint?(i: number): string | null;\n  /** \u5149\u6807\u6240\u5728\u90A3\u6761\u4E0B\u6807 i \u90A3\u4E2A\u5B57\u6240\u5728\u8FD9\u4E00\u53E5\u6708\u8BFB\u5FF5\u6210\u4EC0\u4E48\uFF08\u6B4C\u8BCD\u6846\u4E0B\u9762\u7684\u5C0F\u5B57\uFF0Cv0.9.34\uFF09\uFF1B\u4E0D\u662F\u6708\u8BFB / \u5F15\u64CE\u8FD8\u6CA1\u8D77\u6765 = null\u3002 */\n  lyricReading?(i: number): import(\"./lyric-editor.ts\").LyricReading | null;\n  /** \u6807\u9898\u4E0B\u9762\u9760\u53F3\u7684\u4F5C\u8BCD / \u4F5C\u66F2\u70B9\u4E86\u3002 */\n  onCredits?(): void;\n  /** \u7A7A\u767D\u5904\u957F\u6309 / \u7535\u8111\u53F3\u952E\uFF08\u5149\u6807\u5DF2\u7ECF\u653E\u5230\u90A3\u91CC\u4E86\uFF09\uFF1Aat = \u5C4F\u5E55\u5750\u6807\uFF08\u5C0F\u83DC\u5355\u5F00\u5728\u90A3\uFF09\uFF1Brow = \u8FD9\u4E00\u884C\u91CC\u5149\u6807\u6240\u5728 track \u7684\u97F3\u7684\u4E0B\u6807\u8303\u56F4\uFF08\u5168\u9009\u8FD9\u4E00\u884C\u7528\uFF1B\u8FD9\u884C\u6CA1\u97F3 = null\uFF09\u3002 */\n  onBlankPress?(at: { x: number; y: number }, row: { from: number; to: number } | null): void;\n  /** \u957F\u6309 / \u53F3\u952E\u9009\u533A\u91CC\u7684\u97F3\uFF08\u5149\u6807\u6240\u5728 track \u7684\uFF09\uFF1A\u5F00\u9009\u533A\u83DC\u5355\uFF08at = \u5C4F\u5E55\u5750\u6807\uFF09\u3002 */\n  onSelPress?(at: { x: number; y: number }): void;\n  /** \u5C4F\u5E55\u653E\u4E0D\u4E0B\u7EB8\u7684\u65F6\u5019\uFF1Atrue = \u6309\u5C4F\u5BBD\u91CD\u65B0\u6298\u884C\uFF1Bfalse\uFF08\u9ED8\u8BA4\uFF09= \u4E0D\u6298\u884C\u3001\u6574\u5F20\u7EB8\u6309\u6BD4\u4F8B\u7F29\u5C0F\uFF08\u884C\u548C\u7EB8\u4E0A\u4E00\u6A21\u4E00\u6837\uFF09\u3002 */\n  reflow?(): boolean;\n  /** \u6392\u6CD5\uFF1Atrue = \u5206\u9875\uFF08\u6309\u7EB8\u7684\u771F\u5B9E\u9AD8\u5EA6\u5206\u9875\u3001\u753B\u9875\u6846\uFF0C\u6240\u89C1\u5373\u6240\u5F97\uFF09\uFF1Bfalse = \u8FDE\u7EED\uFF08\u540C\u4E00\u5F20\u7EB8\u7684\u51E0\u4F55\uFF0C\u53EA\u662F\u4E0D\u65AD\u9875\uFF09\u3002 */\n  pages?(): boolean;\n  /** \u6392\u6CD5\u300C\u6A2A\u5377\u300D\uFF08v0.9.35\uFF09\uFF1A\u6BCF\u5F20\u7EB8\u4E00\u884C\u3001\u4E00\u76F4\u5F80\u53F3\uFF0C\u8C31\u9762\u677F\u6A2A\u7740\u6EDA\uFF1B\u6253\u5B57 / \u653E\u7684\u65F6\u5019\u6A2A\u7740\u8DDF\uFF1B\u6B4C\u624B\u540D\u9489\u5728\u5C4F\u5E55\u5DE6\u8FB9\u3002 */\n  scroll?(): boolean;\n  /** \u6392\u8C31\u6309\u591A\u5BBD\u7B97\uFF08px\uFF09\uFF1A\u6A2A\u5C4F\u65F6\u952E\u76D8 / \u6DF7\u97F3\u53F0\u5728\u53F3\u8FB9\u4E00\u680F\uFF0C\u6536\u8D77\u6765\u8C31\u9762\u53D8\u5BBD\u2014\u2014\u6309\u300C\u5B83\u5728\u300D\u7684\u5BBD\u5EA6\u6392\uFF0C\u5207\u952E\u76D8\uFF08\u7B26\u53F7 \u2192 \u6253\u5B57\u2026\uFF09\u65F6\u8C31\u7684\u5927\u5C0F\u4E0D\u8DF3\uFF08v0.10.33\uFF09\u3002\u6CA1\u7ED9 = \u8C31\u9762\u591A\u5BBD\u5C31\u591A\u5BBD\u3002 */\n  layoutWidth?(): number;\n  /** \u7F29\u653E\u53D8\u4E86\uFF08\u7269\u7406\u500D\u6570\uFF1Bnull = \u81EA\u52A8\uFF09\uFF1A\u5BBF\u4E3B\u6309\u8BBE\u5907\u8BB0\u4F4F\uFF08device-kv\uFF09\uFF0C\u4E0B\u6B21\u5F00 app \u8FD8\u662F\u8FD9\u4E2A\u5927\u5C0F\uFF082026-10-21 user\u300C\u7F29\u653E\u8DE8\u4F1A\u8BDD\u8BB0\u4F4F\uFF0C\u6309\u8BBE\u5907\u5B58\u300D\uFF09\u3002 */\n  onZoom?(phys: number | null): void;\n  /** \u6392\u7248 worker \u7684\u5730\u5740\uFF08dist/layout-worker-<hash>.mjs\uFF1B\u6784\u5EFA\u65F6 define \u8FDB\u4E3B bundle\uFF09\u3002\u6CA1\u7ED9 / \u6D4F\u89C8\u5668\u6CA1\u6709 OffscreenCanvas = \u6392\u7248\u7559\u5728\u4E3B\u7EBF\u7A0B\u30022026-10-21 */\n  layoutWorker?(): URL;\n  /** \u6392\u7248 worker \u5EFA\u4E0D\u8D77\u6765 / \u4E2D\u9014\u574F\u4E86\uFF08\u4E4B\u540E\u4E00\u76F4\u8D70\u4E3B\u7EBF\u7A0B\uFF09\uFF1A\u5BBF\u4E3B\u8BB0\u8FDB\u9ED1\u5323\u5B50\u3002 */\n  onLayoutWorker?(why: string): void;\n  /** \u5206\u9875\uFF08= \u6253\u5370\u9884\u89C8\uFF09\u65F6\u6B4C\u8BCD\u884C\u5F80\u4E0B\u8BA9\u591A\u5C11\uFF08sp\uFF09\uFF1A\u9009\u4E86\u62FC\u97F3\u5B57\u4F53\u5370 PDF \u65F6 = \u62FC\u97F3\u90A3\u4E00\u622A\uFF08PDF \u548C\u5206\u9875\u9884\u89C8\u6392\u51FA\u6765\u4E00\u6837\uFF09\u3002 */\n  lyricRaise?(): number;\n  /** \u8303\u56F4\uFF1Asegment = \u4E00\u6B21\u53EA\u770B\u5149\u6807\u6240\u5728\u7684\u90A3\u5F20\u7EB8\uFF08\u66F2\u6BB5\uFF09\uFF0C\u2039 \u203A \u7FFB\uFF1Ball = \u5168\u90E8\uFF08\u9690\u85CF\u7684\u7EB8\u6298\u53E0\u7740\uFF09\u3002 */\n  scope?(): \"all\" | \"segment\";\n}\n\n/** \u6309\u4E0B\u53BB\u7684\u662F\u80FD\u62FF\u8D77\u6765\u62D6\u7684\u4E1C\u897F\uFF1A\u6B4C\u8BCD\u7684\u4E00\u4E2A\u5B57 / \u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\uFF08index = token \u4E0B\u6807\uFF0Csystem = \u90A3\u4E00\u884C\uFF09\u3002 */\ntype Grab = { kind: \"lyric\" | \"mark\"; index: number; system: number };\n\n/** 100% = \u7EB8\u7684\u5B9E\u9645\u5C3A\u5BF8\uFF08CSS \u7684 96 px/in\uFF1A1 mm = 3.7795 px\uFF0C\u540C\u6D4F\u89C8\u5668\u91CC PDF \u9605\u8BFB\u5668\u7684\u300C\u5B9E\u9645\u5927\u5C0F\u300D\uFF1B\u9AD8 DPI \u5E73\u677F\u4E0A\u6D4F\u89C8\u5668\u4E0D\u62A5\u771F DPI\u3001\u4F1A\u6BD4\u771F\u7EB8\u7565\u5C0F\uFF09\u3002\n *  2026-10-21 user\u300C\u8C31\u9762\u7F29\u653E\u8981\u4E0D\u8981\u8DE8\u4F1A\u8BDD\u8BB0\u4F4F\uFF0C100% \u8981\u4E0D\u8981\u5BF9\u5E94\u771F\u5B9E\u5C3A\u5BF8 \u53EF\u4EE5\uFF0C\u8DDF\u7740\u8BBE\u5907\uFF1F\u300D\u2192 \u8BB0\u4F4F\u7684\u662F\u7269\u7406\u500D\u6570\uFF08\u5BBF\u4E3B\u6309\u8BBE\u5907\u5B58\uFF09\u3001\u8BFB\u6570 = \u7269\u7406\u767E\u5206\u6BD4\uFF1B\u81EA\u52A8\u5927\u5C0F\u53E6\u7B97\uFF08Ctrl+0 / \u8BFB\u6570\u94AE = \u56DE\u81EA\u52A8\uFF09\u3002 */\nconst PX_PER_MM = 96 / 25.4;\n/** \u7F29\u653E\u7684\u4E0A\u4E0B\u9650\uFF08\u7269\u7406\u500D\u6570\uFF1A\u6700\u5C0F 1/4\u3001\u6700\u5927 8 \u500D\u5B9E\u9645\u5C3A\u5BF8\uFF1B\u540C PDF \u9605\u8BFB\u5668\uFF09\u3002 */\nconst MAX_ZOOM = 8, MIN_ZOOM = 0.25;\n/** \u7F29\u653E\u7684\u6863\uFF08\u7269\u7406\u500D\u6570\uFF1BCtrl / \u2318 + = / \u2212\u3001\u8BFB\u6570\u6309\u94AE\uFF1B\u540C PDF \u9605\u8BFB\u5668\u7684\u90A3\u4E32\uFF09\u3002\u81EA\u52A8\u5927\u5C0F\u4E0D\u5728\u6863\u91CC\uFF1A\u4ECE\u81EA\u52A8\u5F80\u4E0A / \u5F80\u4E0B = \u6700\u8FD1\u7684\u90A3\u4E00\u6863\u3002\u6EDA\u8F6E / \u634F\u5408\u7167\u65E7\u8FDE\u7EED\u30022026-10-21 */\nconst ZOOM_STEPS = [0.25, 0.33, 0.5, 0.67, 0.75, 1, 1.1, 1.25, 1.5, 1.75, 2, 2.5, 3, 4, 5, 6, 8];\n/** frame()\uFF1A\u8C31\u7684\u5927\u5C0F\uFF08\u4E00\u683C\u51E0 px\uFF09/ \u7EB8\u5BBD / \u5206\u9875 / \u8FB9\u8DDD\u3002 */\ntype Frame = { sp: number; width: number; strict: boolean; page: { h: number; l: number; r: number; t: number; b: number } | null; margins: { l: number; r: number; t: number; b: number } };\n/** \u542C\u6A21\u5F0F\u91CC\u624B\u6307\u53CC\u51FB = \u653E\u5927\u5230 2 \u500D / \u56DE\u5230\u81EA\u52A8\uFF08PDF \u9605\u8BFB\u5668\u7684\u624B\u52BF\uFF1B\u5199\u7684\u6A21\u5F0F\u91CC\u4E0D\u63A5\u2014\u2014\u8F7B\u70B9\u5C31\u662F\u653E\u5149\u6807\uFF09\u3002\u4E24\u4E0B\u9694 \u2264 300 ms\u3001\u2264 30 px\u3002 */\nconst DOUBLE_TAP_MS = 300, DOUBLE_TAP_PX = 30, DOUBLE_TAP_ZOOM = 2;\n/** \u5408\u79DF\u865A\u62DF\u7684\u51E0\u6761\uFF08`\u4E3B\u4EBA~lo` / `\u4E3B\u4EBA~v2` / `\u4E3B\u4EBA~lo~v2`\uFF09\u2192 \u771F\u7684\u90A3\u4E00\u4F4D\uFF08\u4E3B\u4EBA\uFF09\u3002 */\nconst realPart = (id: string): string => id.replace(/~.*$/, \"\");\nexport class ScoreView {\n  layout: Layout | null = null;\n  private sheet: HTMLDivElement;\n  private ink: HTMLDivElement;   // \u6B4C\u8BCD\u6846 / \u8BB0\u53F7\u6846 / \u6846\u9009\u7684\u5BB9\u5668\uFF1A\u5206\u9875\u65F6\u5F80\u53F3\u632A\u5230\u7248\u5FC3\uFF08svg \u7684 viewBox \u5F80\u5DE6\u6269\u4E86\u8FB9\u8DDD\uFF09\n  private ctx = document.createElement(\"canvas\").getContext(\"2d\")!;\n  /** wait = \u9F20\u6807\uFF1A\u957F\u6309\u5230\u70B9\u4E4B\u524D\u4E0D\u62D6\uFF08v0.9.39\uFF1Buser 2026-10-10\u300C\u8FD9\u6837\u5427\uFF0C\u8FD8\u662F\u666E\u901A\u62D6\u52A8\uFF0C\u97F3\u4E5F\u662F\uFF0C\u4F46\u662F\u9F20\u6807\u7684\u65F6\u5019\u4E5F\u9700\u8981\u957F\u6309\u300D\u2014\u2014\u62D6\u52A8\u592A\u5BB9\u6613\u8BEF\u89E6\uFF09\u3002 */\n  private drag: null | { index: number; d0: number; dur0: number; x0: number; y0: number; axis: \"\" | \"x\" | \"y\"; pid: number; heard: number; wait?: boolean } = null;\n  private finger: null | { pid: number; y0: number; top0: number; x: number; y: number; moved: boolean; shift: boolean; x0: number; left0: number } = null;\n  /** \u6846\u9009 = \u9F20\u6807\u77ED\u6309\u5C31\u62D6\uFF08v0.9.39\uFF1Buser\u300C\u4E0D\uFF0C\u6846\u9009\u662F\u666E\u901A\u77ED\u6309\u62D6\u52A8\uFF0C\u8FD9\u6837\u624D\u80FD\u6709\u5DEE\u522B\u300D\u300C\u4E0D\u7136\u6211\u6846\u9009\u4F1A\u8BEF\u89E6\u62D6\u52A8\u300D\uFF09\uFF1A\u4ECE\u7A7A\u767D\u3001\u97F3\u3001\u8BB0\u53F7\u3001\u5B57\u4E0A\u77ED\u6309\u62D6\u90FD\u662F\u6846\u9009\uFF1B\u957F\u6309\u4E4B\u540E\u62D6\u624D\u662F\u62FF\u8D77\u6765\u632A\u3002\n   *  last = \u4E0A\u4E00\u6B21\u6846\u51FA\u6765\u7684\u7ED3\u679C\uFF08\u6CA1\u53D8\u5C31\u4E0D\u91CD\u8BBE = \u4E0D\u91CD\u6392\uFF1Buser\u300C\u9F20\u6807\u6846\u9009\u6709\u70B9\u5361\u300D\uFF09\uFF1Braf = \u5408\u5E76\u5230\u6BCF\u5E27\u4E00\u6B21\u3002 */\n  private box: null | { pid: number; x0: number; y0: number; moved: boolean; st0: EditorState; row: number; last?: string; raf?: number; px?: number; py?: number } = null;\n  private boxEl: HTMLDivElement;\n  private tail: HTMLDivElement;\n  /** \u6309\u4E0B\u53BB\u8FD8\u6CA1\u677E\uFF08\u624B\u6307 / \u7B14 / \u9F20\u6807\u90FD\u8D70\u5B83\uFF09\uFF1A\u5224\u8F7B\u70B9 / \u957F\u6309 / \u62D6\u3002hit = \u6309\u5728\u54EA\u4E2A\u97F3\u4E0A\uFF08null = \u7A7A\u767D\uFF09\u3002 */\n  private press: null | { pid: number; type: string; x: number; y: number; cx: number; cy: number; hit: HitNote | null; grab: Grab | null; timer: number; shift: boolean; moved: boolean; fired: boolean } = null;\n  /** \u62FF\u8D77\u6765\u62D6\u7740\u7684\u5B57 / \u8BB0\u53F7\uFF1Ast0 = \u62FF\u8D77\u6765\u4E4B\u524D\uFF08\u6BCF\u4E00\u4E0B\u90FD\u4ECE\u5B83\u91CD\u7B97\uFF0C\u8C31\u4E0A\u5B9E\u65F6\u662F\u632A\u8FC7\u53BB\u7684\u6837\u5B50\uFF09\uFF1Btargets = \u62FF\u8D77\u6765\u65F6\u8FD9\u6761 track \u4E0A\u80FD\u843D\u7684\u97F3\uFF08\u4E0B\u6807 + \u4F4D\u7F6E\uFF0C\u62D6\u7684\u65F6\u5019\u4E0D\u8DDF\u7740\u91CD\u6392\u8DF3\uFF09\uFF1B\n   *  src / cur = \u539F\u6765 / \u73B0\u5728\u843D\u5728\u7B2C\u51E0\u4E2A\uFF1Bmoved = \u6307\u9488\u52A8\u8FC7\uFF08\u6CA1\u52A8 = \u539F\u5730\u677E\u624B\uFF09\u3002 */\n  /** \u6B63\u62D6\u7740\u7684\u4E1C\u897F\u7684 token id\uFF08\u753B\u6210\u5F3A\u8C03\u8272\uFF1B\u62FF\u8D77\u6765\u90A3\u4E00\u523B\u5C31\u4EAE\uFF09\u3002 */\n  private hot: Set<number> | null = null;\n  /** \u70B9\u5F00\u7684\u8BB0\u53F7\u7BA1\u7684\u90A3\u4E00\u6BB5\u97F3\uFF08\u67D3\u5F3A\u8C03\u8272\uFF1B\u5C0F\u83DC\u5355\u6536\u8D77\u5C31\u6E05\uFF09\u3002 */\n  private span: { from: number; to: number } | null = null;\n  setSpan(sp: { from: number; to: number } | null): void { this.span = sp; this.render(); }\n  /** \u5F00\u8FD9\u6761 track \u4E0A\u7B2C index \u4E2A token\uFF08\u529B\u5EA6 / \u6E10\u5F3A\u6E10\u5F31 / \u98CE\u683C\u8BB0\u53F7\uFF09\u7684\u5C0F\u83DC\u5355\uFF08\u521A\u63D2\u8FDB\u53BB\u7684\u98CE\u683C\u8BB0\u53F7\u7528\uFF09\uFF1B\u8C31\u4E0A\u6CA1\u753B\u51FA\u6765 = false\u3002 */\n  menuFor(index: number): boolean { const h = this.layout?.dyns.find((d) => d.index === index && this.onTrack(d)); if (!h) return false; this.markMenu(h); return true; }\n  private lift: null | { pid: number; grab: Grab; st0: EditorState; targets: { idx: number; x: number; system: number }[]; src: number; cur: number; x0: number; y0: number; cx: number; cy: number; moved: boolean; short: boolean; removed: number; dx: number } = null;\n  private selDrag: null | { pid: number; anchor: number; menu?: boolean } = null;   // \u957F\u6309\u4E4B\u540E\u6CA1\u62AC\u624B\u63A5\u7740\u62D6 = \u6269\u9009\uFF08anchor = \u957F\u6309\u7684\u90A3\u4E2A\u97F3\uFF09\uFF1Bmenu = \u957F\u6309\u7684\u662F\u9009\u533A\u91CC\u7684\u97F3\u3001\u8FD8\u6CA1\u52A8\uFF1A\u62AC\u624B = \u9009\u533A\u83DC\u5355\uFF0C\u52A8\u4E86 = \u7167\u5E38\u6269\u9009\n  private handles: { start: HTMLDivElement; end: HTMLDivElement };\n  private handleDrag: null | { pid: number; which: \"start\" | \"end\"; other: number } = null;\n  private touches = new Map<number, { x: number; y: number }>();   // \u73B0\u5728\u6309\u7740\u7684\u624B\u6307\uFF08\u89E6\u5C4F\u7F29\u653E\u7528\uFF09\n  /** \u634F\u5408\uFF082026-10-10 v0.9.27 \u91CD\u505A\uFF1Buser\u300Cipad\u53EF\u4EE5\u653E\u7684\u5F88\u5927\uFF0C\u5C31\u548Cpdf\u6D4F\u89C8\u5668\u4E00\u6837\uFF0C\u61C2\u4E86\u5417\u3002\u53EF\u4EE5\u6A2A\u7740\u6EDA\u300D+ \u67E5\u6848\u300CiPad \u634F\u5408\u7F29\u653E\u5361\u300D\uFF09\uFF1A\n   *  \u624B\u52BF\u4E2D\u53EA\u6539 transform\uFF08\u5408\u6210\u5668\u7F29\u653E\uFF0C\u4E0D\u91CD\u6392\u3001\u4E0D\u8BFB\u5E03\u5C40\uFF09\uFF0C\u4E00\u5E27\u6700\u591A\u4E00\u6B21\uFF1B\u677E\u624B\u624D\u843D\u6210 CSS zoom\uFF08\u91CD\u6392\u4E00\u6B21\uFF09\u5E76\u6EDA\u5230\u8BA9\u90A3\u4E2A\u70B9\u8FD8\u5728\u624B\u6307\u4E0B\u9762\u3002\n   *  d0 = \u8D77\u624B\u4E24\u6307\u8DDD\u79BB\uFF1Bz0 = \u8D77\u624B\u7684 zoom\uFF1Bsx / sy = \u4E24\u6307\u4E2D\u70B9\u4E0B\u9762\u90A3\u4E2A\u7EB8\u9762\u70B9\uFF08sheet \u5750\u6807\u3001\u539F\u5927\uFF09\uFF1Bleft / top = \u8D77\u624B\u65F6 sheet \u5728\u5C4F\u5E55\u4E0A\u7684\u4F4D\u7F6E\uFF1Bk = \u73B0\u5728\u76F8\u5BF9 z0 \u7684\u500D\u6570\uFF1Bmx / my = \u73B0\u5728\u7684\u4E24\u6307\u4E2D\u70B9\u3002 */\n  private pinch: null | { d0: number; z0: number; sx: number; sy: number; left: number; top: number; k: number; mx: number; my: number; raf: number } = null;\n  private zoom = 1;                           // \u4E58\u5728 sheet \u4E0A\u7684\u500D\u6570\uFF081 = \u81EA\u52A8\u5927\u5C0F\uFF09= zoomPhys \u00D7 physPx / spAuto\n  private zoomPhys: number | null = null;     // \u8BB0\u4F4F\u7684\u7269\u7406\u500D\u6570\uFF08null = \u81EA\u52A8\uFF09\u2014\u2014\u8DE8\u4F1A\u8BDD\u8BB0\u4F4F\u7684\u5C31\u662F\u5B83\uFF08\u5BBF\u4E3B onZoom \u2192 device-kv\uFF09\n  private spAuto = 10; private physPx = 10;   // \u6700\u8FD1\u4E00\u6B21 frame\uFF1A\u81EA\u52A8\u5927\u5C0F\u4E00\u683C\u51E0 px\uFF1B100% \u5B9E\u9645\u5C3A\u5BF8\u4E00\u683C\u51E0 px\uFF08\u7EB8\u7684\u8C31\u5927\u5C0F \u00D7 PX_PER_MM\uFF09\n  private zoomBtn: HTMLButtonElement;\n  readonly lyrics: LyricEditor;\n  readonly marks: MarkEditor;\n  readonly title: TitleEditor;\n\n  constructor(private el: HTMLElement, private host: ScoreViewHost) {\n    this.sheet = document.createElement(\"div\"); this.sheet.className = \"sheet\";\n    this.boxEl = document.createElement(\"div\"); this.boxEl.className = \"marquee\"; this.boxEl.hidden = true;\n    el.replaceChildren(this.sheet);\n    // \u8C31\u4E0B\u9762\u6C38\u8FDC\u7559\u4E00\u5927\u622A\u7A7A\u767D\uFF08user 2026-10-08\u300C\u505A\u4E00\u4E2A\u62A4\u680F\uFF1A\u6EDA\u52A8\u7684\u65F6\u5019\u9875\u9762\u4E0B\u9762\u8FD8\u662F\u7559\u4E00\u6574\u9875\u767D\u300D\u2192 \u540E\u6765\u300C\u20263/4\u5DE6\u53F3\uFF1F\u300D= \u00BE \u5C4F\uFF09\uFF1A\u6700\u540E\u4E00\u884C\u4E5F\u80FD\u6EDA\u5230\u4E0A\u9762\u6765\uFF0C\n    //   \u8DDF\u968F\u5149\u6807\u5F80\u4E0B\u63A8\u65F6\u4E0D\u4F1A\u88AB\u300C\u6EDA\u5230\u5E95\u4E86\u300D\u5361\u4F4F\uFF08\u8F6F\u952E\u76D8\u5F39\u51FA\u8C31\u9762\u53D8\u77EE\u65F6\u5C24\u5176\uFF09\u3002\u9AD8\u5EA6 = \u8C31\u9762\u677F\u81EA\u5DF1\u7684\u9AD8\uFF08render \u91CC\u8DDF\u7740\u6539\uFF09\n    this.tail = document.createElement(\"div\"); this.tail.className = \"sheet-tail\"; this.tail.setAttribute(\"aria-hidden\", \"true\");\n    el.appendChild(this.tail);\n    this.ink = document.createElement(\"div\"); this.ink.className = \"sheet-ink\"; this.sheet.appendChild(this.ink);\n    this.zoomBtn = document.createElement(\"button\"); this.zoomBtn.className = \"btn zoom-reset\"; this.zoomBtn.type = \"button\"; this.zoomBtn.textContent = \"100%\"; this.zoomBtn.title = \"\u73B0\u5728\u7684\u7F29\u653E\uFF08100% = \u7EB8\u7684\u5B9E\u9645\u5C3A\u5BF8\uFF09\uFF1B\u70B9 = \u56DE\u5230\u81EA\u52A8\u5927\u5C0F\uFF08Ctrl / \u2318 + 0\uFF09\u3002Ctrl / \u2318 + \u6EDA\u8F6E\u3001\u634F\u5408 = \u7F29\u653E\uFF1BCtrl / \u2318 + = / \u2212 = \u4E00\u6863\u4E00\u6863\"; this.zoomBtn.hidden = true;\n    this.zoomBtn.addEventListener(\"pointerdown\", (e) => { e.preventDefault(); e.stopPropagation(); this.setZoom(1, null); });\n    el.appendChild(this.zoomBtn);\n    const mkHandle = (which: \"start\" | \"end\") => {\n      const h = document.createElement(\"div\"); h.className = `sel-handle ${which}`; h.hidden = true;\n      h.addEventListener(\"pointerdown\", (e) => {\n        e.preventDefault(); e.stopPropagation();\n        const st = this.host.get(); if (!st.sel) return;\n        this.handleDrag = { pid: e.pointerId, which, other: which === \"start\" ? st.sel.to - 1 : st.sel.from };\n        try { h.setPointerCapture(e.pointerId); } catch { /* ignore */ }\n      });\n      h.addEventListener(\"pointermove\", (e) => {\n        const g = this.handleDrag; if (!g || e.pointerId !== g.pid) return;\n        const idx = this.noteNear(this.local(e)); if (idx < 0) return;\n        const st = this.host.get(), a = Math.min(idx, g.other), b = Math.max(idx, g.other) + 1;\n        if (!st.sel || st.sel.from !== a || st.sel.to !== b) this.host.set(select(st, a, b));\n      });\n      const done = (e: PointerEvent) => { if (this.handleDrag && e.pointerId === this.handleDrag.pid) this.handleDrag = null; };\n      h.addEventListener(\"pointerup\", done); h.addEventListener(\"pointercancel\", done);\n      this.ink.appendChild(h);\n      return h;\n    };\n    this.handles = { start: mkHandle(\"start\"), end: mkHandle(\"end\") };\n    this.lyrics = new LyricEditor(this.ink, host, () => this.layoutNow(), () => this.render());\n    this.marks = new MarkEditor(this.ink, host, () => this.layoutNow(), () => this.render());\n    this.title = new TitleEditor(this.ink, host, () => this.layoutNow());\n    el.addEventListener(\"pointerdown\", (e) => this.down(e));\n    el.addEventListener(\"pointermove\", (e) => this.move(e));\n    el.addEventListener(\"wheel\", () => { this.userScrollAt = performance.now(); }, { passive: true });   // \u81EA\u5DF1\u6EDA\u4E86\uFF1A\u81EA\u52A8\u7FFB\u8BA9\u5F00 4 \u79D2\n    // Ctrl + \u6EDA\u8F6E / \u89E6\u63A7\u677F\u634F\u5408\uFF08\u6D4F\u89C8\u5668\u62A5\u6210 ctrlKey \u7684 wheel\uFF09= \u7F29\u653E\u8FD9\u5F20\u7EB8\uFF08\u4EE5\u9F20\u6807\u4E0B\u9762\u90A3\u4E00\u70B9\u4E3A\u4E2D\u5FC3\uFF09\uFF0C\u4E0D\u7F29\u653E\u7F51\u9875\uFF08v0.10.30\uFF1Buser\u300C\u5927\u5C4F\u7535\u8111\u4E0A\u9762A4\u653E\u7684\u592A\u5927\u4E86\uFF0C\u6709\u529E\u6CD5zoom\u5417\uFF1F\n    //   \u8FD8\u662F\u5C31\u662Fctrl wheel? ctrl wheel\u4E0D\u5E94\u8BE5zoom\u7F51\u9875\uFF0C\u800C\u662F\u5E94\u8BE5\u88AB\u62E6\u622A\u300D\uFF09\u3002\u80FD\u7F29\u5230\u6BD4\u539F\u5927\u5C0F\uFF08\u5927\u5C4F\u770B\u6574\u9875\uFF09\uFF0C\u548C\u89E6\u5C4F\u634F\u5408\u540C\u4E00\u4E2A zoom\uFF08\u89C6\u56FE\u72B6\u6001\uFF0C\u4E0D\u8FDB\u6587\u4EF6\uFF09\n    el.addEventListener(\"wheel\", (e) => {\n      if (!e.ctrlKey) return;\n      e.preventDefault();\n      const sr = this.sheet.getBoundingClientRect(), z = this.zoom, d = Math.max(-300, Math.min(300, e.deltaMode === 1 ? e.deltaY * 16 : e.deltaMode === 2 ? e.deltaY * 300 : e.deltaY));   // \u4E00\u4E0B\u6700\u591A \u00B1300 px\uFF08\u522B\u4E00\u683C\u8DF3\u592A\u8FDC\uFF1B\u6309\u884C / \u6309\u9875\u62A5\u7684\u6EDA\u8F6E\u6298\u6210\u50CF\u7D20\uFF09\n      this.setZoom(z * Math.exp(-d * 0.002), { x: e.clientX, y: e.clientY, cx: (e.clientX - sr.left) / z, cy: (e.clientY - sr.top) / z });\n    }, { passive: false });\n    el.addEventListener(\"scroll\", () => { this.placePins(); this.caretSeen = this.caretVisible(); }, { passive: true });   // \u6A2A\u5377\uFF1A\u9489\u5728\u5DE6\u8FB9\u7684\u6B4C\u624B\u540D\u8DDF\u7740\u6A2A\u6EDA\u632A\n    el.addEventListener(\"pointerup\", (e) => this.up(e));\n    // \u7535\u8111\u53F3\u952E = \u7A7A\u767D\u5904\u7684\u5C0F\u83DC\u5355\uFF08\u624B\u6307 / \u7B14\u8D70\u957F\u6309\uFF09\uFF1B\u97F3\u4E0A\u53F3\u952E\u4E0D\u63A5\uFF08\u9009\u533A\u6761\u7BA1\uFF09\u3002pointerdown \u91CC button 2 \u76F4\u63A5\u4E0D\u63A5\uFF0C\u514D\u5F97\u5148\u653E\u4E00\u4E0B\u5149\u6807 / \u8D77\u6846\u9009\n    el.addEventListener(\"contextmenu\", (e) => {\n      if (this.layout && this.openPartAt(this.local(e).x, this.local(e).y)) { e.preventDefault(); this.cancelPress(); return; }   // \u53F3\u952E\u6B4C\u624B\u540D = \u6B4C\u624B\u724C\uFF08\u540C\u5DE6\u952E\uFF09\n      if (!this.rules.edit) { e.preventDefault(); const p = this.local(e); this.cancelPress(); this.listenMenu(p.x, p.y, e.clientX, e.clientY); return; }   // \u542C\u6A21\u5F0F\uFF1A\u53F3\u952E = \u5C0F\u83DC\u5355\uFF08\u4ECE\u8FD9\u513F\u653E\u2026\uFF09\n      if (!this.layout || (e.target as HTMLElement).closest(\".lyric-input, .lyric-merge, .mark-ed, .title-input, .sel-handle\")) return;\n      e.preventDefault();\n      const p = this.local(e); this.cancelPress();\n      const dh = this.rules.symbols ? this.dynHitAt(p.x, p.y, false) : null;\n      if (dh) { this.lyrics.commitAndClose(); this.marks.commitAndClose(); this.markMenu(dh); return; }   // \u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\u4E0A\u53F3\u952E = \u5B83\u7684\u5C0F\u83DC\u5355\uFF08\u300C\u7B26\u300D\u91CC\uFF09\n      const hit = this.noteAt(p.x, p.y);\n      if (!hit) { this.blankPress(p.x, p.y, e.clientX, e.clientY); return; }\n      // \u97F3\u4E0A\u53F3\u952E\uFF1A\u5728\u9009\u533A\u91CC = \u9009\u533A\u83DC\u5355\uFF1B\u4E0D\u5728 = \u5148\u9009\u4E2D\u5B83\uFF08\u540C\u957F\u6309\uFF09\u518D\u5F00\u83DC\u5355\n      const cur = this.host.get().sel;\n      if (!(cur && this.onTrack(hit) && hit.index >= cur.from && hit.index < cur.to)) {\n        const st0 = this.host.get(), st1 = this.onTrack(hit) ? st0 : this.focusRow(st0, hit.system);\n        this.host.set(select(st1, hit.index, hit.index + 1));\n      }\n      this.host.focus?.(\"staff\");\n      this.host.onSelPress?.({ x: e.clientX, y: e.clientY });\n    });\n    el.addEventListener(\"pointercancel\", (e) => { if (this.pinch && this.touches.delete(e.pointerId) && this.touches.size < 2) this.pinchEnd(); if (this.holdPid === e.pointerId) { this.holdPid = null; this.host.release?.(); } this.lockTap = null; if (this.drag) this.host.release?.(); this.drag = null; if (this.lift) { this.lift = null; this.hot = null; this.render(); } el.classList.remove(\"lifting\"); this.finger = null; this.box = null; this.boxEl.hidden = true; this.cancelPress(); this.touches.delete(e.pointerId); if (this.touches.size < 2) this.pinch = null; });\n    new ResizeObserver(() => this.render()).observe(el);\n  }\n\n  /** \u4E94\u7EBF\u8C31\u95F4\u8DDD\uFF08px\uFF09\u548C\u7EB8\u9762\u5BBD\uFF08px\uFF09\uFF1A\u89E6\u5C4F 11\u3001\u9F20\u6807 10 \u4E00\u683C\uFF08\u00D7 \u8FD9\u5F20\u7EB8\u7684\u8C31\u5927\u5C0F / \u9ED8\u8BA4\u6863\u2014\u2014\u8C31\u5C0F\u4E86\u4E00\u683C\u5C31\u5C0F\u3001\u7EB8\u7684\u5BBD\u5EA6\u4E0D\u53D8\uFF09\uFF1B\u7EB8\u7684\u7248\u5FC3\u653E\u5F97\u4E0B = \u4E25\u683C\u6309\u7EB8\uFF08\u7EB8\u5C45\u4E2D\u3001\u56DB\u5468\u662F\u684C\u9762\uFF09\uFF0C\n   *  \u653E\u4E0D\u4E0B\uFF08\u624B\u673A\uFF09\uFF1A\u9ED8\u8BA4\u4E0D\u6298\u884C = \u6574\u5F20\u7EB8\u6309\u6BD4\u4F8B\u7F29\u5C0F\uFF1B\u9009\u4E86\u300C\u6298\u884C\u300D= \u6309\u5C4F\u5BBD\u91CD\u65B0\u6298\u884C\uFF0C\u7A84\u5C4F\uFF08< 420\uFF09\u4E00\u683C\u8DDF\u7740\u5BBD\u5EA6\u5C0F\u4E00\u70B9\u3001\u6700\u5C0F 8.5\uFF08user\u300CiPhone SE2 \u4E00\u884C\u53EA\u6709\u4E00\u5C0F\u8282\u52A0\u4E00\u5927\u7247\u7A7A\u767D \u51E0\u4E2A\u7B80\u6613\u8BD5\u4E00\u4E0B\u300D\uFF09\u3002\n   *  \u7EB8 = \u8FD9\u9996\u6B4C\u7684\u7EB8\u5F20\uFF08src/score/paper.ts\uFF0C\u9ED8\u8BA4 A5\uFF1Buser\u300C\u4E94\u7EBF\u8C31\u5BBD\u5EA6\uFF1A\u8981\u4E0D\u8FD8\u662F\u6309\u7167\u56FA\u5B9A\u7269\u7406\u9875\u6846\uFF1F\u300D\u300C\u770B\u4E00\u4E0Bwebxiaoheiwu\u5C4F\u5E55\u592A\u5BBD\u7684\u65F6\u5019\u884C\u5BBD\u4F1A\u6709max\u300D\uFF09\u3002 */\n  private frame(): Frame {\n    const f = this.frameAt(this.host.layoutWidth?.() ?? this.el.clientWidth);\n    const paper = this.host.get().song.paper ?? paperOf(DEFAULT_PAPER);\n    this.spAuto = f.sp; this.physPx = spMm(paper) * PX_PER_MM;   // \u7F29\u653E\u7684\u6362\u7B97\u57FA\u51C6\uFF1B\u8BB0\u4F4F\u7684\u7269\u7406\u500D\u6570\u968F frame \u53D8\u800C\u91CD\u7B97\n    this.syncZoom();\n    return f;\n  }\n  /** \u8C31\u9762\u591A\u5BBD\u65F6\u81EA\u52A8\u5927\u5C0F\u4E00\u683C\u51E0 px\uFF08\u5BBF\u4E3B\u5224\u5E95\u5EA7\u8D34\u4E0D\u8D34\u8FB9\u7528\uFF1A\u6309\u8D34\u5E95\u65F6\u7684\u5168\u5BBD\u7B97\uFF0C\u548C\u7528\u6237\u7684\u7F29\u653E\u65E0\u5173\uFF1B2026-10-21\uFF09\u3002 */\n  spaceAt(avail: number): number { return this.frameAt(avail).sp; }\n  private frameAt(avail: number): Frame {\n    const st = this.host.get(), paper = st.song.paper ?? paperOf(DEFAULT_PAPER), scale = staffMmOf(paper) / STAFF_MM;\n    const base = (matchMedia(\"(pointer: coarse)\").matches ? 11 : 10) * scale;\n    // \u5206\u9875\uFF1A\u6574\u9875\uFF08\u7248\u5FC3 + \u5DE6\u53F3\u8FB9\u8DDD\uFF09\u8981\u653E\u5F97\u4E0B\uFF1B\u9875\u9AD8 / \u8FB9\u8DDD\u6309\u8FD9\u5F20\u7EB8\u7B97\uFF08sp\uFF09\n    const geo = pageGeoOf(paper), page = this.host.pages?.() ? geo : null;\n    // \u6A2A\u5377\uFF1A\u8C31\u7684\u5927\u5C0F\u7167\u539F\u5927\uFF08\u4E0D\u6309\u5C4F\u5BBD\u7F29\uFF09\uFF0Cwidth \u53EA\u7BA1\u6B4C\u540D / \u4F5C\u8005\u680F / \u7EB8\u7684\u63A7\u4EF6\u90A3\u4E00\u5C4F\uFF1B\u6392\u5B8C\u7EB8\u6309\u5185\u5BB9\u6491\u5BBD\uFF08render \u91CC\uFF09\n    if (this.host.scroll?.()) return { sp: avail > 0 && avail < 420 ? Math.max(8.5 * scale, Math.min(base, (avail / 42) * scale)) : base, width: Math.max(320, avail - (CONT_MARGIN.l + CONT_MARGIN.r) * base), strict: false, page: null, margins: CONT_MARGIN };\n    // \u8FB9\u8DDD\uFF1A\u5206\u9875 = \u7EB8\u7684\u771F\u8FB9\u8DDD\uFF08\u6240\u89C1\u5373\u6240\u5F97\uFF09\uFF1B\u8FDE\u7EED = \u4E00\u5708\u8212\u670D\u7684\u7A84\u8FB9\uFF08CONT_MARGIN\uFF1Buser 2026-10-08\u300C\u975E\u5206\u9875\u663E\u793A\u2026\u80FD\u4E0D\u80FD\u628A\u9875\u8FB9\u8DDD\u7701\u4E86\uFF0C\u9009\u4E00\u4E2A\u8212\u670D\u7684\u8FB9\u8DDD\uFF0C\n    //   \u548C\u505A\u5206\u9875\u663E\u793A\u4E4B\u524D\u7C7B\u4F3C\u3002\u4F46\u662F\u884C\u5BBD\u5FC5\u987B\u4E25\u683C\u4E00\u6837\u300D\uFF09\u3002\u884C\u5BBD\u4E24\u79CD\u90FD\u662F\u8FD9\u5F20\u7EB8\u7684\u7248\u5FC3 lineSp \u4E2A\u95F4\u8DDD\u3001\u4E0D\u53D6\u6574\uFF08\u53D6\u6574\u4F1A\u8BA9\u4E24\u8FB9\u5DEE\u96F6\u70B9\u51E0\u4E2A\u95F4\u8DDD\uFF0C\u53EF\u80FD\u65AD\u884C\u4E0D\u540C\uFF09\u2192 \u6BCF\u4E00\u884C\u4E00\u6A21\u4E00\u6837\uFF0C\u53EA\u5DEE\u65AD\u4E0D\u65AD\u9875\u3001\u8FB9\u591A\u5BBD\n    const margins = page ? { l: geo.l, r: geo.r, t: geo.t, b: geo.b } : CONT_MARGIN;\n    const extra = margins.l + margins.r, want = Math.ceil((lineSp(paper) + extra) * base);\n    if (avail > 0 && want <= avail) return { sp: base, width: lineSp(paper) * base, strict: true, page, margins };\n    // \u653E\u4E0D\u4E0B\u3001\u4E0D\u6298\u884C\uFF08\u9ED8\u8BA4\uFF1Buser\u300C\u7EB8\u80FD\u4E0D\u80FDtoggle\u4E0D\u6298\u884C\u9884\u89C8\u6709\u591A\u5BBD\u548C\u6298\u884C\u7684\u4E24\u79CD\u9009\u9879\u3002\u6211\u5176\u5B9E\u8FD8\u662F\u503E\u5411\u4E8E\u4E0D\u6298\u884C\u300D\n    //   \u300C\u6211\u73B0\u5728\u53D1\u73B0\u6211\u57FA\u672C\u4E0D\u70B9\u4E94\u7EBF\u8C31\uFF0C\u90FD\u662F\u7528\u952E\u76D8\u8F93\u5165\u3002\u8FD9\u6837\u7684\u8BDD\u5176\u5B9E\u4E94\u7EBF\u8C31\u53EA\u662F\u8BA9\u4F60\u770B\u4F60\u5728\u54EA\u91CC\u300D\uFF09\uFF1A\u6574\u5F20\u7EB8\u6309\u6BD4\u4F8B\u7F29\u5C0F\uFF0C\u884C\u548C\u7EB8\u4E0A\u4E00\u6837\n    if (avail > 0 && (page || !(this.host.reflow?.() ?? false))) { const sp = (base * avail) / want; return { sp, width: lineSp(paper) * sp, strict: false, page, margins }; }\n    return { sp: avail > 0 && avail < 420 ? Math.max(8.5 * scale, Math.min(base, (avail / 42) * scale)) : base, width: Math.max(320, avail), strict: false, page: null, margins: { l: 0, r: 0, t: 2.4, b: 1.5 } };\n  }\n\n  /** \u91CF\u6587\u5B57\u5BBD\uFF08px\uFF0C\u6B4C\u8BCD\u5B57\u53F7 = px\uFF09\uFF1A\u5C4F\u5E55\u548C PDF \u5171\u7528\u8FD9\u4E00\u628A\u5C3A\u5B50\u2014\u2014PDF \u7528\u5B83\u6392\u7248\uFF0C\u548C\u5206\u9875\u9884\u89C8\u4E00\u6A21\u4E00\u6837\uFF082026-10-09 user\u300Cpdf\u753B\u51FA\u6765\u548C\u5F00\u5206\u9875\u9884\u89C8\u7684\u4E0D\u4E00\u6837\u2026\u505A\u5230\u9664\u4E86\u63A7\u4EF6\u548C\u63D0\u793A\u5916\u7684wysiwyg\u300D\uFF09\u3002 */\n  measureAt(px: number): (s: string) => number { return measurerOn(this.ctx, lyricFont(px)); }   // \u5B57\u4F53\u4E32\u5728 src/render/lyric-font.ts\uFF08worker \u540C\u4E00\u4E32\uFF09\n  /** \u6392\u7248\u8FD9\u4E00\u534A\uFF08engrave + \u7F13\u5B58\uFF09\uFF0C\u753B\u662F\u53E6\u4E00\u534A\uFF08render\uFF09\u3002\u8C01\u8981\u6700\u65B0\u7684\u6392\u7248\u5C31\u53EB\u5B83\u2014\u2014\u6B4C\u8BCD\u6846 / \u8BB0\u53F7\u6846 / head() / E2E \u94A9\u5B50\u2014\u2014\u4E0D\u7528\u7B49\u5230\u4E0B\u4E00\u5E27\u753B\uFF1B\n   *  render() \u753B\u4E4B\u524D\u4E5F\u5148\u53EB\u5B83\u3002\u540C\u4E00\u4EFD EditorState \u95EE\u7B2C\u4E8C\u6B21 = \u76F4\u63A5\u56DE\u4E0A\u6B21\u7684\uFF08\u4E0D\u8BFB DOM\u3001\u4E0D\u7B97\u952E\uFF09\uFF1B\u8C31 / \u51E0\u4F55\u90FD\u6CA1\u53D8 = \u56DE\u7F13\u5B58\uFF08W-17 \u7B2C 1 \u5200\uFF09\u3002\n   *  2026-10-17 Fable\uFF1A\u753B\u5408\u5E76\u5230\u4E0B\u4E00\u5E27\u4E4B\u540E\uFF08main.ts queuePaint\uFF09\uFF0C\u72B6\u6001\u6539\u4E86\u5230\u753B\u4E4B\u95F4\u8FD9\u4E00\u5C0F\u6BB5\uFF0C\u6392\u7248\u7167\u6837\u62FF\u5F97\u5230\u6700\u65B0\u7684\u3002 */\n  layoutNow(force = false): Layout {\n    const st = this.host.get();\n    if (!force && this.layout && this.layoutSt === st && this.frameNow) return this.layout;\n    const g = this.geo(st);\n    if (!this.layout || this.geoSong !== st.song || this.geoKey !== g.geoKey) {\n      // \u4E3B\u7EBF\u7A0B\u81EA\u5DF1\u6392\uFF08\u540C\u6B65\u9000\u8DEF\uFF1A\u8C01\u7ACB\u523B\u8981\u6392\u7248\u2014\u2014\u6B4C\u8BCD\u6846 / \u8BB0\u53F7\u6846 / E2E \u94A9\u5B50 / PDF\uFF0C\u6216\u6CA1\u6709 worker\uFF09\uFF1B\u5728\u9014\u7684 worker \u56DE\u6267\u4F5C\u5E9F\uFF08\u6309 seq \u4E22\uFF09\n      this.layout = span(\"engrave\", () => engrave(st.song, { ...g.opts, measureLyric: this.measureAt(g.lyricPx) }));\n      this.geoSong = st.song; this.geoKey = g.geoKey; this.workerParts = null; this.pending = null; this.queued = null;\n    }\n    this.layoutSt = st; this.frameNow = g.frame;\n    if (this.needPaint) this.render();   // \u6392\u7248\u662F\u4E3A\u4E86\u753B\u7684\uFF08renderAsync \u53D1\u51FA\u53BB\u8FD8\u6CA1\u56DE\u6765\uFF0C\u8FD9\u91CC\u5148\u7B97\u597D\u4E86\uFF09= \u987A\u624B\u753B\u6389\uFF1Brender \u81EA\u5DF1\u6E05 needPaint\n    return this.layout;\n  }\n  /** \u6392\u7248\u7684\u51E0\u4F55\u4E0E\u9009\u9879\uFF08layoutNow \u7684\u540C\u6B65\u8DEF\u548C renderAsync \u7684 worker \u8DEF\u5171\u7528\u4E00\u4EFD\uFF09\uFF1Aframe\uFF08\u8C31\u5927\u5C0F / \u7EB8\u5BBD / \u5206\u9875\uFF09+ \u7F13\u5B58\u952E + engrave \u7684\u9009\u9879\uFF08\u4E0D\u542B\u91CF\u5B57\u5BBD\u7684\u95ED\u5305\uFF0Cworker \u81EA\u5DF1\u914D\uFF09\u3002 */\n  private geo(st: EditorState): { frame: FrameNow; geoKey: string; opts: Omit<EngraveOpts, \"measureLyric\">; lyricPx: number } {\n    const { sp, width, strict, page, margins } = this.frame(), hscroll = !!this.host.scroll?.();\n    const paper = st.song.paper ?? paperOf(DEFAULT_PAPER);\n    if (this.caretEnd !== null && (this.caretEnd !== caretKey(st) || st.sel)) this.caretEnd = null;   // \u5149\u6807\u632A\u4E86\uFF08\u5199\u97F3 / \u65B9\u5411\u952E / \u64A4\u9500\u2026\uFF09= \u56DE\u5230\u9ED8\u8BA4\uFF08\u4E0B\u4E00\u884C\u5F00\u5934\uFF09\n    const partsNow = this.host.parts(), scopeSeg = (this.host.scope?.() ?? \"segment\") === \"segment\", autoBars = this.host.autoBars?.() ?? true, paperLabel = paper.kind === \"other\" ? \"\u5176\u4ED6\u7EB8\" : PAPER_LABEL[paper.kind];\n    const lyricRaise = page && this.host.lyricRaise?.() ? this.host.lyricRaise() : 0;\n    const tailOpen = !st.sel && st.caret >= tr(st).length;   // \u5199\u5B57\u5934\u5728\u5C3E\u5DF4\u540E\u9762\uFF08\u542B\u8865\u9F50\u7684\u5C0F\u8282\u91CC\uFF09\uFF1A\u6700\u540E\u4E00\u884C\u4E94\u7EBF\u753B\u5230\u53F3\u8FB9\n    // \u6392\u7248\u7F13\u5B58\uFF08W-17 \u7B2C 1 \u5200\uFF09\uFF1A\u8C31\u6CA1\u53D8\uFF08\u5F15\u7528\uFF09\u3001\u6392\u7248\u7684\u9009\u9879\u6CA1\u53D8 = \u4E0D\u91CD\u6392\u3002\u5149\u6807 / \u9009\u533A / \u5199\u5B57\u5934\u7684\u84DD / \u5F3A\u8C03\u8272\u4E0D\u5728\u8FD9\u4E2A\u952E\u91CC\u2014\u2014\u5B83\u4EEC\u5728\u4E0B\u9762\u7684 ink \u5C42\u548C class \u4E0A\u505A\uFF1B\u5B57\u4F53\u8FD8\u5728\u88C5 = \u88C5\u597D\u518D\u6392\u4E00\u6B21\n    const geoKey = JSON.stringify([width, sp, st.at.paper, st.at.part, partsNow, page ?? null, page ? null : margins, scopeSeg ? st.at.paper : null, hscroll, autoBars, paperLabel, lyricRaise, !this.rules.edit, tailOpen, document.fonts.status],\n      (_k, v: unknown) => (v instanceof Set ? [...v] : v));\n    const opts: Omit<EngraveOpts, \"measureLyric\"> = { width, sp, at: st.at, parts: partsNow, titlePlaceholder: true, ...(this.rules.edit ? {} : { foldAll: true }), ...(tailOpen ? { tailOpen: true } : {}),\n      ...(lyricRaise ? { lyricRaise } : {}), autoBars, paperLabel, ...(page ? { page } : { margins }), ...(scopeSeg ? { onlyPaper: st.at.paper } : {}), ...(hscroll ? { scroll: true } : {}) };\n    return { frame: { sp, width, strict, page, margins, hscroll }, geoKey, opts, lyricPx: LYRIC_EM * sp };\n  }\n  // \u2500\u2500 \u6392\u7248\u8FDB worker\uFF082026-10-21\uFF0CClaude Fable 5.1\uFF1Buser\u300C\u600E\u4E48\u6837\u5927\u6B4C\u80FD\u505A\u5230\u5B9E\u65F6\u8F93\u5165\u6F14\u594F\uFF0C\u5C3D\u91CF\u505A\u5230\u97F3\u6E38\u7EA7\u522B\u7684\u5EF6\u8FDF\u300D\uFF1B\u91CF = ai-docs/20261017-input-latency-probe.md\uFF09\u2500\u2500\n  //   \u4E0B\u4E00\u5E27\u7684\u753B\uFF08main.ts paintNow\uFF09\u8D70 renderAsync\uFF1A\u6392\u7248\u73B0\u6210 = \u76F4\u63A5\u753B\uFF1B\u4E0D\u73B0\u6210 = \u628A song\uFF08\u7ED3\u6784\u5316\u514B\u9686 \u2248 0.5 ms\uFF09\u548C\u9009\u9879\u53D1\u7ED9 worker\uFF08src/render/layout-worker.ts\uFF09\uFF0C\n  //   \u56DE\u6765\u7684\u662F SVG \u5206\u7EC4\u5B57\u7B26\u4E32 + \u53BB\u6389\u95ED\u5305\u7684 Layout\uFF08attachLayoutFns \u88C5\u56DE\u53BB\uFF09\uFF0C\u4E3B\u7EBF\u7A0B\u53EA\u5269\u6362 DOM + \u88C5\u9970\uFF08\u51E0 ms\uFF09\u3002\u5728\u9014\u671F\u95F4\u53C8\u6539\u4E86 = \u8BB0\u7740\u6700\u65B0\u7684\uFF0C\u56DE\u6765\u518D\u53D1\u4E00\u6B21\uFF08\u4E00\u6B21\u53EA\u6709\u4E00\u4E2A\u5728\u98DE\uFF09\u3002\n  //   \u8C01\u540C\u6B65\u8981\u6392\u7248\uFF08layoutNow\uFF09= \u4E3B\u7EBF\u7A0B\u81EA\u5DF1\u7B97\u3001\u5728\u9014\u56DE\u6267\u4F5C\u5E9F\u3002\u6CA1\u6709 Worker / OffscreenCanvas\u3001\u6216 worker \u574F\u4E86 = \u6C38\u8FDC\u8D70\u540C\u6B65\u8DEF\uFF08\u884C\u4E3A\u540C v0.13.x\uFF09\u3002\n  private worker: Worker | null | undefined;   // undefined = \u8FD8\u6CA1\u8BD5\uFF1Bnull = \u6CA1\u6709 / \u574F\u4E86\n  private seq = 0;\n  private pending: { seq: number; st: EditorState; song: Song; geoKey: string; frame: FrameNow } | null = null;\n  private queued: EditorState | null = null;\n  private workerParts: { for: Layout; parts: SvgParts } | null = null;   // worker \u4E32\u597D\u7684 SVG\uFF08\u548C\u5B83\u914D\u5957\u7684\u90A3\u4EFD Layout\uFF09\uFF1B\u4E3B\u7EBF\u7A0B render \u65F6\u4E0D\u518D toSvgParts\n  private needPaint = false;   // renderAsync \u8981\u753B\u3001\u8FD8\u6CA1\u753B\u6210\n  private workerOrNull(): Worker | null {\n    if (this.worker !== undefined) return this.worker;\n    this.worker = null;\n    try {\n      const url = this.host.layoutWorker?.();\n      if (!url || typeof Worker === \"undefined\" || typeof OffscreenCanvas === \"undefined\") return null;\n      const w = new Worker(url, { type: \"module\" });\n      w.onmessage = (e: MessageEvent<LayoutReply>) => this.onReply(e.data);\n      w.onerror = (e) => this.dropWorker(`worker error: ${e.message ?? \"?\"}`);\n      this.worker = w;\n    } catch (e) { this.dropWorker(`worker unavailable: ${(e as Error).message}`); }\n    return this.worker;\n  }\n  private dropWorker(why: string): void {\n    this.host.onLayoutWorker?.(why);\n    try { this.worker?.terminate(); } catch { /* ignore */ }\n    this.worker = null; this.pending = null; this.queued = null;\n    if (this.needPaint) this.render();\n  }\n  /** \u753B\uFF08\u7ED9\u4E0B\u4E00\u5E27\u7528\u7684\u5F02\u6B65\u5165\u53E3\uFF09\uFF1A\u6392\u7248\u73B0\u6210\u5C31\u753B\uFF0C\u4E0D\u73B0\u6210\u4EA4\u7ED9 worker\u3001\u56DE\u6765\u518D\u753B\u3002 */\n  renderAsync(): void {\n    const w = this.workerOrNull();\n    if (!w) { this.render(); return; }\n    const st = this.host.get(), g = this.geo(st);\n    if (this.layout && this.geoSong === st.song && this.geoKey === g.geoKey) { this.layoutSt = st; this.frameNow = g.frame; this.render(); return; }   // \u53EA\u632A\u4E86\u5149\u6807 / \u9009\u533A / \u88C5\u9970\n    this.needPaint = true;\n    if (this.pending) { this.queued = st; return; }   // \u5728\u98DE\uFF1A\u56DE\u6765\u518D\u53D1\u6700\u65B0\u7684\n    this.post(w, st, g);\n  }\n  private post(w: Worker, st: EditorState, g: ReturnType<ScoreView[\"geo\"]>): void {\n    const seq = ++this.seq;\n    this.pending = { seq, st, song: st.song, geoKey: g.geoKey, frame: g.frame }; this.queued = null;\n    const t0 = performance.now();\n    w.postMessage({ seq, song: st.song, opts: g.opts, font: lyricFont(g.lyricPx) } satisfies LayoutJob);\n    record(\"post\", performance.now() - t0);\n  }\n  private onReply(r: LayoutReply): void {\n    const p = this.pending;\n    if (!p || r.seq !== p.seq) return;   // \u4F5C\u5E9F\uFF08\u4E3B\u7EBF\u7A0B\u81EA\u5DF1\u7B97\u8FC7\u4E86 / \u66F4\u65B0\u7684\u5728\u98DE\uFF09\n    this.pending = null;\n    if (\"error\" in r) { this.dropWorker(`layout job failed: ${r.error}`); return; }\n    const t0 = performance.now();\n    this.layout = attachLayoutFns(r.data); this.geoSong = p.song; this.geoKey = p.geoKey; this.layoutSt = p.st; this.frameNow = p.frame;\n    this.workerParts = { for: this.layout, parts: r.parts };\n    record(\"engrave-worker\", r.ms); record(\"reply\", performance.now() - t0);\n    const q = this.queued; this.queued = null;\n    if (!q) { this.render(); return; }\n    // \u5728\u98DE\u671F\u95F4\u53C8\u6539\u4E86\uFF1A\u540C\u4E00\u9996\u6B4C\u53EA\u632A\u4E86\u5149\u6807 = \u76F4\u63A5\u753B\uFF1B\u6B4C / \u51E0\u4F55\u53D8\u4E86 = \u4E0D\u753B\u8FD9\u4EFD\u8FC7\u65F6\u7684\uFF0C\u9A6C\u4E0A\u53D1\u6700\u65B0\u7684\n    const g = this.geo(q);\n    if (this.geoSong === q.song && this.geoKey === g.geoKey) { this.layoutSt = q; this.frameNow = g.frame; this.render(); }\n    else { const w = this.workerOrNull(); if (w) this.post(w, q, g); else this.render(); }\n  }\n  private layoutSt: EditorState | null = null;\n  private frameNow: FrameNow | null = null;\n  private paintedSt: EditorState | null = null;\n  /** \u8FD9\u4EFD\u72B6\u6001\u5DF2\u7ECF\u753B\u8FC7\u4E86\uFF08main.ts \u7684\u4E0B\u4E00\u5E27\u753B\u7528\uFF1A\u4E2D\u9014\u6709\u4EBA\u663E\u5F0F render \u8FC7\u5C31\u4E0D\u518D\u753B\u4E00\u904D\uFF09\u3002 */\n  paintedFor(st: EditorState): boolean { return this.paintedSt === st; }\n  render(): void {\n    this.needPaint = false;\n    const st = this.host.get();\n    this.layoutNow(true);\n    const { sp, width, strict, page, margins, hscroll } = this.frameNow!;\n    const was = this.hscroll; this.hscroll = hscroll;\n    if (was && !this.hscroll) this.el.scrollLeft = 0;\n    this.el.classList.toggle(\"hscroll\", this.hscroll);\n    const totalW = width + (margins.l + margins.r) * sp; this.paperW = totalW;\n    if (this.zoom !== 1) this.el.classList.toggle(\"zoomed\", this.paperW * this.zoom > this.el.clientWidth + 1);   // \u5F00\u673A\u6309\u8BB0\u4F4F\u7684\u500D\u6570\u653E\u5927\u65F6\u7EB8\u5BBD\u8FD8\u6CA1\u7B97\u51FA\u6765\uFF1A\u8FD9\u91CC\u8865\u4E00\u6B21\n    this.el.classList.toggle(\"desk\", (strict && totalW < this.el.clientWidth - 1) || !!page);\n    this.el.classList.toggle(\"pages\", !!page);\n    this.sheet.style.width = strict ? `${Math.ceil(totalW)}px` : \"\";\n    this.paintedSt = st;\n    this.ink.style.left = `${this.layout!.pageX.left}px`;\n    if (this.hscroll) this.sheet.style.width = `${Math.ceil(this.layout!.width + this.layout!.pageX.left + this.layout!.pageX.right)}px`;   // \u6A2A\u5377\uFF1A\u7EB8\u6309\u5185\u5BB9\u6491\u5BBD\uFF0C\u8C31\u9762\u677F\u6A2A\u7740\u6EDA\n    this.tail.style.height = `${Math.round(this.el.clientHeight * 0.75)}px`;   // \u00BE \u5C4F\uFF08\u4E00\u6574\u5C4F\u6709\u65F6\u8BA9\u4EBA\u4EE5\u4E3A\u767D\u5C4F\u4E86\uFF1Buser 2026-10-08\u300C\u7559\u7684\u6EDA\u52A8\u7A7A\u767D\u4E0D\u5E94\u8BE5\u662F\u4E00\u6574\u9875\u20263/4\u5DE6\u53F3\uFF1F\u300D\uFF09\n    // \u667A\u80FD\u91CD\u753B\u7B2C\u4E00\u5200\uFF08W-17\uFF0C2026-10-14\uFF09\uFF1ASVG \u6309\u884C\u8C31\u5206\u6210\u51E0\u5341\u4E2A <g>\uFF0C\u548C\u4E0A\u4E00\u6B21\u9010\u7EC4\u6BD4\u5B57\u7B26\u4E32\u3001\u53EA\u6362\u53D8\u4E86\u7684\u7EC4\uFF08\u632A\u4E00\u683C\u5149\u6807 = \u4E24\u7EC4\uFF09\uFF1B\n    //   \u6846\u53D8\u4E86\uFF08\u5BBD\u9AD8 / viewBox\uFF09\u6216\u7EC4\u6570\u53D8\u4E86 = \u6574\u5F20\u6362\uFF08\u548C\u4EE5\u524D\u4E00\u6837\uFF09\u3002\u6392\u7248\u672C\u8EAB\u7167\u65E7\u6574\u9996\u7B97\uFF08engrave\uFF09\uFF0C\u7701\u7684\u662F\u5EFA 5000 \u4E2A\u8282\u70B9\u90A3\u4E03\u6210\u3002\n    const parts = this.workerParts?.for === this.layout ? this.workerParts.parts : span(\"svg-parts\", () => toSvgParts(this.layout!));   // worker \u4E32\u597D\u7684\u76F4\u63A5\u7528\n    const old = this.sheet.querySelector(\"svg\");\n    const prev = this.svgParts;\n    let swapped = false;\n    span(\"svg-dom\", () => {\n      if (!old || !prev || prev.open !== parts.open || prev.groups.length !== parts.groups.length || old.children.length !== parts.groups.length) {\n        const svg = parts.open + parts.groups.join(\"\") + parts.close;\n        if (old) old.outerHTML = svg; else this.sheet.insertAdjacentHTML(\"afterbegin\", svg);\n        swapped = true;\n      } else {\n        const kids = old.children;\n        for (let k = 0; k < parts.groups.length; k++) if (parts.groups[k] !== prev.groups[k]) { kids[k].outerHTML = parts.groups[k]; swapped = true; }\n      }\n    });\n    this.svgParts = parts;\n    if (swapped) this.tokEls = null;\n    const tDecor = performance.now();\n    this.decorate();   // \u5199\u5B57\u5934\u7684\u84DD / \u9009\u4E2D / \u5F3A\u8C03\u8272\uFF08class\uFF09\n    this.drawCaret();  // \u5149\u6807\uFF08ink \u5C42\uFF09\n    this.drawSel();    // \u9009\u533A\u5E26\uFF08ink \u5C42\uFF09\n    if (!this.boxEl.isConnected) this.ink.appendChild(this.boxEl);\n    this.placeHandles();\n    if (this.playP) this.setPlayhead(this.playP);   // \u6682\u505C\u7740 / \u653E\u7740\u7684\u65F6\u5019\u91CD\u753B\uFF1A\u64AD\u653E\u7EBF\u548C\u9AD8\u4EAE\u8DDF\u7740\u65B0\u7684\u6392\u7248\n    this.drawStartMark();\n    this.lyrics.reposition();\n    this.marks.reposition();\n    this.title.reposition();\n    this.drawPins();\n    this.drawGhost();   // \u300C\u5F39\u300D\u7684\u9B3C\u97F3\u7B26\u7167\u7740\u65B0\u7684\u6392\u7248\u91CD\u6446\uFF08\u53EA\u662F\u6446\uFF0C\u4E0D\u5F71\u54CD\u6392\u7248\uFF09\n    record(\"decor\", performance.now() - tDecor);\n    // \u53EA\u5728\u5149\u6807 / \u9009\u533A / \u7F16\u8F91\u6846\u632A\u4E86\u7684\u65F6\u5019\u624D\u628A\u89C6\u56FE\u62C9\u8FC7\u53BB\uFF1B\u522B\u7684\u91CD\u753B\uFF08\u9759\u97F3 / \u72EC\u594F\u7684\u89D2\u6807\u3001\u9690\u85CF\u3001\u6362\u7EB8\u8BBE\u7F6E\u2026\uFF09\u4E0D\u52A8\u4EBA\u5BB6\u6EDA\u5230\u54EA\n    //   \uFF08user 2026-10-08\u300Ctoggle mute solo\u7684\u65F6\u5019\u9875\u9762\u6EDA\u52A8\u4F1A\u53D8\u300D\uFF1A\u539F\u6765\u6BCF\u6B21\u91CD\u753B\u90FD follow\uFF0C\u6EDA\u5F00\u4E86\u5149\u6807\u90A3\u884C\u518D\u70B9\u9759\u97F3 = \u88AB\u62FD\u56DE\u53BB\uFF09\n    const base = this.baseKey(), fk = `${base}|${this.el.clientWidth}x${this.el.clientHeight}`;   // \u7A97\u53E3\u53D8\u4E86\uFF08pad \u5F39\u51FA\u628A\u8C31\u6324\u77EE\uFF09\u7167\u6837\u8DDF\n    if (this.holdView) this.heldBase = base;   // \u70B9\u58F0\u90E8\u540D\uFF1A\u8FD9\u4E2A\u5149\u6807\u4F4D\u7F6E\u4E0D\u8DDF\uFF0C\u76F4\u5230\u5149\u6807\u518D\u632A\n    // \u53EA\u662F\u7A97\u53E3\u53D8\u4E86\uFF08\u952E\u76D8\u5F39\u51FA / \u6536\u8D77\u3001\u8F6C\u5C4F\uFF09= \u5149\u6807\u90A3\u884C\u672C\u6765\u5C31\u5728\u89C6\u91CE\u91CC\u624D\u8DDF\uFF08\u88AB\u952E\u76D8\u6321\u4F4F\u65F6\u62C9\u4E0A\u6765\uFF09\uFF1B\u81EA\u5DF1\u6EDA\u5F00\u53BB\u770B\u522B\u5904\u4E86 = \u4E0D\u62FD\u56DE\u5149\u6807\u90A3\u513F\n    //   \uFF08v0.10.42\uFF1Buser\u300Ctoggle\u8F6F\u952E\u76D8\u4E4B\u540E\u8C31\u5B50\u8FD8\u662F\u4F1A\u8DF3\u5230\u5947\u602A\u7684\u5730\u65B9\u300D\u2014\u2014\u539F\u6765\u7A97\u53E3\u4E00\u53D8\u5C31\u8DDF\uFF0C\u6EDA\u5F00\u4E86\u518D\u5F00\u5408\u952E\u76D8 = \u8DF3\u56DE\u5149\u6807\u90A3\u884C\uFF09\n    if (fk !== this.followKey) {\n      const moved = this.followKey.slice(0, this.followKey.lastIndexOf(\"|\")) !== base;\n      this.followKey = fk;\n      if (base !== this.heldBase && (moved || this.caretSeen)) { this.heldBase = null; span(\"follow\", () => this.follow()); }\n    }\n    this.caretSeen = this.caretVisible();\n  }\n  // \u2500\u2500 \u300C\u5F39\u300D\u7684\u9B3C\u97F3\u7B26\uFF08v0.10.6\uFF1Buser\u300C\u5F39\u6A21\u5F0F\u4E0B\u9762\u80FD\u4E0D\u80FD\u5728\u8C31\u5B50\u4E0A\u9762\u5149\u6807\u5BF9\u5E94\u7684\u90A3\u4E2A\u5730\u65B9\u663E\u793A\u9B3C\u97F3\u7B26\uFF1F\u300D\u300C\u7279\u522B\u662F\u524D\u9762\u6709\u4E00\u4E2A\u97F3\u7684\u65F6\u5019\u2026\u5982\u679C\u662F\u53E0\u7684\u8BDD\u4F1A\u5728\u524D\u9762\u4E00\u4E2A\u97F3\u4E0A\u9762\u52A0\u4E1C\u897F\uFF0C\u4F46\u662F\u4E0D\u80FD\u52A8\u6392\u7248\uFF01\uFF01\uFF01\uFF0C\n  //   \u5982\u679C\u662F\u975E\u53E0\u7684\u8BDD\u5C31\u662F\u5728\u8981\u63D2\u5165\u7684\u5730\u65B9\u52A0\u4E1C\u897F\u300D\u300C\u9B3C\u97F3\u7B26\u7684\u65F6\u5019\u5343\u4E07\u4E0D\u80FD\u52A8\u6392\u7248\uFF01\u300D\uFF09\uFF1A\u76D6\u5728\u8C31\u4E0A\u7684\u4E00\u5C42\uFF08ink \u91CC\u4E00\u4E2A\u4E0D\u63A5\u70B9\u51FB\u7684 svg\uFF09\uFF0C\u53EA\u501F\u6392\u7248\u73B0\u6210\u7684\u4F4D\u7F6E\u2014\u2014\n  //   \u53EA\u9009\u4E86\u4E00\u4E2A\u97F3\uFF08\u53E0\u4EAE\u7740\uFF09= \u53E0\u753B\u5728\u90A3\u4E2A\u97F3\u4E0A\uFF1B\u5426\u5219 = \u5149\u6807\u5904\uFF08\u4E0B\u4E00\u4E2A\u97F3\u8981\u5199\u8FDB\u53BB\u7684\u5730\u65B9\uFF09\u3002\u4E0D\u8FDB engrave\u3001\u4E0D\u91CD\u6392\u3002\n  private ghostEl: SVGSVGElement | null = null;\n  private ghostP: Pitch[] = [];\n  showGhost(ps: Pitch[]): void { this.ghostP = ps; this.drawGhost(); }\n  private drawGhost(): void {\n    const L = this.layout, clear = () => { this.ghostEl?.remove(); this.ghostEl = null; };\n    if (!this.ghostP.length || !L) { clear(); return; }\n    const st = this.host.get(), one = singleSel(st), sp = L.sp;\n    /** \u8FD9\u4E00\u884C\u8C31\u53F7\u7684\u4F4D\u79FB\uFF1A\u770B\u8FD9\u4E00\u884C\u4E0A\u968F\u4FBF\u4E00\u4E2A\u97F3\uFF08\u547D\u4E2D\u6846\u91CC y \u5E26\u4F4D\u79FB\u3001d \u4E0D\u5E26\uFF09\u3002 */\n    const hd = this.head();\n    const shiftOn = (row: number) => { const n = L.notes.find((h) => h.system === row); return n ? Math.round(L.dOf(row, n.y)) - n.d : hd?.system === row ? hd.shift : 0; };\n    let row: number, x: number, shift: number;\n    if (one >= 0) {\n      const n = L.notes.find((h) => h.index === one && this.onTrack(h)), r = n ? null : L.rests.find((h) => h.index === one && this.onTrack(h));\n      if (n) { row = n.system; x = n.x; shift = Math.round(L.dOf(row, n.y)) - n.d; }\n      else if (r) { row = r.system; x = r.x; shift = shiftOn(row); }\n      else { clear(); return; }\n    } else if (hd) { row = hd.system; x = hd.x + 0.35 * sp; shift = hd.shift; }\n    else { clear(); return; }\n    const NS = \"http://www.w3.org/2000/svg\", g = (this.ghostEl ??= document.createElementNS(NS, \"svg\"));\n    g.setAttribute(\"class\", \"ghost-preview\"); g.setAttribute(\"width\", String(L.width)); g.setAttribute(\"height\", String(L.height));\n    const fs = 4 * sp, nh = 1.18 * sp, ext = 0.4 * sp, parts: string[] = [];\n    // \u5347\u964D\u53F7\u548C\u771F\u5199\u4E0B\u53BB\u7684\u90A3\u4E2A\u97F3\u4E00\u6837\uFF08v0.10.23\uFF09\uFF1A\u62FC\u6CD5\u6309\u90A3\u91CC\u7684\u8C03\u53F7\uFF08\u540C writePitch \u7684 keySpell\uFF09\uFF0C\u753B\u4E0D\u753B\u6309\u8C03\u53F7 + \u8FD9\u4E00\u5C0F\u8282\u524D\u9762\u7684\u4E34\u65F6\u8BB0\u53F7\uFF08shownAccAt\uFF0C\u548C\u6392\u7248\u540C\u4E00\u4E2A\u89C4\u77E9\uFF09\n    const toks = tr(st), at = one >= 0 ? one : st.caret, fifths = keyAt(toks, at);\n    for (const p0 of this.ghostP) {\n      const p = keySpell(p0, fifths), shown = shownAccAt(toks, at, p);\n      const d = diatonicIndex(p) + shift, y = L.yOf(row, d);\n      for (let k = 28; k >= d; k -= 2) parts.push(`<line x1=\"${x - ext}\" x2=\"${x + nh + ext}\" y1=\"${L.yOf(row, k)}\" y2=\"${L.yOf(row, k)}\" stroke-width=\"${0.16 * sp}\"/>`);\n      for (let k = 40; k <= d; k += 2) parts.push(`<line x1=\"${x - ext}\" x2=\"${x + nh + ext}\" y1=\"${L.yOf(row, k)}\" y2=\"${L.yOf(row, k)}\" stroke-width=\"${0.16 * sp}\"/>`);\n      parts.push(`<text x=\"${x}\" y=\"${y}\" font-family=\"Bravura\" font-size=\"${fs}\">\\u{E0A4}</text>`);\n      const acc = shown === null ? \"\" : shown === 1 ? \"\\u{E262}\" : shown === -1 ? \"\\u{E260}\" : shown === 2 ? \"\\u{E263}\" : shown === -2 ? \"\\u{E264}\" : \"\\u{E261}\";   // 0 = \u8FD8\u539F\u53F7\n      if (acc) parts.push(`<text x=\"${x - 1.2 * sp}\" y=\"${y}\" font-family=\"Bravura\" font-size=\"${fs}\">${acc}</text>`);\n    }\n    g.innerHTML = parts.join(\"\");\n    if (!g.isConnected) this.ink.appendChild(g);\n  }\n  private playheadEl: HTMLDivElement | null = null;\n  private barEl: HTMLDivElement | null = null; private barKey = \"\";   // \u64AD\u653E\u65F6\u7684\u5C0F\u8282\u5E95\u8272\uFF08v0.10.12\uFF09\n  /** \u4F60\u521A\u5728\u8C31\u4E0A\u52A8\u8FC7\uFF08\u5199 / \u6539 / \u632A\u5149\u6807\uFF09\uFF1A\u51E0\u79D2\u5185\u64AD\u653E\u4E0D\u62FD\u89C6\u56FE\uFF08v0.10.12\uFF1Buser\u300C\u68C0\u6D4B\u5230\u7528\u6237\u5728\u6298\u817E\u8C31\u5B50\u7684\u65F6\u5019\u9700\u8981hold\u4F4F\u64AD\u653E\u9875\u9762\u8DDF\u968F\uFF1F\u300D\u2192 AI \u5EFA\u8BAE\u300C\u4F60\u6B63\u5728\u6539\u8C31\u65F6\u5148\u4E0D\u8DDF\u300D\u2192\u300C12\u90FD\u540C\u610F\u300D\uFF09\u3002 */\n  private userEditAt = -1e9;\n  noteUserEdit(): void { this.userEditAt = performance.now(); }\n  private hlEls: HTMLDivElement[] = [];                                  // \u6B63\u5728\u54CD\u7684\u97F3\u7684\u9AD8\u4EAE\n  private playP: { paperId: string; tick: number } | null = null;       // \u64AD\u653E\u7EBF\u5728\u54EA\uFF08\u91CD\u753B\u540E\u7167\u7740\u518D\u6446\uFF09\n  private startP: { paperId: string; tick: number } | null = null;      // \u8D77\u70B9\n  private startEl: HTMLDivElement | null = null;\n  /** \u8FD9\u4E00\u4E0B\u70B9\u7684\u662F\u54EA\u4E00\u5C42\uFF08\u6A21\u5F0F\u7684\u89C4\u5219\u8868\uFF0Csrc/app/workspace.ts\uFF1B2026-10-10 user\u300C\u6A21\u5F0F\uFF01\u97F3\uFF0C\u6B4C\u8BCD\uFF0C\u5F3A\u5EA6\u548Carticulation\uFF01\u300D\u2192 \u97F3 / \u8BCD / \u7B26 + \u542C\uFF09\u3002\n   *  \u542C\uFF08edit = false\uFF09\uFF1A\u8C31\u9762\u4E0D\u5199\u2014\u2014\u8F7B\u70B9 = \u544A\u8BC9\u5BBF\u4E3B\u300C\u4ECE\u8FD9\u513F\u653E\u300D\uFF0C\u62D6 = \u6EDA\u52A8\uFF0C\u522B\u7684\u624B\u52BF\u90FD\u4E0D\u63A5\u3002 */\n  rules: ModeRules = RULES.notes;\n  /** \u81EA\u52A8\u7FFB\uFF082026-10-10 user\u300C...\u91CC\u9762\u52A0\u81EA\u52A8\u6EDA\u52A8\uFF0C\u4F60\u601D\u8003\u4E0B\u600E\u4E48\u5BF9\u9F50\u4E0D\u4F1A\u89C9\u5F97\u522B\u626D\u300D\u300C\u81EA\u52A8\u6EDA\u52A8\u9ED8\u8BA4\u5F00\u300D\uFF09\uFF1A\u653E\u7740\u7684\u65F6\u5019\u8C31\u8DDF\u7740\u6B63\u5728\u653E\u7684\u90A3\u4E00\u884C\u6EDA\u3002\n   *  \u4E0D\u9010\u5E27\u8DDF\uFF1A\u53EA\u5728\u90A3\u4E00\u884C\u6362\u884C\u3001\u5E76\u4E14\u51FA\u4E86\u8212\u670D\u533A\uFF08\u5C4F\u5E55\u4E0A\u6CBF\u5F80\u4E0B 5% \u5230 80%\uFF09\u65F6\uFF0C\u5E73\u6ED1\u6EDA\u5230\u8BA9\u5B83\u843D\u5728\u4E0A\u65B9\u4E24\u6210\u5904\uFF08\u4E0B\u9762\u80FD\u770B\u89C1\u63A5\u4E0B\u6765\u51E0\u884C\uFF09\uFF1B\u4F60\u521A\u81EA\u5DF1\u6EDA\u8FC7\uFF08\u6EDA\u8F6E / \u624B\u6307\uFF094 \u79D2\u5185\u4E0D\u8DDF\uFF0C\u4E0D\u62A2\u3002 */\n  autoFollow = true;\n  private playSysKey = \"\";\n  private userScrollAt = -1e9;\n  private lockTap: { pid: number; x: number; y: number; moved: boolean } | null = null;\n  private roGesture = false;\n  private roAt: { x: number; y: number } | null = null;   // \u53EA\u8BFB\u884C\u4E0A\u6309\u4E0B\u7684\u5730\u65B9\uFF08\u8F7B\u70B9 = \u5C55\u5F00\u90A3\u4E00\u5BB6\uFF09   // \u8FD9\u4E00\u4E0B\u6309\u5728\u5408\u79DF\u53E0\u8D77\u6765\u7684\u90A3\u4E00\u884C\u4E0A\uFF08\u53EA\u8BFB\uFF09\n  private inSharedRow(x: number, y: number): boolean { const L = this.layout; if (!L || !L.sharedRows.length) return false; void x; return L.sharedRows.some((i) => { const r = L.systems[i]; return !!r && y >= r.top && y <= r.bottom; }); }\n  private holdPid: number | null = null;                                 // \u6309\u4F4F\u4E00\u4E2A\u97F3\u5728\u51FA\u58F0\uFF08\u957F\u6309 = \u9884\u89C8\uFF1B\u62AC\u624B\u505C\uFF09\n  /** \u64AD\u653E\u5934\uFF08\u5B9E\u65F6\u8BD5\u542C\u300C\u8C31\u4E0A\u8DDF\u7740\u4EAE\u300D\uFF0C2026-10-09 Claude Fable 5.1\uFF09\uFF1Ap = \u54EA\u5F20\u7EB8\u7684\u7B2C\u51E0\u4E2A tick\uFF08\u7EB8\u81EA\u5DF1\u7684\uFF0C\u53CD\u590D\u5DF2\u6298\u56DE\u53BB\uFF1Bsrc/engine/timeline.ts locate\uFF09\uFF1Bnull = \u6536\u8D77\u3002\n   *  \u53EA\u632A\u4E00\u6761\u7EBF\uFF0C\u4E0D\u91CD\u6392\u3001\u4E0D\u52A8\u6EDA\u52A8\u3002\u4F4D\u7F6E = \u8FD9\u5F20\u7EB8\u7B2C\u4E00\u884C\u90A3\u6761 track \u4E0A\u300C\u8D77\u70B9 \u2265 tick \u7684\u7B2C\u4E00\u4E2A\u97F3\u300D\u7684\u5149\u6807\u4F4D \u2192 slot \u7684 x\uFF1B\u884C\u9AD8 = \u90A3\u4E00\u884C\u7684\u8C31\u8868\u8303\u56F4\u3002 */\n  /** \u64AD\u653E\u7EBF\uFF082026-10-10 Opus 5.5\uFF1Buser\u300C\u9996\u5148\u662F\u7EBF\uFF0C\u548C\u5149\u6807\u7528\u4E0D\u4E00\u6837\u7684\u989C\u8272\uFF0C\u7136\u540E\u5BF9\u9F50\u662F\u548C\u6240\u6709track\u91CC\u9762\u6700\u540E\u9762\u7684\u4E00\u4E2A\u97F3\u7B26\u5BF9\u9F50\uFF0C\u53D6max\uFF0C\u7136\u540E\u5531\u5230\u7684\u97F3\u7B26\u8BD5\u7740\u9AD8\u4EAE\u4E00\u4E0B\u3002\u770B\u6548\u679C\u597D\u4E0D\u597D\u300D\uFF09\uFF1A\n   *  x = \u8FD9\u4E00\u884C\u6240\u6709\u58F0\u90E8\u91CC\u3001\u6B64\u523B\u5DF2\u7ECF\u5F00\u59CB\u7684\u97F3\u4E2D\u6700\u665A\u5F00\u59CB\u7684\u90A3\u4E2A\uFF08\u53D6 max\uFF09\uFF1B\u7EBF\u4ECE\u8FD9\u4E00\u884C\u6700\u4E0A\u9762\u90A3\u6761\u8C31\u753B\u5230\u6700\u4E0B\u9762\u90A3\u6761\uFF1B\u6BCF\u4E2A\u58F0\u90E8\u6B63\u5728\u54CD\u7684\u97F3\u9AD8\u4EAE\u3002\n   *  \u989C\u8272\u8D70 CSS\uFF08.playhead / .play-hl\uFF0C\u548C\u5149\u6807\u7684 --accent \u5206\u5F00\uFF09\u3002\u6682\u505C\u7740\u4E5F\u7559\u7740\uFF08\u7EED\u64AD\u4ECE\u8FD9\u513F\uFF09\u3002 */\n  setPlayhead(p: { paperId: string; tick: number } | null, ahead: { paperId: string; tick: number } | null = null): void {\n    this.playP = p;\n    const L = this.layout;\n    const clear = () => { this.playheadEl?.remove(); this.playheadEl = null; for (const e of this.hlEls) e.remove(); this.hlEls = []; this.barEl?.remove(); this.barEl = null; this.barKey = \"\"; };\n    if (!p || !L) { clear(); this.playSysKey = \"\"; this.turnedKey = \"\"; return; }\n    const found = this.soundingAt(p.paperId, p.tick);\n    if (!found.length) { clear(); return; }\n    // \u653E\u5230\u54EA\u4E00\u5C0F\u8282 / \u54EA\u4E00\u884C\uFF1A\u6309\u64AD\u653E\u7684 tick \u67E5\u5C0F\u8282\uFF08v0.10.28\uFF1B\u4EE5\u524D\u6309\u300C\u6700\u665A\u5F00\u59CB\u7684\u90A3\u4E2A\u97F3\u300D\u2014\u2014\u8DE8\u5C0F\u8282\u7684\u957F\u97F3\u540E\u534A\u622A\u6CA1\u6709\u70B9\u51FB\u533A\uFF0C\u5C0F\u8282\u5E95\u8272\u548C\u7FFB\u8C31\u90FD\u505C\u5728\u4E0A\u4E00\u5C0F\u8282 / \u4E0A\u4E00\u884C\uFF1B\n    //   user\u300C\u5C0F\u8282\u9AD8\u4EAE\u4E5F\u7B97\u9519\u4E86\uFF0C\u5982\u679C\u4F60\u53EA\u7528\u7B2C\u4E00\u4E2A\u5408\u79DF\u58F0\u90E8\u6765\u7B97\u7684\u8BDD\uFF0C\u56E0\u4E3A\u78B0\u5230\u8DE8\u5C0F\u8282\u7684\u97F3\u5C0F\u8282\u9AD8\u4EAE\u6CA1\u6709update\u300D\uFF09\n    const msr = this.barAt(p.paperId, p.tick);\n    const lead = found.reduce((a, b) => (b.start > a.start ? b : a)), h0 = lead.hits[0], sys = L.systems[msr ? msr.row : h0.system].sys;\n    const rows = L.systems.filter((r) => r.paper === p.paperId && r.sys === sys);\n    const top = Math.min(...rows.map((r) => r.top)), bottom = Math.max(...rows.map((r) => r.bottom)), x = h0.x + h0.w / 2;\n    const sysKey = `${p.paperId}:${sys}`;\n    if (sysKey !== this.playSysKey) { this.playSysKey = sysKey; if (this.autoFollow) this.followPlay(top, bottom); }\n    // \u63D0\u524D\u7FFB\u8C31\uFF08v0.10.21\uFF1Buser\u300C\u89C6\u56FE\u8DF3\u8F6C\u80FD\u65E9\u4E00\u70B9\u5417\u2026\u65B9\u4FBF\u5BF9\u7740\u8C31\u5B50\u5531\u6B4C\uFF1F\u300D\u2192\u300C\u6211\u8BF4\u7684\u4E0D\u662F\u770B\u4E0B\u4E00\u884C\uFF0C\u56E0\u4E3A\u5C0F\u8BBE\u5907\u5927\u603B\u8C31\u4E0A\u9762\u4E00\u6B21\u53EA\u80FD\u770B\u4E00\u884C\u3002\u4EE5\u53CA\u7F16\u6392longjump\u3002\u60F3\u4E00\u60F3\u94A2\u7434\u5BB6\u662F\u600E\u4E48\u7FFB\u9875\u7684\u300D\uFF09\uFF1A\n    //   ahead = \u518D\u8FC7\u4E00\u5C0F\u4F1A\u513F\uFF08\u4E3B\u7EBF\u7A0B TURN_LEAD \u79D2\uFF09\u653E\u5230\u7684\u5730\u65B9\u2014\u2014\u6309\u64AD\u653E\u7684\u987A\u5E8F\u7B97\uFF0C\u4E0B\u4E00\u884C\u3001\u7F16\u6392 / \u53CD\u590D\u8DF3\u56DE\u53BB\u7684\u5730\u65B9\u90FD\u4E00\u6837\uFF1B\u5B83\u5728\u522B\u7684\u4E00\u884C = \u73B0\u5728\u5C31\u7FFB\u8FC7\u53BB\n    if (ahead && this.autoFollow && !this.hscroll) {\n      const fa = this.soundingAt(ahead.paperId, ahead.tick), ma = this.barAt(ahead.paperId, ahead.tick);\n      if (fa.length || ma) {\n        const asys = L.systems[ma ? ma.row : fa.reduce((a, b) => (b.start > a.start ? b : a)).hits[0].system].sys, akey = `${ahead.paperId}:${asys}`;\n        if (akey !== sysKey && akey !== this.turnedKey) {\n          // \u653E\u5230\u8FD9\u4E00\u884C\u6700\u540E\u4E00\u4E2A\u97F3\u4E86\u6CA1\uFF08\u8FD9\u4E00\u884C\u6240\u6709\u58F0\u90E8\u91CC\u6700\u9760\u53F3\u7684\u90A3\u4E2A\u97F3\u5934\uFF09\uFF1A\u6CA1\u5230 = \u7FFB\u8FC7\u53BB\u4F1A\u628A\u5B83\u7FFB\u6CA1\u7684\u90A3\u79CD\u7FFB\u6CD5\u5148\u7B49\u7740\uFF08user\u300C\u81F3\u5C11\u4E0D\u8981\u628A\u6BCF\u884C\u6700\u540E\u4E00\u4E2A\u97F3\u4E22\u4E86\u3002\u5F53\u7136\u5982\u679C\u662F\u4E00\u5806\u5C0F\u5FEB\u97F3\u7684\u8BDD\u4EBA\u7C7B\u4F1Aprecache\u300D\uFF09\n          const ids = new Set(rows.map((r) => L.systems.indexOf(r))); let lastX = -Infinity; for (const n of this.hits) if (ids.has(n.system) && n.x > lastX) lastX = n.x;\n          const arows = L.systems.filter((r) => r.paper === ahead.paperId && r.sys === asys);\n          if (this.turnTo(top, bottom, Math.min(...arows.map((r) => r.top)), Math.max(...arows.map((r) => r.bottom)), h0.x >= lastX - 1)) this.turnedKey = akey;\n        }\n      }\n    }\n    if (this.hscroll && this.autoFollow) this.followPlayX(x);   // \u6A2A\u5377\uFF1A\u4E00\u884C\u5F88\u957F\uFF0C\u6A2A\u7740\u8DDF\uFF08\u4E0D\u7B49\u6362\u884C\uFF09\n    // \u5C0F\u8282\u5E95\u8272\uFF08v0.10.12\uFF1Buser\u300C\u64AD\u653E\u52A8\u753B\u7684\u65F6\u5019\u8FD8\u5F97\u57AB\u4E00\u4E2A\u6BD4\u8F83\u8F7B\u7684\u5C0F\u8282\u9AD8\u4EAE\u2026\u592A\u4F4E\u8C03\u4E86\u6240\u4EE5\u6709\u65F6\u5019\u627E\u4E0D\u5230\u653E\u54EA\u91CC\u4E86\u300D\u2192 AI \u5EFA\u8BAE\u6574\u5C0F\u8282\u3001user\u300C12\u90FD\u540C\u610F\u300D\uFF09\uFF1A\n    //   \u6B63\u5728\u653E\u7684\u90A3\u4E2A\uFF08\u6700\u665A\u5F00\u59CB\u7684\u97F3\uFF09\u6240\u5728\u7684\u5C0F\u8282\uFF0C\u76D6\u4F4F\u8FD9\u4E00\u884C\u6240\u6709\u58F0\u90E8\uFF0C\u5F88\u6DE1\uFF0C\u57AB\u5728\u97F3\u7B26\u9AD8\u4EAE\u4E0B\u9762\uFF1B\u4E00\u5C0F\u8282\u624D\u6362\u4E00\u6B21\uFF0C\u4E0D\u6643\n    { const row = msr ? msr.row : h0.system, hx = msr ? msr.x + 1 : h0.x + h0.w / 2; let left = -Infinity, right = Infinity;\n      for (const b of L.bars) if (b.system === row) { if (b.x <= hx - 1 && b.x > left) left = b.x; if (b.x > hx + 1 && b.x < right) right = b.x; }\n      if (!Number.isFinite(left)) { let first = Infinity; for (const n of this.hits) if (n.system === row && n.x < first) first = n.x; left = (Number.isFinite(first) ? first : hx) - L.sp * 0.8; }\n      if (!Number.isFinite(right)) right = L.systems[row].x1 ?? hx + L.sp * 4;\n      let d = this.barEl; if (!d || !d.isConnected) { d = document.createElement(\"div\"); d.className = \"play-bar\"; this.ink.insertBefore(d, this.ink.firstChild); this.barEl = d; }\n      // \u4E0A\u4E0B\u6CBF = \u8FD9\u4E00\u884C\u8C31\u771F\u6709\u58A8\u7684\u5730\u65B9\u518D\u7559\u4E00\u70B9\uFF08v0.10.26\uFF0Cuser\u300C\u64AD\u653E\u8FDB\u5EA6\u7684\u7070\u8272\u65B9\u5757\u7684top\u548Cbottom\u518D\u63A8\u6572\u4E00\u4E0B\u300D\uFF1A\u4EE5\u524D\u7528\u6574\u884C\u7684\u683C\u5B50\u2014\u2014\u4E0A\u9762\u7A7A\u4E00\u5927\u622A\u3001\n      //   \u4E0B\u9762\u5207\u6389\u53E0\u7740\u7684\u623F\u5BA2\u7684\u4F4E\u97F3\uFF09\uFF1B\u4E00\u6574\u884C\u90FD\u4E00\u6837\u9AD8\uFF0C\u6362\u5C0F\u8282\u4E0D\u8DF3\n      const pad = L.sp * 0.8, bt = Math.min(...rows.map((r) => r.inkTop ?? r.top)) - pad, bb = Math.max(...rows.map((r) => r.inkBottom ?? r.bottom)) + pad;\n      const key = `${p.paperId}:${sys}:${Math.round(left)}`;\n      if (key !== this.barKey) { this.barKey = key; d.style.left = `${left}px`; d.style.top = `${bt}px`; d.style.width = `${Math.max(4, right - left)}px`; d.style.height = `${bb - bt}px`; } }\n    void x;   // \u64AD\u653E\u7EBF\u5148\u4E0D\u753B\uFF082026-10-10 user\u300C\u611F\u89C9\u9AD8\u4EAE\u591F\uFF0C\u53EF\u4EE5\u5148\u4E0D\u7528\u90A3\u6839\u5F53\u524D\u64AD\u653E\u7684\u7EBF\u2026\u5148\u8BD5\u8BD5\u4E0D\u7528\u7EBF\u300D\uFF09\u2014\u2014\u4F4D\u7F6E\u7167\u7B97\uFF0C\u8981\u56DE\u6765\u65F6\u5728\u8FD9\u513F\u753B\n    // \u6B63\u5728\u54CD\u7684\u97F3\uFF1A\u6BCF\u4E2A\u58F0\u90E8\u5404\u81EA\u7684\u90A3\u4E00\u4E2A\uFF08\u4F11\u6B62\u4E0D\u4EAE\uFF09\uFF1B\u8FDE\u97F3\u7EBF\u62C6\u5F00\u7684\u51E0\u6BB5\u4E00\u8D77\u4EAE\n    const spots = found.filter((f) => f.note).flatMap((f) => f.hits);\n    while (this.hlEls.length > spots.length) this.hlEls.pop()!.remove();\n    spots.forEach((h, k) => {\n      let d = this.hlEls[k];\n      if (!d || !d.isConnected) { d = document.createElement(\"div\"); d.className = \"play-hl\"; this.ink.appendChild(d); this.hlEls[k] = d; }\n      const r = Math.max(6, h.w * 0.8), pv = this.host.parts().find((q) => q.id === realPart(L.systems[h.system]?.part ?? \"\"));   // \u8FD9\u4F4D\u6B4C\u624B\u7684\u7C7B\u522B\u8272\uFF08v0.9.31\uFF09\n      d.style.setProperty(\"--hl\", pv?.colorIdx !== undefined ? TAB20[pv.colorIdx] : \"\");\n      d.style.left = `${h.x + h.w / 2 - r}px`; d.style.top = `${h.y - r}px`; d.style.width = d.style.height = `${2 * r}px`;\n    });\n  }\n  /** \u81EA\u52A8\u7FFB\uFF1A\u6B63\u5728\u653E\u7684\u90A3\u4E00\u884C\uFF08\u7EB8\u9762\u5750\u6807 top..bottom\uFF09\u51FA\u4E86\u8212\u670D\u533A = \u5E73\u6ED1\u6EDA\u5230\u5B83\u5728\u5C4F\u5E55\u4E0A\u65B9\u4E24\u6210\u5904\u3002 */\n  private turnedKey = \"\";\n  /** \u7FFB\u5230\u63A5\u4E0B\u6765\u90A3\u4E00\u884C\uFF1A\u5DF2\u7ECF\u6574\u4E2A\u770B\u5F97\u89C1 = \u4E0D\u52A8\uFF1B\u548C\u73B0\u5728\u8FD9\u4E00\u884C\u4E00\u8D77\u653E\u5F97\u4E0B\uFF08\u5B83\u5728\u4E0B\u9762\uFF09= \u8FD9\u4E00\u884C\u8D34\u9876\u3001\u4E24\u884C\u90FD\u5728\uFF1B\u653E\u4E0D\u4E0B = \u5B83\u8D34\u9876\uFF08\u8FD9\u4E00\u884C\u7FFB\u8D70\u4E86\uFF0C\u50CF\u7FFB\u8C31\uFF09\u2014\u2014\n   *  \u4F46\u653E\u5230\u8FD9\u4E00\u884C\u6700\u540E\u4E00\u4E2A\u97F3\u4E4B\u524D\u4E0D\u8FD9\u4E48\u7FFB\uFF08onLast = false = \u5148\u7B49\uFF0C\u8FD4\u56DE false\uFF0C\u4E0B\u4E00\u5E27\u518D\u6765\uFF09\u3002\u8FDC\u7684\uFF08\u7F16\u6392\u8DF3\u56DE\u53BB\uFF09= \u5148\u77AC\u79FB\u518D\u5E73\u6ED1\u3002\u8FD4\u56DE true = \u529E\u5B8C\u4E86\uFF08\u7FFB\u4E86 / \u4E0D\u7528\u7FFB\uFF09\u3002 */\n  private turnTo(curTop: number, curBottom: number, aTop: number, aBottom: number, onLast: boolean): boolean {\n    const now = performance.now(); if (now - this.userScrollAt < 4000 || now - this.userEditAt < 4000) return true;\n    const z = this.zoom, off = this.sheet.offsetTop, vt = this.el.scrollTop, vh = this.el.clientHeight;\n    const a0 = off + aTop * z, a1 = off + aBottom * z, c0 = off + curTop * z, c1 = off + curBottom * z;\n    if (a0 >= vt + vh * 0.03 && a1 <= vt + vh * 0.97) return true;\n    const both = a0 > c0 && a1 - c0 <= vh * 0.94, to = Math.max(0, both ? c0 - vh * 0.03 : a0 - vh * 0.1);\n    if (!onLast && (c0 < to || c1 > to + vh)) return false;   // \u8FD9\u4E00\u7FFB\u4F1A\u628A\u6B63\u5728\u653E\u7684\u8FD9\u4E00\u884C\u7FFB\u51FA\u5C4F\u5E55\u3001\u6700\u540E\u4E00\u4E2A\u97F3\u8FD8\u6CA1\u5F00\u59CB\u5531 = \u7B49\n    if (Math.abs(to - vt) > vh * 1.5) this.el.scrollTo({ top: to + (to > vt ? -1 : 1) * vh * 0.3, behavior: \"instant\" as ScrollBehavior });\n    this.el.scrollTo({ top: to, behavior: \"smooth\" });\n    return true;\n  }\n  /** \u8DF3\u5230\u6B63\u5728\u653E\u7684\u5730\u65B9\uFF08\u957F\u6309 / \u53F3\u952E |\u25B6 \u7684\u83DC\u5355\uFF1Bv0.10.21\uFF0Cuser\u300C\u64AD\u653E\u7684...\u53EF\u4EE5\u652F\u6301\u8DF3\u8F6C\u5230\u5F53\u524D\u64AD\u653E\u7684\u5730\u65B9\u300D\uFF09\uFF1A\u4E0D\u7BA1\u521A\u624D\u662F\u4E0D\u662F\u81EA\u5DF1\u6EDA\u8FC7\uFF0C\u6EDA\u8FC7\u53BB\u3001\u63A5\u7740\u8DDF\u3002 */\n  revealPlayhead(): boolean {\n    const L = this.layout, p = this.playP; if (!L || !p) return false;\n    const found = this.soundingAt(p.paperId, p.tick); if (!found.length) return false;\n    const h0 = found.reduce((a, b) => (b.start > a.start ? b : a)).hits[0], sys = L.systems[h0.system].sys;\n    const rows = L.systems.filter((r) => r.paper === p.paperId && r.sys === sys), top = Math.min(...rows.map((r) => r.top));\n    this.userScrollAt = -1e9; this.userEditAt = -1e9;\n    this.el.scrollTo({ top: Math.max(0, this.sheet.offsetTop + top * this.zoom - this.el.clientHeight * 0.2), behavior: \"smooth\" });\n    if (this.hscroll) this.el.scrollTo({ left: Math.max(0, this.sheet.offsetLeft + ((L.pageX.left ?? 0) + h0.x) * this.zoom - this.el.clientWidth * 0.2), behavior: \"smooth\" });\n    return true;\n  }\n  private followPlay(top: number, bottom: number): void {\n    const now = performance.now();\n    if (now - this.userScrollAt < 4000 || now - this.userEditAt < 4000) return;\n    const z = this.zoom, off = this.sheet.offsetTop, vt = this.el.scrollTop, vh = this.el.clientHeight;\n    const y0 = off + top * z, y1 = off + bottom * z;\n    if (y0 >= vt + vh * 0.05 && y1 <= vt + vh * 0.95) return;   // \u6574\u884C\u770B\u5F97\u89C1\u5C31\u4E0D\u52A8\uFF08v0.10.21\uFF1A\u5F80\u4E0B\u7684\u90A3\u4E00\u884C\u7531\u300C\u63D0\u524D\u7FFB\u300D\u5728\u4E0A\u4E00\u884C\u653E\u5230\u516D\u6210\u65F6\u9732\u51FA\u6765\uFF1B\u539F\u6765 0.8 = \u6362\u4E86\u884C\u53C8\u6EDA\u4E00\u6B21\uFF09\n    const to = Math.max(0, y0 - vh * 0.2);\n    // \u957F\u8DF3\u8F6C\uFF08\u7F16\u6392 / \u53CD\u590D\u8DF3\u56DE\u53BB\u3001\u8DE8\u597D\u51E0\u5C4F\uFF09\uFF1A\u5148\u77AC\u79FB\u5230\u8FD8\u5DEE\u4E09\u6210\u5C4F\u7684\u5730\u65B9\uFF0C\u518D\u5E73\u6ED1\u6EDA\u5B8C\u6700\u540E\u90A3\u4E00\u6BB5\uFF0C\u5230\u4E86\u5C0F\u8282\u5E95\u8272\u95EA\u4E00\u4E0B\u2014\u2014\n    //   \u4E00\u8DEF\u5E73\u6ED1\u6EDA\u597D\u51E0\u5C4F\u4F1A\u6655\u3001\u8FD8\u4F1A\u626B\u8FC7\u4E00\u5806\u4E0D\u76F8\u5E72\u7684\u8C31\uFF1B\u76F4\u63A5\u77AC\u79FB\u53C8\u627E\u4E0D\u7740\u5317\uFF08v0.10.12\uFF1Buser\u300C\u5982\u679C\u662F\u957F\u8DF3\u8F6C\u4E5F\u8BB8\u9700\u8981\u9875\u9762\u52A8\u753B\uFF1F\u4E0D\u7136\u7684\u8BDD\u7A81\u7136teleport\u4F1Amisorientation\u3002\u4F46\u662F\u52A8\u753B\u4F1A\u4E0D\u4F1A\u6655\u8F66\u300D\uFF09\n    if (Math.abs(to - vt) > vh * 1.5) { this.el.scrollTo({ top: to + (to > vt ? -1 : 1) * vh * 0.3, behavior: \"instant\" as ScrollBehavior }); this.flashBar(); }\n    this.el.scrollTo({ top: to, behavior: \"smooth\" });\n  }\n  /** \u5C0F\u8282\u5E95\u8272\u95EA\u4E00\u4E0B\uFF08\u957F\u8DF3\u8F6C\u5230\u4E86\uFF09\u3002 */\n  private flashBar(): void { const d = this.barEl; if (!d) return; d.classList.remove(\"flash\"); void d.offsetWidth; d.classList.add(\"flash\"); }\n  /** \u6A2A\u5377\u7684\u81EA\u52A8\u7FFB\uFF08v0.9.35\uFF09\uFF1A\u6B63\u5728\u653E\u7684\u97F3\uFF08\u7EB8\u9762 x\uFF09\u51FA\u4E86\u8212\u670D\u533A\uFF08\u5C4F\u5E55\u5DE6\u8FB9 5% \u5230 80%\uFF09= \u5E73\u6ED1\u6EDA\u5230\u5B83\u5728\u5DE6\u8FB9\u4E24\u6210\u5904\uFF1B\u4F60\u521A\u81EA\u5DF1\u6EDA\u8FC7 4 \u79D2\u5185\u4E0D\u8DDF\u3002 */\n  private followPlayX(x: number): void {\n    if (performance.now() - this.userScrollAt < 4000) return;\n    const z = this.zoom, sx = this.sheet.offsetLeft + ((this.layout?.pageX.left ?? 0) + x) * z, vl = this.el.scrollLeft, vw = this.el.clientWidth;\n    if (sx >= vl + vw * 0.05 && sx <= vl + vw * 0.8) return;\n    this.el.scrollTo({ left: Math.max(0, sx - vw * 0.2), behavior: \"smooth\" });\n  }\n  /** \u6A2A\u5377\uFF1A\u6B4C\u624B\u540D\u9489\u5728\u5C4F\u5E55\u5DE6\u8FB9\uFF08v0.9.35\uFF1B10-10 \u95EE\u7B54\u300C\u6A2A\u5377\u6CA1\u6709\u884C\u9996\uFF0C\u5DE6\u8FB9\u7684\u540D\u5B57\u4F1A\u6EDA\u8D70\uFF0C\u6A2A\u5377\u91CC\u540D\u5B57\u5E94\u8BE5\u9489\u5728\u5C4F\u5E55\u5DE6\u8FB9\u3001\u8D34\u7740\u6BCF\u6761\u8C31\u7684\u5DE6\u4E0A\u300D\uFF09\u3002\n   *  \u7EB8\u4E0A\u539F\u6765\u7684\u540D\u5B57\u7167\u753B\uFF08\u6EDA\u5230\u6700\u5DE6\u8FB9\u65F6\u770B\u5F97\u89C1\uFF09\uFF1B\u6EDA\u5F00\u4E86\u624D\u9732\u51FA\u9489\u4F4F\u7684\u8FD9\u4E00\u5217\u3002\u53EA\u770B\u3001\u4E0D\u63A5\u70B9\uFF08\u70B9\u540D\u5B57 = \u6EDA\u56DE\u5DE6\u8FB9\u70B9\u7EB8\u4E0A\u90A3\u4E2A\uFF09\u3002 */\n  private hscroll = false;\n  private pinEl: HTMLDivElement | null = null;\n  private drawPins(): void {\n    const L = this.layout;\n    if (!this.hscroll || !L) { this.pinEl?.remove(); this.pinEl = null; return; }\n    if (!this.pinEl || !this.pinEl.isConnected) { this.pinEl = document.createElement(\"div\"); this.pinEl.className = \"pin-names\"; this.sheet.appendChild(this.pinEl); }\n    const views = this.host.parts();\n    this.pinEl.replaceChildren(...L.systems.filter((r) => r.staff === 1).map((r) => {\n      const v = views.find((q) => q.id === r.part), d = document.createElement(\"div\");\n      d.className = \"pin-name\"; d.textContent = v?.abbr || v?.name || \"\";\n      if (v?.colorIdx !== undefined) d.style.setProperty(\"--cat\", TAB20[v.colorIdx]);\n      d.style.top = `${r.staffTop - L.sp * 1.6}px`;\n      return d;\n    }));\n    this.placePins();\n  }\n  private placePins(): void {\n    if (!this.pinEl) return;\n    const left = this.el.scrollLeft / this.zoom;\n    this.pinEl.style.transform = `translateX(${left}px)`;\n    this.pinEl.classList.toggle(\"is-on\", left > (this.layout?.sp ?? 10) * 4);\n  }\n  /** \u8FD9\u5F20\u7EB8 tick \u90A3\u4E00\u523B\u6BCF\u4E2A\u58F0\u90E8\uFF08\u6392\u51FA\u6765\u7684\u6BCF\u4E00\u884C\uFF09\u6B63\u5728\u653E\u7684 token\uFF1A\u4E0B\u6807\u3001\u5F00\u59CB\u7684 tick\u3001\u753B\u51FA\u6765\u7684\u4F4D\u7F6E\uFF08\u97F3 / \u4F11\u6B62\uFF09\u3002 */\n  /** \u64AD\u653E\u7684 tick \u5728\u54EA\u4E2A\u5C0F\u8282\uFF08Layout.measures\uFF1Bv0.10.28\uFF09\u3002 */\n  private barAt(paperId: string, tick: number): { row: number; x: number } | null {\n    return this.layout?.measures.find((m) => m.paper === paperId && tick >= m.t0 && tick < m.t1) ?? null;\n  }\n  private soundingAt(paperId: string, tick: number): { part: string; index: number; start: number; note: boolean; hits: { x: number; y: number; w: number; system: number }[] }[] {\n    const L = this.layout; if (!L) return [];\n    const paper = this.host.get().song.papers.find((x) => x.id === paperId); if (!paper) return [];\n    const out: { part: string; index: number; start: number; note: boolean; hits: { x: number; y: number; w: number; system: number }[] }[] = [];\n    // \u6BCF\u4E00\u6761\u753B\u51FA\u6765\u7684 track\uFF1A\u6BCF\u884C\u90A3\u4E00\u4F4D + \u5408\u79DF\u865A\u62DF\u7684\u90A3\u51E0\u6761\uFF08\u53CC\u624B\u8C31\u4E0B\u9762\u90A3\u5F20 `~lo`\u3001\u9694\u5F97\u8FDC\u5288\u51FA\u6765\u7684\u58F0\u90E8 2 `~v2`\uFF1Bv0.10.28\uFF09\u2014\u2014\u4E0B\u6807\u6307\u7684\u90FD\u662F\u5B83\u81EA\u5DF1\u90A3\u6761\n    const ids = new Set(L.systems.filter((r) => r.paper === paperId).map((r) => r.part));\n    for (const k of Object.keys(L.virtual)) if (k.startsWith(`${paperId}:`)) ids.add(k.slice(paperId.length + 1));\n    for (const id of ids) {\n      const toks = L.virtual[`${paperId}:${id}`] ?? paper.tracks[id] ?? []; let t = 0, at = -1, start = 0;\n      for (let i = 0; i < toks.length; i++) { const k = toks[i]; if (!isTimed(k)) continue; if (t + k.dur > tick) { at = i; start = t; break; } t += k.dur; }\n      if (at < 0) continue;\n      const mine = (h: { index: number; system: number; part?: string }) => h.index === at && L.systems[h.system]?.paper === paperId && (h.part ?? L.systems[h.system]?.part) === id;\n      const hits = [...L.notes.filter(mine), ...L.chordHeads.filter(mine), ...L.rests.filter(mine)];   // \u548C\u5F26 = \u6BCF\u4E2A\u7B26\u5934\u90FD\u4EAE\uFF08v0.10.23\uFF09\n      if (hits.length) out.push({ part: id, index: at, start, note: toks[at].kind === \"note\", hits });\n    }\n    return out;\n  }\n  /** \u5F00\u64AD\u7684\u8D77\u70B9\uFF08\u5C0F\u8282\u5934\uFF1B2026-10-10 user\u300C\u7F16\u8F91\u7684\u65F6\u5019\u5149\u6807\u52A8\u4F46\u662F\u64AD\u653E\u5934\u4E0D\u52A8\u300D\u300C\u5927\u90E8\u5206\u65F6\u5019\u53EF\u4EE5\u5C0F\u8282\u7EA7\u522B\u7684\u5F00\u59CB\u7CBE\u5EA6\u300D\uFF09\uFF1A\u4E00\u9762\u5C0F\u65D7\uFF0C\u989C\u8272\u548C\u5149\u6807 / \u64AD\u653E\u7EBF\u90FD\u4E0D\u4E00\u6837\u3002null = \u6CA1\u8BBE\uFF08\u4ECE\u5934\uFF09\u3002 */\n  setStartMark(p: { paperId: string; tick: number } | null): void { this.startP = p; this.drawStartMark(); }\n  private drawStartMark(): void {\n    const L = this.layout, p = this.startP;\n    if (!p || !L) { this.startEl?.remove(); this.startEl = null; return; }\n    const found = this.soundingAt(p.paperId, p.tick).filter((f) => f.start >= p.tick);   // \u6B63\u597D\u4ECE\u5C0F\u8282\u5934\u5F00\u59CB\u7684\u90A3\u4E9B\u97F3 / \u4F11\u6B62\n    const h = (found.length ? found : this.soundingAt(p.paperId, p.tick)).flatMap((f) => f.hits).sort((a, b) => a.x - b.x)[0];\n    if (!h) { this.startEl?.remove(); this.startEl = null; return; }\n    const sys = L.systems[h.system].sys, rows = L.systems.filter((r) => r.paper === p.paperId && r.sys === sys);\n    const top = Math.min(...rows.map((r) => r.top)), bottom = Math.max(...rows.map((r) => r.bottom));\n    let el = this.startEl;\n    if (!el || !el.isConnected) { el = document.createElement(\"div\"); el.className = \"start-mark\"; el.title = \"\u8D77\u70B9\uFF1A|\u25B6 \u4ECE\u8FD9\u513F\u653E\uFF08\u957F\u6309 / \u53F3\u952E\u7A7A\u767D\u5904\u300C\u4ECE\u8FD9\u513F\u653E\u300D\u632A\u5B83\uFF1B\u7F16\u8F91\u4E0D\u52A8\u5B83\uFF09\"; this.ink.appendChild(el); this.startEl = el; }\n    el.style.left = `${h.x - 4}px`; el.style.top = `${top}px`; el.style.height = `${Math.max(1, bottom - top)}px`;\n  }\n  /** \u5149\u6807 / \u9009\u533A / \u7F16\u8F91\u6846\u5728\u54EA\uFF08\u53D8\u4E86\u624D\u8DDF\uFF09\u3002 */\n  private baseKey(): string {\n    const st = this.host.get();\n    return `${st.at.paper}|${st.at.part}|${st.caret}|${st.sel ? `${st.sel.from}-${st.sel.to}` : \"\"}|${this.lyrics.open ? this.lyrics.system : \"\"}|${this.marks.open ? this.marks.system : \"\"}`;\n  }\n  private followKey = \"\";\n  private caretSeen = true;               // \u5149\u6807\u90A3\u884C\u73B0\u5728\u5728\u4E0D\u5728\u89C6\u91CE\u91CC\uFF08\u6EDA\u52A8 / \u91CD\u753B\u65F6\u8BB0\uFF1B\u7A97\u53E3\u53D8\u4E86\u8981\u4E0D\u8981\u8DDF\u5C31\u770B\u5B83\uFF09\n  private holdView = false;               // \u6B63\u5728\u70B9\u58F0\u90E8\u540D\uFF08\u8FD9\u4E00\u6B21\u91CD\u753B\u4E0D\u8DDF\u5149\u6807\uFF09\n  private heldBase: string | null = null; // \u70B9\u58F0\u90E8\u540D\u4E4B\u540E\u7684\u5149\u6807\u4F4D\u7F6E\uFF1A\u6CA1\u632A\u4E4B\u524D\uFF08\u542B pad \u5F39\u51FA\u7684\u7A97\u53E3\u53D8\u5316\uFF09\u90FD\u4E0D\u8DDF\n  /** \u5149\u6807\u753B\u5728\u4E0A\u4E00\u884C\u672B\u5C3E\uFF08\u70B9\u5728\u4E0A\u4E00\u884C\u884C\u672B\u653E\u7684\uFF09\uFF1A\u8BB0\u7740\u662F\u54EA\u4E2A\u5149\u6807\u4F4D\u7F6E\uFF08\u7EB8|\u58F0\u90E8|\u4E0B\u6807\uFF09\uFF0C\u5149\u6807\u4E00\u632A\u5C31\u5931\u6548\uFF1B\u4E0D\u8FDB\u6587\u4EF6\u3001\u4E0D\u8FDB undo\uFF082026-10-10 user\u300C\u7136\u540E\u6211\u5E0C\u671B\u5149\u6807\u80FD\u540C\u65F6\u652F\u6301\u4E00\u884C\u7684\u672B\u5C3E\u548C\u4E0B\u4E00\u884C\u7684\u5F00\u5934\u4E24\u4E2A\u4F4D\u7F6E\u53D6\u51B3\u4E8E\u70B9\u5728\u54EA\u91CC\u300D\uFF09\u3002 */\n  private caretEnd: string | null = null;\n  /** \u4E0A\u4E00\u6B21\u753B\u7684 SVG\uFF08\u5F00\u6807\u7B7E + \u6BCF\u884C\u8C31\u4E00\u7EC4\uFF09\uFF0C\u9010\u7EC4\u6BD4\u3001\u53EA\u6362\u53D8\u4E86\u7684\uFF08W-17\uFF09\u3002 */\n  private svgParts: { open: string; groups: string[]; close: string } | null = null;\n  /** \u6392\u7248\u7F13\u5B58\uFF08W-17 \u7B2C 1 \u5200\uFF0C2026-10-15\uFF09\uFF1A\u8C31\uFF08\u5F15\u7528\uFF09+ \u6392\u7248\u7528\u5230\u7684\u9009\u9879\u6CA1\u53D8 = \u4E0D\u91CD\u6392\uFF08engrave \u662F\u6574\u9996\u7B97\u7684\u90A3 20 \u591A\u6BEB\u79D2\uFF09\uFF1B\n   *  \u5149\u6807 / \u9009\u533A\u5E26\u5728 ink \u5C42\u753B\uFF0C\u5199\u5B57\u5934\u7684\u84DD / \u9009\u4E2D / \u5F3A\u8C03\u8272\u6309 data-tok \u5728 SVG \u5143\u7D20\u4E0A\u5F00\u5173 class\uFF08decorate\uFF09\u3002 */\n  private geoSong: Song | null = null; private geoKey = \"\";\n  private tokEls: Map<number, Element[]> | null = null;   // data-tok \u2192 \u5143\u7D20\uFF08\u6362\u8FC7\u7EC4\u624D\u91CD\u5EFA\uFF09\n  private decorated: { el: Element; cls: string }[] = [];   // \u4E0A\u4E00\u6B21\u52A0\u8FC7 class \u7684\uFF08\u5148\u64A4\u518D\u52A0\uFF09\n  private caretEl: SVGSVGElement | null = null;\n  private selEls: HTMLDivElement[] = [];\n\n  /** \u80FD\u70B9\u3001\u80FD\u9009\u7684\u4E1C\u897F = \u97F3 + \u4F11\u6B62\uFF08user 2026-10-08\u300C\u4E3A\u4EC0\u4E48\u4F11\u6B62\u7B26\u6CA1\u6CD5\u9009\u62E9\uFF0C\u4F11\u6B62\u7B26\u5C31\u8FD9\u4E48\u6CA1\u6709\u4EBA\u6743\u5417\uFF0C\u6211\u611F\u89C9\u7F16\u8F91\u7684\u5FC3\u667A\u6A21\u578B\u91CC\u9762\u4F11\u6B62\u7B26\u4E5F\u5E94\u8BE5\u548C\u666E\u901A\u97F3\u7B26\u6CA1\u533A\u522B\u300D\uFF09\u3002\n   *  \u4F11\u6B62\u6CA1\u6709\u97F3\u9AD8\uFF1Ad = NaN\uFF08\u7B14 / \u9F20\u6807\u6309\u4F4F\u62D6\u53EA\u6539\u65F6\u503C\u3001\u4E0D\u51FA\u58F0\uFF09\u3002 */\n  private get hits(): HitNote[] {\n    const L = this.layout; if (!L) return [];\n    return [...L.notes, ...L.rests.map((r) => ({ index: r.index, system: r.system, x: r.x, y: r.y, w: r.w, d: NaN }))];\n  }\n  /** \u8FD9\u4E2A\u547D\u4E2D\u8BB0\u5F55\u662F\u4E0D\u662F\u5149\u6807\u6240\u5728\u90A3\u6761 track \u7684\u3002 */\n  private onTrack(h: { system: number }): boolean {\n    const L = this.layout!, st = this.host.get(), row = L.systems[h.system];\n    return !!row && row.paper === st.at.paper && row.part === st.at.part;\n  }\n  /** \u5149\u6807\u753B\u5728\u54EA\uFF08W-17 \u7B2C 1 \u5200\uFF1A\u4E0D\u8FDB\u6392\u7248\uFF0C\u4ECE\u843D\u70B9 slots \u91CC\u67E5\uFF09\uFF1A\u8FD9\u6761 track \u4E0A\u8FD9\u4E2A caret \u7684\u843D\u70B9\uFF1B\u8865\u9F50\u7684\u5C0F\u8282\u91CC = lead \u90A3\u4E2A\uFF1B\u70B9\u5728\u884C\u672B\u653E\u7684\uFF08caretEnd\uFF09= end \u90A3\u4E2A\u3002\n   *  \u5927\u8C31\u8868\uFF1A\u4E24\u5F20\u8C31\u8868\u5404\u4E00\u4E2A\u843D\u70B9\uFF0C\u5149\u6807\u8DDF\u7740\u524D\u4E00\u4E2A\u97F3\u5728\u54EA\u5F20\u3002\u6709\u9009\u533A / \u8FD8\u6CA1\u6392\u597D = null\u3002shift = \u90A3\u91CC\u7684\u8C31\u53F7 / \u516B\u5EA6\u7EBF\u4F4D\u79FB\uFF08\u9B3C\u97F3\u7B26\u7528\uFF09\u3002 */\n  head(): { system: number; x: number; shift: number } | null {\n    const st = this.host.get(); if (st.sel) return null; const L = this.layoutNow();\n    const mine = (s: CaretHead) => { const r = L.systems[s.system]; return !!r && r.paper === st.at.paper && r.part === st.at.part; };\n    const want = st.lead ? L.heads.filter((s) => mine(s) && s.lead === st.lead)\n      : this.caretEnd === caretKey(st) ? L.heads.filter((s) => mine(s) && !!s.end && s.caret === st.caret)\n      : L.heads.filter((s) => mine(s) && !s.end && s.lead === undefined && s.caret === st.caret);\n    if (!want.length) return null;\n    let pick = want[0];\n    if (want.length > 1) {\n      const toks = tr(st); let prev = -1; for (let i = st.caret - 1; i >= 0; i--) if (isTimed(toks[i])) { prev = i; break; }\n      const h = prev >= 0 ? this.hits.find((n) => n.index === prev && this.onTrack(n)) : undefined;\n      if (h) pick = want.find((s) => s.system === h.system) ?? pick;\n    }\n    return { system: pick.system, x: pick.x, shift: pick.shift };\n  }\n  /** \u5199\u5B57\u5934\u7684\u84DD\uFF08cur\uFF09/ \u9009\u4E2D\uFF08sel\uFF09/ \u62D6\u7740\u7684\uFF08hot\uFF09/ \u70B9\u5F00\u7684\u8BB0\u53F7\u7BA1\u7684\u90A3\u51E0\u4E2A\u97F3\uFF08in-span\uFF09\uFF1A\u6309 data-tok \u5728 SVG \u5143\u7D20\u4E0A\u5F00\u5173 class\uFF0C\u4E0D\u91CD\u6392\u3001\u4E0D\u6362 SVG\u3002\n   *  \u54EA\u4E9B\u5143\u7D20\u5403\u54EA\u4E2A class \u7167\u539F\u6765\u6392\u7248\u65F6\u7684\u89C4\u77E9\uFF1Acur \u4E0D\u7ED9\u6B4C\u8BCD\uFF1Bhot \u53EA\u7ED9\u6B4C\u8BCD / \u529B\u5EA6 / \u98CE\u683C / \u53CD\u590D / \u6E10\u5F3A\u6E10\u5F31\u7684\u5B57\u548C\u7EBF\uFF1Bin-span \u53EA\u7ED9\u7B26\u5934\u3002 */\n  private decorate(): void {\n    const svg = this.sheet.querySelector(\"svg\"); if (!svg) return;\n    if (!this.tokEls) {\n      const m = new Map<number, Element[]>();\n      for (const el of svg.querySelectorAll(\"[data-tok]\")) { const id = Number(el.getAttribute(\"data-tok\")); const a = m.get(id); if (a) a.push(el); else m.set(id, [el]); }\n      this.tokEls = m;\n    }\n    for (const d of this.decorated) d.el.classList.remove(d.cls);\n    this.decorated = [];\n    const st = this.host.get(), toks = tr(st);\n    const add = (id: number, cls: string, ok?: (el: Element) => boolean) => { for (const el of this.tokEls!.get(id) ?? []) if (!ok || ok(el)) { el.classList.add(cls); this.decorated.push({ el, cls }); } };\n    const HOT = [\"lyric\", \"dyn\", \"groove-mark\", \"nav-mark\", \"nav-sign\", \"dyn-word\", \"hairpin\"];\n    if (st.sel) { for (let i = st.sel.from; i < st.sel.to; i++) { const t = toks[i]; if (t) add(t.id, \"sel\"); } }\n    else if (st.log.length > 0) { for (let i = st.caret - 1; i >= 0; i--) if (isTimed(toks[i])) { add(toks[i].id, \"cur\", (el) => !el.classList.contains(\"lyric\")); break; } }   // \u521A\u5199\u8FC7\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3 = \u5199\u5B57\u5934\n    if (this.hot) for (const id of this.hot) add(id, \"hot\", (el) => HOT.some((c) => el.classList.contains(c)));\n    if (this.span) for (let i = this.span.from; i < this.span.to; i++) { const t = toks[i]; if (t) add(t.id, \"in-span\", (el) => el.classList.contains(\"note\")); }\n  }\n  /** \u5149\u6807\uFF1Aink \u5C42\u91CC\u4E00\u4E2A svg \u7684\u4E00\u6839\u7EBF\uFF08\u540C\u539F\u6765\u6392\u7248\u753B\u7684\uFF1A\u843D\u70B9 x + 0.1sp\uFF0C\u4ECE\u7B2C 42 \u7EA7\u5230\u7B2C 26 \u7EA7\uFF09\uFF1B\u542C\u6A21\u5F0F CSS \u85CF\u8D77\u6765\u3002 */\n  private drawCaret(): void {\n    const L = this.layout, h = this.head();\n    if (!L || !h) { this.caretEl?.remove(); this.caretEl = null; return; }\n    const NS = \"http://www.w3.org/2000/svg\", g = (this.caretEl ??= document.createElementNS(NS, \"svg\"));\n    g.setAttribute(\"class\", \"ink-caret\"); g.setAttribute(\"width\", String(L.width)); g.setAttribute(\"height\", String(L.height));\n    const x = h.x + 0.1 * L.sp;\n    g.innerHTML = `<line class=\"caret\" x1=\"${x}\" y1=\"${L.yOf(h.system, 42)}\" x2=\"${x}\" y2=\"${L.yOf(h.system, 26)}\" stroke-width=\"${0.16 * L.sp}\"/>`;\n    if (!g.isConnected) this.ink.appendChild(g);\n  }\n  /** \u9009\u533A = \u6DE1\u84DD\u5E26\u5B50\uFF08user 2026-10-08\u300C\u9009\u533A\u753B\u6210\u4E00\u6761\u6DE1\u84DD\u7684\u5E26\u5B50\u76D6\u4F4F\u90A3\u51E0\u4E2A\u97F3\u300D\uFF09\uFF1A\u6BCF\u884C\u4E00\u6761\uFF0C\u4ECE\u9009\u4E2D\u7684\u7B2C\u4E00\u4E2A\u4E1C\u897F\u5230\u6700\u540E\u4E00\u4E2A\uFF08\u97F3 / \u4F11\u6B62 / \u8BB0\u53F7\uFF09\uFF0C\n   *  \u9AD8 = \u7B2C\u4E94\u7EBF\u4E0A\u9762\u4E24\u683C\u5230\u6B4C\u8BCD\u884C\u4E0B\u9762\u4E00\u70B9\uFF08\u540C\u539F\u6765\u6392\u7248\u753B\u7684 selbox\uFF09\uFF1Bink \u5C42\u7684 div\uFF0C\u4E58\u5E95\uFF08mix-blend-mode\uFF09\u538B\u5728\u8C31\u4E0A\u4E0D\u76D6\u58A8\u3002 */\n  private drawSel(): void {\n    for (const e of this.selEls) e.remove(); this.selEls = [];\n    const L = this.layout, st = this.host.get(); if (!L || !st.sel) return;\n    const { from, to } = st.sel, sp = L.sp;\n    const rowsOf = (r: SystemBox): number[] => { const idx: number[] = []; L.systems.forEach((q, i) => { if (q.paper === r.paper && q.part === r.part && q.sys === r.sys) idx.push(i); }); return idx; };\n    const acc = new Map<number, { a: number; b: number; rows: number[] }>();\n    const take = (h: { index: number; system: number; x: number; w: number }) => {\n      if (h.index < from || h.index >= to || !this.onTrack(h)) return;\n      const r = L.systems[h.system]; if (!r) return;\n      const a = h.x - 0.35 * sp, b = h.x + h.w + 0.35 * sp, e = acc.get(r.sys);\n      if (!e) acc.set(r.sys, { a, b, rows: rowsOf(r) }); else { e.a = Math.min(e.a, a); e.b = Math.max(e.b, b); }\n    };\n    for (const h of this.hits) take(h);\n    for (const h of L.dyns) take(h);\n    for (const h of L.marks) take(h);\n    for (const { a, b, rows } of acc.values()) {\n      const top = L.yOf(rows[0], 44), bottom = L.lyricY(rows[rows.length - 1]) + 0.8 * sp;\n      const d = document.createElement(\"div\"); d.className = \"selbox\";\n      Object.assign(d.style, { left: `${a}px`, top: `${top}px`, width: `${b - a}px`, height: `${bottom - top}px` });\n      this.ink.insertBefore(d, this.ink.firstChild); this.selEls.push(d);\n    }\n  }\n  /** \u9009\u533A\u4E24\u7AEF\u7684\u68D2\u68D2\u7CD6\u628A\u624B\uFF1A\u7B2C\u4E00\u4E2A / \u6700\u540E\u4E00\u4E2A\u9009\u4E2D\u7684\u97F3\u7684\u4E0B\u9762\uFF08\u6B4C\u8BCD\u884C\u518D\u5F80\u4E0B\u4E00\u70B9\uFF09\u3002 */\n  private placeHandles(): void {\n    const L = this.layout, st = this.host.get();\n    const inSel = L && st.sel ? this.hits.filter((n) => this.onTrack(n) && n.index >= st.sel!.from && n.index < st.sel!.to) : [];\n    if (!L || !inSel.length) { this.handles.start.hidden = true; this.handles.end.hidden = true; return; }\n    const a = inSel.reduce((p, n) => (n.index < p.index ? n : p)), b = inSel.reduce((p, n) => (n.index > p.index ? n : p)), sp = L.sp;\n    Object.assign(this.handles.start.style, { left: `${a.x - sp * 0.3}px`, top: `${L.lyricY(a.system) + sp * 0.9}px` }); this.handles.start.hidden = false;\n    Object.assign(this.handles.end.style, { left: `${b.x + b.w + sp * 0.3}px`, top: `${L.lyricY(b.system) + sp * 0.9}px` }); this.handles.end.hidden = false;\n  }\n  /** \u5149\u6807\u90A3\u4E00\u884C\u6EDA\u8FDB\u89C6\u91CE\uFF08\u8F6F\u952E\u76D8\u5F39\u51FA / \u6536\u8D77\u65F6\u5BBF\u4E3B\u8C03\uFF09\u3002 */\n  followNow(): void { this.follow(); }   // \u660E\u7740\u8981\uFF08\u64A4\u9500\u628A\u89C6\u56FE\u5E26\u8FC7\u53BB\u7B49\uFF09= \u7167\u62C9\n  /** \u5149\u6807\uFF08\u9009\u4E2D = \u5B83\u7684\u7B2C\u4E00\u4E2A\u97F3\uFF1B\u5F00\u7740\u6B4C\u8BCD / \u8BB0\u53F7\u6846 = \u90A3\u4E00\u884C\uFF09\u5728\u54EA\u4E00\u884C\u3002 */\n  private caretSystem(): number {\n    const L = this.layout, st = this.host.get(); if (!L) return -1;\n    let sys = this.head()?.system ?? -1;\n    if (sys < 0 && st.sel) sys = this.hits.find((n) => this.onTrack(n) && n.index >= st.sel!.from && n.index < st.sel!.to)?.system ?? -1;\n    if (this.lyrics.open) sys = this.lyrics.system;\n    if (this.marks.open) sys = this.marks.system;\n    return sys;\n  }\n  /** \u5149\u6807\u90A3\u4E00\u884C\u6709\u6CA1\u6709\u4E00\u90E8\u5206\u5728\u89C6\u91CE\u91CC\uFF08\u6CA1\u6709\u5149\u6807 / \u8FD8\u6CA1\u6392\u597D = \u7B97\u5728\uFF09\u3002 */\n  private caretVisible(): boolean {\n    const L = this.layout, box = L?.systems[this.caretSystem()]; if (!box) return true;\n    const top = this.el.scrollTop, h = this.el.clientHeight, z = this.zoom, off = this.sheet.offsetTop;\n    return off + box.bottom * z > top && off + box.top * z < top + h;\n  }\n  /** \u5149\u6807\uFF08\u6216\u9009\u4E2D\uFF09\u90A3\u4E00\u884C\u4FDD\u6301\u5728\u89C6\u91CE\u91CC\uFF08\u53EA\u6EDA\u8C31\u9762\u677F\u81EA\u5DF1\uFF0C\u9875\u9762\u4E0D\u6EDA\uFF09\u3002 */\n  private follow(): void {\n    const L = this.layout, st = this.host.get(); if (!L) return;\n    const sys = this.caretSystem();\n    const box = L.systems[sys]; if (!box) return;\n    const top = this.el.scrollTop, h = this.el.clientHeight, z = this.zoom, off = this.sheet.offsetTop;   // off = \u7EB8\u4E0A\u9762\u7559\u7ED9\u8D70\u5E26\u80F6\u56CA\u7684\u8FB9\u8DDD\uFF08styles.css .sheet margin-top\uFF09\n    // \u4E0D\u8D34\u7740\u6700\u4E0B\u9762\uFF1A\u4E0B\u9762\u7559\u51FA\u5927\u7EA6\u4E00\u884C\uFF08user 2026-10-08\u300C\u6253\u5B57\u7684\u81EA\u52A8\u5BF9\u9F50\u4E5F\u4E0D\u8981\u9760\u7740\u6700\u4E0B\u9762\uFF0C\u800C\u662F\u5012\u6570\u7B2C\u4E8C\u6392\u4E4B\u7C7B\u7684\uFF0C\u6253\u97F3\u7B26\u4E5F\u662F\u300D\uFF09\u2014\u2014\u6700\u591A\u4E09\u6210\u5C4F\u9AD8\n    //   \uFF08\u77EE\u5C4F + \u8F6F\u952E\u76D8\u65F6\u522B\u628A\u8FD9\u4E00\u884C\u63A8\u51FA\u4E0A\u6CBF\uFF09\uFF1B\u5F80\u4E0A\u8DDF\u7684\u65F6\u5019\u4E0A\u9762\u4E5F\u7559\u4E00\u70B9\u3002\u653E\u4E0D\u4E0B\u4E24\u5934 = \u8FD9\u4E00\u884C\u7684\u4E0A\u6CBF\u4F18\u5148\u770B\u5F97\u89C1\n    const a = off + box.top * z, bt = off + box.bottom * z, rowH = bt - a, below = Math.min(rowH, h * 0.3), above = Math.min(rowH * 0.25, h * 0.1);\n    if (a - above < top) this.el.scrollTop = Math.max(0, a - above);\n    else if (bt + below > top + h) this.el.scrollTop = Math.min(bt + below - h, a - above);\n    // \u6A2A\u5377\uFF1A\u5149\u6807\uFF08\u9009\u4E2D = \u5B83\u7684\u7B2C\u4E00\u4E2A\u97F3\uFF09\u6A2A\u7740\u4E5F\u4FDD\u6301\u5728\u89C6\u91CE\u91CC\u2014\u2014\u5DE6\u8FB9\u7559\u4E00\u6210\u3001\u53F3\u8FB9\u7559\u4E24\u6210\uFF0C\u51FA\u4E86\u5C31\u628A\u5B83\u653E\u5230\u5DE6\u8FB9\u4E09\u6210\u5904\uFF08\u5F80\u53F3\u5199\u7684\u65F6\u5019\u524D\u9762\u80FD\u770B\u89C1\u51E0\u5C0F\u8282\uFF09\n    if (this.hscroll) {\n      const hx = this.head()?.x ?? (st.sel ? this.hits.find((n) => this.onTrack(n) && n.index === st.sel!.from)?.x : undefined); if (hx === undefined) return;\n      const sx = this.sheet.offsetLeft + (L.pageX.left + hx) * z, vl = this.el.scrollLeft, vw = this.el.clientWidth;\n      if (sx < vl + vw * 0.1 || sx > vl + vw * 0.8) this.el.scrollLeft = Math.max(0, sx - vw * 0.3);\n    }\n  }\n\n  /** \u6307\u9488 \u2192 \u7EB8\u9762\u5750\u6807\uFF08\u7EB8\u53EF\u80FD\u5C45\u4E2D\u5728\u684C\u9762\u4E0A\uFF1A\u6309\u7EB8\u81EA\u5DF1\u7684\u4F4D\u7F6E\u7B97\uFF1B\u653E\u5927\u4E86\u9664\u56DE\u53BB\uFF09\u3002 */\n  /** \u7EB8\u9762\u4E0A\u7684\u6846 \u2192 \u5C4F\u5E55\u5750\u6807\uFF08local \u7684\u53CD\u8FC7\u6765\uFF09\u3002 */\n  private clientBox(b: { x: number; y: number; w: number; h: number }): { left: number; top: number; right: number; bottom: number } {\n    const r = this.sheet.getBoundingClientRect(), ox = this.layout?.pageX.left ?? 0, z = this.zoom;\n    return { left: r.left + (b.x + ox) * z, top: r.top + b.y * z, right: r.left + (b.x + b.w + ox) * z, bottom: r.top + (b.y + b.h) * z };\n  }\n  private local(e: { clientX: number; clientY: number }): { x: number; y: number } {\n    const r = this.sheet.getBoundingClientRect(), ox = this.layout?.pageX.left ?? 0;\n    return { x: (e.clientX - r.left) / this.zoom - ox, y: (e.clientY - r.top) / this.zoom };\n  }\n  /** \u539F\u5927\u65F6\u7EB8\uFF08\u542B\u8FB9\u8DDD\uFF09\u6709\u591A\u5BBD\uFF08px\uFF0Crender \u91CC\u8BB0\uFF09\uFF1A\u634F\u5408\u6700\u591A\u653E\u5230\u5B83\u548C\u5C4F\u5E55\u4E00\u6837\u5BBD\u3002 */\n  private paperW = 0;\n  /** \u6700\u591A\u653E\u5927\u51E0\u500D\uFF08\u540C PDF \u9605\u8BFB\u5668\uFF1A\u53EF\u4EE5\u6BD4\u5C4F\u5E55\u5BBD\u3001\u6A2A\u7740\u6EDA\uFF1Buser 2026-10-10\u300Cipad\u53EF\u4EE5\u653E\u7684\u5F88\u5927\uFF0C\u5C31\u548Cpdf\u6D4F\u89C8\u5668\u4E00\u6837\u300D\u2014\u2014\u53D6\u4EE3 v0.9.19 \u7684\u300C\u6700\u591A\u5230\u7EB8\u548C\u5C4F\u5E55\u4E00\u6837\u5BBD\u300D\uFF09\u3002 */\n  private maxZoom(): number { return this.mulOf(MAX_ZOOM); }\n  private minZoom(): number { return this.mulOf(MIN_ZOOM); }\n  /** \u7269\u7406\u500D\u6570 \u2194 \u4E58\u5728 sheet \u4E0A\u7684\u500D\u6570\uFF08\u81EA\u52A8\u5927\u5C0F = 1\uFF09\u3002 */\n  private mulOf(phys: number): number { return (phys * this.physPx) / this.spAuto; }\n  private physOf(mul: number): number { return (mul * this.spAuto) / this.physPx; }\n  private clampMul(z: number): number { return Math.max(this.minZoom(), Math.min(this.maxZoom(), z)); }\n  // \u2500\u2500 \u7F29\u653E\u7684\u53E3\uFF082026-10-21\uFF0CClaude Fable 5.1\uFF1Buser\u300C\u66F2\u8C31\u7684\u7F29\u653E\u4E0D\u5408\u7406\uFF0C\u4E5F\u7406\u4E00\u4E0B\u3002\u53EF\u4EE5\u5BF9\u6807\u4E00\u4E0Bpdf\u6D4F\u89C8\u5668\uFF0C\u7136\u540Ectrl wheel\u597D\u597D\u7684\u5E2E\u6211\u5168\u91CF\u62E6\u622A\u4E00\u4E0B\u300D\uFF09\uFF1A\n  //   \u952E\u76D8\uFF08Ctrl / \u2318 + = / \u2212 / 0\uFF0Cplatform-guards \u5728\u7A97\u53E3\u6355\u83B7\u9636\u6BB5\u5168\u62E6\u3001\u8DEF\u7531\u5230\u8FD9\u91CC\uFF09\u4E00\u6863\u4E00\u6863\u3001\u4EE5\u8C31\u9762\u677F\u4E2D\u5FC3\u4E3A\u951A\uFF1B\u8BFB\u6570\u6309\u94AE = \u73B0\u5728\u7684\u767E\u5206\u6BD4\u3001\u70B9 = \u56DE\u81EA\u52A8\uFF1B\n  //   \u6EDA\u8F6E / \u634F\u5408\u7167\u65E7\u8FDE\u7EED\u3001\u4EE5\u6307\u9488 / \u4E24\u6307\u4E2D\u70B9\u4E3A\u951A\uFF1B\u542C\u6A21\u5F0F\u624B\u6307\u53CC\u51FB = 2 \u500D / \u56DE\u81EA\u52A8\u30021 = \u81EA\u52A8\u5927\u5C0F\uFF08\u540C PDF \u9605\u8BFB\u5668\u7684\u300C\u81EA\u52A8\u7F29\u653E\u300D\uFF1A\u653E\u5F97\u4E0B = \u5DE5\u4F5C\u5927\u5C0F\uFF0C\u653E\u4E0D\u4E0B = \u6309\u5C4F\u5BBD\uFF09\u3002\n  zoomLevel(): number { return this.zoom; }\n  /** \u73B0\u5728\u7684\u7269\u7406\u500D\u6570\uFF081 = \u7EB8\u7684\u5B9E\u9645\u5C3A\u5BF8\uFF09\u3001\u81EA\u52A8\u5927\u5C0F\u6298\u6210\u51E0\u500D\u7269\u7406\u3001\u8BB0\u4F4F\u7684\u90A3\u4E2A\uFF08null = \u81EA\u52A8\uFF09\u3002 */\n  zoomInfo(): { phys: number; auto: number; saved: number | null } { return { phys: this.physOf(this.zoom), auto: this.physOf(1), saved: this.zoomPhys }; }\n  /** \u5F00\u673A\uFF1A\u6309\u8FD9\u53F0\u8BBE\u5907\u8BB0\u4F4F\u7684\u7269\u7406\u500D\u6570\uFF08null = \u81EA\u52A8\uFF09\u6446\u597D\uFF0C\u4E0B\u4E00\u6B21\u6392\u7248\u843D\u5B9E\uFF08\u5BBF\u4E3B\u4ECE device-kv \u8BFB\uFF1B2026-10-21 user\u300C\u7F29\u653E\u8DE8\u4F1A\u8BDD\u8BB0\u4F4F\uFF0C\u6309\u8BBE\u5907\u5B58\u300D\uFF09\u3002 */\n  restoreZoom(phys: number | null): void { this.zoomPhys = phys === null || !Number.isFinite(phys) ? null : Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, phys)); if (this.frameNow) this.syncZoom(); }\n  zoomIn(): void { this.zoomStep(1); }\n  zoomOut(): void { this.zoomStep(-1); }\n  zoomReset(): void { this.setZoom(1, null); }\n  private zoomStep(dir: 1 | -1): void {\n    const ph = this.physOf(this.zoom), eps = 0.01;   // \u6863\u662F\u7269\u7406\u500D\u6570\uFF1A\u4ECE\u81EA\u52A8\uFF08\u4E0D\u5728\u6863\u91CC\uFF09\u5F80\u4E0A / \u5F80\u4E0B = \u6700\u8FD1\u7684\u90A3\u4E00\u6863\n    const next = dir > 0 ? ZOOM_STEPS.find((s) => s > ph + eps) : [...ZOOM_STEPS].reverse().find((s) => s < ph - eps);\n    if (next !== undefined) this.setZoom(this.mulOf(next), null);\n  }\n  /** frame \u53D8\u4E86\uFF08\u7A97\u53E3 / \u5E95\u5EA7 / \u7EB8 / \u5BC6\u5EA6\uFF09\uFF1A\u8BB0\u4F4F\u7684\u7269\u7406\u500D\u6570\u4E0D\u53D8\uFF0C\u4E58\u5728 sheet \u4E0A\u7684\u500D\u6570\u8DDF\u7740\u91CD\u7B97\uFF08\u81EA\u52A8 = 1\uFF09\uFF1B\u8BFB\u6570 / \u9760\u5DE6\u6A2A\u6EDA\u8DDF\u7740\u3002 */\n  private syncZoom(): void {\n    const want = this.zoomPhys === null ? 1 : this.clampMul(this.mulOf(this.zoomPhys));\n    if (Math.abs(want - this.zoom) < 1e-3) return;\n    this.zoom = want; this.sheet.style.zoom = want === 1 ? \"\" : String(want);\n    this.paintZoomUi();\n  }\n  private paintZoomUi(): void {\n    const z = this.zoom;\n    this.el.classList.toggle(\"zoomed\", z !== 1 && this.paperW * z > this.el.clientWidth + 1);   // \u6BD4\u5C4F\u5E55\u5BBD\u4E86\u624D\u9760\u5DE6 + \u6A2A\u7740\u6EDA\uFF08\u7A84\u7684\u7167\u65E7\u5C45\u4E2D\uFF1Bv0.10.30 \u7F29\u5C0F / \u5927\u5C4F\u4E0A\u653E\u5927\u4E00\u70B9\u4E5F\u5C45\u4E2D\uFF09\n    this.zoomBtn.hidden = z === 1;   // \u653E\u5927 / \u7F29\u5C0F\u4E86 = \u9732\u8BFB\u6570\uFF08\u70B9 = \u56DE\u81EA\u52A8\uFF09\n    this.zoomBtn.textContent = `${Math.round(this.physOf(z) * 100)}%`;\n    if (!this.zoomBtn.hidden) { const r = this.el.getBoundingClientRect(); Object.assign(this.zoomBtn.style, { left: `${r.right - 64}px`, top: `${r.top + 8}px` }); }\n  }\n  /** \u8C31\u9762\u677F\u4E2D\u5FC3\u4E0B\u9762\u90A3\u4E2A\u7EB8\u9762\u70B9\uFF08\u952E\u76D8\u7F29\u653E / \u56DE\u81EA\u52A8\u7528\u7684\u951A\uFF1B\u540C PDF \u9605\u8BFB\u5668\uFF1A\u4EE5\u89C6\u53E3\u4E2D\u5FC3\u7F29\u653E\uFF0C\u4E0D\u8DF3\u5230\u5DE6\u4E0A\u89D2\uFF09\u3002 */\n  private centerAnchor(): { x: number; y: number; cx: number; cy: number } {\n    const r = this.el.getBoundingClientRect(), sr = this.sheet.getBoundingClientRect(), z = this.zoom, x = r.left + r.width / 2, y = r.top + r.height / 2;\n    return { x, y, cx: (x - sr.left) / z, cy: (y - sr.top) / z };\n  }\n  private lastTap: { t: number; x: number; y: number } | null = null;\n  /** \u542C\u6A21\u5F0F\u7684\u624B\u6307\u8F7B\u70B9\uFF1A\u662F\u4E0D\u662F\u53CC\u51FB\uFF08\u4E0A\u4E00\u4E0B\u6CA1\u70B9\u4E2D\u63A7\u4EF6\u3001\u9694\u5F97\u8FD1\uFF09= \u653E\u5927 2 \u500D / \u56DE\u81EA\u52A8\uFF0C\u4EE5\u8FD9\u4E00\u70B9\u4E3A\u951A\u3002 */\n  private doubleTapZoom(x: number, y: number): boolean {\n    const now = performance.now(), lt = this.lastTap; this.lastTap = null;\n    if (!lt || now - lt.t > DOUBLE_TAP_MS || Math.hypot(x - lt.x, y - lt.y) > DOUBLE_TAP_PX) return false;\n    const sr = this.sheet.getBoundingClientRect(), z = this.zoom;\n    this.setZoom(z > 1 + 0.02 ? 1 : DOUBLE_TAP_ZOOM, { x, y, cx: (x - sr.left) / z, cy: (y - sr.top) / z });\n    return true;\n  }\n  private pinchStart(): void {\n    const [a, b] = [...this.touches.values()], r = this.sheet.getBoundingClientRect(), z0 = this.zoom, mx = (a.x + b.x) / 2, my = (a.y + b.y) / 2;\n    if (this.pinch?.raf) cancelAnimationFrame(this.pinch.raf);\n    this.pinch = { d0: Math.max(1, Math.hypot(a.x - b.x, a.y - b.y)), z0, sx: (mx - r.left) / z0, sy: (my - r.top) / z0, left: r.left, top: r.top, k: 1, mx, my, raf: 0 };\n    this.sheet.style.transformOrigin = \"0 0\"; this.sheet.style.willChange = \"transform\";\n  }\n  private pinchMove(): void {\n    const pi = this.pinch!, [a, b] = [...this.touches.values()], d = Math.max(1, Math.hypot(a.x - b.x, a.y - b.y));\n    pi.k = this.clampMul(pi.z0 * (d / pi.d0)) / pi.z0; pi.mx = (a.x + b.x) / 2; pi.my = (a.y + b.y) / 2;\n    if (!pi.raf) pi.raf = requestAnimationFrame(() => {   // \u4E00\u5E27\u6700\u591A\u6539\u4E00\u6B21\uFF1B\u4E2D\u70B9\u4E0B\u9762\u90A3\u4E2A\u7EB8\u9762\u70B9\u8DDF\u7740\u4E24\u6307\u8D70 = \u7F29\u653E + \u5E73\u79FB\u4E00\u8D77\n      const q = this.pinch; if (!q) return; q.raf = 0;\n      const tx = q.mx - q.left - q.k * q.z0 * q.sx, ty = q.my - q.top - q.k * q.z0 * q.sy;\n      this.sheet.style.transform = `translate(${tx.toFixed(1)}px, ${ty.toFixed(1)}px) scale(${q.k.toFixed(4)})`;\n    });\n  }\n  private pinchEnd(): void {\n    const pi = this.pinch; if (!pi) return;\n    this.pinch = null; if (pi.raf) cancelAnimationFrame(pi.raf);\n    this.sheet.style.transform = \"\"; this.sheet.style.willChange = \"\"; this.sheet.style.transformOrigin = \"\";\n    this.setZoom(pi.z0 * pi.k, { x: pi.mx, y: pi.my, cx: pi.sx, cy: pi.sy });   // \u843D\u5B9A\uFF1A\u91CD\u6392\u4E00\u6B21\uFF0C\u6EDA\u5230\u8BA9\u90A3\u4E2A\u70B9\u8FD8\u5728\u4E24\u6307\u4E2D\u70B9\u4E0B\u9762\n  }\n  /** \u653E\u5927 / \u7F29\u5C0F\u5230\u500D\u6570 z\uFF081 = \u81EA\u52A8\u5927\u5C0F\uFF1B\u7269\u7406\u500D\u6570 = physOf(z)\uFF0C\u8BB0\u8FDB zoomPhys\u3001\u62A5\u7ED9\u5BBF\u4E3B\u6309\u8BBE\u5907\u5B58\uFF09\uFF1Banchor = \u5C4F\u5E55\u4E0A\u8FD9\u4E2A\u70B9\u4E0B\u9762\u7684\u7EB8\u9762\u70B9\u4FDD\u6301\u4E0D\u52A8\uFF08null = \u4EE5\u8C31\u9762\u677F\u4E2D\u5FC3\u4E3A\u951A\uFF0C\u540C PDF \u9605\u8BFB\u5668\uFF1B2026-10-21 \u4E4B\u524D null = \u8DF3\u56DE\u5DE6\u4E0A\u89D2\uFF09\u3002 */\n  private setZoom(z: number, anchor: { x: number; y: number; cx: number; cy: number } | null): void {\n    z = this.clampMul(z); if (Math.abs(z - 1) < 0.02) z = 1;   // \u56DE\u5230\u81EA\u52A8\u9644\u8FD1 = \u5438\u5230 1\n    const a = anchor ?? this.centerAnchor();\n    const r = this.el.getBoundingClientRect();\n    this.zoom = z; this.sheet.style.zoom = z === 1 ? \"\" : String(z);\n    this.el.classList.toggle(\"zoomed\", z !== 1 && this.paperW * z > this.el.clientWidth + 1);   // \u6BD4\u5C4F\u5E55\u5BBD\u4E86\u624D\u9760\u5DE6 + \u6A2A\u7740\u6EDA\uFF08\u7A84\u7684\u7167\u65E7\u5C45\u4E2D\uFF1Bv0.10.30 \u7F29\u5C0F / \u5927\u5C4F\u4E0A\u653E\u5927\u4E00\u70B9\u4E5F\u5C45\u4E2D\uFF09\n    this.zoomBtn.hidden = z === 1;   // \u653E\u5927 / \u7F29\u5C0F\u4E86 = \u9732\u8BFB\u6570\uFF08\u70B9 = \u56DE\u81EA\u52A8\uFF09\n    this.zoomBtn.textContent = `${Math.round(this.physOf(z) * 100)}%`;\n    this.zoomPhys = z === 1 ? null : this.physOf(z); this.host.onZoom?.(this.zoomPhys);\n    // \u7EB8\u9762\u70B9 (cx, cy)\uFF08\u7EB8\u9762\u5750\u6807\uFF09\u8981\u843D\u5728\u5C4F\u5E55 (x, y) \u4E0B\u9762\uFF1A\u6EDA\u52A8\u5230 \u7EB8\u7684\u4F4D\u7F6E + \u70B9 \u00D7 zoom \u2212 (x \u2212 \u6EDA\u52A8\u533A\u5DE6\u4E0A)\n    const nsr = this.sheet.getBoundingClientRect(), nl = nsr.left - r.left + this.el.scrollLeft, nt = nsr.top - r.top + this.el.scrollTop;\n    this.el.scrollLeft = this.el.classList.contains(\"zoomed\") || this.hscroll ? nl + a.cx * z - (a.x - r.left) : 0;   // \u6CA1\u6BD4\u5C4F\u5E55\u5BBD = \u5C45\u4E2D\uFF0C\u6A2A\u5411\u4E0D\u7528\u5BF9\n    const top = nt + a.cy * z - (a.y - r.top), maxTop = Math.max(0, nt + nsr.height - this.el.clientHeight);\n    // \u6307\u9488 / \u4E24\u6307\u4E0B\u9762\u6709\u5177\u4F53\u7684\u70B9 = \u90A3\u4E2A\u70B9\u9489\u4F4F\uFF08\u77ED\u7684\u7EB8\u4F1A\u501F\u7528\u5E95\u4E0B\u90A3 \u00BE \u5C4F\u7A7A\u767D\uFF0C\u624B\u4E0B\u7684\u4E1C\u897F\u4E0D\u8DD1\uFF09\uFF1B\u56DE\u81EA\u52A8 / \u952E\u76D8\u4E00\u6863\u4E00\u6863\uFF08\u6CA1\u6709\u5177\u4F53\u7684\u70B9\uFF09= \u4EE5\u4E2D\u5FC3\u4E3A\u951A\u4F46\u4E0D\u6EDA\u8FDB\u7A7A\u767D\uFF1A\u7EB8\u6BD4\u7A97\u53E3\u77EE = \u8D34\u9876\uFF08\u540C PDF \u9605\u8BFB\u5668\uFF09\n    this.el.scrollTop = anchor ? top : Math.min(maxTop, Math.max(0, top));\n    if (!this.zoomBtn.hidden) Object.assign(this.zoomBtn.style, { left: `${r.right - 64}px`, top: `${r.top + 8}px` });\n  }\n  /** y \u843D\u5728\u54EA\u6761\u8C31\u884C\uFF08\u884C\u4E0E\u884C\u4E4B\u95F4\u7684\u7A7A\u9699\u5F52\u4E0A\u9762\u90A3\u6761\uFF1B\u90FD\u4E0D\u662F = \u6700\u8FD1\u7684\u4E00\u6761\uFF09\u3002 */\n  private rowAt(y: number): number {\n    const L = this.layout!, rows = L.systems; if (!rows.length) return -1;\n    const i = rows.findIndex((s) => y >= s.top && y < s.bottom);\n    if (i >= 0) return i;\n    let best = 0, bd = Infinity;\n    rows.forEach((s, k) => { const d = y < s.top ? s.top - y : y - s.bottom; if (d < bd) { bd = d; best = k; } });\n    return best;\n  }\n  /** \u5149\u6807\u5230\u8FD9\u6761\u8C31\u884C\u7684 track\uFF08\u70B9\u54EA\u6761\u8C31\u5199\u54EA\u6761\uFF09\u3002 */\n  private focusRow(st: EditorState, row: number, caret?: number): EditorState {\n    const r = this.layout!.systems[row]; if (!r) return st;\n    return setFocus(st, r.paper, r.part, caret);\n  }\n\n  private down(e: PointerEvent): void {\n    if ((e.target as HTMLElement).closest(\".lyric-input, .lyric-merge, .mark-ed, .title-input, .sel-handle\")) return;   // \u5728\u6B4C\u8BCD\u6846 / \u8BB0\u53F7\u6846 / \u628A\u624B\u4E0A\u70B9\uFF1A\u4EA4\u7ED9\u5B83\u4EEC\n    const L = this.layout; if (!L || e.button === 2) return;   // \u53F3\u952E\u5F52 contextmenu\n    const p = this.local(e);\n    // \u5408\u79DF\u53E0\u8D77\u6765\u7684\u90A3\u4E00\u884C = \u53EA\u8BFB\uFF08v0.10.25\uFF0Cuser\u300Chost\u4E5F\u5E94\u8BE5\u53EA\u8BFB\uFF0C\u53EA\u6709\u5C55\u5F00\u65F6\u624D\u80FD\u7F16\u8F91\u300D\uFF09\uFF1A\u8FD9\u4E00\u4E0B\u6309\u300C\u542C\u300D\u7684\u89C4\u77E9\u8D70\uFF08\u6EDA / \u634F\u5408 / \u770B\u8C31\u7684\u8F7B\u70B9 / \u957F\u6309\u5C0F\u83DC\u5355\uFF09\uFF0C\u540D\u5B57\u7167\u6837\u80FD\u70B9\uFF08\u70B9\u540D\u5B57 = \u62C6\u5F00\u6765\u5199\uFF09\n    this.roGesture = this.rules.edit && this.inSharedRow(p.x, p.y) && !L.parts.some((b) => this.inBox(b, p.x, p.y)); if (this.roGesture) this.roAt = { x: p.x, y: p.y };   // \u5148\u7B97\u7EB8\u9762\u5750\u6807\u518D\u62FF\u7126\u70B9\uFF1Afocus \u53EF\u80FD\u8FDE\u5E26\u6EDA\u4E00\u4E0B\uFF08\u5206\u9875\u65F6\u5149\u6807\u90A3\u884C\u5728\u9875\u5916\uFF09\uFF0C\u5750\u6807\u5C31\u9519\u4E86\uFF082026-10-08 E2E \u6293\u5230\uFF09\n    // \u7B14 / \u9F20\u6807\uFF1A\u70B9\u8C31\u9762 = \u952E\u76D8\u56DE\u5230\u8C31\u4E0A\uFF08\u4E0B\u9762 preventDefault \u4F1A\u62E6\u6389\u6D4F\u89C8\u5668\u9ED8\u8BA4\u7684\u62A2\u7126\u70B9\uFF09\u3002\u624B\u6307\uFF1A\u6309\u4E0B\u5148\u4E0D\u62A2\u2014\u2014\u62D6 = \u6EDA\u52A8\uFF0C\u6B4C\u8BCD\u6846\u5F00\u7740\u65F6\u6EDA\u8C31\u4E0D\u8BE5\u628A\u5B83\u6536\u6389\u3001\n    //   \u628A\u7CFB\u7EDF\u952E\u76D8\u6536\u56DE\u53BB\uFF08\u6536\u952E\u76D8 \u2192 \u8C31\u9762\u53D8\u9AD8 \u2192 \u8DDF\u968F\u5149\u6807\u53C8\u628A\u89C6\u56FE\u62FD\u56DE\u53BB = \u767D\u6EDA\uFF1Buser 2026-10-08\u300C\u6BCF\u6B21\u6253\u65E5\u6587\u8FD8\u662F\u8DDF\u516B\u5E74\u6297\u6218\u4E00\u6837\u2026\u6B4C\u8BCD\u8F93\u5165\u6A21\u5F0F\u6EDA\u52A8\u4F1A\u5BFC\u81F4\u952E\u76D8\u5F39\u56DE\u6765\uFF0C\u7136\u540E\u767D\u6EDA\u300D\uFF09\uFF1B\n    //   \u8F7B\u70B9\uFF08up\uFF09/ \u957F\u6309\uFF08longPress\uFF09\u624D\u62A2\n    if (!this.rules.edit || this.roGesture) {   // \u542C\u6A21\u5F0F / \u5408\u79DF\u53E0\u8D77\u6765\u7684\u90A3\u4E00\u884C\uFF1A\u53EA\u6321\u5199\u8C31\u3002\u624B\u6307\u7167\u6837\u80FD\u6EDA / \u634F\u5408\uFF1B\u8F7B\u70B9 = \u770B\u8C31\u7684\u90A3\u4E9B\uFF08\u6B4C\u624B\u724C / \u7FFB\u7EB8 / \u672C\u6BB5\u2026\uFF09\uFF0C\u4E0D\u8DF3\u64AD\uFF1B\u957F\u6309 = \u5C0F\u83DC\u5355\uFF08\u4ECE\u8FD9\u513F\u653E\u2026\uFF09\n      if (e.pointerType === \"touch\") {\n        this.touches.set(e.pointerId, { x: e.clientX, y: e.clientY }); this.el.setPointerCapture(e.pointerId);\n        if (this.touches.size === 2) { this.finger = null; this.cancelPress(); this.pinchStart(); return; }\n        if (this.touches.size > 2) return;\n        this.finger = { pid: e.pointerId, y0: e.clientY, top0: this.el.scrollTop, x: p.x, y: p.y, moved: false, shift: false, x0: e.clientX, left0: this.el.scrollLeft };\n        this.armPress(e, p, null);\n        return;\n      }\n      e.preventDefault(); this.el.setPointerCapture(e.pointerId);\n      this.lockTap = { pid: e.pointerId, x: p.x, y: p.y, moved: false };\n      this.armPress(e, p, null);\n      return;\n    }\n    if (e.pointerType !== \"touch\") this.el.focus({ preventScroll: true });\n    if (e.pointerType === \"touch\") {   // \u624B\u6307\uFF1A\u62D6 = \u6EDA\u52A8\uFF1B\u4E0D\u52A8 = \u8F7B\u70B9\uFF1B\u6309\u4F4F\u4E0D\u52A8 = \u957F\u6309\u9009\u533A\uFF1B\u7B2C\u4E8C\u6839\u624B\u6307\u843D\u4E0B = \u634F\u5408\u7F29\u653E / \u53CC\u6307\u5E73\u79FB\n      this.touches.set(e.pointerId, { x: e.clientX, y: e.clientY });\n      this.el.setPointerCapture(e.pointerId);\n      if (this.touches.size === 2) {\n        this.finger = null; this.cancelPress();\n        this.pinchStart();\n        return;\n      }\n      if (this.touches.size > 2) return;\n      this.finger = { pid: e.pointerId, y0: e.clientY, top0: this.el.scrollTop, x: p.x, y: p.y, moved: false, shift: e.shiftKey, x0: e.clientX, left0: this.el.scrollLeft };\n      const grab = this.grabAt(p.x, p.y, true);   // \u6309\u5728\u5B57 / \u529B\u5EA6\u8BB0\u53F7\u4E0A\uFF1A\u957F\u6309 = \u62FF\u8D77\u6765\u62D6\uFF08\u4E4B\u524D\u52A8\u4E86\u7167\u65E7\u662F\u6EDA\u52A8\uFF09\n      this.armPress(e, p, grab ? null : this.noteAt(p.x, p.y, true), grab);   // \u624B\u6307\uFF1A\u6309\u6307\u5C16\u5927\u5C0F\u627E\u97F3\n      return;\n    }\n    e.preventDefault();\n    const grab = this.grabAt(p.x, p.y, false);\n    if (grab) {   // \u7B14 / \u9F20\u6807\u6309\u5728\u5B57 / \u529B\u5EA6\u8BB0\u53F7\u4E0A\uFF1A\u52A8\u4E86 = \u76F4\u63A5\u62D6\uFF08\u540C\u62D6\u97F3\uFF09\uFF1B\u539F\u5730\u677E\u624B = \u8F7B\u70B9\uFF08\u6B4C\u8BCD\u6846 / \u5C0F\u83DC\u5355\uFF09\uFF1B\u6309\u4F4F\u4E0D\u52A8\u5230\u70B9 = \u62FF\u8D77\u6765\n      this.el.setPointerCapture(e.pointerId);\n      this.armPress(e, p, null, grab);\n      return;\n    }\n    if (this.tap(p.x, p.y, e.shiftKey, e.pointerId)) return;   // \u8BB0\u53F7 / \u6B4C\u8BCD\u884C / \u7EB8\u4E0A\u7684\u5C0F\u94AE\uFF08\u4E0D\u542B\u97F3\u7B26\uFF09\n    const hit = this.noteAt(p.x, p.y);\n    if (hit) {   // \u7B14 / \u9F20\u6807\u6309\u5728\u97F3\u4E0A\uFF1A\u6309\u4F4F\u5C31\u54CD\uFF1B0.42 s \u5185\u52A8\u4E86 = \u62D6\uFF08\u6539\u97F3\u9AD8 / \u65F6\u503C\uFF09\uFF1B\u4E0D\u52A8\u5230\u70B9 = \u957F\u6309\u9009\u4E2D\uFF1B\u62AC\u624B\u4E0D\u52A8 = \u8F7B\u70B9\uFF08\u5149\u6807\u5230\u5B83\u540E\u9762\uFF09\n      this.host.focus?.(\"staff\");\n      const st0 = this.host.get();\n      if (!this.onTrack(hit)) this.host.set(this.focusRow(st0, hit.system, hit.index + 1));\n      const t = tr(this.host.get())[hit.index] as NoteTok;\n      if (this.rules.noteDrag) this.drag = { index: hit.index, d0: hit.d, dur0: t.dur, x0: p.x, y0: p.y, axis: \"\", pid: e.pointerId, heard: hit.d, ...(e.pointerType === \"mouse\" ? { wait: true } : {}) };   // \u62D6\u97F3 = \u53EA\u5728\u300C\u97F3\u300D\u91CC\uFF1B\u9F20\u6807\u8981\u5148\u957F\u6309\n      this.el.setPointerCapture(e.pointerId);   // \u6309\u4E0B\u4E0D\u54CD\uFF08\u8F7B\u70B9 = \u5149\u6807\uFF0C\u4E0D\u9884\u89C8\uFF1Buser 2026-10-08\u300C\u5149\u6807\u70B9\u9009\u4E0D\u6807\u84DD\u97F3\u7684\u8BDD\u90A3\u4E48\u4E5F\u4E0D\u7528 preview \u5427\u300D\uFF09\uFF1B\u5F00\u59CB\u62D6\u97F3\u9AD8\u624D\u54CD\n      this.armPress(e, p, hit);\n      return;\n    }\n    // \u7A7A\u767D\u5904\uFF1A\u5148\u4E0D\u653E\u5149\u6807\u2014\u2014\u62D6\u4E86\u5C31\u662F\u6846\u9009\uFF0C\u6CA1\u62D6\uFF08\u677E\u5F00\uFF09\u624D\u653E\u5149\u6807\n    this.box = { pid: e.pointerId, x0: p.x, y0: p.y, moved: false, st0: this.host.get(), row: this.rowAt(p.y) };\n    this.el.setPointerCapture(e.pointerId);\n    this.armPress(e, p, null);\n  }\n  /** \u6309\u4E0B\uFF1A\u5F00\u957F\u6309\u8BA1\u65F6\uFF080.42 s \u4E0D\u52A8 = \u957F\u6309\uFF09\u3002 */\n  private armPress(e: PointerEvent, p: { x: number; y: number }, hit: HitNote | null, grab: Grab | null = null): void {\n    this.cancelPress();\n    const pr = { pid: e.pointerId, type: e.pointerType, x: p.x, y: p.y, cx: e.clientX, cy: e.clientY, hit, grab, timer: 0, shift: e.shiftKey, moved: false, fired: false };\n    pr.timer = window.setTimeout(() => this.longPress(), 420);\n    this.press = pr;\n  }\n  private cancelPress(): void { if (this.press) { clearTimeout(this.press.timer); this.press = null; } this.selDrag = null; }\n  /** \u957F\u6309\u5230\u70B9\uFF1A\u6309\u5728\u97F3\u4E0A = \u9009\u4E2D\u5B83\u3001\u8FDB\u9009\u533A\u6001\uFF08\u4E0D\u62AC\u624B\u63A5\u7740\u62D6 = \u6269\u9009\uFF09\uFF1B\u7A7A\u767D\u5904 = \u5149\u6807\u653E\u5230\u90A3\u91CC + \u5C0F\u83DC\u5355\uFF08\u7C98\u8D34 / \u63D2\u8BB0\u53F7 / \u5168\u9009\u2026\uFF1Buser 2026-10-08\u300C\u7A7A\u767D\u957F\u6309\u53EF\u4EE5\u9ECF\u8D34\u6216\u8005\u7C7B\u4F3C\u7684\u53F3\u952E\u4E0A\u4E0B\u6587\u83DC\u5355\u300D\uFF09\u3002 */\n  private longPress(): void {\n    const pr = this.press; if (!pr || pr.moved) return;\n    pr.fired = true;\n    if (!this.rules.edit || this.roGesture) { this.finger = null; this.lockTap = null; this.listenMenu(pr.x, pr.y, pr.cx, pr.cy); return; }   // \u542C\u6A21\u5F0F / \u5408\u79DF\u53E0\u8D77\u6765\u7684\u90A3\u4E00\u884C\uFF1A\u957F\u6309 = \u5C0F\u83DC\u5355\n    if (pr.type === \"touch\") this.el.focus({ preventScroll: true });   // \u624B\u6307\u6309\u4E0B\u65F6\u6CA1\u62A2\u7126\u70B9\uFF08\u89C1 down\uFF09\uFF0C\u957F\u6309\u5230\u70B9\u624D\u62A2\n    if (pr.grab) { this.startLift(pr.grab, pr.pid, pr.x, pr.y, pr.cx, pr.cy, pr.type === \"touch\"); return; }\n    if (!pr.hit) { this.blankPress(pr.x, pr.y, pr.cx, pr.cy); return; }\n    const cur = this.host.get().sel;\n    if (cur && this.onTrack(pr.hit) && pr.hit.index >= cur.from && pr.hit.index < cur.to) {   // \u957F\u6309\u5DF2\u7ECF\u9009\u4E2D\u7684\u97F3\uFF1A\u4E0D\u62AC\u624B\u62D6 = \u7167\u5E38\u4ECE\u5B83\u6269\u9009\uFF1B\u539F\u5730\u62AC\u624B = \u9009\u533A\u83DC\u5355\uFF08\u4E0D\u91CD\u9009\uFF09\n      this.finger = null; if (this.drag) { this.host.release?.(); this.drag = null; }\n      this.selDrag = { pid: pr.pid, anchor: pr.hit.index, menu: true };\n      this.host.audition?.(pr.hit.index, true); this.holdPid = pr.pid; return;   // \u6309\u4F4F\u5DF2\u9009\u4E2D\u7684\u97F3\u4E5F\u542C\u89C1\u5B83\n    }\n    if (this.drag?.wait) {   // \u9F20\u6807\u957F\u6309\u5230\u70B9 = \u62FF\u8D77\u6765\uFF1A\u63A5\u7740\u62D6 = \u6539\u97F3\u9AD8 / \u65F6\u503C\uFF1B\u539F\u5730\u677E\u624B = \u9009\u4E2D\u5B83\uFF08up \u91CC\uFF09\n      this.drag.wait = false; this.host.audition?.(pr.hit.index, true); this.holdPid = pr.pid; return;\n    }\n    this.selectHeld(pr.pid, pr.hit);\n  }\n  /** \u957F\u6309\u9009\u4E2D\u6309\u7740\u7684\u90A3\u4E2A\u97F3\uFF08\u4E0D\u62AC\u624B\u63A5\u7740\u62D6 = \u6269\u9009\uFF09\u3002 */\n  private selectHeld(pid: number, hit: HitNote): void {\n    this.lyrics.commitAndClose(); this.marks.commitAndClose();\n    this.finger = null;   // \u624B\u6307\uFF1A\u957F\u6309\u4E4B\u540E\u4E0D\u518D\u5F53\u6EDA\u52A8\n    if (this.drag) { this.host.release?.(); this.drag = null; }   // \u7B14\uFF1A\u6309\u4F4F\u51FA\u58F0\u5230\u6B64\u4E3A\u6B62\n    const st0 = this.host.get(), st = this.onTrack(hit) ? st0 : this.focusRow(st0, hit.system);\n    this.host.set(select(st, hit.index, hit.index + 1));\n    this.selDrag = { pid, anchor: hit.index };\n    this.host.focus?.(\"staff\");\n    this.host.audition?.(hit.index, true); this.holdPid = pid;   // \u6309\u4F4F\u97F3 = \u542C\u89C1\u5B83\uFF082026-10-10 user\u300C\u6309\u4F4F\u97F3\u7684\u65F6\u5019\u5E94\u8BE5\u80FD\u542C\u5230preview\u300D\uFF09\uFF0C\u62AC\u624B\u505C\n  }\n  /** \u70B9\u5728\u53E0\u8D77\u6765\u7684\u90A3\u4E00\u884C\u4E0A\uFF1A\u5149\u6807\u53BB\u8FD9\u4E00\u5BB6\u5728\u8FD9\u4E00\u884C\u7684\u90A3\u4F4D\uFF08\u4E3B\u4EBA / \u5728\u573A\u6253\u5934\u7684\u90A3\u4F4D\uFF09\uFF0C\u843D\u5728\u70B9\u7684\u90A3\u4E2A\u65F6\u523B\uFF08\u70B9\u5728\u97F3\u4E0A = \u5B83\u540E\u9762\uFF0C\u540C\u5E73\u5E38\u70B9\u97F3\uFF09\u2192 \u6574\u5BB6\u62C6\u5F00\u3002 */\n  private expandFamilyAt(x: number, y: number): void {\n    const L = this.layout; if (!L) return;\n    const row = this.rowAt(y); if (row < 0) return;\n    const r = L.systems[row], hit = this.noteAt(x, y, true);\n    let caret: number;\n    if (hit && L.systems[hit.system]?.paper === r.paper) caret = this.realIndex(r.paper, hit.part ?? L.systems[hit.system].part, hit.index) + 1;\n    else { const c = this.caretAt(x, y); caret = this.realIndex(c.at.paper, c.at.part, c.caret); }\n    this.holdView = true; this.host.set(setFocus(this.host.get(), r.paper, realPart(r.part), caret)); this.holdView = false;\n    this.heldBase = this.baseKey();\n  }\n  /** \u5408\u79DF\u5C55\u5F00\u7740\u7684\u4E00\u5BB6\u5DE6\u8FB9\u90A3\u6761\u62EC\u53F7\uFF08v0.10.29\uFF09\uFF1A\u70B9 = \u5149\u6807\u632A\u5230\u8FD9\u4E00\u5BB6\u540E\u9762\u7D27\u6328\u7740\u7684\u90A3\u4F4D\uFF08\u4E0D\u5728\u4EFB\u4F55\u4E00\u5BB6\u91CC\u7684\uFF1B\u540E\u9762\u6CA1\u6709 = \u524D\u9762\u6700\u8FD1\u7684\u90A3\u4F4D\uFF09\u2192 \u8FD9\u4E00\u5BB6\u53E0\u56DE\u53BB\u3002\n   *  user\u300C\u628A\u8FD9\u4E00\u5BB6\u7684\u51E0\u884C\u62EC\u5728\u4E00\u8D77\u2026\u70B9\u8FD9\u6761\u62EC\u53F7\u7B49\u4E8E\u300C\u5149\u6807\u632A\u5230\u8FD9\u4E00\u5BB6\u540E\u9762\u7D27\u6328\u7740\u7684\u90A3\u4F4D\u300D\u2026\u53EF\u4EE5\u300D\u3002\u89C6\u56FE\u4E0D\u8DDF\u8FC7\u53BB\uFF08\u540C\u70B9\u540D\u5B57\uFF09\u3002 */\n  private leaveFamilyAt(x: number, y: number): boolean {\n    const L = this.layout; if (!L || !this.rules.edit) return false;\n    const fb = L.families.find((b) => this.inBox(b, x, y)); if (!fb) return false;\n    const song = this.host.get().song, hostOf = (id: string) => song.parts.find((p) => p.id === id)?.host;\n    const inFam = (id: string) => id === fb.host || hostOf(id) === fb.host, loose = (id: string) => !hostOf(id) && !song.parts.some((p) => p.host === id);\n    const order = [...new Set(L.systems.filter((r) => r.paper === fb.paper).map((r) => realPart(r.part)))], idx = order.map((id, i) => (inFam(id) ? i : -1)).filter((i) => i >= 0);\n    const first = Math.min(...idx), last = Math.max(...idx);   // \u4E3B\u4EBA\u53EF\u80FD\u4E0D\u5728\u8FD9\u5F20\u7EB8\u4E0A\uFF1A\u6309\u8FD9\u4E00\u5BB6\u5728\u573A\u7684\u5934\u5C3E\u7B97\n    const next = order.slice(last + 1).find(loose) ?? [...order.slice(0, first)].reverse().find(loose) ?? order.slice(last + 1)[0] ?? null;\n    if (!next) { this.host.notice?.(\"\u8FD9\u5F20\u7EB8\u4E0A\u53EA\u6709\u8FD9\u4E00\u5BB6\uFF1A\u6CA1\u6709\u522B\u7684\u6B4C\u624B\u53EF\u4EE5\u632A\u8FC7\u53BB\uFF08\u5207\u5230\u300C\u542C\u300D\u5C31\u90FD\u53E0\u8D77\u6765\uFF09\"); return true; }\n    this.holdView = true; this.host.set(setFocus(this.host.get(), fb.paper, next)); this.holdView = false;\n    this.heldBase = this.baseKey();\n    return true;\n  }\n  /** \u6B4C\u624B\u724C\uFF08\u6BCF\u5F20\u7EB8\u7B2C\u4E00\u884C\u5404\u6761\u8C31\u5DE6\u8FB9\u7684\u58F0\u90E8\u540D\uFF09\uFF1A\u5F00\u8F68\u7684\u5C0F\u5361\u2014\u2014\u5149\u6807\u6362\u5230\u90A3\u6761\uFF08setFocus \u653E\u5728\u90A3\u6761\u7684\u6700\u540E\uFF09\uFF0C\u4F46\u89C6\u56FE\u4E0D\u8DDF\u8FC7\u53BB\n   *  \uFF08user 2026-10-08\u300C\u6309vocal\u5B57\u5F39track\u7A97\u7684\u65F6\u5019\u9875\u9762\u6EDA\u52A8\u4F1A\u4E71\u300D\uFF09\u3002\u5DE6\u952E / \u53F3\u952E\uFF082026-10-10 user\u300C\u53F3\u952E\u6B4C\u624B\u540D\u5E94\u8BE5\u4E5F\u662F\u5F39\u6B4C\u624B\u9009\u9879\uFF0C\u548C\u5DE6\u952E\u4E00\u6837\u300D\uFF09/ \u542C\u6A21\u5F0F\u90FD\u8D70\u8FD9\u91CC\u3002 */\n  private openPartAt(x: number, y: number): boolean {\n    const L = this.layout; if (!L) return false;\n    const pt = L.parts.find((b) => this.inBox(b, x, y)); if (!pt) return false;\n    const at = this.clientBox(pt); this.holdView = true; this.host.set(setFocus(this.host.get(), pt.paper, pt.part)); this.holdView = false;\n    this.heldBase = this.baseKey();   // \u672C\u6765\u5C31\u5728\u8FD9\u6761\uFF08\u6CA1\u91CD\u753B\uFF09\u4E5F\u4E00\u6837\uFF1A\u63A5\u4E0B\u6765 pad \u5F39\u51FA\u4E5F\u4E0D\u62FD\n    this.host.onPart?.(pt.paper, pt.part, at); return true;\n  }\n  /** \u8FD9\u6761\u58F0\u90E8\u53F0\u4E0A\u90A3\u4F4D\u4E0D\u5531\u5B57\uFF1F\u662F = \u8BF4\u4E00\u6B21\u4E3A\u4EC0\u4E48\uFF08\u540C\u4E00\u4F4D\u6B4C\u624B\u53EA\u8BF4\u4E00\u6B21\uFF0C\u6362\u4E86\u518D\u8BF4\uFF09\u3002 */\n  private noLyricsSaid = \"\";\n  private noLyricsHere(part: string): boolean {\n    const why = this.host.parts().find((p) => p.id === part)?.noLyrics; if (!why) return false;\n    if (this.noLyricsSaid !== why) { this.noLyricsSaid = why; this.host.notice?.(why); }\n    return true;\n  }\n  /** \u300C\u8BCD\u300D\u91CC\u70B9\u4E86\u4E00\u4E2A\u97F3\uFF1A\u5F00\u5B83\u7684\u6B4C\u8BCD\u6846\uFF08\u4F11\u6B62\u6CA1\u6709\u6B4C\u8BCD = false\uFF0C\u7167\u5E38\u653E\u5149\u6807\uFF09\u3002 */\n  private openLyricOn(hit: HitNote): boolean {\n    const L = this.layout, row = L?.systems[hit.system]; if (!L || !row) return false;\n    const t = trackOf(this.host.get().song, row.paper, row.part)[hit.index]; if (t?.kind !== \"note\") return false;\n    if (!t.lyric && this.noLyricsHere(row.part)) return false;   // \u4E0D\u5531\u5B57\u7684\u58F0\u90E8\uFF1A\u7A7A\u7740\u7684\u4E0D\u5F00\u6846\uFF08\u7167\u5E38\u653E\u5149\u6807\uFF09\n    this.host.set(this.focusRow(this.host.get(), hit.system, this.host.get().caret)); this.lyrics.openAt(hit.index); this.host.focus?.(\"text\");\n    return true;\n  }\n  /** \u542C\u6A21\u5F0F\u7684\u957F\u6309 / \u53F3\u952E\uFF1A\u70B9\u5728\u97F3 / \u4F11\u6B62\u4E0A = \u5B83\uFF1B\u7A7A\u767D = \u90A3\u4E00\u884C\u5149\u6807\u4F1A\u843D\u7684\u4F4D\u7F6E\u3002\u4E0D\u6539\u5149\u6807\u3001\u4E0D\u6539\u8C31\uFF0C\u53EA\u544A\u8BC9\u5BBF\u4E3B\u5F00\u5C0F\u83DC\u5355\u3002 */\n  private listenMenu(x: number, y: number, cx: number, cy: number): void {\n    const L = this.layout; if (!L) return;\n    const hit = this.noteAt(x, y, true), r = hit ? L.systems[hit.system] : null;\n    if (hit && r) { const id = hit.part ?? r.part, i = this.realIndex(r.paper, id, hit.index); this.host.onListenMenu?.({ x: cx, y: cy }, { paper: r.paper, part: realPart(id), index: i, caret: i, tick: this.tickIn(r.paper, id, hit.index) }); return; }\n    const s = this.caretAt(x, y);\n    this.host.onListenMenu?.({ x: cx, y: cy }, { paper: s.at.paper, part: realPart(s.at.part), index: null, caret: this.realIndex(s.at.paper, s.at.part, s.caret), tick: this.tickIn(s.at.paper, s.at.part, s.caret) + (s.lead ?? 0) });   // \u8865\u9F50\u7684\u6DE1\u8272\u5C0F\u8282\uFF1A\u5149\u6807\u5728\u5C3E\u5DF4 + lead\n  }\n  /** \u8FD9\u6761 track\uFF08\u771F\u7684 / \u5408\u79DF\u865A\u62DF\u7684\u90A3\u51E0\u6761\uFF09\u7B2C i \u4E2A\u4E4B\u524D\u4E00\u5171\u591A\u5C11 tick\u3002 */\n  private tickIn(paperId: string, part: string, i: number): number {\n    const v = this.layout?.virtual[`${paperId}:${part}`] ?? this.host.get().song.papers.find((x) => x.id === paperId)?.tracks[realPart(part)] ?? [];\n    let t = 0; for (let k = 0; k < Math.min(i, v.length); k++) { const x = v[k]; if (isTimed(x)) t += x.dur; }\n    return t;\n  }\n  /** \u5408\u79DF\u53E0\u8D77\u6765\u7684\u90A3\u4E00\u884C\uFF08v0.10.28\uFF09\uFF1A\u70B9\u51FB\u533A\u7684\u4E0B\u6807\u6307\u865A\u62DF track\uFF08\u4E3B\u4EBA\u90A3\u6761 / `\u4E3B\u4EBA~lo` / `\u2026~v2`\uFF09 \u2192 \u6362\u6210\u4E3B\u4EBA\u81EA\u5DF1 track \u91CC\u540C\u4E00\u65F6\u523B\u7684\u90A3\u4E2A\u4E0B\u6807\uFF08\u6309 tick \u5BF9\uFF09\u3002\u4E0D\u662F\u53E0\u8D77\u6765\u7684 = \u539F\u6837\u3002 */\n  private realIndex(paperId: string, part: string, i: number): number {\n    const v = this.layout?.virtual[`${paperId}:${part}`]; if (!v) return i;\n    let tick = 0; for (let k = 0; k < Math.min(i, v.length); k++) { const t = v[k]; if (isTimed(t)) tick += t.dur; }\n    const real = this.host.get().song.papers.find((x) => x.id === paperId)?.tracks[realPart(part)] ?? [];\n    let t = 0; for (let k = 0; k < real.length; k++) { const x = real[k]; if (!isTimed(x)) continue; if (t + x.dur > tick) return k; t += x.dur; }\n    return real.length;\n  }\n  /** \u7A7A\u767D\u5904\u957F\u6309 / \u53F3\u952E\uFF1A\u6536\u8D77\u7F16\u8F91\u6846\u3001\u5149\u6807\u653E\u5230\u90A3\u91CC\uFF08\u540C\u8F7B\u70B9\u7A7A\u767D\uFF09\uFF0C\u518D\u544A\u8BC9\u5BBF\u4E3B\u5F00\u5C0F\u83DC\u5355\u3002row = \u8FD9\u4E00\u884C\u91CC\u5149\u6807\u6240\u5728 track \u7684\u97F3\u7684\u4E0B\u6807\u8303\u56F4\u3002 */\n  private blankPress(x: number, y: number, cx: number, cy: number): void {\n    this.lyrics.commitAndClose(); this.marks.commitAndClose();\n    this.finger = null; this.box = null; this.boxEl.hidden = true;\n    if (this.drag) { this.host.release?.(); this.drag = null; }\n    this.placeCaretAt(x, y);\n    const L = this.layout!, row = this.rowAt(y), mine = this.hits.filter((n) => n.system === row && this.onTrack(n));\n    const range = mine.length ? { from: Math.min(...mine.map((n) => n.index)), to: Math.max(...mine.map((n) => n.index)) + 1 } : null;\n    this.host.focus?.(\"staff\");\n    this.host.onBlankPress?.({ x: cx, y: cy }, range);\n  }\n  /** \u6309\u5728\u80FD\u62FF\u8D77\u6765\u62D6\u7684\u4E1C\u897F\u4E0A\uFF1A\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\uFF08\u5728\u5B83\u7684\u6846\u91CC\uFF09\u5148\uFF1B\u6B4C\u8BCD\u7684\u5B57\uFF08\u4E0D\u5728\u97F3\u4E0A\u65F6\uFF0C\u540C\u8F7B\u70B9\u7684\u5224\u6CD5\uFF09\u3002\u8BB0\u53F7\u6846\u5F00\u7740 = \u8FD9\u4E00\u4E0B\u662F\u6536\u6846\uFF0C\u4E0D\u62FF\u3002 */\n  private grabAt(x: number, y: number, finger: boolean): Grab | null {\n    if (!this.layout || this.marks.open) return null;\n    const dh = this.rules.symbols ? this.dynHitAt(x, y, finger) : null;   // \u8BB0\u53F7\u53EA\u5728\u300C\u7B26\u300D\u91CC\u62FF\u5F97\u8D77\u6765\n    if (dh) return { kind: \"mark\", index: dh.index, system: dh.system };\n    if (!this.rules.lyrics || this.noteAt(x, y)) return null;             // \u5B57\u53EA\u5728\u300C\u8BCD\u300D\u91CC\u62FF\u5F97\u8D77\u6765\n    const ly = this.lyricAt(x, y), row = ly ? this.layout.systems[ly.system] : null;\n    if (!ly || !row) return null;\n    const t = trackOf(this.host.get().song, row.paper, row.part)[ly.index];   // \u53EA\u62FF\u6709\u5B57\u7684\uFF08\u7A7A\u7740\u7684\u6B4C\u8BCD\u4F4D / \u62D6\u8154 = \u7167\u65E7\uFF1A\u8F7B\u70B9\u5F00\u6B4C\u8BCD\u6846\uFF0C\u957F\u6309 = \u7A7A\u767D\u5904\u7684\u5C0F\u83DC\u5355\uFF09\n    return t?.kind === \"note\" && t.lyric && t.lyric !== MELISMA_MARK ? { kind: \"lyric\", index: ly.index, system: ly.system } : null;\n  }\n  /** \u6B4C\u8BCD\u90A3\u4E00\u884C\u4E0A\u70B9\u4E2D\u7684\u5B57\uFF1A\u6309\u6BCF\u4E00\u884C\u81EA\u5DF1\u7684\u6B4C\u8BCD\u57FA\u7EBF\u627E\uFF08\u6CA1\u5199\u6B4C\u8BCD\u7684\u884C\u6BD4\u6B4C\u8BCD\u57FA\u7EBF\u77EE\uFF0C\u5149\u770B rowAt \u4F1A\u843D\u5230\u4E0B\u4E00\u884C\u2014\u20142026-10-08 E2E \u6293\u5230\uFF09\u3002\n   *  \u547D\u4E2D\u5E26\u5F80\u4E0B\u653E\u5BBD\u4E00\u70B9\uFF1A\u624B\u6307\u70B9\u5728\u5B57\u4E0B\u9762\u4E5F\u7B97\uFF1B\u79BB\u6700\u8FD1\u7684\u5B57 4 \u4E2A\u95F4\u8DDD\u4EE5\u5185\u3002 */\n  private lyricAt(x: number, y: number): LyricHit | null {\n    const L = this.layout!, sp = L.sp;\n    for (let r = 0; r < L.systems.length; r++) {\n      const ly = L.lyricY(r);\n      if (!(y > ly - sp * 2.2 && y < ly + sp * 2.4)) continue;\n      const cands = L.lyrics.filter((h) => h.system === r);\n      if (!cands.length) return null;\n      const best = cands.reduce((a, b) => (Math.abs(b.x - x) < Math.abs(a.x - x) ? b : a));\n      return Math.abs(best.x - x) < sp * 4 ? best : null;\n    }\n    return null;\n  }\n  /** \u70B9\u4E2D\u7684\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\uFF08\u624B\u6307\u653E\u5BBD\u51E0\u4E2A\u50CF\u7D20\uFF09\u3002 */\n  private dynHitAt(x: number, y: number, finger: boolean): DynHit | null {\n    const L = this.layout; if (!L) return null;\n    const pad = finger ? 6 / this.zoom : 0;\n    return L.dyns.find((b) => x >= b.x - pad && x <= b.x + b.w + pad && y >= b.y - pad && y <= b.y + b.h + pad) ?? null;\n  }\n  /** \u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\u7684\u5C0F\u83DC\u5355\uFF1A\u5148\u628A\u5149\u6807\u6362\u5230\u90A3\u6761 track\uFF0C\u518D\u544A\u8BC9\u5BBF\u4E3B\uFF08\u5F00\u5728\u8BB0\u53F7\u4E0B\u9762\uFF09\u3002 */\n  private markMenu(h: DynHit): void {\n    if (!this.onTrack(h)) this.host.set(this.focusRow(this.host.get(), h.system, this.host.get().caret));\n    const b = this.clientBox(h);\n    this.host.focus?.(\"staff\");\n    this.host.onMarkPress?.(h.index, { x: (b.left + b.right) / 2, y: b.bottom });\n  }\n  /** \u62FF\u8D77\u6765\uFF08\u957F\u6309\u5230\u70B9 / \u7B14\u9F20\u6807\u6309\u4F4F\u52A8\u4E86\uFF09\uFF1A\u6536\u8D77\u7F16\u8F91\u6846\u3001\u505C\u6389\u6EDA\u52A8\uFF0C\u8BB0\u4E0B\u8FD9\u6761 track \u4E0A\u80FD\u843D\u7684\u97F3\u3002\u7F16\u8F91\u6846\u6536\u8D77\u65F6\u53EF\u80FD\u6539\u4E86\u8C31\uFF08\u8D34\u5B57 / \u63D2\u53E5\u53F7\uFF09= \u6309\u539F\u4F4D\u7F6E\u91CD\u65B0\u627E\u4E00\u6B21\u3002 */\n  private startLift(grab0: Grab, pid: number, x: number, y: number, cx: number, cy: number, finger: boolean): void {\n    const hadEditor = this.lyrics.open || this.marks.open;\n    this.lyrics.commitAndClose(); this.marks.commitAndClose();\n    this.finger = null; this.box = null; this.boxEl.hidden = true;\n    if (this.drag) { this.host.release?.(); this.drag = null; }\n    const grab = hadEditor ? this.grabAt(x, y, finger) : grab0;\n    if (!grab || !this.layout) return;\n    if (!this.onTrack(grab)) this.host.set(this.focusRow(this.host.get(), grab.system));\n    const L = this.layout, st0 = this.host.get(), toks = tr(st0), seen = new Set<number>();\n    // \u843D\u70B9\uFF1A\u6B4C\u8BCD = \u80FD\u653E\u5B57\u7684\u97F3\uFF1B\u8BB0\u53F7 = \u97F3\u548C\u4F11\u6B62\uFF08user 2026-10-08\u300C\u529B\u5EA6\u7B26\u53F7\u5E94\u8BE5\u80FD\u62D6\u52A8\u5230\u4F11\u6B62\u7B26\u4E0A\u300D\uFF09\n    const spots = [...L.notes.map((n) => ({ ...n, rest: false })), ...(grab.kind === \"mark\" ? L.rests.map((r) => ({ ...r, rest: true })) : [])];\n    const targets = spots.filter((n) => this.onTrack(n) && (grab.kind === \"mark\" || lyricSlot(toks[n.index])) && !seen.has(n.index) && (seen.add(n.index), true))\n      .map((n) => ({ idx: n.index, x: grab.kind === \"lyric\" ? n.x + n.w / 2 : n.x, system: n.system })).sort((a, b) => a.idx - b.idx);\n    let src: number;\n    if (grab.kind === \"lyric\") src = targets.findIndex((t) => t.idx === grab.index);\n    else { let a = grab.index + 1; while (a < toks.length && toks[a].kind !== \"note\" && toks[a].kind !== \"rest\") a++; src = targets.findIndex((t) => t.idx >= a); }\n    if (grab.kind === \"lyric\" && src < 0) return;\n    this.lift = { pid, grab, st0, targets, src, cur: src, x0: x, y0: y, cx, cy, moved: false, short: false, removed: 0, dx: src >= 0 ? x - targets[src].x : 0 };\n    this.el.classList.add(\"lifting\");\n    this.hot = new Set([toks[grab.index].id]); this.render();   // \u62FF\u8D77\u6765\u90A3\u4E00\u523B\u5C31\u4EAE\uFF08\u5F3A\u8C03\u8272\uFF09\uFF1A\u77E5\u9053\u6293\u4F4F\u4E86\n    this.host.focus?.(\"staff\");\n  }\n  /** \u62D6\u7740\u8D70\uFF1A\u6307\u9488\uFF08\u51CF\u53BB\u62FF\u8D77\u6765\u65F6\u548C\u90A3\u4E2A\u97F3\u7684\u9519\u4F4D\uFF09\u6700\u8FD1\u7684\u90A3\u4E2A\u97F3 = \u843D\u70B9\uFF1B\u6362\u4E86\u843D\u70B9\u5C31\u4ECE\u62FF\u8D77\u6765\u4E4B\u524D\u7684\u8C31\u91CD\u7B97\u4E00\u6B21\uFF08\u8C31\u4E0A\u5B9E\u65F6\u662F\u632A\u8FC7\u53BB\u7684\u6837\u5B50\uFF09\u3002 */\n  private dragLift(p: { x: number; y: number }): void {\n    const f = this.lift!;\n    if (!f.moved && Math.hypot(p.x - f.x0, p.y - f.y0) < 6) return;\n    f.moved = true;\n    if (!f.targets.length) return;\n    const rows = [...new Set(f.targets.map((t) => t.system))], row = this.rowAt(p.y), sys = rows.includes(row) ? row : rows.reduce((a, b) => (Math.abs(b - row) < Math.abs(a - row) ? b : a));\n    let best = -1, bd = Infinity;\n    f.targets.forEach((t, k) => { if (t.system !== sys) return; const d = Math.abs(t.x - (p.x - f.dx)); if (d < bd) { bd = d; best = k; } });\n    if (best < 0 || best === f.cur) return;\n    f.cur = best;\n    if (f.grab.kind === \"lyric\") {\n      const want = best - f.src, r = moveSyllable(f.st0, f.grab.index, want);\n      f.short = want > 0 ? r.done < want : r.done === 0 && want < 0;\n      this.hot = new Set([tr(r.st)[r.at].id]);   // \u5B57\u632A\u5230\u54EA\u4E2A\u97F3\uFF0C\u4EAE\u7684\u5C31\u8DDF\u5230\u54EA\u4E2A\u97F3\n      this.host.set(r.st, { gesture: \"lift\" });\n    } else {\n      const r = moveMark(f.st0, f.grab.index, f.targets[best].idx);\n      f.removed = r.removed;\n      this.host.set(r.st, { gesture: \"lift\" });\n    }\n  }\n  /** \u677E\u624B\uFF1A\u6CA1\u52A8 = \u6B4C\u8BCD \u2192 \u9009\u4E2D\u8FD9\u4E2A\u97F3\uFF08\u540C\u957F\u6309\u97F3\uFF1B\u518D\u62D6\u628A\u624B\u6269\u9009\uFF09\uFF0C\u8BB0\u53F7 \u2192 \u5C0F\u83DC\u5355\uFF1B\u52A8\u4E86 = \u5DF2\u7ECF\u632A\u597D\u4E86\uFF0C\u632A\u4E0D\u52A8 / \u9876\u6389\u4E86\u522B\u7684\u8BF4\u4E00\u58F0\u3002 */\n  private endLift(): void {\n    const f = this.lift!; this.lift = null; this.el.classList.remove(\"lifting\"); this.hot = null; this.render();\n    if (!f.moved) {\n      if (f.grab.kind === \"lyric\") this.host.set(select(this.host.get(), f.grab.index, f.grab.index + 1));\n      else this.host.onMarkPress?.(f.grab.index, { x: f.cx, y: f.cy });\n      return;\n    }\n    if (f.grab.kind === \"lyric\" && f.short) this.host.notice?.(f.cur > f.src ? \"\u8FD9\u4E00\u53E5\u540E\u9762\u6CA1\u6709\u7A7A\u7740\u7684\u97F3\u4E86\uFF08\u53E5\u53F7\u662F\u8FB9\u754C\uFF09\uFF0C\u5B57\u53EA\u80FD\u632A\u5230\u8FD9\u513F\" : \"\u524D\u9762\u9694\u7740\u53E5\u53F7\uFF08\u6216\u8005\u6CA1\u6709\u97F3\u4E86\uFF09\uFF0C\u5B57\u632A\u4E0D\u8FC7\u53BB\");\n    if (f.grab.kind === \"mark\" && f.removed) this.host.notice?.(`\u987A\u624B\u53BB\u6389\u4E86 ${f.removed} \u4E2A\u4E0D\u518D\u7BA1\u4EFB\u4F55\u97F3\u7684\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\uFF08\u64A4\u9500\u80FD\u627E\u56DE\u6765\uFF09`);\n  }\n  /** \u70B9\u4E2D\u4E86\u54EA\u4E2A\u97F3\uFF08\u5149\u6807\u6240\u5728 track \u6216\u522B\u7684 track \u90FD\u7B97\uFF1B\u522B\u7684 track \u7684\u97F3 = \u5148\u628A\u7126\u70B9\u6362\u8FC7\u53BB\uFF09\u3002 */\n  private noteAt(x: number, y: number, finger = false): HitNote | null {\n    const L = this.layout!, row = this.rowAt(y); if (row < 0) return null;\n    const sp = L.sp;\n    if (!finger) return this.hits.find((n) => n.system === row && x >= n.x - sp * 0.5 && x <= n.x + n.w + sp * 0.5 && Math.abs(y - n.y) <= sp * 0.9) ?? null;   // \u7B14 / \u9F20\u6807\uFF1A\u51C6\n    // \u624B\u6307\uFF1A\u6307\u5C16\u6BD4\u7B26\u5934\u5927\u5F97\u591A\uFF08\u7B26\u5934 \u2248 1.2 sp\uFF0CiPad \u4E0A\u5341\u6765\u4E2A\u50CF\u7D20\uFF09\uFF0C\u539F\u6765\u7684\u78B0\u649E\u7BB1\u8D34\u7740\u7B26\u5934 = \u6309\u504F\u4E00\u70B9\u3001\u6309\u5728\u7B26\u5E72\u4E0A\u3001\u6309\u53E0\u97F3\u4E0B\u9762\u7684\u97F3\u5C31\u7B97\u7A7A\u767D\uFF0C\u957F\u6309\u6CA1\u53CD\u5E94\n    //   \uFF08user 2026-10-08\u300C\u624B\u6307\uFF0C\u6709\u65F6\u5019\u80FD\u9009\u4E2D\u6709\u65F6\u5019\u9009\u4E0D\u4E2D\uFF0C\u662F\u4E0D\u662F\u4F60\u78B0\u649E\u7BB1literally\u8D34\u7740\u97F3\u7B26\u7684\u56FE\u50CF\u753B\u4E86\uFF1F\u300D\uFF09\u2192 \u8FD9\u4E00\u884C\u91CC\u6309\u6307\u5C16\u5927\u5C0F\uFF08\u5C4F\u5E55\u4E0A\u7EA6 22 \u00D7 26 px\uFF09\u627E\u6700\u8FD1\u7684\u97F3\n    const tx = Math.max(sp * 0.5, 22 / this.zoom), ty = Math.max(sp * 0.9, 26 / this.zoom);\n    let best: HitNote | null = null, bd = Infinity;\n    for (const n of this.hits) {\n      if (n.system !== row) continue;\n      const dx = x - Math.max(n.x, Math.min(x, n.x + n.w)), dy = y - n.y;\n      if (Math.abs(dx) > tx || Math.abs(dy) > ty) continue;\n      const d = (dx / tx) ** 2 + (dy / ty) ** 2; if (d < bd) { bd = d; best = n; }\n    }\n    return best;\n  }\n  /** \u79BB\u6307\u9488\u6700\u8FD1\u7684\u3001\u5149\u6807\u6240\u5728 track \u4E0A\u7684\u97F3\uFF08\u6269\u9009\u7528\uFF09\uFF1A\u5148\u6309\u884C\uFF08\u6307\u9488\u6240\u5728\u884C\uFF1B\u4E0D\u662F\u8FD9\u6761 track \u7684\u884C\u5C31\u53D6\u6700\u8FD1\u7684\u4E00\u884C\uFF09\uFF0C\u518D\u6309 x\u3002 */\n  private noteNear(p: { x: number; y: number }): number {\n    const L = this.layout!, mine = this.hits.filter((n) => this.onTrack(n)); if (!mine.length) return -1;\n    const row = this.rowAt(p.y);\n    const rows = [...new Set(mine.map((n) => n.system))], sys = rows.includes(row) ? row : rows.reduce((a, b) => (Math.abs(b - row) < Math.abs(a - row) ? b : a));\n    const cands = mine.filter((n) => n.system === sys);\n    return cands.reduce((a, b) => (Math.abs(b.x + b.w / 2 - p.x) < Math.abs(a.x + a.w / 2 - p.x) ? b : a)).index;\n  }\n\n  private inBox(b: { x: number; y: number; w: number; h: number } | null | undefined, x: number, y: number): boolean { return !!b && x >= b.x && x <= b.x + b.w && y >= b.y && y <= b.y + b.h; }\n  /** \u4E00\u6B21\u8F7B\u70B9\uFF1A\u8BB0\u53F7 \u2192 \u8BB0\u53F7\u6846\uFF1B\u6B4C\u8BCD\u884C \u2192 \u6B4C\u8BCD\u6846\uFF1B\u97F3\u7B26 \u2192 \u9009\u4E2D\uFF08+ \u7B14 / \u9F20\u6807\u5F00\u59CB\u62D6\uFF09\u3002\u70B9\u4E2D\u4E86\u4E1C\u897F\u8FD4\u56DE true\uFF1B\u843D\u5728\u7A7A\u767D\u5904\u8FD4\u56DE false\uFF08\u8C03\u7528\u65B9\u51B3\u5B9A\u653E\u5149\u6807\u8FD8\u662F\u6846\u9009\uFF09\u3002 */\n  /** view = \u542C\u6A21\u5F0F\uFF1A\u53EA\u8BA4\u770B\u8C31\u7684\u90A3\u4E9B\uFF08\u7EB8\u7684\u8BBE\u7F6E / \u7FFB\u7EB8 / \u672C\u6BB5 / \u6B4C\u624B\u724C\uFF09\uFF0C\u5199\u8C31\u7684\uFF08\u6B4C\u540D / \u4F5C\u8005\u680F / \u7F16\u6392 / \u66F2\u6BB5\u540D / \u7EB8\u7684\u83DC\u5355 / \u65B0\u7EB8\uFF09\u4E0D\u63A5\u3002 */\n  private tap(x: number, y: number, shift: boolean, pid: number | null, view = false): boolean {\n    const L0 = this.layout!, wasMark = this.marks.open, wasLyric = this.lyrics.open;\n    this.lyrics.commitAndClose(); this.marks.commitAndClose();\n    if (wasMark) { this.host.focus?.(\"staff\"); return true; }   // \u70B9\u522B\u5904 = \u5148\u6536\u8D77\u8BB0\u53F7\u6846\uFF08\u8FD9\u4E00\u4E0B\u4E0D\u53E6\u505A\u4E8B\uFF09\n    // \u624B\u6307\uFF08pid === null\uFF09\uFF1A\u6B4C\u8BCD\u6846\u5F00\u7740\u65F6\u70B9\u8C31\u9762 = \u53EA\u6536\u6846\u3001\u4E0D\u9009\u4E2D\uFF08user 2026-10-08 \u622A\u56FE\uFF1A\u6253\u6B4C\u8BCD\u65F6\u8BEF\u89E6\u628A\u4E00\u4E2A\u97F3\u9009\u6210\u84DD\u7684\uFF09\uFF1B\u7B14 / \u9F20\u6807\u7167\u65E7\u53EF\u4EE5\u76F4\u63A5\u70B9\u9009\n    if (wasLyric && pid === null) { this.host.focus?.(\"staff\"); return true; }\n    const L = this.layout ?? L0, sp = L.sp;\n    // 0. \u7EB8\u53F3\u4E0A\u89D2\u7684\u5C0F\u94AE\uFF08\u7EB8\u5F20\uFF09\u3001\u65C1\u8FB9\u7684\u300C\uFF0B\u300D\u3001\u6B4C\u540D\u5DE6\u8FB9\u7684\u300C\u2039 \u203A\u300D\u2014\u2014\u90FD\u5728\u6B4C\u540D\u90A3\u4E00\u6761\u91CC\uFF0C\u5148\u4E8E\u6B4C\u540D\u5224\n    if (this.inBox(L.paperChip, x, y)) { this.host.onPaper?.(); return true; }\n    if (!view && this.inBox(L.addPaper, x, y)) { this.host.onAddPaper?.(); return true; }\n    if (this.inBox(L.nav?.prev, x, y)) { this.host.onNav?.(-1); return true; }\n    if (this.inBox(L.nav?.next, x, y)) { this.host.onNav?.(1); return true; }\n    if (this.inBox(L.nav?.scope, x, y)) { this.host.onScopeToggle?.(); return true; }\n    if (!view && this.inBox(L.paperMenu, x, y)) { this.host.onPaperMenu?.(this.host.get().at.paper); return true; }\n    // 0\u2159. \u4F5C\u8BCD / \u4F5C\u66F2\uFF08\u6807\u9898\u4E0B\u9762\u9760\u53F3\uFF09\n    if (!view && this.inBox(L.credits, x, y)) { this.host.focus?.(\"text\"); this.host.onCredits?.(); return true; }\n    // 0\u215B. \u6B4C\u624B\u724C\uFF08\u6BCF\u5F20\u7EB8\u7B2C\u4E00\u884C\u5404\u6761\u8C31\u5DE6\u8FB9\u7684\u58F0\u90E8\u540D\uFF09\uFF1A\u5148\u628A\u5149\u6807\u6362\u5230\u90A3\u6761\uFF0C\u518D\u5F00\u6B4C\u624B\u724C\n    if (this.leaveFamilyAt(x, y)) return true;\n    if (this.openPartAt(x, y)) return true;\n    // 0\u00BC. \u7EB8\u9762\u6700\u4E0A\u9762\u7684\u6B4C\u540D\uFF08\u53EF\u4E0D\u586B\uFF09\uFF1B\u6B4C\u540D\u4E0B\u9762\u7684\u7F16\u6392\u90A3\u4E00\u884C\uFF08\u5168\u90E8\u89C6\u56FE\u91CC\u624D\u6709\uFF09\n    if (view) { for (const pp of L.papers) { if (this.inBox(pp.prev ?? null, x, y)) { this.host.onNavFrom?.(pp.id, -1); return true; } if (this.inBox(pp.next ?? null, x, y)) { this.host.onNavFrom?.(pp.id, 1); return true; } if (this.inBox(pp.scope, x, y)) { this.host.onScopeOf?.(pp.id); return true; } } return false; }   // \u542C\uFF1A\u770B\u8C31\u7684\u5230\u6B64\u4E3A\u6B62\n    if (this.inBox(L.title, x, y)) { this.title.openNow(); this.host.focus?.(\"text\"); return true; }\n    if (this.inBox(L.arrangement, x, y)) { this.title.openArrangement(); this.host.focus?.(\"text\"); return true; }\n    // 0\u215C. \u7EB8\u9876\uFF1A\u300C\u22EF\u300D\uFF08\u7EB8\u7684\u83DC\u5355\uFF09\u3001\u66F2\u6BB5\u540D\uFF08\u5C31\u5730\u6539\uFF09\uFF1B\u6700\u5E95\u4E0B\u300C\uFF0B \u65B0\u7684\u7EB8\u300D\n    for (const pp of L.papers) {\n      if (this.inBox(pp.menu, x, y)) { this.host.onPaperMenu?.(pp.id); return true; }\n      if (this.inBox(pp.prev ?? null, x, y)) { this.host.onNavFrom?.(pp.id, -1); return true; }\n      if (this.inBox(pp.next ?? null, x, y)) { this.host.onNavFrom?.(pp.id, 1); return true; }\n      if (this.inBox(pp.scope, x, y)) { this.host.onScopeOf?.(pp.id); return true; }\n      if (pp.title.shown && this.inBox(pp.title, x, y)) { this.title.openNow(pp.id); this.host.focus?.(\"text\"); return true; }\n    }\n    const row = this.rowAt(y); if (row < 0) return false;\n    // 0\u00BC. \u8C31\u53F7 / \u516B\u5EA6\u7EBF\uFF08v0.9.28\uFF1Buser\u300C\u8C31\u53F7\u662F\u9AD8\u97F3\u8FD8\u662F\u4F4E\u97F3\u4EE5\u53CA\u79FB\u52A8\u516B\u5EA6\u5E94\u8BE5\u70B9\u8C31\u53F7\u5C31\u80FD\u505A\uFF0C\u7136\u540E\u6BCF\u4E00\u884C\u7684\u8C31\u53F7\u5E94\u8BE5\u90FD\u53EF\u4EE5\u70B9\u300D\uFF09\uFF1A\u5199\u8C31\u7684\u6A21\u5F0F\u91CC\u90FD\u8BA4\uFF08\u542C\u6A21\u5F0F\u4E0D\u63A5\uFF09\n    const ch = this.rules.edit ? L.clefs.find((c) => x >= c.x && x <= c.x + c.w && y >= c.y && y <= c.y + c.h) : undefined;\n    if (ch) { const b = this.clientBox(ch); this.host.onClef?.(ch, { x: b.left, y: b.bottom }); return true; }\n    // 0\u00BD. \u8BB0\u53F7\uFF08\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\uFF09\uFF1A\u6362\u5230\u90A3\u6761 track \u518D\u5F00\u6846\u2014\u2014\u53EA\u5728\u300C\u7B26\u300D\u91CC\uFF08\u522B\u7684\u6A21\u5F0F\u70B9\u5B83 = \u653E\u5149\u6807\uFF09\n    const mk = this.rules.symbols ? L.marks.find((m) => x >= m.x && x <= m.x + m.w && y >= m.y && y <= m.y + m.h) : undefined;\n    if (mk) { this.host.set(this.focusRow(this.host.get(), mk.system, this.host.get().caret)); this.marks.openAt(mk.index); return true; }\n    // 0\u00BE. \u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\uFF1A\u5C0F\u83DC\u5355\uFF08\u6539 / \u5220\uFF09\u2014\u2014\u53EA\u5728\u300C\u7B26\u300D\u91CC\n    const dh = this.rules.symbols ? this.dynHitAt(x, y, pid === null) : null;\n    if (dh) { this.markMenu(dh); return true; }\n    // 1. \u6B4C\u8BCD\u90A3\u4E00\u884C\uFF08\u97F3\u7B26\u4F18\u5148\uFF0C\u522B\u62A2\u4E0B\u4E00\u884C\u9AD8\u97F3\u7684\u70B9\uFF09\u2014\u2014\u53EA\u5728\u300C\u8BCD\u300D\u91CC\n    if (this.rules.lyrics && !this.noteAt(x, y)) {\n      const ly = this.lyricAt(x, y), lyRow = ly ? L.systems[ly.system] : null;\n      if (ly && lyRow && this.noLyricsHere(lyRow.part)) {\n        const t = trackOf(this.host.get().song, lyRow.paper, lyRow.part)[ly.index];\n        if (t?.kind === \"note\" && !t.lyric) return false;   // \u4E0D\u5531\u5B57\u7684\u58F0\u90E8\uFF1A\u7A7A\u7740\u7684\u6B4C\u8BCD\u4F4D\u4E0D\u5F00\u6846\uFF08\u7167\u5E38\u653E\u5149\u6807\uFF09\n      }\n      if (ly) { this.host.set(this.focusRow(this.host.get(), ly.system, this.host.get().caret)); this.lyrics.openAt(ly.index); this.host.focus?.(\"text\"); return true; }\n    }\n    // 2. \u97F3\u7B26\uFF1A\u4E0D\u5728\u8FD9\u91CC\uFF08\u8F7B\u70B9 / \u957F\u6309 / \u62D6\u5728 down / up / longPress \u91CC\u5206\uFF09\n    void shift; void pid;\n    return false;\n  }\n  /** \u8F7B\u70B9\u5728\u97F3\u4E0A\uFF08\u624B\u6307 / \u7B14 / \u9F20\u6807\uFF09\uFF1A\u5149\u6807\u653E\u5230\u5B83\u540E\u9762\uFF08Shift = \u628A\u9009\u4E2D\u6269\u5230\u5B83\uFF09\u3002 */\n  private tapNote(hit: HitNote, shift: boolean): void {\n    this.lyrics.commitAndClose(); this.marks.commitAndClose();\n    const st0 = this.host.get(), st = this.onTrack(hit) ? st0 : this.focusRow(st0, hit.system);\n    const cur = this.onTrack(hit) ? st.sel : null;\n    if (shift && cur) this.host.set(select(st, Math.min(cur.from, hit.index), Math.max(cur.to, hit.index + 1)));\n    else this.putCaret(setCaret(st, hit.index + 1), this.endSlotOn(hit.system, hit.index + 1));   // \u70B9\u7684\u662F\u4E00\u884C\u6700\u540E\u4E00\u4E2A\u97F3 = \u5149\u6807\u753B\u5728\u8FD9\u4E00\u884C\u672B\u5C3E\n    this.host.focus?.(\"staff\");\n  }\n  /** \u8FD9\u4E00\u884C\uFF08\u8C31\u884C\uFF09\u4E0A\u6709\u6CA1\u6709\u300C\u884C\u672B\u300D\u843D\u70B9\u7ED9\u8FD9\u4E2A\u5149\u6807\u4F4D\u7F6E\uFF08= \u5B83\u672C\u6765\u753B\u5728\u4E0B\u4E00\u884C\u5F00\u5934\uFF09\u3002 */\n  private endSlotOn(row: number, caret: number): boolean {\n    return !!this.layout?.slots.some((s) => s.end && s.system === row && s.caret === caret);\n  }\n  /** \u653E\u5149\u6807 + \u8BB0\u4F4F\u753B\u5728\u884C\u672B\u8FD8\u662F\u884C\u9996\u3002\u72B6\u6001\u6CA1\u53D8\uFF08\u5149\u6807\u672C\u6765\u5C31\u5728\u8FD9\u513F\uFF09\u4F46\u753B\u6CD5\u53D8\u4E86 = \u81EA\u5DF1\u91CD\u753B\u3002 */\n  private putCaret(next: EditorState, end: boolean): void {\n    const want = end ? caretKey(next) : null, before = this.host.get(), redraw = want !== this.caretEnd;\n    this.caretEnd = want;\n    this.host.set(next);\n    if (redraw && this.host.get() === before) this.render();\n  }\n  /** \u7A7A\u767D\u5904\u653E\u5149\u6807\uFF08\u8F7B\u70B9 / \u957F\u6309 / \u53F3\u952E / \u6846\u9009\u6CA1\u6846\u4F4F\uFF09\uFF1A\u90A3\u6761\u8C31\u6700\u8FD1\u7684\u843D\u70B9\uFF0C\u884C\u672B\u7684\u843D\u70B9 = \u753B\u5728\u884C\u672B\u3002 */\n  private placeCaretAt(x: number, y: number, st = this.host.get()): void {\n    const s = this.slotAt(x, y);\n    this.putCaret(this.caretAt(x, y, st), !!s?.end);\n  }\n  private slotAt(x: number, y: number): Slot | null {\n    const L = this.layout!, row = this.rowAt(y), cands = L.slots.filter((s) => s.system === row);\n    return cands.length ? cands.reduce((a, b) => (Math.abs(b.x - x) < Math.abs(a.x - x) ? b : a)) : null;\n  }\n  /** \u7A7A\u767D\u5904 \u2192 \u90A3\u6761\u8C31\u6700\u8FD1\u7684\u5149\u6807\u843D\u70B9\uFF08= \u5199\uFF1B\u70B9\u54EA\u6761\u8C31\u5149\u6807\u5C31\u5230\u54EA\u6761\uFF09\u3002 */\n  private caretAt(x: number, y: number, st = this.host.get()): EditorState {\n    const L = this.layout!, row = this.rowAt(y), best = this.slotAt(x, y);\n    if (!best) return st;\n    const r = L.systems[row];\n    const at = r.paper === st.at.paper && r.part === st.at.part ? setCaret(st, best.caret) : setFocus(st, r.paper, r.part, best.caret);\n    return best.lead ? setCaretLead(at, best.lead) : at;   // \u8865\u9F50\u7684\u6DE1\u8272\u5C0F\u8282\uFF08v0.10.6\uFF09\uFF1A\u5149\u6807\u5728\u5C3E\u5DF4\u3001\u5199\u7684\u65F6\u5019\u5148\u8865\u5230\u8FD9\u4E2A\u5C0F\u8282\u5F00\u5934\n  }\n  /** \u6846\u9009\uFF1A\u6846\u4F4F\u7684\u97F3\uFF08\u97F3\u5934\u4E2D\u5FC3\u5728\u6846\u91CC\uFF1B\u53EA\u7B97\u6846\u8D77\u70B9\u90A3\u6761\u8C31\u7684\uFF09\u4ECE\u7B2C\u4E00\u4E2A\u5230\u6700\u540E\u4E00\u4E2A\u9009\u6210\u4E00\u6BB5\uFF1B\u4E00\u4E2A\u90FD\u6CA1\u6846\u4F4F = \u56DE\u5230\u8D77\u70B9\u7684\u5149\u6807\u3002 */\n  private boxSelect(x1: number, y1: number): void {\n    const b = this.box!, L = this.layout!, xa = Math.min(b.x0, x1), xb = Math.max(b.x0, x1), ya = Math.min(b.y0, y1), yb = Math.max(b.y0, y1);\n    Object.assign(this.boxEl.style, { left: `${xa}px`, top: `${ya}px`, width: `${xb - xa}px`, height: `${yb - ya}px` });\n    const inside = this.hits.filter((n) => { const cx = n.x + n.w / 2; return n.system === b.row && cx >= xa && cx <= xb && n.y >= ya && n.y <= yb; }).map((n) => n.index);\n    const key = inside.length ? `${Math.min(...inside)}-${Math.max(...inside)}` : \"caret\";\n    if (key === b.last) return;   // \u6846\u4F4F\u7684\u6CA1\u53D8 = \u4E0D\u91CD\u8BBE\uFF08\u539F\u6765\u6BCF\u52A8\u4E00\u4E0B\u90FD\u91CD\u6392\u6574\u5F20\u8C31 = \u5361\uFF09\n    b.last = key;\n    if (!inside.length) { this.placeCaretAt(b.x0, b.y0, b.st0); return; }\n    const st = this.focusRow(b.st0, b.row, b.st0.caret);\n    this.host.set(select(st, Math.min(...inside), Math.max(...inside) + 1));\n  }\n\n  private move(e: PointerEvent): void {\n    if (this.lockTap && e.pointerId === this.lockTap.pid) { const p = this.local(e); if (Math.hypot(p.x - this.lockTap.x, p.y - this.lockTap.y) > 6) { this.lockTap.moved = true; if (this.press?.pid === e.pointerId) { this.press.moved = true; clearTimeout(this.press.timer); } } return; }\n    const pr = this.press;\n    if (pr && e.pointerId === pr.pid && !pr.moved && !pr.fired) { const p = this.local(e); if (Math.hypot(p.x - pr.x, p.y - pr.y) > (pr.type === \"touch\" ? 10 : 6)) { pr.moved = true; clearTimeout(pr.timer); } }   // \u624B\u6307\u6296\u4E00\u70B9\u4E5F\u7B97\u8F7B\u70B9\n    if (pr && pr.grab && e.pointerId === pr.pid && pr.moved && !pr.fired && pr.type === \"pen\") { pr.fired = true; this.startLift(pr.grab, pr.pid, pr.x, pr.y, pr.cx, pr.cy, false); }   // \u7B14\u6309\u4F4F\u5B57 / \u8BB0\u53F7\u52A8\u4E86 = \u76F4\u63A5\u62D6\uFF08\u624B\u6307\u52A8\u4E86 = \u6EDA\u52A8\uFF1B\u9F20\u6807\u8981\u5148\u957F\u6309\uFF0C\u6CA1\u957F\u6309\u5C31\u52A8 = \u4E0D\u7B97\uFF0Cv0.9.39\uFF09\n    // \u9F20\u6807\u5728\u97F3 / \u8BB0\u53F7 / \u5B57\u4E0A\u6CA1\u957F\u6309\u5C31\u62D6\u4E86 = \u6846\u9009\uFF08\u957F\u6309\u4E4B\u540E\u624D\u662F\u62FF\u8D77\u6765\u632A\uFF09\n    if (pr && e.pointerId === pr.pid && pr.moved && !pr.fired && pr.type === \"mouse\" && (pr.grab || this.drag?.wait) && !this.box) {\n      const st0 = this.host.get(); this.cancelPress(); this.drag = null;\n      this.box = { pid: e.pointerId, x0: pr.x, y0: pr.y, moved: false, st0, row: this.rowAt(pr.y) };\n    }\n    if (this.lift && e.pointerId === this.lift.pid) { this.dragLift(this.local(e)); return; }\n    if (this.selDrag && e.pointerId === this.selDrag.pid) {   // \u957F\u6309\u4E4B\u540E\u63A5\u7740\u62D6 = \u6269\u9009\u5230\u6307\u9488\u4E0B\u9762\u7684\u97F3\n      const idx = this.noteNear(this.local(e)); if (idx < 0) return;\n      if (this.selDrag.menu) { if (idx === this.selDrag.anchor) return; this.selDrag.menu = false; this.lyrics.commitAndClose(); this.marks.commitAndClose(); }   // \u9009\u533A\u91CC\u957F\u6309\u540E\u62D6\u5230\u522B\u7684\u97F3 = \u4ECE\u957F\u6309\u7684\u90A3\u4E2A\u91CD\u65B0\u6269\u9009\n      const st = this.host.get(), a = Math.min(idx, this.selDrag.anchor), b = Math.max(idx, this.selDrag.anchor) + 1;\n      if (!st.sel || st.sel.from !== a || st.sel.to !== b) this.host.set(select(st, a, b));\n      return;\n    }\n    if (this.touches.has(e.pointerId)) {\n      this.touches.set(e.pointerId, { x: e.clientX, y: e.clientY });\n      if (this.pinch && this.touches.size === 2) { this.pinchMove(); return; }\n    }\n    if (this.finger && e.pointerId === this.finger.pid) {\n      const dy = e.clientY - this.finger.y0, dx = e.clientX - this.finger.x0;\n      if (Math.hypot(dx, dy) > 10) this.finger.moved = true;\n      if (this.finger.moved) { this.userScrollAt = performance.now(); this.el.scrollTop = this.finger.top0 - dy; if (this.zoom > 1.001 || this.hscroll) this.el.scrollLeft = this.finger.left0 - dx; }   // \u653E\u5927\u4E86 / \u6A2A\u5377\uFF1A\u5355\u6307\u4E5F\u80FD\u6A2A\u7740\u6EDA\n      return;\n    }\n    if (this.box && e.pointerId === this.box.pid && this.layout) {\n      const p = this.local(e), b = this.box;\n      if (!b.moved && Math.hypot(p.x - b.x0, p.y - b.y0) < 6) return;\n      if (!b.moved) { b.moved = true; this.boxEl.hidden = false; }\n      b.px = p.x; b.py = p.y;\n      if (!b.raf) b.raf = requestAnimationFrame(() => { const bb = this.box; if (!bb || bb !== b) return; bb.raf = 0; this.boxSelect(bb.px!, bb.py!); });   // \u6BCF\u5E27\u6700\u591A\u4E00\u6B21\n      return;\n    }\n    const g = this.drag, L = this.layout; if (!g || !L || e.pointerId !== g.pid || g.wait) return;   // \u9F20\u6807\u8FD8\u6CA1\u957F\u6309\u5230\u70B9 = \u4E0D\u62D6\n    const p = this.local(e), dx = p.x - g.x0, dy = p.y - g.y0;\n    if (!g.axis) {\n      if (Math.hypot(dx, dy) < 6) return;\n      g.axis = Number.isNaN(g.d0) ? \"x\" : Math.abs(dy) >= Math.abs(dx) ? \"y\" : \"x\";   // \u4F11\u6B62\u6CA1\u6709\u97F3\u9AD8\uFF1A\u53EA\u80FD\u6A2A\u7740\u62D6\u6539\u65F6\u503C\n      if (g.axis === \"y\") this.host.audition?.(g.index, true);   // \u62D6\u97F3\u9AD8\uFF1A\u4ECE\u8FD9\u4E00\u4E0B\u8D77\u4E00\u76F4\u54CD\u3001\u6362\u5230\u65B0\u97F3\u9AD8\u5C31\u6362\uFF08\u6539\u65F6\u957F\u4E0D\u51FA\u58F0\uFF09\n    }\n    const st = this.host.get();\n    if (g.axis === \"y\") {\n      const d = g.d0 + Math.round(-dy / (L.sp / 2));\n      if (d === g.heard) return;   // \u8FD8\u5728\u540C\u4E00\u4E2A\u97F3\u9AD8\uFF1A\u4E0D\u91CD\u753B\u3001\u4E0D\u91CD\u65B0\u8D77\u97F3\n      g.heard = d;\n      this.host.set(setNote(st, g.index, { pitch: fromDiatonic(d, keyAt(tr(st), g.index)) }), { gesture: \"drag\" });\n      if (this.host.glide) this.host.glide(g.index); else this.host.audition?.(g.index, true);   // \u65B0\u97F3\u9876\u6389\u65E7\u97F3\n    } else {\n      const i0 = DUR_LADDER.reduce((bi, v, i) => (Math.abs(v - g.dur0) < Math.abs(DUR_LADDER[bi] - g.dur0) ? i : bi), 0);\n      const i = Math.max(0, Math.min(DUR_LADDER.length - 1, i0 + Math.round(dx / (L.sp * 2.2))));\n      this.host.set(setDur(st, g.index, DUR_LADDER[i]), { gesture: \"drag\" });\n    }\n  }\n\n  private up(e: PointerEvent): void {\n    // \u624B\u6307\u8F7B\u70B9\uFF08\u6CA1\u62D6\u3001\u6CA1\u957F\u6309\uFF09= \u8FD9\u65F6\u624D\u628A\u7126\u70B9\u62FF\u56DE\u8C31\u9762\uFF08down \u91CC\u624B\u6307\u4E0D\u62A2\uFF09\uFF1B\u5148\u62FF\u7126\u70B9\u518D tap\uFF1Atap \u6253\u5F00\u7684\u6B4C\u8BCD\u6846\u4F1A\u81EA\u5DF1\u518D\u628A\u7126\u70B9\u62FF\u8D70\n    if (e.pointerType === \"touch\" && this.press && this.press.pid === e.pointerId && !this.press.moved && !this.press.fired && !this.pinch) this.el.focus({ preventScroll: true });\n    if (this.touches.delete(e.pointerId) && this.pinch && this.touches.size < 2) { this.pinchEnd(); this.finger = null; this.cancelPress(); return; }   // \u634F\u5408\u7ED3\u675F\uFF1A\u843D\u5B9A\u7F29\u653E\uFF1B\u5269\u4E0B\u90A3\u6839\u624B\u6307\u4E0D\u63A5\u7740\u5F53\u6EDA\u52A8\uFF08\u4F1A\u8DF3\uFF09\n    if (this.holdPid === e.pointerId) { this.holdPid = null; this.host.release?.(); }   // \u6309\u4F4F\u97F3\u7684\u9884\u89C8\uFF1A\u62AC\u624B\u505C\n    if (!this.rules.edit || this.roGesture) {   // \u542C\u6A21\u5F0F / \u5408\u79DF\u53E0\u8D77\u6765\u7684\u90A3\u4E00\u884C\uFF1A\u6CA1\u62D6\u3001\u6CA1\u957F\u6309 = \u8F7B\u70B9\uFF08\u53EA\u8BA4\u770B\u8C31\u7684\u90A3\u4E9B\uFF09\n      const lt = this.lockTap, f = this.finger, pr = this.press, fired = !!(pr && pr.pid === e.pointerId && pr.fired);\n      // \u5199\u7684\u6A21\u5F0F\u91CC\u8F7B\u70B9\u53E0\u8D77\u6765\u7684\u90A3\u4E00\u884C = \u5C55\u5F00\u8FD9\u4E00\u5BB6\u3001\u5149\u6807\u843D\u5728\u70B9\u7684\u90A3\u513F\uFF08v0.10.32\uFF1Buser\u300C\u97F3\u8F93\u5165\u6A21\u5F0F\u4E0B\u5E94\u8BE5\u70B9\u5F00\u5408\u79DF\u7684\u4E94\u7EBF\u8C31\u80FD\u5C55\u5F00\u300D\uFF09\n      if (this.roGesture && this.roAt && ((lt && e.pointerId === lt.pid && !lt.moved && !fired) || (f && e.pointerId === f.pid && !f.moved && !fired))) { const at = this.roAt; this.roAt = null; this.roGesture = false; this.cancelPress(); this.lockTap = null; this.finger = null; this.expandFamilyAt(at.x, at.y); return; }\n      if (!this.touches.size) this.roGesture = false;\n      if (pr && pr.pid === e.pointerId) { this.press = null; clearTimeout(pr.timer); }\n      // \u542C\u6A21\u5F0F\u7684\u624B\u6307\u8F7B\u70B9\uFF1A\u6CA1\u70B9\u4E2D\u63A7\u4EF6\u7684\u4E00\u4E0B\u8BB0\u4E0B\u6765\uFF0C\u7D27\u63A5\u7740\u518D\u70B9\u4E00\u4E0B = \u53CC\u51FB\u7F29\u653E\uFF08PDF \u9605\u8BFB\u5668\u624B\u52BF\uFF1B2026-10-21\uFF09\n      const viewTap = (x: number, y: number, pid: number | null) => {\n        if (e.pointerType === \"touch\" && this.doubleTapZoom(x, y)) return;\n        const handled = this.tap(x, y, false, pid, true);\n        if (e.pointerType === \"touch\" && !handled) this.lastTap = { t: performance.now(), x, y };\n      };\n      if (lt && e.pointerId === lt.pid) { this.lockTap = null; if (!lt.moved && !fired) viewTap(lt.x, lt.y, e.pointerId); return; }\n      if (f && e.pointerId === f.pid) { this.finger = null; if (!f.moved && !fired) viewTap(f.x, f.y, null); return; }\n      return;\n    }\n    if (this.lift && e.pointerId === this.lift.pid) { this.cancelPress(); this.finger = null; this.endLift(); return; }\n    const pr = this.press;\n    if (pr && e.pointerId === pr.pid) {\n      this.press = null; clearTimeout(pr.timer);\n      const extended = !!this.selDrag, menu = !!this.selDrag?.menu; this.selDrag = null;\n      if (pr.grab && pr.type !== \"touch\") { if (!pr.moved && !pr.fired) this.tap(pr.x, pr.y, pr.shift, pr.pid); return; }   // \u7B14 / \u9F20\u6807\u8F7B\u70B9\u5B57 / \u8BB0\u53F7 = \u6B4C\u8BCD\u6846 / \u5C0F\u83DC\u5355\uFF08\u624B\u6307\u8D70\u4E0B\u9762 finger \u90A3\u6761\uFF09\n      if (menu) { this.finger = null; this.box = null; this.boxEl.hidden = true; this.host.focus?.(\"staff\"); this.host.onSelPress?.({ x: pr.cx, y: pr.cy }); return; }\n      if (pr.fired && pr.hit && this.drag && !this.drag.wait && !this.drag.axis && pr.type === \"mouse\" && !extended) { this.selectHeld(pr.pid, pr.hit); this.selDrag = null; this.host.release?.(); this.holdPid = null; return; }   // \u9F20\u6807\u957F\u6309\u97F3\u3001\u6CA1\u62D6\u5C31\u677E\u624B = \u9009\u4E2D\u5B83\n      if (pr.fired || extended) { this.finger = null; if (this.drag) { this.host.release?.(); this.drag = null; } this.box = null; this.boxEl.hidden = true; return; }   // \u957F\u6309\u9009\u8FC7\u4E86\uFF1A\u62AC\u624B\u5230\u6B64\u4E3A\u6B62\n      if (pr.hit && !pr.moved) {   // \u8F7B\u70B9\u5728\u97F3\u4E0A\n        this.finger = null; this.box = null;\n        if (this.drag) { this.host.release?.(); this.drag = null; }\n        if (this.rules.lyrics && !pr.shift && this.openLyricOn(pr.hit)) return;   // \u300C\u8BCD\u300D\uFF1A\u70B9\u97F3 = \u5199\u8FD9\u4E2A\u97F3\u7684\u6B4C\u8BCD\n        this.tapNote(pr.hit, pr.shift);   // \u8F7B\u70B9 = \u5149\u6807\u5230\u5B83\u540E\u9762\uFF0C\u4E0D\u54CD\u3001\u4E0D\u9009\u4E2D\n        return;\n      }\n    }\n    if (this.finger && e.pointerId === this.finger.pid) {\n      const f = this.finger; this.finger = null;\n      if (!f.moved && this.layout && !this.tap(f.x, f.y, f.shift, null)) { this.placeCaretAt(f.x, f.y); this.host.focus?.(\"staff\"); }\n      return;\n    }\n    if (this.box && e.pointerId === this.box.pid) {\n      const b = this.box; this.box = null; this.boxEl.hidden = true;\n      if (b.raf) { cancelAnimationFrame(b.raf); if (b.moved && b.px !== undefined) { this.box = b; this.boxSelect(b.px, b.py!); this.box = null; } }   // \u6700\u540E\u4E00\u4E0B\u8865\u4E0A\n      if (!b.moved && this.layout) this.placeCaretAt(b.x0, b.y0);   // \u6CA1\u62D6 = \u653E\u5149\u6807\n      this.host.focus?.(\"staff\");\n      return;\n    }\n    if (this.drag && e.pointerId === this.drag.pid) { if (this.drag.axis !== \"x\") this.host.release?.(); this.drag = null; }\n  }\n}\n", "// platform-guards.ts \u2014\u2014 iPad / iOS \u7CFB\u7EDF\u624B\u52BF\u62A4\u680F\uFF1A\u957F\u6309\u653E\u5927\u955C\u3001\u6587\u672C\u9009\u62E9\u3001\u7CFB\u7EDF\u83DC\u5355\u3001\u53CC\u51FB / \u634F\u5408\u7F29\u653E\u3001\u4E09\u6307\u624B\u52BF\u3002created 2026-10-07 by Claude Opus 5.5\n// user\u300Cios\u957F\u6309\u4F1A\u6709\u653E\u5927\u955C\uFF0C\u53EF\u4EE5\u770B\u4E00\u4E0B\u5144\u5F1F\u9879\u76EE\u6BD4\u5982weebpaint\u662F\u600E\u4E48\u89E3\u51B3\u624B\u52BF\u95EE\u9898\u7684\u300D\u2192 \u7167 WeebPaint \u7684\u4E09\u5C42\uFF1A\n//   \u2460 CSS \u5168\u5C40 user-select / -webkit-touch-callout: none\u3001touch-action\uFF08styles.css \u7684 html, body \u5DF2\u6709\uFF09\uFF1B\n//   \u2461 \u6355\u83B7\u9636\u6BB5\u5168\u5C40\u62E6\uFF1Adblclick\u3001gesturestart / gesturechange\u3001\u4E09\u6307 touchstart\u3001selectstart\uFF0Cselectionchange \u515C\u5E95\u6E05\u9009\u533A\n//      \uFF08WeebPaint src/platform-guards.ts\uFF09\uFF1B\n//   \u2462 \u653E\u5927\u955C / \u957F\u6309\u83DC\u5355\u662F\u6302\u5728 touchstart \u7684\u957F\u6309\u8BA1\u65F6\u5668\u4E0A\u7684\u2014\u2014\u62E6 pointerdown\u3001contextmenu \u90FD\u6CA1\u7528\uFF0C\u552F\u4E00\u53EF\u9760\u7684\u662F\u5728\u90A3\u5757\u9762\u4E0A\n//      \u975E passive \u7684\u5355\u6307 touchstart preventDefault\uFF08WeebPaint src/input.ts \u753B\u5E03\u90A3\u6BB5\u6CE8\u91CA\uFF09\u3002\u53EA\u7ED1\u5728\u8C31\u9762\u548C pad\uFF1A\n//      \u8C31\u9762\u7684\u6EDA\u52A8\u662F\u81EA\u5DF1\u6309 pointer \u505A\u7684\uFF08.score touch-action: none\uFF09\uFF0Cpad \u4E0D\u6EDA\uFF1Bpointer \u4E8B\u4EF6\u7167\u5E38\u6765\u3002\n// \u6587\u672C\u8F93\u5165\uFF08\u6B4C\u8BCD\u6846\u3001\u8BB0\u53F7\u6846\u3001\u9876\u680F\u4E0B\u62C9\uFF09\u4E00\u5F8B\u653E\u884C\u3002\n\nfunction isTextTarget(t: EventTarget | null): boolean {\n  const el = t as HTMLElement | null;\n  if (!el || !el.tagName) return false;\n  return el.tagName === \"INPUT\" || el.tagName === \"TEXTAREA\" || el.tagName === \"SELECT\" || el.isContentEditable;\n}\n\nexport function installPlatformGuards(surfaces: HTMLElement[], opts: { /** Ctrl / \u2318 + = / \u2212 / 0\uFF08\u542B\u5C0F\u952E\u76D8\uFF09\u2192 \u7F29\u653E\u8C31\u9762\uFF081 \u653E\u5927 / \u22121 \u7F29\u5C0F / 0 \u56DE\u81EA\u52A8\uFF09\uFF1B\u6D4F\u89C8\u5668\u7684\u7F51\u9875\u7F29\u653E\u4E00\u5F8B\u62E6\u4E0B\u3002 */ zoom?: (dir: 1 | -1 | 0) => void } = {}): void {\n  const cap = { capture: true, passive: false } as const;\n  // \u5168\u91CF\u62E6\u622A\u6D4F\u89C8\u5668\u7F29\u653E\uFF082026-10-21\uFF1Buser\u300Cctrl wheel\u597D\u597D\u7684\u5E2E\u6211\u5168\u91CF\u62E6\u622A\u4E00\u4E0B\u300D\uFF09\uFF1ACtrl / \u2318 + \u6EDA\u8F6E\uFF08\u4E0B\u9762\uFF09\u4E4B\u5916\u8FD8\u6709 Ctrl / \u2318 + = / + / \u2212 / 0 \u8FD9\u51E0\u4E2A\u952E\u2014\u2014\u4E0D\u7BA1\u7126\u70B9\u5728\u54EA\uFF08\u8F93\u5165\u6846\u91CC\u4E5F\u4E00\u6837\uFF0C\n  //   PDF \u9605\u8BFB\u5668\u5C31\u662F\u8FD9\u6837\uFF09\u90FD\u4E0D\u8BA9\u7F51\u9875\u7F29\u653E\uFF1B\u4EA4\u7ED9\u8C31\u9762\u7684\u7F29\u653E\u3002Alt \u6309\u7740\u7684\u4E0D\u7BA1\uFF08\u522B\u5BB6\u5FEB\u6377\u952E\uFF09\u3002\n  window.addEventListener(\"keydown\", (e) => {\n    if (!(e.ctrlKey || e.metaKey) || e.altKey) return;\n    const dir = e.code === \"Equal\" || e.code === \"NumpadAdd\" || e.key === \"+\" || e.key === \"=\" ? 1 : e.code === \"Minus\" || e.code === \"NumpadSubtract\" || e.key === \"-\" || e.key === \"_\" ? -1 : e.code === \"Digit0\" || e.code === \"Numpad0\" || e.key === \"0\" ? 0 : null;\n    if (dir === null) return;\n    e.preventDefault(); e.stopPropagation();\n    if (!e.repeat || dir !== 0) opts.zoom?.(dir);\n  }, cap);\n  window.addEventListener(\"dblclick\", (e) => { if (!isTextTarget(e.target)) e.preventDefault(); }, cap);\n  window.addEventListener(\"touchstart\", (e) => { if (e.touches.length >= 3 && !isTextTarget(e.target)) e.preventDefault(); }, cap);\n  window.addEventListener(\"gesturestart\", (e) => e.preventDefault(), cap);\n  window.addEventListener(\"gesturechange\", (e) => e.preventDefault(), cap);\n  // Ctrl + \u6EDA\u8F6E / \u89E6\u63A7\u677F\u634F\u5408\uFF1A\u54EA\u513F\u90FD\u4E0D\u7F29\u653E\u7F51\u9875\uFF08v0.10.30\uFF1Buser\u300Cctrl wheel\u4E0D\u5E94\u8BE5zoom\u7F51\u9875\uFF0C\u800C\u662F\u5E94\u8BE5\u88AB\u62E6\u622A\u300D\uFF09\u2014\u2014\u8C31\u9762\u4E0A\u5B83 = \u7F29\u653E\u8FD9\u5F20\u7EB8\uFF08score-view\uFF09\n  window.addEventListener(\"wheel\", (e) => { if (e.ctrlKey) e.preventDefault(); }, cap);\n  document.addEventListener(\"selectstart\", (e) => { if (!isTextTarget(e.target)) e.preventDefault(); }, { capture: true });\n  document.addEventListener(\"selectionchange\", () => {   // iOS \u5076\u5C14\u65E0\u89C6 selectstart\uFF1A\u8F93\u5165\u6846\u5916\u5192\u51FA\u975E\u7A7A\u9009\u533A\u5C31\u7ACB\u523B\u6E05\u6389\uFF0C\u7CFB\u7EDF\u83DC\u5355\u6CA1\u5F97\u4F9D\u9644\n    const sel = document.getSelection();\n    if (!sel || sel.isCollapsed || sel.rangeCount === 0) return;\n    let n: Node | null = sel.anchorNode;\n    if (n && n.nodeType === Node.TEXT_NODE) n = n.parentElement;\n    for (let el = n as HTMLElement | null; el; el = el.parentElement) if (isTextTarget(el)) return;\n    sel.removeAllRanges();\n  });\n  for (const s of surfaces) {\n    s.addEventListener(\"contextmenu\", (e) => { if (!isTextTarget(e.target)) e.preventDefault(); });\n    // \u9762\u4E0A\u5D4C\u7740\u7684\u539F\u751F\u6EDA\u52A8\u533A\u653E\u884C\uFF1Atouchstart \u4E00 preventDefault \u6D4F\u89C8\u5668\u5C31\u4E0D\u6EDA\u5B83\u4E86\u2014\u2014\u901F\u5EA6\u6846\u91CC\u7684\u6EDA\u8F6E .drum-col\uFF08user 2026-10-07\u300C\u8282\u62CD\u5668\u7684\u6EDA\u52A8\u9009\u6570\u5B57\u597D\u50CF\u4E5F\u574F\u4E86\u300D= iPad \u4E0A\u62E8\u4E0D\u52A8\uFF09\u3001\n    //   pad \u7684\u7B26\u53F7\u5C42\uFF08\u9AD8\u5EA6\u9489\u5728\u97F3\u952E\u90A3\u51E0\u6392\u3001\u591A\u4E86\u7684\u683C\u5B50\u5728\u91CC\u9762\u6EDA\uFF1Buser 2026-10-08\u300C\u591A\u51FA\u6765\u7684\u6EA2\u51FA\u7684\u53EF\u4EE5\u6EDA\u952E\u76D8\u300D\uFF09\n    s.addEventListener(\"touchstart\", (e) => { if (e.touches.length === 1 && !isTextTarget(e.target) && !(e.target as HTMLElement).closest?.(\".drum-col, .pad-grid.symbols\")) e.preventDefault(); }, { passive: false });\n  }\n}\n", "// pad-layout.ts \u2014\u2014 pad \u7B26\u53F7\u683C\u7684\u5E03\u5C40\uFF08\u4E09\u9875\u5404\u653E\u54EA\u4E9B\u6309\u952E id\uFF09+ \u5F80\u5916\u53D1\u7684\u6309\u952E id \u5168\u96C6\u3002\u7EAF\u6570\u636E\uFF0C\u4E0D\u78B0 DOM\uFF0Cnode \u6D4B\u8BD5\u76F4\u63A5 import\u3002\n// created 2026-10-15 by Claude Fable 5.1\uFF08\u952E\u76D8\u6A21\u5757\u5200 2\uFF0C\u4ECE pad.ts \u91CC\u62BD\u51FA\u6765\uFF1B\u5185\u5BB9 = 2026-10-08 Opus 5.5 \u7684\u4E09\u9875\uFF0C\u4F4D\u7F6E\u6CA1\u52A8\uFF09\u3002\n//   \u6309\u952E id \u662F\u952E\u76D8\u548C\u5BBF\u4E3B\u4E4B\u95F4\u7684\u8BCD\uFF1A\u952E\u76D8\u53EA\u53D1 id\uFF08pad.ts \u2192 PadHost.onKey\uFF09\uFF0C\u7FFB\u8BD1\u6210\u547D\u4EE4 / \u63D2\u8BB0\u53F7 / \u5F00\u83DC\u5355\u5F52 src/app/pad-keys.ts\uFF1Btest/pad-keys.test.ts \u5B88\u7740\u4E00\u4E2A\u90FD\u4E0D\u6F0F\u3002\n\n/** \u7B26\u53F7\u5C42\u4E09\u9875\uFF082026-10-08 Opus 5.5 \u63D0\u3001user\u300C\u53EF\u4EE5\u300D\uFF09\uFF1A\u4E00\u9875\u4E00\u822C\u653E\u5F97\u4E0B\uFF084 \u5217 3 \u6392 = 12\uFF09\uFF0C\u4F4D\u7F6E\u56FA\u5B9A\u597D\u8BB0\u3002\u6F14\u594F\u6CD5 = \u4E0A\u4E00\u6392\u97F3\u5934\u3001\u4E0B\u4E00\u6392\u957F\u77ED / \u8FDE\u65AD\uFF1B\u529B\u5EA6 = \u529B\u5EA6\u3001\u6E10\u5F3A\u6E10\u5F31\u3001\u97F3\u5185\u8D77\u4F0F\uFF1B\u8BB0\u53F7 = \u53E5\u53F7\u3001\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\uFF08\u5927\u8C31\u8868\u591A\u6362\u8C31\u8868\uFF09\u3002 */\nexport type SymPage = \"art\" | \"dyn\" | \"mark\";\nexport const SYM_PAGES: Record<SymPage, readonly string[]> = {\n  art: [\"art:ghost\", \"art:unstress\", \"art:stress\", \"art:accent\", \"art:marcato\", \"art:sfz\", \"art:fp\", \"art:tenuto\", \"art:staccato\", \"slur\", \"art:breath\", \"inhale:soft\", \"inhale:big\", \"art:whisper\", \"swell:<\", \"swell:>\", \"swell:<>\", \"art:arpeggio\"],   // 2026-10-10\uFF1A\u51FA\u58F0\u7684\u6362\u6C14\uFF08\u8F7B\u5438 / \u6DF1\u5438\uFF09\u3001\u6C14\u58F0\uFF08\u00D7 \u7B26\u5934\uFF09   // \u4ECE\u8F7B\u5230\u91CD\u4E00\u8DEF\u6392\u4E0B\u6765\uFF08\u5F3A\u5EA6\u7684\u9636\u68AF\uFF09\uFF0C\u518D\u662F\u957F\u77ED / \u8FDE\u65AD\n  dyn: [\"dyn:ppp\", \"dyn:pp\", \"dyn:p\", \"dyn:mp\", \"dyn:mf\", \"dyn:f\", \"dyn:ff\", \"dyn:fff\", \"wedge:cresc\", \"wedge:dim\", \"dyn:ramp\"],   // \u97F3\u5185\u6E10\u5F3A / \u6E10\u5F31 / \u9F13\u8D77\u642C\u5230\u300C\u6F14\u594F\u6CD5\u300D\uFF08v0.9.44\uFF1Buser\u300C\u2026\u5E94\u8BE5\u5C5E\u4E8E\u6F14\u594F\u6CD5\u2026\u56E0\u4E3A\u662F\u8DDF\u7740\u97F3\u7B26\u7684\u300D\uFF09   // ppp\u2026fff \u4E24\u6574\u6392\uFF08v0.9.23\uFF09\n  mark: [\"phrase\", \"key\", \"time\", \"tempo\", \"clef\", \"ottava\", \"groove\", \"repeat\", \"staff\"],   // \u8C31\u53F7 / \u516B\u5EA6\u7EBF\uFF08v0.9.28\uFF09\n};\nexport const SYM_PAGE_NAME: Record<SymPage, string> = { art: \"\u6F14\u594F\u6CD5\", dyn: \"\u529B\u5EA6\", mark: \"\u8BB0\u53F7\" };\nexport const SYM_PAGE_TITLE: Record<SymPage, string> = { art: \"\u5F3A\u5EA6\uFF08\u5E7D\u7075\u97F3 / \u5F31\u5316 / \u6B21\u91CD\u97F3 / \u91CD\u97F3 / \u5F3A\u97F3 / \u7A81\u5F3A / \u5F3A\u540E\u5373\u5F31\uFF09\u3001\u4FDD\u6301 / \u8DF3\u97F3 / \u8FDE\u7EBF / \u547C\u5438\uFF08\u9759\u9ED8 / \u8F7B\u5438 / \u6DF1\u5438\uFF09\u3001\u6C14\u58F0\", dyn: \"ppp\u2026fff\u3001\u6E10\u5F3A / \u6E10\u5F31\u3001\u6E10\u5230\u3001\u97F3\u5185\u8D77\u4F0F\", mark: \"\u53E5\u53F7\u3001\u8C03\u53F7 / \u62CD\u53F7 / \u8C31\u53F7 / \u516B\u5EA6\u7EBF / \u901F\u5EA6\u3001\u98CE\u683C\uFF08\u62CD\u5B50\u8F7B\u91CD\uFF09\" };\n\n/** \u5199\u97F3\u90A3\u4E00\u6392\u5F80\u5916\u53D1\u7684\u6309\u952E id\uFF08\u2190 \u2192 \u4F11\u6B62 \u5C0F\u8282\u7EBF \u547C\u5438 \u62C9\u957F \u9000\u683C\uFF1B\u7B26\u53F7\u5C42\u5F00\u7740\u65F6\u9000\u683C = symBackspace\uFF1B\u300C\u22EF\u300D\u91CC\u7684\u300C\u6362\u8C31\u8868\u300D= staff\uFF09\u3002 */\nexport const WRITE_KEY_IDS: readonly string[] = [\"caret:-1\", \"caret:1\", \"rest\", \"bar\", \"art:breath\", \"extend\", \"backspace\", \"symBackspace\", \"staff\"];\n/** \u5168\u90E8\u6309\u952E id\uFF08\u5199\u5B57\u952E + \u7B26\u53F7\u683C\u4E09\u9875\uFF09\u3002\u300Cdyn:ramp\u300D\u662F\u952E\u76D8\u81EA\u5DF1\u7684\u4FEE\u9970\u952E\uFF08\u6E10\u5230\u7684\u9501\uFF09\uFF0C\u4E0D\u5F80\u5916\u53D1\u3002 */\nexport const PAD_KEY_IDS: readonly string[] = [...WRITE_KEY_IDS, ...Object.values(SYM_PAGES).flat().filter((id) => id !== \"dyn:ramp\" && !WRITE_KEY_IDS.includes(id))];\n", "// \u6EDA\u8F6E \u2192 \u51E0\u6B65\uFF08created by Claude Opus 5.5 2026-10-10\uFF09\uFF1Apad \u7684\u65CB\u94AE\u548C\u6DF7\u97F3\u53F0\u7684\u6ED1\u5757\u5171\u7528\u4E00\u4EFD\u3002\n// \u9F20\u6807\u6EDA\u8F6E\u4E00\u683C\uFF08Chrome \u62A5 100 px\u3001\u6309\u884C\u6A21\u5F0F\u62A5 3 \u884C\u2026\uFF09= \u6B63\u597D\u4E00\u6B65\uFF08user\u300C\u6EDA\u8F6E\u6EDA\u952E\u76D8\u7684range\u7684\u65F6\u5019\u5E94\u8BE5\u662F\u4E00\u884C\u884C\u6EDA\u800C\u4E0D\u662F\u4E24\u884C\u300D\n// \u300C\u9F20\u6807\u6EDA\u8F6E\u80FD\u4E0D\u80FD\u4E00\u683C\u4E00\u683C\u6EDA\u5404\u79CDslider\uFF0C\u5E2E\u52A9\u5F3A\u8FEB\u75C7\u300D\uFF09\uFF1B\u89E6\u63A7\u677F\u7684\u5C0F delta \u6512\u591F 40 px \u624D\u8D70\u4E00\u6B65\u3002\n\nconst STEP_PX = 40, NOTCH_PX = 50;\n\n/** \u8FD9\u4E00\u4E0B\u6EDA\u8F6E\u8D70\u51E0\u6B65\uFF08\u5F80\u4E0B\u6EDA = \u6B63\uFF09\uFF1Bacc = \u4E0A\u6B21\u6512\u4E0B\u7684\u96F6\u5934\uFF0C\u8FD4\u56DE\u65B0\u7684\u96F6\u5934\u3002 */\nexport function wheelSteps(e: Pick<WheelEvent, \"deltaMode\" | \"deltaY\">, acc: number): { steps: number; acc: number } {\n  // \u6309\u884C / \u6309\u9875\u62A5\u7684\u53EA\u4F1A\u662F\u9F20\u6807\u6EDA\u8F6E\uFF08Firefox \u4E00\u683C = 3 \u884C\uFF09\uFF0C\u4E00\u4E0B = \u4E00\u6B65\uFF1B\u539F\u6765\u6298\u6210 48 px \u5F53\u89E6\u63A7\u677F\u6512\uFF0C\u96F6\u5934\u6512\u6EE1\u4F1A\u4E00\u683C\u8D70\u4E24\u6B65\n  if (e.deltaMode !== 0) return { steps: Math.sign(e.deltaY), acc: 0 };\n  const px = e.deltaY;\n  if (Math.abs(px) >= NOTCH_PX) return { steps: Math.sign(px), acc: 0 };\n  const a = acc + px, steps = Math.trunc(a / STEP_PX);\n  return { steps, acc: a - steps * STEP_PX };\n}\n", "// pad.ts \u2014\u2014 \u624B\u6307\u9762\u677F = \u4E00\u53F0\u72EC\u7ACB\u7684 MEDO \u5F0F\u8F93\u5165\u8BBE\u5907\uFF08\u5047\u8BBE\u6CA1\u6709\u8C31\uFF09\uFF1A4 \u4E2A\u65CB\u94AE + 6 \u4E2A\u5199\u5B57\u952E + \u5360\u6EE1\u6574\u5BBD\u7684\u97F3\u952E\u7F51\u683C\uFF08\u81EA\u4E0A\u800C\u4E0B\uFF09\u3002\n// created 2026-10-06 by Claude Opus 5.5\uFF1B2026-10-07 UX-2 \u6539\uFF1B2026-10-07 \u665A \u6539\u6210\u72EC\u7ACB\u8BBE\u5907\uFF08\u4E0B\u9762\uFF09\n// \u6765\u5386\uFF08grill \u8D26\u672C Q10 / Q11 / UX-1 / UX-2 \u4E0E\u300Cpad \u7B80\u5316\u8BA8\u8BBA\u300D\uFF09\uFF1Auser\u300CDonner MEDO \u662Fgolden ui example\u2026\u6211\u53EA\u662F\u5F53ocarina\u6765\u6309\u300D\uFF1B\n//   \u300C\u628Apad\u60F3\u6210\u4E00\u4E2A\u72EC\u7ACB\u7684medo\u5F0F\u7684\u8F93\u5165\u8BBE\u5907\uFF0C\u5047\u8BBE\u6CA1\u6709\u8C31\u300D\u300C\u6570\u5B57\u952E\u76D8\u5DE6\u53F3\u5DE6\u53F3\u7A7A\u95F4\u8981\u5360\u6EE1\u300D\u300C\u9000\u683C\u5FC5\u987B\u6700\u53F3\u8FB9\u3002\u7136\u540E\u5C0F\u8282\u7EBF\u548C\u96F6\u548Cdash\u4E5F\u86EE\u6709\u5FC5\u8981\u7684\u300D\n//   \u300C\u6211\u8FD8\u9700\u8981\u5DE6\u53F3\u952E\u5BFC\u822A\u300D\u300C\u5F39\u5E94\u8BE5\u653E\u5728\u9876\u680F\u300D\u300C\u5199\u5B8C\u518D\u6539\u575A\u51B3\u4E0D\u884C\u2026\u5C31\u662F\u8BBE\u7F6E\u597Dduration\u57FA\u7EBF\u7136\u540E\u7528dash\u300D\u300C\u9000\u683C\u957F\u6309\u53EF\u4EE5\u591A\u5220\u300D\u3002\n// \u00B7 \u8BBE\u5907\u53EA\u5F80\u5916\u53D1\u4E8B\u4EF6\uFF08\u97F3 / \u4F11\u6B62 / \u2014 / \u5C0F\u8282\u7EBF / \u9000\u683C / \u2190 \u2192\uFF09\uFF0C\u81EA\u5DF1\u5E26\u65CB\u94AE\uFF1A\u8C03\uFF081=\uFF09\u3001\u957F\u77ED\u57FA\u7EBF\uFF08\u542B\u8FDE\u97F3\uFF09\u3001\u97F3\u57DF\u7A97\u53E3\u3002\n//   pad \u7684\u300C1=\u300D\u662F\u5B83\u81EA\u5DF1\u7684\uFF0C\u4E0D\u8DDF\u8C31\u4E0A\u7684\u8C03\u53F7\uFF08user\u300C\u5982\u679C\u4E00\u4E2A\u8C31\u6709\u597D\u51E0\u4E2A\u8C03\u600E\u4E48\u7B97\u300D\uFF09\uFF1B\u5199\u8FDB\u8C31\u65F6\u6309 pad \u7684\u8C03\u62FC\u5199\uFF0C\u8C31\u4E0A\u8BE5\u52A0\u4E34\u65F6\u8BB0\u53F7\u5C31\u52A0\u3002\n// \u00B7 \u65CB\u94AE = \u6700\u4E0A\u9762\u4E00\u6392\uFF08\u8BD5\u8FC7\u653E pad \u6700\u4E0B\u9762\uFF0Cuser\u300C\u522B\u626D\uFF0C\u8FD8\u662F\u653E\u5728\u4E0A\u9762\u5427\u300D\uFF09\uFF1A1= / \u957F\u77ED / \u97F3\u57DF\u4E09\u4E2A\u5206\u5BBD\u5EA6\uFF0C\u300C\u22EF\u300D\u662F\u53F3\u8FB9\u4E00\u4E2A\u5C0F\u65B9\u5757\uFF1B\n//   \u5199\u5B57\u952E\u91CC\u7684 \u2190 \u2192 \u4E5F\u662F\u540C\u6837\u5927\u5C0F\u7684\u65B9\u5757\uFF08user\u300C\u5E94\u8BE5\u662F\u65B9\u5F62\u7684\u4E0D\u5E94\u8BE5\u90A3\u4E48\u5BBD\u3002\u6B65\u8FDB\u4E5F\u505A\u6210\u56FA\u5B9A\u5BBD\u5EA6\u7684\uFF0C\u65B9\u4FBF\u808C\u8089\u8BB0\u5FC6\uFF0C\u4E5F\u8BB8\u4E5F\u662F\u540C\u6837\u5927\u5C0F\u7684\u5C0F\u65B9\u5F62\uFF1F\u300D\n//   \u300C\u6B65\u8FDB\u6211\u8BF4\u7684\u662F\u5DE6\u53F3\u300D\u300C...\u548C\u5DE6\u53F3\u5E94\u8BE5\u5BBD\u5EA6\u548C\u9AD8\u5EA6\u5DEE\u4E0D\u591A\uFF0C\u5176\u4ED6\u7684\u4E5F\u8BB8adaptive\u4E00\u4E9B\u300D\uFF09\uFF0C0 | \u2014 \u232B \u5206\u5269\u4E0B\u7684\u5BBD\uFF0C\u232B \u6700\u53F3\u3002\n//   \u97F3\u57DF\u5199\u300CF3\u2013G5\u300D\uFF1B\u65CB\u94AE\u592A\u7A84\u5C31\u4E24\u884C\uFF0C\u4E0B\u9762\u662F\u4F4E\u7684\u90A3\u5934\uFF08user\u300CG5F3\u5E94\u8BE5\u662FF3-G5\u5427\u300D\u300C\u4E5F\u8BB8\u4E0A\u4E0B\u4E24\u4E2A\u5427\uFF0C\u4E0B\u9762\u662Flower bound\u300D\uFF09\u3002\n//   \u6309\u4F4F\u4E0A\u4E0B\u6ED1 = \u5C31\u5728\u65CB\u94AE\u90A3\u4E00\u683C\u91CC\u6EDA\uFF0C\u50CF\u6C7D\u8F66\u91CC\u7A0B\u8868\u2014\u2014\u65CB\u94AE\u53D8\u6210\u4E00\u6247\u7A97\u3001\u6EDA\u8F6E\u85CF\u5728\u540E\u9762\uFF08user\u300Cin place\u6EDA\u7684\u65F6\u5019\u5E94\u8BE5\u662F\u539F\u6765\u7684\u94AE\u53D8\u6210\u4E00\u4E2A\u7A97\uFF0C\n//   \u6EDA\u8F6E\u85CF\u5728\u4E0B\u9762\uFF0C\u5C31\u50CF\u6C7D\u8F66\u91CC\u7A0B\u8868\u4E00\u6837\u300D\uFF09\uFF1B\u5185\u5BB9\u8DDF\u7740\u624B\u6307\u8D70\uFF0C\u5927\u7684\u5728\u4E0A\u2014\u2014\u97F3\u57DF\u5C31\u662F\u4E00\u5F20\u7EB8\uFF1A\u5F80\u4E0A\u63A8 = \u770B\u4E0B\u9762\u66F4\u4F4E\u7684\n//   \uFF08user\u300C\u5982\u679C\u952E\u76D8\u662F\u4E00\u4E2A\u53EF\u4EE5\u6ED1\u52A8\u7684\u7EB8\uFF0C\u90A3\u4E48\u4F60\u5F80\u4E0A\u6ED1\u5E94\u8BE5\u662F\u5F80\u4E0B\u770B\u300D\uFF09\uFF1B\u4E00\u6B21\u6700\u591A\u4E00\u683C\u3001\u6ED1\u51E0\u4E0B\u5C31\u662F\u51E0\u683C\uFF08user\u300Cin place\u7684\u65F6\u5019\u4E00\u6B21\u6700\u591A\u4E00\u683C\uFF0C\n//   \u8FD9\u6837\u65B9\u4FBF\u5FEB\u901Fswipe\u51E0\u6B21\u5C31\u662F\u51E0\u683C\u300D\uFF09\uFF1B\u677E\u624B\u7ACB\u523B\u505C\uFF08user\u300C\u624B\u6307\u677E\u4E86\u7ACB\u523B\u505C\uFF0C\u4E0D\u8981\u987F\u4E00\u4E0B\uFF0C\u8FD9\u662F\u5FEB\u901F\u8F93\u5165\u300D\uFF09\u3002\n//   \u53EA\u662F\u70B9\u4E00\u4E0B = \u4ECE\u90A3\u4E00\u683C\u5C55\u5F00\u4E00\u6839\u540C\u6837\u5BBD\u7684\u7AD6\u76F4\u6EDA\u8F6E\uFF08src/keyboard/drum.ts\uFF0C\u539F\u751F\u6EDA\u52A8\uFF09\uFF0C\u70B9\u683C\u5B50\u6216\u6EDA\u5230\u54EA\u5C31\u662F\u54EA\n//   \uFF08user\u300C\u90A3\u4E9B\u4E0A\u4E0B\u53EF\u4EE5\u6ED1\u6216\u8005\u70B9\u5F00\u9009\u5BF9\u5427\u300D\u300C\u6211\u60F3\u7684\u662F\u70B9\u4E86\u4E4B\u540E\u53D8\u6210\u4E00\u4E2Aoverlay\u7684\u540C\u6837\u5BBD\u5EA6\u7684\u7AD6\u76F4\u6EDA\u52A8\u6876\u300D\uFF1B\u957F\u77ED\u90A3\u6839\u65C1\u8FB9\u5E76\u4E00\u6839\u7A84\u7684\u8FDE\u97F3\u6EDA\u8F6E\u300C2\u597D\u4E3B\u610F\u300D\uFF0C\n//   \u8FDE\u97F3\u753B\u6210\u771F\u7684\u4E00\u7EC4\u5C0F\u874C\u86AA\u3001\u8DDF\u7740\u957F\u77ED\u53D8\uFF1Auser\u300C\u4E09\u8054\u6211\u662F\u8BF4\u753B\u5177\u4F53\u7684\u5C0F\u874C\u86AA\u300D\u300C\u4E09\u8054\u4E94\u8054\u7684\u5C0F\u874C\u86AA\u5E94\u8BE5\u8DDF\u7740base\u65F6\u503Cadaptive\u7684\u53D8\u300D\uFF09\u3002\u6CA1\u6709\u300C\u672C\u8C03\u300D\u3002\n//   \u79FB\u8C03\uFF08\u6709\u9009\u4E2D\u65F6\uFF09\u548C\u300C\u22EF\u300D\u662F\u4E00\u6B21\u6027\u7684\u52A8\u4F5C\u3001\u4E0D\u662F\u9009\u4E00\u4E2A\u503C\uFF1A\u70B9\u4E86\u6574\u6392\u6362\u6210\u5019\u9009\u3002\n// \u00B7 \u97F3\u952E\uFF1A\u6309\u4E0B\u5373\u5199\uFF08\u624B\u611F\u4E0D\u53D8\uFF09\uFF1B\u6309\u7740\u5F80\u4E0A / \u5F80\u4E0B\u6ED1\u8FC7\u95E8\u69DB = \u8FD9\u4E00\u4E2A\u97F3\u5347 / \u964D\u534A\u97F3\uFF08\u4E34\u65F6\u79BB\u8C03\uFF0C\u53EA\u7BA1\u8FD9\u4E00\u4E2A\u97F3\uFF09\uFF0C\n//   \u677E\u624B\u524D\u952E\u4E0A\u5148\u663E\u793A\u7ED3\u679C\u3001\u6ED1\u56DE\u4E2D\u95F4 = \u8FD8\u539F\uFF08user\u300Ctouchscreen\u6ED1\u52A8\u5929\u5929\u505A\u7684\u2026\u4E0A\u4E0B\u2026\u6ED1\u52A8\u4F1A\u975E\u5E38\u9002\u5408\u4E34\u65F6\u79BB\u8C03\u300D\u300C\u6ED1\u8FC7\u4E00\u5B9A\u8DDD\u79BB\u624D\u7B97 + \u677E\u624B\u524D\u5148\u663E\u793A\u7ED3\u679C \u540C\u610F\u300D\uFF09\u3002\n// \u00B7 \u97F3\u952E\u6392\u6CD5\uFF1A\u5217 \u00D7 \u884C\uFF08\u9ED8\u8BA4 4 \u00D7 4\uFF09\uFF0C\u4E2D\u592E C \u90A3\u4E00\u884C\u5728\u4E2D\u7EBF\u4E0B\u9762\u4E00\u884C\uFF1B\u9996\u8C03 / \u7EDD\u5BF9\u4E24\u6863\uFF08\u9ED8\u8BA4\u7EDD\u5BF9\uFF0C\u5927\u5B57\u6C38\u8FDC\u662F\u7B80\u8C31\u6570\u5B57\uFF09\uFF1B\n//   \u952E\u9AD8 / \u952E\u7F1D\u7167 WXHW \u91CF\u7684 iOS \u952E\u76D8\uFF08\u5E73\u677F 55.5 / 9\uFF0C\u624B\u673A 46 / 6\uFF0C\u5DE6\u53F3 5\uFF09\u3002\n// \u00B7 \u300C1\u300D\u4E0D\u7279\u522B\u6807\uFF08user\u300C\u952E\u76D8\u4E0A\u9762\u76841\u4E0D\u7528\u4E13\u95E8\u5F3A\u8C03\uFF0C\u8FD9\u6837\u5BB9\u6613\u548C\u7070\u8272\u6DF7\u6DC6\u300D\uFF09\uFF1B\u97F3\u57DF\u63D0\u793A\u6539\u6210\u6B63\u9762\u7684\uFF1A\u6708\u8BFB\u97F3\u57DF\u91CC\u7684\u952E\u5E95\u90E8\u4E00\u9053\u7EC6\u6761\uFF0C\n//   \u97F3\u57DF\u5916\u7684\u952E\u5C31\u662F\u666E\u901A\u7684\u952E\uFF0C\u4E0D\u53D8\u7070\uFF08user\u300C\u7070\u8272\u4E5F\u6362\u4E00\u4E2Arepresentation\uFF0C\u4E0D\u7136\u5BB9\u6613\u4EE5\u4E3A\u662Funavailable\uFF0C\u800C\u4E0D\u662Fnot hinted\u300D\uFF09\u3002\n// \u00B7 \u300C\u5F39\u300D\u4E0D\u5728 pad \u4E0A\uFF08\u9876\u680F\uFF09\uFF1B\u5F39\u7684\u65F6\u5019\u97F3\u952E\u5916\u9762\u4E0D\u753B\u6846\uFF08user\u300C\u5F39\u65F6\u5019\u7684\u90A3\u5708\u5947\u602A\u7684\u6846\u4E0D\u8981\u300D\uFF09\u3002\n// \u00B7 \u6709\u9009\u4E2D\uFF08\u6539\uFF09\u7684\u65F6\u5019\u300C1=\u300D\u65CB\u94AE\u53D8\u6210\u300C\u79FB\u8C03\u300D\uFF1A\u70B9\u4E86 = \u534A\u97F3 / \u5168\u97F3 / \u516B\u5EA6 / \u8F6C\u8C03\u2026\n\n// \u00B7 2026-10-15\uFF08\u952E\u76D8\u6A21\u5757\u5200 2\uFF0CClaude Fable 5.1\uFF09\uFF1Apad \u662F\u7EAF\u524D\u7AEF\uFF0C\u4E0D\u61C2\u97F3\u4E50\u2014\u2014user 10-14\u300C\u952E\u76D8\u786E\u5B9E\u662F\u524D\u7AEF\uFF0C\u97F3\u4E50\u77E5\u8BC6\u6BD4\u5982\u548C\u5F26\u6709\u51E0\u4E2A\u662F\u5916\u90E8\u6CE8\u5165\u7684\u2026\n//   \u7136\u540E\u51FA\u6765\u7684\u4E5F\u662F\u6309\u952E\u800C\u4E0D\u662F\u548C\u5F26\uFF0C\u7FFB\u8BD1\u6210\u97F3\u7B26\u8F93\u5165\u522B\u7684\u4EBA\u7BA1\u3002\u952E\u76D8\u53EA\u7BA1\u4EA4\u4E92\u72B6\u6001\u673A\uFF0C\u5B83\u4E0D\u61C2\u97F3\u4E50\u300D\u3002\u97F3\u952E\u53EA\u8BA4\u300C\u7B2C k \u7EA7\u300D\uFF08PadMusic \u7ED9\u5B83\u662F\u4EC0\u4E48\u97F3\u3001\u600E\u4E48\u6807\uFF09\uFF0C\n//   \u5199\u5B57\u952E / \u7B26\u53F7\u683C\u5F80\u5916\u53D1\u6309\u952E id\uFF08\u7FFB\u8BD1\u6210\u547D\u4EE4 = src/app/pad-keys.ts\uFF09\uFF0C\u8C31\u7684\u8F93\u5165\u6001\u53EA\u770B\u4E00\u5F20\u5C0F\u5FEB\u7167\uFF08PadView\uFF09\u3002\u4E0D import src/score/*\u3002\nimport { LATCH_OFF, latchTap, latchWrite, latchOn, type Latch } from \"./latch.ts\";\nimport { hint } from \"./keys.ts\";\nimport { type SymPage, SYM_PAGES, SYM_PAGE_NAME, SYM_PAGE_TITLE } from \"./pad-layout.ts\";   // \u7B26\u53F7\u683C\u4E09\u9875\u7684\u5E03\u5C40\uFF08\u54EA\u4E2A id \u5728\u54EA\u4E00\u9875\uFF09\uFF1B\u6309\u952E id \u7684\u5168\u96C6\u4E5F\u5728\u90A3\u513F\nimport { openDrum, type DrumHandle } from \"./drum.ts\";\nimport { wheelSteps } from \"./wheel.ts\";\n\n/** \u6708\u8BFB\u7684\u97F3\u57DF A3\u2013E5\uFF08MIDI\uFF09\uFF1A\u952E\u5E95\u90E8\u753B\u7EC6\u6761\u63D0\u793A\uFF0C\u97F3\u57DF\u5916\u4E0D\u62E6\u3001\u4E0D\u53D8\u7070\u3002\u5BBF\u4E3B\u4E0D\u7ED9\u63D0\u793A\u97F3\u57DF\u65F6\uFF08hintRange \u6CA1\u63A5\uFF09\u7528\u5B83\u3002 */\n/** \u63D0\u793A\u97F3\u57DF\uFF1A\u8C01\u5728\u5F39\uFF08\u5BBF\u4E3B\u8BF4\uFF09+ \u5979 / \u5B83\u7684\u97F3\u57DF\uFF08MIDI\uFF0C\u542B\u4E24\u7AEF\uFF09\u3002null = \u4E0D\u753B\u63D0\u793A\u3002 */\nexport type HintRange = { lo: number; hi: number; who: string; title?: string } | null;   // title = \u952E\u4E0A\u7684\u63D0\u793A\u5B57\uFF08\u6CA1\u6709 = \u300C\u8C01\u7684\u97F3\u57DF\u91CC\u300D\uFF09\n/** \u4E00\u4E2A\u97F3\u952E\uFF08\u8C03\u5F0F\u68AF\u5B50\u4E0A\u7B2C k \u7EA7\uFF09\u957F\u4EC0\u4E48\u6837\uFF1A\u7B80\u8C31\u6570\u5B57\uFF08\u542B \u266F\u266D\uFF09\u3001\u516B\u5EA6\u70B9\uFF08\u6B63 = \u4E0A\u9762\u51E0\u4E2A\u3001\u8D1F = \u4E0B\u9762\u51E0\u4E2A\uFF09\u3001\u7EDD\u5BF9\u540D\u3001MIDI\uFF08\u53EA\u62FF\u6765\u6BD4\u300C\u6309\u7740\u7684\u300D\u548C\u97F3\u57DF\u63D0\u793A\uFF09\u3002 */\nexport interface PadCell { deg: string; oct: number; abs: string; midi: number }\n/** \u97F3\u4E50\u77E5\u8BC6\uFF08\u5BBF\u4E3B\u6CE8\u5165\uFF0Csrc/app/pad-music.ts\uFF09\uFF1A\u65B9\u6CD5\u90FD\u8BFB\u300C\u73B0\u5728\u300D\u7684\u8C03 / \u8C03\u5F0F\uFF0Cpad \u4E0D\u7F13\u5B58\uFF1Bsig() \u53D8\u4E86 = \u7F51\u683C\u91CD\u5EFA\u3002\u4EE5\u540E\u7684\u548C\u5F26\u952E\u76D8 = \u53E6\u4E00\u4E2A PadMusic\u3002 */\nexport interface PadMusic {\n  sig(): string;\n  cell(k: number): PadCell;\n  /** \u7B2C k \u7EA7\u4E34\u65F6\u5347 / \u964D a \u4E4B\u540E\u7684\u7EDD\u5BF9\u540D\uFF08\u97F3\u952E\u5C0F\u5B57\uFF09\u3002 */\n  altered(k: number, a: number): string;\n  /** \u7F51\u683C\u7684\u951A\u70B9\uFF08\u7B2C\u51E0\u7EA7\uFF09\uFF1A\u7EDD\u5BF9 = \u4E2D\u592E C \u90A3\u4E00\u884C\uFF08\u6216\u5B83\u4E0A\u9762\u7B2C\u4E00\u4E2A\u8C03\u5F0F\u97F3\uFF09\uFF1B\u9996\u8C03 = \u4E3B\u97F3\u3002 */\n  anchor(layout: \"absolute\" | \"movable\"): number;\n  /** \u300C1=\u300D\u65CB\u94AE\uFF1A\u6BCF\u4E00\u6863\u7684\u5B57\uFF08\u5927\u7684\u5728\u4E0A\uFF09+ \u73B0\u5728\u662F\u7B2C\u51E0\u6863 + \u65CB\u94AE\u4E0A\u7684\u4EBA\u8BDD\u540D\uFF08\u63D0\u793A\u7528\uFF09\u3002 */\n  keyChoices(): { items: string[]; index: number; name: string };\n  /** \u300C1=\u300D\u70B9\u5F00\u7684\u4E24\u5217\u6EDA\u8F6E\uFF1A\u8C03 / \u8C03\u5F0F\u3002 */\n  keyDrum(): { keys: { items: string[]; index: number }; scales: { items: string[]; index: number } };\n  /** \u300C\u22EF\u300D\u91CC\u63D2\u8BB0\u53F7\u94AE\u4E0A\u7684\u73B0\u503C\uFF1A\u8C03\u53F7\uFF08\u4EBA\u8BDD\u8C03\u540D\uFF09/ \u62CD\u53F7 / \u901F\u5EA6\u3002 */\n  marksHere(): { key: string; beats: number; beatType: number; bpm: number };\n}\n/** \u8C31\u7684\u8F93\u5165\u6001\u91CC\u952E\u76D8\u8981\u770B\u7684\u90A3\u51E0\u6837\uFF08\u5BBF\u4E3B\u6BCF\u6B21\u7ED9\u5FEB\u7167\uFF09\u3002 */\nexport interface PadView {\n  unit: number; tuplet: number;                 // \u957F\u77ED\u57FA\u7EBF / \u8FDE\u97F3\uFF08\u65CB\u94AE\u4E0A\u7684\u5B57\uFF09\n  acc: number; accMode: \"off\" | \"once\" | \"lock\";   // \u5347\u964D Shift \u7684\u72B6\u6001\uFF08\u952E\u4E0A\u4EAE\u6CD5 + \u97F3\u952E\u5C0F\u5B57\uFF09\n  one: boolean;      // \u53EA\u9009\u4E86\u4E00\u4E2A\uFF08\u53E0\u4EAE\u7740\uFF1B\u232B = \u77ED\u4E00\u6B65\u3001\u2014 = \u957F\u4E00\u6B65\uFF09\n  hasSel: boolean;   // \u6709\u9009\u533A\uFF08\u5934\u90A3\u6392\u7684\u91CD\u5EFA\u7B7E\u540D\uFF09\n}\n/** \u5347\u964D\u952E\u9009\u7684\u662F\u54EA\u4E00\u79CD\uFF1A\uD834\uDD2A \u266F \u266D \uD834\uDD2B\u3002 */\nexport type AccSel = -2 | -1 | 1 | 2;\n/** \u8BBE\u5907\u5F62\u6001\uFF08\u540C WXHW src/input/dock.ts\uFF09\uFF1A\u77ED\u8FB9 \u2265 600 \u4E14\u5BBD \u2265 700 = \u5E73\u677F\u3002 */\nconst padForm = (): \"tablet\" | \"phone\" => (Math.min(innerWidth, innerHeight) >= 600 && innerWidth >= 700 ? \"tablet\" : \"phone\");\n/** \u5E03\u5C40\u91CC\u884C / \u5217\u80FD\u8C03\u7684\u8303\u56F4\uFF08\u52A0\u51CF\u53F7\u5230\u5934\u5C31\u7070\uFF09\u3002 */\n/** \u7B26\u53F7\u5C42\u300C\u8FDE\u7EBF\u300D\u683C\u5B50\uFF1A\u4E00\u9053\u5F27\uFF08SMuFL \u6CA1\u6709\u5355\u4E2A\u8FDE\u7EBF\u5B57\u5F62\uFF09\u3002 */\nconst SLUR_CELL = `<svg class=\"slur-ico\" viewBox=\"0 0 22 12\" aria-hidden=\"true\"><path d=\"M2,9 Q11,1 20,9\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\"/></svg>`;\nconst RAMP_CELL = `<svg class=\"slur-ico\" viewBox=\"0 0 22 12\" aria-hidden=\"true\"><path d=\"M20,2 L3,6 L20,10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-dasharray=\"3 2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;   // \u6E10\u5230 = \u865A\u7EBF\u53D1\u5939\nconst CRESC_CELL = `<svg class=\"slur-ico\" viewBox=\"0 0 22 12\" aria-hidden=\"true\"><path d=\"M20,2 L3,6 L20,10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\nconst DIM_CELL = `<svg class=\"slur-ico\" viewBox=\"0 0 22 12\" aria-hidden=\"true\"><path d=\"M2,2 L19,6 L2,10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n/** \u529B\u5EA6\u8BB0\u53F7\u7684 Bravura \u5B57\u5F62\uFF08\u540C\u9009\u533A\u6761\u300C\u4FEE\u300D\uFF09\u3002 */\nconst DYN_CELL = { ppp: \"\\u{E52A}\", pp: \"\\u{E52B}\", p: \"\\u{E520}\", mp: \"\\u{E52C}\", mf: \"\\u{E52D}\", f: \"\\u{E522}\", ff: \"\\u{E52F}\", fff: \"\\u{E530}\" } as const;\n/** \u97F3\u5185\u8D77\u4F0F\u7684\u683C\u5B50\uFF1A\u4E00\u4E2A\u7B26\u5934\u4E0A\u9762\u4E00\u4E2A\u5C0F\u53D1\u5939\u3002 */\nconst swellSvg = (d: string) => `<svg class=\"slur-ico\" viewBox=\"0 0 22 16\" aria-hidden=\"true\"><path d=\"${d}\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><ellipse cx=\"11\" cy=\"13\" rx=\"3.2\" ry=\"2.3\" fill=\"currentColor\"/></svg>`;\nconst SWELL_CELL = { \"<\": swellSvg(\"M19,2 L4,5.5 L19,9\"), \">\": swellSvg(\"M3,2 L18,5.5 L3,9\"), \"<>\": swellSvg(\"M2,5.5 L11,2 L20,5.5 M2,5.5 L11,9 L20,5.5\") } as const;\nconst ROWS_MIN = 3, ROWS_MAX = 8, COLS_MIN = 3, COLS_MAX = 7;\n/** \u952E\u9AD8 + \u4E0A\u4E0B\u7F1D\uFF08px\uFF09= styles.css \u7684 --key-h / --kgv\uFF08\u7167 WXHW \u91CF\u7684 iOS \u952E\u76D8\uFF09\u3002 */\nconst KEY_METRIC = { tablet: { h: 55.5, gap: 9 }, phone: { h: 46, gap: 6 } } as const;\nconst SWIPE = 20;       // px\uFF1A\u97F3\u952E\u4E0A\u4E0B\u6ED1\u8FC7\u8FD9\u4E48\u8FDC\u624D\u7B97\u5347 / \u964D\n/** \u5347\u964D\u952E\u7684\u56DB\u79CD\uFF0C\u4E0A\u9762\u7684\u66F4\u5347\uFF08\u6ED1\u7740\u6362\uFF1A\u5F80\u4E0A = \u66F4\u5347\uFF09\uFF1B\u952E\u4E0A\u7684\u5B57\uFF08Bravura\uFF1A\uD834\uDD2B \u266D \u00B7 \u266F \uD834\uDD2A\uFF09\uFF1B\u97F3\u952E\u4E0A\u7684\u5C0F\u5B57\u3002 */\nconst ACC_ORDER: AccSel[] = [2, 1, -1, -2];\nconst ACC_GLYPH = [\"\\uE264\", \"\\uE260\", \"\", \"\\uE262\", \"\\uE263\"];\nconst ACC_TEXT = [\"\u266D\u266D\", \"\u266D\", \"\", \"\u266F\", \"\u266F\u266F\"];\nconst STEP = 28;        // px\uFF1A\u65CB\u94AE\u4E0A\u6ED1\u8FD9\u4E48\u8FDC = \u7A97\u91CC\u6EDA\u4E00\u6574\u683C\uFF08\u4E00\u6B21\u6700\u591A\u4E00\u683C\uFF0C\u8FC7\u534A\u683C\u5C31\u7B97\uFF09\nconst MOVE = 6;         // px\uFF1A\u6309\u4E0B\u65CB\u94AE\u632A\u8FC7\u8FD9\u4E48\u8FDC\u624D\u7B97\u300C\u6ED1\u300D\uFF1B\u6CA1\u632A\u5C31\u677E\u624B = \u70B9\uFF08\u5C55\u5F00\u6EDA\u8F6E\uFF09\nconst STACK = 150;      // px\uFF1A\u300C1=\u300D\u65CB\u94AE\u6BD4\u8FD9\u7A84 = \u8C03\u548C\u8C03\u5F0F\u540D\u5206\u4E24\u884C\u5199\nconst NARROW = 96;      // px\uFF1A\u97F3\u57DF\u65CB\u94AE\u6BD4\u8FD9\u7A84 = \u4E00\u884C\u5199\u4E0D\u4E0B\u300CF\u266F3\u2013G\u266F5\u300D\uFF0C\u6539\u4E24\u884C\nconst TIGHT = 130;      // px\uFF1A\u97F3\u57DF\u65CB\u94AE\u6BD4\u8FD9\u7A84 = \u4E00\u884C\u5B57\u548C \u21C5 \u6324\u5728\u4E00\u8D77\uFF0C\u8FD9\u4E00\u4E2A\u4E0D\u753B \u21C5\uFF08\u53E6\u5916\u4E24\u4E2A\u65CB\u94AE\u4E0A\u6709\uFF0C\u624B\u52BF\u4E00\u6837\uFF09\nconst UNITS = [0, 1, 2, 3, 4, 5];          // \u957F\u77ED\uFF0C\u77ED\u7684\u5728\u4E0A\uFF1A\u4E09\u5341\u4E8C\u5206 \u2026 \u5168\u97F3\u7B26\u2014\u2014\u5F80\u4E0A\u63A8 = \u53D8\u957F = \u53D8\u6162\uFF08user 2026-10-07\u300C\u97F3\u7B26\u65F6\u957F\u7684\u6EDA\u52A8\u65B9\u5411\u7FFB\u4E00\u4E0B\uFF0C\u5F80\u4E0A\u63A8\u662F\u53D8\u6162\u300D\uFF09\nconst TUP = [0, 3, 5, 6, 7] as const;      // \u8FDE\u97F3\uFF1A\u4E0D\u8FDE / 3 / 5 / 6 / 7\nconst SHIFTS = [4, 3, 2, 1, 0, -1, -2, -3, -4];   // \u97F3\u57DF\u7A97\u53E3\uFF0C\u9AD8\u7684\u5728\u4E0A\n/** \u7B80\u8C31\u7684\u516B\u5EA6\u70B9\uFF1A\u771F\u7684\u5C0F\u5706\u70B9\uFF08\u6570\u5B57\u4E0A\u65B9 = \u9AD8\u516B\u5EA6\u3001\u4E0B\u65B9 = \u4F4E\u516B\u5EA6\uFF0C\u591A\u4E2A\u6A2A\u6392\uFF09\u3002 */\nconst octDots = (n: number) => (n > 0 ? `<span class=\"jp-dots\">${\"<i></i>\".repeat(n)}</span>` : `<span class=\"jp-dots\"></span>`);\n/** Bravura \u7684\u6574\u4E2A\u97F3\u7B26\u5B57\u5F62\uFF08SMuFL \u9884\u7EC4\u5408\u97F3\u7B26\uFF0C\u7B26\u5E72\u671D\u4E0A\uFF09\uFF1A\u4E09\u5341\u4E8C\u5206 \u2026 \u5168\u97F3\u7B26\u3002 */\nconst UNIT_GLYPH = [\"\\uE1DB\", \"\\uE1D9\", \"\\uE1D7\", \"\\uE1D5\", \"\\uE1D3\", \"\\uE1D2\"];   // SMuFL note32ndUp / 16thUp / 8thUp / QuarterUp / HalfUp / Whole\uFF08\u5199\u6210\u8F6C\u4E49\uFF0C\u514D\u5F97\u7F16\u8F91\u5668\u541E\u6389\u79C1\u7528\u533A\u5B57\u7B26\uFF09\n/** \u63D2\u8BB0\u53F7\u6309\u94AE\u4E0A\u7684\u97F3\u4E50\u7B26\u53F7\uFF08Bravura\uFF1BSMuFL timeSig0\u20139 = U+E080\u2013E089\u3001metNoteQuarterUp\uFF09\u3002\u5199\u6210\u8F6C\u4E49\uFF0C\u514D\u5F97\u7F16\u8F91\u5668\u541E\u6389\u79C1\u7528\u533A\u5B57\u7B26\u3002 */\nconst QUARTER = \"\\uECA5\", TS = (n: number) => String.fromCodePoint(0xe080 + n);   // QUARTER = metNoteQuarterUp\uFF08\u901F\u5EA6\u8BB0\u53F7\u91CC\u7528\u7684\u5C0F\u53F7\u97F3\u7B26\uFF09\nconst UNIT_NAME = [\"\u4E09\u5341\u4E8C\u5206\", \"\u5341\u516D\u5206\", \"\u516B\u5206\", \"\u56DB\u5206\", \"\u4E8C\u5206\", \"\u5168\u97F3\u7B26\"];\n/** \u8FDE\u97F3\u7684\u6837\u5B50 = \u771F\u753B\u4E00\u7EC4 n \u4E2A\u5C0F\u874C\u86AA\uFF0C\u8DDF\u7740\u957F\u77ED\u57FA\u7EBF\u53D8\uFF1A\u4E09\u5341\u4E8C\u5206 3 \u9053\u6A2A\u6881\u3001\u5341\u516D\u5206 2 \u9053\u3001\u516B\u5206 1 \u9053\u3001\u56DB\u5206\u53EA\u6709\u7B26\u5E72\u3001\u4E8C\u5206\u7A7A\u5FC3\u3001\u5168\u97F3\u7B26\u7A7A\u5FC3\u6CA1\u7B26\u5E72\uFF1B\n *  \u4E0A\u9762\u4E00\u9053\u62EC\u53F7\uFF0C\u4E2D\u95F4\u662F\u8FDE\u97F3\u6570\u5B57\uFF08Bravura tuplet0\u20139 = U+E880\u2013E889\uFF09\u3002user\u300C\u4E09\u8054\u6211\u662F\u8BF4\u753B\u5177\u4F53\u7684\u5C0F\u874C\u86AA\u300D\u300C\u4E09\u8054\u4E94\u8054\u7684\u5C0F\u874C\u86AA\u5E94\u8BE5\u8DDF\u7740base\u65F6\u503Cadaptive\u7684\u53D8\u300D\u3002 */\nfunction tupletMark(n: number, unit: number): string {\n  const S = 7, M = 1.5, HY = 25, TOP = 11.5, hx = (i: number) => M + 3 + i * S, sx = (i: number) => hx(i) + 2.35;\n  const W = hx(n - 1) + 3 + M, hollow = unit >= 4, beams = Math.max(0, 3 - unit), cx = W / 2, by = 4.5;\n  const heads = Array.from({ length: n }, (_, i) =>\n    `<ellipse class=\"${hollow ? \"ho\" : \"fi\"}\" cx=\"${hx(i)}\" cy=\"${HY}\" rx=\"${unit === 5 ? 3 : 2.6}\" ry=\"1.85\" transform=\"rotate(-20 ${hx(i)} ${HY})\"/>`).join(\"\");\n  const stems = unit <= 4 ? Array.from({ length: n }, (_, i) => `<line x1=\"${sx(i)}\" y1=\"${HY - 0.5}\" x2=\"${sx(i)}\" y2=\"${TOP}\"/>`).join(\"\") : \"\";\n  const beam = Array.from({ length: beams }, (_, k) => `<rect x=\"${sx(0) - 0.45}\" y=\"${TOP + k * 3}\" width=\"${sx(n - 1) - sx(0) + 0.9}\" height=\"1.8\"/>`).join(\"\");\n  return `<svg class=\"tupsvg\" viewBox=\"0 0 ${W} 28.5\" width=\"${((W * 32) / 28.5).toFixed(1)}\" height=\"32\" aria-label=\"${n} \u8FDE\u97F3\">` +\n    `<path class=\"br\" d=\"M${M} ${by + 2.5}V${by}H${cx - 3.6}M${cx + 3.6} ${by}H${W - M}V${by + 2.5}\"/>` +\n    `<text x=\"${cx}\" y=\"${by + 3}\" text-anchor=\"middle\">${String.fromCodePoint(0xe880 + n)}</text>${stems}${beam}${heads}</svg>`;\n}\nexport interface PadHost {\n  view(): PadView;                         // \u8C31\u7684\u8F93\u5165\u6001\u5FEB\u7167\uFF08\u957F\u77ED / \u8FDE\u97F3 / \u5347\u964D / \u53EA\u9009\u4E86\u4E00\u4E2A\uFF09\n  music: PadMusic;                         // \u97F3\u4E50\u77E5\u8BC6\uFF08\u6CE8\u5165\uFF09\uFF1A\u7B2C k \u7EA7\u662F\u4EC0\u4E48\u3001\u65CB\u94AE\u7684\u6863\n  isImpro(): boolean;                      // \u300C\u5F39\u300D\u5F00\u7740 = \u97F3\u952E\u53EA\u54CD\u4E0D\u5199\uFF08\u5199\u4E0D\u5199\u5F52\u5BBF\u4E3B\uFF0Cpad \u53EA\u7528\u5B83\u51B3\u5B9A\u7B26\u53F7\u5C42 / \u4EAE\u6CD5\uFF09\n  autoBars(): boolean;                     // \u8C31\u9762\u6309\u62CD\u53F7\u81EA\u52A8\u753B\u5C0F\u8282\u7EBF\u5F00\u7740\u6CA1\u6709\n  staves(): number;                        // \u5149\u6807\u6240\u5728\u58F0\u90E8\u51E0\u5F20\u8C31\u8868\uFF082 = \u5927\u8C31\u8868\uFF1A\u591A\u4E00\u4E2A\u300C\u6362\u8C31\u8868\u300D\uFF09\n  canStack(): boolean;                     // \u5149\u6807\u6240\u5728\u58F0\u90E8\u7684\u4E50\u5668\u80FD\u53E0\u97F3\u5417\uFF08\u5355\u58F0\u4E50\u5668 = \u4E0D\u80FD\uFF0C\u952E\u7070\u6389\uFF09\n  /** \u7B26\u53F7\u683C\u7684\u72B6\u6001\uFF1Aoff = \u53F0\u4E0A\u8FD9\u4F4D\u4E0D\u8BA4\uFF08\u753B\u7070 + \u300C\u4E0D\u8BA4\u300D\uFF0C\u7167\u6837\u80FD\u5199\uFF09\uFF1Bon = \u73B0\u5728\u751F\u6548\u7684\u90A3\u4E2A\uFF08\u529B\u5EA6\uFF09\u3002\u4E0D\u7ED9 = \u90FD\u6B63\u5E38\u3002 */\n  keyState?(id: string): { off?: boolean; on?: boolean } | undefined;\n  /** \u952E\u5E95\u90E8\u7EC6\u6761\u63D0\u793A\u7684\u97F3\u57DF = \u73B0\u5728\u8C01\u5728\u5F39\uFF082026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u8BD5\u5F39\u7684\u65F6\u5019\u952E\u76D8\u4E0A\u7684\u97F3\u57DF\u6CA1\u6709\u8DDF\u8FDB\u300D\uFF09\uFF1A\u5BBF\u4E3B\u8BF4\uFF1B\u4E0D\u77E5\u9053 / \u4E0D\u63A5 = null \u4E0D\u753B\uFF08\u952E\u76D8\u4E0D\u8BA4\u8BC6\u4EFB\u4F55\u6F14\u594F\u8005\uFF0CADR-0004\uFF09\u3002 */\n  hintRange?(): HintRange;\n  /** \u97F3\u952E\u6309\u4E0B\uFF08\u7B2C k \u7EA7\uFF0Cid = \u54EA\u6839\u624B\u6307\uFF09\uFF1A\u5199\uFF08\u4E0D\u5728\u300C\u5F39\u300D\u65F6\uFF09+ \u54CD\u90FD\u5F52\u5BBF\u4E3B\uFF1B\u56DE false = \u8FD9\u4E00\u4E0B\u4E0D\u6536\uFF08\u5355\u97F3\u4E50\u5668\u51E0\u4E4E\u540C\u65F6\u6309\u4E0B\u7684\u7B2C\u4E8C\u6839\u624B\u6307\uFF09\uFF1A\u4E0D\u4EAE\u3001\u4E0D\u8BB0\u6ED1\u52A8\u3002 */\n  onNoteDown(k: number, id: string): boolean;\n  onNoteUp(id: string): void;\n  onAlter(id: string, alt: -1 | 0 | 1): void;   // \u6309\u7740\u7684\u8FD9\u6839\u624B\u6307\u6ED1\u8FC7\u95E8\u69DB\uFF1A\u521A\u5199\u7684\u97F3\uFF08\u5F39 = \u6B63\u5728\u54CD\u7684\u97F3\uFF09\u5347 / \u964D / \u8FD8\u539F\n  /** \u5199\u5B57\u952E / \u7B26\u53F7\u683C / \u300C\u22EF\u300D\u91CC\u7684\u8BB0\u53F7\uFF1A\u6309\u952E id\uFF08PAD_KEY_IDS\uFF09\uFF0C\u7FFB\u8BD1\u6210\u547D\u4EE4 / \u63D2\u8BB0\u53F7 / \u5F00\u83DC\u5355\u5F52\u5BBF\u4E3B\uFF1Bmods.ramp = \u300C\u6E10\u5230\u300D\u4EAE\u7740\u3002 */\n  onKey(id: string, mods: { ramp: boolean }): void;\n  onUnit(unit: number): void;\n  onTuplet(n: 0 | 3 | 5 | 6 | 7): void;\n  /** \u300C1=\u300D\u65CB\u94AE / \u6EDA\u8F6E\u9009\u4E86\u7B2C i \u6863\uFF08\u54EA\u4E2A\u8C03 / \u54EA\u4E2A\u8C03\u5F0F\u5F52 music\uFF09\u3002 */\n  onPick(knob: \"key\" | \"scale\", i: number): void;\n  onAutoBars(on: boolean): void;\n  onHide(): void;                          // \u6536\u8D77\u952E\u76D8\uFF08pad\uFF09\n  onHalf(down: boolean): void;             // /2 \u6309\u4E0B / \u677E\u5F00\uFF1A\u5199\u7684\u97F3\u4E34\u65F6\u51CF\u534A\n  onStack(down: boolean): void;            // \u53E0 \u6309\u4E0B\uFF08\u9501\u5B9A\u5F0F\uFF0Cv0.10.5\uFF09\uFF1A\u9009\u4E2D\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08= \u6539\u8FD9\u4E2A\u97F3\uFF09/ \u518D\u6309 = \u56DE\u5230\u5149\u6807\uFF1B\u677E\u5F00\u4E0D\u7BA1\n  onAccShift(phase: \"down\" | \"slide\" | \"up\", acc: AccSel): void;   // \u5347\u964D\u952E\uFF1A\u6309\u4E0B / \u6ED1\u7740\u6362 / \u677E\u5F00\n  onImpro(): void;                         // \u300C\u5F39\u300D\u5F00\u5173\uFF08\u7B2C\u4E00\u6392\u300C\u6536\u8D77\u300D\u5DE6\u8FB9\uFF09\uFF1A\u53EA\u54CD\u4E0D\u5199\n  /** \u97F3\u952E \u2194 \u7B26\u53F7\u683C\uFF08\u7B2C\u4E00\u6392\u300C\u5F39\u300D\u5DE6\u8FB9\uFF0C\u4E24\u9762\u540C\u4E00\u4E2A\u4F4D\u7F6E\uFF1Bv0.10.37\uFF1A\u300C\u7B26\u300D\u4E0D\u518D\u662F\u6A21\u5F0F\u6761\u4E0A\u7684\u4E00\u4E2A\u6A21\u5F0F\uFF09\u3002 */\n  onKbSwitch?(): void;\n}\n\ntype Mode = \"normal\" | \"more\";   // \u6709\u9009\u533A\u65F6\u7684\u79FB\u8C03 / \u8F6C\u8C03 / \u65F6\u503C\u4E0D\u5728 pad \u4E0A\uFF082026-10-08 user\u300C\u79FB\u8C03\u8F6C\u8C03\u548C\u957F\u5EA6\u4EE5\u53CA\u5176\u4ED6\u7684\u64CD\u4F5C\u4E0D\u8981\u7528keyboard\uFF0C\u800C\u662F\u4E00\u4E2A\u5C0F\u7684\u4E0A\u4E0B\u6587\u83DC\u5355\uFF0C\u952E\u76D8\u53EA\u505A\u7EAF\u7CB9\u7684\u6253\u8C31\u300D\u2192 \u9009\u533A\u83DC\u5355\uFF09   // \u9009\u8C03 / \u957F\u77ED / \u97F3\u57DF = \u65CB\u94AE\uFF08\u539F\u5730\u6EDA / \u70B9\u5F00\u6EDA\u8F6E\uFF09\uFF0C\u4E0D\u5728\u8FD9\u91CC\n\nexport class Pad {\n  private rowShift = 0;       // \u97F3\u57DF\u7A97\u53E3\u632A\u8FC7\u51E0\u884C\n  private cols = 4;           // \u6BCF\u884C\u51E0\u4E2A\u97F3\uFF08MEDO = 4\uFF09\n  private rowsSetting: number | \"auto\" = 4;   // \u9ED8\u8BA4 4 \u884C\uFF08user\u300C\u9ED8\u8BA4\u8FD8\u662F\u56DB\u884C\u300D\uFF09\uFF1B\u300C\u81EA\u52A8\u300D= \u6309\u8BBE\u5907\u548C\u5C4F\u5E55\u5269\u4E0B\u7684\u9AD8\u5EA6\u7B97\n  private layoutMode: \"movable\" | \"absolute\" = \"absolute\";   // \u9996\u8C03 / \u7EDD\u5BF9\uFF1B\u9ED8\u8BA4\u7EDD\u5BF9\uFF08user\u300C\u952E\u76D8\u9ED8\u8BA4\u7EDD\u5BF9\u5E03\u5C40\u300D\uFF09\n  private swipeMode: \"glide\" | \"alter\" = \"glide\";          // \u97F3\u952E\u4E0A\u6ED1 = \u6ED1\u5230\u4E0B\u4E00\u4E2A\u952E\u5C31\u54CD\u4E0B\u4E00\u4E2A\uFF08\u9ED8\u8BA4\uFF1Buser 2026-10-08\u300C\u6EDA\u952E\u76D8\u7684\u610F\u601D\u662F\u624B\u6307\u5728\u952E\u76D8\u4E0A\u6ED1\u52A8\u5230\u4E0B\u4E00\u4E2A\u97F3\uFF0C\u4E0D\u8BF4\u62D6\u52A8\u952E\u76D8\u300D\uFF09/ \u4E0A\u4E0B\u6ED1 = \u8FD9\u4E00\u4E2A\u97F3\u5347\u964D\uFF08\u9ECF\u7740\uFF09\n  /** \u7B26\u53F7\u5C42\u5F00\u7740\uFF08\u50CF iOS \u952E\u76D8\u7FFB\u5230 .?123 \u90A3\u4E00\u9875\uFF1A\u8868\u60C5\u8BB0\u53F7\uFF09\u3002\u53EA\u6709 caps\uFF1A\u70B9\u300C\u7B26\u300D\u8FDB\u6765\u5C31\u4E00\u76F4\u7559\u7740\uFF0C\u518D\u70B9\uFF08\u952E\u4E0A\u5199\u300C\u97F3\u300D\uFF09\u56DE\u97F3\u952E\n   *  \uFF082026-10-09 user\u300C\u7B26\u53F7\u952E\u76D8\u5E94\u8BE5\u53EA\u6709caps\u6A21\u5F0F\u6CA1\u6709shift\u6A21\u5F0F\u300D\uFF1B10-08 \u8D77\u662F Shift \u903B\u8F91\u2014\u2014\u70B9\u4E00\u4E0B\u5199\u4E00\u4E2A\u5C31\u56DE\u97F3\u952E\u3001\u8FDE\u70B9\u4E24\u4E0B\u9501\u4F4F\uFF0Cuser \u90A3\u65F6\u8BF4\u300C\u7B26\u53F7\u8F93\u5165\u4E5F\u5E94\u8BE5\u6709capslock\u300D\uFF09\u3002 */\n  /** \u7B26\u53F7\u5C42\u5F00\u6CA1\u5F00 = \u5E95\u5EA7\u5728\u4E0D\u5728\u300C\u7B26\u300D\uFF082026-10-10 \u8D77\u7531\u5BBF\u4E3B\u7684\u6A21\u5F0F\u5B9A\uFF0Csrc/app/workspace.ts\uFF1Bpad \u4E0A\u7684\u300C\u7B26\u300D\u952E\u6458\u6389\u4E86\u2014\u2014user\u300C\u952E\u76D8\u7684\u6A21\u5F0F\u952E\u662F\u4E0D\u662F\u80FD\u6458\u4E0B\u6765\u300D\uFF09\u3002\u300C\u5F39\u300D\u5F00\u7740 = \u7167\u6837\u662F\u97F3\u952E\u3002 */\n  private symWanted = false;\n  private get symbols(): \"off\" | \"lock\" { return this.symWanted && !this.host.isImpro() ? \"lock\" : \"off\"; }\n  /** \u5BBF\u4E3B\uFF08\u6A21\u5F0F\uFF09\u5F00 / \u5173\u7B26\u53F7\u5C42\u3002 */\n  setSymbols(on: boolean): void { if (this.symWanted === on) return; this.symWanted = on; this.render(); }\n  /** \u7B26\u53F7\u5C42\u73B0\u5728\u5728\u54EA\u4E00\u9875\uFF08pad \u5934\u90A3\u4E00\u6392\u6362\u6210\u4E09\u4E2A\u6807\u7B7E\uFF1Buser 2026-10-08\u300Cpad \u5934\u90A3\u4E00\u6392\u5728\u7B26\u53F7\u5C42\u91CC\u6362\u6210\u5206\u9875\u6807\u7B7E \u53EF\u4EE5\u300D\uFF09\uFF1A\u6536\u8D77\u518D\u5F00 / \u70B9\u4E86\u8BB0\u53F7\u91CD\u753B\u90FD\u8FD8\u5728\u8FD9\u4E00\u9875\uFF08\u4EE5\u524D\u683C\u5B50\u4E00\u91CD\u753B\u5C31\u6EDA\u56DE\u9876\u4E0A\uFF0Cuser\u300C\u5207\u6362\u7B26\u53F7\u952E\u76D8\u7684\u65F6\u5019\u7FFB\u9875\u4F1A\u4E71\u300D\uFF09\u3002 */\n  private symPage: SymPage = \"art\"; private symBuilt: SymPage | null = null;\n  /** \u300C\u6E10\u5230\u300D\u5148\u70B9\u5B83\u3001\u518D\u70B9\u4E00\u4E2A\u529B\u5EA6 = \u8FD9\u4E2A\u529B\u5EA6\u4ECE\u4E0A\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u6E10\u53D8\u8FC7\u6765\uFF082026-10-08 \u6DF1\u591C\uFF0Cuser\u300C\u6E10\u5230 \u505A\u300D\uFF09\u3002Shift \u903B\u8F91\uFF082026-10-09\uFF0Cuser\u300C\u7136\u540E\u8F6F\u952E\u76D8\u5230\u65F6\u5019\u52A0\u4E00\u4E2Atoggle\u6E10\u8FDB\u5230\u7684\u6807\u7B7E\uFF0C\u8FD9\u6837\u53EF\u4EE5\u5FEB\u901F\u952E\u76D8\u8F93\u5165\u300D\uFF09\uFF1A\n   *  \u70B9\u4E00\u4E0B = \u4E0B\u4E00\u4E2A\u529B\u5EA6\u662F\u6E10\u5230\uFF1B\u8FDE\u70B9\u4E24\u4E0B = \u9501\u4F4F\uFF08\u4E4B\u540E\u5199\u7684\u529B\u5EA6\u90FD\u662F\u6E10\u5230\uFF0C\u300C\u529B\u5EA6\u300D\u6807\u7B7E\u4E0A\u6302\u7740\u300C\u6E10\u5230\u300D\uFF09\uFF1B\u518D\u70B9 = \u5173\u3002 */\n  private ramp: Latch = LATCH_OFF;   // \u6E10\u5230 = Shift \u5F0F\u4FEE\u9970\u952E\uFF08\u540C /2\u3001\u5347\u964D\uFF09\uFF1A\u89C4\u5219\u5728 src/keyboard/latch.ts\n  private mode: Mode = \"normal\";\n  private gridFor = \"\";\n  private toolsFor = \"\";\n  /** \u6B63\u6309\u7740\u7684\u97F3\uFF08\u6765\u6E90 id \u2192 \u4E94\u7EBF\u8C31\u4F4D\u7F6E\uFF09\uFF1A\u624B\u6307\u548C\u7535\u8111\u952E\u76D8\u5171\u7528\uFF0Cpad \u4E0A\u5BF9\u5E94\u7684\u952E\u6309\u4F4F\u671F\u95F4\u4E00\u76F4\u4EAE\u3002 */\n  private held = new Map<string, number>();\n  /** \u6B63\u5728\u97F3\u952E\u4E0A\u6ED1\u7684\u624B\u6307\uFF08pointerId \u2192 \u8D77\u70B9 y\u3001\u5F53\u524D\u5347\u964D\u3001\u54EA\u4E2A\u952E\uFF09\u3002 */\n  private swipes = new Map<number, { y0: number; alt: -1 | 0 | 1; key: HTMLElement }>();\n  /** \u7F51\u683C\u4E0A\u6BCF\u4E2A\u952E\uFF08\u8C03\u5F0F\u68AF\u5B50\u4E0A\u7684\u7B2C k \u7EA7\uFF09\u957F\u4EC0\u4E48\u6837\uFF08music.cell \u7684\u5FEB\u7167\uFF0C\u7F51\u683C\u5EFA\u7684\u65F6\u5019\u53D6\uFF09\u3002 */\n  private keys = new Map<number, PadCell>();\n  /** \u5347\u964D\u952E\u9009\u7684\u662F\u54EA\u4E00\u79CD\uFF08\u6ED1\u7740\u6362\uFF1B\u8BB0\u4F4F\uFF0C\u4E0B\u6B21\u6309\u8FD8\u662F\u5B83\uFF09\u3002 */\n  private accSel: AccSel = 1;\n\n  constructor(private el: HTMLElement, private host: PadHost) { this.render(); addEventListener(\"resize\", () => this.render()); }\n\n  private rows(): number {\n    if (this.rowsSetting !== \"auto\") return this.rowsSetting;\n    const m = KEY_METRIC[padForm()], avail = innerHeight >= innerWidth ? innerHeight * 0.45 - 110 : innerHeight - 160;\n    return Math.max(4, Math.min(6, Math.floor((avail + m.gap) / (m.h + m.gap))));   // \u5C01\u9876 6\uFF1A\u518D\u591A\u5C31\u5927\u534A\u5728\u5979\u7684\u97F3\u57DF\u5916\u4E86\n  }\n  /** \u97F3\u57DF\u7A97\u53E3\u7B2C shift \u6863\u7684\u8303\u56F4\u6587\u5B57\u300C\u6700\u4F4E\u2013\u6700\u9AD8\u300D\uFF08user\u300CG4\u4E5F\u8C1C\u8BED\u4EBA\uFF0C\u5E94\u8BE5\u662Fxx-xx\u300D\uFF09\u3002 */\n  private spanText(shift: number, rows: number): string {\n    const lo = this.baseAt(shift, rows), hi = lo + rows * this.cols - 1, m = this.host.music;\n    return `${m.cell(lo).abs}\u2013${m.cell(hi).abs}`;\n  }\n  /** \u540C\u4E0A\uFF0C\u753B\u5728\u65CB\u94AE / \u6EDA\u8F6E\u91CC\uFF1A\u653E\u5F97\u4E0B\u5C31\u4E00\u884C\u300CF3\u2013G5\u300D\uFF1B\u592A\u7A84\u5C31\u4E24\u884C\uFF0C\u4E0B\u9762\u90A3\u884C\u662F\u4F4E\u7684\u90A3\u5934\uFF08user\u300C\u4E5F\u8BB8\u4E0A\u4E0B\u4E24\u4E2A\u5427\uFF0C\u4E0B\u9762\u662Flower bound\u300D\uFF09\u3002 */\n  private spanHtml(shift: number, rows: number, narrow: boolean): string {\n    if (!narrow) return this.spanText(shift, rows);\n    const lo = this.baseAt(shift, rows), hi = lo + rows * this.cols - 1, m = this.host.music;\n    return `<span class=\"rg\"><span>${m.cell(hi).abs}</span><span>${m.cell(lo).abs}</span></span>`;\n  }\n  /** \u97F3\u57DF\u65CB\u94AE\u7A84\u5230\u4E00\u884C\u5199\u4E0D\u4E0B\uFF08\u624B\u673A / \u684C\u9762\u7684\u7A84 pad\uFF09\u3002 */\n  private rangeNarrow(): boolean { const b = this.el.querySelector<HTMLElement>(\".k-range\"); return !!b && b.clientWidth < NARROW; }\n  /** \u97F3\u57DF\u7A97\u53E3\u7B2C shift \u6863\u65F6\uFF0C\u5DE6\u4E0B\u90A3\u4E2A\u952E\u5728\u8C03\u5F0F\u68AF\u5B50\u4E0A\u662F\u7B2C\u51E0\u7EA7\uFF1A\u7EDD\u5BF9 = \u90A3\u4E00\u884C\u4ECE C4\uFF08\u6216\u5B83\u4E0A\u9762\u7B2C\u4E00\u4E2A\u8C03\u5F0F\u97F3\uFF09\u8D77\uFF1B\n   *  \u9996\u8C03 = \u4ECE\u4E3B\u97F3\u8D77\uFF08\u5C0F\u8C03 / \u7FBD\u8C03\u5F0F\u4ECE 6 \u8D77\uFF09\uFF1B\u4E2D\u592E\u90A3\u4E00\u884C\u9ED8\u8BA4\u5728\u4E2D\u7EBF\u4E0B\u9762\u4E00\u884C\u3002\u951A\u70B9\u662F\u97F3\u4E50\u77E5\u8BC6\uFF08music.anchor\uFF09\uFF0C\u51E0\u4F55\u5728\u8FD9\u513F\u3002 */\n  private baseAt(shift: number, rows: number): number {\n    return this.host.music.anchor(this.layoutMode) + this.cols * (shift - Math.floor((rows - 1) / 2));\n  }\n  /** \u4E00\u4E2A\u6309\u952E\u5F80\u5916\u53D1\uFF08\u5199\u5B57\u952E / \u7B26\u53F7\u683C / \u300C\u22EF\u300D\u91CC\u7684\u8BB0\u53F7\uFF09\uFF1A\u5E26\u4E0A\u300C\u6E10\u5230\u300D\u4EAE\u4E0D\u4EAE\u3002 */\n  private key(id: string): void { this.host.onKey(id, { ramp: latchOn(this.ramp) }); }\n\n  /** \u72B6\u6001\u53D8\u4E86\uFF1A\u7ED3\u6784\u6CA1\u53D8\u5C31\u53EA\u6539\u6587\u5B57\u548C\u6837\u5F0F\uFF08\u6309\u4F4F\u7684\u952E\u4E0D\u4F1A\u88AB\u91CD\u5EFA\u6253\u65AD\uFF09\u3002\n   *  \u4E09\u5757\u5404\u7BA1\u5404\u7684\uFF1A\u6700\u4E0A\u9762\u4E00\u6392\u65CB\u94AE\u6216\u5019\u9009\uFF08\u6A21\u5F0F / \u6709\u6CA1\u6709\u9009\u4E2D\u53D8\u4E86\u624D\u91CD\u5EFA\uFF09\u3001\u5199\u5B57\u952E\u4E00\u6392\uFF08\u53EA\u5EFA\u4E00\u6B21\uFF09\u3001\u97F3\u952E\u7F51\u683C\uFF08\u8C03 / \u97F3\u57DF / \u5E03\u5C40\u53D8\u4E86\u624D\u91CD\u5EFA\uFF09\u2014\u2014\n   *  \u65CB\u94AE\u4E0A\u6ED1\u7740\u7684\u65F6\u5019\u503C\u4E00\u76F4\u5728\u53D8\u3001\u7F51\u683C\u8DDF\u7740\u91CD\u5EFA\uFF0C\u65CB\u94AE\u90A3\u4E2A\u5143\u7D20\u4E0D\u52A8\uFF0C\u624B\u6307\u4E0D\u4F1A\u4E22\u3002 */\n  render(): void {\n    const v = this.host.view(), rows = this.rows(), form = padForm();\n    const base = this.baseAt(this.rowShift, rows);\n    this.el.dataset.form = form; this.el.style.setProperty(\"--cols\", String(this.cols)); this.el.style.setProperty(\"--rows\", String(rows));   // --rows\uFF1A\u7B26\u53F7\u5C42\u7684\u9AD8 = \u97F3\u952E\u90A3\u51E0\u6392\uFF08\u51E0\u4F55\u4E0D\u53D8\uFF0C\u591A\u4E86\u6EDA\uFF09\n    if (!this.el.querySelector(\".pad-grid\")) {\n      this.el.innerHTML = `<div class=\"pad-head\"></div><div class=\"pad-tools writes\">` +\n        `<button class=\"btn\" data-caret=\"-1\" title=\"\u5149\u6807\u5DE6\u79FB\uFF08${hint(\"left\")}\uFF09\">\u2190</button>` +\n        `<button class=\"btn\" data-caret=\"1\" title=\"\u5149\u6807\u53F3\u79FB\uFF08${hint(\"right\")}\uFF09\">\u2192</button>` +\n        `<button class=\"btn wk\" data-cmd=\"rest\" title=\"\u4F11\u6B62\uFF08${hint(\"rest\")}\uFF09\"><span>0</span><small>\u4F11\u6B62</small></button>` +\n        `<button class=\"btn wk\" data-cmd=\"bar\" title=\"\u5C0F\u8282\u7EBF\uFF08${hint(\"bar\")}\uFF09\"><span>|</span><small>\u5C0F\u8282\u7EBF</small></button>` +\n        // \u547C\u5438\u653E\u5728\u5199\u97F3\u90A3\u4E00\u6392\uFF08user 2026-10-08\u300C\u547C\u5438\u5E94\u8BE5\u662F\u6211\u5728first pass \u65CB\u5F8Bflow\u7684\u65F6\u5019\u975E\u5E38\u9AD8\u9891\u4F1A\u7528\u5230\u7684\u7B26\u53F7\u300D\uFF09\uFF1A\u548C\u7B26\u53F7\u5C42\u300C\u6F14\u594F\u6CD5\u300D\u9875\u90A3\u4E00\u683C\u540C\u4E00\u4EF6\u4E8B\u2014\u2014\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u540E\u9762\u6362\u6C14\uFF0C\u518D\u70B9\u53BB\u6389\uFF1B\u7B26\u53F7\u5C42\u5F00\u7740\u4E5F\u80FD\u6309\n        `<button class=\"btn wk breath\" data-breath=\"1\" title=\"\u547C\u5438\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u540E\u9762\u6362\u4E00\u53E3\u6C14\uFF08\u5C0F\u6708\u76F8\u5531\u5230\u8FD9\u513F\u6362\u6C14\uFF1B\u4E50\u5668\u5728\u8FD9\u513F\u7A0D\u5FAE\u65AD\u5F00\uFF1B\u8FDE\u7EBF\u8FDE\u7740\u4E5F\u7167\u6837\u65AD\u5F00\uFF1B\u518D\u70B9\u4E00\u6B21\u53BB\u6389\uFF09\"><span class=\"smufl\">\\uE4CE</span><small>\u547C\u5438</small></button>` +\n        `<button class=\"btn wk accshift\" data-accshift=\"1\" title=\"\u5347\u964D\uFF08\u548C Shift \u4E00\u6837\uFF09\uFF1A\u70B9\u4E00\u4E0B = \u4E0B\u4E00\u4E2A\u97F3\uFF1B\u8FDE\u70B9\u4E24\u4E0B = \u9501\u4F4F\uFF0C\u518D\u70B9\u89E3\u5F00\uFF1B\u6309\u4F4F\u5199 = \u6309\u4F4F\u671F\u95F4\u3002\u5728\u952E\u4E0A\u4E0A\u4E0B\u6ED1\u6362 \uD834\uDD2A / \u266F / \u266D / \uD834\uDD2B\"><span class=\"ag\"></span><small>\u5347\u964D</small></button>` +\n        `<button class=\"btn wk stack\" data-stack=\"1\" title=\"\u53E0\uFF08\u50CF Caps Lock\uFF09\uFF1A\u6309\u4E00\u4E0B = \u9009\u4E2D\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u6765\u6539\u2014\u2014\u6309\u97F3\u952E\u53E0\u4E0A / \u62FF\u6389\uFF08\u6700\u540E\u4E00\u4E2A\u62FF\u6389 = \u4E00\u6837\u957F\u7684\u4F11\u6B62\uFF0C\u4F11\u6B62\u4E0A\u6309 = \u53D8\u56DE\u97F3\uFF09\u3001\u2014 \u957F\u4E00\u6B65\u3001\u232B \u77ED\u4E00\u6B65\u3001\u2190 \u2192 \u6362\u524D\u540E\u7684\u97F3\uFF1B\u518D\u6309\u4E00\u4E0B = \u56DE\u5230\u5B83\u540E\u9762\u63A5\u7740\u5199\u3002\u5355\u58F0\u4E50\u5668\u7684\u58F0\u90E8\u53E0\u4E0D\u4E86\"><span>\u53E0</span><small>\u53E0\u97F3</small></button>` +\n        `<button class=\"btn wk half\" data-half=\"1\" title=\"\u51CF\u534A\uFF08\u957F\u77ED\u57FA\u7EBF\u77ED\u4E00\u6863\uFF09\uFF1A\u70B9\u4E00\u4E0B = \u4E0B\u4E00\u4E2A\u97F3\uFF1B\u8FDE\u70B9\u4E24\u4E0B = \u9501\u4F4F\uFF0C\u518D\u70B9\u89E3\u5F00\uFF1B\u4E5F\u53EF\u4EE5\u6309\u4F4F\u5199\"><span>/2</span><small>\u51CF\u534A</small></button>` +\n        `<button class=\"btn wk\" data-cmd=\"extend\" title=\"\u62C9\u957F\u4E00\u4EFD\uFF08${hint(\"extend\")}\uFF09\"><span>\u2014</span><small>\u62C9\u957F</small></button>` +\n        `<button class=\"btn\" data-cmd=\"backspace\" title=\"\u9000\u683C\uFF08${hint(\"backspace\")}\uFF09\"><svg class=\"ico\"><use href=\"#backspace\"/></svg></button></div>` +\n        `<div class=\"pad-grid\"></div>`;\n      { const g = this.el.querySelector<HTMLElement>(\".pad-grid\")!; g.addEventListener(\"wheel\", (e) => this.gridWheel(g, e), { passive: false }); }\n      const w = this.el.querySelector<HTMLElement>(\".writes\")!;\n      this.on(w, \"[data-caret]\", (b) => this.key(`caret:${b.dataset.caret}`));\n      this.on(w, \"[data-cmd]:not([data-cmd=backspace])\", (b) => this.key(b.dataset.cmd!));\n      this.on(w, \"[data-breath]\", () => { this.key(\"art:breath\"); this.render(); });\n      // \u9000\u683C\uFF1A\u6309\u4E0B\u5220\u4E00\u4E2A\uFF0C\u6309\u4F4F 420 ms \u540E\u6BCF 70 ms \u518D\u5220\u4E00\u4E2A\uFF0C\u677E\u624B\u505C\uFF08user\u300C\u9000\u683C\u957F\u6309\u53EF\u4EE5\u591A\u5220\u300D\uFF1B\u8282\u594F\u540C WXHW src/input/soft-keyboard.ts\uFF09\n      const bs = w.querySelector<HTMLElement>('[data-cmd=\"backspace\"]')!;\n      let timer = 0;\n      // \u7B26\u53F7\u5C42\u5F00\u7740 = \u7B26\u53F7\u6A21\u5F0F\u7684\u9000\u683C\uFF1A\u53EA\u5220\u8BB0\u53F7\uFF0C\u6CA1\u6709\u5C31\u5F80\u56DE\u9000\u4E00\u6B65\uFF0C\u4E0D\u5220\u97F3\uFF08user 2026-10-08\u300C\u9000\u683C\u53EA\u5220\u7B26\u53F7\u6216\u8005\u6CA1\u7B26\u53F7\u7684\u65F6\u5019\u9000\u4E00\u6B65\uFF0C\u4E0D\u5220\u97F3\u7B26\u300D\uFF09\n      const stop = () => clearTimeout(timer), del = () => this.key(this.symbols !== \"off\" ? \"symBackspace\" : \"backspace\");\n      bs.addEventListener(\"pointerdown\", (e) => {\n        e.preventDefault(); try { bs.setPointerCapture(e.pointerId); } catch { /* \u5408\u6210\u4E8B\u4EF6\uFF1A\u6CA1\u6709\u6355\u83B7\u4E5F\u80FD\u7528 */ }\n        stop(); del();\n        const tick = () => { del(); timer = window.setTimeout(tick, 70); };\n        timer = window.setTimeout(tick, 420);\n      });\n      for (const t of [\"pointerup\", \"pointercancel\", \"lostpointercapture\"]) bs.addEventListener(t, stop);\n      addEventListener(\"blur\", stop);\n      // /2\uFF1A\u5199\u7684\u97F3\u51CF\u534A\uFF08user\u300C0\u5DE6\u8FB9\u52A0\u4E00\u4E2A/2\u6548\u679C\u662F\u6309\u4F4F\u7684\u65F6\u5019\u4E34\u65F6\u8F93\u5165\u7684\u662F/2duration\u7684\u97F3\u7B26\u3002\u4E4B\u524D\u90A3\u4E2A\u7CCA\u6D82\u7684\u60F3\u6CD5\u73B0\u5728\u770B\u6765\u5E94\u8BE5\u8FD9\u4E48\u505A\u300D\n      //   \u2192\u300C\u55EF\u6216\u8005\u653E\u5728\u62C9\u957F\u5DE6\u8FB9\u5427\uFF0C0 | /2 -\u300D\u2192\u300C\u6216\u8005/2\u662F\u7C7B\u4F3Cshift\uFF0C\u56E0\u4E3Aaccessibility\u7684issue\u53EF\u80FD\u6309\u4F4F\u4E0D\u65B9\u4FBF\uFF0C\u800C\u662F\u548C\u952E\u76D8shift\u7684\u903B\u8F91\u4E00\u6837\u300D\uFF09\uFF1A\n      //   \u70B9\u4E00\u4E0B = \u4E0B\u4E00\u4E2A\u3001\u8FDE\u70B9\u4E24\u4E0B = \u9501\u4F4F\u3001\u6309\u4F4F\u5199 = \u6309\u4F4F\u671F\u95F4\uFF08\u903B\u8F91\u5728\u5BBF\u4E3B main.ts halfKey\uFF09\u3002\u53E6\u4E00\u6839\u624B\u6307\u6309\u97F3\u952E\u7167\u5E38\u5199\uFF08\u5355\u97F3\u62A4\u680F\u4E0D\u7BA1\u5B83\uFF1A\u5B83\u4E0D\u5199\u97F3\uFF09\n      const half = w.querySelector<HTMLElement>(\"[data-half]\")!, holding = new Set<number>();\n      const halfUp = (e: { pointerId: number }) => { if (!holding.delete(e.pointerId)) return; if (!holding.size) this.host.onHalf(false); };\n      half.addEventListener(\"pointerdown\", (e) => {\n        e.preventDefault(); try { half.setPointerCapture(e.pointerId); } catch { /* \u5408\u6210\u4E8B\u4EF6\uFF1A\u6CA1\u6709\u6355\u83B7\u4E5F\u80FD\u7528 */ }\n        if (!holding.size) this.host.onHalf(true);\n        holding.add(e.pointerId);\n      });\n      for (const t of [\"pointerup\", \"pointercancel\", \"lostpointercapture\"]) half.addEventListener(t, (e) => halfUp(e as PointerEvent));\n      addEventListener(\"blur\", () => { for (const id of [...holding]) halfUp({ pointerId: id }); });\n      // \u53E0\uFF1A\u9501\u5B9A\u5F0F\uFF0C\u6309\u4E00\u4E0B\u5207\u4E00\u4E0B\uFF08v0.10.5\uFF1Buser\u300C\u53E0\u97F3\u6A21\u5F0F\u4E5F\u5E94\u8BE5\u53EA\u6709capslock\u6CA1\u6709shift\uFF0C\u6BCF\u6B21\u90FD\u4F1A\u5F04\u9519\uFF0C\u6240\u4EE5\u4E0D\u8981shift\u6A21\u5F0F\u300D\uFF1B\u903B\u8F91\u5728\u5BBF\u4E3B main.ts stackKey\uFF09\n      const stk = w.querySelector<HTMLElement>(\"[data-stack]\")!;\n      stk.addEventListener(\"pointerdown\", (e) => { e.preventDefault(); this.host.onStack(true); });\n      // \u5347\u964D\u952E\uFF08user\u300C\u4EE5\u53CA\u4E34\u65F6\u5347\u964D\u53F7\u7684shift\u597D\u50CF\u4F60\u4E5F\u5FD8\u4E86\u54C8\u54C8\uFF0C\u8981\u4E0D\u5C31\u662F\u6309\u4F4F\u662Fshift\uFF0C\u7136\u540E\u4E5F\u53EF\u4EE5\u4E0A\u4E0B\u6ED1\u52A8\u5207\u6362## # b bb\uFF0C\u7136\u540E\u6309\u662F\u5F53\u4F5Cshift\uFF0C\u6ED1\u52A8\u662Ftoggle which shift\u300D\uFF09\uFF1A\n      //   \u6309 = Shift\uFF08\u70B9\u4E00\u4E0B / \u8FDE\u70B9\u4E24\u4E0B / \u6309\u4F4F\u5199\uFF0C\u903B\u8F91\u5728\u5BBF\u4E3B main.ts accKey\uFF09\uFF1B\u6309\u7740\u4E0A\u4E0B\u6ED1\u8FC7 SWIPE = \u6362\u4E00\u79CD\uFF08\u5F80\u4E0A = \u66F4\u5347\uFF09\uFF0C\u952E\u4E0A\u8DDF\u7740\u663E\u793A\n      const ak = w.querySelector<HTMLElement>(\"[data-accshift]\")!;\n      let akDrag: { pid: number; y0: number; i0: number } | null = null;\n      ak.addEventListener(\"pointerdown\", (e) => {\n        e.preventDefault(); try { ak.setPointerCapture(e.pointerId); } catch { /* \u5408\u6210\u4E8B\u4EF6 */ }\n        if (akDrag) return;\n        akDrag = { pid: e.pointerId, y0: e.clientY, i0: ACC_ORDER.indexOf(this.accSel) };\n        this.host.onAccShift(\"down\", this.accSel);\n      });\n      ak.addEventListener(\"pointermove\", (e) => {\n        if (!akDrag || e.pointerId !== akDrag.pid) return;\n        const i = Math.max(0, Math.min(ACC_ORDER.length - 1, akDrag.i0 - Math.trunc((akDrag.y0 - e.clientY) / SWIPE)));   // \u5F80\u4E0A\u6ED1 = \u4E0B\u6807\u53D8\u5C0F = \u66F4\u5347\n        if (ACC_ORDER[i] !== this.accSel) { this.accSel = ACC_ORDER[i]; this.host.onAccShift(\"slide\", this.accSel); this.refresh(this.host.view()); }\n      });\n      const akUp = (e: PointerEvent) => { if (!akDrag || e.pointerId !== akDrag.pid) return; akDrag = null; this.host.onAccShift(\"up\", this.accSel); };\n      for (const t of [\"pointerup\", \"pointercancel\", \"lostpointercapture\"]) ak.addEventListener(t, (e) => akUp(e as PointerEvent));\n    }\n    const hr = this.hint(), gridSig = this.symbols !== \"off\" ? `symbols|${this.symPage}|${this.ramp.mode}|${this.host.staves()}|${this.symStates()}` : `${this.host.music.sig()}|${base}|${rows}x${this.cols}|${this.layoutMode}|${hr ? `${hr.lo}-${hr.hi}-${hr.who}` : \"-\"}`;\n    if (gridSig !== this.gridFor) { if (this.symbols !== \"off\") this.buildSymbols(); else this.buildGrid(base, rows); this.gridFor = gridSig; }\n    const toolSig = this.mode === \"normal\" ? `normal|${v.hasSel}|${this.symbols !== \"off\" ? `${this.symPage}|${this.ramp.mode}` : \"\"}` : `${this.mode}|${v.hasSel}|${rows}|${this.cols}|${this.rowsSetting}|${this.layoutMode}|${this.mode === \"more\" ? JSON.stringify(this.host.music.marksHere()) : \"\"}`;\n    if (toolSig !== this.toolsFor) { this.buildHead(rows); this.toolsFor = toolSig; }\n    this.refresh(v);\n  }\n\n  /** \u8FD9\u4E00\u9875\u7B26\u53F7\u683C\u7684\u72B6\u6001\u7B7E\u540D\uFF08\u8C01\u4E0D\u8BA4 / \u8C01\u4EAE\u7740\uFF09\uFF1A\u53D8\u4E86\u5C31\u91CD\u5EFA\u683C\u5B50\u3002 */\n  private symStates(): string { return SYM_PAGES[this.symPage].map((id) => { const ks = this.host.keyState?.(id); return ks ? `${ks.off ? \"x\" : \"\"}${ks.on ? \"o\" : \"\"}` : \"\"; }).join(\",\"); }\n  private cands(rows: number): string {\n    const back = `<button class=\"btn cand\" data-back=\"1\">\u8FD4\u56DE</button>`;\n    const c = (attrs: string, label: string, on = false, title = \"\") => `<button class=\"btn cand${on ? \" is-on\" : \"\"}\" ${attrs}${title ? ` title=\"${title}\"` : \"\"}>${label}</button>`;\n    switch (this.mode) {\n      // \u300C\u22EF\u300D\u91CC\u53EF\u4EE5\u591A\u884C\uFF1A\u63D2\u8BB0\u53F7\u76F4\u63A5\u5C55\u5F00\uFF08user\u300C...\u91CC\u9762\u53EF\u4EE5\u591A\u884C\uFF0C\u653E\u5F88\u591A\u4E1C\u897F\u3002\u6240\u4EE5\u63D2\u8BB0\u53F7\u53EF\u4EE5\u5C55\u5F00\uFF0C\u7136\u540E\u5E94\u8BE5\u4E5F\u662F\u7528\u97F3\u4E50\u7B26\u53F7\uFF1F\u4E5F\u8BB8\u7528\u4E00\u4E2A\u52A0\u53F7\uFF1F\u300D\uFF09\uFF1B\n      // \u6309\u94AE\u4E0A\u5199\u5149\u6807\u5904\u6B63\u751F\u6548\u7684\u90A3\u4E2A\uFF08\u63D2\u8FDB\u53BB\u7684\u9ED8\u8BA4\u503C\uFF09\uFF0C\u8C03\u53F7\u5199\u300C1=G\u300D\u4E0D\u5199 \u266F\u266D\uFF08user\u300C+1=G\u624D\u6BD4\u8F83\u597D\u61C2\u5427\uFF0C+#b\u53EA\u4F1A\u8BA9\u4EBA\u89C9\u5F97\u662F\u52A0\u5347\u964D\u53F7\u300D\uFF09\uFF1B\n      // \u300C+\u300D\u5728\u7B26\u53F7\u5DE6\u8FB9\u3001\u5C0F\u4E00\u53F7\u6D45\u4E00\u8272\uFF08user\u300C\u4E0D\u8FC7\u52A0\u53F7\u548C\u540E\u9762\u7684\u4E1C\u897F\u4E5F\u8BB8\u9700\u8981\u5206\u5F00\u6765\u300D\u2192 \u8BD5\u8FC7\u5DE6\u4E0A\u89D2\u89D2\u6807 \u2192\u300C\u592A\u4E0D\u663E\u773C\u4E86\uFF0C\u80FD\u4E0D\u80FD\u653E\u5728\u7B26\u53F7\u5DE6\u8FB9\uFF0C\u53EA\u662F\u5B57\u53F7\u548C\u989C\u8272\u62C9\u5F00\u5DEE\u8DDD\u300D\uFF09\n      case \"more\": {\n        const m = this.host.music.marksHere(), plus = `<span class=\"plus\">+</span>`;\n        const digits = (n: number) => [...String(n)].map((ch) => TS(Number(ch))).join(\"\");\n        return c(`data-mark=\"key\"`, `${plus}1=${m.key}`, false, \"\u63D2\u8C03\u53F7\uFF08\u5728\u5149\u6807\u5904\uFF1B\u5148\u586B\u73B0\u5728\u7684\uFF0C\u63D2\u4E86\u518D\u6539\uFF09\") +\n          c(`data-mark=\"time\"`, `${plus}<span class=\"mg ts\"><span>${digits(m.beats)}</span><span>${digits(m.beatType)}</span></span>`, false, \"\u63D2\u62CD\u53F7\uFF08\u5728\u5149\u6807\u5904\uFF1B\u5148\u586B\u73B0\u5728\u7684\uFF0C\u63D2\u4E86\u518D\u6539\uFF09\") +\n          c(`data-mark=\"tempo\"`, `${plus}<span class=\"mg met\">${QUARTER}</span><span class=\"eq\">=${m.bpm}</span>`, false, \"\u63D2\u901F\u5EA6\uFF08\u5728\u5149\u6807\u5904\uFF1B\u5148\u586B\u73B0\u5728\u7684\uFF0C\u63D2\u4E86\u518D\u6539\uFF09\") +\n          c(`data-autobars=\"1\"`, \"\u81EA\u52A8\u5C0F\u8282\u7EBF\", this.host.autoBars(), \"\u6309\u62CD\u53F7\u81EA\u52A8\u753B\u5C0F\u8282\u7EBF\uFF08\u53EA\u753B\u3001\u4E0D\u8FDB\u6570\u636E\uFF09\uFF1B\u624B\u63D2\u7684\u300C|\u300D= \u4ECE\u90A3\u91CC\u91CD\u65B0\u6570\uFF0C\u5F31\u8D77 = \u5199\u5B8C\u5F31\u8D77\u7684\u97F3\u6309\u4E00\u4E0B\u300C|\u300D\") +\n          (this.host.staves() === 2 ? c(`data-staff=\"1\"`, \"\u6362\u8C31\u8868\", false, \"\u5927\u8C31\u8868\uFF1A\u521A\u5199\u7684\u97F3\uFF08\u6216\u9009\u4E2D\u7684\uFF09\u632A\u5230\u53E6\u4E00\u5F20\u8C31\u8868\uFF1B\u518D\u6309\u4E00\u6B21\u56DE\u5230\u6309\u97F3\u9AD8\u81EA\u52A8\u5206\") : \"\") +\n          c(`data-open=\"layout\"`, \"\u5E03\u5C40\u2026\", false, \"\u51E0\u884C\u51E0\u5217\u3001\u9996\u8C03 / \u7EDD\u5BF9\") + back;\n      }\n      default: return \"\";\n    }\n  }\n\n  /** \u6700\u4E0A\u9762\u4E00\u6392\uFF1A1= / \u957F\u77ED / \u97F3\u57DF\u4E09\u4E2A\u5206\u5BBD\u5EA6\uFF0C\u300C\u22EF\u300D\u662F\u53F3\u8FB9\u4E00\u4E2A\u5C0F\u65B9\u5757\uFF08user\u300C...\u548C\u5DE6\u53F3\u5E94\u8BE5\u5BBD\u5EA6\u548C\u9AD8\u5EA6\u5DEE\u4E0D\u591A\uFF0C\u5176\u4ED6\u7684\u4E5F\u8BB8adaptive\u4E00\u4E9B\u300D\uFF09\uFF1B\n   *  \u300C\u22EF\u300D/ \u79FB\u8C03\u70B9\u5F00\u540E\u6574\u6392\u6362\u6210\u5019\u9009\u3002\uFF08\u8BD5\u8FC7\u653E pad \u6700\u4E0B\u9762\uFF0Cuser\u300C\u522B\u626D\uFF0C\u8FD8\u662F\u653E\u5728\u4E0A\u9762\u5427\u300D\uFF09 */\n  private buildHead(rows: number): void {\n    const box = this.el.querySelector<HTMLElement>(\".pad-head\")!;\n    box.className = `pad-head pad-tools ${this.mode === \"normal\" ? \"knobs\" : `cands m-${this.mode}`}`;\n    const tabs = this.symbols !== \"off\" && this.mode === \"normal\";   // \u7B26\u53F7\u5C42\uFF1A1= / \u957F\u77ED / \u97F3\u57DF\uFF08\u53EA\u7BA1\u97F3\u952E\uFF09\u6362\u6210\u4E09\u9875\u7684\u6807\u7B7E\uFF0C\u4F4D\u7F6E / \u5927\u5C0F\u4E0D\u53D8\n    box.innerHTML = this.mode !== \"normal\" ? this.cands(rows) : tabs ?\n      (Object.keys(SYM_PAGES) as SymPage[]).map((pg) => `<button class=\"btn sym-tab${pg === this.symPage ? \" is-on\" : \"\"}\" data-sympage=\"${pg}\" title=\"${SYM_PAGE_TITLE[pg]}\">${SYM_PAGE_NAME[pg]}${pg === \"dyn\" && this.ramp.mode !== \"off\" ? `<small class=\"ramp-tag${this.ramp.mode === \"lock\" ? \" lock\" : \"\"}\">\u6E10\u5230</small>` : \"\"}</button>`).join(\"\") +\n      `<button class=\"btn kb-switch\" data-kbswitch=\"1\" title=\"\u6362\u56DE\u97F3\u952E\uFF08\u5199\u97F3 / \u4F11\u6B62 / \u5C0F\u8282\u7EBF\uFF09\">\u97F3</button>` +\n      `<button class=\"btn impro-pad${this.host.isImpro() ? \" is-on\" : \"\"}\" data-impro=\"1\" title=\"\u5F39\uFF1A\u97F3\u952E\u53EA\u54CD\u4E0D\u5199\uFF08\u5FEB\u6377\u952E \\`\uFF09\uFF1B\u518D\u70B9\u56DE\u5230\u5199\">\u5F39</button>` +\n      `<button class=\"btn hide-pad\" data-hide=\"1\" title=\"\u6536\u8D77\u952E\u76D8\uFF08\u70B9\u4E94\u7EBF\u8C31\u518D\u5F39\u51FA\u6765\uFF09\">\u6536\u8D77</button>` +\n      `<button class=\"btn knob k-more\" data-knob=\"more\" title=\"\u66F4\u591A\uFF1A\u5E03\u5C40\u3001\u63D2\u8BB0\u53F7\"><span class=\"kl\">\u22EF</span></button>` :\n      `<button class=\"btn knob k-key\" data-knob=\"key\" title=\"1=\uFF08pad \u81EA\u5DF1\u7684\u8C03\uFF09\uFF1A\u6309\u4F4F\u4E0A\u4E0B\u6ED1 / \u70B9\u5F00\u9009\uFF08\u4E94\u5EA6\u5708\uFF09\"><span class=\"kl\"></span><span class=\"kh\">\u21C5</span></button>` +\n      `<button class=\"btn knob k-unit\" data-knob=\"unit\" title=\"\u957F\u77ED\u57FA\u7EBF\uFF1A\u6309\u4F4F\u4E0A\u4E0B\u6ED1 / \u70B9\u5F00\u9009\uFF08\u542B\u8FDE\u97F3\uFF09\"><span class=\"kl\"></span><span class=\"kh\">\u21C5</span></button>` +\n      `<button class=\"btn knob k-range\" data-knob=\"range\" title=\"\u97F3\u57DF\uFF08\u8FD9\u5757 pad \u4ECE\u54EA\u4E2A\u97F3\u5230\u54EA\u4E2A\u97F3\uFF09\uFF1A\u6309\u4F4F\u4E0A\u4E0B\u6ED1 / \u70B9\u5F00\u9009\u2014\u2014\u50CF\u63A8\u4E00\u5F20\u7EB8\uFF0C\u5F80\u4E0A\u63A8 = \u770B\u4E0B\u9762\u66F4\u4F4E\u7684\"><span class=\"kl\"></span><span class=\"kh\">\u21C5</span></button>` +\n      `<button class=\"btn kb-switch\" data-kbswitch=\"1\" title=\"\u6362\u6210\u7B26\u53F7\u683C\uFF08\u529B\u5EA6\u3001\u6E10\u5F3A\u6E10\u5F31\u3001\u6F14\u594F\u6CD5\u3001\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\u3001\u53CD\u590D\u3001\u98CE\u683C\u3001\u53E5\u53F7\uFF09\u2014\u2014\u8C31\u4E0A\u97F3\u548C\u8BB0\u53F7\u672C\u6765\u5C31\u4E00\u8D77\u6539\uFF0C\u8FD9\u91CC\u53EA\u6362\u952E\u76D8\">\u7B26</button>` +\n      `<button class=\"btn impro-pad${this.host.isImpro() ? \" is-on\" : \"\"}\" data-impro=\"1\" title=\"\u5F39\uFF1A\u97F3\u952E\u53EA\u54CD\u4E0D\u5199\uFF08\u5FEB\u6377\u952E \\`\uFF09\uFF1B\u518D\u70B9\u56DE\u5230\u5199\">\u5F39</button>` +\n      `<button class=\"btn hide-pad\" data-hide=\"1\" title=\"\u6536\u8D77\u952E\u76D8\uFF08\u70B9\u4E94\u7EBF\u8C31\u518D\u5F39\u51FA\u6765\uFF09\">\u6536\u8D77</button>` +\n      `<button class=\"btn knob k-more\" data-knob=\"more\" title=\"\u66F4\u591A\uFF1A\u5E03\u5C40\u3001\u63D2\u8BB0\u53F7\"><span class=\"kl\">\u22EF</span></button>`;\n    box.querySelectorAll<HTMLElement>(\"[data-knob]\").forEach((b) => { b.addEventListener(\"pointerdown\", (e) => { e.preventDefault(); this.knobDown(b, e); }); b.addEventListener(\"wheel\", (e) => this.knobWheel(b, e), { passive: false }); });\n    // \u5019\u9009\n    this.on(box, \"[data-open]\", () => { this.back(); this.openLayout(); });   // \u300C\u5E03\u5C40\u2026\u300D= \u5BF9\u8BDD\u6846\uFF08\u4E0D\u518D\u5360 pad \u5934\u90A3\u4E00\u6392\uFF1A\u6362\u6210\u51E0\u6392\u4F1A\u628A\u952E\u76D8\u6324\u53D8\u5F62\uFF1Buser 2026-10-08\u300C\u8981\u4E0D\u952E\u76D8layout\u8FD8\u662F\u4E00\u4E2A\u6A21\u6001\u5BF9\u8BDD\u6846\uFF0C\u4E0D\u4F1A\u7834\u574F\u952E\u76D8\u7684\u5C3A\u5BF8\u300D\uFF09\n    this.on(box, \"[data-mark]\", (b) => { this.back(); this.key(b.dataset.mark!); });\n    this.on(box, \"[data-staff]\", () => { this.key(\"staff\"); });\n    this.on(box, \"[data-back]\", () => this.back());\n    this.on(box, \"[data-impro]\", () => this.host.onImpro());\n    this.on(box, \"[data-kbswitch]\", () => this.host.onKbSwitch?.());\n    this.on(box, \"[data-sympage]\", (b) => { this.symPage = b.dataset.sympage as SymPage; this.render(); });\n    this.on(box, \"[data-hide]\", () => this.host.onHide());   // \u300C\u22EF\u300D\u5DE6\u8FB9\u7684\u6536\u8D77\u952E\u76D8\uFF08user\u300C...\u5DE6\u8FB9\u52A0\u4E00\u4E2Ahide keyboard\u7684\u65B9\u5F62\u5C0F\u6309\u94AE\u300D\uFF09\n    this.on(box, \"[data-autobars]\", () => { this.host.onAutoBars(!this.host.autoBars()); this.toolsFor = \"\"; this.render(); });   // \u5F00\u5173\uFF1A\u70B9\u4E86\u4E0D\u6536\uFF0C\u94AE\u4E0A\u4EAE / \u706D\n  }\n\n  /** \u952E\u76D8\u5E03\u5C40\u5BF9\u8BDD\u6846\uFF08\u300C\u22EF \u2192 \u5E03\u5C40\u2026\u300D\uFF09\uFF1A\u884C / \u5217 = \u52A0\u51CF\u53F7\u6B65\u8FDB\uFF08user 2026-10-08\u300C\u2026\u4F18\u5316\u4E00\u4E0B\uFF0C\u6BD4\u5982\u53D8\u6210\u52A0\u51CF\u53F7\u300D\uFF09\uFF0C\u4E8C\u9009\u4E00 = \u5206\u6BB5\u94AE\u3002\n   *  \u70B9\u4E86\u9A6C\u4E0A\u751F\u6548\uFF08\u5BF9\u8BDD\u6846\u9760\u4E0A\u3001\u952E\u76D8\u5728\u4E0B\u9762\u770B\u5F97\u89C1\uFF09\uFF0C\u597D / \u70B9\u5916\u9762 / Esc \u6536\u8D77\u3002 */\n  private openLayout(): void {\n    document.querySelector(\".offer.pad-layout\")?.remove();\n    const box = document.createElement(\"div\");\n    box.className = \"offer pad-layout\";\n    const c = (attrs: string, label: string, on = false, title = \"\") => `<button type=\"button\" class=\"btn cand${on ? \" is-on\" : \"\"}\" ${attrs}${title ? ` title=\"${title}\"` : \"\"}>${label}</button>`;\n    const step = (k: \"r\" | \"c\", name: string, v: number, lo: number, hi: number) =>\n      `<button type=\"button\" class=\"btn cand lay-step\" data-${k}step=\"-1\"${v <= lo ? \" disabled\" : \"\"} title=\"\u5C11\u4E00${name}\">\u2212</button><span class=\"lay-v\">${v}</span>` +\n      `<button type=\"button\" class=\"btn cand lay-step\" data-${k}step=\"1\"${v >= hi ? \" disabled\" : \"\"} title=\"\u591A\u4E00${name}\">+</button>`;\n    const grp = (label: string, inner: string, title = \"\") => `<div class=\"lay-line\"><span class=\"lay-k\">${label}</span><span class=\"lay-grp\"${title ? ` title=\"${title}\"` : \"\"}>${inner}</span></div>`;\n    const body = () => grp(\"\u884C\", step(\"r\", \"\u884C\", this.rows(), ROWS_MIN, ROWS_MAX) + c(`data-rows=\"auto\"`, \"\u81EA\u52A8\", this.rowsSetting === \"auto\", \"\u6309\u5C4F\u5E55\u9AD8\u5EA6\u81EA\u52A8\u5B9A\u51E0\u884C\"), \"\u952E\u76D8\u51E0\u884C\uFF08\u9AD8\u5EA6\uFF09\") +\n      grp(\"\u5217\", step(\"c\", \"\u5217\", this.cols, COLS_MIN, COLS_MAX), \"\u952E\u76D8\u51E0\u5217\") +\n      grp(\"\u952E\u4F4D\", c(`data-pl=\"movable\"`, \"\u9996\u8C03\", this.layoutMode === \"movable\", \"\u6BCF\u884C\u4ECE 1 \u8D77\uFF0C\u8DDF\u7740\u300C1=\u300D\u8D70\") + c(`data-pl=\"absolute\"`, \"\u7EDD\u5BF9\", this.layoutMode === \"absolute\", \"\u6BCF\u884C\u4ECE C \u8D77\uFF08\u4E0D\u8DDF\u7740\u300C1=\u300D\u632A\uFF09\")) +\n      grp(\"\u6ED1\", c(`data-swipe=\"glide\"`, \"\u6EDA\u952E\u76D8\", this.swipeMode === \"glide\", \"\u624B\u6307\u6309\u7740\u6ED1\u5230\u4E0B\u4E00\u4E2A\u952E = \u54CD\u4E0B\u4E00\u4E2A\uFF08\u5199\u7684\u65F6\u5019\u4E00\u8DEF\u5199\uFF09\") + c(`data-swipe=\"alter\"`, \"\u5347\u964D\", this.swipeMode === \"alter\", \"\u5728\u97F3\u952E\u4E0A\u4E0A\u4E0B\u6ED1 = \u8FD9\u4E00\u4E2A\u97F3\u5347 / \u964D\uFF08\u9ECF\u7740\uFF09\"));\n    box.innerHTML = `<div class=\"offer-card pad-layout-card\"><div class=\"offer-title\">\u952E\u76D8\u5E03\u5C40</div><div class=\"lay-body\">${body()}</div>` +\n      `<div class=\"offer-btns\"><button type=\"button\" class=\"btn primary\" data-v=\"close\">\u597D</button></div></div>`;\n    document.body.append(box);\n    const lay = box.querySelector<HTMLElement>(\".lay-body\")!;\n    const esc = (e: KeyboardEvent) => { if (e.key === \"Escape\") { e.preventDefault(); e.stopPropagation(); close(); } };\n    const close = () => { window.removeEventListener(\"keydown\", esc, true); box.remove(); };\n    window.addEventListener(\"keydown\", esc, true);\n    box.addEventListener(\"pointerdown\", (e) => { if (e.target === box) { e.preventDefault(); close(); } });\n    box.addEventListener(\"click\", (e) => {\n      const b = (e.target as HTMLElement).closest<HTMLButtonElement>(\"button\"); if (!b || b.disabled) return;\n      const d = b.dataset;\n      if (d.v === \"close\") { close(); return; }\n      if (d.rstep) this.rowsSetting = Math.max(ROWS_MIN, Math.min(ROWS_MAX, this.rows() + Number(d.rstep)));\n      else if (d.cstep) this.cols = Math.max(COLS_MIN, Math.min(COLS_MAX, this.cols + Number(d.cstep)));\n      else if (d.rows) this.rowsSetting = \"auto\";\n      else if (d.pl) this.layoutMode = d.pl === \"absolute\" ? \"absolute\" : \"movable\";\n      else if (d.swipe) this.swipeMode = d.swipe === \"alter\" ? \"alter\" : \"glide\";\n      else return;\n      this.render(); lay.innerHTML = body();\n    });\n  }\n  /** \u7B26\u53F7\u5C42\uFF08user 2026-10-08\u300C\u547C\u5438\u7684\u8BDD\u6211\u5EFA\u8BAE\u5C31\u662F\u7279\u6B8A\u7B26\u53F7\u5427\uFF0C\u4E13\u95E8\u7684\u7279\u6B8A\u7B26\u53F7\uFF0C\u8F6F\u952E\u76D8\u91CC\u9762\u540E\u9762\u6709\u4E00\u4E2A\u7B26\u53F7\u6A21\u5F0F\u300D\u300C\u901F\u5EA6\u7B26\u53F7\u8C03\u53F7\u7B26\u53F7\u4E5F\u90FD\u5728\u91CC\u9762\u2026row col \u8D85\u4E86\u53EF\u4EE5\u62D6\u52A8\u6EDA\u300D\uFF09\uFF1A\n   *  \u548C\u97F3\u952E\u4E00\u6837\u5927\u7684\u683C\u5B50\uFF0C\u591A\u4E86\u5F80\u4E0B\u6EDA\uFF1B\u70B9\u4E00\u4E2A = \u505A\u90A3\u4EF6\u4E8B\uFF0C\u7B26\u53F7\u5C42\u7559\u7740\uFF08\u53EA\u6709 caps\uFF0C2026-10-09\uFF09\u3002 */\n  private buildSymbols(): void {\n    const grid = this.el.querySelector<HTMLElement>(\".pad-grid\")!;\n    const cell = (id: string, big: string, label: string, title: string, state = \"\") => {\n      // \u53F0\u4E0A\u8FD9\u4F4D\u4E0D\u8BA4\uFF08off\uFF09\uFF1A\u7167\u6837\u80FD\u5199\uFF0C\u683C\u5B50\u6807\u51FA\u6765\uFF08\u4E0D\u9759\u9ED8\u5931\u6548\uFF09\uFF1B\u529B\u5EA6\uFF1A\u73B0\u5728\u751F\u6548\u7684\u90A3\u4E2A\u4EAE\u7740\uFF08on\uFF09\u3002\u54EA\u4E2A\u683C\u5B50\u5199\u54EA\u79CD\u8BB0\u53F7 = \u5BBF\u4E3B\u7684\u4E8B\uFF08keyState\uFF09\n      const ks = this.host.keyState?.(id) ?? {}, art = /^(art:|inhale:|swell:)|^slur$/.test(id), off = !!ks.off, on = !!ks.on;\n      return `<button class=\"pad-key sym${art ? \" art\" : \"\"}${off ? \" ignored\" : \"\"}${on ? \" is-on\" : \"\"}${state ? ` ${state}` : \"\"}\" data-sym=\"${id}\" title=\"${title}${off ? \"\uFF08\u53F0\u4E0A\u8FD9\u4F4D\u4E0D\u8BA4\uFF1A\u5199\u5728\u8C31\u4E0A\u753B\u7070\uFF0C\u51FA\u58F0\u4E0D\u53D7\u5F71\u54CD\uFF09\" : \"\"}\">${big}<small>${label}${off ? `<span class=\"ign-tag\">\u4E0D\u8BA4</span>` : \"\"}</small></button>`;\n    };\n    const items = [\n      cell(\"phrase\", `<span class=\"big\">\u3002</span>`, \"\u53E5\u53F7\", \"\u53E5\u53F7\uFF1A\u8FD9\u4E00\u53E5\u5230\u8FD9\u513F\uFF08\u53EA\u7ED9\u300C\u5408\u300D\u632A\u5B57\u5F53\u8FB9\u754C\uFF1B\u4E0D\u6362\u6C14\u3001\u4E0D\u6362\u884C\u3001\u4E0D\u662F\u5C0F\u8282\u7EBF\u3001\u4E0D\u8FDB MusicXML\uFF09\"),\n      cell(\"art:arpeggio\", `<span class=\"smufl\">\\uEAA9\\uEAA9</span>`, \"\u7436\u97F3\", \"\u7436\u97F3\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u548C\u5F26\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\uFF09\u4ECE\u4F4E\u5230\u9AD8\u4F9D\u6B21\u594F\u51FA\uFF08\u548C\u5F26\u5DE6\u8FB9\u4E00\u6761\u6CE2\u6D6A\u7EBF\uFF09\uFF1B\u518D\u70B9\u4E00\u6B21\u53BB\u6389\"),\n      cell(\"art:staccato\", `<span class=\"smufl\">\\uE4A2</span>`, \"\u8DF3\u97F3\", \"\u8DF3\u97F3\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\uFF09\u5531 / \u5F39\u5F97\u77ED\u4FC3\uFF1B\u518D\u70B9\u4E00\u6B21\u53BB\u6389\"),\n      cell(\"art:ghost\", `<span class=\"smufl\">\\uE0F5\\uE0A4\\uE0F6</span>`, \"\u5E7D\u7075\u97F3\", \"\u5E7D\u7075\u97F3\uFF08\u62EC\u53F7\u7B26\u5934\uFF09\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\uFF09\u5F88\u8F7B\u3001\u51E0\u4E4E\u542C\u4E0D\u89C1\uFF1B\u97F3\u7684\u5F3A\u5EA6\u53EA\u6709\u4E00\u79CD\uFF1A\u548C\u5F31\u5316 / \u6B21\u91CD\u97F3 / \u91CD\u97F3 / \u5F3A\u97F3 / \u7A81\u5F3A / \u5F3A\u540E\u5373\u5F31\u4E92\u65A5\"),\n      cell(\"art:unstress\", `<span class=\"smufl\">\\uE4B8</span>`, \"\u5F31\u5316\", \"\u5F31\u5316\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\uFF09\u8F7B\u4E00\u70B9\uFF1B\u548C\u522B\u7684\u5F3A\u5EA6\u4E92\u65A5\"),\n      cell(\"art:stress\", `<span class=\"smufl\">\\uE4B6</span>`, \"\u6B21\u91CD\u97F3\", \"\u6B21\u91CD\u97F3\uFF1A\u6BD4\u91CD\u97F3\u8F7B\u7684\u91CD\u97F3\uFF08\u56DB\u62CD\u5B50\u300C\u5F3A\u5F31\u6B21\u5F3A\u5F31\u300D\u7684\u6B21\u5F3A\uFF09\uFF1B\u548C\u522B\u7684\u5F3A\u5EA6\u4E92\u65A5\"),\n      cell(\"art:accent\", `<span class=\"smufl\">\\uE4A0</span>`, \"\u91CD\u97F3\", \"\u91CD\u97F3\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\uFF09\u52A0\u91CD\uFF1B\u518D\u70B9\u4E00\u6B21\u53BB\u6389\"),\n      cell(\"art:marcato\", `<span class=\"smufl\">\\uE4AC</span>`, \"\u5F3A\u97F3\", \"\u5F3A\u97F3\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\uFF09\u6BD4\u91CD\u97F3\u66F4\u91CD\uFF1B\u518D\u70B9\u4E00\u6B21\u53BB\u6389\"),\n      cell(\"art:sfz\", `<span class=\"smufl\">\\uE539</span>`, \"\u7A81\u5F3A\", \"\u7A81\u5F3A sfz\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\uFF09\u97F3\u5934\u731B\u5730\u51B2\u4E00\u4E0B\u518D\u843D\u56DE\u6765\uFF1B\u548C\u91CD\u97F3 / \u5F3A\u97F3 / fp \u4E92\u65A5\"),\n      cell(\"art:fp\", `<span class=\"smufl\">\\uE534</span>`, \"\u5F3A\u540E\u5373\u5F31\", \"\u5F3A\u540E\u5373\u5F31 fp\uFF1A\u97F3\u5934 f\uFF0C\u9A6C\u4E0A\u843D\u5230 p\uFF0C\u4E4B\u540E\u7684\u97F3\u90FD\u662F p\uFF1B\u548C\u91CD\u97F3 / \u5F3A\u97F3 / sfz \u4E92\u65A5\"),\n      cell(\"art:tenuto\", `<span class=\"smufl\">\\uE4A4</span>`, \"\u4FDD\u6301\", \"\u4FDD\u6301\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\uFF09\u5531 / \u5F39\u6EE1\uFF1B\u518D\u70B9\u4E00\u6B21\u53BB\u6389\"),\n      cell(\"wedge:cresc\", CRESC_CELL, \"\u6E10\u5F3A\", \"\u6E10\u5F3A <\uFF1A\u4ECE\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u533A\u7B2C\u4E00\u4E2A\u97F3\uFF09\u8D77\uFF0C\u4E00\u8DEF\u6E10\u5F3A\u5230\u8FD9\u5F20\u7EB8\u91CC\u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\uFF1B\u6CA1\u5199 = \u8D70\u4E00\u6863\uFF08\u8C31\u4E0A\u7070\u5B57\u6807\u51FA\u63A8\u5B9A\u7684\u7EC8\u70B9\uFF09\uFF1B\u518D\u70B9\u4E00\u6B21\u53BB\u6389\"),\n      cell(\"wedge:dim\", DIM_CELL, \"\u6E10\u5F31\", \"\u6E10\u5F31 >\uFF1A\u4ECE\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u533A\u7B2C\u4E00\u4E2A\u97F3\uFF09\u8D77\uFF0C\u4E00\u8DEF\u6E10\u5F31\u5230\u8FD9\u5F20\u7EB8\u91CC\u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\uFF1B\u6CA1\u5199 = \u8D70\u4E00\u6863\uFF08\u8C31\u4E0A\u7070\u5B57\u6807\u51FA\u63A8\u5B9A\u7684\u7EC8\u70B9\uFF09\uFF1B\u518D\u70B9\u4E00\u6B21\u53BB\u6389\"),\n      ...([\"ppp\", \"pp\", \"p\", \"mp\", \"mf\", \"f\", \"ff\", \"fff\"] as const).map((d) => cell(`dyn:${d}`, `<span class=\"smufl\">${DYN_CELL[d]}</span>`, \"\u529B\u5EA6\", `\u529B\u5EA6 ${d}\uFF1A\u4ECE\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u8D77\uFF08\u6709\u9009\u533A = \u9009\u533A\u5F00\u5934\uFF09\uFF0C\u7BA1\u5230\u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\uFF1B\u90A3\u513F\u5DF2\u7ECF\u662F\u5B83 = \u53BB\u6389\uFF08user 2026-10-08\u300Cmp mf \u5728\u54EA\u91CC\u52A0\u554A\u300D\uFF09`)),\n      cell(\"dyn:ramp\", RAMP_CELL, \"\u6E10\u5230\", \"\u6E10\u5230\uFF1A\u70B9\u4E00\u4E0B = \u4E0B\u4E00\u4E2A\u529B\u5EA6\u4ECE\u8FD9\u5F20\u7EB8\u91CC\u4E0A\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u90A3\u513F\u4E00\u8DEF\u6E10\u53D8\u8FC7\u6765\uFF08\u8C31\u4E0A\u753B\u865A\u7EBF\u53D1\u5939\uFF1B\u624B\u5199\u7684\u6E10\u5F3A\u6E10\u5F31\u662F\u5B9E\u7EBF\uFF09\uFF1B\u8FDE\u70B9\u4E24\u4E0B = \u9501\u4F4F\uFF0C\u4E4B\u540E\u5199\u7684\u529B\u5EA6\u90FD\u662F\u6E10\u5230\uFF1B\u518D\u70B9 = \u5173\u3002\u4E0D\u5F00 = \u5230\u90A3\u513F\u7A81\u53D8\", this.ramp.mode === \"off\" ? \"\" : this.ramp.mode),\n      ...([\"<\", \">\", \"<>\"] as const).map((w) => cell(`swell:${w}`, SWELL_CELL[w], w === \"<\" ? \"\u97F3\u5185\u6E10\u5F3A\" : w === \">\" ? \"\u97F3\u5185\u6E10\u5F31\" : \"\u97F3\u5185\u9F13\u8D77\", `${w === \"<\" ? \"\u97F3\u5185\u6E10\u5F3A\" : w === \">\" ? \"\u97F3\u5185\u6E10\u5F31\uFF08\u952F\u9F7F\uFF09\" : \"\u97F3\u5185\u9F13\u8D77\uFF08messa di voce\uFF09\"}\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\uFF09\u81EA\u5DF1\u91CC\u9762\u7684\u8D77\u4F0F\uFF1B\u548C\u6BB5\u843D\u7684\u6E10\u5F3A\u6E10\u5F31\u662F\u4E24\u5C42\uFF0C\u53EF\u4EE5\u53E0\uFF1B\u518D\u70B9 = \u53BB\u6389`)),\n      cell(\"slur\", SLUR_CELL, \"\u8FDE\u7EBF\", \"\u8FDE\u7EBF\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u8FDE\u5230\u4E0B\u4E00\u4E2A\u97F3\uFF08\u8FDE\u594F\u3001\u4E0D\u7559\u7F1D\uFF1B\u6709\u9009\u533A = \u9009\u4E2D\u7684\u8FDE\u8D77\u6765\uFF1B\u518D\u70B9\u4E00\u6B21\u53BB\u6389\uFF09\u3002\u540C\u4E00\u4E2A\u97F3\u4E0A\u53C8\u6709\u547C\u5438 = \u547C\u5438\u7B97\u6570\uFF1A\u90A3\u91CC\u7167\u6837\u65AD\u5F00\u6362\u6C14\uFF0C\u8FDE\u7EBF\u7167\u753B\"),\n      cell(\"art:breath\", `<span class=\"smufl\">\\uE4CE</span>`, \"\u547C\u5438\", \"\u547C\u5438\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u540E\u9762\u6362\u4E00\u53E3\u6C14\uFF08\u5C0F\u6708\u76F8\u5531\u5230\u8FD9\u513F\u6362\u6C14\uFF1B\u4E50\u5668\u5728\u8FD9\u513F\u7A0D\u5FAE\u65AD\u5F00\uFF1B\u8FDE\u7EBF\u8FDE\u7740\u4E5F\u7167\u6837\u65AD\u5F00\uFF1B\u518D\u70B9\u4E00\u6B21\u53BB\u6389\uFF09\"),\n      cell(\"inhale:soft\", `<span class=\"glyphs\"><span class=\"smufl\">\\uE4CE</span><span class=\"big\">\u5438</span></span>`, \"\u8F7B\u5438\", \"\u51FA\u58F0\u7684\u6362\u6C14\uFF08\u8F7B\u5438\uFF09\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u540E\u9762\u6362\u6C14\u3001\u542C\u5F97\u89C1\u5438\u6C14\u58F0\uFF08\u6CA1\u6709\u547C\u5438\u8BB0\u53F7\u5C31\u8FDE\u9017\u53F7\u4E00\u8D77\u52A0\u4E0A\uFF1B\u518D\u70B9\u4E00\u6B21 = \u6574\u4E2A\u53BB\u6389\uFF09\u3002\u53EA\u6709\u70B9\u4E86\u7684\u5730\u65B9\u624D\u51FA\u58F0\uFF0C\u666E\u901A\u7684\u547C\u5438\u8BB0\u53F7\u7167\u65E7\u9759\u9ED8\"),\n      cell(\"inhale:big\", `<span class=\"glyphs\"><span class=\"smufl\">\\uE4CE</span><span class=\"big\">\u6DF1\u5438</span></span>`, \"\u6DF1\u5438\", \"\u51FA\u58F0\u7684\u6362\u6C14\uFF08\u6DF1\u5438\uFF09\uFF1A\u5927\u53E3\u5438\u6C14\u3001\u6362\u6C14\u7684\u7A7A\u5F53\u4E5F\u957F\u4E00\u70B9\uFF08\u4ECE\u524D\u4E00\u4E2A\u97F3\u672B\u5C3E\u501F\u65F6\u95F4\uFF09\uFF1B\u518D\u70B9\u4E00\u6B21 = \u6574\u4E2A\u53BB\u6389\"),\n      cell(\"art:whisper\", `<span class=\"smufl\">\\uE0A9</span>`, \"\u6C14\u58F0\", \"\u6C14\u58F0\uFF08\u00D7 \u7B26\u5934\uFF09\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6709\u9009\u533A = \u9009\u4E2D\u7684\uFF09\u4E0D\u5531\u97F3\u9AD8\u3001\u7528\u6C14\u58F0\u5531\u8FD9\u4E2A\u5B57\uFF08\u5FF5\u767D / \u8033\u8BED\uFF09\uFF1B\u518D\u70B9\u4E00\u6B21\u53BB\u6389\u3002\u53EA\u6709\u5C0F\u6708\u76F8\u505A\u5F97\u5230\uFF0C\u4E50\u5668\u4E0A\u753B\u7070\"),\n      cell(\"key\", `<span class=\"big\">1=</span>`, \"\u8C03\u53F7\", \"\u63D2\u8C03\u53F7\uFF08\u5728\u5149\u6807\u5904\uFF1B\u5148\u586B\u73B0\u5728\u7684\uFF0C\u63D2\u4E86\u518D\u6539\uFF09\"),\n      cell(\"time\", `<span class=\"big\">4/4</span>`, \"\u62CD\u53F7\", \"\u63D2\u62CD\u53F7\uFF08\u5728\u5149\u6807\u5904\uFF09\"),\n      cell(\"tempo\", `<span class=\"glyphs\"><span class=\"smufl\">\\uE1D5</span><span class=\"big\">=</span></span>`, \"\u901F\u5EA6\", \"\u63D2\u901F\u5EA6\uFF08\u5728\u5149\u6807\u5904\uFF09\"),\n      cell(\"clef\", `<span class=\"smufl\">\\uE050</span>`, \"\u8C31\u53F7\", \"\u8C31\u53F7\uFF1A\u4ECE\u5149\u6807\u5904\u8D77\u6362\u8C31\u53F7\uFF08\u9AD8\u97F3 / \u4F4E\u97F3 / \u4E0B\u52A0 8 / \u4E0A\u52A0 8 / \u4E0A\u52A0 15\uFF09\uFF1B\u53EA\u7BA1\u753B\uFF0C\u97F3\u9AD8\u4E0D\u53D8\u3002\u6BCF\u884C\u5F00\u5934\u7684\u8C31\u53F7\u4E5F\u80FD\u76F4\u63A5\u70B9\"),\n      cell(\"ottava\", `<span class=\"smufl\">\\uE511</span>`, \"\u516B\u5EA6\u7EBF\", \"\u516B\u5EA6\u7EBF\uFF1A\u4ECE\u5149\u6807\u5904\u8D77\u8C31\u4E0A\u753B\u4F4E\uFF088va / 15ma\uFF09\u6216\u753B\u9AD8\uFF088vb\uFF09\uFF1B\u6709\u9009\u533A = \u8FD9\u4E00\u6BB5\uFF1B\u300C\u7ED3\u675F\u300D= \u5230\u8FD9\u513F\u6536\u3002\u53EA\u7BA1\u753B\uFF0C\u97F3\u9AD8\u4E0D\u53D8\"),\n      cell(\"groove\", `<span class=\"big it\">\u98CE\u683C</span>`, \"\u62CD\u5B50\u8F7B\u91CD\", \"\u98CE\u683C\u8BB0\u53F7\uFF1A\u4ECE\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u8D77\u5230\u8FD9\u5F20\u7EB8\u7ED3\u5C3E\uFF0C\u6BCF\u4E2A\u97F3\u6309\u5B83\u5728\u5C0F\u8282\u91CC\u7684\u4F4D\u7F6E\u8F7B\u4E00\u70B9 / \u91CD\u4E00\u70B9\uFF08\u53E4\u5178 / \u6D41\u884C / \u534E\u5C14\u5179 / \u8FDB\u884C\u66F2\u2026\u70B9\u5F00\u9009\uFF09\uFF1B\u6574\u5F20\u7EB8\u7684\u6B4C\u624B\u4E00\u8D77\u542C\uFF0C\u5404\u4EBA\u8DDF\u591A\u5C11\u6309\u4E50\u5668\"),\n      cell(\"repeat\", `<span class=\"big\">:|</span>`, \"\u53CD\u590D\", \"\u8C31\u5185\u53CD\u590D / \u8DF3\u8F6C\uFF1A|: :|\u3001\u623F\u5B50 1. 2.\u3001Segno / Coda / D.C. / D.S. / Fine\u2026\uFF08\u70B9\u5F00\u9009\uFF1B\u63D2\u5728\u5149\u6807\u5904\uFF0C\u6328\u7740\u5C0F\u8282\u7EBF = \u628A\u90A3\u6761\u6539\u6210\u53CD\u590D\u7684\uFF09\u3002\u4E0D\u8DE8\u7EB8\uFF1B\u653E\u7684\u65F6\u5019\u53EA\u770B\u8FD9\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4F4D\u6B4C\u624B\u90A3\u4E00\u884C\"),\n      ...(this.host.staves() === 2 ? [cell(\"staff\", `<span class=\"big\">\u21C5</span>`, \"\u6362\u8C31\u8868\", \"\u5927\u8C31\u8868\uFF1A\u8FD9\u4E2A\u97F3\u6362\u5230\u53E6\u4E00\u5F20\u8C31\u8868\")] : []),\n    ];\n    const byId = new Map(items.map((h) => [/data-sym=\"([^\"]+)\"/.exec(h)![1], h]));\n    grid.innerHTML = SYM_PAGES[this.symPage].flatMap((id) => byId.get(id) ?? []).join(\"\");\n    grid.classList.add(\"symbols\");\n    // \u7B26\u53F7\u5C42\u9AD8\u5EA6\u9489\u5728\u97F3\u952E\u90A3\u51E0\u6392\uFF08user 2026-10-08\u300C\u952E\u76D8\u9AD8\u5EA6\u80FD\u4E0D\u80FD\u548C\u8BBE\u7F6E\u7684row\u4E00\u6837\uFF0C\u5C31\u662F\u51E0\u4F55\u5F62\u72B6\u4E0D\u6539\u3002\u7136\u540E\u8FD9\u91CC\u591A\u51FA\u6765\u7684\u6EA2\u51FA\u7684\u53EF\u4EE5\u6EDA\u952E\u76D8\u300D\uFF09\uFF1A\n    //   \u683C\u5B50\u591A\u4E86\u5728\u683C\u5B50\u91CC\u4E0A\u4E0B\u6EDA \u2192 \u6309\u4E0B\u4E0D\u7B97\u6570\uFF0C\u62AC\u624B\u65F6\u6CA1\u6EDA\u8FC7\uFF08\u6D4F\u89C8\u5668\u5F00\u59CB\u6EDA = pointercancel\uFF09\u624D\u505A\uFF1B\u6309\u4E0B\u7167\u65E7 preventDefault\uFF08\u7126\u70B9\u4E0D\u79BB\u5F00\u8C31\uFF09\u3002\n    //   \u5206\u9875\u4EE5\u540E\u4E00\u9875\u4E00\u822C\u653E\u5F97\u4E0B\uFF1B\u653E\u4E0D\u4E0B\uFF08\u884C\u5217\u8C03\u5F97\u5F88\u5C11\uFF09\u7167\u65E7\u5728\u8FD9\u4E00\u9875\u91CC\u6EDA\uFF0C\u540C\u4E00\u9875\u91CD\u753B\u4E0D\u6EDA\u56DE\u9876\u4E0A\n    const keep = this.symBuilt === this.symPage ? grid.scrollTop : 0;\n    grid.scrollTop = keep; this.symBuilt = this.symPage;\n    let down: { id: number; b: HTMLElement; y: number; top: number } | null = null;\n    grid.querySelectorAll<HTMLElement>(\"[data-sym]\").forEach((b) => {\n      b.addEventListener(\"pointerdown\", (e) => { e.preventDefault(); down = { id: e.pointerId, b, y: e.clientY, top: grid.scrollTop }; });\n      b.addEventListener(\"pointercancel\", () => { down = null; });\n      b.addEventListener(\"pointerup\", (e) => {\n        const d = down; down = null;\n        if (!d || d.id !== e.pointerId || d.b !== b || Math.abs(e.clientY - d.y) > 10 || Math.abs(grid.scrollTop - d.top) > 4) return;\n        act(b);\n      });\n    });\n    const act = (b: HTMLElement) => {\n      const id = b.dataset.sym!;\n      if (id === \"dyn:ramp\") {   // \u4FEE\u9970\u952E\uFF08\u53EA\u6539\u4E0B\u4E00\u4E2A / \u4E4B\u540E\u7684\u529B\u5EA6\uFF09\uFF1A\u70B9\u4E00\u4E0B = \u4E0B\u4E00\u4E2A\uFF0C\u8FDE\u70B9\u4E24\u4E0B = \u9501\uFF0C\u518D\u70B9 = \u5173\uFF08\u540C /2\u3001\u5347\u964D\uFF09\n        this.ramp = latchTap(this.ramp, performance.now()); this.render(); return;\n      }\n      this.key(id);   // \u6309\u952E id \u53D1\u7ED9\u5BBF\u4E3B\u7FFB\u8BD1\uFF08src/app/pad-keys.ts\uFF09\uFF1B\u529B\u5EA6\u5E26\u7740\u300C\u6E10\u5230\u300D\u4EAE\u4E0D\u4EAE\n      if (id.startsWith(\"dyn:\")) this.ramp = latchWrite(this.ramp);   // \u5199\u4E86\u4E00\u4E2A\u529B\u5EA6\uFF1A\u300C\u53EA\u7BA1\u4E0B\u4E00\u4E2A\u300D\u7684\u6E10\u5230\u7528\u6389\u4E86\n      this.render();\n    };\n  }\n  private hint(): HintRange { return this.host.hintRange ? this.host.hintRange() : null; }   // \u5BBF\u4E3B\u6CA1\u7ED9 = \u4E0D\u753B\uFF08\u952E\u76D8\u4E0D\u8BA4\u8BC6\u4EFB\u4F55\u6F14\u594F\u8005\uFF0CADR-0004\uFF09\n  /** \u97F3\u57DF\u7A97\u53E3\u6700\u4F4E\u90A3\u4E2A\u952E\u7684 MIDI\uFF08\u5B58\u8FDB\u6B4C\u7684 desk\uFF09\uFF1B\u9ED8\u8BA4\u90A3\u4E00\u6863 = null\u3002 */\n  rangeLow(): number | null {\n    if (this.rowShift === 0) return null;\n    return this.host.music.cell(this.baseAt(this.rowShift, this.rows())).midi;\n  }\n  /** \u5F00\u6B4C\uFF1A\u6309\u5B58\u7684\u6700\u4F4E\u952E\u6311\u6700\u8FD1\u7684\u90A3\u4E00\u6863\uFF08null = \u9ED8\u8BA4\u90A3\u4E00\u6863\uFF09\u3002\u4E0D\u91CD\u753B\uFF08\u5BBF\u4E3B\u63A5\u7740 render\uFF09\u3002 */\n  setRangeLow(low: number | null): void {\n    if (low === null) { this.rowShift = 0; return; }\n    const rows = this.rows(), lowOf = (sh: number) => this.host.music.cell(this.baseAt(sh, rows)).midi;\n    this.rowShift = SHIFTS.reduce((best, sh) => (Math.abs(lowOf(sh) - low) < Math.abs(lowOf(best) - low) ? sh : best), 0);\n  }\n  /** \u97F3\u57DF\u7A97\u53E3\u632A\u5230\u6700\u80FD\u76D6\u4F4F [lo, hi] \u7684\u90A3\u4E00\u6863\uFF08\u91CD\u53E0\u6700\u591A\uFF1B\u4E00\u6837\u591A\u53D6\u4E2D\u5FC3\u6700\u8FD1\u7684\uFF09\u3002\u8BD5\u542C\u6362\u4E86\u4E50\u5668\u65F6\u5BBF\u4E3B\u8C03\uFF08\u300C\u8DDF\u8FDB\u300D\uFF09\uFF1B\u4EBA\u81EA\u5DF1\u62E8\u65CB\u94AE\u7167\u65E7\u3002 */\n  follow(lo: number, hi: number): void {\n    const rows = this.rows(), mid = (lo + hi) / 2, m = this.host.music;\n    let best = this.rowShift, bestOv = -Infinity, bestD = Infinity;\n    for (const sh of SHIFTS) {\n      const k0 = this.baseAt(sh, rows), wlo = m.cell(k0).midi, whi = m.cell(k0 + rows * this.cols - 1).midi;\n      const ov = Math.min(hi, whi) - Math.max(lo, wlo), d = Math.abs((wlo + whi) / 2 - mid);\n      if (ov > bestOv || (ov === bestOv && d < bestD)) { best = sh; bestOv = ov; bestD = d; }\n    }\n    if (best !== this.rowShift) { this.rowShift = best; this.render(); }\n  }\n  private buildGrid(base: number, rows: number): void {\n    const cells: string[] = [], music = this.host.music, hr = this.hint();\n    this.keys.clear();\n    for (let row = rows - 1; row >= 0; row--) {\n      for (let col = 0; col < this.cols; col++) {\n        const k = base + row * this.cols + col, c = music.cell(k), m = c.midi;\n        const inRange = !!hr && m >= hr.lo && m <= hr.hi;\n        this.keys.set(k, c);\n        cells.push(`<button class=\"pad-key${inRange ? \" hint\" : \"\"}\" data-k=\"${k}\" title=\"${inRange ? hr.title ?? `${hr.who}\u7684\u97F3\u57DF\u91CC` : \"\"}\">` +\n          `<span class=\"deg\">${octDots(Math.max(0, c.oct))}<span class=\"num\"><span class=\"acc\"></span>${c.deg}</span>${octDots(Math.max(0, -c.oct))}</span><span class=\"abs\">${c.abs}</span></button>`);\n      }\n    }\n    const grid = this.el.querySelector<HTMLElement>(\".pad-grid\")!;\n    grid.innerHTML = cells.join(\"\");\n    grid.classList.remove(\"symbols\");\n    this.swipes.clear();   // \u952E\u6362\u4E86\uFF1A\u65E7\u952E\u4E0A\u7684\u6ED1\u52A8\u4F5C\u5E9F\uFF08\u58F0\u97F3\u7167\u5E38\u7531 pointerup \u505C\uFF09\n    // \u97F3\u952E\uFF1A\u6309\u4E0B = \u5199\uFF08\u6216\u6539\uFF09+ \u54CD\uFF1B\u5F39 = \u53EA\u54CD\uFF1B\u677E\u5F00 = \u505C\u3002\u6309\u7740\u4E0A\u4E0B\u6ED1\uFF1A\u6ED1 = \u6EDA\u952E\u76D8\uFF08\u9ED8\u8BA4\uFF09\u8D70 panStart\uFF1B\u6ED1 = \u5347\u964D = \u8FC7\u95E8\u69DB\u8FD9\u4E2A\u97F3\u5347 / \u964D\uFF08\u952E\u4E0A\u5148\u663E\u793A\uFF09\n    grid.querySelectorAll<HTMLElement>(\".pad-key[data-k]\").forEach((b) => {\n      b.addEventListener(\"pointerdown\", (e) => {\n        e.preventDefault(); try { b.setPointerCapture(e.pointerId); } catch { /* \u6307\u9488\u5DF2\u7ECF\u6CA1\u4E86\uFF1A\u7167\u6837\u54CD */ }\n        const k = Number(b.dataset.k), id = `pad${e.pointerId}`;\n        if (!this.host.onNoteDown(k, id)) return;   // \u5BBF\u4E3B\u4E0D\u6536\uFF08\u5355\u97F3\u4E50\u5668\u51E0\u4E4E\u540C\u65F6\u6309\u4E0B\u7684\u7B2C\u4E8C\u6839\u624B\u6307\uFF1B\u6A21\u7CCA\u62A4\u680F\u5728\u5BBF\u4E3B\uFF09= \u4E0D\u4EAE\u3001\u4E0D\u8BB0\u6ED1\u52A8\n        this.swipes.set(e.pointerId, { y0: e.clientY, alt: 0, key: b });\n        this.showDown(this.keys.get(k)!.midi, id);\n        if (this.swipeMode === \"glide\") this.glideStart(e);\n      });\n      b.addEventListener(\"pointermove\", (e) => {\n        if (this.swipeMode === \"glide\") return;   // \u6ED1\u5230\u4E0B\u4E00\u4E2A\u952E\uFF1A\u5728 glideStart \u91CC\n        const s = this.swipes.get(e.pointerId); if (!s) return;\n        const dy = s.y0 - e.clientY, alt: -1 | 0 | 1 = dy > SWIPE ? 1 : dy < -SWIPE ? -1 : 0;\n        if (alt === s.alt) return;\n        s.alt = alt;\n        this.host.onAlter(`pad${e.pointerId}`, alt);\n        this.refresh(this.host.view());\n      });\n      const up = (e: PointerEvent) => { this.swipes.delete(e.pointerId); this.showUp(`pad${e.pointerId}`); this.host.onNoteUp(`pad${e.pointerId}`); };\n      b.addEventListener(\"pointerup\", up); b.addEventListener(\"pointercancel\", up);\n    });\n  }\n\n  /** \u6ED1 = \u6EDA\u952E\u76D8\uFF1A\u624B\u6307\u6309\u7740\u4E0D\u62AC\u3001\u6ED1\u8FDB\u53E6\u4E00\u4E2A\u97F3\u952E = \u524D\u4E00\u4E2A\u952E\u62AC\u8D77\u3001\u65B0\u952E\u6309\u4E0B\uFF08\u94A2\u7434\u4E0A\u522E\u8FC7\u53BB\u90A3\u79CD\uFF1B\u5199\u7684\u65F6\u5019\u4E00\u8DEF\u5199\u3001\u5F39\u7684\u65F6\u5019\u4E00\u8DEF\u54CD\uFF09\u3002\n   *  \u952E\u4E0A\u6709\u6307\u9488\u6355\u83B7\uFF0C\u6240\u4EE5\u7528 elementFromPoint \u627E\u624B\u6307\u4E0B\u9762\u7684\u952E\uFF1B\u76D1\u542C\u6302\u5728 window \u4E0A\u3002 */\n  private glideStart(e: PointerEvent): void {\n    const pid = e.pointerId, id = `pad${pid}`;\n    let cur: HTMLElement | null = (e.target as HTMLElement).closest(\".pad-key[data-k]\");\n    const move = (ev: PointerEvent) => {\n      if (ev.pointerId !== pid) return;\n      const el = (document.elementFromPoint(ev.clientX, ev.clientY) as HTMLElement | null)?.closest<HTMLElement>(\".pad-key[data-k]\") ?? null;\n      if (!el || el === cur || !this.el.contains(el)) return;\n      cur = el;\n      this.swipes.delete(pid); this.showUp(id); this.host.onNoteUp(id);   // \u524D\u4E00\u4E2A\u952E\u62AC\u8D77\n      const k = Number(el.dataset.k);\n      if (!this.host.onNoteDown(k, id)) return;\n      this.swipes.set(pid, { y0: ev.clientY, alt: 0, key: el });\n      this.showDown(this.keys.get(k)!.midi, id);\n    };\n    const up = (ev: PointerEvent) => { if (ev.pointerId !== pid) return; removeEventListener(\"pointermove\", move); removeEventListener(\"pointerup\", up); removeEventListener(\"pointercancel\", up); };\n    addEventListener(\"pointermove\", move); addEventListener(\"pointerup\", up); addEventListener(\"pointercancel\", up);\n  }\n\n  private refresh(v: PadView): void {\n    const q = <T extends HTMLElement>(s: string) => this.el.querySelector<T>(s);\n    { // \u6539\u4E00\u4E2A\u97F3\uFF08\u53EA\u9009\u4E86\u4E00\u4E2A / \u53E0\u4EAE\u7740\uFF1Bv0.10.5\uFF09\uFF1A\u53E0\u4EAE\u7740\u3001\u232B = \u77ED\u4E00\u6B65\u3001\u2014 = \u957F\u4E00\u6B65\uFF08user\u300C\u4E0D\uFF0C\u6211\u8BF4\u7684\u5C31\u662F\u9000\u683C\uFF0C\u4E0D\u8FC7\u5728\u8FD9\u4E2Acontext\u4E0B\u9762\u53EF\u4EE5\u6539\u56FE\u6807\u300D\uFF09\n      const one = v.one, stk = q(\"[data-stack]\"), bs = q('[data-cmd=\"backspace\"]'), ex = q('[data-cmd=\"extend\"] small');\n      stk?.classList.toggle(\"lock\", one);\n      if (bs && bs.dataset.one !== String(one)) { bs.dataset.one = String(one); bs.innerHTML = one ? `<span>\u2212</span><small>\u77ED\u4E00\u6B65</small>` : `<svg class=\"ico\"><use href=\"#backspace\"/></svg>`; bs.classList.toggle(\"wk\", one); bs.title = one ? \"\u77ED\u4E00\u6B65\uFF08\u9000\u683C\uFF09\uFF1A\u9009\u4E2D\u7684\u8FD9\u4E2A\u97F3\u77ED\u4E00\u6863\uFF0C\u7A7A\u51FA\u6765\u7684\u53D8\u6210\u4F11\u6B62\" : \"\u9000\u683C\"; }\n      if (ex && ex.textContent !== (one ? \"\u957F\u4E00\u6B65\" : \"\u62C9\u957F\")) ex.textContent = one ? \"\u957F\u4E00\u6B65\" : \"\u62C9\u957F\";\n    }\n    const k = q(\".k-key .kl\");\n    if (k) { const kc = this.host.music.keyChoices(); k.innerHTML = kc.items[kc.index]; k.parentElement!.classList.toggle(\"stack\", k.parentElement!.clientWidth < STACK); k.parentElement!.title = `${kc.name}\uFF08pad \u81EA\u5DF1\u7684\u8C03\u548C\u8C03\u5F0F\uFF09\uFF1A\u6309\u4F4F\u4E0A\u4E0B\u6ED1\u6362\u8C03 / \u70B9\u5F00\u9009\u8C03\u548C\u8C03\u5F0F`; }\n    const u = q(\".k-unit .kl\");\n    if (u) { u.innerHTML = `<span class=\"smufl\">${UNIT_GLYPH[v.unit]}</span>${v.tuplet ? `<sup>${v.tuplet}</sup>` : \"\"}`; u.parentElement!.title = `\u957F\u77ED\u57FA\u7EBF\uFF1A${UNIT_NAME[v.unit]}${v.tuplet ? `\uFF08${v.tuplet} \u8FDE\u97F3\uFF09` : \"\"}\u2014\u2014\u6309\u4F4F\u4E0A\u4E0B\u6ED1 / \u70B9\u5F00\u9009`; }   // \u957F\u77ED\u65CB\u94AE = \u63A5\u4E0B\u6765\u5199\u7684\u957F\u77ED\uFF08\u6709\u9009\u533A\u4E5F\u4E00\u6837\uFF1A\u66FF\u6362\u6A21\u5F0F\u6309\u5B83\u5403\uFF1B\u6574\u7EC4\u6539\u65F6\u503C\u5728\u9009\u533A\u83DC\u5355\u91CC\uFF09\n    q(\".impro-pad\")?.classList.toggle(\"is-on\", this.host.isImpro());   // \u300C\u5F39\u300D\u4EAE\u4E0D\u4EAE\uFF08\u952E\u76D8\u5FEB\u6377\u952E / \u627E\u4EBA\u89C6\u56FE\u4E5F\u4F1A\u6539\u5B83\uFF09\n    const r = q(\".k-range .kl\");\n    if (r) { const nr = this.rangeNarrow(); r.parentElement!.classList.toggle(\"narrow\", nr); r.parentElement!.classList.toggle(\"tight\", r.parentElement!.clientWidth < TIGHT); r.innerHTML = this.spanHtml(this.rowShift, this.rows(), nr); r.parentElement!.title = `\u97F3\u57DF ${this.spanText(this.rowShift, this.rows())}\uFF1A\u6309\u4F4F\u4E0A\u4E0B\u6ED1 / \u70B9\u5F00\u9009\u2014\u2014\u50CF\u63A8\u4E00\u5F20\u7EB8\uFF0C\u5F80\u4E0A\u63A8 = \u770B\u4E0B\u9762\u66F4\u4F4E\u7684`; }\n    // \u7535\u8111\u952E\u76D8\u6302\u7740 \u266F / \u266D\uFF08Shift\uFF09\uFF1A\u97F3\u952E\u663E\u793A\u5347 / \u964D\u4E4B\u540E\u7684\u6837\u5B50\uFF1B\u624B\u6307\u6B63\u5728\u6ED1\u7684\u90A3\u4E2A\u952E\u663E\u793A\u5B83\u81EA\u5DF1\u7684\n    this.el.querySelectorAll<HTMLElement>(\".pad-key[data-k]\").forEach((b) => {\n      const k = Number(b.dataset.k), sw = [...this.swipes.values()].find((s) => s.key === b), a = sw ? sw.alt : v.acc;\n      b.querySelector(\".acc\")!.textContent = ACC_TEXT[a + 2];\n      b.querySelector(\".abs\")!.textContent = a ? this.host.music.altered(k, a) : this.keys.get(k)!.abs;\n      b.classList.toggle(\"swiping\", !!sw && sw.alt !== 0);\n    });\n    this.el.querySelector(\".pad-grid\")?.classList.toggle(\"acc-armed\", !!v.acc);\n    // \u5347\u964D\u952E\uFF1A\u4EAE\u7740\u7684\u65F6\u5019\u663E\u793A\u6B63\u5728\u7528\u7684\u90A3\u4E2A\uFF08\u7535\u8111\u952E\u76D8 [ ] \u5F00\u7684\u4E5F\u7B97\uFF09\uFF0C\u5173\u7740\u663E\u793A\u9009\u597D\u7684\u90A3\u4E2A\uFF1B\u6D45\u4EAE = \u4E0B\u4E00\u4E2A\u3001\u6DF1\u4EAE = \u9501\u4F4F\n    const ak = this.el.querySelector<HTMLElement>(\"[data-accshift]\");\n    if (ak) {\n      const on = v.accMode !== \"off\" && v.acc !== 0;\n      ak.querySelector(\".ag\")!.innerHTML = `<span class=\"smufl\">${ACC_GLYPH[(on ? v.acc : this.accSel) + 2]}</span>`;\n      ak.classList.toggle(\"once\", on && v.accMode === \"once\"); ak.classList.toggle(\"lock\", on && v.accMode === \"lock\");\n    }\n    const down = new Set(this.held.values());\n    this.el.querySelectorAll<HTMLElement>(\".pad-key[data-k]\").forEach((b) => b.classList.toggle(\"down\", down.has(this.keys.get(Number(b.dataset.k))!.midi)));\n    const stk = this.el.querySelector<HTMLElement>(\"[data-stack]\"); if (stk) stk.classList.toggle(\"off\", !this.host.canStack());   // \u5355\u58F0\u4E50\u5668\u7684\u58F0\u90E8\uFF1A\u53E0\u4E0D\u4E86\n    // \u7B26\u53F7\u5C42\u5F00\u7740 = \u53EA\u5199\u8BB0\u53F7\uFF08user 2026-10-08\u300C\u7B26\u53F7\u952E\u76D8\u7684\u65F6\u5019\u8BE5\u7981\u7528\u7684\u4E1C\u897F\u90FD\u7981\u7528\u300D\uFF09\uFF1A\u5199\u97F3\u90A3\u4E00\u5C42\u7684\u952E\uFF08\u4F11\u6B62 / \u5C0F\u8282\u7EBF / \u5347\u964D / \u53E0 / \u51CF\u534A / \u62C9\u957F\uFF09\u7070\u6389\u3001\u6309\u4E0D\u52A8\uFF08\u7BA1\u97F3\u952E\u7684\u65CB\u94AE 1= / \u957F\u77ED / \u97F3\u57DF \u6362\u6210\u4E86\u5206\u9875\u6807\u7B7E\uFF09\uFF1B\n    //   \u2190 \u2192 / \u9000\u683C\uFF08\u7B26\u53F7\u6A21\u5F0F\u7684\u9000\u683C\uFF09/ \u5F39 / \u6536\u8D77 / \u22EF \u7167\u65E7\u3002\u300C\u5F39\u300D\u7684\u65F6\u5019\u300C\u7B26\u300D\u7070\u6389\uFF08\u5F39 = \u53EA\u5F39\u4E0D\u5199\uFF09\n    const symOn = this.symbols !== \"off\";\n    this.el.querySelectorAll<HTMLButtonElement>('.writes [data-cmd=\"rest\"], .writes [data-cmd=\"bar\"], .writes [data-cmd=\"extend\"], .writes [data-accshift], .writes [data-stack], .writes [data-half]').forEach((b) => { b.disabled = symOn; });\n  }\n\n  private on(root: HTMLElement, sel: string, fn: (b: HTMLElement) => void): void {\n    root.querySelectorAll<HTMLElement>(sel).forEach((b) => b.addEventListener(\"pointerdown\", (e) => { e.preventDefault(); fn(b); }));\n  }\n  private back(): void { this.mode = \"normal\"; this.render(); }\n  /** \u9009\u533A\u6761\u4E0A\u7684\u300C\u79FB\u8C03\u300D\uFF1A\u6253\u5F00\u548C\u300C1=\u300D\u65CB\u94AE\u540C\u4E00\u4E2A\u5019\u9009\u9762\u677F\uFF08\u6709\u9009\u4E2D\u65F6\u90A3\u4E2A\u65CB\u94AE\u672C\u6765\u5C31\u662F\u5B83\uFF09\u3002 */\n\n  /** \u503C\u65CB\u94AE\u7684\u4E00\u4E32\u503C\uFF0C\u5927\u7684\u5728\u4E0A\uFF08\u5347\u53F7\u591A / \u957F\u7684 / \u97F3\u57DF\u9AD8\u7684\u5728\u4E0A\uFF09+ \u73B0\u5728\u662F\u7B2C\u51E0\u4E2A + \u9009\u7B2C i \u4E2A\uFF08\u7ACB\u523B\u751F\u6548\uFF09\u3002 */\n  private knobList(knob: string, narrow = this.rangeNarrow()): { items: string[]; index: number; title: string; set(i: number): void; loop?: boolean } {\n    const v = this.host.view();\n    if (knob === \"key\") {   // 1=F\u266F \u2026 1=C \u2026 1=G\u266D\uFF08\u6863\u4F4D\u5F52 music\uFF09\n      const kc = this.host.music.keyChoices();\n      return { items: kc.items, index: kc.index, title: \"pad \u7684\u8C03\uFF08\u4E94\u5EA6\u5708\uFF09\", set: (i) => this.host.onPick(\"key\", i), loop: true };\n    }\n    if (knob === \"unit\") return { items: UNITS.map((u) => `<span class=\"smufl\">${UNIT_GLYPH[u]}</span>`), index: Math.max(0, UNITS.indexOf(v.unit)), title: \"\u957F\u77ED\u57FA\u7EBF\", set: (i) => this.host.onUnit(UNITS[i]) };\n    const rows = this.rows();   // \u97F3\u57DF\uFF1A\u9AD8\u7684\u5728\u4E0A\uFF08\u4E00\u5F20\u7EB8\uFF1A\u5F80\u4E0A\u63A8 = \u770B\u4E0B\u9762\u66F4\u4F4E\u7684\uFF09\n    return { items: SHIFTS.map((sh) => this.spanHtml(sh, rows, narrow)), index: Math.max(0, SHIFTS.indexOf(Math.max(-4, Math.min(4, this.rowShift)))), title: \"\u97F3\u57DF\u7A97\u53E3\",\n      set: (i) => { this.rowShift = SHIFTS[i]; this.render(); } };\n  }\n\n  /** \u6309\u4E0B\u4E00\u4E2A\u65CB\u94AE\u3002\u300C\u22EF\u300D/ \u79FB\u8C03\uFF08\u6709\u9009\u4E2D\uFF09= \u6574\u6392\u6362\u6210\u5019\u9009\u3002\u503C\u65CB\u94AE\uFF1A\n   *  \u00B7 \u6309\u4F4F\u4E0A\u4E0B\u6ED1 = \u5C31\u5728\u8FD9\u4E00\u683C\u91CC\u6EDA\uFF0C\u50CF\u6C7D\u8F66\u91CC\u7A0B\u8868\u2014\u2014\u65CB\u94AE\u53D8\u6210\u4E00\u6247\u7A97\uFF0C\u6EDA\u8F6E\u85CF\u5728\u540E\u9762\uFF0C\u7A97\u91CC\u53EA\u9732\u4E00\u683C\uFF0C\u6EDA\u7684\u65F6\u5019\u4E0A\u4E0B\u683C\u4ECE\u7A97\u8FB9\u6ED1\u8FDB\u6765\uFF1B\n   *    \u5185\u5BB9\u8DDF\u7740\u624B\u6307\u8D70\uFF08\u5F80\u4E0B\u62C9 = \u4E0A\u9762\u5927\u7684\u8FDB\u7A97\uFF09\uFF1B**\u4E00\u6B21\u6700\u591A\u4E00\u683C**\uFF0C\u6ED1\u8FC7\u534A\u683C\u503C\u5C31\u751F\u6548\uFF1B\u677E\u624B\u7ACB\u523B\u505C\uFF0C\u4E0D\u5438\u9644\u3001\u4E0D\u653E\u52A8\u753B\n   *    \uFF08user\u300Cin place\u7684\u65F6\u5019\u4E00\u6B21\u6700\u591A\u4E00\u683C\uFF0C\u8FD9\u6837\u65B9\u4FBF\u5FEB\u901Fswipe\u51E0\u6B21\u5C31\u662F\u51E0\u683C\u300D\uFF09\n   *    \uFF08user\u300C\u6211\u5E0C\u671B\u624B\u6307\u677E\u4E86\u7ACB\u523B\u505C\uFF0C\u4E0D\u8981\u987F\u4E00\u4E0B\uFF0C\u8FD9\u662F\u5FEB\u901F\u8F93\u5165\u3002\u8981\u4E0D\u8FD8\u662F\u505A\u6210in place \u6ED1\u52A8\u53EA\u5728\u7A97\u683C\u91CC\u9762\u9884\u89C8\uFF1F\u300D\n   *     \u300Cin place\u6EDA\u7684\u65F6\u5019\u5E94\u8BE5\u662F\u539F\u6765\u7684\u94AE\u53D8\u6210\u4E00\u4E2A\u7A97\uFF0C\u6EDA\u8F6E\u85CF\u5728\u4E0B\u9762\uFF0C\u5C31\u50CF\u6C7D\u8F66\u91CC\u7A0B\u8868\u4E00\u6837\u300D\uFF09\u3002\n   *  \u00B7 \u53EA\u662F\u70B9\u4E00\u4E0B\uFF08\u6CA1\u6ED1\uFF09= \u677E\u624B\u65F6\u5C55\u5F00\u6EDA\u8F6E\uFF08drum.ts\uFF09\u70B9\u9009 / \u539F\u751F\u6EDA\u52A8\u3002 */\n  /** \u9F20\u6807\u6EDA\u8F6E\u62E8\u65CB\u94AE\uFF082026-10-10 user\u300C\u952E\u76D8\u4E0A\u9762\u90A3\u4E9B\u53EF\u4EE5\u6EDA\u7684\u4E1C\u897F\u7684\u9F20\u6807\u6EDA\u8F6E\u64CD\u4F5C\u4E5F\u505A\u4E00\u4E0B\u300D\uFF09\uFF1A\u5F80\u4E0B\u6EDA = \u540C\u624B\u6307\u5F80\u4E0A\u63A8\u4E00\u683C\uFF1B\u89E6\u63A7\u677F\u7684\u5C0F delta \u6512\u591F\u4E00\u683C\u624D\u52A8\u3002 */\n  private wheelAcc = new Map<string, number>();\n  private knobWheel(b: HTMLElement, e: WheelEvent): void {\n    const knob = b.dataset.knob!; if (knob === \"more\") return;\n    e.preventDefault();\n    const r = wheelSteps(e, this.wheelAcc.get(knob) ?? 0), steps = r.steps; this.wheelAcc.set(knob, r.acc);   // \u9F20\u6807\u4E00\u683C = \u4E00\u6863\u3001\u89E6\u63A7\u677F\u6512\u591F\u624D\u52A8\uFF08wheel.ts\uFF0C\u548C\u6DF7\u97F3\u53F0\u7684\u6ED1\u5757\u5171\u7528\uFF09\n    if (!steps) return;\n    const v = this.knobList(knob), n = v.items.length;\n    const i = v.loop ? (((v.index + steps) % n) + n) % n : Math.max(0, Math.min(n - 1, v.index + steps));\n    if (i !== v.index) v.set(i);\n  }\n  /** \u6EDA\u8F6E\u5728\u952E\u4E0A\uFF08v0.10.23\uFF1Buser\u300C\u5F85\u4F1A\uFF1A\u9F20\u6807\u6EDA\u8F6E\u53EF\u4EE5\u6EDA\u52A8\u97F3\u7B26\u952E\u76D8\u4EE5\u53CA\u5176\u4ED6\u952E\u76D8\u7684row\u300D\uFF09\uFF1A\u97F3\u952E = \u548C\u97F3\u57DF\u65CB\u94AE\u4E00\u6837\uFF0C\u4E00\u683C\u632A\u4E00\u6392\uFF1B\n   *  \u7B26\u53F7\u5C42 = \u4E00\u683C\u6EDA\u4E00\u6392\u683C\u5B50\uFF08\u683C\u5B50\u591A\u4E86\u672C\u6765\u5C31\u5728\u91CC\u9762\u6EDA\uFF0C\u539F\u6765\u6309\u50CF\u7D20\u6EDA\uFF09\u3002\u6A2A\u7740\u5212\u4E0D\u7BA1\u3002 */\n  private gridWheel(g: HTMLElement, e: WheelEvent): void {\n    if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) return;\n    if (this.symbols !== \"off\") {\n      e.preventDefault();\n      const r = wheelSteps(e, this.wheelAcc.get(\"sym\") ?? 0); this.wheelAcc.set(\"sym\", r.acc); if (!r.steps) return;\n      const cell = g.querySelector<HTMLElement>(\"[data-sym]\"), rowH = (cell?.offsetHeight ?? 46) + (parseFloat(getComputedStyle(g).rowGap) || 6);\n      g.scrollBy({ top: r.steps * rowH, behavior: \"smooth\" }); return;\n    }\n    const knob = this.el.querySelector<HTMLElement>('[data-knob=\"range\"]'); if (knob) this.knobWheel(knob, e);\n  }\n  private knobDown(b: HTMLElement, e: PointerEvent): void {\n    const knob = b.dataset.knob!;\n    if (knob === \"more\") { this.mode = \"more\"; this.render(); return; }\n    try { b.setPointerCapture(e.pointerId); } catch { /* \u6307\u9488\u5DF2\u7ECF\u6CA1\u4E86 */ }\n    const v = this.knobList(knob), n = v.items.length, pid = e.pointerId, y0 = e.clientY;\n    // \u73AF\uFF08\u4E94\u5EA6\u5708\uFF09\uFF1A\u6EDA\u8F6E\u4E24\u5934\u5404\u591A\u6446\u4E00\u683C\uFF08\u63A5\u7740\u53E6\u4E00\u5934\uFF09\uFF0C\u4E00\u683C\u5C31\u80FD\u7ED5\u8FC7\u53BB\n    const rollItems = v.loop ? [v.items[n - 1], ...v.items, v.items[0]] : v.items, at0 = v.loop ? v.index + 1 : v.index;\n    let moved = false, cur = v.index, roll: HTMLElement | null = null, H = 0;\n    // \u4E00\u6B21\u6700\u591A\u4E00\u683C\uFF1A\u7A97\u91CC\u6700\u591A\u6EDA\u5230\u4E0B\u4E00\u683C\uFF1B\u6ED1\u8FC7\u534A\u683C = \u4E0B\u4E00\u683C\u5728\u7A97\u91CC\u5360\u4E86\u591A\u534A = \u5C31\u662F\u5B83\uFF08\u5230\u5934\u4E86\u53EA\u8BA9\u5B83\u7A0D\u5FAE\u6643\u4E00\u4E0B\uFF09\n    const room = (dir: number) => (v.loop || (v.index + dir >= 0 && v.index + dir < n) ? STEP : STEP * 0.3);   // dir = -1\uFF1A\u5F80\u4E0B\u62C9\uFF08\u4E0A\u9762\u5927\u7684\u8FDB\u7A97\uFF09\uFF1B+1\uFF1A\u5F80\u4E0A\u63A8\n    const paint = (dy: number) => {\n      const off = Math.max(-room(1), Math.min(room(-1), dy));\n      roll!.style.transform = `translateY(${(-at0 * STEP + off) * (H / STEP)}px)`;   // \u7A97\u91CC\u4E00\u683C = \u65B9\u5757\u90A3\u4E48\u9AD8\uFF1B\u624B\u6307\u8D70 STEP = \u7A97\u91CC\u6EDA\u4E00\u6574\u683C\n      return Math.abs(off) >= STEP / 2 ? (v.index - Math.sign(off) + n) % n : v.index;\n    };\n    const move = (ev: PointerEvent) => {\n      if (ev.pointerId !== pid) return;\n      const dy = ev.clientY - y0;\n      if (!moved) {\n        if (Math.abs(dy) < MOVE) return;\n        moved = true; H = b.clientHeight;\n        roll = document.createElement(\"div\"); roll.className = \"kroll\";\n        roll.innerHTML = rollItems.map((h) => `<div class=\"kroll-i\" style=\"height:${H}px\">${h}</div>`).join(\"\");\n        b.appendChild(roll); b.classList.add(\"rolling\");\n      }\n      const i = paint(dy);\n      if (i !== cur) { cur = i; v.set(i); }\n    };\n    const up = (ev: PointerEvent) => {\n      if (ev.pointerId !== pid) return;\n      removeEventListener(\"pointermove\", move); removeEventListener(\"pointerup\", up); removeEventListener(\"pointercancel\", up);\n      roll?.remove(); b.classList.remove(\"rolling\");   // \u677E\u624B\u7ACB\u523B\u505C\uFF1A\u7A97\u5173\u4E0A\uFF0C\u65CB\u94AE\u4E0A\u5DF2\u7ECF\u662F\u65B0\u503C\n      if (!moved && ev.type === \"pointerup\") this.openDrumFor(knob, b);\n    };\n    addEventListener(\"pointermove\", move); addEventListener(\"pointerup\", up); addEventListener(\"pointercancel\", up);\n  }\n\n  /** \u70B9\u4E00\u4E0B\u503C\u65CB\u94AE\uFF1A\u5728\u5B83\u4E0A\u9762\u5C55\u5F00\u6EDA\u8F6E\u3002\u65CB\u94AE\u591F\u5BBD\uFF08iPad\uFF09= \u51E0\u5217\u5206\u65CB\u94AE\u7684\u5BBD\uFF1B\u592A\u7A84\uFF08iPhone\uFF09= \u6BCF\u5217\u6309\u653E\u5F97\u4E0B\u7684\u5BBD\u6765\uFF0C\u6BD4\u65CB\u94AE\u5BBD\n   *  \uFF08user\u300C\u5982\u679C\u662Fiphone\u7B49\u592A\u7A84\u7684\u65F6\u5019\u5F39\u51FA\u6765\u7684\u7A97\u53EF\u4EE5\u5BBD\u4E00\u70B9\u300D\uFF09\u3002\u957F\u77ED\u90A3\u6839\u65C1\u8FB9\u5E76\u4E00\u6839\u8FDE\u97F3\u7684\uFF0C\u8FDE\u97F3\u753B\u6210\u771F\u7684\u4E00\u7EC4\u5C0F\u874C\u86AA\u3001\u8DDF\u7740\u957F\u77ED\u53D8\u3002 */\n  private openDrumFor(knob: string, anchor: HTMLElement): void {\n    const w = anchor.getBoundingClientRect().width;\n    if (knob === \"unit\") {\n      const v = this.host.view();\n      // \u5BBD\u7684\u65CB\u94AE\uFF1A\u4E24\u5217\u5206\u5B83\u7684\u5BBD\u5EA6\uFF08user\u300C\u80FD\u4E0D\u80FD\u5171\u7528\u539F\u6765\u7684\u5BBD\u5EA6\u300D\uFF09\uFF0C\u8FDE\u97F3\u90A3\u5217\u5360\u4E00\u534A\u591A\u4E00\u70B9\uFF1B\u7A84\u7684\uFF1A\u957F\u77ED 56 + \u8FDE\u97F3 84\n      const [wu, wt] = w >= 142 ? [w - Math.round(w * 0.55) - 2, Math.round(w * 0.55)] : [56, 84];   // 2 = \u4E24\u5217\u4E4B\u95F4\u7684\u7F1D\n      const tups = (u: number) => TUP.map((n) => (n ? tupletMark(n, u) : `<span class=\"plain\">\u4E0D\u8FDE</span>`));\n      const h: DrumHandle = openDrum(anchor, [\n        { items: UNITS.map((u) => `<span class=\"smufl\">${UNIT_GLYPH[u]}</span>${wu >= 100 ? `<small>${UNIT_NAME[u]}</small>` : \"\"}`), index: Math.max(0, UNITS.indexOf(v.unit)), width: wu, title: \"\u957F\u77ED\u57FA\u7EBF\" },\n        { items: tups(v.unit), index: Math.max(0, TUP.indexOf(v.tuplet as 0 | 3 | 5 | 6 | 7)), width: wt, title: \"\u8FDE\u97F3\" },\n      ], { onChange: (c, i) => { if (c === 0) { this.host.onUnit(UNITS[i]); h.setItems(1, tups(UNITS[i])); } else this.host.onTuplet(TUP[i]); } });\n      return;\n    }\n    if (knob === \"key\") {   // \u4E24\u5217\uFF1A\u8C03\uFF08\u4E94\u5EA6\u5708\uFF09+ \u8C03\u5F0F\uFF08user\u300C1=F\u80FD\u4E0D\u80FD\u4E5F\u505A\u6210\u4E24\u4E2A\u7684\u6EDA\u8F6E\uFF0C\u53F3\u8FB9\u53EF\u4EE5\u6362\u8C03\u6027\u300D\uFF09\n      const d = this.host.music.keyDrum();\n      const [wk, ws] = w >= 210 ? [Math.round(w * 0.36), w - Math.round(w * 0.36) - 2] : [72, 136];\n      openDrum(anchor, [\n        { items: d.keys.items, index: d.keys.index, width: wk, title: \"pad \u7684\u8C03\uFF08\u4E94\u5EA6\u5708\uFF09\", loop: true },\n        { items: d.scales.items, index: d.scales.index, width: ws, title: \"\u8C03\u5F0F\uFF1Apad \u4E0A\u6392\u54EA\u4E9B\u97F3\" },\n      ], { onChange: (c, i) => this.host.onPick(c === 0 ? \"key\" : \"scale\", i) });\n      return;\n    }\n    const v = this.knobList(knob, false), wr = Math.max(w, 120);   // \u97F3\u57DF\uFF1A\u6EDA\u8F6E\u81F3\u5C11 120 \u5BBD\uFF0C\u4E00\u884C\u5199\u5F97\u4E0B\u300CF\u266F3\u2013G\u266F5\u300D\n    openDrum(anchor, [{ items: v.items, index: v.index, width: wr, title: v.title }], { onChange: (_c, i) => v.set(i) });\n  }\n  /** /2 \u7684\u6837\u5B50\uFF1Aonce = \u6D45\u4EAE\uFF08\u4E0B\u4E00\u4E2A\u97F3\u51CF\u534A\uFF09\u3001lock = \u6DF1\u4EAE\uFF08\u9501\u4F4F\uFF09\u3002 */\n  showHalf(m: \"off\" | \"once\" | \"lock\"): void {\n    const b = this.el.querySelector<HTMLElement>(\"[data-half]\"); if (!b) return;\n    b.classList.toggle(\"once\", m === \"once\"); b.classList.toggle(\"lock\", m === \"lock\");\n  }\n\n  /** \u67D0\u4E2A\u6765\u6E90\uFF08\u624B\u6307 / \u7535\u8111\u952E\u76D8\u7684\u952E\uFF09\u6309\u4E0B\u4E86\u67D0\u4E2A\u97F3\uFF08MIDI\uFF09\uFF1Apad \u4E0A\u540C\u97F3\u9AD8\u7684\u952E\u4EAE\u7740\uFF0C\u76F4\u5230 showUp\uFF08\u8C03\u5F0F\u91CC\u6CA1\u6709\u8FD9\u4E2A\u97F3 = \u4E0D\u4EAE\uFF09\u3002 */\n  showDown(midi: number, id: string): void { this.held.set(id, midi); this.refresh(this.host.view()); }\n  showUp(id: string): void { if (this.held.delete(id)) this.refresh(this.host.view()); }\n  clearHeld(): void { if (this.held.size || this.swipes.size) { this.held.clear(); this.swipes.clear(); this.refresh(this.host.view()); } }\n}\n", "// chords.ts \u2014\u2014 \u4E24\u952E\u540C\u6309 = \u53E0\u97F3\u7684\u300C\u5934 / \u5C3E\u300D\u5224\u636E + \u5355\u97F3\u4E50\u5668\u7684\u300C\u51E0\u4E4E\u540C\u65F6\u6309\u300D\u62A4\u680F\uFF1A\u7EAF\u51FD\u6570\uFF0C\u4E0D\u78B0 DOM\u3001\u4E0D\u61C2\u97F3\u4E50\uFF08\u53E0\u4EC0\u4E48\u3001\u5199\u4EC0\u4E48\u5F52\u5BBF\u4E3B\uFF09\u3002\n// created 2026-10-15 by Claude Fable 5.1\uFF08\u952E\u76D8\u6A21\u5757 src/keyboard/ \u5200 2\uFF1B\u539F\u6765\u957F\u5728 src/app/main.ts \u7684 chord \u72B6\u6001\u673A\u91CC\uFF0C2026-10-08 Opus 5.5 \u6309 user \u7684\u8BDD\u5199\u7684\u5224\u636E\u539F\u6837\u642C\u6765\uFF0C\u6570\u5B57\u4E0D\u53D8\uFF09\u3002\n//   user 2026-10-08\u300C\u4E4B\u524D\u7684\u5224\u5B9A\u662Fab\u843D\u7684\u65F6\u5019\u76F8\u8FD1\u3002\u73B0\u5728\u7684\u5224\u5B9A\u662Fb\u843D\u7684\u65F6\u5019\u4E0D\u5728a\u7684\u5C3E\u5DF4\u4E0A\u300D\u300C\u5982\u679Cab\uFF0Cb\u6309\u4E0B\u53BB\u4E4B\u540Ea\u9A6C\u4E0A\u677E\uFF0C\u90A3\u4E48\u5C31\u4E0D\u5E94\u8BE5\u662F\u548C\u5F26\u300D\n//   \u300C\u5C3E\u5DF4\u65F6\u95F4\u89C4\u5219\u4E5F\u9700\u8981\u8003\u8651\u76F8\u5BF9\u6BD4\u4F8B\uFF0C\u6BD4\u5982\u5982\u679C\u6211\u5FEB\u901F\u8DF3\u97F3\u8F7B\u6309ab\u591A\u6B21\u7684\u65F6\u5019\u300D\u300C\u548C\u5F26\u8F93\u5165\u7684\u65F6\u5019\u5E94\u8BE5\u652F\u6301\u6709\u957F\u95F4\u9694\u7684\u8FDE\u6309\u2026\u6162\u6162\u6309\uFF0Cxor toggle\uFF0C\u624B\u6307\u6570\u91CF\u4E0D\u591F\u7684\u65F6\u5019\u4E5F\u80FD\u597D\u300D\n//   A\uFF08\u6839\u97F3\uFF1A\u5199\u8FDB\u8C31\u3001\u8FD8\u6309\u7740\u7684\u90A3\u4E2A\uFF09\u6309\u7740\u65F6\u6309\u4E0B B\uFF1A\n//   \u00B7 \u5934\uFF1AB \u5728 A \u843D\u4E0B CHORD_WIN \u5185 = \u540C\u65F6\u6309 \u2192 \u53E0\uFF1B\n//   \u00B7 \u5426\u5219\u89C2\u671B\uFF08B \u5148\u54CD\u3001\u8FDB\u4E0D\u8FDB\u8C31\u7B49\u5206\u5F97\u51FA\u6765\uFF09\uFF1AB \u5148\u677E\uFF08A \u8FD8\u6309\u7740\uFF09= \u5957\u5728 A \u91CC \u2192 \u53E0\uFF1B\n//     A \u5148\u677E\uFF1AA \u548C B \u4E00\u8D77\u6309\u7740\u7684\u65F6\u95F4\u6BD4 A \u5355\u72EC\u6309\u7740\u7684\u65F6\u95F4\u957F \u2192 \u53E0\uFF0C\u77ED = A \u7684\u5C3E\u5DF4\u538B\u5728 B \u5934\u4E0A\uFF08\u5FEB\u901F\u8FDE\u6309 / \u8DF3\u97F3 / \u8FDE\u594F\uFF09\u2192 \u4E24\u4E2A\u97F3\uFF1B\n//     \u4E24\u4E2A\u90FD\u8FD8\u6309\u7740\u3001\u4E00\u8D77\u6309\u7740\u5DF2\u7ECF\u6BD4 A \u5355\u72EC\u7684\u957F \u2192 \u53E0\uFF08\u4E0D\u7528\u7B49\u677E\u624B\uFF09\uFF1B\u53C8\u6309\u4E86\u4E0B\u4E00\u4E2A\u952E / \u5931\u7126 = \u6309\u5F53\u4E0B\u5B9A\u3002\u6BD4\u4F8B\u4E0D\u662F\u56FA\u5B9A\u6BEB\u79D2\uFF1A\u8F7B\u5FEB\u7684\u8DF3\u97F3\u548C\u6162\u6162\u7684\u8FDE\u594F\u90FD\u6309\u300C\u5C3E\u5DF4\u300D\u7B97\u3002\n//   \u5355\u97F3\u4E50\u5668\uFF08\u5C0F\u6708\u76F8 / \u5143\u97F3 / \u6CA1\u4EBA\uFF09\uFF1A\u524D\u4E00\u4E2A\u5199\u8FDB\u53BB\u7684\u97F3\u8FD8\u6309\u7740\u3001\u53C8\u9694\u4E0D\u5230 CHORD_MS = \u7B97\u540C\u65F6\u6309 \u2192 \u7B2C\u4E8C\u6839\u624B\u6307\u4E0D\u5199\u4E0D\u54CD\u4E0D\u4EAE\uFF08\u6A21\u7CCA\u62A4\u680F\uFF1B\u5FEB\u901F\u8FDE\u6309\u7167\u5199\uFF09\u3002\n\nexport const CHORD_WIN = 80;   // ms\uFF1A\u300C\u5934\u300D\u2014\u2014\u548C\u6839\u97F3\u51E0\u4E4E\u540C\u65F6\u843D\u4E0B\nexport const CHORD_MS = 50;    // ms\uFF1A\u5355\u97F3\u4E50\u5668\u7684\u300C\u540C\u65F6\u6309\u300D\n\nexport interface Press { readonly t: number }\nexport type ChordWhy = \"keyUp\" | \"rootUp\" | \"both\" | \"force\";\n\n/** B \u843D\u4E0B\u90A3\u4E00\u523B\uFF1A\u548C\u6839\u97F3\u51E0\u4E4E\u540C\u65F6\uFF08\u5934\uFF09= \u9A6C\u4E0A\u53E0\uFF1B\u5426\u5219\u89C2\u671B\u3002 */\nexport const chordHead = (root: Press, b: Press, win = CHORD_WIN): boolean => b.t - root.t < win;\n/** \u89C2\u671B\u8981\u7B49\u591A\u4E45\uFF08\u4ECE B \u843D\u4E0B\u8D77\uFF0Cms\uFF09\uFF1A\u4E00\u8D77\u6309\u7740\u4E00\u8D85\u8FC7\u300C\u6839\u97F3\u5355\u72EC\u6309\u7740\u7684\u65F6\u957F\u300D\u5C31\u8BE5\u5B9A\u4E86\uFF08+5 ms \u4F59\u91CF\uFF09\u3002 */\nexport const chordBothAfterMs = (root: Press, b: Press): number => b.t - root.t + 5;\n/** \u89C2\u671B\u4E2D\u7684 B \u600E\u4E48\u5B9A\u3002why = \u8C01\u5148\u53D1\u751F\uFF1AB \u677E / \u6839\u97F3\u677E / \u5230\u65F6\u5019\u4E86\uFF08\u4E24\u4E2A\u90FD\u8FD8\u6309\u7740\u624D\u7B97\uFF0C\u4E0D\u7136 null = \u7B49\u522B\u7684\u4E8B\u4EF6\uFF09/ \u53C8\u6309\u4E86\u4E0B\u4E00\u4E2A\u952E\u6216\u5931\u7126\u3002 */\nexport function chordVerdict(root: Press, b: Press, now: number, why: ChordWhy, rootHeld: boolean, keyHeld: boolean): \"chord\" | \"two\" | null {\n  if (why === \"rootUp\") return now - b.t > b.t - root.t ? \"chord\" : \"two\";   // \u4E00\u8D77\u6309\u7740\u7684 > \u6839\u97F3\u5355\u72EC\u6309\u7740\u7684 = \u53E0\uFF1B\u77ED = \u5C3E\u5DF4\n  if (why === \"keyUp\") return rootHeld ? \"chord\" : \"two\";                     // B \u5148\u677E\u3001\u6839\u97F3\u8FD8\u6309\u7740 = \u5957\u5728\u91CC\u9762\n  if (why === \"both\") return rootHeld && keyHeld ? \"chord\" : null;\n  return rootHeld ? \"chord\" : \"two\";\n}\n/** \u5355\u97F3\u4E50\u5668\uFF1A\u8FD8\u6709\u952E\u6309\u7740\u3001\u79BB\u4E0A\u4E00\u6B21\u6309\u4E0B\u4E0D\u5230 ms = \u8FD9\u4E00\u4E0B\u7B97\u540C\u65F6\u6309\uFF08\u6321\u6389\uFF09\u3002 */\nexport const monoClash = (heldCount: number, lastAt: number, now: number, ms = CHORD_MS): boolean => heldCount > 0 && now - lastAt < ms;\n", "// scales.ts \u2014\u2014 pad \u7684\u8C03\u5F0F\uFF08\u97F3\u9636\uFF09\uFF1Apad \u4E0A\u6392\u54EA\u4E9B\u97F3\u3002created 2026-10-07 by Claude Opus 5.5\n// user 2026-10-07\u300C1=F\u80FD\u4E0D\u80FD\u4E5F\u505A\u6210\u4E24\u4E2A\u7684\u6EDA\u8F6E\uFF0C\u53F3\u8FB9\u53EF\u4EE5\u6362\u8C03\u6027\u3002\u591A\u653E\u51E0\u79CD\u3002\u4E94\u58F0\u6C11\u65CF\u4E4B\u7C7B\u7684\u5168\u4E00\u70B9\u300D\u3002\n// \u00B7 \u4E00\u4E2A\u8C03\u5F0F = \u4E00\u7EC4\u7B80\u8C31\u97F3\u7EA7\uFF08\u76F8\u5BF9\u300C1=\u300D\uFF0C\u53EF\u5E26\u5347\u964D\uFF09+ \u4E3B\u97F3\u662F\u54EA\u4E00\u7EA7\u3002\u300C1=\u300D\u7167\u65E7\u662F\u8C03\u53F7\uFF08do \u5728\u54EA\uFF09\uFF1A\n//   \u5C0F\u8C03 / \u7FBD\u8C03\u5F0F\u8FD9\u4E9B\u4EE5 6 \u4E3A\u4E3B\u97F3\uFF08la \u4E3A\u4E3B\u97F3\u7684\u5C0F\u8C03\uFF0C\u548C\u7B80\u8C31\u4E60\u60EF\u4E00\u6837\uFF1A1=C \u7684\u5C0F\u8C03 = a \u5C0F\u8C03\uFF09\uFF0C\u8C03\u53F7\u4E0D\u53D8\u3002\n// \u00B7 \u53EA\u7BA1 pad \u7684\u97F3\u952E\uFF1B\u7535\u8111\u952E\u76D8\u7684 1\u20137 \u7167\u65E7\u80FD\u6253\u4EFB\u4F55\u97F3\u7EA7\u3002\u5199\u8FDB\u8C31\u7684\u97F3\u6309 pad \u7684\u8C03\u62FC\u5199\uFF08\u5E26\u5347\u964D\u7684\u97F3\u7EA7 = \u4E34\u65F6\u8BB0\u53F7\uFF09\u3002\n// \u00B7 \u4E0D\u662F\u5341\u4E8C\u5E73\u5747\u5F8B\u7684\u97F3\u9636\uFF08\u5370\u5C3C pelog / slendro \u7B49\uFF09\u8FD9\u4E00\u7248\u653E\u4E0D\u8FDB\u6765\uFF1A\u8C31\u548C\u6708\u8BFB\u90FD\u53EA\u8BA4\u5341\u4E8C\u4E2A\u534A\u97F3\u3002\n\nimport { type Pitch, fromDiatonic, alterBy, midiOf } from \"./pitch.ts\";\n\nexport interface ScaleDeg { deg: number; alt: number }   // \u7B80\u8C31\u97F3\u7EA7 1\u20137 + \u5347\u964D\uFF08\u266F = +1\uFF09\nexport interface Scale { id: string; name: string; group: string; degs: ScaleDeg[]; home: number }   // home = \u4E3B\u97F3\u5728 degs \u91CC\u7684\u4E0B\u6807\n\nconst d = (s: string): ScaleDeg[] => s.split(\" \").map((t) => ({ deg: Number(t.replace(/[#b]/g, \"\")), alt: t.startsWith(\"#\") ? 1 : t.startsWith(\"b\") ? -1 : 0 }));\nconst mk = (id: string, name: string, group: string, degs: string, homeDeg: string): Scale => {\n  const ds = d(degs), h = d(homeDeg)[0];\n  return { id, name, group, degs: ds, home: ds.findIndex((x) => x.deg === h.deg && x.alt === h.alt) };\n};\n\n/** \u6EDA\u8F6E\u91CC\u7684\u987A\u5E8F = \u8FD9\u4E2A\u6570\u7EC4\u7684\u987A\u5E8F\uFF08\u5E38\u7528\u7684\u5728\u524D\uFF09\u3002 */\nexport const SCALES: Scale[] = [\n  mk(\"major\", \"\u5927\u8C03\", \"\u5927\u5C0F\u8C03\", \"1 2 3 4 5 6 7\", \"1\"),\n  mk(\"minor\", \"\u5C0F\u8C03\", \"\u5927\u5C0F\u8C03\", \"1 2 3 4 5 6 7\", \"6\"),\n  mk(\"harmonic-minor\", \"\u548C\u58F0\u5C0F\u8C03\", \"\u5927\u5C0F\u8C03\", \"1 2 3 4 #5 6 7\", \"6\"),\n  mk(\"melodic-minor\", \"\u65CB\u5F8B\u5C0F\u8C03\", \"\u5927\u5C0F\u8C03\", \"1 2 3 #4 #5 6 7\", \"6\"),\n  mk(\"gong\", \"\u5BAB\u8C03\u5F0F\", \"\u4E94\u58F0\", \"1 2 3 5 6\", \"1\"),\n  mk(\"shang\", \"\u5546\u8C03\u5F0F\", \"\u4E94\u58F0\", \"1 2 3 5 6\", \"2\"),\n  mk(\"jue\", \"\u89D2\u8C03\u5F0F\", \"\u4E94\u58F0\", \"1 2 3 5 6\", \"3\"),\n  mk(\"zhi\", \"\u5FB5\u8C03\u5F0F\", \"\u4E94\u58F0\", \"1 2 3 5 6\", \"5\"),\n  mk(\"yu\", \"\u7FBD\u8C03\u5F0F\", \"\u4E94\u58F0\", \"1 2 3 5 6\", \"6\"),\n  mk(\"qingjue\", \"\u516D\u58F0\u52A0\u6E05\u89D2\", \"\u6C11\u65CF\", \"1 2 3 4 5 6\", \"1\"),\n  mk(\"biangong\", \"\u516D\u58F0\u52A0\u53D8\u5BAB\", \"\u6C11\u65CF\", \"1 2 3 5 6 7\", \"1\"),\n  mk(\"yayue\", \"\u96C5\u4E50\", \"\u6C11\u65CF\", \"1 2 3 #4 5 6 7\", \"1\"),\n  mk(\"yanyue\", \"\u71D5\u4E50\", \"\u6C11\u65CF\", \"1 2 3 4 5 6 b7\", \"1\"),\n  mk(\"miyakobushi\", \"\u90FD\u8282\", \"\u65E5\u672C\", \"1 3 4 6 7\", \"3\"),\n  mk(\"ryukyu\", \"\u7409\u7403\", \"\u65E5\u672C\", \"1 3 4 5 7\", \"1\"),\n  mk(\"blues\", \"\u5E03\u9C81\u65AF\", \"\u5176\u4ED6\", \"1 b3 4 b5 5 b7\", \"1\"),\n  mk(\"dorian\", \"\u591A\u5229\u4E9A\", \"\u6559\u4F1A\u8C03\u5F0F\", \"1 2 3 4 5 6 7\", \"2\"),\n  mk(\"phrygian\", \"\u5F17\u91CC\u51E0\u4E9A\", \"\u6559\u4F1A\u8C03\u5F0F\", \"1 2 3 4 5 6 7\", \"3\"),\n  mk(\"lydian\", \"\u5229\u5E95\u4E9A\", \"\u6559\u4F1A\u8C03\u5F0F\", \"1 2 3 4 5 6 7\", \"4\"),\n  mk(\"mixolydian\", \"\u6DF7\u5408\u5229\u5E95\u4E9A\", \"\u6559\u4F1A\u8C03\u5F0F\", \"1 2 3 4 5 6 7\", \"5\"),\n  mk(\"locrian\", \"\u6D1B\u514B\u5229\u4E9A\", \"\u6559\u4F1A\u8C03\u5F0F\", \"1 2 3 4 5 6 7\", \"7\"),\n  mk(\"spanish\", \"\u897F\u73ED\u7259\", \"\u5176\u4ED6\", \"1 2 3 4 #5 6 7\", \"3\"),\n  mk(\"double-harmonic\", \"\u963F\u62C9\u4F2F\", \"\u5176\u4ED6\", \"1 b2 3 4 5 b6 7\", \"1\"),\n  mk(\"hungarian-minor\", \"\u5308\u7259\u5229\u5C0F\u8C03\", \"\u5176\u4ED6\", \"1 #2 3 4 #5 6 7\", \"6\"),\n  mk(\"whole-tone\", \"\u5168\u97F3\u9636\", \"\u5176\u4ED6\", \"1 2 3 #4 #5 #6\", \"1\"),\n  mk(\"chromatic\", \"\u534A\u97F3\u9636\", \"\u5176\u4ED6\", \"1 #1 2 #2 3 4 #4 5 #5 6 #6 7\", \"1\"),\n];\nexport const DEFAULT_SCALE = \"major\";\nexport const scaleById = (id: string): Scale => SCALES.find((s) => s.id === id) ?? SCALES[0];\n\n/** pad \u4E0A\u7B2C k \u4E2A\u97F3\uFF08k \u53EF\u4EE5\u662F\u8D1F\u6570\uFF09\uFF1Ak = 0 \u662F do\uFF08\u300C1=\u300D\u90A3\u4E2A\u97F3\uFF0Cdo \u6240\u5728\u7684\u516B\u5EA6\u7531 tonicD \u5B9A\uFF09\u90A3\u4E00\u7EA7\uFF0C\u5F80\u4E0A\u4E00\u4E2A\u8C03\u5F0F\u97F3\u4E00\u683C\u3002\n *  tonicD = do \u7684\u4E94\u7EBF\u8C31\u4F4D\u7F6E\uFF08diatonicIndex\uFF09\uFF0Cfifths = \u300C1=\u300D\u7684\u8C03\u53F7\u3002 */\nexport function ladderAt(sc: Scale, k: number, tonicD: number, fifths: number): { pitch: Pitch; deg: ScaleDeg; oct: number } {\n  const n = sc.degs.length, oct = Math.floor(k / n), deg = sc.degs[k - oct * n];\n  const pitch = alterBy(fromDiatonic(tonicD + deg.deg - 1 + 7 * oct, fifths), deg.alt);\n  return { pitch, deg, oct };\n}\n/** \u7B2C\u4E00\u4E2A\u97F3\u9AD8 \u2265 midi \u7684\u90A3\u4E00\u7EA7\uFF08\u7EDD\u5BF9\u6392\u6CD5\uFF1A\u6BCF\u884C\u4ECE C \u8D77\uFF09\u3002 */\nexport function ladderFirstAtOrAbove(sc: Scale, midi: number, tonicD: number, fifths: number): number {\n  let k = Math.floor(((midi - midiOf(ladderAt(sc, 0, tonicD, fifths).pitch)) / 12) * sc.degs.length) - sc.degs.length;\n  while (midiOf(ladderAt(sc, k, tonicD, fifths).pitch) < midi) k++;\n  return k;\n}\n/** \u4E3B\u97F3\u79BB do \u6700\u8FD1\u7684\u90A3\u4E00\u7EA7\uFF08\u9996\u8C03\u6392\u6CD5\uFF1A\u4ECE\u4E3B\u97F3\u8D77\uFF09\u3002 */\nexport function ladderHome(sc: Scale, tonicD: number, fifths: number): number {\n  const n = sc.degs.length, m0 = midiOf(ladderAt(sc, 0, tonicD, fifths).pitch);\n  const up = sc.home, down = sc.home - n;\n  return Math.abs(midiOf(ladderAt(sc, down, tonicD, fifths).pitch) - m0) < Math.abs(midiOf(ladderAt(sc, up, tonicD, fifths).pitch) - m0) ? down : up;\n}\n/** \u7B80\u8C31\u5199\u6CD5\uFF1A\u5E26\u5347\u964D\u7684\u97F3\u7EA7\uFF08\u266F4 / \u266D7\uFF09\u3002 */\nexport const degLabel = (g: ScaleDeg): string => `${g.alt > 0 ? \"\u266F\" : g.alt < 0 ? \"\u266D\" : \"\"}${g.deg}`;\n", "// pad-music.ts \u2014\u2014 pad \u7684\u97F3\u4E50\u77E5\u8BC6\uFF08\u6CE8\u5165\u7ED9 src/keyboard/pad.ts \u7684 PadMusic\uFF09\uFF1A\u8C03\u5F0F\u68AF\u5B50 \u2192 \u6BCF\u4E2A\u97F3\u952E\u662F\u54EA\u4E2A\u97F3\u3001\u600E\u4E48\u6807\uFF1B\u300C1=\u300D/ \u8C03\u5F0F\u7684\u5019\u9009\uFF1B\u300C\u22EF\u300D\u91CC\u63D2\u8BB0\u53F7\u7684\u73B0\u503C\u3002\n// created 2026-10-15 by Claude Fable 5.1\uFF08\u952E\u76D8\u6A21\u5757\u5200 2\uFF1B\u539F\u6765\u957F\u5728 pad.ts \u91CC\u7684 scales / pitch / song \u8C03\u7528\u539F\u6837\u642C\u6765\uFF0C\u7B97\u6CD5\u4E0D\u53D8\uFF09\u3002\n//   user 2026-10-14\u300C\u952E\u76D8\u786E\u5B9E\u662F\u524D\u7AEF\uFF0C\u97F3\u4E50\u77E5\u8BC6\u6BD4\u5982\u548C\u5F26\u6709\u51E0\u4E2A\u662F\u5916\u90E8\u6CE8\u5165\u7684\uFF0C\u6240\u4EE5\u4E00\u4E2A\u952E\u76D8\u7684\u524D\u7AEF\u5E93\uFF0C\u4E00\u4E2A\u662F\u8D1F\u8D23\u751F\u6210\u97F3\u4E50\u77E5\u8BC6\u7684\u6DF1\u6A21\u5757\u3002\u4EE5\u540E\u6211\u4EEC\u9A6C\u4E0A\u8981\u505A\u548C\u5F26\u952E\u76D8\uFF0C\u4E5F\u662F\u4E00\u6837\u7684\u300D\n//   \u952E\u76D8\u53EA\u8BA4\u300C\u7B2C k \u7EA7\u300D\uFF1Bk \u662F\u4EC0\u4E48\u97F3\u3001\u53EB\u4EC0\u4E48\u3001MIDI \u51E0\u53F7\uFF0C\u90FD\u4ECE\u8FD9\u91CC\u62FF\u3002\u4EE5\u540E\u7684\u548C\u5F26\u952E\u76D8 = \u53E6\u4E00\u4E2A PadMusic\uFF08cell(k) = \u7B2C k \u4E2A\u548C\u5F26\uFF09\u3002\nimport { type Pitch, HOME, diatonicIndex, tonicStepIndex, pitchName, alterBy, midiOf, KEY_LABEL } from \"../score/pitch.ts\";\nimport { type Scale, SCALES, scaleById, ladderAt, ladderFirstAtOrAbove, ladderHome, degLabel } from \"../score/scales.ts\";\nimport { type EditorState, inputKey, keyAt, timeAt, tempoAt, tr } from \"../score/song.ts\";\nimport type { PadMusic, PadCell } from \"../keyboard/pad.ts\";\n\n/** \u4E94\u5EA6\u5708\uFF0C\u266D \u591A \u2192 C \u2192 \u266F \u591A\uFF1B\u65CB\u94AE / \u6EDA\u8F6E\u91CC\u53CD\u8FC7\u6765\u653E\uFF08\u5927\u7684\u5728\u4E0A\uFF1A1=F\u266F \u2026 1=C \u2026 1=G\u266D\uFF09\u3002 */\nexport const KEY_CIRCLE = [-6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6];\nconst KNOB_KEYS = [...KEY_CIRCLE].reverse();\n/** \u4E0D\u5E26\u70B9\u7684\u90A3\u4E00\u7EC4 = \u5979\u8BF4\u8BDD\u7684\u5BB6\uFF08HOME = D4\uFF09\u6240\u5728\u7684\u90A3\u4E2A\u300C1 \u5230 7\u300D\uFF1A1=C \u65F6 C4\u2013B4 \u4E0D\u5E26\u70B9\u3002 */\nexport function homeTonic(fifths: number): number {\n  const t = tonicStepIndex(fifths), h = diatonicIndex(HOME);\n  return t + 7 * Math.floor((h - t) / 7);\n}\n/** \u97F3\u540D\u7684\u4EBA\u8BDD\u5199\u6CD5\uFF1AC\u266F4 / B\u266D3\u3002 */\nexport const pretty = (p: Pitch): string => pitchName(p).replace(/#/g, \"\u266F\").replace(/b(?=\\d)|b(?=b)/g, \"\u266D\");\n/** \u300C1=\u300D\u65CB\u94AE\u4E0A\u7684\u5B57\uFF1A\u8C03 + \u8C03\u5F0F\u540D\uFF08\u5C0F\u5B57\uFF09\u3002 */\nconst keyLabel = (f: number, sc: Scale) => `<span class=\"kk\">1=${KEY_LABEL[f] ?? \"?\"}</span><small>${sc.name}</small>`;\n/** \u8C03\u5F0F\u5728\u6EDA\u8F6E\u91CC\u7684\u6837\u5B50\uFF1A\u540D\u5B57 + \u4ECE\u4E3B\u97F3\u8D77\u7684\u97F3\u7EA7\uFF08\u7FBD\u8C03\u5F0F = 6 1 2 3 5\uFF09\u3002 */\nconst scaleItem = (sc: Scale) => `<span class=\"sc\"><b>${sc.name}</b><small>${[...sc.degs.slice(sc.home), ...sc.degs.slice(0, sc.home)].map(degLabel).join(\" \")}</small></span>`;\n\n/** \u5BBF\u4E3B\u8FD9\u8FB9\u591A\u77E5\u9053\u7684\u51E0\u6837\uFF08\u5199\u8C31 / \u51FA\u58F0\u8981\u97F3\u9AD8\uFF1B\u65CB\u94AE\u7B2C i \u6863\u662F\u54EA\u4E2A\u8C03\uFF09\uFF1B\u952E\u76D8\u62FF\u5230\u7684\u53EA\u662F PadMusic \u90A3\u90E8\u5206\u3002 */\nexport interface PadMusicHost extends PadMusic {\n  /** \u7B2C k \u7EA7\u662F\u54EA\u4E2A\u97F3\uFF08\u5BBF\u4E3B\u5199\u8C31 / \u51FA\u58F0\u7528\uFF1B\u952E\u76D8\u4E0D\u78B0\uFF09\u3002 */\n  pitchAt(k: number): Pitch;\n  /** \u65CB\u94AE / \u6EDA\u8F6E\u7B2C i \u6863 = \u54EA\u4E2A\u8C03 / \u54EA\u4E2A\u8C03\u5F0F\u3002 */\n  fifthsAt(i: number): number;\n  scaleIdAt(i: number): string;\n}\n\nexport function createPadMusic(get: () => EditorState): PadMusicHost {\n  const f = (): number => inputKey(get()), sc = (): Scale => scaleById(get().input.inputScale);\n  const at = (k: number) => ladderAt(sc(), k, homeTonic(f()), f());\n  const pitchAt = (k: number): Pitch => at(k).pitch;\n  return {\n    sig: () => `${f()}|${get().input.inputScale}`,\n    cell: (k): PadCell => { const r = at(k); return { deg: degLabel(r.deg), oct: r.oct, abs: pretty(r.pitch), midi: midiOf(r.pitch) }; },\n    altered: (k, a) => pretty(alterBy(pitchAt(k), a)),\n    anchor: (layout) => (layout === \"absolute\" ? ladderFirstAtOrAbove(sc(), 60, homeTonic(f()), f()) : ladderHome(sc(), homeTonic(f()), f())),\n    keyChoices: () => ({ items: KNOB_KEYS.map((k) => keyLabel(k, sc())), index: Math.max(0, KNOB_KEYS.indexOf(f())), name: `1=${KEY_LABEL[f()] ?? \"?\"} ${sc().name}` }),\n    keyDrum: () => {\n      const st = get();\n      return {\n        keys: { items: KNOB_KEYS.map((k) => `1=${KEY_LABEL[k]}`), index: Math.max(0, KNOB_KEYS.indexOf(inputKey(st))) },\n        scales: { items: SCALES.map(scaleItem), index: Math.max(0, SCALES.findIndex((x) => x.id === st.input.inputScale)) },\n      };\n    },\n    marksHere: () => {\n      const st = get(), toks = tr(st), i = st.sel ? st.sel.from : st.caret, t = timeAt(toks, i);\n      return { key: KEY_LABEL[keyAt(toks, i)] ?? \"?\", beats: t.beats, beatType: t.beatType, bpm: tempoAt(toks, i) };\n    },\n    pitchAt,\n    fifthsAt: (i) => KNOB_KEYS[i],\n    scaleIdAt: (i) => SCALES[i].id,\n  };\n}\n", "// pad-keys.ts \u2014\u2014 pad \u53D1\u51FA\u6765\u7684\u300C\u6309\u952E id\u300D\u2192 \u7F16\u8F91\u547D\u4EE4 / \u63D2\u8BB0\u53F7 / \u5F00\u5C0F\u83DC\u5355\uFF08\u7FFB\u8BD1\u5C42\u7684\u4E00\u534A\uFF1A\u952E\u76D8\u53EA\u53D1\u6309\u952E\uFF0C\u5B83\u4E0D\u61C2\u8C31\uFF1B\u9501 \u00D7 \u5149\u6807 \u00D7 \u9009\u533A\u7684\u90A3\u4E00\u534A\u5728 main.ts \u7684 pad \u5BBF\u4E3B\u91CC\uFF09\u3002\n// created 2026-10-15 by Claude Fable 5.1\uFF08\u952E\u76D8\u6A21\u5757\u5200 2\uFF1B\u539F\u6765\u662F pad.ts act() \u548C\u5199\u5B57\u952E\u90A3\u51E0\u884C\u91CC\u7684\u5206\u652F\uFF0C\u9010\u6761\u642C\u6765\uFF09\u3002\n//   user 2026-10-14\u300C\u7136\u540E\u51FA\u6765\u7684\u4E5F\u662F\u6309\u952E\u800C\u4E0D\u662F\u548C\u5F26\uFF0C\u7FFB\u8BD1\u6210\u97F3\u7B26\u8F93\u5165\u522B\u7684\u4EBA\u7BA1\u3002\u952E\u76D8\u53EA\u7BA1\u4EA4\u4E92\u72B6\u6001\u673A\uFF0C\u5B83\u4E0D\u61C2\u97F3\u4E50\u300D\u3002\nimport type { Command } from \"../score/commands.ts\";\nimport type { Art, Dyn } from \"../score/song.ts\";\nimport type { Mark } from \"../score/perform.ts\";\n\nexport type PadKeyAction =\n  | { kind: \"cmd\"; cmd: Command }\n  | { kind: \"mark\"; mark: \"key\" | \"time\" | \"tempo\" }                   // \u63D2\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\uFF08\u5728\u5149\u6807\u5904\uFF0C\u5F00\u8BB0\u53F7\u6846\uFF09\n  | { kind: \"menu\"; menu: \"groove\" | \"repeat\" | \"clef\" | \"ottava\" };    // \u5F00\u5C0F\u83DC\u5355\uFF08\u98CE\u683C / \u53CD\u590D / \u8C31\u53F7 / \u516B\u5EA6\u7EBF\uFF09\n\nconst cmd = (c: Command): PadKeyAction => ({ kind: \"cmd\", cmd: c });\n/** \u4E00\u4E2A\u6309\u952E id \u8BE5\u505A\u4EC0\u4E48\uFF1B\u4E0D\u8BA4\u8BC6\u7684 = null\uFF08\u952E\u76D8\u52A0\u4E86\u683C\u5B50\u3001\u8FD9\u91CC\u6CA1\u63A5 = test/pad-keys.test.ts \u7EA2\uFF09\u3002mods.ramp = \u300C\u6E10\u5230\u300D\u4EAE\u7740\uFF08\u53EA\u5BF9\u529B\u5EA6\u6709\u610F\u4E49\uFF09\u3002 */\nexport function padKeyAction(id: string, mods: { ramp: boolean } = { ramp: false }): PadKeyAction | null {\n  const m = /^caret:(-?1)$/.exec(id); if (m) return cmd({ k: \"caret\", d: Number(m[1]) });\n  switch (id) {\n    case \"rest\": case \"bar\": case \"extend\": case \"backspace\": case \"symBackspace\": case \"staff\": case \"phrase\": case \"slur\": return cmd({ k: id } as Command);\n    case \"key\": case \"time\": case \"tempo\": return { kind: \"mark\", mark: id };\n    case \"groove\": case \"repeat\": case \"clef\": case \"ottava\": return { kind: \"menu\", menu: id };\n    case \"wedge:cresc\": return cmd({ k: \"wedge\", w: \"cresc\" });\n    case \"wedge:dim\": return cmd({ k: \"wedge\", w: \"dim\" });\n    case \"dyn:ramp\": return null;   // \u4FEE\u9970\u952E\uFF0C\u952E\u76D8\u81EA\u5DF1\u7BA1\uFF08latch\uFF09\n  }\n  if (id.startsWith(\"art:\")) return cmd({ k: \"art\", a: id.slice(4) as Art });\n  if (id.startsWith(\"inhale:\")) return cmd({ k: \"inhale\", v: id.slice(7) as \"soft\" | \"big\" });\n  if (id.startsWith(\"swell:\")) return cmd({ k: \"swell\", w: id.slice(6) as \"<\" | \">\" | \"<>\" });\n  if (id.startsWith(\"dyn:\")) return cmd({ k: \"dyn\", v: id.slice(4) as Dyn, ...(mods.ramp ? { ramp: true } : {}) });\n  return null;\n}\n/** \u8FD9\u4E2A\u6309\u952E\u5199\u7684\u662F\u53F0\u4E0A\u90A3\u4F4D\u8981\u300C\u8BA4\u300D\u7684\u54EA\u79CD\u8BB0\u53F7\uFF08perform.ts \u7684 Mark\uFF1B\u7B26\u53F7\u683C\u753B\u7070 + \u300C\u4E0D\u8BA4\u300D\u63D0\u793A\u6309\u5B83\u67E5\uFF09\uFF1B\u4E0D\u662F\u8BB0\u53F7 = null\u3002 */\nexport function markOfKey(id: string): Mark | null {\n  if (id.startsWith(\"art:\")) return id.slice(4) as Mark;\n  if (id === \"slur\") return \"slur\";\n  if (id === \"swell:>\") return \"swellFade\";\n  if (id.startsWith(\"swell:\")) return \"swellGrow\";\n  if (id.startsWith(\"inhale:\")) return \"inhale\";\n  return null;\n}\n", "// \u5BBF\u4E3B\u300C\u5730\u677F\u300D\u6CE8\u5165\uFF08A5 \u5305\u5316\uFF0C2026-09-09\uFF0CClaude Fable 5.1\uFF09\u3002\n// WeebPaint \u91CC anchored-popup \u76F4\u63A5 import context-toolbar \u7684\u4E0B\u7F18\u3001notice \u76F4\u63A5 import floating-window \u7684\u9876\u5730\u677F\u2014\u2014\n// \u90A3\u662F\u5BBF\u4E3B\u5E03\u5C40\u77E5\u8BC6\uFF0C\u5305\u4E0D\u80FD\u6709\u3002\u5BBF\u4E3B\u5728 mount \u65F6 configureFloors({...})\uFF1B\u4E0D\u914D = 0 / safeAreaTop\uFF08\u65E0\u9876\u680F\u7684\u5BBF\u4E3B\uFF0C\u5982 CatsUp\uFF09\u3002\n// env(safe-area-inset-top) \u5728 JS \u62FF\u4E0D\u5230\u89E3\u6790\u540E\u7684\u5B57\u9762\u503C \u2192 \u4E00\u6B21\u6027\u63A2\u9488\u91CF padding-top\uFF08\u65CB\u8F6C / \u673A\u578B\u53D8\u4E86\u4E5F\u51C6\uFF09\u3002\uFF08\u539F anchored-popup.ts\uFF09\nexport function safeAreaTop() {\n    const probe = document.createElement(\"div\");\n    probe.style.cssText =\n        \"position:fixed;top:0;left:0;height:0;padding-top:env(safe-area-inset-top,0px);visibility:hidden;pointer-events:none;\";\n    document.body.appendChild(probe);\n    const v = parseFloat(getComputedStyle(probe).paddingTop) || 0;\n    probe.remove();\n    return v;\n}\nconst _f = { toolbarBottom: () => 0, floatingTop: () => safeAreaTop() };\nexport const floors = { toolbarBottom: () => _f.toolbarBottom(), floatingTop: () => _f.floatingTop() };\nexport function configureFloors(f) {\n    if (f.toolbarBottom)\n        _f.toolbarBottom = f.toolbarBottom;\n    if (f.floatingTop)\n        _f.floatingTop = f.floatingTop;\n    else if (f.toolbarBottom)\n        _f.floatingTop = () => Math.max(safeAreaTop(), f.toolbarBottom());\n}\n", "// \u804C\u8D23\uFF08\u5355\u4E00\uFF09\uFF1A\u5F39\u6846\u951A\u5B9A\u5B9A\u4F4D\u2014\u2014\u6240\u6709\u300C\u8DDF\u7740\u6309\u94AE / \u9876\u680F\u8DD1\u300D\u7684 popup \u7684**\u552F\u4E00**\u5B9A\u4F4D\u5165\u53E3\u3002\n// \u7EDF\u4E00\u5904\u7406\uFF1Aposition:fixed + \u8BA9\u5230\u9876\u680F\u6761\u4EE5\u4E0B + \u8BFB env(safe-area-inset-top)\uFF08iPad \u65E5\u671F/\u72B6\u6001\u680F\uFF09\n//   + \u5939\u8FDB\u89C6\u53E3\uFF08\u4E0D\u6EA2\u51FA\u9876 / \u5E95\uFF09\u3002CSS \u53EA\u7BA1\u5916\u89C2\uFF0C\u5750\u6807\u53EA\u6B64\u4E00\u5904\u7B97 \u2192 \u675C\u7EDD\u300C\u5404 popup \u5404\u5199\u4E00\u5957\u3001\u6F0F\n//   safe-area / \u6F0F\u5939\u89C6\u53E3\u300D\u90A3\u7C7B iPad \u6253\u67B6 bug\uFF08v267 \u524D fx \u9009\u5355 top:70\u3001\u53C2\u8003\u7A97\u5DE6\u4E0A\u89D2\u90FD\u683D\u8FC7\u540C\u4E00\u6839\u56E0\uFF09\u3002\n//\n// \u4E0D\u542B\uFF1A\n//   \u00B7 lasso \u90A3\u6279\u300C\u9489\u6B7B\u5728\u5DE5\u5177\u680F\u6B63\u4E0B\u65B9\u5C45\u4E2D\u300D\u7684\u7EAF CSS popup \u2014\u2014 \u4F4D\u7F6E\u4E0D\u968F\u6309\u94AE\u8DD1\uFF0C\u7559 CSS \u96F6 JS\u3001\u96F6\u6296\u52A8\uFF1B\n//   \u00B7 modal sheets\uFF08sheets.ts\uFF0C\u5C45\u4E2D / \u5E95\u90E8\u5F39\u5C42\u662F\u53E6\u4E00\u5957\u7CFB\u7EDF\uFF09\u3002\n//\n// v270 \u6536\u655B\uFF1A\u539F\u6765\u8FD9\u91CC\u6709 3 \u4E2A\u8FD1\u4F3C\u51FD\u6570\uFF08openAnchoredPopup/anchorPopupToBtn/anchorPopupBelowToolbars\uFF0C\n//   feature \u5404\u7F3A\u4E00\u5757\uFF09+ settings-menu / filters-adjust \u5404\u624B\u6413\u4E00\u4EFD\u3002\u5168\u90E8\u6536\u6210 positionPopup \u4E00\u4E2A\u6838\u5FC3\uFF1B\n//   \u65E7\u540D\u7559\u4F5C\u8584 wrapper\uFF08\u8001\u8C03\u7528\u70B9\u96F6\u6539\u52A8\uFF0C\u767D\u6361 safe-area + \u5939\u89C6\u53E3\uFF09\u3002\n// env(safe-area-inset-top) \u5728 JS \u62FF\u4E0D\u5230\u89E3\u6790\u540E\u7684\u5B57\u9762\u503C \u2192 \u4E00\u6B21\u6027\u63A2\u9488\u91CF padding-top\uFF08\u65CB\u8F6C / \u673A\u578B\u53D8\u4E86\u4E5F\u51C6\uFF09\u3002\n// \u9876\u90E8\u56FA\u5B9A\u5DE5\u5177\u680F\u7684\u6700\u5927 bottom\uFF1A2026-09-02 C4 \u8D77\u95EE\u767B\u8BB0\u8868\uFF08ui/context-toolbar\uFF09\uFF0C\u4E0D\u518D\u624B\u586B id \u6570\u7EC4\n//   \uFF08\u539F _TOP_TOOLBAR_IDS \u516D\u6761\u53EA\u767B\u8BB0\u4E09\u6761\uFF0Cshape/picker/persp \u6F0F\u2014\u2014\u65B0\u589E\u4E00\u6761\u8981\u8BB0\u5F97\u6539\u6570\u7EC4 = \u4E0B\u4E00\u6B21 T2\uFF09\u3002\nimport { floors, safeAreaTop } from \"./host-floors.js\"; // safeAreaTop \u5B9E\u73B0\u632A\u5230 host-floors\uFF08A5 \u5305\u5316\uFF1A\u5207\u6389\u5FAA\u73AF import\uFF09\uFF1B\u8FD9\u91CC\u518D\u5BFC\u51FA\u4FDD pinned \u7B7E\u540D\nexport { safeAreaTop };\n// \u5305\u5316\uFF082026-09-09 A5\uFF09\uFF1A\u300C\u9876\u680F\u4E0B\u7F18\u300D\u4E0D\u518D import \u5BBF\u4E3B\u7684 context-toolbar\uFF0C\u6539\u4E3A mount \u65F6\u6CE8\u5165\u7684 getter\uFF08configureFloors\uFF09\u3002\nexport function topToolbarBottom() { return floors.toolbarBottom(); }\n// \u552F\u4E00\u5B9A\u4F4D\u6838\u5FC3\u3002\u6240\u6709\u6309\u94AE\u951A\u5B9A / \u8FB9\u9489\u7684 popup \u90FD\u8D70\u5B83\u3002\nexport function positionPopup(popupEl, opts = {}) {\n    if (!popupEl)\n        return;\n    const { anchor = null, align = \"right\", offsetY = 4, edgeMargin = 8, belowToolbars = false, clampViewport = true, } = opts;\n    popupEl.style.position = \"fixed\";\n    const safeTop = safeAreaTop();\n    let top;\n    // \u6A2A\u5411\uFF1A\u5148\u6309 align \u6C42\u540D\u4E49\u4F4D\u7F6E\uFF0C\u518D\u5939\u8FDB\u89C6\u53E3\u5DE6\u53F3\u7F18\uFF08v0.5.15\u2014\u2014\u7D27\u51D1\u56FE\u6807\u83DC\u5355\u951A\u504F\u8FB9\u7F18\u7684\u69FD\u6309\u94AE\u65F6\u66FE\u6EA2\u51FA\uFF1B\n    //   \u4E0E\u7EB5\u5411\u540C\u4E00\u6761\u7EAA\u5F8B\uFF1A\u5750\u6807\u53EA\u6B64\u4E00\u5904\u7B97\u3002popup \u9690\u85CF\u65F6\u91CF\u4E0D\u5230\u5BBD \u2192 \u8DF3\u8FC7\u5939\uFF0C\u4E0E\u7EB5\u5411\u65E7\u884C\u4E3A\u4E00\u81F4\uFF09\u3002\n    const w = popupEl.offsetWidth || 0;\n    if (anchor) {\n        const r = anchor.getBoundingClientRect();\n        top = r.bottom + offsetY;\n        if (align === \"right\") {\n            let right = window.innerWidth - r.right;\n            if (w)\n                right = Math.max(edgeMargin, Math.min(right, window.innerWidth - w - edgeMargin));\n            popupEl.style.right = right + \"px\";\n            popupEl.style.left = \"auto\";\n        }\n        else {\n            let left = r.left;\n            if (w)\n                left = Math.max(edgeMargin, Math.min(left, window.innerWidth - w - edgeMargin));\n            popupEl.style.left = left + \"px\";\n            popupEl.style.right = \"auto\";\n        }\n    }\n    else {\n        top = safeTop + offsetY;\n        if (align === \"right\") {\n            popupEl.style.right = edgeMargin + \"px\";\n            popupEl.style.left = \"auto\";\n        }\n        else {\n            popupEl.style.left = edgeMargin + \"px\";\n            popupEl.style.right = \"auto\";\n        }\n    }\n    if (belowToolbars)\n        top = Math.max(top, topToolbarBottom() + offsetY);\n    top = Math.max(top, safeTop + 4); // safe-area floor\uFF1A\u6C38\u4E0D\u94BB\u8FDB iPad \u9876\u90E8\u680F\n    if (clampViewport) {\n        const h = popupEl.offsetHeight || 0; // \u5DF2\u9690\u85CF \u2192 0 \u2192 \u8DF3\u8FC7\u5939\uFF08\u4E0E\u65E7\u884C\u4E3A\u4E00\u81F4\uFF09\n        if (h)\n            top = Math.min(top, Math.max(safeTop + 4, window.innerHeight - h - 8));\n    }\n    popupEl.style.top = top + \"px\";\n}\n// \uFF08anchorPopupToBtn / anchorPopupBelowToolbars \u517C\u5BB9 wrapper 2026-09-02 C1 \u9000\u5F79\uFF1A\u83DC\u5355\u951A\u5B9A\u5168\u8D70 ui/popup-menu \u2192 positionPopup\uFF1B\u96F6\u6D88\u8D39\u8005\uFF09\n", "// \u56FE\u6807 = \u6307\u5411\u5185\u8054 sprite \u7684 <use>\u3002sprite \u5728 index.html \u9876\u90E8\uFF08tools/inline-sprites.py \u751F\u6210\uFF09\u3002\n//\n// \u4E3A\u4EC0\u4E48\u5168\u8D70\u8FD9\u91CC\uFF1A\u5728\u6B64\u4E4B\u524D 53 \u4E2A\u56FE\u6807\u5404\u81EA\u624B\u5199\u5185\u8054 <svg>\uFF0C\u540C\u4E00\u6761\u4E91\u6735 path \u590D\u5236\u4E86 9 \u904D\u3001\n// \u52A0\u53F7 3 \u904D\uFF0C\u8FD8\u5E76\u5B58\u4E09\u4E2A\u4E92\u4E0D\u76F8\u8BC6\u7684 svg() \u5B57\u7B26\u4E32\u5DE5\u5382\u3002\u6539\u4E00\u4E2A\u56FE\u6807\u8981\u5168\u4ED3\u5E93 grep\u3002\n//\n// \u5C3A\u5BF8\u4E0D\u5728\u8FD9\u91CC\u5B9A\uFF1A\u5168\u90E8\u7531 CSS \u6309\u8BED\u5883\u7ED9\uFF08.tool svg / .layers-foot-btn svg / .gallery-icon-btn svg \u2026\uFF09\u3002\n// \u4F20 size \u53EA\u7528\u4E8E CSS \u591F\u4E0D\u7740\u7684\u5730\u65B9\uFF08\u6BD4\u5982\u585E\u8FDB v-html \u7684\u88F8\u7247\u6BB5\uFF09\u3002\n//\n// \u56FE\u6807\u540D = \u5171\u4EAB\u5E93\uFF0820260708 SVG Icons\uFF09\u7684 symbol id\uFF0C\u6216 assets/weebpaint_legacy.svg \u91CC\u7684\u672C\u5730\u8865\u4E01\u3002\n// \u540D\u5B57\u5199\u4E86\u4F46\u4E24\u8FB9\u90FD\u6CA1\u6709 \u2192 \u9875\u9762\u4E0A\u90A3\u4E2A\u4F4D\u7F6E\u7A7A\u767D\u3002\u52A0\u56FE\u6807\u8BF7\u8D70 assets/ \u4E0B\u7684\u6E90\u6587\u4EF6 + \u91CD\u8DD1\u811A\u672C\u3002\n/** \u56FE\u6807\u7684 HTML \u5B57\u7B26\u4E32\uFF08\u7ED9 innerHTML / v-html / \u6A21\u677F\u62FC\u63A5\u7528\uFF09\u3002 */\nexport function iconHtml(name, opts = {}) {\n    const { size, cls } = opts;\n    const attrs = [\n        'viewBox=\"0 0 24 24\"',\n        cls ? `class=\"${cls}\"` : \"\",\n        size ? `width=\"${size}\" height=\"${size}\"` : \"\",\n        'aria-hidden=\"true\"',\n    ].filter(Boolean).join(\" \");\n    return `<svg ${attrs}><use href=\"#${name}\"/></svg>`;\n}\n/** \u56FE\u6807 DOM \u8282\u70B9\uFF08\u7ED9 appendChild \u7528\uFF09\u3002 */\n", "// \u5F39\u51FA\u83DC\u5355\u6DF1\u6A21\u5757\u2014\u2014\u300C\u951A\u5B9A + \u6302 body + z band + \u5173\u95ED\u7EAA\u5F8B\u300D\u4E00\u7AD9\u5F0F\u3002created 2026-09-02 by Claude Fable 5.1.\n//\n// \u4E3A\u4EC0\u4E48\u8981\u5B83\uFF08user 2026-07-25 \u70B9\u540D\u300C\u4E0E\u7EC4\u69FD\u4E0B\u62C9/\u22EF\u83DC\u5355/tile \u83DC\u5355\u4E00\u8D77\u6536\u6210 popover \u6DF1\u6A21\u5757\uFF08open/close/\u951A\u5B9A/z \u4E00\u7AD9\u5F0F\uFF09\u300D\uFF1B\n//   2026-09-02\u300Creference \u7684\u76EE\u5F55\u88AB\u7A97\u53E3\u88C1\u526A\u2026\u8001\u9519\u8BEF\u53C8\u72AF\u2026\u4E00\u9524\u5B50\u4E70\u5356\u987A\u624B\u628A menu \u7684\u6DF1\u6A21\u5757\u505A\u4E86\u300D\uFF09\uFF1A\n//   \u83DC\u5355\u53EA\u8981\u662F**\u67D0\u4E2A\u5BB9\u5668\u7684\u5B50\u8282\u70B9**\uFF0C\u5C31\u4F1A\u649E\u4E0A\u4E24\u7C7B\u7ED3\u6784\u6027 bug\u2014\u2014\u2460 \u5BB9\u5668 overflow:hidden \u628A\u5B83\u88C1\u6389\n//   \uFF08\u53C2\u8003\u7A97 shadow \u5185 .menu \u590D\u53D1\u7684\u6B63\u662F\u8FD9\u4E2A\uFF09\uFF1B\u2461 \u5BB9\u5668\u81EA\u6210 stacking context\uFF0C\u83DC\u5355\u56F0\u5728\u5BB9\u5668\u7684 z \u91CC\uFF0C\n//   \u88AB\u522B\u7684\u6D6E\u7A97\u76D6\u4F4F\uFF08surfaces \u6DF1\u6A21\u5757\u6CBB\u7684\u90A3\u4E00\u65CF\uFF09\u3002\u6839\u6CBB\u53EA\u6709\u4E00\u6761\u8DEF\uFF1A\u83DC\u5355\u8282\u70B9**\u6302 document.body**\uFF0C\n//   z \u8D70 band \u8868\uFF08styles.css --z-*\uFF09\uFF0C\u5750\u6807\u8D70 anchored-popup\uFF08\u5168\u4ED3\u552F\u4E00\u5B9A\u4F4D\u5165\u53E3\uFF09\u3002\u672C\u6A21\u5757\u628A\u8FD9\u6761\u8DEF\u5C01\u88C5\u6B7B\uFF0C\n//   \u6D88\u8D39\u8005\u53EA\u63CF\u8FF0\u300C\u951A\u5728\u8C01\u4E0B\u9762\u3001\u6709\u54EA\u4E9B\u9879\u3001\u9009\u4E86\u600E\u4E48\u529E\u300D\uFF0C\u4E0D\u78B0 DOM/\u5750\u6807/z\u3002\n//\n// \u4E24\u4E2A adapter = \u771F seam\uFF08UI \u7EAA\u5143 C1\uFF0C2026-09-02\uFF09\uFF1A\n//   \u00B7 **\u73B0\u5EFA**\uFF08openPopupMenu\uFF09\uFF1Aitems \u51FD\u6570\u73B0\u7B97 \u2192 module \u5EFA\u8282\u70B9\uFF08\u53C2\u8003\u7A97 \uFF0B \u83DC\u5355\u3001\u4E3B\u9898/\u8BED\u8A00/\u8BCD\u5E93\u4E0B\u62C9\uFF09\uFF1B\n//   \u00B7 **\u6536\u517B**\uFF08openAdoptedPopup\uFF09\uFF1A\u5185\u5BB9\u4ECD\u662F index.html \u91CC\u7684\u9759\u6001\u8282\u70B9\uFF08\u6C49\u5821\u4E3B\u83DC\u5355 / \u56FE\u5E93\u4E09 popup / \u8C03\u6574 popup /\n//     \u56FE\u5C42 \uFF0B / \u5957\u7D22\u00B7\u5F62\u72B6\u7EC4\u69FD \u00D713\uFF09\uFF0C\u751F\u547D\u5468\u671F\u5F52 module\u2014\u2014\u5916\u70B9\u5173 / Escape / \u5B9A\u4F4D / \u6808 / \u663E\u9690\u4E00\u5904\uFF0C\u6D88\u8D39\u8005\u7684\n//     15 \u4EFD\u5916\u70B9\u5173\u624B\u6284\u4E0E _transientMenus \u7531\u6B64\u9000\u5F79\u3002\n//\n// \u5173\u95ED\u7EAA\u5F8B\uFF08\u5185\u5EFA\uFF09\uFF1A\u70B9\u5916\u9762\u5173\uFF08capture \u76F8\uFF0C\u53EF\u9009\u541E\u6389\u90A3\u4E00\u51FB\uFF09\u3001Escape \u5173\u6700\u4E0A\u5C42\u3001**\u6808**\uFF08\u5F00\u65B0\u7684\u4F1A\u5173\u6389\u6240\u6709\n//   \u300C\u4E0D\u5305\u542B\u65B0\u951A\u300D\u7684\u65E7\u83DC\u5355\u2014\u2014\u4E3B\u83DC\u5355\u91CC\u518D\u5F39\u4E3B\u9898\u4E0B\u62C9\uFF0C\u4E3B\u83DC\u5355\u7559\u7740\uFF1B\u70B9\u522B\u5904\u4E24\u5C42\u4E00\u8D77\u5173\uFF09\u3001\u89C6\u53E3 resize \u91CD\u5B9A\u4F4D\u3001\n//   **\u83DC\u5355\u5916\u7684\u6EDA\u52A8\u8BA9\u951A\u79FB\u4E86\u4F4D = \u5173**\uFF080.1.1 \u52A0\u30010.1.2 \u6536\u7D27\uFF0C2026-09-30\uFF1A\u83DC\u5355\u662F fixed \u7684\uFF0C\u951A\u5728\u6EDA\u52A8\u5BB9\u5668\u91CC\u4E00\u6EDA\u83DC\u5355\u5C31\u6F02\u5728\u534A\u7A7A\uFF1B\n//   \u83DC\u5355\u81EA\u5DF1\u5185\u90E8\u7684\u6EDA\u52A8\u4E0D\u7B97\uFF1B\u951A\u6CA1\u52A8\u7684 scroll \u4E8B\u4EF6\u4E5F\u4E0D\u7B97\u2014\u2014iOS \u4E0A tap \u4F1A\u4F34\u968F\u5E7D\u7075 scroll\uFF0C\u82E5\u89C1 scroll \u5C31\u5173\uFF0C\u83DC\u5355\u9879\u7684 click \u8FD8\u6CA1\u5230\u5C31\u88AB\u6536\u6389\uFF09\u3001\n//   \u951A\u6309\u94AE\u518D\u70B9\u4E00\u4E0B = toggle\u3002shadow DOM \u53CB\u597D\uFF1A\u5916\u70B9\u5224\u5B9A\u7528 composedPath\uFF08\u951A\u53EF\u4EE5\u5728 shadow \u91CC\uFF0C\u5982\u53C2\u8003\u7A97\u7684 \uFF0B\uFF09\u3002\n//\n// \u5F62\u6001\uFF1Alist\uFF08.menu-item \u884C\uFF0C\u5E26\u524D\u7F00\u56FE\u6807\uFF0C\u4E0E\u6C49\u5821\u83DC\u5355\u540C\u6B3E\uFF09/ compact\uFF08\u836F\u4E38\u884C\uFF0C\u4E3B\u9898/\u8BED\u8A00\u4E0B\u62C9\u65E7\u89C2\u611F\uFF09\u3002\n// \u56FE\u6807 = sprite id\uFF08<use>\uFF0C\u83DC\u5355\u5728 light DOM \u6240\u4EE5\u76F4\u63A5\u5F15\u7528\u5F97\u5230\uFF09\u3002\n// \u4E8C\u6BB5\u786E\u8BA4\u4E4B\u7C7B\u300C\u9009\u4E86\u4F46\u522B\u5173\u300D\uFF1AonPick \u8FD4\u56DE \"keep\"\uFF0C\u968F\u540E handle.refresh() \u91CD\u7ED8\uFF08items \u662F\u51FD\u6570\uFF0C\u5F00/\u5237\u65B0\u65F6\u73B0\u7B97\uFF09\u3002\nimport { positionPopup } from \"./anchored-popup.js\";\nimport { iconHtml } from \"./icon.js\";\n// ---- \u6808\uFF08\u672B\u4F4D\u6700\u4E0A\uFF09----\nconst _open = [];\n/** \u6700\u4E0A\u5C42\u7684 popup\uFF08\u6CA1\u6709 = null\uFF09\u3002 */\nexport function currentPopupMenu() { return _open[_open.length - 1] ?? null; }\n/** \u5168\u5173\uFF08\u4E0B\u7B14 / \u5207\u9875\u7B49\u5916\u90E8\u65F6\u673A\u7528\uFF09\u3002 */\nexport function closePopupMenu() { for (const h of [..._open])\n    h.close(); }\nexport const closeAllPopupMenus = closePopupMenu;\n/** \u5173\u67D0\u4E2A\u8282\u70B9\u7684 popup\uFF08\u4E0D\u5728\u6808\u91CC \u2192 \u53EA\u786E\u4FDD\u5B83 hidden\uFF1B\u8001\u8C03\u7528\u65B9\u300Cmenu.classList.add(\"hidden\")\u300D\u7684\u66FF\u8EAB\uFF09\u3002 */\nexport function closePopupMenuOf(el) {\n    if (!el)\n        return;\n    const h = _open.find((x) => x.el === el);\n    if (h)\n        h.close();\n    else\n        el.classList.add(\"hidden\");\n}\nexport function isPopupOpen(el) { return !!el && _open.some((x) => x.el === el); }\n/** \u951A\u6309\u94AE toggle \u8BED\u4E49\uFF1A\u540C\u4E00\u951A\u5DF2\u5F00 \u2192 \u5173\u5E76\u8FD4\u56DE null\uFF1B\u5426\u5219\u5F00\u3002 */\nexport function togglePopupMenu(opts) {\n    const cur = _open.find((x) => x.anchor === opts.anchor);\n    if (cur) {\n        cur.close();\n        return null;\n    }\n    return openPopupMenu(opts);\n}\nexport function toggleAdoptedPopup(el, opts) {\n    const cur = _open.find((x) => x.el === el);\n    if (cur) {\n        cur.close();\n        return null;\n    }\n    return openAdoptedPopup(el, opts);\n}\nexport function openPopupMenu(opts) {\n    const variant = opts.variant ?? \"list\";\n    const band = opts.band ?? \"menu\";\n    const el = document.createElement(\"div\");\n    el.className = (variant === \"compact\" ? \"lasso-icon-menu lasso-icon-list \" : \"menu-panel \")\n        + `popup-menu popup-menu--${variant}` + (band === \"css\" ? \"\" : ` band-${band}`);\n    el.setAttribute(\"role\", \"menu\");\n    const render = () => {\n        const items = opts.items().filter((it) => !it.hidden);\n        // 2026-09-09\uFF1Acompact \u53D8\u4F53\u4E5F\u753B icon\uFF08\u539F\u53EA list \u753B\u2014\u2014select-field / \u4E0A\u4E0B\u6587\u6761\u300C\u2026\u300D\u4F20\u7684\u56FE\u6807\u4E00\u76F4\u88AB\u9759\u9ED8\u4E22\u6389\uFF1B\n        //   .lasso-icon-list \u7684\u76AE\u672C\u5C31\u662F\u300C\u7AD6\u6392 \u56FE\u6807+\u7B80\u77ED\u89E3\u8BF4\u300Dv0.5.17\uFF09\u3002\u6709\u4EFB\u4E00\u9879\u5E26\u56FE\u6807 \u2192 \u65E0\u56FE\u6807\u9879\u5360 18px \u7A7A\u4F4D\u5BF9\u9F50\u3002\n        const anyIcon = items.some((it) => !!it.icon);\n        let html = \"\";\n        for (const it of items) {\n            if (it.separatorBefore)\n                html += `<hr class=\"popup-menu-sep\">`;\n            if (it.header) {\n                html += `<div class=\"popup-menu-group\">${escapeHtml(it.label)}</div>`;\n                continue;\n            }\n            const cls = variant === \"compact\"\n                ? \"lasso-tool-btn popup-menu-item\"\n                : \"menu-item popup-menu-item\" + (anyIcon ? \" menu-item-with-icon\" : \"\") + (it.danger ? \" danger\" : \"\");\n            const role = it.checked != null ? \"menuitemradio\" : \"menuitem\";\n            const checkAttr = it.checked != null\n                ? (variant === \"compact\" ? ` aria-pressed=\"${it.checked}\"` : ` aria-checked=\"${it.checked}\"`)\n                : \"\";\n            const icon = anyIcon\n                ? (it.icon ? iconHtml(it.icon) : `<span class=\"menu-item-icon-blank\"></span>`)\n                : \"\";\n            html += `<button type=\"button\" class=\"${cls}\" role=\"${role}\" data-id=\"${escapeHtml(it.id)}\"${checkAttr}${it.disabled ? \" disabled\" : \"\"}>`\n                + icon + `<span class=\"menu-item-label\">${escapeHtml(it.label)}</span></button>`;\n        }\n        el.innerHTML = html;\n    };\n    render();\n    document.body.appendChild(el);\n    const handle = _mount(el, opts, {\n        reposition: true,\n        onRefresh: render,\n        onClosed: () => el.remove(),\n    });\n    el.addEventListener(\"click\", (e) => {\n        const b = e.target.closest(\"[data-id]\");\n        if (!b || b.disabled)\n            return;\n        e.stopPropagation();\n        const id = b.dataset.id;\n        const item = opts.items().find((it) => it.id === id);\n        if (!item)\n            return;\n        const r = opts.onPick(id, item);\n        if (r === \"keep\") {\n            if (handle.isOpen)\n                handle.refresh();\n            return;\n        }\n        handle.close();\n    });\n    return handle;\n}\n/** \u6536\u517B\u9759\u6001\u8282\u70B9\uFF1A\u663E\u793A + \u951A\u5B9A + \u6808 + \u5916\u70B9\u5173/Escape\uFF1B\u5173 = \u52A0 hidden\uFF08\u8282\u70B9\u7559\u5728 DOM\uFF0C\u5185\u5BB9\u4ECD\u662F index.html \u7684\uFF09\u3002 */\nexport function openAdoptedPopup(el, opts) {\n    const cur = _open.find((x) => x.el === el);\n    if (cur) {\n        cur.refresh();\n        return cur;\n    }\n    if (opts.mountToBody && el.parentElement !== document.body)\n        document.body.appendChild(el);\n    const band = opts.band ?? \"css\";\n    if (band !== \"css\")\n        el.classList.add(\"popup-menu\", `band-${band}`);\n    el.classList.remove(\"hidden\");\n    return _mount(el, opts, {\n        reposition: (opts.position ?? \"anchor\") === \"anchor\",\n        onClosed: () => { el.classList.add(\"hidden\"); },\n    });\n}\nfunction _mount(el, opts, hooks) {\n    // \u6808\u7EAA\u5F8B\uFF1A\u5173\u6389\u6240\u6709\u300C\u4E0D\u5305\u542B\u65B0\u951A\u300D\u7684\u65E7\u83DC\u5355\uFF08\u7236\u83DC\u5355\u7559\u7740\uFF1B\u540C\u7EA7\u6362\u83DC\u5355\uFF09\u3002\n    for (const h of [..._open])\n        if (!h.el.contains(opts.anchor) && h.el !== el)\n            h.close();\n    if (opts.ariaLabel)\n        el.setAttribute(\"aria-label\", opts.ariaLabel);\n    let open = true;\n    const position = () => {\n        if (!hooks.reposition)\n            return;\n        positionPopup(el, {\n            anchor: opts.anchor, align: opts.align ?? \"right\", offsetY: opts.offsetY ?? 4,\n            belowToolbars: opts.belowToolbars, edgeMargin: opts.edgeMargin, clampViewport: true,\n        });\n    };\n    const onDocPointerDown = (e) => {\n        const path = e.composedPath();\n        if (path.includes(el) || path.includes(opts.anchor))\n            return;\n        // \u843D\u5728**\u5B50\u5F39\u5C42**\uFF08\u951A\u5728\u672C\u5F39\u5C42\u91CC\u7684 popup\uFF0C\u5982\u5F39\u5C42\u5185 select-field \u7684\u4E0B\u62C9\uFF09\u4E0A\u7684\u90A3\u4E00\u51FB\u4E0D\u7B97\u5916\u9762\u2014\u2014\u7236\u7559\u7740\n        //   \uFF08WeebPaint 2026-09-11\uFF1A\u56FE\u5C42\u8C03\u6574\u5F39\u5C42\u91CC\u9009\u6DF7\u5408\u6A21\u5F0F\u4E0D\u8BB8\u628A\u5F39\u5C42\u5173\u6389\uFF1B0.1.3 \u81EA WeebPaint src/ui/popup-menu.ts \u539F\u6837\u642C\u8FDB\u6765\uFF0C\u9053 2 2026-10-21 \u4EA4\u63A5\uFF09\n        if (_open.some((h) => h !== handle && el.contains(h.anchor) && path.includes(h.el)))\n            return;\n        handle.close();\n        if (opts.swallowOutsideTap) {\n            e.stopPropagation();\n            e.preventDefault();\n        }\n    };\n    const onKey = (e) => {\n        if (currentPopupMenu() !== handle)\n            return; // \u53EA\u6709\u6700\u4E0A\u5C42\u54CD\u5E94\u952E\u76D8\n        if (e.key === \"Escape\") {\n            e.preventDefault();\n            handle.close();\n            return;\n        }\n        if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n            const btns = [...el.querySelectorAll(\"button:not([disabled])\")];\n            if (!btns.length)\n                return;\n            const i = btns.indexOf(document.activeElement);\n            const next = e.key === \"ArrowDown\" ? (i + 1) % btns.length : (i - 1 + btns.length) % btns.length;\n            btns[next].focus();\n            e.preventDefault();\n        }\n    };\n    const onResize = () => { if (open)\n        position(); };\n    let anchorAt = anchorPos();\n    function anchorPos() { const r = opts.anchor.getBoundingClientRect(); return { x: r.left, y: r.top }; }\n    const onScroll = (e) => {\n        if (!open)\n            return;\n        const t = e.target;\n        if (t && el.contains(t))\n            return;\n        const now = anchorPos();\n        if (Math.abs(now.x - anchorAt.x) < 0.5 && Math.abs(now.y - anchorAt.y) < 0.5)\n            return;\n        handle.close();\n    };\n    const handle = {\n        get isOpen() { return open; },\n        el, anchor: opts.anchor,\n        refresh() { if (!open)\n            return; hooks.onRefresh?.(); position(); anchorAt = anchorPos(); },\n        close() {\n            if (!open)\n                return;\n            open = false;\n            document.removeEventListener(\"pointerdown\", onDocPointerDown, true);\n            document.removeEventListener(\"keydown\", onKey, true);\n            document.removeEventListener(\"scroll\", onScroll, true);\n            window.removeEventListener(\"resize\", onResize);\n            const i = _open.indexOf(handle);\n            if (i >= 0)\n                _open.splice(i, 1);\n            hooks.onClosed();\n            opts.onClose?.();\n        },\n    };\n    position();\n    // \u76D1\u542C\u5EF6\u540E\u5230\u672C\u8F6E\u4E8B\u4EF6\u4E4B\u540E\u6302\uFF1A\u6253\u5F00\u83DC\u5355\u7684\u90A3\u4E00\u51FB\uFF08pointerdown\u2192click\uFF09\u4E0D\u80FD\u53CD\u8FC7\u6765\u628A\u5B83\u5173\u6389\u3002\n    setTimeout(() => {\n        if (!open)\n            return;\n        document.addEventListener(\"pointerdown\", onDocPointerDown, true);\n        document.addEventListener(\"keydown\", onKey, true);\n        document.addEventListener(\"scroll\", onScroll, true);\n        window.addEventListener(\"resize\", onResize);\n    }, 0);\n    _open.push(handle);\n    return handle;\n}\nfunction escapeHtml(s) {\n    return s.replace(/[&<>\"']/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" }[c]));\n}\n", "// Notice \u2014\u2014 \u53CD\u9988\u9762\u6DF1\u6A21\u5757\uFF1Atoast / \u9519\u8BEF\u6A2A\u5E45 / \u6062\u590D\u6A2A\u5E45 / \u79BB\u7EBF\u6A2A\u5E45\u53EA\u6709**\u4E00\u6761\u6808\u3001\u4E00\u4E2A\u6837\u5F0F\u3001\u4E00\u4E2A z band\u3001\u4E00\u6761\u8BA9\u4F4D\u89C4\u5219**\u3002\n// created 2026-09-02 by Claude Fable 5.1\uFF08UI \u7EAA\u5143 C7\uFF1Buser 2026-09-02\u300Ctoast \u597D\u50CF\u4E5F\u6709\u4E24\u4E2A\u4E0D\u540C\u914D\u8272\u7684\u7248\u672C\u4E86\u300D\n//   \u300Ctoast, busy overlay, \u7EA2\u7EBF\u533A\u95EE\u9898\u5BF9\u8BDD\u6846\uFF0C\u8FD9\u4E9B\u7684 z order \u5F88\u5BB9\u6613\u51FA\u7EA2\u7EBF\u4E8B\u6545\uFF0C\u8003\u53E4\u597D\u597D\u53CD\u7701\u4E00\u4E0B\u300D\uFF09\u3002\n//\n// \u53CD\u7701\uFF08\u8003\u53E4\uFF0C\u51FA\u5904\u89C1 ai-docs/reports/20260902-ui-epoch-recurring-mistakes.html\u300C\u53CD\u9988\u9762 z-order \u7EA2\u7EBF\u53CD\u7701\u300D\uFF09\uFF1A\n//   \u00B7 07-22 v0.4.11 \u771F\u673A 0.2\uFF1Agate(520) < busy(540) \u2192 \u51B2\u7A81/\u300C\u4E91\u7AEF\u6709\u65B0\u7248\u672C\u300D\u51B3\u7B56\u9762\u88AB busy \u906E\u7F69\u76D6\u6B7B\u2014\u2014**\u7EA2\u7EBF**\n//     \uFF08\u51B2\u7A81\u5FC5 surface\uFF09\uFF1B\u4FEE\u6CD5 = \u7FFB band\uFF08gate 540 > busy 520\uFF09\u3002\n//   \u00B7 08-19\uFF1Abusy \u671F\u7C98\u8D34\u5F39\u51FA\u5927\u56FE\u786E\u8BA4 sheet(500) \u88AB busy(520) \u76D6\u4F4F \u2192 await \u6C38\u4E0D resolve \u2192 \u6B7B\u9501\uFF1B\u4FEE\u6CD5 = sheets.ts \u54CD\u4EAE throw\u3002\n//   \u00B7 08-21\uFF1Abusy \u906E\u7F69\u6321\u4E0D\u4F4F window keydown / \u539F\u751F paste\uFF08QA\uFF09\u2192 \u9010\u5904 isBusyActive \u5B88\u536B\u3002\n//   \u00B7 v0.9.4\uFF1A\u9519\u8BEF\u6A2A\u5E45\u9876\u90E8\u901A\u680F\u538B iPad \u65E0\u6846\u9876\u680F \u2192 \u632A\u5E95\u90E8\u6D6E\u5361\uFF08inline cssText z 9999\uFF09\uFF1B08-29 \u79BB\u7EBF\u6A2A\u5E45\u53C8\u9489\u56DE top:0\n//     \u8E29\u56DE\u540C\u4E00\u8BFE\uFF08gallery-manage-ui \u81EA\u9648\uFF09\u2192 08-30 \u8FC1 .toast\uFF1B09-02 \u538B\u611F toast \u7B2C\u4E09\u4EFD .toast + \u4E24\u4EFD inline \u6A2A\u5E45\u5E76\u5B58\u3002\n//   \u00B7 \u672A\u7206\u96F7\uFF1A\u9519\u8BEF\u6A2A\u5E45 z 9999 \u9AD8\u4E8E gate(540)\uFF0C\u4E14\u4E0E sheet \u540C\u4E3A\u5E95\u90E8\u951A\u5B9A\u2014\u2014\u4E00\u6761\u540C\u6B65\u9519\u8BEF\u6A2A\u5E45\u6B63\u597D\u5728\u51B2\u7A81 gate \u5F39\u51FA\u65F6\n//     \u51FA\u73B0\uFF0C\u5C31\u76D6\u4F4F keep/pull/branch \u6309\u94AE\u3002\n//   \u6839\u56E0\u4E00\u53E5\u8BDD\uFF1A\u53CD\u9988\u9762\u662F**\u89D2\u8272**\uFF08\u9501 / \u51B3\u7B56 / \u901A\u77E5\uFF09\uFF0C\u4EE3\u7801\u91CC\u5374\u662F**\u9010\u5143\u7D20\u624B\u586B\u7684 z \u6570\u5B57 + \u5404\u81EA inline \u6837\u5F0F +\n//   \u4E24\u6761\u4E92\u4E0D\u77E5\u60C5\u7684\u5E95\u90E8\u6808**\u3002\n//\n// \u89C4\u5219\uFF08\u672C\u6A21\u5757\u7ED3\u6784\u6027\u4FDD\u8BC1\uFF09\uFF1A\n//   \u2460 \u6240\u6709\u901A\u77E5\u7C7B\u53CD\u9988\u9762\uFF08toast/\u6A2A\u5E45\uFF09\u8FDB\u540C\u4E00\u4E2A #noticeStack\uFF0Cz = --z-notice\uFF08\u5728 busy \u4E4B\u4E0A\uFF1A\u5FD9\u7684\u65F6\u5019\u9519\u8BEF\u4E5F\u8981\u770B\u5F97\u89C1\uFF1B\n//      \u5728 popout/dev/error(bootstrap) \u4E4B\u4E0B\uFF09\u3002z \u6570\u5B57\u53EA\u5728 styles.css band \u8868\uFF0C\u8FD9\u91CC\u96F6 inline z\u3002\n//   \u2461 **\u8BA9\u4F4D**\uFF1A\u4EFB\u4F55\u6A21\u6001/gate \u5F00\u7740\uFF08.backdrop / .sync-gate-backdrop \u975E hidden\uFF09\u2192 \u6574\u6761\u6808\u505C\u9760\u9876\u90E8\uFF08\u9876\u680F\u4E4B\u4E0B\uFF09\uFF0C\n//      \u6C38\u8FDC\u4E0D\u76D6\u51B3\u7B56 sheet \u7684\u5E95\u90E8\u6309\u94AE\u884C\u3002sheet \u6A21\u5757\u5F00\u5408\u65F6\u8C03 relayoutNotices()\u3002\n//   \u2462 \u540C id \u66F4\u65B0\u539F\u5730\uFF1B\u591A\u6761\u7EB5\u5411\u5806\u53E0\uFF1B\u6837\u5F0F = .toast \u6807\u51C6\u4EF6 + level \u8272\uFF08neutral/info=ink\u3001warning=\u7425\u73C0\u3001error=\u7EA2\uFF09\u3002\n//   \u2463 \u4E0D\u7BA1 busy \u672C\u8EAB\u4E0E sheet\uFF08\u90A3\u662F C3 Sheet \u7CFB\u7EDF\u7684\u4E8B\uFF09\uFF1B\u4E5F\u4E0D\u7BA1 bundle \u52A0\u8F7D\u524D\u7684 index.html \u5185\u8054 #__errBar \u65E9\u671F\u515C\u5E95\u3002\nimport { iconHtml } from \"./icon.js\";\nimport { floors } from \"./host-floors.js\"; // \u5305\u5316\uFF08A5\uFF09\uFF1A\u505C\u9760\u9876\u90E8\u7684\u5730\u677F\u7531\u5BBF\u4E3B\u6CE8\u5165\nlet _stack = null;\nconst _live = new Map();\nlet _seq = 0;\nfunction _ensureStack() {\n    if (_stack && _stack.isConnected)\n        return _stack;\n    const s = document.createElement(\"div\");\n    s.id = \"noticeStack\";\n    s.className = \"notice-stack\";\n    (document.body || document.documentElement).appendChild(s);\n    _stack = s;\n    _relayout();\n    // \u8BA9\u4F4D\u89C4\u5219\u7ED3\u6784\u5316\uFF1A\u4E0D\u9760 sheet \u6A21\u5757\u8BB0\u5F97\u8C03 relayoutNotices()\u2014\u2014\u76F4\u63A5\u89C2\u5BDF backdrop \u7684 class \u7FFB\u8F6C\uFF08\u6A21\u6001/gate \u5F00\u5408\uFF09\u3002\n    //   class \u53D8\u52A8\u5F88\u9891\u7E41\u4F46\u56DE\u8C03\u53EA\u505A\u4E00\u6B21 matches \u5224\u65AD\uFF0C\u4FBF\u5B9C\uFF1BC3 \u6536\u6210\u5355 backdrop \u540E\u540C\u6837\u6210\u7ACB\u3002\n    if (!_observer && typeof MutationObserver !== \"undefined\") {\n        _observer = new MutationObserver((muts) => {\n            for (const m of muts) {\n                const t = m.target;\n                if (t.matches?.(\".backdrop\")) {\n                    _relayout();\n                    return;\n                }\n            }\n        });\n        _observer.observe(document.body, { attributes: true, attributeFilter: [\"data-open\"], subtree: true });\n    }\n    return s;\n}\nlet _observer = null;\n/** \u6709\u6A21\u6001/gate \u5F00\u7740 \u2192 \u9876\u90E8\u505C\u9760\uFF08\u4E0D\u76D6 sheet \u7684\u6309\u94AE\u884C\uFF09\uFF1B\u5426\u5219\u5E95\u90E8\u3002 */\nfunction _modalOpen() {\n    return !!document.querySelector(\".backdrop[data-open]\");\n}\nfunction _relayout() {\n    const s = _stack;\n    if (!s)\n        return;\n    const top = _modalOpen();\n    s.classList.toggle(\"docked-top\", top);\n    s.style.top = top ? Math.round(floors.floatingTop() + 8) + \"px\" : \"\";\n}\n/** \u6A21\u6001/gate \u5F00\u5408\u540E\u8C03\uFF08C3 sheet \u6A21\u5757\u7684\u5F00\u5408\u8DEF\u5F84\uFF09\uFF1B\u4E5F\u53EF\u5728\u4EFB\u4F55\u5E03\u5C40\u53D8\u5316\u540E\u8C03\u3002 */\nexport function relayoutNotices() { _relayout(); }\nexport function showNotice(opts) {\n    const id = opts.id ?? `notice-${++_seq}`;\n    const prev = _live.get(id);\n    if (prev)\n        prev.close();\n    const stack = _ensureStack();\n    const el = document.createElement(\"div\");\n    const level = opts.level ?? \"neutral\";\n    el.className = `toast notice notice-${level}`;\n    el.setAttribute(\"role\", level === \"error\" ? \"alert\" : \"status\");\n    el.setAttribute(\"aria-live\", opts.ariaLive ?? (level === \"error\" ? \"assertive\" : \"polite\"));\n    el.dataset.noticeId = id;\n    const txt = document.createElement(\"span\");\n    txt.className = \"notice-text\";\n    txt.textContent = opts.text;\n    el.appendChild(txt);\n    let open = true;\n    let timer = null;\n    const close = () => {\n        if (!open)\n            return;\n        open = false;\n        if (timer)\n            clearTimeout(timer);\n        el.remove();\n        if (_live.get(id)?.el === el)\n            _live.delete(id);\n    };\n    const dismiss = () => { close(); opts.onDismiss?.(); };\n    for (const a of opts.actions ?? []) {\n        const b = document.createElement(\"button\");\n        b.type = \"button\";\n        b.className = \"notice-action\" + (a.primary ? \" primary\" : \"\");\n        b.textContent = a.label;\n        b.addEventListener(\"click\", (e) => { e.stopPropagation(); close(); a.onClick(); });\n        el.appendChild(b);\n    }\n    if (opts.dismissible !== false) {\n        const x = document.createElement(\"button\");\n        x.type = \"button\";\n        x.className = \"dismiss\";\n        if (opts.dismissLabel)\n            x.setAttribute(\"aria-label\", opts.dismissLabel);\n        x.innerHTML = iconHtml(\"x\");\n        x.addEventListener(\"click\", (e) => { e.stopPropagation(); dismiss(); });\n        el.appendChild(x);\n    }\n    if (opts.tapToDismiss !== false)\n        el.addEventListener(\"click\", () => dismiss());\n    if (opts.autoHideMs && opts.autoHideMs > 0)\n        timer = setTimeout(close, opts.autoHideMs);\n    stack.appendChild(el);\n    _relayout();\n    const handle = {\n        el, id,\n        setText(t) { txt.textContent = t; },\n        close,\n        isOpen: () => open,\n    };\n    _live.set(id, handle);\n    return handle;\n}\nexport function closeNotice(id) { _live.get(id)?.close(); }\nexport function noticeCount() { return _live.size; }\nexport function isNoticeOpen(id) { return _live.get(id)?.isOpen() ?? false; }\n", "export const GALLERY_TEXT = {\n    \"bk.andMore\": { zh: \"\u2026\u2026\u7B49 {n} \u4EF6\uFF08\u5168\u91CF\u540D\u5355\u5728\u5305\u5185 backup-manifest.txt\uFF09\", en: \"\u2026and {n} more (full list in backup-manifest.txt inside the zip)\", ja: \"\u2026\u307B\u304B {n} \u4EF6\uFF08\u5168\u30EA\u30B9\u30C8\u306F zip \u5185\u306E backup-manifest.txt\uFF09\" },\n    \"bk.done\": { zh: \"\u5DF2\u4E0B\u8F7D\u5907\u4EFD {name}\uFF08{n} \u4EF6\uFF09\", en: \"Backup downloaded: {name} ({n} files)\", ja: \"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F\uFF1A{name}\uFF08{n} \u4EF6\uFF09\" },\n    \"bk.empty\": { zh: \"\u56FE\u5E93\u91CC\u6CA1\u6709\u53EF\u5907\u4EFD\u7684\u6587\u4EF6\", en: \"Nothing in this gallery to back up\", ja: \"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3067\u304D\u308B\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093\" },\n    \"bk.failed\": { zh: \"\u5907\u4EFD\u5931\u8D25\uFF1A{err}\", en: \"Backup failed: {err}\", ja: \"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A{err}\" },\n    \"bk.failedDetail\": { zh: \"\u53D6\u4E0D\u5230\u3001\u4E0D\u5728\u672C\u6B21\u5907\u4EFD\u91CC\u7684 {n} \u4EF6\uFF08\u79BB\u7EBF\u7684\u7EAF\u4E91\u7AEF\u4EF6/\u9501\u5B9A\u7684\u52A0\u5BC6\u4EF6\u7B49\uFF09\uFF1A\", en: \"{n} file(s) could NOT be read and are NOT in this backup (cloud-only while offline, locked encrypted, \u2026):\", ja: \"\u53D6\u5F97\u3067\u304D\u305A\u4ECA\u56DE\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306B\u542B\u307E\u308C\u306A\u3044 {n} \u4EF6\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\u306E\u30AF\u30E9\u30A6\u30C9\u5C02\u7528\u30FB\u30ED\u30C3\u30AF\u4E2D\u306E\u6697\u53F7\u5316\u306A\u3069\uFF09\uFF1A\" },\n    \"bk.failedN\": { zh: \"{n} \u4EF6\u672A\u80FD\u53D6\u5230\uFF08\u7EAF\u4E91\u7AEF\u4E14\u79BB\u7EBF\uFF1F\u7A0D\u540E\u91CD\u8BD5\uFF09\", en: \"{n} files could not be read (cloud-only while offline? try again later)\", ja: \"{n} \u4EF6\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u30AF\u30E9\u30A6\u30C9\u306E\u307F\u30FB\u30AA\u30D5\u30E9\u30A4\u30F3\uFF1F\u5F8C\u3067\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\uFF09\" },\n    \"bk.msg\": { zh: \"\u628A\u8FD9\u4E2A\u56FE\u5E93\u91CC\u7684\u5168\u90E8\u6587\u4EF6\u6253\u5305\u6210\u4E00\u4E2A zip \u4E0B\u8F7D\u5230\u672C\u673A\u3002\u53EA\u8BFB\u53D6\uFF0C\u4E0D\u6539\u52A8\u56FE\u5E93\u3002\u52A0\u5BC6\u4F5C\u54C1\u4FDD\u6301\u5BC6\u6587\u539F\u6837\uFF08\u5907\u4EFD\u91CC\u6CA1\u6709\u660E\u6587\uFF09\u3002\u8D85\u8FC7 {size} \u7684\u90E8\u5206\u6539\u4E3A\u9010\u4EF6\u4E0B\u8F7D\u3002\", en: \"Packs every file in this gallery into one zip and downloads it. Read-only \u2014 the gallery is not modified. Encrypted artworks stay as ciphertext (no plaintext in the backup). Anything beyond {size} is downloaded file by file instead.\", ja: \"\u3053\u306E\u30AE\u30E3\u30E9\u30EA\u30FC\u306E\u5168\u30D5\u30A1\u30A4\u30EB\u3092 1 \u3064\u306E zip \u306B\u307E\u3068\u3081\u3066\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002\u8AAD\u307F\u53D6\u308A\u306E\u307F\u3067\u3001\u30AE\u30E3\u30E9\u30EA\u30FC\u306F\u5909\u66F4\u3057\u307E\u305B\u3093\u3002\u6697\u53F7\u5316\u3055\u308C\u305F\u4F5C\u54C1\u306F\u6697\u53F7\u6587\u306E\u307E\u307E\uFF08\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306B\u5E73\u6587\u306F\u5165\u308A\u307E\u305B\u3093\uFF09\u3002{size} \u3092\u8D85\u3048\u305F\u5206\u306F 1 \u30D5\u30A1\u30A4\u30EB\u305A\u3064\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3059\u3002\" },\n    \"bk.packing\": { zh: \"\u6B63\u5728\u5907\u4EFD\u2026\uFF08{done} / {total}\uFF09\", en: \"Backing up\u2026 ({done} / {total})\", ja: \"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u4E2D\u2026\uFF08{done} / {total}\uFF09\" },\n    \"bk.partialN\": { zh: \"{n} \u4E2A\u6587\u4EF6\u5939\u672A\u80FD\u5B8C\u6574\u5217\u4E3E\uFF0C\u5907\u4EFD\u53EF\u80FD\u4E0D\u5168\", en: \"{n} folders could not be listed in full \u2014 the backup may be incomplete\", ja: \"{n} \u500B\u306E\u30D5\u30A9\u30EB\u30C0\u30FC\u3092\u5B8C\u5168\u306B\u4E00\u89A7\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u304C\u4E0D\u5B8C\u5168\u306A\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\" },\n    \"bk.scanning\": { zh: \"\u6B63\u5728\u6E05\u70B9\u56FE\u5E93\u2026\", en: \"Scanning the gallery\u2026\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u3092\u78BA\u8A8D\u4E2D\u2026\" },\n    \"bk.scanningFolders\": { zh: \"\u6B63\u5728\u6E05\u70B9\u56FE\u5E93\u2026\uFF08\u5DF2\u626B {n} \u4E2A\u6587\u4EF6\u5939\uFF09\", en: \"Scanning the gallery\u2026 ({n} folders)\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u3092\u78BA\u8A8D\u4E2D\u2026\uFF08{n} \u30D5\u30A9\u30EB\u30C0\u30FC\uFF09\" },\n    \"bk.spilled\": { zh: \"\u5E93\u592A\u5927\uFF0C\u53E6\u6709 {n} \u4EF6\u6539\u4E3A\u9010\u4EF6\u4E0B\u8F7D\", en: \"Library too large \u2014 {n} more files downloaded individually\", ja: \"\u30E9\u30A4\u30D6\u30E9\u30EA\u304C\u5927\u304D\u3044\u305F\u3081\u3001\u4ED6\u306E {n} \u4EF6\u306F\u500B\u5225\u306B\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F\" },\n    \"bk.spilledDetail\": { zh: \"\u8D85\u51FA zip \u9884\u7B97\u3001\u5DF2\u6539\u4E3A\u9010\u4EF6\u4E0B\u8F7D\u7684 {n} \u4EF6\uFF08\u4E00\u4EF6\u4E0D\u4E22\uFF0C\u6CE8\u610F\u6D4F\u89C8\u5668\u591A\u6587\u4EF6\u4E0B\u8F7D\u786E\u8BA4\uFF09\uFF1A\", en: \"{n} file(s) over the zip budget were delivered as individual downloads (nothing dropped \u2014 watch for the browser multi-download prompt):\", ja: \"zip \u4E88\u7B97\u8D85\u904E\u306E\u305F\u3081\u500B\u5225\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306B\u306A\u3063\u305F {n} \u4EF6\uFF08\u6B20\u843D\u306A\u3057\u3002\u30D6\u30E9\u30A6\u30B6\u306E\u8907\u6570\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u78BA\u8A8D\u306B\u6CE8\u610F\uFF09\uFF1A\" },\n    \"bk.title\": { zh: \"\u4E0B\u8F7D\u5168\u5E93\u5907\u4EFD\", en: \"Download full backup\", ja: \"\u30E9\u30A4\u30D6\u30E9\u30EA\u5168\u4F53\u3092\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\" },\n    \"bk.truncated\": { zh: \"\u6587\u4EF6\u5939\u592A\u591A\uFF0C\u53EA\u626B\u5230\u524D {n} \u4E2A\uFF0C\u5907\u4EFD\u4E0D\u5168\", en: \"Too many folders \u2014 only the first {n} were scanned; the backup is incomplete\", ja: \"\u30D5\u30A9\u30EB\u30C0\u30FC\u304C\u591A\u3059\u304E\u307E\u3059\u3002\u6700\u521D\u306E {n} \u500B\u306E\u307F\u3092\u8D70\u67FB\u3057\u307E\u3057\u305F\u3002\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306F\u4E0D\u5B8C\u5168\u3067\u3059\" },\n    \"cf.act.cloudWins\": { zh: \"\u4E91\u7AEF\u8986\u76D6\u672C\u5730\", en: \"Cloud overwrites local\", ja: \"\u30AF\u30E9\u30A6\u30C9\u3067\u30ED\u30FC\u30AB\u30EB\u3092\u4E0A\u66F8\u304D\" },\n    \"cf.act.localWins\": { zh: \"\u672C\u5730\u8986\u76D6\u4E91\u7AEF\", en: \"Local overwrites cloud\", ja: \"\u30ED\u30FC\u30AB\u30EB\u3067\u30AF\u30E9\u30A6\u30C9\u3092\u4E0A\u66F8\u304D\" },\n    \"cf.act.openLocal\": { zh: \"\u6253\u5F00\u672C\u5730\", en: \"Open local\", ja: \"\u30ED\u30FC\u30AB\u30EB\u3092\u958B\u304F\" },\n    \"cf.body.open\": { zh: \"\u300C{name}\u300D\u672C\u673A\u8FD8\u6709\u672A\u4E0A\u4F20\u7684\u6539\u52A8\u3002\", en: \"\u201C{name}\u201D has changes on this device that were not uploaded yet.\", ja: \"\u300C{name}\u300D\u306B\u306F\u307E\u3060\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3057\u3066\u3044\u306A\u3044\u5909\u66F4\u304C\u3053\u306E\u7AEF\u672B\u306B\u3042\u308A\u307E\u3059\u3002\" },\n    \"cf.body.push\": { zh: \"\u300C{name}\u300D\u5728\u4E91\u7AEF\u548C\u672C\u673A\u5404\u6709\u4E00\u7248\u65B0\u6539\u52A8\u3002\", en: \"\u201C{name}\u201D has new changes both in the cloud and on this device.\", ja: \"\u300C{name}\u300D\u306F\u30AF\u30E9\u30A6\u30C9\u3068\u3053\u306E\u7AEF\u672B\u306E\u4E21\u65B9\u306B\u65B0\u3057\u3044\u5909\u66F4\u304C\u3042\u308A\u307E\u3059\u3002\" },\n    \"cf.checkingCloud\": { zh: \"\u68C0\u67E5\u4E91\u7AEF\", en: \"Checking cloud\", ja: \"\u30AF\u30E9\u30A6\u30C9\u3092\u78BA\u8A8D\u4E2D\" },\n    \"cf.cloudAccountInfo\": { zh: \"\u4E91\u7AEF\uFF1A{who}\", en: \"Cloud: {who}\", ja: \"\u30AF\u30E9\u30A6\u30C9\uFF1A{who}\" },\n    \"cf.cloudAccountOfflineInfo\": { zh: \"\u4E91\u7AEF\uFF1A{who}\uFF08\u79BB\u7EBF\uFF09\", en: \"Cloud: {who} (offline)\", ja: \"\u30AF\u30E9\u30A6\u30C9\uFF1A{who}\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\uFF09\" },\n    \"cf.cloudAccountOfflineTitle\": { zh: \"\u4E91\u7AEF\uFF1A{who}\uFF08\u79BB\u7EBF\uFF0C\u65E0\u6CD5\u63A8 / \u62C9\uFF09\", en: \"Cloud: {who} (offline, cannot push / pull)\", ja: \"\u30AF\u30E9\u30A6\u30C9\uFF1A{who}\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\u3001push / pull \u4E0D\u53EF\uFF09\" },\n    \"cf.cloudAccountTitle\": { zh: \"\u4E91\u7AEF\uFF1A{who}\uFF08\u70B9\u5F00\u8D26\u53F7\u83DC\u5355\uFF09\", en: \"Cloud: {who} (tap to open account menu)\", ja: \"\u30AF\u30E9\u30A6\u30C9\uFF1A{who}\uFF08\u30A2\u30AB\u30A6\u30F3\u30C8\u30E1\u30CB\u30E5\u30FC\u3092\u958B\u304F\uFF09\" },\n    \"cf.cloudGoneTitle\": { zh: \"\u4E91\u7AEF\u6CA1\u6709\u8FD9\u4EFD\", en: \"Not in the cloud\", ja: \"\u30AF\u30E9\u30A6\u30C9\u306B\u3042\u308A\u307E\u305B\u3093\" },\n    \"cf.body.absent\": { zh: \"\u300C{name}\u300D\u5728\u4E91\u7AEF\u5DF2\u7ECF\u4E0D\u5728\u4E86\uFF08\u522B\u7684\u8BBE\u5907\u5220\u4E86\uFF0C\u6216\u79FB\u8FDB\u4E86\u56DE\u6536\u7AD9\uFF09\uFF0C\u672C\u673A\u8FD8\u6709\u4E00\u4EFD\u6CA1\u4E0A\u4F20\u7684\u3002\u4E91\u7AEF\u8986\u76D6\u672C\u5730 = \u8DDF\u7740\u4E91\u7AEF\uFF0C\u672C\u673A\u8FD9\u4EFD\u79FB\u5230\u56DE\u6536\u7AD9\uFF1B\u672C\u5730\u8986\u76D6\u4E91\u7AEF = \u628A\u672C\u673A\u7684\u4F20\u56DE\u53BB\u3002\", en: \"\u201C{name}\u201D is no longer in the cloud (deleted or trashed on another device); this device still has an un-uploaded copy. Cloud overwrites local = follow the cloud, this copy goes to the trash; Local overwrites cloud = upload it back.\", ja: \"\u300C{name}\u300D\u306F\u30AF\u30E9\u30A6\u30C9\u304B\u3089\u6D88\u3048\u3066\u3044\u307E\u3059\uFF08\u5225\u306E\u7AEF\u672B\u3067\u524A\u9664\u307E\u305F\u306F\u3054\u307F\u7BB1\u3078\uFF09\u3002\u3053\u306E\u7AEF\u672B\u306B\u306F\u672A\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u306E\u7248\u304C\u3042\u308A\u307E\u3059\u3002\u30AF\u30E9\u30A6\u30C9\u3067\u30ED\u30FC\u30AB\u30EB\u3092\u4E0A\u66F8\u304D = \u30AF\u30E9\u30A6\u30C9\u306B\u5408\u308F\u305B\u3066\u3054\u307F\u7BB1\u3078\uFF1B\u30ED\u30FC\u30AB\u30EB\u3067\u30AF\u30E9\u30A6\u30C9\u3092\u4E0A\u66F8\u304D = \u518D\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3002\" },\n    \"cf.body.never\": { zh: \"\u300C{name}\u300D\u4ECE\u6CA1\u4F20\u5230\u4E91\u7AEF\u8FC7\u3002\u672C\u5730\u8986\u76D6\u4E91\u7AEF = \u7B2C\u4E00\u6B21\u4E0A\u4F20\uFF1B\u4E91\u7AEF\u8986\u76D6\u672C\u5730 = \u4E91\u7AEF\u6CA1\u6709\u8FD9\u4EFD\uFF0C\u672C\u673A\u8FD9\u4EFD\u79FB\u5230\u56DE\u6536\u7AD9\u3002\", en: \"\u201C{name}\u201D has never been uploaded. Local overwrites cloud = upload it for the first time; Cloud overwrites local = the cloud has none, so this copy goes to the trash.\", ja: \"\u300C{name}\u300D\u306F\u4E00\u5EA6\u3082\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u30ED\u30FC\u30AB\u30EB\u3067\u30AF\u30E9\u30A6\u30C9\u3092\u4E0A\u66F8\u304D = \u521D\u56DE\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\uFF1B\u30AF\u30E9\u30A6\u30C9\u3067\u30ED\u30FC\u30AB\u30EB\u3092\u4E0A\u66F8\u304D = \u30AF\u30E9\u30A6\u30C9\u306B\u7121\u3044\u306E\u3067\u3054\u307F\u7BB1\u3078\u3002\" },\n    \"cf.body.unchanged\": { zh: \"\u300C{name}\u300D\u4E91\u7AEF\u8FD8\u662F\u4E0A\u6B21\u540C\u6B65\u7684\u90A3\u4E00\u7248\uFF0C\u672C\u673A\u6709\u65B0\u6539\u52A8\u6CA1\u4E0A\u4F20\u3002\", en: \"\u201C{name}\u201D in the cloud is still the last synced version; this device has new changes not uploaded yet.\", ja: \"\u300C{name}\u300D\u306E\u30AF\u30E9\u30A6\u30C9\u7248\u306F\u524D\u56DE\u540C\u671F\u306E\u307E\u307E\u3001\u3053\u306E\u7AEF\u672B\u306B\u672A\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u306E\u5909\u66F4\u304C\u3042\u308A\u307E\u3059\u3002\" },\n    \"cf.cloudNewerTitle\": { zh: \"\u4E91\u7AEF\u6709\u65B0\u7248\u672C\", en: \"A newer version exists in the cloud\", ja: \"\u30AF\u30E9\u30A6\u30C9\u306B\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u3042\u308A\u307E\u3059\" },\n    \"cf.cloudNotConfigured\": { zh: \"\u4E91\u7AEF\uFF1A\u672A\u914D\u7F6E\", en: \"Cloud: not configured\", ja: \"\u30AF\u30E9\u30A6\u30C9\uFF1A\u672A\u8A2D\u5B9A\" },\n    \"cf.cloudNotSignedIn\": { zh: \"\u4E91\u7AEF\uFF1A\u672A\u767B\u5F55\", en: \"Cloud: not signed in\", ja: \"\u30AF\u30E9\u30A6\u30C9\uFF1A\u672A\u30ED\u30B0\u30A4\u30F3\" },\n    \"cf.cloudNotSignedInTitle\": { zh: \"\u4E91\u7AEF\uFF1A\u672A\u767B\u5F55\uFF08\u70B9\u5F00\u767B\u5F55\uFF09\", en: \"Cloud: not signed in (tap to sign in)\", ja: \"\u30AF\u30E9\u30A6\u30C9\uFF1A\u672A\u30ED\u30B0\u30A4\u30F3\uFF08\u30BF\u30C3\u30D7\u3057\u3066\u30ED\u30B0\u30A4\u30F3\uFF09\" },\n    \"cf.cloudOffline\": { zh: \"\u4E91\u7AEF\uFF1A\u79BB\u7EBF\", en: \"Cloud: offline\", ja: \"\u30AF\u30E9\u30A6\u30C9\uFF1A\u30AA\u30D5\u30E9\u30A4\u30F3\" },\n    \"cf.note.keptSafe\": { zh: \"\u88AB\u66FF\u6362\u7684\u7248\u672C\u4F1A\u81EA\u52A8\u7559\u5E95\uFF0C\u4E0D\u4F1A\u4E22\u5931\", en: \"The replaced version is kept automatically \u2014 nothing is lost\", ja: \"\u7F6E\u304D\u63DB\u3048\u3089\u308C\u305F\u30D0\u30FC\u30B8\u30E7\u30F3\u306F\u81EA\u52D5\u7684\u306B\u4FDD\u7BA1\u3055\u308C\u3001\u5931\u308F\u308C\u307E\u305B\u3093\" },\n    \"cf.signedIn\": { zh: \"\u5DF2\u767B\u5F55\", en: \"Signed in\", ja: \"\u30ED\u30B0\u30A4\u30F3\u6E08\u307F\" },\n    \"cf.skipToOffline\": { zh: \"\u8DF3\u8FC7\u5230\u79BB\u7EBF\", en: \"Skip to offline\", ja: \"\u30B9\u30AD\u30C3\u30D7\u3057\u3066\u30AA\u30D5\u30E9\u30A4\u30F3\" },\n    \"common.cancel\": { zh: \"\u53D6\u6D88\", en: \"Cancel\", ja: \"\u30AD\u30E3\u30F3\u30BB\u30EB\" },\n    \"cp.downloadFailed\": { zh: \"\u62FF\u4E0D\u5230 {name}\uFF08\u79BB\u7EBF\u4E14\u672C\u5730\u65E0\u7F13\u5B58\uFF1F\uFF09\", en: \"Could not fetch {name} (offline with no local copy?)\", ja: \"{name} \u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\u3067\u30ED\u30FC\u30AB\u30EB\u30B3\u30D4\u30FC\u306A\u3057\uFF1F\uFF09\" },\n    \"cp.downloading\": { zh: \"\u6B63\u5728\u4E0B\u8F7D {name}\u2026\", en: \"Downloading {name}\u2026\", ja: \"{name} \u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u4E2D\u2026\" },\n    \"cp.importFailed\": { zh: \"\u4E91\u76D8\u5BFC\u5165\u5931\u8D25\uFF1A{err}\", en: \"Cloud import failed: {err}\", ja: \"\u30AF\u30E9\u30A6\u30C9\u304B\u3089\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\uFF1A{err}\" },\n    \"enc.confirmMsg\": { zh: \"\u4E24\u6B21\u8F93\u5165\u9700\u4E00\u81F4\", en: \"Both entries must match\", ja: \"\u540C\u3058\u3082\u306E\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\" },\n    \"enc.confirmTitle\": { zh: \"\u518D\u8F93\u4E00\u904D\u786E\u8BA4\", en: \"Confirm password\", ja: \"\u3082\u3046\u4E00\u5EA6\u5165\u529B\u3057\u3066\u78BA\u8A8D\" },\n    \"enc.enterGalleryPw\": { zh: \"\u8F93\u5165\u56FE\u5E93\u5BC6\u7801\u3002\u5BC6\u7801\u53EA\u5B58\u5728\u5185\u5B58\u91CC\uFF0C\u5173\u9875\u5373\u5FD8\u3002\", en: \"Enter the gallery password. It lives only in memory and is forgotten when the page closes.\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3002\u30E1\u30E2\u30EA\u306B\u306E\u307F\u4FDD\u6301\u3055\u308C\u3001\u30DA\u30FC\u30B8\u3092\u9589\u3058\u308B\u3068\u6D88\u3048\u307E\u3059\u3002\" },\n    \"enc.enterPwMsg\": { zh: \"\u56FE\u5E93\u5DF2\u8BBE\u8FC7\u5BC6\u7801\uFF08\u8DDF\u8D26\u53F7\u8D70\uFF09\u3002\u8F93\u5165\u539F\u5BC6\u7801\uFF1B\u5FD8\u8BB0 = \u5185\u5BB9\u6C38\u4E45\u627E\u4E0D\u56DE\u3002\", en: \"This gallery already has a password (tied to your account). Enter it \u2014 if forgotten, the content is permanently unrecoverable.\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u306B\u306F\u65E2\u306B\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\uFF08\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u7D10\u4ED8\u304D\uFF09\u3002\u5FD8\u308C\u305F\u5834\u5408\u3001\u5185\u5BB9\u306F\u6C38\u4E45\u306B\u5FA9\u5143\u3067\u304D\u307E\u305B\u3093\u3002\" },\n    \"enc.enterPwTitle\": { zh: \"\u8F93\u5165\u56FE\u5E93\u5BC6\u7801\", en: \"Enter gallery password\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\" },\n    \"enc.importPrompt\": { zh: \"\u8FD9\u662F\u52A0\u5BC6\u6587\u4EF6\u3002\u8F93\u5165\u5B83\u7684\u5BC6\u7801\u3002\", en: \"This file is encrypted. Enter its password.\", ja: \"\u3053\u308C\u306F\u6697\u53F7\u5316\u30D5\u30A1\u30A4\u30EB\u3067\u3059\u3002\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\" },\n    \"enc.locked.aria\": { zh: \"\u5DF2\u52A0\u5BC6\", en: \"Encrypted\", ja: \"\u6697\u53F7\u5316\u6E08\u307F\" },\n    \"enc.setPwMismatch\": { zh: \"\u4E24\u6B21\u8F93\u5165\u4E0D\u4E00\u81F4\uFF0C\u91CD\u65B0\u8BBE\u7F6E\", en: \"Entries don't match \u2014 try again\", ja: \"\u5165\u529B\u304C\u4E00\u81F4\u3057\u307E\u305B\u3093\u3002\u3084\u308A\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\" },\n    \"enc.setPwMsg\": { zh: \"\u6574\u4E2A\u56FE\u5E93\u5171\u7528\u8FD9\u4E00\u4E2A\u5BC6\u7801\u3002\u5FD8\u8BB0 = \u5185\u5BB9\u6C38\u4E45\u627E\u4E0D\u56DE\uFF08\u6CA1\u6709\u4EFB\u4F55\u540E\u95E8\uFF09\uFF1B\u592A\u77ED\u7684\u5BC6\u7801\u53EF\u88AB\u66B4\u529B\u7834\u89E3\u3002\u52A0\u5BC6\u6587\u4EF6\u7528 7-Zip \u8F93\u6B64\u5BC6\u7801\u4E5F\u80FD\u6253\u5F00\u3002\", en: \"One password for the whole gallery. If forgotten, content is permanently unrecoverable (there is no backdoor); short passwords can be brute-forced. Encrypted files also open in 7-Zip with this password.\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u5168\u4F53\u30671\u3064\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5171\u6709\u3057\u307E\u3059\u3002\u5FD8\u308C\u308B\u3068\u5185\u5BB9\u306F\u6C38\u4E45\u306B\u5FA9\u5143\u3067\u304D\u307E\u305B\u3093\uFF08\u30D0\u30C3\u30AF\u30C9\u30A2\u306A\u3057\uFF09\u3002\u77ED\u3044\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u7DCF\u5F53\u305F\u308A\u306B\u5F31\u3044\u3067\u3059\u3002\u6697\u53F7\u5316\u30D5\u30A1\u30A4\u30EB\u306F 7-Zip \u3067\u3082\u540C\u3058\u30D1\u30B9\u30EF\u30FC\u30C9\u3067\u958B\u3051\u307E\u3059\u3002\" },\n    \"enc.setPwTitle\": { zh: \"\u8BBE\u7F6E\u56FE\u5E93\u5BC6\u7801\", en: \"Set gallery password\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u8A2D\u5B9A\" },\n    \"enc.unlockImportTitle\": { zh: \"\u89E3\u9501\u5BFC\u5165\u7684\u52A0\u5BC6\u6587\u4EF6\", en: \"Unlock imported encrypted file\", ja: \"\u30A4\u30F3\u30DD\u30FC\u30C8\u3057\u305F\u6697\u53F7\u5316\u30D5\u30A1\u30A4\u30EB\u306E\u30ED\u30C3\u30AF\u89E3\u9664\" },\n    \"enc.unlockTitle\": { zh: \"\u89E3\u9501\u52A0\u5BC6\u4F5C\u54C1\", en: \"Unlock encrypted artwork\", ja: \"\u6697\u53F7\u5316\u4F5C\u54C1\u306E\u30ED\u30C3\u30AF\u89E3\u9664\" },\n    \"enc.wrongRetry\": { zh: \"\u5BC6\u7801\u4E0D\u5BF9\uFF0C\u518D\u8BD5\u4E00\u6B21\", en: \"Wrong password \u2014 try again\", ja: \"\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u9055\u3044\u307E\u3059\u3002\u3082\u3046\u4E00\u5EA6\" },\n    \"err.cloudNetwork\": { zh: \"\u7F51\u7EDC\u4E0D\u901A\uFF1A\u6682\u65F6\u8FDE\u4E0D\u4E0A\u4E91\u7AEF\u3002\u4F60\u7684\u753B\u90FD\u8FD8\u5728\u672C\u5730\uFF0C\u7A0D\u540E\u53EF\u91CD\u8BD5\u3002\", en: \"Network unreachable: could not reach the cloud. Your work is safe locally \u2014 try again later.\", ja: \"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3002\u4F5C\u54C1\u306F\u30ED\u30FC\u30AB\u30EB\u306B\u4FDD\u5B58\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u5F8C\u3067\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002\" },\n    \"gal.busy.copy\": { zh: \"\u6B63\u5728\u521B\u5EFA\u526F\u672C {base}\u2026\", en: \"Duplicating {base}\u2026\", ja: \"\u8907\u88FD\u4E2D {base}\u2026\" },\n    \"gal.busy.del\": { zh: \"\u6B63\u5728\u5220\u9664 {name}\u2026\", en: \"Deleting {name}\u2026\", ja: \"\u524A\u9664\u4E2D {name}\u2026\" },\n    \"gal.busy.emptyBackup\": { zh: \"\u6B63\u5728\u6E05\u7A7A{label}\u5907\u4EFD\u7BB1\u2026\", en: \"Emptying {label} backups\u2026\", ja: \"{label}\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u7A7A\u306B\u2026\" },\n    \"gal.busy.emptyTrash\": { zh: \"\u6B63\u5728\u6E05\u7A7A{label}\u56DE\u6536\u7AD9\u2026\", en: \"Emptying {label} trash\u2026\", ja: \"{label}\u306E\u30B4\u30DF\u7BB1\u3092\u7A7A\u306B\u2026\" },\n    \"gal.busy.keepOffline\": { zh: \"\u6B63\u5728\u4E0B\u8F7D\u300C{name}\u300D\u2026\", en: \"Downloading \u201C{name}\u201D\u2026\", ja: \"\u300C{name}\u300D\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u4E2D\u2026\" },\n    \"gal.busy.move\": { zh: \"\u6B63\u5728\u79FB\u52A8 {base} \u2192 {target}\u2026\", en: \"Moving {base} \u2192 {target}\u2026\", ja: \"\u79FB\u52D5\u4E2D {base} \u2192 {target}\u2026\" },\n    \"gal.busy.purge\": { zh: \"\u6B63\u5728\u6C38\u4E45\u5220\u9664 {name}\u2026\", en: \"Deleting {name} forever\u2026\", ja: \"\u5B8C\u5168\u306B\u524A\u9664\u4E2D {name}\u2026\" },\n    \"gal.busy.rename\": { zh: \"\u6B63\u5728\u91CD\u547D\u540D {name} \u2192 {to}\u2026\", en: \"Renaming {name} \u2192 {to}\u2026\", ja: \"\u540D\u524D\u5909\u66F4\u4E2D {name} \u2192 {to}\u2026\" },\n    \"gal.busy.restore\": { zh: \"\u6B63\u5728\u6062\u590D {name}\u2026\", en: \"Restoring {name}\u2026\", ja: \"\u5FA9\u5143\u4E2D {name}\u2026\" },\n    \"gal.copy\": { zh: \"\u521B\u5EFA\u526F\u672C\", en: \"Duplicate\", ja: \"\u8907\u88FD\u3092\u4F5C\u6210\" },\n    \"gal.del.activeSuffix\": { zh: \" \u5F53\u524D\u753B\u5E03\u4F1A\u5173\u95ED\u3002\", en: \" The current canvas will close.\", ja: \" \u73FE\u5728\u306E\u30AD\u30E3\u30F3\u30D0\u30B9\u306F\u9589\u3058\u3089\u308C\u307E\u3059\u3002\" },\n    \"gal.del.cloudDetail\": { zh: \"\u4F1A\u8FDB\u4E91\u7AEF\u56DE\u6536\u7AD9\uFF0C\u53EF\u6062\u590D\u3002\", en: \"Goes to cloud trash; can be restored.\", ja: \"\u30AF\u30E9\u30A6\u30C9\u306E\u30B4\u30DF\u7BB1\u306B\u5165\u308A\u3001\u5FA9\u5143\u53EF\u80FD\u3067\u3059\u3002\" },\n    \"gal.del.dirtyDetail\": { zh: \"\u672C\u5730\u6709**\u672A\u63A8\u9001\u5230\u4E91\u7AEF\u7684\u4FEE\u6539**\uFF0C\u5220\u9664\u4F1A\u4E22\u8FD9\u4E9B\u6539\u52A8\u3002\u4E91\u7AEF\u5907\u4EFD\u8FDB\u56DE\u6536\u7AD9\u53EF\u6062\u590D\u3002\", en: \"Local has **unpushed changes**; deleting loses them. The cloud backup goes to trash and can be restored.\", ja: \"\u30ED\u30FC\u30AB\u30EB\u306B**\u672A\u9001\u4FE1\u306E\u5909\u66F4**\u304C\u3042\u308A\u3001\u524A\u9664\u3059\u308B\u3068\u5931\u308F\u308C\u307E\u3059\u3002\u30AF\u30E9\u30A6\u30C9\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306F\u30B4\u30DF\u7BB1\u306B\u5165\u308A\u5FA9\u5143\u53EF\u80FD\u3067\u3059\u3002\" },\n    \"gal.del.imageDetail\": { zh: \"\u79FB\u5230\u56DE\u6536\u7AD9\uFF08\u53EF\u6062\u590D\uFF09\u3002\u8FD9\u662F\u56FE\u7247\u7D20\u6750\uFF0C\u4E0D\u662F\u753B\u4F5C\u3002\", en: \"Move to trash (recoverable). This is an image file, not an artwork.\", ja: \"\u30B4\u30DF\u7BB1\u3078\u79FB\u52D5\uFF08\u5FA9\u5143\u53EF\uFF09\u3002\u3053\u308C\u306F\u753B\u50CF\u30D5\u30A1\u30A4\u30EB\u3067\u3001\u4F5C\u54C1\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\" },\n    \"gal.del.localDetail\": { zh: \"\u4F1A\u8FDB\u672C\u5730\u56DE\u6536\u7AD9\uFF0C\u53EF\u6062\u590D\u3002\", en: \"Goes to local trash; can be restored.\", ja: \"\u30ED\u30FC\u30AB\u30EB\u306E\u30B4\u30DF\u7BB1\u306B\u5165\u308A\u3001\u5FA9\u5143\u53EF\u80FD\u3067\u3059\u3002\" },\n    \"gal.del.syncedDetail\": { zh: \"\u672C\u5730\u526F\u672C\u4F1A\u4E00\u8D77\u5220\uFF0C\u4E91\u7AEF\u8FDB\u56DE\u6536\u7AD9\u53EF\u6062\u590D\u3002\", en: \"The local copy is deleted too; the cloud copy goes to trash and can be restored.\", ja: \"\u30ED\u30FC\u30AB\u30EB\u3082\u524A\u9664\u3055\u308C\u3001\u30AF\u30E9\u30A6\u30C9\u306F\u30B4\u30DF\u7BB1\u306B\u5165\u308A\u5FA9\u5143\u53EF\u80FD\u3067\u3059\u3002\" },\n    \"gal.delEmptyFolder\": { zh: \"\u5220\u9664\u7A7A\u6587\u4EF6\u5939\", en: \"Delete empty folder\", ja: \"\u7A7A\u306E\u30D5\u30A9\u30EB\u30C0\u3092\u524A\u9664\" },\n    \"gal.delFolderNonEmpty\": { zh: \"\u5220\u9664\uFF08\u8BF7\u5148\u6E05\u7A7A\u91CC\u9762\uFF09\", en: \"Delete (empty it first)\", ja: \"\u524A\u9664\uFF08\u5148\u306B\u4E2D\u3092\u7A7A\u306B\uFF09\" },\n    \"gal.deleted\": { zh: \"\u5220\u9664\", en: \"deleted\", ja: \"\u524A\u9664\" },\n    \"gal.divergedNote\": { zh: \"\u4E91\u7AEF\u526F\u672C\u5DF2\u88AB\u522B\u7684\u8BBE\u5907\u79FB\u52A8\u6216\u5220\u9664\uFF1B\u672C\u5730\u8FD9\u4EFD\u6709\u672A\u63A8\u9001\u7684\u4FEE\u6539\u3002\", en: \"The cloud copy was moved or deleted by another device; this local copy has unpushed changes.\", ja: \"\u30AF\u30E9\u30A6\u30C9\u5074\u306F\u5225\u7AEF\u672B\u3067\u79FB\u52D5/\u524A\u9664\u3055\u308C\u307E\u3057\u305F\u3002\u30ED\u30FC\u30AB\u30EB\u306B\u306F\u672A\u9001\u4FE1\u306E\u5909\u66F4\u304C\u3042\u308A\u307E\u3059\u3002\" },\n    \"gal.dlg.decryptMsg\": { zh: \"\u5185\u5BB9\u5C06\u4EE5\u660E\u6587\u5B58\u653E\u5728\u672C\u673A\u4E0E\u4E91\u7AEF\uFF0C\u4EFB\u4F55\u80FD\u8BBF\u95EE\u6B64\u8BBE\u5907\u6216\u4E91\u8D26\u53F7\u7684\u4EBA\u90FD\u80FD\u67E5\u770B\u3002\", en: \"Contents will be stored as plaintext locally and in the cloud; anyone with access to this device or cloud account can view them.\", ja: \"\u5185\u5BB9\u306F\u30ED\u30FC\u30AB\u30EB\u3068\u30AF\u30E9\u30A6\u30C9\u306B\u5E73\u6587\u3067\u4FDD\u5B58\u3055\u308C\u3001\u3053\u306E\u7AEF\u672B\u3084\u30AF\u30E9\u30A6\u30C9\u306B\u30A2\u30AF\u30BB\u30B9\u3067\u304D\u308B\u4EBA\u306F\u8AB0\u3067\u3082\u95B2\u89A7\u3067\u304D\u307E\u3059\u3002\" },\n    \"gal.dlg.decryptTitle\": { zh: \"\u89E3\u9664\u300C{base}\u300D\u7684\u52A0\u5BC6\uFF1F\", en: \"Decrypt \u201C{base}\u201D?\", ja: \"\u300C{base}\u300D\u306E\u6697\u53F7\u5316\u3092\u89E3\u9664\uFF1F\" },\n    \"gal.dlg.delTitle\": { zh: \"\u5220\u9664 \\\"{name}\\\"\uFF1F\", en: \"Delete \u201C{name}\u201D?\", ja: \"\u300C{name}\u300D\u3092\u524A\u9664\uFF1F\" },\n    \"gal.dlg.emptyBackupMsg\": { zh: \"{label}\u5907\u4EFD\u7BB1\u91CC\u7559\u5E95\u7684\u7248\u672C\u4F1A\u88AB\u5F7B\u5E95\u5220\u9664\uFF0C\u4E0D\u53EF\u64A4\u9500\u3002\", en: \"Versions kept in the {label} backups will be permanently deleted. Cannot be undone.\", ja: \"{label}\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306B\u4FDD\u7BA1\u3055\u308C\u305F\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u5B8C\u5168\u306B\u524A\u9664\u3057\u307E\u3059\u3002\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3002\" },\n    \"gal.dlg.emptyBackupTitle\": { zh: \"\u6E05\u7A7A{label}\u5907\u4EFD\u7BB1\uFF1F\", en: \"Empty {label} backups?\", ja: \"{label}\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u7A7A\u306B\uFF1F\" },\n    \"gal.dlg.emptyTrashMsg\": { zh: \"{label}\u56DE\u6536\u7AD9\u4F1A\u88AB\u5F7B\u5E95\u6E05\u7A7A\uFF0C\u4E0D\u53EF\u64A4\u9500\u3002\", en: \"The {label} trash will be permanently emptied. Cannot be undone.\", ja: \"{label}\u306E\u30B4\u30DF\u7BB1\u3092\u5B8C\u5168\u306B\u7A7A\u306B\u3057\u307E\u3059\u3002\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3002\" },\n    \"gal.dlg.emptyTrashTitle\": { zh: \"\u6E05\u7A7A{label}\u56DE\u6536\u7AD9\uFF1F\", en: \"Empty {label} trash?\", ja: \"{label}\u306E\u30B4\u30DF\u7BB1\u3092\u7A7A\u306B\uFF1F\" },\n    \"gal.dlg.moveMsg\": { zh: \"\u9009\u62E9\u76EE\u6807\u6587\u4EF6\u5939\", en: \"Choose target folder\", ja: \"\u79FB\u52D5\u5148\u30D5\u30A9\u30EB\u30C0\u3092\u9078\u629E\" },\n    \"gal.dlg.moveTitle\": { zh: \"\u79FB\u52A8\u300C{base}\u300D\u5230\u2026\", en: \"Move \u201C{base}\u201D to\u2026\", ja: \"\u300C{base}\u300D\u3092\u79FB\u52D5\u2026\" },\n    \"gal.dlg.purgeMsg\": { zh: \"\u4E0D\u53EF\u64A4\u9500\u3002\", en: \"Cannot be undone.\", ja: \"\u5143\u306B\u623B\u305B\u307E\u305B\u3093\u3002\" },\n    \"gal.dlg.purgeTitle\": { zh: \"\u6C38\u4E45\u5220\u9664 \\\"{name}\\\"\uFF1F\", en: \"Delete \u201C{name}\u201D forever?\", ja: \"\u300C{name}\u300D\u3092\u5B8C\u5168\u306B\u524A\u9664\uFF1F\" },\n    \"gal.dlg.rename\": { zh: \"\u91CD\u547D\u540D\", en: \"Rename\", ja: \"\u540D\u524D\u3092\u5909\u66F4\" },\n    \"gal.dlg.renameNote\": { zh: \"\u91CD\u547D\u540D\uFF08{note}\uFF09\", en: \"Rename ({note})\", ja: \"\u540D\u524D\u3092\u5909\u66F4\uFF08{note}\uFF09\" },\n    \"gal.empty.backup\": { zh: \"\u5907\u4EFD\u7BB1\u662F\u7A7A\u7684\u3002\u540C\u6B65\u51B2\u7A81\u91CC\u88AB\u6362\u4E0B\u7684\u90A3\u4E00\u7248\u4F1A\u7559\u5728\u8FD9\u91CC\u3002\", en: \"No backups. When a sync conflict replaces a version, the replaced one is kept here.\", ja: \"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u540C\u671F\u306E\u7AF6\u5408\u3067\u7F6E\u304D\u63DB\u3048\u3089\u308C\u305F\u30D0\u30FC\u30B8\u30E7\u30F3\u306F\u3053\u3053\u306B\u4FDD\u7BA1\u3055\u308C\u307E\u3059\u3002\" },\n    \"gal.empty.folder\": { zh: \"\u6587\u4EF6\u5939 \\\"{f}\\\" \u662F\u7A7A\u7684\", en: \"Folder \u201C{f}\u201D is empty\", ja: \"\u30D5\u30A9\u30EB\u30C0\u300C{f}\u300D\u306F\u7A7A\u3067\u3059\" },\n    \"gal.empty.none\": { zh: \"\u8FD8\u6CA1\u6709\u4FDD\u5B58\u7684\u4F5C\u54C1\u3002\u70B9\u53F3\u4E0A\u52A0\u53F7\u65B0\u5EFA\u4E00\u4E2A\uFF0C\u6216\u5148\u5728 PC \u4E0A\u753B\u4E00\u7B14\u3002\", en: \"No saved artwork yet. Tap + at top-right to create one, or draw on PC first.\", ja: \"\u4FDD\u5B58\u3055\u308C\u305F\u4F5C\u54C1\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u53F3\u4E0A\u306E\uFF0B\u3067\u65B0\u898F\u4F5C\u6210\u3001\u307E\u305F\u306FPC\u3067\u63CF\u3044\u3066\u304F\u3060\u3055\u3044\u3002\" },\n    \"gal.empty.trash\": { zh: \"\u56DE\u6536\u7AD9\u662F\u7A7A\u7684\u3002\", en: \"Trash is empty.\", ja: \"\u30B4\u30DF\u7BB1\u306F\u7A7A\u3067\u3059\u3002\" },\n    \"gal.emptyFolder\": { zh: \"\u7A7A\u6587\u4EF6\u5939\", en: \"Empty folder\", ja: \"\u7A7A\u306E\u30D5\u30A9\u30EB\u30C0\" },\n    \"gal.emptyBackupBtn\": { zh: \"\u6E05\u7A7A\u5907\u4EFD\u7BB1\u2026\", en: \"Empty backups\u2026\", ja: \"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u7A7A\u306B\u2026\" },\n    \"gal.emptyTrashBtn\": { zh: \"\u6E05\u7A7A\u56DE\u6536\u7AD9\u2026\", en: \"Empty trash\u2026\", ja: \"\u30B4\u30DF\u7BB1\u3092\u7A7A\u306B\u2026\" },\n    \"gal.firstFrameFailed\": { zh: \"\u56FE\u5E93\u8BFB\u53D6\u5931\u8D25\uFF08\u8BE6\u89C1\u8BCA\u65AD\u65E5\u5FD7\uFF09\", en: \"Gallery listing failed (see the diagnostic log)\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u8A3A\u65AD\u30ED\u30B0\u53C2\u7167\uFF09\" },\n    \"gal.firstFrameTimeout\": { zh: \"\u56FE\u5E93\u8BFB\u53D6\u8D85\u65F6\uFF1A\u672C\u5730\u5B58\u50A8\u6CA1\u6709\u54CD\u5E94\", en: \"Gallery listing timed out: local storage did not respond\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u306E\u8AAD\u307F\u8FBC\u307F\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\uFF1A\u30ED\u30FC\u30AB\u30EB\u30B9\u30C8\u30EC\u30FC\u30B8\u304C\u5FDC\u7B54\u3057\u307E\u305B\u3093\" },\n    \"gal.folder\": { zh: \"\u6587\u4EF6\u5939\", en: \"Folder\", ja: \"\u30D5\u30A9\u30EB\u30C0\" },\n    \"gal.imageFile\": { zh: \"\u56FE\u7247\", en: \"Image\", ja: \"\u753B\u50CF\" },\n    \"gal.keepOffline\": { zh: \"\u7559\u4E00\u4EFD\u79BB\u7EBF\", en: \"Keep offline\", ja: \"\u30AA\u30D5\u30E9\u30A4\u30F3\u7528\u306B\u4FDD\u5B58\" },\n    \"gal.keptAside\": { zh: \"\u7559\u5E95\", en: \"kept\", ja: \"\u4FDD\u7BA1\" },\n    \"gal.loading\": { zh: \"\u52A0\u8F7D\u4E2D\u2026\", en: \"Loading\u2026\", ja: \"\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026\" },\n    \"gal.loc.cloud\": { zh: \"\u4E91\u7AEF\", en: \"Cloud\", ja: \"\u30AF\u30E9\u30A6\u30C9\" },\n    \"gal.loc.local\": { zh: \"\u672C\u5730\", en: \"Local\", ja: \"\u30ED\u30FC\u30AB\u30EB\" },\n    \"gal.lockedThumb\": { zh: \"\u5DF2\u52A0\u5BC6 \u2014\u2014 \u70B9\u9501\u89E3\u9501\u9884\u89C8\", en: \"Encrypted \u2014 tap lock to unlock preview\", ja: \"\u6697\u53F7\u5316\u6E08\u307F \u2014 \u30ED\u30C3\u30AF\u3092\u30BF\u30C3\u30D7\u3057\u3066\u30D7\u30EC\u30D3\u30E5\u30FC\" },\n    \"gal.tile.active\": { zh: \"\u7F16\u8F91\u4E2D\", en: \"Editing\", ja: \"\u7DE8\u96C6\u4E2D\" },\n    \"gal.marker.unread\": { zh: \"\u672A\u8BFB\", en: \"Unread\", ja: \"\u672A\u8AAD\" },\n    \"gal.more\": { zh: \"\u66F4\u591A\u64CD\u4F5C\", en: \"More actions\", ja: \"\u305D\u306E\u4ED6\u306E\u64CD\u4F5C\" },\n    \"gal.moveTo\": { zh: \"\u79FB\u52A8\u5230\u2026\", en: \"Move to\u2026\", ja: \"\u79FB\u52D5\u2026\" },\n    \"gal.note.empty\": { zh: \"\u540D\u5B57\u4E0D\u80FD\u7A7A\", en: \"Name can\u2019t be empty\", ja: \"\u540D\u524D\u306F\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093\" },\n    \"gal.note.fail\": { zh: \"\u5931\u8D25\uFF1A{e}\", en: \"Failed: {e}\", ja: \"\u5931\u6557\uFF1A{e}\" },\n    \"gal.note.taken\": { zh: \"{loc}\u5DF2\u6709\u540C\u540D\uFF0C\u6362\u4E00\u4E2A\", en: \"{loc} already has this name, pick another\", ja: \"{loc}\u306B\u540C\u540D\u3042\u308A\u3001\u5225\u540D\u306B\" },\n    \"gal.openDiag\": { zh: \"\u8BCA\u65AD\u65E5\u5FD7\", en: \"Diagnostic log\", ja: \"\u8A3A\u65AD\u30ED\u30B0\" },\n    \"gal.otherFile\": { zh: \"\u6587\u4EF6\uFF08\u5728 WeebPaint \u5916\u7BA1\u7406\uFF09\", en: \"File (managed outside WeebPaint)\", ja: \"\u30D5\u30A1\u30A4\u30EB\uFF08WeebPaint \u5916\u3067\u7BA1\u7406\uFF09\" },\n    \"gal.ph.newName\": { zh: \"\u65B0\u540D\u5B57\", en: \"New name\", ja: \"\u65B0\u3057\u3044\u540D\u524D\" },\n    \"gal.pullLocal\": { zh: \"\u62C9\u53D6\u5230\u672C\u5730\", en: \"Pull to local\", ja: \"\u30ED\u30FC\u30AB\u30EB\u306B\u53D6\u5F97\" },\n    \"gal.purge\": { zh: \"\u6C38\u4E45\u5220\u9664\", en: \"Delete forever\", ja: \"\u5B8C\u5168\u306B\u524A\u9664\" },\n    \"gal.reload\": { zh: \"\u91CD\u65B0\u8F7D\u5165\u5E94\u7528\", en: \"Reload app\", ja: \"\u30A2\u30D7\u30EA\u3092\u518D\u8AAD\u307F\u8FBC\u307F\" },\n    \"gal.rename\": { zh: \"\u91CD\u547D\u540D\", en: \"Rename\", ja: \"\u540D\u524D\u3092\u5909\u66F4\" },\n    \"gal.renameKeep\": { zh: \"\u91CD\u547D\u540D\u7559\u5B58\", en: \"Rename & keep\", ja: \"\u540D\u524D\u3092\u5909\u3048\u3066\u4FDD\u6301\" },\n    \"gal.restore\": { zh: \"\u6062\u590D\", en: \"Restore\", ja: \"\u5FA9\u5143\" },\n    \"gal.retry\": { zh: \"\u91CD\u8BD5\", en: \"Retry\", ja: \"\u518D\u8A66\u884C\" },\n    \"gal.resolve\": { zh: \"\u5904\u7406\u2026\", en: \"Resolve\u2026\", ja: \"\u51E6\u7406\u2026\" },\n    \"gal.busy.resolve\": { zh: \"\u6B63\u5728\u5904\u7406 {name}\u2026\", en: \"Resolving {name}\u2026\", ja: \"{name} \u3092\u51E6\u7406\u4E2D\u2026\" },\n    \"gal.st.resolve.tookCloud\": { zh: \"\u4E91\u7AEF\u8986\u76D6\u4E86\u672C\u5730\uFF1A{name}\uFF08\u8FD9\u53F0\u7684\u90A3\u4EFD\u8FDB\u4E86\u5907\u4EFD\u7BB1\uFF09\", en: \"Cloud overwrote local: {name} (this device's copy went to the backup bin)\", ja: \"\u30AF\u30E9\u30A6\u30C9\u3067\u30ED\u30FC\u30AB\u30EB\u3092\u4E0A\u66F8\u304D\uFF1A{name}\uFF08\u3053\u306E\u7AEF\u672B\u306E\u7248\u306F\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3078\uFF09\" },\n    \"gal.st.resolve.pushed\": { zh: \"\u672C\u5730\u8986\u76D6\u4E86\u4E91\u7AEF\uFF1A{name}\", en: \"Local overwrote cloud: {name}\", ja: \"\u30ED\u30FC\u30AB\u30EB\u3067\u30AF\u30E9\u30A6\u30C9\u3092\u4E0A\u66F8\u304D\uFF1A{name}\" },\n    \"gal.st.resolve.trashed\": { zh: \"\u8DDF\u4E86\u4E91\u7AEF\uFF1A\u4E91\u7AEF\u90A3\u4EFD\u5DF2\u7ECF\u6CA1\u4E86\uFF0C\u8FD9\u53F0\u7684 {name} \u79FB\u5230\u56DE\u6536\u7AD9\uFF08\u80FD\u6062\u590D\uFF09\", en: \"Followed the cloud: it is gone there, so {name} on this device went to the trash (recoverable)\", ja: \"\u30AF\u30E9\u30A6\u30C9\u306B\u5408\u308F\u305B\u307E\u3057\u305F\uFF1A\u30AF\u30E9\u30A6\u30C9\u306B\u7121\u3044\u306E\u3067 {name} \u306F\u3054\u307F\u7BB1\u3078\uFF08\u5FA9\u5143\u53EF\uFF09\" },\n    \"gal.st.resolve.cancelled\": { zh: \"\u8FD9\u6B21\u6CA1\u52A8\uFF1A{name}\", en: \"Nothing changed: {name}\", ja: \"\u5909\u66F4\u306A\u3057\uFF1A{name}\" },\n    \"gal.st.resolve.clean\": { zh: \"{name} \u6CA1\u6709\u8981\u5904\u7406\u7684\u6539\u52A8\", en: \"{name} has nothing to resolve\", ja: \"{name} \u306B\u51E6\u7406\u3059\u3079\u304D\u5909\u66F4\u306F\u3042\u308A\u307E\u305B\u3093\" },\n    \"gal.st.resolve.offline\": { zh: \"\u73B0\u5728\u79BB\u7EBF\uFF0C\u8FDE\u4E0D\u4E0A\u4E91\u7AEF\uFF1A{name}\", en: \"Offline, cannot reach the cloud: {name}\", ja: \"\u30AA\u30D5\u30E9\u30A4\u30F3\u306E\u305F\u3081\u30AF\u30E9\u30A6\u30C9\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\uFF1A{name}\" },\n    \"gal.st.resolve.unresolved\": { zh: \"\u6CA1\u5904\u7406\u6210\uFF1A{name}\uFF08{e}\uFF09\", en: \"Could not resolve: {name} ({e})\", ja: \"\u51E6\u7406\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF1A{name}\uFF08{e}\uFF09\" },\n    \"gal.root\": { zh: \"\u6839\u76EE\u5F55\", en: \"root\", ja: \"\u30EB\u30FC\u30C8\" },\n    \"gal.rootFolder\": { zh: \"/ \u6839\u76EE\u5F55\", en: \"/ root\", ja: \"/ \u30EB\u30FC\u30C8\" },\n    \"gal.scope.both\": { zh: \"\u672C\u5730\u548C\u4E91\u7AEF\", en: \"local and cloud\", ja: \"\u30ED\u30FC\u30AB\u30EB\u3068\u30AF\u30E9\u30A6\u30C9\" },\n    \"gal.scope.cloud\": { zh: \"\u4E91\u7AEF\", en: \"cloud\", ja: \"\u30AF\u30E9\u30A6\u30C9\" },\n    \"gal.scope.local\": { zh: \"\u672C\u5730\", en: \"local\", ja: \"\u30ED\u30FC\u30AB\u30EB\" },\n    \"gal.st.alreadyEnc\": { zh: \"\u5DF2\u662F\u52A0\u5BC6\u4F5C\u54C1\", en: \"Already encrypted\", ja: \"\u65E2\u306B\u6697\u53F7\u5316\u6E08\u307F\u3067\u3059\" },\n    \"gal.st.alreadyInFolder\": { zh: \"\u5DF2\u5728\u8BE5\u6587\u4EF6\u5939\", en: \"Already in that folder\", ja: \"\u65E2\u306B\u305D\u306E\u30D5\u30A9\u30EB\u30C0\u5185\u3067\u3059\" },\n    \"gal.st.cancelled\": { zh: \"\u5DF2\u53D6\u6D88\", en: \"Cancelled\", ja: \"\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F\" },\n    \"gal.st.cancelledPw\": { zh: \"\u5DF2\u53D6\u6D88\uFF08\u9700\u8981\u5BC6\u7801\uFF09\", en: \"Cancelled (password required)\", ja: \"\u30AD\u30E3\u30F3\u30BB\u30EB\uFF08\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u5FC5\u8981\uFF09\" },\n    \"gal.st.cloudPullFirst\": { zh: \"\u7EAF\u4E91\u7AEF\u4F5C\u54C1\u5148\u62C9\u53D6\u5230\u672C\u5730\u518D{verb}\", en: \"Pull the cloud-only artwork to local first to {verb}\", ja: \"\u30AF\u30E9\u30A6\u30C9\u306E\u307F\u306E\u4F5C\u54C1\u306F\u5148\u306B\u30ED\u30FC\u30AB\u30EB\u3078\u53D6\u5F97\u3057\u3066\u304B\u3089{verb}\" },\n    \"gal.st.keepOfflineFail\": { zh: \"\u7559\u79BB\u7EBF\u5931\u8D25\uFF1A{e}\", en: \"Keep offline failed: {e}\", ja: \"\u30AA\u30D5\u30E9\u30A4\u30F3\u4FDD\u5B58\u306B\u5931\u6557\uFF1A{e}\" },\n    \"gal.st.keptOffline\": { zh: \"\u5DF2\u7559\u79BB\u7EBF\uFF1A{name}\", en: \"Kept offline: {name}\", ja: \"\u30AA\u30D5\u30E9\u30A4\u30F3\u4FDD\u5B58\u6E08\u307F\uFF1A{name}\" },\n    \"gal.st.copied\": { zh: \"\u5DF2\u521B\u5EFA\u526F\u672C\uFF1A{name}\", en: \"Duplicated: {name}\", ja: \"\u8907\u88FD\uFF1A{name}\" },\n    \"gal.st.copyFail\": { zh: \"\u521B\u5EFA\u526F\u672C\u5931\u8D25\uFF1A{e}\", en: \"Duplicate failed: {e}\", ja: \"\u8907\u88FD\u5931\u6557\uFF1A{e}\" },\n    \"gal.st.copyNoBytes\": { zh: \"\u627E\u4E0D\u5230\u6E90\u4F5C\u54C1\u7684\u5B57\u8282\uFF0C\u590D\u5236\u5931\u8D25\", en: \"Source artwork bytes not found; duplicate failed\", ja: \"\u5143\u4F5C\u54C1\u306E\u30C7\u30FC\u30BF\u304C\u898B\u3064\u304B\u3089\u305A\u8907\u88FD\u5931\u6557\" },\n    \"gal.st.decryptFail\": { zh: \"\u89E3\u9664\u52A0\u5BC6\u5931\u8D25\uFF1A{e}\", en: \"Decryption failed: {e}\", ja: \"\u6697\u53F7\u5316\u89E3\u9664\u5931\u6557\uFF1A{e}\" },\n    \"gal.st.decrypted\": { zh: \"\u5DF2\u89E3\u9664\u52A0\u5BC6\uFF1A{name}\", en: \"Decrypted: {name}\", ja: \"\u6697\u53F7\u5316\u89E3\u9664\uFF1A{name}\" },\n    \"gal.st.delCancelled\": { zh: \"\u5DF2\u53D6\u6D88\uFF0C\u6CA1\u6709\u5220\u9664\u300C{name}\u300D\", en: \"Cancelled \u2014 \\\"{name}\\\" was not deleted\", ja: \"\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F\u3002\u300C{name}\u300D\u306F\u524A\u9664\u3057\u3066\u3044\u307E\u305B\u3093\" },\n    \"gal.st.delFail\": { zh: \"\u5220\u9664\u5931\u8D25\uFF1A{e}\", en: \"Delete failed: {e}\", ja: \"\u524A\u9664\u5931\u6557\uFF1A{e}\" },\n    \"gal.st.delLocalOnly\": { zh: \"\u300C{name}\u300D\u5DF2\u4ECE\u672C\u5730\u79FB\u5165\u56DE\u6536\u7AD9\uFF0C\u4F46\u4E91\u7AEF\u90A3\u4EFD\u8FD8\u5728\uFF08\u79BB\u7EBF\u6216\u6765\u5386\u4E0D\u660E\uFF0C\u6CA1\u6562\u5220\uFF09\", en: \"\\\"{name}\\\" was moved to the local recycle bin, but the cloud copy remains (offline or unknown lineage)\", ja: \"\u300C{name}\u300D\u3092\u30ED\u30FC\u30AB\u30EB\u306E\u3054\u307F\u7BB1\u306B\u79FB\u52D5\u3057\u307E\u3057\u305F\u304C\u3001\u30AF\u30E9\u30A6\u30C9\u5074\u306F\u6B8B\u3063\u3066\u3044\u307E\u3059\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\u307E\u305F\u306F\u7531\u6765\u4E0D\u660E\uFF09\" },\n    \"gal.st.delNothing\": { zh: \"\u300C{name}\u300D\u672C\u5730\u548C\u4E91\u7AEF\u90FD\u6CA1\u6709\uFF0C\u65E0\u4E8B\u53EF\u5220\", en: \"\\\"{name}\\\" exists neither locally nor in the cloud \u2014 nothing to delete\", ja: \"\u300C{name}\u300D\u306F\u30ED\u30FC\u30AB\u30EB\u306B\u3082\u30AF\u30E9\u30A6\u30C9\u306B\u3082\u5B58\u5728\u3057\u307E\u305B\u3093\" },\n    \"gal.st.deleted\": { zh: \"\u5DF2\u5220\u9664\uFF1A{name}\", en: \"Deleted: {name}\", ja: \"\u524A\u9664\uFF1A{name}\" },\n    \"gal.st.emptyBackupCloudFail\": { zh: \"{n} \u9879\u4E91\u7AEF\u6CA1\u6E05\uFF08\u53EF\u80FD\u79BB\u7EBF\uFF09\uFF0C\u56DE\u7EBF\u518D\u6E05\", en: \"{n} cloud item(s) not cleared (maybe offline); retry when online\", ja: \"{n} \u4EF6\u304C\u30AF\u30E9\u30A6\u30C9\u3067\u672A\u524A\u9664\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\uFF1F\uFF09\u3002\u30AA\u30F3\u30E9\u30A4\u30F3\u5FA9\u5E30\u5F8C\u306B\u518D\u8A66\u884C\" },\n    \"gal.st.emptyBackupCloudNeedLogin\": { zh: \"\u6E05\u7A7A\u4E91\u7AEF\u5907\u4EFD\u7BB1\u9700\u5148\u767B\u5F55\u5E76\u8054\u7F51\", en: \"Emptying cloud backups requires sign-in and network\", ja: \"\u30AF\u30E9\u30A6\u30C9\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u7A7A\u306B\u3059\u308B\u306B\u306F\u30B5\u30A4\u30F3\u30A4\u30F3\u3068\u63A5\u7D9A\u304C\u5FC5\u8981\u3067\u3059\" },\n    \"gal.st.emptyBackupDone\": { zh: \"\u5DF2\u6E05\u7A7A{label}\u5907\u4EFD\u7BB1\", en: \"Emptied {label} backups\", ja: \"{label}\u306E\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u7A7A\u306B\u3057\u307E\u3057\u305F\" },\n    \"gal.st.emptyBackupPartial\": { zh: \"\u6E05\u7A7A\u65F6\u90E8\u5206\u5931\u8D25\", en: \"Some items failed to clear\", ja: \"\u4E00\u90E8\u306E\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F\" },\n    \"gal.st.emptyTrashCloudFail\": { zh: \"{n} \u9879\u4E91\u7AEF\u6CA1\u6E05\uFF08\u53EF\u80FD\u79BB\u7EBF\uFF09\uFF0C\u56DE\u7EBF\u518D\u6E05\", en: \"{n} cloud item(s) not cleared (maybe offline); retry when online\", ja: \"{n} \u4EF6\u304C\u30AF\u30E9\u30A6\u30C9\u3067\u672A\u524A\u9664\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\uFF1F\uFF09\u3002\u30AA\u30F3\u30E9\u30A4\u30F3\u5FA9\u5E30\u5F8C\u306B\u518D\u8A66\u884C\" },\n    \"gal.st.emptyTrashCloudNeedLogin\": { zh: \"\u6E05\u7A7A\u4E91\u7AEF\u56DE\u6536\u7AD9\u9700\u5148\u767B\u5F55\u5E76\u8054\u7F51\", en: \"Emptying cloud trash requires sign-in and network\", ja: \"\u30AF\u30E9\u30A6\u30C9\u306E\u30B4\u30DF\u7BB1\u3092\u7A7A\u306B\u3059\u308B\u306B\u306F\u30B5\u30A4\u30F3\u30A4\u30F3\u3068\u63A5\u7D9A\u304C\u5FC5\u8981\u3067\u3059\" },\n    \"gal.st.emptyTrashDone\": { zh: \"\u5DF2\u6E05\u7A7A{label}\u56DE\u6536\u7AD9\", en: \"Emptied {label} trash\", ja: \"{label}\u306E\u30B4\u30DF\u7BB1\u3092\u7A7A\u306B\u3057\u307E\u3057\u305F\" },\n    \"gal.st.emptyTrashPartial\": { zh: \"\u6E05\u7A7A\u65F6\u90E8\u5206\u5931\u8D25\", en: \"Some items failed to clear\", ja: \"\u4E00\u90E8\u306E\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F\" },\n    \"gal.st.encConflict\": { zh: \"\u4E91\u7AEF\u6709\u66F4\u65B0\u7248\u672C\uFF1A{name} \u2014\u2014 \u672C\u5730\u5DF2\u6362\u3001\u5DF2\u6807\u672A\u63A8\u9001\uFF1B\u6253\u5F00\u540E\u6309\u51B2\u7A81\u6D41\u7A0B\u5904\u7406\", en: \"Newer version in cloud: {name} \u2014 local swapped and marked unpushed; resolve conflict after opening\", ja: \"\u30AF\u30E9\u30A6\u30C9\u306B\u65B0\u3057\u3044\u7248\uFF1A{name} \u2014 \u30ED\u30FC\u30AB\u30EB\u306F\u5909\u66F4\u30FB\u672A\u9001\u4FE1\u6E08\u307F\u3002\u958B\u3044\u3066\u304B\u3089\u7AF6\u5408\u3092\u89E3\u6C7A\" },\n    \"gal.st.encDeferred\": { zh: \"{okMsg}\uFF08\u672C\u5730\u5B8C\u6210\uFF1B\u4E91\u7AEF\u6682\u672A\u8DDF\u4E0A\uFF0C\u5DF2\u6807\u672A\u63A8\u9001\uFF0C\u56DE\u7EBF\u540E\u63A8\u9001\u5373\u540C\u6B65\uFF09\", en: \"{okMsg} (local done; cloud not yet, marked unpushed; push when back online)\", ja: \"{okMsg}\uFF08\u30ED\u30FC\u30AB\u30EB\u5B8C\u4E86\uFF1B\u30AF\u30E9\u30A6\u30C9\u672A\u8FFD\u5F93\u3001\u672A\u9001\u4FE1\u3002\u30AA\u30F3\u30E9\u30A4\u30F3\u5FA9\u5E30\u5F8C\u306B\u9001\u4FE1\u3067\u540C\u671F\uFF09\" },\n    \"gal.st.encFail\": { zh: \"\u52A0\u5BC6\u5931\u8D25\uFF1A{e}\", en: \"Encryption failed: {e}\", ja: \"\u6697\u53F7\u5316\u5931\u6557\uFF1A{e}\" },\n    \"gal.st.encNeedOnline\": { zh: \"\u5DF2\u540C\u6B65\u8FC7\u4E91\u7AEF\u7684\u4F5C\u54C1\u9700\u5728\u7EBF\u64CD\u4F5C\uFF08\u672C\u5730\u4E0E\u4E91\u7AEF\u8981\u4E00\u8D77\u6362\uFF09\", en: \"Cloud-synced artwork needs to be online (local and cloud swap together)\", ja: \"\u30AF\u30E9\u30A6\u30C9\u540C\u671F\u6E08\u307F\u306E\u4F5C\u54C1\u306F\u30AA\u30F3\u30E9\u30A4\u30F3\u3067\u64CD\u4F5C\uFF08\u30ED\u30FC\u30AB\u30EB\u3068\u30AF\u30E9\u30A6\u30C9\u3092\u540C\u6642\u306B\uFF09\" },\n    \"gal.st.encryptedOk\": { zh: \"\u5DF2\u52A0\u5BC6\uFF1A{name}\uFF087-Zip \u8F93\u6B64\u5BC6\u7801\u53EF\u6062\u590D\uFF1B\u5FD8\u8BB0\u5BC6\u7801\u5185\u5BB9\u6C38\u4E45\u627E\u4E0D\u56DE\uFF09\", en: \"Encrypted: {name} (7-Zip with this password can recover; forgotten password = permanently lost)\", ja: \"\u6697\u53F7\u5316\uFF1A{name}\uFF08\u3053\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u30677-Zip\u5FA9\u5143\u53EF\uFF1B\u5FD8\u308C\u308B\u3068\u5185\u5BB9\u306F\u6C38\u4E45\u306B\u5931\u308F\u308C\u307E\u3059\uFF09\" },\n    \"gal.st.folderDelFail\": { zh: \"\u5220\u9664\u6587\u4EF6\u5939\u5931\u8D25\uFF1A{e}\", en: \"Folder delete failed: {e}\", ja: \"\u30D5\u30A9\u30EB\u30C0\u524A\u9664\u5931\u6557\uFF1A{e}\" },\n    \"gal.st.folderDeleted\": { zh: \"\u5DF2\u5220\u9664\u7A7A\u6587\u4EF6\u5939\uFF1A{name}\", en: \"Deleted empty folder: {name}\", ja: \"\u7A7A\u306E\u30D5\u30A9\u30EB\u30C0\u3092\u524A\u9664\uFF1A{name}\" },\n    \"gal.st.moveFail\": { zh: \"\u79FB\u52A8\u5931\u8D25\uFF1A{e}\", en: \"Move failed: {e}\", ja: \"\u79FB\u52D5\u5931\u6557\uFF1A{e}\" },\n    \"gal.st.moved\": { zh: \"\u5DF2\u79FB\u52A8\u5230\uFF1A{target}\", en: \"Moved to: {target}\", ja: \"\u79FB\u52D5\u5148\uFF1A{target}\" },\n    \"gal.st.nameTakenTarget\": { zh: \"{loc}\u76EE\u6807\u5DF2\u6709\u540C\u540D\u300C{base}\u300D\", en: \"{loc} target already has \u201C{base}\u201D\", ja: \"{loc}\u306E\u79FB\u52D5\u5148\u306B\u540C\u540D\u300C{base}\u300D\u3042\u308A\" },\n    \"gal.st.nameUnchanged\": { zh: \"\u540D\u5B57\u672A\u53D8\", en: \"Name unchanged\", ja: \"\u540D\u524D\u306F\u5909\u308F\u3063\u3066\u3044\u307E\u305B\u3093\" },\n    \"gal.st.noLocalBytes\": { zh: \"\u672C\u5730\u5B57\u8282\u7F3A\u5931\", en: \"Local bytes missing\", ja: \"\u30ED\u30FC\u30AB\u30EB\u30C7\u30FC\u30BF\u304C\u3042\u308A\u307E\u305B\u3093\" },\n    \"gal.st.noOtherFolder\": { zh: \"\u6CA1\u6709\u522B\u7684\u6587\u4EF6\u5939\u53EF\u79FB\uFF08\u5148\u65B0\u5EFA\u4E00\u4E2A\uFF09\", en: \"No other folder to move to (create one first)\", ja: \"\u79FB\u52D5\u5148\u306E\u30D5\u30A9\u30EB\u30C0\u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u5148\u306B\u4F5C\u6210\uFF09\" },\n    \"gal.st.notEnc\": { zh: \"\u8FD9\u4E0D\u662F\u52A0\u5BC6\u4F5C\u54C1\", en: \"This artwork isn\u2019t encrypted\", ja: \"\u3053\u308C\u306F\u6697\u53F7\u5316\u4F5C\u54C1\u3067\u306F\u3042\u308A\u307E\u305B\u3093\" },\n    \"gal.st.openActive\": { zh: \"\u8FD9\u753B\u6B63\u5F00\u7740 \u2014\u2014 \u5148\u9000\u51FA\u5230\u56FE\u5E93\u518D{verb}\", en: \"This artwork is open \u2014 exit to gallery first to {verb}\", ja: \"\u3053\u306E\u4F5C\u54C1\u306F\u958B\u3044\u3066\u3044\u307E\u3059 \u2014 \u5148\u306B\u30AE\u30E3\u30E9\u30EA\u30FC\u306B\u623B\u3063\u3066{verb}\" },\n    \"gal.st.purgeFail\": { zh: \"\u6C38\u4E45\u5220\u9664\u5931\u8D25\uFF1A{e}\", en: \"Permanent delete failed: {e}\", ja: \"\u5B8C\u5168\u524A\u9664\u5931\u6557\uFF1A{e}\" },\n    \"gal.st.purged\": { zh: \"\u5DF2\u6C38\u4E45\u5220\u9664\uFF1A{name}\", en: \"Permanently deleted: {name}\", ja: \"\u5B8C\u5168\u306B\u524A\u9664\uFF1A{name}\" },\n    \"gal.st.renamed\": { zh: \"\u5DF2\u91CD\u547D\u540D\uFF1A{to}\", en: \"Renamed: {to}\", ja: \"\u540D\u524D\u5909\u66F4\uFF1A{to}\" },\n    \"gal.st.renamed2\": { zh: \"\u5DF2\u91CD\u547D\u540D\uFF1A{from} \u2192 {to}\", en: \"Renamed: {from} \u2192 {to}\", ja: \"\u540D\u524D\u5909\u66F4\uFF1A{from} \u2192 {to}\" },\n    \"gal.st.restoreFail\": { zh: \"\u6062\u590D\u5931\u8D25\uFF1A{e}\", en: \"Restore failed: {e}\", ja: \"\u5FA9\u5143\u5931\u6557\uFF1A{e}\" },\n    \"gal.st.restored\": { zh: \"\u5DF2\u6062\u590D\uFF1A{name}\", en: \"Restored: {name}\", ja: \"\u5FA9\u5143\uFF1A{name}\" },\n    \"gal.st.restoredRenamed\": { zh: \"\u5DF2\u6062\u590D\uFF1A{name}\uFF08\u539F\u540D {orig} \u5DF2\u88AB\u5360\u7528\uFF09\", en: \"Restored: {name} (original name {orig} was taken)\", ja: \"\u5FA9\u5143\uFF1A{name}\uFF08\u5143\u306E\u540D\u524D {orig} \u306F\u4F7F\u7528\u4E2D\uFF09\" },\n    \"gal.st.unlocked\": { zh: \"\u5DF2\u89E3\u9501\u52A0\u5BC6\u4F5C\u54C1\uFF08\u5BC6\u7801\u53EA\u5728\u5185\u5B58\uFF0C\u5173\u9875\u5373\u5FD8\uFF09\", en: \"Unlocked (password kept in memory only, forgotten on close)\", ja: \"\u30ED\u30C3\u30AF\u89E3\u9664\uFF08\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u30E1\u30E2\u30EA\u306E\u307F\u3001\u9589\u3058\u308B\u3068\u7834\u68C4\uFF09\" },\n    \"gal.toTrash\": { zh: \"\u9001\u5230\u56DE\u6536\u7AD9\", en: \"Move to trash\", ja: \"\u30B4\u30DF\u7BB1\u3078\" },\n    \"gal.unloadLocal\": { zh: \"\u5378\u8F7D\u672C\u5730\", en: \"Unload local\", ja: \"\u30ED\u30FC\u30AB\u30EB\u3092\u89E3\u653E\" },\n    \"gal.verb.decrypt\": { zh: \"\u89E3\u9664\u52A0\u5BC6\", en: \"decrypt\", ja: \"\u6697\u53F7\u5316\u89E3\u9664\" },\n    \"gal.verb.encrypt\": { zh: \"\u52A0\u5BC6\", en: \"encrypt\", ja: \"\u6697\u53F7\u5316\" },\n    \"gc.redirectReadyMsg\": { zh: \"\u5DF2\u4FDD\u5B58\u5230\u672C\u673A\u3002\u63A5\u4E0B\u6765\u4F1A\u8DF3\u5230\u5FAE\u8F6F\u767B\u5F55\u9875\uFF0C\u767B\u5F55\u540E\u81EA\u52A8\u56DE\u6765\u3002\", en: \"Saved on this device. Next you'll go to the Microsoft sign-in page and come back automatically.\", ja: \"\u3053\u306E\u7AEF\u672B\u306B\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002\u6B21\u306B Microsoft \u306E\u30B5\u30A4\u30F3\u30A4\u30F3\u30DA\u30FC\u30B8\u3078\u79FB\u52D5\u3057\u3001\u30B5\u30A4\u30F3\u30A4\u30F3\u5F8C\u306B\u81EA\u52D5\u3067\u623B\u308A\u307E\u3059\u3002\" },\n    \"gm.alreadyCurrent\": { zh: \"\u5DF2\u7ECF\u662F\u5F53\u524D\u56FE\u5E93\", en: \"Already the current gallery\", ja: \"\u3059\u3067\u306B\u73FE\u5728\u306E\u30AE\u30E3\u30E9\u30EA\u30FC\u3067\u3059\" },\n    \"gm.backupDone\": { zh: \"\u5DF2\u4E0B\u8F7D {n} \u4EFD\u5907\u4EFD\", en: \"Downloaded {n} backups\", ja: \"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092 {n} \u4EF6\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F\" },\n    \"gm.closeDocFirst\": { zh: \"\u5148\u5173\u95ED\u5F53\u524D\u753B\uFF0C\u518D\u5207\u6362\u6216\u5378\u4E0B\u56FE\u5E93\", en: \"Close the current painting before switching or detaching the gallery\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u3092\u5207\u308A\u66FF\u3048\u308B\u524D\u306B\u3001\u73FE\u5728\u306E\u7D75\u3092\u9589\u3058\u3066\u304F\u3060\u3055\u3044\" },\n    \"gm.connectFolder\": { zh: \"\u8FDE\u63A5\u672C\u5730\u6587\u4EF6\u5939\u2026\", en: \"Connect local folder\u2026\", ja: \"\u30ED\u30FC\u30AB\u30EB\u30D5\u30A9\u30EB\u30C0\u30FC\u3092\u63A5\u7D9A\u2026\" },\n    \"gm.connectOneDrive\": { zh: \"\u8FDE\u63A5 OneDrive\u2026\", en: \"Connect OneDrive\u2026\", ja: \"OneDrive \u3092\u63A5\u7D9A\u2026\" },\n    \"gm.connectTitle\": { zh: \"\u8FDE\u63A5\u56FE\u5E93\", en: \"Connect a gallery\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u3092\u63A5\u7D9A\" },\n    \"gm.current\": { zh: \"\u5F53\u524D\u56FE\u5E93\uFF1A{label}\uFF08{src}\uFF09\", en: \"Current gallery: {label} ({src})\", ja: \"\u73FE\u5728\u306E\u30AE\u30E3\u30E9\u30EA\u30FC\uFF1A{label}\uFF08{src}\uFF09\" },\n    \"gm.dirtyAllPushed\": { zh: \"\u5DF2\u5168\u90E8\u4E0A\u4F20\uFF0C\u7EE7\u7EED\u5207\u6362\", en: \"All uploaded \u2014 continuing\", ja: \"\u3059\u3079\u3066\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3057\u307E\u3057\u305F\u3002\u7D9A\u884C\u3057\u307E\u3059\" },\n    \"gm.dirtyBackup\": { zh: \"\u4E0B\u8F7D\u5907\u4EFD\", en: \"Download backups\", ja: \"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\" },\n    \"gm.dirtyForce\": { zh: \"\u4ECD\u8981\u5207\u6362\", en: \"Switch anyway\", ja: \"\u305D\u308C\u3067\u3082\u5207\u308A\u66FF\u3048\u308B\" },\n    \"gm.dirtyMsg\": { zh: \"\u5207\u6362\u540E\u5B83\u4EEC\u7559\u5728\u672C\u673A\u7F13\u5B58\uFF0C\u56DE\u5230\u6B64\u56FE\u5E93\u65F6\u7EE7\u7EED\u4E0A\u4F20\u3002\u6CE8\u610F\uFF1A\u6D4F\u89C8\u5668\u53EF\u80FD\u6E05\u9664\u672C\u673A\u7F13\u5B58\uFF0C\u7F13\u5B58\u4E0D\u662F\u4FDD\u9669\u7BB1\u2014\u2014\u5EFA\u8BAE\u5148\u4E0B\u8F7D\u5907\u4EFD\u3002\", en: \"They stay in this device's cache and upload when you return. Note: the browser may evict local cache \u2014 it is not a safe. Consider downloading backups first.\", ja: \"\u3053\u306E\u7AEF\u672B\u306E\u30AD\u30E3\u30C3\u30B7\u30E5\u306B\u6B8B\u308A\u3001\u623B\u3063\u305F\u3068\u304D\u306B\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3055\u308C\u307E\u3059\u3002\u6CE8\u610F\uFF1A\u30D6\u30E9\u30A6\u30B6\u306F\u30AD\u30E3\u30C3\u30B7\u30E5\u3092\u524A\u9664\u3059\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002\u5148\u306B\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u304A\u3059\u3059\u3081\u3057\u307E\u3059\u3002\" },\n    \"gm.dirtyTitle\": { zh: \"\u6709 {n} \u5F20\u753B\u672A\u4E0A\u4E91\", en: \"{n} paintings not yet uploaded\", ja: \"\u672A\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u306E\u7D75\u304C {n} \u679A\u3042\u308A\u307E\u3059\" },\n    \"gm.disconnected\": { zh: \"\u5DF2\u65AD\u5F00\u56FE\u5E93\u8FDE\u63A5\uFF08\u753B\u5E03\u4E0E\u56FE\u5E93\u6587\u4EF6\u4E0D\u53D7\u5F71\u54CD\uFF09\", en: \"Gallery disconnected (canvas and gallery files untouched)\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u306E\u63A5\u7D9A\u3092\u89E3\u9664\u3057\u307E\u3057\u305F\uFF08\u30AD\u30E3\u30F3\u30D0\u30B9\u3068\u30D5\u30A1\u30A4\u30EB\u306F\u305D\u306E\u307E\u307E\uFF09\" },\n    \"gm.dismiss\": { zh: \"\u5173\u95ED\", en: \"Dismiss\", ja: \"\u9589\u3058\u308B\" },\n    \"gm.fileProtoCloudHelp\": { zh: \"\u5355\u6587\u4EF6\u76F4\u63A5\u53CC\u51FB\u6253\u5F00\uFF08file://\uFF09\u65F6\uFF0C\u5FAE\u8F6F\u767B\u5F55\u7528\u4E0D\u4E86\u2014\u2014\u9700\u8981\u4E00\u4E2A\u672C\u5730 http \u73AF\u5883\u3002\u9003\u751F\u8231\uFF1A\u5728\u8FD9\u4E2A\u6587\u4EF6\u6240\u5728\u7684\u6587\u4EF6\u5939\u6253\u5F00\u547D\u4EE4\u884C\uFF0C\u8FD0\u884C\\n\\n    python -m http.server 8000\\n\\n\u7136\u540E\u7528\u6D4F\u89C8\u5668\u6253\u5F00 http://localhost:8000/{file} \u518D\u8FDE\u63A5 OneDrive\u3002\uFF08\u672C\u5730\u6587\u4EF6\u5939\u56FE\u5E93\u4E0D\u53D7\u5F71\u54CD\uFF0C\u53EF\u4EE5\u76F4\u63A5\u7528\u3002\uFF09\", en: \"Opened directly from disk (file://), Microsoft sign-in cannot work \u2014 it needs a local http origin. Escape hatch: open a terminal in this file's folder and run\\n\\n    python -m http.server 8000\\n\\nthen open http://localhost:8000/{file} in your browser and connect OneDrive there. (Local folder galleries are unaffected.)\", ja: \"\u30D5\u30A1\u30A4\u30EB\u3092\u76F4\u63A5\u958B\u3044\u305F\u72B6\u614B\uFF08file://\uFF09\u3067\u306F Microsoft \u30B5\u30A4\u30F3\u30A4\u30F3\u306F\u4F7F\u3048\u307E\u305B\u3093\u2014\u2014\u30ED\u30FC\u30AB\u30EB http \u74B0\u5883\u304C\u5FC5\u8981\u3067\u3059\u3002\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u306E\u30D5\u30A9\u30EB\u30C0\u30FC\u3067\u30BF\u30FC\u30DF\u30CA\u30EB\u3092\u958B\u304D\u3001\\n\\n    python -m http.server 8000\\n\\n\u3092\u5B9F\u884C\u3057\u3001\u30D6\u30E9\u30A6\u30B6\u3067 http://localhost:8000/{file} \u3092\u958B\u3044\u3066\u304B\u3089 OneDrive \u306B\u63A5\u7D9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\uFF08\u30ED\u30FC\u30AB\u30EB\u30D5\u30A9\u30EB\u30C0\u30FC\u306E\u30AE\u30E3\u30E9\u30EA\u30FC\u306F\u305D\u306E\u307E\u307E\u4F7F\u3048\u307E\u3059\u3002\uFF09\" },\n    \"gm.forgetDirtyWarn\": { zh: \"\u26A0 \u8BE5\u56FE\u5E93\u8FD8\u6709 {n} \u5F20\u753B\u672A\u4E0A\u4E91\uFF08\u7F13\u5B58\u7559\u5728\u672C\u673A\uFF0C\u91CD\u65B0\u8FDE\u63A5\u540E\u53EF\u7EE7\u7EED\u4E0A\u4F20\uFF09\u3002\", en: \"\u26A0 {n} paintings in that gallery are not yet uploaded (cache stays on this device; reconnect later to resume uploading).\", ja: \"\u26A0 \u305D\u306E\u30AE\u30E3\u30E9\u30EA\u30FC\u306B\u306F\u672A\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u306E\u7D75\u304C {n} \u679A\u3042\u308A\u307E\u3059\uFF08\u30AD\u30E3\u30C3\u30B7\u30E5\u306F\u7AEF\u672B\u306B\u6B8B\u308A\u3001\u518D\u63A5\u7D9A\u3067\u518D\u958B\u3067\u304D\u307E\u3059\uFF09\u3002\" },\n    \"gm.forgetHint\": { zh: \"\u5FD8\u8BB0\uFF08\u4E0D\u52A8\u6587\u4EF6\uFF09\", en: \"Forget (files untouched)\", ja: \"\u4E00\u89A7\u304B\u3089\u524A\u9664\uFF08\u30D5\u30A1\u30A4\u30EB\u306F\u305D\u306E\u307E\u307E\uFF09\" },\n    \"gm.forgetMsg\": { zh: \"\u53EA\u4ECE\u8FD9\u53F0\u8BBE\u5907\u7684\u540D\u518C\u79FB\u9664\uFF0C\u4E0D\u52A8\u56FE\u5E93\u672C\u8EAB\u7684\u6587\u4EF6\u3002\", en: \"Removes it from this device's list only; gallery files are untouched.\", ja: \"\u3053\u306E\u7AEF\u672B\u306E\u4E00\u89A7\u304B\u3089\u524A\u9664\u3059\u308B\u3060\u3051\u3067\u3001\u30AE\u30E3\u30E9\u30EA\u30FC\u306E\u30D5\u30A1\u30A4\u30EB\u306B\u306F\u89E6\u308C\u307E\u305B\u3093\u3002\" },\n    \"gm.forgetTitle\": { zh: \"\u5FD8\u8BB0\u300C{label}\u300D\uFF1F\", en: \"Forget \\\"{label}\\\"?\", ja: \"\u300C{label}\u300D\u3092\u4E00\u89A7\u304B\u3089\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F\" },\n    \"gm.forgotten\": { zh: \"\u5DF2\u5FD8\u8BB0 {label}\", en: \"Forgot {label}\", ja: \"{label} \u3092\u4E00\u89A7\u304B\u3089\u524A\u9664\u3057\u307E\u3057\u305F\" },\n    \"gm.historyCaption\": { zh: \"\u6700\u8FD1\u8FDE\u63A5\u8FC7\u7684\uFF1A\", en: \"Recently connected:\", ja: \"\u6700\u8FD1\u63A5\u7D9A\u3057\u305F\u3082\u306E\uFF1A\" },\n    \"gm.offlineBanner\": { zh: \"\u56FE\u5E93\u300C{label}\u300D\u5DF2\u79BB\u7EBF\u2014\u2014\u753B\u7167\u5E38\uFF0C\u540C\u6B65\u6682\u505C\", en: \"Gallery \\\"{label}\\\" is offline \u2014 keep painting, sync paused\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u300C{label}\u300D\u306F\u30AA\u30D5\u30E9\u30A4\u30F3\u2014\u2014\u63CF\u753B\u306F\u901A\u5E38\u3069\u304A\u308A\u3001\u540C\u671F\u306F\u4E00\u6642\u505C\u6B62\" },\n    \"gm.offlineSuffix\": { zh: \" \u00B7 \u5DF2\u79BB\u7EBF\", en: \" \u00B7 offline\", ja: \" \u00B7 \u30AA\u30D5\u30E9\u30A4\u30F3\" },\n    \"gm.reconnect\": { zh: \"\u91CD\u65B0\u8FDE\u63A5\", en: \"Reconnect\", ja: \"\u518D\u63A5\u7D9A\" },\n    \"gm.reconnected\": { zh: \"\u5DF2\u91CD\u65B0\u8FDE\u63A5\", en: \"Reconnected\", ja: \"\u518D\u63A5\u7D9A\u3057\u307E\u3057\u305F\" },\n    \"gm.seedFresh\": { zh: \"\u51FA\u5382\u5168\u65B0\", en: \"Factory fresh\", ja: \"\u65B0\u898F\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8\uFF09\" },\n    \"gm.seedInherit\": { zh: \"\u7EE7\u627F\u5F53\u524D\u7B14\u5237\u4E0E\u8BBE\u7F6E\", en: \"Inherit current brushes & settings\", ja: \"\u73FE\u5728\u306E\u30D6\u30E9\u30B7\u3068\u8A2D\u5B9A\u3092\u5F15\u304D\u7D99\u3050\" },\n    \"gm.seedMsg\": { zh: \"\u300C\u7EE7\u627F\u300D\u62F7\u8D1D\u4E00\u4EFD\u5F53\u524D\u7B14\u5237\u4E0E\u8BBE\u7F6E\uFF0C\u6B64\u540E\u5404\u81EA\u72EC\u7ACB\uFF1B\u300C\u51FA\u5382\u5168\u65B0\u300D\u4ECE\u5185\u7F6E\u9ED8\u8BA4\u8D77\u6B65\u3002\", en: \"\\\"Inherit\\\" copies your current brushes & settings (independent afterwards); \\\"factory fresh\\\" starts from built-in defaults.\", ja: \"\u300C\u5F15\u304D\u7D99\u3050\u300D\u306F\u73FE\u5728\u306E\u30D6\u30E9\u30B7\u3068\u8A2D\u5B9A\u3092\u30B3\u30D4\u30FC\uFF08\u4EE5\u5F8C\u306F\u72EC\u7ACB\uFF09\u3002\u300C\u65B0\u898F\u300D\u306F\u5185\u8535\u30C7\u30D5\u30A9\u30EB\u30C8\u304B\u3089\u59CB\u3081\u307E\u3059\u3002\" },\n    \"gm.seedTitle\": { zh: \"\u65B0\u56FE\u5E93\u7684\u7B14\u5237\u4E0E\u8BBE\u7F6E\", en: \"Brushes & settings for the new gallery\", ja: \"\u65B0\u3057\u3044\u30AE\u30E3\u30E9\u30EA\u30FC\u306E\u30D6\u30E9\u30B7\u3068\u8A2D\u5B9A\" },\n    \"gm.srcFolder\": { zh: \"\u672C\u5730\u6587\u4EF6\u5939\", en: \"Local folder\", ja: \"\u30ED\u30FC\u30AB\u30EB\u30D5\u30A9\u30EB\u30C0\u30FC\" },\n    \"gm.srcOneDrive\": { zh: \"OneDrive\", en: \"OneDrive\", ja: \"OneDrive\" },\n    \"gm.switchEntry\": { zh: \"\u5207\u6362\u56FE\u5E93\u2026\", en: \"Switch gallery\u2026\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u3092\u5207\u308A\u66FF\u3048\u2026\" },\n    \"gm.switched\": { zh: \"\u5DF2\u5207\u6362\u5230 {label}\", en: \"Switched to {label}\", ja: \"{label} \u306B\u5207\u308A\u66FF\u3048\u307E\u3057\u305F\" },\n    \"gm.transientAdopted\": { zh: \"\u5DF2\u8FDE\u63A5\u56FE\u5E93\uFF0C\u8FD9\u5E45\u753B\u5DF2\u81EA\u52A8\u4FDD\u5B58\u4E3A\u300C{name}\u300D\", en: \"Gallery connected \u2014 this artwork was saved as \\\"{name}\\\"\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u306B\u63A5\u7D9A\u3057\u307E\u3057\u305F\u3002\u3053\u306E\u4F5C\u54C1\u306F\u300C{name}\u300D\u3068\u3057\u3066\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F\" },\n    \"gs.changePwBusy\": { zh: \"\u6B63\u5728\u66F4\u6539\u5BC6\u7801 {n}/{total}\u2026\", en: \"Changing password {n}/{total}\u2026\", ja: \"\u30D1\u30B9\u30EF\u30FC\u30C9\u5909\u66F4\u4E2D {n}/{total}\u2026\" },\n    \"gs.changePwConfirmMsg\": { zh: \"\u672C\u673A\u6709\u5B57\u8282\u7684\u52A0\u5BC6\u4F5C\u54C1\u4F1A\u7528\u65B0\u5BC6\u7801\u91CD\u5C01\uFF08\u4E91\u7AEF\u53EA\u89C1\u5BC6\u6587\uFF09\u3002\u4E91\u7AEF\u672A\u7F13\u5B58\u3001\u79BB\u7EBF\u6216\u5931\u8D25\u7684\u4F5C\u54C1\u4ECD\u7528\u65E7\u5BC6\u7801\uFF0C\u6253\u5F00\u65F6\u4F1A\u5355\u72EC\u95EE\u3002\", en: \"Encrypted artworks cached here are re-sealed with the new password (the cloud only ever sees ciphertext). Artworks not cached, offline, or failing stay on the old password and will ask for it when opened.\", ja: \"\u3053\u306E\u7AEF\u672B\u306B\u3042\u308B\u6697\u53F7\u5316\u4F5C\u54C1\u3092\u65B0\u3057\u3044\u30D1\u30B9\u30EF\u30FC\u30C9\u3067\u518D\u5C01\u5370\u3057\u307E\u3059\uFF08\u30AF\u30E9\u30A6\u30C9\u306B\u306F\u6697\u53F7\u6587\u3057\u304B\u6E21\u308A\u307E\u305B\u3093\uFF09\u3002\u672A\u30AD\u30E3\u30C3\u30B7\u30E5\u30FB\u30AA\u30D5\u30E9\u30A4\u30F3\u30FB\u5931\u6557\u3057\u305F\u4F5C\u54C1\u306F\u65E7\u30D1\u30B9\u30EF\u30FC\u30C9\u306E\u307E\u307E\u3067\u3001\u958B\u304F\u3068\u304D\u306B\u805E\u304B\u308C\u307E\u3059\u3002\" },\n    \"gs.changePwConfirmTitle\": { zh: \"\u66F4\u6539\u5BC6\u7801\uFF1F\", en: \"Change password?\", ja: \"\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5909\u66F4\u3057\u307E\u3059\u304B\uFF1F\" },\n    \"gs.changePwDone\": { zh: \"\u5BC6\u7801\u5DF2\u66F4\u6539\uFF1A{n} \u4EF6\u5DF2\u7528\u65B0\u5BC6\u7801\u91CD\u5C01\", en: \"Password changed: {n} re-sealed\", ja: \"\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5909\u66F4\u3057\u307E\u3057\u305F\uFF1A{n} \u4EF6\u3092\u518D\u5C01\u5370\" },\n    \"gs.changePwDoneKept\": { zh: \"\u5BC6\u7801\u5DF2\u66F4\u6539\uFF1A{n} \u4EF6\u5DF2\u91CD\u5C01\uFF0C{m} \u4EF6\u4ECD\u7528\u65E7\u5BC6\u7801\uFF08{k} \u4E2A\u6587\u4EF6\u5939\u6E05\u5355\u4E0D\u5B8C\u6574\uFF09\", en: \"Password changed: {n} re-sealed, {m} still on the old password ({k} folders listed incompletely)\", ja: \"\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5909\u66F4\uFF1A{n} \u4EF6\u3092\u518D\u5C01\u5370\u3001{m} \u4EF6\u306F\u65E7\u30D1\u30B9\u30EF\u30FC\u30C9\u306E\u307E\u307E\uFF08{k} \u30D5\u30A9\u30EB\u30C0\u306F\u4E00\u89A7\u304C\u4E0D\u5B8C\u5168\uFF09\" },\n    \"gs.changePwNewMsg\": { zh: \"\u8F93\u5165\u65B0\u5BC6\u7801\u3002\u672C\u673A\u6709\u5B57\u8282\u7684\u52A0\u5BC6\u4F5C\u54C1\u4F1A\u9010\u4EF6\u7528\u65B0\u5BC6\u7801\u91CD\u5C01\uFF0C\u4E0D\u7ECF\u660E\u6587\u3002\", en: \"Enter the new password. Encrypted artworks cached on this device are re-sealed one by one, never through plaintext.\", ja: \"\u65B0\u3057\u3044\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3002\u3053\u306E\u7AEF\u672B\u306B\u3042\u308B\u6697\u53F7\u5316\u4F5C\u54C1\u3092\u3001\u5E73\u6587\u3092\u7D4C\u305A\u306B\u9806\u306B\u518D\u5C01\u5370\u3057\u307E\u3059\u3002\" },\n    \"gs.changePwNoVerifier\": { zh: \"\u8FD8\u6CA1\u8BBE\u8FC7\u56FE\u5E93\u5BC6\u7801\uFF1B\u7B2C\u4E00\u6B21\u52A0\u5BC6\u4F5C\u54C1\u65F6\u4F1A\u8BBE\u7F6E\u3002\", en: \"No gallery password yet \u2014 you set it when you first encrypt an artwork.\", ja: \"\u307E\u3060\u30AE\u30E3\u30E9\u30EA\u30FC\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u4F5C\u54C1\u3092\u521D\u3081\u3066\u6697\u53F7\u5316\u3059\u308B\u3068\u304D\u306B\u8A2D\u5B9A\u3057\u307E\u3059\u3002\" },\n    \"gs.changePwOldMsg\": { zh: \"\u5148\u9A8C\u8BC1\u5F53\u524D\u7684\u56FE\u5E93\u5BC6\u7801\u3002\", en: \"Verify the current gallery password first.\", ja: \"\u307E\u305A\u73FE\u5728\u306E\u30AE\u30E3\u30E9\u30EA\u30FC\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u78BA\u8A8D\u3057\u307E\u3059\u3002\" },\n    \"gs.changePwOldTitle\": { zh: \"\u8F93\u5165\u5F53\u524D\u5BC6\u7801\", en: \"Enter current password\", ja: \"\u73FE\u5728\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\" },\n    \"gs.changePwSame\": { zh: \"\u65B0\u5BC6\u7801\u4E0E\u5F53\u524D\u5BC6\u7801\u76F8\u540C\uFF0C\u6CA1\u6709\u66F4\u6539\u3002\", en: \"Same as the current password \u2014 nothing changed.\", ja: \"\u73FE\u5728\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3068\u540C\u3058\u3067\u3059\u3002\u5909\u66F4\u306F\u3042\u308A\u307E\u305B\u3093\u3002\" },\n    \"gs.changePwScanning\": { zh: \"\u6B63\u5728\u6E05\u70B9\u52A0\u5BC6\u4F5C\u54C1\u2026\", en: \"Listing encrypted artworks\u2026\", ja: \"\u6697\u53F7\u5316\u4F5C\u54C1\u3092\u78BA\u8A8D\u4E2D\u2026\" },\n    \"gs.clipboardNewFailed\": { zh: \"\u4ECE\u526A\u5207\u677F\u65B0\u5EFA\u5931\u8D25\uFF1A{err}\", en: \"Failed to create from clipboard: {err}\", ja: \"\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u304B\u3089\u306E\u65B0\u898F\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A{err}\" },\n    \"gs.clipboardNoImage\": { zh: \"\u526A\u8D34\u677F\u91CC\u6CA1\u6709\u56FE\u7247\", en: \"No image in the clipboard\", ja: \"\u30AF\u30EA\u30C3\u30D7\u30DC\u30FC\u30C9\u306B\u753B\u50CF\u304C\u3042\u308A\u307E\u305B\u3093\" },\n    \"gs.cloudDisabledNoGallery\": { zh: \"\u4E91\u7AEF\u529F\u80FD\u5DF2\u505C\u7528\uFF0C\u56FE\u5E93\u4E0D\u53EF\u7528\uFF08\u53EF\u5728\u8BBE\u7F6E\u91CC\u91CD\u65B0\u5F00\u542F\uFF09\", en: \"Cloud features are disabled; the gallery is unavailable (re-enable in settings)\", ja: \"\u30AF\u30E9\u30A6\u30C9\u6A5F\u80FD\u304C\u7121\u52B9\u306E\u305F\u3081\u3001\u30AE\u30E3\u30E9\u30EA\u30FC\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093\uFF08\u8A2D\u5B9A\u3067\u518D\u5EA6\u6709\u52B9\u5316\u3067\u304D\u307E\u3059\uFF09\" },\n    \"gs.created\": { zh: \"\u65B0\u5EFA\uFF1A{name}\uFF08{w}\u00D7{h}\uFF09\", en: \"Created: {name} ({w}\u00D7{h})\", ja: \"\u65B0\u898F\u4F5C\u6210\uFF1A{name}\uFF08{w}\u00D7{h}\uFF09\" },\n    \"gs.createdTransient\": { zh: \"\u5DF2\u65B0\u5EFA\u753B\u5E03 {w}\u00D7{h}\uFF08\u672A\u4FDD\u5B58\u00B7\u65E0\u5BB6\u2014\u2014\u4FDD\u5B58\u65F6\u9009\u62E9\u53BB\u5904\uFF09\", en: \"New canvas {w}\u00D7{h} (unsaved, no home \u2014 choose where to save it later)\", ja: \"\u65B0\u3057\u3044\u30AD\u30E3\u30F3\u30D0\u30B9 {w}\u00D7{h}\uFF08\u672A\u4FDD\u5B58\u30FB\u4FDD\u5B58\u6642\u306B\u4FDD\u5B58\u5148\u3092\u9078\u629E\uFF09\" },\n    \"gs.creatingFolder\": { zh: \"\u6B63\u5728\u521B\u5EFA\u6587\u4EF6\u5939 {name}\u2026\", en: \"Creating folder {name}\u2026\", ja: \"\u30D5\u30A9\u30EB\u30C0 {name} \u3092\u4F5C\u6210\u4E2D\u2026\" },\n    \"gs.folderCreateFailed\": { zh: \"\u5EFA\u6587\u4EF6\u5939\u5931\u8D25\uFF1A{err}\", en: \"Failed to create folder: {err}\", ja: \"\u30D5\u30A9\u30EB\u30C0\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A{err}\" },\n    \"gs.folderCreated\": { zh: \"\u5DF2\u5EFA\u6587\u4EF6\u5939\uFF1A{name}\", en: \"Folder created: {name}\", ja: \"\u30D5\u30A9\u30EB\u30C0\u3092\u4F5C\u6210\u3057\u307E\u3057\u305F\uFF1A{name}\" },\n    \"gs.folderExists\": { zh: \"\u6587\u4EF6\u5939 \\\"{name}\\\" \u5DF2\u5B58\u5728\", en: \"Folder \\\"{name}\\\" already exists\", ja: \"\u30D5\u30A9\u30EB\u30C0\u300C{name}\u300D\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059\" },\n    \"gs.folderNameEmpty\": { zh: \"\u6587\u4EF6\u5939\u540D\u4E0D\u80FD\u7A7A\", en: \"Folder name cannot be empty\", ja: \"\u30D5\u30A9\u30EB\u30C0\u540D\u3092\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093\" },\n    \"gs.folderNameNoSlash\": { zh: \"\u6587\u4EF6\u5939\u540D\u4E0D\u80FD\u542B /\uFF08\u8981\u5EFA\u5D4C\u5957\u8BF7\u8FDB\u5BF9\u5E94\u6587\u4EF6\u5939\u518D\u70B9\u65B0\u5EFA\uFF09\", en: \"Folder name cannot contain / (to nest, enter the target folder first, then create)\", ja: \"\u30D5\u30A9\u30EB\u30C0\u540D\u306B / \u3092\u542B\u3081\u3089\u308C\u307E\u305B\u3093\uFF08\u5165\u308C\u5B50\u3092\u4F5C\u308B\u306B\u306F\u5BFE\u8C61\u30D5\u30A9\u30EB\u30C0\u306B\u5165\u3063\u3066\u304B\u3089\u4F5C\u6210\u3057\u3066\u304F\u3060\u3055\u3044\uFF09\" },\n    \"gs.folderNamePlaceholder\": { zh: \"\u6587\u4EF6\u5939\u540D\", en: \"Folder name\", ja: \"\u30D5\u30A9\u30EB\u30C0\u540D\" },\n    \"gs.folderNeedSignin\": { zh: \"\u56FE\u5E93\u79BB\u7EBF\uFF08\u672A\u767B\u5F55\u6216\u6743\u9650\u5931\u6548\uFF09\uFF0C\u65E0\u6CD5\u65B0\u5EFA\u6587\u4EF6\u5939\", en: \"Gallery is offline (not signed in / permission lost) \u2014 can't create a folder\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u304C\u30AA\u30D5\u30E9\u30A4\u30F3\uFF08\u672A\u30ED\u30B0\u30A4\u30F3\uFF0F\u6A29\u9650\u5207\u308C\uFF09\u306E\u305F\u3081\u30D5\u30A9\u30EB\u30C0\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\" },\n    \"gs.footUsage\": { zh: \"\u4F5C\u54C1\u5360\u7528\uFF1A{size}\uFF08{count} \u4EF6\uFF09\", en: \"Artwork usage: {size} ({count} items)\", ja: \"\u4F5C\u54C1\u306E\u4F7F\u7528\u91CF\uFF1A{size}\uFF08{count} \u4EF6\uFF09\" },\n    \"gs.footUsageTitle\": { zh: \"\u6D4F\u89C8\u5668\u5206\u914D\u4E0A\u9650\u7EA6 {size}\uFF1B\u5F53\u524D {pct}% \u5DF2\u7528\uFF08\u542B SW \u7F13\u5B58\u7B49\uFF09\", en: \"Browser allocation cap ~{size}; {pct}% used now (incl. SW cache, etc.)\", ja: \"\u30D6\u30E9\u30A6\u30B6\u5272\u308A\u5F53\u3066\u4E0A\u9650\u306F\u7D04 {size}\uFF1B\u73FE\u5728 {pct}% \u4F7F\u7528\u4E2D\uFF08SW \u30AD\u30E3\u30C3\u30B7\u30E5\u7B49\u3092\u542B\u3080\uFF09\" },\n    \"gs.lockLabel\": { zh: \"\u9501\u5B9A\u52A0\u5BC6\u4F5C\u54C1\uFF08\u5FD8\u6389\u5BC6\u7801\uFF09\", en: \"Lock encrypted works (forget password)\", ja: \"\u6697\u53F7\u5316\u4F5C\u54C1\u3092\u30ED\u30C3\u30AF\uFF08\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u7834\u68C4\uFF09\" },\n    \"gs.locked\": { zh: \"\u5DF2\u9501\u5B9A\u52A0\u5BC6\u4F5C\u54C1\uFF08\u5BC6\u7801\u5DF2\u4ECE\u5185\u5B58\u6E05\u9664\uFF09\", en: \"Encrypted works locked (password cleared from memory)\", ja: \"\u6697\u53F7\u5316\u4F5C\u54C1\u3092\u30ED\u30C3\u30AF\u3057\u307E\u3057\u305F\uFF08\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u30E1\u30E2\u30EA\u304B\u3089\u6D88\u53BB\uFF09\" },\n    \"gs.newFolderDefault\": { zh: \"\u65B0\u6587\u4EF6\u5939\", en: \"New folder\", ja: \"\u65B0\u3057\u3044\u30D5\u30A9\u30EB\u30C0\" },\n    \"gs.newFolderTitle\": { zh: \"\u65B0\u5EFA\u6587\u4EF6\u5939\", en: \"New folder\", ja: \"\u65B0\u3057\u3044\u30D5\u30A9\u30EB\u30C0\" },\n    \"gs.pwRecorded\": { zh: \"\u5DF2\u8BB0\u4E0B\u5BC6\u7801\uFF08\u6253\u5F00\u52A0\u5BC6\u4F5C\u54C1\u65F6\u9A8C\u8BC1\uFF09\", en: \"Password recorded (verified when opening an encrypted work)\", ja: \"\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u8A18\u9332\u3057\u307E\u3057\u305F\uFF08\u6697\u53F7\u5316\u4F5C\u54C1\u3092\u958B\u304F\u3068\u304D\u306B\u691C\u8A3C\uFF09\" },\n    \"gs.pwResetDone\": { zh: \"\u5DF2\u91CD\u7F6E\u3002\u4E0B\u6B21\u52A0\u5BC6\u65F6\u8BBE\u7F6E\u65B0\u5BC6\u7801\", en: \"Reset done. Set a new password next time you encrypt\", ja: \"\u30EA\u30BB\u30C3\u30C8\u3057\u307E\u3057\u305F\u3002\u6B21\u56DE\u306E\u6697\u53F7\u5316\u6642\u306B\u65B0\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u8A2D\u5B9A\u3057\u307E\u3059\" },\n    \"gs.pwWrongRetry\": { zh: \"\u5BC6\u7801\u4E0D\u5BF9\uFF0C\u518D\u8BD5\u4E00\u6B21\", en: \"Wrong password, try again\", ja: \"\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u9055\u3044\u307E\u3059\u3002\u3082\u3046\u4E00\u5EA6\" },\n    \"gs.quotaCritical\": { zh: \"\u672C\u5730\u5B58\u50A8 {pct}% \u5DF2\u6EE1 \u2014 \u7ACB\u5373\u53BB\u56FE\u5E93\u5378\u8F7D\u4E0D\u5E38\u7528\u7684\u4F5C\u54C1\", en: \"Local storage {pct}% full \u2014 go to the gallery now and offload works you rarely use\", ja: \"\u30ED\u30FC\u30AB\u30EB\u30B9\u30C8\u30EC\u30FC\u30B8\u304C {pct}% \u4F7F\u7528\u6E08\u307F \u2014 \u4ECA\u3059\u3050\u30AE\u30E3\u30E9\u30EA\u30FC\u3067\u4F7F\u308F\u306A\u3044\u4F5C\u54C1\u3092\u9000\u907F\u3057\u3066\u304F\u3060\u3055\u3044\" },\n    \"gs.quotaWarn\": { zh: \"\u672C\u5730\u5B58\u50A8 {pct}% \u5DF2\u7528 \u2014 \u5EFA\u8BAE\u5728\u56FE\u5E93\u6574\u7406\", en: \"Local storage {pct}% used \u2014 consider tidying up in the gallery\", ja: \"\u30ED\u30FC\u30AB\u30EB\u30B9\u30C8\u30EC\u30FC\u30B8\u304C {pct}% \u4F7F\u7528\u6E08\u307F \u2014 \u30AE\u30E3\u30E9\u30EA\u30FC\u3067\u6574\u7406\u3059\u308B\u3053\u3068\u3092\u304A\u3059\u3059\u3081\u3057\u307E\u3059\" },\n    \"gs.resetPwMsg\": { zh: \"\u91CD\u7F6E\u540E\u4E0B\u6B21\u52A0\u5BC6\u53EF\u8BBE\u65B0\u5BC6\u7801\uFF1B\u4F46\u5DF2\u6709\u52A0\u5BC6\u4F5C\u54C1\u4ECD\u662F\u65E7\u5BC6\u7801\uFF0C\u65E0\u6CD5\u7528\u65B0\u5BC6\u7801\u89E3\u9501\u3002\u786E\u5B9A\u91CD\u7F6E\uFF1F\", en: \"After reset you can set a new password for future encryption; existing encrypted works keep the old password and cannot be unlocked with the new one. Reset?\", ja: \"\u30EA\u30BB\u30C3\u30C8\u5F8C\u306F\u65B0\u3057\u3044\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u8A2D\u5B9A\u3067\u304D\u307E\u3059\u304C\u3001\u65E2\u5B58\u306E\u6697\u53F7\u5316\u4F5C\u54C1\u306F\u65E7\u30D1\u30B9\u30EF\u30FC\u30C9\u306E\u307E\u307E\u3067\u3059\u3002\u30EA\u30BB\u30C3\u30C8\u3057\u307E\u3059\u304B\uFF1F\" },\n    \"gs.resetPwTitle\": { zh: \"\u91CD\u7F6E\u56FE\u5E93\u5BC6\u7801\uFF1F\", en: \"Reset gallery password?\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u30EA\u30BB\u30C3\u30C8\uFF1F\" },\n    \"gs.unlockLabel\": { zh: \"\u89E3\u9501\u52A0\u5BC6\u4F5C\u54C1\u2026\", en: \"Unlock encrypted works\u2026\", ja: \"\u6697\u53F7\u5316\u4F5C\u54C1\u306E\u30ED\u30C3\u30AF\u89E3\u9664\u2026\" },\n    \"gs.unlockNoLocalMsg\": { zh: \"\u672C\u5730\u6682\u65E0\u52A0\u5BC6\u4F5C\u54C1\u53EF\u9A8C\u8BC1\u2014\u2014\u5BC6\u7801\u5148\u6536\u4E0B\uFF0C\u7528\u5230\u65F6\u81EA\u52A8\u9A8C\u8BC1\", en: \"No local encrypted work to verify against \u2014 the password is saved for now and verified automatically when needed\", ja: \"\u30ED\u30FC\u30AB\u30EB\u306B\u691C\u8A3C\u3067\u304D\u308B\u6697\u53F7\u5316\u4F5C\u54C1\u304C\u3042\u308A\u307E\u305B\u3093\u2014\u2014\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u5148\u306B\u4FDD\u5B58\u3057\u3001\u4F7F\u7528\u6642\u306B\u81EA\u52D5\u3067\u691C\u8A3C\u3057\u307E\u3059\" },\n    \"gs.unlockTitle\": { zh: \"\u89E3\u9501\u52A0\u5BC6\u4F5C\u54C1\", en: \"Unlock encrypted works\", ja: \"\u6697\u53F7\u5316\u4F5C\u54C1\u306E\u30ED\u30C3\u30AF\u89E3\u9664\" },\n    \"gs.unlockVerifierMsg\": { zh: \"\u8F93\u5165\u56FE\u5E93\u5BC6\u7801\uFF08\u8DDF\u8D26\u53F7\u8D70\uFF09\u3002\u5FD8\u8BB0 = \u5185\u5BB9\u6C38\u4E45\u627E\u4E0D\u56DE\uFF0C\u6CA1\u6709\u540E\u95E8\", en: \"Enter the gallery password (tied to your account). If forgotten, content is unrecoverable \u2014 there is no backdoor\", ja: \"\u30AE\u30E3\u30E9\u30EA\u30FC\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\uFF08\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u7D10\u3065\u304F\uFF09\u3002\u5FD8\u308C\u305F\u5834\u5408\u3001\u5185\u5BB9\u306F\u5FA9\u5143\u3067\u304D\u307E\u305B\u3093\" },\n    \"gs.unlocked\": { zh: \"\u5DF2\u89E3\u9501\u52A0\u5BC6\u4F5C\u54C1\uFF08\u5BC6\u7801\u53EA\u5728\u5185\u5B58\uFF0C\u5173\u9875\u5373\u5FD8\uFF09\", en: \"Encrypted works unlocked (password stays in memory only, forgotten on page close)\", ja: \"\u6697\u53F7\u5316\u4F5C\u54C1\u306E\u30ED\u30C3\u30AF\u3092\u89E3\u9664\u3057\u307E\u3057\u305F\uFF08\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u30E1\u30E2\u30EA\u306E\u307F\u3001\u30DA\u30FC\u30B8\u3092\u9589\u3058\u308B\u3068\u6D88\u53BB\uFF09\" },\n    \"gs.usageUnknown\": { zh: \"\u5360\u7528\uFF1A\u672A\u77E5\", en: \"Usage: unknown\", ja: \"\u4F7F\u7528\u91CF\uFF1A\u4E0D\u660E\" },\n    \"gs.usedSuffix\": { zh: \" \u00B7 \u5DF2\u7528 {pct}%\", en: \" \u00B7 {pct}% used\", ja: \" \u00B7 {pct}% \u4F7F\u7528\" },\n    \"gv.badge.cloudOnly\": { zh: \"\u7EAF\u4E91\u7AEF\uFF08\u672A\u62C9\u5230\u672C\u5730\uFF09\", en: \"Cloud only (not downloaded)\", ja: \"\u30AF\u30E9\u30A6\u30C9\u306E\u307F\uFF08\u672A\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\uFF09\" },\n    \"gv.badge.conflictBoth\": { zh: \"\u4E91\u7AEF\u4E0E\u672C\u673A\u5404\u6709\u65B0\u6539\u52A8 \u2014\u2014 \u6253\u5F00\u6216\u63A8\u9001\u65F6\u4F1A\u8BF7\u4F60\u88C1\u51B3\", en: \"New changes both in the cloud and on this device \u2014 you'll be asked to resolve on open or push\", ja: \"\u30AF\u30E9\u30A6\u30C9\u3068\u3053\u306E\u7AEF\u672B\u306E\u4E21\u65B9\u306B\u65B0\u3057\u3044\u5909\u66F4\u304C\u3042\u308A\u307E\u3059\u2014\u2014\u958B\u304F\u304B\u30D7\u30C3\u30B7\u30E5\u6642\u306B\u9078\u629E\u3092\u6C42\u3081\u3089\u308C\u307E\u3059\" },\n    \"gv.badge.dirtyBoth\": { zh: \"\u672C\u5730+\u4E91\u7AEF \u00B7 \u672C\u5730\u6709\u672A\u63A8\u6539\u52A8\", en: \"Local+cloud \u00B7 unpushed local edits\", ja: \"\u30ED\u30FC\u30AB\u30EB+\u30AF\u30E9\u30A6\u30C9 \u00B7 \u672A\u30D7\u30C3\u30B7\u30E5\u306E\u5909\u66F4\u3042\u308A\" },\n    \"gv.badge.float\": { zh: \"\u4EC5\u672C\u5730 \u00B7 \u6709\u672A\u4E0A\u4F20\u7684\u6539\u52A8\uFF08\u4ECE\u672A\u540C\u6B65\uFF09\", en: \"Local only \u00B7 unsynced edits (never uploaded)\" },\n    \"gv.badge.ghost\": { zh: \"\u4E91\u7AEF\u526F\u672C\u5DF2\u88AB\u79FB\u52A8\u6216\u5220\u9664\uFF0C\u672C\u5730\u6709\u672A\u63A8\u9001\u7684\u4FEE\u6539 \u2014\u2014 \u53EF\u300C\u91CD\u547D\u540D\u7559\u5B58\u300D\u6216\u300C\u4E22\u5F03\u300D\", en: \"Cloud copy was moved or deleted while local has unpushed edits \u2014 \u201Crename & keep\u201D or \u201Cdiscard\u201D\", ja: \"\u30AF\u30E9\u30A6\u30C9\u5074\u304C\u79FB\u52D5/\u524A\u9664\u3055\u308C\u3001\u30ED\u30FC\u30AB\u30EB\u306B\u672A\u30D7\u30C3\u30B7\u30E5\u306E\u5909\u66F4\u304C\u3042\u308A\u307E\u3059\u2014\u2014\u300C\u6539\u540D\u3057\u3066\u4FDD\u6301\u300D\u304B\u300C\u7834\u68C4\u300D\u3092\" },\n    \"gv.badge.localOnly\": { zh: \"\u4EC5\u672C\u5730\uFF08\u672A\u4E0A\u4F20\u4E91\u7AEF\uFF09\", en: \"Local only (not uploaded)\", ja: \"\u30ED\u30FC\u30AB\u30EB\u306E\u307F\uFF08\u672A\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\uFF09\" },\n    \"gv.badge.localPlain\": { zh: \"\u672C\u5730\", en: \"Local\", ja: \"\u30ED\u30FC\u30AB\u30EB\" },\n    \"gv.badge.newerOnCloud\": { zh: \"\u4E91\u7AEF\u6709\u65B0\u7248\u672C \u2014\u2014 \u6253\u5F00\u4F1A\u81EA\u52A8\u66F4\u65B0\u5230\u4E91\u7AEF\u7248\", en: \"A newer version exists in the cloud \u2014 opening will update to it\", ja: \"\u30AF\u30E9\u30A6\u30C9\u306B\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u3042\u308A\u307E\u3059\u2014\u2014\u958B\u304F\u3068\u81EA\u52D5\u7684\u306B\u66F4\u65B0\u3055\u308C\u307E\u3059\" },\n    \"gv.badge.pendingGone\": { zh: \"\u4E91\u7AEF\u90A3\u4EFD\u6CA1\u4E86\uFF0C\u8FD9\u53F0\u8FD8\u7559\u7740\u4E00\u4EFD\u5E72\u51C0\u7684\u526F\u672C \u2014\u2014 \u300C\u5904\u7406\u2026\u300D\u91CC\u9009\uFF1A\u4E91\u7AEF\u8986\u76D6\u672C\u5730\uFF08\u8FD9\u4EFD\u8FDB\u56DE\u6536\u7AD9\uFF09\u6216\u672C\u5730\u8986\u76D6\u4E91\u7AEF\uFF08\u4F20\u56DE\u53BB\uFF09\uFF1B\u5BBD\u9650\u671F\u540E\u81EA\u52A8\u79FB\u5165\u56DE\u6536\u7AD9\", en: \"Cloud copy is gone; this device still holds a clean copy \u2014 use \u201CResolve\u2026\u201D: cloud overwrites local (to trash) or local overwrites cloud (upload again); auto-trashed after the grace period\", ja: \"\u30AF\u30E9\u30A6\u30C9\u5074\u306F\u6D88\u3048\u3001\u3053\u306E\u7AEF\u672B\u306B\u30AF\u30EA\u30FC\u30F3\u306A\u8907\u88FD\u304C\u6B8B\u3063\u3066\u3044\u307E\u3059\u2014\u2014\u300C\u51E6\u7406\u2026\u300D\u3067\uFF1A\u30AF\u30E9\u30A6\u30C9\u3067\u30ED\u30FC\u30AB\u30EB\u3092\u4E0A\u66F8\u304D\uFF08\u30B4\u30DF\u7BB1\u3078\uFF09\uFF0F\u30ED\u30FC\u30AB\u30EB\u3067\u30AF\u30E9\u30A6\u30C9\u3092\u4E0A\u66F8\u304D\uFF08\u518D\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\uFF09\u3002\u7336\u4E88\u671F\u9593\u5F8C\u306F\u81EA\u52D5\u3067\u30B4\u30DF\u7BB1\u3078\" },\n    \"gv.badge.syncedBoth\": { zh: \"\u672C\u5730+\u4E91\u7AEF\uFF08\u5DF2\u540C\u6B65\uFF09\", en: \"Local+cloud (synced)\", ja: \"\u30ED\u30FC\u30AB\u30EB+\u30AF\u30E9\u30A6\u30C9\uFF08\u540C\u671F\u6E08\u307F\uFF09\" },\n    \"gv.rootDir\": { zh: \"/ \u6839\u76EE\u5F55\", en: \"/ Root\", ja: \"/ \u30EB\u30FC\u30C8\" },\n    \"gv.src.both\": { zh: \"\u672C\u5730+\u4E91\u7AEF\", en: \"Local+cloud\", ja: \"\u30ED\u30FC\u30AB\u30EB+\u30AF\u30E9\u30A6\u30C9\" },\n    \"gv.src.cloud\": { zh: \"\u4E91\u7AEF\", en: \"Cloud\", ja: \"\u30AF\u30E9\u30A6\u30C9\" },\n    \"gv.src.cloudStillAlive\": { zh: \"{base}\uFF08\u4E91\u7AEF\u4ECD\u5728\uFF09\", en: \"{base} (still in cloud)\", ja: \"{base}\uFF08\u30AF\u30E9\u30A6\u30C9\u306B\u6B8B\u5B58\uFF09\" },\n    \"gv.src.local\": { zh: \"\u672C\u5730\", en: \"Local\", ja: \"\u30ED\u30FC\u30AB\u30EB\" },\n    \"gv.time.dayAgo\": { zh: \"{n} \u5929\u524D\", en: \"{n} d ago\", ja: \"{n} \u65E5\u524D\" },\n    \"gv.time.hourAgo\": { zh: \"{n} \u5C0F\u65F6\u524D\", en: \"{n} h ago\", ja: \"{n} \u6642\u9593\u524D\" },\n    \"gv.time.justNow\": { zh: \"\u521A\u521A\", en: \"Just now\", ja: \"\u305F\u3063\u305F\u4ECA\" },\n    \"gv.time.minAgo\": { zh: \"{n} \u5206\u949F\u524D\", en: \"{n} min ago\", ja: \"{n} \u5206\u524D\" },\n    \"gv.time.unknown\": { zh: \"\u672A\u77E5\", en: \"Unknown\", ja: \"\u4E0D\u660E\" },\n    \"menu.decrypt\": { zh: \"\u89E3\u9664\u52A0\u5BC6\u2026\", en: \"Decrypt\u2026\", ja: \"\u6697\u53F7\u5316\u3092\u89E3\u9664\u2026\" },\n    \"menu.encrypt\": { zh: \"\u52A0\u5BC6\u4FDD\u62A4\u2026\", en: \"Encrypt\u2026\", ja: \"\u6697\u53F7\u5316\u2026\" },\n    \"name.copySuffix\": { zh: \"\u526F\u672C\", en: \"copy\", ja: \"\u30B3\u30D4\u30FC\" },\n    \"nd.custom\": { zh: \"\u81EA\u5B9A\u4E49\u2026\", en: \"Custom\u2026\", ja: \"\u30AB\u30B9\u30BF\u30E0\u2026\" },\n    \"save.signInLater\": { zh: \"\u6682\u4E0D\", en: \"Not now\", ja: \"\u4ECA\u306F\u3057\u306A\u3044\" },\n    \"save.signInNow\": { zh: \"\u767B\u5F55\", en: \"Sign in\", ja: \"\u30ED\u30B0\u30A4\u30F3\" },\n    \"save.signInPromptTitle\": { zh: \"\u5DF2\u4FDD\u5B58\u5230\u672C\u673A\", en: \"Saved on this device\", ja: \"\u3053\u306E\u7AEF\u672B\u306B\u4FDD\u5B58\u3057\u307E\u3057\u305F\" },\n    // store busy \u6587\u6848\uFF08st.*\uFF0CWeebPaint store-ui \u7684\u6620\u5C04\u8868\u5F15\u7528\uFF0C\u975E t() \u5B57\u9762\u91CF\uFF0C\u673A\u5668\u6284\u6F0F \u2192 \u624B\u8865 2026-09-09\uFF09\n    \"st.syncPushing\": { zh: \"\u6B63\u5728\u540C\u6B65\u2026\", en: \"Syncing\u2026\", ja: \"\u540C\u671F\u4E2D\u2026\" },\n    \"st.fileRenaming\": { zh: \"\u91CD\u547D\u540D\u2026\", en: \"Renaming\u2026\", ja: \"\u540D\u524D\u5909\u66F4\u4E2D\u2026\" },\n    \"st.filePulling\": { zh: \"\u62C9\u53D6\u4E2D\u2026\", en: \"Pulling\u2026\", ja: \"\u53D6\u5F97\u4E2D\u2026\" },\n    \"st.cloudChecking\": { zh: \"\u68C0\u67E5\u4E91\u7AEF\u2026\", en: \"Checking cloud\u2026\", ja: \"\u30AF\u30E9\u30A6\u30C9\u3092\u78BA\u8A8D\u4E2D\u2026\" },\n    \"st.fileDeleting\": { zh: \"\u5220\u9664\u4E2D\u2026\", en: \"Deleting\u2026\", ja: \"\u524A\u9664\u4E2D\u2026\" },\n    \"st.trashRestoring\": { zh: \"\u6062\u590D\u4E2D\u2026\", en: \"Restoring\u2026\", ja: \"\u5FA9\u5143\u4E2D\u2026\" },\n    \"st.trashPurging\": { zh: \"\u5F7B\u5E95\u5220\u9664\u2026\", en: \"Deleting permanently\u2026\", ja: \"\u5B8C\u5168\u306B\u524A\u9664\u4E2D\u2026\" },\n    \"st.trashEmptyTrash\": { zh: \"\u6E05\u7A7A\u56DE\u6536\u7AD9\u2026\", en: \"Emptying trash\u2026\", ja: \"\u30B4\u30DF\u7BB1\u3092\u7A7A\u306B\u3057\u3066\u3044\u307E\u3059\u2026\" },\n    \"st.trashEmptyBackups\": { zh: \"\u6E05\u7A7A\u5907\u4EFD\u7BB1\u2026\", en: \"Emptying backup box\u2026\", ja: \"\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u30DC\u30C3\u30AF\u30B9\u3092\u7A7A\u306B\u3057\u3066\u3044\u307E\u3059\u2026\" },\n    \"st.fileEncrypting\": { zh: \"\u6B63\u5728\u52A0\u5BC6 {name}\u2026\", en: \"Encrypting {name}\u2026\", ja: \"\u6697\u53F7\u5316\u4E2D {name}\u2026\" },\n    \"st.fileDecrypting\": { zh: \"\u6B63\u5728\u89E3\u9664\u52A0\u5BC6 {name}\u2026\", en: \"Decrypting {name}\u2026\", ja: \"\u6697\u53F7\u5316\u89E3\u9664\u4E2D {name}\u2026\" },\n    \"st.fileRekeying\": { zh: \"\u6B63\u5728\u6362\u5BC6\u7801\u91CD\u5C01 {name}\u2026\", en: \"Re-keying {name}\u2026\", ja: \"\u30D1\u30B9\u30EF\u30FC\u30C9\u5909\u66F4\u4E2D {name}\u2026\" },\n    \"st.fileReuploading\": { zh: \"\u91CD\u65B0\u4E0A\u4F20\u2026\", en: \"Re-uploading\u2026\", ja: \"\u518D\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u4E2D\u2026\" },\n    \"st.fileUploading\": { zh: \"\u6B63\u5728\u4E0A\u4F20\u2026\", en: \"Uploading\u2026\", ja: \"\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u4E2D\u2026\" },\n    \"st.folderCreating\": { zh: \"\u65B0\u5EFA\u6587\u4EF6\u5939\u2026\", en: \"Creating folder\u2026\", ja: \"\u30D5\u30A9\u30EB\u30C0\u4F5C\u6210\u4E2D\u2026\" },\n    \"st.folderDeleting\": { zh: \"\u5220\u9664\u6587\u4EF6\u5939\u2026\", en: \"Deleting folder\u2026\", ja: \"\u30D5\u30A9\u30EB\u30C0\u524A\u9664\u4E2D\u2026\" },\n    // tLatin() \u5F15\u7528\u7684 key\uFF08\u673A\u5668\u6284\u6F0F \u2192 \u624B\u8865 2026-09-10\uFF09\n    \"cf.cloudOfflineTitle\": { zh: \"\u4E91\u7AEF\uFF1A\u79BB\u7EBF\uFF08\u65E0\u6CD5\u767B\u5F55 / \u540C\u6B65\uFF1B\u672C\u5730\u56FE\u5E93\u6B63\u5E38\uFF09\", en: \"Cloud: offline (cannot sign in / sync; local gallery works normally)\", ja: \"\u30AF\u30E9\u30A6\u30C9\uFF1A\u30AA\u30D5\u30E9\u30A4\u30F3\uFF08\u30ED\u30B0\u30A4\u30F3 / \u540C\u671F\u4E0D\u53EF\uFF1B\u30ED\u30FC\u30AB\u30EB\u30AE\u30E3\u30E9\u30EA\u30FC\u306F\u6B63\u5E38\uFF09\" },\n};\nlet _lang = \"zh\";\nlet _host = null;\nfunction interpolate(s, params) {\n    return params ? s.replace(/\\{(\\w+)\\}/g, (m, k) => (k in params ? String(params[k]) : m)) : s;\n}\n/** \u5305\u5185\u9ED8\u8BA4 t\uFF1A\u6309 lang \u53D6\uFF0C\u7F3A \u2192 zh \u2192 key\u3002 */\nexport const defaultT = (key, params) => {\n    const e = GALLERY_TEXT[key];\n    return interpolate(e?.[_lang] ?? e?.zh ?? key, params);\n};\n/** \u5BBF\u4E3B\u63A5\u7BA1\u6587\u6848\uFF08\u7F3A key \u65F6\u5BBF\u4E3B\u8FD4\u56DE null/undefined/\u7A7A\u4E32 \u2192 \u843D\u56DE\u9ED8\u8BA4\uFF09\u3002 */\nexport function configureText(opts) {\n    if (opts.lang)\n        _lang = opts.lang;\n    if (opts.t) {\n        const h = opts.t;\n        _host = (k, p) => { const v = h(k, p); return v ? v : defaultT(k, p); };\n    }\n}\nexport const t = (key, params) => (_host ?? defaultT)(key, params);\nexport const galleryTextKeys = () => Object.keys(GALLERY_TEXT);\n", "const _mem = new Map();\nlet _kv = { get: (k) => _mem.get(k) ?? null, set: (k, v) => { if (v == null)\n        _mem.delete(k);\n    else\n        _mem.set(k, v); } };\nexport function configureDeviceKv(kv) { _kv = kv; }\nexport function deviceKvGet(key) { try {\n    return _kv.get(key);\n}\ncatch {\n    return null;\n} }\nexport function deviceKvSet(key, v) { try {\n    _kv.set(key, v);\n}\ncatch { /* \u5B58\u4E0D\u8FDB\uFF08\u79C1\u5BC6\u6A21\u5F0F/\u914D\u989D\uFF09= \u9759\u9ED8\uFF0C\u8BFB\u4FA7\u56DE\u9000\u9ED8\u8BA4 */ } }\nexport function deviceKvGetJson(key, fallback) {\n    const raw = deviceKvGet(key);\n    if (raw == null)\n        return fallback;\n    try {\n        return JSON.parse(raw);\n    }\n    catch {\n        return fallback;\n    }\n}\nexport function deviceKvSetJson(key, v) { deviceKvSet(key, v === undefined ? null : JSON.stringify(v)); }\n", "// Substrate \u2014\u2014 shape-agnostic \u5E95\u5EA7\uFF08L4\uFF0C2026-06-07\uFF09\u3002WorkFileStore \u4E0E FolderStore \u5171\u4EAB\u8FD9\u4E00\u5C42\u3002\n// \u53EA\u653E\u300C\u4E0E storage shape \u65E0\u5173\u3001\u4E24\u4E2A facade \u90FD\u8981\u300D\u7684\u539F\u8BED\uFF1Abyte utils + push-serialize + \u7F16\u8F91\u6E38\u6807 + save \u5408\u6D41\u3002\n// **\u4E0D**\u653E shape \u8BED\u4E49 / \u51B2\u7A81\u7B56\u7565 / etag\u00B7parentBase \u6743\u5A01\u2014\u2014\u90A3\u4E9B\u662F work-file \u7684 If-Match \u673A\u5236\uFF0C\u4F4F store.js\uFF08WorkFileFlow\uFF09\u3002\n// \u89C1 CONTEXT.md\u300CStore\u300D\u6BB5 L4 facade \u5B9A\u7A3F\u3002\n//\n// TS \u5316\uFF08v223\uFF09\uFF1Astore \u6DF1\u6A21\u5757\u88AB Uint8Array/Blob \u7C7B\u578B bug \u96F7\u51FB\u4E24\u6B21 \u2192 \u5168\u9762 .ts + tsc --noEmit strict\u3002\n// \u8FD9\u91CC\u5B9A\u4E49\u8D2F\u7A7F\u5168 store \u7684\u5B57\u8282\u7C7B\u578B Bytes\u3002\nexport async function toU8(x) {\n    if (x == null)\n        return new Uint8Array(0);\n    if (x instanceof Uint8Array)\n        return x;\n    if (x instanceof ArrayBuffer)\n        return new Uint8Array(x);\n    if (typeof x === \"string\")\n        return new TextEncoder().encode(x);\n    if (typeof x.arrayBuffer === \"function\")\n        return new Uint8Array(await x.arrayBuffer());\n    throw new Error(\"Store: \u65E0\u6CD5\u8BC6\u522B\u7684 bytes \u7C7B\u578B\");\n}\nexport function bytesEqual(a, b) {\n    if (a.length !== b.length)\n        return false;\n    for (let i = 0; i < a.length; i++)\n        if (a[i] !== b[i])\n            return false;\n    return true;\n}\nexport function createSubstrate() {\n    // ---- \u7F16\u8F91\u6E38\u6807\uFF08\u2463\uFF09\uFF1A\u5355\u4E00 SSoT\u3002B2\uFF08work-file push\uFF09\u3001\u672C\u673A\u5408\u6D41\uFF08session\uFF09\u3001\u672C\u5730\u843D\u76D8 dirty \u5171\u7528\u540C\u4E00\u6E38\u6807\u3002\n    //   mark()        \u5185\u5BB9\u53D8\u4E86\uFF08\u4EFB\u4F55\u4F1A\u8FDB\u6301\u4E45\u5316\u6587\u6863\u7684\u72B6\u6001\u53D8\u66F4\uFF09\u2192 \u63A8\u8FDB\u6E38\u6807\u3002\n    //   markSaved()   \u672C\u5730\u843D\u76D8\u70B9\uFF1A\u8BB0\u4E0B\u300C\u5DF2\u5B58\u8FDB IDB \u7684\u6E38\u6807\u300D\u3002\n    //   localDirty()  \u672C\u5730\u672A\u843D\u76D8\uFF1F= \u6E38\u6807\u81EA\u4E0A\u6B21 markSaved \u540E\u53C8\u52A8\u8FC7\uFF08\u53D6\u4EE3 app \u6563\u843D\u7684 _docDirty \u6807\u5FD7\uFF09\u3002\n    // cloud \u672A\u63A8\u662F\u53E6\u4E00\u6B63\u4EA4\u4E8B\u5B9E\uFF0C\u8D70 cloud.isDirty\uFF08per-file\u3001\u8DE8 reload \u6301\u4E45\uFF09\uFF1B\u4E8C\u8005\u522B\u6DF7\u3002\n    let _editVersion = 0;\n    let _savedVersion = 0;\n    const edits = {\n        mark: () => { _editVersion++; },\n        version: () => _editVersion,\n        markSaved: (v) => { _savedVersion = (v == null) ? _editVersion : v; },\n        localDirty: () => _editVersion !== _savedVersion,\n    };\n    // ---- push-serialize\uFF08B1\uFF09\uFF1A\u540C\u4E00 name \u4E32\u884C\uFF0C\u6BCF\u6B21\u7B49\u524D\u4E00\u6B21\u8DD1\u5B8C\u624D\u542F\u52A8\u3002\u4E24\u4E2A shape \u90FD\u8981\uFF08\u649E\u540C\u540D\u5199\uFF09\u3002\n    const _chain = new Map();\n    function serialize(name, fn) {\n        const prev = _chain.get(name) || Promise.resolve();\n        const next = prev.then(fn, fn);\n        _chain.set(name, next.then(() => { }, () => { }));\n        return next;\n    }\n    // \u4E24\u4E2A name \u5404\u81EA\u94FE\u5C3E\u4E32\u884C\uFF08rename \u7275\u52A8\u4E24\u8EAB\u4EFD\uFF0C\u987B\u6321\u4F4F\u5BF9\u4EFB\u4E00\u540D\u7684 in-flight \u5199\uFF09\u3002\n    function serialize2(a, b, fn) {\n        const prev = Promise.all([_chain.get(a) || Promise.resolve(), _chain.get(b) || Promise.resolve()]);\n        const next = prev.then(fn, fn);\n        const tail = next.then(() => { }, () => { });\n        _chain.set(a, tail);\n        _chain.set(b, tail);\n        return next;\n    }\n    // drain\uFF1A\u53CD\u590D\u7B49\u94FE\u5C3E\u76F4\u5230\u4E00\u8F6E\u4E0B\u6765\u6CA1\u6709\u65B0\u94FE\u5C3E\u51FA\u73B0\uFF08in-flight \u7684\u6536\u5C3E\u52A8\u4F5C\u53EF\u80FD\u53C8\u6392\u4E86\u540C\u540D\u540E\u7EED\uFF0C\u5982 push\n    //   \u843D\u5730\u540E\u7684\u8865\u5199\uFF09\u3002\u8C03\u7528\u65B9\uFF08dispose\uFF09\u5DF2\u62D2\u65B0\u7528\u6237\u6001\u8C03\u7528 \u2192 \u6536\u655B\u53EA\u5DEE\u5185\u90E8\u63A5\u529B\uFF0C\u51E0\u8F6E\u5FC5\u5C3D\uFF1B100 \u8F6E\u4E0A\u9650\n    //   \u662F\u300C\u6709 bug \u4E5F\u7EDD\u4E0D\u6302\u6B7B dispose\u300D\u7684\u62A4\u680F\uFF0C\u89E6\u9876\u5373\u653E\u884C\uFF08IDB close \u4F1A\u8BA9\u6F0F\u7F51\u64CD\u4F5C\u54CD\u4EAE\u5931\u8D25\uFF0C\u4E0D\u9759\u9ED8\uFF09\u3002\n    async function drain() {\n        for (let round = 0; round < 100; round++) {\n            const tails = [..._chain.values()];\n            if (!tails.length)\n                return;\n            await Promise.all(tails);\n            const after = new Set(_chain.values());\n            if (tails.length === after.size && tails.every((t) => after.has(t)))\n                return; // \u4E00\u8F6E\u5185\u65E0\u65B0\u94FE\u5C3E \u2192 \u5DF2\u6392\u7A7A\n        }\n    }\n    // ---- save \u5408\u6D41\uFF08\u2463 coalescer\uFF09\uFF1A\u8FDE\u6309 Ctrl+S/\u70B9\u4FDD\u5B58\u4E0D\u4E32 N \u6B21\u3002app \u6CE8\u5165\u771F\u00B7\u4FDD\u5B58\u52A8\u4F5C\uFF08configure\uFF09\u3002\n    //   - \u6CA1\u5728\u8DD1 \u2192 \u7ACB\u523B\u8DD1\n    //   - \u5728\u8DD1 + \u671F\u95F4\u6CA1\u65B0\u7F16\u8F91 + \u540C\u7C7B\u578B \u2192 no-op\uFF08state \u6CA1\u53D8\uFF0C\u7701\u4E00\u6B21\u7A7A\u8F6C\uFF09\n    //   - \u5728\u8DD1 + \u671F\u95F4\u6709\u65B0\u7F16\u8F91 \u2192 queue \u5C3E\u5DF4\uFF0Cin-flight \u5B8C\u6210\u540E\u8DD1\n    //   - \u5728\u8DD1 local-only + \u7528\u6237\u6539\u4E3B\u610F push \u2192 queue push\uFF08\u4E91\u7AEF\u8FD8\u6CA1\u8986\u76D6\uFF09\n    //   - pending \u5347\u7EA7\uFF1Apush \u76D6\u8FC7 local\uFF08\u518D\u591A\u6309\u4E5F\u53EA\u4E00\u4E2A\u5C3E\u5DF4\uFF09\n    // editVersion \u53D6 edits \u7684 SSoT\uFF08\u4E0E work-file B2 \u540C\u4E00\u4E2A\u6E38\u6807\uFF09\u3002\u7EAF\u903B\u8F91\u3001\u65E0 I/O\u2014\u2014\u53EF node \u5355\u6D4B\uFF08\u6CE8\u5165 fake doLocal/doPush\uFF09\u3002\n    function createCoalescer() {\n        let pending = null;\n        let inFlight = null;\n        let startVer = 0;\n        let doLocal = async () => { }, doPush = async () => { };\n        function configure(fns = {}) {\n            if (fns.doLocal)\n                doLocal = fns.doLocal;\n            if (fns.doPush)\n                doPush = fns.doPush;\n        }\n        async function _run(type) {\n            inFlight = type;\n            startVer = _editVersion;\n            try {\n                if (type === \"push\")\n                    await doPush();\n                else\n                    await doLocal();\n            }\n            finally {\n                inFlight = null;\n                if (pending) {\n                    const next = pending;\n                    pending = null;\n                    _run(next);\n                } // \u4E0D await\uFF0C\u907F\u514D\u9012\u5F52\u6808\n            }\n        }\n        function request(type) {\n            if (!inFlight) {\n                _run(type);\n                return;\n            }\n            const hasNewEdits = _editVersion !== startVer;\n            const shouldQueue = (inFlight === \"local\" && type === \"push\") ? true : hasNewEdits;\n            if (!shouldQueue)\n                return;\n            if (type === \"push\" || pending !== \"push\")\n                pending = type;\n        }\n        return { configure, request, state: () => ({ pending, inFlight, startVer }) };\n    }\n    const session = createCoalescer();\n    return { edits, session, serialize, serialize2, drain };\n}\n", "export class BypassError extends Error {\n    code = \"BYPASS\";\n    constructor(name) {\n        super(`local-head: \"${name}\" dirty \u4F46\u7F3A parentBase\uFF08\u7F16\u8F91\u6CA1\u8D70 recordEdit \u6B63\u95E8\uFF0C\u62D2\u7EDD\u53EF\u80FD\u9759\u9ED8\u8986\u76D6\u7684\u63A8\u9001\uFF09`);\n        this.name = \"BypassError\";\n    }\n}\nexport function createLocalHead({ kv, getCloudEtag, setCloudEtag, keyPrefix = \"head\" }) {\n    const _base = new Map(); // \u672C tab \u5DF2\u89C1\u4E91 tip\uFF08\u5185\u5B58\uFF0Cper-tab\uFF09\n    const _parent = new Map(); // \u672A\u63A8\u679D\u5206\u53C9\u81EA\u54EA\uFF08\u5185\u5B58\uFF0Cper-tab\uFF09\n    const _dirtyMem = new Map(); // per-tab \u6D3B dirty \u89C6\u56FE\uFF08\u8986\u76D6 kv durable\uFF09\n    const _edits = new Map(); // per-tab \u4FDD\u5B58\u8BA1\u6570\uFF080.15.2\uFF0C\u89C1\u63A5\u53E3\u6CE8\u91CA\uFF09\n    const dirtyKey = (n) => `${keyPrefix}.dirty:${n}`;\n    function isDirtyThisTab(name) {\n        if (_dirtyMem.has(name))\n            return _dirtyMem.get(name); // per-tab \u6D3B\u89C6\u56FE\u4F18\u5148\n        return kv.get(dirtyKey(name)) === \"1\"; // durable \u515C\u5E95\uFF08reload \u540E\uFF09\n    }\n    // \u300C**\u4EFB\u4F55** tab \u6709\u672A\u63A8\u5B57\u8282\u5417\u300D\u2014\u2014durable \u2228 \u672C tab \u5185\u5B58\u3002\u7ED9**\u9A71\u9010\u5B88\u536B**\u7528\uFF0C\u522B\u62FF\u5B83\u505A If-Match \u5224\u65AD\u3002\n    //\n    // \u4E3A\u4EC0\u4E48\u4E0D\u80FD\u628A isDirty \u672C\u8EAB\u6539\u6210\u300Cdurable \u7684 true \u8D62\u300D\uFF08\u5BA1\u8BA1\u63D0\u8FC7\uFF0C\u8BD5\u8FC7\uFF0C\u4F1A\u70B8\uFF09\uFF1A\n    //   isDirty \u9A71\u52A8 ifMatchFor \u7684 episode \u8BED\u4E49\u3002tab A \u63A8\u6210\u529F\u540E\u81EA\u5DF1 clean\uFF08_parent \u5DF2\u5220\u3001_base \u5DF2\u77E5\uFF09\uFF0C\n    //   \u6B64\u65F6 tab B \u7F16\u8F91\u5199\u4E86 durable dirty=1 \u2014\u2014 \u82E5 A \u7684 isDirty \u56E0\u6B64\u53D8 true\uFF0CA \u7684 ifMatchFor \u5C31\u4F1A\u8D70\u8FDB\n    //   dirty \u5206\u652F\u3001\u53D1\u73B0\u6CA1\u6709 _parent \u800C _base \u5DF2\u77E5 \u2192 \u629B BypassError\uFF0CA \u4ECE\u6B64\u63A8\u4E0D\u52A8\u3002\n    //   \u8C31\u7CFB\u89C6\u89D2**\u672C\u6765\u5C31\u8BE5\u662F per-tab \u7684**\uFF08W2 \u7EA2\u7EBF\uFF09\uFF0C\u8FD9\u4E00\u70B9\u6CA1\u9519\u3002\n    //\n    // \u9519\u7684\u662F\u62FF per-tab \u89C6\u89D2\u53BB\u56DE\u7B54\u4E00\u4E2A**\u5168\u5C40**\u95EE\u9898\u3002\u9A71\u9010\u95EE\u7684\u662F\u300C\u8FD9\u4EFD\u5B57\u8282\u522B\u5904\u8FD8\u6709\u6CA1\u6709\u300D\u2014\u2014\n    //   tab B \u521A\u5199\u4E0B\u7684\u672A\u63A8\u5B57\u8282\uFF0C\u5BF9 tab A \u7684\u5185\u5B58\u4E0D\u53EF\u89C1\uFF0C\u4F46\u5B83\u5728 durable \u8F68\u4E0A\u660E\u660E\u767D\u767D\u3002\n    //   \u65E7\u7248 offload \u7528 isDirty \u5B88\u95E8\uFF1AB \u7F16\u8F91 \u2192 A \u7684\u5185\u5B58\u4ECD\u662F false \u2192 \u5B88\u536B\u653E\u884C \u2192 hardDelete \u6389 B \u7684\u672A\u63A8\u5B57\u8282\u3002\n    //   \u00A7A\u300Cdirty \u6C38\u4E0D\u88AB\u9A71\u9010\u300D\u5728\u8FD9\u91CC\u76F4\u63A5\u5931\u5B88\u3002\n    function isDirtyAnywhere(name) {\n        return kv.get(dirtyKey(name)) === \"1\" || isDirtyThisTab(name);\n    }\n    function _setDirty(name, d) {\n        _dirtyMem.set(name, d);\n        if (d)\n            kv.set(dirtyKey(name), \"1\");\n        else\n            kv.remove(dirtyKey(name));\n    }\n    function seenBase(name) {\n        return _base.has(name) ? _base.get(name) : getCloudEtag(name); // \u7F3A _base \u2192 \u56DE\u9000\u5171\u4EAB etag\uFF08\u975E\u7834\u574F\u6027\uFF09\n    }\n    function ifMatchFor(name) {\n        if (isDirtyThisTab(name)) {\n            if (_parent.has(name))\n                return _parent.get(name); // \u6B63\u5E38\uFF1A\u6D3E\u751F\u81EA\u6355\u83B7\u7684 parent\uFF08\u53EF\u4E3A null=\u65B0\u6587\u4EF6\uFF09\n            // dirty \u4F46\u6CA1\u6355\u83B7 parent\uFF1Abase \u5DF2\u77E5 \u2192 \u8C31\u7CFB\u65AD\u88C2\uFF08bypass\uFF09\u2192 \u54CD\u4EAE\u629B\uFF1Bbase \u672A\u77E5 \u2192 \u771F\u00B7\u65B0\u6587\u4EF6\u9996\u63A8\u4E0D\u5E26 If-Match\n            const b = _base.has(name) ? _base.get(name) : null;\n            if (b != null)\n                throw new BypassError(name);\n            return null;\n        }\n        return _parent.has(name) ? _parent.get(name) : seenBase(name); // clean\uFF1A\u901A\u5E38\u8D70 seenBase\uFF08clean \u5F3A\u63A8=\u52A0\u5BC6 swap\uFF09\n    }\n    function recordEdit(name) {\n        _edits.set(name, (_edits.get(name) ?? 0) + 1);\n        if (!isDirtyThisTab(name)) { // clean\u2192dirty \u8FB9\u6CBF\uFF1A\u5934\u4E00\u6B21\u6355\u83B7\uFF08episode \u5185\u5E42\u7B49\uFF09\n            _parent.set(name, _base.has(name) ? _base.get(name) : null);\n        }\n        _setDirty(name, true);\n    }\n    function markSeen(name, etag) {\n        _base.set(name, etag);\n        if (isDirtyThisTab(name) && !_parent.has(name))\n            _parent.set(name, etag); // reload re-capture\uFF1A\u95ED\u5408\u552F\u4E00\u7F3A parent \u7A97\u53E3\uFF08\u8C31\u7CFB=per-tab\uFF09\n    }\n    function markSynced(name, etag) {\n        _base.set(name, etag);\n        _setDirty(name, false);\n        _parent.delete(name); // \u672C\u5730\u5DF2=\u4E91\u7AEF \u2192 episode \u7ED3\u675F\n        // \u2605 \u91C7\u7EB3\u4E91\u7248 = **\u672C\u5730 at-rest \u5B57\u8282\u6B64\u523B\u7B49\u540C\u4E91\u7AEF\u67D0\u4E00\u7248**\u3002\u8FD9\u662F\u5173\u4E8E\u300C\u76D8\u4E0A\u90A3\u4EFD\u5B57\u8282\u662F\u8C01\u300D\u7684\u4E8B\u5B9E\uFF0C\n        //   \u4E0D\u662F per-tab \u89C6\u89D2 \u2192 \u5FC5\u987B\u843D durable \u8F68\uFF0C\u5426\u5219 reload \u540E\u65E0\u4EBA\u77E5\u9053\u672C\u5730\u8FD9\u4EFD\u7684\u51FA\u8EAB\u3002\n        //\n        //   \u26A0 \u522B\u628A\u8FD9\u884C\u5F53 R1 \u8FDD\u89C4\u5220\u6389\uFF08cloud-sync.ts:220 \u300Cpull \u662F\u7EAF\u8BFB\uFF0C\u7EDD\u4E0D\u5199 etag/dirty\u300D\uFF09\uFF1A\n        //   R1 \u9632\u7684\u662F**\u5B57\u8282\u8FD8\u6CA1\u843D\u5730\u5C31\u5148\u5199 etag**\uFF08\u5199\u4E86\u5C31\u5F3A\u9000 \u2192 kv \u6307\u65B0\u7248\u3001\u76D8\u4E0A\u662F\u65E7\u5B57\u8282 \u2192 \u4E0B\u6B21 push\n        //   If-Match \u901A\u8FC7 = \u9759\u9ED8\u8986\u76D6\u4E91\u7AEF\u5206\u53C9\u7248\uFF09\u3002markSynced \u7684\u56DB\u4E2A\u8C03\u7528\u70B9\u5168\u5728**\u5B57\u8282\u843D\u5730\u6210\u529F\u4E4B\u540E**\uFF1A\n        //   safe-resolve \u7684 safePull(local.save \u4E4B\u540E) / tryHeal(\u9010\u5B57\u8282\u786E\u8BA4\u76F8\u7B49) / weakOverride(\u63A8\u6210\u529F\u540E)\u3001\n        //   identity.acquire(local.save \u4E4B\u540E)\u3002\u6240\u4EE5\u8FD9\u91CC\u5199 etag \u6B63\u662F R1 \u8BF4\u7684\u300C\u7531 caller \u5728\u5B57\u8282\u771F\u6B63\u843D\u5730\n        //   \u6210\u529F\u540E\u663E\u5F0F\u63D0\u4EA4\u300D\u2014\u2014R1 \u8981\u6C42\u7684\u5C31\u662F\u8FD9\u4E2A\u65F6\u673A\uFF0C\u4E0D\u662F\u7981\u6B62\u63D0\u4EA4\u3002\n        //\n        //   \u26A0 \u4E5F\u522B\u5F53 W2 \u8FDD\u89C4\uFF08_base/_parent \u7EDD\u4E0D\u8FDB\u5171\u4EAB kv\uFF09\uFF1AW2 \u62A4\u7684\u662F**\u8C31\u7CFB\u89C6\u89D2**\uFF08\u522B tab \u7684 base \u6C61\u67D3\n        //   \u672C tab \u7684 If-Match \u5224\u65AD\uFF09\u3002\u8FD9\u91CC\u5199\u7684\u662F cloud-sync \u90A3\u6761\u672C\u6765\u5C31\u5171\u4EAB\u7684 etag \u8F68\uFF0C\u8BED\u4E49\u662F\u300C\u76D8\u4E0A\u5B57\u8282\n        //   \u5BF9\u5E94\u4E91\u7AEF\u54EA\u4E00\u7248\u300D\u2014\u2014\u76D8\u672C\u6765\u5C31\u662F\u8DE8 tab \u5171\u4EAB\u7684\uFF0C\u5199\u5B83\u4E0D\u5236\u9020\u65B0\u7684\u5171\u4EAB\u3002\n        //\n        //   \u4E0D\u5199\u4F1A\u600E\u6837\uFF08v418\u2192v431 \u7684\u771F\u673A bug\uFF09\uFF1A\u4ECE\u4E91\u7AEF acquire/pull \u6765\u7684\u753B\u53EA\u6709\u5185\u5B58 _base\uFF0C\n        //   reload\uFF08**\u6BCF\u6B21\u7248\u672C\u66F4\u65B0\u90FD\u662F\u4E00\u6B21 reload**\uFF09\u540E seenBase \u56DE\u9000\u5230\u7A7A\u7684 durable \u8F68 \u2192 null \u2192\n        //   freshness.ts \u7684 `if (base != null)` \u91CD\u6355\u5B88\u536B\u8FDB\u4E0D\u53BB \u2192 _parent \u6C38\u8FDC\u8865\u4E0D\u56DE\u6765 \u2192\n        //   ifMatchFor \u8FD4 null \u2192 conflictBehavior:\"fail\" \u2192 409 \u2192 \u4FDD\u5B58\u6C38\u8FDC\u63A8\u4E0D\u4E0A\u53BB\uFF0C\u4E14\u81EA\u6211\u5EF6\u7EED\n        //   \uFF08\u6C38\u8FDC\u4E0D push \u6210\u529F = \u6C38\u8FDC\u4E0D\u5199 etag = \u6BCF\u6B21\u7248\u672C\u66F4\u65B0\u5FC5\u590D\u53D1\uFF09\u3002\n        setCloudEtag?.(name, etag); // etag \u4E3A null\uFF08provider \u6CA1\u56DE\uFF09\u2192 \u6E05\u6389\u9648\u65E7\u503C\uFF0C\u5B81\u53EF\u9000\u5316\u6210\u300C\u8C31\u7CFB\u4E0D\u660E\u300D\u8D70\u51B2\u7A81\u9762\n    }\n    function onPushed(name, newEtag, dirtyAfter) {\n        // \u62A4\u680F\uFF08F0\uFF09\uFF1A\u300C\u6CA1\u62FF\u5230\u65B0 etag\u300D+\u300C\u5F53\u5E72\u51C0\u843D\u5730\u300D= \u4E0D\u53EF\u8868\u793A\u7684\u72B6\u6001\u2014\u2014\u6E05\u4E86 dirty\uFF0Cbase \u5374\u505C\u5728\u65E7\u503C\uFF0C\n        //   \u672A\u63A8\u5B57\u8282\u5C31\u6B64\u53EF\u88AB offload \u5408\u6CD5\u9A71\u9010\uFF08MASTER \u00A7A \u7EA2\u7EBF\uFF09\u3002\u8FD9**\u4E0D\u5E94\u8BE5\u53D1\u751F**\uFF1B\u53D1\u751F\u4E86\u5C31\u662F\u8C03\u7528\u65B9\n        //   \u628A\u300C\u843D\u5730\u672A\u786E\u8BA4\u300D\u5F53\u6210\u4E86\u300C\u843D\u5730\u6210\u529F\u300D\uFF08push.ts \u66FE\u72AF\uFF0C\u89C1\u90A3\u91CC\u7684 deferred \u5206\u652F\uFF09\u3002\u54CD\u4EAE\u629B\uFF0C\u522B\u81EA\u6108\u2014\u2014\n        //   \u62A4\u680F\u7684\u610F\u4E49\u5C31\u662F\u540C\u4E00\u4E2A\u9519\u518D\u72AF\u65F6\u80FD\u88AB\u62E6\u4F4F\uFF0C\u800C\u4E0D\u662F\u6084\u6084\u4EA7\u51FA\u9519\u8BEF\u7ED3\u679C\u3002\n        if (newEtag == null && !dirtyAfter) {\n            throw new Error(`local-head: \"${name}\" onPushed(null etag, dirtyAfter=false) \u2014\u2014 \u843D\u5730\u672A\u786E\u8BA4\u4E0D\u5F97\u6E05 dirty`);\n        }\n        if (newEtag != null)\n            _base.set(name, newEtag); // \u53EA\u63A8\u8FDB\u81EA\u5DF1\u7684 base\n        if (dirtyAfter) {\n            _setDirty(name, true); // \u5E42\u7B49\uFF1A\u663E\u5F0F\u6807\u810F\uFF08\u4E0D\u4F9D\u8D56\u5165\u573A\u6001\uFF0C\u517C heal \u540E\u8DEF\u5F84\uFF09\n            _parent.set(name, newEtag ?? null); // \u5269\u4F59\u7F16\u8F91\u6D3E\u751F\u81EA\u521A\u63A8\u4E0A\u53BB\u7684\u7248\u672C\uFF08B2 \u4E0D\u4E22\u7F16\u8F91\uFF09\n        }\n        else {\n            _setDirty(name, false);\n            _parent.delete(name); // \u5E72\u51C0\u843D\u5730\uFF1Aepisode \u7ED3\u675F\n        }\n    }\n    // \u6E05\u6389\u8BE5 name \u7684\u5168\u90E8\u4E91\u7AEF\u8C31\u7CFB\uFF08\u5220\u9664 / \u964D\u7EA7 local-only / \u6539\u540D\u540E\u7684\u65E7\u540D\uFF09\u3002\n    //   \u2605 **\u4E24\u6761\u8F68\u9053\u4E00\u8D77\u6E05**\uFF08v434\uFF09\u3002\u65E7\u7248\u53EA\u6E05\u5185\u5B58\u90A3\u6761\uFF0C\u628A durable \u7684 files.etag:<name> \u7559\u5728\u539F\u5730\uFF0C\n    //   \u4E8E\u662F\u540E\u6765\u4E00\u4E2A**\u540C\u540D\u65B0\u6587\u4EF6**\u7684 seenBase \u4F1A\u56DE\u9000\u5230\u90A3\u4E2A\u6B7B etag\uFF08local-head.ts \u7684 seenBase \u56DE\u9000\uFF09\u2192\n    //   offload \u7684 `seenBase(name) == null \u2192 local-only \u62D2\u7EDD\u9A71\u9010` \u5B88\u536B**\u4ECE\u62D2\u7EDD\u53D8\u6210\u653E\u884C**\uFF0C\n    //   \u800C\u90A3\u6B63\u662F\u300C\u4E91\u7AEF\u6709\u4E2A\u540C\u540D\u4F46\u4E0D\u662F\u6211\u7684\u6587\u4EF6\u300D\u8FD9\u4E00\u60C5\u5F62\u2014\u2014\u5B88\u536B\u5B58\u5728\u7684\u7406\u7531\u672C\u8EAB\u3002\n    function forget(name) {\n        _base.delete(name);\n        _parent.delete(name);\n        _dirtyMem.delete(name);\n        kv.remove(dirtyKey(name));\n        setCloudEtag?.(name, null);\n    }\n    return { ifMatchFor, seenBase, isDirtyThisTab, isDirtyAnywhere, recordEdit, markSeen, markSynced, onPushed, forget, editCount: (name) => _edits.get(name) ?? 0 };\n}\n", "let reporter = null;\n/** create-store \u88C5\u914D\u65F6\u6CE8\u5165\uFF08\u628A ui.reportError \u63A5\u4E0A\uFF09\u3002 */\nexport function setStoreErrorReporter(fn) {\n    reporter = fn;\n}\n/** \u6DF1\u6A21\u5757\u4E0A\u62A5\u5165\u53E3\u3002\u672A\u88C5\u914D\uFF08\u5982\u7EAF mock \u6D4B\u8BD5\u672A\u63A5 ui\uFF09\u2192 \u9759\u9ED8 no-op\uFF08\u4E0D throw\u3001\u4E0D console\uFF09\u3002 */\nexport function reportStoreError(err, level = \"error\") {\n    // 0.12.1\uFF1AIdbSuspendedError = \u9875\u9762\u6B63\u5728\u8FDB bfcache / \u5DF2\u51BB\u7ED3\u65F6\u88AB\u5F03\u7684\u4E8B\u52A1\u2014\u2014\u4E0D\u662F\u6570\u636E\u9519\uFF0C\u4EFB\u4F55\u7EA7\u522B\u4E00\u5F8B\u964D\u5230 log\uFF08\u522B\u5728\u590D\u6D3B\u7684\u9875\u9762\u4E0A\u5F39\u6A2A\u5E45\uFF09\u3002\n    if (err?.name === \"IdbSuspendedError\" && level !== \"log\")\n        level = \"log\";\n    reporter?.(err, level);\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md + CONTEXT.md\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore\u3002\n//\n// seal\uFF08\u6DF1\u6A21\u5757\uFF09\u2014\u2014 at-rest \u52A0\u5BC6**\u900F\u660E**\u7684 router\u3002\u5355\u4E00\u804C\u8D23 = \"encode \u6C38\u51FA\u660E\u6587\uFF0C\u5199\u524D\u6309 name \u7684\n//   at-rest \u52A0\u5BC6\u6001\u5305\u58F3\u3001\u8BFB\u540E\u89E3\u58F3\uFF0C\u5BC6\u7801\u975E\u4EA4\u4E92\"\u3002\u5BB9\u5668\u683C\u5F0F\u7684\u91CD\u6D3B\u5728 crypto-container\uFF08\u53E6\u4E00\u6A21\u5757\uFF09\uFF1B\n//   seal \u53EA\u7BA1**\u8DEF\u7531 + \u975E\u4EA4\u4E92\u5BC6\u7801**\uFF0Ccrypto \u539F\u8BED\u7ECF seam \u6CE8\u5165 \u2192 \u4E0D\u78B0\u771F 7z \u4E5F\u80FD\u6D4B\u8DEF\u7531\u3002\n//\n// \u7EA2\u7EBF\uFF1A\u660E\u6587\u7EDD\u4E0D\u843D\u76D8\uFF08\u52A0\u5BC6\u6587\u4EF6 + \u65E0\u5BC6\u7801 \u2192 \u5199\u8DEF\u5F84**\u54CD\u4EAE\u629B LOCKED**\uFF0C\u7EDD\u4E0D\u9759\u9ED8\u5B58\u660E\u6587\uFF09\u3002\n//   \u8BFB\u8DEF\u5F84\u9501\u5B9A\uFF08\u65E0/\u9519\u5BC6\u7801\uFF09\u2192 \u8FD4 null\uFF08**\u4E0D\u5F39\u7A97**\uFF1B\u89E3\u9501\u5FAA\u73AF\u662F UI \u5728 busy \u5916\u7684\u4E8B\uFF0C\u89C1 README.md \u00A77\uFF09\u3002\nimport { toU8 } from \"../base/substrate.js\";\nimport { reportStoreError } from \"../base/error-handling.js\"; // \u5168\u63A5\u4F46\u5206\u7EA7\uFF1A\u9759\u9ED8 swallow \u4E5F funnel\uFF08\u4E0D\u6539\u63A7\u5236\u6D41\uFF09\nexport class LockedError extends Error {\n    code = \"LOCKED\";\n    constructor(name) { super(`\u300C${name}\u300D\u5DF2\u52A0\u5BC6\u4E14\u672A\u89E3\u9501\uFF08\u9700\u8981\u5BC6\u7801\uFF09`); this.name = \"LockedError\"; }\n}\n/** meta.bin \u91CC\u7684\u300C\u771F\u6269\u5C55\u540D\u300D\uFF1A\u4ECE\u8EAB\u4EFD\u6700\u540E\u4E00\u4E2A\u70B9\u63A8\u5BFC\uFF1B\u6CA1\u6709\u70B9 \u2192 undefined\uFF08packContainer \u843D \"bin\"\uFF09\u3002\u53EA\u770B\u6700\u540E\u4E00\u6BB5\uFF08\u5939\u540D\u91CC\u7684\u70B9\u4E0D\u7B97\uFF09\u3002\n *  0.16.0 \u5B9A\u7684\uFF1A**\u8FD9\u91CC\u6545\u610F\u4ECD\u6309\u6700\u540E\u4E00\u4E2A\u70B9\u53D6\uFF0C\u4E0D\u6309 docKinds \u7684\u540E\u7F00\u53D6**\u2014\u2014meta.bin \u662F\u4EBA\u62FF 7-Zip \u624B\u5DE5\u6062\u590D\u65F6\u770B\u7684\u8F85\u52A9\u4EF6\uFF0C\u5168\u5BB6\u6CA1\u6709\u7A0B\u5E8F\u8BFB\u5B83\uFF0C\n *  \u65C1\u8FB9\u7684 `name` \u5DF2\u7ECF\u8BB0\u7740\u5B8C\u6574\u8EAB\u4EFD\uFF1B\u6539\u5B83\u7B49\u4E8E\u52A8\u7528\u6237\u6587\u4EF6\u91CC\u7684\u5B57\u8282\uFF0C\u6CA1\u6709\u7406\u7531\u30020.15.2 \u7684 crypt.ext \u56DE\u9000\u503C\u5DF2\u5220\uFF08\u56DB\u4E2A\u5BBF\u4E3B\u7684\u8EAB\u4EFD\u90FD\u5E26\u540E\u7F00\uFF0C\u56DE\u9000\u6C38\u8FDC\u8D70\u4E0D\u5230\uFF09\u3002 */\nexport function cryptExtFor(name) {\n    const base = name.includes(\"/\") ? name.slice(name.lastIndexOf(\"/\") + 1) : name;\n    const dot = base.lastIndexOf(\".\");\n    if (dot > 0 && dot < base.length - 1)\n        return base.slice(dot + 1);\n    return undefined;\n}\nexport function createSeal(cfg) {\n    const { looksContainer, pack, unpack, getPassword, getPrev, makePeek } = cfg;\n    function isContainer(bytes) { return looksContainer(bytes); }\n    // \u7528\u5185\u5B58\u5BC6\u7801\u8DD1\u4E00\u6B21\u3002\u6CA1\u5BC6\u7801 / \u9519\u5BC6\u7801\uFF08code=WRONG_PASSWORD\uFF09\u2192 null\uFF1B\u5176\u5B83\u9519\u8BEF\u539F\u6837\u4E0A\u629B\u3002**\u6C38\u4E0D\u5F39\u7A97\u3001\u6C38\u4E0D\u5FAA\u73AF\u3002**\n    async function withPassword(name, attempt) {\n        const pw = getPassword(name);\n        if (!pw)\n            return null;\n        try {\n            return await attempt(pw);\n        }\n        catch (e) {\n            if (e?.code === \"WRONG_PASSWORD\")\n                return null;\n            throw e;\n        }\n    }\n    // \u5305\u58F3\uFF1ASSoT = at-rest \u5B57\u8282\u672C\u8EAB\uFF08\u65E0\u767B\u8BB0\u8868\u53EF\u6F02\u79FB\uFF09\u3002\n    //   \u660E\u6587 / \u8F93\u5165\u5DF2\u662F\u5BB9\u5668\uFF08\u642C\u8FD0\u8DEF\u5F84\uFF09\u2192 \u539F\u6837\uFF1B\u52A0\u5BC6\u6587\u4EF6 + \u65E0\u5BC6\u7801 \u2192 \u54CD\u4EAE LOCKED\uFF08\u7EDD\u4E0D\u9759\u9ED8\u5B58\u660E\u6587\uFF09\u3002\n    async function sealForWrite(name, plain) {\n        if (await looksContainer(plain))\n            return plain; // \u5DF2\u662F\u5BB9\u5668\uFF08\u642C\u8FD0\u8DEF\u5F84\uFF09\u2192 \u4E0D\u4E8C\u6B21\u5305\n        const prev = await getPrev(name);\n        if (!prev || !(await looksContainer(prev)))\n            return plain; // \u660E\u6587\u6587\u4EF6\n        const pw = getPassword(name);\n        if (!pw)\n            throw new LockedError(name);\n        let peek = null;\n        if (makePeek) {\n            try {\n                peek = await makePeek(new Blob([plain]));\n            }\n            catch (e) {\n                reportStoreError(e, \"log\");\n                peek = null;\n            }\n        }\n        const container = await pack({ dataBytes: plain, fileName: name, ext: cryptExtFor(name), peek, password: pw });\n        return await toU8(container);\n    }\n    // \u89E3\u58F3\uFF1A\u660E\u6587\u539F\u6837\uFF1B\u5BB9\u5668\u2192\u5185\u5B58\u5BC6\u7801\u89E3\uFF1B\u9501\u5B9A\uFF08\u65E0/\u9519\u5BC6\u7801\uFF09\u2192 null\u3002\n    async function unsealForRead(name, bytes) {\n        if (!(await looksContainer(bytes)))\n            return bytes;\n        const res = await withPassword(name, (pw) => unpack(bytes, pw));\n        return res ? res.dataBlob : null;\n    }\n    return { isContainer, sealForWrite, unsealForRead, withPassword };\n}\n", "// \u8EAB\u4EFD\uFF08identifier\uFF09\u7684\u8BED\u6CD5\u3002created 2026-09-29 by Claude Fable 5.1\uFF08\u63D0\u6848 ai-docs/20260929-proposal-doc-types.md\uFF0Cuser 2026-09-29 \u6279\uFF09\n//\n// \u8FD9\u662F\u5E93\u91CC**\u552F\u4E00**\u5141\u8BB8\u5207\u8EAB\u4EFD\u3001\u62FC\u8EAB\u4EFD\u7684\u5730\u65B9\u3002\u5BBF\u4E3B\u5728 createStore \u65F6\u628A\u81EA\u5DF1\u6709\u54EA\u51E0\u79CD\u6587\u6863\u3001\u5404\u81EA\u4EE5\u4EC0\u4E48\u7ED3\u5C3E\u62A5\u4E00\u6B21\uFF08docKinds \u8868\uFF09\uFF0C\n// \u4E4B\u540E\u300C\u8FD9\u4E2A\u8EAB\u4EFD\u662F\u4E0D\u662F\u6587\u6863\u3001\u4E3B\u5E72\u5728\u54EA\u3001\u540E\u7F00\u4ECE\u54EA\u5F00\u59CB\u3001\u4E91\u7AEF\u90A3\u4E2A\u540D\u5B57\u662F\u4E0D\u662F\u52A0\u5BC6\u5BB9\u5668\u300D\u5168\u90E8\u4ECE\u8FD9\u5F20\u8868\u63A8\u5BFC\u3002\n// 2026-09-29 \u4E4B\u524D\u8FD9\u4E9B\u95EE\u9898\u6563\u5728\u4E03\u516B\u4E2A\u56DE\u8C03\u91CC\u5404\u7B54\u5404\u7684\uFF08toName / crypt.ext / isZip / docExts / gallery \u7684 naming\u3001isDoc\u3001isZipDoc\u2026\uFF09\uFF0C\n// \u6839\u5B50\u662F\u5BB6\u65CF\u51FA\u751F\u65F6\u5047\u8BBE\u300C\u4E00\u4E2A app \u4E00\u79CD\u6587\u6863\u4E00\u4E2A\u6269\u5C55\u540D\u300D\uFF1BWXHW \u540C\u65F6\u6709 .txt \u7A3F\u548C .webxiaoheiwu.zip \u4E66\u4E4B\u540E\u5168\u574F\u4E86\u3002\n//\n// \u7528\u8BCD\uFF08user \u9010\u8BCD\u5B9A\u7684\uFF0C\u522B\u6539\uFF09\uFF1A\n//   identifier \u8EAB\u4EFD = \u5E93\u5BF9\u5916\u8BF4\u7684\u300C\u8FD9\u662F\u54EA\u4E00\u4EFD\u6587\u6863\u300D\uFF0C\u5F62\u5982 `\u6587\u4EF6\u5939/\u4E3B\u5E72\u540E\u7F00`\u3002\u6539\u540D\u3001\u632A\u6587\u4EF6\u5939\u5C31\u662F\u6362\u8EAB\u4EFD\uFF08transponder \u53F7\u53EF\u4EE5\u91CD\u8BBE\uFF09\u3002\n//   folder     = \u8EAB\u4EFD\u91CC\u6700\u540E\u4E00\u4E2A `/` \u4E4B\u524D\uFF1B\"\" = \u6700\u5916\u5C42\u3002\n//   stem       = \u4E3B\u5E72\uFF0C\u4EBA\u770B\u7684\u3001\u4EBA\u6253\u7684\u90A3\u4E00\u622A\u3002\n//   suffix     = \u8EAB\u4EFD\u7684\u7ED3\u5C3E\uFF0C\u542B\u70B9\uFF0C\u53EF\u4EE5\u591A\u6BB5\uFF08\".webxiaoheiwu.zip\"\uFF09\u3002**\u6574\u4E32\u6BD4\u5BF9\uFF0C\u4E0D\u6570\u70B9**\uFF1A\u548C Python \u5B57\u7B26\u4E32\u7684 endswith / removesuffix\n//                \u4E00\u4E2A\u610F\u601D\uFF0C\u548C pathlib \u90A3\u4E2A\u53EA\u53D6\u6700\u540E\u4E00\u4E2A\u70B9\u7684 `.suffix` \u4E0D\u662F\u4E00\u56DE\u4E8B\u3002\n//   kind       = app \u7ED9\u8FD9\u79CD\u6587\u6863\u8D77\u7684\u6807\u7B7E\uFF0C\u5E93\u539F\u6837\u5E26\u7740\uFF0C\u4E0D\u89E3\u91CA\u3002\n// \u5E95\u4E0B\u90A3\u4E00\u5C42\uFF08\u4E91\u76D8\u548C\u672C\u5730\u6587\u4EF6\u5939\u91CC\u771F\u5B9E\u7684\u6587\u4EF6\uFF09\u4ECD\u7136\u7528 path / name / \u6269\u5C55\u540D \u8FD9\u4E9B\u8BCD\uFF0C\u90A3\u91CC\u5C31\u662F\u6587\u4EF6\u7CFB\u7EDF\u7684\u610F\u601D\uFF1B\u8EAB\u4EFD\u8FD9\u4E00\u5C42\u4E0D\u501F\u7528\u5B83\u4EEC\u3002\n//\n// \u7EAF\u51FD\u6570\u3001\u96F6 IO\u3002\u5E93\u5185 cloud-sync / trash-merge / local-cache / move-aside / seal \u90FD\u4ECE\u8FD9\u91CC\u53D6\u7B54\u6848\uFF1Bgallery \u548C\u5BBF\u4E3B\u4E5F\u76F4\u63A5\u7528 store.identifiers\u3002\n/** \u52A0\u5BC6\u5BB9\u5668\u5728\u4E91\u7AEF\u591A\u51FA\u6765\u7684\u90A3\u4E00\u622A\uFF08ADR-0012\uFF1A\u5916\u58F3\u662F\u660E\u6587 STORE zip\uFF09\u3002\u5E95\u4E0B\u90A3\u4E00\u5C42\u7684\u4E8B\uFF0C\u5BBF\u4E3B\u770B\u4E0D\u89C1\u3002 */\nexport const SEAL_SUFFIX = \".zip\";\n/** \u68C0\u67E5\u8868\uFF1A\u683C\u5F0F\u3001\u91CD\u590D\u3001\u548C\u52A0\u5BC6\u540E\u7F00\u7684\u6B67\u4E49\u3002\u6709\u95EE\u9898 \u2192 \u629B\uFF08createStore \u5F53\u573A\u5931\u8D25\uFF0C\u7EDD\u4E0D\u5E26\u7740\u4E00\u5F20\u4F1A\u8BA4\u9519\u6587\u4EF6\u7684\u8868\u8DD1\u8D77\u6765\uFF09\u3002 */\nexport function validateDocKinds(docKinds) {\n    if (!Array.isArray(docKinds))\n        throw new Error(\"docKinds must be an array (pass [] to declare that this app has no document kinds)\");\n    const seen = new Set();\n    const plain = new Set(); // \u4E0D\u5E26 stem \u7684\u884C\uFF08\u4E00\u4E2A\u540E\u7F00\u6700\u591A\u4E00\u884C\uFF09\n    for (const k of docKinds) {\n        if (!k || typeof k.kind !== \"string\" || !k.kind)\n            throw new Error(`docKinds: every row needs a non-empty kind (got ${JSON.stringify(k)})`);\n        if (typeof k.suffix !== \"string\" || k.suffix.length < 2 || !k.suffix.startsWith(\".\"))\n            throw new Error(`docKinds[${k.kind}]: suffix must start with \".\" and have at least one character after it (got ${JSON.stringify(k.suffix)})`);\n        if (k.suffix.includes(\"/\") || /\\s$/.test(k.suffix))\n            throw new Error(`docKinds[${k.kind}]: suffix must not contain \"/\" or end with whitespace (got ${JSON.stringify(k.suffix)})`);\n        if (k.container !== \"raw\" && k.container !== \"zip\")\n            throw new Error(`docKinds[${k.kind}]: container must be \"raw\" or \"zip\" (got ${JSON.stringify(k.container)})`);\n        if (k.tier !== undefined && k.tier !== \"work\" && k.tier !== \"auto-backup\" && k.tier !== \"resource\")\n            throw new Error(`docKinds[${k.kind}]: tier must be \"work\" | \"auto-backup\" | \"resource\" (got ${JSON.stringify(k.tier)})`);\n        if (k.stem !== undefined && !(k.stem instanceof RegExp))\n            throw new Error(`docKinds[${k.kind}]: stem must be a RegExp (got ${JSON.stringify(String(k.stem))})`);\n        if (k.stem && (k.stem.global || k.stem.sticky))\n            throw new Error(`docKinds[${k.kind}]: stem must not use the g / y flags (stateful)`);\n        if (k.validate !== undefined && typeof k.validate !== \"function\")\n            throw new Error(`docKinds[${k.kind}]: validate must be a function`);\n        const low = k.suffix.toLowerCase();\n        if (!k.stem) {\n            if (plain.has(low))\n                throw new Error(`docKinds: suffix ${JSON.stringify(k.suffix)} declared twice (rows sharing a suffix must carry a stem pattern; at most one may not)`);\n            plain.add(low);\n        }\n        seen.add(low);\n    }\n    // \u548C\u52A0\u5BC6\u540E\u7F00\u7684\u6B67\u4E49\uFF1A\u67D0\u4E2A\u540E\u7F00 S \u4EE5 \".zip\" \u7ED3\u5C3E\uFF0C\u53BB\u6389 \".zip\" \u5269 T\uFF1B\u82E5\u8868\u91CC\u6709 S1 \u4F7F\u5F97 T \u4E0E S1 \u4E92\u4E3A\u7ED3\u5C3E\uFF08\u542B T \u4E3A\u7A7A\uFF09\uFF0C\n    //   \u90A3\u4E48\u4E91\u7AEF\u7684 `X + S` \u65E2\u53EF\u4EE5\u8BFB\u6210\u300C\u660E\u6587\u7684 S \u6587\u6863\u300D\u4E5F\u53EF\u4EE5\u8BFB\u6210\u300CS1 \u6587\u6863 X+T \u7684\u52A0\u5BC6\u5BB9\u5668\u300D\u2192 \u62D2\u7EDD\u3002\n    const lows = [...seen];\n    for (const s of lows) {\n        if (!s.endsWith(SEAL_SUFFIX))\n            continue;\n        const t = s.slice(0, -SEAL_SUFFIX.length);\n        for (const s1 of lows) {\n            if (t.endsWith(s1) || s1.endsWith(t)) {\n                throw new Error(`docKinds: suffix ${JSON.stringify(s)} is ambiguous with the encryption container suffix \"${SEAL_SUFFIX}\"` +\n                    (t ? ` because ${JSON.stringify(t)} and ${JSON.stringify(s1)} overlap` : ` (a bare \".zip\" document suffix can never be told apart from a container)`) +\n                    `: a cloud file named \"X${s}\" could be either a plaintext \"${s}\" document or the encrypted container of \"X${t}\"`);\n            }\n        }\n    }\n}\nexport function createIdentifiers(docKinds) {\n    validateDocKinds(docKinds);\n    const kinds = Object.freeze(docKinds.map((k) => Object.freeze({\n        kind: k.kind, suffix: k.suffix, container: k.container, tier: k.tier ?? \"work\",\n        ...(k.stem ? { stem: k.stem } : {}), ...(k.validate ? { validate: k.validate } : {}),\n    })));\n    // \u540C\u4E00\u540E\u7F00\u7684\u51E0\u884C\u6309\u58F0\u660E\u987A\u5E8F\uFF1B\u540E\u7F00\u957F\u7684\u5148\u8BD5\uFF1A\u51E0\u4E2A\u540E\u7F00\u90FD\u547D\u4E2D\u53D6\u6700\u957F\u7684\uFF08\".webxiaoheiwu.zip\" \u4F18\u5148\u4E8E \".zip\"\uFF09\n    const bySuffix = new Map();\n    for (const k of kinds) {\n        const low = k.suffix.toLowerCase();\n        (bySuffix.get(low) ?? bySuffix.set(low, []).get(low)).push(k);\n    }\n    const suffixesLongestFirst = [...bySuffix.keys()].sort((a, b) => b.length - a.length);\n    function match(identifier) {\n        if (typeof identifier !== \"string\" || !identifier)\n            return null;\n        const slash = identifier.lastIndexOf(\"/\");\n        const folder = slash < 0 ? \"\" : identifier.slice(0, slash);\n        const base = slash < 0 ? identifier : identifier.slice(slash + 1);\n        const low = base.toLowerCase();\n        for (const s of suffixesLongestFirst) {\n            if (!(low.length > s.length && low.endsWith(s)))\n                continue;\n            const stem = base.slice(0, base.length - s.length);\n            const rows = bySuffix.get(s);\n            const row = rows.find((r) => r.stem && r.stem.test(stem)) ?? rows.find((r) => !r.stem); // 2.1.0\uFF1A\u5E26 stem \u7684\u5148\u8BD5\uFF0C\u90FD\u4E0D\u4E2D\u843D\u9ED8\u8BA4\u884C\n            if (!row)\n                continue; // \u8FD9\u4E2A\u540E\u7F00\u53EA\u6709\u5E26 stem \u7684\u884C\u4E14\u90FD\u4E0D\u4E2D \u2192 \u4E0D\u662F\u8FD9\u79CD\u6587\u6863\uFF1B\u8BD5\u66F4\u77ED\u7684\u540E\u7F00\n            return { row, d: { identifier, folder, stem, suffix: base.slice(base.length - s.length), kind: row.kind, container: row.container, tier: row.tier ?? \"work\" } };\n        }\n        return null;\n    }\n    const parse = (identifier) => match(identifier)?.d ?? null;\n    const rowOf = (identifier) => match(identifier)?.row ?? null;\n    function join(parts) {\n        const folder = parts.folder ?? \"\";\n        return `${folder ? `${folder}/` : \"\"}${parts.stem}${parts.suffix}`;\n    }\n    function sealed(identifier) { return `${identifier}${SEAL_SUFFIX}`; }\n    function fromCloud(cloudName) {\n        // \u52A0\u5BC6\u540E\u7F00**\u533A\u5206\u5927\u5C0F\u5199**\uFF1A\u5BB9\u5668\u662F\u5E93\u81EA\u5DF1\u5C01\u7684\u3001\u6C38\u8FDC\u5C0F\u5199 \".zip\"\uFF1B\u5927\u5199 \".ZIP\" \u4E0D\u662F\u5E93\u5199\u7684\uFF0C\u6309\u660E\u6587\u539F\u540D\u5BF9\u5F85\uFF080.15.2 \u540C\u6B64\u53E3\u5F84\uFF09\u3002\n        //   \u6587\u6863\u540E\u7F00\u5219\u4E0D\u5206\u5927\u5C0F\u5199\uFF08parse \u91CC\uFF09\u3002\n        if (cloudName.endsWith(SEAL_SUFFIX)) {\n            const inner = cloudName.slice(0, -SEAL_SUFFIX.length);\n            if (parse(inner))\n                return { identifier: inner, sealed: true };\n        }\n        return { identifier: cloudName, sealed: false };\n    }\n    return { kinds, parse, rowOf, join, sealed, fromCloud };\n}\n/** \u8EAB\u4EFD\u91CC\u63D2\u4E00\u6BB5\uFF08\u526F\u672C / \u649E\u540D\u65F6\u95F4\u6233 / \u5E8F\u53F7\uFF09\uFF1A\u6587\u6863 \u2192 \u4E3B\u5E72\u540E\u9762\u3001\u540E\u7F00\u524D\u9762\uFF1B\u4E0D\u662F\u6587\u6863 \u2192 \u6700\u540E\u4E00\u4E2A\u70B9\u4E4B\u524D\uFF08\u6CA1\u6709\u70B9\u5C31\u63A5\u5728\u672B\u5C3E\uFF09\u3002\n *  \u4E24\u6761\u817F\uFF08\u672C\u5730 / \u4E91\u7AEF\uFF09\u6062\u590D\u649E\u540D\u3001gallery \u590D\u5236\u90FD\u8D70\u8FD9\u4E00\u4E2A\u51FD\u6570\uFF0C\u522B\u518D\u5404\u5199\u5404\u7684\u3002 */\nexport function withStemTail(identifier, tail, ids) {\n    const d = ids.parse(identifier);\n    if (d)\n        return ids.join({ folder: d.folder, stem: `${d.stem}${tail}`, suffix: d.suffix });\n    const slash = identifier.lastIndexOf(\"/\");\n    const base = slash < 0 ? identifier : identifier.slice(slash + 1);\n    const dot = base.lastIndexOf(\".\");\n    const stem = dot > 0 ? base.slice(0, dot) : base, rest = dot > 0 ? base.slice(dot) : \"\";\n    return `${slash < 0 ? \"\" : identifier.slice(0, slash + 1)}${stem}${tail}${rest}`;\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md + CONTEXT.md\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore\u3002\n//\n// safe-resolve\uFF08\u6DF1\u6A21\u5757\uFF09\u2014\u2014 **\u6C38\u4E0D\u4E22\u5B57\u8282**\u5730\u5316\u89E3\u672C\u5730\u2194\u4E91\u7AEF\u5206\u6B67\u3002\u5355\u4E00\u804C\u8D23 = \u90A3\u6761\u4E0D\u53EF\u91CD\u6392\u7684\u987A\u5E8F\uFF1A\n//   \u5907\u4EFD\u5148\u4E8E\u8986\u76D6(A4/A10) \u00B7 \u91C7\u7EB3\u524D\u6821\u9A8C\u771F\u5BB9\u5668(N2,\u6321 captive-portal HTML) \u00B7 \u91C7\u7EB3\u540E\u7F6E etag(R1) \u00B7\n//   lost-response \u81EA\u6108(B5) \u00B7 \u51B2\u7A81\u6D3E\u53D1(keepMine/takeCloud/cancel)\u3002\n// \u5403\uFF1Acloud(pull/weakOverride) + local(backup/save) + local-head(markSynced \u843D\u5730\u8C31\u7CFB)\u3002\nimport { toU8, bytesEqual } from \"../base/substrate.js\";\nimport { reportStoreError } from \"../base/error-handling.js\"; // \u5168\u63A5\u4F46\u5206\u7EA7\uFF1A\u9759\u9ED8 swallow \u4E5F funnel\uFF08\u4E0D\u6539\u63A7\u5236\u6D41\uFF09\nexport function createSafeResolve(cfg) {\n    const { cloud, local, head, localDirty = () => false, validateAdopt, unseal = (_n, blob) => Promise.resolve(blob), onReplacing = () => { }, looksEncrypted = () => Promise.resolve(false), serialize = (_n, fn) => fn(), } = cfg;\n    const editCount = (name) => head.editCount?.(name) ?? 0;\n    // \u5B89\u5168\u62C9\u53D6\u8986\u76D6\uFF1A\u5148 backup\uFF08dirty \u624D\u5907\uFF1B\u5931\u8D25\u5373 abort\uFF0C\u7EDD\u4E0D pull/\u8986\u76D6\uFF09\u2192 \u62C9 \u2192 \u6821\u9A8C \u2192 \u8986\u76D6 \u2192 \u91C7\u7EB3\u540E\u7F6E etag \u2192 adopt\u3002\n    // \u6301\u4E45\u6001\u53EA\u5728\u539F\u5B50\u70B9\u6539\uFF1B\u5F3A\u9000\u4EFB\u4E00 await \u70B9\u53EF\u91CD\u5165\u3002\n    // forceBackup\uFF082026-08-25 user \u62CD\u677F\uFF0C\u6848\u5377 20260825-cloud-override-adopt-noop-case.md \u00A75 \u524D\u63D0\uFF09\uFF1A\n    //   takeCloud \u662F\u300C\u6587\u4EF6\u7248\u672C\u6A21\u578B\u300D\u7684\u6362\u4E16\u754C\u7EBF\uFF0C\u4E0D\u662F workspace \u64CD\u4F5C\u2014\u2014\u88AB\u6362\u6389\u7684\u5F53\u524D\u4E16\u754C\u7EBF**\u65E0\u6761\u4EF6**\u5148\u8FDB .backup\u3002\n    //   \uFF08clean-skip \u7684\u300C\u672C\u5730\u53EF\u4ECE\u4E91\u91CD\u53D6\u300D\u8BBA\u636E\u5728 takeCloud \u573A\u666F\u6070\u6070\u5931\u6548\u8FC7\uFF1A\u672C\u5730\u968F\u540E\u8986\u5199\u4E91\u7AEF\u65F6\uFF0C\u4E91\u7AEF\u90A3\u7248\u5C31\u4E0D\u518D\u515C\u5E95\u3002\uFF09\n    //   freshness \u7684\u9759\u9ED8\u5FEB\u8FDB\uFF08clean fast-forward\uFF09\u4E0D\u4F20\u5B83\u2014\u2014ADR-0016 \u7684\u4E0D spam .backup \u51B3\u7B56\u4E0D\u52A8\u3002\n    //\n    // 0.15.2\u300C\u9014\u4E2D\u53C8\u4FDD\u5B58\u300D\u5B88\u536B\uFF08WXHW \u4E24\u53F0\u8BBE\u5907\u7AEF\u5230\u7AEF\u6D4B\u8BD5 2026-09-29 \u987A\u85E4\u6478\u5230\uFF1Buser\u300C\u540C\u6B65\u5E93\u7684\u4E00\u4E2A\u6D1E \u4FEE\u300D\uFF09\uFF1A\n    //   \u4E0B\u8F7D\u8981\u82B1\u65F6\u95F4\u3002\u5F00\u5934\u5224\u8FC7\u4E00\u6B21\u810F\u4E4B\u540E\uFF0C\u7528\u6237\u7684 save() \u53EF\u80FD\u5728\u4E0B\u8F7D\u9014\u4E2D\u843D\u4E86\u65B0\u5B57\u8282\u2014\u2014\u4EE5\u524D\u4E0B\u8F7D\u5B8C\u7167\u6837\u8986\u76D6\u5E76 markSynced\uFF0C\n    //   \u90A3\u4EFD\u5B57\u8282\u65E2\u4E0D\u5728\u672C\u5730\u4E5F\u4E0D\u5728\u5907\u4EFD\u7BB1\uFF0Cdirty \u8FD8\u88AB\u6E05\u6389\u3002\u73B0\u5728\uFF1A\u5F00\u5934\u8BB0\u4E0B\u8FD9\u4E2A\u6587\u4EF6\u7684\u4FDD\u5B58\u8BA1\u6570 e0\uFF1B\u4E0B\u8F7D\u3001\u6821\u9A8C\u5B8C\u4E4B\u540E\u8FDB**\u4E34\u754C\u6BB5**\n    //   \uFF08\u7AD9\u5728\u540C\u540D\u4E32\u884C\u94FE\u4E0A\uFF0C\u548C\u7528\u6237\u4FDD\u5B58\u7684\u672C\u5730\u5199\u4E92\u65A5\uFF09\uFF1A\n    //     \u2460 \u8BA1\u6570\u53D8\u4E86 = \u9014\u4E2D\u4FDD\u5B58\u8FC7\u3002\u9759\u9ED8\u5FEB\u8FDB\uFF08\u6CA1\u4EBA\u8981\u6C42\u6362\u4E16\u754C\u7EBF\uFF09\u2192 **\u4F5C\u7F62**\uFF0C\u672C\u5730\u5206\u6BEB\u4E0D\u52A8\uFF0Cdirty \u7167\u65E7\uFF0C\u4E4B\u540E\u63A8\u9001\u81EA\u4F1A\u649E\u51B2\u7A81\u9762\uFF1B\n    //        \u7528\u6237\u70B9\u4E86\u300C\u4E91\u7AEF\u8986\u76D6\u672C\u5730\u300D\uFF08forceBackup\uFF09\u2192 \u628A\u9014\u4E2D\u4FDD\u5B58\u7684\u90A3\u4E00\u4EFD**\u518D\u5907\u4EFD\u4E00\u6B21**\uFF0C\u7136\u540E\u7167\u7528\u6237\u7684\u610F\u601D\u8986\u76D6\u3002\n    //     \u2461 \u8986\u76D6\u672C\u5730\u3002\n    //     \u2462 \u518D\u770B\u4E00\u773C\u8BA1\u6570\uFF1A\u8986\u76D6\u7684\u90A3\u4E00\u4E0B\u53C8\u4FDD\u5B58\u4E86\uFF08\u5B83\u7684\u672C\u5730\u5199\u6392\u5728\u6211\u4EEC\u540E\u9762\uFF0C\u9A6C\u4E0A\u4F1A\u843D\u6210\u6700\u7EC8\u5B57\u8282\uFF09\u2192 **\u4E0D\u63D0\u4EA4\u8C31\u7CFB**\uFF1A\n    //        \u672C\u5730\u6700\u7EC8\u662F\u300C\u65E7\u4E16\u754C + \u65B0\u6539\u52A8\u300D\uFF0Cdirty \u548C parent \u90FD\u8FD8\u662F recordEdit \u7559\u4E0B\u7684\u6837\u5B50\uFF08parent = \u65E7 base\uFF09\uFF0C\n    //        \u4E0B\u6B21\u63A8\u9001 If-Match \u65E7 etag \u2192 412 \u2192 \u51B2\u7A81\u9762\u3002\u63D0\u4EA4\u4E86\u624D\u662F\u4E8B\u6545\uFF1A\u8C31\u7CFB\u6307\u5411\u4E91\u7AEF\u65B0\u7248\u3001\u6807\u6210\u5E72\u51C0\uFF0C\u4E0B\u6B21\u63A8\u9001\u9759\u9ED8\u76D6\u6389\u4E91\u7AEF\u8D62\u5BB6\u3002\n    async function safePull(name, { adopt, forceBackup = false, inChain = false } = {}) {\n        onReplacing(true);\n        try {\n            const e0 = editCount(name);\n            let backupName;\n            // clean \u672C\u5730 = \u53EF\u4ECE\u4E91\u91CD\u53D6\u7684\u5DF2\u77E5\u7248\u672C\uFF0C\u65E0\u672A\u89C1\u5185\u5BB9\u53EF\u4E22 \u2192 \u8DF3 backup\uFF08ADR-0016\uFF0C\u4E0D spam .backup\uFF09\u3002\n            //   \u26A0 \u8BE5\u8BBA\u636E\u7684\u524D\u63D0\u662F**\u8C31\u7CFB\u5DF2\u77E5**\uFF08seenBase \u975E null\uFF1A\u672C\u5730 == \u4E91\u7AEF\u67D0\u5DF2\u77E5\u7248\uFF09\u3002!base\uFF08\u4ECE\u672A synced /\n            //   durable \u53CC\u8F68\u4E22\u5931\uFF0C\u5982 localStorage \u88AB\u6E05\u800C IDB \u5E78\u5B58\u2014\u2014dirty \u6807\u5FD7\u4F1A\u540C\u6279\u4E22\uFF09\u65F6\u672C\u5730\u5B57\u8282\u51FA\u8EAB\u4E0D\u660E\uFF0C\n            //   \u300Cclean\u300D\u4E0D\u53EF\u4FE1 \u2192 \u8986\u76D6\u524D\u5FC5 move-aside\uFF08\u00A7A\uFF1Aevery overwrite is move-aside\uFF09\u3002\u573A\u666F\u7F55\u89C1\uFF0C\u4E0D\u6784\u6210 spam\u3002\n            if (forceBackup || head.isDirtyAnywhere(name) || localDirty() || head.seenBase(name) == null) { // anywhere\uFF1A\u4EFB\u4E00 tab \u6709\u672A\u63A8 \u2192 \u8986\u76D6\u524D\u5FC5 backup\n                try {\n                    backupName = await local.backup(name);\n                }\n                catch (e) {\n                    reportStoreError(e, \"warning\");\n                    return { ok: false, reason: \"backup-failed\", error: e };\n                } // dirty \u5907\u4EFD\u5931\u8D25\u2192\u4E2D\u6B62 pull\uFF08\u4E0D\u8986\u76D6\uFF09\uFF0Cdegraded surface\n            }\n            const r = await cloud.pull(name);\n            if (!r)\n                return { ok: false, reason: \"cloud-vanished\", backupName };\n            // \u5E93\u5BF9\u52A0\u5BC6\u900F\u660E\uFF1A\u5148\u89E3\u5BC6\uFF0CvalidateAdopt \u9A8C\u7684\u662F**\u660E\u6587**\uFF08app \u770B\u771F\u660E\u6587\u6587\u6863\uFF0C\u4E0D\u662F\u5BC6\u6587\u5BB9\u5668\uFF09\u3002\n            const plain = await unseal(name, r.blob); // \u52A0\u5BC6\u4F46\u9501\u5B9A \u2192 null\uFF08\u65E0\u5BC6\u7801\u89E3\u4E0D\u5F00\uFF09\n            // N2\uFF1A\u574F\u5B57\u8282\uFF08captive-portal 200-HTML / \u635F\u574F\u4E91\u526F\u672C\uFF09\u2192 \u62D2\u7EDD\uFF0C\u7EDD\u4E0D\u8986\u76D6\u552F\u4E00\u4E00\u4EFD\u597D\u672C\u5730\uFF08clean \u6CA1 backup\uFF09\u3002\n            //   \u9501\u5B9A\u89E3\u4E0D\u5F00 \u2192 \u9000\u9A8C\u52A0\u5BC6\u5BB9\u5668\u5C01\u5957\uFF08captive-portal HTML \u4E0D\u662F\u5408\u6CD5\u5BB9\u5668\uFF1B\u65E0\u5BC6\u7801\u65F6\u80FD\u505A\u7684\u6700\u5F3A\u6821\u9A8C\uFF09\u3002\n            const ok = plain != null ? await validateAdopt(plain, name) : await looksEncrypted(r.blob);\n            if (!ok)\n                return { ok: false, reason: \"invalid-cloud-bytes\", backupName };\n            const commit = async () => {\n                const e1 = editCount(name);\n                if (e1 !== e0) { // \u2460 \u9014\u4E2D\u4FDD\u5B58\u8FC7\n                    if (!forceBackup)\n                        return { ok: false, reason: \"edited-during-pull\", backupName };\n                    try {\n                        backupName = await local.backup(name);\n                    }\n                    catch (e) {\n                        reportStoreError(e, \"warning\");\n                        return { ok: false, reason: \"backup-failed\", backupName, error: e };\n                    }\n                }\n                await local.save(name, r.blob); // \u2461 \u8986\u76D6\u672C\u5730\uFF08\u5B58 at-rest/sealed \u5B57\u8282\uFF1Bdirty \u65F6\u539F\u4EF6\u5DF2\u5907\u4EFD\uFF09\n                if (editCount(name) !== e1)\n                    return { ok: false, reason: \"edited-during-pull\", backupName }; // \u2462 \u4E0D\u63D0\u4EA4\u8C31\u7CFB\n                head.markSynced(name, r.item?.eTag ?? null); // \u91C7\u7EB3\u540E\u7F6E\uFF08R1\uFF09\uFF1Aetag/dirty \u53EA\u5728 save \u6210\u529F\u540E\u63A8\u8FDB\n                return { ok: true, backupName };\n            };\n            const done = inChain ? await commit() : await serialize(name, commit);\n            if (!done.ok)\n                return done;\n            if (adopt && plain != null)\n                await adopt(plain, name); // \u590D\u7528\u5DF2\u89E3\u5BC6\u660E\u6587\uFF1B\u9501\u5B9A\u89E3\u4E0D\u5F00\u5219\u53EA\u5FEB\u8FDB\u843D\u76D8\u3001\u4E0D adopt\n            return done;\n        }\n        finally {\n            onReplacing(false);\n        }\n    }\n    // lost-response \u81EA\u6108\uFF1A412 \u53EF\u80FD\u662F\u81EA\u5DF1\u5DF2\u843D\u76D8\u7684\u5199\u3002\u62C9\u4E91\u9010\u5B57\u8282\u6BD4\u5BF9\uFF0C\u76F8\u7B49\u5373\u91C7\u7EB3\uFF08B5/W1\uFF09\u3002\n    async function tryHeal(name, bytes) {\n        let pulled;\n        try {\n            pulled = await cloud.pull(name);\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            return false;\n        }\n        if (!pulled)\n            return false;\n        if (bytesEqual(await toU8(pulled.blob), bytes)) {\n            head.markSynced(name, pulled.item?.eTag ?? null); // \u81EA\u6108 \u2192 \u8FD9\u6B21\u63A8\u7B49\u4EF7\u5DF2\u5728\u4E91\u7AEF\n            return true;\n        }\n        return false;\n    }\n    // keepMine\uFF1A\u4E91\u7AEF\u2192.backup\uFF0C\u518D force-push \u672C\u5730\uFF08never-lose \u8986\u76D6\uFF09\u3002\u672C\u5730\u80DC\u3001loser \u8FDB .backup \u2192 \u843D\u5730\u4E3A synced\u3002\n    async function weakOverride(name, bytes, backup = true) {\n        const r = await cloud.weakOverride(name, bytes, { encrypted: await looksEncrypted(bytes), backup }); // backup=false\uFF082.1.0 \u4E8C\u7B49\u81EA\u52A8\u5907\u4EFD\uFF09\uFF1A\u8F93\u7684\u90A3\u4EFD\u4E0D\u8FDB .backup\n        // F0 \u7EA2\u7EBF\u540C\u6B3E deferred guard\uFF08push.ts:73-77 \u7684\u5F62\u72B6\uFF0C2026-08-25 \u6848\u5377 \u00A74(b) \u8865\uFF09\uFF1Aprovider \u6CA1\u56DE item/eTag\n        //   = \u843D\u5730\u672A\u786E\u8BA4\uFF08\u54CD\u5E94\u4E22\u5931/\u5206\u5757\u541E body\uFF09\u3002\u65E7\u7248\u65E0\u6761\u4EF6 markSynced(name, null)\u2014\u2014dirty \u6E05\u3001etag \u6E05\u3001badge\n        //   \u5047 synced\uFF0C\u4E14\u4E0B\u6B21\u63A8 no-base fail 409\u3002\u2192 \u4E0D markSynced\uFF08dirty/parent \u539F\u6837\u4FDD\u4F4F\uFF09\uFF0C\u62A5 deferred\uFF1B\n        //   \u4E0B\u6B21 push If-Match \u65E7 base \u2192 \u82E5\u4E0A\u4F20\u5176\u5B9E\u843D\u4E86\u5219 412 \u2192 tryHeal \u9010\u5B57\u8282\u6BD4\u5BF9\u81EA\u6108\uFF08\u7EC4\u5408\u95ED\u73AF\uFF09\u3002\n        if (!(r.item && r.item.eTag))\n            return { backedUp: r.backedUp, deferred: true };\n        head.markSynced(name, r.item.eTag);\n        return { backedUp: r.backedUp, deferred: false };\n    }\n    // 3 \u9009\u9879\u6D3E\u53D1\uFF08README.md \u00A77\uFF09\uFF1AtakeCloud=safePull \u00B7 keepMine=weakOverride \u00B7 cancel=\u4EC0\u4E48\u90FD\u4E0D\u52A8\uFF08\u7559 dirty\uFF09\u3002\n    async function resolveConflict(name, choice, ctx = {}) {\n        if (choice === \"takeCloud\") {\n            const r = await safePull(name, { adopt: ctx.adopt, forceBackup: true, inChain: ctx.inChain }); // \u6362\u4E16\u754C\u7EBF \u2192 \u5F53\u524D\u4E16\u754C\u7EBF\u65E0\u6761\u4EF6\u8FDB .backup\uFF08user 2026-08-25 \u62CD\u677F\uFF09\n            return r.ok\n                ? { status: \"resolved\", resolution: \"takeCloud\", backupName: r.backupName }\n                : { status: \"unresolved\", reason: r.reason, backupName: r.backupName };\n        }\n        if (choice === \"keepMine\" && ctx.bytes != null) {\n            const r = await weakOverride(name, ctx.bytes, ctx.loserBackup !== false);\n            if (r.deferred)\n                return { status: \"unresolved\", reason: \"deferred\", backedUp: r.backedUp }; // \u843D\u5730\u672A\u786E\u8BA4 \u2260 \u5DF2\u5316\u89E3\uFF1Adirty \u4FDD\u4F4F\uFF0C\u4E0B\u6B21\u63A8\u81EA\u6108\uFF08tryHeal\uFF09\n            return { status: \"resolved\", resolution: \"keepMine\", backedUp: r.backedUp };\n        }\n        return { status: \"cancelled\" };\n    }\n    return { safePull, tryHeal, weakOverride, resolveConflict };\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md + CONTEXT.md\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore\u3002\n//\n// push\uFF08\u6DF1\u6A21\u5757\uFF09\u2014\u2014 \u4E32\u884C + If-Match + \u91CD\u8BD5 + \u51B2\u7A81 surface \u7684\u63A8\u3002\u5355\u4E00\u804C\u8D23 = \u540C\u6B65**\u7F16\u6392**\uFF1A\n//   \u5B83\u81EA\u5DF1\u4E0D\u6301\u8C31\u7CFB/\u4E0D\u89E3\u52A0\u5BC6/\u4E0D\u5316\u89E3\u51B2\u7A81\uFF0C\u800C\u662F**\u7F16\u6392**\u4E09\u4E2A\u6DF1\u6A21\u5757\uFF1A\n//     local-head.ifMatchFor\uFF08If-Match + bypass \u5B88\u536B\uFF09\u00B7 seal.sealForWrite\uFF08\u660E\u6587\u2192at-rest \u5305\u58F3\uFF09\u00B7\n//     safe-resolve.tryHeal/resolveConflict\uFF08\u81EA\u6108/\u6C38\u4E0D\u4E22\u5B57\u8282\u5316\u89E3\uFF09\u00B7 local-head.onPushed\uFF08\u843D\u5730\u8C31\u7CFB\uFF09\u3002\n//   \u4E32\u884C = substrate.serialize\uFF08\u540C name \u4E32\u884C\uFF0CB1\uFF09\u3002\nimport { toU8 } from \"../base/substrate.js\";\nconst passBusy = (_l, fn) => fn();\nconst isConflict = (e) => !!e && (e.name === \"CloudConflictError\" || e.status === 412);\n// \u9ED8\u8BA4 = 0.17.0\uFF1A4 \u6B21 \u00D7 200\u00B7n ms\uFF08\u5171 2 s\uFF09\u30020.17.1 \u66FE\u6539\u6210 5 \u6B21 1/2/4/8 s\uFF08\u71AC iOS \u5207\u7F51\u7EDC\uFF09\uFF0C0.17.2 \u9000\u56DE\u9ED8\u8BA4\u3001\u6539\u6210\u6D88\u8D39\u65B9\u663E\u5F0F\u5F00\n//   \uFF08createStore({ pushRetry: { maxAttempts: 5, backoffMs: 1000, exponential: true } })\uFF1Buser 2026-10-15\u300C\u884C\u4E3A\u53D8\u66F4\u9ED8\u8BA4\u5173\u300D\uFF09\u3002\u6A21\u5757\u7EA7\u53EF\u6539\u53EA\u7ED9\u6D4B\u8BD5\u3002\nexport const pushRetryDefaults = { maxAttempts: 4, backoffMs: 200, exponential: false };\nfunction retriable(e) {\n    const x = e;\n    const s = x?.status;\n    if (x?.message === \"Not signed in\")\n        return false; // 0.14.0\uFF1Aauth \u7F3A\u5E2D\u91CD\u8BD5\u4E5F\u4E0D\u4F1A\u597D\uFF081.2s \u767D\u9000\u907F\uFF09\uFF1B\u6B63\u5E38\u8DEF\u5F84\u5DF2\u7531 isOnline\u2227signedIn \u65E9\u9000\uFF0C\u8FD9\u91CC\u662F\u515C\u5E95\n    return (s == null || s === 429 || (s >= 500 && s <= 599)) && x?.name !== \"CloudConflictError\" && x?.name !== \"CloudNameCollisionError\";\n}\nexport function createPush(cfg) {\n    const { cloud, head, seal, safeResolve, serialize, editVersion, busy = passBusy, maxAttempts = pushRetryDefaults.maxAttempts, backoffMs = pushRetryDefaults.backoffMs, exponential = pushRetryDefaults.exponential, sleep = (ms) => new Promise((r) => setTimeout(r, ms)) } = cfg;\n    async function doPush(name, { encode, getEditVersion = editVersion, onConflict, adopt, surfaceCollision = false, onProgress, loserBackup }) {\n        const ifMatch = head.ifMatchFor(name); // \u5C01\u88C5 bypass\uFF1Adirty \u7F3A parent \u4E14 base \u5DF2\u77E5 \u2192 throw BypassError\n        const v0 = getEditVersion();\n        // 0.15.2\uFF1A\u8FD9\u4E2A\u6587\u4EF6\u7684\u4FDD\u5B58\u8BA1\u6570\u3002\u5168\u5C40\u6E38\u6807\uFF08getEditVersion\uFF09\u8981\u5BBF\u4E3B\u81EA\u5DF1\u63A8\u8FDB\uFF0C\u62C6\u5E93\u540E\u6CA1\u4EBA\u63A8\u8FDB\u8FC7 \u2192 dirtyAfter \u6052 false\uFF1A\n        //   \u63A8\u9001\u9014\u4E2D save() \u53C8\u843D\u4E86\u65B0\u5B57\u8282\uFF0C\u63A8\u5B8C\u5374\u628A dirty \u6E05\u6389\u3002\u8BA1\u6570\u7531 recordEdit \u81EA\u5DF1\u6DA8\uFF0C\u4E0D\u9760\u5BBF\u4E3B\u3002\n        const e0 = head.editCount?.(name) ?? 0;\n        const editedSince = () => getEditVersion() !== v0 || (head.editCount?.(name) ?? 0) !== e0;\n        // encode \u51FA\u660E\u6587 \u2192 seal \u6309 at-rest \u6001\u5305\u58F3\uFF08\u8C03\u7528\u65B9\u5BF9\u52A0\u5BC6\u96F6\u611F\u77E5\uFF09\u3002\u53EA\u7F16\u7801+\u5305\u58F3\u4E00\u6B21\uFF0C\u91CD\u8BD5\u590D\u7528\uFF08B5 \u9010\u5B57\u8282\u6BD4\u5BF9\u8981\u76F8\u7B49\uFF09\u3002\n        const bytes = await seal.sealForWrite(name, await toU8(await encode()));\n        const isEnc = await seal.isContainer(bytes);\n        const session = cfg.sessionFor ? await cfg.sessionFor(name, bytes) : undefined; // F-54\uFF1A\u540C\u4E00\u4EFD\u5B57\u8282\u91CD\u8BD5 / \u4E0B\u6B21\u5F00\u9875\u90FD\u8BA4\u5F97\u8FD9\u6761\u4F1A\u8BDD\n        return busy(\"sync.pushing\", async () => {\n            let attempt = 0, lastErr;\n            while (attempt < maxAttempts) {\n                attempt++;\n                try {\n                    const { item } = await cloud.push(name, bytes, { baseEtag: ifMatch, encrypted: isEnc, onProgress, session });\n                    // F0 \u7EA2\u7EBF\uFF1Aprovider \u6CA1\u56DE item/eTag = **\u843D\u5730\u672A\u786E\u8BA4**\uFF08\u5206\u5757\u54CD\u5E94 / \u4EE3\u7406\u541E body / provider \u8FDD\u7EA6\uFF09\u3002\n                    //   \u7EDD\u4E0D\u80FD\u5F53\u6210\u529F\u2014\u2014onPushed(null,false) \u4F1A\u6E05 dirty \u4E14 base \u505C\u5728\u65E7\u503C\uFF0C\u672A\u63A8\u5B57\u8282\u968F\u540E\u88AB offload\n                    //   \u5408\u6CD5\u9A71\u9010\uFF08MASTER \u00A7A\u300Cdirty \u6C38\u4E0D\u9A71\u9010\u300D\u76F4\u63A5\u5931\u5B88\uFF09\uFF0CUI \u8FD8\u663E\u793A\u300C\u5DF2\u540C\u6B65\u300D\u3002\n                    //   \u2192 \u4E0D\u8C03 onPushed\uFF08dirty/parent \u539F\u6837\u4FDD\u4F4F\uFF09\uFF0C\u62A5 deferred\uFF0C\u8BA9\u4E0A\u5C42\u91CD\u63A8\u3002\n                    if (!(item && item.eTag))\n                        return { status: \"deferred\", dirtyAfter: true };\n                    const dirtyAfter = editedSince(); // PUT \u671F\u95F4\u53C8\u6539\u8FC7 \u2192 \u4ECD unpushed\n                    head.onPushed(name, item.eTag, dirtyAfter);\n                    return { status: \"pushed\", dirtyAfter };\n                }\n                catch (e) {\n                    if (isConflict(e)) {\n                        if (await safeResolve.tryHeal(name, bytes)) { // lost-response \u81EA\u6108\n                            const dirtyAfter = editedSince();\n                            if (dirtyAfter)\n                                head.recordEdit(name); // \u7F16\u8F91\u53D1\u751F\u5728\u63A8\u671F\u95F4 \u2192 \u57FA\u4E8E\u521A\u81EA\u6108\u7684\u7248\u672C\u91CD\u6807\u810F\uFF08B2\uFF09\n                            return { status: \"healed\", dirtyAfter };\n                        }\n                        const choice = onConflict ? await onConflict({ name }) : \"cancel\"; // \u771F\u5206\u53C9 \u2192 \u4EA4 ui \u9009\uFF08\u9ED8\u8BA4 cancel=\u7559 dirty\uFF09\n                        return await safeResolve.resolveConflict(name, choice, { bytes, adopt, inChain: true, loserBackup }); // \u63A8\u9001\u672C\u8EAB\u5C31\u7AD9\u5728\u540C\u540D\u4E32\u884C\u94FE\u4E0A\uFF08push / identity / \u79BB\u7EBF\u8865\u63A8\u90FD\u662F\uFF09\n                    }\n                    // \u8C31\u7CFB\u65AD\u88C2\uFF1A\u65E0 base \u63A8\u649E\u4E0A\u4E91\u7AEF\u540C\u540D\uFF08cloud-sync \u7684 409 + \u5C3E\u5B57\u8282 differ \u2192 CloudNameCollisionError\uFF09\u3002\n                    //   \u4E24\u79CD\u60C5\u5F62\u5171\u7528\u8FD9\u4E00\u4E2A\u9519\u8BEF\uFF0C\u4F46\u8BE5\u8D70\u7684\u8DEF\u5B8C\u5168\u76F8\u53CD\uFF1A\n                    //     \u2460 **\u771F\u00B7\u65B0\u5EFA**\uFF08surfaceCollision=false\uFF09\u2192 \u4E91\u7AEF\u90A3\u4E2A\u662F\u300C\u522B\u7684\u8BBE\u5907\u5EFA\u7684\u540C\u540D\u4E0D\u540C\u7269\u300D\u3002\n                    //        \u629B\u9519\u3001\u4E24\u4EFD\u90FD\u7559\u7740\uFF0C\u662F MASTER \u00A7A \u8EAB\u4EFD\u884C\u660E\u5199\u7684\u4FDD\u8BC1\uFF08both kept\uFF09\u3002\u4E0D\u52A8\u3002\n                    //     \u2461 **\u7F16\u8F91\u65E2\u6709\u6587\u4EF6**\uFF08surfaceCollision=true\uFF09\u2192 \u672C\u5730\u6709\u3001\u4E91\u7AEF\u6709\uFF0C\u53EA\u662F\u672C\u673A\u4E0D\u77E5\u9053\u81EA\u5DF1\u6D3E\u751F\u81EA\u54EA\u4E00\u7248\n                    //        \uFF08reload \u51B2\u6389\u5185\u5B58\u8C31\u7CFB\u3001durable etag \u53C8\u4ECE\u6CA1\u5199\u8FC7\uFF09\u3002\u629B collision \u5728\u8FD9\u91CC\u662F**\u5047\u539F\u56E0 + \u6B7B\u8DEF**\uFF1A\n                    //        \u7528\u6237\u7684\u4FDD\u5B58\u4E00\u4E2A\u5B57\u8282\u90FD\u4E0A\u4E0D\u53BB\uFF0C\u4E14\u81EA\u6211\u5EF6\u7EED\uFF08\u6C38\u8FDC\u63A8\u4E0D\u6210\u529F = \u6C38\u8FDC\u4E0D\u5199 etag = \u6BCF\u6B21\u7248\u672C\u66F4\u65B0\u5FC5\u590D\u53D1\uFF09\u3002\n                    //        \u2192 \u4EA4\u7ED9\u548C 412 \u540C\u4E00\u4E2A\u51B2\u7A81\u9762\uFF1A\u62C9\u4E91\u7AEF / \u7559\u672C\u5730 / \u4EE5\u6211\u7684\u8986\u76D6\uFF08\u4E91\u7AEF loser \u8FDB .backup\uFF0Cnever-lose\uFF09\u3002\n                    //   \u4E24\u6761\u8DEF\u90FD\u4E0D\u76F2\u76EE\u8986\u76D6\u3001\u90FD\u4E0D\u4E22\u5B57\u8282\uFF1B\u5DEE\u522B\u53EA\u662F \u2461 \u7ED9\u4E86\u7528\u6237\u4E00\u6761\u51FA\u8DEF\u3002\n                    if (surfaceCollision && e?.name === \"CloudNameCollisionError\") {\n                        const choice = onConflict ? await onConflict({ name }) : \"cancel\";\n                        return await safeResolve.resolveConflict(name, choice, { bytes, adopt, inChain: true, loserBackup }); // \u63A8\u9001\u672C\u8EAB\u5C31\u7AD9\u5728\u540C\u540D\u4E32\u884C\u94FE\u4E0A\uFF08push / identity / \u79BB\u7EBF\u8865\u63A8\u90FD\u662F\uFF09\n                    }\n                    if (retriable(e) && attempt < maxAttempts) {\n                        lastErr = e;\n                        await sleep(exponential ? Math.min(backoffMs * 2 ** (attempt - 1), 15_000) : backoffMs * attempt);\n                        continue;\n                    }\n                    throw e;\n                }\n            }\n            throw lastErr;\n        });\n    }\n    // \u540C name \u4E32\u884C\uFF08B1\uFF09\uFF1A\u6BCF\u6B21 push \u7B49\u524D\u4E00\u6B21\u8DD1\u5B8C\u624D\u542F\u52A8\u3002\n    function push(name, opts) {\n        return serialize(name, () => doPush(name, opts));\n    }\n    // doPush = \u672A\u4E32\u884C\u7248\uFF1A\u7ED9\u5DF2\u5728\u81EA\u5DF1 serialize/serialize2 \u6BB5\u5185\u7684\u8C03\u7528\u65B9\uFF08identity \u7684 rename/saveAs\uFF09\uFF0C\n    //   \u907F\u514D\u540C\u540D\u5D4C\u5957 serialize \u81EA\u9501\u3002\n    return { push, doPush };\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md + CONTEXT.md\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore\u3002\n//\n// freshness\uFF08\u6DF1\u6A21\u5757\uFF09\u2014\u2014 \u8FDB\u5165/\u4E8B\u4EF6\u65F6\u7684\"\u4E91\u7AEF\u52A8\u6CA1\u52A8 \u2192 clean \u5FEB\u8FDB / dirty surface\"\u3002\u5355\u4E00\u804C\u8D23 =\n//   freshness gate\uFF08ADR-0016\uFF09\uFF1A\u6BD4 seenBase vs \u4E91\u7AEF etag\uFF1Bclean \u4E14\u52A8\u8FC7 \u2192 \u9759\u9ED8\u65E0\u635F\u5FEB\u8FDB\uFF1B\n//   dirty \u4E14\u52A8\u8FC7 \u2192 \u4EA4 ui \u9009\uFF08\u7EDD\u4E0D\u9759\u9ED8\u8986\u76D6 dirty\uFF09\u3002\u7F16\u6392 local-head.seenBase/isDirty + safe-resolve.safePull\u3002\n//   open = \u5F00 session \u7684 gate\uFF08probe \u53EF\u8DF3\u5230\u79BB\u7EBF\uFF09\uFF1Brefresh = \u4E8B\u4EF6\u9A71\u52A8(focus/visibility/online)\u7684\u7EAF\u5E72\u51C0\u5FEB\u8FDB\u3002\nimport { reportStoreError } from \"../base/error-handling.js\"; // \u5168\u63A5\u4F46\u5206\u7EA7\uFF1A\u9759\u9ED8 swallow \u4E5F funnel\uFF08\u4E0D\u6539\u63A7\u5236\u6D41\uFF09\nconst passBusy = (_l, fn) => fn();\nexport function createFreshness(cfg) {\n    const { cloud, head, safeResolve, busy: _busy = passBusy, hints, lineageFromDurable = true } = cfg;\n    // 0.18.0\uFF1A\u4E91\u7AEF\u6838\u5BF9\u6CA1\u8DD1\u6210\u65F6\uFF0C\u5E72\u51C0 \u2227 \u6709 durable etag \u2192 \u4EE5\u5B83\u4E3A base\uFF08JSDoc \u89C1 FreshnessCfg.lineageFromDurable\uFF09\u3002\n    //   \u810F\u7684\u4E00\u5F8B\u4E0D\u78B0\uFF08\u810F\u526F\u672C\u7684 parent \u53EA\u80FD\u7531 recordEdit / \u4E91\u7AEF\u786E\u8BA4\u8FC7\u7684 markSeen \u7ED9\uFF1B\u4ECE durable \u8865 parent \u5728\u591A\u6807\u7B7E\u9875\u4E0B\u4F1A\u53D8\u6210\u9759\u9ED8\u8986\u76D6\uFF09\u3002\n    const adoptDurableBase = (name, localDirty) => {\n        if (!lineageFromDurable)\n            return;\n        if (head.isDirtyAnywhere(name) || (localDirty ? localDirty() : false))\n            return;\n        const d = head.seenBase(name);\n        if (d != null)\n            head.markSeen(name, d);\n    };\n    // 0.17.0\uFF1A\u521A\u5217\u8FC7\u7684\u4E91\u7AEF\u5E27\u91CC\u8FD9\u4E2A\u6587\u4EF6\u7684 etag === \u672C tab \u5DF2\u89C1 base \u2192 \u4E91\u7AEF\u6CA1\u52A8\uFF0C\u548C fetchMeta \u5F97\u5230\u540C\u6837\u7ED3\u8BBA\uFF0C\u7701\u4E00\u8D9F\u3002\n    //   \u63D0\u793A\u8BF4\u522B\u7684\uFF08\u52A8\u4E86 / \u6CA1\u6709\uFF09\u4E00\u5F8B\u4E0D\u91C7\u4FE1\uFF08\u53EF\u80FD\u6BD4\u6211\u4EEC\u81EA\u5DF1\u521A\u63A8\u7684\u8FD8\u65E7\uFF09\u3002\n    const hintedInSync = (name) => {\n        const h = hints?.peek(name);\n        const base = head.seenBase(name);\n        return !!h && base != null && h.etag === base;\n    };\n    // safePull \u5931\u8D25\u539F\u56E0 \u2192 \u7528\u6237\u80FD\u61C2\u7684\u77ED\u8BED\uFF08\u5582 reportStoreError\uFF1B\u6280\u672F reason \u539F\u6837\u515C\u5E95\uFF09\u3002\n    const pullFailText = (reason) => reason === \"invalid-cloud-bytes\" ? \"\u4E91\u7AEF\u5185\u5BB9\u6CA1\u901A\u8FC7\u6821\u9A8C\uFF0C\u53EF\u80FD\u662F\u516C\u5171 Wi-Fi \u767B\u5F55\u9875\u52AB\u6301\u6216\u6587\u4EF6\u635F\u574F\"\n        : reason === \"cloud-vanished\" ? \"\u4E91\u7AEF\u6587\u4EF6\u521A\u521A\u88AB\u79FB\u52A8\u6216\u5220\u9664\"\n            : reason === \"backup-failed\" ? \"\u672C\u5730\u7559\u5E95\u5931\u8D25\uFF0C\u4E3A\u4FDD\u6570\u636E\u6CA1\u6709\u8986\u76D6\"\n                : reason;\n    async function open(name, opts = {}) {\n        const { isOnline = () => true, probe, onNewer, adopt, localDirty, busy = passBusy } = opts;\n        if (!isOnline()) {\n            adoptDurableBase(name, localDirty);\n            return { source: \"local\", reason: \"offline\" };\n        }\n        if (hintedInSync(name)) {\n            head.markSeen(name, head.seenBase(name));\n            return { source: \"local\", reason: \"in-sync\" };\n        } // \u540C\u4E0B\u9762 meta.etag===base \u5206\u652F\uFF0C\u53EA\u662F\u8BC1\u636E\u6765\u81EA\u521A\u5217\u7684\u5E27\n        return busy(\"cloud.checking\", async () => {\n            let meta;\n            if (probe) {\n                const raced = await Promise.race([\n                    cloud.fetchMeta(name).then((m) => ({ k: \"meta\", m }), (e) => ({ k: \"err\", e })),\n                    Promise.resolve(probe).then(() => ({ k: \"skip\" })),\n                ]);\n                if (raced.k === \"skip\") {\n                    adoptDurableBase(name, localDirty);\n                    return { source: \"local\", reason: \"skipped\" };\n                }\n                if (raced.k === \"err\") {\n                    adoptDurableBase(name, localDirty);\n                    return { source: \"local\", reason: \"cloud-error\" };\n                }\n                meta = raced.m;\n            }\n            else {\n                try {\n                    meta = await cloud.fetchMeta(name);\n                }\n                catch (e) {\n                    reportStoreError(e, \"log\");\n                    adoptDurableBase(name, localDirty);\n                    return { source: \"local\", reason: \"cloud-error\" };\n                }\n            }\n            if (!meta)\n                return { source: \"local\", reason: \"cloud-absent\" };\n            const base = head.seenBase(name);\n            if (base != null && meta.etag === base) {\n                // \u4E91\u7AEF === \u672C tab \u5DF2\u89C1 base\uFF08\u6CA1\u52A8\uFF09\u2192 in-sync\u3002reload \u540E\u5185\u5B58 _base \u7A7A\uFF08seenBase \u56DE\u9000\u5171\u4EAB etag\uFF09\uFF0C\n                //   \u6B64\u65F6 markSeen \u91CD\u6355 _base\uFF08dirty \u8FD8\u987A\u5E26\u91CD\u6355 _parent\uFF0Clocal-head.ts:82\uFF09\u2192 \u95ED\u5408\u300Cdirty \u4F46 _base \u7A7A \u2192\n                //   \u4E0B\u6B21\u63A8\u8D70 no-base fail \u2192 \u8BEF\u62A5 CloudNameCollisionError\u300D\u7A97\u53E3\u3002\u53EA\u5728 meta.etag===base\uFF08\u4E91\u7AEF\u6CA1\u52A8\uFF09\u8C03=\u5B89\u5168\uFF1A\n                //   \u4E91\u7AEF\u52A8\u8FC7\u4F1A\u843D\u5230\u4E0B\u9762 dirty\u2192surface \u8DEF\u5F84\uFF0C\u7EDD\u4E0D\u5728\u8FD9\u91CC\u524D\u63A8 parent\uFF08\u9632 B1 silent-overwrite\uFF09\u3002\n                head.markSeen(name, meta.etag);\n                return { source: \"local\", reason: \"in-sync\" };\n            }\n            // !base\uFF08\u65E0 baseline\uFF1A\u4ECE\u672A synced \u7684\u8840\u7EDF / \u8C31\u7CFB\u4E22\u5931\uFF09\u2227 \u4E91\u7AEF\u6709\u6587\u4EF6 \u2192 \u6309\u300C\u4E91\u7AEF\u6709\u522B\u7684\u7248\u672C\u300D\u5904\u7406\uFF0C\n            //   \u5BF9\u9F50 listing.classifySyncState \u7684 `moved = cloudMoved || !everSynced`\uFF08\u540C\u4E00\u4E8B\u5B9E\u4E0D\u8BB8\u4E24\u79CD\u7ED3\u8BBA\uFF09\u3002\n            //   \u65E7\u7248\u628A !base \u5224 in-sync = \u9759\u9ED8\u4FDD\u7559\u9648\u65E7\u672C\u5730\uFF08\u7F3A\u9677 B\uFF0C20260820-open-time-conflict-surface-handoff\uFF09\u3002\n            const dirty = head.isDirtyAnywhere(name) || (localDirty ? localDirty() : false); // \u5168\u5C40\u95EE\u9898\u7528 isDirtyAnywhere\uFF082026-08-21\uFF1A\u522B tab \u7684\u672A\u63A8\u5B57\u8282 per-tab \u89C6\u89D2\u770B\u4E0D\u89C1\uFF09\n            if (!dirty) { // clean \u2192 \u9759\u9ED8\u5FEB\u8FDB\uFF08\u65E0 sheet\uFF1BsafePull \u56E0 clean \u8DF3\u5907\u4EFD\u2014\u2014!base \u4F8B\u5916\uFF0C\u8C31\u7CFB\u672A\u77E5\u5FC5\u5907\u4EFD\uFF09\n                const r = await safeResolve.safePull(name, { adopt });\n                // \u5FEB\u8FDB\u6CA1\u627F\u8BFA\u8FC7\u4EC0\u4E48 \u2192 \u5931\u8D25\u53EA info\uFF08\u72B6\u6001\u680F\uFF0C\u4E0D banner\uFF1Bcaptive portal \u4E0B\u6BCF\u6B21 open \u90FD\u4F1A\u8D70\u5230\u8FD9\u91CC\uFF09\u3002\n                if (!r.ok && r.reason !== \"edited-during-pull\")\n                    reportStoreError(new Error(`\u300C${name}\u300D\u4E91\u7AEF\u6709\u65B0\u7248\u672C\u4F46\u6682\u65F6\u53D6\u4E0D\u5230\uFF08${pullFailText(r.reason)}\uFF09\uFF0C\u5DF2\u6253\u5F00\u672C\u5730\u7248\u672C`), \"info\"); // \u9014\u4E2D\u4FDD\u5B58\u5BFC\u81F4\u7684\u4F5C\u7F62\u4E0D\u662F\u6545\u969C\uFF1A\u672C\u5730\u6709\u4E86\u672A\u63A8\u6539\u52A8\uFF0C\u4E4B\u540E\u63A8\u9001\u81EA\u4F1A\u649E\u51B2\u7A81\u9762\n                return r.ok ? { source: \"fast-forwarded\", backupName: r.backupName } : { source: \"local\", reason: r.reason, error: r.error };\n            }\n            // dirty \u5206\u53C9 \u2192 \u4EA4 ui\uFF08takeCloud=\u62C9 / keepMine|cancel=\u7559\u672C\u5730\uFF09\n            const choice = onNewer ? await onNewer({ name, cloudEtag: meta.etag, baseEtag: base, cloudTime: meta.lastModified }) : \"cancel\";\n            if (choice === \"takeCloud\") {\n                // forceBackup\uFF1A\u8FD9\u91CC\u672C\u6765\u5C31\u662F dirty\uFF08\u5FC5\u5907\u4EFD\uFF09\uFF0C\u52A0\u5B83\u4E0D\u6539\u53D8\u5907\u4EFD\u884C\u4E3A\uFF1B\u5B83\u8868\u8FBE\u7684\u662F\u300C\u7528\u6237\u660E\u786E\u9009\u4E86\u6362\u4E16\u754C\u7EBF\u300D\u2014\u2014\n                //   \u4E0B\u8F7D\u9014\u4E2D\u53C8\u4FDD\u5B58\u8FC7\u65F6\uFF0CsafePull \u636E\u6B64\u628A\u90A3\u4E00\u4EFD\u518D\u5907\u4EFD\u4E00\u6B21\u7136\u540E\u7167\u7528\u6237\u7684\u610F\u601D\u8986\u76D6\uFF0C\u800C\u4E0D\u662F\u4F5C\u7F62\uFF080.15.2\uFF09\u3002\n                const r = await safeResolve.safePull(name, { adopt, forceBackup: true });\n                // \u7528\u6237\u663E\u5F0F\u9009\u4E86\u300C\u7528\u4E91\u7AEF\u300D\u5374\u6CA1\u6210 \u2192 warning\uFF08banner\uFF09\uFF1A\u7EDD\u4E0D\u8BA9\u7528\u6237\u4EE5\u4E3A\u6253\u5F00\u7684\u662F\u4E91\u7AEF\u7248\uFF08\u53CD\u7164\u6C14\u706F\uFF09\u3002\n                if (!r.ok)\n                    reportStoreError(new Error(`\u300C${name}\u300D\u672A\u80FD\u53D6\u56DE\u4E91\u7AEF\u7248\u672C\uFF08${pullFailText(r.reason)}\uFF09\uFF0C\u672C\u6B21\u6253\u5F00\u7684\u4ECD\u662F\u672C\u5730\u7248\u672C`), \"warning\");\n                return r.ok ? { source: \"pulled\", backupName: r.backupName } : { source: \"local\", reason: r.reason, backupName: r.backupName, error: r.error };\n            }\n            return { source: \"local\", reason: \"kept\" };\n        });\n    }\n    // \u4E8B\u4EF6\u9A71\u52A8\u5E72\u51C0\u5FEB\u8FDB\uFF1Adirty \u2192 no-op\uFF08\u7EDD\u4E0D\u5728\u4E8B\u4EF6\u91CC\u5F39 sheet\uFF1B\u540E\u7EED push \u7684 412 \u4F1A surface \u771F\u5206\u53C9\uFF09\u3002\n    async function refresh(name, opts = {}) {\n        const { isOnline = () => true, adopt, localDirty, onReplaceStart, probe, busy = passBusy, trustHints = true } = opts;\n        if (!isOnline())\n            return { status: \"offline\" };\n        if (head.isDirtyAnywhere(name) || (localDirty && localDirty()))\n            return { status: \"dirty-skip\" }; // anywhere\uFF1A\u5FEB\u8FDB\u8986\u76D6\u7684\u662F**\u5171\u4EAB**\u672C\u5730\u5B57\u8282\uFF0C\u522B tab \u7684\u672A\u63A8\u7F16\u8F91\u4E5F\u8981\u6321\n        if (trustHints && hintedInSync(name)) {\n            head.markSeen(name, head.seenBase(name));\n            return { status: \"in-sync\" };\n        } // 0.18.1\uFF1AtrustHints:false = \u9192\u6765 / \u56DE\u524D\u53F0\u8FD9\u79CD\u65F6\u523B\u4E00\u5B9A\u95EE\u4E91\u7AEF\n        return busy(\"cloud.checking\", async () => {\n            let meta;\n            try {\n                meta = await cloud.fetchMeta(name);\n            }\n            catch (e) {\n                reportStoreError(e, \"log\");\n                return { status: \"cloud-error\" };\n            }\n            if (!meta)\n                return { status: \"cloud-absent\" };\n            const base = head.seenBase(name);\n            // !base \u2227 \u4E91\u7AEF\u6709 \u2192 \u540C open\uFF1A\u6309 moved \u5904\u7406\uFF08\u5BF9\u9F50 listing\uFF1Bclean-only \u8DEF\u5F84 \u2192 \u76F4\u63A5\u5FEB\u8FDB\u91C7\u7EB3\u4E91\u7AEF\uFF09\u3002\n            if (base != null && meta.etag === base) {\n                // 0.16.2\uFF082026-10-08\uFF0CMoonSinger\u300C\u5199\u7740\u5199\u7740\u8FC7\u4E00\u4F1A\u5C31\u8DF3\u4E00\u6B21\u51B2\u7A81\u9762\u300D\u6848\uFF09\uFF1Ain-sync \u4E5F\u8981 markSeen \u91CD\u6355 _base\u2014\u2014\u548C open \u7684\u540C\u4E00\u5206\u652F\u5BF9\u79F0\u3002\n                //   reload \u540E\u5185\u5B58 _base \u7A7A\uFF1B\u5BBF\u4E3B\u8981\u662F\u5728\u767B\u5F55**\u4E4B\u524D**\u5C31\u5F00\u4E86\u6587\u6863\uFF08MoonSinger / WXHW \u7684 boot \u987A\u5E8F\uFF1A\u5EFA store \u2192 \u672C\u5730\u6062\u590D \u2192 initAuth\uFF09\uFF0C\n                //   open \u7684 gate \u56E0\u4E91\u7AEF\u4E0D\u53EF\u8FBE\u8DF3\u8FC7\u3001\u6CA1\u91CD\u6355\uFF1B\u767B\u5F55\u540E\u8D70\u7684\u662F\u8FD9\u91CC\uFF08pullIfClean\uFF09\u2014\u2014\u4EE5\u524D\u76F4\u63A5 return\uFF0C_base \u6C38\u8FDC\u7A7A \u2192\n                //   \u672C tab \u7B2C\u4E00\u6B21\u7F16\u8F91 recordEdit \u6355\u5230 parent=null \u2192 \u63A8\u4E0D\u5E26 If-Match \u2192 conflictBehavior:\"fail\" \u2192 409 \u2192 \u8BEF\u62A5\n                //   CloudNameCollisionError \u51B2\u7A81\u9762\uFF08\u6BCF\u6B21 reload \u4E00\u6B21\uFF1B\u4EBA\u9009\u300C\u672C\u5730\u8986\u76D6\u4E91\u7AEF\u300DmarkSynced \u4E4B\u540E\u624D\u597D\uFF09\u3002\n                //   \u5B89\u5168\u6027\u540C open \u90A3\u4E00\u884C\uFF1A\u4E91\u7AEF === \u672C tab \u5DF2\u89C1 base\uFF08\u6CA1\u52A8\uFF09\u624D\u8C03\uFF1B\u4E14\u8FDB\u5230\u8FD9\u91CC\u4E4B\u524D isDirtyAnywhere \u5DF2\u7ECF\u6321\u8FC7\u2014\u2014\u53EA\u7ED9\u5E72\u51C0 tab \u91CD\u6355\uFF0C\n                //   \u7EDD\u4E0D\u5728\u4E91\u7AEF\u52A8\u8FC7\u65F6\u524D\u63A8 parent\uFF08B1 silent-overwrite \u5B88\u4F4F\uFF09\u3002\n                head.markSeen(name, meta.etag);\n                return { status: \"in-sync\" };\n            }\n            if (head.isDirtyAnywhere(name) || (localDirty && localDirty()))\n                return { status: \"dirty-skip\" }; // anywhere\uFF1A\u5FEB\u8FDB\u8986\u76D6\u7684\u662F**\u5171\u4EAB**\u672C\u5730\u5B57\u8282\uFF0C\u522B tab \u7684\u672A\u63A8\u7F16\u8F91\u4E5F\u8981\u6321  // fetchMeta \u671F\u95F4\u7528\u6237\u52A8\u4E86\u7B14 \u2192 \u653E\u5F03\n            if (onReplaceStart)\n                onReplaceStart();\n            // \u9003\u751F race\uFF082026-08-25\uFF09\uFF1Aprobe \u5148\u5230 \u2192 \"escaped\"\uFF08\u5206\u53C9 consent\uFF09\u3002safePull \u7EE7\u7EED\u5728\u540E\u53F0\u8DD1\u5B8C = \u539F\u540D\n            //   \u7F13\u5B58\u9759\u9ED8\u5237\u65B0\uFF08\u8FD9\u91CC\u6CA1\u4F20 adopt \u65F6\u753B\u5E03\u4E0D\u78B0\uFF1B\u9519\u8BEF funnel \u5230 log\uFF0C\u4E0D\u6253\u6270\u5DF2\u8D70\u4EBA\u7684\u7528\u6237\uFF09\u3002\n            const pulling = safeResolve.safePull(name, { adopt });\n            if (probe) {\n                const winner = await Promise.race([pulling.then((r) => ({ r })), Promise.resolve(probe).then(() => null)]);\n                if (winner == null) {\n                    pulling.catch((e) => reportStoreError(e, \"log\"));\n                    return { status: \"escaped\" };\n                }\n                return winner.r.ok ? { status: \"fast-forwarded\" } : winner.r.reason === \"edited-during-pull\" ? { status: \"dirty-skip\" } : { status: \"ff-failed\", reason: winner.r.reason };\n            }\n            const r = await pulling;\n            if (!r.ok && r.reason === \"edited-during-pull\")\n                return { status: \"dirty-skip\" }; // 0.15.2\uFF1A\u4E0B\u8F7D\u9014\u4E2D\u672C\u5730\u6709\u4E86\u6539\u52A8 \u2192 \u8FD9\u6B21\u5FEB\u8FDB\u4F5C\u7F62\uFF08\u540C\u300C\u672C\u6765\u5C31\u810F\u300D\uFF09\n            return r.ok ? { status: \"fast-forwarded\" } : { status: \"ff-failed\", reason: r.reason };\n        });\n    }\n    return { open, refresh };\n}\n", "export function createFreshHints(opts = {}) {\n    const ttl = opts.ttlMs ?? 30_000;\n    const now = opts.now ?? (() => Date.now());\n    const map = new Map();\n    return {\n        note(name, meta) { map.set(name, { meta, at: now() }); },\n        peek(name) {\n            const h = map.get(name);\n            if (!h)\n                return null;\n            if (now() - h.at > ttl) {\n                map.delete(name);\n                return null;\n            }\n            return h.meta;\n        },\n        forget(name) { map.delete(name); },\n    };\n}\n", "// \u6DF1\u6A21\u5757\u7B56\u7565\uFF1Amove-aside\uFF08\u5220\u9664 / \u8986\u76D6\u524D\u7559\u5E95\uFF09\u7684**\u547D\u540D + \u9690\u85CF\u547D\u540D\u7A7A\u95F4**\u7EA6\u5B9A\u3002\u89C4\u5219\u53EA\u5199\u5728\u8FD9\u91CC\uFF0C\n// \u4E0D\u6563\u5230 app\u3002tier \u65E0\u5173\u2014\u2014cloud \u7528 .trash/ /.backup/ \u6587\u4EF6\u5939\uFF0Clocal \u7528 blob-partition \u7684 trash/backup \u5206\u533A\n// \uFF08\u4E0D\u662F\u952E\u524D\u7F00\uFF1Av415 \u524D\u8FD9\u91CC\u5199\u7684\u300C.backup-local/ \u952E\u524D\u7F00\u300D\u5DF2\u4E0D\u662F\u4E8B\u5B9E\uFF09\uFF1B\u547D\u540D\u4E0E\u9632\u649E\u8FD9\u4E00\u4EFD\u7B56\u7565\u4E24\u8FB9\u5171\u7528\u3002\n//\n// \u540D\u5B57 = `<base> [<yyyymmddhhmmss>-<guid>]`\uFF1A\n//   - yyyymmddhhmmss\uFF1A\u4EBA\u8BFB\u7684\u79D2\u7EA7\u65F6\u95F4\uFF0C\u4E00\u773C\u770B\u51FA\u300C\u54EA\u4E2A\u65F6\u95F4\u70B9\u7684\u5907\u4EFD\u300D\uFF1B\n//   - guid\uFF1A\u9632\u649E\u7528\u771F\u968F\u673A GUID\uFF08\u4E0D\u662F\u79D2\u7EA7\u65F6\u95F4\u80FD\u4FDD\u8BC1\u7684\u2014\u2014\u540C\u79D2\u591A\u6B21\u7559\u5E95\u3001\u8DE8 reload \u90FD\u4E0D\u649E\uFF1B\n//     \u4E0E\u672C\u4ED3\u300Cidentity = GUID\u300D\u4E00\u8109\uFF0C\u89C1 MASTER.md\uFF09\u3002\n// \u7EAF\u53F6\u5B50\u6A21\u5757\uFF08\u53EA\u4F9D\u8D56 Date/crypto\uFF09\uFF0Ccloud-sync / local-adapter / session.js \u90FD\u53EF\u5B89\u5168 import\uFF08\u65E0\u73AF\uFF09\u3002\n// \uFF08LOCAL_BACKUP_PREFIX \u5DF2\u5220 v415\uFF1A\u672C\u5730\u5907\u4EFD\u6539\u8D70 blob-partition \u7684 backup \u5206\u533A\u3001\u952E\u662F `backup/<inner>`\uFF0C\n//   \u8FD9\u4E2A\u5B57\u7B26\u4E32\u524D\u7F00\u96F6\u5F15\u7528\u3002\u5B83\u6700\u540E\u4E00\u4E2A\u6D88\u8D39\u8005\u662F session.listSessions \u7684\u56FE\u5E93\u8FC7\u6EE4\uFF0C\u90A3\u4E2A\u4E5F\u5728 v415 \u5220\u4E86\u3002\uFF09\nimport { withStemTail } from \"./identifiers.js\";\nfunction pad(n, w = 2) { return String(n).padStart(w, \"0\"); }\nfunction yyyymmddhhmmss(ms) {\n    const d = new Date(ms);\n    return `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}` +\n        `${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;\n}\nfunction guid() {\n    const c = globalThis.crypto;\n    if (c && c.randomUUID)\n        return c.randomUUID();\n    // fallback\uFF1A\u624B\u6413 v4\n    const a = new Uint8Array(16);\n    if (c && c.getRandomValues)\n        c.getRandomValues(a);\n    else\n        for (let i = 0; i < 16; i++)\n            a[i] = Math.floor(Math.random() * 256);\n    a[6] = (a[6] & 0x0f) | 0x40;\n    a[8] = (a[8] & 0x3f) | 0x80;\n    const h = Array.from(a, (b) => b.toString(16).padStart(2, \"0\"));\n    return `${h.slice(0, 4).join(\"\")}-${h.slice(4, 6).join(\"\")}-${h.slice(6, 8).join(\"\")}-${h.slice(8, 10).join(\"\")}-${h.slice(10, 16).join(\"\")}`;\n}\n/** move-aside \u9632\u649E\u6807\uFF1A`<yyyymmddhhmmss>-<guid>`\u3002ms \u7531\u8C03\u7528\u65B9\u7ED9\uFF08cloud-sync \u6CE8\u5165\u65F6\u949F\u4FBF\u4E8E\u6D4B\u8BD5\uFF1Blocal \u7528 Date.now\uFF09\u3002 */\nexport function asideStamp(ms) { return `${yyyymmddhhmmss(ms)}-${guid()}`; }\n// \u2500\u2500 \u6062\u590D\u649E\u540D\u7B56\u7565\uFF08\u6848\u5377 20260825-cloud-override-adopt-noop-case.md \u00A78\uFF0C2026-08-25 user \u62CD\u677F\uFF09\u2500\u2500\u2500\u2500\n// \u843D\u70B9\u88AB\u5360\uFF08\u6D3B\u6587\u4EF6 / \u6B63\u6253\u5F00\u7684\u6587\u6863 / \u672A\u63A8 dirty\uFF09\u2192 **\u7EDD\u4E0D\u8986\u76D6**\uFF08\u00A7A\uFF1Aevery overwrite is move-aside \u7684\u5BF9\u5076\uFF1A\n// restore \u4E5F\u4E0D\u8BB8 clobber\uFF09\uFF0C\u6539\u540D\u6062\u590D\u3002\u6233 = **\u5FEB\u7167\u81EA\u5DF1\u7684\u65F6\u523B**\uFF08user \u8BED\u4E49\uFF1A\u300Cbackup \u7684\u65F6\u95F4\u5206\u8FA8\u7387\u300D\u2014\u2014\n// \u6062\u590D\u51FA\u6765\u7684\u662F\"\u90A3\u4E2A\u65F6\u95F4\u70B9\u7684\u7248\u672C\"\uFF0C\u540D\u5B57\u5C31\u8BE5\u5199\u90A3\u4E2A\u65F6\u95F4\u70B9\uFF09\uFF0C\u53D6 aside stamp \u524D 14 \u4F4D\uFF1B\u62FF\u4E0D\u5230\u624D\u9000\u6062\u590D\u65F6\u523B\u3002\n// \u672C\u5730\u817F\uFF08local-cache\uFF09/ mock\uFF08mock-local\uFF09/ \u4E91\u7AEF\u817F\uFF08cloud-sync.restore \u5019\u9009\u540D\uFF09\u4E09\u5904\u5171\u7528\uFF0C\u9632\u6C99\u7BB1\u4E0E\u771F\u673A\u6F02\u79FB\u3002\n// added by Claude Fable 5, 2026-08-25.\n/** aside stamp\uFF08`<yyyymmddhhmmss>-<guid>`\uFF09\u5F00\u5934\u62BD 14 \u4F4D\u5FEB\u7167\u65F6\u523B\uFF1B\u62BD\u4E0D\u5230 \u2192 null\u3002 */\nexport function snapshotStampOf(s) {\n    const m = s ? /^(\\d{14})-/.exec(s) : null;\n    return m ? m[1] : null;\n}\n/** \u6062\u590D\u649E\u540D\u7684\u5C55\u793A\u6233 `yyyymmdd-hhmmss`\uFF1A\u4F18\u5148\u5FEB\u7167\u65F6\u523B\uFF08stamp14\uFF09\uFF0C\u7F3A\u5931\u9000 fallbackMs\uFF08\u6062\u590D\u65F6\u523B\uFF09\u3002 */\nexport function restoreStampDisplay(stamp14, fallbackMs) {\n    const s = stamp14 && /^\\d{14}$/.test(stamp14) ? stamp14 : yyyymmddhhmmss(fallbackMs);\n    return `${s.slice(0, 8)}-${s.slice(8)}`;\n}\n/** \u6062\u590D\u843D\u70B9\u8EAB\u4EFD\uFF1Aorig \u7A7A\u95F2 \u2192 \u539F\u8EAB\u4EFD\uFF1B\u88AB\u5360 \u2192 \u4E3B\u5E72\u540E\u9762\u63A5 ` [yyyymmdd-hhmmss]`\uFF08\u4ECD\u5360\u518D\u8865 `-2`/`-3`\u2026\uFF09\u3002\n *  \u6233\u63D2\u5728\u54EA\u7531 identifiers.withStemTail \u5B9A\uFF1A\u6587\u6863\u63D2\u5728\u540E\u7F00\u4E4B\u524D\uFF08`\u4E66 [\u6233].webxiaoheiwu.zip`\uFF09\uFF0C\u975E\u6587\u6863\u63D2\u5728\u6700\u540E\u4E00\u4E2A\u70B9\u4E4B\u524D\u3002\n *  0.16.0 \u4E4B\u524D\u8FD9\u91CC\u6309\u300C\u6700\u540E\u4E00\u4E2A\u70B9\u300D\u5207\uFF0CWXHW \u7684\u4E66\u53D6\u56DE\u6765\u53EB `\u4E66.webxiaoheiwu [\u6233].zip`\u3001\u5BBF\u4E3B\u8BA4\u4E0D\u51FA\uFF08\u63D0\u6848 20260929-proposal-doc-types \u00A73 \u7B2C 3 \u884C\uFF09\u3002 */\nexport async function restoreTargetName(orig, occupied, stamp14, fallbackMs, ids) {\n    if (!(await occupied(orig)))\n        return orig;\n    const disp = restoreStampDisplay(stamp14, fallbackMs);\n    const mk = (suf) => withStemTail(orig, ` [${suf}]`, ids);\n    let target = mk(disp);\n    for (let i = 2; await occupied(target); i++)\n        target = mk(`${disp}-${i}`);\n    return target;\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md + CONTEXT.md\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore\u3002\n//\n// delete\uFF08\u6DF1\u6A21\u5757\uFF09\u2014\u2014 \u5220\u9664 = move-aside\uFF08\u7EDD\u4E0D\u786C\u5220\u810F\u5B57\u8282\uFF09\u3002\u5355\u4E00\u804C\u8D23 = \u4E09\u6001\u5220\u9664 + \u79BB\u7EBF\u5220\u961F\u5217\uFF1A\n//   \u4E09\u6001\uFF1A\u4EC5\u672C\u5730 / \u4EC5\u4E91\u7AEF / \u4E24\u8005\uFF08\u4E24\u8005\u2192\u4E91\u7AEF\u8FDB .trash + \u672C\u5730\u5E72\u51C0\u526F\u672C\u76F4\u5220\uFF0C\u4E0D\u7559\u53CC\u4EFD\uFF1B\u672C\u5730\u810F\u2192\u964D\u7EA7 local-only\uFF09\u3002\n//   \u79BB\u7EBF\uFF1A\u672C\u5730 move-aside + \u6301\u4E45\u5316\u6392\u961F\uFF08base-etag \u5B88\u536B\uFF09\uFF0C\u91CD\u8FDE drainDeleteQueue \u91CD\u653E\u2014\u2014\n//   \u88AB\u522B\u5904\u6539\u8FC7\uFF08\u542B\u540C\u540D\u65B0\u6587\u4EF6\uFF09\u2192 conflict-edit-wins \u2192 **\u4E0D\u5220**\uFF08\u9632\"\u65E7\u8BBE\u5907\u6512\u5220\u9664\u5F88\u4E45\u540E\u4E0A\u7EBF\u5220\u6389\u522B\u4EBA\u7684\u65B0\u6587\u4EF6\"\uFF09\u3002\nimport { reportStoreError } from \"../base/error-handling.js\"; // \u5168\u63A5\u4F46\u5206\u7EA7\uFF1A\u9759\u9ED8 swallow \u4E5F funnel\uFF08\u4E0D\u6539\u63A7\u5236\u6D41\uFF09\nimport { asideStamp } from \"../base/move-aside.js\"; // deleteEventId \u751F\u6210\u5668\uFF08\u65F6\u95F4\u6233+guid\uFF0C\u517C\u4F5C\u9632\u649E\u540E\u7F00\uFF09\nconst passBusy = (_l, fn) => fn();\n// \u76F8\u5BF9\u952E\uFF08namespacedKv \u8865 `${appId}.${databaseId}.` \u6839\u524D\u7F00 \u2192 `${ns}.internal.pending_deletions`\uFF09\u3002\nconst DELQ_KEY = \"internal.pending_deletions\";\nexport function createDelete(cfg) {\n    const { cloud, local, head, kv, busy: _busy = passBusy } = cfg;\n    function readQueue() {\n        try {\n            const raw = kv.get(DELQ_KEY);\n            return raw ? JSON.parse(raw) : [];\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            return [];\n        }\n    }\n    function writeQueue(q) {\n        if (q.length)\n            kv.set(DELQ_KEY, JSON.stringify(q));\n        else\n            kv.remove(DELQ_KEY);\n    }\n    function enqueue(name, baseEtag, deleteEventId) {\n        const q = readQueue().filter((e) => e.name !== name); // \u540C\u540D\u53BB\u91CD\uFF0C\u6700\u65B0\u8986\u76D6\n        q.push({ name, baseEtag, deleteEventId });\n        writeQueue(q);\n    }\n    async function del(name, opts = {}) {\n        const { isOnline = () => true, confirm, onDirtyWarn, busy = _busy, expectCloudAbsent = false } = opts;\n        if (confirm && !(await confirm({ title: \"\u5220\u9664\", body: name, danger: true })))\n            return { status: \"cancelled\" };\n        if (head.isDirtyAnywhere(name) && onDirtyWarn && !(await onDirtyWarn({ name })))\n            return { status: \"cancelled\" };\n        const localPresent = local ? await local.exists(name) : false;\n        // \u2605\u4E00\u6B21\u5220\u9664 = \u4E00\u4E2A deleteEventId\uFF0C\u4E24\u6761\u817F\uFF08\u672C\u5730 .trash / \u4E91\u7AEF .trash\uFF09**\u5171\u7528**\u5B83\u3002\n        //   \u4E24\u7AEF\u636E\u6B64\u7CBE\u786E\u914D\u5BF9\uFF08trash-merge\uFF09\u3002\u4EE5\u524D\u4E24\u8FB9\u5404\u751F\u6210\u5404\u7684 \u2192 \u53EA\u80FD\"\u6309\u65F6\u95F4\u6233\u6392\u5E8F\u540E\u6309\u4E0B\u6807\u914D\u5BF9\"\uFF0C\n        //   \u5355\u817F\u5220\u9664\u4EA4\u53C9\u65F6\u4F1A\u628A\u4E24\u6B21\u65E0\u5173\u7684\u5220\u9664\u914D\u6210\u4E00\u884C \u2192 purge \u6389\u4E24\u4E2A\u4E0D\u76F8\u5E72\u7684\u6587\u4EF6\u8FD8\u53EA\u62A5\u5220\u4E86\u4E00\u4E2A\u3002\n        const deleteEventId = asideStamp(Date.now());\n        if (!isOnline()) {\n            if (expectCloudAbsent)\n                return { status: \"cancelled\", reason: \"offline\" }; // \u300C\u4E91\u7AEF\u786E\u5B9E\u6CA1\u6709\u300D\u79BB\u7EBF\u9A8C\u4E0D\u4E86 \u2192 \u4E0D\u52A8\u3001\u4E0D\u6392\u961F\n            const baseEtag = cloud.getETag(name); // \u4F9B\u91CD\u653E\u65F6 If-Match \u5F0F\u5B88\u536B\n            let trashKey = null;\n            if (localPresent)\n                trashKey = await local.trash(name, deleteEventId);\n            // Finding 1\uFF08port \u81EA\u524D\u8EAB\u5F15\u64CE store.ts\uFF0C2026-06-21 \u9759\u6001\u8BBA\u8BC1\uFF09\uFF1A\u4EC5\u5F53\u6709\u5DF2\u77E5\u4E91\u7AEF base(etag) \u624D\u6392\u4E91\u5220\u3002\n            //   null base = \u672C\u5730 only / \u4ECE\u672A\u540C\u6B65\u2014\u2014\u4E91\u7AEF\u6CA1\u6709\u53EF\u8BC1\u660E\u5C5E\u5DF1\u7684\u7248\u672C\uFF1B\u82E5\u4ECD\u6392\u961F\uFF0C\u91CD\u8FDE\u65F6 base-etag \u5B88\u536B\u56E0 null\n            //   \u77ED\u8DEF\uFF0C\u4F1A\u76F2\u5220**\u540C\u540D\u7684\u522B\u8BBE\u5907\u65B0\u6587\u4EF6**\uFF08\u7EA2\u7EBF\uFF1A\u4E0D\u5F97\u9759\u9ED8\u5220\u672A\u8BC1\u5B9E\u5C5E\u5DF1\u7684\u5185\u5BB9\uFF09\u3002\u6545 null base \u4E0D\u6392\u961F\u3002\n            const queuedCloudDelete = baseEtag != null;\n            if (queuedCloudDelete)\n                enqueue(name, baseEtag, deleteEventId); // id \u968F\u961F\u5217\u6301\u4E45\u5316\uFF0C\u56DE\u7EBF drain \u65F6\u4E91\u817F\u7528\u540C\u4E00\u4E2A\n            head.forget(name);\n            return { status: \"trashed\", where: \"local\", queuedCloudDelete, baseEtag, trashKey };\n        }\n        return busy(\"file.deleting\", async () => {\n            let cloudPresent = false, metaFailed = false;\n            try {\n                cloudPresent = !!(await cloud.fetchMeta(name));\n            }\n            catch (e) {\n                reportStoreError(e, \"log\");\n                cloudPresent = false;\n                metaFailed = true;\n            }\n            if (expectCloudAbsent && metaFailed)\n                return { status: \"cancelled\", reason: \"offline\" }; // \u672A\u77E5 \u2260 \u6CA1\u4E86\n            if (expectCloudAbsent && cloudPresent)\n                return { status: \"cancelled\", reason: \"cloud-present\" }; // \u9762\u5F00\u7740\u65F6\u4E91\u7AEF\u90A3\u4EFD\u56DE\u6765\u4E86\uFF1A\u4E24\u8FB9\u90FD\u4E0D\u52A8\uFF0C\u4EA4\u56DE\u4E0A\u5C42\u8BF4\u6E05\n            if (cloudPresent) {\n                const wasDirty = head.isDirtyAnywhere(name); // \u2605trash \u524D\u53D6\uFF08trash \u540E\u8C31\u7CFB\u4F1A\u88AB forget\uFF09\u3002anywhere\uFF1A\u5B83\u8DEF\u7531 hardDelete vs \u672C\u5730 .trash\u2014\u2014\u522B tab \u7684\u672A\u63A8\u5B57\u8282 per-tab \u770B\u4E0D\u89C1\uFF0C\u8BEF\u5224 clean = \u786C\u5220\u4E16\u754C\u552F\u4E00\u5B57\u8282\uFF08\u00A7A\uFF09\n                const trashed = await cloud.trash(name, deleteEventId); // \u5148\u4E91\u7AEF\u8FDB .trash\uFF08\u5931\u8D25\u629B \u2192 \u672C\u5730\u4E0D\u52A8\uFF09\n                if (localPresent) {\n                    if (wasDirty) {\n                        // #42\uFF1A\u672C\u5730\u6709\u672A\u63A8\u6539\u52A8\uFF08\u8FD9\u4EFD\u5B57\u8282\u4E16\u754C\u552F\u4E00\uFF09\u2192 \u5148\u89E3\u7ED1\u4E91\u7AEF\u8C31\u7CFB\u53D8 local-only\uFF0C\u518D\u79FB\u8FDB**\u672C\u5730** .trash\n                        //   \uFF08\u53EF\u6062\u590D\uFF0C\u7EDD\u4E0D hardDelete \u672A\u63A8\u5B57\u8282\uFF09\u3002\u4E91\u7AEF\u7248\u5DF2\u8FDB\u4E91\u7AEF .trash\u3002\n                        head.forget(name);\n                        const trashKey = await local.trash(name, deleteEventId); // \u540C\u4E00\u4E2A id \u2192 \u4E24\u817F\u914D\u5F97\u4E0A\u5BF9\n                        return { status: \"trashed\", where: \"both\", trashed, trashKey };\n                    }\n                    await local.hardDelete(name); // #34 offloadable \u5E72\u51C0\u526F\u672C=\u4E91\u7AEF .trash \u5DF2\u6551\u7740 \u2192 \u786C\u5220\u4E0D\u7559\u53CC\u4EFD\n                }\n                head.forget(name);\n                return { status: \"trashed\", where: \"cloud\", trashed };\n            }\n            if (localPresent) {\n                const trashKey = await local.trash(name, deleteEventId);\n                head.forget(name);\n                return { status: \"trashed\", where: \"local\", trashKey };\n            }\n            return { status: \"noop\" };\n        });\n    }\n    // \u79BB\u7EBF\u5220\u9664\u91CD\u653E\uFF1A\u6309 base-etag \u6536\u655B\uFF1B\u88AB\u522B\u5904\u6539\u8FC7 \u2192 delete-vs-edit \u9ED8\u8BA4 edit-wins\uFF08\u4E0D\u5220\uFF09\u3002\n    async function replayDelete(name, opts = {}) {\n        const { baseEtag } = opts;\n        // \u65E7\u961F\u5217\u6761\u76EE\u6CA1\u5B58 id \u2192 \u73B0\u751F\u6210\uFF08\u90A3\u51E0\u6761\u6CE8\u5B9A\u548C\u672C\u5730\u817F\u914D\u4E0D\u4E0A\uFF0C\u88C2\u6210\u4E24\u884C\uFF1B\u4E0D\u4E22\u6570\u636E\uFF09\u3002\n        const deleteEventId = opts.deleteEventId ?? asideStamp(Date.now());\n        let meta;\n        try {\n            meta = await cloud.fetchMeta(name);\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            return { status: \"deferred-offline\" };\n        }\n        if (!meta)\n            return { status: \"converged\", reason: \"already-gone\" };\n        // Finding 1 \u9632\u5FA1\u7EB5\u6DF1\uFF08port \u81EA\u524D\u8EAB\u5F15\u64CE\uFF09\uFF1A\u65E0 base \u4E0D\u5F97 trash\u2014\u2014\u65E0\u6CD5\u8BC1\u660E\u4E91\u7AEF\u8FD9\u4EFD\u5C31\u662F\u6211\u4EEC\u5220\u7684\u90A3\u4EFD\n        //   \uFF08\u53EF\u80FD\u662F\u522B\u8BBE\u5907\u540C\u540D\u65B0\u6587\u4EF6\uFF09\u3002\u6B63\u5E38\u8DEF\u5F84 del() \u5DF2\u4E0D\u518D\u4E3A null base \u6392\u961F\uFF1B\u8FD9\u91CC\u518D\u515C\u4E00\u5C42\uFF0C\u4FDD\u62A4 drainDeleteQueue \u76F4\u8C03\u3002\u7EC8\u6001\u3002\n        if (!baseEtag)\n            return { status: \"skipped-no-base\" };\n        if (meta.etag !== baseEtag)\n            return { status: \"conflict-edit-wins\" };\n        // \u2605 \u8BFB\u6BD4\u5BF9\u53EA\u662F**\u7B2C\u4E00\u9053**\u3002\u771F\u6B63\u7684 edit-wins \u7531 trash \u91CC\u7684 If-Match \u5F3A\u5236\uFF08v435\uFF09\uFF1A\n        //   \u4E0A\u9762\u8FD9\u6B21 fetchMeta \u4E0E\u4E0B\u9762\u90A3\u6B21 move \u4E4B\u95F4\u9694\u7740 _find + ensureFolder \u4E24\u6B21\u5F80\u8FD4\uFF0C\n        //   \u522B\u8BBE\u5907\u5728\u8FD9\u4E2A\u7A97\u53E3\u63A8\u65B0\u7248 \u2192 \u6BD4\u5BF9\u5DF2\u653E\u884C \u2192 \u65B0\u5B57\u8282\u88AB\u642C\u8FDB .trash\u3002412 \u2192 \u540C\u6837\u6536\u655B\u6210 conflict-edit-wins\u3002\n        try {\n            return { status: \"trashed\", trashed: await cloud.trash(name, deleteEventId, { baseEtag }) };\n        }\n        catch (e) {\n            if (e?.status === 412)\n                return { status: \"conflict-edit-wins\" };\n            throw e;\n        }\n    }\n    async function drainDeleteQueue() {\n        const q = readQueue();\n        if (!q.length)\n            return { status: \"drained\", drained: 0, deferred: 0 };\n        const remain = [];\n        let drained = 0;\n        for (const e of q) {\n            let r;\n            try {\n                r = await replayDelete(e.name, { baseEtag: e.baseEtag, deleteEventId: e.deleteEventId });\n            }\n            catch (err) {\n                reportStoreError(err, \"log\");\n                remain.push(e);\n                continue;\n            }\n            if (r.status === \"deferred-offline\")\n                remain.push(e);\n            else\n                drained++; // \u7EC8\u6001\u51FA\u961F\n        }\n        writeQueue(remain);\n        return { status: \"drained\", drained, deferred: remain.length };\n    }\n    return { del, replayDelete, drainDeleteQueue };\n}\n", "// \u26A0 store \u5185\u90E8\u6DF1\u6A21\u5757\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore\u3002\n//\n// path-guard\uFF08\u6DF1\u6A21\u5757\uFF09\u2014\u2014 \u8DEF\u5F84\u5408\u6CD5\u6027 + \u9690\u85CF\u5224\u5B9A\u7684**\u552F\u4E00\u771F\u76F8**\u3002\u4E09\u4E2A\u51FD\u6570\uFF0C\u4E24\u5957\u89C4\u5219\uFF08file \u540D vs collection \u540D\u4E0D\u540C\uFF09\uFF1A\n//   \u00B7 isHidden(name)\uFF1A**\u5217\u4E3E\u5C42**\u8FC7\u6EE4\u2014\u2014\u672B\u6BB5\uFF08basename\uFF09\u4EE5 \".\" \u5F00\u5934 = \u9690\u85CF\uFF08\u4E0D list\uFF09\u3002store \u7684\u5B89\u5168\u7F51\u5939\uFF08`.trash`/`.backup`/\n//     `.<appId>`\uFF09+ \u7528\u6237\u4EFB\u4F55 dotfile/dotfolder \u90FD\u4E0D\u8FDB\u56FE\u5E93\uFF1B\u4F46**\u9690\u85CF \u2260 \u7981\u6B62\u521B\u5EFA**\uFF08\u53EA\u8981\u4E0D\u662F\u4FDD\u7559\u6839\uFF0Cdot \u9879\u4ECD\u53EF\u5EFA/\u7528\uFF09\u3002\n//   \u00B7 assertValidFileName(name, appId)\uFF1A**file/\u6587\u4EF6\u5939 \u540D**\u2014\u2014\u62D2 3 \u4E2A\u4FDD\u7559\u6839\uFF08`.<appId>/`\u00B7`.trash/`\u00B7`.backup/`\uFF0C\u7528\u6237\u6587\u4EF6\u843D\u8FD9\u91CC\n//     \u4F1A\u4E0E collections/\u5B89\u5168\u7F51\u649E\uFF09\uFF1B\u653E\u884C\u5176\u4ED6\u5B50\u8DEF\u5F84 + dotfile\u3002\n//   \u00B7 assertValidCollectionName(name)\uFF1A**collection \u540D**\u2014\u2014\u7981\u659C\u6760\uFF08collection \u540D\u4E0D\u662F\u8DEF\u5F84\uFF1Bhierarchy \u7528 `parent.child` \u70B9\u5206\uFF09\u3001\n//     \u7981 Windows \u975E\u6CD5\u5B57\u7B26\u3001\u7981 bare `.`/`..`\uFF1B**\u653E\u884C**\u70B9\uFF08\u542B\u524D\u5BFC\u70B9=\u9690\u85CF collection\uFF09\u3002\n//   listing.ts / reconcile.ts / cloud-sync.ts / create-store.ts \u5171\u7528\u8FD9\u4E00\u5904\u3002\nexport function isHidden(name) {\n    if (!name)\n        return false;\n    const seg = name.includes(\"/\") ? name.slice(name.lastIndexOf(\"/\") + 1) : name;\n    return seg.startsWith(\".\");\n}\n// file/\u6587\u4EF6\u5939 \u8DEF\u5F84\u62A4\u680F\uFF1A\u62D2 3 \u4E2A\u4FDD\u7559\u6839\uFF08\u9876\u5C42\u9996\u6BB5\uFF09\u3002\u653E\u884C\u5176\u4ED6\u4E00\u5207\u5B50\u8DEF\u5F84/dotfile\uFF08\u9690\u85CF\u4F46\u53EF\u7528\uFF09\u3002\nexport function assertValidFileName(name, appId) {\n    if (!name || !name.trim())\n        throw new Error(\"\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\");\n    const top = name.indexOf(\"/\") >= 0 ? name.slice(0, name.indexOf(\"/\")) : name;\n    if (top === \".trash\" || top === \".backup\" || top === `.${appId}`) {\n        throw new Error(`\u4FDD\u7559\u6839\uFF0C\u7981\u6B62\u7528\u4F5C\u6587\u4EF6/\u6587\u4EF6\u5939\u8DEF\u5F84\uFF1A${top}/\uFF08.trash/.backup/.${appId} \u5F52 store \u5B89\u5168\u7F51\u4E0E collections\uFF09`);\n    }\n}\n// collection \u540D\u62A4\u680F\uFF08= \u5408\u6CD5\u6587\u4EF6\u540D\u3001\u65E0\u6269\u5C55\u540D\u3001\u65E0\u659C\u6760\uFF09\u3002store \u843D\u4E91\u65F6\u81EA\u5DF1\u8FFD\u52A0 `.json`\u3002hierarchy \u9760 `parent.child` \u70B9\u5206\uFF08\u653E\u884C\u70B9\uFF09\u3002\nexport function assertValidCollectionName(name) {\n    if (!name || /[\\\\/:*?\"<>|]/.test(name) || name === \".\" || name === \"..\") {\n        throw new Error(`collection \u540D\u975E\u6CD5\uFF08\u987B\u5408\u6CD5\u6587\u4EF6\u540D\u3001\u65E0\u659C\u6760/\u65E0 Windows \u975E\u6CD5\u5B57\u7B26\u3001\u975E bare .|..\uFF1B\u70B9\u5206\u5C42\u7EA7\u653E\u884C\uFF09\uFF1A${JSON.stringify(name)}`);\n    }\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md + CONTEXT.md\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore / \u9876\u5C42 export\u3002\n// created 2026-08-25 by Claude Fable 5 (claude-fable-5)\n//\n// CloudNetworkError \u2014\u2014 provider \u7F51\u7EDC\u5C42\u5931\u8D25\u7684\u7C7B\u578B\u5316\u5C01\u88C5\uFF08fetch \u672C\u8EAB throw\uFF1A\u65AD\u7F51 / DNS / iOS \u7F51\u7EDC\u5207\u6362\uFF09\u3002\n//   \u52A8\u673A\uFF08\u6848\u5377 20260524 WeebPaint/ai-docs/20260825-cloud-override-adopt-noop-case.md \u00A72\uFF09\uFF1A\n//   Safari \u5BF9 fetch \u7F51\u7EDC\u5931\u8D25\u629B\u88F8 `TypeError: Load failed`\uFF0C\u4E00\u8DEF\u88F8\u5954\u5230\u7528\u6237 banner\uFF0C\u65E0\u4ECE\u8FA8\u8BA4\u4E5F\u65E0\u6CD5 i18n\u3002\n//   SW \u7F51\u5173\u5728 spike-11\uFF088fef121\uFF09\u5DF2\u628A fetch throw \u7FFB\u6210\u53EF\u8BFB\u65E5\u5FD7\uFF1B\u8FD9\u91CC\u662F\u9875\u9762\u4FA7 provider \u7684\u540C\u6B3E\u6536\u53E3\u3002\n//   \u5951\u7EA6\uFF1A\n//   - `status` \u6052 undefined \u2192 push.retriable() \u89C6\u4E3A\u53EF\u91CD\u8BD5\uFF08\u4E0E\u88F8 TypeError \u884C\u4E3A\u4E00\u81F4\uFF0C\u91CD\u8BD5\u8BED\u4E49\u4E0D\u53D8\uFF09\u3002\n//   - \u53EA\u5728\u300Cfetch \u81EA\u8EAB throw\u300D\u5904\u5305\u88C5\uFF08\u90A3\u91CC TypeError \u5FC5\u662F\u7F51\u7EDC\u5C42\uFF09\uFF1B\u7EDD\u4E0D\u62FF `e instanceof TypeError`\n//     \u5728\u4E0A\u5C42\u6CDB\u5224\u2014\u2014\u6211\u4EEC\u81EA\u5DF1\u4EE3\u7801\u7684 TypeError bug \u4F1A\u88AB\u8BEF\u88C5\u6210\u300C\u7F51\u7EDC\u95EE\u9898\u300D\u800C\u85CF\u6B7B\u3002\n//   - app \u4FA7 ui.reportError \u6309 `name === \"CloudNetworkError\"` \u6362\u4EBA\u8BDD\u6587\u6848\uFF08i18n \u5F52\u5BBF\u4E3B\uFF0C\u5E93\u5185\u96F6\u6587\u6848\uFF09\u3002\nexport class CloudNetworkError extends Error {\n    cause;\n    constructor(message, cause) {\n        super(message);\n        this.name = \"CloudNetworkError\";\n        this.cause = cause;\n    }\n}\n// CloudStaleRefError \u2014\u2014\u300C\u5DF2\u88AB\u522B\u5904\u52A8\u8FC7\u300D\u9519\u8BEF\u65CF\uFF082026-08-25 user \u62CD\u677F\uFF0C\u968F id\u2192ref \u66F4\u540D\u4E00\u8D77\u6536\u655B\uFF1B\n//   ai-docs/20260825-localfile-knight-store-round.md \u00A74 \u914D\u5957\u4E09\u4EF6\u4E4B\u4E00\uFF09\u3002edited by Claude Fable 5 (2026-08-26)\n//   \u8BED\u4E49\uFF1A\u62FF\u7740\u4E00\u5F20 ref\uFF08\u884C\u674E\u724C\uFF09\u53BB\u64CD\u4F5C\uFF0C\u4E91\u7AEF\u7B54 404 = \u8FD9\u5F20\u724C**\u6307\u5411\u7684\u4E1C\u897F\u5DF2\u4E0D\u5728\u539F\u5904**\u2014\u2014\n//   \u5178\u578B\u573A\u666F = \u56DE\u6536\u7AD9 list\u2192\u7528\u6237\u70B9\u51FB\u7684\u7A97\u53E3\u91CC\uFF0C\u522B\u7684\u8BBE\u5907\u5DF2\u628A\u8BE5\u9879\u6062\u590D/\u6E05\u7A7A\uFF08\u9884\u5B58\u5C0F\u6D1E\uFF1A\u65E7\u7248\u53EA\u5904\u7406 412 \u4E0D\u5904\u7406 404\uFF09\u3002\n//   \u5951\u7EA6\uFF1A\n//   - \u4E0D\u662F bug\u3001\u4E0D\u662F\u7F51\u7EDC\u6545\u969C\u2014\u2014\u662F\u300C\u522B\u5904\u52A8\u8FC7\u4E86\u300D\u7684\u4E8B\u5B9E surface\uFF1Bapp \u6536\u5230\u540E\u5E94\u63D0\u793A\u5237\u65B0\u5217\u8868\u91CD\u67E5\u3002\n//   - \u4E0E CloudConflictError\uFF08\u540C\u4E00\u6587\u4EF6\u7248\u672C\u5206\u53C9\uFF0C412\uFF09\u4E0D\u540C\u65CF\uFF1A\u8FD9\u91CC\u8FDE\u5BF9\u8C61\u90FD\u6CA1\u4E86/\u6362\u4E86\uFF0C\u65E0\u300C\u89E3\u51B3\u51B2\u7A81\u300D\u53EF\u8A00\u3002\n//   - path-as-id \u7684 folder provider \u4E0B ref=path\uFF0C\u6539\u540D/\u79FB\u52A8\u5373\u4F5C\u5E9F \u2192 \u6B64\u9519\u8BEF\u65CF\u662F\u6D88\u8D39\u65B9\u552F\u4E00\u8BE5\u6355\u7684\u5F62\u72B6\n//     \uFF08\u7EDD\u4E0D\u6309 provider \u7C7B\u578B\u5206\u652F\u5224 404\uFF09\u3002\nexport class CloudStaleRefError extends Error {\n    /** \u5931\u6548\u7684\u90A3\u5F20 ref\u3002 */\n    ref;\n    cause;\n    constructor(ref, message, cause) {\n        super(message ?? `cloud ref no longer valid (moved/removed elsewhere): ${ref}`);\n        this.name = \"CloudStaleRefError\";\n        this.ref = ref;\n        this.cause = cause;\n    }\n}\n", "// cloud-sync \u2014\u2014 session \u7EA7\u540C\u6B65\u8BED\u4E49 over \u4F4E\u5C42 CloudProvider\u3002\u4ECE\u524D\u8EAB\u5F15\u64CE cloud.js \u5438\u6536\u3001\u53BB app \u5316\u3002\n//\n// \u8FD9\u662F Store \u6D88\u8D39\u7684\u300Ccloud \u540E\u7AEF\u300D\uFF1Apush/pull/fetchMetadata/trash/restore/purge + etag/dirty \u72B6\u6001\u3002\n// app-agnostic\uFF1A\u547D\u540D\uFF08.dat/.md/.bin\u2026\uFF09\u3001kv \u540E\u7AEF\uFF08localStorage/IDB/\u5185\u5B58\uFF09\u3001\u65F6\u949F \u90FD\u6CE8\u5165\u3002\n// \u4F4E\u5C42 CloudProvider\uFF08list/getItemByPath/download/upload/delete/ensureFolder/move/rename\uFF09\u7531\u5404 app \u5B9E\u73B0\uFF1A\n//   - \u751F\u4EA7\uFF1AOneDriveProvider\uFF08\u5305 Graph\uFF0C\u2248 \u539F graph.js\uFF09\n//   - \u6D4B\u8BD5\uFF1AMockCloudProvider\n//\n// \u7EA2\u7EBF\uFF08\u4E0E potential-bugs \u5BF9\u5E94\uFF09\uFF1Apush \u7528 If-Match\uFF08baseEtag\uFF09\u00B7 412\u2192CloudConflictError \u00B7\n//   \u5206\u7247\u672B\u54CD\u5E94\u65E0 item\u2192\u62C9\u6743\u5A01 etag \u4E0D\u5D29\u4E0D\u7F13\u5B58 null\uFF08H7\uFF09\u00B7 trash=move-aside \u52A0 [ts] \u540E\u7F00\uFF08A8/C2\uFF09\u00B7\n//   restore \u649E\u540D (2)(3) \u9632\u8986\u76D6\u3002\nimport { asideStamp, restoreStampDisplay } from \"../base/move-aside.js\";\nimport { withStemTail } from \"../base/identifiers.js\"; // \u6DF1\u6A21\u5757\u7684 move-aside \u547D\u540D\u7B56\u7565\uFF08yyyymmddhhmmss-guid \u9632\u649E\uFF09\nimport { isHidden } from \"../base/is-hidden.js\"; // \u5217\u4E3E\u9690\u85CF\u5224\u5B9A\uFF08.trash/.backup/.<appId> + \u4EFB\u610F dot \u9879\uFF09\nimport { reportStoreError } from \"../base/error-handling.js\"; // \u5168\u63A5\u4F46\u5206\u7EA7\uFF1A\u9759\u9ED8 swallow \u4E5F funnel\uFF08\u4E0D\u6539\u63A7\u5236\u6D41\uFF09\nimport { CloudStaleRefError } from \"../base/errors.js\"; // \u300C\u5DF2\u88AB\u522B\u5904\u52A8\u8FC7\u300D\u9519\u8BEF\u65CF\uFF08restore/purge \u7684 404 \u6536\u655B\uFF09\nexport class CloudConflictError extends Error {\n    sessionName;\n    constructor(message, sessionName) {\n        super(message);\n        this.name = \"CloudConflictError\";\n        this.sessionName = sessionName;\n    }\n}\nexport class CloudNameCollisionError extends Error {\n    sessionName;\n    where;\n    constructor(sessionName, where = \"cloud\") {\n        super(where === \"local\"\n            ? `\u672C\u5730\u5DF2\u6709\u540C\u540D\u300C${sessionName}\u300D\uFF08\u4E0D\u540C\u6587\u4EF6\uFF09`\n            : `\u4E91\u7AEF\u5DF2\u6709\u540C\u540D\u300C${sessionName}\u300D\uFF08\u4E0D\u540C\u6587\u4EF6\uFF09`);\n        this.name = \"CloudNameCollisionError\";\n        this.sessionName = sessionName;\n        this.where = where;\n    }\n}\n/** \u5185\u5B58 kv\uFF08\u6D4B\u8BD5\u7528\uFF1B\u5BBF\u4E3B\u4F20 localStorage \u5305\u88C5\uFF09\u3002 */\nexport function memKv() {\n    const m = new Map();\n    return {\n        get: (k) => (m.has(k) ? m.get(k) : null),\n        set: (k, v) => { m.set(k, String(v)); },\n        remove: (k) => { m.delete(k); },\n    };\n}\n/**\n * @param {object} cfg\n * @param {object} cfg.provider  \u4F4E\u5C42 CloudProvider\n * @param {object} cfg.kv        { get, set, remove }\uFF08etag/dirty \u7F13\u5B58\uFF09\n * @param {(name:string)=>string} cfg.fileName  session name \u2192 \u4E91\u7AEF\u6587\u4EF6\u540D\uFF08\u5982 n => n + \".dat\"\uFF09\n * @param {string} [cfg.contentType]\n * @param {string} [cfg.trashFolder=\".trash\"]\n * @param {string} [cfg.appKey=\"sync\"]  kv key \u524D\u7F00\n * @param {()=>number} [cfg.now]  \u65F6\u949F\uFF08\u6D4B\u8BD5\u6CE8\u5165\uFF1B\u9ED8\u8BA4 Date.now\uFF09\n */\n/** \u9ED8\u8BA4\u7684\u300C\u4E91\u7AEF\u6587\u4EF6\u540D \u2192 \u8EAB\u4EFD\u300D\u6620\u5C04\uFF1A\u53EA\u53BB\u5C3E\u90E8\u4E00\u4E2A .zip\uFF08ADR-0012 \u52A0\u5BC6\u5BB9\u5668\u5916\u6269\u5C55\u540D\uFF09\u3002\n *  X.dat\u2192X.dat\u3001X.dat.zip\u2192X.dat\u3001Y.zip\u2192Y\u3001Y.zip.zip\u2192Y.zip\uFF1B\u4E0E\u9ED8\u8BA4 encFileName\u300C\u8FFD\u52A0 .zip\u300D\u4E92\u9006\u3001\u65E0\u635F\u3002\n *  \u26A0 \u5BF9\u300C\u8EAB\u4EFD\u672C\u8EAB\u4EE5 .zip \u7ED3\u5C3E\u7684\u660E\u6587\u6587\u4EF6\u300D\u5B83\u662F\u9519\u7684\uFF08Y.zip \u4F1A\u88AB\u8FD8\u539F\u6210 Y \u5E76\u88AB\u5F53\u52A0\u5BC6\u4EF6\uFF09\u2014\u2014\u8FD9\u7C7B app \u914D config.toName\u3002 */\nconst NO_KINDS = createIdentifiersNoKinds();\nfunction createIdentifiersNoKinds() { return { kinds: [], parse: () => null, rowOf: () => null, join: (p) => `${p.folder ? `${p.folder}/` : \"\"}${p.stem}${p.suffix}` }; }\nexport const defaultCloudToName = (cloudName) => (cloudName.endsWith(\".zip\") ? cloudName.slice(0, -4) : cloudName);\nexport function createCloudSync(cfg) {\n    const { provider, kv, fileName, encFileName = null, contentType = \"application/octet-stream\", trashFolder = \".trash\", backupFolder = \".backup\", appKey = \"sync\", manageDirty = true } = cfg;\n    const now = cfg.now || (() => Date.now());\n    const isHiddenAny = (n) => isHidden(n) || !!cfg.hidden?.(n);\n    // name \u2192 \u4E91\u7AEF\u5B9E\u9645 item\uFF08\u540C\u4E00 name \u5728\u4EFB\u4E00\u65F6\u523B\u53EA\u4F4F\u4E00\u4E2A\u6269\u5C55\u540D\u4E0B\uFF1B\u660E\u6587\u8DEF\u5F84\u5148\u8BD5 = \u591A\u6570\u547D\u4E2D 1 RTT\uFF09\u3002\n    // \u627E\u4E0D\u5230\u65F6\u8FD4\u56DE\u660E\u6587\u8DEF\u5F84\uFF08\u65B0\u5EFA\u843D\u660E\u6587\u540D\uFF1B\u52A0\u5BC6\u5B57\u8282\u7684\u65B0\u5EFA\u5728 push \u91CC\u6309\u5B57\u8282\u9009 enc \u8DEF\u5F84\uFF09\u3002\n    async function _find(name) {\n        const p = fileName(name);\n        let item = await provider.getItemByPath(p);\n        if (item)\n            return { item, path: p, enc: false };\n        if (encFileName) {\n            const pe = encFileName(name);\n            item = await provider.getItemByPath(pe);\n            if (item)\n                return { item, path: pe, enc: true };\n        }\n        return { item: null, path: p, enc: false };\n    }\n    // match(item)\uFF1A\u54EA\u4E9B\u4E91\u7AEF\u6587\u4EF6\u7B97\"session\"\uFF08\u6269\u5C55\u540D agnostic\uFF1B\u9ED8\u8BA4\u6240\u6709\u975E\u6587\u4EF6\u5939\uFF09\u3002gallery \u5217\u8868\u7528\u3002\n    const match = cfg.match || ((it) => !it.isFolder);\n    // toName(item)\uFF1A\u4E91\u7AEF\u6587\u4EF6\u540D \u2192 **\u8EAB\u4EFD**\uFF08fileName / encFileName \u7684\u9006\uFF09\u3002\u9ED8\u8BA4 = defaultCloudToName\uFF08\u53EA\u53BB\u5C3E\u90E8\u4E00\u4E2A .zip\uFF09\u3002\n    //   \u300C\u4E91\u7AEF\u540D\u7ECF toName \u53D8\u4E86\u300D= \u5B83\u662F\u52A0\u5BC6\u5BB9\u5668\u540D\u2014\u2014\u8FD9\u662F\u5168\u5E93\u552F\u4E00\u7684\u52A0\u5BC6\u540D\u5224\u5B9A seam\uFF082026-09-09\uFF0Ctrash-merge \u515C\u5E95\u540C\u5403\uFF09\u3002\n    //   \u8EAB\u4EFD\u672C\u8EAB\u4EE5 .zip \u7ED3\u5C3E\u7684 app\uFF08\u660E\u6587 zip \u5DE5\u7A0B\uFF09\u5FC5\u987B\u7ECF createStore config.toName \u914D\u81EA\u5DF1\u7684\u89C4\u5219\uFF0C\u5426\u5219\u660E\u6587 zip \u88AB\u5F53\u52A0\u5BC6\u5BB9\u5668\u3002\n    const toName = cfg.toName || defaultCloudToName;\n    const ids = cfg.identifiers ?? NO_KINDS;\n    const etagKey = (n) => `${appKey}.etag:${n}`;\n    const dirtyKey = (n) => `${appKey}.dirty:${n}`;\n    const baseName = (n) => (n.includes(\"/\") ? n.slice(n.lastIndexOf(\"/\") + 1) : n);\n    // move-aside\uFF08.trash/.backup\uFF09\u7684\u9632\u649E\u540D\uFF1A<base> [<yyyymmddhhmmss>-<guid>]\uFF08\u547D\u540D\u7B56\u7565\u5728\u6DF1\u6A21\u5757 move-aside.js\uFF09\u3002\n    // guid \u9632\u540C\u540D\u591A\u6B21 move-aside \u649E\uFF08\u65E7\u7248 [ts] \u540C ms \u2192 conflictBehavior:\"fail\" \u629B\u9519\u7684\u771F bug\uFF09\u3002trash/backup \u5171\u7528\u3002\n    // stamp \u53EF\u7531\u8C03\u7528\u65B9\u4F20\u5165\uFF1Atrash \u8D70 delete.ts \u7ED9\u7684 **deleteEventId**\uFF08\u4E24\u6761\u817F\u5171\u7528\u540C\u4E00\u4E2A \u2192 trash-merge \u7CBE\u786E\u914D\u5BF9\uFF09\uFF1B\n    //   backup/weakOverride \u6CA1\u6709\u914D\u5BF9\u9700\u6C42\uFF0C\u73B0\u751F\u6210\u3002\n    const stampedName = (n, enc = false, stamp = asideStamp(now())) => (enc && encFileName ? encFileName : fileName)(`${baseName(n)} [${stamp}]`);\n    function getETag(name) { return kv.get(etagKey(name)) || null; }\n    function setETag(name, eTag) { if (eTag)\n        kv.set(etagKey(name), eTag);\n    else\n        kv.remove(etagKey(name)); }\n    // dirty per-tab \u5316\uFF08R2/K11\uFF0C\u5BA1\u8BA1 2026-06-10\uFF09\uFF1A\u672C\u5B9E\u4F8B\uFF08=\u672C tab\uFF09\u5BF9 dirty \u7684\u89C2\u70B9\u4F4F\u5185\u5B58\uFF0Ckv \u53EA\u505A\n    //   \u6301\u4E45\u515C\u5E95\uFF08reload/\u5F3A\u9000\u540E\u91CD\u63A8\u9760\u5B83\uFF09\u3002\u65E7\u7248\u7EAF\u5171\u4EAB kv\uFF1Atab A push \u6210\u529F\u6E05\u5171\u4EAB flag = \u628A tab B \u7684\n    //   \u672A\u63A8\u7F16\u8F91\u5BA3\u5E03\u5E72\u51C0 \u2192 B \u7684 refresh \u5224 clean \u2192 \u5FEB\u8FDB\u65E0\u7559\u5E95\u8986\u76D6 B \u5B57\u8282\u3002\u73B0\u5728 A \u6E05\u7684\u662F\u81EA\u5DF1\u7684\u5185\u5B58+kv\uFF0C\n    //   B \u5185\u5B58\u91CC\u7684 true \u8FD8\u5728 \u2192 B \u7684 gate \u4ECD\u6321\u3002\u5DF2\u77E5\u6B8B\u7559\uFF08user 2026-06-10 \u63A5\u53D7\uFF09\uFF1AB \u91CD\u8F7D\u540E\u5185\u5B58\u4E22\u3001\n    //   \u56DE\u9000\u5230\u88AB A \u6E05\u8FC7\u7684 kv\u2014\u2014\u591A tab \u540C\u753B\u672C\u5C31\u4E0D\u652F\u6301\uFF08IDB \u5C42\u4E92\u8E29\uFF09\uFF0C\u6B8B\u7559\u7A97\u53E3\u9700\u56DB\u8FDE\u5DE7\u5408\u3002\n    const _dirtyMem = new Map();\n    function isDirty(name) {\n        if (!manageDirty)\n            return false; // files \u5B9E\u4F8B\uFF1Adirty \u6743\u5A01\u5728 local-head\uFF0C\u672C\u5B9E\u4F8B\u4E0D\u8868\u6001\n        if (_dirtyMem.has(name))\n            return _dirtyMem.get(name);\n        const v = kv.get(dirtyKey(name));\n        return v === null ? true : v === \"1\";\n    }\n    function setDirty(name, dirty) { if (!manageDirty)\n        return; _dirtyMem.set(name, dirty); kv.set(dirtyKey(name), dirty ? \"1\" : \"0\"); }\n    function clearState(name) { _dirtyMem.delete(name); kv.remove(etagKey(name)); if (manageDirty)\n        kv.remove(dirtyKey(name)); }\n    // N6\uFF08\u5BA1\u8BA1 2026-06-09\uFF0C\u5168\u573A\u552F\u4E00\u9759\u9ED8\u4E22\u5931\u8DEF\u5F84\uFF09\uFF1Alost-response/409 \u8BA4\u9886\u4E91\u7AEF item \u4E3A\u300C\u6211\u65B9\u6210\u529F push\u300D\u524D\uFF0C\n    //   size \u76F8\u7B49\u8FD8\u8981**\u5C3E\u90E8\u5B57\u8282\u76F8\u7B49**\u624D\u8BA4\u3002zip/ora \u5C3E = central directory + \u6BCF\u6761 CRC32 + EOCD \u2248 \u5185\u5BB9\u6307\u7EB9\uFF1B\n    //   \u53EA\u5728\u7F55\u89C1\u8BA4\u9886\u7A97\u53E3\u5BF9**\u5355\u4E2A\u5728\u63A8\u6587\u4EF6**\u62C9\u4E00\u6B21\u5C0F byte-range\uFF08\u4E0D\u662F\u56FE\u5E93\u904D\u5386\uFF09\u3002\u62C9\u5C3E\u5931\u8D25 = \u4FDD\u5B88\u4E0D\u8BA4\uFF08\u5B81\u53EF\u91CD\u8BD5\uFF0C\n    //   \u4E5F\u7EDD\u4E0D\u628A\u540C\u540D\u540C\u5927\u5C0F\u5F02\u5185\u5BB9\u6587\u4EF6\u9759\u9ED8\u8BA4\u4F5C\u6211\u65B9 push \u2192 \u672C\u5730\u5B57\u8282\u6C38\u4E0D\u4E22\uFF09\u3002\n    const _ADOPT_TAIL_N = 8192;\n    function _bytesEq(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (let i = 0; i < a.length; i++)\n            if (a[i] !== b[i])\n                return false;\n        return true;\n    }\n    async function _localTail(b, size, n) {\n        const start = Math.max(0, size - n);\n        if (b instanceof Blob)\n            return new Uint8Array(await b.slice(start, size).arrayBuffer());\n        return b.slice(start, size);\n    }\n    //   \u4E09\u6001\uFF1Amatch=\u5C3E\u7B26\uFF08\u786E\u8BA4\u6211\u65B9\uFF09\u3001differ=\u5C3E\u5F02\uFF08\u786E\u8BA4\u522B\u4EBA\u6587\u4EF6\uFF09\u3001unknown=\u62C9\u5C3E\u5931\u8D25\uFF08\u4FDD\u5B88\uFF1A\u4E0D\u8BA4\u4E5F\u4E0D\u8BEF\u5224 collision\uFF0C\u4FDD\u6301 dirty \u91CD\u8BD5\uFF09\u3002\n    async function _confirmOurUpload(fresh, localBytes, size) {\n        if (size <= 0)\n            return \"differ\"; // \u7A7A\u5B57\u8282\u4E0D\u8BA4\uFF080 \u5B57\u8282\u5360\u4F4D\u9632\u7EBF\uFF09\n        try {\n            const n = Math.min(_ADOPT_TAIL_N, size);\n            const offset = Math.max(0, (fresh.size || size) - n);\n            const raw = await provider.downloadRange(fresh.ref, offset, n);\n            const cloudTail = raw instanceof Uint8Array ? raw\n                : raw instanceof Blob ? new Uint8Array(await raw.arrayBuffer())\n                    : new Uint8Array(raw);\n            return _bytesEq(await _localTail(localBytes, size, n), cloudTail) ? \"match\" : \"differ\";\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            return \"unknown\";\n        } // \u62C9\u5C3E\u5931\u8D25 \u2192 \u672A\u77E5\uFF0C\u4FDD\u6301 dirty \u4E0B\u6B21\u91CD\u8BD5\uFF08\u4E0D\u9759\u9ED8\u8BA4\u9886\u3001\u4E5F\u4E0D\u8BEF\u62A5 collision\uFF09\n    }\n    async function push(name, bytes, opts = {}) {\n        // \u76EE\u6807\u6269\u5C55\u540D\u6309**\u5B57\u8282\u5185\u5BB9**\u8D70\uFF08caller\u2014\u2014store\u2014\u2014\u6309\u5C3E\u90E8\u63A2\u6D4B\u4F20 encrypted\uFF1B\u52A0\u5BC6=\u5BB9\u5668=.zip \u540D\u5B9E\u76F8\u7B26\uFF09\u3002\n        const enc = !!(encFileName && opts.encrypted);\n        const path = enc ? encFileName(name) : fileName(name);\n        let baseEtag = (\"baseEtag\" in opts) ? opts.baseEtag : getETag(name);\n        // \u6269\u5C55\u540D\u7FFB\u8F6C\uFF08encrypt/decrypt \u540E\u7684\u9996\u63A8\uFF09\uFF1A\u57FA\u51C6\u7248\u672C\u4F4F\u5728\u53E6\u4E00\u4E2A\u6269\u5C55\u540D\u4E0B \u2192\n        //   \u5148 If-Match **rename** \u7FFB\u8FC7\u6765\uFF08412 \u5B88\u536B\u4E0D\u7834\uFF09\uFF0C\u518D\u5BF9\u8FD4\u56DE\u7684\u65B0 etag \u505A\u5185\u5BB9\u4E0A\u4F20\u3002\n        //   rename \u662F metadata PATCH \u2192 etag \u5FC5\u53D8\uFF08S1\uFF09\uFF0C\u6240\u4EE5 If-Match \u94FE\u8981\u63A5\u529B\u5230 renamed.eTag\u3002\n        if (encFileName && baseEtag) {\n            const otherPath = enc ? fileName(name) : encFileName(name);\n            const target = await provider.getItemByPath(path).catch((e) => { reportStoreError(e, \"log\"); return null; });\n            if (!target) {\n                const other = await provider.getItemByPath(otherPath).catch((e) => { reportStoreError(e, \"log\"); return null; });\n                if (other) {\n                    if (other.eTag !== baseEtag)\n                        throw new CloudConflictError(`\u4E91\u7AEF\u5DF2\u6709\u66F4\u65B0\u7248\u672C \"${name}\"`, name);\n                    const newBase = baseName(path);\n                    const renamed = await provider.rename(other.ref, newBase, baseEtag); // If-Match \u5B88\u536B\u7684\u7FFB\u8F6C\n                    baseEtag = renamed.eTag;\n                }\n            }\n        }\n        // bytes \u662F Uint8Array\uFF08Bytes\uFF09\uFF0CbyteLength \u5373\u5B57\u8282\u6570\uFF1B?? size/length \u662F\u5386\u53F2\u517C\u5BB9\u515C\u5E95\uFF08\u4EFB\u610F\u6765\u6E90\uFF09\uFF0C\u6545\u6536\u7A84\u6210 any \u8BFB\u3002\n        const wrote = (bytes && (bytes.byteLength ?? bytes.size ?? bytes.length)) || 0;\n        // conflictBehavior\uFF1A\u6709 baseEtag \u2192 \"replace\"\uFF08If-Match \u5B88\uFF0C412 \u624D\u51B2\u7A81\uFF09\uFF1B**\u65E0 baseEtag\uFF08\u65B0\u5EFA/\u672A\u57FA\u4E8E\u4E91\u7248\uFF09\u2192 \"fail\"**\n        //   \u2192 \u7EDD\u4E0D\u65E0\u6761\u4EF6\u8986\u76D6\u4E91\u7AEF\u5DF2\u5B58\u5728\u7684\u540C\u540D\u6587\u4EF6\uFF08\u5426\u5219\u9759\u9ED8\u5403\u6389\u522B\u4EBA/\u65E7\u7248\u7684\u540C\u540D\u4F5C\u54C1 = \u6570\u636E\u4E22\u5931\uFF0Cpath-\u8EAB\u4EFD\u7EA2\u7EBF\uFF09\u3002\n        let item = null;\n        try {\n            item = await provider.upload(path, bytes, { contentType, eTag: baseEtag, conflictBehavior: baseEtag ? \"replace\" : \"fail\", onProgress: opts.onProgress, session: opts.session }); // F-54\uFF1A\u4E0A\u4F20\u4F1A\u8BDD\u843D\u76D8\n        }\n        catch (e) {\n            const status = e?.status;\n            if (status === 412)\n                throw new CloudConflictError(`\u4E91\u7AEF\u5DF2\u6709\u66F4\u65B0\u7248\u672C \"${name}\"`, name);\n            if (!(status === 409 && !baseEtag))\n                throw e;\n            // 409 = conflictBehavior:fail \u649E\u4E0A\u4E91\u7AEF\u5DF2\u5B58\u5728\u540C\u540D \u2192 \u843D\u4E0B\u9762\u6838\u9A8C\uFF08\u5927\u5C0F\u5339\u914D=\u6211\u65B9\u4E0A\u6B21\u6210\u529F\u4E0A\u4F20/\u540C\u5185\u5BB9\u2192\u8BA4\uFF1B\u5426\u5219\u4E0D\u8986\u76D6\uFF09\u3002\n        }\n        // H7 / 409 \u515C\u5E95\uFF1A\u672B\u54CD\u5E94\u65E0 item\uFF08\u5206\u7247\u4E22\u54CD\u5E94\uFF09\u6216 fail-409 \u2192 \u62C9\u6743\u5A01 meta\uFF1B**\u4EC5\u5927\u5C0F\u5339\u914D\u624D\u8BA4**\uFF08\u9632\u628A\n        //   0 \u5B57\u8282\u5360\u4F4D / \u522B\u4EBA\u7684\u5F02\u6587\u4EF6 \u9A97\u6210 synced\u2014\u2014postmortem 2026-06-05 \u7B2C\u2463\u7EA7 + path-\u8EAB\u4EFD\u540C\u540D\u78B0\u649E\uFF09\u3002\n        if (!item || !item.eTag) {\n            const fresh = await provider.getItemByPath(path).catch((e) => { reportStoreError(e, \"log\"); return null; });\n            // N6\uFF1Asize \u76F8\u7B49\u8FD8\u8981**\u5C3E\u90E8\u5B57\u8282\u76F8\u7B49**\u624D\u8BA4\u4F5C\u6211\u65B9\u6210\u529F push\uFF08\u9632\u540C\u540D\u540C\u5927\u5C0F\u5F02\u5185\u5BB9\u6587\u4EF6\u88AB\u9759\u9ED8\u8BA4\u9886=\u4E22\u5931\uFF09\u3002\n            const verdict = fresh && fresh.eTag && fresh.size === wrote ? await _confirmOurUpload(fresh, bytes, wrote) : null;\n            if (verdict === \"match\")\n                item = fresh; // size + \u5C3E\u90FD\u7B26 \u2192 \u786E\u8BA4\u6211\u65B9 push\n            else if (!baseEtag && fresh && fresh.size > 0 && verdict !== \"unknown\") {\n                // \u4E91\u7AEF\u5DF2\u6709\u540C\u540D\u3001\u975E\u7A7A\uFF0C\u4E14\uFF08\u5927\u5C0F\u4E0D\u7B26 **\u6216** \u5927\u5C0F\u76F8\u540C\u4F46\u5C3E\u90E8\u5F02\u5185\u5BB9\uFF09= \u522B\u4EBA\u7684\u540C\u540D\u5F02\u6587\u4EF6 \u2192 \u7EDD\u4E0D\u8986\u76D6\u3002\n                //   \u4FDD\u6301 dirty\uFF0C\u629B collision \u8BA9 caller \u63D0\u793A\u6539\u540D\uFF08\u672C\u5730\u5B57\u8282\u4E0D\u4E22\uFF09\u3002unknown\uFF08\u62C9\u5C3E\u5931\u8D25\uFF09\u4E0D\u5728\u6B64\u5217\u2014\u2014\u89C1\u4E0B\u3002\n                throw new CloudNameCollisionError(name);\n            }\n            else {\n                item = null;\n            } // 0 \u5B57\u8282\u5360\u4F4D / \u6709 base \u672A\u786E\u8BA4 / unknown \u62C9\u5C3E\u5931\u8D25 \u2192 \u4FDD\u6301 dirty\uFF0C\u4E0B\u6B21\u91CD\u8BD5\n        }\n        if (item && item.eTag) {\n            setETag(name, item.eTag);\n            setDirty(name, false);\n        }\n        return { item };\n    }\n    // 0.17.0 \u6D41\u5F0F\u65B0\u5EFA\uFF08KudsRocket\u300C\u8FB9\u52A0\u5BC6\u8FB9\u4E0A\u4F20\u3001\u4E0D\u7559\u672C\u5730\u526F\u672C\u300D\uFF09\uFF1A\u53EA\u65B0\u5EFA\uFF08conflictBehavior:\"fail\"\uFF09\uFF0C**\u4E0D\u7ECF seal\u3001\u4E0D\u78B0\u672C\u5730\u7F13\u5B58\u3001\u4E0D\u5199 etag/dirty**\n    //   \u2014\u2014\u6210\u529F\u540E\u5B83\u662F\u7EAF\u4E91\u7AEF\u6587\u4EF6\uFF08\u4E0B\u6B21 open \u8D70 acquire \u5EFA\u8C31\u7CFB\uFF09\u3002409 = \u4E91\u7AEF\u5DF2\u6709\u540C\u540D \u2192 CloudNameCollisionError\uFF0C\u4E00\u4E2A\u5B57\u8282\u4E0D\u4F20\uFF08\u4F1A\u8BDD\u8FD8\u6CA1\u5F00\u5C31\u649E\uFF09\u3002\n    //   provider \u6CA1\u6709 uploadStream \u2192 \u629B\u9519\uFF0C\u7EDD\u4E0D\u9000\u56DE\u6574\u4EFD\u62FC Blob\uFF08\u90A3\u6B63\u662F\u8FD9\u4E2A\u63A5\u53E3\u8981\u907F\u514D\u7684\uFF1Bfolder / mock / Graph \u90FD\u5B9E\u73B0\u4E86\uFF09\u3002\n    async function pushStream(name, source, opts = {}) {\n        if (!provider.uploadStream)\n            throw new Error(\"cloud-sync.pushStream: provider has no uploadStream\");\n        const path = fileName(name);\n        let item = null;\n        try {\n            item = await provider.uploadStream(path, source, { contentType, conflictBehavior: \"fail\", onProgress: opts.onProgress });\n        }\n        catch (e) {\n            if (e?.status === 409)\n                throw new CloudNameCollisionError(name);\n            throw e;\n        }\n        if (!item || !item.eTag) { // \u56DE\u6267\u4E22\u4E86\uFF1A\u6309 push \u7684 H7 \u53E3\u5F84\u62C9\u6743\u5A01 meta\uFF0C\u5927\u5C0F\u7B26\u624D\u8BA4\uFF1B\u4E0D\u7B26\u5F53\u5931\u8D25\uFF08\u6CA1\u6709\u672C\u5730\u5B57\u8282\u53EF\u7559 dirty\uFF0C\u76F4\u63A5\u629B\uFF09\n            const fresh = await provider.getItemByPath(path).catch((e) => { reportStoreError(e, \"log\"); return null; });\n            if (fresh && fresh.eTag && fresh.size === source.size)\n                item = fresh;\n            else\n                throw new Error(`cloud-sync.pushStream: upload of \"${name}\" was not confirmed by the cloud`);\n        }\n        return { item };\n    }\n    // **\u7EAF\u8BFB**\uFF08R1 \u6839\u6CBB\uFF0C\u5BA1\u8BA1 2026-06-10\uFF09\uFF1Apull \u53EA\u53D6\u5B57\u8282+item\uFF0C**\u7EDD\u4E0D**\u5199 etag/dirty\u3002\n    //   \u91C7\u7EB3\uFF08setETag/setDirty(false)\uFF09\u7531 caller \u5728**\u5B57\u8282\u771F\u6B63\u843D\u5730\u6210\u529F\u540E**\u663E\u5F0F\u63D0\u4EA4\u2014\u2014\u65E7\u7248 pull \u5148\u6C61\u67D3 kv\n    //   \u518D\u4EA4\u5B57\u8282\uFF0Cheal \u5931\u8D25/\u843D\u76D8\u524D\u5F3A\u9000\u90FD\u4F1A\u7559\u4E0B\u300Ckv \u6307\u65B0\u7248\u3001\u672C\u5730\u662F\u65E7\u5B57\u8282\u300D\u2192 \u4E0B\u6B21 push If-Match \u901A\u8FC7 =\n    //   \u9759\u9ED8\u8986\u76D6\u4E91\u7AEF\u5206\u53C9\u7248\uFF08R1 \u4E24\u6761 trace\uFF09\uFF1Bbranch/heal \u8DEF\u5F84\u8FD8\u4F1A\u987A\u624B\u6E05\u6389\u7528\u6237\u7684 dirty\uFF08K12 \u540C\u6839\u56E0\uFF09\u3002\n    async function pull(name) {\n        const { item } = await _find(name);\n        if (!item)\n            return null;\n        const blob = await provider.download(item.ref);\n        return { blob, item, suggestedName: name };\n    }\n    async function fetchMeta(name) {\n        const { item } = await _find(name);\n        if (!item)\n            return null;\n        return { etag: item.eTag, lastModified: item.lastModifiedDateTime, size: item.size, item };\n    }\n    // \u5C3E\u90E8 byte-range\uFF08\u7EAF\u8BFB\uFF09\uFF1Apeek \u9884\u89C8\u7EAF\u4E91\u7AEF\u6587\u4EF6\u7528\u3002store.getTailBytes \u7684\u4E91\u7AEF\u817F\u3002\n    async function pullTail(name, n) {\n        const { item, enc } = await _find(name);\n        if (!item)\n            return null;\n        const offset = Math.max(0, (item.size || 0) - n);\n        const raw = await provider.downloadRange(item.ref, offset, Math.min(n, item.size || n));\n        const bytes = raw instanceof Uint8Array ? raw\n            : raw instanceof ArrayBuffer ? new Uint8Array(raw)\n                : new Uint8Array(await raw.arrayBuffer());\n        return { bytes, item, encrypted: enc };\n    }\n    // \u4EFB\u610F\u7EDD\u5BF9\u504F\u79FB byte-range\uFF08\u7EAF\u8BFB\uFF09\uFF1AgetPeek \u89E3 zip \u65F6\uFF0CCD / \u76EE\u6807 entry \u6EA2\u51FA\u5C3E\u7247\u5C31\u7528\u5B83\u4E8C\u6B21\u62C9\u3002\n    //   offset/length \u5BF9 item.size \u94B3\u8FB9\uFF1B\u7A7A\u533A\u95F4\u76F4\u63A5\u8FD4\u7A7A\uFF08\u4E0D\u6253\u7F51\u7EDC\uFF09\u3002\n    //   encrypted\uFF1A\u547D\u4E2D\u7684\u662F encFileName \u90A3\u4EFD\uFF08\u52A0\u5BC6\u5BB9\u5668\uFF09\u2014\u2014getHead \u636E\u6B64\u62D2\u7ED9\u5934\u7247\uFF08\u5BC6\u6587\u5934\u5BF9 app \u65E0\u610F\u4E49\uFF0C\u4E14\u7EDD\u4E0D\u5728\u5E93\u5916\u89E3\uFF09\u3002\n    async function pullRange(name, offset, length) {\n        const { item, enc } = await _find(name);\n        if (!item)\n            return null;\n        const size = item.size || 0;\n        const off = Math.max(0, Math.min(offset, size));\n        const len = Math.max(0, Math.min(length, size - off));\n        if (len === 0)\n            return { bytes: new Uint8Array(0), item, encrypted: enc };\n        const raw = await provider.downloadRange(item.ref, off, len);\n        const bytes = raw instanceof Uint8Array ? raw\n            : raw instanceof ArrayBuffer ? new Uint8Array(raw)\n                : new Uint8Array(await raw.arrayBuffer());\n        return { bytes, item, encrypted: enc };\n    }\n    // move-aside\uFF1A\u539F\u6587\u4EF6 \u2192 ensureFolder(.trash) \u2192 move\uFF0C**\u59CB\u7EC8\u52A0 [ts] \u540E\u7F00**\uFF08\u591A\u6B21\u5220\u540C\u540D\u6C38\u4E0D\u51B2\u7A81\uFF09\u3002\n    // deleteEventId\uFF1A\u7531 delete.ts \u751F\u6210\u3001**\u4E24\u6761\u817F\u5171\u7528**\uFF0C\u5D4C\u8FDB trash \u540D\u91CC \u2192 trash-merge \u636E\u6B64\u7CBE\u786E\u914D\u5BF9\u3002\n    //   \u5FC5\u586B\u4E0D\u7ED9\u9ED8\u8BA4\uFF1A\u53EF\u9009\u53C2\u6570\u7B49\u4E8E\u7ED9\u672A\u6765\u7559\u4E86\"\u4E24\u7AEF\u5404\u751F\u6210\"\u7684\u53E3\u5B50\uFF0C\u800C\u90A3\u6B63\u662F\u672C\u6B21\u8981\u4FEE\u6389\u7684 bug\u3002\n    //   opts.baseEtag\uFF1A**delete-vs-edit \u7684 edit-wins \u7531\u8FD9\u91CC\u5F3A\u5236**\uFF08v435\uFF09\u3002delete.ts \u4E4B\u524D\u53EA\u505A\u300C\u8BFB\u6BD4\u5BF9\u300D\u2014\u2014\n    //     fetchMeta \u7684 etag \u5BF9\u4E0A\u4E86\u5C31\u642C\uFF0C\u800C\u642C\u8FD9\u4E2A\u52A8\u4F5C\u672C\u8EAB\u4E0D\u5E26 If-Match\uFF0C\u4E2D\u95F4\u9694\u7740 _find + ensureFolder \u4E24\u6B21\u5F80\u8FD4\u3002\n    //     \u522B\u8BBE\u5907\u5728\u8FD9\u4E2A\u7A97\u53E3\u63A8\u65B0\u7248 \u2192 \u6BD4\u5BF9\u5DF2\u901A\u8FC7 \u2192 \u65B0\u5B57\u8282\u88AB\u642C\u8FDB .trash\u3002\u73B0\u5728 412 \u4F1A\u628A\u5B83\u53D8\u6210 conflict-edit-wins\u3002\n    //     \u4E0D\u4F20\u65F6\u9000\u56DE item.eTag\uFF08\u4ECD\u95ED\u5408 _find\u2192move \u7684\u7A97\u53E3\uFF0C\u6BD4\u88F8\u5954\u5F3A\uFF09\u3002\n    async function trash(name, deleteEventId, opts = {}) {\n        const { item, enc } = await _find(name);\n        if (!item) {\n            clearState(name);\n            return null;\n        }\n        const folderId = await provider.ensureFolder(trashFolder);\n        const stamped = stampedName(name, enc, deleteEventId); // basename + deleteEventId\uFF08trash \u5185\u4E22 folder context\uFF1B\u9632\u540C\u540D\u649E\uFF09\uFF1B\u4FDD\u7559\u52A0\u5BC6\u6269\u5C55\u540D\n        const moved = await provider.move(item.ref, folderId, { newName: stamped, conflictBehavior: \"fail\", eTag: opts.baseEtag ?? item.eTag });\n        clearState(name);\n        return moved;\n    }\n    // \u4ECE trash \u79FB\u56DE\uFF1BconflictBehavior=fail \u9632\u8986\u76D6\u76EE\u6807\u4F4D\u7F6E\u540C\u540D\uFF08\u5173\u952E data-loss \u70B9\uFF09\uFF1B\u649E\u540D (2)(3) \u91CD\u8BD5\u3002\n    //   opts.encrypted\uFF1Atrash \u91CC\u662F\u52A0\u5BC6\u5BB9\u5668\uFF08.zip \u5C3E\uFF09\u2192 \u843D encFileName\uFF08\u5426\u5219\u52A0\u5BC6\u5B57\u8282\u88AB\u6062\u590D\u5230\u660E\u6587\u8DEF\u5F84\u3001\u53CC\u51FB\u6253\u4E0D\u5F00\uFF09\u3002\n    //   opts.eTag\uFF1A\u6E90 item \u7684 If-Match\u3002\u26A0 412 \u548C 409 \u542B\u4E49\u4E0D\u540C\uFF0C**\u4E0D\u80FD\u90FD\u5F53\u649E\u540D\u91CD\u8BD5**\uFF1A\n    //     409 = \u76EE\u6807\u4F4D\u7F6E\u5DF2\u6709\u540C\u540D \u2192 \u6362\u4E2A\u5019\u9009\u540D\u91CD\u8BD5\uFF08\u4E0B\u9762\u7684\u5FAA\u73AF\uFF09\u3002\n    //     412 = \u56DE\u6536\u7AD9\u91CC\u90A3\u4E2A\u6E90 item \u5DF2\u7ECF\u53D8\u4E86\uFF08\u522B\u8BBE\u5907\u6062\u590D/\u6E05\u7A7A\u4E86\u5B83\uFF09\u2192 \u6362\u540D\u91CD\u8BD5\u6BEB\u65E0\u610F\u4E49\uFF0C\u76F4\u63A5\u629B\u3002\n    //   \u649E\u540D\u5019\u9009\uFF082026-08-25 \u4E0E\u672C\u5730\u817F\u5BF9\u9F50\uFF0C\u6848\u5377 \u00A78\uFF09\uFF1A`base [yyyymmdd-hhmmss]`\uFF08\u5FEB\u7167\u81EA\u5DF1\u7684\u65F6\u523B\uFF0C\n    //   opts.snapshotStamp \u7531 trash.ts \u4ECE trashKey \u62BD\u7ED9\uFF1B\u62FF\u4E0D\u5230\u9000\u6062\u590D\u65F6\u523B\uFF09\u2192 \u4ECD\u649E\u8865 `-2`/`-3`\u2026\uFF1B\n    //   \u65E7\u7248 `(2)(3)` \u5E8F\u53F7\u5DF2\u5E9F\uFF08user\uFF1Abackup \u7684\u65F6\u95F4\u5206\u8FA8\u7387\u8BED\u4E49\uFF09\u3002\n    async function restore(cloudRef, targetName, opts = {}) {\n        const clean = targetName;\n        const folder = clean.includes(\"/\") ? clean.slice(0, clean.lastIndexOf(\"/\")) : \"\";\n        const base = baseName(clean);\n        const mkName = opts.encrypted && encFileName ? encFileName : fileName; // \u52A0\u5BC6\u4EF6\u6062\u590D\u4FDD\u7559 .zip \u5BB9\u5668\u6269\u5C55\u540D\n        const folderId = await provider.ensureFolder(folder);\n        const disp = restoreStampDisplay(opts.snapshotStamp, now());\n        // \u6233\u63D2\u5728\u54EA\uFF1A\u548C\u672C\u5730\u817F\u540C\u4E00\u4E2A\u51FD\u6570\uFF08identifiers.withStemTail\uFF09\u2014\u2014\u6587\u6863\u63D2\u5728\u540E\u7F00\u4E4B\u524D\uFF0C\u975E\u6587\u6863\u63D2\u5728\u6700\u540E\u4E00\u4E2A\u70B9\u4E4B\u524D\u3002\n        //   0.16.0 \u4E4B\u524D\u8FD9\u4E00\u817F\u628A\u6233\u63A5\u5728\u540D\u5B57\u672B\u5C3E\uFF08`\u7A3F.txt [\u6233]`\uFF09\uFF0C\u5BBF\u4E3B\u8BA4\u4E0D\u51FA\u3002\n        const stamped = (suf) => withStemTail(base, ` [${suf}]`, ids);\n        for (let attempt = 1; attempt < 100; attempt++) {\n            const candidate = attempt === 1 ? base : attempt === 2 ? stamped(disp) : stamped(`${disp}-${attempt - 1}`);\n            try {\n                return await provider.move(cloudRef, folderId, { newName: mkName(candidate), conflictBehavior: \"fail\", eTag: opts.eTag ?? null });\n            }\n            catch (e) {\n                const status = e?.status;\n                if (status === 409)\n                    continue; // \u76EE\u6807\u649E\u540D \u2192 \u6362\u5019\u9009\u540D\n                // 404 =\u300C\u5DF2\u88AB\u522B\u5904\u52A8\u8FC7\u300D\u9519\u8BEF\u65CF\uFF082026-08-25 \u62CD\u677F\u914D\u5957\uFF1B\u9884\u5B58\u5C0F\u6D1E\uFF1Alist\u2192\u70B9\u51FB\u7A97\u53E3\u91CC\u522B\u8BBE\u5907\u5DF2\u6062\u590D/\u6E05\u7A7A\u8BE5\u9879\uFF09\u3002\n                //   OneDrive \u4E0B ref \u7A33\u5B9A \u2192 404 \u5FC5\u662F\u300C\u4E1C\u897F\u6CA1\u4E86\u300D\uFF1Bpath-as-id provider \u4E0B\u6539\u540D/\u79FB\u52A8\u540C\u6837\u843D\u8FD9\u3002app \u63D0\u793A\u5237\u65B0\u3002\n                if (status === 404)\n                    throw new CloudStaleRefError(cloudRef, `\u56DE\u6536\u7AD9\u9879\u5DF2\u88AB\u522B\u5904\u52A8\u8FC7\uFF08\u6062\u590D/\u6E05\u7A7A\uFF09\uFF0C\u8BF7\u5237\u65B0\uFF1A${targetName}`, e);\n                throw e; // 412\uFF08\u6E90\u53D8\u4E86\uFF09/ \u5176\u5B83 \u2192 \u629B\uFF0C\u522B\u62FF\u6362\u540D\u53BB\u63A9\u76D6\n            }\n        }\n        return await provider.move(cloudRef, folderId, { newName: mkName(stamped(asideStamp(now()))), conflictBehavior: \"fail\", eTag: opts.eTag ?? null }); // 100 \u8FDE\u649E\u7684\u75C5\u6001\u515C\u5E95\uFF1Aguid \u5FC5\u4E0D\u649E\n    }\n    //   eTag\uFF1A\u786C\u5220\u662F\u4E0D\u53EF\u9006\u7684\uFF0C\u5FC5\u987B If-Match\uFF08v435\uFF09\u3002\u7A84 TOCTOU \u4F46\u540E\u679C\u6700\u91CD\uFF1A\u522B\u8BBE\u5907\u5728 list \u4E0E delete \u4E4B\u95F4\n    //   \u628A\u8FD9\u9879\u4ECE .trash \u6062\u590D\u51FA\u53BB \u2192 \u6211\u65B9\u6309 ref \u786C\u5220\u6389\u90A3\u4E2A**\u5DF2\u7ECF\u6D3B\u8FC7\u6765\u7684**\u6587\u4EF6\u3002\u8C03\u7528\u65B9\u624B\u4E0A\u672C\u6765\u5C31\u6709 it.eTag\u3002\n    //   \uFF08OneDrive ref \u8DE8 move \u7A33\u5B9A \u2192 \u8FD9\u4E00\u624B\u771F\u4F1A\u6307\u5230\u6D3B\u6587\u4EF6\u2014\u2014If-Match \u65E7 eTag 412 \u62E6\u4E0B\uFF0C\u6B63\u662F\u6B64\u5B88\u536B\u7684\u5B58\u5728\u7406\u7531\u3002\uFF09\n    async function purge(cloudRef, eTag) {\n        try {\n            await provider.delete(cloudRef, eTag ?? undefined);\n        }\n        catch (e) {\n            // 404 \u2192 \u8BE5\u9879\u5DF2\u88AB\u522B\u5904\u5F7B\u5E95\u5220/\u52A8\u8FC7\uFF1A\u76EE\u7684\uFF08trash \u91CC\u6CA1\u6709\u5B83\uFF09\u5DF2\u8FBE\u6210\u4E00\u534A\uFF0C\u4F46**\u4E0D\u80FD**\u8C0E\u62A5 purged\u2014\u2014\n            //   \u82E5\u662F\u88AB\u522B\u5904\u300C\u6062\u590D\u300D\uFF0C\u6587\u4EF6\u6B63\u6D3B\u7740\uFF1B\u7EDF\u4E00\u8FDB\u300C\u5DF2\u88AB\u522B\u5904\u52A8\u8FC7\u300D\u9519\u8BEF\u65CF\uFF0Capp \u63D0\u793A\u5237\u65B0\u5217\u8868\u3002\n            if (e?.status === 404)\n                throw new CloudStaleRefError(cloudRef, \"\u56DE\u6536\u7AD9\u9879\u5DF2\u88AB\u522B\u5904\u52A8\u8FC7\uFF08\u5DF2\u5220\u6216\u5DF2\u6062\u590D\uFF09\uFF0C\u8BF7\u5237\u65B0\", e);\n            throw e;\n        }\n    }\n    // weak-override\uFF08ADR-0009 / share-file-model\uFF09\uFF1A\u7528\u672C\u5730\u8986\u76D6\u4E91\u7AEF\uFF0C\u4F46**\u4E91\u7AEF loser \u5148 stash \u8FDB .backup \u4E0D\u4E22**\u3002\n    // \u6C38\u4E0D lossy\uFF08Work \u7981 hard-override / destructive pull\uFF1B\u8FD9\u662F never-lose \u7684\u8986\u76D6\uFF09\u3002\u8FD4 { item, backedUp }\u3002\n    // O3 copy-then-replace\uFF082026-08-25 user \u62CD\u677F\uFF0C\u6848\u5377 20260825-cloud-override-adopt-noop-case.md \u00A74(a)\uFF09\uFF1A\n    //   \u65E7\u7248 = move \u8FDB .backup \u518D\u65E0 If-Match \u4E0A\u4F20\u2014\u2014move \u4E0E upload \u4E4B\u95F4\u65AD\u7F51 \u2192 \u539F path ghost\uFF1Bpath \u7A7A\u7A97\u671F\u7B2C\u4E09\n    //   \u8BBE\u5907\u65B0\u5EFA\u540C\u540D\u8FD8\u4F1A\u88AB replace \u65E0\u5907\u4EFD\u76F2\u8986\u76D6\u3002\u65B0\u7248 = \u5148\u670D\u52A1\u7AEF **copy** loser \u8FDB .backup\uFF08\u539F\u4F4D\u4E0D\u52A8\uFF09\uFF0C\u518D\u62FF\n    //   copy \u65F6\u6355\u83B7\u7684 etag \u505A **If-Match CAS replace**\uFF08\u300C\u6211\u8986\u76D6\u7684\u6B63\u662F\u6211\u521A\u5907\u4EFD\u7684\u90A3\u4E00\u7248\u300D\uFF09\u3002\u4EFB\u4F55\u4E00\u6B65\u5931\u8D25 \u2192\n    //   \u539F\u4F4D\u539F\u7248\u5B8C\u597D\uFF0Cghost \u4E0D\u53EF\u8868\u793A\uFF1B\u7A97\u53E3\u5185\u4E91\u7AEF\u53C8\u52A8\u4E86 \u2192 412 \u629B\u3001\u4E0A\u5C42\u91CD\u65B0 surface\uFF08.backup \u591A\u51FA\u7684\u90A3\u4EFD copy\n    //   \u7559\u7740\u2014\u2014\u591A\u5907\u4E0D\u5220\uFF0C\u00A7A \u7EDD\u4E0D\u5220\u5B57\u8282\uFF09\u3002\u5168\u5E93\u6700\u540E\u4E00\u4E2A\u88F8 replace \u5C31\u6B64\u6536\u7F16\uFF08\u5168\u5E93 If-Match \u5BB6\u89C4 2026-08-25\uFF09\u3002\n    async function weakOverride(name, bytes, opts = {}) {\n        const path = (encFileName && opts.encrypted) ? encFileName(name) : fileName(name);\n        const cur = await _find(name);\n        let backedUp = null;\n        let item;\n        if (cur.item) {\n            if (opts.backup !== false) { // 2.1.0\uFF1A\u4E8C\u7B49\u81EA\u52A8\u5907\u4EFD\u7684\u8F93\u5BB6\u4E0D\u8FDB .backup\uFF08\u8868\u91CC\u8BF4\u673A\u5668\u53EF\u4EE5\u4E22\u5B83\uFF09\uFF1B\u4F5C\u54C1\u7167\u65E7\u5148\u7559\u5E95\n                const folderId = await provider.ensureFolder(backupFolder);\n                const stamped = stampedName(name, cur.enc); // ts-counter \u9632\u540C\u540D\u591A\u6B21\u5907\u4EFD\u649E\uFF08\u65E7\u7248\u540C ms \u4F1A fail \u629B\u9519\uFF09\uFF1Bloser \u4FDD\u7559\u5176\u6269\u5C55\u540D\n                await provider.copy(cur.item.ref, folderId, stamped);\n                backedUp = `${backupFolder}/${stamped}`;\n            }\n            item = await provider.upload(path, bytes, { contentType, eTag: cur.item.eTag, conflictBehavior: \"replace\" });\n        }\n        else {\n            // \u65E0\u65E2\u6709 \u2192 \u521B\u5EFA\u95E8\uFF08\u4E0D\u5B58\u5728\u624D\u51C6\u5EFA\uFF1B\u649E\u4E0A\u7A97\u53E3\u91CC\u7B2C\u4E09\u8BBE\u5907\u7684\u65B0\u5EFA \u2192 409\uFF0C\u7EDD\u4E0D\u76F2\u8986\u76D6\uFF09\u3002\n            item = await provider.upload(path, bytes, { contentType, conflictBehavior: \"fail\" });\n        }\n        if (!item || !item.eTag) {\n            const f = await provider.getItemByPath(path).catch((e) => { reportStoreError(e, \"log\"); return null; });\n            if (f && f.eTag)\n                item = f;\n        }\n        if (item && item.eTag) {\n            setETag(name, item.eTag);\n            setDirty(name, false);\n        }\n        return { item, backedUp };\n    }\n    // ---- gallery \u5217\u8868 / rename / \u786C\u5220\uFF08\u6269\u5C55\u540D agnostic\uFF1Amatch/toName \u6CE8\u5165\uFF09----\n    // folders \u975E null \u65F6\u987A\u5E26\u6536\u96C6\u5B50\u6587\u4EF6\u5939\u8DEF\u5F84\uFF08\u542B\u7A7A\u6587\u4EF6\u5939\uFF09\u2014\u2014gallery \u6587\u4EF6\u5939\u6A21\u578B\u300C\u4E91\u7AEF\u771F\u6587\u4EF6\u5939\u4E3A\u51C6\u300D\u7528\u3002\n    // \u4E00\u6B21 walk \u540C\u65F6\u62FF\u6587\u4EF6+\u6587\u4EF6\u5939\uFF08listAll\uFF09\uFF0C\u7701\u4E00\u534A Graph \u5F80\u8FD4\u3002list() \u4F20 folders=null\uFF0C\u8BED\u4E49\u4E0D\u53D8\u3002\n    // status.partial\uFF1A\u4EFB\u4E00\u5B50\u6811 provider.list \u629B\u9519\u88AB\u541E \u2192 \u8FD9\u6B21 walk **\u4E0D\u5B8C\u6574**\uFF08\u8FD4\u56DE\u7684 files \u7F3A\u4E86\u90A3\u68F5\u5B50\u6811\uFF09\u3002\n    //   cloud-gone reconciliation \u7684\u547D\u95E8\uFF1Apartial \u5217\u8868\u91CC\u300C\u7F3A\u5931\u300D\u2260\u300C\u4E91\u7AEF\u771F\u6CA1\u4E86\u300D\uFF0C\u7EDD\u4E0D\u80FD\u636E\u6B64 drop \u672C\u5730\u7F13\u5B58\n    //   \uFF08\u5426\u5219\u4E00\u4E2A\u5B50\u6587\u4EF6\u5939\u5217\u4E3E\u5931\u8D25 = \u8BEF\u5220\u4E00\u6574\u68F5\u5B50\u6811\u7684\u672C\u5730\u7F13\u5B58\uFF09\u3002listAll \u636E\u6B64\u8FD4 complete \u6807\u5FD7\u3002\n    async function _walk(subpath, out, depth, folders, status) {\n        if (depth > 8)\n            return;\n        let items;\n        try {\n            items = await provider.list(subpath);\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            status.partial = true;\n            return;\n        }\n        for (const it of items) {\n            // \u9690\u85CF\u9879\uFF08\u672B\u6BB5\u4EE5 \".\" \u5F00\u5934\uFF09\u6574\u4E2A\u8DF3\u8FC7\uFF1A.trash / .backup / .<appId>(collections/settings) \u5B89\u5168\u7F51\u5939 +\n            //   \u4EFB\u610F dotfile/dotfolder\uFF0C\u90FD\u4E0D\u8FDB\u6587\u4EF6\u5217\u8868\u3001\u4E0D\u8FDB\u6587\u4EF6\u5939\u5217\u8868\u3001\u4E0D\u9012\u5F52\u5176\u5185\u5BB9\uFF08isHidden \u6DF1\u6A21\u5757\u552F\u4E00\u771F\u76F8\uFF09\u3002\n            if (isHiddenAny(it.name))\n                continue;\n            const itPath = subpath ? `${subpath}/${it.name}` : it.name;\n            if (it.isFolder) {\n                if (folders)\n                    folders.push(itPath);\n                await _walk(itPath, out, depth + 1, folders, status);\n            }\n            else if (match(it))\n                out.push({ ...it, path: itPath, name: toName(itPath) });\n        }\n    }\n    async function list() { const out = []; await _walk(\"\", out, 0, null, { partial: false }); return out; }\n    // gallery \u4E00\u6B21\u53D6\u9F50\uFF1A{ files, folders, complete }\uFF08folders \u542B\u7A7A\u6587\u4EF6\u5939\uFF09\u3002\u6587\u4EF6\u5939\u6A21\u578B\u5355\u4E00\u771F\u76F8\u6E90\u3002\n    //   complete=false \u2192 \u8FD9\u6B21\u5217\u4E3E\u6709\u5B50\u6811\u5931\u8D25\uFF08partial\uFF09\uFF0C\u8C03\u7528\u65B9\uFF08reconcile\uFF09\u5FC5\u987B\u5F53\u300C\u5217\u8868\u4E0D\u6743\u5A01\u300D\u5904\u7406\u3002\n    async function listAll() {\n        const out = [], folders = [], status = { partial: false };\n        await _walk(\"\", out, 0, folders, status);\n        return { files: out, folders, complete: !status.partial };\n    }\n    async function listFolders() { const out = [], folders = []; await _walk(\"\", out, 0, folders, { partial: false }); return folders; }\n    // \u5355\u5939\u5217\u4E3E\uFF08**\u975E\u9012\u5F52**\uFF0C\u4E00\u6B21 provider.list\uFF09\u2014\u2014watchFolder / reconcileFolder \u7528\uFF1B\u66FF\u4EE3\u300ClistAll \u5168\u6811 walk \u540E\u5BA2\u6237\u7AEF\u5207\u4E00\u5939\u300D\u7684\u6D6A\u8D39\u3002\n    //   complete=false \u27F8 \u8FD9\u4E00\u5939 list() \u629B\u9519\uFF08\u79BB\u7EBF/\u672A\u767B\u5F55/\u5B50\u6811\u5931\u8D25\uFF09\u2192 \u8C03\u7528\u65B9\u5F53\u300C\u4E0D\u6743\u5A01\u300D\uFF0C\u7EDD\u4E0D\u636E\u6B64\u5224 cloud-gone\uFF08\u540C _walk partial \u7EAA\u5F8B\uFF09\u3002\n    //   \u9876\u5C42 .trash/.backup \u540C _walk \u8DF3\u8FC7\uFF08path===\"\" \u65F6\uFF09\u3002folders = immediate \u5B50\u5939\u5168\u8DEF\u5F84\u3002\n    async function listFolder(path) {\n        let items;\n        try {\n            items = await provider.list(path);\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            return { files: [], folders: [], complete: false };\n        }\n        const files = [], folders = [];\n        for (const it of items) {\n            if (isHiddenAny(it.name))\n                continue; // \u9690\u85CF\u9879\uFF08.trash/.backup/.<appId>/\u4EFB\u610F dot\uFF09\u4E0D\u8FDB\u5217\u4E3E\u2014\u2014isHidden \u6DF1\u6A21\u5757\n            const itPath = path ? `${path}/${it.name}` : it.name;\n            if (it.isFolder)\n                folders.push(itPath);\n            else if (match(it))\n                files.push({ ...it, path: itPath, name: toName(itPath) });\n        }\n        return { files, folders, complete: true };\n    }\n    async function listTrash() {\n        let items;\n        try {\n            items = await provider.list(trashFolder);\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            return [];\n        }\n        return items.filter(match);\n    }\n    // \u5907\u4EFD\u7BB1\u5217\u8868\uFF08weakOverride/keepMine \u7684 loser \u5B57\u8282 stash \u5904\uFF09\u3002\u6062\u590D/\u5F7B\u5E95\u5220\u8D70\u901A\u7528 restore(itemId)/purge(itemId)\u3002\n    async function listBackup() {\n        let items;\n        try {\n            items = await provider.list(backupFolder);\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            return [];\n        }\n        return items.filter(match);\n    }\n    // \u540C folder \u2192 rename\uFF1B\u8DE8 folder \u2192 ensureFolder + move\u3002caller \u4FDD\u8BC1 newName \u4E0D\u51B2\u7A81\u3002\n    //   opts.baseEtag\uFF1Av435 \u8865\u3002**\u540C\u4E00\u4E2A\u6587\u4EF6\u91CC push \u7684\u6269\u5C55\u540D\u7FFB\u8F6C\uFF08L185 \u4E00\u5E26\uFF09\u65E9\u5C31\u4F20 eTag \u4E86\uFF0C\u8FD9\u91CC\u5374\u6CA1\u4F20** \u2014\u2014\n    //     \u8FD9\u6761\u81EA\u76F8\u77DB\u76FE\u6B63\u662F\u300C\u975E upload \u7684\u5199\u6574\u7247\u6F0F\u6389 If-Match\u300D\u8FD9\u4E2A pattern \u6700\u76F4\u767D\u7684\u8BC1\u636E\u3002\n    //     \u4E0D\u4F20\u65F6\u9000\u56DE item.eTag\uFF08\u95ED\u5408 _find\u2192rename \u7684\u7A97\u53E3\uFF09\u3002\n    async function rename(oldName, newName, opts = {}) {\n        if (oldName === newName)\n            return;\n        const found = await _find(oldName);\n        const item = found.item;\n        if (!item)\n            throw new Error(`\u4E91\u7AEF\u627E\u4E0D\u5230\uFF1A${oldName}`);\n        const oldFolder = oldName.includes(\"/\") ? oldName.slice(0, oldName.lastIndexOf(\"/\")) : \"\";\n        const newFolder = newName.includes(\"/\") ? newName.slice(0, newName.lastIndexOf(\"/\")) : \"\";\n        // \u6539\u540D\u4FDD\u7559\u5F53\u524D\u6269\u5C55\u540D\uFF08\u52A0\u5BC6\u6587\u4EF6\u6539\u540D\u540E\u4ECD\u662F .zip\u2014\u2014\u6269\u5C55\u540D\u8DDF\u5B57\u8282\u5185\u5BB9\u8D70\uFF0C\u4E0D\u8DDF\u64CD\u4F5C\u8D70\uFF09\n        const mkName = found.enc && encFileName ? encFileName : fileName;\n        const newBase = mkName(newName.includes(\"/\") ? newName.slice(newName.lastIndexOf(\"/\") + 1) : newName);\n        let moved;\n        if (oldFolder === newFolder) {\n            moved = await provider.rename(item.ref, newBase, opts.baseEtag ?? item.eTag);\n        }\n        else {\n            const targetId = newFolder ? await provider.ensureFolder(newFolder) : await provider.getApprootRef();\n            moved = await provider.move(item.ref, targetId, { newName: newBase, conflictBehavior: \"fail\", eTag: opts.baseEtag ?? item.eTag });\n        }\n        // S1 \u6839\u56E0\uFF1AOneDrive \u7684 rename/move \u662F metadata PATCH \u2192 **etag \u4E00\u5B9A\u4F1A\u53D8**\u3002\u7EDD\u4E0D\u628A\u65B0\u540D\u951A\u5728\u65E7 etag \u4E0A\n        //   \uFF08\u65E7 bug\uFF1AsetETag(new, getETag(old)) \u2192 base \u6C38\u4E45\u8FC7\u671F \u2192 \u4E0B\u6B21 open \u5FC5\u5F39\u5047\u300C\u4E91\u7AEF\u6709\u65B0\u7248\u672C\u300D\uFF09\u3002\n        //   \u91C7\u7EB3\u670D\u52A1\u7AEF\u8FD4\u56DE\u7684\u65B0 etag\uFF1B\u53EA\u6709\u5F02\u5E38 provider \u8FD4\u56DE\u7F3A etag \u624D\u56DE\u9000\u65E7 etag \u515C\u5E95\u3002\n        const newETag = (moved && moved.eTag) || getETag(oldName);\n        setETag(newName, newETag);\n        setDirty(newName, false); // \u521A\u6539\u5B8C\u540D\u5373\u5E72\u51C0\u2014\u2014\u5426\u5219 isDirty \u9ED8\u8BA4 true \u628A\u5B83\u5F53 cloud-dirty\uFF08\u53E0\u52A0\u5047\u51B2\u7A81 + bypass \u5B88\u536B\u8BEF\u629B\uFF09\n        clearState(oldName);\n    }\n    // remove()\uFF08\u6D3B\u6587\u4EF6\u786C\u5220\uFF09\u5DF2\u5220\u9664\uFF08v435\uFF09\uFF1A**\u96F6\u8C03\u7528\u8005**\uFF0C\u5374\u5728 CloudSync \u5951\u7EA6\u4E0A\u6302\u7740\u4E00\u6761\u7ED5\u8FC7\n    //   \u300C\u5220\u9664 = \u79FB\u5230 .trash\u300D\u7EA2\u7EBF\u7684\u73B0\u6210\u901A\u9053\u2014\u2014\u552F\u4E00\u7684\u4F5C\u7528\u5C31\u662F\u7B49\u7740\u67D0\u5929\u88AB\u4EBA\u987A\u624B\u7528\u4E0A\u3002\n    //   \u771F\u8981\u300C\u5F7B\u5E95\u5220\u300D\u4E5F\u5E94\u5F53\u5148 trash \u518D purge\uFF08\u4E24\u6B65\u90FD\u53EF\u5BA1\u8BA1\u3001\u90FD\u53EF\u6062\u590D\u5230\u4E2D\u9014\uFF09\u3002\n    // ---- \u7A7A\u6587\u4EF6\u5939\uFF08gallery \u6587\u4EF6\u5939\u6A21\u578B\uFF1AOneDrive \u771F\u6587\u4EF6\u5939\u4E3A\u5355\u4E00\u771F\u76F8\u6E90\uFF09----\n    // \u65B0\u5EFA\uFF1Aidempotent\uFF08\u5DF2\u5B58\u5728\u5219\u590D\u7528 id\uFF0C\u4E0D\u62A5\u9519\uFF09\u3002\n    async function ensureFolder(path) {\n        await provider.ensureFolder(path);\n    }\n    // \u5220\u9664\uFF1A**\u6DF1\u6A21\u5757\u5185\u5F3A\u5236\u300C\u5FC5\u987B\u7A7A\u300D**\u2014\u2014\u4E91\u7AEF\u4FA7 list \u5B50\u9879\uFF0C\u975E\u7A7A\u62D2\u5220\uFF08\u9632\u7EA7\u8054\u5220\u6574\u68F5\u5B50\u6811\uFF1B\n    //   \u662F UI guard \u4E4B\u4E0A\u7684\u786C\u515C\u5E95\uFF0C\u5E93\u88AB\u65E0\u5934\u590D\u7528/UI \u7ED5\u8FC7\u65F6\u4E5F\u6321\u5F97\u4F4F\uFF09\u3002\u8FD4\u56DE false=\u4E91\u7AEF\u5DF2\u65E0\u6B64\u5939\uFF08noop\uFF0C\u4E0D\u62A5\u9519\uFF09\u3002\n    // \u5220\u7A7A\u5939 = \u8584\u59D4\u6258 backend\uFF08\u62A4\u680F\u5F52 provider.deleteEmptyFolder\uFF1A\u53EA\u5220\u7A7A\u5939\u3001list \u629B\u9519=list-failed \u7EDD\u4E0D\u5F53\u7A7A\u653E\u884C\u3001If-Match best-effort\uFF09\u3002\n    //   \u8FD4\u5224\u522B\u5F0F status\uFF08deleted/already-gone/non-empty/list-failed\uFF09\uFF1B\u4E0A\u5C42\uFF08online deleteFolder / \u79BB\u7EBF drain\uFF09\u5404\u81EA\u6620\u5C04\uFF0C\u89C1 create-store\u3002\n    function deleteEmptyFolder(path) {\n        return provider.deleteEmptyFolder(path);\n    }\n    // \u6CE8\uFF1ACloudConflictError \u4EC5\u4F5C\u4E3A\u9876\u5C42 export class \u66B4\u9732\uFF08\u65E0\u5B9E\u4F8B\u6D88\u8D39 cloud.CloudConflictError\uFF09\uFF0C\n    //   \u6545\u4E0D\u6302\u5728\u8FD4\u56DE\u5BF9\u8C61\u4E0A\u2014\u2014\u4FDD\u6301\u8FD4\u56DE\u9762\u4E0E CloudSync \u5951\u7EA6\u4E00\u81F4\uFF08annotate :CloudSync \u4E0D\u62A5 excess\uFF09\u3002\n    return {\n        push, pushStream, pull, fetchMeta, pullTail, pullRange, weakOverride,\n        trash, restore, purge,\n        list, listAll, listFolder, listFolders, listTrash, listBackup, rename,\n        ensureFolder, deleteEmptyFolder,\n        getETag, setETag, isDirty, setDirty, clearState,\n    };\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md + CONTEXT.md\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore\u3002\n//\n// identity\uFF08\u6DF1\u6A21\u5757\uFF09\u2014\u2014 \u6539\u8EAB\u4EFD\uFF1Arename / acquire\u3002\u5355\u4E00\u804C\u8D23 = \u5B89\u5168\u7684\u8EAB\u4EFD\u53D8\u66F4\uFF1A\n//   phantom-path \u7EA2\u7EBF\uFF1A**\u672C\u5730\u5148\u5B58\u65B0\u540D\u518D\u5220\u65E7\u540D**\uFF08\u7EDD\u4E0D\u5148\u5220\uFF09\u3002\n//   rename\uFF1Asynced/\u7EAF\u4E91\u7AEF \u2192 \u670D\u52A1\u7AEF move \u4FDD etag \u4E0D\u91CD\u4F20\uFF1Bdirty \u6709\u672C\u5730\u5B57\u8282 \u2192 push \u5F53\u524D\u5B57\u8282\u5230\u65B0\u540D\uFF0C\n//     \u65E7\u540D\u7684\u53BB\u5411**\u770B\u8C31\u7CFB**\uFF1A\u5B8C\u597D \u2192 \u8FDB .trash\uFF08move \u8BED\u4E49\uFF09\uFF1B\u4E0D\u660E/\u5206\u53C9 \u2192 \u539F\u5730\u7559\u7740\uFF08save-as \u8BED\u4E49\uFF0C\n//     \u56E0\u4E3A\u6539\u540D\u662F\u300C\u4E0A\u4F20\u5931\u8D25\u540E\u7684\u9003\u751F\u901A\u9053\u300D\uFF0C\u6B64\u65F6\u672C\u5730\u5E76\u975E\u65E7\u540D\u7684\u540E\u4EE3\uFF09\u3002\u8BE6\u89C1 rename \u5185\u7684\u957F\u6CE8\u91CA\u3002\n//   \u4E32\u884C against \u4E24\u540D in-flight\uFF08serialize2\uFF09\u3002\u7F16\u6392 push \u6DF1\u6A21\u5757 + cloud.rename + local-head\u3002\nimport { toU8 } from \"../base/substrate.js\";\nimport { reportStoreError } from \"../base/error-handling.js\";\nimport { asideStamp } from \"../base/move-aside.js\"; // \u5355\u817F trash \u4E8B\u4EF6\u7684 deleteEventId \u751F\u6210\u5668\nimport { CloudNameCollisionError } from \"./cloud-sync.js\";\nconst passBusy = (_l, fn) => fn();\nexport function createIdentity(cfg) {\n    const { cloud, local, head, doPush, serialize, serialize2, seal, busy: _busy = passBusy, isOnline, deleteOffline, queueUpload, nameOccupied } = cfg;\n    const unseal = (name, blob) => seal ? seal.unsealForRead(name, blob) : Promise.resolve(blob);\n    // \u76EE\u6807\u540D\u5360\u7528\u62A4\u680F\uFF08**\u78B0\u649E\u68C0\u67E5\u5185\u5316**\uFF1Acaller \u4E0D\u5FC5\u5148 list \u76EE\u6807\u5939\u2014\u2014app \u539F\u5219\u4E0A\u4E0D\u77E5\u9053\u522B\u5939\u5185\u5BB9\uFF09\u3002\n    //   \u672C\u5730\u5DF2\u6709 newName \u2228 \u4E91\u7AEF\u5DF2\u6709 newName\uFF08\u4EFB\u4E00\uFF09\u2192 \u629B CloudNameCollisionError\uFF0C**\u5728\u6539\u4EFB\u4F55\u5B57\u8282\u4E4B\u524D**\uFF08\u9632 rename \u8986\u76D6\u65E2\u6709\u6587\u4EF6 = data-loss\uFF09\u3002\n    //   \u79BB\u7EBF\u65F6 cloud.fetchMeta \u629B/\u5931\u8D25 \u2192 \u89C6\u4F5C\u4E91\u7AEF\u65E0\uFF08\u672C\u5730\u62A4\u680F\u4ECD\u6321\uFF1B\u540E\u7EED push \u7684 conflictBehavior:fail \u515C\u5E95\u4E91\u7AEF\uFF09\u3002\n    async function assertNameFree(newName, doCloud) {\n        // doCloud=false\uFF08\u672C\u5730-only rename\uFF09\u2192 \u53EA\u67E5\u672C\u5730\uFF1B\u5426\u5219\u8D70\u6CE8\u5165\u7684\u7EDF\u4E00 nameOccupied\uFF08local+\u5728\u7EBF remote\uFF09\u3002\u7F3A\u6CE8\u5165\uFF08\u88F8\u6D4B\u8BD5\uFF09\u2192 \u9000\u56DE\u672C\u5730 exists\u3002\n        if (doCloud && nameOccupied) {\n            if (await nameOccupied(newName))\n                throw new CloudNameCollisionError(newName);\n            return;\n        }\n        if (local && await local.exists(newName))\n            throw new CloudNameCollisionError(newName);\n    }\n    // \u4E91\u7AEF\u67D0\u540D\u5B57\u7684\u63A2\u6D4B\u7ED3\u679C \u2014\u2014 **\u4E09\u6001\uFF0C\u522B\u584C\u7F29\u6210 null**\u3002\n    //   { known:true, meta:\u975E\u7A7A } \u4E91\u7AEF\u6709\u8FD9\u4E2A\u6587\u4EF6\n    //   { known:true, meta:null } \u4E91\u7AEF\u786E\u5B9E\u6CA1\u6709\n    //   { known:false }           \u53D6\u4E0D\u5230\uFF08\u79BB\u7EBF / \u77AC\u65F6\u9519\u8BEF / \u672A\u767B\u5F55\uFF09\n    // \u65E7\u7248\u628A\u7B2C\u4E09\u79CD catch \u6210 null\uFF0C\u4E8E\u662F\u300C\u4E91\u7AEF\u4E0D\u53EF\u8FBE\u300D\u548C\u300C\u4E91\u7AEF\u6CA1\u6709\u300D\u53D8\u6210\u540C\u4E00\u4EF6\u4E8B\uFF1A\n    //   rename \u4F1A\u5B89\u9759\u5730\u4EC0\u4E48\u90FD\u4E0D\u505A\uFF0C\u5374\u62A5 where:\"cloud-push\"\uFF08\u610F\u601D\u662F\u300C\u65E7\u540D\u672C\u6765\u5C31\u6CA1\u6709\u4E91\u7AEF\u526F\u672C\u300D\uFF09\uFF0C\n    //   app \u4E00\u8DEF\u7A7F\u5230\u300C\u5DF2\u91CD\u547D\u540D\uFF08\u542B\u4E91\u7AEF\uFF09\u300D\u2014\u2014 \u800C\u4E91\u7AEF\u65E7\u6587\u4EF6\u539F\u5C01\u4E0D\u52A8\u8FD8\u5728\u90A3\u513F\uFF0C\u8C31\u7CFB\u521A\u88AB forget \u6389\u3002\n    async function probeOld(name) {\n        try {\n            return { known: true, meta: await cloud.fetchMeta(name) };\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            return { known: false };\n        }\n    }\n    async function rename(oldName, newName, opts = {}) {\n        const { encode, getEditVersion, cloud: doCloud = true, busy = _busy, skipOccupiedCheck } = opts;\n        if (!oldName || !newName || oldName === newName)\n            return { status: \"noop\" };\n        return serialize2(oldName, newName, () => busy(\"file.renaming\", async () => {\n            if (!skipOccupiedCheck)\n                await assertNameFree(newName, doCloud); // \u76EE\u6807\u5360\u7528 \u2192 \u629B collision\uFF08\u6539\u5B57\u8282\u524D\uFF09\u3002tryMove \u5DF2 nameOccupied \u9884\u68C0 \u2192 skip\uFF0C\u907F\u514D\u91CD\u590D fetchMeta\n            const hasLocal = local ? await local.exists(oldName) : false;\n            let bytes = null;\n            if (encode)\n                bytes = await toU8(await encode());\n            else if (hasLocal)\n                bytes = await toU8((await local.get(oldName)));\n            // \u2500\u2500 \u79BB\u7EBF move = \u5220 old + \u5EFA new\uFF08\u51B3\u7B56 1A/2\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n            //   \u670D\u52A1\u7AEF\u539F\u5B50 move \u53EA\u5728\u7EBF\u53EF\u505A\uFF08\u4FDD etag\u3001\u4E0D\u91CD\u4F20\u5B57\u8282\u3001\u4E0D\u4E22\uFF09\uFF1B\u79BB\u7EBF\u4E0D\u53EF\u539F\u5B50 \u2192 \u964D\u7EA7\uFF1A\u5EFA new(\u672C\u5730 float) + \u5220 old(vetted \u79BB\u7EBF\u5220)\u3002\n            //   \u4E24\u4FA7\u5404\u81EA\u6392\u961F\u3001\u91CD\u8FDE**\u72EC\u7ACB\u6536\u655B**\uFF08\u51B3\u7B56 1A\uFF09\uFF1Anew \u649E\u540D push fail\u2192surface\uFF08\u5B57\u8282\u7559\u672C\u5730 dirty\uFF09\uFF1Bold \u8D70 base-etag \u5B88\u536B\u7684\u4E91\u5220\u3002\n            //   \u5B57\u8282\u6C38\u4E0D\u4E22\uFF1Anew \u672C\u5730 dirty \u6C38\u4E0D\u9A71\u9010 + old \u8FDB .trash\uFF08\u53EF\u6062\u590D\uFF09\u3002cloud-only(\u65E0\u672C\u5730\u5B57\u8282)\u79BB\u7EBF\u65E0\u6CD5\u642C \u2192 \u843D\u5230\u4E0B\u65B9\u73B0\u72B6\u5206\u652F\u3002\n            if (doCloud && isOnline && !isOnline() && deleteOffline && hasLocal) {\n                await local.save(newName, bytes); // \u5EFA new\uFF08\u672C\u5730\u5B57\u8282 = old \u7684 at-rest \u5B57\u8282\uFF1B\u542B\u672A\u63A8\u7F16\u8F91/\u52A0\u5BC6\u539F\u6837\u642C\uFF09\n                head.recordEdit(newName); // new = never-synced float\uFF08_parent=null \u2192 \u9996\u63A8 conflictBehavior:fail\uFF0C\u649E\u540D surface\uFF09\n                queueUpload?.(newName); // \u91CD\u8FDE\u8865\u63A8\uFF08ADR-0018\uFF09\n                await deleteOffline(oldName); // \u5220 old\uFF1A\u672C\u5730 move-aside + \u4E91\u5220\u6392\u961F(base-etag \u5B88\u536B) + head.forget\n                return { status: \"renamed\", where: \"offline-move\", newName };\n            }\n            if (local && hasLocal) {\n                await local.save(newName, bytes); // \u5148\u5B58\u65B0\u540D\uFF08phantom-path\uFF1A\u7EDD\u4E0D\u5148\u5220\uFF09\n                await local.hardDelete(oldName); // \u6210\u529F\u540E\u624D\u5220\u65E7\u540D\n            }\n            if (!doCloud) {\n                head.forget(oldName);\n                return { status: \"renamed\", where: \"local\", newName };\n            }\n            try {\n                const before = await probeOld(oldName);\n                // synced \u6216\u6CA1\u672C\u5730\u5B57\u8282\u53EF\u63A8\uFF08\u7EAF\u4E91\u7AEF\uFF09\u2192 \u670D\u52A1\u7AEF move\uFF0Cetag \u987A\u5EF6\u3002\n                if (before.known && before.meta && (!head.isDirtyAnywhere(oldName) || bytes == null)) { // anywhere\uFF1A\u522B tab \u7684\u672A\u63A8\u7F16\u8F91\u5728\u573A\u65F6\u8D70\u300C\u63A8\u5B57\u8282\u300D\u8DEF\uFF08server-move \u4F1A\u628A forget \u987A\u5E26\u6E05\u6389\u5B83\u7684 push \u4E49\u52A1\uFF09\n                    await cloud.rename(oldName, newName, { baseEtag: before.meta.etag }); // If-Match\uFF1A\u522B\u8BBE\u5907\u5728\u6211\u4EEC\u5224\u5B9A\u300Csynced\u300D\u4E4B\u540E\u63A8\u4E86\u65B0\u7248 \u2192 412\uFF0C\u4E0D\u9759\u9ED8\u6539\u5B83\u7684\u540D\n                    head.markSeen(newName, cloud.getETag(newName));\n                    head.forget(oldName);\n                    return { status: \"renamed\", where: \"cloud-move\", newName };\n                }\n                if (bytes == null) {\n                    head.forget(oldName);\n                    return { status: \"renamed\", where: \"local\", newName };\n                }\n                const baseAtStart = head.seenBase(oldName); // \u300C\u7528\u6237\u6309\u4E0B\u6539\u540D\u65F6\uFF0C\u672C\u673A\u8BA4\u4E3A\u81EA\u5DF1\u6D3E\u751F\u81EA\u54EA\u4E00\u7248\u300D\n                await doPush(newName, { encode: () => bytes, getEditVersion }); // dirty/\u65E0\u65E7\u4E91\u6587\u4EF6 \u2192 \u63A8\u5F53\u524D\u5B57\u8282\uFF08\u542B B5/retry/conflict\uFF09\n                // \u2500\u2500 \u65E7\u540D\u600E\u4E48\u529E\uFF1Amove\uFF08\u642C\u8D70\uFF09\u8FD8\u662F save-as\uFF08\u7559\u7740\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n                //   \u300C\u63A8\u65B0\u540D + \u65E7\u540D\u8FDB .trash\u300D\u662F **move** \u8BED\u4E49\uFF0C\u5B83\u9690\u542B\u4E00\u4E2A\u524D\u63D0\uFF1A\n                //        \u672C\u5730\u8FD9\u4EFD\u5B57\u8282\uFF0C\u662F\u65E7\u540D\u4E91\u7AEF\u90A3\u4EFD\u7684**\u540E\u4EE3**\u3002\n                //   \u524D\u63D0\u6210\u7ACB\u65F6\u642C\u8D70\u65E7\u7684\u4E0D\u4E22\u4FE1\u606F\uFF08\u65B0\u7684\u5C31\u662F\u5B83\u7684\u7EED\u96C6\uFF09\u2014\u2014\u6B63\u5E38\u6539\u540D\u8D70\u8FD9\u6761\uFF0C\u6B63\u786E\u3002\n                //\n                //   \u26A0 \u524D\u63D0**\u4E0D\u6210\u7ACB**\u65F6\uFF08\u672C\u673A\u4E0D\u77E5\u9053\u81EA\u5DF1\u6D3E\u751F\u81EA\u4E91\u7AEF\u54EA\u4E00\u7248\uFF0C\u6216\u4E91\u7AEF\u5DF2\u88AB\u522B\u7684\u8BBE\u5907\u63A8\u8FC7\u65B0\u7248\uFF09\uFF0C\n                //   \u65E7\u540D\u90A3\u4EFD\u542B\u6709\u672C\u5730\u6839\u672C\u6CA1\u6709\u7684\u5185\u5BB9\u3002\u6B64\u65F6\u642C\u8D70\u5B83 = \u628A\u7528\u6237\u6CA1\u89C1\u8FC7\u7684\u5DE5\u4F5C\u632A\u8FDB .trash\u3002\n                //   \u800C\u8FD9\u6070\u6070\u662F rename \u6700\u5E38\u88AB\u4F7F\u7528\u7684\u573A\u666F\uFF1A**\u6539\u540D\u662F\u4E0A\u4F20\u5931\u8D25\u4E4B\u540E\u7684\u9003\u751F\u901A\u9053**\uFF08\u7528\u6237 2026-07-18 \u62CD\u5B9A\uFF09\uFF0C\n                //   \u7528\u6237\u6765\u6539\u540D\uFF0C\u6B63\u662F\u56E0\u4E3A\u539F\u540D\u63A8\u4E0D\u4E0A\u53BB \u2014\u2014 \u4E5F\u5C31\u662F\u6B63\u56E0\u4E3A\u8C31\u7CFB\u65AD\u4E86\u3002\n                //   \u2192 \u9003\u751F\u901A\u9053\u4E0E\u65A9\u6740\u7EBF\u672C\u662F\u540C\u4E00\u6761\u4EE3\u7801\uFF0C\u5DEE\u522B\u53EA\u5728\u8FD9\u4E2A\u5F53\u65F6\u300C\u5DF2\u77E5\u4E0D\u77E5\u9053\u300D\u7684\u53D8\u91CF\uFF0C\u65E7\u7248\u9ED8\u8BA4\u4E86\u300C\u662F\u300D\u3002\n                //\n                //   \u8C31\u7CFB\u4E0D\u660E/\u5DF2\u5206\u53C9 \u2192 \u964D\u7EA7\u4E3A **save-as**\uFF1A\u65B0\u540D\u7167\u63A8\uFF0C\u65E7\u540D\u4E00\u4E2A\u6307\u5934\u90FD\u4E0D\u78B0\u3002\n                //   \uFF08\u4E0D\u5728\u8FD9\u91CC\u5F39\u51B2\u7A81\u9762\uFF1A\u9003\u751F\u901A\u9053\u5FC5\u987B\u7545\u901A\uFF0C\u4E0D\u8BB8\u5728\u7528\u6237\u6B63\u8981\u9003\u7684\u65F6\u5019\u518D\u62E6\u4E00\u9053\u3002\u4FDD\u5B58\u90A3\u6761\u8DEF\u624D\u662F surface \u7684\u5730\u65B9\u3002\uFF09\n                //   \u2605 \u5224\u636E\u5FC5\u987B\u5728 doPush **\u4E4B\u540E**\u91CD\u53D6\uFF08TOCTOU\uFF1B\u540C offload.ts \u7F51\u7EDC\u5F80\u8FD4\u540E re-check \u7684\u7EAA\u5F8B\uFF09\uFF1A\n                //   doPush \u542B\u6700\u591A 4 \u6B21\u91CD\u8BD5 + \u53EF\u80FD\u7684\u51B2\u7A81\u9762**\u7528\u6237\u4EA4\u4E92**\uFF0C\u53EF\u4EE5\u957F\u8FBE\u51E0\u5341\u79D2\u3002push \u4E4B\u524D\u90A3\u6B21\u8BFB\u65E9\u5C31\u9648\u65E7\u4E86\uFF0C\n                //   \u62FF\u5B83\u51B3\u5B9A\u300C\u8981\u4E0D\u8981\u642C\u8D70\u4E91\u7AEF\u65E7\u540D\u300D= \u7528\u51E0\u5341\u79D2\u524D\u7684\u4E16\u754C\u89C2\u505A\u7834\u574F\u6027\u52A8\u4F5C\u3002\n                const after = await probeOld(oldName);\n                let oldCloudOrphan = false, oldKept = false, oldUnknown = false;\n                if (!after.known) {\n                    // \u4E91\u7AEF\u72B6\u6001\u53D6\u4E0D\u5230\uFF08\u79BB\u7EBF/\u77AC\u65F6\u9519\u8BEF\uFF09\u3002**\u300C\u53D6\u4E0D\u5230\u300D\u2260\u300C\u6CA1\u6709\u300D**\u2014\u2014\u7EDD\u4E0D\u80FD\u62FF\u672A\u77E5\u5F53\u7A7A\u767D\u7136\u540E\u4EC0\u4E48\u90FD\u4E0D\u8BF4\u3002\n                    oldUnknown = true; // \u4E00\u4E2A\u6307\u5934\u90FD\u4E0D\u78B0\uFF0C\u5E76\u8BA9 caller \u5982\u5B9E\u544A\u77E5\n                }\n                else if (after.meta == null) {\n                    /* \u4E91\u7AEF\u786E\u5B9E\u6CA1\u6709\u65E7\u540D\uFF08\u672C\u6765\u5C31\u662F\u7EAF\u672C\u5730\u6587\u4EF6\uFF09\u2192 \u65E0\u4E8B\u53EF\u505A */\n                }\n                else if (baseAtStart != null && baseAtStart === after.meta.etag) {\n                    // \u8C31\u7CFB\u5B8C\u597D \u2192 move \u8BED\u4E49\u6210\u7ACB\uFF0C\u65E7\u540D\u8FDB .trash\uFF08\u4E0D hard-delete\uFF0CC5\uFF09\u3002\n                    // \u5355\u817F\u4E8B\u4EF6\uFF08\u53EA\u6709\u4E91\u7AEF\u8FD9\u4E00\u6761\u817F\uFF0C\u672C\u5730\u65E7\u540D\u6CA1\u6709\u5BF9\u5E94\u7684 trash \u9879\uFF09\u2192 \u81EA\u5DF1\u751F\u6210 id\uFF0C\u65E0\u914D\u5BF9\u9700\u6C42\u3002\n                    try {\n                        await cloud.trash(oldName, asideStamp(Date.now()), { baseEtag: after.meta.etag });\n                    }\n                    catch (e) {\n                        reportStoreError(e, \"warning\");\n                        oldCloudOrphan = true;\n                    } // If-Match \u9501\u4F4F\u521A\u91CD\u53D6\u7684\u90A3\u4E00\u7248   // \u65E7\u540D\u8FDB .trash \u5931\u8D25\u2192\u4E91\u7AEF\u9057\u7559\u5B64\u513F\uFF1Asurface\n                }\n                else {\n                    oldKept = true; // \u8C31\u7CFB\u4E0D\u660E/\u5206\u53C9 \u2192 \u4E91\u7AEF\u65E7\u540D\u539F\u5730\u7559\u7740\uFF08caller \u987B\u544A\u77E5\u7528\u6237\u300C\u65E7\u7684\u8FD8\u5728\uFF0C\u53EB X\u300D\uFF09\n                }\n                head.forget(oldName);\n                return {\n                    status: \"renamed\",\n                    where: oldUnknown ? \"cloud-push+unknown\"\n                        : oldKept ? \"cloud-push+kept\"\n                            : oldCloudOrphan || (after.known && after.meta) ? \"cloud-push+trash\"\n                                : \"cloud-push\",\n                    newName, oldCloudOrphan, oldKept, oldUnknown, oldName,\n                };\n            }\n            catch (e) {\n                reportStoreError(e, \"warning\"); // \u4E91\u7AEF\u63A8\u5931\u8D25\u3001newName \u7559\u672C\u5730 dirty \u5F85\u63A8 \u2192 surface\n                // \u4E91\u7AEF\u63A8\u5931\u8D25\uFF08\u7F51\u7EDC\uFF09\u2192 \u672C\u5730\u5DF2\u662F newName\uFF0C\u6807\u810F\u8BA9\u5B83\u6210\u5F85\u63A8\uFF08\u4E0B\u6B21 push/sync \u81EA\u52A8\u5E26\u8D70 newName\uFF0C\n                //   \u4E0D\u5FC5\u91CD\u8DD1 rename \u624D\u6536\u655B\uFF09\u3002_parent=null=\u65B0\u8EAB\u4EFD\u9996\u63A8\uFF08conflictBehavior:fail\uFF0C\u649E\u540D surface \u4E0D\u76F2\u8986\u76D6\uFF09\u3002\n                head.recordEdit(newName);\n                head.forget(oldName);\n                return { status: \"renamed\", where: \"local\", newName, cloudDeferred: true, error: e };\n            }\n        }));\n    }\n    // saveAs \u5DF2\u5220\uFF082026-07\uFF09\uFF1A\u5B83\u53EA\u662F\u300C\u5199\u65B0\u8EAB\u4EFD\u300D\u7684\u4E00\u4E2A\u522B\u540D\uFF0C\u8BED\u4E49\u4E0A\u548C file(name,{mode:\"new\"}).save(bytes)\n    //   \u5B8C\u5168\u91CD\u5408\uFF0C\u5374\u591A\u51FA\u4E00\u6761\u5E73\u884C\u7684\u843D\u76D8+\u63A8\u4E91\u8DEF\u5F84\u8981\u5404\u81EA\u7EF4\u62A4\uFF08\u649E\u540D\u62A4\u680F\u3001seal\u3001dirty \u6536\u5C3E\u90FD\u5F97\u6284\u4E00\u904D\uFF09\u3002\n    //   \u96F6 app \u8C03\u7528\u8005\u3002\u649E\u540D\u4E0D\u8986\u76D6\u7684\u7EA2\u7EBF\u7531 mode:\"new\" \u7684 nameOccupied \u62A4\u680F\u627F\u62C5\uFF08create-store.ts\uFF09\u3002\n    // \u9996\u53D6\uFF1A\u4E91\u7AEF item \u2192 \u672C\u5730\uFF08\u65E0\u51B2\u7A81\uFF0C\u672C\u5730\u672C\u6765\u6CA1\u6709\uFF09\u3002\n    async function acquire(cloudName, opts = {}) {\n        const { localName = cloudName, adopt, busy = passBusy } = opts;\n        return busy(\"file.pulling\", () => serialize(localName, async () => {\n            const r = await cloud.pull(cloudName);\n            if (!r)\n                return { status: \"absent\" };\n            if (local)\n                await local.save(localName, r.blob);\n            head.markSynced(localName, r.item?.eTag ?? null);\n            if (adopt) {\n                const plain = await unseal(localName, r.blob);\n                if (plain)\n                    await adopt(plain, localName);\n            }\n            return { status: \"acquired\", localName, item: r.item };\n        }));\n    }\n    return { rename, acquire };\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md + CONTEXT.md\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore\u3002\n//\n// trash\uFF08\u6DF1\u6A21\u5757\uFF09\u2014\u2014 \u56DE\u6536\u7AD9\u751F\u547D\u5468\u671F\uFF1Arestore / purge / emptyTrash\u3002\u5355\u4E00\u804C\u8D23 = .trash \u7684\u6062\u590D\u4E0E\u5F7B\u5E95\u5220\uFF1A\n//   restore\uFF1A\u672C\u5730\u5148\u6062\u590D\uFF08\u649E\u540D\u81EA\u52A8 (2)\uFF09\u2192 \u4E91\u7AEF\u6309\u540C\u540D\u6062\u590D\uFF1B\u91C7\u7EB3\u6062\u590D\u51FA\u7684\u4E91 item etag\uFF08move\u2192\u65B0 etag\uFF09\u3002\n//   purge\uFF1A\u6C38\u4E45\u5220\uFF08\u4E0D\u53EF\u6062\u590D\uFF09\u2192 \u5F3A\u5236 danger confirm\u3002\n//   emptyTrash\uFF1A\u6279\u91CF\u5F7B\u5E95\u5220\uFF0C\u672C\u5730/\u4E91\u7AEF\u4E00\u5904\u6E05\uFF0C\u9010\u9879\u72EC\u7ACB try\u3001\u5931\u8D25\u6C47\u603B\u4E0D\u9759\u9ED8\uFF1B**\u5F3A\u9000=cancel\uFF0C\u7EDD\u4E0D\u81EA\u52A8\u7EED**\u3002\nimport { reportStoreError } from \"../base/error-handling.js\"; // \u5168\u63A5\u4F46\u5206\u7EA7\uFF1A\u9759\u9ED8 swallow \u4E5F funnel\uFF08\u4E0D\u6539\u63A7\u5236\u6D41\uFF09\nimport { snapshotStampOf } from \"../base/move-aside.js\"; // \u6062\u590D\u649E\u540D\u7684\u5FEB\u7167\u65F6\u523B\u62BD\u53D6\uFF08\u6848\u5377 \u00A78\uFF09\nconst passBusy = (_l, fn) => fn();\nexport function createTrash(cfg) {\n    const { cloud, local, head, busy: _busy = passBusy } = cfg;\n    async function restore(opts = {}) {\n        const { fromCloud, cloudRef, targetName, trashKey, encrypted, busy = _busy } = opts;\n        return busy(\"trash.restoring\", async () => {\n            let name = targetName || null, restoredLocal = false, restoredCloud = false;\n            // both \u884C\u7B56\u7565\uFF1A\u672C\u5730\u5148\u6062\u590D\u5230**\u539F\u540D**\uFF1B\u4E91\u7AEF\u817F\u968F\u540E cloud.restore \u649E\u540D\u81EA\u52A8 (2)\uFF08\u590D\u7528\u5176\u91CD\u8BD5\uFF09\u2192 \u4E24\u4EFD\u90FD\u5728\u3001\u4E0D\u8986\u76D6\u3002\n            if (trashKey && local) {\n                const n = await local.restore(trashKey);\n                if (n) {\n                    name = n;\n                    restoredLocal = true;\n                }\n            }\n            if (fromCloud && cloudRef != null) {\n                // snapshotStamp\uFF1A\u649E\u540D\u6539\u540D\u6062\u590D\u65F6\u7528**\u5FEB\u7167\u81EA\u5DF1\u7684\u65F6\u523B**\u547D\u540D\uFF08\u6848\u5377 \u00A78\uFF09\u3002\u672C\u5730\u817F\u5728\u573A\u65F6\u4ECE trashKey \u62BD\uFF1B\n                //   \u7EAF\u4E91\u7AEF\u6062\u590D\u62FF\u4E0D\u5230\uFF08\u4E0D\u989D\u5916\u6253\u5143\u6570\u636E\u5F80\u8FD4\uFF09\u2192 cloud.restore \u9000\u6062\u590D\u65F6\u523B\u3002\u672C\u5730\u817F\u5DF2\u6539\u540D\u65F6 name \u5DF2\u5E26\u6233\uFF0C\n                //   \u4E91\u7AEF\u817F\u8DDF\u540C\u540D\u843D\u70B9 \u2192 \u4E24\u817F\u6536\u655B\u540C\u4E00\u4E2A\u540D\u5B57\u3002\n                const snap = trashKey ? snapshotStampOf(trashKey.replace(/^[a-z]+\\//, \"\")) : null;\n                const ritem = await cloud.restore(cloudRef, (name || targetName), { encrypted, snapshotStamp: snap });\n                restoredCloud = true;\n                // \u91C7\u7EB3\u6062\u590D\u51FA\u7684\u4E91 item etag\uFF08restore \u662F move \u2192 \u65B0 etag\uFF09\u2192 \u4E4B\u540E push \u6709 base\uFF0C\u4E0D\u5BF9\u81EA\u5DF1\u7684\u6587\u4EF6\u5F39\u5047\u649E\u540D\u3002\n                const rname = name || targetName;\n                if (rname && ritem && ritem.eTag)\n                    head.markSeen(rname, ritem.eTag);\n            }\n            if (!restoredLocal && !restoredCloud)\n                return { status: \"noop\" };\n            return { status: \"restored\", name, local: restoredLocal, cloud: restoredCloud };\n        });\n    }\n    async function purge(opts = {}) {\n        const { trashKey, cloudRef, confirm, busy = _busy } = opts;\n        if (confirm && !(await confirm({ title: \"\u5F7B\u5E95\u5220\u9664\", body: \"\u4E0D\u53EF\u6062\u590D\", danger: true })))\n            return { status: \"cancelled\" };\n        return busy(\"trash.purging\", async () => {\n            if (trashKey && local && local.purgeTrash)\n                await local.purgeTrash(trashKey);\n            if (cloudRef != null)\n                await cloud.purge(cloudRef);\n            return { status: \"purged\" };\n        });\n    }\n    // \u6279\u91CF\u5F7B\u5E95\u5220\uFF1Ascope \u9009\u7AEF\uFF08\"local\"/\"cloud\"/\"both\"\uFF09\u3002\u5F3A\u9000=cancel\uFF08\u7EDD\u4E0D\u81EA\u52A8\u7EED\uFF1A\u4E0B\u6B21 trash \u53EF\u80FD\u5DF2\u6709\u65B0 item\uFF09\u3002\n    async function emptyTrash(opts = {}) {\n        const { isOnline, busy = _busy, concurrency = 5, scope = \"both\" } = opts;\n        return busy(\"trash.emptyTrash\", async () => {\n            let purged = 0;\n            const failed = [];\n            const errMsg = (e) => String(e?.message || e);\n            if (scope !== \"cloud\" && local && local.listTrash && local.purgeTrash) {\n                for (const t of await local.listTrash()) {\n                    try {\n                        await local.purgeTrash(t.trashKey);\n                        purged++;\n                    }\n                    catch (e) {\n                        reportStoreError(e, \"warning\");\n                        failed.push({ name: t.name, where: \"local\", error: errMsg(e) });\n                    }\n                }\n            }\n            if (scope !== \"local\" && (!isOnline || isOnline())) {\n                let items = null;\n                try {\n                    items = await cloud.listTrash();\n                }\n                catch (e) {\n                    reportStoreError(e, \"warning\");\n                    failed.push({ where: \"cloud-list\", error: errMsg(e) });\n                }\n                items = items || [];\n                for (let i = 0; i < items.length; i += concurrency) { // bounded \u5E76\u53D1\uFF0C\u5FEB\u7EA6 N\u00D7\n                    await Promise.all(items.slice(i, i + concurrency).map(async (it) => {\n                        try {\n                            await cloud.purge(it.ref, it.eTag);\n                            purged++;\n                        }\n                        catch (e) {\n                            reportStoreError(e, \"warning\");\n                            failed.push({ name: it.name, where: \"cloud\", error: errMsg(e) });\n                        }\n                    }));\n                }\n            }\n            return { status: \"emptied\", purged, failed };\n        });\n    }\n    // \u6E05\u7A7A**\u5907\u4EFD\u7BB1**\uFF08.backup / \u672C\u5730 backup \u5206\u533A\uFF09\uFF1AweakOverride/keepMine \u7684 loser \u5B57\u8282 stash \u5904\u3002\n    //   \u4E0E emptyTrash \u540C\u7EAA\u5F8B\uFF1Ascope \u9009\u7AEF\u3001\u9010\u9879\u72EC\u7ACB try\u3001\u5931\u8D25\u6C47\u603B\u4E0D\u9759\u9ED8\u3001\u5F3A\u9000=cancel\u3002\u5907\u4EFD\u7528 listBackup + \u901A\u7528 purge/purgeTrash\u3002\n    async function emptyBackup(opts = {}) {\n        const { isOnline, busy = _busy, concurrency = 5, scope = \"both\" } = opts;\n        return busy(\"trash.emptyBackups\", async () => {\n            let purged = 0;\n            const failed = [];\n            const errMsg = (e) => String(e?.message || e);\n            if (scope !== \"cloud\" && local && local.listBackup && local.purgeTrash) {\n                for (const b of await local.listBackup()) {\n                    try {\n                        await local.purgeTrash(b.trashKey);\n                        purged++;\n                    } // purgeTrash \u8BA4 `backup/` \u524D\u7F00 \u2192 \u8D70 backup \u5206\u533A\n                    catch (e) {\n                        reportStoreError(e, \"warning\");\n                        failed.push({ name: b.name, where: \"local\", error: errMsg(e) });\n                    }\n                }\n            }\n            if (scope !== \"local\" && (!isOnline || isOnline())) {\n                let items = null;\n                try {\n                    items = await cloud.listBackup();\n                }\n                catch (e) {\n                    reportStoreError(e, \"warning\");\n                    failed.push({ where: \"cloud-list\", error: errMsg(e) });\n                }\n                items = items || [];\n                for (let i = 0; i < items.length; i += concurrency) {\n                    await Promise.all(items.slice(i, i + concurrency).map(async (it) => {\n                        try {\n                            await cloud.purge(it.ref, it.eTag);\n                            purged++;\n                        }\n                        catch (e) {\n                            reportStoreError(e, \"warning\");\n                            failed.push({ name: it.name, where: \"cloud\", error: errMsg(e) });\n                        }\n                    }));\n                }\n            }\n            return { status: \"emptied\", purged, failed };\n        });\n    }\n    return { restore, purge, emptyTrash, emptyBackup };\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md + DATA SAFETY GUIDELINE.md\u3002store \u5185\u90E8\u6DF1\u6A21\u5757\u2014\u2014app \u7ECF createStore \u7684 file.offload\u3002\n//\n// offload\uFF08\u6DF1\u6A21\u5757\uFF09\u2014\u2014 \u79FB\u9664\u672C\u5730\u526F\u672C\uFF08offload \u2260 delete\uFF1A\u53EA\u4E22\u672C\u5730\uFF0C\u4E91\u7AEF\u4E0D\u52A8\uFF09\u3002\u8BED\u4E49\u5BF9\u9F50\u524D\u8EAB\u5F15\u64CE unload\u3002\n//   \u53EA\u5728\u300C\u672C\u5730\u662F\u4E91\u7AEF\u67D0\u5B8C\u6574\u7248\u7684\u53EF\u91CD\u53D6 shadow\u300D\u65F6\u5408\u6CD5 \u2192 hardDelete\uFF08\u4E0D\u8FDB local trash\uFF0Cclean \u53EF\u91CD\u4E0B\uFF09\u3002\n//   \u5426\u5219\u672C\u5730\u662F**\u4E16\u754C\u552F\u4E00\u526F\u672C**\uFF08local-only / \u672A\u4E0A\u4F20 / sync \u4E8B\u6545 / dirty / forked / cloud-gone / \u79BB\u7EBF\uFF09\u2192 offload **\u4E0D\u9002\u7528**\n//   \u2192 \u629B OffloadIllegalError\uFF08\u5185\u90E8\u9519\u8BEF\uFF0C\u7ECF ui.reportError \u51FA banner\uFF1BUX \u4E0D\u8BE5\u66B4\u9732\u975E\u6CD5 offload\uFF0C#29\uFF09\u3002\u7EDD\u4E0D\u9759\u9ED8\u4E22\u5B57\u8282\u3002\n//\n// \u5408\u6CD5\u5224\u5B9A\uFF08\u7528 local-head \u5DF2\u56FA\u5316\u7684 etag \u8C31\u7CFB\u903B\u8F91\uFF0C\u4E0D\u53D1\u660E\u65B0\u4E1C\u897F\uFF09\uFF1A\n//   exists \u2227 !head.isDirty \u2227 \u5728\u7EBF \u2227 head.seenBase!=null\uFF08\u66FE synced = \u6709\u5DF2\u77E5\u4E91\u7248 = re-fetchable\uFF0C\u5BF9\u9F50\u524D\u8EAB\u5F15\u64CE\u300C\u6709 etag\u300D\uFF09\n//   \u2227 cloud.fetchMeta \u5B58\u5728\uFF08\u672A\u767B\u5F55\u4F1A\u53D6\u4E0D\u5230 \u2192 cloud-gone\uFF09\u2227 meta.size>0\uFF08\u6321\u5386\u53F2 0B \u4E91\u7AEF\u5E7B\u8C61\uFF09\u3002\n//   cloudMoved\uFF08\u4E91\u7AEF\u88AB\u522B\u4EBA\u63A8\u65B0\u7248\u3001etag\u2260seenBase\uFF09\u4ECD\u5408\u6CD5\uFF1Aclean \u672C\u5730\u4E0B\u6B21 open \u4F1A\u5FEB\u8FDB\uFF0C\u91CD\u53D6\u62FF\u66F4\u65B0\u7248\uFF0C\u4E0D\u4E22\u3002\nimport { reportStoreError } from \"../base/error-handling.js\"; // \u5168\u63A5\u4F46\u5206\u7EA7\uFF1A\u9759\u9ED8 swallow \u4E5F funnel\uFF08\u4E0D\u6539\u63A7\u5236\u6D41\uFF09\nexport class OffloadIllegalError extends Error {\n    code = \"OFFLOAD_ILLEGAL\";\n    reason;\n    constructor(name, reason) {\n        super(`offload \"${name}\" \u4E0D\u9002\u7528\uFF08${reason}\uFF09\uFF1A\u672C\u5730\u662F\u4E16\u754C\u552F\u4E00\u526F\u672C\u6216\u4E0D\u53EF\u91CD\u53D6\uFF0C\u62D2\u7EDD\u4E22\u5F03\u3002`);\n        this.name = \"OffloadIllegalError\";\n        this.reason = reason;\n    }\n}\nexport function createOffload(cfg) {\n    const { cloud, local, head, isOnline } = cfg;\n    const serialize = cfg.serialize ?? ((_n, fn) => Promise.resolve().then(fn));\n    // offload \u6C38\u8FDC\u662F\u7528\u6237\u663E\u5F0F\u52A8\u4F5C\uFF08\u65E0\u81EA\u52A8 LRU\uFF09\u3002\u975E\u6CD5\u6001\u629B\u9519\uFF08\u4E0D\u8F6F\u8FD4\u56DE kept\uFF09\uFF0C\u5408\u6CD5\u6001 hardDelete\u3002\n    // \u7EA2\u7EBF\uFF08DATA SAFETY \u00A7A \u6700\u6BD2\u6761\uFF09\uFF1A\u9A71\u9010\u7EDD\u4E0D\u5403\u672A\u63A8\u552F\u4E00\u5B57\u8282\u3002check-then-act \u8DE8 fetchMeta \u7F51\u7EDC\u671F \u2192\n    //   \u2460 \u6574\u4F53\u8FDB\u540C\u540D serialize \u94FE\uFF1A\u4E0E file.save \u7684 local \u5199\u4E92\u65A5\uFF08hardDelete \u4E0D\u548C\u5E76\u53D1\u5199\u4EA4\u9519\uFF09\u3002\n    //   \u2461 fetchMeta \u540E re-check isDirty\uFF08\u5BF9\u9F50 freshness.ts:87 \u7684 TOCTOU \u5B88\u536B\uFF09\uFF1A\u7F51\u7EDC\u671F\u5185\u5E76\u53D1 save \u6807\u4E86\u810F \u2192 \u7ACB\u5373\u62D2\u3002\n    async function offload(name) {\n        return serialize(name, async () => {\n            if (!(await local.exists(name)))\n                return; // \u672C\u5730\u6CA1\u526F\u672C \u2192 \u65E0\u4E8B\u53EF\u505A\uFF08\u975E\u5371\u9669\uFF0Cno-op\uFF09\n            if (head.isDirtyAnywhere(name))\n                throw new OffloadIllegalError(name, \"dirty\"); // \u672A\u63A8\u552F\u4E00\u5B57\u8282\uFF08**\u4EFB\u4F55** tab \u5199\u7684\u90FD\u7B97\u2014\u2014per-tab \u89C6\u89D2\u770B\u4E0D\u89C1\u522B tab \u521A\u5199\u7684 durable dirty\uFF09\n            if (isOnline && !isOnline())\n                throw new OffloadIllegalError(name, \"offline\"); // \u4E0D\u53EF\u91CD\u53D6\n            // \u26A0 \u8FD9\u9053\u5B88\u536B\u4F9D\u8D56 seenBase \u7684**durable** \u534A\u8FB9\uFF08local-head.markSynced \u5199\u7684 etag kv\uFF09\u3002\n            //   v431 \u4E4B\u524D markSynced \u53EA\u5199\u5185\u5B58 _base\uFF1A\u4E00\u5E45 pull \u6765\u7684\u753B\uFF0C\u5B88\u536B\u9760\u5185\u5B58 _base \u653E\u884C\uFF0C\n            //   \u800C\u4E0B\u9762 head.forget \u53C8\u6B63\u597D\u628A\u90A3\u4E2A _base \u5220\u6389 \u2192 \u8C31\u7CFB\u5F52\u96F6\uFF0C\u5378\u8F7D\u672C\u5730\u6210\u4E86\u300C\u4FDD\u5B58\u6C38\u8FDC\u63A8\u4E0D\u4E0A\u53BB\u300D\u7684\u7B2C\u4E8C\u6761\u5165\u53E3\u3002\n            //   \u522B\u628A markSynced \u91CC\u90A3\u884C setCloudEtag \u5F53 R1 \u8FDD\u89C4\u5220\u6389\uFF0C\u5220\u4E86\u8FD9\u91CC\u5C31\u91CD\u65B0\u7834\u3002\n            //   \uFF08v434 \u66F4\u6B63 v433 \u7684\u6CE8\u91CA\uFF1A**\u4E0D\u9700\u8981** etag \u5728 forget \u4E4B\u540E\u5B58\u6D3B\u3002forget \u73B0\u5728\u4E24\u8F68\u540C\u6E05\uFF0C\n            //    \u5378\u8F7D\u540E\u6587\u4EF6\u53D8\u7EAF\u4E91\u7AEF\uFF0C\u4E0B\u6B21 open \u8D70 identity.acquire \u2192 markSynced \u91CD\u5EFA etag\u3002\u5B88\u536B\u53EA\u9700\u8981\u5728\n            //    **\u5B83\u81EA\u5DF1\u6267\u884C\u7684\u90A3\u4E00\u523B** durable \u8F68\u4E0A\u6709\u503C\u5373\u53EF\u3002\uFF09\n            if (head.seenBase(name) == null)\n                throw new OffloadIllegalError(name, \"local-only\"); // \u4ECE\u6CA1 synced = \u65E0\u5DF2\u77E5\u4E91\u7248 = \u552F\u4E00\u672C\u5730\n            const meta = await cloud.fetchMeta(name).catch((e) => { reportStoreError(e, \"log\"); return null; }); // \u672A\u767B\u5F55/\u53D6\u4E0D\u5230 \u2192 null\n            if (!meta)\n                throw new OffloadIllegalError(name, \"cloud-gone\"); // \u4E91\u7AEF\u6CA1\u4E86 \u2192 \u552F\u4E00\u597D\u526F\u672C\uFF0C\u4FDD\u7559\n            if (!(meta.size > 0))\n                throw new OffloadIllegalError(name, \"incomplete\"); // 0B \u4E91\u7AEF\u5E7B\u8C61 \u2192 \u4E0D\u53EF\u4FE1\uFF0C\u7EDD\u4E0D\u636E\u6B64\u4E22\u672C\u5730\n            if (head.isDirtyAnywhere(name))\n                throw new OffloadIllegalError(name, \"dirty\"); // \u2461 TOCTOU re-check\uFF1AfetchMeta \u671F\u5185\u88AB\u5E76\u53D1 save \u5199\u810F \u2192 \u62D2\n            await local.hardDelete(name); // \u5408\u6CD5\uFF1Aclean \u2227 \u5728\u7EBF \u2227 \u66FEsynced \u2227 \u4E91\u7AEF\u6709\u5B8C\u6574\u7248 \u2192 \u5B89\u5168\u4E22\u672C\u5730\u526F\u672C\uFF08\u53EF\u91CD\u4E0B\uFF09\n            head.forget(name); // \u6E05\u4E91\u7AEF\u8C31\u7CFB\uFF08\u4E0B\u6B21 open \u91CD\u65B0 acquire\uFF09\n        });\n    }\n    return { offload };\n}\n", "import { isHidden } from \"../base/is-hidden.js\"; // \u9690\u85CF\u9879\uFF08.trash/.backup/.<appId>/\u4EFB\u610F dot\uFF09\uFF1A\u4E91\u7AEF\u5DF2\u8FC7\u6EE4\uFF0C\u672C\u5730\u4FA7\u4E5F\u522B\u636E\u6B64\u8BEF\u5224 gone\nimport { reportStoreError } from \"../base/error-handling.js\";\nimport { asideStamp } from \"../base/move-aside.js\"; // \u5355\u817F trash \u4E8B\u4EF6\u7684 deleteEventId \u751F\u6210\u5668\n// \u7EAF\u5206\u7C7B\u5668\uFF08\u96F6 IO\u3001\u53EF\u7A77\u4E3E\u5355\u6D4B\uFF09\uFF1A\u8FD4\u56DE\u8BE5 demote \u7684 clean \u5B64\u513F\u540D\u3002\n//   \u89C4\u5219\uFF08\u5BF9\u9F50\u524D\u8EAB\u5BBF\u4E3B gallery-model.classifyCloudGone\uFF0C\u53BB\u6389 ghost/pin \u8F74\u2014\u2014\u5E93\u4E0D\u505A pin\uFF0Cdirty \u5B64\u513F\u4E00\u5F8B\u7559\uFF09\uFF1A\n//   not authoritative \u2192 \u7A7A \uFF5C \u4E91\u7AEF\u8FD8\u5728 \u2192 skip \uFF5C seenBase==null(\u4ECE\u6CA1synced) \u2192 skip \uFF5C dirty \u2192 skip \uFF5C \u4F59 = clean \u5B64\u513F \u2192 demote\nexport function classifyCloudGone(localNames, cloudNameSet, opts) {\n    const demote = [];\n    if (!opts.authoritative)\n        return { demote };\n    for (const name of localNames) {\n        if (opts.skip?.(name))\n            continue;\n        if (cloudNameSet.has(name))\n            continue; // \u4E91\u7AEF\u8FD8\u5728 \u2192 \u4E0D\u662F\u5B64\u513F\n        if (opts.seenBase(name) == null)\n            continue; // \u4ECE\u6CA1 synced = \u771F\u672C\u5730\u6587\u4EF6 \u2192 \u6C38\u4E0D\u78B0\n        if (opts.isDirty(name))\n            continue; // dirty \u5B64\u513F \u2192 \u7559\u7740\uFF08\u5B89\u5168 fallback\uFF0C\u4E0D\u964D\u7EA7\u3001\u4E0D surface\uFF09\n        demote.push(name); // clean \u5B64\u513F \u2192 \u964D\u7EA7 local-only\n    }\n    return { demote };\n}\nexport function createReconcile(cfg) {\n    const { cloud, local, head, pending, isOnline, activeIdentifier: activeFileNameFn } = cfg;\n    const isHiddenAny = (n) => isHidden(n) || !!cfg.hidden?.(n);\n    const now = cfg.now || (() => Date.now());\n    const skipName = (opt) => opt ?? activeFileNameFn?.() ?? undefined; // \u663E\u5F0F opts \u4F18\u5148\uFF0C\u5426\u5219\u7528 store \u81EA\u6301\u7684\u6D3B\u52A8 doc\n    // \u5171\u7528\u6536\u655B\uFF08SSOT\uFF0CreconcileAll + reconcileFolder + \u5404\u4E91\u7AEF\u5E27\u90FD\u7ECF\u6B64\uFF09\uFF1A\u7ED9\u4E00\u7EC4 localNames + **\u6743\u5A01** cloudNameSet \u2192\n    //   clean \u5B64\u513F\u8D70**\u53BB\u6296**\uFF1A\u7B2C\u4E00\u6B21\u6743\u5A01\u89C1 gone \u2192 \u6807 candidate\uFF08\u7167\u5E38\u663E\u793A + pendingGone badge\uFF0C\u4E0D\u5220\uFF09\uFF1B\u8FDE\u7EED\u7B2C\u4E8C\u6B21+\u4E14\u8DE8 GRACE\n    //   \u2192 \u672C\u5730 send trash\uFF08\u4E91\u7AEF\u5DF2 gone\uFF0C\u53EF\u6062\u590D\uFF09+ \u6E05\u4E24\u6761 etag \u8F68\u9053 + \u6E05 candidate\u3002\u91CD\u73B0/\u88AB\u7F16\u8F91 dirty \u2192 \u81EA\u6108\u6E05 candidate\u3002\n    //   **\u975E\u6743\u5A01\uFF08partial/\u7A7A/\u79BB\u7EBF\uFF09\u2192 \u6574\u4E2A no-op**\uFF1A\u65E2\u4E0D\u63A8\u8FDB\u9632\u6296\u3001\u4E5F\u4E0D\u6E05 candidate\uFF08\u7F51\u6296\u4E0D\u8BE5\u52A8\u5B83\uFF09\u3002dirty \u5B64\u513F \u2192 ghost\uFF0C\u6C38\u4E0D\u78B0\u3002\n    async function converge(localNames, cloudNames, authoritative, activeFileName) {\n        if (!authoritative)\n            return { demoted: [] };\n        localNames = localNames.filter((n) => !isHiddenAny(n)); // \u9690\u85CF\u9879\u4E91\u7AEF\u672C\u5C31\u4E0D\u5217 \u2192 \u522B\u636E\u300C\u4E91\u7AEF\u6CA1\u6709\u300D\u8BEF\u5224 gone\n        // \u81EA\u6108/\u53D6\u6D88\uFF1Acandidate \u91CD\u73B0\uFF08\u4E91\u7AEF\u6743\u5A01\u6709\uFF09\u6216\u5DF2\u53D8 dirty\uFF08\u88AB\u7F16\u8F91\uFF09\u2192 \u6E05\u6807\u8BB0\u3002\n        for (const name of localNames) {\n            if (pending.isPending(name) && (cloudNames.has(name) || head.isDirtyAnywhere(name)))\n                pending.clear(name);\n        }\n        const { demote } = classifyCloudGone(localNames, cloudNames, {\n            seenBase: (n) => head.seenBase(n),\n            isDirty: (n) => head.isDirtyAnywhere(n), // 2026-08-21 \u4FEE\uFF1Aper-tab \u89C6\u89D2\u66FE\u8BA9 converge \u628A\u522B tab \u7684\u672A\u63A8\u810F\u5B57\u8282\u5224\u6210 clean \u5B64\u513F \u2192 send trash\uFF08\u00A7A\u300Cdirty \u6C38\u4E0D\u88AB\u9A71\u9010\u300D\u5931\u5B88\uFF09\n            authoritative,\n            skip: activeFileName ? (n) => n === activeFileName : undefined,\n        });\n        const demoted = [];\n        for (const name of demote) {\n            if (!pending.seenGone(name, now()))\n                continue; // \u9996\u6B21\u89C1 gone / grace \u5185 \u2192 \u6807\u8BB0+\u7559\u7740\uFF08badge\uFF09\uFF0C\u4E0D\u5220\n            // \u5355\u817F\u4E8B\u4EF6\uFF08\u4E91\u7AEF\u5DF2\u7ECF\u6CA1\u4E86\uFF0C\u53EA\u6709\u672C\u5730\u8FD9\u4E00\u6761\u817F\uFF09\u2192 \u81EA\u5DF1\u751F\u6210 id\uFF0C\u65E0\u914D\u5BF9\u9700\u6C42\u3002\n            if (cfg.drop?.(name))\n                await local.hardDelete(name); // 2.1.0 \u4E09\u7B49\u8D44\u6E90\uFF1A\u672C\u5730\u53EA\u662F\u7F13\u5B58\uFF0C\u4E91\u7AEF\u6CA1\u4E86\u76F4\u63A5\u4E22\uFF08\u4E0D\u8FDB\u56DE\u6536\u7AD9\uFF09\n            else\n                await local.trash(name, asideStamp(now())); // \u8DE8 GRACE \u7B2C\u4E8C\u6B21+ \u2192 \u672C\u5730 send trash\uFF08move-aside\uFF0C\u53EF\u6062\u590D\uFF09\n            cloud.clearState(name);\n            head.forget(name);\n            pending.clear(name); // \u6E05\u4E24\u6761 etag \u8F68\u9053 + candidate\n            demoted.push(name);\n        }\n        return { demoted };\n    }\n    // **\u5168\u5E93** cloud-gone \u6536\u655B\u2014\u2014**\u4EC5\u7528\u6237\u663E\u5F0F\u6307\u4EE4**\uFF08\u5C06\u6765\u9690\u85CF\u7684\u300C\u6821\u9A8C\u5B8C\u6574\u6027\u300D\u5165\u53E3\uFF09\uFF0C**\u7EDD\u4E0D\u81EA\u52A8/\u8F6E\u8BE2**\u3002\n    //   \u5168\u6811 listAll\uFF08\u6BCF\u4E2A\u5B50\u5939\u4E00\u6B21 Graph \u5F80\u8FD4\uFF09\u662F\u91CD\u6D3B\uFF1B\u65E5\u5E38\u5F00\u5939\u60F0\u6027\u6536\u655B\u8D70 reconcileFolder\u3002\u7A7A\u5217\u8868\u5B88\u536B\u9632\u7F51\u6296\u8BEF\u5220\u3002\n    async function reconcile(opts = {}) {\n        if (isOnline && !isOnline())\n            return { demoted: [] }; // \u79BB\u7EBF \u2192 \u4E0D\u6743\u5A01\n        const all = await cloud.listAll().catch((e) => { reportStoreError(e, \"log\"); return null; }); // \u672A\u767B\u5F55/\u7F51\u5931\u8D25 \u2192 null\n        const authoritative = !!(all && all.complete && all.files.length > 0); // \u5931\u8D25-fetch + \u7A7A\u5217\u8868\u5B88\u536B\n        if (!authoritative)\n            return { demoted: [] };\n        const cloudNames = new Set(all.files.map((f) => f.name ?? f.path));\n        return converge(await local.appKeys(), cloudNames, authoritative, skipName(opts.activeFileName));\n    }\n    // **\u5355\u5939** cloud-gone \u6536\u655B\u2014\u2014\u300C\u770B\u5230 folder \u624D reconcile\u300D\uFF08watchFolder \u7684 remote pass \u526F\u4F5C\u7528\uFF09\uFF0C\u975E\u9759\u9ED8\u3001\u975E\u5168\u626B\u3002\n    //   authoritative = \u8FD9\u4E00\u5939 list() \u6CA1\u629B\u9519\uFF08complete\uFF09\u3002\u7A7A\u5939\u5408\u6CD5\uFF08per-folder \u4E0B\u300C\u7A7A\u300D\u2260\u7F51\u6296\uFF0C\u4E0E reconcile \u7684\u7A7A\u5217\u8868\u5B88\u536B\u4E0D\u540C\uFF09\u3002\n    //\n    // \u26A0 **\u5DF2\u77E5\u4E14\u5DF2\u63A5\u53D7\u7684\u98CE\u9669\uFF0C\u522B\u518D\u6765\"\u4FEE\"**\uFF08human 2026-07-18 \u660E\u786E\u62CD\u677F\u627F\u62C5\uFF09\uFF1A\n    //   provider \u82E5**\u6492\u8C0E**\u2014\u2014\u628A 404 \u5F53\u7A7A\u5939\u8FD4\u56DE\uFF0C\u6216\u5206\u9875\u6CA1\u5217\u5168\u5374\u62A5 complete:true\u2014\u2014\u672C\u5939\u300C\u672C\u5730 clean\u3001\n    //   \u4E91\u7AEF\u6D88\u5931\u300D\u7684\u6587\u4EF6\u4F1A\u88AB\u6807 candidate-gone\u3001\u8FDB 24h grace\u3001\u8DE8 grace \u540E send trash\uFF08\u53EF\u6062\u590D\uFF0C\u975E\u786C\u5220\uFF09\u3002\n    //   \u4E3A\u4EC0\u4E48\u4E0D\u4FEE\uFF1A\u7AD9\u5728\u8FD9\u4E00\u5C42**\u5206\u8FA8\u4E0D\u51FA**\u300C\u771F\u7684\u7A7A\u300D\u548C\u300Cprovider \u8C0E\u62A5\u7A7A\u300D\u2014\u2014\u4E24\u8005\u8FD4\u56DE\u7684\u5B57\u8282\u4E00\u6A21\u4E00\u6837\u3002\n    //   \u73B0\u6709\u7F13\u89E3\u5DF2\u662F\u80FD\u505A\u7684\u5168\u90E8\uFF1Acomplete \u5B88\u536B + \u53BB\u6296 grace + \u91CD\u73B0\u81EA\u6108 + \u88AB\u7F16\u8F91\u5373\u53D6\u6D88 + \u7EC8\u70B9\u662F .trash \u4E0D\u662F\u786C\u5220\u3002\n    //   \u2192 \u6709\u754C\u3001\u53EF\u6062\u590D\u3001\u5355\u7528\u6237\u4E0B\u6781\u96BE\u89E6\u53D1\u3002\u4E0E\u5176\u52A0\u6D4B\u8BD5\u5047\u88C5\u9632\u4F4F\u4E86\uFF0C\u4E0D\u5982\u7B49\u771F\u590D\u73B0\uFF08\u6216\u67E5 Graph \u5DF2\u77E5 bug\uFF09\u3002\n    //   \uFF08\u540C\u7406 removeFolder \u7684\u5206\u9875 TOCTOU\uFF1A\u5224\u7A7A\u4E0E\u5220\u9664\u4E4B\u95F4\u7684\u7A97\u53E3\u65E0\u6CD5\u5728\u5BA2\u6237\u7AEF\u6D88\u9664\uFF0C\u540C\u6837\u627F\u62C5\u3002\uFF09\n    //   \u53EA\u5224**\u8BE5\u5939\u76F4\u5C5E**\u672C\u5730\u6587\u4EF6\uFF08startsWith(prefix) \u2227 \u65E0\u66F4\u6DF1 slash\uFF09\u2014\u2014\u8EAB\u4EFD=path\u3001\u4E0D\u8DE8\u5939\u8FFD\u8E2A\uFF1A\u522B\u5939\u7684 clean \u6587\u4EF6\u6C38\u4E0D\u88AB\u672C\u6B21\u964D\u7EA7\u3002\n    //   opts.cloudPrefetched\uFF08A3 \u4FEE\u53CC\u62C9\uFF09\uFF1A\u8C03\u7528\u65B9\uFF08watchFolder remote pass\uFF09\u5DF2\u62C9\u597D\u7684**\u73B0\u573A**\u4E91\u5E27 \u2192 \u590D\u7528\uFF0C\n    //   \u672C\u5939\u4E0D\u518D\u7B2C\u4E8C\u6B21\u6253 Graph\u3002undefined=\u81EA\u53D6\uFF1Bnull=\u4E91\u4E0D\u53EF\u8FBE\uFF08\u2192 \u4E0D\u6743\u5A01 no-op\uFF09\u3002\n    //   \u26A0 \u7EA2\u7EBF\uFF1Aprefetched \u5FC5\u987B\u662F\u73B0\u573A\u5217\u4E3E\u2014\u2014**\u7EDD\u4E0D\u5582 dir-index-cache \u76EE\u5F55\u7D22\u5F15\u7F13\u5B58**\uFF08gone \u5224\u5B9A\u53EA\u8BA4\u6D3B\u4E91\u5E27\uFF0C\u7F13\u5B58\u975E SSoT\u3001\u53EA\u914D\u753B\u9996\u5E27\uFF09\u3002\n    async function reconcileFolder(folder, opts = {}) {\n        if (isOnline && !isOnline())\n            return { demoted: [] };\n        const res = opts.cloudPrefetched !== undefined\n            ? opts.cloudPrefetched\n            : await cloud.listFolder(folder).catch((e) => { reportStoreError(e, \"log\"); return null; });\n        if (!res || !res.complete)\n            return { demoted: [] }; // \u8FD9\u4E00\u5939\u6CA1\u5217\u5168 \u2192 \u4E0D\u6743\u5A01 \u2192 no-op\uFF08\u7EDD\u4E0D\u636E\u6B64\u5224 gone\uFF09\n        const cloudNames = new Set(res.files.map((f) => f.name ?? f.path));\n        const prefix = folder ? `${folder}/` : \"\";\n        const localNames = (await local.appKeys()).filter((k) => {\n            if (folder && !k.startsWith(prefix))\n                return false;\n            const rest = k.slice(prefix.length);\n            return rest.length > 0 && !rest.includes(\"/\"); // \u4EC5\u672C\u5939\u76F4\u5C5E\u6587\u4EF6\n        });\n        return converge(localNames, cloudNames, true, skipName(opts.activeFileName));\n    }\n    return { reconcile, reconcileFolder };\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md + CONTEXT.md + DATA SAFETY GUIDELINE.md\u3002store \u5185\u90E8\u6DF1\u6A21\u5757\u2014\u2014app \u4E0D import\u3002\n//\n// pending-gone\uFF08\u6DF1\u6A21\u5757\uFF09\u2014\u2014 \u4E91\u7AEF\u9632\u6296\u6807\u8BB0\uFF08cloud-gone \u6536\u655B\u4ECE\u300Cdemote local-only\u300D\u5347\u7EA7\u4E3A\u300C\u53BB\u6296\u540E send trash\u300D\u7684\u5B88\u536B\uFF09\u3002\n//   \u8BED\u4E49\uFF08\u7528\u6237\u62CD\u677F 2026-07-17\uFF09\uFF1A\u672C\u5730 clean = \u4E91\u7AEF\u66FE\u6709\u5907\u4EFD\uFF1B\u4E4B\u540E\u4E91\u7AEF\u6301\u7EED\u7F3A\u5931\uFF08\u6743\u5A01\u89C1 gone\uFF09= \u7528\u6237\u540C\u610F\u7684\u5220\u9664\u3002\n//   \u4F46\u7EDD\u4E0D\u4E00\u6B21\u7F51\u6296\u5C31\u5220\u2014\u2014**\u7B2C\u4E00\u6B21\u89C1 gone \u53EA\u6807\u8BB0\uFF08@ firstSeenGoneAt\uFF09\uFF0C\u8FDE\u7EED\u7B2C\u4E8C\u6B21+\u6743\u5A01\u89C1 gone \u4E14\u8DE8\u8FC7 GRACE \u624D\u52A8\u624B**\u3002\n//   \u52A8\u624B = \u672C\u5730 send trash\uFF08\u53EF\u6062\u590D\uFF09\uFF1B\u91CD\u73B0\u5373\u81EA\u6108\uFF08\u6E05\u6807\u8BB0\uFF09\uFF1Bgrace \u5185\u88AB\u7F16\u8F91 \u2192 \u7ACB\u5373\u6E05\u6807\u8BB0\uFF08\u5F53\u6B63\u5E38 dirty\uFF09\u3002\n//\n// \u6301\u4E45\uFF1Akv \u76F8\u5BF9\u952E `internal.pending_gone`\uFF08namespacedKv \u8865 `${appId}.${databaseId}.` \u6839\u524D\u7F00\uFF0C\u4E0E pending_deletions/_uploads \u540C\u65CF\uFF09\u3002\n//   **\u4E0D\u65B0\u589E IDB object store**\uFF1BpendingGone badge \u662F listing \u65F6\u4ECE\u672C\u6A21\u5757\u6D3E\u751F\u7684 syncState\uFF0C\u4E0D\u5355\u72EC\u843D\u5E93\u3002\nimport { reportStoreError } from \"../base/error-handling.js\"; // \u5168\u63A5\u4F46\u5206\u7EA7\uFF1A\u9759\u9ED8 swallow \u4E5F funnel\uFF08\u4E0D\u6539\u63A7\u5236\u6D41\uFF09\nconst KEY = \"internal.pending_gone\"; // \u76F8\u5BF9\u952E \u2192 `${ns}.internal.pending_gone`\nexport function createPendingGone(kv, graceMs) {\n    function read() {\n        try {\n            const raw = kv.get(KEY);\n            return raw ? JSON.parse(raw) : {};\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            return {};\n        }\n    }\n    function write(m) {\n        if (Object.keys(m).length)\n            kv.set(KEY, JSON.stringify(m));\n        else\n            kv.remove(KEY);\n    }\n    return {\n        isPending(name) { return read()[name] != null; },\n        seenGone(name, now) {\n            const m = read();\n            const first = m[name];\n            if (first == null) {\n                m[name] = now;\n                write(m);\n                return false;\n            } // \u7B2C\u4E00\u6B21\u6743\u5A01\u89C1 gone\uFF1A\u6807\u8BB0 @ now\uFF0C**\u4E0D\u52A8\u624B**\uFF08\u9632\u5355\u6B21\u7F51\u6296\u8BEF\u5220\uFF09\n            if (now - first >= graceMs)\n                return true; // \u5DF2\u6807\u8BB0 + \u8DE8\u8FC7 GRACE\uFF08\u7B2C\u4E8C\u6B21+\u6743\u5A01\u89C1 gone\uFF09\u2192 \u52A8\u624B\n            return false; // \u4ECD\u5728 grace \u5185 \u2192 \u7EE7\u7EED\u7B49\uFF08\u7167\u5E38\u663E\u793A + badge\uFF09\n        },\n        clear(name) { const m = read(); if (m[name] != null) {\n            delete m[name];\n            write(m);\n        } },\n        names() { return Object.keys(read()); },\n    };\n}\n", "// \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n// \u2502 GENERIC \u2014 Folder shape merge engine.  app-agnostic \u6DF1\u6A21\u5757\u3002                  \u2502\n// \u2502 \u77E5\u8BC6\u9762\u53EA\u6709 entry = { id, uat, name? }\uFF0C\u5176\u4F59\u5B57\u6BB5\u4E00\u5F8B opaque payload \u539F\u6837\u642C\u8FD0\u3002  \u2502\n// \u2502 \u4E0D\u8BA4\u8BC6\u4EFB\u4F55 app \u4E13\u5C5E\u6982\u5FF5\u3002app \u8BED\u4E49\uFF08\u9884\u8BBE dial\u3001\u6761\u76EE ref \u7528\u6CD5\uFF09      \u2502\n// \u2502 \u7559\u5728 app \u5C42\uFF0C**\u522B\u585E\u8FDB\u8FD9\u91CC**\u3002                                                  \u2502\n// \u2502 \u8FD9\u662F\u8981 merge-up \u5230 MyPWAPatterns/sync-store/ \u7684\u90A3\u5757\uFF08\u73B0\u5728\u5728\u5730\u6539 + \u684C\u9762\u5355\u6D4B\uFF09\u3002  \u2502\n// \u2502 \u6A21\u578B\u89C1 MyPWAPatterns ADR-0011 \u00A7Refinement 2026-06-06/-06b\u3001ADR-0004\u3002        \u2502\n// \u2502 \u6027\u8D28\uFF1AmergeFolders \u662F commutative + idempotent\uFF08CRDT-lite\uFF1Aper-id uat-LWW    \u2502\n// \u2502 \u5BC4\u5B58\u5668\uFF09\u2192 \u4E50\u89C2\u5E76\u53D1\u53CD\u590D pull-merge-push \u5FC5\u6536\u655B\u3002                                 \u2502\n// \u2502 **\u5220\u9664 = value:null \u5893\u7891**\uFF08\u660E\u786E\u5220\u9664\u6307\u4EE4\uFF0C\u975E\u300C\u672A\u77E5\u300D\uFF09\uFF1A\u4E0E\u666E\u901A\u503C\u4E00\u6837\u6309 uat-LWW    \u2502\n// \u2502 \u642C\u8FD0\u2014\u2014merge \u5C42\u4E0D\u7279\u6B8A\u5904\u7406\uFF0Ccollection \u5C42\u8BFB\u65F6\u8FC7\u6EE4 value===null\u3002\u6545\u65E0\u72EC\u7ACB trash    \u2502\n// \u2502 \u96C6\u5408\u3001\u65E0 resetAt \u6C34\u4F4D\u7EBF\uFF082026-07 tombstone \u5316\uFF09\u3002                              \u2502\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\nimport { reportStoreError } from \"../base/error-handling.js\"; // \u5168\u63A5\u4F46\u5206\u7EA7\uFF1A\u9759\u9ED8 swallow \u4E5F funnel\uFF08\u4E0D\u6539\u63A7\u5236\u6D41\uFF09\nexport const lastWinResolve = (x, y) => defaultResolve(x, y);\nfunction resolverForPolicy(policy) {\n    switch (policy) {\n        case \"last-win\": return lastWinResolve;\n        default: return lastWinResolve; // \u76EE\u524D\u53EA\u6B64\u4E00\u79CD\uFF1B\u6269\u679A\u4E3E\u65F6\u5728\u6B64\u52A0 case\n    }\n}\nexport const FOLDER_ENVELOPE_VERSION = 2; // v2\uFF1A\u5220\u9664\u6539 value:null \u5893\u7891\uFF08\u53BB\u6389 trash[]/resetAt\uFF09\nexport function emptyFolder() {\n    return { version: FOLDER_ENVELOPE_VERSION, items: [] };\n}\n// \u9ED8\u8BA4\u540C id \u89E3\u6790 = last-user-action-time wins\uFF08\u6574 entry\uFF09\u3002\n// uat \u76F8\u7B49\u7684\u75C5\u6001\u60C5\u5F62\uFF1A\u7528\u786E\u5B9A\u6027\u3001\u4E0E\u987A\u5E8F\u65E0\u5173\u7684 JSON tiebreak\uFF0C\u4FDD commutativity\u3002\nfunction defaultResolve(x, y) {\n    const ux = x.uat || 0, uy = y.uat || 0;\n    if (uy > ux)\n        return y;\n    if (uy < ux)\n        return x;\n    return JSON.stringify(y) > JSON.stringify(x) ? y : x;\n}\n// \u5408\u5E76\u4E24\u4EFD folder envelope\u3002\u7EAF per-id uat-LWW \u5BC4\u5B58\u5668\uFF08\u5220\u9664 = value:null \u5893\u7891\uFF0C\u7167 LWW \u642C\u8FD0\uFF0C\u4E0D\u7279\u6B8A\u5904\u7406\uFF09\u3002\n//   opts.resolve(x, y) \u2192 \u80DC\u51FA entry\uFF1A\u5B57\u6BB5\u7EA7 override \u7528\uFF08\u7F55\u89C1\uFF0C\u5982\u4E66\u7B7E\u96C6\u5E76\u96C6\uFF09\u3002\u4E0D\u4F20 = \u6574 entry LWW\u3002\nexport function mergeFolders(a, b, { resolve, conflictPolicy = \"last-win\" } = {}) {\n    const A = a || emptyFolder(), B = b || emptyFolder();\n    const pick = resolve || resolverForPolicy(conflictPolicy); // N11\uFF1A\u663E\u5F0F\u7B56\u7565\uFF08\u9ED8\u8BA4 last-win\uFF09\uFF1Bresolve override \u4ECD\u4F18\u5148\n    // items \u6309 id union\uFF1B\u540C id \u649E \u2192 pick\uFF08uat-LWW\uFF09\u3002value:null \u5893\u7891\u5C31\u662F\u4E00\u4E2A\u666E\u901A entry\uFF0C\u7167 LWW \u642C\u8FD0\u3002\n    const items = new Map();\n    for (const e of [...(A.items || []), ...(B.items || [])]) {\n        if (!e || e.id == null)\n            continue;\n        const cur = items.get(e.id);\n        items.set(e.id, cur ? pick(cur, e) : e);\n    }\n    return { version: FOLDER_ENVELOPE_VERSION, items: [...items.values()] };\n}\n// envelope \u7ED3\u6784\u662F\u5426\u5408\u6CD5\uFF08\u4F2A\u5728\u7EBF / \u622A\u65AD\u9632\u7EBF\u7684 envelope \u7EA7\u5224\u5B9A\uFF09\u3002\nexport function isValidFolderEnvelope(o) {\n    const f = o;\n    return !!f && typeof f === \"object\"\n        && Number.isFinite(f.version)\n        && Array.isArray(f.items) && f.items.every((e) => e && e.id != null && Number.isFinite(e.uat));\n}\n// \u89E3\u6790\u4E0D\u53EF\u4FE1 text/bytes\uFF08captive-portal \u7684 HTML \u767B\u5F55\u9875 / \u6162\u7F51\u622A\u65AD\uFF09\u2192 \u5408\u6CD5 envelope \u6216 null\u3002\n// \u7EDD\u4E0D\u8BA9\u810F\u5B57\u8282\u8FDB merge\uFF1A\u8C03\u7528\u7AEF\u53EA\u5728\u975E null \u65F6\u624D merge\u3002\nexport function parseFolderBlob(textOrBytes) {\n    let o;\n    try {\n        const s = typeof textOrBytes === \"string\" ? textOrBytes : new TextDecoder().decode(textOrBytes);\n        o = JSON.parse(s);\n    }\n    catch (e) {\n        reportStoreError(e, \"log\");\n        return null;\n    }\n    return isValidFolderEnvelope(o) ? o : null;\n}\n// \u7A33\u5B9A\u89C4\u8303\u5316\uFF08id \u6392\u5E8F\uFF09\u2192 \u5B57\u7B26\u4E32\uFF0C\u7528\u4E8E\u300C\u4E24\u4EFD folder \u662F\u5426\u7B49\u4EF7\u300D\u5224\u5B9A\uFF08\u987A\u5E8F\u65E0\u5173\uFF09\u3002\nexport function normalizeFolder(f) {\n    const byId = (a, b) => String(a.id).localeCompare(String(b.id));\n    return JSON.stringify({\n        version: f.version,\n        items: [...(f.items || [])].sort(byId),\n    });\n}\n// \u628A {id, name} \u5F15\u7528\u89E3\u6790\u5230 items\uFF1A\u5148 id \u547D\u4E2D\uFF0C\u518D name \u515C\u5E95\uFF0C\u90FD\u4E0D\u4E2D \u2192 null\u3002\n// \uFF08\u5F15\u7528\u65B9\u2014\u2014 Work-file / Cue \u2014\u2014\u6301\u5F15\u7528\uFF1BFolder \u4E0D\u6301\u6307\u9488\u3002ADR-0011 \u00A7Refinement\u3002\uFF09\nexport function resolveRef(items, ref) {\n    if (!ref || !Array.isArray(items))\n        return null;\n    if (ref.id != null) {\n        const byId = items.find((e) => e.id === ref.id);\n        if (byId)\n            return byId;\n    }\n    if (ref.name != null) {\n        const byName = items.find((e) => e.name === ref.name);\n        if (byName)\n            return byName;\n    }\n    return null;\n}\n", "// \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n// \u2502 GENERIC \u2014 Folder shape \u540C\u6B65\u5FAA\u73AF\uFF08pull-merge-push\uFF09over \u4E00\u4E2A CloudSync \u5B9E\u4F8B\u3002  \u2502\n// \u2502 app-agnostic \u6DF1\u6A21\u5757\uFF1B\u5907 merge-up \u5230 MyPWAPatterns/sync-store/\u3002               \u2502\n// \u2502                                                                              \u2502\n// \u2502 offline-first \u94C1\u5F8B\uFF1A\u6B63\u786E\u6027\u6765\u81EA folder-merge\uFF08CRDT-lite\uFF09\uFF0C**\u4E0D\u6765\u81EA gate**\u3002     \u2502\n// \u2502 \u7F16\u8F91\u6C38\u8FDC\u672C\u5730\u5373\u65F6\uFF08app \u4FA7\uFF09\uFF0C\u8FD9\u91CC\u53EA\u5728\u80FD\u8FDE\u65F6\u540E\u53F0 reconcile\uFF1Apull \u2192 merge \u2192 push\u3002 \u2502\n// \u2502 \u79BB\u7EBF/\u6162\u7F51\u8D85\u65F6/\u4F2A\u5728\u7EBF \u2192 \u9000\u56DE\u672C\u5730\u3001\u7559 dirty\u3001\u7EDD\u4E0D\u4E22\u672C\u5730\u3001\u7EDD\u4E0D\u8BA9\u810F\u5B57\u8282\u8FDB merge\u3002     \u2502\n// \u2502                                                                              \u2502\n// \u2502 \u5206\u5DE5\uFF1Amerge \u5728\u5E93\u5185\u3001\u96F6\u56DE\u8C03\uFF08folder-merge\uFF09\u3002encode/decode\uFF08envelope \u683C\u5F0F +     \u2502\n// \u2502 \u65E7\u683C\u5F0F\u8FC1\u79FB\uFF09\u662F transport \u5173\u6CE8\u70B9\uFF0C\u7531 app \u6CE8\u5165\u2014\u2014\u8FD9\u8DDF CloudSync \u6536 fileName/      \u2502\n// \u2502 contentType \u4E00\u6837\uFF0C\u4E0D\u662F merge \u903B\u8F91\u5916\u6CC4\u3002                                        \u2502\n// \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\nimport { reportStoreError } from \"../base/error-handling.js\"; // \u5168\u63A5\u4F46\u5206\u7EA7\uFF1A\u9759\u9ED8 swallow \u4E5F funnel\uFF08\u4E0D\u6539\u63A7\u5236\u6D41\uFF09\nimport { mergeFolders, emptyFolder, normalizeFolder } from \"./folder-merge.js\";\nfunction withTimeout(p, ms) {\n    if (!ms)\n        return p;\n    return Promise.race([\n        p,\n        new Promise((_, rej) => setTimeout(() => rej(Object.assign(new Error(\"timeout\"), { _timeout: true })), ms)),\n    ]);\n}\nconst is412 = (e) => {\n    const x = e;\n    return !!x && (x.name === \"CloudConflictError\" || x.status === 412);\n};\n/**\n * @param {object} cfg\n * @param {object} cfg.cloud      \u4E00\u4E2A CloudSync \u5B9E\u4F8B\uFF08pull/push/getETag\u2026\uFF09\n * @param {string} cfg.name       \u540C\u6B65\u952E\uFF08\u5982 \"presets\"\uFF09\n * @param {(folder)=>Blob} cfg.encode   folder \u2192 \u4E0A\u4F20\u5B57\u8282\uFF08app \u51B3 envelope \u683C\u5F0F\uFF09\n * @param {(text:string)=>object|null} cfg.decode  \u4E91\u7AEF\u5B57\u8282 \u2192 folder\uFF08\u542B\u65E7\u683C\u5F0F\u8FC1\u79FB\uFF1B\u975E\u6CD5/\u810F\u5B57\u8282\u8FD4 null=\u4F2A\u5728\u7EBF\u9632\u7EBF\uFF09\n * @param {(x,y)=>object} [cfg.resolve]  \u5B57\u6BB5\u7EA7\u5408\u5E76 override\uFF08\u7F55\u89C1\uFF1B\u9ED8\u8BA4\u6574 entry LWW\uFF09\n * @param {()=>boolean} [cfg.isOnline]\n * @param {number} [cfg.timeoutMs=15000]\n */\nexport function createFolderFlow(cfg) {\n    const { cloud, name, encode, decode, resolve, conflictPolicy = \"last-win\", isOnline, timeoutMs = 15000 } = cfg;\n    let chain = Promise.resolve(null);\n    // \u4E32\u884C\u5316\u540C\u540D sync\uFF08\u907F\u514D\u81EA\u6211\u5E76\u53D1 race\uFF09\u3002\u8FD4\u56DE { status, folder, etag?, pushed? }\u3002\n    //   status: \"synced\" | \"offline\" | \"invalid\" | \"dirty\"\n    function sync(localFolder) {\n        const run = () => _sync(localFolder, 0);\n        chain = chain.then(run, run);\n        return chain;\n    }\n    async function _sync(localFolder, depth) {\n        if (isOnline && !isOnline())\n            return { status: \"offline\", folder: localFolder };\n        let pulled;\n        try {\n            pulled = await withTimeout(cloud.pull(name), timeoutMs);\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            return { status: \"offline\", folder: localFolder, error: e };\n        } // \u79BB\u7EBF / \u6162\u7F51\u8D85\u65F6 / \u4F2A\u5728\u7EBF API \u9519\n        let cloudFolder = emptyFolder();\n        if (pulled && pulled.blob) {\n            let text;\n            try {\n                text = await pulled.blob.text();\n            }\n            catch (e) {\n                reportStoreError(e, \"log\");\n                return { status: \"offline\", folder: localFolder, error: e };\n            }\n            const parsed = decode(text);\n            if (!parsed)\n                return { status: \"invalid\", folder: localFolder }; // \u4F2A\u5728\u7EBF\u9632\u7EBF\uFF1A\u810F\u5B57\u8282\u7EDD\u4E0D\u8FDB merge\n            cloudFolder = parsed;\n        }\n        const merged = mergeFolders(localFolder, cloudFolder, { resolve, conflictPolicy });\n        // \u672C\u5730\u6CA1\u8D21\u732E\u4EFB\u4F55\u4E91\u7AEF\u6CA1\u6709\u7684\u4E1C\u897F \u2192 \u4E0D\u5FC5 push\uFF08pull-before-edit / \u91CD\u590D sync \u4E0D\u767D\u5199\u4E91\u7AEF\uFF09\u3002\n        if (normalizeFolder(merged) === normalizeFolder(cloudFolder)) {\n            return { status: \"synced\", folder: merged, pushed: false, etag: pulled?.item?.eTag };\n        }\n        try {\n            // CloudSync.push \u73B0\u6536 Bytes|Blob\uFF08cloud-sync \u5185\u90E8 toU8 \u5F52\u4E00\u5316\uFF09\uFF0Cencode \u51FA Blob \u76F4\u63A5\u4F20\u3002\n            const res = await withTimeout(cloud.push(name, encode(merged), { baseEtag: pulled?.item?.eTag }), timeoutMs);\n            return { status: \"synced\", folder: merged, pushed: true, etag: res?.item?.eTag };\n        }\n        catch (e) {\n            if (is412(e) && depth < 5)\n                return _sync(merged, depth + 1); // \u6709\u4EBA\u63D2\u961F \u2192 \u91CD\u62C9\u91CD merge \u91CD\u63A8\uFF08\u5E26\u4E0A\u5DF2 merge \u7684\u672C\u5730\uFF09\n            reportStoreError(e, \"warning\"); // push \u771F\u5931\u8D25\u3001\u914D\u7F6E\u6570\u636E\u7559 dirty \u672A\u63A8 \u2192 surface\n            return { status: \"dirty\", folder: merged, error: e };\n        }\n    }\n    return { sync };\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md\u3002app \u4E0D\u76F4\u63A5 import \u672C\u6587\u4EF6\u2014\u2014\u7ECF createStore \u7684 store.collection \u62FF\u3002\n//\n// GENERIC \u2014 Collection store facade\uFF08README.md \u00A73\uFF09\u3002\u4E00\u4EFD\u540C\u6B65 JSON \u88C5\u591A\u4E2A**\u539F\u5B50** item\u3002\n// \u81EA\u62E5\u5185\u5B58 envelope\uFF08\u4E0D\u50CF folder-store \u8BA9 app \u6CE8\u5165 snapshot()/onResult\uFF09\uFF1Bitem = **\u88F8\u503C KV**\uFF1A\n//   \u4FE1\u5C01 { id, uat, value } \u7531\u672C\u6A21\u5757\u5F3A\u5236\u2014\u2014id \u5FC5\u586B\u3001uat \u5185\u90E8\u76D6\u6233\uFF08app \u65E2\u4F20\u4E0D\u8FDB\u4E5F\u8BFB\u4E0D\u5230\uFF09\u3001\n//   value = \u4EFB\u610F JSON\uFF08\u5BF9\u8C61\u6216\u88F8\u503C\uFF0Copaque\uFF09\u3002folder-merge \u628A value \u5F53\u666E\u901A opaque payload \u5B57\u6BB5\u642C\u8FD0\uFF0C\n//   per-item uat-LWW\uFF08CRDT-lite\uFF0C\u96F6\u51B2\u7A81\u9759\u9ED8 last-win\uFF0C\u914D\u7F6E\u7C7B\u53EF\u63A5\u53D7\u4E22\u5931\u2014\u2014\u89C1 folder-merge \u00A7N11\uFF09\u3002\n//   \u540C\u6B65\u590D\u7528 folder-flow\uFF08pull-merge-push\uFF0CIf-Match\uFF09\u3002\u5E8F\u5217\u5316 = JSON\uFF08#68\uFF1A\u5E93\u5185\u90E8 JSON\uFF0Capp \u4E0D\u4F20 encode/decode\uFF09\u3002\n//\n// **\u5220\u9664 = \u5893\u7891\uFF08value:null\uFF09**\uFF1AdeleteItem(id) \u2261 setItem(id, null)\u3002null \u662F**\u660E\u786E\u5220\u9664\u6307\u4EE4**\uFF08\u975E\u300C\u672A\u77E5\u300D\uFF09\uFF0C\n//   \u5E26 uat \u53C2\u4E0E last-write-wins\uFF08\u5220\u5F97\u665A\u2192\u5220\u6389\uFF1B\u7F16\u8F91\u5F97\u665A\u2192\u7559\u7F16\u8F91\uFF09\u3002\u5893\u7891\u7559\u5728 items[] \u91CC\u7167 LWW \u8DE8\u8BBE\u5907\u4F20\u64AD\uFF0C\n//   \u8BFB\u9762\uFF08keys/entries/getItem/getEntry\uFF09\u8FC7\u6EE4 value===null\u3002**setItem(id, undefined) \u62A5\u9519**\uFF08None \u975E\u6CD5\uFF1B\n//   \u8981\u5220\u4F20 null \u6216\u7528 deleteItem\uFF09\u3002\u65E0\u72EC\u7ACB trash \u96C6\u5408\u3001\u65E0 resetAt \u6C34\u4F4D\u7EBF\uFF082026-07 tombstone \u5316\uFF09\u3002\n//\n// **\u65B0\u5E93\u521D\u59CB\u5316\uFF08getInitData\uFF0Ceager\uFF09**\uFF1A**idb \u65E0\u6B64 collection**\uFF08\u65B0\u5E93\uFF09\u65F6 init \u7ACB\u5373\u8C03 getInitData() \u586B\u521D\u59CB\u503C\n//   uat=1\uFF08\u6700\u4F4E\u6233\uFF09\u3002\u968F\u540E\u540E\u53F0 reconcile \u62C9\u4E91\u2014\u2014\u4E91\u7AEF/\u522B\u8BBE\u5907\u771F\u6570\u636E\uFF08uat>1\uFF09\u7ECF LWW **\u5FC5\u80DC\u8FC7 seed\u3001\u8986\u76D6**\uFF1B\n//   \u4E91\u7AEF\u786E\u5B9E\u7A7A\u5219 seed \u63A8\u4E0A\u53BB\u3002\u79BB\u7EBF\u65B0\u8BBE\u5907\u7ACB\u5373\u6709\u5185\u5BB9\uFF1B\u5728\u7EBF\u65B0\u8BBE\u5907\u5148\u663E seed\u3001\u4E91\u7AEF\u5230\u4E86\u518D\u8986\u76D6\u3002\u89C1\u4E0B init()\u3002\n//\n// \u8BFB\u5199 = **\u540C\u6B65\u5185\u5B58**\uFF08getItem/setItem \u4E0D await\uFF09\uFF1B\u4E24\u4FA7 value \u6D45\u62F7\u8D1D\u9694\u79BB\uFF08app \u62FF\u5230/\u4F20\u5165\u7684\u5BF9\u8C61\u6539\u52A8\u4E0D\u4E0E\u4FE1\u5C01\u4E92\u76F8\u6C61\u67D3\uFF09\u3002\n//   \u4F46\u5185\u5B58 env \u5728 init() \u524D\u4E3A\u7A7A\uFF08getItem \u8FD4 default\uFF0CsetItem \u629B\u9519\uFF09\u3002onChange(cb) \u6574\u5E93 / onChange(id,cb) \u7ED1\u5355 key\u3002\n//   **onChange \u5BF9\u672C\u5730\u5199\u548C\u4E91\u7AEF\u5199\u4E00\u89C6\u540C\u4EC1**\uFF1A\u672C\u5730 setItem/deleteItem \u540C\u6B65 fire\uFF08\u5185\u5B58\u5DF2\u66F4\u65B0\uFF0C\u4E0D\u7B49 IDB \u9632\u6296\u3001\n//   \u4E0D\u7B49\u4E91\uFF09\uFF0C\u4E91\u7AEF reconcile \u7167\u65E7 fire\u3002app \u8BFB\u4FA7\u56E0\u6B64\u5B8C\u5168\u58F0\u660E\u5F0F\uFF0C\u4E14**\u5206\u4E0D\u51FA\u53D8\u66F4\u6765\u81EA\u672C\u5730\u8FD8\u662F\u8FDC\u7AEF**\n//   \uFF08\u7F51\u76D8\u6A21\u578B\uFF1A\u4F60\u53EA\u77E5\u9053\"\u76D8\u66F4\u65B0\u4E86\"\u2014\u2014\u523B\u610F\u4E0D\u7ED9\u533A\u5206\u5EA6\uFF0C\u514D\u5F97\u4E24\u6761\u8DEF\u5F84\u5404\u5199\u4E00\u5957\u903B\u8F91\u800C\u6F02\u79FB\uFF09\u3002\n//   init()\uFF08\u7F16\u6392\u9501\u5E93\u5185\uFF0C\u7167 file.open\uFF09\uFF1A\u5148 await hydrateLocal\uFF08\u672C\u5730 IDB\uFF0C\u5FEB\uFF09\u2192 \u518D**\u540E\u53F0 fire-and-forget**\n//   reconcile \u4E91\u7AEF\uFF08\u4E0D await\uFF09\u2192 resolve\u3002boot await init() \u62FF\u672C\u5730\u5373\u591F\uFF1B\u4E91\u7AEF\u540E\u53F0\u5BF9\u9F50\u3001onChange \u901A\u77E5\u3002\n//   reconcileWithRemote()\uFF1A\u4E8B\u4EF6\u9A71\u52A8\uFF08focus/visible/online\uFF09\u91CD\u62C9+resolve\uFF0Cper-key LWW\uFF08\u540C file.refresh\uFF09\u3002\n//   pull \u65F6\u82E5 local \u6709 uat-newer / pending \u2192 \u4E00\u5E76 push\uFF08\u6545\u540D reconcileWithRemote\uFF0C\u975E\u5355\u5411 pull\uFF09\u3002\nimport { createFolderFlow } from \"./folder-flow.js\";\nimport { emptyFolder, parseFolderBlob, mergeFolders, normalizeFolder, FOLDER_ENVELOPE_VERSION } from \"./folder-merge.js\";\nimport { reportStoreError } from \"../base/error-handling.js\";\n// collection \u5728\u672C\u5730\u7F13\u5B58\uFF08IDB `blobs`\uFF09\u91CC\u7684\u952E\u540D = collections \u5206\u533A\uFF08`collections/<name>`\uFF09\u3002\nexport function collectionLocalKey(name) { return `collections/${name}`; }\nconst SEED_UAT = 1; // \u521D\u59CB\u503C uat\uFF1A\u6700\u4F4E\u6233\uFF0C\u4EFB\u4F55\u771F\u5B9E\u7F16\u8F91\uFF08Date.now\uFF09/ \u522B\u8BBE\u5907\u771F\u6570\u636E\u5FC5\u80DC\u3002\nconst encode = (f) => new TextEncoder().encode(JSON.stringify(f));\nconst decode = (text) => parseFolderBlob(text);\n// store scaffold \u7528\uFF1A\u4E00\u4EFD**\u7A7A** collection \u7684\u5B57\u8282\uFF08\u4E0E encode \u540C\u683C\u5F0F \u2192 decode \u53EF\u8BFB\u56DE\uFF09\u3002\u5F00\u5E93\u65F6 store \u62FF\u5B83 idempotent \u5EFA\u7A7A\u4E91\u6587\u4EF6\u3002\nexport function emptyCollectionBytes() { return encode(emptyFolder()); }\n// getItem \u7F3A\u7701\uFF1Adef \u53EF\u4E3A\u88F8\u503C\u6216**\u5171\u4EAB**\u5DE5\u5382\u51FD\u6570\uFF08\u7F3A\u9879\u65F6\u624D\u8C03\uFF09\u3002\u26A0\u5DE5\u5382 lambda **\u522B inline**\u2014\u2014\n//   getItem \u5E38\u5728\u70ED\u8DEF\u5F84\u88AB\u8C03\uFF0Cinline `() => ({...})` \u6BCF\u6B21\u5206\u914D\u95ED\u5305+\u9ED8\u8BA4\u5BF9\u8C61\uFF1B\u5199\u6210\u6A21\u5757\u7EA7\u5171\u4EAB const \u51FD\u6570\u590D\u7528\u3002\nconst resolveDef = (def) => typeof def === \"function\" ? def() : def;\n// getItem/setItem \u4E24\u4FA7 shallow copy\uFF1Avalue \u662F\u5BF9\u8C61/\u6570\u7EC4\u65F6\u62F7\u4E00\u5C42\uFF0C\u9694\u79BB\u5E93\u5185\u4FE1\u5C01\u4E0E app \u7684\u53EF\u53D8\u5F15\u7528\n//   \uFF08getItem \u62FF\u5230\u7684\u5BF9\u8C61\u539F\u5730\u6539\u4E0D\u6C61\u67D3\u5B58\u6863\u4FE1\u5C01\uFF1BsetItem \u4F20\u5165\u7684\u5BF9\u8C61\u4E4B\u540E\u88AB app \u6539\u4E5F\u4E0D\u53CD\u6C61\u67D3\u4FE1\u5C01\uFF09\u3002\u6807\u91CF\u539F\u6837\u3002\n//   \u6D45\u62F7\u8D1D\u8BED\u4E49\uFF1A\u6DF1\u5C42\u5D4C\u5957\u5B50\u5BF9\u8C61\u4E0D\u62F7\u2014\u2014app \u522B\u539F\u5730\u6539\u5D4C\u5957\u540E\u6307\u671B\u9694\u79BB\uFF0C\u8981\u6539\u6574\u679D\u66FF\u6362\u518D setItem\u3002\nconst shallowCopy = (v) => Array.isArray(v) ? [...v]\n    : (v && typeof v === \"object\") ? { ...v }\n        : v;\n// \u5893\u7891\u5224\u5B9A\uFF1Avalue===null = \u5220\u9664\u6307\u4EE4\u3002\nconst valueOf = (e) => e.value;\nconst isTombstone = (e) => valueOf(e) === null;\nexport function createCollection(cfg) {\n    const { cloud, name, isOnline, syncDelayMs = 1500, now = () => Date.now(), manual = false, local, localWriteDelayMs = 400, getInitData } = cfg;\n    const flow = createFolderFlow({ cloud, name, encode, decode, isOnline });\n    let env = emptyFolder();\n    let timer = null;\n    let ready = false; // init \u540E\u7F6E true\uFF1Apre-init \u5B88\u536B\uFF08setItem \u629B\u3001getItem \u8FD4 default\uFF09\n    const listeners = new Set();\n    // \u2500\u2500 onChange\uFF1A**\u4EFB\u4F55**\u503C\u53D8\uFF08\u672C\u5730 setItem / \u4E91\u7AEF reconcile\uFF09\u2192 \u901A\u77E5\u8BA2\u9605\u8005\u3002\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    //   \u672C\u5730\u5199\u540C\u6B65 fire\uFF08\u5185\u5B58\u5DF2\u5373\u65F6\u66F4\u65B0\uFF0C\u4E0D\u7B49 400ms IDB \u9632\u6296\u3001\u4E0D\u7B49\u4E91\uFF09\uFF1B\u8FDC\u7AEF reconcile \u7167\u65E7\u3002\n    //   \u8BFB\u4FA7\u56E0\u6B64\u5B8C\u5168\u58F0\u660E\u5F0F\uFF0C\u4E14**\u5206\u4E0D\u51FA\u672C\u5730\u8FD8\u662F\u8FDC\u7AEF**\u2014\u2014\u90A3\u6B63\u662F\u8BBE\u8BA1\u76EE\u6807\uFF08\u7F51\u76D8\u6A21\u578B\uFF1A\u4F60\u53EA\u77E5\u9053\"\u76D8\u66F4\u65B0\u4E86\"\uFF09\u3002\n    //   \u5893\u7891\uFF08value:null\uFF09\u4E5F\u8BA1\u5165 \u2192 \u5220\u9664\u540C\u6837\u89E6\u53D1\uFF08\u522B\u53F0\u5220\u4E86\u672C\u5730\u8981\u8DDF\u7740\u79FB\u9664\uFF09\u3002\n    let _firing = false;\n    const _queued = [];\n    function emit(changed) {\n        if (!changed.length || !listeners.size)\n            return;\n        if (_firing) {\n            _queued.push(...changed);\n            return;\n        } // \u91CD\u5165\uFF08listener \u91CC\u53C8 setItem\uFF09\u2192 \u6392\u961F\u5408\u5E76\uFF0C\u7EDD\u4E0D\u9012\u5F52\n        _firing = true;\n        try {\n            let batch = changed;\n            while (batch.length) {\n                for (const cb of listeners) {\n                    try {\n                        cb(batch);\n                    }\n                    catch (e) {\n                        reportStoreError(e, \"log\");\n                    }\n                }\n                batch = _queued.splice(0, _queued.length);\n            }\n        }\n        finally {\n            _firing = false;\n        }\n    }\n    const snapshotValues = () => {\n        const m = new Map();\n        for (const e of env.items)\n            if (e.id != null)\n                m.set(String(e.id), JSON.stringify(valueOf(e)));\n        return m;\n    };\n    // \u8FDC\u7AEF\u8DEF\u5F84\u4E13\u7528\uFF1A\u6574\u8868\u5FEB\u7167 diff\uFF08\u4E91\u7AEF\u5408\u5E76\u53EF\u80FD\u52A8\u4EFB\u610F\u591A key\uFF0C\u53EA\u80FD\u5168\u8868\u6BD4\uFF09\u3002\n    //   \u26A0 \u672C\u5730 setItem **\u4E0D**\u8D70\u8FD9\u6761\u2014\u2014\u5B83\u53EA\u52A8\u4E00\u4E2A id\uFF0C\u5374\u8981 JSON.stringify \u5168\u8868\uFF1BresetBuiltin \u8FDE\u5199 ~60 \u9879\u5C31\u662F O(N\u00B2)\u3002\n    const fireChanged = (before) => {\n        if (!listeners.size)\n            return;\n        const after = snapshotValues();\n        const changed = [];\n        for (const [id, v] of after)\n            if (before.get(id) !== v)\n                changed.push(id);\n        for (const [id] of before)\n            if (!after.has(id))\n                changed.push(id);\n        emit(changed);\n    };\n    // \u2500\u2500 \u672C\u5730\u7F13\u5B58\uFF08IDB\uFF09\uFF1A\u900F\u660E\u955C\u50CF\u5185\u5B58 env\uFF08\u542B uat \u7684\u5B8C\u6574 envelope\uFF09\u3002\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const localKey = collectionLocalKey(name);\n    let hydrated = false;\n    let idbHad = false; // hydrate \u65F6\u672C\u5730\u662F\u5426\u5DF2\u6709\u8FD9\u4EFD collection\uFF08\u65B0\u5E93\u5224\u5B9A\u7528\uFF09\n    let localTimer = null;\n    let localChain = Promise.resolve({ ok: true });\n    async function bytesOf(b) {\n        if (!b)\n            return null;\n        if (b instanceof Uint8Array)\n            return b;\n        if (typeof b.arrayBuffer === \"function\")\n            return new Uint8Array(await b.arrayBuffer());\n        return null;\n    }\n    async function hydrateLocal() {\n        if (!local || hydrated)\n            return;\n        hydrated = true;\n        try {\n            idbHad = await local.exists(localKey);\n            if (idbHad) {\n                const cached = parseFolderBlob((await bytesOf(await local.get(localKey))) ?? new Uint8Array(0));\n                if (cached)\n                    env = mergeFolders(env, cached); // \u5408\u5E76\u8FDB\u5F53\u524D env\uFF08\u4FDD\u7559\u5404 item uat\uFF09\n            }\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n        } // \u574F\u672C\u5730\u7F13\u5B58 \u2192 \u5FFD\u7565\uFF0C\u56DE\u9000\u4E91\u7AEF\n    }\n    function clearLocalTimer() { if (localTimer != null) {\n        clearTimeout(localTimer);\n        localTimer = null;\n    } }\n    function scheduleLocalWrite() {\n        if (!local || localTimer != null)\n            return;\n        localTimer = setTimeout(() => { localTimer = null; void writeLocalNow(); }, localWriteDelayMs);\n    }\n    // \u2605 v436\uFF1A\u672C\u5730\u5199**\u5931\u8D25\u4E5F\u8981\u8BF4\u51FA\u6765**\u3002\u65E7\u7248 `.catch(reportStoreError(e,\"log\"))` \u4E4B\u540E\u8FD4\u56DE localChain\uFF0C\n    //   \u4E8E\u662F IDB \u5199\u88AB\u62D2\uFF08\u914D\u989D\u6EE1 / \u5B58\u50A8\u88AB\u963B\u585E / \u9690\u79C1\u6A21\u5F0F\uFF09\u65F6\u8FD9\u4E2A promise \u7167\u6837 resolve\uFF0C\u4E14\u53EA\u8FDB console\u3002\n    //   \u4E09\u4E2A unload \u5C4F\u969C\uFF08app-prefs / app-state / preset-rack-controller\uFF09\u5168\u9760\u5B83\u5F53\u300C\u5173\u673A\u524D\u843D\u76D8\u300D\u7684\u4FDD\u8BC1\u2014\u2014\n    //   \u4E00\u65E6\u5B83\u8BF4\u8C0E\uFF0C\u7528\u6237\u7684\u8BBE\u7F6E\u548C\u9884\u8BBE\u5C31**\u9759\u9ED8\u4E22\u5931**\u3002\u800C\u8FD9\u662F**\u672C\u5730**\u90A3\u6761\u817F\uFF0C\u4E0D\u662F\u4E91\u7AEF\uFF1A\n    //   \u79BB\u7EBF\u662F\u6B63\u5E38\u574F\u5929\u6C14\uFF0C\u672C\u5730\u5199\u4E0D\u8FDB\u53BB\u4E0D\u662F\u3002\u5206\u7EA7\u4E5F\u4ECE \"log\" \u63D0\u5230 \"warning\"\uFF08\u8981\u51FA banner\uFF09\u3002\n    function writeLocalNow() {\n        if (!local)\n            return Promise.resolve({ ok: true });\n        clearLocalTimer();\n        const snap = encode(env); // \u6293\u5F53\u524D env \u5FEB\u7167\uFF08\u542B uat\uFF09\n        localChain = localChain\n            .then(() => local.save(localKey, snap).then(() => ({ ok: true })))\n            .catch((e) => { reportStoreError(e, \"warning\"); return { ok: false, error: e }; });\n        return localChain;\n    }\n    function clearTimer() { if (timer != null) {\n        clearTimeout(timer);\n        timer = null;\n    } }\n    function scheduleSync() {\n        scheduleLocalWrite(); // \u672C\u5730\u7F13\u5B58\u4E0E\u4E91\u65E0\u5173\uFF1Amanual/auto \u90FD\u5199\u672C\u5730\uFF08\u5F3A\u6740/\u79BB\u7EBF\u9760\u5B83\uFF09\n        cloud.setDirty(name, true);\n        if (manual)\n            return; // \u624B\u52A8\u6A21\u5F0F\uFF1A\u53EA\u6807\u810F\uFF0C\u4E91 commit \u7531\u8C03\u7528\u65B9 reconcileWithRemote() \u9A71\u52A8\n        clearTimer();\n        timer = setTimeout(() => { timer = null; void sync(); }, syncDelayMs);\n    }\n    // sync\uFF1Asnapshot \u5185\u5B58 env \u2192 folder-flow\uFF08pull-merge-push\uFF09\u2192 \u628A\u5408\u5E76\u7ED3\u679C**\u5E76\u56DE**\u5F53\u524D env\uFF08per-item LWW \u4FDD\u65B0\u7F16\u8F91\u4E0D\u88AB\u65E7\u5FEB\u7167\u76D6\uFF09\u3002\n    //   \u5E26\u6765\u4E91\u7AEF\u503C\u53D8 \u2192 fireChanged\u3002dirty \u6536\u5C3E\uFF08K12\uFF09\uFF1Asynced \u4E14\u5E76\u56DE\u540E == \u5DF2\u63A8\u7684 res.folder \u624D\u6E05\u810F\u3002\u8FD4 flow \u7ED3\u679C\u3002\n    async function sync() {\n        const before = snapshotValues();\n        const res = await flow.sync(env);\n        env = mergeFolders(env, res.folder);\n        scheduleLocalWrite(); // \u628A\u5408\u5E76\u540E\u7684\uFF08\u542B\u4E91\u7AEF\uFF09\u72B6\u6001\u4E5F\u5199\u56DE\u672C\u5730\u7F13\u5B58\n        if (res.status === \"synced\") {\n            if (res.etag)\n                cloud.setETag(name, res.etag);\n            if (normalizeFolder(env) === normalizeFolder(res.folder))\n                cloud.setDirty(name, false);\n        }\n        fireChanged(before);\n        return res;\n    }\n    // \u540E\u53F0/\u4E8B\u4EF6\u9A71\u52A8\u4E91\u7AEF\u5BF9\u9F50\uFF1Afreshness \u5FEB\u8DEF\u5F84\uFF08etag-skip\uFF09+ \u5B8C\u6574 pull-merge-push\uFF1B\u79BB\u7EBF/\u574F\u5B57\u8282\u7EDD\u4E0D wipe\u3002\n    //   \u8FD4 flow \u7ED3\u679C\u6216 null\uFF08etag-skip\uFF09\u3002\n    async function reconcile() {\n        // \u5FEB\u8DEF\u5F84\uFF08freshness etag-skip\uFF09\uFF1Aclean \u2227 \u5728\u7EBF \u2227 \u6709\u5DF2\u77E5 etag \u2227 \u4E91\u7AEF etag \u6CA1\u53D8 \u2192 \u672C\u5730\u5373\u6700\u65B0\uFF0C\u8DF3\u6574\u4EFD pull-merge-push\u3002\n        if (!cloud.isDirty(name) && (!isOnline || isOnline()) && cloud.getETag(name)) {\n            const meta = await cloud.fetchMeta(name).catch((e) => { reportStoreError(e, \"log\"); return null; });\n            if (meta && meta.etag === cloud.getETag(name))\n                return null; // \u4E91\u7AEF\u6CA1\u53D8 \u2192 \u4E0D\u91CD pull\uFF08\u6709 etag = \u4E91\u7AEF\u5B58\u5728\uFF09\n        }\n        return sync(); // pull-merge-push\uFF08\u5176\u5185\u90E8\u79BB\u7EBF\u4F18\u96C5\u3001\u7EDD\u4E0D wipe\uFF1B\u5E26 fireChanged\uFF09\n    }\n    // \u4E8B\u4EF6\u9A71\u52A8\u91CD\u62C9\uFF08focus/visible/online\uFF09\u3002\u9519\u8BEF\u63A5 reportError\uFF08\u610F\u5916 throw\uFF1Bflow \u5185\u90E8\u7684\u79BB\u7EBF/push \u5931\u8D25\u5DF2\u5404\u81EA funnel\uFF09\u3002\n    //   \u2605 v436\uFF1A**\u8FD4\u56DE\u7ED3\u679C\uFF0C\u522B\u6536\u7A84\u6210 void**\u3002folder-flow.sync \u672C\u6765\u5C31\u4EA7\u51FA\n    //   {status:\"synced\"|\"offline\"|\"invalid\"|\"dirty\", pushed, error}\uFF0Ccollection.sync/reconcile \u4E00\u8DEF\u5E26\u4E0A\u6765\uFF0C\n    //   \u5374\u5728\u8FD9\u6700\u540E\u4E00\u6B65\u88AB\u62B9\u5E73\u2014\u2014\u4E8E\u662F\u300C\u79BB\u7EBF\u300D\u300C\u4E91\u7AEF\u5B57\u8282\u975E\u6CD5\u88AB\u62D2\u300D\u300Cpush \u6CA1\u6210\u3001\u914D\u7F6E\u4ECD\u672A\u4E0A\u4F20\u300D\n    //   \u5728\u6BCF\u4E2A\u8C03\u7528\u70B9\u90FD\u548C\u6210\u529F\u957F\u5F97\u4E00\u6A21\u4E00\u6837\u3002\u9884\u8BBE\u67B6\u70B9\u300C\u5237\u65B0\u300D\u6C38\u8FDC\u505C\u5728\u300C\u6B63\u5728\u5237\u65B0\u2026\u300D\u5C31\u662F\u8FD9\u4E48\u6765\u7684\u3002\n    async function reconcileWithRemote() {\n        try {\n            return (await reconcile()) ?? { status: \"unchanged\" };\n        }\n        catch (e) {\n            reportStoreError(e, \"warning\");\n            return { status: \"error\", error: e };\n        }\n    }\n    // \u65B0\u5E93 seed\uFF1AgetInitData() \u2192 uat=1 \u586B\u5165\uFF08\u6700\u4F4E\u6233\uFF0C\u771F\u6570\u636E\u5FC5\u80DC\uFF09\u3002**eager**\uFF1Aidb \u65E0\u5C31\u586B\uFF0C\u4E0D\u7B49\u4E91\u7AEF\u5224\u5B9A\u3002\n    async function seedInit() {\n        if (!getInitData)\n            return;\n        let initial;\n        try {\n            initial = await getInitData();\n        }\n        catch (e) {\n            reportStoreError(e, \"warning\");\n            return;\n        } // \u521D\u59CB\u6570\u636E\u6E90\uFF08\u5982 fetch builtin-presets.json\uFF09\u5931\u8D25 \u2192 surface\n        if (!initial || !initial.length)\n            return;\n        const seeded = initial\n            .filter((it) => it && it.id != null && it.value !== undefined)\n            .map((it) => ({ id: it.id, uat: SEED_UAT, value: shallowCopy(it.value) }));\n        if (!seeded.length)\n            return;\n        env = mergeFolders(env, { version: FOLDER_ENVELOPE_VERSION, items: seeded }); // LWW\uFF1Aseed uat=1 \u9047\u771F\u6570\u636E\u5FC5\u8BA9\u4F4D\n        cloud.setDirty(name, true); // seed \u9700\u63A8\u4E91\n        scheduleLocalWrite();\n    }\n    async function init() {\n        await hydrateLocal(); // \u5148\u4ECE\u672C\u5730\u7F13\u5B58 hydrate\uFF08\u79D2\u5F00 / \u79BB\u7EBF\u53EF\u8BFB / \u5F3A\u6740\u5B58\u6D3B\uFF09\uFF1B\u8BB0 idbHad\n        // **eager seed**\uFF08idb \u65E0=\u65B0\u5E93\uFF09\uFF1A\u7ACB\u5373\u7528 uat=1 \u586B\u521D\u59CB\u503C\uFF0C\u4E0D\u7B49\u4E91\u7AEF\u5224\u5B9A\u3002\u968F\u540E reconcile \u62C9\u4E91\u2014\u2014\n        //   \u4E91\u7AEF/\u522B\u8BBE\u5907\u7684\u771F\u6570\u636E\uFF08uat>1\uFF09\u7ECF LWW **\u5FC5\u80DC\u8FC7 seed\u3001\u8986\u76D6**\uFF1B\u4E91\u7AEF\u786E\u5B9E\u7A7A\u5219 seed \u88AB\u63A8\u4E0A\u53BB\u3002\n        //   \u79BB\u7EBF\u65B0\u8BBE\u5907\u7167\u6837\u7ACB\u5373\u6709\u5185\u5BB9\uFF1B\u5728\u7EBF\u65B0\u8BBE\u5907\u5148\u663E seed\u3001\u4E91\u7AEF\u5230\u4E86\u518D\u8986\u76D6\uFF08\u7528\u6237\u8BBE\u8BA1\uFF09\u3002\n        if (!idbHad)\n            await seedInit();\n        ready = true; // \u672C\u5730(\u542B seed)\u5C31\u7EEA\uFF1AgetItem \u6709\u503C\u3001setItem \u653E\u884C\u3002\u4E91\u7AEF\u540E\u53F0\u5BF9\u9F50\uFF08\u4E0D block boot\uFF09\u3002\n        void reconcile().catch((e) => reportStoreError(e, \"log\")); // \u540E\u53F0 pull-merge-push\uFF1A\u771F cloud \u8986\u76D6 seed\uFF1Bseed \u672A\u88AB\u8986\u76D6\u7684\u63A8\u4E91\n    }\n    function setItem(id, value) {\n        if (!ready)\n            throw new Error(`collection(${name}).setItem \u5728 init() \u524D\u8C03\u7528\u2014\u2014\u8BBE\u7F6E\u672A\u5C31\u7EEA`);\n        if (id == null)\n            throw new Error(\"collection.setItem: id \u5FC5\u586B\");\n        if (value === undefined)\n            throw new Error(`collection(${name}).setItem: value \u4E0D\u53EF\u4E3A undefined\uFF08\u5220\u9664\u8BF7\u7528 deleteItem \u6216\u4F20 null \u5893\u7891\uFF09`);\n        const prev = env.items.find((e) => e.id === id);\n        const valueChanged = !prev || JSON.stringify(valueOf(prev)) !== JSON.stringify(value); // \u540C\u503C\u91CD\u5199\u4E0D\u60CA\u52A8\u8BA2\u9605\u8005\n        const fi = { id, uat: now(), value: shallowCopy(value) }; // \u4FE1\u5C01 {id, uat, value}\uFF1Buat \u5185\u90E8\u76D6\u6233\uFF1Bvalue \u6D45\u62F7\u8D1D\u9694\u79BB\uFF08null=\u5893\u7891\uFF09\n        env = { ...env, items: [...env.items.filter((e) => e.id !== id), fi] };\n        scheduleSync();\n        // fire \u5728 scheduleSync **\u4E4B\u540E**\uFF1Alistener \u82E5\u540C\u6B65\u8C03 flushLocal()\uFF0C\u6B64\u65F6\u5B9A\u65F6\u5668\u5DF2\u6302\u597D\uFF0C\u8BED\u4E49\u4E00\u81F4\u3002\n        if (valueChanged)\n            emit([id]);\n    }\n    function deleteItem(id) {\n        if (!ready)\n            throw new Error(`collection(${name}).deleteItem \u5728 init() \u524D\u8C03\u7528`);\n        setItem(id, null); // null \u5893\u7891 = \u660E\u786E\u5220\u9664\u6307\u4EE4\uFF0CLWW\uFF08\u5220\u5F97\u665A\u2192\u5220\u6389\uFF1B\u522B\u5904\u7F16\u8F91\u5F97\u665A\u2192\u590D\u6D3B\uFF09\n    }\n    const entryOf = (e) => ({ id: String(e.id), uat: e.uat || 0, value: valueOf(e) });\n    function getEntry(id) {\n        const e = env.items.find((x) => x.id === id);\n        return e && !isTombstone(e) ? entryOf(e) : undefined; // \u5893\u7891\u89C6\u4E3A\u4E0D\u5B58\u5728\n    }\n    function getItem(id, def) {\n        const e = env.items.find((x) => x.id === id);\n        return e && !isTombstone(e) ? shallowCopy(valueOf(e)) : resolveDef(def); // \u5893\u7891\u2192default\uFF1B\u6D45\u62F7\u8D1D\u9694\u79BB\u9632\u8C03\u7528\u65B9\u539F\u5730\u6539\u6C61\u67D3\u4FE1\u5C01\n    }\n    function entries() { return env.items.filter((e) => !isTombstone(e)).map(entryOf); }\n    function keys() { return env.items.filter((e) => !isTombstone(e)).map((e) => String(e.id)); }\n    // \u6574\u5E93 onChange(cb) \u6216\u5355 key onChange(id, cb)\u3002\u5355 key = \u5185\u90E8\u5305\u4E00\u5C42 ChangeCb \u8FC7\u6EE4 changedIds\u3002\n    function onChange(a, b) {\n        const cb = typeof a === \"string\"\n            ? (ids) => { if (ids.includes(a))\n                b(); }\n            : a;\n        listeners.add(cb);\n        return () => { listeners.delete(cb); };\n    }\n    function flushLocal() { return writeLocalNow(); }\n    function isDirty() { return cloud.isDirty(name); }\n    return { init, reconcileWithRemote, setItem, deleteItem, getItem, getEntry, entries, keys, onChange, flushLocal, isDirty };\n}\n", "import { isHidden } from \"../base/is-hidden.js\"; // \u672B\u6BB5 dot = \u9690\u85CF\uFF08.trash/.backup/.<appId>/\u4EFB\u610F dot \u9879\u4E0D\u8FDB\u5217\u4E3E\uFF09\nimport { reportStoreError } from \"../base/error-handling.js\"; // \u5168\u63A5\u4F46\u5206\u7EA7\uFF1A\u9759\u9ED8 swallow \u4E5F funnel\uFF08\u4E0D\u6539\u63A7\u5236\u6D41\uFF09\n// \u4FBF\u5229\u5224\u5B9A\uFF1A**\u5355\u4E00\u6765\u6E90=syncState**\uFF0C\u7EAF\u51FD\u6570\uFF0C**\u522B\u5728 Item \u4E0A\u52A0 cached/dirty \u5B57\u6BB5**\uFF08\u591A\u4E00\u4E2A\u5B57\u6BB5=\u591A\u4E00\u6761\u4E0B\u6E38\u8D8A\u72F1\u8DEF\u5F84\uFF09\u3002\n/** \u6709\u672C\u5730\u526F\u672C \u2192 \u79BB\u7EBF\u53EF\u8BFB\u3002 */\nexport function isCached(s) { return s !== \"cloud-only\"; }\n/** \u6709\u672A\u63A8\u672C\u5730\u7F16\u8F91 \u2192 \u6C38\u4E0D\u88AB\u9A71\u9010\u3002 */\nexport function isDirty(s) {\n    return s === \"unpushed\" || s === \"conflict\" || s === \"float\" || s === \"ghost\";\n}\n// \u2500\u2500 \u7EAF\u5206\u7C7B\u5668\uFF08\u96F6 IO\uFF0C\u53EF\u7A77\u4E3E\u5355\u6D4B\uFF09\uFF1A\u4E00\u4E2A path \u7684\u539F\u59CB\u4E8B\u5B9E \u2192 syncState \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//   authoritative \u5206\u4E24\u7EA7\uFF08\u5BF9\u9F50 reconcile \u7684\u5931\u8D25-fetch \u5B88\u536B\uFF09\uFF1A\n//     cloudReachable      = \u62FF\u5230\u4E86\u4E91\u5217\u8868\uFF08\u5728\u7EBF \u2227 \u767B\u5F55 \u2227 listAll \u6CA1\u629B\u9519\uFF09\u2014\u2014\u51B3\u5B9A\u300C\u4E91\u8F74\u53EF\u4E0D\u53EF\u89E3\u6790\u300D\n//     absenceAuthoritative= \u4E14 complete=true\u2014\u2014\u51B3\u5B9A\u300C\u6CA1\u770B\u5230=\u771F\u6CA1\u4E86\u300D\u662F\u5426\u53EF\u4FE1\uFF08partial \u91CC\u7F3A\u5931\u2260\u4E91\u7AEF\u771F\u6CA1\u4E86\uFF0C\u7EDD\u4E0D\u636E\u6B64\u5224 gone\uFF09\nexport function classifySyncState(f) {\n    if (!f.hasLocal)\n        return \"cloud-only\"; // union \u4FDD\u8BC1\uFF1A\u5230\u8FD9\u4E00\u5B9A hasCloud\n    // \u2500\u2500 \u672C\u5730\u6709\u526F\u672C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    if (!f.cloudReachable) { // \u79BB\u7EBF/\u767B\u51FA\uFF1A\u4E91\u8F74\u4E0D\u53EF\u77E5 \u2192 \u6309\u8C31\u7CFB\u584C\uFF082026-08-19 user \u62CD\u677F\uFF09\n        if (f.dirty)\n            return f.everSynced ? \"unpushed\" : \"float\";\n        // everSynced=\u8C31\u7CFB\u5728\u6848 \u2192 \u663E synced\uFF08=\u300C\u5DF2\u7559\u79BB\u7EBF\u300D\u8BED\u4E49\uFF1B\u4E0E\u4E0B\u65B9 partial-absence \u4FDD\u5B88\u663E synced \u540C\u7CBE\u795E\uFF0C\n        // \u56DE\u7EBF\u540E\u82E5\u4E91\u7AEF\u52A8\u8FC7\u81EA\u7136\u7EA0\u504F\u6210 newer-on-cloud\uFF09\u3002\u539F\u300C\u4E00\u5F8B\u584C local-only\u300D\u628A\u5DF2\u9489\u6587\u4EF6\u53CD\u5411\u8C0E\u62A5\u6210\n        // \u300C\u4ECE\u6CA1\u4E0A\u8FC7\u4E91\u7684\u771F\u672C\u5730\u6587\u4EF6\u300D\u2014\u2014BR \u771F\u673A\u6218\u62A5\u6253\u56DE\uFF08\u66FE\u7ECF\u7684\u300C\u522B\u8C0E\u62A5 synced\u300D\u6CE8\u91CA\u88AB\u6B64\u6848 supersede\uFF09\u3002\n        return f.everSynced ? \"synced\" : \"local-only\";\n    }\n    // \u2500\u2500 cloudReachable \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    if (f.hasCloud) { // \u4E91\u7AEF\u786E\u5B9E\u6709\uFF08\u53EF\u4FE1\uFF0C\u65E0\u5173 complete\uFF09\n        const moved = f.cloudMoved || !f.everSynced; // \u6CA1 baseline(!everSynced \u5374\u649E\u4E0A\u4E91\u7AEF\u540C\u540D) \u4E5F\u5F53\u300C\u4E91\u7AEF\u6709\u522B\u7684\u7248\u672C\u300D\n        if (moved)\n            return f.dirty ? \"conflict\" : \"newer-on-cloud\";\n        return f.dirty ? \"unpushed\" : \"synced\";\n    }\n    // \u2500\u2500 \u4E91\u5217\u8868\u91CC\u6CA1\u6709 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    if (!f.everSynced)\n        return f.dirty ? \"float\" : \"local-only\"; // \u4ECE\u6CA1 synced = \u771F\u672C\u5730\u65B0\u6587\u4EF6\uFF0C\u4E91\u7AEF\u672C\u5C31\u6CA1\u6709\n    if (!f.absenceAuthoritative)\n        return f.dirty ? \"unpushed\" : \"synced\"; // partial\uFF1A\u6CA1\u770B\u5230\u2260\u6CA1\u4E86 \u2192 \u4FDD\u5B88\u663E\u793A\u300C\u4ECD\u5728\u300D\n    // \u771F cloud-gone\uFF1Adirty\u2192\uD83D\uDC7Bghost\uFF08\u7EDD\u4E0D\u5220\uFF09\uFF1Bclean \u5B64\u513F\u2192\u9632\u6296 grace \u5185\u663E pendingGone\u3001grace \u540E\u88AB reconcile trash \u6389\u5373\u4ECE\u5217\u8868\u6D88\u5931\uFF0C\u5426\u5219 local-only\u3002\n    if (f.dirty)\n        return \"ghost\";\n    return f.pendingGone ? \"pendingGone\" : \"local-only\";\n}\nexport const toMs = (v) => {\n    if (v == null)\n        return undefined;\n    if (typeof v === \"number\")\n        return v;\n    const t = Date.parse(v);\n    return Number.isFinite(t) ? t : undefined;\n};\nexport function createListing(cfg) {\n    const isHiddenAny = (n) => isHidden(n) || !!cfg.hidden?.(n);\n    const { cloud, local, head, pendingFolders, isPendingGone, pendingFolderDeletions } = cfg;\n    // 2.1.2\uFF1A\u79CD\u7C7B / \u7B49\u7EA7\uFF08kind \u6CA1\u6709\u5C31\u4E0D\u653E\u5B57\u6BB5\uFF0C\u514D\u5F97 undefined \u6C61\u67D3 deq\uFF09\n    const describe = (n) => { const d = cfg.describe?.(n); return d ? (d.kind !== undefined ? { kind: d.kind, tier: d.tier } : { tier: d.tier }) : { tier: \"work\" }; };\n    // \u4E00\u4E2A path \u7684\u539F\u59CB\u4E8B\u5B9E \u2192 Item\uFF08cloud/local \u4E24\u8F74 + head \u2192 classifier\uFF09\u3002listAllItems \u4E0E listFolder \u5171\u7528\u3002\n    function classifyPath(path, cf, hasLocal, cloudReachable, absenceAuthoritative, localStat) {\n        const hasCloud = cf != null;\n        const seen = head.seenBase(path);\n        const everSynced = seen != null;\n        const cloudMoved = hasCloud && cf.eTag !== seen;\n        const dirty = head.isDirtyAnywhere(path); // \u5FBD\u7AE0\u7B54\u7684\u662F\u300C\u8FD9\u53F0\u8BBE\u5907\u6709\u6CA1\u6709\u672A\u63A8\u5B57\u8282\u300D\uFF08\u5168\u5C40\uFF09\uFF0C\u4E0D\u662F\u672C tab \u8C31\u7CFB\n        const syncState = classifySyncState({\n            hasLocal, hasCloud, everSynced, cloudMoved,\n            dirty,\n            cloudReachable, absenceAuthoritative,\n            pendingGone: isPendingGone?.(path),\n        });\n        // size\uFF1A\u4E91\u7AEF\u6709\u5C31\u7528\u4E91\u7AEF\uFF08authoritative\uFF09\uFF0C\u5426\u5219\u7528\u672C\u5730\u7F13\u5B58\u8BB0\u5F55 \u2192 \u79BB\u7EBF / \u4E91\u7AEF\u5E27\u5230\u8FBE\u524D\u4E5F\u4E0D\u663E 0B/1970\u3002\n        // \u65F6\u95F4\uFF080.11.2\uFF0Cuser 2026-08-31 \u62CD\u677F\u65B9\u6848\u2462\uFF09\uFF1A**\u672C\u5730\u9886\u5148\uFF08dirty=\u6709\u672A\u63A8\u5B57\u8282\uFF09\u624D\u663E\u672C\u5730\u65F6\u95F4\uFF0C\u5426\u5219\u663E\u4E91\u7AEF\u65F6\u95F4**\u3002\n        //   \u4EE5\u524D\u4E00\u5F8B\u4E91\u7AEF\u4F18\u5148\uFF1A\u63A8\u4E91\u5931\u8D25\u540E\u672C\u5730\u4E00\u76F4\u5728\u5B58\u3001\u4E91\u7AEF\u505C\u5728\u4E0A\u6B21\u6210\u529F\u63A8 \u2192 tile \u65F6\u95F4\u300C\u5012\u9000\u4E09\u5C0F\u65F6\u300D\u50CF\u6CA1\u4FDD\u5B58\uFF08\u6848\u53D1 2026-08-31\uFF09\u3002\n        //   \u4E0D\u7528 max(cloud, local)\uFF1Alocal.updatedAt \u5728 pull/\u81EA\u52A8\u7F13\u5B58\u65F6\u4E5F\u5237\u65B0\uFF0C\u53EA\u6253\u5F00\u770B\u8FC7\u7684\u753B\u4F1A\u663E\u300C\u521A\u521A\u300D\u2014\u2014\u66F4\u9A97\u4EBA\u3002\n        //   \u5224\u636E\u4E0E badge \u540C\u6E90\uFF08dirty\uFF09\uFF1Abadge \u8BF4\u300C\u672A\u63A8\u300D\u65F6\u95F4\u5C31\u662F\u4F60\u672C\u5730\u6700\u540E\u4E00\u5B58\uFF1Bbadge \u8BF4\u300C\u5DF2\u540C\u6B65\u300D\u65F6\u95F4\u5C31\u662F\u4E91\u7AEF\u90A3\u4EFD\uFF1B\n        //   \u8DE8\u8BBE\u5907 B \u673A\u4E0D dirty \u2192 \u4E91\u7AEF\u65F6\u95F4\u6B63\u786E\u3002\u4EC5\u5F71\u54CD\u663E\u793A\uFF0C\u4E0D\u8FDB\u4EFB\u4F55\u540C\u6B65/\u51B2\u7A81\u5224\u65AD\uFF08no-timestamps \u7EA2\u7EBF\u4E0D\u52A8\uFF09\u3002\n        const lastModified = dirty ? (localStat?.updatedAt ?? cf?.lastModified) : (cf?.lastModified ?? localStat?.updatedAt);\n        return { identifier: path, ...describe(path), syncState, size: cf?.size ?? localStat?.size, lastModified };\n    }\n    // \u672C\u5730\u9879\u7684\u8F7B\u91CF\u5143\u4FE1\u606F\uFF08size+updatedAt\uFF09\uFF0C\u6279\u91CF\u53D6 \u2192 classifyPath \u7ED9\u672C\u5730\u9879\u586B\u5C3A\u5BF8/\u65F6\u95F4\u3002stat \u7F3A\uFF08\u8001 mock\uFF09\u2192 \u8DF3\u8FC7\u3002\n    async function statLocal(keys) {\n        const m = new Map();\n        if (!local.stat)\n            return m;\n        await Promise.all([...keys].map(async (k) => { const s = await local.stat(k); if (s)\n            m.set(k, s); }));\n        return m;\n    }\n    // \u5355\u5939\u5217\u4E3E\uFF08**\u975E\u9012\u5F52**\uFF09\u2014\u2014watchFolder \u7684\u6BCF\u6B21\u5FEB\u7167\u3002**per-folder \u6743\u5A01**\uFF1A\u53EA\u5217\u8BE5\u5939\u76F4\u5C5E\u5B50\u9879\u3001\u53EA\u5224\u8BE5\u5939\u5185 path\u3002\n    //   guardrail\uFF08\u7EA2\u7EBF\uFF09\uFF1A\u7EDD\u4E0D\u636E\u672C\u5939\u7684 listing \u5224**\u522B\u5939**\u6587\u4EF6 cloud-gone\u2014\u2014\u56E0\u4E3A\u538B\u6839\u4E0D\u770B\u522B\u5939\u7684 local key\uFF08\u4E0B\u9762 startsWith(prefix) \u95E8\uFF09\u3002\n    //   absenceAuthoritative = \u8FD9\u4E00\u5939 list() \u6CA1\u629B\u9519\uFF08cloudRes.complete\uFF09\uFF1B\u79BB\u7EBF/\u767B\u51FA \u2192 cloudReachable=false \u2192 \u584C\u5230\u672C\u5730\u89C6\u89D2\u3002\n    //   opts\uFF08A3\uFF09\uFF1AcloudPrefetched=\u590D\u7528\u8C03\u7528\u65B9\u5DF2\u62C9\u7684\u73B0\u573A\u4E91\u5E27\uFF08\u4FEE\u300C\u4E00\u6B21\u8BA2\u9605\u6253\u4E24\u904D Graph\u300D\uFF09\uFF1B\n    //   staleCloud=dir-index-cache \u7684\u4E0A\u6B21\u4E91\u5E27\u2014\u2014**\u53EA\u8FFD\u52A0 cloud-only \u7F3A\u9879 + \u5B50\u5939**\uFF0C\u4E0D\u78B0\u65E2\u6709\u9879\u7684\u5206\u7C7B\u3002\n    async function listFolder(folder, ctx, opts) {\n        const cloudRes = opts?.cloudPrefetched !== undefined\n            ? opts.cloudPrefetched\n            : (ctx.online && ctx.signedIn) ? await cloud.listFolder(folder).catch((e) => { reportStoreError(e, \"log\"); return null; }) : null;\n        const cloudReachable = cloudRes != null;\n        const absenceAuthoritative = cloudReachable && cloudRes.complete === true;\n        const prefix = folder ? `${folder}/` : \"\";\n        const cloudMap = new Map();\n        // \u8EAB\u4EFD = **\u5168\u540D\uFF08c.name = toName(\u4E91\u7AEF\u6587\u4EF6\u540D)\uFF09**\uFF1A\u660E\u6587 X.dat \u6052\u7B49\u3001\u52A0\u5BC6 X.dat.zip \u53BB\u5C3E .zip \u2192 \u90FD\u5F52\u4E00\u5230 X.dat\u3002\n        //   \u672C\u5730 key\uFF08appKeys / \u8FC1\u79FB\u540E\uFF09\u4E5F\u662F\u5168\u540D X.dat \u2192 \u4E24\u8F74\u6309\u540C\u4E00 key \u5F52\u4E00\uFF1B\u5426\u5219 cloud \u4E0E local \u5206\u88C2\u6210\u4E24\u9879\u3001open \u5BF9\u4E0D\u4E0A\n        //   \uFF08=0B/\u6253\u5F00\u7A7A\u767D\u7684\u6839\u56E0\uFF0Cv390\uFF09\u3002app \u5728\u8FB9\u754C\u7528 sessionFileName \u628A\u88F8 session \u540D\u8F6C\u5168\u540D\uFF1BencFileName \u8D1F\u8D23\u52A0\u5BC6\u4EF6\u7684 .zip \u8FFD\u52A0\u3002\n        for (const c of cloudRes?.files ?? []) {\n            if (isHiddenAny(c.name))\n                continue;\n            cloudMap.set(c.name, { eTag: c.eTag, size: c.size, lastModified: toMs(c.lastModifiedDateTime) });\n        }\n        // \u672C\u5730\uFF1A\u53EA\u770B\u672C\u5939\u524D\u7F00\u4E0B\u7684 key\uFF1B\u76F4\u5C5E\u6587\u4EF6 \u2192 \u53C2\u4E0E\u5217\u4E3E\uFF0C\u66F4\u6DF1\u7684 \u2192 \u8BB0 immediate \u5B50\u5939\u3002\u9690\u85CF\u9879\uFF08\u672B\u6BB5 dot\uFF09\u5168\u8DF3\u3002\n        const localDirect = new Set();\n        const subfolders = new Set();\n        for (const k of await local.appKeys()) {\n            if (folder && !k.startsWith(prefix))\n                continue;\n            const rest = k.slice(prefix.length);\n            if (!rest)\n                continue;\n            const slash = rest.indexOf(\"/\");\n            if (slash >= 0) {\n                const sub = prefix + rest.slice(0, slash);\n                if (!isHiddenAny(sub))\n                    subfolders.add(sub);\n            }\n            else if (!isHiddenAny(k))\n                localDirect.add(k);\n        }\n        for (const f of cloudRes?.folders ?? []) {\n            if (!isHiddenAny(f))\n                subfolders.add(f);\n        } // \u4E91\u7AEF immediate \u5B50\u5939\uFF08\u542B\u7A7A\u5939\uFF09\n        for (const p of pendingFolders?.() ?? []) { // \u79BB\u7EBF\u5EFA\u7684\u7A7A\u5939\uFF1A\u53D6\u672C\u5939\u4E0B\u7684 immediate \u6BB5\n            if (folder && !p.startsWith(prefix))\n                continue;\n            const rest = folder ? p.slice(prefix.length) : p;\n            const seg = rest.includes(\"/\") ? rest.slice(0, rest.indexOf(\"/\")) : rest;\n            if (seg && !isHiddenAny(seg))\n                subfolders.add(prefix + seg);\n        }\n        const paths = new Set([...cloudMap.keys(), ...localDirect]);\n        const localStats = await statLocal(localDirect);\n        const items = [];\n        for (const path of paths)\n            items.push(classifyPath(path, cloudMap.get(path), localDirect.has(path), cloudReachable, absenceAuthoritative, localStats.get(path)));\n        // \u2500\u2500 stale \u5FEB\u7167\u8FFD\u52A0\uFF08A3\uFF0C\u672C\u5730\u5E27\u4E13\u7528\uFF09\uFF1A\u53EA\u8865\u300C\u4E24\u8F74\u90FD\u6CA1\u89C1\u8FC7\u300D\u7684 cloud-only \u7F3A\u9879 + \u5B50\u5939\u3002\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n        //   \u65E2\u6709\u9879\uFF08\u672C\u5730\u6709/\u73B0\u573A\u4E91\u5E27\u6709\uFF09**\u7EDD\u4E0D\u88AB stale \u6570\u636E\u6539\u5199\u5206\u7C7B**\u2014\u2014\u4FDD\u5B58\u540E\u5FEB\u7167\u91CC\u7684\u65E7 eTag \u82E5\u53C2\u4E0E\u5206\u7C7B\uFF0C\n        //   \u4F1A\u95EA\u5047 newer-on-cloud badge\u3002\u8FFD\u52A0\u9879 badge \u6052 cloud-only\uFF08\u4E0A\u6B21\u6240\u89C1\u5982\u6B64\uFF1B\u8FC7\u65F6\u7531\u4E91\u7AEF\u5E27\u7EA0\u504F\uFF09\u3002\n        //   \u76F4\u5C5E scope \u5B88\u536B\u4E0E localDirect \u540C\u7EAA\u5F8B\uFF08\u5FEB\u7167\u635F\u574F/\u4E32\u5939\u4E5F\u8FDB\u4E0D\u6765\u522B\u5939\u7684\u9879\uFF09\u3002\n        const stale = opts?.staleCloud != null;\n        if (opts?.staleCloud) {\n            for (const f of opts.staleCloud.files) {\n                if (paths.has(f.name) || isHiddenAny(f.name))\n                    continue;\n                const rest = folder ? (f.name.startsWith(prefix) ? f.name.slice(prefix.length) : \"\") : f.name;\n                if (!rest || rest.includes(\"/\"))\n                    continue; // \u8D8A\u754C/\u975E\u76F4\u5C5E \u2192 \u4E22\n                items.push({ identifier: f.name, ...describe(f.name), syncState: \"cloud-only\", size: f.size, lastModified: f.lastModified });\n            }\n            for (const sf of opts.staleCloud.folders)\n                if (!isHiddenAny(sf))\n                    subfolders.add(sf);\n        }\n        // **post-union \u51CF\u53BB**\u79BB\u7EBF\u6392\u961F\u5F85\u5220\u7684\u7A7A\u5939\uFF08\u5426\u5219 remote frame / stale \u5FEB\u7167\u6BCF\u6B21\u628A\u5B83\u4ECE folders \u95EA\u56DE\uFF09\u3002\n        for (const d of pendingFolderDeletions?.() ?? [])\n            subfolders.delete(d);\n        const snap = { folder, items, folders: [...subfolders], complete: absenceAuthoritative };\n        if (stale)\n            snap.stale = true;\n        return snap;\n    }\n    async function listAllItems(ctx) {\n        // \u4E91\u90A3\u534A\uFF1A\u4EC5\u5728\u7EBF \u2227 \u767B\u5F55\u624D\u53D6\uFF1B\u629B\u9519 \u2192 null\uFF08\u4F18\u96C5\u964D\u7EA7\uFF0C\u7EDD\u4E0D throw\u3001\u7EDD\u4E0D\u636E\u6B64\u6E05\u672C\u5730\uFF09\u3002\n        const cloudRes = (ctx.online && ctx.signedIn) ? await cloud.listAll().catch((e) => { reportStoreError(e, \"log\"); return null; }) : null;\n        const cloudReachable = cloudRes != null;\n        const absenceAuthoritative = cloudReachable && cloudRes.complete === true;\n        const cloudMap = new Map();\n        for (const c of cloudRes?.files ?? []) {\n            if (isHiddenAny(c.name))\n                continue;\n            cloudMap.set(c.name, { eTag: c.eTag, size: c.size, lastModified: toMs(c.lastModifiedDateTime) }); // \u8EAB\u4EFD=session name\uFF08\u88F8\uFF09\uFF0C\u89C1 listFolder \u540C\u5904\u6CE8\u91CA\n        }\n        const localSet = new Set((await local.appKeys()).filter((k) => !isHiddenAny(k)));\n        const paths = new Set();\n        for (const p of cloudMap.keys())\n            paths.add(p);\n        for (const p of localSet)\n            paths.add(p);\n        const localStats = await statLocal(localSet);\n        const items = [];\n        for (const path of paths)\n            items.push(classifyPath(path, cloudMap.get(path), localSet.has(path), cloudReachable, absenceAuthoritative, localStats.get(path)));\n        // folders = \u4E91 folders(\u53EF\u8FBE\u65F6) \u222A \u672C\u5730 pending \u7A7A\u5939\uFF08\u79BB\u7EBF\u5EFA\u7684\uFF09\u3002\u53BB\u91CD + \u9690\u85CF\u9879\uFF08\u672B\u6BB5 dot\uFF09\u8DF3\u8FC7\u3002\n        const folderSet = new Set();\n        for (const f of cloudRes?.folders ?? [])\n            if (!isHiddenAny(f))\n                folderSet.add(f);\n        for (const p of pendingFolders?.() ?? [])\n            if (!isHiddenAny(p))\n                folderSet.add(p);\n        for (const d of pendingFolderDeletions?.() ?? [])\n            folderSet.delete(d); // post-union \u51CF\u53BB\u5F85\u5220\u7A7A\u5939\n        return { items, folders: [...folderSet], complete: cloudReachable ? cloudRes.complete : false };\n    }\n    return { listAllItems, listFolder };\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md + CONTEXT.md + ai-docs/adr/0018\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore\u3002\n//\n// upload-queue\uFF08\u6DF1\u6A21\u5757\uFF0CADR-0018\uFF09\u2014\u2014 \u79BB\u7EBF\u300C\u65B0\u4E0A\u4F20\u300D\u56DE\u7EBF\u8865\u63A8\u3002\u5BF9\u79F0 delete.ts \u7684 drainDeleteQueue\uFF0C\n//   \u8865\u4E0A state-machine \u00A74 \u4E00\u76F4\u53EA\u5728 spec \u7684\u300Cconsented pushes\u300D\u90A3\u534A\u8FB9\uFF08\u4ECE\u6CA1\u5B9E\u73B0\uFF09\u3002\n//\n// **\u53EA\u5904\u7406 never-synced\uFF08float\uFF09\u4E0A\u4F20**\uFF1A\u65E0\u4E91\u7AEF\u7248\u672C \u2192 \u4E0D\u53EF\u80FD\u5206\u53C9 \u2192 \u53EA CloudNameCollision \u4F1A surface\uFF08\u4E24\u4EFD\u90FD\u7559\uFF09\u3002\n//   \u5BF9**\u5DF2\u540C\u6B65\u6587\u4EF6\u7684\u7F16\u8F91**\u4E0D\u5728\u6B64\u2014\u2014\u90A3\u662F consent-surface\uFF08ADR-0016/0017\uFF1A\u4E0D\u900F\u660E Work \u7684 412 \u6CA1\u6CD5\u81EA\u52A8\u5408\u5E76 \u2192 \u4E22\u66F4\u65B0\uFF09\u3002\n// **\u975E busy \u540E\u53F0 drain**\uFF08\u4E0D\u9501\u5C4F\uFF0C\u7528\u6237\u7EE7\u7EED\u8BFB\uFF09\uFF1A\u4EE3\u4EF7\u662F\u4E0E\u7528\u6237\u64CD\u4F5C race \u2192 \u9760 \u2460 per-name serialize \u2461 \u9501\u5185 supersede \u590D\u68C0\u3002\n// **\u4E2D\u9014\u5173 app / \u5927\u6587\u4EF6\u6162\u7F51**\uFF1A\u9760\u6301\u4E45\u961F\u5217\uFF08\u6CA1\u786E\u8BA4\u6210\u529F\u7EDD\u4E0D\u51FA\u961F\uFF09+ push \u7684 W1 \u5E42\u7B49\uFF08\u771F\u4E0A\u53BB\u4E86\u4F46\u4E22\u54CD\u5E94 \u2192 \u4E0B\u6B21\u91CD\u8BD5 adopt \u4E0D\u91CD\u590D\uFF09\u3002\n// **per-app policy**\uFF08ctor\uFF09\uFF1Aauto=\u9759\u9ED8\u8865\u63A8 \u00B7 ask=\u6BCF\u6B21 reconnect/\u6210\u529F\u8FDE\u63A5\u95EE\u4E00\u6B21\u6574\u6279 \u00B7 manual=\u4E0D\u505A\uFF08\u7B49\u663E\u5F0F\u518D\u5B58\uFF09\u3002\nimport { reportStoreError } from \"../base/error-handling.js\"; // \u5168\u63A5\u4F46\u5206\u7EA7\uFF1A\u9759\u9ED8 swallow \u4E5F funnel\uFF08\u4E0D\u6539\u63A7\u5236\u6D41\uFF09\n// \u76F8\u5BF9\u952E\uFF08namespacedKv \u8865 `${appId}.${databaseId}.` \u6839\u524D\u7F00 \u2192 `${ns}.internal.pending_uploads`\uFF09\u3002\nconst UPQ_KEY = \"internal.pending_uploads\";\nexport function createUploadReplay(cfg) {\n    const { kv, local, head, isOnline, serialize, pushLocal, policy, confirm, onStatus } = cfg;\n    function readQueue() {\n        try {\n            const v = JSON.parse(kv.get(UPQ_KEY) ?? \"[]\");\n            return Array.isArray(v) ? v : [];\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            return [];\n        }\n    }\n    function writeQueue(q) { if (q.length)\n        kv.set(UPQ_KEY, JSON.stringify([...new Set(q)]));\n    else\n        kv.remove(UPQ_KEY); }\n    function enqueue(name) { if (policy === \"manual\")\n        return; writeQueue([...readQueue(), name]); }\n    function remove(name) { const q = readQueue(); if (q.includes(name))\n        writeQueue(q.filter((n) => n !== name)); }\n    async function drain() {\n        if (policy === \"manual\")\n            return { status: \"manual\", pushed: 0 };\n        const q = readQueue();\n        if (!q.length)\n            return { status: \"empty\", pushed: 0 };\n        if (!isOnline())\n            return { status: \"offline\", pushed: 0 };\n        if (policy === \"ask\") {\n            const ok = confirm ? await confirm(q.length) : false; // \u56DE\u7EBF/\u6210\u529F\u8FDE\u63A5\u95EE\u4E00\u6B21\u6574\u6279\n            if (!ok)\n                return { status: \"declined\", pushed: 0 };\n        }\n        onStatus?.({ phase: \"start\", done: 0, total: q.length });\n        const remain = [];\n        let pushed = 0;\n        for (const name of q) {\n            // per-name serialize\uFF1A\u4E0E\u7528\u6237 save/delete/rename \u540C\u540D\u4E92\u65A5\uFF0C\u7EDD\u4E0D\u91CD\u53E0\uFF08\u975E busy \u540E\u53F0\u7684 race \u9632\u7EBF\uFF09\u3002\n            const r = await serialize(name, async () => {\n                if (!(await local.exists(name)))\n                    return \"gone\"; // \u88AB\u5220/superseded \u2192 \u51FA\u961F\n                if (!head.isDirtyAnywhere(name) || head.seenBase(name) != null)\n                    return \"synced\"; // anywhere\uFF1A\u300C\u8FD8\u6B20\u4E0D\u6B20\u63A8\u300D\u662F\u5168\u5C40\u8D26 // \u5DF2\u63A8/\u5DF2\u540C\u6B65 \u2192 \u51FA\u961F\n                // \u5FC5\u987B\u770B\u7ED3\u679C\uFF1Adeferred = \u4E91\u7AEF\u843D\u5730\u672A\u786E\u8BA4\uFF08push.ts \u7684 F0 \u5206\u652F\uFF09\uFF0C\u672C\u6A21\u5757\u5934\u90E8\u7ACB\u7684\u89C4\u77E9\u662F\n                //   \u300C\u6CA1\u786E\u8BA4\u6210\u529F\u7EDD\u4E0D\u51FA\u961F\u300D\u2192 \u5F53 keep \u7559\u961F\u91CD\u8BD5\uFF0C\u7EDD\u4E0D\u8BA1\u5165 pushed\uFF08\u5426\u5219\u53C8\u662F\u4E00\u6B21\u8C0E\u62A5 + \u81EA\u52A8\u91CD\u63A8\u6C38\u4E45\u4E22\u5931\uFF09\u3002\n                try {\n                    const r = await pushLocal(name);\n                    return r?.status === \"deferred\" ? \"keep\" : \"pushed\";\n                }\n                catch (e) {\n                    if (e?.name === \"CloudNameCollisionError\")\n                        return \"collision\"; // \u540C\u540D\u5F02\u6587\u4EF6\uFF1Asurface + \u51FA\u961F\uFF08\u91CD\u8BD5\u65E0\u7528\uFF0C\u7B49\u6539\u540D\uFF09\n                    reportStoreError(e, \"log\"); // \u79BB\u7EBF/transient \u2192 \u7559\u961F\u91CD\u8BD5\uFF0Cfunnel \u4F46\u4E0D\u6253\u6270\n                    return \"keep\";\n                }\n            });\n            if (r === \"pushed\") {\n                pushed++;\n                onStatus?.({ phase: \"pushed\", name, done: pushed, total: q.length });\n            }\n            else if (r === \"collision\")\n                onStatus?.({ phase: \"collision\", name, done: pushed, total: q.length });\n            else if (r === \"keep\")\n                remain.push(name);\n            // gone / synced \u2192 \u51FA\u961F\uFF08\u4E0D push\u3001\u4E0D\u7559\uFF09\n        }\n        writeQueue(remain);\n        onStatus?.({ phase: \"done\", done: pushed, total: q.length });\n        return { status: \"drained\", pushed, remain: remain.length };\n    }\n    return { enqueue, remove, drain, pending: readQueue };\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md + CONTEXT.md\u3002store \u5185\u90E8\u6DF1\u6A21\u5757\u2014\u2014app \u7ECF createStore\uFF08store.listTrash/listBackup \u8FD4\u805A\u5408\u7ED3\u679C\uFF09\u3002\n//\n// trash-merge\uFF08\u6DF1\u6A21\u5757\uFF0C\u7EAF\u51FD\u6570\uFF0C\u96F6 IO\uFF09\u2014\u2014 \u56DE\u6536\u7AD9/\u5907\u4EFD\u7BB1**\u672C\u5730\u2194\u4E91\u4E24\u7AEF\u805A\u5408**\u6210\u5355\u4E00\u89C6\u56FE\u3002\n//   \u79BB\u7EBF\u5220 \u2192 \u8FDB\u672C\u5730 trash\uFF1B\u5728\u7EBF\u5220 synced \u2192 \u8FDB\u4E91\u7AEF trash\uFF1B\u5728\u7EBF\u5220 dirty \u2192 \u4E24\u7AEF\u90FD\u8FDB\uFF08\u4E16\u754C\u552F\u4E00\u5B57\u8282\u7559\u672C\u5730\u53EF\u6062\u590D\uFF09\u3002\n//   \u6545\u540C\u4E00\u903B\u8F91\u5220\u9664\u53EF\u80FD\u5728**\u4E00\u7AEF\u6216\u4E24\u7AEF**\u7559\u75D5\u3002\u672C\u6A21\u5757\u6309**\u539F\u540D**\u5F52\u5E76\u4E24\u7AEF\uFF0C\u6807 side:\"local\"|\"cloud\"|\"both\"\u3002\n//\n// **\u53EA\u5904\u7406\u5143\u6570\u636E**\uFF08trashKey / cloudRef / \u539F\u540D / \u65F6\u95F4\u6233 / \u52A0\u5BC6\u6807\u5FD7\uFF09\uFF0C**\u7EDD\u4E0D\u78B0 blob**\uFF08\u56DE\u6536\u7AD9 invariant\uFF1A\u62FF\u4E0D\u5230\u5B57\u8282\uFF09\u3002\n//\n// conflictLive\uFF08\u9644\u5F55\u90A3\u6761\uFF09\uFF1A\u79BB\u7EBF\u5220\u6392\u961F \u2192 \u56DE\u7EBF replay \u65F6\u4E91\u7AEF\u5DF2\u88AB\u522B\u5904\u6539\u8FC7 \u2192 edit-wins \u53D6\u6D88\u4E91\u5220 \u2192 \u672C\u5730 trash \u6709\u3001\n//   \u4E91\u7AEF**\u8FD8\u6D3B\u7740**\uFF08\u6570\u636E\u4E24\u5B58\uFF09\u3002\u636E\u4F20\u5165\u7684**\u6743\u5A01** live \u5217\u8868\u68C0\u51FA\uFF0C\u6807 conflictLive:true \u4F9B UI surface\uFF08\u522B\u4E22\uFF09\u3002\nimport { defaultCloudToName } from \"./cloud-sync.js\";\n// stamped \u540D = `<base> [<deleteEventId>]`\uFF08\u660E\u6587\uFF09\u6216\u540C\u540D\u5C3E\u63A5 `.zip`\uFF08\u52A0\u5BC6\u5BB9\u5668\uFF0CencFileName \u8FFD\u52A0\uFF09\u3002\n//   deleteEventId = `<yyyymmddhhmmss>-<guid>`\uFF0C\u89C1 move-aside.asideStamp / cloud-sync.stampedName\u3002\nconst STAMP_RE = /^(.*) \\[((\\d{14})-[0-9a-fA-F-]+)\\](\\.zip)?$/;\nconst baseNameOf = (n) => (n.includes(\"/\") ? n.slice(n.lastIndexOf(\"/\") + 1) : n);\n// \u4E91\u7AEF trash \u6587\u4EF6\u540D \u2192 { \u539F basename, deleteEventId, \u65F6\u95F4\u6233, \u662F\u5426\u52A0\u5BC6 }\u3002\n//   \u6709\u6233\uFF1A\u6233\u662F\u5206\u9694\u7B26\uFF0C`(\\.zip)?` \u53EA\u53EF\u80FD\u662F encFileName \u8FFD\u52A0\u7684\u90A3\u4E00\u4E2A\uFF08\u539F\u540D\u81EA\u5E26\u7684 .zip \u5728\u6233\u4E4B\u524D\uFF0C\u4E0D\u4F1A\u88AB\u8BEF\u5403\uFF09\u3002\n//   \u65E0\u6233\uFF08\u5F02\u5E38/\u624B\u5DE5\u653E\u5165\uFF09\u2192 \u8D70 toName\uFF08\u5168\u5E93\u552F\u4E00\u7684\u52A0\u5BC6\u540D\u5224\u5B9A seam\uFF09\uFF1A\u540D\u5B57\u53D8\u4E86 = \u52A0\u5BC6\u5BB9\u5668\u3002\nfunction parseCloudTrashName(cloudName, toName) {\n    const m = cloudName.match(STAMP_RE);\n    if (m)\n        return { base: m[1], id: m[2], ts: m[3], encrypted: !!m[4] };\n    const base = toName(cloudName);\n    return { base, id: null, ts: null, encrypted: base !== cloudName };\n}\n// \u672C\u5730 trashKey \u2192 deleteEventId\uFF08`trash/<yyyymmddhhmmss-guid>:<name>`\uFF09\u3002\u65E0\u6233\uFF08\u5F02\u5E38/\u624B\u5DE5\u653E\u5165\uFF09\u2192 null\u3002\nfunction parseLocalStamp(trashKey) {\n    const slash = trashKey.indexOf(\"/\");\n    const inner = slash < 0 ? trashKey : trashKey.slice(slash + 1);\n    const m = inner.match(/^((\\d{14})-[0-9a-fA-F-]+):/);\n    return m ? { id: m[1], ts: m[2] } : { id: null, ts: null };\n}\nconst byTs = (a, b) => (a.ts || \"\").localeCompare(b.ts || \"\");\n/**\n * \u4E24\u7AEF\u805A\u5408\u3002\n * @param localEntries  local.listTrash()/listBackup() \u7ED3\u679C\uFF08name = \u5168\u8DEF\u5F84\u539F\u540D\uFF09\u3002\n * @param cloudEntries  cloud.listTrash()/listBackup() \u7ED3\u679C\uFF08name = stamped \u4E91\u7AEF\u6587\u4EF6\u540D\uFF09\u3002\n * @param liveCloudNames \u6743\u5A01 live \u4E91\u7AEF\u8EAB\u4EFD\u96C6\u5408\uFF08listAll.complete \u65F6\u624D\u4F20\u771F\u503C\uFF1B\u79BB\u7EBF/partial \u4F20\u7A7A set \u2192 conflictLive \u6052 false\uFF0C\u7EDD\u4E0D\u8BEF\u62A5\uFF09\u3002\n * @param toName \u4E91\u7AEF\u6587\u4EF6\u540D \u2192 \u8EAB\u4EFD\uFF08\u4E0E cloud-sync \u540C\u4E00\u4E2A\u51FD\u6570\uFF1B\u65E0\u6233\u515C\u5E95\u7684\u52A0\u5BC6\u5224\u5B9A\u9760\u5B83\uFF09\u3002\u9ED8\u8BA4 defaultCloudToName\u3002\n */\nexport function mergeTrash(localEntries, cloudEntries, liveCloudNames = new Set(), toName = defaultCloudToName) {\n    const localByBase = new Map();\n    for (const e of localEntries) {\n        const base = baseNameOf(e.name);\n        const bucket = localByBase.get(base) ?? [];\n        const st = parseLocalStamp(e.trashKey);\n        bucket.push({ entry: e, id: st.id, ts: st.ts });\n        localByBase.set(base, bucket);\n    }\n    const cloudByBase = new Map();\n    for (const it of cloudEntries) {\n        const p = parseCloudTrashName(it.name, toName);\n        const bucket = cloudByBase.get(p.base) ?? [];\n        bucket.push({ item: it, id: p.id, ts: p.ts, encrypted: p.encrypted });\n        cloudByBase.set(p.base, bucket);\n    }\n    const out = [];\n    const bases = new Set([...localByBase.keys(), ...cloudByBase.keys()]);\n    for (const base of bases) {\n        const locals = (localByBase.get(base) ?? []).slice().sort(byTs);\n        const clouds = (cloudByBase.get(base) ?? []).slice().sort(byTs);\n        // \u2500\u2500 \u6309 deleteEventId **\u7CBE\u786E**\u914D\u5BF9 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n        //   \u4E00\u6B21\u5220\u9664 = \u4E00\u4E2A id\uFF0C\u4E24\u6761\u817F\u5171\u7528\uFF08delete.ts \u751F\u6210\u5E76\u4F20\u7ED9\u4E24\u7AEF\uFF09\u3002id \u76F8\u540C \u27FA \u540C\u4E00\u6B21\u5220\u9664\u3002\n        //   \u26A0 \u4EE5\u524D\u662F\u300C\u6309\u65F6\u95F4\u6233\u6392\u5E8F\u540E\u6309\u4E0B\u6807\u914D\u5BF9\u300D\uFF0C\u90A3\u5728**\u5355\u817F\u5220\u9664\u4EA4\u53C9**\u65F6\u4F1A\u51FA\u4EBA\u547D\uFF1A\n        //     \u79BB\u7EBF\u5220 A\uFF08\u53EA\u843D\u672C\u5730\u817F\uFF09\u2192 \u4E4B\u540E\u5728\u7EBF\u5220\u91CD\u5EFA\u7684 A\uFF08\u53EA\u843D\u4E91\u817F\uFF09\u2192 \u4E0B\u6807\u914D\u5BF9\u628A\u8FD9\u4E24\u6B21\u65E0\u5173\u7684\u5220\u9664\n        //     \u914D\u6210\u4E00\u884C both \u2192 \u7528\u6237\u70B9\u300C\u5F7B\u5E95\u5220\u9664\u300D\u65F6 purge \u540C\u65F6\u9001 trashKey + cloudRef\uFF0C\n        //     \u4E00\u6B21\u5220\u6389\u4E24\u4E2A\u4E0D\u76F8\u5E72\u7684\u6587\u4EF6\uFF0CUI \u8FD8\u53EA\u8BF4\u5220\u4E86\u4E00\u4EF6\u3002restore \u540C\u7406\u4F1A\u5F20\u51A0\u674E\u6234\u3002\n        //   \u914D\u4E0D\u4E0A = \u5C31\u662F\u4E24\u6B21\u72EC\u7ACB\u7684\u5220\u9664\uFF0C\u5404\u51FA\u5404\u7684\u884C\u3002**\u4E0D\u505A\u4E0B\u6807\u515C\u5E95**\uFF08\u90A3\u7B49\u4E8E\u628A bug \u7559\u4E00\u6761\u540E\u95E8\uFF09\u3002\n        const usedCloud = new Set();\n        const byId = new Map();\n        clouds.forEach((c, i) => { if (c.id)\n            byId.set(c.id, i); });\n        const lonelyLocals = [];\n        for (const l of locals) {\n            const ci = l.id != null ? byId.get(l.id) : undefined;\n            if (ci == null || usedCloud.has(ci)) {\n                lonelyLocals.push(l);\n                continue;\n            }\n            usedCloud.add(ci);\n            const c = clouds[ci];\n            out.push({ identifier: l.entry.name, ts: l.ts ?? c.ts, side: \"both\", encrypted: c.encrypted, conflictLive: false, localKey: l.entry.trashKey, cloudRef: c.item.ref });\n        }\n        for (const l of lonelyLocals) {\n            // \u7EAF\u672C\u5730\u884C\u624D\u53EF\u80FD conflictLive\uFF1A\u672C\u5730 trash \u6709\u3001\u539F\u540D\u5374\u4ECD\u6D3B\u5728\u6743\u5A01\u4E91\u7AEF = \u79BB\u7EBF\u5220\u88AB edit-wins \u64A4\u9500 \u2192 \u4E24\u5B58\u3002\n            out.push({ identifier: l.entry.name, ts: l.ts, side: \"local\", encrypted: false, conflictLive: liveCloudNames.has(l.entry.name), localKey: l.entry.trashKey, cloudRef: null });\n        }\n        clouds.forEach((c, i) => {\n            if (usedCloud.has(i))\n                return;\n            out.push({ identifier: base, ts: c.ts, side: \"cloud\", encrypted: c.encrypted, conflictLive: false, localKey: null, cloudRef: c.item.ref });\n        });\n    }\n    return out;\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md\u3002\u8FD9\u662F store \u5185\u90E8\u6A21\u5757,**\u4E0D\u8981\u4ECE app \u76F4\u63A5 import**\u2014\u2014app \u53EA\u8D70 createStore()\u3002\n//\n// \u901A\u7528 IndexedDB \u5B57\u8282\u5B58(store \u81EA\u5DF1\u7684\u672C\u5730\u6301\u4E45\u5C42)\u3002**\u5185\u5BB9\u65E0\u5173**:\u5B58\u4EFB\u610F binary blob,\u6309 name \u952E\u3002\n// \u53D6\u4EE3\u65E7 local-adapter \u53CD\u5411\u4F9D\u8D56\u7684\u524D\u8EAB\u5BBF\u4E3B storage.ts/session.ts \u2014\u2014 store \u4E0D\u61C2\u5185\u5BB9\u683C\u5F0F(\u4E00\u5F8B\u4E0D\u900F\u660E binary)\u3002\n// \u6D4F\u89C8\u5668\u4E13\u7528(IndexedDB),node \u6D4B\u4E0D\u5230 \u2192 \u8BED\u6CD5\u62A4\u680F test/idb-tx-guard.test.ts + \u771F\u6D4F\u89C8\u5668\u5939\u5177\n// tools/idb-tx-commit-check.mjs\uFF08\u6539\u672C\u6587\u4EF6\u5FC5\u8DD1\uFF0C\u89C1\u5939\u5177\u5934\u6CE8\u91CA\uFF09\u3002\n//\n// \u2605 \u4E8B\u52A1\u7EAA\u5F8B\uFF08v0.3.6 \u6536\u655B\uFF0C2026-08-26 by Claude Fable 5\uFF1Buser \u62CD\u677F 2026-08-25\uFF0C\n//   \u89C1 ai-docs/20260825-localfile-knight-store-round.md \u00A71.1\uFF09\uFF1A\n//   **\u5168\u5E93\u552F\u4E00\u4E8B\u52A1\u5165\u53E3 = \u4E0B\u9762\u7684 tx() helper**\uFF0Creadwrite/readonly \u540C\u4E00\u5F62\u72B6\uFF1A\n//   resolve \u53EA\u8BA4 `t.oncomplete`\uFF08\u843D\u76D8\u786E\u8BA4\uFF09\uFF0Creject \u63A5 `t.onerror` + `t.onabort`\u3002\n//   \u5B88\u7684 bug\uFF082026-08-21 \u5B9E\u9524\uFF0C\u8BE6 WeebPaint ai-docs/20260821-storage-eviction-investigation.md \u00A7B.2\uFF09\uFF1A\n//   \u914D\u989D\u649E\u5899\u65F6 IDB \u7684\u771F\u5B9E\u4E8B\u4EF6\u987A\u5E8F\u662F `req.success \u2192 tx.abort(QuotaExceededError)`\u2014\u2014\n//   \u82E5\u5728 req.onsuccess \u5C31 resolve\uFF08v0.3.0 \u53CA\u4E4B\u524D\uFF09\uFF0C\u4E00\u6B21**\u6839\u672C\u6CA1\u843D\u76D8**\u7684\u5199\u88AB\u62A5\u6210\u6210\u529F\uFF0C\n//   \u4E00\u8DEF\u5411\u4E0A\u8BA9 app \u6E05 dirty\u3001\u505C\u91CD\u8BD5 = \u9759\u9ED8\u4E22\u7528\u6237\u7F16\u8F91\uFF0C\u4E14\u96F6 unhandled rejection\u3002\n//   \u51A4\u53F2\uFF1A\u6B63\u786E\u4FEE\u6CD5 2026-08-21 \u5F53\u665A\u5DF2\u5199\u51FA\u5E76\u7ECF\u53D8\u5F02\u6D4B\u8BD5\u5224\u5B9A\u8BDA\u5B9E\uFF0C\u968F opus \u8F6E\u6574\u6279\u56DE\u6EDA\u966A\u846C\n//   \uFF08\u56DE\u6EDA\u662F\u95EE\u8D23\u4E8B\u6545\u975E\u6280\u672F\u5426\u51B3\uFF0C\u8BE6 WeebPaint ai-docs/20260821-rollback\uFF09\uFF1B\u672C\u7248\u6309\u62CD\u677F\u91CD\u5199\u590D\u6D3B\u3002\n//   \u9632\u56DE\u5F52\uFF1A\u8BED\u6CD5\u626B\u63CF\u6D4B\u8BD5\u9489\u300Cdb.transaction \u53EA\u8BB8\u5728 tx() \u5185\u300D\uFF1B\u522B\u518D\u65B0\u5F00\u7B2C\u4E8C\u79CD\u4E8B\u52A1\u5F62\u72B6\u3002\n//\n// \u2605 \u6302\u6B7B\u81EA\u6108\uFF080.11.5\uFF0C2026-09-06 by Claude Fable 5.1\uFF1Buser 2026-09-06 \u6279\u300C\u6BCF\u4E2A IDB \u8BF7\u6C42\u7ED9 deadline \u540C\u610F /\n//   \u8001\u8FDE\u63A5\u81EA\u5DF1\u5173 \u8BD5\u8BD5 / \u8D85\u65F6\u6254\u8FDE\u63A5\u91CD\u5F00\u91CD\u8BD5\u4E00\u6B21 \u540C\u610F\u300D\uFF09\u3002\u6848\u53D1\uFF1AiPad \u8FC7\u591C \u2192 \u56FE\u5E93\u9996\u5E27 99s \u4E0D\u6765\u3001files.usage \u8D85\u65F6\uFF0C\n//   \u91CD\u542F\u5373\u6108\uFF08WeebPaint ai-docs/20260906-gallery-idb-wedge-log-analysis.md\uFF09\u3002\u4E09\u4EF6\uFF1A\n//   \u2460 \u4E00\u6B21 open / \u4E00\u7B14\u4E8B\u52A1\u8D85\u8FC7 IDB_OP_TIMEOUT_MS \u2192 \u5224\u8FDE\u63A5\u6302\u6B7B\uFF1Aabort \u672C\u4E8B\u52A1\u3001\u4E22\u8FDE\u63A5 memo\u3001\u629B IdbTimeoutError\uFF1B\n//   \u2461 \u8D85\u65F6\u540E**\u91CD\u5F00\u8FDE\u63A5\u91CD\u8BD5\u4E00\u6B21**\uFF08\u628A\u300C\u7528\u6237\u624B\u52A8\u91CD\u542F\u81EA\u6108\u300D\u4EA4\u7ED9\u5E93\uFF09\uFF1B\u518D\u8D85\u65F6 \u2192 reportStoreError(warning) \u4E0A\u62A5 + \u629B\uFF1B\n//   \u2462 onversionchange\uFF08\u522B\u7684 tab \u5347\u5E93\u7248\u672C / \u5220\u5E93\uFF09\u2192 \u8001\u8FDE\u63A5\u81EA\u5DF1 close\uFF0C\u4E0B\u4E00 op \u91CD\u5F00\uFF1Bonblocked \u8BB0\u4E00\u7B14\u3002\n//   deadline \u53EA\u7BA1\u300C\u7B49\u591A\u4E45\u300D\uFF0C\u4E0D\u6539\u4EFB\u4F55\u5199\u5165\u8BED\u4E49\uFF1Aresolve \u4ECD\u53EA\u8BA4 oncomplete\uFF1B\u88AB abort \u7684\u5199 = \u6CA1\u843D\u76D8 = \u8BDA\u5B9E reject\u3002\n//\n// \u2605 \u9875\u9762\u79BB\u573A\u4E0D\u6301\u9501\uFF080.11.6\uFF0Cuser 2026-09-06 \u6279\u300C\u8001\u9875\u9762\u5728 pagehide \u65F6 abort \u5728\u98DE\u4E8B\u52A1\u300D\uFF09\u3002\u6848\u53D1\uFF1A\u91CD\u8FDE redirect \u4E24\u6B21\n//   \uFF08pagehide persisted=true = \u8001\u9875\u9762\u8FDB bfcache\uFF09\u540E\u65B0\u9875\u9762\u56FE\u5E93\u9996\u5E27 99s \u4E0D\u6765\uFF0Cuser \u5207\u8D70\u90A3\u4E00\u523B\u5E27\u624D\u5230\u2014\u2014\u51BB\u7ED3\u9875\u9762\u82E5\u63E1\u7740\u672A commit\n//   \u7684\u4E8B\u52A1\uFF0C\u540C origin \u65B0\u9875\u9762\u5BF9\u540C\u4E00 object store \u7684\u4E8B\u52A1\u6392\u5728\u5B83\u540E\u9762\u6C38\u8FDC\u7B49\u3002pagehide \u2192 abort \u6240\u6709\u5728\u98DE **readonly** \u4E8B\u52A1\n//   \uFF08\u8BFB\u88AB\u5F03 = reject IdbSuspendedError\uFF0C\u9875\u9762\u53CD\u6B63\u8981\u8D70\uFF09\uFF1Breadwrite **\u4E0D\u8170\u65A9**\uFF08\u62A2\u6551\u5199\u7167\u8DD1\uFF0C\u300Cresolve \u53EA\u8BA4 oncomplete\u300D\u7167\u65E7\u8BDA\u5B9E\uFF09\uFF1B\n//   \u968F\u540E\u82E5\u65E0 readwrite \u5728\u98DE \u2192 \u5173\u8FDE\u63A5\uFF08\u51BB\u7ED3\u9875\u9762\u8FDE\u8FDE\u63A5\u90FD\u4E0D\u7559\uFF09\u3002\u4E0B\u4E00 op\uFF08bfcache \u590D\u6D3B / \u65B0\u9875\u9762\uFF09\u81EA\u52A8\u91CD\u5F00\u3002\n//\n// \u2605 0.12.1 \u6539\u5224\uFF08user 2026-09-09\u300CIDB\u90FD\u505A\u300D#60-B\uFF1BWeebPaint ai-docs/20260909-bfcache-idb-lock-daily-reauth-analysis.md\uFF09\uFF1A\n//   0.11.6 \u7684\u300Creadwrite \u653E\u884C\u300D\u662F\u4E2A\u53E3\u5B50\u2014\u2014app \u5728 pagehide \u91CC\u65E0\u6761\u4EF6\u5199 settings\uFF0Csuspend() \u89C1 rw>0 \u5C31\u4E0D\u5173\u8FDE\u63A5\uFF0C\u9875\u9762\u5E26\u7740\u6D3B\u8DC3\u5199\u4E8B\u52A1\u88AB\u51BB\u8FDB\n//   bfcache\uFF08WebKit IDBDatabase \u65E0 suspend/\u65E0 bfcache \u963B\u65AD\uFF0C\u4E8B\u52A1\u539F\u5730\u51BB\u7ED3\uFF0C\u9501\u4E00\u76F4\u63E1\u7740\uFF09\uFF0C\u65B0\u9875\u9762\u5168\u6302\u3002\u800C\u51BB\u7ED3\u9875\u91CC\u7684\u5199**\u6C38\u8FDC commit \u4E0D\u4E86**\n//   \uFF08\u51BB\u7ED3\u524D\u6CA1\u6709\u4E8B\u4EF6\u5FAA\u73AF\u8F6E\u6B21\u8BA9 success \u4E8B\u4EF6\u6D3E\u4E0B\u6765\uFF09\uFF0C\u9A71\u9010\u65F6 stop() \u4E00\u5F8B abort\u2014\u2014\u653E\u884C\u6551\u4E0D\u4E86\u4EFB\u4F55\u4E00\u7B14\u5199\uFF0C\u53EA\u7559\u4E0B\u9501\u3002\u6240\u4EE5\uFF1A\n//   pagehide **persisted=true**\uFF08\u8981\u8FDB bfcache\uFF1BPageTransitionEvent \u6807\u51C6\u5B57\u6BB5\uFF0C\u975E\u67D0\u6D4F\u89C8\u5668\u602A\u7656\uFF09\u2192 abort \u5168\u90E8\u5728\u98DE\u4E8B\u52A1\uFF08\u8BFB\u5199\u90FD\u5F03\uFF09\u3001\u5173\u8FDE\u63A5\u3001\n//   \u95F8\u95E8\u843D\u4E0B\uFF1Apageshow \u4E4B\u524D\u65B0\u4E8B\u52A1\u76F4\u63A5 reject IdbSuspendedError\uFF08\u4E0D\u5F00\u8FDE\u63A5\u3001\u4E0D\u6392\u961F\uFF09\u3002persisted=false\uFF08\u9875\u9762\u9500\u6BC1\uFF09\u2192 \u4EC0\u4E48\u90FD\u4E0D\u505A\uFF1A\n//   \u5728\u98DE\u5199\u5C3D\u91CF\u8DD1\u5B8C\uFF08Chrome \u4F1A\u8BA9\u5B83\u5B8C\u6210\uFF1BWebKit stop() \u81EA\u4F1A abort\uFF09\uFF0C\u9875\u9762\u6B7B\u4E86\u9501\u81EA\u7136\u91CA\u653E\u3002IdbSuspendedError \u5728 reportStoreError \u6F0F\u6597\u91CC\n//   \u964D\u4E3A log \u7EA7\uFF08\u9875\u9762\u5728\u79BB\u573A\uFF0C\u4E0D\u662F\u6570\u636E\u9519\uFF09\u3002\nimport { reportStoreError } from \"./error-handling.js\"; // QuotaExceededError \u5FC5 funnel\uFF08\u62CD\u677F \u00A71.1\uFF09\nconst STORE = \"blobs\";\n/** IDB \u5355\u6B21 open / \u5355\u7B14\u4E8B\u52A1\u7684 deadline\uFF08ms\uFF09\u3002\u56FE\u5E93\u770B\u95E8\u72D7 8s\uFF1A3s + \u91CD\u8BD5\u4E00\u6B21 = 6s \u5185\u5E93\u5148\u7ED9\u51FA onError\u3002\u6D4B\u8BD5\u53EF\u8C03\u3002 */\nlet _idbOpTimeoutMs = 3000;\nexport function idbOpTimeoutMs() { return _idbOpTimeoutMs; }\nexport function setIdbOpTimeoutForTests(ms) { _idbOpTimeoutMs = ms; }\n/** \u8FDE\u63A5\u6302\u6B7B\uFF08open \u6216\u4E8B\u52A1\u5728 deadline \u5185\u6CA1\u54CD\u5E94\uFF09\u3002name = \"IdbTimeoutError\"\uFF0Capp \u4FA7\u6309 name \u8BC6\u522B\u5373\u53EF\u3002 */\nexport class IdbTimeoutError extends Error {\n    constructor(op, ms) { super(`idb ${op} did not respond within ${ms}ms (connection wedged?)`); this.name = \"IdbTimeoutError\"; }\n}\n/** \u9875\u9762\u79BB\u573A\uFF08pagehide persisted=true\uFF09\u65F6\u88AB\u4E3B\u52A8 abort \u7684\u4E8B\u52A1\uFF0C\u6216\u95F8\u95E8\u671F\u95F4\uFF08pageshow \u524D\uFF09\u88AB\u62D2\u7684\u65B0\u4E8B\u52A1\u3002name = \"IdbSuspendedError\"\u3002\u4E0D\u662F\u6570\u636E\u9519\u3002 */\nexport class IdbSuspendedError extends Error {\n    constructor(op) { super(`idb ${op} aborted on pagehide (page leaving; not an error of the data)`); this.name = \"IdbSuspendedError\"; }\n}\n/** \u5EFA\u4E00\u4E2A\u7ED1\u5B9A\u5230\u5177\u4F53 IDB \u5E93\u540D\u7684\u5B57\u8282\u7F13\u5B58(store \u5185\u90E8)\u3002dbName \u5FC5\u987B\u5DF2\u5E26 app \u547D\u540D\u7A7A\u95F4(\u89C1\u4E0A)\u3002 */\nexport function createIdbCache(dbName) {\n    // \u8FDE\u63A5 memo\uFF080.4.0\uFF0Cdispose \u9700\u8981\u53EF\u5173\u7684\u8FDE\u63A5\uFF1B\u987A\u5E26\u7701\u6389\u6BCF op \u4E00\u6B21 open \u7684\u5F80\u8FD4\uFF09\u3002\n    //   \u6D4F\u89C8\u5668\u5F3A\u5173\uFF08onclose\uFF1A\u7528\u6237\u6E05\u7AD9\u70B9\u6570\u636E/\u5B58\u50A8\u538B\u529B\uFF09\u2192 \u6E05 memo\uFF0C\u4E0B\u4E00 op \u81EA\u52A8\u91CD\u5F00\u3002\n    //   close() \u540E\u62D2\u540E\u7EED\uFF08dispose \u5951\u7EA6\u300C\u65AD IDB \u8FDE\u63A5\u3001\u62D2\u540E\u7EED\u8C03\u7528\u300D\u7684\u672C\u5C42\u6267\u884C\u4F53\uFF09\u3002\n    let _db = null;\n    let _closed = false;\n    let _opens = 0; // \u8BCA\u65AD/\u6D4B\u8BD5\uFF1Aopen \u6B21\u6570\uFF08\u91CD\u5F00\u53EF\u89C2\u6D4B\uFF09\n    const _active = new Set(); // \u5728\u98DE\u4E8B\u52A1\uFF08pagehide \u65F6\u5904\u7F6E\uFF09\n    let _suspended = false; // pagehide(persisted) \u4E4B\u540E\u3001pageshow \u4E4B\u524D\uFF1A\u672C\u9875\u5728/\u6B63\u8FDB bfcache\uFF0C\u4E0D\u8BB8\u518D\u78B0 IDB\n    /** \u9875\u9762\u79BB\u573A\u5904\u7F6E\uFF080.12.1\uFF09\u3002persisted=true\uFF1Aabort \u5168\u90E8\u5728\u98DE\u4E8B\u52A1\uFF08\u8BFB\u5199\u90FD\u5F03 \u2192 IdbSuspendedError\uFF09\u3001\u5173\u8FDE\u63A5\u3001\u95F8\u95E8\u843D\u4E0B\uFF1B\n     *  persisted=false\uFF1A\u4EC0\u4E48\u90FD\u4E0D\u505A\uFF08\u9875\u9762\u5728\u9500\u6BC1\uFF0C\u5728\u98DE\u5199\u5C3D\u91CF\u8DD1\u5B8C\uFF0C\u9501\u968F\u9875\u9762\u6B7B\uFF09\u3002\u5E42\u7B49\u3002 */\n    function suspend(persisted = true) {\n        if (!persisted)\n            return;\n        _suspended = true;\n        let n = 0;\n        for (const a of _active) {\n            a.suspended = true;\n            n++;\n            try {\n                a.t.abort();\n            }\n            catch { /* \u5DF2\u7ED3\u675F */ }\n        }\n        dropConnection(null);\n        if (_opens > 0)\n            reportStoreError(new Error(`[idb] pagehide persisted=true \u2192 aborted ${n} in-flight tx, connection closed, gated until pageshow (${dbName})`), \"log\");\n    }\n    /** bfcache \u590D\u6D3B\uFF08pageshow\uFF09\uFF1A\u62AC\u95F8\uFF0C\u4E0B\u4E00 op \u81EA\u52A8\u91CD\u5F00\u8FDE\u63A5\u3002 */\n    function resume() {\n        if (!_suspended)\n            return;\n        _suspended = false;\n        reportStoreError(new Error(`[idb] pageshow \u2192 gate lifted, next op reopens (${dbName})`), \"log\");\n    }\n    const _onPageHide = (e) => suspend(e.persisted === true);\n    const _onPageShow = () => resume();\n    const _win = typeof window !== \"undefined\" && typeof window.addEventListener === \"function\" ? window : null;\n    _win?.addEventListener(\"pagehide\", _onPageHide);\n    _win?.addEventListener(\"pageshow\", _onPageShow);\n    /** \u4E22\u8FDE\u63A5 memo\uFF08\u6302\u6B7B / \u7248\u672C\u53D8\u66F4 / \u5F3A\u5173\uFF09\uFF1A\u4E0B\u4E00 op \u81EA\u52A8\u91CD\u5F00\u3002\u53EA\u5728 memo \u8FD8\u662F\u5F53\u524D\u8FD9\u6761\u65F6\u624D\u6E05\uFF0C\u8FDF\u5230\u7684\u8001\u56DE\u8C03\u522B\u8BEF\u4F24\u65B0\u8FDE\u63A5\u3002 */\n    function dropConnection(which) {\n        if (which !== null && _db !== which)\n            return;\n        const p = _db;\n        _db = null;\n        void p?.then((db) => { try {\n            db.close();\n        }\n        catch { /* \u5DF2\u5173 */ } }).catch(() => { });\n    }\n    function openDb() {\n        if (_closed)\n            return Promise.reject(new Error(`idb cache closed (disposed): ${dbName}`));\n        if (_db)\n            return _db;\n        _opens++;\n        const ms = _idbOpTimeoutMs;\n        const p = new Promise((resolve, reject) => {\n            const r = indexedDB.open(dbName, 1);\n            // \u2460 open \u4E5F\u6709 deadline\uFF1A\u88AB\u522B\u7684\u8FDE\u63A5 blocked / \u540E\u7AEF\u6302\u6B7B \u2192 \u4E0D\u8BB8\u65E0\u9650\u7B49\n            const timer = setTimeout(() => { dropConnection(p); reject(new IdbTimeoutError(\"open\", ms)); }, ms);\n            r.onupgradeneeded = () => { r.result.createObjectStore(STORE); };\n            r.onblocked = () => { reportStoreError(new Error(`[idb] open blocked by another connection (versionchange pending): ${dbName}`), \"log\"); };\n            r.onsuccess = () => {\n                clearTimeout(timer);\n                const db = r.result;\n                db.onclose = () => { dropConnection(p); }; // \u6D4F\u89C8\u5668\u5F3A\u5173 \u2192 \u4E0B\u4E00 op \u91CD\u5F00\n                db.onversionchange = () => { db.close(); dropConnection(p); }; // \u2462 \u522B\u7684 tab \u5347\u7248\u672C/\u5220\u5E93 \u2192 \u8001\u8FDE\u63A5\u81EA\u5DF1\u5173\uFF0C\u522B\u5F53\u50F5\u5C38 block \u5BF9\u65B9\n                if (_db !== p) {\n                    db.close();\n                    return;\n                } // \u8D85\u65F6\u540E\u8FDF\u5230\u7684 open\uFF1Amemo \u5DF2\u6362/\u5DF2\u4E22 \u2192 \u5173\u6389\u522B\u6CC4\u6F0F\n                resolve(db);\n            };\n            r.onerror = () => { clearTimeout(timer); dropConnection(p); reject(r.error); };\n        });\n        _db = p;\n        return p;\n    }\n    /** \u5173\u8FDE\u63A5 + \u62D2\u540E\u7EED\u8C03\u7528\uFF08store.dispose \u7528\uFF09\u3002\u5E42\u7B49\u3002 */\n    function close() {\n        _closed = true;\n        _win?.removeEventListener(\"pagehide\", _onPageHide);\n        _win?.removeEventListener(\"pageshow\", _onPageShow);\n        dropConnection(null);\n    }\n    // \u2605 \u5168\u5E93\u552F\u4E00\u4E8B\u52A1\u5165\u53E3\uFF08\u5F62\u72B6\u7EAA\u5F8B\u89C1\u6587\u4EF6\u5934\uFF09\u3002\n    //   run \u5728\u4E8B\u52A1\u91CC\u6392\u8BF7\u6C42\uFF0C\u8FD4\u56DE\u4E00\u4E2A finalizer\uFF1Bfinalizer \u5728 `t.oncomplete`\uFF08\u843D\u76D8\u786E\u8BA4\uFF09\u65F6\u624D\u88AB\u53D6\u503C\u3002\n    //   \u2014\u2014 \u4E8E\u662F\u300Cresolve \u4E86\u5C31\u662F\u771F\u7684\u300D\u4E0D\u5206\u8BFB\u5199\u90FD\u6210\u7ACB\uFF08readonly \u4E5F\u7B49 commit\uFF1Aoncomplete \u7D27\u968F\u6700\u540E\u4E00\u4E2A\n    //   request\uFF0C\u4EE3\u4EF7\u53EF\u5FFD\u7565\uFF0C\u6362\u6389\u4E00\u6574\u79CD\u5206\u53C9\u5F62\u72B6\uFF09\u3002\n    //   request \u7EA7\u5931\u8D25\u4E0D\u5355\u72EC\u63A5\uFF1A\u9519\u8BEF\u5192\u6CE1\u5230 t.onerror\u3001\u4E8B\u52A1\u968F\u4E4B abort\uFF0C\u7EDF\u4E00\u8D70 fail()\u3002\n    // \u2461 \u8D85\u65F6 \u2192 \u91CD\u5F00\u8FDE\u63A5\u91CD\u8BD5\u4E00\u6B21\uFF08run \u4F1A\u88AB\u518D\u8C03\u4E00\u6B21\uFF1A\u5B83\u53EA\u5F80 store \u6392\u8BF7\u6C42\uFF0C\u53EF\u91CD\u5165\uFF09\uFF1B\u518D\u8D85\u65F6 \u2192 warning \u4E0A\u62A5 + \u629B\u3002\n    function tx(mode, run, op = \"tx\") {\n        if (_suspended)\n            return Promise.reject(new IdbSuspendedError(`${mode} ${op}`)); // \u95F8\u95E8\uFF080.12.1\uFF09\uFF1A\u51BB\u7ED3/\u5C06\u51BB\u7ED3\u7684\u9875\u9762\u4E0D\u78B0 IDB\n        return txOnce(mode, run, op).catch((e) => {\n            if (!(e instanceof IdbTimeoutError) || _closed)\n                throw e;\n            reportStoreError(new Error(`[idb] ${e.message} \u2192 reopening connection, retrying once`), \"log\");\n            return txOnce(mode, run, op).catch((e2) => {\n                if (e2 instanceof IdbTimeoutError)\n                    reportStoreError(e2, \"warning\");\n                throw e2;\n            });\n        });\n    }\n    //   deadline\uFF080.11.5\uFF09\uFF1A\u4E8B\u52A1\u5728 IDB_OP_TIMEOUT_MS \u5185\u6CA1 complete/error/abort \u2192 \u5224\u6302\u6B7B\uFF1Aabort \u5B83\u3001\u4E22\u8FDE\u63A5\u3001\u629B IdbTimeoutError\u3002\n    function txOnce(mode, run, op) {\n        const conn = openDb();\n        return conn.then((db) => new Promise((resolve, reject) => {\n            const t = db.transaction(STORE, mode);\n            const ms = _idbOpTimeoutMs;\n            const rec = { t, mode, suspended: false };\n            _active.add(rec);\n            let failed = false; // onerror \u540E\u5FC5\u518D\u6765 onabort\uFF1A\u53EA\u62A5\u4E00\u6B21\n            const timer = setTimeout(() => {\n                if (failed)\n                    return;\n                failed = true;\n                _active.delete(rec);\n                dropConnection(conn); // \u8FDE\u63A5\u5224\u6302\u6B7B\uFF1A\u4E22 memo\uFF0C\u4E0B\u4E00 op\uFF08\u542B\u4E0B\u9762\u7684\u91CD\u8BD5\uFF09\u91CD\u5F00\n                try {\n                    t.abort();\n                }\n                catch { /* \u5DF2\u7ED3\u675F */ }\n                reject(new IdbTimeoutError(`${mode} ${op}`, ms));\n            }, ms);\n            const fail = () => {\n                if (failed)\n                    return;\n                failed = true;\n                clearTimeout(timer);\n                _active.delete(rec);\n                if (rec.suspended) {\n                    reject(new IdbSuspendedError(`${mode} ${op}`));\n                    return;\n                } // pagehide \u4E3B\u52A8\u5F03\u8BFB\uFF1A\u4E0D\u662F\u6570\u636E\u9519\uFF0C\u4E0D\u8D70 Quota/\u4E0A\u62A5\n                const err = t.error ?? new DOMException(`idb ${mode} transaction aborted`, \"AbortError\");\n                // \u914D\u989D\u649E\u5899 = \u300C\u5199\u6CA1\u843D\u76D8\u300D\u7684\u5934\u53F7\u6765\u6E90\uFF0C\u5FC5\u987B funnel \u7ED9 app\uFF08\u62CD\u677F 2026-08-25 \u00A71.1\uFF09\uFF1B\n                // reject \u7167\u65E7\u5411\u4E0A\u629B\u2014\u2014\u4E0A\u5C42\u6E05 dirty/\u505C\u91CD\u8BD5\u7684\u51B3\u5B9A\u53EA\u51C6\u5EFA\u7ACB\u5728 resolve \u4E4B\u4E0A\u3002\n                if (err.name === \"QuotaExceededError\")\n                    reportStoreError(err, \"error\");\n                reject(err);\n            };\n            t.onerror = fail;\n            t.onabort = fail;\n            let finish;\n            try {\n                finish = run(t.objectStore(STORE));\n            }\n            catch (e) {\n                failed = true;\n                clearTimeout(timer);\n                _active.delete(rec);\n                reject(e);\n                t.abort();\n                return;\n            } // \u540C\u6B65 throw\uFF08DataError \u7B49\uFF09\u2192 \u6574\u7B14\u5F03\uFF0C\u4E0D\u8BB8\u90E8\u5206\u63D0\u4EA4\n            t.oncomplete = () => { clearTimeout(timer); _active.delete(rec); if (failed)\n                return; resolve(finish()); };\n        }));\n    }\n    return {\n        close,\n        get(name) {\n            return tx(\"readonly\", (s) => { const r = s.get(name); return () => r.result; }, \"get\");\n        },\n        put(name, rec) {\n            return tx(\"readwrite\", (s) => { s.put(rec, name); return () => undefined; }, \"put\");\n        },\n        del(name) {\n            return tx(\"readwrite\", (s) => { s.delete(name); return () => undefined; }, \"del\");\n        },\n        keys() {\n            return tx(\"readonly\", (s) => { const r = s.getAllKeys(); return () => r.result.filter((k) => typeof k === \"string\"); }, \"keys\");\n        },\n        /** \u6309 key \u524D\u7F00\u6C47\u603B\u5360\u7528\uFF08\u5355\u4E8B\u52A1 cursor \u8D70\u4E00\u904D\uFF1B`Blob.size` \u662F\u5F15\u7528\u5C5E\u6027\uFF0C**\u4E0D\u628A\u5B57\u8282\u8BFB\u8FDB\u5185\u5B58**\uFF09\u3002\n         *  \u53EA\u8FD4\u4E24\u4E2A\u6807\u91CF\uFF0C\u4E0D\u8FD4\u4EFB\u4F55\u540D\u5B57 \u2014\u2014 \u62FF\u4E0D\u5230\u6E05\u5355\uFF0C\u6545**\u4E0D\u80FD**\u5F53\u5168\u5E93\u5217\u4E3E\u7528\uFF08\u90A3\u662F\u88AB\u5426\u51B3\u7684\u9000\u5316\u8BBE\u8BA1\uFF09\u3002 */\n        usage(prefix) {\n            return tx(\"readonly\", (s) => {\n                let bytes = 0, count = 0;\n                const c = s.openCursor();\n                c.onsuccess = () => {\n                    const cur = c.result;\n                    if (!cur)\n                        return; // \u8D70\u5B8C \u2192 \u7B49 oncomplete\n                    if (typeof cur.key === \"string\" && cur.key.startsWith(prefix)) {\n                        const rec = cur.value;\n                        if (rec && rec.blob) {\n                            bytes += rec.blob.size || 0;\n                            count++;\n                        }\n                    }\n                    cur.continue();\n                };\n                return () => ({ bytes, count });\n            }, \"usage\");\n        },\n        /** \u539F\u5B50\u6539\u540D(\u540C\u4E00\u4E8B\u52A1 get\u2192put \u65B0\u2192del \u65E7):trash/restore/backup \u7528\u3002\u6E90\u4E0D\u5B58\u5728\u5219 noop\u3002 */\n        rename(from, to) {\n            return tx(\"readwrite\", (s) => {\n                const g = s.get(from);\n                g.onsuccess = () => { const v = g.result; if (v !== undefined) {\n                    s.put(v, to);\n                    s.delete(from);\n                } };\n                return () => undefined;\n            }, \"rename\");\n        },\n        /** \u8BCA\u65AD/\u6D4B\u8BD5\uFF1A\u8FDE\u63A5\u88AB open \u8FC7\u51E0\u6B21\uFF08\u91CD\u5F00\u53EF\u89C2\u6D4B\uFF09\u3002 */\n        _opens() { return _opens; },\n        /** \u9875\u9762\u79BB\u573A\u5904\u7F6E\uFF08pagehide \u81EA\u52A8\u8C03\uFF1B\u6D4B\u8BD5\u53EF\u76F4\u8C03\uFF09\u3002 */\n        suspend,\n        /** bfcache \u590D\u6D3B\u5904\u7F6E\uFF08pageshow \u81EA\u52A8\u8C03\uFF1B\u6D4B\u8BD5\u53EF\u76F4\u8C03\uFF09\u3002 */\n        resume,\n    };\n}\n", "// \u26A0 store \u5185\u90E8\u6DF1\u6A21\u5757\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore\u3002\n//\n// blob-partition \u2014\u2014 IDB \u5355 object store `blobs` \u4E4B\u4E0A\u7684**\u903B\u8F91\u5206\u533A**\uFF08\u552F\u4E00\u77E5\u9053\u5206\u533A\u524D\u7F00\u7684\u5730\u65B9 = IDB \u4FA7\u7684\u7A84\u8170\uFF09\u3002\n//   key = `${partition}/${name}`\uFF1Bfiles / trash / backup / collections \u7269\u7406\u540C\u5E93\u3001\u903B\u8F91\u9694\u79BB\u3002\n//   file/trash/backup \u672C\u5C31\u540C\u7C7B\uFF08\u4E0D\u900F\u660E blob\uFF09\uFF0Ccollections \u662F JSON envelope\uFF0C\u4E00\u5F8B\u5F53 opaque blob \u5B58\u3002\n//   \u8DE8\u5206\u533A\u539F\u5B50\u79FB\u52A8\uFF08trash / restore / backup\uFF09= \u540C\u4E00 object store \u5185 rename\uFF0C\u4E8B\u52A1\u539F\u5B50\uFF08idb-store.rename\uFF09\u3002\nimport { createIdbCache } from \"./idb-store.js\";\nexport function createPartitionedBlobStore(dbName) {\n    const idb = createIdbCache(dbName);\n    const key = (p, name) => `${p}/${name}`;\n    function view(p) {\n        const prefix = `${p}/`;\n        return {\n            get: (name) => idb.get(key(p, name)),\n            put: (name, rec) => idb.put(key(p, name), rec),\n            del: (name) => idb.del(key(p, name)),\n            exists: async (name) => (await idb.get(key(p, name))) !== undefined,\n            keys: async () => (await idb.keys()).filter((k) => k.startsWith(prefix)).map((k) => k.slice(prefix.length)),\n            usage: () => idb.usage(prefix),\n            moveTo: (name, to, toName) => idb.rename(key(p, name), key(to, toName)),\n        };\n    }\n    return { partition: view, close: () => idb.close() };\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md\u3002store \u5185\u90E8\u6A21\u5757,**\u4E0D\u8981\u4ECE app \u76F4\u63A5 import**\u2014\u2014app \u53EA\u8D70 createStore()\u3002\n//\n// LocalCache \u2014\u2014 store \u7684\u672C\u5730\u6301\u4E45\u5C42(\u79BB\u7EBF\u7F13\u5B58 + \u79D2\u5F00)\u3002**\u5185\u5BB9\u65E0\u5173\u3001\u96F6 ORA \u77E5\u8BC6**:\n//   \u53EA\u5B58/\u53D6\u4E0D\u900F\u660E binary blob(ora/glb/pdf/txt \u4E00\u5F8B)\u2014\u2014**store \u7EDD\u4E0D\u89E3\u7801\u5185\u5BB9\u3001\u7EDD\u4E0D\u6E32\u7F29\u7565\u56FE**(\u90A3\u662F app \u7684\u4E8B),\n//   \u4E5F**\u7EDD\u4E0D\u6301\u4E45\u5316\u4EFB\u4F55\u5185\u5BB9\u6D3E\u751F\u7269**(\u7F29\u7565\u56FE/\u9884\u89C8):\u52A0\u5BC6\u4EF6\u7684\u660E\u6587\u6D3E\u751F\u7269\u843D\u76D8\u5373\u7EA2\u7EBF\u5931\u5B88\u3002IDB \u5355 object store `blobs`,\u672C cache \u7528\n//   **files / trash / backup \u4E09\u4E2A\u5206\u533A**(blob-partition \u6DF1\u6A21\u5757);collections \u662F**\u53E6\u4E00\u4E2A\u5206\u533A**,\u7531\n//   createCollectionCache \u63D0\u4F9B\u3001collection \u6A21\u5757\u7528(\u89C1 create-store \u63A5\u7EBF)\u3002\n// \u5951\u7EA6\u89C1 types.ts \u7684 LocalCache\u3002\u6D4F\u89C8\u5668\u4E13\u7528,\u771F\u673A\u9A8C\u3002\nimport { createPartitionedBlobStore } from \"./blob-partition.js\";\nimport { createIdbCache } from \"./idb-store.js\";\nimport { asideStamp, restoreTargetName, snapshotStampOf } from \"./move-aside.js\";\nimport { createIdentifiers } from \"./identifiers.js\";\nconst NO_KINDS = createIdentifiers([]);\n// trashKey/backupKey \u5185\u5C42 = \"<yyyymmddhhmmss-guid>:<name>\" \u2192 \u8FD8\u539F name\uFF08\u53BB\u4E00\u6BB5\u76D6\u6233\u524D\u7F00\uFF09\u3002\nconst stripStamp = (inner) => inner.replace(/^[^:]*:/, \"\");\nconst stamp = () => asideStamp(Date.now());\n// trashKey/backupKey = \"<partition>/<inner>\"\uFF1B\u62C6\u6210\u5206\u533A + \u5185\u5C42\u952E\u3002\nfunction splitKey(k) {\n    const slash = k.indexOf(\"/\");\n    return slash < 0 ? { part: \"trash\", inner: k } : { part: k.slice(0, slash), inner: k.slice(slash + 1) };\n}\n/** LocalCache \u5DE5\u5382\uFF08prod=IDB\uFF09\uFF1Afiles/trash/backup \u4E09\u5206\u533A\u7684\u672C\u5730\u6301\u4E45\u5C42\uFF0C\u5185\u5BB9\u65E0\u5173\u3001\u53EA\u5B58\u4E0D\u900F\u660E blob\u3002\n *  dbName \u5FC5\u987B\u5DF2\u5E26\u547D\u540D\u7A7A\u95F4\uFF08createStore \u4F20 `${appId}.${databaseId}`\uFF09\u2014\u2014\u540C origin \u5144\u5F1F PWA /\n *  \u591A store \u5B9E\u4F8B\u9694\u79BB\uFF0C\u89C1 idb-store.ts \u5934\u6CE8\u91CA\u3002 */\nexport function createLocalCache(dbName, opts = {}) {\n    const ids = opts.identifiers ?? NO_KINDS; // \u4E0D\u7ED9 = \u6CA1\u6709\u6587\u6863\u79CD\u7C7B\uFF1A\u6062\u590D\u649E\u540D\u4E00\u5F8B\u6309\u6700\u540E\u4E00\u4E2A\u70B9\u63D2\u6233\uFF080.15.2 \u884C\u4E3A\uFF09\n    const bs = createPartitionedBlobStore(dbName);\n    const files = bs.partition(\"files\");\n    const trashP = bs.partition(\"trash\");\n    const backupP = bs.partition(\"backup\");\n    const dirIdxP = bs.partition(\"dir-index-cache\"); // \u6BCF\u5939\u300C\u4E0A\u6B21\u4E91\u5E27\u300D\u76EE\u5F55\u7D22\u5F15\u7F13\u5B58\uFF08A3\uFF1B\u975E SSoT\uFF0C\u810F\u7684\uFF0C\u53EA\u914D\u753B\u9996\u5E27\uFF09\uFF1B\u903B\u8F91\u5206\u533A=\u952E\u524D\u7F00\uFF0C\u96F6 IDB schema \u53D8\u66F4\n    // A4 \u53CC tab \u4E92\u8986\u62A4\u680F\uFF082026-08-28 user \u62CD\u677F a\uFF09\uFF1Aper-tab seen rev\uFF08\u672C\u5B9E\u4F8B=\u672C tab\uFF09\u3002\n    //   get/save \u90FD\u5237\u65B0 seen\uFF1Bguard=\"user-save\" \u7684\u5199\u4E0E stored rev \u5BF9\u8868\uFF0C\u649E\u7248 = \u522B tab \u5199\u8FC7 \u2192\n    //   \u5148\u628A**\u5BF9\u65B9\u5B57\u8282**\u5907\u4EFD\u8FDB backup \u5206\u533A\u518D\u8986\u76D6\uFF08\u8BCD\u5178\u5E8F\u2461\uFF1A\u8C01\u7684\u64CD\u4F5C\u90FD\u4E0D\u9759\u9ED8\u4E22\uFF09\u3002\n    //   \u8BFB-\u6BD4-\u5199\u6709\u6BEB\u79D2\u7EA7 TOCTOU \u7A97\uFF08\u5DF2\u77E5\u5931\u8D25\uFF0C\u540C\u6587\u4EF6\u5668\u5B98 mtime \u5BF9\u8868\u59FF\u52BF\uFF09\uFF1B\u62A4\u7684\u662F 30s autosave\n    //   \u4EA4\u66FF\u4E92\u8986\u90A3\u79CD\u5206\u949F\u7EA7\u771F\u5B9E\u4E8B\u6545\u3002\u9632 spam\uFF1A\u540C\u540D backup \u51B7\u5374\u7A97 5min\uFF08\u5BF9\u65B9\u8FDE\u5199\u4E0D\u5237\u5C4F\u5907\u4EFD\u7BB1\uFF09\u3002\n    const _seenRev = new Map();\n    const _lastConflictBackupAt = new Map();\n    const CONFLICT_BACKUP_COOLDOWN_MS = 5 * 60_000;\n    return {\n        // \u8986\u76D6\u5199\u3002bytes \u5F52\u4E00\u5316\u6210 Blob(\u5951\u7EA6\u843D Blob)\u3002\n        // \u26A0 \u66FE\u628A hint.peek \u4E00\u5E76\u5199\u8FDB\u8BB0\u5F55\u7684 .peek \u5B57\u6BB5\u2014\u2014**\u96F6 reader**\uFF08\u6D3B\u7684\u56FE\u5E93\u7F29\u7565\u56FE\u8D70\u5BC6\u6587 getPeek\uFF09\uFF0C\n        //   \u5374\u5BF9\u52A0\u5BC6\u4EF6\u628A 256px **\u660E\u6587**\u7F29\u7565\u56FE\u843D\u8FDB\u4E86 IDB\uFF0C\u8FDD\u53CD\u7EA2\u7EBF\u300C\u660E\u6587\u7F29\u7565\u56FE\u6C38\u4E0D\u843D\u76D8\u300D\u3002\u5B57\u6BB5\u5DF2\u5220\uFF1B\n        //   hint \u4ECD\u539F\u6837\u900F\u4F20\u7ED9\u4E0A\u5C42\u4F5C\u65C1\u8DEF\uFF0C\u4F46 store \u4E0D\u518D\u6301\u4E45\u5316\u5B83\u7684\u4EFB\u4F55\u89E3\u7801\u4EA7\u7269\u3002\n        async save(name, bytes, _hint, guard) {\n            const blob = bytes instanceof Blob ? bytes : new Blob([bytes]);\n            const stored = await files.get(name);\n            const storedRev = stored?.rev ?? 0;\n            let foreignOverwrite;\n            if (guard === \"user-save\" && stored && storedRev !== (_seenRev.get(name) ?? 0)) {\n                const nowTs = Date.now();\n                const last = _lastConflictBackupAt.get(name) ?? 0;\n                let backedUp = false;\n                if (nowTs - last >= CONFLICT_BACKUP_COOLDOWN_MS) {\n                    await backupP.put(`${stamp()}:${name}`, { ...stored, updatedAt: nowTs }); // \u5BF9\u65B9\u5B57\u8282\u7559\u5E95\uFF08\u539F\u4EF6\u5373\u5C06\u88AB\u8986\u76D6\uFF09\n                    _lastConflictBackupAt.set(name, nowTs);\n                    backedUp = true;\n                }\n                foreignOverwrite = { backedUp, foreignRev: storedRev };\n            }\n            const rev = storedRev + 1;\n            await files.put(name, { blob, updatedAt: Date.now(), rev });\n            _seenRev.set(name, rev);\n            return foreignOverwrite ? { rev, foreignOverwrite } : { rev };\n        },\n        async get(name) {\n            const r = await files.get(name);\n            if (r)\n                _seenRev.set(name, r.rev ?? 0);\n            return r ? r.blob : null;\n        },\n        async exists(name) { return files.exists(name); },\n        // \u8F7B\u91CF\u5143\u4FE1\u606F\uFF1Ablob.size \u662F Blob \u5F15\u7528\u5C5E\u6027\uFF08\u4E0D\u8F7D\u5B57\u8282\uFF09\u3001updatedAt \u5B58\u8BB0\u5F55\u91CC \u2192 \u4FBF\u5B9C\u3002listing \u7ED9\u672C\u5730\u9879\u586B\u5C3A\u5BF8/\u65F6\u95F4\u3002\n        async stat(name) { const r = await files.get(name); return r ? { size: r.blob.size, updatedAt: r.updatedAt } : null; },\n        // \u5DF2\u7F13\u5B58\u7684\u5E94\u7528\u6587\u4EF6\u540D = files \u5206\u533A\u952E\uFF08trash/backup/collections \u5929\u7136\u9694\u79BB\u5728\u522B\u5206\u533A\uFF0C\u65E0\u9700\u6309\u540D\u8FC7\u6EE4\uFF09\u3002\n        async appKeys() { return files.keys(); },\n        // files \u5206\u533A\u5360\u7528\uFF08\u5B57\u8282 + \u4EF6\u6570\uFF09\u3002**\u4E0D\u542B** trash/backup/collections \u5206\u533A\uFF0C\u4E5F\u4E0D\u542B\u7EAF\u4E91\u7AEF\u672A\u7F13\u5B58\u7684\u6587\u4EF6\u3002\n        async usage() { return files.usage(); },\n        // \u8986\u76D6\u524D\u7559\u5E95:\u590D\u5236\u5230 backup \u5206\u533A(yyyymmddhhmmss-guid \u9632\u649E;\u539F\u4EF6\u4E0D\u52A8)\u3002\n        async backup(name) {\n            const r = await files.get(name);\n            if (!r)\n                throw new Error(`\u672C\u5730\u65E0 ${name},\u65E0\u6CD5\u5907\u4EFD`);\n            const inner = `${stamp()}:${name}`;\n            await backupP.put(inner, { ...r, updatedAt: Date.now() });\n            return `backup/${inner}`;\n        },\n        async trash(name, deleteEventId) {\n            const inner = `${deleteEventId}:${name}`; // \u4E0E\u4E91\u7AEF\u817F\u5171\u7528\u540C\u4E00\u4E2A id \u2192 trash-merge \u7CBE\u786E\u914D\u5BF9\n            await files.moveTo(name, \"trash\", inner); // \u539F\u5B50\u79FB\u8FDB trash \u5206\u533A\uFF08\u7EDD\u4E0D\u786C\u5220\u7528\u6237\u5B57\u8282\uFF09\n            return `trash/${inner}`;\n        },\n        async hardDelete(name) { await files.del(name); },\n        async restore(trashKey) {\n            const { part, inner } = splitKey(trashKey);\n            const orig = stripStamp(inner);\n            // \u6848\u5377 \u00A78\uFF082026-08-25\uFF09\uFF1A\u65E7\u7248\u65E0\u6761\u4EF6 moveTo = idb.rename \u843D\u70B9\u8986\u76D6\u2014\u2014\u6062\u590D\u6B63\u6253\u5F00\u7684\u540C\u540D\u4F1A\u88AB\u4E0B\u6B21\u4FDD\u5B58\n            //   \u9759\u9ED8\u76D6\u6389\uFF08trash \u4EFD\u5DF2 move \u8D70 = \u6062\u590D\u5B57\u8282\u771F\u4E22\uFF09\u3001\u6062\u590D\u649E\u672A\u63A8 dirty \u4F1A\u541E\u7F16\u8F91\u3002\u843D\u70B9\u5360\u7528 \u2192 \u6539\u540D\u6062\u590D\n            //   \uFF08\u5FEB\u7167\u65F6\u523B\u6233\uFF0C\u7EDD\u4E0D\u8986\u76D6 files \u5206\u533A\u65E2\u6709\u5B57\u8282\uFF09\u3002\n            const target = await restoreTargetName(orig, (n) => files.exists(n), snapshotStampOf(inner), Date.now(), ids);\n            await (part === \"backup\" ? backupP : trashP).moveTo(inner, \"files\", target);\n            return target;\n        },\n        async purgeTrash(trashKey) {\n            const { part, inner } = splitKey(trashKey);\n            await (part === \"backup\" ? backupP : trashP).del(inner);\n        },\n        async listTrash() {\n            return (await trashP.keys()).map((inner) => ({ trashKey: `trash/${inner}`, name: stripStamp(inner) }));\n        },\n        // \u5907\u4EFD\u5206\u533A\u5217\u4E3E\uFF08\u5F62\u540C listTrash\uFF0C\u4F46 key \u5E26 `backup/` \u524D\u7F00 \u2192 restore/purgeTrash \u7ECF splitKey \u8BA4\u5F97\u8D70 backupP\uFF09\u3002\n        async listBackup() {\n            return (await backupP.keys()).map((inner) => ({ trashKey: `backup/${inner}`, name: stripStamp(inner) }));\n        },\n        // dir-index-cache\uFF1Akey=\u5939\u8DEF\u5F84\uFF08\"\"=\u6839 \u2192 IDB \u5168\u952E \"dir-index-cache/\"\uFF09\uFF0C\u503C=JSON \u4E32\u88C5 Blob\uFF08store \u81EA\u4EA7\u81EA\u9500\uFF0C\u672C\u5C42\u4E0D\u89E3\u91CA\uFF09\u3002\n        async getDirIndexCache(folder) { const r = await dirIdxP.get(folder); return r ? await r.blob.text() : null; },\n        async putDirIndexCache(folder, json) { await dirIdxP.put(folder, { blob: new Blob([json], { type: \"application/json\" }), updatedAt: Date.now() }); },\n        async clearDirIndexCache() { for (const k of await dirIdxP.keys())\n            await dirIdxP.del(k); }, // 0.11.6 \u660E\u786E\u767B\u51FA\uFF1A\u6574\u5206\u533A\u6E05\u6389\n        close() { bs.close(); },\n    };\n}\n// staging \u5206\u533A\uFF08A1 \u5206\u7247\u4E0B\u8F7D\u4F1A\u8BDD\u7684\u6682\u5B58\u533A\uFF1Bdownload-session \u6A21\u5757\u7528\uFF09\u3002\u903B\u8F91\u5206\u533A=\u952E\u524D\u7F00\uFF0C\u96F6 IDB schema \u53D8\u66F4\u3002\n//   \u53EA\u88C5\u4E91\u7AEF\u62C9\u6765\u7684 re-fetchable \u5B57\u8282\uFF08\u5206\u7247+\u8BB0\u8D26 JSON\uFF09\uFF0C\u6C38\u8FDC\u4E0D\u88C5\u7528\u6237\u552F\u4E00\u526F\u672C\u2014\u2014\u6E05\u4E86\u7EDD\u4E0D\u4E22\u6570\u636E\u3002\nexport function createStagingStore(dbName) {\n    const bs = createPartitionedBlobStore(dbName);\n    const p = bs.partition(\"staging\");\n    return {\n        async get(key) { const r = await p.get(key); return r ? r.blob : null; },\n        async put(key, blob) { await p.put(key, { blob, updatedAt: Date.now() }); },\n        async del(key) { await p.del(key); },\n        async keys() { return p.keys(); },\n        close() { bs.close(); },\n    };\n}\n// collections \u5206\u533A\u7684\u6781\u7B80 cache\uFF08collection \u6A21\u5757\u7528\uFF1Bcollection \u7ECF collectionLocalKey \u81EA\u5E26 `collections/` \u524D\u7F00 \u2192 \u76F4\u63A5\u843D blobs \u88F8\u952E\uFF09\u3002\n//   \u4E0E files \u5206\u533A\u952E\u524D\u7F00\u4E0D\u540C\u3001\u5929\u7136\u9694\u79BB\uFF0C\u540C\u4E00 `blobs` object store \u5171\u5B58\u3002\u53EA\u9700 collection \u7528\u5230\u7684\u4E09\u9762\u3002\nexport function createCollectionCache(dbName) {\n    const idb = createIdbCache(dbName);\n    return {\n        async save(name, bytes) {\n            const blob = bytes instanceof Blob ? bytes : new Blob([bytes]);\n            await idb.put(name, { blob, updatedAt: Date.now() });\n        },\n        async get(name) { const r = await idb.get(name); return r ? r.blob : null; },\n        async exists(name) { return (await idb.get(name)) !== undefined; },\n        close() { idb.close(); },\n    };\n}\n", "// \u26A0 store \u5185\u90E8\u6DF1\u6A21\u5757\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore \u7684 file().openStream()\u3002\n//\n// chunk-scheduler\uFF082.0.0\uFF0C2026-10-17 Claude Fable 5.1\uFF1Buser 10-17\u300C\u4F60\u73B0\u5728\u662Ffable\u4E86\uFF0C\u5F00\u59CB\u505A\u6D89\u53CA\u5E93\u7684\u6539\u52A8\u300D\uFF09\n//   \u300C\u4E00\u4E2A key\uFF08\u67D0\u6587\u4EF6\u67D0\u5206\u7247\uFF09\u62FF\u4E00\u6B21\u5B57\u8282\u300D\u7684\u5168\u90E8\u8C03\u5EA6\u653F\u7B56\u3002download-session \u628A staging\uFF08preflight\uFF09\u3001\u4E91\u7AEF\u3001\u955C\u50CF\u88C5\u8FDB\u6765\uFF1B\n//   \u8FD9\u91CC\u4E0D\u8BA4\u8BC6\u6587\u4EF6\u3001\u4E0D\u78B0\u5B58\u50A8\u3001\u4E0D\u77E5\u9053\u5B57\u8282\u662F\u4EC0\u4E48\u3002\n//\n//   \u00B7 \u540C key \u53BB\u91CD\uFF1A\u64AD\u653E / \u6295\u673A / pin \u649E\u540C\u7247\u53EA\u62C9\u4E00\u6B21\u3002\u64AD\u653E\u52A0\u5165\u6295\u673A\u7684 job = **\u5347\u683C**\uFF1A\u5B83\u5728\u6392\u8F66\u9053 / \u7B49\u8BA9\u8DEF \u2192 \u7ACB\u523B\u653E\u884C\u3002\n//     \uFF080.18 \u8FD9\u91CC\u4F1A\u4E92\u7B49\uFF1Apin \u5728 playbackIdle() \u7B49\u64AD\u653E\u6E05\u96F6\uFF0C\u64AD\u653E\u5374\u5728\u7B49\u8FD9\u4E2A pin \u7684 job\uFF0C\u6C38\u8FDC\u4E0D\u9192\u300210-17 \u63A2\u9488\u5750\u5B9E\uFF1A\n//       \u64AD\u653E A \u5728\u98DE\u3001pin B \u7B49\u8BA9\u8DEF\u3001\u64AD\u653E\u4E5F\u8BFB B\u3001A \u5B8C\u6210 \u2192 B \u7684 range \u6C38\u8FDC\u4E0D\u53D1\u3002\uFF09\n//   \u00B7 \u64AD\u653E\u4F18\u5148\uFF1A\u64AD\u653E\u5206\u7247\u5728\u98DE\u65F6\u6295\u673A\u4E0D\u5F00\u65B0\u5206\u7247\uFF08\u5206\u7247\u7C92\u5EA6\u8BA9\u8DEF\uFF0C\u4E0D\u6740\u8BF7\u6C42\uFF09\u3002\u64AD\u653E\u4E0D\u9650\u3001\u4E0D\u5360\u8F66\u9053\u3002\n//   \u00B7 \u8F66\u9053\uFF1A\u6295\u673A\u540C\u65F6\u5728\u98DE \u2264 lanes\uFF08\u4E0D\u4F20 = 1\uFF0C= 0.18 \u7684\u300Cpin \u4E25\u683C\u4E32\u884C\u300D\uFF0Cuser 2026-08 \u9489\u6B7B\u300C\u4E0D\u8981 spike \u70B8\u300D\uFF1B\u591A\u8F66\u9053\u7531\u6D88\u8D39\u65B9\u663E\u5F0F\u5F00\uFF09\u3002\n//   \u00B7 \u5361\u4F4F\uFF08stallMs\uFF0C\u4E0D\u4F20 = \u4E0D\u5224\uFF09\uFF1A\u4E00\u8DEF\u8FDE\u7EED stallMs **\u6CA1\u5230\u4E00\u4E2A\u5B57\u8282**\uFF08\u4E0D\u6309\u8BF7\u6C42\u5E74\u9F84\uFF1A\u6162\u800C\u4E0D\u505C\u7684\u94FE\u8DEF\u4E0D\u4F1A\u88AB\u8BEF\u5BF9\u51B2\uFF09\u3002\n//       \u64AD\u653E \u2192 \u518D\u5F00\u4E00\u8DEF\u5BF9\u51B2\uFF08\u5148\u6362\u4E0B\u4E00\u4E2A\u6765\u6E90\uFF0C\u6CA1\u6709\u5C31\u540C\u6E90\uFF1B\u5148\u5230\u7684\u8D62\u3001\u8F93\u7684\u4E2D\u6B62\uFF1B\u4E00\u7247\u6700\u591A 3 \u8DEF\uFF09\uFF1B\n//       \u6295\u673A \u2192 \u4E2D\u6B62\u3001\u8BA9\u9053\uFF08\u8FD8\u6709\u6CA1\u8BD5\u8FC7\u7684\u6765\u6E90\u5C31\u6362\u7740\u8BD5\uFF1B\u5426\u5219\u8FD9\u7247\u4EE5 StreamStallError \u5931\u8D25\uFF0C\u8F66\u9053\u8FD8\u7ED9\u522B\u4EBA\uFF09\u3002\n//   \u00B7 \u6765\u6E90\u987A\u5E8F = \u504F\u597D\uFF1A[0] \u5148\u8BD5\uFF1B\u4E00\u8DEF**\u51FA\u9519**\uFF08\u4E0D\u662F\u5361\u4F4F\uFF09\u4E14\u6CA1\u522B\u7684\u8DEF\u5728\u98DE \u2192 \u6362\u4E0B\u4E00\u4E2A\u6765\u6E90\uFF1B\u90FD\u8BD5\u8FC7 \u2192 \u4EE5\u6700\u540E\u90A3\u4E2A\u9519\u5931\u8D25\u3002\n//   \u00B7 \u5B57\u8282\u5230\u4E86\u5C31\u4EA4 arrived()\uFF08\u843D staging\uFF09\u2014\u2014\u5305\u62EC\u8F93\u4E86\u7684\u90A3\u8DEF\u548C\u653E\u5F03\u540E\u665A\u5230\u7684\uFF1A\u62C9\u56DE\u6765\u7684\u5B57\u8282\u4E0D\u6D6A\u8D39\u3002job \u7559\u5728\u8868\u91CC\u76F4\u5230 arrived \u505A\u5B8C\uFF0C\n//     \u5176\u95F4\u540C\u7247\u7684\u8BFB\u52A0\u5165\u5B83\u76F4\u63A5\u62FF\u5B57\u8282\uFF0C\u4E0D\u4F1A\u6251\u7A7A staging \u518D\u62C9\u4E00\u6B21\u3002\n/** \u6295\u673A\u7684\u4E00\u7247\u5361\u4F4F\u3001\u53C8\u6CA1\u6709\u522B\u7684\u6765\u6E90\u53EF\u6362 \u2192 \u8FD9\u7247\u4EE5\u5B83\u5931\u8D25\uFF08prefetch \u4EE5\u5B83 reject\uFF0C\u8BA9\u9884\u53D6\u65B9\u5B66\u5230\u300C\u8FD9\u7247\u6CA1\u62C9\u5230\u300D\uFF09\u3002 */\nexport class StreamStallError extends Error {\n    constructor(key) { super(`chunk stalled (no bytes within the stall window): ${key}`); this.name = \"StreamStallError\"; }\n}\nconst MAX_ATTEMPTS = 3;\nexport function createChunkScheduler(cfg = {}) {\n    const lanes = Math.max(1, Math.floor(cfg.lanes ?? 1));\n    const stallMs = cfg.stallMs !== undefined && cfg.stallMs > 0 ? cfg.stallMs : null;\n    const now = cfg.now ?? (() => Date.now());\n    const jobs = new Map();\n    let playbackBusy = 0;\n    const idleWaiters = new Set();\n    let laneFree = lanes;\n    const laneQueue = [];\n    const stats = { hedges: 0, stallAborts: 0, fallbacks: 0 };\n    function playbackDone() {\n        playbackBusy--;\n        if (playbackBusy === 0) {\n            const ws = [...idleWaiters];\n            idleWaiters.clear();\n            for (const w of ws)\n                w();\n        }\n    }\n    function request(req) {\n        let job = jobs.get(req.key);\n        const fresh = !job;\n        if (job) {\n            if (req.prio === \"playback\")\n                promote(job);\n        }\n        else {\n            job = newJob(req);\n            jobs.set(req.key, job);\n        }\n        if (req.prio === \"playback\") {\n            playbackBusy++;\n            job.promise.then(playbackDone, playbackDone);\n        }\n        if (fresh)\n            void run(job);\n        return job.promise;\n    }\n    function newJob(req) {\n        let resolve, reject;\n        const promise = new Promise((res, rej) => { resolve = res; reject = rej; });\n        promise.catch(() => { }); // \u6CA1\u4EBA\u7B49\u7684\u6295\u673A\u5931\u8D25\u4E0D\u5192 unhandled rejection\uFF08\u7B49\u7684\u4EBA\u81EA\u5DF1\u62FF\u5230\u540C\u4E00\u4E2A reject\uFF09\n        return { key: req.key, req, demand: req.prio === \"playback\", startedAt: -1, attempts: [], settled: false, hasLane: false, wake: null, promise, resolve, reject };\n    }\n    /** \u64AD\u653E\u52A0\u5165\u4E86\u4E00\u4E2A\u6295\u673A job\uFF1A\u4E0D\u518D\u8BA9\u8DEF\u3001\u4E0D\u518D\u6392\u8F66\u9053\uFF1B\u5DF2\u7ECF\u5361\u7740\u7684\u90A3\u8DEF\u73B0\u5728\u5C31\u5BF9\u51B2\u3002 */\n    function promote(job) {\n        if (job.demand)\n            return;\n        job.demand = true;\n        job.wake?.();\n        if (stallMs !== null) {\n            const t = now();\n            const a = job.attempts.find((x) => x.running && t - x.lastAt >= stallMs);\n            if (a)\n                onStall(job, a);\n        }\n    }\n    async function run(job) {\n        try {\n            if (job.req.preflight) {\n                const pre = await job.req.preflight();\n                if (pre) {\n                    settleOk(job, pre, null);\n                    return;\n                }\n            }\n            if (!job.demand) {\n                await acquireLane(job);\n                while (!job.demand && playbackBusy > 0)\n                    await yieldToPlayback(job);\n            }\n            if (job.req.sources.length === 0)\n                throw new Error(`no source for chunk ${job.key}`);\n            launch(job);\n        }\n        catch (e) {\n            settleErr(job, e);\n        }\n    }\n    function acquireLane(job) {\n        if (job.demand)\n            return Promise.resolve();\n        if (laneFree > 0) {\n            laneFree--;\n            job.hasLane = true;\n            return Promise.resolve();\n        }\n        return new Promise((r) => {\n            job.wake = () => { job.wake = null; r(); };\n            laneQueue.push(job);\n        });\n    }\n    function releaseLane(job) {\n        if (!job.hasLane)\n            return;\n        job.hasLane = false;\n        laneFree++;\n        while (laneQueue.length) {\n            const j = laneQueue.shift();\n            if (j.wake && !j.demand) {\n                laneFree--;\n                j.hasLane = true;\n                j.wake();\n                return;\n            } // \u88AB\u5347\u683C / \u5DF2\u9192\u7684\u8DF3\u8FC7\n        }\n    }\n    function yieldToPlayback(job) {\n        return new Promise((r) => {\n            const w = () => { idleWaiters.delete(w); job.wake = null; r(); };\n            job.wake = w;\n            idleWaiters.add(w);\n        });\n    }\n    const unusedSource = (job) => {\n        const used = new Set(job.attempts.map((a) => a.sourceIdx));\n        for (let i = 0; i < job.req.sources.length; i++)\n            if (!used.has(i))\n                return i;\n        return -1;\n    };\n    const finish = (a) => { a.running = false; if (a.timer) {\n        clearTimeout(a.timer);\n        a.timer = null;\n    } };\n    function launch(job) {\n        const idx = unusedSource(job) >= 0 ? unusedSource(job) : job.attempts[job.attempts.length - 1].sourceIdx; // \u90FD\u8BD5\u8FC7\uFF1A\u540C\u6E90\u518D\u6765\u4E00\u8DEF\n        const src = job.req.sources[idx];\n        const a = { sourceIdx: idx, ctrl: typeof AbortController === \"function\" ? new AbortController() : null, lastAt: now(), timer: null, running: true };\n        job.attempts.push(a);\n        if (job.startedAt < 0)\n            job.startedAt = a.lastAt;\n        const arm = () => { if (stallMs === null)\n            return; if (a.timer)\n            clearTimeout(a.timer); a.timer = setTimeout(() => onStall(job, a), stallMs); };\n        arm();\n        let p;\n        try {\n            p = src.fetch({ signal: a.ctrl?.signal, onProgress: () => { a.lastAt = now(); arm(); } });\n        }\n        catch (e) {\n            p = Promise.reject(e);\n        }\n        p.then((bytes) => { finish(a); settleOk(job, bytes, src.origin); }, (err) => {\n            const wasRunning = a.running;\n            finish(a);\n            if (job.settled || !wasRunning)\n                return; // \u5DF2\u6709\u7ED3\u679C / \u662F\u6211\u4EEC\u81EA\u5DF1\u4E2D\u6B62\u7684\uFF1A\u8FD9\u8DEF\u7684\u9519\u4E0D\u7B97\n            if (job.attempts.some((x) => x.running))\n                return; // \u8FD8\u6709\u522B\u7684\u8DEF\u5728\u98DE\uFF1A\u7B49\u5B83\n            if (unusedSource(job) >= 0 && job.attempts.length < MAX_ATTEMPTS) {\n                stats.fallbacks++;\n                launch(job);\n                return;\n            }\n            settleErr(job, err);\n        });\n    }\n    function onStall(job, a) {\n        if (!a.running || job.settled)\n            return;\n        if (job.demand) {\n            const running = job.attempts.filter((x) => x.running).length;\n            if (running < 2 && job.attempts.length < MAX_ATTEMPTS) {\n                stats.hedges++;\n                launch(job);\n            }\n            return;\n        }\n        stats.stallAborts++;\n        finish(a); // \u4E0D\u518D\u7B97\u5728\u98DE\uFF08\u8F66\u9053\u7684\u610F\u4E49\u5C31\u5728\u8FD9\uFF09\uFF1B\u5B57\u8282\u771F\u5230\u4E86 settleOk \u7167\u6837\u4EA4 arrived\n        a.ctrl?.abort();\n        if (job.attempts.some((x) => x.running))\n            return;\n        if (unusedSource(job) >= 0 && job.attempts.length < MAX_ATTEMPTS) {\n            stats.fallbacks++;\n            launch(job);\n            return;\n        }\n        settleErr(job, new StreamStallError(job.key));\n    }\n    function settleOk(job, bytes, origin) {\n        const first = !job.settled;\n        if (first) {\n            job.settled = true;\n            for (const x of job.attempts)\n                if (x.running) {\n                    finish(x);\n                    x.ctrl?.abort();\n                } // \u8F93\u7684\u90A3\u8DEF\u4E2D\u6B62\uFF08\u7701\u6D41\u91CF\uFF09\n        }\n        // \u5148\u53EB arrived\uFF08\u540C\u6B65\u8DD1\u5230\u5B83\u7B2C\u4E00\u4E2A await\uFF1A\u5185\u5B58\u8D26\u5148\u8BB0\u4E0A\uFF09\uFF0C\u518D resolve\u2014\u2014\u7B49\u5B57\u8282\u7684\u4EBA\u9192\u6765\u65F6\u8D26\u5DF2\u7ECF\u5BF9\u4E86\uFF1B\u843D\u76D8\u4E0D\u6321\u5B57\u8282\u3002\n        let tee = Promise.resolve();\n        if (origin !== null && job.req.arrived) {\n            try {\n                tee = Promise.resolve(job.req.arrived(bytes, origin)).then(() => { }, () => { });\n            }\n            catch { /* arrived \u540C\u6B65\u629B\uFF1A\u5F53\u6CA1\u843D\u76D8 */ }\n        }\n        if (first) {\n            job.resolve(bytes);\n            void tee.then(() => close(job));\n        }\n    }\n    function settleErr(job, err) {\n        if (job.settled)\n            return;\n        job.settled = true;\n        for (const x of job.attempts)\n            if (x.running) {\n                finish(x);\n                x.ctrl?.abort();\n            }\n        job.reject(err);\n        close(job);\n    }\n    function close(job) {\n        if (jobs.get(job.key) === job)\n            jobs.delete(job.key);\n        releaseLane(job);\n    }\n    /** \u96F6\u7F51\u7EDC\u5FEB\u7167\uFF08\u72B6\u6001\u6761\u7528\uFF09\uFF1Aprefix \u53EA\u770B\u67D0\u6587\u4EF6\u7684\uFF08key \u4EE5\u5B83\u5F00\u5934\uFF09\u3002 */\n    function status(prefix) {\n        const t = now();\n        let demand = 0, speculative = 0, queued = 0, oldest = 0, stalled = 0;\n        for (const j of jobs.values()) {\n            if (j.settled || (prefix !== undefined && !j.key.startsWith(prefix)))\n                continue;\n            if (j.demand)\n                demand++;\n            else if (j.startedAt >= 0)\n                speculative++;\n            else\n                queued++;\n            if (j.startedAt >= 0)\n                oldest = Math.max(oldest, t - j.startedAt);\n            const running = j.attempts.filter((a) => a.running);\n            if (stallMs !== null && running.length > 0 && running.every((a) => t - a.lastAt >= stallMs))\n                stalled++;\n        }\n        return { demand, speculative, queued, oldestMs: oldest, stalled };\n    }\n    return { request, status, stats, lanes, stallMs };\n}\n", "// \u26A0 store \u5185\u90E8\u6DF1\u6A21\u5757\u3002app \u4E0D\u76F4\u63A5 import\u2014\u2014\u7ECF createStore \u7684 file().openStream() / keepOffline()\u3002\n//\n// download-session\uFF08A1\uFF0C2026-08-15 user \u6279\uFF09\u2014\u2014 \u5927\u6587\u4EF6\u7684**\u5206\u7247\u4E0B\u8F7D\u4F1A\u8BDD** + `staging/` \u6682\u5B58\u533A + \u5168\u5C40\u8C03\u5EA6\u3002\n//   \u4E00\u4E2A\u4F1A\u8BDD = \u300C\u67D0\u6587\u4EF6\u67D0 eTag \u7248\u300D\u7684\u6309\u9700\u5206\u7247\u62C9\u53D6\uFF1A\u5206\u7247\u843D staging\uFF08tee\uFF09\uFF0C\u8BFB\u53D6\u4F18\u5148\u4ECE staging \u7B54\uFF1B\n//   \u6536\u5C3E\u4E8C\u9009\u4E00\uFF1Apromote\uFF08\u8865\u9F50\u7F3A\u53E3 \u2192 \u5347\u683C\u4E3A\u6B63\u5F0F\u672C\u5730\u526F\u672C\uFF0C= keepOffline \u5B8C\u6210\uFF09\u6216\u5F03\u7F6E\uFF08\u5206\u7247\u7559\u5728 staging\uFF0C\n//   \u53D7\u5168\u5C40\u5B57\u8282\u4E0A\u9650 FIFO \u515C\u5E95\u2014\u2014\u5148\u64AD\u540E pin \u4E0D\u91CD\u4E0B\u7684\u5173\u952E\uFF09\u3002\n//\n// \u7EAA\u5F8B\uFF08\u5BF9\u9F50\u8BA1\u5212 v2 + \u00A7A \u7EA2\u7EBF\uFF09\uFF1A\n//   \u00B7 staging **\u53EA\u88C5\u4E91\u7AEF\u62C9\u6765\u7684\u5B57\u8282**\uFF08re-fetchable by construction\uFF09\uFF0C\u6C38\u8FDC\u4E0D\u88C5 dirty/\u7528\u6237\u552F\u4E00\u526F\u672C\n//     \u2192 staging \u7684\u4EFB\u4F55\u6E05\u7406\u90FD\u7EDD\u4E0D\u4E22\u7528\u6237\u6570\u636E\uFF08\u4E0E\u300C\u65E0 LRU\u300D\u6559\u4E49\u4E0D\u51B2\u7A81\uFF1A\u8FD9\u662F scratch\uFF0C\u4E0D\u662F\u7F13\u5B58\u6CBB\u7406\u590D\u8F9F\uFF09\u3002\n//   \u00B7 promote \u7EDD\u4E0D\u8986\u76D6\u65E2\u6709\u672C\u5730\u526F\u672C\uFF1A\u672C\u5730\u5DF2\u6709\uFF08\u7528\u6237\u5176\u95F4\u6B63\u5E38 open \u8FC7\uFF09\u2192 \u76F4\u63A5\u6536\u644A\uFF1Bdirty \u66F4\u662F\u78B0\u90FD\u4E0D\u78B0\u3002\n//   \u00B7 \u8C03\u5EA6\uFF082.0.0 \u8D77\u4F4F chunk-scheduler.ts\uFF09\uFF1A\u8BFB\u53D6\uFF08\u64AD\u653E\uFF09\u4F18\u5148\uFF1B\u6295\u673A\uFF08prefetch / \u8865\u7F3A\u53E3\uFF09\u540C\u65F6\u5728\u98DE \u2264 lanes\uFF08\u4E0D\u4F20 = 1 = \u4E25\u683C\u4E32\u884C\uFF0C\n//     user \u663E\u5F0F\u9489\u6B7B\uFF09\uFF0C\u4E14\u64AD\u653E\u6709\u5206\u7247\u5728\u98DE/\u5728\u7B49\u65F6\u6295\u673A\u4E0D\u5F00\u65B0\u5206\u7247\uFF08\u5206\u7247\u7C92\u5EA6\u8BA9\u8DEF\uFF0C\u4E0D\u6740\u8BF7\u6C42\uFF09\u3002\n//   \u00B7 eTag \u9489\u7248\uFF1A\u4F1A\u8BDD\u5F00\u5728\u67D0\u4E00\u7248\u4E0A\uFF1Bpromote \u524D\u91CD\u9A8C fetchMeta\uFF0C\u7248\u53D8 \u2192 \u6E05\u672C name staging + \u629B EtagChangedError\u3002\n//   \u00B7 \u65F6\u95F4\u6233\uFF08meta.touched\uFF09\u53EA\u7528\u4E8E scratch \u6E05\u7406\u6392\u5E8F\uFF0C\u7EDD\u4E0D\u53C2\u4E0E\u4EFB\u4F55\u5185\u5BB9/\u7248\u672C\u51B3\u7B56\uFF08no-timestamps \u7EA2\u7EBF\uFF09\u3002\n//\n// 2.0.0\uFF082026-10-17 Claude Fable 5.1\uFF1Buser\u300C\u4F60\u73B0\u5728\u662Ffable\u4E86\uFF0C\u5F00\u59CB\u505A\u6D89\u53CA\u5E93\u7684\u6539\u52A8\u300D\uFF09\u2014\u2014`streaming` \u663E\u5F0F\u5F00\u5173\uFF08\u4E0D\u4F20 = 0.18 \u884C\u4E3A\uFF09\uFF1A\n//   \u00B7 lanes\uFF1A\u6295\u673A\u8F66\u9053\u6570\uFF1BstallMs\uFF1A\u5361\u4F4F\u5224\u5B9A\uFF08\u64AD\u653E\u5BF9\u51B2 / \u6295\u673A\u8BA9\u9053\uFF09\u2014\u2014\u653F\u7B56\u5168\u5728 chunk-scheduler.ts\u3002\n//   \u00B7 prefetch() \u5728 streaming \u6A21\u5F0F\u4E0B\u5931\u8D25\u5982\u5B9E reject\uFF08\u9884\u53D6\u65B9\u8981\u9760\u5B83\u5B66\u300C\u8FD9\u7247\u6CA1\u62C9\u5230\u300D\uFF09\uFF1B0.18 \u6A21\u5F0F\u7167\u65E7\u53EA log\u3002\n//   \u00B7 mirrors\uFF1A\u66FF\u4EE3\u6765\u6E90\uFF08\u672C\u673A\u6587\u4EF6 / \u5C40\u57DF\u7F51 / Tailscale\uFF09\uFF0C\u8EAB\u4EFD\u4ECD\u5F52\u4E91\u7AEF item\uFF1A\u5F00\u4F1A\u8BDD\u65F6\u6309\u540D\u5B57 + \u5C3A\u5BF8\u95EE\u955C\u50CF\u6709\u6CA1\u6709 \u2192\n//     \u6709\u5C31\u6392\u5728\u4E91\u7AEF\u524D\u9762\uFF1B\u51FA\u9519 / \u5361\u4F4F\u56DE\u843D\u4E91\u7AEF\u3001\u955C\u50CF\u8FDB\u51B7\u5374\uFF0830 s \u8D77\u7FFB\u500D\uFF0C\u5C01\u9876 10 min\uFF09\uFF1B\u955C\u50CF\u7ED9\u7684\u7247**\u62BD\u6837\u548C\u4E91\u7AEF\u6BD4\u5B57\u8282**\n//     \uFF08\u7B2C 1 \u7247\u5FC5\u6BD4\uFF0C\u4E4B\u540E\u6BCF 16 \u7247\u6BD4 1 \u7247\uFF09\u2014\u2014\u4E0D\u4E00\u6837 = \u8FD9\u4EFD\u6587\u4EF6\u8FD9\u4E00\u7248\u4E0D\u518D\u7528\u5B83\uFF0C\u5B83\u7ED9\u7684\u6CA1\u9A8C\u8FC7\u7684\u7247\u4E00\u5E76\u6E05\u6389\uFF08staging \u91CC\u54EA\u4E9B\u7247\n//     \u6765\u81EA\u955C\u50CF\u8BB0\u5728 meta.mirrored\uFF09\u3002\u4E91\u7AEF\u591F\u4E0D\u7740\u800C staging \u8D26\u4E0A\u6709\u8FD9\u4EFD\uFF08eTag / \u5C3A\u5BF8\u5DF2\u77E5\uFF09\u4E14\u955C\u50CF\u6709 \u2192 \u53EA\u7528\u955C\u50CF\u5F00\u4F1A\u8BDD\uFF08\u79BB\u7EBF\u4E5F\u80FD\u64AD\uFF09\u3002\n//   \u00B7 0.18 \u7684\u4E00\u4E2A\u4E92\u7B49\u4FEE\u4E86\uFF08chunk-scheduler \u5934\u6CE8\u91CA\uFF09\uFF0C\u4E0D\u5206\u6A21\u5F0F\u3002\n//\n// staging \u5206\u533A key \u5F62\uFF08schema v1\uFF0C2026-08-15 user \u8FC7\u76EE\u6539\u540D\u5B9A\u7A3F\uFF1A\u964C\u751F\u4EBA\u5F00 DevTools \u4E00\u773C\u53EF\u61C2\uFF09\uFF1A\n//   `meta:<name>`     \u2192 JSON { v:1, eTag, totalBytes, chunkBytes, chunks:[\u5206\u7247\u53F7\u2026], touchedAt, mirrored?:[\u5206\u7247\u53F7\u2026] }\n//                       \uFF08\u4F1A\u8BDD\u5143\u4FE1\u606F + \u5DF2\u6301\u6709\u5206\u7247\u8D26\uFF1Bmirrored = 2.0.0 \u52A0\u7684\u53EF\u9009\u5B57\u6BB5\uFF1A\u6765\u81EA\u955C\u50CF\u3001\u8FD8\u6CA1\u548C\u4E91\u7AEF\u6BD4\u8FC7\u7684\u7247\uFF09\n//   `chunk:<name>:<i>`\u2192 \u5206\u7247\u5B57\u8282 blob\uFF08i \u5341\u8FDB\u5236\uFF1Bname \u4E0D\u542B \":\"\u2014\u2014Windows \u975E\u6CD5\u5B57\u7B26\u5DF2\u88AB\u6587\u4EF6\u540D\u62A4\u680F\u6321\u5728\u95E8\u5916\uFF09\nimport { reportStoreError } from \"../base/error-handling.js\";\nimport { createChunkScheduler } from \"./chunk-scheduler.js\";\nexport { StreamStallError } from \"./chunk-scheduler.js\";\n/** eTag \u9489\u7248\u5931\u6548\uFF1A\u4E91\u7AEF\u5728\u4F1A\u8BDD\u671F\u95F4\u6362\u4E86\u7248\u3002caller \u6E05\u969C\u540E\u53EF\u91CD\u5F00\u4F1A\u8BDD\u3002 */\nexport class EtagChangedError extends Error {\n    constructor(name) { super(`\u4E91\u7AEF\u6587\u4EF6\u5DF2\u66F4\u65B0\uFF0C\u4E0B\u8F7D\u4F1A\u8BDD\u5931\u6548\uFF1A${name}`); this.name = \"EtagChangedError\"; }\n}\nconst CHUNK_DEFAULT = 2 * 1024 * 1024;\nconst CAP_DEFAULT = 256 * 1024 * 1024;\nconst VERIFY_EVERY = 16; // \u955C\u50CF\u7ED9\u7684\u7247\uFF1A\u7B2C 1 \u7247\u5FC5\u6BD4\uFF0C\u4E4B\u540E\u6BCF 16 \u7247\u62BD 1 \u7247\u548C\u4E91\u7AEF\u6BD4\nconst MIRROR_COOLDOWN_MS = 30_000; // \u955C\u50CF\u51FA\u9519\u540E\u7684\u51B7\u5374\uFF0C\u8FDE\u7EED\u51FA\u9519\u7FFB\u500D\nconst MIRROR_COOLDOWN_MAX_MS = 10 * 60_000;\nconst mKey = (name) => `meta:${name}`;\nconst cKey = (name, i) => `chunk:${name}:${i}`;\nexport function createDownloadSessions(cfg) {\n    const { staging, fetchMeta, range, adoptLocal } = cfg;\n    const chunkSize = cfg.chunkSize ?? CHUNK_DEFAULT;\n    const capBytes = cfg.capBytes ?? CAP_DEFAULT;\n    const now = cfg.now ?? (() => Date.now());\n    const streaming = cfg.streaming; // undefined = 0.18 \u884C\u4E3A\n    const lanes = Math.max(1, Math.floor(streaming?.lanes ?? 1));\n    const hotMs = cfg.hotMs ?? 60_000;\n    const blockEviction = !!streaming; // 2.1.5\uFF1A\u6309\u5757\u6DD8\u6C70\u53EA\u5728 2.0 \u6D41\u5F0F\u6A21\u5F0F\uFF08\u663E\u5F0F\u5F00\u5173\u7684\u4F1E\u4E0B\uFF09\uFF1B0.18 \u6A21\u5F0F\u7167\u65E7\u6574\u7EC4 FIFO\n    // \u2500\u2500 \u8C03\u5EA6\uFF08\u6A21\u5757\u7EA7 = \u5168 store \u4E00\u4E2A\u8C03\u5EA6\u57DF\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const scheduler = createChunkScheduler({ lanes, stallMs: streaming?.stallMs, now });\n    const activeSessions = new Set(); // cap \u6E05\u7406\u7EDD\u4E0D\u52A8\u5728\u7528\u4F1A\u8BDD\u7684\u7EC4\uFF080.18 \u6A21\u5F0F\uFF09\uFF1B\u6309\u5757\u6DD8\u6C70\u53EA\u52A8\u5B83\u51B7\u6389\u7684\u5757\n    const liveMeta = new Map(); // \u5728\u7528\u4F1A\u8BDD\u7684\u5185\u5B58\u8D26\uFF08coverage \u770B\u5B83\uFF1A\u5B57\u8282\u4E00\u5230\u8D26\u5C31\u5BF9\uFF0C\u4E0D\u7B49\u843D\u76D8\uFF09\n    const evictHooks = new Map(); // 2.1.5\uFF1A\u6309\u5757\u6DD8\u6C70\u65F6\u901A\u77E5\u5728\u7528\u4F1A\u8BDD\u628A\u5185\u5B58\u8D26\uFF08got / mirrored\uFF09\u540C\u6B65\u5212\u6389\n    let estTotal = null; // 2.1.5\uFF1Astaging \u5360\u7528\u4F30\u8BA1\uFF08\u5230\u8D26 += / \u6DD8\u6C70 -=\uFF1Bnull = \u4E0B\u6B21 enforceCap \u91CD\u7B97\uFF09\uFF0C\u4E0D\u8D85\u9650\u4E0D\u626B keys\n    const mirrorHealth = new Map(); // \u6BCF\u4E2A\u955C\u50CF\u4E00\u4EFD\uFF08store \u5B9E\u4F8B\u7EA7\u3001\u5185\u5B58\uFF09\n    const mirrorRejected = new Set(); // `${name}@${eTag}@${label}`\uFF1A\u5B57\u8282\u548C\u4E91\u7AEF\u4E0D\u4E00\u6837\uFF0C\u8FD9\u4E00\u7248\u4E0D\u518D\u7528\n    // \u2500\u2500 staging \u8BB0\u8D26\uFF08**\u5168\u90E8 best-effort**\uFF1Astaging \u662F\u52A0\u901F\u5668\u4E0D\u662F\u6B63\u786E\u6027\u4F9D\u8D56\u2014\u2014IDB \u574F\u4E86/\u914D\u989D\u6EE1\uFF0C\n    //   \u4F1A\u8BDD\u7167\u6837\u76F4\u8FDE\u4E91\u7AEF\u6D41\u5B57\u8282\uFF0Cpromote \u7EC4\u88C5\u7F3A\u7247\u76F4\u63A5\u91CD\u62C9\u8865\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const sGet = async (k) => { try {\n        return await staging.get(k);\n    }\n    catch (e) {\n        reportStoreError(e, \"log\");\n        return null;\n    } };\n    const sPut = async (k, b) => { try {\n        await staging.put(k, b);\n    }\n    catch (e) {\n        reportStoreError(e, \"log\");\n    } };\n    const sDel = async (k) => { try {\n        await staging.del(k);\n    }\n    catch (e) {\n        reportStoreError(e, \"log\");\n    } };\n    async function readMeta(name) {\n        try {\n            const b = await sGet(mKey(name));\n            if (!b)\n                return null;\n            const p = JSON.parse(await b.text());\n            return p?.v === 1 && typeof p.eTag === \"string\" && Array.isArray(p.chunks) ? p : null;\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n            return null;\n        }\n    }\n    async function writeMeta(name, m) {\n        await sPut(mKey(name), new Blob([JSON.stringify(m)], { type: \"application/json\" }));\n    }\n    /** \u6E05\u67D0 name \u7684\u6574\u7EC4 staging\uFF08meta + \u5168\u90E8\u5206\u7247\uFF09\u3002 */\n    async function purgeName(name) {\n        estTotal = null;\n        const lm = liveMeta.get(name); // \u5728\u7528\u4F1A\u8BDD\u7684\u5185\u5B58\u8D26\u4E5F\u6E05\u7A7A\uFF08promote \u5347\u683C / \u6362\u7248\uFF09\uFF1Agot \u5212\u6389\u3001close \u65F6\u4E0D\u518D\u628A\u65E7\u8D26\u5199\u56DE\n        if (lm) {\n            for (const i of lm.chunks)\n                evictHooks.get(name)?.(i);\n            lm.chunks = [];\n            lm.mirrored = undefined;\n            lm.hot = undefined;\n            lm.hits = undefined;\n        }\n        try {\n            const prefix = `chunk:${name}:`;\n            for (const k of await staging.keys())\n                if (k === mKey(name) || k.startsWith(prefix))\n                    await staging.del(k);\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n        } // \u6E05\u7406 best-effort\uFF08staging \u574F\u4E86\u4E0D\u62E6\u4E3B\u6D41\u7A0B\uFF09\n    }\n    const chunkLenOf = (m, i) => Math.min(m.chunkBytes, m.totalBytes - i * m.chunkBytes);\n    const metaBytes = (m) => m.chunks.reduce((s, i) => s + chunkLenOf(m, i), 0);\n    // \u5168\u5C40 cap \u515C\u5E95\uFF1A\u4F30\u7B97\u5360\u7528\uFF08got.length\u00D7chunk\uFF09\uFF0C\u8D85\u9650\u6E05 touched \u6700\u65E7\u7684\u6574\u7EC4\uFF08scratch FIFO\uFF1B\u8DF3\u8FC7\u5728\u7528\u4F1A\u8BDD\uFF09\u3002\n    async function enforceCap() {\n        try {\n            if (estTotal !== null && estTotal <= capBytes)\n                return; // 2.1.5\uFF1A\u4F30\u8BA1\u6CA1\u8D85\u9650\u5C31\u4E0D\u626B keys\uFF08\u6BCF\u7247\u5230\u8D26\u90FD\u4F1A\u8C03\uFF0C\u522B\u6BCF\u6B21\u5168\u8868\u8D70\uFF09\n            const metas = [];\n            for (const k of await staging.keys()) {\n                if (!k.startsWith(\"meta:\"))\n                    continue;\n                const name = k.slice(5);\n                const meta = liveMeta.get(name) ?? await readMeta(name); // \u5728\u7528\u4F1A\u8BDD\u7528\u5185\u5B58\u8D26\uFF08\u548C\u5B83\u7684 got \u540C\u4E00\u4E2A\u5BF9\u8C61\uFF09\uFF0C\u6DD8\u6C70\u624D\u80FD\u540C\u6B65\u5212\u6389\n                if (meta)\n                    metas.push({ name, meta });\n            }\n            let total = metas.reduce((s, x) => s + metaBytes(x.meta), 0);\n            estTotal = total;\n            if (total <= capBytes)\n                return;\n            if (!blockEviction) {\n                // 0.18 \u6A21\u5F0F\uFF1A\u6574\u7EC4 FIFO\uFF08\u6700\u65E7 touched \u7684\u6574\u7EC4\u5148\u6E05\uFF1B\u5728\u7528\u4F1A\u8BDD\u4E0D\u6E05\uFF09\n                metas.sort((a, b) => a.meta.touchedAt - b.meta.touchedAt); // \u53EA\u6392 scratch \u6E05\u7406\u987A\u5E8F\uFF0C\u975E\u5185\u5BB9\u51B3\u7B56\n                for (const { name, meta } of metas) {\n                    if (total <= capBytes)\n                        break;\n                    if (activeSessions.has(name))\n                        continue;\n                    const n = metaBytes(meta);\n                    await purgeName(name);\n                    total -= n;\n                }\n                estTotal = total;\n                return;\n            }\n            // 2.1.5 \u6309\u5757\u6DD8\u6C70\uFF08user 10-21\u300Cstore \u7684\u5176\u4ED6\u505A\u300D\uFF1B\u9884\u53D6\u5E93\u51FA\u751F\u7A3F\u300C\u6309\u5757\u7684\u6DD8\u6C70 + \u9489\u70ED\u96C6\u300D\uFF09\uFF1A\n            //   \u5019\u9009 = \u6240\u6709\u8D26\u4E0A\u7684\u5757\uFF0C**\u9664\u4E86**\u5728\u7528\u4F1A\u8BDD\u91CC hotMs \u4EE5\u5185\u78B0\u8FC7\u7684\uFF08\u9489\u70ED\u96C6\uFF1A\u6B63\u5728\u73A9\u7684\u90A3\u4E00\u6BB5\u3001\u9884\u53D6\u5E93\u521A\u6295\u673A\u62C9\u6765\u7684\uFF09\u3002\n            //   \u6DD8\u6C70\u987A\u5E8F\uFF1A\u4E0D\u5728\u7528\u7684\u4F1A\u8BDD\u5148\u4E8E\u5728\u7528\u7684\uFF1B\u547D\u4E2D\u6B21\u6570\u5C11\u7684\u5148\uFF08\u4E00\u6B21\u6027\u987A\u5E8F\u626B\u8FC7\u7684\u5757 hits=0 \u2192 \u6BD4\u53CD\u590D\u7528\u5230\u7684\u5757\u5148\u8D70\uFF0C\u6297\u626B\u63CF\u6C61\u67D3\uFF09\uFF1B\u518D\u6700\u4E45\u6CA1\u78B0\u7684\u5148\u3002\n            //   \u4E0D\u662F LRU \u6574\u7EC4\uFF1A\u6B63\u5728\u73A9\u7684\u76D8\u4E5F\u80FD\u628A\u65E9\u5C31\u7FFB\u8FC7\u53BB\u7684\u6BB5\u653E\u6389\uFF08\u4EE5\u524D\u5728\u7528\u4F1A\u8BDD\u4E00\u4E2A\u5B57\u8282\u90FD\u4E0D\u6E05 \u2192 \u6682\u5B58\u533A\u80FD\u957F\u5230\u4E0A\u9650\u4E4B\u5916\uFF09\u3002\n            const t = now();\n            const cands = [];\n            for (const { name, meta } of metas) {\n                const active = activeSessions.has(name) ? 1 : 0;\n                for (const i of meta.chunks) {\n                    const hot = meta.hot?.[String(i)] ?? meta.touchedAt;\n                    if (active && t - hot < hotMs)\n                        continue;\n                    cands.push({ name, meta, i, active, hits: meta.hits?.[String(i)] ?? 0, hot });\n                }\n            }\n            cands.sort((a, b) => a.active - b.active || a.hits - b.hits || a.hot - b.hot);\n            const touched = new Map();\n            for (const c of cands) {\n                if (total <= capBytes)\n                    break;\n                await sDel(cKey(c.name, c.i));\n                const m = c.meta;\n                m.chunks = m.chunks.filter((x) => x !== c.i);\n                if (m.mirrored) {\n                    m.mirrored = m.mirrored.filter((x) => x !== c.i);\n                    if (!m.mirrored.length)\n                        m.mirrored = undefined;\n                }\n                if (m.hot)\n                    delete m.hot[String(c.i)];\n                if (m.hits)\n                    delete m.hits[String(c.i)];\n                evictHooks.get(c.name)?.(c.i);\n                total -= chunkLenOf(m, c.i);\n                touched.set(c.name, m);\n            }\n            for (const [name, m] of touched) {\n                if (m.chunks.length === 0 && !activeSessions.has(name))\n                    await sDel(mKey(name)); // \u6574\u7EC4\u90FD\u8D70\u4E86\uFF1A\u8D26\u4E5F\u4E0D\u7559\n                else\n                    await writeMeta(name, m);\n            }\n            estTotal = total;\n        }\n        catch (e) {\n            reportStoreError(e, \"log\");\n        } // cap \u6E05\u7406\u5931\u8D25\u65E0\u5BB3\uFF08\u4E0B\u6B21\u518D\u6E05\uFF09\uFF1B\u7EDD\u4E0D\u5F71\u54CD\u4E3B\u6D41\u7A0B\n    }\n    /** \u8986\u76D6\u5FEB\u7167\uFF08\u53EA\u8BFB\u8D26\u672C\uFF0C\u96F6\u7F51\u7EDC\uFF09\u3002\u65E0\u6B8B\u7247 \u2192 null\u3002 */\n    async function coverage(name) {\n        const m = liveMeta.get(name) ?? await readMeta(name);\n        if (!m)\n            return null;\n        const nChunks = Math.max(1, Math.ceil(m.totalBytes / m.chunkBytes));\n        const got = new Set(m.chunks);\n        const sizeOf = (i) => Math.min(m.chunkBytes, m.totalBytes - i * m.chunkBytes);\n        let bytes = 0;\n        for (const i of got)\n            if (i >= 0 && i < nChunks)\n                bytes += sizeOf(i);\n        let headBytes = 0;\n        for (let i = 0; i < nChunks && got.has(i); i++)\n            headBytes += sizeOf(i);\n        return { totalBytes: m.totalBytes, bytes, headBytes, complete: headBytes === m.totalBytes, eTag: m.eTag };\n    }\n    /** \u79BB\u7EBF\u5347\u683C\uFF08A6\uFF0C2026-08-19 user \u6279\uFF09\uFF1Astaging \u8D26**\u5B8C\u6574**\u65F6\u96F6\u7F51\u7EDC\u7EC4\u88C5\u843D\u5730\uFF0C\u8C31\u7CFB\u8BB0\u8D26\u4E0A\u7684 eTag\u3002\n     *  \u7EA2\u7EBF\u5206\u6790\uFF1A\u7B49\u4EF7\u4E8E\u300C\u65E9\u5148\u62C9\u8FC7\u8BE5\u7248\u3001\u4E91\u7AEF\u5176\u540E\u53C8\u52A8\u300D\u7684\u6B63\u5E38 clean \u9648\u65E7\u6001\u2014\u2014\u56DE\u7EBF\u540E freshness/pull\n     *  \u7167\u5E38\u6821\u9A8C\u6536\u655B\uFF1BadoptLocal \u539F\u6709\u62A4\u680F\u4E0D\u53D8\uFF08\u5DF2\u6709\u526F\u672C/dirty \u7EDD\u4E0D\u8986\u76D6\uFF0Cfalse \u4E5F\u7167\u6837\u6536\u644A\u6E05\u8D26\uFF09\u3002\n     *  \u8D26\u6CA1\u6709 \u2192 \"none\"\uFF1B\u7F3A\u7247/\u5C3A\u5BF8\u4E0D\u7B26 \u2192 \"incomplete\"\uFF08**\u4E0D\u6E05\u8D26**\u2014\u2014\u6B8B\u7247\u4ECD\u6709\u590D\u7528\u4EF7\u503C\uFF0Ccaller \u62A5\u4EBA\u8BDD\uFF09\u3002 */\n    async function promoteFromStaging(name) {\n        const m = await readMeta(name);\n        if (!m)\n            return \"none\";\n        const nChunks = Math.max(1, Math.ceil(m.totalBytes / m.chunkBytes));\n        const parts = [];\n        let size = 0;\n        for (let i = 0; i < nChunks; i++) {\n            const c = await sGet(cKey(name, i));\n            if (!c)\n                return \"incomplete\";\n            parts.push(c);\n            size += c.size;\n        }\n        if (size !== m.totalBytes)\n            return \"incomplete\"; // \u8D26/\u5B57\u8282\u4E0D\u7B26\uFF1A\u5B81\u53EF\u62A5\u4E0D\u5B8C\u6574\u4E5F\u7EDD\u4E0D\u843D\u9519\u5C3A\u5BF8\u526F\u672C\n        await adoptLocal(name, new Blob(parts), m.eTag);\n        await purgeName(name);\n        return \"done\";\n    }\n    // \u2500\u2500 \u955C\u50CF\u5065\u5EB7\uFF08store \u5B9E\u4F8B\u7EA7\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const healthOf = (src) => { let h = mirrorHealth.get(src); if (!h)\n        mirrorHealth.set(src, (h = { failures: 0, downUntil: 0 })); return h; };\n    const mirrorUp = (src) => now() >= healthOf(src).downUntil;\n    const mirrorFailed = (src) => {\n        const h = healthOf(src);\n        h.failures++;\n        h.downUntil = now() + Math.min(MIRROR_COOLDOWN_MS * 2 ** (h.failures - 1), MIRROR_COOLDOWN_MAX_MS);\n    };\n    const mirrorOk = (src) => { const h = healthOf(src); h.failures = 0; h.downUntil = 0; };\n    const sameBytes = (a, b) => {\n        if (a.length !== b.length)\n            return false;\n        for (let i = 0; i < a.length; i++)\n            if (a[i] !== b[i])\n                return false;\n        return true;\n    };\n    // \u2500\u2500 \u4F1A\u8BDD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    async function open(name) {\n        // \u4E91\u7AEF\u5143\u4FE1\u606F\uFF1A\u9489\u7248\u4E8B\u5B9E\u3002\u591F\u4E0D\u7740\u65F6\uFF082.0.0 streaming \u6A21\u5F0F\uFF09\u770B staging \u8D26 + \u955C\u50CF\u80FD\u4E0D\u80FD\u6491\u8D77\u4E00\u4E2A\u300C\u65E0\u4E91\u300D\u4F1A\u8BDD\u3002\n        let cm0 = null, cloudErr = null;\n        try {\n            cm0 = await fetchMeta(name);\n        }\n        catch (e) {\n            cloudErr = e;\n        }\n        const prev = await readMeta(name);\n        const mirrorList = streaming?.mirrors?.() ?? [];\n        let etag, size, item;\n        if (cm0) {\n            ({ etag, size, item } = cm0);\n        }\n        else if (prev && mirrorList.length > 0) {\n            etag = prev.eTag;\n            size = prev.totalBytes;\n            item = null;\n        } // \u65E0\u4E91\u4F1A\u8BDD\uFF1A\u8EAB\u4EFD = \u8D26\u4E0A\u90A3\u4E00\u7248\n        else {\n            if (cloudErr)\n                throw cloudErr;\n            return null;\n        }\n        // staging \u91CC\u82E5\u6709**\u522B\u7684\u7248**\u7684\u6B8B\u7247 \u2192 \u6E05\uFF08eTag \u9489\u7248\uFF09\uFF1B\u540C\u7248 \u2192 \u7EED\u7528\uFF08\u5148\u64AD\u540E pin \u4E0D\u91CD\u4E0B\u7684\u53E6\u4E00\u534A\uFF1A\u8DE8\u4F1A\u8BDD\u7EED\uFF09\u3002\n        if (prev && prev.eTag !== etag)\n            await purgeName(name);\n        const meta = (prev && prev.eTag === etag)\n            ? { ...prev, touchedAt: now() }\n            : { v: 1, eTag: etag, totalBytes: size, chunkBytes: chunkSize, chunks: [], touchedAt: now() };\n        const got = new Set(meta.chunks);\n        const mirrored = new Set(meta.mirrored ?? []);\n        await writeMeta(name, meta);\n        // 2.1.5 \u6309\u5757\u6DD8\u6C70\u7684\u8BB0\u8D26\uFF1A\u5230\u8D26 = \u70ED\u30010 \u547D\u4E2D\uFF1B\u4ECE staging \u547D\u4E2D = \u70ED\u3001\u547D\u4E2D +1\uFF08\u5C01\u9876 8\uFF09\u3002\u547D\u4E2D\u53EA\u6539\u5185\u5B58\u8D26\u3001\u6700\u591A\u6BCF 2 s \u843D\u4E00\u6B21\u76D8\uFF08\u6DD8\u6C70\u987A\u5E8F\u662F best-effort\uFF0C\u4E0D\u503C\u5F97\u6BCF\u6B21\u8BFB\u90FD\u5199 IDB\uFF09\u3002\n        let lastHotFlush = now();\n        const touch = (i, hit) => {\n            const k = String(i), t = now();\n            (meta.hot ??= {})[k] = t;\n            if (hit)\n                (meta.hits ??= {})[k] = Math.min(8, (meta.hits[k] ?? 0) + 1);\n            else\n                (meta.hits ??= {})[k] ??= 0;\n            if (hit && t - lastHotFlush >= 2000) {\n                lastHotFlush = t;\n                void writeMeta(name, meta);\n            }\n        };\n        evictHooks.set(name, (i) => { got.delete(i); mirrored.delete(i); verifiedEvict(i); });\n        const nChunks = Math.max(1, Math.ceil(size / chunkSize));\n        let closed = false;\n        // \u955C\u50CF\uFF1A\u7B2C\u4E00\u4E2A\u300C\u5065\u5EB7\u3001\u6CA1\u88AB\u62D2\u3001\u6709\u8FD9\u4EFD\uFF08\u540C\u540D\u540C\u5C3A\u5BF8\uFF09\u300D\u7684\u3002\u65E0\u4E91\u4F1A\u8BDD\uFF1A\u955C\u50CF\u662F\u552F\u4E00\u6765\u6E90\uFF0C\u51B7\u5374\u4E0D\u7B97\uFF08\u6CA1\u522B\u7684\u53EF\u9000\uFF09\u3002\n        let mirror = null;\n        let mirrorState = \"none\";\n        for (const src of mirrorList) {\n            if (mirrorRejected.has(`${name}@${etag}@${src.label}`)) {\n                mirrorState = \"rejected\";\n                continue;\n            }\n            if (item !== null && !mirrorUp(src)) {\n                mirrorState = \"down\";\n                continue;\n            }\n            let handle = null;\n            try {\n                handle = await src.open(name, size);\n            }\n            catch (e) {\n                reportStoreError(e, \"log\");\n            }\n            if (handle) {\n                mirror = { src, handle };\n                mirrorState = \"ok\";\n                break;\n            }\n        }\n        if (item === null && !mirror) {\n            if (cloudErr)\n                throw cloudErr;\n            return null;\n        } // \u65E0\u4E91\u53C8\u65E0\u955C\u50CF\uFF1A\u8BDA\u5B9E\n        activeSessions.add(name);\n        liveMeta.set(name, meta);\n        let mirrorChunks = 0; // \u8FD9\u4F1A\u8BDD\u4ECE\u955C\u50CF\u4EA4\u51FA\u53BB\u7684\u7247\u6570\uFF08\u62BD\u6837\u8282\u62CD\uFF09\n        let firstOk = false; // \u955C\u50CF\u7684\u7B2C\u4E00\u7247\u5DF2\u548C\u4E91\u7AEF\u6BD4\u8FC7\u3001\u4E00\u6837\n        let firstCheck = null; // \u5E76\u53D1\u7684\u5934\u51E0\u7247\u5171\u7528\u4E00\u6B21\u6838\u5BF9\uFF08\u4E0D\u6BCF\u7247\u90FD\u6253\u4E91\u7AEF\uFF09\n        const verified = new Set(); // \u8FD9\u4F1A\u8BDD\u91CC\u5DF2\u548C\u4E91\u7AEF\u6BD4\u8FC7\u3001\u4E00\u6837\u7684\u955C\u50CF\u7247\uFF08arrived \u4E0D\u518D\u8BB0\u8FDB mirrored\uFF09\n        const verifiedEvict = (i) => { verified.delete(i); };\n        const chunkOff = (i) => i * chunkSize;\n        const chunkLen = (i) => Math.min(chunkSize, size - chunkOff(i));\n        /** \u955C\u50CF\u5B57\u8282\u548C\u4E91\u7AEF\u4E0D\u4E00\u6837\uFF1A\u8FD9\u4E00\u7248\u4E0D\u518D\u7528\u5B83\uFF1B\u5B83\u7ED9\u7684\u3001\u8FD8\u6CA1\u9A8C\u8FC7\u7684\u7247\u5168\u90E8\u6E05\u6389\uFF08\u5728\u5185\u5B58\u8D26\u548C staging \u91CC\u4E00\u8D77\u5220\uFF09\u3002 */\n        async function rejectMirror(reason) {\n            if (!mirror)\n                return;\n            const { src } = mirror;\n            mirror = null;\n            mirrorState = \"rejected\";\n            mirrorRejected.add(`${name}@${etag}@${src.label}`);\n            const bad = [...mirrored];\n            for (const i of bad) {\n                got.delete(i);\n                mirrored.delete(i);\n                await sDel(cKey(name, i));\n            }\n            meta.chunks = [...got];\n            meta.mirrored = [];\n            await writeMeta(name, meta);\n            reportStoreError(new Error(`mirror \"${src.label}\" served different bytes for \"${name}\" (${reason}); dropped it for this version and purged ${bad.length} unverified chunk(s)`), \"warning\");\n        }\n        /** \u62BD\u6837\u6838\u5BF9\uFF08\u4E8B\u540E\u3001\u5F02\u6B65\uFF09\uFF1A\u955C\u50CF\u7ED9\u7684\u6BCF VERIFY_EVERY \u7247\u6BD4 1 \u7247\u3002\u4E91\u7AEF\u591F\u4E0D\u7740 \u2192 \u6CA1\u7ED3\u8BBA\uFF08\u4E0D\u52A8\uFF09\u3002\n         *  \u4E00\u6837 \u2192 \u8FD9\u7247\u4ECE\u300C\u6CA1\u9A8C\u8FC7\u300D\u91CC\u5212\u6389\uFF1B\u4E0D\u4E00\u6837 \u2192 \u62D2\u6389\u955C\u50CF\u3001\u6E05\u5B83\u6CA1\u9A8C\u8FC7\u7684\u7247\uFF08\u8FD9\u7247\u5DF2\u7ECF\u4EA4\u51FA\u53BB\u4E86\u2014\u2014\u540C\u5C3A\u5BF8\u3001\u53EA\u6709\u4E2D\u6BB5\u4E0D\u540C\u7684\u6587\u4EF6\u53EA\u80FD\u9760\u62BD\u6837\uFF0C\u6B8B\u4F59\u98CE\u9669\u5982\u5B9E\u8BB0\u5728\u53D1\u7248\u8BF4\u660E\uFF09\u3002\n         *  seq = \u8FD9\u7247\u662F\u955C\u50CF\u4EA4\u51FA\u7684\u7B2C\u51E0\u7247\uFF0C**\u5728\u5230\u8FBE\u90A3\u4E00\u523B\u5B9A**\uFF082.1.3 \u4FEE\uFF1A\u4EE5\u524D\u5728 await \u843D staging \u4E4B\u540E\u624D\u770B\u8BA1\u6570\uFF0C\u4E09\u8DEF\u5E76\u53D1\u65F6\u7B2C 16 \u7247\u9192\u6765\u8BA1\u6570\u5DF2\u662F 17\u300118 \u2192 \u62BD\u6837\u88AB\u7CFB\u7EDF\u6027\u8DF3\u8FC7\uFF1B\n         *  test/download-session\u300C\u5E76\u53D1\u4E0B\u4E5F\u6309\u8282\u62CD\u62BD\u300D\u9489\u7740\uFF09\u3002 */\n        async function sampleVerify(i, bytes, seq) {\n            if (item === null || !mirror || verified.has(i))\n                return;\n            if (seq % VERIFY_EVERY !== 0)\n                return;\n            let ref = null;\n            try {\n                ref = await range(item, chunkOff(i), chunkLen(i));\n            }\n            catch (e) {\n                reportStoreError(e, \"log\");\n                return;\n            }\n            if (!mirror)\n                return; // \u5176\u95F4\u5DF2\u88AB\u522B\u7684\u6838\u5BF9\u62D2\u6389\n            if (sameBytes(ref, bytes)) {\n                verified.add(i);\n                if (mirrored.delete(i)) {\n                    meta.mirrored = mirrored.size ? [...mirrored] : undefined;\n                    await writeMeta(name, meta);\n                }\n            }\n            else\n                await rejectMirror(`chunk ${i}`);\n        }\n        /** \u5B57\u8282\u5230\u4E86\uFF08\u8D62\u5BB6 / \u8F93\u5BB6 / \u665A\u5230\u7684\u90FD\u6765\uFF09\uFF1A\u5148\u8BB0\u5185\u5B58\u8D26\uFF08\u540C\u6B65\u2014\u2014\u8C03\u5EA6\u5668\u5728 resolve \u4E4B\u524D\u53EB\u5B83\uFF0C\u7B49\u5B57\u8282\u7684\u4EBA\u9192\u6765\u65F6\u8D26\u5DF2\u7ECF\u5BF9\uFF09\uFF0C\n         *  \u518D\u843D staging\u3001\u518D\u5199 meta\uFF08\u5148\u7247\u540E\u8D26\uFF1A\u5D29\u5728\u4E2D\u95F4\u4E5F\u4E0D\u4F1A\u8D26\u4E0A\u6709\u7247\u3001\u76D8\u4E0A\u6CA1\u7247\uFF09\u3002\u843D\u76D8\u5931\u8D25\u53EA log\u2014\u2014staging \u662F\u52A0\u901F\u5668\u4E0D\u662F\u6B63\u786E\u6027\u4F9D\u8D56\u3002 */\n        async function arrived(i, bytes, origin) {\n            if (origin === \"mirror\" && !mirror)\n                return; // \u955C\u50CF\u5DF2\u88AB\u62D2\uFF1A\u5B83\u665A\u5230\u7684\u5B57\u8282\u4E0D\u8981\n            let changed = false;\n            if (!got.has(i)) {\n                got.add(i);\n                changed = true;\n                if (estTotal !== null)\n                    estTotal += chunkLen(i);\n            }\n            touch(i, false);\n            if (origin === \"mirror\" && !verified.has(i) && !mirrored.has(i)) {\n                mirrored.add(i);\n                changed = true;\n            }\n            if (changed) {\n                meta.chunks = [...got];\n                meta.mirrored = mirrored.size ? [...mirrored] : undefined;\n                meta.touchedAt = now();\n            }\n            const seq = origin === \"mirror\" ? ++mirrorChunks : 0; // \u62BD\u6837\u8282\u62CD\u5728\u5230\u8FBE\u90A3\u4E00\u523B\u5B9A\uFF082.1.3\uFF09\n            await sPut(cKey(name, i), new Blob([bytes]));\n            if (changed)\n                await writeMeta(name, meta);\n            void enforceCap();\n            if (origin === \"mirror\")\n                void sampleVerify(i, bytes, seq);\n        }\n        /** \u8FD9\u4E00\u7247\u7684\u6765\u6E90\uFF08\u6309\u504F\u597D\uFF09\uFF1A\u5065\u5EB7\u7684\u955C\u50CF\u5728\u524D\u3001\u4E91\u7AEF\u5728\u540E\u3002\u955C\u50CF\u7684\u6210\u8D25\u56DE\u5199\u5065\u5EB7\u8868\u3002\n         *  \u955C\u50CF\u7ED9\u7684**\u7B2C\u4E00\u7247\u5148\u548C\u4E91\u7AEF\u6BD4\u8FC7\u518D\u4EA4\u51FA\u53BB**\uFF08\u9519\u76D8 / \u6362\u8FC7\u5BC6\u94A5\u7684\u65E7\u5BB9\u5668\u4E00\u4E2A\u5B57\u8282\u90FD\u4E0D\u4EA4\uFF09\uFF1A\u4E0D\u4E00\u6837 \u2192 \u62D2\u6389\u955C\u50CF\u3001\u8FD9\u8DEF\u4EE5\u9519\u5931\u8D25 \u2192 \u8C03\u5EA6\u5668\u56DE\u843D\u4E91\u7AEF\u3002\n         *  \u4E91\u7AEF\u90A3\u4E00\u4E0B\u591F\u4E0D\u7740 \u2192 \u8FD9\u7247\u4E0D\u7B97\u6838\u5BF9\u8FC7\uFF08\u4E0B\u4E00\u7247\u518D\u6BD4\uFF09\uFF0C\u5B57\u8282\u7167\u4EA4\u2014\u2014\u955C\u50CF\u5728\u3001\u4E91\u7AEF\u4E0D\u5728\uFF0C\u8BDA\u5B9E\u7684\u6700\u597D\u7ED3\u679C\u3002 */\n        function sourcesFor(i) {\n            const off = chunkOff(i), len = chunkLen(i);\n            const list = [];\n            if (mirror && (item === null || mirrorUp(mirror.src))) { // \u65E0\u4E91\u4F1A\u8BDD\uFF1A\u955C\u50CF\u662F\u552F\u4E00\u6765\u6E90\uFF0C\u51B7\u5374\u4E0D\u7B97\n                const m = mirror;\n                list.push({\n                    origin: \"mirror\",\n                    fetch: async (o) => {\n                        try {\n                            const b = await m.handle.read(off, len, o);\n                            if (b.length !== len)\n                                throw new Error(`mirror \"${m.src.label}\": chunk ${i} returned ${b.length} bytes, wanted ${len}`);\n                            if (streaming?.verifyChunk && mirror === m) { // 2.2.0\uFF1A\u5BBF\u4E3B\u7684\u54C8\u5E0C\u8868\u5148\u6838\uFF08\u6709\u7ED3\u8BBA\u5C31\u4E0D\u7528\u62BD\u6837\uFF09\n                                let verdict = null;\n                                try {\n                                    verdict = await streaming.verifyChunk({ name, index: i, offset: off, length: len, origin: \"mirror\" }, b);\n                                }\n                                catch (e) {\n                                    reportStoreError(e, \"log\");\n                                    verdict = null;\n                                } // \u5BBF\u4E3B\u6838\u4E0D\u4E86\uFF08\u8868\u7F3A / \u81EA\u5DF1\u629B\uFF09= \u6CA1\u7ED3\u8BBA\n                                if (verdict === false) {\n                                    await rejectMirror(`host verify chunk ${i}`);\n                                    throw new Error(`mirror \"${m.src.label}\": chunk ${i} failed the host's integrity check`);\n                                }\n                                if (verdict === true)\n                                    verified.add(i);\n                            }\n                            if (!firstOk && item !== null && mirror === m) {\n                                let checker = false;\n                                if (!firstCheck) {\n                                    checker = true;\n                                    firstCheck = range(item, off, len).then((ref) => (sameBytes(ref, b) ? \"same\" : \"differs\"), (e) => { reportStoreError(e, \"log\"); return \"unknown\"; });\n                                }\n                                const r = await firstCheck;\n                                if (r === \"differs\") {\n                                    if (checker)\n                                        await rejectMirror(`chunk ${i}`);\n                                    throw new Error(`mirror \"${m.src.label}\": chunk ${i} differs from cloud`);\n                                }\n                                if (r === \"same\") {\n                                    firstOk = true;\n                                    if (checker)\n                                        verified.add(i);\n                                }\n                                else if (checker)\n                                    firstCheck = null; // \u4E91\u7AEF\u591F\u4E0D\u7740\uFF1A\u6CA1\u7ED3\u8BBA\uFF0C\u4E0B\u4E00\u7247\u518D\u6BD4\uFF1B\u5B57\u8282\u7167\u4EA4\n                            }\n                            mirrorOk(m.src);\n                            return b;\n                        }\n                        catch (e) {\n                            if (!o.signal?.aborted && mirror === m) {\n                                mirrorFailed(m.src);\n                                mirrorState = \"down\";\n                                reportStoreError(e, \"log\");\n                            } // \u6211\u4EEC\u81EA\u5DF1\u4E2D\u6B62\u7684\u4E0D\u7B97\u5B83\u7684\u9519\uFF1B\u5DF2\u62D2\u7684\u4E0D\u518D\u8BB0\n                            throw e;\n                        }\n                    },\n                });\n            }\n            if (item !== null)\n                list.push({ origin: \"cloud\", fetch: (o) => range(item, off, len, o) });\n            return list;\n        }\n        // \u62C9\u4E00\u4E2A\u5206\u7247\uFF08\u53BB\u91CD / \u8BA9\u8DEF / \u8F66\u9053 / \u5BF9\u51B2\u5168\u5728 scheduler\uFF09\uFF1Astaging \u6709\u5C31\u79D2\u7B54\uFF1B\u62C9\u5230\u5373\u843D staging + \u8BB0\u8D26\u3002\n        const fetchChunk = (i, prio) => scheduler.request({\n            key: `${name}:${i}`, prio,\n            preflight: async () => { const c = await sGet(cKey(name, i)); if (c)\n                touch(i, true); return c ? new Uint8Array(await c.arrayBuffer()) : null; },\n            sources: sourcesFor(i),\n            arrived: (bytes, origin) => arrived(i, bytes, origin),\n        });\n        const playbackChunk = (i) => fetchChunk(i, \"playback\");\n        const pinChunk = (i) => fetchChunk(i, \"pin\");\n        const clampRange = (offset, length) => {\n            const off = Math.max(0, Math.min(offset, size));\n            const len = Math.max(0, Math.min(length, size - off));\n            return { i0: Math.floor(off / chunkSize), i1: len === 0 ? -1 : Math.floor((off + len - 1) / chunkSize), off, len };\n        };\n        const havedBytes = () => [...got].reduce((s, i) => s + chunkLen(i), 0);\n        return {\n            name, totalSize: size, eTag: etag,\n            async read(offset, length) {\n                if (closed)\n                    throw new Error(`\u4F1A\u8BDD\u5DF2\u5173\u95ED\uFF1A${name}`);\n                const { i0, i1, off, len } = clampRange(offset, length);\n                if (len === 0)\n                    return new Uint8Array(0);\n                const chunks = await Promise.all(Array.from({ length: i1 - i0 + 1 }, (_, k) => playbackChunk(i0 + k)));\n                const out = new Uint8Array(len);\n                let written = 0;\n                for (let i = i0; i <= i1; i++) {\n                    const c = chunks[i - i0];\n                    const chunkStart = chunkOff(i);\n                    const from = Math.max(off, chunkStart) - chunkStart;\n                    const to = Math.min(off + len, chunkStart + c.length) - chunkStart;\n                    out.set(c.subarray(from, to), written);\n                    written += to - from;\n                }\n                return out;\n            },\n            async prefetch(offset, length) {\n                if (closed)\n                    return;\n                const { i0, i1 } = clampRange(offset, length);\n                for (let i = i0; i <= i1; i++) {\n                    if (streaming)\n                        await pinChunk(i); // 2.0.0\uFF1A\u6CA1\u62C9\u5230\u5982\u5B9E reject\n                    else {\n                        try {\n                            await pinChunk(i);\n                        }\n                        catch (e) {\n                            reportStoreError(e, \"log\");\n                        }\n                    } // 0.18\uFF1Abest-effort\uFF0C\u5931\u8D25\u53EA log\n                }\n            },\n            havedBytes,\n            async promote(opts) {\n                if (closed)\n                    throw new Error(`\u4F1A\u8BDD\u5DF2\u5173\u95ED\uFF1A${name}`);\n                // \u8865\u7F3A\u53E3\uFF08\u6295\u673A\u4F18\u5148\u7EA7\u3001\u2264 lanes \u8DEF\u5E76\u884C\uFF1B\u5DF2\u6301\u6709\u7684\u5206\u7247\u76F4\u63A5\u547D\u4E2D staging\u2014\u2014\u5148\u64AD\u540E pin \u53EA\u4E0B\u7F3A\u53E3\uFF09\n                const missing = Array.from({ length: nChunks }, (_, i) => i).filter((i) => !got.has(i));\n                let next = 0;\n                const worker = async () => {\n                    while (next < missing.length) {\n                        await pinChunk(missing[next++]);\n                        opts?.onProgress?.(havedBytes(), size);\n                    }\n                };\n                await Promise.all(Array.from({ length: Math.max(1, Math.min(lanes, missing.length)) }, worker));\n                opts?.onProgress?.(havedBytes(), size);\n                // eTag \u91CD\u9A8C\uFF08TOCTOU\uFF1A\u4E0B\u8F7D\u53EF\u957F\u8FBE\u5206\u949F\u7EA7\uFF0Cpromote \u662F**\u6301\u4E45\u5316\u843D\u5730**\u52A8\u4F5C\uFF0C\u5FC5\u987B\u62FF\u5F53\u4E0B\u4E8B\u5B9E\u505A\uFF09\n                const nowMeta = await fetchMeta(name);\n                if (!nowMeta || nowMeta.etag !== etag) {\n                    await purgeName(name);\n                    throw new EtagChangedError(name);\n                }\n                // \u7EC4\u88C5 \u2192 \u843D\u6B63\u5F0F\u672C\u5730\u526F\u672C\uFF08adoptLocal \u5185\uFF1Aserialize \u9501 + \u5DF2\u6709\u526F\u672C/dirty \u4E0D\u8986\u76D6 + markSynced\uFF0C\u5BF9\u9F50 acquire\uFF09\n                const parts = [];\n                for (let i = 0; i < nChunks; i++) {\n                    const c = await sGet(cKey(name, i));\n                    parts.push(c ?? new Blob([await pinChunk(i)])); // staging \u7F3A/\u574F \u2192 \u76F4\u63A5\u91CD\u62C9\u8FD9\u4E00\u7247\u8865\u4E0A\uFF08\u6B63\u786E\u6027\u4E0D\u4F9D\u8D56 staging\uFF09\n                }\n                const asmSize = parts.reduce((s, p) => s + p.size, 0);\n                if (asmSize !== size) {\n                    await purgeName(name);\n                    throw new Error(`staging \u7EC4\u88C5\u5C3A\u5BF8\u4E0D\u7B26\uFF08${name}\uFF1A${asmSize}\u2260${size}\uFF09\uFF0C\u5DF2\u6E05\u91CD\u4E0B`);\n                }\n                await adoptLocal(name, new Blob(parts), etag); // false\uFF08\u672C\u5730\u5DF2\u6709\uFF09\u4E5F\u7167\u6837\u6536\u644A\u2014\u2014\u7EDD\u4E0D\u8986\u76D6\n                await purgeName(name); // \u5DF2\u5347\u683C \u2192 staging \u6E05\u8D26\n            },\n            status() {\n                const s = scheduler.status(`${name}:`);\n                const state = mirror ? (item === null || mirrorUp(mirror.src) ? \"ok\" : \"down\") : mirrorState;\n                return { ...s, mirror: state, mirrorLabel: mirror?.src.label, cloudless: item === null };\n            },\n            close() { closed = true; activeSessions.delete(name); evictHooks.delete(name); if (liveMeta.get(name) === meta) {\n                liveMeta.delete(name);\n                if (meta.chunks.length)\n                    void writeMeta(name, meta);\n            } }, // \u5173\u4F1A\u8BDD\u628A\u547D\u4E2D\u8D26\u843D\u76D8\uFF08\u6709\u8D26\u624D\u5199\uFF1Apromote \u6E05\u8FC7\u7684\u4E0D\u590D\u6D3B\uFF09\n        };\n    }\n    return { open, coverage, promoteFromStaging, purgeName, _enforceCap: enforceCap, _scheduler: scheduler };\n}\n", "export function namespacedKv(kv, ns) {\n    if (!ns)\n        throw new Error(\"namespacedKv: ns \u5FC5\u586B\uFF08${appId}.${databaseId}\uFF09\");\n    const prefix = `${ns}.`;\n    return {\n        get: (k) => kv.get(prefix + k),\n        set: (k, v) => kv.set(prefix + k, v),\n        remove: (k) => kv.remove(prefix + k),\n        keys: () => (kv.keys?.() ?? []).filter((k) => k.startsWith(prefix)).map((k) => k.slice(prefix.length)),\n    };\n}\n", "// \u26A0 \u5F15\u64CE\u5185\u90E8\u6DF1\u6A21\u5757\uFF08ADR-0019 \u663E\u5F0F\u7248\u672C\u8FC1\u79FB\uFF09\u3002app **\u78B0\u4E0D\u5230**\u672C\u6587\u4EF6\uFF08\u53EA\u8D70 createStore \u7684 file / collection \u4E24\u9762\uFF09\u3002\n//   schema \u540D\u5B57/\u8FC1\u79FB\u662F store \u72EC\u5360\u3002\u8BBE\u8BA1\u89C1 src/CONTEXT.md \u7684 migration/schema-version \u6BB5\u3002\n//\n// **\u6846\u67B6\uFF0C\u4E0D\u542B\u8FC1\u79FB**\uFF082026-07-13\uFF09\uFF1A\u524D\u8EAB\u5BBF\u4E3B\u65E0\u7528\u6237\u3001\u65E0\u540E\u5411\u517C\u5BB9 \u2192 \u5386\u53F2 V001\uFF08\u547D\u540D\u7A7A\u95F4\u951A\uFF09/ V002\uFF08\u88F8\u540D\u2192\u5168\u540D\uFF09\n//   \u4E24\u6761\u8FC1\u79FB\u7684\u642C\u8FC1\u903B\u8F91\uFF08tax\uFF09\u5DF2\u5220\uFF0C\u5E93\u4EE5**\u6700\u65B0\u6807\u51C6**\u51FA\u751F\uFF08\u8EAB\u4EFD=\u5168\u540D X.dat\u3001appId \u547D\u540D\u7A7A\u95F4\u3001dirty \u53CC\u8F68\uFF09\u3002\n//   \u4FDD\u7559\u7684\u662F**\u4F53\u7CFB**\uFF1Aschema \u7248\u672C\u6233 \u00B7 \u6709\u5E8F\u6CE8\u518C\u8868 MIGRATIONS \u00B7 \u7F16\u6392 runMigrations\uFF08\u8BFB\u6233\u2192\u6309\u5E8F\u8DD1\u2192\u6210\u529F\u624D\u76D6\u6233\uFF0C\u5E42\u7B49\u5D29\u6E83\u5B89\u5168\uFF09\n//   \u00B7 \u8FD0\u884C\u65F6\u547D\u540D\u7A7A\u95F4 storeNamespace\uFF08IDB \u5E93\u540D + localStorage \u952E\u524D\u7F00\uFF0C\u636E appId \u9694\u79BB\u540C origin \u5144\u5F1F PWA\uFF09\u3002\n//   \u5C06\u6765\u771F\u6709\u7528\u6237\u3001\u771F\u8981\u6539 kv/IDB \u7ED3\u6784\u65F6 \u2192 \u5F80 MIGRATIONS \u52A0**\u7B2C\u4E00\u6761** Migration\uFF08version \u5355\u8C03\uFF09\uFF0C\u7F16\u6392\u81EA\u52A8\u63A5\u7BA1\u3002\n//\n// \u7ED3\u6784\uFF1A\u2460 \u7EAF\u903B\u8F91\uFF08\u7248\u672C\u6233\u89E3\u6790/\u6BD4\u8F83\uFF09\uFF1B\u2461 \u547D\u540D\u7A7A\u95F4\u6D3E\u751F\uFF1B\u2462 \u7F16\u6392\uFF1B\u2463 IO \u8584\u58F3\uFF08localStorage \u5305\u88C5\uFF09\u3002\nimport { namespacedKv } from \"../base/kv-namespace.js\";\n/** \u89E3\u6790 vNNN-yyyymmdd\u3002\u5408\u6CD5 \u2192 { seq, date }\uFF1B\u975E\u6CD5 \u2192 null\u3002 */\nexport function parseSchemaVersion(v) {\n    const m = /^v(\\d{3,})-(\\d{8})$/.exec(v);\n    if (!m)\n        return null;\n    return { seq: Number(m[1]), date: m[2] };\n}\n/** current \u843D\u540E\u4E8E target\uFF08= \u9700\u8981\u8DD1\u8FC1\u79FB\uFF09\uFF1Fnull/\u635F\u574F\u6233 \u2192 true\uFF08\u4FDD\u5B88\uFF1B\u8FC1\u79FB\u5E42\u7B49\u65E0\u5BB3\uFF09\uFF1B\u5426\u5219\u6309 seq \u6BD4\u3002target \u975E\u6CD5 \u2192 \u629B\u3002 */\nexport function needsMigration(current, target) {\n    const t = parseSchemaVersion(target);\n    if (!t)\n        throw new Error(`\u975E\u6CD5 target schema \u7248\u672C\u6233: ${target}`);\n    if (current == null)\n        return true;\n    const c = parseSchemaVersion(current);\n    if (!c)\n        return true;\n    return c.seq < t.seq;\n}\nexport function storeNamespace(appId, databaseId) {\n    if (!appId)\n        throw new Error(\"storeNamespace: appId \u5FC5\u586B\u2014\u2014\u540C origin \u5144\u5F1F PWA \u9694\u79BB\u7684\u7EA2\u7EBF\uFF0C\u4E0D\u7ED9\u4F1A\u5171\u7528\u4E00\u4E2A\u5E93\");\n    if (!databaseId)\n        throw new Error(\"storeNamespace: databaseId \u5FC5\u586B\u2014\u2014\u540C app \u591A store \u5B9E\u4F8B\u9694\u79BB\uFF08\u9ED8\u8BA4 defaultStore\uFF09\");\n    if (databaseId.endsWith(\".staging\"))\n        throw new Error(`storeNamespace: databaseId \u4E0D\u8BB8\u4EE5 \".staging\" \u7ED3\u5C3E\uFF08${databaseId}\uFF09\u2014\u2014\u90A3\u662F 2.2.0 \u6D41\u5F0F\u6682\u5B58\u533A\u5E93\u540D\u7684\u540E\u7F00\uFF0C\u4F1A\u548C\u522B\u7684\u5B9E\u4F8B\u649E\u5E93`);\n    const root = `${appId}.${databaseId}`;\n    return { root, dbName: root, schemaKey: \"database-version\", stagingDbName: `${root}.staging` };\n}\n/**\n * \u6709\u5E8F\u6CE8\u518C\u8868\uFF1A\u6BCF\u6B21\u52A8 kv/IDB \u7ED3\u6784\u52A0\u4E00\u6761\uFF0Cversion \u5355\u8C03\u9012\u589E\u3002\n * **\u73B0\u4E3A\u7A7A**\u2014\u2014\u5E93\u4EE5\u6700\u65B0\u6807\u51C6\u51FA\u751F\uFF08\u65E0\u7528\u6237/\u65E0\u540E\u5411\u517C\u5BB9\uFF0C2026-07-13 \u6E05 V001/V002 tax\uFF09\u3002\n */\nexport const MIGRATIONS = [\n    // 2.2.0\uFF08\u9053 6 F-58 \u00A78 \u7B2C 1 \u4EF6\uFF0Cuser 2026-10-21\u300C\u540C\u610F\u300D\uFF09\uFF1A\u6D41\u5F0F\u6682\u5B58\u533A\uFF08staging/ \u5206\u533A\uFF09\u642C\u51FA\u4E3B\u5E93\u3001\u4F4F\u81EA\u5DF1\u7684\u5E93 `${root}.staging`\u3002\n    //   \u65E7\u5E93\u91CC\u7684 `staging/` \u952E**\u4E0D\u8FC1\u3001\u6574\u6279\u5220**\uFF1Astaging \u53EA\u88C5\u4E91\u7AEF\u62C9\u6765\u7684 re-fetchable \u5B57\u8282\uFF08download-session \u7EAA\u5F8B\uFF09\uFF0C\u6E05\u4E86\u7EDD\u4E0D\u4E22\u6570\u636E\u3002\n    //   \u4E00\u7B49\u4F5C\u54C1\uFF08files/\uFF09\u548C\u4E09\u7B49\u6682\u5B58\u4E0D\u518D\u540C\u5E93\u540C\u8868\uFF1B\u4E3B\u5E93\u7684 usage \u4E0D\u518D\u6DF7\u8FDB\u5206\u7247\u3002\n    {\n        version: \"v001-20261021\",\n        describe: \"staging/ \u5206\u533A\u642C\u51FA\u4E3B\u5E93\uFF08\u65B0\u5E93 `${root}.staging`\uFF09\uFF1B\u4E3B\u5E93\u91CC\u7684\u65E7 staging/ \u952E\u6574\u6279\u5220\uFF08re-fetchable\uFF09\",\n        async run(ctx) {\n            if (!ctx.blobs) {\n                ctx.log?.(\"[migration] v001: no blobs port (test / no IDB) \u2192 skip IDB part\");\n                return;\n            }\n            const keys = (await ctx.blobs.keys()).filter((k) => k.startsWith(\"staging/\"));\n            for (const k of keys)\n                await ctx.blobs.del(k);\n            ctx.log?.(`[migration] v001: purged ${keys.length} legacy staging/ key(s) from ${ctx.ns.dbName}`);\n        },\n    },\n];\n/**\n * \u8BFB\u6233 \u2192 \u6309\u5E8F\u8DD1\u6B20\u7684\u8FC1\u79FB \u2192 **run \u6210\u529F\u540E\u624D\u76D6\u65B0\u6233**\uFF08\u5D29\u4E86\u4E0D\u76D6\u2192\u4E0B\u6B21\u91CD\u8DD1\uFF09\u3002\u5E42\u7B49\uFF1A\u6233\u5DF2\u5230\u4F4D\u5219\u6574\u4F53 no-op\u3002\n * createStore \u5728 ready-gate \u524D await \u672C\u51FD\u6570\uFF08\u8FC1\u79FB\u672A\u5B8C\u4E0D\u63D0\u4F9B\u4EFB\u4F55\u8BFB\uFF09\u3002MIGRATIONS \u7A7A \u2192 \u76F4\u63A5\u8FD4\u56DE\u3001\u4E0D\u5199\u6233\u3002\n * migrations \u53C2\u6570\u9ED8\u8BA4 = MIGRATIONS\uFF08prod\uFF09\uFF1B\u6D4B\u8BD5\u6CE8\u5165\u5408\u6210\u5217\u8868\u9A8C\u7F16\u6392\u673A\u5236\uFF08\u7248\u672C\u6233\u5355\u8C03/\u5E42\u7B49/\u5D29\u6E83\u5B89\u5168\uFF09\u3002\n */\nexport async function runMigrations(ctx, migrations = MIGRATIONS) {\n    for (const m of migrations) {\n        if (!needsMigration(ctx.kv.get(ctx.ns.schemaKey), m.version))\n            continue;\n        ctx.log?.(`[migration] \u2192 ${m.version}: ${m.describe}`);\n        await m.run(ctx);\n        ctx.kv.set(ctx.ns.schemaKey, m.version);\n    }\n}\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// \u2463 IO \u8584\u58F3\uFF08localStorage \u5305\u88C5\u6210\u53EF\u679A\u4E3E MigrationKv\uFF09\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n/** prod\uFF1A\u5305 localStorage \u6210 MigrationKv\uFF08keys \u7ECF Object.keys\uFF09\u3002 */\nexport function localStorageMigrationKv() {\n    const ls = globalThis.localStorage;\n    if (!ls)\n        throw new Error(\"localStorageMigrationKv: \u65E0 localStorage\");\n    return {\n        get: (k) => ls.getItem(k),\n        set: (k, v) => ls.setItem(k, v),\n        remove: (k) => ls.removeItem(k),\n        keys: () => Object.keys(ls),\n    };\n}\n/** prod \u7EC4\u88C5 + \u8DD1\uFF08createStore \u5728 ready-gate \u524D\u8C03\uFF09\u3002\u547D\u540D\u7A7A\u95F4\u6839 = `${appId}.${databaseId}`\u3002\n *  kv \u7ECF namespacedKv \u5305\u8FC7 \u2192 migration \u5185\u6240\u6709\u952E\u8BFB\u5199\u81EA\u52A8\u843D `${root}.` \u547D\u540D\u7A7A\u95F4\uFF08\u542B keys() \u53EA\u5217\u672C\u547D\u540D\u7A7A\u95F4\uFF09\u3002 */\nexport async function runStoreMigrations(appId, databaseId, log, blobs) {\n    const ns = storeNamespace(appId, databaseId);\n    const kv = namespacedKv(localStorageMigrationKv(), ns.root);\n    await runMigrations({ kv, ns, log, blobs });\n}\n", "// \u5E93\u5185\u90E8\u6DF1\u6A21\u5757\uFF1A\u4ECE zip \u5BB9\u5668\u91CC\u6309 **\u6587\u4EF6\u540D** \u53D6\u4E00\u4E2A entry \u7684\u5B57\u8282\u3002**\u683C\u5F0F\u76F2\u3001\u5185\u5BB9\u76F2**\u2014\u2014\n//   \u4E0D\u8BA4 PNG\u3001\u4E0D\u8BA4\u4EFB\u4F55 app \u5185\u5BB9\u683C\u5F0F\uFF0C\u552F\u4E00\u5B9A\u4F4D\u4F9D\u636E = caller \u7ED9\u7684 entry \u540D\uFF08getPeek \u7684 zipEntry\uFF09\u3002\n//   2026-07-13(v399) \u91CD\u5199\uFF1A\u5220\u6389\u65E7\u300C\u5C3E\u90E8\u786C\u626B PNG magic\u300D+\u300C\u4E0D\u505A\u4E8C\u6B21\u62C9\u300D\u7684\u5B9E\u73B0\uFF0C\u6539\u6807\u51C6 zip \u89E3\u6790\n//   \uFF08EOCD \u2192 central directory \u2192 \u6309\u540D\u627E entry \u2192 \u6309\u9700\u4E8C\u6B21 byte-range \u62C9\uFF09\uFF0C\u52A0\u5BC6/\u660E\u6587/\u5927\u6587\u4EF6\u4E00\u89C6\u540C\u4EC1\u3002\n//\n// \u53D6\u5B57\u8282 schema\uFF08PeekSource \u628A\u300C\u672C\u5730 Blob.slice\u300D\u548C\u300C\u4E91\u7AEF byte-range\u300D\u62BD\u8C61\u6210\u540C\u4E00\u4E2A\u300C\u6309\u7EDD\u5BF9\u504F\u79FB\u8BFB\u300D\uFF09\uFF1A\n//   1. \u5148\u6709\u5C3E\u7247 tail\uFF08\u7EA6 80KB\uFF09\uFF1A\u4E00\u5B9A\u542B EOCD\uFF08zip \u672B\u5C3E\u7ED3\u6784\uFF09\uFF0C\u53EF\u80FD\u542B\u6574\u4EFD central directory(CD)\u3001\u53EF\u80FD\u542B\u76EE\u6807 entry\u3002\n//   2. \u89E3 EOCD \u5F97 CD \u504F\u79FB/\u5927\u5C0F\uFF1BCD \u82E5\u4E0D\u5168\u843D\u5728\u5C3E\u7247 \u2192 \u4E00\u6B21\u989D\u5916 range \u62C9 CD\u3002\n//   3. CD \u91CC\u6309\u540D\u627E\u76EE\u6807 entry\uFF1Bentry \u7684 local header + \u6570\u636E\u82E5\u4E0D\u5168\u843D\u5728\u5C3E\u7247 \u2192 \u4E00\u6B21\u989D\u5916 range \u62C9\u5B83\u3002\n//   4. \u6309 zip method \u89E3\u538B\uFF08STORE=0 \u76F4\u53D6 / deflate=8\uFF09\u8FD4\u56DE\u539F\u59CB\u5B57\u8282\u3002\n//\n// \u5173\u4E8E\u300Cmagic\u300D\uFF1A\u8FD9\u91CC\u53EA\u4FDD\u7559 zip \u683C\u5F0F**\u7ED3\u6784\u7B7E\u540D**\uFF08EOCD 0x06054b50 / CD 0x02014b50 / local header 0x04034b50\uFF09\n//   \u4F5C\u89E3\u6790\u5B9A\u4F4D\u4E0E\u9632\u9519\u4F4D\u5B88\u536B\u2014\u2014\u90A3\u662F zip \u683C\u5F0F\u5185\u5728\u7684\uFF0C\u4E0D\u662F\u5185\u5BB9/app \u77E5\u8BC6\u3002\u5B9A\u4F4D\u300C\u54EA\u4E2A entry \u662F\u9884\u89C8\u300D\u7EAF\u9760\u6587\u4EF6\u540D\u3002\n//\n// \u53EA\u652F\u6301 32-bit zip\uFF08\u65E0 zip64\uFF09\u2014\u2014\u5BBF\u4E3B\u6587\u6863 / \u52A0\u5BC6\u5916\u58F3\u90FD\u5728\u6B64\u8303\u56F4\u3002\nconst SIG_EOCD = 0x06054b50;\nconst SIG_CD = 0x02014b50;\nconst SIG_LOCAL = 0x04034b50;\n// local header \u4E4B\u540E extra \u5B57\u6BB5\u7684\u4F59\u91CF\uFF08\u81EA\u5BB6 STORE zip extra=0\uFF1B\u5916\u90E8 zip \u901A\u5E38\u4E5F\u5F88\u5C0F\uFF09\u3002\n// \u300C\u4E00\u53D1\u62C9\u300D\u65F6\u591A\u5E26\u8FD9\u4E9B\u5B57\u8282\uFF0C\u7EDD\u5927\u591A\u6570\u60C5\u51B5\u4E0B\u4E00\u6B21 range \u5C31\u591F\uFF08\u4E0D\u5FC5\u4E3A local header \u5355\u72EC\u53D1\u4E00\u6B21\uFF09\u3002\nconst LOCAL_HEADER_EXTRA_SLACK = 4096;\n// \u5C3E\u7247\u8D77\u59CB\u7684\u7EDD\u5BF9\u504F\u79FB\u3002\nfunction tailStart(src) { return src.totalSize - src.tail.length; }\n// \u6309\u7EDD\u5BF9\u504F\u79FB\u8BFB len \u5B57\u8282\uFF1A\u6574\u6BB5\u843D\u5728\u5C3E\u7247 \u2192 \u5207\u5C3E\u7247\uFF08\u96F6\u8BF7\u6C42\uFF09\uFF1B\u5426\u5219\u8D70 range \u4E8C\u6B21\u62C9\u3002len<=0 \u2192 \u7A7A\u3002\nasync function readAbs(src, off, len) {\n    if (len <= 0)\n        return new Uint8Array(0);\n    const ts = tailStart(src);\n    if (off >= ts && off + len <= src.totalSize) {\n        const s = off - ts;\n        return src.tail.subarray(s, s + len);\n    }\n    return await src.range(off, len);\n}\n// \u5C3E\u7247\u91CC\u627E EOCD\uFF08zip \u672B\u5C3E\u7ED3\u6784\uFF0C\u5FC5\u5728\u5C3E\u7247\uFF0C\u9664\u975E comment \u8D85\u5C3E\u7247\u957F\u2014\u2014\u81EA\u5BB6/\u5E38\u89C4 ora \u90FD\u65E0 comment\uFF09\u3002\n//   commentLen sanity\uFF08i+22+commentLen == \u5C3E\u7247\u672B\uFF09\u9632 false-positive\u3002\u8FD4\u56DE\u5C3E\u7247\u5185\u504F\u79FB\uFF0C-1 \u672A\u627E\u5230\u3002\nfunction findEOCD(tail) {\n    if (tail.length < 22)\n        return -1;\n    const dv = new DataView(tail.buffer, tail.byteOffset, tail.byteLength);\n    for (let i = tail.length - 22; i >= 0; i--) {\n        if (dv.getUint32(i, true) !== SIG_EOCD)\n            continue;\n        const commentLen = dv.getUint16(i + 20, true);\n        if (i + 22 + commentLen === tail.length)\n            return i;\n    }\n    return -1;\n}\n// \u89E3 central directory \u5B57\u8282\uFF08\u4ECE CD \u8D77\u59CB\u7684\u72EC\u7ACB buffer\uFF09\u2192 entries\u3002\nfunction parseCD(cd) {\n    const dv = new DataView(cd.buffer, cd.byteOffset, cd.byteLength);\n    const entries = [];\n    let p = 0;\n    while (p + 46 <= cd.length) {\n        if (dv.getUint32(p, true) !== SIG_CD)\n            break;\n        const method = dv.getUint16(p + 10, true);\n        const compSize = dv.getUint32(p + 20, true);\n        const nameLen = dv.getUint16(p + 28, true);\n        const extraLen = dv.getUint16(p + 30, true);\n        const commLen = dv.getUint16(p + 32, true);\n        const localOff = dv.getUint32(p + 42, true);\n        const name = new TextDecoder().decode(cd.subarray(p + 46, p + 46 + nameLen));\n        entries.push({ name, method, compSize, nameLen, localOff });\n        p += 46 + nameLen + extraLen + commLen;\n    }\n    return entries;\n}\n/** \u89E3 central directory \u2192 entries\uFF08CD \u4E0D\u5168\u5728\u5C3E\u7247\u65F6\u4E8C\u6B21\u62C9\uFF09\u3002\u627E\u4E0D\u5230 EOCD / CD \u62C9\u4E0D\u5168 \u2192 null\u3002 */\nexport async function readCentralDirectory(src) {\n    const eocd = findEOCD(src.tail);\n    if (eocd < 0)\n        return null;\n    const dv = new DataView(src.tail.buffer, src.tail.byteOffset, src.tail.byteLength);\n    const cdSize = dv.getUint32(eocd + 12, true);\n    const cdOffset = dv.getUint32(eocd + 16, true);\n    if (cdSize <= 0 || cdOffset + cdSize > src.totalSize)\n        return null;\n    const cd = await readAbs(src, cdOffset, cdSize);\n    if (!cd || cd.length < cdSize)\n        return null;\n    return parseCD(cd);\n}\n// method=0 STORE / method=8 deflate\u3002\u5176\u5B83 \u2192 null\u3002\nasync function inflate(raw, method) {\n    if (method === 0)\n        return raw.slice();\n    if (method === 8) {\n        if (typeof DecompressionStream === \"undefined\")\n            return null;\n        const ds = new DecompressionStream(\"deflate-raw\");\n        const stream = new Blob([raw]).stream().pipeThrough(ds);\n        return new Uint8Array(await new Response(stream).arrayBuffer());\n    }\n    return null;\n}\n/** \u6293\u4E00\u4E2A entry \u7684\u89E3\u538B\u540E\u5B57\u8282\u3002\u6570\u636E\u4E0D\u5168\u5728\u5C3E\u7247\u65F6\u4E8C\u6B21\u62C9\uFF08\u5E38\u89C1 1 \u6B21\uFF09\u3002\u4EFB\u4F55\u5F02\u5E38 \u2192 null\u3002 */\nexport async function readEntryBytes(src, entry) {\n    // \u4E00\u53D1\u62C9 [localOff, +local header + slack + compSize]\uFF1A\u6574\u6BB5\u843D\u5C3E\u7247\u5219\u96F6\u989D\u5916\u8BF7\u6C42\uFF1B\u5426\u5219\u4E00\u6B21 range\u3002\n    const guess = 30 + entry.nameLen + LOCAL_HEADER_EXTRA_SLACK + entry.compSize;\n    const chunk = await readAbs(src, entry.localOff, Math.min(guess, src.totalSize - entry.localOff));\n    if (!chunk || chunk.length < 30)\n        return null;\n    const dv = new DataView(chunk.buffer, chunk.byteOffset, chunk.byteLength);\n    if (dv.getUint32(0, true) !== SIG_LOCAL)\n        return null; // \u7ED3\u6784\u7B7E\u540D\uFF08\u975E\u5185\u5BB9\u77E5\u8BC6\uFF09\uFF1A\u9632\u9519\u4F4D\u504F\u79FB\n    const nameLen = dv.getUint16(26, true);\n    const extraLen = dv.getUint16(28, true);\n    const dataStart = 30 + nameLen + extraLen;\n    let raw;\n    if (dataStart + entry.compSize <= chunk.length) {\n        raw = chunk.subarray(dataStart, dataStart + entry.compSize);\n    }\n    else {\n        // local extra \u8D85\u51FA slack\uFF08\u7F55\u89C1\uFF09\u2192 \u7CBE\u786E\u4E8C\u6B21\u62C9\u6570\u636E\u6BB5\u3002\n        raw = await readAbs(src, entry.localOff + dataStart, entry.compSize);\n    }\n    if (!raw)\n        return null;\n    return await inflate(raw, entry.method);\n}\n/** \u4FBF\u6377\uFF1A\u6309\u540D\u53D6\u4E00\u4E2A entry \u7684\u5B57\u8282\uFF08CD \u2192 \u6309\u540D\u627E \u2192 \u8BFB\uFF09\u3002\u627E\u4E0D\u5230 \u2192 null\u3002 */\nexport async function readNamedEntry(src, name) {\n    const entries = await readCentralDirectory(src);\n    if (!entries)\n        return null;\n    const e = entries.find((x) => x.name === name);\n    return e ? await readEntryBytes(src, e) : null;\n}\n", "// \u26A0 \u4F7F\u7528\u524D\u5FC5\u8BFB README.md\u3002app \u7ECF createStore \u62FF\u611F\u77E5\u9762\uFF08files.persistence\uFF09\uFF0C\u6267\u884C\u4F53\u7ECF\u9876\u5C42 export\u3002\n// created 2026-08-27 by Claude Fable 5 (claude-fable-5)\n//\n// persist() \u4E09\u4EF6\u5957\uFF08user 2026-08-27 \u62CD\u677F\uFF1B\u51FA\u5904 = \u672C\u65E5 store session\u300C\u4E09\u4EF6\u5957\u540C\u610F\u300D\uFF09\uFF1A\n//   \u2460 \u611F\u77E5\u5F3A\u5236\uFF08\u5E93\u5185\uFF0C\u96F6 consent\uFF09\uFF1Aboot \u540E\u81EA\u52A8 `navigator.storage.persisted()` \u7EAF\u67E5\u8BE2\u2014\u2014\u4EFB\u4F55\u5E73\u53F0\n//     \u4E0D\u5F39\u4EFB\u4F55\u4E1C\u897F\u2014\u2014\u7ED3\u679C\u66B4\u9732 `files.persistence()` + \u672A\u6301\u4E45\u65F6 funnel \u4E00\u6B21\uFF08\"log\" \u7EA7\uFF09\u3002\n//   \u2461 \u63A5\u7EBF\u5F3A\u5236\uFF08\u7F16\u8BD1\u671F\uFF09\uFF1AStoreConfig.persistence **\u5FC5\u586B**\uFF08\"app-managed\" | \"none\"\uFF09\uFF0C\u903C\u88C5\u914D\u8005\u8868\u6001\uFF0C\n//     \u300C\u5FD8\u4E86\u8FD9\u56DE\u4E8B\u300D\u4ECE\u53EF\u80FD\u53D8\u6210\u4E0D\u53EF\u80FD\uFF08validateAdopt/appId \u5FC5\u586B\u540C\u624B\u6CD5\uFF09\u3002\n//   \u2462 \u6267\u884C\u4F53\uFF08\u5E93\u51FA\u8F66\uFF0Capp \u8E29\u6CB9\u95E8\uFF09\uFF1ArequestStoragePersistence()\u2014\u2014app \u5728**\u81EA\u5DF1\u7684\u624B\u52BF\u65F6\u523B**\u8C03\n//     \uFF08\u6302\u56FE\u5E93/\u9996\u5B58/\u5B89\u88C5\u540E\uFF1B\u5BAA\u6CD5\u300C\u6302\u4E0A\u56FE\u5E93\u5C31 persist()\u300D\u7684\u843D\u70B9\uFF09\u3002\n//\n// \u4E3A\u4EC0\u4E48**\u4E0D**\u7531\u5E93\u81EA\u52A8\u8C03 persist()\uFF08\u62CD\u677F\u5B9A\u6027\uFF0C\u522B\u7FFB\u6848\uFF09\uFF1A\n//   \u00B7 Firefox \u662F\u771F\u5F39\u7A97\u2014\u2014\u5E93\u5728 boot/\u975E\u624B\u52BF\u65F6\u523B\u81EA\u52A8\u8C03 = \u65E0\u4E0A\u4E0B\u6587\u70B8\u8138\uFF0C\u8FDD\u53CD\u5BB6\u65CF\u300C\u540E\u53F0\u7EDD\u4E0D\u5F39\u6388\u6743\u3001\n//     \u6743\u9650\u53EA\u5728\u7528\u6237\u624B\u52BF\u300D\u7EAA\u5F8B\uFF08provider NotAllowedError \u5904\u7F6E\u3001store \u4E0D\u52AB\u6301\u5BFC\u822A\uFF0C\u540C\u65CF\uFF09\u3002\n//   \u00B7 Chromium \u4ECE\u4E0D\u5F39\u7A97\uFF0C\u6309 site engagement \u542F\u53D1\u5F0F\u9759\u9ED8\u6279/\u62D2\u2014\u2014boot \u65F6\u8C03\u591A\u534A\u9759\u9ED8\u62D2\uFF08\u7A7A\u67AA\uFF09\u3002\n//   \u00B7 Safari \u7684 7 \u5929 ITP **\u4E0D\u7406\u5B83**\uFF08\u5BB6\u65CF\u5DF2\u6309\u6700\u574F\u5047\u8BBE\u8BBE\u8BA1\uFF09\uFF1B\u7528\u6237\u624B\u52A8\u6E05\u7AD9\u70B9\u6570\u636E\u4EFB\u4F55\u5E73\u53F0\u7167\u6E05\u3002\n//   \u2192 persist \u662F \u00A7A \u4FEE\u8BA2\u4FDD\u547D\u4E09\u4EF6\u5957\u91CC**\u6700\u5F31\u7684\u4E00\u4EF6**\uFF08\u771F\u627F\u91CD = dirty \u7A97\u53E3\u77ED + \u6B63\u672C\u4E0D\u5728 IDB\uFF09\u3002\n//     \u5E93\u80FD\u4FDD\u8BC1\u7684\u53EA\u6709\u300C\u5FC5\u8868\u6001\u3001\u5FC5\u611F\u77E5\u300D\uFF0C\u4FDD\u8BC1\u4E0D\u4E86\u300C\u5FC5\u6210\u529F\u300D\u2014\u2014\u88C5\u4F5C\u80FD\u4FDD\u8BC1\u53CD\u800C\u662F\u8C0E\u62A5\u627F\u91CD\uFF08\u745E\u58EB\u5976\u916A\u53CD\u9762\uFF09\u3002\n//   \u00B7 persist \u662F **origin \u7EA7**\u4E0D\u662F\u5E93\u7EA7\uFF1A\u540C origin \u5144\u5F1F\uFF08github.io project pages\uFF09\u5171\u4EAB\u6B64\u72B6\u6001\uFF0C\n//     \u8C03\u7528\u65F6\u673A\u5929\u7136\u5F52\u5BBF\u4E3B/\u4EA7\u54C1\u5C42\u3002\n//   \u26A0 \u7ED3\u679C**\u7EDD\u4E0D\u6539\u53D8 store \u884C\u4E3A**\uFF1Agranted \u4E0E\u5426\uFF0C\u6240\u6709\u7EA2\u7EBF\uFF08dirty \u4E0D\u9A71\u9010\u3001\u6B63\u672C\u4E0D\u8FDB IDB\u3001\u9000\u51FA\u81EA\u52A8\u63A8\uFF09\u539F\u6837\u3002\nconst globalStorage = () => globalThis.navigator?.storage ?? null;\n/** \u7EAF\u67E5\u8BE2\uFF08\u96F6 consent\u3001\u96F6\u5F39\u7A97\u3001\u4EFB\u4F55\u65F6\u523B\u53EF\u8C03\uFF09\u3002\u5F02\u5E38/\u7F3A\u73AF\u5883 \u2192 supported:false\uFF08\u8BDA\u5B9E\u964D\u7EA7\uFF0C\u4E0D\u8C0E\u62A5\u5DF2\u6301\u4E45\uFF09\u3002 */\nexport async function queryStoragePersistence(sm = globalStorage()) {\n    if (typeof sm?.persisted !== \"function\")\n        return { supported: false, persisted: false };\n    try {\n        return { supported: true, persisted: await sm.persisted() };\n    }\n    catch {\n        return { supported: false, persisted: false };\n    }\n}\n/** \u6267\u884C\u4F53\uFF1A**\u53EA\u51C6\u5728\u7528\u6237\u624B\u52BF\u65F6\u523B\u8C03**\uFF08\u6302\u56FE\u5E93/\u9996\u5B58/\u5B89\u88C5\u540E\u2014\u2014Firefox \u4F1A\u771F\u5F39\u7A97\uFF0C\u522B\u5728 boot/\u540E\u53F0\u8C03\uFF09\u3002\n *  \u5DF2\u6301\u4E45 \u2192 \u76F4\u63A5 granted\uFF08\u4E0D\u91CD\u590D\u6253\u6270\uFF09\uFF1Bdenied \u53EF\u4E0B\u6B21\u624B\u52BF\u518D\u8BD5\uFF08Chromium \u542F\u53D1\u5F0F\u4F1A\u968F engagement \u53D8\uFF09\u3002\n *  \u26A0 \u65E0\u8BBA\u7ED3\u679C\u5982\u4F55\u90FD**\u4E0D\u5F97**\u636E\u6B64\u6539\u53D8\u6570\u636E\u5B89\u5168\u884C\u4E3A\uFF08persist \u662F\u964D\u6982\u7387\uFF0C\u4E0D\u662F\u4FDD\u8BC1\u2014\u2014\u5934\u6CE8\u91CA\u6863\u4F4D\u5B9A\u6027\uFF09\u3002 */\nexport async function requestStoragePersistence(sm = globalStorage()) {\n    if (typeof sm?.persist !== \"function\")\n        return \"unsupported\";\n    try {\n        if (sm.persisted && await sm.persisted())\n            return \"granted\";\n        return (await sm.persist()) ? \"granted\" : \"denied\";\n    }\n    catch {\n        return \"unsupported\";\n    }\n}\n", "// UI \u6587\u6848\u63A5\u7F1D\uFF082026-08-21 QA \u8F6E\u62CD\u677F\uFF1A\u5E93\u5185 15 \u5904\u786C\u7F16\u7801\u4E2D\u6587 busy \u6587\u6848\u51FA\u5E93\uFF09\u3002\n//\n// \u5951\u7EA6\uFF1A\u5E93\u5185**\u53EA\u53D1 key**\uFF08\u4E0B\u9762\u7684 StoreTextKey \u5168\u96C6\uFF09\uFF1B\u5BBF\u4E3B\u7ECF `StoreUI.text` \u6CE8\u5165\u7FFB\u8BD1\n//   \uFF08\u5982 WeebPaint \u628A key \u6620\u5230\u81EA\u5BB6 i18n SSoT \u7684 t()\uFF09\uFF1B\u5BBF\u4E3B\u6CA1\u63A5 / \u8FD4\u56DE undefined \u2192 \u843D\u56DE\n//   \u5185\u5EFA\u82F1\u6587\u7F3A\u7701\u3002\u5E93\u662F\u901A\u7528\u4EF6\u2014\u2014\u7528\u6237\u53EF\u89C1\u6587\u6848\u7684\u672C\u5730\u5316\u5F52\u5BBF\u4E3B i18n\uFF0C\u4E0D\u518D\u70E4\u4EFB\u4F55\u5177\u4F53\u8BED\u8A00\u7684\n//   \u6210\u54C1\u5B57\u7B26\u4E32\u5728\u8C03\u7528\u70B9\uFF08\u4E2D\u6587\u7531\u5BBF\u4E3B\u6CE8\u5165\uFF0C\u82F1\u6587\u7F3A\u7701\u53EA\u662F\u515C\u5E95\u4E0D\u662F\u4EA7\u54C1\u6587\u6848\uFF09\u3002\n//\n// \u5E26\u53C2\u6570\u7684 key\uFF08{name}\uFF09\uFF1A\u5BBF\u4E3B text() \u81EA\u5DF1\u63D2\u503C\uFF08\u6536\u5230 params \u539F\u6837\u8F6C\u4EA4\uFF09\uFF1B\u82F1\u6587\u7F3A\u7701\u7531\u672C\u6A21\u5757\u63D2\u503C\u3002\nconst STORE_TEXT_EN = {\n    \"sync.pushing\": \"Syncing\u2026\",\n    \"file.renaming\": \"Renaming\u2026\",\n    \"file.uploading\": \"Uploading\u2026\",\n    \"file.pulling\": \"Pulling\u2026\",\n    \"cloud.checking\": \"Checking cloud\u2026\",\n    \"file.deleting\": \"Deleting\u2026\",\n    \"trash.restoring\": \"Restoring\u2026\",\n    \"trash.purging\": \"Deleting permanently\u2026\",\n    \"trash.emptyTrash\": \"Emptying trash\u2026\",\n    \"trash.emptyBackups\": \"Emptying backup box\u2026\",\n    \"file.encrypting\": \"Encrypting {name}\u2026\",\n    \"file.decrypting\": \"Decrypting {name}\u2026\",\n    \"file.rekeying\": \"Re-keying {name}\u2026\",\n    \"file.reuploading\": \"Re-uploading\u2026\",\n    \"folder.creating\": \"Creating folder\u2026\",\n    \"folder.deleting\": \"Deleting folder\u2026\",\n};\nfunction interpolate(s, params) {\n    if (!params)\n        return s;\n    return s.replace(/\\{(\\w+)\\}/g, (m, k) => (k in params ? params[k] : m));\n}\n/** key \u2192 \u663E\u793A\u6587\u6848\uFF1A\u5BBF\u4E3B\u7FFB\u8BD1\u4F18\u5148\uFF0C\u7F3A\u7701\u82F1\u6587\uFF1B\u672A\u77E5 key\uFF08\u7406\u8BBA\u4E0D\u53EF\u8FBE\uFF0C\u9632\u5FA1\uFF09\u539F\u6837\u8FD4\u56DE\u3002 */\nexport function resolveStoreText(custom, key, params) {\n    const fromHost = custom?.(key, params);\n    if (fromHost != null)\n        return fromHost; // \u5BBF\u4E3B\u5DF2\u63D2\u503C\n    const base = STORE_TEXT_EN[key];\n    return base != null ? interpolate(base, params) : String(key);\n}\n", "// \u26A0 \u8FD9\u662F\u5E93\u7684\u552F\u4E00\u5165\u53E3\u3002\u63A5\u5E93\u5FC5\u8BFB\u540C\u76EE\u5F55 README.md + CONTEXT.md\u3002\n//\n// createStore \u2014\u2014 \u8584\u7EC4\u5408\u6839\uFF1Aprovider \u2192 \u5E93\u5185\u9020 cloud/local/kv/\u810A\u690E \u2192 \u88C5\u914D 10 \u4E2A\u6DF1\u6A21\u5757 \u2192\n//   \u66B4\u9732 README.md \u7684\u9762\uFF08file / collection / list\uFF09\u3002\u8BBE\u7F6E/\u72B6\u6001**\u5168\u8D70 collection**\uFF08synced \u6216 {local:true} \u53D8\u4F53\uFF09\uFF0C\n//   localSettings/syncedSettings \u5DF2\u5220\uFF082026-07-13\uFF09\u2014\u2014app \u6BCF\u7C7B\u6301\u4E45\u5316\u5EFA\u4E00\u4E2A collection\uFF0C\u76F4\u63A5\u7528\u5176 KV \u9762\u3002\n//   \u7EA2\u7EBF\u5168\u5728\u5404\u6DF1\u6A21\u5757\u5185 enforce\uFF1B\u8FD9\u91CC\u53EA\u63A5\u7EBF + \u628A ui bundle \u6620\u5C04\u5230\u5404 flow \u7684\u56DE\u8C03\u3002\nimport { toU8, createSubstrate } from \"./base/substrate.js\";\nimport { createLocalHead } from \"./works/local-head.js\";\nimport { createSeal, cryptExtFor } from \"./works/seal.js\";\nimport { createIdentifiers } from \"./base/identifiers.js\";\nimport { createSafeResolve } from \"./works/safe-resolve.js\";\nimport { createPush } from \"./works/push.js\";\nimport { createFreshness } from \"./works/freshness.js\";\nimport { createFreshHints } from \"./works/fresh-hints.js\";\nimport { createDelete } from \"./works/delete.js\";\nimport { createIdentity } from \"./works/identity.js\";\nimport { createTrash } from \"./works/trash.js\";\nimport { createOffload } from \"./works/offload.js\";\nimport { createReconcile } from \"./works/reconcile.js\";\nimport { createPendingGone } from \"./works/pending-gone.js\";\nimport { assertValidFileName, assertValidCollectionName, isHidden } from \"./base/is-hidden.js\";\nimport { createCollection, emptyCollectionBytes } from \"./works/collection.js\";\nimport { createListing, toMs } from \"./works/listing.js\";\nimport { createUploadReplay } from \"./works/upload-queue.js\";\nimport { createCloudSync, CloudNameCollisionError, defaultCloudToName } from \"./works/cloud-sync.js\";\nimport { mergeTrash } from \"./works/trash-merge.js\";\nimport { createLocalCache, createCollectionCache, createStagingStore } from \"./base/local-cache.js\";\nimport { createIdbCache } from \"./base/idb-store.js\"; // 2.2.0\uFF1A\u8FC1\u79FB\u7684\u4E3B\u5E93\u88F8\u952E\u9762\nimport { createDownloadSessions, EtagChangedError } from \"./stream/download-session.js\";\nimport { runStoreMigrations, storeNamespace } from \"./works/migration.js\";\nimport { namespacedKv } from \"./base/kv-namespace.js\";\nimport { readCentralDirectory, readEntryBytes } from \"./works/zip-peek.js\";\nimport { reportStoreError, setStoreErrorReporter } from \"./base/error-handling.js\";\nimport { queryStoragePersistence } from \"./base/persistence.js\";\n// \u2500\u2500 ui bundle\uFF08Model B\uFF0CREADME.md \u00A77\uFF09\u2500\u2500\n/** ui bundle\uFF1Astore \u5728\u51B3\u7B56\u70B9\u56DE\u8C03\u8FDB\u6765 + await\u3002**\u5168\u90E8\u5FC5\u586B\uFF0C\u7981 placeholder/noop**\n *  \uFF08offlineEscape \u4F8B\u5916\uFF1A\u7F3A\u5B83\u4F18\u96C5\u9000\u56DE isOnline \u5B88\u536B\uFF0C\u975E\u9690\u85CF\u5931\u8D25\uFF09\u3002 */\nimport { resolveStoreText } from \"./base/ui-text.js\";\n/** files \u9762\u53EA\u8BFB\u955C\u50CF\uFF08readOnlyFiles:true\uFF09\u4E0B\u8C03\u7528\u5199\u8DEF\u5F84 \u2192 \u629B\u6B64\u9519\uFF08app surface\uFF1B\u8FD9\u4E0D\u662F\u5931\u8D25\uFF0C\u662F\u5951\u7EA6\uFF09\u3002 */\nexport class ReadOnlyFilesError extends Error {\n    /** resource \u7ED9\u4E86 = 2.1.0 \u4E09\u7B49\u8D44\u6E90\u90A3\u4E00\u79CD\u6587\u6863\u53EA\u8BFB\uFF08docKinds \u884C tier:\"resource\"\uFF09\uFF1B\u6CA1\u7ED9 = readOnlyFiles:true \u7684\u6574\u9762\u53EA\u8BFB\u3002 */\n    constructor(op, resource) { super(resource ? `\u4E09\u7B49\u8D44\u6E90\u300C${resource}\u300D\u53EA\u8BFB\uFF1A${op}` : `\u53EA\u8BFB\u955C\u50CF\uFF1Afiles \u9762\u4E0D\u53EF\u5199\uFF08${op}\uFF09`); this.name = \"ReadOnlyFilesError\"; }\n}\n/** store.dispose() \u4E4B\u540E\u518D\u8C03\u4EFB\u4F55\u9762 \u2192 \u629B\u6B64\u9519\uFF08app surface\uFF1B\u8FD9\u4E0D\u662F\u5931\u8D25\uFF0C\u662F\u5951\u7EA6\u2014\u2014\u5207\u5E93/\u767B\u51FA\u540E\u65E7\u53E5\u67C4\u5FC5\u987B\u54CD\u4EAE\u6B7B\uFF0C\u7EDD\u4E0D\u9759\u9ED8\u534A\u5DE5\u4F5C\uFF09\u3002 */\nexport class StoreDisposedError extends Error {\n    constructor(op) { super(`store \u5DF2 dispose${op ? `\uFF08${op}\uFF09` : \"\"}\uFF0C\u62D2\u7EDD\u540E\u7EED\u8C03\u7528`); this.name = \"StoreDisposedError\"; }\n}\nfunction localStorageKv() {\n    const ls = globalThis.localStorage;\n    if (!ls)\n        throw new Error(\"createStore: \u65E0 localStorage\uFF0C\u8BF7\u6CE8\u5165 kv\");\n    return { get: (k) => ls.getItem(k), set: (k, v) => ls.setItem(k, v), remove: (k) => ls.removeItem(k), keys: () => Object.keys(ls) };\n}\n/** \u5E93\u7684\u552F\u4E00\u5165\u53E3 \u2014\u2014 \u8584\u7EC4\u5408\u6839\uFF1Aprovider \u2192 \u5E93\u5185\u9020 cloud/local/kv/\u810A\u690E \u2192 \u88C5\u914D\u6DF1\u6A21\u5757 \u2192\n *  \u66B4\u9732 README.md \u7684\u9762\uFF08file / collection / files / encryption\uFF09\u3002\u8BBE\u7F6E/\u72B6\u6001**\u5168\u8D70 collection**\u3002\n *  \u7EA2\u7EBF\u5168\u5728\u5404\u6DF1\u6A21\u5757\u5185 enforce\uFF1B\u8FD9\u91CC\u53EA\u63A5\u7EBF + \u628A ui bundle \u6620\u5C04\u5230\u5404 flow \u7684\u56DE\u8C03\u3002 */\nexport function createStore(config) {\n    const { provider, ui, appId, databaseId = \"defaultStore\", kv: rawKv = localStorageKv(), validateAdopt, autoCacheOpenedFile = true } = config;\n    // A4 \u53EA\u8BFB\u955C\u50CF\uFF1Afiles \u5199\u8DEF\u5F84\u7EDF\u4E00\u95E8\uFF08\u8BFB/\u79BB\u7EBF\u526F\u672C\u9762\u4E0D\u8D70\u8FD9\u9053\u95E8\uFF09\u3002\n    const roGuard = (op) => { if (config.readOnlyFiles)\n        throw new ReadOnlyFilesError(op); };\n    // dispose \u95E8\uFF080.4.0\uFF0C2026-08-25 \u62CD\u677F \u00A71.2\uFF09\uFF1Adispose \u540E\u4E00\u5207\u9762**\u54CD\u4EAE\u62D2**\uFF08\u7EDD\u4E0D\u9759\u9ED8\u534A\u5DE5\u4F5C\uFF09\u3002\n    //   rejectAfterDispose \u628A\u5BF9\u8C61\u4E0A\u6BCF\u4E2A\u65B9\u6CD5\u5305\u4E00\u5C42\u8C03\u7528\u65F6\u68C0\u67E5 \u2192 **dispose \u524D\u5DF2\u63E1\u7740\u7684** file/collection\n    //   \u5BF9\u8C61\u7167\u6837\u88AB\u62D2\uFF08\u68C0\u67E5\u5728\u8C03\u7528\u65F6\u523B\u8BFB _disposed\uFF0C\u4E0D\u5728\u521B\u5EFA\u65F6\u523B\uFF09\u3002\n    let _disposed = false;\n    function rejectAfterDispose(obj) {\n        const out = {};\n        for (const [k, v] of Object.entries(obj))\n            out[k] = typeof v === \"function\"\n                ? (...a) => { if (_disposed)\n                    throw new StoreDisposedError(k); return v(...a); }\n                : v;\n        return out;\n    }\n    if (!appId)\n        throw new Error(\"createStore: appId \u5FC5\u586B\u2014\u2014\u540C origin \u5144\u5F1F PWA \u9694\u79BB\u7684\u7EA2\u7EBF\uFF08\u6BCF\u4E2A app \u5EFA\u81EA\u5DF1\u7684 IDB \u5E93\uFF09\");\n    if (config.persistence !== \"app-managed\" && config.persistence !== \"none\")\n        throw new Error('createStore: persistence \u5FC5\u586B\uFF08\"app-managed\" | \"none\"\uFF09\u2014\u2014persist() \u63A5\u7EBF\u5FC5\u987B\u663E\u5F0F\u8868\u6001\uFF082026-08-27 \u62CD\u677F\uFF0C\u89C1 persistence.ts\uFF09');\n    // \u6DF1\u6A21\u5757\u7EDF\u4E00\u9519\u8BEF\u4E0A\u62A5\u63A5\u4E0A ui.reportError\uFF08\u6DF1\u6A21\u5757 import reportStoreError \u76F4\u63A5\u8C03\uFF0C\u4E0D\u5FC5\u7EBF\u7A7F ui\uFF09\u3002store \u4FA7\u4E0D log\u3002\n    setStoreErrorReporter((err, level) => ui.reportError(err, level));\n    // persist \u4E09\u4EF6\u5957\u4E4B\u2460\uFF08\u611F\u77E5\u5F3A\u5236\uFF09\uFF1Aboot \u7EAF\u67E5\u8BE2 persisted()\u2014\u2014\u96F6\u5F39\u7A97\u96F6 consent\uFF1B\u672A\u6301\u4E45 funnel \u4E00\u6B21\uFF08log \u7EA7\uFF0C\n    //   funnel \u4E0D\u6270\u6C11\uFF1Bbadge \u4E0E\u5426\u662F app \u4EA7\u54C1\u51B3\u5B9A\uFF0C\u611F\u77E5\u9762 = files.persistence()\uFF09\u3002\"none\" = \u5DF2\u8868\u6001\u653E\u5F03\uFF0C\u4E0D\u67E5\u4E0D\u6270\u3002\n    if (config.persistence === \"app-managed\") {\n        void queryStoragePersistence().then((st) => {\n            if (st.supported && !st.persisted)\n                ui.reportError(new Error(\"navigator.storage: origin not persisted yet \u2014 wire requestStoragePersistence() at a user gesture (best-effort layer, never load-bearing)\"), \"log\");\n        });\n    }\n    const ns = storeNamespace(appId, databaseId); // \u547D\u540D\u7A7A\u95F4\u6839 `${appId}.${databaseId}`\uFF1AIDB \u5E93\u540D + \u5168\u90E8 localStorage \u952E\u524D\u7F00\n    // **\u7A84\u8170 choke point**\uFF1A\u5305\u4E00\u5C42 namespacedKv\uFF0C\u6240\u6709\u952E\u81EA\u52A8\u843D `${ns.root}.`\uFF1B\u5404\u6DF1\u6A21\u5757\u53EA\u7528\u76F8\u5BF9\u952E\uFF08files.*/collections.*/settings.*/internal.*\uFF09\u3002\n    const kv = namespacedKv(rawKv, ns.root);\n    // \u8EAB\u4EFD\u7684\u8BED\u6CD5\uFF080.16.0\uFF09\uFF1A\u8868\u5728\u8FD9\u91CC\u6821\u9A8C\u4E00\u6B21\uFF08\u6B67\u4E49\u5F53\u573A\u629B\uFF09\uFF0C\u4E4B\u540E local / cloud / trash-merge / seal \u5168\u4ECE\u5B83\u53D6\u7B54\u6848\n    const ids = createIdentifiers(config.docKinds);\n    // 2.1.0 \u516C\u6C11\u7B49\u7EA7\uFF08docKinds \u884C\u7684 tier\uFF1B\u4E0D\u662F\u6587\u6863\u7684\u540D\u5B57\u6309\u4F5C\u54C1 = 2.0 \u884C\u4E3A\uFF09\u3002\u7B49\u7EA7\u5728\u8FD9\u91CC\u4F20\u6B7B\uFF0C\u6CA1\u6709\u6309\u6B21\u8C03\u7528\u6539\u7B49\u7EA7\u7684\u53E3\u3002\n    const tierOf = (name) => ids.parse(name)?.tier ?? \"work\";\n    const tierGuard = (op, name) => { roGuard(op); if (tierOf(name) === \"resource\")\n        throw new ReadOnlyFilesError(op, name); };\n    const local = config.local ?? createLocalCache(ns.dbName, { identifiers: ids }); // \u6587\u4EF6\u7F13\u5B58\uFF08files/trash/backup \u5206\u533A\uFF09\uFF1Bprod=idb\u3001\u6D4B\u8BD5\u6CE8\u5165 mock\n    const collectionLocal = config.local ?? createCollectionCache(ns.dbName); // collections \u5206\u533A\u7F13\u5B58\uFF08collection \u81EA\u5E26 `collections/` \u524D\u7F00\uFF09\n    const rawOnline = config.isOnline ?? (() => globalThis.navigator?.onLine !== false);\n    const signedIn = config.signedIn ?? (() => true);\n    // \u4E91\u817F\u7684\u300C\u5728\u7EBF\u300D= \u7F51\u7EDC\u5728\u7EBF \u2227 \u5DF2\u767B\u5F55\uFF080.14.0\uFF0Cuser 2026-09-19 \u62CD\u677F\uFF09\uFF1A\u672A\u767B\u5F55\u65F6 Graph \u4EC0\u4E48\u90FD\u505A\u4E0D\u4E86\uFF0C\u4E4B\u524D\u53EA\u770B navigator.onLine \u2192\n    //   \u6539\u540D / \u5220\u9664 / \u63A8\u9001\u5168\u8D70\u4E91\u817F\uFF1AfetchMeta \u629B\u300CNot signed in\u300D\u3001doPush \u91CD\u8BD5 4 \u6B21\u9000\u907F 1.2s \u624D cloudDeferred\uFF08JRB \u5192\u70DF\u6293\u5230\u300C\u672C\u5730\u4EF6\u6539\u540D\u7B49 1 \u79D2\u591A\u300D\uFF09\u3002\n    //   \u73B0\u5728\u672A\u767B\u5F55 = \u4E91\u4E0D\u53EF\u8FBE \u2192 \u8D70\u5404\u5904\u5DF2 vetted \u7684\u79BB\u7EBF\u5206\u652F\uFF08\u79BB\u7EBF move / \u79BB\u7EBF\u5220\u961F\u5217 / \u8865\u63A8\u961F\u5217\uFF09\uFF0C\u96F6\u7F51\u7EDC\u96F6\u7B49\u5F85\uFF1B\u56DE\u7EBF\u767B\u5F55\u540E drainOfflineQueue \u6536\u655B\u3002\n    //   \u5217\u4E3E ctx \u4ECD\u5206\u5F00\u62A5 {signedIn, online:rawOnline}\uFF08\u767B\u51FA\u89C6\u89D2 / \u63BA\u5FEB\u7167 \u7684\u5224\u5B9A\u8981\u533A\u5206\u4E24\u8005\uFF09\u3002\n    const isOnline = () => rawOnline() && signedIn();\n    // \u52A0\u5BC6\u5BC6\u7801\u6E90\uFF08\u5BF9\u9F50\u524D\u8EAB\u5F15\u64CE\u975E\u4EA4\u4E92 getPassword\uFF09\uFF1A\u4F18\u5148 crypt.getPassword\uFF0C\u517C\u5BB9\u65E7\u9876\u5C42\uFF1B\u4E0D\u7ED9 \u2192 \u6052 null\uFF08\u900F\u4F20\u660E\u6587\uFF09\u3002\n    const getPassword = config.crypt?.getPassword ?? config.getPassword ?? (() => null);\n    // \u8868\u6001\u5236\u8FD0\u884C\u65F6\u95E8\uFF08fail-fast\uFF0C2026-08-28\uFF1Atsc \u53EA\u62E6 TS \u6D88\u8D39\u8005\u2014\u2014JS/\u6F0F\u5582\u6D4B\u8BD5\u9759\u9ED8\u6F0F\u7F51\u5B9E\u6D4B\u8FC7\uFF09\n    if (!config.encryption)\n        throw new Error('createStore: config.encryption is required (pass createEncryption(), codec-less is fine) \u2014 no substitutes');\n    if (config.reconcilePolicy !== \"app-driven\" && config.reconcilePolicy !== \"none\")\n        throw new Error('createStore: config.reconcilePolicy is required (\"app-driven\" | \"none\") \u2014 declare who drives periodic reconcile');\n    const enc = config.encryption; // \u52A0\u5BC6\u7AEF\u53E3\uFF08\u5FC5\u586B\uFF1B\u66FF\u8EAB\u5DF2\u6E05\u6D17\u2014\u2014mock \u8D70 ./testing createMockEncryption\uFF09\n    // \u2500\u2500 \u810A\u690E + \u4F4E\u5C42 \u2500\u2500\n    // \u4E24\u4E2A cloud-sync \u5B9E\u4F8B\uFF08etag \u547D\u540D\u7A7A\u95F4\u6309\u5B9E\u4F53\u5206\u79BB\uFF0C\u89C1 ai-docs/plan\uFF09\uFF1A\n    //   files \u5B9E\u4F8B\uFF1A\u8EAB\u4EFD=\u5168\u540D\uFF08fileName \u6052\u7B49\uFF1BencFileName \u8FFD\u52A0 .zip\uFF0C\u52A0\u5BC6\u5BB9\u5668\u5916\u6269\u5C55\u540D ADR-0012 \u65E0\u635F\u53EF\u9006\uFF09\uFF1B\n    //     appKey=\"files\" \u2192 `${ns}.files.etag:`\uFF1B**manageDirty:false**\u2014\u2014\u6587\u4EF6 dirty \u6743\u5A01\u5728 local-head \u7684 `${ns}.files.dirty:`\uFF0C\n    //     \u82E5 cloud-sync \u4E5F\u5199\u540C\u952E\uFF0Cpush \u6210\u529F\u5199 \"0\" \u4F1A\u4E0E\u300Cpush \u671F\u95F4\u7528\u6237\u65B0\u7F16\u8F91\u5199 '1'\u300D\u7ADE\u6001\u3001\u628A\u672A\u63A8\u7F16\u8F91\u8BEF\u5224 clean \u88AB\u9A71\u9010\uFF08\u00A7A \u6700\u72E0\u7EA2\u7EBF\uFF09\u3002\n    //   toName\uFF1A\u4E91\u7AEF\u540D \u2192 \u8EAB\u4EFD\u2014\u2014\u5168\u5E93\u552F\u4E00\u52A0\u5BC6\u540D\u5224\u5B9A seam\uFF0Ccloud-sync \u4E0E mergeTrash \u5171\u7528\u540C\u4E00\u4E2A\u51FD\u6570\uFF1B0.16.0 \u8D77\u7531 docKinds \u8868\u63A8\u5BFC\uFF08identifiers.fromCloud\uFF09\u3002\n    const toName = (cloudName) => ids.fromCloud(cloudName).identifier;\n    const cloud = createCloudSync({ provider, kv, fileName: (n) => n, encFileName: (n) => ids.sealed(n), toName, appKey: \"files\", manageDirty: false, hidden: config.hidden, identifiers: ids });\n    //   collections \u5B9E\u4F8B\uFF1A\u4E91\u7AEF\u843D `/.${appId}/<name>.json`\uFF08\u9690\u85CF\u5939\uFF0CisHidden \u8FC7\u6EE4\u51FA\u56FE\u5E93\uFF09\uFF1BappKey=\"collections\" \u2192 `${ns}.collections.etag:`/`.dirty:`\u3002\n    //     store.collection(name) \u8D70\u5B83\u3002name \u65E0\u540E\u7F00\uFF0Cstore \u8FFD\u52A0 `.json`\u3002\n    //     \uFF08**\u65E0\u4FDD\u7559\u540D**\uFF1A2026-07-13 \u8D77 `settings` \u4E5F\u53EA\u662F\u4E2A\u666E\u901A collection \u540D\uFF0CassertValidCollectionName \u53EA\u6821\u9A8C\u6587\u4EF6\u540D\u5408\u6CD5\u6027\u3002\uFF09\n    const collectionsCloud = createCloudSync({ provider, kv, fileName: (n) => `.${appId}/${n}.json`, appKey: \"collections\" });\n    const sub = createSubstrate();\n    const head = createLocalHead({\n        kv,\n        getCloudEtag: (n) => cloud.getETag(n),\n        setCloudEtag: (n, e) => cloud.setETag(n, e), // \u91C7\u7EB3\u4E91\u7248\u65F6\u63D0\u4EA4 durable etag\uFF08\u89C1 local-head.markSynced \u6CE8\u91CA\uFF1A\u5408 R1\uFF0C\u975E\u8FDD\u89C4\uFF09\n        keyPrefix: \"files\",\n    }); // \u2192 `${ns}.files.dirty:`\uFF08\u6587\u4EF6 dirty \u6743\u5A01\uFF09\n    // \u6570\u636E\u8FC1\u79FB\u6846\u67B6\uFF08ADR-0019\uFF09\uFF1A**createStore \u5185\u90E8\u81EA\u8DD1\u3001\u9690\u5F62**\u2014\u2014app \u770B\u4E0D\u89C1 migration\u3002\n    //   MIGRATIONS \u73B0\u4E3A\u7A7A\uFF08\u65E0\u7528\u6237/\u65E0\u540E\u5411\u517C\u5BB9\uFF0C2026-07-13 \u6E05 tax\uFF09\u2192 \u7F16\u6392\u8DD1\u7A7A\u3001\u65E0 op\uFF1B\u6846\u67B6\u7559\u7740\u5F85\u5C06\u6765\u7B2C\u4E00\u6761\u771F\u8FC1\u79FB\u3002\n    //   ops \u9996\u7528\u524D await migrationReady\uFF08open/save/list\uFF09\u3002\u6D4B\u8BD5/\u65E0 localStorage \u73AF\u5883\u8DF3\u8FC7\u3002\n    const migrationReady = config.skipMigration || !globalThis.localStorage\n        ? Promise.resolve()\n        : (() => {\n            const raw = createIdbCache(ns.dbName);\n            return runStoreMigrations(appId, databaseId, undefined, { keys: () => raw.keys(), del: (k) => raw.del(k) }).finally(() => { raw.close(); });\n        })();\n    const offloadMod = createOffload({ cloud, local, head, isOnline, serialize: sub.serialize }); // serialize\uFF1Aoffload \u7684 hardDelete \u27C2 save \u7684 local \u5199\u4E92\u65A5\uFF08\u7EA2\u7EBF\uFF1A\u9A71\u9010\u4E0D\u5403\u672A\u63A8\u5B57\u8282\uFF09\n    // \u4E91\u7AEF\u9632\u6296\u6807\u8BB0\uFF08candidate-gone\uFF09\uFF1Aclean cloud-gone \u5B64\u513F\u7B2C\u4E00\u6B21\u6743\u5A01\u89C1 gone \u53EA\u6807\u8BB0\uFF0C\u8DE8 GRACE \u7B2C\u4E8C\u6B21+ \u624D send trash\uFF08\u7528\u6237\u62CD\u677F ~24h\uFF0C2026-07-17\uFF09\u3002\n    const CLOUD_GONE_GRACE_MS = 24 * 3600 * 1000;\n    const pendingGone = createPendingGone(kv, config.cloudGoneGraceMs ?? CLOUD_GONE_GRACE_MS);\n    const reconcileMod = createReconcile({ cloud, local, head, pending: pendingGone, isOnline, activeIdentifier: config.activeIdentifier, hidden: config.hidden, drop: (n) => tierOf(n) === \"resource\" }); // 2.1.0\uFF1A\u4E09\u7B49\u8D44\u6E90\u4E91\u7AEF\u6CA1\u4E86\u672C\u5730\u76F4\u63A5\u4E22\n    // \u2500\u2500 \u5206\u7247\u4E0B\u8F7D\u4F1A\u8BDD\uFF08A1\uFF09\uFF1Astaging tee + \u64AD\u653E\u4F18\u5148/pin \u4E25\u683C\u4E32\u884C\u8C03\u5EA6\u3002keepOffline / openStream \u8D70\u5B83\u3002\u2500\u2500\n    const stagingStore = config.staging ?? createStagingStore(ns.stagingDbName); // 2.2.0\uFF1A\u6682\u5B58\u533A\u4F4F\u81EA\u5DF1\u7684\u5E93 `${appId}.${databaseId}.staging`\uFF08\u9053 6 F-58 \u00A78\uFF1B\u4E09\u7B49\u6682\u5B58\u4E0D\u518D\u548C\u4E00\u7B49\u4F5C\u54C1\u540C\u5E93\u540C\u8868\uFF09\n    const toU8Raw = async (raw) => raw instanceof Uint8Array ? raw : raw instanceof ArrayBuffer ? new Uint8Array(raw) : new Uint8Array(await raw.arrayBuffer());\n    const sessions = createDownloadSessions({\n        staging: stagingStore,\n        fetchMeta: async (name) => { const m = await cloud.fetchMeta(name); return m ? { etag: m.etag, size: m.size, item: m.item } : null; },\n        // \u5206\u7247\u76F4\u8FDE provider.downloadRange\uFF08item.ref \u5DF2\u5728\u5F00\u4F1A\u8BDD\u65F6\u89E3\u6790\u2014\u2014\u4E0D\u6BCF\u5206\u7247\u91CD\u8D70 metadata \u5F80\u8FD4\uFF09\u3002\n        range: async (item, offset, length, opts) => toU8Raw(await provider.downloadRange(item.ref, offset, length, opts)),\n        // promote \u843D\u5730\uFF1A\u5BF9\u9F50 identity.acquire \u8BED\u4E49\uFF08serialize \u9501 + markSynced\uFF09\uFF1B\u5DF2\u6709\u526F\u672C/dirty \u7EDD\u4E0D\u8986\u76D6\uFF08\u00A7A\uFF09\u3002\n        adoptLocal: (name, blob, etag) => sub.serialize(name, async () => {\n            if (await local.exists(name))\n                return false; // \u7528\u6237\u5176\u95F4\u6B63\u5E38 open \u8FC7 \u2192 \u5DF2\u6709\u526F\u672C\uFF0C\u6536\u644A\u4E0D\u8986\u76D6\n            if (head.isDirtyAnywhere(name))\n                return false; // dirty \u6C38\u4E0D\u8986\u76D6\uFF08\u53CC\u4FDD\u9669\uFF0Canywhere\uFF1A\u522B tab \u7684\u672A\u63A8\u4E5F\u7B97\uFF1Bdirty \u7406\u5E94\u8574\u542B\u6709\u672C\u5730\u526F\u672C\uFF09\n            await local.save(name, blob);\n            head.markSynced(name, etag);\n            notifyFolderOf(name); // \u5217\u4E3E\u5373\u65F6\u53CD\u6620\u300C\u5DF2\u7559\u79BB\u7EBF\u300D\n            return true;\n        }),\n        chunkSize: config.stagingChunkBytes,\n        capBytes: config.stagingCapBytes,\n        streaming: config.streaming, // 2.0.0 \u884C\u4E3A\u5F00\u5173\uFF08\u4E0D\u4F20 = 0.18\uFF09\n    });\n    // \u2500\u2500 folder \u672C\u5730\u767B\u8BB0\uFF08\u79BB\u7EBF\u5EFA\u7A7A\u5939\uFF09\uFF1Apending = \u5EFA\u4E86\u4F46\u8FD8\u6CA1\u786E\u8BA4\u4E0A\u4E91\u7684\u7A7A\u6587\u4EF6\u5939\u3002\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    //   \u79BB\u7EBF\u4E5F\u80FD\u5EFA\u7A7A\u5939\uFF08\u7528\u6237\u8981\u6C42\uFF09\uFF1A\u5148 kv \u767B\u8BB0 \u2192 \u5E76\u8FDB listAllItems.folders\uFF08\u79BB\u7EBF\u53EF\u89C1/\u6301\u4E45\uFF09\u2192 \u56DE\u7EBF drainFolders \u8865\u5EFA\u3002\n    const FOLDERS_PENDING_KEY = \"internal.pending_new_folders\"; // \u76F8\u5BF9\u952E \u2192 `${ns}.internal.pending_new_folders`\n    const readPending = () => { try {\n        const v = JSON.parse(kv.get(FOLDERS_PENDING_KEY) ?? \"[]\");\n        return Array.isArray(v) ? v : [];\n    }\n    catch {\n        return [];\n    } };\n    const writePending = (a) => kv.set(FOLDERS_PENDING_KEY, JSON.stringify([...new Set(a)]));\n    const addPendingFolder = (p) => writePending([...readPending(), p]);\n    const clearPendingFolder = (p) => writePending(readPending().filter((x) => x !== p));\n    // ensureFolder\uFF1A\u672C\u5730\u5148\u767B\u8BB0\uFF08\u79BB\u7EBF\u53EF\u89C1/\u6301\u4E45\uFF09\uFF0C\u5728\u7EBF\u5219\u8865\u5EFA\u4E91\u7AEF\u5E76\u6E05 pending\uFF1B\u79BB\u7EBF/\u5931\u8D25\u7559 pending \u7B49 drainFolders\u3002\n    async function ensureFolderLocalFirst(path) {\n        assertValidFileName(path, appId); // \u8DEF\u5F84\u62A4\u680F\uFF1A\u7981\u5728 .trash/.backup/.<appId> \u4FDD\u7559\u6839\u5EFA\u5939\n        cancelFolderDeletionForDescendant(path); // \u5EFA\u5939\uFF08\u542B\u91CD\u5EFA\u540C\u540D\uFF09\u2192 \u64A4\u9500\u8BE5\u5939/\u7956\u5148\u7684\u6392\u961F\u5220\u9664\uFF08eager-cancel\uFF09\n        addPendingFolder(path);\n        if (isOnline()) {\n            try {\n                await cloud.ensureFolder(path);\n                clearPendingFolder(path);\n            }\n            catch { /* \u7559 pending\uFF0C\u56DE\u7EBF\u8865\u5EFA */ }\n        }\n    }\n    async function drainFolders() {\n        if (!isOnline())\n            return;\n        for (const p of readPending()) {\n            try {\n                await cloud.ensureFolder(p);\n                clearPendingFolder(p);\n            }\n            catch { /* \u4E0B\u6B21\u518D\u8865 */ }\n        }\n    }\n    // \u2500\u2500 \u79BB\u7EBF\u300C\u5220\u5DF2\u4E0A\u4E91\u7A7A\u5939\u300D\u961F\u5217\uFF08\u955C\u50CF delete-file \u961F\u5217 delete.ts\uFF1B\u53EA\u6392**\u7A7A**\u5939\u2014\u2014enqueue \u524D\u5DF2\u4E24\u7AEF\u5224\u7A7A\uFF09\u3002\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    //   \u91CD\u653E\u8D70 cloud.deleteEmptyFolder\uFF08\u62A4\u680F\u5728 backend\uFF09\uFF1A\u975E\u7A7A(\u522B\u7AEF\u52A0\u4E86\u5185\u5BB9/\u5B50\u5939)\u2192\u53D6\u6D88(content wins)\u3001list-failed\u2192\u7559\u961F defer\u3002\n    const FOLDER_DEL_KEY = \"internal.pending_folder_deletions\"; // \u76F8\u5BF9\u952E \u2192 `${ns}.internal.pending_folder_deletions`\n    const readFolderDel = () => { try {\n        const v = JSON.parse(kv.get(FOLDER_DEL_KEY) ?? \"[]\");\n        return Array.isArray(v) ? v : [];\n    }\n    catch {\n        return [];\n    } };\n    const writeFolderDel = (a) => { const s = [...new Set(a)]; if (s.length)\n        kv.set(FOLDER_DEL_KEY, JSON.stringify(s));\n    else\n        kv.remove(FOLDER_DEL_KEY); };\n    const enqueueFolderDel = (p) => writeFolderDel([...readFolderDel(), p]);\n    const dequeueFolderDel = (p) => writeFolderDel(readFolderDel().filter((x) => x !== p));\n    // eager-cancel\uFF08\u955C\u50CF pendingGone.clear\uFF0CQ6 \u547D\u95E8\uFF09\uFF1A\u5728 path \u4E0B\u521B\u5EFA\u540E\u4EE3\uFF08\u5B58\u6587\u4EF6/\u5EFA\u5939\uFF09\u2192 \u64A4\u9500\u8BE5\u7956\u5148\u7684\u6392\u961F\u5220\u9664\uFF08un-hide\uFF09\u3002\n    function cancelFolderDeletionForDescendant(path) {\n        const q = readFolderDel();\n        const keep = q.filter((f) => !(path === f || path.startsWith(`${f}/`)));\n        if (keep.length !== q.length) {\n            writeFolderDel(keep);\n            for (const f of q)\n                if (!keep.includes(f))\n                    notifyFolderOf(f);\n        }\n    }\n    // \u91CD\u653E\u5220\u6587\u4EF6\u5939\uFF08drainOfflineQueue \u7B2C 4 \u6B65\uFF09\uFF1A**\u6DF1\u2192\u6D45**\uFF08\u7236\u5939\u89C1\u7A7A\u5B50\u5939\u4F1A\u8BEF\u5224 non-empty\uFF1B\u5148\u5220\u6DF1\u7684\uFF09\u3002\n    async function drainFolderDeletions() {\n        if (!isOnline())\n            return;\n        const q = readFolderDel().sort((a, b) => b.split(\"/\").length - a.split(\"/\").length);\n        for (const p of q) {\n            let r;\n            try {\n                r = await cloud.deleteEmptyFolder(p);\n            }\n            catch (e) {\n                ui.reportError(e, \"warning\");\n                continue;\n            } // \u975E\u6587\u4EF6\u5939\u7B49\u5F02\u5E38 \u2192 \u7559\u961F skip\n            if (r.status === \"list-failed\")\n                continue; // \u786E\u8BA4\u4E0D\u4E86\u7A7A \u2192 \u7559\u961F defer\n            dequeueFolderDel(p);\n            notifyFolderOf(p); // deleted/already-gone/non-empty(content wins \u53D6\u6D88) \u90FD\u7EC8\u6001\u51FA\u961F\n        }\n    }\n    // \u79BB\u7EBF\u961F\u5217\u7EDF\u4E00\u91CD\u653E\uFF08app \u5728 online/boot/reconnect \u8C03\uFF09\u2014\u2014**\u6309\u5E8F**\uFF1A\u65B0\u6587\u4EF6\u5939\u8865\u5EFA \u2192 \u65B0\u4E0A\u4F20\u8865\u63A8 \u2192 \u5220\u6587\u4EF6 \u2192 \u5220\u6587\u4EF6\u5939(\u6DF1\u2192\u6D45)\u3002\n    //   \u5220\u6587\u4EF6\u5939\u653E\u6700\u540E\uFF1Aqueued \u6587\u4EF6\u5220\u5B8C \u2192 \u5939\u624D\u771F\u7A7A \u2192 deleteEmptyFolder \u624D\u6210\u3002\n    async function drainOfflineQueue() {\n        await drainFolders(); // \u2460 \u65B0\u5EFA\u7684\u7A7A\u5939\u8865\u5EFA\uFF08\u5148\u5EFA\uFF0C\u540E\u9762\u7684\u4E0A\u4F20\u53EF\u80FD\u843D\u5728\u91CC\u5934\uFF09\n        await uploadReplay.drain(); // \u2461 \u79BB\u7EBF\u65B0\u4E0A\u4F20\u8865\u63A8\uFF08ADR-0018\uFF1Bask \u6A21\u5F0F\u5185\u90E8\u5148\u95EE\uFF09\n        await del.drainDeleteQueue(); // \u2462 \u79BB\u7EBF\u5220\u6587\u4EF6\u91CD\u653E\uFF08base-etag \u5B88\u536B\uFF0Cedit-wins\uFF09\n        await drainFolderDeletions(); // \u2463 \u79BB\u7EBF\u5220\u6587\u4EF6\u5939\u91CD\u653E\uFF08\u6DF1\u2192\u6D45\uFF0Cnon-empty \u53D6\u6D88 / list-failed defer\uFF09\n    }\n    // \u2500\u2500 \u7EDF\u4E00\u5217\u4E3E\uFF08README \u00A72\uFF09\uFF1A\u6574\u4E2A\u865A\u62DF FS \u4E00\u6B21\u5217\u4E3E = local \u222A cloud\uFF0C\u6BCF\u9879\u5E26 syncState\u3002mergeLocalCloud \u6536\u8FDB\u5E93\u5185\u3002\u2500\u2500\n    const listing = createListing({ cloud, local, head, pendingFolders: readPending, isPendingGone: (p) => pendingGone.isPending(p), pendingFolderDeletions: readFolderDel, hidden: config.hidden,\n        describe: (n) => { const d = ids.parse(n); return { kind: d?.kind, tier: d?.tier ?? \"work\" }; } }); // 2.1.2\uFF1A\u5217\u4E3E\u884C\u5E26 kind / tier\uFF08user\u300C\u5E26\u300D\uFF09\n    // \u2500\u2500 watchFolder\uFF08\u7F51\u76D8\u6A21\u578B\uFF09\uFF1A\u8BA2\u9605**\u4E00\u4E2A**\u6587\u4EF6\u5939\u3002app \u53EA\u77E5\u300C\u8FD9\u4E00\u5939\u66F4\u65B0\u4E86\u300D\uFF0C\u5206\u4E0D\u51FA\u4E5F\u4E0D\u9700\u5206 local/remote\u3002\u2500\u2500\u2500\u2500\u2500\u2500\n    //   \u8FDE\u63A5\u6001 store \u81EA\u6301\uFF08config.signedIn/isOnline\uFF09\u2014\u2014app \u4E0D\u518D\u4F20 ctx\u3002\u6BCF\u6B21\u56DE\u8C03\u540C shape\uFF08FolderSnapshot\uFF0C\u4EC5\u8BE5\u5939\u76F4\u5C5E\u5B50\u9879\uFF09\u3002\n    //   \u4E24\u5E27\u8282\u5F8B\uFF1A\u2460 \u7ACB\u5373\u672C\u5730\u5E27\uFF08\u7EDD\u4E0D\u7A7A/throw\uFF0Coffline-first\uFF09\u2461 \u4E91\u7AEF\u5E27\uFF08\u62C9\u8BE5\u5939\u4E00\u6B21 + \u60F0\u6027 reconcileFolder\uFF0C\u5230\u4E86\u7528**\u540C\u4E00 cb** \u518D\u95EA\uFF09\u3002\n    //   \u4E4B\u540E\u672C\u5939\u4EFB\u4F55\u672C\u5730\u5199\uFF08save/rename/delete/\u5EFA\u5220\u5939\uFF09\u2192 notifyFolderOf \u91CD\u63A8\u672C\u5730\u5E27\uFF08\u5373\u65F6\u53CD\u6620\uFF0C\u65E0\u4E91\u5F80\u8FD4\uFF1B\u4E91\u7AEF\u5237\u65B0\u53EA\u5728\u8BA2\u9605\u65F6/\u663E\u5F0F\uFF09\u3002\n    const ctxNow = () => ({ signedIn: signedIn(), online: rawOnline() });\n    const LOCAL_CTX = { signedIn: false, online: false }; // \u5F3A\u5236\u672C\u5730\u89C6\u89D2\uFF08\u9996\u5E27/\u5199\u540E\u91CD\u753B\uFF1A\u4E91\u4E0D\u53EF\u8FBE \u2192 \u7EAF\u672C\u5730 union\uFF09\n    const folderWatchers = new Map();\n    // 0.11.6 \u660E\u786E\u767B\u51FA \u2192 \u6E05 dir-index-cache\uFF08\u672C\u5730\u5E27\u300C\u7F13\u5B58\u5728\u5C31\u63BA\u300D\u7684\u552F\u4E00\u53CD\u4F8B\uFF09\uFF1Bexpired/silent/signIn \u4E0D\u52A8\u7F13\u5B58\u3002\u6E05\u5B8C\u628A\u5728\u770B\u7684\u5939\u91CD\u753B\u4E00\u5E27\u3002\n    const unAuth = provider.onAuthChanged?.((ev) => {\n        if (ev.reason !== \"signOut\")\n            return;\n        void (async () => {\n            try {\n                await local.clearDirIndexCache?.();\n            }\n            catch (e) {\n                ui.reportError(e, \"log\");\n            }\n            for (const f of [...folderWatchers.keys()])\n                void pushLocalFrame(f);\n        })();\n    });\n    // 0.11.1\uFF08user 2026-08-31 \u6279\u51C6 S1\uFF09\uFF1A\u5E27\u5931\u8D25\u7684**\u8BA2\u9605\u8005\u4FE1\u53F7\u9762**\u3002\u4EE5\u524D\u672C\u5730\u5E27/\u8FDC\u7AEF\u5E27\u629B\u9519\u53EA ui.reportError\uFF08\u6A2A\u5E45\uFF09\uFF0C\n    //   \u8BA2\u9605\u8005\u6C38\u8FDC\u6536\u4E0D\u5230\u5E27\u4E5F\u6536\u4E0D\u5230\u9519\u2014\u2014WeebPaint \u56FE\u5E93\u505C\u5728 loading \u7A7A\u767D\uFF08\u6848\u53D1 2026-08-31 iPad \u957F\u753B\u9501\u5C4F\u540E\uFF09\u3002\n    //   onError \u6309 watcher \u6302\u8FB9\u8868\uFF08WeakMap\uFF0C\u9000\u8BA2\u5373\u6563\uFF09\uFF1Bphase \u544A\u8BC9 app \u662F\u672C\u5730\u5E27\uFF08IDB \u8BFB\uFF09\u8FD8\u662F\u8FDC\u7AEF\u5E27\uFF08\u4E91\u5217\u4E3E/\u6536\u655B\uFF09\u5931\u8D25\u3002\n    const watcherOnError = new WeakMap();\n    function emitFolderError(folder, err, phase) {\n        const set = folderWatchers.get(folder);\n        if (!set)\n            return;\n        for (const cb of set) {\n            const h = watcherOnError.get(cb);\n            if (h) {\n                try {\n                    h(err, phase);\n                }\n                catch (e) {\n                    ui.reportError(e);\n                }\n            }\n        }\n    }\n    // \u2500\u2500 dir-index-cache\uFF08A3\uFF0C2026-08-15 user \u6279\uFF09\uFF1A\u6BCF\u5939\u300C\u4E0A\u6B21**\u5B8C\u6574**\u4E91\u5E27\u300D\u7684\u76EE\u5F55\u7D22\u5F15\u7F13\u5B58\uFF08**\u975E SSoT\uFF0C\u810F\u7684**\uFF0C\n    //   \u53EA\u914D\u753B\u9996\u5E27\uFF09\u2192 \u51B7\u9996\u5E27\u5373\u663E cloud-only \u7F3A\u9879\u3002schema v1\uFF08JSON \u4E32\u843D dir-index-cache \u5206\u533A\uFF0Ckey=\u5939\u8DEF\u5F84\uFF0C\"\"=\u6839\uFF09\uFF1A\n    //     { v:1, folder, savedAt:ms, files:[{name,eTag,size,lastModified?ms,id?}], folders:[\u5168\u8DEF\u5F84] }\n    //   \u7EAA\u5F8B\uFF1A\u2460 \u53EA\u5728\u73B0\u573A\u4E91\u5E27 complete:true \u65F6\u8986\u76D6\u5199\uFF08partial \u4E0D\u843D\u5E95\uFF09\uFF1B\u2461 \u53EA\u5582\u672C\u5730\u5E27\u7684 cloud-only \u8FFD\u52A0\u663E\u793A\uFF0C\n    //   **\u7EDD\u4E0D\u5582 reconcile/gone \u5224\u5B9A**\uFF08\u7EA2\u7EBF\uFF09\uFF1B\u2462 savedAt \u4EC5\u663E\u793A/\u6392\u969C\uFF0C\u4E0D\u505A\u4EFB\u4F55\u5185\u5BB9\u51B3\u7B56\uFF08no-timestamps \u7EA2\u7EBF\uFF09\uFF1B\n    //   \u2463 \u5FEB\u7167\u4E0D\u7ED1\u8D26\u53F7\u2014\u2014\u540C app \u6362\u4E91\u8D26\u53F7\u65F6\u9996\u5E27\u53EF\u80FD\u77ED\u6682\u663E\u793A\u524D\u8D26\u53F7\u7684\u6587\u4EF6\u540D\uFF0C\u4E91\u7AEF\u5E27\u5230\u8FBE\u5373\u7EA0\u504F+\u8986\u76D6\uFF08\u5BB6\u65CF\u5355\u7528\u6237\uFF0C\u5DF2\u77E5\u5C40\u9650\uFF09\u3002\n    const SNAP_V = 1;\n    async function readDirIndexCache(folder) {\n        if (!local.getDirIndexCache)\n            return null; // \u6CE8\u5165\u7684 LocalCache \u4E0D\u652F\u6301 \u2192 \u7279\u6027\u9759\u9ED8\u5173\u95ED\n        try {\n            const raw = await local.getDirIndexCache(folder);\n            if (!raw)\n                return null;\n            const p = JSON.parse(raw);\n            if (p?.v !== SNAP_V || !Array.isArray(p.files) || !Array.isArray(p.folders))\n                return null; // \u7248\u672C/\u5F62\u72B6\u4E0D\u8BA4 \u2192 \u5F53\u6CA1\u6709\uFF08\u4E0B\u6B21\u5B8C\u6574\u4E91\u5E27\u91CD\u5199\uFF09\n            return p;\n        }\n        catch (e) {\n            ui.reportError(e, \"log\");\n            return null;\n        }\n    }\n    function writeDirIndexCache(folder, live) {\n        if (!local.putDirIndexCache || !live.complete)\n            return;\n        // \u6301\u4E45\u952E\u540D**\u4FDD\u6301 `id`**\uFF08schema v1 \u4E0D\u52A8\uFF0C\u975E\u6301\u4E45\u5316\u7ED3\u6784\u53D8\u66F4\uFF09\u2014\u2014\u503C = CloudItem.ref\uFF08SW \u7F51\u5173\u6309\u540D\u89E3\u6790\u514D Graph\n        //   \u5F80\u8FD4\uFF1Bref \u9648\u4E86\u7F51\u5173\u6709\u5931\u6548\u91CD\u89E3\u6790\u515C\u5E95\uFF0Cgateway.ts\uFF09\u3002\u5B57\u6BB5\u66F4\u540D ref \u53EA\u5728\u5185\u5B58/exports \u5C42\uFF082026-08-25 \u62CD\u677F\uFF09\u3002\n        const files = live.files.filter((c) => !isHidden(c.name)).map((c) => ({ name: c.name, eTag: c.eTag, size: c.size, lastModified: toMs(c.lastModifiedDateTime), id: c.ref }));\n        const folders = live.folders.filter((f) => !isHidden(f));\n        // fire-and-forget\uFF1A\u5FEB\u7167\u5199\u5931\u8D25\u53EA log\uFF0C\u7EDD\u4E0D\u5F71\u54CD\u5E27\u4EA4\u4ED8\u3002\n        void local.putDirIndexCache(folder, JSON.stringify({ v: SNAP_V, folder, savedAt: Date.now(), files, folders })).catch((e) => ui.reportError(e, \"log\"));\n    }\n    // \u63A8\u4E00\u5E27\u7ED9\u67D0\u5939\u7684\u6240\u6709 watcher\u3002**sanity-check**\uFF1Asnapshot.path \u5FC5\u987B === \u8BA2\u9605 path\u2014\u2014orchestration \u9519\u4E71\u628A\u522B\u5939\u63A8\u6765\u5C31\u4E22\u5F03\uFF08\u7EA2\u7EBF\uFF1A\u7EDD\u4E0D\u628A\u522B\u5939\u5185\u5BB9\u585E\u7ED9\u8FD9\u4E2A watcher\uFF09\u3002\n    function emitFolder(folder, snap) {\n        if (snap.folder !== folder) {\n            ui.reportError(new Error(`watchFolder \u8DEF\u5F84\u9519\u4E71\uFF1A\u8BA2\u9605\u300C${folder}\u300D\u6536\u5230\u300C${snap.folder}\u300D\uFF0C\u5DF2\u4E22\u5F03`));\n            return;\n        }\n        const set = folderWatchers.get(folder);\n        if (!set)\n            return;\n        for (const cb of set) {\n            try {\n                cb(snap);\n            }\n            catch (e) {\n                ui.reportError(e);\n            }\n        }\n    }\n    // \u672C\u5730\u5E27 = \u7EAF\u672C\u5730 union + stale \u5FEB\u7167\u8FFD\u52A0\u3002\n    //   0.11.6\uFF08user 2026-09-06 \u6279\u300C\u51ED\u8BC1\u8FC7\u671F\u4ECD\u663E\u793A\u4E91\u7AEF\u540D\u5355\u300D\uFF09\uFF1A**\u7F13\u5B58\u5728\u5C31\u63BA**\uFF0C\u4E0D\u518D\u770B signedIn()\u2014\u2014\u7F13\u5B58\u5B58\u5728\u672C\u8EAB\u5C31\u8BC1\u660E\u8FD9\u53F0\u8BBE\u5907\u4E0A\n    //   \u8FD9\u4E2A\u5E93\u66FE\u5BF9\u7740\u4E00\u4E2A\u4E91\u8D26\u53F7\u62FF\u5230\u8FC7\u5B8C\u6574\u4E91\u5E27\uFF1B\u51ED\u8BC1\u8FC7\u671F\uFF08getToken \u9759\u9ED8\u5931\u8D25\u6E05 activeAccount\uFF09\u3001\u51B7\u542F\u52A8\u9996\u5E27\u6BD4 MSAL init \u5FEB\uFF0C\u90FD\u4E0D\u8BE5\u8BA9\n    //   60 \u5F20\u753B\u51ED\u7A7A\u6D88\u5931\u6210 3 \u5F20\uFF0809-06 \u6668\u6848\uFF09\u3002\u552F\u4E00\u4E0D\u63BA = \u660E\u786E\u767B\u51FA\uFF1Aprovider.onAuthChanged reason \"signOut\" \u2192 \u6E05\u6574\u4E2A\u5206\u533A\uFF08\u89C1\u4E0B\uFF09\u3002\n    //   stale \u53EA\u8865 cloud-only \u7F3A\u9879\uFF0C\u672C\u5730\u9879 badge \u4ECD\u584C\u5230\u672C\u5730\u89C6\u89D2\uFF08listing \u5185\u4FDD\u8BC1\uFF09\u2014\u2014\u5199\u540E\u91CD\u753B\u4E5F\u8D70\u8FD9\uFF0Ccloud-only \u9879\u4E0D\u95EA\u6CA1\u3002\n    async function localFrameSnap(folder) {\n        const stale = await readDirIndexCache(folder);\n        return listing.listFolder(folder, LOCAL_CTX, stale ? { staleCloud: stale } : undefined);\n    }\n    async function pushLocalFrame(folder) {\n        if (!folderWatchers.has(folder))\n            return;\n        try {\n            emitFolder(folder, await localFrameSnap(folder));\n        }\n        catch (e) {\n            ui.reportError(e);\n            emitFolderError(folder, e, \"local\");\n        }\n    }\n    async function pushRemoteFrame(folder) {\n        if (!folderWatchers.has(folder))\n            return;\n        void ensureScaffold(); // store \u81EA\u7BA1 scaffold \u7684\u9996\u6B21\u4E91\u6210\u529F\u70B9\uFF1A\u5F00\u5E93\u65F6 auth \u672A\u5C31\u7EEA\u8DF3\u8FC7\u7684\uFF0C\u8FD9\u91CC\uFF08app \u8BA2\u9605\u3001auth \u5C31\u7EEA\u540E\uFF09\u8865\u5EFA\n        // **\u5355\u6B21**\u73B0\u573A\u4E91\u5217\u4E3E\uFF0Creconcile \u4E0E listing \u5171\u4EAB\uFF08A3 \u4FEE\u53CC\u62C9\uFF1A\u4E00\u6B21\u8BA2\u9605\u53EA\u6253\u4E00\u904D Graph\uFF09\u3002\u5931\u8D25 \u2192 null\uFF08\u4E91\u4E0D\u53EF\u8FBE\uFF0C\u5404\u81EA\u4F18\u96C5\u964D\u7EA7\uFF09\u3002\n        const ctx = ctxNow();\n        const live = (ctx.online && ctx.signedIn) ? await cloud.listFolder(folder).catch((e) => { ui.reportError(e, \"log\"); return null; }) : null;\n        await reconcileMod.reconcileFolder(folder, { cloudPrefetched: live }).catch((e) => ui.reportError(e)); // \u300C\u770B\u5230\u5939\u624D reconcile\u300D\uFF1A\u60F0\u6027\u3001\u975E\u9759\u9ED8\u3001\u4EC5\u672C\u5939\uFF08\u5582\u7684\u662F**\u73B0\u573A**\u5E27\uFF0C\u7EDD\u975E\u5FEB\u7167\uFF09\n        try {\n            // 0.11.6\uFF1A\u4E91\u4E0D\u53EF\u8FBE / \u51ED\u8BC1\u8FC7\u671F / \u672A\u767B\u5F55\u65F6\u7684\u8FD9\u4E00\u5E27**\u540C\u6837\u63BA stale**\u2014\u2014\u5426\u5219\u5B83\u4F1A\u628A\u672C\u5730\u5E27\u521A\u663E\u51FA\u6765\u7684\u4E91\u7AEF\u540D\u5355\u53C8\u62B9\u6389\n            //   \uFF0809-06 \u6668\u6848 items=4 \u7684\u7B2C\u4E8C\u53EA\u624B\uFF1A\u672C\u5730\u5E27\u63BA\u4E86\u3001\u8FDC\u7AEF\u5E27\u6CA1\u63BA \u2192 \u4E24\u5E27\u4E00\u95EA\u53C8\u5269 4 \u5F20\uFF09\u3002live \u5230\u4E86\u5C31\u4EE5\u73B0\u573A\u4E91\u5E27\u4E3A\u51C6\u3002\n            const stale = live ? null : await readDirIndexCache(folder);\n            emitFolder(folder, await listing.listFolder(folder, ctx, stale ? { cloudPrefetched: live, staleCloud: stale } : { cloudPrefetched: live }));\n        }\n        catch (e) {\n            ui.reportError(e);\n            emitFolderError(folder, e, \"remote\");\n        }\n        if (live?.complete) {\n            writeDirIndexCache(folder, live); // \u5B8C\u6574\u4E91\u5E27 \u2192 \u8986\u76D6\u76EE\u5F55\u7D22\u5F15\u7F13\u5B58\uFF08\u4E0B\u6B21\u51B7\u9996\u5E27\u7684\u5E95\uFF09\n            for (const f of live.files)\n                if (f.eTag)\n                    freshHints.note(f.name, { etag: f.eTag, lastModified: f.lastModifiedDateTime, size: f.size, item: f }); // 0.17.0\uFF1Aopen \u7684\u65B0\u9C9C\u5EA6\u8BC1\u636E\uFF08\u53EA\u5582\u5B8C\u6574\u73B0\u573A\u5E27\uFF09\n        }\n    }\n    // \u5199\u8DEF\u5F84\u53D8\u52A8 \u2192 \u901A\u77E5\u53D7\u5F71\u54CD\u5939\uFF08name \u7684\u7236\u5939\uFF09\u7684 watcher \u5373\u65F6\u91CD\u753B\u672C\u5730\u5E27\u3002\n    function notifyFolderOf(name) {\n        void pushLocalFrame(name.includes(\"/\") ? name.slice(0, name.lastIndexOf(\"/\")) : \"\");\n    }\n    /** opts.onError\uFF080.11.1\uFF09\uFF1A\u672C\u5939\u67D0\u4E00\u5E27**\u4EA7\u4E0D\u51FA\u6765**\u65F6\u7684\u8BA2\u9605\u8005\u4FE1\u53F7\uFF08phase \"local\" = \u672C\u5730\u5E27/IDB \u8BFB\u5931\u8D25\uFF0C\"remote\" = \u4E91\u5217\u4E3E/\n     *  \u6536\u655B\u540E\u7684\u5408\u5E27\u5931\u8D25\uFF09\u3002\u8BED\u4E49\u662F\u300C\u8FD9\u4E00\u5E27\u6CA1\u4E86\u300D\u800C\u975E\u300C\u8BA2\u9605\u574F\u4E86\u300D\uFF1A\u8BA2\u9605\u4ECD\u6D3B\u7740\uFF0C\u540E\u7EED\u5199\u89E6\u53D1\u7684\u672C\u5730\u5E27\u7167\u5E38\u6765\uFF1Bapp \u636E\u6B64\u628A\n     *  loading \u6362\u6210\u300C\u8BFB\u53D6\u5931\u8D25 + \u91CD\u8BD5\u300D\u800C\u4E0D\u662F\u6C38\u8FDC\u8F6C\u5708\u3002\u4E0D\u4F20 = \u65E7\u884C\u4E3A\uFF08\u53EA ui.reportError\uFF09\u3002 */\n    function watchFolder(folder, cb, opts) {\n        if (folder)\n            assertValidFileName(folder, appId); // \u8DEF\u5F84\u62A4\u680F\uFF08\u7A7A=\u6839\uFF0C\u653E\u884C\uFF09\uFF1A\u7981\u8BA2\u9605\u4FDD\u7559\u6839\n        let set = folderWatchers.get(folder);\n        if (!set) {\n            set = new Set();\n            folderWatchers.set(folder, set);\n        }\n        set.add(cb);\n        if (opts?.onError)\n            watcherOnError.set(cb, opts.onError);\n        const fail = (e, phase) => { ui.reportError(e); try {\n            opts?.onError?.(e, phase);\n        }\n        catch (e2) {\n            ui.reportError(e2);\n        } };\n        void (async () => {\n            try {\n                await migrationReady;\n            }\n            catch (e) {\n                fail(e, \"local\");\n                return;\n            } // \u8FC1\u79FB\u95E8 reject \u4EE5\u524D\u662F unhandled rejection + \u6C38\u65E0\u5E27\n            try {\n                cb(await localFrameSnap(folder));\n            }\n            catch (e) {\n                fail(e, \"local\");\n            } // \u2460 \u672C\u5730\u5E27\uFF08\u8BE5\u65B0\u8BA2\u9605\u8005\uFF1B\u542B stale \u5FEB\u7167\u8FFD\u52A0 \u2192 \u51B7\u9996\u5E27\u5373\u663E\u4E91\u7AEF\u7F3A\u9879\uFF09\n            await pushRemoteFrame(folder); // \u2461 \u4E91\u7AEF\u5E27\uFF08\u5168\u4F53 watcher\uFF1B\u5931\u8D25\u7ECF emitFolderError \u901A\u77E5\uFF09\n        })();\n        return () => { const s = folderWatchers.get(folder); if (s) {\n            s.delete(cb);\n            if (!s.size)\n                folderWatchers.delete(folder);\n        } };\n    }\n    // \u2500\u2500 \u540D\u5B57\u5360\u7528\u68C0\u67E5\uFF08**\u552F\u4E00\u6743\u5A01**\uFF1Alocal + remote \u7EDF\u4E00\u5728\u6B64\uFF09\u2014\u2014rename \u62A4\u680F\u3001tryMove\u3001mode:\"new\" \u9996\u5B58\u62A4\u680F\u3001app \u9884\u68C0\u5168\u8D70\u5B83\u3002\u2500\u2500\n    //   \u672C\u5730\u5DF2\u6709 \u2192 \"local\"\uFF1B\u5426\u5219\u5728\u7EBF\u4E14\u4E91\u7AEF\u5DF2\u6709 \u2192 \"cloud\"\uFF1B\u90FD\u65E0\uFF08\u6216\u79BB\u7EBF\u67E5\u4E0D\u4E86\u4E91\uFF09\u2192 null\u3002\u79BB\u7EBF\u53EA\u67E5\u672C\u5730\uFF08\u9760 push conflictBehavior:fail \u515C\u5E95\uFF09\u3002\n    async function nameOccupied(name) {\n        if (await local.exists(name))\n            return \"local\";\n        if (isOnline()) {\n            try {\n                if (await cloud.fetchMeta(name))\n                    return \"cloud\";\n            }\n            catch { /* \u4E91\u4E0D\u53EF\u8FBE \u2192 \u5F53\u672A\u5360\u7528\uFF0Cpush \u65F6 fail \u515C\u5E95 */ }\n        }\n        return null;\n    }\n    // \u2500\u2500 seal\uFF1A\u52A0\u5BC6\u900F\u660E\uFF08crypto-container \u9ED8\u8BA4\uFF1BgetPassword \u975E\u4EA4\u4E92\uFF09\u3002\u4E0D\u52A0\u5BC6\u5BBF\u4E3B \u2192 getPassword \u6052 null=\u900F\u4F20 \u2500\u2500\n    const seal = createSeal({\n        looksContainer: (b) => enc.looksEncryptedContainer(b),\n        pack: (o) => enc.packContainer({ dataBytes: o.dataBytes, fileName: o.fileName, ext: o.ext, peek: o.peek, password: o.password }),\n        unpack: (blob, pw) => enc.unpackContainer(blob, pw),\n        getPassword,\n        getPrev: (n) => local.get(n),\n        makePeek: config.crypt?.makePeek, // \u660E\u6587\u2192peek\uFF08app \u57DF\uFF0C\u5982 ora \u7F29\u7565\u56FE\uFF09\uFF1B\u4E0D\u7ED9 \u2192 \u5BB9\u5668\u65E0 peek\n    });\n    // \u2500\u2500 flow \u6DF1\u6A21\u5757 \u2500\u2500\n    const safeResolve = createSafeResolve({\n        cloud, local, head,\n        localDirty: () => sub.edits.localDirty(),\n        serialize: sub.serialize, // 0.15.2\uFF1A\u62C9\u4E91\u8986\u76D6\u7684\u4E34\u754C\u6BB5\u4E0E\u7528\u6237\u4FDD\u5B58\u7684\u672C\u5730\u5199\u540C\u94FE\u4E92\u65A5\n        validateAdopt: (plain, name) => (ids.rowOf(name)?.validate ?? validateAdopt)(plain), // 2.1.0\uFF1A\u6BCF\u79CD\u6587\u6863\u53EF\u5E26\u81EA\u5DF1\u7684\u9A8C\u771F\uFF0C\u6CA1\u5E26\u7528\u5168\u5C40\u7684\n        unseal: (n, blob) => seal.unsealForRead(n, blob), // \u8FD4\u660E\u6587\uFF1B\u52A0\u5BC6\u4F46\u9501\u5B9A \u2192 null\uFF08safePull \u9000\u9A8C\u5C01\u5957\uFF09\n        looksEncrypted: (b) => enc.looksEncryptedContainer(b),\n    });\n    // busy \u6587\u6848\u63A5\u7F1D\uFF082026-08-21\uFF09\uFF1A\u6A21\u5757\u53EA\u53D1 StoreTextKey\uFF0C\u8FD9\u91CC\u7EDF\u4E00\u6362\u8BD1\u6587\uFF08\u5BBF\u4E3B text \u4F18\u5148\uFF0C\u7F3A\u7701\u82F1\u6587\uFF09\u3002\n    const busyT = (label, fn) => ui.busy(resolveStoreText(ui.text, label), fn, label);\n    /** \u5E26\u63D2\u503C\u53C2\u6570\u7684\u76F4\u8C03\u7248\uFF08key \u540C\u6837\u900F\u4F20\u7ED9\u5BBF\u4E3B\uFF09\u3002 */\n    const busyK = (key, params, fn) => ui.busy(resolveStoreText(ui.text, key, params), fn, key);\n    // F-54\uFF1A\u4E0A\u4F20\u4F1A\u8BDD\u8BB0\u5FC6\u9762\uFF08\u5F00\u4E86 uploads.resumable \u624D\u6709\uFF09\u3002token = \u8FD9\u4EFD\u5B57\u8282\u7684 sha256\uFF08\u53EA\u8BA4\u300C\u540C\u4E00\u4EFD\u5B57\u8282\u300D\uFF0C\u4E0D\u662F\u8EAB\u4EFD\u2014\u2014\u8EAB\u4EFD\u6C38\u8FDC\u662F\u8DEF\u5F84\uFF09\uFF1B\u8BB0\u5F55\u4F4F kv `internal.upload-session:<\u540D>`\u3002\n    const sessionFor = config.uploads?.resumable ? async (name, bytes) => {\n        const subtle = globalThis.crypto?.subtle;\n        if (!subtle || bytes.byteLength <= 4 * 1024 * 1024)\n            return undefined; // \u2264 4 MB \u8D70\u7B80\u5355\u4E0A\u4F20\u3001\u6CA1\u6709\u4F1A\u8BDD\uFF1B\u6CA1 WebCrypto \u5C31\u4E0D\u8BB0\n        const digest = new Uint8Array(await subtle.digest(\"SHA-256\", bytes));\n        const token = Array.from(digest, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n        const key = `internal.upload-session:${name}`;\n        return {\n            token,\n            async load() { try {\n                const v = kv.get(key);\n                return v ? JSON.parse(v) : null;\n            }\n            catch {\n                return null;\n            } },\n            async save(rec) { kv.set(key, JSON.stringify(rec)); },\n            async clear() { kv.remove(key); },\n        };\n    } : undefined;\n    const pushMod = createPush({ cloud, head, seal, safeResolve, serialize: sub.serialize, editVersion: () => sub.edits.version(), busy: busyT, sessionFor, ...config.pushRetry });\n    // \u2500\u2500 ADR-0018 \u79BB\u7EBF\u300C\u65B0\u4E0A\u4F20\u300D\u56DE\u7EBF\u8865\u63A8\uFF08\u4EC5 never-synced float\uFF1B\u7F16\u8F91\u4ECD consent-surface\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const uploadReplayPolicy = config.offlineUploadReplay ?? \"manual\";\n    if (uploadReplayPolicy !== \"manual\") { // \u5F3A\u5236 UI\uFF08\u7981 noop/silent\uFF09\uFF0C\u5BF9\u9F50 busy/resolveConflict/reportError \u7684\u5FC5\u586B\u5F8B\n        if (!ui.onReplayStatus)\n            throw new Error(\"createStore: offlineUploadReplay\u2260'manual' \u9700 ui.onReplayStatus\uFF08ADR-0018 \u5F3A\u5236 UI \u63D0\u793A\uFF09\");\n        if (uploadReplayPolicy === \"ask\" && !ui.confirmReplay)\n            throw new Error(\"createStore: offlineUploadReplay='ask' \u9700 ui.confirmReplay\uFF08\u56DE\u7EBF\u8BE2\u95EE\u7528\u6237\uFF09\");\n    }\n    // \u540E\u53F0 push \u5B9E\u4F8B\uFF1A\u4E0E pushMod \u540C\u6DF1\u6A21\u5757\u7F16\u6392\uFF0C\u552F busy \u6362\u900F\u4F20\u2014\u2014drain \u4E0D\u9501\u5C4F\uFF08ADR-0018 \u00A74\uFF1A\u975E busy \u540E\u53F0\uFF09\u3002\n    const pushBg = createPush({ cloud, head, seal, safeResolve, serialize: sub.serialize, editVersion: () => sub.edits.version(), busy: (_l, fn) => fn(), sessionFor, ...config.pushRetry });\n    // 0.15.1\uFF082026-09-26\uFF0CWXHW user\u300C\u4E3A\u4EC0\u4E48\u63A8\u52A0\u5BC6\u4EF6\u9700\u8981\u5BC6\u7801\u3002\u4E0D\u5C31\u662F\u4E8C\u8FDB\u5236\u5417\u300D\u2192\u300C\u4FEE\u300D\uFF09\uFF1A**\u672C\u5730 at-rest \u5B57\u8282\u76F4\u63A8\uFF0C\u4E0D\u89E3\u58F3\u4E0D\u91CD\u5C01**\u3002\n    //   \u4EE5\u524D\u5148 unsealForRead \u5F97\u660E\u6587\u518D\u4EA4 doPush \u91CD\u65B0 sealForWrite \u2014\u2014 \u7B49\u4E8E\u8981\u5BC6\u7801\u624D\u80FD\u628A\u5DF2\u7ECF\u5C01\u597D\u7684\u5BB9\u5668\u642C\u4E0A\u4E91\uFF1B\u9501\u7740\uFF08\u65E0\u5BC6\u7801\uFF09= status \"locked\" \u7559 dirty\uFF0C\n    //   pushAll / \u79BB\u7EBF\u8865\u63A8\u5728\u9501\u5C4F / reload \u540E\u5168\u63A8\u4E0D\u52A8\u3002sealForWrite \u672C\u5C31\u5BF9\u300C\u5DF2\u662F\u5BB9\u5668\u300D\u539F\u6837\u900F\u4F20\uFF08\u642C\u8FD0\u8DEF\u5F84\uFF09\uFF0C\u660E\u6587\u6587\u4EF6\u4E5F\u539F\u6837\uFF08prev \u975E\u5BB9\u5668\uFF09\uFF0C\n    //   \u6240\u4EE5\u76F4\u63A8 = \u540C\u4E00\u4EFD\u5B57\u8282\u3001\u540C\u4E00\u6761 vetted push\uFF08If-Match / N6 / \u649E\u540D surface / B5 \u91CD\u8BD5\u9010\u5B57\u8282\u76F8\u7B49\uFF09\u3002\u9501\u7740\u7684\u52A0\u5BC6\u4EF6\u4ECE\u6B64\u7167\u63A8\u3002\n    async function pushLocalBytes(name) {\n        const blob = await local.get(name);\n        if (!blob)\n            return { status: \"no-local\" };\n        const atRest = await toU8(blob instanceof Blob ? blob : new Blob([blob]));\n        return pushBg.doPush(name, { encode: () => atRest }); // \u975E busy\u3001\u672A\u4E32\u884C\uFF08uploadReplay \u5DF2 per-name serialize\uFF09\uFF1BCloudNameCollisionError \u629B\u51FA\u2192\u51FA\u961F surface\n    }\n    const uploadReplay = createUploadReplay({\n        kv, local, head, isOnline, serialize: sub.serialize, pushLocal: pushLocalBytes,\n        policy: uploadReplayPolicy, confirm: ui.confirmReplay, onStatus: ui.onReplayStatus,\n    });\n    // 0.17.0\uFF1AwatchFolder \u7684\u5B8C\u6574\u4E91\u7AEF\u5E27\u5F53\u65B0\u9C9C\u5EA6\u8BC1\u636E\uFF08fresh-hints.ts \u5934\u6CE8\u91CA\u8BB2\u5B89\u5168\u8FB9\u754C\uFF09\uFF1A\u51E0\u5341\u4E2A\u5C0F\u6587\u4EF6\u8FDE\u7740 open \u4E0D\u518D\u9010\u4E2A fetchMeta\u3002\n    const freshHints = createFreshHints();\n    const fresh = createFreshness({ cloud, head, safeResolve, busy: busyT, hints: freshHints, lineageFromDurable: config.openLineageFromDurable ?? true });\n    const del = createDelete({ cloud, local, head, kv, busy: busyT });\n    const identity = createIdentity({\n        cloud, local, head, doPush: pushMod.doPush, serialize: sub.serialize, serialize2: sub.serialize2, seal, busy: busyT,\n        // \u79BB\u7EBF move = \u5220+\u5EFA\uFF08\u51B3\u7B56 1A/2\uFF09\uFF1A\u5728\u7EBF\u8D70 identity \u5185\u7684\u670D\u52A1\u7AEF\u539F\u5B50 move\uFF1B\u79BB\u7EBF\u964D\u7EA7\uFF0C\u590D\u7528 del.del \u79BB\u7EBF\u5220 + uploadReplay \u8865\u63A8\u3002\n        isOnline,\n        deleteOffline: (name) => del.del(name, { isOnline }).then(() => { }), // \u5B8C\u6574\u79BB\u7EBF\u5220\u8BED\u4E49\uFF08move-aside + base-etag \u4E91\u5220\u6392\u961F + null \u5B88\u536B + forget\uFF09\n        queueUpload: (name) => uploadReplay.enqueue(name), // never-synced float \u91CD\u8FDE\u8865\u63A8\uFF08ADR-0018\uFF09\n        nameOccupied, // \u552F\u4E00\u5360\u7528\u68C0\u67E5\uFF08assertNameFree \u636E\u6B64\u629B\uFF09\n    });\n    const trashMod = createTrash({ cloud, local, head, busy: busyT });\n    // \u56DE\u6536\u7AD9/\u5907\u4EFD\u7BB1\u4E24\u7AEF\u805A\u5408\uFF08README \u00A72\uFF09\uFF1Acloud + local \u4E00\u6B21\u5217\u4E3E \u2192 mergeTrash \u5F52\u5E76\u6210\u5355\u4E00 TrashItem[]\u3002\n    //   trash \u624D\u5224 conflictLive\uFF08\u5907\u4EFD\u7BB1\u662F\u51B2\u7A81 loser\u3001\u65E0\u6B64\u8BED\u4E49 \u2192 \u4F20\u7A7A live set\uFF09\uFF1B\u4E14\u4EC5\u5F53\u6709\u672C\u5730\u9879\u65F6\u624D\u62C9 live\uFF08\u7701 listAll \u5168\u6811 walk\uFF09\u3002\n    async function aggregateBox(box) {\n        const cloudItems = await (box === \"trash\" ? cloud.listTrash() : cloud.listBackup()); // \u5185\u90E8\u5DF2 catch \u2192 \u51FA\u9519\u8FD4 []\n        const localItems = box === \"trash\"\n            ? (local.listTrash ? await local.listTrash() : [])\n            : (local.listBackup ? await local.listBackup() : []);\n        let live = new Set();\n        if (box === \"trash\" && localItems.length && isOnline()) {\n            const all = await cloud.listAll().catch(() => null);\n            if (all && all.complete)\n                live = new Set(all.files.map((f) => f.name ?? f.path)); // \u53EA\u5728\u6743\u5A01\uFF08complete\uFF09\u65F6\u586B \u2192 \u975E\u6743\u5A01=\u7A7A\u96C6=conflictLive \u4E0D\u8BEF\u62A5\n        }\n        return mergeTrash(localItems, cloudItems, live, toName);\n    }\n    // dirty \u540D\u5355\uFF080.4.0 dirty facet \u7684\u679A\u4E3E\u817F\uFF09\uFF1Adurable dirty \u8F68 = local-head \u7684\u76F8\u5BF9\u952E `files.dirty:<name>`\uFF08\u503C \"1\"\uFF09\u3002\n    //   durable \u662F dirty=true \u7684**\u5B8C\u5907**\u8BB0\u5F55\uFF08recordEdit/onPushed(dirtyAfter) \u90FD\u5199\u7A7F kv\uFF09\u2192 \u626B kv \u5373\u5168\u8D26\uFF1B\n    //   \u6CE8\u5165\u7684 kv \u65E0 keys()\uFF08\u8001 mock\uFF09\u2192 \u7A7A\u540D\u5355\uFF08facet \u9759\u9ED8\u964D\u7EA7\uFF0C\u4E0E dir-index-cache \u53EF\u9009\u9762\u540C\u59FF\u6001\uFF09\u3002\n    const DIRTY_PREFIX = \"files.dirty:\";\n    const dirtyNames = () => kv.keys().filter((k) => k.startsWith(DIRTY_PREFIX) && kv.get(k) === \"1\").map((k) => k.slice(DIRTY_PREFIX.length));\n    // \u2500\u2500 \u5355\u98DE\u5B88\u536B\uFF08port \u81EA\u524D\u8EAB\u5F15\u64CE store.ts\uFF0C2026-06-21 \u8D77\u7EA2\u7EBF\uFF09\uFF1A\u7528\u6237\u6001\u5199\u6D41\u540C\u4E00\u65F6\u523B\u53EA\u4E00\u4E2A\uFF0C\n    //   \u5E76\u53D1\u7684\u7B2C\u4E8C\u4E2A**\u76F4\u63A5\u62D2**\uFF08throw STORE_BUSY\uFF09\uFF0C\u8C03\u7528\u65B9 catch\u2192\u62A5\u72B6\u6001\u3002\u4E0E ui.busy \u6B63\u4EA4\u3001\u66F4\u786C\n    //   \uFF08busy \u53EA\u662F UI \u9632\u8BEF\u70B9\u3001\u65E0 UI \u65F6\u5931\u6548\uFF1B\u8FD9\u9053\u5E93\u5185\u81EA\u5E26\uFF0C\u65E0\u5934\u590D\u7528\u4E5F\u6321\u5F97\u4F4F\uFF09\u3002\u540C\u540D\u5B57\u8282\u7ADE\u4E89\u4ECD\u7531\n    //   substrate.serialize2 \u515C\u5E95\uFF0C\u8FD9\u9053\u5728\u5176\u4E0A\u52A0\u300C\u5168\u5C40\u540C\u4E00\u65F6\u523B\u53EA\u4E00\u4E2A\u7528\u6237\u6001\u5199\u300D\u7684\u66F4\u5F3A\u8BED\u4E49\uFF08user \u660E\u786E\u8981\uFF09\u3002\n    //   \u5B89\u5168\u524D\u63D0\uFF1A\u88AB\u5B88\u7684\u6D41\u4E92\u4E0D\u5185\u90E8\u8C03\u7528\u2014\u2014rename \u5185\u90E8\u8D70 doPush\uFF08\u975E\u88AB\u5B88\u6D41\uFF09\uFF1Bdel/restore/purge/\n    //   emptyTrash \u76F4\u8C03 adapter\uFF1BnewFolder/deleteFolder \u76F4\u8C03 cloud.*\u3002\u65B0\u589E\u88AB\u5B88\u6D41\u524D\u5148\u6838\u8FD9\u6761\uFF0C\u5426\u5219\u5D4C\u5957\u81EA\u9501\u3002\n    let _userWriteInFlight = null;\n    function singleFlight(label, fn) {\n        return (...a) => {\n            if (_userWriteInFlight) {\n                const e = new Error(`\u6709\u53E6\u4E00\u9879\u64CD\u4F5C\u8FDB\u884C\u4E2D\uFF08${_userWriteInFlight}\uFF09\uFF0C\u8BF7\u7B49\u5B83\u5B8C\u6210\u518D\u8BD5`);\n                e.code = \"STORE_BUSY\";\n                return Promise.reject(e);\n            }\n            _userWriteInFlight = label;\n            return Promise.resolve().then(() => fn(...a)).finally(() => { _userWriteInFlight = null; });\n        };\n    }\n    const delSF = singleFlight(\"\u5220\u9664\", (n) => { uploadReplay.remove(n); return del.del(n, { isOnline }); });\n    // 0.18.6\uFF1Aresolve() \u9762\u91CC\u300C\u4E91\u7AEF\u8986\u76D6\u672C\u5730\u300D\u5728 absent / never \u573A\u5408\u4E13\u7528\u2014\u2014\u53EA\u5728\u4E91\u7AEF\u6B64\u523B\u786E\u5B9E\u6CA1\u6709\u65F6\u624D\u628A\u672C\u5730\u8FD9\u4EFD\u79FB\u8FDB\u56DE\u6536\u7AD9\uFF1B\u4E91\u7AEF\u56DE\u6765\u4E86 / \u9A8C\u4E0D\u4E86 \u2192 cancelled\uFF0C\u4E24\u8FB9\u4E0D\u52A8\u3002\n    const delIfCloudAbsentSF = singleFlight(\"\u5220\u9664\", async (n) => { const d = await del.del(n, { isOnline, expectCloudAbsent: true }); if (d.status === \"trashed\")\n        uploadReplay.remove(n); return d; });\n    /** cancelled \u7684\u4E24\u79CD\u539F\u56E0\u7FFB\u6210 resolve() \u7684\u7EC8\u6001\uFF1Btrashed \u7167\u8FD4\u3002 */\n    const trashedOrWhy = (d) => d.status === \"trashed\" ? { status: \"trashed\" }\n        : d.status === \"cancelled\" ? { status: \"unresolved\", reason: d.reason === \"cloud-present\" ? \"cloud-reappeared\" : \"offline\" }\n            : { status: \"unresolved\", reason: d.status }; // \u5220=supersede\uFF1A\u4ECE\u8865\u63A8\u961F\u5217\u6458\u6389\uFF08ADR-0018\uFF09   // \u63A5 isOnline\uFF1A\u79BB\u7EBF\u5220\u8D70 move-aside + base-etag \u5B88\u536B\u7684\u5220\u961F\u5217\uFF08\u91CD\u8FDE drainDeleteQueue \u91CD\u653E\uFF09\n    // file.tryMove(to)\uFF1A\u6539\u8EAB\u4EFD/\u79FB\u52A8\u7684**\u552F\u4E00\u7ED3\u679C\u5F0F\u5165\u53E3**\uFF08file() \u65E0 rename\uFF0Ceditor-session \u4E5F\u8D70\u8FD9\u91CC\uFF09\u2014\u2014**\u672C\u64CD\u4F5C\u542B\u76EE\u6807\u5360\u7528\u68C0\u67E5**\uFF08\u7B2C\u4E00\u884C nameOccupied\uFF0C\u5360\u7528\u5219\u4E0D\u52A8\u5B57\u8282\u76F4\u63A5\u8FD4\u9519\uFF09\u3002\n    //   ok:false \u65F6\u8C03\u7528\u65B9 surface\uFF08UI \u62D2\u7EDD/\u91CD\u95EE\uFF09\uFF1B\u4E0D\u629B CloudNameCollisionError\uFF08\u5185\u90E8\u62A4\u680F\u662F\u515C\u5E95\uFF0C\u8FD9\u91CC\u9884\u68C0\u8FC7\u5373 skip\uFF09\u3002\n    // 0.14.0 \u8EAB\u4EFD\u53D8\u66F4\u4E8B\u4EF6\uFF08user 2026-09-19\u300C\u6539\u540D\u4E8B\u4EF6\u6E90\u8BE5\u5728 store\u300D\uFF09\uFF1A\u4EFB\u4F55\u5165\u53E3\u7684 tryMove \u6210\u529F\u540E\u540C\u6B65\u56DE\u8C03\uFF1B\u56FE\u5E93\u53EA\u662F\u53D1\u8D77\u6539\u540D\u7684\u4E00\u4E2A\u524D\u7AEF\uFF0C\u4E0D\u662F\u4E8B\u4EF6\u6E90\u3002\n    const renameListeners = new Set();\n    const tryMoveSF = singleFlight(\"\u79FB\u52A8\", async (from, to) => {\n        const occ = await nameOccupied(to);\n        if (occ)\n            return { ok: false, reason: \"name-collision\", where: occ };\n        const r = await identity.rename(from, to, { skipOccupiedCheck: true }); // \u5DF2 nameOccupied \u9884\u68C0\uFF0C\u8DF3\u8FC7\u5185\u90E8\u91CD\u590D\n        notifyFolderOf(from);\n        notifyFolderOf(to); // \u65E7\u5939\u79FB\u51FA + \u65B0\u5939\u79FB\u5165\uFF0C\u4E24\u8FB9\u91CD\u753B\n        for (const cb of renameListeners) {\n            try {\n                cb(from, to);\n            }\n            catch (e) {\n                ui.reportError(e, \"warning\");\n            }\n        } // \u76D1\u542C\u5668\u629B\u9519\u4E0D\u8BB8\u6C61\u67D3\u6539\u540D\u7ED3\u679C\n        // \u7ED3\u679C\u5FC5\u987B\u900F\u51FA\u53BB\uFF1A\u4EE5\u524D\u8FD9\u91CC\u6574\u4E2A\u4E22\u6389 r\uFF0C\u4E8E\u662F app \u65E0\u6761\u4EF6\u62A5\u300C\u5DF2\u91CD\u547D\u540D\uFF08\u542B\u4E91\u7AEF\uFF09\u300D\u2014\u2014\n        //   \u4E91\u7AEF\u63A8\u5931\u8D25(cloudDeferred)\u3001\u65E7\u540D\u6210\u5B64\u513F(oldCloudOrphan)\u3001\u65E7\u540D\u88AB\u7559\u4E0B(oldKept) \u5168\u88AB\u541E\u6389 = UI \u8C0E\u62A5\u6210\u529F\u3002\n        return { ok: true, where: r.where, oldKept: r.oldKept, oldUnknown: r.oldUnknown, oldCloudOrphan: r.oldCloudOrphan, cloudDeferred: r.cloudDeferred, oldName: from };\n    });\n    // \u2500\u2500 ui \u6620\u5C04\uFF1A\u51B2\u7A81\u56DE\u8C03\u5582 ui.resolveConflict\uFF08\u5FC5\u586B\uFF0C\u7EDD\u4E0D\u9759\u9ED8 cancel\uFF09\u3002local \u7ED9\u672C\u5730\u5B57\u8282\uFF08IDB\uFF0C\u4FBF\u5B9C\uFF09\uFF1B\n    //   cloud \u6052 null = **\u4E0D\u9884\u62C9**\uFF08QA 2026-08-20\uFF09\uFF1A\u73B0\u6709\u5BBF\u4E3B\uFF08WeebPaint/JRP\uFF09\u7684 sheet \u53EA\u7528 name \u4E0D\u6E32\u67D3 blob\uFF0C\n    //   \u9884\u62C9\u6574\u4EFD\u4E91\u7AEF = sheet \u524D\u53CC\u500D\u4E0B\u8F7D\uFF08takeCloud \u65F6 safePull \u53CD\u6B63\u4F1A\u62C9**\u6700\u65B0**\uFF09\uFF0C\u4E14\u5F39 sheet \u524D\u7684\u957F\u62C9\u7A97\u53E3\n    //   \u4F1A\u541E\u6389\u7528\u6237\u70B9\u300C\u8DF3\u8FC7\u5230\u79BB\u7EBF\u300D\u3002\u5C06\u6765\u5BBF\u4E3B\u8981\u9884\u89C8\u4E91\u7AEF\u7248 \u2192 escalate \u6539 StoreUI \u5951\u7EA6\uFF08\u61D2\u53D6\uFF09\uFF0C\u522B\u56DE\u586B\u8FD9\u91CC\u3002\u2500\u2500\n    const onConflictFor = (occasion) => async ({ name }) => {\n        if (tierOf(name) === \"auto-backup\")\n            return \"keepMine\"; // 2.1.0 \u4E8C\u7B49\u81EA\u52A8\u5907\u4EFD\uFF1A\u6C38\u4E0D\u5F39\u9762\uFF0C\u8FD9\u53F0\u7684\u8D62\uFF08\u8F93\u7684\u90A3\u4EFD\u4E0D\u8FDB\u5907\u4EFD\u7BB1 \u2014\u2014 push \u7684 loserBackup\uFF09\n        return ui.resolveConflict({ name, local: await local.get(name), cloud: null, occasion, cloudState: \"changed\" }); // 412 / \u649E\u540D / open \u65F6\u4E91\u7AEF\u66F4\u65B0\uFF1A\u4E91\u7AEF\u4E00\u5B9A\u6709\u522B\u7684\u7248\u672C\n    };\n    const onConflict = onConflictFor(\"push\"); // save \u7684 push 412 / surfaceCollision \u8D70\u8FD9\u4EFD\uFF1Bopen \u8DEF\u5F84\u7528 onConflictFor(\"open\")\n    // \u2500\u2500 \u52A0\u5BC6\uFF1A\u8BFB\u4FA7\u539F\u8BED + at-rest transform\uFF08\u7167\u642C\u524D\u8EAB\u5F15\u64CE store.ts\uFF0C\u51FA\u5904 = WebPaint ai-docs/11\uFF1B\u4E0D\u6CE8\u5165 codec \u2192 dormant\uFF09\u2500\u2500\n    //   \u975E\u4EA4\u4E92\uFF1A\u65E0/\u9519\u5BC6\u7801 \u2192 null / status:\"locked\"\uFF08\u7EDD\u4E0D\u5F39\u7A97\uFF09\u3002\u89E3\u9501\u5FAA\u73AF\u662F app \u5728 busy \u5916\u7684\u4E8B\uFF08seal.withPassword \u5B88\uFF09\u3002\n    async function encTailBytes(name, n, tryCloud) {\n        const blob = await local.get(name); // \u672C\u5730\u6709 \u2192 \u5C3E\u5207\u7247\uFF08IDB Blob.slice \u60F0\u6027\uFF09\n        if (blob) {\n            const b = blob instanceof Blob ? blob : new Blob([blob]);\n            return b.slice(Math.max(0, b.size - n));\n        }\n        if (tryCloud && cloud.pullTail) {\n            const t = await cloud.pullTail(name, n);\n            return t ? new Blob([t.bytes]) : null;\n        } // \u7EAF\u4E91\u7AEF peek\uFF1Abyte-range\n        return null;\n    }\n    // getPeek \u7684\u5B57\u8282\u6E90\uFF1A\u5C3E\u7247 + \u603B\u5B57\u8282 + \u300C\u6309\u7EDD\u5BF9\u504F\u79FB\u4E8C\u6B21\u62C9\u300D\u3002\u672C\u5730\u2192Blob.slice\uFF08\u60F0\u6027\uFF0C\u4E0D\u78B0\u7F51\uFF09\uFF1B\u7EAF\u4E91\u7AEF\u2192byte-range\u3002\n    //   range() \u4F9B\u5E93\u5185 zip \u89E3\u6790\u5728 CD/entry \u6EA2\u51FA\u5C3E\u7247\u65F6\u4E8C\u6B21\u62C9\uFF08\u672C\u5730\u5207\u7247 / \u4E91\u7AEF pullRange\uFF09\u3002\n    //   source=\"cloud\" \u2192 \u8DF3\u8FC7\u672C\u5730\u5206\u652F\u53EA\u8D70 byte-range\uFF08\u62FF\u4E0D\u5230=null\uFF0C\u4E0D\u843D\u56DE\u672C\u5730\u2014\u2014\u62A4\u680F\u89C1 ZipFile.getPeek JSDoc\uFF09\u3002\n    async function openPeekSource(name, n, source) {\n        const blob = source === \"cloud\" ? null : await local.get(name);\n        if (blob) {\n            const b = blob instanceof Blob ? blob : new Blob([blob]);\n            const total = b.size;\n            const tail = new Uint8Array(await b.slice(Math.max(0, total - n)).arrayBuffer());\n            return { totalSize: total, tail, range: async (off, len) => new Uint8Array(await b.slice(off, off + len).arrayBuffer()) };\n        }\n        if (cloud.pullTail) {\n            const t = await cloud.pullTail(name, n);\n            if (!t)\n                return null;\n            const tail = t.bytes instanceof Uint8Array ? t.bytes : new Uint8Array(t.bytes);\n            const total = t.item.size || tail.length;\n            return {\n                totalSize: total, tail,\n                range: async (off, len) => {\n                    const r = cloud.pullRange ? await cloud.pullRange(name, off, len) : null;\n                    return r ? (r.bytes instanceof Uint8Array ? r.bytes : new Uint8Array(r.bytes)) : null;\n                },\n            };\n        }\n        return null;\n    }\n    // \u628A\u4E00\u6BB5\u5BC6\u6587 peek\uFF08getPeek \u8FD4\u56DE\u7684 ENC_PEEK_MIME \u6BB5\uFF09\u975E\u4EA4\u4E92\u89E3\u5BC6\u6210\u660E\u6587\u5B57\u8282\u3002\u975E ENC_PEEK_MIME\uFF08\u5DF2\u660E\u6587\uFF09\u2192 \u539F\u6837\u8FD4\u3002\u9501\u5B9A/\u9519\u5BC6\u7801\u2192null\u3002\n    async function decryptEncPeek(name, encPeek) {\n        if (encPeek.type !== enc.ENC_PEEK_MIME)\n            return encPeek; // \u660E\u6587\uFF08\u5982 image/png\uFF09\u76F4\u63A5\u7ED9\n        const parsed = enc.scanEncPeekFromEnd(new Uint8Array(await encPeek.arrayBuffer()));\n        if (!parsed)\n            return null;\n        const plain = await seal.withPassword(name, (pw) => enc.decryptPeek(parsed, pw)); // \u975E\u4EA4\u4E92\u5185\u5B58\u5BC6\u7801\uFF1B\u9501\u5B9A \u2192 null\n        return plain ? new Blob([plain]) : null;\n    }\n    async function encVerify(name, pw) {\n        if (!pw)\n            return false;\n        const tail = await encTailBytes(name, enc.PEEK_TAIL_WINDOW, true);\n        if (tail) {\n            const p = enc.scanEncPeekFromEnd(new Uint8Array(await tail.arrayBuffer()));\n            if (p) {\n                try {\n                    await enc.decryptPeek(p, pw);\n                    return true;\n                }\n                catch {\n                    return false;\n                }\n            }\n        }\n        const full = await local.get(name); // \u65E0 peek\uFF08\u88F8 .7z\uFF09\u2192 \u9000\u56DE\u6574\u5B57\u8282\u89E3\u4E00\u628A\uFF08\u8D35\uFF09\n        if (!full)\n            return false;\n        try {\n            await enc.unpackContainer(full instanceof Blob ? full : new Blob([full]), pw);\n            return true;\n        }\n        catch {\n            return false;\n        }\n    }\n    async function encIsEncrypted(name) {\n        const blob = await local.get(name);\n        return blob ? enc.looksEncryptedContainer(blob instanceof Blob ? blob : new Blob([blob])) : false;\n    }\n    // \u5B57\u8282\u66FF\u6362\u5171\u7528\u6D41\uFF08_swapBytes \u7EA2\u7EBF\uFF0C\u7167\u642C\u524D\u8EAB\u5F15\u64CE\uFF09\uFF1A\u2460 \u672C\u5730\u5148\u843D\u5730 \u2461 \u4E91\u7AEF If-Match \u8DDF\u8FDB\uFF0C\u5931\u8D25\u2192\u6807\u810F+\u951A parent=\u6362\u524D\u4E91\u7248\n    //   \u4EA4\u6B63\u5E38 push \u6D41\u63A5\u529B\u6536\u655B\uFF08v233 \u6559\u8BAD\uFF1A\u53EA\u6362\u4E00\u7AEF = \u52A0\u5BC6\u88AB\u9759\u9ED8\u64A4\u9500\uFF09\u2462 \u66FE\u540C\u6B65\u4F46\u79BB\u7EBF \u2192 \u62D2\uFF08\u9632\u53EA\u6362\u4E00\u7AEF\uFF09\u2463 \u9519\u5BC6\u7801\u524D\u7F6E\u51FA\u5C40\u3002\n    async function encSwap(name, bytes, online, encrypted) {\n        const prevEtag = cloud.getETag(name);\n        const tracked = prevEtag != null;\n        if (tracked && !online())\n            return { status: \"offline\" };\n        await local.save(name, bytes); // \u2460 \u5B57\u8282\u771F\u76F8\u5148\u843D\u5730\uFF08\u5DF2\u5728 encEncrypt \u7684 serialize \u9501\u5185\uFF09\n        if (!tracked)\n            return { status: \"swapped\" };\n        try {\n            const { item } = await cloud.push(name, bytes, { baseEtag: head.seenBase(name), encrypted }); // If-Match + \u6269\u5C55\u540D\u7FFB\u8F6C\n            // F0 \u540C\u6B3E\uFF1A\u6CA1\u56DE eTag = \u4E91\u7AEF\u843D\u5730**\u672A\u786E\u8BA4**\u3002\u672C\u5730\u5B57\u8282\u5DF2\u7ECF\u6362\u4E86\uFF08\u2460\uFF09\uFF0C\u6240\u4EE5\u8FD9\u548C\"\u4E91\u6CA1\u8DDF\u4E0A\"\u662F\u540C\u4E00\u79CD\u5C40\u9762\n            //   \u2192 \u8D70\u4E0B\u9762 catch \u5206\u652F\u7684\u7B49\u4EF7\u8DEF\u5F84\uFF08base/parent\u2190\u6362\u524D\u4E91\u7248 + \u6807\u810F\uFF09\uFF0C\u4EA4 push \u6D41\u63A5\u529B\uFF0C\u7EDD\u4E0D\u5F53 swapped \u6E05\u810F\u3002\n            if (!(item && item.eTag)) {\n                head.onPushed(name, prevEtag, true);\n                return { status: \"cloud-deferred\" };\n            }\n            head.onPushed(name, item.eTag, false); // \u843D\u5730\uFF1Abase\u2190\u65B0 etag\u3001\u6E05 dirty/parent\n            return { status: \"swapped\" };\n        }\n        catch (e) {\n            head.onPushed(name, prevEtag, true); // \u2461 \u672C\u5730\u5DF2\u6362\u3001\u4E91\u6CA1\u8DDF\u4E0A \u2192 base/parent\u2190\u6362\u524D\u4E91\u7248 + dirty\uFF0Cpush \u6D41\u63A5\u529B\uFF08\u4E0B\u6B21 If-Match \u65E7\u4E91\u7248\uFF1A\u6CA1\u4EBA\u52A8\u2192\u6362\u6210\u529F\uFF1B\u52A8\u8FC7\u2192412 surface\uFF09\n            return { status: e?.name === \"CloudConflictError\" ? \"conflict\" : \"cloud-deferred\" };\n        }\n    }\n    async function encEncrypt(name, online) {\n        return busyK(\"file.encrypting\", { name }, () => sub.serialize(name, async () => {\n            const blob = await local.get(name);\n            if (!blob)\n                return { status: \"no-local\" };\n            const asBlob = blob instanceof Blob ? blob : new Blob([blob]);\n            if (await enc.looksEncryptedContainer(asBlob))\n                return { status: \"already\" };\n            if (cloud.getETag(name) != null && !online())\n                return { status: \"offline\" }; // \u65E9\u9000\uFF1A\u8FD8\u6CA1\u6253\u5305\u5C31\u77E5\u4E24\u7AEF\u6362\u4E0D\u9F50\n            const pw = getPassword(name);\n            if (!pw)\n                return { status: \"locked\" }; // \u9996\u6B21\u52A0\u5BC6\u5BC6\u7801\u7531 app \u8C03\u7528\u524D\u653E\u8FDB getPassword seam\n            let peek = null;\n            if (config.crypt?.makePeek) {\n                try {\n                    peek = await config.crypt.makePeek(asBlob);\n                }\n                catch {\n                    peek = null;\n                }\n            }\n            const container = await enc.packContainer({ dataBytes: await toU8(asBlob), fileName: name, ext: cryptExtFor(name), peek, password: pw });\n            return await encSwap(name, await toU8(container), online, true);\n        }));\n    }\n    async function encDecrypt(name, online) {\n        return busyK(\"file.decrypting\", { name }, () => sub.serialize(name, async () => {\n            const blob = await local.get(name);\n            if (!blob)\n                return { status: \"no-local\" };\n            const asBlob = blob instanceof Blob ? blob : new Blob([blob]);\n            if (!(await enc.looksEncryptedContainer(asBlob)))\n                return { status: \"not-encrypted\" };\n            if (cloud.getETag(name) != null && !online())\n                return { status: \"offline\" };\n            const res = await seal.withPassword(name, (pw) => enc.unpackContainer(asBlob, pw)); // \u2463 \u975E\u4EA4\u4E92\u89E3\uFF1B\u65E0/\u9519\u5BC6\u7801\u2192locked\uFF0C\u4EFB\u4F55\u6301\u4E45\u6539\u52A8\u524D\u51FA\u5C40\n            if (!res)\n                return { status: \"locked\" };\n            return await encSwap(name, await toU8(res.dataBlob), online, false);\n        }));\n    }\n    // \u6362\u5BC6\u7801\uFF080.12.0\uFF1Buser 2026-09-09\u300C\u4FDD\u7559\u6362\u5BC6\u7801\uFF0C\u52A0 api\u300D\uFF09\uFF1A\u5BC6\u6587 \u2192 \u5BC6\u6587\uFF0C**\u4E0D\u7ECF\u660E\u6587\u4E2D\u95F4\u6001**\u3002\n    //   \u4EE5\u524D\u5BBF\u4E3B\u53EA\u80FD decrypt()\u2192encrypt() \u6362\u94A5\u5319\uFF08WebXiaoHeiWu \u6362\u5BC6\u7801\u8FC1\u79FB\u5C31\u662F\u8FD9\u4E48\u5199\u7684\uFF09\uFF1A\u4E2D\u95F4\u90A3\u4E00\u6B65\u628A\u660E\u6587 push \u4E0A\u4E91\u2014\u2014\n    //   OneDrive \u4FDD\u7559\u7248\u672C\u5386\u53F2 = \u660E\u6587\u6C38\u4E45\u7559\u5728\u5FAE\u8F6F\u90A3\u91CC\uFF1B\u65AD\u7F51/\u5173\u9875 = \u4E00\u6279\u6587\u4EF6\u505C\u5728\u660E\u6587\u6001\uFF082026-09-09 \u52A0\u5BC6\u5408\u89C4\u5BA1\u8BA1 \u2460\u2461\uFF09\u3002\n    //   \u8FD9\u91CC\uFF1A\u65E7\u5BC6\u7801\u7ECF seam \u975E\u4EA4\u4E92\u89E3\uFF08\u65E0/\u9519 \u2192 locked\uFF0C\u4EFB\u4F55\u6301\u4E45\u6539\u52A8\u524D\u51FA\u5C40\uFF09\u3001\u65B0\u5BC6\u7801\u663E\u5F0F\u4F20\u5165\u3001\u5185\u5B58\u91CC\u91CD\u6253\u5305\uFF08peek \u7167 makePeek\n    //   \u91CD\u751F\uFF09\u2192 encSwap(encrypted=true)\uFF1A\u672C\u5730\u4E0E\u4E91\u7AEF\u53EA\u89C1\u65B0\u5BB9\u5668\uFF1B\u660E\u6587\u53EA\u6D3B\u5728\u8FD9\u4E2A\u95ED\u5305\u7684\u5185\u5B58\u91CC\u3002\n    async function encRekey(name, newPassword, online) {\n        if (!newPassword)\n            throw new Error(`rekey: newPassword required (${name})`); // \u8C03\u7528\u65B9 bug \u4E0D\u662F\u7528\u6237\u6001\uFF1A\u54CD\u4EAE\uFF0C\u4E0D\u8FDB busy\n        return busyK(\"file.rekeying\", { name }, () => sub.serialize(name, async () => {\n            const blob = await local.get(name);\n            if (!blob)\n                return { status: \"no-local\" };\n            const asBlob = blob instanceof Blob ? blob : new Blob([blob]);\n            if (!(await enc.looksEncryptedContainer(asBlob)))\n                return { status: \"not-encrypted\" };\n            if (cloud.getETag(name) != null && !online())\n                return { status: \"offline\" }; // \u4E24\u7AEF\u8981\u4E00\u8D77\u6362\uFF08\u540C encrypt/decrypt\uFF09\n            const res = await seal.withPassword(name, (pw) => enc.unpackContainer(asBlob, pw)); // \u65E7\u5BC6\u7801\uFF1Aseam \u975E\u4EA4\u4E92\uFF1B\u65E0/\u9519 \u2192 null\n            if (!res)\n                return { status: \"locked\" };\n            let peek = null;\n            if (config.crypt?.makePeek) {\n                try {\n                    peek = await config.crypt.makePeek(res.dataBlob);\n                }\n                catch {\n                    peek = null;\n                }\n            }\n            const container = await enc.packContainer({ dataBytes: await toU8(res.dataBlob), fileName: name, ext: cryptExtFor(name), peek, password: newPassword });\n            return await encSwap(name, await toU8(container), online, true);\n        }));\n    }\n    // \u2500\u2500 file \u5DE5\u5382\uFF08\u91CD\u8F7D\uFF1AisZip \u7F16\u8BD1\u671F\u5206\u6D41\uFF09\u2500\u2500\n    //   mode=\"new\"\uFF08\u65B0\u5EFA\u6587\u6863\uFF09\uFF1A\u9996\u6B21 save \u524D\u67E5\u5360\u7528\uFF0C\u5DF2\u5360\u7528 \u2192 \u629B CloudNameCollisionError\uFF08**\u7EDD\u4E0D\u9759\u9ED8\u8986\u76D6\u540C\u540D**\uFF09\u3002\n    //     \u7EA2\u7EBF\u5F52\u4F4D\uFF1A\u4E0D\u8986\u76D6\u7684\u4FDD\u8BC1\u6536\u8FDB store\uFF08\u4E0D\u4F9D\u8D56\u6BCF\u4E2A app \u8C03\u7528\u65B9\u8BB0\u5F97\u5148\u67E5\u91CD\u540D\uFF09\u3002\"existing\"\uFF08\u9ED8\u8BA4\uFF09= \u666E\u901A open/\u7F16\u8F91\uFF0C\u8986\u76D6\u662F\u6B63\u5E38\u6301\u4E45\u3002\n    function makeRaw(name, mode = \"existing\") {\n        let _createChecked = mode !== \"new\"; // \"new\" \u9996\u6B21 save \u524D\u505A\u4E00\u6B21\u5360\u7528\u68C0\u67E5\uFF1B\u4E4B\u540E\uFF08\u672C\u5BF9\u8C61\u5DF2\u5EFA\uFF09\u8DF3\u8FC7\uFF0C\u540E\u7EED autosave \u662F\u7F16\u8F91\u4E0D\u662F\u65B0\u5EFA\n        const readLocal = async () => {\n            const blob = await local.get(name);\n            if (!blob)\n                return null;\n            const asBlob = blob instanceof Blob ? blob : new Blob([blob]);\n            return await seal.unsealForRead(name, asBlob);\n        };\n        // 0.18.5\uFF1Aresolve() \u9047\u5230**\u5E72\u51C0**\u7684\u526F\u672C\u3002\u4EE5\u524D\u4E00\u5F8B\u56DE clean\u3001\u4E0D\u5F39\u9762\u2014\u2014\u53EF\u5217\u4E3E\u91CC\u300C\u4E91\u7AEF\u521A\u6CA1\u4E86\u300D\uFF08pendingGone = \u5E72\u51C0 \u2227 \u540C\u6B65\u8FC7 \u2227 \u4E91\u7AEF\u6CA1\u4E86\uFF0C\u5BBD\u9650\u671F 24 h \u5185\uFF09\n        //   \u90A3\u4E00\u884C\u7684\u300C\u5904\u7406\u2026\u300D\u56E0\u6B64\u6309\u4E86\u6CA1\u53CD\u5E94\uFF0C\u4E00\u76F4\u6302\u5728\u8981\u5904\u7406\u7684\uFF08KudsRocket 2026-10-17 user\u300C\u4E91\u7AEF\u6CA1\u6709\u7684\u60C5\u51B5\u70B9\u5904\u7406\u6CA1\u6709\u7ED9\u9009\u9879\uFF0C\u7136\u540E\u4E00\u76F4\u5361\u7740\u5F85\u5904\u7406\u300D\uFF09\u3002\n        //   \u73B0\u5728\uFF1A\u540C\u6B65\u8FC7 \u2227 \u5728\u7EBF \u2192 \u95EE\u4E00\u6B21\u4E91\u7AEF\uFF1B\u4E91\u7AEF\u786E\u8BA4\u6CA1\u4E86 \u2192 \u9762\u7167\u5F39\uFF08cloudState absent\uFF09\uFF1A\u4E91\u7AEF\u8986\u76D6\u672C\u5730 = \u8FD9\u4EFD\u79FB\u5230\u56DE\u6536\u7AD9\uFF08\u540C absent \u5206\u652F\u7684\u5220\u9664\u8DEF\u5F84\uFF09\u3001\n        //   \u672C\u5730\u8986\u76D6\u4E91\u7AEF = \u65AD\u6389\u65E7\u8C31\u7CFB\u3001\u6309\u9996\u63A8\u4F20\u56DE\u53BB\uFF08\u4E91\u7AEF\u6B64\u523B\u82E5\u5DF2\u6709\u540C\u540D\u522B\u7684\u6587\u4EF6 \u2192 \u649E\u540D\u4E0D\u8986\u76D6\u3001\u5E93\u518D\u5F39\u4E00\u5F20\u300C\u4E91\u7AEF\u6709\u65B0\u7248\u672C\u300D\u7684\u9762\uFF09\u3001\u53D6\u6D88 = \u4E0D\u52A8\u3002\n        //   \u4E91\u7AEF\u8FD8\u5728\uFF08\u540C\u7248 / \u6709\u65B0\u7248\uFF09\u3001\u4ECE\u6CA1\u540C\u6B65\u8FC7\u3001\u95EE\u4E0D\u5230\u4E91\u7AEF \u2192 \u7167\u65E7 clean\uFF08candidate \u95EE\u4E0D\u5230\u4E91\u7AEF \u2192 offline\uFF0C\u514D\u5F97\u300C\u6CA1\u6709\u8981\u5904\u7406\u7684\u300D\u8BF4\u8C0E\uFF09\u3002\n        //   0.18.6\uFF08\u5BA1\u8BA1\uFF09\uFF1A\u300C\u4E91\u7AEF\u8986\u76D6\u672C\u5730\u300D\u53EA\u5728\u4E91\u7AEF**\u6B64\u523B**\u786E\u5B9E\u6CA1\u6709\u65F6\u624D\u5220\u2014\u2014\u9762\u5F00\u7740\u65F6\u522B\u7684\u8BBE\u5907\u628A\u8FD9\u4EFD\u4F20\u56DE\u6765\u4E86 \u2192 \u4E24\u8FB9\u90FD\u4E0D\u52A8\uFF0C\u8FD4 unresolved / cloud-reappeared\uFF0C\u4EBA\u518D\u6309\u4E00\u6B21\u8D70\u6B63\u5E38\u7684\u300C\u4E91\u7AEF\u6709\u65B0\u7248\u300D\u8DEF\u3002\n        const resolveCleanGone = async () => {\n            if (head.seenBase(name) == null)\n                return { status: \"clean\" }; // \u4ECE\u6CA1\u540C\u6B65\u8FC7\u7684\u5E72\u51C0\u6587\u4EF6 = \u771F\u672C\u5730\u6587\u4EF6\uFF08local-only\uFF09\uFF0C\u6CA1\u6709\u300C\u6CA1\u540C\u6B65\u597D\u300D\n            const candidate = pendingGone.isPending(name);\n            if (!isOnline())\n                return candidate ? { status: \"offline\" } : { status: \"clean\" };\n            let meta;\n            try {\n                meta = await cloud.fetchMeta(name);\n            }\n            catch (e) {\n                ui.reportError(e, \"log\");\n                return candidate ? { status: \"offline\" } : { status: \"clean\" };\n            } // \u672A\u77E5 \u2260 \u6CA1\u4E86\uFF1A\u4E0D\u636E\u6B64\u5F39\u9762\n            if (meta)\n                return { status: \"clean\" }; // \u4E91\u7AEF\u5728\uFF1A\u540C\u7248 = \u5DF2\u540C\u6B65\uFF1B\u6709\u65B0\u7248 = \u8D70 pullIfClean\uFF0C\u4E0D\u662F\u8FD9\u91CC\n            const choice = tierOf(name) === \"auto-backup\" ? \"takeCloud\" // 2.1.0 \u4E8C\u7B49\uFF1A\u4E91\u7AEF\u6CA1\u4E86\u5C31\u8DDF\u7740\u4E91\u7AEF\uFF08\u522B\u7684\u8BBE\u5907\u8F6E\u8F6C\u6389\u7684\u683C\u5B50\u4E0D\u8BE5\u88AB\u8FD9\u53F0\u590D\u6D3B\uFF09\uFF0C\u4E0D\u95EE\u4EBA\n                : await ui.resolveConflict({ name, local: await local.get(name), cloud: null, occasion: \"push\", cloudState: \"absent\" });\n            if (choice === \"cancel\")\n                return { status: \"cancelled\" };\n            if (choice === \"takeCloud\") { // \u8DDF\u7740\u4E91\u7AEF\uFF1A\u672C\u5730\u8FD9\u4EFD\u79FB\u5230\u56DE\u6536\u7AD9\uFF08\u5E93\u7684\u5220\u9664\u8DEF\u5F84\uFF0C\u53EF\u6062\u590D\uFF1B\u4E0D\u786C\u5220\uFF09\u2014\u2014\u53EA\u5728\u4E91\u7AEF\u6B64\u523B\u786E\u5B9E\u6CA1\u6709\u65F6\n                const d = await delIfCloudAbsentSF(name);\n                if (d.status === \"trashed\")\n                    pendingGone.clear(name);\n                notifyFolderOf(name);\n                return trashedOrWhy(d);\n            }\n            // \u672C\u5730\u8986\u76D6\u4E91\u7AEF\uFF1A\u548C\u810F\u5206\u652F\u540C\u4E00\u6761 vetted push\u3002\u5148\u65AD\u65E7\u8C31\u7CFB\u3001\u6807\u810F\uFF08= \u9996\u63A8\uFF0C\u4E0D\u5E26\u57FA\u51C6\u3001\u649E\u540D\u4E0D\u8986\u76D6\uFF09\uFF1B\u649E\u4E0A\u4E91\u7AEF\u540C\u540D\u522B\u7684\u6587\u4EF6 \u2192 surfaceCollision \u2192 \u5E93\u518D\u5F39\u300C\u4E91\u7AEF\u6709\u65B0\u7248\u672C\u300D\u7684\u9762\uFF0C\u4EBA\u518D\u9009\u3002\n            const blob = await local.get(name);\n            if (!blob)\n                return { status: \"no-local\" };\n            const atRest = await toU8(blob instanceof Blob ? blob : new Blob([blob]));\n            pendingGone.clear(name);\n            head.forget(name);\n            head.recordEdit(name);\n            let r;\n            try {\n                r = await pushMod.push(name, { encode: () => atRest, onConflict, surfaceCollision: true, loserBackup: tierOf(name) !== \"auto-backup\" });\n            }\n            catch (e) {\n                ui.reportError(e);\n                notifyFolderOf(name);\n                return { status: \"not-pushed\", reason: \"error\" };\n            }\n            notifyFolderOf(name);\n            if (r.status === \"resolved\" && r.resolution === \"takeCloud\")\n                return { status: \"took-cloud\", backupName: r.backupName };\n            const pushed = r.status === \"pushed\" || r.status === \"healed\" || r.status === \"resolved\";\n            return pushed ? { status: \"pushed\" } : { status: \"not-pushed\", reason: r.status };\n        };\n        return {\n            async save(bytes, opts) {\n                tierGuard(\"save\", name);\n                await migrationReady;\n                if (!_createChecked) { // mode=\"new\" \u9996\u5B58\u62A4\u680F\uFF1A\u649E\u540D\u4E0D\u8986\u76D6\uFF08\u672C\u5730/\u5728\u7EBF\u4E91\u7AEF\u4EFB\u4E00\u5360\u7528\u5373\u629B\uFF09\n                    _createChecked = true;\n                    const where = await nameOccupied(name); // v417\uFF1A\u628A where \u5E26\u8FDB\u9519\u8BEF\u2014\u2014\u672C\u5730\u5360\u7528\u522B\u8C0E\u79F0\"\u4E91\u7AEF\u540C\u540D\"\n                    if (where)\n                        throw new CloudNameCollisionError(name, where);\n                }\n                head.recordEdit(name); // \u540C\u6B65\u6807\u810F\uFF1Aoffload \u7684 isDirty \u5B88\u536B\u7ACB\u5373\u53EF\u89C1\uFF08\u9632\u9A71\u9010\u5403\u672A\u63A8\u5B57\u8282\uFF09\n                pendingGone.clear(name); // \u7F16\u8F91\u53D6\u6D88 candidate-gone\uFF1Agrace \u5185\u88AB\u7F16\u8F91 \u2192 \u7ACB\u5373\u5F53\u6B63\u5E38 dirty \u6587\u4EF6\u5904\u7406\uFF08\u4E0D\u7B49\u4E0B\u8F6E reconcile\uFF09\n                cancelFolderDeletionForDescendant(name); // \u5728\u5F85\u5220\u5939\u4E0B\u5B58\u6587\u4EF6 \u2192 \u64A4\u9500\u8BE5\u5939\u7684\u6392\u961F\u5220\u9664\uFF08eager-cancel\uFF0CQ6\uFF09\n                const plain = await toU8(bytes);\n                const sealed = await seal.sealForWrite(name, plain);\n                // A4 \u53CC tab \u4E92\u8986\u62A4\u680F\uFF1A\u7528\u6237\u5185\u5BB9\u4FDD\u5B58 = guard=\"user-save\"\uFF08\u672C tab seen rev \u5BF9\u8868\uFF1B\u649E\u7248=\u53E6\u4E00 tab\n                //   \u5199\u8FC7 \u2192 local \u5C42\u5DF2\u5148\u5907\u4EFD\u5BF9\u65B9\u5B57\u8282\u518D\u8986\u76D6\uFF0C\u8FD9\u91CC\u53EA\u8D1F\u8D23 surface\u2014\u2014\u51B2\u7A81\u5FC5 surface\uFF0C\u7EDD\u4E0D\u9759\u9ED8\uFF09\u3002\n                const receipt = await sub.serialize(name, () => local.save(name, sealed, opts?.hint, \"user-save\")); // local \u5199\u540C\u540D\u4E32\u884C\u94FE\uFF1A\u4E0E offload.hardDelete \u4E92\u65A5\uFF08C2 \u7EA2\u7EBF\uFF09\uFF1Bhint \u900F\u4F20\u7F29\u7565\u56FE\n                if (receipt && typeof receipt === \"object\" && receipt.foreignOverwrite) {\n                    reportStoreError(new Error(`local overwrite conflict: \"${name}\" was written by another tab (rev ${receipt.foreignOverwrite.foreignRev}); their bytes were ${receipt.foreignOverwrite.backedUp ? \"backed up before overwrite\" : \"overwritten (recent copy already in backup)\"}`), \"warning\");\n                }\n                notifyFolderOf(name); // \u7F51\u76D8\u6A21\u578B\uFF1A\u672C\u5939 watcher \u5373\u65F6\u53CD\u6620\u65B0\u589E/\u53D8\u810F\uFF08\u65E0\u4E91\u5F80\u8FD4\uFF1Bgallery \u6CA1\u5F00=cheap no-op\uFF09\n                if (opts?.tryPush === false)\n                    return { pushed: false, reason: \"not-attempted\" }; // \u53EA\u843D\u672C\u5730\uFF08autosave/consent-safe\uFF0CADR-0016/0018\uFF1Aopaque Work \u7684 push \u5FC5 consent-gated\uFF09\n                // surfaceCollision\uFF1A**\u7F16\u8F91\u65E2\u6709\u6587\u4EF6**\u65F6\uFF0C\u8C31\u7CFB\u65AD\u88C2\u649E\u540D\u8D70\u51B2\u7A81\u9762\u800C\u975E\u629B collision\uFF08push.ts \u7684\u957F\u6CE8\u91CA\u89E3\u91CA\u4E86\u4E3A\u4EC0\u4E48\u4E24\u8005\u76F8\u53CD\uFF09\u3002\n                //   mode:\"new\" \u7684\u9996\u5B58\u4E0D\u7ED9 \u2014\u2014 \u90A3\u91CC\u649E\u540D\u662F\u300C\u522B\u7684\u8BBE\u5907\u5EFA\u4E86\u540C\u540D\u4E0D\u540C\u7269\u300D\uFF0C\u629B\u9519\u4E24\u4EFD\u90FD\u7559\u662F \u00A7A \u8EAB\u4EFD\u884C\u7684\u4FDD\u8BC1\u3002\n                let pushed = false, reason, resolution;\n                try {\n                    // F-19\uFF082026-10-21 Claude Fable 5.1\uFF09\uFF1A\u63A8\u4E91\u7684\u5B57\u8282 = \u521A\u843D\u672C\u673A\u7684\u90A3\u4EFD at-rest \u5B57\u8282\uFF08sealed\uFF09\uFF0C\u4E0D\u518D\u628A plain \u4EA4\u7ED9 push \u518D\u5C01\u4E00\u6B21\u3002\n                    //   \u4EE5\u524D\u672C\u673A\u5C01\u4E00\u6B21\u3001\u63A8\u4E91\u65F6 doPush \u53C8\u5C01\u4E00\u6B21\uFF08\u4E24\u6B21\u968F\u673A salt / IV\uFF09\u2192 \u540C\u4E00\u7BC7\u52A0\u5BC6\u7A3F\u672C\u673A\u548C\u4E91\u7AEF\u662F\u4E24\u4EFD\u4E0D\u540C\u5BC6\u6587 \u2192\n                    //   \u56DE\u6267\u4E22\u4E86\u4E4B\u540E\u91CD\u63A8\uFF08pushLocalBytes \u63A8\u672C\u673A\u90A3\u4EFD\uFF09\u649E 412\u3001tryHeal \u9010\u5B57\u8282\u6BD4\u4E0D\u51FA \u2192 \u591A\u5F39\u4E00\u5F20\u9762\uFF08\u5B89\u5168\u6A21\u578B A3\u300C\u5E93\u5F85\u4FEE\u300D\uFF09\u3002\n                    //   \u73B0\u5728\u672C\u673A == \u4E91\u7AEF\u9010\u5B57\u8282\uFF0C\u81EA\u6108\u80FD\u8BA4\u9886\u3002\u660E\u6587\u6587\u4EF6 sealed === plain\uFF0C\u96F6\u53D8\u5316\uFF1Bseal \u5BF9\u5DF2\u662F\u5BB9\u5668\u7684\u8F93\u5165\u539F\u6837\u900F\u4F20\u3002\n                    const r = await pushMod.push(name, { encode: () => sealed, onConflict, surfaceCollision: mode !== \"new\", onProgress: opts?.onProgress, loserBackup: tierOf(name) !== \"auto-backup\" });\n                    // \u53EA\u6709\u62FF\u5230\u65B0 etag \u7684\u843D\u5730\u624D\u7B97\u63A8\u4E0A\u53BB\u4E86\u3002deferred(\u843D\u5730\u672A\u786E\u8BA4)/unresolved/cancelled \u4E00\u5F8B\u4E0D\u7B97\u2014\u2014\n                    //   \u628A\u5B83\u4EEC\u5F53\u6210\u529F\u6B63\u662F F0 \u7EA2\u7EBF\u8981\u62E6\u7684\u90A3\u7C7B\u300C\u843D\u5730\u672A\u786E\u8BA4\u5F53\u843D\u5730\u6210\u529F\u300D\u3002\n                    pushed = r.status === \"pushed\" || r.status === \"healed\" || r.status === \"resolved\";\n                    if (!pushed)\n                        reason = r.status;\n                    // resolution \u900F\u4F20\uFF082026-08-25 \u6848\u5377 \u00A71 \u4FEE\uFF09\uFF1AtakeCloud \u65F6\u672C\u5730 IDB \u5DF2\u6362\u6210\u4E91\u7AEF\u7248\u672C\u2014\u2014**\u8FD9\u4E0D\u662F push\n                    //   \u6210\u529F\u7684\u4E00\u79CD\uFF0C\u662F\u4E16\u754C\u7EBF\u5207\u6362**\u3002\u8C03\u7528\u65B9\uFF08editor-session\uFF09\u5FC5\u987B\u636E\u6B64\u6574\u4F53\u91CD\u8F7D\u6253\u5F00\u4E2D\u7684\u6587\u6863\uFF1B\u541E\u6389\u8FD9\u4E2A\n                    //   \u4E8B\u5B9E = \u6062\u590D\u300C\u753B\u5E03\u9648\u65E7 + UI \u62A5 synced \u2192 \u4E0B\u6B21\u4FDD\u5B58\u9759\u9ED8\u8986\u5199\u4E91\u7AEF\u300D\u7684\u539F\u59CB\u4E8B\u6545\u3002\n                    if (r.status === \"resolved\" && (r.resolution === \"takeCloud\" || r.resolution === \"keepMine\"))\n                        resolution = r.resolution;\n                }\n                catch (e) {\n                    ui.reportError(e);\n                    reason = \"error\";\n                }\n                notifyFolderOf(name); // 0.17.0\uFF1A\u63A8\u5B8C\uFF08\u6210\u6CA1\u6210\uFF09\u672C\u5939 watcher \u518D\u753B\u4E00\u5E27\u2014\u2014badge \u4ECE\u300C\u6CA1\u4F20\u4E0A\u53BB\u300D\u53D8\u300C\u5DF2\u540C\u6B65\u300D\u8981\u8BA9\u8BA2\u9605\u8005\u770B\u89C1\uFF08KudsRocket 10-14 \u8BA1\u6570\u505C\u5728\u65E7\u5E27\uFF09\n                // ADR-0018\uFF1A\u79BB\u7EBF\u300C\u65B0\u4E0A\u4F20\u300D\u8865\u63A8\u2014\u2014push \u6CA1\u6210(\u4ECD dirty) \u2227 \u4ECE\u6CA1 synced(seenBase null) \u2192 \u5165\u961F\uFF0C\u56DE\u7EBF drainUploadQueue \u8865\u63A8\u3002\n                if (head.isDirtyThisTab(name) && head.seenBase(name) == null)\n                    uploadReplay.enqueue(name); // per-tab\uFF1A\u95EE\u7684\u662F\u300C**\u6211\u8FD9\u6B21** push \u6CA1\u843D\u5730\u5417\u300D\uFF08episode \u8D26\uFF09\n                return { pushed, reason, resolution };\n            },\n            async open() {\n                await migrationReady;\n                if (await local.exists(name)) { // \u6709\u672C\u5730\u526F\u672C \u2192 **\u5148 etag \u68C0\u67E5**\uFF08fresh.open\uFF09\uFF1Ain-sync \u8BFB\u672C\u5730\u3001\u53D8\u4E86\u624D\u62C9\u4E91\u3001\u810F surface\n                    // isOnline\uFF1A\u79BB\u7EBF\u76F4\u63A5\u8BFB\u672C\u5730\u3001\u4E0D\u78B0 fetchMeta\uFF08\u79BB\u7EBF\u6A21\u5F0F\u5B8C\u7F8E\u5DE5\u4F5C\uFF0C\u7EDD\u4E0D\u5361 open\uFF09\u3002\n                    // offlineEscape\uFF1A\u5728\u7EBF\u4F46 fetchMeta \u6302\u6B7B\uFF08iOS \u8001 token iframe\uFF09\u65F6\uFF0C\u7528\u6237\u70B9\u300C\u8DF3\u8FC7\u5230\u79BB\u7EBF\u300D\u2192 probe \u8D62 race \u2192 \u8BFB\u672C\u5730\u3002\n                    //   \u5BF9\u9F50\u524D\u8EAB\u5F15\u64CE cloud-freshness\u300C\u8DF3\u8FC7\u5230\u79BB\u7EBF\u300D\uFF08\u65E0\u786C\u8D85\u65F6\uFF0C\u7528\u6237\u5373\u8D85\u65F6\uFF09\u3002\u4E0D\u7ACB\u5373\u8FD4\u7F13\u5B58=\u9632\u4E91\u7AEF\u53D8\u4E86\u518D\u91C7\u7EB3\u7684\u95EA\u3002\n                    const esc = isOnline() ? ui.offlineEscape?.() : undefined;\n                    try {\n                        // \u51B2\u7A81\u5FC5 surface\uFF08ADR-0016 \u540E\u534A\uFF0C20260820 \u4E8B\u6545\u4FEE\uFF09\uFF1Adirty \u2227 cloudMoved \u2192 onNewer \u8D70 push 412 \u540C\u4E00\u5F20\n                        //   resolveConflict sheet\uFF08takeCloud=safePull \u5148\u5907\u4EFD\u518D\u62C9 / keepMine|cancel=\u7559\u672C\u5730 dirty\uFF0C\u4E4B\u540E push 412 \u518D surface\uFF09\u3002\n                        //   \u65E7\u7248\u6CA1\u63A5 onNewer \u2192 freshness \u9ED8\u8BA4 \"cancel\" = \u9759\u9ED8\u4FDD\u7559\u9648\u65E7\u672C\u5730\uFF08\u7EA2\u7EBF\u7834\u53E3\uFF09\u3002adopt \u4E0D\u63A5\uFF1Aopen \u7684\u5B57\u8282\n                        //   \u7ECF\u4E0B\u65B9 readLocal() \u8FD4\u56DE\u503C\u6D41\u56DE app\uFF08refresh \u624D\u9700\u8981 adopt \u6D3B\u66FF\u6362\u5DF2\u6253\u5F00\u7684 doc\uFF09\u3002\n                        //   \u62C9\u53D6\u5931\u8D25\u7684 surface \u5728 freshness \u5185\uFF08\u5206\u652F\u611F\u77E5\uFF1AtakeCloud \u6CA1\u6210=warning banner\u3001\u9759\u9ED8\u5FEB\u8FDB\u6CA1\u6210=info\n                        //   \u72B6\u6001\u680F\u2014\u2014\u5FEB\u8FDB\u6CA1\u627F\u8BFA\u8FC7\u4EC0\u4E48\uFF0Ccaptive portal \u4E0B\u522B\u6BCF\u6B21 open \u90FD banner\uFF09\u3002\u672C\u5730\u7167\u8BFB\uFF0C\u4E0D\u4E22\u5B57\u8282\u3002\n                        await fresh.open(name, {\n                            isOnline, probe: esc?.probe,\n                            onNewer: onConflictFor(\"open\"),\n                            localDirty: () => sub.edits.localDirty(),\n                        }).catch((e) => ui.reportError(e));\n                    }\n                    finally {\n                        esc?.settle();\n                    }\n                    return readLocal();\n                }\n                if (autoCacheOpenedFile && tierOf(name) !== \"resource\") { // \u672C\u5730\u6CA1\u6709\u3001\u6301\u6709\u6A21\u5F0F \u2192 \u62C9\u4E91\u843D\u672C\u5730\uFF08\u65E0\u53EF\u663E\u793A\uFF0C\u5FC5\u987B\u7B49\uFF09\uFF1B2.1.0 \u4E09\u7B49\u8D44\u6E90\u4E00\u5F8B\u8FC7\u8DEF\n                    // \u26A0 \u8FD9\u6761\u5206\u652F\uFF08\u6253\u5F00\u4E00\u4E2A**\u7EAF\u4E91\u7AEF\u3001\u672C\u5730\u4ECE\u6CA1\u7F13\u5B58\u8FC7**\u7684\u4F5C\u54C1\uFF09\u4EE5\u524D\u6CA1\u6709\u4EFB\u4F55\u51FA\u53E3\uFF1A\n                    //   \u300C\u5728\u7EBF\u4F46 OneDrive \u4E0D\u53EF\u8FBE\u300D\uFF08DNS \u6302 / \u4EE3\u7406 / \u4F01\u4E1A\u7F51\u9650\u6D41\uFF09\u65F6 provider \u7684 fetch \u53EF\u80FD\u6302\u5F88\u4E45\uFF0C\n                    //   spinner \u5C31\u4E00\u76F4\u8F6C\uFF0C\u7528\u6237\u8FDE\u9000\u56DE\u79BB\u7EBF\u53BB\u8BFB\u522B\u7684\u672C\u5730\u6587\u4EF6\u90FD\u505A\u4E0D\u5230\u3002\n                    //   \u2192 \u548C\u4E0A\u9762 fresh.open \u540C\u6B3E\u5904\u7406\uFF1A\u7ED9\u4E00\u4E2A\u300C\u8DF3\u5230\u79BB\u7EBF\u300D\u7684\u51FA\u53E3\uFF08\u65E0\u786C\u8D85\u65F6\uFF0C\u7528\u6237\u5373\u8D85\u65F6\uFF09\u3002\n                    //   \u8DF3\u51FA\u540E acquire \u4ECD\u5728\u540E\u53F0\u8DD1\uFF08\u6210\u529F\u4E86\u5C31\u5F53\u4E00\u6B21\u8FDF\u5230\u7684\u7F13\u5B58\u586B\u5145\uFF0C\u65E0\u5BB3\uFF09\uFF1B\u672C\u5730\u6B64\u523B\u6CA1\u6709 \u2192 \u8FD4 null\uFF0C\n                    //   \u7531 app \u8BDA\u5B9E\u5730\u62A5\u300C\u6253\u4E0D\u5F00\u300D\uFF0C**\u7EDD\u4E0D\u5047\u88C5\u6210\u529F**\u3002\n                    const esc = isOnline() ? ui.offlineEscape?.() : undefined;\n                    const pulling = identity.acquire(name, { localName: name }).catch((e) => { ui.reportError(e); return null; });\n                    try {\n                        await (esc ? Promise.race([pulling, esc.probe]) : pulling);\n                    }\n                    finally {\n                        esc?.settle();\n                    }\n                    return readLocal();\n                }\n                // \u672C\u5730\u6CA1\u6709\u3001\u8FC7\u8DEF\u6A21\u5F0F\uFF08autoCacheOpenedFile:false\uFF0C\u6D41\u5F0F\u6D88\u8D39\uFF09\u2192 \u6574\u4EFD\u62C9\u4E91\u3001**\u4E0D\u843D\u672C\u5730**\uFF0C\u76F4\u63A5\u8FD4\u5B57\u8282\n                const pulled = await cloud.pull(name).catch((e) => { ui.reportError(e); return null; });\n                return pulled ? await seal.unsealForRead(name, pulled.blob) : null; // range/streaming\uFF08\u6309\u9700\u53D6\u7247\uFF09\u662F \u26A0TODO \u4F18\u5316\n            },\n            // \u5934\u7247 peek\uFF080.15.0\uFF09\uFF1A\u672C\u5730\u5207\u7247 / \u4E91\u7AEF pullRange(0,n)\uFF0C\u52A0\u5BC6\u4EF6 null\uFF0C\u4E91\u7AEF\u4E0D\u53EF\u8FBE\u629B\uFF08JSDoc \u89C1 RawFile.getHead\uFF09\u3002\n            //   \u4E0E openPeekSource \u540C\u4E00\u8DEF\u7531\u7EAA\u5F8B\uFF1Asource=\"cloud\" \u8DF3\u8FC7\u672C\u5730\u5206\u652F\uFF1B\"local\" \u65E0\u672C\u5730\u624D\u843D\u4E91\u7AEF\u3002\u4E0D\u7ECF openStream\u2014\u2014\u90A3\u662F 2 MiB\n            //   \u5206\u7247 + staging tee \u7684\u6D41\u5F0F\u9762\uFF0C\u4E3A 10 KB \u5C01\u9762\u5F00\u4F1A\u8BDD\u662F\u9519\u7684\u5DE5\u5177\uFF08\u6BCF\u4E2A cloud-only tile \u843D 2 MiB \u6682\u5B58\uFF09\u3002\n            async getHead(o) {\n                await migrationReady;\n                const n = Math.max(0, Math.floor(o.bytesLength));\n                if (o.source !== \"cloud\") {\n                    const blob = await local.get(name);\n                    if (blob) {\n                        const b = blob instanceof Blob ? blob : new Blob([blob]);\n                        if (await enc.looksEncryptedContainer(b))\n                            return null; // \u5BC6\u6587\u5916\u58F3\u4E0D\u662F\u5934\u7247\n                        return b.slice(0, Math.min(n, b.size));\n                    }\n                }\n                if (!cloud.pullRange || !isOnline())\n                    return null; // \u4E91\u817F\u95F8 = isOnline \u2227 signedIn\uFF080.14.0\uFF09\uFF1A\u4E0D\u53EF\u80FD\u6210\u529F\u7684\u4E91\u817F\u4E0D\u6253\n                const r = await cloud.pullRange(name, 0, n); // \u4E0D\u53EF\u8FBE \u2192 \u629B\u7ED9\u8C03\u7528\u65B9\uFF08\u672A\u77E5 \u2260 \u6CA1\u6709\uFF09\n                if (!r || r.encrypted)\n                    return null;\n                return new Blob([(r.bytes instanceof Uint8Array ? r.bytes : new Uint8Array(r.bytes))]);\n            },\n            pullIfClean(opts) { return fresh.refresh(name, { isOnline, ...opts }); }, // \u4E8B\u4EF6\u9A71\u52A8\u5E72\u51C0\u5FEB\u8FDB\uFF08clean\u2192FF\u3001dirty\u2192no-op\uFF09\uFF1B\u9ED8\u8BA4\u6CE8\u5165 store \u7684 isOnline\uFF08\u79BB\u7EBF\u65E9\u9000\uFF0C\u4E0D\u7A7A\u8DD1 fetchMeta\uFF09\n            // 0.18.0 \u4E3B\u52A8\u53EB\u9762\uFF08JSDoc \u89C1 RawFile.resolve\uFF09\u3002\u9762 = \u540C\u4E00\u4E2A ui.resolveConflict\uFF1B\u6D3E\u53D1 = \u540C\u4E00\u4E2A safeResolve / pushMod\uFF0C\u6CA1\u6709\u7B2C\u4E8C\u5957\u903B\u8F91\u3002\n            async resolve(opts) {\n                await migrationReady;\n                roGuard(\"resolve\");\n                if (tierOf(name) === \"resource\")\n                    return { status: \"clean\" }; // 2.1.0 \u4E09\u7B49\u8D44\u6E90\uFF1A\u6CA1\u6709\u300C\u6CA1\u540C\u6B65\u597D\u300D\u8FD9\u56DE\u4E8B\uFF08\u6C38\u4E0D\u810F\uFF09\n                if (!(await local.exists(name)))\n                    return { status: \"no-local\" };\n                if (!head.isDirtyAnywhere(name))\n                    return resolveCleanGone();\n                if (!isOnline())\n                    return { status: \"offline\" };\n                // 0.18.2\uFF1A\u5148\u770B\u4E91\u7AEF\u90A3\u4E00\u4FA7\u662F\u4EC0\u4E48\u72B6\u6001\uFF0C\u9762\u624D\u80FD\u8BF4\u5BF9\u8BDD\u3001\u300C\u4E91\u7AEF\u8986\u76D6\u672C\u5730\u300D\u624D\u77E5\u9053\u8BE5\u62C9\u8FD8\u662F\u8BE5\u5220\uFF08\u4E91\u7AEF\u6CA1\u4E86 = \u8DDF\u7740\u4E91\u7AEF\u628A\u672C\u5730\u8FD9\u4EFD\u79FB\u5230\u56DE\u6536\u7AD9\uFF09\u3002\n                let cloudState = \"changed\";\n                try {\n                    const meta = await cloud.fetchMeta(name);\n                    cloudState = !meta ? (head.seenBase(name) == null ? \"never\" : \"absent\") : meta.etag === head.seenBase(name) ? \"unchanged\" : \"changed\";\n                }\n                catch (e) {\n                    ui.reportError(e, \"log\");\n                } // \u62FF\u4E0D\u5230\u5C31\u6309\u300C\u53EF\u80FD\u53D8\u4E86\u300D\u95EE\n                const choice = tierOf(name) === \"auto-backup\" ? \"keepMine\" // 2.1.0 \u4E8C\u7B49\uFF1A\u4E0D\u95EE\u4EBA\uFF0C\u8FD9\u53F0\u7684\u8D62\n                    : await ui.resolveConflict({ name, local: await local.get(name), cloud: null, occasion: \"push\", cloudState });\n                if (choice === \"cancel\")\n                    return { status: \"cancelled\" };\n                if (choice === \"takeCloud\") {\n                    if (cloudState === \"absent\" || cloudState === \"never\") { // \u4E91\u7AEF\u6CA1\u6709\u53EF\u62C9\u7684\uFF1A\u8DDF\u7740\u4E91\u7AEF = \u8FD9\u4EFD\u4E0D\u8981\u4E86 \u2192 \u672C\u5730 move-aside \u8FDB\u56DE\u6536\u7AD9\uFF08\u5E93\u7684\u5220\u9664\u8DEF\u5F84\uFF0C\u53EF\u6062\u590D\uFF1B\u4E0D\u786C\u5220\uFF09\n                        const d = await delIfCloudAbsentSF(name); // 0.18.6\uFF1A\u53EA\u5728\u4E91\u7AEF\u6B64\u523B\u786E\u5B9E\u6CA1\u6709\u65F6\uFF1B\u9762\u5F00\u7740\u65F6\u56DE\u6765\u4E86 \u2192 \u4E24\u8FB9\u4E0D\u52A8\uFF0Cunresolved / cloud-reappeared\n                        notifyFolderOf(name);\n                        return trashedOrWhy(d);\n                    }\n                    const r = await safeResolve.resolveConflict(name, \"takeCloud\", { adopt: opts?.adopt });\n                    notifyFolderOf(name);\n                    return r.status === \"resolved\" ? { status: \"took-cloud\", backupName: r.backupName } : { status: \"unresolved\", reason: r.reason };\n                }\n                // keepMine\uFF1Aat-rest \u5B57\u8282\u539F\u6837\u63A8\uFF08\u540C pushLocalBytes / dirty.pushAll\uFF09\uFF0C\u8D70 vetted push\uFF1AIf-Match \u7531\u8C31\u7CFB\u7ED9\u3001412 / \u8C31\u7CFB\u65AD\u88C2 \u2192 \u5E93\u518D\u5F39\u9762\n                const blob = await local.get(name);\n                if (!blob)\n                    return { status: \"no-local\" };\n                const atRest = await toU8(blob instanceof Blob ? blob : new Blob([blob]));\n                let r;\n                try {\n                    r = await pushMod.push(name, { encode: () => atRest, onConflict, surfaceCollision: true, loserBackup: tierOf(name) !== \"auto-backup\" });\n                }\n                catch (e) {\n                    ui.reportError(e);\n                    notifyFolderOf(name);\n                    return { status: \"not-pushed\", reason: \"error\" };\n                }\n                notifyFolderOf(name);\n                if (r.status === \"resolved\" && r.resolution === \"takeCloud\")\n                    return { status: \"took-cloud\", backupName: r.backupName }; // \u63A8\u65F6\u649E\u4E0A\u771F\u5206\u53C9\u3001\u4EBA\u5728\u7B2C\u4E8C\u5F20\u9762\u9009\u4E86\u4E91\u7AEF\n                const pushed = r.status === \"pushed\" || r.status === \"healed\" || r.status === \"resolved\";\n                return pushed ? { status: \"pushed\" } : { status: \"not-pushed\", reason: r.status };\n            },\n            tryMove(to) { tierGuard(\"tryMove\", name); return tryMoveSF(name, to); },\n            async trash() { tierGuard(\"trash\", name); const r = await delSF(name); notifyFolderOf(name); return r; }, // 2.1.2 \u8D77\u53EB trash\uFF08\u539F delete\uFF1B\u52A8\u8BCD = \u8BED\u4E49\uFF1A\u79FB\u8FDB\u56DE\u6536\u7AD9\uFF09\u3002\u8FD4 TrashOutcome\uFF08v436\uFF09\uFF1Acancelled/noop/queuedCloudDelete \u90FD\u4E0D\u662F\u300C\u5DF2\u8FDB\u56DE\u6536\u7AD9\u300D\n            reupload() {\n                tierGuard(\"reupload\", name);\n                return busyK(\"file.reuploading\", undefined, async () => {\n                    if (!(await local.exists(name)))\n                        return { status: \"no-local\" };\n                    pendingGone.clear(name); // \u7528\u6237\u5DF2\u5BF9 candidate \u52A8\u624B \u2192 \u6E05\u6807\u8BB0\uFF08\u6210\u529F=synced\uFF1B\u5931\u8D25=\u8F6C dirty/conflict\uFF0C\u90FD\u4E0D\u518D\u662F pendingGone\uFF09\n                    head.forget(name); // \u65AD\u65E7\u4E91\u8C31\u7CFB\uFF08cloud \u5DF2 gone\uFF09\u2192 no-base \u9996\u63A8\n                    head.recordEdit(name); // \u6807\u672A\u63A8 \u2192 \u8D70\u9996\u63A8\u8DEF\u5F84\uFF08no-base\uFF0CconflictBehavior:fail \u649E\u540D\u4E0D\u8986\u76D6\uFF09\n                    const r = await pushLocalBytes(name); // \u590D\u7528 vetted push\uFF08seal \u6B63\u786E + N6 + \u649E\u540D\u629B CloudNameCollisionError \u2192 app surface\uFF09\n                    if (!head.isDirtyThisTab(name)) {\n                        pendingGone.clear(name);\n                        notifyFolderOf(name);\n                    } // per-tab episode\uFF1A\u95EE\u300C**\u6211\u8FD9\u6B21** push \u843D\u5730\u6CA1\u300D\uFF1Bpush \u6210\u529F = synced \u2192 \u6E05 candidate + \u91CD\u753B\n                    return r;\n                });\n            },\n            isKeptOffline() { return local.exists(name); }, // \u6709\u672C\u5730\u526F\u672C = \u5DF2\u7559\u4F5C\u79BB\u7EBF\uFF08\u65E0 LRU\u3001\u65E0\u72EC\u7ACB pin flag\uFF09\n            stagingCoverage() { return sessions.coverage(name); }, // A5 \u900F\u660E\u9762\uFF1A\u53EA\u8BFB\u8D26\u672C\uFF0C\u96F6\u7F51\u7EDC\uFF08\u79BB\u7EBF\u5FBD\u7AE0/\u62A4\u680F\u7528\uFF09\n            async keepOffline(opts) {\n                if (await local.exists(name))\n                    return;\n                const runOnce = async () => {\n                    // A6 \u79BB\u7EBF\u5347\u683C\uFF082026-08-19 user \u6279\uFF09\uFF1A\u4E91\u7AEF\u4E0D\u53EF\u8FBE\u65F6\uFF0Cstaging \u8D26\u5B8C\u6574 \u2192 \u96F6\u7F51\u7EDC\u843D\u5730\uFF08\u8C31\u7CFB=\u8D26\u4E0A eTag\uFF0C\u56DE\u7EBF freshness \u7167\u5E38\u6821\u9A8C\uFF09\n                    if (!isOnline()) {\n                        const r = await sessions.promoteFromStaging(name);\n                        if (r === \"done\")\n                            return;\n                        throw new Error(`\u79BB\u7EBF\u65E0\u6CD5\u7559\u79BB\u7EBF\uFF1A\u672C\u5730\u7F13\u5B58${r === \"none\" ? \"\u6CA1\u6709\" : \"\u4E0D\u5B8C\u6574\"}\uFF0C\u9700\u8981\u7F51\u7EDC\u8865\u9F50`);\n                    }\n                    let sess;\n                    try {\n                        sess = await sessions.open(name);\n                    }\n                    catch (e) { // isOnline \u8BF4\u5728\u7EBF\u4F46\u7F51\u7EDC\u5B9E\u9645\u629B\u4E86\uFF08onLine \u6709\u8BF4\u8C0E\u524D\u79D1\uFF09\u2192 \u540C\u8D70\u79BB\u7EBF\u5347\u683C\u515C\u5E95\n                        const r = await sessions.promoteFromStaging(name);\n                        if (r === \"done\")\n                            return;\n                        throw new Error(`\u7559\u79BB\u7EBF\u5931\u8D25\uFF1A\u4E91\u7AEF\u4E0D\u53EF\u8FBE\uFF08${e.message}\uFF09\uFF0C\u4E14\u672C\u5730\u7F13\u5B58${r === \"none\" ? \"\u6CA1\u6709\" : \"\u4E0D\u5B8C\u6574\"}`);\n                    }\n                    if (!sess)\n                        return; // \u4E91\u7AEF\u6CA1\u6709 \u2192 \u4E0E\u65E7 acquire absent \u884C\u4E3A\u4E00\u81F4\uFF08\u4E0A\u5C42\u770B isKeptOffline\uFF09\n                    try {\n                        await sess.promote({ onProgress: opts?.onProgress });\n                    }\n                    finally {\n                        sess.close();\n                    }\n                };\n                try {\n                    await runOnce();\n                }\n                catch (e) {\n                    if (e instanceof EtagChangedError) {\n                        try {\n                            await runOnce();\n                            return;\n                        }\n                        catch (e2) {\n                            ui.reportError(e2);\n                            return;\n                        }\n                    } // \u7248\u53D8 \u2192 \u65B0\u7248\u91CD\u8BD5\u4E00\u6B21\n                    ui.reportError(e);\n                }\n            },\n            async openStream() {\n                await migrationReady;\n                const blob = await local.get(name);\n                if (blob) {\n                    const b = blob instanceof Blob ? blob : new Blob([blob]);\n                    return {\n                        totalSize: b.size,\n                        read: async (off, len) => new Uint8Array(await b.slice(Math.max(0, off), Math.min(b.size, Math.max(0, off) + Math.max(0, len))).arrayBuffer()),\n                        prefetch: async () => { }, keep: async () => { }, close: () => { },\n                        status: () => ({ demand: 0, speculative: 0, queued: 0, oldestMs: 0, stalled: 0, mirror: \"none\", cloudless: false }),\n                    };\n                }\n                const sess = await sessions.open(name).catch((e) => { ui.reportError(e, \"log\"); return null; }); // \u79BB\u7EBF/\u4E91\u7AEF\u6CA1\u6709 \u2192 null\uFF08\u8BDA\u5B9E\uFF0C\u4E0D\u5047\u88C5\uFF09\n                if (!sess)\n                    return null;\n                return {\n                    totalSize: sess.totalSize,\n                    read: (off, len) => sess.read(off, len),\n                    prefetch: (off, len) => sess.prefetch(off, len),\n                    keep: (o) => sess.promote({ onProgress: o?.onProgress }),\n                    status: () => sess.status(),\n                    close: () => sess.close(),\n                };\n            },\n            async offload() { await offloadMod.offload(name); notifyFolderOf(name); }, // \u6210\u529F\u540E\u91CD\u753B\u672C\u5939\uFF08badge \u5373\u65F6 \u2192 cloud-only\uFF09\n            isEncrypted() { return encIsEncrypted(name); },\n            encrypt(opts) {\n                tierGuard(\"encrypt\", name);\n                // 0.16.0\uFF1A\u53EA\u6709\u58F0\u660E\u8FC7\u79CD\u7C7B\u7684\u6587\u6863\u624D\u80FD\u52A0\u5BC6\u2014\u2014\u5BB9\u5668\u7684\u4E91\u7AEF\u540D = \u8EAB\u4EFD + .zip\uFF0C\u5217\u4E3E\u65F6\u9760\u300C\u53BB\u6389 .zip \u5269\u4E0B\u7684\u8BA4\u5F97\u662F\u6587\u6863\u300D\u8BA4\u56DE\u6765\uFF1B\n                //   \u975E\u6587\u6863\u5C01\u4E86\u4E4B\u540E\u4E91\u7AEF\u540D\u8BA4\u4E0D\u56DE\uFF08\u4F1A\u88AB\u5F53\u6210\u4E00\u4E2A\u53EB X.zip \u7684\u660E\u6587\u6742\u7269\uFF09\u3002\u8FD9\u662F\u8C03\u7528\u65B9\u7684 bug\uFF0C\u54CD\u4EAE\u629B\u3002\n                if (!ids.parse(name))\n                    throw new Error(`store: \"${name}\" is not a document of any declared kind and cannot be encrypted (docKinds: ${ids.kinds.map((k) => k.suffix).join(\", \") || \"none\"})`);\n                return encEncrypt(name, opts?.isOnline ?? isOnline);\n            },\n            decrypt(opts) { tierGuard(\"decrypt\", name); return encDecrypt(name, opts?.isOnline ?? isOnline); },\n            rekey(opts) { tierGuard(\"rekey\", name); return encRekey(name, opts.newPassword, opts.isOnline ?? isOnline); },\n            // at-rest \u5BC6\u6587\u5B57\u8282\u539F\u6837\uFF08\u5185\u5BB9\u76F2\u3001\u4E0D\u89E3\u58F3\u3001\u4E0D\u78B0\u5BC6\u7801\uFF09\u3002\u975E\u52A0\u5BC6\u4EF6 / \u65E0\u672C\u5730\u526F\u672C \u2192 null\u3002\n            async getEncryptedBlob() {\n                const blob = await local.get(name);\n                if (!blob)\n                    return null; // \u6CA1\u6709\u672C\u5730\u526F\u672C\uFF08\u7EAF\u4E91\u7AEF\u672A\u7F13\u5B58\uFF09\u2192 \u62FF\u4E0D\u5230 at-rest \u5B57\u8282\n                const asBlob = blob instanceof Blob ? blob : new Blob([blob]);\n                if (!(await enc.looksEncryptedContainer(asBlob)))\n                    return null; // \u660E\u6587\u4EF6 \u2192 null\uFF08brand \u7684\u8FD0\u884C\u65F6\u771F\u76F8\u7531\u8FD9\u4E00\u884C\u4FDD\u8BC1\uFF09\n                return asBlob;\n            },\n            verifyPassword(pw) { return encVerify(name, pw); },\n        };\n    }\n    //   \u903C\u8C03\u7528\u65B9\u60F3\u6E05\u300C\u8FD9\u662F\u65B0\u5EFA\u8FD8\u662F\u6253\u5F00\u5DF2\u6709\u300D\u2014\u2014\u7701\u7565/\u8BEF\u7528\u662F\u8C03\u7528\u65B9\u8D23\u4EFB\uFF08TS \u7F16\u8BD1\u671F\u5FC5\u586B\uFF09\u3002\n    /** \u6587\u4EF6\u5BF9\u8C61\u5DE5\u5382\uFF1A\u4EFB\u4F55\u6587\u4EF6\uFF08\u6587\u6863\u3001\u56FE\u7247\u3001\u6742\u7269\uFF09\u3002opts.mode **\u663E\u5F0F\u5FC5\u586B**\uFF1Anew=\u65B0\u5EFA\u6587\u6863\uFF08\u649E\u540D\u4E0D\u8986\u76D6\uFF0C\n     *  \u629B collision\uFF09\uFF1Bexisting=\u666E\u901A open/\u7F16\u8F91\uFF08\u5927\u591A\u6570\uFF09\u3002\u8DEF\u5F84\u62A4\u680F\uFF1A\u62D2\u4FDD\u7559\u6839\uFF08.trash/.backup/.<appId>\uFF09\u3002\n     *  0.16.0\uFF1A\u4E0D\u518D\u6536 isZip\u2014\u2014\u8981 getPeek \u7684\u8D70 zip()\uFF0C\u662F\u4E0D\u662F zip \u5BB9\u5668\u7531 docKinds \u8868\u8BF4\u4E86\u7B97\u3002\u591A\u4F20\u7684\u65E7\u5B57\u6BB5\uFF08\u5982 isZip\uFF09\u5FFD\u7565\u3002 */\n    function file(identifier, opts) {\n        if (_disposed)\n            throw new StoreDisposedError(\"file\");\n        assertValidFileName(identifier, appId);\n        return rejectAfterDispose(makeRaw(identifier, opts.mode));\n    }\n    /** zip \u5BB9\u5668\u6587\u6863\uFF08docKinds \u91CC container: \"zip\" \u7684\u90A3\u51E0\u79CD\uFF09\uFF1ARawFile \u4E4B\u4E0A\u591A getPeek / decryptPeek\u3002\n     *  \u8EAB\u4EFD\u4E0D\u662F\u6587\u6863\u3001\u6216\u5B83\u7684\u79CD\u7C7B\u4E0D\u662F zip \u5BB9\u5668 \u2192 \u629B\uFF08\u8C03\u7528\u65B9\u5728\u9A97\u81EA\u5DF1\uFF09\u3002 */\n    function zip(identifier, opts) {\n        if (_disposed)\n            throw new StoreDisposedError(\"zip\");\n        assertValidFileName(identifier, appId);\n        const d = ids.parse(identifier);\n        if (!d)\n            throw new Error(`store.zip(): \"${identifier}\" is not a document of any declared kind (docKinds: ${ids.kinds.map((k) => k.suffix).join(\", \") || \"none\"})`);\n        if (d.container !== \"zip\")\n            throw new Error(`store.zip(): \"${identifier}\" is a \"${d.kind}\" document whose container is \"${d.container}\", not \"zip\"; use store.file()`);\n        const name = identifier;\n        const raw = makeRaw(name, opts.mode);\n        // getPeek\uFF1A\u5E93\u5185\u90E8\u89E3 zip \u7684 central directory\uFF0C**\u6309\u6587\u4EF6\u540D**\u6293 entry \u5B57\u8282\uFF08\u683C\u5F0F\u76F2\u3001\u5185\u5BB9\u76F2\uFF09\u3002\n        //   \u52A0\u5BC6\u5BB9\u5668\uFF1A\u5916\u5C42\u660E\u6587 zip \u5E26\u540D\u4E3A CONTAINER_PEEK_ENTRIES \u7684\u65C1\u8DEF entry\uFF08\"peek\"\uFF09\u2014\u2014\u6309\u540D\u547D\u4E2D\u5373\n        //     \u8FD4\u5176**\u5BC6\u6587**\u5B57\u8282(ENC_PEEK_MIME\uFF0C\u4E0D\u89E3\u5BC6\uFF0C\u4F9B app \u7F13\u5B58\u5C42\u539F\u6837\u5B58\u5BC6\u6587=\u660E\u6587\u4E0D\u843D IDB)\u3002\u660E\u6587 ora \u65E0\u6B64\u540D entry \u4E0D\u8BEF\u547D\u4E2D\u3002\n        //   \u660E\u6587\u5BB9\u5668\uFF1A\u6309 app \u63D0\u4F9B\u7684 o.zipEntry \u6293 \u2192 entry \u539F\u59CB\u5B57\u8282 Blob(\u65E0 type)\u3002\u627E\u4E0D\u5230/\u4E0D\u53EF\u8FBE\u2192null\u3002\n        const getPeek = async (o) => {\n            const src = await openPeekSource(name, o.bytesLength, o.source);\n            if (!src)\n                return null;\n            const entries = await readCentralDirectory(src);\n            if (!entries)\n                return null;\n            const encEntry = entries.find((e) => enc.CONTAINER_PEEK_ENTRIES.includes(e.name)); // \u52A0\u5BC6\u5BB9\u5668\u65C1\u8DEF\u5757\uFF08\u5BC6\u6587\uFF09\n            if (encEntry) {\n                const bytes = await readEntryBytes(src, encEntry);\n                return bytes ? new Blob([bytes], { type: enc.ENC_PEEK_MIME }) : null;\n            }\n            const target = entries.find((e) => e.name === o.zipEntry); // \u660E\u6587\uFF1A\u552F\u4E00\u4F9D\u636E = app \u7ED9\u7684\u6587\u4EF6\u540D\n            if (!target)\n                return null;\n            const bytes = await readEntryBytes(src, target);\n            return bytes ? new Blob([bytes]) : null; // \u683C\u5F0F\u76F2\uFF1A\u4E0D\u8D34 MIME\n        };\n        const decryptPeekFn = (encPeek) => decryptEncPeek(name, encPeek);\n        return rejectAfterDispose(Object.assign(raw, { getPeek, decryptPeek: decryptPeekFn }));\n    }\n    // \u2500\u2500 collection / settings \u2500\u2500\n    // \u2500\u2500 collection scaffold\uFF08\u5F00\u5E93\u5373 idempotent \u5EFA\u4E91\u7AEF `.${appId}/` \u5939 + `.${appId}/<name>.json`\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    //   \u7528\u6237\u8981\u6C42\uFF1A\u5F00\u5E93\u65F6\uFF08\u7B2C\u4E00\u6B21\u4E91\u6210\u529F\uFF09\u5C31\u628A collection \u7684\u4E91\u7AEF\u6587\u4EF6\u5EFA\u51FA\u6765\uFF08\u54EA\u6015\u7A7A\uFF09\uFF0C\u79BB\u7EBF\u8DF3\u8FC7\u3001\u56DE\u7EBF drainFolders \u8865\u3002\n    //   app \u4E00\u65E6 store.collection(name)\uFF08synced\uFF1A\u5982 synced-user-preference / preset-rack\uFF09\u2192 \u90A3\u4EFD idempotent \u5EFA\u51FA\u3002local-only \u4E0D\u4E0A\u4E91\u3001\u4E0D scaffold\u3002\n    //   **store \u81EA\u7BA1\uFF0C\u975E app \u8C03**\uFF08app \u4E0D ensure\u3001\u4E0D\u77E5\u60C5\uFF09\uFF1A\u2460 \u5F00\u5E93\uFF08\u9996\u6B21\u521B\u5EFA/\u8BBF\u95EE store \u5BF9\u8C61\uFF09\u5373 fire \u4E00\u6B21\u2014\u2014\u4F46\u6784\u9020\u65F6\n    //   auth/online \u5E38\u8FD8\u6CA1\u5C31\u7EEA\uFF08signedIn=false\uFF09\u2192 \u65E9\u9000\uFF1B\u2461 store \u81EA\u5DF1\u7684**\u9996\u6B21\u4E91\u6210\u529F\u70B9**\uFF08watchFolder \u8FDC\u7AEF\u5E27\uFF0Capp \u8BA2\u9605\u3001\n    //   auth \u5C31\u7EEA\u540E\u8DD1\uFF09\u518D\u8865\u3002idempotent\uFF1AensureFolder(`.${appId}`) + \u6BCF\u4E2A collection \u540D fetchMeta \u65E0 \u2192 push \u7A7A\u4FE1\u5C01\u5EFA\u51FA\u6765\n    //   \uFF08baseEtag:null \u2192 conflictBehavior:fail\uFF0C**\u7EDD\u4E0D\u8986\u76D6\u5DF2\u6709**\uFF09\uFF1B\u6BCF\u540D\u5EFA\u597D\u8BB0\u8FDB _scaffoldEnsured\uFF0C\u5168\u5EFA\u597D\u5373\u5C01\u9876\u4E0D\u518D\u6253\u6270\u3002\n    const _scaffoldNames = new Set();\n    const _scaffoldEnsured = new Set();\n    async function ensureScaffold() {\n        if (!isOnline() || !signedIn() || _scaffoldEnsured.size >= _scaffoldNames.size)\n            return;\n        await migrationReady;\n        try {\n            await collectionsCloud.ensureFolder(`.${appId}`);\n        }\n        catch (e) {\n            ui.reportError(e);\n            return;\n        } // \u5939\u5EFA\u4E0D\u51FA\uFF08\u79BB\u7EBF/\u5931\u8D25\uFF09\u2192 \u6574\u8F6E\u4E0B\u6B21\u518D\u8BD5\n        for (const name of _scaffoldNames) {\n            if (_scaffoldEnsured.has(name))\n                continue;\n            try {\n                if (!(await collectionsCloud.fetchMeta(name).catch(() => null)))\n                    await collectionsCloud.push(name, emptyCollectionBytes(), { baseEtag: null }); // \u4E91\u7AEF\u6CA1\u8FD9\u6587\u4EF6\u624D\u5EFA\u7A7A\u4FE1\u5C01\n                _scaffoldEnsured.add(name);\n            }\n            catch (e) {\n                ui.reportError(e);\n            } // \u649E\u540D\uFF08\u522B\u7AEF\u5DF2\u5EFA\uFF09/\u79BB\u7EBF \u2192 \u4E0D mark\uFF0C\u4E0B\u6B21 fetchMeta \u547D\u4E2D\u5373\u6536\u655B\n        }\n    }\n    function registerScaffold(name) { _scaffoldNames.add(name); void ensureScaffold(); }\n    //   \uFF08\u5355\u4F8B\u7684\u4E3A\u4EC0\u4E48\uFF1A\u5426\u5219\u4E24\u4E2A\u5B9E\u4F8B\u5404\u6301\u5185\u5B58\u4FE1\u5C01\u3001\u540C\u6B65\u540C\u4E00\u4E91\u6587\u4EF6 \u2192 \u5199\u4E92\u76F8\u770B\u4E0D\u89C1\u3001\u51B2\u7A81\u3002\uFF09\n    const _collections = new Map();\n    /** collection \u5DE5\u5382\uFF1A\u8D70 collections \u5B9E\u4F8B + \u4E91\u7AEF scaffold\uFF08\u5168\u90E8\u5E26\u4E91\u540C\u6B65\u2014\u2014cloudless {local:true} \u53D8\u4F53\u5DF2\n     *  \u7269\u7406\u79FB\u9664 2026-08-28 \u6E05\u96F6\u8F6E\uFF1Adevice \u672C\u5730\u5B57\u6BB5\u5F52 app \u4FA7 localStorage \u5668\u5B98\uFF0Cstore \u5355\u4E00\u804C\u8D23\uFF1B\n     *  \u8BE6 ai-docs/20260827-deprecation-cloudless-collection.md + WeebPaint v0.11.25 \u6E05\u96F6\u4FE1\u53F7\uFF09\u3002\n     *  opts.getInitData\uFF1A\u4EC5\u5F53\u8FD9\u4EFD collection \u7684 json \u4E0D\u5B58\u5728\uFF08\u65B0\u5E93\uFF09\u65F6\u8C03\uFF0C\u586B\u521D\u59CB\u503C\uFF08uat=1\uFF1Bstore \u5185\u5BB9\u65E0\u5173\uFF0Capp \u57DF\u6784\u9020 [{id, value}]\uFF09\u3002\n     *  **\u5355\u4F8B**\uFF1Aapp schema \u7684\u5168\u5C40\u5355\u4F8B\u547D\u540D\u7A7A\u95F4\u2014\u2014\u540C\u540D\u7B2C\u4E8C\u6B21\u8FD4**\u540C\u4E00\u5BF9\u8C61**\uFF0Copts \u4EE5\u9996\u6B21\u4E3A\u51C6\uFF08\u540E\u7EED\u8C03\u5FFD\u7565 opts \u5DEE\u5F02\uFF09\u3002 */\n    function collection(name, opts = {}) {\n        if (_disposed)\n            throw new StoreDisposedError(\"collection\");\n        assertValidCollectionName(name);\n        const cached = _collections.get(name);\n        if (cached)\n            return cached;\n        const coll = rejectAfterDispose(createCollection({ cloud: collectionsCloud, name, local: collectionLocal, manual: opts.manual, getInitData: opts.getInitData }));\n        registerScaffold(name); // store \u81EA\u52A8\u5728\u4E91\u7AEF idempotent \u5EFA\u51FA .${appId}/<name>.json\n        _collections.set(name, coll);\n        return coll;\n    }\n    // collection \u4E91\u7AEF\u5B58\u5728\u6027\u63A2\u9488\uFF080.11.0\uFF0Cuser 2026-08-30\u300C\u540C\u610F\u300D\uFF1B\u9996\u7528=WeebPaint \u7B14\u5237\u64AD\u79CD\u6848\uFF09\uFF1A\n    //   \u7EAF\u8BFB fetchMeta\uFF08`.${appId}/<name>.json`\uFF0Cenc \u53D8\u4F53 _find \u987A\u5E26\u8986\u76D6\uFF09\uFF0C**\u96F6\u672C\u5730\u5199\u96F6\u8BB0\u8D26**\u3002\n    //   \"absent\"=\u4E91\u7AEF\u786E\u8BA4\u6CA1\u6709\uFF08\u300C\u771F\u65B0\u5E93\u300D\u5224\u636E\uFF1A\u5F00\u8FC7\u5E93\u7684\u5FC5\u6709 scaffold+\u9996\u64AD\uFF09\uFF1B\"present\"=\u5B58\u5728\n    //   \uFF08\u542B\u7A7A\u4FE1\u5C01\u6B8B\u5E93\u2014\u2014\u8C03\u7528\u65B9\u6309\u65E7\u5E93\u529E\uFF0C\u65B9\u5411\u5B89\u5168\u5B81\u4E0D\u95EE\uFF09\uFF1B\"unknown\"=\u63A2\u4E0D\u5230\uFF08\u79BB\u7EBF/\u672A\u6388\u6743/\u7F51\u7EDC\u9519\uFF09\uFF0C\n    //   \u8C03\u7528\u65B9\u6309\u300C\u4E0D\u77E5\u9053\u300D\u529E\uFF0C**\u7EDD\u4E0D\u5F53 absent**\u3002\n    async function collectionPeek(name) {\n        if (_disposed)\n            throw new StoreDisposedError(\"collectionPeek\");\n        assertValidCollectionName(name);\n        try {\n            const meta = await collectionsCloud.fetchMeta(name);\n            return meta ? \"present\" : \"absent\";\n        }\n        catch (e) {\n            reportStoreError(e, \"log\"); // \u826F\u6027\uFF08\u79BB\u7EBF\u7B49\uFF09\uFF1Bfunnel \u4E0D\u541E\uFF08\u5BB6\u89C4\uFF09\n            return \"unknown\";\n        }\n    }\n    return {\n        // \u2500\u2500 file + collection\u3002\u6539\u8EAB\u4EFD\u8D70 file.tryMove(to)\u3002\u2500\u2500\n        /** \u6587\u4EF6\u5BF9\u8C61\u5DE5\u5382\uFF08\u542B tryMove/pullIfClean/save/open/trash/reupload\u2026\uFF09\u3002 */\n        file,\n        /** zip \u5BB9\u5668\u6587\u6863\uFF08\u591A getPeek / decryptPeek\uFF09\uFF1B\u79CD\u7C7B\u4E0D\u662F zip \u5BB9\u5668 \u2192 \u629B\u3002 */\n        zip,\n        /** \u8EAB\u4EFD\u7684\u8BED\u6CD5\uFF080.16.0\uFF09\uFF1Aparse / join\u3002gallery \u548C\u5BBF\u4E3B\u76F4\u63A5\u7528\u5B83\uFF0C\u522B\u518D\u81EA\u5DF1\u5207\u540D\u5B57\u3002 */\n        identifiers: ids,\n        /** collection \u5DE5\u5382\uFF08app schema \u5168\u5C40\u5355\u4F8B\uFF1B\u8BBE\u7F6E/\u72B6\u6001\u5168\u8D70\u5B83\uFF09\u3002 */\n        collection,\n        /** collection \u4E91\u7AEF\u5B58\u5728\u6027\u63A2\u9488\uFF08\u7EAF\u8BFB\u96F6\u8BB0\u8D26\uFF09\uFF1A\"absent\"=\u786E\u8BA4\u6CA1\u6709 / \"present\"=\u5B58\u5728 / \"unknown\"=\u63A2\u4E0D\u5230\uFF08\u79BB\u7EBF\u7B49\uFF0C\u7EDD\u4E0D\u5F53 absent\uFF09\u3002 */\n        collectionPeek,\n        // \u2500\u2500 files \u547D\u540D\u7A7A\u95F4\u3002\u4E0D\u66B4\u9732 list/listAll/localKeys\uFF08app \u53EA\u653E\u5F53\u524D\u5939\u4E8E\u5185\u5B58\uFF1B\u540D\u5B57\u78B0\u649E\u7531 file.tryMove/mode:\"new\"\n        //   \u5185\u5316\u68C0\u6D4B\uFF0C\u4E0D\u9760\u300C\u5148 list \u76EE\u6807\u5939\u300D\uFF1B\u5168\u5E93 listAll \u4EC5\u5E93\u5185 reconcile \u7528\uFF09\u3002\u2500\u2500\n        /** \u6240\u6709\u300C\u4E0D\u6302\u5728\u5355\u4E2A file \u4E0A\u300D\u7684\u6587\u4EF6\u57DF\u64CD\u4F5C\uFF08\u5217\u4E3E\u8BA2\u9605 / \u6587\u4EF6\u5939\u589E\u5220 / \u79BB\u7EBF\u961F\u5217 / \u56DE\u6536\u7AD9\u5907\u4EFD\u7BB1 / \u540D\u5B57\u5360\u7528 / \u5168\u5E93\u6536\u655B\uFF09\u3002\n         *  **\u552F\u4E00\u5217\u4E3E\u9762 = files.watchFolder\uFF08\u8BA2\u9605\u5F53\u524D\u5939\uFF09**\uFF1A\u7ACB\u5373\u672C\u5730\u5E27\u3001\u4E91\u7AEF\u5230\u4E86\u540C\u4E00 cb \u518D\u95EA\u3002 */\n        files: rejectAfterDispose({\n            /** \u8EAB\u4EFD\u5360\u7528\uFF08**boolean**\uFF09\uFF1A\u5728\u7EBF\u4E91\u7AEF+\u672C\u5730\u90FD\u770B\uFF0C\u79BB\u7EBF\u53EA\u770B\u672C\u5730\uFF08\u9760 push conflictBehavior:fail \u515C\u5E95\uFF09\u3002app \u65B0\u5EFA/\u53E6\u5B58/\u6539\u540D\u524D\u9884\u68C0\u30020.16.0 \u8D77\u53EB occupied\uFF08\u539F nameOccupied\uFF09\u3002 */\n            occupied: (identifier) => nameOccupied(identifier).then((o) => o != null),\n            /** persist \u611F\u77E5\u9762\uFF08\u4E09\u4EF6\u5957\u4E4B\u2460\uFF09\uFF1A\u7EAF\u67E5\u8BE2\u5FEB\u7167\uFF08\u96F6\u5F39\u7A97\uFF0C\u4EFB\u4F55\u65F6\u523B\u53EF\u8C03\uFF09\u2014\u2014app \u753B\u300C\u672C\u5730\u7F13\u5B58\u672A\u53D7\u4FDD\u62A4\u300Dbadge \u7528\u3002\n             *  \u6267\u884C\u4F53\uFF08\u624B\u52BF\u65F6\u523B\u8C03\uFF09= \u9876\u5C42 export \u7684 requestStoragePersistence()\uFF1B\u6863\u4F4D\u5B9A\u6027\u89C1 persistence.ts \u5934\u6CE8\u91CA\u3002 */\n            persistence: () => queryStoragePersistence(),\n            // \u2500\u2500 dirty facet\uFF080.4.0\uFF0C2026-08-25 \u62CD\u677F \u00A71.3\uFF1A\u805A\u5408\u95E8\u9762\uFF0C\u522B\u6563\u4E00\u5730\uFF09\u3002\u7EFF\u706F\u95E8\u300C\u5148\u63A8\u5B8C\u300D\u6309\u94AE\u7684\u8BFB\u6570\u4E0E\u6267\u884C\u4F53\u3002\n            //   \u5E95\u5C42\u300C\u4E0D\u5F00\u6587\u6863\u63A8 dirty \u9879\u300D\u8DEF\u5F84\u6B64\u524D**\u4E0D\u5B58\u5728**\uFF08uploadReplay \u53EA\u7BA1 never-synced float\uFF1B\u5DF2\u540C\u6B65\u7684\n            //   dirty \u53EA\u6709\u4E0B\u6B21 save \u624D\u8865\u63A8\uFF09\u2014\u2014\u6309\u62CD\u677F\u300C\u7F3A\u5219\u6B64\u95E8\u9762\u5373\u5176\u65B0\u5BB6\u300D\uFF0C\u5EFA\u5728 pushLocalBytes\uFF08vetted push\uFF09\u4E4B\u4E0A\u3002\n            dirty: rejectAfterDispose({\n                /** \u6709\u672A\u63A8\u5B57\u8282\u7684\u6587\u4EF6**\u6570**\u3002\u26A0 \u53EA\u8FD4\u6807\u91CF\u3001\u6C38\u4E0D\u8FD4\u540D\u5B57\uFF08\u4E0E usage \u7EA2\u7EBF\u540C\u53E3\u5F84\u2014\u2014\u4E0D\u662F\u5217\u4E3E\u9762\uFF0C\u5217\u4E3E\u552F\u4E00\u9762 =\n                 *  watchFolder\uFF09\uFF1Bbool \u7528 `count() > 0` \u767D\u9001\u3002\u53E3\u5F84 = durable dirty \u8F68\uFF08\u4EFB\u4F55 tab \u7684\u672A\u63A8\u90FD\u7B97\uFF09\u3002 */\n                count: async () => dirtyNames().length,\n                /** \u628A\u6240\u6709 dirty \u6587\u4EF6\u63A8\u4E0A\u4E91\uFF08\u4E0D\u5F00\u6587\u6863\uFF1Bper-name serialize \u4E0E\u7528\u6237\u64CD\u4F5C\u4E92\u65A5\uFF09\u3002\n                 *  failed \u8FD4\u540D\u5B57\u662F**\u9519\u8BEF\u62A5\u544A**\u4E0D\u662F\u5217\u4E3E\u9762\uFF08\u91CF\u7EA7=\u5931\u8D25\u6570\uFF09\uFF1A\u79BB\u7EBF/\u51B2\u7A81/\u843D\u5730\u672A\u786E\u8BA4\u90FD\u7B97\u5931\u8D25\u7559 dirty\uFF080.15.1 \u8D77**\u52A0\u5BC6\u9501\u5B9A\u4E0D\u518D\u662F\u5931\u8D25\u539F\u56E0**\uFF1Aat-rest \u5B57\u8282\u76F4\u63A8\uFF0C\u4E0D\u8981\u5BC6\u7801\uFF09\uFF0C\n                 *  \u7EDD\u4E0D\u8C0E\u62A5\u2014\u2014\u7EFF\u706F\u95E8\u4EE5 `count()===0` \u4E3A\u51C6\uFF0C\u4E0D\u4EE5\u672C\u65B9\u6CD5\u8FD4\u56DE\u4E3A\u51C6\u3002\u51B2\u7A81\u4E0D\u5728\u8FD9\u91CC\u5F39\u9762\uFF08batch \u91CC\u4E0D\u7EA7\u8054\n                 *  sheet\uFF09\uFF1B\u540D\u5B57\u7559\u5728 failed \u91CC\uFF0C\u7528\u6237\u6253\u5F00\u8BE5\u6587\u4EF6\u8D70\u6B63\u5E38 save/\u51B2\u7A81\u9762\u89E3\u51B3\u3002\n                 *  \u26A0 \u6EE5\u7528\u8B66\u793A\uFF1A\u8FD9\u662F**\u81EA\u52A8\u7EED\u63A8**\uFF08\u767B\u5F55\u540E / \u56DE\u7EBF / \u56DE\u524D\u53F0\u628A\u5DF2 consent \u7684\u4FDD\u5B58\u8865\u4E0A\u53BB\uFF09\uFF0CIf-Match \u5B88\u7740\u3001\u649E\u4E0A\u5C31\u7559 dirty\u3002\n                 *  **\u4E0D\u8981**\u628A\u5B83\u63A5\u5230\u7528\u6237\u6309\u7684\u300C\u4F20\u4E0A\u53BB / \u5168\u90E8\u63A8\u9001\u300D\u6309\u94AE\u4E0A\u2014\u2014\u90A3\u662F\u66FF\u4EBA\u9009\u4E86\u300C\u672C\u5730\u8986\u76D6\u4E91\u7AEF\u300D\u7684\u65B9\u5411\u3002\u5931\u8D25\u540D\u5355\u91CC\u7684\u6587\u4EF6\u53EA\u80FD\u7ECF `resolve()` \u5904\u7406\u3002 */\n                pushAll: async () => {\n                    roGuard(\"dirty.pushAll\");\n                    await migrationReady;\n                    let pushed = 0;\n                    const failed = [];\n                    for (const name of dirtyNames()) {\n                        const st = await sub.serialize(name, async () => {\n                            if (!head.isDirtyAnywhere(name))\n                                return \"clean\"; // \u5176\u95F4\u5DF2\u88AB\u63A8\u5E72\u51C0/\u5220\u9664 \u2192 \u4E0D\u91CD\u63A8\u4E0D\u8BA1\u6570\n                            try {\n                                const r = await pushLocalBytes(name); // vetted push\uFF08seal + If-Match + F0 deferred \u4E0D\u7B97\u6210\u529F\uFF09\n                                return (r.status === \"pushed\" || r.status === \"healed\") ? \"pushed\" : \"failed\";\n                            }\n                            catch (e) {\n                                ui.reportError(e, \"warning\");\n                                return \"failed\";\n                            } // \u51B2\u7A81/\u649E\u540D/\u7F51\u7EDC \u2192 \u7559 dirty \u62A5\u540D\u5B57\n                        });\n                        if (st === \"pushed\")\n                            pushed++;\n                        else if (st === \"failed\")\n                            failed.push(name);\n                    }\n                    return { pushed, failed };\n                },\n            }),\n            /** \u8BA2\u9605**\u4E00\u4E2A**\u6587\u4EF6\u5939\uFF08\u7F51\u76D8\u6A21\u578B\uFF09\uFF1A\u7ACB\u5373\u672C\u5730\u5E27 + \u4E91\u7AEF\u5E27\u540C\u4E00 cb \u518D\u95EA\uFF1B\u4E4B\u540E\u672C\u5939\u4EFB\u4F55\u672C\u5730\u5199\u5373\u65F6\u91CD\u63A8\u672C\u5730\u5E27\u3002\u8FD4\u56DE\u9000\u8BA2\u3002 */\n            watchFolder,\n            /** 0.14.0\uFF1A\u8EAB\u4EFD\u53D8\u66F4\u4E8B\u4EF6\u2014\u2014\u4EFB\u4F55\u5165\u53E3\u7684 `file.tryMove` \u6210\u529F\u540E\u540C\u6B65\u56DE\u8C03 `(from, to)`\uFF08\u5E93\u8EAB\u4EFD = \u5168\u540D\uFF1B\u542B\u79BB\u7EBF move \u5206\u652F\uFF1B\u649E\u540D ok:false \u4E0D\u53D1\uFF09\u3002\n             *  \u5BBF\u4E3B\u6309\u8DEF\u5F84\u952E\u7684\u4F34\u751F\u6570\u636E\uFF08\u9605\u8BFB\u4F4D\u7F6E / \u5207\u7AE0\u89C4\u5219 / \u7F29\u7565\u56FE\u7F13\u5B58\uFF09\u636E\u6B64\u8DDF\u7740\u642C\u3002\u8FD4\u56DE\u9000\u8BA2\u3002dispose \u6E05\u7A7A\u3002 */\n            onRenamed: (cb) => { renameListeners.add(cb); return () => { renameListeners.delete(cb); }; },\n            //   \u4E00\u6B21\u672C\u5730 IDB cursor\uFF08\u65E0\u7F51\u7EDC\uFF09\uFF0C\u4F46\u4ECD\u662F\u5168\u8868\u8D70\u4E00\u904D \u2192 app \u53EA\u5728\u56FE\u5E93\u6253\u5F00/\u5237\u65B0\u65F6\u8C03\uFF0C\u522B\u6302\u6BCF\u5E27\u3002\n            /** \u672C\u5730\u5DF2\u7F13\u5B58\u6587\u4EF6\u7684\u603B\u5360\u7528\uFF08\u5B57\u8282 + \u4EF6\u6570\uFF09\uFF0C\u7ED9 app \u663E\u793A\u300C\u672C\u5730\u5B58\u4E86\u591A\u5C11\u300D\u3002**\u53E3\u5F84**\uFF1A\u53EA\u91CF\u672C\u5E93 files \u5206\u533A\uFF0C\n             *  **\u4E0D\u542B** trash/backup/collections \u5206\u533A\u3001app \u81EA\u5DF1\u522B\u7684 IDB \u5E93\u3001\u7EAF\u4E91\u7AEF\u672A\u7F13\u5B58\u7684\u4F5C\u54C1\u3002\n             *  \u26A0 **\u53EA\u8FD4\u4E24\u4E2A\u6807\u91CF\u3001\u6C38\u4E0D\u8FD4\u540D\u5B57** \u2014\u2014 \u5B83\u4E0D\u662F\u3001\u4E5F\u4E0D\u80FD\u53D8\u6210\u5168\u5E93\u5217\u4E3E\uFF08\u5217\u4E3E\u552F\u4E00\u9762 = watchFolder\uFF09\u3002 */\n            usage: () => local.usage(),\n            /** 0.17.0\uFF1A\u6D41\u5F0F\u65B0\u5EFA\u4E00\u4E2A\u7EAF\u4E91\u7AEF\u6587\u4EF6\uFF08KudsRocket\u300C\u8FB9\u52A0\u5BC6\u8FB9\u4E0A\u4F20\u3001\u4E0D\u7559\u672C\u5730\u526F\u672C\u300D\uFF09\u3002\u5BBF\u4E3B\u6309 source.read \u9010\u5757\u7ED9\u5B57\u8282\uFF08\u672C\u5730 File\u3001\u8FB9\u52A0\u5BC6\u7684\u7BA1\u7EBF\u2026\u2026\uFF09\uFF0C\n             *  \u5E93\u9010\u5757\u4E0A\u4F20\uFF08Graph \u4E0A\u4F20\u4F1A\u8BDD\uFF1B\u6700\u540E\u4E00\u5757\u843D\u5730\u624D\u6210\u6587\u4EF6\uFF0C\u4E2D\u9014\u65AD\u4E86\u4E91\u7AEF\u6CA1\u6709\u534A\u6210\u54C1\uFF09\uFF0C**\u6574\u4EFD\u6C38\u4E0D\u8FDB\u5185\u5B58\u3001\u4E0D\u843D\u672C\u5730\u3001\u4E0D\u5199\u8C31\u7CFB**\u3002\n             *  \u53EA\u51C6\u65B0\u5EFA\uFF1A\u8EAB\u4EFD\u5DF2\u5360\uFF08\u672C\u5730\u6216\u4E91\u7AEF\uFF09\u2192 CloudNameCollisionError\uFF0C\u4E00\u4E2A\u5B57\u8282\u4E0D\u4F20\u3002\u8981\u7F51\uFF1A\u79BB\u7EBF / \u6CA1\u767B\u5F55 \u2192 \u629B\uFF08\u6CA1\u6709\u672C\u5730\u5B57\u8282\u53EF\u6392\u961F\uFF09\u3002\n             *  \u6210\u529F\u540E\u6587\u4EF6\u662F cloud-only\uFF08\u672C\u5939 watcher \u91CD\u753B\uFF09\uFF1B\u4E4B\u540E open() \u8D70 acquire \u7167\u5E38\u3002\u8FDB\u5EA6\u7ECF onProgress\u3002busy \u952E \"file.uploading\"\uFF08\u5BBF\u4E3B\u53EF\u6309\u952E\u8DEF\u7531\u5230\u540E\u53F0\u63D0\u793A\uFF09\u3002 */\n            uploadStream: async (identifier, source, opts = {}) => {\n                roGuard(\"uploadStream\");\n                await migrationReady;\n                assertValidFileName(identifier, appId);\n                if (!isOnline())\n                    throw new Error(`uploadStream \"${identifier}\": cloud unreachable (offline or signed out)`);\n                const where = await nameOccupied(identifier);\n                if (where)\n                    throw new CloudNameCollisionError(identifier, where);\n                await busyK(\"file.uploading\", undefined, () => cloud.pushStream(identifier, source, { onProgress: opts.onProgress }));\n                notifyFolderOf(identifier);\n                return { status: \"uploaded\", size: source.size };\n            },\n            /** \u786E\u4FDD\u6587\u4EF6\u5939\u5B58\u5728\u3002**\u79BB\u7EBF\u4E5F\u80FD\u5EFA**\uFF08\u672C\u5730\u767B\u8BB0 + \u56DE\u7EBF drainOfflineQueue \u8865\u5EFA\uFF09\u3002 */\n            ensureFolder: (path) => { roGuard(\"ensureFolder\"); return ensureFolderLocalFirst(path); },\n            /** \u65B0\u5EFA\u7A7A\u6587\u4EF6\u5939\uFF08gallery folder-tree\uFF1B\u79BB\u7EBF\u4E5F\u80FD\u5EFA\uFF0C\u56DE\u7EBF\u8865\u5EFA\uFF09\u3002 */\n            newFolder: singleFlight(\"\u65B0\u5EFA\u6587\u4EF6\u5939\", (path) => { roGuard(\"newFolder\"); return busyK(\"folder.creating\", undefined, async () => { await ensureFolderLocalFirst(path); notifyFolderOf(path); }); }), // \u5B50\u5939\u51FA\u73B0\u5728\u7236\u5939 \u2192 \u91CD\u753B\u7236\u5939\n            /** \u5220\u9664**\u7A7A**\u6587\u4EF6\u5939\u2014\u2014\u300C\u5FC5\u987B\u8BC1\u5B9E\u4E3A\u7A7A\u300D\u5E93\u5185\u5F3A\u5236\uFF08\u4E24\u7AEF\u5224\u7A7A\uFF1B\u975E\u7A7A/\u65E0\u6CD5\u786E\u8BA4 \u2192 \u629B\u9519\u62D2\u5220\uFF09\u3002 */\n            deleteFolder: singleFlight(\"\u5220\u9664\u6587\u4EF6\u5939\", (path) => {\n                roGuard(\"deleteFolder\");\n                return busyK(\"folder.deleting\", undefined, async () => {\n                    assertValidFileName(path, appId); // \u8DEF\u5F84\u62A4\u680F\n                    // \u5224\u7A7A**\u4E24\u7AEF\u90FD\u67E5**\uFF1A\u672C\u5730\u6709\u8BE5\u5939\u4E0B\u7684\u6587\u4EF6\uFF08\u542B local-only/\u672A\u4E0A\u4E91\uFF09\u2192 \u62D2\u5220\uFF08\u5426\u5219\u5220\u6389\u4E91\u7AEF\u5939\u3001\u672C\u5730\u6587\u4EF6\u6210\u5B64\u513F\uFF09\u3002\n                    const prefix = `${path}/`;\n                    if ((await local.appKeys()).some((k) => k.startsWith(prefix)))\n                        throw new Error(`\u6587\u4EF6\u5939\u975E\u7A7A\uFF08\u672C\u5730\u6709\u6587\u4EF6\uFF09\uFF0C\u62D2\u7EDD\u5220\u9664\uFF1A${path}`);\n                    const wasPending = readPending().includes(path);\n                    clearPendingFolder(path); // **\u4FDD\u6301\u5728 enqueue \u524D**\uFF08\u4E92\u65A5 pending_new_folders\uFF1A\u4E00\u4E2A\u5939\u4E0D\u80FD\u540C\u65F6\u5728\u5EFA\u961F\u5217\u548C\u5220\u961F\u5217\uFF09\n                    if (!isOnline()) {\n                        if (wasPending) {\n                            notifyFolderOf(path);\n                            return;\n                        } // \u4ECE\u6CA1\u4E0A\u4E91 \u2192 \u6E05\u767B\u8BB0\u5373\u5220\n                        enqueueFolderDel(path);\n                        notifyFolderOf(path); // \u5DF2\u4E0A\u4E91\u7A7A\u5939 \u2192 \u6392\u961F + \u9690\u85CF\uFF08listing \u51CF\u53BB\uFF09\uFF0C\u56DE\u7EBF drainFolderDeletions\n                        return;\n                    }\n                    const r = await cloud.deleteEmptyFolder(path); // backend \u62A4\u680F\uFF1A\u53EA\u5220\u7A7A\u5939\n                    if (r.status === \"non-empty\")\n                        throw new Error(`\u6587\u4EF6\u5939\u975E\u7A7A\uFF0C\u62D2\u7EDD\u5220\u9664\uFF1A${path}`);\n                    if (r.status === \"list-failed\")\n                        throw new Error(`\u65E0\u6CD5\u786E\u8BA4\u6587\u4EF6\u5939\u662F\u5426\u4E3A\u7A7A\uFF08\u5217\u4E3E\u5931\u8D25\uFF09\uFF0C\u5DF2\u62D2\u7EDD\u5220\u9664\uFF1A${path}`);\n                    notifyFolderOf(path); // deleted / already-gone\uFF1A\u5B50\u5939\u4ECE\u7236\u5939\u6D88\u5931 \u2192 \u91CD\u753B\u7236\u5939\n                });\n            }),\n            /** \u79BB\u7EBF\u961F\u5217\u7EDF\u4E00\u91CD\u653E\uFF08app \u5728 focus/visibility/online/boot \u8C03\uFF09\uFF1A\u65B0\u6587\u4EF6\u5939\u8865\u5EFA \u2192 \u65B0\u4E0A\u4F20\u8865\u63A8 \u2192 \u5220\u6587\u4EF6 \u2192 \u5220\u6587\u4EF6\u5939\uFF08\u6309\u5E8F\uFF09\u3002 */\n            drainOfflineQueue,\n            //   conflictLive\uFF08\u79BB\u7EBF\u5220\u88AB edit-wins \u64A4\u9500\u2192\u672C\u5730 trash \u6709\u3001\u4E91\u7AEF\u8FD8\u6D3B\u7740\uFF09\uFF1A\u4EC5\u5F53\u6709\u672C\u5730 trash \u9879\u4E14\u80FD\u62FF\u5230**\u6743\u5A01** live \u5217\u8868\u65F6\u624D\u5224\uFF08\u79BB\u7EBF/partial\u2192\u7A7A\u96C6\u2192\u4E0D\u8BEF\u62A5\uFF09\u3002\n            /** \u56DE\u6536\u7AD9\u5217\u8868\uFF1A**\u672C\u5730\u2194\u4E91\u4E24\u7AEF\u805A\u5408**\uFF08mergeTrash\uFF09\u3002\u53EA\u8FD4\u5143\u6570\u636E\uFF08trashKey/cloudItemId/\u539F\u540D/\u52A0\u5BC6\u6807\u5FD7/conflictLive\uFF09\uFF0C\u7EDD\u4E0D\u5E26 blob\u3002 */\n            listTrash: () => aggregateBox(\"trash\"),\n            /** \u5907\u4EFD\u7BB1\u5217\u8868\uFF08\u540C listTrash \u7684\u4E24\u7AEF\u805A\u5408\uFF1B\u5907\u4EFD\u7BB1\u662F\u51B2\u7A81 loser \u7559\u5E95\uFF0C\u65E0 conflictLive \u8BED\u4E49\uFF09\u3002 */\n            listBackup: () => aggregateBox(\"backup\"),\n            /** \u4ECE\u56DE\u6536\u7AD9/\u5907\u4EFD\u7BB1\u6062\u590D\u4E00\u9879\u3002 */\n            restoreTrash: singleFlight(\"\u6062\u590D\", (...a) => { roGuard(\"restoreTrash\"); return trashMod.restore(...a); }),\n            /** \u5F7B\u5E95\u5220\u9664\u56DE\u6536\u7AD9/\u5907\u4EFD\u7BB1\u4E00\u9879\u3002 */\n            purgeTrash: singleFlight(\"\u5F7B\u5E95\u5220\u9664\", (...a) => { roGuard(\"purgeTrash\"); return trashMod.purge(...a); }),\n            /** \u6E05\u7A7A\u56DE\u6536\u7AD9\u3002 */\n            emptyTrash: singleFlight(\"\u6E05\u7A7A\u56DE\u6536\u7AD9\", (...a) => { roGuard(\"emptyTrash\"); return trashMod.emptyTrash(...a); }),\n            /** \u6E05\u7A7A\u5907\u4EFD\u7BB1\u3002 */\n            emptyBackup: singleFlight(\"\u6E05\u7A7A\u5907\u4EFD\u7BB1\", (...a) => { roGuard(\"emptyBackup\"); return trashMod.emptyBackup(...a); }),\n            //   \u65E5\u5E38\u5F00\u5939\u7684\u60F0\u6027\u6536\u655B\u5DF2\u5728 watchFolder \u5185\u8D70 reconcileFolder\uFF08\u770B\u5230\u5939\u624D\u6536\u655B\uFF0C\u540C\u4E00 converge SSOT\uFF09\u3002\n            /** **\u5168\u5E93** cloud-gone \u6536\u655B\uFF08\u53BB\u6296\u540E send trash\uFF09\u3002**\u4EC5\u7528\u6237\u663E\u5F0F\u6307\u4EE4**\uFF08\u9690\u85CF\u7684\u300C\u6821\u9A8C\u5B8C\u6574\u6027\u300D\u5165\u53E3\uFF09\uFF0C\n             *  \u7EDD\u4E0D\u81EA\u52A8/\u8F6E\u8BE2\u2014\u2014\u5168\u6811 listAll \u662F\u91CD\u6D3B\u3002 */\n            reconcileAll: (opts) => reconcileMod.reconcile({ activeFileName: opts?.activeIdentifier }),\n        }),\n        // \uFF08encryption \u9762\u5DF2\u968F @internal/encryption \u7ACB\u6237\u9000\u5F79 2026-08-28\uFF1A\u52A0\u5BC6\u662F\u7EAF\u5185\u5BB9\u64CD\u4F5C\u4E0D\u5C5E\u4E8E\u540C\u6B65\u5F15\u64CE\u2014\u2014\n        //   app \u7528\u81EA\u5DF1\u7684 createEncryption \u5B9E\u4F8B\uFF08\u65E0\u5E93\u6A21\u5F0F\u4E5F\u6D3B\u7740\uFF09\uFF0Cstore \u53EA\u7ECF EncryptionPort \u6536\u540C\u4E00\u5B9E\u4F8B\u3002\uFF09\n        // \u2500\u2500 dispose\uFF080.4.0\uFF0C2026-08-25 \u62CD\u677F \u00A71.2\uFF09\uFF1A\u505C watcher \u2192 drain in-flight push \u2192 \u65AD IDB \u8FDE\u63A5 \u2192 \u62D2\u540E\u7EED\u3002\u2500\u2500\n        /** \u91CA\u653E\u672C store \u5B9E\u4F8B\uFF08\u5207\u5E93/\u767B\u51FA/\u591A\u5B9E\u4F8B\u8F6E\u6362\u7528\uFF09\u3002\u987A\u5E8F\uFF1A\u5148\u62D2\u65B0\u8C03\u7528 + \u505C watcher\uFF08\u4E0D\u518D\u6709\u5E27\u63A8\u7ED9\u8BA2\u9605\u8005\uFF09\u2192\n         *  drain\uFF08\u9ED8\u8BA4 true\uFF1A\u7B49 in-flight \u7684 push/\u5199\u94FE\u6536\u655B\u2014\u2014\u6B63\u5728\u63A8\u7684\u5B57\u8282**\u63A8\u5B8C\u843D\u8D26**\uFF0C\u7EDD\u4E0D\u534A\u9014\u6390\uFF1B\n         *  {drain:false} = \u5FEB\u901F\u62C6\u9664\uFF0Cin-flight \u64CD\u4F5C\u4F1A\u56E0\u8FDE\u63A5\u5173\u95ED\u54CD\u4EAE\u5931\u8D25\u3001dirty \u8D26\u8FD8\u5728\u4E0B\u6B21\u8865\u63A8\uFF09\u2192 \u5173 IDB \u8FDE\u63A5\u3002\n         *  \u5E42\u7B49\u3002\u4E4B\u540E\u4EFB\u4F55\u9762\uFF08\u542B dispose \u524D\u5DF2\u63E1\u7740\u7684 file/collection \u5BF9\u8C61\uFF09\u2192 \u629B StoreDisposedError\u3002\n         *  \u26A0 \u4E0D\u542B provider/auth \u7684\u767B\u51FA\uFF08\u90A3\u662F app \u4FA7 auth \u7684\u4E8B\uFF09\uFF1B\u9519\u8BEF\u4E0A\u62A5\u5355\u4F8B reporter \u4E0D\u91CD\u7F6E\uFF08\u591A\u5B9E\u4F8B\u5171\u6C47\u4E00\u5904\uFF09\u3002 */\n        async dispose(opts) {\n            if (_disposed)\n                return;\n            _disposed = true; // \u5148\u62D2\u65B0\u8C03\u7528\uFF08drain \u624D\u53EF\u80FD\u6536\u655B\uFF09\n            renameListeners.clear();\n            unAuth?.(); // 0.11.6\uFF1A\u9000\u8BA2 provider auth \u4E8B\u4EF6\n            folderWatchers.clear(); // \u505C watcher\uFF1Ain-flight \u5E27\u63A8\u9001\u7ECF has(folder) \u68C0\u67E5\u81EA\u7136\u5931\u6548\n            if (opts?.drain !== false)\n                await sub.drain(); // \u7B49\u6240\u6709 serialize \u94FE\u5C3E\uFF08push/local \u5199\u90FD\u5728\u94FE\u4E0A\uFF09\n            local.close?.(); // \u65AD IDB\uFF08\u4E09\u4E2A cache \u53EF\u80FD\u540C/\u5F02\u5B9E\u4F8B\uFF0Cclose \u5E42\u7B49\uFF09\n            if (collectionLocal !== local)\n                collectionLocal.close?.();\n            stagingStore.close?.();\n        },\n        // \u65E0 _internal \u2014\u2014 app \u7EDD\u4E0D\u78B0 head/cloud/sub\uFF08\u5E93\u5185\u6D4B\u8BD5\u76F4\u63A5 import \u5BF9\u5E94\u6A21\u5757\uFF09\u3002\n    };\n}\n", "// maintenance \u2014\u2014 \u6DF1\u6E05\uFF08\u8FD8\u539F\u51FA\u5382\uFF09\u4E24\u53E3\u5B50\uFF1Awipe\uFF08\u5220\u672C appId \u5168\u90E8\u547D\u540D\u7A7A\u95F4\uFF09+ \u65E0\u75D5\u626B\uFF08\u6B8B\u7559\u9A8C\u8BC1\uFF09\u3002\n// created 2026-08-28 by Claude Fable 5. \u51FA\u5904 = WeebPaint P7 \u8FD8\u539F\u51FA\u5382\uFF080825 \u6848\u5377 \u00A72.10\uFF09+ store \u8F6E\u4E8C\u8BAE\u9898 2\uFF0C\n//   user \u62CD\u677F\uFF1Atype-consent \u6BD4\u5BF9**\u5FC5\u987B\u5728\u5E93\u5185\u505A**\uFF08\"typing check \u9700\u8981\u5E93\u6765\u505A\"\uFF0C2026-08-25/0828 \u4E24\u6B21\u786E\u8BA4\uFF09\u3002\n//\n// \u5951\u7EA6\uFF08\u5B9E\u4F8B\u65E0\u5173\u7684\u6A21\u5757\u7EA7\u53E3\u5B50\uFF0C\u4E0D\u6302 Store \u5B9E\u4F8B\uFF09\uFF1A\n//   - \u4F5C\u7528\u57DF = `${appId}.` \u524D\u7F00\u7684 IndexedDB \u5E93\uFF08`${appId}.${databaseId}` \u5168\u90E8\u5B9E\u4F8B\uFF09+ \u540C\u524D\u7F00 localStorage \u952E\u3002\n//     app \u81EA\u5DF1\u7684\u5E93\uFF08\u5982 GUID \u524D\u7F00 `weebpaint-bd6cece69075d759.*`\u2014\u2014\u6CE8\u610F \"-\" \u2260 \".\"\uFF0C\u5929\u7136\u4E0D\u5728\u672C\u524D\u7F00\u5185\uFF09\n//     \u7531 app \u81EA\u626B\u81EA\u5220\uFF0C\u4E0D\u8FDB\u672C\u53E3\u5B50\uFF08\u8BAE\u9898 2 \u62CD\u677F\uFF09\u3002\n//   - \u8C03\u7528\u65B9\u5951\u7EA6\uFF1Awipe \u524D\u5148 dispose \u5168\u90E8\u6D3B store \u5B9E\u4F8B\uFF08deleteDatabase \u4F1A\u88AB\u5F00\u7740\u7684\u8FDE\u63A5\u5835\u4F4F\uFF09\u3002\n//     \u591A tab \u5E76\u53D1\uFF1A\u522B\u7684 tab \u6525\u7740\u8FDE\u63A5 \u2192 \u8BE5\u5E93\u8FDB blocked \u62A5\u544A\uFF08**\u4E0D\u50BB\u7B49**\uFF0CBLOCKED_TIMEOUT \u540E\u653E\u5F03\uFF09\uFF0C\n//     UI \u63D0\u793A\u300C\u5173\u6389\u5176\u4ED6\u6807\u7B7E\u9875\u91CD\u8BD5\u300D\u3002\u7EDD\u4E0D\u9759\u9ED8\u541E\u3002\n//   - \u65E0\u75D5\u626B\u7EA2\u7EBF\u53E3\u5F84\uFF08\u8BAE\u9898 2 \u62CD\u677F\uFF09\uFF1A\u53EA\u8FD4**\u547D\u540D\u7A7A\u95F4\u7EA7\u5E93\u540D + localStorage \u952E\u8BA1\u6570**\u2014\u2014\n//     localStorage \u952E\u540D\u53EF\u80FD\u5185\u5D4C\u6587\u4EF6\u540D\uFF08files.etag:<name> \u7B49\uFF09\uFF0C**\u6C38\u4E0D\u8FD4\u952E\u540D/\u6587\u4EF6\u540D**\n//     \uFF08\u4E0E usage/dirty\u300C\u6C38\u4E0D\u8FD4\u540D\u5B57\u300D\u7EA2\u7EBF\u540C\u6E90\uFF09\u3002\u5F52\u96F6\u9A8C\u8BC1\u8981\u7684\u662F\u8BA1\u6570\uFF0C\u4E0D\u662F\u540D\u5355\u3002\n//   - typed consent\uFF08\u5E93\u5185\u6BD4\u5BF9\uFF09\uFF1Awipe \u5FC5\u987B\u643A\u5E26 { expected, typed }\u2014\u2014expected = app \u5C55\u793A\u7ED9\u7528\u6237\u7684\n//     \u786E\u8BA4\u8BCD\uFF08i18n \u5F52 app\uFF09\uFF0Ctyped = \u7528\u6237\u9010\u5B57\u6572\u8FDB\u6765\u7684\u3002\u4E0D\u7B49 / \u7A7A / \u8FC7\u77ED \u2192 throw WipeConsentError\uFF0C\n//     \u5E93\u62D2\u7EDD\u6267\u884C\u3002API \u5F62\u72B6\u4F7F\u300C\u8DF3\u8FC7 consent\u300D\u5728 app \u4EE3\u7801\u91CC\u6210\u4E3A\u663E\u5F0F\u7684\u8C0E\uFF08grep \u53EF\u67E5\uFF09\uFF0C\u540C storeUI \u5F3A\u5236\u6CE8\u5165\u903B\u8F91\u3002\nexport class WipeConsentError extends Error {\n    code = \"WIPE_CONSENT\";\n    constructor(msg) { super(msg); this.name = \"WipeConsentError\"; }\n}\nconst BLOCKED_TIMEOUT_MS = 2000; // deleteDatabase \u88AB\u5835\u7684\u653E\u5F03\u7EBF\uFF1A\u62A5 blocked \u800C\u4E0D\u662F\u540A\u6B7B\u6DF1\u6E05\u6D41\u7A0B\nconst _idb = () => globalThis.indexedDB ?? null;\nconst _ls = () => { try {\n    return globalThis.localStorage ?? null;\n}\ncatch {\n    return null;\n} };\nasync function listNamespaceDbs(appId, idb) {\n    if (typeof idb.databases !== \"function\")\n        return { supported: false, names: [] };\n    try {\n        const all = await idb.databases();\n        return { supported: true, names: all.map((d) => d.name ?? \"\").filter((n) => n.startsWith(`${appId}.`)) };\n    }\n    catch {\n        return { supported: false, names: [] };\n    }\n}\nfunction listNamespaceLsKeys(appId, ls) {\n    const prefix = `${appId}.`;\n    const keys = [];\n    for (let i = 0; i < ls.length; i++) {\n        const k = ls.key(i);\n        if (k && k.startsWith(prefix))\n            keys.push(k);\n    }\n    return keys; // \u5185\u90E8\u7528\uFF1B\u5BF9\u5916\u6C38\u8FDC\u53EA\u62A5 length\n}\nfunction deleteDbOrBlocked(idb, name) {\n    return new Promise((resolve) => {\n        let settled = false;\n        const done = (r) => { if (!settled) {\n            settled = true;\n            resolve(r);\n        } };\n        const timer = setTimeout(() => done(\"blocked\"), BLOCKED_TIMEOUT_MS);\n        const req = idb.deleteDatabase(name);\n        req.onsuccess = () => { clearTimeout(timer); done(\"deleted\"); };\n        // deleteDatabase \u8BED\u4E49\uFF1Aerror \u6781\u7F55\u89C1\uFF08\u5B89\u5168\u6A21\u5F0F\u7B49\uFF09\u2014\u2014\u6309 blocked \u62A5\uFF08\u8BDA\u5B9E\uFF1A\u6CA1\u5220\u6389\uFF09\uFF0C\u4E0D\u541E\u4E0D\u8C0E\u62A5\u6210\u529F\n        req.onerror = () => { clearTimeout(timer); done(\"blocked\"); };\n        req.onblocked = () => { };\n    });\n}\n/** \u65E0\u75D5\u626B\uFF1A\u679A\u4E3E\u672C appId \u547D\u540D\u7A7A\u95F4\u6B8B\u7559\uFF08\u8FD8\u539F\u51FA\u5382\u540E\u9A8C\u8BC1\u5F52\u96F6\u7528\uFF09\u3002\u53EA\u8BFB\uFF0C\u96F6\u526F\u4F5C\u7528\u3002 */\nexport async function scanAppNamespace(appId) {\n    if (!appId)\n        throw new Error(\"scanAppNamespace: appId required\");\n    const idb = _idb();\n    const ls = _ls();\n    const dbs = idb ? await listNamespaceDbs(appId, idb) : { supported: false, names: [] };\n    return {\n        databasesSupported: dbs.supported,\n        databases: dbs.names,\n        localStorageKeys: ls ? listNamespaceLsKeys(appId, ls).length : 0,\n    };\n}\n/** \u6DF1\u6E05\uFF1A\u5220\u9664\u672C appId \u5168\u90E8\u547D\u540D\u7A7A\u95F4\uFF08\u6240\u6709 databaseId \u5B9E\u4F8B\u7684 IDB \u5E93 + localStorage \u952E\uFF09\u3002\n *  \u524D\u7F6E\uFF1A\u5168\u90E8\u6D3B store \u5B9E\u4F8B\u5DF2 dispose\uFF08\u5426\u5219\u5BF9\u5E94\u5E93\u8FDB blocked \u62A5\u544A\uFF09\u3002consent \u5E93\u5185\u6BD4\u5BF9\uFF0C\u4E0D\u8FC7\u4E0D\u6267\u884C\u3002 */\nexport async function wipeAppNamespace(opts) {\n    const { appId, consent } = opts;\n    if (!appId)\n        throw new Error(\"wipeAppNamespace: appId required\");\n    const expected = consent?.expected?.trim() ?? \"\";\n    if (expected.length < 4)\n        throw new WipeConsentError(\"wipe refused: consent.expected missing or too short (app must show the user a real confirmation phrase)\");\n    if (consent.typed !== consent.expected)\n        throw new WipeConsentError(\"wipe refused: typed consent does not match the expected phrase\");\n    const report = { deletedDatabases: [], blockedDatabases: [], localStorageKeysRemoved: 0 };\n    const idb = _idb();\n    if (idb) {\n        const dbs = await listNamespaceDbs(appId, idb);\n        // databases() \u4E0D\u53EF\u7528\u7684\u5E73\u53F0\uFF08\u8001 Firefox\uFF09\uFF1A\u679A\u4E3E\u4E0D\u4E86\u5C31\u5220\u4E0D\u5168\u2014\u2014\u8BDA\u5B9E\u7F3A\u53E3\uFF0C\u7531 scan \u7684 databasesSupported=false\n        //   \u544A\u77E5 app\uFF08UI \u5C42\u81EA\u5DF1\u51B3\u5B9A\u63D0\u793A\uFF09\u3002\u7EDD\u4E0D\u5047\u88C5\u5220\u5E72\u51C0\u3002\n        for (const name of dbs.names) {\n            const r = await deleteDbOrBlocked(idb, name);\n            (r === \"deleted\" ? report.deletedDatabases : report.blockedDatabases).push(name);\n        }\n    }\n    const ls = _ls();\n    if (ls) {\n        const keys = listNamespaceLsKeys(appId, ls);\n        for (const k of keys)\n            ls.removeItem(k);\n        report.localStorageKeysRemoved = keys.length;\n    }\n    return report;\n}\n", "// byte-range \u8BF7\u6C42\u7684\u4E24\u4EF6\u5C0F\u5DE5\u5177\uFF082.0.0\uFF0C2026-10-17 Claude Fable 5.1\uFF09\uFF1Agraph.ts \u548C mirror.ts \u5171\u7528\uFF0C\u4E0D import \u4E0A\u5C42\u3002\n//   readBody\uFF1A\u6309\u6D41\u8BFB\u54CD\u5E94\u4F53\u3001\u6BCF\u5230\u4E00\u6BB5\u62A5\u4E00\u6B21\u7D2F\u8BA1\u5B57\u8282\uFF08\u5361\u4F4F\u5224\u5B9A\u9760\u5B83\uFF09\uFF1B\u6CA1\u7ED9 onProgress / \u73AF\u5883\u6CA1\u6709\u6D41 \u2192 \u4E00\u53E3 arrayBuffer()\u3002\n//   anySignal\uFF1A\u628A\u300C\u4F20\u8F93\u5C42\u8D85\u65F6\u300D\u548C\u300C\u8C03\u5EA6\u5C42\u4E2D\u6B62\u300D\u4E24\u4E2A\u4FE1\u53F7\u5408\u6210\u4E00\u4E2A\uFF08AbortSignal.any \u8001\u6D4F\u89C8\u5668\u6CA1\u6709\uFF0C\u624B\u62FC\uFF09\u3002\nexport async function readBody(r, onProgress) {\n    const body = r.body;\n    if (!onProgress || !body || typeof body.getReader !== \"function\")\n        return await r.arrayBuffer();\n    const reader = body.getReader();\n    const parts = [];\n    let total = 0;\n    for (;;) {\n        const { done, value } = await reader.read();\n        if (done)\n            break;\n        if (value && value.byteLength) {\n            parts.push(value);\n            total += value.byteLength;\n            onProgress(total);\n        }\n    }\n    const out = new Uint8Array(total);\n    let at = 0;\n    for (const p of parts) {\n        out.set(p, at);\n        at += p.byteLength;\n    }\n    return out.buffer;\n}\nexport function anySignal(signals) {\n    const live = signals.filter((s) => !!s);\n    if (live.length === 0)\n        return undefined;\n    if (live.length === 1)\n        return live[0];\n    if (typeof AbortController !== \"function\")\n        return live[0];\n    const ctrl = new AbortController();\n    for (const s of live) {\n        if (s.aborted) {\n            ctrl.abort(s.reason);\n            break;\n        }\n        s.addEventListener(\"abort\", () => ctrl.abort(s.reason), { once: true });\n    }\n    return ctrl.signal;\n}\n", "// Microsoft Graph wrapper \u2014 \u6240\u6709\u8DEF\u5F84\u951A\u5728 /me/drive/special/approot \u6C99\u76D2\u3002\n// AppFolder \u6C99\u76D2 = `Apps/<\u5E94\u7528\u6CE8\u518C\u540D>/`\uFF08\u6587\u4EF6\u5939\u540D\u7531 Azure \u5E94\u7528\u6CE8\u518C\u51B3\u5B9A\uFF09\uFF0C\u5373\u4F7F token \u6CC4\u6F0F\u4E5F\u53EA\u80FD\u78B0\u672C app \u7684\u76EE\u5F55\u3002\n//\n// \u672C\u5E93\u7528\u5F97\u7740\u7684 Graph \u5B50\u96C6\uFF1A\n//   - listChildren()            \u5217 approot \u4E0B\u6587\u4EF6\n//   - getItemByPath(path)       \u62FF metadata\uFF08\u542B eTag\uFF09\n//   - downloadItemBlob(id)      \u53D6\u4E8C\u8FDB\u5236\uFF08atlas zip\uFF09\n//   - uploadFileToApproot()     PUT zip blob\uFF0C\u652F\u6301 If-Match \u9632\u51B2\u7A81\n//   - deleteItem(id)            \u6E05\u7406\n//\n// \u5173\u952E\u9677\u9631\uFF1A\n//   - body \u5FC5\u987B\u63A5\u53D7 TypedArray \u2014\u2014 \u6CA1\u6709 ArrayBuffer.isView \u68C0\u67E5\u4F1A\u628A Uint8Array\n//     JSON.stringify \u6210 10\u00D7 \u81A8\u80C0\u3002webxiaoheiwu \u8E29\u8FC7\u5751\u3002\n//   - @microsoft.graph.conflictBehavior \u5728 URL \u67E5\u8BE2\u4E32\uFF0C\u4E0D\u662F header\uFF08@ \u5728 header \u975E\u6CD5\uFF09\u3002\n//   - \u5927\u4E8E 4MB \u8D70 createUploadSession \u5206\u5757\u4E0A\u4F20\u3002atlas zip \u5927\u6982\u7387\u8D85 4MB\u3002\n// \u2500\u2500 token-source \u63A5\u7F1D\uFF082026-08-20 \u6536\u655B\uFF1B**2026-08-28 \u5B9E\u4F8B\u5316**\uFF1Aper-account pin \u6253\u626B\u8F6E\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//   graph \u5C42\u4E0D\u7ED1 MSAL\uFF1A\u9875\u9762 = createOneDriveProvider \u6CE8\u5165 auth.getToken/getTokenFor\uFF1BSW = \u51ED\u636E\u6865\u8BFB\u7AEF\u3002\n//   \u65E7\u5F62 = \u6A21\u5757\u7EA7 configureGraphTokenSource \u5355\u4F8B + \u6A21\u5757\u7EA7 approot/subfolder/downloadUrl \u7F13\u5B58\u2014\u2014\n//   \u7B2C\u4E8C\u4E2A provider \u4F1A\u8986\u76D6\u7B2C\u4E00\u4E2A\u7684 token \u6E90\uFF0C\u4E14**\u8DE8\u8D26\u53F7\u7F13\u5B58\u4E92\u76F8\u6295\u6BD2**\uFF08A \u8D26\u53F7\u7684 approot id \u914D B \u8D26\u53F7\n//   token = \u6253\u9519\u76D8\uFF09\u3002createGraph(tokenSource) \u8D77\uFF0Ctoken \u6E90\u4E0E\u5168\u90E8\u7F13\u5B58 per-instance\uFF0C\u53CC\u5E93\u53CC\u8D26\u53F7\u5E76\u8054\u5B89\u5168\u3002\nimport { CloudNetworkError } from \"../errors.js\";\nimport { anySignal, readBody } from \"./range-body.js\";\n/** \u63A8\u8350\u503C\uFF08KudsRocket \u5728\u7528\uFF09\uFF1A\u6D88\u8D39\u65B9\u663E\u5F0F\u4F20\u7ED9 createOneDriveProvider({ transport: { timeouts } }) \u624D\u751F\u6548\u3002 */\nexport const DEFAULT_GRAPH_TIMEOUTS = { meta: 30_000, chunk: 120_000, range: 60_000, blob: 15 * 60_000 };\nlet graphTimeouts = null;\nlet graphChunkResume = false;\nlet graphVerifyCommit = false;\nlet graphSleep = (ms) => new Promise((r) => setTimeout(r, ms));\nconst timed = (kind) => {\n    if (!graphTimeouts)\n        return undefined;\n    const ms = graphTimeouts[kind];\n    return typeof AbortSignal !== \"undefined\" && typeof AbortSignal.timeout === \"function\" ? AbortSignal.timeout(ms) : undefined;\n};\n// \u5206\u5757\u4E0A\u4F20\uFF1A\u5355\u5757\u5931\u8D25\u4E0D\u4ECE\u96F6\u91CD\u4F20\u2014\u2014\u95EE\u4F1A\u8BDD\u4F20\u5230\u54EA\u4E86\u3001\u9000\u907F\u3001\u63A5\u7740\u4F20\uFF080.17.1\uFF09\u3002\nconst CHUNK_RETRY_MAX = 5;\nconst chunkBackoffMs = (attempt) => Math.min(1000 * 2 ** (attempt - 1), 16_000); // 1 / 2 / 4 / 8 / 16 s\nconst GRAPH_BASE = \"https://graph.microsoft.com/v1.0\";\nconst SIMPLE_UPLOAD_LIMIT = 4 * 1024 * 1024;\nfunction encodeSeg(name) {\n    return encodeURIComponent(name).replace(/'/g, \"%27\");\n}\nexport function encodeApprootPath(path) {\n    return path.split(\"/\").filter(Boolean).map(encodeSeg).join(\"/\");\n}\nfunction _rangeHeader(offset, length) {\n    return (offset == null)\n        ? `bytes=-${length}`\n        : `bytes=${offset}-${offset + length - 1}`;\n}\n// \u76F4\u63A5\u6253\u5DF2\u77E5 CDN URL \u7684 byte-range\uFF08\u7701\u6389\u6BCF\u4E2A peek \u7684 metadata RTT\uFF09\n// caller \u5904\u7406 401/403 = downloadUrl \u8FC7\u671F\uFF0C\u91CD\u7533\u8BF7 getDownloadUrl \u91CD\u8BD5\u4E00\u6B21\nexport async function downloadRangeFromUrl(downloadUrl, offset, length, opts = {}) {\n    let r;\n    try {\n        r = await fetch(downloadUrl, { headers: { Range: _rangeHeader(offset, length) }, signal: anySignal([timed(\"range\"), opts.signal]) });\n    }\n    catch (e) {\n        throw new CloudNetworkError(`range download: network fetch failed (${String(e)})`, e);\n    }\n    if (!r.ok && r.status !== 206) {\n        const err = new Error(`range download failed ${r.status}`);\n        err.status = r.status;\n        throw err;\n    }\n    // \u6309\u6D41\u8BFB + \u62A5\u8FDB\u5EA6\uFF08\u53EA\u5728 caller \u8981\u8FDB\u5EA6\u65F6\uFF1B\u5426\u5219\u4E00\u53E3 arrayBuffer\uFF0C= 0.18\uFF09\u3002\u8BFB\u4F53\u4E2D\u9014\u65AD / \u88AB\u4E2D\u6B62 \u2192 \u7F51\u7EDC\u9519\uFF08\u548C fetch \u81EA\u8EAB throw \u540C\u4E00\u7C7B\uFF09\u3002\n    try {\n        return await readBody(r, opts.onProgress);\n    }\n    catch (e) {\n        throw new CloudNetworkError(`range download: body failed (${String(e)})`, e);\n    }\n}\n/** Graph \u5B9E\u4F8B\uFF08per-provider\uFF1Atoken \u6E90 + \u5168\u90E8\u7F13\u5B58\u5B9E\u4F8B\u79C1\u6709\uFF09\u3002\u8FD4\u56DE\u9762 = GraphTransport \u8D85\u96C6\u3002 */\nexport function createGraph(tokenSource, opts = {}) {\n    // \u6A21\u5757\u7EA7\u5F00\u5173\uFF08\u6700\u540E\u4E00\u4E2A createGraph \u8BF4\u4E86\u7B97\uFF1B\u540C\u9875\u591A provider \u5171\u7528\u4E00\u5957\u4F20\u8F93\u653F\u7B56\uFF09\uFF1A\u4E0D\u4F20 = 0.17.0 \u884C\u4E3A\n    graphTimeouts = opts.timeouts ? { ...DEFAULT_GRAPH_TIMEOUTS, ...opts.timeouts } : null;\n    graphChunkResume = !!opts.chunkResume;\n    graphVerifyCommit = !!opts.verifyChunkedCommit;\n    if (opts.sleep)\n        graphSleep = opts.sleep;\n    const getToken = () => {\n        if (!tokenSource)\n            throw new Error(\"graph token source missing (page: createOneDriveProvider; SW: createGraph(createBridgeTokenSource(dbName)))\");\n        return tokenSource();\n    };\n    async function graphFetch(method, pathOrUrl, { headers = {}, body = null } = {}) {\n        const token = await getToken();\n        const url = pathOrUrl.startsWith(\"http\") ? pathOrUrl : `${GRAPH_BASE}${pathOrUrl}`;\n        const init = { method, headers: { Authorization: `Bearer ${token}`, ...headers }, signal: timed(\"meta\") };\n        if (body != null) {\n            if (typeof body === \"string\" ||\n                body instanceof ArrayBuffer ||\n                ArrayBuffer.isView(body) ||\n                body instanceof Blob) {\n                init.body = body;\n            }\n            else {\n                init.body = JSON.stringify(body);\n                if (!init.headers[\"Content-Type\"])\n                    init.headers[\"Content-Type\"] = \"application/json\";\n            }\n        }\n        // \u7F51\u7EDC\u5C42 throw\uFF08\u65AD\u7F51/DNS/iOS \u7F51\u7EDC\u5207\u6362\uFF0CSafari \u62A5\u88F8 `TypeError: Load failed`\uFF09\u2192 \u7FFB\u6210\u7C7B\u578B\u5316\n        //   CloudNetworkError\uFF08status \u6052 undefined = \u4ECD\u53EF\u91CD\u8BD5\uFF09\u3002\u53EA\u5728 fetch \u81EA\u8EAB throw \u5904\u5305\u88C5\u2014\u2014\u8FD9\u91CC\u7684\n        //   TypeError \u5FC5\u662F\u7F51\u7EDC\u5C42\uFF1B\u4E0A\u5C42\u6CDB\u5224 instanceof TypeError \u4F1A\u628A\u81EA\u5BB6 bug \u8BEF\u88C5\u6210\u300C\u7F51\u7EDC\u95EE\u9898\u300D\uFF0C\u7981\u6B62\u3002\n        let response;\n        try {\n            response = await fetch(url, init);\n        }\n        catch (e) {\n            throw new CloudNetworkError(`Graph ${method} ${pathOrUrl}: network fetch failed (${String(e)})`, e);\n        }\n        if (!response.ok) {\n            let detail = \"\";\n            try {\n                detail = await response.text();\n            }\n            catch (_) { }\n            const err = new Error(`Graph ${method} ${pathOrUrl} \u2192 ${response.status}: ${detail}`);\n            err.status = response.status;\n            err.body = detail;\n            throw err;\n        }\n        return response;\n    }\n    // ----- listing -----\n    async function listChildren(subfolder = \"\") {\n        const pathPart = subfolder ? `:/${encodeApprootPath(subfolder)}:` : \"\";\n        const items = [];\n        // @microsoft.graph.downloadUrl\uFF1A1h \u77ED\u6548 CDN URL\uFF0C\u52A0\u8FDB $select \u8BA9 list \u4E00\u6B21\u6027\u5E26\u56DE\n        // \u2192 \u540E\u7EED byte-range \u76F4\u63A5\u6253 CDN\uFF0C\u7701\u6389\u6BCF\u4E2A peek \u7684 metadata RTT\n        // \u8FC7\u671F\u540E caller \u62FF 401/403 \u2192 \u91CD\u65B0\u8D70 getDownloadUrl \u7533\u8BF7\n        let next = `/me/drive/special/approot${pathPart}/children?$top=200&$select=id,name,size,eTag,createdDateTime,lastModifiedDateTime,file,folder,@microsoft.graph.downloadUrl`;\n        while (next) {\n            let response;\n            try {\n                response = await graphFetch(\"GET\", next);\n            }\n            catch (e) {\n                if (e.status === 404 && subfolder)\n                    return [];\n                throw e;\n            }\n            const page = await response.json();\n            items.push(...(page.value ?? []));\n            next = page[\"@odata.nextLink\"] ?? null;\n        }\n        return items;\n    }\n    // ----- \u5355 item metadata -----\n    async function getItemByPath(path) {\n        try {\n            const r = await graphFetch(\"GET\", `/me/drive/special/approot:/${encodeApprootPath(path)}?$select=id,name,size,eTag,lastModifiedDateTime,folder,@microsoft.graph.downloadUrl`);\n            return await r.json();\n        }\n        catch (e) {\n            if (e.status === 404)\n                return null;\n            throw e;\n        }\n    }\n    // ----- \u4E8C\u8FDB\u5236\u4E0B\u8F7D -----\n    async function downloadItemBlob(itemId) {\n        // \u4F18\u5148 @microsoft.graph.downloadUrl\uFF08\u77ED\u671F\u7B7E\u540D CDN\uFF09\uFF1B\u6CA1\u6709\u5C31\u8D70 /content\n        const dl = await getDownloadUrl(itemId);\n        if (dl) {\n            let r;\n            try {\n                r = await fetch(dl, { signal: timed(\"blob\") });\n            }\n            catch (e) {\n                throw new CloudNetworkError(`downloadUrl: network fetch failed (${String(e)})`, e);\n            }\n            if (!r.ok)\n                throw new Error(`downloadUrl failed ${r.status}`);\n            return await r.blob();\n        }\n        const r = await graphFetch(\"GET\", `/me/drive/items/${itemId}/content`);\n        return await r.blob();\n    }\n    // byte-range \u4E0B\u8F7D\n    //   offset = null + length \u7ED9 suffix range \"bytes=-N\"\uFF08\u53D6\u6700\u540E N \u5B57\u8282\uFF09\n    //   offset \u7ED9 prefix range \"bytes=OFFSET-OFFSET+LEN-1\"\n    //   \u8D70 downloadUrl \u62FF CDN signed URL\uFF08\u652F\u6301 Range header\uFF09\uFF0Cfallback /content\n    // downloadUrl \u5185\u5B58\u7F13\u5B58\uFF08SW \u7F51\u5173\u624B\u6413\u4EF6\u5408\u6D41\uFF0C2026-08-20\uFF09\uFF1A\u5206\u7247\u6D41\u64AD\u6BCF 2MB \u4E00\u4E2A range\uFF0C\n    // \u4E0D\u8BE5\u6BCF\u7247\u91CD\u8D70\u4E00\u6B21 getDownloadUrl \u5F80\u8FD4\uFF1B\u8FC7\u671F/\u5931\u6548\uFF08401/403/404 \u6216 fetch throw\u2014\u2014iOS \u5207\u7F51\u540E\u9057\u75C7\n    // \u4F1A\u4EE5 throw \u73B0\u5F62\uFF09\u2192 \u6E05\u7F13\u5B58\u91CD\u7533\u8BF7\u4E00\u6B21\u3002\n    const _dlUrlCache = new Map();\n    async function downloadItemRange(itemId, offset, length, opts = {}) {\n        let url = _dlUrlCache.get(itemId) ?? await getDownloadUrl(itemId);\n        if (url) {\n            _dlUrlCache.set(itemId, url);\n            try {\n                return await downloadRangeFromUrl(url, offset, length, opts);\n            }\n            catch (e) {\n                if (opts.signal?.aborted)\n                    throw e; // 2.0.0\uFF1A\u662F\u8C03\u5EA6\u5C42\u4E2D\u6B62\u7684\uFF08\u5BF9\u51B2\u8F93\u4E86 / \u5361\u4F4F\u8BA9\u9053\uFF09\u2192 \u4E0D\u91CD\u7533\u8BF7\u3001\u4E0D\u91CD\u8BD5\n                _dlUrlCache.delete(itemId);\n                url = await getDownloadUrl(itemId);\n                if (url) {\n                    _dlUrlCache.set(itemId, url);\n                    return await downloadRangeFromUrl(url, offset, length, opts);\n                }\n            }\n        }\n        const r = await graphFetch(\"GET\", `/me/drive/items/${itemId}/content`, { headers: { Range: _rangeHeader(offset, length) } });\n        return await r.arrayBuffer();\n    }\n    // \u62FF\u4E00\u4E2A\u65B0\u7684 1h \u77ED\u6548 downloadUrl\uFF08\u8FC7\u671F\u91CD\u7533\u8BF7\u7528\uFF09\n    // \u26A0 \u88F8 GET \u4E0D\u5E26 $select\uFF082026-08-16 spike-7 \u6218\u4F8B\uFF09\uFF1AdownloadUrl \u662F instance annotation\uFF0C\n    //   `$select=id,@microsoft.graph.downloadUrl` \u4F1A\u8FD4\u56DE 200 \u5374**\u4E22\u6389\u8BE5\u5B57\u6BB5**\u3002\u6B64\u524D listChildren \u6279\u91CF\u5E26\u56DE\n    //   downloadUrl \u628A\u8FD9\u6761 refresh \u8DEF\u5F84\u906E\u7740\u6CA1\u70B8\uFF1BSW \u7F51\u5173\u624B\u6413\u7248\u5148\u8E29\u96F7\uFF0C\u540C\u4FEE\u56DE\u5E93\uFF08\u53CC\u5B9E\u73B0 drift \u7684\u73B0\u4E16\u62A5\uFF09\u3002\n    async function getDownloadUrl(itemId) {\n        const r = await graphFetch(\"GET\", `/me/drive/items/${itemId}`);\n        const j = await r.json();\n        return j[\"@microsoft.graph.downloadUrl\"] || null;\n    }\n    // ----- \u4E0A\u4F20 -----\n    // path \u76F8\u5BF9 approot\u3002eTag \u7ED9 If-Match\uFF08\u62FF\u51B2\u7A81\u68C0\u6D4B\uFF09\u3002conflictBehavior:\n    async function uploadFileToApproot(path, blob, contentType = \"application/octet-stream\", { conflictBehavior = \"replace\", eTag = null, onProgress, session } = {}) {\n        // \u3010\u8FD0\u884C\u65F6\u62A4\u680F\uFF0Cuser 2026-08-25 \u62CD\u677F\u300C\u5168\u5E93\u4EE5\u540E\u53EA\u80FD\u7528 If-Match\u300D\u3011\u76F2\u8986\u76D6\u5728\u6700\u6DF1\u5904\u4E0D\u53EF\u8868\u793A\uFF1A\n        //   replace \u5FC5\u987B\u5E26 If-Match eTag\uFF08CAS \u8986\u76D6\uFF09\uFF1B\u65B0\u5EFA\u8D70 conflictBehavior:\"fail\"\uFF08\u4E0D\u5B58\u5728\u624D\u51C6\u5EFA\uFF0CCAS \u7B49\u4EF7\u7269\uFF09\u3002\n        //   \u914D\u5957\u8BED\u6CD5\u68C0\u6D4B = test/ifmatch-guard.test.ts\uFF08\u626B\u6E90\u7801\u88F8 replace\uFF09\u3002\u6DF1\u6A21\u5757\u5F3A\u5236\uFF0CUI/\u8C03\u7528\u65B9\u5B88\u4E0D\u5B88\u90FD\u62E6\u5F97\u4F4F\u3002\n        if (conflictBehavior === \"replace\" && !eTag)\n            throw new Error(`[graph] blind overwrite forbidden: conflictBehavior:\"replace\" requires If-Match eTag (${path})`);\n        const headers = { \"Content-Type\": contentType };\n        if (eTag)\n            headers[\"If-Match\"] = eTag;\n        if (blob.size <= SIMPLE_UPLOAD_LIMIT) {\n            onProgress?.(0, blob.size);\n            const r = await graphFetch(\"PUT\", `/me/drive/special/approot:/${encodeApprootPath(path)}:/content?@microsoft.graph.conflictBehavior=${conflictBehavior}`, { headers, body: blob });\n            onProgress?.(blob.size, blob.size);\n            return r.json();\n        }\n        // \u5927\u6587\u4EF6\u5206\u5757\uFF1ABlob \u5F53\u300C\u6309 slice \u53D6\u5757\u300D\u7684\u6765\u6E90\uFF08\u5206\u5757\u8DEF\u5F84\u548C\u6D41\u5F0F\u4E0A\u4F20\u5171\u7528\u4E00\u6761\uFF09\n        return uploadChunked(path, { size: blob.size, read: async (o, n) => new Uint8Array(await blob.slice(o, o + n).arrayBuffer()) }, conflictBehavior, eTag, onProgress, session);\n    }\n    /** 0.17.0\uFF1A\u6D41\u5F0F\u4E0A\u4F20\u2014\u2014\u6C38\u8FDC\u8D70\u4E0A\u4F20\u4F1A\u8BDD\uFF08\u54EA\u6015\u5F88\u5C0F\uFF09\uFF0C\u6309 source.read \u9010\u5757\u53D6\u3001\u9010\u5757\u4F20\uFF1B\u6574\u4EFD\u6C38\u4E0D\u8FDB\u5185\u5B58\u3002\u62A4\u680F\u540C uploadFileToApproot\u3002 */\n    async function uploadStreamToApproot(path, source, _contentType = \"application/octet-stream\", { conflictBehavior = \"fail\", eTag = null, onProgress } = {}) {\n        if (conflictBehavior === \"replace\" && !eTag)\n            throw new Error(`[graph] blind overwrite forbidden: conflictBehavior:\"replace\" requires If-Match eTag (${path})`);\n        return uploadChunked(path, source, conflictBehavior, eTag, onProgress);\n    }\n    // \u4E0A\u4F20\u4F1A\u8BDD + \u5206\u5757 PUT\uFF08Graph\uFF1A\u6BCF\u5757\u662F 320 KiB \u7684\u500D\u6570\u3001\u2264 60 MiB\uFF1B\u6700\u540E\u4E00\u5757\u843D\u5730\u624D\u6210\u6587\u4EF6\uFF0C\u4E2D\u9014\u65AD\u4E86\u4E91\u7AEF\u6CA1\u6709\u534A\u6210\u54C1\uFF09\u3002\n    // 0.17.1\uFF082026-10-15 Claude Fable 5.1\uFF09\uFF1A\n    //   \u00B7 \u6BCF\u5757 PUT \u5E26\u8D85\u65F6\uFF1B\u7F51\u7EDC\u9519 / 429 / 5xx / 416 \u2192 GET uploadUrl \u95EE\u300C\u4F20\u5230\u54EA\u4E86\u300D\uFF08nextExpectedRanges\uFF09\uFF0C\u9000\u907F 1/2/4/8/16 s\uFF0C\u4ECE\u90A3\u91CC\u63A5\u7740\u4F20\u2014\u2014\n    //     \u4E00\u6B21\u7F51\u7EDC\u6296\u52A8\u4E0D\u518D\u6574\u4EFD\u91CD\u4F20\uFF08KudsRocket iPad 10-14\uFF1A6.8 MB \u5FEB\u7167\u7B2C\u4E8C\u5757 Load failed \u5C31\u4ECE\u5934\u6765\uFF09\u3002\u4F1A\u8BDD\u6CA1\u4E86\uFF08404\uFF09\u2192 \u629B\u7F51\u7EDC\u9519\uFF0C\u4E0A\u5C42\u6574\u4EFD\u91CD\u8BD5\u3002\n    //   \u00B7 If-Match \u53EA\u5728 createUploadSession \u65F6\u6838\uFF1B\u6700\u540E\u4E00\u5757\u843D\u5730\u662F\u65E0\u6761\u4EF6\u7684 \u2192 \u4E24\u53F0\u8BBE\u5907\u540C\u65F6\u8986\u76D6\u540C\u4E00\u683C\u65F6\u6709\u4E00\u4E2A\u300C\u4E0A\u4F20\u90A3\u51E0\u5341\u79D2\u300D\u7684\u7A97\u53E3\u3002\n    //     \u73B0\u5728\u63D0\u4EA4\u6700\u540E\u4E00\u5757\u524D\u518D GET \u4E00\u6B21 item \u6BD4 eTag\uFF1A\u52A8\u4E86\u5C31\u64A4\u4F1A\u8BDD\u3001\u629B 412\uFF08\u4E0A\u5C42\u7FFB\u6210\u51B2\u7A81\u9762\uFF09\u3002\u7A97\u53E3\u7F29\u5230\u6700\u540E\u4E00\u5757\u90A3\u51E0\u79D2\u3002\n    // F-54\uFF082026-10-21 Claude Fable 5.1\uFF0Cuser\u300Cweebpaint \u9700\u8981\u7684\u540E\u53F0\u4F20\u5927\u6587\u4EF6\u4F18\u5148\u300D\uFF09\uFF1A\u4E0A\u4F20\u4F1A\u8BDD\u843D\u76D8\u3002\n    //   session\uFF08\u53EF\u9009\uFF0Cstore \u6309\u6587\u4EF6\u7ED1\u597D\u9012\u8FDB\u6765\uFF09\u8BB0\u7740\u300C\u8FD9\u4EFD\u5B57\u8282\uFF08token\uFF09\u7684\u4F1A\u8BDD URL\u300D\uFF1A\u5F00\u4F1A\u8BDD\u65F6 save\uFF1B\u4E0B\u6B21\u63A8\u540C\u4E00\u4EFD\u5B57\u8282\u5148 GET \u4F1A\u8BDD\u95EE\n    //   nextExpectedRanges\u3001\u4ECE\u90A3\u91CC\u63A5\u7740\u4F20\uFF08\u5237\u65B0 / iOS \u6740\u9875 / \u5173\u673A\u90FD\u4E0D\u4ECE\u96F6\uFF09\uFF1B\u5B8C\u6210 / 412 / \u4E0D\u53EF\u91CD\u8BD5\u9519 \u2192 clear\uFF1B\u4F1A\u8BDD\u6CA1\u4E86\uFF08404 / \u8FC7\u671F\uFF09\u2192 clear + \u91CD\u5F00\u3002\n    //   \u7EED\u4E0A\u7684\u4F1A\u8BDD**\u4E00\u5F8B**\u63D0\u4EA4\u524D\u6838 eTag\uFF08\u4E0D\u770B verifyChunkedCommit \u5F00\u5173\uFF09\uFF1A\u4E2D\u95F4\u9694\u4E86\u591A\u4E45\u4E0D\u77E5\u9053\uFF0C\u4E91\u7AEF\u53EF\u80FD\u88AB\u522B\u7684\u8BBE\u5907\u52A8\u8FC7\u3002\n    async function uploadChunked(path, source, conflictBehavior, eTag, onProgress, session) {\n        const CHUNK = 5 * 1024 * 1024;\n        const total = source.size;\n        let offset = 0;\n        let last = null;\n        let uploadUrl = null;\n        let resumed = false;\n        if (session) {\n            const rec = await session.load().catch(() => null);\n            if (rec && rec.token === session.token && rec.total === total && rec.eTag === eTag && (rec.expiresAt == null || rec.expiresAt > Date.now())) {\n                try {\n                    const st = await fetch(rec.uploadUrl, { signal: timed(\"meta\") });\n                    const j = st.ok ? await st.json().catch(() => null) : null;\n                    const next = j?.nextExpectedRanges?.[0]?.split(\"-\")[0];\n                    const at = next != null ? Number(next) : NaN;\n                    if (st.ok && Number.isFinite(at) && at >= 0 && at <= total) {\n                        uploadUrl = rec.uploadUrl;\n                        offset = at;\n                        resumed = true;\n                    }\n                }\n                catch (_) { /* \u95EE\u4E0D\u5230\uFF1A\u5F53\u6CA1\u4F1A\u8BDD\uFF0C\u4E0B\u9762\u91CD\u5F00 */ }\n            }\n            if (!uploadUrl && rec)\n                await session.clear().catch(() => { });\n        }\n        if (!uploadUrl) {\n            const sessR = await graphFetch(\"POST\", `/me/drive/special/approot:/${encodeApprootPath(path)}:/createUploadSession`, {\n                body: {\n                    item: {\n                        \"@microsoft.graph.conflictBehavior\": conflictBehavior,\n                        name: path.split(\"/\").pop(),\n                    },\n                },\n                headers: eTag ? { \"If-Match\": eTag } : undefined,\n            });\n            const sess = await sessR.json();\n            uploadUrl = sess.uploadUrl;\n            if (session) {\n                const exp = sess.expirationDateTime ? Date.parse(sess.expirationDateTime) : NaN;\n                await session.save({ uploadUrl, total, eTag, token: session.token, createdAt: Date.now(), expiresAt: Number.isFinite(exp) ? exp : null }).catch(() => { });\n            }\n        }\n        const sessionUrl = uploadUrl;\n        const forget = () => (session ? session.clear().catch(() => { }) : Promise.resolve());\n        let failures = 0; // \u8FDE\u7EED\u5931\u8D25\u6B21\u6570\uFF08\u6210\u529F\u4E00\u5757\u5C31\u5F52\u96F6\uFF09\n        // \u95EE\u4F1A\u8BDD\u4F20\u5230\u54EA\u4E86\uFF1B\u9000\u907F\u540E\u8FD4\u56DE\u4E0B\u4E00\u5757\u8BE5\u4ECE\u54EA\u5F00\u59CB\u3002\u4F1A\u8BDD\u6CA1\u4E86 / \u95EE\u4E0D\u5230 \u2192 \u629B\uFF08\u4E0A\u5C42\u6309\u7F51\u7EDC\u9519\u6574\u4EFD\u91CD\u8BD5\uFF09\u3002\n        const resumeFrom = async (why) => {\n            failures++;\n            if (failures > CHUNK_RETRY_MAX)\n                throw new CloudNetworkError(`Graph chunked upload ${path}: gave up after ${CHUNK_RETRY_MAX} retries at ${offset}/${total} (${why})`);\n            await graphSleep(chunkBackoffMs(failures));\n            let st;\n            try {\n                st = await fetch(sessionUrl, { signal: timed(\"meta\") });\n            }\n            catch (e) {\n                throw new CloudNetworkError(`Graph upload session status: network fetch failed (${String(e)})`, e);\n            }\n            if (!st.ok)\n                throw new CloudNetworkError(`Graph upload session ${path}: gone (${st.status}) after ${why}`);\n            const j = await st.json().catch(() => null);\n            const next = j?.nextExpectedRanges?.[0]?.split(\"-\")[0];\n            const at = next != null ? Number(next) : NaN;\n            if (!Number.isFinite(at) || at < 0 || at > total)\n                throw new CloudNetworkError(`Graph upload session ${path}: no usable nextExpectedRanges after ${why}`);\n            return at;\n        };\n        const cancelSession = async () => { try {\n            await fetch(sessionUrl, { method: \"DELETE\", signal: timed(\"meta\") });\n        }\n        catch (_) { /* best effort */ } };\n        onProgress?.(offset, total);\n        while (offset < total) {\n            const end = Math.min(offset + CHUNK, total) - 1;\n            if ((graphVerifyCommit || resumed) && end === total - 1 && eTag) { // \u63D0\u4EA4\u524D\u6838 eTag\uFF08\u663E\u5F0F\u5F00\uFF1B\u7EED\u4E0A\u7684\u4F1A\u8BDD\u4E00\u5F8B\u6838\uFF1B\u89C1\u5934\u6CE8\u91CA\uFF09\uFF1B\u67E5\u4E0D\u5230\uFF08\u7F51\u7EDC\uFF09\u2192 \u629B\uFF0C\u4E0A\u5C42\u6574\u4EFD\u91CD\u8BD5\n                const cur = await getItemByPath(path);\n                if (cur && cur.eTag && cur.eTag !== eTag) {\n                    await cancelSession();\n                    await forget();\n                    const err = new Error(`chunked upload ${path}: item changed during upload (If-Match ${eTag} \u2260 ${cur.eTag})`);\n                    err.status = 412;\n                    throw err;\n                }\n            }\n            const chunk = await source.read(offset, end - offset + 1);\n            if (chunk.length !== end - offset + 1)\n                throw new Error(`[graph] chunk source short read at ${offset}: wanted ${end - offset + 1}, got ${chunk.length}`);\n            let r;\n            try {\n                r = await fetch(sessionUrl, {\n                    method: \"PUT\",\n                    headers: {\n                        \"Content-Length\": String(chunk.length),\n                        \"Content-Range\": `bytes ${offset}-${end}/${total}`,\n                    },\n                    body: chunk,\n                    signal: timed(\"chunk\"),\n                });\n            }\n            catch (e) { // \u5206\u5757 PUT \u6253\u7684\u662F uploadUrl\uFF08\u4E0D\u8D70 graphFetch\uFF09\u2192 \u7F51\u7EDC\u5C42\uFF1A\u5F00\u4E86 chunkResume \u5C31\u95EE\u4F1A\u8BDD\u63A5\u7740\u4F20\uFF0C\u5426\u5219\u540C 0.17.0 \u6574\u4EFD\u5931\u8D25\n                if (!graphChunkResume)\n                    throw new CloudNetworkError(`Graph chunked upload PUT (${offset}-${end}/${total}): network fetch failed (${String(e)})`, e);\n                offset = await resumeFrom(`network: ${String(e)}`);\n                continue;\n            }\n            if (!r.ok && r.status !== 202) {\n                if (graphChunkResume && (r.status === 429 || r.status === 416 || (r.status >= 500 && r.status <= 599))) {\n                    offset = await resumeFrom(`http ${r.status}`);\n                    continue;\n                }\n                await forget(); // 4xx\uFF08412 / 409 / 404\u2026\uFF09= \u8FD9\u6761\u4F1A\u8BDD\u5230\u5934\u4E86\uFF0C\u8BB0\u5FC6\u4E0D\u7559\n                const err = new Error(`chunked upload failed ${r.status}`);\n                err.status = r.status;\n                throw err;\n            }\n            failures = 0;\n            last = await r.json().then((j) => j).catch(() => null);\n            offset = end + 1;\n            onProgress?.(offset, total);\n        }\n        await forget(); // \u4F20\u5B8C = \u4F1A\u8BDD\u7528\u5B8C\n        return last;\n    }\n    // ----- \u5220\u9664 -----\n    // eTag\uFF08\u9009\u586B\uFF09\uFF1AIf-Match \u524D\u7F6E\u2014\u2014\u53EA\u5728\u9879\u672A\u53D8\u65F6\u5220\uFF08\u5220\u7A7A\u5939 best-effort \u6536 TOCTOU\uFF1Achild-add \u82E5 bump folder eTag \u5219 412\uFF09\u3002\n    //   \u6536\u4E0D\u4E25\uFF08Graph \u4E0D\u4FDD\u8BC1 folder eTag \u968F child \u53D8\uFF09\u4F46\u96F6\u6210\u672C\uFF1B\u6587\u4EF6\u786C\u5220\u4E0D\u4F20 = \u65E0\u6761\u4EF6\uFF08\u65E7\u884C\u4E3A\uFF09\u3002\n    async function deleteItem(itemId, eTag) {\n        await graphFetch(\"DELETE\", `/me/drive/items/${itemId}`, eTag ? { headers: { \"If-Match\": eTag } } : {});\n    }\n    // ----- approot + \u5B50\u6587\u4EF6\u5939 ensure / \u79FB\u52A8 -----\uFF08trash + folder feature \u7528\uFF09\n    let _approotIdCache = null;\n    const _subfolderIdCache = new Map();\n    function clearFolderCaches() { _approotIdCache = null; _subfolderIdCache.clear(); _dlUrlCache.clear(); }\n    async function getApprootId() {\n        if (_approotIdCache)\n            return _approotIdCache;\n        const r = await graphFetch(\"GET\", \"/me/drive/special/approot?$select=id\");\n        _approotIdCache = (await r.json()).id;\n        return _approotIdCache;\n    }\n    // \u786E\u4FDD approot \u4E0B\u6709\u6307\u5B9A\u5B50\u6587\u4EF6\u5939\uFF08name \u5355\u6BB5\u6216\u591A\u6BB5 \"a/b/c\"\uFF09\uFF0C\u8FD4 folder id\u3002\n    // \u52A0\u7F13\u5B58\uFF1A\u7B2C\u4E00\u6B21\u62C9 / \u5EFA\uFF0C\u4E4B\u540E reuse\u3002\n    async function ensureSubfolder(name) {\n        if (!name)\n            return getApprootId();\n        const cached = _subfolderIdCache.get(name);\n        if (cached !== undefined)\n            return cached;\n        // \u5148\u8BD5\u62FF\u73B0\u6709\n        try {\n            const r = await graphFetch(\"GET\", `/me/drive/special/approot:/${encodeApprootPath(name)}?$select=id,name,folder`);\n            const item = await r.json();\n            if (item.folder) {\n                _subfolderIdCache.set(name, item.id);\n                return item.id;\n            }\n            throw new Error(`${name} \u5DF2\u5B58\u5728\u4F46\u4E0D\u662F\u6587\u4EF6\u5939`);\n        }\n        catch (e) {\n            if (e.status !== 404)\n                throw e;\n        }\n        // \u4E0D\u5B58\u5728 \u2192 \u9010\u6BB5\u5EFA\u3002\u591A\u6BB5\u8DEF\u5F84\u7528 children POST \u6BCF\u6BB5\u3002\n        const segments = name.split(\"/\").filter(Boolean);\n        let parentId = await getApprootId();\n        let cumulative = \"\";\n        for (const seg of segments) {\n            cumulative = cumulative ? `${cumulative}/${seg}` : seg;\n            const cachedSeg = _subfolderIdCache.get(cumulative);\n            if (cachedSeg !== undefined) {\n                parentId = cachedSeg;\n                continue;\n            }\n            try {\n                const r = await graphFetch(\"GET\", `/me/drive/special/approot:/${encodeApprootPath(cumulative)}?$select=id,folder`);\n                const it = await r.json();\n                if (it.folder) {\n                    parentId = it.id;\n                    _subfolderIdCache.set(cumulative, parentId);\n                    continue;\n                }\n            }\n            catch (e) {\n                if (e.status !== 404)\n                    throw e;\n            }\n            const r = await graphFetch(\"POST\", `/me/drive/items/${parentId}/children`, {\n                body: {\n                    name: seg,\n                    folder: {},\n                    \"@microsoft.graph.conflictBehavior\": \"fail\",\n                },\n            });\n            const it = await r.json();\n            parentId = it.id;\n            _subfolderIdCache.set(cumulative, parentId);\n        }\n        return parentId;\n    }\n    // \u628A item \u79FB\u5230\u6307\u5B9A parent folder\u3002atomic at server side\uFF08PATCH parentReference\uFF09\n    // eTag \u7ED9 If-Match \u9632\u8986\u76D6\uFF1BnewName \u4E0D\u4F20\u4FDD\u6301\u539F name\n    // conflictBehavior: \"fail\" | \"replace\" | \"rename\" \u2014\u2014 \u9ED8\u8BA4 \"fail\"\uFF08\u9632\u8BEF\u8986\u76D6\u76EE\u6807\u4F4D\u7F6E\u540C\u540D\uFF09\n    async function moveItemToFolder(itemId, targetFolderId, { eTag = null, newName = null, conflictBehavior = \"fail\" } = {}) {\n        const headers = {};\n        if (eTag)\n            headers[\"If-Match\"] = eTag;\n        const body = {\n            parentReference: { id: targetFolderId },\n            \"@microsoft.graph.conflictBehavior\": conflictBehavior,\n        };\n        if (newName)\n            body.name = newName;\n        const r = await graphFetch(\"PATCH\", `/me/drive/items/${itemId}`, { headers, body });\n        return r.json();\n    }\n    // \u6539\u540D only\uFF08\u4E0D\u79FB\u52A8\uFF09\n    // \u670D\u52A1\u7AEF\u590D\u5236\uFF08O3 copy-then-replace \u539F\u8BED\uFF0C2026-08-25\uFF09\uFF1A\u6E90\u539F\u4F4D\u4E0D\u52A8\uFF0C\u590D\u5236\u4E00\u4EFD\u5230\u76EE\u6807\u6587\u4EF6\u5939\u3002\n    //   Graph copy \u662F**\u5F02\u6B65\u4EFB\u52A1**\uFF1APOST \u8FD4 202 + Location \u76D1\u63A7 URL\uFF0C\u8F6E\u8BE2\u5230 completed \u518D\u6309 resourceId \u53D6\u56DE item\u3002\n    //   \u76D1\u63A7 URL \u662F\u9884\u6388\u6743\u7684\uFF08\u5E26 Authorization \u53CD\u800C\u53EF\u80FD 401\uFF09\u2192 \u88F8 fetch\uFF0C\u7F51\u7EDC\u5C42 throw \u540C\u6B3E\u7FFB CloudNetworkError\u3002\n    //   conflictBehavior \u663E\u5F0F\u9489 fail\uFF1A\u76EE\u6807\u540C\u540D \u2192 409\uFF08\u7EDD\u4E0D\u9759\u9ED8\u8986\u76D6 .backup \u91CC\u7684\u65E2\u6709\u5907\u4EFD\uFF09\u3002\n    async function copyItemToFolder(itemId, targetFolderId, newName) {\n        const res = await graphFetch(\"POST\", `/me/drive/items/${itemId}/copy?@microsoft.graph.conflictBehavior=fail`, { body: { parentReference: { id: targetFolderId }, name: newName } });\n        const monitor = res.headers.get(\"Location\");\n        if (!monitor) { // \u7F55\u89C1\uFF1A\u4E2A\u522B\u5B9E\u73B0\u540C\u6B65\u5B8C\u6210\u76F4\u63A5\u56DE item\n            const j = await res.json().catch(() => null);\n            if (j && j.id)\n                return j;\n            throw new Error(`Graph copy ${itemId}: 202 without Location monitor`);\n        }\n        const sleep = (ms) => new Promise((r) => setTimeout(r, ms));\n        // \u8F6E\u8BE2\u9884\u7B97 ~5min\uFF08250ms \u8D77\u6B65\u3001\u5C01\u9876 2s\uFF1B\u6162\u7F51 RTT \u81EA\u7136\u62C9\u957F\uFF0C\u65E0\u59A8\uFF09\u2014\u2014copy \u662F**\u670D\u52A1\u7AEF\u5185\u90E8\u590D\u5236**\uFF0C\n        //   \u5B57\u8282\u4E0D\u8D70\u7528\u6237\u5E26\u5BBD\uFF0C\u8F6E\u8BE2\u672C\u8EAB\u6BCF\u6B21\u51E0\u767E\u5B57\u8282\uFF1B\u9884\u7B97\u968F\u624B\u653E\u5BBD\u662F\u514D\u8D39\u7684\uFF08completed \u5373\u9000\uFF09\uFF0C\u53EA\u515C\u75C5\u6001\u60C5\u5F62\u3002\n        //   \u5927\u6587\u4EF6\u65F6\u4EE3\uFF08background upload \u89C4\u5212\uFF09\u670D\u52A1\u7AEF copy \u8017\u65F6\u968F\u4F53\u79EF\u6DA8\uFF0C30s \u4E0D\u591F\uFF082026-08-25 user review \u653E\u5BBD\uFF09\u3002\n        //   \u8D85\u65F6\u4ECD\u5B89\u5168\uFF1A\u629B\u5728 replace \u4E4B\u524D\uFF0C\u539F\u4F4D\u539F\u7248\u5B8C\u597D\u3001dirty \u4FDD\u4F4F\u53EF\u91CD\u8BD5\uFF08\u5F03\u5355 copy \u8FDF\u5230\u5B8C\u6210 = .backup \u65E0\u5BB3\u8D58\u4EFD\uFF09\u3002\n        for (let attempt = 1; attempt <= 170; attempt++) {\n            let mr;\n            try {\n                mr = await fetch(monitor, { signal: timed(\"meta\") });\n            }\n            catch (e) {\n                throw new CloudNetworkError(`Graph copy monitor: network fetch failed (${String(e)})`, e);\n            }\n            const j = await mr.json().catch(() => null);\n            if (j?.status === \"failed\")\n                throw new Error(`Graph copy ${itemId}: server reported failed`);\n            const rid = j?.resourceId ?? (j?.status === \"completed\" ? j?.id : null);\n            if (rid) {\n                const ir = await graphFetch(\"GET\", `/me/drive/items/${rid}`);\n                return await ir.json();\n            }\n            await sleep(Math.min(250 * attempt, 2000));\n        }\n        throw new Error(`Graph copy ${itemId}: monitor timeout (~5min)`);\n    }\n    async function renameItem(itemId, newName, eTag = null) {\n        const headers = {};\n        if (eTag)\n            headers[\"If-Match\"] = eTag;\n        const r = await graphFetch(\"PATCH\", `/me/drive/items/${itemId}`, {\n            headers,\n            body: { name: newName },\n        });\n        return r.json();\n    }\n    return {\n        listChildren, getItemByPath, downloadItemBlob, downloadItemRange, getDownloadUrl,\n        uploadFileToApproot, uploadStreamToApproot, deleteItem, clearFolderCaches, getApprootId, ensureSubfolder,\n        moveItemToFolder, copyItemToFolder, renameItem,\n    };\n}\n", "// MSAL.js \u5305\u4E86\u4E00\u5C42\uFF08\u6A21\u5F0F\u627F\u81EA\u524D\u8EAB\u5BB6\u65CF\uFF0C\u51E0\u4E4E 1:1\uFF09\u3002\n//\n// \u5173\u952E\u51B3\u7B56\uFF1A\n// - MSAL \u6574\u5305\u7531\u5BBF\u4E3B vendor\uFF08\u5982 vendor/msal/\uFF09\u3002\u672C\u5730\u8DEF\u5F84\uFF0C\u65E0 CDN \u4F9D\u8D56\u3002\n//   \u5BB6\u65CF\u65E9\u671F\u8D70\u8FC7 CDN\uFF0C\u540E\u7EDF\u4E00 vendor \u8DEF\u7EBF\uFF08\u66F4\u7A33\uFF0Cversion \u8DDF\u7740 commit\uFF09\u3002\n// - \u61D2\u52A0\u8F7D\uFF1ACLIENT_ID \u662F\u5360\u4F4D\u7B26\u5C31\u4E0D\u53BB load script\uFF0C\u7EAF\u79BB\u7EBF\u3002\n// - \u540C origin \u591A app \u4F1A\u5171\u7528 localStorage \u91CC\u7684 account cache\u3002silent probe \u662F\u8FC7\u6EE4\uFF1A\n//   \u6709 account \u4E0D\u4EE3\u8868\u672C app \u6709 token\uFF08\u672C app \u53EF\u80FD\u4ECE\u6CA1\u6388\u6743\u8FC7\uFF09\u3002\n// - signOut() \u53EA\u6E05\u672C app cache\uFF08clearCache\uFF09\uFF0C\u4E0D logoutRedirect \u628A\u7528\u6237 Outlook \u4E00\u8D77\u8E22\u6389\u3002\nimport { reportStoreError } from \"../error-handling.js\";\n// \uFF08\u53D6\u4EE3\u524D\u8EAB\u5BBF\u4E3B\u7684 config.js import\uFF0C\u53BB app \u5316\u3002\uFF09\nlet CLIENT_ID = \"\";\n// 2.2.0\uFF08\u5468\u8D26\u9053 1 \u5BA1\u8BA1\u67E5\u51FA\uFF09\uFF1A\u9ED8\u8BA4\u503C\u4EE5\u524D\u662F /common\u2014\u2014\u5BB6\u89C4 #7\u300Cpersonal Microsoft account only\uFF0Cauthority \u5FC5\u987B /consumers\uFF0C/common \u7981\u6B62\u300D\uFF1B\n//   \u516B\u4E2A app \u90FD\u663E\u5F0F\u4F20\u4E86 /consumers \u6240\u4EE5\u6CA1\u70B8\u8FC7\uFF0C\u4F46\u5E93\u9ED8\u8BA4\u503C\u4E0D\u80FD\u662F\u4E2A\u5751\u3002configureOneDriveAuth \u5BF9\u975E /consumers \u7684 authority \u76F4\u63A5\u62D2\u3002\nlet AUTHORITY = \"https://login.microsoftonline.com/consumers\";\n/** \u5F53\u524D authority\uFF08\u6D4B\u8BD5 / \u8BCA\u65AD\uFF09\u3002 */\nexport function authAuthority() { return AUTHORITY; }\nlet SCOPES = [\"Files.ReadWrite.AppFolder\", \"offline_access\"];\nlet MSAL_URL = null;\n/** OneDrive auth \u914D\u7F6E\u6CE8\u5165\u3002app \u8C03\u4E00\u6B21\uFF08clientId/authority/scopes/msalUrl\uFF1BmsalUrl = vendored MSAL \u811A\u672C\u76F8\u5BF9\u8DEF\u5F84\uFF09\u3002 */\nexport function configureOneDriveAuth({ clientId, authority, scopes, msalUrl } = {}) {\n    if (clientId)\n        CLIENT_ID = clientId;\n    if (authority) {\n        if (!/^https:\\/\\/login\\.microsoftonline\\.com\\/consumers\\/?$/.test(authority))\n            throw new Error(`configureOneDriveAuth: authority must be https://login.microsoftonline.com/consumers (family hard rule #7: personal Microsoft accounts only; /common is forbidden) \u2014 got ${authority}`);\n        AUTHORITY = authority;\n    }\n    if (scopes)\n        SCOPES = scopes;\n    if (msalUrl != null) { // \u6D4F\u89C8\u5668\u76F8\u5BF9\u8DEF\u5F84\uFF08vendored \u811A\u672C\uFF09\u2192 \u7EDD\u5BF9\uFF1Bnode \u91CC = null\n        MSAL_URL = (typeof document !== \"undefined\" && document.baseURI)\n            ? new URL(msalUrl, document.baseURI).href : null;\n    }\n}\nexport function isAuthConfigured() {\n    return typeof CLIENT_ID === \"string\" && CLIENT_ID.length > 0 && !CLIENT_ID.startsWith(\"REPLACE_ME\");\n}\n// MSAL_URL \u7531 configureOneDriveAuth \u8BBE\uFF08app \u4F20 vendored \u811A\u672C\u76F8\u5BF9\u8DEF\u5F84\uFF0Cdocument.baseURI \u89E3\u7EDD\u5BF9\uFF09\u3002\nlet msalLoadPromise = null;\nlet pca = null;\n// \u2500\u2500 0.11.2 \u7EED\u7B7E\u8BCA\u65AD\uFF08\u7EAF\u8BB0\u65E5\u5FD7\uFF0C\u96F6\u884C\u4E3A\u53D8\u5316\uFF1Buser 2026-08-31\u300C\u4E00\u5C0F\u65F6\u6389\u7EBF\u597D\u51E0\u4E2A minor \u7EAA\u5143\u6BCF\u6B21\u5FC5\u73B0\u300D\uFF09\u2500\u2500\n// \u73B0\u8C61\u4E0A\u300C\u7F13\u5B58\u91CC\u6CA1\u6709 refresh token\u300D\u4E0E\u300Crefresh token \u88AB\u62D2\u300D\u90FD\u7ECF iframe \u9000\u8DEF\u629B\u540C\u4E00\u4E2A InteractionRequiredAuthError\uFF0C\n//   \u5206\u4E0D\u5F00\uFF1B\u80FD\u5206\u5F00\u7684\u4E24\u6837\u4E1C\u897F\uFF1A\u2460 MSAL \u81EA\u5DF1\u7684\u65E5\u5FD7\uFF08\u5B83\u4F1A\u8BF4\u8DF3\u8FC7 RT \u8FD8\u662F RT \u8BF7\u6C42\u8FD4\u56DE\u4E86\u4EC0\u4E48\uFF09\u2461 \u7F13\u5B58\u91CC RT \u6761\u6570\u3002\n// - MSAL logger \u63A5 Info \u7EA7\u8FDB\u4E00\u4E2A 40 \u884C\u7684\u73AF\uFF08\u4E0D\u8FDB app \u65E5\u5FD7\u2014\u2014\u5E73\u65F6\u592A\u5435\uFF09\uFF0CWarning/Error \u5373\u65F6\u4E0A\u62A5\uFF08log \u7EA7\uFF09\uFF1B\n//   \u9759\u9ED8\u7EED\u7B7E\u5931\u8D25\u65F6\u628A\u73AF\u6574\u6BB5\u9644\u5728\u5931\u8D25\u62A5\u544A\u91CC \u2192 app \u9ED1\u5323\u5B50\u4E00\u6B21\u62FF\u5230\u4E0A\u4E0B\u6587\u3002\n// - countRefreshTokens\uFF1A\u53EA\u8BFB\u626B localStorage \u91CC MSAL \u81EA\u5DF1\u7684 RT \u952E\uFF08`<homeAccountId>-<env>-refreshtoken-<clientId>-\u2026`\uFF09\u3002\n//   \u8FD9\u4E0D\u662F store \u7684\u547D\u540D\u7A7A\u95F4\uFF08namespacedKv choke point \u7BA1\u7684\u662F store \u952E\uFF09\uFF0C\u662F MSAL \u7684\u50A8\u7269\u67DC\uFF0C\u672C\u6587\u4EF6\u662F\u5B83\u552F\u4E00\u7684\u5305\u88C5\u5C42\u3002\nconst MSAL_TAIL_MAX = 40;\nconst _msalTail = [];\nfunction _msalLog(level, message) {\n    _msalTail.push(`${new Date().toISOString().slice(11, 23)} L${level} ${message}`);\n    if (_msalTail.length > MSAL_TAIL_MAX)\n        _msalTail.splice(0, _msalTail.length - MSAL_TAIL_MAX);\n    if (level <= 1)\n        reportStoreError(new Error(\"[msal] \" + message), \"log\"); // 0=Error 1=Warning\uFF1A\u5373\u65F6\u7ED9 app\uFF08log \u7EA7\uFF0C\u4E0D\u5F39\uFF09\n}\n/** \u53EA\u8BFB\u8BCA\u65AD\uFF1AMSAL \u5728 localStorage \u91CC\u4E3A\u8BE5\u8D26\u53F7\uFF08\u7F3A\u7701=\u4EFB\u610F\u8D26\u53F7\uFF09\u5B58\u4E86\u51E0\u6761 refresh token\u3002\u5B58\u50A8\u4E0D\u53EF\u7528 \u2192 null\u3002 */\nexport function countRefreshTokens(homeAccountId) {\n    try {\n        const ls = globalThis.localStorage;\n        if (!ls)\n            return null;\n        const prefix = homeAccountId ? homeAccountId.toLowerCase() + \"-\" : \"\";\n        let n = 0;\n        for (let i = 0; i < ls.length; i++) {\n            const k = ls.key(i);\n            if (k && k.includes(\"-refreshtoken-\") && (!prefix || k.toLowerCase().startsWith(prefix)))\n                n++;\n        }\n        return n;\n    }\n    catch {\n        return null;\n    }\n}\n/** \u53EA\u8BFB\u8BCA\u65AD\uFF080.11.3\uFF09\uFF1AMSAL \u7F13\u5B58\u91CC token \u6761\u76EE\u7684**\u65F6\u95F4\u6233**\uFF08\u4E0D\u542B secret\uFF09\u3002RT \u6761\u76EE\u5E26 expiresOn \u8BF4\u660E\u670D\u52A1\u7AEF\u8FD4\u56DE\u8FC7\n *  refresh_token_expires_in\uFF08MSA \u4E2A\u4EBA\u8D26\u53F7\u4F1A\u7ED9\uFF09\uFF1BMSAL \u5BA2\u6237\u7AEF\u5230\u70B9\u5373\u5224 refresh_token_expired \u9000 iframe\u2014\u2014\u82E5 expiresOn \u8DDD\u7B7E\u53D1\n *  \u53EA\u6709 ~1h\uFF0C\u5C31\u662F\u300C\u4E00\u5C0F\u65F6\u5FC5\u6389\u300D\u7684\u76F4\u63A5\u8BC1\u636E\u3002AT \u6761\u76EE\u7ED9 cachedAt/expiresOn/target \u505A\u5BF9\u7167\u3002localStorage \u4E0D\u53EF\u7528 \u2192 null\u3002 */\nexport function inspectMsalTokenCache(homeAccountId) {\n    try {\n        const ls = globalThis.localStorage;\n        if (!ls)\n            return null;\n        const prefix = homeAccountId ? homeAccountId.toLowerCase() + \"-\" : \"\";\n        const rts = [], ats = [];\n        const fmt = (v) => { const n = Number(v); return Number.isFinite(n) && n > 0 ? new Date(n * 1000).toISOString() : String(v ?? \"-\"); };\n        for (let i = 0; i < ls.length; i++) {\n            const k = ls.key(i);\n            if (!k)\n                continue;\n            const kl = k.toLowerCase();\n            if (prefix && !kl.startsWith(prefix))\n                continue;\n            const isRt = kl.includes(\"-refreshtoken-\"), isAt = kl.includes(\"-accesstoken-\");\n            if (!isRt && !isAt)\n                continue;\n            let ent = {};\n            try {\n                ent = JSON.parse(ls.getItem(k) ?? \"{}\");\n            }\n            catch { /* \u975E JSON\uFF1A\u53EA\u8BB0\u952E */ }\n            const env = String(ent.environment ?? kl.split(\"-\")[1] ?? \"?\");\n            if (isRt)\n                rts.push(`env=${env} familyId=${String(ent.familyId ?? \"-\")} expiresOn=${fmt(ent.expiresOn)}`);\n            else\n                ats.push(`env=${env} cachedAt=${fmt(ent.cachedAt)} expiresOn=${fmt(ent.expiresOn)} extExpiresOn=${fmt(ent.extendedExpiresOn)} target=${String(ent.target ?? \"-\").slice(0, 80)}`);\n        }\n        return { refreshTokens: rts, accessTokens: ats };\n    }\n    catch {\n        return null;\n    }\n}\nfunction _cacheLines(homeAccountId) {\n    const c = inspectMsalTokenCache(homeAccountId);\n    if (!c)\n        return [\"  msal-cache: (localStorage unavailable)\"];\n    return [\n        `  msal-cache rt(${c.refreshTokens.length}):`, ...c.refreshTokens.map((l) => \"    \" + l),\n        `  msal-cache at(${c.accessTokens.length}):`, ...c.accessTokens.map((l) => \"    \" + l),\n    ];\n}\nfunction _logSilentFailure(where, account, e) {\n    const err = e;\n    const hid = typeof account?.homeAccountId === \"string\" ? account.homeAccountId : \"\";\n    const lines = [\n        `[auth] silent token renewal failed (${where}): name=${String(err?.name ?? \"?\")} code=${String(err?.errorCode ?? \"?\")} sub=${String(err?.subError ?? \"\")} msg=${String(err?.message ?? e).slice(0, 200)}`,\n        `  account=${hid ? hid.slice(0, 8) + \"\u2026\" : \"(none)\"} refreshTokensInCache=${String(countRefreshTokens(hid || undefined))} scopes=${SCOPES.join(\" \")} now=${new Date().toISOString()}`,\n        ..._cacheLines(hid || undefined),\n        `  msal-tail(${_msalTail.length}):`,\n        ..._msalTail.map((l) => \"    \" + l),\n    ];\n    reportStoreError(new Error(lines.join(\"\\n\")), \"log\");\n}\nlet activeAccount = null;\nlet initPromise = null;\n// \u2500\u2500 0.12.1\uFF08user 2026-09-09\u300CIDB\u90FD\u505A\u300D#60-D\uFF09\uFF1A\u53D6 token \u5355\u98DE + \u9700\u4EA4\u4E92\u95E9 \u2500\u2500\n//   \u6848\u53D1 2026-09-08 \u9ED1\u5323\u5B50\uFF1ART \u8FC7\u671F\u540E\u540C\u4E00\u6BEB\u79D2 6 \u4E2A getTokenFor \u5E76\u53D1 \u2192 6 \u4E2A\u9690\u85CF iframe \u5F80\u8FD4\u30016 \u7EC4\u591A\u884C\u65E5\u5FD7\u3001\u591A\u6761 E \u7EA7\u6A2A\u5E45\uFF1B\u4E4B\u540E\u6BCF\u4E2A\u540E\u53F0\u8C03\u7528\n//   \u90FD\u518D\u8DD1\u4E00\u904D iframe\u3002\u2460 \u5355\u98DE\uFF1A\u540C\u8D26\u53F7\u5728\u98DE\u7684 acquireTokenSilent \u5171\u4EAB\u4E00\u4E2A promise\uFF08\u4E00\u6B21\u5931\u8D25\u4E00\u6761\u65E5\u5FD7\uFF09\u3002\u2461 \u95E9\uFF1A\u4E00\u65E6 InteractionRequired\n//   \uFF08login_required / interaction_required / consent_required\uFF09\uFF0C\u540C\u8D26\u53F7\u540E\u7EED\u8C03\u7528\u5728 INTERACTION_LATCH_MS \u5185\u76F4\u63A5\u629B\u540C\u4E00\u4E2A\u9519\u2014\u2014\u4E0D\u8FDB MSAL\u3001\n//   \u4E0D\u5F00 iframe\u3001\u4E0D\u5237\u65E5\u5FD7\uFF1B\u663E\u5F0F\u767B\u5F55\u6210\u529F\uFF08redirect \u56DE\u7A0B / popup / \u540E\u53F0 silent / retrySilentSignIn\uFF09\u6216 signOut \u89E3\u95E9\uFF1B\u5230\u671F\u81EA\u52A8\u653E\u884C\u4E00\u6B21\n//   \uFF08\u522B\u7684 tab \u767B\u5F55\u540E\u672C tab \u7684 MSAL \u7F13\u5B58\u5DF2\u66F4\u65B0\uFF0C\u95E9\u4E0D\u80FD\u6C38\u4E45\uFF09\u3002\u7F51\u7EDC\u7C7B\u9519\u8BEF\u4E0D\u4E0A\u95E9\uFF08\u53EA\u5355\u98DE\uFF09\u3002\nconst INTERACTION_LATCH_MS = 60_000;\nconst _inflight = new Map();\nconst _latched = new Map();\nfunction _isInteractionRequired(e) {\n    const err = e;\n    return err?.name === \"InteractionRequiredAuthError\" || /^(login_required|interaction_required|consent_required)$/.test(String(err?.errorCode ?? \"\"));\n}\nfunction _clearLatch() { _latched.clear(); }\nfunction _acquireSingleFlight(key, account, where) {\n    const l = _latched.get(key);\n    if (l) {\n        if (Date.now() < l.until) {\n            l.suppressed++;\n            return Promise.reject(l.err);\n        } // \u95E9\u4F4F\uFF1Afail-fast\uFF0C\u540C\u4E00\u4E2A\u9519\n        _latched.delete(key);\n    }\n    const inflight = _inflight.get(key);\n    if (inflight)\n        return inflight;\n    const p = (async () => {\n        try {\n            const result = await pca.acquireTokenSilent({ scopes: SCOPES, account });\n            return result.accessToken;\n        }\n        catch (e) {\n            _logSilentFailure(where, account, e);\n            if (_isInteractionRequired(e))\n                _latched.set(key, { until: Date.now() + INTERACTION_LATCH_MS, err: e, suppressed: 0 });\n            throw e;\n        }\n        finally {\n            _inflight.delete(key);\n        }\n    })();\n    _inflight.set(key, p);\n    return p;\n}\nconst _authSubs = new Set();\nexport function onAuthChanged(cb) { _authSubs.add(cb); return () => _authSubs.delete(cb); }\nexport function getAuthState() { return { signedIn: !!activeAccount, account: activeAccount }; }\nfunction _emitAuth(reason) {\n    const st = { ...getAuthState(), reason };\n    for (const cb of _authSubs) {\n        try {\n            cb(st);\n        }\n        catch (_) { }\n    }\n}\n// \u26A0 **\u5FC5\u987B\u5E26\u8D85\u65F6**\uFF08v418\uFF09\uFF1A`onerror` \u53EA\u5728\u8BF7\u6C42\u660E\u786E\u5931\u8D25\u65F6\u89E6\u53D1\u3002\u8BF7\u6C42**\u6302\u7740**\uFF08\u534A\u5F00\u8FDE\u63A5 / \u5F3A\u5236\u95E8\u6237\uFF09\n//   \u65F6 onload \u548C onerror \u90FD\u4E0D\u6765\uFF0C\u4E8E\u662F\u8FD9\u4E2A promise \u6C38\u4E0D settle \u2014\u2014 \u4E0B\u9762\u7684\u91CD\u8BD5\u6C38\u8FDC\u4E0D\u4F1A\u53D1\u751F\u3001\u4E5F\u6C38\u8FDC\n//   \u4E0D\u4F1A\u653E\u5F03\uFF0C\u800C\u52A8\u6001\u63D2\u5165\u7684 script \u4ECD\u7136\u540A\u7740 window \u7684 load \u4E8B\u4EF6 \u2192 \u6D4F\u89C8\u5668\u6807\u7B7E\u9875\u4E00\u76F4\u8F6C\u5708\u3002\n// \u26A0 \u4F46\u8FD9\u4E2A\u6570\u53EA\u7528\u6765\u515C\u300C\u6C38\u8FDC\u6302\u7740\u300D\uFF0C**\u4E0D\u662F\u7528\u6765\u5224\u65AD\u300C\u6162\u300D\u7684**\uFF08v421 \u4FEE\uFF1A\u539F\u6765\u662F 8000\uFF0C\u592A\u6FC0\u8FDB\uFF09\u3002\n//   \u771F\u673A\u6293\u5305\u5B9E\u6D4B msal-browser.min.js \u5355\u6B21\u52A0\u8F7D\u82B1\u4E86 **15.4 \u79D2**\u3001\u6700\u7EC8 200\u30028 \u79D2\u4F1A\u628A\u5B83\u5224\u6B7B \u2192\n//   \u4E09\u6B21\u91CD\u8BD5\u5168\u90E8\u8D85\u65F6 \u2192 MSAL \u6839\u672C\u8F7D\u4E0D\u8FDB\u6765 \u2192 **\u6162\u7F51\u4E0B\u767B\u5F55\u5F7B\u5E95\u4E0D\u53EF\u7528**\u3002\u8FD9\u6BD4\u5B83\u8981\u4FEE\u7684 bug \u66F4\u7CDF\u3002\nconst SCRIPT_LOAD_TIMEOUT_MS = 45000;\nfunction loadScript(url) {\n    return new Promise((resolve, reject) => {\n        const s = document.createElement(\"script\");\n        let done = false;\n        const settle = (fn) => { if (done)\n            return; done = true; clearTimeout(timer); fn(); };\n        const timer = setTimeout(() => settle(() => {\n            s.remove(); // \u6458\u6389\u6302\u6B7B\u7684 script\uFF0C\u522B\u7EE7\u7EED\u540A\u7740 load \u4E8B\u4EF6\n            reject(new Error(`timeout loading ${url}`));\n        }), SCRIPT_LOAD_TIMEOUT_MS);\n        s.src = url;\n        s.async = true;\n        s.onload = () => settle(resolve);\n        s.onerror = () => settle(() => reject(new Error(`failed to load ${url}`)));\n        document.head.appendChild(s);\n    });\n}\nasync function loadScriptWithRetry(url, attempts = 3) {\n    let lastErr;\n    for (let i = 0; i < attempts; i++) {\n        try {\n            await loadScript(url);\n            return;\n        }\n        catch (e) {\n            lastErr = e;\n            console.warn(`MSAL load attempt ${i + 1}/${attempts} failed`);\n            if (i < attempts - 1)\n                await new Promise((r) => setTimeout(r, 300 * (i + 1)));\n        }\n    }\n    throw new Error(`MSAL load failed ${url}: ${lastErr?.message}`);\n}\nfunction loadMsal() {\n    if (window.msal)\n        return Promise.resolve(window.msal);\n    if (msalLoadPromise)\n        return msalLoadPromise;\n    msalLoadPromise = (async () => {\n        await loadScriptWithRetry(MSAL_URL);\n        if (window.msal)\n            return window.msal;\n        msalLoadPromise = null;\n        throw new Error(\"MSAL loaded but window.msal didn't appear\");\n    })().catch((e) => { msalLoadPromise = null; throw e; });\n    return msalLoadPromise;\n}\nexport async function initAuth() {\n    if (!isAuthConfigured()) {\n        return { signedIn: false, account: null, notConfigured: true };\n    }\n    if (initPromise)\n        return initPromise;\n    initPromise = (async () => {\n        const msal = await loadMsal();\n        pca = new msal.PublicClientApplication({\n            system: {\n                loggerOptions: {\n                    logLevel: msal.LogLevel?.Info ?? 2, // 0 Error / 1 Warning / 2 Info / 3 Verbose / 4 Trace\n                    piiLoggingEnabled: false,\n                    loggerCallback: (level, message, containsPii) => { if (!containsPii)\n                        _msalLog(level, message); },\n                },\n            },\n            auth: {\n                clientId: CLIENT_ID,\n                authority: AUTHORITY,\n                redirectUri: location.origin + location.pathname,\n                postLogoutRedirectUri: location.origin + location.pathname,\n            },\n            cache: {\n                cacheLocation: \"localStorage\",\n                storeAuthStateInCookie: false,\n                // 0.11.1\uFF08user 2026-08-31 \u6279\u51C6 S3\uFF09\uFF1Aredirect \u5F80\u8FD4\u7684\u4E34\u65F6\u7F13\u5B58\uFF08request state / PKCE verifier / interaction \u72B6\u6001\uFF09\n                //   MSAL \u7F3A\u7701\u653E sessionStorage\u2014\u2014iOS \u4E3B\u5C4F PWA \u8DF3\u53BB\u5FAE\u8F6F\u9875\u671F\u95F4\u8FDB\u7A0B\u88AB\u6740\uFF08\u957F\u753B\u540E\u5185\u5B58\u7D27\u5F20\uFF09\u2192 sessionStorage \u6CA1\u4E86\n                //   \u2192 \u56DE\u7A0B handleRedirectPromise \u5BF9\u4E0D\u4E0A state \u2192 \u767B\u5F55\u9759\u9ED8\u5931\u8D25\uFF08\u6848\u53D1 2026-08-31\u300C\u70B9\u767B\u5F55 OneDrive \u6302\u4E0D\u4E0A\u300D\uFF09\u3002\n                //   \u653E localStorage \u5373\u6D3B\u8FC7\u8FDB\u7A0B\u91CD\u542F\uFF08MSAL \u5B98\u65B9\u5BF9 iOS PWA \u7684\u5EFA\u8BAE\uFF09\u3002\u4EE3\u4EF7\u5DF2\u6838\uFF1A\u2460 \u5F03\u7F6E\u7684 redirect\uFF08\u7528\u6237\u5728\u5FAE\u8F6F\u9875\n                //   \u5173\u6389\uFF09\u7559\u4E0B\u7684 interaction_in_progress \u7531\u4E0B\u6B21 boot \u7684 handleRedirectPromise \u65E0 hash \u5206\u652F cleanRequestByInteractionType\n                //   \u81EA\u6E05\uFF08vendored 3.27.0 \u5DF2\u5B9E\u8BC1\u8BE5\u5206\u652F\uFF09\uFF1B\u2461 \u4E24 tab \u540C\u65F6 redirect \u767B\u5F55\u4F1A\u4E92\u649E interaction_in_progress\u2014\u2014\u5355\u7528\u6237 app \u53EF\u63A5\u53D7\uFF1B\n                //   \u2462 \u66B4\u9732\u9762\u65E0\u65B0\u7C7B\uFF1Aaccess/refresh token \u672C\u5C31\u5728 localStorage\uFF08cacheLocation\uFF09\u3002\n                temporaryCacheLocation: \"localStorage\",\n            },\n        });\n        await pca.initialize();\n        let response = null;\n        try {\n            response = await pca.handleRedirectPromise();\n        }\n        catch (e) {\n            // 0.11.1\uFF08user 2026-08-31 \u6279\u51C6 S2\uFF09\uFF1A\u4EE5\u524D\u53EA console.warn\u2014\u2014iPad \u4E0A redirect \u767B\u5F55\u56DE\u7A0B\u5931\u8D25\uFF08state \u5BF9\u4E0D\u4E0A / \u5FAE\u8F6F\u9875\n            //   \u8FD4\u56DE error\uFF09\u7528\u6237\u96F6\u611F\u77E5\uFF0C\u8868\u73B0\u4E3A\u300C\u70B9\u767B\u5F55\u6CA1\u53CD\u5E94\u3001\u6302\u4E0D\u4E0A\u300D\u3002\u8D70\u7EDF\u4E00\u4E0A\u62A5 \u2192 app \u6A2A\u5E45\u3002store \u4FA7\u4E0D console\uFF08\u5BB6\u89C4\uFF09\u3002\n            reportStoreError(new Error(\"[auth] sign-in redirect return failed (handleRedirectPromise): \" + String(e?.message ?? e)), \"error\");\n        }\n        if (response?.account) {\n            pca.setActiveAccount(response.account);\n            activeAccount = response.account;\n            _clearLatch();\n            _emitAuth(\"signIn\"); // \u767B\u5F55 redirect \u56DE\u6765 \u2192 \u89E3\u95E9 + \u901A\u77E5 UI\uFF08\u6309\u94AE\u53D8\u84DD\uFF09\n            return { signedIn: true, account: activeAccount };\n        }\n        const cached = pca.getAllAccounts();\n        reportStoreError(new Error([`[auth] init: redirectResponse=no cachedAccounts=${cached.length} refreshTokensInCache=${String(countRefreshTokens())} now=${new Date().toISOString()}`, ..._cacheLines()].join(\"\\n\")), \"log\");\n        if (cached.length === 0)\n            return { signedIn: false, account: null };\n        // silent token \u63A2\u6D4B**\u79FB\u51FA\u963B\u585E init** \u2192 \u540E\u53F0\u8DD1\uFF08F4\uFF09\u3002iOS \u4E0A acquireTokenSilent \u7684 iframe \u4F1A\u5361\u4F4F\uFF1B\n        // \u82E5\u5728\u6B64 await\uFF0CMSAL interaction \u72B6\u6001\u88AB\u4E00\u76F4\u5360\u7740 \u2192 \u7528\u6237\u70B9\u767B\u5F55\u7684 loginRedirect \u649E interaction_in_progress\u3002\n        _probeSilent(cached[0]);\n        return { signedIn: false, account: null, probing: true, probedAccount: cached[0] };\n    })().catch((e) => { initPromise = null; throw e; });\n    return initPromise;\n}\n// \u540E\u53F0 silent token \u63A2\u6D4B\uFF1A\u6210\u529F \u2192 \u8BBE activeAccount + \u5E7F\u64AD\u3002\u7EDD\u4E0D\u963B\u585E init / sign-in\uFF08iOS iframe \u5361\u4E0D\u8981\u7D27\uFF09\u3002\n// \u26A0 \u63A8\u8FDF\u5230 window `load` \u4E4B\u540E\uFF08v417\uFF09\uFF1AacquireTokenSilent \u5185\u90E8\u5F00\u4E00\u4E2A\u9690\u85CF iframe\uFF0C\u800C**\u540C\u6587\u6863 iframe \u5728\n//   load \u4E8B\u4EF6\u4E4B\u524D\u521B\u5EFA\u4F1A\u4E00\u76F4\u540A\u7740 load \u4E8B\u4EF6**\u3002\u4E0A\u4E00\u884C\u6CE8\u91CA\u5DF2\u7ECF\u5199\u660E\u8FD9\u4E2A iframe \u5728 iOS \u4E0A\u4F1A\u5361\u4F4F\u2014\u2014\u5361\u4F4F\u7684\n//   iframe + \u672A\u89E6\u53D1\u7684 load = \u6D4F\u89C8\u5668\u6807\u7B7E\u9875\u6C38\u8FDC\u8F6C\u5708\uFF0C\u5373\u4F7F app \u672C\u8EAB\u5DF2\u7ECF\u5B8C\u5168\u53EF\u7528\uFF08\u8FD9\u6B63\u662F\u533A\u5206\u672C\u75C7\u72B6\u7684\u5224\u636E\uFF1A\n//   \u8F6C\u5708\u4F46\u80FD\u64CD\u4F5C = \u8FD9\u91CC\uFF1B\u6574\u9875\u7A7A\u767D = SW/head \u811A\u672C\u90A3\u6761\uFF09\u3002\u63A2\u6D4B\u672C\u5C31\u662F\u7EAF\u540E\u53F0\u7684\u9526\u4E0A\u6DFB\u82B1\uFF0C\u665A\u51E0\u767E\u6BEB\u79D2\u65E0\u635F\u3002\nfunction _afterWindowLoad(fn) {\n    const w = globalThis;\n    if (!w.addEventListener || w.document?.readyState === \"complete\") {\n        fn();\n        return;\n    }\n    w.addEventListener(\"load\", () => fn(), { once: true });\n}\nasync function _probeSilent(account) {\n    await new Promise((r) => _afterWindowLoad(r));\n    try {\n        await pca.acquireTokenSilent({ scopes: SCOPES, account });\n        pca.setActiveAccount(account);\n        activeAccount = account;\n        _clearLatch();\n        _emitAuth(\"silent\"); // \u540E\u53F0 silent \u6210\u529F \u2192 \u89E3\u95E9 + \u901A\u77E5 UI\n    }\n    catch (e) {\n        _logSilentFailure(\"boot-probe\", account, e); /* \u62FF\u4E0D\u5230 token = \u672A\u771F\u767B\u5F55\uFF1BUI \u4FDD\u6301\u672A\u767B\u5F55\uFF0C\u7528\u6237\u53EF\u663E\u5F0F\u767B\u5F55 */\n    }\n}\nexport async function signIn(opts) {\n    // **iOS \u5173\u952E**\uFF1AloginRedirect \u5FC5\u987B\u5728\u540C\u6B65 user-gesture\uFF08\u70B9\u51FB\uFF09\u91CC\u8C03\uFF0C**\u524D\u9762\u4E0D\u80FD\u6709 await**\uFF0C\n    // \u5426\u5219 iOS Safari \u628A\u5B83\u5F53\u975E\u624B\u52BF\u5BFC\u822A\u9759\u9ED8\u62E6\u622A\uFF08\u2192 \u4E0D\u5F39\u767B\u5F55\u6846\uFF09\u3002\n    // interaction \u72B6\u6001\u7531 boot initAuth \u7684 handleRedirectPromise \u6E05\uFF08silent \u63A2\u6D4B\u5DF2\u79FB\u540E\u53F0\u4E0D\u5360 interaction\uFF09\uFF0C\n    // \u6240\u4EE5\u70B9\u51FB\u65F6 pca \u901A\u5E38\u5DF2\u5C31\u7EEA\uFF0C\u76F4\u63A5\u540C\u6B65 loginRedirect\u3002\n    // opts.prompt=\"select_account\"\uFF080.9.0\uFF0Cuser 2026-08-28\u300C\u52A0\u53E3\u5B50\u300D\uFF09\uFF1A\u5F3A\u5236\u5FAE\u8F6F\u8D26\u53F7\u9009\u62E9\u9875\u2014\u2014\u591A\u8D26\u53F7\n    //   \u300C\u6362\u4E00\u4E2A\u8D26\u53F7\u8FDE\u63A5\u56FE\u5E93\u300D\u5165\u53E3\u7528\uFF08P3 \u00A71.10 \u94F8\u7B2C\u4E8C\u8D26\u53F7\uFF09\uFF1B\u7F3A\u7701\u4E0D\u4F20 = SSO \u5FEB\u8DEF\uFF08\u5355\u8D26\u53F7\u96F6\u6253\u6270\u4E0D\u53D8\uFF09\u3002\n    // opts.mode=\"popup\"\uFF080.10.0\uFF0Cuser 2026-08-25 \u62CD\u677F\u300C\u684C\u9762\u4E3B\u573A MSAL popup\u3001iOS redirect\u300D\u30010830 \u786E\u8BA4\u76F4\u505A\uFF09\uFF1A\n    //   loginPopup \u5168\u7A0B\u4E0D\u79BB\u9875\u2014\u2014resolve \u65F6\u8D26\u53F7\u5DF2\u5C31\u4F4D\uFF08activeAccount \u5DF2\u8BBE\u3001\u5DF2\u5E7F\u64AD\uFF09\uFF0C\u8C03\u7528\u65B9\u53EF\u76F4\u63A5\u7EED\u529E\uFF0C\n    //   \u4E0D\u518D\u9700\u8981 redirect \u7684\u300C\u5F85\u7EED\u6807\u8BB0 + \u56DE\u7A0B\u7EED\u529E\u300D\u821E\u6B65\u3002\u684C\u9762/\u79FB\u52A8\u7684\u5224\u65AD\u5F52 app\uFF08\u5E93\u96F6\u4EA7\u54C1\u77E5\u8BC6\uFF09\uFF0C\u7F3A\u7701\u4ECD redirect\u3002\n    //   popup \u540C\u6837\u8981\u540C\u6B65 user-gesture \u8D77\u8DF3\uFF08\u5F39\u7A97\u62E6\u622A\uFF09\uFF0C\u524D\u9762\u4E0D\u80FD\u6709 await\uFF08pca \u5C31\u7EEA\u65F6\u4E0B\u9762\u76F4\u8FBE\uFF09\u3002\n    //   \u53D6\u6D88\uFF08user_cancelled\uFF09/\u88AB\u62E6\uFF08popup_window_error\uFF09= reject \u539F\u6837\u629B\u7ED9\u8C03\u7528\u65B9\u2014\u2014\u7EDD\u4E0D\u541E\u3001\u7EDD\u4E0D\u81EA\u52A8\u964D\u7EA7\n    //   redirect\uFF08\u964D\u7EA7\u5BFC\u822A\u5DF2\u4E0D\u5728\u7528\u6237\u624B\u52BF\u91CC\uFF0C\u4F1A\u88AB iOS/\u5F39\u7A97\u62E6\u622A\u5224\u9ED1\uFF0C\u4E14\u300C\u70B9\u767B\u5F55\u5374\u6574\u9875\u8DF3\u8D70\u300D\u6B63\u662F popup \u8981\u6CBB\u7684\u75C5\uFF09\u3002\n    if (!pca)\n        await initAuth(); // \u4EC5 boot \u8FD8\u6CA1\u5EFA pca \u7684\u6781\u5C11\u6570\u60C5\u51B5\u624D\u7B49\uFF08\u4F1A\u4E22 gesture\uFF0C\u4F46\u7F55\u89C1\uFF09\n    const request = { scopes: SCOPES, ...(opts?.prompt ? { prompt: opts.prompt } : {}) };\n    if (opts?.mode === \"popup\") {\n        const response = await pca.loginPopup(request);\n        if (response?.account) {\n            pca.setActiveAccount(response.account);\n            activeAccount = response.account;\n            _clearLatch();\n            _emitAuth(\"signIn\"); // popup \u5F39\u56DE \u2192 \u89E3\u95E9 + \u901A\u77E5 UI\uFF08\u4E0E redirect \u56DE\u7A0B initAuth \u540C\u4E00\u5E7F\u64AD\u9762\uFF09\n        }\n        return response;\n    }\n    return pca.loginRedirect(request); // \u540C\u6B65\u8C03\u7528\uFF0C\u4FDD\u4F4F iOS user-gesture\n}\nexport async function signOut() {\n    if (!pca || !activeAccount)\n        return;\n    const account = activeAccount;\n    activeAccount = null;\n    _clearLatch();\n    _emitAuth(\"signOut\"); // \u767B\u51FA \u2192 \u89E3\u95E9 + \u7ACB\u5373\u901A\u77E5 UI\uFF08\u6309\u94AE\u53D8\u7070\uFF09\n    try {\n        await pca.clearCache({ account });\n    }\n    catch (e) {\n        console.warn(\"clearCache failed:\", e);\n    }\n    try {\n        pca.setActiveAccount(null);\n    }\n    catch (_) { }\n}\nexport async function getToken() {\n    if (!pca || !activeAccount)\n        throw new Error(\"Not signed in\");\n    const account = activeAccount;\n    try {\n        return await _acquireSingleFlight(String(account?.homeAccountId ?? \"\"), account, \"getToken\"); // 0.12.1 \u5355\u98DE + \u95E9\uFF08\u65E5\u5FD7\u5728\u91CC\u9762\u8BB0\uFF0C\u4E00\u6B21\u5931\u8D25\u4E00\u6761\uFF09\n    }\n    catch (e) {\n        // silent \u5931\u8D25 = token \u8FC7\u671F/\u5931\u6548 \u2192 \u6E05 activeAccount + \u901A\u77E5 UI\uFF08\u6309\u94AE\u53D8\u7070\uFF0C\u56DE\u5230\"\u672A\u767B\u5F55\"\uFF09\u3002\n        // **\u7EDD\u4E0D\u5728\u6B64 acquireTokenRedirect**\uFF1AgetToken \u53EA\u5728\u540E\u53F0 graph \u8BF7\u6C42\u91CC\u88AB\u8C03\uFF1B\u540E\u53F0\u6570\u636E\u540C\u6B65\n        //   \u89E6\u53D1\u4EA4\u4E92\u5F0F\u8DF3\u8F6C = boot \u91CD\u5B9A\u5411\u5FAA\u73AF\uFF08silent \u5931\u8D25\u2192\u8DF3\u8F6C\u2192\u91CD\u8F7D\u2192\u518D silent \u5931\u8D25\u2026\u4E00\u76F4\u8F6C\uFF09/\n        //   \u9605\u8BFB\u4E2D\u88AB\u52AB\u6301\u5BFC\u822A\u3002\u4EA4\u4E92\u5F0F\u91CD\u65B0\u767B\u5F55\u53EA\u8D70\u663E\u5F0F signIn()\uFF08user-gesture loginRedirect\uFF09\uFF0C\n        //   \u540E\u53F0\u540C\u6B65\u5728\u6B64\u964D\u7EA7\u4E3A\u79BB\u7EBF\uFF08\u8C03\u7528\u65B9 try/catch \u6536\u6210 offline\uFF0C\u672C\u5730\u4ECD\u53EF\u8BFB\u3001\u810F\u4E0D\u4E22\uFF09\u3002\n        if (activeAccount === account) {\n            activeAccount = null;\n            _emitAuth(\"expired\");\n        } // \u5355\u98DE\u4E0B\u5E76\u53D1\u8C03\u7528\u5171\u4EAB\u540C\u4E00\u4E2A\u5931\u8D25\uFF1A\u53EA\u6E05\u4E00\u6B21\u3001\u53EA\u5E7F\u64AD\u4E00\u6B21\n        throw e;\n    }\n}\nexport function getActiveAccount() { return activeAccount; }\nexport function isSignedIn() { return !!activeAccount; }\n// \u591A\u8D26\u53F7\u9632\u5FA1\uFF082026-08-25 user \u62CD\u677F \u00A71.4\uFF0C\u5BA3\u53D1\u524D\u94FA\u8DEF\uFF09\uFF1Aprovider \u6784\u9020\u663E\u5F0F\u643A\u5E26 homeAccountId \u65F6\uFF0C\n//   token \u4E00\u5F8B\u6309**\u90A3\u4E2A\u8D26\u53F7**\u53D6\u2014\u2014store \u5185\u90E8\u6C38\u4E0D\u95EE\u300C\u73B0\u5728\u8C01\u767B\u5F55\u7740\u300D\u3002\u4E0E getToken \u7684\u5DEE\u522B\uFF1A\n//   \u2460 account \u6309 homeAccountId \u663E\u5F0F\u89E3\u6790\uFF08pca.getAccountByHomeId\uFF09\uFF0C\u4E0D\u662F\u5168\u5C40 activeAccount\uFF1B\n//   \u2461 silent \u5931\u8D25**\u4E0D\u52A8**\u5168\u5C40 activeAccount\uFF08\u90A3\u662F\u300C\u5F53\u524D\u767B\u5F55 UI\u300D\u7684\u72B6\u6001\uFF0C\u9489\u6B7B\u8D26\u53F7\u7684\u5931\u8D25\u4E0D\u8BE5\u628A\u522B\u7684\u8D26\u53F7\u767B\u51FA\uFF09\u3002\n//   acquireTokenSilent \u4F9D\u65E7\u663E\u5F0F\u5E26 account \u53C2\u6570\uFF08\u62CD\u677F \u00A71.4 \u2462\u2014\u2014\u672C\u6587\u4EF6\u6240\u6709\u53D6 token \u5904\u7686\u7136\uFF0C\u52FF\u5220\uFF09\u3002\nexport async function getTokenFor(homeAccountId) {\n    if (!pca)\n        await initAuth();\n    if (!pca)\n        throw new Error(\"Auth not initialized\");\n    const account = pca.getAccountByHomeId(homeAccountId);\n    if (!account)\n        throw new Error(`Account not signed in on this device: ${homeAccountId}`);\n    return _acquireSingleFlight(homeAccountId, account, \"getTokenFor\"); // 0.12.1 \u5355\u98DE + \u95E9\uFF1B\u5931\u8D25\u4E0D\u52A8\u5168\u5C40 activeAccount\uFF08\u62CD\u677F \u00A71.4 \u2461\u4E0D\u53D8\uFF09\n}\n// \u5F53\u4ECE\u79BB\u7EBF\u53D8\u6210\u5728\u7EBF\u65F6\u8C03\u4E00\u6B21\u3002boot \u65F6 acquireTokenSilent \u56E0\u7F51\u7EDC\u629B\u9519 \u2192 activeAccount\n// \u7559\u7A7A \u2192 \u540E\u9762\u6709\u7F51\u4E86 isSignedIn \u4E5F\u8FD8\u662F false\u3002\u8FD9\u4E2A\u51FD\u6570\u663E\u5F0F retry \u4E00\u6B21 silent\uFF0C\n// \u6210\u529F\u5C31\u628A activeAccount \u8BBE\u4E0A\uFF0CUI \u8BE5\u5237\u65B0 / cloud list \u8BE5\u91CD\u62C9\u7684\u5C31\u8DDF\u7740\u8D70\u3002\nexport async function retrySilentSignIn() {\n    if (activeAccount)\n        return true; // \u5DF2\u7B7E\u5230\n    if (!isAuthConfigured())\n        return false;\n    if (!pca) {\n        try {\n            await initAuth();\n        }\n        catch (_) {\n            return false;\n        }\n    }\n    if (!pca)\n        return false;\n    const cached = pca.getAllAccounts();\n    if (cached.length === 0)\n        return false;\n    try {\n        await pca.acquireTokenSilent({ scopes: SCOPES, account: cached[0] });\n        pca.setActiveAccount(cached[0]);\n        activeAccount = cached[0];\n        _clearLatch();\n        _emitAuth(\"silent\"); // online \u540E silent \u8865\u767B \u2192 \u89E3\u95E9 + \u901A\u77E5 UI\n        return true;\n    }\n    catch (e) {\n        _logSilentFailure(\"retry-silent\", cached[0], e);\n        return false;\n    }\n}\n", "// \u26A0 store \u5185\u90E8\u6DF1\u6A21\u5757\uFF08provider \u5171\u4EAB\uFF09\u3002app \u4E0D import\u3002\n//\n// deleteEmptyFolderVia \u2014\u2014 \u300C\u53EA\u5220\u7A7A\u5939\u300D\u62A4\u680F\u7684**\u552F\u4E00\u771F\u76F8**\uFF0C\u4F9B\u5404 CloudProvider \u5B9E\u73B0 `deleteEmptyFolder` \u590D\u7528\u3002\n//   backend\uFF08OneDrive/mock\uFF09\u7684\u901A\u7528 delete(id) \u5BF9\u6587\u4EF6\u5939\u662F**\u65E0\u6761\u4EF6\u9012\u5F52**\u5220\uFF08Graph `DELETE /items/{id}` \u8FDE\u5B50\u5B59\u4E00\u8D77\u8FDB\u56DE\u6536\u7AD9\uFF09\u2014\u2014\n//   \u5371\u9669\u3002\u6545\u6587\u4EF6\u5939\u5220\u9664\u53EA\u8D70\u672C\u62A4\u680F\uFF1AgetItemByPath \u2192 \u975E\u6587\u4EF6\u5939\u62D2\uFF08\u7A0B\u5E8F\u9519\uFF0Cthrow\uFF09\u2192 list \u2192 \u629B\u9519=list-failed \u2192 \u975E\u7A7A=non-empty \u2192\n//   \u8BC1\u5B9E\u7A7A\u624D delete(id, etag)\uFF08If-Match folder etag = **best-effort**\uFF1Achild-add \u4E0D\u4FDD\u8BC1 bump folder eTag\uFF0C\u6536\u4E0D\u7D27\u4F46\u96F6\u6210\u672C\uFF09\u3002\n//   **\u7EDD\u4E0D throw \u975E\u7A7A/\u5217\u4E3E\u5931\u8D25**\u2014\u2014\u7528\u5224\u522B\u5F0F status \u8FD4\u56DE\uFF0C\u8BA9\u4E0A\u5C42\u533A\u5206\u300C\u53D6\u6D88\u300D(non-empty) \u4E0E\u300C\u7559\u961F\u91CD\u8BD5\u300D(list-failed)\u3002\n//   \u6B8B\u7559 TOCTOU\uFF08list\u2192delete \u5355 RTT \u95F4\u88AB\u52A0\u5B50\u6587\u4EF6 \u2192 \u9012\u5F52\u5220\u6389\u5B83 \u2192 \u8FDB **provider \u56DE\u6536\u7AD9**\u53EF\u6062\u590D\u3001\u4F46\u975E app `.trash`\uFF09\uFF1A\u5DF2\u77E5\u3001\u63A5\u53D7\u3002\nexport async function deleteEmptyFolderVia(getItemByPath, list, deleteById, path) {\n    const item = await getItemByPath(path);\n    if (!item)\n        return { status: \"already-gone\" }; // \u4E91\u7AEF\u672C\u5C31\u6CA1\u8FD9\u5939 = \u7EC8\u6001\u6210\u529F\uFF08\u5E42\u7B49\uFF09\n    if (!item.isFolder)\n        throw new Error(`\u4E0D\u662F\u6587\u4EF6\u5939\uFF0C\u62D2\u7EDD\u5220\u9664\uFF1A${path}`); // \u4F20\u4E86\u6587\u4EF6 path = \u8C03\u7528\u65B9 bug\uFF0Cthrow\n    let children;\n    try {\n        children = await list(path);\n    }\n    catch {\n        return { status: \"list-failed\" };\n    } // \u5217\u4E3E\u5931\u8D25 = \u786E\u8BA4\u4E0D\u4E86\u7A7A \u2192 **\u7EDD\u4E0D\u5F53\u7A7A\u653E\u884C**\uFF08\u5B88\u536B\u51FB\u7A7F\u7EA2\u7EBF\uFF09\n    if (children.length)\n        return { status: \"non-empty\" }; // \u6709\u5185\u5BB9 \u2192 \u4E0D\u5220\uFF08online \u62D2\u3001drain \u53D6\u6D88\uFF09\n    await deleteById(item.ref, item.eTag); // \u8BC1\u5B9E\u7A7A \u2192 \u5220\uFF08If-Match folder etag best-effort\uFF09\n    return { status: \"deleted\" };\n}\n", "// graphToCloudProvider \u2014\u2014 \u628A Graph transport\uFF08graph.js\uFF09\u7FFB\u6210 lib \u7684 CloudProvider\u3002\n// \u539F\u59CB Graph item\uFF08file/folder facet\u3001@microsoft.graph.downloadUrl\uFF09\u2192 CloudItem\u3002\n// \u7EAF\uFF1Agraph **\u5FC5\u4F20**\uFF08\u6D4B\u8BD5\u4F20 graphFromProvider(MockCloudProvider)\uFF09\u3002\n//   graphToCloudProvider \u2218 graphFromProvider \u2248 \u6052\u7B49 \u2192 \u5B8C\u6574 Mock \u9A8C\u9002\u914D\u6B63\u786E\u6027\u3002\n// \u5B8C\u6574\u7684\u300Cconfig \u9A71\u52A8 OneDriveProvider\u300D\u5728 providers/index.js\uFF08wire auth+graph+\u672C\u9002\u914D\u5668\uFF09\u3002\nimport { deleteEmptyFolderVia } from \"./folder-delete.js\";\nfunction toItem(it) {\n    if (!it)\n        return null;\n    return {\n        // ref \u2190 Graph item id\uFF1AOneDrive \u7684 ref \u6070\u597D=Graph id\uFF08\u6539\u540D/\u79FB\u52A8\u4E0D\u4F5C\u5E9F\uFF09\u2014\u2014\u90A3\u662F**\u8D60\u54C1\u4E0D\u662F\u5951\u7EA6**\uFF0C\n        //   \u6D88\u8D39\u65B9\u53EA\u80FD\u6309 CloudItem.ref \u7684\u884C\u674E\u724C\u8BED\u4E49\u7528\uFF08types.ts\uFF09\uFF0C\u7EDD\u4E0D\u4F9D\u8D56\u5176\u8DE8\u6539\u540D\u7A33\u5B9A\u6027\u3002\n        ref: it.id,\n        name: it.name,\n        size: it.size || 0,\n        eTag: it.eTag,\n        lastModifiedDateTime: it.lastModifiedDateTime,\n        isFolder: !!it.folder, // Graph: file facet vs folder facet\n        path: it.path,\n        downloadUrl: it[\"@microsoft.graph.downloadUrl\"] || it.downloadUrl,\n    };\n}\n/** \u628A Graph transport\uFF08graph.ts\uFF09\u7FFB\u6210\u5E93\u7684 CloudProvider\uFF08\u539F\u59CB Graph item \u2192 CloudItem\uFF09\u3002\n *  \u7EAF\uFF1Agraph **\u5FC5\u4F20**\uFF08\u6D4B\u8BD5\u4F20 graphFromProvider(MockCloudProvider)\uFF0C\u4E0E graphToCloudProvider \u590D\u5408 \u2248 \u6052\u7B49\uFF09\u3002 */\nexport function graphToCloudProvider(graph) {\n    if (!graph)\n        throw new Error(\"graphToCloudProvider: graph transport \u5FC5\u4F20\");\n    const list = async (folder = \"\") => (await graph.listChildren(folder)).map(toItem);\n    const getItemByPath = async (path) => toItem(await graph.getItemByPath(path));\n    return {\n        list,\n        getItemByPath,\n        download: (ref) => graph.downloadItemBlob(ref),\n        downloadRange: (ref, offset, length, opts) => graph.downloadItemRange(ref, offset, length, opts),\n        // graph.js \u662F Blob \u539F\u751F\uFF08\u6309 .size \u9009\u7B80\u5355/\u5206\u5757\u8DEF\u5F84\u3001\u7528 .slice \u5207\u5757\uFF09\uFF1Blib \u628A\u5B57\u8282\u5F52\u4E00\u6210 Uint8Array\u3002\n        // \u5FC5\u987B\u5728\u8FD9\u9053\u63A5\u7F1D\u8F6C\u56DE Blob\u2014\u2014Uint8Array.size===undefined \u2192 undefined<=4MB \u4E3A false \u2192 \u6C38\u8FDC\u8D70\u5206\u5757\u3001\n        // while(0<undefined) \u4E00\u4E2A chunk \u90FD\u4E0D\u4F20 \u2192 \u4E0A\u4F20 0 \u5B57\u8282\u5360\u4F4D\u8FD8\u56DE etag\uFF08postmortem 2026-06-05 \u6839\u56E0\uFF09\u3002\n        upload: (path, blob, { contentType = \"application/octet-stream\", eTag = null, conflictBehavior = \"replace\", onProgress, session } = {}) => {\n            const body = blob instanceof Blob ? blob : new Blob([blob], { type: contentType });\n            return graph.uploadFileToApproot(path, body, contentType, { conflictBehavior, eTag, onProgress, session }).then(toItem);\n        },\n        ...(graph.uploadStreamToApproot ? {\n            uploadStream: (path, source, { contentType = \"application/octet-stream\", eTag = null, conflictBehavior = \"fail\", onProgress } = {}) => graph.uploadStreamToApproot(path, source, contentType, { conflictBehavior, eTag, onProgress }).then(toItem),\n        } : {}),\n        // \u6587\u4EF6\u786C\u5220\u3002\u26A0 2026-08-25 \u4FEE\uFF1A\u65E7\u7248 `(id) => graph.deleteItem(id)` \u628A eTag \u541E\u4E86\u2014\u2014purge \u7684 If-Match\n        //   \uFF08v435 \u7ACB\u7684\u786C\u5220\u5B88\u536B\uFF09\u4ECE\u6CA1\u5230\u8FC7 Graph\uFF0Cmock \u6BD4\u771F\u673A\u4E25\uFF08mock \u6821\u9A8C If-Match\u3001\u771F\u673A\u6839\u672C\u6CA1\u6536\u5230\uFF09\u3002\u900F\u4F20\u3002\n        delete: (ref, eTag) => graph.deleteItem(ref, eTag),\n        // \u5220\u7A7A\u5939\uFF08\u552F\u4E00\u6587\u4EF6\u5939\u5220\u9664\u9762\uFF09\uFF1A\u62A4\u680F\u5728 folder-delete \u6DF1\u6A21\u5757\uFF0CIf-Match folder etag best-effort\u3002\n        deleteEmptyFolder: (path) => deleteEmptyFolderVia(getItemByPath, list, (ref, etag) => graph.deleteItem(ref, etag), path),\n        ensureFolder: (path) => graph.ensureSubfolder(path),\n        move: (ref, folderRef, opts = {}) => graph.moveItemToFolder(ref, folderRef, opts).then(toItem),\n        copy: (ref, folderRef, newName) => graph.copyItemToFolder(ref, folderRef, newName).then(toItem),\n        rename: (ref, newName, eTag) => graph.renameItem(ref, newName, eTag).then(toItem),\n        getApprootRef: () => graph.getApprootId(),\n    };\n}\n", "// OneDriveProvider \u2014\u2014 **\u6D4F\u89C8\u5668\u4E13\u5C5E**\uFF08MSAL/Graph/document\uFF09\uFF1A\u65B9\u6CD5\u8C03\u7528\u65F6\u624D\u78B0\u6D4F\u89C8\u5668\uFF1B\u9876\u5C42 import \u5728 node \u5B89\u5168\u3002\n// auth \u6D41\u7A0B\uFF08\u767B\u5F55/token\uFF09\u53EA\u80FD\u771F\u673A\u9A8C\u3002\nimport { createGraph } from \"./graph.js\";\nimport { configureOneDriveAuth, isAuthConfigured, initAuth, signIn, signOut, getToken, getTokenFor, isSignedIn, getActiveAccount, retrySilentSignIn, onAuthChanged, getAuthState, } from \"./auth.js\";\nimport { graphToCloudProvider } from \"../onedrive-provider.js\";\n/** config \u9A71\u52A8\u7684\u5B8C\u6574 OneDrive CloudProvider\uFF08MSAL + Graph + \u9002\u914D\u5668\uFF09\u3002**\u6D4F\u89C8\u5668\u4E13\u5C5E**\uFF1Bauth \u6D41\u7A0B\u53EA\u80FD\u771F\u673A\u9A8C\u3002\n *\n * \u7528\u6CD5\uFF08app \u4F20\u7684\u5C31\u8FD9\u4E9B\uFF1AclientId + \u6D4F\u89C8\u5668\u76F8\u5173 msalUrl\uFF09\uFF1A\n * ```ts\n *  const { provider, auth } = createOneDriveProvider({\n *    clientId: \"....\",                                  // \u5FC5\u4F20\n *    msalUrl: \"./vendor/msal/msal-browser.min.js\",      // vendored \u811A\u672C\n *    scopes?, authority?,                               // \u6709\u5BB6\u65CF\u9ED8\u8BA4\n *  });\n *  await auth.initAuth(); if (auth.isSignedIn()) { ...store \u7528 provider... }\n * ```\n */\nexport function createOneDriveProvider(config = {}) {\n    configureOneDriveAuth(config); // { clientId, scopes?, authority?, msalUrl? }\n    // token-source \u63A5\u7F1D\uFF1A\u9875\u9762\u4E0A\u4E0B\u6587 = MSAL\uFF08SW \u4E0A\u4E0B\u6587\u81EA\u5EFA createGraph(\u51ED\u636E\u6865)\uFF09\u3002\n    //   homeAccountId \u7ED9\u5B9A \u2192 \u9489\u6B7B\u8BE5\u8D26\u53F7\uFF08getTokenFor\uFF09\uFF1B\u7F3A\u7701 \u2192 \u5168\u5C40 activeAccount\uFF08getToken\uFF09\u3002\n    //   2026-08-28 \u5B9E\u4F8B\u5316\uFF1Agraph \u7684 token \u6E90\u4E0E approot/subfolder/downloadUrl \u7F13\u5B58\u5168\u90E8 per-provider\u2014\u2014\n    //   \u540C\u9875\u591A provider\uFF08\u591A\u8D26\u53F7\u5E93\u5E76\u8054\uFF09\u4E92\u4E0D\u8986\u76D6\u3001\u4E92\u4E0D\u6295\u6BD2\uFF08\u65E7\u6A21\u5757\u7EA7\u5355\u4F8B\u7684\u5DF2\u77E5\u5C40\u9650\u5C31\u6B64\u6E05\u9664\uFF09\u3002\n    const hid = config.homeAccountId;\n    const g = createGraph(hid ? () => getTokenFor(hid) : getToken, config.transport ?? {});\n    // 0.11.6\uFF1Aprovider \u5E26 onAuthChanged\uFF08reason \u900F\u4F20\uFF09\u2014\u2014store \u636E \"signOut\" \u6E05 dir-index-cache\uFF1Bexpired \u4E0D\u6E05\uFF08\u51ED\u8BC1\u8FC7\u671F\u4ECD\u663E\u793A\u4E91\u7AEF\u540D\u5355\uFF09\n    const provider = Object.assign(graphToCloudProvider(g), {\n        onAuthChanged: (cb) => onAuthChanged((st) => cb({ signedIn: st.signedIn, reason: st.reason })),\n    });\n    return {\n        provider, // CloudProvider\uFF08\u5582 createCloudSync\uFF09\n        auth: { isAuthConfigured, initAuth, signIn, signOut, getToken, isSignedIn, getActiveAccount, retrySilentSignIn, onAuthChanged, getAuthState },\n    };\n}\n/** OneDrive auth \u914D\u7F6E\u6CE8\u5165\uFF08app \u8C03\u4E00\u6B21\uFF09\u3002 */\nexport { configureOneDriveAuth };\n", "// Gallery \u6587\u4EF6\u5939\u6A21\u578B\uFF08A2 \u51FA\u751F\uFF1BC3 \u7626\u8EAB\u540E = \u7EAF\u5C55\u793A\u52A9\u624B\uFF09\u3002\n// \u7EAF\u6570\u636E\uFF08\u65E0 DOM / \u65E0\u7F51\u7EDC / \u65E0 store\uFF09\u3002\n// \u65E7\u7684 mergeLocalCloud/sliceFolder/mergeTrash/classifyCloudGone/folderHasContents \u5DF2\u88AB store \u5E93\n// \u6536\u7F16\uFF08listing.ts / watchFolder \u5207\u7247 / trash-merge.ts / reconcile.ts\u2014\u2014\u7F51\u76D8\u6A21\u578B 2026-07-11 \u62CD\u677F\uFF09\uFF0C\n// \u672C\u6A21\u5757\u53EA\u5269 gallery UI \u81EA\u5DF1\u7684\u5C55\u793A\u7EAF\u51FD\u6570\u4E0E\u5217\u8868\u9879\u7C7B\u578B\u3002\n// \u672C\u6A21\u5757\u53EA\u8BFB\u8FD9\u4E9B\u5B57\u6BB5\uFF1Blocal session / cloud file \u672C\u4F53\u4ECD\u662F\u672A\u7C7B\u578B\u5316 .js\u3002\nimport { t } from \"../text.js\";\n// \uFF080.6.0\uFF1ANameBoundary\uFF08bare / full / display\uFF09\u9000\u5F79\u2014\u2014\u88F8\u540D\u5F53\u8EAB\u4EFD\u662F\u300C\u4E00\u4E2A app \u4E00\u79CD\u6269\u5C55\u540D\u300D\u65F6\u4EE3\u7684\u4EA7\u7269\uFF1B\u8EAB\u4EFD\u6C38\u8FDC\u662F\u5168\u540D\uFF0C\n//   \u4E3B\u5E72\u53EA\u7ED9\u4EBA\u770B\u3002\u5207\u8EAB\u4EFD\u3001\u62FC\u8EAB\u4EFD\u5168\u8D70 store.identifiers\uFF08\u63D0\u6848 store \u4ED3 ai-docs/20260929-proposal-doc-types.md\uFF09\u3002\uFF09\nimport { withStemTail } from \"@internal/store\";\n// item \u7684\u5C55\u793A\u65F6\u95F4\uFF08\u672C\u5730 updatedAt \u4F18\u5148\uFF0C\u5426\u5219\u4E91\u7AEF lastModifiedDateTime\uFF09\u3002\nexport function itemTime(it) {\n    return (it.local?.updatedAt) || Date.parse(String(it.cloud?.lastModifiedDateTime || 0));\n}\n// \u590D\u5236\u7684\u76EE\u6807\u8EAB\u4EFD\uFF08\u7EAF\uFF09\uFF1A\u540C\u6587\u4EF6\u5939\u4E0B\u300C<\u4E3B\u5E72> \u526F\u672C\u300D/\u300C<\u4E3B\u5E72> \u526F\u672C2\u300D\u2026\u9996\u4E2A\u4E0D\u649E\u7684\uFF0C\u540E\u7F00\u4E0D\u52A8\uFF08withStemTail\uFF1A\u6587\u6863\u63D2\u5728\u540E\u7F00\u524D\u3001\u975E\u6587\u6863\u63D2\u5728\u6700\u540E\u4E00\u4E2A\u70B9\u524D\uFF09\u3002\n//   taken(identifier) = \u662F\u5426\u5DF2\u88AB\u5360\u7528\uFF08\u672C\u5730\u2295\u4E91\u7AEF\u7684\u5E76\u96C6\uFF0C\u8C03\u7528\u65B9\u4F20\u5165\uFF1B\u540C\u6B65\u8C13\u8BCD\uFF0C\u65E0\u7F51\u7EDC\uFF09\u3002\n//   0.5.x \u53CA\u4EE5\u524D\u5728\u8EAB\u4EFD\u672B\u5C3E\u63A5\u300C\u526F\u672C\u300D\uFF0C\u540D\u5B57\u5E26\u540E\u7F00\u7684\u5BBF\u4E3B\u590D\u5236\u51FA\u6765\u662F `\u4E66.webxiaoheiwu.zip \u526F\u672C`\uFF08\u8BA4\u4E0D\u51FA\u7684\u6742\u7269\uFF09\u2014\u2014\u63D0\u6848 \u00A73 \u7B2C 12 \u884C\u3002\nexport function copyTargetName(source, taken, ids) {\n    const SUF = t(\"name.copySuffix\");\n    let candidate = withStemTail(source, ` ${SUF}`, ids);\n    if (!taken(candidate))\n        return candidate;\n    for (let i = 2; i < 1000; i++) {\n        candidate = withStemTail(source, ` ${SUF}${i}`, ids);\n        if (!taken(candidate))\n            return candidate;\n    }\n    return withStemTail(source, ` ${SUF}${Date.now()}`, ids);\n}\n// \u65B0\u8EAB\u4EFD\u7684\u552F\u4E00\u7248\u672C\uFF08v0.10.4 \u4ECE gallery-shell \u63D0\u51FA\u6210\u7EAF\u51FD\u6570\u4F9B pin\uFF1B0.6.0 \u6539\u6536\u8EAB\u4EFD\uFF0C\u539F uniqueBareName\uFF09\u3002\n//   \u300C\u4E0D\u9759\u9ED8\u8986\u76D6\u65E7\u753B\u300D\u94FE\u7684\u7B2C 2 \u5C42\u515C\u5E95\uFF1A\u7B2C 1 \u5C42 = \u8C03\u7528\u65B9\u9884\u68C0\uFF08\u5982 openImageTile \u7684\u5B6A\u751F\u5360\u7528\u95E8\uFF09\uFF0C\n//   \u7B2C 3 \u5C42 = store \u9996\u5B58 mode:\"new\" \u62A4\u680F\uFF08\u5360\u7528\u629B CloudNameCollisionError\uFF0C\u7EDD\u4E0D\u8986\u76D6\uFF09\u3002\n//   \u672A\u5360\u7528\u5373\u7528\uFF1B\u5360\u7528 \u2192 \u4E3B\u5E72\u540E\u63A5 \" 1\"\u2026\" 19\"\uFF08\u540E\u7F00\u4E0D\u52A8\uFF09\uFF1B\u5168\u5360 \u2192 \u65F6\u95F4\u6233\u515C\u5E95\u3002occupied = store.files.occupied\uFF08\u5F02\u6B65\uFF0C\u5728\u7EBF\u542B\u4E91\u7AEF\u4E00\u8DF3\uFF09\u3002\nexport async function uniqueIdentifier(identifier, occupied, ids) {\n    if (!(await occupied(identifier)))\n        return identifier;\n    for (let i = 1; i < 20; i++) {\n        const candidate = withStemTail(identifier, ` ${i}`, ids);\n        if (!(await occupied(candidate)))\n            return candidate;\n    }\n    return withStemTail(identifier, ` ${Date.now()}`, ids);\n}\n", "// Gallery \u8DEF\u5F84\u4EE3\u6570\uFF08A2\uFF0C\u89C1 ai-docs/reports/20260606-fresh-geological-survey.html\uFF09\u3002\n// \u56FE\u5E93 item \u7684 name \u662F\u6241\u5E73\u5B57\u7B26\u4E32\uFF0C\u7528 \"/\" \u8868\u8FBE\u6587\u4EF6\u5939\u5C42\u7EA7\uFF08\u65E0\u771F\u5D4C\u5957\u7ED3\u6784\uFF09\u3002\n// \u8FD9\u4E09\u4E2A\u7EAF\u5B57\u7B26\u4E32\u64CD\u4F5C\u8FC7\u53BB\u5185\u8054\u5728 app.js\uFF0C\u88AB rename/move/breadcrumb/\u5207\u7247\u591A\u5904\u8C03\u7528\u3002\nexport function pathFolder(name) {\n    const i = name.lastIndexOf(\"/\");\n    return i < 0 ? \"\" : name.slice(0, i);\n}\nexport function pathBasename(name) {\n    const i = name.lastIndexOf(\"/\");\n    return i < 0 ? name : name.slice(i + 1);\n}\nexport function pathJoin(folder, name) {\n    if (!folder)\n        return name;\n    if (!name)\n        return folder;\n    return `${folder}/${name}`;\n}\n", "// \u56FE\u5E93\u81EA\u7136\u6392\u5E8F\uFF08user 2026-08-21\uFF1A\u300C\u56FE\u5E93\u6392\u5E8F\u662F\u81EA\u7136\u6392\u5E8F\u5427\uFF0810 \u5728 2 \u540E\u9762\uFF09\u300D\uFF09\u3002\n// \u552F\u4E00\u5171\u4EAB collator\uFF08\u6A21\u5757\u7EA7\uFF0C\u522B\u6BCF\u6B21\u6BD4\u8F83 new \u4E00\u4E2A\uFF09\uFF1Anumeric = \u6570\u5B57\u6BB5\u6309\u6570\u503C\u6BD4\uFF08a2 < a10\uFF09\u3001\n// sensitivity \"base\" = \u5927\u5C0F\u5199/\u91CD\u97F3\u4E0D\u654F\u611F\uFF1Blocale \u7559 undefined \u8DDF\u8BBE\u5907\uFF08\u4E2D\u6587\u540D\u7167\u5E38\u6309\u672C\u5730 locale \u5E8F\uFF09\u3002\n// \u96F6 DOM / \u96F6 store \u7EAF\u6A21\u5757\u2014\u2014app-store \u5217\u4E3E\u9002\u914D\u4E0E gallery UI \u5171\u7528\u3002\nconst _collator = new Intl.Collator(undefined, { numeric: true, sensitivity: \"base\" });\nexport function naturalCompare(a, b) {\n    return _collator.compare(a, b);\n}\n", "// Gallery \u5C55\u793A\u6D3E\u751F\uFF08UI \u6DF1\u5316 candidate 1 \u00B7 gallery\uFF09\u3002\n//\n// \u7EAF\u51FD\u6570\uFF1A\u628A store.list() \u89E3\u6790\u51FA\u7684 item\uFF08{name, local|null, cloud|null, dirty}\uFF09+ \u8FD0\u884C\u6001\n// \uFF08signedIn / \u5F53\u524D\u6D3B\u52A8\u540D\uFF09\u2192 \u7EC4\u4EF6\u6E32\u67D3\u9700\u8981\u7684\u300C\u663E\u793A\u4EC0\u4E48\u300D\u3002\u96F6 DOM / \u96F6\u7F51\u7EDC / \u96F6 store\u3002\n// \u6570\u636E\u89E3\u6790\uFF08\u672C\u5730\u2295\u4E91 merge / dirty\uFF09\u5728 store\uFF08app-store.listGallery\uFF09\uFF1B\u6587\u4EF6\u5939\u5207\u7247 / \u8DEF\u5F84\u4EE3\u6570\n// \u5728 gallery-model.js + gallery-path.js\uFF08\u5DF2\u6D4B\uFF09\uFF1B\u8FD9\u91CC\u53EA\u8865**\u5C55\u793A\u5C42\u6D3E\u751F**\uFF1A\u5FBD\u7AE0 4 \u6001\u3001\u9762\u5305\u5C51\u3001tile \u5B57\u6BB5\u3002\n//\n// \u590D\u7528\u5F62\u72B6\uFF1Aitem \u5F62\u72B6\u901A\u7528\u3001\u5FBD\u7AE0/\u9762\u5305\u5C51\u65E0 ORA \u4F9D\u8D56 \u2192 \u6574\u5757\u53EF\u62AC\u7ED9 AtlasMaker/RealHome\uFF08WeebPaint \u4E13\u7528 example\uFF09\u3002\nimport { isCached, isDirty } from \"@internal/store\";\nimport { t } from \"../text.js\";\n// \u8BFB\u72B6\u6001\u7684\u4E09\u4E2A\u8C13\u8BCD\u2014\u2014\u5168\u5305\u552F\u4E00\u5141\u8BB8\u300C\u770B syncState \u5206\u652F\u300D\u7684\u5730\u65B9\uFF08\u6A21\u677F / verbs \u53EA\u51C6\u7528\u5B83\u4EEC\uFF0C\u4E0D\u51C6\u518D\u5199 `s === \"\u2026\"`\uFF09\u3002\n/** \u672C\u5730\u6709\u5B57\u8282\u526F\u672C\uFF08store isCached\uFF1Asynced / unpushed / newer-on-cloud / conflict / ghost / pendingGone / float / local-only\uFF09\u3002 */\nexport const hasLocalCopy = (s) => isCached(s);\n/** \u4E91\u7AEF\u6709\u526F\u672C\uFF08cloud-only / synced / unpushed / newer-on-cloud / conflict\uFF09\u3002 */\nexport const hasCloudCopy = (s) => s === \"cloud-only\" || s === \"synced\" || s === \"unpushed\" || s === \"newer-on-cloud\" || s === \"conflict\";\n/** \u6709\u672A\u63A8\u5B57\u8282\uFF08store isDirty\uFF09\u3002 */\nexport const hasUnpushed = (s) => isDirty(s);\n/** \u4E91\u7AEF\u5B57\u8282\u6BD4\u672C\u5730\u65B0 \u2192 \u7F29\u7565\u56FE\u5FC5\u987B\u8D70 source:\"cloud\"\uFF08QA 2026-08-21\u300C\u65B0 token \u914D\u65E7\u5B57\u8282\u300D\u6839\u4FEE\uFF09\u3002 */\nexport const cloudBytesNewer = (s) => s === \"newer-on-cloud\" || s === \"conflict\";\n/** store 9 \u6001 \u2192 \u5FBD\u7AE0 9 \u6001\uFF0C\u4E00\u4E00\u5BF9\u5E94\u3001\u96F6\u63A8\u5BFC\u3002\u767B\u51FA\u89C6\u89D2 / \u79BB\u7EBF\u7684\u538B\u6241\u7531 store \u5728\u7B97 syncState \u65F6\u505A\uFF08ListContext\uFF09\uFF0C\u672C\u5305\u4E0D\u518D\u91CD\u505A\u3002 */\nconst BADGE_OF = {\n    \"cloud-only\": \"cloudOnly\", synced: \"syncedBoth\", unpushed: \"dirtyBoth\", \"newer-on-cloud\": \"newerOnCloud\", conflict: \"conflictBoth\",\n    ghost: \"ghost\", pendingGone: \"pendingGone\", float: \"float\", \"local-only\": \"localOnly\",\n};\nexport function tileFor(item, opts) {\n    const s = item.syncState;\n    const badge = BADGE_OF[s] ?? \"localOnly\";\n    const badgeTitle = badge === \"localOnly\" && !opts.signedIn ? t(\"gv.badge.localPlain\") : t(`gv.badge.${badge}`);\n    return {\n        identifier: item.identifier,\n        stem: item.stem,\n        kind: item.kind,\n        time: item.lastModified ?? 0,\n        size: item.size ?? 0,\n        syncState: s,\n        badge, badgeTitle,\n        hasLocal: hasLocalCopy(s), hasCloud: hasCloudCopy(s), cloudNewer: cloudBytesNewer(s),\n        ghost: s === \"ghost\",\n        pendingGone: s === \"pendingGone\",\n        isActive: !!opts.activeIdentifier && item.identifier === opts.activeIdentifier,\n        // \u52A0\u5BC6\u6001\u7531\u8C03\u7528\u65B9\u63A2\u6D4B\u540E\u6CE8\u5165\uFF08store \u7684 Item \u5185\u5BB9\u76F2\u3001\u6CA1\u6709 encrypted \u8F74\uFF09\u3002\n        encrypted: !!opts.encrypted,\n    };\n}\nexport function breadcrumb(folder) {\n    const out = [{ label: t(\"gv.rootDir\"), path: \"\", current: !folder }];\n    if (folder) {\n        const segs = folder.split(\"/\").filter(Boolean);\n        let accum = \"\";\n        segs.forEach((seg, i) => {\n            accum = accum ? `${accum}/${seg}` : seg;\n            out.push({ label: seg, path: accum, current: i === segs.length - 1 });\n        });\n    }\n    return out;\n}\n// \u5C55\u793A\u683C\u5F0F\u5316\uFF08\u7EAF\uFF09\u3002humanTime \u8BFB now\uFF1A\u7EC4\u4EF6\u7528\uFF0C\u6D4B\u8BD5\u53EA\u8986 humanSize\u3002\nexport function humanTime(ts) {\n    if (!ts)\n        return t(\"gv.time.unknown\");\n    const d = new Date(ts);\n    const dt = Date.now() - ts;\n    if (dt < 60 * 1000)\n        return t(\"gv.time.justNow\");\n    if (dt < 60 * 60 * 1000)\n        return t(\"gv.time.minAgo\", { n: Math.floor(dt / 60000) });\n    if (dt < 24 * 60 * 60 * 1000)\n        return t(\"gv.time.hourAgo\", { n: Math.floor(dt / 3600000) });\n    if (dt < 7 * 24 * 60 * 60 * 1000)\n        return t(\"gv.time.dayAgo\", { n: Math.floor(dt / 86400000) });\n    return d.toLocaleDateString();\n}\n// \u5BB6\u89C4\uFF1A\u6570\u636E\u5C42\u88F8\u5B57\u8282\u3001\u663E\u793A\u5C42\u4E8C\u8FDB\u5236\u5355\u4F4D\uFF08KiB/MiB\uFF0C1024 \u8FDB\u5236\uFF09\u2014\u2014\u89C1 timelapse-state.ts \u6CE8\u91CA\u3002\n//   \u65E7\u7248 1024 \u8FDB\u5236\u5374\u6807 KB/MB\uFF08\u5341\u8FDB\u5236\u5355\u4F4D\u540D\uFF09\u662F\u8FDD\u7EA6\u65B9\uFF0C2026-08-21 \u6539\u6807 KiB/MiB/GiB\u3002\nexport function humanSize(b) {\n    if (b == null)\n        return \"?\";\n    if (b === 0)\n        return \"0 B\";\n    if (b < 1024)\n        return `${b} B`;\n    if (b < 1024 * 1024)\n        return `${(b / 1024).toFixed(0)} KiB`;\n    if (b < 1024 * 1024 * 1024)\n        return `${(b / 1048576).toFixed(1)} MiB`;\n    return `${(b / 1073741824).toFixed(2)} GiB`;\n}\nexport function asideTileFor(item) {\n    const base = item.side === \"both\" ? t(\"gv.src.both\") : item.side === \"local\" ? t(\"gv.src.local\") : t(\"gv.src.cloud\");\n    const source = item.conflictLive ? t(\"gv.src.cloudStillAlive\", { base }) : base; // \u79BB\u7EBF\u5220\u88AB\u64A4\u9500\uFF1A\u672C\u5730\u56DE\u6536\u7AD9\u6709\u3001\u4E91\u7AEF\u8FD8\u6D3B\u7740 \u2192 \u63D0\u793A\u4E24\u5B58\n    return { key: item.key, identifier: item.identifier, stem: item.stem, at: item.at, source };\n}\n/** \u5B8C\u6574\u949F\u70B9\uFF08\u5361\u7247\u526F\u884C\u7684 tooltip\uFF1A\u540C\u4E00\u4EFD\u7A3F\u4E00\u5C0F\u65F6\u5185\u7559\u4E86\u4E24\u7248\u5E95\uFF0C\u300C1 \u5C0F\u65F6\u524D\u300D\u5206\u4E0D\u51FA\u6765\uFF09\u3002 */\nexport function fullTime(ts) {\n    return ts ? new Date(ts).toLocaleString() : t(\"gv.time.unknown\");\n}\n", "// \u4E91\u76D8\u56FE\u7247 picker \u7684\u7EAF\u6A21\u578B\uFF08\u96F6 DOM/\u96F6 store\uFF0Cnode \u53EF\u6D4B\uFF09\u2014\u2014spec ai-docs/20260820-cloud-image-picker-spec.md\u3002\n// \u6269\u5C55\u540D\u77E5\u8BC6\u7684\u552F\u4E00\u4F4F\u5740\uFF08\u5E93\u96F6\u5185\u5BB9\u683C\u5F0F\u77E5\u8BC6\u7EAA\u5F8B\uFF1A\u8FD9\u7C7B\u77E5\u8BC6\u53EA\u5728 app \u5C42\uFF0C\u4E14\u53EA\u6B64\u4E00\u5904\uFF09\uFF1A\n//   gallery \u767D\u540D\u5355 = \u753B\u4F5C\uFF08.ora\uFF09+ \u52A0\u5BC6\u5BB9\u5668\uFF08.zip\uFF09\uFF1B\u56FE\u7247\u767D\u540D\u5355 = \u6D4F\u89C8\u5668\u53EF\u89E3\u7801\u96C6\uFF08picker \u5217\u4E3E/\u8DEF\u7531\u7528\uFF09\u3002\n//   \u5176\u4F59\u4E00\u5207\uFF08.md / \u672A\u77E5\uFF09gallery \u548C picker \u90FD\u4E0D\u89C1\u3002tga \u7B49\u81EA\u7814\u89E3\u7801\u5668\u843D\u5730\u540E\u5728 IMAGE_EXT_RE \u6269\u3002\nconst IMAGE_EXT_RE = /\\.(png|jpe?g|gif|webp|bmp|avif)$/i;\nexport const isImagePath = (p) => IMAGE_EXT_RE.test(p);\n/** path \u2192 basename\uFF08picker \u663E\u793A\u540D\uFF1BFile \u5305\u88C5\u540D =\u300C\u6709\u540D\u4FDD\u540D\u300D\u547D\u540D\u89C4\u8303\u7684\u4E0A\u6E38\uFF09\u3002 */\nexport const imageBasename = (p) => p.slice(p.lastIndexOf(\"/\") + 1);\n/** \u5B6A\u751F\u8EAB\u4EFD\uFF08v0.9.34 \u62CD\u677F\uFF1A\u56FE\u5E93\u70B9\u56FE\u7247 = \u5F00\u540C\u5939\u540C\u4E3B\u5E72\u7684\u6587\u6863\uFF0C\u6CA1\u6709\u624D\u65B0\u5EFA\uFF09\uFF1Afoo.png @ \u5939A + \u540E\u7F00 \".ora\" \u2192 \"\u5939A/foo.ora\"\u3002\n *  0.6.0\uFF1A\u6536 docSuffix\uFF08\u5BBF\u4E3B docKinds \u8868\u91CC**\u7B2C\u4E00\u79CD**\u6587\u6863\u7684\u540E\u7F00\u2014\u2014\u56FE\u7247\u8F6C\u751F\u6210\u54EA\u4E00\u79CD\u6587\u6863\u7531\u8868\u7684\u7B2C\u4E00\u884C\u5B9A\uFF09\u3002 */\nexport const imageTwinIdentifier = (folder, basename, docSuffix) => {\n    const stem = basename.replace(/\\.[^.]+$/, \"\") || basename;\n    return `${folder ? `${folder}/` : \"\"}${stem}${docSuffix}`;\n};\n/** File \u5305\u88C5\u7684 MIME\uFF08decodeImageFile \u5B9E\u9645\u6309\u5B57\u8282\u55C5\u63A2\uFF0C\u7ED9\u5BF9\u53EA\u662F\u793C\u8C8C\uFF09\u3002 */\nexport function mimeForImageName(name) {\n    const m = /\\.([a-z0-9]+)$/i.exec(name)?.[1]?.toLowerCase();\n    return { png: \"image/png\", jpg: \"image/jpeg\", jpeg: \"image/jpeg\", gif: \"image/gif\", webp: \"image/webp\", bmp: \"image/bmp\", avif: \"image/avif\" }[m ?? \"\"] || \"application/octet-stream\";\n}\n/** \u7F29\u7565\u56FE\u65B0\u9C9C\u5EA6 token\uFF08cloud-thumb-cache \u540C\u6B3E\u8BED\u4E49\uFF1AlastModified \u4F18\u5148\uFF0C\u9000 size\uFF09\u3002\u53D8 = \u91CD\u62C9\u8986\u76D6\u540C key\u3002 */\nexport function imageThumbToken(it) {\n    return it.lastModified != null ? `m:${it.lastModified}` : `s:${it.size ?? 0}`;\n}\n/** \u7F29\u5230\u957F\u8FB9 \u2264 max \u7684\u76EE\u6807\u5C3A\u5BF8\uFF08\u4E0D\u653E\u5927\uFF09\u3002 */\nexport function thumbTargetSize(w, h, max) {\n    const k = Math.min(1, max / Math.max(1, w, h));\n    return { w: Math.max(1, Math.round(w * k)), h: Math.max(1, Math.round(h * k)) };\n}\n/** \u62FF\u4E00\u4E2A\u4E0D\u5360\u7528\u7684 `${base}.${ext}` / `${base} N.${ext}`\uFF08\u5BFC\u51FA\u5230\u4E91\u76D8\u7528\uFF1B\u515C\u5E95\u52A0\u65F6\u95F4\u6233\u4FDD\u8BC1\u5FC5\u8FD4\u56DE\uFF09\u3002\n *  isOccupied = store.files.occupied \u6CE8\u5165\uFF08\u672C\u6A21\u5757\u4FDD\u6301\u96F6 store \u4F9D\u8D56\u53EF\u6D4B\uFF09\u3002 */\nexport async function nextFreeExportName(base, ext, isOccupied, fallbackStamp = () => Date.now()) {\n    const first = `${base}.${ext}`;\n    if (!(await isOccupied(first)))\n        return first;\n    for (let i = 1; i < 20; i++) {\n        const cand = `${base} ${i}.${ext}`;\n        if (!(await isOccupied(cand)))\n            return cand;\n    }\n    return `${base}-${fallbackStamp()}.${ext}`;\n}\n/** RGBA \u5E73\u94FA\u5230\u767D\u5E95\uFF08\u5C31\u5730\u5199\uFF0C\u8FD4\u56DE\u540C\u4E00 buffer\uFF09\uFF1Ajpeg \u65E0 alpha\uFF0C\u900F\u660E\u533A\u4E0D\u5E73\u94FA\u4F1A\u7CCA\u6210\u9ED1\u3002 */\nexport function flattenOntoWhite(data) {\n    for (let i = 0; i < data.length; i += 4) {\n        const a = data[i + 3];\n        if (a === 255)\n            continue;\n        const inv = 255 - a;\n        data[i] = (data[i] * a + 255 * inv + 127) / 255 | 0;\n        data[i + 1] = (data[i + 1] * a + 255 * inv + 127) / 255 | 0;\n        data[i + 2] = (data[i + 2] * a + 255 * inv + 127) / 255 | 0;\n        data[i + 3] = 255;\n    }\n    return data;\n}\n", "// \u5E27\u95E8\uFF08gallery \u9632\u8BEF\u89E6\uFF09\uFF1A\u624B\u6307\u6309\u4F4F\u671F\u95F4\uFF08+\u62AC\u8D77\u540E\u77ED\u5C3E\uFF09\u5230\u8FBE\u7684\u5217\u8868\u5E27\u5148\u6263\u4F4F\u3001\u53EA\u7559\u6700\u65B0\uFF0C\u95E8\u5F00\u65F6\u518D\u4E0A\u5C4F\u3002\n// \u4FEE\u300C\u6B63\u597D\u5728\u70B9\u7684\u65F6\u5019 store sync \u5B8C\u6210 \u2192 tile \u4F4D\u79FB \u2192 \u70B9\u9519/\u8FDB\u9519\u6587\u6863\u300D\uFF08user 2026-08-19\uFF09\u3002\n//\n// \u7EAF\u903B\u8F91\u96F6 DOM\uFF08timers \u53EF\u6CE8\u5165\uFF0Cnode \u76F4\u6D4B\uFF09\uFF1Bpointer \u4E8B\u4EF6\u63A5\u7EBF\u5728 gallery.ts\u3002\n//\n// \u8BED\u4E49\uFF1A\n// - push(frame)\uFF1A\u95E8\u5F00 \u2192 \u7ACB\u5373 apply\uFF1B\u95E8\u5173 \u2192 \u9876\u6389\u65E7 pending \u53EA\u7559\u6700\u65B0\uFF08\u5E27\u662F\u5168\u91CF\u5FEB\u7167\uFF0C\u4E2D\u95F4\u5E27\u65E0\u4EF7\u503C\uFF09\u3002\n// - pointerDown/pointerUp\uFF1A\u591A\u6307\u8BA1\u6570\uFF1B\u6700\u540E\u4E00\u6307\u62AC\u8D77\u540E\u518D\u7B49 tailMs \u624D\u771F\u6B63\u5F00\u95E8\uFF08\u76D6\u4F4F touch\u2192click \u6D3E\u53D1\u7A97\u53E3\uFF09\u3002\n// - maxHoldMs \u4FDD\u9669\u4E1D\uFF1Apointerup \u4E22\u5931\uFF08\u6D4F\u89C8\u5668 quirk / \u9875\u9762\u5207\u8D70\uFF09\u4F1A\u8BA9\u95E8\u6C38\u95ED \u2192 \u5230\u70B9\u5F3A\u5236\u5F00\u95E8\u3002\n//   \u5B81\u53EF\u5C0F\u6982\u7387\u4F4D\u79FB\uFF0C\u4E0D\u53EF\u56FE\u5E93\u51BB\u7ED3\u3002\n// - reset()\uFF1A\u5378\u8F7D/\u515C\u5E95\u2014\u2014\u6E05\u8BA1\u6570\u3001\u7ACB\u5373\u5F00\u95E8\uFF08pending \u7167\u5E38 apply\uFF09\u3002\nconst REAL_TIMERS = {\n    set: (fn, ms) => setTimeout(fn, ms),\n    clear: (h) => clearTimeout(h),\n};\nexport function createFrameGate(apply, opts) {\n    const tailMs = opts?.tailMs ?? 300;\n    const maxHoldMs = opts?.maxHoldMs ?? 10_000;\n    const timers = opts?.timers ?? REAL_TIMERS;\n    let pointers = 0; // \u5F53\u524D\u6309\u7740\u7684\u6307\u5934\u6570\uFF08up \u65E0\u914D\u5BF9 down \u65F6\u94B3\u5728 0\uFF0C\u4E0D\u8D8A\u754C\uFF09\n    let held = false;\n    let pending = null;\n    let hasPending = false; // \u4E0E pending!=null \u5206\u5F00\u2014\u2014T \u672C\u8EAB\u53EF\u4E3A null \u5F62\u72B6\n    let tailTimer = null;\n    let capTimer = null;\n    function clearTail() { if (tailTimer != null) {\n        timers.clear(tailTimer);\n        tailTimer = null;\n    } }\n    function clearCap() { if (capTimer != null) {\n        timers.clear(capTimer);\n        capTimer = null;\n    } }\n    function open() {\n        held = false;\n        clearTail();\n        clearCap();\n        if (hasPending) {\n            const f = pending;\n            pending = null;\n            hasPending = false;\n            apply(f);\n        }\n    }\n    return {\n        push(frame) {\n            if (held) {\n                pending = frame;\n                hasPending = true;\n            }\n            else\n                apply(frame);\n        },\n        pointerDown() {\n            pointers++;\n            clearTail(); // \u5C3E\u5DF4\u671F\u95F4\u53C8\u6309\u4E0B \u2192 \u53D6\u6D88\u9884\u5B9A\u7684\u5F00\u95E8\uFF0C\u7EE7\u7EED\u6301\u95E8\n            if (!held) {\n                held = true;\n                capTimer = timers.set(open, maxHoldMs);\n            }\n        },\n        pointerUp() {\n            if (pointers > 0)\n                pointers--;\n            if (pointers === 0 && held) {\n                clearTail();\n                tailTimer = timers.set(open, tailMs);\n            }\n        },\n        reset() { pointers = 0; open(); },\n        isHeld: () => held,\n    };\n}\n", "// first-frame-watchdog.ts \u2014\u2014 \u56FE\u5E93\u9996\u5E27\u770B\u95E8\u72D7\uFF08\u7EAF\u903B\u8F91\u96F6 DOM\uFF1Btimers \u53EF\u6CE8\u5165\uFF0Cnode \u76F4\u6D4B\uFF09\u3002\n// created 2026-08-31 by Claude Fable 5.\n//\n// \u6848\u53D1 2026-08-31\uFF08iPad \u4E3B\u5C4F PWA\uFF0C\u957F\u753B\u591A\u6B21\u9501\u5C4F\u540E\u56DE\u56FE\u5E93\uFF09\uFF1Astore.watchFolder \u7684\u9996\u5E27\u6C38\u8FDC\u4E0D\u6765 \u2192\n//   \u56FE\u5E93 loading \u7A7A\u767D\uFF08\u800C\u4E14 loading \u6587\u5B57\u88AB v-show \u4E00\u8D77\u85CF\u4E86\uFF0C\u89C1 gallery.ts A1\uFF09\u2192 \u7528\u6237\u53EA\u80FD\u91CD\u5F00 app \u78B0\u8FD0\u6C14\u3002\n//   \u770B\u95E8\u72D7\u628A\u300C\u7B49\u4E0D\u5230\u300D\u53D8\u6210\u53EF\u89C1\u3001\u53EF\u81EA\u6551\uFF1A\u5230\u70B9\u62A5 stall\uFF0Cgallery.ts \u663E\u300C\u8BFB\u53D6\u8D85\u65F6 + \u91CD\u8BD5\u300D\u5E76\u4E0A\u62A5/\u8BB0\u65E5\u5FD7\u3002\n//\n// \u8BED\u4E49\uFF1A\n// - arm(folder)\uFF1A\u5F00\u59CB\u7B49\u8BE5\u5939\u9996\u5E27\uFF08\u66FF\u6362\u4E0A\u4E00\u6B21 arm\uFF1B\u540C\u5939\u91CD arm \u4E5F\u91CD\u7F6E\u8BA1\u65F6\uFF09\u3002\n// - frame(folder)\uFF1A\u8BE5\u5939\u6765\u5E27 \u2192 \u89E3\u9664\uFF1B**\u522B\u5939**\u7684\u5E27\u4E0D\u7B97\uFF08\u6362\u5939\u9014\u4E2D\u7684\u65E7\u5E27\u4E0D\u80FD\u66FF\u65B0\u5939\u9500\u8D26\uFF09\u3002\n// - cancel()\uFF1A\u9000\u8BA2/\u6362\u89C6\u56FE/\u65E0\u5E93 \u2192 \u89E3\u9664\uFF0C\u4E0D\u518D\u89E6\u53D1\u3002\n// - \u5230\u70B9\u672A\u89E3\u9664 \u2192 onStall({ folder, elapsedMs }) \u6070\u597D\u4E00\u6B21\uFF1B\u4E4B\u540E\u53EA\u6709\u518D arm \u624D\u4F1A\u518D\u62A5\u3002\nconst REAL_TIMERS = {\n    set: (fn, ms) => setTimeout(fn, ms),\n    clear: (h) => clearTimeout(h),\n};\nexport function createFirstFrameWatchdog(onStall, opts) {\n    const timeoutMs = opts?.timeoutMs ?? 8000;\n    const timers = opts?.timers ?? REAL_TIMERS;\n    const now = opts?.now ?? (() => Date.now());\n    let handle = null;\n    let folder = null;\n    let armedAt = 0;\n    function disarm() {\n        if (handle != null) {\n            timers.clear(handle);\n            handle = null;\n        }\n        folder = null;\n    }\n    return {\n        arm(f) {\n            disarm();\n            folder = f;\n            armedAt = now();\n            handle = timers.set(() => {\n                const elapsedMs = now() - armedAt;\n                const stalledFolder = folder ?? f;\n                handle = null;\n                folder = null;\n                onStall({ folder: stalledFolder, elapsedMs });\n            }, timeoutMs);\n        },\n        frame(f) {\n            if (folder !== null && f === folder)\n                disarm();\n        },\n        cancel() { disarm(); },\n        isArmed: () => handle != null,\n    };\n}\n", "// diag-log.ts \u2014\u2014 \u8BBE\u5907\u8BCA\u65AD\u65E5\u5FD7\uFF08\u73AF\u5F62\u3001device-kv \u6301\u4E45\uFF1B\u2630 dev \u9875\u300C\u8BCA\u65AD\u65E5\u5FD7\u300D\u7A97\u53E3\u7684\u6570\u636E\u6E90\uFF09\u3002\n// created 2026-08-31 by Claude Fable 5\uFF08user 2026-08-31\u300Cdev \u91CC\u9762\u52A0\u4E00\u4E2A\u65E5\u5FD7\u7A97\u53E3\u548C\u62F7\u8D1D\u6309\u94AE\u300D\uFF09\u3002\n//\n// \u4E3A\u4EC0\u4E48\u5B58\u5728\uFF1AiPad \u4E0A\u6CA1\u6709 console\uFF0CreportError \u6A2A\u5E45\u4E00\u95EA\u5373\u901D\u2014\u20142026-08-31\u300C\u56FE\u5E93\u7A7A\u767D + \u767B\u5F55\u6302\u4E0D\u4E0A + \u51ED\u8BC1 1\u20132 \u5C0F\u65F6\n//   \u5C31\u6389\u300D\u6848\u53EA\u80FD\u9760\u56DE\u5FC6\u590D\u76D8\u3002\u8FD9\u662F app \u7684\u9ED1\u5323\u5B50\uFF1A\u51FA\u4E8B\u540E\u6253\u5F00 dev \u9875\u590D\u5236\u4E00\u6BB5\uFF0C\u7C98\u7ED9\u5F00\u53D1\u8005\u3002\n//\n// \u8BBE\u8BA1\uFF1A\n// - \u4E09\u6761\u6570\u636E\u6E90\uFF1A\u2460 reportError\uFF08\u5168 app + store \u552F\u4E00\u6C47\u62E2\u70B9\uFF0C**\u5168\u90E8\u7EA7\u522B**\u542B log\uFF09\u2461 \u5185\u8054 bootstrap \u7684 window error /\n//   unhandledrejection\uFF08\u7ECF error-badge \u63A5\u7BA1\u7684 __wp_showFatal\uFF09\u2462 \u9762\u5305\u5C51 note(tag, msg)\uFF08boot \u6302\u5E93\u3001auth \u7FFB\u724C\u3001\n//   \u56FE\u5E93\u8BA2\u9605/\u9996\u5E27/\u8D85\u65F6\u3001\u9875\u9762\u53EF\u89C1\u6027\u3001\u5728\u7EBF\u6001\u2014\u2014\u6CA1\u6709\u8FD9\u4E9B\uFF0C\u4E00\u4E32\u9519\u8BEF\u6CA1\u6709\u65F6\u95F4\u7EBF\u53EF\u5BF9\uFF09\u3002\n// - \u5B58\u50A8\uFF1Adevice-kv \u5355\u952E `diag-log`\uFF08localStorage\uFF0C\u540C\u6B65\u3001**\u4E0D\u4F9D\u8D56 IDB**\u2014\u2014IDB \u6B63\u662F\u672C\u6848\u5ACC\u7591\u4EBA\uFF0C\u9ED1\u5323\u5B50\u4E0D\u80FD\u4F4F\u5728\n//   \u5ACC\u7591\u4EBA\u5BB6\u91CC\uFF09\u3002\u73AF 300 \u6761\u3001\u5355\u6761 \u2264 600 \u5B57\u7B26\uFF08\u2248 \u6700\u574F 180KB\uFF0ClocalStorage 5MB \u914D\u989D\u5185\uFF09\uFF1B\u5199\u5165 250ms \u5408\u5E76 + pagehide \u7ACB\u5373 flush\u3002\n// - \u53EA\u8FDB\u4E0D\u51FA\uFF1A\u672C\u6A21\u5757\u4E0D import error-badge / i18n / store\uFF08\u9632\u73AF\uFF1B\u81EA\u5DF1\u574F\u4E86\u4E5F\u4E0D report\u2014\u2014\u9ED1\u5323\u5B50\u9759\u9ED8\uFF09\u3002\n// - \u4E0D\u662F telemetry\uFF1A\u6C38\u4E0D\u4E0A\u4F20\uFF1B\u53EA\u6709\u7528\u6237\u5728 dev \u9875\u70B9\u300C\u590D\u5236\u300D\u5B57\u8282\u624D\u79BB\u5F00\u8BBE\u5907\u3002\u8FD8\u539F\u51FA\u5382\uFF08factory-reset \u6E05 device-kv \u524D\u7F00\uFF09\u4E00\u5E76\u6E05\u6389\u3002\nimport { deviceKvGetJson, deviceKvSetJson } from \"../device-kv.js\";\n// \u5305\u5316\uFF1Aapp \u540D\u4E0E\u7248\u672C\u7531\u5BBF\u4E3B initDiagLog({ app, version }) \u6CE8\u5165\uFF08\u539F import WEEBPAINT_VERSION\uFF09\u3002\nlet _app = \"app\", _version = \"0.0.0\";\nconst KEY = \"diag-log\";\nconst MAX_ENTRIES = 500; // 2026-09-06 300\u2192500\uFF1A\u8FC7\u591C session \u7684\u53EF\u89C1\u6027/\u5728\u7EBF\u9762\u5305\u5C51\u4F1A\u628A\u4E8B\u6545\u9876\u51FA\u73AF\uFF08\u6668\u6848\uFF09\nconst MAX_MSG = 600;\nconst FLUSH_MS = 250;\nlet _entries = null;\nlet _flushTimer = null;\nfunction isEntry(x) {\n    const e = x;\n    return !!e && typeof e.t === \"number\" && typeof e.l === \"string\" && typeof e.m === \"string\";\n}\nfunction load() {\n    if (_entries)\n        return _entries;\n    const raw = deviceKvGetJson(KEY, null);\n    _entries = Array.isArray(raw) ? raw.filter(isEntry).slice(-MAX_ENTRIES) : [];\n    return _entries;\n}\nfunction scheduleFlush() {\n    if (_flushTimer != null)\n        return;\n    _flushTimer = setTimeout(flush, FLUSH_MS);\n}\n/** \u7ACB\u5373\u843D\u76D8\uFF08pagehide / \u6E05\u7A7A\u65F6\u8C03\uFF1B\u5E73\u65F6 250ms \u5408\u5E76\uFF09\u3002\u5B58\u50A8\u4E0D\u53EF\u7528\u65F6 device-kv \u5185\u5B58\u964D\u7EA7\uFF0C\u672C\u51FD\u6570\u4E0D\u629B\u3002 */\nexport function flush() {\n    if (_flushTimer != null) {\n        clearTimeout(_flushTimer);\n        _flushTimer = null;\n    }\n    if (_entries) {\n        try {\n            deviceKvSetJson(KEY, _entries);\n        }\n        catch { /* \u9ED1\u5323\u5B50\u81EA\u5DF1\u574F\u4E86\uFF1A\u9759\u9ED8 */ }\n    }\n}\n/** \u8BB0\u4E00\u6761\u3002msg \u622A\u5230 600 \u5B57\u7B26\uFF1B\u73AF\u6EE1\u4E22\u6700\u65E7\u3002 */\nexport function record(level, msg) {\n    const arr = load();\n    arr.push({ t: Date.now(), l: level, m: String(msg).slice(0, MAX_MSG) });\n    if (arr.length > MAX_ENTRIES)\n        arr.splice(0, arr.length - MAX_ENTRIES);\n    scheduleFlush();\n}\n/** \u9762\u5305\u5C51\uFF08\u975E\u9519\u8BEF\u7684\u65F6\u95F4\u7EBF\u4E8B\u4EF6\uFF09\u3002tag \u77ED\u8BCD\uFF1Aboot / auth / gallery / page / net\u3002 */\nexport function note(tag, msg) { record(\"note\", `[${tag}] ${msg}`); }\nexport function entries() { return load(); }\nexport function clear() { _entries = []; flush(); }\nconst LEVEL_TAG = { error: \"E\", warning: \"W\", info: \"I\", log: \"L\", note: \"\u00B7\" };\nfunction pad(n, w = 2) { return String(n).padStart(w, \"0\"); }\nfunction fmtTime(t) {\n    const d = new Date(t);\n    return `${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}.${pad(d.getMilliseconds(), 3)}`;\n}\nfunction env() {\n    const g = globalThis;\n    const nav = g.navigator, loc = g.location;\n    const standalone = nav && \"standalone\" in nav ? ` standalone=${String(nav.standalone)}` : \"\";\n    return [\n        `${_app} ${_version}`,\n        `route=${loc?.origin ?? \"\"}${loc?.pathname ?? \"\"}${standalone}`,\n        `online=${String(nav?.onLine)} visibility=${g.document?.visibilityState ?? \"?\"}`,\n        `ua=${nav?.userAgent ?? \"?\"}`,\n        `exported=${fmtTime(Date.now())} (local time)`,\n    ].join(\"\\n\");\n}\n/** \u590D\u5236/\u5C55\u793A\u7528\u7684\u6574\u6BB5\u6587\u672C\uFF1A\u73AF\u5883\u5934 + \u6BCF\u6761\u4E00\u884C\u300CMM-DD HH:MM:SS.mmm L msg\u300D\uFF08\u65E7\u5728\u4E0A\u3001\u65B0\u5728\u4E0B\uFF09\u3002 */\nexport function toText() {\n    const lines = load().map((e) => `${fmtTime(e.t)} ${LEVEL_TAG[e.l] ?? \"?\"} ${e.m}`);\n    return env() + \"\\n----\\n\" + (lines.length ? lines.join(\"\\n\") : \"(empty)\");\n}\n/** boot \u671F\u8C03\u4E00\u6B21\uFF1A\u9875\u9762\u751F\u547D\u5468\u671F / \u5728\u7EBF\u6001\u9762\u5305\u5C51 + pagehide flush\u3002record() \u4E0D\u4F9D\u8D56\u5B83\uFF08\u61D2\u52A0\u8F7D\uFF09\u3002 */\nexport function initDiagLog(opts = {}) {\n    if (opts.app)\n        _app = opts.app;\n    if (opts.version)\n        _version = opts.version;\n    const g = globalThis;\n    if (!g.addEventListener || !g.document)\n        return;\n    note(\"boot\", `${_version} ${g.location?.pathname ?? \"\"} online=${String(g.navigator?.onLine)}`);\n    g.document.addEventListener(\"visibilitychange\", () => note(\"page\", `visibility=${g.document.visibilityState}`));\n    g.addEventListener(\"pagehide\", (e) => { note(\"page\", `pagehide persisted=${String(e.persisted)}`); flush(); });\n    g.addEventListener(\"pageshow\", (e) => note(\"page\", `pageshow persisted=${String(e.persisted)}`));\n    g.addEventListener(\"online\", () => note(\"net\", \"online\"));\n    g.addEventListener(\"offline\", () => note(\"net\", \"offline\"));\n}\n", "import { note as diagNote } from \"../guards/diag-log.js\"; // 0.8.7\uFF1A\u6CA1\u914D\u5E93\u540D\u65F6\u8BB0\u4E00\u6B21\nconst mintId = () => \"g\" + Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\nconst oneDriveLabel = (username) => \"OneDrive \u00B7 \" + (username || \"\u8D26\u53F7\");\n// legacy \u8FDE\u7EED\u6027\uFF08P3 Slice C \u62CD\u5B9A\uFF09\uFF1A\u8BA4\u9886 \"defaultStore\" \u547D\u540D\u7A7A\u95F4\u7684\u90A3\u4E2A\u6761\u76EE\uFF0Cid \u540C\u65F6\u53D6 **\"default\"**\n//   \uFF08= SOLE_GALLERY_ID\uFF09\u2014\u2014\u9501\u540D `default:\u540D`\u3001\u56DE\u6267\u6761\u952E `resume:default` \u4E0E P3 \u524D\u9010\u5B57\u8282\u76F8\u540C\uFF0C\u96F6\u8FC1\u79FB\u3002\nconst LEGACY_ID = \"default\";\nconst LEGACY_DB = \"defaultStore\";\nexport function createGalleryRegistry(kv) {\n    const findSame = async (entries, handle) => {\n        for (const e of entries) {\n            if (e.kind !== \"folder\" || !e.handle)\n                continue;\n            try {\n                if (await e.handle.isSameEntry(handle))\n                    return e;\n            }\n            catch { /* \u53E5\u67C4\u5931\u6D3B \u2192 \u89C6\u4E3A\u4E0D\u540C */ }\n        }\n        return null;\n    };\n    return {\n        list: () => kv.list(),\n        async mintFolder(handle) {\n            const entries = await kv.list();\n            const same = await findSame(entries, handle);\n            if (same) {\n                const fresh = { ...same, handle, label: handle.name || same.label }; // \u590D\u7528 id + \u53E5\u67C4/\u6807\u7B7E\u5237\u65B0\n                await kv.put(fresh);\n                return fresh;\n            }\n            const id = mintId();\n            const e = { id, kind: \"folder\", label: handle.name || \"\u6587\u4EF6\u5939\", dbId: `gallery-${id}`, handle, lastActive: null, createdAt: Date.now() };\n            await kv.put(e);\n            return e;\n        },\n        async mintOneDrive(homeAccountId, username) {\n            const entries = await kv.list();\n            const same = entries.find((e) => e.kind === \"onedrive\" && e.homeAccountId === homeAccountId);\n            if (same) {\n                const fresh = { ...same, label: oneDriveLabel(username) };\n                await kv.put(fresh);\n                return fresh;\n            }\n            const legacyFree = !entries.some((e) => e.dbId === LEGACY_DB);\n            const id = legacyFree ? LEGACY_ID : mintId();\n            const e = { id, kind: \"onedrive\", label: oneDriveLabel(username), dbId: legacyFree ? LEGACY_DB : `gallery-${id}`, homeAccountId, lastActive: null, createdAt: Date.now() };\n            await kv.put(e);\n            return e;\n        },\n        async touch(id) {\n            const e = (await kv.list()).find((x) => x.id === id);\n            if (e)\n                await kv.put({ ...e, lastActive: Date.now() });\n        },\n        async clearLastActive() {\n            for (const e of await kv.list())\n                if (e.lastActive !== null)\n                    await kv.put({ ...e, lastActive: null });\n        },\n        async relabel(id, label) {\n            const e = (await kv.list()).find((x) => x.id === id);\n            if (e && label && e.label !== label)\n                await kv.put({ ...e, label });\n        },\n        forget: (id) => kv.delete(id),\n        async lastActive() {\n            let best = null;\n            for (const e of await kv.list())\n                if (e.lastActive !== null && (!best || e.lastActive > best.lastActive))\n                    best = e;\n            return best;\n        },\n        async seedLegacyOneDrive(p) {\n            if (!p.homeAccountId)\n                return;\n            const entries = await kv.list();\n            if (entries.some((e) => e.kind === \"onedrive\" && e.homeAccountId === p.homeAccountId))\n                return; // \u5E42\u7B49\uFF1A\u89C1\u8FC7\u5C31\u4E0D\u518D\u64AD\n            const legacyFree = !entries.some((e) => e.dbId === LEGACY_DB);\n            const id = legacyFree ? LEGACY_ID : mintId();\n            await kv.put({\n                id, kind: \"onedrive\", label: oneDriveLabel(p.username), homeAccountId: p.homeAccountId,\n                dbId: legacyFree ? LEGACY_DB : `gallery-${id}`, // \u65E2\u6709\u7528\u6237\u7684\u6570\u636E\u7269\u7406\u5728 defaultStore\u2014\u2014\u6761\u76EE\u8BA4\u9886\u5B83\uFF08id \u540C\u53D6 \"default\"\uFF09\uFF0C\u96F6\u8FC1\u79FB\n                lastActive: Date.now(),\n                createdAt: Date.now(),\n            });\n        },\n    };\n}\n// \u2500\u2500\u2500 IDB \u9002\u914D\u5668\uFF08\u6D4F\u89C8\u5668\uFF1Bnode \u6D4B\u8BD5\u7528 Map \u5047\u4EF6\u66FF\u4EE3\u672C\u6BB5\u3002\u5F62\u72B6\u6284 crash-store\uFF0C\u523B\u610F WET\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// 0.8.7\uFF08\u9053 6 F-58 \u00A78 \u7B2C 2 \u4EF6\uFF0Cuser 2026-10-21\u300Cgallery-registry \u5E93\u540D\u6539\u5BBF\u4E3B\u4F20 \u53EF\u4EE5\u300D\uFF09\uFF1A\u5E93\u540D\u5F52\u5BBF\u4E3B\u2014\u2014\u8FD9\u662F\u5BBF\u4E3B\u7684\u8BBE\u5907\u8BB0\u4E8B\u672C\uFF08ADR-0024\uFF09\uFF0C\u4E0D\u8BE5\u5E26 WeebPaint \u7684 GUID \u5199\u6B7B\u5728\u5305\u91CC\u3002\n//   configureGalleryRegistry({ dbName }) \u5728\u7B2C\u4E00\u6B21\u5F00\u5E93\u4E4B\u524D\u914D\uFF1B\u6CA1\u914D = \u9000\u56DE\u8001\u5B57\u9762\u91CF\uFF08\u65E2\u6709 WeebPaint \u7528\u6237\u96F6\u8FC1\u79FB\uFF09+ diag \u8BB0\u4E00\u6B21\uFF1B\u5F00\u8FC7\u5E93\u518D\u914D = \u7F16\u7A0B\u9519\u8BEF\uFF0C\u54CD\u4EAE\u629B\u3002\nconst LEGACY_DB_NAME = \"weebpaint-bd6cece69075d759.gallery-registry\";\nconst STORE = \"entries\"; // key = \u94F8\u7684 id\nlet _dbName = null;\nlet _opened = false;\nlet _warnedLegacy = false;\nexport function configureGalleryRegistry(opts) {\n    if (!opts?.dbName)\n        throw new Error(\"configureGalleryRegistry: dbName required\");\n    if (_opened)\n        throw new Error(`configureGalleryRegistry: too late \u2014 the registry database was already opened as \"${_dbName ?? LEGACY_DB_NAME}\" (configure before the first gallery call)`);\n    _dbName = opts.dbName;\n}\n/** \u5B9E\u9645\u7528\u7684\u5E93\u540D\uFF08\u6CA1\u914D = \u8001\u5B57\u9762\u91CF\uFF09\uFF1B\u6D4B\u8BD5 / \u8BCA\u65AD\u7528\u3002 */\nexport function galleryRegistryDbName() { return _dbName ?? LEGACY_DB_NAME; }\nlet _dbPromise = null;\nfunction _openDB() {\n    if (_dbPromise)\n        return _dbPromise;\n    if (!_dbName && !_warnedLegacy) {\n        _warnedLegacy = true;\n        diagNote(\"gallery\", `gallery-registry: host did not call configureGalleryRegistry({ dbName }); using legacy database name \"${LEGACY_DB_NAME}\"`);\n    }\n    _opened = true;\n    _dbPromise = new Promise((resolve, reject) => {\n        const req = indexedDB.open(galleryRegistryDbName(), 1);\n        req.onupgradeneeded = () => { const db = req.result; if (!db.objectStoreNames.contains(STORE))\n            db.createObjectStore(STORE); };\n        req.onsuccess = () => { req.result.onversionchange = () => { req.result.close(); _dbPromise = null; }; resolve(req.result); };\n        req.onerror = () => { _dbPromise = null; reject(req.error); };\n        req.onblocked = () => reject(new Error(\"gallery-registry db upgrade blocked\"));\n    });\n    return _dbPromise;\n}\nfunction _tx(mode, run) {\n    return _openDB().then((db) => new Promise((resolve, reject) => {\n        const tx = db.transaction(STORE, mode);\n        let out;\n        try {\n            out = run(tx.objectStore(STORE));\n        }\n        catch (e) {\n            reject(e);\n            return;\n        }\n        tx.oncomplete = () => resolve(out ? out.result : undefined);\n        tx.onerror = () => reject(tx.error);\n        tx.onabort = () => reject(tx.error ?? new Error(\"gallery-registry db tx aborted\"));\n    }));\n}\nexport function idbRegistryKV() {\n    return {\n        put: (e) => _tx(\"readwrite\", (s) => { s.put(e, e.id); }),\n        delete: (id) => _tx(\"readwrite\", (s) => { s.delete(id); }),\n        list: async () => (await _tx(\"readonly\", (s) => s.getAll())) ?? [],\n    };\n}\n/** \u6D4F\u89C8\u5668\u5355\u4F8B\uFF08\u61D2\u5F00\u5E93\uFF1Aimport \u672C\u8EAB\u96F6 IDB \u8BBF\u95EE\uFF0Cnode \u6D4B\u8BD5 import \u5B89\u5168\uFF09\u3002 */\nexport const galleryRegistry = createGalleryRegistry(idbRegistryKV());\n", "// library-backup.ts \u2014\u2014 #18\u300C\u4E0B\u8F7D\u5168\u5E93\u5907\u4EFD\u300D\u7684\u903B\u8F91\u5185\u6838\u3002\n// created 2026-08-28 by Claude Opus 5 (subagent)\u3002\n//\n// **\u7EAF\u6A21\u5757**\uFF1A\u96F6 store / \u96F6 DOM / \u96F6\u7F51\u7EDC \u2014\u2014 \u5217\u4E3E\u3001\u8BFB\u5B57\u8282\u3001\u6253\u5305\u3001\u4E0B\u8F7D\u5168\u662F\u6CE8\u5165\u7684\u7AEF\u53E3\uFF08\u2192 node \u53EF\u6D4B\uFF09\u3002\n//\n// \u4E3A\u4EC0\u4E48\u8981\u81EA\u5DF1\u8D70\u4E00\u904D\u6811\uFF1Astore \u7684**\u552F\u4E00\u5217\u4E3E\u9762 = files.watchFolder\uFF08\u8BA2\u9605\u5F53\u524D\u5939\uFF09**\uFF08app-store.ts \u5934\u6CE8\u91CA +\n//   \u5E93 create-store.ts\u300C\u7F51\u76D8\u6A21\u578B\u300D\uFF09\u2014\u2014\u6CA1\u6709\u4E5F\u4E0D\u4F1A\u6709\u5168\u5E93\u5217\u4E3E API\uFF08\u5168\u6811 list \u662F\u88AB\u5426\u51B3\u7684\u9000\u5316\u8BBE\u8BA1\uFF09\u3002\n//   \u6240\u4EE5\u300C\u6574\u5E93\u6E05\u5355\u300D\u53EA\u80FD\u9010\u5939\u4E00\u6B21\u6027\u5FEB\u7167 + \u9012\u5F52\u3002\u672C\u6A21\u5757\u628A\u8FD9\u6761\u8DEF\u62C6\u6210\u56DB\u4EF6\u53EF\u6D4B\u7684\u4E1C\u897F\uFF1A\n//     \u2460 snapshotFolderOnce \u2014\u2014 \u628A\u8BA2\u9605\u5F0F\u300C\u4E24\u5E27\u8282\u5F8B\u300D\uFF08\u7ACB\u5373\u672C\u5730\u5E27 \u2192 \u4E91\u7AEF\u5E27\uFF09\u6536\u6210\u4E00\u6B21\u6027 Promise\uFF0C\u62FF\u5230\n//        \u6743\u5A01\u5E27\uFF08complete\uFF09\u5373\u9000\u8BA2\uFF1B\u62FF\u4E0D\u5230\u5C31\u8BDA\u5B9E\u6807 authoritative:false\uFF08\u79BB\u7EBF/\u672A\u767B\u5F55/\u5217\u4E3E\u5931\u8D25\uFF09\u3002\n//     \u2461 walkLibrary        \u2014\u2014 BFS \u9012\u5F52\u6210\u6241\u5E73\u6E05\u5355\uFF08\u53BB\u91CD / \u9632\u73AF / \u4E0A\u9650 / \u8BB0\u4E0B\u5217\u4E0D\u5168\u7684\u5939\uFF09\u3002\n//     \u2462 createByteBudget   \u2014\u2014 \u7D2F\u8BA1\u5B57\u8282\u9884\u7B97\uFF1A\u8D85\u4E86\u5C31\u4ECE\u90A3\u4E00\u4EF6\u8D77\u6539\u300C\u9010\u4EF6\u4E0B\u8F7D\u300D\uFF08\u5185\u5B58\u62A4\u680F\uFF09\u3002\n//     \u2463 runLibraryBackup   \u2014\u2014 \u7F16\u6392\uFF1A\u9010\u4EF6\u8BFB\u5B57\u8282 \u2192 \u8FDB zip \u6216\u6EA2\u51FA\u9010\u4EF6\u4E0B\u8F7D \u2192 \u8BDA\u5B9E\u56DE\u6267\uFF08\u5931\u8D25\u6E05\u5355\u4E0D\u541E\uFF09\u3002\n//\n// **\u5907\u4EFD\u662F\u53EA\u8BFB\u52A8\u4F5C**\uFF1A\u672C\u6A21\u5757\u53EA\u7ECF readBytes \u7AEF\u53E3\u8BFB\uFF0C\u7EDD\u4E0D\u5199\u5E93\u3001\u7EDD\u4E0D\u78B0\u540C\u6B65\u6001\u3002\n// \u52A0\u5BC6\u4F5C\u54C1\u7ED9\u4E0D\u7ED9\u5BC6\u6587\u7531\u7AEF\u53E3\u4FA7\u51B3\u5B9A\uFF08\u5BBF\u4E3B\u63A5 getEncryptedBlob\uFF09\u2014\u2014**\u660E\u6587\u6C38\u4E0D\u843D\u5907\u4EFD\u5305**\u662F\u7EA2\u7EBF\uFF0C\n//   \u672C\u6A21\u5757\u4E0D\u8BA4\u8BC6\u5185\u5BB9\u683C\u5F0F\uFF0C\u4E5F\u4E0D\u505A\u4EFB\u4F55\u89E3\u5BC6\u3002\nimport { downloadStamp } from \"../naming.js\"; // \u5305\u5185 core/naming.ts\n/** \u5907\u4EFD zip \u7684\u5185\u5B58\u62A4\u680F\uFF08\u8D85\u8FC7\u5C31\u4E0D\u518D\u5F80\u5305\u91CC\u585E\uFF0C\u5269\u4E0B\u7684\u9010\u4EF6\u4E0B\u8F7D\uFF09\u3002\u5E38\u91CF\u53EF\u8C03\u3002 */\nexport const BACKUP_BUDGET_BYTES = 512 * 1024 * 1024;\nconst toProbe = (folder, snap) => ({\n    folder,\n    files: (snap?.items ?? []).map((it) => ({ identifier: it.identifier, size: it.size, syncState: it.syncState })),\n    folders: snap?.folders ?? [],\n    authoritative: snap?.complete === true && snap.stale !== true,\n});\n/** \u8BA2\u9605 \u2192 \u4E00\u6B21\u6027\u5FEB\u7167\u3002\u9000\u51FA\u6761\u4EF6\uFF08\u5148\u5230\u5148\u7B97\uFF09\uFF1A\n *  \u00B7 \u6536\u5230\u6743\u5A01\u5E27\uFF08complete && !stale\uFF09\u2014\u2014\u6B63\u5E38\u5728\u7EBF\u8DEF\u5F84\uFF0C\u4E00\u6B21\u4E91\u5217\u4E3E\u5C31\u8FD4\u56DE\uFF1B\n *  \u00B7 \u6536\u5230 \u22652 \u5E27\uFF08\u5E93\u7684\u4E24\u5E27\u8282\u5F8B\uFF1A\u672C\u5730\u5E27 + \u4E91\u7AEF\u5E27\u90FD\u5230\u9F50\u4E86\uFF09\u2014\u2014\u79BB\u7EBF/\u672A\u767B\u5F55\u65F6\u4E91\u7AEF\u5E27 complete:false\uFF0C\u5C31\u662F\u7EC8\u5C40\uFF1B\n *  \u00B7 settleMs \u5185\u6CA1\u6709\u65B0\u5E27 / \u8D85\u8FC7 timeoutMs \u2014\u2014 \u515C\u5E95\uFF0C\u62FF\u624B\u4E0A\u6700\u540E\u4E00\u5E27\u8BDA\u5B9E\u8FD4\u56DE\uFF08authoritative:false\uFF09\u3002\n *  \u65E0\u8BBA\u8D70\u54EA\u6761\u90FD**\u5FC5\u5B9A\u9000\u8BA2**\uFF08\u5907\u4EFD\u7EDD\u4E0D\u7559\u4E0B\u5E38\u9A7B\u8BA2\u9605\uFF09\u3002 */\nexport function snapshotFolderOnce(watch, folder, opts = {}) {\n    const settleMs = opts.settleMs ?? 800;\n    const timeoutMs = opts.timeoutMs ?? 30_000;\n    return new Promise((resolve) => {\n        let last = null;\n        let frames = 0;\n        let settled = false;\n        let unsub = null;\n        let settleTimer = null;\n        let hardTimer = null;\n        const finish = () => {\n            if (settled)\n                return;\n            settled = true;\n            if (settleTimer)\n                clearTimeout(settleTimer);\n            if (hardTimer)\n                clearTimeout(hardTimer);\n            // \u540C\u6B65\u9996\u5E27\uFF08\u6D4B\u8BD5\u66FF\u8EAB\uFF09\u65F6 unsub \u8FD8\u6CA1\u8D4B\u503C \u2014\u2014 \u63A8\u5230 microtask \u518D\u9000\uFF0C\u4FDD\u8BC1\u4E0D\u6F0F\u9000\u8BA2\u3002\n            const off = () => { try {\n                unsub?.();\n            }\n            catch { /* store \u5DF2 dispose\uFF1A\u65E0\u6240\u8C13\uFF0C\u672C\u5C31\u662F\u8981\u9000\u8BA2 */ } };\n            if (unsub)\n                off();\n            else\n                queueMicrotask(off);\n            resolve(toProbe(folder, last));\n        };\n        const armSettle = () => {\n            if (settleTimer)\n                clearTimeout(settleTimer);\n            settleTimer = setTimeout(finish, settleMs);\n        };\n        hardTimer = setTimeout(finish, timeoutMs);\n        armSettle();\n        unsub = watch(folder, (snap) => {\n            if (settled)\n                return;\n            if (snap.folder !== folder)\n                return; // \u5E93\u5185\u5DF2\u6709\u540C\u6B3E\u5B88\u536B\uFF1B\u8FD9\u91CC\u518D\u6321\u4E00\u6B21\uFF0C\u7EDD\u4E0D\u628A\u522B\u5939\u5185\u5BB9\u7B97\u8FDB\u672C\u5939\n            last = snap;\n            frames++;\n            if (snap.complete && snap.stale !== true) {\n                finish();\n                return;\n            }\n            if (frames >= 2) {\n                finish();\n                return;\n            }\n            armSettle();\n        });\n    });\n}\n/** \u9010\u5939\u5FEB\u7167 \u2192 \u5168\u5E93\u6241\u5E73\u6E05\u5355\uFF08BFS\uFF1B\u540C path \u53BB\u91CD\u3001\u5B50\u5939\u53BB\u91CD\u9632\u73AF\u3001maxFolders \u515C\u4F4F\u75C5\u6001\u6DF1\u6811\uFF09\u3002 */\nexport async function walkLibrary(probe, opts = {}) {\n    const maxFolders = opts.maxFolders ?? 1000;\n    const queue = [opts.root ?? \"\"];\n    const seen = new Set(queue);\n    const byPath = new Map();\n    const partialFolders = [];\n    let visited = 0;\n    let truncated = false;\n    while (queue.length) {\n        if (visited >= maxFolders) {\n            truncated = true;\n            break;\n        }\n        const folder = queue.shift();\n        const p = await probe(folder);\n        visited++;\n        opts.onFolder?.(folder, visited);\n        if (!p.authoritative)\n            partialFolders.push(folder);\n        for (const f of p.files)\n            if (!byPath.has(f.identifier))\n                byPath.set(f.identifier, f);\n        for (const sub of p.folders)\n            if (!seen.has(sub)) {\n                seen.add(sub);\n                queue.push(sub);\n            }\n    }\n    const files = [...byPath.values()].sort((a, b) => (a.identifier < b.identifier ? -1 : a.identifier > b.identifier ? 1 : 0));\n    return { files, partialFolders, foldersVisited: visited, truncated };\n}\n/** \u7D2F\u8BA1\u5B57\u8282\u9884\u7B97\u3002admit \u8FD4 \"spill\" = \u8FD9\u4EF6\uFF08\u53CA\u4E4B\u540E\u5168\u90E8\uFF09\u4E0D\u8FDB zip\uFF0C\u6539\u9010\u4EF6\u4E0B\u8F7D\u3002\n *  \u4E00\u65E6\u6EA2\u51FA\u5C31**\u4E0D\u518D\u56DE\u5934**\u2014\u2014\u5305\u4E00\u65E6\u5C01\u9876\u5C31\u662F\u5C01\u9876\uFF0C\u522B\u8BA9\u5C0F\u6587\u4EF6\u63D2\u961F\u9020\u6210\u300C\u6709\u7684\u8FDB\u5305\u6709\u7684\u6CA1\u8FDB\u300D\u7684\u8FF7\u60D1\u987A\u5E8F\u3002 */\nexport function createByteBudget(budget) {\n    let used = 0;\n    let spilling = false;\n    return {\n        admit(bytes) {\n            if (spilling)\n                return \"spill\";\n            if (used + bytes > budget) {\n                spilling = true;\n                return \"spill\";\n            }\n            used += bytes;\n            return \"zip\";\n        },\n        used: () => used,\n        spilling: () => spilling,\n    };\n}\n/** \u5907\u4EFD\u5305\u6587\u4EF6\u540D = weebpaint-backup-YYYYMMDD-HHMM.zip\uFF08\u590D\u7528\u547D\u540D\u5668\u5B98\u7684\u4E0B\u8F7D\u5206\u949F\u6233\uFF09\u3002 */\nexport const backupArchiveName = (now = new Date()) => `weebpaint-backup-${downloadStamp(now)}.zip`;\n/** \u6EA2\u51FA\u9010\u4EF6\u4E0B\u8F7D\u65F6\u7684\u843D\u5730\u540D\uFF1A\u8DEF\u5F84\u5206\u9694\u7B26\u538B\u6210 `_`\uFF0C\u4FDD\u4F4F\u6765\u6E90\u5939\uFF08\u4E0D\u540C\u5939\u540C\u540D\u4E0D\u4F1A\u4E92\u76F8\u76D6\uFF09\u3002 */\nexport const spillName = (path) => path.replace(/\\//g, \"_\");\n/** \u9010\u4EF6\u53D6\u5B57\u8282 \u2192 \u8FDB\u5305\u6216\u6EA2\u51FA\u4E0B\u8F7D \u2192 \u6700\u540E\u5C01\u5305\u4EA4\u4ED8\u3002\u6574\u4E2A\u8FC7\u7A0B\u53EA\u8BFB\u3002 */\nexport async function runLibraryBackup(files, ports, opts = {}) {\n    const budget = createByteBudget(opts.budget ?? BACKUP_BUDGET_BYTES);\n    const entries = [];\n    const failed = [];\n    const spilledNames = [];\n    let bytes = 0;\n    for (let i = 0; i < files.length; i++) {\n        const path = files[i].identifier; // zip \u91CC\u7684\u6761\u76EE\u8DEF\u5F84 = \u8EAB\u4EFD\uFF08\u6587\u4EF6\u5939\u4FDD\u7559\uFF09\n        ports.onProgress?.(i, files.length, path);\n        let blob = null;\n        try {\n            blob = await ports.readBytes(path);\n        }\n        catch (e) {\n            ports.onError?.(path, e);\n            blob = null;\n        }\n        if (!blob) {\n            failed.push(path);\n            continue;\n        }\n        bytes += blob.size;\n        if (budget.admit(blob.size) === \"zip\")\n            entries.push({ path, data: blob });\n        else {\n            ports.deliver(blob, spillName(path));\n            spilledNames.push(path);\n        }\n    }\n    const zippedNames = entries.map((e) => e.path); // manifest \u8FFD\u52A0\u4E4B\u524D\u5B9A\u683C\uFF08\u8BA1\u6570/\u540D\u5355\u90FD\u4E0D\u542B manifest \u81EA\u5DF1\uFF09\n    let archiveName = null;\n    if (entries.length) {\n        archiveName = backupArchiveName(opts.now ?? new Date());\n        // \u900F\u660E\u8D26\uFF080828 user \u62CD\u677F\u65B9\u5411\uFF09\uFF1A\u5305\u5185\u81EA\u5E26 manifest\u2014\u2014\u8FDB\u5305/\u6EA2\u51FA\uFF08\u9010\u4EF6\u4E0B\u8F7D\uFF09/\u5931\u8D25\u4E09\u4EFD\u540D\u5355\u5168\u5217\uFF0C\n        //   \u79BB\u7EBF\u6253\u5F00\u5907\u4EFD\u5305\u4E5F\u80FD\u5BF9\u8D26\uFF08\u5BBF\u4E3B\u7ED9 renderManifest \u624D\u5199\uFF1B\u7EAF\u51FD\u6570\u4FDD\u6301\u96F6 i18n \u4F9D\u8D56\uFF09\u3002\n        if (opts.renderManifest) {\n            entries.push({ path: \"backup-manifest.txt\", data: new Blob([opts.renderManifest({ zipped: entries.map((e) => e.path), spilled: spilledNames, failed })], { type: \"text/plain\" }) });\n        }\n        ports.deliver(await ports.pack(entries), archiveName);\n    }\n    return {\n        total: files.length,\n        zipped: zippedNames.length,\n        zippedNames,\n        spilled: spilledNames.length,\n        spilledNames,\n        failed,\n        bytes,\n        archiveName,\n        overBudget: budget.spilling(),\n    };\n}\n", "/** \u552F\u4E00\u7684\u5DEE\u5F02\u8868\u3002**\u4E0D\u4ECE\u5305\u95E8\u724C\u5BFC\u51FA**\uFF08\u5BBF\u4E3B\u591F\u4E0D\u7740\uFF09\uFF0C\u5E76\u4E14\u51BB\u7ED3\u2014\u2014\u8C01\u4E5F\u4E0D\u80FD\u5728\u8FD0\u884C\u65F6\u6539\u5B83\u3002 */\nexport const ASIDE = deepFreeze({\n    trash: {\n        list: (f) => f.listTrash(),\n        empty: (f, scope) => f.emptyTrash({ scope }),\n        thumb: \"by-name\",\n        text: {\n            none: \"gal.empty.trash\", at: \"gal.deleted\",\n            emptyTitle: \"gal.dlg.emptyTrashTitle\", emptyMsg: \"gal.dlg.emptyTrashMsg\", emptyBusy: \"gal.busy.emptyTrash\",\n            emptyDone: \"gal.st.emptyTrashDone\", emptyNeedLogin: \"gal.st.emptyTrashCloudNeedLogin\",\n            emptyCloudFail: \"gal.st.emptyTrashCloudFail\", emptyPartial: \"gal.st.emptyTrashPartial\",\n        },\n    },\n    backup: {\n        list: (f) => f.listBackup(),\n        empty: (f, scope) => f.emptyBackup({ scope }),\n        thumb: \"none\",\n        text: {\n            none: \"gal.empty.backup\", at: \"gal.keptAside\",\n            emptyTitle: \"gal.dlg.emptyBackupTitle\", emptyMsg: \"gal.dlg.emptyBackupMsg\", emptyBusy: \"gal.busy.emptyBackup\",\n            emptyDone: \"gal.st.emptyBackupDone\", emptyNeedLogin: \"gal.st.emptyBackupCloudNeedLogin\",\n            emptyCloudFail: \"gal.st.emptyBackupCloudFail\", emptyPartial: \"gal.st.emptyBackupPartial\",\n        },\n    },\n});\nfunction deepFreeze(o) {\n    if (o && typeof o === \"object\") {\n        for (const v of Object.values(o))\n            deepFreeze(v);\n        Object.freeze(o);\n    }\n    return o;\n}\n/** store \u7684\u6401\u7F6E\u6233 `yyyymmddhhmmss` \u2192 ms\uFF1B\u89E3\u6790\u4E0D\u51FA \u2192 0\u3002\n *  \u6233\u662F\u6253\u6233\u90A3\u53F0\u8BBE\u5907\u7684\u672C\u5730\u949F\u70B9\u3001\u4E0D\u5E26\u65F6\u533A\uFF1B\u8FD9\u91CC\u6309\u672C\u673A\u65F6\u533A\u8BFB\u2014\u2014\u8DE8\u65F6\u533A\u7684\u8BBE\u5907\u4F1A\u5DEE\u51E0\u4E2A\u5C0F\u65F6\uFF0C\u53EA\u7528\u4E8E\u5C55\u793A\u548C\u6392\u5E8F\uFF0C\u4E0D\u53C2\u4E0E\u4EFB\u4F55\u5185\u5BB9\u51B3\u7B56\u3002 */\nexport function asideTime(ts) {\n    const m = /^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})$/.exec(ts ?? \"\");\n    if (!m)\n        return 0;\n    const n = m.slice(1).map(Number);\n    if (n[1] < 1 || n[1] > 12 || n[2] < 1 || n[2] > 31 || n[3] > 23 || n[4] > 59 || n[5] > 59)\n        return 0;\n    const at = new Date(n[0], n[1] - 1, n[2], n[3], n[4], n[5]).getTime();\n    return Number.isFinite(at) ? at : 0;\n}\n/** store.TrashItem \u2192 AsideItem\u3002stem / kind \u7531 store.identifiers.parse \u7ED9\uFF1B\u4E0D\u662F\u6587\u6863\uFF08\u88AB\u5220\u7684\u56FE\u7247\u7B49\uFF09\u2192 stem = \u6700\u540E\u4E00\u6BB5\u3001kind = null\u3002 */\nexport function asideItemFrom(box, it, ids) {\n    const d = ids.parse(it.identifier);\n    return {\n        box,\n        key: `${box}|${it.localKey ?? \"\"}|${it.cloudRef ?? \"\"}`,\n        identifier: it.identifier,\n        stem: d ? d.stem : it.identifier.slice(it.identifier.lastIndexOf(\"/\") + 1),\n        kind: d ? d.kind : null,\n        at: asideTime(it.ts),\n        side: it.side,\n        localKey: it.localKey ?? null,\n        cloudRef: it.cloudRef ?? null,\n        encrypted: !!it.encrypted,\n        conflictLive: !!it.conflictLive, // \u5907\u4EFD\u7BB1\u8FD9\u4E00\u4F4D store \u6052\u7ED9 false\uFF08\u5B83\u4E0D\u62FF\u6D3B\u6587\u4EF6\u540D\u5355\u53BB\u6BD4\uFF09\n    };\n}\n/** \u65B0\u7684\u5728\u524D\uFF1B\u65F6\u95F4\u89E3\u6790\u4E0D\u51FA\u7684\u6C89\u5E95\uFF1B\u540C\u523B\u6309\u540D\u5B57\u3002 */\nexport function sortAside(items, compareName) {\n    return [...items].sort((a, b) => (b.at - a.at) || compareName(a.identifier, b.identifier) || a.key.localeCompare(b.key));\n}\n", "// \u56FE\u5E93\u6570\u636E\u9762\uFF08WET \u81EA WeebPaint src/app-store.ts \u7684\u56FE\u5E93\u6BB5\uFF0C2026-09-09\uFF09\uFF1Astore.Item \u2192 GItem\uFF1B\u5F53\u524D\u5939\u8BA2\u9605\u7684\u8DEF\u7531 + \u6392\u5E8F\uFF1B\u6401\u7F6E\u533A\uFF08\u56DE\u6536\u7AD9 / \u5907\u4EFD\u7BB1\uFF09\u6620\u5C04\u3002\n// \u5E93\u552F\u4E00\u5217\u4E3E\u9762 = store.files.watchFolder\uFF08\u8BA2\u9605\u5F53\u524D\u5939\uFF09\uFF1B\u26D4 \u6C38\u4E0D list \u5168\u5E93\uFF08WeebPaint 2026-07-12 \u5220 listGallery \u7684\u5224\u51B3\uFF09\u3002\n// 0.6.0\uFF1A\u54EA\u4E9B\u662F\u6587\u6863\u3001\u4E3B\u5E72\u662F\u4EC0\u4E48\u3001\u79CD\u7C7B\u662F\u4EC0\u4E48\u5168\u7531 store.identifiers \u8BF4\uFF08\u5BBF\u4E3B\u5728 createStore \u62A5\u7684 docKinds \u8868\uFF09\uFF1B\u672C\u5305\u4E0D\u518D\u6536 isDoc / naming \u94A9\u5B50\u3002\n//   \u56FE\u7247\uFF08WeebPaint \u7684\u4E91\u76D8\u56FE\u7247\uFF09\u4ECD\u662F\u672C\u5305\u7684\u7B56\u7565\uFF08policy.isImage\uFF09\uFF1A\u5B83\u4EEC\u4E0D\u662F\u6587\u6863\uFF0Cstore \u4E0D\u8BA4\u8BC6\u3002\nimport { isCached } from \"@internal/store\";\nimport { ASIDE, asideItemFrom, sortAside } from \"./model/aside.js\";\nimport { isImagePath } from \"./model/cloud-image-model.js\";\nimport { naturalCompare } from \"./model/natural-order.js\";\nconst basename = (p) => p.slice(p.lastIndexOf(\"/\") + 1);\n/** store.Item \u2192 GItem\uFF1A\u5207\u5F00\u8EAB\u4EFD\u53D6\u4E3B\u5E72\u548C\u79CD\u7C7B + **syncState \u539F\u6837\u900F\u4F20**\uFF080.4.0\uFF1A\u4E0D\u6D3E\u751F local/cloud/dirty\u2026 \u5E03\u5C14\uFF1B\u72B6\u6001\u7684\u552F\u4E00\u6E90\u5728 store\uFF09\u3002\u4E0D\u662F\u6587\u6863 \u2192 null\u3002 */\nexport function galleryItemFromStoreItem(it, ids) {\n    const d = ids.parse(it.identifier);\n    if (!d)\n        return null;\n    const g = { identifier: it.identifier, stem: d.stem, kind: d.kind, syncState: it.syncState };\n    if (it.size != null)\n        g.size = it.size;\n    if (it.lastModified != null)\n        g.lastModified = it.lastModified;\n    return g;\n}\nexport function createGalleryDataFace(deps) {\n    const isImage = deps.policy?.isImage ?? isImagePath;\n    const requireStore = () => { const s = deps.store(); if (!s)\n        throw new Error(\"gallery data face: no library attached\"); return s; };\n    const toImageItems = (items, ids) => items\n        .filter((it) => !ids.parse(it.identifier) && isImage(it.identifier))\n        .map((it) => ({ identifier: it.identifier, label: basename(it.identifier), size: it.size, lastModified: it.lastModified, cached: isCached(it.syncState) }))\n        .sort((a, b) => (b.lastModified ?? 0) - (a.lastModified ?? 0) || naturalCompare(b.label, a.label));\n    const toOtherItems = (items, ids) => items\n        .filter((it) => !ids.parse(it.identifier) && !isImage(it.identifier))\n        .map((it) => ({ identifier: it.identifier, label: basename(it.identifier), size: it.size, lastModified: it.lastModified }))\n        .sort((a, b) => naturalCompare(a.label, b.label));\n    const folderNamesOf = (folder, folders) => { const prefix = folder ? `${folder}/` : \"\"; return folders.map((f) => f.slice(prefix.length)).filter(Boolean).sort(naturalCompare); };\n    return {\n        /** \u8BA2\u9605\u5F53\u524D\u5939\uFF1A\u7ACB\u5373\u672C\u5730\u5E27\u3001\u4E91\u7AEF\u5230\u4E86\u540C\u4E00 cb \u518D\u95EA\u3002\u6587\u6863\u6309\u4E3B\u5E72 natural \u5012\u5E8F\uFF1B\u56FE\u7247\u6309\u4FEE\u6539\u65F6\u95F4\u5012\u5E8F\uFF1B\u6742\u7269\u663E\u793A\u4E0D\u6253\u5F00\uFF1B\u5B50\u5939\u81EA\u7136\u6B63\u5E8F\u3002 */\n        watchFolder(folder, cb, opts) {\n            const st = requireStore(), ids = st.identifiers;\n            return st.files.watchFolder(folder, (snap) => cb({\n                folder: snap.folder,\n                items: snap.items.map((it) => galleryItemFromStoreItem(it, ids)).filter((g) => g != null).sort((a, b) => naturalCompare(b.stem, a.stem) || naturalCompare(b.identifier, a.identifier)),\n                images: toImageItems(snap.items, ids),\n                others: toOtherItems(snap.items, ids),\n                folderNames: folderNamesOf(folder, snap.folders),\n            }), opts);\n        },\n        watchFolderImages(folder, cb) {\n            const st = requireStore(), ids = st.identifiers;\n            return st.files.watchFolder(folder, (snap) => cb({ folder: snap.folder, images: toImageItems(snap.items, ids), folderNames: folderNamesOf(folder, snap.folders) }));\n        },\n        openCloudImage: (identifier) => requireStore().file(identifier, { mode: \"existing\" }).open(),\n        /** \u6401\u7F6E\u533A\uFF080.5.0\uFF1B\u56DE\u6536\u7AD9 / \u5907\u4EFD\u7BB1\u540C\u4E00\u4E2A\u9762\uFF09\uFF1Astore \u4E24\u7AEF\u805A\u5408\u7684 TrashItem[] \u2192 AsideItem\uFF08\u53EA\u5143\u6570\u636E\uFF0C\u65E0 blob\uFF09\uFF0C\u65B0\u7684\u5728\u524D\u3002\n         *  \u8BFB\u54EA\u4E2A\u5217\u8868\u7531 ASIDE \u8868\u5B9A\uFF1B\u5217\u8868\u53EA\u6765\u81EA store\uFF0C\u5BBF\u4E3B\u6CA1\u6709\u6CE8\u5165\u53E3\u3002 */\n        listAside: async (box) => {\n            const st = requireStore();\n            return sortAside((await ASIDE[box].list(st.files)).map((it) => asideItemFrom(box, it, st.identifiers)), naturalCompare);\n        },\n    };\n}\n", "// \u56FE\u5E93\u6587\u4EF6\u7BA1\u7406\u52A8\u8BCD\uFF08\u65E0 DOM\uFF09\u2014\u2014WET \u81EA WeebPaint src/gallery/gallery.ts \u7684 intents \u6BB5\uFF08rename/move/copy/resolve/del/\n//   deleteImage/folderDelete/asideRestore/asidePurge/emptyAside/encrypt/decrypt/unlock\uFF09\uFF0C2026-09-09 \u62BD\u51FA\u6210 headless \u6A21\u5757\u3002\n// \u7EA2\u7EBF\u515C\u5E95\u968F\u884C\uFF08\u63D0\u6848 \u00A75\uFF09\uFF1A\u5220=\u56DE\u6536\u7AD9\u4E14\u8BDA\u5B9E\u8BFB TrashOutcome\uFF08store 2.1.2 \u524D\u53EB DelResult\uFF09\uFF1B\u6539\u540D\u5931\u8D25\u4FDD\u8F93\u5165\u5FAA\u73AF\u91CD\u8BD5\u3001\u9519\u8BEF\u5199\u8FDB\u91CD\u5F39\u7684\u8F93\u5165\u6846\u6807\u9898\uFF1B\u5931\u8D25\u4E0D\u62A5\u6210\u529F\uFF1B\n//   \u79FB\u52A8\u53EA\u7ED9\u300C\u4E0A\u7EA7 + \u53EF\u89C1\u5B50\u5939\u300D\u7EDD\u4E0D poll \u5168\u6811\uFF1B\u590D\u5236\u52A0\u5BC6\u6E90\u539F\u6837\u642C\u5BC6\u6587\uFF1B\u6E05\u7A7A\u56DE\u6536\u7AD9\u90E8\u5206\u5931\u8D25\u5FC5\u8BF4\u3002\u5C4F\u5E55\u5C42\u53EA\u8D1F\u8D23\u8C03 + reload\u3002\nimport { hasLocalCopy, hasCloudCopy, hasUnpushed } from \"./model/gallery-view-model.js\";\nimport { ASIDE } from \"./model/aside.js\";\nimport { copyTargetName } from \"./model/gallery-model.js\";\nimport { pathFolder, pathJoin } from \"./model/gallery-path.js\";\nimport { naturalCompare } from \"./model/natural-order.js\";\nimport { t } from \"./text.js\";\nconst errMsg = (e) => String(e?.message || e);\nexport function createGalleryVerbs(d) {\n    const docFile = (identifier, mode = \"existing\") => d.store().file(identifier, { mode });\n    const ids = () => d.store().identifiers;\n    const whereLabel = (where) => (where === \"local\" ? t(\"gal.loc.local\") : t(\"gal.loc.cloud\"));\n    /** \u6587\u6848\u91CC\u7ED9\u4EBA\u770B\u7684\u540D\u5B57\uFF1A\u6587\u6863 = \u4E3B\u5E72\uFF1B\u4E0D\u662F\u6587\u6863 = \u6700\u540E\u4E00\u6BB5\u3002 */\n    const stemOf = (identifier) => ids().parse(identifier)?.stem ?? identifier.slice(identifier.lastIndexOf(\"/\") + 1);\n    const cloudOn = () => d.host.signedIn() && d.host.online();\n    async function rename(item) {\n        if (item.identifier === d.host.activeIdentifier()) {\n            const nn = await d.doc.renameActive();\n            if (nn && nn !== item.identifier)\n                d.host.status(t(\"gal.st.renamed2\", { from: item.stem, to: stemOf(nn) }));\n            return;\n        }\n        // v267\uFF1A\u91CD\u540D/\u5931\u8D25\u8981 surface\u2014\u2014\u9519\u8BEF\u5199\u8FDB\u91CD\u5F39\u7684\u8F93\u5165\u6846\u6807\u9898\u5E76\u5FAA\u73AF\u91CD\u8BD5\uFF0C\u8F93\u5165\u4E0D\u4E22\u3002\n        // 0.4.1\uFF082026-09-26\uFF0CWXHW user\u300C\u91CD\u547D\u540D\u7684\u65F6\u5019\u4E0D\u5E94\u8BE5\u5305\u542B\u6269\u5C55\u540D(.webxiaoheiwu.zip)\u300D\u2192\u300C\u4FEE\u300D\uFF09\uFF1A\u6539\u540D**\u53EA\u7F16\u8F91\u4E3B\u5E72**\uFF0C\u540E\u7F00\u4E0D\u52A8\u3002\n        //   0.6.0\uFF1A\u4E3B\u5E72 / \u540E\u7F00\u76F4\u63A5\u4ECE store.identifiers \u5207\uFF08\u4E0D\u518D\u4ECE\u663E\u793A\u540D\u5012\u63A8\uFF09\u3002\u7528\u6237\u81EA\u5DF1\u628A\u540E\u7F00\u6253\u8FDB\u53BB\u4E86\u5C31\u4E0D\u91CD\u590D\u8865\u3002\n        const d0 = ids().parse(item.identifier);\n        const suffix = d0?.suffix ?? \"\", folder = d0?.folder ?? pathFolder(item.identifier);\n        const withSuffix = (typed) => (suffix && typed.toLowerCase().endsWith(suffix.toLowerCase()) ? typed.slice(0, typed.length - suffix.length) : typed);\n        let candidate = item.stem, note = \"\";\n        while (true) {\n            const input = await d.host.input(note ? t(\"gal.dlg.renameNote\", { note }) : t(\"gal.dlg.rename\"), candidate, { placeholder: t(\"gal.ph.newName\") });\n            if (input == null) {\n                d.host.status(t(\"gal.st.cancelled\"));\n                return;\n            }\n            const trimmed = input.trim();\n            if (!trimmed) {\n                candidate = \"\";\n                note = t(\"gal.note.empty\");\n                continue;\n            }\n            const shownTarget = withSuffix(trimmed);\n            const target = ids().join({ folder, stem: shownTarget, suffix });\n            if (target === item.identifier) {\n                d.host.status(t(\"gal.st.nameUnchanged\"));\n                return;\n            }\n            const result = await d.host.busy(t(\"gal.busy.rename\", { name: item.stem, to: shownTarget }), async () => {\n                try {\n                    const r = await docFile(item.identifier).tryMove(target); // \u5360\u7528\u68C0\u67E5\u5185\u5316\u5728 store.tryMove\uFF0C\u4E0D\u52A8\u5B57\u8282\u76F4\u63A5\u8FD4\u9519\n                    if (!r.ok)\n                        return { taken: whereLabel(r.where) };\n                    d.host.status(t(\"gal.st.renamed\", { to: shownTarget }));\n                    return { ok: true };\n                }\n                catch (e) {\n                    return { error: errMsg(e) };\n                }\n            });\n            if (result.taken) {\n                candidate = shownTarget;\n                note = t(\"gal.note.taken\", { loc: result.taken });\n                continue;\n            }\n            if (result.error) {\n                candidate = shownTarget;\n                note = t(\"gal.note.fail\", { e: String(result.error) });\n                continue;\n            }\n            return;\n        }\n    }\n    /** \u79FB\u52A8\u76EE\u6807\u53EA\u6709\u300C\u4E0A\u7EA7 + \u5F53\u524D\u53EF\u89C1\u5B50\u5939\u300D\u2014\u2014\u7528\u624B\u4E0A\u7684\u5355\u5939\u6570\u636E\uFF0C\u7EDD\u4E0D poll \u5168\u6811\u3002 */\n    function moveTargets(item, ctx) {\n        const cur = pathFolder(item.identifier);\n        const targets = [];\n        if (ctx.folder)\n            targets.push(pathFolder(ctx.folder));\n        for (const fn of ctx.folderNames)\n            targets.push(pathJoin(ctx.folder, fn));\n        return [...new Set(targets)].filter((f) => f !== cur).sort((a, b) => (a === \"\" ? -1 : b === \"\" ? 1 : naturalCompare(a, b)));\n    }\n    async function move(item, ctx) {\n        const base = item.stem;\n        const sorted = moveTargets(item, ctx);\n        if (!sorted.length) {\n            d.host.status(t(\"gal.st.noOtherFolder\"));\n            return;\n        }\n        const target = await d.host.chooseFolder(t(\"gal.dlg.moveTitle\", { base }), t(\"gal.dlg.moveMsg\"), sorted.map((f) => ({ label: f === \"\" ? t(\"gal.rootFolder\") : f, value: f })));\n        if (target == null)\n            return;\n        const d0 = ids().parse(item.identifier);\n        const newIdentifier = d0 ? ids().join({ folder: target, stem: d0.stem, suffix: d0.suffix }) : pathJoin(target, item.identifier.slice(item.identifier.lastIndexOf(\"/\") + 1));\n        if (newIdentifier === item.identifier) {\n            d.host.status(t(\"gal.st.alreadyInFolder\"));\n            return;\n        }\n        await d.host.busy(t(\"gal.busy.move\", { base, target: target || t(\"gal.root\") }), async () => {\n            try {\n                const r = await docFile(item.identifier).tryMove(newIdentifier);\n                if (!r.ok) {\n                    d.host.status(t(\"gal.st.nameTakenTarget\", { loc: whereLabel(r.where), base }), true);\n                    return;\n                }\n                if (item.identifier === d.host.activeIdentifier())\n                    d.doc.setIdentifier(newIdentifier);\n                d.host.status(t(\"gal.st.moved\", { target: target || t(\"gal.root\") }));\n            }\n            catch (e) {\n                d.host.status(t(\"gal.st.moveFail\", { e: errMsg(e) }), true);\n            }\n        });\n    }\n    /** \u590D\u5236\uFF1A\u52A0\u5BC6\u6E90\u539F\u6837\u642C\u5BC6\u6587\uFF08\u4E0D\u89E3\u58F3\u4E0D\u95EE\u5BC6\u7801\uFF1B\u660E\u6587\u6D3E\u751F\u7269\u4E0D\u843D\u6301\u4E45\u5C42\uFF09\uFF0C\u660E\u6587\u6E90 open()\uFF1B\u76EE\u6807 = \u540C\u5939\u300C<\u4E3B\u5E72> \u526F\u672C\u300D\u6309\u5F53\u524D\u5939\u5FEB\u7167\u53BB\u91CD\uFF0C\u540E\u7F00\u4E0D\u52A8\u3002 */\n    async function copy(item, currentIdentifiers) {\n        await d.host.busy(t(\"gal.busy.copy\", { base: item.stem }), async () => {\n            try {\n                const src = docFile(item.identifier);\n                const bytes = (await src.getEncryptedBlob()) ?? (await src.open());\n                if (!bytes) {\n                    d.host.status(t(\"gal.st.copyNoBytes\"), true);\n                    return;\n                }\n                const taken = new Set(currentIdentifiers);\n                const newIdentifier = copyTargetName(item.identifier, (n) => taken.has(n), ids());\n                await docFile(newIdentifier, \"new\").save(bytes, { tryPush: cloudOn() });\n                d.host.status(t(\"gal.st.copied\", { name: stemOf(newIdentifier) }));\n            }\n            catch (e) {\n                d.host.status(t(\"gal.st.copyFail\", { e: errMsg(e) }), true);\n            }\n        });\n    }\n    async function unload(item) { await d.doc.unload(item); }\n    /** 0.3.0\uFF08JRB\uFF09\uFF1A\u7EAF\u4E91\u7AEF\u4EF6\u300C\u7559\u4E00\u4EFD\u79BB\u7EBF\u300D\u2014\u2014\u4E0D\u6253\u5F00\u6587\u6863\uFF0C\u53EA\u56E4\u5B57\u8282\uFF08\u8BFB\u8005\u5728 wifi \u4E0B\u628A\u4E00\u665A\u8981\u8BFB\u7684\u5148\u56E4\u597D\uFF09\u3002\u4E0E pullLocal\uFF08= \u6253\u5F00\u5373\u7F13\u5B58\uFF09\u5206\u5DE5\u3002\u5931\u8D25\u8D70 status \u4E0D\u629B\u3002 */\n    async function keepOffline(item) {\n        await d.host.busy(t(\"gal.busy.keepOffline\", { name: item.stem }), async () => {\n            try {\n                await docFile(item.identifier).keepOffline();\n                d.host.status(t(\"gal.st.keptOffline\", { name: item.stem }));\n            }\n            catch (e) {\n                d.host.status(t(\"gal.st.keepOfflineFail\", { e: errMsg(e) }), true);\n            }\n        });\n    }\n    /** \u300C\u5904\u7406\u2026\u300D\uFF080.7.2\uFF09\u2014\u2014\u8FD9\u4EFD\u6CA1\u540C\u6B65\u597D\uFF08\u6CA1\u4F20 / \u51B2\u7A81 / \u4E91\u7AEF\u6CA1\u4E86 / \u4ECE\u6CA1\u4F20\u8FC7\uFF09\u7684**\u552F\u4E00**\u52A8\u4F5C\uFF1A\u4EA4\u7ED9\u5E93\u7684 `file.resolve()`\uFF0C\u7531\u5E93\u95EE\u4EBA\u4E09\u9009\u4E00\n     *  \uFF08\u4E91\u7AEF\u8986\u76D6\u672C\u5730 / \u672C\u5730\u8986\u76D6\u4E91\u7AEF / \u53D6\u6D88\uFF09\u3002\u56FE\u5E93\u4E0D\u518D\u6709\u300C\u63A8\u9001\u5230\u4E91\u7AEF\u300D\u300C\u91CD\u65B0\u4E0A\u4F20\u300D\u8FD9\u7C7B\u66FF\u4EBA\u5B9A\u65B9\u5411\u7684\u6309\u94AE\uFF08user 2026-10-16\u300C\u8FD9\u4E2A\u52A8\u8BCD\u4E00\u5F00\u59CB\u5C31\u4E0D\u5408\u6CD5\uFF0C\n     *  \u4E0D\u5728\u8BCD\u6C47\u8868\u4E0A\u300D\u300C\u8FD9\u4E2A\u6309\u94AE\u4E3A\u4EC0\u4E48\u80FD\u5B58\u5728\u662F\u66F4\u5927\u7684\u5B89\u5168\u95EE\u9898\u300D\uFF09\u3002\u6B63\u5728\u6253\u5F00\u7684\u90A3\u4EFD\uFF1A\u5148\u8BA9\u7F16\u8F91\u5668\u628A\u5185\u5B58\u91CC\u7684\u843D\u76D8\uFF08d.doc.exit = flushLocal\uFF09\uFF0C\n     *  \u5904\u7406\u5B8C\u82E5\u6362\u4E86\u4E16\u754C\u7EBF / \u8FDB\u4E86\u56DE\u6536\u7AD9\uFF0C\u8BA9\u5BBF\u4E3B\u91CD\u5F00\uFF08d.doc.open\uFF09\u3002 */\n    async function resolve(item) {\n        const isActive = item.identifier === d.host.activeIdentifier();\n        await d.host.busy(t(\"gal.busy.resolve\", { name: item.stem }), async () => {\n            try {\n                if (isActive)\n                    await d.doc.exit();\n                const r = await docFile(item.identifier).resolve();\n                const key = r.status === \"took-cloud\" ? \"gal.st.resolve.tookCloud\" : r.status === \"pushed\" ? \"gal.st.resolve.pushed\" : r.status === \"trashed\" ? \"gal.st.resolve.trashed\"\n                    : r.status === \"cancelled\" ? \"gal.st.resolve.cancelled\" : r.status === \"clean\" ? \"gal.st.resolve.clean\" : r.status === \"offline\" ? \"gal.st.resolve.offline\" : \"gal.st.resolve.unresolved\";\n                const bad = key === \"gal.st.resolve.offline\" || key === \"gal.st.resolve.unresolved\";\n                d.host.status(t(key, { name: item.stem, e: r.reason ?? r.status }), bad);\n                if (isActive && (r.status === \"took-cloud\" || r.status === \"trashed\") && d.doc.open)\n                    await d.doc.open(item);\n            }\n            catch (e) {\n                d.host.status(t(\"gal.st.resolve.unresolved\", { name: item.stem, e: errMsg(e) }), true);\n            }\n        });\n    }\n    /** \u5220\u9664 = \u79FB\u56DE\u6536\u7AD9\uFF08store \u7684 `file.trash()`\uFF09\uFF1B\u8BDA\u5B9E\u8BFB TrashOutcome\uFF08cancelled / noop / \u53EA\u5220\u4E86\u672C\u5730 \u90FD\u4E0D\u8BB8\u62A5\u300C\u5DF2\u5220\u9664\u300D\uFF09\u3002 */\n    async function del(item) {\n        const isActive = item.identifier === d.host.activeIdentifier();\n        const isLocal = hasLocalCopy(item.syncState), isCloud = hasCloudCopy(item.syncState);\n        const dirty = isLocal && isCloud && hasUnpushed(item.syncState);\n        let detail = isLocal && isCloud ? (dirty ? t(\"gal.del.dirtyDetail\") : t(\"gal.del.syncedDetail\")) : isCloud ? t(\"gal.del.cloudDetail\") : t(\"gal.del.localDetail\");\n        if (isActive)\n            detail += t(\"gal.del.activeSuffix\");\n        if (!(await d.host.confirm(t(\"gal.dlg.delTitle\", { name: item.stem }), detail)))\n            return;\n        await d.host.busy(t(\"gal.busy.del\", { name: item.stem }), async () => {\n            try {\n                const del = await docFile(item.identifier).trash();\n                if (del.status === \"cancelled\") {\n                    d.host.status(t(\"gal.st.delCancelled\", { name: item.stem }));\n                    return;\n                }\n                void d.doc.dropCheckpoint(item.identifier);\n                if (isActive)\n                    await d.doc.exit();\n                d.host.status(del.status === \"noop\" ? t(\"gal.st.delNothing\", { name: item.stem })\n                    : del.queuedCloudDelete === false ? t(\"gal.st.delLocalOnly\", { name: item.stem })\n                        : t(\"gal.st.deleted\", { name: item.stem }), del.status === \"noop\" || del.queuedCloudDelete === false);\n            }\n            catch (e) {\n                d.host.status(t(\"gal.st.delFail\", { e: errMsg(e) }), true);\n            }\n        });\n    }\n    async function deleteImage(img) {\n        if (!(await d.host.confirm(t(\"gal.dlg.delTitle\", { name: img.label }), t(\"gal.del.imageDetail\"))))\n            return;\n        await d.host.busy(t(\"gal.busy.del\", { name: img.label }), async () => {\n            try {\n                const del = await d.store().file(img.identifier, { mode: \"existing\" }).trash();\n                if (del.status === \"cancelled\") {\n                    d.host.status(t(\"gal.st.delCancelled\", { name: img.label }));\n                    return;\n                }\n                d.host.status(del.status === \"noop\" ? t(\"gal.st.delNothing\", { name: img.label })\n                    : del.queuedCloudDelete === false ? t(\"gal.st.delLocalOnly\", { name: img.label })\n                        : t(\"gal.st.deleted\", { name: img.label }), del.status === \"noop\" || del.queuedCloudDelete === false);\n            }\n            catch (e) {\n                d.host.status(t(\"gal.st.delFail\", { e: errMsg(e) }), true);\n            }\n        });\n    }\n    async function folderDelete(ft) {\n        try {\n            await d.store().files.deleteFolder(ft.path);\n            d.host.status(t(\"gal.st.folderDeleted\", { name: ft.name }));\n        }\n        catch (e) {\n            d.host.status(t(\"gal.st.folderDelFail\", { e: errMsg(e) }), true);\n        }\n    }\n    // \u2500\u2500 \u6401\u7F6E\u533A\uFF08\u56DE\u6536\u7AD9 / \u5907\u4EFD\u7BB1\uFF0C0.5.0\uFF09\uFF1A\u6062\u590D / \u5F7B\u5E95\u5220\u53EA\u8BA4 item \u81EA\u5E26\u7684\u4E24\u628A\u94A5\u5319\uFF08localKey / cloudRef\uFF09\uFF0C\n    //    store \u7684 restoreTrash / purgeTrash \u4E24\u4E2A\u5206\u533A\u90FD\u8BA4\uFF1B\u6E05\u7A7A\u8C03\u54EA\u4E2A\u3001\u8BF4\u4EC0\u4E48\u8BDD\u8D70 ASIDE \u8868\u3002 \u2500\u2500\n    async function asideRestore(item) {\n        await d.host.busy(t(\"gal.busy.restore\", { name: item.stem }), async () => {\n            try {\n                const res = await d.store().files.restoreTrash({\n                    trashKey: item.localKey, fromCloud: !!item.cloudRef, cloudRef: item.cloudRef,\n                    targetName: item.identifier, encrypted: item.encrypted,\n                });\n                const rn = res.name ?? item.identifier;\n                d.host.status(rn !== item.identifier ? t(\"gal.st.restoredRenamed\", { name: stemOf(rn), orig: item.stem }) : t(\"gal.st.restored\", { name: item.stem }));\n            }\n            catch (e) {\n                d.host.status(t(\"gal.st.restoreFail\", { e: errMsg(e) }), true);\n            }\n        });\n    }\n    async function asidePurge(item) {\n        if (!(await d.host.confirm(t(\"gal.dlg.purgeTitle\", { name: item.stem }), t(\"gal.dlg.purgeMsg\"))))\n            return;\n        await d.host.busy(t(\"gal.busy.purge\", { name: item.stem }), async () => {\n            try {\n                await d.store().files.purgeTrash({ trashKey: item.localKey, cloudRef: item.cloudRef });\n                d.host.status(t(\"gal.st.purged\", { name: item.stem }));\n            }\n            catch (e) {\n                d.host.status(t(\"gal.st.purgeFail\", { e: errMsg(e) }), true);\n            }\n        });\n    }\n    async function emptyAside(kind, scope = \"both\") {\n        const spec = ASIDE[kind], tx = spec.text;\n        const label = scope === \"local\" ? t(\"gal.scope.local\") : scope === \"cloud\" ? t(\"gal.scope.cloud\") : t(\"gal.scope.both\");\n        if (scope === \"cloud\" && !cloudOn()) {\n            d.host.status(t(tx.emptyNeedLogin), true);\n            return;\n        }\n        if (!(await d.host.confirm(t(tx.emptyTitle, { label }), t(tx.emptyMsg, { label }))))\n            return;\n        await d.host.busy(t(tx.emptyBusy, { label }), async () => {\n            try {\n                const res = await spec.empty(d.store().files, scope);\n                const cloudFails = (res.failed || []).filter((f) => f.where !== \"local\").length;\n                if (scope !== \"local\" && cloudFails)\n                    d.host.status(t(tx.emptyCloudFail, { n: cloudFails }), true);\n                else if ((res.failed || []).length)\n                    d.host.status(t(tx.emptyPartial), true);\n                else\n                    d.host.status(t(tx.emptyDone, { label }));\n            }\n            catch (e) {\n                d.host.status(`${t(tx.emptyPartial)}: ${errMsg(e)}`, true);\n            }\n        });\n    }\n    // \u2500\u2500 \u52A0\u5BC6 intent\uFF08ADR-0012\uFF09\uFF1Atransform \u4E0E\u5BC6\u7801\u5FAA\u73AF\u5728 store\uFF1B\u8FD9\u91CC\u53EA\u5269\u6D3B\u52A8\u9879\u9884\u68C0\u3001\u9996\u6B21\u8BBE\u5BC6\u7801 UX\u3001\u6B8B\u7559\u6E05\u7406 \u2500\u2500\n    function _encPrecheck(item, verb) {\n        if (item.identifier === d.host.activeIdentifier()) {\n            d.host.status(t(\"gal.st.openActive\", { verb }), true);\n            return false;\n        }\n        if (!hasLocalCopy(item.syncState)) {\n            d.host.status(t(\"gal.st.cloudPullFirst\", { verb }), true);\n            return false;\n        }\n        return true;\n    }\n    async function _afterSwap(item, res, okMsg) {\n        if (res.status === \"offline\") {\n            d.host.status(t(\"gal.st.encNeedOnline\"), true);\n            return false;\n        }\n        if (res.status === \"no-local\") {\n            d.host.status(t(\"gal.st.noLocalBytes\"), true);\n            return false;\n        }\n        if (res.status === \"locked\") {\n            d.host.status(t(\"gal.st.cancelledPw\"), true);\n            return false;\n        }\n        if (res.status === \"conflict\")\n            d.host.status(t(\"gal.st.encConflict\", { name: item.stem }), true);\n        else if (res.status === \"cloud-deferred\")\n            d.host.status(t(\"gal.st.encDeferred\", { okMsg }), true);\n        else\n            d.host.status(okMsg);\n        await d.thumbs?.invalidate(item.identifier);\n        d.onEncryptionChanged?.(item.identifier);\n        return true;\n    }\n    async function encryptItem(item) {\n        const enc = d.encryption;\n        if (!enc)\n            return;\n        if (!_encPrecheck(item, t(\"gal.verb.encrypt\")))\n            return;\n        const fresh = enc.isFreshPasswordSetup();\n        const pw = await enc.ensureNewPassword();\n        if (pw == null) {\n            d.host.status(t(\"gal.st.cancelled\"));\n            return;\n        }\n        enc.setPassword(pw);\n        let ok = false;\n        try {\n            const res = await docFile(item.identifier).encrypt({ isOnline: cloudOn });\n            if (res.status === \"already\") {\n                d.host.status(t(\"gal.st.alreadyEnc\"));\n                return;\n            }\n            if (!(await _afterSwap(item, res, t(\"gal.st.encryptedOk\", { name: item.stem }))))\n                return;\n            ok = true;\n        }\n        catch (e) {\n            d.host.status(t(\"gal.st.encFail\", { e: errMsg(e) }), true);\n        }\n        finally {\n            if (fresh && !ok)\n                enc.rollbackFreshPassword();\n        } // \u2462 2026-09-09 \u52A0\u5BC6\u5408\u89C4\u5BA1\u8BA1\uFF1A\u9996\u6B21\u521B\u5EFA\u7684\u5BC6\u7801\u53EA\u6709\u52A0\u5BC6\u6210\u529F\u624D\u7B97\u6570\n    }\n    async function decryptItem(item) {\n        const enc = d.encryption;\n        if (!enc)\n            return;\n        if (!_encPrecheck(item, t(\"gal.verb.decrypt\")))\n            return;\n        if (!(await d.host.confirm(t(\"gal.dlg.decryptTitle\", { base: item.stem }), t(\"gal.dlg.decryptMsg\"))))\n            return;\n        if (!(await enc.ensureUnlocked(item.identifier))) {\n            d.host.status(t(\"gal.st.cancelledPw\"), true);\n            return;\n        } // \u89E3\u9501\u5728 busy \u4E4B\u524D\n        try {\n            const res = await docFile(item.identifier).decrypt({ isOnline: cloudOn });\n            if (res.status === \"not-encrypted\") {\n                d.host.status(t(\"gal.st.notEnc\"));\n                return;\n            }\n            await _afterSwap(item, res, t(\"gal.st.decrypted\", { name: item.stem }));\n        }\n        catch (e) {\n            d.host.status(t(\"gal.st.decryptFail\", { e: errMsg(e) }), true);\n        }\n    }\n    async function unlock(name) {\n        const ok = !!(await d.encryption?.ensureUnlocked(name));\n        if (ok)\n            d.host.status(t(\"gal.st.unlocked\"));\n        return ok;\n    }\n    return { rename, move, moveTargets, copy, resolve, unload, keepOffline, del, deleteImage, folderDelete, asideRestore, asidePurge, emptyAside, encryptItem, decryptItem, unlock, whereLabel };\n}\n", "export function memoryThumbStore() {\n    const m = new Map();\n    return { async get(k) { return m.get(k); }, async set(k, v) { m.set(k, v); }, async delete(k) { m.delete(k); }, async clear() { const n = m.size; m.clear(); return n; } };\n}\n/** IndexedDB \u5B9E\u73B0\uFF1A\u4E00\u4E2A DB \u4E00\u4E2A object store\uFF08keyPath \u65E0\uFF0Cout-of-line key\uFF09\u3002\u6253\u5F00\u5931\u8D25\u81EA\u52A8\u91CD\u8BD5\u4E00\u6B21\uFF08WeebPaint openDB \u7684\u81EA\u6108\uFF09\u3002 */\nexport function idbThumbStore(opts) {\n    const storeName = opts.storeName ?? \"thumbs\", version = opts.version ?? 1;\n    let _db = null;\n    const open = () => new Promise((resolve, reject) => {\n        const req = indexedDB.open(opts.dbName, version);\n        req.onupgradeneeded = () => { const db = req.result; if (!db.objectStoreNames.contains(storeName))\n            db.createObjectStore(storeName); };\n        req.onsuccess = () => resolve(req.result);\n        req.onerror = () => reject(req.error);\n        req.onblocked = () => reject(new Error(\"idb open blocked\"));\n    });\n    const db = () => { if (_db)\n        return _db; _db = open().catch(async (e1) => { try {\n        return await open();\n    }\n    catch {\n        _db = null;\n        throw e1;\n    } }); return _db; };\n    const tx = async (mode, run) => {\n        const d = await db();\n        return new Promise((resolve, reject) => {\n            const t = d.transaction(storeName, mode);\n            const s = t.objectStore(storeName);\n            const r = run(s);\n            let out;\n            if (r) {\n                r.onsuccess = () => { out = r.result; };\n                r.onerror = () => reject(r.error);\n            }\n            t.oncomplete = () => resolve(out);\n            t.onerror = () => reject(t.error);\n        });\n    };\n    return {\n        get: (k) => tx(\"readonly\", (s) => s.get(k)),\n        set: (k, v) => tx(\"readwrite\", (s) => { s.put(v, k); }),\n        delete: (k) => tx(\"readwrite\", (s) => { s.delete(k); }),\n        clear: () => tx(\"readwrite\", (s) => { const c = s.count(); c.onsuccess = () => { s.clear(); }; return c; }),\n    };\n}\n", "/** \u591A\u5E93 key\uFF1Alegacy \u5E93 id \"default\" \u4E0D\u52A0\u524D\u7F00\uFF08WeebPaint \u5B58\u91CF\u7F13\u5B58\u96F6\u8FC1\u79FB\uFF09\u3002 */\nexport const thumbKeyFor = (galleryId, fullName) => (galleryId === \"default\" ? fullName : `${galleryId}:${fullName}`);\nexport function createThumbCache(deps) {\n    const now = deps.now ?? (() => Date.now());\n    const stats = { hits: 0, misses: 0, errors: 0 };\n    const config = { skipCache: false };\n    const listeners = new Set();\n    async function read(name) {\n        try {\n            const v = await deps.store.get(deps.keyOf(name));\n            return v && v.token && (v.blob instanceof Blob || v.blob === null) ? v : null;\n        }\n        catch {\n            return null;\n        }\n    }\n    async function write(name, token, blob) {\n        try {\n            await deps.store.set(deps.keyOf(name), { token, blob, at: now() });\n        }\n        catch (e) {\n            deps.report?.(new Error(\"[thumb-cache] write failed: \" + String(e)));\n        }\n    }\n    return {\n        read, write,\n        async invalidate(name) {\n            const key = deps.keyOf(name);\n            try {\n                await deps.store.delete(key);\n            }\n            catch { /* best-effort */ }\n            for (const fn of listeners) {\n                try {\n                    fn(key);\n                }\n                catch { /* listener \u81EA\u7406 */ }\n            }\n        },\n        onInvalidated(fn) { listeners.add(fn); return () => { listeners.delete(fn); }; },\n        async getOrFetch(name, token, source) {\n            if (!config.skipCache) {\n                const c = await read(name);\n                if (c && c.token === token) {\n                    stats.hits++;\n                    return { blob: c.blob, fromCache: true };\n                }\n            }\n            stats.misses++;\n            try {\n                const blob = await deps.fetch(name, source);\n                if (!config.skipCache)\n                    void write(name, token, blob);\n                return { blob, fromCache: false };\n            }\n            catch (e) {\n                stats.errors++;\n                if (!config.skipCache) {\n                    const stale = await read(name);\n                    if (stale)\n                        return { blob: stale.blob, fromCache: true };\n                } // \u9000\u65E7\u56FE\u4F46\u4E0D\u5199\u7F13\u5B58\n                throw e;\n            }\n        },\n        async clear() { const n = await deps.store.clear(); stats.hits = stats.misses = stats.errors = 0; return n; },\n        stats, config,\n    };\n}\n", "// PNG \u6587\u672C\u5757\u8BFB\u5199\uFF08gallery-native\uFF1A\u7F29\u7565\u56FE\u81EA\u5E26\u4E00\u5C0F\u6BB5\u6587\u5B57 = \u4E66\u7684\u8170\u5C01 / \u753B\u7684 caption\uFF1Buser 2026-09-10\u300Cthumbnail.png \u7684\u6807\u51C6 tEXt \u6587\u672C\u5757\u3002free lunch\uFF01\u505A\uFF01\u8FD9\u4E2A\u662F gallery \u5E93\u7684\u516C\u5171\u884C\u4E3A\u300D\uFF09\u3002\n// created 2026-09-10 by Claude Fable 5.1\u3002\n//   \u00B7 \u5199\uFF1AiTXt\uFF08UTF-8\uFF0CPNG \u89C4\u8303 11.3.4.4\uFF1BtEXt \u53EA\u80FD Latin-1\uFF0C\u4E2D\u6587\u8FDB\u4E0D\u53BB\uFF09\u63D2\u5728 IEND \u524D\uFF1B\u540C\u5173\u952E\u5B57\u65E7\u5757\uFF08tEXt / zTXt / iTXt\uFF09\u5148\u5220\u3002\n//   \u00B7 \u8BFB\uFF1AtEXt + \u672A\u538B\u7F29 iTXt\uFF1BzTXt / \u538B\u7F29 iTXt \u8DF3\u8FC7\uFF08\u7F29\u7565\u56FE\u662F\u6211\u4EEC\u81EA\u5DF1\u5199\u7684\uFF0C\u6C38\u8FDC\u4E0D\u538B\u7F29\uFF09\u3002\n//   \u00B7 \u5173\u952E\u5B57\u7528 PNG \u89C4\u8303\u767B\u8BB0\u7684\u6807\u51C6\u8BCD `Description`\uFF08exiftool / \u4EFB\u4F55\u770B\u56FE\u8F6F\u4EF6\u76F4\u63A5\u663E\u793A\uFF09\uFF1B\u9152\u9986\u5361\u7528 `chara`\uFF0C\u4E92\u4E0D\u76F8\u5E72\u3002\n//   \u00B7 \u96F6\u4F9D\u8D56\u3001\u96F6 DOM\uFF1BCRC32 \u81EA\u5E26\u3002\nexport const PNG_BLURB_KEYWORD = \"Description\";\nconst SIG = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\nexport function isPng(bytes) {\n    if (bytes.length < 8)\n        return false;\n    for (let i = 0; i < 8; i++)\n        if (bytes[i] !== SIG[i])\n            return false;\n    return true;\n}\nconst CRC_TABLE = (() => {\n    const t = new Uint32Array(256);\n    for (let n = 0; n < 256; n++) {\n        let c = n;\n        for (let k = 0; k < 8; k++)\n            c = (c & 1) ? (0xedb88320 ^ (c >>> 1)) : (c >>> 1);\n        t[n] = c >>> 0;\n    }\n    return t;\n})();\nexport function crc32(bytes, from = 0, to = bytes.length) {\n    let c = 0xffffffff;\n    for (let i = from; i < to; i++)\n        c = CRC_TABLE[(c ^ bytes[i]) & 0xff] ^ (c >>> 8);\n    return (c ^ 0xffffffff) >>> 0;\n}\n/** \u904D\u5386 chunk \u8868\uFF08\u5BB9\u9519\uFF1A\u8D8A\u754C\u5373\u505C\uFF09\u3002 */\nfunction chunks(png) {\n    const out = [];\n    if (!isPng(png))\n        return out;\n    const dv = new DataView(png.buffer, png.byteOffset, png.byteLength);\n    let p = 8;\n    while (p + 12 <= png.length) {\n        const len = dv.getUint32(p);\n        const type = String.fromCharCode(png[p + 4], png[p + 5], png[p + 6], png[p + 7]);\n        const end = p + 12 + len;\n        if (end > png.length)\n            break;\n        out.push({ type, start: p, end, dataStart: p + 8, dataEnd: p + 8 + len });\n        if (type === \"IEND\")\n            break;\n        p = end;\n    }\n    return out;\n}\nconst latin1 = (b) => { let s = \"\"; for (let i = 0; i < b.length; i++)\n    s += String.fromCharCode(b[i]); return s; };\nconst nul = (b, from) => { for (let i = from; i < b.length; i++)\n    if (b[i] === 0)\n        return i; return -1; };\n/** \u8BFB\u5168\u90E8\u6587\u672C\u5757 \u2192 \u5173\u952E\u5B57\u5230\u6587\u672C\u7684\u6620\u5C04\u3002\u540C\u5173\u952E\u5B57\u591A\u5757\u53D6\u6700\u540E\u4E00\u4E2A\u3002 */\nexport function readPngText(png) {\n    const out = {};\n    for (const c of chunks(png)) {\n        if (c.type !== \"tEXt\" && c.type !== \"iTXt\")\n            continue;\n        const d = png.subarray(c.dataStart, c.dataEnd);\n        const k = nul(d, 0);\n        if (k <= 0)\n            continue;\n        const keyword = latin1(d.subarray(0, k));\n        if (c.type === \"tEXt\") {\n            out[keyword] = latin1(d.subarray(k + 1));\n            continue;\n        }\n        // iTXt: keyword\\0 compFlag compMethod langTag\\0 translatedKeyword\\0 text\n        if (d.length < k + 3)\n            continue;\n        const compFlag = d[k + 1];\n        const l = nul(d, k + 3);\n        if (l < 0)\n            continue;\n        const tk = nul(d, l + 1);\n        if (tk < 0)\n            continue;\n        if (compFlag !== 0)\n            continue; // \u538B\u7F29 iTXt\uFF1A\u4E0D\u662F\u6211\u4EEC\u5199\u7684\uFF0C\u8DF3\u8FC7\n        out[keyword] = new TextDecoder(\"utf-8\").decode(d.subarray(tk + 1));\n    }\n    return out;\n}\nfunction makeChunk(type, data) {\n    const c = new Uint8Array(12 + data.length);\n    const dv = new DataView(c.buffer);\n    dv.setUint32(0, data.length);\n    for (let i = 0; i < 4; i++)\n        c[4 + i] = type.charCodeAt(i);\n    c.set(data, 8);\n    dv.setUint32(8 + data.length, crc32(c, 4, 8 + data.length));\n    return c;\n}\n/** \u5199 / \u5220\u4E00\u4E2A\u5173\u952E\u5B57\u7684\u6587\u672C\uFF1A\u5148\u5220\u540C\u5173\u952E\u5B57\u7684\u65E7\u5757\uFF08tEXt / zTXt / iTXt\uFF09\uFF0Ctext \u975E\u7A7A\u5219\u5728 IEND \u524D\u63D2\u4E00\u5757 iTXt\uFF08UTF-8\uFF09\u3002\n *  \u975E PNG / \u65E0 IEND \u2192 \u539F\u6837\u8FD4\u56DE\uFF08\u4E0D\u5047\u88C5\u6210\u529F\uFF09\u3002\u5173\u952E\u5B57\u6309 PNG \u89C4\u8303 1\u201379 \u5B57\u8282 Latin-1\u3002 */\nexport function withPngText(png, keyword, text) {\n    const all = chunks(png);\n    const iend = all.find((c) => c.type === \"IEND\");\n    if (!iend)\n        return png;\n    if (!/^[\\x20-\\x7e\\xa1-\\xff]{1,79}$/.test(keyword))\n        throw new Error(\"png text keyword must be 1-79 Latin-1 printable bytes\");\n    const drop = new Set();\n    for (const c of all) {\n        if (c.type !== \"tEXt\" && c.type !== \"zTXt\" && c.type !== \"iTXt\")\n            continue;\n        const d = png.subarray(c.dataStart, c.dataEnd);\n        const k = nul(d, 0);\n        if (k > 0 && latin1(d.subarray(0, k)) === keyword)\n            drop.add(c.start);\n    }\n    const parts = [png.subarray(0, 8)];\n    for (const c of all) {\n        if (drop.has(c.start))\n            continue;\n        if (c.type === \"IEND\" && text) {\n            const kw = new Uint8Array(keyword.length);\n            for (let i = 0; i < keyword.length; i++)\n                kw[i] = keyword.charCodeAt(i);\n            const body = new TextEncoder().encode(text);\n            const data = new Uint8Array(kw.length + 1 + 2 + 1 + 1 + body.length); // keyword \\0 flag method lang\\0 tkey\\0 text\n            data.set(kw, 0);\n            data[kw.length] = 0;\n            data[kw.length + 1] = 0;\n            data[kw.length + 2] = 0;\n            data[kw.length + 3] = 0;\n            data[kw.length + 4] = 0;\n            data.set(body, kw.length + 5);\n            parts.push(makeChunk(\"iTXt\", data));\n        }\n        parts.push(png.subarray(c.start, c.end));\n    }\n    let n = 0;\n    for (const p of parts)\n        n += p.length;\n    const out = new Uint8Array(n);\n    let o = 0;\n    for (const p of parts) {\n        out.set(p, o);\n        o += p.length;\n    }\n    return out;\n}\n", "export const THUMB_MAX_BYTES = 70 * 1024;\nexport const THUMB_LADDER = [256, 192, 128];\nexport const THUMB_PALETTE_COLORS = 256;\n/** \u9762\u79EF\u5E73\u5747\u7F29\u5C0F\uFF08straight RGBA \u2192 straight RGBA\uFF1Bpremult \u7D2F\u52A0\u3001\u53CD\u9884\u4E58\uFF09\u3002\u653E\u5927\u65F6\u9000\u5316\u4E3A\u8FD1\u4F3C\u76D2\u590D\u5236\uFF0C\u522B\u7528\u3002 */\nexport function areaResampleRgba(src, sw, sh, tw, th) {\n    const out = new Uint8ClampedArray(tw * th * 4);\n    const xr = sw / tw, yr = sh / th;\n    for (let dy = 0; dy < th; dy++) {\n        const y0 = dy * yr, y1 = (dy + 1) * yr;\n        const iy0 = Math.floor(y0), iy1 = Math.min(sh, Math.ceil(y1));\n        for (let dx = 0; dx < tw; dx++) {\n            const x0 = dx * xr, x1 = (dx + 1) * xr;\n            const ix0 = Math.floor(x0), ix1 = Math.min(sw, Math.ceil(x1));\n            let r = 0, g = 0, b = 0, a = 0, area = 0;\n            for (let yy = iy0; yy < iy1; yy++) {\n                const wy = Math.min(y1, yy + 1) - Math.max(y0, yy);\n                if (wy <= 0)\n                    continue;\n                let p = (yy * sw + ix0) * 4;\n                for (let xx = ix0; xx < ix1; xx++, p += 4) {\n                    const wx = Math.min(x1, xx + 1) - Math.max(x0, xx);\n                    if (wx <= 0)\n                        continue;\n                    const wgt = wx * wy;\n                    const av = src[p + 3];\n                    r += src[p] * av * wgt;\n                    g += src[p + 1] * av * wgt;\n                    b += src[p + 2] * av * wgt;\n                    a += av * wgt;\n                    area += wgt;\n                }\n            }\n            const o = (dy * tw + dx) * 4;\n            if (area <= 0 || a < 1e-4)\n                continue;\n            out[o] = Math.round(r / a);\n            out[o + 1] = Math.round(g / a);\n            out[o + 2] = Math.round(b / a);\n            out[o + 3] = Math.round(a / area);\n        }\n    }\n    return out;\n}\n/** \u7B49\u6BD4\u7F29\u5230\u957F\u8FB9 \u2264 maxEdge\uFF1B\u6C38\u4E0D\u653E\u5927\u3002 */\nexport function fitWithin(w, h, maxEdge) {\n    const k = Math.min(1, maxEdge / Math.max(w, h));\n    return { w: Math.max(1, Math.round(w * k)), h: Math.max(1, Math.round(h * k)) };\n}\n/** \u62CD\u5E73\u767D\u5E95\uFF08in place\uFF09\uFF1Astraight RGBA \u2192 \u4E0D\u900F\u660E\u3002\u7F29\u7565\u56FE/JPEG \u65E0 alpha \u573A\u666F\u7528\u3002 */\nexport function flattenWhiteInPlace(rgba) {\n    for (let i = 0; i < rgba.length; i += 4) {\n        const a = rgba[i + 3];\n        if (a === 255)\n            continue;\n        const f = a / 255, inv = 255 * (1 - f);\n        rgba[i] = rgba[i] * f + inv;\n        rgba[i + 1] = rgba[i + 1] * f + inv;\n        rgba[i + 2] = rgba[i + 2] * f + inv;\n        rgba[i + 3] = 255;\n    }\n    return rgba;\n}\n/** \u81EA\u9002\u5E94\u7F29\u7565\u56FE\uFF1A\u9636\u68AF\u9010\u6863\u3001\u6BCF\u6863\u5148\u65E0\u635F\u540E\u8C03\u8272\u677F\uFF0C\u7B2C\u4E00\u4E2A \u2264 maxBytes \u7684\u80DC\u51FA\uFF1B\u90FD\u8D85 \u2192 \u6700\u5C0F\u6863\u8C03\u8272\u677F\u3002 */\nexport function makeThumbAdaptive(src, opts) {\n    const maxBytes = opts.maxBytes ?? THUMB_MAX_BYTES, ladder = opts.ladder ?? THUMB_LADDER, colors = opts.paletteColors ?? THUMB_PALETTE_COLORS;\n    let last = null;\n    for (const edge of ladder) {\n        const { w, h } = fitWithin(src.w, src.h, edge);\n        const px = (w === src.w && h === src.h) ? new Uint8ClampedArray(src.data) : areaResampleRgba(src.data, src.w, src.h, w, h);\n        if (opts.keepAlpha === false)\n            flattenWhiteInPlace(px);\n        for (const c of [0, colors]) {\n            const png = opts.encodePng(px, w, h, c);\n            last = { png, w, h, colors: c, edge };\n            if (png.length <= maxBytes)\n                return last;\n        }\n        if (w === src.w && h === src.h && edge !== ladder[ladder.length - 1])\n            continue; // \u6E90\u5DF2\u6BD4\u8FD9\u6863\u5C0F\uFF1A\u4E0B\u4E00\u6863\u8FD8\u4F1A\u518D\u7F29\uFF0C\u7EE7\u7EED\n    }\n    return last;\n}\n", "export const factsKeyFor = (galleryId, identifier) => (galleryId === \"default\" ? identifier : `${galleryId}:${identifier}`);\nexport function createFactsCache(deps) {\n    const now = deps.now ?? (() => Date.now());\n    const stats = { hits: 0, misses: 0, errors: 0 };\n    const listeners = new Set();\n    async function read(identifier) {\n        try {\n            const v = await deps.store.get(deps.keyOf(identifier));\n            return v && typeof v.token === \"string\" && \"value\" in v ? v : null;\n        }\n        catch {\n            return null;\n        }\n    }\n    async function write(identifier, token, value) {\n        try {\n            await deps.store.set(deps.keyOf(identifier), { token, value, at: now() });\n        }\n        catch (e) {\n            deps.report?.(new Error(\"[facts-cache] write failed: \" + String(e)));\n        }\n    }\n    return {\n        read, write,\n        async invalidate(identifier) {\n            const key = deps.keyOf(identifier);\n            try {\n                await deps.store.delete(key);\n            }\n            catch { /* best-effort */ }\n            for (const fn of listeners) {\n                try {\n                    fn(key);\n                }\n                catch { /* listener \u81EA\u7406 */ }\n            }\n        },\n        onInvalidated(fn) { listeners.add(fn); return () => { listeners.delete(fn); }; },\n        async getOrFetch(identifier, token, source) {\n            const c = await read(identifier);\n            if (c && c.token === token) {\n                stats.hits++;\n                return { value: c.value, fromCache: true };\n            }\n            stats.misses++;\n            try {\n                const value = await deps.fetch(identifier, source);\n                void write(identifier, token, value ?? null);\n                return { value: value ?? null, fromCache: false };\n            }\n            catch (e) {\n                stats.errors++;\n                if (c)\n                    return { value: c.value, fromCache: true }; // \u9000\u65E7\u503C\u4F46\u4E0D\u5199\u7F13\u5B58\uFF08token \u4E0D\u88AB\u65B0\u7684\u6C61\u67D3\uFF09\n                throw e;\n            }\n        },\n        async clear() { const n = await deps.store.clear(); stats.hits = stats.misses = stats.errors = 0; return n; },\n        stats,\n    };\n}\n", "import { t } from \"../core/text.js\";\n// StoreTextKey\uFF08\u5E93\u7684 busy \u6587\u6848 key\uFF09\u2192 \u672C\u5305\u6587\u6848 key\u3002\u7A77\u4E3E Record\uFF1A\u5E93\u52A0 key \u672C\u8868\u6F0F\u6620 = \u7F16\u8BD1\u9519\u3002\nconst STORE_TEXT_KEYS = {\n    \"sync.pushing\": \"st.syncPushing\", \"file.renaming\": \"st.fileRenaming\", \"file.pulling\": \"st.filePulling\", \"cloud.checking\": \"st.cloudChecking\",\n    \"file.deleting\": \"st.fileDeleting\", \"trash.restoring\": \"st.trashRestoring\", \"trash.purging\": \"st.trashPurging\", \"trash.emptyTrash\": \"st.trashEmptyTrash\",\n    \"trash.emptyBackups\": \"st.trashEmptyBackups\", \"file.encrypting\": \"st.fileEncrypting\", \"file.decrypting\": \"st.fileDecrypting\", \"file.rekeying\": \"st.fileRekeying\",\n    \"file.uploading\": \"st.fileUploading\", \"file.reuploading\": \"st.fileReuploading\", \"folder.creating\": \"st.folderCreating\", \"folder.deleting\": \"st.folderDeleting\",\n};\nconst QUIET_KEYS = new Set([\"sync.pushing\", \"file.renaming\"]);\nexport function storeUIFor(d) {\n    const bare = d.stemOf ?? ((s) => s);\n    let _quietDepth = 0, _quietNotice = null;\n    async function quietBusy(label, fn) {\n        _quietDepth++;\n        if (_quietNotice?.isOpen())\n            _quietNotice.setText(label);\n        else\n            _quietNotice = d.showNotice({ id: \"store-quiet-busy\", level: \"info\", text: label, dismissible: false, tapToDismiss: false });\n        try {\n            return await fn();\n        }\n        finally {\n            _quietDepth--;\n            if (_quietDepth <= 0) {\n                _quietDepth = 0;\n                _quietNotice?.close();\n                _quietNotice = null;\n            }\n        }\n    }\n    return {\n        busy: (label, fn, key) => (key && QUIET_KEYS.has(key) ? quietBusy(label, fn) : d.busy(label, fn)),\n        text: (key, params) => d.text?.(key, params) ?? (STORE_TEXT_KEYS[key] ? t(STORE_TEXT_KEYS[key], params) : undefined),\n        resolveConflict: async ({ name, occasion, cloudState }) => {\n            const n = bare(name);\n            // 0.7.2\uFF1A\u6309\u4E91\u7AEF\u90A3\u4E00\u4FA7\u7684\u72B6\u6001\u6362\u8BF4\u6CD5\uFF08store 0.18.2 cloudState\uFF09\uFF1B\u4E09\u4E2A\u8BCD\u4E0D\u53D8\u3001\u4E3B\u6309\u94AE = \u4E91\u7AEF\u8986\u76D6\u672C\u5730\n            const gone = cloudState === \"absent\" || cloudState === \"never\";\n            const pushTitle = gone ? t(\"cf.cloudGoneTitle\") : t(\"cf.cloudNewerTitle\");\n            const pushBody = cloudState === \"absent\" ? t(\"cf.body.absent\", { name: n }) : cloudState === \"never\" ? t(\"cf.body.never\", { name: n })\n                : cloudState === \"unchanged\" ? t(\"cf.body.unchanged\", { name: n }) : t(\"cf.body.push\", { name: n });\n            const choice = occasion === \"open\"\n                ? await d.sheets.lockSyncGate({ title: t(\"cf.cloudNewerTitle\"), message: t(\"cf.body.open\", { name: n }), note: t(\"cf.note.keptSafe\"), showSpinner: false,\n                    actions: [{ label: t(\"cf.act.openLocal\"), value: \"cancel\", primary: true }, { label: t(\"cf.act.cloudWins\"), value: \"takeCloud\" }] })\n                : await d.sheets.lockSyncGate({ title: pushTitle, message: pushBody, note: t(\"cf.note.keptSafe\"), showSpinner: false,\n                    // 0.7.1\uFF1A\u4E3B\u6309\u94AE = \u4E91\u7AEF\u8986\u76D6\u672C\u5730\uFF08user 2026-10-16\u300C\u9ED8\u8BA4\u4E91\u7AEF\u624D\u662F authority\u300D\u300C\u4E00\u5207\u5BF9\u9F50\u300D\uFF1B\u6B64\u524D\u4E3B\u6309\u94AE\u662F\u672C\u5730\u8986\u76D6\u4E91\u7AEF\uFF0C\u6302\u673A\u9192\u6765\u987A\u624B\u4E00\u70B9\u5C31\u628A\u4E91\u7AEF\u7684\u65B0\u6539\u52A8\u76D6\u8FDB\u5907\u4EFD\u7BB1\uFF09\n                    actions: [{ label: t(\"cf.act.cloudWins\"), value: \"takeCloud\", primary: true }, { label: t(\"cf.act.localWins\"), value: \"keepMine\" }, { label: t(\"common.cancel\"), value: \"cancel\" }] });\n            return choice ?? \"cancel\";\n        },\n        reportError: (err, level) => {\n            if (err?.name === \"CloudNetworkError\") {\n                d.reportError(err, \"log\");\n                d.reportError(new Error(t(\"err.cloudNetwork\")), level ?? \"error\");\n                return;\n            }\n            d.reportError(err, level ?? \"error\");\n        },\n        offlineEscape: () => {\n            let onSkip;\n            const probe = new Promise((res) => { onSkip = () => res(undefined); });\n            void d.sheets.lockSyncGate({ title: t(\"cf.checkingCloud\"), message: \"\", showSpinner: true, actions: [{ label: t(\"cf.skipToOffline\"), value: \"skip\" }] }).then((v) => { if (v === \"skip\")\n                onSkip(); });\n            return { probe, settle: () => d.sheets.settleSyncGate(null) };\n        },\n    };\n}\n", "// \u56FE\u5E93\u7684\u4E09\u5F20 Vue \u6A21\u677F\uFF080.8.4 \u81EA gallery-screen.ts \u539F\u6837\u642C\u51FA\uFF0C\u5185\u5BB9\u96F6\u6539\u52A8\uFF09\u3002created 2026-10-17 by Claude Opus 5.5\n// \u6539\u8FD9\u91CC = \u8DD1 `npm run build`\uFF08scripts/compile-templates.mjs \u4F1A\u91CD\u751F templates.compiled.ts\uFF1Btest/templates-compiled \u5B88\u7740\u4E24\u8FB9\u4E00\u81F4\uFF09\u3002\n// \u53EA\u8BB8\u662F\u5E38\u91CF\u5B57\u7B26\u4E32\uFF1A\u4E0D\u8BB8\u62FC\u63A5\u4EFB\u4F55\u8FD0\u884C\u65F6\u7684\u503C\uFF08\u7F16\u8BD1\u5728\u6784\u5EFA\u65F6\u53D1\u751F\uFF0C\u62FC\u8FDB\u6765\u7684\u4E1C\u897F\u4E0D\u4F1A\u751F\u6548\uFF1B\u66F4\u4E0D\u8BB8\u628A\u7528\u6237\u5185\u5BB9\u62FC\u8FDB\u6A21\u677F = \u6A21\u677F\u6CE8\u5165\uFF09\u3002\nexport const THUMB_CELL_TEMPLATE = `\n    <img v-if=\"url\" class=\"gallery-tile-thumb\" :class=\"{ pixelated }\" :src=\"url\" :alt=\"alt\" :title=\"blurb || null\" loading=\"lazy\" @load=\"onThumbLoad\" />\n    <div v-else-if=\"locked\" class=\"gallery-tile-thumb placeholder locked\" :title=\"lockedTitle\" @click.stop=\"$emit('unlock', encName || alt)\">\n      <span style=\"width:42px;height:42px;display:inline-block\" v-html=\"ICON.lock\"></span>\n    </div>\n    <div v-else class=\"gallery-tile-thumb placeholder\" ref=\"root\">\n      <span v-if=\"showCloud\" style=\"width:48px;height:48px;display:inline-block\" v-html=\"ICON.cloudBig\"></span>\n      <span v-else-if=\"fallbackHtml\" class=\"gallery-tile-ph-icon\" v-html=\"fallbackHtml\"></span>\n      <template v-else>{{ fallback }}</template>\n    </div>`;\nexport const IMAGE_THUMB_CELL_TEMPLATE = `\n    <img v-if=\"url\" class=\"gallery-tile-thumb\" :class=\"{ pixelated }\" :src=\"url\" :alt=\"alt\" loading=\"lazy\" @load=\"onThumbLoad\" />\n    <div v-else class=\"gallery-tile-thumb placeholder\" ref=\"root\">{{ fallback }}</div>`;\n// \u6A21\u677F\u9010\u5B57\u81EA WeebPaint gallery.ts v0.14.9\uFF08class \u540D\u4E0D\u53D8\uFF0C\u5BBF\u4E3B CSS \u76F4\u63A5\u751F\u6548\uFF09\uFF1B\u552F\u4E00\u589E\u8865\uFF1A\u52A0\u5BC6\u83DC\u5355\u9879\u52A0 v-if=\"hasEncryption\"\u3002\nexport const GALLERY_TEMPLATE = `\n      <div class=\"gallery-breadcrumb\" :class=\"{ hidden: !folder }\" v-if=\"view==='files'\">\n        <template v-for=\"(c,i) in crumbs\" :key=\"c.path\">\n          <span v-if=\"i>0\" class=\"sep\">\u203A</span>\n          <button type=\"button\" :class=\"{ current: c.current }\" @click=\"!c.current && setFolder(c.path)\">{{ c.label }}</button>\n        </template>\n      </div>\n\n      <!-- 0.8.6\uFF1A\u56DE\u6536\u7AD9 / \u5907\u4EFD\u7BB1\u89C6\u56FE\u9876\u4E0A\u4E00\u6761\u52A8\u4F5C\uFF08store files.emptyTrash / emptyBackup \u4E00\u76F4\u6709\u3001\u56FE\u5E93\u4ECE\u6CA1\u7ED9\u8FC7\u5165\u53E3\u2014\u2014store README\u300C\u6682\u65E0 gallery UI\u300D\uFF09\u3002\u590D\u7528\u9762\u5305\u5C51\u7684\u5BB9\u5668\u4E0E\u6309\u94AE\u6837\u5F0F\uFF0C\u5BBF\u4E3B\u96F6 CSS\u3002 -->\n      <div class=\"gallery-breadcrumb gallery-aside-bar\" v-if=\"view!=='files' && !loading && !isEmpty\">\n        <button type=\"button\" class=\"danger\" @click=\"emptyAside(view)\">{{ view==='trash' ? L.emptyTrash : L.emptyBackup }}</button>\n      </div>\n\n      <div class=\"gallery-grid\" :class=\"{ tall: tileTall, list: layout==='list' }\" :style=\"tileStyle\" v-show=\"!isEmpty || loading\">\n        <div v-if=\"loading\" class=\"gallery-loading\">\n          <template v-if=\"!stalled\">{{ L.loading }}</template>\n          <template v-else>\n            <div class=\"gallery-stalled\">{{ stalled }}</div>\n            <div class=\"gallery-stalled-actions\">\n              <button type=\"button\" class=\"sheet-action ghost gallery-retry-btn\" @click=\"retry\">{{ L.retry }}</button>\n              <button type=\"button\" class=\"sheet-action ghost\" @click=\"openDiag\">{{ L.openDiag }}</button>\n              <button type=\"button\" class=\"sheet-action ghost\" @click=\"reloadApp\">{{ L.reload }}</button>\n            </div>\n          </template>\n        </div>\n\n        <template v-if=\"view==='files' && !loading\">\n          <div v-for=\"ft in folderTiles\" :key=\"'F:'+ft.path\" class=\"gallery-tile folder\" @click=\"enterFolder(ft.path)\">\n            <div class=\"gallery-tile-thumb\" v-html=\"ICON.folder\"></div>\n            <div class=\"gallery-tile-name-row\">\n              <div class=\"gallery-tile-name\" :title=\"ft.path\">{{ ft.name }}</div>\n              <div class=\"gallery-tile-meta\">{{ L.folder }}</div>\n            </div>\n            <button type=\"button\" class=\"gallery-tile-menu-btn\" :aria-label=\"L.more\" @click.stop=\"toggleMenu('F:'+ft.path, $event)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#more\"/></svg></button>\n            <Teleport :to=\"menuMount\"><div class=\"gallery-tile-menu-popup hidden\" :data-menu=\"'F:'+ft.path\" @click.stop>\n              <button type=\"button\" class=\"danger\" @click=\"folderDelete(ft)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#trash-can\"/></svg><span>{{ L.delEmptyFolder }}</span></button>\n            </div></Teleport>\n          </div>\n\n          <div v-for=\"row in fileTiles\" :key=\"row.t.identifier\" class=\"gallery-tile\" :class=\"{ active: row.t.isActive, encrypted: row.t.encrypted }\" @click=\"openTile(row.item)\">\n            <ThumbCell :enc-name=\"row.t.encrypted && row.thumb ? row.t.identifier : null\" :fetchable=\"!row.t.encrypted && (row.t.hasCloud || row.t.hasLocal) && row.thumb\" :is-cloud=\"!row.t.hasLocal && row.t.hasCloud\" :cloud-newer=\"row.t.cloudNewer\" :thumb-token=\"String(row.t.time || row.t.size || 0)\" :fallback=\"row.t.stem.slice(0,1) || '?'\" :fallback-html=\"phHtml(row.t.identifier, row.info)\" :alt=\"row.t.identifier\" @unlock=\"onUnlock\" />\n            <span v-if=\"row.ov\" class=\"gallery-tile-overlay\" v-html=\"row.ov\"></span>\n            <span v-if=\"row.act\" class=\"gallery-tile-action-slot\"><button type=\"button\" class=\"gallery-tile-action\" :class=\"row.act.state || 'ready'\" :title=\"row.act.title\" :aria-label=\"row.act.title\" @click.stop=\"tileAction(row.item)\" @pointerdown.stop v-html=\"badgeIcon2(row.act.icon)\"></button></span>\n            <span v-if=\"row.t.encrypted\" class=\"gallery-tile-lockmark\" :title=\"L.encrypted\" v-html=\"ICON.lock\"></span>\n            <div class=\"gallery-tile-name-row\">\n              <span v-if=\"row.t.isActive\" class=\"gallery-tile-active-tag\">{{ L.activeTag }}</span>\n              <div class=\"gallery-tile-name\" :title=\"row.t.identifier\"><span v-if=\"row.marker==='unread'\" class=\"gallery-marker unread\" :title=\"L.unread\"></span>{{ row.t.stem }}</div>\n              <div v-if=\"row.sub\" class=\"gallery-tile-sub\" :title=\"row.sub\">{{ row.sub }}</div>\n              <div class=\"gallery-tile-meta\">\n                <span v-if=\"row.t.encrypted\" class=\"gallery-tile-state-icon enc\" :title=\"L.encrypted\" v-html=\"ICON.lock\"></span>\n                <span :class=\"'gallery-tile-state-icon b-' + row.t.badge\" :title=\"row.t.badgeTitle\" v-html=\"badgeIcon(row.t.badge)\"></span>\n                <span>{{ fmtMeta(row.t) }}</span>\n              </div>\n            </div>\n            <button type=\"button\" class=\"gallery-tile-menu-btn\" :aria-label=\"L.more\" @click.stop=\"toggleMenu(row.t.identifier, $event)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#more\"/></svg></button>\n            <Teleport :to=\"menuMount\"><div class=\"gallery-tile-menu-popup hidden\" :data-menu=\"row.t.identifier\" @click.stop>\n              <template v-if=\"row.t.ghost\">\n                <!-- 0.8.6\uFF1A\u4E91\u7AEF\u6CA1\u4E86 \u2227 \u8FD9\u53F0\u6709\u6CA1\u4F20\u7684\u6539\u52A8\u2014\u2014\u53BB\u6389\u300C\u4E22\u5F03\uFF08\u9001\u56DE\u6536\u7AD9\uFF09\u300D\u90A3\u4E2A\u9762\u5916\u7684\u65B9\u5411\u52A8\u8BCD\uFF08user 2026-10-16\u300C\u51B2\u7A81\u53EA\u5728\u5E93\u7684\u9762\u91CC\u4E09\u9009\u4E00\u300D\uFF09\uFF1B\n                     \u300C\u5904\u7406\u2026\u300D= store file.resolve()\uFF1A\u5E93\u5F39\u9762\uFF08\u672C\u5730\u8986\u76D6\u4E91\u7AEF = \u91CD\u63A8 / \u4E91\u7AEF\u8986\u76D6\u672C\u5730 = \u8FD9\u4EFD\u8FDB\u56DE\u6536\u7AD9 / \u53D6\u6D88\uFF09\u3002\u300C\u91CD\u547D\u540D\u7559\u5B58\u300D\u7559\u7740\uFF1A\u4E0D\u662F\u540C\u6B65\u52A8\u8BCD\uFF0C\u662F\u6539\u8EAB\u4EFD\u53E6\u5B58\u3002 -->\n                <div class=\"gallery-menu-note\">{{ L.divergedNote }}</div>\n                <button type=\"button\" @click=\"resolve(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#cloud-pending\"/></svg><span>{{ L.resolve }}</span></button>\n                <button type=\"button\" @click=\"rename(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#rename\"/></svg><span>{{ L.renameKeep }}</span></button>\n              </template>\n              <template v-else-if=\"row.t.pendingGone\">\n                <!-- 0.8.3\uFF1A\u6CA1\u540C\u6B65\u597D\u7684\u884C\u53EA\u6709\u300C\u5904\u7406\u2026\u300D\uFF08\u5E93\u5F39\u9762\u4E09\u9009\u4E00\uFF09\u3002\u8FD9\u91CC\u4EE5\u524D\u8FD8\u653E\u7740\u300C\u9001\u5230\u56DE\u6536\u7AD9\u300D= \u53CC\u5411\u5220\u9664\uFF0C\u548C KudsRocket 2026-10-14 00:54 \u4E22\u5B58\u6863\u540C\u4E00\u4E2A\u5751\uFF08user\u300C\u51B2\u7A81\u7684\u65F6\u5019\u4E0D\u8981\u653E\u5220\u9664\u6309\u94AE\u300D\uFF09\uFF1B\n                     \u300C\u8FD9\u4EFD\u4E0D\u8981\u4E86\u300D= \u9762\u91CC\u9009\u4E91\u7AEF\u8986\u76D6\u672C\u5730\uFF0Cstore 0.18.5 \u8D77\u5E72\u51C0\u526F\u672C\u4E5F\u8D70\u8FD9\u5F20\u9762\u3002 -->\n                <button type=\"button\" @click=\"resolve(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#cloud-pending\"/></svg><span>{{ L.resolve }}</span></button>\n              </template>\n              <template v-else>\n                <button type=\"button\" @click=\"rename(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#rename\"/></svg><span>{{ L.rename }}</span></button>\n                <button type=\"button\" @click=\"move(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#move-to-folder\"/></svg><span>{{ L.moveTo }}</span></button>\n                <button type=\"button\" @click=\"copy(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#copy\"/></svg><span>{{ L.copy }}</span></button>\n                <button v-if=\"row.t.badge==='cloudOnly'\" type=\"button\" @click=\"openTile(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#download\"/></svg><span>{{ L.pullLocal }}</span></button>\n                <button v-if=\"row.t.badge==='cloudOnly'\" type=\"button\" @click=\"keepOffline(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#local-cache\"/></svg><span>{{ L.keepOffline }}</span></button>\n                <button v-if=\"row.t.badge==='localOnly' || row.t.badge==='float' || row.t.badge==='dirtyBoth' || row.t.badge==='conflictBoth'\" type=\"button\" @click=\"resolve(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#cloud-pending\"/></svg><span>{{ L.resolve }}</span></button>\n                <button v-if=\"row.t.hasLocal && row.t.hasCloud\" type=\"button\" @click=\"unload(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#unload-local-cache\"/></svg><span>{{ L.unloadLocal }}</span></button>\n                <button v-if=\"hasEncryption && row.t.hasLocal && !row.t.encrypted\" type=\"button\" @click=\"encryptItem(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#lock\"/></svg><span>{{ L.encrypt }}</span></button>\n                <button v-if=\"hasEncryption && row.t.hasLocal && row.t.encrypted\" type=\"button\" @click=\"decryptItem(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#unlock\"/></svg><span>{{ L.decrypt }}</span></button>\n                <button type=\"button\" class=\"danger\" @click=\"del(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#trash-can\"/></svg><span>{{ L.toTrash }}</span></button>\n              </template>\n            </div></Teleport>\n          </div>\n\n          <div v-for=\"im in imageTiles\" :key=\"'I:'+im.identifier\" class=\"gallery-tile image-file\" @click=\"openImageTile(im.raw)\">\n            <ImageThumbCell :identifier=\"im.identifier\" :token=\"im.token\" :fallback=\"im.label.slice(0,1) || '?'\" :alt=\"im.label\" />\n            <div class=\"gallery-tile-name-row\">\n              <div class=\"gallery-tile-name\" :title=\"im.identifier\">{{ im.label }}</div>\n              <div class=\"gallery-tile-meta\">\n                <span class=\"gallery-tile-state-icon\" :title=\"L.imageFile\" v-html=\"ICON.image\"></span>\n                <span>{{ fmtMeta({ time: im.time, size: im.size }) }}</span>\n              </div>\n            </div>\n            <button type=\"button\" class=\"gallery-tile-menu-btn\" :aria-label=\"L.more\" @click.stop=\"toggleMenu('I:'+im.identifier, $event)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#more\"/></svg></button>\n            <Teleport :to=\"menuMount\"><div class=\"gallery-tile-menu-popup hidden\" :data-menu=\"'I:'+im.identifier\" @click.stop>\n              <button type=\"button\" class=\"danger\" @click=\"deleteImage(im.raw)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#trash-can\"/></svg><span>{{ L.toTrash }}</span></button>\n            </div></Teleport>\n          </div>\n          <div v-for=\"ot in otherTiles\" :key=\"'O:'+ot.identifier\" class=\"gallery-tile other-file\">\n            <div class=\"gallery-tile-thumb\" v-html=\"ICON.file\"></div>\n            <div class=\"gallery-tile-name-row\">\n              <div class=\"gallery-tile-name\" :title=\"ot.identifier\">{{ ot.label }}</div>\n              <div class=\"gallery-tile-meta\">\n                <span class=\"gallery-tile-state-icon\" :title=\"L.otherFile\" v-html=\"ICON.file\"></span>\n                <span>{{ fmtMeta({ time: ot.time, size: ot.size }) }}</span>\n              </div>\n            </div>\n          </div>\n        </template>\n\n        <template v-if=\"view!=='files' && !loading\">\n          <div v-for=\"row in asideTiles\" :key=\"row.t.key\" class=\"gallery-tile aside\" :class=\"['aside-' + row.item.box, { encrypted: row.item.encrypted }]\">\n            <ThumbCell :fetchable=\"row.fetch\" :is-cloud=\"row.fetch && row.item.side==='cloud'\" thumb-token=\"0\" :fallback=\"row.t.stem.slice(0,1) || '?'\" :fallback-html=\"row.item.kind != null ? phHtml(row.t.identifier, row.info) : ''\" :alt=\"row.t.identifier\" />\n            <span v-if=\"row.ov\" class=\"gallery-tile-overlay\" v-html=\"row.ov\"></span>\n            <span v-if=\"row.item.encrypted\" class=\"gallery-tile-lockmark\" :title=\"L.encrypted\" v-html=\"ICON.lock\"></span>\n            <div class=\"gallery-tile-name-row\">\n              <div class=\"gallery-tile-name\" :title=\"row.t.identifier\">{{ row.t.stem }}</div>\n              <div class=\"gallery-tile-meta\" :title=\"fullTime(row.t.at)\">{{ row.t.source }} \u00B7 {{ humanTime(row.t.at) }} {{ row.atWord }}</div>\n            </div>\n            <button type=\"button\" class=\"gallery-tile-menu-btn\" :aria-label=\"L.more\" @click.stop=\"toggleMenu('A:'+row.t.key, $event)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#more\"/></svg></button>\n            <Teleport :to=\"menuMount\"><div class=\"gallery-tile-menu-popup hidden\" :data-menu=\"'A:'+row.t.key\" @click.stop>\n              <button type=\"button\" @click=\"asideRestore(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#restore-trash\"/></svg><span>{{ L.restore }}</span></button>\n              <button type=\"button\" class=\"danger\" @click=\"asidePurge(row.item)\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><use href=\"#trash-can\"/></svg><span>{{ L.purge }}</span></button>\n            </div></Teleport>\n          </div>\n        </template>\n      </div>\n\n      <div class=\"gallery-empty\" v-show=\"isEmpty && !loading\">{{ emptyText }}</div>\n`;\n", "// \u751F\u6210\u7269 \u2014\u2014 scripts/compile-templates.mjs \u81EA src/ui/templates.ts \u7F16\u8BD1\uFF08@vue/compiler-dom 3.5.35 prod\uFF09\u3002\u52FF\u624B\u6539\uFF1A\u6539\u6A21\u677F\u540E npm run build\u3002\n// \u7528\u9014\uFF1A\u5BBF\u4E3B\u628A\u6574\u4E2A Vue \u6A21\u5757\u9012\u8FDB\u6765\u65F6\uFF08VueRuntime \u91CC\u6709\u4E0B\u9762 HELPERS \u7684\u5168\u90E8\uFF09\uFF0C\u56FE\u5E93\u7528\u8FD9\u4E9B render \u51FD\u6570\u3001\u8FD0\u884C\u65F6\u4E0D\u7F16\u8BD1\u6A21\u677F = CSP \u4E0D\u7528\u653E\u884C eval\u30020.8.4\n/* eslint-disable */\n// @ts-nocheck\nexport const COMPILED_WITH_VUE = \"3.5.35\";\n/** render \u51FD\u6570\u8981\u4ECE\u5BBF\u4E3B\u7684 Vue \u91CC\u62FF\u7684 helper\uFF1B\u7F3A\u4EFB\u4F55\u4E00\u4E2A = \u9000\u56DE\u8FD0\u884C\u65F6\u7F16\u8BD1\u3002 */\nexport const HELPERS = [\"Fragment\", \"Teleport\", \"createBlock\", \"createCommentVNode\", \"createElementBlock\", \"createElementVNode\", \"createTextVNode\", \"createVNode\", \"normalizeClass\", \"normalizeStyle\", \"openBlock\", \"renderList\", \"resolveComponent\", \"toDisplayString\", \"vShow\", \"withDirectives\", \"withModifiers\"];\nexport function thumbCellRender(Vue) {\n    const { normalizeClass: _normalizeClass, openBlock: _openBlock, createElementBlock: _createElementBlock, createCommentVNode: _createCommentVNode, createElementVNode: _createElementVNode, withModifiers: _withModifiers, toDisplayString: _toDisplayString, createTextVNode: _createTextVNode, Fragment: _Fragment } = Vue;\n    const _hoisted_1 = [\"src\", \"alt\", \"title\"];\n    const _hoisted_2 = [\"title\"];\n    const _hoisted_3 = [\"innerHTML\"];\n    const _hoisted_4 = {\n        key: 2,\n        class: \"gallery-tile-thumb placeholder\",\n        ref: \"root\"\n    };\n    const _hoisted_5 = [\"innerHTML\"];\n    const _hoisted_6 = [\"innerHTML\"];\n    return function render(_ctx, _cache) {\n        return (_ctx.url)\n            ? (_openBlock(), _createElementBlock(\"img\", {\n                key: 0,\n                class: _normalizeClass([\"gallery-tile-thumb\", { pixelated: _ctx.pixelated }]),\n                src: _ctx.url,\n                alt: _ctx.alt,\n                title: _ctx.blurb || null,\n                loading: \"lazy\",\n                onLoad: _cache[0] || (_cache[0] = (...args) => (_ctx.onThumbLoad && _ctx.onThumbLoad(...args)))\n            }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_1))\n            : (_ctx.locked)\n                ? (_openBlock(), _createElementBlock(\"div\", {\n                    key: 1,\n                    class: \"gallery-tile-thumb placeholder locked\",\n                    title: _ctx.lockedTitle,\n                    onClick: _cache[1] || (_cache[1] = _withModifiers($event => (_ctx.$emit('unlock', _ctx.encName || _ctx.alt)), [\"stop\"]))\n                }, [\n                    _createElementVNode(\"span\", {\n                        style: { \"width\": \"42px\", \"height\": \"42px\", \"display\": \"inline-block\" },\n                        innerHTML: _ctx.ICON.lock\n                    }, null, 8 /* PROPS */, _hoisted_3)\n                ], 8 /* PROPS */, _hoisted_2))\n                : (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n                    (_ctx.showCloud)\n                        ? (_openBlock(), _createElementBlock(\"span\", {\n                            key: 0,\n                            style: { \"width\": \"48px\", \"height\": \"48px\", \"display\": \"inline-block\" },\n                            innerHTML: _ctx.ICON.cloudBig\n                        }, null, 8 /* PROPS */, _hoisted_5))\n                        : (_ctx.fallbackHtml)\n                            ? (_openBlock(), _createElementBlock(\"span\", {\n                                key: 1,\n                                class: \"gallery-tile-ph-icon\",\n                                innerHTML: _ctx.fallbackHtml\n                            }, null, 8 /* PROPS */, _hoisted_6))\n                            : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n                                _createTextVNode(_toDisplayString(_ctx.fallback), 1 /* TEXT */)\n                            ], 64 /* STABLE_FRAGMENT */))\n                ], 512 /* NEED_PATCH */));\n    };\n}\nexport function imageThumbCellRender(Vue) {\n    const { normalizeClass: _normalizeClass, openBlock: _openBlock, createElementBlock: _createElementBlock, createCommentVNode: _createCommentVNode, toDisplayString: _toDisplayString } = Vue;\n    const _hoisted_1 = [\"src\", \"alt\"];\n    return function render(_ctx, _cache) {\n        return (_ctx.url)\n            ? (_openBlock(), _createElementBlock(\"img\", {\n                key: 0,\n                class: _normalizeClass([\"gallery-tile-thumb\", { pixelated: _ctx.pixelated }]),\n                src: _ctx.url,\n                alt: _ctx.alt,\n                loading: \"lazy\",\n                onLoad: _cache[0] || (_cache[0] = (...args) => (_ctx.onThumbLoad && _ctx.onThumbLoad(...args)))\n            }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_1))\n            : (_openBlock(), _createElementBlock(\"div\", {\n                key: 1,\n                class: \"gallery-tile-thumb placeholder\",\n                ref: \"root\"\n            }, _toDisplayString(_ctx.fallback), 513 /* TEXT, NEED_PATCH */));\n    };\n}\nexport function galleryRender(Vue) {\n    const { renderList: _renderList, Fragment: _Fragment, openBlock: _openBlock, createElementBlock: _createElementBlock, createCommentVNode: _createCommentVNode, toDisplayString: _toDisplayString, normalizeClass: _normalizeClass, createElementVNode: _createElementVNode, createTextVNode: _createTextVNode, withModifiers: _withModifiers, Teleport: _Teleport, createBlock: _createBlock, resolveComponent: _resolveComponent, createVNode: _createVNode, vShow: _vShow, normalizeStyle: _normalizeStyle, withDirectives: _withDirectives } = Vue;\n    const _hoisted_1 = {\n        key: 0,\n        class: \"sep\"\n    };\n    const _hoisted_2 = [\"onClick\"];\n    const _hoisted_3 = {\n        key: 1,\n        class: \"gallery-breadcrumb gallery-aside-bar\"\n    };\n    const _hoisted_4 = {\n        key: 0,\n        class: \"gallery-loading\"\n    };\n    const _hoisted_5 = { class: \"gallery-stalled\" };\n    const _hoisted_6 = { class: \"gallery-stalled-actions\" };\n    const _hoisted_7 = [\"onClick\"];\n    const _hoisted_8 = [\"innerHTML\"];\n    const _hoisted_9 = { class: \"gallery-tile-name-row\" };\n    const _hoisted_10 = [\"title\"];\n    const _hoisted_11 = { class: \"gallery-tile-meta\" };\n    const _hoisted_12 = [\"aria-label\", \"onClick\"];\n    const _hoisted_13 = [\"data-menu\"];\n    const _hoisted_14 = [\"onClick\"];\n    const _hoisted_15 = [\"onClick\"];\n    const _hoisted_16 = [\"innerHTML\"];\n    const _hoisted_17 = {\n        key: 1,\n        class: \"gallery-tile-action-slot\"\n    };\n    const _hoisted_18 = [\"title\", \"aria-label\", \"onClick\", \"innerHTML\"];\n    const _hoisted_19 = [\"title\", \"innerHTML\"];\n    const _hoisted_20 = { class: \"gallery-tile-name-row\" };\n    const _hoisted_21 = {\n        key: 0,\n        class: \"gallery-tile-active-tag\"\n    };\n    const _hoisted_22 = [\"title\"];\n    const _hoisted_23 = [\"title\"];\n    const _hoisted_24 = [\"title\"];\n    const _hoisted_25 = { class: \"gallery-tile-meta\" };\n    const _hoisted_26 = [\"title\", \"innerHTML\"];\n    const _hoisted_27 = [\"title\", \"innerHTML\"];\n    const _hoisted_28 = [\"aria-label\", \"onClick\"];\n    const _hoisted_29 = [\"data-menu\"];\n    const _hoisted_30 = { class: \"gallery-menu-note\" };\n    const _hoisted_31 = [\"onClick\"];\n    const _hoisted_32 = [\"onClick\"];\n    const _hoisted_33 = [\"onClick\"];\n    const _hoisted_34 = [\"onClick\"];\n    const _hoisted_35 = [\"onClick\"];\n    const _hoisted_36 = [\"onClick\"];\n    const _hoisted_37 = [\"onClick\"];\n    const _hoisted_38 = [\"onClick\"];\n    const _hoisted_39 = [\"onClick\"];\n    const _hoisted_40 = [\"onClick\"];\n    const _hoisted_41 = [\"onClick\"];\n    const _hoisted_42 = [\"onClick\"];\n    const _hoisted_43 = [\"onClick\"];\n    const _hoisted_44 = [\"onClick\"];\n    const _hoisted_45 = { class: \"gallery-tile-name-row\" };\n    const _hoisted_46 = [\"title\"];\n    const _hoisted_47 = { class: \"gallery-tile-meta\" };\n    const _hoisted_48 = [\"title\", \"innerHTML\"];\n    const _hoisted_49 = [\"aria-label\", \"onClick\"];\n    const _hoisted_50 = [\"data-menu\"];\n    const _hoisted_51 = [\"onClick\"];\n    const _hoisted_52 = [\"innerHTML\"];\n    const _hoisted_53 = { class: \"gallery-tile-name-row\" };\n    const _hoisted_54 = [\"title\"];\n    const _hoisted_55 = { class: \"gallery-tile-meta\" };\n    const _hoisted_56 = [\"title\", \"innerHTML\"];\n    const _hoisted_57 = [\"innerHTML\"];\n    const _hoisted_58 = [\"title\", \"innerHTML\"];\n    const _hoisted_59 = { class: \"gallery-tile-name-row\" };\n    const _hoisted_60 = [\"title\"];\n    const _hoisted_61 = [\"title\"];\n    const _hoisted_62 = [\"aria-label\", \"onClick\"];\n    const _hoisted_63 = [\"data-menu\"];\n    const _hoisted_64 = [\"onClick\"];\n    const _hoisted_65 = [\"onClick\"];\n    return function render(_ctx, _cache) {\n        const _component_ThumbCell = _resolveComponent(\"ThumbCell\");\n        const _component_ImageThumbCell = _resolveComponent(\"ImageThumbCell\");\n        return (_openBlock(), _createElementBlock(_Fragment, null, [\n            (_ctx.view === 'files')\n                ? (_openBlock(), _createElementBlock(\"div\", {\n                    key: 0,\n                    class: _normalizeClass([\"gallery-breadcrumb\", { hidden: !_ctx.folder }])\n                }, [\n                    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.crumbs, (c, i) => {\n                        return (_openBlock(), _createElementBlock(_Fragment, {\n                            key: c.path\n                        }, [\n                            (i > 0)\n                                ? (_openBlock(), _createElementBlock(\"span\", _hoisted_1, \"\u203A\"))\n                                : _createCommentVNode(\"v-if\", true),\n                            _createElementVNode(\"button\", {\n                                type: \"button\",\n                                class: _normalizeClass({ current: c.current }),\n                                onClick: $event => (!c.current && _ctx.setFolder(c.path))\n                            }, _toDisplayString(c.label), 11 /* TEXT, CLASS, PROPS */, _hoisted_2)\n                        ], 64 /* STABLE_FRAGMENT */));\n                    }), 128 /* KEYED_FRAGMENT */))\n                ], 2 /* CLASS */))\n                : _createCommentVNode(\"v-if\", true),\n            (_ctx.view !== 'files' && !_ctx.loading && !_ctx.isEmpty)\n                ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [\n                    _createElementVNode(\"button\", {\n                        type: \"button\",\n                        class: \"danger\",\n                        onClick: _cache[0] || (_cache[0] = $event => (_ctx.emptyAside(_ctx.view)))\n                    }, _toDisplayString(_ctx.view === 'trash' ? _ctx.L.emptyTrash : _ctx.L.emptyBackup), 1 /* TEXT */)\n                ]))\n                : _createCommentVNode(\"v-if\", true),\n            _withDirectives(_createElementVNode(\"div\", {\n                class: _normalizeClass([\"gallery-grid\", { tall: _ctx.tileTall, list: _ctx.layout === 'list' }]),\n                style: _normalizeStyle(_ctx.tileStyle)\n            }, [\n                (_ctx.loading)\n                    ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n                        (!_ctx.stalled)\n                            ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n                                _createTextVNode(_toDisplayString(_ctx.L.loading), 1 /* TEXT */)\n                            ], 64 /* STABLE_FRAGMENT */))\n                            : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n                                _createElementVNode(\"div\", _hoisted_5, _toDisplayString(_ctx.stalled), 1 /* TEXT */),\n                                _createElementVNode(\"div\", _hoisted_6, [\n                                    _createElementVNode(\"button\", {\n                                        type: \"button\",\n                                        class: \"sheet-action ghost gallery-retry-btn\",\n                                        onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.retry && _ctx.retry(...args)))\n                                    }, _toDisplayString(_ctx.L.retry), 1 /* TEXT */),\n                                    _createElementVNode(\"button\", {\n                                        type: \"button\",\n                                        class: \"sheet-action ghost\",\n                                        onClick: _cache[2] || (_cache[2] = (...args) => (_ctx.openDiag && _ctx.openDiag(...args)))\n                                    }, _toDisplayString(_ctx.L.openDiag), 1 /* TEXT */),\n                                    _createElementVNode(\"button\", {\n                                        type: \"button\",\n                                        class: \"sheet-action ghost\",\n                                        onClick: _cache[3] || (_cache[3] = (...args) => (_ctx.reloadApp && _ctx.reloadApp(...args)))\n                                    }, _toDisplayString(_ctx.L.reload), 1 /* TEXT */)\n                                ])\n                            ], 64 /* STABLE_FRAGMENT */))\n                    ]))\n                    : _createCommentVNode(\"v-if\", true),\n                (_ctx.view === 'files' && !_ctx.loading)\n                    ? (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [\n                        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.folderTiles, (ft) => {\n                            return (_openBlock(), _createElementBlock(\"div\", {\n                                key: 'F:' + ft.path,\n                                class: \"gallery-tile folder\",\n                                onClick: $event => (_ctx.enterFolder(ft.path))\n                            }, [\n                                _createElementVNode(\"div\", {\n                                    class: \"gallery-tile-thumb\",\n                                    innerHTML: _ctx.ICON.folder\n                                }, null, 8 /* PROPS */, _hoisted_8),\n                                _createElementVNode(\"div\", _hoisted_9, [\n                                    _createElementVNode(\"div\", {\n                                        class: \"gallery-tile-name\",\n                                        title: ft.path\n                                    }, _toDisplayString(ft.name), 9 /* TEXT, PROPS */, _hoisted_10),\n                                    _createElementVNode(\"div\", _hoisted_11, _toDisplayString(_ctx.L.folder), 1 /* TEXT */)\n                                ]),\n                                _createElementVNode(\"button\", {\n                                    type: \"button\",\n                                    class: \"gallery-tile-menu-btn\",\n                                    \"aria-label\": _ctx.L.more,\n                                    onClick: _withModifiers($event => (_ctx.toggleMenu('F:' + ft.path, $event)), [\"stop\"])\n                                }, [...(_cache[9] || (_cache[9] = [\n                                        _createElementVNode(\"svg\", {\n                                            viewBox: \"0 0 24 24\",\n                                            \"aria-hidden\": \"true\"\n                                        }, [\n                                            _createElementVNode(\"use\", { href: \"#more\" })\n                                        ], -1 /* CACHED */)\n                                    ]))], 8 /* PROPS */, _hoisted_12),\n                                (_openBlock(), _createBlock(_Teleport, { to: _ctx.menuMount }, [\n                                    _createElementVNode(\"div\", {\n                                        class: \"gallery-tile-menu-popup hidden\",\n                                        \"data-menu\": 'F:' + ft.path,\n                                        onClick: _cache[4] || (_cache[4] = _withModifiers(() => { }, [\"stop\"]))\n                                    }, [\n                                        _createElementVNode(\"button\", {\n                                            type: \"button\",\n                                            class: \"danger\",\n                                            onClick: $event => (_ctx.folderDelete(ft))\n                                        }, [\n                                            _cache[10] || (_cache[10] = _createElementVNode(\"svg\", {\n                                                viewBox: \"0 0 24 24\",\n                                                \"aria-hidden\": \"true\"\n                                            }, [\n                                                _createElementVNode(\"use\", { href: \"#trash-can\" })\n                                            ], -1 /* CACHED */)),\n                                            _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.delEmptyFolder), 1 /* TEXT */)\n                                        ], 8 /* PROPS */, _hoisted_14)\n                                    ], 8 /* PROPS */, _hoisted_13)\n                                ], 8 /* PROPS */, [\"to\"]))\n                            ], 8 /* PROPS */, _hoisted_7));\n                        }), 128 /* KEYED_FRAGMENT */)),\n                        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.fileTiles, (row) => {\n                            return (_openBlock(), _createElementBlock(\"div\", {\n                                key: row.t.identifier,\n                                class: _normalizeClass([\"gallery-tile\", { active: row.t.isActive, encrypted: row.t.encrypted }]),\n                                onClick: $event => (_ctx.openTile(row.item))\n                            }, [\n                                _createVNode(_component_ThumbCell, {\n                                    \"enc-name\": row.t.encrypted && row.thumb ? row.t.identifier : null,\n                                    fetchable: !row.t.encrypted && (row.t.hasCloud || row.t.hasLocal) && row.thumb,\n                                    \"is-cloud\": !row.t.hasLocal && row.t.hasCloud,\n                                    \"cloud-newer\": row.t.cloudNewer,\n                                    \"thumb-token\": String(row.t.time || row.t.size || 0),\n                                    fallback: row.t.stem.slice(0, 1) || '?',\n                                    \"fallback-html\": _ctx.phHtml(row.t.identifier, row.info),\n                                    alt: row.t.identifier,\n                                    onUnlock: _ctx.onUnlock\n                                }, null, 8 /* PROPS */, [\"enc-name\", \"fetchable\", \"is-cloud\", \"cloud-newer\", \"thumb-token\", \"fallback\", \"fallback-html\", \"alt\", \"onUnlock\"]),\n                                (row.ov)\n                                    ? (_openBlock(), _createElementBlock(\"span\", {\n                                        key: 0,\n                                        class: \"gallery-tile-overlay\",\n                                        innerHTML: row.ov\n                                    }, null, 8 /* PROPS */, _hoisted_16))\n                                    : _createCommentVNode(\"v-if\", true),\n                                (row.act)\n                                    ? (_openBlock(), _createElementBlock(\"span\", _hoisted_17, [\n                                        _createElementVNode(\"button\", {\n                                            type: \"button\",\n                                            class: _normalizeClass([\"gallery-tile-action\", row.act.state || 'ready']),\n                                            title: row.act.title,\n                                            \"aria-label\": row.act.title,\n                                            onClick: _withModifiers($event => (_ctx.tileAction(row.item)), [\"stop\"]),\n                                            onPointerdown: _cache[5] || (_cache[5] = _withModifiers(() => { }, [\"stop\"])),\n                                            innerHTML: _ctx.badgeIcon2(row.act.icon)\n                                        }, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_18)\n                                    ]))\n                                    : _createCommentVNode(\"v-if\", true),\n                                (row.t.encrypted)\n                                    ? (_openBlock(), _createElementBlock(\"span\", {\n                                        key: 2,\n                                        class: \"gallery-tile-lockmark\",\n                                        title: _ctx.L.encrypted,\n                                        innerHTML: _ctx.ICON.lock\n                                    }, null, 8 /* PROPS */, _hoisted_19))\n                                    : _createCommentVNode(\"v-if\", true),\n                                _createElementVNode(\"div\", _hoisted_20, [\n                                    (row.t.isActive)\n                                        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_21, _toDisplayString(_ctx.L.activeTag), 1 /* TEXT */))\n                                        : _createCommentVNode(\"v-if\", true),\n                                    _createElementVNode(\"div\", {\n                                        class: \"gallery-tile-name\",\n                                        title: row.t.identifier\n                                    }, [\n                                        (row.marker === 'unread')\n                                            ? (_openBlock(), _createElementBlock(\"span\", {\n                                                key: 0,\n                                                class: \"gallery-marker unread\",\n                                                title: _ctx.L.unread\n                                            }, null, 8 /* PROPS */, _hoisted_23))\n                                            : _createCommentVNode(\"v-if\", true),\n                                        _createTextVNode(_toDisplayString(row.t.stem), 1 /* TEXT */)\n                                    ], 8 /* PROPS */, _hoisted_22),\n                                    (row.sub)\n                                        ? (_openBlock(), _createElementBlock(\"div\", {\n                                            key: 1,\n                                            class: \"gallery-tile-sub\",\n                                            title: row.sub\n                                        }, _toDisplayString(row.sub), 9 /* TEXT, PROPS */, _hoisted_24))\n                                        : _createCommentVNode(\"v-if\", true),\n                                    _createElementVNode(\"div\", _hoisted_25, [\n                                        (row.t.encrypted)\n                                            ? (_openBlock(), _createElementBlock(\"span\", {\n                                                key: 0,\n                                                class: \"gallery-tile-state-icon enc\",\n                                                title: _ctx.L.encrypted,\n                                                innerHTML: _ctx.ICON.lock\n                                            }, null, 8 /* PROPS */, _hoisted_26))\n                                            : _createCommentVNode(\"v-if\", true),\n                                        _createElementVNode(\"span\", {\n                                            class: _normalizeClass('gallery-tile-state-icon b-' + row.t.badge),\n                                            title: row.t.badgeTitle,\n                                            innerHTML: _ctx.badgeIcon(row.t.badge)\n                                        }, null, 10 /* CLASS, PROPS */, _hoisted_27),\n                                        _createElementVNode(\"span\", null, _toDisplayString(_ctx.fmtMeta(row.t)), 1 /* TEXT */)\n                                    ])\n                                ]),\n                                _createElementVNode(\"button\", {\n                                    type: \"button\",\n                                    class: \"gallery-tile-menu-btn\",\n                                    \"aria-label\": _ctx.L.more,\n                                    onClick: _withModifiers($event => (_ctx.toggleMenu(row.t.identifier, $event)), [\"stop\"])\n                                }, [...(_cache[11] || (_cache[11] = [\n                                        _createElementVNode(\"svg\", {\n                                            viewBox: \"0 0 24 24\",\n                                            \"aria-hidden\": \"true\"\n                                        }, [\n                                            _createElementVNode(\"use\", { href: \"#more\" })\n                                        ], -1 /* CACHED */)\n                                    ]))], 8 /* PROPS */, _hoisted_28),\n                                (_openBlock(), _createBlock(_Teleport, { to: _ctx.menuMount }, [\n                                    _createElementVNode(\"div\", {\n                                        class: \"gallery-tile-menu-popup hidden\",\n                                        \"data-menu\": row.t.identifier,\n                                        onClick: _cache[6] || (_cache[6] = _withModifiers(() => { }, [\"stop\"]))\n                                    }, [\n                                        (row.t.ghost)\n                                            ? (_openBlock(), _createElementBlock(_Fragment, { key: 0 }, [\n                                                _createElementVNode(\"div\", _hoisted_30, _toDisplayString(_ctx.L.divergedNote), 1 /* TEXT */),\n                                                _createElementVNode(\"button\", {\n                                                    type: \"button\",\n                                                    onClick: $event => (_ctx.resolve(row.item))\n                                                }, [\n                                                    _cache[12] || (_cache[12] = _createElementVNode(\"svg\", {\n                                                        viewBox: \"0 0 24 24\",\n                                                        \"aria-hidden\": \"true\"\n                                                    }, [\n                                                        _createElementVNode(\"use\", { href: \"#cloud-pending\" })\n                                                    ], -1 /* CACHED */)),\n                                                    _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.resolve), 1 /* TEXT */)\n                                                ], 8 /* PROPS */, _hoisted_31),\n                                                _createElementVNode(\"button\", {\n                                                    type: \"button\",\n                                                    onClick: $event => (_ctx.rename(row.item))\n                                                }, [\n                                                    _cache[13] || (_cache[13] = _createElementVNode(\"svg\", {\n                                                        viewBox: \"0 0 24 24\",\n                                                        \"aria-hidden\": \"true\"\n                                                    }, [\n                                                        _createElementVNode(\"use\", { href: \"#rename\" })\n                                                    ], -1 /* CACHED */)),\n                                                    _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.renameKeep), 1 /* TEXT */)\n                                                ], 8 /* PROPS */, _hoisted_32)\n                                            ], 64 /* STABLE_FRAGMENT */))\n                                            : (row.t.pendingGone)\n                                                ? (_openBlock(), _createElementBlock(\"button\", {\n                                                    key: 1,\n                                                    type: \"button\",\n                                                    onClick: $event => (_ctx.resolve(row.item))\n                                                }, [\n                                                    _cache[14] || (_cache[14] = _createElementVNode(\"svg\", {\n                                                        viewBox: \"0 0 24 24\",\n                                                        \"aria-hidden\": \"true\"\n                                                    }, [\n                                                        _createElementVNode(\"use\", { href: \"#cloud-pending\" })\n                                                    ], -1 /* CACHED */)),\n                                                    _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.resolve), 1 /* TEXT */)\n                                                ], 8 /* PROPS */, _hoisted_33))\n                                                : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\n                                                    _createElementVNode(\"button\", {\n                                                        type: \"button\",\n                                                        onClick: $event => (_ctx.rename(row.item))\n                                                    }, [\n                                                        _cache[15] || (_cache[15] = _createElementVNode(\"svg\", {\n                                                            viewBox: \"0 0 24 24\",\n                                                            \"aria-hidden\": \"true\"\n                                                        }, [\n                                                            _createElementVNode(\"use\", { href: \"#rename\" })\n                                                        ], -1 /* CACHED */)),\n                                                        _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.rename), 1 /* TEXT */)\n                                                    ], 8 /* PROPS */, _hoisted_34),\n                                                    _createElementVNode(\"button\", {\n                                                        type: \"button\",\n                                                        onClick: $event => (_ctx.move(row.item))\n                                                    }, [\n                                                        _cache[16] || (_cache[16] = _createElementVNode(\"svg\", {\n                                                            viewBox: \"0 0 24 24\",\n                                                            \"aria-hidden\": \"true\"\n                                                        }, [\n                                                            _createElementVNode(\"use\", { href: \"#move-to-folder\" })\n                                                        ], -1 /* CACHED */)),\n                                                        _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.moveTo), 1 /* TEXT */)\n                                                    ], 8 /* PROPS */, _hoisted_35),\n                                                    _createElementVNode(\"button\", {\n                                                        type: \"button\",\n                                                        onClick: $event => (_ctx.copy(row.item))\n                                                    }, [\n                                                        _cache[17] || (_cache[17] = _createElementVNode(\"svg\", {\n                                                            viewBox: \"0 0 24 24\",\n                                                            \"aria-hidden\": \"true\"\n                                                        }, [\n                                                            _createElementVNode(\"use\", { href: \"#copy\" })\n                                                        ], -1 /* CACHED */)),\n                                                        _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.copy), 1 /* TEXT */)\n                                                    ], 8 /* PROPS */, _hoisted_36),\n                                                    (row.t.badge === 'cloudOnly')\n                                                        ? (_openBlock(), _createElementBlock(\"button\", {\n                                                            key: 0,\n                                                            type: \"button\",\n                                                            onClick: $event => (_ctx.openTile(row.item))\n                                                        }, [\n                                                            _cache[18] || (_cache[18] = _createElementVNode(\"svg\", {\n                                                                viewBox: \"0 0 24 24\",\n                                                                \"aria-hidden\": \"true\"\n                                                            }, [\n                                                                _createElementVNode(\"use\", { href: \"#download\" })\n                                                            ], -1 /* CACHED */)),\n                                                            _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.pullLocal), 1 /* TEXT */)\n                                                        ], 8 /* PROPS */, _hoisted_37))\n                                                        : _createCommentVNode(\"v-if\", true),\n                                                    (row.t.badge === 'cloudOnly')\n                                                        ? (_openBlock(), _createElementBlock(\"button\", {\n                                                            key: 1,\n                                                            type: \"button\",\n                                                            onClick: $event => (_ctx.keepOffline(row.item))\n                                                        }, [\n                                                            _cache[19] || (_cache[19] = _createElementVNode(\"svg\", {\n                                                                viewBox: \"0 0 24 24\",\n                                                                \"aria-hidden\": \"true\"\n                                                            }, [\n                                                                _createElementVNode(\"use\", { href: \"#local-cache\" })\n                                                            ], -1 /* CACHED */)),\n                                                            _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.keepOffline), 1 /* TEXT */)\n                                                        ], 8 /* PROPS */, _hoisted_38))\n                                                        : _createCommentVNode(\"v-if\", true),\n                                                    (row.t.badge === 'localOnly' || row.t.badge === 'float' || row.t.badge === 'dirtyBoth' || row.t.badge === 'conflictBoth')\n                                                        ? (_openBlock(), _createElementBlock(\"button\", {\n                                                            key: 2,\n                                                            type: \"button\",\n                                                            onClick: $event => (_ctx.resolve(row.item))\n                                                        }, [\n                                                            _cache[20] || (_cache[20] = _createElementVNode(\"svg\", {\n                                                                viewBox: \"0 0 24 24\",\n                                                                \"aria-hidden\": \"true\"\n                                                            }, [\n                                                                _createElementVNode(\"use\", { href: \"#cloud-pending\" })\n                                                            ], -1 /* CACHED */)),\n                                                            _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.resolve), 1 /* TEXT */)\n                                                        ], 8 /* PROPS */, _hoisted_39))\n                                                        : _createCommentVNode(\"v-if\", true),\n                                                    (row.t.hasLocal && row.t.hasCloud)\n                                                        ? (_openBlock(), _createElementBlock(\"button\", {\n                                                            key: 3,\n                                                            type: \"button\",\n                                                            onClick: $event => (_ctx.unload(row.item))\n                                                        }, [\n                                                            _cache[21] || (_cache[21] = _createElementVNode(\"svg\", {\n                                                                viewBox: \"0 0 24 24\",\n                                                                \"aria-hidden\": \"true\"\n                                                            }, [\n                                                                _createElementVNode(\"use\", { href: \"#unload-local-cache\" })\n                                                            ], -1 /* CACHED */)),\n                                                            _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.unloadLocal), 1 /* TEXT */)\n                                                        ], 8 /* PROPS */, _hoisted_40))\n                                                        : _createCommentVNode(\"v-if\", true),\n                                                    (_ctx.hasEncryption && row.t.hasLocal && !row.t.encrypted)\n                                                        ? (_openBlock(), _createElementBlock(\"button\", {\n                                                            key: 4,\n                                                            type: \"button\",\n                                                            onClick: $event => (_ctx.encryptItem(row.item))\n                                                        }, [\n                                                            _cache[22] || (_cache[22] = _createElementVNode(\"svg\", {\n                                                                viewBox: \"0 0 24 24\",\n                                                                \"aria-hidden\": \"true\"\n                                                            }, [\n                                                                _createElementVNode(\"use\", { href: \"#lock\" })\n                                                            ], -1 /* CACHED */)),\n                                                            _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.encrypt), 1 /* TEXT */)\n                                                        ], 8 /* PROPS */, _hoisted_41))\n                                                        : _createCommentVNode(\"v-if\", true),\n                                                    (_ctx.hasEncryption && row.t.hasLocal && row.t.encrypted)\n                                                        ? (_openBlock(), _createElementBlock(\"button\", {\n                                                            key: 5,\n                                                            type: \"button\",\n                                                            onClick: $event => (_ctx.decryptItem(row.item))\n                                                        }, [\n                                                            _cache[23] || (_cache[23] = _createElementVNode(\"svg\", {\n                                                                viewBox: \"0 0 24 24\",\n                                                                \"aria-hidden\": \"true\"\n                                                            }, [\n                                                                _createElementVNode(\"use\", { href: \"#unlock\" })\n                                                            ], -1 /* CACHED */)),\n                                                            _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.decrypt), 1 /* TEXT */)\n                                                        ], 8 /* PROPS */, _hoisted_42))\n                                                        : _createCommentVNode(\"v-if\", true),\n                                                    _createElementVNode(\"button\", {\n                                                        type: \"button\",\n                                                        class: \"danger\",\n                                                        onClick: $event => (_ctx.del(row.item))\n                                                    }, [\n                                                        _cache[24] || (_cache[24] = _createElementVNode(\"svg\", {\n                                                            viewBox: \"0 0 24 24\",\n                                                            \"aria-hidden\": \"true\"\n                                                        }, [\n                                                            _createElementVNode(\"use\", { href: \"#trash-can\" })\n                                                        ], -1 /* CACHED */)),\n                                                        _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.toTrash), 1 /* TEXT */)\n                                                    ], 8 /* PROPS */, _hoisted_43)\n                                                ], 64 /* STABLE_FRAGMENT */))\n                                    ], 8 /* PROPS */, _hoisted_29)\n                                ], 8 /* PROPS */, [\"to\"]))\n                            ], 10 /* CLASS, PROPS */, _hoisted_15));\n                        }), 128 /* KEYED_FRAGMENT */)),\n                        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.imageTiles, (im) => {\n                            return (_openBlock(), _createElementBlock(\"div\", {\n                                key: 'I:' + im.identifier,\n                                class: \"gallery-tile image-file\",\n                                onClick: $event => (_ctx.openImageTile(im.raw))\n                            }, [\n                                _createVNode(_component_ImageThumbCell, {\n                                    identifier: im.identifier,\n                                    token: im.token,\n                                    fallback: im.label.slice(0, 1) || '?',\n                                    alt: im.label\n                                }, null, 8 /* PROPS */, [\"identifier\", \"token\", \"fallback\", \"alt\"]),\n                                _createElementVNode(\"div\", _hoisted_45, [\n                                    _createElementVNode(\"div\", {\n                                        class: \"gallery-tile-name\",\n                                        title: im.identifier\n                                    }, _toDisplayString(im.label), 9 /* TEXT, PROPS */, _hoisted_46),\n                                    _createElementVNode(\"div\", _hoisted_47, [\n                                        _createElementVNode(\"span\", {\n                                            class: \"gallery-tile-state-icon\",\n                                            title: _ctx.L.imageFile,\n                                            innerHTML: _ctx.ICON.image\n                                        }, null, 8 /* PROPS */, _hoisted_48),\n                                        _createElementVNode(\"span\", null, _toDisplayString(_ctx.fmtMeta({ time: im.time, size: im.size })), 1 /* TEXT */)\n                                    ])\n                                ]),\n                                _createElementVNode(\"button\", {\n                                    type: \"button\",\n                                    class: \"gallery-tile-menu-btn\",\n                                    \"aria-label\": _ctx.L.more,\n                                    onClick: _withModifiers($event => (_ctx.toggleMenu('I:' + im.identifier, $event)), [\"stop\"])\n                                }, [...(_cache[25] || (_cache[25] = [\n                                        _createElementVNode(\"svg\", {\n                                            viewBox: \"0 0 24 24\",\n                                            \"aria-hidden\": \"true\"\n                                        }, [\n                                            _createElementVNode(\"use\", { href: \"#more\" })\n                                        ], -1 /* CACHED */)\n                                    ]))], 8 /* PROPS */, _hoisted_49),\n                                (_openBlock(), _createBlock(_Teleport, { to: _ctx.menuMount }, [\n                                    _createElementVNode(\"div\", {\n                                        class: \"gallery-tile-menu-popup hidden\",\n                                        \"data-menu\": 'I:' + im.identifier,\n                                        onClick: _cache[7] || (_cache[7] = _withModifiers(() => { }, [\"stop\"]))\n                                    }, [\n                                        _createElementVNode(\"button\", {\n                                            type: \"button\",\n                                            class: \"danger\",\n                                            onClick: $event => (_ctx.deleteImage(im.raw))\n                                        }, [\n                                            _cache[26] || (_cache[26] = _createElementVNode(\"svg\", {\n                                                viewBox: \"0 0 24 24\",\n                                                \"aria-hidden\": \"true\"\n                                            }, [\n                                                _createElementVNode(\"use\", { href: \"#trash-can\" })\n                                            ], -1 /* CACHED */)),\n                                            _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.toTrash), 1 /* TEXT */)\n                                        ], 8 /* PROPS */, _hoisted_51)\n                                    ], 8 /* PROPS */, _hoisted_50)\n                                ], 8 /* PROPS */, [\"to\"]))\n                            ], 8 /* PROPS */, _hoisted_44));\n                        }), 128 /* KEYED_FRAGMENT */)),\n                        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.otherTiles, (ot) => {\n                            return (_openBlock(), _createElementBlock(\"div\", {\n                                key: 'O:' + ot.identifier,\n                                class: \"gallery-tile other-file\"\n                            }, [\n                                _createElementVNode(\"div\", {\n                                    class: \"gallery-tile-thumb\",\n                                    innerHTML: _ctx.ICON.file\n                                }, null, 8 /* PROPS */, _hoisted_52),\n                                _createElementVNode(\"div\", _hoisted_53, [\n                                    _createElementVNode(\"div\", {\n                                        class: \"gallery-tile-name\",\n                                        title: ot.identifier\n                                    }, _toDisplayString(ot.label), 9 /* TEXT, PROPS */, _hoisted_54),\n                                    _createElementVNode(\"div\", _hoisted_55, [\n                                        _createElementVNode(\"span\", {\n                                            class: \"gallery-tile-state-icon\",\n                                            title: _ctx.L.otherFile,\n                                            innerHTML: _ctx.ICON.file\n                                        }, null, 8 /* PROPS */, _hoisted_56),\n                                        _createElementVNode(\"span\", null, _toDisplayString(_ctx.fmtMeta({ time: ot.time, size: ot.size })), 1 /* TEXT */)\n                                    ])\n                                ])\n                            ]));\n                        }), 128 /* KEYED_FRAGMENT */))\n                    ], 64 /* STABLE_FRAGMENT */))\n                    : _createCommentVNode(\"v-if\", true),\n                (_ctx.view !== 'files' && !_ctx.loading)\n                    ? (_openBlock(true), _createElementBlock(_Fragment, { key: 2 }, _renderList(_ctx.asideTiles, (row) => {\n                        return (_openBlock(), _createElementBlock(\"div\", {\n                            key: row.t.key,\n                            class: _normalizeClass([\"gallery-tile aside\", ['aside-' + row.item.box, { encrypted: row.item.encrypted }]])\n                        }, [\n                            _createVNode(_component_ThumbCell, {\n                                fetchable: row.fetch,\n                                \"is-cloud\": row.fetch && row.item.side === 'cloud',\n                                \"thumb-token\": \"0\",\n                                fallback: row.t.stem.slice(0, 1) || '?',\n                                \"fallback-html\": row.item.kind != null ? _ctx.phHtml(row.t.identifier, row.info) : '',\n                                alt: row.t.identifier\n                            }, null, 8 /* PROPS */, [\"fetchable\", \"is-cloud\", \"fallback\", \"fallback-html\", \"alt\"]),\n                            (row.ov)\n                                ? (_openBlock(), _createElementBlock(\"span\", {\n                                    key: 0,\n                                    class: \"gallery-tile-overlay\",\n                                    innerHTML: row.ov\n                                }, null, 8 /* PROPS */, _hoisted_57))\n                                : _createCommentVNode(\"v-if\", true),\n                            (row.item.encrypted)\n                                ? (_openBlock(), _createElementBlock(\"span\", {\n                                    key: 1,\n                                    class: \"gallery-tile-lockmark\",\n                                    title: _ctx.L.encrypted,\n                                    innerHTML: _ctx.ICON.lock\n                                }, null, 8 /* PROPS */, _hoisted_58))\n                                : _createCommentVNode(\"v-if\", true),\n                            _createElementVNode(\"div\", _hoisted_59, [\n                                _createElementVNode(\"div\", {\n                                    class: \"gallery-tile-name\",\n                                    title: row.t.identifier\n                                }, _toDisplayString(row.t.stem), 9 /* TEXT, PROPS */, _hoisted_60),\n                                _createElementVNode(\"div\", {\n                                    class: \"gallery-tile-meta\",\n                                    title: _ctx.fullTime(row.t.at)\n                                }, _toDisplayString(row.t.source) + \" \u00B7 \" + _toDisplayString(_ctx.humanTime(row.t.at)) + \" \" + _toDisplayString(row.atWord), 9 /* TEXT, PROPS */, _hoisted_61)\n                            ]),\n                            _createElementVNode(\"button\", {\n                                type: \"button\",\n                                class: \"gallery-tile-menu-btn\",\n                                \"aria-label\": _ctx.L.more,\n                                onClick: _withModifiers($event => (_ctx.toggleMenu('A:' + row.t.key, $event)), [\"stop\"])\n                            }, [...(_cache[27] || (_cache[27] = [\n                                    _createElementVNode(\"svg\", {\n                                        viewBox: \"0 0 24 24\",\n                                        \"aria-hidden\": \"true\"\n                                    }, [\n                                        _createElementVNode(\"use\", { href: \"#more\" })\n                                    ], -1 /* CACHED */)\n                                ]))], 8 /* PROPS */, _hoisted_62),\n                            (_openBlock(), _createBlock(_Teleport, { to: _ctx.menuMount }, [\n                                _createElementVNode(\"div\", {\n                                    class: \"gallery-tile-menu-popup hidden\",\n                                    \"data-menu\": 'A:' + row.t.key,\n                                    onClick: _cache[8] || (_cache[8] = _withModifiers(() => { }, [\"stop\"]))\n                                }, [\n                                    _createElementVNode(\"button\", {\n                                        type: \"button\",\n                                        onClick: $event => (_ctx.asideRestore(row.item))\n                                    }, [\n                                        _cache[28] || (_cache[28] = _createElementVNode(\"svg\", {\n                                            viewBox: \"0 0 24 24\",\n                                            \"aria-hidden\": \"true\"\n                                        }, [\n                                            _createElementVNode(\"use\", { href: \"#restore-trash\" })\n                                        ], -1 /* CACHED */)),\n                                        _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.restore), 1 /* TEXT */)\n                                    ], 8 /* PROPS */, _hoisted_64),\n                                    _createElementVNode(\"button\", {\n                                        type: \"button\",\n                                        class: \"danger\",\n                                        onClick: $event => (_ctx.asidePurge(row.item))\n                                    }, [\n                                        _cache[29] || (_cache[29] = _createElementVNode(\"svg\", {\n                                            viewBox: \"0 0 24 24\",\n                                            \"aria-hidden\": \"true\"\n                                        }, [\n                                            _createElementVNode(\"use\", { href: \"#trash-can\" })\n                                        ], -1 /* CACHED */)),\n                                        _createElementVNode(\"span\", null, _toDisplayString(_ctx.L.purge), 1 /* TEXT */)\n                                    ], 8 /* PROPS */, _hoisted_65)\n                                ], 8 /* PROPS */, _hoisted_63)\n                            ], 8 /* PROPS */, [\"to\"]))\n                        ], 2 /* CLASS */));\n                    }), 128 /* KEYED_FRAGMENT */))\n                    : _createCommentVNode(\"v-if\", true)\n            ], 6 /* CLASS, STYLE */), [\n                [_vShow, !_ctx.isEmpty || _ctx.loading]\n            ]),\n            _withDirectives(_createElementVNode(\"div\", { class: \"gallery-empty\" }, _toDisplayString(_ctx.emptyText), 513 /* TEXT, NEED_PATCH */), [\n                [_vShow, _ctx.isEmpty && !_ctx.loading]\n            ])\n        ], 64 /* STABLE_FRAGMENT */));\n    };\n}\n", "// \u56FE\u5E93\u5C4F\u5E55\uFF08Vue \u6DF1\u6A21\u5757\uFF09\u2014\u2014WET \u81EA WeebPaint src/gallery/gallery.ts v0.14.9\uFF08C \u9A91\u58EB\u8F6E\u300CUI \u6DF1\u5316 candidate 1\u300D\uFF09\uFF0C2026-09-09 \u5305\u5316\u3002\n// \u53D8\u5316\u53EA\u5728\u63A5\u7F1D\uFF08\u63D0\u6848 \u00A73\u300C\u5851\u300D\uFF09\uFF1AVue \u4ECE deps.vue \u6CE8\u5165\uFF1Bsession.* \u5341\u5904 \u2192 DocHost\uFF1B\u6587\u4EF6\u52A8\u8BCD \u2192 core/verbs\uFF1B\u6570\u636E \u2192 core/data-face\uFF1B\n//   \u7F29\u7565\u56FE / \u52A0\u5BC6 / \u56FE\u6807 / \u6587\u6848 / \u8BCA\u65AD \u5168\u8D70\u6CE8\u5165\uFF1B\u5BBF\u4E3B\u5E03\u5C40\u77E5\u8BC6\uFF08\u5F53\u524D\u5939\u8BB0\u5FC6\u3001\u56FE\u5E93\u6A21\u5F0F\u5224\u5B9A\uFF09\u8D70 deps\u3002\u6A21\u677F\u4E0E class \u540D\u9010\u5B57\u4FDD\u7559\u3002\nimport { toggleAdoptedPopup } from \"@internal/workbench-elements\";\nimport { tileFor, breadcrumb, asideTileFor, humanTime, humanSize, fullTime, hasLocalCopy } from \"../core/model/gallery-view-model.js\";\nimport { ASIDE } from \"../core/model/aside.js\";\nimport { pathJoin } from \"../core/model/gallery-path.js\";\nimport { imageThumbToken, imageTwinIdentifier, mimeForImageName } from \"../core/model/cloud-image-model.js\";\nimport { createFrameGate } from \"../core/guards/frame-gate.js\";\nimport { createFirstFrameWatchdog } from \"../core/guards/first-frame-watchdog.js\";\nimport { note as diagNote } from \"../core/guards/diag-log.js\";\nimport { createGalleryVerbs } from \"../core/verbs.js\";\nimport { t } from \"../core/text.js\";\nimport { isPng, readPngText, PNG_BLURB_KEYWORD } from \"../core/thumbs/png-text.js\";\nimport { THUMB_CELL_TEMPLATE, IMAGE_THUMB_CELL_TEMPLATE, GALLERY_TEMPLATE } from \"./templates.js\";\nimport * as COMPILED from \"./templates.compiled.js\";\nconst PIXELATED_THUMB_MAX_EDGE = 128;\nfunction thumbLoadPixelated(e) {\n    const img = e.target;\n    const edge = Math.max(img.naturalWidth, img.naturalHeight);\n    return edge > 0 && edge < PIXELATED_THUMB_MAX_EDGE;\n}\nexport function mountGalleryScreen(el, d) {\n    const { createApp, defineComponent, reactive, ref, computed, watch, onMounted, onUnmounted, nextTick } = d.vue;\n    // 0.8.4\uFF1A\u5BBF\u4E3B\u9012\u4E86\u6574\u4E2A Vue \u6A21\u5757\uFF08render \u8981\u7684 helper \u90FD\u5728\uFF09\u2192 \u7528\u6784\u5EFA\u65F6\u7F16\u597D\u7684 render \u51FD\u6570\uFF0C\u8FD0\u884C\u65F6\u4E0D\u7F16\u8BD1\u6A21\u677F\uFF08\u5BBF\u4E3B\u5F00\u4E86 CSP\u3001\u4E0D\u653E\u884C eval \u4E5F\u80FD\u5F00\uFF09\uFF1B\n    //   \u53EA\u9012\u4E86\u8001\u7684\u90A3\u51E0\u4E2A \u2192 \u7167\u65E7\u7ED9\u6A21\u677F\u3001\u8FD0\u884C\u65F6\u7F16\u8BD1\uFF08\u8981 eval\uFF09\uFF0C\u5E76\u5728\u9ED1\u5323\u5B50\u8BB0\u4E00\u7B14\u3002Claude Opus 5.5 2026-10-17\n    const vueAll = d.vue;\n    const precompiled = COMPILED.HELPERS.every((h) => vueAll[h] != null);\n    if (!precompiled)\n        diagNote(\"gallery\", \"host passed a partial Vue runtime: templates compile at runtime (needs eval; blocked by a strict CSP)\");\n    const RENDERS = { thumbCell: COMPILED.thumbCellRender, imageThumbCell: COMPILED.imageThumbCellRender, gallery: COMPILED.galleryRender };\n    const tpl = (which, template) => (precompiled ? { render: RENDERS[which](d.vue) } : { template });\n    const icon = d.ui.iconHtml;\n    const phHtml = (name, info) => d.ui.tilePlaceholderHtml?.(name, info) ?? \"\"; // 0.1.2\uFF1A\u5BBF\u4E3B\u7ED9\u7684\u5360\u4F4D\u56FE\u6807\uFF1B\u7A7A = \u9000\u56DE\u540D\u5B57\u9996\u5B57\n    const ovHtml = (name, info, facts = null) => { try {\n        return d.ui.tileOverlayHtml?.(name, info, facts) ?? \"\";\n    }\n    catch {\n        return \"\";\n    } }; // 0.5.0\uFF1A\u5BBF\u4E3B\u76D6\u5728\u5C01\u9762\u4E0A\u7684\u4E00\u5C42\uFF080.8.0 \u591A\u4E00\u4E2A facts\uFF09\n    const actionOf = (name, info, facts) => { try {\n        const a = d.ui.tileAction?.(name, info, facts) ?? null;\n        return a && a.state !== \"none\" ? a : null;\n    }\n    catch {\n        return null;\n    } }; // 0.8.0\n    // 0.6.4\uFF1A\u5BBF\u4E3B\u753B\u5C01\u9762 / \u5360\u4F4D\u65F6\u62FF\u5230\u7684\u5361\u7247\u4FE1\u606F\u3002\u6587\u4EF6\u5361 = GItem \u672C\u5C0A\u7684\u5B57\u6BB5\uFF1B\u6401\u7F6E\u533A\u5361\u4ECE AsideItem \u6620\u5C04\uFF08at \u2192 lastModified\uFF1B\u6CA1\u6709 size\uFF09\u3002\n    const fileInfo = (it) => ({ identifier: it.identifier, stem: it.stem, kind: it.kind, syncState: it.syncState, size: it.size, lastModified: it.lastModified });\n    const asideInfo = (it) => ({ identifier: it.identifier, stem: it.stem, kind: it.kind, lastModified: it.at || undefined, aside: it.box });\n    const thumbKinds = new Set(d.thumbKinds ?? []);\n    const hasThumb = (kind) => kind != null && thumbKinds.has(kind);\n    const ICON = {\n        localOnly: icon(\"database\"), cloudOnly: icon(\"cloud\"), syncedBoth: icon(\"cloud-synced\"), dirtyBoth: icon(\"cloud-upload\"),\n        float: icon(\"cloud-upload\"), folder: icon(\"folder\"), cloudBig: icon(\"cloud\"),\n        ghost: icon(\"cloud-unavailable\"), pendingGone: icon(\"cloud-pending\"), newerOnCloud: icon(\"cloud-download\"), conflictBoth: icon(\"cloud-conflict\"),\n        lock: icon(\"lock\"), image: icon(\"image\"), file: icon(\"file\"),\n    };\n    const enc = d.encryption;\n    const _lockState = reactive({ unlocked: enc?.isUnlocked() ?? true });\n    enc?.onLockChange((u) => { _lockState.unlocked = u; });\n    const _thumbRev = reactive(new Map());\n    d.thumbs?.onInvalidated((key) => { _thumbRev.set(key, (_thumbRev.get(key) ?? 0) + 1); });\n    const thumbKey = (identifier) => identifier;\n    // 0.8.0 \u4E8B\u5B9E\uFF1A\u8EAB\u4EFD \u2192 { token, value }\uFF08\u54CD\u5E94\u5F0F\uFF1B\u5230\u4E86\u5361\u7247\u81EA\u5DF1\u91CD\u7B97\uFF09\u3002\u53D6\u6CD5\u540C\u7F29\u7565\u56FE\uFF1A\u6309 token \u547D\u4E2D\u7F13\u5B58\u3001\u6CA1\u6709\u5C31\u53BB\u53D6\uFF08\u5E76\u53D1\u9650 3\uFF09\uFF0C\u53D6\u4E0D\u5230 = \u7559\u7A7A\u3001\u4E0B\u6B21\u518D\u95EE\uFF1Binvalidate = \u6E05\u6389\u91CD\u53D6\n    const factsKinds = new Set(d.factsKinds ?? []);\n    const _facts = reactive(new Map());\n    const _factsInflight = new Set();\n    let _factsRunning = 0;\n    const _factsWaiting = [];\n    const FACTS_PAR = 3;\n    d.facts?.onInvalidated((key) => { _facts.delete(key); });\n    function wantFacts(identifier, kind, token, source) {\n        if (!d.facts || kind == null || !factsKinds.has(kind))\n            return;\n        const have = _facts.get(identifier);\n        if (have && have.token === token)\n            return;\n        if (_factsInflight.has(identifier))\n            return;\n        _factsInflight.add(identifier);\n        const go = () => {\n            _factsRunning++;\n            d.facts.getOrFetch(identifier, token, source)\n                .then(({ value }) => { _facts.set(identifier, { token, value }); })\n                .catch((err) => d.reportError(new Error(\"[gallery] facts: \" + String(err)), \"log\"))\n                .finally(() => { _factsInflight.delete(identifier); _factsRunning--; _factsWaiting.shift()?.(); });\n        };\n        if (_factsRunning < FACTS_PAR)\n            go();\n        else\n            _factsWaiting.push(go);\n    }\n    const factsOf = (identifier) => _facts.get(identifier)?.value ?? null;\n    const ThumbCell = defineComponent({\n        name: \"ThumbCell\",\n        props: { encName: { type: String, default: null }, fetchable: { type: Boolean, default: false }, isCloud: { type: Boolean, default: false }, cloudNewer: { type: Boolean, default: false }, thumbToken: { type: String, default: \"\" }, fallback: { type: String, default: \"?\" }, fallbackHtml: { type: String, default: \"\" }, alt: { type: String, default: \"\" } },\n        emits: [\"unlock\"],\n        setup(props) {\n            const url = ref(null), showCloud = ref(false), locked = ref(false), root = ref(null);\n            let cloudEncBlob = null, objUrl = null, obs = null;\n            const blurb = ref(\"\");\n            // 0.2.0\uFF1A\u7F29\u7565\u56FE PNG \u81EA\u5E26\u7684 Description \u6587\u672C\u5757 = \u8170\u5C01 / caption \u2192 \u60AC\u505C tooltip\uFF08user 2026-09-10\u300Cthumbnail.png \u7684\u6807\u51C6 tEXt \u6587\u672C\u5757\u2026gallery \u5E93\u7684\u516C\u5171\u884C\u4E3A\u300D\uFF09\n            const readBlurb = (blob) => { void blob.arrayBuffer().then((ab) => { const u8 = new Uint8Array(ab); blurb.value = isPng(u8) ? (readPngText(u8)[PNG_BLURB_KEYWORD] ?? \"\") : \"\"; }).catch(() => { blurb.value = \"\"; }); };\n            const setBlob = (blob) => { if (objUrl)\n                URL.revokeObjectURL(objUrl); objUrl = URL.createObjectURL(blob); url.value = objUrl; readBlurb(blob); };\n            const tryDecrypt = async () => {\n                if (!enc) {\n                    locked.value = true;\n                    return;\n                }\n                let png = null;\n                if (props.encName)\n                    png = await enc.localPeekThumb(props.encName);\n                else if (cloudEncBlob)\n                    png = await enc.decryptCloudPeekThumb(props.alt, cloudEncBlob);\n                if (png && png.size > 0) {\n                    locked.value = false;\n                    setBlob(png);\n                }\n                else if (enc.isUnlocked())\n                    locked.value = false; // 0.2.1\uFF1A\u89E3\u9501\u4E86\u4F46\u8FD9\u672C\u6CA1\u5C01\u9762 \u2192 \u5360\u4F4D\u56FE\u6807\uFF0C\u4E0D\u662F\u9501\uFF08\u9501\u53EA\u8868\u793A\u300C\u89E3\u4E0D\u5F00\u300D\uFF09\n                else\n                    locked.value = true;\n            };\n            let fetchSeq = 0;\n            const fetchThumb = () => {\n                if (!d.thumbs)\n                    return; // \u65E0\u7F29\u7565\u56FE\u653F\u7B56\uFF08WXHW 2.0\uFF09\u2192 \u4FDD\u6301\u5360\u4F4D\n                const seq = ++fetchSeq;\n                d.thumbs.getOrFetch(props.alt, props.thumbToken, props.cloudNewer ? \"cloud\" : \"local\")\n                    .then(({ blob }) => { if (seq !== fetchSeq)\n                    return; showCloud.value = false; if (!blob)\n                    return; /* 0.2.2\uFF1A\u786E\u5B9A\u6CA1\u7F29\u7565\u56FE \u2192 \u5360\u4F4D\u56FE\u6807\uFF08\u4E66\uFF09\uFF0C\u4E0D\u662F\u4E91 */ /* 0.2.2\uFF1A\u786E\u5B9A\u6CA1\u7F29\u7565\u56FE \u2192 \u5360\u4F4D\u56FE\u6807\uFF08\u4E66\uFF09\uFF0C\u4E0D\u662F\u4E91 */ if (enc?.isEncryptedPeekBlob(blob)) {\n                    cloudEncBlob = blob;\n                    return tryDecrypt();\n                } setBlob(blob); })\n                    .catch((err) => d.reportError(new Error(\"[gallery] thumb: \" + String(err)), \"log\"));\n            };\n            onMounted(() => {\n                if (props.encName) {\n                    void tryDecrypt();\n                    return;\n                }\n                if (props.fetchable && d.thumbs) {\n                    if (props.isCloud)\n                        showCloud.value = true;\n                    obs = new IntersectionObserver((entries) => { for (const e of entries) {\n                        if (!e.isIntersecting)\n                            continue;\n                        obs?.disconnect();\n                        obs = null;\n                        fetchThumb();\n                    } }, { rootMargin: \"600px 0px\", threshold: 0.01 });\n                    void nextTick(() => { if (obs && root.value)\n                        obs.observe(root.value); });\n                }\n            });\n            watch(() => _lockState.unlocked, () => { if (locked.value || props.encName)\n                void tryDecrypt(); });\n            watch(() => [props.thumbToken, props.cloudNewer, _thumbRev.get(thumbKey(props.alt)) ?? 0], () => {\n                if (props.encName) {\n                    void tryDecrypt();\n                    return;\n                }\n                if (!props.fetchable || obs)\n                    return;\n                fetchThumb();\n            });\n            onUnmounted(() => { obs?.disconnect(); if (objUrl)\n                URL.revokeObjectURL(objUrl); });\n            const pixelated = ref(false);\n            const onThumbLoad = (e) => { pixelated.value = thumbLoadPixelated(e); };\n            return { url, showCloud, locked, root, ICON, lockedTitle: t(\"gal.lockedThumb\"), pixelated, onThumbLoad, blurb };\n        },\n        ...tpl(\"thumbCell\", THUMB_CELL_TEMPLATE),\n    });\n    const ImageThumbCell = defineComponent({\n        name: \"ImageThumbCell\",\n        props: { identifier: { type: String, required: true }, token: { type: String, default: \"\" }, fallback: { type: String, default: \"?\" }, alt: { type: String, default: \"\" } },\n        setup(props) {\n            const url = ref(null), root = ref(null);\n            let objUrl = null, obs = null, fetchSeq = 0;\n            const fetchThumb = () => {\n                if (!d.imageThumbs)\n                    return;\n                const seq = ++fetchSeq;\n                d.imageThumbs.getOrFetch(props.identifier, props.token)\n                    .then((blob) => { if (seq !== fetchSeq)\n                    return; if (objUrl)\n                    URL.revokeObjectURL(objUrl); objUrl = URL.createObjectURL(blob); url.value = objUrl; })\n                    .catch((err) => d.reportError(new Error(\"[gallery] image thumb: \" + String(err)), \"log\"));\n            };\n            onMounted(() => {\n                if (!d.imageThumbs)\n                    return;\n                obs = new IntersectionObserver((entries) => { for (const e of entries) {\n                    if (!e.isIntersecting)\n                        continue;\n                    obs?.disconnect();\n                    obs = null;\n                    fetchThumb();\n                } }, { rootMargin: \"600px 0px\", threshold: 0.01 });\n                void nextTick(() => { if (obs && root.value)\n                    obs.observe(root.value); });\n            });\n            watch(() => props.token, () => { if (!obs)\n                fetchThumb(); });\n            onUnmounted(() => { obs?.disconnect(); if (objUrl)\n                URL.revokeObjectURL(objUrl); });\n            const pixelated = ref(false);\n            const onThumbLoad = (e) => { pixelated.value = thumbLoadPixelated(e); };\n            return { url, root, pixelated, onThumbLoad };\n        },\n        ...tpl(\"imageThumbCell\", IMAGE_THUMB_CELL_TEMPLATE),\n    });\n    const Gallery = defineComponent({\n        name: \"Gallery\",\n        components: { ThumbCell, ImageThumbCell, Teleport: d.vue.Teleport },\n        setup() {\n            const view = ref(\"files\");\n            const layout = ref(d.tile?.layout ?? \"cards\");\n            const subtitleOf = (item) => { try {\n                return d.tile?.subtitle?.(item) ?? \"\";\n            }\n            catch {\n                return \"\";\n            } };\n            const markerOf = (item) => { try {\n                return d.tile?.marker?.(item) ?? null;\n            }\n            catch {\n                return null;\n            } };\n            const folder = ref(safeFolder());\n            const loading = ref(false);\n            const data = reactive({ files: [], images: [], others: [], folderNames: [] });\n            const aside = ref([]); // \u5F53\u524D\u5F00\u7740\u7684\u90A3\u4E2A\u6401\u7F6E\u533A\u7684\u5217\u8868\uFF08\u56DE\u6536\u7AD9 / \u5907\u4EFD\u7BB1\uFF09\n            const openMenu = ref(null);\n            function safeFolder() { try {\n                return d.folderMemory?.get() || \"\";\n            }\n            catch {\n                return \"\";\n            } }\n            let _unsub = null, _framedFolder = null, _awaitingFirst = false, _subscribedAt = 0;\n            function applyFrame(snap) {\n                if (view.value !== \"files\" || snap.folder !== folder.value)\n                    return;\n                data.files = snap.items;\n                data.images = snap.images;\n                data.others = snap.others;\n                data.folderNames = snap.folderNames;\n                _framedFolder = snap.folder;\n                loading.value = false;\n                wd.frame(snap.folder);\n                if (stalled.value)\n                    stalled.value = null;\n                if (_awaitingFirst) {\n                    _awaitingFirst = false;\n                    diagNote(\"gallery\", `first frame folder=\"${snap.folder}\" items=${snap.items.length} folders=${snap.folderNames.length} in ${Math.round(performance.now() - _subscribedAt)}ms`);\n                }\n                void probeEncrypted();\n            }\n            const gate = createFrameGate(applyFrame);\n            const stalled = ref(null);\n            const wd = createFirstFrameWatchdog(({ folder: f, elapsedMs }) => {\n                if (!loading.value)\n                    return;\n                stalled.value = t(\"gal.firstFrameTimeout\");\n                const standalone = typeof matchMedia === \"function\" ? matchMedia(\"(display-mode: standalone)\").matches : false;\n                d.reportError(new Error(`[gallery] first frame timeout: folder=\"${f}\" after ${elapsedMs}ms (store listing did not respond \u2014 IDB wedged?) visibility=${document.visibilityState} online=${navigator.onLine} standalone=${standalone}`), \"warning\");\n            }, { timeoutMs: 8000 });\n            function onFrameError(err, phase) {\n                diagNote(\"gallery\", `frame error phase=${phase} folder=\"${folder.value}\" loading=${loading.value}: ${String(err)}`);\n                if (phase === \"local\" && loading.value) {\n                    wd.cancel();\n                    stalled.value = t(\"gal.firstFrameFailed\");\n                }\n            }\n            function retry() { diagNote(\"gallery\", `retry view=${view.value} folder=\"${folder.value}\"`); stalled.value = null; _framedFolder = null; void reload(); }\n            function openDiag() { diagNote(\"gallery\", \"open diag log from stalled grid\"); d.openDiag?.(); }\n            function reloadApp() { diagNote(\"gallery\", `reload from stalled grid folder=\"${folder.value}\"`); if (d.reloadApp)\n                d.reloadApp();\n            else\n                location.reload(); }\n            function subscribe() {\n                _unsub?.();\n                _unsub = null;\n                if (view.value !== \"files\")\n                    return;\n                if (!d.store()) {\n                    data.files = [];\n                    data.images = [];\n                    data.others = [];\n                    data.folderNames = [];\n                    loading.value = false;\n                    wd.cancel();\n                    stalled.value = null;\n                    return;\n                } // \u65E0\u5E93\uFF1A\u4E0D\u8BA2\u9605\u3001\u7A7A\u7F51\u683C\n                loading.value = _framedFolder !== folder.value;\n                stalled.value = null;\n                _awaitingFirst = true;\n                _subscribedAt = performance.now();\n                if (loading.value)\n                    wd.arm(folder.value);\n                else\n                    wd.cancel();\n                diagNote(\"gallery\", `subscribe folder=\"${folder.value}\" loading=${loading.value}`);\n                _unsub = d.data.watchFolder(folder.value, (snap) => { if (snap.folder !== folder.value)\n                    return; if (loading.value)\n                    applyFrame(snap);\n                else\n                    gate.push(snap); }, { onError: onFrameError });\n            }\n            const isVisible = d.isGalleryVisible ?? (() => true);\n            const _onGatePtrDown = () => { if (isVisible())\n                gate.pointerDown(); };\n            const _onGatePtrUp = () => gate.pointerUp();\n            document.addEventListener(\"pointerdown\", _onGatePtrDown, true);\n            document.addEventListener(\"pointerup\", _onGatePtrUp, true);\n            document.addEventListener(\"pointercancel\", _onGatePtrUp, true);\n            const encByName = reactive({});\n            async function probeEncrypted() {\n                if (!enc)\n                    return;\n                for (const nm of data.files.filter((it) => hasLocalCopy(it.syncState)).map((it) => it.identifier)) {\n                    if (nm in encByName)\n                        continue;\n                    try {\n                        encByName[nm] = await enc.isEncrypted(nm);\n                    }\n                    catch {\n                        encByName[nm] = false;\n                    }\n                }\n            }\n            function invalidateEncrypted(name) { delete encByName[name]; void probeEncrypted(); }\n            async function requestUnlock() {\n                await probeEncrypted();\n                for (const it of data.files) {\n                    if (!hasLocalCopy(it.syncState) || !encByName[it.identifier])\n                        continue;\n                    return await verbs.unlock(it.identifier);\n                }\n                return false;\n            }\n            // \u6401\u7F6E\u533A\u5217\u8868\uFF1A\u4E00\u6B21\u6027\u8BFB\uFF08\u4E0D\u8BA2\u9605\uFF09\u3002\u5E8F\u53F7\u5B88\u536B\uFF1A\u8FDE\u70B9\u5207\u6362\u89C6\u56FE\u65F6\uFF0C\u665A\u5230\u7684\u65E7\u7ED3\u679C\u4E0D\u8BB8\u76D6\u6389\u65B0\u89C6\u56FE\u3002\n            //   \u8BFB\u5931\u8D25 = \u7559\u5728\u300C\u8BFB\u53D6\u5931\u8D25 + \u91CD\u8BD5\u300D\u90A3\u4E00\u5757\uFF0C**\u4E0D\u88C5\u6210\u7A7A\u5217\u8868**\uFF08\u7A7A\u7684\u5907\u4EFD\u7BB1\u548C\u8BFB\u4E0D\u51FA\u6765\u7684\u5907\u4EFD\u7BB1\u4E0D\u662F\u4E00\u56DE\u4E8B\uFF09\u3002\n            let _asideSeq = 0;\n            async function loadAside(kind) {\n                const seq = ++_asideSeq;\n                wd.cancel();\n                stalled.value = null;\n                aside.value = [];\n                if (!d.store()) {\n                    loading.value = false;\n                    return;\n                } // \u65E0\u5E93\uFF1A\u7A7A\n                loading.value = true;\n                try {\n                    const rows = await d.data.listAside(kind);\n                    if (seq !== _asideSeq || view.value !== kind)\n                        return;\n                    aside.value = rows;\n                    loading.value = false;\n                }\n                catch (e) {\n                    if (seq !== _asideSeq || view.value !== kind)\n                        return;\n                    diagNote(\"gallery\", `aside listing failed kind=${kind}: ${String(e)}`);\n                    d.reportError(new Error(`[gallery] ${kind} listing failed: ${String(e?.message || e)}`), \"warning\");\n                    stalled.value = t(\"gal.firstFrameFailed\");\n                }\n            }\n            async function reload() { closeMenu(); const v = view.value; if (v === \"files\") {\n                _asideSeq++;\n                subscribe();\n            }\n            else {\n                _unsub?.();\n                _unsub = null;\n                await loadAside(v);\n            } }\n            function setFolder(p) { folder.value = p || \"\"; try {\n                d.folderMemory?.set(folder.value);\n            }\n            catch { /* noop */ } closeMenu(); subscribe(); }\n            function hydrateFolder(p) { if ((p || \"\") === folder.value)\n                return; folder.value = p || \"\"; closeMenu(); subscribe(); }\n            subscribe();\n            onUnmounted(() => {\n                _unsub?.();\n                _unsub = null;\n                wd.cancel();\n                gate.reset();\n                document.removeEventListener(\"pointerdown\", _onGatePtrDown, true);\n                document.removeEventListener(\"pointerup\", _onGatePtrUp, true);\n                document.removeEventListener(\"pointercancel\", _onGatePtrUp, true);\n            });\n            const folderTiles = computed(() => data.folderNames.map((fn) => ({ name: fn, path: pathJoin(folder.value, fn) })));\n            const fileTiles = computed(() => data.files.map((it) => { const tile = tileFor(it, { signedIn: d.host.signedIn(), activeIdentifier: d.host.activeIdentifier(), encrypted: !!encByName[it.identifier] }); const info = fileInfo(it), facts = factsOf(it.identifier); return { item: it, t: tile, sub: subtitleOf(it), marker: markerOf(it), ov: ovHtml(it.identifier, info, facts), thumb: hasThumb(it.kind), info, facts, act: actionOf(it.identifier, info, facts) }; }));\n            // 0.8.0\uFF1A\u5217\u8868\u4E00\u53D8\u5C31\u628A\u8BE5\u53D6\u7684\u4E8B\u5B9E\u6392\u4E0A\uFF08\u52A0\u5BC6\u4EF6\u4E0D\u53D6\uFF1A\u5C3E\u8BFB\u5230\u7684\u662F\u5BC6\u6587\uFF09\uFF1B\u4E8B\u5B9E\u5230\u4E86 _facts \u53D8 \u2192 fileTiles \u91CD\u7B97 \u2192 \u94AE / \u8986\u76D6\u5C42\u8DDF\u7740\n            const askFacts = () => { if (!d.facts)\n                return; for (const r of fileTiles.value)\n                if (!r.t.encrypted && (r.t.hasCloud || r.t.hasLocal))\n                    wantFacts(r.t.identifier, r.item.kind, String(r.t.time || r.t.size || 0), r.t.cloudNewer ? \"cloud\" : \"local\"); };\n            watch(() => fileTiles.value, askFacts);\n            askFacts();\n            // \u6401\u7F6E\u533A\u5361\u7247\uFF1A\u53D6\u4E0D\u53D6\u7F29\u7565\u56FE\u3001\u65F6\u95F4\u540E\u9762\u8DDF\u54EA\u4E2A\u8BCD\uFF0C\u6309 item \u81EA\u5E26\u7684 kind \u67E5 ASIDE \u8868\n            const asideTiles = computed(() => aside.value.map((it) => ({ item: it, t: asideTileFor(it), fetch: ASIDE[it.box].thumb === \"by-name\" && hasThumb(it.kind), atWord: t(ASIDE[it.box].text.at), ov: it.kind != null ? ovHtml(it.identifier, asideInfo(it)) : \"\", info: asideInfo(it) })));\n            const imageTiles = computed(() => data.images.map((im) => ({ raw: im, identifier: im.identifier, label: im.label, size: im.size || 0, time: im.lastModified || 0, token: imageThumbToken(im) })));\n            const otherTiles = computed(() => data.others.map((o) => ({ identifier: o.identifier, label: o.label, size: o.size || 0, time: o.lastModified || 0 })));\n            const crumbs = computed(() => breadcrumb(folder.value));\n            const isEmpty = computed(() => view.value !== \"files\" ? asideTiles.value.length === 0 : folderTiles.value.length === 0 && fileTiles.value.length === 0 && imageTiles.value.length === 0 && otherTiles.value.length === 0);\n            const emptyText = computed(() => view.value !== \"files\" ? t(ASIDE[view.value].text.none) : folder.value ? t(\"gal.empty.folder\", { f: folder.value }) : t(\"gal.empty.none\"));\n            const badgeIcon = (k) => ICON[k] || \"\";\n            const badgeIcon2 = (k) => { try {\n                return icon(k);\n            }\n            catch {\n                return \"\";\n            } }; // 0.8.0\uFF1A\u52A8\u4F5C\u94AE\u7684\u56FE\u6807\u8D70\u5BBF\u4E3B\u7684 iconHtml\uFF08\u5BBF\u4E3B sprite \u91CC\u7684\u540D\u5B57\uFF09\n            const fmtMeta = (x) => `${humanTime(x.time)} \u00B7 ${humanSize(x.size)}`;\n            // \u2500\u2500 \u5361\u7247 \u22EF \u83DC\u5355\uFF080.6.2\uFF09\uFF1A\u4EE5\u524D\u662F\u5361\u7247\u91CC\u7684 absolute + z-index 5\u3002\u5361\u7247 :hover \u5E26 transform\uFF0CiOS \u4E0A\u70B9\u4E00\u4E0B hover \u4F1A\u7C98\u4F4F \u2192 \u5361\u7247\u81EA\u6210\u5C42\u53E0\u4E0A\u4E0B\u6587 \u2192\n            //   \u83DC\u5355\u7684 z \u53EA\u5728\u5361\u7247\u91CC\u7B97\uFF0C\u540E\u9762\u7684\u5361\u7247\u6309 DOM \u987A\u5E8F\u76D6\u4E0A\u6765\uFF08WXHW \u771F\u673A 2026-09-30\uFF09\u3002\u4EFB\u4F55 transform / filter / opacity / contain \u51FA\u73B0\u5728\u5361\u7247\u6216\u5176\u7956\u5148\u4E0A\u90FD\u4F1A\u518D\u72AF\u3002\n            //   \u6839\u6CBB = \u83DC\u5355\u4E0D\u4F4F\u5361\u7247\u91CC\uFF1A\u8282\u70B9\u7531 Vue <Teleport> \u642C\u5230\u56FE\u5E93\u6302\u8F7D\u70B9\uFF08Vue \u81EA\u5DF1\u7684 DOM \u5F52 Vue \u7BA1\uFF0C\u522B\u8BA9\u522B\u4EBA appendChild\uFF09\uFF0C\n            //   \u751F\u547D\u5468\u671F / \u5B9A\u4F4D / \u5916\u70B9\u5173 / Escape / \u6808 / \u6EDA\u52A8\u6536 \u5168\u4EA4\u7ED9 @internal/workbench-elements \u7684 popup-menu \u6DF1\u6A21\u5757\uFF08\u6536\u517B adapter\uFF1A\n            //   \u5B83\u7684\u5934\u6CE8\u91CA\u70B9\u540D\u300C\u56FE\u5E93\u4E09 popup\u300D\u5C31\u8BE5\u8FD9\u4E48\u8D70\uFF09\uFF1Bz \u8D70 gallery.css \u7684 var(--z-menu)\uFF08band \u8868\u5F52\u5BBF\u4E3B :root\uFF09\u3002\n            let menuHandle = null;\n            const closeMenu = () => { menuHandle?.close(); };\n            const toggleMenu = (key, ev) => {\n                const btn = ev.currentTarget;\n                const popup = [...el.querySelectorAll(\".gallery-tile-menu-popup\")].find((x) => x.dataset.menu === key);\n                if (!popup)\n                    return;\n                const h = toggleAdoptedPopup(popup, { anchor: btn, align: \"right\", band: \"css\", position: \"anchor\", onClose: () => { if (menuHandle?.el === popup) {\n                        menuHandle = null;\n                        openMenu.value = null;\n                    } } });\n                menuHandle = h;\n                openMenu.value = h ? key : null;\n            };\n            onUnmounted(closeMenu);\n            // \u2500\u2500 \u52A8\u8BCD\uFF1Acore/verbs\uFF08\u7EA2\u7EBF\u515C\u5E95\u5728\u90A3\u8FB9\uFF09\uFF1B\u8FD9\u91CC\u53EA\u5305 openMenu \u6536\u8D77 + reload \u2500\u2500\n            const verbs = createGalleryVerbs({ store: () => { const s = d.store(); if (!s)\n                    throw new Error(\"gallery: no library attached\"); return s; }, host: d.host, doc: d.doc, thumbs: d.thumbs, onEncryptionChanged: invalidateEncrypted, encryption: enc });\n            const wrap = (fn) => async (...a) => { closeMenu(); await fn(...a); await reload(); };\n            const rename = wrap((item) => verbs.rename(item));\n            const move = wrap((item) => verbs.move(item, { folder: folder.value, folderNames: data.folderNames }));\n            const copy = wrap((item) => verbs.copy(item, data.files.map((it) => it.identifier)));\n            const resolve = wrap((item) => verbs.resolve(item)); // 0.7.2\uFF1A\u6CA1\u540C\u6B65\u597D\u7684\u552F\u4E00\u52A8\u4F5C\uFF08\u5E93\u95EE\u4EBA\u4E09\u9009\u4E00\uFF09\n            const unload = wrap((item) => verbs.unload(item));\n            const keepOffline = wrap((item) => verbs.keepOffline(item));\n            const del = wrap((item) => verbs.del(item));\n            const deleteImage = wrap((img) => verbs.deleteImage(img));\n            const folderDelete = wrap((ft) => verbs.folderDelete(ft));\n            const asideRestore = wrap((item) => verbs.asideRestore(item));\n            const asidePurge = wrap((item) => verbs.asidePurge(item));\n            const emptyAside = async (kind, scope = \"both\") => { await verbs.emptyAside(kind, scope); await reload(); };\n            const encryptItem = wrap((item) => verbs.encryptItem(item));\n            const decryptItem = wrap((item) => verbs.decryptItem(item));\n            async function onUnlock(name) { if (await verbs.unlock(name))\n                await reload(); }\n            /** 0.8.0\uFF1A\u5361\u7247\u4E0A\u7684\u52A8\u4F5C\u94AE\uFF08\u4E0D\u6253\u5F00\u90A3\u4EFD\uFF09\u3002 */\n            function tileAction(item) { try {\n                void Promise.resolve(d.doc.tileAction?.(item, factsOf(item.identifier))).catch((e) => d.reportError(e));\n            }\n            catch (e) {\n                d.reportError(e);\n            } }\n            async function openTile(item) {\n                closeMenu();\n                if (item.identifier === d.host.activeIdentifier()) {\n                    await d.doc.open(item);\n                    return;\n                }\n                await d.doc.open(item);\n                await reload();\n            }\n            function enterFolder(path) { setFolder(path); }\n            async function openImageTile(img) {\n                closeMenu();\n                if (!d.doc.importImageAsDoc)\n                    return; // \u5BBF\u4E3B\u4E0D\u652F\u6301\u56FE\u7247\u8F6C\u751F \u2192 \u56FE\u7247 tile \u53EA\u663E\u793A\n                const st = d.store();\n                const firstKind = st?.identifiers.kinds[0];\n                if (!st || !firstKind)\n                    return; // \u6CA1\u6709\u6587\u6863\u79CD\u7C7B \u2192 \u56FE\u7247\u6CA1\u6709\u5B6A\u751F\u53EF\u5F00\n                const twin = imageTwinIdentifier(folder.value, img.label, firstKind.suffix); // \u56FE\u7247\u8F6C\u751F\u6210\u8868\u91CC\u7B2C\u4E00\u79CD\u6587\u6863\n                const existing = data.files.find((it) => it.identifier === twin);\n                if (existing) {\n                    await d.doc.open(existing);\n                    return;\n                }\n                if (await st.files.occupied(twin)) {\n                    const dd = st.identifiers.parse(twin);\n                    await d.doc.open({ identifier: twin, stem: dd?.stem ?? twin, kind: dd?.kind ?? firstKind.kind, syncState: \"cloud-only\" });\n                    return;\n                }\n                try {\n                    const blob = await d.host.busy(t(\"cp.downloading\", { name: img.label }), () => d.data.openCloudImage(img.identifier));\n                    if (!blob) {\n                        d.host.status(t(\"cp.downloadFailed\", { name: img.label }), true);\n                        return;\n                    }\n                    await d.doc.importImageAsDoc(new File([blob], img.label, { type: mimeForImageName(img.label) }), { nameOverride: twin });\n                }\n                catch (e) {\n                    d.host.status(t(\"cp.importFailed\", { err: String(e?.message || e) }), true);\n                }\n            }\n            const L = {\n                activeTag: t(\"gal.tile.active\"),\n                loading: t(\"gal.loading\"), folder: t(\"gal.folder\"), emptyFolder: t(\"gal.emptyFolder\"), more: t(\"gal.more\"),\n                delEmptyFolder: t(\"gal.delEmptyFolder\"), delFolderNonEmpty: t(\"gal.delFolderNonEmpty\"), encrypted: t(\"enc.locked.aria\"),\n                divergedNote: t(\"gal.divergedNote\"), renameKeep: t(\"gal.renameKeep\"),\n                emptyTrash: t(\"gal.emptyTrashBtn\"), emptyBackup: t(\"gal.emptyBackupBtn\"), // 0.8.6\uFF1A\u6401\u7F6E\u533A\u89C6\u56FE\u9876\u4E0A\u7684\u300C\u6E05\u7A7A\u2026\u300D\n                rename: t(\"gal.rename\"), moveTo: t(\"gal.moveTo\"), copy: t(\"gal.copy\"), pullLocal: t(\"gal.pullLocal\"),\n                resolve: t(\"gal.resolve\"), unloadLocal: t(\"gal.unloadLocal\"), encrypt: t(\"menu.encrypt\"), decrypt: t(\"menu.decrypt\"),\n                toTrash: t(\"gal.toTrash\"), restore: t(\"gal.restore\"), purge: t(\"gal.purge\"),\n                imageFile: t(\"gal.imageFile\"), otherFile: t(\"gal.otherFile\"),\n                retry: t(\"gal.retry\"), openDiag: t(\"gal.openDiag\"), reload: t(\"gal.reload\"),\n                keepOffline: t(\"gal.keepOffline\"), unread: t(\"gal.marker.unread\"),\n            };\n            const tileAspect = typeof d.tile?.aspect === \"number\" && Number.isFinite(d.tile.aspect) && d.tile.aspect > 0 ? d.tile.aspect : null; // null = \u9ED8\u8BA4\u65B9\u56FE\uFF08\u6837\u5F0F\u8868\u91CC\u7684 1 / 1\uFF09\n            const tileTall = tileAspect != null && tileAspect < 1;\n            const tileStyle = tileAspect != null ? { \"--tile-aspect\": String(tileAspect) } : null;\n            return {\n                tileTall, tileStyle, layout, setLayout: (l) => { layout.value = l; },\n                view, folder, loading, stalled, retry, openDiag, reloadApp, openMenu, isEmpty, emptyText, L, phHtml,\n                folderTiles, fileTiles, imageTiles, otherTiles, asideTiles, crumbs, badgeIcon2,\n                badgeIcon, fmtMeta, humanTime, fullTime, ICON, toggleMenu, menuMount: el, invalidateEncrypted, setFolder, hydrateFolder, enterFolder,\n                openTile, tileAction, openImageTile, deleteImage, rename, move, copy, resolve, unload, keepOffline, del, folderDelete, asideRestore, asidePurge, emptyAside,\n                encryptItem, decryptItem, onUnlock, requestUnlock, hasEncryption: !!enc,\n                reload, setView: (v) => { view.value = v; void reload(); },\n            };\n        },\n        ...tpl(\"gallery\", GALLERY_TEMPLATE),\n    });\n    const app = createApp(Gallery);\n    const vm = app.mount(el);\n    return {\n        refresh: () => vm.reload(), setView: (v) => vm.setView(v), getView: () => vm.view,\n        setLayout: (l) => vm.setLayout(l), getLayout: () => vm.layout,\n        setFolder: (p) => vm.setFolder(p), hydrateFolder: (p) => vm.hydrateFolder(p), getFolder: () => vm.folder,\n        emptyTrash: (scope) => vm.emptyAside(\"trash\", scope), emptyBackup: (scope) => vm.emptyAside(\"backup\", scope), requestUnlock: () => vm.requestUnlock(), invalidateEncrypted: (name) => vm.invalidateEncrypted(name),\n        unmount: () => app.unmount(),\n    };\n}\n", "// createGallery(deps) \u2014\u2014 \u603B\u88C5\uFF08\u63D0\u6848 \u00A70\uFF09\uFF1A\u56DB\u6837\u6CE8\u5165\uFF08store / DocHost / UI \u539F\u5B50 / t\uFF09+ \u653F\u7B56 \u2192 \u6570\u636E\u9762 + \u7F29\u7565\u56FE\u7F13\u5B58 + \u5C4F\u5E55 + \u58F3\u6D41\u3002\n// \u5BBF\u4E3B\u4ECD\u62E5\u6709 chrome \u6807\u8BB0\uFF08\u6309\u94AE/\u5F39\u5C42/\u5E95\u680F\uFF09\u4E0E\u5E93\u7BA1\u7406\u9762\uFF080.1 \u51B3\u5B9A\uFF0C\u63D0\u6848 \u00A73 \u56DE\u5199\uFF09\uFF1B\u672C\u5305\u51FA core \u5668\u5B98 + \u5C4F\u5E55 + headless \u6D41\u3002\nimport { createGalleryDataFace } from \"./core/data-face.js\";\nimport { createThumbCache, thumbKeyFor } from \"./core/thumbs/thumb-cache.js\";\nimport { memoryThumbStore, idbThumbStore } from \"./core/thumbs/thumb-store.js\";\nimport { createFactsCache, factsKeyFor } from \"./core/facts/facts-cache.js\";\nimport { configureText } from \"./core/text.js\";\nimport { configureDeviceKv } from \"./core/device-kv.js\";\nimport { mountGalleryScreen } from \"./ui/gallery-screen.js\";\nexport function createGallery(el, deps) {\n    if (deps.text)\n        configureText(deps.text);\n    if (deps.deviceKv)\n        configureDeviceKv(deps.deviceKv);\n    const data = createGalleryDataFace({ store: deps.store, policy: deps.policy });\n    let thumbs = null;\n    if (deps.policy.thumbs) {\n        const tp = deps.policy.thumbs;\n        const store = tp.store ?? (typeof indexedDB !== \"undefined\" && tp.dbName ? idbThumbStore({ dbName: tp.dbName, storeName: \"gallery-thumbs\" }) : memoryThumbStore());\n        thumbs = createThumbCache({ store, fetch: tp.fetch, keyOf: (identifier) => thumbKeyFor(tp.galleryId?.() ?? \"default\", identifier), report: (e) => deps.reportError(e, \"log\") });\n    }\n    let facts = null;\n    if (deps.policy.facts) {\n        const fp = deps.policy.facts;\n        const store = fp.store ?? (typeof indexedDB !== \"undefined\" && fp.dbName ? idbThumbStore({ dbName: fp.dbName, storeName: \"gallery-facts\" }) : memoryThumbStore());\n        facts = createFactsCache({ store, fetch: fp.fetch, keyOf: (identifier) => factsKeyFor(fp.galleryId?.() ?? \"default\", identifier), report: (e) => deps.reportError(e, \"log\") });\n    }\n    const handle = mountGalleryScreen(el, { ...deps, store: deps.store, data, thumbs: thumbs ?? undefined, thumbKinds: deps.policy.thumbs?.kinds ?? [], facts: facts ?? undefined, factsKinds: deps.policy.facts?.kinds ?? [] });\n    return { handle, data, thumbs, facts };\n}\n", "// device-kv \u2014\u2014 device \u5C42\u552F\u4E00 localStorage \u5165\u53E3\uFF08\u6284 WeebPaint / WebXiaoHeiWu src/device-kv.ts \u7684\u5F62\u72B6\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\n//\n// \u7EAA\u5F8B\uFF1A**\u5168 app \u7981\u88F8 localStorage**\uFF08\u7EA2\u7EBF\u5B88\u536B\u6D4B\u8BD5 test/redline-guard.test.mjs \u5B88\u7740\uFF09\u2014\u2014device \u5C42\u6807\u91CF\u4E00\u5F8B\u7ECF\u672C\u5668\u5B98\u3002\n//   \u4F4F\u8FD9\u91CC\u7684\uFF1AstoreAttached\uFF08\u8FD9\u53F0\u8BBE\u5907\u6302\u8FC7\u56FE\u5E93 = \u5F00\u673A\u5148\u5EFA store \u518D initAuth\uFF0CCatsUp 2026-09-22 \u6559\u8BAD\uFF09\u3001gallery-folder\uFF08\u4E0A\u6B21\u5728\u54EA\u4E2A\u5939\uFF09\u3001\n//   last-scene\uFF08\u5728\u4E66\u67B6\u91CC\u79BB\u5F00 \u2192 \u56DE\u6765\u5728\u4E66\u67B6\uFF09\u3001diag-log\uFF08\u9ED1\u5323\u5B50\u73AF\uFF0C\u7ECF @internal/gallery diagLog\uFF09\u3002\n// localStorage \u4E0D\u53EF\u7528\uFF08\u9690\u79C1\u6A21\u5F0F / \u914D\u989D\uFF09\u2192 try/catch \u964D\u7EA7\u7EAF\u5185\u5B58\uFF08\u672C session \u5185\u4E00\u81F4\uFF0C\u4E0D\u8DE8\u5237\u65B0\uFF09\u3002\n// key \u524D\u7F00\u5E26 GUID \u547D\u540D\u7A7A\u95F4\uFF08\u540C origin \u5144\u5F1F PWA \u5171\u6876\u9632\u649E\uFF1B\u6C38\u4E0D\u78B0\u975E\u81EA\u5DF1\u524D\u7F00\u7684\u952E\uFF09\u3002\n\nconst PREFIX = \"moonsinger-5b1e7c0a92d34f6e:\";\n\nconst _mem = new Map<string, string>();\nfunction _ls(): Storage | null {\n  try {\n    const ls = globalThis.localStorage;\n    ls.getItem(PREFIX + \"__probe\");\n    return ls;\n  } catch { return null; }\n}\n\nexport function deviceKvGet(key: string): string | null {\n  const k = PREFIX + key;\n  const ls = _ls();\n  if (ls) { try { return ls.getItem(k); } catch { /* fall through to memory */ } }\n  return _mem.get(k) ?? null;\n}\n\n/** v=null \u5220\u952E\u3002\u5199\u5931\u8D25\uFF08\u914D\u989D / \u9690\u79C1\u6A21\u5F0F\u4E2D\u9014\u7FFB\u8138\uFF09\u2192 \u843D\u5185\u5B58\u5C42\uFF0C\u7EDD\u4E0D throw\uFF08device \u5C42\u662F\u4FBF\u5229\u4E0D\u662F\u7EA2\u7EBF\uFF09\u3002 */\nexport function deviceKvSet(key: string, v: string | null): void {\n  const k = PREFIX + key;\n  const ls = _ls();\n  if (ls) {\n    try {\n      if (v == null) ls.removeItem(k); else ls.setItem(k, v);\n      _mem.delete(k);\n      return;\n    } catch { /* fall through to memory */ }\n  }\n  if (v == null) _mem.delete(k); else _mem.set(k, v);\n}\n\nexport function deviceKvGetJson<T>(key: string, fallback: T): T {\n  const raw = deviceKvGet(key);\n  if (raw == null) return fallback;\n  try { return JSON.parse(raw) as T; } catch { return fallback; }\n}\nexport function deviceKvSetJson(key: string, v: unknown): void {\n  deviceKvSet(key, v == null ? null : JSON.stringify(v));\n}\n\n/** \u8FD8\u539F\u51FA\u5382\uFF1A\u6E05\u6389\u672C app \u524D\u7F00\u4E0B\u5168\u90E8 localStorage \u952E\uFF08localStorage \u53EA\u51C6\u672C\u6587\u4EF6\u78B0\uFF09\u3002\u8FD4\u56DE\u5220\u6389\u7684\u952E\u6570\u3002 */\nexport function deviceKvWipeAll(): number {\n  let n = 0;\n  const ls = _ls();\n  if (ls) {\n    try {\n      const keys: string[] = [];\n      for (let i = 0; i < ls.length; i++) { const k = ls.key(i); if (k && k.startsWith(PREFIX)) keys.push(k); }\n      for (const k of keys) ls.removeItem(k);\n      n = keys.length;\n    } catch { /* \u9690\u79C1\u6A21\u5F0F\u7B49\uFF1A\u65E0\u952E\u53EF\u6E05 */ }\n  }\n  _mem.clear();\n  return n;\n}\n", "// report-error.ts \u2014\u2014 app \u552F\u4E00\u7684\u9519\u8BEF\u6F0F\u6597\uFF08store / \u56FE\u5E93 / \u7F16\u8F91\u5668\u90FD\u5F80\u8FD9\u91CC\u62A5\uFF09+ \u9ED1\u5323\u5B50\uFF08\u8BBE\u5907\u8BCA\u65AD\u65E5\u5FD7\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\n//   error / warning \u2192 \u9876\u4E0A\u7684 notice\uFF08\u7528\u6237\u770B\u5F97\u89C1\uFF09\uFF1Binfo \u2192 \u4E00\u95EA\u7684 notice\uFF1Blog \u2192 \u53EA\u8FDB\u63A7\u5236\u53F0\u3002\n//   **\u6BCF\u4E00\u7EA7\u90FD\u8FDB\u9ED1\u5323\u5B50**\uFF08\u56FE\u5E93\u5305\u7684 diagLog\uFF1A\u73AF 500 \u6761\u3001\u5355\u6761 \u2264 600 \u5B57\u3001localStorage \u6301\u4E45\uFF08\u7ECF src/device-kv.ts\uFF0C\u540C\u6B65\u3001\u4E0D\u9760 IDB\u2014\u2014IDB \u6B63\u662F\u5E38\u89C1\u5ACC\u7591\u4EBA\uFF09\uFF1B\n//   \u8BBE\u7F6E\u91CC\u300C\u8BCA\u65AD\u65E5\u5FD7\u300D\u80FD\u770B / \u590D\u5236 / \u5206\u4EAB .txt / \u6E05\u7A7A\uFF0Csrc/app/diag-ui.ts\uFF09\u3002\u4E09\u6761\u6570\u636E\u6E90\uFF08\u7167 WeebPaint / WXHW\uFF09\uFF1A\n//   \u2460 reportError \u5168\u90E8\u7EA7\u522B \u2461 window error / unhandledrejection\uFF08\u542B bundle \u52A0\u8F7D\u524D index.html \u5185\u8054\u811A\u672C\u6293\u5230\u7684\uFF0C\u6392\u961F\u5728 window.__msEarlyErrors\uFF09\n//   \u2462 \u9762\u5305\u5C51 diagNote(tag, msg)\uFF1Aboot / auth / doc / gallery / sync / sw / page / net\u3002\n//   \u4E0D\u662F telemetry\uFF1A\u6C38\u4E0D\u4E0A\u4F20\uFF1B\u53EA\u6709\u7528\u6237\u70B9\u300C\u590D\u5236 / \u5206\u4EAB\u300D\u5B57\u8282\u624D\u79BB\u5F00\u8BBE\u5907\u3002user 2026-10-08\u300Cdebug consolelog\u2026\u51FA\u9519\u4E86\u53EF\u4EE5\u53D1\u7ED9\u4F60\u7684\u4E1C\u897F\uFF0C\u770B wxhw \u662F\u600E\u4E48\u505A\u7684\u300D\u3002\nimport { showNotice } from \"@internal/workbench-elements\";\nimport { diagLog, configureDeviceKv } from \"@internal/gallery\";\nimport { deviceKvGet, deviceKvSet } from \"../device-kv.ts\";\n\nexport type ErrorLevel = \"error\" | \"warning\" | \"info\" | \"log\";\nconst msgOf = (e: unknown): string => (e instanceof Error ? `${e.name === \"Error\" ? \"\" : e.name + \": \"}${e.message}` : typeof e === \"string\" ? e : String(e));\n\nexport function reportError(err: unknown, level: ErrorLevel = \"error\"): void {\n  const m = msgOf(err);\n  try { diagLog.record(level, m); } catch { /* \u9ED1\u5323\u5B50\u574F\u4E86\u4E5F\u4E0D\u80FD\u628A\u62A5\u9519\u541E\u6389 */ }\n  if (level === \"error\") { console.error(err); showNotice({ id: \"err\", level: \"error\", text: m }); }\n  else if (level === \"warning\") { console.warn(err); showNotice({ id: \"warn\", level: \"warning\", text: m, autoHideMs: 6000 }); }\n  else if (level === \"info\") { console.info(m); showNotice({ id: \"info\", level: \"info\", text: m, autoHideMs: 3000 }); }\n  else console.log(m);\n}\n/** \u9762\u5305\u5C51\uFF08\u4E0D\u662F\u9519\u8BEF\uFF09\uFF1Aboot / auth / doc / gallery / sync / sw \u7684\u65F6\u95F4\u7EBF\uFF0C\u53EA\u8FDB\u9ED1\u5323\u5B50\u3002 */\nexport const diagNote = (tag: string, msg: string): void => { try { diagLog.note(tag, msg); } catch { /* ignore */ } };\nexport const diagText = (): string => { try { return diagLog.toText(); } catch { return \"\"; } };\nexport const diagCount = (): number => { try { return diagLog.entries().length; } catch { return 0; } };\nexport const diagClear = (): void => { try { diagLog.clear(); } catch { /* ignore */ } };\n\ninterface EarlyErr { t: number; m: string }\n/** boot \u7B2C\u4E00\u4EF6\u4E8B\uFF1A\u9ED1\u5323\u5B50\u843D\u5230 device-kv \u5668\u5B98\uFF08\u540C\u6B65\u3001\u4E0D\u9760 IDB\uFF09\u3001\u6536 index.html \u5185\u8054\u811A\u672C\u6392\u961F\u7684\u65E9\u671F\u9519\u8BEF\u3001\u63A5 window error / unhandledrejection\u3001\u9875\u9762\u751F\u547D\u5468\u671F\u9762\u5305\u5C51\u3002 */\nexport function initBlackBox(version: string): void {\n  configureDeviceKv({ get: deviceKvGet, set: deviceKvSet });   // \u56FE\u5E93\u5305\u7684 device-kv\uFF08diagLog \u7B49\uFF09\u8D70\u672C\u4ED3 src/device-kv.ts \u90A3\u4E00\u4E2A\u5668\u5B98\uFF08\u5E26\u524D\u7F00\uFF09\n  diagLog.initDiagLog({ app: \"MoonSinger\", version });\n  const w = window as unknown as { __msEarlyErrors?: EarlyErr[] | { push: (e: EarlyErr) => void } };\n  const early = w.__msEarlyErrors;\n  if (Array.isArray(early)) for (const e of early.splice(0)) diagLog.record(\"error\", `[early] ${e.m}`);\n  w.__msEarlyErrors = { push: (e: EarlyErr) => { try { diagLog.record(\"error\", `[early] ${e.m}`); } catch { /* ignore */ } } };   // \u5185\u8054\u811A\u672C\u4E4B\u540E\u8FD8\u4F1A push\uFF1A\u76F4\u63A5\u8FDB\u9ED1\u5323\u5B50\n  window.addEventListener(\"error\", (e) => { try { diagLog.record(\"error\", `[window] ${e.message} @${(e.filename ?? \"\").split(\"/\").pop()}:${e.lineno}`); } catch { /* ignore */ } });\n  window.addEventListener(\"unhandledrejection\", (e) => { try { diagLog.record(\"error\", `[unhandledrejection] ${msgOf(e.reason)}`); } catch { /* ignore */ } });\n}\n", "// pad-host.ts \u2014\u2014 pad \u7684\u5BBF\u4E3B = \u7FFB\u8BD1\u5C42\u7684\u53E6\u4E00\u534A\uFF08\u952E\u76D8\u53EA\u53D1\u6309\u952E\uFF0C\u8FD9\u91CC\u628A\u6309\u952E\u53D8\u6210\u8C31\u4E0A\u7684\u4E8B\uFF09\uFF1A\n//   \u00B7 \u97F3\u952E \u2192 \u5199 / \u6539\u4E00\u4E2A\u97F3 / \u53E0\u97F3\u89C2\u671B / \u51FA\u58F0\uFF1B\u6309\u952E id \u2192 \u547D\u4EE4\uFF08\u9501 \u00D7 \u5149\u6807 \u00D7 \u9009\u533A\uFF09/ \u63D2\u8BB0\u53F7 / \u5F00\u83DC\u5355\uFF1B\n//   \u00B7 \u624B\u6307\u548C\u7535\u8111\u952E\u76D8\u5171\u7528\u7684\u300C\u8C01\u6309\u7740\u300D\u7C3F\u8BB0\uFF1A\u5355\u97F3\u4E50\u5668\u7684\u300C\u540C\u65F6\u6309\u300D\u62A4\u680F\u3001\u53E0\u97F3\u7684\u6839\u97F3\u4E0E\u89C2\u671B\uFF08\u5224\u636E = src/keyboard/chords.ts\uFF0C\u7EAF\u51FD\u6570\uFF09\u3002\n// created 2026-10-15 by Claude Fable 5.1\uFF08\u952E\u76D8\u6A21\u5757\u5200 2 \u4E4B\u4E09\uFF1A\u4ECE src/app/main.ts \u539F\u6837\u62BD\u51FA\uFF0C\u884C\u4E3A\u4E0D\u53D8\uFF1B\u5BF9\u5E94 ai-docs/20261014-editing-mental-model.md \u00A76 \u7684\u300C\u7FFB\u8BD1\u5C42\u300D\uFF09\u3002\n//   \u5BBF\u4E3B\u53EA\u77E5\u9053 pad \u53D1\u4EC0\u4E48\uFF08PadHost\uFF09\uFF0C\u8C31\u600E\u4E48\u53D8\u5168\u95EE PadGlue\uFF08main.ts \u7ED9\u7684\u4E00\u7EC4\u8BBF\u95EE\u5668\uFF09\uFF1B\u5199\u6CD5\u540C performance.ts \u7684 PerfHost\u3002\n// \u5355\u97F3\u4E50\u5668\uFF08\u5C0F\u6708\u76F8 / \u5143\u97F3 / \u6CA1\u4EBA\uFF09\u5199\u97F3\uFF1A\u540C\u65F6\u591A\u6309\u53EA\u5199\u7B2C\u4E00\u4E2A\uFF08user\u300Cmonophonic\u4E50\u5668\u8F93\u5165\u7684\u65F6\u5019\u5982\u679C\u4F60\u591A\u6309\u53EA\u4F1A\u8F93\u7B2C\u4E00\u4E2A\u3002\u4F46\u662F\u505A\u597D\u6A21\u7CCA\u62A4\u680F\u514D\u5F97\u5FEB\u901F\u8F93\u5165\u7684\u65F6\u5019\u7B2C\u4E8C\u4E2A\u97F3\u88AB\u5403\u6389\u300D\uFF09\u3002\n//   \u6A21\u7CCA\u62A4\u680F\uFF1A\u53EA\u6709\u300C\u4E0A\u4E00\u4E2A\u5199\u8FDB\u53BB\u7684\u97F3\u8FD8\u6309\u7740\uFF0C\u800C\u4E14\u624D\u8FC7\u4E86\u4E0D\u5230 50 ms\u300D\u624D\u7B97\u540C\u65F6\u6309\u3001\u4E0D\u5199\u4E0D\u54CD\u4E0D\u4EAE\uFF1B\u5FEB\u901F\u8FDE\u6309\uFF08\u524D\u4E00\u6839\u624B\u6307\u8FD8\u6CA1\u62AC\uFF0C\u4F46\u5DF2\u7ECF\u9694\u5F00\u4E86\uFF09\u7167\u5199\uFF0C\u62AC\u8FC7\u624B\u7684\u66F4\u4E0D\u7BA1\u3002\n//   \u624B\u6307\u548C\u7535\u8111\u952E\u76D8\u5171\u7528\u4E00\u4EFD\uFF1B\u5F39\uFF08\u53EA\u5531\u4E0D\u5199\uFF09\u4E0D\u7BA1\uFF0C\u51E0\u4E2A\u97F3\u4E00\u8D77\u54CD\u3002\n// \u53E0\u97F3\u7684\u300C\u5934 / \u5C3E\u300D\u5224\u636E\uFF082026-10-08 by Claude Opus 5.5\uFF1B\u53EA\u7ED9\u80FD\u53E0\u97F3\u7684\u58F0\u90E8\uFF09\uFF1A\n//   user\u300C\u4E4B\u524D\u7684\u5224\u5B9A\u662Fab\u843D\u7684\u65F6\u5019\u76F8\u8FD1\u3002\u73B0\u5728\u7684\u5224\u5B9A\u662Fb\u843D\u7684\u65F6\u5019\u4E0D\u5728a\u7684\u5C3E\u5DF4\u4E0A\u300D\u300C\u5982\u679Cab\uFF0Cb\u6309\u4E0B\u53BB\u4E4B\u540Ea\u9A6C\u4E0A\u677E\uFF0C\u90A3\u4E48\u5C31\u4E0D\u5E94\u8BE5\u662F\u548C\u5F26\u300D\n//   \u300C\u5C3E\u5DF4\u65F6\u95F4\u89C4\u5219\u4E5F\u9700\u8981\u8003\u8651\u76F8\u5BF9\u6BD4\u4F8B\uFF0C\u6BD4\u5982\u5982\u679C\u6211\u5FEB\u901F\u8DF3\u97F3\u8F7B\u6309ab\u591A\u6B21\u7684\u65F6\u5019\u300D\u300C\u548C\u5F26\u8F93\u5165\u7684\u65F6\u5019\u5E94\u8BE5\u652F\u6301\u6709\u957F\u95F4\u9694\u7684\u8FDE\u6309\u2026\u6162\u6162\u6309\uFF0Cxor toggle\uFF0C\u624B\u6307\u6570\u91CF\u4E0D\u591F\u7684\u65F6\u5019\u4E5F\u80FD\u597D\u300D\n//   A\uFF08\u6839\u97F3\uFF1A\u5199\u8FDB\u8C31\u3001\u8FD8\u6309\u7740\u7684\u90A3\u4E2A\uFF09\u6309\u7740\u65F6\u6309\u4E0B B\uFF1AB \u9A6C\u4E0A\u54CD\uFF0C\u8FDB\u4E0D\u8FDB\u8C31**\u89C2\u671B**\u5230\u5206\u5F97\u51FA\u6765\uFF08\u4E0D\u5148\u5199\u518D\u64A4\u2014\u2014\u64A4\u9500\u6808\u5E72\u51C0\u3001\u66FF\u6362\u6A21\u5F0F\u4E0D\u4E22\u65F6\u503C\uFF09\uFF1B\u89C4\u5219\u9010\u6761\u5728 chords.ts \u5934\u6CE8\u91CA\u3002\n// MIDI \u952E\u76D8\uFF082026-10-16 by Claude Opus 5.5\uFF09= \u53C8\u4E00\u53F0\u53D1\u97F3\u952E\u7684\u8BBE\u5907\uFF1AnoteDown / noteUp \u6536\u7EDD\u5BF9\u97F3\u9AD8\uFF0C\u5199 / \u6539 / \u53E0\u97F3\u89C2\u671B / \u5355\u58F0\u62A4\u680F / \u5F39\u548C pad \u97F3\u952E\u540C\u4E00\u6761\u8DEF\uFF0C\n//   \u53EA\u662F\u4E0D\u5403 pad \u7684\u5347\u964D\u9501\uFF08raw\uFF1A\u7434\u952E\u672C\u8EAB\u5C31\u5206\u9ED1\u767D\u952E\uFF0C\u6309\u7684\u662F\u54EA\u4E2A\u5C31\u662F\u54EA\u4E2A\uFF09\u3002\n\nimport { type Pitch, alterBy, keySpell } from \"../score/pitch.ts\";\nimport { apply, type Command } from \"../score/commands.ts\";\nimport { type EditorState, ART_NAME, singleSel, writePitch, soundingPitch, setNote, setUnit, setTuplet, setInputKey, setInputScale, tr, keyAt, toggleChordPitch, dynMarkAt } from \"../score/song.ts\";\nimport type { Mark } from \"../score/perform.ts\";\nimport { Pad, type HintRange } from \"../keyboard/pad.ts\";\nimport { chordHead, chordBothAfterMs, chordVerdict, monoClash, type ChordWhy } from \"../keyboard/chords.ts\";\nimport { createPadMusic, type PadMusicHost } from \"./pad-music.ts\";\nimport { padKeyAction, markOfKey } from \"./pad-keys.ts\";\nimport { diagNote } from \"./report-error.ts\";\n\n/** main.ts \u7ED9\u7684\u90A3\u4E00\u7EC4\u8BBF\u95EE\u5668\uFF1A\u8C31\u7684\u72B6\u6001\u4E0E\u5199\u3001\u51FA\u58F0\u3001\u9875 / \u6A21\u5F0F\u3001\u9B3C\u97F3\u7B26\u3001\u9501\u3001\u62AB\u9732\u3001\u7B26\u53F7\u683C\u8981\u770B\u7684\u3001\u83DC\u5355\u3002 */\nexport interface PadGlue {\n  state(): EditorState;\n  update(next: EditorState): void;\n  /** \u5199\u4E00\u4E2A\u97F3\u5E76\u56DE\u521A\u5199\u7684\u4E0B\u6807\uFF08-1 = \u6CA1\u5199\u6210\uFF09\u3002 */\n  writeAndLocate(write: (s: EditorState) => EditorState): number;\n  /** \u5199\u4E86\u4E00\u4E2A\u97F3 / \u4F11\u6B62 / \u62C9\u957F\u4E4B\u540E\uFF1A\u9501\u7684\u300C\u53EA\u7BA1\u4E0B\u4E00\u4E2A\u300D\u7528\u6389\u4E86\u3002 */\n  afterWrite(): void;\n  /** \u6539\u4E86\u97F3\u9AD8\u4E4B\u540E\u54CD\u4E00\u4E0B\u3002 */\n  previewEdited(): void;\n  info(msg: string): void;\n  /** \u5149\u6807\u6240\u5728\u58F0\u90E8\u7684\u4E50\u5668\u80FD\u53E0\u97F3\u5417\u3002 */\n  canStack(): boolean;\n  sound: { down(p: Pitch, id: string): void; up(id: string): void };\n  /** \u8C31\u4E0A\u7B2C i \u4E2A\u97F3\u51FA\u58F0\uFF08\u548C\u5F26\u6574\u4E2A\u54CD\uFF09\u3002 */\n  soundTok(s: EditorState, i: number, id: string): void;\n  /** \u5148\u54CD\u540E\u5199\u7684\u8865\u8BFE\uFF1A\u6309\u4E0B\u65F6\u5DF2\u6309 sounded \u54CD\u4E86\uFF0C\u5199\u5B8C\u6210\u4E86\u548C\u5F26 = \u53EA\u8865\u591A\u51FA\u6765\u7684\u97F3\uFF1B\u4E3B\u97F3\u53D8\u4E86 = \u91CD\u54CD\u3002 */\n  soundAfterWrite(s: EditorState, i: number, id: string, sounded: Pitch): void;\n  /** \u9876\u680F\u300C\u5F39\u300D\u5F00\u7740\u3002 */\n  impro(): boolean;\n  /** \u627E\u4EBA\u89C6\u56FE\u5F00\u7740\uFF08\u771F\u5BF9\u8C61 finder.isOpen\uFF1Bpad \u521B\u5EFA\u65F6 finder \u8FD8\u6CA1\u5EFA\uFF0C\u6240\u4EE5\u662F\u8BBF\u95EE\u5668\uFF09\u3002 */\n  finderOpen(): boolean;\n  finderShown(): boolean;\n  instShown(): boolean;\n  toggleImpro(): void;\n  /** \u5C0F\u952E\u76D8\u9876\u4E0A\u300C\u7B26 / \u97F3\u300D\uFF1A\u53EA\u6362\u952E\u76D8\u3002 */\n  kbSwitch(): void;\n  ghost: { on(): boolean; set(id: string, p: Pitch): void; delete(id: string): boolean; sync(): void };\n  /** /2 \u90A3\u628A\u9501\uFF1A\u632A\u5149\u6807 = \u53D6\u6D88\u300C\u51D1\u6EE1\u4E00\u4EFD\u300D\uFF1B\u62E8\u4E86\u957F\u77ED\u65CB\u94AE = \u53D6\u6D88\u4F46\u4E0D\u632A\u56DE\u4E00\u6863\uFF1B\u6309\u4E0B / \u677E\u5F00\uFF1B\u547D\u4EE4\u5E26\u4E0A half\u3002 */\n  half: { caretMoved(): void; knobTurned(): void; key(down: boolean): void; wrap(c: Command): Command };\n  accKey(phase: \"down\" | \"slide\" | \"up\", acc: -2 | -1 | 1 | 2): void;\n  stackKey(down: boolean): void;\n  discloseArt(prev: EditorState, a: Mark): void;\n  discloseDynOverride(prev: EditorState): void;\n  /** \u5149\u6807\u6240\u5728\u58F0\u90E8\u53F0\u4E0A\u90A3\u4F4D\u4E0D\u8BA4\u7684\u8BB0\u53F7\u3002 */\n  ignoredHere(): Mark[];\n  hintRange(): HintRange;\n  staves(): number;\n  autoBars: { get(): boolean; set(on: boolean): void };\n  insertMarkHere(kind: \"key\" | \"time\" | \"tempo\"): void;\n  insertGrooveHere(): void;\n  openRepeatMenu(): void;\n  openInsertClefMenu(at: { x: number; y: number }): void;\n  openInsertOttavaMenu(at: { x: number; y: number }): void;\n  showPad(on: boolean): void;\n}\n\nexport interface PadHostApi {\n  pad: Pad;\n  music: PadMusicHost;\n  /** \u7535\u8111\u952E\u76D8\u7684\u97F3\u952E\u4E5F\u8D70\u5B83\uFF1A\u5355\u97F3\u4E50\u5668\u7684 50 ms \u62A4\u680F\uFF08\u80FD\u53E0\u97F3\u7684\u58F0\u90E8\u7167\u65E7\u53EA\u8BB0\u300C\u6309\u7740\u300D\uFF09\u3002 */\n  monoAccept(id: string): boolean;\n  /** \u4E00\u4E2A\u952E\uFF08\u624B\u6307 / \u7535\u8111\u952E\uFF09\u677E\u5F00\u4E86\uFF1A\u4E0D\u518D\u6309\u7740\uFF08\u53E0\u97F3\u7684 B / \u6839\u97F3\u7531 pad \u7684 onNoteUp \u81EA\u5DF1\u5B9A\uFF1B\u7535\u8111\u952E\u53EA\u8BB0\u7C3F\uFF09\u3002 */\n  release(id: string): void;\n  /** \u5931\u7126 / \u9875\u9762\u9690\u85CF\uFF1A\u62AC\u624B\u7684\u4E8B\u4EF6\u53EF\u80FD\u6536\u4E0D\u5230\u2014\u2014\u89C2\u671B\u4E2D\u7684\u90FD\u6309\u300C\u952E\u90FD\u677E\u4E86\u300D\u5B9A\u4E0B\u6765\uFF08\u5199\u6210\u5355\u4E2A\u7684\u97F3\uFF09\u3001\u6839\u97F3\u6E05\u7A7A\u3001\u6309\u7740\u7684\u6E05\u7A7A\u3002 */\n  reset(): void;\n  /** \u5916\u63A5\u952E\u76D8\uFF08MIDI\uFF09\u6309\u4E0B\u4E00\u4E2A\u97F3\uFF1A\u7EDD\u5BF9\u97F3\u9AD8\uFF0C\u4E0D\u5403 pad \u7684\u5347\u964D\u9501\uFF1B\u5176\u4F59\u540C pad \u97F3\u952E\uFF08\u5199 / \u6539 / \u53E0\u97F3\u89C2\u671B / \u5355\u58F0\u62A4\u680F / \u5F39\uFF09\u3002false = \u5355\u58F0\u62A4\u680F\u6CA1\u6536\u3002 */\n  noteDown(p: Pitch, id: string): boolean;\n  noteUp(id: string): void;\n}\n\ninterface ChordRoot { tokId: number; t: number; keyId?: string }\ninterface ChordWait { keyId: string; pitch: Pitch; t: number; root: ChordRoot & { keyId: string }; timer: number; done: boolean }\n\nexport function createPadHost(padEl: HTMLElement, g: PadGlue): PadHostApi {\n  const st = (): EditorState => g.state();\n  /** pad \u4E0A\u6BCF\u6839\u6309\u7740\u7684\u624B\u6307\uFF1A\u521A\u5199\u7684\u662F\u7B2C\u51E0\u4E2A\u97F3\uFF08\u5F39 = -1\uFF09\u3001\u5B83\u539F\u672C\u7684\u97F3\u9AD8\u2014\u2014\u4E0A\u4E0B\u6ED1\u8FC7\u95E8\u69DB\u65F6\u5728\u5B83\u4E0A\u9762\u5347 / \u964D\u3002 */\n  const padNotes = new Map<string, { index: number; base: Pitch }>();\n  const monoHeld = new Set<string>();\n  let monoAt = -Infinity;\n  function monoAccept(id: string): boolean {\n    const now = performance.now();\n    if (monoClash(monoHeld.size, monoAt, now)) return false;\n    monoHeld.add(id); monoAt = now; return true;\n  }\n  const chordRoots = new Map<string, { tokId: number; t: number }>();   // \u6309\u7740\u7684\u952E \u2192 \u5B83\u5199\u8FDB\u8C31\u7684\u90A3\u4E2A\u97F3\uFF08\u6839\u97F3\u5019\u9009\uFF09\n  let chordWaits: ChordWait[] = [];\n  const tokIndex = (tokId: number): number => tr(st()).findIndex((t) => t.id === tokId);\n  /** \u73B0\u5728\u7684\u6839\u97F3 = \u6700\u8FD1\u5199\u8FDB\u8C31\u3001\u952E\u8FD8\u6309\u7740\u3001\u97F3\u8FD8\u5728\u7684\u90A3\u4E2A\u3002 */\n  function chordRoot(): (ChordRoot & { keyId: string }) | null {\n    let best: (ChordRoot & { keyId: string }) | null = null;\n    for (const [keyId, r] of chordRoots) if (monoHeld.has(keyId) && tokIndex(r.tokId) >= 0 && (!best || r.t > best.t)) best = { ...r, keyId };\n    return best;\n  }\n  /** \u53E0\u5230\u6839\u97F3\u4E0A\uFF08XOR\uFF1B\u6309\u8C31\u4E0A\u7684\u8C03\u53F7\u62FC\u5199\uFF09\u3002\u6839\u97F3\u6CA1\u4E86 = false\u3002 */\n  function chordMerge(root: ChordRoot, pitch: Pitch): boolean {\n    const s = st(), ri = tokIndex(root.tokId), t = tr(s)[ri];\n    if (ri < 0 || t?.kind !== \"note\" || !t.pitch) return false;\n    g.update(toggleChordPitch(s, ri, keySpell(pitch, keyAt(tr(s), ri))));\n    return true;\n  }\n  /** \u5B9A\u4E00\u4E2A\u89C2\u671B\u4E2D\u7684\uFF1Awhy = \u8C01\u5148\u53D1\u751F\u7684\uFF08B \u677E / \u6839\u97F3\u677E / \u4E24\u4E2A\u90FD\u6309\u7740\u591F\u4E45\u4E86 / \u53C8\u6309\u4E86\u4E0B\u4E00\u4E2A\u952E\uFF09\u3002\u53E0\u4E0D\u6210 = \u73B0\u5728\u628A B \u5F53\u4E00\u4E2A\u97F3\u8865\u5199\u8FDB\u53BB\u3002 */\n  function decideChord(w: ChordWait, why: ChordWhy): void {\n    if (w.done) return;\n    const now = performance.now(), keyHeld = monoHeld.has(w.keyId), v = chordVerdict(w.root, w, now, why, monoHeld.has(w.root.keyId), keyHeld);   // \u5934 / \u5C3E\u5224\u636E\uFF1Asrc/keyboard/chords.ts\n    if (v === null) return;   // \u5230\u65F6\u5019\u4E86\u53EF\u6709\u4EBA\u677E\u4E86\uFF1A\u7B49\u677E\u624B\u90A3\u4E00\u4E0B\u6765\u5B9A\n    w.done = true; clearTimeout(w.timer); chordWaits = chordWaits.filter((x) => x !== w);\n    if (v === \"chord\" && chordMerge(w.root, w.pitch)) return;\n    const i = g.writeAndLocate((s) => writePitch(s, w.pitch, true));   // \u4E24\u4E2A\u97F3\uFF1A\u73B0\u5728\u8865\u5199\uFF08\u97F3\u9AD8\u6309\u4E0B\u65F6\u5C31\u5E26\u597D\u4E86 \u266F / \u266D\uFF09\n    if (i < 0) { if (st().sel) g.info(\"\u9009\u533A\u5199\u6EE1\u4E86\uFF1A\u5199\u4E0D\u51FA\u9009\u533A\u3002\u8981\u5F80\u540E\u5199\uFF0C\u5148\u70B9\u522B\u5904\u9000\u51FA\u9009\u533A\"); return; }\n    const t = tr(st())[i];\n    if (keyHeld && t) chordRoots.set(w.keyId, { tokId: t.id, t: w.t });   // B \u8FD8\u6309\u7740\uFF1A\u5B83\u6210\u4E86\u4E0B\u4E00\u4E2A\u7684\u6839\u97F3\n    g.afterWrite();\n  }\n  /** \u628A\u8FD8\u5728\u89C2\u671B\u7684\u90FD\u5B9A\u4E0B\u6765\uFF08\u53C8\u6309\u4E86\u4E00\u4E2A\u952E = \u6309\u5F53\u524D\u7684\uFF1B\u9875\u9762\u5931\u7126 / \u9690\u85CF = \u952E\u90FD\u7B97\u677E\u4E86\uFF0C\u5199\u6210\u5355\u4E2A\u7684\u97F3\uFF09\u3002 */\n  function settleChords(why: \"force\" | \"lost\"): void {\n    for (const w of [...chordWaits]) { if (why === \"lost\") { monoHeld.delete(w.root.keyId); } decideChord(w, \"force\"); }\n  }\n  /** \u4E00\u4E2A\u952E\u677E\u5F00\uFF1A\u5B83\u662F\u8C01\u7684 B / \u8C01\u7684\u6839\u97F3\uFF0C\u5C31\u6309\u8FD9\u4E2A\u5B9A\uFF1B\u5B83\u4E0D\u518D\u662F\u6839\u97F3\u3002 */\n  function chordKeyUp(id: string): void {\n    for (const w of [...chordWaits]) { if (w.keyId === id) decideChord(w, \"keyUp\"); else if (w.root.keyId === id) decideChord(w, \"rootUp\"); }\n    chordRoots.delete(id);\n  }\n\n  const music = createPadMusic(st);   // pad \u7684\u97F3\u4E50\u77E5\u8BC6\uFF08src/app/pad-music.ts\uFF09\uFF1A\u7B2C k \u7EA7\u662F\u4EC0\u4E48\u97F3\u3001\u300C1=\u300D\u7684\u6863\uFF1B\u952E\u76D8\u53EA\u8BA4 k\n  /** \u300C\u5F39\u300D= \u97F3\u952E\u53EA\u54CD\u4E0D\u5199\uFF1A\u9876\u680F\u5F00\u5173\uFF0C\u6216\u627E\u4EBA\u89C6\u56FE / \u4E50\u5668\u9875\u5F00\u7740\uFF08\u8BD5\u542C\u53F0\u4E0A\u90A3\u4F4D\uFF09\u3002\u8BFB finderShown() \u4E0D\u8BFB finder\uFF1Apad \u4E00\u521B\u5EFA\u5C31\u753B\u300C\u5F39\u300D\u94AE\uFF0C\u90A3\u65F6 finder \u8FD8\u6CA1\u5EFA\u3002 */\n  const padImpro = (): boolean => g.impro() || g.finderShown() || g.instShown();\n  /** \u5199\u4E4B\u524D\u95EE\u4E00\u58F0\uFF1A\u80FD\u53E0\u97F3\u7684\u58F0\u90E8\u540C\u65F6\u591A\u6309\u90FD\u6536\uFF0880 ms \u5185 = \u53E0\u5728\u4E00\u8D77\uFF09\uFF1B\u5355\u58F0\u4E50\u5668\u51E0\u4E4E\u540C\u65F6\u6309\u4E0B\u7684\u7B2C\u4E8C\u6839\u624B\u6307 = false\uFF08\u4E0D\u5199\u3001\u4E0D\u54CD\u3001\u4E0D\u4EAE\uFF09\u3002 */\n  const padAccept = (id: string): boolean => (g.canStack() ? (monoHeld.add(id), true) : monoAccept(id));\n  /** pad \u97F3\u952E\u5199\u4E00\u4E2A\u97F3\uFF08\u627E\u4EBA\u89C6\u56FE\u5F00\u7740\u4E00\u5F8B\u4E0D\u63A5\uFF1A\u8BD5\u542C\u53F0\u4E0D\u78B0\u8C31\u2014\u2014user\u300C\u8BD5\u542C\u7684\u65F6\u5019\u5199\u5165\u7684\u4E1C\u897F\u4E0D\u4F1A\u4E0D\u5C0F\u5FC3\u8F93\u5165\u5230\u4E50\u8C31\u5427\u2026\u662F\u4E0D\u662F\u5E94\u8BE5disable\u300D\uFF09\uFF1A\n   *  \u6539\u8FD9\u4E2A\u97F3\uFF08\u53EA\u9009\u4E86\u4E00\u4E2A / \u53E0\u4EAE\u7740\uFF09/ \u53E0\u97F3\u89C2\u671B\uFF08\u80FD\u53E0\u97F3\u7684\u58F0\u90E8\uFF09/ \u666E\u901A\u5199\u3002 */\n  function padWrite(p: Pitch, id: string, raw = false): void {\n    if (g.finderOpen()) return;\n    const now = performance.now(), s = st();\n    { const one = singleSel(s); if (one >= 0) {   // \u6539\u8FD9\u4E2A\u97F3\uFF08\u53EA\u9009\u4E86\u4E00\u4E2A / \u53E0\u4EAE\u7740\uFF09\uFF1AXOR\uFF08\u6700\u540E\u4E00\u4E2A\u62FF\u6389 = \u4E00\u6837\u957F\u7684\u4F11\u6B62\uFF0C\u4F11\u6B62\u4E0A\u6309 = \u53D8\u56DE\u97F3\uFF09\uFF1B\u5355\u58F0\u4E50\u5668 = \u6362\u97F3\u9AD8\n      g.update(writePitch(s, p, raw, !g.canStack())); padNotes.set(id, { index: one, base: p }); g.previewEdited(); return;\n    } }\n    if (g.canStack()) {\n      settleChords(\"force\");   // \u53C8\u6309\u4E0B\u4E00\u4E2A\u952E\uFF1A\u8FD8\u5728\u89C2\u671B\u7684\u5148\u5B9A\uFF08\u6839\u97F3\u8FD8\u6309\u7740 = \u53E0\uFF09\n      const root = chordRoot();\n      if (root) {\n        const sp = raw ? p : soundingPitch(st(), p).pitch;\n        padNotes.set(id, { index: -1, base: p });   // \u5148\u54CD\uFF08padSound \u6309 base \u51FA\u58F0\uFF09\uFF0C\u8FDB\u4E0D\u8FDB\u8C31\u3001\u53E0\u4E0D\u53E0\uFF0C\u7B49\u5206\u51FA\u6765\u518D\u5B9A\n        if (chordHead(root, { t: now })) { chordMerge(root, sp); return; }   // \u5934\uFF1A\u548C\u6839\u97F3\u51E0\u4E4E\u540C\u65F6\u843D\u4E0B = \u9A6C\u4E0A\u53E0\n        const w: ChordWait = { keyId: id, pitch: sp, t: now, root, timer: 0, done: false };\n        w.timer = window.setTimeout(() => decideChord(w, \"both\"), chordBothAfterMs(root, w));   // \u91CD\u53E0\u4E00\u8D85\u8FC7\u6839\u97F3\u5355\u72EC\u6309\u7740\u7684\u65F6\u957F = \u53E0\uFF08\u4E0D\u7528\u7B49\u677E\u624B\uFF09\n        chordWaits.push(w);\n        return;\n      }\n    }\n    const i = g.writeAndLocate((x) => writePitch(x, p, raw, !g.canStack()));\n    if (i < 0) { padNotes.set(id, { index: -1, base: p }); return; }\n    const t = tr(st())[i];\n    padNotes.set(id, { index: i, base: t?.kind === \"note\" && t.pitch ? t.pitch : p });\n    if (g.canStack() && t) chordRoots.set(id, { tokId: t.id, t: now });\n    g.afterWrite();\n  }\n  /** pad \u97F3\u952E\u51FA\u58F0\uFF1A\u5199\u8FDB\u8C31\u7684\u90A3\u4E2A\u97F3\uFF08\u548C\u5F26\u6574\u4E2A\u54CD\uFF09\uFF1B\u5F39 = \u5E26\u4E0A\u6302\u7740\u7684 \u266F / \u266D\u3001\u8C31\u4E0A\u753B\u9B3C\u97F3\u7B26\u3002 */\n  function padSound(p: Pitch, id: string, raw = false): void {\n    const n = padNotes.get(id);\n    if (n && n.index >= 0) g.soundTok(st(), n.index, id);\n    else { const r = raw ? { pitch: p, st: st() } : soundingPitch(st(), p); if (!raw) g.update(r.st); padNotes.set(id, { index: -1, base: r.pitch }); g.sound.down(r.pitch, id); if (g.ghost.on()) { g.ghost.set(id, r.pitch); g.ghost.sync(); } }\n  }\n  /** \u4E00\u4E2A\u97F3\u952E\u6309\u4E0B\uFF08pad \u7684\u7B2C k \u7EA7\u3001MIDI \u7684\u7434\u952E\u90FD\u8D70\u8FD9\u91CC\uFF09\uFF1A\u300C\u5F39\u300D= \u53EA\u54CD\uFF1B\u5426\u5219**\u5148\u54CD\u540E\u5199**\uFF082026-10-17 Claude Fable 5.1\uFF1B\u91CF = ai-docs/20261017-input-latency-probe.md\uFF1A\n   *  \u539F\u6765\u5148\u5199\u3001\u6574\u5F20\u91CD\u6392\u3001\u518D\u54CD\uFF0C\u5927\u6B4C\u91CC\u51FA\u58F0\u665A 30\u201380 ms\uFF09\u3002\u54CD\u7684\u5C31\u662F\u8981\u5199\u7684\u90A3\u4E2A\u97F3\uFF1A\u5347\u964D\u9501\u7B97\u8FDB\u53BB\u4F46\u8FD9\u91CC\u4E0D\u6D88\u8017\uFF08\u5199\u8FDB\u8C31\u65F6 writePitch \u81EA\u5DF1\u6D88\u8017\uFF1B\u5199\u8FDB\u8C31\u53EA\u6362\u62FC\u6CD5\u4E0D\u6362\u97F3\u9AD8\uFF09\u3002 */\n  function noteDown(p: Pitch, id: string, raw = false): boolean {\n    if (padImpro()) { padSound(p, id, raw); return true; }\n    if (!padAccept(id)) return false;\n    const sp = raw ? p : soundingPitch(st(), p).pitch;\n    g.sound.down(sp, id);\n    padWrite(p, id, raw);\n    const n = padNotes.get(id);\n    if (!n) { padNotes.set(id, { index: -1, base: sp }); return true; }\n    if (n.index >= 0) g.soundAfterWrite(st(), n.index, id, sp);   // \u6210\u4E86\u548C\u5F26\uFF08\u53EA\u9009\u4E86\u4E00\u4E2A\u97F3\u65F6\u53E0\u4E0A\u53BB\uFF09= \u8865\u54CD\u591A\u51FA\u6765\u7684\u97F3\uFF1B\u4E3B\u97F3\u53D8\u4E86\uFF08XOR \u62FF\u6389\u4E86\u6309\u7684\u90A3\u4E2A\uFF09= \u91CD\u54CD\n    else if (!raw) { const r = soundingPitch(st(), p); if (r.st !== st()) g.update(r.st); }   // \u6CA1\u5199\u8FDB\u8C31\uFF08\u53E0\u97F3\u89C2\u671B / \u5199\u4E0D\u8FDB\uFF09\uFF1A\u5347\u964D\u9501\u7167\u6837\u7528\u6389\u4E00\u6B21\uFF08\u539F\u6765 padSound \u505A\u7684\uFF09\n    return true;\n  }\n  /** \u5148\u6309\u677E\u5F00\u7684\u987A\u5E8F\u5B9A\u89C2\u671B\u4E2D\u7684\u53E0\u97F3\uFF08\u8981\u770B\u8C01\u8FD8\u6309\u7740\uFF09\uFF0C\u518D\u653E\u3002 */\n  function noteUp(id: string): void { chordKeyUp(id); padNotes.delete(id); monoHeld.delete(id); g.sound.up(id); if (g.ghost.delete(id)) g.ghost.sync(); }\n  /** pad \u53D1\u6765\u7684\u6309\u952E id \u2192 \u7FFB\u8BD1\uFF08src/app/pad-keys.ts\uFF09\u2192 \u505A\uFF1A\u547D\u4EE4\u8D70 runPadCommand\uFF08\u9501 / \u62AB\u9732\uFF09\uFF0C\u63D2\u8BB0\u53F7\u5F00\u8BB0\u53F7\u6846\uFF0C\u5F00\u5C0F\u83DC\u5355\u3002\u627E\u4EBA\u89C6\u56FE\u5F00\u7740\u4E00\u5F8B\u4E0D\u63A5\u3002 */\n  function padKey(id: string, mods: { ramp: boolean }): void {\n    if (g.finderOpen()) return;\n    const a = padKeyAction(id, mods);\n    if (!a) { diagNote(\"pad\", `unknown pad key ${id}`); return; }   // test/pad-keys.test.ts \u5B88\u7740\u6BCF\u4E2A\u683C\u5B50\u90FD\u63A5\u4E86\uFF1B\u771F\u5230\u8FD9\u513F = \u952E\u76D8\u52A0\u4E86\u683C\u5B50\u6CA1\u767B\u8BB0\n    if (a.kind === \"cmd\") runPadCommand(a.cmd);\n    else if (a.kind === \"mark\") g.insertMarkHere(a.mark);\n    else if (a.menu === \"groove\") g.insertGrooveHere();\n    else if (a.menu === \"repeat\") g.openRepeatMenu();\n    else { const r = padEl.getBoundingClientRect(), at = { x: r.left + r.width / 2, y: r.top - 4 }; if (a.menu === \"clef\") g.openInsertClefMenu(at); else g.openInsertOttavaMenu(at); }\n  }\n  /** pad \u7684\u7F16\u8F91\u547D\u4EE4\uFF1A\u9501\uFF08/2 \u7684\u51D1\u6EE1\u4E00\u4EFD\uFF09\u00D7 \u547D\u4EE4 \u2192 apply\uFF1B\u505A\u4E0D\u6210\u7684\u8BF4\u4E00\u53E5\uFF1B\u5199\u4E86\u7684\u62AB\u9732\uFF08\u4E0D\u8BA4\u7684\u8BB0\u53F7 / \u88AB\u76D6\u6389\u7684\u529B\u5EA6\uFF09\u3002 */\n  function runPadCommand(c: Command): void {\n    if (c.k === \"caret\") g.half.caretMoved();   // \u632A\u5149\u6807 = \u53D6\u6D88\u300C\u51D1\u6EE1\u4E00\u4EFD\u300D\uFF08\u9501\u4F4F\u7684\u4E0D\u52A8\uFF09\n    const prev = st(), nx = apply(prev, g.half.wrap(c), performance.now());\n    if (c.k === \"art\" && nx === prev) { g.info(c.a === \"arpeggio\" ? \"\u7436\u97F3\u53EA\u6302\u5728\u548C\u5F26\u4E0A\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08\u6216\u9009\u4E2D\u7684\uFF09\u662F\u5355\u97F3\" : `${ART_NAME[c.a]}\u8981\u6302\u5728\u4E00\u4E2A\u97F3\u4E0A\uFF08\u5149\u6807\u524D\u9762\u662F\u4F11\u6B62\u6216\u8005\u8FD8\u6CA1\u6709\u97F3\uFF09`); return; }\n    if (c.k === \"slur\" && nx === prev) { g.info(\"\u8FDE\u7EBF\u4ECE\u4E00\u4E2A\u97F3\u8FDE\u5230\u4E0B\u4E00\u4E2A\u97F3\uFF08\u5149\u6807\u524D\u9762\u662F\u4F11\u6B62\u6216\u8005\u8FD8\u6CA1\u6709\u97F3\uFF09\"); return; }\n    if (c.k === \"inhale\" && nx === prev) { g.info(\"\u51FA\u58F0\u7684\u6362\u6C14\u6302\u5728\u4E00\u4E2A\u97F3\u540E\u9762\uFF08\u5149\u6807\u524D\u9762\u662F\u4F11\u6B62\u6216\u8005\u8FD8\u6CA1\u6709\u97F3\uFF09\"); return; }\n    if (c.k === \"swell\" && nx === prev) { g.info(\"\u97F3\u5185\u7684\u8D77\u4F0F\u8981\u6302\u5728\u4E00\u4E2A\u97F3\u4E0A\uFF08\u5149\u6807\u524D\u9762\u662F\u4F11\u6B62\u6216\u8005\u8FD8\u6CA1\u6709\u97F3\uFF09\"); return; }\n    if (c.k === \"wedge\" && nx === prev) { g.info(`${c.w === \"cresc\" ? \"\u6E10\u5F3A\" : \"\u6E10\u5F31\"}\u4ECE\u4E00\u4E2A\u97F3\u5230\u4E0B\u4E00\u4E2A\u97F3\uFF08\u5149\u6807\u524D\u9762\u662F\u4F11\u6B62\u6216\u8005\u8FD8\u6CA1\u6709\u97F3\uFF09`); return; }\n    g.update(nx); if (c.k === \"rest\" || c.k === \"extend\") g.afterWrite();\n    if (c.k === \"backspace\" || c.k === \"delete\") {   // \u5220\u97F3\u987A\u624B\u6E6E\u706D\u4E86\u4E0D\u518D\u7BA1\u4EFB\u4F55\u97F3\u7684\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\uFF1A\u8BF4\u4E00\u58F0\uFF08\u4E0D\u9759\u9ED8\uFF1B\u64A4\u9500\u80FD\u56DE\u6765\uFF09\n      const marks = (s: EditorState) => tr(s).filter((t) => t.kind === \"dyn\" || t.kind === \"hairpin\").length, gone = marks(prev) - marks(st()) - (prev.sel ? tr(prev).slice(prev.sel.from, prev.sel.to).filter((t) => t.kind === \"dyn\" || t.kind === \"hairpin\").length : 0);\n      if (gone > 0) g.info(`\u987A\u624B\u53BB\u6389\u4E86 ${gone} \u4E2A\u4E0D\u518D\u7BA1\u4EFB\u4F55\u97F3\u7684\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\uFF08\u64A4\u9500\u80FD\u627E\u56DE\u6765\uFF09`);\n    }\n    if (c.k === \"art\") g.discloseArt(prev, c.a === \"swellDown\" ? \"swellFade\" : c.a === \"swellUp\" || c.a === \"swellBoth\" ? \"swellGrow\" : c.a);   // \u97F3\u5185\u8D77\u4F0F\u5728\u6F14\u594F\u6CD5\u91CC\uFF08v0.9.44\uFF09\uFF0C\u300C\u505A\u4E0D\u5230\u300D\u7684\u8BF4\u6CD5\u7167\u65E7\u6309 swellGrow / swellFade\n    if (c.k === \"slur\") g.discloseArt(prev, \"slur\");\n    if (c.k === \"inhale\") g.discloseArt(prev, \"inhale\");\n    if (c.k === \"swell\") g.discloseArt(prev, c.w === \">\" ? \"swellFade\" : \"swellGrow\");\n    if (c.k === \"dyn\" || (c.k === \"art\" && c.a === \"fp\")) g.discloseDynOverride(prev);\n  }\n\n  const pad = new Pad(padEl, {\n    view: () => { const s = st(); return { unit: s.input.unit, tuplet: s.input.tuplet, acc: s.input.acc, accMode: s.input.accMode, one: singleSel(s) >= 0, hasSel: !!s.sel }; },\n    music,\n    isImpro: padImpro,\n    onImpro: () => g.toggleImpro(),\n    onKbSwitch: () => g.kbSwitch(),   // \u5C0F\u952E\u76D8\u9876\u4E0A\u300C\u7B26 / \u97F3\u300D\uFF1A\u53EA\u6362\u952E\u76D8\uFF08v0.10.37\uFF1B\u6A21\u5F0F\u6761\u4E0A\u53EA\u5269\u97F3 / \u8BCD / \u542C\uFF09\n    // \u97F3\u952E\u6309\u4E0B\uFF1A\u7B2C k \u7EA7\u662F\u4EC0\u4E48\u97F3\u95EE music\uFF1B\u5199\uFF08\u4E0D\u5728\u300C\u5F39\u300D\u65F6\uFF1B\u5BBF\u4E3B\u4E0D\u6536 = false\uFF0Cpad \u4E0D\u4EAE\uFF09+ \u54CD\n    onNoteDown: (k, id) => noteDown(music.pitchAt(k), id),\n    onNoteUp: (id) => noteUp(id),\n    onStack: (down) => g.stackKey(down),\n    canStack: () => g.canStack(),\n    onAlter: (id, alt) => {\n      if (g.finderOpen()) return;   // \u4E34\u65F6\u79BB\u8C03\uFF1A\u53EA\u7BA1\u8FD9\u4E00\u4E2A\u97F3\uFF08\u6ED1\u56DE\u4E2D\u95F4 = \u8FD8\u539F\uFF09\uFF1B\u91CD\u65B0\u5531\u4E00\u4E0B\u8BA9\u4EBA\u542C\u89C1\n      const n = padNotes.get(id); if (!n) return;\n      const np = alt ? alterBy(n.base, alt) : n.base;\n      if (n.index >= 0) g.update(setNote(st(), n.index, { pitch: np }));\n      g.sound.down(np, id);\n    },\n    onKey: (id, mods) => padKey(id, mods),\n    onUnit: (u) => { g.half.knobTurned(); g.update(setUnit(st(), u)); },   // \u62E8\u4E86\u65CB\u94AE = \u7167\u62E8\u7684\uFF0C\u53D6\u6D88\u300C\u51D1\u6EE1\u4E00\u4EFD\u300D\uFF08\u4E0D\u632A\u56DE\u4E00\u6863\uFF1A\u65CB\u94AE\u8BF4\u4E86\u7B97\uFF09\n    onTuplet: (n) => g.update(setTuplet(st(), n)),\n    onPick: (knob, i) => g.update(knob === \"key\" ? setInputKey(st(), music.fifthsAt(i)) : setInputScale(st(), music.scaleIdAt(i))),\n    autoBars: () => g.autoBars.get(),\n    staves: () => g.staves(),\n    // \u7B26\u53F7\u683C\u7684\u72B6\u6001\uFF1A\u8FD9\u4E2A\u683C\u5B50\u5199\u7684\u8BB0\u53F7\u53F0\u4E0A\u8FD9\u4F4D\u4E0D\u8BA4 = \u753B\u7070\uFF08\u7167\u6837\u80FD\u5199\uFF09\uFF1B\u529B\u5EA6 = \u5149\u6807\u5904\u6B63\u751F\u6548\u7684\u90A3\u4E2A\u4EAE\u7740\uFF08\u72B6\u6001\u673A\uFF09\n    keyState: (id) => {\n      const s = st(), mk = markOfKey(id), off = !!mk && g.ignoredHere().includes(mk);\n      const on = id.startsWith(\"dyn:\") && id.slice(4) === dynMarkAt(tr(s), s.sel ? s.sel.from : s.caret);\n      return off || on ? { off, on } : undefined;\n    },\n    hintRange: () => g.hintRange(),\n    onAutoBars: (on) => { g.autoBars.set(on); pad.render(); },\n    onHide: () => g.showPad(false),\n    onHalf: (down) => { if (g.finderOpen()) return; g.half.key(down); },\n    onAccShift: (phase, acc) => g.accKey(phase, acc),   // \u627E\u4EBA\u89C6\u56FE\u91CC\u4E5F\u8981\u80FD\u7528\uFF1A\u5347\u964D\u53EA\u6539\u5F39\u51FA\u6765\u7684\u97F3\u9AD8\uFF0C\u4E0D\u78B0\u8C31\n  });\n\n  return {\n    pad, music, monoAccept,\n    release: (id) => { monoHeld.delete(id); },\n    reset: () => { settleChords(\"lost\"); chordRoots.clear(); monoHeld.clear(); },\n    noteDown: (p, id) => noteDown(p, id, true),\n    noteUp,\n  };\n}\n", "// lab-score.ts \u2014\u2014 \u4E00\u4E32 token \u2192 Lab \u5531\u6CD5\u5403\u7684\u4E50\u8C31\u7ED3\u6784\uFF08Lab/20261005 \u6708\u8BFB\u7B2C\u4E00\u9996/score.mjs \u7684\u683C\u5F0F\uFF09\u3002created 2026-10-06 by Claude Opus 5.5\n// \u683C\u5F0F\uFF08sing.mjs \u5934\u6CE8\u91CA\uFF09\uFF1A\u6BCF\u4E2A\u5531\u51FA\u6765\u7684\u97F3\u8282\u4E00\u6761 { kana, notes: [[midi, \u516B\u5206\u97F3\u7B26\u6570]\u2026], rest?: \u516B\u5206\u97F3\u7B26\u6570 }\uFF0C\n//   \u4E00\u4E2A\u97F3\u8282\u62D6\u8FC7\u51E0\u4E2A\u97F3 = notes \u91CC\u51E0\u9879\uFF08\u3046\u3055\u304E \u7684 \u306F\uFF09\uFF1B\u53E6\u6709\u4E00\u6574\u53E5 TEXT \u5582\u7ED9 piper \u6CE8\u97F3\uFF1A\u4F11\u6B62\u5904\u300C\u3001\u300D\u3001\u53E5\u672B\u300C\u3002\u300D\uFF0C\n//   sing.mjs \u4F1A\u53BB\u6389\u6807\u70B9\u518D\u6CE8\u97F3\uFF0C\u5E76\u8981\u6C42 TEXT \u91CC\u7684\u97F3\u8282\u6570 == \u6761\u76EE\u6570\u3002\n// \u6620\u5C04\uFF1A\u4E00\u4E2A\u97F3\u4E0A\u51E0\u4E2A\u97F3\u8282\uFF08\u300C+\u300D\u8FDE\u7740\u7684\uFF0C\u6570\u636E\u91CC\u300C\u203F\u300D\uFF09= \u5E73\u5206\u8FD9\u4E2A\u97F3\u3001\u4E00\u4E2A\u97F3\u8282\u4E00\u6761\uFF1B\u6B4C\u8BCD\u300C\u30FC\u300D= \u62D6\u8154\u3001tie \u97F3 \u2192 \u5E76\u8FDB\u524D\u4E00\u4E2A\u97F3\u8282\u7684 notes\uFF1B\u4F11\u6B62 \u2192 \u52A0\u5230\u524D\u4E00\u4E2A\u97F3\u8282\u7684 rest\uFF1B\u5C0F\u8282\u7EBF\u3001\u8C03\u53F7\u3001\u62CD\u53F7\u4E0D\u8FDB\uFF08\u53EA\u662F\u8BB0\u8C31\uFF09\uFF1B\n//   \u901F\u5EA6\uFF1ALab \u683C\u5F0F\u53EA\u6709\u4E00\u4E2A\u901F\u5EA6 \u2192 TEMPO_QUARTER = \u7B2C\u4E00\u4E2A\u97F3\u5904\u7684\u901F\u5EA6\uFF0C\u540E\u9762\u6362\u4E86\u901F\u5EA6\u7684\u97F3\u6309\u6BD4\u4F8B\u6362\u7B97\u6210\u300C\u90A3\u4E2A\u901F\u5EA6\u4E0B\u7684\u516B\u5206\u97F3\u7B26\u6570\u300D\uFF1B\n//   \u7A7A\u97F3\u9AD8 \u2192 \u6709\u6548\u97F3\u9AD8\uFF08\u7EE7\u627F\u4E0A\u4E00\u4E2A\uFF09\uFF1B\u7A7A\u6B4C\u8BCD \u2192 \u8FD9\u9996\u6B4C\u7684\u300C\u54FC\u7684\u5B57\u300D\uFF08\u9ED8\u8BA4 n =\u300C\u3093\u300D/\u300C\u55EF\u300D\uFF0Cuser 2026-10-07\u300C\u9ED8\u8BA4\u55EF\u300D\uFF1B\u539F\u6765\u9ED8\u8BA4 la\uFF0C\u540C SynthV\uFF1B\n//   user 2026-10-06\u300C\u6211\u65E5\u8BED\u80FD\u529B\u8FD8\u6CA1\u8FDBprealpha\u54E6\uFF0C\u6CA1\u6B4C\u8BCD\u8F93\u5165\u7684\u8BDD\u6708\u8BFB\u5FF5\u4EC0\u4E48\u300D\u300C\u54FC\u6B4C\u4F1A\u7528\u4EC0\u4E48\u300D\u2192 \u5F00\u5173\u300C\u540C\u610F\u300D\uFF09\u3002\n// \u5F00\u5934\u7684\u4F11\u6B62 Lab \u683C\u5F0F\u8868\u8FBE\u4E0D\u4E86\uFF08\u5B83\u6709\u56FA\u5B9A\u7684 leadIn\uFF09\uFF0C\u7B2C\u4E00\u7248\u76F4\u63A5\u4E22\u6389\u3002\n\nimport { midiOf } from \"./pitch.ts\";\nimport { type Token, type Hum, type TempoMap, TPQ, effectivePitch, isTimed, timeline, artOf } from \"./song.ts\";\nimport { MELISMA_MARK, ELISION, isSmallKana, isSokuon } from \"./lyrics.ts\";\nimport { SING_MARKS, type SingMark } from \"../format/performance.ts\";\n\nexport interface LabEntry { kana: string; notes: [number, number][]; rest?: number; hum?: boolean; hyph?: boolean; before?: \"^\" | \"v\" | \"O\"; whisper?: boolean; inhale?: boolean }   // whisper = \u8FD9\u4E2A\u5B57\u4E0D\u5531\u97F3\u9AD8\uFF08\u6C14\u58F0\uFF0C\u00D7 \u7B26\u5934\uFF09\uFF1Binhale = \u8FD9\u4E2A\u5B57\u524D\u9762\u7684\u6362\u6C14\u542C\u5F97\u89C1\uFF082026-10-10 Opus 5.5\uFF09   // before = \u8FD9\u4E2A\u5B57\u524D\u9762\u7684\u8BB0\u53F7\uFF08\u5531\u6CD5\u6838\u5FC3\uFF1Av = \u6362\u4E00\u53E3\u6C14\uFF0C\u4ECE\u524D\u4E00\u4E2A\u97F3\u672B\u5C3E\u5077\u65F6\u95F4\uFF09   // hyph = \u82F1\u6587\uFF1A\u8FD9\u4E2A\u8BCD\u6CA1\u5B8C\uFF08\u4E0B\u4E00\u6761\u63A5\u7740\u62FC\uFF09   // hum = \u6CA1\u5199\u6B4C\u8BCD\u3001\u5531\u300C\u54FC\u7684\u5B57\u300D\uFF08\u6838\u5FC3\u7684 humNasal / humConsMin \u53EA\u7BA1\u8FD9\u4E9B\uFF09\nexport type SingLang = \"ja\" | \"zh\" | \"en\";\nexport interface LabScore { SCORE: LabEntry[]; TEXT: string; TEMPO_QUARTER: number; LANG: SingLang }\n\n/** \u300C\u54FC\u7684\u5B57\u300D\u56DB\u6863\u5728\u4E24\u79CD\u8BED\u8A00\u91CC\u7684\u5B57\uFF1Ala \u820C\u5C16\u8D77\u97F3\u3001\u8282\u594F\u6700\u6E05\u695A\uFF1Bn \u95ED\u5634\u54FC\uFF08\u540C\u9AD8\u7684\u51E0\u4E2A\u97F3\u4F1A\u8FDE\u6210\u4E00\u4E2A\uFF09\uFF1Bu = Ooh\uFF1Ba = Ahh\uFF08GM \u4EBA\u58F0\u515C\u5E95\u7684\u4E24\u4E2A\u5143\u97F3\uFF09\u3002 */\n// \u82F1\u6587\u6B4C\u91CC\uFF1Ala / hum / ooh / oh / ah\uFF08\u300Cmm\u300D\u300Chmm\u300D\u8BCD\u5178\u91CC\u6CA1\u6709\u5143\u97F3\u5531\u4E0D\u51FA\u6765\uFF0C\u55EF \u53EA\u597D\u7528 hum\uFF09\nexport const HUM_SYLLABLE: Record<Hum, Record<SingLang, string>> = { la: { ja: \"\u3089\", zh: \"\u5566\", en: \"la\" }, n: { ja: \"\u3093\", zh: \"\u55EF\", en: \"hum\" }, u: { ja: \"\u3046\", zh: \"\u545C\", en: \"ooh\" }, o: { ja: \"\u304A\", zh: \"\u54E6\", en: \"oh\" }, a: { ja: \"\u3042\", zh: \"\u554A\", en: \"ah\" } };\n\n/** tokens = \u4E00\u4E2A\u58F0\u90E8\uFF08\u538B\u5E73\u540E\u7684\u4E00\u4E32\uFF09\uFF1BtempoMap = \u7B2C\u4E00\u4E2A\u58F0\u90E8\u7684\u901F\u5EA6\u8868\uFF08\u8FD9\u4E2A\u58F0\u90E8\u4E0D\u662F\u7B2C\u4E00\u4E2A\u65F6\u7ED9\uFF0C\u81EA\u5DF1\u4E32\u91CC\u7684\u901F\u5EA6\u8BB0\u53F7\u4E0D\u7B97\u6570\uFF09\u3002 */\n/** range = \u53EA\u51FA\u8FD9\u4E00\u6BB5\u7684 token\uFF08\u4E0B\u6807 [from, to)\uFF1B\u6708\u8BFB\u5206\u6BB5\u5531\u7528\uFF0C\u89C1 singChunks\uFF09\u2014\u2014\u901F\u5EA6\u3001\u6CA1\u5199\u97F3\u9AD8\u7684\u97F3\u7167\u6837\u6309\u6574\u4E32\u7684\u4E0A\u4E0B\u6587\u7B97\u3002\u4E0D\u7ED9 = \u6574\u4E32\u3002 */\n/** tokenEntry = \u987A\u624B\u8BB0\u4E0B\u300Ctoken \u4E0B\u6807 \u2192 \u5B83\u5531\u6210\u7B2C\u51E0\u6761\u300D\uFF08\u62D6\u8154 / \u8FDE\u97F3\u7EBF\u5E76\u8FDB\u524D\u4E00\u6761\u7684\u4E5F\u8BB0\u524D\u4E00\u6761\uFF1B\u6309\u952E\u8BD5\u542C\u7528\uFF09\u3002 */\nexport function toLabScore(tokens: Token[], hum: Hum, lang: SingLang = \"ja\", tempoMap?: TempoMap, sing: Record<string, SingMark | null> = SING_MARKS, range?: readonly [number, number], tokenEntry?: Map<number, number>): LabScore {\n  const inRange = (i: number) => !range || (i >= range[0] && i < range[1]);\n  const eighth = TPQ / 2, tl = timeline(tokens, tempoMap), base = tl.find((x) => inRange(x.index))?.bpm ?? 90;\n  const bpmOf = new Map(tl.map((x) => [x.index, x.bpm]));\n  const dwOf = new Map(tl.filter((x) => x.dw0 !== undefined).map((x) => [x.index, x.dw1! - x.dw0!]));   // \u6447\u6446\uFF08v0.9.36\uFF09\uFF1A\u8FD9\u4E2A\u97F3\u88AB\u626D\u957F / \u626D\u77ED\u4E86\u591A\u5C11 tick\uFF08\u548C\u4E50\u5668\u540C\u4E00\u4E2A\u626D\u66F2\uFF1B\u6CA1\u6447 = \u6CA1\u6709\uFF09\n  const out: LabEntry[] = [];\n  // \u8BB0\u53F7 \u2192 \u5531\u6CD5\u6838\u5FC3\u8BA4\u7684\u5B57\u524D\u8BB0\u53F7\uFF08v = \u6362\u6C14 / O = \u5927\u53E3\u6362\u6C14 / ^ = \u987F\u4E00\u4E0B\u4E0D\u6362\u6C14\uFF09\uFF1A\u600E\u4E48\u5BF9\u5E94\u662F\u8FD9\u4F4D\u6F14\u594F\u8005\u81EA\u5DF1\u7684\u914D\u7F6E\uFF08\u5019\u9009 sing\uFF0Cby value\uFF1B\u6CA1\u5199 = SING_MARKS\uFF09\uFF0C\n  //   \u4E0D\u5199\u6B7B\u5728\u8FD9\u91CC\uFF082026-10-08 user\u300C\u8BB0\u53F7\u600E\u4E48\u89E3\u8BFB\u5E94\u8BE5\u4E50\u5668\u91CC\u9762\u6709explicit\u7684\u914D\u7F6E\uFF0C\u800C\u4E0D\u662F\u4EE3\u7801\u5199\u6B7B\u300D\uFF1B\u300C\u8DF3\u97F3\u5C31\u662F\u987F\u4E00\u4E0B\u300D\u300C\u55EF\u91CD\u97F3\u4E5F\u987F\u300D\u300C\u6708\u8BFB\u5728\u90A3\u513F\u6362\u6C14\u300D\uFF09\u3002\n  //   at = this\uFF1A\u8FD9\u4E2A\u5B57\u81EA\u5DF1\u524D\u9762\uFF1Bat = next\uFF1A\u4E0B\u4E00\u4E2A\u5B57\u524D\u9762\u3002\u540C\u4E00\u4E2A\u5B57\u524D\u9762\u51E0\u4E2A\u8BB0\u53F7\u649E\u4E86\uFF1A\u6362\u6C14\uFF08v / O \u672C\u6765\u5C31\u5E26\u7A7A\u5F53\uFF09\u4F18\u5148\u4E8E ^\u3002\n  //   \u62D6\u7740\u7684\u540C\u4E00\u4E2A\u5B57\uFF08\u8FDE\u97F3\u7EBF / \u62D6\u8154\uFF09\u524D\u9762\u653E\u4E0D\u4E86\uFF1B\u8DF3\u5230\u300C\u4E0B\u4E00\u4E2A\u5B57\u300D\u7684\u90A3\u79CD\uFF0C\u540E\u9762\u7D27\u8DDF\u7740\u7684\u8FD8\u662F\u540C\u4E00\u4E2A\u5B57 = \u653E\u4E0D\u4E86\uFF08\u987F\u4E0D\u5F00\uFF09\u3002\n  const pick = (a: \"^\" | \"v\" | \"O\" | null, b: \"^\" | \"v\" | \"O\") => (!a ? b : a === \"^\" ? b : a);\n  let nextMark: \"^\" | \"v\" | \"O\" | null = null, thisMark: \"^\" | \"v\" | \"O\" | null = null, nextInhale = false;\n  const push = (e: LabEntry) => { const m = thisMark && nextMark ? pick(thisMark, nextMark) : thisMark ?? nextMark; if (m) e.before = m; if (nextInhale && m && m !== \"^\") e.inhale = true; nextMark = thisMark = null; nextInhale = false; out.push(e); };\n  // \u51FA\u58F0\u7684\u6362\u6C14\uFF082026-10-10\uFF09\uFF1A\u547C\u5438\u8BB0\u53F7\u5E26 inhale = \u4E0B\u4E00\u4E2A\u5B57\u524D\u9762\u7684\u6362\u6C14\u542C\u5F97\u89C1\uFF08\u6DF1\u5438 = \u5927\u53E3 O\uFF09\u3002\u53EA\u8BA4\u8DDF\u7740\u547C\u5438\u7684\u3002\n  const takeInhale = (t: Token) => { if (t.kind !== \"note\" || !t.inhale || !artOf(t).includes(\"breath\")) return; nextMark = t.inhale === \"big\" ? \"O\" : pick(nextMark, \"v\"); nextInhale = true; };\n  if (range) {   // \u5206\u6BB5\u5531\uFF1A\u8FD9\u4E00\u6BB5\u7B2C\u4E00\u4E2A\u5B57\u524D\u9762\u90A3\u53E3\u6C14\u5199\u5728\u4E0A\u4E00\u6BB5\u6700\u540E\u4E00\u4E2A\u97F3\u4E0A\uFF08\u6BB5\u754C\u591A\u534A\u5C31\u5207\u5728\u547C\u5438 + \u4F11\u6B62\u5904\uFF09\u2014\u2014\u53EA\u5E26\u51FA\u58F0\u7684\u6362\u6C14\uFF08\u522B\u7684\u5B57\u524D\u8BB0\u53F7\u5728\u7B2C\u4E00\u4E2A\u5B57\u4E0A\u672C\u6765\u5C31\u4E0D\u8D77\u4F5C\u7528\uFF0C\u5E26\u4E0A\u53EA\u4F1A\u767D\u767D\u6362\u6389\u65E7\u7684\u5757\u952E\uFF09\n    for (let j = range[0] - 1; j >= 0; j--) { const u = tokens[j]; if (u.kind !== \"note\") continue; takeInhale(u); break; }   // \u9694\u7740\u4F11\u6B62\u5F80\u56DE\u627E\u4E0A\u4E00\u4E2A\u97F3\uFF08\u6574\u9996\u6362\u7B97\u65F6\u8BB0\u53F7\u672C\u6765\u5C31\u9694\u7740\u4F11\u6B62\u5E26\u5230\u4E0B\u4E00\u4E2A\u5B57\uFF09\n    if (!nextInhale) nextMark = null;\n  }\n  const nextTimed = (i: number) => { for (let j = i + 1; j < tokens.length; j++) { const u = tokens[j]; if (isTimed(u)) return u; } return null; };\n  tokens.forEach((t, i) => {\n    if (!isTimed(t) || !inRange(i)) return;\n    const arts = t.kind === \"note\" ? artOf(t) : [], held = (u: Token | null) => u?.kind === \"note\" && (u.tie || u.lyric === MELISMA_MARK);\n    thisMark = null;\n    if (t.kind === \"note\" && !held(t)) for (const a of arts) { const s = sing[a]; if (s && s.at === \"this\") thisMark = pick(thisMark, s.mark); }\n    one(t, i); thisMark = null;\n    if (t.kind === \"note\" && !held(nextTimed(i))) { for (const a of arts) { const s = sing[a]; if (s && s.at === \"next\") nextMark = pick(nextMark, s.mark); } takeInhale(t); }\n  });\n  function one(t: Token & { dur: number }, i: number): void {\n    const n0 = out.length; one0(t, i);\n    if (tokenEntry && t.kind === \"note\" && out.length) tokenEntry.set(i, out.length > n0 ? n0 : out.length - 1);   // \u65B0\u51FA\u4E86\u6761\u76EE = \u7B2C\u4E00\u6761\uFF1B\u5E76\u8FDB\u524D\u4E00\u6761\u7684 = \u524D\u4E00\u6761\n  }\n  function one0(t: Token & { dur: number }, i: number): void {\n    const len = ((t.dur + (dwOf.get(i) ?? 0)) / eighth) * (base / bpmOf.get(i)!);\n    if (t.kind === \"rest\") { const last = out[out.length - 1]; if (last) last.rest = (last.rest ?? 0) + len; return; }\n    if (t.kind !== \"note\") return;\n    const midi = midiOf(effectivePitch(tokens, i));\n    const last = out[out.length - 1];\n    // \u62D6\u8154\uFF08\u30FC / ~\uFF09\u548C\u8FDE\u97F3\u7EBF\u8FDE\u7740\u7684\u97F3\uFF08tie\uFF09\u90FD\u5E76\u8FDB\u4E0A\u4E00\u4E2A\u97F3\u8282\uFF1A\u540C\u4E00\u4E2A\u5B57\u5531\u8FC7\u51E0\u4E2A\u97F3 / \u540C\u4E00\u4E2A\u97F3\u8FDE\u4E0B\u53BB\n    if ((t.lyric === MELISMA_MARK || t.tie) && last && !last.rest) { last.notes.push([midi, len]); return; }\n    const lyric = t.lyric && t.lyric !== MELISMA_MARK ? t.lyric : null;\n    const wh = artOf(t).includes(\"whisper\") ? { whisper: true } : {};   // \u6C14\u58F0\uFF1A\u8FD9\u4E2A\u97F3\u4E0A\u5531\u7684\u6BCF\u4E2A\u5B57\u90FD\u4E0D\u5531\u97F3\u9AD8\n    if (!lyric) { push({ kana: HUM_SYLLABLE[hum ?? \"n\"][lang], notes: [[midi, len]], hum: true, ...wh }); return; }\n    // \u5C0F\u5B57\u81EA\u5DF1\u5360\u4E86\u4E00\u4E2A\u97F3\uFF08\u3063 / \u3083\u2026\uFF1B\u8F93\u5165\u6CD5\u5206\u4E24\u6B21\u4E0A\u5C4F\u3001\u6216\u8005\u4EBA\u5C31\u8FD9\u4E48\u5199\uFF09\uFF1A\u5531\u6CD5\u6838\u5FC3\u6309\u8BFB\u97F3\u6570\u97F3\u8282\uFF0C\u3063 \u4E0D\u662F\u5531\u51FA\u6765\u7684\u97F3\u8282\u3001\u3083 \u4E0D\u5355\u72EC\u6210\u62CD\u2014\u2014\n    //   \u4E0D\u5E76 = \u300Cscore \u6BD4 text \u591A\u51E0\u4E2A\u97F3\u8282\u300D\u6574\u6BB5\u4E0D\u51FA\u58F0\uFF082026-10-08 user \u62A5\u300C90 sung syllables in the text, 92 in the score\u300D\uFF1A\u3075\u3063\u3066 / \u3067\u3063\u304B\u3044 \u7684 \u3063 \u5404\u5360\u4E86\u4E00\u4E2A\u97F3\uFF09\u3002\n    //   \u3063 = \u524D\u4E00\u4E2A\u97F3\u8282\u540E\u9762\u505C\u8FD9\u4E48\u957F\uFF08\u4E00\u4E0B\u987F\u3001\u4E0D\u6362\u6C14\uFF1A\u4E0B\u4E00\u4E2A\u5B57\u524D\u9762\u300C^\u300D\uFF09\uFF1B\u3083\u2026 = \u524D\u4E00\u4E2A\u97F3\u8282\u62D6\u8FC7\u8FD9\u4E2A\u97F3\u3002\u524D\u9762\u6CA1\u6709\u97F3\u8282\uFF08\u5F00\u5934\uFF09= \u5F53\u4F11\u6B62\u3002\n    if (isSmallKana(lyric)) {\n      if (!last) return;\n      if (isSokuon(lyric)) { last.kana += lyric; last.rest = (last.rest ?? 0) + len; nextMark = nextMark === \"v\" || nextMark === \"O\" ? nextMark : \"^\"; return; }\n      if (!last.rest) { last.kana += lyric; last.notes.push([midi, len]); return; }\n    }\n    // \u4E00\u4E2A\u97F3\u4E0A\u51E0\u4E2A\u97F3\u8282\uFF08\u300C+\u300D\u8FDE\u7740\u7684\uFF0C\u5982 \u3060\u203F\u3093\uFF09\uFF1A\u8FD9\u4E2A\u97F3\u5E73\u5206\u7ED9\u5B83\u4EEC\uFF0C\u4E00\u4E2A\u97F3\u8282\u4E00\u6761\uFF08user \u70B9\u5934\u300C\u5531\u7684\u65F6\u5019\u628A\u8FD9\u4E2A\u97F3\u7684\u65F6\u503C\u5207\u6210\u51E0\u6BB5\uFF0C\u5148\u6309\u5E73\u5747\u5206\u300D\uFF09\uFF1B\u8FDE\u7740\u7684\u5C0F\u5B57\u5E76\u8FDB\u524D\u4E00\u4E2A\uFF08\u3075\u203F\u3063 = \u3075\u3063\uFF09\n    const parts = lyric.split(ELISION).filter(Boolean).reduce<string[]>((a, k) => (a.length && isSmallKana(k) ? [...a.slice(0, -1), a[a.length - 1] + k] : [...a, k]), []);\n    parts.forEach((kana, k) => push({ kana, notes: [[midi, len / parts.length]], ...(lang === \"en\" && t.hyph && k === parts.length - 1 ? { hyph: true } : {}), ...wh }));\n  }\n  const TEXT = lang === \"en\"   // \u82F1\u6587\uFF1A\u97F3\u8282\u6309 hyph \u62FC\u56DE\u5355\u8BCD\u3001\u7A7A\u683C\u9694\u5F00\uFF08\u6838\u5FC3\u81EA\u5DF1\u4ECE SCORE \u62FC\u8BCD\uFF0CTEXT \u53EA\u7ED9\u4EBA\u770B / \u65E5\u5FD7\uFF09\n    ? out.map((e) => e.kana + (e.hyph ? \"\" : \" \")).join(\"\").trim()\n    : out.map((e, k) => e.kana + (e.rest ? \"\u3001\" : k === out.length - 1 ? \"\u3002\" : \"\")).join(\"\");\n  return { SCORE: out, TEXT, TEMPO_QUARTER: base, LANG: lang };\n}\n\n/** \u6708\u8BFB\u5206\u6BB5\u5531\uFF082026-10-08 \u6DF1\u591C Opus 5.5\uFF1Buser\u300C\u5BF9\u6211\u4E5F\u89C9\u5F97\u5206\u5F00\u5531\u590D\u7528\u300D\u300C\u6708\u8BFB\u81F3\u5C11\u62C6\u6210\u53E5\u7EA7\u522B\u300D\u300C\u5F00\u5173\u662F\u6B4C\u624B\u7684\u5C5E\u6027\uFF0C\u53EF\u4EE5\u6709\u4E0D\u540C\u7684\u7C92\u5EA6\u300D\uFF09\uFF1A\n *  \u4E00\u53E3\u6C14\u5531\u5B8C\u4E00\u6574\u9996 = \u5531\u6CD5\u6838\u5FC3\u6574\u6BB5\u7B97\uFF08piper \u4E00\u6B21\u5FF5\u5B8C\u3001WORLD \u6574\u6BB5\u5206\u6790 + \u91CD\u5531\uFF09\uFF0C\u957F\u6B4C\u628A iPad \u7684\u5185\u5B58\u6491\u7206\uFF08\u56E2\u5B50\u5927\u5BB6\u65CF 195.6 s \u5FC5\u5D29\uFF09\uFF1B\n *  \u5206\u6BB5 = \u4E00\u6BB5\u5531\u5B8C\u5C31\u653E\u6389\uFF08\u5CF0\u503C = \u6700\u957F\u90A3\u6BB5\uFF09\uFF0C\u91CD\u590D\u7684\u6BB5 / \u6CA1\u6539\u7684\u53E5\u5B50\u6309\u5185\u5BB9\u590D\u7528\u3002whole = \u4E00\u6574\u9996\uFF1Bsheet = \u6BCF\u5F20\u7EB8\uFF1Bphrase = \u6BCF\u5F20\u7EB8\u91CC\u518D\u5728\u591F\u957F\u7684\u4F11\u6B62\u5904\u5207\u3002\n *  \u8FD4\u56DE token \u4E0B\u6807\u8303\u56F4 [from, to)\uFF1B\u6CA1\u6709\u97F3\u7684\u6BB5\u4E0D\u8981\u3002 */\nexport type SingChunkMode = \"phrase\" | \"sheet\" | \"whole\";\nexport const PHRASE_REST_SEC = 0.25;   // \u8FD9\u4E48\u957F\u4EE5\u4E0A\u7684\u4F11\u6B62\uFF08\u8FDE\u7740\u51E0\u4E2A\u4F11\u6B62\u52A0\u8D77\u6765\uFF09= \u4E00\u53E5\u7684\u8FB9\u754C\uFF1A\u90A3\u91CC\u672C\u6765\u5C31\u6CA1\u58F0\u97F3\uFF0C\u5207\u5F00\u542C\u4E0D\u51FA\u63A5\u7F1D\nexport function singChunks(tokens: Token[], tempoMap: TempoMap | undefined, bounds: readonly number[], mode: SingChunkMode): [number, number][] {\n  if (mode === \"whole\") return tokens.some((t) => t.kind === \"note\") ? [[0, tokens.length]] : [];\n  const cuts = new Set(bounds.filter((b) => b > 0 && b < tokens.length));\n  if (mode === \"phrase\") {\n    let rest = 0;\n    for (const x of timeline(tokens, tempoMap)) {\n      if (x.tok.kind === \"rest\") { rest += x.t1 - x.t0; continue; }\n      if (rest >= PHRASE_REST_SEC) cuts.add(x.index);\n      rest = 0;\n    }\n  }\n  const starts = [0, ...[...cuts].sort((a, b) => a - b)];\n  return starts.map((a, k) => [a, starts[k + 1] ?? tokens.length] as [number, number]).filter(([a, b]) => tokens.slice(a, b).some((t) => t.kind === \"note\"));\n}\n", "// audio.ts \u2014\u2014 \u5168 app \u5171\u7528\u4E00\u4E2A AudioContext\uFF08iPad \u4E0A\u8981\u5728\u7528\u6237\u624B\u52BF\u91CC resume \u4E00\u6B21\uFF09\u3002created 2026-10-07 by Claude Opus 5.5\nlet ctx: AudioContext | null = null;\nexport function audioCtx(): AudioContext {\n  if (!ctx) ctx = new AudioContext();\n  if (ctx.state === \"suspended\" || (ctx.state as string) === \"interrupted\") void ctx.resume();   // iPad \u5207\u540E\u53F0\u56DE\u6765 = interrupted\uFF08Safari \u7684\u975E\u6807\u51C6\u72B6\u6001\uFF09\n  return ctx;\n}\n\n// \u51C6\u5907\u671F\u95F4\u8BA9\u58F0\u97F3\u4E00\u76F4\u9192\u7740\uFF082026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u6708\u8BFB\u7B2C\u4E00\u6B21\u6E32\u67D3\u597D\u4E86\u6CA1\u6709\u58F0\u97F3\uFF0C\u9700\u8981\u91CD\u65B0\u70B9\u4E00\u6B21play\u300D\uFF09\uFF1A\n//   \u7B2C\u4E00\u6B21\u5531\u8981\u4E0B\u6A21\u578B\u3001\u8D77\u5F15\u64CE\uFF0C\u51E0\u5341\u79D2\uFF1B\u51C6\u5907\u5B8C\u518D\u5F00\u64AD\u65F6\u65E9\u5DF2\u4E0D\u5728\u70B9\u6309\u7684\u624B\u52BF\u91CC\uFF0CiPad \u53EF\u80FD\u5DF2\u7ECF\u628A\u58F0\u97F3\u6536\u8D77\u6765\u4E86 = \u90A3\u4E00\u4E0B\u6CA1\u58F0\u3001\u8981\u518D\u70B9\u4E00\u6B21\u3002\n//   \u505A\u6CD5\uFF1A\u5728\u624B\u52BF\u91CC\u8D77\u4E00\u4E2A\u8F93\u51FA 0 \u7684\u6E90\u63A5\u5230\u626C\u58F0\u5668\uFF0C\u771F\u5F00\u64AD\uFF08\u6216\u51FA\u9519\uFF09\u65F6\u505C\u6389\u3002\u4E0D\u51FA\u58F0\uFF0C\u53EA\u662F\u4E0D\u8BA9\u58F0\u97F3\u7761\u7740\u3002\nlet keep: ConstantSourceNode | null = null;\nexport function holdAudio(): void {\n  if (keep) return;\n  const c = audioCtx(), s = c.createConstantSource();\n  s.offset.value = 0; s.connect(c.destination); s.start(); keep = s;\n}\nexport function releaseAudio(): void {\n  const s = keep; keep = null; if (!s) return;\n  try { s.stop(); } catch { /* \u5DF2\u505C */ }\n  s.disconnect();\n}\n", "// client.ts \u2014\u2014 \u4E3B\u7EBF\u7A0B\u8FD9\u8FB9\uFF1A\u628A\u4E50\u8C31\u53D1\u7ED9\u6708\u8BFB\u7684 worker\u3001\u62FF\u56DE\u6B4C\u58F0\u3002created 2026-10-06 by Claude Opus 5.5\n// worker \u7B2C\u4E00\u6B21\u7528\u5230\u624D\u521B\u5EFA\uFF08\u5BB6\u89C4\uFF1A\u91CD\u8D44\u6E90\u8981\u7B49\u7528\u6237\u6709\u610F\u56FE\u624D\u52A0\u8F7D\uFF09\u3002\n// 2026-10-09\uFF08Claude Fable 5.1\uFF0C\u5B9E\u65F6\u8BD5\u542C\u5200 1 / \u5200 2\uFF09\uFF1A\u64AD\u653E\u548C SoundFont \u7684\u79BB\u7EBF\u6E32\u67D3\u90FD\u642C\u53BB\u4E86\u5F55\u97F3\u623F\uFF08src/engine/\uFF09\u2014\u2014\u8FD9\u91CC\u53EA\u5269\u300C\u5531\u300D\uFF1B\n//   \u5531\u7684\u8BF7\u6C42\u5728\u8FD9\u8FB9\u6392\u961F\uFF08\u501F\u6717\u8BFB\u5E93 cancelPending \u7684\u505A\u6CD5\uFF1A\u6392\u591A\u4E86\u7528\u6237\u4E00\u8DF3\u5C31\u5168\u4F5C\u5E9F\uFF09\uFF0CcancelPending() \u6254\u6389\u8FD8\u6CA1\u5F00\u59CB\u7B97\u7684\u3002\n// 2026-10-10\uFF08Claude Fable 5.1\uFF0C\u5200 6 \u2462\uFF09\uFF1A**\u51E0\u6761\u5DE5\u4F5C\u9053\uFF08lane\uFF09\u5E76\u884C\u5531**\u2014\u2014\u6BCF\u6761\u9053\u4E00\u4E2A worker\uFF08\u5404\u81EA\u4E00\u4EFD\u5F15\u64CE + \u5FF5\u7F13\u5B58\uFF09\uFF1BPC \u4E24\u6761\u3001iPad \u4E00\u6761\uFF08\u4E3B\u7EBF\u7A0B\u6309\u8BBE\u5907\u5B9A setLanes\uFF09\u3002\n//   \u53E5\u5B50\u6309\u5185\u5BB9\u54C8\u5E0C\u8BA4\u4E00\u6761\u300C\u81EA\u5DF1\u7684\u9053\u300D\uFF08\u540C\u4E00\u53E5\u7684\u5FF5\u7F13\u5B58\u53EA\u5728\u90A3\u6761\u9053\u4E0A\u6709\uFF1A\u6309\u952E\u8BD5\u542C\u6C38\u8FDC\u53BB\u81EA\u5DF1\u7684\u9053\uFF0C\u6574\u53E5\u5531\u4F18\u5148\u81EA\u5DF1\u7684\u9053\u3001\u5B83\u5FD9\u5C31\u53BB\u7A7A\u7740\u7684\u90A3\u6761\uFF09\u3002\n//   \u5185\u5B58\u5403\u7D27 = \u4E3B\u7EBF\u7A0B setLanes(1)\uFF1A\u591A\u51FA\u6765\u7684\u9053\u7B97\u5B8C\u624B\u4E0A\u7684\u5C31\u5173\uFF08WASM \u5806\u53EA\u6709\u5173\u6389 worker \u624D\u8FD8\u56DE\u53BB\uFF09\u3002\nimport type { LabScore } from \"../score/lab-score.ts\";\nimport type { SingReply, SingRequest, WarmRequest, CancelRequest, CacheRequest, ReadRequest } from \"./worker.ts\";\nimport { audioCtx } from \"./audio.ts\";\nimport { diagNote } from \"../app/report-error.ts\";\n\n/** \u5185\u5B58\u4E0D\u591F\u7684\u6837\u5B50\uFF08onnxruntime-web \u8D77\u4E0D\u6765\u65F6\u62A5\u300Cno available backend found. ERR: [wasm] RangeError: Out of memory\u300D\uFF09\u3002 */\nconst OOM = /out of memory|no available backend/i;\n\nexport interface SingResult { samples: Float32Array; sr: number; ms: { load: number; sing: number; boot?: Record<string, number> } }\nexport interface LaneMem { wasm: number; cache: number; /** \u5F15\u64CE\u521A\u52A0\u8F7D\u5B8C\u90A3\u4E00\u523B\u7684\u5806\uFF08worker \u81EA\u5DF1\u91CF\uFF0Cv0.10.3\uFF1B\u6362\u6B4C\u65F6\u6309\u5B83\u5224\u65AD\u91CD\u5F00\u503C\u4E0D\u503C\uFF09\u3002 */ base?: number }\nexport interface DiskInfo { bytes: number; entries: number; budget: number }\n/** \u8BFB\u97F3\uFF08v0.9.34\uFF09\uFF1Alabels[k] = \u7B2C k \u6761\u5FF5\u6210\u7684\u97F3\u7D20\uFF1B\u5BF9\u4E0D\u4E0A = null + said\uFF08\u5FF5\u51FA\u6765\u7684\u6BCF\u4E2A\u97F3\u8282\uFF09\uFF1Bready false = \u5F15\u64CE\u8FD8\u6CA1\u8D77\u6765\uFF08\u4E0D\u4E3A\u6B64\u8D77\u5F15\u64CE\uFF09\u3002 */\nexport interface Reading { ready: boolean; labels: string[] | null; said: string[] }\ntype Extra = Partial<Pick<SingRequest, \"opt\" | \"breath\" | \"models\" | \"raw\" | \"cacheBytes\" | \"diskBytes\" | \"only\">> & { /** \u5BBF\u4E3B\u7ED9\u8FD9\u4E00\u53E5\u8D34\u7684\u6807\u7B7E\uFF08\u5757\u7684\u952E\uFF09\uFF1AcancelInflight(tag) \u53EA\u53D6\u6D88\u5B83\u3002 */ tag?: string };\ninterface Job { s: LabScore; progress: (stage: string) => void; extra: Extra; ok: (r: SingResult) => void; fail: (e: Error) => void }\ninterface Pending { ok: (r: SingResult) => void; fail: (e: Error) => void; progress: (s: string) => void; lane: Lane; tag?: string }\ninterface Lane {\n  w: Worker | null;\n  inflightId: number;           // \u6B63\u5728\u7B97\u7684\u6574\u53E5\uFF080 = \u7A7A\u7740\uFF09\n  inflightTag?: string;\n  onlyId: number;               // \u6700\u8FD1\u4E00\u6B21\u6309\u952E\u8BD5\u542C\u7684\u8BF7\u6C42\uFF08\u65B0\u7684\u6765\u4E86\u65E7\u7684\u53D6\u6D88\uFF09\n  warming: Promise<void> | null;\n  mem: LaneMem | null;          // \u6700\u8FD1\u4E00\u6B21\u62A5\u7684\u5360\u7528\n  closing: boolean;             // setLanes \u51CF\u6389\u7684\uFF1A\u7B97\u5B8C\u624B\u4E0A\u7684\u5C31\u5173\n}\nconst newLane = (): Lane => ({ w: null, inflightId: 0, onlyId: 0, warming: null, mem: null, closing: false });\nconst hash = (s: string): number => { let h = 2166136261; for (let i = 0; i < s.length; i++) { h ^= s.charCodeAt(i); h = Math.imul(h, 16777619); } return h >>> 0; };\n\nexport class Singer {\n  private lanes: Lane[] = [newLane()];\n  private retiring: Lane[] = [];   // \u51CF\u6389\u4F46\u8FD8\u5728\u7B97\u7684\u9053\n  private seq = 0;\n  private pending = new Map<number, Pending>();\n  private queue: Job[] = [];\n  /** \u6BCF\u6B21\u6709\u9053\u62A5\u5360\u7528\u5C31\u53EB\u4E00\u4E0B\uFF08\u5200 6 \u5185\u5B58\u76D1\u63A7\uFF09\u3002 */\n  onMem: ((lane: number, mem: LaneMem) => void) | null = null;\n\n  /** \u51E0\u6761\u9053\uFF08\u4E3B\u7EBF\u7A0B\u6309\u8BBE\u5907\u5B9A\uFF1B\u5185\u5B58\u5403\u7D27\u964D\u5230 1\uFF09\u3002 */\n  get parallelism(): number { return this.lanes.length; }\n  setLanes(n: number): void {\n    n = Math.max(1, Math.floor(n));\n    while (this.lanes.length < n) this.lanes.push(newLane());\n    while (this.lanes.length > n) { const l = this.lanes.pop()!; if (l.inflightId || [...this.pending.values()].some((p) => p.lane === l)) { l.closing = true; this.retiring.push(l); } else this.closeLane(l); }\n  }\n  /** \u6BCF\u6761\u9053\u6700\u8FD1\u62A5\u7684\u5360\u7528\uFF08\u6CA1\u8D77\u7684\u9053\u4E0D\u5728\u91CC\u9762\uFF09\u3002 */\n  memory(): LaneMem[] { return this.lanes.map((l) => l.mem).filter((m): m is LaneMem => !!m); }\n  /** \u6309\u9053\u7684\u4E0B\u6807\u6392\u7684\u5360\u7528\uFF08\u6CA1\u8D77 = null\uFF1B\u4E0B\u6807\u548C laneBusy / restartLane \u5BF9\u5F97\u4E0A\uFF09\u3002 */\n  laneMems(): (LaneMem | null)[] { return this.lanes.map((l) => l.mem); }\n  laneBusy(i: number): boolean { const l = this.lanes[i]; return !!l && (l.inflightId !== 0 || [...this.pending.values()].some((p) => p.lane === l)); }\n\n  private laneFor(s: LabScore): Lane { return this.lanes[hash(`${s.LANG}|${s.TEXT}`) % this.lanes.length]; }\n  private laneIndex(l: Lane): number { return this.lanes.indexOf(l); }\n  private worker(l: Lane): Worker {\n    if (l.w) return l.w;\n    const w = new Worker(new URL(`./${__SINGER_WORKER__}`, import.meta.url), { type: \"module\" });\n    l.w = w;\n    w.onmessage = (ev: MessageEvent<SingReply>) => {\n      const m = ev.data, p = this.pending.get(m.id); if (!p) return;\n      if (m.type === \"progress\") { p.progress(m.stage); return; }\n      this.pending.delete(m.id);\n      if (m.type === \"cache\") { (p as Pending & { cache?: (d: DiskInfo | null) => void }).cache?.(m.disk); return; }\n      if (m.type === \"read\") { (p as Pending & { read?: (r: Reading) => void }).read?.({ ready: m.ready, labels: m.labels, said: m.said }); return; }\n      if (m.type === \"done\") { if (m.mem) { l.mem = m.mem; const i = this.laneIndex(l); if (i >= 0) this.onMem?.(i, m.mem); } p.ok({ samples: m.samples, sr: m.sr, ms: m.ms }); }\n      else p.fail(new Error(m.message));\n      if (l.closing && ![...this.pending.values()].some((q) => q.lane === l)) this.closeLane(l);\n    };\n    w.onerror = (e) => {   // \u574F\u4E86\u5C31\u4E22\u6389\uFF0C\u4E0B\u6B21\u7528\u91CD\u5EFA\uFF08\u4E0D\u7136\u4E0B\u4E00\u6B21\u6C38\u8FDC\u7B49\u4E0D\u5230\u56DE\u590D\uFF09\n      this.failLane(l, new Error(e.message || \"\u5C0F\u6708\u76F8\u7684 worker \u51FA\u9519\"));\n    };\n    return w;\n  }\n  private closeLane(l: Lane): void { l.w?.terminate(); l.w = null; l.mem = null; l.inflightId = 0; l.onlyId = 0; const k = this.retiring.indexOf(l); if (k >= 0) this.retiring.splice(k, 1); }\n  private failLane(l: Lane, err: Error): void {\n    l.w?.terminate(); l.w = null; l.mem = null; l.inflightId = 0; l.onlyId = 0;\n    for (const [id, p] of [...this.pending]) if (p.lane === l) { this.pending.delete(id); p.fail(err); }\n    void this.pump();\n  }\n\n  /** \u91CD\u5F00\u6240\u6709\u9053\uFF1Awasm \u7684\u5185\u5B58\u53EA\u6DA8\u4E0D\u843D\uFF0C\u53EA\u6709\u6574\u4E2A worker \u5173\u6389\u624D\u771F\u8FD8\u56DE\u53BB\u3002 */\n  restart(): void { for (const l of this.lanes) this.failLane(l, new Error(\"\u5C0F\u6708\u76F8\u7684 worker \u91CD\u5F00\u4E86\")); }\n  /** \u53EA\u91CD\u5F00\u4E00\u6761\u9053\uFF08\u6362\u6B4C\u65F6\uFF1A\u4E0A\u4E00\u9996\u7684\u957F\u53E5\u628A\u8FD9\u6761\u9053\u7684\u5806\u6491\u5927\u4E86\u3001\u73B0\u5728\u7A7A\u7740\uFF1B\u5FF5\u7F13\u5B58\u76D8\u4E0A\u90A3\u4EFD\u8FD8\u5728\uFF09\u3002 */\n  restartLane(i: number): void { const l = this.lanes[i]; if (l) this.failLane(l, new Error(\"\u5C0F\u6708\u76F8\u7684 worker \u91CD\u5F00\u4E86\")); }\n  /** \u8FD8\u6CA1\u5F00\u59CB\u7B97\u7684\u5168\u6254\u6389\uFF08\u4EE5 \"cancelled\" \u62D2\u7EDD\uFF09\uFF1B\u6B63\u5728\u7B97\u7684\u7167\u5E38\u56DE\u6765\u3002\u8FD4\u56DE\u6254\u4E86\u51E0\u4E2A\u3002 */\n  cancelPending(): number {\n    const n = this.queue.length;\n    for (const j of this.queue.splice(0)) j.fail(new Error(\"cancelled\"));\n    return n;\n  }\n  /** \u53D6\u6D88\u6B63\u5728\u7B97\u7684\u6574\u53E5\uFF08worker \u5728\u6BB5\u4E0E\u6BB5\u4E4B\u95F4\u8BA4\uFF1B\u6B63\u5728\u8DD1\u7684\u90A3\u4E00\u6BB5\u8DD1\u5B8C\u624D\u505C\uFF09\u3002\u7ED9\u4E86 tag = \u53EA\u53D6\u6D88\u8D34\u7740\u8FD9\u4E2A\u6807\u7B7E\u7684\u90A3\u53E5\uFF1B\u4E0D\u7ED9 = \u5168\u90E8\u3002 */\n  cancelInflight(tag?: string): void {\n    for (const l of [...this.lanes, ...this.retiring]) if (l.inflightId && (tag === undefined || l.inflightTag === tag)) { const req: CancelRequest = { type: \"cancel\", id: l.inflightId }; l.w?.postMessage(req); }\n  }\n  /** \u53EA\u628A\u5F15\u64CE\u8D77\u8D77\u6765\uFF08\u6253\u5F00\u6B4C\u5C31\u8D77\uFF1Buser 10-10\u300C\u51B7\u542F\u52A8\u505A\u300D\uFF09\uFF1A\u7B2C\u4E00\u6761\u9053\u3002\u522B\u7684\u9053\u7B2C\u4E00\u6B21\u7528\u5230\u624D\u8D77\uFF08\u8D77\u5728\u5E76\u884C\u91CC\uFF0C\u4E0D\u53E6\u82B1\u7B49\u5F85\uFF09\u3002\u5931\u8D25\u4E0D\u629B\uFF08\u7B2C\u4E00\u6B21\u771F\u5531\u4F1A\u518D\u62A5\uFF09\u3002 */\n  warm(models?: string[], diskBytes?: number): Promise<void> {\n    const l = this.lanes[0];\n    return (l.warming ??= new Promise<void>((ok) => {\n      const id = ++this.seq, req: WarmRequest = { type: \"warm\", id, models, diskBytes };\n      this.pending.set(id, { ok: () => ok(), fail: () => ok(), progress: () => {}, lane: l }); this.worker(l).postMessage(req);\n    }).finally(() => { l.warming = null; }));\n  }\n  /** \u5FF5\u7F13\u5B58\u6301\u4E45\u5C42\uFF08\u5168\u5C40\u6C60\uFF09\uFF1A\u770B\u5927\u5C0F / \u6E05\u7A7A\u3002\u8D70\u7B2C\u4E00\u6761\u9053\uFF08\u4E0D\u8D77\u5F15\u64CE\uFF09\u3002 */\n  cache(op: \"info\" | \"clear\", diskBytes?: number): Promise<DiskInfo | null> {\n    const l = this.lanes[0], id = ++this.seq, req: CacheRequest = { type: \"cache\", id, op, diskBytes };\n    return new Promise((ok, fail) => { this.pending.set(id, { ok: () => ok(null), fail, progress: () => {}, lane: l, cache: ok } as Pending & { cache: (d: unknown) => void }); this.worker(l).postMessage(req); });\n  }\n  /** \u8BFB\u97F3\uFF08\u6B4C\u8BCD\u65C1\u663E\u793A\u5F15\u64CE\u5FF5\u6210\u4EC0\u4E48\uFF0Cv0.9.34\uFF09\uFF1A\u95EE\u5DF2\u7ECF\u8D77\u6765\u7684\u90A3\u6761\u9053\uFF08\u7B2C\u4E00\u6761\u4F18\u5148\uFF09\uFF1B\u4E00\u6761\u90FD\u6CA1\u8D77 = ready false\uFF0C\u4E0D\u4E3A\u6B64\u5EFA worker\u3001\u4E0D\u8D77\u5F15\u64CE\u3002 */\n  read(s: LabScore): Promise<Reading> {\n    const l = this.lanes.find((x) => x.w); if (!l) return Promise.resolve({ ready: false, labels: null, said: [] });\n    const id = ++this.seq, req: ReadRequest = { type: \"read\", id, score: s.SCORE, text: s.TEXT, lang: s.LANG };\n    return new Promise((ok, fail) => { this.pending.set(id, { ok: () => ok({ ready: false, labels: null, said: [] }), fail, progress: () => {}, lane: l, read: ok } as Pending & { read: (r: Reading) => void }); l.w!.postMessage(req); });\n  }\n  get busy(): boolean { return this.queue.length > 0 || this.lanes.some((l) => l.inflightId !== 0); }\n  get queued(): number { return this.queue.length; }\n\n  /** \u5531\uFF08\u6392\u961F\uFF1B\u6BCF\u6761\u9053\u4E00\u6B21\u4E00\u53E5\uFF09\u3002\u5185\u5B58\u4E0D\u591F\uFF08\u6362\u7740\u8BD5\u5F88\u591A\u97F3\u8272\u4E4B\u540E wasm \u5806\u6491\u5927\u4E86\uFF0C\u6708\u8BFB\u7684\u5F15\u64CE\u8D77\u4E0D\u6765\u2014\u2014user 2026-10-08 iPad\u300COut of memory\u300D\u300C\u611F\u89C9\u662F\u6CA1\u6709gc\u300D\uFF09\n   *  = \u91CD\u5F00\u90A3\u6761\u9053\uFF08\u5168\u90E8\u8FD8\u56DE\u53BB\uFF09\u518D\u8BD5\u4E00\u6B21\uFF1B\u8FD8\u4E0D\u884C\u624D\u62A5\u9519\u3002\u540C\u4E00\u4F4D\u6F14\u594F\u8005\u91CD\u6765\uFF0C\u4E0D\u662F\u6362\u4EBA\uFF08\u4E0D\u81EA\u52A8\u66FF\u8865\uFF09\u3002 */\n  sing(s: LabScore, progress: (stage: string) => void = () => {}, extra: Extra = {}): Promise<SingResult> {\n    return new Promise<SingResult>((ok, fail) => { this.queue.push({ s, progress, extra, ok, fail }); void this.pump(); });\n  }\n  private pump(): void {\n    for (;;) {\n      const j = this.queue[0]; if (!j) return;\n      const pref = this.laneFor(j.s), lane = pref.inflightId === 0 ? pref : this.lanes.find((l) => l.inflightId === 0);\n      if (!lane) return;   // \u90FD\u5FD9\uFF1A\u7B49\u54EA\u6761\u9053\u7B97\u5B8C\u518D\u6765\n      this.queue.shift();\n      lane.inflightId = -1;   // \u5360\u4F4F\uFF08\u771F\u6B63\u7684 id \u5728 singOnce \u91CC\u7ED9\uFF09\n      void this.singRetry(lane, j.s, j.progress, j.extra).then(j.ok, j.fail).finally(() => { lane.inflightId = 0; lane.inflightTag = undefined; this.pump(); });\n    }\n  }\n  private async singRetry(lane: Lane, s: LabScore, progress: (stage: string) => void, extra: Extra): Promise<SingResult> {\n    try { return await this.singOnce(lane, s, progress, extra); }\n    catch (e) {\n      const msg = (e as Error).message ?? \"\";\n      if (!OOM.test(msg)) throw e;\n      diagNote(\"singer\", `out of memory, restarting worker and retrying once: ${msg}`);\n      this.failLane(lane, new Error(\"\u5C0F\u6708\u76F8\u7684 worker \u91CD\u5F00\u4E86\")); progress(\"\u5185\u5B58\u4E0D\u591F\uFF1A\u91CD\u5F00\u5C0F\u6708\u76F8\u7684\u5F15\u64CE\u518D\u8BD5\u4E00\u6B21\");\n      try { return await this.singOnce(lane, s, progress, extra); }\n      catch (e2) {\n        const m2 = (e2 as Error).message ?? \"\";\n        diagNote(\"singer\", `retry after restart failed: ${m2}`);\n        if (OOM.test(m2)) throw new Error(\"\u8FD9\u53F0\u8BBE\u5907\u7684\u5185\u5B58\u4E0D\u591F\uFF0C\u5C0F\u6708\u76F8\u7684\u5F15\u64CE\u8D77\u4E0D\u6765\uFF08\u5DF2\u7ECF\u91CD\u5F00\u8FC7\u4E00\u6B21\u5F15\u64CE\uFF09\u3002\u53EF\u4EE5\u628A\u522B\u7684\u4E50\u5668\u58F0\u90E8\u9759\u97F3\u518D\u653E\uFF0C\u6216\u8005\u5173\u6389 app \u91CD\u65B0\u6253\u5F00\uFF1B\u4E5F\u53EF\u4EE5\u7ED9\u8FD9\u4E2A\u58F0\u90E8\u6362\u300C\u5C0F\u6708\u76F8\uFF08\u5143\u97F3\uFF09\u300D\");\n        throw e2;\n      }\n    }\n  }\n  private singOnce(lane: Lane, s: LabScore, progress: (stage: string) => void, extra: Extra): Promise<SingResult> {\n    const id = ++this.seq;\n    const { tag, ...rest } = extra;\n    if (rest.only) { if (lane.onlyId) lane.w?.postMessage({ type: \"cancel\", id: lane.onlyId } satisfies CancelRequest); lane.onlyId = id; } else { lane.inflightId = id; lane.inflightTag = tag; }\n    const req: SingRequest = { type: \"sing\", id, score: s.SCORE, text: s.TEXT, tempo: s.TEMPO_QUARTER, lang: s.LANG, ...rest };\n    return new Promise((ok, fail) => { this.pending.set(id, { ok, fail, progress, lane, tag }); this.worker(lane).postMessage(req); });\n  }\n  /** \u53EA\u5531\u4E00\u4E2A\u5B57\uFF08\u6309\u952E\u8BD5\u542C\uFF0C\u5200 3\uFF09\uFF1A\u4E0D\u6392\u961F\u3001\u76F4\u63A5\u7ED9\u8FD9\u4E00\u53E5\u81EA\u5DF1\u7684\u9053\uFF08\u6392\u5728\u6574\u53E5\u540E\u9762 = \u8FDF\u5230\u7684\u97F3\u66F4\u70E6\uFF1Bworker \u5728\u6BB5\u754C\u4E4B\u95F4\u5C31\u4F1A\u63D2\u8FDB\u6765\uFF09\uFF1B\u5FF5\u7F13\u5B58\u547D\u4E2D\u65F6\u51E0\u6BEB\u79D2\u3002 */\n  singOnly(s: LabScore, only: { entry: number; midi: number; secs: number }, extra: Omit<Extra, \"only\" | \"raw\" | \"tag\"> = {}): Promise<SingResult> {\n    return this.singOnce(this.laneFor(s), s, () => {}, { ...extra, only, raw: true });\n  }\n  /** \u5168 app \u5171\u7528\u7684 AudioContext\uFF08\u5FC5\u987B\u5728\u7528\u6237\u624B\u52BF\u91CC\u5148\u8C03\u8FC7\u4E00\u6B21\uFF0CiPad \u624D\u653E\u58F0\uFF09\u3002 */\n  unlock(): AudioContext { return audioCtx(); }\n}\n", "// resource-watch.ts \u2014\u2014 \u5200 6 \u2463\uFF1A\u8D1F\u8F7D\u548C\u5185\u5B58\u76D1\u63A7\u9632\u95EA\u9000\uFF08user 2026-10-10\u300C\u8D1F\u8F7D\u548C\u5185\u5B58\u76D1\u63A7\u9632\u95EA\u9000 \u505A\u300D\uFF1B\u9636\u68AF = user \u540C\u65E5\u300C\u8D85\u9884\u7B97\u5148\u653E\u5757 / \u51CF\u5E76\u884C / \u660E\u8BF4\u300D\uFF09\u3002\n// created 2026-10-10 by Claude Fable 5.1\n// \u7EAF\u51FD\u6570\uFF1A\u4E3B\u7EBF\u7A0B\u628A\u80FD\u7B97\u5230\u7684\u6570\uFF08\u6BCF\u6761\u6708\u8BFB worker \u7684 WASM \u5806 + \u5FF5\u7F13\u5B58\u3001\u5F55\u97F3\u623F\u91CC\u7684\u5757\u3001\u97F3\u6E90\u5728\u5185\u5B58\u91CC\u7684\u6574\u5305\u3001\u97F3\u9891\u7EBF\u7A0B\u7684\u5FD9\u95F2\uFF09\u51D1\u6210\u4E00\u5F20\u5FEB\u7167\uFF0C\n//   \u8FD9\u91CC\u6309\u8BBE\u5907\u9884\u7B97\u7ED9\u51FA\u5EFA\u8BAE\uFF1B\u771F\u7684\u52A8\u624B\uFF08\u653E\u5757 / \u5173\u4E00\u6761\u9053 / \u91CD\u5F00\u5F15\u64CE / \u8BF4\u4E00\u53E5\uFF09\u5728 main.ts\u3002\n// \u4E3A\u4EC0\u4E48\u662F\u9884\u7B97\u4E0D\u662F\u771F\u91CF\uFF1AiPad / Safari \u91CF\u4E0D\u5230\u9875\u9762\u603B\u5185\u5B58\uFF0C\u95EA\u9000\uFF08jetsam\uFF09\u4E5F\u6CA1\u6709\u4EFB\u4F55\u4E8B\u4EF6\u2014\u2014\u53EA\u80FD\u628A\u6211\u4EEC\u81EA\u5DF1\u5360\u7684\u90A3\u90E8\u5206\u7BA1\u5728\u9884\u7B97\u5185\u3001\u6DA8\u4E0A\u53BB\u5C31\u51CF\u3002\n// \u542C\u4E0D\u89C1\u7684\u4E8B\u4E0D\u81EA\u52A8\u505A\uFF1A\u51CF\u5E76\u884C / \u653E\u5757\u5BF9\u58F0\u97F3\u96F6\u5F71\u54CD\uFF1B\u6548\u679C\u94FE / \u58F0\u90E8\u4ECE\u4E0D\u81EA\u52A8\u52A8\uFF08\u90A3\u662F\u7528\u6237\u7684\u6DF7\u97F3\uFF09\u3002\n// \u91CD\u5F00\u5F15\u64CE\uFF08v0.10.3 \u6539\uFF0CClaude Opus 5.5\uFF1Buser\u300C\u73B0\u5728\u8FD8\u662F\u5929\u5929\u62A5\u5185\u5B58\u592A\u591A\u7684\u9519\uFF0C\u6709\u65F6\u5019\u6708\u8BFB\u8FD8\u4F1A\u5185\u5B58\u4E0D\u591F\u8BFB\u4E0D\u4E86\u300D\uFF09\uFF1A**\u540C\u4E00\u9996\u6B4C\u91CC\u4E0D\u91CD\u5F00**\u2014\u2014\u5806\u6DA8\u4E0A\u53BB = \u8FD9\u9996\u6B4C\u6700\u957F\u90A3\u4E00\u53E5\u8981\u7684\n//   \uFF08\u5B9E\u6D4B WORLD \u7684\u5806\u7EA6 3.3 MB / \u79D2\u53E5\u957F\u3001\u53EA\u6DA8\u4E0D\u843D\uFF1B\u8D77\u5F15\u64CE 307 MB\uFF09\uFF0C\u91CD\u5F00\u4E86\u4E0B\u4E00\u904D\u653E\u53C8\u6DA8\u56DE\u6765\uFF0C\u767D\u767D\u591A\u5EFA\u4E09\u5757 WASM \u5185\u5B58\u3001\u6BCF\u6B21\u8FD8\u5F39\u4E00\u53E5\u3002\n//   \u53EA\u5728\u6362\u6B4C\u65F6\u628A\u4E0A\u4E00\u9996\u957F\u53E5\u6491\u5927\u7684\u90A3\u6761\u9053\u9759\u9ED8\u8FD8\u56DE\u53BB\uFF08trimOnSongSwitch\uFF1B\u5FF5\u7F13\u5B58\u76D8\u4E0A\u90A3\u4EFD\u8FD8\u5728\uFF0C\u4E0D\u7528\u91CD\u5FF5\uFF09\u3002\n\nexport interface DeviceInfo { ios: boolean; cores: number; deviceMemoryGB: number | null }\nexport interface Budget {\n  /** \u51E0\u6761\u6708\u8BFB\u7684\u5DE5\u4F5C\u9053\uFF08PC 2\u3001iPad 1\uFF1Buser\u300C\u4E24\u4E2A worker \u5E76\u884C\u5531\uFF08PC\uFF09\uFF1BiPad \u4E0D\u5F00\u300D\uFF09\u3002 */\n  lanes: number;\n  /** \u6211\u4EEC\u81EA\u5DF1\u5360\u7684\u90A3\u90E8\u5206\uFF08worker \u5806 + \u5FF5\u7F13\u5B58 + \u5757 + \u97F3\u6E90\u5185\u5B58\uFF09\u52A0\u8D77\u6765\u8D85\u8FC7\u8FD9\u4E2A = \u5F00\u59CB\u51CF\u3002 */\n  total: number;\n  /** \u5F55\u97F3\u623F\u91CC\u7559\u7684\u5757\uFF08Int16\uFF09\u8D85\u8FC7\u8FD9\u4E2A = \u653E\u8FDC\u5904\u7684\u3002 */\n  chunkBytes: number;\n  /** \u5FF5\u7F13\u5B58\u6301\u4E45\u5C42\uFF08\u5168\u5C40\u6C60\uFF0CIndexedDB\uFF09\u7684\u5B57\u8282\u9884\u7B97\uFF08user 2026-10-10\u300C\u4EE3\u4EF7\u7EA6\u6BCF\u999632MB\u300D\uFF1A\u5C0F\u8BBE\u5907\u7EA6 4 \u9996\u3001\u684C\u9762\u7EA6 16 \u9996\uFF09\u3002 */\n  speechDisk: number;\n}\n/** base = \u5F15\u64CE\u521A\u52A0\u8F7D\u5B8C\u90A3\u4E00\u523B\u7684\u5806\uFF08worker \u81EA\u5DF1\u91CF\uFF0Cv0.10.3\uFF09\uFF1A\u5F15\u64CE\u6D3B\u7740\u672C\u6765\u5C31\u8981\u8FD9\u4E48\u591A\uFF08\u6A21\u578B + \u8BCD\u5178 + WORLD \u8D77\u59CB\uFF09\uFF0C\u91CD\u5F00\u53EA\u80FD\u8FD8\u56DE\u6BD4\u5B83\u591A\u6DA8\u7684\u90A3\u4E00\u622A\u3002 */\nexport interface LaneMem { wasm: number; cache: number; base?: number }\nexport interface Snapshot {\n  lanes: LaneMem[];           // \u6BCF\u6761\u9053\u6700\u8FD1\u4E00\u6B21\u62A5\u7684\u6570\uFF08\u6CA1\u62A5\u8FC7 = \u4E0D\u5728\uFF09\n  chunkBytes: number; chunks: number;\n  soundMem: number;\n  /** \u97F3\u9891\u7EBF\u7A0B\u6700\u8FD1 1 s \u7684\u5FD9\u95F2\uFF080\u20131\uFF1Bnull = \u6CA1\u5728\u62A5\uFF09\u3002 */\n  audioBusy: number | null;\n}\nexport type Advice =\n  | { kind: \"pruneChunks\"; toBytes: number }\n  | { kind: \"fewerLanes\"; lanes: number }\n  | { kind: \"audioHot\"; busy: number };\n\nconst MB = 1e6;\n/** \u8BBE\u5907\u9884\u7B97\uFF1AiPad / \u624B\u673A\u6309\u300C\u522B\u88AB\u7CFB\u7EDF\u6740\u300D\u6765\uFF1B\u684C\u9762\u5BBD\u677E\u3002cores / deviceMemory \u6D4F\u89C8\u5668\u4E0D\u7ED9\u5C31\u6309\u4FDD\u5B88\u7684\u7B97\u3002 */\nexport function budgetFor(d: DeviceInfo): Budget {\n  const small = d.ios || (d.deviceMemoryGB !== null && d.deviceMemoryGB <= 4);\n  if (small) return { lanes: 1, total: 600 * MB, chunkBytes: 24 * MB, speechDisk: 128 * MB };\n  const mid = d.deviceMemoryGB !== null && d.deviceMemoryGB < 8;\n  return { lanes: !mid && d.cores >= 4 ? 2 : 1, total: mid ? 1200 * MB : 2500 * MB, chunkBytes: mid ? 64 * MB : 160 * MB, speechDisk: 512 * MB };\n}\nexport const totalBytes = (s: Snapshot): number => s.lanes.reduce((n, l) => n + l.wasm + l.cache, 0) + s.chunkBytes + s.soundMem;\n\n/** \u97F3\u9891\u7EBF\u7A0B\u7B97\u300C\u70ED\u300D\u7684\u95E8\u69DB\uFF08\u5FD9\u95F2\u6BD4\uFF1B\u8D85\u8FC7 = \u53EF\u80FD\u7206\u97F3\uFF09\u3002 */\nexport const AUDIO_HOT = 0.85;\n\n/** \u91CD\u5F00\u4E00\u6761\u9053\u80FD\u8FD8\u56DE\u6765\u591A\u5C11\uFF1A\u6BD4\u57FA\u7EBF\u591A\u6DA8\u7684\u90A3\u4E00\u622A\uFF08\u6CA1\u6709\u57FA\u7EBF = \u4E0D\u77E5\u9053 = \u5F53 0\uFF09\u3002 */\nconst freeable = (l: LaneMem): number => (l.base !== undefined ? Math.max(0, l.wasm - l.base) : 0);\n/** \u503C\u4E0D\u503C\u5F97\u91CD\u5F00\uFF1A\u591A\u6DA8\u7684\u8D85\u8FC7 100 MB \u6216\u57FA\u7EBF\u7684\u4E09\u6210\uFF08\u53D6\u5927\u7684\uFF09\u2248 \u4E0A\u4E00\u9996\u6709\u53E5\u5B50\u957F\u8FC7 30 \u79D2\u3002 */\nconst worth = (l: LaneMem): boolean => freeable(l) > Math.max(100 * MB, 0.3 * (l.base ?? 0));\n/** \u6362\u6B4C\u65F6\u54EA\u51E0\u6761\u9053\u8BE5\u91CD\u5F00\uFF08\u4E0B\u6807\uFF1B\u6CA1\u8D77\u7684\u9053 = null \u8DF3\u8FC7\uFF09\uFF1A\u6BD4\u5F15\u64CE\u521A\u8D77\u6765\u591A\u6DA8\u4E86\u4E00\u5927\u622A\u7684\u3002\u5FD9\u4E0D\u5FD9\u7531\u5BBF\u4E3B\u770B\uFF08\u6B63\u5728\u5531\u7684\u4E0D\u52A8\uFF0C\u4E0B\u6B21\u6362\u6B4C\u518D\u8BF4\uFF09\u3002 */\nexport function trimOnSongSwitch(lanes: readonly (LaneMem | null)[]): number[] {\n  return lanes.flatMap((l, i) => (l && worth(l) ? [i] : []));\n}\n/** \u8D85\u9884\u7B97\u7684\u9636\u68AF\uFF08\u6309\u987A\u5E8F\uFF0C\u4E00\u6B21\u53EA\u5EFA\u8BAE\u4E00\u6B65\uFF0C\u505A\u4E86\u518D\u770B\u4E0B\u4E00\u6B21\u5FEB\u7167\uFF09\uFF1A\u2460 \u5757\u8D85\u4E86\u5148\u653E\u5757 \u2461 \u4E24\u6761\u9053\u5173\u4E00\u6761 \u2462 \u97F3\u9891\u7EBF\u7A0B\u70ED = \u660E\u8BF4\uFF08\u5E76\u51CF\u5E76\u884C\uFF09\u3002\n *  \u540C\u4E00\u9996\u6B4C\u91CC\u4E0D\u91CD\u5F00\u5F15\u64CE\uFF08\u89C1\u6587\u4EF6\u5934 v0.10.3\uFF09\u3002 */\nexport function advise(s: Snapshot, b: Budget): Advice[] {\n  const out: Advice[] = [];\n  const over = totalBytes(s) > b.total;\n  if (s.chunkBytes > b.chunkBytes || (over && s.chunkBytes > b.chunkBytes / 2)) out.push({ kind: \"pruneChunks\", toBytes: Math.floor(Math.min(b.chunkBytes, s.chunkBytes) / 2) });\n  else if (over && s.lanes.length > 1) out.push({ kind: \"fewerLanes\", lanes: 1 });\n  if (s.audioBusy !== null && s.audioBusy > AUDIO_HOT) { out.push({ kind: \"audioHot\", busy: s.audioBusy }); if (s.lanes.length > 1 && !out.some((a) => a.kind === \"fewerLanes\")) out.push({ kind: \"fewerLanes\", lanes: 1 }); }\n  return out;\n}\n\nconst sizeText = (n: number) => (n >= 1e9 ? `${(n / 1e9).toFixed(2)} GB` : n >= 1e6 ? `${(n / 1e6).toFixed(0)} MB` : `${(n / 1e3).toFixed(0)} KB`);\n/** \u8BBE\u7F6E\u9875 / \u8BCA\u65AD\u7528\u7684\u4E00\u53E5\u4EBA\u8BDD\uFF08\u80FD\u7B97\u7684\u90A3\u90E8\u5206\uFF0C\u4E0D\u5047\u88C5\u662F\u9875\u9762\u603B\u5185\u5B58\uFF09\u3002 */\nexport function describe(s: Snapshot, b: Budget): string {\n  const lanes = s.lanes.length ? s.lanes.map((l, i) => `\u9053 ${i + 1}\uFF1A\u5806 ${sizeText(l.wasm)}${l.base !== undefined ? `\uFF08\u521A\u8D77\u6765 ${sizeText(l.base)}\uFF09` : \"\"} + \u5FF5\u7F13\u5B58 ${sizeText(l.cache)}`).join(\"\uFF1B\") : \"\u5C0F\u6708\u76F8\u5F15\u64CE\u6CA1\u8D77\";\n  const audio = s.audioBusy === null ? \"\u97F3\u9891\u7EBF\u7A0B\uFF1A\u6CA1\u5728\u62A5\" : `\u97F3\u9891\u7EBF\u7A0B\u6700\u8FD1 1 s \u5FD9 ${Math.round(s.audioBusy * 100)}%${s.audioBusy > AUDIO_HOT ? \"\uFF08\u70ED\uFF1A\u53EF\u80FD\u7206\u97F3\uFF09\" : \"\"}`;\n  return `\u80FD\u7B97\u5230\u7684\u5360\u7528 ${sizeText(totalBytes(s))} / \u9884\u7B97 ${sizeText(b.total)}\uFF08${lanes}\uFF1B\u5F55\u97F3\u623F\u91CC ${s.chunks} \u5757 ${sizeText(s.chunkBytes)}\uFF1B\u97F3\u6E90\u5185\u5B58 ${sizeText(s.soundMem)}\uFF09\u3002${audio}\u3002`;\n}\n", "// mp3.ts \u2014\u2014 \u4E3B\u7EBF\u7A0B\u8FD9\u8FB9\uFF1A\u8D77\u4E00\u4E2A mp3 \u7F16\u7801 worker\uFF0C\u7F16\u5B8C\u5C31\u5173\uFF08\u91CD\u8D44\u6E90\u7B49\u6709\u610F\u56FE\u624D\u52A0\u8F7D\uFF1A\u70B9\u5BFC\u51FA\u624D\u4E0B\u8FD9\u4E2A worker\uFF09\u3002created 2026-10-07 by Claude Opus 5.5\n// user\u300Cmp3\u4E0D\u884C\u5417\uFF0C\u5ACC\u5F03\u80D6\u5B50\u300D\uFF1A\u6700\u521D\u53EA\u6709\u5355\u58F0\u9053 64 kbps\uFF0860 \u79D2\u7EA6 0.5 MB\uFF09\u30022026-10-08 \u5BFC\u51FA\u9762\u677F\uFF08user\u300C\u597D\uFF0C\u540C\u610F\u300D\uFF09\uFF1A\u6807\u51C6 = \u7ACB\u4F53\u58F0 128 kbps\uFF08\u7EA6 1 MB / \u5206\u949F\uFF0C\u9ED8\u8BA4\uFF09/ \u5C0F\u6587\u4EF6 = \u5355\u58F0\u9053 64 kbps\u3002\nimport type { Mp3Reply, Mp3Request } from \"./mp3-worker.ts\";\n\nexport type Mp3Quality = \"standard\" | \"small\";\nexport const MP3_QUALITY: Record<Mp3Quality, { label: string; note: string; stereo: boolean; kbps: number }> = {\n  standard: { label: \"\u6807\u51C6\", note: \"\u7ACB\u4F53\u58F0 192k\uFF0C\u7EA6 1.4 MB / \u5206\u949F\", stereo: true, kbps: 192 },   // 2026-10-17 user\u300C\u6807\u51C6192\u540C\u610F\u300D\uFF08\u5B9A\u7A3F mp3 \u67E5\u6848\uFF1Aai-docs/20261017-final-mp3-quality.md\uFF09\n  small: { label: \"\u5C0F\u6587\u4EF6\", note: \"\u5355\u58F0\u9053 64k\uFF0C\u7EA6 0.5 MB / \u5206\u949F\", stereo: false, kbps: 64 },\n};\n\n/** \u7ACB\u4F53\u58F0\uFF08right \u7ED9\u4E86\uFF09\u6216\u5355\u58F0\u9053\u3002\u6837\u672C\u62F7\u4E00\u4EFD\u518D\u8F6C\u79FB\u7ED9 worker\uFF0C\u539F\u6837\u672C\uFF08\u7F13\u5B58\u91CC\u7684\uFF09\u4E0D\u52A8\u3002 */\nexport function encodeMp3(left: Float32Array, right: Float32Array | null, sr: number, kbps = 64): Promise<Uint8Array<ArrayBuffer>> {\n  return new Promise((ok, fail) => {\n    const w = new Worker(new URL(`./${__MP3_WORKER__}`, import.meta.url), { type: \"module\" });\n    w.onmessage = (ev: MessageEvent<Mp3Reply>) => { w.terminate(); if (ev.data.ok) ok(ev.data.bytes); else fail(new Error(ev.data.message)); };\n    w.onerror = (e) => { w.terminate(); fail(new Error(e.message || \"mp3 \u7F16\u7801 worker \u51FA\u9519\")); };\n    const req: Mp3Request = { left: left.slice(), ...(right ? { right: right.slice() } : {}), sr, kbps };\n    w.postMessage(req, [req.left.buffer, ...(req.right ? [req.right.buffer] : [])]);\n  });\n}\n", "// id3.ts \u2014\u2014 mp3 \u7684 ID3v2.3 \u6807\u7B7E\uFF08\u7EAF\u51FD\u6570\uFF09\uFF1A\u6B4C\u540D / \u4F5C\u8005 / \u8BB8\u53EF / \u7F72\u540D\u5199\u8FDB mp3 \u6587\u4EF6\u5934\uFF0C\u64AD\u653E\u5668\u3001\u7F51\u76D8\u3001\u6587\u4EF6\u7BA1\u7406\u5668\u90FD\u8BFB\u5F97\u5230\u3002created 2026-10-08 by Claude Opus 5.5\n// user 2026-10-08\u300Cmp3\u80FD\u81EA\u52A8\u751F\u6210license\u5417\u300D\u3002\u7528 v2.3 + UTF-16\uFF08\u5E26 BOM\uFF09\uFF1A\u4E2D\u65E5\u6587\u5728 iOS / Windows \u8D44\u6E90\u7BA1\u7406\u5668 / \u5404\u64AD\u653E\u5668\u91CC\u90FD\u663E\u793A\u5F97\u51FA\u6765\uFF08v2.4 \u7684 UTF-8 \u8001 Windows \u4E0D\u8BA4\uFF09\u3002\n// \u89C4\u683C\uFF1AID3v2.3.0\uFF08id3.org\uFF09\u2014\u2014\u5934 10 \u5B57\u8282\u300CID3\u300D03 00 + \u6807\u5FD7 + \u540C\u6B65\u5B89\u5168\u7684\u957F\u5EA6\uFF1B\u5E27 = 4 \u5B57\u8282 id + 4 \u5B57\u8282\u957F\u5EA6\uFF08v2.3 \u5E27\u957F\u5EA6\u662F\u666E\u901A\u5927\u7AEF\uFF0C\u4E0D\u662F\u540C\u6B65\u5B89\u5168\uFF09+ 2 \u5B57\u8282\u6807\u5FD7 + \u5185\u5BB9\u3002\nexport interface Id3Fields {\n  title?: string;       // TIT2\n  artist?: string;      // TPE1\n  copyright?: string;   // TCOP\uFF08\u8FD9\u9996\u6B4C\u81EA\u5DF1\u7684\u8BB8\u53EF\uFF09\n  copyrightUrl?: string;   // WCOP\uFF08\u8BB8\u53EF\u7684\u94FE\u63A5\uFF0C\u53EA\u653E ASCII \u7F51\u5740\uFF09\n  comment?: string;     // COMM\uFF08\u6574\u6BB5\u7F72\u540D\uFF09\n  software?: string;    // TSSE\n  /** APIC \u5C01\u9762\u56FE\uFF08\u7C7B\u578B 3 = \u6B63\u9762\u5C01\u9762\uFF09\uFF1Bmp3 \u64AD\u653E\u5668 / \u6587\u4EF6\u7BA1\u7406\u5668\u663E\u793A\u7684\u90A3\u5F20\u30022026-10-16 \u52A0\uFF08\u5B9A\u7A3F\u7684 mp3 \u8FDE\u5C01\u9762\u4E00\u8D77\u53D1\u884C\uFF0Cuser\u300C\u5C01\u9762\u5F53\u7136\u8FDB\u300D\uFF09\u3002 */\n  picture?: { mime: string; bytes: Uint8Array };\n}\n\nconst enc = (s: string): Uint8Array => {   // UTF-16LE + BOM\n  const out = new Uint8Array(2 + s.length * 2); out[0] = 0xff; out[1] = 0xfe;\n  for (let i = 0; i < s.length; i++) { const c = s.charCodeAt(i); out[2 + i * 2] = c & 0xff; out[3 + i * 2] = c >> 8; }\n  return out;\n};\nconst cat = (...xs: Uint8Array[]): Uint8Array => { const n = xs.reduce((a, x) => a + x.length, 0), out = new Uint8Array(n); let o = 0; for (const x of xs) { out.set(x, o); o += x.length; } return out; };\nconst ascii = (s: string) => Uint8Array.from([...s].map((c) => c.charCodeAt(0) & 0x7f));\nfunction frame(id: string, body: Uint8Array): Uint8Array {\n  const h = new Uint8Array(10); h.set(ascii(id), 0);\n  const n = body.length; h[4] = (n >>> 24) & 0xff; h[5] = (n >>> 16) & 0xff; h[6] = (n >>> 8) & 0xff; h[7] = n & 0xff;\n  return cat(h, body);\n}\nconst textFrame = (id: string, s: string) => frame(id, cat(Uint8Array.of(1), enc(s)));\n/** \u4E00\u6574\u4E2A ID3v2.3 \u6807\u7B7E\uFF08\u7A7A\u5B57\u6BB5\u4E0D\u5199\uFF1B\u5168\u7A7A = \u7A7A\u6570\u7EC4\uFF09\u3002\u62FC\u5728 mp3 \u5B57\u8282\u6700\u524D\u9762\u3002 */\nexport function id3v2(f: Id3Fields): Uint8Array {\n  const frames: Uint8Array[] = [];\n  if (f.title) frames.push(textFrame(\"TIT2\", f.title));\n  if (f.artist) frames.push(textFrame(\"TPE1\", f.artist));\n  if (f.copyright) frames.push(textFrame(\"TCOP\", f.copyright));\n  if (f.copyrightUrl && /^https?:\\/\\/[\\x21-\\x7e]+$/.test(f.copyrightUrl)) frames.push(frame(\"WCOP\", ascii(f.copyrightUrl)));\n  if (f.comment) frames.push(frame(\"COMM\", cat(Uint8Array.of(1), ascii(\"chi\"), enc(\"\"), Uint8Array.of(0, 0), enc(f.comment))));   // \u7F16\u7801 + \u8BED\u8A00 + \u7A7A\u7684\u77ED\u63CF\u8FF0\uFF08UTF-16 \u7ED3\u5C3E\u4E24\u4E2A 0\uFF09+ \u6B63\u6587\n  if (f.software) frames.push(textFrame(\"TSSE\", f.software));\n  if (f.picture && f.picture.bytes.length) frames.push(frame(\"APIC\", cat(Uint8Array.of(0), ascii(f.picture.mime), Uint8Array.of(0), Uint8Array.of(3), Uint8Array.of(0), f.picture.bytes)));   // \u7F16\u7801 0\uFF08ISO-8859-1\uFF09+ MIME + 0 + \u56FE\u7247\u7C7B\u578B 3\uFF08\u6B63\u9762\u5C01\u9762\uFF09+ \u7A7A\u63CF\u8FF0 + 0 + \u56FE\u7247\u5B57\u8282\n  if (!frames.length) return new Uint8Array(0);\n  const body = cat(...frames), n = body.length, h = new Uint8Array(10);\n  h.set(ascii(\"ID3\"), 0); h[3] = 3; h[4] = 0; h[5] = 0;\n  h[6] = (n >>> 21) & 0x7f; h[7] = (n >>> 14) & 0x7f; h[8] = (n >>> 7) & 0x7f; h[9] = n & 0x7f;   // \u540C\u6B65\u5B89\u5168\uFF1A\u6BCF\u5B57\u8282\u53EA\u7528\u4F4E 7 \u4F4D\n  return cat(h, body);\n}\n/** \u8BB8\u53EF\u6587\u5B57\u91CC\u7B2C\u4E00\u4E2A\u7F51\u5740\uFF08\u7ED9 WCOP\uFF09\u3002 */\nexport const firstUrl = (s: string | undefined): string | undefined => (s ? /https?:\\/\\/[\\x21-\\x7e]+/.exec(s)?.[0] : undefined);\n", "// sha256.ts \u2014\u2014 2026-10-07 \u7531 Claude Opus 5.5 \u4ECE JustReadBooks src/sha256.ts \u539F\u6837\u642C\u8FDB @internal/model-packs\uFF08user\u300C\u62BD\u5171\u4EAB\u5E93\u540C\u610F\u300D\uFF09\uFF0C\u7B97\u6CD5\u4E00\u5B57\u672A\u6539\u3002\n// \u6D41\u5F0F SHA-256\u3002\u9010\u5B57\u6765\u81EA @internal/read-aloud 0.1.19 src/sha256.ts\uFF082026-10-06 \u968F\u300C\u5E93\u4E0D\u7BA1\u6301\u4E45\u5316\u300D\u642C\u8FDB\u5BBF\u4E3B\uFF0CClaude Fable 5.1\uFF09\uFF0C\u90A3\u4E00\u4EFD\u53C8\u9010\u5B57\u6765\u81EA\n// WebXiaoHeiWu src/asr/sha256.ts\u3002\u6539\u7B97\u6CD5 = \u4E24\u8FB9\u4E00\u8D77\u6539\uFF08\u5019\u9009\u5408\u4E00\uFF1A@internal/model-packs\uFF09\u3002\u539F\u6587\u4EF6\u5934\u6CE8\u91CA\u5982\u4E0B\u3002\n// \u6D41\u5F0F SHA-256\uFF08\u7EAF TS\uFF0C\u5B57\u8282\u8FDB\u5341\u516D\u8FDB\u5236\u51FA\uFF1Bupdate() \u53EF\u5206\u7247\u5582\uFF0CO(1) \u5185\u5B58\uFF09\u3002\n// \u7528\u9014\uFF1A\u6A21\u578B\u5206\u7247\u5230\u624B\u5148\u9A8C\u518D\u5165\u7F13\u5B58/\u6302\u8F7D\u2014\u2014\u5BF9\u624B\u662F\u300C\u88AB\u9ED1\u7684\u955C\u50CF\u7AD9\u300D\uFF0C\u6240\u4EE5\u5FC5\u987B\u662F\u5BC6\u7801\u5B66\u54C8\u5E0C\uFF1B\u4E0D\u7528 crypto.subtle.digest\n// \u662F\u56E0\u4E3A\u5B83\u975E\u6D41\u5F0F\uFF08\u8981\u6574\u5757\u5728\u5185\u5B58\uFF09\u4E14\u4F1A\u628A\u300C\u5207\u7247\u5927\u5C0F\u300D\u7ED1\u5728\u5185\u5B58\u4E0A\uFF08user 2026-09-03 \u8FFD\u95EE\u540E\u5B9A\uFF09\u3002probe/asr/sha256.js \u662F\u540C\u4E00\u5B9E\u73B0\u7684 JS \u7248\u3002\n// created 2026-09-03 by Claude Fable 5.1\nconst K = new Uint32Array([\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\nexport class Sha256 {\n    h = new Uint32Array([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]);\n    buf = new Uint8Array(64);\n    bufLen = 0;\n    total = 0;\n    w = new Uint32Array(64);\n    done = false;\n    update(bytes) {\n        if (this.done)\n            throw new Error(\"Sha256: update after hex()\");\n        let i = 0;\n        this.total += bytes.length;\n        if (this.bufLen) {\n            const take = Math.min(64 - this.bufLen, bytes.length);\n            this.buf.set(bytes.subarray(0, take), this.bufLen);\n            this.bufLen += take;\n            i = take;\n            if (this.bufLen === 64) {\n                this.block(this.buf, 0);\n                this.bufLen = 0;\n            }\n        }\n        for (; i + 64 <= bytes.length; i += 64)\n            this.block(bytes, i);\n        if (i < bytes.length) {\n            this.buf.set(bytes.subarray(i), 0);\n            this.bufLen = bytes.length - i;\n        }\n        return this;\n    }\n    block(p, o) {\n        const w = this.w, H = this.h;\n        for (let t = 0; t < 16; t++, o += 4)\n            w[t] = (p[o] << 24) | (p[o + 1] << 16) | (p[o + 2] << 8) | p[o + 3];\n        for (let t = 16; t < 64; t++) {\n            const x = w[t - 15], y = w[t - 2];\n            const s0 = ((x >>> 7) | (x << 25)) ^ ((x >>> 18) | (x << 14)) ^ (x >>> 3);\n            const s1 = ((y >>> 17) | (y << 15)) ^ ((y >>> 19) | (y << 13)) ^ (y >>> 10);\n            w[t] = (w[t - 16] + s0 + w[t - 7] + s1) | 0;\n        }\n        let a = H[0], b = H[1], c = H[2], d = H[3], e = H[4], f = H[5], g = H[6], h = H[7];\n        for (let t = 0; t < 64; t++) {\n            const S1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));\n            const ch = (e & f) ^ (~e & g);\n            const t1 = (h + S1 + ch + K[t] + w[t]) | 0;\n            const S0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));\n            const maj = (a & b) ^ (a & c) ^ (b & c);\n            const t2 = (S0 + maj) | 0;\n            h = g;\n            g = f;\n            f = e;\n            e = (d + t1) | 0;\n            d = c;\n            c = b;\n            b = a;\n            a = (t1 + t2) | 0;\n        }\n        H[0] += a;\n        H[1] += b;\n        H[2] += c;\n        H[3] += d;\n        H[4] += e;\n        H[5] += f;\n        H[6] += g;\n        H[7] += h;\n    }\n    hex() {\n        if (this.done)\n            throw new Error(\"Sha256: hex() twice\");\n        const total = this.total;\n        const padLen = (this.bufLen < 56 ? 56 - this.bufLen : 120 - this.bufLen) + 8;\n        const pad = new Uint8Array(padLen);\n        pad[0] = 0x80;\n        const bits = total * 8, hi = Math.floor(bits / 4294967296), lo = bits >>> 0, n = padLen;\n        pad[n - 8] = hi >>> 24;\n        pad[n - 7] = hi >>> 16;\n        pad[n - 6] = hi >>> 8;\n        pad[n - 5] = hi;\n        pad[n - 4] = lo >>> 24;\n        pad[n - 3] = lo >>> 16;\n        pad[n - 2] = lo >>> 8;\n        pad[n - 1] = lo;\n        this.total -= padLen;\n        this.update(pad);\n        this.done = true;\n        return Array.from(this.h, (x) => x.toString(16).padStart(8, \"0\")).join(\"\");\n    }\n}\nexport function sha256Hex(bytes) { return new Sha256().update(bytes).hex(); }\n", "import { Sha256 } from \"./sha256.js\";\nconst SLICE = 1 << 20; // \u5BFC\u5165 / \u590D\u9A8C\u65F6\u6BCF\u6B21\u8BFB 1 MiB \u518D await\uFF1A\u4E3B\u7EBF\u7A0B\u4E0A\u4E0D\u51FA\u957F\u4EFB\u52A1\nexport function createPackStore(deps) {\n    const cacheName = deps.cacheName ?? \"pwa-models\";\n    const keyOf = (slug, name) => `${location.origin}/__pwa-models__/${slug}/${name}`;\n    function manifestOf(slug) {\n        const p = deps.packs[slug];\n        if (!p)\n            throw new Error(`unknown pack: ${slug}`);\n        return p;\n    }\n    const openCache = () => caches.open(cacheName);\n    /** \u4E00\u4E2A Blob \u7684 sha256\uFF0C\u9010\u6BB5\u8BFB\u3001\u9010\u6BB5\u5582\uFF08\u4E0D\u6574\u5757\u8FDB\u5185\u5B58\uFF09\u3002 */\n    async function hashBlob(b) {\n        const sha = new Sha256();\n        for (let o = 0; o < b.size; o += SLICE)\n            sha.update(new Uint8Array(await b.slice(o, Math.min(o + SLICE, b.size)).arrayBuffer()));\n        return sha.hex();\n    }\n    // \u2500\u2500 \u7F13\u5B58\u9762 \u2500\u2500\n    async function cachedChunkSizes(slug, m) {\n        const cache = await openCache();\n        const sizes = [];\n        for (const c of m.chunks) {\n            const r = await cache.match(keyOf(slug, c.name));\n            sizes.push(r ? Number(r.headers.get(\"content-length\") ?? 0) : 0);\n        }\n        return sizes;\n    }\n    async function putChunk(slug, name, bytes) {\n        const cache = await openCache();\n        const size = bytes instanceof Blob ? bytes.size : bytes.length;\n        await cache.put(keyOf(slug, name), new Response(bytes, { headers: { \"content-length\": String(size), \"content-type\": \"application/octet-stream\" } }));\n    }\n    async function markVerified(slug, packId) {\n        const cache = await openCache();\n        await cache.put(keyOf(slug, \"verified.json\"), new Response(JSON.stringify({ packId, at: new Date().toISOString() }), { headers: { \"content-type\": \"application/json\" } }));\n    }\n    async function status(slug) {\n        const { packId, manifest: m } = manifestOf(slug);\n        const cache = await openCache();\n        const sizes = await cachedChunkSizes(slug, m);\n        const complete = sizes.every((n, i) => n === m.chunks[i].bytes);\n        const marker = await cache.match(keyOf(slug, \"verified.json\"));\n        const verified = marker ? (await marker.json()).packId === packId : false;\n        return { slug, ready: complete && verified, bytesCached: sizes.reduce((a, b) => a + b, 0), bytesTotal: m.totalBytes };\n    }\n    /** \u540C slug \u91CD\u6253\u5305\u8FC7\uFF08\u7F13\u5B58\u91CC\u7684\u300C\u5DF2\u9A8C\u300D\u7AE0\u662F\u522B\u7684 packId\uFF09\u2192 \u65E7\u5206\u7247\u5168\u90E8\u4F5C\u5E9F\u3002 */\n    async function dropIfStale(slug) {\n        const { packId, manifest: m } = manifestOf(slug);\n        const cache = await openCache();\n        const marker = await cache.match(keyOf(slug, \"verified.json\"));\n        if (!marker || (await marker.json()).packId === packId)\n            return;\n        for (const c of m.chunks)\n            await cache.delete(keyOf(slug, c.name));\n        await cache.delete(keyOf(slug, \"verified.json\"));\n    }\n    /** \u7F13\u5B58\u91CC\u8FD9\u4E2A\u5305\u7684\u6BCF\u4E00\u7247\u91CD\u65B0\u7B97\u4E00\u904D\u54C8\u5E0C\uFF08\u6CA1\u88AB\u8FD9\u6B21\u8C03\u7528\u9A8C\u8FC7\u7684\u624D\u7B97\uFF09\uFF1B\u5168\u5BF9 \u2192 \u76D6\u300C\u5DF2\u9A8C\u300D\u7AE0\u3002\u6709\u4E00\u7247\u4E0D\u5BF9\u5C31\u5220\u6389\u90A3\u4E00\u7247\u3001\u4E0D\u76D6\u7AE0\u3002 */\n    async function sealIfComplete(slug, fresh) {\n        const { packId, manifest: m } = manifestOf(slug);\n        const sizes = await cachedChunkSizes(slug, m);\n        if (!sizes.every((n, i) => n === m.chunks[i].bytes))\n            return;\n        const cache = await openCache();\n        for (const c of m.chunks) {\n            if (fresh.has(c.name))\n                continue;\n            const r = await cache.match(keyOf(slug, c.name));\n            const ok = !!r && (await hashBlob(await r.blob())) === c.sha256;\n            if (!ok) {\n                await cache.delete(keyOf(slug, c.name));\n                return;\n            }\n        }\n        await markVerified(slug, packId);\n    }\n    async function download(slug, base, progress) {\n        const { packId, manifest: m } = manifestOf(slug);\n        await dropIfStale(slug); // \u540C slug \u91CD\u6253\u5305\uFF08packId \u53D8\u4E86\uFF09\u2192 \u65E7\u5206\u7247\u5168\u90E8\u4F5C\u5E9F\u91CD\u4E0B\uFF0C\u4E0D\u80FD\u53EA\u770B\u5C3A\u5BF8\u5BF9\u5C31\u514D\u9A8C\n        const sizes = await cachedChunkSizes(slug, m);\n        let done = sizes.reduce((a, n, i) => a + (n === m.chunks[i].bytes ? n : 0), 0);\n        progress({ done, total: m.totalBytes });\n        const root = base.replace(/\\/+$/, \"\");\n        for (let i = 0; i < m.chunks.length; i++) {\n            const c = m.chunks[i];\n            if (sizes[i] === c.bytes)\n                continue;\n            const res = await fetch(`${root}/packs/${slug}/${c.name}`, { cache: \"no-store\" });\n            if (!res.ok || !res.body)\n                throw new Error(`fetch ${c.name}: HTTP ${res.status}`);\n            const reader = res.body.getReader();\n            const sha = new Sha256();\n            const buf = new Uint8Array(c.bytes);\n            let got = 0, lastReported = 0;\n            for (;;) {\n                const { value, done: end } = await reader.read();\n                if (end)\n                    break;\n                if (got + value.length > c.bytes)\n                    throw new Error(`${c.name}: larger than manifest says`);\n                sha.update(value);\n                buf.set(value, got);\n                got += value.length;\n                if (got - lastReported >= 1048576 || got === c.bytes) {\n                    lastReported = got;\n                    progress({ done: done + got, total: m.totalBytes });\n                } // \u22651 MiB \u62A5\u4E00\u6B21\n            }\n            if (got !== c.bytes)\n                throw new Error(`${c.name}: got ${got} bytes, expected ${c.bytes}`);\n            if (sha.hex() !== c.sha256)\n                throw new Error(`${c.name}: sha256 mismatch (source tampered or corrupted)`);\n            await putChunk(slug, c.name, buf);\n            done += got;\n        }\n        await markVerified(slug, packId);\n        return status(slug);\n    }\n    async function importFiles(slugs, files, progress) {\n        const packs = slugs.map((slug) => ({ slug, m: manifestOf(slug).manifest }));\n        for (const p of packs)\n            await dropIfStale(p.slug);\n        const fresh = new Map(packs.map((p) => [p.slug, new Set()]));\n        const total = files.reduce((a, f) => a + f.size, 0);\n        let done = 0, matched = 0;\n        const bad = [];\n        for (const f of files) {\n            const whole = packs.find((p) => p.m.chunks.length > 1 && p.m.totalBytes === f.size);\n            if (whole) {\n                let offset = 0;\n                for (const c of whole.m.chunks) {\n                    const piece = f.slice(offset, offset + c.bytes);\n                    if ((await hashBlob(piece)) !== c.sha256)\n                        throw new Error(`${f.name}: sha256 mismatch at ${c.name} (wrong or corrupted file)`);\n                    await putChunk(whole.slug, c.name, piece);\n                    fresh.get(whole.slug).add(c.name);\n                    offset += c.bytes;\n                    progress({ done: done + offset, total });\n                }\n                matched++;\n            }\n            else {\n                const sameSize = packs.flatMap((p) => p.m.chunks.filter((c) => c.bytes === f.size).map((c) => ({ slug: p.slug, c })));\n                if (sameSize.length) {\n                    const hex = await hashBlob(f);\n                    const hits = sameSize.filter((x) => x.c.sha256 === hex);\n                    if (!hits.length)\n                        bad.push(f.name);\n                    for (const h of hits) {\n                        await putChunk(h.slug, h.c.name, f);\n                        fresh.get(h.slug).add(h.c.name);\n                    }\n                    if (hits.length)\n                        matched++;\n                }\n            }\n            done += f.size;\n            progress({ done, total });\n        }\n        for (const p of packs)\n            await sealIfComplete(p.slug, fresh.get(p.slug));\n        if (bad.length)\n            throw new Error(`${bad[0]}: sha256 mismatch (wrong or corrupted file)`);\n        if (!matched)\n            throw new Error(\"no-matching-file\");\n        return Promise.all(slugs.map(status));\n    }\n    async function downloadAll(slugs, base, progress) {\n        const total = slugs.reduce((a, s) => a + manifestOf(s).manifest.totalBytes, 0);\n        const have = (await Promise.all(slugs.map(status))).map((st) => st.bytesCached); // \u5DF2\u7ECF\u5728\u7F13\u5B58\u91CC\u7684\u7B97\u5728\u8D77\u70B9\u91CC\n        const report = () => progress({ done: have.reduce((a, b) => a + b, 0), total });\n        report();\n        for (let i = 0; i < slugs.length; i++)\n            await download(slugs[i], base, (p) => { have[i] = p.done; report(); });\n        return Promise.all(slugs.map(status));\n    }\n    async function deletePack(slug) {\n        const { manifest: m } = manifestOf(slug);\n        const cache = await openCache();\n        for (const c of m.chunks)\n            await cache.delete(keyOf(slug, c.name));\n        await cache.delete(keyOf(slug, \"verified.json\"));\n    }\n    const noop = () => { };\n    return {\n        status: (slugs) => Promise.all(slugs.map(status)),\n        download: (slugs, base, onProgress) => downloadAll(slugs, base, onProgress ?? noop),\n        importFiles: (slugs, files, onProgress) => importFiles(slugs, files, onProgress ?? noop),\n        async delete(slugs) { for (const slug of slugs)\n            await deletePack(slug); },\n        async chunks(slug) {\n            if (!(await status(slug)).ready)\n                throw new Error(\"pack-missing\");\n            const { manifest: m } = manifestOf(slug);\n            const cache = await openCache();\n            const out = [];\n            for (const c of m.chunks) {\n                const r = await cache.match(keyOf(slug, c.name));\n                if (!r)\n                    throw new Error(\"pack-missing\");\n                out.push(await r.blob());\n            }\n            return out;\n        },\n    };\n}\n", "// credit-translations.ts \u2014\u2014 \u6708\u8BFB\uFF08\u3064\u304F\u3088\u307F\u3061\u3083\u3093\uFF09\u7F72\u540D\u5757\u4E0E\u4F7F\u7528\u6761\u6B3E\u7684\u4E2D\u6587 / \u82F1\u6587\u8BD1\u6587\uFF08\u53EA\u7ED9\u4EBA\u8BFB\uFF0C**\u4EE5\u65E5\u6587\u539F\u6587\u4E3A\u51C6**\uFF09\u3002created 2026-10-08 by Claude Opus 5.5\n// user 2026-10-08\u300C\u6708\u8BFB\u7684license\u7684\u5C55\u793A\u4F60\u5B88\u7684\u5F88\u7D27\uFF0C\u4F46\u662F\u6CA1\u505A\u7FFB\u8BD1\u300D\u300C\u8FD8\u6709\u82F1\u6587\uFF0C\u4E2D\u56FD\u4EBA\u8FD8\u80FD\u8BFB\u767D\u5B57\u300D\u3002\n// \u539F\u6587 = packs.gen.ts \u7684 CREDIT\uFF08\u6A21\u578B\u4ED3 voices/*.json \u751F\u6210\uFF09\uFF1B\u8BD1\u6587\u6309\u539F\u6587\u7684 sha256 \u9489\u4F4F\uFF1A\u4E0A\u6E38\u6539\u4E86\u539F\u6587 \u2192 test/credit-translations.test.ts \u7EA2 \u2192\n// \u91CD\u8BD1\u518D\u6539\u8FD9\u91CC\u7684\u54C8\u5E0C\uFF08\u4E0D\u8BA9\u8FC7\u671F\u7684\u8BD1\u6587\u5BF9\u7740\u65B0\u539F\u6587\u663E\u793A\uFF09\u3002\u8BBE\u7F6E\u91CC\u7167\u65E7\u5148\u663E\u793A\u539F\u6587\uFF08\u6761\u6B3E\u8981\u6C42\u7684\u662F\u539F\u6587\uFF09\uFF0C\u8BD1\u6587\u5728\u4E0B\u9762\u3001\u6807\u660E\u300C\u4EC5\u4F9B\u9605\u8BFB\u300D\u3002\nexport const CREDIT_TRANSLATIONS = {\n  /** \u8BD1\u81EA\u7684\u539F\u6587\uFF08sha256\uFF09\u3002 */\n  of: {\n    credit: \"5c233b5c7f4d890be860df437d6f5d258bc530f39e0577295651b67ae8072f1f\",\n    terms: \"6c04cd4680d210e6eb189cdc1e5a81b2c65c65510a46eb5708076b612b930887\",\n  },\n  zh: {\n    credit: \"\u672C\u8F6F\u4EF6\u7684\u8BED\u97F3\u5408\u6210\u4F7F\u7528\u4E86\u514D\u8D39\u7D20\u6750\u89D2\u8272\u300C\u3064\u304F\u3088\u307F\u3061\u3083\u3093\u300D\uFF08\u5C0F\u6708\u76F8\uFF1B\u00A9 Rei Yumesaki\uFF09\u514D\u8D39\u516C\u5F00\u7684\u8BED\u97F3\u6570\u636E\u3002\\n\u25A0\u3064\u304F\u3088\u307F\u3061\u3083\u3093\u8BED\u6599\u5E93\uFF08CV. \u5922\u524D\u9ECE\uFF09\\nhttps://tyc.rei-yumesaki.net/material/corpus/\",\n    terms: \"\u4F7F\u7528\u3064\u304F\u3088\u307F\u3061\u3083\u3093\u7684\u58F0\u7EBF\u65F6\uFF0C\u7981\u6B62\u628A\u751F\u6210\u51FA\u6765\u7684\u58F0\u97F3\u7528\u4E8E\u4EE5\u4E0B\u76EE\u7684\u3002\\n\u3010\u7981\u6B62\u4E8B\u9879\u3011\\n\" +\n      \"\u25A0\u6279\u8BC4\u3001\u653B\u51FB\u4ED6\u4EBA\u3002\uFF08\u300C\u6279\u8BC4\u3001\u653B\u51FB\u300D\u7684\u5B9A\u4E49\u4EE5\u3064\u304F\u3088\u307F\u3061\u3083\u3093\u89D2\u8272\u8BB8\u53EF\uFF08\u30AD\u30E3\u30E9\u30AF\u30BF\u30FC\u30E9\u30A4\u30BB\u30F3\u30B9\uFF09\u4E3A\u51C6\uFF09\\n\" +\n      \"\u25A0\u53F7\u53EC\u4EBA\u4EEC\u8D5E\u540C\u6216\u53CD\u5BF9\u7279\u5B9A\u7684\u653F\u6CBB\u7ACB\u573A\u3001\u5B97\u6559\u3001\u601D\u60F3\u3002\\n\" +\n      \"\u25A0\u4E0D\u505A\u533A\u9694\uFF08\u30BE\u30FC\u30CB\u30F3\u30B0\uFF09\u5C31\u516C\u5F00\u523A\u6FC0\u6027\u5F3A\u7684\u5185\u5BB9\u3002\uFF08\u8BD1\u6CE8\uFF1A\u533A\u9694 = \u5206\u7EA7\u3001\u52A0\u63D0\u793A\u3001\u653E\u8FDB\u5355\u72EC\u7684\u5730\u65B9\u7B49\uFF0C\u8BA9\u4E0D\u60F3\u770B\u7684\u4EBA\u78B0\u4E0D\u5230\uFF09\\n\" +\n      \"\u25A0\u4EE5\u5141\u8BB8\u4ED6\u4EBA\u4E8C\u6B21\u5229\u7528\uFF08\u5F53\u4F5C\u7D20\u6750\u4F7F\u7528\uFF09\u7684\u5F62\u5F0F\u516C\u5F00\u3002\",\n  },\n  en: {\n    credit: \"The voice synthesis in this software uses voice data released free of charge by the free-material character \\\"Tsukuyomi-chan\\\" (\u00A9 Rei Yumesaki).\\n\u25A0 Tsukuyomi-chan Corpus (CV: Rei Yumesaki)\\nhttps://tyc.rei-yumesaki.net/material/corpus/\",\n    terms: \"When using Tsukuyomi-chan's voice, you must not use the generated audio for the following purposes.\\n[Prohibited]\\n\" +\n      \"\u25A0 Criticizing or attacking people. (What counts as \\\"criticizing or attacking\\\" follows the Tsukuyomi-chan Character License.)\\n\" +\n      \"\u25A0 Calling on people to support or oppose a particular political position, religion, or ideology.\\n\" +\n      \"\u25A0 Publishing intense or provocative content without zoning. (Translator's note: zoning = age gates, content warnings, separate spaces, so that people who don't want to see it don't run into it.)\\n\" +\n      \"\u25A0 Publishing it in a form that permits others to reuse it (as material for their own works).\",\n  },\n} as const;\n", "// \u751F\u6210\u7269\uFF1Anode scripts/gen-sounds.mjs\uFF08\u6E90 = ../20261007 PWA Sounds \u7684 index.json\uFF09\u3002\u52FF\u624B\u6539\u3002\n// \u97F3\u6E90\u5E93\uFF08pwa-sounds\uFF09= \u8DDF\u4EBA\u8D70\u7684\u58F0\u97F3\u7D20\u6750\uFF0C\u4E0D\u662F AI \u6A21\u578B\uFF1Bapp \u53EA\u5F53\u8D27\u67B6\uFF0C\u9009\u4E2D\u7684\u90A3\u4E00\u4EF6\u5B50\u96C6\u5316\u5D4C\u8FDB\u6B4C\uFF08\u5951\u7EA6 \u00A710.2\uFF09\u3002\u6587\u4EF6\u5230\u624B\u5148\u5BF9\u8FD9\u91CC\u9489\u7684 sha256\u3002\nexport interface SoundEntry { id: string; kind: string; name: string; description?: string; file: string; format: string; bytes: number; sha256: string;\n  license: { name: string; summary?: string; file?: string; bytes?: number; sha256?: string }; attribution: string; homepage?: string; source?: string; date?: string; notes?: string }\n/** \u51FA\u5382\u9884\u586B\u7684\u97F3\u6E90\u5E93\u5730\u5740\uFF08\u8BBE\u7F6E\u91CC\u80FD\u6539\uFF1B\u5148\u627E\u540C\u6E90 pwa-sounds/\uFF09\u3002 */\nexport const SOUNDS_SOURCE_DEFAULT = \"https://fangzhangmnm.github.io/pwa-sounds\";\nexport const SOUNDS: Record<string, SoundEntry> = {\n \"generaluser-gs-2.0.3\": {\n  \"id\": \"generaluser-gs-2.0.3\",\n  \"kind\": \"instrument\",\n  \"name\": \"GeneralUser GS 2.0.3\",\n  \"description\": \"GM / GS \u901A\u7528\u97F3\u8272\u5E93\uFF1A287 \u4EF6\u4E50\u5668\uFF08bank 0 \u7684 128 \u4EF6 + GS \u53D8\u4F53\uFF09\u542B 13 \u5957\u9F13\u7EC4\uFF08bank 128\uFF09\",\n  \"file\": \"generaluser-gs-2.0.3/GeneralUser-GS.sf2\",\n  \"format\": \"SoundFont 2\",\n  \"bytes\": 32319396,\n  \"sha256\": \"9575028c7a1f589f5770fccc8cff2734566af40cd26ed836944e9a5152688cfe\",\n  \"license\": {\n   \"name\": \"GeneralUser GS License v2.0\",\n   \"summary\": \"\u79C1\u7528\u5546\u7528\u968F\u4FBF\u7528\uFF1B\u53EF\u653E\u8FDB\u8F6F\u4EF6\u9879\u76EE\u3001\u53EF\u6539\u5305\u88C5\uFF1B\u522B\u76F4\u94FE\u4F5C\u8005\u7684\u4E0B\u8F7D\u6587\u4EF6\uFF08\u8981\u4E48\u94FE\u4ED6\u7F51\u7AD9\uFF0C\u8981\u4E48\u81EA\u5DF1\u653E\u4E00\u4EFD\uFF09\uFF1B\u4E0D\u5F3A\u5236\u7F72\u540D\",\n   \"file\": \"generaluser-gs-2.0.3/LICENSE.txt\",\n   \"bytes\": 2317,\n   \"sha256\": \"7b32efefdf95ce38a043799f0659853ddc00fbaa14d8c50f0aca16b9b8b405be\"\n  },\n  \"attribution\": \"GeneralUser GS 2.0.3 by S. Christian Collins\",\n  \"homepage\": \"https://www.schristiancollins.com/generaluser.php\",\n  \"source\": \"https://github.com/mrbumpy409/GeneralUser-GS\",\n  \"date\": \"2026-02-22\",\n  \"notes\": \"\u5B57\u8282 = \u4E0A\u6E38\u4ED3\u539F\u6837\uFF08\u6587\u4EF6\u5185 INAM \u5199\u7684\u662F\u300C2.0.3 BETA\u300D\uFF0C2.0.3 \u6B63\u5F0F\u7248\u91CC\u5C31\u662F\u8FD9\u4E2A\u5B57\u4E32\uFF09\u3002\u6B8B\u4F59\u98CE\u9669\u6309\u4F5C\u8005\u539F\u8BDD\uFF1A\u90E8\u5206\u91C7\u6837\u6765\u6E90\u4ED6\u4E0D\u80FD 100% \u786E\u5B9A\uFF0C2000 \u5E74\u81F3\u4ECA\u6CA1\u4EBA\u6295\u8BC9\u3002\"\n }\n};\n", "// sound-cache.ts \u2014\u2014 \u97F3\u6E90\u5E93\u6587\u4EF6\uFF08sf2 \u7B49\uFF09\u7684\u7F13\u5B58\uFF1A\u672C\u6B21\u6253\u5F00\u7684\u5185\u5B58 + \u6301\u4E45\u7684 Cache Storage `pwa-sounds`\uFF08\u6309 sha256 \u5B58\uFF1B\u548C AI \u6A21\u578B\u7684 `pwa-models` \u5206\u5F00\u2014\u2014\u97F3\u6E90\u4E0D\u662F AI \u6A21\u578B\uFF09\u3002\n// created 2026-10-07 by Claude Fable 5.1\u3002user 2026-10-07\u300C\u4E3A\u4EC0\u4E48\u6BCF\u6B21\u52A0\u4E50\u5668\u90FD\u4F1A\u91CD\u65B0\u4E0B\u4E00\u4E0BGS\uFF0C\u4E5F\u8BB8\u6211\u4EEC\u8FD8\u662F\u505A\u4E00\u4E2Acache\u6BD4\u8F83\u597D\uFF1F\u300D\u300C\u6211\u89C9\u5F97\u8FD8\u662Fidb\u6709\u7F13\u5B58\u5427\uFF0C\u53EF\u4EE5\u7F13\u5B58\u6307\u5B9A\u7684\u5305\uFF0C\u4E0D\u7136\u6CA1\u7F51\u7684\u65F6\u5019\u5F88\u9EBB\u70E6\u300D\u3002\n// \u00B7 \u7528\u7684\u662F Cache Storage \u4E0D\u662F IndexedDB\uFF1A\u548C\u6A21\u578B\u5305\u540C\u4E00\u79CD\u673A\u5236\uFF08iOS \u4E0A\u9A8C\u8BC1\u8FC7\u3001\u6309\u5B57\u8282\u5B58\u53D6\u6700\u7701\u4E8B\uFF09\uFF1B\u5BF9\u300C\u6CA1\u7F51\u4E5F\u80FD\u7528\u300D\u7684\u76EE\u7684\u4E00\u6837\u3002\n// \u00B7 \u5BB6\u65CF\u5171\u4EAB\u540D `pwa-sounds`\uFF08\u540C\u57DF\u540D\u7684\u5144\u5F1F app \u4EE5\u540E\u4E5F\u80FD\u7528\u540C\u4E00\u4EFD GeneralUser\uFF09\uFF1Bapp \u7684\u300C\u6E05\u7F13\u5B58\u300D\u4E0D\u78B0\u5B83\uFF0C\u53EA\u5728\u8BBE\u7F6E\u91CC\u9010\u6761\u5220\uFF08\u5BB6\u89C4\uFF1A\u5171\u4EAB\u7F13\u5B58\u53EA\u80FD\u9010\u5305\u5220\uFF09\u3002\n// \u00B7 \u4FE1\u4EFB\u6839\u4ECD\u662F app \u5185\u5D4C\u76EE\u5F55\u9489\u7684 sha256\uFF1A\u5B58\u8FDB\u53BB\u524D\u6838\u8FC7\uFF0C\u53D6\u51FA\u6765\u518D\u6838\u4E00\u6B21\uFF08\u51E0\u5341\u6BEB\u79D2\uFF0C\u6362\u4E00\u53E5\u300C\u5B57\u8282\u5230\u624B\u5148\u6838\u300D\u7684\u8E0F\u5B9E\uFF09\u3002\n// \u00B7 \u6CA1\u6709 Cache API\uFF08file:// / \u9690\u79C1\u6A21\u5F0F\uFF09= \u53EA\u6709\u5185\u5B58\uFF0C\u9759\u9ED8\u964D\u7EA7\uFF08\u8FD9\u6B21\u6253\u5F00\u91CC\u4E0D\u91CD\u4E0B\uFF0C\u4E0B\u6B21\u91CD\u4E0B\uFF09\u3002\nconst CACHE = \"pwa-sounds\";\nconst keyOf = (sha256: string) => `${location.origin}/__pwa-sounds__/${sha256}`;\nconst MEM_MAX = 2;   // \u5185\u5B58\u91CC\u6700\u591A\u7559\u51E0\u4EFD\u6574\u5305\uFF0832 MB \u4E00\u4EFD\uFF09\nconst memory = new Map<string, Uint8Array>();\n\nconst hasCaches = () => typeof caches !== \"undefined\";\nconst sha256Hex = async (b: Uint8Array) => [...new Uint8Array(await crypto.subtle.digest(\"SHA-256\", b as unknown as BufferSource))].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\");\n\nfunction rememberInMemory(sha256: string, bytes: Uint8Array): void {\n  memory.delete(sha256); memory.set(sha256, bytes);\n  while (memory.size > MEM_MAX) memory.delete(memory.keys().next().value!);\n}\n/** \u5185\u5B58 \u2192 \u6301\u4E45\u7F13\u5B58\uFF1B\u90FD\u6CA1\u6709 = null\u3002\u6301\u4E45\u7F13\u5B58\u91CC\u7684\u5B57\u8282\u5148\u6838 sha256 \u518D\u7ED9\uFF08\u4E0D\u5BF9 = \u5220\u6389\u3001\u5F53\u6CA1\u6709\uFF09\u3002 */\nexport async function cachedSound(sha256: string): Promise<Uint8Array | null> {\n  const m = memory.get(sha256); if (m) { rememberInMemory(sha256, m); return m; }\n  if (!hasCaches()) return null;\n  try {\n    const c = await caches.open(CACHE), r = await c.match(keyOf(sha256)); if (!r) return null;\n    const bytes = new Uint8Array(await r.arrayBuffer());\n    if ((await sha256Hex(bytes)) !== sha256) { await c.delete(keyOf(sha256)); return null; }\n    rememberInMemory(sha256, bytes); return bytes;\n  } catch { return null; }\n}\n/** \u8BB0\u4F4F\u4E00\u4EFD\u5DF2\u6838\u8FC7 sha256 \u7684\u5B57\u8282\uFF1A\u5185\u5B58\u4E00\u5B9A\uFF1Bpersist = \u4E5F\u8FDB\u6301\u4E45\u7F13\u5B58\uFF08\u7559\u7740\u79BB\u7EBF\u7528\uFF09\u3002 */\nexport async function rememberSound(sha256: string, bytes: Uint8Array, persist: boolean): Promise<void> {\n  rememberInMemory(sha256, bytes);\n  if (!persist || !hasCaches()) return;\n  try { const c = await caches.open(CACHE); await c.put(keyOf(sha256), new Response(bytes as unknown as BodyInit, { headers: { \"Content-Type\": \"application/octet-stream\", \"Content-Length\": String(bytes.length) } })); } catch { /* \u914D\u989D\u4E0D\u591F\u7B49\uFF1A\u53EA\u5728\u5185\u5B58\u91CC */ }\n}\n/** \u6301\u4E45\u7F13\u5B58\u91CC\u6709\u54EA\u4E9B\uFF08sha256 + \u5927\u5C0F\uFF09\u3002 */\nexport async function listCachedSounds(): Promise<{ sha256: string; bytes: number }[]> {\n  if (!hasCaches()) return [];\n  try {\n    const c = await caches.open(CACHE), keys = await c.keys(), out: { sha256: string; bytes: number }[] = [];\n    for (const k of keys) {\n      const sha256 = k.url.slice(k.url.lastIndexOf(\"/\") + 1), r = await c.match(k);\n      out.push({ sha256, bytes: Number(r?.headers.get(\"Content-Length\") ?? 0) });\n    }\n    return out;\n  } catch { return []; }\n}\nexport async function isSoundPersisted(sha256: string): Promise<boolean> {\n  if (!hasCaches()) return false;\n  try { return !!(await (await caches.open(CACHE)).match(keyOf(sha256))); } catch { return false; }\n}\n/** \u4ECE\u6301\u4E45\u7F13\u5B58\u548C\u5185\u5B58\u91CC\u90FD\u5220\u6389\uFF08\u4EBA\u5220\u7684\uFF09\u3002 */\nexport async function forgetSound(sha256: string): Promise<void> {\n  memory.delete(sha256);\n  if (!hasCaches()) return;\n  try { await (await caches.open(CACHE)).delete(keyOf(sha256)); } catch { /* \u6CA1\u6709\u5C31\u7B97\u4E86 */ }\n}\n/** \u653E\u6389\u5185\u5B58\u91CC\u7684\u6574\u5305\uFF08user\u300C\u4F60\u9700\u8981\u80FD\u624B\u52A8\u91CA\u653E\u7F13\u5B58\u7A7A\u95F4\u300D\uFF09\uFF1B\u6301\u4E45\u7F13\u5B58\u4E0D\u52A8\u3002 */\nexport function releaseSoundMemory(): void { memory.clear(); }\n/** \u5185\u5B58\u91CC\u73B0\u5728\u5360\u7740\u591A\u5C11\u5B57\u8282\uFF08\u6574\u5305\uFF09\u3002 */\nexport function soundMemoryBytes(): number { let n = 0; for (const b of memory.values()) n += b.length; return n; }\n\n/** \u7AD9\u70B9\u5B58\u50A8\u914D\u989D\uFF08\u53EA\u8BFB\u663E\u793A\u7528\uFF1B\u8BBE\u7F6E\u300C\u97F3\u6E90\u5E93\u7F13\u5B58\u300D\u90A3\u884C\uFF09\u3002\u6CA1\u6709 API / \u5931\u8D25 = null\u3002 */\nexport async function siteStorageEstimate(): Promise<{ usage: number; quota: number } | null> {\n  try { const est = await navigator.storage?.estimate?.(); return est?.usage !== undefined && est.quota ? { usage: est.usage, quota: est.quota } : null; } catch { return null; }\n}\n", "// sf2-subset.ts \u2014\u2014 SoundFont 2 \u5B50\u96C6\u5316\uFF1A\u53EA\u7559\u51E0\u4E2A\u9884\u8BBE\uFF08bank / program\uFF09\u548C\u5B83\u4EEC\u7528\u5230\u7684\u4E50\u5668\u3001\u91C7\u6837\uFF0C\u91CD\u5199\u6210\u4E00\u4E2A\u5C0F\u7684\u3001\u6807\u51C6\u7684 .sf2\u3002\u7EAF\u51FD\u6570\uFF0CNode \u91CC\u53EF\u6D4B\u3002\n// created 2026-10-07 by Claude Fable 5.1\u3002\u5951\u7EA6\u8349\u7A3F \u00A710.2\uFF1A\u6837\u672C\u7C7B\u97F3\u6E90 by value \u5D4C\u8FDB\u6B4C = \u300C\u53EA\u5D4C\u8FD9\u9996\u6B4C\u7528\u5230\u7684 preset \u53CA\u5176\u6837\u672C\uFF08\u50CF PDF \u5D4C\u5B57\u4F53\u5B50\u96C6\uFF09\u300D\u3002\n// \u89C4\u683C\u4F9D\u636E SoundFont 2.04 spec\uFF08RIFF\uFF1AINFO / sdta{smpl, sm24?} / pdta{phdr pbag pmod pgen inst ibag imod igen shdr}\uFF09\u3002\n// \u00B7 \u5B50\u96C6\u51FA\u6765\u7684\u58F0\u97F3\u548C\u6574\u5305\u9010\u6837\u672C\u76F8\u540C\uFF08test/sf2.test.ts \u7528 TinySoundFont \u6838\uFF09\uFF1A\u91C7\u6837\u5B57\u8282\u3001\u751F\u6210\u5668\u3001\u8C03\u5236\u5668\u5168\u90E8\u539F\u6837\u642C\uFF0C\u53EA\u91CD\u7F16\u53F7\u3002\n// \u00B7 INFO \u5757\u539F\u6837\u4FDD\u7559\uFF08GeneralUser GS \u628A\u8BB8\u53EF\u8BC1\u5199\u5728 ICMT \u91CC\uFF0C\u8DDF\u7740\u5B50\u96C6\u8D70\u2014\u2014vault \u6587\u6863\u8981\u7684\u51FA\u5904\u6B63\u597D\u5728\u91CC\u9762\uFF09\u3002\n// \u00B7 24 \u4F4D\u7684\u4F4E\u5B57\u8282\u5757 sm24 \u4E0D\u5E26\uFF08\u5B50\u96C6\u964D\u4E3A 16 \u4F4D\uFF1BGeneralUser GS \u672C\u6765\u5C31\u6CA1\u6709\uFF09\u3002\n// \u00B7 \u786E\u5B9A\u6027\uFF1A\u540C\u6837\u7684\u8F93\u5165 + \u540C\u6837\u7684\u9884\u8BBE\u6E05\u5355 \u2192 \u540C\u6837\u7684\u5B57\u8282\uFF08\u4E50\u5668 / \u91C7\u6837\u6309\u539F\u4E0B\u6807\u6392\u5E8F\uFF09\u3002\n\nexport interface Sf2PresetId { bank: number; program: number }\nexport interface Sf2PresetInfo extends Sf2PresetId { name: string }\n\nconst REC = { phdr: 38, pbag: 4, pmod: 10, pgen: 4, inst: 22, ibag: 4, imod: 10, igen: 4, shdr: 46 } as const;\ntype PdtaName = keyof typeof REC;\nconst GEN_INSTRUMENT = 41, GEN_SAMPLE_ID = 53;\nconst ZERO_TAIL = 46;   // spec: at least 46 zero sample points after every sample\n\ninterface Chunk { off: number; size: number }   // off = \u6570\u636E\u8D77\u70B9\uFF08\u8DF3\u8FC7 8 \u5B57\u8282\u5934\uFF09\ninterface Parsed { info: Uint8Array; smpl: Chunk; pdta: Record<PdtaName, Chunk> }\n\nconst tag = (b: Uint8Array, o: number) => String.fromCharCode(b[o], b[o + 1], b[o + 2], b[o + 3]);\n/** \u540C\u4E00\u5757\u5185\u5B58\u4E0A\u7684\u6807\u51C6 Uint8Array \u89C6\u56FE\uFF1ANode \u7684 Buffer \u628A slice \u6539\u6210\u4E86\u300C\u4E0D\u62F7\u8D1D\u300D\uFF0C\u4E0B\u9762 copy() \u9760 slice \u62F7\u51FA\u8BB0\u5F55\u518D\u6539\uFF0C\u62FF\u5230 Buffer \u4F1A\u628A\u8C03\u7528\u65B9\u7684\u6574\u5305\u6539\u574F\u3002 */\nconst plain = (b: Uint8Array) => (b.constructor === Uint8Array ? b : new Uint8Array(b.buffer, b.byteOffset, b.byteLength));\n\nfunction parse(b: Uint8Array): Parsed {\n  const dv = new DataView(b.buffer, b.byteOffset, b.byteLength);\n  if (tag(b, 0) !== \"RIFF\" || tag(b, 8) !== \"sfbk\") throw new Error(\"sf2: not a SoundFont 2 file\");\n  let info: Uint8Array | null = null, smpl: Chunk | null = null;\n  const pdta = {} as Record<PdtaName, Chunk>;\n  let o = 12;\n  while (o + 8 <= b.length) {\n    const id = tag(b, o), size = dv.getUint32(o + 4, true), data = o + 8;\n    if (id === \"LIST\") {\n      const kind = tag(b, data);\n      if (kind === \"INFO\") info = b.subarray(o, data + size);\n      else {\n        let p = data + 4;\n        while (p + 8 <= data + size) {\n          const sid = tag(b, p), ssize = dv.getUint32(p + 4, true);\n          if (kind === \"sdta\" && sid === \"smpl\") smpl = { off: p + 8, size: ssize };\n          if (kind === \"pdta\" && sid in REC) pdta[sid as PdtaName] = { off: p + 8, size: ssize };\n          p += 8 + ssize + (ssize & 1);\n        }\n      }\n    }\n    o = data + size + (size & 1);\n  }\n  if (!info || !smpl) throw new Error(\"sf2: missing INFO or sample data\");\n  for (const k of Object.keys(REC) as PdtaName[]) if (!pdta[k]) throw new Error(`sf2: missing ${k}`);\n  return { info, smpl, pdta };\n}\n\nconst nameOf = (b: Uint8Array, o: number) => { let s = \"\"; for (let i = 0; i < 20 && b[o + i]; i++) s += String.fromCharCode(b[o + i]); return s; };\n\n/** \u5217\u51FA\u4E00\u4E2A sf2 \u91CC\u7684\u9884\u8BBE\uFF08\u4E0D\u542B\u672B\u5C3E\u7684 EOP\uFF09\u3002 */\nexport function listSf2Presets(input: Uint8Array): Sf2PresetInfo[] {\n  const bytes = plain(input);\n  const { pdta } = parse(bytes), dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const n = pdta.phdr.size / REC.phdr - 1, out: Sf2PresetInfo[] = [];\n  for (let i = 0; i < n; i++) { const o = pdta.phdr.off + i * REC.phdr; out.push({ name: nameOf(bytes, o), program: dv.getUint16(o + 20, true), bank: dv.getUint16(o + 22, true) }); }\n  return out;\n}\n\n/** \u53EA\u7559 want \u91CC\u7684\u9884\u8BBE\u3002\u7F3A\u7684\u9884\u8BBE = \u629B\u9519\uFF08\u8C03\u7528\u65B9\u51B3\u5B9A\u600E\u4E48\u62A5\uFF09\u3002 */\nexport function subsetSf2(input: Uint8Array, want: readonly Sf2PresetId[]): Uint8Array {\n  const bytes = plain(input);\n  const { info, smpl, pdta } = parse(bytes), dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n  const count = (k: PdtaName) => pdta[k].size / REC[k];\n  const at = (k: PdtaName, i: number) => pdta[k].off + i * REC[k];\n  const u16 = (k: PdtaName, i: number, field: number) => dv.getUint16(at(k, i) + field, true);\n  // 1. \u9009\u9884\u8BBE\n  const nP = count(\"phdr\") - 1;\n  const wantKey = new Set(want.map((w) => `${w.bank}:${w.program}`));\n  const presets: number[] = [];\n  for (let i = 0; i < nP; i++) if (wantKey.has(`${u16(\"phdr\", i, 22)}:${u16(\"phdr\", i, 20)}`)) presets.push(i);\n  const found = new Set(presets.map((i) => `${u16(\"phdr\", i, 22)}:${u16(\"phdr\", i, 20)}`));\n  const missing = [...wantKey].filter((k) => !found.has(k));\n  if (missing.length) throw new Error(`sf2: presets not in this bank: ${missing.join(\", \")}`);\n  // 2. \u9884\u8BBE \u2192 \u4E50\u5668\n  const instSet = new Set<number>();\n  for (const i of presets) for (let b = u16(\"phdr\", i, 24); b < u16(\"phdr\", i + 1, 24); b++)\n    for (let g = u16(\"pbag\", b, 0); g < u16(\"pbag\", b + 1, 0); g++) if (u16(\"pgen\", g, 0) === GEN_INSTRUMENT) instSet.add(u16(\"pgen\", g, 2));\n  const insts = [...instSet].sort((a, b) => a - b), instMap = new Map(insts.map((v, i) => [v, i]));\n  // 3. \u4E50\u5668 \u2192 \u91C7\u6837\uFF08\u542B\u7ACB\u4F53\u58F0\u53E6\u4E00\u534A\uFF09\n  const nS = count(\"shdr\") - 1, sampleSet = new Set<number>();\n  for (const j of insts) for (let b = u16(\"inst\", j, 20); b < u16(\"inst\", j + 1, 20); b++)\n    for (let g = u16(\"ibag\", b, 0); g < u16(\"ibag\", b + 1, 0); g++) if (u16(\"igen\", g, 0) === GEN_SAMPLE_ID) sampleSet.add(u16(\"igen\", g, 2));\n  for (const s of [...sampleSet]) { const type = u16(\"shdr\", s, 44), link = u16(\"shdr\", s, 42); if ((type & 0x0e) && link < nS) sampleSet.add(link); }\n  const samples = [...sampleSet].sort((a, b) => a - b), sampleMap = new Map(samples.map((v, i) => [v, i]));\n  // 4. \u91CD\u5199 pdta\n  const out: Record<PdtaName, number[]> = { phdr: [], pbag: [], pmod: [], pgen: [], inst: [], ibag: [], imod: [], igen: [], shdr: [] };\n  const copy = (k: PdtaName, i: number, patch?: (rec: Uint8Array) => void) => { const rec = bytes.slice(at(k, i), at(k, i) + REC[k]); patch?.(rec); out[k].push(...rec); };\n  const w16 = (rec: Uint8Array, o: number, v: number) => { rec[o] = v & 0xff; rec[o + 1] = (v >> 8) & 0xff; };\n  const w32 = (rec: Uint8Array, o: number, v: number) => { w16(rec, o, v & 0xffff); w16(rec, o + 2, (v >>> 16) & 0xffff); };\n  let nBag = 0, nGen = 0, nMod = 0;\n  for (const i of presets) {\n    copy(\"phdr\", i, (r) => w16(r, 24, nBag));\n    for (let b = u16(\"phdr\", i, 24); b < u16(\"phdr\", i + 1, 24); b++) {\n      copy(\"pbag\", b, (r) => { w16(r, 0, nGen); w16(r, 2, nMod); }); nBag++;\n      for (let g = u16(\"pbag\", b, 0); g < u16(\"pbag\", b + 1, 0); g++) { copy(\"pgen\", g, (r) => { if (u16(\"pgen\", g, 0) === GEN_INSTRUMENT) w16(r, 2, instMap.get(u16(\"pgen\", g, 2))!); }); nGen++; }\n      for (let m = u16(\"pbag\", b, 2); m < u16(\"pbag\", b + 1, 2); m++) { copy(\"pmod\", m); nMod++; }\n    }\n  }\n  copy(\"phdr\", nP, (r) => w16(r, 24, nBag));   // EOP\n  out.pbag.push(...new Uint8Array(REC.pbag)); const pb = out.pbag.length - REC.pbag; out.pbag[pb] = nGen & 0xff; out.pbag[pb + 1] = nGen >> 8; out.pbag[pb + 2] = nMod & 0xff; out.pbag[pb + 3] = nMod >> 8;\n  out.pgen.push(...new Uint8Array(REC.pgen)); out.pmod.push(...new Uint8Array(REC.pmod));\n  nBag = 0; nGen = 0; nMod = 0;\n  for (const j of insts) {\n    copy(\"inst\", j, (r) => w16(r, 20, nBag));\n    for (let b = u16(\"inst\", j, 20); b < u16(\"inst\", j + 1, 20); b++) {\n      copy(\"ibag\", b, (r) => { w16(r, 0, nGen); w16(r, 2, nMod); }); nBag++;\n      for (let g = u16(\"ibag\", b, 0); g < u16(\"ibag\", b + 1, 0); g++) { copy(\"igen\", g, (r) => { if (u16(\"igen\", g, 0) === GEN_SAMPLE_ID) w16(r, 2, sampleMap.get(u16(\"igen\", g, 2))!); }); nGen++; }\n      for (let m = u16(\"ibag\", b, 2); m < u16(\"ibag\", b + 1, 2); m++) { copy(\"imod\", m); nMod++; }\n    }\n  }\n  copy(\"inst\", count(\"inst\") - 1, (r) => w16(r, 20, nBag));   // EOI\n  out.ibag.push(...new Uint8Array(REC.ibag)); const ib = out.ibag.length - REC.ibag; out.ibag[ib] = nGen & 0xff; out.ibag[ib + 1] = nGen >> 8; out.ibag[ib + 2] = nMod & 0xff; out.ibag[ib + 3] = nMod >> 8;\n  out.igen.push(...new Uint8Array(REC.igen)); out.imod.push(...new Uint8Array(REC.imod));\n  // 5. \u91C7\u6837\uFF1A\u5207\u51FA\u6BCF\u6BB5 + 46 \u4E2A\u96F6\uFF0Cshdr \u91CC\u7684\u4F4D\u7F6E\u91CD\u7B97\n  const pieces: Uint8Array[] = []; let pos = 0;\n  const u32 = (k: PdtaName, i: number, field: number) => dv.getUint32(at(k, i) + field, true);\n  for (const s of samples) {\n    const start = u32(\"shdr\", s, 20), end = u32(\"shdr\", s, 24), len = end - start;\n    copy(\"shdr\", s, (r) => {\n      w32(r, 20, pos); w32(r, 24, pos + len); w32(r, 28, pos + (u32(\"shdr\", s, 28) - start)); w32(r, 32, pos + (u32(\"shdr\", s, 32) - start));\n      const link = u16(\"shdr\", s, 42), ns = sampleMap.get(link);\n      if (ns === undefined) { w16(r, 42, 0); w16(r, 44, 1); } else w16(r, 42, ns);   // \u53E6\u4E00\u534A\u6CA1\u8FDB\u6765 = \u5F53\u5355\u58F0\u9053\n    });\n    pieces.push(bytes.subarray(smpl.off + start * 2, smpl.off + end * 2), new Uint8Array(ZERO_TAIL * 2));\n    pos += len + ZERO_TAIL;\n  }\n  copy(\"shdr\", nS);   // EOS\n  // 6. \u62FC RIFF\n  const chunk = (id: string, data: Uint8Array | number[]): Uint8Array => {\n    const d = data instanceof Uint8Array ? data : Uint8Array.from(data), pad = d.length & 1;\n    const r = new Uint8Array(8 + d.length + pad); r.set([...id].map((c) => c.charCodeAt(0)), 0); new DataView(r.buffer).setUint32(4, d.length, true); r.set(d, 8); return r;\n  };\n  const list = (kind: string, parts: Uint8Array[]): Uint8Array => chunk(\"LIST\", concat([Uint8Array.from([...kind].map((c) => c.charCodeAt(0))), ...parts]));\n  const sdta = list(\"sdta\", [chunk(\"smpl\", concat(pieces))]);\n  const pdtaOut = list(\"pdta\", (Object.keys(REC) as PdtaName[]).map((k) => chunk(k, out[k])));\n  const body = concat([Uint8Array.from([...\"sfbk\"].map((c) => c.charCodeAt(0))), info, sdta, pdtaOut]);\n  return chunk(\"RIFF\", body);\n}\n\nfunction concat(parts: Uint8Array[]): Uint8Array {\n  const n = parts.reduce((s, p) => s + p.length, 0), r = new Uint8Array(n); let o = 0;\n  for (const p of parts) { r.set(p, o); o += p.length; }\n  return r;\n}\n\n/** INFO \u5757\u91CC\u7ED9\u4EBA\u770B\u7684\u5B57\uFF08SoundFont 2.04 \u00A75\uFF09\uFF1AINAM \u540D\u5B57\u3001IENG \u4F5C\u8005\u3001ICOP \u7248\u6743\u3001ICMT \u6CE8\u91CA\uFF08GeneralUser GS \u628A\u8BB8\u53EF\u8BC1\u5199\u5728\u8FD9\u91CC\uFF09\u3002\u6CA1\u6709\u7684\u4E0D\u51FA\u73B0\u3002 */\nexport function sf2Info(input: Uint8Array): { name?: string; engineer?: string; copyright?: string; comment?: string; product?: string } {\n  const bytes = plain(input), { info } = parse(bytes), dv = new DataView(info.buffer, info.byteOffset, info.byteLength);\n  const out: Record<string, string> = {}, map: Record<string, string> = { INAM: \"name\", IENG: \"engineer\", ICOP: \"copyright\", ICMT: \"comment\", IPRD: \"product\" };\n  let p = 12;   // \u8DF3\u8FC7 LIST + size + \"INFO\"\n  while (p + 8 <= info.length) {\n    const id = tag(info, p), size = dv.getUint32(p + 4, true), key = map[id];\n    if (key) { let s = \"\"; for (let i = 0; i < size && info[p + 8 + i]; i++) s += String.fromCharCode(info[p + 8 + i]); out[key] = s.trim(); }\n    p += 8 + size + (size & 1);\n  }\n  return out;\n}\n", "// sha256.ts \u2014\u2014 \u5B57\u8282\u7684 sha256\uFF08\u5341\u516D\u8FDB\u5236\uFF09\uFF1A\u97F3\u6E90\u5305 / \u5B50\u96C6 / \u6A21\u578B\u5206\u7247\u5230\u624B\u5148\u6838\u7684\u90A3\u628A\u5C3A\u5B50\u3002created 2026-10-15 by Claude Fable 5.1\uFF08\u4ECE src/app/main.ts \u642C\u6765\uFF0C\u5200 4 \u97F3\u6E90\u6765\u6E90\u63A5\u7F1D\uFF09\nexport const sha256Hex = async (b: Uint8Array): Promise<string> => [...new Uint8Array(await crypto.subtle.digest(\"SHA-256\", b as unknown as BufferSource))].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\");\n", "// sounds.ts \u2014\u2014 \u97F3\u6E90\u4ECE\u54EA\u6765 + \u5F31\u5F15\u7528\u600E\u4E48\u89E3\u6790\uFF08\u5BB6\u65CF\u97F3\u6E90\u5E93 pwa-sounds = \u9EC4\u7EBF\u767D\u540D\u5355 \u2462\uFF1A\u53EA\u8BFB GET\u3001\u5230\u624B\u6838\u76EE\u5F55\u9489\u7684 sha256\uFF1BADR-0006 \u2462 \u53CD\u5F03\u5751\uFF1A\u51FA\u5382\u9884\u586B\u3001\u8BBE\u7F6E\u91CC\u80FD\u6539\uFF09\u3002\n// created 2026-10-15 by Claude Fable 5.1\uFF08\u5200 4 \u97F3\u6E90\u6765\u6E90\u63A5\u7F1D\uFF1A\u4ECE src/app/main.ts \u539F\u6837\u642C\u6765\uFF0C\u884C\u4E3A\u4E0D\u53D8\uFF1Buser 2026-10-08\u300C\u6211\u540E\u6094\u81EA\u52A8 embed \u97F3\u6E90\u4E86\uFF0C\u6539\u6210\u5F31\u5F15\u7528\u5427\uFF0Capp \u53EF\u4EE5\u81EA\u5DF1\u627E\u5417\u300D\uFF09\u3002\n//   \u89E3\u6790\u94FE\uFF1A\u6B4C\u91CC\u5D4C\u7684 \u2192 \u672C\u6B21\u5DF2\u89E3\u6790\u7684\uFF08session\uFF09\u2192 \u8BBE\u5907\u7559\u7740\u7684\u5B50\u96C6 \u2192 \u8BBE\u5907\u7559\u7740\u7684\u6574\u5305 / \u5BB6\u65CF\u97F3\u6E90\u5E93\uFF08\u6309\u6574\u5305 sha256 \u5BF9\u6761\u76EE\uFF09\u2192 \u5207\u5B50\u96C6\u6838 sha256 \u2192 \u90FD\u6CA1\u6709 = \u629B\u9519\uFF08\u6CA1\u4EBA\u4E0A\u573A\u3001\u62A5\u51FA\u6765\u3001\u4EBA\u6362\uFF1B\u4E0D\u66FF\u8865\uFF09\u3002\nimport { SOUNDS, SOUNDS_SOURCE_DEFAULT, type SoundEntry } from \"../gm/sounds.gen.ts\";\nimport { cachedSound, rememberSound } from \"../gm/sound-cache.ts\";\nimport { subsetSf2 } from \"../gm/sf2-subset.ts\";\nimport type { GmCandidate } from \"../format/project.ts\";\nimport { sha256Hex } from \"./sha256.ts\";\n\nexport interface SoundSources {\n  /** \u8BBE\u7F6E\u91CC\u586B\u7684\u97F3\u6E90\u5E93\u6765\u6E90\uFF08\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\uFF1B\u7A7A = \u51FA\u5382\u9ED8\u8BA4\uFF09\u3002 */\n  source: string;\n  /** \u9010\u4E2A\u8BD5\u7684\u5730\u5740\uFF1A\u540C\u4E00\u4E2A\u7F51\u7AD9\u4E0B\u7684 pwa-sounds/ \u5148\uFF0C\u518D\u8BBE\u7F6E\u91CC\u7684\u3002 */\n  bases(): string[];\n  /** \u4ECE\u97F3\u6E90\u5E93\u62FF\u4E00\u4E2A\u6587\u4EF6\uFF1A\u9010\u4E2A\u5730\u5740\u8BD5\uFF0C\u6D41\u5F0F\u8BFB\uFF08\u62A5\u8FDB\u5EA6\uFF09\uFF0C\u5230\u624B\u5BF9\u76EE\u5F55\u91CC\u9489\u7684 sha256\uFF08\u4E0D\u5BF9 = \u4E0D\u7528\u3001\u62A5\u51FA\u6765\uFF09\uFF1B\u6838\u8FC7\u624D\u7559\u5728\u8BBE\u5907\u4E0A\u3002 */\n  fetchSound(e: SoundEntry, onProgress: (done: number) => void): Promise<Uint8Array>;\n  /** \u62FF\u5230\u4E00\u4E2A SoundFont \u5019\u9009\u7684\u5B50\u96C6\u5B57\u8282\uFF08\u5F31\u5F15\u7528\u89E3\u6790\u94FE\uFF09\uFF1B\u90FD\u627E\u4E0D\u5230 = \u629B\u9519\u3002 */\n  resolveGmBytes(g: GmCandidate): Promise<Uint8Array>;\n  /** \u672C\u6B21\u6253\u5F00\u91CC\u89E3\u6790\u5230 / \u52A0\u8FDB\u6765\u7684\u5B50\u96C6\uFF08subsetSha256 \u2192 \u5B57\u8282\uFF09\uFF1Akeep = \u8BB0\u4E0B\uFF08\u9A6C\u4E0A\u80FD\u54CD\uFF09\uFF1Bdrop = \u5FD8\u6389\uFF08\u4EBA\u7ED9\u4E86\u65B0\u6587\u4EF6\uFF0C\u4E0B\u6B21\u91CD\u65B0\u89E3\u6790\uFF09\u3002 */\n  session: { keep(sha256: string, bytes: Uint8Array): void; drop(sha256: string): void; has(sha256: string): boolean; get(sha256: string): Uint8Array | undefined };\n}\n\nexport function createSoundSources(o: { progress(msg: string): void; /** \u62A5\u9519\u91CC\u63D0\u5230\u7684\u300C\u8C01\u300D\uFF1A\u5149\u6807\u6240\u5728\u58F0\u90E8\u7684\u540D\u5B57\uFF08\u539F\u6765\u7684\u63AA\u8F9E\uFF09\u3002 */ roleLabel(): string }): SoundSources {\n  // \u97F3\u6E90\u5E93\uFF08pwa-sounds\uFF09\u540C\u6837\u4E00\u5957\uFF1A\u5148\u627E\u540C\u6E90 pwa-sounds/\uFF0C\u518D\u7528\u8BBE\u7F6E\u91CC\u7684\uFF1B\u53EA\u5728\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\n  let source = SOUNDS_SOURCE_DEFAULT;\n  const bases = () => [...new Set([new URL(\"pwa-sounds\", location.href).href, source.trim().replace(/\\/+$/, \"\") || SOUNDS_SOURCE_DEFAULT])];\n  /** \u5F31\u5F15\u7528\u89E3\u6790\u5230\u7684\u5B50\u96C6\uFF08\u672C\u6B21\u6253\u5F00\uFF1BsubsetSha256 \u2192 \u5B57\u8282\uFF09\u3002 */\n  const session = new Map<string, Uint8Array>();\n  /** \u4ECE\u97F3\u6E90\u5E93\u62FF\u4E00\u4E2A\u6587\u4EF6\uFF1A\u9010\u4E2A\u5730\u5740\u8BD5\uFF0C\u6D41\u5F0F\u8BFB\uFF08\u62A5\u8FDB\u5EA6\uFF09\uFF0C\u5230\u624B\u5BF9\u76EE\u5F55\u91CC\u9489\u7684 sha256\uFF08\u4E0D\u5BF9 = \u4E0D\u7528\u3001\u62A5\u51FA\u6765\uFF09\u3002 */\n  async function fetchSound(e: SoundEntry, onProgress: (done: number) => void): Promise<Uint8Array> {\n    const hit = await cachedSound(e.sha256); if (hit) return hit;   // \u672C\u6B21\u5185\u5B58 / \u6301\u4E45\u7F13\u5B58 `pwa-sounds`\uFF08user\u300C\u53EF\u4EE5\u7F13\u5B58\u6307\u5B9A\u7684\u5305\uFF0C\u4E0D\u7136\u6CA1\u7F51\u7684\u65F6\u5019\u5F88\u9EBB\u70E6\u300D\uFF09\n    let last = \"\";\n    for (const base of bases()) {\n      try {\n        const res = await fetch(`${base}/${e.file}`);\n        if (!res.ok) throw new Error(`HTTP ${res.status}`);\n        const out = new Uint8Array(e.bytes); let o = 0;\n        const rd = res.body?.getReader();\n        if (!rd) { const b = new Uint8Array(await res.arrayBuffer()); if (b.length !== e.bytes) throw new Error(`\u5927\u5C0F\u4E0D\u5BF9\uFF08${b.length} \u2260 ${e.bytes}\uFF09`); out.set(b); o = b.length; }\n        else for (;;) { const { done, value } = await rd.read(); if (done) break; if (o + value.length > e.bytes) throw new Error(\"\u6BD4\u76EE\u5F55\u91CC\u8BF4\u7684\u5927\"); out.set(value, o); o += value.length; onProgress(o); }\n        if (o !== e.bytes) throw new Error(`\u5927\u5C0F\u4E0D\u5BF9\uFF08${o} \u2260 ${e.bytes}\uFF09`);\n        const got = await sha256Hex(out);\n        if (got !== e.sha256) throw new Error(`\u5185\u5BB9\u548C\u76EE\u5F55\u91CC\u9489\u7684\u4E0D\u4E00\u6837\uFF08sha256 ${got.slice(0, 12)}\u2026 \u2260 ${e.sha256.slice(0, 12)}\u2026\uFF09\uFF0C\u6CA1\u6709\u7528\u5B83`);\n        await rememberSound(e.sha256, out, true);   // \u6838\u8FC7\u4E86\u624D\u7559\uFF1B\u7B2C\u4E00\u6B21\u4E0B\u8F7D\u5C31\u7559\u5728\u8BBE\u5907\u4E0A\uFF08user\u300C\u6BCF\u6B21\u52A0\u4E50\u5668\u90FD\u4F1A\u91CD\u65B0\u4E0B\u4E00\u4E0BGS\u300D\uFF09\n        return out;\n      } catch (err) { last = `${base}\uFF1A${(err as Error).message}`; }\n    }\n    throw new Error(`\u300C${e.name}\u300D\u62FF\u4E0D\u5230\uFF08\u8BD5\u8FC7 ${bases().join(\"\u3001\")}\uFF09\u3002\u6700\u540E\u4E00\u6B21\uFF1A${last}\u3002\u53EF\u4EE5\u5728\u8BBE\u7F6E\u91CC\u6362\u97F3\u6E90\u5E93\u6765\u6E90\uFF0C\u6216\u4ECE\u672C\u673A .sf2 \u6587\u4EF6\u9009\u3002`);\n  }\n  /** \u62FF\u5230\u4E00\u4E2A SoundFont \u5019\u9009\u7684\u5B50\u96C6\u5B57\u8282\uFF08\u5951\u7EA6 Sf2Source\uFF09\uFF1A\u6B4C\u91CC\u5D4C\u7684 \u2192 \u672C\u6B21\u5DF2\u89E3\u6790\u7684 \u2192 \u5F31\u5F15\u7528\u53BB\u627E\u6574\u5305\uFF08\u672C\u6B21\u5185\u5B58 / \u6301\u4E45\u7F13\u5B58 / \u5BB6\u65CF\u97F3\u6E90\u5E93\u6309\u6574\u5305 sha256 \u5BF9\u6761\u76EE\uFF09\u2192 \u5207\u5B50\u96C6\u3001\u6838 sha256\u3002\n   *  \u90FD\u627E\u4E0D\u5230 = \u629B\u9519\uFF08\u6CA1\u4EBA\u4E0A\u573A\u3001\u62A5\u51FA\u6765\u3001\u4EBA\u6362 = \u6362\u4EBA\u7684\u7A84\u63A5\u53E3\uFF09\uFF1B\u4EBA\u4E5F\u53EF\u4EE5\u5728\u6B4C\u624B\u724C\u91CC\u300C\u627E\u6587\u4EF6\u2026\u300D\u628A\u6574\u5305\u7ED9\u5B83\u3002 */\n  async function resolveGmBytes(g: GmCandidate): Promise<Uint8Array> {\n    if (g.bytes) return g.bytes;\n    if (g.path) throw new Error(`\u300C${g.name}\u300D\u7684\u58F0\u97F3\uFF08${g.path}\uFF09\u6CA1\u968F\u8FD9\u9996\u6B4C\u5E26\u6765`);\n    const have = session.get(g.subsetSha256); if (have) return have;\n    const kept = await cachedSound(g.subsetSha256);   // \u8BBE\u5907\u4E0A\u7559\u7740\u7684\u5B50\u96C6\uFF08\u81EA\u5DF1\u7684 .sf2 \u52A0\u8FDB\u6765\u65F6 / \u89E3\u5305\u65F6\u7559\u7684\uFF1B\u6309\u5B50\u96C6 sha256 \u5B58\uFF0C\u53D6\u51FA\u6765\u6838\u8FC7\uFF09\n    if (kept) { session.set(g.subsetSha256, kept); return kept; }\n    let bank = await cachedSound(g.origin.fileSha256);\n    if (!bank) {\n      const e = Object.values(SOUNDS).find((x) => x.sha256 === g.origin.fileSha256);\n      if (e) { try { bank = await fetchSound(e, (done) => o.progress(`\u627E\u300C${g.name}\u300D\u7684\u58F0\u97F3\uFF1A\u4E0B\u8F7D ${e.name} ${Math.round((done / e.bytes) * 100)}%`)); } finally { o.progress(\"\"); } }\n    }\n    if (!bank) throw new Error(`\u300C${g.name}\u300D\u7684\u58F0\u97F3\u6CA1\u968F\u6B4C\u5E26\uFF08\u5F31\u5F15\u7528\uFF09\uFF0C\u8FD9\u53F0\u8BBE\u5907\u548C\u5BB6\u65CF\u97F3\u6E90\u5E93\u91CC\u4E5F\u6CA1\u6709\u5B83\u6765\u81EA\u7684\u300C${g.origin.name}\u300D\uFF08sha256 ${g.origin.fileSha256.slice(0, 12)}\u2026\uFF09\u3002\u70B9\u8C31\u524D\u9762\u7684\u300C${o.roleLabel()}\u300D\uFF0C\u7ED9\u5B83\u300C\u627E\u6587\u4EF6\u2026\u300D\uFF0C\u6216\u6362\u4E00\u4E2A\u300C\u8C01\u6765\u6F14\u300D`);\n    const subset = subsetSf2(bank, [{ bank: g.bank, program: g.program }]), sha = await sha256Hex(subset);\n    if (sha !== g.subsetSha256) throw new Error(`\u4ECE\u300C${g.origin.name}\u300D\u5207\u51FA\u6765\u7684\u300C${g.name}\u300D\u548C\u6B4C\u91CC\u8BB0\u7684\u4E0D\u4E00\u6837\uFF08sha256 ${sha.slice(0, 12)}\u2026 \u2260 ${g.subsetSha256.slice(0, 12)}\u2026\uFF09\uFF0C\u6CA1\u6709\u7528\u5B83`);\n    session.set(g.subsetSha256, subset);\n    return subset;\n  }\n  return {\n    get source() { return source; },\n    set source(v: string) { source = v.trim() || SOUNDS_SOURCE_DEFAULT; },\n    bases, fetchSound, resolveGmBytes,\n    session: { keep: (k, b) => { session.set(k, b); }, drop: (k) => { session.delete(k); }, has: (k) => session.has(k), get: (k) => session.get(k) },\n  };\n}\n", "// models.ts \u2014\u2014 \u6A21\u578B\u4ECE\u54EA\u6765\uFF08pwa-models\uFF1A\u5C0F\u6708\u76F8\u672C\u4F53 / \u8FD0\u884C\u65F6 / \u8BCD\u5178\uFF1B\u5BB6\u65CF\u7EA7\u9EC4\u7EBF\u767D\u540D\u5355 \u2461\uFF09\u3002created 2026-10-15 by Claude Fable 5.1\uFF08\u4ECE src/app/main.ts \u642C\u6765\uFF0C\u5200 4 \u97F3\u6E90\u6765\u6E90\u63A5\u7F1D\uFF09\n// \u2500\u2500 \u6A21\u578B\u6765\u6E90\uFF08ADR-0006 \u2462 re-pointable endpoints\uFF1A\u754C\u9762\u4E0A\u80FD\u6539\u3001\u51FA\u5382\u9884\u586B\uFF1Buser 2026-10-07\u300Ci might worry about hardcode my gh link so if\n//    i closed my gh account all app are not able to run in private server which violates the anti abandonware rule\u300D\uFF09\uFF1A\n//    \u5148\u627E\u540C\u4E00\u4E2A\u7F51\u7AD9\u4E0B\u7684 pwa-models/\uFF08\u81EA\u5DF1\u642D\u670D\u52A1\u5668\u7684\u4EBA\u628A\u6A21\u578B\u4ED3\u62F7\u8FC7\u6765\u5C31\u80FD\u7528\u3001\u4E0D\u7528\u914D\u7F6E\uFF09\uFF0C\u627E\u4E0D\u5230\u518D\u7528\u8FD9\u91CC\u8BBE\u7684\uFF1B\u8FD8\u80FD\u4ECE\u672C\u673A\u6587\u4EF6\u5BFC\u5165\u3002\n//    \u8BBE\u7684\u503C\u53EA\u5728\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\uFF08\u6301\u4E45\u5316\u8FD8\u6CA1\u5B9A\uFF09\u3002\nexport const MODEL_SOURCE_DEFAULT = \"https://fangzhangmnm.github.io/pwa-models\";\n\nexport interface ModelSources {\n  /** \u8BBE\u7F6E\u91CC\u586B\u7684\u6A21\u578B\u6765\u6E90\uFF08\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\uFF1B\u7A7A = \u51FA\u5382\u9ED8\u8BA4\uFF09\u3002 */\n  source: string;\n  /** \u9010\u4E2A\u8BD5\u7684\u5730\u5740\uFF1A\u540C\u4E00\u4E2A\u7F51\u7AD9\u4E0B\u7684 pwa-models/ \u5148\uFF0C\u518D\u8BBE\u7F6E\u91CC\u7684\u3002 */\n  bases(): string[];\n}\nexport function createModelSources(): ModelSources {\n  let source = MODEL_SOURCE_DEFAULT;\n  return {\n    get source() { return source; },\n    set source(v: string) { source = v.trim() || MODEL_SOURCE_DEFAULT; },\n    bases: () => [...new Set([new URL(\"pwa-models\", location.href).href, source.trim().replace(/\\/+$/, \"\") || MODEL_SOURCE_DEFAULT])],\n  };\n}\n", "// roles.ts \u2014\u2014 \u89D2\u8272\uFF08\u58F0\u90E8\uFF09\u540D\u7684\u9884\u8BBE = MusicXML \u5B98\u65B9\u7684\u4E50\u5668\u8BED\u4E49\uFF08<instrument-sound> \u7684\u6807\u51C6 id\uFF09+ \u6253\u8C31\u7684\u6807\u51C6\u82F1\u6587\u540D\u3002created 2026-10-07 by Claude Opus 5.5\n// user 2026-10-07\u300C\u8C31\u4E0A\u9762\u663E\u793A\u7684\u4E0D\u5E94\u8DDF\u662F\u6708\u8BFB\uFF0C\u800C\u662F\u4EBA\u58F0\uFF0C\u5973\u58F0 lead bass violin\u4E4B\u7C7B\u529F\u80FD\u7684\u4E1C\u897F\uFF0C\u8FD8\u8BB0\u5F97\u4E4B\u524D\u8BF4\u7684\u7ED9role assign \u4E50\u5668\u7684\u903B\u8F91\u5417\uFF1F\n//   \u6240\u4EE5\u662F\u4F60\u53EF\u4EE5\u5199\u6216\u8005\u9009role\u7684\u540D\u5B57\uFF0C\u5E2E\u6211\u591A\u60F3\u51E0\u4E2Apreset\u3002\u7136\u540E\u540D\u5B57\u4E4B\u5916\u518D\u9009\u4E50\u5668\u300D\u2192\u300C\u89D2\u8272\u540D\u53EF\u4EE5\u548Cxml\u7684\u4E50\u5668 \u529F\u80FD\u8BED\u4E49\u5BF9\u9F50\uFF0C\u7528\u6700\u5B98\u65B9\u7684\u6B63\u89C4\u7684\uFF08\u53C8\u53EF\u4EE5\u903C\u6211\u7EC3\u8BC6\u8C31\u4E86\uFF09\u300D\u3002\n// \u00B7 \u8C31\u4E0A\u5199\u7684 = \u89D2\u8272\u540D\uFF08<part-name>\uFF09\uFF1B\u5B83\u662F\u4EC0\u4E48\u58F0\u90E8 = \u5B98\u65B9 id\uFF08<instrument-sound>\uFF09\uFF1B\u8C01\u6765\u6F14\uFF08\u6708\u8BFB\u3001\u4EE5\u540E\u7684\u63D2\u4EF6\uFF09= \u5019\u9009\uFF08<virtual-instrument>\uFF09\uFF0C\u540D\u5B57\u4E0D\u4E0A\u8C31\u3002\n// \u00B7 id \u5168\u90E8\u5BF9\u8FC7 W3C MusicXML \u7684 sounds.xml\uFF08github.com/w3c/musicxml schema/sounds.xml\uFF0C4.1 \u8349\u6848\u7248\uFF0C2026-10-07 \u53D6\u7684\uFF09\u2014\u2014\u53EA\u6536\u5728\u91CC\u9762\u67E5\u5F97\u5230\u7684\u3002\n// \u00B7 \u663E\u793A\u540D = \u6253\u8C31\u91CC\u5E38\u7528\u7684\u6807\u51C6\u82F1\u6587\u5199\u6CD5\uFF1B\u540E\u9762\u7684\u4E2D\u6587\u53EA\u7ED9\u9009\u7684\u65F6\u5019\u770B\u3002\n\nexport interface RolePreset { sound: string; name: string; zh: string }\n/** \u6309\u529F\u80FD\u9009\uFF08user\u300C\u58F0\u90E8\u540D\u7684\u9009\u9879\u592A\u591A\u4E86\u3002\u4E0D\u5E94\u8DDF\u662F\u4E50\u5668name salad\uFF0C\u800C\u662F\u529F\u80FD\u9009\uFF0C\u4E0D\u8FC7\u4F60\u53EF\u4EE5push back\u3002\u4E5F\u8BB8\u4E13\u4E1A\u7684\u8C31\u5B50\u4E0A\u9762\u5C31\u662F\u8FD9\u6837\u3002\u4E50\u5668\u540D\u5C31\u662F\u529F\u80FD\u3002\u800C\u4E14\u5E94\u8BE5\u662F\u4E0B\u62C9\u9009\u300D\uFF09\uFF1A\n *  \u4EBA\u58F0 = \u4E3B\u5531 / \u548C\u58F0 + \u5408\u5531\u56DB\u90E8\uFF08\u4E13\u4E1A\u8C31\u4E0A\u58F0\u90E8\u540D\u5C31\u662F\u529F\u80FD\uFF09\uFF1B\u4E50\u961F = \u6D41\u884C\u7F16\u5236\u7684\u51E0\u4E2A\u4F4D\u7F6E\u3002\u6BCF\u9879\u80CC\u540E\u662F\u4E00\u4E2A\u5B98\u65B9 id\uFF08\u5B98\u65B9\u8868\u6309\u4E50\u5668\u5206\u3001\u6CA1\u6709 Lead \u8FD9\u79CD\u529F\u80FD\u540D\uFF0C\n *  \u6240\u4EE5\u300C\u5408\u6210\u4E3B\u97F3\u300D\u843D\u5728 synth.tone.sawtooth\u3001\u300C\u548C\u58F0\u300D\u548C\u4E3B\u5531\u540C\u662F voice.vocals\uFF09\u3002\u8868\u5916\u7684\u540D\u5B57\u81EA\u5DF1\u5199\uFF08\u5B98\u65B9 id \u4E0D\u53D8\uFF09\u3002 */\nexport const ROLE_GROUPS: { group: string; items: RolePreset[] }[] = [\n  { group: \"\u4EBA\u58F0\", items: [\n    { sound: \"voice.vocals\", name: \"Vocals\", zh: \"\u4E3B\u5531\" },\n    { sound: \"voice.vocals\", name: \"Backing Vocals\", zh: \"\u548C\u58F0\" },\n    { sound: \"voice.soprano\", name: \"Soprano\", zh: \"\u5973\u9AD8\u97F3\uFF08\u5408\u5531\uFF09\" },\n    { sound: \"voice.alto\", name: \"Alto\", zh: \"\u5973\u4F4E\u97F3\uFF08\u5408\u5531\uFF09\" },\n    { sound: \"voice.tenor\", name: \"Tenor\", zh: \"\u7537\u9AD8\u97F3\uFF08\u5408\u5531\uFF09\" },\n    { sound: \"voice.bass\", name: \"Bass\", zh: \"\u7537\u4F4E\u97F3\uFF08\u5408\u5531\uFF09\" },\n  ] },\n  { group: \"\u4E50\u961F\", items: [\n    { sound: \"keyboard.piano\", name: \"Piano\", zh: \"\u94A2\u7434 / \u952E\u76D8\" },\n    { sound: \"pluck.guitar\", name: \"Guitar\", zh: \"\u5409\u4ED6\" },\n    { sound: \"pluck.bass\", name: \"Bass\", zh: \"\u8D1D\u65AF\" },\n    { sound: \"drum.group.set\", name: \"Drums\", zh: \"\u9F13\" },\n    { sound: \"strings.group\", name: \"Strings\", zh: \"\u5F26\u4E50\" },\n    { sound: \"synth.pad\", name: \"Synth Pad\", zh: \"\u5408\u6210\u94FA\u5E95\" },\n    { sound: \"synth.tone.sawtooth\", name: \"Synth Lead\", zh: \"\u5408\u6210\u4E3B\u97F3\" },\n  ] },\n];\nexport const ROLE_PRESETS: RolePreset[] = ROLE_GROUPS.flatMap((g) => g.items);\n/** \u65B0\u5EFA\u7684\u6B4C\uFF1A\u4E3B\u5531\u8FD9\u4E2A\u58F0\u90E8 = Vocals\uFF08voice.vocals\uFF09\u3002 */\nexport const DEFAULT_ROLE: RolePreset = ROLE_PRESETS[0];\n\n/** \u540C\u540D\u58F0\u90E8\u7F16\u53F7\uFF08user\u300C\u7136\u540Edefault name\u5982\u679C\u91CD\u540D\u7684\u8BDD\u4F1A\u53D8\u6210vocals vocals2\u8FD9\u6837\uFF1F\u300D\u2192 AI \u7B54\u7167\u6253\u8C31\u8F6F\u4EF6\uFF08MuseScore 4 \u81EA\u52A8\u7F16\u53F7\uFF09\u2192 user\u300C\u8FD9\u4E2A\u5E94\u8BE5\u53EF\u4EE5\u73B0\u5728\u505A\u300D\uFF09\uFF1A\n *  \u540D\u5B57\u548C\u5B98\u65B9 id \u90FD\u4E00\u6837\u7684\u51E0\u4E2A\u58F0\u90E8 = \u6309\u5148\u540E\u8865\u300C 1\u300D\u300C 2\u300D\u2026\uFF08\u7B2C\u4E00\u4E2A\u4E5F\u8865\uFF1B\u5355\u72EC\u4E00\u4E2A\u4E0D\u5E26\u53F7\uFF09\u3002\u540D\u5B57\u4E00\u6837\u4F46\u4E0D\u662F\u540C\u4E00\u79CD\uFF08\u5408\u5531\u7684 Bass \u548C\u8D1D\u65AF\uFF09\u4E0D\u4E00\u8D77\u7F16\u3002\n *  \u7F16\u53F7\u4E0D\u5B58\u8FDB\u89D2\u8272\u540D\u3001\u6BCF\u6B21\u73B0\u7B97\uFF08\u5220\u4E86\u4E00\u4E2A\u58F0\u90E8\u5269\u4E0B\u7684\u81EA\u52A8\u91CD\u6392\uFF09\uFF1B\u5199 MusicXML \u7684 <part-name> \u4E5F\u5E26\u53F7\u3002 */\nexport function numberParts(parts: { name: string; sound: string }[]): string[] {\n  const key = (p: { name: string; sound: string }) => `${p.name}\\u0000${p.sound}`;\n  const total = new Map<string, number>();\n  for (const p of parts) total.set(key(p), (total.get(key(p)) ?? 0) + 1);\n  const seen = new Map<string, number>();\n  return parts.map((p) => {\n    const k = key(p);\n    if ((total.get(k) ?? 0) < 2) return p.name;\n    const n = (seen.get(k) ?? 0) + 1; seen.set(k, n);\n    return `${p.name} ${n}`;\n  });\n}\n", "// project.ts \u2014\u2014 \u4E00\u9996\u6B4C \u2194 \u4E00\u4E2A .mxl \u6587\u4EF6\uFF08zip\uFF09\u3002created 2026-10-07 by Claude Opus 5.5\uFF1B\u4F11\u606F\u5BA4 v2\uFF08\u4E50\u5668\u6309\u5F15\u64CE\u5206\uFF092026-10-07 \u6DF1\u591C by Claude Fable 5.1\uFF1B\n//   \u591A\u58F0\u90E8\u591A\u7EB8 = \u5B58\u6CD5 B\uFF08\u5951\u7EA6 \u00A76\u00BE\uFF092026-10-08 by Claude Fable 5.1\u3002\n// \u6570\u636E\u5951\u7EA6\u8349\u7A3F\uFF08ai-docs/20261007-data-contract-draft.md\uFF09\u00A73 \u7684\u76EE\u5F55\u8868\u843D\u5730\uFF0C\u8FD9\u4E00\u7248\u5199\u5176\u4E2D\u4E00\u90E8\u5206\uFF1A\n//   mimetype\uFF08\u7B2C\u4E00\u4E2A\u3001\u4E0D\u538B\u7F29\uFF09\u00B7 META-INF/container.xml \u00B7 score.musicxml\uFF08**\u6D3E\u751F\u7684\u538B\u5E73\u4EF6**\uFF1A\u5404\u58F0\u90E8\u6574\u9996\u63A5\u8D77\u6765\u3001\u6BCF\u5F20\u7EB8\u8D77\u65B0\u9875 + \u6392\u7EC3\u8BB0\u53F7\uFF0C\u7ED9\u522B\u7684\u8F6F\u4EF6\u770B\uFF1B\u81EA\u5BB6\u8BFB\u65F6\u65E0\u89C6\uFF09\u00B7\n//   .moonsinger/papers/<\u7EB8 id>.musicxml\uFF08**\u6B63\u672C**\uFF1A\u6BCF\u5F20\u7EB8\u4E00\u4EFD\u5B8C\u6574\u7684 MusicXML\uFF0C\u8FD9\u5F20\u7EB8\u4E0A\u5728\u573A\u7684\u58F0\u90E8\u90FD\u5728\u91CC\u9762\uFF0C\u66F2\u6BB5\u540D = <movement-title>\uFF09\u00B7\n//   .moonsinger/manifest.json \u00B7 .moonsinger/score.json\uFF08\u7EB8\u7684\u987A\u5E8F\u8868 + \u58F0\u90E8\u5E76\u96C6 \u2192 \u89D2\u8272 / \u9EA6\u514B\u98CE\uFF1B\u4EBA\u63D2\u7684\u5C0F\u8282\u7EBF\u3001\u8FD8\u6CA1\u5199\u97F3\u9AD8\u7684\u97F3\u6309\u7EB8\u8BB0\uFF09\u00B7\n//   .moonsinger/lounge/<\u89D2\u8272 id>.json\uFF08\u4F11\u606F\u5BA4\u5FEB\u7167\uFF1A\u89D2\u8272\u3001\u5019\u9009\uFF08\u4E50\u5668\u6309\u5F15\u64CE\u5206\uFF09\u3001\u4E0A\u573A\u7684\u662F\u54EA\u4E2A\uFF09\u00B7 .moonsinger/studio.json\uFF08\u5F55\u97F3\u623F\uFF1A\u9EA6\u514B\u98CE\uFF09\u00B7\n//   .moonsinger/sounds/<sha256>.sf2\uFF08\u6B4C\u91CC\u5D4C\u7684\u97F3\u6E90\u5B57\u8282\uFF1B\u53EA\u5199\u8FD8\u6709\u5019\u9009\u5F15\u7528\u7740\u7684\uFF09\u3002\n// \u89C4\u77E9\uFF08\u7167 CatsUp \u7ACB\u5BAA\uFF09\uFF1A\u6BCF\u4EFD\u6269\u5C55\u6587\u4EF6\u81EA\u5E26\u7248\u672C\u53F7\uFF1B\u8BFB\u5230\u6BD4\u8FD9\u4E00\u7248\u65B0\u7684 = \u62D2\u5F00\u3001\u660E\u8BF4\uFF08\u6253\u5F00\u518D\u5B58\u4F1A\u4E22\u4E1C\u897F\uFF09\uFF1B\n//   \u4E0D\u8BA4\u8BC6\u7684\u6587\u4EF6\u3001\u4E0D\u8BA4\u8BC6\u7684\u5B57\u6BB5\uFF08\u4EE5\u540E\u7684\u7248\u672C\u3001\u522B\u7684\u5DE5\u5177\u52A0\u7684\u3001\u8FD9\u53F0\u8BBE\u5907\u7528\u4E0D\u4E86\u7684\u5F15\u64CE\u914D\u7F6E\uFF09\u8BFB\u8FDB\u6765\u7559\u7740\u3001\u5B58\u6863\u65F6\u539F\u6837\u5199\u56DE\u3002\n// \u65E0\u5730\u9003\u751F\u53E3\uFF08user 2026-10-07\u300C\u5148\u4E0D\u6025\u7740store\u3002\u53EF\u4EE5\u5148\u6309\u7167\u65E0\u5730\u89C4\u8303\u5BFC\u5165\u5BFC\u51FA\u505A\u9003\u751F\u53E3\u300D\uFF09\uFF1A\u8FD9\u91CC\u53EA\u7BA1\u5B57\u8282 \u2194 \u6B4C\uFF0C\u6253\u5F00 / \u5B58\u7684\u754C\u9762\u5728 app \u91CC\u3002\nimport { DEFAULT_ROLE, numberParts } from \"../score/roles.ts\";\nimport { zipSync, unzipSync, strToU8, strFromU8 } from \"../../vendor/fflate/fflate.esm.js\";\nimport { swellOf, withArt, SWELL_ART, type Swell, type Song, type PartDef, type PaperSeg, type Token, type NoteTok, type ClefName, CLEFS, flattenPart, familyOrder } from \"../score/song.ts\";\nimport { resolveSongClefs, displayStates, withAutoOttava } from \"../score/clef.ts\";\nimport { songPlayOrder } from \"../score/arrange.ts\";\nimport { writeMusicXml, readMusicXml, type ReadPart, type ReadScore, type PartInfo } from \"./musicxml.ts\";\nimport { FORMAT, FORMAT_MINOR, FORMAT_PATCH, type FormatFile, type Dynamic, type FxV2, type Hum, type InstrumentV2, type Credit, type Sf2Source } from \"./contract.ts\";   // \u5F62\u72B6 = \u5951\u7EA6\uFF08\u4EBA\u8BFB\u7684 .h\uFF09\uFF1B\u6539\u683C\u5F0F = FORMAT +1 + migrate + \u51BB\u7ED3\u6837\u672C\uFF08\u5B88\u536B\u6D4B\u8BD5 test/format-guard.test.ts\uFF09\nimport { FINAL_MP3_ENTRY, contentFingerprint, parseFinalRecord, type FinalRecord, type FingerprintParts } from \"./final.ts\";\nexport { FINAL_MP3_ENTRY, type FinalRecord };\nimport { migrate } from \"./migrate/index.ts\";\nimport { DYNAMICS_DB, DYNAMICS_VEL, ACCENT_VEL, MARCATO_VEL, MARCATO_DB, MARK_DEFAULTS, SING_MARKS, type SingMark, ARTICULATION, SOUNDFONT_DEFAULTS, SOUNDFONT_CALIBRATION_DB, TSUKUYOMI_DEFAULTS, DEFAULT_CALIBRATION_DB, TSUKUYOMI_CREDIT, TSUKUYOMI_SPEC, VOWEL_SAMPLER_SPEC, SOUNDFONT_SPEC, TSUKUYOMI_MODEL } from \"./performance.ts\";\nexport { FORMAT };\nexport type { Hum, InstrumentV2 };\nconst MIMETYPE = \"application/vnd.recordare.musicxml\";\nconst DIR = \".moonsinger/\";\nconst SOUNDS = `${DIR}sounds/`;\n/** \u53C2\u8003\u7A97\uFF08v0.8\uFF0C2026-10-08 \u6DF1\u591C Opus 5.5\uFF1B\u5BF9\u9F50\u7A3F ai-docs/20261008-reference-window-alignment.md\uFF09\uFF1A\u6574\u4E2A\u76EE\u5F55\u5F52 @internal/reference-window\n *  \uFF08manifest.json \u81EA\u5E26\u7248\u672C\u53F7\u548C\u8FC1\u79FB + \u6BCF\u5F20\u5361\u7684\u5B57\u8282\uFF09\uFF1B\u8FD9\u91CC\u96F6\u77E5\u8BC6\u3001\u539F\u6837\u8FDB\u51FA\u3002\u4E0D\u653E extras\uFF08extras \u8FDB\u64A4\u9500\uFF0C\u53C2\u8003\u7A97\u4E0D\u8FDB\uFF09\u3002 */\nexport const REFERENCES_DIR = `${DIR}references/`;\nconst PAPERS = `${DIR}papers/`;\nconst paperFile = (id: string) => `${PAPERS}${id}.musicxml`;\n\ntype Json = Record<string, unknown>;\n/** \u6587\u4EF6\u91CC\u6211\u4EEC\u8BFB\u8FDB\u6765\u3001\u8FD9\u4E00\u7248\u4E0D\u6539\u52A8\u7684\u90E8\u5206\uFF08\u539F\u6837\u5199\u56DE\u7528\uFF09\u3002\u65B0\u5EFA\u7684\u6B4C = \u7A7A\u3002 */\nexport interface Extras {\n  scoreExt?: Json;\n  lounge: Record<string, Json>;   // \u89D2\u8272 id \u2192 \u90A3\u4EFD json\uFF08\u6574\u4EFD\u7559\u7740\uFF0C\u53EA\u6539\u8BA4\u8BC6\u7684\u5B57\u6BB5\uFF09\n  studio?: Json;\n  manifest?: Json;\n  sounds: Record<string, Uint8Array>;    // \u6B4C\u91CC\u5D4C\u7684\u97F3\u6E90\u5B57\u8282\uFF08zip \u8DEF\u5F84 `.moonsinger/sounds/<sha256>.sf2` \u2192 \u5B57\u8282\uFF1B\u5951\u7EA6 \u00A710.2\uFF09\uFF1B\u5B58\u6863\u53EA\u5199\u5019\u9009\u8FD8\u5F15\u7528\u7740\u7684\n  unknown: Record<string, Uint8Array>;   // \u4E0D\u8BA4\u8BC6\u7684\u6587\u4EF6\n  rootfiles: { path: string; mediaType: string }[];   // container.xml \u91CC\u9664\u4E3B\u4E50\u8C31\u5916\u7684 rootfile\uFF08\u539F\u6837\u5199\u56DE\uFF09\n  /** \u5C01\u9762 = `Thumbnails/thumbnail.png` \u8FD9\u4E2A entry \u672C\u8EAB\uFF08\u5BB6\u65CF\u65E2\u5B9A\u505A\u6CD5 WXHW ADR-0012 = ORA \u540C\u6B3E\u8DEF\u5F84\uFF1BPNG \u2264 256\u00B2\u3001\u2264 70 KB\uFF1B\n   *  **\u6C38\u8FDC\u6700\u540E\u4E00\u4E2A entry\u3001\u4E0D\u538B\u7F29**\u2014\u2014\u4E66\u67B6\u9760 store getPeek \u5C3E\u8BFB\u4E00\u6B21\u547D\u4E2D\uFF0C\u4E0D\u662F\u6700\u540E\u5C31\u4F1A\u88AB\u522B\u7684\u4E1C\u897F\u6324\u51FA\u5C3E\u7A97\uFF09\u3002null = \u6CA1\u6709\u5C01\u9762\uFF08\u4E66\u67B6\u753B\u81EA\u52A8\u5C01\u9762\uFF09\u3002 */\n  thumbnail: Uint8Array | null;\n  /** \u5B9A\u7A3F\uFF08src/format/final.ts\uFF1BW-38\uFF09\uFF1A\u603B\u76EE\u5F55 `manifest.final` \u90A3\u6761\u8BB0\u5F55 + `.moonsinger/final.mp3` \u7684\u5B57\u8282\u3002null = \u6CA1\u5B9A\u7A3F / \u6539\u7A3F\u4E86\u3002\n   *  \u5B9A\u7A3F\u7740 = \u51FA\u58F0\u7684\u5185\u5BB9\u9501\u4F4F\uFF1AsaveMxl \u7B97\u51FA\u6765\u7684\u6307\u7EB9\u5FC5\u987B\u7B49\u4E8E\u8BB0\u5F55\u91CC\u7684\uFF0C\u4E0D\u7B49\u5C31\u629B\uFF08\u683C\u5F0F\u5C42\u90A3\u9053\u62A4\u680F\uFF09\u3002 */\n  final: FinalRecord | null;\n  finalMp3: Uint8Array | null;\n  /** \u8FD9\u9996\u6B4C\u5B9A\u7A3F\u8FC7\u51E0\u6B21\uFF08`manifest.finalRev`\uFF1B\u6539\u7A3F\u4E0D\u51CF\uFF0C\u4E0B\u6B21\u5B9A\u7A3F = +1\uFF09\u3002 */\n  finalRev: number;\n}\nexport const emptyExtras = (): Extras => ({ lounge: {}, sounds: {}, unknown: {}, rootfiles: [], thumbnail: null, final: null, finalMp3: null, finalRev: 0 });\nexport const THUMBNAIL_ENTRY = \"Thumbnails/thumbnail.png\";\n/** \u6362\u5C01\u9762\uFF08null = \u53BB\u6389\uFF09\u3002 */\nexport const withThumbnail = (extras: Extras, png: Uint8Array | null): Extras => ({ ...extras, thumbnail: png });\n/** \u5B9A\u7A3F\uFF1A\u8BB0\u5F55 + mp3 \u5B57\u8282\uFF08\u5E26 ID3 \u6807\u7B7E\u548C\u5C01\u9762\u56FE\u7684\u6574\u4EFD\uFF09\u4E00\u8D77\u8FDB extras\uFF08finalRev \u8DDF\u7740\u8BB0\u5F55\u7684 rev\uFF09\u3002\u8BB0\u5F55\u91CC\u7684 fingerprint \u7531\u8C03\u7528\u65B9\u5148\u7528 contentFingerprintOf \u7B97\u597D\u3002 */\nexport const withFinal = (extras: Extras, rec: FinalRecord, mp3: Uint8Array): Extras => ({ ...extras, final: rec, finalMp3: mp3, finalRev: Math.max(extras.finalRev, rec.rev) });\n/** \u6539\u7A3F\uFF1A\u8BB0\u5F55\u548C mp3 \u4E00\u8D77\u4E22\u6389\uFF08\u4E0B\u6B21\u5B58\u5C31\u6CA1\u6709\u90A3\u4E2A entry \u4E86 = user\u300C\u89E3\u9501\u4E4B\u540Emp3\u81EA\u52A8cache invalid\u300D\uFF09\uFF1BfinalRev \u7559\u7740\u3002 */\nexport const withoutFinal = (extras: Extras): Extras => (extras.final || extras.finalMp3 ? { ...extras, final: null, finalMp3: null } : extras);\nexport const isFinal = (extras: Extras): boolean => extras.final != null;\n\n/** \u65B0\u6B4C\u9ED8\u8BA4\u7684\u4E24\u4E2A\u5019\u9009\uFF1A\u6708\u8BFB\u5B8C\u6574 / \u6708\u8BFB\u5143\u97F3\u7248\uFF08\u8F7B\u91CF\uFF09\u3002\n *  \u663E\u793A\u540D 2026-10-13 \u8D77\u53EB\u300C\u5C0F\u6708\u76F8\u300D/\u300C\u5C0F\u6708\u76F8\uFF08\u5143\u97F3\uFF09\u300D\uFF08W-28\uFF0C\u5BB6\u89C4\u300C\u5171\u4EAB\u53EB\u6CD5\u300D\uFF09\uFF1B\u65E7\u6B4C\u91CC\u6309\u503C\u5B58\u7740\u7684\u300C\u6708\u8BFB\u300D\u539F\u6837\u7559\u7740\u2014\u2014\u6253\u5F00\u65F6\u8FC1\u79FB\u8FD8\u662F\u663E\u793A\u65F6\u6362\uFF0C\u7B49 user \u5B9A\u3002 */\nexport const CANDIDATE_ID = { full: \"c1\", light: \"c2\" } as const;\nexport type Engine = InstrumentV2[\"engine\"];\nconst common = () => ({ calibrationDb: DEFAULT_CALIBRATION_DB, chain: [] as unknown[], dynamicsDb: { ...DYNAMICS_DB }, articulation: { ...ARTICULATION, gapSec: 0, marcatoDb: MARCATO_DB, ...MARK_DEFAULTS } });   // \u8BB0\u53F7\u600E\u4E48\u89E3\u8BFB\u7684\u6570\u5168\u5199\u660E\uFF08by value\uFF09\uFF1B\u8FC1\u79FB\u51FA\u6765\u7684\u65E7\u5019\u9009\u4E0D\u8865\n/** \u65B0\u5EFA\u89D2\u8272\uFF1A\u4ECE app \u5185\u7F6E\u9884\u8BBE by value \u62F7\u8FDB\u6B4C\uFF08\u5951\u7EA6 \u00A78\uFF1B\u4E4B\u540E app \u5347\u7EA7\u6539\u4E86\u9884\u8BBE\u4E5F\u4E0D\u5F71\u54CD\u8FD9\u9996\u6B4C\uFF09\u3002 */\nfunction defaultRole(hum: Hum, id: string): Json {\n  return { version: FORMAT.lounge, id, name: DEFAULT_ROLE.name, sound: DEFAULT_ROLE.sound, active: CANDIDATE_ID.full, candidates: [\n    { id: CANDIDATE_ID.full, name: \"\u5C0F\u6708\u76F8\", instrument: { engine: \"tsukuyomi\", model: { ...TSUKUYOMI_MODEL }, hum }, gm: { program: 55, variant: \"tsukuyomi\" }, ...common(), sing: structuredClone(SING_MARKS), defaults: { ...TSUKUYOMI_DEFAULTS }, credit: structuredClone(TSUKUYOMI_CREDIT), spec: structuredClone(TSUKUYOMI_SPEC) },\n    { id: CANDIDATE_ID.light, name: \"\u5C0F\u6708\u76F8\uFF08\u5143\u97F3\uFF09\", instrument: { engine: \"vowel-sampler\", table: \"builtin\", hum }, gm: { program: 55, variant: \"tsukuyomi-vowels\" }, ...common(), defaults: {}, credit: structuredClone(TSUKUYOMI_CREDIT), spec: structuredClone(VOWEL_SAMPLER_SPEC) },\n  ] };\n}\nconst cands = (role: Json | undefined): Json[] => ((role?.candidates as Json[] | undefined) ?? []);\nconst instrumentOf = (c: Json | null | undefined): InstrumentV2 | null => (c && c.instrument && typeof c.instrument === \"object\" ? (c.instrument as InstrumentV2) : null);\nconst isVoice = (i: InstrumentV2 | null): i is Extract<InstrumentV2, { hum: Hum }> => !!i && (i.engine === \"tsukuyomi\" || i.engine === \"vowel-sampler\");\nconst roleOf = (extras: Extras, role: string, hum: Hum): Json => structuredClone(extras.lounge[role] ?? defaultRole(hum, role));\nconst nextKey = (ids: string[], prefix: string) => `${prefix}${Math.max(0, ...ids.map((x) => Number(new RegExp(`^${prefix}(\\\\d+)$`).exec(x)?.[1] ?? 0))) + 1}`;\n\n/** \u8FD9\u4E00\u7248\u5199\u51FA\u7684\u62CD\u5B50\uFF08\u5BB6\u65CF\u683C\u5F0F\u7248\u672C\u7EAA\u5F8B 2026-10-21\uFF0Ccontract.ts\uFF09\uFF1Aversion = major \u7167\u65E7\uFF0Cminor / patch \u4E24\u4E2A\u53EF\u9009\u6574\u6570\u952E\u3002\u5199\u6C38\u8FDC\u53EA\u5199\u5F53\u524D\u62CD\u3002 */\nconst stampOf = (k: FormatFile): Json => ({ version: FORMAT[k], minor: FORMAT_MINOR[k], patch: FORMAT_PATCH[k] });\n/** \u6307\u7EB9\u7528\u7684 JSON \u6587\u672C = \u53BB\u6389 minor / patch \u518D\u6309\u5199\u6587\u4EF6\u540C\u4E00\u4E2A\u6837\u5B50\u4E32\u5316\uFF08\u62CD\u5B50\u4E0D\u662F\u5185\u5BB9\uFF1A\u5B9A\u7A3F\u65F6\u8BB0\u7684\u6307\u7EB9\u91CC\u6CA1\u6709\u5B83\u4EEC\uFF0C\u5347\u4E86 minor \u7684 app \u518D\u5B58\u4E0D\u80FD\u628A\u5B9A\u7A3F\u7684\u6B4C\u5224\u6210\u300C\u5185\u5BB9\u53D8\u4E86\u300D\uFF1B\n *  \u8001\u6587\u4EF6\u7684\u539F\u6587\u672C\u6765\u5C31\u662F\u8FD9\u4E48\u4E32\u51FA\u6765\u7684\uFF0C\u53BB\u6389\u4E24\u4E2A\u4E0D\u5B58\u5728\u7684\u952E = \u539F\u6587\uFF09\u3002\u8BFB\u5199\u4E24\u8FB9\u90FD\u8D70\u8FD9\u4E00\u628A\u3002 */\nconst fpTextOf = (o: Json): string => { const { minor: _m, patch: _p, ...rest } = o; return JSON.stringify(rest, null, 2) + \"\\n\"; };\nconst KNOWN_SCORE_KEYS = new Set([\"version\", \"minor\", \"patch\", \"papers\", \"parts\", \"view\", \"arrangement\", \"lyricFit\", \"barNumbers\"]);\nexport interface SaveArgs { song: Song; hum: Hum; extras: Extras; app: string; date: string; view?: Record<string, unknown> | null; references?: Record<string, Uint8Array>;\n  /** \u6E32\u67D3\u6838\u5FC3\u7684\u7248\u672C + \u54C8\u5E0C\uFF08src/core/version.ts\uFF1B\u6BCF\u6B21\u4FDD\u5B58\u90FD\u8BB0\u2014\u2014user 2026-10-13\u300C\u6838\u5FC3\u7684\u7248\u672C\u53F7\u548Chash\u53CD\u800C\u662F\u6BCF\u6B21\u4FDD\u5B58\u7684\u65F6\u5019\u90FD\u8981\u8BB0\u7684\u3002ui\u58F3\u65E0\u6240\u8C13\u300D\uFF09\u3002\u4E0D\u7ED9 = \u4E0D\u5199\uFF08\u6D4B\u8BD5 / \u65E7\u8C03\u7528\u65B9\uFF09\u3002 */\n  core?: { version: string; hash: string } }   // references = \u53C2\u8003\u7A97\u76EE\u5F55\uFF08\u8DEF\u5F84\u90FD\u5728 REFERENCES_DIR \u4E0B\uFF09   // \u6B4C\u540D = song.title\uFF08\u53EF\u4E0D\u586B\uFF09\uFF1Bhum = \u7F16\u8F91\u5668\u91CC\u7684\u54FC\u7684\u5B57\uFF08\u5199\u8FDB\u6708\u8BFB\u5019\u9009\u7684\u4E50\u5668\u914D\u7F6E\uFF09\n/** \u6B4C \u2192 .mxl \u7684\u5B57\u8282\u3002\u5B9A\u7A3F\u7740\u7684\u6B4C\uFF1A\u51FA\u58F0\u5185\u5BB9\u7684\u6307\u7EB9\u5FC5\u987B\u548C\u8BB0\u5F55\u91CC\u7684\u4E00\u6837\uFF0C\u4E0D\u4E00\u6837 = \u629B\uFF08\u683C\u5F0F\u5C42\u7684\u62A4\u680F\uFF0Cuser 2026-10-16\u300C\u5B9A\u7A3F\u7684\u65F6\u5019\u5F97\u4ECE\u591A\u4E2A\u7A84\u63A5\u53E3\u4E0A\u62A4\u680F\u4F4F\u5199\u5165\u300D\uFF09\u3002 */\nexport function saveMxl(a: SaveArgs): Uint8Array {\n  const { out, fingerprint } = buildEntries(a);\n  if (a.extras.final && a.extras.final.fingerprint !== fingerprint) throw new Error(\"\u8FD9\u9996\u6B4C\u5B9A\u7A3F\u4E86\uFF0C\u5185\u5BB9\u5374\u53D8\u4E86\uFF1A\u5B9A\u7A3F\u7740\u4E0D\u80FD\u8FD9\u6837\u5B58\u3002\u5148\u300C\u6539\u7A3F\u300D\u518D\u6539\uFF0C\u6216\u8005\u64A4\u9500\u521A\u624D\u7684\u6539\u52A8\u3002\");\n  const entries: Record<string, [Uint8Array, { level: 0 | 1 | 6 }]> = {};\n  for (const [path, bytes] of Object.entries(out)) entries[path] = [bytes, { level: path === \"mimetype\" || path === THUMBNAIL_ENTRY || path === FINAL_MP3_ENTRY ? 0 : path.startsWith(SOUNDS) ? 1 : path.startsWith(REFERENCES_DIR) && !path.endsWith(\".json\") ? 0 : 6 }];   // \u53C2\u8003\u56FE\u672C\u6765\u5C31\u538B\u8FC7\u4E86\uFF1A\u4E0D\u518D\u538B   // mimetype \u5FC5\u987B\u7B2C\u4E00\u4E2A\u3001\u4E0D\u538B\u7F29\uFF08\u63D2\u5165\u987A\u5E8F = zip \u91CC\u7684\u987A\u5E8F\uFF09\uFF1B\u5C01\u9762\u4E0D\u538B\u7F29\uFF08\u5C3E\u8BFB\u6309 entry \u540D\u6293\u539F\u59CB\u5B57\u8282\uFF09\uFF1B\u5B9A\u7A3F mp3 \u4E0D\u538B\u7F29\uFF08\u672C\u6765\u5C31\u538B\u8FC7\u3001\u6B4C\u5E93\u6309 entry \u540D\u6293\uFF09\uFF1B\u91C7\u6837\u5927\u3001\u538B\u4E0D\u52A8\uFF0Clevel 1 \u7701\u65F6\u95F4\n  return zipSync(entries);\n}\n/** \u51FA\u58F0\u5185\u5BB9\u7684\u6307\u7EB9\uFF08\u5B9A\u7A3F\u90A3\u4E00\u523B\u7B97\u4E00\u6B21\u8BB0\u8FDB\u8BB0\u5F55\uFF1B\u4E4B\u540E\u6BCF\u6B21\u5B58\u5BF9\u4E00\u6B21\uFF09\u3002\u548C saveMxl \u540C\u4E00\u6761\u7BA1\u7EBF\u3001\u540C\u4E00\u4EFD\u5B57\u7B26\u4E32\u3002 */\nexport function contentFingerprintOf(a: SaveArgs): string { return buildEntries(a).fingerprint; }\n/** \u6B4C \u2192 zip \u91CC\u7684\u6BCF\u4E2A entry\uFF08\u987A\u5E8F = zip \u91CC\u7684\u987A\u5E8F\uFF09+ \u51FA\u58F0\u5185\u5BB9\u7684\u6307\u7EB9\u3002 */\nfunction buildEntries(a: SaveArgs): { out: Record<string, Uint8Array>; fingerprint: string } {\n  const song = a.song;\n  const lounge: Record<string, Json> = { ...a.extras.lounge };\n  for (const part of song.parts) {\n    const role = roleOf(a.extras, part.role, a.hum);\n    for (const c of cands(role)) { const i = instrumentOf(c); if (isVoice(i)) i.hum = a.hum; }   // \u54FC\u7684\u5B57 = \u6708\u8BFB\u5019\u9009\u5171\u7528\u7684\u4E00\u4E2A\u8BBE\u7F6E\n    lounge[part.role] = role;\n  }\n  const studio: Json = structuredClone(a.extras.studio ?? emptyStudio());\n  const tracks = ((studio.tracks as Json[] | undefined) ?? []).slice();\n  for (const part of song.parts) if (!tracks.some((m) => m.id === part.mic)) tracks.push(micTrack(part.mic, `\u9EA6\u514B\u98CE ${tracks.filter((t) => t.kind === \"mic\").length + 1}`));   // \u6BCF\u4E2A\u58F0\u90E8\u7684\u9EA6\u514B\u98CE\u4E00\u6761\u8F68\n  studio.tracks = tracks; if (!studio.master) studio.master = { gainDb: 0, limiter: true, chain: [] };\n  const mics = tracks.filter((t) => t.kind === \"mic\");\n  const labels = partLabels(song, { ...a.extras, lounge });\n  const infoOf = (part: PartDef, k: number): PartInfo => {\n    const role = lounge[part.role], active = cands(role).find((c) => c.id === role.active), mic = mics.find((m) => m.id === part.mic);\n    return { id: part.id, name: labels[k], ...(part.staves === 2 ? { staves: 2 as const } : {}), instrumentName: String(active?.name ?? \"\u5C0F\u6708\u76F8\"), sound: String(role.sound ?? DEFAULT_ROLE.sound),\n      program: Number((active?.gm as Json | undefined)?.program ?? 55),\n      variant: typeof (active?.gm as Json | undefined)?.variant === \"string\" ? { library: \"MoonSinger\", name: String((active!.gm as Json).variant) } : undefined,\n      pan: mic ? Math.round(Number(mic.pan ?? 0) * 90) : undefined };\n  };\n  const infos = song.parts.map(infoOf), meta = { software: `MoonSinger ${a.app}`, date: a.date };\n  const files: Record<string, Uint8Array> = {};\n  // \u8C31\u53F7\uFF08v0.9.28\uFF09\uFF1A\u6BCF\u5F20\u7EB8\u6BCF\u4E2A\u58F0\u90E8\u5F00\u5934\u7684\u8C31\u53F7\uFF08\u81EA\u52A8\u7684\u6309\u6574\u9996\u6311\u597D\uFF09\u5199\u8FDB\u90A3\u5F20\u7EB8\u7684\u7B2C\u4E00\u4E2A <clef>\uFF1B\u81EA\u52A8\u4E0D\u81EA\u52A8\u8BB0\u5728 score.json \u7684 parts[].clef\n  const clefStarts = resolveSongClefs(song);\n  const autoOtt = (part: PartDef) => part.staves !== 2 && part.autoOttava !== false;\n  const clefInfo = (paperId: string, part: PartDef): { clef?: ClefName } => { const c = part.staves === 2 ? undefined : clefStarts.get(paperId)?.get(part.id); return c && c !== \"G\" ? { clef: c } : {}; };\n  // \u6B63\u672C\uFF1A\u6BCF\u5F20\u7EB8\u4E00\u4EFD\uFF08\u8FD9\u5F20\u7EB8\u4E0A\u5728\u573A\u7684\u58F0\u90E8\uFF09\n  const papers = song.papers.map((p) => {\n    // \u81EA\u52A8\u516B\u5EA6\u7EBF\uFF08v0.9.37\uFF09\uFF1A\u4E34\u65F6\u63D2\u6210\u5E26 ms-auto id \u7684\u8BB0\u53F7\u5199\u51FA\u53BB\uFF08\u522B\u7684\u8F6F\u4EF6\u7167\u6837\u753B\uFF1B\u81EA\u5DF1\u8BFB\u56DE\u6765\u8DF3\u8FC7\u3001\u7167\u6837\u81EA\u52A8\u91CD\u7B97\uFF09\n    const parts = song.parts.flatMap((part, k) => (p.tracks[part.id] ? [{ info: { ...infos[k], ...clefInfo(p.id, part) }, tokens: autoOtt(part) ? withAutoOttava(p.tracks[part.id], clefStarts.get(p.id)?.get(part.id) ?? \"G\") : p.tracks[part.id] }] : []));\n    const w = writeMusicXml({ title: song.title, movementTitle: p.name || undefined, paper: song.paper, credits: song.credits, rights: song.rights, parts }, meta);\n    files[paperFile(p.id)] = strToU8(w.xml);\n    // \u53E5\u53F7\uFF08\u4E0D\u7B97\u6253\u8C31\u7B26\u53F7\uFF0C\u4E0D\u8FDB MusicXML\uFF09\uFF1A\u6BCF\u4E2A\u58F0\u90E8\u91CC\u300C\u53E5\u53F7\u8DDF\u5728\u54EA\u4E2A token \u540E\u9762\u300D\uFF08\u90A3\u4E2A token \u7684 id\uFF09\n    const phrases: Record<string, number[]> = {};\n    for (const [pid, toks] of Object.entries(p.tracks)) { const ids = toks.flatMap((t, k) => (t.kind === \"phrase\" && k > 0 ? [toks[k - 1].id] : [])); if (ids.length) phrases[pid] = ids; }\n    // \u97F3\u5185\u7684\u529B\u5EA6\u8D77\u4F0F\uFF08MusicXML \u8868\u8FBE\u4E0D\u4E86\u97F3\u5185\u7684\u53D1\u5939\uFF09\uFF1A\u58F0\u90E8 \u2192 \u97F3\u7684 id \u2192 \u54EA\u4E00\u79CD\n    const swells: Record<string, Record<string, \"<\" | \">\" | \"<>\">> = {};\n    for (const [pid, toks] of Object.entries(p.tracks)) for (const t of toks) { const sw = swellOf(t); if (sw) (swells[pid] ??= {})[String(t.id)] = sw; }   // \u6F14\u594F\u6CD5\u91CC\u7684\u97F3\u5185\u8D77\u4F0F\uFF08v0.9.44\uFF09\u2192 \u7167\u65E7\u8FD9\u5F20\u8868\n    return { id: p.id, file: paperFile(p.id), manualBars: w.manualBars, unwritten: w.unwritten, ...(Object.keys(phrases).length ? { phrases } : {}), ...(Object.keys(swells).length ? { swells } : {}), ...(p.hidden ? { hidden: true } : {}) };\n  });\n  // \u6D3E\u751F\u7684\u538B\u5E73\u4EF6\uFF1A\u5404\u58F0\u90E8\u6574\u9996\u63A5\u8D77\u6765\uFF0C\u6BCF\u5F20\u7EB8\u8D77\u65B0\u9875\uFF08\u7B2C\u4E00\u4E2A\u58F0\u90E8\u5199\u6392\u7EC3\u8BB0\u53F7 = \u66F2\u6BB5\u540D\uFF09\n  const flat = writeMusicXml({ title: song.title, paper: song.paper, credits: song.credits, rights: song.rights, padMeasures: true, parts: song.parts.map((part, k) => {\n    const f = flattenPart(song, part.id, { tempo: k === 0, order: songPlayOrder(song) });   // \u7167\u7F16\u6392\u7684\u987A\u5E8F\uFF08\u91CD\u590D\u7684\u7EB8\u518D\u5199\u4E00\u904D\uFF1B\u5FAA\u73AF\u6BB5\u5199\u4E00\u904D\uFF09   // \u7B2C\u4E00\u4E2A\u58F0\u90E8\u5E26\u901F\u5EA6\uFF1A\u5B83\u4E0D\u5728\u7684\u7EB8\u4E0A\u7167\u90A3\u5F20\u7EB8\u6700\u4E0A\u9762\u5728\u573A\u7684\u6B4C\u624B\u8865\u53D8\u901F\uFF08\u65B0\u6B4C\u624B\u53EA\u5728\u5F53\u524D\u7EB8\u4EE5\u540E\u5E38\u89C1\uFF09\n    // \u8C31\u53F7\uFF08v0.9.28\uFF09\uFF1A\u6BCF\u5F20\u7EB8\u5F00\u5934\u6309\u5B83\u81EA\u5DF1\u6311\u597D\u7684\u8C31\u53F7\uFF1B\u548C\u524D\u9762\u63A5\u4E0B\u6765\u7684\u4E0D\u4E00\u6837 = \u5728\u7EB8\u754C\u63D2\u4E00\u4E2A\u8C31\u53F7\u8BB0\u53F7\uFF08\u538B\u5E73\u4EF6\u7ED9\u522B\u7684\u8F6F\u4EF6\u770B\uFF0C\u753B\u6CD5\u8981\u5BF9\uFF09\n    let toks = f.tokens.slice(), starts = f.starts.map((x) => ({ ...x }));\n    if (autoOtt(part) && starts.length) {   // \u81EA\u52A8\u516B\u5EA6\u7EBF\uFF08v0.9.37\uFF09\uFF1A\u6BCF\u5F20\u7EB8\u5404\u81EA\u6309\u5B83\u7684\u8C31\u53F7\u7B97\uFF0C\u63D2\u6210\u5E26 ms-auto id \u7684\u8BB0\u53F7\n      const out: Token[] = toks.slice(0, starts[0].index), ns = starts.map((x) => ({ ...x }));\n      starts.forEach((s0, j) => { ns[j].index = out.length; out.push(...withAutoOttava(toks.slice(s0.index, starts[j + 1]?.index ?? toks.length), clefStarts.get(s0.paper.id)?.get(part.id) ?? \"G\")); });\n      toks = out; starts = ns;\n    }\n    const first = part.staves === 2 ? undefined : clefStarts.get(starts[0]?.paper.id ?? \"\")?.get(part.id);\n    if (first) {\n      let off = 0;\n      for (let j = 1; j < starts.length; j++) {\n        const at = starts[j].index + off, want = clefStarts.get(starts[j].paper.id)?.get(part.id); starts[j].index = at; if (!want) continue;\n        const ds = displayStates(toks.slice(0, at), first), now = at > 0 ? ds.clef[at - 1] : first;\n        if (now !== want) { toks.splice(at, 0, { kind: \"clef\", id: 0, clef: want }); off++; }\n      }\n    }\n    return { info: { ...infos[k], ...(first && first !== \"G\" ? { clef: first } : {}) }, tokens: toks, breaks: new Map(starts.slice(1).map((s) => [s.index, s.paper.name])) };\n  }) }, meta);\n  const scoreRest = Object.fromEntries(Object.entries((a.extras.scoreExt ?? {}) as Json).filter(([k]) => !KNOWN_SCORE_KEYS.has(k)));   // \u4E0D\u8BA4\u8BC6\u7684\u9876\u5C42\u952E\u539F\u6837\u5E26\u56DE\uFF08\u5BB6\u65CF\u7EAA\u5F8B\u300C\u672A\u77E5\u952E\u76F4\u901A\u300D\uFF1Bpapers / parts \u662F\u4ECE\u6B4C\u91CD\u5EFA\u7684\uFF09\n  const scoreExt: Json = { ...scoreRest, ...stampOf(\"score\"), papers, parts: song.parts.map((p) => ({ id: p.id, role: p.role, mic: p.mic, kind: \"pitched\", ...(p.staves === 2 ? {} : { clef: p.clef ?? \"auto\" }), ...(p.autoOttava === false ? { autoOttava: false } : {}), ...(p.host ? { host: p.host } : {}) })),   // clef\uFF08v0.9.28\uFF0C\u53EF\u9009\uFF09\uFF1A\u58F0\u90E8\u81EA\u5DF1\u7684\u8C31\u53F7\uFF1Bauto = \u81EA\u52A8\uFF08MusicXML \u91CC\u5199\u7684\u662F\u6311\u597D\u7684\u90A3\u4E2A\uFF09\n    ...(a.view && Object.keys(a.view).length ? { view: a.view } : {}),   // \u89C6\u56FE\u6001\uFF08desk\uFF09\uFF1A\u5B58\u65F6\u987A\u624B\u635E\u8FDB\u6765\uFF0C\u5168\u9ED8\u8BA4\u4E0D\u5199\uFF08\u5951\u7EA6 ViewV1\uFF0C2026-10-08\uFF09\n    ...(song.arrangement?.trim() ? { arrangement: song.arrangement } : {}),   // \u7F16\u6392\u90A3\u4E00\u884C\uFF08\u53EF\u9009\uFF0C2026-10-08 \u6DF1\u591C\uFF09\n    ...(song.lyricFit === \"lyrics\" ? { lyricFit: \"lyrics\" } : {}),\n    ...(song.barNumbers === \"off\" ? { barNumbers: \"off\" } : {}) };   // \u5C0F\u8282\u53F7\u4E0D\u5370\uFF08\u53EF\u9009\uFF0Cv0.9.42\uFF09   // \u6B4C\u8BCD\u6309\u6B4C\u8BCD\u6392\uFF08\u53EF\u9009\uFF0Cv0.9.40\uFF1B\u6CA1\u5199 = \u6309\u8282\u594F\uFF0C\u9ED8\u8BA4\uFF09\n  // \u5D4C\u7684\u97F3\u6E90\uFF1A\u53EA\u5199\u8FD8\u6709\u5019\u9009\u5F15\u7528\u7740\u7684\uFF08\u6362\u4E86\u97F3\u6E90 = \u65E7\u5757\u4ECE\u6B4C\u91CC\u4E22\u6389\uFF1B\u00A710.2\uFF09\n  const referenced = referencedSounds(lounge);\n  const sounds = Object.entries(a.extras.sounds).filter(([p]) => referenced.has(p)).sort(([x], [y]) => (x < y ? -1 : 1));\n  const json = (o: unknown) => strToU8(JSON.stringify(o, null, 2) + \"\\n\");\n  const jsonText = (o: unknown) => JSON.stringify(o, null, 2) + \"\\n\";\n  // \u51FA\u58F0\u5185\u5BB9\u7684\u6307\u7EB9\uFF08src/format/final.ts\uFF09\uFF1A\u548C\u5199\u51FA\u53BB\u7684\u5B57\u7B26\u4E32\u540C\u4E00\u4EFD\uFF08\u7EB8\u7684 MusicXML / score.json / \u4F11\u606F\u5BA4 / \u5F55\u97F3\u623F / \u5D4C\u7684\u97F3\u6E90\u8DEF\u5F84\uFF09\n  const fpParts: FingerprintParts = { papers: Object.fromEntries(papers.map((p) => [p.id, strFromU8(files[p.file])])), scoreExt: fpTextOf(scoreExt),\n    lounge: Object.fromEntries(Object.entries(lounge).map(([id, r]) => [id, fpTextOf(r)])), studio: fpTextOf(studio), sounds: sounds.map(([p]) => p), thumbnail: a.extras.thumbnail };\n  const fingerprint = contentFingerprint(fpParts);\n  const { final: _f, finalRev: _r, core: _c, ...manifestRest } = (a.extras.manifest ?? {}) as Json;   // \u5B9A\u7A3F / \u6838\u5FC3\u90A3\u51E0\u4E2A\u952E\u6309\u73B0\u5728\u7684 extras \u5199\uFF0C\u4E0D\u4ECE\u8BFB\u8FDB\u6765\u7684\u603B\u76EE\u5F55\u91CC\u5E26\uFF08\u6539\u7A3F\u540E final \u4E0D\u80FD\u7559\u7740\uFF09\n  const manifest: Json = { ...manifestRest, format: \"moonsinger\", ...stampOf(\"manifest\"), app: a.app, saved: a.date,\n    files: { \"score.json\": FORMAT.score, \"studio.json\": FORMAT.studio, ...Object.fromEntries(Object.entries(lounge).map(([id, r]) => [`lounge/${id}.json`, Number(r.version ?? 1)])),\n      ...Object.fromEntries(papers.map((p) => [`papers/${p.id}.musicxml`, 0])) },   // 0 = \u6807\u51C6\u4EF6\uFF08MusicXML\uFF09\uFF0C\u4E0D\u662F\u6211\u4EEC\u7684\u7248\u672C\u53F7\n    derived: [\"score.musicxml\"],\n    sounds: sounds.map(([path, b]) => ({ path, sha256: path.slice(SOUNDS.length).replace(/\\.sf2$/, \"\"), bytes: b.length })),\n    ...(a.core ? { core: { version: a.core.version, hash: a.core.hash } } : {}),   // \u6E32\u67D3\u6838\u5FC3\u7684\u7248\u672C + \u54C8\u5E0C\uFF08\u6BCF\u6B21\u5B58\u90FD\u8BB0\uFF09\n    ...(a.extras.finalRev > 0 ? { finalRev: a.extras.finalRev } : {}),\n    ...(a.extras.final && a.extras.finalMp3 ? { final: a.extras.final } : {}) };\n  const rootfiles = [`<rootfile full-path=\"score.musicxml\" media-type=\"application/vnd.recordare.musicxml+xml\"/>`,\n    ...a.extras.rootfiles.map((r) => `<rootfile full-path=\"${r.path}\" media-type=\"${r.mediaType}\"/>`)].join(\"\\n    \");\n  const out: Record<string, Uint8Array> = {};\n  out[\"mimetype\"] = strToU8(MIMETYPE);\n  out[\"META-INF/container.xml\"] = strToU8(`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<container>\\n  <rootfiles>\\n    ${rootfiles}\\n  </rootfiles>\\n</container>\\n`);\n  out[\"score.musicxml\"] = strToU8(flat.xml);\n  out[`${DIR}score.json`] = json(scoreExt);\n  for (const [path, bytes] of Object.entries(files)) out[path] = bytes;\n  for (const [id, r] of Object.entries(lounge)) out[`${DIR}lounge/${id}.json`] = json({ ...r, ...stampOf(\"lounge\") });\n  out[`${DIR}studio.json`] = json({ ...studio, ...stampOf(\"studio\") });\n  for (const [path, bytes] of sounds) out[path] = bytes;\n  for (const [path, bytes] of Object.entries(a.references ?? {})) {\n    if (!path.startsWith(REFERENCES_DIR)) throw new Error(`\u53C2\u8003\u7A97\u7684\u6587\u4EF6\u4E0D\u5728 ${REFERENCES_DIR} \u4E0B\uFF1A${path}`);\n    out[path] = bytes;\n  }\n  if (a.extras.final && a.extras.finalMp3) out[FINAL_MP3_ENTRY] = a.extras.finalMp3;   // \u5B9A\u7A3F mp3\uFF1A\u5927\uFF0C\u6392\u5728\u5927\u4EF6\u540E\u9762\n  for (const [path, bytes] of Object.entries(a.extras.unknown)) if (!(path in out) && path !== THUMBNAIL_ENTRY && path !== FINAL_MP3_ENTRY) out[path] = bytes;\n  // \u603B\u76EE\u5F55\u548C\u5C01\u9762\u6392\u5728\u6700\u540E\uFF1A\u6B4C\u5E93\u5C3E\u8BFB\u4E00\u6B21\uFF08store getPeek 128 KB \u5C3E\u7A97\uFF09\u65E2\u62FF\u5230\u5C01\u9762\u4E5F\u62FF\u5F97\u5230\u603B\u76EE\u5F55\uFF08\u91CC\u9762\u6709\u5B9A\u7A3F\u8BB0\u5F55 = \u5361\u7247\u4E0A\u80FD\u76F4\u63A5\u542C\uFF09\n  out[`${DIR}manifest.json`] = json(manifest);\n  if (a.extras.thumbnail) out[THUMBNAIL_ENTRY] = a.extras.thumbnail;   // \u5C01\u9762\u6700\u540E\u4E00\u4E2A\uFF08\u5C3E\u8BFB\uFF09\n  return { out, fingerprint };\n}\n\n/** stem = \u6253\u5F00\u7684\u6587\u4EF6\u53EB\u4EC0\u4E48\uFF08\u53BB\u6389\u6269\u5C55\u540D\uFF1B\u6587\u4EF6\u540D\u548C\u6B4C\u540D\u5206\u5F00\uFF1A\u6B4C\u540D\u5728 song.title\uFF0C\u53EF\u4E0D\u586B\uFF09\u3002 */\nexport interface Opened { song: Song; stem: string; hum: Hum; extras: Extras; ours: boolean; notices: string[]; view: Record<string, unknown> | null; references: Record<string, Uint8Array>; /** \u300C\u66F4\u65B0\u7248\u672C\u5199\u7684\uFF08minor\uFF09\u300D\u90A3\u4E00\u53E5\uFF08\u6700\u591A\u4E00\u6761\uFF09\uFF1A\u5BBF\u4E3B info \u4E00\u6B21\uFF0C\u4E0D\u662F\u62A5\u9519\u3001\u4E0D\u62E6\u3002 */ advice: string[] }   // references = \u53C2\u8003\u7A97\u76EE\u5F55\u7684\u539F\u6837\u5B57\u8282\uFF08\u6CA1\u6709 = {}\uFF09   // view = score.json \u91CC\u7684\u89C6\u56FE\u6001\uFF08\u6CA1\u6709 = null\uFF1Bdesk.ts \u5BBD\u5BB9\u8BFB\uFF09\n\n// \u2500\u2500 \u89D2\u8272\uFF08\u8C31\u4E0A\u7684\u529F\u80FD\u4F4D\uFF1B\u4E00\u4E2A\u58F0\u90E8\u4E00\u4E2A\u89D2\u8272 id\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/** \u8FD9\u4E2A\u89D2\u8272\u8C31\u4E0A\u5199\u7684\u540D\u5B57 = MusicXML \u7684 <part-name>\uFF08user\u300C\u8C31\u4E0A\u9762\u663E\u793A\u7684\u4E0D\u5E94\u8DDF\u662F\u6708\u8BFB\uFF0C\u800C\u662F\u4EBA\u58F0\uFF0C\u5973\u58F0 lead bass violin\u4E4B\u7C7B\u529F\u80FD\u7684\u4E1C\u897F\uFF0C\n *  \u8FD8\u8BB0\u5F97\u4E4B\u524D\u8BF4\u7684\u7ED9role assign \u4E50\u5668\u7684\u903B\u8F91\u5417\uFF1F\u2026\u4E0D\u7136\u7684\u8BDD\u4F60fl studio\u4E00\u4E2A\u4E71\u4E03\u516B\u7CDF\u7684\u63D2\u4EF6\uFF0C\u6708\u8BFB\u4F1A\u53D8\u6210c:/apps/\u2026/\u6708\u5EA6_v1.0_\u7EFF\u8272\u7834\u89E3\u7248.dll \u8FD9\u4E2A\u5C31\u662F\u6211\u90A3\u4E2A\u7A84\u63A5\u53E3\u8981\u62E6\u7684\u300D\uFF09\u3002\n *  \u4E50\u5668\uFF08\u5019\u9009\uFF09\u7684\u540D\u5B57\u4E0D\u4E0A\u8C31\u3002 */\nexport function roleName(extras: Extras, role: string): string { return String(extras.lounge[role]?.name ?? DEFAULT_ROLE.name); }\n/** \u8FD9\u4E2A\u89D2\u8272\u662F\u4EC0\u4E48\uFF08MusicXML \u5B98\u65B9 <instrument-sound> id\uFF0Csrc/score/roles.ts\uFF1Buser\u300C\u89D2\u8272\u540D\u53EF\u4EE5\u548Cxml\u7684\u4E50\u5668 \u529F\u80FD\u8BED\u4E49\u5BF9\u9F50\uFF0C\u7528\u6700\u5B98\u65B9\u7684\u6B63\u89C4\u7684\u300D\uFF09\u3002 */\nexport function roleSound(extras: Extras, role: string): string { return String(extras.lounge[role]?.sound ?? DEFAULT_ROLE.sound); }\n/** \u5404\u58F0\u90E8\u8C31\u4E0A\u5199\u7684\u540D\u5B57\uFF08\u548C song.parts \u4E00\u4E00\u5BF9\u5E94\uFF1B\u540C\u540D\u540C\u79CD\u7684\u5E26\u53F7\uFF0Csrc/score/roles.ts numberParts\uFF09\u3002 */\nexport function partLabels(song: Song, extras: Extras): string[] { return numberParts(song.parts.map((p) => ({ name: roleName(extras, p.role), sound: roleSound(extras, p.role) }))); }\n/** \u6539\u89D2\u8272\u540D\uFF08\u9009\u4E86\u9884\u8BBE = \u8FDE\u5B98\u65B9 id \u4E00\u8D77\u6539\uFF1B\u81EA\u5DF1\u5199\u7684\u540D\u5B57 = \u5B98\u65B9 id \u4E0D\u53D8\uFF09\u3002\u8FD8\u6CA1\u6709\u89D2\u8272\u5FEB\u7167 = \u5148\u6309\u9ED8\u8BA4\u7684\u5EFA\u4E00\u4EFD\u3002 */\nexport function withRoleName(extras: Extras, role: string, name: string, hum: Hum, sound?: string): Extras {\n  const r = roleOf(extras, role, hum);\n  r.name = name;\n  if (sound) r.sound = sound;\n  return { ...extras, lounge: { ...extras.lounge, [role]: r } };\n}\n/** \u89D2\u8272\u6539\u6210\u67D0\u4E2A\u4E50\u5668\u6982\u5FF5\uFF08\u627E\u4EBA\u89C6\u56FE\u91CC\u6311\u4E86\uFF09\uFF1A\u540D\u5B57 + \u5B98\u65B9 id + id \u675F by value\u3002 */\nexport function withRoleConcept(extras: Extras, role: string, c: { name: string; sound: string | null; concept: NonNullable<import(\"./contract.ts\").LoungeRoleV2[\"concept\"]> }, hum: Hum): Extras {\n  const r = roleOf(extras, role, hum);\n  r.name = c.name; if (c.sound) r.sound = c.sound; r.concept = c.concept;\n  return { ...extras, lounge: { ...extras.lounge, [role]: r } };\n}\n/** \u65B0\u58F0\u90E8\u8981\u7684\u89D2\u8272 id\uFF08\u4F11\u606F\u5BA4\u91CC\u6CA1\u7528\u8FC7\u7684\u300Cr<n>\u300D\uFF09\u3002 */\nexport function newRoleId(extras: Extras, song: Song): string { return nextKey([...Object.keys(extras.lounge), ...song.parts.map((p) => p.role)], \"r\"); }\n/** \u65B0\u58F0\u90E8\u8981\u7684\u9EA6\u514B\u98CE id\u3002 */\n// \u2500\u2500 \u5F55\u97F3\u623F v2\uFF1A\u8F68\uFF08mic / bus\uFF09+ \u603B\u8F68\uFF08\u5951\u7EA6 StudioV2\uFF1B2026-10-10 \u5200 4\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport type StudioTrack = { id: string; kind: \"mic\" | \"bus\"; name: string; gainDb: number; pan: number; chain: FxV2[]; sends: { to: string; gainDb: number }[]; to: string; bypass: boolean };\nconst emptyStudio = (): Json => ({ version: FORMAT.studio, tracks: [], master: { gainDb: 0, limiter: true, chain: [] } });\nconst micTrack = (id: string, name: string): Json => ({ id, kind: \"mic\", name, gainDb: 0, pan: 0, chain: [], sends: [], to: \"master\" });\nconst normTrack = (t: Json): StudioTrack => ({ id: String(t.id), kind: t.kind === \"bus\" ? \"bus\" : \"mic\", name: String(t.name ?? \"\"), gainDb: Number(t.gainDb ?? 0) || 0, pan: Math.max(-1, Math.min(1, Number(t.pan ?? 0) || 0)),\n  chain: Array.isArray(t.chain) ? (t.chain as FxV2[]) : [], sends: Array.isArray(t.sends) ? (t.sends as { to: string; gainDb: number }[]) : [], to: typeof t.to === \"string\" ? t.to : \"master\", bypass: t.bypass === true });\n/** \u5F55\u97F3\u623F\u91CC\u7684\u8F68\uFF08\u539F\u6837\u8BFB\u51FA\uFF1B\u6CA1\u6709\u5F55\u97F3\u623F = \u7A7A\uFF09\u3002 */\nexport function studioTracks(extras: Extras): StudioTrack[] { return ((extras.studio?.tracks as Json[] | undefined) ?? []).map(normTrack); }\nexport function studioTrack(extras: Extras, id: string): StudioTrack | null { const t = ((extras.studio?.tracks as Json[] | undefined) ?? []).find((x) => x.id === id); return t ? normTrack(t) : null; }\n/** \u6539\u4E00\u6761\u8F68\uFF08\u6CA1\u6709\u5F55\u97F3\u623F / \u6CA1\u6709\u8FD9\u6761 = \u5148\u5EFA\u4E00\u6761 mic \u8F68\uFF09\uFF1A\u589E\u76CA / \u58F0\u50CF / \u540D\u5B57 / \u6548\u679C\u94FE / \u53D1\u9001 / \u53BB\u54EA\u3002 */\nexport function withTrack(extras: Extras, id: string, patch: Partial<Omit<StudioTrack, \"id\" | \"kind\">> & { kind?: \"mic\" | \"bus\" }): Extras {\n  const studio: Json = structuredClone(extras.studio ?? emptyStudio());\n  const tracks = ((studio.tracks as Json[] | undefined) ?? []).slice();\n  let t = tracks.find((x) => x.id === id);\n  if (!t) { t = patch.kind === \"bus\" ? { ...micTrack(id, patch.name ?? \"\u603B\u7EBF\"), kind: \"bus\" } : micTrack(id, patch.name ?? `\u9EA6\u514B\u98CE ${tracks.filter((x) => x.kind === \"mic\").length + 1}`); tracks.push(t); }\n  const { kind: _k, ...rest } = patch; Object.assign(t, structuredClone(rest));\n  if (t.bypass !== true) delete t.bypass;   // \u65C1\u901A\u53EA\u5199 true\uFF08\u6CA1\u5F00 = \u4E0D\u5199\u8FD9\u4E2A\u5B57\u6BB5\uFF09\n  studio.tracks = tracks;\n  return { ...extras, studio };\n}\n/** \u5220\u4E00\u6761\u603B\u7EBF\uFF08mic \u8F68\u8DDF\u7740\u58F0\u90E8\u8D70\uFF0C\u8FD9\u91CC\u4E0D\u5220\uFF09\uFF1B\u6307\u7740\u5B83\u7684\u53D1\u9001 / \u53BB\u5411\u56DE\u603B\u8F68\u3002 */\nexport function withoutBus(extras: Extras, id: string): Extras {\n  const studio: Json = structuredClone(extras.studio ?? emptyStudio());\n  studio.tracks = ((studio.tracks as Json[] | undefined) ?? []).filter((x) => !(x.id === id && x.kind === \"bus\")).map((x) => ({ ...x, to: x.to === id ? \"master\" : x.to, sends: ((x.sends as Json[] | undefined) ?? []).filter((sd) => sd.to !== id) }));\n  return { ...extras, studio };\n}\n/** \u6DF7\u97F3\u8F68\u5F80\u524D / \u5F80\u540E\u632A\u4E00\u4F4D\uFF08\u53EA\u5728\u6DF7\u97F3\u8F68\u4E4B\u95F4\u6362\uFF1B\u6B4C\u624B\u7684\u9EA6\u514B\u98CE\u8F68\u4E0D\u52A8\uFF0C\u5B83\u4EEC\u7684\u987A\u5E8F\u8DDF\u8C31\u8D70\uFF09\u3002\u5230\u5934 = \u539F\u6837\u3002v0.10.10\uFF0Cuser\u300C\u6DF7\u97F3\u8F68\u4E4B\u95F4\u8FD8\u53EF\u4EE5\u6392\u5E8F\u300D\u3002 */\nexport function moveBus(extras: Extras, id: string, dir: -1 | 1): Extras {\n  const tracks = ((extras.studio?.tracks as Json[] | undefined) ?? []).slice(), buses = tracks.map((t, i) => [t, i] as const).filter(([t]) => t.kind === \"bus\");\n  const k = buses.findIndex(([t]) => t.id === id), j = k + dir; if (k < 0 || j < 0 || j >= buses.length) return extras;\n  const [a, ia] = buses[k], [b, ib] = buses[j]; tracks[ia] = b; tracks[ib] = a;\n  return { ...extras, studio: { ...(extras.studio as Json), tracks } };\n}\nexport function newBusId(extras: Extras): string { return nextKey(studioTracks(extras).map((t) => t.id), \"b\"); }\n/** \u603B\u8F68\uFF08studio.json master\uFF1B\u6CA1\u5199 = 0 dB + \u9650\u5E45\u5F00 + \u7A7A\u94FE\uFF09\u3002 */\nexport function activeMaster(extras: Extras): { gainDb: number; limiter: boolean; chain: FxV2[] } {\n  const m = extras.studio?.master as { gainDb?: unknown; limiter?: unknown; chain?: unknown } | undefined;\n  const g = Number(m?.gainDb ?? 0);\n  return { gainDb: Number.isFinite(g) ? Math.max(-24, Math.min(12, g)) : 0, limiter: m?.limiter === undefined ? true : !!m.limiter, chain: Array.isArray(m?.chain) ? (m!.chain as FxV2[]) : [] };\n}\nexport function withMaster(extras: Extras, patch: { gainDb?: number; limiter?: boolean; chain?: FxV2[] }): Extras {\n  const studio: Json = structuredClone(extras.studio ?? emptyStudio());\n  studio.master = { ...activeMaster(extras), ...structuredClone(patch) };\n  return { ...extras, studio };\n}\n/** \u8DDF\u7740\u6F14\u594F\u8005\u8D70\u7684\u6548\u679C\u94FE\uFF08CandidateV2.chain\uFF1B\u6CA1\u6709 = \u7A7A\uFF09\u3002 */\nexport function activeChain(extras: Extras, role: string): FxV2[] { const c = activeCandidate(extras, role); return Array.isArray(c?.chain) ? (c!.chain as FxV2[]) : []; }\nexport function newMicId(extras: Extras, song: Song): string { return nextKey([...studioTracks(extras).map((m) => m.id), ...song.parts.map((p) => p.mic)], \"m\"); }\n/** \u7ED9\u65B0\u58F0\u90E8\u5728\u4F11\u606F\u5BA4\u91CC\u5EFA\u4E00\u4EFD\u9ED8\u8BA4\u89D2\u8272\uFF08\u6708\u8BFB\u4E24\u4E2A\u5019\u9009\uFF1B\u540D\u5B57\u53EF\u7ED9\uFF09\u3002 */\nexport function withNewRole(extras: Extras, role: string, hum: Hum, name?: string, sound?: string): Extras {\n  if (extras.lounge[role]) return extras;\n  const r = defaultRole(hum, role); if (name) r.name = name; if (sound) r.sound = sound;\n  return { ...extras, lounge: { ...extras.lounge, [role]: r } };\n}\n/** \u5220\u4E00\u4E2A\u58F0\u90E8\u4E4B\u540E\uFF1A\u5B83\u7684\u89D2\u8272\u4ECE\u4F11\u606F\u5BA4\u62FF\u6389\uFF08\u5D4C\u7684\u97F3\u6E90\u6CA1\u522B\u4EBA\u5F15\u7528 = \u4E00\u8D77\u4E22\uFF09\u3002 */\nexport function withoutRole(extras: Extras, role: string): Extras {\n  const lounge = { ...extras.lounge }; delete lounge[role];\n  return pruneSounds({ ...extras, lounge });\n}\n// \u2500\u2500 \u5F55\u97F3\u623F\uFF08\u9EA6\u514B\u98CE\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/** \u6539\u4E00\u4E2A\u9EA6\u514B\u98CE\u7684\u589E\u76CA / \u58F0\u50CF\uFF08\u6CA1\u6709\u5F55\u97F3\u623F / \u6CA1\u6709\u8FD9\u4E2A\u9EA6\u514B\u98CE = \u5148\u5EFA\uFF09\u3002 */\nexport function withMic(extras: Extras, micId: string, patch: { gainDb?: number; pan?: number }): Extras { return withTrack(extras, micId, patch); }\n// \u2500\u2500 \u5019\u9009\uFF08\u8C01\u6765\u6F14\uFF1B\u4F11\u606F\u5BA4\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport interface CandidateInfo { id: string; name: string; engine: Engine }\n/** \u89D2\u8272\u7684\u5019\u9009\u4EEC\uFF08\u987A\u5E8F = \u6587\u4EF6\u91CC\u7684\u987A\u5E8F\uFF09\u3002\u6CA1\u6709\u89D2\u8272\u5FEB\u7167 = \u9ED8\u8BA4\u7684\u4E24\u4E2A\u6708\u8BFB\u3002 */\nexport function candidates(extras: Extras, role: string): CandidateInfo[] {\n  return cands(extras.lounge[role] ?? defaultRole(\"n\", role)).map((c) => ({ id: String(c.id), name: String(c.name ?? \"\"), engine: instrumentOf(c)?.engine ?? \"unknown\" }));\n}\n/** \u4E0A\u573A\u7684\u5019\u9009\u7684 id\uFF08\u6CA1\u6709\u89D2\u8272\u5FEB\u7167 = \u9ED8\u8BA4\u7684 c1\uFF09\u3002 */\nexport function activeId(extras: Extras, role: string): string { return String(extras.lounge[role]?.active ?? CANDIDATE_ID.full); }\n/** \u73B0\u5728\u4E0A\u573A\u7684\u5019\u9009\uFF08\u6574\u4EFD json\uFF09\u3002 */\nexport function activeCandidate(extras: Extras, role: string): Json | null {\n  const r = extras.lounge[role]; if (!r) return null;\n  return cands(r).find((x) => x.id === r.active) ?? null;\n}\n/** \u4E0A\u573A\u90A3\u4F4D\uFF08\u6574\u4EFD json\uFF09\uFF1B\u6CA1\u6709\u89D2\u8272\u5FEB\u7167 = \u9ED8\u8BA4\u89D2\u8272\u91CC\u4E0A\u573A\u7684\uFF08\u6708\u8BFB\uFF09\u2014\u2014\u7F72\u540D\u63A8\u6F14\u8981\u5B83\uFF1A\u65B0\u6B4C\u6CA1\u52A8\u8FC7\u300C\u8C01\u6765\u6F14\u300D\u7684\u58F0\u90E8\u4E5F\u662F\u6708\u8BFB\u5728\u5531\uFF082026-10-08 by Claude Opus 5.5\uFF09\u3002 */\nexport function activeOrDefaultCandidate(extras: Extras, role: string): Json | null {\n  const r = extras.lounge[role] ?? defaultRole(\"n\", role);\n  return cands(r).find((x) => x.id === r.active) ?? null;\n}\n/** \u73B0\u5728\u4E0A\u573A\u7684\u5019\u9009\uFF08\u4E50\u5668\uFF09\u53EB\u4EC0\u4E48\u2014\u2014\u53EA\u7ED9\u89D2\u8272\u5361\u91CC\u770B\uFF0C\u4E0D\u4E0A\u8C31\u3002 */\nexport function activeCandidateName(extras: Extras, role: string): string | null { const c = activeOrDefaultCandidate(extras, role); return c ? String(c.name ?? \"\") : null; }   // \u6CA1\u6709\u89D2\u8272\u5FEB\u7167 = \u9ED8\u8BA4\u7684\u6708\u8BFB\uFF08\u548C activeInstrument \u4E00\u81F4\uFF1B\u65B0\u6B4C\u7684\u6B4C\u624B\u724C / \u5F55\u97F3\u5BA4\u522B\u5199\u300C\u6CA1\u4EBA\u4E0A\u573A\u300D\uFF09\n/** \u4E0A\u573A\u7684\u90A3\u4F4D\u7684\u4E50\u5668\uFF08\u6309\u5F15\u64CE\u5206\uFF09\uFF1B\u6CA1\u6709\u89D2\u8272\u5FEB\u7167 = \u9ED8\u8BA4\u7684\u6708\u8BFB\u5B8C\u6574\u7248\u3002 */\nexport function activeInstrument(extras: Extras, role: string): InstrumentV2 | null {\n  if (!extras.lounge[role]) return { engine: \"tsukuyomi\", model: { ...TSUKUYOMI_MODEL }, hum: \"n\" };\n  return instrumentOf(activeCandidate(extras, role));\n}\n/** \u54FC\u7684\u5B57\uFF08\u6708\u8BFB\u5019\u9009\u5171\u7528\uFF09\uFF1A\u4F11\u606F\u5BA4\u91CC\u7B2C\u4E00\u4E2A\u6708\u8BFB\u5019\u9009\u7684\uFF1B\u6CA1\u6709 = \u9ED8\u8BA4\u300C\u55EF\u300D\u3002 */\nexport function humOf(extras: Extras): Hum {\n  for (const r of Object.values(extras.lounge)) for (const c of cands(r)) { const i = instrumentOf(c); if (isVoice(i)) return i.hum; }\n  return \"n\";\n}\n/** \u6362\u4E0A\u573A\u7684\u5019\u9009\uFF08\u4EBA\u9009\u7684\uFF1B\u4E0D\u81EA\u52A8\uFF09\u3002 */\nexport function withActive(extras: Extras, role: string, id: string, hum: Hum): Extras {\n  const r = roleOf(extras, role, hum);\n  r.active = id;\n  return { ...extras, lounge: { ...extras.lounge, [role]: r } };\n}\n\n// \u2500\u2500 SoundFont \u5019\u9009\uFF08\u5951\u7EA6 \u00A710.2\uFF1A\u5B50\u96C6 by value \u5D4C\u8FDB\u6B4C\uFF1B\u5F31\u5F15\u7528 = \u53EA\u8BB0\u6765\u6E90\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport interface GmCandidate {\n  id: string; name: string; bank: number; program: number;\n  note?: number;                       // \u6BCF\u4E2A\u97F3\u90FD\u6572\u8FD9\u4E2A\u952E\uFF1A\u9F13\u4EF6 / \u97F3\u6548\u56FA\u5B9A\u539F\u901F\n  sfx?: { key: number; midi?: number; centsPerKey?: number; align?: boolean };   // \u97F3\u6548\uFF08\u4E0A\u573A\u65F6\u4ECE\u76EE\u5F55\u6309\u503C\u6284\u7684\u539F\u901F\u952E / \u97F3\u9AD8\u951A\u70B9\uFF1Bsrc/gm/sf-key.ts\uFF09\n  path: string | null;                 // \u5B57\u8282\u5728\u6B4C\u91CC\u7684\u8DEF\u5F84\uFF1Bnull = \u5F31\u5F15\u7528\uFF08\u6B4C\u91CC\u4E0D\u5E26\u58F0\u97F3\uFF09\n  bytes: Uint8Array | null;            // \u6B4C\u91CC\u5E26\u7684\u5B57\u8282\uFF1Bnull = \u5F31\u5F15\u7528\uFF0C\u6216\u5F3A\u5F15\u7528\u4F46\u6587\u4EF6\u91CC\u5C11\u4E86\u90A3\u5757\n  origin: Sf2Source[\"origin\"];\n  subsetSha256: string;                // \u5F31\u5F15\u7528\u91CD\u65B0\u5207\u51FA\u6765\u65F6\u6838\u5BF9\u7528\n}\n/** \u89D2\u8272\u7684 SoundFont \u5019\u9009\u4EEC\u3002 */\nexport function gmCandidates(extras: Extras, role: string): GmCandidate[] {\n  return cands(extras.lounge[role]).flatMap((c) => {\n    const i = instrumentOf(c); if (i?.engine !== \"soundfont\") return [];\n    const s = i.source;\n    return [{ id: String(c.id), name: String(c.name ?? \"\"), bank: i.bank, program: i.program, ...(i.note !== undefined ? { note: i.note } : {}), ...(i.sfx ? { sfx: i.sfx } : {}), path: s.embedded, bytes: s.embedded ? extras.sounds[s.embedded] ?? null : null, origin: s.origin, subsetSha256: s.subsetSha256 }];\n  });\n}\n/** \u73B0\u5728\u4E0A\u573A\u7684 SoundFont \u5019\u9009\uFF08\u4E0A\u573A\u7684\u4E0D\u662F\u5B83 = null\uFF09\u3002 */\nexport function activeGm(extras: Extras, role: string): GmCandidate | null { const id = activeId(extras, role); return gmCandidates(extras, role).find((c) => c.id === id) ?? null; }\nexport interface Sf2CandidateArgs {\n  name: string; bank: number; program: number; note?: number;\n  sfx?: { key: number; midi?: number; centsPerKey?: number; align?: boolean };   // \u97F3\u6548\uFF1A\u539F\u901F\u952E / \u97F3\u9AD8\u951A\u70B9\uFF08\u4ECE\u76EE\u5F55\u6309\u503C\u6284\uFF1Bnote \u8BBE\u6210 sfx.key = \u56FA\u5B9A\u539F\u901F\uFF0C\u9ED8\u8BA4\uFF09\n  subset: Uint8Array; sha256: string;                                   // \u5B50\u96C6\u5B57\u8282 + \u5B83\u7684 sha256\uFF08\u8C03\u7528\u65B9\u7B97\uFF0Ccrypto.subtle \u662F\u5F02\u6B65\u7684\uFF09\n  embed?: boolean;                                                      // \u9ED8\u8BA4 true = \u5B57\u8282\u8FDB\u6B4C\uFF1Bfalse = \u5F31\u5F15\u7528\uFF08\u53EA\u8BB0\u6765\u6E90 + \u5B50\u96C6 sha256\uFF0C\u6B4C\u91CC\u4E0D\u5E26\u58F0\u97F3\uFF09\n  origin: Sf2Source[\"origin\"];                                          // \u4ECE\u54EA\u4E2A\u6574\u5305\u5207\u7684\n  credit: Credit;\n  calibrationDb?: number;                                               // \u54CD\u5EA6\u6821\u51C6\uFF1B\u9ED8\u8BA4 SOUNDFONT_CALIBRATION_DB\uFF08performance.ts\uFF1B\u6B4C\u624B\u724C\u4E0A\u770B\u5F97\u89C1\u3001\u80FD\u8C03\uFF09\n  gapSec?: number;                                                      // \u8FDE\u65AD\u7684\u5E95\u8272\uFF08\u79D2\uFF09\uFF1A\u8C03\u7528\u65B9\u4ECE\u76EE\u5F55\uFF08\u4ED3\u9F20 v11 \u7684 joint\uFF0C\u6309 GM \u53F7\u9010\u4E2A\uFF09\u6309\u503C\u7ED9\uFF1B\u6CA1\u7ED9 = 0\uFF08\u4E0D\u7559\u7F1D\uFF09\n  canSwell?: boolean;                                                   // \u80FD\u4E0D\u80FD\u5728\u4E00\u4E2A\u97F3\u91CC\u9762\u53D8\u5F3A\uFF08\u4ED3\u9F20 v11 \u7684 sustain = sustained\uFF09\uFF1B\u6CA1\u7ED9 = \u80FD\n}\n/** \u52A0\u4E00\u4E2A SoundFont \u5019\u9009\u5E76\u8BA9\u5B83\u4E0A\u573A\u3002\u540C\u4E00\u4EFD\u5B57\u8282\uFF08\u540C sha256\uFF09\u53EA\u5B58\u4E00\u4EFD\u3002 */\nexport function withSf2Candidate(extras: Extras, role: string, c: Sf2CandidateArgs, hum: Hum): Extras {\n  const r = roleOf(extras, role, hum);\n  const list = cands(r);\n  const n = Math.max(0, ...list.map((x) => Number(/^c(\\d+)$/.exec(String(x.id))?.[1] ?? 0))) + 1, id = `c${n}`;\n  const embed = c.embed !== false, path = embed ? `${SOUNDS}${c.sha256}.sf2` : null;\n  const instrument: InstrumentV2 = { engine: \"soundfont\", bank: c.bank, program: c.program, ...(c.note !== undefined ? { note: c.note } : {}), ...(c.sfx ? { sfx: { ...c.sfx } } : {}), source: { embedded: path, subsetBytes: c.subset.length, subsetSha256: c.sha256, origin: c.origin } };\n  list.push({ id, name: c.name, instrument, gm: { program: c.bank === 128 ? null : c.program + 1, variant: null }, ...common(), articulation: { ...ARTICULATION, gapSec: Math.max(0, Math.min(GAP_MAX_SEC, c.gapSec ?? 0)), marcatoDb: MARCATO_DB, accentVel: ACCENT_VEL, marcatoVel: MARCATO_VEL, ...MARK_DEFAULTS, ...(c.canSwell === false ? { canSwell: false } : {}) }, dynamicsVel: { ...DYNAMICS_VEL }, calibrationDb: c.calibrationDb ?? SOUNDFONT_CALIBRATION_DB, defaults: { ...SOUNDFONT_DEFAULTS, velocity: DYNAMICS_VEL.mf / 127 }, credit: c.credit, spec: structuredClone(SOUNDFONT_SPEC) });\n  r.candidates = list; r.active = id;\n  return { ...extras, lounge: { ...extras.lounge, [role]: r }, sounds: path ? { ...extras.sounds, [path]: c.subset } : extras.sounds };\n}\n/** \u54EA\u4E9B\u5D4C\u5165\u5757\u8FD8\u6709\u5019\u9009\u5F15\u7528\u7740\uFF08GC \u7684\u6839 = \u4F11\u606F\u5BA4\u91CC\u6240\u6709\u5019\u9009\uFF0C\u4E0D\u53EA\u4E0A\u573A\u7684\u2014\u2014\u300C\u4E0B\u7EBF\u7684\u5019\u9009\u7559\u7740\u4E0D\u5220\u300D\uFF09\u3002 */\nfunction referencedSounds(lounge: Record<string, Json>): Set<string> {\n  const refs = new Set<string>();\n  for (const r of Object.values(lounge)) for (const c of cands(r)) { const i = instrumentOf(c); if (i?.engine === \"soundfont\" && typeof i.source?.embedded === \"string\") refs.add(i.source.embedded); }\n  return refs;\n}\n/** \u5185\u5B58\u91CC\u7684 GC\uFF1A\u4E22\u6389\u6CA1\u4EBA\u5F15\u7528\u7684\u5D4C\u5165\u5757\uFF08\u5220\u5019\u9009 / \u6362\u5D4C\u5165\u5757\u4E4B\u540E\u7ACB\u523B\u505A\uFF0C\u4E0D\u7B49\u5B58\u6863\u2014\u2014user\u300C\u9700\u8981\u4E25\u683C\u7684 GC\u300D\uFF09\u3002 */\nexport function pruneSounds(extras: Extras): Extras {\n  const refs = referencedSounds(extras.lounge), keep = Object.entries(extras.sounds).filter(([p]) => refs.has(p));\n  return keep.length === Object.keys(extras.sounds).length ? extras : { ...extras, sounds: Object.fromEntries(keep) };\n}\n/** \u5220\u4E00\u4E2A\u5019\u9009\uFF08\u4EBA\u5220\u7684\uFF1B\u4E0A\u573A\u7684\u90A3\u4E2A\u4E0D\u8BB8\u5220\u2014\u2014\u5148\u6362\u4EBA\uFF09\u3002\u5B83\u7684\u5D4C\u5165\u5757\u6CA1\u522B\u4EBA\u5F15\u7528 = \u4E00\u8D77\u4E22\u3002 */\nexport function withoutCandidate(extras: Extras, role: string, id: string): Extras {\n  const r = structuredClone(extras.lounge[role]); if (!r) return extras;\n  if (r.active === id) throw new Error(\"\u4E0A\u573A\u7684\u5019\u9009\u4E0D\u80FD\u5220\uFF0C\u5148\u6362\u4E00\u4E2A\u300C\u8C01\u6765\u6F14\u300D\");\n  r.candidates = cands(r).filter((c) => c.id !== id);\n  return pruneSounds({ ...extras, lounge: { ...extras.lounge, [role]: r } });\n}\n\n// \u2500\u2500 \u6253\u5305 / \u89E3\u5305\uFF082026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u6211\u540E\u6094\u81EA\u52A8embed\u97F3\u6E90\u4E86\uFF0C\u6539\u6210\u5F31\u5F15\u7528\u5427\uFF0Capp\u53EF\u4EE5\u81EA\u5DF1\u627E\u5417\uFF0C\u7136\u540E\u7C7B\u4F3Cblender\uFF0C\n//    \u53EF\u4EE5pack all packable resources\u6216\u8005unpack all\u3002\u7136\u540E\u5BFC\u51FA\u7684\u65F6\u5019\u53EF\u4EE5\u9009\u5BFC\u51FApacked\u7248\u672C\u7684\u3002\u4E0D\u8FC7\u6708\u8BFB\u4E0D\u80FDpack\u5427\u300D\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// \u53EA\u52A8 source.embedded\uFF08\u5B57\u8282\u6765\u53BB\uFF09\uFF0C**sha256 / origin \u4E00\u5F8B\u4E0D\u78B0**\uFF1A\u89E3\u6790\u94FE\u6309\u5B50\u96C6 sha256 \u8BA4\u4EBA\uFF08\u5951\u7EA6 Sf2Source\uFF09\u3002\n// \u80FD\u6253\u5305\u7684\u53EA\u6709 SoundFont \u5B50\u96C6\uFF08\u6837\u672C\u7C7B\uFF0C\u5951\u7EA6 \u00A710.2\uFF09\uFF1B\u6708\u8BFB / \u5143\u97F3\u7248\u662F\u5BB6\u65CF\u6A21\u578B\u5305 / app \u968F\u5E26\u7684\u8868\uFF0C\u9489\u54C8\u5E0C\uFF0C\u6C38\u4E0D\u8FDB\u6B4C\u3002\nexport interface SoundUse { subsetSha256: string; packed: boolean; bytes: number; origin: Sf2Source[\"origin\"]; names: string[] }\n/** \u6B4C\u91CC\u6240\u6709 SoundFont \u5019\u9009\u7528\u5230\u7684\u58F0\u97F3\uFF08\u53F0\u4E0A + \u5019\u8865\u90FD\u7B97\uFF1B\u540C\u4E00\u4EFD\u5B50\u96C6\u53EA\u7B97\u4E00\u6B21\uFF09\u3002packed = \u5B57\u8282\u5728\u6B4C\u91CC\u3002 */\nexport function soundUses(extras: Extras): SoundUse[] {\n  const out = new Map<string, SoundUse>();\n  for (const r of Object.values(extras.lounge)) for (const c of cands(r)) {\n    const i = instrumentOf(c); if (i?.engine !== \"soundfont\") continue;\n    const s = i.source, had = out.get(s.subsetSha256), packed = !!(s.embedded && extras.sounds[s.embedded]);\n    if (had) { had.packed ||= packed; if (!had.names.includes(String(c.name ?? \"\"))) had.names.push(String(c.name ?? \"\")); continue; }\n    out.set(s.subsetSha256, { subsetSha256: s.subsetSha256, packed, bytes: Number(s.subsetBytes ?? 0), origin: s.origin, names: [String(c.name ?? \"\")] });\n  }\n  return [...out.values()];\n}\nconst soundPath = (sha256: string) => `${SOUNDS}${sha256}.sf2`;\n/** \u6253\u5305\uFF1A\u6CA1\u5728\u6B4C\u91CC\u7684 SoundFont \u5019\u9009\uFF08\u5F31\u5F15\u7528\uFF0C\u6216\u5F3A\u5F15\u7528\u4F46\u6587\u4EF6\u91CC\u5C11\u4E86\u90A3\u5757\uFF09\uFF0Chave(\u5B50\u96C6 sha256) \u7ED9\u5F97\u51FA\u5B57\u8282\u7684 \u2192 \u5D4C\u8FDB\u6B4C\u3002\n *  \u8C03\u7528\u65B9\u4FDD\u8BC1 have \u7ED9\u7684\u5B57\u8282\u6838\u8FC7 sha256\u3002\u8FD4\u56DE\u6253\u5305\u4E86\u54EA\u4E9B\u3001\u54EA\u4E9B\u62FF\u4E0D\u5230\uFF08\u62FF\u4E0D\u5230\u7684\u4FDD\u6301\u539F\u6837\uFF0C\u4E0D\u9759\u9ED8\uFF1A\u8C03\u7528\u65B9\u62A5\u51FA\u6765\uFF09\u3002 */\nexport function withPacked(extras: Extras, have: (subsetSha256: string) => Uint8Array | undefined): { extras: Extras; packed: string[]; missing: string[] } {\n  const lounge: Record<string, Json> = {}, sounds = { ...extras.sounds }, packed = new Set<string>(), missing = new Set<string>();\n  for (const [id, r0] of Object.entries(extras.lounge)) {\n    const r = structuredClone(r0);\n    for (const c of cands(r)) {\n      const i = instrumentOf(c); if (i?.engine !== \"soundfont\") continue;\n      const s = i.source; if (s.embedded && sounds[s.embedded]) continue;\n      const path = soundPath(s.subsetSha256), b = sounds[path] ?? have(s.subsetSha256);\n      if (!b) { missing.add(s.subsetSha256); continue; }\n      sounds[path] = b; s.embedded = path; packed.add(s.subsetSha256);\n    }\n    lounge[id] = r;\n  }\n  return packed.size ? { extras: { ...extras, lounge, sounds }, packed: [...packed], missing: [...missing] } : { extras, packed: [], missing: [...missing] };\n}\n/** \u89E3\u5305\uFF1A\u5D4C\u7740\u7684 SoundFont \u5019\u9009\u6539\u5F31\u5F15\u7528\uFF08embedded = null\uFF09\uFF0C\u5B57\u8282\u4ECE\u6B4C\u91CC\u62FF\u6389\uFF1Bonly = \u53EA\u89E3\u8FD9\u4E9B\u5B50\u96C6\uFF08\u8C03\u7528\u65B9\u5148\u786E\u8BA4\u5B57\u8282\u7559\u5F97\u4F4F\uFF0C\u7559\u4E0D\u4F4F\u7684\u522B\u89E3\u2014\u2014\u89E3\u4E86\u5C31\u627E\u4E0D\u56DE\u6765\uFF09\u3002\n *  \u8FD4\u56DE\u62FF\u6389\u7684\u5B57\u8282\uFF08\u5B50\u96C6 sha256 \u2192 \u5B57\u8282\uFF09\uFF1A\u8C03\u7528\u65B9\u7559\u5230\u8BBE\u5907\u4E0A\uFF0C\u8FD9\u53F0\u8BBE\u5907\u7167\u6837\u80FD\u54CD\uFF08Blender \u7684 unpack = \u5199\u5230\u65C1\u8FB9\u7684\u6587\u4EF6\uFF0C\u8FD9\u91CC = \u8BBE\u5907\u7684\u97F3\u6E90\u7F13\u5B58\uFF09\u3002 */\nexport function withUnpacked(extras: Extras, only?: (subsetSha256: string) => boolean): { extras: Extras; removed: Map<string, Uint8Array> } {\n  const lounge: Record<string, Json> = {}, removed = new Map<string, Uint8Array>();\n  let changed = false;\n  for (const [id, r0] of Object.entries(extras.lounge)) {\n    const r = structuredClone(r0);\n    for (const c of cands(r)) {\n      const i = instrumentOf(c); if (i?.engine !== \"soundfont\" || !i.source.embedded || (only && !only(i.source.subsetSha256))) continue;\n      const b = extras.sounds[i.source.embedded]; if (b) removed.set(i.source.subsetSha256, b);\n      i.source.embedded = null; changed = true;\n    }\n    lounge[id] = r;\n  }\n  return changed ? { extras: pruneSounds({ ...extras, lounge }), removed } : { extras, removed };\n}\n\n// \u2500\u2500 \u6F14\u594F\u89C4\u683C\uFF08\u4FEE\u7684\u8BB0\u53F7\u600E\u4E48\u51FA\u58F0\uFF1A\u4E0A\u573A\u90A3\u4F4D by value \u5E26\u7740\u7684\u529B\u5EA6\u8868 + \u6F14\u594F\u6CD5\uFF1Bsrc/score/perform.ts \u7528\uFF1B2026-10-08 by Claude Opus 5.5\uFF09\u2500\u2500\n/** \u4E0A\u573A\u90A3\u4F4D\u7684\u529B\u5EA6\u8868\uFF08mf = 0 dB\uFF09/ \u8DF3\u97F3\u5403\u6389\u591A\u5C11 / \u91CD\u97F3\u52A0\u591A\u5C11\u3002\u6CA1\u6709\u89D2\u8272\u5FEB\u7167\u6216\u5B57\u6BB5\u7F3A = app \u5185\u7F6E\u90A3\u4EFD\uFF08DYNAMICS_DB / ARTICULATION\uFF09\u3002 */\nexport function activePerfSpec(extras: Extras, role: string): { dynamicsDb: Record<Dynamic, number>; staccatoGate: number; accentDb: number; gapSec: number;\n  marcatoDb: number; dynamicsVel: Record<Dynamic, number> | null; accentVel: number; marcatoVel: number;\n  stressDb: number; stressVel: number; unstressDb: number; unstressVel: number; ghostDb: number; ghostVel: number;\n  accentSec: number; breathSec: number; breathShare: number; gapShare: number; wedgeStepDb: number; wedgeStepVel: number; sfzDb: number; sfzVel: number; sfzSec: number; fpSec: number; swellDb: number; canSwell: boolean; sing: Record<string, SingMark | null> } {\n  const c = activeCandidate(extras, role), d = (c?.dynamicsDb ?? {}) as Partial<Record<string, number>>, a = (c?.articulation ?? {}) as Partial<Record<string, number>>;\n  const num = (v: unknown, dflt: number) => (typeof v === \"number\" && Number.isFinite(v) ? v : dflt);\n  // \u529B\u5EA6\u8868\uFF1App\u2026ff \u6CA1\u5199 = \u9ED8\u8BA4\uFF1Bppp / fff \u6CA1\u5199\uFF08v0.9.23 \u4E4B\u524D\u7684\u6F14\u594F\u8005\uFF09= \u6309\u8FD9\u4F4D\u81EA\u5DF1 pp\u2192p / f\u2192ff \u7684\u95F4\u9694\u5F80\u5916\u63A8\u4E00\u6863\uFF08\u4E0D\u662F\u62FF\u9ED8\u8BA4\u8868\u786C\u585E\uFF0C\u514D\u5F97\u548C\u5B83\u81EA\u5DF1\u7684\u8868\u4E0D\u6210\u6BD4\u4F8B\uFF09\n  const ladder = (got: Partial<Record<string, number>>, dflt: Record<Dynamic, number>, clamp: (v: number) => number = (v) => v): Record<Dynamic, number> => {\n    const o = {} as Record<Dynamic, number>;\n    for (const k of [\"pp\", \"p\", \"mp\", \"mf\", \"f\", \"ff\"] as const) o[k] = clamp(num(got[k], dflt[k]));\n    o.ppp = clamp(num(got.ppp, o.pp - (o.p - o.pp))); o.fff = clamp(num(got.fff, o.ff + (o.ff - o.f)));\n    return o;\n  };\n  const dynamicsDb = ladder(d, DYNAMICS_DB);\n  return { dynamicsDb, staccatoGate: Math.max(0.05, Math.min(1, num(a.staccatoGate, ARTICULATION.staccatoGate))), accentDb: num(a.accentDb, ARTICULATION.accentDb), gapSec: Math.max(0, Math.min(GAP_MAX_SEC, num(a.gapSec, 0))),\n    marcatoDb: num(a.marcatoDb, MARCATO_DB), accentVel: num(a.accentVel, ACCENT_VEL), marcatoVel: num(a.marcatoVel, MARCATO_VEL),\n    accentSec: Math.max(0, num(a.accentSec, MARK_DEFAULTS.accentSec)), breathSec: Math.max(0, num(a.breathSec, MARK_DEFAULTS.breathSec)), breathShare: Math.max(0, Math.min(1, num(a.breathShare, MARK_DEFAULTS.breathShare))),\n    gapShare: Math.max(0, Math.min(1, num(a.gapShare, MARK_DEFAULTS.gapShare))), wedgeStepDb: num(a.wedgeStepDb, MARK_DEFAULTS.wedgeStepDb), wedgeStepVel: num(a.wedgeStepVel, MARK_DEFAULTS.wedgeStepVel),\n    sfzDb: num(a.sfzDb, MARK_DEFAULTS.sfzDb), sfzVel: num(a.sfzVel, MARK_DEFAULTS.sfzVel), sfzSec: Math.max(0.01, num(a.sfzSec, MARK_DEFAULTS.sfzSec)), fpSec: Math.max(0.01, num(a.fpSec, MARK_DEFAULTS.fpSec)),\n    swellDb: num(a.swellDb, MARK_DEFAULTS.swellDb), canSwell: (a as Json).canSwell !== false,\n    stressDb: num(a.stressDb, MARK_DEFAULTS.stressDb), stressVel: num(a.stressVel, MARK_DEFAULTS.stressVel), unstressDb: num(a.unstressDb, MARK_DEFAULTS.unstressDb),\n    unstressVel: num(a.unstressVel, MARK_DEFAULTS.unstressVel), ghostDb: num(a.ghostDb, MARK_DEFAULTS.ghostDb), ghostVel: num(a.ghostVel, MARK_DEFAULTS.ghostVel),\n    sing: { ...SING_MARKS, ...((c?.sing ?? {}) as Record<string, SingMark | null>) },\n    dynamicsVel: c?.dynamicsVel ? ladder(c.dynamicsVel as Partial<Record<string, number>>, DYNAMICS_VEL, (v) => Math.max(1, Math.min(127, v))) : null };\n}\n/** \u8FDE\u65AD\u5E95\u8272\u80FD\u8C03\u5230\u591A\u5927\uFF08\u79D2\uFF09\u3002 */\nexport const GAP_MAX_SEC = 0.2;\n/** \u6539\u4E0A\u573A\u90A3\u4F4D\u7684\u8FDE\u65AD\u5E95\u8272\uFF08\u4E50\u5668\u9875\uFF1B\u79D2\uFF0C0 \u2026 GAP_MAX_SEC\uFF0C\u8BB0\u5230\u6BEB\u79D2\uFF09\u3002\u6CA1\u4EBA\u4E0A\u573A = \u539F\u6837\u3002 */\nexport function withGapSec(extras: Extras, role: string, sec: number, hum: Hum): Extras {\n  const r = roleOf(extras, role, hum), c = cands(r).find((x) => x.id === r.active); if (!c) return extras;\n  c.articulation = { ...((c.articulation ?? {}) as Json), gapSec: Math.round(Math.max(0, Math.min(GAP_MAX_SEC, sec)) * 1000) / 1000 };\n  return { ...extras, lounge: { ...extras.lounge, [role]: r } };\n}\n\n// \u2500\u2500 \u54CD\u5EA6\u6821\u51C6\uFF08\u5019\u9009\u7684 calibrationDb\uFF1A\u5951\u7EA6\u300C\u770B\u5F97\u89C1\u3001\u80FD\u8C03\u7684\u9ED8\u8BA4\uFF0C\u4E0D\u5077\u5077\u81EA\u52A8\u300D\uFF1Buser\u300C\u4E0D\u592A\u5EFA\u8BAE\u81EA\u52A8\u6821\u51C6\uFF0C\u9664\u975E\u662F\u53EF\u8C03\u7684\u9ED8\u8BA4\u3002\u4E0D\u7136\u5C31\u662F\u4E0D\u900F\u660E\u4E86\u300D\uFF09\u2500\u2500\n/** \u4E0A\u573A\u90A3\u4F4D\u7684\u6821\u51C6\uFF08dB\uFF1B\u6CA1\u6709\u89D2\u8272\u5FEB\u7167 / \u6CA1\u5199 = 0\uFF09\u3002\u6E32\u67D3\u65F6\u4E58\u5728\u8FD9\u4E2A\u58F0\u90E8\u4E0A\uFF0C\u548C\u5F55\u97F3\u5BA4\u63A8\u5B50\u76F8\u52A0\uFF08\u63A8\u5B50 = \u6DF7\u97F3\u51B3\u5B9A\uFF0C\u6821\u51C6 = \u6F14\u594F\u8005\u81EA\u5DF1\u7684\u54CD\u5EA6\uFF09\u3002 */\nexport function activeCalibrationDb(extras: Extras, role: string): number { const c = activeCandidate(extras, role); const v = Number(c?.calibrationDb ?? DEFAULT_CALIBRATION_DB); return Number.isFinite(v) ? v : DEFAULT_CALIBRATION_DB; }   // \u6CA1\u5199 = \u9ED8\u8BA4\uFF08\u22126\uFF09\uFF1B\u65E7\u6B4C\u91CC\u5B58\u7684\u6570\u7167\u65E7\n// \u2500\u2500 \u529B\u5EA6\uFF08\u5019\u9009\u7684 defaults.velocity\uFF1A\u6CA1\u753B\u66F2\u7EBF\u7684\u97F3\u7528\u7684\u9ED8\u8BA4\u6570\uFF0Cby value\uFF1BSoundFont = MIDI \u529B\u5EA6 \u00F7 127\uFF09\u2500\u2500\n//   2026-10-08 Opus 5.5\uFF1Buser\u300C\u63A5\u554A\uFF0C\u4F46\u662F\u63A5\u7684\u4E0D\u662Fmp mf\uFF0C\u800C\u5C31\u662F\u529B\u5EA6\u7684\u8FD9\u4E2A\u65CB\u94AE\u300D\uFF1A\u6E32\u67D3 / pad \u8BD5\u5F39\u8BFB\u8FD9\u4E00\u4E2A\u6570\uFF08\u539F\u6765\u5199\u6B7B 0.8\uFF0C\u5019\u9009\u91CC\u5B58\u7684\u6CA1\u4EBA\u8BFB\uFF09\u3002\n//   GS \u5F88\u591A\u97F3\u8272\u6309\u529B\u5EA6\u6362\u5F55\u97F3\u5C42\uFF08\u4ED3\u9F20 v11 velLayers \u5B9E\u6D4B\uFF09= \u97F3\u8272\u4F1A\u53D8\uFF0C\u4E0D\u53EA\u662F\u54CD\u5EA6\uFF1B\u8C31\u4E0A\u7684 mp / mf \u7167\u65E7\u53EA\u6539\u97F3\u91CF\u3002\n/** \u4E0A\u573A\u90A3\u4F4D\u7684\u529B\u5EA6\uFF080\u20131\uFF0C= MIDI \u529B\u5EA6 \u00F7 127\uFF09\uFF1B\u6CA1\u5199 = SOUNDFONT_DEFAULTS.velocity\u3002 */\nexport function activeVelocity(extras: Extras, role: string): number {\n  const c = activeCandidate(extras, role), v = Number(((c?.defaults ?? {}) as Json).velocity ?? SOUNDFONT_DEFAULTS.velocity);\n  return Number.isFinite(v) ? Math.max(1 / 127, Math.min(1, v)) : SOUNDFONT_DEFAULTS.velocity;\n}\n/** \u6539\u4E0A\u573A\u90A3\u4F4D\u7684\u529B\u5EA6\uFF08\u8BB0\u5230 MIDI \u6574\u6570\u683C\uFF1Ak / 127\uFF09\u3002\u6CA1\u4EBA\u4E0A\u573A = \u539F\u6837\u3002 */\nexport function withVelocity(extras: Extras, role: string, v: number, hum: Hum): Extras {\n  const r = roleOf(extras, role, hum), c = cands(r).find((x) => x.id === r.active); if (!c) return extras;\n  c.defaults = { ...((c.defaults ?? {}) as Json), velocity: Math.max(1, Math.min(127, Math.round(v * 127))) / 127 };\n  return { ...extras, lounge: { ...extras.lounge, [role]: r } };\n}\n/** \u6539\u4E0A\u573A\u90A3\u4F4D\u7684\u6821\u51C6\u3002 */\nexport function withCalibration(extras: Extras, role: string, dB: number, hum: Hum): Extras {\n  const r = roleOf(extras, role, hum), c = cands(r).find((x) => x.id === r.active); if (!c) return extras;\n  c.calibrationDb = Math.round(dB * 10) / 10;\n  return { ...extras, lounge: { ...extras.lounge, [role]: r } };\n}\n// \u2500\u2500 \u97F3\u6548\uFF1A\u56FA\u5B9A\u539F\u901F / \u97F3\u9AD8\u5BF9\u9F50\uFF08\u4E0A\u573A\u90A3\u4F4D\u7684 instrument.note / sfx.align\uFF1B2026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u56FA\u5B9A\u539F\u901F\u540C\u610F\uFF0C\u9ED8\u8BA4\u5F00\u3002\u78B0\u5230\u732B\u53EB\u6B4C\u624D\u5173\uFF0C\u4F46\u8FD9\u4E2A\u65F6\u5019\u4E5F\u8BB8\u9700\u8981\u97F3\u9AD8\u4FEE\u6B63\u300D\uFF09\u2500\u2500\n/** \u56FA\u5B9A\u539F\u901F\u5F00 / \u5173\uFF1A\u5F00 = \u6BCF\u4E2A\u97F3\u90FD\u6572\u539F\u901F\u952E\uFF08note = sfx.key\uFF09\uFF1B\u5173 = \u6309\u5199\u7684\u97F3\u6572\uFF08\u53EF\u518D\u5F00\u97F3\u9AD8\u5BF9\u9F50\uFF09\u3002\u4E0D\u662F\u97F3\u6548 = \u539F\u6837\u3002 */\nexport function withSfxFixed(extras: Extras, role: string, on: boolean, hum: Hum): Extras {\n  const r = roleOf(extras, role, hum), i = instrumentOf(cands(r).find((x) => x.id === r.active));\n  if (i?.engine !== \"soundfont\" || !i.sfx) return extras;\n  if (on) i.note = i.sfx.key; else delete i.note;\n  return { ...extras, lounge: { ...extras.lounge, [role]: r } };\n}\n/** \u6708\u8BFB\u5206\u6BB5\u5531\u7684\u7C92\u5EA6\uFF08\u4E0A\u573A\u90A3\u4F4D\uFF1B\u6CA1\u5199 = \u6BCF\u53E5\uFF09\u3002user\u300C\u5F00\u5173\u662F\u6B4C\u624B\u7684\u5C5E\u6027\uFF0C\u53EF\u4EE5\u6709\u4E0D\u540C\u7684\u7C92\u5EA6\u300D\u3002 */\nexport function activeSingChunk(extras: Extras, role: string): \"phrase\" | \"sheet\" | \"whole\" {\n  const i = activeInstrument(extras, role);\n  return i?.engine === \"tsukuyomi\" && (i.chunk === \"sheet\" || i.chunk === \"whole\") ? i.chunk : \"phrase\";\n}\n/** \u5C0F\u6708\u76F8\u5531\u6CD5\u6838\u5FC3\u7684\u65CB\u94AE\uFF08\u5B58\u5728\u5019\u9009 defaults \u91CC\uFF0Cby value\uFF1B\u6CA1\u5199 = TSUKUYOMI_DEFAULTS\uFF1B2026-10-15 user\u300C\u9F50\u5E73\u548C\u5176\u4ED6\u7684\u4E5F\u90FD\u653E\u5728\u9AD8\u7EA7\u8BBE\u7F6E\u91CC\u9762\u53EF\u4EE5\u6301\u4E45\u5316\u300D\uFF09\u3002 */\nexport const SING_CORE_KEYS = [\"level\", \"levelContinuous\", \"levelMaxDb\", \"cleanMax\", \"breath\"] as const;\nexport type SingCoreKey = (typeof SING_CORE_KEYS)[number];\nexport function activeSingCore(extras: Extras, role: string): Record<SingCoreKey, number> {\n  const c = activeCandidate(extras, role), d = (c?.defaults ?? {}) as Record<string, unknown>, out = { ...TSUKUYOMI_DEFAULTS } as Record<SingCoreKey, number>;\n  if (instrumentOf(c)?.engine === \"tsukuyomi\") for (const k of SING_CORE_KEYS) if (typeof d[k] === \"number\") out[k] = d[k] as number;\n  return out;\n}\nexport function withSingCore(extras: Extras, role: string, key: SingCoreKey, value: number, hum: Hum): Extras {\n  const r = roleOf(extras, role, hum), c = cands(r).find((x) => x.id === r.active);\n  if (!c || instrumentOf(c)?.engine !== \"tsukuyomi\") return extras;\n  c.defaults = { ...((c.defaults ?? {}) as Record<string, number>), [key]: value };\n  return { ...extras, lounge: { ...extras.lounge, [role]: r } };\n}\nexport function withSingChunk(extras: Extras, role: string, v: \"phrase\" | \"sheet\" | \"whole\", hum: Hum): Extras {\n  const r = roleOf(extras, role, hum), i = instrumentOf(cands(r).find((x) => x.id === r.active));\n  if (i?.engine !== \"tsukuyomi\") return extras;\n  if (v === \"phrase\") delete i.chunk; else i.chunk = v;\n  return { ...extras, lounge: { ...extras.lounge, [role]: r } };\n}\n/** \u97F3\u9AD8\u5BF9\u9F50\u5F00 / \u5173\uFF08\u53EA\u5728\u6CA1\u56FA\u5B9A\u539F\u901F\u3001\u539F\u901F\u65F6\u542C\u5F97\u51FA\u97F3\u9AD8\u65F6\u6709\u610F\u4E49\uFF09\u3002 */\nexport function withSfxAlign(extras: Extras, role: string, on: boolean, hum: Hum): Extras {\n  const r = roleOf(extras, role, hum), i = instrumentOf(cands(r).find((x) => x.id === r.active));\n  if (i?.engine !== \"soundfont\" || !i.sfx) return extras;\n  if (on) i.sfx.align = true; else delete i.sfx.align;\n  return { ...extras, lounge: { ...extras.lounge, [role]: r } };\n}\n// \u2500\u2500 \u4FEE\u516B\u5EA6 / \u79FB\u8C03\uFF08\u5019\u9009\u7684 transpose\uFF0C\u534A\u97F3\uFF1B2026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u4FEE\u516B\u5EA6\u548C\u79FB\u8C03\u7684\u97F3\u8272\u7EA7\u522B\u7684\u9009\u9879\u2026\u5927\u90E8\u5206\u60C5\u51B5\u4E0D\u5E94\u8BE5\u52A8\uFF0C\u662Fworst case\u515C\u5E95\u300D\uFF09\u2500\u2500\n/** \u4E0A\u573A\u90A3\u4F4D\u7684\u79FB\u8C03\uFF08\u534A\u97F3\uFF1B\u6CA1\u5199 = 0\uFF09\u3002 */\nexport function activeTranspose(extras: Extras, role: string): number { const v = Number(activeCandidate(extras, role)?.transpose ?? 0); return Number.isInteger(v) ? v : 0; }\n/** \u6539\u4E0A\u573A\u90A3\u4F4D\u7684\u79FB\u8C03\uFF08\u5939\u5728 \u00B148\uFF1B0 = \u53BB\u6389\u5B57\u6BB5\uFF0C\u5B58\u6863\u4E0D\u591A\u51FA 0\uFF09\u3002 */\nexport function withTranspose(extras: Extras, role: string, semis: number, hum: Hum): Extras {\n  const r = roleOf(extras, role, hum), c = cands(r).find((x) => x.id === r.active); if (!c) return extras;\n  const t = Math.max(-48, Math.min(48, Math.round(semis)));\n  if (t) c.transpose = t; else delete c.transpose;\n  return { ...extras, lounge: { ...extras.lounge, [role]: r } };\n}\n\n// \u2500\u2500 \u8BFB \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/** \u522B\u7684\u8F6F\u4EF6\u5B58\u7684\u5355\u4EFD\u8C31\uFF1A\u6CA1\u6709 <work-title> \u5C31\u62FF <movement-title> \u5F53\u6B4C\u540D\uFF08\u4E0D\u5F53\u66F2\u6BB5\u540D\uFF09\u3002 */\nconst foreign = (r: ReadScore): ReadScore => (r.title || !r.movementTitle ? r : { ...r, title: r.movementTitle, movementTitle: \"\" });\n/** \u4E00\u4EFD\u8BFB\u8FDB\u6765\u7684 MusicXML \u2192 \u4E00\u5F20\u7EB8\uFF08token id \u4E4B\u540E\u5728 songFromReads \u91CC\u7EDF\u4E00\u91CD\u7F16\uFF09\u3002 */\nfunction paperOfRead(id: string, r: ReadScore): PaperSeg {\n  const tracks: Record<string, Token[]> = {};\n  for (const p of r.parts) tracks[p.info.id] = p.tokens;\n  return { id, name: r.movementTitle, tracks };\n}\n/** \u5B57\u8282 \u2192 \u6B4C\u3002\u8BA4 .mxl\uFF08zip\uFF09\u548C\u4E0D\u538B\u7F29\u7684 .musicxml / .xml\u3002\u8BFB\u4E0D\u4E86 = \u629B\u9519\uFF08\u9519\u8BEF\u6587\u5B57\u76F4\u63A5\u7ED9\u4EBA\u770B\uFF09\u3002 */\nexport function openBytes(name: string, bytes: Uint8Array): Opened {\n  const isZip = bytes[0] === 0x50 && bytes[1] === 0x4b;\n  if (!isZip) {   // \u4E0D\u538B\u7F29\u7684 MusicXML\uFF1A\u53EA\u6709\u8C31\uFF08\u4E00\u5F20\u7EB8\uFF0C\u58F0\u90E8\u7167\u6587\u4EF6\u91CC\u7684\uFF09\n    const r = foreign(readMusicXml(new TextDecoder().decode(bytes)));\n    return finish([r], songFromReads([r], null), emptyExtras(), false, name);\n  }\n  let files: Record<string, Uint8Array>;\n  try { files = unzipSync(bytes); } catch (e) { throw new Error(`\u8FD9\u4E2A\u6587\u4EF6\u89E3\u4E0D\u5F00\uFF08\u4E0D\u662F\u5B8C\u6574\u7684 .mxl\uFF1F\uFF09\uFF1A${(e as Error).message}`); }\n  const container = files[\"META-INF/container.xml\"];\n  if (!container) throw new Error(\"\u8FD9\u4E2A\u538B\u7F29\u5305\u91CC\u6CA1\u6709 META-INF/container.xml\uFF0C\u4E0D\u662F .mxl\");\n  const paths = [...strFromU8(container).matchAll(/<rootfile\\b[^>]*full-path=\"([^\"]+)\"[^>]*?(?:media-type=\"([^\"]*)\")?[^>]*\\/?>/g)].map((m) => ({ path: m[1], mediaType: m[2] ?? \"\" }));\n  const main = paths[0]?.path;\n  if (!main || !files[main]) throw new Error(\"container.xml \u6307\u7684\u4E3B\u4E50\u8C31\u5728\u5305\u91CC\u627E\u4E0D\u5230\");\n  const extras = emptyExtras();\n  extras.rootfiles = paths.slice(1);\n  const known = new Set([\"mimetype\", \"META-INF/container.xml\", main]);\n  if (files[THUMBNAIL_ENTRY]) { extras.thumbnail = files[THUMBNAIL_ENTRY]; known.add(THUMBNAIL_ENTRY); }   // \u5C01\u9762 entry\uFF08\u522B\u5BB6 zip \u91CC\u6709\u540C\u540D\u7684\u4E5F\u7167\u6536\uFF09\n  const manifestBytes = files[`${DIR}manifest.json`];\n  const ours = !!manifestBytes;\n  if (!ours) {\n    for (const [p, b] of Object.entries(files)) if (!known.has(p) && !p.endsWith(\"/\")) extras.unknown[p] = b;\n    const r = foreign(readMusicXml(strFromU8(files[main])));\n    return finish([r], songFromReads([r], null), extras, false, name);\n  }\n  const parse = (p: string): Json => { try { return JSON.parse(strFromU8(files[p])) as Json; } catch { throw new Error(`${p} \u8BFB\u4E0D\u61C2\uFF08\u6587\u4EF6\u574F\u4E86\uFF1F\uFF09`); } };\n  const manifest = parse(`${DIR}manifest.json`); known.add(`${DIR}manifest.json`);\n  const references: Record<string, Uint8Array> = {};   // \u53C2\u8003\u7A97\uFF1A\u6574\u4E2A\u76EE\u5F55\u539F\u6837\u62FF\u51FA\u6765\uFF08\u5E93\u53BB\u89E3\uFF09\n  const finalNotices: string[] = [];   // \u5B9A\u7A3F\u8BB0\u5F55\u8BFB\u7684\u65F6\u5019\u8981\u8BF4\u7684\u8BDD\uFF08finish \u7684 notices \u524D\u9762\uFF09\n  for (const [p, b] of Object.entries(files)) if (p.startsWith(REFERENCES_DIR) && !p.endsWith(\"/\")) { references[p] = b; known.add(p); }\n  // \u4E09\u7EA7\u62CD\u5B50\uFF08\u5BB6\u65CF\u683C\u5F0F\u7248\u672C\u7EAA\u5F8B 2026-10-21\uFF09\uFF1Amajor \u6BD4\u81EA\u5DF1\u65B0 = \u62D2\u5F00\uFF08\u4E0D\u964D\u7EA7\u4E0D\u731C\uFF09\uFF1Bminor \u6BD4\u81EA\u5DF1\u65B0 = \u80FD\u5F00\u80FD\u6539\u80FD\u5B58\u3001\u672A\u77E5\u952E\u539F\u6837\u5E26\u56DE\u3001\u544A\u8BC9\u7528\u6237\u4E00\u6B21\uFF08advice\uFF0C\u4E0D\u662F\u62A5\u9519\u4E0D\u62E6\uFF09\uFF1Bpatch \u6BD4\u81EA\u5DF1\u65B0 = \u9759\u9ED8\n  const newerMinor: string[] = [];\n  const newer = (what: string, j: Json, kind: FormatFile) => {\n    const major = Number(j.version ?? 1), minor = Number(j.minor ?? 0);\n    if (major > FORMAT[kind]) throw new Error(`\u8FD9\u9996\u6B4C\u662F\u66F4\u65B0\u7248\u672C\u7684 MoonSinger \u5B58\u7684\uFF08${what} \u7B2C ${major} \u7248\uFF0C\u8FD9\u4E00\u7248\u53EA\u8BA4\u5230\u7B2C ${FORMAT[kind]} \u7248\uFF09\uFF0C\u6253\u5F00\u518D\u5B58\u4F1A\u4E22\u4E1C\u897F\uFF0C\u6240\u4EE5\u6CA1\u6709\u6253\u5F00\u3002\u8BF7\u5148\u66F4\u65B0 app\u3002`);\n    if (major === FORMAT[kind] && minor > FORMAT_MINOR[kind]) newerMinor.push(what);\n  };\n  newer(\"\u603B\u76EE\u5F55\", manifest, \"manifest\");\n  extras.manifest = migrate(\"manifest\", manifest);\n  const rawLounge: Record<string, string> = {};   // \u6307\u7EB9\u7528\uFF1A\u6587\u4EF6\u91CC\u7684\u539F\u6587\uFF08\u8BFB\u8FDB\u6765\u7684\u548C\u5199\u51FA\u53BB\u7684\u540C\u4E00\u4EFD\u5B57\u7B26\u4E32\uFF09\n  let scoreExt: Json | null = null;\n  if (files[`${DIR}score.json`]) {\n    const s0 = parse(`${DIR}score.json`); known.add(`${DIR}score.json`); newer(\"\u8C31\u7684\u6269\u5C55\", s0, \"score\");\n    scoreExt = migrate(\"score\", s0); extras.scoreExt = scoreExt;\n  }\n  for (const p of Object.keys(files)) {\n    const m = /^\\.moonsinger\\/lounge\\/([^/]+)\\.json$/.exec(p);\n    if (m) { const r = parse(p); newer(`\u4F11\u606F\u5BA4\u300C${r.name ?? m[1]}\u300D`, r, \"lounge\"); extras.lounge[m[1]] = migrate(\"lounge\", r); known.add(p); rawLounge[m[1]] = fpTextOf(r); }\n  }\n  if (files[`${DIR}studio.json`]) { const s = parse(`${DIR}studio.json`); known.add(`${DIR}studio.json`); newer(\"\u5F55\u97F3\u623F\", s, \"studio\"); extras.studio = migrate(\"studio\", s); }\n  for (const p of Object.keys(files)) if (p.startsWith(SOUNDS) && !p.endsWith(\"/\")) { extras.sounds[p] = files[p]; known.add(p); }   // \u5D4C\u7684\u97F3\u6E90\u5B57\u8282\uFF08\u6574\u4EFD\u7559\u7740\uFF1B\u5B58\u6863\u53EA\u5199\u8FD8\u5F15\u7528\u7740\u7684\uFF09\n  // \u5B9A\u7A3F\uFF08src/format/final.ts\uFF09\uFF1A\u603B\u76EE\u5F55\u91CC\u7684\u8BB0\u5F55 + mp3 entry\u3002\u8BB0\u5F55\u4E0D\u50CF\u6837 / entry \u4E0D\u5728 / \u5927\u5C0F\u4E0D\u5BF9 / \u6307\u7EB9\u5BF9\u4E0D\u4E0A\uFF08\u5B9A\u7A3F\u540E\u88AB\u65E7\u7248 app \u6216\u522B\u7684\u8F6F\u4EF6\u6539\u8FC7\uFF09= \u5B9A\u7A3F\u4F5C\u5E9F\u3001\u8BF4\u4E00\u58F0\u3001mp3 \u4E0D\u5E26\u7740\u8D70\n  extras.finalRev = Math.max(0, Math.floor(Number(manifest.finalRev ?? 0))) || 0;\n  if (files[FINAL_MP3_ENTRY]) known.add(FINAL_MP3_ENTRY);\n  if (manifest.final !== undefined) {\n    const rec = parseFinalRecord(manifest.final), mp3 = rec ? files[rec.mp3.path] : undefined;\n    if (rec && rec.mp3.path !== FINAL_MP3_ENTRY) known.add(rec.mp3.path);\n    const paperList = ((scoreExt?.papers as Json[] | undefined) ?? []);\n    const papersRaw: Record<string, string> = {};\n    for (const p of paperList) { const f = String(p.file ?? paperFile(String(p.id))); if (files[f]) papersRaw[String(p.id)] = strFromU8(files[f]); }\n    const fp = rec && files[`${DIR}score.json`] && files[`${DIR}studio.json`]\n      ? contentFingerprint({ papers: papersRaw, scoreExt: fpTextOf(parse(`${DIR}score.json`)), lounge: rawLounge, studio: fpTextOf(parse(`${DIR}studio.json`)), sounds: Object.keys(extras.sounds), thumbnail: files[THUMBNAIL_ENTRY] ?? null })\n      : null;\n    if (!rec) finalNotices.push(\"\u8FD9\u9996\u6B4C\u7684\u5B9A\u7A3F\u8BB0\u5F55\u8BFB\u4E0D\u61C2\uFF08\u522B\u7684\u7248\u672C\u5199\u7684\uFF1F\uFF09\uFF1A\u6309\u6CA1\u5B9A\u7A3F\u6253\u5F00\u3002\");\n    else if (!mp3 || mp3.length !== rec.mp3.bytes) finalNotices.push(`\u5B9A\u7A3F\u7684 mp3 \u4E0D\u5728\u6B4C\u91CC\u6216\u5927\u5C0F\u4E0D\u5BF9\uFF08\u8BB0\u5F55 ${rec.mp3.bytes} \u5B57\u8282\uFF09\uFF1A\u5B9A\u7A3F\u4F5C\u5E9F\uFF0C\u6309\u6CA1\u5B9A\u7A3F\u6253\u5F00\u3002`);\n    else if (fp !== rec.fingerprint) finalNotices.push(`\u8FD9\u9996\u6B4C\u5B9A\u7A3F\u540E\u88AB\u6539\u8FC7\uFF08\u53EF\u80FD\u662F\u65E7\u7248 app \u6216\u522B\u7684\u8F6F\u4EF6\u6539\u7684\uFF09\uFF1A\u5B9A\u7A3F\u4F5C\u5E9F\uFF0C\u90A3\u4EFD mp3 \u4E0D\u7B97\u6570\u4E86\u3002\u8981\u7684\u8BDD\u6539\u5B8C\u518D\u5B9A\u7A3F\u4E00\u6B21\u3002`);\n    else { extras.final = rec; extras.finalMp3 = mp3; }\n  }\n  // \u7EB8\uFF1A\u6309 score.json \u7684\u987A\u5E8F\u8868\u9010\u5F20\u8BFB\uFF1B\u7B2C 1 \u7248\u5B58\u7684\uFF08\u8FC1\u79FB\u540E papers = [p1]\uFF0C\u6587\u4EF6\u6307\u5411 papers/p1.musicxml\uFF09\u5305\u91CC\u6CA1\u90A3\u4EFD = \u8BFB score.musicxml\uFF08\u6587\u4EF6\u7EA7\u8FC1\u79FB\u5728\u8FD9\u91CC\u505A\uFF0Cmigrate() \u53EA\u7BA1 JSON\uFF09\n  const list = ((scoreExt?.papers as Json[] | undefined) ?? [{ id: \"p1\", file: paperFile(\"p1\"), manualBars: {}, unwritten: [] }]);\n  const reads: ReadScore[] = [];\n  const papers: PaperSeg[] = [];\n  list.forEach((p, k) => {\n    const file = String(p.file ?? paperFile(String(p.id)));\n    const b = files[file] ?? (k === 0 ? files[main] : undefined);\n    if (!b) throw new Error(`\u7EB8\u300C${p.id}\u300D\u7684\u8C31\uFF08${file}\uFF09\u5728\u5305\u91CC\u627E\u4E0D\u5230`);\n    known.add(file);\n    const r = readMusicXml(strFromU8(b), { manualBars: (p.manualBars as Record<string, number[]> | undefined) ?? {}, unwritten: (p.unwritten as string[] | undefined) ?? [] });\n    reads.push(r);\n    const seg = paperOfRead(String(p.id), r); if (p.hidden === true) seg.hidden = true;\n    const ph = p.phrases as Record<string, number[]> | undefined;   // \u53E5\u53F7\uFF1A\u63D2\u56DE\u90A3\u4E9B token \u540E\u9762\uFF08id \u8BFB\u7684\u65F6\u5019\u4FDD\u7559\u7740\uFF1B\u53E5\u53F7 token \u672C\u8EAB id 0 = \u4E4B\u540E\u91CD\u7F16\uFF09\n    if (ph) for (const [pid, ids] of Object.entries(ph)) { const toks = seg.tracks[pid]; if (!toks) continue; for (const id of ids) { const k = toks.findIndex((t) => t.id === id); if (k >= 0 && toks[k + 1]?.kind !== \"phrase\") toks.splice(k + 1, 0, { kind: \"phrase\", id: 0 }); } }\n    const sw = p.swells as Record<string, Record<string, string>> | undefined;   // \u97F3\u5185\u7684\u529B\u5EA6\u8D77\u4F0F\uFF1A\u6309\u97F3\u7684 id \u6302\u56DE\u53BB\uFF08\u8BA4\u4E0D\u51FA\u7684\u79CD\u7C7B\u4E0D\u6302\uFF09\n    if (sw) for (const [pid, m] of Object.entries(sw)) { const toks = seg.tracks[pid]; if (!toks) continue; for (const [id, v] of Object.entries(m)) { if (v !== \"<\" && v !== \">\" && v !== \"<>\") continue; const k = toks.findIndex((t) => t.kind === \"note\" && t.id === Number(id)); if (k >= 0) toks[k] = withArt(toks[k] as NoteTok, SWELL_ART[v as Swell], true); } }\n    papers.push(seg);\n  });\n  for (const [p, b] of Object.entries(files)) if (!known.has(p) && !p.endsWith(\"/\")) extras.unknown[p] = b;\n  const song = songFromReads(reads, papers, (scoreExt?.parts as Json[] | undefined) ?? null);\n  const o = finish(reads, song, pruneSounds(extras), ours, name);\n  const advice = newerMinor.length ? [`\u8FD9\u9996\u6B4C\u662F\u66F4\u65B0\u7248\u672C\u7684 MoonSinger \u5B58\u7684\uFF08${newerMinor.join(\"\u3001\")}\u91CC\u6709\u8FD9\u4E00\u7248\u8FD8\u6CA1\u6709\u7684\u4E1C\u897F\uFF09\uFF1A\u7167\u6837\u80FD\u5F00\u80FD\u6539\u80FD\u5B58\uFF0C\u90A3\u4E9B\u4E1C\u897F\u4FDD\u5B58\u65F6\u4E0D\u4F1A\u4E22\uFF0C\u53EA\u662F\u5728\u8FD9\u4E00\u7248\u770B\u4E0D\u5230\u3002`] : [];\n  return { ...o, notices: [...finalNotices, ...o.notices], references, advice };\n}\n\n/** \u8BFB\u8FDB\u6765\u7684\u51E0\u5F20\u7EB8 \u2192 \u6B4C\u3002parts = score.json \u7684\u58F0\u90E8\u5E76\u96C6\uFF08\u6CA1\u6709 = \u6309\u7EB8\u91CC\u51FA\u73B0\u7684\u58F0\u90E8 P1\u2026\uFF09\u3002\n *  token id \u7EDF\u4E00\u91CD\u7F16\uFF08\u7EB8\u5E8F \u00D7 \u58F0\u90E8\u5E8F \u00D7 \u4E0B\u6807\uFF0C\u4ECE 1 \u8D77\uFF09\uFF1A\u5168\u6B4C\u552F\u4E00\u3001\u786E\u5B9A\uFF1B\u6587\u4EF6\u91CC\u7684 id \u53EA\u5728\u8BFB\u90A3\u4EFD\u6587\u4EF6\u65F6\u6709\u7528\uFF08unwritten / \u62C6\u6BB5\u5E76\u56DE\uFF09\u3002 */\nfunction songFromReads(reads: ReadScore[], papers: PaperSeg[] | null, partList: Json[] | null = null): Song {\n  const ps = papers ?? [paperOfRead(\"p1\", reads[0])];\n  const seen = new Map<string, PartDef>();\n  const clefFromScore = new Set<string>();   // score.json \u91CC\u5199\u4E86 clef \u7684\u58F0\u90E8\uFF08v0.9.28 \u8D77\u90FD\u5199\uFF1Aauto = \u81EA\u52A8\uFF09\uFF1A\u4E0D\u518D\u770B MusicXML \u7684\u7B2C\u4E00\u4E2A <clef>\n  for (const p of partList ?? []) {\n    const d: PartDef = { id: String(p.id), role: String(p.role ?? `r${seen.size + 1}`), mic: String(p.mic ?? `m${seen.size + 1}`) };\n    if (\"clef\" in p) { clefFromScore.add(d.id); if ((CLEFS as readonly unknown[]).includes(p.clef)) d.clef = p.clef as ClefName; }\n    if (p.autoOttava === false) d.autoOttava = false;   // \u8FD9\u4F4D\u4E0D\u8981\u81EA\u52A8\u516B\u5EA6\u7EBF\uFF08v0.9.37\uFF09\n    if (typeof p.host === \"string\" && p.host) d.host = p.host;   // \u5408\u79DF\uFF08v0.10.24\uFF09\uFF1A\u4E0B\u9762\u6838\u4E00\u904D\n    seen.set(d.id, d);\n  }\n  for (const d of seen.values()) { const h = d.host ? seen.get(d.host) : undefined; if (d.host && (!h || h.id === d.id || h.host)) delete d.host; }   // \u4E3B\u4EBA\u4E0D\u5728 / \u6302\u81EA\u5DF1 / \u4E3B\u4EBA\u4E5F\u662F\u623F\u5BA2 = \u4E0D\u5408\u79DF\n  for (const p of ps) for (const id of Object.keys(p.tracks)) if (!seen.has(id)) seen.set(id, { id, role: `r${seen.size + 1}`, mic: `m${seen.size + 1}` });\n  // \u8C31\u53F7\uFF1Ascore.json \u6CA1\u5199\u7684\uFF08v0.9.28 \u4EE5\u524D\u5B58\u7684 / \u522B\u5BB6\u7684\u8C31\uFF09= MusicXML \u91CC\u8FD9\u4E2A\u58F0\u90E8\u7B2C\u4E00\u4E2A <clef>\uFF1A\u4E0D\u662F\u666E\u901A\u9AD8\u97F3\u8C31\u53F7\u7684\uFF08\u4F4E\u97F3\u3001\u516B\u5EA6\u8C31\u53F7\uFF09\u7B97\u5199\u660E\u4E86\uFF0C\u666E\u901A\u9AD8\u97F3\u8C31\u53F7 = \u81EA\u52A8\n  for (const r of reads) for (const p of r.parts) { const d = seen.get(p.info.id); if (!d) continue; if (p.info.staves === 2) d.staves = 2; if (!clefFromScore.has(d.id) && !d.clef && p.info.clef && p.info.clef !== \"G\" && d.staves !== 2) d.clef = p.info.clef; }\n  const parts = familyOrder([...seen.values()]);   // \u4E00\u5BB6\u6328\u5728\u4E00\u8D77\uFF08v0.10.36\uFF1A\u65E7\u6587\u4EF6\u91CC\u623F\u5BA2\u53EF\u80FD\u6CA1\u6328\u7740\u4E3B\u4EBA\uFF09\n  let id = 1;\n  const renumbered = ps.map((p) => ({ ...p, tracks: Object.fromEntries(parts.flatMap((part) => (p.tracks[part.id] ? [[part.id, p.tracks[part.id].map((t) => ({ ...t, id: id++ }))]] : []))) }));\n  const r0 = reads[0];\n  return { ...(r0.title ? { title: r0.title } : {}), ...(r0.paper ? { paper: r0.paper } : {}), ...(r0.credits ? { credits: r0.credits } : {}), ...(r0.rights ? { rights: r0.rights } : {}), hum: \"n\", parts, papers: renumbered };\n}\n\nfunction finish(reads: ReadScore[], song0: Song, extras: Extras, ours: boolean, name: string): Opened {\n  const notices: string[] = [];\n  // \u58F0\u90E8\u5C31\u662F\u6B4C\u624B\uFF082026-10-08\uFF0Cuser\u300C\u55EF\u58F0\u90E8\u5C31\u662F\u6B4C\u624B\u300D\uFF09\uFF1A\u4E00\u4E2A\u89D2\u8272\u53EA\u5F52\u4E00\u4E2A\u58F0\u90E8\uFF08\u8DE8\u7EB8\u6309\u58F0\u90E8\u8FDE\u3001\u9EA6\u514B\u98CE\u7531\u6B4C\u624B\u8BA4\u9886\uFF09\u3002\u4E24\u4E2A\u58F0\u90E8\u5171\u7528\u4E00\u4E2A\u89D2\u8272\uFF08\u624B\u6539\u8FC7\u7684\u6587\u4EF6\uFF09=\n  //   \u540E\u9762\u90A3\u4E2A\u62C6\u6210\u4E00\u4F4D\u65B0\u6B4C\u624B\uFF1A\u4F11\u606F\u5BA4\u90A3\u4EFD\u539F\u6837\u590D\u5236\u7ED9\u5B83\uFF08\u8C01\u6765\u6F14\u3001\u600E\u4E48\u6F14\u90FD\u4E00\u6837\uFF09\uFF0C\u9EA6\u514B\u98CE\u7167\u65E7\u5171\u7528\uFF08\u51E0\u4F4D\u6B4C\u624B\u53EF\u4EE5\u8BA4\u9886\u540C\u4E00\u4E2A\u9EA6\u514B\u98CE\uFF09\u3002\u4EC0\u4E48\u90FD\u4E0D\u4E22\uFF0C\u8BF4\u4E00\u58F0\u3002\n  const usedRoles = new Set<string>();\n  song0 = { ...song0, parts: song0.parts.map((part) => {\n    if (!usedRoles.has(part.role)) { usedRoles.add(part.role); return part; }\n    const nr = newRoleId(extras, { ...song0, parts: [...song0.parts, ...[...usedRoles].map((r) => ({ id: \"\", role: r, mic: \"\" }))] });   // \u8FD9\u4E00\u8F6E\u5DF2\u7ECF\u5206\u51FA\u53BB\u7684\u4E5F\u7B97\u5360\u7528\n    if (extras.lounge[part.role]) { extras.lounge[nr] = structuredClone(extras.lounge[part.role]); notices.push(`\u58F0\u90E8\u300C${String(extras.lounge[part.role].name ?? part.id)}\u300D\u548C\u522B\u7684\u58F0\u90E8\u5171\u7528\u4E00\u4F4D\u6B4C\u624B\uFF1B\u4E00\u4E2A\u58F0\u90E8\u5C31\u662F\u4E00\u4F4D\u6B4C\u624B\uFF0C\u6240\u4EE5\u62C6\u6210\u4E86\u4E24\u4F4D\uFF08\u8C01\u6765\u6F14\u3001\u600E\u4E48\u6F14\u90FD\u7167\u6284\uFF09\u3002`); }\n    usedRoles.add(nr);\n    return { ...part, role: nr };\n  }) };\n  const dropped: Record<string, number> = {};\n  for (const r of reads) for (const [k, n] of Object.entries(r.dropped)) dropped[k] = (dropped[k] ?? 0) + n;\n  const dl = Object.entries(dropped);\n  if (dl.length) notices.push(`\u8FD9\u4EFD\u8C31\u91CC\u6709\u8FD9\u4E00\u7248\u8FD8\u4E0D\u652F\u6301\u7684\u4E1C\u897F\uFF0C\u6CA1\u6709\u8BFB\u8FDB\u6765\uFF1A${dl.map(([k, n]) => `${k} ${n} \u5904`).join(\"\u3001\")}\u3002\u5B58\u7684\u65F6\u5019\u5B83\u4EEC\u4E0D\u4F1A\u5728\u65B0\u6587\u4EF6\u91CC\u2014\u2014\u8981\u7559\u539F\u6837\uFF0C\u8BF7\u300C\u53E6\u5B58\u4E3A\u300D\u65B0\u6587\u4EF6\u3002`);\n  const infos = new Map<string, ReadPart>();\n  for (const r of reads) for (const p of r.parts) if (!infos.has(p.info.id)) infos.set(p.info.id, p.info);\n  for (const part of song0.parts) {\n    if (extras.lounge[part.role] || ours) continue;\n    // \u522B\u7684\u8F6F\u4EF6\u5B58\u7684\u8C31\uFF1A\u58F0\u90E8\u539F\u6765\u7684\u4E50\u5668\u8BB0\u6210\u8FD9\u4E2A\u89D2\u8272\u7684\u5019\u9009\uFF08\u5F15\u64CE unknown\uFF09\u3001\u5C31\u662F\u5B83\u4E0A\u573A\uFF1B\u8FD9\u4E00\u7248\u6CA1\u6709\u90A3\u4EF6\u4E50\u5668 \u2192 \u6CA1\u4EBA\u4E0A\u573A\uFF0C\u4EBA\u6765\u9009\uFF08user\u300C\u4E0D\u51FA\u58F0\uFF0C\u62A5\u9519\uFF0C\u4EBA\u7C7B\u624B\u52A8\u6362\u300D\uFF09\n    const p = infos.get(part.id);\n    const was = p?.instrumentName || p?.name || \"\u539F\u6765\u7684\u4E50\u5668\";\n    const gm = p?.program;\n    const role = defaultRole(\"n\", part.role);\n    role.name = p?.name || DEFAULT_ROLE.name;\n    if (p?.sound) role.sound = p.sound;\n    role.active = \"c0\";\n    cands(role).unshift({ id: \"c0\", name: was, instrument: { engine: \"unknown\", midi: { program: gm ?? null, variant: p?.variant ?? null } }, gm: { program: gm ?? null, variant: p?.variant ?? null }, ...common(), defaults: {}, credit: { attribution: [], license: { name: \"unknown\" } }, spec: { kind: \"unknown\" } });\n    extras.lounge[part.role] = role;\n    notices.push(`\u58F0\u90E8\u300C${role.name}\u300D\u539F\u6765\u662F${was}${gm ? `\uFF08GM ${gm} \u53F7\uFF09` : \"\"}\uFF1B\u8FD9\u4E00\u7248\u6CA1\u6709\u8FD9\u4EF6\u4E50\u5668\uFF0C\u6240\u4EE5\u8FD8\u6CA1\u4EBA\u4E0A\u573A\u3002\u8981\u5C0F\u6708\u76F8\u6765\u5531\uFF0C\u70B9\u8C31\u524D\u9762\u7684\u300C${role.name}\u300D\uFF0C\u5728\u300C\u8C01\u6765\u6F14\u300D\u9009\u5C0F\u6708\u76F8\u3002`);\n  }\n  for (const part of song0.parts) {\n    const role = extras.lounge[part.role]; if (!role) continue;\n    const gm = activeGm(extras, part.role);\n    if (gm && gm.path && !gm.bytes) notices.push(`\u300C${gm.name}\u300D\u7684\u58F0\u97F3\uFF08${gm.path}\uFF09\u6CA1\u968F\u8FD9\u9996\u6B4C\u4E00\u8D77\u5E26\u6765\uFF0C\u6240\u4EE5\u6CA1\u4EBA\u4E0A\u573A\u3002\u70B9\u8C31\u524D\u9762\u7684\u300C${role.name ?? \"\"}\u300D\u6362\u4E00\u4E2A\u300C\u8C01\u6765\u6F14\u300D\u3002`);   // \u5F3A\u5F15\u7528\u3001\u6587\u4EF6\u91CC\u5374\u5C11\u4E86\u90A3\u5757\uFF1A\u4E0D\u9759\u9ED8\uFF08\u00A710\uFF09\u3002\u5F31\u5F15\u7528\uFF08path = null\uFF09\u8981\u51FA\u58F0\u65F6\u53BB\u627E\uFF0C\u627E\u4E0D\u5230\u518D\u62A5\n  }\n  const stem = name.replace(/\\.(mxl|musicxml|xml)$/i, \"\");\n  const hum = humOf(extras);\n  const arr = extras.scoreExt?.arrangement;   // \u7F16\u6392\u90A3\u4E00\u884C\uFF08\u53EA\u6709\u6211\u4EEC\u81EA\u5DF1\u7684\u6587\u4EF6\u6709\uFF09\n  return { song: { ...song0, hum, ...(typeof arr === \"string\" && arr.trim() ? { arrangement: arr } : {}), ...(extras.scoreExt?.lyricFit === \"lyrics\" ? { lyricFit: \"lyrics\" as const } : {}), ...(extras.scoreExt?.barNumbers === \"off\" ? { barNumbers: \"off\" as const } : {}) }, stem, hum, extras, ours, notices, view: (extras.scoreExt?.view as Record<string, unknown> | undefined) ?? null, references: {}, advice: [] };\n}\n", "// lang.ts \u2014\u2014 \u6B4C\u8BCD\u6BCF\u4E2A\u97F3\u8282\u5531\u54EA\u79CD\u8BED\u8A00\uFF1A\u81EA\u52A8\u8BA4 + \u624B\u52A8\u6539\u8FC7\u7684\u3002created 2026-10-07 by Claude Opus 5.5\n// \u6301\u4E45\u5316\u7B2C 6 \u9898\uFF08user \u9009\u300C\u6BCF\u4E2A\u97F3\u8282\u90FD\u5199\u660E\u300D\uFF09\uFF1A\u5B58\u6863\u65F6\u6BCF\u4E2A\u97F3\u8282\u90FD\u5199\u660E\u8BED\u8A00\uFF08MusicXML `<text xml:lang>`\uFF09\uFF0C\u7F16\u8F91\u65F6\u81EA\u52A8\u8BA4\u2014\u2014\n//   \u6709\u5047\u540D \u2192 \u65E5\uFF1B\u62C9\u4E01\u5B57\u6BCD\uFF08\u4E14\u6CA1\u6709\u5047\u540D\u6C49\u5B57\uFF09\u2192 \u82F1\uFF1B\u53EA\u6709\u6C49\u5B57 \u2192 \u8DDF\u524D\u4E00\u4E2A\u97F3\u8282\uFF1B\u4E00\u6761\u58F0\u90E8\u5F00\u5934\u5C31\u662F\u6C49\u5B57 \u2192 \u8DDF\u8FD9\u6761\u58F0\u90E8\u7684\u9ED8\u8BA4\u8BED\u8A00\u3002\n//   \u8BA4\u9519\u4E86\u624D\u5728\u97F3\u7B26\u4E0A\u8BB0 lang\uFF08\u53EA\u8BB0\u548C\u81EA\u52A8\u8BA4\u4E0D\u4E00\u6837\u7684\uFF09\uFF0C\u6240\u4EE5\u731C\u6CD5\u4EE5\u540E\u6539\u4E86\uFF0C\u5199\u660E\u8FC7\u7684\u4E0D\u53D8\u3002\n// \u5531 / \u753B\u7070\u4E0D\u7528\u8FD9\u91CC\u7684\u9010\u97F3\u8282\u89C4\u5219\uFF0C\u6309\u5C0F\u6708\u76F8\u5531\u7684\u90A3\u4E00\u6BB5\u5224\uFF08engine/timeline.ts sungPlan\uFF1A\u4E00\u6BB5\u91CC\u6709\u5047\u540D = \u65E5\u3001\u53EA\u6709\u6C49\u5B57 = \u4E2D\uFF1Buser 2026-10-13\u300C\u6BCF\u4E00\u6BB5\u91CC\u9762\u6709\u5047\u540D\u5C31\u7B97\u65E5\u6587\u300D\n//   \u300C\u5C31\u662F\u53E5\u5B50\u7684\u5355\u4F4D\u300D\u300C\u7528\u540C\u4E00\u4E2A\u6DF1\u6A21\u5757\u300D\uFF09\u3002\u6BB5\u8981\u6B4C\u624B\u7684\u5206\u6BB5\u8BBE\u7F6E + \u901F\u5EA6\u8868\uFF0C\u8FD9\u91CC\u591F\u4E0D\u7740\uFF0C\u5B58\u6863\u6807\u6CE8\u6682\u4ECD\u9010\u97F3\u8282\uFF1B\u4E24\u8005\u53EA\u5728\u300C\u65E5\u8BED\u6BB5\u540E\u9762\u7D27\u8DDF\u4E2D\u6587\u6BB5\u300D\u7684\u7B2C\u4E00\u4E2A\u5B57\u4E0A\u53EF\u80FD\u4E0D\u4E00\u81F4\u3002\n//   edited by Claude Fable 5.1 / Claude Opus 5.5 2026-10-13\nimport type { Token } from \"./song.ts\";\nimport { MELISMA_MARK } from \"./lyrics.ts\";\n\nconst KANA = /[\u3040-\u30FF\u31F0-\u31FF\uFF66-\uFF9F]/, HAN = /\\p{Script=Han}/u, LATIN = /[A-Za-z]/;\n\n/** \u4E00\u6BB5\u6587\u5B57\u6309\u6587\u5B57\u7CFB\u7EDF\u5531\u54EA\u79CD\u8BED\u8A00\uFF08\u5531 / \u753B\u7070\u6309\u6BB5\u7528\u5B83\uFF1A\u5582\u5C0F\u6708\u76F8\u4E00\u6BB5\u7684\u5B57\uFF0Ctimeline.ts sungPlan\uFF09\uFF1A\u6709\u5047\u540D \u2192 \u65E5\uFF1B\u6709\u6C49\u5B57\uFF08\u6CA1\u5047\u540D\uFF09\u2192 \u4E2D\uFF1B\u62C9\u4E01\u5B57\u6BCD \u2192 \u82F1\uFF1B\u90FD\u6CA1\u6709\uFF08\u6570\u5B57 / \u7B26\u53F7 / \u7A7A\uFF09\u2192 null = \u8DDF\u524D\u9762\u7684\u3002 */\nexport const scriptLang = (lyric: string): \"ja\" | \"zh\" | \"en\" | null => (KANA.test(lyric) ? \"ja\" : HAN.test(lyric) ? \"zh\" : LATIN.test(lyric) ? \"en\" : null);\n\n/** \u8FD9\u6761\u58F0\u90E8\u7684\u9ED8\u8BA4\u8BED\u8A00\uFF1A\u6574\u6761\u6B4C\u8BCD\u91CC\u6709\u5047\u540D \u2192 \u65E5\uFF1B\u53EA\u6709\u6C49\u5B57 \u2192 \u4E2D\uFF1B\u53EA\u6709\u62C9\u4E01\u5B57\u6BCD \u2192 \u82F1\uFF1B\u4EC0\u4E48\u90FD\u6CA1\u6709 \u2192 \u65E5\u3002 */\nexport function partDefaultLang(tokens: Token[]): string {\n  const ls = tokens.flatMap((t) => (t.kind === \"note\" && t.lyric && t.lyric !== MELISMA_MARK ? [t.lyric] : [])).join(\"\");\n  if (KANA.test(ls)) return \"ja\";\n  if (HAN.test(ls)) return \"zh\";\n  if (LATIN.test(ls)) return \"en\";\n  return \"ja\";\n}\n\n/** \u6BCF\u4E2A\u4E0B\u6807\u7684\u8BED\u8A00\uFF1A\u6709\u6B4C\u8BCD\uFF08\u4E0D\u542B\u62D6\u8154\u8BB0\u53F7\uFF09\u7684\u97F3\u7B26 = \u8BED\u8A00\uFF0C\u522B\u7684 = null\u3002override = \u7528\u97F3\u7B26\u4E0A\u8BB0\u7740\u7684 lang\uFF08\u7F16\u8F91 / \u5531\u7528\uFF09\uFF1Bfalse = \u53EA\u7B97\u81EA\u52A8\u8BA4\u7684\uFF08\u5224\u65AD\u8981\u4E0D\u8981\u8BB0\uFF09\u3002 */\nexport function syllableLangs(tokens: Token[], override = true): (string | null)[] {\n  const def = partDefaultLang(tokens);\n  let prev = def;\n  return tokens.map((t) => {\n    if (t.kind !== \"note\" || !t.lyric || t.lyric === MELISMA_MARK) return null;\n    let l = KANA.test(t.lyric) ? \"ja\" : HAN.test(t.lyric) ? prev : LATIN.test(t.lyric) ? \"en\" : prev;\n    if (override && t.lang) l = t.lang;\n    prev = l;\n    return l;\n  });\n}\n\n/** \u8BFB\u6863\u7528\uFF1A\u6BCF\u4E2A\u97F3\u8282\u8BFB\u5230\u7684\u8BED\u8A00\uFF08null = \u6587\u4EF6\u91CC\u6CA1\u5199\uFF09\u2192 \u53EA\u5728\u548C\u81EA\u52A8\u8BA4\uFF08\u6309\u524D\u9762\u5DF2\u5B9A\u7684\u8BED\u8A00\u5F80\u540E\u63A8\uFF09\u4E0D\u4E00\u6837\u7684\u97F3\u7B26\u4E0A\u8BB0 lang\u3002\u539F\u5730\u6539 tokens \u91CC\u7684\u97F3\u7B26\u3002 */\nexport function keepOnlyOverrides(tokens: Token[], read: (string | null)[]): void {\n  const def = partDefaultLang(tokens);\n  let prev = def;\n  tokens.forEach((t, i) => {\n    if (t.kind !== \"note\" || !t.lyric || t.lyric === MELISMA_MARK) return;\n    const auto = KANA.test(t.lyric) ? \"ja\" : HAN.test(t.lyric) ? prev : LATIN.test(t.lyric) ? \"en\" : prev;\n    const got = read[i];\n    if (got && got !== auto) t.lang = got; else delete t.lang;\n    prev = got ?? auto;\n  });\n}\n", "// xml.ts \u2014\u2014 \u8BFB\u5199 MusicXML \u7528\u7684\u6700\u5C0F XML\uFF1A\u89E3\u6790\u6210\u4E00\u68F5\u5143\u7D20\u6811\u3001\u8F6C\u4E49\u5199\u51FA\u3002created 2026-10-07 by Claude Opus 5.5\n// \u4E3A\u4EC0\u4E48\u81EA\u5DF1\u5199\uFF1A\u6D4F\u89C8\u5668\u6709 DOMParser\uFF0C\u4F46 node \u8DD1\u6D4B\u8BD5\u6CA1\u6709\uFF1BMusicXML \u53EA\u7528\u5230\u5143\u7D20 / \u5C5E\u6027 / \u6587\u5B57 / \u6CE8\u91CA / DOCTYPE / \u5904\u7406\u6307\u4EE4 / CDATA / \u5B9E\u4F53\uFF0C\n// \u4E00\u767E\u884C\u4EE5\u5185\u80FD\u5199\u5BF9\uFF0C\u6BD4 vendor \u4E00\u4E2A XML \u5E93\u8F7B\uFF08\u5BB6\u89C4 vendor everything\uFF0C\u80FD\u4E0D\u52A0\u4F9D\u8D56\u5C31\u4E0D\u52A0\uFF09\u3002\u4E0D\u505A\u547D\u540D\u7A7A\u95F4\u3001\u4E0D\u505A DTD \u5C55\u5F00\u3002\n\nexport interface El { name: string; attrs: Record<string, string>; children: (El | string)[] }\n\nconst ENT: Record<string, string> = { amp: \"&\", lt: \"<\", gt: \">\", quot: '\"', apos: \"'\" };\nfunction decode(s: string): string {\n  return s.replace(/&(#x[0-9a-fA-F]+|#[0-9]+|[a-zA-Z]+);/g, (m, e: string) =>\n    e[0] === \"#\" ? String.fromCodePoint(e[1] === \"x\" ? parseInt(e.slice(2), 16) : parseInt(e.slice(1), 10)) : ENT[e] ?? m);\n}\nexport const esc = (s: string): string => s.replace(/[&<>\"]/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\" })[c]!);\n\n/** \u89E3\u6790\u6574\u4EFD XML\uFF0C\u8FD4\u56DE\u6839\u5143\u7D20\u3002\u683C\u5F0F\u4E0D\u5BF9\u5C31\u629B\u9519\uFF08\u8BF4\u6E05\u5728\u54EA\uFF09\u3002 */\nexport function parseXml(src: string): El {\n  let i = 0;\n  const fail = (what: string): never => { throw new Error(`XML \u8BFB\u4E0D\u61C2\uFF08\u7B2C ${src.slice(0, i).split(\"\\n\").length} \u884C\uFF09\uFF1A${what}`); };\n  const stack: El[] = [{ name: \"#doc\", attrs: {}, children: [] }];\n  while (i < src.length) {\n    const lt = src.indexOf(\"<\", i);\n    const text = src.slice(i, lt < 0 ? src.length : lt);\n    if (text && stack.length > 1) stack[stack.length - 1].children.push(decode(text));\n    if (lt < 0) break;\n    i = lt;\n    if (src.startsWith(\"<!--\", i)) { const e = src.indexOf(\"-->\", i); if (e < 0) fail(\"\u6CE8\u91CA\u6CA1\u6536\u5C3E\"); i = e + 3; continue; }\n    if (src.startsWith(\"<![CDATA[\", i)) { const e = src.indexOf(\"]]>\", i); if (e < 0) fail(\"CDATA \u6CA1\u6536\u5C3E\"); stack[stack.length - 1].children.push(src.slice(i + 9, e)); i = e + 3; continue; }\n    if (src.startsWith(\"<?\", i)) { const e = src.indexOf(\"?>\", i); if (e < 0) fail(\"\u5904\u7406\u6307\u4EE4\u6CA1\u6536\u5C3E\"); i = e + 2; continue; }\n    if (src.startsWith(\"<!\", i)) {   // DOCTYPE\uFF08\u53EF\u80FD\u5E26 [\u5185\u90E8\u5B50\u96C6]\uFF09\n      let depth = 0, j = i;\n      for (; j < src.length; j++) { const c = src[j]; if (c === \"[\") depth++; else if (c === \"]\") depth--; else if (c === \">\" && depth === 0) break; }\n      i = j + 1; continue;\n    }\n    if (src[i + 1] === \"/\") {\n      const e = src.indexOf(\">\", i); if (e < 0) fail(\"\u7ED3\u675F\u6807\u7B7E\u6CA1\u6536\u5C3E\");\n      const name = src.slice(i + 2, e).trim(), top = stack.pop()!;\n      if (!top || top.name !== name) fail(`\u7ED3\u675F\u6807\u7B7E </${name}> \u5BF9\u4E0D\u4E0A <${top?.name}>`);\n      i = e + 1; continue;\n    }\n    const m = /^<([^\\s/>]+)/.exec(src.slice(i, i + 200)); if (!m) fail(\"\u6807\u7B7E\u540D\");\n    const el: El = { name: m![1], attrs: {}, children: [] };\n    i += m![0].length;\n    const attrRe = /\\s*([^\\s=/>]+)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/y;\n    for (;;) {\n      attrRe.lastIndex = i;\n      const a = attrRe.exec(src);\n      if (!a) break;\n      el.attrs[a[1]] = decode(a[3] ?? a[4] ?? \"\");\n      i = attrRe.lastIndex;\n    }\n    while (/\\s/.test(src[i] ?? \"\")) i++;\n    stack[stack.length - 1].children.push(el);\n    if (src.startsWith(\"/>\", i)) { i += 2; continue; }\n    if (src[i] !== \">\") fail(`<${el.name}> \u91CC\u6709\u8BFB\u4E0D\u61C2\u7684\u4E1C\u897F`);\n    i++;\n    stack.push(el);\n  }\n  if (stack.length !== 1) fail(`<${stack[stack.length - 1].name}> \u6CA1\u6709\u7ED3\u675F`);\n  const root = stack[0].children.find((c): c is El => typeof c !== \"string\");\n  if (!root) fail(\"\u6CA1\u6709\u6839\u5143\u7D20\");\n  return root!;\n}\n\nexport const kids = (el: El | undefined, name?: string): El[] =>\n  (el?.children ?? []).filter((c): c is El => typeof c !== \"string\" && (name === undefined || c.name === name));\nexport const kid = (el: El | undefined, name: string): El | undefined => kids(el, name)[0];\nexport const text = (el: El | undefined): string =>\n  (el?.children ?? []).map((c) => (typeof c === \"string\" ? c : text(c))).join(\"\");\n/** \u5B50\u5143\u7D20\u7684\u6587\u5B57\uFF08\u53BB\u9996\u5C3E\u7A7A\u767D\uFF09\uFF1B\u6CA1\u6709 = undefined\u3002 */\nexport const childText = (el: El | undefined, name: string): string | undefined => { const k = kid(el, name); return k ? text(k).trim() : undefined; };\n", "// musicxml.ts \u2014\u2014 \u51E0\u6761\u58F0\u90E8\u7684 token \u2194 MusicXML 4.0\uFF08score-partwise\uFF09\u3002created 2026-10-07 by Claude Opus 5.5\uFF1B\u591A\u58F0\u90E8 2026-10-08 by Claude Fable 5.1\n// \u6570\u636E\u5951\u7EA6\u8349\u7A3F\uFF08ai-docs/20261007-data-contract-draft.md\uFF09\u00A74 \u7684\u5BF9\u7167\u8868\u843D\u5730\u3002\u5B58\u6CD5 B\uFF08\u00A76\u00BE\uFF09\uFF1A\u6BCF\u5F20\u7EB8\u4E00\u4EFD\u5B8C\u6574\u7684 MusicXML\uFF08`.moonsinger/papers/<id>.musicxml`\uFF0C\n//   \u8FD9\u5F20\u7EB8\u4E0A\u5728\u573A\u7684\u58F0\u90E8\u90FD\u5728\u91CC\u9762\uFF09+ \u4E00\u4EFD\u6D3E\u751F\u538B\u5E73\u7684 score.musicxml\uFF08\u5404\u58F0\u90E8\u6574\u9996\u63A5\u8D77\u6765\uFF0C\u6BCF\u5F20\u7EB8\u8D77 <print new-page> + \u6392\u7EC3\u8BB0\u53F7 = \u66F2\u6BB5\u540D\uFF09\u7ED9\u522B\u7684\u8F6F\u4EF6\u770B\u3002\n// \u5199\uFF1A\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6 / \u97F3\u7B26 / \u4F11\u6B62 / \u8FDE\u97F3\u7EBF / \u6B4C\u8BCD\uFF08\u6BCF\u4E2A\u97F3\u8282 xml:lang\uFF0C\u6301\u4E45\u5316\u7B2C 6 \u9898\uFF09/ \u4EBA\u63D2\u7684\u5C0F\u8282\u7EBF\uFF1B\u65F6\u503C = divisions 1680\uFF08= TPQ\uFF0C\u51E0\u79CD\u8FDE\u97F3\u90FD\u662F\u6574\u6570\uFF09\u3002\n//   MusicXML \u5FC5\u987B\u5206\u5C0F\u8282\uFF1A\u4EBA\u63D2\u7684\u5C0F\u8282\u7EBF\u548C\u6309\u62CD\u53F7\u81EA\u52A8\u65AD\u7684\u90FD\u5199\u6210\u5C0F\u8282\uFF0C\u54EA\u4E9B\u662F\u4EBA\u63D2\u7684\u7531\u8C03\u7528\u65B9\u8BB0\u8FDB .moonsinger/score.json\uFF1B\n//   \u97F3\u8DE8\u8FC7\u81EA\u52A8\u65AD\u5F00\u7684\u5C0F\u8282\u7EBF \u2192 \u62C6\u6210\u51E0\u6BB5\u7528\u8FDE\u97F3\u7EBF\u8FDE\u7740\uFF0C\u540E\u9762\u51E0\u6BB5\u7684 id \u662F\u300Cn17-2\u300D\uFF0C\u8BFB\u56DE\u6765\u65F6\u5E76\u56DE\u4E00\u4E2A\u97F3\uFF08\u81EA\u5BB6\u6587\u4EF6\u539F\u6837\u590D\u539F\uFF09\u3002\n//   \u901F\u5EA6\u8BB0\u53F7\u53EA\u5199\u5728\u7B2C\u4E00\u4E2A\u58F0\u90E8\uFF08\u901F\u5EA6 = \u7B2C\u4E00\u4E2A\u58F0\u90E8\u7684\u72B6\u6001\u673A\uFF09\uFF1B\u5404\u58F0\u90E8\u5C0F\u8282\u6570\u4E0D\u7B49\u65F6\u540E\u9762\u8865\u6574\u5C0F\u8282\u4F11\u6B62\uFF08\u522B\u7684\u8F6F\u4EF6\u8981\u5404\u58F0\u90E8\u5C0F\u8282\u6570\u4E00\u6837\uFF09\u3002\n// \u8BFB\uFF1A\u81EA\u5BB6\u6587\u4EF6\u6309\u4E0A\u9762\u7684\u89C4\u77E9\u539F\u6837\u590D\u539F\uFF08\u6BCF\u4E2A\u58F0\u90E8\u4E00\u4E32\uFF09\uFF1B\u522B\u7684\u8F6F\u4EF6\u5B58\u7684\u5C3D\u91CF\u8BFB\uFF08\u6BCF\u4E2A\u58F0\u90E8\u7B2C\u4E00\u4E2A voice\uFF1B\u8BFB\u4E0D\u4E86\u7684\u4E1C\u897F\u6570\u51FA\u6765\u62A5\u7ED9\u4EBA\uFF0C\u4E0D\u9759\u9ED8\u4E22\uFF09\u3002\nimport { type Paper, DEFAULT_PAPER, paperOf, detectPaper, staffMmOf, densityOf } from \"../score/paper.ts\";\nimport { DYNS, withArt, type ClefName, type NavTok, NAV_LABEL, endingLabel, type NavWhat, type Repeat, type Token, type NoteTok, type GrooveTok, type Art, type Dyn, ARTS, ATTACKS, TPQ, WHOLE, DEFAULT_KEY, DEFAULT_TIME, DEFAULT_BPM, headLen, effectivePitch, staffOfTokens, autoStaffs, allPitches, withPitches, rampTarget } from \"../score/song.ts\";\nimport { midiOf } from \"../score/pitch.ts\";\nimport type { Pitch } from \"../score/pitch.ts\";\nimport { MELISMA_MARK, ELISION } from \"../score/lyrics.ts\";\nimport { syllableLangs, keepOnlyOverrides } from \"../score/lang.ts\";\nimport { type El, esc, parseXml, kids, kid, childText, text } from \"./xml.ts\";\nimport { grooveLabel } from \"../score/groove.ts\";\n\nexport interface PartInfo {\n  id: string;               // \"P1\"\n  clef?: ClefName;          // \u8C31\u53F7\uFF08\u6CA1\u6709 = \u9AD8\u97F3\uFF09\uFF1B\u516B\u5EA6\u8C31\u53F7\u5199 <clef-octave-change>\uFF08v0.9.28\uFF09\n  staves?: 2;               // \u5927\u8C31\u8868\uFF08\u4E0A\u9AD8\u97F3\u4E0B\u4F4E\u97F3\uFF1B\u6BCF\u4E2A\u97F3\u5E26 <staff>\uFF09\n  name: string;             // \u58F0\u90E8\u540D = \u89D2\u8272\u540D\uFF08\u8C31\u53F7\u524D\u9762\u90A3\u4E2A\uFF09\n  instrumentName: string;   // \u4E0A\u573A\u7684\u5019\u9009\u7684\u540D\u5B57\uFF08\u7ED9\u522B\u7684\u8F6F\u4EF6\u770B\uFF09\n  sound: string;            // MusicXML \u5B98\u65B9\u4E50\u5668\u8BED\u4E49 id\uFF08= \u89D2\u8272\u662F\u4EC0\u4E48\u58F0\u90E8\uFF0C\u5982 voice.vocals\uFF1Bsrc/score/roles.ts\uFF09\n  program: number;          // GM \u97F3\u8272\u53F7 1\u2013128\n  variant?: { library: string; name: string };   // <virtual-instrument>\uFF08\u6211\u4EEC\u7684\u53D8\u4F53\uFF09\n  volume?: number;          // 0\u2013100\uFF08MusicXML <volume>\uFF09\n  pan?: number;             // \u221290\u202690\n}\n/** \u4E00\u6761\u58F0\u90E8\uFF1A\u8C01 + \u4E00\u4E32 token\uFF1Bbreaks = \u4ECE\u54EA\u4E9B token \u4E0B\u6807\u8D77\u662F\u65B0\u7684\u4E00\u9875\uFF08\u538B\u5E73\u4EF6\u7684\u7EB8\u754C\uFF1Atoken \u4E0B\u6807 \u2192 \u66F2\u6BB5\u540D\uFF0C\u7B2C\u4E00\u4E2A\u58F0\u90E8\u5199\u6392\u7EC3\u8BB0\u53F7\uFF09\u3002 */\nexport interface PartXml { info: PartInfo; tokens: Token[]; breaks?: Map<number, string> }\n/** padMeasures = \u5404\u58F0\u90E8\u5C0F\u8282\u6570\u4E0D\u7B49\u65F6\u8865\u6574\u5C0F\u8282\u4F11\u6B62\uFF08\u7ED9\u522B\u7684\u8F6F\u4EF6\u770B\u7684\u538B\u5E73\u4EF6\u8981\uFF1B\u81EA\u5BB6\u6B63\u672C\u4E0D\u8865\u2014\u2014\u8BFB\u56DE\u6765\u4F1A\u591A\u51FA\u4F11\u6B62\uFF09\u3002 */\nexport interface ScoreXml { title?: string; movementTitle?: string; paper?: Paper; credits?: string; rights?: string; parts: PartXml[]; padMeasures?: boolean }   // rights = \u8FD9\u9996\u6B4C\u81EA\u5DF1\u7684\u8BB8\u53EF\uFF08<identification><rights>\uFF09\nexport interface WriteMeta { software: string; date: string }\nexport interface Written { xml: string; manualBars: Record<string, number[]>; unwritten: string[] }\n\nconst measureLen = (beats: number, beatType: number) => (beats * WHOLE) / beatType;\nconst TYPES: [string, number][] = [[\"whole\", WHOLE], [\"half\", WHOLE / 2], [\"quarter\", TPQ], [\"eighth\", TPQ / 2], [\"16th\", TPQ / 4], [\"32nd\", TPQ / 8], [\"64th\", TPQ / 16]];\nconst TUPLETS: [number, number][] = [[1, 1], [3, 2], [5, 4], [6, 4], [7, 4]];\n/** \u65F6\u503C \u2192 \u663E\u793A\u7528\u7684 type / dot / \u8FDE\u97F3\uFF08\u53EA\u662F\u663E\u793A\uFF1B\u8BFB\u7684\u65F6\u5019\u53EA\u8BA4 duration\uFF09\u3002\u51D1\u4E0D\u51FA\u6765 = \u4E0D\u5199 type\uFF08MusicXML \u91CC\u5B83\u662F\u53EF\u9009\u7684\uFF09\u3002 */\nfunction noteType(dur: number): { type: string; dots: number; tuplet: [number, number] | null } | null {\n  for (const [act, norm] of TUPLETS) for (const [type, base] of TYPES) for (let dots = 0; dots <= 2; dots++) {\n    if (Math.abs(base * (2 - 1 / 2 ** dots) * (norm / act) - dur) < 0.5) return { type, dots, tuplet: act === 1 ? null : [act, norm] };\n  }\n  return null;\n}\nconst pitchXml = (p: Pitch) => `<pitch><step>${p.step}</step>${p.alter ? `<alter>${p.alter}</alter>` : \"\"}<octave>${p.octave}</octave></pitch>`;\n\n/** \u7248\u5F0F \u2192 MusicXML \u7684\u884C\u8DDD / \u8C31\u8DDD\uFF08tenths\uFF0C40 = \u4E00\u4E2A\u4E94\u7EBF\u8C31\u9AD8\uFF09\uFF1A\u8212\u9002 / \u7D27\u51D1\uFF1B\u8BFB\u7684\u65F6\u5019 staff-distance < 65 = \u7D27\u51D1\u3002 */\nconst LAYOUT_TENTHS = { cozy: { system: 110, staff: 80 }, compact: { system: 60, staff: 50 } };\n/** \u7EB8 \u2192 <defaults>\uFF1A<scaling> = \u4E94\u7EBF\u8C31\u591A\u5927\uFF08\u56DB\u4E2A\u7EBF\u95F4\u8DDD = staffMm mm = 40 tenths\uFF1B\u9ED8\u8BA4 STAFF_MM\uFF09\uFF0C<page-layout> = \u9875\u5BBD\u9AD8 + \u56DB\u8FB9\u8FB9\u8DDD\uFF08tenths\uFF0C\u6309\u8FD9\u5F20\u7EB8\u7684\u8C31\u5927\u5C0F\u6362\u7B97\uFF09\u3002 */\nconst tenthsPerMm = (p: Paper) => 40 / staffMmOf(p);\nfunction defaultsXml(p: Paper): string {\n  const t = (mm: number) => +(mm * tenthsPerMm(p)).toFixed(2), m = p.marginMm;\n  const compact = densityOf(p) === \"compact\";   // \u7248\u5F0F\u8FDB\u6807\u51C6\u7684 system-layout / staff-layout\uFF08tenths\uFF1B\u7D27\u51D1 = \u884C\u8DDD / \u8C31\u8DDD\u6536\u7D27\uFF09\n  return `<defaults><scaling><millimeters>${staffMmOf(p)}</millimeters><tenths>40</tenths></scaling><page-layout><page-height>${t(p.heightMm)}</page-height><page-width>${t(p.widthMm)}</page-width>` +\n    `<page-margins type=\"both\"><left-margin>${t(m.l)}</left-margin><right-margin>${t(m.r)}</right-margin><top-margin>${t(m.t)}</top-margin><bottom-margin>${t(m.b)}</bottom-margin></page-margins></page-layout>` +\n    `<system-layout><system-distance>${compact ? LAYOUT_TENTHS.compact.system : LAYOUT_TENTHS.cozy.system}</system-distance></system-layout><staff-layout><staff-distance>${compact ? LAYOUT_TENTHS.compact.staff : LAYOUT_TENTHS.cozy.staff}</staff-distance></staff-layout></defaults>`;\n}\n/** <defaults> \u2192 \u7EB8\uFF08\u6309\u6587\u4EF6\u81EA\u5DF1\u7684 <scaling> \u6362\u6210 mm \u518D\u8BA4\u6863\uFF09\uFF1B\u6CA1\u6709\u9875\u9762\u8BBE\u7F6E = undefined\uFF08= \u9ED8\u8BA4 A5\uFF09\u3002\u9ED8\u8BA4 A5 \u539F\u6837\u4E5F\u8BB0\u6210 undefined\uFF08\u5F80\u8FD4\u4E0D\u591A\u51FA\u5B57\u6BB5\uFF09\u3002 */\nfunction readPaper(root: El): Paper | undefined {\n  const d = kid(root, \"defaults\"), pl = kid(d, \"page-layout\");\n  const n = (el: El | undefined, name: string) => { const v = childText(el, name); return v === undefined ? NaN : Number(v); };\n  const mm = n(kid(d, \"scaling\"), \"millimeters\"), tn = n(kid(d, \"scaling\"), \"tenths\"), w = n(pl, \"page-width\"), h = n(pl, \"page-height\");\n  if (!(mm > 0 && tn > 0 && w > 0 && h > 0)) return undefined;\n  const k = mm / tn, pm = kid(pl, \"page-margins\"), mg = (name: string) => { const v = n(pm, name); return v >= 0 ? v * k : 15; };\n  const sd = n(kid(d, \"staff-layout\"), \"staff-distance\"), density = sd > 0 && sd < 65 ? \"compact\" : \"cozy\";\n  const p = detectPaper(w * k, h * k, { l: mg(\"left-margin\"), r: mg(\"right-margin\"), t: mg(\"top-margin\"), b: mg(\"bottom-margin\") }, k * 40, density);\n  const def = paperOf(DEFAULT_PAPER), same = (a: number, b: number) => Math.abs(a - b) < 0.05;\n  if (p.kind === DEFAULT_PAPER && p.staffMm === undefined && !p.density && same(p.marginMm.l, def.marginMm.l) && same(p.marginMm.r, def.marginMm.r) && same(p.marginMm.t, def.marginMm.t) && same(p.marginMm.b, def.marginMm.b)) return undefined;\n  return p;\n}\n/** \u4F5C\u8005\u680F \u2192 \u4E00\u5757\u5370\u5728\u7B2C\u4E00\u9875\u53F3\u4E0A\uFF08\u6807\u9898\u4E0B\u9762\uFF09\u7684\u5B57\uFF1A<credit><credit-words>\uFF0C\u51E0\u884C\u7528\u6362\u884C\u9694\u5F00\u3001\u53F3\u5BF9\u9F50\uFF08\u4F4D\u7F6E\u6309\u7EB8\u7B97\uFF0Ctenths\uFF0Cy \u4ECE\u9875\u5E95\u5F80\u4E0A\u91CF\uFF09\u3002 */\nfunction creditXml(text: string, p: Paper): string {\n  const t = (mm: number) => +(mm * tenthsPerMm(p)).toFixed(1);\n  return `<credit page=\"1\"><credit-words default-x=\"${t(p.widthMm - p.marginMm.r)}\" default-y=\"${t(p.heightMm - p.marginMm.t - 12)}\" justify=\"right\" valign=\"top\">${esc(text)}</credit-words></credit>`;\n}\n/** \u8BFB\u4F5C\u8005\u680F\uFF1A\u7B2C\u4E00\u9875\u4E0A\u4E0D\u662F\u6807\u9898 / \u526F\u6807\u9898 / \u9875\u7801 / \u58F0\u90E8\u540D\u7684\u90A3\u4E9B credit \u5B57\uFF1B\u90FD\u6CA1\u6709\u5C31\u4ECE <creator> \u62FC\uFF08v0.2.23 \u5B58\u7684\u3001\u522B\u7684\u8F6F\u4EF6\u7684\u4F5C\u8BCD\u4F5C\u66F2\uFF09\uFF0C\u7167\u5F53\u65F6\u7EB8\u4E0A\u7684\u6837\u5B50\u5199\u6210\u51E0\u884C\u3002 */\nfunction readCredits(root: El, title: string): string | undefined {\n  const skip = new Set([\"title\", \"subtitle\", \"page number\", \"part name\"]);\n  const blocks = kids(root, \"credit\").filter((c) => !kids(c, \"credit-type\").some((ct) => skip.has(text(ct).trim())))\n    .map((c) => kids(c, \"credit-words\").map((w) => text(w)).join(\"\\n\").trim()).filter((s) => s && s !== title);\n  if (blocks.length) return blocks.join(\"\\n\");\n  const cr = kids(kid(root, \"identification\"), \"creator\"), by = (...types: string[]) => cr.filter((c) => types.includes(c.attrs.type ?? \"\")).map((c) => text(c).trim()).filter(Boolean);\n  const ly = by(\"lyricist\", \"poet\")[0], co = by(\"composer\")[0], lines: string[] = [];\n  if (ly && co && ly === co) lines.push(`${ly} \u8BCD\u66F2`); else { if (ly) lines.push(`${ly} \u8BCD`); if (co) lines.push(`${co} \u66F2`); }\n  for (const a of by(\"arranger\")) lines.push(`${a} \u7F16\u66F2`);\n  for (const c of cr) { const ty = c.attrs.type ?? \"\"; if (![\"lyricist\", \"poet\", \"composer\", \"arranger\"].includes(ty) && text(c).trim()) lines.push(`${ty ? `${ty}\uFF1A` : \"\"}${text(c).trim()}`); }\n  return lines.length ? lines.join(\"\\n\") : undefined;\n}\n\n// \u4FEE\uFF082026-10-08 by Claude Opus 5.5\uFF09\uFF1A\u529B\u5EA6 = <direction><dynamics>\uFF08\u58F0\u4E50\u8C31\u653E\u8C31\u4E0A\u65B9\uFF1A\u4E0B\u9762\u662F\u6B4C\u8BCD\uFF09\uFF1B\u6F14\u594F\u6CD5 = <notations><articulations>\uFF08\u547C\u5438 = breath-mark\uFF0C\u6302\u5728\u547C\u5438\u524D\u90A3\u4E2A\u97F3\u4E0A\uFF09\nconst dynXml = (v: Dyn) => `<direction placement=\"above\"><direction-type><dynamics><${v}/></dynamics></direction-type></direction>`;\n/** \u6E10\u5F3A\u6E10\u5F31\uFF082026-10-08\uFF09\uFF1A<wedge> \u662F\u4E00\u79CD direction\uFF0C\u548C\u529B\u5EA6\u8BB0\u53F7\u653E\u5728\u4E00\u8D77\uFF08\u8C31\u4E0A\u65B9\uFF09\u3002 */\nconst wedgeXml = (type: \"crescendo\" | \"diminuendo\" | \"stop\", extra = \"\") => `<direction placement=\"above\"><direction-type><wedge type=\"${type}\" number=\"1\"${extra}/></direction-type></direction>`;\n/** \u6E10\u5230\uFF082026-10-08 \u6DF1\u591C Opus 5.5\uFF09\uFF1A\u5199\u6210\u4ECE\u4E0A\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u8D77\u7684\u865A\u7EBF <wedge line-type=\"dashed\">\uFF08\u522B\u7684\u8F6F\u4EF6\u7167\u6837\u6E10\u53D8\u3001\u7167\u6837\u753B\u865A\u7EBF\uFF09\uFF0Cid \u4EE5 ramp- \u5F00\u5934 = \u6211\u4EEC\u81EA\u5DF1\u8BFB\u56DE\u6765\u65F6\u8BA4\u51FA\u5B83\u662F\u6E10\u5230\u3001\u4E0D\u53D8\u6210\u624B\u5199\u7684\u6E10\u5F3A\u6E10\u5F31\u3002 */\nconst RAMP_ID = \"ramp-\";\nconst DYN_ORDER: readonly Dyn[] = DYNS;   // ppp\u2026fff\uFF08v0.9.23\uFF09\nconst ART_XML: Record<Art, string> = { accent: \"accent\", marcato: \"strong-accent\", sfz: \"sfz\", fp: \"fp\", staccato: \"staccato\", tenuto: \"tenuto\", breath: \"breath-mark\", stress: \"stress\", unstress: \"unstress\", ghost: \"\", whisper: \"\", swellUp: \"\", swellDown: \"\", swellBoth: \"\", arpeggio: \"\" };   // arpeggio = <notations><arpeggiate/>\uFF08\u6BCF\u4E2A\u548C\u5F26\u97F3\u90FD\u5199\uFF0C\u4E0B\u9762\uFF09   // whisper = \u00D7 \u7B26\u5934\uFF08<notehead>x</notehead>\uFF09\uFF0C\u540C\u5E7D\u7075\u97F3\u4E0D\u5728 <articulations> \u91CC   // ghost = \u62EC\u53F7\u7B26\u5934\uFF08<notehead parentheses=\"yes\">\uFF09\uFF0C\u4E0D\u5728 <articulations> \u91CC   // sfz / fp \u5199\u5728 <notations><dynamics> \u91CC\nconst NOTE_DYN: readonly Art[] = [\"sfz\", \"fp\"];\n/** \u522B\u5BB6\u8C31\u91CC\u97F3\u4E0A\uFF08\u6216\u97F3\u524D\uFF09\u7684\u529B\u5EA6\u5F62\u72B6 \u2192 \u6211\u4EEC\u7684\u4E24\u4E2A\uFF1A\u7A81\u5F3A\u4E00\u65CF / \u5F3A\u540E\u5373\u5F31\u4E00\u65CF\u3002 */\nconst XML_NOTE_DYN: Record<string, Art> = { sfz: \"sfz\", sf: \"sfz\", sffz: \"sfz\", fz: \"sfz\", sfzp: \"fp\", fp: \"fp\", sfp: \"fp\" };\nconst XML_ART: Record<string, Art> = { accent: \"accent\", \"strong-accent\": \"marcato\", staccato: \"staccato\", tenuto: \"tenuto\", \"breath-mark\": \"breath\", stress: \"stress\", unstress: \"unstress\" };\n/** \u522B\u5BB6\u8C31\u7684\u529B\u5EA6\u5F52\u5230\u8FD9\u4E00\u7248\u8BA4\u7684\u516B\u6863\uFF08v0.9.23 \u8D77 ppp / fff \u539F\u6837\uFF1Bpppp \u4EE5\u4E0A / ffff \u4EE5\u4E0A\u5E76\u5230\u4E24\u5934\uFF09\uFF1Bsfz / fp \u8FD9\u7C7B\u8BA4\u4E0D\u4E86 = null\uFF08\u6570\u51FA\u6765\u62A5\u7ED9\u4EBA\uFF09\u3002 */\nconst XML_DYN = (name: string): Dyn | null => ((DYNS as readonly string[]).includes(name) ? (name as Dyn) : /^p{4,}$/.test(name) ? \"ppp\" : /^f{4,}$/.test(name) ? \"fff\" : null);\n/** \u98CE\u683C\u8BB0\u53F7\uFF08\u62CD\u5B50\u8F7B\u91CD\uFF1B2026-10-08 \u6DF1\u591C Opus 5.5\uFF09\uFF1A<direction><words>\uFF08\u522B\u7684\u8F6F\u4EF6\u7167\u6837\u663E\u793A\u90A3\u4E2A\u5B57\uFF09\uFF0Cid = groove.<\u9884\u8BBE>.<\u5E45\u5EA6\u767E\u5206\u6570>.<token id>\u2014\u2014\n *  \u6211\u4EEC\u81EA\u5DF1\u8BFB\u56DE\u6765\u8BA4 id \u53D8\u56DE\u98CE\u683C\u8BB0\u53F7\uFF1B\u522B\u5BB6\u8C31\u91CC\u666E\u901A\u7684 <words>\uFF08rit. / dolce\u2026\uFF09\u7167\u65E7\u4E0D\u8BFB\u3002 */\nconst GROOVE_ID = \"groove.\";\nconst grooveXml = (t: GrooveTok) => `<direction placement=\"above\"><direction-type><words font-style=\"italic\" id=\"${GROOVE_ID}${t.style}.${Math.round((t.amount ?? 1) * 100)}.${t.id}${t.shift ? \".2-3\" : \"\"}\">${esc(grooveLabel(t))}</words></direction-type></direction>`;\n/** \u8C31\u5185\u53CD\u590D / \u8DF3\u8F6C\uFF082026-10-09 Opus 5.5\uFF1BMusicXML \u539F\u751F\uFF1A<barline> \u7684 <repeat> / <ending>\uFF0C<direction> \u7684 segno / coda / words + <sound dacapo / dalsegno / fine / tocoda>\uFF09\u3002\n *  \u6211\u4EEC\u81EA\u5DF1\u5199\u7684\u5E26 id = nav.<\u79CD\u7C7B>.<token id>\uFF08\u8BFB\u56DE\u6765\u8BA4\u79CD\u7C7B\uFF1B\u522B\u5BB6\u8C31\u6309 sound \u7684\u5C5E\u6027 / \u5B57\u8BA4\uFF09\u3002 */\nconst NAV_ID = \"nav.\";\nconst navXml = (t: NavTok): string => {\n  const id = `${NAV_ID}${t.what}.${t.id}`;\n  if (t.what === \"segno\") return `<direction placement=\"above\"><direction-type><segno id=\"${id}\"/></direction-type><sound segno=\"segno\"/></direction>`;\n  if (t.what === \"coda\") return `<direction placement=\"above\"><direction-type><coda id=\"${id}\"/></direction-type><sound coda=\"coda\"/></direction>`;\n  if (t.what === \"ending\") return \"\";\n  const snd = t.what === \"fine\" ? `fine=\"yes\"` : t.what === \"toCoda\" ? `tocoda=\"coda\"` : t.what.startsWith(\"dc\") ? `dacapo=\"yes\"` : `dalsegno=\"segno\"`;\n  return `<direction placement=\"above\"><direction-type><words id=\"${id}\" font-style=\"italic\">${esc(NAV_LABEL[t.what])}</words></direction-type><sound ${snd}/></direction>`;\n};\nconst tempoXml = (bpm: number) => `<direction placement=\"above\"><direction-type><metronome><beat-unit>quarter</beat-unit><per-minute>${bpm}</per-minute></metronome></direction-type><sound tempo=\"${bpm}\"/></direction>`;\n/** \u4E00\u6761\u58F0\u90E8 \u2192 \u5B83\u7684\u5C0F\u8282\u4EEC\uFF08body = \u6BCF\u5C0F\u8282\u91CC\u7684 XML \u7247\u6BB5\uFF0Cmanual = \u8FD9\u5C0F\u8282\u540E\u9762\u90A3\u6761\u5C0F\u8282\u7EBF\u662F\u4EBA\u63D2\u7684\uFF09+ \u8FD8\u6CA1\u5199\u97F3\u9AD8\u7684\u97F3\u3002first = \u7B2C\u4E00\u4E2A\u58F0\u90E8\uFF08\u624D\u5199\u901F\u5EA6 / \u6392\u7EC3\u8BB0\u53F7\uFF09\u3002 */\n/** \u8C31\u53F7 \u2192 MusicXML <clef>\uFF08\u516B\u5EA6\u8C31\u53F7 = <clef-octave-change>\uFF1Bv0.9.28\uFF09\u3002 */\nconst CLEF_OC: Record<ClefName, number> = { G: 0, G8vb: -1, G8va: 1, G15ma: 2, F: 0, F8vb: -1 };\nexport const clefXml = (c: ClefName): string => { const F = c === \"F\" || c === \"F8vb\", oc = CLEF_OC[c]; return `<clef><sign>${F ? \"F\" : \"G\"}</sign><line>${F ? 4 : 2}</line>${oc ? `<clef-octave-change>${oc}</clef-octave-change>` : \"\"}</clef>`; };\n/** MusicXML <clef> \u2192 \u8C31\u53F7\uFF08\u4E2D\u97F3 / \u6253\u51FB\u4E50 / TAB \u8FD9\u4E9B\u4E0D\u8BA4 = null\uFF09\u3002 */\nexport function clefOfXml(sign: string | undefined, octave: string | undefined): ClefName | null {\n  const oc = Number(octave ?? \"0\") || 0;\n  if (sign === \"G\") return oc <= -1 ? \"G8vb\" : oc === 1 ? \"G8va\" : oc >= 2 ? \"G15ma\" : \"G\";\n  if (sign === \"F\") return oc <= -1 ? \"F8vb\" : \"F\";\n  return null;\n}\n/** \u516B\u5EA6\u7EBF \u2192 <octave-shift>\uFF088va = \u8C31\u4E0A\u5199\u4F4E\u4E86 = type down\uFF1B\u7ED3\u675F = stop\uFF0Csize \u8DDF\u7740\u5F00\u7740\u7684\u90A3\u6761\uFF09\u3002 */\n/** auto\uFF08v0.9.37\uFF09= \u81EA\u52A8\u753B\u7684\u516B\u5EA6\u7EBF\uFF1A\u5E26 id=\"ms-auto-\u2026\"\uFF0C\u522B\u7684\u8F6F\u4EF6\u7167\u6837\u753B\uFF1B\u81EA\u5DF1\u8BFB\u56DE\u6765\u8BA4\u51FA\u662F\u81EA\u52A8\u7684\u5C31\u8DF3\u8FC7\uFF08\u81EA\u52A8\u7684\u4E0D\u5B58\u8FDB\u8C31\u3001\u968F\u65F6\u91CD\u7B97\uFF09\u3002 */\nlet autoSeq = 0;\nconst ottavaXml = (shift: number, open: number, auto = false): string => {\n  const id = () => (auto ? ` id=\"ms-auto-${++autoSeq}\"` : \"\");\n  const stop = open ? `<direction><direction-type><octave-shift type=\"stop\" size=\"${open === 2 ? 15 : 8}\"${id()}/></direction-type></direction>` : \"\";\n  if (!shift) return stop;\n  return stop + `<direction placement=\"${shift > 0 ? \"above\" : \"below\"}\"><direction-type><octave-shift type=\"${shift > 0 ? \"down\" : \"up\"}\" size=\"${shift === 2 ? 15 : 8}\"${id()}/></direction-type></direction>`;\n};\nfunction partMeasures(toks: Token[], breaks: Map<number, string> | undefined, first: boolean, clef: ClefName = \"G\", staves: 1 | 2 = 1): { measures: { body: string[]; manual: boolean }[]; unwritten: string[]; lastLen: number } {\n  const staffs = staffOfTokens(toks, staves);\n  const head = headLen(toks);\n  const H = { fifths: DEFAULT_KEY, beats: DEFAULT_TIME.beats, beatType: DEFAULT_TIME.beatType, bpm: DEFAULT_BPM };\n  for (let i = 0; i < head; i++) { const t = toks[i]; if (t.kind === \"key\") H.fifths = t.fifths; else if (t.kind === \"time\") { H.beats = t.beats; H.beatType = t.beatType; } else if (t.kind === \"tempo\") H.bpm = t.bpm; }\n  const langs = syllableLangs(toks);\n  const measures: { body: string[]; manual: boolean }[] = [];\n  let cur: string[] = [], ticks = 0, len = measureLen(H.beats, H.beatType);\n  // \u623F\u5B50\uFF1A\u5F00\u7740\u7684\u90A3\u4E00\u4E2A\uFF08number \u5C5E\u6027\uFF09\uFF1B\u5B83\u540E\u9762\u6709\u6CA1\u6709 :| \u6536\uFF08\u6CA1\u6709 = \u6700\u540E\u4E00\u4E2A\u623F\u5B50\uFF0C\u5230\u8FD9\u5C0F\u8282\u5C3E discontinue\uFF09\n  let ending: { num: string; closedByRepeat: boolean } | null = null;\n  const endingCloses = (i: number) => { for (let j = i + 1; j < toks.length; j++) { const u = toks[j]; if (u.kind === \"bar\" && (u.repeat === \"end\" || u.repeat === \"both\")) return true; if ((u.kind === \"nav\" && u.what === \"ending\") || (u.kind === \"bar\" && u.repeat === \"start\")) return false; } return false; };   // \u5148\u9047\u5230\u65B0\u7684 |: = \u6CA1\u88AB :| \u6536\n  const close = (manual: boolean, right = \"\") => {\n    if (ending && !ending.closedByRepeat && !right) { cur.push(`<barline location=\"right\"><ending number=\"${ending.num}\" type=\"discontinue\"/></barline>`); ending = null; }\n    if (right) cur.push(right);\n    measures.push({ body: cur, manual }); cur = []; ticks = 0;\n  };\n  const clefs = staves === 2 ? `<staves>2</staves><clef number=\"1\"><sign>G</sign><line>2</line></clef><clef number=\"2\"><sign>F</sign><line>4</line></clef>` : clefXml(clef);\n  cur.push(`<attributes><divisions>${TPQ}</divisions><key><fifths>${H.fifths}</fifths></key><time><beats>${H.beats}</beats><beat-type>${H.beatType}</beat-type></time>${clefs}</attributes>`);\n  if (first) cur.push(tempoXml(H.bpm));\n  // \u6B4C\u8BCD\u7684 syllabic\uFF1A\u6309\u300C\u8FD9\u4E2A\u8BCD\u6CA1\u5B8C\u300D\uFF08hyph\uFF09\u63A8\uFF1B\u62D6\u8154\u8BB0\u53F7\u4E0D\u6253\u65AD\u4E00\u4E2A\u8BCD\n  let prevHyph = false;\n  const syllabic = (t: NoteTok) => { const s = t.hyph ? (prevHyph ? \"middle\" : \"begin\") : (prevHyph ? \"end\" : \"single\"); prevHyph = !!t.hyph; return s; };\n  const unwritten: string[] = [];\n  const nextTimed = (i: number) => { for (let j = i + 1; j < toks.length; j++) { const t = toks[j]; if (t.kind === \"note\" || t.kind === \"rest\") return t; } return null; };\n  // \u8FDE\u7EBF\uFF082026-10-08\uFF09\uFF1A\u4E00\u4E32\u300C\u8FDE\u5230\u4E0B\u4E00\u4E2A\u300D\u7684\u97F3 = \u4E00\u6761 <slur>\uFF1A\u5934\u4E00\u4E2A\u97F3 start\uFF0C\u88AB\u8FDE\u5230\u7684\u90A3\u4E2A\u97F3 stop\uFF08\u540E\u9762\u6CA1\u6709\u97F3\u7684\u90A3\u4E2A\u6807\u8BB0\u4E0D\u5199\uFF0C\u514D\u5F97 start \u6CA1\u6709 stop\uFF09\n  const noteAt = (i: number, d: 1 | -1) => { for (let j = i + d; j >= 0 && j < toks.length; j += d) if (toks[j].kind === \"note\") return toks[j] as NoteTok; return null; };\n  let ottOpen = 0, wedgeOpen = false;\n  const slurs = (i: number, t: NoteTok) => { const pv = noteAt(i, -1), nx = noteAt(i, 1), out = !!t.slur && !!nx, into = !!pv?.slur;\n    return `${into && !out ? `<slur type=\"stop\" number=\"1\"/>` : \"\"}${out && !into ? `<slur type=\"start\" number=\"1\"/>` : \"\"}`; };\n  for (let i = head; i < toks.length; i++) {\n    const t = toks[i];\n    const br = breaks?.get(i);\n    if (br !== undefined) {   // \u7EB8\u754C\uFF1A\u8FD9\u91CC\u8D77\u65B0\u7684\u4E00\u9875\uFF08\u5C0F\u8282\u5148\u65AD\u5F00\uFF1B\u7B2C\u4E00\u4E2A\u58F0\u90E8\u5199\u6392\u7EC3\u8BB0\u53F7 = \u66F2\u6BB5\u540D\uFF09\n      if (wedgeOpen) { cur.push(wedgeXml(\"stop\")); wedgeOpen = false; }   // \u6E10\u5F3A\u6E10\u5F31\u4E0D\u8DE8\u7EB8\uFF08user\u300C\u4E0D\u8BFB\u4E0B\u4E00\u5F20\u7EB8\u300D\uFF09\n      if (ticks > 0) close(false);\n      cur.push(`<print new-page=\"yes\"/>`);\n      if (first && br) cur.push(`<direction placement=\"above\"><direction-type><rehearsal>${esc(br)}</rehearsal></direction-type></direction>`);\n    }\n    if (t.kind === \"bar\" && t.repeat) {\n      const fwd = `<barline location=\"left\"><bar-style>heavy-light</bar-style><repeat direction=\"forward\"/></barline>`;\n      const noteIn = cur.some((x) => x.startsWith(\"<note\"));\n      if (t.repeat === \"start\" && ticks === 0 && !noteIn) { cur.push(fwd); continue; }   // \u5C0F\u8282\u5F00\u5934\uFF08\u7EB8\u5934\uFF09\u7684 |:\uFF1A\u4E0D\u5F00\u4E00\u4E2A\u7A7A\u5C0F\u8282\n      let right = \"\";\n      if (t.repeat === \"end\" || t.repeat === \"both\") {\n        const stop = ending && ending.closedByRepeat ? `<ending number=\"${ending.num}\" type=\"stop\"/>` : \"\";\n        right = `<barline location=\"right\"><bar-style>light-heavy</bar-style>${stop}<repeat direction=\"backward\"${t.times && t.times > 2 ? ` times=\"${t.times}\"` : \"\"}/></barline>`;\n        if (stop) ending = null;\n      }\n      close(true, right);\n      if (t.repeat === \"start\" || t.repeat === \"both\") cur.push(fwd);\n      continue;\n    }\n    if (t.kind === \"bar\") { close(true, t.style ? `<barline location=\"right\"><bar-style>${t.style === \"double\" ? \"light-light\" : \"light-heavy\"}</bar-style></barline>` : \"\"); continue; }   // \u6BB5\u843D\u7EBF / \u7EC8\u6B62\u7EBF\uFF08v0.9.32\uFF09\n    if (t.kind === \"nav\") {\n      if (t.what === \"ending\") {\n        if (ticks >= len) close(false);\n        const num = (t.nums ?? [1]).join(\", \");\n        cur.push(`<barline location=\"left\"><ending number=\"${num}\" type=\"start\">${esc(endingLabel(t.nums))}</ending></barline>`);\n        ending = { num, closedByRepeat: endingCloses(i) };\n      } else {\n        if ((t.what === \"segno\" || t.what === \"coda\") && ticks >= len) close(false);   // Segno / Coda \u5728\u4E0B\u4E00\u5C0F\u8282\u5F00\u5934\uFF1BD.C. / Fine / To Coda \u5728\u8FD9\u5C0F\u8282\u5C3E\uFF08\u6EE1\u4E86\u4E5F\u4E0D\u5F00\u65B0\u7684\uFF09\n        cur.push(navXml(t));\n      }\n      continue;\n    }\n    if (t.kind === \"phrase\") continue;   // \u53E5\u53F7\u4E0D\u7B97\u6253\u8C31\u7B26\u53F7\uFF08user 2026-10-08\uFF09\uFF1A\u4E0D\u8FDB MusicXML\uFF0C\u5B58 .moonsinger/score.json\uFF08project.ts\uFF09\n    if (t.kind === \"key\" || t.kind === \"time\" || t.kind === \"tempo\") {\n      if (ticks >= len || (t.kind === \"time\" && ticks > 0)) close(false);   // \u6EE1\u4E86\u7684\u5C0F\u8282\u5148\u65AD\u5F00\uFF1B\u62CD\u53F7\u53D8\u4E86\u4ECE\u65B0\u5C0F\u8282\u5F00\u59CB\n      if (t.kind === \"key\") cur.push(`<attributes><key><fifths>${t.fifths}</fifths></key></attributes>`);\n      else if (t.kind === \"time\") { cur.push(`<attributes><time><beats>${t.beats}</beats><beat-type>${t.beatType}</beat-type></time></attributes>`); len = measureLen(t.beats, t.beatType); }\n      else if (first) cur.push(tempoXml(t.bpm));\n      continue;\n    }\n    // \u6E10\u5F3A\u6E10\u5F31\uFF08\u8BB0\u53F7\uFF09\uFF1A\u8FD9\u513F <wedge> start\uFF1B\u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7 / \u4E0B\u4E00\u4E2A\u6E10\u5F3A\u6E10\u5F31 / \u7EB8\u754C / \u8C31\u5C3E = stop\uFF08\u7EC8\u70B9\u5C31\u662F\u90A3\u4E2A\u529B\u5EA6\u8BB0\u53F7\uFF09\n    if (t.kind === \"dyn\") {\n      if (ticks >= len) close(false); if (wedgeOpen) { cur.push(wedgeXml(\"stop\")); wedgeOpen = false; } cur.push(dynXml(t.value));\n      let end = toks.length; for (const b of breaks?.keys() ?? []) if (b > i && b < end) end = b;   // \u6E10\u5230\u4E0D\u8DE8\u7EB8\n      const j = rampTarget(toks, i, end);\n      if (j >= 0) { const a = DYN_ORDER.indexOf(t.value), b = DYN_ORDER.indexOf((toks[j] as Extract<Token, { kind: \"dyn\" }>).value);\n        if (a !== b) { cur.push(wedgeXml(b > a ? \"crescendo\" : \"diminuendo\", ` line-type=\"dashed\" id=\"${RAMP_ID}${toks[j].id}\"`)); wedgeOpen = true; } }\n      continue;\n    }\n    if (t.kind === \"hairpin\") { if (ticks >= len) close(false); if (wedgeOpen) cur.push(wedgeXml(\"stop\")); cur.push(wedgeXml(t.dir === \"cresc\" ? \"crescendo\" : \"diminuendo\")); wedgeOpen = true; continue; }\n    if (t.kind === \"groove\") { if (ticks >= len) close(false); cur.push(grooveXml(t)); continue; }\n    if (t.kind === \"clef\") { if (staves === 1) { if (ticks >= len) close(false); cur.push(`<attributes>${clefXml(t.clef)}</attributes>`); } continue; }   // \u8C31\u53F7\u8BB0\u53F7\uFF08v0.9.28\uFF09\uFF1A\u5C0F\u8282\u4E2D\u95F4\u7684 <attributes><clef>\n    if (t.kind === \"ottava\") { if (ticks >= len) close(false); const x = ottavaXml(t.shift, ottOpen, !!t.auto); if (x) cur.push(x); ottOpen = t.shift; continue; }   // \u516B\u5EA6\u7EBF\uFF08v0.9.28\uFF1Bauto = \u81EA\u52A8\u753B\u7684\uFF0Cv0.9.37\uFF09\n    if (t.kind !== \"note\" && t.kind !== \"rest\") continue;\n    let left = t.dur, k = 0;\n    const tieOut = t.kind === \"note\" && nextTimed(i)?.kind === \"note\" && (nextTimed(i) as NoteTok).tie;\n    let lyricDone = false;\n    while (left > 0.5) {\n      if (ticks >= len) close(false);\n      const piece = Math.min(left, len - ticks), firstPiece = k === 0, last = left - piece <= 0.5;\n      const ty = noteType(piece);\n      const id = `${t.kind === \"note\" ? \"n\" : \"r\"}${t.id}${firstPiece ? \"\" : `-${k + 1}`}`;\n      let x = `<note id=\"${id}\">`;\n      if (t.kind === \"rest\") x += `<rest/><duration>${Math.round(piece)}</duration>`;\n      else {\n        const tieIn = firstPiece ? !!t.tie : true, tieOn = last ? tieOut : true;\n        x += pitchXml(effectivePitch(toks, i)) + `<duration>${Math.round(piece)}</duration>` + (tieIn ? `<tie type=\"stop\"/>` : \"\") + (tieOn ? `<tie type=\"start\"/>` : \"\");\n      }\n      x += `<voice>1</voice>`;\n      // \u5143\u7D20\u987A\u5E8F\u7167 MusicXML 4.0\uFF1Atype / dot / time-modification \u4E4B\u540E\u624D\u662F staff\uFF0C\u518D\u540E\u9762 notations / lyric\uFF08v0.6.8 \u4E4B\u524D staff \u5199\u5728 type \u524D\u9762\uFF09\n      const typeXml = ty ? `<type>${ty.type}</type>` + \"<dot/>\".repeat(ty.dots) + (ty.tuplet ? `<time-modification><actual-notes>${ty.tuplet[0]}</actual-notes><normal-notes>${ty.tuplet[1]}</normal-notes></time-modification>` : \"\") : \"\";\n      const staffXml = staves === 2 ? `<staff>${staffs[i]}</staff>` : \"\";\n      const ghostH = t.kind === \"note\" && (t.art ?? []).includes(\"ghost\"), whisperH = t.kind === \"note\" && (t.art ?? []).includes(\"whisper\");\n      const headXml = ghostH || whisperH ? `<notehead${ghostH ? ` parentheses=\"yes\"` : \"\"}>${whisperH ? \"x\" : \"normal\"}</notehead>` : \"\";   // \u5E7D\u7075\u97F3 = \u62EC\u53F7\u7B26\u5934\u3001\u6C14\u58F0 = \u00D7 \u7B26\u5934\uFF08\u5FF5\u767D / \u8BF4\u5531 / Sprechstimme \u7684\u6807\u51C6\u5199\u6CD5\uFF1B\u987A\u5E8F\uFF1Astem \u4E4B\u540E\u3001staff \u4E4B\u524D\uFF09\n      x += typeXml + headXml + staffXml;\n      const chordXml: string[] = [];\n      if (t.kind === \"note\") {\n        const tieIn = firstPiece ? !!t.tie : true, tieOn = last ? tieOut : true;\n        // \u6F14\u594F\u6CD5\uFF1A\u8DF3\u97F3 / \u91CD\u97F3 / \u4FDD\u6301\u6302\u5728\u7B2C\u4E00\u6BB5\uFF0C\u547C\u5438\u6302\u5728\u6700\u540E\u4E00\u6BB5\uFF08\u97F3\u88AB\u5C0F\u8282\u7EBF\u62C6\u5F00\u65F6\uFF09\n        const arts = (t.art ?? []).filter((a) => !!ART_XML[a] && (a === \"breath\" ? last : firstPiece)), noteDyn = arts.filter((a) => NOTE_DYN.includes(a)), artic = arts.filter((a) => !NOTE_DYN.includes(a));   // \u6CA1\u6709 MusicXML \u5199\u6CD5\u7684\uFF08\u5E7D\u7075\u97F3 / \u6C14\u58F0\u8D70\u7B26\u5934\uFF0C\u97F3\u5185\u8D77\u4F0F\u5B58 score.json\uFF09\u4E0D\u8FDB <articulations>, noteDyn = arts.filter((a) => NOTE_DYN.includes(a)), artic = arts.filter((a) => !NOTE_DYN.includes(a));\n        // \u51FA\u58F0\u7684\u6362\u6C14\uFF08NoteTok.inhale\uFF09= \u547C\u5438\u8BB0\u53F7\u65C1\u8FB9\u4E00\u4E2A <other-articulation>\uFF08\u522B\u7684\u8F6F\u4EF6\u7167\u6837\u8BA4\u5F97\u662F\u6362\u6C14\uFF0C\u53EA\u662F\u4E0D\u77E5\u9053\u8981\u51FA\u58F0\uFF09\n        const inhaleXml = (a: Art) => (a === \"breath\" && t.inhale ? `<other-articulation>${t.inhale === \"big\" ? \"inhale-big\" : \"inhale\"}</other-articulation>` : \"\");\n        const artXml = (artic.length ? `<articulations>${artic.map((a) => `<${ART_XML[a]}/>` + inhaleXml(a)).join(\"\")}</articulations>` : \"\") + (noteDyn.length ? `<dynamics>${noteDyn.map((a) => `<${ART_XML[a]}/>`).join(\"\")}</dynamics>` : \"\");\n        const slurXml = firstPiece ? slurs(i, t) : \"\";\n        const arpXml = firstPiece && (t.art ?? []).includes(\"arpeggio\") ? \"<arpeggiate/>\" : \"\";   // \u7436\u97F3\uFF08v0.9.45\uFF09\uFF1A\u548C\u5F26\u91CC\u6BCF\u4E2A\u97F3\u90FD\u6807\uFF08MusicXML \u7684\u89C4\u77E9\uFF09\n        if (tieIn || tieOn || artXml || slurXml || arpXml) x += `<notations>${tieIn ? `<tied type=\"stop\"/>` : \"\"}${tieOn ? `<tied type=\"start\"/>` : \"\"}${slurXml}${artXml}${arpXml}</notations>`;\n        // \u53E0\u97F3\uFF1A\u8DDF\u5728\u540E\u9762\u7684 <chord/> \u97F3\uFF08\u540C\u65F6\u503C\u3001\u540C\u8FDE\u97F3\u7EBF\uFF1B\u6B4C\u8BCD\u3001\u6F14\u594F\u6CD5\u53EA\u5728\u7B2C\u4E00\u4E2A\u4E0A\uFF09\n        for (const [ci, cp] of (t.chord ?? []).entries()) {\n          chordXml.push(`<note id=\"${id}c${ci + 1}\"><chord/>` + pitchXml(cp) + `<duration>${Math.round(piece)}</duration>` + (tieIn ? `<tie type=\"stop\"/>` : \"\") + (tieOn ? `<tie type=\"start\"/>` : \"\") + `<voice>1</voice>` +\n            typeXml + headXml + staffXml + (tieIn || tieOn || arpXml ? `<notations>${tieIn ? `<tied type=\"stop\"/>` : \"\"}${tieOn ? `<tied type=\"start\"/>` : \"\"}${arpXml}</notations>` : \"\") + `</note>`);\n        }\n        if (!lyricDone && t.lyric) {\n          if (t.lyric === MELISMA_MARK) x += `<lyric number=\"1\"><extend/></lyric>`;\n          else {   // \u4E00\u4E2A\u97F3\u4E0A\u51E0\u4E2A\u97F3\u8282\uFF08\u300C+\u300D\u8FDE\u7740\u7684\uFF09= <elision/> \u9694\u5F00\u7684\u51E0\u6BB5 text\uFF08MusicXML \u7684\u6807\u51C6\u5199\u6CD5\uFF09\n            const lang = esc(langs[i] ?? \"ja\"), parts = t.lyric.split(ELISION);\n            x += `<lyric number=\"1\"><syllabic>${syllabic(t)}</syllabic><text xml:lang=\"${lang}\">${esc(parts[0])}</text>` +\n              parts.slice(1).map((p) => `<elision/><syllabic>single</syllabic><text xml:lang=\"${lang}\">${esc(p)}</text>`).join(\"\") + `</lyric>`;\n          }\n        }\n        lyricDone = true;\n      }\n      x += `</note>`;\n      cur.push(x);\n      for (const cx of chordXml) cur.push(cx);\n      ticks += piece; left -= piece; k++;\n    }\n    if (t.kind === \"note\" && !t.pitch) unwritten.push(`n${t.id}`);\n  }\n  if (wedgeOpen) cur.push(wedgeXml(\"stop\"));   // \u6E10\u5F3A\u6E10\u5F31\u4E00\u76F4\u5230\u8C31\u5C3E\n  if (cur.length || !measures.length) close(false);\n  return { measures, unwritten, lastLen: len };\n}\n\n/** \u51E0\u6761\u58F0\u90E8 \u2192 \u6574\u4EFD MusicXML\u3002manualBars = \u58F0\u90E8 id \u2192 \u4EBA\u63D2\u7684\u5C0F\u8282\u7EBF\uFF08\u5C0F\u8282\u5E8F\u53F7\uFF0C1 \u8D77\uFF09\uFF1Bunwritten = \u8FD8\u6CA1\u5199\u97F3\u9AD8\u7684\u97F3\uFF08note id\uFF0C\u5404\u58F0\u90E8\u4E00\u8D77\uFF09\u3002 */\nexport function writeMusicXml(doc: ScoreXml, meta: WriteMeta): Written {\n  const paper = doc.paper ?? paperOf(DEFAULT_PAPER);\n  autoSeq = 0;   // \u81EA\u52A8\u516B\u5EA6\u7EBF\u7684 id \u5728\u8FD9\u4E00\u4EFD\u6587\u4EF6\u91CC\u552F\u4E00\n  const built = doc.parts.map((p, k) => ({ p, ...partMeasures(p.tokens, p.breaks, k === 0, p.info.clef ?? \"G\", p.info.staves === 2 ? 2 : 1) }));\n  const nMeas = Math.max(0, ...built.map((b) => b.measures.length));\n  const manualBars: Record<string, number[]> = {}, unwritten: string[] = [];\n  const bodies = built.map((b) => {\n    const mb: number[] = [];\n    const ms = b.measures.map((m, n) => { if (m.manual) mb.push(n + 1); return `<measure number=\"${n + 1}\">${m.body.join(\"\")}</measure>`; });\n    // \u522B\u7684\u58F0\u90E8\u5C0F\u8282\u66F4\u591A\uFF1A\u8FD9\u8FB9\u8865\u6574\u5C0F\u8282\u4F11\u6B62\uFF08\u522B\u7684\u8F6F\u4EF6\u8981\u5404\u58F0\u90E8\u5C0F\u8282\u6570\u4E00\u6837\uFF1B\u81EA\u5BB6\u8BFB\u65F6\u6309 token \u590D\u539F\u3001\u4E0D\u770B\u8FD9\u4E9B\uFF09\n    if (doc.padMeasures) for (let n = b.measures.length; n < nMeas; n++) ms.push(`<measure number=\"${n + 1}\"><note><rest measure=\"yes\"/><duration>${Math.round(b.lastLen)}</duration><voice>1</voice></note></measure>`);\n    manualBars[b.p.info.id] = mb; unwritten.push(...b.unwritten);\n    return `<part id=\"${b.p.info.id}\">\\n${ms.join(\"\\n\")}\\n</part>`;\n  });\n  const partList = doc.parts.map(({ info: P }) =>\n    `<score-part id=\"${P.id}\"><part-name>${esc(P.name)}</part-name><score-instrument id=\"${P.id}-I1\"><instrument-name>${esc(P.instrumentName)}</instrument-name><instrument-sound>${esc(P.sound)}</instrument-sound>${P.variant ? `<virtual-instrument><virtual-library>${esc(P.variant.library)}</virtual-library><virtual-name>${esc(P.variant.name)}</virtual-name></virtual-instrument>` : \"\"}</score-instrument><midi-instrument id=\"${P.id}-I1\"><midi-program>${P.program}</midi-program>${P.volume !== undefined ? `<volume>${P.volume}</volume>` : \"\"}${P.pan !== undefined ? `<pan>${P.pan}</pan>` : \"\"}</midi-instrument></score-part>`).join(\"\");\n  const xml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE score-partwise PUBLIC \"-//Recordare//DTD MusicXML 4.0 Partwise//EN\" \"http://www.musicxml.org/dtds/partwise.dtd\">\n<score-partwise version=\"4.0\">\n${doc.title ? `<work><work-title>${esc(doc.title)}</work-title></work>\\n` : \"\"}${doc.movementTitle ? `<movement-title>${esc(doc.movementTitle)}</movement-title>\\n` : \"\"}<identification>${doc.rights ? `<rights>${esc(doc.rights)}</rights>` : \"\"}<encoding><software>${esc(meta.software)}</software><encoding-date>${esc(meta.date)}</encoding-date></encoding></identification>\n${defaultsXml(paper)}\n${doc.credits ? creditXml(doc.credits, paper) + \"\\n\" : \"\"}<part-list>${partList}</part-list>\n${bodies.join(\"\\n\")}\n</score-partwise>\n`;\n  return { xml, manualBars, unwritten };\n}\n\nexport interface ReadPart { id: string; name: string; instrumentName?: string; sound?: string; program?: number; variant?: string; volume?: number; pan?: number; clef?: ClefName; staves?: 2 }   // clef = \u7B2C\u4E00\u4E2A <clef>\uFF08F = \u4F4E\u97F3\uFF1B\u522B\u7684\u8C31\u53F7\u5148\u6309\u9AD8\u97F3\uFF09\uFF1Bstaves = <staves> 2 = \u5927\u8C31\u8868\nexport interface ReadScore { title: string; movementTitle: string; paper?: Paper; credits?: string; rights?: string; parts: { info: ReadPart; tokens: Token[] }[]; dropped: Record<string, number> }\nexport interface ReadHints { manualBars?: Record<string, number[]>; unwritten?: string[] }   // \u81EA\u5BB6\u6587\u4EF6\u7684 .moonsinger/score.json\uFF08\u8FD9\u5F20\u7EB8\u7684\uFF09\uFF1B\u522B\u5BB6\u6587\u4EF6 = \u6CA1\u6709\n\n/** MusicXML \u2192 \u6BCF\u4E2A\u58F0\u90E8\u4E00\u4E32 token\uFF08id \u5728\u8FD9\u4EFD\u6587\u4EF6\u91CC\u552F\u4E00\uFF1B\u8C03\u7528\u65B9\u62FC\u8FDB\u6B4C\u65F6\u518D\u9519\u5F00\uFF09\u3002hints \u6CA1\u7ED9\uFF08\u522B\u7684\u8F6F\u4EF6\u5B58\u7684\uFF09= \u6BCF\u6761\u5C0F\u8282\u7EBF\u90FD\u5F53\u4EBA\u63D2\u7684\uFF08\u7F16\u8F91\u5668\u53EA\u753B\u4EBA\u63D2\u7684\u5C0F\u8282\u7EBF\uFF09\u3002\n *  \u522B\u7684\u58F0\u90E8\u6CA1\u5199\u901F\u5EA6\uFF08\u81EA\u5BB6\u6587\u4EF6\u53EA\u5199\u7B2C\u4E00\u4E2A\u58F0\u90E8\u7684\uFF09= \u8C31\u5934\u6284\u7B2C\u4E00\u4E2A\u58F0\u90E8\u7684\u3002 */\nexport function readMusicXml(xml: string, hints?: ReadHints): ReadScore {\n  const root = parseXml(xml);\n  if (root.name === \"score-timewise\") throw new Error(\"\u8FD9\u4EFD MusicXML \u662F timewise \u6392\u6CD5\uFF0C\u8FD9\u4E00\u7248\u53EA\u8BFB partwise\");\n  if (root.name !== \"score-partwise\") throw new Error(`\u8FD9\u4E0D\u662F MusicXML \u4E50\u8C31\uFF08\u6839\u5143\u7D20\u662F <${root.name}>\uFF09`);\n  const dropped: Record<string, number> = {};\n  const drop = (what: string) => { dropped[what] = (dropped[what] ?? 0) + 1; };\n  const infos: ReadPart[] = kids(kid(root, \"part-list\"), \"score-part\").map((sp) => {\n    const si = kid(sp, \"score-instrument\"), mi = kid(sp, \"midi-instrument\"), vi = kid(si, \"virtual-instrument\");\n    const num = (s?: string) => (s === undefined || s === \"\" ? undefined : Number(s));\n    return { id: sp.attrs.id, name: childText(sp, \"part-name\") ?? \"\", instrumentName: childText(si, \"instrument-name\"), sound: childText(si, \"instrument-sound\"), program: num(childText(mi, \"midi-program\")),\n      variant: childText(vi, \"virtual-name\"), volume: num(childText(mi, \"volume\")), pan: num(childText(mi, \"pan\")) };\n  });\n  const partEls = kids(root, \"part\");\n  if (!partEls.length) throw new Error(\"\u8FD9\u4EFD MusicXML \u91CC\u6CA1\u6709\u58F0\u90E8\");\n  const title = childText(kid(root, \"work\"), \"work-title\") ?? \"\", movementTitle = childText(root, \"movement-title\") ?? \"\";\n  const unwritten = new Set(hints?.unwritten ?? []);\n  const usedIds = new Set<number>();\n  const takeId = (s: string | undefined): number | null => { const m = s ? /^[nr](\\d+)$/.exec(s) : null; if (!m) return null; const n = +m[1]; if (usedIds.has(n)) return null; usedIds.add(n); return n; };\n  /** <notations><articulations> \u2192 \u97F3\u4E0A\u7684\u6F14\u594F\u6CD5\uFF08\u8FD9\u4E00\u7248\u8BA4\u8DF3\u97F3 / \u91CD\u97F3 / \u4FDD\u6301 / \u547C\u5438\uFF1B\u522B\u7684\u6570\u51FA\u6765\u62A5\uFF09\u3002 */\n  let pendingAttack: Art | null = null;\n  let pendingRamp = false;   // \u8BFB\u5230\u6211\u4EEC\u5199\u7684\u6E10\u5230\u865A\u7EBF wedge\uFF08id ramp-\u2026\uFF09= \u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u662F\u6E10\u5230\n  const addArts = (tok: NoteTok, note: El) => {\n    const set = new Set(tok.art ?? []);\n    for (const nn of kids(note, \"notations\")) for (const ar of kids(nn, \"articulations\")) for (const e of kids(ar)) {\n      if (e.name === \"other-articulation\") { const v = text(e).trim(); if (v === \"inhale\" || v === \"inhale-big\") { tok.inhale = v === \"inhale-big\" ? \"big\" : \"soft\"; continue; } }   // \u6211\u4EEC\u5199\u7684\u51FA\u58F0\u7684\u6362\u6C14\n      const a = XML_ART[e.name]; if (a) set.add(a); else drop(\"\u6F14\u594F\u6CD5\u8BB0\u53F7\uFF08\u8FD9\u4E00\u7248\u4E0D\u8BA4\u7684\uFF09\");\n    }\n    for (const nn of kids(note, \"notations\")) for (const dy of kids(nn, \"dynamics\")) for (const e of kids(dy)) { const a = XML_NOTE_DYN[e.name]; if (a) set.add(a); else drop(\"\u529B\u5EA6\u8BB0\u53F7\uFF08\u8FD9\u4E00\u7248\u4E0D\u8BA4\u7684\uFF0C\u5982 sfz\uFF09\"); }\n    if (pendingAttack) { set.add(pendingAttack); pendingAttack = null; }   // \u97F3\u524D\u9762\u90A3\u4E2A\u65B9\u5411\u91CC\u7684 sfz / fp\uFF1A\u6302\u5230\u8FD9\u4E2A\u97F3\u4E0A\n    if (kids(note, \"notehead\").some((h) => h.attrs.parentheses === \"yes\")) set.add(\"ghost\");   // \u62EC\u53F7\u7B26\u5934 = \u5E7D\u7075\u97F3\n    if (kids(note, \"notations\").some((nn) => kids(nn, \"arpeggiate\").length > 0)) set.add(\"arpeggio\");   // \u7436\u97F3\uFF08\u548C\u5F26\u91CC\u54EA\u4E2A\u97F3\u6807\u4E86\u90FD\u7B97\u8FD9\u4E2A\u548C\u5F26\u7684\uFF09\n    if (kids(note, \"notehead\").some((h) => text(h).trim() === \"x\")) set.add(\"whisper\");   // \u00D7 \u7B26\u5934 = \u6C14\u58F0\uFF08\u5FF5\u767D / \u8BF4\u5531\uFF1B\u522B\u5BB6\u7684\u9F13\u8C31 \u00D7 \u8BFB\u8FDB\u6765\u4E5F\u662F\u5B83\u2014\u2014\u4E50\u5668\u4E0D\u8BA4\uFF0C\u753B\u7070\uFF0C\u4E0D\u5F71\u54CD\u51FA\u58F0\uFF09\n    const att = ATTACKS.filter((x) => set.has(x)); if (att.length > 1) for (const x of att.slice(0, -1)) set.delete(x);   // \u97F3\u5934\u90A3\u4E00\u7EC4\u53EA\u7559\u4E00\u4E2A\uFF08\u540E\u6765\u7684\uFF09\n    const art = ARTS.filter((a) => set.has(a));\n    if (art.length) tok.art = art;\n    if (tok.inhale && !set.has(\"breath\")) delete tok.inhale;   // \u51FA\u58F0\u7684\u6362\u6C14\u53EA\u8DDF\u7740\u547C\u5438\n  };\n  /** <notations><slur> \u2192 \u8FD9\u4E00\u4E32\u97F3\u300C\u8FDE\u5230\u4E0B\u4E00\u4E2A\u300D\uFF08start \u7684\u90A3\u4E2A\u8D77\u3001stop \u7684\u90A3\u4E2A\u524D\u4E00\u4E2A\u6B62\uFF1B\u6309 number \u5206\u5F00\u6570\uFF0C\u6709\u4E00\u6761\u5F00\u7740\u5C31\u7B97\u8FDE\u7740\uFF09\u3002 */\n  const slurEvents = (note: El, open: Set<string>) => {\n    const sl = kids(note, \"notations\").flatMap((nn) => kids(nn, \"slur\"));\n    for (const e of sl) if (e.attrs.type === \"stop\") open.delete(e.attrs.number ?? \"1\");\n    for (const e of sl) if (e.attrs.type === \"start\") open.add(e.attrs.number ?? \"1\");\n  };\n  const tempoOf = (el: El): number | null => { const s = el.name === \"sound\" ? el : kid(el, \"sound\"); const v = s?.attrs.tempo; return v ? Math.round(Number(v)) : null; };\n  const parts = partEls.map((pe, pi) => {\n    const pid = pe.attrs.id ?? `P${pi + 1}`, info: ReadPart = infos.find((x) => x.id === pid) ?? { id: pid, name: \"\" };\n    const manual = hints?.manualBars ? new Set(hints.manualBars[pid] ?? []) : null;\n    const H = { fifths: DEFAULT_KEY, beats: DEFAULT_TIME.beats, beatType: DEFAULT_TIME.beatType, bpm: DEFAULT_BPM, gotKey: false, gotTime: false, gotTempo: false };\n    // \u8C31\u5934 = \u7B2C\u4E00\u4E2A\u97F3\u4E4B\u524D\u3001\u6BCF\u79CD\u8BB0\u53F7\u7B2C\u4E00\u6B21\u51FA\u73B0\u7684\u90A3\u4E2A\uFF1B\u540C\u4E00\u79CD\u518D\u51FA\u73B0\uFF08\u8C31\u5934\u540E\u9762\u7D27\u8DDF\u7740\u63D2\u7684\uFF09= \u8BB0\u53F7 token\n    const body: Token[] = [], langRead = new Map<Token, string>();\n    let headPhase = true, divisions = TPQ, voice: string | null = null;\n    const openSlurs = new Set<string>();\n    const mark = (t: Token) => { body.push(t); };\n    const measures = kids(pe, \"measure\");\n    measures.forEach((m, mi) => {\n      let rightRepeat: { times: number } | null = null;   // \u8FD9\u5C0F\u8282\u53F3\u8FB9\u7684 :|\uFF08\u8BFB\u5B8C\u8FD9\u5C0F\u8282\u8865\u5C0F\u8282\u7EBF\u65F6\u7528\uFF09\n      let rightStyle: \"double\" | \"final\" | null = null;   // \u8FD9\u5C0F\u8282\u53F3\u8FB9\u7684\u6BB5\u843D\u7EBF \u2016 / \u7EC8\u6B62\u7EBF\uFF08v0.9.32\uFF09\n      for (const c of kids(m)) {\n        if (c.name === \"barline\") {   // \u8C31\u5185\u53CD\u590D\uFF1A|: \u6302\u5728\u524D\u9762\u90A3\u6761\u5C0F\u8282\u7EBF\u4E0A\uFF08\u7EB8\u5934 = \u8865\u4E00\u6761\uFF09\uFF1B\u623F\u5B50 = \u8FD9\u5C0F\u8282\u5F00\u5934\u4E00\u4E2A\u8BB0\u53F7\uFF1B:| \u7B49\u8FD9\u5C0F\u8282\u8BFB\u5B8C\n          const loc = c.attrs.location ?? \"right\", rp = kid(c, \"repeat\"), en = kid(c, \"ending\");\n          if (loc === \"left\" && rp?.attrs.direction === \"forward\") {\n            const last = body[body.length - 1];\n            if (last && last.kind === \"bar\") last.repeat = last.repeat === \"end\" || last.repeat === \"both\" ? \"both\" : \"start\";\n            else body.push({ kind: \"bar\", id: 0, repeat: \"start\" });\n          }\n          if (loc === \"left\" && en && en.attrs.type === \"start\") {\n            const nums = (en.attrs.number ?? \"1\").split(/[,\\s]+/).map(Number).filter((x) => Number.isInteger(x) && x > 0);\n            body.push({ kind: \"nav\", id: 0, what: \"ending\", nums: nums.length ? nums : [1] });\n          }\n          if (loc !== \"left\" && rp?.attrs.direction === \"backward\") rightRepeat = { times: Math.max(2, Number(rp.attrs.times ?? \"2\") || 2) };\n          else if (loc !== \"left\") { const bs = childText(c, \"bar-style\"); if (bs === \"light-light\") rightStyle = \"double\"; else if (bs === \"light-heavy\") rightStyle = \"final\"; }\n          continue;\n        }\n        if (c.name === \"attributes\") {\n          const d = childText(c, \"divisions\"); if (d) divisions = Number(d);\n          // \u8C31\u53F7\uFF08v0.9.28\uFF09\uFF1A\u8FD9\u4EFD\u91CC\u7B2C\u4E00\u4E2A <clef> = \u5F00\u5934\u7684\u8C31\u53F7\uFF08info.clef\uFF09\uFF1B\u540E\u9762\u7684 = \u4E2D\u95F4\u6362\u8C31\u53F7\uFF08\u8BB0\u53F7\uFF09\uFF1B\u516B\u5EA6\u8C31\u53F7\u8BA4 <clef-octave-change>\uFF1B\u5927\u8C31\u8868\u7684\u4E0D\u7BA1\n          const cl = kid(c, \"clef\");\n          if (cl) { const cn = clefOfXml(childText(cl, \"sign\"), childText(cl, \"clef-octave-change\")); if (info.clef === undefined) info.clef = cn ?? \"G\"; else if (cn && !cl.attrs.number && info.staves !== 2) mark({ kind: \"clef\", id: 0, clef: cn }); }\n          if (Number(childText(c, \"staves\") ?? \"1\") >= 2) info.staves = 2;\n          const key = kid(c, \"key\"), time = kid(c, \"time\");\n          if (key && childText(key, \"fifths\") !== undefined) { const f = Number(childText(key, \"fifths\")); if (headPhase && !H.gotKey) { H.fifths = f; H.gotKey = true; } else mark({ kind: \"key\", id: 0, fifths: f }); }\n          if (time && childText(time, \"beats\")) { const b = Number(childText(time, \"beats\")), bt = Number(childText(time, \"beat-type\")); if (headPhase && !H.gotTime) { H.beats = b; H.beatType = bt; H.gotTime = true; } else mark({ kind: \"time\", id: 0, beats: b, beatType: bt }); }\n        } else if (c.name === \"direction\" || c.name === \"sound\") {\n          const bpm = tempoOf(c);\n          if (bpm) { if (headPhase && !H.gotTempo) { H.bpm = bpm; H.gotTempo = true; } else mark({ kind: \"tempo\", id: 0, bpm }); }\n          // \u516B\u5EA6\u7EBF\uFF08v0.9.28\uFF09\uFF1Adown = 8va\uFF0815 = 15ma\uFF09\uFF0Cup = 8vb\uFF0Cstop = \u7ED3\u675F\uFF1B\u7D27\u8DDF\u7740\u7ED3\u675F\u7684\u5F00\u5934 = \u6362\u4E86\u4E00\u79CD\uFF08\u5E76\u6210\u4E00\u4E2A\u8BB0\u53F7\uFF09\n          for (const dt of c.name === \"direction\" ? kids(c, \"direction-type\") : []) for (const os of kids(dt, \"octave-shift\")) {\n            const ty = os.attrs.type, size = Number(os.attrs.size ?? \"8\"), shift = (ty === \"down\" ? (size >= 15 ? 2 : 1) : ty === \"up\" ? -1 : 0) as -1 | 0 | 1 | 2;\n            if (ty !== \"down\" && ty !== \"up\" && ty !== \"stop\") continue;\n            if ((os.attrs.id ?? \"\").startsWith(\"ms-auto\")) continue;   // \u81EA\u52A8\u753B\u7684\u516B\u5EA6\u7EBF\uFF08v0.9.37\uFF09\uFF1A\u4E0D\u53D8\u6210\u624B\u5199\u8BB0\u53F7\uFF0C\u8BFB\u8FDB\u6765\u7167\u6837\u81EA\u52A8\u91CD\u7B97\n            const lastTok = body[body.length - 1];\n            if (shift && lastTok?.kind === \"ottava\" && lastTok.shift === 0) lastTok.shift = shift; else mark({ kind: \"ottava\", id: 0, shift });\n          }\n          for (const dt of c.name === \"direction\" ? kids(c, \"direction-type\") : []) for (const dy of kids(dt, \"dynamics\")) for (const e of kids(dy)) {\n            const v = XML_DYN(e.name), na = XML_NOTE_DYN[e.name];\n            if (v) { mark({ kind: \"dyn\", id: 0, value: v, ...(pendingRamp ? { ramp: true as const } : {}) }); pendingRamp = false; } else if (na) pendingAttack = na; else drop(\"\u529B\u5EA6\u8BB0\u53F7\uFF08\u8FD9\u4E00\u7248\u4E0D\u8BA4\u7684\uFF0C\u5982 sfz\uFF09\");   // sfz / fp \u5199\u5728\u97F3\u524D\u9762\u7684\u65B9\u5411\u91CC = \u6302\u5230\u4E0B\u4E00\u4E2A\u97F3\u4E0A\n          }\n          for (const dt of c.name === \"direction\" ? kids(c, \"direction-type\") : []) for (const w of kids(dt, \"wedge\")) {   // \u6E10\u5F3A\u6E10\u5F31\uFF1Astart = \u8FD9\u513F\u4E00\u4E2A\u8BB0\u53F7\uFF1Bstop \u4E0D\u5B58\uFF08\u7EC8\u70B9 = \u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\uFF09\n            const ty = w.attrs.type;\n            if ((ty === \"crescendo\" || ty === \"diminuendo\") && (w.attrs.id ?? \"\").startsWith(RAMP_ID)) pendingRamp = true;   // \u6E10\u5230\uFF1A\u4E0D\u53D8\u6210\u624B\u5199\u7684\u6E10\u5F3A\u6E10\u5F31\n            else if (ty === \"crescendo\" || ty === \"diminuendo\") mark({ kind: \"hairpin\", id: 0, dir: ty === \"crescendo\" ? \"cresc\" : \"dim\" });\n          }\n          for (const dt of c.name === \"direction\" ? kids(c, \"direction-type\") : []) for (const w of kids(dt, \"words\")) {   // \u98CE\u683C\u8BB0\u53F7\uFF1A\u53EA\u8BA4\u6211\u4EEC\u81EA\u5DF1\u5199\u7684\uFF08id \u6253\u5934 groove.\uFF09\n            const g = /^groove\\.([a-z][a-z0-9-]*)\\.(\\d+)\\./.exec(w.attrs.id ?? \"\");\n            if (g) { const a = Number(g[2]) / 100; mark({ kind: \"groove\", id: 0, style: g[1], ...(a !== 1 ? { amount: a } : {}), ...(/\\.2-3$/.test(w.attrs.id ?? \"\") ? { shift: true as const } : {}) }); }   // .2-3 = \u9519\u5F00\u4E00\u5C0F\u8282\uFF082026-10-09\uFF09\n          }\n          // \u8C31\u5185\u53CD\u590D / \u8DF3\u8F6C\uFF1A\u81EA\u5BB6\u5199\u7684\u8BA4 id\uFF08nav.<\u79CD\u7C7B>.\uFF09\uFF1B\u522B\u5BB6\u8C31\u8BA4 <segno/> <coda/> \u548C <sound> \u7684 dacapo / dalsegno / fine / tocoda\uFF08\u5B57\u91CC\u6709 Fine / Coda = al Fine / al Coda\uFF09\n          {\n            const dts = c.name === \"direction\" ? kids(c, \"direction-type\") : [], words = dts.flatMap((dt) => kids(dt, \"words\"));\n            const own = words.map((w) => /^nav\\.([a-zA-Z]+)\\./.exec(w.attrs.id ?? \"\")?.[1]).find((x): x is string => !!x && x in NAV_LABEL);\n            const snd = c.name === \"sound\" ? c : kid(c, \"sound\"), wt = words.map((w) => text(w)).join(\" \");\n            let what: Exclude<NavWhat, \"ending\"> | null = own ? (own as Exclude<NavWhat, \"ending\">) : null;\n            if (!what && dts.some((dt) => kid(dt, \"segno\"))) what = \"segno\";\n            else if (!what && dts.some((dt) => kid(dt, \"coda\"))) what = \"coda\";\n            else if (!what && snd) {\n              const al = /fine/i.test(wt) ? \"Fine\" : /coda/i.test(wt) ? \"Coda\" : \"\";\n              if (snd.attrs.dacapo === \"yes\") what = al === \"Fine\" ? \"dcFine\" : al === \"Coda\" ? \"dcCoda\" : \"dc\";\n              else if (snd.attrs.dalsegno) what = al === \"Fine\" ? \"dsFine\" : al === \"Coda\" ? \"dsCoda\" : \"ds\";\n              else if (snd.attrs.tocoda) what = \"toCoda\";\n              else if (snd.attrs.fine) what = \"fine\";\n            }\n            if (what) mark({ kind: \"nav\", id: 0, what });\n          }\n        } else if (c.name === \"note\") {\n          if (kid(c, \"grace\")) { drop(\"\u88C5\u9970\u97F3\"); continue; }\n          if (kid(c, \"cue\")) { drop(\"\u63D0\u793A\u97F3\u7B26\"); continue; }\n          const v = childText(c, \"voice\") ?? \"1\"; if (voice === null) voice = v;\n          if (v !== voice) { drop(\"\u540C\u4E00\u58F0\u90E8\u91CC\u7684\u7B2C\u4E8C\u6761\u65CB\u5F8B\"); continue; }\n          if (kid(c, \"chord\")) {   // \u53E0\u97F3\uFF1A\u5E76\u8FDB\u524D\u4E00\u4E2A\u97F3\uFF08\u6700\u9AD8\u7684\u5F53\u65CB\u5F8B\u7EBF\uFF09\n            const prevN = body[body.length - 1], pch = kid(c, \"pitch\");\n            if (prevN && prevN.kind === \"note\" && prevN.pitch && pch) {\n              const pp: Pitch = { step: (childText(pch, \"step\") ?? \"C\") as Pitch[\"step\"], alter: Number(childText(pch, \"alter\") ?? \"0\"), octave: Number(childText(pch, \"octave\") ?? \"4\") };\n              const ps = allPitches(prevN);\n              if (!ps.some((q) => midiOf(q) === midiOf(pp))) { const w = withPitches(prevN, [...ps, pp]); prevN.pitch = w.pitch; if (w.chord) prevN.chord = w.chord; else delete prevN.chord; }\n              addArts(prevN, c);   // \u522B\u5BB6\u8C31\u5E38\u7ED9\u548C\u5F26\u91CC\u6BCF\u4E2A\u97F3\u90FD\u6807\u6F14\u594F\u6CD5\uFF1A\u5E76\u5230\u8FD9\u4E2A\u97F3\u4E0A\n              slurEvents(c, openSlurs); if (openSlurs.size) prevN.slur = true; else delete prevN.slur;\n            } else drop(\"\u53E0\u97F3\uFF08\u524D\u9762\u6CA1\u6709\u80FD\u53E0\u7684\u97F3\uFF09\");\n            continue;\n          }\n          headPhase = false;\n          const dur = Math.round((Number(childText(c, \"duration\") ?? \"0\") * TPQ) / divisions);\n          if (dur <= 0) continue;\n          const idAttr = c.attrs.id, cont = idAttr ? /^([nr])(\\d+)-\\d+$/.exec(idAttr) : null;\n          const prev = body[body.length - 1];\n          if (cont && prev && (prev.kind === \"note\" || prev.kind === \"rest\") && prev.id === +cont[2] && (cont[1] === \"n\") === (prev.kind === \"note\")) { prev.dur += dur; if (prev.kind === \"note\") addArts(prev, c); continue; }   // \u81EA\u5BB6\u62C6\u5F00\u7684\u90A3\u51E0\u6BB5\u5E76\u56DE\u53BB\uFF08\u547C\u5438\u5728\u6700\u540E\u4E00\u6BB5\uFF09\n          const isRest = !!kid(c, \"rest\");\n          const stf = childText(c, \"staff\"), staffOf = stf === \"2\" ? { staff: 2 as const } : stf === \"1\" ? { staff: 1 as const } : {};\n          if (isRest) { mark({ kind: \"rest\", id: takeId(idAttr) ?? 0, dur, ...staffOf }); continue; }\n          const p = kid(c, \"pitch\");\n          if (!p) { drop(\"\u6CA1\u6709\u97F3\u9AD8\u7684\u97F3\uFF08\u6253\u51FB\u4E50\uFF09\"); continue; }\n          const pitch: Pitch = { step: (childText(p, \"step\") ?? \"C\") as Pitch[\"step\"], alter: Number(childText(p, \"alter\") ?? \"0\"), octave: Number(childText(p, \"octave\") ?? \"4\") };\n          const tok: NoteTok = { kind: \"note\", id: takeId(idAttr) ?? 0, pitch: unwritten.has(idAttr ?? \"\") ? null : pitch, dur, lyric: null, ...staffOf };\n          if (kids(c, \"tie\").some((t) => t.attrs.type === \"stop\")) tok.tie = true;\n          addArts(tok, c);\n          slurEvents(c, openSlurs); if (openSlurs.size) tok.slur = true;\n          const lyrics = kids(c, \"lyric\"), ly = lyrics.find((l) => (l.attrs.number ?? \"1\") === \"1\") ?? lyrics[0];\n          if (lyrics.length > 1) drop(\"\u7B2C\u4E8C\u6BB5\u53CA\u4EE5\u540E\u7684\u6B4C\u8BCD\");\n          if (ly) {\n            const tx = kid(ly, \"text\");\n            if (tx) {\n              tok.lyric = kids(ly, \"text\").map((e) => text(e)).filter(Boolean).join(ELISION);   // <elision/> \u9694\u5F00\u7684\u51E0\u6BB5 = \u4E00\u4E2A\u97F3\u4E0A\u51E0\u4E2A\u97F3\u8282\n              const syl = childText(ly, \"syllabic\"); if (syl === \"begin\" || syl === \"middle\") tok.hyph = true;\n              if (tx.attrs[\"xml:lang\"]) langRead.set(tok, tx.attrs[\"xml:lang\"]);\n            } else if (kid(ly, \"extend\")) tok.lyric = MELISMA_MARK;\n          }\n          mark(tok);\n        } else if (c.name === \"backup\" || c.name === \"forward\") { /* \u7B2C\u4E8C\u6761\u65CB\u5F8B\u7684\u5B9A\u4F4D\uFF0C\u8DDF\u7740\u90A3\u4E9B\u97F3\u4E00\u8D77\u4E0D\u8BFB */ }\n        else if (c.name === \"harmony\") drop(\"\u548C\u5F26\u8BB0\u53F7\");\n      }\n      const n = Number(m.attrs.number ?? mi + 1);\n      if (rightRepeat || rightStyle || (manual ? manual.has(n) : mi < measures.length - 1)) body.push({ kind: \"bar\", id: 0, ...(rightRepeat ? { repeat: \"end\" as Repeat, ...(rightRepeat.times > 2 ? { times: rightRepeat.times } : {}) } : rightStyle ? { style: rightStyle } : {}) });\n    });\n    for (const [k, t] of body.entries()) if (t.kind === \"note\" && !t.chord?.length && t.art?.includes(\"arpeggio\")) body[k] = withArt(t, \"arpeggio\", false);   // \u5355\u97F3\u4E0A\u7684\u7436\u97F3\u4E0D\u8BA4\uFF08v0.9.46\uFF1A\u7436\u97F3\u53EA\u6302\u5728\u548C\u5F26\u4E0A\uFF09\n    const tokens: Token[] = [{ kind: \"key\", id: 0, fifths: H.fifths }, { kind: \"time\", id: 0, beats: H.beats, beatType: H.beatType }, { kind: \"tempo\", id: 0, bpm: H.bpm }, ...body];\n    keepOnlyOverrides(tokens, tokens.map((t) => langRead.get(t) ?? null));\n    // \u5927\u8C31\u8868\uFF1A\u6587\u4EF6\u91CC\u6BCF\u4E2A\u97F3\u90FD\u5199\u4E86 <staff>\uFF1B\u548C\u300C\u6309\u97F3\u9AD8\u81EA\u52A8\u300D\u4E00\u6837\u7684\u4E0D\u8BB0\uFF08\u53EA\u7559\u624B\u52A8\u6307\u5B9A\u7684\uFF09\uFF0C\u5355\u8C31\u8868\u7684\u4E00\u5F8B\u4E0D\u8BB0\n    if (info.staves === 2) { const auto = autoStaffs(tokens, 2); tokens.forEach((t, i) => { if ((t.kind === \"note\" || t.kind === \"rest\") && t.staff !== undefined) { const keep = t.kind === \"note\" ? t.staff !== auto[i] : t.staff !== staffOfTokens(tokens.map((x, j) => (j === i ? { ...x, staff: undefined } : x)) as Token[], 2)[i]; if (!keep) delete t.staff; } }); }\n    else for (const t of tokens) if ((t.kind === \"note\" || t.kind === \"rest\") && t.staff !== undefined) delete t.staff;\n    return { info, tokens, gotTempo: H.gotTempo };\n  });\n  // \u901F\u5EA6\uFF1A\u53EA\u6709\u7B2C\u4E00\u4E2A\u58F0\u90E8\u7684\u7B97\u6570\uFF1B\u522B\u7684\u58F0\u90E8\u6CA1\u5199\u7684\uFF0C\u8C31\u5934\u6284\u7B2C\u4E00\u4E2A\u7684\uFF08\u6570\u636E\u91CC\u6BCF\u6761 track \u90FD\u6709\u4E09\u4E2A\u8C31\u5934\u8BB0\u53F7\uFF09\n  const bpm0 = (parts[0].tokens[2] as { bpm: number }).bpm;\n  for (const p of parts.slice(1)) if (!p.gotTempo) (p.tokens[2] as { bpm: number }).bpm = bpm0;\n  let next = Math.max(0, ...usedIds) + 1;\n  for (const p of parts) for (const t of p.tokens) if (!t.id) t.id = next++;\n  const paper = readPaper(root);\n  const credits = readCredits(root, title);\n  const rights = kids(kid(root, \"identification\"), \"rights\").map((e) => text(e).trim()).filter(Boolean).join(\"\\n\");   // \u522B\u5BB6\u8C31\u53EF\u80FD\u6709\u51E0\u6761 <rights>\uFF1A\u62FC\u6210\u4E00\u6BB5\n  return { title, movementTitle, ...(paper ? { paper } : {}), ...(credits ? { credits } : {}), ...(rights ? { rights } : {}), parts: parts.map(({ info, tokens }) => ({ info, tokens })), dropped };\n}\n", "// contract.ts \u2014\u2014 `.mxl` \u91CC `.moonsinger/` \u5404\u4EFD JSON \u7684\u5F62\u72B6\uFF08\u4EBA\u8BFB\u7684 .h\uFF1Bv1 / v2 = \u4EE3\u7801\u73B0\u5728\u5199\u7684\uFF0C\u5B88\u536B\u6D4B\u8BD5\u7167\u5B83\u67E5\uFF1B\u6807\u300C\u63D0\u6848\u300D\u7684 = **\u63A8\u8350\u7A3F**\uFF0C\u4E0D\u662F\u5B9A\u7A3F\u2014\u2014\n//   user 2026-10-07\u300Cfable\u7684\u4EFB\u4F55\u6570\u636E\u7ED3\u6784\u5951\u7EA6\u90FD\u53EA\u662F\u63A8\u8350\u7A3F\uFF0C\u4E0D\u5BF9\u7ACB\u523B\u8BF4\u300D\uFF1A\u505A\u591A\u8F68\u7684 session \u5BF9\u7740 0.2.x \u7684\u624B\u611F\u7528\uFF0C\u4E0D\u5BF9\u5C31\u6539\u3001\u62A5 user\u3001\u77E5\u4F1A\u683C\u5F0F session\uFF09\u3002\n// created 2026-10-07 by Claude Fable 5.1\uFF08user\u300C\u6570\u636E\u7ED3\u6784\u4F60\u6765\u628A\u5173\u300D\u300C\u78B0\u5230\u683C\u5F0F\u95EE\u9898\u5C31\u95EE\u4F60\u300D\uFF09\uFF1B2026-10-07 \u6DF1\u591C\u8D77\u5951\u7EA6\u4E0E\u7F16\u8F91\u5668\u540C\u4E00\u4E2A session \u7BA1\u3002\n// \u6765\u9F99\u53BB\u8109\u4E0E user \u539F\u8BDD = ai-docs/20261007-data-contract-draft.md\uFF08\u00A73 \u76EE\u5F55\u8868\u3001\u00A77 \u672A\u5B9A\u3001\u00A78 \u8C01\u7684\u5B57\u8282\u3001\u00A710 \u97F3\u6E90\uFF09\u3002\n//\n// \u89C4\u77E9\uFF08CatsUp \u7ACB\u5BAA\uFF0C\u5BB6\u65CF\u6301\u4E45\u5316\u5411\u540E\u517C\u5BB9\uFF09\uFF1A\n//   \u00B7 \u6BCF\u4EFD\u6587\u4EF6\u81EA\u5E26 version\uFF1B\u6539\u5F62\u72B6 = FORMAT \u91CC +1 + src/format/migrate/ \u52A0\u4E00\u6761\u7EAF\u51FD\u6570\uFF08\u7B2C n \u7248 \u2192 \u7B2C n+1 \u7248\uFF09+ \u65E7\u7248\u51BB\u7ED3\u6837\u672C\u7559\u5728 test/fixtures/format/\u3002\n//   \u00B7 \u53EA\u52A0\u53EF\u9009\u5B57\u6BB5 = \u4E0D\u5347\u7248\u672C\uFF08WXHW ADR-0012 \u4FEE\u8BA2\u540C\u6B3E\u300C\u52A0\u6CD5\u300D\uFF09\uFF0C\u4F46\u5199\u51FA\u6765\u7684\u952E\u96C6\u5408\u53D8\u4E86 \u2192 \u5B88\u536B\u6D4B\u8BD5\u7EA2\uFF0C\u8DD1 node scripts/freeze-format-sample.mjs \u66F4\u65B0\u5F62\u72B6\u5FEB\u7167\u3001\u5BA1 diff\u3002\n//   \u00B7 \u8001\u6587\u4EF6\u6C38\u8FDC\u80FD\u5F00\uFF08\u8BFB\u65F6\u94FE\u5F0F\u5347\u7EA7\uFF09\uFF0C\u53EA\u62D2\u5F00\u6BD4 app \u65B0\u7684\uFF1B\u4E0D\u8BA4\u8BC6\u7684\u5B57\u6BB5 / \u6587\u4EF6\u539F\u6837\u5199\u56DE\u3002\n//   \u00B7 \u5B88\u536B = test/format-guard.test.ts\uFF1A\u5F62\u72B6\u5FEB\u7167\u3001\u8FC1\u79FB\u94FE\u5B8C\u6574\u3001\u51BB\u7ED3\u6837\u672C\u80FD\u5F00\u3002\n//   \u00B7 \u53C2\u8003\u7A97\u76EE\u5F55 `.moonsinger/references/`\uFF08v0.8\uFF0C2026-10-08 \u6DF1\u591C Opus 5.5\uFF1B\u5BF9\u9F50\u7A3F ai-docs/20261008-reference-window-alignment.md\uFF09\uFF1A\n//     \u6574\u4E2A\u76EE\u5F55\u5F52 @internal/reference-window\uFF08manifest.json \u81EA\u5E26\u7248\u672C\u53F7\u548C\u8FC1\u79FB + \u6BCF\u5F20\u5361\u4E00\u4E2A r<i>.<ext>\uFF09\uFF0C\u8FD9\u4E00\u5C42\u96F6\u77E5\u8BC6\u3001\u539F\u6837\u8FDB\u51FA\uFF08project.ts REFERENCES_DIR\uFF09\uFF1B\n//     \u4E0D\u5217\u8FDB\u6211\u4EEC\u7684 manifest\u3001\u4E0D\u5347 FORMAT\uFF1B\u7A97\u7684\u4F4D\u7F6E\u5728 score.json view.ref\uFF08ViewV1 \u53EF\u9009\u5B57\u6BB5\uFF09\u3002\u8001\u7248\u672C app \u8BFB\u5230 = \u5F53\u4E0D\u8BA4\u8BC6\u7684\u6587\u4EF6\u539F\u6837\u5199\u56DE\u3002\n\n/** \u8FD9\u4E00\u7248\u80FD\u8BFB\u5199\u7684\u5404\u4EFD\u6587\u4EF6\u7684\u7248\u672C\u53F7\uFF08\u6539\u683C\u5F0F = \u8FD9\u91CC +1 + migrate + \u51BB\u7ED3\u6837\u672C\uFF1B\u5B88\u536B\u6D4B\u8BD5\u76EF\u7740\uFF09\u3002\n *  lounge 2\uFF082026-10-07 \u6DF1\u591C\uFF0Cuser\u300C\u73B0\u5728\u5F00\u59CB\u597D\u597D\u505A\u4E50\u5668\u8FD9\u4E2A\u6570\u636E\u7ED3\u6784\uFF0C\u4E0D\u8981\u5077\u61D2\u300D\uFF09\uFF1A\u5019\u9009\u4ECE\u300C\u6708\u8BFB\u5F62\u72B6 + \u8D34\u5B57\u6BB5\u300D\u6539\u6210\u6309\u5F15\u64CE\u5206\u7684\u4E50\u5668\u3002\n *  manifest 2 / score 2\uFF082026-10-08\uFF0C0.5.0 \u591A\u58F0\u90E8\u591A\u7EB8\uFF0C\u5B58\u6CD5 B\uFF09\uFF1A\u7EB8\u7684\u987A\u5E8F\u8868 + \u58F0\u90E8\u5E76\u96C6\uFF1B\u6BCF\u5F20\u7EB8\u4E00\u4EFD MusicXML \u6B63\u672C\uFF0Cscore.musicxml \u53D8\u6D3E\u751F\u4EF6\u3002 */\nexport const FORMAT = { manifest: 2, score: 2, lounge: 2, studio: 2 } as const;\nexport type FormatFile = keyof typeof FORMAT;\n/** \u5BB6\u65CF\u683C\u5F0F\u7248\u672C\u7EAA\u5F8B\uFF082026-10-21\uFF0C\u5BB6\u65CF\u6839 ai-docs/20261021-format-version-discipline.md\uFF1Buser\u300C\u7248\u672C\u7EAA\u5F8B\u80FD\u505A\u6210 catsup moonsinger \u4E00\u6837\u4E0D\u540C component \u6709\u81EA\u5DF1\u7684\u62CD\u5B50\u2026\u8FD9\u4E2A\u53D8\u6210\u5168\u5BB6\u7684\u7248\u672C\u7EAA\u5F8B\u300D\u300C\u4E09\u7EA7\u8BED\u4E49 \u540C\u610F\u300D\uFF09\uFF1A\n *  `version` = major\uFF08\u6574\u6570\u62CD\u7167\u65E7\uFF1A\u4E0D\u53EF\u517C\u5BB9 / \u91CD\u5927\u5B89\u5168\u95EE\u9898\u624D +1\uFF1B\u8001\u8BFB\u8005\u53EA\u8BA4\u5B83\uFF0C\u6BD4\u81EA\u5DF1\u65B0 = \u62D2\u5F00\uFF09\uFF0C\u518D\u52A0\u4E24\u4E2A\u53EF\u9009\u6574\u6570\u952E `minor` / `patch`\uFF08\u7F3A = 0\uFF09\uFF1A\n *  minor +1 = \u52A0\u4E86\u53EF\u9009\u5B57\u6BB5 / \u65B0\u7684\u5B50\u8868 / \u65B0\u7684\u9ED8\u8BA4\u884C\u4E3A\uFF08\u8001\u8BFB\u8005\u80FD\u5F00\u80FD\u6539\u80FD\u5B58\u3001\u672A\u77E5\u952E\u539F\u6837\u5E26\u56DE\u3001\u544A\u8BC9\u7528\u6237\u4E00\u6B21\uFF09\uFF1Bpatch +1 = \u5199\u6CD5 / \u9ED8\u8BA4\u503C\u4FEE\u6B63\uFF08\u8001\u8BFB\u8005\u9759\u9ED8\uFF09\u3002\n *  minor 1 = \u8FFD\u8BA4 major 2 \u4E4B\u540E\u52A0\u8FC7\u7684\u6240\u6709\u53EF\u9009\u5B57\u6BB5\uFF082026-10-08 \u2192 10-21\uFF1Amanifest \u7684 core / final / finalRev / sounds\uFF1Bscore \u7684 view / arrangement / lyricFit / barNumbers / parts.clef / host / autoOttava\u3001\n *  papers \u7684 phrases / swells / hidden\uFF1Blounge \u7684 articulation / chain / defaults \u90A3\u4E9B\uFF1Bstudio v2 \u7684 master.chain / bypass / sends / dry\u2026\uFF09\u2014\u2014\u4EE5\u524D\u5199\u7684\u6587\u4EF6\u6CA1\u6709\u8FD9\u4E24\u4E2A\u952E = 0.0\uFF0C\u8BFB\u8D77\u6765\u4E00\u6837\u3002\n *  \u6307\u7EB9\uFF08\u5B9A\u7A3F\uFF09\u4E0D\u770B minor / patch\uFF08project.ts fpTextOf\uFF09\u3002\u6539 minor / patch \u4E0D\u7528\u8FC1\u79FB\u3001\u4E0D\u7528\u51BB\u7ED3\u6837\u672C\uFF0C\u53EA\u8DD1 freeze-format-sample \u66F4\u65B0\u5F62\u72B6\u5FEB\u7167\u3002added 2026-10-21 by Claude Fable 5.1 */\nexport const FORMAT_MINOR: Readonly<Record<FormatFile, number>> = { manifest: 1, score: 1, lounge: 1, studio: 1 };\nexport const FORMAT_PATCH: Readonly<Record<FormatFile, number>> = { manifest: 0, score: 0, lounge: 0, studio: 0 };\n\n// \u2550\u2550\u2550 \u73B0\u5F79\uFF08project.ts \u5199\u7684\u5C31\u662F\u8FD9\u4E9B\uFF09\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n/** `.moonsinger/manifest.json`\uFF1A\u603B\u76EE\u5F55\u3002 */\nexport interface ManifestV2 {\n  format: \"moonsinger\";\n  version: 2;\n  app: string;                         // \u5199\u5B83\u7684 app \u7248\u672C\uFF08\u5982 v0.5.0-2026-10-08\uFF09\n  saved: string;                       // ISO \u65F6\u523B\n  files: Record<string, number>;       // `.moonsinger/` \u4E0B\u6BCF\u4EFD\u6587\u4EF6 \u2192 \u5B83\u7684\u7248\u672C\u53F7\uFF08\"score.json\" / \"studio.json\" / \"lounge/r1.json\"\u2026\uFF1B\"papers/p1.musicxml\" \u8BB0 0 = \u6807\u51C6\u4EF6\uFF09\n  derived: string[];                   // \u6D3E\u751F\u4EF6\uFF08zip \u6839\u4E0B\u7684\u8DEF\u5F84\uFF1B\u81EA\u5BB6\u8BFB\u65F6\u65E0\u89C6\u3001\u5B58\u6863\u65F6\u91CD\u65B0\u751F\u6210\uFF09\uFF1A[\"score.musicxml\"]\n  /** 2026-10-07 \u52A0\uFF08\u53EF\u9009\uFF09\uFF1A\u6B4C\u91CC\u5D4C\u7684\u97F3\u6E90\u5B57\u8282\uFF08\u5951\u7EA6 \u00A710.2 \u6837\u672C\u7C7B by value\uFF09\u3002path \u76F8\u5BF9 zip \u6839\uFF08`.moonsinger/sounds/<sha256>.sf2`\uFF09\u3002 */\n  sounds?: { path: string; sha256: string; bytes: number }[];\n  /** 2026-10-16 \u52A0\uFF08\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BClaude Fable 5.1\uFF0CW-38\uFF09\uFF1A\u6E32\u67D3\u6838\u5FC3\u7684\u7248\u672C + \u54C8\u5E0C\uFF0C**\u6BCF\u6B21\u4FDD\u5B58\u90FD\u8BB0**\uFF08user 2026-10-13\u300C\u6838\u5FC3\u7684\u7248\u672C\u53F7\u548Chash\u53CD\u800C\u662F\u6BCF\u6B21\u4FDD\u5B58\u7684\u65F6\u5019\u90FD\u8981\u8BB0\u7684\u3002ui\u58F3\u65E0\u6240\u8C13\u300D\uFF09\u3002\n   *  version \u4EBA\u5B9A\uFF08src/core/version.ts CORE_VERSION\uFF09\uFF1Bhash = \u6784\u5EFA\u65F6\u6309\u6838\u5FC3\u6E90\u7801\uFF08src/core src/engine src/singer src/performers src/score src/gm src/format + vendor/world vendor/tsf + assets/preview\uFF09\u7B97\u7684 sha256 \u524D 16 \u4F4D\uFF08scripts/core-hash.mjs\uFF09\u3002 */\n  core?: { version: string; hash: string };\n  /** 2026-10-16 \u52A0\uFF08\u53EF\u9009\uFF09\uFF1A\u5B9A\u7A3F\u8FC7\u51E0\u6B21\uFF08\u6539\u7A3F\u4E0D\u51CF\uFF09\u3002 */\n  finalRev?: number;\n  /** 2026-10-16 \u52A0\uFF08\u53EF\u9009\uFF09\uFF1A\u5B9A\u7A3F\u8BB0\u5F55\uFF08src/format/final.ts FinalRecord\uFF09\u2014\u2014\u6709\u5B83 = \u8FD9\u9996\u6B4C\u5B9A\u7A3F\u7740\uFF1A`.moonsinger/final.mp3` \u662F\u5B9A\u7A3F\u90A3\u4E00\u523B\u6E32\u67D3\u7684 mp3\uFF08\u4E0D\u538B\u7F29\uFF1B\u6B4C\u5E93\u6309 entry \u540D\u6293\u6765\u76F4\u63A5\u542C\uFF09\uFF0C\n   *  fingerprint = \u51FA\u58F0\u5185\u5BB9\u7684\u6307\u7EB9\uFF08contentFingerprint\uFF09\uFF1B\u8BFB\u7684\u65F6\u5019\u5BF9\u4E0D\u4E0A / mp3 \u4E0D\u5728 = \u5B9A\u7A3F\u4F5C\u5E9F\uFF08\u8BF4\u4E00\u58F0\uFF09\u3002\u6539\u7A3F = \u8FD9\u4E2A\u952E\u548C entry \u4E00\u8D77\u6D88\u5931\u3002\u8001\u7248\u672C app \u8BFB\u5230 = \u4E0D\u8BA4\u7684\u952E\u539F\u6837\u5199\u56DE\u3001entry \u539F\u6837\u5199\u56DE\u3002 */\n  final?: unknown;\n}\n\n/** `.moonsinger/score.json` \u7B2C 2 \u7248\uFF1A\u7EB8\u7684\u987A\u5E8F\u8868 + \u58F0\u90E8\u5E76\u96C6\uFF08\u5B58\u6CD5 B\uFF0C\u00A76\u00BE\uFF09\u3002\u6309\u58F0\u90E8 id / \u97F3\u7B26 id / \u5C0F\u8282\u5E8F\u53F7\u6302\u6CE8\uFF0C\u4E0D\u590D\u5236\u8C31\u7684\u5185\u5BB9\u3002 */\nexport interface ScoreExtV2 {\n  version: 2;\n  /** \u987A\u5E8F\u91CC\u7684\u7EB8\uFF08\u7EB8 = \u66F2\u6BB5\uFF09\uFF1Afile = \u8FD9\u5F20\u7EB8\u7684 MusicXML \u6B63\u672C\uFF08`.moonsinger/papers/<id>.musicxml`\uFF09\uFF1BmanualBars = \u58F0\u90E8 id \u2192 \u8FD9\u5F20\u7EB8\u91CC\u4EBA\u63D2\u7684\u5C0F\u8282\u7EBF\uFF08\u5C0F\u8282\u5E8F\u53F7\uFF0C1 \u8D77\uFF09\uFF1B\n   *  unwritten = \u8FD9\u5F20\u7EB8\u8FD8\u6CA1\u5199\u97F3\u9AD8\u7684\u97F3\uFF08note id\uFF09\u3002\u81EA\u52A8\u5C0F\u8282\u7EBF\u53EA\u753B\u4E0D\u5B58\uFF080.2.x \u73B0\u72B6\uFF09\u3002\u66F2\u6BB5\u540D\u5728\u90A3\u4EFD MusicXML \u7684 <movement-title>\u3002\n   *  MusicXML \u6B63\u672C\u91CC\u6211\u4EEC\u81EA\u5DF1\u8BA4 id \u7684\u4E24\u6837\uFF08\u522B\u7684\u8F6F\u4EF6\u7167\u5E38\u663E\u793A\uFF1B\u81EA\u5BB6\u8BFB\u56DE\u6765\u6309 id \u8BA4\u51FA\u6765\uFF0C\u4E0D\u52A0 JSON \u5B57\u6BB5\u3001\u4E0D\u5347\u7248\u672C\uFF09\uFF1A\n   *  \u6E10\u5230 = \u865A\u7EBF <wedge id=\"ramp-\u2026\">\uFF1B\u98CE\u683C\u8BB0\u53F7\uFF08\u62CD\u5B50\u8F7B\u91CD\uFF0C2026-10-08 \u6DF1\u591C Opus 5.5\uFF09= <direction><words id=\"groove.<\u9884\u8BBE id>.<\u5E45\u5EA6\u767E\u5206\u6570>.<token id>\">\u540D\u5B57</words>\u3002\n   *  \u8C31\u5185\u53CD\u590D / \u8DF3\u8F6C\uFF082026-10-09 Opus 5.5\uFF1B\u4E0D\u5347\u7248\u672C\uFF1AMusicXML \u539F\u751F\u3001\u8001\u7248\u672C app \u8BFB\u5230 = \u4E0D\u8BA4\u7684\u5143\u7D20\uFF09\uFF1A|: / :| / :|: = <barline location=\"left|right\"> \u7684\n   *  <repeat direction=\"forward|backward\" times>\uFF08\u7EB8\u5934\u7684 |: \u4E0D\u5F00\u7A7A\u5C0F\u8282\uFF09\uFF1B\u623F\u5B50 = <barline location=\"left\"><ending number=\"1, 2\" type=\"start\">\uFF0C\u88AB :| \u6536 = stop\u3001\u6700\u540E\u4E00\u4E2A = discontinue\uFF1B\n   *  Segno / Coda = <direction><direction-type><segno|coda id=\"nav.<\u79CD\u7C7B>.<token id>\"/></direction-type><sound segno|coda/>\uFF1BFine / To Coda / D.C.\u2026 / D.S.\u2026 = <words id=\"nav.\u2026\">\u5B57</words> +\n   *  <sound fine | tocoda | dacapo | dalsegno>\u3002\u7EB8\u7684\u6B63\u672C\u91CC\u662F\u8BB0\u53F7\uFF1B\u6D3E\u751F\u7684\u538B\u5E73\u4EF6 score.musicxml \u5DF2\u7ECF\u6309\u7ED3\u6784\u5C55\u5F00\uFF08\u6CA1\u6709\u8FD9\u4E9B\u8BB0\u53F7\uFF09\u3002\n   *  \u8001\u7248\u672C\u7684 app \u8BFB\u5230\u5B83\u4EEC = \u5F53\u666E\u901A\u7684\u53D1\u5939 / \u6587\u5B57\u5FFD\u7565\uFF08\u98CE\u683C\u8BB0\u53F7\u4F1A\u4E22\u2014\u2014\u8001\u7248\u672C\u672C\u6765\u5C31\u4E0D\u4F1A\u653E\u62CD\u5B50\u8F7B\u91CD\uFF09\u3002\n   *  \u6C14\u58F0 / \u51FA\u58F0\u7684\u6362\u6C14\uFF082026-10-10 Opus 5.5\uFF1B\u4E0D\u5347\u7248\u672C\uFF1AMusicXML \u539F\u751F\uFF09\uFF1A\u6C14\u58F0 = <notehead>x</notehead>\uFF08\u548C\u5E7D\u7075\u97F3\u4E00\u8D77 = <notehead parentheses=\"yes\">x</notehead>\uFF1B\n   *  \u522B\u5BB6\u8C31\u7684 \u00D7 \u7B26\u5934\u8BFB\u8FDB\u6765\u4E5F\u662F\u6C14\u58F0\u2014\u2014\u4E50\u5668\u4E0D\u8BA4\u3001\u753B\u7070\uFF0C\u4E0D\u5F71\u54CD\u51FA\u58F0\uFF09\uFF1B\u51FA\u58F0\u7684\u6362\u6C14 = <breath-mark/> \u540E\u9762\u7D27\u8DDF <other-articulation>inhale | inhale-big</other-articulation>\n   *  \uFF08\u522B\u7684\u8F6F\u4EF6\u7167\u6837\u8BA4\u5F97\u662F\u6362\u6C14\uFF1B\u8001\u7248\u672C\u7684 app \u8BFB\u5230 = \u300C\u4E0D\u8BA4\u7684\u6F14\u594F\u6CD5\u300D\u6570\u51FA\u6765\u62A5\uFF0C\u547C\u5438\u7167\u65E7\uFF09\u3002 */\n  papers: { id: string; file: string; manualBars: Record<string, number[]>; unwritten: string[]; hidden?: boolean; phrases?: Record<string, number[]>;\n    /** \u97F3\u5185\u7684\u529B\u5EA6\u8D77\u4F0F\uFF082026-10-08 \u52A0\uFF0C\u53EF\u9009\uFF1BMusicXML \u91CC\u8868\u8FBE\u4E0D\u4E86\u97F3\u5185\u7684\u53D1\u5939\uFF09\uFF1A\u58F0\u90E8 id \u2192 \u97F3\u7684 id \u2192 \"<\" / \">\" / \"<>\"\u3002 */\n    swells?: Record<string, Record<string, \"<\" | \">\" | \"<>\">> }[];   // swells\uFF1Av0.9.44 \u8D77\u7F16\u8F91\u5668\u91CC\u662F\u6F14\u594F\u6CD5\uFF08Art swellUp / swellDown / swellBoth\uFF09\uFF0C\u5B58\u7684\u65F6\u5019\u7167\u65E7\u4ECE\u6F14\u594F\u6CD5\u53D6\u6210\u8FD9\u5F20\u8868\u3001\u8BFB\u7684\u65F6\u5019\u6302\u56DE\u53BB\u2014\u2014\u6587\u4EF6\u5F62\u72B6\u6CA1\u53D8   // hidden\uFF082026-10-08 \u52A0\uFF0C\u53EF\u9009\uFF09= \u8FD9\u5F20\u7EB8\u4E0D\u653E\u3001\u4E0D\u8FDB\u538B\u5E73\u4EF6\uFF1Bphrases\uFF08\u540C\u65E5\u52A0\uFF0C\u53EF\u9009\uFF09= \u58F0\u90E8 id \u2192 \u53E5\u53F7\u8DDF\u5728\u54EA\u4E9B token\uFF08id\uFF09\u540E\u9762\uFF08\u53E5\u53F7\u4E0D\u7B97\u6253\u8C31\u7B26\u53F7\uFF0C\u4E0D\u8FDB MusicXML\uFF09\n  /** \u89C6\u56FE\u6001\uFF082026-10-08 \u52A0\uFF0C\u53EF\u9009\uFF1Bsrc/score/desk.ts\uFF09\uFF1A\u600E\u4E48\u770B / \u600E\u4E48\u542C\u8FD9\u9996\u2014\u2014\u8303\u56F4 / \u6392\u6CD5 / \u5728\u54EA\u5F20\u7EB8 / \u6BCF\u4E2A\u58F0\u90E8\u7684\u9690\u85CF\u00B7\u53EA\u770B\u00B7\u9759\u97F3\u00B7\u72EC\u594F\u3002**\u5B58\u65F6\u987A\u624B\u635E\u8FDB\u6765\u3001\u6539\u4E86\u4E0D\u6807\u810F\u3001\u4E0D\u8FDB undo**\uFF08\u7167 WeebPaint desk\uFF09\u3002\u53EA\u5199\u975E\u9ED8\u8BA4\u503C\uFF1B\u6CA1\u6709 = \u5168\u9ED8\u8BA4\u3002 */\n  view?: ViewV1;\n  /** \u7F16\u6392\uFF082026-10-08 \u6DF1\u591C\u52A0\uFF0C\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BOpus 5.5\uFF09\uFF1A\u4E00\u884C\u5B57\uFF0C\u6309\u4EC0\u4E48\u987A\u5E8F\u653E\u54EA\u51E0\u5F20\u7EB8\uFF08\u66F2\u6BB5\u540D / \u5E8F\u53F7\u3001\u00D7N\u3001\u62EC\u53F7\u3001\u6700\u540E\u4E00\u4E2A [\u5FAA\u73AF\u6BB5]\uFF1Bsrc/score/arrange.ts\uFF09\u3002\u6CA1\u6709 = \u6BCF\u5F20\u7EB8\u5404\u653E\u4E00\u904D\u3002 */\n  arrangement?: string;\n  /** \u6B4C\u8BCD\u600E\u4E48\u6392\uFF08v0.9.40 \u52A0\uFF0C\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BOpus 5.5\uFF09\uFF1A\u53EA\u5199 \"lyrics\"\uFF08\u6309\u6B4C\u8BCD\uFF1A\u957F\u5B57\u628A\u97F3\u63A8\u5F00\uFF09\uFF1B\u6CA1\u5199 = \u6309\u8282\u594F\uFF08\u97F3\u7684\u4F4D\u7F6E\u53EA\u770B\u65F6\u503C\uFF0C\u6B4C\u8BCD\u8BA9\u8DEF\uFF1B\u9ED8\u8BA4\uFF09\u3002 */\n  lyricFit?: \"lyrics\";\n  /** \u5C0F\u8282\u53F7\uFF08v0.9.42 \u52A0\uFF0C\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BOpus 5.5\uFF09\uFF1A\u53EA\u5199 \"off\"\uFF08\u4E0D\u5370\uFF09\uFF1B\u6CA1\u5199 = \u6BCF\u884C\u5F00\u5934\u5370\u3002 */\n  barNumbers?: \"off\";\n  /** \u6B4C\u7EA7\u58F0\u90E8\u5E76\u96C6\uFF08\u603B\u8C31\u4ECE\u4E0A\u5230\u4E0B\uFF09\uFF1A\u58F0\u90E8 \u2192 \u89D2\u8272 id \u2192 \u9EA6\u514B\u98CE id\uFF1B\u67D0\u5F20\u7EB8\u6CA1\u6709\u67D0\u58F0\u90E8 = \u90A3\u5F20\u7EB8\u7684 MusicXML \u91CC\u6CA1\u90A3\u4E2A part\u3002kind \u7559\u7ED9\u6253\u51FB\u4E50\u8BB0\u8C31\uFF08\u73B0\u5728\u90FD\u662F pitched\uFF09\u3002\n   *  **\u58F0\u90E8\u5C31\u662F\u6B4C\u624B**\uFF082026-10-08 Opus 5.5\uFF0Cuser\u300C\u55EF\u58F0\u90E8\u5C31\u662F\u6B4C\u624B\u300D\uFF09\uFF1Arole \u5728 parts \u91CC\u552F\u4E00\uFF08\u8BFB\u5230\u5171\u7528\u7684 = \u540E\u9762\u90A3\u4E2A\u62C6\u6210\u4E00\u4F4D\u65B0\u6B4C\u624B\uFF0C\u89C1 project.ts finish\uFF09\uFF1B\n   *  \u4E00\u5F20\u7EB8\u4E0A\u4E00\u4F4D\u6B4C\u624B\u6700\u591A\u4E00\u884C\uFF08tracks \u6309\u58F0\u90E8 id \u8BB0\uFF0C\u5929\u7136\u5982\u6B64\uFF09\uFF1B\u8DE8\u7EB8\u6309\u58F0\u90E8 id \u63A5\uFF1Bmic \u53EF\u4EE5\u51E0\u4F4D\u6B4C\u624B\u5171\u7528\uFF08\u6B4C\u624B\u8BA4\u9886\u9EA6\u514B\u98CE\uFF09\u3002\u4E0D\u6539\u5F62\u72B6\u3001\u4E0D\u5347\u7248\u672C\u3002 */\n  /** clef\uFF08v0.9.28\uFF0C\u53EF\u9009\uFF09\uFF1A\u58F0\u90E8\u81EA\u5DF1\u7684\u8C31\u53F7\uFF0C\"auto\" = \u81EA\u52A8\uFF08MusicXML \u91CC\u5199\u7684\u662F\u6311\u597D\u7684\u90A3\u4E2A\uFF09\u3002autoOttava\uFF08v0.9.37\uFF0C\u53EF\u9009\uFF0C\u53EA\u5199 false\uFF09\uFF1A\u8FD9\u4F4D\u4E0D\u8981\u81EA\u52A8\u516B\u5EA6\u7EBF\uFF08\u6CA1\u5199 = \u5F00\uFF09\u3002\u90FD\u4E0D\u5347\u7248\u672C\u3002 */\n  parts: { id: string; role: string; mic: string; kind: \"pitched\" | \"percussion\"; clef?: string; autoOttava?: false;\n    /** 2026-10-10 \u52A0\uFF08\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BOpus 5.5\uFF09\uFF1A\u5408\u79DF\u2014\u2014\u753B\u5728\u54EA\u4F4D\uFF08\u4E3B\u4EBA\uFF09\u7684\u8C31\u7EBF\u4E0A\uFF1B\u4E3B\u4EBA\u81EA\u5DF1\u4E0D\u80FD\u662F\u623F\u5BA2\uFF08\u8BFB\u7684\u65F6\u5019\u4E0D\u5408\u89C4\u77E9 = \u4E22\u6389\u8FD9\u4E2A\u5B57\u6BB5\uFF09\u3002user\u300C\u5408\u79DF\u8FD8\u662F\u6709\u4E3B\u4EBA\u5427\u300D\u3002 */\n    host?: string }[];\n}\n\n// \u2500\u2500\u2500 \u7B2C 1 \u7248\uFF08\u53EA\u7ED9\u8FC1\u79FB\u5BF9\u7167\uFF1Bmigrate/index.ts\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport interface ManifestV1 { format: \"moonsinger\"; version: 1; app: string; saved: string; files: Record<string, number>; sounds?: { path: string; sha256: string; bytes: number }[] }\n/** \u7B2C 1 \u7248\u7684 score.json\uFF1A\u4E00\u5F20\u7EB8\u3001\u6574\u9996\u4E00\u4EFD score.musicxml \u5C31\u662F\u6B63\u672C\u3002 */\n/** \u89C6\u56FE\u6001\uFF08\u63A8\u8350\u7A3F\uFF09\u3002\u5168\u662F\u53EF\u9009\u3001\u53EA\u5199\u975E\u9ED8\u8BA4\u503C\uFF1B\u8BFB\u7684\u4E00\u65B9\u5BBD\u5BB9\uFF08\u4E0D\u8BA4\u8BC6\u7684\u5FFD\u7565\uFF09\u3002 */\nexport interface ViewV1 { scope?: \"all\"; pageFlow?: true; /** \u6392\u6CD5\u300C\u6A2A\u5377\u300D\uFF08v0.9.35 \u52A0\uFF0C\u53EF\u9009\u3001\u4E0D\u5347\u7248\u672C\uFF1BOpus 5.5\uFF1B\u548C pageFlow \u4E92\u65A5\uFF0C\u53EA\u5199 true\uFF09\u3002 */ scroll?: true; paper?: string; parts?: Record<string, { hidden?: true; only?: true; muted?: true; solo?: true }>;\n  mp3?: \"small\";   // mp3 = \u5BFC\u51FA\u6B4C\u58F0\u7684\u97F3\u8D28\uFF08\u53EA\u5199\u975E\u9ED8\u8BA4\u7684\u300C\u5C0F\u6587\u4EF6\u300D\uFF1B2026-10-08 by Claude Opus 5.5\uFF0Cuser\u300C\u97F3\u8D28\u914D\u7F6E\u5C31\u662F\u5E94\u8BE5\u4E5F\u8DDF\u7740\u5427\u300D\uFF09\n  /** 2026-10-08 \u6DF1\u591C / 10-09 \u52A0\uFF08\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BOpus 5.5\uFF09\uFF1Aref = \u53C2\u8003\u7A97\u7684\u7A97\uFF08\u5F00\u7740\u6CA1\u6709 + \u4F4D\u7F6E / \u5927\u5C0F\uFF0CCSS px\uFF1B\u5F00\u8FC7\u7A97\u624D\u5199\uFF09\uFF1B\n   *  pdf = \u4E50\u8C31 PDF \u7684\u5B57\u4F53\uFF08\u53EA\u5199\u975E\u9ED8\u8BA4\u7684\u300C\u62FC\u97F3\u300D\uFF09\u3002pad = pad \u7684\u72B6\u6001\uFF08\u540C\u65E5\u66F4\u65E9\u52A0\u7684\uFF0C\u89C1 desk.ts\uFF09\u3002 */\n  pad?: Record<string, unknown>; ref?: { open?: true; left: number; top: number; width: number; height: number }; pdf?: \"pinyin\";\n  /** 2026-10-10 \u52A0\uFF08\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BOpus 5.5\uFF09\uFF1A\u5B58\u7684\u65F6\u5019\u5728\u54EA\u4E2A\u6A21\u5F0F\uFF08\u53EA\u5199\u975E\u9ED8\u8BA4\u7684\uFF1B\u6253\u5F00 = \u8FDB\u8FD9\u4E2A\u6A21\u5F0F\uFF0C\u6210\u54C1\u66F2\u5B58\u5728\u300C\u542C\u300D= \u6253\u5F00\u5C31\u662F\u542C\u3001\u4E0D\u6015\u8BEF\u89E6\uFF1Buser\u300C\u6253\u5F00\u65F6\u8BB0\u4F4F\u4E0A\u6B21\u7684\u6A21\u5F0F\u300D\uFF09\u3002 */\n  mode?: \"lyrics\" | \"symbols\" | \"listen\" }\nexport interface ScoreExtV1 {\n  version: 1;\n  parts: { id: string; role: string; mic: string }[];\n  manualBars: Record<string, number[]>;                   // \u58F0\u90E8 id \u2192 \u54EA\u4E9B\u5C0F\u8282\u7EBF\u662F\u4EBA\u63D2\u7684\n  unwritten: string[];\n}\n\n/** `.moonsinger/studio.json`\uFF1A\u5F55\u97F3\u623F\u3002 */\n/** \u5F55\u97F3\u623F v1\uFF08\u53EA\u7ED9\u8FC1\u79FB\u5BF9\u7167\uFF1Bmigrate/index.ts studioV1toV2\uFF09\u3002 */\nexport interface StudioV1 {\n  version: 1;\n  mics: { id: string; name: string; gainDb: number; pan: number }[];   // pan \u22121\u20261\uFF08\u5199 MusicXML \u65F6 \u00D790\uFF09\n  master?: { gainDb: number; limiter: boolean };   // v0.9.6 \u52A0\u7684\u53EF\u9009\u5B57\u6BB5\n}\n/** \u5F55\u97F3\u623F v2\uFF082026-10-10 \u5200 4\uFF1Buser\u300C\u8F68\u8FD8\u662F\u548C\u4E50\u624B\u662F\u4E24\u4E2A\u6982\u5FF5\u300D\uFF09\uFF1A\u8F68\u662F\u901A\u7528\u7684\u6761\u2014\u2014\u4E50\u624B\u7684\u901A\u9053\uFF08kind mic\uFF0C\u8C31\u4E0A\u58F0\u90E8 `part.mic` \u6307\u7740\u5B83\uFF09\u3001\u603B\u7EBF\uFF08kind bus\uFF0C\u6CA1\u6709\u4E50\u624B\uFF1B\u6DF7\u54CD / \u5EF6\u8FDF\u8FD9\u7C7B\u300C\u7559\u5728\u5C4B\u91CC\u7684\u300D\uFF09\u3001\n *  \u4EE5\u540E\u7684\u7D20\u6750\u8F68\u3002\u6BCF\u6761\uFF1A\u589E\u76CA / \u58F0\u50CF / \u6548\u679C\u94FE / \u53D1\u9001\uFF08\u63A8\u5B50\u4E4B\u540E\u53D1\u5230\u54EA\u6761\u603B\u7EBF\u591A\u5C11\uFF09/ \u53BB\u54EA\uFF08\"master\" \u6216\u603B\u7EBF id\uFF09\u3002\u603B\u8F68\uFF1A\u589E\u76CA / \u9650\u5E45 / \u94FE\u3002\u8001\u6587\u4EF6\uFF08v1\uFF09\u8BFB\u8FDB\u6765 = \u6BCF\u4E2A\u9EA6\u514B\u98CE\u4E00\u6761 mic \u8F68\u3001\u7A7A\u94FE\u3001\u76F4\u901A\u603B\u8F68\u3002 */\nexport interface StudioTrackV2 { id: string; kind: \"mic\" | \"bus\"; name: string; gainDb: number; pan: number; chain: FxV2[]; sends: { to: string; gainDb: number }[]; to: string;\n  /** 2026-10-10 \u52A0\uFF08\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BOpus 5.5\uFF09\uFF1A\u6DF7\u97F3\u8F68\u6574\u6761\u65C1\u901A\u2014\u2014\u94FE\u4E0A\u7684\u63D2\u4EF6\u5168\u8DF3\u8FC7\uFF0C\u63A8\u5B50 / \u58F0\u50CF / \u51FA\u5230 / \u53D1\u9001\u7167\u65E7\uFF1B\u53EA\u5199 true\uFF08user\u300C\u6DF7\u97F3\u8F68\u548C\u6BCF\u4E2A\u63D2\u4EF6\u90FD\u53EF\u4EE5toggle bypass\u300D\uFF09\u3002 */\n  bypass?: true }\nexport interface StudioV2 {\n  version: 2;\n  tracks: StudioTrackV2[];\n  master: { gainDb: number; limiter: boolean; chain: FxV2[] };\n}\n\n// \u2500\u2500\u2500 \u4F11\u606F\u5BA4 v2\uFF08\u73B0\u5F79\uFF09\uFF1A\u89D2\u8272 = \u8C31\u4E0A\u7684\u529F\u80FD\u4F4D\uFF1B\u5019\u9009 = \u8C01\u6765\u6F14 + \u600E\u4E48\u51FA\u58F0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// \u4E09\u6837\u4E1C\u897F\uFF08\u5951\u7EA6\u8349\u7A3F \u00A71\uFF09\uFF1A\u8C31\uFF08\u58F0\u90E8\u5404\u81EA\u9009\u89D2\u8272\u3001\u9009\u9EA6\u514B\u98CE\uFF09/ \u4F11\u606F\u5BA4\uFF08\u89D2\u8272 \u2192 \u5019\u9009\uFF0C\u624B\u52A8\u9009\u4E0A\u573A\u7684\uFF1B\u4E0B\u7EBF\u7684\u7559\u7740\u4E0D\u5220\uFF09/ \u5F55\u97F3\u623F\uFF08\u7535\u7EBF\uFF09\u3002\n//   2026-10-08 Opus 5.5\uFF1A\u58F0\u90E8 = \u6B4C\u624B\uFF08\u4E00\u4E2A\u58F0\u90E8\u4E00\u4E2A\u89D2\u8272\uFF0C\u7ED1\u5B9A\u5728\u6B4C\u624B\u4E0A\u3001\u5168\u66F2\u4E00\u4EFD\uFF0C\u754C\u9762\u4E0A\u7167\u65E7\u5728\u8C31\u524D\u9762\u7684\u6B4C\u624B\u540D\u90A3\u91CC\u9009\uFF09\uFF1B\u6BCF\u5F20\u7EB8\u4E0A\u6709\u8C01\u5404\u81EA\u5B9A\uFF08user\u300C\u65B0\u6B4C\u624B\u53EA\u51FA\u73B0\u5728\u5F53\u524D\u8FD9\u5F20\u7EB8\u55EF\u300D\u300C\u9EA6\u514B\u98CE\u7531\u6B4C\u624B\u8BA4\u9886\u55EF\u300D\uFF09\u3002\n// \u300C\u8D1D\u65AF\u624B\u4E0D\u662F\u8D1D\u65AF\u300D\uFF1A\u89D2\u8272\u662F\u529F\u80FD\uFF08Vocals / Guitar\u2026\uFF0C\u5E26 MusicXML \u5B98\u65B9\u4E50\u5668\u8BED\u4E49 id\uFF09\uFF0C\u5019\u9009\u662F\u6F14\u594F\u8005 + \u4ED6\u624B\u91CC\u7684\u4E50\u5668\u914D\u7F6E\u3002\n// \u6BCF\u4E2A\u5019\u9009 by value \u5E26\u5168\u7EAF\u51FD\u6570\u8981\u7684\u4E00\u5207\uFF08\u00A78\uFF09\uFF1A\u4E50\u5668\uFF08\u6309\u5F15\u64CE\u5206\uFF09\u3001\u9ED8\u8BA4\u6570\u3001\u529B\u5EA6\u8868\u3001\u6F14\u594F\u6CD5\u3001\u6821\u51C6\u3001\u94FE\u3001\u7F72\u540D\u3001\u89C4\u683C\u3002\u4E0D\u4F9D\u8D56 app \u91CC\u7684\u9ED8\u8BA4\u8868\u3002\n\nexport type Hum = \"la\" | \"n\" | \"u\" | \"o\" | \"a\";\nexport type Dynamic = \"ppp\" | \"pp\" | \"p\" | \"mp\" | \"mf\" | \"f\" | \"ff\" | \"fff\";   // ppp / fff\uFF1Av0.9.23 \u52A0\uFF08\u53EA\u52A0\u4E0D\u6539\uFF1B\u65E7\u6F14\u594F\u8005\u7684\u8868\u91CC\u6CA1\u6709 = \u6309\u5B83\u81EA\u5DF1 pp\u2192p / f\u2192ff \u7684\u95F4\u9694\u5F80\u5916\u63A8\u4E00\u6863\uFF09\n\nexport interface LoungeRoleV2 {\n  version: 2;\n  id: string;                          // \"r1\"\n  name: string;                        // \u8C31\u4E0A\u5199\u7684\u89D2\u8272\u540D\uFF08<part-name>\uFF09\n  sound: string;                       // MusicXML \u5B98\u65B9\u4E50\u5668\u8BED\u4E49 id\uFF08<instrument-sound>\uFF0Csrc/score/roles.ts\uFF09\n  active: string;                      // \u4E0A\u573A\u7684\u5019\u9009 id\uFF08\u4EBA\u9009\u7684\uFF1B\u4E0A\u4E0D\u4E86\u573A = \u4E0D\u51FA\u58F0\u3001\u62A5\u9519\u3001\u4EBA\u6362\uFF0C\u4E0D\u81EA\u52A8\u66FF\u8865\uFF09\n  candidates: CandidateV2[];\n  /** 2026-10-07 \u52A0\uFF08\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF09\uFF1A\u89D2\u8272\u662F\u4EC0\u4E48\u4E50\u5668**\u6982\u5FF5**\u2014\u2014\u767E\u79D1\u7684\u591A\u91CD\u7F16\u53F7\u675F + \u540D\u5B57 by value\uFF08user\u300C\u4E50\u5668\u7684\u767E\u79D1\u5168\u4E66\u300D\u300C\u591A\u91CD\u7F16\u53F7\u300D\uFF09\u3002\n   *  sound\uFF08MusicXML id\uFF09\u4ECD\u662F\u5BFC\u51FA\u7ED9\u522B\u7684\u8F6F\u4EF6\u770B\u7684\uFF1Bconcept \u662F\u771F\u8EAB\u4EFD\uFF0C\u76EE\u5F55\uFF08vendor/instruments/\uFF09\u5E38\u6539\u4E5F\u4E0D\u5F71\u54CD\u6B4C\u3002 */\n  concept?: { ids: { wikidata: string | null; local: string | null; musicxml: string | null; gm: { program: number; bank: number }[]; hs: string | null }; name: { zh: string; en: string; ja?: string } };\n}\nexport interface CandidateV2 {\n  id: string;                          // \"c1\"\u2026\uFF08c1 / c2 = \u65B0\u6B4C\u9ED8\u8BA4\u7684\u6708\u8BFB\u5B8C\u6574 / \u5143\u97F3\u7248\uFF09\n  name: string;                        // \u5019\u9009\u7684\u540D\u5B57\uFF08\u4E0D\u4E0A\u8C31\uFF09\n  instrument: InstrumentV2;            // \u8C01\u6765\u6F14\u3001\u600E\u4E48\u51FA\u58F0\uFF08\u6309\u5F15\u64CE\u5206\uFF1B\u4E0D\u8BA4\u8BC6\u7684\u5F15\u64CE\u539F\u6837\u5199\u56DE\uFF09\n  gm: { program: number | null; variant: string | null };   // \u5199\u7ED9\u522B\u7684\u8F6F\u4EF6\u770B\u7684\uFF08MusicXML <midi-program> 1 \u8D77 / <virtual-instrument>\uFF09\n  calibrationDb: number;               // \u54CD\u5EA6\u6821\u51C6\uFF08\u770B\u5F97\u89C1\u3001\u80FD\u8C03\u7684\u9ED8\u8BA4\uFF0C\u4E0D\u5077\u5077\u81EA\u52A8\uFF09\n  /** 2026-10-08 \u52A0\uFF08\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BClaude Opus 5.5\uFF09\uFF1A\u4FEE\u516B\u5EA6 / \u79FB\u8C03\uFF08\u534A\u97F3\uFF09\u2014\u2014SoundFont \u51FA\u58F0\u65F6\u6572\u300C\u5199\u7684\u97F3 + transpose\u300D\u3002\u9ED8\u8BA4\u6CA1\u6709 = 0\uFF1B\n   *  \u53EA\u7ED9\u5C11\u6570\u672C\u8EAB\u5C31\u5DEE\u516B\u5EA6\u7684\u97F3\u8272\u515C\u5E95\uFF08GS 32 Guitar Harmonics \u9AD8\u4E24\u4E2A\u516B\u5EA6\u300118 / 19 \u98CE\u7434\u542C\u7740\u4F4E\u4E00\u4E2A\u516B\u5EA6\uFF09\uFF0C\u4E0D\u81EA\u52A8\u5957\u7528\uFF08user\u300C\u5927\u90E8\u5206\u60C5\u51B5\u4E0D\u5E94\u8BE5\u52A8\uFF0C\u662Fworst case\u515C\u5E95\u300D\uFF09\u3002 */\n  transpose?: number;\n  defaults: Record<string, number>;    // \u4E00\u4E2A\u97F3\u6CA1\u753B\u66F2\u7EBF\u65F6\u7528\u7684\u9ED8\u8BA4\u6570\uFF08by value\uFF09\uFF1A\u53C2\u6570\u540D \u2192 \u503C\uFF0C\u5355\u4F4D\u540C curves.json \u7684 units\n  dynamicsDb: Record<Dynamic, number>; // \u8C31\u4E0A\u8BB0\u53F7 \u2194 \u66F2\u7EBF\u7684\u6362\u7B97\u8868\uFF08by value\uFF09\uFF1A\u529B\u5EA6\u5B57\u6BCD \u2192 dB\n  /** 2026-10-08 \u52A0\uFF08\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BClaude Opus 5.5\uFF09\uFF1ASoundFont \u6F14\u594F\u8005\u7684\u529B\u5EA6\u8BB0\u53F7 \u2192 MIDI \u529B\u5EA6\uFF081\u2013127\uFF09\u3002\u6709\u8FD9\u5F20\u8868 = \u529B\u5EA6\u8BB0\u53F7 / \u91CD\u97F3 / \u5F3A\u97F3\u8D70\u529B\u5EA6\n   *  \uFF08accentVel / marcatoVel \u52A0\u5728\u4E0A\u9762\uFF09\uFF0C\u4E0D\u518D\u8D70 dB\uFF1B\u6CA1\u6709 = \u7167\u65E7\uFF08\u65E7\u5019\u9009\uFF09\u3002articulation \u540C\u65F6\u52A0\u4E86 marcatoDb\uFF08\u5F3A\u97F3\uFF0CdB \u90A3\u4E00\u8DEF\uFF09/ accentVel / marcatoVel\u3002 */\n  dynamicsVel?: Record<Dynamic, number>;\n  articulation: { staccatoGate: number; tenutoGate: number; accentDb: number; gapSec?: number; marcatoDb?: number; accentVel?: number; marcatoVel?: number;\n    accentSec?: number; breathSec?: number; breathShare?: number; gapShare?: number; wedgeStepDb?: number; wedgeStepVel?: number;\n    sfzDb?: number; sfzVel?: number; sfzSec?: number; fpSec?: number; swellDb?: number;\n    /** \u80FD\u4E0D\u80FD\u5728\u4E00\u4E2A\u97F3\u91CC\u9762\u53D8\u5F3A\uFF082026-10-08 \u52A0\uFF0C\u53EF\u9009\uFF09\uFF1Afalse = \u6309\u4E0B\u53BB\u5C31\u81EA\u7136\u8870\u51CF\uFF08\u94A2\u7434 / \u5409\u4ED6 / \u6253\u51FB\uFF09\u2014\u2014\u97F3\u5185\u6E10\u5F3A / \u9F13\u8D77\u753B\u7070\u3001\u660E\u8BF4\uFF1B\u97F3\u5185\u6E10\u5F31\u7167\u505A\u3002\u6CA1\u5199 = \u80FD\u3002\n     *  SoundFont \u65B0\u5019\u9009\u6309\u4ED3\u9F20 v11 \u7684 sustain\uFF08sustained = \u80FD\uFF09by value \u6284\u8FDB\u6765\u3002 */\n    canSwell?: boolean };\n  //   2026-10-08 \u52A0\uFF08\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BClaude Opus 5.5\uFF1Buser\u300C\u8BB0\u53F7\u600E\u4E48\u89E3\u8BFB\u5E94\u8BE5\u4E50\u5668\u91CC\u9762\u6709explicit\u7684\u914D\u7F6E\uFF0C\u800C\u4E0D\u662F\u4EE3\u7801\u5199\u6B7B\u300D\uFF09\uFF1A\u4E0A\u9762\u8FD9\u4E9B = \u8BB0\u53F7\u600E\u4E48\u89E3\u8BFB\u7684\u6570\uFF0C\u6CA1\u5199 = performance.ts MARK_DEFAULTS\n  //   2026-10-08 \u6DF1\u591C\u518D\u52A0\uFF08\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BOpus 5.5\uFF09\uFF1AstressDb / stressVel\uFF08\u6B21\u91CD\u97F3\uFF09\u3001unstressDb / unstressVel\uFF08\u5F31\u5316\uFF09\u3001ghostDb / ghostVel\uFF08\u5E7D\u7075\u97F3\uFF09\u2014\u2014\u5F3A\u5EA6\u7684\u5176\u4F59\u51E0\u7EA7\u3002\n  /** 2026-10-08 \u52A0\uFF08\u53EF\u9009\uFF09\uFF1A\u6708\u8BFB\u2014\u2014\u8C31\u4E0A\u7684\u8BB0\u53F7\u53D8\u6210\u5531\u6CD5\u6838\u5FC3\u54EA\u4E2A\u5B57\u524D\u8BB0\u53F7\uFF08^ / v / O\uFF09\u3001\u653E\u5728\u8FD9\u4E2A\u5B57\u8FD8\u662F\u4E0B\u4E00\u4E2A\u5B57\u524D\u9762\uFF1B\u6CA1\u5199 = performance.ts SING_MARKS\u3002 */\n  sing?: Record<string, { mark: \"^\" | \"v\" | \"O\"; at: \"this\" | \"next\" } | null>;   // \u8DF3\u97F3 / \u4FDD\u6301\u5403\u6389\u591A\u957F\uFF080\u20131\uFF09\uFF1B\u91CD\u97F3\u52A0\u591A\u5C11 dB\uFF1B\n  //   gapSec\uFF082026-10-08 \u52A0\uFF0C\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BClaude Opus 5.5\uFF09= \u8FDE\u65AD\u7684\u5E95\u8272\uFF1A\u4E0D\u5199\u8BB0\u53F7\u7684\u97F3\u4E4B\u95F4\u7559\u591A\u5927\u7F1D\uFF08\u79D2\uFF09\uFF1B\u8FDE\u7EBF / \u4FDD\u6301 = \u4E0D\u7559\uFF1B\u6CA1\u5199 = 0\n  chain: FxV2[];                       // \u8DDF\u7740\u6F14\u594F\u8005\u8D70\u7684\u6548\u679C\uFF08\u7434\u7BB1 / \u97F3\u7BB1 / \u7436\u97F3\u5668\uFF1B\u7559\u4F4D\uFF0C\u73B0\u5728\u7A7A\uFF09\n  credit: Credit;                      // \u7F72\u540D / \u8BB8\u53EF\u8BC1\u5FEB\u7167 by value\uFF08\u7F72\u540D\u4E49\u52A1\u8DDF\u97F3\u6E90\u8D70\uFF09\n  spec: Spec;                          // \u00A710.6 vault\uFF1A\u8FD9\u4E2A\u4E50\u5668\u600E\u4E48\u51FA\u58F0\u2014\u2014\u6807\u51C6\u683C\u5F0F\u53EA\u5199\u540D\u5B57\u7248\u672C\uFF1B\u6211\u4EEC\u5199\u7684\u6307\u5411\u6E90\u7801\u51FA\u5904 + README \u7AE0\u8282\n  engines?: Record<string, unknown>;   // v1 \u7684\u300C\u5F15\u64CE\u53C2\u6570\u6309\u5F15\u64CE\u540D\u5206\u7EC4\u300D\uFF1B\u522B\u7684\u5DE5\u5177 / \u65E7\u7248\u5199\u7684\uFF0C\u539F\u6837\u5199\u56DE\n}\n/** \u4E50\u5668 = \u6309\u5F15\u64CE\u5206\u7684\u5224\u522B\u8054\u5408\u3002\u6BCF\u79CD\u5F15\u64CE\u81EA\u5E26\u81EA\u5DF1\u7684\u914D\u7F6E\uFF08\u6708\u8BFB\u624D\u6709\u300C\u54FC\u7684\u5B57\u300D\uFF0CSoundFont \u624D\u6709 bank / program\uFF09\u3002 */\nexport type InstrumentV2 =\n  | { engine: \"tsukuyomi\"; model: { pack: string; sha256: string }; hum: Hum;        // \u6708\u8BFB\u5B8C\u6574\uFF1Apiper\uFF08\u65F6\u957F\u63A5\u7BA1\uFF09+ WORLD\uFF1Bmodel = \u5BB6\u65CF\u6A21\u578B\u5305\uFF08packId = manifest \u7684 sha256\uFF09\n      /** 2026-10-08 \u6DF1\u591C\u52A0\uFF08\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BOpus 5.5\uFF09\uFF1A\u5206\u6BB5\u5531\u2014\u2014\"phrase\" \u6BCF\u53E5\uFF08\u5728\u4F11\u6B62\u5904\u5207\uFF09/ \"sheet\" \u6BCF\u5F20\u7EB8 / \"whole\" \u4E00\u6574\u9996\uFF1B\u6CA1\u5199 = phrase\u3002\n       *  user\u300C\u5F00\u5173\u662F\u6B4C\u624B\u7684\u5C5E\u6027\uFF0C\u53EF\u4EE5\u6709\u4E0D\u540C\u7684\u7C92\u5EA6\u300D\uFF1Bsrc/score/lab-score.ts singChunks\u3002 */\n      chunk?: \"phrase\" | \"sheet\" | \"whole\" }\n  | { engine: \"vowel-sampler\"; table: \"builtin\"; hum: Hum }                            // \u6708\u8BFB\u5143\u97F3\u7248\uFF08\u8F7B\u91CF\uFF09\uFF1Aapp \u968F\u5E26\u7684\u5143\u97F3\u8868\uFF08assets/preview/\uFF09\n  | { engine: \"soundfont\"; bank: number; program: number; note?: number; source: Sf2Source;   // SoundFont 2 \u7684\u4E00\u4E2A\u9884\u8BBE\uFF08TinySoundFont \u51FA\u58F0\uFF09\uFF1Bnote = \u6BCF\u4E2A\u97F3\u90FD\u6572\u8FD9\u4E2A\u952E\uFF1A\u9F13\u4EF6\uFF082026-10-07 \u52A0\uFF0C\u53EF\u9009\uFF09/ \u97F3\u6548\u56FA\u5B9A\u539F\u901F\uFF082026-10-08\uFF09\n      /** 2026-10-08 \u52A0\uFF08\u53EF\u9009\uFF0C\u4E0D\u5347\u7248\u672C\uFF1BClaude Opus 5.5\uFF09\uFF1A\u97F3\u6548\uFF08GS GM 116\u2013128\uFF09\u4E0A\u573A\u65F6\u4ECE\u76EE\u5F55\u6309\u503C\u6284\u7684\u2014\u2014key = \u539F\u901F\u952E\u3001midi = \u539F\u901F\u65F6\u542C\u5230\u7684\u6700\u5F3A\u9891\u7387\uFF08\u6709\u97F3\u9AD8\u624D\u6709\uFF09\u3001\n       *  centsPerKey = \u6BCF\u952E\u51E0\u97F3\u5206\uFF1Balign = \u5173\u6389\u56FA\u5B9A\u539F\u901F\u540E\u6309\u5199\u7684\u97F3\u53CD\u7B97\u952E\uFF08src/gm/sf-key.ts\uFF09\u3002user\u300C\u56FA\u5B9A\u539F\u901F\u540C\u610F\uFF0C\u9ED8\u8BA4\u5F00\u3002\u78B0\u5230\u732B\u53EB\u6B4C\u624D\u5173\uFF0C\u4F46\u8FD9\u4E2A\u65F6\u5019\u4E5F\u8BB8\u9700\u8981\u97F3\u9AD8\u4FEE\u6B63\u300D\u3002 */\n      sfx?: { key: number; midi?: number; centsPerKey?: number; align?: boolean } }\n  | { engine: \"unknown\"; [k: string]: unknown };                                        // \u522B\u5BB6\u8C31\u539F\u6765\u7684\u4E50\u5668 / \u8FD9\u4E00\u7248\u4E0D\u8BA4\u8BC6\u7684\uFF1A\u6574\u4EFD\u539F\u6837\u5199\u56DE\uFF0C\u4E0A\u573A = \u6CA1\u4EBA\u3001\u4E0D\u51FA\u58F0\n/** SoundFont \u7684\u6765\u6E90\uFF08\u5951\u7EA6 \u00A710.2 \u6837\u672C\u7C7B by value\uFF09\u3002\n *  embedded = \u5B50\u96C6\u5B57\u8282\u5728\u6B4C\u91CC\u7684\u8DEF\u5F84\uFF08\u5F3A\u5F15\u7528\uFF0C\u9ED8\u8BA4\uFF09\uFF1Bnull = **\u5F31\u5F15\u7528**\uFF08user 2026-10-07\uFF1A\u5927\u7684\u53EF\u4EE5\u4E0D\u5D4C\uFF0C\u300C\u5141\u8BB8\u4E00\u4E2A\u5F31\u5F15\u7528\u81EA\u5DF1\u53BB\u5B98\u65B9\u548C\u4EBA\u7684\u5730\u65B9\u62C9\u300D\uFF09\u2014\u2014\n *  \u6B4C\u91CC\u53EA\u8BB0\u6574\u5305 sha256 + (bank, program) + \u5B50\u96C6 sha256\uFF0C\u8981\u51FA\u58F0\u65F6\u6309\u987A\u5E8F\u627E\uFF1A\u6B4C\u91CC \u2192 \u672C\u6B21\u5185\u5B58 \u2192 \u5BB6\u65CF\u97F3\u6E90\u5E93\uFF08\u6309\u6574\u5305 sha256 \u5BF9\u6761\u76EE\uFF09\u2192 \u4EBA\u7684\u6587\u4EF6\uFF08\u6838 sha256\uFF09\uFF1B\n *  \u90FD\u627E\u4E0D\u5230 = \u6CA1\u4EBA\u4E0A\u573A\u3001\u62A5\u9519\u3001\u4EBA\u6362\uFF08= \u6362\u4EBA\u7684\u7A84\u63A5\u53E3\uFF0C\u745E\u58EB\u5976\u916A\u7B2C\u4E8C\u5C42\uFF1B\u7B2C\u4E00\u5C42 = \u54C8\u5E0C\u9489\u6B7B\uFF09\u3002\u5B50\u96C6\u5316\u786E\u5B9A\u6027 \u2192 \u627E\u5230\u6574\u5305\u5C31\u80FD\u5207\u51FA\u9010\u5B57\u8282\u76F8\u540C\u7684\u5B50\u96C6\uFF08\u6838 subsetSha256\uFF09\u3002 */\nexport interface Sf2Source {\n  embedded: string | null;\n  subsetBytes: number;\n  subsetSha256: string;\n  origin: { name: string; fileSha256: string; bytes: number; library?: string };   // \u4ECE\u54EA\u4E2A\u6574\u5305\u5207\u7684\uFF1Blibrary = \u5BB6\u65CF\u97F3\u6E90\u5E93 pwa-sounds \u7684\u76EE\u5F55 id\uFF08\u97F3\u6E90\u4E0D\u662F AI \u6A21\u578B\uFF0C\u4E0D\u8D70 pwa-models\uFF09\n}\nexport interface Credit { attribution: string[]; license: { name: string; url?: string; text?: string; textSha256?: string } }\nexport type Spec =\n  | { kind: \"standard\"; name: string; version: string }\n  | { kind: \"ours\"; doc: string; source: { repo: string; ref: string; path: string } }   // ref = \u7248\u672C\u53F7 / commit\uFF1Bdoc = vault README \u7684\u7AE0\u8282\u951A\n  | { kind: \"unknown\" };\n/** \u4E00\u4E2A\u6548\u679C\uFF082026-10-10 \u5200 4 \u5B9A\u5F62\uFF1B\u539F\u8349\u7A3F\u7684 engine / owner \u53BB\u6389\u2014\u2014\u5F15\u64CE\u968F app \u53D1\u3001\u4E3B\u4EBA\u5C31\u662F\u5B83\u5728\u54EA\u6761\u94FE\u4E0A\uFF09\uFF1Akind \u89C1 src/engine/fx.ts FX_KINDS\uFF08eq / comp / delay / reverb / gain\u2026\uFF1B\n *  \u4E0D\u8BA4\u8BC6\u7684 = \u4E0D\u51FA\u58F0\u3001\u539F\u6837\u5E26\u7740\u3001\u754C\u9762\u753B\u7070\uFF09\uFF1Bparams \u6309 kind \u7684\u53C2\u6570\u8868\uFF08\u91CF\u7EB2 / \u516C\u5F0F\u5728\u90A3\u5F20\u8868\u91CC\uFF0Cvault \u81EA\u63CF\u8FF0\uFF09\uFF1Bon = false \u65C1\u901A\uFF1Bkey = \u538B\u7F29\u5668\u7684\u4FA7\u94FE\u6765\u6E90\uFF08\u8F68 id\uFF09\u3002 */\nexport interface FxV2 { id: string; kind: string; on?: boolean; params: Record<string, number>; key?: string; note?: string }\n\n// \u2500\u2500\u2500 \u4F11\u606F\u5BA4 v1\uFF08\u53EA\u7ED9\u8FC1\u79FB\u5BF9\u7167\uFF1Bmigrate/index.ts loungeV1toV2\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nexport interface LoungeRoleV1 { version: 1; id: string; name: string; sound: string; active: string; candidates: CandidateV1[] }\nexport interface CandidateV1 {\n  id: string; name: string;\n  gm: { program: number | null; variant: string | null };   // variant \"tsukuyomi\" / \"tsukuyomi-vowels\" = \u6708\u8BFB\u7684\u4E24\u4E2A\u5019\u9009\n  hum?: Hum;                           // \u6708\u8BFB\u7684\u624D\u6709\n  calibrationDb: number; chain: unknown[]; engines: Record<string, unknown>;\n  source?: { kind: \"sf2\"; embedded: string | null; bank: number; program: number; origin: Sf2Source[\"origin\"]; subsetBytes: number; subsetSha256?: string };   // v0.4.0\u20130.4.2 \u7684 GM \u5019\u9009\n  credit?: Credit; spec?: Spec;\n}\n\n// \u2550\u2550\u2550 \u63D0\u6848\uFF08\u672A\u5199\u5165\u6587\u4EF6\uFF1B\u591A\u8F68 / \u66F2\u7EBF / \u5F55\u97F3\u623F\u843D\u5730\u65F6\u6539 FORMAT + migrate + \u51BB\u7ED3\u6837\u672C\uFF09\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// user \u88C1\u51B3\uFF082026-10-07\uFF0C\u5951\u7EA6\u8349\u7A3F \u00A77.7 / \u00A77.8 / \u00A76\u00BE / \u00A78\uFF09\uFF1A\n//   \u2460 \u66F2\u7EBF\u662F\u771F\u76F8\uFF1A\u7EDD\u5BF9\u503C\u3001SI\uFF1B\u8C31\u4E0A\u7684 mp / mf / < > / \u8DF3\u97F3 / \u91CD\u97F3\u4ECE\u66F2\u7EBF\u7B97\u51FA\u6765\u5199\u8FDB MusicXML\uFF08\u4F4E\u4FDD\u771F\u53EF\u89C6\u5316 + \u5907\u4EFD\uFF09\uFF1B\u9ED8\u8BA4\u6F14\u7ECE\u4E0D\u85CF\u5728 app\uFF0C\n//      \u4E00\u4E2A\u97F3\u6CA1\u753B\u66F2\u7EBF\u5C31\u7528\u5019\u9009\u5FEB\u7167\u91CC\u5199\u660E\u7684\u9ED8\u8BA4\u6570\u3002\n//   \u2461 \u8C03\u53F7 / \u62CD\u53F7 = \u5404\u58F0\u90E8\u81EA\u5DF1\u7684\u753B\u6CD5\uFF0C\u4E0D\u5171\u4EAB\u3001\u4E0D\u5F71\u54CD\u6E32\u67D3\uFF1B\u771F\u76F8 = \u97F3\u7B26 + \u5C0F\u8282\u7EBF\uFF08\u5BF9\u9F50\u6807\u8BB0\uFF09\u3002\u901F\u5EA6\u4F4F\u7B2C\u4E00\u58F0\u90E8\u3001\u4ECD\u662F\u72B6\u6001\u673A\u3002\n//   \u2462 \u7EB8 = \u66F2\u6BB5\uFF0C\u5B58\u6CD5 B\uFF1A\u4E00\u5F20\u7EB8\u4E00\u4EFD MusicXML\uFF08`.moonsinger/papers/<id>.musicxml`\uFF0C\u5143\u6570\u636E\u6BCF\u7EB8\u81EA\u5E26\uFF09+ \u4E00\u4EFD\u6D3E\u751F\u538B\u5E73\u7684 score.musicxml \u7ED9\u522B\u7684\u8F6F\u4EF6\u3002\uFF080.5.0 \u5DF2\u843D\u5730\uFF09\n//   \u2463 \u4F11\u606F\u5BA4\u662F\u6B4C\u7684\u4E00\u90E8\u5206\uFF08\u4E0D\u505A\u8DE8\u6B4C\u7B14\u67B6\uFF09\uFF1B\u65B0\u5EFA\u89D2\u8272\u4ECE app \u5185\u7F6E\u9884\u8BBE by value \u62F7\u8FDB\u6B4C\uFF1B\u6E32\u67D3 = \u7EAF\u51FD\u6570(\u6587\u4EF6)\u3002\n\n// \uFF08score.json \u7B2C 2 \u7248 2026-10-08 \u5DF2\u843D\u5730\uFF0C\u89C1\u4E0A\u300C\u73B0\u5F79\u300D\u3002\uFF09\n\n/** `.moonsinger/curves.json`\uFF08\u65B0\u6587\u4EF6\uFF09\uFF1A\u66F2\u7EBF = \u771F\u76F8\u3002\u6309\u97F3\u7B26 id\uFF1B\u65F6\u95F4 = \u97F3\u91CC 0\u20131\uFF1B\u6570\u503C**\u7EDD\u5BF9**\u3001\u5355\u4F4D\u5199\u660E\uFF08SI \u515C\u5E95\uFF09\u3002 */\nexport interface CurvesV1 {\n  version: 1;\n  /** \u6BCF\u4E2A\u53C2\u6570\u7684\u5355\u4F4D\uFF08\u7B2C 7 \u9898\u4E09\u7C7B + SI \u515C\u5E95\uFF09\uFF1A\u97F3\u91CF \"dB\"\u3001\u97F3\u9AD8 \"cent\"\uFF08\u76F8\u5BF9\u8C31\u4E0A\u5199\u7684\u97F3\uFF09\u3001\u97F3\u8272\u65CB\u94AE \"knob\"\uFF08\u22121\u2026+1\uFF0C0 = \u5019\u9009\u672C\u8272\uFF09\u3001\u5176\u4F59 SI \u5355\u4F4D\u540D\u3002 */\n  units: Record<string, CurveUnit>;\n  /** \u97F3\u7B26 id \u2192 \u53C2\u6570\u540D \u2192 \u6298\u7EBF\u70B9 [t(0\u20131), value]\u3002\u6CA1\u6709\u8FD9\u6761\u66F2\u7EBF\u7684\u97F3 = \u7528\u5019\u9009\u5FEB\u7167\u91CC\u7684\u9ED8\u8BA4\u6570\uFF08CandidateV2.defaults\uFF09\u3002 */\n  notes: Record<string, Record<string, [number, number][]>>;\n}\nexport type CurveUnit = \"dB\" | \"cent\" | \"knob\" | (string & {});\n\n/** studio.json \u7B2C 2 \u7248\uFF1A\u9EA6\u514B\u98CE \u2192 \u603B\u7EBF \u2192 \u603B\u8F93\u51FA\uFF1B\u4FA7\u94FE\uFF1B\u4EBA\u5F55\u7684\u97F3\u9891\uFF08\u00A78\uFF0C\u975E\u7834\u574F\u6027\uFF09\u3002\u65F6\u95F4\u7EBF\u81EA\u52A8\u5316\uFF08\u6309\u5C0F\u8282:\u62CD\uFF09\u4EE5\u540E\u52A0\u3002 */\n", "// sha256-sync.ts \u2014\u2014 \u540C\u6B65\u7684 SHA-256\uFF08\u5341\u516D\u8FDB\u5236\uFF09\u3002created 2026-10-16 by Claude Fable 5.1\n//   \u4E3A\u4EC0\u4E48\u4E0D\u7528 crypto.subtle\uFF1AsaveMxl\uFF08src/format/project.ts\uFF09\u662F\u540C\u6B65\u51FD\u6570\uFF08\u6D4B\u8BD5 / \u51BB\u7ED3\u811A\u672C / \u672C\u673A\u5199\u56DE\u90FD\u540C\u6B65\u8C03\uFF09\uFF0C\u5B9A\u7A3F\u7684\u5185\u5BB9\u6307\u7EB9\u8981\u5728\u5B83\u91CC\u9762\u7B97\uFF1B\n//   crypto.subtle \u53EA\u6709\u5F02\u6B65\u9762\u3002\u6807\u51C6\u7B97\u6CD5\uFF08FIPS 180-4\uFF09\uFF0Ctest/final.test.ts \u7528 node:crypto \u5BF9\u7167\u3002\u53EA\u7ED9\u5C0F\u5B57\u8282\uFF08\u51E0\u5341 KB \u7684 JSON / XML\uFF09\uFF0C\u5927\u6587\u4EF6\u7167\u65E7\u8D70 src/sources/sha256.ts\u3002\nconst K = new Uint32Array([\n  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\nconst rotr = (x: number, n: number) => (x >>> n) | (x << (32 - n));\n\n/** \u5B57\u8282 \u2192 sha256 \u5341\u516D\u8FDB\u5236\uFF0864 \u4E2A\u5B57\u7B26\uFF09\u3002 */\nexport function sha256HexSync(data: Uint8Array): string {\n  const len = data.length, bitLen = len * 8;\n  const padded = new Uint8Array(((len + 9 + 63) >> 6) << 6);\n  padded.set(data); padded[len] = 0x80;\n  const dv = new DataView(padded.buffer);\n  dv.setUint32(padded.length - 8, Math.floor(bitLen / 0x100000000)); dv.setUint32(padded.length - 4, bitLen >>> 0);\n  const H = new Uint32Array([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]);\n  const W = new Uint32Array(64);\n  for (let o = 0; o < padded.length; o += 64) {\n    for (let i = 0; i < 16; i++) W[i] = dv.getUint32(o + i * 4);\n    for (let i = 16; i < 64; i++) {\n      const s0 = rotr(W[i - 15], 7) ^ rotr(W[i - 15], 18) ^ (W[i - 15] >>> 3), s1 = rotr(W[i - 2], 17) ^ rotr(W[i - 2], 19) ^ (W[i - 2] >>> 10);\n      W[i] = (W[i - 16] + s0 + W[i - 7] + s1) >>> 0;\n    }\n    let a = H[0], b = H[1], c = H[2], d = H[3], e = H[4], f = H[5], g = H[6], h = H[7];\n    for (let i = 0; i < 64; i++) {\n      const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25), ch = (e & f) ^ (~e & g), t1 = (h + S1 + ch + K[i] + W[i]) >>> 0;\n      const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22), maj = (a & b) ^ (a & c) ^ (b & c), t2 = (S0 + maj) >>> 0;\n      h = g; g = f; f = e; e = (d + t1) >>> 0; d = c; c = b; b = a; a = (t1 + t2) >>> 0;\n    }\n    H[0] = (H[0] + a) >>> 0; H[1] = (H[1] + b) >>> 0; H[2] = (H[2] + c) >>> 0; H[3] = (H[3] + d) >>> 0; H[4] = (H[4] + e) >>> 0; H[5] = (H[5] + f) >>> 0; H[6] = (H[6] + g) >>> 0; H[7] = (H[7] + h) >>> 0;\n  }\n  let out = \"\"; for (let i = 0; i < 8; i++) out += H[i].toString(16).padStart(8, \"0\");\n  return out;\n}\n/** \u5B57\u7B26\u4E32\uFF08UTF-8\uFF09\u2192 sha256 \u5341\u516D\u8FDB\u5236\u3002 */\nexport const sha256TextSync = (s: string): string => sha256HexSync(new TextEncoder().encode(s));\n", "// final.ts \u2014\u2014 \u5B9A\u7A3F / \u6539\u7A3F\uFF08W-38\uFF1Buser 2026-10-13\u300C\u8BB0\u8D26 moonsinger\u52A0\u4E00\u4E2A\u9501\u529F\u80FD\uFF0C\u5199\u597D\u4E86\u4E4B\u540E\u52A0\u9501\uFF0C\u4F1A\u6E32\u67D3mp3\uFF0C\u4E4B\u540E\u53EA\u80FD\u542C\uFF0C\u4E0D\u80FD\u4FEE\u6539\u2026\u89E3\u9501\u4E4B\u540Emp3\u81EA\u52A8cache invalid\u300D\n//   \u300C\u60F3\u4E00\u4E2A\u6BD4\u9501\u8BED\u4E49\u66F4\u51C6\u786E\u7684\u540D\u5B57\u300D\u2192\u300C\u5B9A\u7A3F\u6539\u7A3F\u540C\u610F\u300D\uFF09\u3002created 2026-10-16 by Claude Fable 5.1\u3002\n//   \u5B9A\u7A3F = \u6E32\u67D3\u6210 mp3\uFF08\u5E26 ID3 \u6807\u7B7E + \u5C01\u9762\u56FE\uFF09\u5B58\u8FDB\u6B4C\u91CC\uFF08`.moonsinger/final.mp3`\uFF0C\u4E0D\u538B\u7F29\uFF09+ \u603B\u76EE\u5F55\u91CC\u4E00\u6761 FinalRecord\uFF1B\u4E4B\u540E**\u6574\u9996\u9501\u4F4F**\uFF08\u8C31 / \u6B4C\u540D / \u4F5C\u8005\u680F / \u8BB8\u53EF / \u5C01\u9762 / \u6B4C\u624B / \u6DF7\u97F3\uFF1Buser 2026-10-16\u300C\u90FD\u51BB\u540C\u610F\uFF0C\u5C01\u9762\u5F53\u7136\u8FDB\u300D\uFF09\uFF0C\u53EA\u80FD\u542C\uFF1B\u6539\u7A3F = \u8BB0\u5F55\u548C mp3 \u4E00\u8D77\u4E22\u6389\u3002\n//   \u8FD9\u4E00\u5C42\u53EA\u7BA1**\u6587\u4EF6\u91CC\u7684\u771F\u76F8**\uFF1A\u8BB0\u5F55\u7684\u5F62\u72B6\u3001\u51FA\u58F0\u5185\u5BB9\u7684\u6307\u7EB9\uFF08\u5B9A\u7A3F\u540E\u88AB\u8C01\u6539\u8FC7\u4E00\u773C\u80FD\u770B\u51FA\uFF09\u3001mp3 entry \u7684\u4F4D\u7F6E\u3002\u9501\u672C\u8EAB\u5206\u56DB\u5C42\u6267\u6CD5\uFF08user 2026-10-16\n//   \u300C\u5B9A\u7A3F\u7684\u65F6\u5019\u5F97\u4ECE\u591A\u4E2A\u7A84\u63A5\u53E3\u4E0A\u62A4\u680F\u4F4F\u5199\u5165\uFF0C\u751A\u81F3store\u7EA7\u522B\u300D\uFF09\uFF1A\u2460 UI\uFF08\u542C\u6A21\u5F0F\u9489\u6B7B\u3001\u94AE\u7070\uFF09\u2461 \u72B6\u6001\u5165\u53E3\uFF08main.ts update / updateExtras / undo \u62D2\u7EDD\uFF09\n//   \u2462 \u683C\u5F0F\uFF08saveMxl\uFF1A\u6307\u7EB9\u5BF9\u4E0D\u4E0A\u5C31\u629B\uFF0Csrc/format/project.ts\uFF09\u2463 store \u63A5\u7F1D\uFF08editor-session \u843D\u76D8\u524D\u7684\u95E8\uFF09\u3002\u6BCF\u5C42\u5404\u81EA\u627F\u91CD\uFF0C\u4E0D\u4E92\u76F8\u6258\u4ED8\u3002\nimport { sha256TextSync, sha256HexSync } from \"./sha256-sync.ts\";\n\n/** \u5B9A\u7A3F mp3 \u5728 zip \u91CC\u7684\u4F4D\u7F6E\uFF08\u4E0D\u538B\u7F29\uFF1B\u6B4C\u5E93\u9760 store getPeek \u6309 entry \u540D\u6293\uFF09\u3002 */\nexport const FINAL_MP3_ENTRY = \".moonsinger/final.mp3\";\n\n/** \u603B\u76EE\u5F55 `manifest.final`\uFF1A\u8FD9\u9996\u6B4C\u5B9A\u7A3F\u7684\u90A3\u4E00\u523B\u8BB0\u4E86\u4EC0\u4E48\u3002 */\nexport interface FinalRecord {\n  /** ISO \u65F6\u523B\u3002 */\n  at: string;\n  /** \u8FD9\u9996\u6B4C\u81EA\u5DF1\u7684\u5B9A\u7A3F\u7248\u672C\u53F7\uFF1A\u6BCF\u6B21\u5B9A\u7A3F +1\uFF08\u6539\u7A3F\u4E0D\u51CF\uFF1Buser 10-13\u300C\u6211\u662F\u8BF4\u6B4C\u7684\u81EA\u589E\u7248\u672C\u53F7\u300D\uFF09\u3002 */\n  rev: number;\n  /** \u5B9A\u7A3F\u65F6\u7684 app \u7248\u672C\uFF08\u58F3\uFF1B\u53EA\u662F\u8BB0\u4E00\u7B14\uFF09\u3002 */\n  app: string;\n  /** \u5B9A\u7A3F\u65F6\u7684\u6E32\u67D3\u6838\u5FC3\uFF08src/core/version.ts\uFF09\uFF1Aversion \u4EBA\u5B9A\u3001hash \u6784\u5EFA\u65F6\u6309\u6838\u5FC3\u6E90\u7801\u7B97\u3002\u60F3\u590D\u73B0\u8FD9\u4EFD mp3 = \u7528\u8FD9\u4E00\u7248\u6838\u5FC3\uFF08user\u300C\u8FD8\u53EF\u4EE5\u9501\u5F15\u64CE\u7684\u7248\u672C\u300D\uFF09\u3002 */\n  core: { version: string; hash: string };\n  /** \u5B9A\u7A3F\u90A3\u4E00\u523B\u51FA\u58F0\u5185\u5BB9\u7684\u6307\u7EB9\uFF08contentFingerprint\uFF09\uFF1A\u5BF9\u4E0D\u4E0A = \u5B9A\u7A3F\u540E\u88AB\u6539\u8FC7\uFF08\u65E7\u7248 app / \u522B\u7684\u8F6F\u4EF6\uFF09\u2192 \u8FD9\u4EFD mp3 \u4E0D\u7B97\u6570\u3001\u6253\u5F00\u65F6\u4F5C\u5E9F\u3002 */\n  fingerprint: string;\n  /** \u5B58\u8FDB\u6B4C\u91CC\u7684 mp3\uFF1A\u8DEF\u5F84\u3001\u5B57\u8282\u6570\u3001sha256\u3001\u79D2\u6570\u3001\u53C2\u6570\u3002 */\n  mp3: { path: string; bytes: number; sha256: string; secs: number; sr: number; kbps: number; stereo: boolean };\n  /** \u8FDB\u4E86 mp3 \u7684\u58F0\u90E8\uFF08\u9759\u97F3 / \u72EC\u594F\u6309\u5B9A\u7A3F\u90A3\u4E00\u523B\u7684\u89C6\u56FE\uFF1Buser \u542C\u5230\u4EC0\u4E48\u5C31\u5B9A\u7A3F\u4EC0\u4E48\uFF09\u3002 */\n  parts: string[];\n  /** \u5B9A\u7A3F\u90A3\u4E00\u523B\u4E0D\u51FA\u58F0\u7684\u58F0\u90E8\uFF08\u00A72.2\u00BD \u6E05\u5355\uFF1Bmp3 \u91CC\u6CA1\u6709\u5B83\u4EEC\uFF09\u3002 */\n  issues?: { part: string; why: string }[];\n}\n\n/** \u5B9A\u7A3F\u5185\u5BB9\u7684\u6307\u7EB9\u7684\u539F\u6599\uFF1AsaveMxl \u5199\u51FA\u6765\u7684 / openBytes \u8BFB\u8FDB\u6765\u7684\u90A3\u51E0\u4EFD**\u5B57\u7B26\u4E32 + \u5C01\u9762\u5B57\u8282**\uFF08\u540C\u4E00\u4EFD\u6587\u4EF6\u4E24\u8FB9\u7B97\u51FA\u6765\u4E00\u6837\uFF09\u3002\n *  **\u5168\u51BB**\uFF08user 2026-10-16\u300C\u90FD\u51BB\u540C\u610F\uFF0C\u5C01\u9762\u5F53\u7136\u8FDB\u300D\uFF09\uFF1A\u6BCF\u5F20\u7EB8\u7684 MusicXML \u6574\u4EFD\uFF08\u97F3 + \u8BB0\u53F7 + \u6B4C\u8BCD + \u6B4C\u540D + \u66F2\u6BB5\u540D + \u4F5C\u8005\u680F + \u8BB8\u53EF + \u7EB8\u7684\u5927\u5C0F\uFF1B\u53EA\u5265\u6389 <encoding>\u2014\u2014\u8F6F\u4EF6\u7248\u672C\u548C\u65E5\u671F\u6BCF\u6B21\u5B58\u90FD\u53D8\uFF09\u3001\n *  \u8C31\u7684\u6269\u5C55\uFF08\u7F16\u6392 / \u53E5\u53F7 / \u8D77\u4F0F / \u9690\u85CF / \u58F0\u90E8\u8868 / \u6B4C\u8BCD\u6392\u6CD5 / \u5C0F\u8282\u53F7\uFF09\u3001\u4F11\u606F\u5BA4\uFF08\u8C01\u4E0A\u573A\u3001\u600E\u4E48\u6F14\u3001\u54FC\u7684\u5B57\uFF09\u3001\u5F55\u97F3\u623F\uFF08\u63A8\u5B50 / \u6548\u679C / \u603B\u8F68\uFF09\u3001\u5D4C\u7684\u97F3\u6E90\uFF08\u8DEF\u5F84\u91CC\u6709 sha256\uFF09\u3001\u5C01\u9762 PNG\u3002\n *  \u4E0D\u8FDB\u6307\u7EB9\u7684\u53EA\u6709\uFF1A\u89C6\u56FE\u6001\uFF08score.json \u7684 view\uFF09\u3001\u6587\u4EF6\u540D\u3001\u53C2\u8003\u7A97\u3002 */\nexport interface FingerprintParts {\n  /** \u7EB8 id \u2192 \u8FD9\u5F20\u7EB8\u7684 MusicXML \u5168\u6587\uFF08\u6309\u7EB8 id \u6392\u5E8F\u540E\u7B97\uFF09\u3002 */\n  papers: Record<string, string>;\n  /** score.json \u7684 JSON \u6587\u672C\uFF08\u542B view \u4E5F\u884C\uFF0C\u8FD9\u91CC\u4F1A\u53BB\u6389\uFF09\u3002 */\n  scoreExt: string;\n  /** \u89D2\u8272 id \u2192 \u4F11\u606F\u5BA4 JSON \u6587\u672C\u3002 */\n  lounge: Record<string, string>;\n  /** studio.json \u7684 JSON \u6587\u672C\u3002 */\n  studio: string;\n  /** \u5D4C\u7684\u97F3\u6E90\u7684\u8DEF\u5F84\uFF08\u8DEF\u5F84\u91CC\u6709 sha256\uFF09\u3002 */\n  sounds: string[];\n  /** \u5C01\u9762 PNG \u7684\u5B57\u8282\uFF08\u6CA1\u6709 = null\uFF09\u3002 */\n  thumbnail: Uint8Array | null;\n}\nconst ENCODING = /<encoding>[\\s\\S]*?<\\/encoding>\\s*/g;\n/** MusicXML \u53EA\u53BB\u6389 <encoding>\uFF08\u8F6F\u4EF6\u7248\u672C + \u65E5\u671F\uFF0C\u6BCF\u6B21\u5B58\u90FD\u53D8\uFF09\uFF1A\u522B\u7684\u5168\u7B97\u5B9A\u7A3F\u7684\u5185\u5BB9\u3002 */\nexport function strippedXml(xml: string): string { return xml.replace(ENCODING, \"\"); }\n/** score.json \u53BB\u6389 view\uFF08\u89C6\u56FE\u6001\u4E0D\u7B97\u5185\u5BB9\uFF09\uFF1B\u952E\u7684\u987A\u5E8F\u7167\u539F\u6587\u3002 */\nfunction scoreExtNoView(text: string): string {\n  const o = JSON.parse(text) as Record<string, unknown>;\n  if (\"view\" in o) delete o.view;\n  return JSON.stringify(o);\n}\n/** \u51FA\u58F0\u5185\u5BB9\u7684\u6307\u7EB9\uFF08sha256\uFF09\u3002\u7EAF\u51FD\u6570\uFF1A\u540C\u6837\u7684\u539F\u6599\u540C\u6837\u7684\u6307\u7EB9\u3002 */\nexport function contentFingerprint(p: FingerprintParts): string {\n  const papers = Object.keys(p.papers).sort().map((id) => [id, strippedXml(p.papers[id])]);\n  const lounge = Object.keys(p.lounge).sort().map((id) => [id, JSON.stringify(JSON.parse(p.lounge[id]))]);\n  const studio = JSON.stringify(JSON.parse(p.studio));\n  const thumbnail = p.thumbnail ? sha256HexSync(p.thumbnail) : null;\n  return sha256TextSync(JSON.stringify({ v: 2, papers, scoreExt: scoreExtNoView(p.scoreExt), lounge, studio, sounds: [...p.sounds].sort(), thumbnail }));\n}\n\n/** \u8BFB\u8FDB\u6765\u7684 manifest.final \u50CF\u4E0D\u50CF\u4E00\u6761\u8BB0\u5F55\uFF08\u65E7\u7248 / \u522B\u7684\u8F6F\u4EF6\u5199\u574F\u7684 = \u4E0D\u8BA4\uFF09\u3002 */\nexport function parseFinalRecord(v: unknown): FinalRecord | null {\n  if (!v || typeof v !== \"object\") return null;\n  const r = v as Record<string, unknown>, mp3 = r.mp3 as Record<string, unknown> | undefined, core = r.core as Record<string, unknown> | undefined;\n  if (typeof r.at !== \"string\" || typeof r.rev !== \"number\" || typeof r.fingerprint !== \"string\" || !mp3 || typeof mp3.path !== \"string\" || typeof mp3.bytes !== \"number\" || typeof mp3.sha256 !== \"string\") return null;\n  return {\n    at: r.at, rev: r.rev, app: String(r.app ?? \"\"), fingerprint: r.fingerprint,\n    core: { version: String(core?.version ?? \"\"), hash: String(core?.hash ?? \"\") },\n    mp3: { path: mp3.path, bytes: mp3.bytes, sha256: mp3.sha256, secs: Number(mp3.secs ?? 0), sr: Number(mp3.sr ?? 0), kbps: Number(mp3.kbps ?? 0), stereo: mp3.stereo !== false },\n    parts: Array.isArray(r.parts) ? r.parts.map(String) : [],\n    ...(Array.isArray(r.issues) ? { issues: (r.issues as { part: unknown; why: unknown }[]).map((i) => ({ part: String(i.part), why: String(i.why) })) } : {}),\n  };\n}\n", "// migrate/index.ts \u2014\u2014 `.moonsinger/` \u5404\u4EFD JSON \u7684\u7248\u672C\u8FC1\u79FB\uFF1A\u7B2C n \u7248 \u2192 \u7B2C n+1 \u7248\uFF0C\u6BCF\u6B65\u4E00\u4E2A\u7EAF\u51FD\u6570\uFF0C\u8BFB\u65F6\u94FE\u5F0F\u5347\u7EA7\u5230 FORMAT\u3002\n// created 2026-10-07 by Claude Fable 5.1\u3002\u89C4\u77E9\u89C1 src/format/contract.ts \u5934\u6CE8\u91CA\uFF08CatsUp \u7ACB\u5BAA\uFF09\u3002\n// \u52A0\u4E00\u6B65 = \u5728 MIGRATIONS[kind] \u672B\u5C3E push \u4E00\u4E2A\u51FD\u6570\uFF08\u4E0B\u6807 n-1 = \u4ECE\u7B2C n \u7248\u5347\u5230\u7B2C n+1 \u7248\uFF09\uFF1B\u5B88\u536B\u6D4B\u8BD5\u67E5 MIGRATIONS[kind].length === FORMAT[kind] - 1\u3002\n// \u5199\u6587\u4EF6\u6C38\u8FDC\u53EA\u5199\u5F53\u524D\u7248\uFF08project.ts\uFF09\uFF1B\u8FD9\u91CC\u53EA\u7BA1\u8BFB\u3002\nimport { FORMAT, type FormatFile } from \"../contract.ts\";\n/** lounge 1\u21922 \u8FC1\u79FB\u65F6\uFF082026-10-07\uFF09\u5C0F\u6708\u76F8\u5019\u9009\u7684 defaults \u662F\u7A7A\u7684\uFF1A\u8FC1\u79FB\u662F\u7EAF\u51FD\u6570\uFF0C\u4E0D\u8DDF TSUKUYOMI_DEFAULTS \u53D8\uFF082026-10-15 \u5B83\u6709\u4E86\u503C\uFF09\u3002 */\nconst TSUKUYOMI_DEFAULTS_V1: Record<string, number> = {};\nimport { ARTICULATION, SOUNDFONT_DEFAULTS, TSUKUYOMI_CREDIT, TSUKUYOMI_SPEC, VOWEL_SAMPLER_SPEC, SOUNDFONT_SPEC, TSUKUYOMI_MODEL } from \"../performance.ts\";\n/** \u8FC1\u79FB\u662F\u51BB\u7ED3\u7684\u7EAF\u51FD\u6570\uFF1A\u7528\u5F53\u5E74\u90A3\u5F20\u529B\u5EA6\u8868\uFF08v0.9.23 \u8D77 app \u7684\u9ED8\u8BA4\u8868\u591A\u4E86 ppp / fff\uFF0C\u4E0D\u80FD\u8BA9\u65E7\u6587\u4EF6\u8FC1\u51FA\u6765\u7684\u4E1C\u897F\u8DDF\u7740\u53D8\uFF09\u3002 */\nconst DYNAMICS_DB_V1 = { pp: -18, p: -12, mp: -6, mf: 0, f: 6, ff: 12 } as const;\n\nexport type Json = Record<string, unknown>;\n/** \u7B2C n \u7248 \u2192 \u7B2C n+1 \u7248\u7684\u7EAF\u51FD\u6570\uFF08\u4E0D\u78B0\u5165\u53C2\uFF1Bversion \u5B57\u6BB5\u7531 migrate() \u5199\uFF09\u3002 */\nexport type Migration = (json: Json) => Json;\n\nconst HUMS = new Set([\"la\", \"n\", \"u\", \"o\", \"a\"]);\n/** \u4F11\u606F\u5BA4 1 \u2192 2\uFF1A\u5019\u9009\u4ECE\u300C\u6708\u8BFB\u5F62\u72B6 + \u8D34\u5B57\u6BB5\u300D\u6539\u6210\u6309\u5F15\u64CE\u5206\u7684\u4E50\u5668\uFF08\u5951\u7EA6 CandidateV2 / InstrumentV2\uFF09\uFF0Cby value \u8865\u9F50\u529B\u5EA6\u8868 / \u6F14\u594F\u6CD5 / \u7F72\u540D / \u89C4\u683C\u3002\n *  v1 \u7684 hum / source / engines \u642C\u8FDB instrument\uFF1B\u6CA1\u89C1\u8FC7\u7684\u5019\u9009 = engine \"unknown\"\uFF0C\u6574\u4EFD\u539F\u6837\u7559\u3002 */\nfunction loungeV1toV2(json: Json): Json {\n  const cands = ((json.candidates as Json[] | undefined) ?? []).map((c0): Json => {\n    const c = { ...c0 }, gm = (c.gm ?? {}) as Json, src = c.source as Json | undefined, engines = (c.engines ?? {}) as Json;\n    const hum = HUMS.has(String(c.hum)) ? String(c.hum) : \"n\";\n    delete c.hum; delete c.source; delete c.engines; delete c.credit; delete c.spec;\n    const common = { calibrationDb: Number(c0.calibrationDb ?? 0), chain: (c0.chain as unknown[] | undefined) ?? [], dynamicsDb: { ...DYNAMICS_DB_V1 }, articulation: { ...ARTICULATION } };\n    if (gm.variant === \"tsukuyomi\") return { ...c, ...common, instrument: { engine: \"tsukuyomi\", model: { ...TSUKUYOMI_MODEL }, hum }, defaults: { ...TSUKUYOMI_DEFAULTS_V1 }, credit: structuredClone(TSUKUYOMI_CREDIT), spec: structuredClone(TSUKUYOMI_SPEC), ...(Object.keys(engines).length ? { engines } : {}) };\n    if (gm.variant === \"tsukuyomi-vowels\") return { ...c, ...common, instrument: { engine: \"vowel-sampler\", table: \"builtin\", hum }, defaults: {}, credit: structuredClone(TSUKUYOMI_CREDIT), spec: structuredClone(VOWEL_SAMPLER_SPEC), ...(Object.keys(engines).length ? { engines } : {}) };\n    if (src?.kind === \"sf2\") {\n      const embedded = typeof src.embedded === \"string\" ? src.embedded : null;\n      const subsetSha256 = typeof src.subsetSha256 === \"string\" ? src.subsetSha256 : embedded ? embedded.slice(embedded.lastIndexOf(\"/\") + 1).replace(/\\.sf2$/, \"\") : \"\";\n      return { ...c, ...common, instrument: { engine: \"soundfont\", bank: Number(src.bank), program: Number(src.program), source: { embedded, subsetBytes: Number(src.subsetBytes ?? 0), subsetSha256, origin: src.origin ?? { name: \"\", fileSha256: \"\", bytes: 0 } } },\n        defaults: { ...SOUNDFONT_DEFAULTS }, credit: (c0.credit as Json | undefined) ?? { attribution: [], license: { name: \"unknown\" } }, spec: (c0.spec as Json | undefined) ?? structuredClone(SOUNDFONT_SPEC), ...(Object.keys(engines).length ? { engines } : {}) };\n    }\n    return { ...c, ...common, instrument: { engine: \"unknown\", engines }, defaults: {}, credit: (c0.credit as Json | undefined) ?? { attribution: [], license: { name: \"unknown\" } }, spec: (c0.spec as Json | undefined) ?? { kind: \"unknown\" } };\n  });\n  return { ...json, candidates: cands };\n}\n\n/** \u603B\u76EE\u5F55 1 \u2192 2\uFF1A\u52A0 derived\uFF08\u7B2C 1 \u7248\u7684 score.musicxml \u662F\u6B63\u672C\u3001\u4E0D\u662F\u6D3E\u751F\u4EF6\u2014\u2014\u4F46\u8BFB\u7B2C 1 \u7248\u6587\u4EF6\u65F6\u7EB8 p1 \u5C31\u662F\u4ECE\u5B83\u8BFB\u7684\uFF0C\u5B58\u6863\u540E\u5B83\u624D\u53D8\u6D3E\u751F\u4EF6\uFF09\u3002 */\nconst manifestV1toV2 = (json: Json): Json => ({ ...json, derived: [] });\n/** \u8C31\u7684\u6269\u5C55 1 \u2192 2\uFF08\u5B58\u6CD5 B\uFF09\uFF1A\u6574\u9996\u4E00\u4EFD score.musicxml \u2192 \u4E00\u5F20\u7EB8 p1\uFF08\u6587\u4EF6\u7EA7\u8FC1\u79FB\u5728 project.ts openBytes\uFF1A\u5305\u91CC\u6CA1\u6709 papers/p1.musicxml \u5C31\u8BFB score.musicxml\uFF09\uFF1B\u58F0\u90E8\u5E76\u96C6\u52A0 kind\u3002 */\nfunction scoreV1toV2(json: Json): Json {\n  const parts = ((json.parts as Json[] | undefined) ?? []).map((p, k) => ({ id: String(p.id ?? `P${k + 1}`), role: String(p.role ?? `r${k + 1}`), mic: String(p.mic ?? `m${k + 1}`), kind: \"pitched\" }));\n  const manualBars = (json.manualBars as Record<string, number[]> | undefined) ?? {};\n  return { papers: [{ id: \"p1\", file: \".moonsinger/papers/p1.musicxml\", manualBars: { ...manualBars }, unwritten: [...((json.unwritten as string[] | undefined) ?? [])] }], parts };\n}\n\n/** \u5F55\u97F3\u623F 1 \u2192 2\uFF082026-10-10 \u5200 4\uFF09\uFF1A\u6BCF\u4E2A\u9EA6\u514B\u98CE \u2192 \u4E00\u6761 mic \u8F68\uFF08\u7A7A\u94FE\u3001\u4E0D\u53D1\u9001\u3001\u76F4\u901A\u603B\u8F68\uFF09\uFF1B\u603B\u8F68\u8865\u4E0A\u94FE\uFF08v1 \u7684 master \u53EF\u9009\u5B57\u6BB5\u7167\u642C\uFF09\u3002 */\nfunction studioV1toV2(json: Json): Json {\n  const mics = (json.mics as Json[] | undefined) ?? [], m = (json.master as Json | undefined) ?? {};\n  return {\n    tracks: mics.map((x) => ({ id: String(x.id), kind: \"mic\", name: String(x.name ?? \"\"), gainDb: Number(x.gainDb ?? 0), pan: Number(x.pan ?? 0), chain: [], sends: [], to: \"master\" })),\n    master: { gainDb: Number(m.gainDb ?? 0), limiter: m.limiter === undefined ? true : !!m.limiter, chain: [] },\n  };\n}\n\nexport const MIGRATIONS: Record<FormatFile, Migration[]> = {\n  manifest: [manifestV1toV2],\n  score: [scoreV1toV2],\n  lounge: [loungeV1toV2],\n  studio: [studioV1toV2],\n};\n\n/** \u8BFB\u8FDB\u6765\u7684\u4E00\u4EFD json \u5347\u5230\u8FD9\u4E00\u7248\u3002\u6BD4\u8FD9\u4E00\u7248\u65B0\u7684\u4E0D\u5F52\u8FD9\u91CC\uFF08\u8C03\u7528\u65B9\u5148\u62D2\u5F00\uFF09\uFF1B\u6CA1\u6709 version \u5F53\u7B2C 1 \u7248\u3002 */\nexport function migrate(kind: FormatFile, json: Json): Json {\n  let v = Number(json.version ?? 1), out = json;\n  while (v < FORMAT[kind]) {\n    const step = MIGRATIONS[kind][v - 1];\n    if (!step) throw new Error(`[format] no migration for ${kind} v${v} -> v${v + 1}`);\n    out = { ...step(out), version: v + 1 };\n    v++;\n  }\n  return out;\n}\n", "// credits.ts \u2014\u2014 \u7F72\u540D / \u8BB8\u53EF\u8BC1\u63A8\u6F14\uFF08\u7EAF\u51FD\u6570\uFF09\uFF1A\u7528\u5230\u4E86\u8C01\u7684\u58F0\u97F3\uFF0C\u63A8\u6210\u4E00\u6BB5\u6700\u5C0F\u7684\u7F72\u540D\u6587\u5B57\u3002created 2026-10-08 by Claude Opus 5.5\n// user 2026-10-08\u300Cwishlist\uFF1A\u5BFC\u51FA\u548C\u4FDD\u5B58\uFF08\u5305\u62ECpack, unpack\uFF09\u7684\u65F6\u5019\u52A0\u4E00\u4E2Alicense\u548Ccredit\u63A8\u6F14\u5DE5\u5177\uFF0C\u53EA\u7528\u6700minimal\u7684\u3002reference\u91CC\u9762\u7684\u4E1C\u897F\u4E0D\u7B97\u300D\uFF1B\n//   \u53E3\u5F84\uFF08user \u5F53\u5929\u6F84\u6E05\uFF09\uFF1A\u300Creference \u91CC\u9762\u7684\u4E1C\u897F\u4E0D \u6211\u8BF4\u7684\u662F\u672A\u6765\u7684\u53C2\u8003\u7A97\u300D\u300C\u6211\u89C9\u5F97\u7B97\u51FA\u6765\u7684\u662F\u4F60\u6E32\u67D3\u7684mp3\u7528\u4E86\u8C01\u7684\u3002\u6240\u4EE5\u51B7\u677F\u51F3\u7684\u4E0D\u7B97\u3002\u4F46\u662F\u53C2\u52A0\u4E86\u6F14\u51FA\u7684\u4E0D\u7BA1\u662F\u6253\u5305\u7684\u8FD8\u662F\u5F31\u5F15\u7528\u90FD\u7B97\u3002\n//   \u7136\u540E\u6253\u5305\u7684\u5173\u4E8E\u8FD9\u4E2A\u6E90\u6587\u4EF6\u5206\u53D1\u7684license\u662F\u53E6\u5916\u4E00\u56DE\u4E8B\u3002\u53EF\u4EE5\u5206\u5F00\u7B97\u300D\u300C\u4EE5\u53CA\u6709track\u6CA1\u51FA\u58F0\u7684\u4E0D\u7B97\u300D\u3002\u6240\u4EE5\u4E24\u5757\u3001\u5206\u5F00\u7B97\uFF1A\n//   \u6F14\u51FA\u7F72\u540D\uFF08performerCredits\uFF09= \u6E32\u67D3\u51FA\u6765\u7684\u58F0\u97F3\u91CC\u7528\u4E86\u8C01\uFF1A\u771F\u51FA\u4E86\u58F0\u7684\u58F0\u90E8\uFF0C\u4E0A\u573A\u90A3\u4F4D\uFF08\u6253\u5305 / \u5F31\u5F15\u7528\u4E00\u6837\u7B97\uFF1B\u6708\u8BFB\u4E5F\u7B97\uFF09\uFF1B\u51B7\u677F\u51F3\uFF08\u6CA1\u4E0A\u573A\u7684\u5019\u9009\uFF09\u4E0D\u7B97\uFF1B\u6709\u58F0\u90E8\u6CA1\u51FA\u58F0\u7684\u4E0D\u7B97\u3002\n//   \u6253\u5305\u5206\u53D1\u7684\u8BB8\u53EF\uFF08packedLicenses\uFF09= \u6587\u4EF6\uFF08.mxl\uFF09\u91CC\u5E26\u7740\u8C01\u7684\u6E90\u6587\u4EF6\u5B57\u8282\uFF08\u6253\u5305\u7684 SoundFont \u5B50\u96C6\uFF1B\u51B7\u677F\u51F3\u7684\u6253\u5305\u5B57\u8282\u4E5F\u5728\u6587\u4EF6\u91CC\uFF0C\u4E5F\u7B97\uFF09\u2014\u2014\u5206\u53D1\u8FD9\u4EFD\u6587\u4EF6\u8981\u5B88\u7684\uFF0C\u548C\u6F14\u51FA\u7F72\u540D\u662F\u4E24\u56DE\u4E8B\u3002\n//   \u4EE5\u540E\u7684\u53C2\u8003\u7A97\u91CC\u7684\u7D20\u6750\u90FD\u4E0D\u7B97\u3002\n// \u6765\u6E90\u53EA\u770B\u6B4C\u91CC by value \u7684\u7F72\u540D\u5FEB\u7167\uFF08\u5019\u9009\u7684 credit\uFF1A\u97F3\u6E90\u5E93\u6761\u76EE / sf2 INFO / \u6708\u8BFB CREDIT \u5757\uFF09\uFF0C**\u4E0D\u8054\u7F51\u67E5**\uFF1B\u63A8\u6F14\u662F\u63D0\u793A\uFF0C\u4E0D\u62E6\u5B58 / \u4E0D\u62E6\u5BFC\u51FA\uFF08\u5BB6\u89C4\u300C\u4E0D\u8BB8\u89C4\u8BAD\u7528\u6237\u300D\uFF09\u3002\nimport type { Credit } from \"./contract.ts\";\nimport { activeOrDefaultCandidate, type Extras } from \"./project.ts\";\n\nexport interface CreditLine { who: string[]; attribution: string[]; license: { name: string; url?: string } }\ntype Json = Record<string, unknown>;\nconst cands = (r: Json | undefined): Json[] => ((r?.candidates as Json[] | undefined) ?? []);\nconst creditOf = (c: Json): Credit | null => { const k = c.credit as Credit | undefined; return k && Array.isArray(k.attribution) ? k : null; };\n\nfunction group(items: { name: string; credit: Credit }[]): CreditLine[] {\n  const out = new Map<string, CreditLine>();\n  for (const { name, credit } of items) {\n    const attribution = credit.attribution.map((s) => String(s).trim()).filter(Boolean);\n    const license = { name: String(credit.license?.name ?? \"unknown\"), ...(credit.license?.url ? { url: String(credit.license.url) } : {}) };\n    if (!attribution.length && license.name === \"unknown\") { const k = `?${name}`; out.set(k, { who: [name], attribution: [], license }); continue; }   // \u4EC0\u4E48\u90FD\u6CA1\u5199\u7684\uFF1A\u7167\u6837\u5217\u51FA\u6765\uFF08\u8BA9\u4EBA\u77E5\u9053\u5B83\u6CA1\u7F72\u540D\u4FE1\u606F\uFF09\n    const k = JSON.stringify([attribution, license]), had = out.get(k);\n    if (had) { if (!had.who.includes(name)) had.who.push(name); } else out.set(k, { who: [name], attribution, license });\n  }\n  return [...out.values()];\n}\n/** \u6F14\u51FA\u7F72\u540D\uFF1Aroles = \u771F\u51FA\u4E86\u58F0\u7684\u58F0\u90E8\u7684\u89D2\u8272 id\uFF08\u8C03\u7528\u65B9\u7ED9\uFF1A\u5BFC\u51FA mp3 = \u8FD9\u6B21\u6E32\u67D3\u51FA\u4E86\u58F0\u7684\uFF1B\u9884\u89C8 = \u73B0\u5728\u4F1A\u51FA\u58F0\u3001\u6709\u97F3\u7684\uFF09\uFF0C\u5404\u53D6\u4E0A\u573A\u90A3\u4F4D\uFF1B\u6253\u5305 / \u5F31\u5F15\u7528\u4E00\u6837\u7B97\u3002 */\nexport function performerCredits(extras: Extras, roles: readonly string[]): CreditLine[] {\n  const items: { name: string; credit: Credit }[] = [];\n  for (const role of new Set(roles)) {\n    const c = activeOrDefaultCandidate(extras, role); if (!c) continue;   // \u6CA1\u6709\u89D2\u8272\u5FEB\u7167 = \u9ED8\u8BA4\u7684\u6708\u8BFB\u5728\u5531\uFF08\u65B0\u6B4C\uFF09\uFF0C\u7167\u6837\u7B97\n    if ((c.instrument as { engine?: string } | undefined)?.engine === \"unknown\") continue;   // \u6CA1\u4EBA\u80FD\u6F14 = \u6CA1\u51FA\u58F0\n    const credit = creditOf(c); if (credit) items.push({ name: String(c.name ?? \"\"), credit });\n  }\n  return group(items);\n}\n/** \u6253\u5305\u5206\u53D1\u7684\u8BB8\u53EF\uFF1A\u6B4C\uFF08.mxl\uFF09\u91CC\u5E26\u7740\u5B57\u8282\u7684\u6E90\u6587\u4EF6\uFF08\u6253\u5305\u7684 SoundFont \u5B50\u96C6\uFF1B\u53F0\u4E0A + \u51B7\u677F\u51F3\u90FD\u7B97\u2014\u2014\u5B57\u8282\u90FD\u5728\u6587\u4EF6\u91CC\uFF09\u3002 */\nexport function packedLicenses(extras: Extras): CreditLine[] {\n  const items: { name: string; credit: Credit }[] = [];\n  for (const r of Object.values(extras.lounge)) for (const c of cands(r)) {\n    const i = c.instrument as { engine?: string; source?: { embedded?: string | null } } | undefined;\n    if (i?.engine !== \"soundfont\" || !i.source?.embedded || !extras.sounds[i.source.embedded]) continue;\n    const credit = creditOf(c); if (credit) items.push({ name: String(c.name ?? \"\"), credit });\n  }\n  return group(items);\n}\n/** \u8FD9\u9996\u6B4C\u81EA\u5DF1\u90A3\u4E00\u6761\uFF08\u7528\u6237\u5199\u7684\u90A3\u90E8\u5206\uFF1A\u8BCD / \u66F2 / \u7F16\uFF1Buser\u300C\u4F60\u8BA1\u7B97\u7684\u65F6\u5019\u522B\u5FD8\u4E86\u7528\u6237\u81EA\u5DF1\u5199\u7684\u90A3\u4E00\u90E8\u5206\uFF0C\u7528\u6237\u53EF\u4EE5\u9009\u300D\uFF09\uFF1A\u8C01 = \u6B4C\u540D\u3001\u7F72\u540D = \u4F5C\u8005\u680F\u3001\u8BB8\u53EF = \u7528\u6237\u9009\u7684\u3002\n *  \u4F5C\u8005\u680F\u548C\u8BB8\u53EF\u90FD\u7A7A\u7740 = \u4E0D\u51FA\u8FD9\u4E00\u6761\uFF08\u4F5C\u8005\u680F\u7684\u89C4\u77E9\uFF1A\u4E0D\u63D0\u9192\u3001\u4E0D\u66FF\u7528\u6237\u5199\uFF09\u3002 */\nexport function songCreditLine(song: { title?: string; credits?: string; rights?: string }): CreditLine | null {\n  if (!song.credits?.trim() && !song.rights?.trim()) return null;\n  return { who: [song.title?.trim() ? `\u300C${song.title.trim()}\u300D` : \"\u8FD9\u9996\u6B4C\"], attribution: (song.credits ?? \"\").split(\"\\n\").map((s) => s.trim()).filter(Boolean), license: { name: song.rights?.trim() || \"\uFF08\u6CA1\u58F0\u660E\u8BB8\u53EF\uFF09\" } };\n}\n/** \u8FD9\u9996\u6B4C\u81EA\u5DF1\u7684\u8BB8\u53EF\u7684\u5E38\u7528\u9009\u9879\uFF0C\u4ECE\u7D27\u5230\u677E\uFF08\u6587\u5B57\u7167\u6284\u8FDB <rights>\uFF1B\u9009\u4E86\u8FD8\u80FD\u6539\uFF0C\u4E5F\u80FD\u81EA\u5DF1\u5199\uFF09\u3002\u9ED8\u8BA4 = \u672A\u58F0\u660E = \u6CD5\u5F8B\u9ED8\u8BA4\u7684\u4FDD\u7559\u6240\u6709\u6743\u5229\uFF0C\u4E0D\u66FF\u7528\u6237\u9009\n *  \uFF08user 2026-10-08\u300C\u6211\u5EFA\u8BAE\u662F\u9ED8\u8BA4\u672A\u77E5\uFF0C\u4E0D\u7136\u7528\u6237\u60F3\u505A\u5546\u4E1A\u95ED\u56ED\u6216\u8005\u81EA\u5B9A\u4E49\u7684\uFF0C\u4F60\u5E2E\u4ED6\u9759\u9ED8\u5BFC\u51FA\u4E86\u4E00\u4E2Amit\u5C31\u6BD4\u8F83\u6076\u6027\u300D\u300C\u4E0D\u8981\u53EA\u63D0\u4F9B\u5F00\u6E90\u7684\u9009\u9879\u2026\u6709\u4E9B\u4EBA\u8FD8\u662F\u60F3\u8981\u5B88\u7684\u6BD4\u8F83\u7D27\u7684\u5427\u300D\uFF09\u3002 */\nexport const RIGHTS_PRESETS: { label: string; note: string; text: (year: number) => string }[] = [\n  { label: \"\u4FDD\u7559\u6240\u6709\u6743\u5229\", note: \"\u4EC0\u4E48\u90FD\u8981\u5148\u95EE\u4F60\uFF08\u6CD5\u5F8B\u9ED8\u8BA4\u5C31\u662F\u8FD9\u6837\uFF0C\u8FD9\u91CC\u53EA\u662F\u5199\u660E\uFF09\", text: (y) => `\u00A9 ${y} \u4FDD\u7559\u6240\u6709\u6743\u5229` },\n  { label: \"\u4EC5\u4F9B\u6B23\u8D4F\", note: \"\u542C\u53EF\u4EE5\uFF1B\u8F6C\u8F7D\u3001\u6539\u7F16\u3001\u5546\u7528\u90FD\u8981\u5148\u95EE\u4F60\", text: (y) => `\u00A9 ${y} \u4FDD\u7559\u6240\u6709\u6743\u5229\u3002\u4EC5\u4F9B\u4E2A\u4EBA\u6B23\u8D4F\uFF0C\u7981\u6B62\u8F6C\u8F7D\u3001\u6539\u7F16\u3001\u5546\u7528\u3002` },\n  { label: \"\u5546\u7528\u8BF7\u8054\u7CFB\", note: \"\u4FDD\u7559\u6240\u6709\u6743\u5229\uFF0C\u5E76\u544A\u8BC9\u522B\u4EBA\u5546\u7528\u600E\u4E48\u627E\u4F60\", text: (y) => `\u00A9 ${y} \u4FDD\u7559\u6240\u6709\u6743\u5229\u3002\u5546\u7528\u8BF7\u8054\u7CFB\u4F5C\u8005\u3002` },\n  { label: \"CC BY-NC-ND 4.0\", note: \"\u6CE8\u660E\u51FA\u5904\u53EF\u4EE5\u539F\u6837\u8F6C\u53D1\uFF1B\u4E0D\u8BB8\u6539\u3001\u4E0D\u8BB8\u5546\u7528\uFF08\u6700\u7D27\u7684 CC\uFF09\", text: () => \"CC BY-NC-ND 4.0 https://creativecommons.org/licenses/by-nc-nd/4.0/\" },\n  { label: \"CC BY-NC 4.0\", note: \"\u6CE8\u660E\u51FA\u5904\u53EF\u4EE5\u6539\uFF1B\u4E0D\u8BB8\u5546\u7528\", text: () => \"CC BY-NC 4.0 https://creativecommons.org/licenses/by-nc/4.0/\" },\n  { label: \"CC BY-SA 4.0\", note: \"\u6CE8\u660E\u51FA\u5904\u53EF\u4EE5\u6539\u3001\u53EF\u4EE5\u5546\u7528\uFF1B\u6539\u4E86\u7684\u8981\u7528\u540C\u6837\u7684\u8BB8\u53EF\", text: () => \"CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/\" },\n  { label: \"CC BY 4.0\", note: \"\u6CE8\u660E\u51FA\u5904\u968F\u4FBF\u7528\", text: () => \"CC BY 4.0 https://creativecommons.org/licenses/by/4.0/\" },\n  { label: \"CC0\", note: \"\u653E\u5F03\u6743\u5229\uFF0C\u8C01\u90FD\u80FD\u968F\u4FBF\u7528\uFF08\u53D1\u51FA\u53BB\u6536\u4E0D\u56DE\uFF09\", text: () => \"CC0 1.0 https://creativecommons.org/publicdomain/zero/1.0/\" },\n];\n/** \u63A8\u6F14\u51FA\u6765\u7684\u63D0\u9192\uFF08\u53EA\u63D0\u793A\uFF0C\u4E0D\u62E6\uFF09\uFF1A\u8FD9\u9996\u6B4C\u9009\u4E86\u5141\u8BB8\u522B\u4EBA\u6539\u7F16 / \u5F53\u7D20\u6750\u518D\u7528\u7684\u8BB8\u53EF\uFF08CC BY / SA / NC\u3001CC0\u3001\u516C\u6709\u9886\u57DF\uFF1B\u4E0D\u8BB8\u6539\u7F16\u7684 ND \u4E0D\u7B97\uFF09\uFF0C\u53EF\u91CC\u9762\u6709\u6708\u8BFB\u51FA\u58F0\u2014\u2014\n *  \u6708\u8BFB\u6761\u6B3E\u7981\u6B62\u300C\u4EE5\u5141\u8BB8\u4ED6\u4EBA\u4E8C\u6B21\u5229\u7528\uFF08\u5F53\u4F5C\u7D20\u6750\uFF09\u7684\u5F62\u5F0F\u516C\u5F00\u300D\u3002\u662F AI \u5BF9\u6761\u6B3E\u7684\u7406\u89E3\uFF0C\u4E0D\u662F\u6CD5\u5F8B\u610F\u89C1\uFF1A\u63D0\u9192\u5199\u300C\u53EF\u80FD\u51B2\u7A81\u300D\u3002 */\nexport function licenseHints(rights: string | undefined, performers: readonly CreditLine[]): string[] {\n  const reusable = !!rights && (/CC0|public ?domain|\u516C\u6709\u9886\u57DF|publicdomain\\/zero/i.test(rights) || (/CC[ -]?BY/i.test(rights) && !/\\bND\\b|-nd\\//i.test(rights)));\n  const tsukuyomi = performers.some((l) => l.license.name.includes(\"\u3064\u304F\u3088\u307F\u3061\u3083\u3093\"));\n  // \u4E0D\u62E6\u3001\u4E0D\u5F53\u8B66\u5BDF\uFF08user\u300C\u5373\u4F7F\u7248\u6743\u51B2\u7A81\u2026\u4E5F\u4E0Dblock\u5BFC\u51FAmp3\u548C\u5DE5\u7A0B\u6587\u4EF6\u3002\u800C\u53EA\u662F\u56DE\u5230\u672A\u58F0\u660E\u3002\u4E0D\u8B66\u5BDF\u7528\u6237\u300D\uFF09\uFF1A\u5BFC\u51FA\u90A3\u4E00\u4EFD\u7684\u8BB8\u53EF\u6309\u672A\u58F0\u660E\u5199\uFF0C\u8FD9\u91CC\u53EA\u8BF4\u660E\u4E00\u53E5\n  return reusable && tsukuyomi ? [\"\u4F60\u9009\u7684\u8BB8\u53EF\u5141\u8BB8\u522B\u4EBA\u6539\u7F16 / \u5F53\u7D20\u6750\u518D\u7528\uFF0C\u53EF\u91CC\u9762\u6709\u5C0F\u6708\u76F8\u7684\u58F0\u97F3\uFF0C\u5C0F\u6708\u76F8\u7684\u6761\u6B3E\u4E0D\u8BB8\u8FD9\u6837\u516C\u5F00\uFF08\u8BBE\u7F6E\u91CC\u6709\u539F\u6587\u548C\u8BD1\u6587\uFF09\uFF0C\u6240\u4EE5\u5BFC\u51FA\u65F6\u8BB8\u53EF\u90A3\u4E00\u9879\u6309\u300C\u672A\u58F0\u660E\u300D\u5199\uFF1B\u4F60\u5728\u8FD9\u91CC\u7684\u9009\u62E9\u6CA1\u52A8\u3002\"] : [];\n}\n/** \u63A8\u6210\u7EAF\u6587\u5B57\uFF08\u53EF\u76F4\u63A5\u8D34\u8FDB\u4F5C\u54C1\u8BF4\u660E\uFF09\uFF1A\u6BCF\u7EC4\u9996\u884C\u300C\u8C01 \u2014 \u8BB8\u53EF\u8BC1\u300D\uFF0C\u4E0B\u9762\u9010\u884C\u7F72\u540D\uFF08\u6708\u8BFB\u7684\u7F72\u540D\u5757\u81EA\u5E26\u6362\u884C\uFF0C\u539F\u6837\u4FDD\u7559\uFF09\uFF0C\u7EC4\u95F4\u7A7A\u4E00\u884C\u3002\u7A7A = \"\"\u3002 */\nexport function creditsText(lines: readonly CreditLine[]): string {\n  return lines.map((l) => {\n    const lic = l.license.name === \"unknown\" ? \"\u8BB8\u53EF\u8BC1\u4E0D\u660E\" : `${l.license.name}${l.license.url ? ` ${l.license.url}` : \"\"}`;\n    return [`${l.who.join(\"\u3001\")} \u2014 ${lic}`, ...(l.attribution.length ? l.attribution : [\"\uFF08\u6CA1\u6709\u7F72\u540D\u4FE1\u606F\uFF09\"])].join(\"\\n\");\n  }).join(\"\\n\\n\");\n}\n", "// tsf-standalone.ts \u2014\u2014 \u72EC\u7ACB WASM\uFF08vendor/tsf/tsf-standalone.wasm\uFF0C\u4E0D\u5E26 emscripten \u8FD0\u884C\u65F6\uFF09\u7684\u8584\u5305\u88C5\uFF1AAudioWorklet \u91CC\u7684\u5B9E\u65F6\u5408\u6210\u5668\u548C Node \u6D4B\u8BD5\u5171\u7528\u3002\n// created 2026-10-07 by Claude Fable 5.1\u3002\u548C vendor/tsf/tsf.mjs\uFF08emscripten \u80F6\u6C34\u7248\uFF09\u662F\u540C\u4E00\u4EFD C \u4EE3\u7801\u7F16\u7684\u4E24\u4EFD\uFF1Btest/synth-wasm.test.ts \u5B88\u7740\u4E24\u8FB9\u9010\u6837\u672C\u76F8\u540C\u3002\n// \u53EA import \u4E00\u4E2A emscripten_notify_memory_growth\uFF08\u5185\u5B58\u6DA8\u4E86\u901A\u77E5\u4E00\u58F0\uFF1B\u6211\u4EEC\u6BCF\u6B21\u7528\u524D\u90FD\u91CD\u65B0\u53D6 memory.buffer\uFF0C\u6240\u4EE5\u7A7A\u6869\u5C31\u884C\uFF09\u3002\n// \u8C03\u7528\u65B9\u81EA\u5DF1\u7BA1 memory\uFF1AALLOW_MEMORY_GROWTH \u4E0B buffer \u4F1A\u6362\uFF08\u65E7\u7684 detach\uFF09\uFF0C\u6240\u4EE5\u6BCF\u6B21\u8BBF\u95EE\u90FD\u4ECE exports.memory.buffer \u65B0\u5EFA\u89C6\u56FE\u3002\n\nexport interface TsfExports {\n  memory: WebAssembly.Memory; _initialize(): void; malloc(n: number): number; free(p: number): void;\n  sf_load(p: number, n: number, sr: number): number; sf_copy(f: number): number; sf_close(f: number): void; sf_reset(f: number): void;\n  sf_preset_count(f: number): number; sf_preset_name(f: number, i: number): number; sf_preset_bank(f: number, i: number): number; sf_preset_num(f: number, i: number): number; sf_preset_index(f: number, bank: number, num: number): number;\n  sf_set_max_voices(f: number, n: number): number; sf_set_volume(f: number, g: number): void;\n  sf_note_on(f: number, preset: number, key: number, vel: number): number; sf_note_off(f: number, preset: number, key: number): void; sf_note_off_all(f: number): void; sf_active(f: number): number;\n  sf_render(f: number, out: number, n: number): void;\n}\nexport interface TsfBank { handle: number; presets: { index: number; bank: number; program: number; name: string }[] }\n\n/** \u5B9E\u4F8B\u5316\uFF08module \u53EF\u4EE5\u662F WebAssembly.Module \u6216 wasm \u5B57\u8282\uFF09\u3002 */\nexport async function instantiateTsf(module: WebAssembly.Module | BufferSource): Promise<Tsf> {\n  const imports = { env: { emscripten_notify_memory_growth: () => {} } };\n  const inst = module instanceof WebAssembly.Module ? await WebAssembly.instantiate(module, imports) : (await WebAssembly.instantiate(module, imports)).instance;\n  const ex = inst.exports as unknown as TsfExports;\n  ex._initialize();\n  return new Tsf(ex);\n}\n\nexport class Tsf {\n  readonly ex: TsfExports;\n  private outPtr = 0; private outCap = 0;\n  constructor(ex: TsfExports) { this.ex = ex; }   // \u4E0D\u7528\u53C2\u6570\u5C5E\u6027\uFF1ANode \u7684 strip-only TS \u4E0D\u8BA4\n  private u8(): Uint8Array { return new Uint8Array(this.ex.memory.buffer); }\n  private cstr(p: number): string { const m = this.u8(); let s = \"\"; for (let i = p; m[i]; i++) s += String.fromCharCode(m[i]); return s; }\n  /** \u8F7D\u4E00\u4EFD sf2\uFF08\u5B57\u8282\u62F7\u8FDB wasm \u5806\u3001\u8F7D\u5B8C\u5C31\u8FD8\uFF09\u3002\u5931\u8D25 = null\u3002 */\n  load(bytes: Uint8Array, sampleRate: number, maxVoices = 64): TsfBank | null {\n    const p = this.ex.malloc(bytes.length); this.u8().set(bytes, p);\n    const handle = this.ex.sf_load(p, bytes.length, sampleRate); this.ex.free(p);\n    if (!handle) return null;\n    this.ex.sf_set_max_voices(handle, maxVoices);\n    const n = this.ex.sf_preset_count(handle), presets = Array.from({ length: n }, (_, i) => ({ index: i, bank: this.ex.sf_preset_bank(handle, i), program: this.ex.sf_preset_num(handle, i), name: this.cstr(this.ex.sf_preset_name(handle, i)) }));\n    return { handle, presets };\n  }\n  close(b: TsfBank): void { this.ex.sf_close(b.handle); }\n  noteOn(b: TsfBank, preset: number, key: number, vel: number): void { this.ex.sf_note_on(b.handle, preset, key, vel); }\n  noteOff(b: TsfBank, preset: number, key: number): void { this.ex.sf_note_off(b.handle, preset, key); }\n  allOff(b: TsfBank): void { this.ex.sf_note_off_all(b.handle); }\n  /** \u6240\u6709\u58F0\u97F3\u5FEB\u901F\u6536\u6389\uFF08tsf_reset = endquick\uFF1A\u51E0\u6BEB\u79D2\u6DE1\u51FA\uFF0C\u4E0D\u662F\u786C\u5207\uFF09\u3002 */\n  reset(b: TsfBank): void { this.ex.sf_reset(b.handle); }\n  active(b: TsfBank): number { return this.ex.sf_active(b.handle); }\n  /** \u6E32\u67D3 n \u4E2A\u5355\u58F0\u9053\u91C7\u6837\u8FDB out\uFF08\u4ECE offset \u8D77\uFF09\u3002 */\n  render(b: TsfBank, out: Float32Array, offset = 0, n = out.length - offset): void {\n    if (n <= 0) return;\n    if (this.outCap < n) { if (this.outPtr) this.ex.free(this.outPtr); this.outPtr = this.ex.malloc(n * 4); this.outCap = n; }\n    this.ex.sf_render(b.handle, this.outPtr, n);\n    out.set(new Float32Array(this.ex.memory.buffer, this.outPtr, n), offset);\n  }\n}\n", "// fx.ts \u2014\u2014 \u5F55\u97F3\u623F\u7684\u6548\u679C\u539F\u8BED\uFF08\u7EAF JS\uFF0C\u96F6\u5206\u914D\u3001\u786E\u5B9A\u6027\uFF1B\u97F3\u9891\u7EBF\u7A0B\u548C\u79BB\u7EBF\u5BFC\u51FA\u5171\u7528\uFF09\uFF1AEQ\uFF08\u53CC\u4E8C\u9636\uFF09\u3001\u538B\u7F29\u5668\uFF08\u53EF\u4FA7\u94FE\uFF09\u3001\u5EF6\u8FDF\u3001\u7B97\u6CD5\u6DF7\u54CD\u3001\u589E\u76CA\u3002\n// created 2026-10-10 by Claude Fable 5.1\uFF08\u5B9E\u65F6\u8BD5\u542C\u5200 4\uFF1Buser\u300C\u7A7A\u95F4\u6548\u679C\u5668\u8FD9\u4E9B\u5177\u4F53\u7684content\u5E94\u8BE5opus\u505A\u5C31\u53EF\u4EE5\u4E86\u5427\uFF0C\u9664\u975E\u6709\u6027\u80FD\u654F\u611F\u7684\u590D\u6742\u4F18\u5316\u7B97\u6CD5\u2026\u4FA7\u94FE\u4E4B\u7C7B\u7684\u6211\u4E5F\u4E0D\u61C2\u4F46\u7B97\u6CD5\u5C42\u9762\u5E94\u8BE5\u8003\u8651\u5230\u300D\n//   \u300C\u90A3\u51E0\u4E2A\u57FA\u7840\u7684\u4E1C\u897F\u90FD\u505A\u4E00\u4E0B\uFF0C\u6027\u80FD\u4EE3\u4EF7\u51E0\u4E4E\u662F\u96F6\u300D\uFF09\u3002\u5185\u5BB9\uFF08\u9884\u8BBE\u3001\u4EC0\u4E48\u98CE\u7528\u4EC0\u4E48\u3001\u754C\u9762\uFF09\u5F52 Opus / user\uFF1B\u8FD9\u91CC\u53EA\u6709\u6570\u5B66\u3002\n// \u89C4\u77E9\uFF1A\n//   \u00B7 \u6BCF\u79CD\u6548\u679C\u4E00\u5F20\u53C2\u6570\u8868\uFF08id / \u91CF\u7EB2 / \u8303\u56F4 / \u9ED8\u8BA4 / \u516C\u5F0F\uFF09\u2014\u2014vault \u81EA\u63CF\u8FF0\uFF0Canti-abandonware\uFF08user\u300C\u5FC5\u987B\u5B58latex\u516C\u5F0F\u2026\u6216\u8005github\u94FE\u63A5\uFF0C\u5728\u6B4C\u91CC\u9762\u300D\uFF09\u3002\n//   \u00B7 \u53C2\u6570\u53EA\u5728 setParams \u65F6\u7B97\u7CFB\u6570\uFF1Bprocess \u91CC\u53EA\u4E58\u52A0\u3002\u5168\u90E8\u96F6\u5EF6\u8FDF\uFF08\u9650\u5E45\u5668\u90A3\u79CD\u8981\u524D\u77BB\u7684\u4E0D\u653E\u8FD9\u91CC\uFF09\u3002\n//   \u00B7 \u4E0D\u8BA4\u8BC6\u7684 kind = \u4E0D\u51FA\u58F0\u3001\u539F\u6837\u5E26\u7740\uFF08\u753B\u7070\u5F52\u754C\u9762\uFF09\u3002\nimport type { FxV2 } from \"../format/contract.ts\";\n\nexport interface ParamDef { id: string; unit: \"dB\" | \"Hz\" | \"ms\" | \"ratio\" | \"0..1\" | \"bool\"; min: number; max: number; default: number; label: string }\nexport interface FxKindDef { kind: string; name: string; params: ParamDef[]; /** \u7B97\u6CD5\u4E00\u53E5\u8BDD + \u516C\u5F0F\uFF08\u4F2A\u7801 / latex\uFF09\uFF0C\u8FDB vault README */ formula: string; stereoOnly?: boolean }\n/** \u4E00\u4E2A\u6548\u679C\u5B9E\u4F8B\uFF1Aprocess \u5C31\u5730\u6539 L\uFF08\u548C R\uFF1B\u5355\u58F0\u9053\u94FE R = null\uFF09\uFF1Bkey = \u4FA7\u94FE\u4FE1\u53F7\uFF08\u538B\u7F29\u5668\u624D\u770B\uFF09\u3002 */\nexport interface FxInstance { readonly kind: string; readonly id: string; on: boolean; setParams(p: Record<string, number>): void; process(L: Float32Array, R: Float32Array | null, n: number, key: Float32Array | null): void }\n\nconst clamp = (v: number, lo: number, hi: number) => (v < lo ? lo : v > hi ? hi : v);\nconst dbToLin = (dB: number) => 10 ** (dB / 20);\n\n// \u2500\u2500 \u53CC\u4E8C\u9636\uFF08RBJ Audio EQ Cookbook\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nclass Biquad {\n  b0 = 1; b1 = 0; b2 = 0; a1 = 0; a2 = 0;\n  z1 = 0; z2 = 0;   // \u76F4\u63A5 II \u578B\u8F6C\u7F6E\n  set(type: \"lp\" | \"hp\" | \"lowshelf\" | \"highshelf\" | \"peak\", f: number, Q: number, gainDb: number, sr: number): void {\n    f = clamp(f, 10, sr * 0.45); Q = clamp(Q, 0.1, 20);\n    const w = (2 * Math.PI * f) / sr, cs = Math.cos(w), sn = Math.sin(w), A = 10 ** (gainDb / 40), alpha = sn / (2 * Q);\n    let b0 = 1, b1 = 0, b2 = 0, a0 = 1, a1 = 0, a2 = 0;\n    switch (type) {\n      case \"lp\": b0 = (1 - cs) / 2; b1 = 1 - cs; b2 = (1 - cs) / 2; a0 = 1 + alpha; a1 = -2 * cs; a2 = 1 - alpha; break;\n      case \"hp\": b0 = (1 + cs) / 2; b1 = -(1 + cs); b2 = (1 + cs) / 2; a0 = 1 + alpha; a1 = -2 * cs; a2 = 1 - alpha; break;\n      case \"peak\": b0 = 1 + alpha * A; b1 = -2 * cs; b2 = 1 - alpha * A; a0 = 1 + alpha / A; a1 = -2 * cs; a2 = 1 - alpha / A; break;\n      case \"lowshelf\": { const s = 2 * Math.sqrt(A) * alpha; b0 = A * (A + 1 - (A - 1) * cs + s); b1 = 2 * A * (A - 1 - (A + 1) * cs); b2 = A * (A + 1 - (A - 1) * cs - s); a0 = A + 1 + (A - 1) * cs + s; a1 = -2 * (A - 1 + (A + 1) * cs); a2 = A + 1 + (A - 1) * cs - s; break; }\n      case \"highshelf\": { const s = 2 * Math.sqrt(A) * alpha; b0 = A * (A + 1 + (A - 1) * cs + s); b1 = -2 * A * (A - 1 + (A + 1) * cs); b2 = A * (A + 1 + (A - 1) * cs - s); a0 = A + 1 - (A - 1) * cs + s; a1 = 2 * (A - 1 - (A + 1) * cs); a2 = A + 1 - (A - 1) * cs - s; break; }\n    }\n    this.b0 = b0 / a0; this.b1 = b1 / a0; this.b2 = b2 / a0; this.a1 = a1 / a0; this.a2 = a2 / a0;\n  }\n  bypass(): void { this.b0 = 1; this.b1 = 0; this.b2 = 0; this.a1 = 0; this.a2 = 0; }\n  process(x: Float32Array, n: number): void {\n    const { b0, b1, b2, a1, a2 } = this; let z1 = this.z1, z2 = this.z2;\n    for (let i = 0; i < n; i++) { const v = x[i], y = b0 * v + z1; z1 = b1 * v - a1 * y + z2; z2 = b2 * v - a2 * y; x[i] = y; }\n    this.z1 = z1; this.z2 = z2;\n  }\n}\n\n// \u2500\u2500 EQ\uFF1A\u9AD8\u5207 / \u4F4E\u5207 + \u4F4E\u67B6 / \u9AD8\u67B6 + \u4E00\u4E2A\u5CF0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst EQ: FxKindDef = { kind: \"eq\", name: \"\u5747\u8861\", formula: \"\u6BCF\u6BB5\u4E00\u4E2A\u53CC\u4E8C\u9636 H(z) = (b0 + b1 z^-1 + b2 z^-2) / (1 + a1 z^-1 + a2 z^-2)\uFF0C\u7CFB\u6570\u6309 RBJ Audio EQ Cookbook\uFF08hp / lp Q = 0.707\uFF1B\u67B6\u5B50 Q = 0.707\uFF1B\u5CF0 Q \u53EF\u8C03\uFF09\u3002hpHz / lpHz = 0 \u5173\u3002\",\n  params: [\n    { id: \"hpHz\", unit: \"Hz\", min: 0, max: 2000, default: 0, label: \"\u4F4E\u5207\" }, { id: \"lpHz\", unit: \"Hz\", min: 0, max: 20000, default: 0, label: \"\u9AD8\u5207\" },\n    { id: \"lowDb\", unit: \"dB\", min: -24, max: 24, default: 0, label: \"\u4F4E\u67B6\" }, { id: \"lowHz\", unit: \"Hz\", min: 40, max: 1000, default: 200, label: \"\u4F4E\u67B6\u9891\u7387\" },\n    { id: \"midDb\", unit: \"dB\", min: -24, max: 24, default: 0, label: \"\u4E2D\u5CF0\" }, { id: \"midHz\", unit: \"Hz\", min: 100, max: 10000, default: 1500, label: \"\u4E2D\u5CF0\u9891\u7387\" }, { id: \"midQ\", unit: \"ratio\", min: 0.2, max: 10, default: 1, label: \"\u4E2D\u5CF0\u5BBD\" },\n    { id: \"highDb\", unit: \"dB\", min: -24, max: 24, default: 0, label: \"\u9AD8\u67B6\" }, { id: \"highHz\", unit: \"Hz\", min: 1000, max: 16000, default: 5000, label: \"\u9AD8\u67B6\u9891\u7387\" },\n  ] };\ntype EqSection = [boolean, \"hp\" | \"lp\" | \"lowshelf\" | \"peak\" | \"highshelf\", number, number, number];\n/** EQ \u7684\u4E94\u6BB5\uFF08\u5F55\u97F3\u623F\u8BBE\u7CFB\u6570\u548C\u753B\u54CD\u5E94\u66F2\u7EBF\u5171\u7528\u8FD9\u4E00\u4EFD\uFF0Cv0.10.11\uFF09\uFF1A\u5F00\u4E0D\u5F00\u3001\u7C7B\u578B\u3001\u9891\u7387\u3001Q\u3001\u589E\u76CA\u3002 */\nfunction eqSections(p: Record<string, number>): EqSection[] {\n  const g = (k: string) => p[k] ?? EQ.params.find((d) => d.id === k)!.default;\n  return [\n    [g(\"hpHz\") > 0, \"hp\", g(\"hpHz\"), 0.707, 0], [g(\"lpHz\") > 0, \"lp\", g(\"lpHz\"), 0.707, 0],\n    [g(\"lowDb\") !== 0, \"lowshelf\", g(\"lowHz\"), 0.707, g(\"lowDb\")], [g(\"midDb\") !== 0, \"peak\", g(\"midHz\"), g(\"midQ\"), g(\"midDb\")], [g(\"highDb\") !== 0, \"highshelf\", g(\"highHz\"), 0.707, g(\"highDb\")],\n  ];\n}\n/** EQ \u5728\u8FD9\u4E9B\u9891\u7387\u4E0A\u7684\u54CD\u5E94\uFF08dB\uFF1B\u6DF7\u97F3\u53F0 EQ \u9875\u5361\u7247\u80CC\u666F\u4E0A\u90A3\u6761\u66F2\u7EBF\uFF0Cv0.10.11\uFF09\uFF1A\u540C\u5F55\u97F3\u623F\u7684\u53CC\u4E8C\u9636\u7CFB\u6570\uFF0C|H(e^{j\u03C9})| \u8FDE\u4E58\u3002 */\nexport function eqResponseDb(p: Record<string, number>, sr: number, freqs: readonly number[]): number[] {\n  const bq = eqSections(p).filter(([on]) => on).map(([, type, f, q, db]) => { const b = new Biquad(); b.set(type, f, q, db, sr); return b; });\n  return freqs.map((f) => {\n    const w = (2 * Math.PI * f) / sr, c1 = Math.cos(w), s1 = Math.sin(w), c2 = Math.cos(2 * w), s2 = Math.sin(2 * w);\n    let mag = 1;\n    for (const b of bq) {\n      const nr = b.b0 + b.b1 * c1 + b.b2 * c2, ni = -(b.b1 * s1 + b.b2 * s2), dr = 1 + b.a1 * c1 + b.a2 * c2, di = -(b.a1 * s1 + b.a2 * s2);\n      mag *= Math.sqrt((nr * nr + ni * ni) / (dr * dr + di * di));\n    }\n    return 20 * Math.log10(Math.max(1e-9, mag));\n  });\n}\nclass Eq implements FxInstance {\n  readonly kind = \"eq\"; on = true;\n  private sec: [Biquad, Biquad][] = Array.from({ length: 5 }, () => [new Biquad(), new Biquad()]);\n  private use = [false, false, false, false, false];\n  readonly id: string; private sr: number;\n  constructor(id: string, sr: number, p: Record<string, number>) { this.id = id; this.sr = sr; this.setParams(p); }   // \u4E0D\u7528\u53C2\u6570\u5C5E\u6027\uFF1ANode \u7684 strip-only TS \u4E0D\u8BA4\n  setParams(p: Record<string, number>): void {\n    const defs = eqSections(p);\n    defs.forEach(([on, type, f, q, db], k) => { this.use[k] = on; for (const b of this.sec[k]) if (on) b.set(type, f, q, db, this.sr); else b.bypass(); });\n  }\n  process(L: Float32Array, R: Float32Array | null, n: number): void {\n    if (!this.on) return;\n    for (let k = 0; k < 5; k++) { if (!this.use[k]) continue; this.sec[k][0].process(L, n); if (R) this.sec[k][1].process(R, n); }\n  }\n}\n\n// \u2500\u2500 \u538B\u7F29\u5668\uFF08\u5CF0\u503C\u68C0\u6CE2\u3001\u8F6F\u62D0\u70B9\u3001\u53EF\u4FA7\u94FE\uFF1B\u7ACB\u4F53\u58F0\u8054\u52A8\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst COMP: FxKindDef = { kind: \"comp\", name: \"\u538B\u7F29\", formula: \"\u5305\u7EDC e[n] = max(|x|, e[n-1]\u00B7r) \u8D77\uFF08attack\uFF09\u843D\uFF08release\uFF09\u5404\u4E00\u4E2A\u65F6\u95F4\u5E38\u6570\uFF1B\u8D85\u8FC7 threshold \u7684\u90E8\u5206\u6309 ratio \u538B\uFF08kneeDb \u5185\u8F6F\u62D0\u70B9\uFF1Ag = -(x - T + K/2)^2 \u00B7 (1 - 1/R) / (2K)\uFF09\uFF1B\u589E\u76CA = 10^(g/20) \u00D7 10^(makeup/20)\u3002key \u7ED9\u4E86 = \u542C\u522B\u7684\u8F68\uFF08\u4FA7\u94FE\uFF09\uFF0C\u4E0D\u7ED9 = \u542C\u81EA\u5DF1\u3002\",\n  params: [\n    { id: \"thresholdDb\", unit: \"dB\", min: -60, max: 0, default: -18, label: \"\u9608\u503C\" }, { id: \"ratio\", unit: \"ratio\", min: 1, max: 20, default: 3, label: \"\u6BD4\u4F8B\" },\n    { id: \"attackMs\", unit: \"ms\", min: 0.1, max: 200, default: 10, label: \"\u8D77\" }, { id: \"releaseMs\", unit: \"ms\", min: 5, max: 2000, default: 120, label: \"\u843D\" },\n    { id: \"kneeDb\", unit: \"dB\", min: 0, max: 24, default: 6, label: \"\u62D0\u70B9\" }, { id: \"makeupDb\", unit: \"dB\", min: -12, max: 24, default: 0, label: \"\u8865\u507F\" },\n  ] };\nclass Comp implements FxInstance {\n  readonly kind = \"comp\"; on = true;\n  private env = 0; private aAtt = 0; private aRel = 0; private T = -18; private R = 3; private K = 6; private makeup = 1;\n  gainReductionDb = 0;   // \u8868\u7528\uFF08\u6700\u8FD1\u4E00\u5757\u538B\u4E86\u591A\u5C11\uFF09\n  inPeak = 0; outPeak = 0;   // \u8868\u7528\uFF08\u6700\u8FD1\u4E00\u5757\u8FDB / \u51FA\u7684\u5CF0\u503C\uFF0C\u7EBF\u6027\uFF1B\u538B\u7F29\u9875\u7684\u6CE2\u5F62\u56FE\uFF0Cv0.10.21\uFF09\n  readonly id: string; private sr: number;\n  constructor(id: string, sr: number, p: Record<string, number>) { this.id = id; this.sr = sr; this.setParams(p); }\n  setParams(p: Record<string, number>): void {\n    const g = (k: string) => p[k] ?? COMP.params.find((d) => d.id === k)!.default;\n    this.T = g(\"thresholdDb\"); this.R = Math.max(1, g(\"ratio\")); this.K = Math.max(0, g(\"kneeDb\")); this.makeup = dbToLin(g(\"makeupDb\"));\n    this.aAtt = Math.exp(-1 / (Math.max(0.0001, g(\"attackMs\") / 1000) * this.sr)); this.aRel = Math.exp(-1 / (Math.max(0.001, g(\"releaseMs\") / 1000) * this.sr));\n  }\n  private gainDb(levelDb: number): number {\n    const { T, R, K } = this, over = levelDb - T;\n    if (K > 0 && over > -K / 2 && over < K / 2) { const t = over + K / 2; return -((t * t) * (1 - 1 / R)) / (2 * K); }\n    return over <= 0 ? 0 : -over * (1 - 1 / R);\n  }\n  process(L: Float32Array, R: Float32Array | null, n: number, key: Float32Array | null): void {\n    if (!this.on) return;\n    let env = this.env, minG = 0, pin = 0, pout = 0;\n    for (let i = 0; i < n; i++) {\n      const a = Math.max(Math.abs(L[i]), R ? Math.abs(R[i]) : 0), k = key ? Math.abs(key[i]) : a;\n      env = k > env ? k + (env - k) * this.aAtt : k + (env - k) * this.aRel;\n      const lvl = env > 1e-7 ? 20 * Math.log10(env) : -140, gdb = this.gainDb(lvl), g = dbToLin(gdb) * this.makeup;\n      if (gdb < minG) minG = gdb;\n      if (a > pin) pin = a; if (a * g > pout) pout = a * g;\n      L[i] *= g; if (R) R[i] *= g;\n    }\n    this.env = env; this.gainReductionDb = minG; this.inPeak = pin; this.outPeak = pout;\n  }\n}\n\n// \u2500\u2500 \u5EF6\u8FDF\uFF08\u53CD\u9988\u91CC\u4E00\u4E2A\u4F4E\u901A\uFF0C\u7ACB\u4F53\u58F0\u540C\u957F\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst DELAY: FxKindDef = { kind: \"delay\", name: \"\u5EF6\u8FDF\", formula: \"y[n] = x[n]\u00B7dry + d[n]\u00B7mix\uFF08dry \u6CA1\u5199 = 1 \u2212 mix\uFF0Cv0.10.10 \u524D\u7684\u5199\u6CD5\uFF09\uFF0Cd[n] = x[n - D] + fb \u00B7 LP(d[n - D])\uFF0CLP = \u4E00\u9636\u4F4E\u901A dampHz\u3002D = timeMs\uFF08\u6700\u957F 2 s\uFF09\u3002\",\n  params: [\n    { id: \"timeMs\", unit: \"ms\", min: 1, max: 2000, default: 375, label: \"\u65F6\u95F4\" }, { id: \"feedback\", unit: \"0..1\", min: 0, max: 0.95, default: 0.35, label: \"\u53CD\u9988\" },\n    { id: \"mix\", unit: \"0..1\", min: 0, max: 1, default: 0.3, label: \"\u6E7F\" }, { id: \"dry\", unit: \"0..1\", min: 0, max: 1, default: 1, label: \"\u539F\u58F0\" }, { id: \"dampHz\", unit: \"Hz\", min: 500, max: 20000, default: 6000, label: \"\u53CD\u9988\u9AD8\u5207\" },\n  ] };\nclass Delay implements FxInstance {\n  readonly kind = \"delay\"; on = true;\n  private bufL: Float32Array; private bufR: Float32Array; private wr = 0; private D = 1; private fb = 0.35; private mix = 0.3; private dry = 0.7; private lpK = 0.5; private lpL = 0; private lpR = 0;\n  readonly id: string; private sr: number;\n  constructor(id: string, sr: number, p: Record<string, number>) { this.id = id; this.sr = sr; const max = Math.ceil(2 * sr) + 1; this.bufL = new Float32Array(max); this.bufR = new Float32Array(max); this.setParams(p); }\n  setParams(p: Record<string, number>): void {\n    const g = (k: string) => p[k] ?? DELAY.params.find((d) => d.id === k)!.default;\n    this.D = clamp(Math.round((g(\"timeMs\") / 1000) * this.sr), 1, this.bufL.length - 1); this.fb = clamp(g(\"feedback\"), 0, 0.95); this.mix = clamp(g(\"mix\"), 0, 1); this.dry = dryOf(p, this.mix);\n    this.lpK = 1 - Math.exp((-2 * Math.PI * clamp(g(\"dampHz\"), 100, this.sr * 0.45)) / this.sr);\n  }\n  process(L: Float32Array, R: Float32Array | null, n: number): void {\n    if (!this.on) return;\n    const len = this.bufL.length, D = this.D, fb = this.fb, mix = this.mix, dry = this.dry, k = this.lpK;\n    for (let i = 0; i < n; i++) {\n      const rd = (this.wr - D + len) % len;\n      const dl = this.bufL[rd]; this.lpL += (dl - this.lpL) * k; this.bufL[this.wr] = L[i] + this.lpL * fb; L[i] = L[i] * dry + dl * mix;\n      if (R) { const dr = this.bufR[rd]; this.lpR += (dr - this.lpR) * k; this.bufR[this.wr] = R[i] + this.lpR * fb; R[i] = R[i] * dry + dr * mix; }\n      this.wr = (this.wr + 1) % len;\n    }\n  }\n}\n\n// \u2500\u2500 \u7B97\u6CD5\u6DF7\u54CD\uFF08Freeverb \u7ED3\u6784\uFF1A8 \u6761\u68B3\u72B6 + 4 \u6761\u5168\u901A\uFF0C\u6BCF\u8FB9\u4E00\u7EC4\u3001\u53F3\u8FB9\u9519\u5F00\uFF1B\u516C\u5171\u9886\u57DF\u7684\u7ECF\u5178\u7ED3\u6784\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst REVERB: FxKindDef = { kind: \"reverb\", name: \"\u6DF7\u54CD\", formula: \"Freeverb\uFF1A8 \u6761\u4F4E\u901A\u53CD\u9988\u68B3\u72B6\uFF08\u957F\u5EA6 1116\u20261617 @44.1k\uFF0C\u6309\u91C7\u6837\u7387\u7F29\u653E\uFF1B\u53CD\u9988 = 0.7 + 0.28\u00B7room\uFF0C\u4F4E\u901A = damp\uFF09\u5E76\u8054\uFF0C\u518D\u4E32 4 \u6761\u5168\u901A\uFF08g = 0.5\uFF09\uFF1B\u53F3\u8FB9\u5404\u957F 23 \u4E2A\u91C7\u6837\uFF1B\u524D\u9762\u4E00\u6BB5 preDelayMs \u7EAF\u5EF6\u8FDF\uFF1By = x\u00B7(1-mix) + wet\u00B7mix\u3002\",\n  params: [\n    { id: \"room\", unit: \"0..1\", min: 0, max: 1, default: 0.5, label: \"\u623F\u95F4\u5927\u5C0F\" }, { id: \"damp\", unit: \"0..1\", min: 0, max: 1, default: 0.5, label: \"\u9AD8\u9891\u5438\u6536\" },\n    { id: \"mix\", unit: \"0..1\", min: 0, max: 1, default: 0.3, label: \"\u6E7F\" }, { id: \"dry\", unit: \"0..1\", min: 0, max: 1, default: 1, label: \"\u539F\u58F0\" }, { id: \"preDelayMs\", unit: \"ms\", min: 0, max: 200, default: 10, label: \"\u9884\u5EF6\u8FDF\" }, { id: \"width\", unit: \"0..1\", min: 0, max: 1, default: 1, label: \"\u5BBD\u5EA6\" },\n  ], stereoOnly: true };\nconst COMBS = [1116, 1188, 1277, 1356, 1422, 1491, 1557, 1617], ALLPASS = [556, 441, 341, 225], SPREAD = 23;\nclass Comb { buf: Float32Array; idx = 0; store = 0; constructor(n: number) { this.buf = new Float32Array(n); }\n  tick(x: number, fb: number, damp: number): number { const out = this.buf[this.idx]; this.store = out * (1 - damp) + this.store * damp; this.buf[this.idx] = x + this.store * fb; this.idx = (this.idx + 1) % this.buf.length; return out; } }\nclass Allpass { buf: Float32Array; idx = 0; constructor(n: number) { this.buf = new Float32Array(n); }\n  tick(x: number): number { const b = this.buf[this.idx], out = -x + b; this.buf[this.idx] = x + b * 0.5; this.idx = (this.idx + 1) % this.buf.length; return out; } }\nclass Reverb implements FxInstance {\n  readonly kind = \"reverb\"; on = true;\n  private cL: Comb[]; private cR: Comb[]; private aL: Allpass[]; private aR: Allpass[];\n  private pre: Float32Array; private preW = 0; private preD = 0;\n  private fb = 0.84; private damp = 0.5; private mix = 0.3; private dry = 0.7; private width = 1;\n  readonly id: string; private sr: number;\n  constructor(id: string, sr: number, p: Record<string, number>) {\n    this.id = id; this.sr = sr;\n    const s = sr / 44100, len = (n: number) => Math.max(2, Math.round(n * s));\n    this.cL = COMBS.map((n) => new Comb(len(n))); this.cR = COMBS.map((n) => new Comb(len(n + SPREAD)));\n    this.aL = ALLPASS.map((n) => new Allpass(len(n))); this.aR = ALLPASS.map((n) => new Allpass(len(n + SPREAD)));\n    this.pre = new Float32Array(Math.ceil(0.2 * sr) + 1); this.setParams(p);\n  }\n  setParams(p: Record<string, number>): void {\n    const g = (k: string) => p[k] ?? REVERB.params.find((d) => d.id === k)!.default;\n    this.fb = 0.7 + 0.28 * clamp(g(\"room\"), 0, 1); this.damp = clamp(g(\"damp\"), 0, 1) * 0.4; this.mix = clamp(g(\"mix\"), 0, 1); this.dry = dryOf(p, this.mix); this.width = clamp(g(\"width\"), 0, 1);\n    this.preD = clamp(Math.round((g(\"preDelayMs\") / 1000) * this.sr), 0, this.pre.length - 1);\n  }\n  process(L: Float32Array, R: Float32Array | null, n: number): void {\n    if (!this.on) return;\n    const Rr = R ?? L, mix = this.mix, dry = this.dry, w1 = (1 + this.width) / 2, w2 = (1 - this.width) / 2, plen = this.pre.length;\n    for (let i = 0; i < n; i++) {\n      const inp = (L[i] + Rr[i]) * 0.015;   // Freeverb \u7684\u56FA\u5B9A\u8F93\u5165\u589E\u76CA\n      this.pre[this.preW] = inp; const x = this.pre[(this.preW - this.preD + plen) % plen]; this.preW = (this.preW + 1) % plen;\n      let oL = 0, oR = 0;\n      for (let c = 0; c < 8; c++) { oL += this.cL[c].tick(x, this.fb, this.damp); oR += this.cR[c].tick(x, this.fb, this.damp); }\n      for (let a = 0; a < 4; a++) { oL = this.aL[a].tick(oL); oR = this.aR[a].tick(oR); }\n      const wl = oL * w1 + oR * w2, wr = oR * w1 + oL * w2;\n      L[i] = L[i] * dry + wl * mix; if (R) R[i] = R[i] * dry + wr * mix;\n    }\n  }\n}\n\n// \u2500\u2500 \u5408\u5531 / \u52A0\u500D\uFF08user 2026-10-10\u300C\u9F50\u5531 \u6211\u60F3\u7684\u662F\u7528\u6DF7\u97F3\u6548\u679C\u505A\uFF0Cclannad\u4E5F\u53EA\u6709\u8336\u592A\u4E00\u540D\u6B4C\u624B\u554A\u300D\uFF09\uFF1A\u51E0\u6761\u77ED\u5EF6\u8FDF\u5404\u81EA\u88AB\u4F4E\u9891\u6296\u52A8\uFF08= \u8F7B\u5FAE\u7684\u97F3\u9AD8\u6296\u52A8\uFF09\uFF0C\u5206\u5230\u5DE6\u53F3\uFF0C\u548C\u5E72\u58F0\u53E0\u5728\u4E00\u8D77 \u2500\u2500\nconst CHORUS: FxKindDef = { kind: \"chorus\", name: \"\u5408\u5531\", formula: \"v \u6761\u5EF6\u8FDF d_k(t) = delayMs + depthMs \u00B7 sin(2\u03C0 \u00B7 rateHz \u00B7 t + 2\u03C0k/v)\uFF08\u7EBF\u6027\u63D2\u503C\u8BFB\uFF09\uFF0C\u7B2C k \u6761\u6446\u5728 pan_k = spread \u00B7 (2k/(v-1) - 1)\uFF1By = x\u00B7(1-mix) + mix \u00B7 \u03A3_k d_k / v\u3002\",\n  params: [\n    { id: \"voices\", unit: \"ratio\", min: 1, max: 4, default: 3, label: \"\u51E0\u6761\" }, { id: \"delayMs\", unit: \"ms\", min: 5, max: 40, default: 18, label: \"\u5EF6\u8FDF\" },\n    { id: \"depthMs\", unit: \"ms\", min: 0, max: 10, default: 2.5, label: \"\u6296\u52A8\u6DF1\u5EA6\" }, { id: \"rateHz\", unit: \"Hz\", min: 0.05, max: 5, default: 0.6, label: \"\u6296\u52A8\u5FEB\u6162\" },\n    { id: \"spread\", unit: \"0..1\", min: 0, max: 1, default: 0.8, label: \"\u5DE6\u53F3\u94FA\u5F00\" }, { id: \"mix\", unit: \"0..1\", min: 0, max: 1, default: 0.5, label: \"\u6E7F\" }, { id: \"dry\", unit: \"0..1\", min: 0, max: 1, default: 1, label: \"\u539F\u58F0\" },\n  ] };\nclass Chorus implements FxInstance {\n  readonly kind = \"chorus\"; on = true;\n  readonly id: string; private sr: number;\n  private buf: Float32Array; private wr = 0; private phase = 0;\n  private voices = 3; private delay = 0; private depth = 0; private rate = 0.6; private spread = 0.8; private mix = 0.5; private dry = 0.5;\n  constructor(id: string, sr: number, p: Record<string, number>) { this.id = id; this.sr = sr; this.buf = new Float32Array(Math.ceil(0.06 * sr) + 2); this.setParams(p); }\n  setParams(p: Record<string, number>): void {\n    const g = (k: string) => p[k] ?? CHORUS.params.find((d) => d.id === k)!.default;\n    this.voices = clamp(Math.round(g(\"voices\")), 1, 4); this.delay = (clamp(g(\"delayMs\"), 5, 40) / 1000) * this.sr; this.depth = (clamp(g(\"depthMs\"), 0, 10) / 1000) * this.sr;\n    this.rate = clamp(g(\"rateHz\"), 0.05, 5); this.spread = clamp(g(\"spread\"), 0, 1); this.mix = clamp(g(\"mix\"), 0, 1); this.dry = dryOf(p, this.mix);\n  }\n  process(L: Float32Array, R: Float32Array | null, n: number): void {\n    if (!this.on) return;\n    const len = this.buf.length, v = this.voices, mix = this.mix, dry = this.dry, dphi = (2 * Math.PI * this.rate) / this.sr;\n    for (let i = 0; i < n; i++) {\n      const x = R ? (L[i] + R[i]) * 0.5 : L[i];\n      this.buf[this.wr] = x;\n      let wl = 0, wr = 0;\n      for (let k = 0; k < v; k++) {\n        const d = this.delay + this.depth * Math.sin(this.phase + (2 * Math.PI * k) / v), rp = this.wr - d, ri = Math.floor(rp), f = rp - ri;\n        const a = this.buf[((ri % len) + len) % len], b = this.buf[(((ri + 1) % len) + len) % len], y = (a * (1 - f) + b * f) / v;\n        const pan = v === 1 ? 0 : this.spread * ((2 * k) / (v - 1) - 1), gl = Math.cos(((pan + 1) * Math.PI) / 4) * Math.SQRT2, gr = Math.sin(((pan + 1) * Math.PI) / 4) * Math.SQRT2;\n        wl += y * gl; wr += y * gr;\n      }\n      this.phase += dphi; if (this.phase > 2 * Math.PI) this.phase -= 2 * Math.PI;\n      this.wr = (this.wr + 1) % len;\n      L[i] = L[i] * dry + wl * mix; if (R) R[i] = R[i] * dry + wr * mix;\n    }\n  }\n}\n\n// \u2500\u2500 \u589E\u76CA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst GAIN: FxKindDef = { kind: \"gain\", name: \"\u589E\u76CA\", formula: \"y = x \u00B7 10^(dB/20)\", params: [{ id: \"dB\", unit: \"dB\", min: -60, max: 24, default: 0, label: \"\u589E\u76CA\" }] };\nclass Gain implements FxInstance {\n  readonly kind = \"gain\"; on = true; private g = 1;\n  readonly id: string;\n  constructor(id: string, _sr: number, p: Record<string, number>) { this.id = id; this.setParams(p); }\n  setParams(p: Record<string, number>): void { this.g = dbToLin(clamp(p.dB ?? 0, -60, 24)); }\n  process(L: Float32Array, R: Float32Array | null, n: number): void { if (!this.on || this.g === 1) return; for (let i = 0; i < n; i++) { L[i] *= this.g; if (R) R[i] *= this.g; } }\n}\n\n/** \u539F\u58F0\u7559\u591A\u5C11\uFF08\u6DF7\u54CD / \u5EF6\u8FDF / \u5408\u5531\uFF1Bv0.10.10\uFF0Cuser\u300C\u5F00\u4E86\u6DF7\u54CD\u7ED3\u679C\u94C3\u58F0\u90FD\u54D1\u6389\u4E86\u2026\u6807\u51C6\u63D2\u4EF6\u600E\u4E48\u505A\u7684\uFF1F\u53CD\u6B63fl studio\u662F\u6CA1\u6709\u8FD9\u4E2A\u95EE\u9898\u7684\u300D\uFF09\uFF1A\n *  \u6807\u51C6\u63D2\u4EF6\u539F\u58F0\u548C\u6E7F\u58F0\u662F\u4E24\u4E2A\u65CB\u94AE\uFF08\u539F\u58F0\u9ED8\u8BA4 100%\uFF0C\u52A0\u6548\u679C\u4E0D\u524A\u539F\u58F0\uFF1B\u5F53\u53D1\u9001\u7684\u8FD4\u56DE\u8F68\u624D\u628A\u539F\u58F0\u5173\u6389\uFF09\u3002\u6CA1\u5199 dry = \u539F\u6765\u7684\u4EA4\u53C9\u6DF7\u5408 1 \u2212 mix\uFF08\u65E7\u6B4C\u9010\u6837\u672C\u4E0D\u53D8\uFF09\u3002 */\nfunction dryOf(p: Record<string, number>, mix: number): number { return p.dry === undefined || !Number.isFinite(p.dry) ? 1 - mix : clamp(p.dry, 0, 1); }\nexport const FX_KINDS: Record<string, FxKindDef> = { eq: EQ, comp: COMP, delay: DELAY, reverb: REVERB, chorus: CHORUS, gain: GAIN };\n/** \u6309 FxV2 \u5EFA\u5B9E\u4F8B\uFF1B\u4E0D\u8BA4\u8BC6\u7684 kind = null\uFF08\u4E0D\u51FA\u58F0\u3001\u539F\u6837\u5E26\u7740\uFF09\u3002 */\nexport function createFx(spec: FxV2, sr: number): FxInstance | null {\n  const p = Object.fromEntries(Object.entries(spec.params ?? {}).filter(([, v]) => typeof v === \"number\" && Number.isFinite(v))) as Record<string, number>;\n  let fx: FxInstance | null = null;\n  switch (spec.kind) {\n    case \"eq\": fx = new Eq(spec.id, sr, p); break;\n    case \"comp\": fx = new Comp(spec.id, sr, p); break;\n    case \"delay\": fx = new Delay(spec.id, sr, p); break;\n    case \"reverb\": fx = new Reverb(spec.id, sr, p); break;\n    case \"chorus\": fx = new Chorus(spec.id, sr, p); break;\n    case \"gain\": fx = new Gain(spec.id, sr, p); break;\n  }\n  if (fx) fx.on = spec.on !== false;\n  return fx;\n}\n/** \u4E00\u6761\u94FE\uFF1A\u6309 spec \u5EFA / \u590D\u7528\u5B9E\u4F8B\uFF08\u540C id \u540C kind \u7684\u7559\u7740\u72B6\u6001\uFF0C\u53EA\u6362\u53C2\u6570\uFF1B\u4E0D\u8BA4\u8BC6\u7684\u8DF3\u8FC7\uFF09\u3002 */\nexport function buildChain(specs: readonly FxV2[], prev: FxInstance[], sr: number): FxInstance[] {\n  const out: FxInstance[] = [];\n  for (const s of specs) {\n    const had = prev.find((f) => f.id === s.id && f.kind === s.kind);\n    if (had) { had.setParams(Object.fromEntries(Object.entries(s.params ?? {}).filter(([, v]) => typeof v === \"number\")) as Record<string, number>); had.on = s.on !== false; out.push(had); continue; }\n    const fx = createFx(s, sr); if (fx) out.push(fx);\n  }\n  return out;\n}\n/** vault README \u7528\uFF1A\u8FD9\u6761\u94FE\u6BCF\u4E2A\u6548\u679C\u7684\u7B97\u6CD5\u8BF4\u660E\u3002 */\nexport function describeFx(spec: FxV2): string { const d = FX_KINDS[spec.kind]; return d ? `${d.name}\uFF08${spec.kind}\uFF09\uFF1A${d.formula}` : `${spec.kind}\uFF1A\u8FD9\u4E00\u7248\u4E0D\u8BA4\u8BC6`; }\n", "// studio.ts \u2014\u2014 \u5F55\u97F3\u623F\u6838\u5FC3\uFF1A\u8D70\u5E26 + \u6BCF\u58F0\u90E8\u4E00\u6761\u901A\u9053 + \u5FEB\u5F15\u64CE\u5B9E\u4F8B\uFF08TinySoundFont / \u5143\u97F3\u91C7\u6837\u5668\uFF09+ \u6162\u5F15\u64CE\u7684\u5757\u56DE\u653E + \u603B\u8F68\uFF08\u589E\u76CA / \u524D\u77BB\u9650\u5E45\uFF09\u3002\n// created 2026-10-09 by Claude Fable 5.1\uFF08\u63D0\u6848 ai-docs/20261009-realtime-preview-engine-proposal.md \u00A75 / \u00A713\uFF1Buser\u300C\u65E7\u5F15\u64CE\u4E0D\u7528\u7559\u5FF5\u5FF5\u65E7\uFF0C\u53EA\u662Fplaceholder\uFF0C\u53EF\u4EE5\u5927\u5200\u9614\u65A7\u6539\u300D\uFF09\u3002\n// \u8FD9\u662F\u4E00\u4E2A**\u4E0D\u4F9D\u8D56\u5BBF\u4E3B**\u7684\u7C7B\uFF1A\u97F3\u9891\u7EBF\u7A0B\u91CC AudioWorklet \u58F3\u6BCF\u5757\uFF08128 \u5E27\uFF09\u8C03\u4E00\u6B21 render\uFF1B\u5BFC\u51FA\u65F6\u540C\u4E00\u4E2A\u7C7B\u5728\u5FAA\u73AF\u91CC\u8C03 render\u2014\u2014\n//   \u540C\u6837\u7684\u5757\u7F51\u683C\u3001\u540C\u6837\u7684\u6570\u5B66 \u2192 \u4E0D\u6389\u5757\u65F6\u9010\u6837\u672C\u76F8\u540C\uFF08user\u300CDAW \u91CC\u9762\u4F60\u5B9E\u65F6\u7684\u548C\u6E32\u67D3\u7684\u4F1A\u4E0D\u4E00\u6837\u2026\u300D= \u77E5\u9053\uFF1B\u7ACB\u573A\u89C1\u63D0\u6848 \u00A713.5\uFF09\u3002\n// \u89C4\u77E9\uFF1A\n//   \u00B7 \u8FD9\u91CC\u53EA\u505A\u4FBF\u5B9C\u7684\u4E8B\uFF08tsf \u6BCF\u58F0\u6BCF\u5757 <1 \u00B5s\uFF0C\u5200 0 \u91CF\u8FC7\uFF1B\u5757\u56DE\u653E\uFF1B\u589E\u76CA / \u58F0\u50CF\uFF1B\u9650\u5E45\uFF09\uFF1B\u8D35\u7684\uFF08\u6708\u8BFB\uFF09\u5728 worker \u91CC\u7B97\u6210\u5757\u3001\u6309\u65F6\u95F4\u7EBF\u6446\u8FDB\u6765\uFF08chunk\uFF09\u3002\n//   \u00B7 render \u91CC\u96F6\u5206\u914D\uFF1A\u7F13\u51B2\u9884\u5206\u914D\u3001\u5757\u7528 Transferable \u9012\u8FDB\u6765\u2014\u2014\u522B\u8BA9\u97F3\u9891\u7EBF\u7A0B\u90A3\u4E00\u4FA7\u7684 GC \u5361\uFF08user\u300C\u6389\u5757\u2026\u6211\u5C31\u662F\u6BD4\u8F83concern\u8FD9\u4E2A\u300D\uFF09\u3002\n//   \u00B7 \u901A\u9053\u53C2\u6570\uFF08\u63A8\u5B50 / \u58F0\u50CF / \u9759\u97F3 / \u72EC\u594F / \u603B\u8F68\uFF09\u548C\u8868\u60C5\u66F2\u7EBF\u90FD\u5728\u64AD\u653E\u65F6\u624D\u4E58\uFF0C\u4E0D\u70E4\u8FDB\u4EFB\u4F55\u7F13\u5B58 \u2192 \u8FB9\u653E\u8FB9\u8C03\u7ACB\u523B\u542C\u89C1\uFF08user\u300C\u65E2\u7136\u662F\u5B9E\u65F6\u6211\u80AF\u5B9A\u662F\u53EF\u4EE5\u8FB9\u653E\u8FB9\u8C03\u6574\u6DF7\u97F3\u7684\u300D\uFF09\u3002\n//   \u00B7 \u8303\u56F4\u5C3E / \u5FAA\u73AF\u70B9\u4E0D\u5207\u5C3E\u97F3\uFF08user\u300C\u540C\u610F\u300D\uFF09\uFF1A\u5230\u4E86\u5C3E\u53EA\u505C\u6B62\u6392\u65B0\u97F3\uFF0C\u6B63\u5728\u54CD\u7684\u97F3\u6536\u5C3E\u3001\u5757\u6DE1\u51FA\uFF1B\u5FAA\u73AF = \u8DF3\u56DE\u53BB\u63A5\u7740\u6392\uFF0C\u4E0D\u518D\u6E32\u67D3\u4E24\u904D\u3002\n//   \u00B7 \u6162\u5F15\u64CE\u7684\u5757\u6CA1\u5230 = \u8D70\u5E26\u51BB\u4F4F\u7B49\uFF08A\uFF0Cuser\u300C\u503E\u5411\u4E8E\u8FD9\u4E2A\u300D\uFF09\uFF1A\u5168\u4F53\u540C\u4E00\u4E2A\u91C7\u6837\u505C\uFF0C\u7EED\u653E\u65F6\u8BE5\u54CD\u7684\u97F3\u91CD\u65B0\u6309\u4E0B\uFF08note chase\uFF09\u3002\u7EDD\u4E0D\u81EA\u52A8\u66FF\u8865\u3002\n//   \u00B7 \u6309\u952E\u8BD5\u542C\uFF08audition\uFF09\u8D70\u901A\u9053\u7684\u589E\u76CA / \u58F0\u50CF\uFF0C\u7ED5\u8FC7\u9759\u97F3 / \u72EC\u594F\u548C\u603B\u8F68\u9650\u5E45\uFF08user\u300C\u6309\u952E\u4E0D\u7BA1solomute\u540C\u610F\u300D\u300C\u9650\u5E45\u55EF\u300D\uFF09\u3002\nimport type { Tsf, TsfBank } from \"../gm/tsf-standalone.ts\";\nimport type { FxV2 } from \"../format/contract.ts\";\nimport { buildChain, type FxInstance } from \"./fx.ts\";\n\nexport const BLOCK = 128;\n/** \u6BCD\u7EBF\u5929\u82B1\u677F\uFF08\u22120.18 dBFS\uFF1B\u539F src/audio/mix.ts \u7684 0.98\uFF09\u3002 */\nexport const CEILING = 0.98;\n/** \u9650\u5E45\u5668\uFF1Aattack 3 ms\uFF08\u63D0\u524D\u6536\uFF09\u3001release 150 ms\uFF08\u6162\u6162\u653E\u5F00\uFF09\uFF1B\u524D\u77BB = 3 \u00D7 attack\uFF08\u539F\u79BB\u7EBF\u7248\u7684\u6307\u6570\u5728 3\u03C4 \u5904\u53EA\u5269 5%\uFF0C\u622A\u5230\u8FD9\u513F\u542C\u4E0D\u51FA\uFF09\u3002 */\nconst LIM_ATTACK = 0.003, LIM_RELEASE = 0.15, LIM_LOOK_TAUS = 3;\n/** \u8303\u56F4\u5C3E\u6700\u591A\u7B49\u5C3E\u5DF4\u54CD\u591A\u4E45\uFF08\u79D2\uFF09\uFF1B\u5757\u6DE1\u51FA / \u8D77\u653E\u6DE1\u5165\uFF08\u79D2\uFF09\uFF1B\u8868\u60C5\u66F2\u7EBF\u7684\u4E00\u9636\u5E73\u6ED1 \u03C4\uFF08\u540C\u539F applyGain\uFF09\u3002 */\nconst TAIL_MAX = 2, CLIP_FADE_OUT = 0.03, CLIP_FADE_IN = 0.01, GAIN_TAU = 0.004;\n/** \u4F4D\u7F6E\u62A5\u544A\u7684\u95F4\u9694\uFF08\u91C7\u6837\uFF09\uFF1A8 \u5757 \u2248 21 ms @48k\uFF08\u4E3B\u7EBF\u7A0B\u6309\u626C\u58F0\u5668\u7684\u65F6\u949F\u5728\u62A5\u544A\u4E4B\u95F4\u5F80\u524D\u63A8\uFF0C\u8DF3 / \u5FAA\u73AF / \u8D77\u653E\u65F6\u53E6\u5916\u7ACB\u523B\u62A5\uFF09\u3002 */\nconst POS_EVERY = 8 * BLOCK;\n/** \u5143\u97F3\u91C7\u6837\u5668\uFF1A\u4E00\u6C60\u6700\u591A\u51E0\u58F0\uFF1B\u5305\u7EDC\uFF08\u79D2\uFF09\u540C\u539F src/singer/sampler.ts\u3002 */\nconst MAX_VOWEL_VOICES = 24, V_ATTACK = 0.01, V_RELEASE = 0.04, V_CUT = 0.006, V_GLIDE = 0.012;\n/** \u5757\u5230\u9F50\u68C0\u67E5\u770B\u591A\u8FDC\uFF08\u79D2\uFF09\u3002 */\nconst LOOKAHEAD = 30;\n\n// \u2500\u2500 \u5951\u7EA6\uFF08\u4E3B\u7EBF\u7A0B \u2194 \u5F55\u97F3\u623F\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/** \u4E00\u4E2A\u8981\u51FA\u58F0\u7684\u97F3\uFF08\u65F6\u95F4\u7EBF\u4E0A\u7684\u79D2\uFF09\u3002preset = \u8FD9\u4EFD\u5E93\u91CC\u7684\u9884\u8BBE\u4E0B\u6807\uFF08\u4E3B\u7EBF\u7A0B\u6309 bank:program \u67E5\u8FC7\uFF09\uFF1Bvel 0\u20131\u3002 */\nexport interface NoteEv { t0: number; t1: number; key: number; vel: number; preset: number }\n/** \u6162\u5F15\u64CE\u7684\u4E00\u5757\uFF1Akey = \u5185\u5BB9\u952E\uFF08\u4E3B\u7EBF\u7A0B\u6309 key \u5582 samples\uFF09\uFF1Bt0 = \u8FD9\u5757\u7B2C 0 \u4E2A\u91C7\u6837\u5BF9\u5E94\u65F6\u95F4\u7EBF\u7684\u7B2C\u51E0\u79D2\uFF08\u542B\u63D0\u524D\u91CF\uFF09\uFF1Bdur = \u9884\u8BA1\u51E0\u79D2\uFF08\u6CA1\u5230\u65F6\u5224\u65AD\u300C\u7AD9\u5728\u5B83\u4E0A\u9762\u300D\uFF09\uFF1Bgain = \u4E58\u591A\u5C11\u3002 */\nexport interface ClipRef { key: string; t0: number; dur: number; gain: number; /** \u5531\u7684\u6700\u540E\u4E00\u4E2A\u97F3\u7ED3\u675F\u7684\u79D2\uFF08t0 + dur \u8FD8\u542B\u6536\u5C3E\u4F59\u97F3\uFF09\uFF1B\u4ECE\u67D0\u4E00\u6BB5\u653E\u65F6\uFF0Cend \u2264 \u8D77\u70B9\u7684\u5757\u4E0D\u653E\u3002 */ end?: number }\nexport interface GainSeg { t0: number; t1: number; dB: number }\n/** chain = \u8DDF\u7740\u6F14\u594F\u8005\u8D70\u7684\u6548\u679C\uFF08\u7434\u7BB1 / \u97F3\u7BB1\u2026\uFF1BCandidateV2.chain\uFF09\uFF0C\u5728\u8868\u60C5\u66F2\u7EBF\u4E4B\u540E\u3001\u901A\u9053\u6761\u4E4B\u524D\u3002 */\nexport type TrackSpec =\n  | { id: string; kind: \"sf\"; sha: string; notes: NoteEv[]; gain: GainSeg[] | null; chain?: FxV2[] }\n  | { id: string; kind: \"vowel\"; kana: string; notes: NoteEv[]; gain: GainSeg[] | null; chain?: FxV2[] }\n  | { id: string; kind: \"clips\"; clips: ClipRef[]; gain: GainSeg[] | null; chain?: FxV2[] };\nexport interface TimelineMsg { tracks: TrackSpec[]; range: { from: number; to: number }; loop: boolean; /** \u5FAA\u73AF\u4ECE\u54EA\u513F\u8DF3\u56DE\uFF08\u4E0D\u7ED9 = \u8303\u56F4\u5934\uFF09\uFF1A\u7F16\u6392\u300C\u524D\u9762\u653E\u4E00\u904D\u3001\u62EC\u4F4F\u7684\u4E00\u76F4\u5FAA\u73AF\u300D\u3002 */ loopFrom?: number;\n  /** \u653E\u7740\u7684\u65F6\u5019\u6362\u65F6\u95F4\u7EBF\uFF1A\u64AD\u653E\u5934\u632A\u8FD9\u4E48\u591A\u79D2\uFF08\u4E3B\u7EBF\u7A0B\u6309\u8C31\u4F4D\u7F6E\u7B97\u7684\uFF1A\u6539\u4E86\u64AD\u653E\u5934\u524D\u9762\u7684\u4E1C\u897F / \u53CD\u590D\u7ED3\u6784\uFF0C\u79D2\u6570\u4E0D\u53D8\u4F1A\u8DF3\u5230\u522B\u7684\u97F3\u4E0A\uFF09\u3002 */ shift?: number }\n/** \u4E00\u6761\u901A\u9053\uFF08\u8F68 \u2260 \u4E50\u624B\uFF1A\u4E50\u624B\u7684\u901A\u9053\u3001\u603B\u7EBF\u3001\u4EE5\u540E\u7684\u7D20\u6750\u8F68\u90FD\u662F\u8FD9\u4E2A\u5F62\u72B6\uFF1Buser 2026-10-10\u300C\u8F68\u8FD8\u662F\u548C\u4E50\u624B\u662F\u4E24\u4E2A\u6982\u5FF5\u300D\uFF09\uFF1A\n *  chain = \u901A\u9053\u6761\u4E0A\u7684\u6548\u679C\uFF08EQ / \u538B\u7F29\uFF08\u53EF\u4FA7\u94FE key = \u522B\u7684\u8F68 id\uFF09\u2026\uFF09\uFF1Bsends = \u63A8\u5B50\u4E4B\u540E\u53D1\u5230\u603B\u7EBF\u591A\u5C11\uFF1Bto = \u53BB\u54EA\uFF08\"master\" / \u603B\u7EBF id\uFF09\u3002 */\nexport interface ChannelParams { gainDb: number; pan: number; mute: boolean; solo: boolean; chain?: FxV2[]; sends?: { to: string; gainDb: number }[]; to?: string }\n/** \u8DEF\u7531\u8F68\uFF08\u603B\u7EBF\uFF09\uFF1Ato = \u51FA\u5230\u54EA\uFF08\"master\" / \u522B\u7684\u603B\u7EBF\uFF09\uFF1Bsends = \u63A8\u5B50\u540E\u53D1\u7ED9\u522B\u7684\u603B\u7EBF\uFF08v0.10.9\uFF1A\u603B\u7EBF\u4E5F\u80FD\u63A5\u603B\u7EBF\uFF1Buser\u300C\u63D2\u4EF6\uFF1A\u53EF\u4EE5\u968F\u4FBF\u63D2\uFF0C\u6BD4\u5982\u6DF7\u54CD\u4E5F\u662F\uFF0C\u4F60\u53EF\u4EE5\u505A\u4E2D\u95F4\u7684\u8DEF\u7531\u8F68\u300D\uFF09\u3002 */\nexport interface BusSpec { id: string; gainDb: number; pan: number; chain: FxV2[]; to?: string; sends?: { to: string; gainDb: number }[]; /** \u9759\u97F3\uFF08v0.10.35\uFF0C\u89C6\u56FE\u6001\uFF09\uFF1A\u8FD9\u6761\u6DF7\u97F3\u8F68\u4E0D\u51FA\u58F0\u3001\u4E5F\u4E0D\u5F80\u4E0B\u53D1\u3002 */ mute?: boolean }\nexport interface MasterParams { gainDb: number; limiter: boolean; chain?: FxV2[] }\n/** \u5143\u97F3\u8868\uFF08assets/preview/vowels.json + .pcm16 \u7684\u5F62\u72B6\uFF09\u3002 */\nexport interface VowelEntry { kana: string; midi: number; start: number; len: number; loopStart: number; loopEnd: number }\nexport type AuditionInst = { kind: \"sf\"; sha: string; preset: number } | { kind: \"vowel\"; kana: string } | { kind: \"clip\" };\nexport type StudioIn =\n  | { type: \"bank\"; sha: string; bytes: Uint8Array }\n  | { type: \"unbank\"; sha: string }\n  | { type: \"vowels\"; sr: number; entries: VowelEntry[]; pcm: Int16Array }\n  | { type: \"timeline\"; tl: TimelineMsg }\n  | { type: \"chunk\"; key: string; sr: number; samples: Float32Array | Int16Array; k?: number }\n  | { type: \"forget\"; keys: string[] }\n  /** \u79BB\u7EBF\u5BFC\u51FA\u8981\u5757\uFF08\u4E3B\u7EBF\u7A0B\u4E0D\u518D\u7559\u62F7\u8D1D\uFF09\uFF1A\u5F55\u97F3\u623F\u628A\u8FD9\u51E0\u5757\u62F7\u4E00\u4EFD\u53D1\u56DE\u6765\u3002 */\n  | { type: \"getChunks\"; keys: string[] }\n  | { type: \"channel\"; id: string; p: Partial<ChannelParams> }\n  | { type: \"buses\"; buses: BusSpec[] }\n  | { type: \"master\"; p: Partial<MasterParams> }\n  | { type: \"play\"; at?: number; gen?: number; /** \u8D77\u70B9\uFF08\u4ECE\u67D0\u4E00\u6BB5\u653E\uFF1Aat \u6BD4\u5B83\u63D0\u524D\u4E00\u70B9\u7ED9\u8F85\u97F3\uFF09\uFF1A\u5728\u5B83\u4E4B\u524D\u5C31\u7ED3\u675F\u7684\u97F3\u4E0D\u8FFD\u3001\u4E0D\u6309\uFF0C\u5531\u5B8C\u5728\u5B83\u4E4B\u524D\u7684\u5757\u4E0D\u653E\uFF08v0.10.3\uFF09\u3002 */ quiet?: number }   // gen = \u4E3B\u7EBF\u7A0B\u7684\u8D70\u5E26\u4EE3\u53F7\uFF1A\u4F4D\u7F6E\u62A5\u544A\u5E26\u7740\u5B83\uFF0C\u505C\u4E86\u4E4B\u540E\u8FDF\u5230\u7684\u62A5\u544A\u4E3B\u7EBF\u7A0B\u80FD\u8BA4\u51FA\u6765\u6254\u6389\n  | { type: \"stop\" }\n  | { type: \"seek\"; at: number; quiet?: number }\n  /** \u6309\u952E\u8BD5\u542C\uFF1Asrc = \u6765\u6E90\uFF08\u624B\u6307 / \u952E\uFF09\uFF0C\u540C\u4E00\u6765\u6E90\u65B0\u7684\u9876\u6389\u65E7\u7684\uFF1BgainDb / pan = \u8FD9\u6761\u901A\u9053\uFF08\u9EA6\u514B\u98CE + \u6821\u51C6\uFF09+ \u5149\u6807\u5904\u7684\u529B\u5EA6\u3002 */\n  | { type: \"audition\"; src: string; ev: \"on\" | \"off\" | \"glide\" | \"alloff\"; inst?: AuditionInst; key?: number; vel?: number; gainDb?: number; pan?: number }\n  /** \u6309\u952E\u8BD5\u542C\uFF1A\u653E\u4E00\u6BB5\u73B0\u6210\u7684\u58F0\u97F3\uFF08\u6708\u8BFB\u5531\u7684\u4E00\u4E2A\u5B57\uFF1B\u5200 3\uFF09\u3002\u540C\u4E00\u6765\u6E90\u65B0\u7684\u9876\u6389\u65E7\u7684\uFF1Boff \u8D70 audition off\u3002 */\n  | { type: \"auditionClip\"; src: string; sr: number; samples: Float32Array; gainDb?: number; pan?: number }\n  | { type: \"meter\"; on: boolean }\n  /** \u9891\u8C31\uFF08v0.10.11\uFF09\uFF1A\u5F00\u7740 = \u6BCF\u6761\u8F68\uFF08\u94FE\u4E4B\u540E\u3001\u63A8\u5B50\u4E4B\u524D\uFF09/ \u6DF7\u97F3\u8F68\uFF08\u94FE\u4E4B\u540E\uFF09/ \u603B\u8F68\uFF08\u51FA\u53E3\uFF09\u7559\u6700\u8FD1 2048 \u4E2A\u91C7\u6837\uFF0C\u6BCF 4096 \u5E27\u62F7\u4E00\u4EFD\u7ED9\u4E3B\u7EBF\u7A0B\u3002\u6DF7\u97F3\u53F0 EQ \u9875\u770B\u5F97\u89C1\u624D\u5F00\u3002 */\n  | { type: \"spectrum\"; on: boolean }\n  | { type: \"stereo\"; on: boolean };   // \u674E\u8428\u5982\u56FE\uFF08\u603B\u8F68 / \u6DF7\u97F3\u8F68\uFF09\uFF1A\u5F00\u7740\u624D\u6512\uFF08v0.10.16\uFF1B\u6DF7\u97F3\u53F0\u300C\u57FA\u7840\u300D\u9875\u770B\u5F97\u89C1\u65F6\uFF09\nexport type StudioOut =\n  | { type: \"ready\" }\n  | { type: \"banked\"; sha: string; presets: [number, number][] }\n  | { type: \"error\"; message: string }\n  | { type: \"crash\"; message: string }   // \u6E32\u67D3\u91CC\u629B\u4E86\uFF08studio-processor.ts \u63A5\u4F4F\uFF1A\u505C\u8D70\u5E26\u3001\u8282\u70B9\u7167\u6D3B\uFF09\n  /** at = \u8FD9\u4E2A\u4F4D\u7F6E\u5BF9\u5E94\u7684\u97F3\u9891\u65F6\u949F\uFF08AudioContext \u7684\u79D2\uFF1B\u5BBF\u4E3B\u7ED9\u4E86 clock \u624D\u6709\uFF09\uFF1A\u4E3B\u7EBF\u7A0B\u62FF\u626C\u58F0\u5668\u6B64\u523B\u7684\u65F6\u949F\uFF08getOutputTimestamp\uFF09\u6765\u67E5\u300C\u73B0\u5728\u542C\u5230\u7684\u662F\u8D70\u5E26\u7684\u54EA\u513F\u300D\u3002 */\n  | { type: \"pos\"; sec: number; playing: boolean; waiting: string | null; gen: number; at?: number }\n  | { type: \"ended\"; gen: number }\n  | { type: \"missing\"; keys: string[] }\n  | { type: \"chunks\"; items: { key: string; sr: number; samples: Int16Array; k?: number }[] }\n  | { type: \"meter\"; peak: number; active: number; /** \u6BCF\u6761\u8F68 / \u6DF7\u97F3\u8F68\u63A8\u5B50\u540E\u7684\u5CF0\u503C\uFF08v0.10.10\uFF1A\u6DF7\u97F3\u53F0\u6BCF\u5F20\u5361\u7247\u9876\u4E0A\u4E00\u6761\u7EC6\u7EBF\uFF09\u3002 */ tracks?: Record<string, number>;\n      /** \u8FD9\u4E00\u6BB5\u63A8\u5B50\u540E\u7684\u5747\u65B9\uFF08v0.10.16\uFF1A\u5E73\u5747\u7535\u5E73 = RMS\uFF1B\u5355\u58F0\u9053\u8F68 = (x\u00B7\u63A8\u5B50)\u00B2\uFF0C\u7ACB\u4F53\u58F0 = (L\u00B2 + R\u00B2) / 2\uFF1B\u603B\u8F68 = \u51FA\u58F0\u53E3\uFF09\u3002 */ ms?: Record<string, number>;\n      /** \u6BCF\u6761\u8F68\u4E0A\u7B2C\u4E00\u53F0\u538B\u7F29\u8FD9\u4E00\u6BB5\u6700\u591A\u538B\u4E86\u591A\u5C11 dB\uFF08\u2264 0\uFF1Bv0.10.16 \u538B\u7F29\u9875\u7684\u8868\uFF09\u3002 */ gr?: Record<string, number>;\n      /** \u540C\u4E00\u53F0\u538B\u7F29\u8FD9\u4E00\u6BB5\u8FDB / \u51FA\u7684\u5CF0\u503C\uFF08\u7EBF\u6027\uFF1Bv0.10.21 \u538B\u7F29\u9875\u7684\u6CE2\u5F62\u56FE\uFF09\u3002 */ cl?: Record<string, [number, number]> }\n  | { type: \"spectrum\"; sr: number; tracks: Record<string, Float32Array> }\n  | { type: \"stereo\"; tracks: Record<string, { L: Float32Array; R: Float32Array }> }\n  /** \u6BCF\u79D2\u4E00\u6761\uFF08\u4E00\u76F4\u5F00\u7740\uFF0C\u4FBF\u5B9C\uFF09\uFF1A\u97F3\u9891\u7EBF\u7A0B\u8FD9 1 s \u7684\u5FD9\u95F2\uFF08\u6E32\u67D3\u8017\u65F6 / \u8FD9 1 s\uFF09\u3001\u5F55\u97F3\u623F\u91CC\u7559\u7740\u7684\u5757\uFF08Int16 \u5B57\u8282\u6570 / \u5757\u6570\uFF09\u3001\u6B63\u5728\u54CD\u7684\u58F0\u97F3\u6570\u3002\u5200 6 \u8D1F\u8F7D / \u5185\u5B58\u76D1\u63A7\u3002 */\n  | { type: \"load\"; busy: number; chunkBytes: number; chunks: number; voices: number };\n\n// \u2500\u2500 \u5185\u90E8\u72B6\u6001 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ninterface Chunk { sr: number; samples: Int16Array; /** \u5B58\u7684\u65F6\u5019\u7F29\u4E86\u51E0\u500D\uFF08\u5408\u6210\u51FA\u6765\u8D85\u8FC7\u6EE1\u5E45\u7684\u5757\uFF1A\u6574\u5757\u6309\u5CF0\u503C\u7F29\u8FDB Int16 \u518D\u4E58\u56DE\u6765 = \u4E0D\u524A\u9876\uFF1B\u6CA1\u6709 = 1\uFF1Bv0.10.38\uFF09\u3002 */ k?: number }   // \u5757\u5B58 Int16\uFF08\u5200 5 \u7CBE\u5EA6\u5206\u7EA7\uFF1A\u4E00\u534A\u5185\u5B58\uFF1B\u653E\u7684\u65F6\u5019\u4E58\u56DE\u6765\uFF09\ninterface VowelVoice { src: string | null; data: Float32Array; pos: number; rate: number; target: number; loopStart: number; loopEnd: number; env: number; state: \"attack\" | \"hold\" | \"release\" | \"cut\"; gl: number; gr: number; key: number; baseMidi: number }\ninterface VowelTable { sr: number; entries: (VowelEntry & { data: Float32Array })[] }\ninterface SfPlayer { bank: TsfBank; player: TsfBank }\ninterface TrackState {\n  spec: TrackSpec;\n  ch: ChannelParams;\n  gl: number; gr: number;                 // \u73B0\u5728\u7684\u7EBF\u6027\u589E\u76CA\uFF08\u53BB\u62C9\u94FE\u7528\uFF09\n  y: number; gk: number;                  // \u8868\u60C5\u66F2\u7EBF\uFF1A\u5F53\u524D\u5E73\u6ED1\u503C\u3001\u6BB5\u4E0B\u6807\n  nextNote: number;                       // \u4E0B\u4E00\u4E2A\u8FD8\u6CA1\u6309\u4E0B\u7684\u97F3\n  offs: { t: number; key: number; preset: number }[];   // \u5DF2\u6309\u4E0B\u3001\u7B49\u7740\u677E\u5F00\u7684\u97F3\uFF08\u6309 t \u6392\uFF09\n  sf: SfPlayer | null;\n  vowels: VowelVoice[];\n  env: number; envTarget: number;         // \u5757\u8F68\u7684\u6DE1\u5165\u6DE1\u51FA\uFF08\u8D77\u653E / seek / \u8303\u56F4\u5C3E\uFF09\n  /** \u653E\u7740\u7684\u65F6\u5019\u8FD9\u4E00\u53E5\u7684\u5531\u8C31\u6539\u4E86\uFF1A\u65E7\u7684\u90A3\u5757\u7559\u5230\u54CD\u5B8C\uFF08until\uFF09\u518D\u6362\u65B0\u7684\uFF08user\u300C\u6B63\u5728\u54CD\u7684\u90A3\u53E5\u4E0D\u6362\u3001\u54CD\u5B8C\u6362\u65B0\u300D\uFF09\uFF1B\u65B0\u5757\u6CA1\u5230\u4E5F\u4E0D\u51BB\u3002 */\n  hold: { key: string; t0: number; dur: number; gain: number; until: number } | null;\n  src: Float32Array; out: Float32Array;   // \u7B2C\u4E00\u8D9F\uFF08\u51FA\u58F0 + \u66F2\u7EBF + \u6F14\u594F\u8005\u94FE\uFF09/ \u7B2C\u4E8C\u8D9F\uFF08\u901A\u9053\u94FE\uFF09\u7684\u8FD9\u4E00\u6BB5\uFF1Bsrc \u7ED9\u522B\u7684\u8F68\u5F53\u4FA7\u94FE key\n  perfFx: FxInstance[]; chFx: FxInstance[];\n}\ninterface Bus { id: string; gainDb: number; pan: number; mute: boolean; gl: number; gr: number; fx: FxInstance[]; L: Float32Array; R: Float32Array; /** \u51FA\u5230\u7684\u603B\u7EBF\uFF08null = \u603B\u8F68\uFF09\u3002 */ out: Bus | null; sends: { bus: Bus; lin: number }[] }\ninterface Audition { inst: AuditionInst; key: number; gl: number; gr: number }\ninterface ClipVoice { src: string; data: Float32Array; ratio: number; pos: number; env: number; state: \"attack\" | \"hold\" | \"release\" | \"cut\"; gl: number; gr: number }\n\nconst dbToLin = (dB: number) => (dB === -Infinity ? 0 : 10 ** (dB / 20));\nconst now: () => number = typeof performance !== \"undefined\" && typeof performance.now === \"function\" ? () => performance.now() : () => Date.now();\nconst I16 = 1 / 32768;\n/** Float32 \u2192 Int16\uFF08\u5939\u5230 \u00B11\uFF09\u3002 */\n/** Float32 \u2192 Int16 \u4E0D\u524A\u9876\uFF08v0.10.38\uFF1Buser\u300C\u5408\u6210\u7ED3\u679C\u8F6C\u6210 16 \u4F4D\u65F6\u8D85\u8FC7\u6EE1\u5E45\u4F1A\u88AB\u76F4\u63A5\u524A\u9876\u2026\u8FD9\u4E2A\u4F60\u4E5F\u80FD\u4FEE\u5427\u300D\uFF09\uFF1A\u6574\u5757\u5CF0\u503C\u8D85\u8FC7\u6EE1\u5E45 = \u6574\u5757\u6309\u5CF0\u503C\u7F29\u8FDB\u6765\uFF08k = \u5CF0\u503C\uFF09\uFF0C\n *  \u653E\u7684\u65F6\u5019\u4E58\u56DE k\u2014\u2014\u97F3\u91CF\u4E0D\u53D8\u3001\u4E0D\u524A\u9876\uFF08toInt16 \u5728 \u00B11 \u5904\u786C\u524A = \u6708\u8BFB\u5408\u6210\u51B2\u8FC7\u6EE1\u5E45\u90A3\u4E00\u4E0B\u5C31\u6210\u4E86\u7206\u97F3\uFF09\u3002\u6CA1\u8D85 = k 1\uFF0C\u548C toInt16 \u4E00\u6837\u3002 */\nexport function packInt16(x: Float32Array): { s: Int16Array; k: number } {\n  let pk = 0; for (let i = 0; i < x.length; i++) { const a = Math.abs(x[i]); if (a > pk) pk = a; }\n  if (pk <= 1) return { s: toInt16(x), k: 1 };\n  const s = new Int16Array(x.length), f = 32767 / pk; for (let i = 0; i < x.length; i++) s[i] = Math.round(x[i] * f);\n  return { s, k: pk };\n}\nexport function toInt16(x: Float32Array): Int16Array { const out = new Int16Array(x.length); for (let i = 0; i < x.length; i++) { const v = x[i]; out[i] = v >= 1 ? 32767 : v <= -1 ? -32768 : Math.round(v * 32767); } return out; }\nconst panGains = (gainDb: number, pan: number): [number, number] => { const g = dbToLin(gainDb), p = Math.max(-1, Math.min(1, pan)); return [g * Math.cos(((p + 1) * Math.PI) / 4), g * Math.sin(((p + 1) * Math.PI) / 4)]; };\nconst DEFAULT_CH: ChannelParams = { gainDb: 0, pan: 0, mute: false, solo: false };\n\nexport class Studio {\n  readonly sr: number;\n  private tsf: Tsf;\n  private post: (m: StudioOut, transfer?: Transferable[]) => void;\n  private banks = new Map<string, TsfBank>();\n  private vowels: VowelTable | null = null;\n  private chunks = new Map<string, Chunk>();\n  private tracks = new Map<string, TrackState>();\n  private order: string[] = [];\n  private channels = new Map<string, ChannelParams>();   // \u65F6\u95F4\u7EBF\u6362\u4E86\u4E5F\u7559\u7740\uFF08\u8FB9\u653E\u8FB9\u8C03\u4E0D\u4E22\uFF09\n  private buses = new Map<string, Bus>();\n  /** \u5904\u7406\u603B\u7EBF\u7684\u987A\u5E8F\uFF1A\u9001\u51FA\u53BB\u7684\u5728\u88AB\u9001\u8FDB\u7684\u524D\u9762\uFF08busOrder\uFF09\u3002 */\n  private busList: Bus[] = [];\n  private master: MasterParams = { gainDb: 0, limiter: true };\n  private masterLin = 1;\n  private masterFx: FxInstance[] = [];\n  // \u8D70\u5E26\n  private playing = false;\n  private pos = 0;                         // \u79D2\uFF08\u65F6\u95F4\u7EBF\uFF09\n  private range = { from: 0, to: 0 };\n  private loop = false;\n  private loopFrom: number | null = null;\n  private tail = -1;                       // \u22650 = \u8303\u56F4\u5C3E\uFF1A\u5DF2\u7ECF\u7B49\u4E86\u51E0\u79D2\n  private draining = false; private drainPos = 0; private drainSecs = 0;   // \u505C\u4E86\u4E4B\u540E\uFF1A\u91CA\u653E\u4E2D\u7684\u5C3E\u5DF4\u7167\u54CD\u5230\u9759\uFF08\u4E0D\u6E32\u67D3 = \u51BB\u4F4F\uFF0C\u4E0B\u6B21\u653E\u624D\u6F0F\u51FA\u6765\uFF1Buser\u300C\u6BCF\u6B21\u70B9play\u7684\u65F6\u5019\u4F1A\u6F0F\u4E0A\u6B21\u7684\u6700\u540E\u4E00\u4E2A\u97F3\u300D\uFF09\n  private forgetLater = new Set<string>();   // \u4E3B\u7EBF\u7A0B\u8981\u653E\u6389\u3001\u4F46\u6B63\u88AB hold \u7740\u7684\u5757\uFF1A\u54CD\u5B8C\u518D\u5220\n  private waiting: string | null = null;   // \u5757\u6CA1\u5230\uFF1A\u7B49\u5B83\uFF08\u8D70\u5E26\u51BB\u4F4F\uFF09\n  private gen = 0;                         // \u8D70\u5E26\u4EE3\u53F7\uFF08\u4E3B\u7EBF\u7A0B\u7ED9\uFF1B\u62A5\u544A\u5E26\u7740\u5B83\uFF09\n  // \u8BD5\u542C\n  private auditionSf = new Map<string, SfPlayer>();   // sha \u2192 \u8BD5\u542C\u7528\u7684 player\uFF08\u548C\u65F6\u95F4\u7EBF\u7684\u5206\u5F00\uFF1A\u7ED5\u8FC7\u9759\u97F3 / \u72EC\u594F\uFF09\n  private auditions = new Map<string, Audition>();     // src \u2192 \u6B63\u5728\u6309\u7740\u7684\n  private auditionVowels: VowelVoice[] = [];\n  private auditionClips: ClipVoice[] = [];\n  private lastAud = new Map<string, [number, number]>();   // sha \u2192 \u6700\u540E\u4E00\u6B21\u8BD5\u542C\u7684\u589E\u76CA / \u58F0\u50CF\uFF08\u677E\u5F00\u540E\u5C3E\u5DF4\u7167\u8FD9\u4E2A\uFF09\n  // \u7F13\u51B2\uFF08\u96F6\u5206\u914D\uFF09\n  private mono = new Float32Array(BLOCK);\n  private busL = new Float32Array(BLOCK); private busR = new Float32Array(BLOCK);\n  private audL = new Float32Array(BLOCK); private audR = new Float32Array(BLOCK);\n  // \u9650\u5E45\u5668\n  private look: number; private delayL: Float32Array; private delayR: Float32Array; private need: Float32Array; private attPow: Float32Array;\n  private wr = 0; private gPrev = 1; private aRel: number;\n  // \u8868 / \u62A5\u544A\n  private meterOn = false; private meterPeak = 0; private meterFrames = 0;\n  /** \u6BCF\u6761\u8F68 / \u6DF7\u97F3\u8F68\u8FD9\u4E00\u6BB5\u63A8\u5B50\u540E\u7684\u5CF0\u503C\uFF08\u53EA\u5728 meterOn \u65F6\u6512\uFF1B\u6DF7\u97F3\u53F0\u5F00\u7740\u624D\u5F00\uFF09\u3002 */\n  private trackPeaks = new Map<string, number>();\n  private specOn = false; private specFrames = 0;\n  /** \u5E73\u5747\u7535\u5E73 / \u538B\u7F29\u7684\u8868\uFF08meterOn \u65F6\u6512\uFF09\uFF1A\u5747\u65B9\u7684\u548C + \u5E27\u6570\uFF1B\u6700\u591A\u538B\u4E86\u591A\u5C11 dB\u3002 */\n  private trackMs = new Map<string, number>(); private grMin = new Map<string, number>(); private compLv = new Map<string, [number, number]>();\n  /** \u674E\u8428\u5982\u56FE\uFF1A\u603B\u8F68 / \u6DF7\u97F3\u8F68\u63A8\u5B50\u540E\u7684\u5DE6\u53F3\u6700\u8FD1 STEREO_N \u4E2A\u91C7\u6837\u3002 */\n  private stereoOn = false; private stereoFrames = 0;\n  private stereoRings = new Map<string, { L: Float32Array; R: Float32Array; w: number }>();\n  private stereoPush(id: string, l: number, r: number): void {\n    let g = this.stereoRings.get(id); if (!g) { g = { L: new Float32Array(STEREO_N), R: new Float32Array(STEREO_N), w: 0 }; this.stereoRings.set(id, g); }\n    g.L[g.w] = l; g.R[g.w] = r; g.w = (g.w + 1) & (STEREO_N - 1);\n  }\n  /** \u7B2C\u4E00\u53F0\u538B\u7F29\uFF08\u538B\u7F29\u9875\u644A\u5F00\u7684\u5C31\u662F\u5B83\uFF09\u8FD9\u4E00\u5757\u538B\u4E86\u591A\u5C11 + \u8FDB / \u51FA\u7684\u5CF0\u503C\u3002\u6CA1\u6709\u538B\u7F29 / \u5173\u7740 = \u8FDB\u51FA\u90FD\u6309\u8FD9\u6761\u8F68\u94FE\u5C3E\u3001\u63A8\u5B50\u524D\u7684\u5CF0\u503C `pre`\uFF0C\u538B\u4E86 0\n   *  \uFF08v0.10.26\uFF0Cuser\u300C\u6548\u679C\u5668\u7684\u52A8\u753B\u6CA1\u5F00\u6548\u679C\u5668\u7684\u5361\u4E0A\u9762\u4E5F\u5E94\u8BE5\u6709\u300D\uFF1A\u6BCF\u5F20\u5361\u90FD\u6709\u6CE2\u5F62\uFF0C\u770B\u5F97\u51FA\u54EA\u513F\u51B2\u3001\u8981\u4E0D\u8981\u538B\uFF09\u3002 */\n  private grOf(id: string, fx: readonly FxInstance[], pre: number): void {\n    const c = fx.find((f) => f.kind === \"comp\") as (FxInstance & { gainReductionDb?: number; inPeak?: number; outPeak?: number }) | undefined;\n    const on = !!c && c.on, lv = this.compLv.get(id) ?? [0, 0];\n    if (!on) { this.compLv.set(id, [Math.max(lv[0], pre), Math.max(lv[1], pre)]); return; }\n    const v = c.gainReductionDb ?? 0; this.grMin.set(id, Math.min(this.grMin.get(id) ?? 0, v));\n    this.compLv.set(id, [Math.max(lv[0], c.inPeak ?? 0), Math.max(lv[1], c.outPeak ?? 0)]);\n  }\n  private specRings = new Map<string, { buf: Float32Array; w: number }>();\n  /** \u5F80\u67D0\u6761\u8F68\u7684\u9891\u8C31\u73AF\u91CC\u5199\u4E00\u6BB5\uFF08\u5355\u58F0\u9053\uFF1B\u7ACB\u4F53\u58F0\u7684\u4F20\u4E24\u8DEF\u53D6\u5E73\u5747\uFF09\uFF1Bg0 \u2192 g1 = \u8FD9\u4E00\u6BB5\u7684\u63A8\u5B50\uFF08\u7EBF\u6027\u6E10\u53D8\uFF0C\u548C\u51FA\u58F0\u540C\u4E00\u6761\u659C\u5761\uFF09\u3002 */\n  private specPush(id: string, a: Float32Array, b: Float32Array | null, n: number, g0 = 1, g1 = g0): void {\n    let r = this.specRings.get(id); if (!r) { r = { buf: new Float32Array(SPEC_N), w: 0 }; this.specRings.set(id, r); }\n    const buf = r.buf, dg = (g1 - g0) / n; let w = r.w, g = g0;\n    for (let i = 0; i < n; i++) { g += dg; buf[w] = (b ? (a[i] + b[i]) * 0.5 : a[i]) * g; w = (w + 1) & (SPEC_N - 1); }\n    r.w = w;\n  }\n  private loadBusy = 0; private loadFrames = 0; private chunkBytes = 0;   // \u8D1F\u8F7D / \u5185\u5B58\u76D1\u63A7\uFF08\u5200 6\uFF09\n  private posFrames = 0;\n  /** \u5BBF\u4E3B\u7684\u97F3\u9891\u65F6\u949F\uFF1A\u8FD9\u4E00\u5757\u5F00\u5934\u7684 AudioContext \u65F6\u95F4\uFF08worklet \u6BCF\u5757\u524D\u8BBE = currentTime\uFF1B\u79BB\u7EBF / \u6D4B\u8BD5\u4E0D\u8BBE\uFF09\u3002\u4F4D\u7F6E\u62A5\u544A\u5E26\u4E0A\u300C\u5757\u5C3E\u7684\u65F6\u949F\u300D\u3002 */\n  clock: number | null = null;\n  private missingSent = new Set<string>();\n\n  constructor(sampleRate: number, tsf: Tsf, post: (m: StudioOut, transfer?: Transferable[]) => void) {\n    this.sr = sampleRate; this.tsf = tsf; this.post = post;\n    this.look = Math.max(1, Math.round(LIM_ATTACK * LIM_LOOK_TAUS * sampleRate));\n    this.delayL = new Float32Array(this.look); this.delayR = new Float32Array(this.look); this.need = new Float32Array(this.look).fill(1);\n    const aAtt = Math.exp(-1 / (LIM_ATTACK * sampleRate)); this.attPow = Float32Array.from({ length: this.look + 1 }, (_, k) => aAtt ** k);\n    this.aRel = Math.exp(-1 / (LIM_RELEASE * sampleRate));\n  }\n  /** \u9650\u5E45\u5668\u5E26\u6765\u7684\u56FA\u5B9A\u5EF6\u8FDF\uFF08\u91C7\u6837\uFF09\uFF1A\u5BFC\u51FA\u65F6\u4ECE\u8F93\u51FA\u91CC\u6263\u6389\u3002 */\n  get latency(): number { return this.master.limiter ? this.look : 0; }\n  get isPlaying(): boolean { return this.playing; }\n  get position(): number { return this.pos; }\n  get waitingFor(): string | null { return this.waiting; }\n  hasChunk(key: string): boolean { return this.chunks.has(key); }\n\n  // \u2500\u2500 \u6D88\u606F \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  handle(m: StudioIn): void {\n    switch (m.type) {\n      case \"bank\": {\n        let b = this.banks.get(m.sha);\n        if (!b) {\n          const loaded = this.tsf.load(m.bytes, this.sr, 256);\n          if (!loaded) { this.post({ type: \"error\", message: `studio: not a SoundFont 2 file (${m.sha.slice(0, 12)})` }); return; }\n          b = loaded; this.banks.set(m.sha, b);\n          for (const t of this.tracks.values()) if (t.spec.kind === \"sf\" && t.spec.sha === m.sha && !t.sf) t.sf = this.playerFor(b);\n        }\n        this.post({ type: \"banked\", sha: m.sha, presets: b.presets.map((p) => [p.bank, p.program]) });\n        return;\n      }\n      case \"unbank\": {\n        const b = this.banks.get(m.sha); if (!b) return;\n        for (const t of this.tracks.values()) if (t.sf && t.sf.bank === b) { this.tsf.close(t.sf.player); t.sf = null; }\n        const a = this.auditionSf.get(m.sha); if (a) { this.tsf.close(a.player); this.auditionSf.delete(m.sha); }\n        for (const [src, au] of this.auditions) if (au.inst.kind === \"sf\" && au.inst.sha === m.sha) this.auditions.delete(src);\n        this.tsf.close(b); this.banks.delete(m.sha);\n        return;\n      }\n      case \"vowels\": {\n        const entries = m.entries.map((e) => { const data = new Float32Array(e.len); for (let k = 0; k < e.len; k++) data[k] = m.pcm[e.start + k] / 32768; return { ...e, data }; });\n        this.vowels = { sr: m.sr, entries };\n        return;\n      }\n      case \"timeline\": this.setTimeline(m.tl); return;\n      case \"chunk\": { this.dropChunk(m.key); const p = m.samples instanceof Int16Array ? { s: m.samples, k: m.k ?? 1 } : packInt16(m.samples), samples = p.s; this.chunks.set(m.key, { sr: m.sr, samples, ...(p.k !== 1 ? { k: p.k } : {}) }); this.chunkBytes += samples.byteLength; this.missingSent.delete(m.key); return; }\n      case \"getChunks\": { const items = m.keys.flatMap((k) => { const c = this.chunks.get(k); return c ? [{ key: k, sr: c.sr, samples: c.samples.slice(), ...(c.k ? { k: c.k } : {}) }] : []; }); this.post({ type: \"chunks\", items }, items.map((x) => x.samples.buffer)); return; }\n      case \"forget\": for (const k of m.keys) { if (this.held(k) || this.sounding(k)) this.forgetLater.add(k); else this.dropChunk(k); } return;   // \u6B63\u5728\u54CD / hold \u7740\u7684\u5757\uFF1A\u54CD\u5B8C\u518D\u5220\uFF08\u4E3B\u7EBF\u7A0B\u6362\u65F6\u95F4\u7EBF\u4E4B\u524D\u5C31\u4F1A\u5148\u6765\u6E05\u5757\uFF09\n      case \"channel\": {\n        const cur = this.channels.get(m.id) ?? { ...DEFAULT_CH }, next = { ...cur, ...m.p };\n        this.channels.set(m.id, next);\n        const t = this.tracks.get(m.id); if (t) { t.ch = next; if (m.p.chain !== undefined) t.chFx = buildChain(m.p.chain, t.chFx, this.sr); }\n        return;\n      }\n      case \"buses\": {\n        const old = this.buses; this.buses = new Map();\n        for (const b of m.buses) { const had = old.get(b.id); this.buses.set(b.id, { id: b.id, gainDb: b.gainDb, pan: b.pan, mute: !!b.mute, gl: had?.gl ?? 0, gr: had?.gr ?? 0, fx: buildChain(b.chain, had?.fx ?? [], this.sr), L: had?.L ?? new Float32Array(BLOCK), R: had?.R ?? new Float32Array(BLOCK), out: null, sends: [] }); }\n        this.busList = busOrder(m.buses, this.buses);\n        return;\n      }\n      case \"master\": this.master = { ...this.master, ...m.p }; this.masterLin = dbToLin(this.master.gainDb); if (m.p.chain !== undefined) this.masterFx = buildChain(m.p.chain, this.masterFx, this.sr); return;\n      case \"play\": if (m.gen !== undefined) this.gen = m.gen; this.play(m.at, m.quiet); return;\n      case \"stop\": this.stop(); return;\n      case \"seek\": this.seek(m.at, m.quiet); return;\n      case \"audition\": this.audition(m); return;\n      case \"auditionClip\": {\n        for (const v of this.auditionClips) if (v.src === m.src) v.state = \"cut\";\n        const [gl, gr] = panGains(m.gainDb ?? 0, m.pan ?? 0);\n        while (this.auditionClips.length >= 8) this.auditionClips.shift();\n        this.auditionClips.push({ src: m.src, data: m.samples, ratio: m.sr / this.sr, pos: 0, env: 0, state: \"attack\", gl, gr });\n        this.auditions.set(m.src, { inst: { kind: \"clip\" }, key: 0, gl, gr });\n        return;\n      }\n      case \"meter\": this.meterOn = m.on; this.meterPeak = 0; this.meterFrames = 0; this.trackPeaks.clear(); this.trackMs.clear(); this.grMin.clear(); this.compLv.clear(); return;\n      case \"stereo\": this.stereoOn = m.on; this.stereoFrames = 0; if (!m.on) this.stereoRings.clear(); return;\n      case \"spectrum\": this.specOn = m.on; this.specFrames = 0; if (!m.on) this.specRings.clear(); return;\n    }\n  }\n\n  private playerFor(bank: TsfBank): SfPlayer {\n    const handle = this.tsf.ex.sf_copy(bank.handle); this.tsf.ex.sf_set_max_voices(handle, 256);\n    return { bank, player: { handle, presets: bank.presets } };\n  }\n  private setTimeline(tl: TimelineMsg): void {\n    const old = this.tracks; this.tracks = new Map(); this.order = [];\n    const pos0 = this.pos, shift = this.playing && tl.shift ? tl.shift : 0;\n    const prevClips = new Map<string, { key: string; t0: number; dur: number; gain: number }[]>();   // \u6362\u4E4B\u524D\u6BCF\u6761\u5757\u8F68\u7684\u5757\uFF08\u7B97 hold \u7528\uFF09\n    for (const spec of tl.tracks) {\n      const prev = old.get(spec.id);\n      if (prev && prev.spec.kind === \"clips\") prevClips.set(spec.id, prev.spec.clips);\n      const t: TrackState = prev ?? { spec, ch: this.channels.get(spec.id) ?? { ...DEFAULT_CH }, gl: 0, gr: 0, y: 1, gk: 0, nextNote: 0, offs: [], sf: null, vowels: [], env: 1, envTarget: 1, hold: null, src: new Float32Array(BLOCK), out: new Float32Array(BLOCK), perfFx: [], chFx: [] };\n      t.spec = spec; t.ch = this.channels.get(spec.id) ?? t.ch;\n      t.perfFx = buildChain(spec.chain ?? [], t.perfFx, this.sr);\n      if (!prev) t.chFx = buildChain(t.ch.chain ?? [], [], this.sr);\n      if (spec.kind === \"sf\") {\n        const bank = this.banks.get(spec.sha) ?? null;\n        if (t.sf && t.sf.bank !== bank) { this.tsf.close(t.sf.player); t.sf = null; }\n        if (!t.sf && bank) t.sf = this.playerFor(bank);\n      } else if (t.sf) { this.tsf.close(t.sf.player); t.sf = null; }\n      this.tracks.set(spec.id, t); this.order.push(spec.id);\n      old.delete(spec.id);\n    }\n    for (const t of old.values()) { if (t.sf) this.tsf.close(t.sf.player); this.endHold(t); }   // \u6CA1\u4E86\u7684\u58F0\u90E8\n    this.range = { ...tl.range }; this.loop = tl.loop; this.loopFrom = tl.loopFrom ?? null;\n    // \u6B63\u5728\u653E\uFF1A\u65F6\u95F4\u7EBF\u6362\u4E86\uFF08\u6539\u8C31 / \u6362\u8303\u56F4\uFF09= \u6E38\u6807\u6309\u73B0\u5728\u7684\u4F4D\u7F6E\u91CD\u7B97\uFF0C\u5DF2\u7ECF\u5728\u54CD\u7684\u97F3\u4E0D\u52A8\uFF08user\u300C\u6B63\u5728\u54CD\u7684\u90A3\u53E5\u4E0D\u6362\u3001\u54CD\u5B8C\u6362\u65B0\u300D\uFF09\n    if (this.playing) {\n      if (shift) {   // \u6539\u4E86\u64AD\u653E\u5934\u524D\u9762\u7684\u4E1C\u897F\uFF1A\u6309\u8C31\u4F4D\u7F6E\u632A\uFF08\u4E3B\u7EBF\u7A0B\u7B97\u597D\u7684\u79D2\u5DEE\uFF09\uFF0C\u7B49\u7740\u677E\u5F00\u7684\u97F3\u548C hold \u4E00\u8D77\u632A\n        this.pos = Math.max(this.range.from, Math.min(this.range.to, pos0 + shift));\n        for (const t of this.tracks.values()) { for (const o of t.offs) o.t += shift; if (t.hold) { t.hold.t0 += shift; t.hold.until += shift; } }\n      }\n      for (const t of this.tracks.values()) {   // \u6B63\u5728\u5531\u7684\u90A3\u53E5\u6362\u4E86\u5531\u8C31\uFF1A\u65E7\u5757\u7559\u5230\u54CD\u5B8C\uFF08\u65B0\u5757\u5230\u4E86\u4E5F\u4E0D\u4E2D\u9014\u6362\u2014\u2014\u6362\u5C31\u662F\u4E00\u8DF3\uFF09\n        if (t.spec.kind !== \"clips\") { this.endHold(t); continue; }\n        const cur = t.spec.clips.find((c) => c.t0 <= this.pos && c.t0 + c.dur > this.pos);\n        if (!cur) { this.endHold(t); continue; }\n        if (t.hold && t.hold.until > this.pos) continue;\n        this.endHold(t);\n        if (this.chunks.has(cur.key)) continue;\n        const o = prevClips.get(t.spec.id)?.find((c) => c.t0 <= pos0 && c.t0 + c.dur > pos0 && c.key !== cur.key && this.chunks.has(c.key));\n        if (o) t.hold = { key: o.key, t0: o.t0 + shift, dur: o.dur, gain: o.gain, until: Math.min(o.t0 + o.dur, cur.t0 + cur.dur - shift) + shift };\n      }\n      this.resetCursors(false); this.checkMissing();\n    }\n    else {\n      // \u6CA1\u5728\u653E\uFF08\u505C\u4E86\u3001\u5C3E\u5DF4\u53EF\u80FD\u8FD8\u5728\u54CD\uFF09\uFF1A\u6E38\u6807\u5F52\u96F6\uFF08v0.10.15\uFF09\u2014\u2014\u65B0\u65F6\u95F4\u7EBF\u7684\u8868\u60C5\u6BB5 / \u97F3\u6BD4\u65E7\u7684\u5C11\u65F6\uFF0C\u65E7\u6E38\u6807\u8D8A\u754C\uFF0C\u505C\u540E\u7684\u5C3E\u5DF4\u4E00\u6E32\u67D3\u5C31\u629B\u3001worklet \u6574\u4E2A\u6B7B\u6389\n      //   \uFF08user\u300CC\u6BB5\u6DF7\u4E86\u534A\u5929\u97F3\u8C03\u5230A\u6BB5\u7A81\u7136\u4E0D\u64AD\u653E\u4E86\u300D\uFF1AC \u6BB5\u505C \u2192 \u5C3E\u5DF4\u8FD8\u54CD\u7740 \u2192 \u6362\u5230 A \u6BB5\u7684\u65F6\u95F4\u7EBF \u2192 segs[t.gk] = undefined\uFF09\u3002\u5F00\u653E\u65F6 play() \u4F1A\u6309\u4F4D\u7F6E\u91CD\u7B97\u3002\n      for (const t of this.tracks.values()) { this.endHold(t); t.gk = 0; t.nextNote = 0; }\n      if (this.pos < this.range.from || this.pos > this.range.to) this.pos = this.range.from;\n    }\n    this.sweepForget();\n  }\n\n  // \u2500\u2500 \u8D70\u5E26 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  /** \u8D77\u70B9\uFF08\u89C1 play \u6D88\u606F\u7684 quiet\uFF09\uFF1A-Infinity = \u6CA1\u6709\u3002\u8DF3\u8F6C / \u5FAA\u73AF\u7ED5\u56DE / \u505C = \u6E05\u6389\uFF08\u5FAA\u73AF\u7B2C\u4E8C\u904D\u524D\u4E00\u6BB5\u7167\u5E38\u54CD\uFF09\u3002\n   *  user 2026-10-10\u300C\u4E3A\u4EC0\u4E48\u4ECEsheet C\u64AD\u653E\u7684\u65F6\u5019\u4F1A\u5E26\u524D\u4E00\u4E2A\u97F3\uFF0C\u4E5F\u4E0D\u77E5\u9053\u662Fsheet B\u7684\u8FD8\u662Fstop\u7684\u65F6\u5019\u6CA1\u5F04\u5E72\u51C0\u300D\uFF1A\u4ECE\u67D0\u4E00\u6BB5\u653E\u65F6\u8D77\u70B9\u63D0\u524D PRE_ROLL\uFF08\u6708\u8BFB\u7684\u8F85\u97F3\u5728\u62CD\u5B50\u524D\uFF09\uFF0C\u8FD9\u4E00\u5C0F\u622A\u843D\u5728\u524D\u4E00\u6BB5\u6700\u540E\u4E00\u4E2A\u97F3\u91CC\uFF0C\u8FFD\u97F3\u628A\u5B83\u8865\u6309\u4E0B\u53BB\u3001\u524D\u4E00\u53E5\u7684\u5757\uFF08\u5E26\u6536\u5C3E\u4F59\u97F3\uFF09\u4E5F\u653E\u51FA\u6765\u3002 */\n  private quiet = -Infinity;\n  private mutedNote(n: NoteEv): boolean { return n.t1 <= this.quiet; }\n  private mutedClip(c: ClipRef): boolean { return c.end !== undefined && c.end <= this.quiet; }\n  private play(at?: number, quiet?: number): void {\n    this.quiet = quiet ?? -Infinity;\n    if (at !== undefined) this.pos = at;\n    if (this.pos < this.range.from || this.pos >= this.range.to) this.pos = this.range.from;\n    this.playing = true; this.draining = false; this.tail = -1; this.waiting = null; this.posFrames = POS_EVERY;   // \u8D77\u653E\u90A3\u4E00\u5757\u5C31\u62A5\uFF08\u4E3B\u7EBF\u7A0B\u7684\u5BF9\u7167\u8868\u4ECE\u8FD9\u513F\u5F00\u59CB\uFF09\n    for (const t of this.tracks.values()) { this.killAll(t); this.endHold(t); }   // \u4E0A\u6B21\u505C\u4E0B\u6765\u8FD8\u6CA1\u54CD\u5B8C\u7684\u5C3E\u5DF4\u5FEB\u901F\u6536\u6389\uFF0C\u522B\u6F0F\u8FDB\u8FD9\u4E00\u6B21\n    this.resetCursors(true);\n    this.checkMissing();\n  }\n  /** \u505C\uFF1A\u4E0D\u6392\u65B0\u97F3\u3001\u5757 30 ms \u6DE1\u51FA\u3001\u91CA\u653E\u4E2D\u7684\u5C3E\u5DF4\u63A5\u7740\u54CD\u5230\u9759\uFF08\u4E0D\u662F\u51BB\u4F4F\uFF09\u3002\u64AD\u653E\u5934\u7559\u5728\u539F\u5730\u3002 */\n  private stop(): void {\n    this.quiet = -Infinity;\n    this.playing = false; this.tail = -1; this.waiting = null;\n    this.draining = true; this.drainPos = this.pos; this.drainSecs = 0;\n    for (const t of this.tracks.values()) { this.releaseAll(t); t.envTarget = 0; this.endHold(t); }\n    this.sweepForget();\n  }\n  private seek(at: number, quiet?: number): void {\n    this.quiet = quiet ?? -Infinity;\n    this.pos = at; this.posFrames = POS_EVERY;   // \u8DF3\u4E86 = \u8FD9\u4E00\u5757\u5C31\u62A5\uFF08\u5BF9\u7167\u8868\u522B\u62FF\u8DF3\u4E4B\u524D\u7684\u4F4D\u7F6E\u5F80\u540E\u63A8\uFF09\n    if (this.playing) { this.tail = -1; this.waiting = null; for (const t of this.tracks.values()) this.endHold(t); this.resetCursors(true); this.checkMissing(); }\n  }\n  /** \u65E7\u5757\u54CD\u5B8C / \u4E0D\u8981\u4E86\uFF1A\u64A4 hold\uFF1B\u4E3B\u7EBF\u7A0B\u65E9\u5C31\u8BF4\u8981\u653E\u6389\u7684\u8FD9\u65F6\u624D\u771F\u5220\u3002 */\n  private endHold(t: TrackState): void {\n    if (!t.hold) return; t.hold = null;\n    this.sweepForget();\n  }\n  private dropChunk(key: string): void { const c = this.chunks.get(key); if (c) { this.chunkBytes -= c.samples.byteLength; this.chunks.delete(key); } }\n  private held(key: string): boolean { for (const t of this.tracks.values()) if (t.hold?.key === key) return true; return false; }\n  /** \u653E\u7740\u7684\u65F6\u5019\u8FD9\u4E2A\u5757\u6B63\u5728\u54CD\uFF08\u65F6\u95F4\u7EBF\u91CC\u5B83\u76D6\u7740\u64AD\u653E\u5934\uFF09\u3002 */\n  private sounding(key: string): boolean {\n    if (!this.playing) return false;\n    for (const t of this.tracks.values()) if (t.spec.kind === \"clips\") for (const c of t.spec.clips) if (c.key === key && c.t0 <= this.pos && c.t0 + c.dur > this.pos) return true;\n    return false;\n  }\n  /** \u4E3B\u7EBF\u7A0B\u65E9\u8BF4\u8981\u653E\u6389\u7684\u5757\uFF1A\u65E2\u6CA1 hold \u7740\u3001\u65F6\u95F4\u7EBF\u91CC\u4E5F\u4E0D\u518D\u7528 = \u8FD9\u65F6\u624D\u771F\u5220\u3002 */\n  private sweepForget(): void {\n    for (const k of this.forgetLater) {\n      if (this.held(k)) continue;\n      let used = false; for (const t of this.tracks.values()) if (t.spec.kind === \"clips\" && t.spec.clips.some((c) => c.key === k)) { used = true; break; }\n      if (!used) { this.forgetLater.delete(k); this.dropChunk(k); }\n    }\n  }\n  /** \u6240\u6709\u6B63\u5728\u54CD\u7684\u58F0\u97F3\u5FEB\u901F\u6536\u6389\uFF08\u51E0\u6BEB\u79D2\u7684\u6DE1\u51FA\uFF0C\u4E0D\u662F\u786C\u5207\uFF09\uFF1A\u8D77\u653E\u65F6\u6E05\u4E0A\u4E00\u6B21\u7684\u5C3E\u5DF4\u3002 */\n  private killAll(t: TrackState): void {\n    if (t.sf) this.tsf.reset(t.sf.player);\n    t.offs.length = 0;\n    for (const v of t.vowels) v.state = \"cut\";\n  }\n  /** \u6E38\u6807\u5BF9\u9F50\u5230 pos\uFF1Bchase = \u628A pos \u8FD9\u4E00\u523B\u8BE5\u54CD\u7740\u7684\u97F3\u6309\u4E0B\uFF08\u8D77\u653E / seek / \u7EED\u653E\uFF09\uFF0C\u6B63\u5728\u54CD\u7684\u5148\u677E\u5F00\u3002 */\n  private resetCursors(chase: boolean): void {\n    for (const t of this.tracks.values()) {\n      if (chase) { this.releaseAll(t); t.env = 0; }\n      t.envTarget = 1;\n      const segs = t.spec.gain;\n      if (segs && segs.length) { let k = 0; while (k < segs.length - 1 && this.pos >= segs[k].t1) k++; t.gk = k; if (chase) t.y = dbToLin(segs[k].dB); }\n      if (t.spec.kind === \"clips\") continue;\n      const notes = t.spec.notes; let i = 0;\n      while (i < notes.length && notes[i].t0 < this.pos) { if (chase && notes[i].t1 > this.pos && !this.mutedNote(notes[i])) this.noteOn(t, notes[i]); i++; }\n      t.nextNote = i;\n    }\n  }\n  private releaseAll(t: TrackState): void {\n    if (t.sf) this.tsf.allOff(t.sf.player);\n    t.offs.length = 0;\n    for (const v of t.vowels) if (v.state !== \"release\" && v.state !== \"cut\") v.state = \"release\";\n  }\n  private noteOn(t: TrackState, n: NoteEv): void {\n    if (t.spec.kind === \"sf\") { if (!t.sf) return; this.tsf.noteOn(t.sf.player, n.preset, n.key, n.vel); }\n    else if (t.spec.kind === \"vowel\") this.vowelOn(t.vowels, null, t.spec.kana, n.key, 1, 1);\n    else return;\n    const off = { t: Math.max(n.t0, n.t1), key: n.key, preset: n.preset }; let k = t.offs.length;\n    while (k > 0 && t.offs[k - 1].t > off.t) k--;\n    t.offs.splice(k, 0, off);\n  }\n  private noteOff(t: TrackState, key: number, preset: number): void {\n    if (t.spec.kind === \"sf\") { if (t.sf) this.tsf.noteOff(t.sf.player, preset, key); }\n    else if (t.spec.kind === \"vowel\") { for (const v of t.vowels) if (v.src === null && v.key === key && v.state !== \"release\" && v.state !== \"cut\") v.state = \"release\"; }\n  }\n  /** \u64AD\u653E\u5934\u524D\u9762\uFF08\u63D0\u524D\u91CF\u5185\uFF09\u7684\u5757\u5230\u9F50\u4E86\u6CA1\u6709\uFF1B\u6CA1\u5230\u7684\u62A5\u4E0A\u53BB\uFF08\u4E3B\u7EBF\u7A0B\u53BB\u7B97\uFF09\u3002 */\n  private checkMissing(): void {\n    const miss: string[] = [];\n    for (const t of this.tracks.values()) {\n      if (t.spec.kind !== \"clips\") continue;\n      for (const c of t.spec.clips) if (c.t0 + c.dur > this.pos && c.t0 < this.pos + LOOKAHEAD && !this.mutedClip(c) && !this.chunks.has(c.key) && !this.missingSent.has(c.key)) { miss.push(c.key); this.missingSent.add(c.key); }\n    }\n    if (miss.length) this.post({ type: \"missing\", keys: miss });\n  }\n  /** \u8D70\u5E26\u4ECE pos \u5F80\u524D\u6700\u591A\u80FD\u8D70\u5230\u54EA\uFF08\u2264 end\uFF09\uFF1A\u6CA1\u5230\u7684\u5757\u7684\u5934\u6321\u4F4F\uFF1B\u6B63\u7AD9\u5728\u6CA1\u5230\u7684\u5757\u4E0A = \u8FD4\u56DE null\uFF08\u8981\u7B49\u5B83\uFF09\u3002 */\n  private clipBarrier(end: number): { stop: number; wait: string | null } {\n    let stop = end;\n    for (const t of this.tracks.values()) {\n      if (t.spec.kind !== \"clips\") continue;\n      for (const c of t.spec.clips) {\n        if (this.chunks.has(c.key) || (t.hold && c.t0 < t.hold.until) || this.mutedClip(c)) continue;   // hold \u7740\u7684\u90A3\u6BB5\uFF1A\u65E7\u5757\u9876\u7740\uFF0C\u65B0\u5757\u6CA1\u5230\u4E5F\u4E0D\u6321\uFF1B\u8FD9\u6B21\u4E0D\u653E\u7684\u5757\u4E5F\u4E0D\u6321\n        if (c.t0 <= this.pos && c.t0 + c.dur > this.pos) return { stop: this.pos, wait: c.key };\n        if (c.t0 > this.pos && c.t0 < stop) stop = c.t0;\n      }\n    }\n    return { stop, wait: null };\n  }\n  private keyStartingAt(t0: number): string | null {\n    for (const t of this.tracks.values()) if (t.spec.kind === \"clips\") for (const c of t.spec.clips) if (!this.chunks.has(c.key) && !(t.hold && c.t0 < t.hold.until) && Math.abs(c.t0 - t0) < 1e-6) return c.key;\n    return null;\n  }\n  private freeze(key: string | null): void { this.waiting = key; for (const t of this.tracks.values()) this.releaseAll(t); this.checkMissing(); }\n\n  // \u2500\u2500 \u6E32\u67D3 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  /** \u51FA\u4E00\u5757\uFF1AoutL / outR \u957F n\uFF08\u2264 BLOCK\uFF09\u3002 */\n  render(outL: Float32Array, outR: Float32Array, n: number): void {\n    const tStart = now();\n    this.busL.fill(0, 0, n); this.busR.fill(0, 0, n); this.audL.fill(0, 0, n); this.audR.fill(0, 0, n);\n    for (const b of this.buses.values()) { b.L.fill(0, 0, n); b.R.fill(0, 0, n); }\n    if (this.playing) this.renderTransport(n); else if (this.draining) this.renderDrain(n);\n    // \u603B\u7EBF\uFF1A\u5404\u8F68 / \u522B\u7684\u603B\u7EBF\u9001\u6765\u7684 \u2192 \u8FD9\u6761\u603B\u7EBF\u7684\u94FE\uFF08\u6DF7\u54CD / \u5EF6\u8FDF\u2026\uFF09\u2192 \u589E\u76CA / \u5E73\u8861 \u2192 \u51FA\u5230\u603B\u8F68\u6216\u4E0B\u4E00\u6761\u603B\u7EBF\uFF08+ \u63A8\u5B50\u540E\u7684\u53D1\u9001\uFF09\u3002\n    //   \u6309 busOrder \u7684\u987A\u5E8F\uFF08\u9001\u51FA\u53BB\u7684\u5148\u5904\u7406\uFF09\uFF0C\u8F6E\u5230\u4E00\u6761\u603B\u7EBF\u65F6\u9001\u8FDB\u5B83\u7684\u90FD\u5DF2\u7ECF\u52A0\u597D\u4E86\uFF08v0.10.9 \u603B\u7EBF\u63A5\u603B\u7EBF\uFF09\u3002\n    for (const b of this.busList) {\n      for (const fx of b.fx) fx.process(b.L, b.R, n, null);\n      const [gl, gr] = b.mute ? [0, 0] : panGains(b.gainDb, b.pan), dl = (gl - b.gl) / n, dr = (gr - b.gr) / n; let cl = b.gl, cr = b.gr;   // \u9759\u97F3 = \u63A8\u5B50\u5230\u5E95\uFF08\u7167\u6837\u8D70\u659C\u5761\uFF0C\u4E0D\u5494\u54D2\uFF09\n      if (this.specOn) this.specPush(b.id, b.L, b.R, n, Math.hypot(b.gl, b.gr), Math.hypot(gl, gr));   // \u9891\u8C31\uFF1A\u63A8\u5B50\u4E4B\u540E\uFF08\u7B49\u529F\u7387 \u2192 hypot = \u63A8\u5B50\uFF0C\u58F0\u50CF\u4E0D\u7B97\uFF09\n      const L = b.out ? b.out.L : this.busL, R = b.out ? b.out.R : this.busR;\n      let pk = 0, ms = 0, pre = 0;\n      for (let i = 0; i < n; i++) { cl += dl; cr += dr; const l = b.L[i] * cl * Math.SQRT2, r = b.R[i] * cr * Math.SQRT2; L[i] += l; R[i] += r; if (this.meterOn) { const a = Math.abs(l), c = Math.abs(r); if (a > pk) pk = a; if (c > pk) pk = c; ms += (l * l + r * r) * 0.5; const u = Math.max(Math.abs(b.L[i]), Math.abs(b.R[i])); if (u > pre) pre = u; } if (this.stereoOn) this.stereoPush(b.id, l, r); }   // \u7ACB\u4F53\u58F0\u7684\u5E73\u8861\uFF1A\u6B63\u4E2D = \u539F\u6837\n      if (this.meterOn) { this.trackPeaks.set(b.id, Math.max(this.trackPeaks.get(b.id) ?? 0, pk)); this.trackMs.set(b.id, (this.trackMs.get(b.id) ?? 0) + ms); this.grOf(b.id, b.fx, pre); }\n      for (const sd of b.sends) { const sl = gl * sd.lin * Math.SQRT2, sr = gr * sd.lin * Math.SQRT2; for (let i = 0; i < n; i++) { sd.bus.L[i] += b.L[i] * sl; sd.bus.R[i] += b.R[i] * sr; } }\n      b.gl = gl; b.gr = gr;\n    }\n    for (const fx of this.masterFx) fx.process(this.busL, this.busR, n, null);   // \u603B\u8F68\u94FE\uFF08\u6BCD\u5E26 EQ / \u538B\u7F29\u2026\uFF09\uFF0C\u9650\u5E45\u5728\u6700\u540E\n    this.renderAuditions(n);\n    // \u603B\u8F68\uFF1A\u589E\u76CA \u2192 \u9650\u5E45\uFF08\u53EA\u7BA1\u8D70\u5E26\u6765\u7684\u58F0\uFF09\u2192 \u52A0\u4E0A\u8BD5\u542C\uFF08\u7ED5\u8FC7\u9650\u5E45\uFF09\n    const g = this.masterLin;\n    if (this.master.limiter) this.limit(n, g);\n    else for (let i = 0; i < n; i++) { this.busL[i] *= g; this.busR[i] *= g; }\n    for (let i = 0; i < n; i++) { outL[i] = this.busL[i] + this.audL[i] * g; outR[i] = this.busR[i] + this.audR[i] * g; }\n    if (this.specOn) {\n      this.specPush(\"__master\", outL, outR, n); this.specFrames += n;\n      if (this.specFrames >= SPEC_N * 2) { this.specFrames = 0; const tracks: Record<string, Float32Array> = {}; for (const [id, r] of this.specRings) { const o = new Float32Array(SPEC_N); o.set(r.buf.subarray(r.w)); o.set(r.buf.subarray(0, r.w), SPEC_N - r.w); tracks[id] = o; } this.post({ type: \"spectrum\", sr: this.sr, tracks }, Object.values(tracks).map((x) => x.buffer)); }\n    }\n    if (this.stereoOn) {\n      for (let i = 0; i < n; i++) this.stereoPush(\"__master\", outL[i], outR[i]);\n      this.stereoFrames += n;\n      if (this.stereoFrames >= STEREO_N * 2) {   // ~23 \u6B21 / \u79D2\uFF1A\u6309\u65F6\u95F4\u987A\u5E8F\u62F7\u51FA\u6765\uFF08\u8F6C\u79FB\uFF0C\u4E0D\u5171\u4EAB\uFF09\n        this.stereoFrames = 0; const tracks: Record<string, { L: Float32Array; R: Float32Array }> = {}, bufs: ArrayBuffer[] = [];\n        for (const [id, g] of this.stereoRings) { const L = new Float32Array(STEREO_N), R = new Float32Array(STEREO_N); L.set(g.L.subarray(g.w)); L.set(g.L.subarray(0, g.w), STEREO_N - g.w); R.set(g.R.subarray(g.w)); R.set(g.R.subarray(0, g.w), STEREO_N - g.w); tracks[id] = { L, R }; bufs.push(L.buffer, R.buffer); }\n        this.post({ type: \"stereo\", tracks }, bufs);\n      }\n    }\n    if (this.meterOn) {\n      let ms = 0, pk = 0;\n      for (let i = 0; i < n; i++) { const a = Math.abs(outL[i]), b = Math.abs(outR[i]); if (a > pk) pk = a; if (b > pk) pk = b; ms += (outL[i] * outL[i] + outR[i] * outR[i]) * 0.5; }\n      if (pk > this.meterPeak) this.meterPeak = pk;\n      this.trackMs.set(\"__master\", (this.trackMs.get(\"__master\") ?? 0) + ms); this.grOf(\"__master\", this.masterFx, pk);\n      this.meterFrames += n;\n      if (this.meterFrames >= 1024) {\n        const f = this.meterFrames, ms2: Record<string, number> = {}; for (const [k, v] of this.trackMs) ms2[k] = v / f;\n        this.post({ type: \"meter\", peak: this.meterPeak, active: this.activeVoices(), tracks: Object.fromEntries(this.trackPeaks), ms: ms2, gr: Object.fromEntries(this.grMin), cl: Object.fromEntries(this.compLv) });\n        this.meterPeak = 0; this.meterFrames = 0; this.trackPeaks.clear(); this.trackMs.clear(); this.grMin.clear(); this.compLv.clear();\n      }\n    }\n    // \u8D1F\u8F7D\uFF1A\u8FD9\u4E00\u5757\u6E32\u67D3\u82B1\u4E86\u591A\u4E45 / \u8FD9\u4E00\u5757\u503C\u591A\u4E45\uFF08AudioWorklet \u91CC\u6CA1\u6709 performance\uFF0C\u9000\u56DE Date.now\uFF1A\u6BEB\u79D2\u7C97\uFF0C\u6512\u6EE1 1 s \u518D\u62A5\u5C31\u591F\u51C6\uFF09\n    this.loadBusy += now() - tStart; this.loadFrames += n;\n    if (this.loadFrames >= this.sr) { this.post({ type: \"load\", busy: Math.min(1, this.loadBusy / ((this.loadFrames / this.sr) * 1000)), chunkBytes: this.chunkBytes, chunks: this.chunks.size, voices: this.activeVoices() }); this.loadBusy = 0; this.loadFrames = 0; }\n  }\n  activeVoices(): number {\n    let a = this.auditionVowels.length;\n    for (const t of this.tracks.values()) { if (t.sf) a += this.tsf.active(t.sf.player); a += t.vowels.length; }\n    for (const p of this.auditionSf.values()) a += this.tsf.active(p.player);\n    return a;\n  }\n  private renderTransport(n: number): void {\n    const sr = this.sr;\n    let done = 0;\n    while (done < n) {\n      const left = n - done;\n      for (const t of this.tracks.values()) if (t.hold && this.pos >= t.hold.until) this.endHold(t);   // \u65E7\u5757\u54CD\u5B8C = \u6362\u65B0\u7684\uFF08\u6CA1\u5230\u5C31\u5728\u4E0B\u9762\u7B49\uFF09\n      if (this.waiting) {   // \u7B49\u5757\uFF1A\u51BB\u4F4F\uFF0C\u53EA\u8BA9\u5C3E\u5DF4\u54CD\n        if (!this.chunks.has(this.waiting)) { this.renderTracks(done, left, false, false); done = n; break; }\n        this.waiting = null; this.resetCursors(true);\n      }\n      if (this.tail >= 0 && this.loop) { this.loopBack(); continue; }   // \u5C3E\u5DF4\u8FD8\u5728\u54CD\u7684\u65F6\u5019\u5F00\u4E86\u5FAA\u73AF = \u8FD9\u4E00\u8F6E\u7167\u6837\u8DF3\u56DE\u53BB\uFF082026-10-10 user\u300C\u4E2D\u9014toggle\u5FAA\u73AF\u5BF9\u672C\u8F6E\u64AD\u653E\u5E94\u8BE5\u751F\u6548\u300D\uFF09\n      if (this.tail >= 0) {   // \u8303\u56F4\u5C3E\uFF1A\u4E0D\u6392\u65B0\u97F3\uFF0C\u5757\u6DE1\u51FA\uFF0C\u54CD\u5B8C\u5C31\u505C\n        this.renderTracks(done, left, false, true); this.pos += left / sr; this.tail += left / sr; done = n;\n        if (this.tail >= TAIL_MAX || this.silent()) { this.stop(); this.post({ type: \"ended\", gen: this.gen }); }\n        break;\n      }\n      const blockEnd = this.pos + left / sr;\n      const { stop, wait } = this.clipBarrier(Math.min(blockEnd, this.range.to));\n      if (wait) { this.freeze(wait); continue; }\n      const cnt = Math.min(left, Math.max(0, Math.round((stop - this.pos) * sr)));\n      if (cnt > 0) { this.renderTracks(done, cnt, true, true); this.pos += cnt / sr; done += cnt; }\n      if (this.pos >= this.range.to - 0.5 / sr) {   // \u5230\u8303\u56F4\u5C3E\n        if (this.loop) this.loopBack();   // \u8DF3\u56DE\u53BB\uFF1A\u6B63\u5728\u54CD\u7684\u7167\u54CD\uFF0C\u4E0D\u677E\n        else { this.tail = 0; for (const t of this.tracks.values()) { this.releaseAll(t); t.envTarget = 0; } }\n        continue;\n      }\n      if (cnt === 0) {   // \u7AD9\u5728\u4E00\u4E2A\u6CA1\u5230\u7684\u5757\u7684\u5934\u524D\u9762\uFF1A\u51BB\n        const key = this.keyStartingAt(stop);\n        if (!key) { this.renderTracks(done, left, false, false); done = n; break; }   // \u4E0D\u8BE5\u53D1\u751F\uFF1B\u522B\u6B7B\u5FAA\u73AF\n        this.freeze(key);\n      }\n    }\n    this.posFrames += n;\n    if (this.posFrames >= POS_EVERY) { this.posFrames = 0; this.post({ type: \"pos\", sec: this.pos, playing: this.playing, waiting: this.waiting, gen: this.gen, ...(this.clock !== null ? { at: this.clock + n / sr } : {}) }); }\n  }\n  /** \u505C\u4E86\u4E4B\u540E\uFF1A\u5C3E\u5DF4\uFF08\u91CA\u653E\u4E2D\u7684\u97F3\u3001\u6DE1\u51FA\u4E2D\u7684\u5757\uFF09\u7167\u54CD\u5230\u9759\u6216 TAIL_MAX\uFF1B\u64AD\u653E\u5934\u4E0D\u52A8\uFF0C\u5757\u6309\u81EA\u5DF1\u7684\u949F\u8D70\u3002 */\n  private renderDrain(n: number): void {\n    this.renderTracks(0, n, false, true, this.drainPos);\n    this.drainPos += n / this.sr; this.drainSecs += n / this.sr;\n    if (this.drainSecs >= TAIL_MAX || this.silent()) this.draining = false;\n  }\n  /** \u5FAA\u73AF\u8DF3\u56DE\u5FAA\u73AF\u5934\uFF08\u5230\u8303\u56F4\u5C3E\u65F6\uFF1B\u6216\u5C3E\u5DF4\u8FD8\u5728\u54CD\u65F6\u5F00\u4E86\u5FAA\u73AF\uFF09\u3002 */\n  private loopBack(): void {\n    this.quiet = -Infinity;\n    this.tail = -1; this.posFrames = POS_EVERY; this.pos = Math.max(this.range.from, Math.min(this.loopFrom ?? this.range.from, this.range.to));\n    for (const t of this.tracks.values()) this.endHold(t);\n    this.resetCursors(false); this.chaseAtLoop(); this.checkMissing();\n  }\n  private chaseAtLoop(): void { for (const t of this.tracks.values()) { if (t.spec.kind === \"clips\") continue; for (const nte of t.spec.notes) if (nte.t0 < this.pos && nte.t1 > this.pos) this.noteOn(t, nte); } }\n  private silent(): boolean {\n    for (const t of this.tracks.values()) { if (t.sf && this.tsf.active(t.sf.player) > 0) return false; if (t.vowels.length) return false; if (t.spec.kind === \"clips\" && t.env > 1e-4) return false; }\n    return true;\n  }\n  /** \u5404\u58F0\u90E8\u51FA cnt \u4E2A\u91C7\u6837\u8FDB\u6BCD\u7EBF / \u603B\u7EBF\uFF08\u4ECE off \u8D77\uFF09\u3002notesOn = \u6392\u65B0\u97F3\uFF1BclipsOn = \u5757\u524D\u8FDB\uFF08false = \u51BB\u7740\uFF0C\u5757\u4E0D\u51FA\u58F0\uFF09\u3002\n   *  \u4E24\u8D9F\uFF08\u4FA7\u94FE\u8981\u5148\u770B\u5230\u522B\u7684\u8F68\u7684\u58F0\uFF09\uFF1A\u2460 \u6BCF\u8F68 \u51FA\u58F0 \u2192 \u8868\u60C5\u66F2\u7EBF \u2192 \u5757\u6DE1\u5165\u6DE1\u51FA \u2192 \u6F14\u594F\u8005\u7684\u94FE \u2192 src\uFF1B\u2461 \u6BCF\u8F68 src \u2192 \u901A\u9053\u94FE\uFF08\u538B\u7F29\u5668\u7684 key \u8BFB\u522B\u7684\u8F68\u7684 src\uFF09\u2192 \u9759\u97F3 / \u72EC\u594F \u2192 \u63A8\u5B50 / \u58F0\u50CF \u2192 \u53BB\u603B\u8F68\u6216\u603B\u7EBF\uFF0C\u518D\u6309\u53D1\u9001\u91CF\u53D1\u5230\u603B\u7EBF\u3002 */\n  private renderTracks(off: number, cnt: number, notesOn: boolean, clipsOn: boolean, t0 = this.pos): void {\n    const solo = this.order.some((id) => this.tracks.get(id)!.ch.solo);\n    const sr = this.sr;\n    for (const id of this.order) {   // \u2500\u2500 \u7B2C\u4E00\u8D9F\n      const t = this.tracks.get(id)!, mono = t.src; mono.fill(0, 0, cnt);\n      if (t.spec.kind === \"clips\") { if (clipsOn && !(t.env === 0 && t.envTarget === 0)) this.renderClips(t, mono, cnt, t0); }   // \u6DE1\u5B8C\u4E86\uFF08\u505C / \u8303\u56F4\u5C3E\uFF09= \u4E0D\u51FA\u58F0\uFF08\u539F\u6765 env \u5230 0 \u4E4B\u540E\u4E0D\u518D\u4E58\u3001\u5757\u53C8\u5168\u97F3\u91CF\u653E\u51FA\u6765\uFF1Auser\u300C\u6309\u505C\u4E4B\u540E\u6708\u8BFB\u4E0D\u5E94\u8BE5\u628A\u957F\u53E5\u5FF5\u5B8C\u300D\uFF09\n      else this.renderNotes(t, mono, cnt, t0, notesOn);\n      const segs = t.spec.gain;\n      if (segs && segs.length) {   // \u8868\u60C5\u66F2\u7EBF\uFF08dB \u6BB5\uFF0C\u4E00\u9636\u5E73\u6ED1\uFF1B\u540C\u539F applyGain\uFF09\n        const a = 1 - Math.exp(-1 / (GAIN_TAU * sr));\n        for (let i = 0; i < cnt; i++) {\n          const tt = t0 + i / sr; while (t.gk < segs.length - 1 && tt >= segs[t.gk].t1) t.gk++;\n          t.y += (dbToLin(segs[t.gk].dB) - t.y) * a; mono[i] *= t.y;\n        }\n      }\n      if (t.spec.kind === \"clips\" && t.env !== t.envTarget) {   // \u5757\u8F68\u7684\u6DE1\u5165 / \u6DE1\u51FA\uFF08\u8D77\u653E / seek / \u8303\u56F4\u5C3E\uFF09\n        const step = t.envTarget > t.env ? 1 / (CLIP_FADE_IN * sr) : -1 / (CLIP_FADE_OUT * sr);\n        for (let i = 0; i < cnt; i++) { if (t.env !== t.envTarget) { t.env += step; if ((step > 0 && t.env >= t.envTarget) || (step < 0 && t.env <= t.envTarget)) t.env = t.envTarget; } mono[i] *= t.env; }\n      }\n      for (const fx of t.perfFx) fx.process(mono, null, cnt, null);   // \u8DDF\u7740\u6F14\u594F\u8005\u8D70\u7684\u94FE\n    }\n    for (const id of this.order) {   // \u2500\u2500 \u7B2C\u4E8C\u8D9F\n      const t = this.tracks.get(id)!, out = t.out; out.set(t.src.subarray(0, cnt));\n      for (const fx of t.chFx) fx.process(out, null, cnt, fx.kind === \"comp\" ? this.keyOf(t, fx.id) : null);\n      const audible = solo ? t.ch.solo : !t.ch.mute;\n      const [gl, gr] = audible ? panGains(t.ch.gainDb, t.ch.pan) : [0, 0];\n      // \u9891\u8C31\uFF1A\u63A8\u5B50\u4E4B\u540E\uFF08v0.10.15\uFF0Cuser\u300Cspectrum\u4E5F\u7B97\u4E86fader\uFF0C\u662F\u5168\u91CFsend\u7684\u4E1C\u897F\u5BF9\u5427\uFF1F\u300D= \u8FD9\u6761\u8F68\u771F\u6B63\u9001\u8FDB\u6DF7\u97F3\u7684\u91CF\uFF1B\u9759\u97F3 = \u6CA1\u6709\uFF1B\u7B49\u529F\u7387 \u2192 hypot = \u63A8\u5B50\uFF0C\u58F0\u50CF\u4E0D\u7B97\uFF0C\u540C\u5CF0\u503C\u7EC6\u7EBF\u7684\u5C3A\u5B50\uFF09\n      if (this.specOn) this.specPush(id, out, null, cnt, Math.hypot(t.gl, t.gr), Math.hypot(gl, gr));\n      const dl = (gl - t.gl) / cnt, dr = (gr - t.gr) / cnt;\n      const bus = t.ch.to && t.ch.to !== \"master\" ? this.buses.get(t.ch.to) : undefined, L = bus ? bus.L : this.busL, R = bus ? bus.R : this.busR;\n      let cl = t.gl, cr = t.gr, pk = 0, ms = 0;\n      const sto = this.stereoOn;   // \u674E\u8428\u5982\u56FE\uFF1A\u6BCF\u5F20\u5361\u90FD\u6709\uFF08v0.10.21\uFF0Cuser\u300C\u6027\u80FD\u5141\u8BB8\u7684\u65F6\u5019\u793A\u6CE2\u5668\u5E94\u8BE5\u6BCF\u4E2A\u5361\u90FD\u6709\uFF0C\u4E00\u89C6\u540C\u4EC1\uFF0C\u624D\u6574\u9F50\u300D\uFF09\u2014\u2014\u5355\u58F0\u9053\u8F68 = \u58F0\u50CF\u90A3\u4E2A\u89D2\u5EA6\u7684\u4E00\u6839\u7EBF\n      let pre = 0;\n      for (let i = 0; i < cnt; i++) { cl += dl; cr += dr; L[off + i] += out[i] * cl; R[off + i] += out[i] * cr; if (sto) this.stereoPush(id, out[i] * cl, out[i] * cr); if (this.meterOn) { const u = Math.abs(out[i]); if (u > pre) pre = u; const a = u * Math.max(cl, cr) * Math.SQRT2; if (a > pk) pk = a; ms += out[i] * out[i] * (cl * cl + cr * cr); } }   // \u5CF0\u503C\u6309\u300C\u6B63\u4E2D = \u539F\u6837\u300D\u7684\u5C3A\u5B50\uFF08\u548C\u603B\u7EBF\u4E00\u6837\uFF09\uFF1B\u5747\u65B9 = (x\u00B7\u63A8\u5B50)\u00B2\uFF08\u7B49\u529F\u7387\uFF1Acl\u00B2 + cr\u00B2 = \u63A8\u5B50\u00B2\uFF0C\u58F0\u50CF\u4E0D\u7B97\uFF09\n      if (this.meterOn) { this.trackPeaks.set(id, Math.max(this.trackPeaks.get(id) ?? 0, pk)); this.trackMs.set(id, (this.trackMs.get(id) ?? 0) + ms); this.grOf(id, t.chFx, pre); }\n      if (t.ch.sends) for (const sd of t.ch.sends) {   // \u53D1\u9001\uFF08\u63A8\u5B50\u4E4B\u540E\uFF09\n        const b = this.buses.get(sd.to); if (!b) continue;\n        const g = dbToLin(sd.gainDb), sl = gl * g, sr2 = gr * g;\n        for (let i = 0; i < cnt; i++) { b.L[off + i] += out[i] * sl; b.R[off + i] += out[i] * sr2; }\n      }\n      t.gl = gl; t.gr = gr;\n    }\n  }\n  /** \u538B\u7F29\u5668\u7684\u4FA7\u94FE\uFF1A\u901A\u9053\u6761\u4E0A id \u662F fxId \u7684\u90A3\u53F0\u5199\u4E86 key = \u522B\u7684\u8F68 id \u2192 \u90A3\u6761\u8F68\u8FD9\u4E00\u6BB5\u7684\u7B2C\u4E00\u8D9F\u8F93\u51FA\uFF1B\u6CA1\u5199 / \u627E\u4E0D\u5230 = null\uFF08\u542C\u81EA\u5DF1\uFF09\u3002 */\n  private keyOf(t: TrackState, fxId: string): Float32Array | null {\n    const spec = t.ch.chain?.find((f) => f.id === fxId); if (!spec?.key || spec.key === t.spec.id) return null;\n    return this.tracks.get(spec.key)?.src ?? null;\n  }\n  private renderClips(t: TrackState, mono: Float32Array, cnt: number, t0: number): void {\n    if (t.spec.kind !== \"clips\") return;\n    if (t.hold) this.renderClip(t.hold, mono, cnt, t0);\n    for (const c of t.spec.clips) { if ((t.hold && c.t0 < t.hold.until) || this.mutedClip(c)) continue; this.renderClip(c, mono, cnt, t0); }\n  }\n  private renderClip(c: { key: string; t0: number; gain: number }, mono: Float32Array, cnt: number, t0: number): void {\n    const sr = this.sr, tEnd = t0 + cnt / sr;\n    const ch = this.chunks.get(c.key); if (!ch) return;\n    const len = ch.samples.length, cEnd = c.t0 + len / ch.sr;\n    if (c.t0 >= tEnd || cEnd <= t0) return;\n    const s = ch.samples, g = c.gain * I16 * (ch.k ?? 1);   // k = \u5B58\u7684\u65F6\u5019\u7F29\u4E86\u51E0\u500D\uFF08packInt16\uFF09\n    for (let i = 0; i < cnt; i++) {\n      const p = (t0 + i / sr - c.t0) * ch.sr; if (p < 0) continue;\n      const k = p | 0; if (k >= len - 1) break;\n      const f = p - k; mono[i] += (s[k] * (1 - f) + s[k + 1] * f) * g;\n    }\n  }\n  /** \u5FEB\u5F15\u64CE\u7684\u8F68\uFF1A\u4E8B\u4EF6\u6309\u91C7\u6837\u4F4D\u7F6E\u65BD\u52A0\uFF08\u540C\u539F synth-processor\uFF09\uFF0C\u4E2D\u95F4\u9010\u6BB5\u6E32\u67D3\u3002 */\n  private renderNotes(t: TrackState, mono: Float32Array, cnt: number, t0: number, notesOn: boolean): void {\n    if (t.spec.kind === \"clips\") return;\n    const sr = this.sr, notes = t.spec.notes, tEnd = t0 + cnt / sr;\n    let pos = 0;\n    const renderTo = (at: number) => {\n      if (at <= pos) return;\n      if (t.spec.kind === \"sf\") { if (t.sf) this.tsf.render(t.sf.player, mono, pos, at - pos); }\n      else this.renderVowels(t.vowels, mono, null, null, pos, at - pos);\n      pos = at;\n    };\n    if (notesOn) {\n      for (;;) {\n        const nextOn = t.nextNote < notes.length ? notes[t.nextNote].t0 : Infinity, nextOff = t.offs.length ? t.offs[0].t : Infinity;\n        if (nextOn >= tEnd && nextOff >= tEnd) break;\n        if (nextOff <= nextOn) { renderTo(Math.min(cnt, Math.max(pos, Math.round((nextOff - t0) * sr)))); const o = t.offs.shift()!; this.noteOff(t, o.key, o.preset); }\n        else { renderTo(Math.min(cnt, Math.max(pos, Math.round((nextOn - t0) * sr)))); const nn = notes[t.nextNote++]; if (!this.mutedNote(nn)) this.noteOn(t, nn); }\n      }\n    }\n    renderTo(cnt);\n  }\n  // \u2500\u2500 \u5143\u97F3\u91C7\u6837\u5668\uFF08\u539F src/singer/sampler.ts \u7684\u505A\u6CD5\u642C\u8FDB\u97F3\u9891\u7EBF\u7A0B\uFF1A\u6700\u8FD1\u97F3\u9AD8\u7684\u6837\u672C\u53D8\u901F\u3001\u6309\u4F4F\u5FAA\u73AF\u7A33\u6001\u6BB5\u3001\u677E\u5F00\u6DE1\u51FA\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  private vowelOn(pool: VowelVoice[], src: string | null, kana: string, key: number, gl: number, gr: number): VowelVoice | null {\n    if (!this.vowels) return null;\n    const es = this.vowels.entries.filter((e) => e.kana === kana); if (!es.length) return null;\n    const e = es.reduce((a, b) => (Math.abs(b.midi - key) < Math.abs(a.midi - key) ? b : a));\n    while (pool.length >= MAX_VOWEL_VOICES) pool.shift();\n    const rate = (2 ** ((key - e.midi) / 12)) * (this.vowels.sr / this.sr);\n    const v: VowelVoice = { src, data: e.data, pos: 0, rate, target: rate, loopStart: e.loopStart, loopEnd: e.loopEnd, env: 0, state: \"attack\", gl, gr, key, baseMidi: e.midi };\n    pool.push(v); return v;\n  }\n  /** \u4E00\u6C60\u58F0\u97F3\u51FA cnt \u4E2A\u91C7\u6837\uFF1A\u5355\u58F0\u9053 mono\uFF08\u65F6\u95F4\u7EBF\u8F68\uFF09\u6216\u7ACB\u4F53\u58F0 L / R\uFF08\u8BD5\u542C\uFF0C\u81EA\u5E26\u589E\u76CA\u58F0\u50CF\uFF09\u3002 */\n  private renderVowels(pool: VowelVoice[], mono: Float32Array | null, L: Float32Array | null, R: Float32Array | null, off: number, cnt: number): void {\n    const sr = this.sr, attack = 1 / (V_ATTACK * sr), relK = Math.exp(-1 / (V_RELEASE * sr)), cutK = Math.exp(-1 / (V_CUT * sr)), glideK = 1 - Math.exp(-1 / (V_GLIDE * sr));\n    for (let vi = pool.length - 1; vi >= 0; vi--) {\n      const v = pool[vi], d = v.data, span = v.loopEnd - v.loopStart;\n      for (let i = 0; i < cnt; i++) {\n        if (v.state === \"attack\") { v.env += attack; if (v.env >= 1) { v.env = 1; v.state = \"hold\"; } }\n        else if (v.state === \"release\") v.env *= relK; else if (v.state === \"cut\") v.env *= cutK;\n        v.rate += (v.target - v.rate) * glideK;\n        const k = v.pos | 0, f = v.pos - k, s = d[k] * (1 - f) + (d[k + 1] ?? d[k]) * f, y = s * v.env;\n        if (mono) mono[off + i] += y; else { L![off + i] += y * v.gl; R![off + i] += y * v.gr; }\n        v.pos += v.rate;\n        if (span > 0) { while (v.pos >= v.loopEnd) v.pos -= span; }   // \u6309\u4F4F\u5FAA\u73AF\u7A33\u6001\u6BB5\uFF08\u5FAA\u73AF\u5C3E\u53EF\u4EE5\u5C31\u662F\u6837\u672C\u672B\u5C3E\uFF09\n        else if (v.pos >= d.length - 1) { v.env = 0; v.state = \"cut\"; break; }\n      }\n      if ((v.state === \"release\" || v.state === \"cut\") && v.env < 1e-4) pool.splice(vi, 1);\n    }\n  }\n  // \u2500\u2500 \u6309\u952E\u8BD5\u542C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  private audition(m: Extract<StudioIn, { type: \"audition\" }>): void {\n    if (m.ev === \"alloff\") { for (const src of [...this.auditions.keys()]) this.auditionOff(src); for (const v of this.auditionVowels) v.state = \"cut\"; for (const v of this.auditionClips) v.state = \"cut\"; return; }\n    if (m.ev === \"off\") { this.auditionOff(m.src); return; }\n    if (m.ev === \"glide\") {\n      const au = this.auditions.get(m.src); if (!au || m.key === undefined) return;\n      if (au.inst.kind === \"vowel\" && this.vowels) {\n        const near = Math.abs(m.key - au.key) <= 3;   // \u79BB\u6837\u672C\u592A\u8FDC\u5C31\u6362\u4E00\u4EFD\u6837\u672C\uFF08\u539F GLIDE_SPAN\uFF09\n        if (near) { for (const v of this.auditionVowels) if (v.src === m.src) { v.target = (2 ** ((m.key - v.baseMidi) / 12)) * (this.vowels.sr / this.sr); v.key = m.key; } au.key = m.key; return; }\n      }\n      this.auditionOff(m.src); this.audition({ ...m, ev: \"on\", inst: au.inst, gainDb: m.gainDb, pan: m.pan }); return;\n    }\n    if (!m.inst || m.key === undefined) return;\n    this.auditionOff(m.src);\n    const [gl, gr] = panGains(m.gainDb ?? 0, m.pan ?? 0), vel = m.vel ?? 0.8;\n    if (m.inst.kind === \"sf\") {\n      const bank = this.banks.get(m.inst.sha); if (!bank) return;\n      let p = this.auditionSf.get(m.inst.sha); if (!p) { p = this.playerFor(bank); this.auditionSf.set(m.inst.sha, p); }\n      this.tsf.noteOn(p.player, m.inst.preset, m.key, vel);\n      this.lastAud.set(m.inst.sha, [gl, gr]);\n    } else if (m.inst.kind === \"vowel\") {\n      for (const v of this.auditionVowels) if (v.src === m.src) v.state = \"cut\";\n      this.vowelOn(this.auditionVowels, m.src, m.inst.kana, m.key, gl, gr);\n    } else return;   // clip \u8D70 auditionClip\n    this.auditions.set(m.src, { inst: m.inst, key: m.key, gl, gr });\n  }\n  private auditionOff(src: string): void {\n    const au = this.auditions.get(src); if (!au) return; this.auditions.delete(src);\n    if (au.inst.kind === \"sf\") { const p = this.auditionSf.get(au.inst.sha); if (p) this.tsf.noteOff(p.player, au.inst.preset, au.key); }\n    else if (au.inst.kind === \"clip\") { for (const v of this.auditionClips) if (v.src === src && v.state !== \"cut\") v.state = \"release\"; }\n    else for (const v of this.auditionVowels) if (v.src === src && v.state !== \"cut\") v.state = \"release\";\n  }\n  private renderAuditions(n: number): void {\n    if (this.auditionVowels.length) this.renderVowels(this.auditionVowels, null, this.audL, this.audR, 0, n);\n    if (this.auditionClips.length) this.renderClipVoices(n);\n    for (const [sha, p] of this.auditionSf) {\n      if (this.tsf.active(p.player) === 0) continue;\n      this.tsf.render(p.player, this.mono, 0, n);\n      const [gl, gr] = this.lastAud.get(sha) ?? [1, 1];\n      for (let i = 0; i < n; i++) { this.audL[i] += this.mono[i] * gl; this.audR[i] += this.mono[i] * gr; }\n    }\n  }\n  /** \u8BD5\u542C\u7684\u4E00\u6BB5\u58F0\u97F3\uFF1A\u7EBF\u6027\u91CD\u91C7\u6837\u653E\u4E00\u904D\uFF08\u4E0D\u5FAA\u73AF\uFF09\uFF0C\u8D77 5 ms\u3001\u677E\u5F00 40 ms \u6DE1\u51FA\u3001\u88AB\u9876\u6389 6 ms\u3002 */\n  private renderClipVoices(n: number): void {\n    const sr = this.sr, attack = 1 / (0.005 * sr), relK = Math.exp(-1 / (0.04 * sr)), cutK = Math.exp(-1 / (0.006 * sr));\n    for (let vi = this.auditionClips.length - 1; vi >= 0; vi--) {\n      const v = this.auditionClips[vi], d = v.data, len = d.length;\n      for (let i = 0; i < n; i++) {\n        if (v.state === \"attack\") { v.env += attack; if (v.env >= 1) { v.env = 1; v.state = \"hold\"; } }\n        else if (v.state === \"release\") v.env *= relK; else if (v.state === \"cut\") v.env *= cutK;\n        const k = v.pos | 0; if (k >= len - 1) { v.env = 0; v.state = \"cut\"; break; }\n        const f = v.pos - k, y = (d[k] * (1 - f) + d[k + 1] * f) * v.env;\n        this.audL[i] += y * v.gl; this.audR[i] += y * v.gr;\n        v.pos += v.ratio;\n      }\n      if ((v.state === \"release\" || v.state === \"cut\") && v.env < 1e-4) { this.auditionClips.splice(vi, 1); if (this.auditions.get(v.src)?.inst.kind === \"clip\") this.auditions.delete(v.src); }\n    }\n  }\n  // \u2500\u2500 \u6BCD\u7EBF\u524D\u77BB\u9650\u5E45\uFF08\u539F src/audio/mix.ts limitBus \u7684\u5B9E\u65F6\u7248\uFF1A\u8F93\u51FA\u665A look \u4E2A\u91C7\u6837\uFF1B\u6BCF\u4E2A\u672A\u6765\u7684\u5CF0\u6309 attack \u66F2\u7EBF\u63D0\u524D\u6536\u3001\u8FC7\u4E86\u5CF0\u6309 release \u6162\u6162\u653E\u5F00\uFF1B\u5DE6\u53F3\u540C\u4E00\u6761\u589E\u76CA\uFF09\u2500\u2500\u2500\n  private limit(n: number, g: number): void {\n    const look = this.look, c = CEILING, L = this.busL, R = this.busR, dL = this.delayL, dR = this.delayR, need = this.need, att = this.attPow;\n    for (let i = 0; i < n; i++) {\n      const l = L[i] * g, r = R[i] * g, p = Math.max(Math.abs(l), Math.abs(r));\n      const slot = this.wr, outL = dL[slot], outR = dR[slot];   // \u6700\u65E7\u7684 = \u8FD9\u4E00\u91C7\u6837\u7684\u8F93\u51FA\n      let gq = need[slot];                                        // \u5B83\u81EA\u5DF1\u6700\u591A\u80FD\u653E\u591A\u5927\n      dL[slot] = l; dR[slot] = r; need[slot] = p > c ? c / p : 1; // \u5199\u8FDB\u6700\u65B0\u7684\n      for (let d = 1; d <= look; d++) { const v = 1 - (1 - need[(slot + d) % look]) * att[d]; if (v < gq) gq = v; }   // \u5F80\u540E\u770B\u6574\u4E2A\u7A97\uFF1Ad = \u79BB\u8F93\u51FA\u51E0\u4E2A\u91C7\u6837\uFF08d = look \u5C31\u662F\u521A\u5199\u8FDB\u7684\uFF09\n      this.wr = (slot + 1) % look;\n      gq = Math.min(gq, 1 - (1 - this.gPrev) * this.aRel); this.gPrev = gq;\n      let a = outL * gq, b = outR * gq;\n      if (a > c) a = c; else if (a < -c) a = -c;\n      if (b > c) b = c; else if (b < -c) b = -c;\n      L[i] = a; R[i] = b;\n    }\n  }\n}\n\n/** \u9891\u8C31\u73AF\u7684\u957F\u5EA6\uFF082048 \u4E2A\u91C7\u6837 \u2248 43 ms @48k\uFF1BFFT \u5728\u4E3B\u7EBF\u7A0B\u505A\uFF09\u3002 */\nconst SPEC_N = 2048;\n/** \u674E\u8428\u5982\u56FE\u4E00\u5E27\u7684\u91C7\u6837\u6570\uFF082 \u7684\u5E42\uFF1B48 kHz \u4E0B ~21 ms\uFF09\u3002 */\nconst STEREO_N = 1024;\n/** \u603B\u7EBF\u7684\u5904\u7406\u987A\u5E8F + \u8FDE\u597D out / sends\uFF08v0.10.9\uFF09\uFF1A\u9001\u51FA\u53BB\u7684\u6392\u5728\u88AB\u9001\u8FDB\u7684\u524D\u9762\uFF08\u62D3\u6251\u5E8F\uFF09\uFF1B\u4E00\u6761\u8FDE\u7EBF\u4F1A\u63A5\u6210\u73AF = \u65AD\u6389\u5B83\uFF08\u51FA\u5230\u9000\u56DE\u603B\u8F68\u3001\u53D1\u9001\u4E0D\u8981\uFF09\uFF0C\n *  \u754C\u9762\u4E0A\u672C\u6765\u5C31\u4E0D\u8BA9\u8FD9\u6837\u8FDE\uFF08\u8BFB\u5230\u624B\u6539\u8FC7\u7684\u6587\u4EF6\u624D\u4F1A\u9047\u5230\uFF09\u3002\u4E0D\u8BA4\u8BC6\u7684\u53BB\u5904 = \u603B\u8F68 / \u4E0D\u53D1\u3002 */\nexport function busOrder(specs: readonly BusSpec[], buses: Map<string, Bus>): Bus[] {\n  const edges = new Map<string, string[]>();\n  const reach = (from: string, to: string): boolean => { const seen = new Set<string>(), st = [from]; while (st.length) { const x = st.pop()!; if (x === to) return true; if (seen.has(x)) continue; seen.add(x); st.push(...(edges.get(x) ?? [])); } return false; };\n  const link = (a: string, b: string): boolean => { if (!buses.has(b) || a === b || reach(b, a)) return false; edges.set(a, [...(edges.get(a) ?? []), b]); return true; };\n  for (const sp of specs) {\n    const b = buses.get(sp.id)!; b.out = null; b.sends = [];\n    if (sp.to && sp.to !== \"master\" && link(sp.id, sp.to)) b.out = buses.get(sp.to)!;\n    for (const sd of sp.sends ?? []) if (link(sp.id, sd.to)) b.sends.push({ bus: buses.get(sd.to)!, lin: dbToLin(sd.gainDb) });\n  }\n  const out: Bus[] = [], done = new Set<string>(), visiting = new Set<string>();\n  const visit = (id: string) => { if (done.has(id) || visiting.has(id)) return; visiting.add(id); for (const sp of specs) if ((edges.get(sp.id) ?? []).includes(id)) visit(sp.id); visiting.delete(id); done.add(id); out.push(buses.get(id)!); };\n  for (const sp of specs) visit(sp.id);\n  return out;\n}\n", "// studio-client.ts \u2014\u2014 \u4E3B\u7EBF\u7A0B\u8FD9\u8FB9\u7684\u5F55\u97F3\u623F\uFF1A\u88C5 worklet\uFF08dist/studio-worklet-<hash>.mjs\uFF09\u3001\u628A TinySoundFont \u7684 WASM \u7F16\u597D\u9012\u8FDB\u53BB\u3001\u5582\u5E93 / \u5143\u97F3\u8868 / \u65F6\u95F4\u7EBF / \u5757\u3001\u8D70\u5E26\u3001\u6309\u952E\u8BD5\u542C\u3001\n// \u6536\u4F4D\u7F6E / \u7ED3\u675F / \u7F3A\u5757\u3002\u79BB\u7EBF\u5BFC\u51FA = \u540C\u4E00\u4E2A Studio \u7C7B\u5728\u8FD9\u8FB9\u7684\u5FAA\u73AF\u91CC\u8DD1\uFF08\u540C\u4E00\u4EFD\u6570\u5B66\uFF1B\u63D0\u6848 \u00A75\uFF09\u3002created 2026-10-09 by Claude Fable 5.1\n// \u4E00\u4E2A app \u4E00\u4E2A\u5B9E\u4F8B\uFF1BAudioContext \u5168 app \u5171\u7528\uFF08src/singer/audio.ts\uFF09\u3002\u88C5 worklet \u7B2C\u4E00\u6B21\u7528\u624D\u505A\uFF08\u5BB6\u89C4\uFF1A\u91CD\u8D44\u6E90\u8981\u7B49\u7528\u6237\u6709\u610F\u56FE\u624D\u52A0\u8F7D\uFF09\u3002\nimport { instantiateTsf } from \"../gm/tsf-standalone.ts\";\nimport { Studio, BLOCK, packInt16, type StudioIn, type StudioOut, type TimelineMsg, type ChannelParams, type MasterParams, type BusSpec, type VowelEntry, type AuditionInst } from \"./studio.ts\";\n\nexport interface VowelTableMsg { sr: number; entries: VowelEntry[]; pcm: Int16Array }\nexport interface LoadInfo { busy: number; chunkBytes: number; chunks: number; voices: number }\n/** \u4E00\u6761\u4F4D\u7F6E\u62A5\u544A\uFF1A\u97F3\u9891\u65F6\u949F at \u90A3\u4E00\u523B\uFF0C\u8D70\u5E26\u5728 sec\uFF1Brun = \u6B63\u5728\u5F80\u524D\u8D70\uFF08\u653E\u7740\u3001\u6CA1\u5728\u7B49\u5757\uFF09\u3002 */\nexport interface PosSample { at: number; sec: number; run: boolean }\n/** \u626C\u58F0\u5668\u6B64\u523B\uFF08\u97F3\u9891\u65F6\u949F T\uFF09\u653E\u7684\u662F\u8D70\u5E26\u7684\u54EA\u513F\uFF1A\u627E T \u4E4B\u524D\u6700\u8FD1\u7684\u4E00\u6761\u62A5\u544A\uFF0C\u5F80\u524D\u63A8 T \u2212 at\uFF08\u5728\u7B49\u5757 / \u505C\u7740 = \u4E0D\u63A8\uFF09\u3002T \u6BD4\u6700\u65E9\u4E00\u6761\u8FD8\u65E9 = \u90A3\u4E00\u6761\u7684\u4F4D\u7F6E\u3002\u7EAF\u51FD\u6570\uFF08\u6D4B\u8BD5\u7528\uFF09\u3002 */\nexport function audibleAt(hist: readonly PosSample[], T: number): number | null {\n  if (!hist.length) return null;\n  let i = hist.length - 1; while (i > 0 && hist[i].at > T) i--;\n  const s = hist[i];\n  if (s.at > T) return s.sec;\n  return s.run ? s.sec + (T - s.at) : s.sec;\n}\n/** \u626C\u58F0\u5668\u6B64\u523B\u653E\u5230\u97F3\u9891\u65F6\u949F\u7684\u54EA\u4E00\u523B\uFF0C\u4EE5\u53CA\u6309\u54EA\u4E00\u6863\u7B97\u7684\uFF08v0.10.3\uFF0CClaude Opus 5.5\uFF1Buser\u300C\u5927\u90E8\u5206\u97F3\u548C\u52A8\u753B\u6CA1\u5BF9\u9F50\u90FD\u662F\u53D1\u751F\u5728\u957F\u9501\u5C4F\u4E4B\u540E\u56DE\u5230\u524D\u53F0\u300D\uFF09\u3002\n *  getOutputTimestamp \u7ED9\u4E00\u5BF9\uFF08\u97F3\u9891\u65F6\u949F, performance \u65F6\u949F\uFF09\uFF0C\u8981\u7528 performance.now() \u4ECE\u90A3\u4E00\u523B\u5F80\u524D\u63A8\u2014\u2014\u8FD9\u4E00\u63A8\u5047\u5B9A\u4E24\u4E2A\u65F6\u949F\u4E00\u8D77\u8D70\uFF1B\n *  \u8BBE\u5907\u7761\u8FC7\u4E00\u89C9\uFF0C\u4E24\u4E2A\u65F6\u949F\u53EF\u80FD\u5BF9\u4E0D\u4E0A\uFF08\u4E00\u4E2A\u7B97\u7761\u7720\u3001\u4E00\u4E2A\u4E0D\u7B97\uFF09\uFF0C\u63A8\u51FA\u6765\u7684\u65F6\u523B\u4F1A\u8DD1\u5230\u5F55\u97F3\u623F\u7B97\u5230\u7684\u524D\u9762\uFF0C\u64AD\u653E\u5934\u5C31\u63D0\u524D\uFF08audibleAt \u8FD8\u4F1A\u63A5\u7740\u5F80\u524D\u63A8\uFF09\u3002\n *  \u6240\u4EE5\u5148\u67E5\u5408\u7406\uFF1A\u626C\u58F0\u5668\u4E0D\u53EF\u80FD\u6BD4\u5F55\u97F3\u623F\u7B97\u5230\u7684\uFF08currentTime\uFF09\u66F4\u9760\u524D\uFF0C\u8F93\u51FA\u5EF6\u8FDF\u4E5F\u4E0D\u4F1A\u8D85\u8FC7 MAX_OUTPUT_LAT\u3002\n *  \u2460 \u63A8\u51FA\u6765\u7684\u5408\u7406 = \u7528\u5B83\uFF08\"ts\"\uFF09\u2461 \u4E0D\u5408\u7406 = \u4E0D\u63A8\u3001\u53EA\u7528\u65F6\u95F4\u6233\u91CC\u7684\u97F3\u9891\u65F6\u949F\uFF08\u6700\u591A\u843D\u540E\u4E00\u4E2A\u56DE\u8C03\uFF0C\u7EA6 10 ms\uFF1B\"ts-ctx\"\uFF09\u2462 \u90A3\u4E2A\u4E5F\u4E0D\u5408\u7406\uFF08\u65F6\u95F4\u6233\u51BB\u4F4F\u4E86\uFF09= currentTime \u2212 \u4E24\u4E2A\u5EF6\u8FDF\uFF08\"estimate\"\uFF09\u3002 */\nexport type ClockSource = \"ts\" | \"ts-ctx\" | \"estimate\";\nexport const MAX_OUTPUT_LAT = 1.0;\nexport function outputClock(o: { currentTime: number; ts: { contextTime: number; performanceTime: number } | null; perfNow: number; baseLatency?: number; outputLatency?: number }): { T: number; src: ClockSource } | null {\n  const c = o.currentTime, ok = (T: number) => T <= c + 0.005 && c - T <= MAX_OUTPUT_LAT;\n  if (o.ts && o.ts.contextTime && o.ts.performanceTime) {\n    const T = o.ts.contextTime + Math.max(0, o.perfNow - o.ts.performanceTime) / 1000;\n    if (ok(T)) return { T, src: \"ts\" };\n    if (ok(o.ts.contextTime)) return { T: o.ts.contextTime, src: \"ts-ctx\" };\n  }\n  return c ? { T: c - (o.baseLatency || 0) - (o.outputLatency || 0), src: \"estimate\" } : null;\n}\nexport interface StudioEvents { pos: (sec: number, playing: boolean, waiting: string | null) => void; ended: () => void; missing: (keys: string[]) => void; meter: (peak: number, active: number, tracks: Record<string, number>, ms: Record<string, number>, gr: Record<string, number>, cl: Record<string, [number, number]>) => void; stereo: (tracks: Record<string, { L: Float32Array; R: Float32Array }>) => void; spectrum: (sr: number, tracks: Record<string, Float32Array>) => void; load: (info: LoadInfo) => void; crash: (message: string) => void }\n\nexport class StudioClient {\n  private node: AudioWorkletNode | null = null;\n  private readyP: Promise<void> | null = null;\n  private wasm: Promise<WebAssembly.Module> | null = null;\n  private presets = new Map<string, Map<string, number>>();   // sha \u2192 \"bank:program\" \u2192 \u9884\u8BBE\u4E0B\u6807\n  private bankWait = new Map<string, { ok: () => void; fail: (e: Error) => void }[]>();\n  private bankBytes = new Map<string, Uint8Array>();   // \u79BB\u7EBF\u5BFC\u51FA\u65F6\u518D\u88C5\u4E00\u904D\u8981\u7528\n  private vowelTable: VowelTableMsg | null = null;\n  private tl: TimelineMsg | null = null;\n  private chunkKeys = new Set<string>();   // \u5757\u53EA\u5728\u5F55\u97F3\u623F\u91CC\u4E00\u4EFD\uFF08Int16\uFF1B\u5200 5\uFF09\uFF1B\u4E3B\u7EBF\u7A0B\u53EA\u8BB0\u952E\n  private pendingChunks: { key: string; sr: number; samples: Int16Array; k?: number }[] = [];   // worklet \u8FD8\u6CA1\u88C5\u597D\u65F6\u5148\u6392\u7740\n  private chunkWait: ((items: { key: string; sr: number; samples: Int16Array; k?: number }[]) => void) | null = null;\n  private channels = new Map<string, Partial<ChannelParams>>();\n  private masterP: Partial<MasterParams> = {};\n  private busesP: BusSpec[] = [];\n  private listeners = new Map<keyof StudioEvents, Set<(...a: never[]) => void>>();\n  private _playing = false; private _pos = 0; private _waiting: string | null = null;\n  private gen = 0;\n  private hist: PosSample[] = [];   // \u6700\u8FD1 3 s \u7684\u4F4D\u7F6E\u62A5\u544A\uFF08\u97F3\u9891\u65F6\u949F \u2192 \u8D70\u5E26\u4F4D\u7F6E\uFF09\uFF1A\u64AD\u653E\u5934\u6309\u626C\u58F0\u5668\u7684\u65F6\u949F\u67E5\u8FD9\u5F20\u8868\uFF082026-10-10 Opus 5.5\uFF1Buser\u300Cipad\u540E\u53F0\u5524\u8D77\u540E\u97F3\u9891\u548C\u52A8\u753B\u9519\u4F4D\u300D\uFF09   // \u8D70\u5E26\u4EE3\u53F7\uFF1Aplay / stop \u5404\u52A0\u4E00\uFF1B\u5F55\u97F3\u623F\u7684\u4F4D\u7F6E\u62A5\u544A\u5E26\u7740\u53D1\u51FA\u65F6\u7684\u4EE3\u53F7\uFF0C\u65E7\u4EE3\u53F7\u7684\uFF08\u505C\u4E86\u4E4B\u540E\u8FD8\u5728\u8DEF\u4E0A\u7684\uFF09\u6254\u6389\u2014\u2014\u4E0D\u7136\u300C\u505C\u300D\u4E4B\u540E\u4E00\u6761\u8FDF\u5230\u7684 pos \u4F1A\u628A playing \u7FFB\u56DE true\n\n  private ctx: () => AudioContext; private moduleUrl: URL; private wasmUrl: URL;\n  constructor(ctx: () => AudioContext, moduleUrl: URL, wasmUrl: URL) { this.ctx = ctx; this.moduleUrl = moduleUrl; this.wasmUrl = wasmUrl; }\n\n  on<K extends keyof StudioEvents>(ev: K, cb: StudioEvents[K]): () => void {\n    let set = this.listeners.get(ev); if (!set) { set = new Set(); this.listeners.set(ev, set); }\n    set.add(cb as (...a: never[]) => void); return () => { set.delete(cb as (...a: never[]) => void); };\n  }\n  private emit<K extends keyof StudioEvents>(ev: K, ...args: Parameters<StudioEvents[K]>): void { for (const cb of this.listeners.get(ev) ?? []) (cb as (...a: unknown[]) => void)(...args); }\n\n  get playing(): boolean { return this._playing; }\n  get position(): number { return this._pos; }\n  get waiting(): string | null { return this._waiting; }\n  get timeline(): TimelineMsg | null { return this.tl; }\n  hasChunk(key: string): boolean { return this.chunkKeys.has(key); }\n\n  private wasmModule(): Promise<WebAssembly.Module> {\n    return (this.wasm ??= fetch(this.wasmUrl).then(async (r) => { if (!r.ok) throw new Error(`TinySoundFont (standalone): HTTP ${r.status}`); return WebAssembly.compile(await r.arrayBuffer()); }));\n  }\n  /** \u88C5\u597D worklet + WASM\uFF08\u7B2C\u4E00\u6B21\u7528\u624D\u505A\uFF1BAudioContext \u53EF\u4EE5\u8FD8\u6CA1\u89E3\u9501\uFF09\u3002 */\n  ensure(): Promise<void> {\n    if (this.readyP) return this.readyP;\n    this.readyP = (async () => {\n      const ctx = this.ctx();\n      const [, module] = await Promise.all([ctx.audioWorklet.addModule(this.moduleUrl.href), this.wasmModule()]);\n      const node = new AudioWorkletNode(ctx, \"studio\", { numberOfInputs: 0, numberOfOutputs: 1, outputChannelCount: [2], processorOptions: { module } });\n      await new Promise<void>((ok, fail) => {\n        node.port.onmessage = (e: MessageEvent<StudioOut>) => {\n          const m = e.data;\n          switch (m.type) {\n            case \"ready\": ok(); return;\n            case \"banked\": { this.presets.set(m.sha, new Map(m.presets.map(([b, p], i) => [`${b}:${p}`, i]))); for (const w of this.bankWait.get(m.sha) ?? []) w.ok(); this.bankWait.delete(m.sha); return; }\n            case \"crash\": this._playing = false; this._waiting = null; this.emit(\"crash\", m.message); return;\n            case \"error\": { fail(new Error(m.message)); for (const ws of this.bankWait.values()) for (const w of ws) w.fail(new Error(m.message)); this.bankWait.clear(); return; }\n            case \"pos\": {\n              if (m.gen !== this.gen) return; this._pos = m.sec; this._playing = m.playing; this._waiting = m.waiting;\n              if (m.at !== undefined) { const h = this.hist; h.push({ at: m.at, sec: m.sec, run: m.playing && !m.waiting }); while (h.length > 2 && h[0].at < m.at - 3) h.shift(); }\n              this.emit(\"pos\", m.sec, m.playing, m.waiting); return;\n            }\n            case \"ended\": if (m.gen !== this.gen) return; this._playing = false; this.emit(\"ended\"); return;\n            case \"missing\": this.emit(\"missing\", m.keys); return;\n            case \"meter\": this.emit(\"meter\", m.peak, m.active, m.tracks ?? {}, m.ms ?? {}, m.gr ?? {}, m.cl ?? {}); return;\n            case \"stereo\": this.emit(\"stereo\", m.tracks); return;\n            case \"spectrum\": this.emit(\"spectrum\", m.sr, m.tracks); return;\n            case \"load\": this.emit(\"load\", { busy: m.busy, chunkBytes: m.chunkBytes, chunks: m.chunks, voices: m.voices }); return;\n            case \"chunks\": { const w = this.chunkWait; this.chunkWait = null; w?.(m.items); return; }\n          }\n        };\n      });\n      node.connect(ctx.destination);\n      this.node = node;\n      // \u88C5\u4E4B\u524D\u8BB0\u4E0B\u7684\u72B6\u6001\u7167\u53D1\uFF08\u5143\u97F3\u8868 / \u5E93 / \u901A\u9053 / \u603B\u8F68 / \u65F6\u95F4\u7EBF / \u5757\uFF09\n      if (this.vowelTable) this.post({ type: \"vowels\", ...this.vowelTable });\n      for (const [sha, bytes] of this.bankBytes) this.post({ type: \"bank\", sha, bytes: bytes.slice() });\n      for (const [id, p] of this.channels) this.post({ type: \"channel\", id, p });\n      if (this.busesP.length) this.post({ type: \"buses\", buses: this.busesP });\n      if (Object.keys(this.masterP).length) this.post({ type: \"master\", p: this.masterP });\n      if (this.tl) this.post({ type: \"timeline\", tl: this.tl });\n      for (const c of this.pendingChunks.splice(0)) this.post({ type: \"chunk\", key: c.key, sr: c.sr, samples: c.samples, ...(c.k ? { k: c.k } : {}) }, [c.samples.buffer]);\n    })().catch((e) => { this.readyP = null; throw e; });\n    return this.readyP;\n  }\n  private post(m: StudioIn, transfer: Transferable[] = []): void { this.node?.port.postMessage(m, transfer); }\n\n  /** \u8F7D\u4E00\u4EFD sf2\uFF08\u6309 sha \u7559\u7740\uFF0C\u591A\u4EFD\u5E76\u5B58\uFF1B\u540C\u4E00\u4EFD\u4E0D\u91CD\u8F7D\uFF09\u3002resolve = worklet \u91CC\u88C5\u597D\u4E86\uFF08\u9884\u8BBE\u8868\u53EF\u67E5\uFF09\u3002 */\n  async bank(sha: string, bytes: Uint8Array): Promise<void> {\n    if (this.presets.has(sha)) return;\n    const first = !this.bankBytes.has(sha); this.bankBytes.set(sha, bytes);\n    await this.ensure();\n    if (this.presets.has(sha)) return;\n    const p = new Promise<void>((ok, fail) => { const ws = this.bankWait.get(sha) ?? []; ws.push({ ok, fail }); this.bankWait.set(sha, ws); });\n    if (first || !this.bankWait.get(sha)?.length) { /* \u88C5\u7684\u65F6\u5019\u5DF2\u7ECF\u5728 ensure \u91CC\u53D1\u8FC7\u4E00\u6B21\uFF08bankBytes \u5148\u8BB0\uFF09\uFF1B\u8FD9\u91CC\u8865\u53D1\u662F\u5E42\u7B49\u7684 */ }\n    this.post({ type: \"bank\", sha, bytes: bytes.slice() });\n    return p;\n  }\n  hasBank(sha: string): boolean { return this.presets.has(sha); }\n  /** \u9884\u8BBE\u4E0B\u6807\uFF08\u8FD9\u4EFD\u5E93\u91CC\u6309 bank:program \u627E\uFF1B\u6CA1\u6709 = \u22121\uFF09\u3002 */\n  presetIndex(sha: string, bank: number, program: number): number { return this.presets.get(sha)?.get(`${bank}:${program}`) ?? -1; }\n  unbank(sha: string): void { this.presets.delete(sha); this.bankBytes.delete(sha); this.post({ type: \"unbank\", sha }); }\n  vowels(t: VowelTableMsg): void { this.vowelTable = t; this.post({ type: \"vowels\", ...t }); }\n\n  setTimeline(tl: TimelineMsg): void { this.tl = tl; this.post({ type: \"timeline\", tl }); }\n  /** \u5582\u4E00\u5757\uFF1A\u8F6C\u6210 Int16 \u8F6C\u79FB\u7ED9\u5F55\u97F3\u623F\uFF08\u53EA\u5728\u90A3\u8FB9\u7559\u4E00\u4EFD\uFF1B\u79BB\u7EBF\u5BFC\u51FA\u518D\u8981\u56DE\u6765\uFF09\u3002worklet \u8FD8\u6CA1\u88C5\u597D = \u5148\u6392\u7740\u3001\u88C5\u597D\u5C31\u53D1\u3002 */\n  chunk(key: string, sr: number, samples: Float32Array | Int16Array): void {\n    const p = samples instanceof Int16Array ? { s: samples, k: 1 } : packInt16(samples), i16 = p.s, k = p.k !== 1 ? { k: p.k } : {};   // \u8D85\u8FC7\u6EE1\u5E45\u7684\u5757\u6574\u5757\u7F29\u8FDB Int16\u3001\u5E26\u4E0A\u500D\u6570\uFF08\u4E0D\u524A\u9876\uFF09\n    this.chunkKeys.add(key);\n    if (this.node) this.post({ type: \"chunk\", key, sr, samples: i16, ...k }, [i16.buffer]);\n    else { this.pendingChunks.push({ key, sr, samples: i16, ...k }); void this.ensure().catch(() => undefined); }\n  }\n  forget(keys: string[]): void { for (const k of keys) { this.chunkKeys.delete(k); this.pendingChunks = this.pendingChunks.filter((c) => c.key !== k); } this.post({ type: \"forget\", keys }); }\n  /** \u5411\u5F55\u97F3\u623F\u8981\u51E0\u5757\uFF08\u62F7\u8D1D\uFF09\uFF1A\u79BB\u7EBF\u5BFC\u51FA\u7528\u3002 */\n  private fetchChunks(keys: string[]): Promise<{ key: string; sr: number; samples: Int16Array; k?: number }[]> {\n    if (!keys.length || !this.node) return Promise.resolve([]);\n    return new Promise((ok) => { this.chunkWait = ok; this.post({ type: \"getChunks\", keys }); });\n  }\n  channel(id: string, p: Partial<ChannelParams>): void { this.channels.set(id, { ...this.channels.get(id), ...p }); this.post({ type: \"channel\", id, p }); }\n  master(p: Partial<MasterParams>): void { this.masterP = { ...this.masterP, ...p }; this.post({ type: \"master\", p }); }\n  /** \u603B\u7EBF\uFF08\u6DF7\u54CD / \u5EF6\u8FDF\u8FD9\u7C7B\u300C\u7559\u5728\u5C4B\u91CC\u7684\u300D\uFF09\uFF1A\u6574\u5F20\u8868\u4E00\u8D77\u7ED9\u3002 */\n  buses(b: BusSpec[]): void { this.busesP = b; this.post({ type: \"buses\", buses: b }); }\n\n  /** \u4ECE at \u79D2\u653E\u8D77\uFF08\u4E0D\u7ED9 = \u4ECE\u8303\u56F4\u5934 / \u4E0A\u6B21\u4F4D\u7F6E\uFF09\u3002\u8981\u5148\u5728\u7528\u6237\u624B\u52BF\u91CC\u89E3\u9501\u8FC7 AudioContext\uFF08iPad\uFF09\u3002 */\n  /** quiet = \u8D77\u70B9\uFF08\u4ECE\u67D0\u4E00\u6BB5\u653E\u65F6 at \u6BD4\u5B83\u63D0\u524D\u4E00\u70B9\uFF09\uFF1A\u5728\u5B83\u4E4B\u524D\u5C31\u7ED3\u675F\u7684\u97F3 / \u5531\u5B8C\u7684\u5757\u8FD9\u6B21\u4E0D\u51FA\u58F0\uFF08v0.10.3\uFF09\u3002 */\n  async play(at?: number, quiet?: number): Promise<void> { await this.ensure(); this.gen++; this._playing = true; this._waiting = null; this.hist = []; if (at !== undefined) this._pos = at; this.post({ type: \"play\", at, gen: this.gen, ...(quiet !== undefined ? { quiet } : {}) }); }\n  stop(): void { this.gen++; this._playing = false; this._waiting = null; this.hist = []; this.post({ type: \"stop\" }); }\n  /** \u626C\u58F0\u5668\u6B64\u523B\u5728\u653E\u97F3\u9891\u65F6\u949F\u7684\u54EA\u4E00\u523B\uFF08getOutputTimestamp\uFF1A\u6D4F\u89C8\u5668\u6309\u786C\u4EF6\u7684\u8F93\u51FA\u7F13\u51B2\u62A5\u7684\uFF1B\u6CA1\u6709\u5C31\u7528 currentTime \u2212 \u4E24\u4E2A\u5EF6\u8FDF\u4F30\uFF09\u3002 */\n  outputTime(): number | null {\n    const ctx = this.ctx(), ts = typeof ctx.getOutputTimestamp === \"function\" ? ctx.getOutputTimestamp() : null;\n    const r = outputClock({ currentTime: ctx.currentTime, ts: ts && ts.contextTime !== undefined && ts.performanceTime !== undefined ? { contextTime: ts.contextTime, performanceTime: ts.performanceTime } : null, perfNow: performance.now(), baseLatency: ctx.baseLatency, outputLatency: (ctx as unknown as { outputLatency?: number }).outputLatency });\n    this.clockSrc = r?.src ?? null;\n    return r?.T ?? null;\n  }\n  /** \u6700\u8FD1\u4E00\u6B21 outputTime() \u6309\u54EA\u4E00\u6863\u7B97\u7684\uFF08\u9ED1\u5323\u5B50\u7528\uFF09\u3002 */\n  clockSrc: ClockSource | null = null;\n  /** \u8F93\u51FA\u5EF6\u8FDF\uFF08ms\uFF09\uFF1A\u5F55\u97F3\u623F\u7B97\u5230\u7684 vs \u626C\u58F0\u5668\u653E\u5230\u7684\uFF08\u8BCA\u65AD / \u8BBE\u7F6E\u9875\u770B\uFF09\u3002 */\n  latencyMs(): number | null { const T = this.outputTime(); return T === null ? null : Math.max(0, (this.ctx().currentTime - T) * 1000); }\n  /** \u73B0\u5728**\u542C\u5230\u7684**\u662F\u8D70\u5E26\u7684\u54EA\u513F\uFF08\u64AD\u653E\u5934\u753B\u8FD9\u91CC\uFF09\uFF1B\u6CA1\u6709\u62A5\u544A = null\uFF08\u9000\u56DE position\uFF09\u3002 */\n  audibleSec(): number | null { const T = this.outputTime(); return T === null ? null : audibleAt(this.hist, T); }\n  seek(at: number, quiet?: number): void { this._pos = at; this.post({ type: \"seek\", at, ...(quiet !== undefined ? { quiet } : {}) }); }\n  /** \u6309\u952E\u8BD5\u542C\uFF08\u8981\u5148 ensure \u8FC7\uFF1B\u6CA1\u88C5\u597D\u7684\u8FD9\u4E00\u4E0B\u4E22\u6389\u2014\u2014\u8BD5\u542C\u8981\u5373\u65F6\uFF0C\u8FDF\u5230\u7684\u97F3\u66F4\u70E6\uFF09\u3002 */\n  audition(m: Omit<Extract<StudioIn, { type: \"audition\" }>, \"type\">): void { if (this.node) this.post({ type: \"audition\", ...m }); }\n  auditionOn(src: string, inst: AuditionInst, key: number, vel: number, gainDb: number, pan: number): void { this.audition({ src, ev: \"on\", inst, key, vel, gainDb, pan }); }\n  auditionOff(src: string): void { this.audition({ src, ev: \"off\" }); }\n  auditionGlide(src: string, key: number): void { this.audition({ src, ev: \"glide\", key }); }\n  auditionAllOff(): void { this.audition({ src: \"\", ev: \"alloff\" }); }\n  /** \u653E\u4E00\u6BB5\u73B0\u6210\u7684\u58F0\u97F3\u5F53\u8BD5\u542C\uFF08\u6708\u8BFB\u5531\u7684\u4E00\u4E2A\u5B57\uFF1Bsamples \u8F6C\u79FB\u8FC7\u53BB\uFF09\u3002 */\n  auditionClip(src: string, sr: number, samples: Float32Array, gainDb: number, pan: number): void { if (!this.node) return; const copy = samples.slice(); this.post({ type: \"auditionClip\", src, sr, samples: copy, gainDb, pan }, [copy.buffer]); }\n  meter(on: boolean): void { this.post({ type: \"meter\", on }); }\n  /** \u9891\u8C31\u5F00\u5173\uFF08\u6DF7\u97F3\u53F0 EQ \u9875\u770B\u5F97\u89C1\u624D\u5F00\uFF1Bv0.10.11\uFF09\u3002 */\n  spectrum(on: boolean): void { if (on !== this.specOn) { this.specOn = on; this.post({ type: \"spectrum\", on }); } }\n  /** \u674E\u8428\u5982\u56FE\uFF08\u603B\u8F68 / \u6DF7\u97F3\u8F68\u7684\u5DE6\u53F3\u91C7\u6837\uFF09\uFF1A\u5F00\u7740\u624D\u6512\uFF08\u6DF7\u97F3\u53F0\u300C\u57FA\u7840\u300D\u9875\u770B\u5F97\u89C1\u65F6\uFF09\u3002 */\n  stereo(on: boolean): void { if (on !== this.stereoOn) { this.stereoOn = on; this.post({ type: \"stereo\", on }); } }\n  private specOn = false; private stereoOn = false;\n  get now(): number { return this.ctx().currentTime; }\n\n  /** \u79BB\u7EBF\u5BFC\u51FA\uFF1A\u540C\u4E00\u4E2A Studio \u7C7B\u5728\u4E3B\u7EBF\u7A0B\u5FAA\u73AF\u91CC\u8DD1\u540C\u6837\u7684\u5757\u7F51\u683C\uFF08\u6BCF 400 \u5757\u8BA9\u4E00\u6B21\u4E8B\u4EF6\u5FAA\u73AF\uFF0C\u754C\u9762\u4E0D\u5361\uFF09\u3002\u8F93\u51FA\u4ECE range.from \u8D77\u3001\u6263\u6389\u9650\u5E45\u5668\u7684\u5EF6\u8FDF\u3002\n   *  tl \u4E0D\u7ED9 = \u73B0\u5728\u7684\u65F6\u95F4\u7EBF\uFF1Bprogress(0\u20261)\u3002 */\n  async renderOffline(tl: TimelineMsg | null = this.tl, o: { sr?: number; progress?: (f: number) => void } = {}): Promise<{ left: Float32Array; right: Float32Array; sr: number; start: number }> {\n    if (!tl) throw new Error(\"studio: no timeline to render\");\n    const sr = o.sr ?? 44100, tsf = await instantiateTsf(await this.wasmModule());\n    let ended = false;\n    const s = new Studio(sr, tsf, (m) => { if (m.type === \"ended\") ended = true; });\n    if (this.vowelTable) s.handle({ type: \"vowels\", ...this.vowelTable });\n    for (const [sha, bytes] of this.bankBytes) s.handle({ type: \"bank\", sha, bytes });\n    for (const [id, p] of this.channels) s.handle({ type: \"channel\", id, p });\n    s.handle({ type: \"buses\", buses: this.busesP });\n    s.handle({ type: \"master\", p: this.masterP });\n    s.handle({ type: \"timeline\", tl: { ...tl, loop: false } });\n    const keys = tl.tracks.flatMap((t) => (t.kind === \"clips\" ? t.clips.map((c) => c.key) : [])).filter((k) => this.chunkKeys.has(k));\n    if (keys.length) { await this.ensure(); for (const c of await this.fetchChunks([...new Set(keys)])) s.handle({ type: \"chunk\", key: c.key, sr: c.sr, samples: c.samples, ...(c.k ? { k: c.k } : {}) }); }   // \u500D\u6570\u8DDF\u7740\u8D70\uFF08\u79BB\u7EBF\u5BFC\u51FA\uFF09\n    const lat = s.latency, total = Math.ceil((tl.range.to - tl.range.from) * sr) + lat + Math.ceil(2.5 * sr);   // + \u5C3E\u5DF4\u4E0A\u9650\n    const L = new Float32Array(total), R = new Float32Array(total), bl = new Float32Array(BLOCK), br = new Float32Array(BLOCK);\n    s.handle({ type: \"play\", at: tl.range.from });\n    let n = 0, k = 0;\n    while (!ended && n < total) {\n      const cnt = Math.min(BLOCK, total - n);\n      s.render(bl, br, cnt); L.set(bl.subarray(0, cnt), n); R.set(br.subarray(0, cnt), n); n += cnt;\n      if (s.waitingFor) throw new Error(`studio: chunk ${s.waitingFor} missing for export`);\n      if (++k % 400 === 0) { o.progress?.(Math.min(1, n / total)); await new Promise<void>((r) => setTimeout(r, 0)); }\n    }\n    o.progress?.(1);\n    const len = Math.max(0, n - lat);\n    return { left: L.slice(lat, lat + len), right: R.slice(lat, lat + len), sr, start: tl.range.from };\n  }\n}\n", "// registry.ts \u2014\u2014 \u6F14\u594F\u8005\u63D2\u4EF6\u7684\u6CE8\u518C\u8868\uFF08ADR-0004 `ai-docs/adr/0004-plugins-at-five-seams-core-stays.md`\uFF1A\u63D2\u4EF6\u53EA\u6302\u4E94\u5904\u63A5\u7F1D\uFF0C\u8FD9\u91CC\u662F\u300C\u51FA\u58F0\u300D\u90A3\u4E00\u5904\uFF09\u3002\n//   created 2026-10-14 by Claude Fable 5.1\uFF08\u5C4E\u5C71\u7EF4\u62A4\u7EAA\u5143\u5200 1\uFF1A\u5531\u6B4C / \u64AD\u653E\u80F6\u6C34\u62BD\u51FA main.ts \u7684\u540C\u65F6\u5EFA\u8FD9\u5F20\u8868\uFF1B\n//   user 2026-10-14\u300C\u5728\u7CFB\u7EDF\u91CC\u53EA\u662F\u6CE8\u518C\u8868\u91CC\u7684\u4E00\u9879 \u5BF9\uFF01\uFF01\uFF01\u300D\u300C\u6BCF\u4E2A\u63D2\u4EF6\u5B9E\u4F8B\u4E00\u4E2A\u5730\u5740 \u79CD\u7C7B:\u540D\u5B57@\u7248\u672C\u300D\u300C\u63D2\u4EF6\u5EFA\u8BAE\u7528\u4E00\u4E2A\u5185\u90E8\u7684guid\uFF0C\u7136\u540E\u52A0\u4E0A\u82F1\u6587\u540D\u7528\u6765\u6545\u969C\u6062\u590D\u81EA\u6108\u300D\uFF09\u3002\n//\n// \u89C4\u77E9\uFF1A\n//   \u00B7 \u4E00\u4E2A\u6F14\u594F\u8005\u63D2\u4EF6 = guid\uFF08\u51FA\u751F\u65F6\u5B9A\u3001\u6C38\u4E0D\u6539\uFF09+ \u82F1\u6587\u540D\uFF08\u4EBA\u8BFB\u7684\u3001\u6545\u969C\u6062\u590D\u7528\uFF09+ \u7248\u672C\uFF08\u6574\u6570\uFF09\uFF1B\u5730\u5740\u5199\u6210 `performer:<name>@<version>`\u3002\n//   \u00B7 \u6B4C\u91CC\u5B58\u5730\u5740 + by-value \u53C2\u6570\uFF08\u73B0\u5728 = CandidateV2.instrument\uFF0Cengine \u5B57\u6BB5 = \u82F1\u6587\u540D\uFF1B\u5957 guid \u58F3\u662F\u683C\u5F0F\u90A3\u4E00\u5200\u7684\u4E8B\uFF0C\u8FD9\u91CC\u5148\u6309\u540D\u5B57\u89E3\u6790\uFF09\u3002\n//   \u00B7 \u4EE3\u7801\u91CC\u4E0D\u8BB8\u518D\u6309\u5F15\u64CE\u540D\u5206\u652F\uFF08`engine === \"tsukuyomi\"` \u8FD9\u7C7B\uFF09\uFF1B\u8981\u77E5\u9053\u300C\u8FD9\u4F4D\u80FD\u4EC0\u4E48\u300D\u5C31\u95EE\u63D2\u4EF6\u7684\u80FD\u529B\u5B57\u6BB5\uFF0C\u8981\u8BA9\u5B83\u5E72\u6D3B\u5C31\u8C03\u5B83\u7684\u65B9\u6CD5\u3002\n//   \u00B7 \u8BA4\u4E0D\u51FA\u7684\uFF08engine \u4E0D\u5728\u8868\u91CC\uFF09= null\uFF1A\u65F6\u95F4\u7EBF\u62A5\u300C\u8FD8\u6CA1\u6709\u4EBA\u4E0A\u573A\u300D\u3001\u4E0D\u51FA\u58F0\u3001\u4E0D\u66FF\u8865\uFF0810-07 \u7EAA\u5F8B\uFF09\u3002\n//   \u00B7 \u7248\u672C\u6BD4\u6B4C\u91CC\u8BB0\u7684\u65B0 = \u753B\u7070 + \u63D0\u793A\u300C\u5347\u7EA7\u5230 @N\uFF1F\u300D\uFF0Cuser \u70B9\u4E86\u624D\u8DD1\u63D2\u4EF6\u81EA\u5E26\u7684\u8FC1\u79FB\uFF1B**\u4E0D\u9759\u9ED8\u6362**\uFF08user 2026-10-14\u300C\u63D2\u4EF6\u5347\u7EA7\u4E86\u662F\u53D8\u7070\u63D0\u793A\u4F60\u6309\u5347\u7EA7\uFF0C\u800C\u4E0D\u662F\u9759\u9ED8\u6362\u300D\uFF09\u3002\n//     \u89E3\u6790\u56DB\u79CD\u60C5\u51B5\uFF08\u5BF9\u7248\u672C / \u5F85\u5347\u7EA7 / \u540C\u540D\u9876\u4E0A\u8981\u4EBA\u786E\u8BA4 / \u8BA4\u4E0D\u51FA\uFF09\u5728 ADR-0004 \u00A72.2\uFF1B\u5E26 guid \u7684\u58F3\u548C\u7248\u672C\u6BD4\u5BF9\u7B49\u683C\u5F0F\u90A3\u4E00\u5200\u5957\u4E0A\u53BB\u518D\u505A\uFF0C\u73B0\u5728\u6B4C\u91CC\u8FD8\u53EA\u6709\u5F15\u64CE\u540D\u3002\n//     \u600E\u4E48\u9732\u51FA\u6765\uFF08\u4E00\u5F20\u6E05\u5355 / \u5E38\u9A7B\u89D2\u6807 / \u5F00\u6B4C\u4E00\u6761 toast / \u5BFC\u51FA\u9762\u677F\u4E00\u884C\uFF1Bpatch-minor-major \u843D\u5728\u8FC1\u79FB\u6B65\u9AA4\u4E0A\uFF1B\u65E7 app \u5F00\u65B0\u6B4C\u9010\u8F68\u7070\uFF09= ADR-0004 \u00A72.2\u00BD\uFF08user 2026-10-14\u300C\u4E00\u5957\u673A\u5236\u3001\u56DB\u4E2A\u51FA\u53E3 \u540C\u610F\u300D\uFF09\uFF0C\u8FD8\u6CA1\u843D\u5730\u3002\nimport type { Extras, GmCandidate } from \"../format/project.ts\";\nimport type { Catalog } from \"../gm/catalog.ts\";\nimport type { Hum } from \"../format/contract.ts\";\nimport type { FxV2 } from \"../format/contract.ts\";\nimport type { PerformerInfo } from \"../engine/timeline.ts\";\nimport type { TrackSpec, GainSeg, AuditionInst } from \"../engine/studio.ts\";\nimport type { Mark } from \"../score/perform.ts\";\nimport type { PercKind } from \"../gm/percussion.ts\";\n\n/** \u5531\u4E0D\u5531\u5B57\uFF1Awords = \u5531\u6B4C\u8BCD\uFF1Bhum = \u53EA\u54FC\uFF08\u6B4C\u8BCD\u753B\u7070\u300C\u53EA\u54FC\u300D\uFF09\uFF1Bnone = \u4E50\u5668\uFF0C\u4E0D\u5531\u3002 */\nexport type LyricsAbility = \"words\" | \"hum\" | \"none\";\n/** pad \u952E\u5E95\u90E8\u63D0\u793A\u7684\u97F3\u57DF\uFF08\u4EBA\u58F0\u56FA\u5B9A\uFF1B\u4E50\u5668\u770B\u76EE\u5F55 = null\uFF0C\u7531\u754C\u9762\u53E6\u67E5\uFF09\u3002 */\nexport type FixedRange = { lo: number; hi: number; who: string } | null;\n/** \u65F6\u95F4\u7EBF\u4EA4\u7ED9\u63D2\u4EF6\u7684\u4E00\u4E2A\u97F3\uFF08\u79D2\uFF1B\u529B\u5EA6\u5DF2\u6309\u8C31\u7B97\u597D\uFF09\u3002 */\nexport interface LightNote { midi: number; t0: number; t1: number; vel?: number }\n/** \u53EA\u8981\u77E5\u9053\u300C\u54EA\u9996\u6B4C\u7684\u54EA\u4E2A\u89D2\u8272\u300D\u7684\u8C03\u7528\u90FD\u7528\u8FD9\u4E2A\u3002 */\nexport interface RoleCtx { extras: Extras; role: string }\n/** \u51FA\u58F0\u524D\u51C6\u5907\u8981\u7528\u7684\u4E1C\u897F\uFF08\u80F6\u6C34\u7ED9\uFF1B\u63D2\u4EF6\u53EA\u62FF\u5B83\u8981\u7684\uFF09\u3002 */\nexport interface PrepareCtx extends RoleCtx {\n  engine: { hasBank(sha: string): boolean; bank(sha: string, bytes: Uint8Array): Promise<void> };\n  resolveGmBytes(g: GmCandidate): Promise<Uint8Array>;\n  ensureVowels(): Promise<void>;\n}\nexport interface InfoCtx extends RoleCtx { presetIndex(sha: string, bank: number, program: number): number }\nexport interface TrackCtx { id: string; notes: LightNote[]; gain: GainSeg[] | null; chain?: FxV2[]; hum: Hum; info: PerformerInfo }\nexport type TrackResult = { track: TrackSpec; from?: number } | { unplayable: string };\n/** \u6309\u952E\u8BD5\u542C\uFF08\u5F39 / \u5199\u97F3 / \u62D6\u97F3\u9AD8\u7684\u9884\u542C\uFF09\uFF1A\u5149\u6807\u5904\u7684\u529B\u5EA6\u5DF2\u7B97\u597D\uFF08vel = MIDI \u529B\u5EA6 0\u20131\uFF0C\u6709\u529B\u5EA6\u8868\u7684\u7528\uFF1BdB = \u97F3\u91CF\uFF0C\u6CA1\u6709\u7684\u7528\uFF09\uFF1Bkana = \u8FD9\u9996\u6B4C\u54FC\u7684\u5B57\u3002 */\nexport interface AuditionCtx extends RoleCtx {\n  kana: string;\n  dyn: { vel: number | null; dB: number };\n  engine: { hasBank(sha: string): boolean; presetIndex(sha: string, bank: number, program: number): number };\n  /** \u5E93\u8FD8\u6CA1\u8F7D\u597D\uFF1A\u8FD9\u4E00\u4E0B\u4E22\u6389\u3001\u987A\u624B\u53BB\u8F7D\uFF08\u8BD5\u542C\u8981\u5373\u65F6\uFF0C\u8FDF\u5230\u7684\u97F3\u66F4\u70E6\uFF09\u3002 */\n  ensureBank(): void;\n}\n/** \u8BD5\u542C\u7528\u8C01\u51FA\u58F0\uFF1BgainDb = \u529B\u5EA6\u5E26\u6765\u7684\u90A3\u90E8\u5206\uFF08\u901A\u9053\u7684\u589E\u76CA / \u58F0\u50CF\u5F52\u8F68\uFF0C\u80F6\u6C34\u52A0\uFF09\u3002null = \u8FD9\u4E00\u4E0B\u4E0D\u51FA\u58F0\u3002 */\nexport type AuditionTarget = { inst: AuditionInst; key: (midi: number) => number; vel: number; gainDb: number };\n/** \u8C31\u4E0A\u600E\u4E48\u753B\u8FD9\u4F4D\uFF08\u53EA\u662F\u753B\u6CD5\uFF0C\u6570\u636E\u4E0D\u52A8\uFF09\uFF1AxHead = \u56FA\u5B9A\u6572\u4E00\u4E2A\u952E \u2192 \u00D7 \u7B26\u5934\uFF1Bperc = \u9F13 / \u97F3\u6548 \u2192 \u9F13\u8C31\u3002 */\nexport type Notation = { xHead?: true; perc?: PercKind };\n/** \u4E50\u5668\u9875\u300C\u600E\u4E48\u6F14\u300D\u91CC\u8FD9\u4F4D\u81EA\u62A5\u7684\u4E00\u884C\uFF08ADR-0004 \u00A72.5\u300C\u69FD\u65C1\u7684\u53C2\u6570\u884C\u7531\u63D2\u4EF6\u81EA\u62A5\uFF0C\u4E0D\u662F main.ts \u5199\u6B7B\u300D\uFF1B2026-10-15 \u5200 5 \u4E4B\u4E00\uFF09\uFF1A\n *  control / note = HTML \u7247\u6BB5\uFF08\u5BBF\u4E3B\u7684 row() \u6392\u7248\uFF1B\u6309\u94AE\u5E26 data-v\uFF0C\u6309\u5230\u4E86\u56DE onInspector\uFF09\uFF1Bplace = \u653E\u54EA\uFF1A\u4E3B\u5757\uFF08\u9ED8\u8BA4\uFF09/ \u300C\u9AD8\u7EA7\u300D\u6298\u53E0 / \u672B\u5C3E\u3002 */\nexport interface InspectorRow { label: string; control: string; note?: string; place?: \"adv\" | \"tail\" }\nexport interface InspectorCtx extends RoleCtx {\n  hum: Hum;\n  /** \u97F3\u4E50\u76EE\u5F55\uFF08\u8F7D\u597D\u4E86\u624D\u6709\uFF1B\u6CA1\u8F7D = \u884C\u91CC\u5C11\u51E0\u53E5\u8BF4\u660E\uFF0C\u5BBF\u4E3B\u8F7D\u597D\u4F1A\u91CD\u753B\uFF09\u3002 */\n  catalog: Catalog | null;\n  esc(s: string): string;\n  /** \u4E00\u4E2A\u9009\u9879\u94AE\uFF08\u4EAE = \u73B0\u5728\u662F\u5B83\uFF09\u3002 */\n  chip(v: string, label: string, on: boolean, title?: string): string;\n  /** \u529B\u5EA6\u6362\u7B97\u8868\uFF08\u6BCF\u4E2A\u529B\u5EA6\u8BB0\u53F7 \u2192 \u8FD9\u4F4D\u7684 MIDI \u529B\u5EA6\u6216 dB\uFF1B\u6709 GS \u529B\u5EA6\u5C42\u518D\u52A0\u4E00\u884C\uFF09\u3002 */\n  dynTable(layers: { count: number; ranges: [number, number][] } | null): string;\n}\n/** \u884C\u91CC\u7684\u6309\u94AE\u6309\u5230\u4E86\uFF1A\u6539\u6210\u4EC0\u4E48\uFF08\u4F11\u606F\u5BA4\u65B0\u503C + undo \u7684\u8BDD + \u8FDE\u7EED\u62D6\u5E76\u6210\u4E00\u6B65\u7684 gesture + \u8981\u4E0D\u8981\u628A\u6B63\u5728\u54CD\u7684\u505C\u6389\uFF09\u3002 */\nexport interface InspectorChange { extras: Extras; label: string; gesture?: string; silence?: boolean }\n\nexport interface PerformerPlugin {\n  readonly guid: string;\n  readonly kind: \"performer\";\n  /** \u82F1\u6587\u540D = \u6B4C\u91CC `instrument.engine` \u7684\u503C\uFF08\u7B2C\u4E00\u7248\u53C2\u6570\u91CC\u7684\u5F15\u64CE\u540D\u5C31\u662F\u5B83\uFF09\u3002 */\n  readonly name: string;\n  readonly version: number;\n  /** \u754C\u9762\u4E0A\u7684\u540D\u5B57\uFF08\u4E2D\u6587\uFF09\u3002 */\n  readonly label: string;\n  /** \u5019\u9009 chip \u7684\u60AC\u6D6E\u8BF4\u660E\uFF08\u4E00\u53E5\u8BDD\uFF1A\u662F\u8C01\u3001\u4EE3\u4EF7\u662F\u4EC0\u4E48\uFF09\u3002 */\n  readonly description: string;\n  /** \u51FA\u58F0\u65B9\u5F0F\uFF1Achunks = \u6162\u5F15\u64CE\u6309\u53E5\u51FA\u5757\uFF08\u65F6\u95F4\u7EBF\u51FA ChunkPlan\u3001worker \u5531\u3001\u5F55\u97F3\u623F\u653E\u5757\uFF09\uFF1Bnotes = \u5FEB\u5F15\u64CE\u97F3\u7B26\u8868\uFF08\u5F55\u97F3\u623F\u91CC\u5B9E\u65F6\u5408\u6210\uFF09\u3002 */\n  readonly sound: \"chunks\" | \"notes\";\n  /** \u80FD\u4E0D\u80FD\u53E0\u97F3\uFF08pad \u53E0\u952E\u3001\u4E24\u952E\u540C\u6309\u3001\u65F6\u95F4\u7EBF\u7684\u548C\u5F26\uFF09\u3002 */\n  readonly poly: boolean;\n  readonly lyrics: LyricsAbility;\n  readonly hintRange: FixedRange;\n  /** \u8BA4\u54EA\u4E9B\u8BB0\u53F7\uFF08\u4E0D\u8BA4\u7684\u8C31\u4E0A\u753B\u7070 + \u660E\u8BF4\uFF1B`test/honors.test.ts` \u6838\u300C\u8868\u8BF4\u8BA4 = \u51FA\u58F0\u771F\u53D8\u4E86\u300D\uFF09\u3002 */\n  readonly honors: readonly Mark[];\n  /** \u672C\u6765\u5C31\u8FDE\u7740\u5531\uFF08\u8FDE\u7EBF / \u4FDD\u6301\u5BF9\u5B83\u6CA1\u610F\u4E49\uFF0C\u65AD\u53E5\u7528\u547C\u5438\uFF09\u2192 \u8FD9\u4E24\u4E2A\u8BB0\u53F7\u753B\u7070\u7684\u7406\u7531\u662F \"sung\" \u800C\u4E0D\u662F \"gap\"\u3002 */\n  readonly connected: boolean;\n  /** \u529B\u5EA6\u600E\u4E48\u843D\uFF1Avelocity = \u6309\u4E0B\u90A3\u4E00\u4E0B\u7684 MIDI \u529B\u5EA6\uFF08\u6709\u529B\u5EA6\u8868\uFF09\uFF1Bgain = \u97F3\u91CF\u66F2\u7EBF\uFF08dB\uFF09\u4E58\u5728\u58F0\u97F3\u4E0A\u3002\u4E50\u5668\u9875\u6309\u8FD9\u4E2A\u6446\u54EA\u4E00\u884C\u3002 */\n  readonly dynamics: \"velocity\" | \"gain\";\n  /** \u62CD\u5B50\u8F7B\u91CD\u9884\u8BBE\u7684\u7C7B\u522B\uFF1Avoice = \u4EBA\u58F0\u4E00\u6863\uFF1Bgm = \u6309 GM \u97F3\u8272\u5BB6\u65CF / \u9F13\u4EF6\uFF08\u8981 gm \u53C2\u6570\uFF09\u3002 */\n  readonly grooveCategory: \"voice\" | \"gm\";\n  /** \u80FD\u4E0D\u80FD\u4ECE\u4F11\u606F\u5BA4\u5220\u6389\uFF08\u7B2C\u4E00\u516C\u6C11\u7684\u4E24\u4F4D\u4E0D\u5220\uFF1B\u5E26\u81EA\u5DF1\u5B57\u8282\u7684\u4E50\u5668\u80FD\u5220\uFF09\u3002 */\n  readonly removable: boolean;\n  /** \u51FA\u58F0\u53C2\u6570\u91CC\u8FD9\u4F4D\u81EA\u5DF1\u7684\u90A3\u90E8\u5206\uFF08gm / \u5206\u6BB5\u5531 / \u7740\u529B\u70B9\uFF09\uFF1B\u901A\u7528\u90E8\u5206\uFF08\u529B\u5EA6\u8868 / \u6821\u51C6 / \u4FEE\u516B\u5EA6 / \u94FE / \u62CD\u5B50\u8F7B\u91CD\uFF09\u80F6\u6C34\u586B\u3002 */\n  info(ctx: InfoCtx): Pick<PerformerInfo, \"gm\" | \"chunk\" | \"hitSec\" | \"singOpt\">;\n  /** \u51FA\u58F0\u524D\u51C6\u5907\uFF1A\u5E93\u8FDB\u5F55\u97F3\u623F / \u5143\u97F3\u8868\u3002\u629B\u9519 = \u8FD9\u4F4D\u51FA\u4E0D\u4E86\u58F0\uFF08\u80F6\u6C34\u62A5\u51FA\u6765\u3001\u8FD9\u4E2A\u58F0\u90E8\u4E0D\u51FA\u58F0\u3001\u5176\u4F59\u7167\u653E\uFF09\u3002 */\n  prepare(ctx: PrepareCtx): Promise<void>;\n  /** notes \u6A21\u5F0F\uFF1A\u97F3\u7B26\u8868 \u2192 \u8FD9\u4F4D\u7684\u8F68\uFF08chunks \u6A21\u5F0F\u6CA1\u6709\u8FD9\u4E00\u6B65\uFF0C\u65F6\u95F4\u7EBF\u81EA\u5DF1\u51FA\u5757\uFF09\u3002 */\n  track?(ctx: TrackCtx): TrackResult;\n  /** \u8C31\u4E0A\u600E\u4E48\u753B\uFF08\u6CA1\u6709 = \u666E\u901A\u7B26\u5934\u3001\u666E\u901A\u8C31\uFF09\u3002 */\n  notation?(ctx: RoleCtx): Notation;\n  /** \u6309\u952E\u8BD5\u542C\u7528\u8C01\u51FA\u58F0\uFF08\u6CA1\u6709 = \u8FD9\u4F4D\u4E0D\u80FD\u8BD5\u542C\uFF09\u3002 */\n  audition?(ctx: AuditionCtx): AuditionTarget | null;\n  /** \u4E50\u5668\u9875\u300C\u600E\u4E48\u6F14\u300D\u91CC\u8FD9\u4F4D\u81EA\u5DF1\u7684\u53C2\u6570\u884C\uFF08\u901A\u7528\u7684\u2014\u2014\u54CD\u5EA6 / \u97F3\u548C\u97F3\u4E4B\u95F4 / \u529B\u5EA6\u8BB0\u53F7 dB \u8868 / \u54FC\u7684\u5B57\u2014\u2014\u5BBF\u4E3B\u6309\u80FD\u529B\u5B57\u6BB5\u6446\uFF09\u3002 */\n  inspector?(ctx: InspectorCtx): InspectorRow[];\n  /** \u81EA\u5DF1\u90A3\u51E0\u884C\u7684\u6309\u94AE\u6309\u5230\u4E86\uFF08data-v\uFF09\uFF1A\u6539\u6210\u4EC0\u4E48\uFF1B\u4E0D\u8BA4\u8BC6 = null\u3002 */\n  onInspector?(v: string, ctx: InspectorCtx): InspectorChange | null;\n}\n\nconst byName = new Map<string, PerformerPlugin>();\nconst byGuid = new Map<string, PerformerPlugin>();\nexport function registerPerformer(p: PerformerPlugin): PerformerPlugin {\n  if (byName.has(p.name) || byGuid.has(p.guid)) throw new Error(`performer plugin registered twice: ${p.name} / ${p.guid}`);\n  byName.set(p.name, p); byGuid.set(p.guid, p);\n  return p;\n}\n/** \u6309\u82F1\u6587\u540D\uFF08= \u6B4C\u91CC\u7684 engine \u5B57\u6BB5\uFF09\u627E\u63D2\u4EF6\uFF1B\u4E0D\u8BA4\u8BC6 = null\u3002 */\nexport function performerOf(engine: string | null | undefined): PerformerPlugin | null { return (engine && byName.get(engine)) || null; }\nexport function performerByGuid(guid: string): PerformerPlugin | null { return byGuid.get(guid) ?? null; }\nexport function performers(): readonly PerformerPlugin[] { return [...byName.values()]; }\n/** \u5730\u5740\uFF1A`performer:<name>@<version>`\uFF08ADR-0004 \u00A72.2\uFF09\u3002 */\nexport const addressOf = (p: PerformerPlugin): string => `${p.kind}:${p.name}@${p.version}`;\n", "// tsukuyomi.ts \u2014\u2014 \u6F14\u594F\u8005\u63D2\u4EF6\uFF1A\u5C0F\u6708\u76F8\uFF08\u3064\u304F\u3088\u307F\u3061\u3083\u3093\uFF09\u5B8C\u6574\u7248 = piper\uFF08\u65F6\u957F\u63A5\u7BA1\uFF09+ WORLD\uFF0C\u6309\u53E5\u51FA\u5757\uFF08\u6162\u5F15\u64CE\uFF09\u3002created 2026-10-14 by Claude Fable 5.1\uFF08ADR-0004\uFF09\n//   \u5979\u662F\u7B2C\u4E00\u516C\u6C11\uFF08\u9ED8\u8BA4\u6F14\u594F\u8005\u3001UX \u4E3A\u5979\u670D\u52A1\uFF09\uFF0C\u4F46\u5728\u4EE3\u7801\u91CC\u53EA\u662F\u8FD9\u5F20\u8868\u91CC\u7684\u4E00\u9879\uFF1A\u65F6\u95F4\u7EBF / \u5F55\u97F3\u623F / \u80F6\u6C34\u53EA\u770B sound / poly / lyrics\u2026\uFF0C\u4E0D\u770B\u540D\u5B57\u3002\n//   \u5531\u6CD5\u6838\u5FC3\u5728 src/singer/sing-core.mjs\uFF1B\u5757\u7684\u5185\u5BB9\u952E / \u5206\u6BB5\u5531\u5728 src/engine/timeline.ts\uFF08chunks \u6A21\u5F0F\u7531\u65F6\u95F4\u7EBF\u7EDF\u4E00\u51FA\u5757\uFF0C\u63D2\u4EF6\u53EA\u62A5\u80FD\u529B + \u5206\u6BB5\u5531\u7C92\u5EA6\uFF09\u3002\n//   \u6309\u952E\u8BD5\u542C = \u5143\u97F3\u8868\uFF08v0.10.43\uFF1Buser\u300C\u6708\u8BFB\u9884\u89C8\u5E94\u8BE5\u662F\u6BCF\u79CD\u54FC\u6CD5\u53EA\u6709\u4E00\u4E2Acache\u300D\uFF09\uFF0C\u64AD\u653E\u7167\u65E7\u5B8C\u5168\u7248\u3002\nimport { registerPerformer } from \"./registry.ts\";\nimport { activeSingChunk, activeSingCore, withSingChunk, withSingCore, roleName, type SingCoreKey } from \"../format/project.ts\";\nimport { TSUKUYOMI_DEFAULTS } from \"../format/performance.ts\";\n\n/** \u5979\u7684\u97F3\u57DF\uFF08A3\u2013E5\uFF09\uFF1Apad \u952E\u5E95\u90E8\u7684\u63D0\u793A\uFF1B\u5143\u97F3\u7248\u540C\u3002 */\nexport const TSUKUYOMI_RANGE = { lo: 57, hi: 76, who: \"\u5C0F\u6708\u76F8\" } as const;\n\n/** \u4E50\u5668\u9875\u300C\u9AD8\u7EA7\uFF1A\u5531\u6CD5\u6838\u5FC3\u7684\u65CB\u94AE\u300D\uFF08\u5B58\u8FDB\u5019\u9009\u7684 defaults\uFF0Cby value\u3001\u8D70 undo\uFF1B2026-10-15 user\u300C\u9F50\u5E73\u548C\u5176\u4ED6\u7684\u4E5F\u90FD\u653E\u5728\u9AD8\u7EA7\u8BBE\u7F6E\u91CC\u9762\u53EF\u4EE5\u6301\u4E45\u5316\u300D\uFF09\u3002why = \u7269\u7406\u610F\u4E49\uFF08\u63A2\u9488 ai-docs/20261013-dango-c10-pop-probe.md \u00A75 / \u00A76\uFF09\u3002 */\nexport const SING_CORE_ROWS: { key: SingCoreKey; label: string; values: number[]; names?: Record<number, string>; why: string }[] = [\n  { key: \"level\", label: \"\u9F50\u5E73\", values: [0, 0.4, 0.8], names: { 0: \"\u5173\" }, why: \"\u6BCF\u4E2A\u5B57\u7684\u54CD\u5EA6\u5F80\u6574\u53E5\u7684\u4E2D\u4F4D\u6570\u62C9\u51E0\u6210\uFF1A\u5173 = \u7167\u5FF5\u7684\u65F6\u5019\u81EA\u5DF1\u7684\u8F7B\u91CD\uFF08\u5B57\u548C\u5B57\u4E4B\u95F4\u54CD\u5EA6\u4E0D\u53EF\u63A7\uFF09\uFF1B0.8 = \u62C9\u516B\u6210\uFF08\u9ED8\u8BA4\uFF1B2026-10-14 \u5230 10-17 \u9ED8\u8BA4\u5173\u8FC7\uFF09\u3002\u56E2\u5B50 C \u6BB5\u7B2C 10 \u5C0F\u8282\u300C\u305D\u300D\u7684\u7834\u97F3\u662F\u9F50\u5E73\u300C\u6BCF\u5B57\u91CD\u8D77\u300D\u5728\u5B57\u7684\u8FB9\u754C\u4E0A\u8DF3\u51FA\u6765\u7684\u53F0\u9636\uFF0C\u300C\u8FDE\u7EED\u300D\u4E0D\u8DF3\" },\n  { key: \"levelContinuous\", label: \"\u9F50\u5E73\u8FC7\u6E21\", values: [0, 1], names: { 0: \"\u6BCF\u5B57\u91CD\u8D77\", 1: \"\u8FDE\u7EED\" }, why: \"\u9F50\u5E73\u5F00\u7740\u65F6\u589E\u76CA\u600E\u4E48\u4ECE\u4E00\u4E2A\u5B57\u6362\u5230\u4E0B\u4E00\u4E2A\u5B57\uFF1A\u6BCF\u5B57\u91CD\u8D77 = \u5728\u6BCF\u4E2A\u5B57\u7684\u5143\u97F3\u8D77\u70B9\u4ECE 0 \u8D77\u300130 ms \u5185\u722C\u5230\u8FD9\u4E2A\u5B57\u7684\u76EE\u6807\uFF0C\u8F85\u97F3\u4E0D\u52A0\uFF1B\u8FDE\u7EED = \u4ECE\u524D\u4E00\u4E2A\u5B57\u7684\u589E\u76CA\u8D77\uFF0C\u7ECF\u8FC7\u8F85\u97F3\u5230\u5143\u97F3\u8D77\u70B9\u540E 30 ms \u5E73\u6ED1\u8FC7\u6E21\u5230\u8FD9\u4E2A\u5B57\u7684\" },\n  { key: \"levelMaxDb\", label: \"\u9F50\u5E73\u4E0A\u9650\", values: [6, 12], names: { 6: \"6 dB\", 12: \"12 dB\" }, why: \"\u9F50\u5E73\u6700\u591A\u628A\u4E00\u4E2A\u5B57\u62C9\u51E0 dB\" },\n  { key: \"cleanMax\", label: \"\u501F\u5143\u97F3\u95E8\u69DB\", values: [0.3, 0.4, 0.5], why: \"\u4E00\u4E2A\u5B57\u81EA\u5DF1\u6700\u5E72\u51C0\u90A3\u4E09\u5206\u4E4B\u4E00\u5E27\u7684\u6742\u5EA6\u8D85\u8FC7\u8FD9\u4E2A\u6570 = \u5F53\u5B83\u662F\u6C14\u58F0\u5FF5\u7684\uFF0C\u62FF\u540C\u4E00\u53E5\u91CC\u522B\u7684\u5E72\u51C0\u7684\u540C\u5143\u97F3\u6765\u5531\uFF08\u300C\u305D\u300D\u662F 0.34\uFF09\" },\n  { key: \"breath\", label: \"\u6C14\u606F\", values: [0, 0.5, 1], names: { 0: \"\u5B9E\u58F0\", 1: \"\u7167\u5FF5\u7684\" }, why: \"\u5408\u6210\u524D\u628A\u6BCF\u5E27\u6BCF\u4E2A\u9891\u6BB5\u7684\u6742\u5EA6\u538B\u5230\u8FD9\u4E2A\u5143\u97F3\u6700\u5E72\u51C0\u90A3\u51E0\u5E27\u7684\u7A0B\u5EA6\uFF1A0 = \u5168\u538B\u6210\u5B9E\u58F0\uFF0C1 = \u7167 piper \u5FF5\u51FA\u6765\u7684\u7559\u7740\" },\n];\n\nexport const tsukuyomi = registerPerformer({\n  guid: \"6f2c9a1e-3b7d-4e58-9c0a-2d5b8f1e7a41\", kind: \"performer\", name: \"tsukuyomi\", version: 1, label: \"\u5C0F\u6708\u76F8\",\n  description: \"\u5C0F\u6708\u76F8\u672C\u4EBA\uFF08\u3064\u304F\u3088\u307F\u3061\u3083\u3093\uFF1B\u7B2C\u4E00\u6B21\u8981\u52A0\u8F7D\u7EA6 65 MB\uFF09\",\n  sound: \"chunks\", poly: false, lyrics: \"words\", hintRange: TSUKUYOMI_RANGE,\n  // \u8DF3\u97F3 / \u91CD\u97F3 / \u5F3A\u97F3 / \u547C\u5438 / \u6C14\u58F0 / \u51FA\u58F0\u7684\u6362\u6C14 = \u5531\u6CD5\u6838\u5FC3\uFF08lab-score \u5E26\u8FDB\u5531\u8C31\uFF09\uFF1B\u529B\u5EA6\u7C7B = \u97F3\u91CF\u66F2\u7EBF\uFF1B\u8FDE\u7EBF / \u4FDD\u6301\u4E0D\u8BA4\uFF08\u672C\u6765\u5C31\u8FDE\u7740\u5531\uFF0C\u8FDE\u65AD\u7B2C 3 \u6B65\uFF09\uFF1B\u7436\u97F3 = \u5355\u58F0\u5531\u4E0D\u4E86\u548C\u5F26\n  honors: [\"staccato\", \"accent\", \"marcato\", \"sfz\", \"fp\", \"breath\", \"swellGrow\", \"swellFade\", \"stress\", \"unstress\", \"ghost\", \"whisper\", \"inhale\"],\n  connected: true, dynamics: \"gain\", grooveCategory: \"voice\", removable: false,\n  info: ({ extras, role }) => ({ gm: null, chunk: activeSingChunk(extras, role), singOpt: activeSingCore(extras, role) }),   // \u65CB\u94AE\u6309\u503C\u5728\u5019\u9009\u91CC\uFF08\u4E50\u5668\u9875\u300C\u9AD8\u7EA7\u300D\uFF09\u2192 \u8FDB\u5757\u7684\u5185\u5BB9\u952E\n  prepare: async () => { /* \u5F15\u64CE\u9884\u70ED / \u6A21\u578B\u5305\u4E0B\u8F7D\u5728\u5DE5\u4F5C\u9053\u91CC\u6309\u9700\u505A\uFF08singer.warm / \u7B2C\u4E00\u6B21\u5531\uFF09\uFF0C\u4E0D\u5728\u8FD9\u91CC */ },\n  audition: ({ kana, dyn }) => ({ inst: { kind: \"vowel\", kana }, key: (m) => m, vel: 1, gainDb: dyn.dB }),\n  /** \u4E50\u5668\u9875\u91CC\u5979\u81EA\u5DF1\u7684\u884C\uFF082026-10-15 \u5200 5 \u4E4B\u4E00\uFF0C\u539F main.ts drawInst \u91CC\u7684\u90A3\u4E24\u6BB5\u539F\u6837\u642C\u6765\uFF09\uFF1A\u300C\u9AD8\u7EA7\u300D\u6298\u53E0\u91CC\u7684\u5531\u6CD5\u6838\u5FC3\u65CB\u94AE + \u672B\u5C3E\u7684\u5206\u6BB5\u5531\u3002 */\n  inspector: ({ extras, role, chip }) => {\n    const cur = activeSingCore(extras, role), sc = activeSingChunk(extras, role);\n    return [\n      ...SING_CORE_ROWS.map((x) => ({ label: x.label, control: x.values.map((v) => chip(`core:${x.key}:${v}`, `${x.names?.[v] ?? v}${v === TSUKUYOMI_DEFAULTS[x.key] ? \"\uFF08\u9ED8\u8BA4\uFF09\" : \"\"}`, cur[x.key] === v, \"\u6539\u4E86\u7528\u5230\u7684\u53E5\u5B50\u4F1A\u91CD\u5531\uFF1B\u5B58\u8FDB\u6B4C\u91CC\u3001\u80FD\u64A4\u9500\")).join(\"\"), note: x.why, place: \"adv\" as const })),\n      // \u5206\u6BB5\u5531\uFF08\u8FD9\u4F4D\u6F14\u594F\u8005\u7684\u5C5E\u6027\uFF1Buser\u300C\u5F00\u5173\u662F\u6B4C\u624B\u7684\u5C5E\u6027\uFF0C\u53EF\u4EE5\u6709\u4E0D\u540C\u7684\u7C92\u5EA6\u300D\uFF09\uFF1A\u957F\u6B4C\u4E00\u53E3\u6C14\u5531\u5B8C\u4F1A\u6491\u7206 iPad \u7684\u5185\u5B58\uFF1B\u5206\u6BB5 = \u4E00\u6BB5\u5531\u5B8C\u5C31\u653E\u6389\uFF0C\u91CD\u590D\u7684\u6BB5 / \u6CA1\u6539\u7684\u53E5\u5B50\u76F4\u63A5\u590D\u7528\n      { label: \"\u5206\u6BB5\u5531\", control: (([[\"phrase\", \"\u6BCF\u53E5\", \"\u5728\u4F11\u6B62\u5904\u5207\uFF08\u4F11\u6B62 \u2265 0.25 \u79D2\uFF09\uFF1A\u5185\u5B58\u6700\u7701\uFF0C\u6539\u4E00\u53E5\u53EA\u91CD\u5531\u90A3\u4E00\u53E5\"], [\"sheet\", \"\u6BCF\u5F20\u7EB8\", \"\u4E00\u5F20\u7EB8\u4E00\u6BB5\"], [\"whole\", \"\u4E00\u6574\u9996\", \"\u4E00\u53E3\u6C14\u5531\u5B8C\uFF08\u4EE5\u524D\u7684\u5531\u6CD5\uFF1B\u957F\u6B4C\u5728 iPad \u4E0A\u53EF\u80FD\u5185\u5B58\u4E0D\u591F\uFF09\"]] as const)).map(([v, l, t]) => chip(`chunk:${v}`, l, sc === v, t)).join(\"\"),\n        note: sc === \"whole\" ? \"\u4E00\u53E3\u6C14\u5531\u5B8C\uFF1A\u53E5\u548C\u53E5\u4E4B\u95F4\u5531\u6CD5\u6700\u8FDE\u8D2F\uFF0C\u4F46\u957F\u6B4C\u5728 iPad \u4E0A\u53EF\u80FD\u5185\u5B58\u4E0D\u591F\" : \"\u5206\u6BB5\u5531\uFF1A\u4E00\u6BB5\u5531\u5B8C\u5C31\u653E\u6389\uFF0C\u91CD\u590D\u7684\u6BB5 / \u6CA1\u6539\u7684\u53E5\u5B50\u76F4\u63A5\u62FF\u4E0A\u6B21\u7684\uFF1B\u6BB5\u548C\u6BB5\u4E4B\u95F4\u5207\u5728\u4F11\u6B62 / \u7EB8\u754C\uFF0C\u6574\u9996\u6700\u540E\u7EDF\u4E00\u97F3\u91CF\", place: \"tail\" as const },\n    ];\n  },\n  onInspector: (v, { extras, role, hum }) => {\n    const rn = roleName(extras, role);\n    if (v.startsWith(\"core:\")) { const [, key, val] = v.split(\":\"), x = SING_CORE_ROWS.find((e) => e.key === key), n = Number(val); return x ? { extras: withSingCore(extras, role, x.key, n, hum), label: `\u300C${rn}\u300D${x.label}\uFF1A${x.names?.[n] ?? n}` } : null; }\n    if (v.startsWith(\"chunk:\")) { const c = v.slice(6) as \"phrase\" | \"sheet\" | \"whole\"; return { extras: withSingChunk(extras, role, c, hum), label: `\u300C${rn}\u300D\u5206\u6BB5\u5531\uFF1A${c === \"phrase\" ? \"\u6BCF\u53E5\" : c === \"sheet\" ? \"\u6BCF\u5F20\u7EB8\" : \"\u4E00\u6574\u9996\"}` }; }\n    return null;\n  },\n});\n", "// sf-key.ts \u2014\u2014 \u8C31\u4E0A\u5199\u7684\u97F3 \u2192 SoundFont \u8BE5\u6572\u54EA\u4E2A\u952E\uFF08\u7EAF\u51FD\u6570\uFF0C\u79BB\u7EBF\u6E32\u67D3\u548C\u952E\u76D8\u8BD5\u542C\u5171\u7528\uFF09\u3002created 2026-10-08 by Claude Opus 5.5\n// \u4E09\u79CD\u60C5\u51B5\uFF08\u6F14\u594F\u8005 by value \u5E26\u7740\u7684\uFF0C\u5951\u7EA6 InstrumentV2 soundfont \u7684 note / sfx + \u5019\u9009\u7684 transpose\uFF09\uFF1A\n//   \u2460 \u56FA\u5B9A\u952E\uFF08note\uFF09\uFF1A\u9F13\u4EF6\uFF1B\u97F3\u6548\u9ED8\u8BA4\u4E5F\u662F\u2014\u2014\u6BCF\u4E2A\u97F3\u90FD\u6572\u539F\u901F\u952E\uFF08user 2026-10-08\u300C\u56FA\u5B9A\u539F\u901F\u540C\u610F\uFF0C\u9ED8\u8BA4\u5F00\u3002\u78B0\u5230\u732B\u53EB\u6B4C\u624D\u5173\u300D\uFF09\u3002\n//   \u2461 \u97F3\u9AD8\u5BF9\u9F50\uFF08sfx.align\uFF09\uFF1A\u97F3\u6548\u5173\u6389\u56FA\u5B9A\u539F\u901F\u3001\u60F3\u7528\u5B83\u5F39\u65CB\u5F8B\u65F6\uFF0C\u6309\u5199\u7684\u97F3\u53CD\u7B97\u952E\uFF0C\u8BA9\u8C31\u4E0A\u7684\u97F3 = \u542C\u5230\u7684\u97F3\n//      \uFF08user\u300C\u78B0\u5230\u732B\u53EB\u6B4C\u624D\u5173\uFF0C\u4F46\u8FD9\u4E2A\u65F6\u5019\u4E5F\u8BB8\u9700\u8981\u97F3\u9AD8\u4FEE\u6B63\u300D\uFF09\u3002GS \u7684\u97F3\u6548\u6BCF\u5347\u4E00\u4E2A\u952E\u97F3\u9AD8\u53EA\u5347 centsPerKey \u97F3\u5206\uFF08\u591A\u4E3A 50\uFF09\uFF0C\n//      \u6240\u4EE5\u662F\u659C\u7387 100 / centsPerKey \u7684\u76F4\u7EBF\uFF0C\u4E0D\u662F\u5E73\u79FB\uFF1A\u952E = \u539F\u901F\u952E + (\u5199\u7684\u97F3 \u2212 \u539F\u901F\u65F6\u542C\u5230\u7684\u97F3\u9AD8) \u00D7 100 / centsPerKey\u3002\u6570\u636E = \u4ED3\u9F20 v8 \u7684 sampleKey\uFF08TSF \u5B9E\u6D4B\uFF09\u3002\n//   \u2462 \u5176\u4F59\uFF1A\u5199\u7684\u97F3 + \u4FEE\u516B\u5EA6 / \u79FB\u8C03\uFF08transpose\uFF0C\u9ED8\u8BA4 0\uFF09\u3002\nexport interface SfxInfo { key: number; midi?: number; centsPerKey?: number; align?: boolean }\nexport interface SfKeyInst { note?: number; sfx?: SfxInfo }\n\n/** \u5199\u7684\u97F3\uFF08MIDI\uFF09\u2192 \u6572\u7684\u952E\uFF080\u2013127\uFF09\u3002 */\nexport function sfKey(written: number, inst: SfKeyInst, transpose = 0): number {\n  if (inst.note !== undefined) return inst.note;\n  const s = inst.sfx, w = written + transpose;\n  const k = s?.align && s.midi !== undefined && s.centsPerKey ? Math.round(s.key + ((w - s.midi) * 100) / s.centsPerKey) : w;\n  return Math.max(0, Math.min(127, k));\n}\n/** \u8FD9\u4E2A\u97F3\u6548\u80FD\u4E0D\u80FD\u300C\u97F3\u9AD8\u5BF9\u9F50\u300D\uFF1A\u539F\u901F\u65F6\u6709\u542C\u5F97\u51FA\u7684\u97F3\u9AD8\uFF08\u5BBD\u5E26\u566A\u58F0\u6CA1\u6709\uFF09\u3002 */\nexport const canAlign = (s: SfxInfo | undefined): boolean => !!s && s.midi !== undefined && !!s.centsPerKey;\n", "// timeline.ts \u2014\u2014 \u8C31 \u2192 \u65F6\u95F4\u7EBF\uFF08\u79D2\uFF09\uFF1A\u6BCF\u4E2A\u58F0\u90E8\u7684\u97F3\u7B26\u8868 / \u5757\u6E05\u5355 / \u8868\u60C5\u66F2\u7EBF\uFF0C\u64AD\u653E\u8303\u56F4\uFF0C\u7EB8\u7684\u79D2\u533A\u95F4\uFF0C\u5149\u6807 \u2194 \u79D2\u3002\u7EAF\u51FD\u6570\uFF08node \u91CC\u53EF\u6D4B\uFF09\u3002\n// created 2026-10-09 by Claude Fable 5.1\uFF08\u63D0\u6848 ai-docs/20261009-realtime-preview-engine-proposal.md \u00A73\uFF1Buser\u300C\u6240\u4EE5\u5C31\u548Cmidi\u5DEE\u4E0D\u591A\u5BF9\u5427\u300D= \u5BF9\uFF1A\n//   \u8C31\u662F tick + \u901F\u5EA6\u8868 + \u53CD\u590D + \u7F16\u6392\uFF0C\u8FD9\u91CC\u4E00\u6B21\u89E3\u6210\u79D2\uFF0Cseek / \u5FAA\u73AF / \u6392\u7A0B\u5C31\u662F\u7B97\u672F\uFF0C\u4E09\u4E2A\u5F15\u64CE\u5171\u4E00\u4E2A\u949F\uFF09\u3002\u6D3E\u751F\u7269\uFF0C\u6539\u8C31\u91CD\u7B97\uFF0C\u4E0D\u8FDB\u6587\u4EF6\u3002\n// \u6708\u8BFB\u7684\u5757\uFF1A\u53EA\u5728\u591F\u957F\u7684\u4F11\u6B62\u5904\u5207\uFF0C**\u4E0D\u5728\u7EB8\u754C\u5207**\uFF08user\u300C\u66F2\u6BB5\u7684\u8FB9\u754C\u7B97\u53E5\u5B50\u5427\u2026\u4E5F\u8BB8\u8FD8\u662F\u540C\u610F\u53EF\u4EE5\u8DE8\u66F2\u6BB5\u53E5\u5B50\u3002cache\u5E94\u8BE5\u4E0D\u4F24\uFF0C\u542C\u4F60\u7684\u8BD5\u8BD5\u300D\uFF1B\n//   \u5F31\u8D77 / \u8FDE\u97F3\u7EBF\u8DE8\u6BB5\u7684\u4E00\u53E5\u62E6\u8170\u5207 = \u4E2D\u95F4\u591A\u4E00\u9053\u63A5\u7F1D\uFF09\uFF1B\u7C92\u5EA6\u4ECD\u662F\u6B4C\u624B\u7684\u5C5E\u6027\uFF08\u53E5 / \u66F2\u6BB5 / \u4E00\u6574\u9996\uFF09\u3002\u5757\u7684\u5185\u5BB9\u952E\u91CC\u6CA1\u6709\u4F4D\u7F6E \u2192 \u6B4C\u8BCD\u79FB\u4F4D\u518D\u590D\u539F\u7167\u6837\u547D\u4E2D\u3002\nimport { type Token, type Song, type PartDef, type PaperSeg, type TempoMap, type Hum, type NoteTok, flattenPart, timeline, effectivePitch, allPitches, paperTicks, tempoOwner } from \"../score/song.ts\";\nimport { midiOf } from \"../score/pitch.ts\";\nimport { MELISMA_MARK } from \"../score/lyrics.ts\";\nimport { scriptLang } from \"../score/lang.ts\";\nimport { gainSegments, noteEnd, noteVelocities, lightMarks, type PerfSpec } from \"../score/perform.ts\";\nimport { grooveWeights, grooveMapOf, followOf, timeMapOf, type GrooveStyle } from \"../score/groove.ts\";\nimport { toLabScore, singChunks, type LabScore, type SingLang, type SingChunkMode } from \"../score/lab-score.ts\";\nimport { playSegments } from \"../score/repeats.ts\";\nimport { sfKey, type SfxInfo } from \"../gm/sf-key.ts\";\nimport type { SingMark } from \"../format/performance.ts\";\nimport type { FxV2 } from \"../format/contract.ts\";\nimport type { TrackSpec, GainSeg } from \"./studio.ts\";\nimport type { PerformerPlugin } from \"../performers/registry.ts\";   // \u53EA\u62FF\u7C7B\u578B\uFF08ADR-0004\uFF1A\u65F6\u95F4\u7EBF\u95EE\u63D2\u4EF6\u80FD\u4EC0\u4E48\uFF0C\u4E0D\u770B\u5F15\u64CE\u540D\uFF09\n\n/** \u6708\u8BFB\u6838\u5FC3 OPT.leadIn\uFF08sing-core.mjs\uFF09\uFF1A\u7B2C\u4E00\u4E2A\u5143\u97F3\u524D\u7559\u7684\u79D2\u6570\uFF1B\u5757\u7684\u7B2C 0 \u4E2A\u91C7\u6837 = \u7B2C\u4E00\u4E2A\u97F3\u7684\u65F6\u523B \u2212 \u5B83\u3002 */\nexport const LEAD_IN = 0.5;\n/** \u5531\u6CD5\u6838\u5FC3 raw \u8F93\u51FA\u7684\u8865\u507F\u589E\u76CA\uFF1A\u5200 0 \u91CF\u7684 raw \u5CF0\u503C \u2248 0.42\uFF08\u3046\u3055\u304E 0.419 / \u56E3\u5B50 0.412\uFF09\u2192 \u4E58\u5230 0.89\uFF08\u539F\u6574\u9996\u5F52\u4E00\u5316\u7684\u76EE\u6807\uFF1B\u6309\u53E5\u51FA\u5757\u540E\u4E0D\u518D\u6574\u9996\u5F52\u4E00\u5316\uFF0C\u53E5\u4E0E\u53E5\u7684\u5F3A\u5F31\u7167\u539F\u6837\uFF09\u3002 */\nexport const SUNG_GAIN = 0.89 / 0.42;\n/** \u5531\u6CD5\u6838\u5FC3 finish \u7684\u5C3E\u5DF4\uFF08\u79D2\uFF09\uFF1A\u5757\u7684\u58F0\u97F3\u6BD4\u6700\u540E\u4E00\u4E2A\u97F3\u957F\u8FD9\u4E48\u591A\u3002 */\nexport const SUNG_TAIL = 0.6;\n/** \u4ECE\u5149\u6807\u653E\uFF1A\u63D0\u524D\u8FD9\u4E48\u591A\u8D77\u653E\uFF0C\u7B2C\u4E00\u4E2A\u5B57\u7684\u8F85\u97F3\uFF08\u5728\u5143\u97F3\u524D\uFF09\u4E0D\u88AB\u5207\u6389\u3002 */\nexport const PRE_ROLL = 0.1;\n\nexport type Engine = \"tsukuyomi\" | \"vowel-sampler\" | \"soundfont\" | \"unknown\";\n/** \u4E00\u4E2A\u58F0\u90E8\u4E0A\u573A\u90A3\u4F4D\u7684\u51FA\u58F0\u53C2\u6570\uFF08\u4E3B\u7EBF\u7A0B\u4ECE\u4F11\u606F\u5BA4\u67E5\u597D\u9012\u8FDB\u6765\uFF1B\u65F6\u95F4\u7EBF\u4E0D\u78B0 Extras\uFF09\u3002 */\nexport interface PerformerInfo {\n  /** \u5F15\u64CE\u540D\uFF08= \u63D2\u4EF6\u82F1\u6587\u540D\uFF1B\u8BCA\u65AD / \u8BB0\u53F7\u89E3\u8BFB\u8868 perform.ts \u7528\uFF09\u3002 */\n  engine: Engine;\n  /** \u4E0A\u573A\u90A3\u4F4D\u7684\u63D2\u4EF6\uFF1Bnull = \u8FD8\u6CA1\u6709\u4EBA\u4E0A\u573A\uFF08\u8BA4\u4E0D\u51FA\u7684\u5F15\u64CE\u4E5F\u7B97\uFF1BADR-0004\uFF09\u3002\u51FA\u58F0\u65B9\u5F0F / \u53E0\u97F3 / \u5531\u4E0D\u5531\u5B57\u90FD\u95EE\u5B83\u3002 */\n  plugin: PerformerPlugin | null;\n  spec: PerfSpec & { gapSec: number; sing: Record<string, SingMark | null> };\n  velocity: number;\n  transpose: number;\n  gm: { sha: string; presetIndex: number; note?: number; sfx?: SfxInfo } | null;\n  chunk: SingChunkMode;\n  /** \u62CD\u5B50\u8F7B\u91CD\uFF1A\u8FD9\u4F4D\u8DDF\u591A\u5C11\uFF08\u6309\u4E50\u5668\u7C7B\u522B\uFF0Csrc/score/groove.ts followOf\uFF09\u3002 */\n  follow: (s: GrooveStyle) => number;\n  /** \u8DDF\u7740\u6F14\u594F\u8005\u8D70\u7684\u6548\u679C\u94FE\uFF08CandidateV2.chain\uFF1B\u5200 4\uFF09\u3002 */\n  chain?: FxV2[];\n  /** \u7740\u529B\u70B9\uFF08v0.10.27\uFF1B\u9F13 / \u97F3\u6548\uFF09\uFF1A\u6572\u8FD9\u4E2A\u952E\u65F6\u91C7\u6837\u5F00\u5934\u5230\u300C\u7838\u4E0B\u53BB\u90A3\u4E00\u4E0B\u300D\u51E0\u79D2\u2014\u2014\u5F55\u97F3\u623F\u63D0\u524D\u8FD9\u4E48\u591A\u5F00\u59CB\u653E\uFF0C\u7838\u5728\u5199\u7684\u90A3\u4E00\u62CD\u4E0A\uFF08\u53CD\u5411\u9572 1.4 s\uFF09\u3002\n   *  \u6709\u97F3\u9AD8\u7684\u4E50\u5668\u4E0D\u7ED9\uFF08\u4E0D\u632A\uFF09\u3002src/gm/percussion.ts\uFF1B\u8BBE\u8BA1\u8D26 ai-docs/20261010-shared-staff-percussion-design.md \u00A73\u3002 */\n  hitSec?: (key: number) => number;\n  /** \u8FD9\u4F4D\u81EA\u5DF1\u7684\u5531\u6CD5\u53C2\u6570\uFF08\u5C0F\u6708\u76F8\uFF1A\u5019\u9009 defaults \u91CC\u7684\u65CB\u94AE\uFF0C\u4E50\u5668\u9875\u300C\u9AD8\u7EA7\u300D\uFF1B2026-10-15\uFF09\uFF1A\u76D6\u5728 TimelineInput.singOpt \u4E0A\uFF0C\u4E00\u8D77\u8FDB\u5757\u7684\u5185\u5BB9\u952E\u3002 */\n  singOpt?: Record<string, unknown>;\n}\nexport interface TimelineInput {\n  song: Song;\n  /** \u653E\u7684\u987A\u5E8F\uFF08\u7F16\u6392\uFF1B\u672C\u6BB5 = \u53EA\u8FD9\u4E00\u5F20\uFF09\u3002 */\n  order: string[];\n  /** \u51FA\u58F0\u7684\u58F0\u90E8\uFF08\u9759\u97F3 / \u72EC\u594F\u5DF2\u7ECF\u7B5B\u8FC7\uFF09\u3002 */\n  parts: PartDef[];\n  info: (part: PartDef) => PerformerInfo;\n  hum: Hum;\n  /** \u6708\u8BFB\u6838\u5FC3\u7684\u54FC\u7684\u53C2\u6570\uFF08main.ts humOpt\uFF09\uFF1B\u8FDB\u5185\u5BB9\u952E\u3002 */\n  singOpt: Record<string, unknown>;\n}\n/** \u6708\u8BFB\u8981\u5531\u7684\u4E00\u5757\uFF08\u4E3B\u7EBF\u7A0B\u62FF\u53BB\u8BA9 worker \u5531\u3001\u6309 key \u5582\u7ED9\u5F55\u97F3\u623F\uFF09\u3002 */\nexport interface ChunkPlan { part: string; key: string; score: LabScore; lang: SingLang; /** \u7ED9\u5531\u6CD5\u6838\u5FC3\u7684 opt\uFF08\u6B4C\u7EA7\u7684 + \u8FD9\u4F4D\u81EA\u5DF1\u7684\uFF09\uFF1B\u5757\u7684\u952E\u91CC\u4E5F\u6709\u5B83\u3002 */ opt: Record<string, unknown>; t0: number; dur: number; /** \u5531\u7684\u6700\u540E\u4E00\u4E2A\u97F3\u7ED3\u675F\u7684\u79D2\uFF08\u4E0D\u542B\u6536\u5C3E\u4F59\u97F3\uFF09\u3002 */ end: number; /** token id \u2192 \u8FD9\u53E5\u91CC\u5531\u6210\u7B2C\u51E0\u6761\uFF08\u6309\u952E\u8BD5\u542C\u300C\u53EA\u5531\u8FD9\u4E2A\u5B57\u300D\u7528\uFF09 */ entryOf: Map<number, number> }\nexport interface PaperSpan { paper: PaperSeg; tick0: number; t0: number; t1: number }\nexport interface Timeline {\n  tracks: TrackSpec[];\n  range: { from: number; to: number };\n  /** \u8C31\u7684\u603B\u957F\uFF08\u79D2\uFF1B\u4E0D\u542B\u6708\u8BFB\u7684\u63D0\u524D\u91CF / \u5C3E\u5DF4\uFF09\u3002 */\n  total: number;\n  chunks: ChunkPlan[];\n  papers: PaperSpan[];\n  /** \u6CA1\u6CD5\u51FA\u58F0\u7684\u58F0\u90E8\uFF08\u6CA1\u4EBA\u4E0A\u573A\uFF09\uFF1A\u4E0D\u51FA\u58F0\u3001\u62A5\u51FA\u6765\u3001\u4EBA\u6362\uFF08\u4E0D\u81EA\u52A8\u66FF\u8865\uFF09\u3002 */\n  unplayable: { part: string; why: string }[];\n  /** \u8FD9\u4E2A\u58F0\u90E8\u91CC id = tokenId \u7684\u90A3\u4E2A token \u5728\u65F6\u95F4\u7EBF\u4E0A\u7684\u79D2\uFF08\u4E0D\u662F\u97F3 = \u540E\u9762\u7B2C\u4E00\u4E2A\u97F3\u7684\u65F6\u523B\uFF1B\u4E0D\u5728\u653E\u7684\u8303\u56F4\u91CC = null\uFF09\u3002 */\n  secondsOfToken(partId: string, tokenId: number): number | null;\n  /** \u7B2C sec \u79D2\u843D\u5728\u54EA\u5F20\u7EB8\u7684\u7B2C\u51E0\u4E2A tick\uFF08\u7EB8\u81EA\u5DF1\u7684 tick\uFF0C\u53CD\u590D\u5DF2\u6298\u56DE\u53BB\uFF1B\u753B\u64AD\u653E\u5934\u7528\uFF09\u3002 */\n  locate(sec: number): { paperId: string; tick: number } | null;\n  /** \u8C31\u4F4D\u7F6E\uFF08\u7EB8 + \u7EB8\u5185 tick\uFF09\u2192 \u79D2\uFF1A\u53CD\u590D / \u7F16\u6392\u91CC\u540C\u4E00\u5904\u653E\u51E0\u904D = \u51E0\u4E2A\u5019\u9009\uFF0C\u53D6\u79BB near \u6700\u8FD1\u7684\uFF1B\u4E0D\u5728\u64AD\u653E\u987A\u5E8F\u91CC = null\u3002\u653E\u7740\u7684\u65F6\u5019\u6362\u65F6\u95F4\u7EBF\u7528\uFF08\u64AD\u653E\u5934\u6309\u8C31\u4F4D\u7F6E\u7559\u5728\u539F\u5730\uFF09\u3002 */\n  secondsAt(paperId: string, tick: number, near: number): number | null;\n}\n\n/** \u5C0F\u6708\u76F8\u5531\u7684\u6BB5\u548C\u6BCF\u6BB5\u7684\u8BED\u8A00\uFF082026-10-13\uFF1Buser\u300C\u6253\u4E86\u65E5\u6587\u4E4B\u540E\u60F3\u6362\u6210\u4E2D\u6587\u7FFB\u8BD1\u4F1A\u8BF4\u4E0D\u80FD\u6253\u6C49\u5B57\u7136\u540E\u62A5\u9519\u300D\u2192\u300C\u6BCF\u4E00\u6BB5\u91CC\u9762\u6709\u5047\u540D\u5C31\u7B97\u65E5\u6587\u300D\u300C\u5C31\u662F\u53E5\u5B50\u7684\u5355\u4F4D\u300D\n *  \u2192\u300C\u5C0F\u6708\u76F8\u4E0D\u662F\u672C\u6765\u5C31\u662F\u9ED8\u8BA4\u6A21\u5F0F\u4E00\u53E5\u4E00\u53E5\u5403\u7684\u5417\uFF0C\u7528\u540C\u4E00\u4E2A\u6DF1\u6A21\u5757\u300D\uFF09\u3002\u5531\uFF08buildTimeline\uFF09\u3001\u753B\u7070\uFF08main.ts lyricMutes\uFF09\u90FD\u8D70\u8FD9\u4E00\u4E2A\uFF0C\u5207\u5206\u53EA\u6709 singChunks \u4E00\u4EFD\uFF1A\n *  \u6BB5 = \u6B4C\u624B\u7684\u300C\u5206\u6BB5\u5531\u300D\uFF08\u6BCF\u53E5 = \u4F11\u6B62\u5904\u5207\u3001\u6BCF\u5F20\u7EB8\u3001\u4E00\u6574\u9996\uFF09\uFF1B\u4E00\u6BB5\u7684\u5B57\u5408\u8D77\u6765\u770B\uFF08score/lang.ts scriptLang\uFF09\uFF1A\u6709\u5047\u540D = \u65E5\uFF08\u5939\u7740\u7684\u6C49\u5B57\u7167\u65E7\u753B\u7070\u300C\u5199\u6210\u5047\u540D\u300D\uFF09\u3001\u53EA\u6709\u6C49\u5B57 = \u4E2D\u3001\u53EA\u6709\u5B57\u6BCD = \u82F1\uFF1B\n *  \u6CA1\u5B57\u7684\u6BB5\uFF08\u54FC\uFF09\u8DDF\u524D\u4E00\u6BB5\uFF0C\u5F00\u5934\u8DDF\u540E\u9762\u7B2C\u4E00\u4E2A\u6709\u5B57\u7684\u6BB5\uFF1B\u6574\u6761\u6CA1\u5B57 = songLangOf\uFF08\u54FC\u6CD5\u5B9A\uFF09\u3002\n *  \u6B64\u524D\u6574\u6761\u58F0\u90E8\u4E00\u79CD\u8BED\u8A00\uFF08songLangOf\uFF09\uFF1A\u8DE8\u6240\u6709\u7EB8\u53EA\u8981\u8FD8\u5269\u4E00\u4E2A\u5047\u540D\u5C31\u6574\u6761\u6309\u65E5\u8BED\uFF0C\u4E2D\u6587\u7FFB\u8BD1\u6253\u5230\u4E00\u534A\u6BCF\u4E2A\u6C49\u5B57\u90FD\u7070\u3001\u4E00\u653E\u5C31\u300Csung syllables \u2026 in the score\u300D\u62A5\u9519\u3002\n *  \uFF08\u540C\u65E5 Fable 5.1 \u5148\u53E6\u5199\u4E86\u4E00\u5957\u5207\u53E5 + \u6309\u8BED\u8A00\u518D\u5207\u6BB5\uFF0C\u8DDF\u5531\u7684\u6BB5\u4E0D\u662F\u540C\u4E00\u4EFD\uFF0COpus 5.5 \u6536\u56DE\u8FD9\u4E00\u4E2A\u3002\uFF09\n *  at = \u6BCF\u4E2A token \u4E0B\u6807 \u2192 \u5B83\u6240\u5728\u90A3\u6BB5\u7684\u8BED\u8A00\uFF08\u4E0D\u5728\u4EFB\u4F55\u6BB5\u91CC\u7684 = \u6CA1\u6709\u97F3\u7684\u90A3\u51E0\u4E2A token\uFF0C\u7ED9\u524D\u4E00\u6BB5\u7684\uFF09\u3002 */\nexport interface SungPlan { ranges: [number, number][]; langs: SingLang[]; at: SingLang[] }\nexport function sungPlan(tokens: Token[], tempoMap: TempoMap | undefined, bounds: readonly number[], mode: SingChunkMode, hum: Hum): SungPlan {\n  const ranges = singChunks(tokens, tempoMap, mode === \"sheet\" ? bounds : [], mode);   // \u6BCF\u53E5\uFF1A\u53EA\u770B\u4F11\u6B62\uFF0C\u4E0D\u770B\u7EB8\u754C\n  const own = ranges.map(([a, b]) => { const text = tokens.slice(a, b).flatMap((t) => (t.kind === \"note\" && t.lyric && t.lyric !== MELISMA_MARK ? [t.lyric] : [])).join(\"\"); return text ? scriptLang(text) : null; });\n  let prev: SingLang = own.find((l) => l) ?? songLangOf(tokens, hum);\n  const langs = own.map((l) => (prev = l ?? prev));\n  const at: SingLang[] = new Array(tokens.length).fill(langs[0] ?? prev);\n  ranges.forEach(([a, b], k) => { for (let i = a; i < tokens.length && (i < b || !ranges[k + 1]); i++) at[i] = langs[k]; });\n  return { ranges, langs, at };\n}\n\n/** \u6574\u6761\u58F0\u90E8\u53EA\u6709\u4E00\u79CD\u8BED\u8A00\u65F6\u5B83\u662F\u54EA\u79CD\uFF08sungPlan \u7684\u515C\u5E95\uFF1A\u6574\u6761\u6CA1\u5199\u6B4C\u8BCD\u65F6\u54FC\u4EC0\u4E48\uFF1Bdebug \u9762\u677F\u7684\u6574\u9996\u5531\u8C31\uFF09\uFF1A\u6B4C\u8BCD\u91CC\u6709\u6C49\u5B57\u3001\u6CA1\u6709\u5047\u540D \u2192 \u4E2D\uFF1B\u6709\u5B57\u6BCD\u3001\u6CA1\u5047\u540D\u6C49\u5B57 \u2192 \u82F1\uFF1B\u5176\u4F59\u6309\u65E5\u8BED\u3002 */\nexport function songLangOf(tokens: readonly Token[], hum: Hum): SingLang {\n  const ls = tokens.flatMap((t) => (t.kind === \"note\" && t.lyric && t.lyric !== MELISMA_MARK ? [t.lyric] : [])).join(\"\");\n  // \u82F1\u6587\uFF1A\u6B4C\u8BCD\u91CC\u6709\u62C9\u4E01\u5B57\u6BCD\u3001\u6CA1\u6709\u5047\u540D\u4E5F\u6CA1\u6709\u6C49\u5B57\uFF08user\u300C\u597D\u5427\u82F1\u6587\u5148\u505A\u5B8C\u300D\uFF09\uFF1B\u4E2D\u82F1\u65E5\u6DF7\u7740\u7684\u6B4C\u7B2C\u4E00\u7248\u6309\u65E5 / \u4E2D\u5531\n  if (/[A-Za-z]/.test(ls) && !/[\\p{Script=Han}\u3040-\u30FF]/u.test(ls)) return \"en\";\n  // \u6574\u9996\u6CA1\u5199\u6B4C\u8BCD\u65F6\uFF0C\u54FC\u300C\u5566\u300D\u300C\u545C\u300D\u7528\u4E2D\u6587\u5531\uFF08\u65E5\u8BED \u3089 \u662F\u8F7B\u5F39\u820C\u3001\u3046 \u4E0D\u5706\u5507\uFF1Buser\u300C\u545C\u8FD8\u662F\u554A\uFF0C\u62C9\u4E5F\u4E0D\u884C\u300D\uFF09\n  if (!ls && (hum === \"la\" || hum === \"u\")) return \"zh\";\n  return /\\p{Script=Han}/u.test(ls) && !/[\u3040-\u30FF]/.test(ls) ? \"zh\" : \"ja\";\n}\n\n/** \u8F7B\u91CF\u7248 / SoundFont \u7684\u97F3\u7B26\u8868\uFF08\u79D2\uFF09\uFF1Atie \u5E76\u6210\u4E00\u4E2A\u957F\u97F3\u3002marks = \u4FEE\u7684\u8BB0\u53F7\u600E\u4E48\u843D\u5230\u8FD9\u4E00\u8DEF\u4E0A\uFF08\u8DF3\u97F3\u622A\u77ED\u3001\u547C\u5438\u5904\u6536\u77ED\u4E00\u53E3\u6C14\uFF09\uFF1B\u4E0D\u7ED9 = \u7167\u8C31\u6EE1\u957F\u3002 */\nexport function lightNotes(tokens: Token[], tempoMap: TempoMap, poly = false, marks?: { staccatoGate: number; breath: boolean; gapSec: number; arpeggioSec?: number }, velOf?: (index: number, art: readonly string[]) => number): { midi: number; t0: number; t1: number; vel?: number }[] {\n  const notes: { midi: number; t0: number; t1: number; vel?: number }[] = [];\n  let open = new Map<number, { midi: number; t0: number; t1: number; vel?: number }>();   // \u4E0A\u4E00\u4E2A\u97F3\u6B63\u5728\u54CD\u7684\u5404\u97F3\u9AD8\uFF08\u8FDE\u97F3\u7EBF\u6309\u97F3\u9AD8\u63A5\uFF1B\u529B\u5EA6\u8DDF\u7B2C\u4E00\u6BB5\uFF09\n  for (const { index, tok, t0, t1 } of timeline(tokens, tempoMap)) {\n    if (tok.kind !== \"note\") continue;\n    const ps = poly && tok.pitch ? allPitches(tok as NoteTok) : [effectivePitch(tokens, index)];   // \u5355\u58F0\u5F15\u64CE\u53EA\u62FF\u6700\u4E0A\u9762\u90A3\u6761\u7EBF\n    const nextOpen = new Map<number, { midi: number; t0: number; t1: number; vel?: number }>();\n    // \u7436\u97F3\uFF08v0.9.45\uFF1Bv0.9.48 \u6539\uFF1Auser\u300C\u5EFA\u8BAE\u6539\u4E3A\u65CB\u5F8B\u97F3\u51C6\u65F6\u843D\u62CD\u3001\u4F4E\u97F3\u63D0\u524D\u6EDA\u594F\uFF0C\u9519\u5F00\u95F4\u969435ms\u300D\uFF09\uFF1A\u6700\u4E0A\u9762\u7684\uFF08\u65CB\u5F8B\uFF09\u51C6\u65F6\u843D\u62CD\uFF0C\u4E0B\u9762\u7684\u4ECE\u4F4E\u5230\u9AD8\u4F9D\u6B21\u63D0\u65E9 arpeggioSec\n    //   \uFF08\u6700\u591A\u644A\u5230\u8FD9\u4E2A\u97F3\u4E00\u534A\u957F\uFF1B\u6B4C\u5F00\u5934\u524D\u9762\u6CA1\u5730\u65B9 = \u94B3\u5728 0\uFF09\uFF1B\u8FDE\u8FC7\u6765\u7684\u90A3\u6BB5\u4E0D\u518D\u9519\u5F00\n    const arp = poly && ps.length > 1 && (tok.art ?? []).includes(\"arpeggio\") && !tok.tie ? Math.min(marks?.arpeggioSec ?? 0.035, ((t1 - t0) * 0.5) / (ps.length - 1)) : 0;\n    const rank = arp ? new Map([...ps].map((q) => midiOf(q)).sort((a, b) => a - b).map((m, k) => [m, k] as const)) : null;\n    for (const p of ps) {\n      const midi = midiOf(p), prev = tok.tie ? open.get(midi) : undefined;\n      if (prev) { prev.t1 = marks ? noteEnd(t0, t1, tok.art ?? [], marks, !!tok.slur) : t1; nextOpen.set(midi, prev); continue; }\n      const n = { midi, t0: rank ? Math.max(0, t0 - (ps.length - 1 - (rank.get(midi) ?? 0)) * arp) : t0, t1: marks ? noteEnd(t0, t1, tok.art ?? [], marks, !!tok.slur) : t1, ...(velOf ? { vel: velOf(index, tok.art ?? []) } : {}) }; notes.push(n); nextOpen.set(midi, n);\n    }\n    open = nextOpen;\n  }\n  return notes.sort((a, b) => a.t0 - b.t0);   // \u7436\u97F3\u63D0\u65E9\u7684\u4F4E\u97F3\u53EF\u80FD\u6BD4\u524D\u4E00\u4E2A\u97F3\u8FD8\u65E9\u4E00\u70B9\uFF1A\u6309\u8D77\u70B9\u6392\uFF08\u7A33\u5B9A\u6392\u5E8F\uFF1A\u6CA1\u7436\u97F3\u7684\u6B4C\u987A\u5E8F\u539F\u6837\uFF09\n}\n\nexport const HUM_KANA: Record<Hum, string> = { la: \"\u3089\", n: \"\u3093\", u: \"\u3046\", o: \"\u304A\", a: \"\u3042\" };\n\nexport function buildTimeline(inp: TimelineInput): Timeline {\n  const { song, order, hum } = inp;\n  const map = timeMapOf(song, order), gmap = grooveMapOf(song, order);   // \u65F6\u95F4\u8868 = \u901F\u5EA6 + \u6447\u6446\uFF08v0.9.36\uFF1A\u4E09\u79CD\u6F14\u594F\u8005\u540C\u4E00\u4E2A\u626D\u66F2\uFF09\n  const flats = new Map<string, { tokens: Token[]; starts: { index: number; paper: PaperSeg }[] }>();\n  const flat = (partId: string) => { let f = flats.get(partId); if (!f) { f = flattenPart(song, partId, { order }); flats.set(partId, f); } return f; };\n  const tracks: TrackSpec[] = [], chunks: ChunkPlan[] = [], unplayable: { part: string; why: string }[] = [];\n  let total = 0, from = 0, to = 0;\n  for (const part of inp.parts) {\n    const { tokens, starts } = flat(part.id), bounds = starts.map((s) => s.index), tl = timeline(tokens, map);\n    if (tl.length) total = Math.max(total, tl[tl.length - 1].t1);\n    const info = inp.info(part);\n    if (!info.plugin) { unplayable.push({ part: part.id, why: \"\u8FD8\u6CA1\u6709\u4EBA\u4E0A\u573A\" }); continue; }\n    const groove = grooveWeights(tokens, bounds, gmap, info.follow);\n    const gain: GainSeg[] | null = gainSegments(tokens, map, info.spec, bounds, groove);\n    if (info.plugin.sound === \"chunks\") {   // \u6162\u5F15\u64CE\uFF1A\u6309\u53E5\u51FA\u5757\uFF08\u8C01\u5531\u7531 worker \u6309\u63D2\u4EF6\u5B9A\uFF1B\u73B0\u5728\u53EA\u6709\u5C0F\u6708\u76F8\uFF09\n      const plan = sungPlan(tokens, map, bounds, info.chunk, hum);   // \u6BB5 + \u6BCF\u6BB5\u7684\u8BED\u8A00\uFF08\u753B\u7070\u4E5F\u8D70\u5B83\uFF09\n      const noteAt = (a: number) => tl.find((x) => x.index >= a && x.tok.kind === \"note\")?.t0 ?? 0;\n      const clips: TrackSpec & { kind: \"clips\" } = { id: part.id, kind: \"clips\", clips: [], gain, ...(info.chain?.length ? { chain: info.chain } : {}) };\n      for (const [k, [a, b]] of plan.ranges.entries()) {\n        const lang = plan.langs[k], te = new Map<number, number>(), score = toLabScore(tokens, hum, lang, map, info.spec.sing, [a, b], te);\n        if (!score.SCORE.length) continue;\n        const entryOf = new Map<number, number>(); for (const [i, e] of te) entryOf.set(tokens[i].id, e);\n        const first = noteAt(a), last = tl.filter((x) => x.index >= a && x.index < b && x.tok.kind === \"note\").reduce((m, x) => Math.max(m, x.t1), first);\n        const opt = { ...inp.singOpt, ...(info.singOpt ?? {}) };   // \u6B4C\u7EA7\u7684\u54FC\u7684\u53C2\u6570 + \u8FD9\u4F4D\u81EA\u5DF1\u7684\u65CB\u94AE\uFF08\u5019\u9009\u91CC\u6309\u503C\u5B58\u7684\uFF09\n        const key = JSON.stringify([\"tsukuyomi-chunk\", score, opt]), t0 = first - LEAD_IN, dur = last - first + LEAD_IN + SUNG_TAIL;\n        clips.clips.push({ key, t0, dur, gain: SUNG_GAIN, end: last });\n        chunks.push({ part: part.id, key, score, lang, opt, t0, dur, end: last, entryOf });\n        from = Math.min(from, t0); to = Math.max(to, t0 + dur);\n      }\n      tracks.push(clips);\n      continue;\n    }\n    const vels = noteVelocities(tokens, map, info.spec, info.velocity, bounds, groove);\n    const notes = lightNotes(tokens, map, info.plugin.poly, lightMarks(info.spec), (i) => vels.get(i) ?? info.velocity);\n    // \u5FEB\u5F15\u64CE\uFF1A\u97F3\u7B26\u8868 \u2192 \u8FD9\u4F4D\u7684\u8F68\uFF0C\u600E\u4E48\u62FC\u5F52\u63D2\u4EF6\uFF08\u5143\u97F3\u7248 / SoundFont \u7684\u952E / \u7740\u529B\u70B9\u90FD\u5728\u5B83\u81EA\u5DF1\u90A3\u91CC\uFF1BADR-0004\uFF09\n    const built = info.plugin.track?.({ id: part.id, notes, gain, ...(info.chain?.length ? { chain: info.chain } : {}), hum, info });\n    if (!built) { unplayable.push({ part: part.id, why: `\u300C${info.plugin.label}\u300D\u4E0D\u4F1A\u6309\u97F3\u7B26\u8868\u51FA\u58F0` }); continue; }\n    if (\"unplayable\" in built) { unplayable.push({ part: part.id, why: built.unplayable }); continue; }\n    if (built.from !== undefined) from = Math.min(from, built.from);   // \u7740\u529B\u70B9\u63D0\u524D\u4E86\u7684\u97F3\uFF1A\u6BD4\u7B2C\u4E00\u4E2A\u97F3\u8FD8\u65E9 = \u65F6\u95F4\u7EBF\u4ECE\u90A3\u513F\u8D77\uFF08\u540C\u6708\u8BFB\u7684\u8F85\u97F3\u63D0\u524D\uFF09\n    tracks.push(built.track);\n  }\n  to = Math.max(to, total);\n  // \u7EB8\u7684\u79D2\u533A\u95F4\uFF08\u6240\u6709\u58F0\u90E8\u538B\u5E73\u540E\u7684\u7EB8\u5E8F\u5217\u4E00\u6837\uFF1A\u7F3A\u8FD9\u4E2A\u58F0\u90E8\u7684\u7EB8\u8865\u4E86\u4F11\u6B62\uFF09\n  const ref = inp.parts[0] ?? song.parts[0];\n  const papers: PaperSpan[] = [];\n  if (ref) {\n    const { tokens, starts } = flat(ref.id), tl = timeline(tokens, map);\n    const secAt = (index: number) => tl.find((x) => x.index >= index)?.t0 ?? (tl.length ? tl[tl.length - 1].t1 : 0);\n    const tickAt = (index: number) => tl.find((x) => x.index >= index)?.start ?? (tl.length ? tl[tl.length - 1].start + tl[tl.length - 1].tok.dur : 0);\n    starts.forEach((s, k) => { const nextIndex = starts[k + 1]?.index ?? tokens.length; papers.push({ paper: s.paper, tick0: tickAt(s.index), t0: secAt(s.index), t1: secAt(nextIndex) }); });\n    if (papers.length && tl.length) papers[papers.length - 1].t1 = tl[tl.length - 1].t1;\n  }\n  const secondsOfToken = (partId: string, tokenId: number): number | null => {\n    const f = flats.get(partId) ?? flat(partId), tl = timeline(f.tokens, map);\n    const i = f.tokens.findIndex((t) => t.id === tokenId); if (i < 0) return null;\n    return tl.find((x) => x.index >= i)?.t0 ?? (tl.length ? tl[tl.length - 1].t1 : null);\n  };\n  /** \u8FD9\u5F20\u7EB8\u7684\u53CD\u590D\u7ED3\u6784\u2014\u2014\u6309\u539F\u4EF6\u7B97\uFF08starts \u91CC\u7684 paper \u662F\u5C55\u5F00\u540E\u7684\u90A3\u4EFD\uFF1A\u53CD\u590D\u5C0F\u8282\u7EBF\u5DF2\u7ECF\u88AB\u5C55\u5F00\u5403\u6389\uFF0C\u62FF\u5B83\u7B97\u6C38\u8FDC\u662F null\uFF1B2026-10-10 \u4FEE\uFF0C\u4E4B\u524D\u7B2C\u4E8C\u904D locate \u56DE\u7684 tick \u8D85\u51FA\u7EB8\u957F\uFF09\u3002 */\n  const segsOf = (paperId: string) => { const pp = song.papers.find((x) => x.id === paperId), owner = pp ? tempoOwner(song, pp) : null; return pp && owner ? playSegments(pp.tracks[owner], paperTicks(pp)) : null; };\n  const locate = (sec: number): { paperId: string; tick: number } | null => {\n    if (!ref) return null;\n    const { tokens } = flat(ref.id), tl = timeline(tokens, map);\n    const e = tl.find((x) => sec >= x.t0 && sec < x.t1) ?? (sec >= 0 && tl.length && sec < tl[tl.length - 1].t1 + 1e-9 ? tl[tl.length - 1] : null);\n    if (!e) return null;\n    const tick = e.start + ((sec - e.t0) / Math.max(1e-9, e.t1 - e.t0)) * e.tok.dur;\n    let span = papers[0]; for (const p of papers) if (p.tick0 <= tick + 1e-9) span = p;\n    if (!span) return null;\n    let inPaper = tick - span.tick0;\n    // \u8C31\u5185\u53CD\u590D\u5C55\u5F00\u8FC7\uFF1A\u5C55\u5F00\u540E\u7684 tick \u2192 \u7EB8\u81EA\u5DF1\u7684 tick\uFF08src/score/repeats.ts\uFF09\n    const segs = segsOf(span.paper.id);\n    if (segs) { let cum = 0; for (const s of segs) { const len = s.t1 - s.t0; if (inPaper < cum + len) { inPaper = s.t0 + (inPaper - cum); break; } cum += len; } }\n    return { paperId: span.paper.id, tick: Math.max(0, Math.floor(inPaper)) };\n  };\n  const secondsAt = (paperId: string, tick: number, near: number): number | null => {\n    if (!ref) return null;\n    const { tokens } = flat(ref.id), tl = timeline(tokens, map);\n    let best: number | null = null;\n    for (const span of papers) {\n      if (span.paper.id !== paperId) continue;\n      const segs = segsOf(span.paper.id);\n      const cands: number[] = [];   // \u7EB8\u81EA\u5DF1\u7684 tick \u2192 \u5C55\u5F00\u540E\u7684 tick\uFF08\u53CD\u590D = \u51E0\u4E2A\uFF09\n      if (segs) { let cum = 0; for (const sg of segs) { if (tick >= sg.t0 && tick < sg.t1) cands.push(span.tick0 + cum + (tick - sg.t0)); cum += sg.t1 - sg.t0; } }\n      else cands.push(span.tick0 + tick);\n      for (const T of cands) {\n        const e = tl.find((x) => T >= x.start && T < x.start + x.tok.dur); if (!e) continue;\n        const sec = e.t0 + ((T - e.start) / Math.max(1e-9, e.tok.dur)) * (e.t1 - e.t0);\n        if (best === null || Math.abs(sec - near) < Math.abs(best - near)) best = sec;\n      }\n    }\n    return best;\n  };\n  return { tracks, range: { from, to }, total, chunks, papers, unplayable, secondsOfToken, locate, secondsAt };\n}\n", "// vowel-sampler.ts \u2014\u2014 \u6F14\u594F\u8005\u63D2\u4EF6\uFF1A\u5C0F\u6708\u76F8\uFF08\u5143\u97F3\u7248\uFF09= app \u968F\u5E26\u7684\u5143\u97F3\u8868\uFF08assets/preview/\uFF09\u5728\u5F55\u97F3\u623F\u91CC\u5B9E\u65F6\u5408\u6210\uFF0C\u53EA\u54FC\u4E0D\u5531\u5B57\u3002created 2026-10-14 by Claude Fable 5.1\uFF08ADR-0004\uFF09\nimport { registerPerformer } from \"./registry.ts\";\nimport { HUM_KANA } from \"../engine/timeline.ts\";\nimport type { NoteEv } from \"../engine/studio.ts\";\nimport { TSUKUYOMI_RANGE } from \"./tsukuyomi.ts\";\n\nexport const vowelSampler = registerPerformer({\n  guid: \"b9d4e7a2-51c6-4f0b-8e3d-7a9c2f6b1d58\", kind: \"performer\", name: \"vowel-sampler\", version: 1, label: \"\u5C0F\u6708\u76F8\uFF08\u5143\u97F3\uFF09\",\n  description: \"\u5C0F\u6708\u76F8\u7684\u5143\u97F3\u91C7\u6837\uFF1A\u6309\u4E0B\u5373\u54CD\u3001\u4EFB\u4F55\u8BBE\u5907\u90FD\u80FD\u8DD1\",\n  sound: \"notes\", poly: false, lyrics: \"hum\", hintRange: TSUKUYOMI_RANGE,\n  // \u548C\u4E50\u5668\u540C\u4E00\u6761 lightMarks\uFF08\u8DF3\u97F3\u622A\u77ED / \u547C\u5438\u6536\u77ED / \u4FDD\u6301\u00B7\u8FDE\u7EBF = \u4E0D\u7559\u7F1D\uFF09\uFF1B\u6C14\u58F0 / \u51FA\u58F0\u7684\u6362\u6C14\u53EA\u6709\u5B8C\u6574\u7248\u505A\u5F97\u5230\uFF1B\u7436\u97F3 = \u5355\u58F0\n  honors: [\"staccato\", \"accent\", \"marcato\", \"sfz\", \"fp\", \"breath\", \"tenuto\", \"slur\", \"swellGrow\", \"swellFade\", \"stress\", \"unstress\", \"ghost\"],\n  connected: false, dynamics: \"gain\", grooveCategory: \"voice\", removable: false,\n  info: () => ({ gm: null, chunk: \"phrase\" }),\n  prepare: async (ctx) => { await ctx.ensureVowels(); },\n  track: ({ id, notes, gain, chain, hum, info }) => ({\n    track: { id, kind: \"vowel\", kana: HUM_KANA[hum ?? \"n\"], notes: notes.map((n): NoteEv => ({ t0: n.t0, t1: n.t1, key: n.midi, vel: n.vel ?? info.velocity, preset: 0 })), gain, ...(chain?.length ? { chain } : {}) },\n  }),\n  audition: ({ kana, dyn }) => ({ inst: { kind: \"vowel\", kana }, key: (m) => m, vel: 1, gainDb: dyn.dB }),\n});\n", "// \u751F\u6210\u7269\uFF1Anode scripts/gen-instruments.mjs\uFF08\u6E90 = ../20260813 MyLlamaReborn/20261007 \u97F3\u4E50\u53F2/export/moonsinger/\uFF0C\u62F7\u5728 vendor/instruments/\uFF09\u3002\u52FF\u624B\u6539\u3002\n// \u627E\u4EBA\u89C6\u56FE\u7684\u76EE\u5F55\uFF1A\u4E50\u5668\u6982\u5FF5\uFF08\u767E\u79D1\uFF0Cid \u675F\uFF09+ GM \u6620\u5C04 + \u56FE\u6807\u3002\u6253\u5F00\u89C6\u56FE\u65F6\u624D fetch\uFF0C\u5230\u624B\u5148\u5BF9\u8FD9\u91CC\u9489\u7684 sha256\u3002\nexport const INSTRUMENTS_VERSION = 13;\nexport const INSTRUMENT_FILES = {\n \"concepts\": {\n  \"file\": \"vendor/instruments/instruments-v13.json\",\n  \"bytes\": 293765,\n  \"sha256\": \"b45932d2fd0d9bdecba9de7a07a9caf96417f70b38f6fe9eba57d5c3e5409704\"\n },\n \"gmMap\": {\n  \"file\": \"vendor/instruments/gm-map-v13.json\",\n  \"bytes\": 434032,\n  \"sha256\": \"ce92541c112cfcfbda91e4086d7d0db36d441b0440f8171906d1d78c0a5fe6e5\"\n },\n \"icons\": {\n  \"file\": \"vendor/instruments/instrument-icons-20261010-v13.svg\",\n  \"bytes\": 139014,\n  \"sha256\": \"11f81794734a517e1b3bb301b862471352c5edc0f2e4df926685352ab7e17a52\"\n },\n \"iconCredits\": {\n  \"file\": \"vendor/instruments/icon-credits-v13.json\",\n  \"bytes\": 20670,\n  \"sha256\": \"4f21e792c26514e9fd13ca00ef19e3030834a5a59c6a8583772367302aa9b0a1\"\n },\n \"licenses\": {\n  \"file\": \"vendor/instruments/LICENSES-chosen-v13.md\",\n  \"bytes\": 145790,\n  \"sha256\": \"4eed98cf9658e415ba57397aebb654b5c5ba7ef4b188b5573d4111ed0cc67b91\"\n }\n} as const;\n/** \u56FE\u6807\u7F72\u540D\uFF08\u7B2C\u4E09\u65B9\u56FE\u6807\uFF0C\u968F app vendor\uFF1B\u8BBE\u7F6E\u91CC\u663E\u793A\uFF09\u3002modified = \u6D3E\u751F\u56FE\u6807\uFF08--tile\uFF09\u6539\u4E86\u4EC0\u4E48\uFF08CC-BY \u8981\u6C42\u6CE8\u660E\u6539\u52A8\uFF1Bv4 \u8D77\uFF09\u3002 */\nexport const ICON_CREDITS: { id: string; set: string; author: string; license: string; url: string; modified?: string }[] = [{\"id\":\"commons--Zither\",\"set\":\"commons\",\"author\":\"Mani Vieregg\",\"license\":\"CC0\",\"url\":\"https://upload.wikimedia.org/wikipedia/commons/5/51/Zither.svg?utm_source=commons.wikimedia.org&amp;utm_campaign=imageinfo&amp;utm_content=original\"},{\"id\":\"fontawesome--drum-steelpan--tile\",\"set\":\"fontawesome\",\"author\":\"Fonticons, Inc.\uFF08Font Awesome Free\uFF09\",\"license\":\"CC-BY-4.0\",\"url\":\"https://raw.githubusercontent.com/FortAwesome/Font-Awesome/7.3.1/svgs/solid/drum-steelpan.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"game-icons--accordion\",\"set\":\"game-icons\",\"author\":\"caro-asercion\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/caro-asercion/accordion.svg\"},{\"id\":\"game-icons--bagpipes\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/bagpipes.svg\"},{\"id\":\"game-icons--banjo\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/banjo.svg\"},{\"id\":\"game-icons--bassoon\",\"set\":\"game-icons\",\"author\":\"caro-asercion\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/caro-asercion/bassoon.svg\"},{\"id\":\"game-icons--beer-bottle\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/beer-bottle.svg\"},{\"id\":\"game-icons--bird-twitter\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/bird-twitter.svg\"},{\"id\":\"game-icons--bow-string\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/bow-string.svg\"},{\"id\":\"game-icons--cannon\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/cannon.svg\"},{\"id\":\"game-icons--cat\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/cat.svg\"},{\"id\":\"game-icons--city-car\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/city-car.svg\"},{\"id\":\"game-icons--clarinet\",\"set\":\"game-icons\",\"author\":\"caro-asercion\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/caro-asercion/clarinet.svg\"},{\"id\":\"game-icons--cricket\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/cricket.svg\"},{\"id\":\"game-icons--djembe\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/djembe.svg\"},{\"id\":\"game-icons--drum\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/drum.svg\"},{\"id\":\"game-icons--drum-kit\",\"set\":\"game-icons\",\"author\":\"caro-asercion\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/caro-asercion/drum-kit.svg\"},{\"id\":\"game-icons--firework-rocket\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/firework-rocket.svg\"},{\"id\":\"game-icons--flame\",\"set\":\"game-icons\",\"author\":\"carl-olsen\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/carl-olsen/flame.svg\"},{\"id\":\"game-icons--flute\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/flute.svg\"},{\"id\":\"game-icons--french-horn\",\"set\":\"game-icons\",\"author\":\"caro-asercion\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/caro-asercion/french-horn.svg\"},{\"id\":\"game-icons--frog\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/frog.svg\"},{\"id\":\"game-icons--gong\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/gong.svg\"},{\"id\":\"game-icons--grand-piano\",\"set\":\"game-icons\",\"author\":\"caro-asercion\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/caro-asercion/grand-piano.svg\"},{\"id\":\"game-icons--guitar\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/guitar.svg\"},{\"id\":\"game-icons--guitar-bass-head\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/guitar-bass-head.svg\"},{\"id\":\"game-icons--gunshot\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/gunshot.svg\"},{\"id\":\"game-icons--harp\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/harp.svg\"},{\"id\":\"game-icons--heavy-rain\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/heavy-rain.svg\"},{\"id\":\"game-icons--helicopter\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/helicopter.svg\"},{\"id\":\"game-icons--lightning-storm\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/lightning-storm.svg\"},{\"id\":\"game-icons--lungs\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/lungs.svg\"},{\"id\":\"game-icons--lyre\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/lyre.svg\"},{\"id\":\"game-icons--maracas\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/maracas.svg\"},{\"id\":\"game-icons--musical-keyboard\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/musical-keyboard.svg\"},{\"id\":\"game-icons--ocarina\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/ocarina.svg\"},{\"id\":\"game-icons--pan-flute\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/pan-flute.svg\"},{\"id\":\"game-icons--pipe-organ\",\"set\":\"game-icons\",\"author\":\"caro-asercion\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/caro-asercion/pipe-organ.svg\"},{\"id\":\"game-icons--ringing-bell\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/ringing-bell.svg\"},{\"id\":\"game-icons--rotary-phone\",\"set\":\"game-icons\",\"author\":\"caro-asercion\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/caro-asercion/rotary-phone.svg\"},{\"id\":\"game-icons--saxophone\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/saxophone.svg\"},{\"id\":\"game-icons--sing\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/sing.svg\"},{\"id\":\"game-icons--sitting-dog\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/sitting-dog.svg\"},{\"id\":\"game-icons--splashy-stream\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/splashy-stream.svg\"},{\"id\":\"game-icons--steam-locomotive\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/steam-locomotive.svg\"},{\"id\":\"game-icons--tambourine\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/tambourine.svg\"},{\"id\":\"game-icons--trombone\",\"set\":\"game-icons\",\"author\":\"caro-asercion\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/caro-asercion/trombone.svg\"},{\"id\":\"game-icons--trumpet\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/trumpet.svg\"},{\"id\":\"game-icons--tuba\",\"set\":\"game-icons\",\"author\":\"caro-asercion\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/caro-asercion/tuba.svg\"},{\"id\":\"game-icons--viola\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/viola.svg\"},{\"id\":\"game-icons--violin\",\"set\":\"game-icons\",\"author\":\"zajkonur\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/zajkonur/violin.svg\"},{\"id\":\"game-icons--wave-crest\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/wave-crest.svg\"},{\"id\":\"game-icons--whistle\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/whistle.svg\"},{\"id\":\"game-icons--windy-stripes\",\"set\":\"game-icons\",\"author\":\"lorc\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/lorc/windy-stripes.svg\"},{\"id\":\"game-icons--xylophone\",\"set\":\"game-icons\",\"author\":\"delapouite\",\"license\":\"CC-BY-3.0\",\"url\":\"https://raw.githubusercontent.com/game-icons/icons/82d948812bfe3f269ef8f731dcdb07b08160edc4/delapouite/xylophone.svg\"},{\"id\":\"iconmind--orchestra--tile\",\"set\":\"iconmind\",\"author\":\"IconMind\",\"license\":\"MIT\",\"url\":\"https://raw.githubusercontent.com/Iconmind/iconmind/v0.8.1/packages/icons/icons/education/orchestra/outline-regular.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"iconmind--speech-synth--tile\",\"set\":\"iconmind\",\"author\":\"IconMind\",\"license\":\"MIT\",\"url\":\"https://raw.githubusercontent.com/Iconmind/iconmind/v0.8.1/packages/icons/icons/ai/speech-synth/outline-regular.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"mdi--hand-clap--tile\",\"set\":\"mdi\",\"author\":\"Pictogrammers\uFF08Material Design Icons \u793E\u533A\uFF09\",\"license\":\"Apache-2.0\",\"url\":\"https://raw.githubusercontent.com/Templarian/MaterialDesign/2424e748e0cc63ab7b9c095a099b9fe239b737c0/svg/hand-clap.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"mdi--instrument-triangle--tile\",\"set\":\"mdi\",\"author\":\"Pictogrammers\uFF08Material Design Icons \u793E\u533A\uFF09\",\"license\":\"Apache-2.0\",\"url\":\"https://raw.githubusercontent.com/Templarian/MaterialDesign/2424e748e0cc63ab7b9c095a099b9fe239b737c0/svg/instrument-triangle.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"mdi--square-wave--tile\",\"set\":\"mdi\",\"author\":\"Pictogrammers\uFF08Material Design Icons \u793E\u533A\uFF09\",\"license\":\"Apache-2.0\",\"url\":\"https://raw.githubusercontent.com/Templarian/MaterialDesign/2424e748e0cc63ab7b9c095a099b9fe239b737c0/svg/square-wave.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"openmoji-black--1F390--tile\",\"set\":\"openmoji-black\",\"author\":\"Jonas Dunkel\uFF08OpenMoji\uFF09\",\"license\":\"CC-BY-SA-4.0\",\"url\":\"https://raw.githubusercontent.com/hfg-gmuend/openmoji/17.0.0/black/svg/1F390.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"qlementine-icons--clap--tile\",\"set\":\"qlementine-icons\",\"author\":\"Olivier Cl\u00E9ro\",\"license\":\"MIT\",\"url\":\"https://raw.githubusercontent.com/oclero/qlementine-icons/v1.16.1/sources/resources/icons/24/instrument/clap.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"qlementine-icons--cymbal--tile\",\"set\":\"qlementine-icons\",\"author\":\"Olivier Cl\u00E9ro\",\"license\":\"MIT\",\"url\":\"https://raw.githubusercontent.com/oclero/qlementine-icons/v1.16.1/sources/resources/icons/24/instrument/cymbal.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"qlementine-icons--harmonica--tile\",\"set\":\"qlementine-icons\",\"author\":\"Olivier Cl\u00E9ro\",\"license\":\"MIT\",\"url\":\"https://raw.githubusercontent.com/oclero/qlementine-icons/v1.16.1/sources/resources/icons/16/instrument/harmonica.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"qlementine-icons--hi-hat--tile\",\"set\":\"qlementine-icons\",\"author\":\"Olivier Cl\u00E9ro\",\"license\":\"MIT\",\"url\":\"https://raw.githubusercontent.com/oclero/qlementine-icons/v1.16.1/sources/resources/icons/24/instrument/hi-hat.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"qlementine-icons--idiophone--tile\",\"set\":\"qlementine-icons\",\"author\":\"Olivier Cl\u00E9ro\",\"license\":\"MIT\",\"url\":\"https://raw.githubusercontent.com/oclero/qlementine-icons/v1.16.1/sources/resources/icons/24/instrument/idiophone.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"qlementine-icons--shamisen--tile\",\"set\":\"qlementine-icons\",\"author\":\"Olivier Cl\u00E9ro\",\"license\":\"MIT\",\"url\":\"https://raw.githubusercontent.com/oclero/qlementine-icons/v1.16.1/sources/resources/icons/24/instrument/shamisen.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"qlementine-icons--sitar--tile\",\"set\":\"qlementine-icons\",\"author\":\"Olivier Cl\u00E9ro\",\"license\":\"MIT\",\"url\":\"https://raw.githubusercontent.com/oclero/qlementine-icons/v1.16.1/sources/resources/icons/16/instrument/sitar.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"},{\"id\":\"qlementine-icons--woodwind--tile\",\"set\":\"qlementine-icons\",\"author\":\"Olivier Cl\u00E9ro\",\"license\":\"MIT\",\"url\":\"https://raw.githubusercontent.com/oclero/qlementine-icons/v1.16.1/sources/resources/icons/24/instrument/woodwind.svg\",\"modified\":\"2026-10-08 \u53CD\u8272\u6210\u9ED1\u5E95\u767D\u56FE\uFF08\u97F3\u4E50\u53F2\u4ED3 scripts/icons_tile.py\uFF09\"}];\n", "// catalog.ts \u2014\u2014 \u627E\u4EBA\u89C6\u56FE\u7684\u76EE\u5F55\uFF1A\u4E50\u5668\u6982\u5FF5\uFF08\u767E\u79D1\uFF0C\u8868 \u2460\uFF09+ GM \u6620\u5C04\uFF08\u8868 \u2461\uFF09\u3002\u7EAF\u6570\u636E\u5C42\uFF1A\u52A0\u8F7D / \u6838 sha256 / \u6392\u5E8F\u5206\u7EC4 / \u300C\u8C01\u80FD\u6F14\u300D\u3002\n// created 2026-10-07 by Claude Fable 5.1\u3002\u6570\u636E = vendor/instruments/\uFF08scripts/gen-instruments.mjs \u4ECE\u4ED3\u9F20\u4F1A\u8BDD\u7684 export \u62F7\u6765\uFF1Buser\uFF1A\u4E24\u5F20\u8868\u3001id \u675F\u3001GM \u53EA\u662F\u5934\u8111\u98CE\u66B4\u7684\u8D77\u70B9\uFF09\u3002\n// \u8FD9\u662F\u89C6\u56FE\u5C42\u7684\u76EE\u5F55\uFF0C\u4E0D\u8FDB\u6B4C\uFF1A\u6B4C\u91CC\u9489\u7684\u662F\u89D2\u8272\u7684 id \u675F + \u540D\u5B57\uFF08\u5951\u7EA6 \u00A76\u215E\uFF09\uFF1B\u76EE\u5F55\u5E38\u6539\u6CA1\u5173\u7CFB\u3002\nimport { INSTRUMENT_FILES } from \"./instruments.gen.ts\";\n\nexport interface GmRef { program: number; bank: number; note?: number }\nexport interface Concept {\n  id: string;                                     // Wikidata QID \u6216 x:\u672C\u5730\n  ids: { wikidata: string | null; local: string | null; musicxml: string | null; gm: GmRef[]; hs: string | null };\n  names: { zh: string; en: string; ja?: string; tok?: string };\n  kind: \"instrument\" | \"model\" | \"ensemble\" | \"voice\" | \"sound\";\n  year: number | null; yearApprox?: boolean; lineageYear?: number | null; era?: string | null;\n  regions?: string[]; family: string[]; wikipedia?: string;\n  styles?: { tag: string; ear: string; as?: string; weight?: number }[];   // weight = \u627F\u91CD 3 / \u5E38\u7528 2 / \u70B9\u7F00 1\uFF08v3\uFF1Bdefs.weights\uFF1BAI \u5224\u7684\u914D\u5668\u5206\u91CF\uFF0C\u4E0D\u662F fundamental\uFF09\n  substitutes?: { program: number; bank: number; note?: number; gmNumber: number; gmName: string; basis: \"official\" | \"lineage\" | \"imitation\" | \"family\" | \"name-only\"; hsCommon?: string; reason?: string }[];\n  icon?: { id: string | null; candidates?: string[]; license?: string; borrowedFrom?: string } | null;\n  fundamentalRank: number | null;\n  /** \u5E38\u7528\u97F3\u57DF\uFF08MIDI\uFF0C\u5B9E\u9645\u53D1\u58F0\uFF0C\u79FB\u8C03\u4E50\u5668\u5DF2\u6362\u7B97\uFF09\uFF1Av5 \u8D77\u7531\u4ED3\u9F20\u7684\u767E\u79D1\u8868\u7ED9\uFF08user 2026-10-08\u300C\u8BA9\u4ED3\u9F20\u8C03\u67E5\u300D\uFF09\uFF1B\u6CA1\u6709 = \u4E0D\u753B\u63D0\u793A\u3002basis = \u4F9D\u636E\uFF08\u300C\u539F\u6587\uFF08Violin\uFF09\u300D\u300CAI \u5E38\u8BC6\u300D\u2026\uFF09\u3002 */\n  range?: { low: number; high: number; basis?: string } | null;\n  /** \u97F3\u6548\u5728\u73B0\u5B9E\u91CC\u6700\u50CF\u7684\u90A3\u4E2A\u952E\uFF08v5\uFF1B\u7535\u8BDD = 102\uFF0CGS \u91C7\u6837\u5B9E\u6D4B 2951 Hz\uFF1Buser\u300C\u7535\u8BDD\u94C3\u611F\u89C9\u5C31\u662F\u8001\u5B9E\u7684\uFF0C\u4EE5\u4F60\u542C\u5230\u7684\u4E3A\u51C6\u300D\uFF09\u3002 */\n  naturalKey?: { note: number; hz?: number; basis?: string } | null;\n  /** \u51FA\u7248\u8C31\u7B80\u5199\uFF08v12\uFF1BMuseScore instruments.xml \u7684 shortName\uFF0C\u5982 Vln. / Pno. / Glock.\uFF09\uFF1A\u603B\u8C31\u7B2C\u4E8C\u884C\u8D77\u6BCF\u884C\u8C31\u524D\u5199\u5B83\uFF08user\u300C\u4E50\u624B\u540D\u548C\u989C\u8272\u540C\u610F\u300D\uFF09\u3002\u6CA1\u6709 zh\uFF08\u4ED3\u9F20\u6CA1\u627E\u5230\u4E2D\u6587\u901A\u884C\u7B80\u79F0\u7684\u51FA\u5904\uFF0C\u4E0D\u73B0\u7F16\uFF09\u3002 */\n  abbr?: { en: string; basis?: string } | null;\n  /** \u8BB0\u8C31\u60EF\u4F8B\uFF08v12\uFF09\uFF1Aclef = \u6309\u60EF\u4F8B\u5199\u8C31\u7684\u8C31\u53F7\uFF1BconcertClef = \u6309\u5B9E\u9645\u97F3\u9AD8\u663E\u793A\u65F6\u7684\u8C31\u53F7\uFF08\u949F\u7434 G15ma\u3001\u77ED\u7B1B / \u6728\u7434 G8va\u3001\u4F4E\u97F3\u63D0\u7434 F8vb\uFF09\uFF1B\n   *  sounds = \u5B9E\u9645\u97F3\u9AD8 \u2212 \u6309\u57FA\u7840\u8C31\u53F7\u8BFB\u7684\u8C31\u9762\u97F3\u9AD8\uFF08\u534A\u97F3\uFF09\uFF1Boctave = sounds \u91CC\u6574\u516B\u5EA6\u7684\u90E8\u5206\u3002 */\n  notation?: { clef: string; clefs?: string[]; concertClef: string; concertClefs?: string[]; sounds: number; octave: number; basis?: string; wikipedia?: unknown } | null;\n}\n/** \u94C3\u7C7B\u7684\u516B\u5EA6\u5B9E\u6D4B\uFF08v12\uFF0Cgm-map GM 9\u201316 / 99 / 113 / 115\uFF09\uFF1Ameasured = \u6700\u5F3A\u5206\u97F3\u6BD4\u952E\u540D\u9AD8\u51E0\u4E2A\u534A\u97F3\uFF1Bperceived = \u8033\u6735\u542C\u5230\u7684\u97F3\u6BD4\u952E\u540D\u9AD8\u51E0\u4E2A\u534A\u97F3\uFF08null = \u5224\u4E0D\u51C6\uFF09\u3002 */\nexport interface OctaveCheck { keys: number[]; measured: number; measuredOctave: number; lowest: number; perceived: number | null; perceivedNote?: string; basis?: string; sources?: unknown }\nexport interface GmRow { program: number; bank: number; note?: number; gmNumber: number; gmName: string; family?: string; concept: string; relation: \"self\" | \"substitute\"; primary?: boolean;\n  /** \u8FD9\u4E2A\u97F3\u8272\u81EA\u5DF1\u5728\u54EA\u4E9B\u98CE\u91CC\uFF08\u4ED3\u9F20 v8 \u8D77\u9010\u4E2A\u97F3\u8272\u5224\uFF1B\u672C\u5C0A\u884C\u624D\u6709\uFF09\uFF1Aas = \u5728\u8FD9\u79CD\u98CE\u91CC\u9876\u66FF\u54EA\u4E2A\u6982\u5FF5\uFF08\u5E73\u66FF\u8BA4\u9886\uFF09\u3002\u6982\u5FF5\u4E0A\u7684 styles \u662F\u8FD9\u4E9B\u805A\u5408\u51FA\u6765\u7684\uFF0C\u53EA\u62FF\u6765\u8BF4\u300C\u8FD9\u4EF6\u4E50\u5668\u5C5E\u4E8E\u54EA\u4E9B\u98CE\u300D\u3002 */\n  styles?: { tag: string; ear: string; weight?: number; as?: string }[]; musicxmlSound?: string; year?: number | null; era?: string; basis?: string; reason?: string;   // primary = \u4E00\u4E2A\u53F7\u591A\u91CD\u8BA4\u9886\u65F6\u7684\u4E3B\u672C\u5C0A\uFF08v3\uFF09\n  /** GM 116\u2013128 \u97F3\u6548\uFF1A\u5728 GS + TinySoundFont \u91CC\u6309\u54EA\u4E2A\u952E\u662F\u91C7\u6837\u539F\u901F\uFF08v8 \u6309 TSF \u7684\u97F3\u9AD8\u516C\u5F0F\u91CD\u7B97\uFF1B\u6362\u97F3\u8272\u5E93 / \u5F15\u64CE\u5C31\u4E0D\u7B97\u6570\uFF09\u3002 */\n  joint?: RowJoint; excitation?: { id: string; basis?: string }; breath?: { id: string; basis?: string };\n  sustain?: { id: string; attackMs?: number; noteOffCuts?: boolean; basis?: string };   // \u4ED3\u9F20 v11\uFF1Asustained / decaying / oneshot\uFF08\u5B9E\u6D4B\uFF09\n  velLayers?: { soundfont?: string; key?: number; count: number; ranges: [number, number][]; mpMfSwitchesLayer?: boolean; basis?: string };\n  octaveCheck?: OctaveCheck;   // \u94C3\u7C7B\u7684\u516B\u5EA6\u5B9E\u6D4B\uFF08v12\uFF09   // \u4ED3\u9F20 v11\uFF1AGS \u91CC\u8FD9\u4E2A\u9884\u8BBE\u7684\u529B\u5EA6\u5C42\uFF08\u5B9E\u6D4B\uFF09\n  sampleKey?: { soundfont: string; engine?: string; recommended: number; recommendedBasis?: string;\n    layers?: { sample?: string; originalSpeedKey?: number; centsPerKey?: number; keyRange?: string; peakAtRecommended?: { hz: number; midi: number; pitched: boolean } | null }[] } }\n/** \u6F14\u594F\u5143\u6570\u636E\uFF08\u4ED3\u9F20 v11 \u8D77\uFF0Cgm-map \u6BCF\u884C\u90FD\u6709\uFF0C\u5404\u5E26 basis \u4F9D\u636E\uFF1BW-13\uFF1A\u4E2D\u6587\u6807\u7B7E\u4ECE defs \u53D6\uFF0C\u4E0D\u5199\u6B7B\uFF09\u3002\n *  joint = \u4E0D\u5199\u8BB0\u53F7\u65F6\u97F3\u548C\u4E0B\u4E00\u4E2A\u97F3\u600E\u4E48\u63A5\uFF08\u8FDE\u65AD\u7684\u5E95\u8272\uFF09\uFF1B\u9F13\u4EF6 / \u97F3\u6548 / \u4E00\u4E0B\u5C31\u5B8C\u7684 id = null\u3002 */\nexport interface RowJoint { id: string | null; gapMs: number | null; basis?: string }\nexport interface Defs { eras: { id: string; zh: string; from: number | null; to: number | null }[]; families: { id: string; en: string; zh: string }[]; kinds: { id: string; zh: string }[]; styles?: { id?: string; tag?: string; zh?: string; en?: string }[]; weights?: { id: number; zh: string }[] }\nexport interface Catalog {\n  version: number; concepts: Concept[]; byId: Map<string, Concept>;\n  gmSelf: Map<string, GmRow>;                     // gmKey\uFF08\"bank:program[:note]\"\uFF09\u2192 \u672C\u5C0A\u884C\n  rows: GmRow[]; defs: Defs;\n}\n/** \u4E00\u4E2A\u6982\u5FF5\u7684\u300C\u8C01\u80FD\u6F14\u300D\uFF08GM \u8FD9\u8FB9\uFF09\uFF1A\u672C\u5C0A\u9884\u8BBE\uFF1B\u6CA1\u672C\u5C0A\u65F6\u5217\u5E73\u66FF\uFF08\u5199\u660E\u4F9D\u636E\uFF09\u3002bank 128 = \u9F13\u7EC4\u3002 */\nexport interface Provider { kind: \"self\" | \"substitute\"; bank: number; program: number; note?: number; gmName: string; sound: string | null; basis?: string; reason?: string }   // note = \u9F13\u4EF6\uFF08bank 128 \u7684\u9F13\u7EC4\u91CC\u56FA\u5B9A\u6572\u8FD9\u4E2A\u952E\uFF09\nexport const gmKey = (g: { bank: number; program: number; note?: number }): string => `${g.bank}:${g.program}${g.note !== undefined ? `:${g.note}` : \"\"}`;\n\nexport function loadCatalogFromJson(concepts: { v?: number; defs: Defs; concepts: Concept[] }, gmMap: { rows: GmRow[]; defs?: Partial<Defs> & Record<string, unknown> }): Catalog {\n  const rows = gmMap.rows, gmSelf = new Map<string, GmRow>();\n  for (const r of rows) if (r.relation === \"self\" && (r.primary !== false || !gmSelf.has(gmKey(r)))) gmSelf.set(gmKey(r), r);   // \u9F13\u4EF6\u9760 note \u533A\u5206\uFF0847 \u4E2A\u9F13\u4EF6\u90FD\u5728 128:0 \u4E0B\uFF09\uFF1B\u4E00\u4E2A\u53F7\u591A\u91CD\u8BA4\u9886\u53D6\u4E3B\u672C\u5C0A\n  const list = concepts.concepts;\n  // defs\uFF1A\u4E24\u5F20\u8868\u5404\u5E26\u4E00\u4EFD\uFF1B\u6F14\u594F\u5143\u6570\u636E\u7684\u679A\u4E3E\uFF08joints / excitations / sustains / breaths\uFF0C\u4ED3\u9F20 v11\uFF09\u53EA\u5728 gm-map \u91CC\u2014\u2014\u5E76\u8D77\u6765\uFF0C\u540C\u540D\u7684\u4EE5\u8868 \u2460 \u4E3A\u51C6\n  return { version: concepts.v ?? 0, concepts: list, byId: new Map(list.map((c) => [c.id, c])), gmSelf, rows, defs: { ...(gmMap.defs ?? {}), ...concepts.defs } as Defs };\n}\nlet cached: Promise<Catalog> | null = null;\nconst sha256Hex = async (b: Uint8Array) => [...new Uint8Array(await crypto.subtle.digest(\"SHA-256\", b as unknown as BufferSource))].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\");\nasync function fetchChecked(base: URL, k: keyof typeof INSTRUMENT_FILES): Promise<Uint8Array> {\n  const e = INSTRUMENT_FILES[k], r = await fetch(new URL(`../${e.file}`, base));\n  if (!r.ok) throw new Error(`${e.file}: HTTP ${r.status}`);\n  const b = new Uint8Array(await r.arrayBuffer());\n  if (b.length !== e.bytes || (await sha256Hex(b)) !== e.sha256) throw new Error(`${e.file} \u548C app \u5185\u5D4C\u7684\u4E0D\u4E00\u6837\uFF08\u88AB\u6539\u8FC7\uFF1F\uFF09`);\n  return b;\n}\n/** \u6253\u5F00\u627E\u4EBA\u89C6\u56FE\u65F6\u624D\u52A0\u8F7D\uFF08\u4E24\u4EFD JSON \u5171 260 KB\uFF09\uFF1Bbase = \u4E3B bundle \u7684 import.meta.url\uFF08dist/ \u4E0B\uFF09\u3002 */\nexport function loadCatalog(base: URL): Promise<Catalog> {\n  return (cached ??= (async () => {\n    const [c, g] = await Promise.all([fetchChecked(base, \"concepts\"), fetchChecked(base, \"gmMap\")]);\n    const dec = new TextDecoder();\n    return loadCatalogFromJson(JSON.parse(dec.decode(c)), JSON.parse(dec.decode(g)));\n  })().catch((e) => { cached = null; throw e; }));\n}\n/** \u56FE\u6807 sprite\uFF08103 KB\uFF0C49 \u4E2A\uFF09\uFF0C\u6838\u8FC7 sha256 \u7684\u5B57\u8282\u3002 */\nexport async function loadIconSprite(base: URL): Promise<string> { return new TextDecoder().decode(await fetchChecked(base, \"icons\")); }\n\nexport function providersOf(cat: Catalog, c: Concept): Provider[] {\n  const self = (c.ids.gm ?? []).map((g) => { const r = cat.gmSelf.get(gmKey(g)); return { kind: \"self\" as const, bank: g.bank, program: g.program, ...(g.note !== undefined ? { note: g.note } : {}), gmName: r?.gmName ?? (g.note !== undefined ? `\u9F13\u4EF6 ${g.note}` : `GM ${g.program + 1}`), sound: r?.musicxmlSound ?? c.ids.musicxml }; });\n  if (self.length) return self;\n  return (c.substitutes ?? []).map((s) => ({ kind: \"substitute\" as const, bank: s.bank, program: s.program, ...(s.note !== undefined ? { note: s.note } : {}), gmName: s.gmName, sound: c.ids.musicxml, basis: s.basis, reason: s.reason }));\n}\n/** \u8FD9\u4E2A\u6982\u5FF5\u5728 pad \u4E0A\u63D0\u793A\u54EA\u51E0\u4E2A\u952E\uFF08\u63D0\u793A\u6761 / \u8BD5\u542C\u65F6\u7A97\u53E3\u8DDF\u8FDB\u7528\uFF09\uFF1A\u6709\u5E38\u7528\u97F3\u57DF = \u90A3\u4E00\u6BB5\uFF1B\u97F3\u6548\u6709\u300C\u6700\u50CF\u7684\u952E\u300D= \u5C31\u90A3\u4E00\u4E2A\uFF1B\u90FD\u6CA1\u6709 = null\u3002 */\nexport function rangeOf(c: Concept | undefined): { lo: number; hi: number; title: string } | null {\n  const r = c?.range;\n  if (r && Number.isFinite(r.low) && Number.isFinite(r.high) && r.low <= r.high) return { lo: r.low, hi: r.high, title: `${c!.names.zh}\u7684\u5E38\u7528\u97F3\u57DF${r.basis ? `\uFF08\u4F9D\u636E\uFF1A${r.basis}\uFF09` : \"\"}` };\n  // naturalKey\uFF08\u300C\u542C\u8D77\u6765\u50CF\u54EA\u4E2A\u97F3\u9AD8\u300D\uFF09\u4E0D\u62FF\u6765\u5F53\u63D0\u793A\u952E\uFF1A\u97F3\u6548\u7684\u952E\u540D \u2260 \u542C\u5230\u7684\u97F3\u9AD8\uFF08\u4ED3\u9F20 v8\uFF1A\u7535\u8BDD\u539F\u901F\u952E 64\uFF0C\u542C\u5230\u7684\u6700\u5F3A\u9891\u7387\u5728 C7 \u9644\u8FD1\uFF09\u3002\u6309\u54EA\u4E2A\u952E = sampleKeyOf\n  return null;\n}\n/** GS \u7684\u97F3\u6548\u9884\u8BBE\u5728 TinySoundFont \u91CC\u7684\u539F\u901F\u952E\uFF08\u6309\u5B83\u91C7\u6837\u4E0D\u62C9\u4F38\u4E0D\u538B\u7F29\uFF1B\u4ED3\u9F20 v8\uFF09\uFF1B\u4E0D\u662F GS \u7684\u97F3\u6548 = null\u3002\n *  \u53EA\u5BF9\u5BB6\u65CF\u97F3\u6E90\u5E93\u7684 GeneralUser GS \u6210\u7ACB\u2014\u2014\u8C03\u7528\u65B9\u786E\u8BA4\u6F14\u594F\u8005\u7528\u7684\u5C31\u662F\u5B83\uFF08origin.library\uFF09\u3002 */\nexport function sampleKeyOf(cat: Catalog, bank: number, program: number): { key: number; title: string; midi?: number; centsPerKey?: number } | null {\n  const row = cat.rows.find((r) => r.bank === bank && r.program === program && r.note === undefined && r.sampleKey);\n  const k = row?.sampleKey;\n  if (!k || !Number.isFinite(k.recommended)) return null;\n  // \u97F3\u9AD8\u5BF9\u9F50\u7684\u951A\u70B9\uFF08sf-key.ts\uFF09\uFF1A\u300C\u539F\u901F\u952E = \u63A8\u8350\u952E\u300D\u7684\u90A3\u5C42\uFF08\u4ED3\u9F20\u5B9A\u63A8\u8350\u952E\u65F6\u7684\u4E3B\u5C42\uFF09\uFF1B\u6CA1\u6709\u5C31\u53D6\u7B2C\u4E00\u4E2A\u8986\u76D6\u63A8\u8350\u952E\u3001\u542C\u5F97\u51FA\u97F3\u9AD8\u7684\u5C42\u3002\u5BBD\u5E26\u566A\u58F0 = \u6CA1\u6709\u951A\u70B9\uFF08\u4E0D\u80FD\u5BF9\u9F50\uFF09\n  const covers = (r?: string) => { const m = /^(\\d+)\\s*[\u2013-]\\s*(\\d+)$/.exec(r ?? \"\"); return !m || (k.recommended >= +m[1] && k.recommended <= +m[2]); };\n  const ls = (k.layers ?? []).filter((l) => covers(l.keyRange) && l.peakAtRecommended?.pitched && l.centsPerKey);\n  const main = ls.find((l) => Math.round(l.originalSpeedKey ?? NaN) === k.recommended) ?? ls[0];\n  return { key: k.recommended, title: `\u539F\u901F\u952E\uFF1A\u6309\u8FD9\u4E2A\u952E\uFF0C\u91C7\u6837\u4E0D\u62C9\u4F38\u4E0D\u538B\u7F29${k.recommendedBasis ? `\uFF08${k.recommendedBasis}\uFF09` : \"\"}`,\n    ...(main ? { midi: Math.round(main.peakAtRecommended!.midi * 100) / 100, centsPerKey: main.centsPerKey } : {}) };\n}\n/** \u8FDE\u65AD\u7684\u5E95\u8272\uFF08\u4ED3\u9F20 v11 \u7684 joint\uFF09\uFF1A\u8FD9\u4E2A GM \u53F7\u5EFA\u8BAE\u97F3\u548C\u97F3\u4E4B\u95F4\u7559\u591A\u5927\u7F1D + \u4E2D\u6587\u540D + \u4F9D\u636E\u3002\u76EE\u5F55\u91CC\u6CA1\u6709 / \u6CA1\u5199\uFF08\u65E7\u7248\u76EE\u5F55\u3001\u9F13\u4EF6\u3001\u97F3\u6548\uFF09= null\u3002\n *  \u6309 GM \u53F7\u9010\u4E2A\uFF08user 2026-10-08\u300Cmidi\u7684string\u7CFB\u4E50\u5668\u662F\u6709\u4E0D\u540C\u7684\u6F14\u594F\u65B9\u6CD5\u7684\uFF0C\u4F60\u4E0D\u80FD\u6309\u4E50\u5668\u4E00\u5200\u5207\u300D\uFF09\u3002 */\nexport function jointOf(cat: Catalog, bank: number, program: number, note?: number): { gapSec: number; zh: string; basis: string } | null {\n  const row = cat.rows.find((r) => r.bank === bank && r.program === program && r.note === note && r.joint) ?? cat.rows.find((r) => r.bank === bank && r.program === program && r.joint);\n  const j = row?.joint; if (!j || j.id === null || j.gapMs === null) return null;\n  const zh = (cat.defs as Defs & { joints?: { id: string; zh: string }[] }).joints?.find((x) => x.id === j.id)?.zh ?? j.id;\n  return { gapSec: j.gapMs / 1000, zh, basis: j.basis ?? \"\" };\n}\n/** \u8FD9\u4E2A\u9884\u8BBE\u80FD\u4E0D\u80FD\u4E00\u76F4\u54CD\uFF08\u4ED3\u9F20 v11 \u5B9E\u6D4B\uFF09\uFF1A\"sustained\" / \"decaying\" / \"oneshot\"\uFF1B\u6CA1\u6709 = null\u3002 */\nexport function sustainOf(cat: Catalog, bank: number, program: number, note?: number): string | null {\n  const row = cat.rows.find((r) => r.bank === bank && r.program === program && r.note === note && r.sustain) ?? cat.rows.find((r) => r.bank === bank && r.program === program && r.sustain);\n  return row?.sustain?.id ?? null;\n}\n/** \u8FD9\u4E2A\u9884\u8BBE\u5728 GS \u91CC\u7684\u529B\u5EA6\u5C42\uFF08\u4ED3\u9F20 v11 \u5B9E\u6D4B\uFF1B\u5728 key \u90A3\u4E2A\u952E\u4E0A\u6D4B\u7684\uFF09\u3002\u6CA1\u6709 = null\u3002 */\nexport function velLayersOf(cat: Catalog, bank: number, program: number, note?: number): { count: number; ranges: [number, number][]; key?: number } | null {\n  const row = cat.rows.find((r) => r.bank === bank && r.program === program && r.note === note && r.velLayers) ?? cat.rows.find((r) => r.bank === bank && r.program === program && r.velLayers);\n  return row?.velLayers && row.velLayers.count > 0 ? { count: row.velLayers.count, ranges: row.velLayers.ranges ?? [], key: row.velLayers.key } : null;\n}\n/** \u94C3\u7C7B\u7684\u516B\u5EA6\u5B9E\u6D4B\uFF08\u4ED3\u9F20 v12\uFF0CGM 9\u201316 / 99 / 113 / 115\uFF09\u3002 */\nexport function octaveCheckOf(cat: Catalog, bank: number, program: number, note?: number): OctaveCheck | null {\n  const row = cat.rows.find((r) => r.bank === bank && r.program === program && r.note === note && r.octaveCheck) ?? cat.rows.find((r) => r.bank === bank && r.program === program && r.octaveCheck);\n  return row?.octaveCheck ?? null;\n}\n/** \u89D2\u8272\u8BB0\u7740\u7684\u6982\u5FF5\uFF08id \u675F\uFF09\u2192 \u76EE\u5F55\u91CC\u7684\u90A3\u4EF6\u3002 */\nexport function conceptOfIds(cat: Catalog, ids: { wikidata?: string | null; local?: string | null } | undefined): Concept | undefined {\n  if (!ids) return undefined;\n  return (ids.wikidata ? cat.byId.get(ids.wikidata) : undefined) ?? (ids.local ? cat.byId.get(ids.local) ?? cat.byId.get(`x:${ids.local}`) : undefined);\n}\n/** \u4E50\u5668\u9875\u300C\u516B\u5EA6\u300D\u90A3\u4E00\u884C\u8BF4\u7684\u8BDD\uFF08v0.9.32\uFF1Buser\u300C\u51E0\u4E2A\u94C3\u7684\u5230\u5E95\u54EA\u4E2A\u516B\u5EA6\u7B97\u6570\u8FD8\u662F\u6CA1\u6709\u5F04\u6E05\u695A\u3002\u4E0D\u8FC7\u5148\u5411\u7528\u6237\u62AB\u9732\u300D\uFF09\uFF1A\u6CA1\u6709\u53EF\u8BF4\u7684 = null\u3002clefLabel = \u8C31\u53F7\u7684\u4E2D\u6587\u540D\uFF08\u300C\u9AD8\u97F3 15ma\u300D\uFF09\u3002 */\nexport function octaveDisclosure(nt: Concept[\"notation\"] | undefined, oc: OctaveCheck | null, clefLabel: (c: string) => string): string | null {\n  if (!oc && !(nt && nt.octave)) return null;\n  const parts = [\"\u8C31\u4E0A\u5199\u7684\u5C31\u662F\u5B9E\u9645\u97F3\u9AD8\uFF08MoonSinger \u4E0D\u6309\u4E50\u5668\u79FB\u8C03\uFF09\uFF0C\u53D1\u7ED9\u97F3\u6E90\u7684\u4E5F\u662F\u8FD9\u4E2A\u97F3\u3002\"];\n  if (nt && nt.octave) parts.push(`\u8FD9\u4EF6\u4E50\u5668\u7684\u8C31\u4E60\u60EF\u5199${nt.octave > 0 ? \"\u4F4E\" : \"\u9AD8\"} ${Math.abs(nt.octave) / 12} \u4E2A\u516B\u5EA6\uFF08\u5B9E\u9645${nt.octave > 0 ? \"\u9AD8\" : \"\u4F4E\"}\uFF09\uFF1B\u60F3\u8981\u8C31\u9762\u597D\u8BFB\uFF0C\u7528\u8C31\u53F7\uFF08\u8FD9\u4EF6\u4E50\u5668\u6309\u5B9E\u9645\u97F3\u9AD8\u65F6\u5E38\u7528\u300C${clefLabel(nt.concertClef)}\u300D\uFF0C\u8C31\u53F7\u300C\u81EA\u52A8\u300D\u4E5F\u4F1A\u6311\uFF09\u6216 8va \u7EBF\uFF0C\u51FA\u58F0\u4E0D\u53D8\u3002`);\n  if (oc) parts.push(oc.perceived === null ? `GS \u8FD9\u4E2A\u97F3\u8272\u5B9E\u6D4B\uFF1A\u5224\u4E0D\u51C6\u2014\u2014\u6BCF\u4E2A\u952E\u6700\u5F3A\u7684\u90A3\u4E2A\u5206\u97F3\u6BD4\u952E\u540D\u9AD8 ${Math.round(oc.measured)} \u534A\u97F3\uFF0C\u542C\u8D77\u6765\u591A\u534A\u8DDF\u7740\u5B83\u3002`\n    : oc.perceived === 0 && Math.abs(oc.measured) < 0.5 ? \"GS \u8FD9\u4E2A\u97F3\u8272\u5B9E\u6D4B\uFF1A\u6309\u54EA\u4E2A\u952E\uFF0C\u8033\u6735\u542C\u5230\u7684\u5C31\u662F\u90A3\u4E2A\u97F3\u3002\"\n    : oc.perceived === 0 ? `GS \u8FD9\u4E2A\u97F3\u8272\u5B9E\u6D4B\uFF1A\u6700\u5F3A\u7684\u5206\u97F3\u6BD4\u952E\u540D\u9AD8 ${Math.round(oc.measured)} \u534A\u97F3\uFF08${oc.measuredOctave} \u4E2A\u516B\u5EA6\uFF09\uFF0C\u4F46\u8033\u6735\u542C\u5230\u7684\u97F3\u540D\u8FD8\u662F\u952E\u540D\uFF08\u949F\u7684\u6253\u51FB\u97F3\uFF09\u2014\u2014\u542C\u7740\u89C9\u5F97\u9AD8\u4E86\u662F\u8FD9\u4E2A\u539F\u56E0\u3002`\n    : `GS \u8FD9\u4E2A\u97F3\u8272\u5B9E\u6D4B\uFF1A\u8033\u6735\u542C\u5230\u7684\u6BD4\u952E\u540D${oc.perceived > 0 ? \"\u9AD8\" : \"\u4F4E\"} ${Math.abs(oc.perceived)} \u534A\u97F3\u3002`);\n  return parts.join(\"\");\n}\n/** GS \u5728\u5BB6\u65CF\u97F3\u6E90\u5E93\u91CC\u7684 id\uFF08sampleKey \u53EA\u5BF9\u5B83\u6210\u7ACB\uFF09\u3002 */\nexport const GS_LIBRARY_ID = \"generaluser-gs-2.0.3\";\n/** \u8C31\u4E0A\u5199\u7684\u89D2\u8272\u540D\uFF1A\u76EE\u5F55\u91CC\u7684\u82F1\u6587\u540D\u9996\u5B57\u6BCD\u5927\u5199\uFF08\u6253\u8C31\u60EF\u4F8B\uFF1BVocals / Piano \u540C\u6B3E\uFF09\u3002 */\nexport const roleNameOf = (c: Concept): string => c.names.en.replace(/^./, (ch) => ch.toUpperCase());\n/** \u89D2\u8272\u7684\u5B98\u65B9\u4E50\u5668\u8BED\u4E49 id\uFF1A\u6982\u5FF5\u81EA\u5DF1\u7684\uFF1B\u6CA1\u6709\u5C31\u7528\u672C\u5C0A\u9884\u8BBE\u7684\uFF1B\u518D\u6CA1\u6709 = null\uFF08\u89D2\u8272\u6CBF\u7528\u539F\u6765\u7684\uFF09\u3002 */\nexport const roleSoundOf = (cat: Catalog, c: Concept): string | null => c.ids.musicxml ?? providersOf(cat, c)[0]?.sound ?? null;\n\nexport type SortMode = \"family\" | \"year\" | \"hs\" | \"style\";\n// \u300C\u6309\u66F2\u98CE\u300D= \u539F\u300C\u6309\u3007\u3007\u98CE\u300D\uFF08user 2026-10-08\u300C\u6309OO\u98CE\u6362\u4E00\u4E2A\u66F4\u6B63\u5F0F\u597D\u61C2\u7684\u540D\u5B57\u300D\uFF09\uFF1B\u7EC4\u540D\uFF08\u548C\u98CE / \u4E2D\u534E\u98CE / \u8D1D\u591A\u98CE\u2026\uFF09\u7167\u65E7\u7528\u4ED3\u9F20\u8868\u91CC\u7684\nexport const SORT_LABEL: Record<SortMode, string> = { style: \"\u6309\u66F2\u98CE\", family: \"\u6309\u65CF\uFF08GM \u7684\u987A\u5E8F\uFF09\", year: \"\u6309\u5E74\u4EE3\", hs: \"\u6309\u53D1\u58F0\u65B9\u5F0F\" };   // \u4E0B\u62C9\u7684\u987A\u5E8F = \u8FD9\u91CC\u7684\u987A\u5E8F\uFF08\u9ED8\u8BA4\u7684\u6392\u7B2C\u4E00\uFF09\nconst HS_CLASS: Record<string, string> = { \"1\": \"\u4F53\u9E23\uFF08\u6572\u5B83\u81EA\u5DF1\uFF09\", \"2\": \"\u819C\u9E23\uFF08\u6572\u76AE\uFF09\", \"3\": \"\u5F26\u9E23\uFF08\u5F26\uFF09\", \"4\": \"\u6C14\u9E23\uFF08\u6C14\uFF09\", \"5\": \"\u7535\u9E23\uFF08\u7535\uFF09\" };\n/** \u5217\u8868\u91CC\u7684\u4E00\u884C\uFF1A\u4E00\u4E2A\u6982\u5FF5\uFF1B\u6309\u66F2\u98CE\u65F6\u53EF\u4EE5\u662F\u6982\u5FF5\u540D\u4E0B\u7684**\u4E00\u4E2A\u97F3\u8272**\uFF08preset = \u90A3\u4E00\u884C GM \u6620\u5C04\uFF0C\u661F\u7EA7 / \u5165\u9009\u6309\u5B83\u81EA\u5DF1\u7684\uFF0Cuser 2026-10-08\u300C\u97F3\u8272\u4E3A\u5355\u4F4D\u800C\u4E0D\u662F\u5BB6\u65CF\u4E00\u628A\u635E\u300D\uFF09\u3002 */\nexport interface Entry { concept: Concept; preset?: GmRow; weight?: number; as?: string }\nexport interface Group { id: string; label: string; items: Entry[] }\n/** \u5206\u7EC4 + \u7EC4\u5185\u6392\u5E8F\u3002\u641C\u7D22\u8BCD\u6309\u4E2D / \u82F1 / \u65E5\u540D\u5B50\u4E32\u8FC7\u6EE4\uFF08\u6309\u66F2\u98CE\u65F6\u97F3\u8272\u884C\u4E5F\u8BA4 GM \u540D\uFF1A\u641C\u300CPad\u300D\uFF09\u3002 */\nexport function groupConcepts(cat: Catalog, mode: SortMode, query = \"\"): Group[] {\n  const q = query.trim().toLowerCase();\n  const hit = (c: Concept) => !q || [c.names.zh, c.names.en, c.names.ja ?? \"\"].some((n) => n.toLowerCase().includes(q));\n  const list = cat.concepts.filter(hit);\n  const byGm = (a: Concept, b: Concept) => ((a.ids.gm ?? [])[0]?.program ?? 999) - ((b.ids.gm ?? [])[0]?.program ?? 999) || a.names.zh.localeCompare(b.names.zh, \"zh\");\n  const groups = new Map<string, { id: string; label: string; concepts: Concept[] }>();\n  const put = (id: string, label: string, c: Concept) => { let g = groups.get(id); if (!g) { g = { id, label, concepts: [] }; groups.set(id, g); } g.concepts.push(c); };\n  const asItems = (gs: { id: string; label: string; concepts: Concept[] }[]): Group[] => gs.map((g) => ({ id: g.id, label: g.label, items: g.concepts.map((concept) => ({ concept })) }));\n  if (mode === \"family\") {\n    const order = new Map(cat.defs.families.map((f, i) => [f.id, i]));\n    for (const c of list) { const f = (c.family ?? [])[0] ?? \"other\"; put(f, cat.defs.families.find((x) => x.id === f)?.zh ?? (c.kind === \"voice\" ? \"\u4EBA\u58F0\" : c.kind === \"sound\" ? \"\u97F3\u6548\" : \"\u5176\u4ED6\"), c); }   // GM \u4EE5\u5916\u7684\u4E50\u5668\uFF08\u4E8C\u80E1\uFF09\u6CA1\u6709 family\n    return asItems([...groups.values()].sort((a, b) => (order.get(a.id) ?? 99) - (order.get(b.id) ?? 99)).map((g) => ({ ...g, concepts: g.concepts.sort(byGm) })));\n  }\n  if (mode === \"year\") {\n    const eras = cat.defs.eras;\n    for (const c of list) { const e = eras.find((x) => x.id === c.era); put(e?.id ?? \"unknown\", e ? `${e.zh}${e.from !== null ? `\uFF08${fmtYear(e.from)} \u8D77\uFF09` : \"\"}` : \"\u5E74\u4EE3\u4E0D\u8BE6\", c); }\n    const order = new Map(eras.map((e, i) => [e.id, i]));\n    return asItems([...groups.values()].sort((a, b) => (order.get(a.id) ?? 99) - (order.get(b.id) ?? 99)).map((g) => ({ ...g, concepts: g.concepts.sort((a, b) => (a.year ?? 1e9) - (b.year ?? 1e9)) })));\n  }\n  if (mode === \"hs\") {\n    for (const c of list) { const k = c.ids.hs?.[0] ?? \"?\"; put(k, HS_CLASS[k] ?? \"\u5206\u7C7B\u4E0D\u8BE6\", c); }\n    return asItems([...groups.values()].sort((a, b) => (a.id.localeCompare(b.id))).map((g) => ({ ...g, concepts: g.concepts.sort((a, b) => (a.ids.hs ?? \"~\").localeCompare(b.ids.hs ?? \"~\")) })));\n  }\n  return styleGroups(cat, q, hit);\n}\n/** \u6309\u66F2\u98CE\uFF1A**\u4EE5 GM \u97F3\u8272\u4E3A\u5355\u4F4D**\uFF08user 2026-10-08\u300C\u8BC4\u7EA7\u548C\u662F\u5426\u5165\u9009\u80FD\u4E0D\u80FD\u7CBE\u786E\u5230\u5408\u6210\u5668\u91CC\u9762\u7684\u5B50\u97F3\u8272\u300D\u300C\u6BCF\u4E2A\u4E0D\u540C\u7684\u97F3\u8272\u90FD\u5355\u5217\u5355\u8BC4\u7EA7\u300D\u300C\u97F3\u8272\u4E3A\u5355\u4F4D\u800C\u4E0D\u662F\u5BB6\u65CF\u4E00\u628A\u635E\u300D\u300C\u4E22\u4E86\u5B50\u97F3\u7684\u6392\u5E8F\u548C\u7B56\u5C55\u300D\uFF09\u3002\n *  \u6210\u5458 = \u672C\u5C0A\u884C\u81EA\u5DF1\u7684 styles\uFF08\u4ED3\u9F20 v8 \u8D77\u9010\u4E2A\u97F3\u8272\u5224\uFF1B\u4E00\u4E2A\u53F7\u591A\u91CD\u8BA4\u9886\u53EA\u770B\u4E3B\u672C\u5C0A\uFF09\uFF1B\u6CA1\u6709 GM \u97F3\u8272\u80FD\u6F14\u7684\u6982\u5FF5\uFF08\u53E4\u7B5D / \u98CE\u94C3\u2026\uFF09\u7167\u65E7\u6309\u6982\u5FF5\u3001\u661F\u7EA7\u7528\u6982\u5FF5\u7684\u3002\n *  \u7EC4\u5185\uFF1A\u627F\u91CD\u964D\u5E8F \u2192 \u5E74\u4EFD\u5347\u5E8F \u2192 GM \u53F7\uFF08user\u300C\u6BCF\u4E2A\u98CE\u91CC\u9762\u6309\u7167\u627F\u91CD\u6392\u300D\uFF1B\u540C\u627F\u91CD\u6309\u65F6\u95F4 = \u4ED3\u9F20\u8F6C\u8FF0\u7684 user \u53E3\u5F84\uFF09\u3002 */\nfunction styleGroups(cat: Catalog, q: string, hit: (c: Concept) => boolean): Group[] {\n  const groups = new Map<string, Group>();\n  const put = (tag: string, e: Entry) => { let g = groups.get(tag); if (!g) { g = { id: tag, label: tag === \"none\" ? \"\u6CA1\u8D34\u98CE\u683C\" : styleLabel(cat, tag), items: [] }; groups.set(tag, g); } g.items.push(e); };\n  const self = [...cat.gmSelf.values()];\n  const styled = new Set(self.filter((r) => r.styles?.length).map((r) => r.concept));   // \u6709\u9010\u97F3\u8272\u98CE\u683C\u7684\u6982\u5FF5\uFF1A\u6210\u5458\u6309\u97F3\u8272\u7B97\n  for (const r of self) {\n    const c = cat.byId.get(r.concept); if (!c || !styled.has(c.id)) continue;\n    if (!hit(c) && !(q && r.gmName.toLowerCase().includes(q))) continue;\n    if (!r.styles?.length) { put(\"none\", { concept: c, preset: r }); continue; }   // \u6CA1\u5165\u9009\u4EFB\u4F55\u98CE\u7684\u97F3\u8272\uFF1A\u7167\u6837\u627E\u5F97\u5230\n    for (const s of r.styles) put(s.tag, { concept: c, preset: r, weight: s.weight ?? 0, ...(s.as ? { as: s.as } : {}) });\n  }\n  for (const c of cat.concepts) {\n    if (styled.has(c.id) || !hit(c)) continue;\n    const tags = new Map<string, { weight: number; as?: string }>();\n    for (const s of c.styles ?? []) { const was = tags.get(s.tag); if (!was || (s.weight ?? 0) > was.weight) tags.set(s.tag, { weight: s.weight ?? 0, ...(s.as ? { as: s.as } : {}) }); }\n    if (!tags.size) put(\"none\", { concept: c });\n    for (const [t, w] of tags) put(t, { concept: c, ...w });\n  }\n  const yearOf = (e: Entry) => e.preset?.year ?? e.concept.year ?? 1e9, gmOf = (e: Entry) => e.preset?.gmNumber ?? 999;\n  return [...groups.values()].sort((a, b) => (a.id === \"none\" ? 1 : b.id === \"none\" ? -1 : a.label.localeCompare(b.label, \"zh\")))\n    .map((g) => ({ ...g, items: g.items.sort((a, b) => (b.weight ?? 0) - (a.weight ?? 0) || yearOf(a) - yearOf(b) || gmOf(a) - gmOf(b) || a.concept.names.zh.localeCompare(b.concept.names.zh, \"zh\")) }));\n}\nexport const weightLabel = (cat: Catalog, w: number): string => cat.defs.weights?.find((x) => x.id === w)?.zh ?? \"\";\nfunction styleLabel(cat: Catalog, tag: string): string { const s = cat.defs.styles?.find((x) => (x.id ?? x.tag) === tag); return s?.zh ?? s?.en ?? tag; }\nexport const fmtYear = (y: number): string => (y < 0 ? `\u516C\u5143\u524D ${-y}` : String(y));\nexport const eraLabel = (cat: Catalog, c: Concept): string => cat.defs.eras.find((e) => e.id === c.era)?.zh ?? \"\";\n", "// soundfont.ts \u2014\u2014 \u6F14\u594F\u8005\u63D2\u4EF6\uFF1ASoundFont 2 \u7684\u4E00\u4E2A\u9884\u8BBE\uFF08TinySoundFont \u5728\u5F55\u97F3\u623F\u91CC\u5B9E\u65F6\u5408\u6210\uFF1B\u5E93 = \u6B4C\u91CC\u5D4C\u7684 / \u5F31\u5F15\u7528\u89E3\u6790\u51FA\u7684\u5B50\u96C6\uFF09\u3002created 2026-10-14 by Claude Fable 5.1\uFF08ADR-0004\uFF09\n//   \u80FD\u53E0\u97F3\uFF1B\u4E0D\u5531\u5B57\uFF1B\u9F13 / \u97F3\u6548\u7684\u7740\u529B\u70B9\uFF08hitSec\uFF09\u548C\u8C31\u4E0A\u7684\u753B\u6CD5\uFF08\u00D7 \u7B26\u5934 / \u9F13\u8C31\uFF09\u5728\u8FD9\u91CC\uFF08\u539F main.ts hitOf / partViews\uFF09\uFF1B\u6BCF\u4E2A\u97F3\u6572\u54EA\u4E2A\u952E = src/gm/sf-key.ts\uFF08\u56FA\u5B9A\u539F\u901F / \u97F3\u9AD8\u5BF9\u9F50 / \u4FEE\u516B\u5EA6\uFF09\u3002\nimport { registerPerformer } from \"./registry.ts\";\nimport { activeGm, activeVelocity, activeTranspose, activePerfSpec, withVelocity, withTranspose, withSfxFixed, withSfxAlign, roleName, type GmCandidate } from \"../format/project.ts\";\nimport { SOUNDFONT_DEFAULTS } from \"../format/performance.ts\";\nimport { velLayersOf, octaveCheckOf, conceptOfIds, octaveDisclosure, GS_LIBRARY_ID } from \"../gm/catalog.ts\";\nimport { canAlign } from \"../gm/sf-key.ts\";\nimport { CLEF_LABEL } from \"../score/clef.ts\";\nimport type { ClefName } from \"../score/song.ts\";\nimport { percKindOf, percOf } from \"../gm/percussion.ts\";\nimport { sfKey } from \"../gm/sf-key.ts\";\nimport type { NoteEv } from \"../engine/studio.ts\";\n\n/** \u7740\u529B\u70B9\uFF08v0.10.27\uFF09\uFF1A\u53F0\u4E0A\u662F\u9F13 / \u56FA\u5B9A\u6572\u4E00\u4EF6\u7684\u97F3\u6548 = \u6309\u4ED3\u9F20\u5B9E\u6D4B\u7684 hitSec \u63D0\u524D\u653E\uFF1B\u6709\u97F3\u9AD8\u7684\u4E50\u5668\u4E0D\u632A\u3002 */\nfunction hitOf(g: GmCandidate | null): { hitSec?: (key: number) => number } {\n  const pk = g ? percKindOf(g) : null;\n  if (!pk) return {};\n  if (pk.kind === \"kit\") return { hitSec: (key) => percOf(128, 0, key)?.hitSec ?? 0 };\n  const h = pk.info.hitSec ?? 0; return h ? { hitSec: () => h } : {};\n}\n\nexport const soundfont = registerPerformer({\n  guid: \"3e8a5c47-9f21-4b6d-a0e2-c7d14f8b9a63\", kind: \"performer\", name: \"soundfont\", version: 1, label: \"SoundFont \u4E50\u5668\",\n  description: \"SoundFont \u4E50\u5668\uFF08TinySoundFont \u51FA\u58F0\uFF09\",\n  sound: \"notes\", poly: true, lyrics: \"none\", hintRange: null,\n  // lightMarks \u90A3\u4E00\u8DEF\uFF1B\u7436\u97F3\u53EA\u6709\u80FD\u53E0\u97F3\u7684\u8BA4\uFF08v0.9.45\uFF09\uFF1B\u6C14\u58F0 / \u51FA\u58F0\u7684\u6362\u6C14\u4E50\u5668\u672C\u6765\u5C31\u4E0D\u8BA4\n  honors: [\"staccato\", \"accent\", \"marcato\", \"sfz\", \"fp\", \"breath\", \"tenuto\", \"slur\", \"swellGrow\", \"swellFade\", \"stress\", \"unstress\", \"ghost\", \"arpeggio\"],\n  connected: false, dynamics: \"velocity\", grooveCategory: \"gm\", removable: true,\n  info: ({ extras, role, presetIndex }) => {\n    const g = activeGm(extras, role);\n    return { gm: g ? { sha: g.subsetSha256, presetIndex: presetIndex(g.subsetSha256, g.bank, g.program), note: g.note, sfx: g.sfx } : null, chunk: \"phrase\", ...hitOf(g) };\n  },\n  /** \u8FD9\u4F4D\u7684\u5B50\u96C6\u8FDB\u5F55\u97F3\u623F\uFF08\u5F31\u5F15\u7528\u53BB\u627E\u6574\u5305 \u2192 \u5207\u5B50\u96C6\uFF1B\u627E\u4E0D\u5230 = \u629B\uFF0C\u80F6\u6C34\u62A5\u51FA\u6765\u3001\u8FD9\u4E2A\u58F0\u90E8\u4E0D\u51FA\u58F0\uFF09\u3002 */\n  prepare: async (ctx) => {\n    const g = activeGm(ctx.extras, ctx.role); if (!g) return;   // \u65F6\u95F4\u7EBF\u4F1A\u62A5\u300C\u53F0\u4E0A\u7684\u4E0D\u662F SoundFont \u4E50\u5668\u300D\n    if (ctx.engine.hasBank(g.subsetSha256)) return;\n    await ctx.engine.bank(g.subsetSha256, await ctx.resolveGmBytes(g));\n  },\n  track: ({ id, notes, gain, chain, info }) => {\n    const g = info.gm;\n    if (!g) return { unplayable: \"\u53F0\u4E0A\u7684\u4E0D\u662F SoundFont \u4E50\u5668\" };\n    const sfNotes = notes.map((n): NoteEv => { const key = sfKey(n.midi, g, info.transpose), h = info.hitSec?.(key) ?? 0; return { t0: n.t0 - h, t1: n.t1, key, vel: n.vel ?? info.velocity, preset: g.presetIndex }; });\n    let from: number | undefined;\n    if (info.hitSec) { sfNotes.sort((x, y) => x.t0 - y.t0); for (const n of sfNotes) from = from === undefined ? n.t0 : Math.min(from, n.t0); }   // \u63D0\u524D\u4E86\u7684\u97F3\uFF1A\u5F55\u97F3\u623F\u6309 t0 \u987A\u5E8F\u8D70\uFF1B\u6BD4\u7B2C\u4E00\u4E2A\u97F3\u8FD8\u65E9 = \u65F6\u95F4\u7EBF\u4ECE\u90A3\u513F\u8D77\n    return { track: { id, kind: \"sf\", sha: g.sha, notes: sfNotes, gain, ...(chain?.length ? { chain } : {}) }, ...(from !== undefined ? { from } : {}) };\n  },\n  /** \u00D7 \u7B26\u5934 = \u56FA\u5B9A\u6572\u4E00\u4E2A\u952E\uFF08\u9F13\u4EF6 / \u97F3\u6548\u56FA\u5B9A\u539F\u901F\uFF09\uFF1Bperc = \u9F13 / \u97F3\u6548 \u2192 \u9F13\u8C31\uFF08\u4E00\u7EBF\u8C31 / \u4E94\u7EBF\u9F13\u8C31\uFF0Cv0.10.27\uFF09\u3002\u53EA\u662F\u753B\u6CD5\uFF0C\u6570\u636E\u4E0D\u52A8\u3002 */\n  notation: ({ extras, role }) => {\n    const g = activeGm(extras, role); if (!g) return {};\n    const pk = percKindOf(g);\n    return { ...(g.note !== undefined ? { xHead: true as const } : {}), ...(pk ? { perc: pk } : {}) };\n  },\n  /** \u8D70\u5E93\uFF1A\u6CA1\u8F7D\u597D\u7684\u8FD9\u4E00\u4E0B\u4E22\u6389\u3001\u987A\u624B\u53BB\u8F7D\uFF1B\u529B\u5EA6 = \u5149\u6807\u5904\u751F\u6548\u7684\uFF08\u6709\u529B\u5EA6\u8868\u8D70 MIDI \u529B\u5EA6\uFF0C\u65E7\u5019\u9009\u8D70\u97F3\u91CF\uFF09\uFF1B\u548C\u6E32\u67D3\u540C\u4E00\u4E2A sfKey\uFF08\u5199\u8C31\u65F6\u542C\u5230\u7684 = \u64AD\u653E\u65F6\u90A3\u4E2A\u97F3\uFF09\u3002 */\n  audition: ({ extras, role, dyn, engine, ensureBank }) => {\n    const g = activeGm(extras, role); if (!g) return null;\n    if (!engine.hasBank(g.subsetSha256)) { ensureBank(); return null; }\n    return { inst: { kind: \"sf\", sha: g.subsetSha256, preset: engine.presetIndex(g.subsetSha256, g.bank, g.program) }, key: (m) => sfKey(m, g, activeTranspose(extras, role)), vel: dyn.vel ?? activeVelocity(extras, role), gainDb: dyn.vel === null ? dyn.dB : 0 };\n  },\n  /** \u4E50\u5668\u9875\u300C\u600E\u4E48\u6F14\u300D\u91CC\u8FD9\u4F4D\u81EA\u5DF1\u7684\u884C\uFF08\u539F main.ts drawInst \u91CC\u6309\u5F15\u64CE\u80FD\u529B gate \u7684\u90A3\u51E0\u6BB5\uFF0C\u539F\u6837\u642C\u6765\uFF1B2026-10-15 \u5200 5 \u4E4B\u4E00\uFF09\u3002 */\n  inspector: ({ extras, role, catalog, esc, chip, dynTable }) => {\n    const active = activeGm(extras, role), sp = activePerfSpec(extras, role), tr = activeTranspose(extras, role), rows = [] as { label: string; control: string; note?: string }[];\n    // \u529B\u5EA6\uFF082026-10-08\uFF0Cuser\u300C\u5E94\u8BE5send\u7684\u5C31\u662Fvelocity\uFF01\u300D\u300C\u529B\u5EA6\u5C31\u662Fvelocity\u300D\uFF09\uFF1A\u6CA1\u5199\u529B\u5EA6\u8BB0\u53F7\u7684\u97F3\u6309\u8FD9\u4E2A\uFF1B\u6709\u529B\u5EA6\u8868\u7684\u6F14\u594F\u8005 mp / mf \u67E5\u8868\u3001\u91CD\u97F3 / \u5F3A\u97F3\u5F80\u4E0A\u52A0\n    { const midi = Math.round(activeVelocity(extras, role) * 127), def = sp.dynamicsVel?.mf ?? Math.round(SOUNDFONT_DEFAULTS.velocity * 127);\n      const L = active && active.origin.library === GS_LIBRARY_ID && catalog ? velLayersOf(catalog, active.bank, active.program, active.note) : null, k = L ? L.ranges.findIndex(([lo, hi]) => midi >= lo && midi <= hi) : -1;\n      rows.push({ label: \"\u529B\u5EA6\", control: `<b class=\"ip-val\">${midi}</b><button class=\"btn\" data-v=\"vel:-8\" title=\"\u8F7B\u4E00\u70B9\uFF08MIDI \u529B\u5EA6 \u22128\uFF09\">\u22128</button><button class=\"btn\" data-v=\"vel:8\" title=\"\u91CD\u4E00\u70B9\uFF08+8\uFF09\">+8</button>` +\n        (midi !== def ? `<button class=\"btn\" data-v=\"vel:def\" title=\"\u56DE\u5230 ${def}\">\u9ED8\u8BA4</button>` : \"\"),\n        note: `\u6CA1\u5199\u529B\u5EA6\u8BB0\u53F7\u7684\u97F3\u6309\u8FD9\u4E2A\u529B\u5EA6\uFF08MIDI 1\u2013127\uFF09\u3002` + (sp.dynamicsVel ? `\u529B\u5EA6\u8BB0\u53F7\u6309\u8FD9\u4F4D\u7684\u529B\u5EA6\u8868\uFF08\u91CD\u97F3 +${sp.accentVel}\u3001\u5F3A\u97F3 +${sp.marcatoVel}\uFF1B\u522B\u7684\u8BB0\u53F7\u89C1\u4E0B\u9762\u300C\u8BB0\u53F7\u600E\u4E48\u6F14\u300D\uFF09\uFF1A${dynTable(L)}` : `\u8FD9\u4F4D\u662F\u4E4B\u524D\u4E0A\u573A\u7684\uFF1A\u529B\u5EA6\u8BB0\u53F7\u8FD8\u662F\u53EA\u6539\u97F3\u91CF\uFF1A${dynTable(null)}`) +\n          (L ? (L.count > 1 ? `GS \u91CC\u8FD9\u4E2A\u97F3\u8272\u6709 ${L.count} \u4E2A\u529B\u5EA6\u5C42${k >= 0 ? `\uFF0C\u73B0\u5728\u5728\u7B2C ${k + 1} \u5C42\uFF08${L.ranges[k][0]}\u2013${L.ranges[k][1]}\uFF09` : \"\"}\uFF1A\u8DE8\u5C42 = \u6362\u4E00\u4EFD\u5F55\u97F3\uFF0C\u97F3\u8272\u4F1A\u53D8\uFF0C\u4E0D\u53EA\u662F\u54CD\u5EA6\u3002` : \"GS \u91CC\u8FD9\u4E2A\u97F3\u8272\u53EA\u6709\u4E00\u4E2A\u529B\u5EA6\u5C42\uFF1A\u529B\u5EA6\u53EA\u6539\u54CD\u5EA6\u3002\") : \"\") });\n    }\n    // \u97F3\u6548\uFF08GS 116\u2013128\uFF0C\u4E0A\u573A\u65F6\u6284\u4E86 sfx\uFF09\uFF1A\u56FA\u5B9A\u539F\u901F\u9ED8\u8BA4\u5F00\uFF08user 2026-10-08\u300C\u56FA\u5B9A\u539F\u901F\u540C\u610F\uFF0C\u9ED8\u8BA4\u5F00\u3002\u78B0\u5230\u732B\u53EB\u6B4C\u624D\u5173\uFF0C\u4F46\u8FD9\u4E2A\u65F6\u5019\u4E5F\u8BB8\u9700\u8981\u97F3\u9AD8\u4FEE\u6B63\u300D\uFF09\uFF1B\n    //   \u8C31\u4E0A\u5199\u7684\u97F3\u9AD8\u6C38\u8FDC\u4E0D\u52A8\u2014\u2014\u56FA\u5B9A = \u4E0D\u62FF\u6765\u51FA\u58F0\uFF08\u5199\u8C31\u6309\u952E\u65F6\u4E5F\u4E00\u6837\uFF0Csf-key.ts \u4E00\u5904\u7B97\uFF09\uFF1B\u5173\u6389 = \u6309\u5199\u7684\u97F3\u53D8\u8C03\u53D8\u901F\uFF0C\u518D\u53EF\u9009\u97F3\u9AD8\u5BF9\u9F50\n    if (active?.sfx) { const fixed = active.note !== undefined, al = !!active.sfx.align;\n      rows.push({ label: \"\u97F3\u6548\", control: chip(\"sfx:fixed\", \"\u56FA\u5B9A\u539F\u901F\", fixed, \"\u6BCF\u4E2A\u97F3\u90FD\u6572\u539F\u901F\u952E\uFF1A\u5199\u8C31\u6309\u952E\u3001\u64AD\u653E\u90FD\u662F\u539F\u6765\u7684\u6837\u5B50\uFF1B\u8C31\u4E0A\u5199\u7684\u97F3\u9AD8\u7167\u7559\uFF0C\u53EA\u662F\u4E0D\u62FF\u6765\u51FA\u58F0\") +\n        (fixed ? \"\" : canAlign(active.sfx) ? chip(\"sfx:align\", \"\u97F3\u9AD8\u5BF9\u9F50\", al, \"\u6309\u539F\u901F\u65F6\u6700\u5F3A\u7684\u90A3\u4E2A\u9891\u7387\u5927\u81F4\u5BF9\u9F50\uFF0C\u8C31\u4E0A\u7684\u97F3 \u2248 \u542C\u5230\u7684\u97F3\uFF1B\u4E0D\u4E00\u5B9A\u662F\u8033\u6735\u542C\u5230\u7684\u4E3B\u97F3\") : \"\"),\n        note: fixed ? \"\u8C31\u4E0A\u5199\u4E0D\u540C\u7684\u97F3\u4E5F\u90FD\u54CD\u539F\u6765\u7684\u6837\u5B50\uFF08\u97F3\u9AD8\u7559\u5728\u8C31\u4E0A\uFF0C\u5173\u6389\u5C31\u6309\u5B83\u53D8\u8C03\uFF09\" : al ? \"\u5199\u7684\u97F3 \u2248 \u542C\u5230\u7684\u97F3\uFF08\u5927\u81F4\uFF09\" : `\u6309\u5199\u7684\u97F3\u53D8\u8C03\u53D8\u901F\uFF1A\u8D8A\u9AD8\u8D8A\u5C16\u8D8A\u5FEB\uFF0C\u8D8A\u4F4E\u8D8A\u6C89\u8D8A\u6162${canAlign(active.sfx) ? \"\" : \"\uFF1B\u8FD9\u4E2A\u97F3\u6548\u539F\u901F\u65F6\u542C\u4E0D\u51FA\u97F3\u9AD8\uFF0C\u6CA1\u6CD5\u5BF9\u9F50\"}` });\n    }\n    // \u4FEE\u516B\u5EA6 / \u79FB\u8C03\uFF08user\u300C\u4FEE\u516B\u5EA6\u548C\u79FB\u8C03\u7684\u97F3\u8272\u7EA7\u522B\u7684\u9009\u9879\u2026\u5927\u90E8\u5206\u60C5\u51B5\u4E0D\u5E94\u8BE5\u52A8\uFF0C\u662Fworst case\u515C\u5E95\u300D\uFF09\uFF1A\u9F13\u4EF6 / \u56FA\u5B9A\u539F\u901F\u6309\u54EA\u4E2A\u952E\u90FD\u4E00\u6837\uFF0C\u4E0D\u7ED9\uFF1B\u9ED8\u8BA4 0\u3001\u4E0D\u81EA\u52A8\u5957\u7528\n    if (active && active.note === undefined) rows.push({ label: \"\u4FEE\u516B\u5EA6\", control: `<b class=\"ip-val\">${tr > 0 ? \"+\" : tr < 0 ? \"\u2212\" : \"\"}${Math.abs(tr)} \u534A\u97F3</b><button class=\"btn\" data-v=\"tr:-12\" title=\"\u4F4E\u4E00\u4E2A\u516B\u5EA6\">\u221212</button><button class=\"btn\" data-v=\"tr:-1\" title=\"\u4F4E\u534A\u97F3\">\u22121</button><button class=\"btn\" data-v=\"tr:1\" title=\"\u9AD8\u534A\u97F3\">+1</button><button class=\"btn\" data-v=\"tr:12\" title=\"\u9AD8\u4E00\u4E2A\u516B\u5EA6\">+12</button>${tr ? `<button class=\"btn\" data-v=\"tr:0\" title=\"\u56DE\u5230 0\">\u5F52\u96F6</button>` : \"\"}`,\n      note: \"\u5927\u90E8\u5206\u60C5\u51B5\u4E0D\u7528\u52A8\uFF1A\u67D0\u4E9B\u97F3\u8272\u672C\u8EAB\u5C31\u5DEE\u516B\u5EA6\uFF08\u6BD4\u5982 GS \u7684 Guitar Harmonics \u9AD8\u4E24\u4E2A\u516B\u5EA6\uFF09\u65F6\u515C\u5E95\uFF0C\u8C03\u597D\u540E\u5199\u4EC0\u4E48\u97F3\u5C31\u54CD\u4EC0\u4E48\u97F3\" });\n    // \u516B\u5EA6\uFF08v0.9.32\uFF1Buser\u300C\u51E0\u4E2A\u94C3\u7684\u5230\u5E95\u54EA\u4E2A\u516B\u5EA6\u7B97\u6570\u8FD8\u662F\u6CA1\u6709\u5F04\u6E05\u695A\u3002\u4E0D\u8FC7\u5148\u5411\u7528\u6237\u62AB\u9732\u300D\uFF09\uFF1A\u8C31\u4E0A\u5199\u7684 = \u5B9E\u9645\u97F3\u9AD8 = \u53D1\u7ED9\u97F3\u6E90\u7684\uFF1B\u8FD9\u4EF6\u4E50\u5668\u7684\u8BB0\u8C31\u4E60\u60EF\uFF08\u4ED3\u9F20 v12 notation\uFF09+ GS \u8FD9\u4E2A\u97F3\u8272\u7684\u5B9E\u6D4B\uFF08octaveCheck\uFF09\n    if (active) {\n      const cpt = catalog ? conceptOfIds(catalog, (extras.lounge[role] as { concept?: { ids?: { wikidata?: string | null; local?: string | null } } } | undefined)?.concept?.ids) : undefined;\n      const oc = catalog && active.origin.library === GS_LIBRARY_ID ? octaveCheckOf(catalog, active.bank, active.program, active.note) : null;\n      const text = octaveDisclosure(cpt?.notation, oc, (c) => CLEF_LABEL[c as ClefName] ?? c);\n      if (text) rows.push({ label: \"\u516B\u5EA6\", control: \"\", note: esc(text) });\n    }\n    return rows;\n  },\n  onInspector: (v, { extras, role, hum }) => {\n    const g = activeGm(extras, role), rn = roleName(extras, role);\n    if (v === \"sfx:fixed\") { const on = g?.note === undefined; return { extras: withSfxFixed(extras, role, on, hum), label: `\u300C${rn}\u300D${on ? \"\u56FA\u5B9A\u539F\u901F\" : \"\u4E0D\u56FA\u5B9A\u539F\u901F\uFF08\u6309\u5199\u7684\u97F3\u53D8\u8C03\uFF09\"}`, silence: true }; }\n    if (v === \"sfx:align\") { const on = !g?.sfx?.align; return { extras: withSfxAlign(extras, role, on, hum), label: `\u300C${rn}\u300D\u97F3\u9AD8\u5BF9\u9F50${on ? \"\u5F00\" : \"\u5173\"}`, silence: true }; }\n    if (v.startsWith(\"tr:\")) { const d = Number(v.slice(3)), next = d === 0 ? 0 : activeTranspose(extras, role) + d; return { extras: withTranspose(extras, role, next, hum), label: `\u300C${rn}\u300D\u4FEE\u516B\u5EA6 / \u79FB\u8C03 ${next} \u534A\u97F3`, gesture: \"transpose\", silence: true }; }\n    if (v.startsWith(\"vel:\")) { const sp = activePerfSpec(extras, role), def = (sp.dynamicsVel?.mf ?? Math.round(SOUNDFONT_DEFAULTS.velocity * 127)) / 127, next = v === \"vel:def\" ? def : activeVelocity(extras, role) + Number(v.slice(4)) / 127; return { extras: withVelocity(extras, role, next, hum), label: `\u300C${rn}\u300D\u529B\u5EA6 ${Math.max(1, Math.min(127, Math.round(next * 127)))}`, gesture: \"vel\" }; }\n    return null;\n  },\n});\n", "// chain.ts \u2014\u2014 \u6548\u679C\u94FE\u9001\u8FDB\u5F55\u97F3\u623F\u4E4B\u524D\u7684\u6362\u7B97\uFF08\u539F src/ui/plugins.ts \u7684\u300C\u4E3B\u7EBF\u7A0B\u6362\u7B97\u300D\u8282\uFF0C2026-10-16 \u642C\u6765\uFF1A\u65E0\u5934\u6E32\u67D3\u6838\u5FC3 src/core/render.ts \u4E5F\u8981\u7528\uFF0C\u6838\u5FC3\u4E0D import src/ui\uFF09\u3002\n//   created 2026-10-16 by Claude Fable 5.1\uFF08\u51FD\u6570\u4F53\u539F\u6837\uFF0Cv0.10.8 Claude Opus 5.5 \u5199\u7684\uFF09\u3002\nimport type { FxV2 } from \"../format/contract.ts\";\n\n/** \u81EA\u52A8\u4F4E\u5207\u7684\u9891\u7387\uFF1A\u8FD9\u4E2A\u58F0\u90E8\u6700\u4F4E\u7684\u97F3\u5F80\u4E0B\u5927\u4E09\u5EA6\uFF08\u7EA6 0.79 \u500D\uFF09\uFF0C\u5939\u5728 20\u2013300 Hz\uFF1B\u6CA1\u6709\u97F3 = 0\uFF08\u5173\uFF09\u3002 */\nexport function autoLowCutHz(lowestMidi: number | null): number {\n  if (lowestMidi === null) return 0;\n  const hz = 440 * 2 ** ((lowestMidi - 69 - 4) / 12);\n  return Math.round(Math.max(20, Math.min(300, hz)));\n}\n/** \u4E00\u6761\u94FE \u2192 \u5F55\u97F3\u623F\u6536\u7684\u6837\u5B50\uFF1AhpAuto / syncBeats \u6362\u6210 hpHz / timeMs\uFF08\u4E3B\u7EBF\u7A0B\u6362\u7B97\u7684\u53C2\u6570\u672C\u8EAB\u4E0D\u9001\uFF09\u3002 */\nexport function resolveChain(chain: readonly FxV2[], ctx: { lowestMidi: number | null; bpm: number }): FxV2[] {\n  return chain.map((fx) => {\n    if (fx.kind === \"eq\" && fx.params.hpAuto) { const { hpAuto: _a, ...rest } = fx.params; return { ...fx, params: { ...rest, hpHz: autoLowCutHz(ctx.lowestMidi) } }; }\n    if (fx.kind === \"delay\" && fx.params.syncBeats) { const { syncBeats: _b, ...rest } = fx.params; return { ...fx, params: { ...rest, timeMs: Math.min(2000, Math.round((60000 / ctx.bpm) * fx.params.syncBeats)) } }; }\n    return fx;\n  });\n}\n", "// render.ts \u2014\u2014 \u65E0\u5934\u6E32\u67D3\u6838\u5FC3\uFF1A\u300C\u8FD9\u9996\u6B4C \u2192 \u8C01\u4E0A\u573A \u2192 \u62FF\u5B57\u8282 / \u51C6\u5907 \u2192 \u65F6\u95F4\u7EBF \u2192 \u6162\u5F15\u64CE\u7684\u5757 \u2192 \u901A\u9053 / \u603B\u7EBF / \u603B\u8F68 \u2192 \u6DF7\u300D\u8FD9\u4E00\u4E32\uFF0C**\u4E0D\u8BA4\u5BBF\u4E3B**\u3002\n//   created 2026-10-16 by Claude Fable 5.1\uFF08W-38 \u2464\u2465\uFF1B\u8FDC\u666F `ai-docs/20261013-vision-epochs-and-refactor.md` \u00A73 \u2462\u300C\u65E0\u5934\u6E32\u67D3\u300D\uFF09\u3002\n//   user 2026-10-13\uFF1A\u300C\u5176\u5B9E\u6211\u86EE\u60F3\u8981\u4E00\u4E2Anode\u80FD\u8DD1\u7684\u65E0ui\u7684\u6E32\u67D3\u6838\u5FC3\u7684\u8FD9\u6837agent\u6216\u8005\u4EBA\u7C7B\u62FF\u5230\u6B4C\u53EF\u4EE5\u672C\u5730\u8DD1\uFF0C\u8FD8\u53EF\u4EE5\u9501\u5F15\u64CE\u7684\u7248\u672C\u300D\u3002\n//   \u4E24\u4E2A\u8C03\u7528\u65B9\uFF1A\u6D4F\u89C8\u5668\uFF08src/app/performance.ts\uFF1A\u64AD\u653E\u7684\u51C6\u5907 / mp3 \u5BFC\u51FA / \u5B9A\u7A3F\uFF09\u548C node \u547D\u4EE4\u884C\uFF08scripts/render-song.mjs\uFF09\u3002\n//   \u8FD9\u91CC\u53EA import \u7EAF\u7684\u4E1C\u897F\uFF08score / engine / performers / format\uFF09\uFF1A\u6CA1\u6709 DOM\u3001\u6CA1\u6709 worker\u3001\u6CA1\u6709 fetch\u2014\u2014\u5F55\u97F3\u623F / \u5531 / \u97F3\u6E90\u90FD\u4ECE RenderDeps \u6CE8\u5165\u3002\n//   \u51FA\u58F0\u7684\u6570\u5B66\u4E00\u884C\u4E0D\u5728\u8FD9\u91CC\uFF08\u65F6\u95F4\u7EBF timeline.ts\u3001\u5F55\u97F3\u623F studio.ts\u3001\u5531\u6CD5\u6838\u5FC3 sing-core.mjs\uFF09\uFF1B\u8FD9\u91CC\u662F\u628A\u5B83\u4EEC\u63A5\u8D77\u6765\u7684\u90A3\u6839\u7EBF\u3002\nimport { type Song, type PartDef, headLen, tempoAt } from \"../score/song.ts\";\nimport { songPlayOrder } from \"../score/arrange.ts\";\nimport { grooveCategory, followOf } from \"../score/groove.ts\";\nimport { midiOf } from \"../score/pitch.ts\";\nimport type { Hum } from \"../format/contract.ts\";\nimport { activeGm, activeInstrument, activeCalibrationDb, activeVelocity, activePerfSpec, activeTranspose, activeMaster, studioTrack, studioTracks, activeChain, activeId, type Extras, type GmCandidate } from \"../format/project.ts\";\nimport { performerOf } from \"../performers/index.ts\";\nimport { buildTimeline, LEAD_IN, type Timeline, type PerformerInfo } from \"../engine/timeline.ts\";\nimport { resolveChain } from \"../engine/chain.ts\";\nimport type { TimelineMsg, ChannelParams, BusSpec, MasterParams } from \"../engine/studio.ts\";\nimport type { VowelTableMsg } from \"../engine/studio-client.ts\";   // \u53EA\u8981\u7C7B\u578B\uFF08\u5143\u97F3\u8868\u7684\u5F62\u72B6\uFF09\uFF1B\u8FD0\u884C\u65F6\u4E0D\u78B0 studio-client\uFF08\u5B83\u8981 AudioWorklet\uFF09\n\n/** \u5F55\u97F3\u623F\u7684\u79BB\u7EBF\u9762\uFF1A\u6D4F\u89C8\u5668\u7684 StudioClient \u548C node \u7684 OfflineStudio \u90FD\u957F\u8FD9\u6837\uFF08\u7ED3\u6784\u7C7B\u578B\uFF09\u3002 */\nexport interface RenderEngine {\n  hasBank(sha: string): boolean;\n  bank(sha: string, bytes: Uint8Array): Promise<void>;\n  presetIndex(sha: string, bank: number, program: number): number;\n  vowels(t: VowelTableMsg): void;\n  hasChunk(key: string): boolean;\n  chunk(key: string, sr: number, samples: Float32Array | Int16Array): void;\n  channel(id: string, p: Partial<ChannelParams>): void;\n  buses(b: BusSpec[]): void;\n  master(p: Partial<MasterParams>): void;\n  renderOffline(tl: TimelineMsg, o?: { sr?: number; progress?: (f: number) => void }): Promise<{ left: Float32Array; right: Float32Array; sr: number; start: number }>;\n}\n/** \u97F3\u6E90 / \u5143\u97F3\u8868\u4ECE\u54EA\u6765\uFF08\u6D4F\u89C8\u5668 = src/sources/sounds.ts + vowel-table.ts\uFF1Bnode = \u6587\u4EF6 / fetch\uFF09\u3002 */\nexport interface RenderSounds {\n  resolveGmBytes(g: GmCandidate): Promise<Uint8Array>;\n  /** \u5143\u97F3\u8868\u88C5\u8FDB\u5F55\u97F3\u623F\uFF08\u88C5\u8FC7\u5C31\u4E0D\u88C5\uFF09\u3002 */\n  ensureVowels(): Promise<void>;\n}\nexport interface RenderDeps {\n  engine: RenderEngine;\n  sounds: RenderSounds;\n  /** \u6162\u5F15\u64CE\u7684\u5757\uFF1A\u628A\u65F6\u95F4\u7EBF\u91CC\u5F55\u97F3\u623F\u8FD8\u6CA1\u6709\u7684\u5757\u5531\u51FA\u6765\u3001`engine.chunk()` \u5582\u8FDB\u53BB\uFF08\u6D4F\u89C8\u5668 = performance.ts \u7684\u6CF5\uFF1Bnode = \u987A\u5E8F singCore\uFF09\u3002\u5531\u4E0D\u4E86\u7684\u4E00\u53E5 = \u629B\uFF08\u6574\u6B21\u6E32\u67D3\u5931\u8D25\uFF09\u6216\u5582\u4E00\u5757\u7A7A\u7684\uFF08\u90A3\u53E5\u7A7A\u7740\uFF09\u2014\u2014\u7531\u5B9E\u73B0\u5B9A\u3002 */\n  sing(tl: Timeline, progress: (msg: string) => void): Promise<void>;\n}\n/** \u6BCF\u4E2A\u58F0\u90E8\u7684\u89C6\u56FE\u6001\uFF08\u9759\u97F3 / \u72EC\u594F\uFF09\uFF1A\u51FA\u58F0\u7684\u58F0\u90E8 = \u6709\u72EC\u594F\u7684\u53EA\u51FA\u72EC\u594F\u7684\uFF0C\u5426\u5219\u51FA\u6CA1\u9759\u97F3\u7684\uFF08user\u300C\u4E0D\u540C\u7684\u58F0\u90E8\u89C6\u56FE\u548C\u51FA\u58F0\u5E94\u8BE5\u5206\u522B\u53EF\u4EE5solo\u548Chide\u300D\uFF09\u3002 */\nexport type PartAudible = (partId: string) => { muted: boolean; solo: boolean };\nexport interface RenderPlan {\n  song: Song;\n  extras: Extras;\n  hum: Hum;\n  /** \u51FA\u58F0\u7684\u58F0\u90E8\uFF08\u5DF2\u7ECF\u6309\u9759\u97F3 / \u72EC\u594F\u7B5B\u8FC7\uFF1BaudibleParts \u7B97\uFF09\u3002 */\n  parts: readonly PartDef[];\n  /** \u6548\u679C\u5168\u5173\uFF08A/B\uFF0C\u64AD\u653E\u7528\uFF1B\u5BFC\u51FA / \u5B9A\u7A3F\u4E00\u5F8B false\uFF09\u3002 */\n  mixBypass?: boolean;\n  /** \u9759\u97F3\u7684\u6DF7\u97F3\u8F68\uFF08\u89C6\u56FE\u6001\uFF09\u3002 */\n  busMuted?: ReadonlySet<string>;\n}\nexport interface PrepareError { part: string; cand: string; why: string }\n\n/** \u6574\u9996\u5531\u65F6\u7ED9\u5531\u6CD5\u6838\u5FC3\u7684\u54FC\u7684\u53C2\u6570\uFF1A\u3093 \u95ED\u5634\uFF08N_m\uFF09\u3001\u54FC\u7684\u5B57\u8F85\u97F3\u81F3\u5C11 70 ms\uFF08\u6838\u5FC3\u9ED8\u8BA4\u5173\uFF0CLab \u547D\u4EE4\u884C\u4E0D\u53D7\u5F71\u54CD\uFF09\uFF1BleadIn \u660E\u8BF4\uFF08\u5757\u6309\u5B83\u6446\uFF09\u3002\u6B4C\u7EA7\uFF1B\u5C0F\u6708\u76F8\u81EA\u5DF1\u7684\u65CB\u94AE\u5728\u5019\u9009\u91CC\uFF08performers/tsukuyomi.ts info \u2192 ChunkPlan.opt\uFF09\u3002 */\nexport const humOpt = (): Record<string, unknown> => ({ humNasal: \"N_m\", humConsMin: 0.07, leadIn: LEAD_IN });\nexport const RENDER_SR = 44100;   // \u5BFC\u51FA / \u5B9A\u7A3F\u7684\u91C7\u6837\u7387\n\n/** \u51FA\u58F0\u7684\u58F0\u90E8\uFF1A\u6709\u72EC\u594F\u7684\u53EA\u51FA\u72EC\u594F\u7684\uFF0C\u5426\u5219\u51FA\u6CA1\u9759\u97F3\u7684\u3002 */\nexport function audibleParts(song: Song, pv: PartAudible): PartDef[] {\n  const solo = song.parts.some((p) => pv(p.id).solo);\n  return song.parts.filter((p) => (solo ? pv(p.id).solo : !pv(p.id).muted));\n}\n/** \u4E0A\u573A\u90A3\u4F4D\u7684\u51FA\u58F0\u53C2\u6570\uFF08\u65F6\u95F4\u7EBF\u4E0D\u78B0 Extras\uFF09\u3002SoundFont \u7684\u9884\u8BBE\u4E0B\u6807\u8981\u5E93\u5148\u8FDB\u5F55\u97F3\u623F\uFF08prepareParts\uFF09\u3002 */\nexport function performerInfoOf(extras: Extras, part: PartDef, presetIndex: (sha: string, bank: number, program: number) => number): PerformerInfo {\n  const role = part.role, eng = (activeInstrument(extras, role)?.engine ?? \"unknown\") as PerformerInfo[\"engine\"], plugin = performerOf(eng), cat = grooveCategory(plugin?.grooveCategory ?? null, activeGm(extras, role));\n  const own = plugin ? plugin.info({ extras, role, presetIndex }) : { gm: null, chunk: \"phrase\" as const };   // \u8FD9\u4F4D\u81EA\u5DF1\u7684\u90A3\u90E8\u5206\uFF08gm / \u5206\u6BB5\u5531 / \u7740\u529B\u70B9\uFF09\u5F52\u63D2\u4EF6\n  return { engine: eng, plugin, spec: activePerfSpec(extras, role), velocity: activeVelocity(extras, role), transpose: activeTranspose(extras, role), follow: (s) => followOf(s, cat), chain: activeChain(extras, role), ...own };\n}\n/** \u8FD9\u4E9B\u58F0\u90E8\u4E0A\u573A\u90A3\u4F4D\u5404\u81EA\u7684\u51FA\u58F0\u51C6\u5907\uFF08SoundFont \u5B50\u96C6\u8FDB\u5F55\u97F3\u623F / \u5143\u97F3\u8868 / \u2026\uFF0C\u5F52\u63D2\u4EF6\uFF1B\u627E\u4E0D\u5230 = \u90A3\u4E2A\u58F0\u90E8\u62A5\u9519\u3001\u4E0D\u51FA\u58F0\uFF0C\u5176\u4F59\u7167\u653E = \u6362\u4EBA\u7684\u7A84\u63A5\u53E3\uFF09\u3002\u8FD4\u56DE\u62A5\u9519\u6E05\u5355\u3002 */\nexport async function prepareParts(parts: readonly PartDef[], extras: Extras, deps: Pick<RenderDeps, \"engine\" | \"sounds\">): Promise<PrepareError[]> {\n  const errs: PrepareError[] = [];\n  for (const part of parts) {\n    const plugin = performerOf(activeInstrument(extras, part.role)?.engine); if (!plugin) continue;   // \u6CA1\u4EBA\u4E0A\u573A\uFF1A\u65F6\u95F4\u7EBF\u4F1A\u62A5\n    try { await plugin.prepare({ extras, role: part.role, engine: deps.engine, resolveGmBytes: (g) => deps.sounds.resolveGmBytes(g), ensureVowels: () => deps.sounds.ensureVowels() }); }\n    catch (e) { errs.push({ part: part.id, cand: activeId(extras, part.role), why: (e as Error).message }); }\n  }\n  return errs;\n}\n/** \u5F55\u97F3\u623F\u91CC\u8FD9\u4E2A\u58F0\u90E8\u7684\u9EA6\u514B\u98CE\uFF08\u589E\u76CA dB\u3001\u58F0\u50CF \u22121\u20261\uFF09\uFF1B\u6CA1\u6709 = 0 / 0\u3002 */\nexport function micOf(extras: Extras, part: PartDef): { gainDb: number; pan: number } {\n  const m = studioTrack(extras, part.mic);\n  return { gainDb: m?.gainDb ?? 0, pan: m?.pan ?? 0 };\n}\n/** \u8FD9\u6761\u901A\u9053 = \u9EA6\u514B\u98CE\u589E\u76CA + \u4E0A\u573A\u90A3\u4F4D\u7684\u54CD\u5EA6\u6821\u51C6\uFF08\u4E09\u5C42\u4E0D\u8FDE\u4E58\uFF1A\u97F3\u7B26\u529B\u5EA6 = \u610F\u56FE\uFF1B\u6821\u51C6 = \u770B\u5F97\u89C1\u80FD\u8C03\u7684\u9ED8\u8BA4\uFF1B\u63A8\u5B50 = dB\uFF09\u3002 */\nexport const channelOf = (extras: Extras, part: PartDef): { gainDb: number; pan: number } => { const { gainDb, pan } = micOf(extras, part); return { gainDb: gainDb + activeCalibrationDb(extras, part.role), pan }; };\n/** \u8FD9\u4F4D\u6B4C\u624B\u5168\u66F2\u6700\u4F4E\u7684\u97F3\uFF08\u81EA\u52A8\u4F4E\u5207\u7528\uFF1B\u6CA1\u6709\u97F3 = null\uFF09\u3002 */\nexport function lowestMidiOf(song: Song, partId: string): number | null {\n  let lo: number | null = null;\n  for (const pp of song.papers) for (const t of pp.tracks[partId] ?? []) if (t.kind === \"note\" && t.pitch) for (const q of [t.pitch, ...(t.chord ?? [])]) { const m = midiOf(q); if (lo === null || m < lo) lo = m; }\n  return lo;\n}\n/** \u6B4C\u5F00\u5934\u7684\u901F\u5EA6\uFF08\u5EF6\u8FDF\u300C\u8DDF\u901F\u5EA6\u300D\u7528\uFF09\u3002 */\nexport function songBpm(song: Song): number { const p = song.papers[0], t = p ? p.tracks[song.parts.find((x) => p.tracks[x.id])?.id ?? \"\"] : undefined; return t ? tempoAt(t, headLen(t)) : 90; }\n/** \u901A\u9053 / \u603B\u7EBF / \u603B\u8F68\u7684\u53C2\u6570\uFF08\u5F55\u97F3\u623F\u8BA4\u7684\u6837\u5B50\uFF09\uFF1A\u63D2\u4EF6\u91CC\u300C\u4E3B\u7EBF\u7A0B\u6362\u7B97\u300D\u7684\u53C2\u6570\uFF08\u81EA\u52A8\u4F4E\u5207 = \u8FD9\u4F4D\u6700\u4F4E\u7684\u97F3\u3001\u5EF6\u8FDF\u8DDF\u901F\u5EA6\uFF09\u6362\u6210\u6570\uFF1B\u6548\u679C\u5168\u5173 = \u63D2\u4EF6\u683C\u548C\u53D1\u9001\u90FD\u4E0D\u54CD\u3001\u63A8\u5B50 / \u58F0\u50CF / \u51FA\u5230 / \u9650\u5E45\u7559\u7740\u3002 */\nexport function mixParamsOf(plan: RenderPlan, pv: PartAudible): { channels: { id: string; p: Partial<ChannelParams> }[]; buses: BusSpec[]; master: MasterParams } {\n  const { song, extras } = plan, raw = !!plan.mixBypass;\n  const bpm = songBpm(song), ctx = (lowestMidi: number | null) => ({ lowestMidi, bpm }), fx = <T,>(x: T[]): T[] => (raw ? [] : x);\n  const channels = song.parts.map((p) => { const t = studioTrack(extras, p.mic); return { id: p.id, p: { ...channelOf(extras, p), mute: pv(p.id).muted, solo: pv(p.id).solo, chain: fx(resolveChain(t?.chain ?? [], ctx(lowestMidiOf(song, p.id)))), sends: fx(t?.sends ?? []), to: t?.to ?? \"master\" } }; });\n  const buses = studioTracks(extras).filter((t) => t.kind === \"bus\").map((b): BusSpec => ({ id: b.id, gainDb: b.gainDb, pan: b.pan, chain: b.bypass ? [] : fx(resolveChain(b.chain, ctx(null))), to: b.to, sends: fx(b.sends), ...(plan.busMuted?.has(b.id) ? { mute: true } : {}) }));   // \u6DF7\u97F3\u8F68\u65C1\u901A = \u63D2\u4EF6\u5168\u8DF3\u8FC7\uFF0C\u63A8\u5B50 / \u53D1\u9001\u7167\u65E7   // \u603B\u7EBF\u4E5F\u80FD\u51FA\u5230 / \u53D1\u7ED9\u522B\u7684\u603B\u7EBF\uFF08v0.10.9\uFF09\n  const m = activeMaster(extras);\n  return { channels, buses, master: { ...m, chain: fx(resolveChain(m.chain, ctx(null))) } };\n}\n/** \u901A\u9053\u53C2\u6570\u63A8\u8FDB\u5F55\u97F3\u623F\uFF08\u64AD\u653E\u65F6\u624D\u4E58 \u2192 \u8FB9\u653E\u8FB9\u8C03\u7ACB\u523B\u542C\u89C1\uFF1B\u9759\u97F3 / \u72EC\u594F\u5728 audibleParts \u91CC\u7B5B\uFF0C\u4E0D\u5728\u901A\u9053\u4E0A\uFF09\u3002 */\nexport function pushMix(engine: RenderEngine, plan: RenderPlan, pv: PartAudible): void {\n  const m = mixParamsOf(plan, pv);\n  for (const c of m.channels) engine.channel(c.id, c.p);\n  engine.buses(m.buses);\n  engine.master(m.master);\n}\n/** \u8FD9\u9996\u6B4C\uFF08\u51FA\u58F0\u7684\u58F0\u90E8\uFF09\u7684\u65F6\u95F4\u7EBF\uFF1A\u8C01\u4E0A\u573A / \u5206\u6BB5 / \u97F3\u7B26\u8868 / \u5757\u6E05\u5355\u3002\u7EAF\u51FD\u6570\uFF08\u9664\u4E86 presetIndex \u8981\u95EE\u5F55\u97F3\u623F\uFF09\u3002 */\nexport function timelineOf(plan: RenderPlan, presetIndex: RenderEngine[\"presetIndex\"]): Timeline {\n  const { song } = plan;\n  return buildTimeline({ song, order: songPlayOrder(song), parts: [...plan.parts], info: (part) => performerInfoOf(plan.extras, part, presetIndex), hum: plan.hum, singOpt: humOpt() });\n}\n\nexport interface RenderResult { left: Float32Array; right: Float32Array; sr: number; secs: number; timeline: Timeline; errors: PrepareError[] }\n/** \u6574\u9996\uFF08\u6216\u4E00\u6BB5\uFF09\u6E32\u67D3\u6210\u7ACB\u4F53\u58F0\u6837\u672C\uFF1A\u51C6\u5907 \u2192 \u65F6\u95F4\u7EBF \u2192 \u5757 \u2192 \u6DF7\uFF08\u548C\u64AD\u653E\u540C\u4E00\u4E2A\u7C7B\u3001\u540C\u4E00\u4EFD\u6570\u5B66\uFF09\u3002\n *  \u6CA1\u6CD5\u51FA\u58F0\u7684\u58F0\u90E8\u62A5\u5728 errors / timeline.unplayable \u91CC\u3001\u5176\u4F59\u7167\u6DF7\uFF1B\u4E00\u4E2A\u90FD\u653E\u4E0D\u4E86 = \u629B\u3002pv = \u9759\u97F3 / \u72EC\u594F\uFF08\u901A\u9053\u4E0A\u7684 mute / solo\uFF1B\u7B5B\u58F0\u90E8\u7528 plan.parts\uFF09\u3002 */\nexport async function renderSong(plan: RenderPlan, deps: RenderDeps, o: { sr?: number; progress?: (msg: string, frac?: number) => void; pv?: PartAudible;\n  /** \u51C6\u5907\u5B8C\u3001\u65F6\u95F4\u7EBF\u7B97\u597D\u90A3\u4E00\u523B\uFF08\u5BBF\u4E3B\u8BB0\u6E05\u5355 \u00A72.2\u00BD \u7528\uFF09\uFF1B\u4E00\u4E2A\u90FD\u653E\u4E0D\u4E86\u4E5F\u5148\u53EB\u5B83\u518D\u629B\u3002 */ onPrepared?: (errors: PrepareError[], tl: Timeline) => void } = {}): Promise<RenderResult> {\n  const pv: PartAudible = o.pv ?? (() => ({ muted: false, solo: false })), say = o.progress ?? (() => {});\n  const errors = await prepareParts(plan.parts, plan.extras, deps);\n  const tl = timelineOf(plan, (sha, bank, program) => deps.engine.presetIndex(sha, bank, program));\n  o.onPrepared?.(errors, tl);\n  if (!tl.tracks.length) throw new Error(`\u6CA1\u6709\u51FA\u58F0\uFF1A${[...errors.map((e) => e.why), ...tl.unplayable.map((u) => u.why)].join(\"\uFF1B\") || \"\u6CA1\u6709\u4F1A\u51FA\u58F0\u7684\u58F0\u90E8\"}`);\n  if (tl.chunks.length) await deps.sing(tl, (m) => say(m));\n  pushMix(deps.engine, { ...plan, mixBypass: false }, pv);   // \u5BFC\u51FA\u7167\u5E38\u5E26\u6548\u679C\uFF08A/B \u7684\u300C\u6548\u679C\u5168\u5173\u300D\u53EA\u7BA1\u64AD\u653E\uFF09\n  say(\"\u6DF7\u97F3\u2026\", 0);\n  const m = await deps.engine.renderOffline({ tracks: tl.tracks, range: tl.range, loop: false }, { sr: o.sr ?? RENDER_SR, progress: (f) => say(\"\u6DF7\u97F3\u2026\", f) });\n  return { left: m.left, right: m.right, sr: m.sr, secs: m.left.length / m.sr, timeline: tl, errors };\n}\n/** \u7ACB\u4F53\u58F0 \u2192 \u5355\u58F0\u9053\uFF08\u5DE6\u53F3\u5E73\u5747\uFF09\u3002 */\nexport function toMono(left: Float32Array, right: Float32Array): Float32Array { const out = new Float32Array(left.length); for (let i = 0; i < out.length; i++) out[i] = (left[i] + right[i]) / 2; return out; }\n", "// scheduler.ts \u2014\u2014 \u6162\u5F15\u64CE\u7684\u5757\u8BE5\u6309\u4EC0\u4E48\u987A\u5E8F\u7B97\uFF08\u7EAF\u51FD\u6570\uFF09\uFF1A\u64AD\u653E\u5934\u6240\u5728\u7684\u90A3\u5757\u5148\u3001\u7136\u540E\u5F80\u540E\u6309\u8DDD\u79BB\u3001\u5FAA\u73AF\u65F6\u7ED5\u56DE\u5FAA\u73AF\u5934\uFF1B\u5DF2\u7ECF\u6709\u7684\u4E0D\u7B97\u3002\n// created 2026-10-09 by Claude Fable 5.1\uFF08\u63D0\u6848 \u00A77\uFF1Buser\u300C\u5B9E\u65F6\u64AD\u653E\u7684\u65F6\u5019\u5230\u65F6\u5019\u8BA9fable\u53EF\u4EE5\u9884\u63D0\u524D\u7B97\u7136\u540E\u7528cache invalid\u4E4B\u7C7B\u7684\u300D\u300C\u7B2C\u4E00\u53E5\u597D\u4E86\u5C31\u5F00\u64AD \u55EF\u300D\uFF09\u3002\n// \u501F\u6717\u8BFB\u5E93\u7684\u505A\u6CD5\uFF1A\u4E00\u6B21\u53EA\u7ED9 worker \u4E00\u5757\uFF08\u6392\u591A\u4E86\u7528\u6237\u4E00\u8DF3\u5C31\u5168\u4F5C\u5E9F\uFF09\uFF1Bseek / \u6539\u8C31 = \u6362\u987A\u5E8F\uFF0C\u6B63\u5728\u7B97\u7684\u90A3\u5757\u7B97\u5B8C\u7167\u6837\u8FDB\u7F13\u5B58\uFF08\u952E\u5BF9\u5C31\u4E0D\u6D6A\u8D39\uFF09\u3002\n\nexport interface SchedChunk { key: string; t0: number; dur: number; /** \u5531\u7684\u6700\u540E\u4E00\u4E2A\u97F3\u5728\u54EA\u4E00\u79D2\u7ED3\u675F\uFF08t0 + dur \u8FD8\u542B\u6536\u5C3E\u7684\u4F59\u97F3\uFF09\u3002 */ end?: number }\n/** \u4ECE\u67D0\u4E00\u6BB5\u653E\uFF08\u8D77\u70B9\u63D0\u524D\u4E86\u4E00\u70B9\uFF09\uFF1A\u5531\u5B8C\u5728\u8D77\u70B9 quiet \u4E4B\u524D\u7684\u5757\u8FD9\u6B21\u4E0D\u653E\uFF08v0.10.3\uFF1Buser 2026-10-10\u300C\u4E3A\u4EC0\u4E48\u4ECEsheet C\u64AD\u653E\u7684\u65F6\u5019\u4F1A\u5E26\u524D\u4E00\u4E2A\u97F3\uFF0C\u4E5F\u4E0D\u77E5\u9053\u662Fsheet B\u7684\u8FD8\u662Fstop\u7684\u65F6\u5019\u6CA1\u5F04\u5E72\u51C0\u300D\uFF09\u2014\u2014\u6392\u961F\u522B\u628A\u5B83\u6392\u5728\u524D\u9762\u3001\u5F00\u64AD\u522B\u7B49\u5B83\u3002 */\nexport const mutedAt = (c: SchedChunk, quiet: number): boolean => c.end !== undefined && c.end <= quiet;\n\n/** \u4ECE pos \u8D77\u8BE5\u7B97\u7684\u987A\u5E8F\uFF08\u952E\uFF0C\u53BB\u91CD\uFF09\u3002loop = \u5FAA\u73AF\u533A\uFF08\u5230\u5C3E\u7ED5\u56DE from\uFF09\uFF1B\u6CA1\u6709 = \u540E\u9762\u7684\u7B97\u5B8C\u518D\u7B97\u524D\u9762\u7684\uFF08\u5F80\u56DE seek \u4E5F\u6709\uFF09\u3002 */\nexport function chunkOrder(chunks: readonly SchedChunk[], pos: number, loop: { from: number; to: number } | null, has: (key: string) => boolean, quiet = -Infinity): string[] {\n  const seen = new Set<string>(), out: string[] = [];\n  const add = (c: SchedChunk) => { if (!seen.has(c.key)) { seen.add(c.key); if (!has(c.key)) out.push(c.key); } };\n  const sorted = [...chunks].sort((a, b) => a.t0 - b.t0);\n  for (const c of sorted) if (c.t0 <= pos && c.t0 + c.dur > pos && !mutedAt(c, quiet)) add(c);   // \u6B63\u7AD9\u5728\u4E0A\u9762\u7684\uFF08\u8FD9\u6B21\u4E0D\u653E\u7684\u4E0D\u7B97\uFF09\n  for (const c of sorted) if (c.t0 > pos && (!loop || c.t0 < loop.to)) add(c);               // \u540E\u9762\u7684\uFF08\u5FAA\u73AF\u533A\u5185\uFF09\n  if (loop) for (const c of sorted) if (c.t0 >= loop.from && c.t0 <= pos) add(c);            // \u7ED5\u56DE\u53BB\uFF1A\u5FAA\u73AF\u5934\u5230\u64AD\u653E\u5934\n  for (const c of sorted) add(c);                                                             // \u5269\u4E0B\u7684\uFF08\u8303\u56F4\u5916 / \u524D\u9762\u7684\uFF09\n  return out;\n}\n/** \u9884\u5377\uFF1A\u4ECE pos \u8D77\u7684\u524D n \u5757\uFF08\u7AD9\u5728\u4E0A\u9762\u7684 + \u540E\u9762\u7684\uFF09\u90FD\u5230\u9F50\u4E86\u6CA1\u6709\u3002 */\nexport function readyToStart(chunks: readonly SchedChunk[], pos: number, n: number, has: (key: string) => boolean, quiet = -Infinity): boolean {\n  const sorted = [...chunks].sort((a, b) => a.t0 - b.t0), need: string[] = [];\n  for (const c of sorted) if (c.t0 + c.dur > pos && !mutedAt(c, quiet) && need.length < n && !need.includes(c.key)) need.push(c.key);\n  return need.every(has);\n}\n/** \u9884\u5377\u51E0\u5757\uFF1A\u6309\u8FD9\u53F0\u8BBE\u5907\u7684\u901F\u5EA6\uFF08\u7B97\u4E00\u79D2\u6B4C\u8981\u591A\u5C11\u6BEB\u79D2\uFF1B\u6CA1\u91CF\u8FC7 = \u4FDD\u5B88\uFF09\u2014\u2014\u6BD4\u5B9E\u65F6\u5FEB\u5F88\u591A = 2 \u5757\u5C31\u5F00\uFF0C\u6162 = \u591A\u6512\u51E0\u5757\u3002 */\nexport function prerollCount(msPerSongSec: number | null): number {\n  if (msPerSongSec === null) return 2;\n  return msPerSongSec < 400 ? 2 : msPerSongSec < 900 ? 3 : 4;\n}\n", "// names.ts \u2014\u2014 \u6CA1\u586B\u6B4C\u540D\u65F6\u7684\u9ED8\u8BA4\u6587\u4EF6\u540D = \u5BB6\u65CF\u7EA6\u5B9A `yyyymmdd-hex4`\uFF08\u5982 20261007-a1b2\uFF09\u3002created 2026-10-07 by Claude Opus 5.5\n// user 2026-10-07\u300C\u7EB8\u5F20\u7684\u6700\u4E0A\u9762\u52A0\u4E00\u4E2A\u53EF\u9009\u7684\u6B4C\u540D\u5427\uFF0C\u672A\u6765\u4E5F\u662F\u6587\u4EF6\u540D\uFF0C\u7528\u540C\u6837\u7684yyyymmdd hash\u7684\u9ED8\u8BA4\u89C4\u8303\uFF1B\u770B\u4E00\u4E0B\u9694\u58C1\u600E\u4E48\u505A\u7684\u300D\u3002\n// \u9694\u58C1\uFF1AWeebPaint src/naming.ts galleryDefaultName\uFF08\u6E90\u5934\uFF09\u3001CatsUp src/config.ts defaultDocName\u3001WXHW src/doc-model.ts makeDocName\n//   \uFF08\u300C\u6709\u540D\u4FDD\u540D\uFF0C\u65E0\u540D\u65E5\u671F\u300D\uFF1Bhex4 \u7528 crypto.getRandomValues\uFF09\u2014\u2014\u672C\u5730\u65E5\u671F + \u534A\u89D2 - + 4 \u4F4D\u5C0F\u5199 hex\uFF0C\u4E0D\u53EB\u300C\u672A\u547D\u540D\u300D\u3002\n// \u5BB6\u65CF\u5171\u4EAB\u5E93 @internal/gallery \u6709\u540C\u4E00\u4E2A\u683C\u5F0F\u7684 galleryDefaultName()\uFF1B2026-10-08 \u63A5 gallery \u65F6\u51B3\u5B9A\u7559\u8FD9\u4EFD\uFF08\u7EAF\u51FD\u6570\u3001\u6709\u6D4B\u8BD5\u3001\u4E0D\u8BA9 app \u5C42\u591A\u4E00\u4E2A\u5305\u7684\u503C\u7EA7 import \u70B9\uFF1B\u5B88\u536B\u53EA\u653E\u884C\u56DB\u4E2A\u6587\u4EF6\u62FF @internal/gallery\uFF09\u3002\nexport function defaultStem(now = new Date()): string {\n  const z = (n: number) => String(n).padStart(2, \"0\");\n  let r: number;\n  try { r = crypto.getRandomValues(new Uint16Array(1))[0]; } catch { r = Math.floor(Math.random() * 0x10000); }\n  return `${now.getFullYear()}${z(now.getMonth() + 1)}${z(now.getDate())}-${r.toString(16).padStart(4, \"0\")}`;\n}\n/** \u6B4C\u540D \u2192 \u80FD\u5F53\u6587\u4EF6\u540D\u7684\u6837\u5B50\uFF08\u53BB\u6389\u6587\u4EF6\u7CFB\u7EDF\u4E0D\u8BA4\u7684\u5B57\u7B26\uFF09\uFF1B\u7A7A = \u7A7A\u3002 */\nexport const fileSafe = (s: string): string => s.replace(/[\\\\/:*?\"<>|\\u0000-\\u001f]/g, \"\").trim();\n/** \u5BFC\u51FA\u4E00\u4EFD\u526F\u672C\u65F6\u7684\u6587\u4EF6\u540D = `\u540D-YYYYMMDD-HHMM`\uFF08WeebPaint 0825 \u62CD\u677F\u300C\u4E0B\u8F7D\u7248\u672C = \u540D-YYYYMMDD-HHMM\u300D\uFF1B\u5206\u949F\u7C92\u5EA6\uFF0C\u540C\u4E00\u5206\u949F\u518D\u5BFC\u5C31\u8BA9\u7CFB\u7EDF\u8865 (1)\uFF09\u3002\n *  added 2026-10-07 by Claude Fable 5.1\uFF08v0.3.0 \u5BFC\u51FA hub\u300C\u5B58\u4E00\u4EFD .mxl \u526F\u672C\u300D\uFF09\u3002 */\nexport function stampedCopy(stem: string, now = new Date()): string {\n  const z = (n: number) => String(n).padStart(2, \"0\");\n  return `${stem}-${now.getFullYear()}${z(now.getMonth() + 1)}${z(now.getDate())}-${z(now.getHours())}${z(now.getMinutes())}`;\n}\n", "// render-progress.ts \u2014\u2014 \u6E32\u67D3\u8FDB\u5EA6\u6761\uFF08\u9876\u680F\u5E95\u8FB9\u4E00\u6761\u7EC6\u7EBF\uFF09\u3002created 2026-10-08 \u6DF1\u591C by Claude Opus 5.5\n// user\u300C\u5176\u5B9E\u6211\u4E00\u76F4\u4E0D\u723D\u6E32\u67D3\u6CA1\u6709\u52A0\u8FDB\u5EA6\u6761\uFF0C\u4EE5\u540Emp3\u5BFC\u51FA\u8FD8\u662F\u6709\u6E32\u67D3\u7684\uFF0C\u52A0\u4E00\u4E0B\u8FDB\u5EA6\u6761\u300D\u300C\u90A3\u4E48\u987A\u4FBF\u505A\u4E00\u4E2A\u6E32\u67D3\u8FDB\u5EA6\u6761\u300D\u3002\n// \u4E0D\u8BB8\u8C0E\u62A5\uFF08\u5BB6\u89C4\u300C\u4E0D\u8BB8\u7164\u6C14\u706F\u300D\uFF09\uFF1A\u6E32\u67D3\u6309\u300C\u5355\u5143\u300D\u8D70\uFF08\u4E00\u4E2A\u58F0\u90E8 / \u4EE5\u540E\u4E00\u6BB5\u7EB8 = \u4E00\u683C\uFF1B\u6700\u540E\u6DF7\u97F3\u4E00\u683C\uFF09\u2014\u2014\u505A\u5B8C\u7684\u683C\u5B50\u5B9E\u5FC3\uFF1B\n//   \u6B63\u5728\u505A\u7684\u90A3\u4E00\u683C\u662F\u6D41\u52A8\u7684\u6761\u7EB9\uFF08\u53EA\u8BF4\u300C\u5728\u5E72\u6D3B\u300D\uFF0C\u4E0D\u5047\u88C5\u767E\u5206\u6BD4\uFF09\uFF1B\u53EA\u6709\u771F\u77E5\u9053\u767E\u5206\u6BD4\u7684\u65F6\u5019\uFF08\u4E0B\u8F7D\u6A21\u578B\uFF09\u90A3\u4E00\u683C\u624D\u6309\u6BD4\u4F8B\u586B\u3002\nexport class RenderProgress {\n  private el: HTMLDivElement; private fill: HTMLDivElement; private cur: HTMLDivElement;\n  private total = 0; private done = 0;\n  constructor(parent: HTMLElement) {\n    this.el = document.createElement(\"div\"); this.el.className = \"render-bar\"; this.el.hidden = true; this.el.setAttribute(\"role\", \"progressbar\");\n    this.fill = document.createElement(\"div\"); this.fill.className = \"rb-fill\";\n    this.cur = document.createElement(\"div\"); this.cur.className = \"rb-cur\";\n    this.el.append(this.fill, this.cur); parent.append(this.el);\n  }\n  /** \u5F00\u59CB\uFF1A\u4E00\u5171\u51E0\u683C\u3002 */\n  start(units: number): void { this.total = Math.max(1, units); this.done = 0; this.el.hidden = false; this.draw(null); }\n  /** \u5F53\u524D\u8FD9\u4E00\u683C\u77E5\u9053\u767E\u5206\u6BD4\u4E86\uFF080\u20131\uFF1B\u4E0B\u8F7D\uFF09\u3002null = \u4E0D\u77E5\u9053\uFF08\u6761\u7EB9\uFF09\u3002 */\n  frac(f: number | null): void { if (!this.el.hidden) this.draw(f); }\n  /** \u8FD9\u4E00\u683C\u505A\u5B8C\u3002 */\n  next(): void { this.done = Math.min(this.total, this.done + 1); this.draw(null); }\n  /** \u6536\u8D77\u3002 */\n  end(): void { this.el.hidden = true; }\n  get running(): boolean { return !this.el.hidden; }\n  private draw(f: number | null): void {\n    const w = 100 / this.total, left = this.done * w;\n    this.fill.style.width = `${left + (f !== null ? f * w : 0)}%`;\n    this.cur.style.left = `${left}%`; this.cur.style.width = `${this.done < this.total ? w : 0}%`;\n    this.cur.classList.toggle(\"known\", f !== null);\n    this.el.setAttribute(\"aria-valuenow\", String(Math.round(left + (f ?? 0) * w)));\n  }\n}\n", "// history.ts \u2014\u2014 \u64A4\u9500 / \u91CD\u505A\uFF08\u7EAF\u51FD\u6570\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\n// \u7F16\u8F91\u5668\u72B6\u6001\u662F\u7EAF\u6570\u636E\u3001\u6BCF\u6761\u547D\u4EE4\u662F\u7EAF\u51FD\u6570\uFF08song.ts\uFF09\uFF0C\u6240\u4EE5 undo = \u300C\u6BCF\u53D8\u4E00\u6B21\uFF0C\u628A\u53D8\u4E4B\u524D\u7684 song / extras / \u5149\u6807 / \u9009\u4E2D\u5B58\u4E00\u4EFD\u300D\u2014\u2014\n//   \u548C\u5177\u4F53\u662F\u4EC0\u4E48\u64CD\u4F5C\u65E0\u5173\uFF1A\u4EE5\u540E\u52A0\u8DF3\u97F3 / \u529B\u5EA6 / \u7B14\u5DE5\u5177\uFF0C\u53EA\u8981\u7167\u5E38\u8D70 update() / updateExtras()\uFF0C\u81EA\u52A8\u5728 undo \u91CC\uFF08user 2026-10-08 \u4E24\u4E2A\u9009\u62E9\u91CC\u9009\u4E86\u300C\u5148\u505A undo\u300D\uFF1B\n//   \u300C\u73B0\u5728\u6211\u4EEC\u7684\u64CD\u4F5C\u5E94\u8BE5\u662F\u4E2A\u7FA4\uFF0C\u53EA\u662F\u9EBB\u70E6\u4E00\u70B9\u300D\uFF09\u3002\u5FEB\u7167\u662F\u5F15\u7528\uFF08\u7ED3\u6784\u5171\u4EAB\uFF09\uFF0C\u4E0D\u62F7\u8D1D\u5B57\u8282\u3002\n// 2026-10-08 \u4E0A\u5348\u6269\u5230 extras\uFF08user\u300C\u6BCF\u4E00\u6B65\u5FEB\u7167\u5E26 locus \u540C\u610F\u300D\u300Cundo \u540C\u610F\u554A\u300D\u300Cundo \u53EF\u4EE5\u53C2\u8003 weebpaint \u7684\u89C6\u56FE vs \u6587\u4EF6\u3002\u89C6\u56FE\u4F1A\u987A\u624B\u635E\u8FDB\u6587\u4EF6\u300D\uFF09\uFF1A\n//   **\u5224\u636E\u53EA\u6709\u300C\u8FDB\u4E0D\u8FDB\u6587\u4EF6\u300D**\u2014\u2014\u8C31\u3001\u4F11\u606F\u5BA4\uFF08\u9009\u89D2 / \u5019\u9009\uFF09\u3001\u9EA6\u514B\u98CE\u589E\u76CA\u58F0\u50CF\u3001\u5C01\u9762\u90FD\u662F\u6587\u4EF6\u5185\u5BB9 \u2192 \u540C\u4E00\u6761\u6808\uFF1B\u89C6\u56FE\u6001\uFF08\u9759\u97F3 / \u72EC\u594F / \u53EA\u770B\u3001\u5F53\u524D\u7EB8\u3001\u6392\u6CD5\uFF09\n//   \u662F desk\uFF08src/score/desk.ts\uFF09\uFF1A\u5B58\u65F6\u987A\u624B\u635E\u8FDB\u6587\u4EF6\u3001\u4E0D\u6807\u810F\u3001\u4E0D\u8FDB undo\u3002\u6BCF\u4E00\u6B65\u5E26 **locus**\uFF08\u5728\u54EA\u4E00\u5757\u3001\u6539\u4E86\u4EC0\u4E48\uFF09\uFF1Aundo \u65F6\u89C6\u56FE\u8DDF\u7740\u8D70 + toast \u8BF4\u660E\u64A4\u4E86\u4EC0\u4E48\uFF0C\n//   \u9632\u300C\u591A\u6309\u51E0\u6B21\u9759\u9ED8\u53D8\u4E86\u6CA1\u5728\u770B\u7684\u7EB8 / \u58F0\u90E8 / \u6A21\u5757\u300D\uFF08user 2026-10-08 \u7684\u987E\u8651\uFF09\u3002\u7EB8 / \u58F0\u90E8\u4ECE\u5FEB\u7167\u7684 at \u91CC\u6765\uFF0Clocus \u53EA\u8BF4\u6A21\u5757 + \u4EBA\u8BDD\u3002\n// \u8FDE\u7EED\u52A8\u4F5C\u5E76\u6210\u4E00\u6B65\uFF1A\u62D6\u97F3\u9AD8 / \u62D6\u65F6\u503C\uFF08gesture \"drag\"\uFF09\u3001\u6B4C\u8BCD\u6846\u91CC\u8FDE\u6253\uFF08\"lyric\"\uFF09\u3001\u63A8\u5B50\uFF08\"mix:\u2026\"\uFF09\u2014\u2014\u540C\u4E00\u4E2A gesture 1.5 s \u5185\u8FDE\u7740\u6765 = \u540C\u4E00\u6B65\uFF08\u7559\u7B2C\u4E00\u6B21\u4E4B\u524D\u7684\u5FEB\u7167\uFF0Clocus \u7528\u6700\u65B0\u7684\uFF09\u3002\n// \u8F93\u5165\u72B6\u6001\uFF08\u957F\u77ED\u57FA\u7EBF\u3001\u5347\u964D Shift\uFF09\u4E0D\u8FDB undo\uFF1B\u300C\u672C\u6B21\u8F93\u5165\u8BB0\u5F55\u300D\uFF08\u9000\u683C\u64A4\u56DE\u521A\u5199\u7684\uFF09\u5728 undo \u540E\u6E05\u7A7A\uFF08\u90A3\u4E9B token \u53EF\u80FD\u5DF2\u7ECF\u4E0D\u5728\u4E86\uFF09\u3002\nimport type { EditorState, Song, Focus } from \"./song.ts\";\nimport { trackOf } from \"./song.ts\";\nimport type { Extras } from \"../format/project.ts\";\n\n/** \u8FD9\u4E00\u6B65\u6539\u5728\u54EA\u4E00\u5757\uFF1Ascore = \u8C31\uFF08\u7EB8 / \u58F0\u90E8\u770B\u5FEB\u7167\u7684 at\uFF09\uFF1Blounge = \u4F11\u606F\u5BA4\uFF08\u9009\u89D2 / \u5019\u9009 / \u89D2\u8272\u540D\uFF09\uFF1Bstudio = \u5F55\u97F3\u5BA4\uFF08\u9EA6\u514B\u98CE\uFF09\uFF1Bcover = \u5C01\u9762\uFF1Bpaper = \u7EB8\uFF08\u52A0 / \u5220 / \u9690\u85CF\uFF09\u3002 */\nexport type LocusKind = \"score\" | \"lounge\" | \"studio\" | \"cover\" | \"paper\" | \"final\";   // final = \u5B9A\u7A3F / \u6539\u7A3F\uFF082026-10-16\uFF1B\u4E0D\u8FDB\u64A4\u9500\u6808\uFF0C\u53EA\u7ED9\u9501\u653E\u884C\u7528\uFF09\nexport interface Locus { kind: LocusKind; label: string }\nexport interface Snap { song: Song; extras: Extras; at: Focus; caret: number; sel: { from: number; to: number } | null; locus: Locus }\nexport interface History { past: Snap[]; future: Snap[]; lastKey: string | null; lastAt: number }\nexport const LIMIT = 200, COALESCE_MS = 1500;\n\nexport const emptyHistory = (): History => ({ past: [], future: [], lastKey: null, lastAt: 0 });\nexport const snapOf = (st: EditorState, extras: Extras, locus: Locus): Snap => ({ song: st.song, extras, at: st.at, caret: st.caret, sel: st.sel, locus });\nconst applySnap = (st: EditorState, s: Snap): EditorState => ({ ...st, song: s.song, at: s.at, caret: s.caret, sel: s.sel, log: [] });\n\n/** \u8BB0\u4E00\u6B65\uFF1Aprev / prevExtras = \u6539\u4E4B\u524D\u7684\u72B6\u6001\uFF1Blocus = \u8FD9\u4E00\u6B65\u6539\u4E86\u4EC0\u4E48\u3002gesture \u76F8\u540C\u4E14 COALESCE_MS \u5185 = \u540C\u4E00\u4E2A\u8FDE\u7EED\u52A8\u4F5C\uFF0C\u4E0D\u53E6\u8BB0\uFF08future \u7167\u6837\u6E05\u6389\uFF1Blocus \u6362\u6210\u6700\u65B0\u7684\u90A3\u53E5\u8BDD\uFF09\u3002 */\nexport function record(h: History, prev: EditorState, prevExtras: Extras, gesture: string | null, now: number, locus: Locus): History {\n  if (gesture && gesture === h.lastKey && now - h.lastAt < COALESCE_MS && h.past.length) {\n    const last = h.past[h.past.length - 1];\n    return { ...h, past: [...h.past.slice(0, -1), { ...last, locus }], future: [], lastAt: now };\n  }\n  const snap = snapOf(prev, prevExtras, locus);\n  const past = h.past.length >= LIMIT ? [...h.past.slice(1), snap] : [...h.past, snap];\n  return { past, future: [], lastKey: gesture, lastAt: now };\n}\nexport interface Restored { h: History; st: EditorState; extras: Extras; locus: Locus }\n/** \u64A4\u9500\uFF1A\u56DE\u5230\u4E0A\u4E00\u4EFD\u5FEB\u7167\uFF1B\u73B0\u5728\u7684\u72B6\u6001\u8FDB future\uFF08\u5E26\u7740\u540C\u4E00\u4E2A locus\u2014\u2014\u91CD\u505A\u65F6\u8FD8\u662F\u8FD9\u53E5\u8BDD\uFF09\u3002\u6CA1\u6709\u53EF\u64A4\u7684 = null\u3002 */\nexport function undo(h: History, cur: EditorState, curExtras: Extras): Restored | null {\n  if (!h.past.length) return null;\n  const snap = h.past[h.past.length - 1];\n  return { h: { past: h.past.slice(0, -1), future: [...h.future, snapOf(cur, curExtras, snap.locus)], lastKey: null, lastAt: 0 }, st: applySnap(cur, snap), extras: snap.extras, locus: snap.locus };\n}\n/** \u91CD\u505A\u3002 */\nexport function redo(h: History, cur: EditorState, curExtras: Extras): Restored | null {\n  if (!h.future.length) return null;\n  const snap = h.future[h.future.length - 1];\n  return { h: { past: [...h.past, snapOf(cur, curExtras, snap.locus)], future: h.future.slice(0, -1), lastKey: null, lastAt: 0 }, st: applySnap(cur, snap), extras: snap.extras, locus: snap.locus };\n}\n\nconst body = (song: Song, at: Focus) => trackOf(song, at.paper, at.part).filter((t) => t.kind !== \"key\" && t.kind !== \"time\" && t.kind !== \"tempo\");\n/** \u8C31\u7684\u4E00\u6B65\u6539\u4E86\u4EC0\u4E48\uFF08\u4EBA\u8BDD\uFF0C\u7ED9 toast\uFF09\uFF1A\u770B\u5149\u6807\u6240\u5728 track \u7684 token \u6570\u53D8\u5316\uFF1B\u6570\u6CA1\u53D8\u518D\u770B\u6B4C\u540D / \u4F5C\u8005\u680F / \u7EB8\u6570 / \u58F0\u90E8\u6570\uFF1B\u90FD\u6CA1\u53D8 = \u300C\u6539\u300D\u3002\u7EAF\u51FD\u6570\uFF0C\u4FBF\u5B9C\u3002 */\nexport function describeSongChange(prev: EditorState, next: EditorState): Locus {\n  const a = prev.song, b = next.song;\n  if (a.papers.length !== b.papers.length) return { kind: \"paper\", label: b.papers.length > a.papers.length ? \"\u52A0\u4E86\u4E00\u5F20\u7EB8\" : \"\u5220\u4E86\u4E00\u5F20\u7EB8\" };\n  if (a.parts.length !== b.parts.length) return { kind: \"score\", label: b.parts.length > a.parts.length ? \"\u52A0\u4E86\u4E00\u4E2A\u58F0\u90E8\" : \"\u5220\u4E86\u4E00\u4E2A\u58F0\u90E8\" };\n  if (a.parts.some((p, k) => p.id !== b.parts[k]?.id)) return { kind: \"score\", label: \"\u632A\u4E86\u58F0\u90E8\u987A\u5E8F\" };\n  const d = body(b, prev.at).length - body(a, prev.at).length;\n  if (d > 0) return { kind: \"score\", label: `\u5199\u4E86 ${d} \u4E2A` };\n  if (d < 0) return { kind: \"score\", label: `\u5220\u4E86 ${-d} \u4E2A` };\n  if ((a.title ?? \"\") !== (b.title ?? \"\")) return { kind: \"score\", label: \"\u6539\u6B4C\u540D\" };\n  if ((a.credits ?? \"\") !== (b.credits ?? \"\")) return { kind: \"score\", label: \"\u6539\u4F5C\u8005\u680F\" };\n  const pa = a.papers.find((p) => p.id === prev.at.paper), pb = b.papers.find((p) => p.id === prev.at.paper);\n  if (pa && pb && !!pa.hidden !== !!pb.hidden) return { kind: \"paper\", label: pb.hidden ? \"\u9690\u85CF\u4E86\u8FD9\u5F20\u7EB8\" : \"\u53D6\u6D88\u9690\u85CF\u8FD9\u5F20\u7EB8\" };\n  if (pa && pb && pa.name !== pb.name) return { kind: \"paper\", label: \"\u6539\u66F2\u6BB5\u540D\" };\n  return { kind: \"score\", label: \"\u6539\" };\n}\n", "// performance.ts \u2014\u2014 \u5531\u6B4C / \u64AD\u653E / \u5BFC\u51FA\u7684\u80F6\u6C34\uFF08\u5C4E\u5C71\u7EF4\u62A4\u7EAA\u5143\u5200 1 \u4E4B\u4E8C\uFF0C2026-10-14 \u4ECE main.ts \u62BD\u51FA\uFF1Bcreated by Claude Fable 5.1\uFF1B\u5BB6\u65CF\u5468\u8D26 F-13\uFF09\u3002\n//   \u8C31 \u2192 \u65F6\u95F4\u7EBF\uFF08src/engine/timeline.ts\uFF09\u2192 \u5F55\u97F3\u623F\uFF08src/engine/studio*.ts\uFF09\u8FD9\u6761\u8DEF\u4E0A\u300C\u8C01\u3001\u4EC0\u4E48\u65F6\u5019\u3001\u653E\u54EA\u4E00\u6BB5\u300D\u7684\u51B3\u5B9A\u90FD\u5728\u8FD9\u91CC\uFF1A\n//   \u51FA\u58F0\u53C2\u6570\uFF08performerInfo\uFF09/ \u5404\u4F4D\u7684\u51C6\u5907\uFF08prepareBanks \u2192 \u63D2\u4EF6\uFF09/ \u6708\u8BFB\u7684\u5757\uFF1A\u8C03\u5EA6 + \u6CF5\uFF08\u5200 2\uFF09/ \u8D1F\u8F7D\u4E0E\u5185\u5B58\u76D1\u63A7\uFF08\u5200 6 \u2463\uFF09/ \u8D70\u5E26\uFF08\u8D77\u70B9 \u00B7 \u7EED\u64AD \u00B7 \u56DE\u8D77\u70B9 \u00B7 \u63A5\u7F1D \u00B7 \u5FAA\u73AF\uFF09/\n//   \u64AD\u653E\u5934\u4E0E\u7FFB\u8C31 / \u653E\u7740\u65F6\u6539\u8C31\u7684\u91CD\u7B97 / \u9884\u5531 / mp3 \u5BFC\u51FA / \u6309\u952E\u8BD5\u542C\u8981\u7684\u5E93\u3002\u754C\u9762\uFF08\u94AE\u3001\u83DC\u5355\u3001\u9762\u677F\uFF09\u548C\u6587\u4EF6\u90FD\u4E0D\u5728\u8FD9\u91CC\u2014\u2014main.ts \u901A\u8FC7 PerfHost \u7ED9\u8BBF\u95EE\u5668\uFF0C\u8FD9\u91CC\u53EA\u56DE\u8C03\u3002\n//   \u539F\u6587\u4E00\u5B57\u4E0D\u6539\u5730\u642C\u8FC7\u6765\uFF08\u6CE8\u91CA\u91CC\u7684 user \u539F\u8BDD\u4E0E\u65E5\u671F\u662F\u642C\u5BB6\u524D\u7684\uFF09\uFF0C\u53EA\u628A st / doc.extras / viewScope / busMuted \u6362\u6210 host \u7684\u8BBF\u95EE\u5668\uFF1B\u884C\u4E3A\u4E0E v0.12.1 \u76F8\u540C\u3002\n//   \u5F62\u72B6 = createPerformance(host) \u2192 \u4E00\u7EC4\u51FD\u6570 + \u51E0\u4E2A getter / setter\uFF08\u8D70\u5E26\u6001\u662F\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\u7684\u4E1C\u897F\uFF0C\u4E0D\u8FDB\u6B4C\uFF09\u3002\nimport { APP_VERSION } from \"../version.ts\";\nimport { DEFAULT_TIME, WHOLE, isTimed, type EditorState, type Song, type PartDef, timeline, songOnlyPaper, flattenPart } from \"../score/song.ts\";\nimport { songPlayOrder, parseArrangement } from \"../score/arrange.ts\";\nimport { timeMapOf } from \"../score/groove.ts\";\nimport { ScoreView } from \"../ui/score-view.ts\";\nimport { Singer } from \"../singer/client.ts\";\nimport { budgetFor, advise, trimOnSongSwitch, totalBytes, AUDIO_HOT, type DeviceInfo, type Snapshot } from \"./resource-watch.ts\";\nimport type { LoadInfo } from \"../engine/studio-client.ts\";\nimport { holdAudio, releaseAudio } from \"../singer/audio.ts\";\nimport { encodeMp3, MP3_QUALITY, type Mp3Quality } from \"../export/mp3.ts\";\nimport { id3v2, firstUrl } from \"../export/id3.ts\";\nimport { roleName, activeGm, activeInstrument, type Extras, type GmCandidate, partLabels, activeId } from \"../format/project.ts\";\nimport { performerCredits, licenseHints, creditsText, type CreditLine } from \"../format/credits.ts\";\nimport { StudioClient } from \"../engine/studio-client.ts\";\nimport { performerOf } from \"../performers/index.ts\";\nimport type { TrackSpec } from \"../engine/studio.ts\";\nimport { LEAD_IN, PRE_ROLL, type Timeline, type PerformerInfo, type ChunkPlan } from \"../engine/timeline.ts\";\nimport { humOpt, audibleParts as audiblePartsOf, performerInfoOf, prepareParts, micOf as micOfCore, channelOf as channelOfCore, lowestMidiOf as lowestMidiCore, songBpm as songBpmOf, pushMix, timelineOf, renderSong, toMono, RENDER_SR, type RenderDeps, type RenderPlan } from \"../core/render.ts\";\nimport { chunkOrder, readyToStart, prerollCount } from \"../engine/scheduler.ts\";\nimport { fileSafe, stampedCopy } from \"./names.ts\";\nimport { RenderProgress } from \"../ui/render-progress.ts\";\nimport { reportError, diagNote } from \"./report-error.ts\";\nimport { undo } from \"../score/history.ts\";\n\n/** \u80F6\u6C34\u5411\u5BBF\u4E3B\u8981\u7684\u4E1C\u897F\uFF08main.ts \u7ED9\uFF09\uFF1A\u72B6\u6001\u53EA\u8BFB\u8BBF\u95EE\u5668 + \u51E0\u4E2A\u754C\u9762 / \u97F3\u6E90 / \u7F72\u540D\u7684\u53E3\uFF1B\u80F6\u6C34\u4E0D\u78B0 DOM\u3001\u4E0D\u78B0\u6587\u4EF6\u3001\u4E0D\u78B0 undo\u3002 */\nexport interface PerfHost {\n  state(): EditorState;\n  extras(): Extras;\n  viewScope(): \"all\" | \"segment\";\n  pv(id: string): { muted: boolean; solo: boolean };\n  busMuted(): ReadonlySet<string>;\n  curRole(): string;\n  docName(): string;\n  engine: StudioClient;\n  singer: Singer;\n  view: Pick<ScoreView, \"setPlayhead\" | \"setStartMark\">;\n  ui: { progress(s: string): void; info(s: string): void; showError(s: string): void; renderBar: RenderProgress; playBtns(): HTMLElement[]; playIcon(playing: boolean): void; offerFile(file: File, title: string, msg: string): void; onIssues(list: readonly Issue[]): void };\n  sounds: { resolveGmBytes(g: GmCandidate): Promise<Uint8Array>; ensureVowels(): Promise<void>; soundMemoryBytes(): number; modelBases(): string[] };\n  credits: { creditsOf(roles: readonly string[], rights: string | undefined): { lines: CreditLine[] }; creditsBlock(lines: CreditLine[], title: string): string };\n  /** \u5B9A\u7A3F\u7740\u7684\u6B4C\uFF1A\u5B9A\u7A3F\u90A3\u4EFD mp3\uFF08\u88F8\u7684\uFF0C\u6CA1\u6709 ID3\uFF09+ \u5B83\u7684\u53C2\u6570 + \u5F53\u65F6\u51FA\u4E86\u58F0\u7684\u58F0\u90E8\u7684\u89D2\u8272\uFF08\u7F72\u540D\uFF09\uFF1B\u6CA1\u5B9A\u7A3F = null\u3002\u5BFC\u51FA mp3 \u65F6\u76F4\u63A5\u7ED9\u8FD9\u4E00\u4EFD\u3001\u4E0D\u91CD\u6E32\u3002 */\n  final?(): { mp3: Uint8Array; secs: number; kbps: number; stereo: boolean; roles: string[] } | null;\n}\n\n/** \u6E32\u67D3\u54EA\u4E00\u6BB5\uFF1Aview = \u8DDF\u89C6\u56FE\uFF08\u672C\u6BB5 / \u5168\u90E8\uFF0C\u64AD\u653E\u7528\uFF09\uFF1Ball = \u6574\u9996\uFF1Bsegment = \u5149\u6807\u6240\u5728\u7684\u8FD9\u4E00\u5F20\u7EB8\uFF08\u5BFC\u51FA\u9762\u677F\u91CC\u9009\uFF09\u3002 */\nexport type RenderScope = \"view\" | \"all\" | \"segment\";\n\n/** \u300C\u8FD9\u4F4D\u6709\u4E8B\u300D\uFF08ADR-0004 \u00A72.2\u00BD \u4E00\u5957\u673A\u5236\u3001\u56DB\u4E2A\u51FA\u53E3\uFF1Buser 2026-10-14\u300C\u4E00\u5957\u673A\u5236\u3001\u56DB\u4E2A\u51FA\u53E3 \u540C\u610F\u300D\uFF09\uFF1A\u73B0\u5728\u6B4C\u91CC\u6709\u97F3\u7684\u58F0\u90E8\u91CC\u51FA\u4E0D\u4E86\u58F0\u7684\u90A3\u51E0\u4F4D\u3002\n *  kind\uFF1Aunknown = \u8BA4\u4E0D\u51FA / \u8FD8\u6CA1\u6709\u4EBA\u4E0A\u573A\uFF1Bsound = \u627E\u4E0D\u5230\u58F0\u97F3\uFF08\u5F31\u5F15\u7528\u89E3\u6790\u5931\u8D25\uFF09\uFF1Bunplayable = \u522B\u7684\u51FA\u58F0\u5931\u8D25\uFF1Bupgrade / substitute = \u7559\u7ED9\u683C\u5F0F\u90A3\u4E00\u5200\uFF08\u7248\u672C\u6BD4\u5BF9\uFF0C\u00A72.2\uFF09\u3002 */\nexport type IssueKind = \"unknown\" | \"sound\" | \"unplayable\" | \"upgrade\" | \"substitute\";\nexport interface Issue { part: string; role: string; label: string; kind: IssueKind; why: string }\n\nexport type Performance = ReturnType<typeof createPerformance>;\n\nexport function createPerformance(host: PerfHost) {\n  const { engine, singer, view } = host;\n  const { progress, info, showError, renderBar, playBtns, playIcon, offerFile } = host.ui;\n  const { resolveGmBytes, ensureVowels, soundMemoryBytes, modelBases } = host.sounds;\n  const { creditsOf, creditsBlock } = host.credits;\n  const escHtml = (x: string): string => x.replace(/[&<>\"]/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\" })[c] ?? c);\n  const st = () => host.state(), extras = () => host.extras(), pv = (id: string) => host.pv(id), curRole = () => host.curRole(), docName = () => host.docName();\n  void info;\n\n  // \u54FC\u7684\u53C2\u6570 humOpt / \u51FA\u58F0\u7684\u58F0\u90E8 / \u51FA\u58F0\u53C2\u6570 / \u51C6\u5907 / \u901A\u9053\u6362\u7B97 / \u65F6\u95F4\u7EBF / \u6574\u9996\u6E32\u67D3 = \u65E0\u5934\u6E32\u67D3\u6838\u5FC3 src/core/render.ts\uFF082026-10-16 \u62BD\u51FA\uFF1Bnode \u7684 scripts/render-song.mjs \u4E5F\u8C03\u5B83\uFF09\n  /** \u64AD\u653E / \u8BD5\u542C\u7684\u8303\u56F4\u8DDF\u7740\u89C6\u56FE\u8D70\uFF1A\u672C\u6BB5 = \u53EA\u6709\u5149\u6807\u6240\u5728\u7684\u7EB8\uFF1B\u5168\u90E8 = \u6574\u9996\uFF08\u5BFC\u51FA\u9762\u677F\u53E6\u9009\uFF09\u3002user 2026-10-08\u300C\u4E3A\u4EC0\u4E48\u5728\u672C\u6BB5\u89C6\u56FE\u4E0B\u64AD\u653E\u8FD8\u662F\u64AD\u653E\u5168\u90E8\u4E86\uFF1F\u300D */\n  const playSong = (): Song => (host.viewScope() === \"segment\" ? songOnlyPaper(st().song, st().at.paper) : st().song);\n  /** \u5149\u6807\u6240\u5728\u58F0\u90E8\u538B\u5E73\u540E\u7684\u4E00\u4E32 + \u901F\u5EA6\u8868\uFF08\u627E\u4EBA\u89C6\u56FE\u300C\u542C\u5F00\u5934\u300D\u3001\u6D4B\u8BD5\u94A9\u5B50\u7528\uFF09\u3002 */\n  const curFlat = () => { const s = playSong(), order = songPlayOrder(s); return { tokens: flattenPart(s, st().at.part, { order }).tokens, map: timeMapOf(s, order) }; };\n  /** \u6E32\u67D3\u54EA\u4E00\u6BB5\uFF1Aview = \u8DDF\u89C6\u56FE\uFF08\u672C\u6BB5 / \u5168\u90E8\uFF0C\u64AD\u653E\u7528\uFF09\uFF1Ball = \u6574\u9996\uFF1Bsegment = \u5149\u6807\u6240\u5728\u7684\u8FD9\u4E00\u5F20\u7EB8\uFF08\u5BFC\u51FA\u9762\u677F\u91CC\u9009\uFF09\u3002 */\n  const songIn = (s: RenderScope): Song => (s === \"all\" ? st().song : s === \"segment\" ? songOnlyPaper(st().song, st().at.paper) : playSong());\n  const GM_SR = RENDER_SR;   // \u5BFC\u51FA\u7684\u91C7\u6837\u7387\n  /** \u51FA\u58F0\u7684\u58F0\u90E8\uFF1A\u6709\u72EC\u594F\u7684\u53EA\u51FA\u72EC\u594F\u7684\uFF0C\u5426\u5219\u51FA\u6CA1\u9759\u97F3\u7684\uFF08user\u300C\u4E0D\u540C\u7684\u58F0\u90E8\u89C6\u56FE\u548C\u51FA\u58F0\u5E94\u8BE5\u5206\u522B\u53EF\u4EE5solo\u548Chide\u300D\uFF09\u3002 */\n  const audibleParts = (): PartDef[] => audiblePartsOf(st().song, pv);\n  /** \u5F55\u97F3\u623F\u91CC\u8FD9\u4E2A\u58F0\u90E8\u7684\u9EA6\u514B\u98CE\uFF08\u589E\u76CA dB\u3001\u58F0\u50CF \u22121\u20261\uFF09\uFF1B\u6CA1\u6709 = 0 / 0\u3002 */\n  const micOf = (part: PartDef): { gainDb: number; pan: number } => micOfCore(extras(), part);\n  /** \u8FD9\u6761\u901A\u9053 = \u9EA6\u514B\u98CE\u589E\u76CA + \u4E0A\u573A\u90A3\u4F4D\u7684\u54CD\u5EA6\u6821\u51C6\u3002 */\n  const channelOf = (part: PartDef): { gainDb: number; pan: number } => channelOfCore(extras(), part);\n  /** \u8FD9\u6B21\u6253\u5F00\u91CC\u7684\u6E32\u67D3\u8BA1\u5212\uFF08\u6838\u5FC3\u8BA4\u7684\u5F62\u72B6\uFF09\uFF1A\u6B4C / \u4F11\u606F\u5BA4 / \u54FC / \u51FA\u58F0\u7684\u58F0\u90E8 / \u6548\u679C\u5168\u5173 / \u9759\u97F3\u7684\u6DF7\u97F3\u8F68\u3002 */\n  const planOf = (song: Song, parts: readonly PartDef[], raw = mixBypass): RenderPlan => ({ song, extras: extras(), hum: st().song.hum, parts, mixBypass: raw, busMuted: host.busMuted() });\n  /** \u6838\u5FC3\u8981\u7684\u6CE8\u5165\uFF1A\u5F55\u97F3\u623F = \u8FD9\u4E2A app \u7684 StudioClient\uFF1B\u97F3\u6E90 / \u5143\u97F3\u8868 = \u5BBF\u4E3B\u7684\u6765\u6E90\uFF1B\u5757 = \u8FD9\u91CC\u7684\u6CF5\uFF08awaitAllChunks\uFF09\u3002 */\n  const deps: RenderDeps = { engine, sounds: { resolveGmBytes, ensureVowels }, sing: (tl) => awaitAllChunks(tl) };\n  /** \u6548\u679C\u5168\u5173\uFF08A/B\uFF0C\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\u3001\u6362\u6B4C\u590D\u4F4D\uFF1Bv0.10.18\uFF0Cuser\u300C\u6DF7\u97F3\u53F0\u52A0\u4E00\u4E2A\u6682\u65F6\u7981\u7528\u6240\u6709\u9B54\u6CD5\u7684toggle\uFF0C\u4E0D\u8FC7fade\u548Cpan\u8981\u4E0D\u8981\u7559\uFF1F\uFF08\u5C31\u662F\u7ED9\u4F60\u56DE\u5230musescore/\u8C31\u5B50\u672C\u8EAB\u7528\u7684\uFF0C\u4EE5\u53CA\u542C\u5DEE\u522B\uFF09\u300D\uFF09\uFF1A\n   *  \u6240\u6709\u63D2\u4EF6\u683C\uFF08\u6B4C\u624B / \u6DF7\u97F3\u8F68 / \u603B\u8F68\uFF09+ \u6240\u6709\u53D1\u9001\u4E0D\u54CD\uFF1B\u63A8\u5B50\u3001\u58F0\u50CF\u3001\u51FA\u5230\u3001\u603B\u8F68\u9650\u5E45\u7559\u7740\uFF08A/B \u4E24\u8FB9\u97F3\u91CF\u6446\u5F97\u4E00\u6837\uFF0C\u542C\u7684\u624D\u662F\u6548\u679C\u7684\u5DEE\u522B\uFF09\u3002\u5BFC\u51FA\u7167\u5E38\u5E26\u6548\u679C\u3002 */\n  let mixBypass = false;\n  /** \u901A\u9053\u53C2\u6570\u63A8\u8FDB\u5F55\u97F3\u623F\uFF08\u6362\u7B97\u5728\u6838\u5FC3 mixParamsOf\uFF1A\u81EA\u52A8\u4F4E\u5207 / \u5EF6\u8FDF\u8DDF\u901F\u5EA6\uFF1B\u64AD\u653E\u65F6\u624D\u4E58 \u2192 \u8FB9\u653E\u8FB9\u8C03\u7ACB\u523B\u542C\u89C1\uFF09\u3002 */\n  function pushChannels(raw = mixBypass): void { pushMix(engine, planOf(st().song, st().song.parts, raw), pv); }\n  /** \u8FD9\u4F4D\u6B4C\u624B\u5168\u66F2\u6700\u4F4E\u7684\u97F3\uFF08\u81EA\u52A8\u4F4E\u5207\u7528\uFF1B\u6CA1\u6709\u97F3 = null\uFF09\u3002 */\n  const lowestMidiOf = (partId: string): number | null => lowestMidiCore(st().song, partId);\n  /** \u6B4C\u5F00\u5934\u7684\u901F\u5EA6\uFF08\u5EF6\u8FDF\u300C\u8DDF\u901F\u5EA6\u300D\u7528\uFF09\u3002 */\n  const songBpm = (): number => songBpmOf(st().song);\n  /** \u4E0A\u573A\u90A3\u4F4D\u7684\u51FA\u58F0\u53C2\u6570\uFF08\u6838\u5FC3 performerInfoOf\uFF1BSoundFont \u7684\u9884\u8BBE\u4E0B\u6807\u8981\u5E93\u5148\u8FDB\u5F55\u97F3\u623F\uFF09\u3002 */\n  const performerInfo = (part: PartDef): PerformerInfo => performerInfoOf(extras(), part, (sha, bank, program) => engine.presetIndex(sha, bank, program));\n  /** \u8FD9\u4E9B\u58F0\u90E8\u4E0A\u573A\u90A3\u4F4D\u5404\u81EA\u7684\u51FA\u58F0\u51C6\u5907\uFF08\u6838\u5FC3 prepareParts \u2192 \u63D2\u4EF6\uFF09\u3002\u8FD4\u56DE\u62A5\u9519\u6E05\u5355\u3002 */\n  const prepareBanks = (parts: readonly PartDef[]) => prepareParts(parts, extras(), deps);\n  // \u2500\u2500 \u4E00\u5957\u673A\u5236\u3001\u56DB\u4E2A\u51FA\u53E3\uFF08ADR-0004 \u00A72.2\u00BD\uFF09\uFF1A\u4E00\u5F20 issues \u6E05\u5355\uFF1B\u51FA\u53E3 = \u8C31\u4E0A\u89D2\u6807 / |\u25B6 \u89D2\u6807 + \u6E05\u5355\u9762\u677F / \u6E05\u5355\u53D8\u4E86\u624D\u4E00\u6761 toast / \u5BFC\u51FA\u9762\u677F\u4E00\u884C\uFF08\u540E\u4E09\u4E2A\u5728 main.ts\uFF09\u2500\u2500\n  let issues: Issue[] = [], issuesKey = \"\";\n  const prepErrs = new Map<string, { cand: string; kind: IssueKind; why: string }>();   // \u4E0A\u4E00\u6B21\u51C6\u5907\uFF08\u64AD\u653E / \u5BFC\u51FA\uFF09\u91CC\u51FA\u4E0D\u4E86\u58F0\u7684\uFF1A\u6309\u58F0\u90E8\u8BB0\uFF0C\u5E26\u7740\u5F53\u65F6\u4E0A\u573A\u7684\u5019\u9009 id\u2014\u2014\u6362\u4E86\u4EBA\u5C31\u4E0D\u7B97\n  const hasNotes = (partId: string): boolean => st().song.papers.some((pp) => (pp.tracks[partId] ?? []).some((t) => t.kind === \"note\"));\n  function computeIssues(): Issue[] {\n    const labels = partLabels(st().song, extras());\n    return st().song.parts.flatMap((p, k): Issue[] => {\n      if (!hasNotes(p.id)) return [];   // \u6CA1\u5199\u97F3\u7684\u58F0\u90E8\u4E0D\u51FA\u58F0\u4E5F\u4E0D\u4E22\u4EC0\u4E48\n      const plugin = performerOf(activeInstrument(extras(), p.role)?.engine);\n      if (!plugin) return [{ part: p.id, role: p.role, label: labels[k], kind: \"unknown\", why: \"\u8FD8\u6CA1\u6709\u4EBA\u4E0A\u573A\uFF08\u522B\u7684\u8F6F\u4EF6\u539F\u6765\u7684\u4E50\u5668\uFF0C\u8FD9\u4E00\u7248\u8BA4\u4E0D\u51FA\uFF09\" }];\n      const e = prepErrs.get(p.id);\n      return e && e.cand === activeId(extras(), p.role) ? [{ part: p.id, role: p.role, label: labels[k], kind: e.kind, why: e.why }] : [];\n    });\n  }\n  const issuesText = (list: readonly Issue[]): string => list.map((i) => `\u300C${i.label}\u300D\uFF1A${i.why}`).join(\"\uFF1B\");\n  /** \u91CD\u7B97\u6E05\u5355\uFF1B**\u53D8\u4E86**\u624D\u8BF4\u4E00\u53E5\uFF08user 10-14\u300C\u4E00\u76F4\u5F39\u7A97\u5F88\u70E6\u300D\uFF09+ \u901A\u77E5\u5BBF\u4E3B\u91CD\u753B\u89D2\u6807\u3002\u5F00\u6B4C / \u6362\u4EBA / \u5199\u4E86\u7B2C\u4E00\u4E2A\u97F3 / \u51C6\u5907\u8FC7\u4E00\u6B21\u90FD\u4F1A\u6765\u3002 */\n  function refreshIssues(): void {\n    const next = computeIssues(), key = JSON.stringify(next.map((i) => [i.part, i.kind, i.why]));\n    if (key === issuesKey) return;\n    const had = issues.length; issuesKey = key; issues = next; host.ui.onIssues(next);\n    if (next.length) showError(`${issuesText(next)}\u3002\u8FD9${next.length > 1 ? `${next.length} \u6761\u8F68` : \"\u6761\u8F68\"}\u653E\u548C\u5BFC\u51FA\u90FD\u4E0D\u51FA\u58F0\uFF0C\u5176\u4F59\u7167\u653E\uFF1B\u70B9 |\u25B6 \u89D2\u4E0A\u7684\u6570\u5B57\u770B\u6E05\u5355\uFF0C\u70B9\u8C31\u524D\u9762\u7684\u58F0\u90E8\u540D\u6362\u4E00\u4E2A\u300C\u8C01\u6765\u6F14\u300D\u3002`);\n    else if (had) info(\"\u73B0\u5728\u7684\u58F0\u90E8\u90FD\u80FD\u51FA\u58F0\u4E86\");\n  }\n  /** \u6708\u8BFB\u7684\u5757 = \u8C03\u5EA6\u5668\uFF08src/engine/scheduler.ts\uFF09+ \u4E00\u6B21\u4E00\u5757\u7684\u6CF5\uFF08\u5200 2\uFF0C\u8FB9\u7B97\u8FB9\u653E\uFF1Buser\u300C\u7B2C\u4E00\u53E5\u597D\u4E86\u5C31\u5F00\u64AD \u55EF\u300D\u300C\u5B9E\u65F6\u64AD\u653E\u7684\u65F6\u5019\u2026\u9884\u63D0\u524D\u7B97\u7136\u540E\u7528cache invalid\u300D\uFF09\uFF1A\n   *  \u987A\u5E8F = \u64AD\u653E\u5934\u6240\u5728\u7684\u90A3\u5757\u5148\u3001\u5F80\u540E\u6309\u8DDD\u79BB\u3001\u5FAA\u73AF\u7ED5\u56DE\uFF1Bseek / \u6539\u8C31 = \u6362\u987A\u5E8F\uFF08\u6B63\u5728\u7B97\u7684\u90A3\u5757\u7B97\u5B8C\u7167\u6837\u8FDB\u7F13\u5B58\uFF09\u3002\u5531\u4E0D\u4E86\u7684\u4E00\u53E5 = \u62A5\u9519 + \u7A7A\u7740\uFF08\u4E0D\u66FF\u8865\uFF09\uFF1B\n   *  \u9884\u5531\uFF08quiet\uFF09\u65F6\u4E0D\u62A5\u9519\u3001\u4E0D\u7A7A\u7740\uFF0C\u7B49\u771F\u6309\u64AD\u653E\u518D\u8BF4\u3002 */\n  let chunkKeysWanted: string[] = [];                      // \u73B0\u5728\u8BE5\u7B97\u7684\u987A\u5E8F\uFF08\u952E\uFF09\n  let chunkPlans = new Map<string, ChunkPlan>();           // \u952E \u2192 \u8BA1\u5212\uFF08\u542B\u5531\u8C31\uFF09\n  const chunkFailed = new Map<string, string>();           // \u952E \u2192 \u4E3A\u4EC0\u4E48\u5531\u4E0D\u4E86\uFF08\u9884\u5531\u65F6\u6512\u7740\uFF0C\u64AD\u653E\u65F6\u62A5\uFF09\n  let pumping = false, pumpQuiet = false, singSpeed: number | null = null;   // singSpeed = \u7B97\u4E00\u79D2\u6B4C\u51E0\u6BEB\u79D2\uFF08\u9884\u5377\u51E0\u5757\u6309\u5B83\uFF09\n  const inflightKeys = new Set<string>();   // \u6B63\u5728\u7B97\u7684\u90A3\u51E0\u53E5\uFF08\u51E0\u6761\u9053\u5E76\u884C\uFF0C\u5200 6 \u2462\uFF1APC \u4E24\u6761\u3001iPad \u4E00\u6761\uFF1Buser\u300C\u4E24\u4E2A worker \u5E76\u884C\u5531\uFF08PC\uFF09\u300D\uFF09\n  const pendingChunks = () => chunkKeysWanted.filter((k) => !engine.hasChunk(k)).length;\n  /** \u8FD9\u4E00\u904D\u653E\u7684\u8D77\u70B9\uFF08\u4ECE\u67D0\u4E00\u6BB5\u653E\u65F6 = \u90A3\u4E00\u6BB5\u5F00\u5934\uFF1B\u8D77\u653E\u63D0\u524D PRE_ROLL \u7ED9\u8F85\u97F3\uFF09\uFF1A\u5728\u5B83\u4E4B\u524D\u5C31\u5531\u5B8C\u7684\u5757\u8FD9\u6B21\u4E0D\u653E\uFF0C\u6392\u961F\u4E5F\u522B\u6392\u5728\u524D\u9762\uFF08v0.10.3\uFF09\u3002\u8D70\u8FC7\u8D77\u70B9\u4E00\u79D2\u540E\u6E05\u6389\u3002 */\n  let playMute: number | undefined;\n  function setChunkOrder(tl: Timeline, pos: number, loop: { from: number; to: number } | null, o: { quiet?: boolean; limit?: number; mute?: number } = {}): void {\n    chunkPlans = new Map(tl.chunks.map((c) => [c.key, c]));\n    let keys = chunkOrder(tl.chunks, pos, loop, (k) => engine.hasChunk(k), o.mute ?? playMute);\n    if (o.limit !== undefined) keys = keys.slice(0, o.limit);\n    chunkKeysWanted = keys; pumpQuiet = !!o.quiet;\n    for (const k of inflightKeys) if (!keys.includes(k) && !chunkPlans.has(k)) singer.cancelInflight(k);   // \u6B63\u5728\u7B97\u7684\u90A3\u53E5\u5DF2\u7ECF\u4E0D\u5728\u6B4C\u91CC\uFF08\u6539\u4E86 / \u6362\u6B4C\uFF09= \u4E2D\u9014\u53D6\u6D88\n    void pump();\n  }\n  const STAGE_FRAC: Record<string, number> = { \"\u5FF5\uFF081/2\uFF09\": 0.05, \"\u5FF5\uFF082/2\uFF09\": 0.25, \"\u5206\u6790\uFF081/3 \u97F3\u9AD8\uFF09\": 0.45, \"\u5206\u6790\uFF082/3 \u8C31\u5305\u7EDC\uFF09\": 0.6, \"\u5206\u6790\uFF083/3 \u6C14\u58F0\uFF09\": 0.7, \"\u5206\u6790\uFF08\u7F13\u5B58\uFF09\": 0.75, \"\u5408\u6210\": 0.85 };   // \u5200 0 \u91CF\u7684\u6BD4\u4F8B\uFF1A\u5FF5 40%\u3001\u5206\u6790 40%\u3001\u5408\u6210 20%\n  /** \u6CF5\uFF1A\u6309 chunkKeysWanted \u7684\u987A\u5E8F\uFF0C\u540C\u65F6\u6700\u591A singer.parallelism \u53E5\u5728\u7B97\uFF08\u6BCF\u6761\u9053\u4E00\u53E5\uFF09\uFF1B\u54EA\u53E5\u7B97\u5B8C\u5C31\u8865\u4E0B\u4E00\u53E5\u3002 */\n  async function pump(): Promise<void> {\n    if (pumping) return;\n    pumping = true;\n    let shown = 0;\n    const running = new Set<Promise<void>>();\n    try {\n      for (;;) {\n        while (running.size < singer.parallelism) {\n          const key = chunkKeysWanted.find((k) => !engine.hasChunk(k) && !inflightKeys.has(k)); if (!key) break;\n          const c = chunkPlans.get(key); if (!c) { chunkKeysWanted = chunkKeysWanted.filter((k) => k !== key); continue; }\n          const who = roleName(extras(), st().song.parts.find((p) => p.id === c.part)?.role ?? \"\"), left = pendingChunks();\n          if (left > shown) { renderBar.start(left); shown = left; }   // \u8FDB\u5EA6\u6761\uFF1A\u8FD8\u6709\u51E0\u53E5\uFF08\u987A\u5E8F\u6362\u4E86\u3001\u591A\u4E86\u5C31\u91CD\u5F00\u4E00\u6761\uFF09\n          const failed = chunkFailed.get(key);\n          if (failed !== undefined) {   // \u9884\u5531\u65F6\u5C31\u5531\u4E0D\u4E86\u7684\uFF1A\u4E0D\u518D\u8BD5\uFF1B\u771F\u64AD\u653E = \u62A5\u51FA\u6765\u3001\u8FD9\u4E00\u53E5\u7A7A\u7740\uFF08\u4E0D\u51FA\u58F0\u3001\u4E0D\u66FF\u8865\uFF09\n            if (pumpQuiet) { chunkKeysWanted = chunkKeysWanted.filter((k) => k !== key); continue; }\n            showError(`\u300C${who}\u300D\u5531\u4E0D\u4E86\u8FD9\u4E00\u53E5\uFF1A${failed}`); engine.chunk(key, 22050, new Float32Array(0)); renderBar.next(); continue;\n          }\n          progress(`${who}\uFF1A${pumpQuiet ? \"\u5148\u5531\u7740\" : \"\u8FD8\u6709\"} ${left} \u53E5\u2026`);\n          inflightKeys.add(key);\n          const p: Promise<void> = singOne(key, c, who).finally(() => { inflightKeys.delete(key); running.delete(p); });\n          running.add(p);\n        }\n        if (!running.size) break;\n        await Promise.race(running);\n      }\n    } finally { pumping = false; renderBar.end(); if (!engine.playing) progress(\"\"); }\n  }\n  async function singOne(key: string, c: ChunkPlan, who: string): Promise<void> {\n    const t = performance.now();\n    try {\n      const r = await singer.sing(c.score, (stage) => { progress(`${who}\uFF1A${stage}\u2026`); const pc = /(\\d+)%$/.exec(stage); if (pc) renderBar.frac(Number(pc[1]) / 100); else if (stage in STAGE_FRAC) renderBar.frac(STAGE_FRAC[stage]); }, { opt: c.opt, models: modelBases(), raw: true, tag: key, diskBytes: BUDGET.speechDisk });\n      if (engine.hasChunk(key) || !chunkPlans.has(key)) { renderBar.next(); return; }   // \u671F\u95F4\u6362\u4E86\u6B4C / \u987A\u5E8F\uFF1A\u7167\u6837\u7559\u7740\uFF08\u952E\u5BF9\u5C31\u4E0D\u6D6A\u8D39\uFF09\uFF0C\u4F46\u522B\u518D\u7B97\u8FDB\u5EA6\n      engine.chunk(key, r.sr, r.samples);\n      if (r.ms?.boot) diagNote(\"singer\", `engine boot ms: ${JSON.stringify(r.ms.boot)}`);   // \u51B7\u542F\u52A8\u5404\u6BB5\uFF08\u5200 5\uFF09\uFF1A\u8BCA\u65AD\u9875\u770B\uFF08\u6D4B\u8BD5\u91CC\u7684\u5047\u5531\u6CA1\u6709 ms\uFF09\n      const secs = Math.max(0.5, c.dur - LEAD_IN); singSpeed = singSpeed === null ? (performance.now() - t) / secs : singSpeed * 0.7 + ((performance.now() - t) / secs) * 0.3;\n    } catch (e) {\n      const msg = (e as Error).message ?? String(e);\n      if (msg === \"cancelled\") return;\n      if (!chunkPlans.has(key)) return;   // W-37\uFF082026-10-13\uFF09\uFF1A\u8FD9\u53E5\u5DF2\u7ECF\u4E0D\u5728\u8FD9\u9996\u6B4C\u91CC\uFF08\u6362\u6B4C / \u6539\u4E86\uFF09= \u9759\u9ED8\u4E22\u6389\u2014\u2014\u4E0D\u62A5\u3001\u4E0D\u8BB0\u3001\u4E0D\u585E\u7A7A\u5757\uFF08\u6210\u529F\u5206\u652F\u65E9\u5C31\u8FD9\u4E48\u6838\u4E86\uFF0C\u5931\u8D25\u5206\u652F\u6F0F\u4E86\uFF1A\u6362\u6B4C\u540E\u7EA2\u6846\u62A5\u7684\u662F\u4E0A\u4E00\u9996\u7684\u90A3\u4E00\u53E5\uFF09\n      chunkFailed.set(key, msg);\n      if (!pumpQuiet) { showError(`\u300C${who}\u300D\u5531\u4E0D\u4E86\u8FD9\u4E00\u53E5\uFF1A${msg}`); engine.chunk(key, 22050, new Float32Array(0)); }\n      else chunkKeysWanted = chunkKeysWanted.filter((k) => k !== key);\n    }\n    renderBar.next();\n  }\n  /** \u7B49\u4ECE pos \u8D77\u7684\u524D\u51E0\u5757\u5230\u9F50\uFF08\u9884\u5377\uFF1B\u51E0\u5757\u6309\u8FD9\u53F0\u8BBE\u5907\u7684\u901F\u5EA6\uFF09\uFF1Bstop = \u5916\u9762\u53D6\u6D88\u4E86\u3002 */\n  async function waitChunksReady(tl: Timeline, pos: number, stop: () => boolean, mute?: number): Promise<void> {\n    while (!stop() && !readyToStart(tl.chunks, pos, prerollCount(singSpeed), (k) => engine.hasChunk(k), mute)) {\n      if (!pumping && pendingChunks() === 0) break;   // \u6CF5\u505C\u4E86\u3001\u4E5F\u6CA1\u6709\u8981\u7B97\u7684 = \u8BE5\u6765\u7684\u90FD\u6765\u4E86\uFF08\u6216\u5531\u4E0D\u4E86\u7684\u5DF2\u7ECF\u7A7A\u7740\uFF09\n      await new Promise<void>((r) => setTimeout(r, 80));\n    }\n  }\n  /** \u5168\u90E8\u5757\u5230\u9F50\uFF08\u5BFC\u51FA / \u6D4B\u8BD5\u94A9\u5B50\u7528\uFF09\uFF1A\u76EF\u7740**\u8FD9\u6761\u65F6\u95F4\u7EBF\u81EA\u5DF1\u7684\u5168\u90E8\u952E**\uFF0C\u4E0D\u76EF chunkKeysWanted\u2014\u2014\u90A3\u4E2A\u4F1A\u88AB\u9884\u5531\u5B9A\u65F6\u5668 / \u6539\u8C31\u5237\u65B0\u6362\u6210\u522B\u7684\u5B50\u96C6\uFF0C\u539F\u6765\u4E00\u88AB\u63D2\u961F\u5C31\u63D0\u524D\u8FD4\u56DE\u3001\u5BFC\u51FA\u62A5\u300Cchunk \u2026 missing for export\u300D\uFF082026-10-10 \u771F\u5F15\u64CE probe \u6293\u5230\uFF09\u3002 */\n  async function awaitAllChunks(tl: Timeline): Promise<void> {\n    const want = [...new Set(tl.chunks.map((c) => c.key))];\n    setChunkOrder(tl, tl.range.from, null);\n    for (;;) {\n      const missing = want.filter((k) => !engine.hasChunk(k));\n      if (!missing.length) return;\n      if (!missing.some((k) => chunkKeysWanted.includes(k) || inflightKeys.has(k))) setChunkOrder(tl, tl.range.from, null);   // \u88AB\u522B\u4EBA\u6362\u4E86\u987A\u5E8F = \u628A\u6211\u4EEC\u7684\u91CD\u65B0\u6392\u4E0A\n      else if (!pumping) void pump();\n      await new Promise<void>((r) => setTimeout(r, 80));\n    }\n  }\n  /** \u5F55\u97F3\u623F\u91CC\u53EA\u7559\u6700\u8FD1\u7528\u5230\u7684\u5757\uFF08\u5185\u5BB9\u952E\uFF1B\u6309\u4EE3\u4EF7 / \u9884\u7B97\u7559\u5F52\u5200 2\uFF09\u3002 */\n  const MAX_CHUNKS = 64, chunkKeys: string[] = [];   // \u6700\u8FD1\u7528\u8FC7\u7684\u5728\u540E\u9762\n  function pruneChunks(tl: Timeline): void {\n    const keep = new Set(tl.chunks.map((c) => c.key));\n    for (const k of keep) { const i = chunkKeys.indexOf(k); if (i >= 0) chunkKeys.splice(i, 1); chunkKeys.push(k); }\n    const drop: string[] = [];\n    while (chunkKeys.length > MAX_CHUNKS) { const i = chunkKeys.findIndex((k) => !keep.has(k)); if (i < 0) break; drop.push(chunkKeys.splice(i, 1)[0]); }\n    if (drop.length) engine.forget(drop);\n  }\n  // \u2500\u2500 \u5200 6 \u2463\uFF1A\u8D1F\u8F7D\u548C\u5185\u5B58\u76D1\u63A7\u9632\u95EA\u9000\uFF08user 2026-10-10\u300C\u8D1F\u8F7D\u548C\u5185\u5B58\u76D1\u63A7\u9632\u95EA\u9000 \u505A\u300D\u300C\u8D85\u9884\u7B97\u5148\u653E\u5757 / \u51CF\u5E76\u884C / \u660E\u8BF4\u300D\uFF09\u3002\u7EAF\u903B\u8F91\u5728 src/app/resource-watch.ts\uFF0C\u8FD9\u91CC\u53EA\u52A8\u624B + \u8BF4\u8BDD\u3002\n  //   \u80FD\u7B97\u5230\u7684 = \u6BCF\u6761\u6708\u8BFB worker \u7684 WASM \u5806 + \u5FF5\u7F13\u5B58\uFF08worker \u6BCF\u6B21\u56DE\u8BDD\u5E26\u7740\uFF09\u3001\u5F55\u97F3\u623F\u91CC\u7684\u5757\uFF08\u97F3\u9891\u7EBF\u7A0B\u6BCF\u79D2\u62A5\uFF09\u3001\u97F3\u6E90\u5728\u5185\u5B58\u91CC\u7684\u6574\u5305\uFF1B\u97F3\u9891\u7EBF\u7A0B\u6BCF\u79D2\u62A5\u5FD9\u95F2\u3002\n  const DEVICE: DeviceInfo = { ios: /iPad|iPhone|iPod/.test(navigator.platform) || (navigator.platform === \"MacIntel\" && navigator.maxTouchPoints > 1), cores: navigator.hardwareConcurrency ?? 2, deviceMemoryGB: (navigator as { deviceMemory?: number }).deviceMemory ?? null };\n  const BUDGET = budgetFor(DEVICE);\n  if (new URLSearchParams(location.search).has(\"nodisk\")) BUDGET.speechDisk = 0;   // \u67E5\u6848\u5F00\u5173\uFF1A?nodisk=1 = \u5FF5\u7F13\u5B58\u4E0D\u843D\u76D8\uFF08\u53EA\u7528\u5185\u5B58\uFF09\n  singer.setLanes(BUDGET.lanes);\n  diagNote(\"resource\", `device ios=${DEVICE.ios} cores=${DEVICE.cores} mem=${DEVICE.deviceMemoryGB ?? \"?\"}GB \u2192 lanes ${BUDGET.lanes}, budget ${Math.round(BUDGET.total / 1e6)} MB (chunks ${Math.round(BUDGET.chunkBytes / 1e6)})`);\n  const watch = { load: null as LoadInfo | null, hot: 0, lanesCut: false, said: new Map<string, number>() };\n  const resourceSnapshot = (): Snapshot => ({ lanes: singer.memory(), chunkBytes: watch.load?.chunkBytes ?? 0, chunks: watch.load?.chunks ?? 0, soundMem: soundMemoryBytes(), audioBusy: watch.load?.busy ?? null });\n  /** \u660E\u8BF4\uFF0C\u4F46\u540C\u4E00\u4EF6\u4E8B 30 s \u5185\u53EA\u8BF4\u4E00\u6B21\uFF08\u72B6\u6001\u6761 + \u9ED1\u5323\u5B50\uFF09\u3002 */\n  function resourceSay(kind: string, text: string): void {\n    const t = performance.now(); if ((watch.said.get(kind) ?? -1e9) > t - 30_000) return; watch.said.set(kind, t);\n    reportError(text, \"warning\");\n  }\n  /** \u653E\u8FDC\u5904\u7684\u5757\u5230 toBytes \u4EE5\u4E0B\uFF1A\u6700\u4E45\u6CA1\u7528\u7684\u5148\u8D70\uFF08\u6B63\u5728\u8981\u7684\u90A3\u51E0\u53E5\u4E0D\u653E\uFF09\u3002 */\n  function shrinkChunks(snap: Snapshot, toBytes: number): void {\n    if (!snap.chunks) return;\n    const avg = Math.max(1, snap.chunkBytes / snap.chunks), n = Math.ceil((snap.chunkBytes - toBytes) / avg), wanted = new Set(chunkKeysWanted), drop: string[] = [];\n    for (const k of chunkKeys) { if (drop.length >= n) break; if (!wanted.has(k) && engine.hasChunk(k)) drop.push(k); }\n    for (const k of drop) chunkKeys.splice(chunkKeys.indexOf(k), 1);\n    if (drop.length) { engine.forget(drop); diagNote(\"resource\", `pruned ${drop.length} chunks (${Math.round(snap.chunkBytes / 1e6)} MB \u2192 target ${Math.round(toBytes / 1e6)} MB)`); }\n  }\n  function resourceTick(): void {\n    const snap = resourceSnapshot();\n    for (const a of advise(snap, BUDGET)) {\n      if (a.kind === \"pruneChunks\") shrinkChunks(snap, a.toBytes);\n      else if (a.kind === \"fewerLanes\") { if (singer.parallelism > a.lanes) { singer.setLanes(a.lanes); watch.lanesCut = true; diagNote(\"resource\", `lanes \u2192 ${a.lanes}`); resourceSay(\"lanes\", \"\u5185\u5B58 / \u8D1F\u8F7D\u5403\u7D27\uFF1A\u5C0F\u6708\u76F8\u6539\u6210\u4E00\u6761\u9053\u5531\uFF08\u6162\u4E00\u70B9\uFF0C\u58F0\u97F3\u4E0D\u53D8\uFF09\"); } }\n      else if (a.kind === \"audioHot\") { if (++watch.hot >= 3) resourceSay(\"audio\", `\u97F3\u9891\u7EBF\u7A0B\u6700\u8FD1 1 s \u5FD9 ${Math.round(a.busy * 100)}%\uFF1A\u53EF\u80FD\u7206\u97F3\u3002\u6548\u679C\u94FE / \u58F0\u90E8\u662F\u4F60\u7684\u6DF7\u97F3\uFF0C\u4E0D\u66FF\u4F60\u52A8\uFF1B\u53EF\u4EE5\u5148\u628A\u6CA1\u5728\u542C\u7684\u58F0\u90E8\u9759\u97F3`); }\n    }\n    if (snap.audioBusy !== null && snap.audioBusy <= AUDIO_HOT) watch.hot = 0;\n    if (watch.lanesCut && totalBytes(snap) < BUDGET.total * 0.6 && (snap.audioBusy ?? 0) < AUDIO_HOT * 0.7) { singer.setLanes(BUDGET.lanes); watch.lanesCut = false; diagNote(\"resource\", `lanes \u2192 ${BUDGET.lanes} (recovered)`); }   // \u5403\u7D27\u8FC7\u53BB\u4E86 = \u9053\u6570\u56DE\u5230\u8BBE\u5907\u9884\u7B97\n  }\n  singer.onMem = () => resourceTick();\n  /** \u6362\u6B4C\uFF1A\u4E0A\u4E00\u9996\u7684\u957F\u53E5\u628A\u54EA\u6761\u9053\u7684\u5806\u6491\u5927\u4E86\uFF08\u6BD4\u5F15\u64CE\u521A\u8D77\u6765\u591A\u6DA8\u4E00\u5927\u622A\uFF09= \u8D81\u7A7A\u9759\u9ED8\u91CD\u5F00\uFF0C\u8FD8\u7ED9\u8FD9\u4E00\u9996\uFF08\u5FF5\u7F13\u5B58\u76D8\u4E0A\u90A3\u4EFD\u8FD8\u5728\uFF1B\u540C\u4E00\u9996\u6B4C\u91CC\u4E0D\u91CD\u5F00\uFF0C\u89C1 resource-watch.ts \u6587\u4EF6\u5934\uFF09\u3002 */\n  function trimLanesForNewSong(): void {\n    const mems = singer.laneMems();\n    for (const i of trimOnSongSwitch(mems)) if (!singer.laneBusy(i)) { diagNote(\"resource\", `song switch: restart lane ${i} (wasm ${Math.round((mems[i]?.wasm ?? 0) / 1e6)} MB, base ${Math.round((mems[i]?.base ?? 0) / 1e6)} MB)`); singer.restartLane(i); }\n  }\n  engine.on(\"load\", (info) => { watch.load = info; resourceTick(); });\n  /** \u51C6\u5907\u4E00\u6B21\u64AD\u653E / \u5BFC\u51FA\uFF1A\u5E93\u8FDB\u5F55\u97F3\u623F \u2192 \u65F6\u95F4\u7EBF \u2192 \u6708\u8BFB\u7684\u5757\u3002\u6CA1\u6CD5\u51FA\u58F0\u7684\u58F0\u90E8\u62A5\u51FA\u6765\u3001\u5176\u4F59\u7167\u653E\uFF08user\u300C\u4E0D\u662F\u663E\u793A\u81EA\u52A8\u4E0A\uFF0C\u800C\u662F\u5C31\u662F\u4E0D\u51FA\u58F0\uFF0C\u62A5\u9519\uFF0C\u4EBA\u7C7B\u624B\u52A8\u6362\u300D\uFF09\u3002 */\n  async function prepare(scope: RenderScope, o: { chunks?: boolean; raw?: boolean } = {}): Promise<Timeline | null> {\n    const parts = audibleParts(), song = songIn(scope);\n    const errs = await prepareBanks(parts);   // \u5404\u4F4D\u7684\u51C6\u5907\uFF08\u5E93 / \u5143\u97F3\u8868\uFF09\u90FD\u5728\u63D2\u4EF6\u91CC\n    const tl = timelineOf(planOf(song, parts), (sha, bank, program) => engine.presetIndex(sha, bank, program));\n    // \u51FA\u4E0D\u4E86\u58F0\u7684\u8FDB\u6E05\u5355\uFF08\u00A72.2\u00BD\uFF09\uFF1A\u8FD9\u6B21\u51C6\u5907\u8FC7\u7684\u58F0\u90E8\u5148\u6E05\u6389\u65E7\u8D26\uFF0C\u518D\u6309\u7ED3\u679C\u8BB0\uFF1Btoast \u53EA\u5728\u6E05\u5355\u53D8\u4E86\u65F6\u8BF4\uFF08refreshIssues\uFF09\uFF0C\u4E0D\u518D\u6BCF\u6309\u4E00\u6B21\u64AD\u653E\u5F39\u4E00\u6B21\n    for (const p of parts) prepErrs.delete(p.id);\n    for (const e of errs) prepErrs.set(e.part, { cand: e.cand, kind: \"sound\", why: e.why });\n    for (const u of tl.unplayable) { const p = st().song.parts.find((x) => x.id === u.part); if (p && !prepErrs.has(u.part)) prepErrs.set(u.part, { cand: activeId(extras(), p.role), kind: \"unplayable\", why: u.why }); }\n    refreshIssues();\n    if (!tl.tracks.length) { showError(`\u6CA1\u6709\u51FA\u58F0\uFF1A${issuesText(issues) || \"\u6CA1\u6709\u4F1A\u51FA\u58F0\u7684\u58F0\u90E8\"}\u3002\u70B9\u8C31\u524D\u9762\u7684\u58F0\u90E8\u540D\u6362\u4E00\u4E2A\u300C\u8C01\u6765\u6F14\u300D\u3002`); return null; }   // \u4E00\u4E2A\u90FD\u653E\u4E0D\u4E86 = \u8FD9\u4E00\u4E0B\u5FC5\u987B\u8BF4\n    pruneChunks(tl);\n    if (o.chunks !== false) await awaitAllChunks(tl);\n    pushChannels(o.raw);\n    return tl;\n  }\n  /** \u6D4B\u8BD5\u94A9\u5B50\uFF1A\u73B0\u5728\u89C6\u56FE\u8303\u56F4\u7684\u6DF7\u97F3\uFF08\u79BB\u7EBF\uFF0C\u548C\u64AD\u653E\u540C\u4E00\u4EFD\u6570\u5B66\uFF09\uFF1Bsamples[0] = \u8C31\u4E0A\u7B2C start \u79D2\u3002 */\n  async function renderMixForTest(): Promise<{ samples: Float32Array; right: Float32Array; sr: number; start: number } | null> {\n    const tl = await prepare(\"view\"); if (!tl) return null;\n    const r = playRange(tl), m = await engine.renderOffline({ tracks: tl.tracks, range: { from: r.from, to: r.to }, loop: false }, { sr: GM_SR });\n    return { samples: m.left, right: m.right, sr: m.sr, start: m.start };\n  }\n  // \u2500\u2500 \u8D70\u5E26\uFF08\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\uFF1B\u4E0D\u8FDB\u6B4C\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let loopOn = false;                   // user\u300C\u6211\u786E\u5B9E\u5E0C\u671B\u80FD\u5355\u66F2\u5FAA\u73AF\u2026\u65E0\u7A77\u5FAA\u73AF\u548C\u5FAA\u73AF\u8D70\u5E26\u90FD\u505A\u300D\n  let playTl: Timeline | null = null;   // \u73B0\u5728\u653E\u7684\u65F6\u95F4\u7EBF\uFF08\u64AD\u653E\u5934 / \u6539\u8C31\u5237\u65B0\u7528\uFF09\n  let preparing = false, cancelPrepare = false;\n  const SEAM_LEAD = 4;                  // \u63A5\u7F1D\uFF1A\u4ECE\u5FAA\u73AF\u5C3E\u524D\u51E0\u79D2\u653E\u8D77\n  /** \u8FD9\u5F20\u7EB8\uFF08\u7B2C\u4E00\u6B21\u51FA\u73B0\uFF09\u7684\u79D2\u533A\u95F4\u3002 */\n  /** \u8303\u56F4 + \u5FAA\u73AF\u8D77\u70B9\uFF1A\u672C\u6BB5 / \u5168\u90E8\uFF08\u89C6\u56FE\uFF09\uFF1B\u5FAA\u73AF = \u7F16\u6392\u7684 [\u5FAA\u73AF\u6BB5]\uFF08\u524D\u9762\u653E\u4E00\u904D\u3001\u518D\u4ECE\u5FAA\u73AF\u6BB5\u5934\u8DF3\u56DE\uFF1B\u53EA\u5728\u5168\u90E8\u89C6\u56FE\uFF09\u6216\u6574\u4E2A\u8303\u56F4\u3002\n   *  \u9009\u533A**\u4E0D\u518D**\u5F53\u64AD\u653E\u533A\u95F4\uFF08v0.9.13 sunset\uFF1Buser 2026-10-10\u300C\u64AD\u653E\u8FC7\u7A0B\u4E2D\u7684\u9009\u533A\u64CD\u4F5C\u4E0D\u5E94\u8BE5\u6539\u53D8\u64AD\u653E\u533A\u95F4\uFF0C\u8FD9\u6837\uFF0C\u5148\u4E0D\u7528\u9009\u533A\u5F53\u64AD\u653E\u533A\u95F4\u4E86\uFF0Csunset\u8FD9\u4E2A\u8BBE\u5B9A\uFF0C\u4EE5\u540E\u6162\u6162\u60F3\u529E\u6CD5\u3002\u5176\u5B9E\u8FD9\u4E2A\u529F\u80FD\u6CA1\u5565\u5B9E\u7528\u6027\u300D\u2014\u2014\n   *  \u653E\u7740\u7684\u65F6\u5019\u9009 / \u6269 / \u6E05\u9009\u533A\u66FE\u628A\u8303\u56F4\u4E00\u8D77\u6362\u6389\uFF09\u3002\u4ECE\u5149\u6807\u653E\u7167\u65E7\uFF08\u6709\u9009\u533A = \u9009\u533A\u5934\uFF09\u3002 */\n  function playRange(tl: Timeline): { from: number; to: number; loopFrom: number } {\n    const from = tl.range.from, to = tl.range.to; let loopFrom = from;\n    const song = playSong(), a = parseArrangement(song.arrangement, song.papers);\n    if (host.viewScope() === \"all\" && a.loop && tl.papers[a.order.length]) loopFrom = tl.papers[a.order.length].t0;\n    return { from, to, loopFrom };\n  }\n  /** \u4ECE\u5149\u6807\u653E\uFF1A\u5149\u6807\uFF08\u9009\u533A = \u9009\u533A\u5934\uFF09\u90A3\u4E2A\u97F3\u7684\u65F6\u523B\uFF0C\u63D0\u524D\u4E00\u70B9\uFF08\u8F85\u97F3\u5728\u5143\u97F3\u524D\uFF09\u3002\n   *  \u5149\u6807\u5728\u7EB8\u5C3E / \u4E0D\u5728\u653E\u7684\u8303\u56F4\u91CC = null = \u4ECE\u5934\u653E\uFF08v0.9.2\uFF1Buser\u300C\u6CA1\u6709\u5149\u6807\u7684\u65F6\u5019\u70B9\u5F00\u59CB\u5C31\u4E0D\u653E\u4E86\u54C8\u54C8\u54C8\u300D\u2014\u2014\u5199\u5B8C\u8C31\u5149\u6807\u505C\u5728\u6700\u540E\uFF0C\u539F\u6765\u4ECE\u7EB8\u5C3E\u653E = \u4EC0\u4E48\u90FD\u542C\u4E0D\u5230\uFF09\u3002 */\n  // \u2500\u2500 \u8D70\u5E26\uFF082026-10-10 Opus 5.5\uFF09\uFF1A\u8D77\u70B9 / \u7EED\u64AD\u00B7\u6682\u505C / \u56DE\u8D77\u70B9\u91CD\u653E / \u22EF\uFF08\u5FAA\u73AF\u3001\u4ECE\u5934\u653E\u3001\u63A5\u7F1D\uFF09/ \u542C\u6A21\u5F0F \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  //   user\u300C\u8D70\u5E26\u63A7\u5236\u6709\u7EED\u64AD/\u6682\u505C \u548C\u4ECE\u4E0A\u4E00\u6B21\u5F00\u64AD\u7684\u5730\u65B9\u91CD\u65B0\u5F00\u59CB\u4E24\u4E2A\uFF0Cloop\u548C\u4E4B\u540E\u522B\u7684\u8BBE\u7F6E\u6BD4\u5982\u4ECE\u5934\u5F00\u59CB\u653E\u5728...\u91CC\u9762\u300D\u300C\u4F46\u662F\u6211\u60F3\u7F16\u8F91\u7684\u65F6\u5019\u5149\u6807\u52A8\u4F46\u662F\u64AD\u653E\u5934\u4E0D\u52A8\u300D\n  //   \u300C\u6838\u5FC3\u573A\u666F\u5C31\u662F\u4E00\u904D\u4E00\u904D\u542C\u540C\u4E00\u4E2A\u5C0F\u8282\u300D\u300C\u4EE5\u53CA\u5927\u90E8\u5206\u65F6\u5019\u53EF\u4EE5\u5C0F\u8282\u7EA7\u522B\u7684\u5F00\u59CB\u7CBE\u5EA6\u300D\u300C\u90A3\u4E48\u7EED\u64AD\u4E0Dreset\u8D77\u70B9\u300D\u300C\u957F\u6309\u52A0\u64AD\u653E\u540C\u610F\u300D\u3002\n  //   \u8D77\u70B9 = \u4E00\u4E2A\u5C0F\u8282\u5934\uFF1A\u53EA\u6709\u300C\u4ECE\u8FD9\u513F\u653E\u300D\uFF08\u7A7A\u767D\u957F\u6309 / \u53F3\u952E\u83DC\u5355\uFF1B\u542C\u6A21\u5F0F\u91CC\u957F\u6309 / \u53F3\u952E\u8C31\u9762\uFF09\u548C\u300C\u4ECE\u5934\u653E\u300D\uFF08\u22EF \u83DC\u5355 / \u8FDE\u6309\u4E24\u4E0B\u4E3B\u952E\uFF09\u632A\u5B83\uFF1B\u7F16\u8F91\u3001\u632A\u5149\u6807\u3001\u7EED\u64AD\u90FD\u4E0D\u52A8\u5B83\uFF08\u53D6\u4EE3 v0.9.1 \u7684\u300C\u25B6 = \u4ECE\u5149\u6807\u653E\u300D\uFF09\u3002\n  let startMark: { paperId: string; tick: number } | null = null;\n  let paused: { sec: number; at: { paperId: string; tick: number } | null } | null = null;   // \u6682\u505C\u5728\u54EA\uFF1A\u79D2 + \u8C31\u4F4D\u7F6E\uFF08\u6682\u505C\u65F6\u6539\u4E86\u8C31 = \u6309\u8C31\u4F4D\u7F6E\u63A5\u7740\u653E\uFF09\n  const clampTo = (r: { from: number; to: number }, s: number) => Math.min(Math.max(s, r.from), r.to);\n  /** \u8D77\u70B9\u672C\u8EAB\uFF08\u4E0D\u63D0\u524D\uFF09\uFF1A\u4ECE\u67D0\u4E00\u6BB5\u653E\u65F6\uFF0C\u5728\u5B83\u4E4B\u524D\u5C31\u7ED3\u675F\u7684\u97F3 / \u5531\u5B8C\u7684\u5757\u8FD9\u6B21\u4E0D\u51FA\u58F0\uFF08v0.10.3\uFF0Cuser\u300C\u4E3A\u4EC0\u4E48\u4ECEsheet C\u64AD\u653E\u7684\u65F6\u5019\u4F1A\u5E26\u524D\u4E00\u4E2A\u97F3\uFF0C\u4E5F\u4E0D\u77E5\u9053\u662Fsheet B\u7684\u8FD8\u662Fstop\u7684\u65F6\u5019\u6CA1\u5F04\u5E72\u51C0\u300D\u2014\u2014\n   *  \u662F\u8D77\u70B9\u63D0\u524D PRE_ROLL \u90A3\u4E00\u5C0F\u622A\u843D\u5728\u524D\u4E00\u6BB5\u6700\u540E\u4E00\u4E2A\u97F3\u91CC\uFF1A\u5F55\u97F3\u623F\u8D77\u653E\u65F6\u8FFD\u97F3\u628A\u5B83\u8865\u6309\u4E0B\u53BB\u3001\u524D\u4E00\u53E5\u7684\u5757\u5E26\u7740\u6536\u5C3E\u4F59\u97F3\u4E5F\u653E\u4E86\uFF1B\u4E0D\u662F\u505C\u7684\u65F6\u5019\u6CA1\u6536\u5E72\u51C0\uFF0C\u8D77\u653E\u524D\u6BCF\u6761\u8F68\u90FD\u5148 killAll\uFF09\u3002 */\n  function startMute(tl: Timeline, r: { from: number; to: number }): number | undefined {\n    if (!startMark) return undefined;\n    const s = tl.secondsAt(startMark.paperId, startMark.tick, 0);\n    return s === null ? undefined : clampTo(r, s);\n  }\n  function startSeconds(tl: Timeline, r: { from: number; to: number }): number {\n    if (!startMark) return r.from;\n    const s = tl.secondsAt(startMark.paperId, startMark.tick, 0);\n    return s === null ? r.from : clampTo(r, s - PRE_ROLL);   // \u63D0\u524D\u4E00\u70B9\uFF08\u6708\u8BFB\u7684\u8F85\u97F3\u5728\u62CD\u5B50\u524D\uFF09\n  }\n  function resumeSeconds(tl: Timeline, r: { from: number; to: number }): number {\n    if (!paused) return startSeconds(tl, r);\n    const s = paused.at ? tl.secondsAt(paused.at.paperId, paused.at.tick, paused.sec) : null;\n    return clampTo(r, s ?? paused.sec);\n  }\n  /** \u8FD9\u5F20\u7EB8\u91CC part \u90A3\u4E00\u884C tick \u6240\u5728\u5C0F\u8282\u7684\u5934\uFF08\u540C\u753B\u8C31\u7684\u89C4\u77E9\uFF1A\u4EBA\u63D2\u7684\u300C|\u300D\u3001\u62CD\u53F7\u53D8 = \u65B0\u5C0F\u8282\uFF1B\u5199\u6EE1\u81EA\u52A8\u6362\uFF1B\u5F31\u8D77 = \u7EB8\u5934\uFF09\u3002 */\n  function barHeadTick(paperId: string, part: string, tick: number): number {\n    const paper = st().song.papers.find((p) => p.id === paperId); if (!paper) return 0;\n    const toks = paper.tracks[part] ?? Object.values(paper.tracks)[0] ?? [];\n    let len = (DEFAULT_TIME.beats * WHOLE) / DEFAULT_TIME.beatType, inBar = 0, t = 0, head = 0;\n    for (const k of toks) {\n      if (k.kind === \"bar\") { if (t <= tick) head = t; inBar = 0; continue; }\n      if (k.kind === \"time\") { if (inBar > 0 && t <= tick) head = t; inBar = 0; len = (k.beats * WHOLE) / k.beatType; continue; }\n      if (!isTimed(k)) continue;\n      while (inBar >= len && inBar > 0) { const b = t - (inBar - len); if (b <= tick) head = b; inBar -= len; }\n      if (t > tick) break;\n      inBar += k.dur; t += k.dur;\n    }\n    // \u8FC7\u4E86\u8FD9\u4F4D\u5199\u7684\u5C3E\u5DF4\uFF08\u540E\u9762\u8865\u9F50\u7684\u6DE1\u8272\u5C0F\u8282 / \u7A7A\u7EB8\uFF09\uFF1A\u7167\u6700\u540E\u7684\u62CD\u53F7\u63A5\u7740\u5F80\u540E\u6570\u6574\u5C0F\u8282\uFF08v0.10.32\uFF1Buser\u300C\u5728\u7A7A\u7684sheet\uFF08\u6BD4\u5982ghost \u4F11\u6B62\u7B26\uFF09\u4E0A\u53F3\u952E\u4ECE\u8FD9\u91CC\u653E\u5C0F\u8282\u53F7\u9519\u4E86\uFF0C\u7CFB\u7EDF\u7684\u6574\u7406\u4E00\u4E0B\u300D\uFF09\n    if (t <= tick) { while (inBar >= len && inBar > 0) { const b = t - (inBar - len); if (b <= tick) head = b; inBar -= len; } const b0 = t - inBar; if (tick >= b0) head = b0 + Math.floor((tick - b0) / len + 1e-9) * len; }\n    return head;\n  }\n  /** \u4E00\u6761 track \u4E0A\u7B2C caret \u4E2A token \u4E4B\u524D\u6709\u591A\u5C11 tick\u3002 */\n  const tickOfCaret = (paperId: string, part: string, caret: number): number => { const toks = st().song.papers.find((p) => p.id === paperId)?.tracks[part] ?? []; let t = 0; for (let i = 0; i < Math.min(caret, toks.length); i++) if (isTimed(toks[i])) t += (toks[i] as { dur: number }).dur; return t; };\n  /** \u5F00\u64AD\uFF08\u51C6\u5907\u65F6\u95F4\u7EBF + \u5531\u524D\u51E0\u5757\uFF09\uFF1Astart = \u4ECE\u8D77\u70B9\uFF1Bhead = \u4ECE\u5F00\u5934\uFF08\u8D77\u70B9\u4E0D\u52A8\uFF09\uFF1Bresume = \u4ECE\u6682\u505C\u7684\u5730\u65B9\uFF1Bseam = \u5FAA\u73AF\u5C3E\u524D\u51E0\u79D2\uFF08\u542C\u63A5\u7F1D\uFF09\u3002 */\n  async function startPlayback(how: \"start\" | \"head\" | \"resume\" | \"seam\"): Promise<void> {\n    if (preparing) { cancelPrepare = true; return; }   // \u51C6\u5907\u4E2D\u518D\u6309 = \u4E0D\u653E\u4E86\n    singer.unlock(); holdAudio();   // \u5728\u7528\u6237\u624B\u52BF\u91CC\u5148\u628A\u58F0\u97F3\u6253\u5F00\uFF08iPad\uFF09\uFF1B\u51C6\u5907\u671F\u95F4\u8BA9\u58F0\u97F3\u4E00\u76F4\u9192\u7740\n    preparing = true; cancelPrepare = false; for (const b of playBtns()) b.classList.add(\"is-on\");\n    try {\n      const tl = await prepare(\"view\", { chunks: false }); if (!tl) { progress(\"\"); return; }\n      const r = playRange(tl); playTl = tl;\n      const loop = loopOn || how === \"seam\";\n      engine.setTimeline({ tracks: tl.tracks, range: { from: r.from, to: r.to }, loop, loopFrom: r.loopFrom });\n      const at = how === \"seam\" ? Math.max(r.from, r.to - SEAM_LEAD) : how === \"resume\" ? resumeSeconds(tl, r) : how === \"head\" ? r.from : startSeconds(tl, r);\n      playMute = how === \"start\" ? startMute(tl, r) : undefined;\n      // \u8FB9\u7B97\u8FB9\u653E\uFF1A\u4ECE at \u8D77\u6309\u8DDD\u79BB\u6392\u961F\u5531\uFF0C\u524D\u51E0\u5757\u5230\u9F50\u5C31\u5F00\u64AD\uFF0C\u540E\u9762\u7684\u8FB9\u653E\u8FB9\u5531\uFF08\u5230\u4E86\u6CA1\u5531\u597D\u7684\u90A3\u53E5\u8D70\u5E26\u4F1A\u7B49\uFF09\n      setChunkOrder(tl, at, loop ? { from: r.loopFrom, to: r.to } : null);\n      await waitChunksReady(tl, at, () => cancelPrepare, playMute);\n      if (cancelPrepare) { progress(\"\"); return; }\n      const loopNow = loopOn || how === \"seam\";   // \u51C6\u5907\u7684\u8FD9\u51E0\u79D2\u91CC\u5207\u4E86\u5FAA\u73AF = \u8FD9\u4E00\u8F6E\u5C31\u6309\u65B0\u7684\uFF08user 2026-10-10\u300C\u4E2D\u9014toggle\u5FAA\u73AF\u5BF9\u672C\u8F6E\u64AD\u653E\u5E94\u8BE5\u751F\u6548\u300D\uFF09\n      const atNow = how === \"start\" ? startSeconds(tl, r) : at;   // \u51C6\u5907\u7684\u8FD9\u51E0\u79D2\u91CC\u8D77\u70B9\u632A\u4E86\uFF08\u8FDE\u6309\u4E24\u4E0B = \u4ECE\u5934\u653E / \u4ECE\u8FD9\u513F\u653E\uFF09= \u4ECE\u65B0\u7684\u8D77\u70B9\u653E\n      playMute = how === \"start\" ? startMute(tl, r) : undefined;\n      if (loopNow !== loop) engine.setTimeline({ tracks: tl.tracks, range: { from: r.from, to: r.to }, loop: loopNow, loopFrom: r.loopFrom });\n      if (loopNow !== loop || atNow !== at) setChunkOrder(tl, atNow, loopNow ? { from: r.loopFrom, to: r.to } : null);\n      await engine.play(atNow, playMute);\n      paused = null;\n      playIcon(true);\n      progress(loopOn ? `\u5FAA\u73AF ${(r.to - r.loopFrom).toFixed(1)} \u79D2` : `${(r.to - atNow).toFixed(1)} \u79D2`);\n    } catch (e) { showError(`\u653E\u4E0D\u4E86\uFF1A${(e as Error).message}`); progress(\"\"); playIcon(false); }\n    finally { releaseAudio(); preparing = false; if (!engine.playing) for (const b of playBtns()) b.classList.remove(\"is-on\"); }\n  }\n  /** \u4E3B\u952E\uFF08\u7A7A\u683C\uFF09= |\u25B6 \u4ECE\u8D77\u70B9\u653E / \u653E\u7740 = \u505C\uFF08\u505C\u7684\u5730\u65B9\u8BB0\u4E0B\u6765\uFF0C\u22EF \u91CC\u300C\u63A5\u7740\u653E\u300D\u4ECE\u90A3\u513F\u63A5\uFF09\u3002\n   *  user 2026-10-10\u300Cui\u4E0A\u5148\u6682\u65F6\u4E0D\u8981\u7EED\u64AD\uFF0C\u5F00\u59CB\u7528\u6760\u4E09\u89D2\u7684\u90A3\u4E2A\u7B26\u53F7\uFF0C\u5C31\u662F\u4ECE\u8BBE\u5B9A\u7684\u5F00\u59CB\u64AD\u653E\u3002\u8FD9\u6837\u5148\u53EA\u6709\u4E00\u4E2A\u952E\u300D\u300C\u7EED\u64AD\u53EF\u4EE5\u653E\u5728...\u91CC\u9762\u300D\u3002 */\n  //   \u8FDE\u6309\u4E24\u4E0B\uFF08\u4E3B\u952E / \u7A7A\u683C\uFF09= \u4ECE\u5934\u653E\uFF082026-10-10 user\u300C\u4ECE\u5934\u5F00\u59CB\u64AD\u653E\u7684\u5173\u952E\u662F\u6307\u9488\u4E5F\u653E\u5728\u5F00\u5934\u4E86\u3002\u7136\u540Edouble tap \u4ECE\u65B0\u5F00\u59CB \u4F1A\u6FC0\u6D3B\u4ECE\u5934\u5F00\u59CB\u300D\uFF09\uFF1A\n  //   \u7B2C\u4E00\u4E0B\u7167\u5E38\uFF08\u653E / \u505C\uFF09\uFF0C\u7B2C\u4E8C\u4E0B\u5728 DOUBLE_TAP_MS \u5185\u5230 = \u8D77\u70B9\u56DE\u5F00\u5934\u3001\u4ECE\u5934\u653E\uFF08\u7B2C\u4E00\u4E0B\u6B63\u5728\u51C6\u5907 = \u4E0D\u6253\u65AD\uFF0C\u51C6\u5907\u5B8C\u4ECE\u5F00\u5934\u8D77\uFF09\u3002\n  const DOUBLE_TAP_MS = 350;\n  let lastPlayTap = 0;\n  function playPause(at: number = performance.now()): void {   // at = \u8FD9\u4E00\u4E0B\u6309\u4E0B\u7684\u65F6\u523B\uFF08\u4E8B\u4EF6\u7684 timeStamp\uFF09\uFF1A\u9875\u9762\u5FD9\u7684\u65F6\u5019\u5904\u7406\u665A\u4E86\uFF0C\u4E5F\u6309\u771F\u7684\u95F4\u9694\u7B97\u8FDE\u6309\n    const now = at;\n    if (now - lastPlayTap < DOUBLE_TAP_MS) { lastPlayTap = 0; playFromHead(); return; }\n    lastPlayTap = now;\n    if (engine.playing) { pausePlay(); return; }\n    void startPlayback(\"start\");\n  }\n  /** \u22EF\u300C\u63A5\u7740\u653E\u300D\uFF1A\u4ECE\u4E0A\u6B21\u505C\u4E0B\u7684\u5730\u65B9\u63A5\u7740\u653E\uFF08\u4E0D\u52A8\u8D77\u70B9\uFF09\u3002 */\n  function resumePlay(): void { if (!engine.playing && paused) void startPlayback(\"resume\"); }\n  function pausePlay(): void {\n    const sec = engine.audibleSec() ?? engine.position, at = playTl?.locate(sec) ?? null;\n    stopPlay(); paused = { sec, at }; view.setPlayhead(at);\n  }\n  /** \u56DE\u5230\u8D77\u70B9\u91CD\u653E\uFF08\u4E00\u904D\u4E00\u904D\u542C\u540C\u4E00\u4E2A\u5C0F\u8282\uFF1B|\u25B6 \u548C\u300C\u4ECE\u8FD9\u513F\u653E\u300D\u8D70\u8FD9\u91CC\uFF09\u3002\u653E\u7740 = \u76F4\u63A5\u8DF3\u56DE\u53BB\u3002 */\n  function replay(): void {\n    paused = null;\n    if (engine.playing && playTl) { const r = playRange(playTl); playMute = startMute(playTl, r); engine.seek(startSeconds(playTl, r), playMute); return; }\n    view.setPlayhead(null);\n    if (preparing) return;   // \u6B63\u5728\u51C6\u5907\u5F00\u64AD\uFF08\u6708\u8BFB\u5728\u5531\u524D\u51E0\u53E5\uFF09\uFF1A\u4E0D\u6253\u65AD\uFF0C\u5F00\u64AD\u90A3\u4E00\u523B\u6309\u65B0\u7684\u8D77\u70B9\u7B97\uFF08startPlayback \u91CC\u518D\u770B\u4E00\u6B21\uFF09\n    void startPlayback(\"start\");\n  }\n  /** \u4ECE\u8FD9\u513F\u653E\uFF1A\u8D77\u70B9\u632A\u5230 paperId \u8FD9\u5F20\u7EB8 part \u90A3\u4E00\u884C tick \u6240\u5728\u5C0F\u8282\u7684\u5934\uFF0C\u5E76\u4ECE\u90A3\u513F\u653E\u3002 */\n  function playFromHere(paperId: string, part: string, tick: number): void {\n    startMark = { paperId, tick: barHeadTick(paperId, part, tick) }; view.setStartMark(startMark); replay();\n  }\n  /** \u4ECE\u5934\u653E\uFF1A\u8D77\u70B9\u56DE\u5230\u5F00\u5934\uFF0C\u4ECE\u5934\u653E\uFF082026-10-10 user\u300C\u4ECE\u5934\u5F00\u59CB\u64AD\u653E\u7684\u5173\u952E\u662F\u6307\u9488\u4E5F\u653E\u5728\u5F00\u5934\u4E86\u300D\u2014\u2014v0.9.20 \u66FE\u6539\u6210\u300C\u8D77\u70B9\u4E0D\u52A8\u300D\uFF0C\u662F\u8BEF\u8BFB\u4E86\u300C\u4ECE\u5934\u653E\u4F1A\u628Astart reset\u56DE\u5934\u300D\uFF0Cv0.9.25 \u6539\u56DE\uFF09\u3002\u653E\u7740 = \u76F4\u63A5\u8DF3\u56DE\u5F00\u5934\u3002 */\n  function playFromHead(): void { startMark = null; view.setStartMark(null); replay(); }\n  /** \u542C\u63A5\u7F1D\uFF1A\u653E\u7740 = \u8DF3\u5230\u5FAA\u73AF\u5C3E\u524D\u51E0\u79D2\uFF1B\u6CA1\u653E = \u4ECE\u90A3\u513F\u653E\u3002 */\n  function playSeam(): void { if (engine.playing && playTl) { const r = playRange(playTl); engine.seek(Math.max(r.from, r.to - SEAM_LEAD)); } else void startPlayback(\"seam\"); }\n  function stopPlay(): void {\n    engine.stop(); playIcon(false); view.setPlayhead(null); phKey = \"\"; cancelPrepare = true; paused = null; playMute = undefined;\n    // \u505C = \u6708\u8BFB\u4E5F\u505C\uFF1A\u6B63\u5728\u5FF5\u7684\u90A3\u53E5\u4E2D\u9014\u53D6\u6D88\u3001\u540E\u9762\u6392\u7740\u7684\u4E0D\u5FF5\u4E86\uFF08user 2026-10-10\u300C\u6309\u505C\u4E4B\u540E\u6708\u8BFB\u4E0D\u5E94\u8BE5\u628A\u957F\u53E5\u5FF5\u5B8C\u300D\uFF09\uFF1B\u53EA\u7559\u5B89\u9759\u7684\u9884\u5531\uFF08\u5149\u6807\u9644\u8FD1\u51E0\u53E5\uFF0C\u6539\u8C31\u90A3\u5957\uFF09\n    chunkKeysWanted = []; singer.cancelPending(); singer.cancelInflight(); schedulePrewarm();\n  }\n  engine.on(\"ended\", () => { playIcon(false); view.setPlayhead(null); phKey = \"\"; paused = null; });\n  // \u5F55\u97F3\u623F\u6E32\u67D3\u91CC\u629B\u4E86\uFF08v0.10.15\uFF09\uFF1A\u62A5\u51FA\u6765 + \u8FDB\u9ED1\u5323\u5B50\uFF08\u5E26\u6808\uFF09\uFF0C\u8D70\u5E26\u505C\uFF1B\u8282\u70B9\u7167\u6D3B\uFF0C\u518D\u6309\u64AD\u653E\u80FD\u653E\uFF08\u539F\u6765 worklet \u6B7B\u6389\u3001\u4E4B\u540E\u6C38\u8FDC\u6CA1\u58F0\uFF0C\u65E5\u5FD7\u91CC\u4E5F\u6CA1\u6709\uFF09\n  engine.on(\"crash\", (msg) => { diagNote(\"engine\", `render crash: ${msg}`); playIcon(false); view.setPlayhead(null); phKey = \"\"; paused = null; showError(`\u64AD\u653E\u51FA\u9519\u4E86\uFF0C\u5DF2\u7ECF\u505C\u4E0B\uFF08\u9519\u8BEF\u8BB0\u8FDB\u4E86\u8BCA\u65AD\u65E5\u5FD7\uFF09\uFF1A${msg.split(\"\\n\")[0]}`); });\n  function setLoop(on: boolean): void {\n    loopOn = on; for (const b of playBtns()) b.classList.toggle(\"looping\", on);   // |\u25B6 \u4E0A\u4E00\u4E2A\u5C0F\u300C\u5FAA\u73AF\u300D\u89D2\u6807\uFF08\u539F\u6765\u5199\u5728 \u22EF \u94AE\u4E0A\uFF09\n    // \u653E\u7740\u7684\u65F6\u5019\u5207 = \u8FD9\u4E00\u8F6E\u5C31\u6309\u65B0\u7684\u6765\uFF1A\u5230\u5C3E\uFF08\u5C3E\u5DF4\u8FD8\u5728\u54CD\u4E5F\u7B97\uFF09\u8DF3\u56DE\u53BB / \u4E0D\u8DF3\uFF1B\u5F00\u4E86\u5FAA\u73AF = \u5FAA\u73AF\u5934\u90A3\u51E0\u53E5\u4E5F\u6392\u8FDB\u53BB\u5148\u5531\uFF08\u4E0D\u7136\u8DF3\u56DE\u53BB\u8981\u51BB\u7740\u7B49\u6708\u8BFB\uFF09\n    if (engine.playing && playTl) { const r = playRange(playTl); engine.setTimeline({ tracks: playTl.tracks, range: { from: r.from, to: r.to }, loop: loopOn, loopFrom: r.loopFrom }); setChunkOrder(playTl, engine.position, loopOn ? { from: r.loopFrom, to: r.to } : null); }\n  }\n  let lastReorder = 0;\n  // \u64AD\u653E\u5934 = \u73B0\u5728**\u542C\u5230\u7684**\u5730\u65B9\uFF082026-10-10 Opus 5.5\uFF1Buser\u300Cipad\u540E\u53F0\u5524\u8D77\u540E\u97F3\u9891\u548C\u52A8\u753B\u9519\u4F4D\u3002\u4EE5\u53CA\u4F60\u6709\u6CA1\u6709\u529E\u6CD5\u5B9E\u9645\u6D4B\u97F3\u9891\u64AD\u5230\u54EA\u91CC\u4E86\u6765\u597D\u597D\u5BF9\u9F50\uFF1F\u300D\uFF09\uFF1A\n  //   \u539F\u6765\u753B\u7684\u662F\u5F55\u97F3\u623F\u300C\u6B63\u5728\u7B97\u300D\u7684\u4F4D\u7F6E\uFF08\u6BCF 43 ms \u4E00\u62A5\uFF09\uFF0C\u58F0\u97F3\u8FD8\u8981\u8FC7\u7CFB\u7EDF\u7684\u8F93\u51FA\u7F13\u51B2\u624D\u5230\u626C\u58F0\u5668 \u2192 \u753B\u9762\u4E00\u76F4\u65E9\u4E00\u4E2A\u8F93\u51FA\u5EF6\u8FDF\uFF1BiPad \u5207\u540E\u53F0\u56DE\u6765\u7CFB\u7EDF\u53EF\u80FD\u6362\u4E86\u66F4\u5927\u7684\u7F13\u51B2 = \u65E9\u5F97\u66F4\u591A\u3002\n  //   \u73B0\u5728\u6BCF\u4E00\u5E27\u95EE\u6D4F\u89C8\u5668\u626C\u58F0\u5668\u6B64\u523B\u653E\u5230\u97F3\u9891\u65F6\u949F\u7684\u54EA\u4E00\u523B\uFF08getOutputTimestamp\uFF09\uFF0C\u53BB\u5F55\u97F3\u623F\u62A5\u7684\u300C\u97F3\u9891\u65F6\u949F \u2192 \u8D70\u5E26\u4F4D\u7F6E\u300D\u5BF9\u7167\u8868\u91CC\u67E5\uFF08StudioClient.audibleSec\uFF09\u3002\n  let phRaf = 0, phKey = \"\", latLogged: number | null = null, latAt = 0, srcLogged: string | null = null;\n  /** \u7FFB\u8C31\u7684\u63D0\u524D\u91CF\uFF08\u79D2\uFF09\uFF1A\u50CF\u94A2\u7434\u5BB6\u7FFB\u8C31\u2014\u2014\u8FD9\u4E00\u884C\u6700\u540E\u4E00\u5C0F\u622A\u8FD8\u6CA1\u653E\u5B8C\u5C31\u5148\u7FFB\u5230\u300C\u63A5\u4E0B\u6765\u8981\u653E\u7684\u5730\u65B9\u300D\uFF08\u4E0B\u4E00\u884C / \u7F16\u6392\u3001\u53CD\u590D\u8DF3\u56DE\u53BB\u7684\u5730\u65B9\uFF09\uFF0C\u6700\u540E\u90A3\u4E00\u70B9\u9760\u8BB0\u7740\n   *  \uFF08v0.10.21\uFF1Buser\u300C\u65E9\u8DF3\u8F6C\uFF1A\u6211\u8BF4\u7684\u4E0D\u662F\u770B\u4E0B\u4E00\u884C\uFF0C\u56E0\u4E3A\u5C0F\u8BBE\u5907\u5927\u603B\u8C31\u4E0A\u9762\u4E00\u6B21\u53EA\u80FD\u770B\u4E00\u884C\u3002\u4EE5\u53CA\u7F16\u6392longjump\u3002\u60F3\u4E00\u60F3\u94A2\u7434\u5BB6\u662F\u600E\u4E48\u7FFB\u9875\u7684\u300D\uFF09\u3002 */\n  //   \u63D0\u524D\u591A\u5C11\u5728 |\u25B6 \u957F\u6309 / \u53F3\u952E\u7684\u83DC\u5355\u91CC\u6311\uFF08\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\uFF0C\u540C\u300C\u81EA\u52A8\u7FFB\u300D\uFF09\uFF1B\u9ED8\u8BA4 0.6 s\uFF08user\u300C1.5s \u5E94\u8BE5\u592A\u957F\u4E86\uFF0C\u8BA9\u8FD9\u4E2A...\u91CC\u9762\u53EF\u4EE5\u914D\u7F6E\uFF0C\u7136\u540E\u63A8\u7406\u4E00\u4E0B\u9ED8\u8BA4\u662F\u591A\u4E45\uFF0C\u6211\u731C0.5\uFF1F\u300D\uFF09\uFF1A\n  //   \u89C6\u5531\u65F6\u773C\u775B\u5927\u7EA6\u9886\u5148 1 s\uFF08\u4E0D\u719F\u7684\u8C31\uFF09\u3001\u81EA\u5DF1\u7684\u6B4C\u770B\u5F97\u66F4\u5C11\uFF1B\u5E73\u6ED1\u6EDA\u52A8\u672C\u8EAB ~0.3 s\u2014\u20140.6 = \u6EDA\u5B8C\u6B63\u597D\u8D76\u4E0A\u6362\u884C\u30020 = \u4E0D\u63D0\u524D\uFF08\u6362\u4E86\u884C\u624D\u7FFB\uFF09\u3002\n  const TURN_LEADS = [0, 0.3, 0.6, 1, 1.5] as const;\n  let turnLead = 0.6;\n  let phAheadKey = \"\";\n  /** \u5207\u540E\u53F0\u56DE\u6765\uFF1A\u5EF6\u8FDF\u7684\u8BB0\u5F55\u5F52\u96F6\uFF0C\u4E0B\u4E00\u5E27\u91CD\u8BB0\uFF08\u7CFB\u7EDF\u53EF\u80FD\u6362\u4E86\u8F93\u51FA\u7F13\u51B2\uFF09\u3002 */\n  function resetLatencyLog(): void { latLogged = null; latAt = 0; }\n  function playheadFrame(): void {\n    phRaf = 0;\n    if (!engine.playing || !playTl) return;\n    const sec = engine.audibleSec() ?? engine.position, loc = playTl.locate(sec), k = loc ? `${loc.paperId}:${loc.tick}` : \"\";\n    // \u63A5\u4E0B\u6765 TURN_LEAD \u79D2\u653E\u5230\u54EA\uFF08\u6309\u64AD\u653E\u7684\u987A\u5E8F\uFF1A\u7F16\u6392 / \u53CD\u590D\u7167\u7B97\uFF1B\u5F00\u7740\u5FAA\u73AF\u3001\u5FEB\u5230\u5C3E\u4E86 = \u5FAA\u73AF\u5934\uFF09\n    const r = playRange(playTl); let aSec = sec + turnLead; if (aSec >= r.to) aSec = loopOn ? r.loopFrom + (aSec - r.to) : r.to - 1e-3;\n    const ahead = turnLead > 0 ? playTl.locate(aSec) : null, ak = ahead ? `${ahead.paperId}:${ahead.tick}` : \"\";\n    if (k !== phKey || ak !== phAheadKey) { phKey = k; phAheadKey = ak; view.setPlayhead(loc, ahead); }\n    const now = performance.now();\n    if (now - latAt > 2000) {   // \u8F93\u51FA\u5EF6\u8FDF\u53D8\u4E86\uFF08\u6362\u8033\u673A / \u5207\u540E\u53F0\u56DE\u6765\uFF09\u8BB0\u8FDB\u9ED1\u5323\u5B50\uFF1A\u9519\u4F4D\u518D\u62A5\u65F6\u6709\u6570\u53EF\u67E5\n      latAt = now; const lat = engine.latencyMs();\n      if (lat !== null && (latLogged === null || Math.abs(lat - latLogged) > 25 || engine.clockSrc !== srcLogged)) { latLogged = lat; srcLogged = engine.clockSrc; diagNote(\"audio\", `output latency ${Math.round(lat)} ms (ctx ${singer.unlock().state}, clock ${engine.clockSrc})`); }   // clock \u2260 ts = \u65F6\u95F4\u6233\u7684\u4E24\u4E2A\u65F6\u949F\u5BF9\u4E0D\u4E0A\u4E86\uFF08\u957F\u9501\u5C4F\u56DE\u6765\uFF09\uFF0C\u9000\u4E86\u4E00\u6863\n    }\n    phRaf = requestAnimationFrame(playheadFrame);\n  }\n  engine.on(\"pos\", (sec, playing, waiting) => {\n    if (!playing) return;\n    if (playTl && !phRaf) phRaf = requestAnimationFrame(playheadFrame);\n    if (waiting) progress(\"\u7B49\u5C0F\u6708\u76F8\u5531\u597D\u8FD9\u4E00\u53E5\u2026\");\n    if (playMute !== undefined && sec > playMute + 1) playMute = undefined;   // \u8D70\u8FC7\u8D77\u70B9\u4E86\uFF1A\u4E4B\u540E\u6392\u961F\u7167\u5E38\uFF08\u5FAA\u73AF\u7ED5\u56DE\u6765\u524D\u4E00\u6BB5\u7167\u6837\u54CD\uFF09\n    if (playTl && performance.now() - lastReorder > 1000) { lastReorder = performance.now(); const r = playRange(playTl); setChunkOrder(playTl, sec, loopOn ? { from: r.loopFrom, to: r.to } : null); }   // \u987A\u5E8F\u8DDF\u7740\u64AD\u653E\u5934\u8D70\n  });\n  engine.on(\"missing\", () => { if (playTl) { const r = playRange(playTl); setChunkOrder(playTl, engine.position, loopOn ? { from: r.loopFrom, to: r.to } : null); } });   // \u8D70\u5E26\u524D\u9762\u7F3A\u5757\uFF08\u653E\u7740\u7684\u65F6\u5019\u6539\u4E86\u8C31\uFF09\uFF1A\u73B0\u5531\uFF08\u8D70\u5E26\u5230\u90A3\u513F\u4F1A\u7B49\uFF0CA\uFF09\n  /** \u653E\u7740\u7684\u65F6\u5019\u6539\u8C31 / \u6362\u4EBA / \u9759\u97F3\u72EC\u594F\uFF1A\u65F6\u95F4\u7EBF\u91CD\u7B97\u3001\u6362\u8FDB\u53BB\uFF08\u6B63\u5728\u54CD\u7684\u4E0D\u52A8\uFF0C\u54CD\u5B8C\u6362\u65B0\uFF1Buser\u300C\u6B63\u5728\u54CD\u7684\u90A3\u53E5\u4E0D\u6362\u3001\u54CD\u5B8C\u6362\u65B0\u300D\uFF09\u3002\u6512 300 ms\u3002 */\n  let refreshTimer = 0;\n  function schedulePlaybackRefresh(): void {\n    if (!engine.playing) return;\n    clearTimeout(refreshTimer);\n    refreshTimer = window.setTimeout(() => { void (async () => {\n      if (!engine.playing) return;\n      const at = engine.position, loc = playTl?.locate(at) ?? null;   // \u64AD\u653E\u5934\u73B0\u5728\u5728\u8C31\u7684\u54EA\u513F\uFF1A\u6362\u4E86\u65F6\u95F4\u7EBF\u6309\u8C31\u4F4D\u7F6E\u7559\u5728\u539F\u5730\uFF08\u6539\u4E86\u524D\u9762\u7684\u97F3 / \u53CD\u590D\u7ED3\u6784\uFF0C\u79D2\u6570\u4E0D\u53D8\u4F1A\u8DF3\uFF09\n      const tl = await prepare(\"view\", { chunks: false }); if (!tl) { stopPlay(); return; }\n      const r = playRange(tl); playTl = tl;\n      const sec = loc ? tl.secondsAt(loc.paperId, loc.tick, at) : null, shift = sec !== null && Math.abs(sec - at) > 0.005 ? sec - at : 0;\n      engine.setTimeline({ tracks: tl.tracks, range: { from: r.from, to: r.to }, loop: loopOn, loopFrom: r.loopFrom, ...(shift ? { shift } : {}) });\n      setChunkOrder(tl, engine.position, loopOn ? { from: r.loopFrom, to: r.to } : null);\n    })(); }, 300);\n  }\n  /** \u9884\u5531\uFF08\u5200 2\uFF1Buser\u300C\u6253\u5F00\u6B4C\u540E\u7A7A\u95F2\u7247\u9884\u70ED + \u9884\u5531\u5149\u6807\u9644\u8FD1 \u5EFA\u8BAE\u8FD9\u6837\u2026\u7136\u540E\u6700\u597D\u6709ui\u63D0\u793A\u300D\uFF09\uFF1A\u6539\u8C31\u505C\u4E0B 700 ms \u540E\u3001\u6CA1\u5728\u653E \u2192 \u4ECE\u5149\u6807\u8D77\u5F80\u540E\u5148\u5531\u51E0\u53E5\uFF08quiet\uFF1A\u4E0D\u62A5\u9519\u3001\u4E0D\u7A7A\u7740\uFF09\u3002\n   *  \u6B4C\u91CC\u6709\u6708\u8BFB\u4E0A\u573A = \u610F\u56FE\uFF08\u7B2C\u4E00\u6B21\u4F1A\u4E0B\u6A21\u578B\uFF1Buser\u300C\u4E0D\u4F1A\u592A\u6D6A\u8D39\u7535\u5427\u56E0\u4E3A\u5C31\u51E0\u53E5\u300D\uFF09\u3002 */\n  //   2026-10-10\uFF08v0.9.18\uFF09\uFF1A\u4ECE\u300C\u4E0B\u4E00\u6B21\u5F00\u64AD\u4F1A\u4ECE\u7684\u5730\u65B9\u300D\u5531\u8D77\uFF08\u6682\u505C\u5904 / \u8D77\u70B9\uFF09\uFF0C\u4E0D\u518D\u6309\u5149\u6807\u2014\u2014\u5F00\u64AD\u5DF2\u7ECF\u548C\u5149\u6807\u5206\u5F00\u4E86\u3002\n  const PREWARM_PHRASES = 3;\n  let prewarmTimer = 0;\n  function schedulePrewarm(): void {\n    clearTimeout(prewarmTimer);\n    prewarmTimer = window.setTimeout(() => {\n      if (engine.playing || preparing || exporting) return;\n      const parts = audibleParts(); if (!parts.some((p) => performerOf(activeInstrument(extras(), p.role)?.engine)?.sound === \"chunks\")) return;   // \u53EA\u6709\u6162\u5F15\u64CE\uFF08\u6309\u53E5\u51FA\u5757\uFF09\u8981\u9884\u5531\n      const song = songIn(\"view\");\n      const tl = timelineOf(planOf(song, parts), (sha, bank, program) => engine.presetIndex(sha, bank, program));\n      if (!tl.chunks.length) return;\n      pruneChunks(tl);\n      // \u4ECE\u4E0B\u4E00\u6B21\u5F00\u64AD\u4F1A\u4ECE\u7684\u5730\u65B9\u5531\u8D77\uFF1A\u6682\u505C\u7740 = \u6682\u505C\u5904\uFF0C\u5426\u5219 = \u8D77\u70B9\uFF08v0.9.18 \u8D77\u5F00\u64AD\u4E0D\u518D\u770B\u5149\u6807\uFF1B\u539F\u6765\u6309\u5149\u6807\u9644\u8FD1\u5531\uFF0C\u8D77\u70B9\u5728\u522B\u5904\u65F6\u5F00\u5934\u90A3\u53E5\u6392\u4E0D\u4E0A\uFF09\n      const r = playRange(tl);\n      setChunkOrder(tl, paused ? resumeSeconds(tl, r) : startSeconds(tl, r), null, { quiet: true, limit: PREWARM_PHRASES, mute: paused ? undefined : startMute(tl, r) });\n    }, 700);\n  }\n  /** \u5149\u6807\u6240\u5728\u90A3\u4F4D\u662F SoundFont = \u628A\u5B83\u7684\u5B50\u96C6\u8F7D\u8FDB\u5F55\u97F3\u623F\uFF08\u51E0 MB\uFF0C\u77AC\u65F6\uFF09\uFF0C\u6309\u952E\u8BD5\u542C\u624D\u54CD\u3002\u6CA1\u8F7D\u597D\u4E4B\u524D\u7684\u6309\u952E\u4E22\u6389\uFF08\u4E0D\u6392\u961F\u2014\u2014\u8BD5\u542C\u8981\u7684\u662F\u5373\u65F6\uFF0C\u8FDF\u5230\u7684\u97F3\u66F4\u70E6\uFF09\u3002 */\n  let bankPreparing: Promise<void> | null = null;\n  function prepareBank(): Promise<void> {\n    const g = activeGm(extras(), curRole()); if (!g || engine.hasBank(g.subsetSha256)) return Promise.resolve();\n    if (bankPreparing) return bankPreparing;\n    bankPreparing = (async () => { await engine.bank(g.subsetSha256, await resolveGmBytes(g)); })()\n      .catch((e) => { showError(`\u300C${g.name}\u300D\u54CD\u4E0D\u4E86\uFF1A${(e as Error).message}`); })\n      .finally(() => { bankPreparing = null; });\n    return bankPreparing;\n  }\n  let exporting = false;\n  /** \u8FD9\u4EFD\u5BFC\u51FA\u5199\u4EC0\u4E48\u8BB8\u53EF\uFF1A\u7528\u6237\u9009\u7684\uFF1B\u548C\u6708\u8BFB\u6761\u6B3E\u53EF\u80FD\u51B2\u7A81 = \u8FD9\u4E00\u4EFD\u6309\u300C\u672A\u58F0\u660E\u300D\u5199\uFF08user 2026-10-08\u300C\u5373\u4F7F\u7248\u6743\u51B2\u7A81\u2026\u4E5F\u4E0Dblock\u5BFC\u51FAmp3\u548C\u5DE5\u7A0B\u6587\u4EF6\u3002\u800C\u53EA\u662F\u56DE\u5230\u672A\u58F0\u660E\u3002\u4E0D\u8B66\u5BDF\u7528\u6237\u300D\uFF09\u3002\n   *  \u53EA\u52A8\u5BFC\u51FA\u7684\u90A3\u4E00\u4EFD\uFF1B\u6B4C\u91CC\u5B58\u7684\u9009\u62E9\u4E0D\u52A8\uFF08\u90A3\u662F\u7528\u6237\u7684\u6570\u636E\uFF09\u3002 */\n  function exportRights(roles: readonly string[]): { rights: string | undefined; fellBack: boolean } {\n    const r = st().song.rights; if (!r) return { rights: undefined, fellBack: false };\n    return licenseHints(r, performerCredits(extras(), roles)).length ? { rights: undefined, fellBack: true } : { rights: r, fellBack: false };\n  }\n  /** \u6574\u9996 / \u8FD9\u4E00\u5F20\u7EB8\u6E32\u67D3\u6210 mp3 \u5B57\u8282\uFF08**\u6CA1\u6709 ID3 \u6807\u7B7E**\uFF1B\u5BFC\u51FA / \u5B9A\u7A3F\u5171\u7528\uFF1B\u8D70\u65E0\u5934\u6E32\u67D3\u6838\u5FC3 renderSong\uFF1A\u51C6\u5907 \u2192 \u65F6\u95F4\u7EBF \u2192 \u5757 \u2192 \u6DF7\uFF09\u3002\n   *  \u51FA\u4E0D\u4E86\u58F0\u7684\u58F0\u90E8\u7167\u65E7\u8FDB\u6E05\u5355\uFF08\u00A72.2\u00BD\uFF09\u3001\u5176\u4F59\u7167\u6DF7\uFF1B\u4E00\u4E2A\u90FD\u653E\u4E0D\u4E86 = \u629B\u3002 */\n  async function renderMp3(o: { quality: Mp3Quality; scope: \"all\" | \"segment\" }): Promise<{ bytes: Uint8Array; secs: number; sr: number; kbps: number; stereo: boolean; roles: string[]; parts: string[] }> {\n    if (engine.playing) stopPlay();\n    const parts = audibleParts(), song = songIn(o.scope);\n    progress(\"\u51C6\u5907\u2026\");\n    const r = await renderSong(planOf(song, parts, false), { ...deps, sing: async (tl) => { pruneChunks(tl); await awaitAllChunks(tl); } },\n      { sr: GM_SR, pv, progress: (m, f) => { if (f === undefined) { progress(m); return; } if (f === 0) { progress(m); renderBar.start(1); } renderBar.frac(f); },\n        onPrepared: (errs, tl) => { for (const p of parts) prepErrs.delete(p.id); for (const e of errs) prepErrs.set(e.part, { cand: e.cand, kind: \"sound\", why: e.why }); for (const u of tl.unplayable) { const p = st().song.parts.find((x) => x.id === u.part); if (p && !prepErrs.has(u.part)) prepErrs.set(u.part, { cand: activeId(extras(), p.role), kind: \"unplayable\", why: u.why }); } refreshIssues(); } })\n      .finally(() => { renderBar.end(); if (mixBypass) pushChannels(); });   // \u6548\u679C\u5168\u5173\uFF08A/B\uFF09\u4E0D\u5F71\u54CD\u5BFC\u51FA\uFF1B\u5BFC\u5B8C\u6309\u5F00\u5173\u91CD\u63A8\n    const roles = st().song.parts.filter((p) => r.timeline.tracks.some((t) => t.id === p.id)).map((p) => p.role);   // \u771F\u51FA\u4E86\u58F0\u7684\u58F0\u90E8\uFF08\u7F72\u540D\u63A8\u6F14\uFF09\n    progress(\"\u7F16 mp3\u2026\");\n    const Q = MP3_QUALITY[o.quality];\n    const left = Q.stereo ? r.left : toMono(r.left, r.right), right = Q.stereo ? r.right : null;   // \u5C0F\u6587\u4EF6\uFF1A\u5DE6\u53F3\u5E73\u5747\u6210\u5355\u58F0\u9053\n    const bytes = await encodeMp3(left, right, r.sr, Q.kbps);\n    progress(\"\");\n    return { bytes, secs: r.secs, sr: r.sr, kbps: Q.kbps, stereo: Q.stereo, roles, parts: r.timeline.tracks.map((t) => t.id) };\n  }\n  /** \u8FD9\u4EFD mp3 \u8BE5\u5E26\u7684 ID3 \u6807\u7B7E\uFF08\u6B4C\u540D / \u4F5C\u8005 / \u8BB8\u53EF / \u7F72\u540D / \u8F6F\u4EF6 + \u5C01\u9762\u56FE APIC\uFF09\u3002\u5B9A\u7A3F\u65F6\u8D34\u597D\u4E00\u8D77\u5B58\uFF08\u5B58\u7684 = \u53D1\u884C\u7684\u90A3\u4E00\u4EFD\uFF0C\u8FDE\u6807\u7B7E\u5E26\u56FE\uFF0Cuser 10-16\u300C\u90FD\u51BB\u540C\u610F\uFF0C\u5C01\u9762\u5F53\u7136\u8FDB\u300D\uFF09\uFF1B\u6CA1\u5B9A\u7A3F\u7684\u5BFC\u51FA\u73B0\u8D34\u3002 */\n  function mp3Tag(roles: readonly string[]): { tag: Uint8Array; lines: CreditLine[]; fellBack: boolean } {\n    // mp3 \u6807\u7B7E\uFF08user 2026-10-08\u300Cmp3\u80FD\u81EA\u52A8\u751F\u6210license\u5417\u300D\uFF09\uFF1A\u6B4C\u540D / \u4F5C\u8005\uFF08\u4F5C\u8005\u680F\u7B2C\u4E00\u884C\uFF0C\u7528\u6237\u81EA\u5DF1\u5199\u7684\uFF09/ \u8FD9\u9996\u6B4C\u7684\u8BB8\u53EF\uFF08\u7528\u6237\u9009\u7684\uFF1B\u672A\u58F0\u660E\u6216\u51B2\u7A81 = \u4E0D\u5199\uFF09/ \u6574\u6BB5\u7F72\u540D / \u5C01\u9762\u56FE\uFF08\u6B4C\u5E93\u5361\u7247\u90A3\u5F20 PNG\uFF09\u3002\n    const { rights, fellBack } = exportRights(roles), { lines } = creditsOf(roles, rights), cover = extras().thumbnail;\n    return { tag: id3v2({ title: st().song.title || docName(), artist: (st().song.credits ?? \"\").split(\"\\n\").map((s) => s.trim()).find(Boolean), copyright: rights, copyrightUrl: firstUrl(rights), comment: creditsText(lines) || undefined, software: `MoonSinger ${APP_VERSION}`, ...(cover ? { picture: { mime: \"image/png\", bytes: cover } } : {}) }), lines, fellBack };\n  }\n  const mp3SizeText = (n: number) => (n < 1e6 ? `${Math.round(n / 1e3)} KB` : `${(n / 1e6).toFixed(1)} MB`);\n  /** \u5BFC\u51FA\u6B4C\u58F0\uFF08mp3\uFF09\uFF1A\u5B9A\u7A3F\u7740 = \u76F4\u63A5\u7ED9\u5B9A\u7A3F\u7684\u90A3\u4E00\u4EFD\uFF08\u539F\u5B57\u8282\uFF0C\u6807\u7B7E\u548C\u5C01\u9762\u90FD\u662F\u5B9A\u7A3F\u90A3\u4E00\u523B\u7684\uFF0C\u4E0D\u91CD\u6E32\u4E0D\u91CD\u8D34\uFF09\uFF0C\u5426\u5219\u73B0\u6E32 + \u73B0\u8D34\u6807\u7B7E\u3002 */\n  async function exportSong(o: { quality: Mp3Quality; scope: \"all\" | \"segment\" } = { quality: \"standard\", scope: \"all\" }): Promise<void> {\n    if (exporting || preparing) return;\n    exporting = true;\n    try {\n      const fin = host.final?.();\n      const r = fin && o.scope === \"all\" ? { bytes: fin.mp3, secs: fin.secs, kbps: fin.kbps, stereo: fin.stereo, roles: fin.roles, fromFinal: true } : { ...(await renderMp3(o)), fromFinal: false };\n      const { tag, lines, fellBack } = mp3Tag(r.roles);\n      // \u6587\u4EF6\u540D = \u540D[-\u66F2\u6BB5]-YYYYMMDD-HHMM\uFF08v0.9.47\uFF1Buser\u300C\u770B\u4E00\u4E0Bwxhw\u8FD8\u662Fweebpaint\uFF0C\u5BFC\u51FA\u7684\u65F6\u5019\u6587\u4EF6\u540D\u5E94\u8BE5\u8FD8\u6709\u5BFC\u51FA\u7684\u65F6\u95F4\uFF0C\u4E5F\u8BB8\u8FD8\u6709\u9632\u649E\u300D= WeebPaint naming.ts\u300C\u4E0B\u8F7D\u7248\u672C = \u540D-YYYYMMDD-HHMM\u300D\uFF1B\n      //   \u540C\u4E00\u5206\u949F\u518D\u5BFC = \u6D4F\u89C8\u5668 / \u7CFB\u7EDF\u81EA\u5DF1\u8865 (1)\u2014\u2014WeebPaint \u7684\u89C4\u77E9\uFF1A\u649E\u540D\u540E\u7F00\u53EA\u5728\u80FD\u67E5\u5360\u7528\u7684\u53BB\u5904\uFF08\u4E91\u7AEF\uFF09\u505A\uFF0C\u672C\u5730\u4E0B\u8F7D / \u5206\u4EAB\u67E5\u4E0D\u4E86\uFF0C\u4EA4\u7ED9\u7CFB\u7EDF\uFF09\n      const file = new File([...(r.fromFinal ? [] : [tag as unknown as BlobPart]), r.bytes as unknown as BlobPart], `${stampedCopy(`${docName()}${o.scope === \"segment\" ? `-${fileSafe(st().song.papers.find((p) => p.id === st().at.paper)?.name || \"\u8FD9\u4E00\u5F20\")}` : \"\"}`)}.mp3`, { type: \"audio/mpeg\" });\n      const Q = r.stereo ? \"\u7ACB\u4F53\u58F0\" : \"\u5355\u58F0\u9053\";\n      offerFile(file, \"\u6B4C\u58F0\u5BFC\u51FA\u597D\u4E86\", `${r.secs.toFixed(1)} \u79D2 \u00B7 mp3 ${Q} ${r.kbps}k ${mp3SizeText(file.size)}${r.fromFinal ? \"\uFF08\u5B9A\u7A3F\u7684\u90A3\u4E00\u4EFD\uFF0C\u6CA1\u6709\u91CD\u6E32\uFF09\" : \"\"}` +\n        (fellBack ? `<div class=\"offer-msg\">\u8BB8\u53EF\u8FD9\u4E00\u4EFD\u6309\u300C\u672A\u58F0\u660E\u300D\u5199\u4E86\uFF08\u4F60\u9009\u7684\u8BB8\u53EF\u548C\u5C0F\u6708\u76F8\u7684\u6761\u6B3E\u53EF\u80FD\u51B2\u7A81\uFF1B\u4F5C\u8005\u680F\u91CC\u7684\u9009\u62E9\u6CA1\u52A8\uFF09\u3002</div>` : \"\") +\n        (!r.fromFinal && issues.length ? `<div class=\"offer-msg issue-warn\">\u8FD9\u51E0\u6761\u8F68\u6CA1\u51FA\u58F0\uFF0Cmp3 \u91CC\u6CA1\u6709\u5B83\u4EEC\uFF1A${escHtml(issuesText(issues))}</div>` : \"\") +\n        creditsBlock(lines, \"\u7F72\u540D \u00B7 \u5DF2\u5199\u8FDB mp3 \u7684\u6807\u7B7E\"));\n    } catch (e) {\n      progress(\"\"); showError(`\u5BFC\u51FA\u5931\u8D25\uFF1A${(e as Error).message}`);\n    } finally { exporting = false; }\n  }\n  /** \u653E\u7740\u7684\u65F6\u5019\u6362\u66F2\u6BB5\uFF08\u2039 \u203A / \u6302\u7B7E\u4E0B\u62C9 / \u6BCF\u5F20\u7EB8\u81EA\u5DF1\u7684\u66F2\u6BB5\u63A7\u4EF6\uFF1B\u53EA\u8BA4\u8FD9\u51E0\u5904\u660E\u8BF4\u7684\u300C\u6362\u6BB5\u300D\uFF0C\u70B9\u8C31\u4E0A\u522B\u7684\u7EB8\u91CC\u7684\u97F3\u4E0D\u7B97\uFF09= \u4ECE\u90A3\u4E00\u6BB5\u7684\u5F00\u5934\u653E\n   *  \uFF08v0.10.17\uFF1Buser\u300C\u64AD\u653E\u7684\u65F6\u5019\u5F3A\u5207\u4E0D\u540C\u7684\u66F2\u6BB5\u5E94\u8BE5\u80FD\u8DF3\u5230\u90A3\u4E2A\u66F2\u6BB5\u53BB\u64AD\u653E\u300D\u300C\u64AD\u653E\u4E2D\u8DF3\u66F2\u6BB5\u7684\u65F6\u5019\u64AD\u653E\u5934\u5E94\u8BE5\u4ECE\u5F00\u59CB\u64AD\u653E\u300D\uFF09\u3002\n   *  \u672C\u6BB5\u89C6\u56FE = \u8303\u56F4\u6362\u6210\u90A3\u4E00\u6BB5\u3001\u4ECE\u5B83\u7684\u5934\u653E\uFF1B\u5168\u90E8\u89C6\u56FE = \u8DF3\u5230\u90A3\u4E00\u6BB5\uFF08\u7B2C\u4E00\u6B21\u51FA\u73B0\uFF09\u7684\u5934\uFF0C\u524D\u4E00\u6BB5\u6CA1\u54CD\u5B8C\u7684\u97F3\u4E0D\u5E26\u8FC7\u6765\uFF08\u540C\u300C\u4ECE\u8FD9\u513F\u653E\u300D\uFF09\u3002\u8D77\u70B9\uFF08\u4ECE\u8FD9\u513F\u653E\u7684\u90A3\u4E2A\u5C0F\u8282\uFF09\u4E0D\u52A8\u3002 */\n  function jumpPlaybackToPaper(id: string): void {\n    if (!engine.playing && !preparing) return;\n    const span = host.viewScope() === \"all\" && engine.playing ? playTl?.papers.find((x) => x.paper.id === id) : undefined;\n    if (span && playTl) { const r = playRange(playTl); playMute = span.t0; engine.seek(clampTo(r, span.t0 - PRE_ROLL), playMute); return; }\n    stopPlay();\n    const go = (): void => { if (preparing) setTimeout(go, 30); else void startPlayback(\"head\"); };   // \u6B63\u5728\u51C6\u5907\u7684\u90A3\u6B21\u5148\u9000\u5E72\u51C0\n    go();\n  }\n  /** \u627E\u4EBA\u89C6\u56FE\u300C\u542C\u5F00\u5934\u300D\uFF1A\u4E00\u6761\u4E34\u65F6\u8F68\uFF08audition \u901A\u9053\uFF09\u4ECE 0 \u653E\u5230 to \u79D2\uFF1B\u4E0D\u662F\u6B4C\u7684\u65F6\u95F4\u7EBF\uFF08\u64AD\u653E\u5934\u4E0D\u753B\u3001\u4E0D\u6392\u5757\uFF09\u3002 */\n  async function previewTrack(track: TrackSpec, to: number, label: string): Promise<void> {\n    engine.channel(\"audition\", { gainDb: 0, pan: 0, mute: false, solo: false });\n    playTl = null; engine.setTimeline({ tracks: [track], range: { from: 0, to }, loop: false });\n    try { await engine.play(0); playIcon(true); progress(`${label} \u00B7 \u5F00\u5934 ${to.toFixed(1)} \u79D2`); }\n    catch (e) { showError(`\u653E\u4E0D\u4E86\uFF1A${(e as Error).message}`); }\n  }\n  /** \u6362\u6B4C = \u5F55\u97F3\u623F\u91CC\u7684\u5757\u5168\u653E\u6389\u3001\u6392\u7740\u7684\u4E0D\u5531\u4E86\u3001\u6B63\u5728\u5531\u7684\u4E5F\u53D6\u6D88\u3001\u4E0A\u4E00\u9996\u7684\u8BA1\u5212\u6E05\u7A7A\uFF08W-37\uFF1A\u65E7\u8BF7\u6C42\u56DE\u6765\u624D\u4E0D\u4F1A\u88AB\u5F53\u6210\u8FD9\u9996\u7684\u62A5\u51FA\u6765\uFF09\u3001\u4E0A\u4E00\u9996\u6491\u5927\u7684\u5806\u8FD8\u56DE\u3002 */\n  function onSongSwitch(): void { engine.forget(chunkKeys.splice(0)); chunkFailed.clear(); chunkKeysWanted = []; chunkPlans = new Map(); singer.cancelPending(); singer.cancelInflight(); trimLanesForNewSong(); }\n\n  return {\n    humOpt, resetLatencyLog, playSong, curFlat, songIn, audibleParts, micOf, channelOf, pushChannels, lowestMidiOf, songBpm, performerInfo, prepare, renderMixForTest, playRange, tickOfCaret, barHeadTick, startPlayback, playPause, resumePlay, pausePlay, replay, playFromHere, playFromHead, playSeam, stopPlay, setLoop, schedulePlaybackRefresh, schedulePrewarm, prepareBank, exportRights, exportSong, renderMp3, mp3Tag, resourceSnapshot, trimLanesForNewSong, onSongSwitch, jumpPlaybackToPaper, previewTrack,\n    budget: BUDGET, TURN_LEADS,\n    issues: (): readonly Issue[] => issues, issueOf: (part: string): Issue | null => issues.find((i) => i.part === part) ?? null, issuesText, refreshIssues,\n    get loopOn() { return loopOn; }, get playTl() { return playTl; }, get preparing() { return preparing; }, get paused() { return paused; }, get startMark() { return startMark; }, get exporting() { return exporting; },\n    get mixBypass() { return mixBypass; }, set mixBypass(v: boolean) { mixBypass = v; },\n    get turnLead() { return turnLead; }, set turnLead(v: number) { turnLead = v; },\n  };\n}\n", "// overlay.ts \u2014\u2014 \u76D6\u5C42\u767B\u8BB0\uFF08\u7F16\u8F91\u72B6\u6001\u673A\u6574\u7406\u7B2C 1 \u671F = \u5200 3 \u4E4B\u4E00\uFF1B\u7B56\u5212\u7A3F ai-docs/20261013-edit-state-machine-survey.md \u00A71c / \u00A73\uFF1B\u4E0D\u53D8\u91CF I2\u300C\u4E00\u6B21\u4E00\u5C42\u76D6\u5C42\u300D\uFF09\u3002\n//   created 2026-10-14 by Claude Fable 5.1\n//   \u4E4B\u524D main.ts \u7528\u4E00\u4E2A\u6A21\u5757\u7EA7\u95ED\u5305 `closeOffer` \u5F53\u300C\u73B0\u5728\u5F00\u7740\u7684\u90A3\u5F20\u9762\u677F\u600E\u4E48\u5173\u300D\uFF1A\u5F00\u65B0\u7684\u4E4B\u524D\u6BCF\u5904\u81EA\u5DF1\u8BB0\u5F97 `closeOffer?.()`\uFF0C\u5173\u7684\u65F6\u5019\u81EA\u5DF1\u8BB0\u5F97\u6E05\u6389\u2014\u2014\n//   44 \u5904\u8D4B\u503C / 89 \u5904\u8BFB\uFF0C\u6F0F\u4E00\u5904 = \u4E24\u5F20\u53E0\u7740\uFF0C\u665A\u5230\u7684 close \u4F1A\u628A\u540E\u6765\u5F00\u7684\u90A3\u5F20\u8BEF\u6E05\u6389\uFF08\u53EA\u6709 10 \u5904\u6709 `=== close` \u7684\u5B88\u536B\uFF09\u3002\n//   \u8FD9\u91CC\u53EA\u662F\u628A\u90A3\u6761\u534F\u8BAE\u6536\u6210\u4E00\u4E2A\u5BF9\u8C61\uFF1A\u5F00\u65B0\u7684 = \u65E7\u7684\u5148\u5173\uFF1B\u81EA\u5DF1\u6536\u4E86\u53EA\u5728\u300C\u8FD8\u662F\u73B0\u5728\u8FD9\u5C42\u300D\u65F6\u624D\u6E05\u3002DOM \u4ECD\u5F52\u5404\u4E2A open\u2026\uFF08\u8FD9\u91CC\u4E0D\u78B0 DOM\uFF09\u3002\n//   \u8FD8\u6CA1\u6536\u8FDB\u6765\u7684\uFF08\u7B2C 1 \u671F\u5200 3 \u4E4B\u4E8C\uFF09\uFF1A\u4E50\u5668\u9875 / \u4E50\u5668\u76EE\u5F55 / \u6B4C\u5E93\u8FD9\u51E0\u4E2A\u6574\u9875\u7684\u65D7\uFF08instShown / finderShown / \u2026\uFF09\u3001\u4ECE\u76D6\u5C42\u63A8 pad \u9501\u4E0D\u9501 / \u952E\u76D8\u5F52\u8C01\u3002\n\n/** \u76D6\u5C42\u7684\u79CD\u7C7B\uFF1Amenu = \u5C0F\u83DC\u5355\uFF08\u70B9\u5916\u9762\u6536\uFF09\uFF1Bsheet = \u9762\u677F\uFF08offer\uFF1A\u5BFC\u51FA / \u8BBE\u7F6E / \u95EE\u4E00\u53E5\u2026\uFF09\uFF1Bcard = \u8F68\u7684\u5C0F\u5361\uFF08\u975E\u6A21\u6001\uFF0C\u70B9\u5916\u9762\u6536\uFF09\u3002 */\nexport type OverlayKind = \"menu\" | \"sheet\" | \"card\";\nexport interface Overlay { readonly k: OverlayKind; readonly close: () => void; /** \u8FD9\u5C42\u81EA\u5DF1\u7684\u91CD\u753B\uFF08\u8F68\u7684\u5C0F\u5361\uFF1A\u64A4\u9500 / \u522B\u5904\u6539\u4E86\u8DDF\u7740\u53D8\uFF09\u3002 */ readonly redraw?: () => void }\n/** \u6574\u9875\uFF08\u76D6\u4F4F\u8C31\u533A\u7684\u90A3\u79CD\uFF0C\u548C\u76D6\u5C42\u4E0D\u662F\u4E00\u56DE\u4E8B\uFF1A\u4E00\u6B21\u53EA\u5728\u4E00\u9875\u4E0A\uFF09\uFF1Ascore = \u8C31\uFF1Binst = \u4E50\u5668\u9875\uFF1Bfinder = \u4E50\u5668\u76EE\u5F55\uFF08playOnly = \u4ECE\u6B4C\u5E93\u8FDB\u7684\u53EA\u5F39\u7740\u73A9\uFF0C\u4E0D\u51FA\u300C\u4E0A\u573A\u300D\uFF1BbackToInst = \u4ECE\u4E50\u5668\u9875\u5F00\u7684\uFF0C\u5173\u4E86\u56DE\u4E50\u5668\u9875\uFF09\u3002\n *  \u5200 3 \u4E4B\u4E8C\uFF082026-10-14\uFF09\uFF1A\u539F\u6765 main.ts \u91CC\u4E94\u4E2A\u65D7 instShown / finderShown / finderPlayOnly / finderBackToInst\uFF08+ trackRedraw\uFF09\u5404\u81EA\u7EF4\u62A4\uFF0C\u4ECE\u8FD9\u513F\u63A8\u3002 */\nexport type Page = { readonly k: \"score\" } | { readonly k: \"inst\" } | { readonly k: \"finder\"; readonly playOnly: boolean; readonly backToInst: boolean };\n/** \u4ECE\u9875\u63A8\u51FA\u6765\u7684\uFF1Apad \u53EA\u5F39\u4E0D\u5199\uFF08\u9501\u4F4F\uFF09= \u4E0D\u5728\u8C31\u4E0A\uFF08\u4E50\u5668\u9875 / \u76EE\u5F55\u5F00\u7740\uFF0C\u5F39\u7684\u662F\u53F0\u4E0A / \u8BD5\u542C\u53F0\u4E0A\u90A3\u4F4D\uFF09\u3002 */\nexport const padLocked = (p: Page): boolean => p.k !== \"score\";\n\nexport interface OverlayRegistry {\n  /** \u73B0\u5728\u5F00\u7740\u7684\u90A3\u5C42\uFF08\u6CA1\u6709 = null\uFF09\u3002 */\n  readonly overlay: Overlay | null;\n  /** \u5F00\u65B0\u7684 = \u65E7\u7684\u5148\u5173\uFF08\u8C03\u5B83\u7684 close\uFF09\uFF0C\u518D\u8BB0\u4E0B\u8FD9\u5C42\u3002 */\n  open(next: Overlay): void;\n  /** \u5173\u73B0\u5728\u5F00\u7740\u7684\uFF08\u6CA1\u6709 = \u4EC0\u4E48\u90FD\u4E0D\u505A\uFF09\u3002 */\n  close(): void;\n  /** \u67D0\u4E00\u5C42\u81EA\u5DF1\u6536\u4E86\uFF08\u70B9\u5916\u9762 / Esc / \u505A\u5B8C\uFF09\uFF1A\u53EA\u5728\u5B83\u8FD8\u662F\u73B0\u5728\u8FD9\u5C42\u65F6\u6E05\u6389\u2014\u2014\u665A\u5230\u7684 close \u4E0D\u4F1A\u8BEF\u6E05\u540E\u6765\u5F00\u7684\u90A3\u5C42\u3002 */\n  closed(close: () => void): void;\n  is(k: OverlayKind): boolean;\n  /** \u73B0\u5728\u5F00\u7740\u7684\u90A3\u5C42\u8981\u91CD\u753B\uFF08\u6CA1\u6709 / \u5B83\u6CA1\u6709 redraw = \u4EC0\u4E48\u90FD\u4E0D\u505A\uFF09\u3002 */\n  redraw(): void;\n  /** \u73B0\u5728\u5728\u54EA\u4E00\u9875\u3002 */\n  readonly page: Page;\n  setPage(p: Page): void;\n}\n\nexport function createOverlayRegistry(): OverlayRegistry {\n  let cur: Overlay | null = null, page: Page = { k: \"score\" };\n  return {\n    get overlay() { return cur; },\n    redraw() { cur?.redraw?.(); },\n    get page() { return page; },\n    setPage(p) { page = p; },\n    open(next) { const prev = cur; cur = null; prev?.close(); cur = next; },   // \u5148\u767B\u8BB0\u4E3A\u7A7A\u518D\u5173\u65E7\u7684\uFF1A\u65E7\u7684 close \u91CC\u7684 closed(\u81EA\u5DF1) \u4E0D\u4F1A\u78B0\u5230\u65B0\u7684\n    close() { const prev = cur; cur = null; prev?.close(); },\n    closed(close) { if (cur?.close === close) cur = null; },\n    is(k) { return cur?.k === k; },\n  };\n}\n", "// vowel-table.ts \u2014\u2014 \u8BD5\u542C\u5143\u97F3\u8868\uFF08assets/preview/vowels.json + vowels.pcm16\uFF0C\u7EA6 3 MB\uFF0C\u968F app \u51FA\u8D27\uFF09\uFF1A\u4E0B\u8F7D\u4E00\u6B21\uFF0C\u4EA4\u7ED9\u5F55\u97F3\u623F\u7684\u5143\u97F3\u91C7\u6837\u5668\u3002\n// created 2026-10-09 by Claude Fable 5.1\uFF08\u539F src/singer/sampler.ts \u7684 fetchTable\uFF1B\u91C7\u6837\u5668\u672C\u8EAB\u642C\u8FDB\u4E86\u97F3\u9891\u7EBF\u7A0B src/engine/studio.ts\uFF09\u3002\n// user\u300C\u9009\u8FD9\u4E2A\u4E50\u5668\u5C31\u662F\u610F\u56FE\uFF0C\u7136\u540E\u7B2C\u4E00\u4E0B\u5C31\u54CD\u300D\uFF1A\u8868\u5728\u753B\u597D\u8C31\u4E4B\u540E\u7684\u7A7A\u95F2\u65F6\u4E0B\u8F7D\uFF0C\u9009\u4E86\u6708\u8BFB\uFF08\u5143\u97F3\uFF09\u5C31\u8BE5\u9A6C\u4E0A\u54CD\u3002\nimport type { VowelTableMsg } from \"./studio-client.ts\";\n\nconst base = new URL(\"../assets/preview/\", import.meta.url);\nlet loading: Promise<VowelTableMsg> | null = null;\n/** \u4E0B\u8F7D\u5143\u97F3\u8868\uFF08\u53EA\u4E0B\u8F7D\u4E00\u6B21\uFF1B\u5931\u8D25\u4E86\u4E0B\u6B21\u91CD\u8BD5\uFF09\u3002 */\nexport function loadVowelTable(): Promise<VowelTableMsg> {\n  if (loading) return loading;\n  loading = (async () => {\n    const [idx, pcm] = await Promise.all([   // no-cache = \u6BCF\u6B21\u8DDF\u670D\u52A1\u5668\u6838\u5BF9\uFF08\u91CD\u65B0\u751F\u6210\u8FC7\u7684\u8868\u4E0D\u5403\u6D4F\u89C8\u5668\u7F13\u5B58\uFF09\n      fetch(new URL(\"vowels.json\", base), { cache: \"no-cache\" }).then((r) => { if (!r.ok) throw new Error(`\u8BD5\u542C\u5143\u97F3\u8868\uFF1AHTTP ${r.status}\uFF08\u5148\u8DD1 node scripts/gen-preview-vowels.mjs\uFF1F\uFF09`); return r.json() as Promise<{ sr: number; entries: VowelTableMsg[\"entries\"] }>; }),\n      fetch(new URL(\"vowels.pcm16\", base), { cache: \"no-cache\" }).then((r) => r.arrayBuffer()),\n    ]);\n    return { sr: idx.sr, entries: idx.entries, pcm: new Int16Array(pcm) };\n  })().catch((e) => { loading = null; throw e; });\n  return loading;\n}\n", "// finder.ts \u2014\u2014 \u627E\u4EBA\u89C6\u56FE\uFF1A\u5168\u5C4F\uFF08\u66FF\u6389\u8C31\u533A\uFF0Cpad \u7559\u7740\u5F53\u8BD5\u542C\u952E\u76D8\uFF09\uFF0C\u6309**\u4E50\u5668\u6982\u5FF5**\u6D4F\u89C8\u767E\u79D1\u76EE\u5F55\uFF0C\u70B9\u4E00\u4E2A\u63D0\u4F9B\u8005 = \u8F7D\u8FDB\u5B9E\u65F6\u5408\u6210\u5668\u3001pad \u76F4\u63A5\u5F39\u5B83\uFF1B\u300C\u4E0A\u573A\u300D= \u89D2\u8272\u6539\u6210\u8FD9\u4E2A\u6982\u5FF5 + \u9020\u6F14\u594F\u8005\u3002\n// created 2026-10-07 by Claude Fable 5.1\u3002user 2026-10-07\u300C\u627E\u4EBA\u89C6\u56FE\u540C\u610F\uFF0C\u7136\u540E\u6700\u597D\u662F\u5168\u5C4F\u7684\u800C\u4E0D\u662F\u5F39\u51FA\u7A97\u53E3\uFF0C\u7C7B\u4F3Cgallery\uFF0C\u7136\u540E\u80FD\u7528\u8FD9\u4E2A\u97F3\u4E50\u952E\u76D8\u300D\u300C\u9ED8\u8BA4\u6309\u5E74\u4EE3\u6392\u54C8\u54C8\u54C8\u300D\n//   \u300C\u8BD5\u542C\u4E0D\u751F\u6210\u6F14\u594F\u8005\u300D\uFF08\u8BD5\u542C\u53F0 = \u4E34\u65F6\u69FD\uFF1B\u53EA\u5728\u300C\u4E0A\u573A\u300D\u65F6\u624D by value \u9020\u6F14\u594F\u8005\uFF09\u300C\u987A\u5E8F\u672C\u6765\u5C31\u662F\u5148\u9009\u6982\u5FF5\u518D\u9009\u6F14\u594F\u8005\u300D\u3002\n// \u6570\u636E = src/gm/catalog.ts\uFF08vendor/instruments/ \u7684\u4E24\u5F20\u8868 + \u56FE\u6807 sprite\uFF09\uFF1B\u97F3\u9891 / \u9009\u89D2\u5F52 host\uFF08src/app/main.ts\uFF09\u3002\nimport { loadCatalog, loadIconSprite, groupConcepts, providersOf, roleNameOf, eraLabel, fmtYear, gmKey, weightLabel, SORT_LABEL, type Catalog, type Concept, type Entry, type Provider, type SortMode } from \"../gm/catalog.ts\";\n\nexport type FinderPick = { kind: \"gs\"; concept: Concept; provider: Provider } | { kind: \"voice\"; concept: Concept };\nexport interface FinderHost {\n  base: URL;                                                   // \u4E3B bundle \u7684 import.meta.url\uFF08\u627E vendor/\uFF09\n  roleName(): string;                                          // \u73B0\u5728\u7684\u89D2\u8272\u540D\uFF08\u9876\u6761\u5199\u300C\u627E\u4EBA\u7ED9\u300CX\u300D\u300D\uFF09\n  audition(p: FinderPick | null): Promise<void>;                     // \u8BD5\u542C\u53F0\uFF1A\u8F7D\u8FDB\u5B9E\u65F6\u5408\u6210\u5668\uFF08pad \u5F39\u5B83\uFF09\uFF1Bnull = \u505C\n  playHead(p: FinderPick): Promise<void>;                            // \u7528\u5B83\u653E\u672C\u58F0\u90E8\u5F00\u5934\n  cast(p: FinderPick): Promise<void>;                                // \u4E0A\u573A\uFF08\u58F0\u97F3\u9ED8\u8BA4\u5F31\u5F15\u7528\uFF1A\u6B4C\u91CC\u53EA\u8BB0\u6765\u6E90\uFF0C\u8981\u5E26\u7740\u8D70 = \u6587\u4EF6\u83DC\u5355\u300C\u5168\u90E8\u6253\u5305\u8FDB\u6B4C\u300D\uFF09\n  close(): void;\n  togglePad(): void;                                                 // \u9876\u6761\u300C\u952E\u76D8\u300D\uFF1A\u5F00 / \u5173\u8BD5\u542C\u952E\u76D8\uFF08user 2026-10-08\u300C\u97F3\u8272\u9884\u89C8\u4E5F\u5E94\u8BE5\u80FDtoggle\u952E\u76D8\uFF0C\u514D\u5F97\u6CA1\u5F39\u51FA\u6765\u300D\uFF09\n}\nconst HINT = \"\u70B9\u4E00\u4EF6\u4E50\u5668 \u2192 \u6311\u8C01\u6765\u6F14 \u2192 \u7528\u53F3\u8FB9\u7684\u952E\u76D8\u8BD5 \u2192 \u300C\u9009\u8FD9\u4E2A\u300D\uFF08\u56DE\u5230\u4E50\u5668\u9875\uFF09\u3002\u89D2\u8272\u4F1A\u6539\u6210\u90A3\u4EF6\u4E50\u5668\uFF08\u8C31\u4E0A\u5199\u5B83\u7684\u540D\u5B57\uFF09\uFF1B\u8C01\u6765\u6F14\u624D\u8FDB\u4F11\u606F\u5BA4\u3002\";   // \u4E0D\u53EB\u300C\u4E0A\u573A\u300D\uFF1Auser 2026-10-10\u300C\u9009\u4E50\u5668\u4E0D\u8981\u7528\u4E0A\u573A\u8FD9\u4E2A\u8BCD\u4E0D\u7136\u8BA9\u4F1A\u8BA9\u4EBA\u4EE5\u4E3A\u76F4\u63A5\u8DF3\u56DE\u4E3B\u754C\u9762\uFF0C\u4F46\u662F\u5B9E\u9645\u4E0A\u6211\u4EEC\u8FD8\u662F\u56DE\u5230\u4E50\u5668\u914D\u7F6E\u754C\u9762\u300D\nconst esc = (s: string) => s.replace(/[&<>\"']/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[c]!);\n\nexport class Finder {\n  readonly el: HTMLDivElement;\n  private cat: Catalog | null = null;\n  private mode: SortMode = \"style\";         // \u9ED8\u8BA4\u6309\u3007\u3007\u98CE\uFF08user 2026-10-08\u300C\u7136\u540E\u97F3\u8272\u6392\u5E8F\u9ED8\u8BA4\u8FD8\u662F\u753B\u98CE\u5427\u3002\u5E74\u4EE3\u597D\u73A9\u4F46\u5176\u5B9E\u6BCF\u6B21\u90FD\u8981\u591A\u70B9\u4E00\u6B21\u54C8\u54C8\u300D\uFF1B\u6B64\u524D 10-07\u300C\u9ED8\u8BA4\u6309\u5E74\u4EE3\u6392\u54C8\u54C8\u54C8\u300D\uFF09\n  private q = \"\";\n  private opened: string | null = null;     // \u5C55\u5F00\u7684\u90A3\u4E00\u884C = \u300C\u7EC4 id::\u6982\u5FF5 id\u300D\uFF08\u4E00\u6B21\u53EA\u5F00\u4E00\u4EF6\uFF1A\u5C55\u5F00\u7B2C\u4E8C\u4EF6\u7B2C\u4E00\u4EF6\u81EA\u52A8\u6536\u2014\u2014user\u300C\u8001\u95EE\u9898\uFF0C\u5C55\u5F00\u7B2C\u4E8C\u4E2A\u4E50\u5668\u4E4B\u540E\u7B2C\u4E00\u4E2A\u5E94\u8BE5\u6536\u300D\uFF09\u3002\n                                            // \u8BB0\u7EC4\uFF1A\u6309\u66F2\u98CE\u6392\u65F6\u540C\u4E00\u4EF6\u4E50\u5668\u5728\u597D\u51E0\u4E2A\u7EC4\u91CC\u90FD\u6709\uFF0C\u53EA\u8BB0\u6982\u5FF5 = \u6BCF\u4E2A\u7EC4\u91CC\u7684\u5B83\u90FD\u5C55\u5F00\u3001\u6EDA\u53BB\u7B2C\u4E00\u4E2A\uFF08user 2026-10-08\u300C\u5728\u4E00\u4E2Acategory\u91CC\u9762\u9009\u62E9\u4E00\u4E2A\u4E50\u5668\uFF0C\u4F1A\u8DF3\u5230\u7B2C\u4E00\u4E2A\u51FA\u73B0\u8FD9\u4E2A\u4E50\u5668\u7684category\u300D\uFF09\n  private selected = \"\";                    // \u8BD5\u542C\u53F0\u4E0A\u7684\u63D0\u4F9B\u8005\uFF08`${\u6982\u5FF5 id}|${bank}:${program}` / `${\u6982\u5FF5 id}|voice`\uFF09\n  private loading: Promise<void> | null = null;\n  private playOnly = false;                 // \u4ECE\u6B4C\u5E93\u8FDB\u7684 = \u53EA\u5F39\u7740\u73A9\uFF1A\u4E0D\u51FA\u300C\u4E0A\u573A\u300D\uFF0C\u8FD4\u56DE\u56DE\u6B4C\u5E93\n  private host: FinderHost;\n  constructor(parent: HTMLElement, host: FinderHost) {\n    this.host = host;\n    this.el = document.createElement(\"div\"); this.el.className = \"finder\"; this.el.hidden = true;\n    this.el.innerHTML = `<div class=\"finder-bar\"><button class=\"btn\" data-v=\"back\" title=\"\u56DE\u5230\u8C31\uFF08Esc\uFF09\">\u2190 \u8C31</button><span class=\"finder-title\"></span>` +\n      `<input class=\"finder-q\" type=\"search\" placeholder=\"\u641C\u4E50\u5668\uFF08\u4E2D / \u82F1 / \u65E5\uFF09\" spellcheck=\"false\" autocomplete=\"off\" />` +\n      `<select class=\"finder-sort\">${(Object.keys(SORT_LABEL) as SortMode[]).map((m) => `<option value=\"${m}\">${SORT_LABEL[m]}</option>`).join(\"\")}</select>` +\n      `<button class=\"btn finder-pad\" data-v=\"pad\" title=\"\u8BD5\u542C\u952E\u76D8\uFF1A\u5F00 / \u5173\"><svg class=\"ico\"><use href=\"#grid\"/></svg><span>\u952E\u76D8</span></button></div>` +\n      `<div class=\"finder-hint\">${HINT}</div>` +\n      `<div class=\"finder-jump\" hidden><span>\u8DF3\u5230</span><select class=\"finder-jump-sel\" title=\"\u5217\u8868\u6EDA\u5230\u8FD9\u4E00\u7EC4\"></select></div>` +\n      `<div class=\"finder-list\"><div class=\"finder-empty\">\u52A0\u8F7D\u76EE\u5F55\u2026</div></div>`;\n    parent.append(this.el);   // \u4F4D\u7F6E\u7531 #stage \u7684 grid \u547D\u540D\u533A\u57DF\u9489\u6B7B\uFF08.finder \u5360 main\u3001pad \u5360 pad\uFF09\uFF0C\u548C\u8282\u70B9\u987A\u5E8F\u65E0\u5173\uFF08user\u300Ckeyboard\u4E0D\u5E94\u8BE5\u7528flex\uFF0C\u8FD9\u662F\u4E00\u4E2A\u5F88\u56FA\u5B9A\u7684\u6709\u7740\u5F88\u4E25\u5BC6\u903B\u8F91\u7684\u4E1C\u897F\u300D\uFF09\n    this.el.querySelector<HTMLInputElement>(\".finder-q\")!.addEventListener(\"input\", (e) => { this.q = (e.target as HTMLInputElement).value; this.render(); });\n    this.el.querySelector<HTMLSelectElement>(\".finder-sort\")!.addEventListener(\"change\", (e) => { this.mode = (e.target as HTMLSelectElement).value as SortMode; this.render(); });\n    this.el.querySelector<HTMLSelectElement>(\".finder-jump-sel\")!.addEventListener(\"change\", (e) => this.jumpTo(Number((e.target as HTMLSelectElement).value)));\n    this.el.addEventListener(\"click\", (e) => void this.onClick(e));\n    // \u6EDA\u52A8\u65F6\u8DF3\u8F6C\u4E0B\u62C9\u8DDF\u7740\u663E\u793A\u300C\u73B0\u5728\u5728\u54EA\u4E00\u7EC4\u300D\uFF08\u4E00\u5E27\u6700\u591A\u7B97\u4E00\u6B21\uFF09\n    let raf = 0;\n    this.el.querySelector(\".finder-list\")!.addEventListener(\"scroll\", () => { if (!raf) raf = requestAnimationFrame(() => { raf = 0; this.markJump(); }); }, { passive: true });\n  }\n  get isOpen(): boolean { return !this.el.hidden; }\n  /** \u9876\u6761\u300C\u952E\u76D8\u300D\u94AE\u4EAE\u4E0D\u4EAE\uFF08\u5BBF\u4E3B\u5728\u952E\u76D8\u5F00 / \u5173\u65F6\u544A\u8BC9\u5B83\uFF09\u3002 */\n  setPadShown(on: boolean): void { this.el.querySelector(\".finder-pad\")?.classList.toggle(\"is-on\", on); }\n  async show(o: { playOnly?: boolean } = {}): Promise<void> {\n    this.el.hidden = false; this.playOnly = !!o.playOnly;\n    this.el.querySelector(\".finder-title\")!.textContent = this.playOnly ? \"\u4E50\u5668\u76EE\u5F55\uFF08\u5F39\u7740\u73A9\uFF09\" : `\u627E\u4EBA\u7ED9\u300C${this.host.roleName()}\u300D`;\n    this.el.querySelector('[data-v=\"back\"]')!.textContent = this.playOnly ? \"\u2190 \u6B4C\u5E93\" : \"\u2190 \u8C31\";\n    this.el.querySelector(\".finder-hint\")!.textContent = this.playOnly ? \"\u70B9\u4E00\u4EF6\u4E50\u5668 \u2192 \u6311\u8C01\u6765\u6F14 \u2192 \u7528\u952E\u76D8\u5F39\u7740\u73A9\u3002\u8981\u7ED9\u6B4C\u91CC\u7684\u58F0\u90E8\u9009\u4E50\u5668\uFF1A\u5F00\u4E00\u9996\u6B4C\uFF0C\u70B9\u8C31\u524D\u9762\u7684\u58F0\u90E8\u540D\u3002\" : HINT;\n    this.el.querySelector<HTMLSelectElement>(\".finder-sort\")!.value = this.mode;\n    if (!this.cat) {\n      this.loading ??= (async () => {\n        const [cat, sprite] = await Promise.all([loadCatalog(this.host.base), loadIconSprite(this.host.base)]);\n        const doc = new DOMParser().parseFromString(sprite, \"image/svg+xml\"), svg = doc.documentElement;\n        if (svg.tagName.toLowerCase() === \"svg\") { const node = document.importNode(svg, true) as unknown as SVGElement; node.setAttribute(\"style\", \"display:none\"); this.el.prepend(node); }\n        this.cat = cat;\n      })().catch((e) => { this.el.querySelector(\".finder-list\")!.innerHTML = `<div class=\"finder-empty\">\u76EE\u5F55\u52A0\u8F7D\u4E0D\u4E86\uFF1A${esc((e as Error).message)}</div>`; throw e; }).finally(() => { this.loading = null; });\n      await this.loading;\n    }\n    this.render();\n  }\n  hide(): void { this.el.hidden = true; }\n  private pickOf(key: string): FinderPick | null {\n    if (!this.cat) return null;\n    const [cid, rest] = key.split(\"|\"), c = this.cat.byId.get(cid); if (!c) return null;\n    if (rest === \"voice\") return { kind: \"voice\", concept: c };\n    const p = providersOf(this.cat, c).find((x) => gmKey(x) === rest);\n    return p ? { kind: \"gs\", concept: c, provider: p } : null;\n  }\n  private async onClick(e: Event): Promise<void> {\n    const t = e.target as HTMLElement, btn = t.closest<HTMLElement>(\"[data-v]\"), row = t.closest<HTMLElement>(\".inst-row\"), prov = t.closest<HTMLElement>(\".prov\");\n    const rowOf = (el: HTMLElement) => (el.closest(\".inst-prov\")?.previousElementSibling as HTMLElement | null)?.dataset.o ?? \"\";   // \u63D0\u4F9B\u8005\u6240\u5728\u7684\u90A3\u4E00\u884C\uFF08\u7EC4::\u6982\u5FF5\uFF09\n    const v = btn?.dataset.v;\n    if (v === \"back\") { this.host.close(); return; }\n    if (v === \"pad\") { this.host.togglePad(); return; }\n    if (v && btn) {\n      const key = btn.closest<HTMLElement>(\"[data-p]\")?.dataset.p ?? \"\", pick = this.pickOf(key); if (!pick) return;\n      if (v === \"play\") { await this.host.playHead(pick); return; }\n      if (v === \"cast\") { await this.host.cast(pick); return; }\n    }\n    if (prov) { const key = prov.dataset.p!; if (this.selected !== key) { this.selected = key; this.renderAnchored(rowOf(prov)); await this.host.audition(this.pickOf(key)); } return; }\n    if (row) {\n      const id = row.dataset.c!, o = row.dataset.o!;\n      if (this.opened === o) this.opened = null;\n      else { this.opened = o; const c = this.cat!.byId.get(id)!, pk = row.dataset.k, first = providersOf(this.cat!, c).find((x) => !pk || gmKey(x) === pk); /* \u97F3\u8272\u884C = \u8BD5\u542C\u5B83\u81EA\u5DF1 */ const key = first ? `${id}|${gmKey(first)}` : c.kind === \"voice\" ? `${id}|voice` : \"\"; this.selected = key; this.renderAnchored(o, true); if (key) await this.host.audition(this.pickOf(key)); return; }\n      this.renderAnchored(o);\n    }\n  }\n  render(): void {\n    const list = this.el.querySelector(\".finder-list\")!; if (!this.cat) return;\n    const groups = groupConcepts(this.cat, this.mode, this.q), jump = this.el.querySelector<HTMLElement>(\".finder-jump\")!;\n    // \u7C7B\u7EA7\u8DF3\u8F6C\uFF08user 2026-10-08\u300C\u5206\u7C7B\u80FD\u4E0D\u80FD\u6709\u4E00\u4E2A\u7C7B\u7EA7\u522B\u7684\u8DF3\u8F6C\u529F\u80FD\uFF0C\u4E0D\u7136\u4E00\u4E2A\u4E00\u4E2A\u4E0B\u62C9\u5F88\u7D2F\u300D\uFF09\uFF1A\u4E00\u7EC4\u4E00\u9879\uFF0C\u9009\u4E86\u5217\u8868\u6EDA\u5230\u90A3\u7EC4\uFF1B\u53EA\u6709\u4E00\u7EC4\u5C31\u4E0D\u51FA\u3002\n    //   \u505A\u6210\u4E0B\u62C9\uFF08user \u540C\u65E5\u300Ccategory\u9009\u9879\u80FD\u505A\u6210\u4E0B\u62C9\u800C\u4E0D\u662F\u6ED1\u52A8\u5417\u300D\uFF1B\u539F\u6765\u662F\u6A2A\u7740\u6ED1\u7684\u4E00\u6392\u7C92\uFF09\n    jump.hidden = groups.length < 2;\n    jump.querySelector(\"select\")!.innerHTML = groups.map((g, k) => `<option value=\"${k}\">${esc(g.label)} \u00B7 ${g.items.length} \u4EF6</option>`).join(\"\");\n    if (!groups.length) { list.innerHTML = `<div class=\"finder-empty\">\u6CA1\u6709\u53EB\u300C${esc(this.q)}\u300D\u7684</div>`; return; }\n    // \u591A\u5217\uFF082026-10-09\uFF0Cuser\u300C\u6311\u4E50\u66F2\u754C\u9762\u5230\u65F6\u5019\u5C4F\u5E55\u7A7A\u95F4\u591F\u7684\u8BDD\u505A\u6210\u591A\u5217\u7684\uFF0C\u597D\u6311\u4E00\u70B9\u300D\uFF09\uFF1A\u6BCF\u7EC4\u91CC\u7684\u884C\u653E\u8FDB\u81EA\u9002\u5E94\u7F51\u683C\uFF08styles.css .finder-items\uFF1A\u6BCF\u683C\u81F3\u5C11 320 px\uFF0C\u7A84\u5C4F\u4E00\u5217\uFF09\uFF1B\n    //   \u70B9\u5F00\u7684\u300C\u8C01\u80FD\u6F14\u300D\u7D27\u8DDF\u5728\u884C\u540E\u9762\uFF08DOM \u987A\u5E8F\u4E0D\u53D8\uFF09\uFF0C\u6A2A\u8DE8\u6574\u884C\u3001\u843D\u5728\u90A3\u4EF6\u4E50\u5668\u6240\u5728\u90A3\u4E00\u884C\u7684\u4E0B\u9762\uFF08grid dense\uFF0C\u540C\u4E00\u884C\u522B\u7684\u683C\u5B50\u4E0D\u88AB\u6324\u8D70\uFF09\n    list.innerHTML = groups.map((g, k) => `<div class=\"finder-group\" data-g=\"${k}\"><div class=\"finder-group-h\">${esc(g.label)}<span>${g.items.length}</span></div><div class=\"finder-items\">${g.items.map((e) => this.rowHtml(e, g.id)).join(\"\")}</div></div>`).join(\"\");\n    this.markJump();\n  }\n  /** \u91CD\u753B\uFF0C\u4F46\u628A anchor \u8FD9\u4EF6\u4E50\u5668\u7684\u90A3\u4E00\u884C\u9489\u5728\u5C4F\u5E55\u4E0A\u539F\u6765\u7684\u4F4D\u7F6E\uFF08user 2026-10-08\u300C\u6362\u4E50\u5668\u73A9\uFF0C\u5F39\u51E0\u4E0B\uFF0C\u9009\u4E50\u5668\u6EDA\u52A8\u4F1A\u8DF3\u5230\u522B\u7684\u5730\u65B9\u53BB\u300D\uFF1A\n   *  \u70B9\u53E6\u4E00\u4EF6 = \u4E0A\u9762\u5C55\u5F00\u7684\u90A3\u4EF6\u6536\u8D77\uFF0C\u6574\u5F20\u5217\u8868\u5F80\u4E0A\u7F29\uFF0C\u539F\u6765\u53C8\u7528 scrollIntoView \u53BB\u8FFD\u9009\u4E2D\u9879\u3001\u5728 iPad \u4E0A\u8FD8\u4F1A\u8FDE\u5916\u5C42\u4E00\u8D77\u6EDA\u2014\u2014\u624B\u6307\u5E95\u4E0B\u90A3\u884C\u5C31\u8DD1\u4E86\uFF09\u3002\n   *  reveal = \u521A\u5C55\u5F00\u7684\uFF1A\u5B83\u7684\u300C\u8C01\u80FD\u6F14\u300D\u9732\u4E0D\u5168\u5C31\u5F80\u4E0A\u632A\u4E00\u70B9\uFF0C\u4F46\u8FD9\u4E00\u884C\u4E0D\u632A\u5230\u7EC4\u5934\u5E95\u4E0B\u3002\u53EA\u6EDA\u5217\u8868\u81EA\u5DF1\u3002 */\n  private renderAnchored(anchor: string, reveal = false): void {\n    const list = this.el.querySelector<HTMLElement>(\".finder-list\")!, sel = `.inst-row[data-o=\"${CSS.escape(anchor)}\"]`;\n    const before = list.querySelector<HTMLElement>(sel)?.getBoundingClientRect().top;\n    this.render();\n    const row = list.querySelector<HTMLElement>(sel); if (!row || before === undefined) return;\n    list.scrollTop += row.getBoundingClientRect().top - before;\n    if (!reveal) return;\n    const body = row.nextElementSibling as HTMLElement | null; if (!body?.classList.contains(\"inst-prov\")) return;\n    const lr = list.getBoundingClientRect(), hdr = (row.closest(\".finder-group\")?.querySelector<HTMLElement>(\".finder-group-h\")?.offsetHeight ?? 0);\n    const over = body.getBoundingClientRect().bottom - lr.bottom, room = row.getBoundingClientRect().top - (lr.top + hdr);\n    if (over > 0 && room > 0) list.scrollTop += Math.min(over, room);\n    this.markJump();\n  }\n  /** \u5217\u8868\u6EDA\u5230\u7B2C k \u7EC4\u7684\u7EC4\u5934\uFF08\u53EA\u6EDA\u5217\u8868\u81EA\u5DF1\uFF0C\u4E0D\u7528 scrollIntoView\u2014\u2014\u5B83\u4F1A\u8FDE\u5E26\u6EDA\u5916\u5C42\uFF09\u3002 */\n  private jumpTo(k: number): void {\n    const list = this.el.querySelector<HTMLElement>(\".finder-list\")!, g = list.querySelector<HTMLElement>(`[data-g=\"${k}\"]`); if (!g) return;\n    list.scrollTop += g.getBoundingClientRect().top - list.getBoundingClientRect().top;\n    this.markJump();\n  }\n  /** \u8DF3\u8F6C\u4E0B\u62C9\u663E\u793A\u300C\u73B0\u5728\u5728\u54EA\u4E00\u7EC4\u300D\uFF08\u7EC4\u5934\u9876\u5230\u5217\u8868\u9876\u7684\u6700\u540E\u4E00\u7EC4\uFF09\u3002\u6EDA\u5230\u5E95\u65F6\uFF1A\u6700\u540E\u51E0\u7EC4\u77ED\u3001\u7EC4\u5934\u9876\u4E0D\u5230\u5217\u8868\u9876\u2014\u2014\u4EBA\u521A\u9009\u7684\u90A3\u7EC4\u6BD4\u7B97\u51FA\u6765\u7684\u9760\u540E\u5C31\u7559\u7740\u5B83\uFF0C\u4E0D\u5F80\u56DE\u5F39\u3002 */\n  private markJump(): void {\n    const list = this.el.querySelector<HTMLElement>(\".finder-list\")!, jump = this.el.querySelector<HTMLElement>(\".finder-jump\")!; if (jump.hidden) return;\n    const sel = jump.querySelector(\"select\")!, top = list.getBoundingClientRect().top + 1;\n    let cur = 0;\n    for (const g of list.querySelectorAll<HTMLElement>(\"[data-g]\")) { if (g.getBoundingClientRect().top <= top) cur = Number(g.dataset.g); else break; }\n    const atBottom = list.scrollTop + list.clientHeight >= list.scrollHeight - 2;\n    if (atBottom && Number(sel.value) > cur) return;\n    if (sel.value !== String(cur)) sel.value = String(cur);\n  }\n  private rowHtml(e: Entry, groupId: string): string {\n    const cat = this.cat!, c = e.concept, pk = e.preset ? gmKey(e.preset) : \"\", o = `${groupId}::${c.id}${pk ? `::${pk}` : \"\"}`, open = this.opened === o, icon = c.icon?.id;\n    // \u6309\u66F2\u98CE\u663E\u793A\u627F\u91CD\uFF1A\u2605\u2605\u2605 \u627F\u91CD / \u2605\u2605 \u5E38\u7528 / \u2605 \u70B9\u7F00\uFF08\u4ED3\u9F20 v3\uFF1Buser\u300C\u6BCF\u4E2A\u98CE\u91CC\u9762\u6309\u7167\u627F\u91CD\u6392\u2026\u8BA9\u4ED6ui\u91CC\u9762\u663E\u793A\u51FA\u6765\u300D\uFF09\uFF1B\u97F3\u8272\u884C = \u8FD9\u4E2A\u97F3\u8272\u81EA\u5DF1\u7684\uFF08v8 \u8D77\u9010\u4E2A\u97F3\u8272\u5224\uFF09\n    const w = e.weight ?? 0, stars = w ? `<span class=\"inst-w\" title=\"${esc(weightLabel(cat, w))}\">${\"\u2605\".repeat(w)}</span>` : \"\";\n    const asName = e.as ? (cat.byId.get(e.as)?.names.zh ?? e.as) : \"\", asTag = asName ? `<span class=\"inst-as\" title=\"\u5728\u8FD9\u79CD\u98CE\u91CC\u9876\u66FF\u300C${esc(asName)}\u300D\">\u9876 ${esc(asName)}</span>` : \"\";\n    const year = e.preset?.year ?? c.year, approx = e.preset ? !!(e.preset as { yearApprox?: boolean }).yearApprox : c.yearApprox;\n    const meta = [eraLabel(cat, c), year !== null && year !== undefined ? `${approx ? \"\u7EA6 \" : \"\"}${fmtYear(year)}` : \"\"].filter(Boolean).join(\" \u00B7 \");\n    let body = \"\";\n    if (open) {\n      // \u6708\u8BFB\u53EA\u5728\u4EBA\u58F0\u7C7B\u6982\u5FF5\u4E0B\u9762\uFF08user 2026-10-07\u300C\u4E3A\u4EC0\u4E48\u6708\u8BFB\u53EF\u4EE5\u5168\u91CF\u5E73\u66FF\u6240\u6709\u4E50\u5668\u2026\u4E5F\u8BB8\u4E0D\u5927\u5408\u9002\u300D\uFF1A\u5979\u5B9E\u73B0\u7684\u662F\u4EBA\u58F0\uFF0C\u4E0D\u662F\u5C0F\u63D0\u7434\uFF1B\n      //   \u300C\u8BA9\u5979\u54FC\u4E00\u4E0B\u8FD9\u6761\u7EBF\u542C\u542C\u300D\u5F52\u76D1\u542C\u65B9\u5F0F\uFF08\u8349\u7A3F\u542C\uFF0C\u5951\u7EA6 \u00A71\uFF09\uFF0C\u4E0D\u662F\u9009\u89D2\uFF09\n      const provs = providersOf(cat, c).filter((x) => !pk || gmKey(x) === pk), pitched = c.kind === \"voice\";   // \u97F3\u8272\u884C = \u53EA\u5217\u5B83\u81EA\u5DF1\n      // \u5E73\u66FF\u5F31\u5316\u663E\u793A\uFF08user\u300C\u5E73\u66FF\u6362\u7684ui\u4E5F\u9700\u8981\u5F04\u51FA\u533A\u522B\u300D\u300C\u4E5F\u8BB8\u9700\u8981\u5F31\u5316\u663E\u793A\u300D\uFF09\uFF1A\u865A\u7EBF\u6846\u3001\u7070\u5B57\u3001\u300C\u9876\u66FF\u300D\u6807\n      const prov = (key: string, label: string, note: string, playable: boolean, sub = false) => `<div class=\"prov${this.selected === key ? \" is-on\" : \"\"}${sub ? \" sub\" : \"\"}\" data-p=\"${esc(key)}\"><div class=\"prov-l\"><b>${sub ? `<span class=\"prov-tag\">\u9876\u66FF</span>` : \"\"}${label}</b>${note ? `<small>${note}</small>` : \"\"}</div>` +\n        `<div class=\"prov-b\">${playable ? `<button class=\"btn\" data-v=\"play\" title=\"\u7528\u5B83\u653E\u8FD9\u6761\u58F0\u90E8\u7684\u5F00\u5934\">\u25B6 \u542C\u5F00\u5934</button>` : \"\"}${this.playOnly ? \"\" : `<button class=\"btn primary\" data-v=\"cast\" title=\"\u9009\u5B83\u6765\u6F14\u8FD9\u4E2A\u58F0\u90E8\uFF0C\u56DE\u5230\u4E50\u5668\u9875\">\u9009\u8FD9\u4E2A</button>`}</div></div>`;\n      body = `<div class=\"inst-prov\">` +\n        provs.map((p) => prov(`${c.id}|${gmKey(p)}`, `${p.note !== undefined ? `\u9F13\u4EF6 \u00B7 ${esc(p.gmName)}\uFF08Standard \u9F13\u7EC4\u7684 ${p.note} \u53F7\u952E\uFF09` : p.bank === 128 ? `\u9F13\u7EC4 \u00B7 ${esc(p.gmName)}` : `GeneralUser GS \u00B7 ${esc(p.gmName)}`}`, p.kind === \"substitute\" ? `\u9876\u66FF${p.basis === \"official\" ? \"\uFF08GM \u539F\u6587\u8BA4\u53EF\uFF09\" : p.basis === \"lineage\" ? \"\uFF08\u524D\u8EAB\uFF09\" : p.basis === \"imitation\" ? \"\uFF08\u4EFF\u58F0\uFF09\" : p.basis === \"family\" ? \"\uFF08\u540C\u7C7B\uFF09\" : \"\uFF08\u53EA\u662F\u540C\u540D\uFF09\"}${p.reason ? `\uFF1A${esc(p.reason)}` : \"\"}` : \"\", true, p.kind === \"substitute\")).join(\"\") +\n        (pitched ? prov(`${c.id}|voice`, \"\u5C0F\u6708\u76F8\", \"\u5531\u6B4C\u8BCD\uFF1B\u6CA1\u5199\u6B4C\u8BCD\u7684\u97F3\u6309\u300C\u54FC\u7684\u5B57\u300D\u5531\", false) : \"\") +\n        (!provs.length && !pitched ? `<div class=\"prov-none\">\u76EE\u5F55\u91CC\u8FD8\u6CA1\u6709\u8C01\u80FD\u6F14\u5B83</div>` : \"\") + `</div>`;\n    }\n    return `<div class=\"inst-row${open ? \" is-open\" : \"\"}\" data-c=\"${esc(c.id)}\" data-o=\"${esc(o)}\"${pk ? ` data-k=\"${esc(pk)}\"` : \"\"}>` +\n      (icon ? `<svg class=\"inst-ico\" aria-hidden=\"true\"><use href=\"#${esc(icon)}\"/></svg>` : `<span class=\"inst-ico none\">${esc(c.names.zh.slice(0, 1))}</span>`) +\n      `<div class=\"inst-name\"><b><span class=\"zh\">${esc(c.names.zh)}</span>${e.preset ? `<span class=\"inst-preset\"> \u00B7 ${esc(e.preset.gmName)}</span>` : \"\"}${asTag}</b>${stars}<span>${esc(roleNameOf(c))}${c.names.ja ? ` \u00B7 ${esc(c.names.ja)}` : \"\"}</span></div><div class=\"inst-meta\">${esc(meta)}</div></div>` + body;\n  }\n}\n", "// spectrum.ts \u2014\u2014 \u6DF7\u97F3\u53F0 EQ \u9875\u5361\u7247\u80CC\u666F\u7684\u9891\u8C31\uFF08v0.10.11\uFF09\uFF1A\u5F55\u97F3\u623F\u62F7\u6765\u7684\u6700\u8FD1 2048 \u4E2A\u91C7\u6837 \u2192 \u52A0\u7A97 FFT \u2192 \u6309\u5BF9\u6570\u9891\u7387\u5E76\u6210 96 \u4E2A\u9891\u5E26\uFF08dB\uFF09\u2192 \u5E73\u6ED1\u3002\u7EAF\u51FD\u6570 + \u4E00\u4E2A\u5C0F\u7C7B\u3002\n// created 2026-10-10 by Claude Opus 5.5\uFF08user\u300C\u770B\u4E0D\u5230\u9891\u8C31\u80CC\u666F\u8C03\u5747\u8861\u7B49\u4E8E\u778E\u5B50\u2026\u505A\u6210\u5361\u7247\u7684\u80CC\u666F\u52A8\u753B\u300D\u300C\u8BB0\u5F97\u6211\u8BF4\u7684\u7701cpu\uFF0C\u53EA\u6709\u770B\u89C1\u7684\u65F6\u5019\u624D\u8FDB\u884C\u7EDF\u8BA1\u548C\u7ED8\u5236\u300D\uFF09\n// \u753B\u6CD5 = \u534A\u900F\u660E\u7684\u586B\u5145\u9762\uFF08\u4E0D\u662F\u7AD6\u6761\uFF1A\u6761\u5F62\u6296\u3001\u770B\u4E0D\u51FA\u5F62\u72B6\uFF1B\u53EA\u753B\u7EBF\uFF1A\u5F31\u7684\u9891\u6BB5\u770B\u4E0D\u51FA\u5206\u91CF\uFF09+ \u4E0A\u9762\u4E00\u6761\u8FD9\u4E00\u683C EQ \u7684\u54CD\u5E94\u66F2\u7EBF\uFF08engine/fx.ts eqResponseDb\uFF09\u3002\n\nexport const SPEC_BANDS = 96, SPEC_FMIN = 30, SPEC_FMAX = 16000;\n/** \u7B2C k \u4E2A\u9891\u5E26\u7684\u4E2D\u5FC3\u9891\u7387\uFF08\u5BF9\u6570\u7B49\u5206 30 Hz \u2013 16 kHz\uFF09\u3002 */\nexport const bandHz = (k: number): number => SPEC_FMIN * (SPEC_FMAX / SPEC_FMIN) ** ((k + 0.5) / SPEC_BANDS);\n/** \u9891\u7387 \u2192 \u6A2A\u5750\u6807 0\u20131\uFF08\u540C\u9891\u5E26\u7684\u5BF9\u6570\u523B\u5EA6\uFF09\u3002 */\nexport const xOfHz = (f: number): number => Math.log(Math.max(SPEC_FMIN, Math.min(SPEC_FMAX, f)) / SPEC_FMIN) / Math.log(SPEC_FMAX / SPEC_FMIN);\n\n/** \u539F\u5730 radix-2 FFT\uFF08re / im \u957F\u5EA6 = 2 \u7684\u5E42\uFF09\u3002 */\nexport function fft(re: Float64Array, im: Float64Array): void {\n  const n = re.length;\n  for (let i = 1, j = 0; i < n; i++) { let bit = n >> 1; for (; j & bit; bit >>= 1) j ^= bit; j ^= bit; if (i < j) { [re[i], re[j]] = [re[j], re[i]]; [im[i], im[j]] = [im[j], im[i]]; } }\n  for (let len = 2; len <= n; len <<= 1) {\n    const ang = (-2 * Math.PI) / len, wr = Math.cos(ang), wi = Math.sin(ang);\n    for (let i = 0; i < n; i += len) {\n      let cr = 1, ci = 0;\n      for (let k = 0; k < len / 2; k++) {\n        const a = i + k, b = a + len / 2, tr = re[b] * cr - im[b] * ci, ti = re[b] * ci + im[b] * cr;\n        re[b] = re[a] - tr; im[b] = im[a] - ti; re[a] += tr; im[a] += ti;\n        const ncr = cr * wr - ci * wi; ci = cr * wi + ci * wr; cr = ncr;\n      }\n    }\n  }\n}\n/** \u4E00\u6BB5\u91C7\u6837 \u2192 96 \u4E2A\u70B9\u4E0A\u7684**\u6BCF\u516B\u5EA6\u529F\u7387**\uFF08dB\uFF1Bv0.10.28\uFF09\uFF1AdP/d log\u2082f\uFF0C\u8FDE\u7EED\u7684\u5BC6\u5EA6\uFF0C\u4E0D\u662F\u300C\u5206\u6210\u51E0\u4E2A\u683C\u5B50\u5404\u88C5\u591A\u5C11\u300D\u2014\u2014\n *  \u70B9\u6570\uFF0896 \u4E2A\uFF0C30 Hz \u2013 16 kHz \u5BF9\u6570\u7B49\u5206\uFF0C\u7EA6\u6BCF\u516B\u5EA6 10.6 \u4E2A\uFF09\u53EA\u662F\u91C7\u6837\u5BC6\u5EA6\uFF0C\u8BFB\u6570\u4E0D\u8DDF\u7740\u5B83\u53D8\uFF1B\u7C89\u566A\u58F0 = \u5E73\u7684\u3001\u767D\u566A\u58F0 = \u6BCF\u516B\u5EA6 +3 dB\u3002\n *  \u00B7 \u9AD8\u5904\uFF08\u4E00\u4E2A\u70B9\u7BA1\u7684\u90A3\u4E00\u5C0F\u6BB5\u6BD4 FFT \u4E00\u683C\u5BBD\uFF09\uFF1A\u8FD9\u4E00\u6BB5\u91CC\u6240\u6709\u683C\u5B50\uFF08\u6309\u683C\u5B50\u4E2D\u5FC3\u5F52\u6BB5\uFF0C\u4E00\u683C\u53EA\u8FDB\u4E00\u6BB5\uFF09\u7684\u529F\u7387\u52A0\u8D77\u6765 \u00F7 \u8FD9\u4E00\u6BB5\u6709\u51E0\u4E2A\u516B\u5EA6\u5BBD\uFF1B\n *  \u00B7 \u4F4E\u5904\uFF08\u7EA6 350 Hz \u4EE5\u4E0B\uFF0C\u6BD4\u4E00\u683C\u8FD8\u7A84\uFF1B2048 \u70B9 / 48 kHz = 23 Hz \u4E00\u683C\uFF09\uFF1A\u6BCF\u4E00\u683C\u7684\u529F\u7387\u644A\u5230\u5B83\u81EA\u5DF1\u8986\u76D6\u7684\u90A3\u51E0\u4E2A\u516B\u5EA6\u4E0A\uFF08\u683C\u5B50\u8D8A\u4F4E\u3001\u8986\u76D6\u7684\u516B\u5EA6\u8D8A\u5BBD\uFF09\uFF0C\n *    \u70B9\u843D\u5728\u4E24\u683C\u4E4B\u95F4 = \u6309\u5BF9\u6570\u9891\u7387\u5728\u4E24\u683C\u4E4B\u95F4\u63D2\uFF08\u4E0D\u662F\u53F0\u9636\uFF09\u3002\n *  \u529F\u7387\u6309\u6C49\u5B81\u7A97\u7684\u7B49\u6548\u566A\u58F0\u5E26\u5BBD\u5F52\u4E00\uFF08\u4E00\u683C\u91CC\u4E00\u4E2A\u6EE1\u5E45\u6B63\u5F26\u7684\u529F\u7387 = 1\uFF09\u3002user 2026-10-10\u300Ceq\u7684\u9891\u8C31\u6211\u8BB0\u5F97\u6709\u4E24\u79CD\u4E00\u4E2A\u662Fdf\u4E00\u4E2A\u662Fd1/f\u7528\u54EA\u4E2A\u66F4\u5408\u7406\uFF1F\u2026\u6216\u8005\u5C31\u7528\u80FD\u91CF\uFF1F\u300D\n *  \u2192\u300Cboth yes\u300D\u2192\u300Cnot discrete bands, but perhaps power per octave?\u300D\u300Cfor band how many bands? if it is only three bars it beats the propose of a spectrum\u300D\u3002 */\nexport function bandsDb(x: Float32Array, sr: number): Float32Array {\n  const n = x.length, re = new Float64Array(n), im = new Float64Array(n);\n  let wsum = 0, w2 = 0; for (let i = 0; i < n; i++) { const w = 0.5 - 0.5 * Math.cos((2 * Math.PI * i) / (n - 1)); re[i] = x[i] * w; wsum += w; w2 += w * w; }   // \u6C49\u5B81\u7A97\n  fft(re, im);\n  const out = new Float32Array(SPEC_BANDS).fill(-120), binHz = sr / n, norm = 2 / wsum, enbw = (n * w2) / (wsum * wsum), half = n / 2;   // \u6C49\u5B81 \u2248 1.5 \u683C\n  const pw = (b: number) => { const m = Math.hypot(re[b], im[b]) * norm; return (m * m) / enbw; };\n  const dens = (b: number) => (pw(b) * b * Math.LN2);   // \u7B2C b \u683C\u644A\u5F00\u7684\u6BCF\u516B\u5EA6\u529F\u7387\uFF1A\u529F\u7387 \u00F7\uFF08\u8FD9\u4E00\u683C\u5BBD\u51E0\u4E2A\u516B\u5EA6 = binHz \u00F7 (f \u00B7 ln2)\uFF0Cf = b \u00B7 binHz\uFF09\n  const span = Math.log2(SPEC_FMAX / SPEC_FMIN) / SPEC_BANDS;   // \u4E00\u4E2A\u70B9\u7BA1\u51E0\u4E2A\u516B\u5EA6\n  for (let k = 0; k < SPEC_BANDS; k++) {\n    const lo = SPEC_FMIN * (SPEC_FMAX / SPEC_FMIN) ** (k / SPEC_BANDS), hi = SPEC_FMIN * (SPEC_FMAX / SPEC_FMIN) ** ((k + 1) / SPEC_BANDS);\n    let e = 0, any = false;\n    for (let b = Math.max(1, Math.ceil(lo / binHz)); b < half && b * binHz < hi; b++) { e += pw(b); any = true; }\n    let v: number;\n    if (any) v = e / span;\n    else {   // \u6BD4\u4E00\u683C\u8FD8\u7A84\uFF1A\u5728\u4E24\u683C\u4E4B\u95F4\u6309\u5BF9\u6570\u9891\u7387\u63D2\uFF08dB \u91CC\u63D2\uFF09\n      const fb = Math.sqrt(lo * hi) / binHz, b0 = Math.min(half - 2, Math.max(1, Math.floor(fb))), t = Math.log(Math.max(fb, 1) / b0) / Math.log((b0 + 1) / b0);\n      const d0 = 10 * Math.log10(Math.max(1e-12, dens(b0))), d1 = 10 * Math.log10(Math.max(1e-12, dens(b0 + 1)));\n      out[k] = d0 + (d1 - d0) * Math.min(1, Math.max(0, t)); continue;\n    }\n    out[k] = v > 1e-12 ? 10 * Math.log10(v) : -120;\n  }\n  return out;\n}\n/** \u5E73\u6ED1\uFF1A\u6DA8\u5F97\u5FEB\uFF08\u76F4\u63A5\u5230\uFF09\u3001\u843D\u5F97\u6162\uFF08\u6BCF\u6B21\u6700\u591A\u843D fall dB\uFF09\u3002 */\nexport function smoothBands(prev: Float32Array | undefined, next: Float32Array, fall = 6): Float32Array {\n  if (!prev) return next;\n  const o = new Float32Array(next.length); for (let k = 0; k < next.length; k++) o[k] = next[k] >= prev[k] ? next[k] : Math.max(next[k], prev[k] - fall);\n  return o;\n}\n/** 96 \u4E2A\u70B9 \u2192 SVG \u586B\u5145\u9762\u7684 path\uFF08viewBox 0 0 100 100\uFF1BdB \u8303\u56F4 [lo, hi] \u6620\u5230 100 \u2192 0\uFF09\u3002\u6BCF\u516B\u5EA6\u529F\u7387\u6BD4\u4EE5\u524D\u300C\u4E00\u683C\u6700\u5927\u7684\u300D\u9AD8\u7EA6 10 dB\uFF08\u4E00\u4E2A\u70B9\u7BA1 0.094 \u4E2A\u516B\u5EA6\uFF09\uFF1A\u8303\u56F4\u8DDF\u7740\u5F80\u4E0A\u632A\u3002 */\nexport function areaPath(b: Float32Array, lo = -80, hi = 4): string {\n  const y = (d: number) => (100 * (hi - Math.max(lo, Math.min(hi, d)))) / (hi - lo);\n  let d = `M0,100`; for (let k = 0; k < b.length; k++) d += `L${((100 * (k + 0.5)) / b.length).toFixed(2)},${y(b[k]).toFixed(2)}`;\n  return d + \"L100,100Z\";\n}\n", "// plugins.ts \u2014\u2014 \u6DF7\u97F3\u53F0\u7684\u63D2\u4EF6\u683C\uFF1A\u6BCF\u683C = \u4E00\u4E2A\u6548\u679C\u539F\u8BED\uFF08engine/fx.ts \u7684 kind\uFF09+ \u5B83\u7684\u5168\u91CF\u53C2\u6570\uFF1B\u9762\u677F = \u540C\u4E00\u7EC4\u53C2\u6570\u7684\u4E24\u79CD\u770B\u6CD5\uFF08\u4E00\u952E / \u5168\u91CF\uFF09\u3002\u7EAF\u51FD\u6570\u3002\n// created 2026-10-10 by Claude Opus 5.5\uFF08v0.10.8\uFF09\n// user 2026-10-10\uFF1A\u300C\u63D2\u4EF6\uFF1A\u53EF\u4EE5\u968F\u4FBF\u63D2\u2026\u7C7B\u4F3Cfl\u7684devick stack\u8FD9\u79CD\uFF1F\u800C\u4E0D\u662F\u5199\u6B7B\u8BF4\u54EA\u91CC\u80FD\u653E\u4EC0\u4E48\u3002\u7528\u6700general\u6700\u81EA\u7531\u7684\u65B9\u5F0F\u300D\n//   \u300C\u5982\u679C\u7528\u7684\u662F\u4E00\u4E2A\u516C\u5F0F\u7684\u8BDD\uFF0C\u90A3\u4E48\u6570\u636E\u5951\u7EA6\u4E00\u5F00\u59CB\u5C31\u7528\u6700\u8BE6\u5C3D\u7684\uFF0C\u751A\u81F3\u5982\u679C\u53EF\u4EE5\u7684\u8BDD\u80FD\u4E0D\u80FD\u51E0\u4E2A\u4E0D\u540C\u7684\u9762\u7248\u6A21\u5F0F\u80CC\u540E\u90FD\u662F\u540C\u4E00\u4E2A\u63D2\u4EF6\u3002\u7C7B\u4F3C\u4E13\u5BB6\u6A21\u5F0F\u548C\u4E00\u952E\u6A21\u5F0F\u3002\u7136\u540E\u6211\u5EFA\u8BAE\u662F\u5148\u505A\u540C\u65F6\u65B0\u624B\u548C\u5168\u91CF\u4E24\u4E2A\u9762\u7248\u300D\n//   \u300C\u57FA\u7840\u6570\u5B66\u53CD\u800C\u4E0D\u6015\u4E0D\u7528fable\u3002fable\u4E3B\u8981\u627F\u91CD\u8FD8\u662F\u67B6\u6784\u8BBE\u8BA1\u3002\u4E0B\u793C\u62DC\u6162\u6162\u7406\u5427\uFF0C\u4ECA\u5929\u5148\u6478ux\uFF0C\u5927\u4E0D\u4E86\u4EE5\u540E\u5403\u4E66\u300D\n//   \u2192 \u4ECA\u5929\u4E0D\u5347\u683C\u5F0F\uFF1A\u4E00\u683C\u5C31\u662F studio.json v2 \u73B0\u6210\u7684 FxV2 { id, kind, on?, params }\uFF1Bparams \u5B58\u5168\u91CF\uFF08\u539F\u8BED\u53C2\u6570\u8868\u7684\u6BCF\u4E00\u4E2A\uFF09\uFF0C\u4E00\u952E\u9762\u677F\u53EA\u662F\u6309\u516C\u5F0F\u5199\u8FDB\u53BB\u3002\n//   \u4E24\u4E2A\u300C\u4E3B\u7EBF\u7A0B\u6362\u7B97\u300D\u7684\u53C2\u6570\uFF1Aeq.hpAuto = 1\uFF08\u4F4E\u5207\u6309\u8FD9\u4E2A\u58F0\u90E8\u6700\u4F4E\u7684\u97F3\u81EA\u52A8\u653E\uFF09\u3001delay.syncBeats > 0\uFF08\u65F6\u95F4\u6309\u901F\u5EA6\u7B97\u51E0\u62CD\uFF09\u2014\u2014\u5F55\u97F3\u623F\u6536\u5230\u4E4B\u524D\u5C31\u6362\u6210 hpHz / timeMs\u3002\nimport { FX_KINDS, type ParamDef } from \"../engine/fx.ts\";\nimport type { FxV2 } from \"../format/contract.ts\";\n\nexport type Params = Record<string, number>;\n/** \u300C+\u300D\u91CC\u80FD\u63D2\u7684\uFF08\u4EFB\u4F55\u8F68\u3001\u4EFB\u4F55\u4F4D\u7F6E\uFF09\u3002 */\nexport const PLUGIN_KINDS = [\"eq\", \"comp\", \"reverb\", \"delay\", \"chorus\", \"gain\"] as const;\n/** \u6BCF\u6761\u8F68\u9ED8\u8BA4\u90A3\u4E00\u683C EQ \u7684 id\uFF1A\u6CA1\u78B0\u8FC7 = \u4E0D\u5728\u6587\u4EF6\u91CC\uFF08\u5F15\u64CE\u6CA1\u6709 = \u5E73\uFF09\uFF1B\u78B0\u4E86\u624D\u5199\u8FDB\u94FE\u7684\u6700\u524D\u9762\u3002\u80FD\u5173\u3001\u80FD\u6362\u9762\u677F\uFF0C\u4E0D\u80FD\u5220\uFF08user\u300C\u9ED8\u8BA4\u4F1A\u5E2E\u4F60\u5F00\u4E00\u4E2A\uFF0C\u4F60\u53EF\u4EE5\u6362\u4F46\u4E0D\u80FD\u5220\u300D\uFF09\u3002 */\nexport const DEFAULT_EQ_ID = \"eq\";\nexport const pluginName = (kind: string): string => FX_KINDS[kind]?.name ?? kind;\n\n/** \u4E3B\u7EBF\u7A0B\u6362\u7B97\u7684\u53C2\u6570\uFF08\u4E0D\u662F\u539F\u8BED\u7684\uFF0C\u5F55\u97F3\u623F\u4E0D\u8BA4\uFF09\u3002 */\nconst HOST_PARAMS: Record<string, ParamDef[]> = {\n  eq: [{ id: \"hpAuto\", unit: \"bool\", min: 0, max: 1, default: 0, label: \"\u81EA\u52A8\u4F4E\u5207\" }],\n  delay: [{ id: \"syncBeats\", unit: \"ratio\", min: 0, max: 2, default: 0, label: \"\u8DDF\u901F\u5EA6\uFF08\u51E0\u62CD\u4E00\u6B21\uFF1B0 = \u7528\u4E0A\u9762\u7684\u6BEB\u79D2\uFF09\" }],\n};\n/** \u5168\u91CF\u9762\u677F\uFF1A\u539F\u8BED\u53C2\u6570\u8868\u7684\u6BCF\u4E00\u4E2A + \u4E3B\u7EBF\u7A0B\u6362\u7B97\u7684\u90A3\u51E0\u4E2A\u3002 */\nexport function fullParams(kind: string): ParamDef[] { return [...(HOST_PARAMS[kind] ?? []), ...(FX_KINDS[kind]?.params ?? [])]; }\nexport function defaults(kind: string): Params { const p: Params = {}; for (const d of fullParams(kind)) p[d.id] = d.default; return p; }\n/** \u4E00\u683C\u7684\u53C2\u6570\uFF08\u7F3A\u7684\u8865\u9ED8\u8BA4\uFF09\u3002\u6DF7\u54CD / \u5EF6\u8FDF / \u5408\u5531\u6CA1\u5199\u300C\u539F\u58F0\u300D\u7684\uFF08v0.10.10 \u4E4B\u524D\u63D2\u7684\uFF09= \u5F55\u97F3\u623F\u7167\u65E7\u6309 1 \u2212 \u6E7F \u7B97\uFF0C\u8FD9\u91CC\u4E5F\u5982\u5B9E\u663E\u793A\u6210 1 \u2212 \u6E7F\u3002 */\nexport const paramsOf = (fx: FxV2): Params => {\n  const p: Params = { ...defaults(fx.kind), ...fx.params };\n  if ((fx.kind === \"reverb\" || fx.kind === \"delay\" || fx.kind === \"chorus\") && fx.params.dry === undefined) p.dry = Math.round((1 - p.mix) * 100) / 100;\n  return p;\n};\n/** \u8FD9\u4E00\u683C\u662F\u4E0D\u662F\u300C\u5168\u6E7F\u300D\uFF08\u539F\u58F0 0\u3001\u6E7F 100%\uFF1A\u5F53\u53D1\u9001\u7684\u8FD4\u56DE\u8F68\u7528\uFF1B\u51FA\u5230\u5B83 = \u539F\u58F0\u6CA1\u4E86\uFF09\u3002 */\nexport const fullyWet = (fx: FxV2): boolean => (fx.kind === \"reverb\" || fx.kind === \"delay\" || fx.kind === \"chorus\") && fx.on !== false && paramsOf(fx).dry === 0;\n\nexport interface SimpleControl { id: string; label: string; hint: string; kind: \"knob\" | \"toggle\" | \"choice\"; min?: number; max?: number; step?: number; choices?: { v: number; label: string }[]; fmt?: (v: number) => string }\nexport interface SimpleView {\n  controls: SimpleControl[];\n  /** \u5168\u91CF\u53C2\u6570\u6B63\u597D\u843D\u5728\u4E00\u952E\u7684\u516C\u5F0F\u4E0A = \u4E00\u952E\u9762\u677F\u7684\u8BFB\u6570\uFF1B\u4E0D\u662F\uFF08\u5728\u5168\u91CF\u91CC\u8C03\u8FC7\uFF09= null\u3002 */\n  read(p: Params): Record<string, number> | null;\n  /** \u4E00\u952E\u9762\u677F\u7684\u503C \u2192 \u5168\u91CF\u53C2\u6570\uFF08\u53EA\u6539\u516C\u5F0F\u7BA1\u7684\u90A3\u51E0\u4E2A\uFF0C\u522B\u7684\u7167\u7559\uFF09\u3002 */\n  write(v: Record<string, number>, p: Params): Params;\n  /** \u5168\u91CF\u53C2\u6570\uFF08\u843D\u4E0D\u5230\u516C\u5F0F\u4E0A\uFF09\u2192 \u6700\u63A5\u8FD1\u7684\u4E00\u952E\u503C\uFF08v0.10.14\uFF1Buser\u300Cbasic\u6A21\u5F0F\u4E0B\u5E94\u8BE5\u6709\u4E00\u4E2Aproject to basic\u6A21\u5F0F\u7684\u529F\u80FD\uFF0C\u4E0D\u7136\u7684\u8BDDbasic\u6A21\u5F0F\u4F1A\u662F\u88AB\u9501\u4F4F\uFF0C\u514D\u5F97\u4E0D\u5C0F\u5FC3override\u300D\uFF09\u3002 */\n  project(p: Params): Record<string, number>;\n}\nconst near = (a: number, b: number, e = 1e-3) => Math.abs(a - b) <= e;\nconst r1 = (x: number) => Math.round(x * 10) / 10;\n/** \u4E00\u952E\u65CB\u94AE\u7684\u683C\u5B50\uFF080\u20131\uFF0C0.05 \u4E00\u683C\uFF09\uFF1B\u51E0\u4E2A\u53C2\u6570\u5404\u81EA\u53CD\u63A8\u51FA\u7684\u4F4D\u7F6E\u53D6\u5E73\u5747 = \u79BB\u51E0\u4E2A\u90FD\u6700\u8FD1\u3002 */\nconst knob01 = (...xs: number[]) => Math.round(Math.max(0, Math.min(1, xs.reduce((a, b) => a + b, 0) / xs.length)) * 20) / 20;\nconst nearestBeat = (b: number | undefined) => (b ? [0.5, 0.75, 1].reduce((a, c) => (Math.abs(c - b) < Math.abs(a - b) ? c : a)) : 0.75);\nconst pct = (v: number) => `${Math.round(v * 100)}%`;\n// \u2500\u2500 \u7269\u7406\u91CF\u7EB2\uFF08v0.10.10\uFF0Cuser\u300C\u623F\u95F4\u5927\u5C0F\u4E3A\u4EC0\u4E48\u662F\u767E\u5206\u6BD4\u2026\u2026\u4E0D\u662F\u8BF4\u597D\u90FD\u7528SI\u5417\uFF1F\u90FD\u7528\u53EF\u4EE5\u7406\u89E3\u7684\u4E0D\u4F9D\u8D56\u4E0Econvention\u7684\u91CF\u7EB2\u300D\uFF09\u2500\u2500\n//   \u5B58\u7684\u8FD8\u662F\u539F\u8BED\u7684\u53C2\u6570\uFF08\u4E0B\u793C\u62DC Fable \u7406\u5951\u7EA6\u65F6\u518D\u5B9A\u5B58\u4EC0\u4E48\uFF09\uFF0C\u9762\u677F\u4E0A\u7684\u65CB\u94AE\u548C\u8BFB\u6570\u4E00\u5F8B\u6362\u7B97\u6210\u7269\u7406\u91CF\uFF1A\u79D2\u3001kHz\u3001dB\u3002\nconst clamp01 = (x: number) => Math.max(0, Math.min(1, x));\n/** Freeverb \u516B\u6761\u68B3\u72B6\u7684\u5E73\u5747\u957F\u5EA6\uFF0844.1 kHz \u4E0B 1378 \u4E2A\u91C7\u6837 \u2248 31 ms\uFF1B\u6309\u91C7\u6837\u7387\u7F29\u653E = \u65F6\u95F4\u4E0D\u53D8\uFF09\u3002 */\nconst COMB_AVG_S = 1378 / 44100, SR_REF = 48000;\n/** \u623F\u95F4\u5927\u5C0F \u2192 \u6DF7\u54CD\u65F6\u95F4 RT60\uFF08\u79D2\uFF1B\u4F4E\u9891\u90A3\u4E00\u622A\u8870\u51CF 60 dB \u8981\u591A\u4E45\uFF09\uFF1A\u53CD\u9988 = 0.7 + 0.28\u00B7room\uFF0C\u6BCF\u8FC7\u4E00\u904D\u68B3\u72B6\u8870\u51CF 20\u00B7log10(\u53CD\u9988) dB\u3002 */\nexport const rt60OfRoom = (room: number): number => (3 * COMB_AVG_S) / -Math.log10(0.7 + 0.28 * clamp01(room));\nexport const roomOfRt60 = (t: number): number => clamp01((10 ** ((-3 * COMB_AVG_S) / Math.max(0.01, t)) - 0.7) / 0.28);\n/** \u9AD8\u9891\u5438\u6536 \u2192 \u4ECE\u591A\u5C11 kHz \u5F00\u59CB\u8870\u51CF\uFF08\u68B3\u72B6\u91CC\u90A3\u4E2A\u4E00\u9636\u4F4E\u901A\u7684\u622A\u6B62\uFF1B\u6309 48 kHz \u7B97\uFF0C\u7EA6\u6570\uFF09\u3002 */\nexport const dampKHz = (damp: number): number => { const a = 0.4 * clamp01(damp); return a <= 1e-6 ? Infinity : (-SR_REF * Math.log(a)) / (2 * Math.PI) / 1000; };\nexport const dampOfKHz = (k: number): number => clamp01(Math.exp((-2 * Math.PI * k * 1000) / SR_REF) / 0.4);\n/** \u7EBF\u6027\u500D\u6570 \u2194 dB\uFF08\u221260 dB \u53CA\u4EE5\u4E0B = \u5173\uFF09\u3002 */\nexport const linDb = (x: number): number => (x <= 0.001 ? -60 : 20 * Math.log10(x));\nexport const dbLin = (d: number): number => (d <= -60 ? 0 : 10 ** (d / 20));\nconst dbt = (d: number) => (d <= -60 ? \"\u5173\" : `${d > 0 ? \"+\" : \"\"}${d.toFixed(1)} dB`);\n/** \u6BCF\u4E2A\u53C2\u6570\u5E72\u4EC0\u4E48\u7528\uFF08\u9762\u677F\u4E0A\u7684 tooltip + iPad \u80FD\u70B9\u7684\u5C0F\u95EE\u53F7\uFF1Buser\u300C\u6BCF\u4E2A\u53C2\u6570\u80FD\u4E0D\u80FD\u52A0\u4E00\u4E2Atooltip\u89E3\u91CA\u4E00\u4E0B\u662F\u5E72\u4EC0\u4E48\u7528\u7684\u300D\u300C\u7136\u540E\u53C2\u6570\u540E\u9762\u52A0\u4E00\u4E2A\u5C0F\u7684\u65B9\u5757\u95EE\u53F7\u8FD9\u6837ipad\u4E5F\u53EF\u4EE5\u70B9\u300D\uFF09\u3002 */\nexport const PARAM_HINT: Record<string, string> = {\n  \"eq.hpAuto\": \"\u81EA\u52A8\u4F4E\u5207\uFF1A\u6309\u8FD9\u4E2A\u58F0\u90E8\u6700\u4F4E\u7684\u97F3\u653E\u4F4E\u5207\uFF08\u5F80\u4E0B\u5927\u4E09\u5EA6\uFF09\uFF0C\u5207\u6389\u5B83\u7528\u4E0D\u7740\u7684\u4F4E\u9891\u2014\u2014\u9686\u9686\u58F0\u3001\u548C\u522B\u7684\u8F68\u7CCA\u5728\u4E00\u8D77\u7684\u4F4E\u9891\",\n  \"eq.hpHz\": \"\u4F4E\u5207\uFF1A\u8FD9\u4E2A\u9891\u7387\u4EE5\u4E0B\u7684\u90FD\u5207\u6389\u3002\u4EBA\u58F0\u5E38\u5728 80\u2013120 Hz\uFF0C\u94C3\u8FD9\u7C7B\u9AD8\u7684\u4E50\u5668\u53EF\u4EE5\u66F4\u9AD8\uFF1B\u6700\u5DE6 = \u5173\",\n  \"eq.lpHz\": \"\u9AD8\u5207\uFF1A\u8FD9\u4E2A\u9891\u7387\u4EE5\u4E0A\u7684\u90FD\u5207\u6389\uFF0C\u53BB\u523A\u8033\u3001\u5636\u5636\u58F0\uFF1B\u6700\u5DE6 = \u5173\",\n  \"eq.lowDb\": \"\u4F4E\u67B6\uFF1A\u8F6C\u6298\u9891\u7387\u4EE5\u4E0B\u6574\u4F53\u52A0 / \u51CF\u591A\u5C11\u3002\u51CF = \u53BB\u95F7\u3001\u7ED9\u522B\u7684\u8F68\u8BA9\u51FA\u4F4E\u9891\uFF1B\u52A0 = \u52A0\u539A\",\n  \"eq.lowHz\": \"\u4F4E\u67B6\u7684\u8F6C\u6298\u9891\u7387\uFF1A\u4ECE\u8FD9\u91CC\u5F80\u4E0B\u7B97\u300C\u4F4E\u300D\",\n  \"eq.midDb\": \"\u4E2D\u5CF0\uFF1A\u5728\u4E00\u4E2A\u9891\u6BB5\u4E0A\u63A8 / \u6316\u591A\u5C11\u3002\u4E24\u6837\u4E1C\u897F\u7CCA\u5728\u4E00\u8D77\u65F6\uFF0C\u5728\u5176\u4E2D\u4E00\u4E2A\u4E0A\u6316\u4E00\u5200\u7ED9\u53E6\u4E00\u4E2A\u8BA9\u4F4D\",\n  \"eq.midHz\": \"\u4E2D\u5CF0\u7684\u4E2D\u5FC3\u9891\u7387\uFF1A\u63A8 / \u6316\u7684\u662F\u54EA\u4E00\u6BB5\",\n  \"eq.midQ\": \"\u4E2D\u5CF0\u7684\u5BBD\u7A84\uFF1AQ \u8D8A\u5927\u8D8A\u7A84\uFF081 \u2248 \u4E00\u4E2A\u591A\u516B\u5EA6\u5BBD\uFF0C4 \u2248 \u5C0F\u534A\u4E2A\u516B\u5EA6\uFF09\",\n  \"eq.highDb\": \"\u9AD8\u67B6\uFF1A\u8F6C\u6298\u9891\u7387\u4EE5\u4E0A\u6574\u4F53\u52A0 / \u51CF\u591A\u5C11\u3002\u52A0 = \u4EAE\u3001\u51CF = \u6697\",\n  \"eq.highHz\": \"\u9AD8\u67B6\u7684\u8F6C\u6298\u9891\u7387\uFF1A\u4ECE\u8FD9\u91CC\u5F80\u4E0A\u7B97\u300C\u9AD8\u300D\",\n  \"comp.thresholdDb\": \"\u9608\u503C\uFF1A\u58F0\u97F3\u8D85\u8FC7\u8FD9\u4E2A\u7535\u5E73\u624D\u5F00\u59CB\u538B\uFF1B\u8D8A\u4F4E\uFF0C\u538B\u5230\u7684\u8D8A\u591A\",\n  \"comp.ratio\": \"\u6BD4\u4F8B\uFF1A\u8D85\u8FC7\u9608\u503C\u7684\u90E8\u5206\u538B\u6210\u51E0\u5206\u4E4B\u4E00\uFF084:1 = \u8D85\u51FA 4 dB \u7684\u53EA\u5269 1 dB\uFF09\",\n  \"comp.attackMs\": \"\u8D77\u538B\uFF1A\u8D85\u8FC7\u9608\u503C\u4E4B\u540E\u591A\u5FEB\u538B\u4E0B\u53BB\u3002\u77ED = \u8FDE\u5B57\u5934\u4E00\u8D77\u538B\u5E73\uFF1B\u957F = \u8BA9\u5B57\u5934\u5148\u51B2\u51FA\u6765\u3001\u66F4\u6709\u52B2\",\n  \"comp.releaseMs\": \"\u653E\u5F00\uFF1A\u58F0\u97F3\u843D\u56DE\u9608\u503C\u4EE5\u4E0B\u4E4B\u540E\u591A\u5FEB\u677E\u5F00\u3002\u592A\u77ED\u4F1A\u4E00\u62BD\u4E00\u62BD\u7684\uFF0C\u592A\u957F\u4E0B\u4E00\u4E2A\u5B57\u4E5F\u88AB\u538B\u7740\",\n  \"comp.kneeDb\": \"\u62D0\u70B9\uFF1A\u9608\u503C\u9644\u8FD1\u8FD9\u4E48\u5BBD\u7684\u4E00\u6BB5\u91CC\u6162\u6162\u5F00\u59CB\u538B\uFF08\u8F6F\uFF09\uFF1B0 = \u4E00\u5230\u9608\u503C\u5C31\u538B\uFF08\u786C\uFF09\",\n  \"comp.makeupDb\": \"\u8865\u507F\uFF1A\u538B\u5B8C\u6574\u4F53\u52A0\u56DE\u6765\u591A\u5C11\uFF08\u538B\u7F29\u4F1A\u8BA9\u6574\u4F53\u53D8\u8F7B\uFF09\",\n  \"reverb.room\": \"\u6DF7\u54CD\u65F6\u95F4\uFF08RT60\uFF09\uFF1A\u58F0\u97F3\u505C\u4E86\u4E4B\u540E\uFF0C\u5C3E\u5DF4\u8870\u51CF 60 dB \u8981\u591A\u4E45\u3002\u5C0F\u623F\u95F4\u4E0D\u5230 1 \u79D2\uFF0C\u5927\u5385 2\u20133 \u79D2\uFF0C\u6559\u5802\u66F4\u957F\",\n  \"reverb.damp\": \"\u9AD8\u9891\u4ECE\u8FD9\u91CC\u5F00\u59CB\u8870\u51CF\uFF1A\u771F\u5B9E\u7684\u623F\u95F4\u91CC\u9AD8\u9891\u88AB\u5438\u6536\u5F97\u5FEB\uFF0C\u5C3E\u5DF4\u8D8A\u5F80\u540E\u8D8A\u6697\uFF1B\u6570\u8D8A\u4F4E\u8D8A\u6697\",\n  \"reverb.mix\": \"\u6E7F\uFF1A\u6DF7\u54CD\u7684\u58F0\u97F3\u6709\u591A\u54CD\",\n  \"reverb.dry\": \"\u539F\u58F0\uFF1A\u539F\u6765\u7684\u58F0\u97F3\u7559\u591A\u5C11\u3002\u63D2\u5728\u6B4C\u624B\u8F68\u4E0A\u4E00\u822C 0 dB\uFF08\u4E0D\u52A8\uFF09\uFF1B\u5F53\u53D1\u9001\u7684\u8FD4\u56DE\u8F68\u7528 = \u5173\",\n  \"reverb.preDelayMs\": \"\u9884\u5EF6\u8FDF\uFF1A\u539F\u58F0\u4E4B\u540E\u8FC7\u591A\u4E45\u6DF7\u54CD\u624D\u8FDB\u6765\u3002\u62C9\u5F00\u4E00\u70B9\uFF0C\u4EBA\u58F0\u66F4\u6E05\u695A\u3001\u4E0D\u88AB\u7CCA\u4F4F\",\n  \"reverb.width\": \"\u5BBD\u5EA6\uFF1A\u6DF7\u54CD\u5728\u5DE6\u53F3\u94FA\u591A\u5F00\",\n  \"delay.syncBeats\": \"\u8DDF\u901F\u5EA6\uFF1A\u56DE\u58F0\u9694\u51E0\u62CD\uFF0C\u6309\u6B4C\u7684\u901F\u5EA6\u7B97\u65F6\u95F4\uFF1B0 = \u7528\u4E0B\u9762\u7684\u6BEB\u79D2\",\n  \"delay.timeMs\": \"\u65F6\u95F4\uFF1A\u6BCF\u6B21\u56DE\u58F0\u9694\u591A\u4E45\",\n  \"delay.feedback\": \"\u6BCF\u6B21\u56DE\u58F0\uFF1A\u6BCF\u91CD\u590D\u4E00\u6B21\u8F7B\u591A\u5C11 dB\uFF1B\u8D8A\u63A5\u8FD1 0\uFF0C\u56DE\u58F0\u8D8A\u4E45\",\n  \"delay.mix\": \"\u6E7F\uFF1A\u56DE\u58F0\u6709\u591A\u54CD\",\n  \"delay.dry\": \"\u539F\u58F0\uFF1A\u539F\u6765\u7684\u58F0\u97F3\u7559\u591A\u5C11\u3002\u63D2\u5728\u6B4C\u624B\u8F68\u4E0A\u4E00\u822C 0 dB\uFF08\u4E0D\u52A8\uFF09\uFF1B\u5F53\u53D1\u9001\u7684\u8FD4\u56DE\u8F68\u7528 = \u5173\",\n  \"delay.dampHz\": \"\u53CD\u9988\u9AD8\u5207\uFF1A\u6BCF\u6B21\u56DE\u58F0\u90FD\u628A\u8FD9\u4E2A\u9891\u7387\u4EE5\u4E0A\u7684\u524A\u6389\u4E00\u70B9\uFF0C\u8D8A\u5F80\u540E\u8D8A\u6697\uFF08\u50CF\u771F\u7684\u56DE\u58F0\uFF09\",\n  \"chorus.voices\": \"\u51E0\u6761\uFF1A\u540C\u65F6\u6709\u51E0\u4E2A\u7A0D\u5FAE\u9519\u5F00\u7684\u526F\u672C\",\n  \"chorus.delayMs\": \"\u5EF6\u8FDF\uFF1A\u526F\u672C\u6BD4\u539F\u58F0\u665A\u591A\u5C11\",\n  \"chorus.depthMs\": \"\u6296\u52A8\u6DF1\u5EA6\uFF1A\u526F\u672C\u7684\u5EF6\u8FDF\u6765\u56DE\u6643\u591A\u5927\u2014\u2014\u6643 = \u97F3\u9AD8\u8F7B\u5FAE\u8D77\u4F0F\uFF0C\u50CF\u597D\u51E0\u4E2A\u4EBA\u5531\u4E0D\u9F50\",\n  \"chorus.rateHz\": \"\u6296\u52A8\u5FEB\u6162\uFF1A\u6BCF\u79D2\u6643\u51E0\u6B21\",\n  \"chorus.spread\": \"\u5DE6\u53F3\u94FA\u5F00\uFF1A\u526F\u672C\u6446\u5F97\u591A\u5F00\",\n  \"chorus.mix\": \"\u6E7F\uFF1A\u526F\u672C\u6709\u591A\u54CD\",\n  \"chorus.dry\": \"\u539F\u58F0\uFF1A\u539F\u6765\u7684\u58F0\u97F3\u7559\u591A\u5C11\u3002\u63D2\u5728\u6B4C\u624B\u8F68\u4E0A\u4E00\u822C 0 dB\uFF08\u4E0D\u52A8\uFF09\uFF1B\u5F53\u53D1\u9001\u7684\u8FD4\u56DE\u8F68\u7528 = \u5173\",\n  \"gain.dB\": \"\u589E\u76CA\uFF1A\u5355\u7EAF\u8C03\u5927\u8C03\u5C0F\uFF08\u524D\u9762\u7684\u63D2\u4EF6\u628A\u97F3\u91CF\u6539\u4E86\uFF0C\u7528\u5B83\u8865\u56DE\u6765\uFF09\",\n};\n/** \u5168\u91CF\u9762\u677F\u91CC\u4E00\u4E2A\u53C2\u6570\u7684\u65CB\u94AE\uFF1A\u6ED1\u5757\u7528\u7684\u7269\u7406\u91CF\u7EB2 \u2194 \u5B58\u7684\u503C\u3002 */\nexport interface ParamView { hint: string; label: string; min: number; max: number; step: number; toV: (s: number) => number; toS: (v: number) => number; fmt: (v: number) => string }\nexport function paramView(kind: string, d: ParamDef): ParamView { return { hint: PARAM_HINT[`${kind}.${d.id}`] ?? d.label, ...paramView0(kind, d) }; }\nfunction paramView0(kind: string, d: ParamDef): Omit<ParamView, \"hint\"> {\n  const key = `${kind}.${d.id}`;\n  if (key === \"reverb.room\") return { label: \"\u6DF7\u54CD\u65F6\u95F4\uFF08RT60\uFF09\", min: 0.6, max: 10, step: 0.1, toV: roomOfRt60, toS: rt60OfRoom, fmt: (v) => `${rt60OfRoom(v).toFixed(1)} s` };\n  if (key === \"reverb.damp\") return { label: \"\u9AD8\u9891\u4ECE\u8FD9\u91CC\u5F00\u59CB\u8870\u51CF\", min: 7, max: 20, step: 0.1, toV: (k) => (k >= 20 ? 0 : dampOfKHz(k)), toS: (v) => Math.min(20, dampKHz(v)), fmt: (v) => (dampKHz(v) >= 20 ? \"\u4E0D\u8870\u51CF\uFF0820 kHz \u4EE5\u4E0A\uFF09\" : `${dampKHz(v).toFixed(1)} kHz`) };\n  if (d.id === \"mix\" || d.id === \"dry\") return { label: d.id === \"mix\" ? \"\u6E7F\uFF08\u6548\u679C\uFF09\" : \"\u539F\u58F0\", min: -60, max: 0, step: 0.5, toV: dbLin, toS: linDb, fmt: (v) => dbt(linDb(v)) };\n  if (key === \"delay.feedback\") return { label: \"\u6BCF\u6B21\u56DE\u58F0\", min: -40, max: -0.5, step: 0.5, toV: dbLin, toS: linDb, fmt: (v) => `${linDb(v).toFixed(1)} dB / \u6B21` };\n  if (key === \"reverb.width\") return { label: \"\u5BBD\u5EA6\uFF080 = \u5355\u58F0\u9053\uFF0C100% = \u5DE6\u53F3\u94FA\u6EE1\uFF09\", min: 0, max: 1, step: 0.01, toV: (x) => x, toS: (x) => x, fmt: pct };\n  if (key === \"chorus.spread\") return { label: \"\u5DE6\u53F3\u94FA\u5F00\uFF080 = \u90FD\u5728\u4E2D\u95F4\uFF0C100% = \u94FA\u5230\u4E24\u8FB9\uFF09\", min: 0, max: 1, step: 0.01, toV: (x) => x, toS: (x) => x, fmt: pct };\n  if (d.unit === \"Hz\") {\n    const lo = Math.max(20, d.min || 20), hi = d.max, offable = d.min === 0, L = Math.log(lo), H = Math.log(hi);\n    return { label: d.label, min: offable ? -0.02 : 0, max: 1, step: 0.002, toV: (x) => (offable && x < 0 ? 0 : Math.round(Math.exp(L + Math.max(0, x) * (H - L)))), toS: (v) => (offable && v <= 0 ? -0.02 : (Math.log(Math.max(lo, v)) - L) / (H - L)),\n      fmt: (v) => (v <= 0 ? \"\u5173\" : v >= 1000 ? `${(v / 1000).toFixed(v >= 10000 ? 1 : 2)} kHz` : `${Math.round(v)} Hz`) };\n  }\n  const step = d.unit === \"dB\" ? 0.5 : d.unit === \"ms\" ? (d.max > 500 ? 5 : 0.5) : d.unit === \"0..1\" ? 0.01 : d.unit === \"ratio\" ? (d.max <= 4 ? 1 : 0.1) : 1;\n  const fmt = (v: number) => (d.unit === \"dB\" ? dbt(v) : d.unit === \"ms\" ? `${v} ms` : d.unit === \"0..1\" ? pct(v) : d.unit === \"ratio\" ? (d.id === \"ratio\" ? `${v}:1` : d.id === \"voices\" ? `${v} \u6761` : d.id === \"midQ\" ? `Q ${v}` : String(v)) : String(v));\n  return { label: d.label, min: d.min, max: d.max, step, toV: (x) => x, toS: (x) => x, fmt };\n}\n\n/** EQ \u4E00\u952E = \u81EA\u52A8\u4F4E\u5207 + \u300C\u539A \u2194 \u4EAE\u300D\uFF1A300 Hz \u4F4E\u67B6\u548C 3 kHz \u9AD8\u67B6\u53CD\u7740\u52A8\uFF0C\u6700\u591A \u00B16 dB\uFF08tilt \u22121 = \u539A\u3001+1 = \u4EAE\uFF09\u3002 */\nconst TILT_DB = 6, TILT_LO = 300, TILT_HI = 3000;\nconst EQ_SIMPLE: SimpleView = {\n  controls: [\n    { id: \"autoLow\", label: \"\u81EA\u52A8\u4F4E\u5207\", hint: \"\u5207\u6389\u8FD9\u4E2A\u58F0\u90E8\u7528\u4E0D\u7740\u7684\u4F4E\u9891\uFF1A\u4F4E\u5207\u653E\u5728\u5B83\u6700\u4F4E\u7684\u97F3\u5F80\u4E0B\u4E00\u70B9\", kind: \"toggle\" },\n    { id: \"tilt\", label: \"\u539A \u2194 \u4EAE\", hint: \"\u5F80\u5DE6 = \u539A\uFF08\u4F4E\u7684\u591A\u4E00\u70B9\u3001\u9AD8\u7684\u5C11\u4E00\u70B9\uFF09\uFF0C\u5F80\u53F3 = \u4EAE\uFF1B\u4E2D\u95F4 = \u4E0D\u52A8\", kind: \"knob\", min: -1, max: 1, step: 0.05, fmt: (v) => (near(v, 0, 0.01) ? \"\u5E73\" : v < 0 ? `\u539A ${Math.round(-v * TILT_DB * 10) / 10} dB` : `\u4EAE ${Math.round(v * TILT_DB * 10) / 10} dB`) },\n  ],\n  read(p) {\n    if (p.midDb !== 0 || p.lpHz !== 0 || (!p.hpAuto && p.hpHz !== 0)) return null;\n    const flat = p.lowDb === 0 && p.highDb === 0, tilt = near(p.lowHz, TILT_LO) && near(p.highHz, TILT_HI) && near(p.lowDb, -p.highDb);\n    if (!flat && !tilt) return null;\n    return { autoLow: p.hpAuto ? 1 : 0, tilt: flat ? 0 : p.highDb / TILT_DB };\n  },\n  write(v, p) { const t = Math.max(-1, Math.min(1, v.tilt ?? 0)); return { ...p, hpAuto: v.autoLow ? 1 : 0, hpHz: 0, lpHz: 0, midDb: 0, lowHz: TILT_LO, highHz: TILT_HI, lowDb: r1(-t * TILT_DB), highDb: r1(t * TILT_DB) }; },\n  /** \u4F4E\u5207\u5F00\u7740\uFF08\u81EA\u52A8\u6216\u624B\u8C03\uFF09= \u81EA\u52A8\u4F4E\u5207\uFF1B\u9AD8\u67B6\u51CF\u4F4E\u67B6\u7684\u4E00\u534A = \u503E\u659C\uFF1B\u4E2D\u5CF0 / \u9AD8\u5207\u4E22\u6389\u3002 */\n  project(p) { return { autoLow: p.hpAuto || p.hpHz > 0 ? 1 : 0, tilt: Math.round(Math.max(-1, Math.min(1, (p.highDb - p.lowDb) / (2 * TILT_DB))) * 20) / 20 }; },\n};\n/** \u538B\u7F29\u4E00\u952E = \u300C\u538B\u591A\u5C11\u300Da\uFF1A\u9608\u503C \u22126 \u2192 \u221236 dB\u3001\u6BD4\u4F8B 1.5 \u2192 6\uFF0C\u8D77 10 ms\u3001\u843D 150 ms\u3001\u62D0\u70B9 6 dB \u56FA\u5B9A\uFF1B\u8865\u507F = \u538B\u6389\u7684\u4E00\u534A\u8865\u56DE\u6765\u3002\n *  \u300C\u88AB\u8C01\u538B\u300D\uFF08\u4FA7\u94FE\u8BA9\u8DEF\uFF09\u65F6\u8865\u507F = 0\uFF08v0.10.15\uFF09\uFF1A\u8BA9\u8DEF\u5C31\u662F\u8981\u5B83\u8BA9\u51FA\u6765\uFF1B\u539F\u6765\u7167\u81EA\u5DF1\u538B\u81EA\u5DF1\u90A3\u5957\u8865\uFF0C\u522B\u4EBA\u4E0D\u5531\u7684\u65F6\u5019\u88AB\u538B\u7684\u8F68\u6BD4\u63A8\u5B50\u54CD\uFF08\u67E5 user \u7684 \u56E3\u5B50\u5927\u5BB6\u65CF \u65F6\u53D1\u73B0\uFF1A+2.8 dB\uFF09\u3002 */\nconst compOf = (a: number, keyed = false) => { const thr = -6 - 30 * a, ratio = 1.5 + 4.5 * a; return { thresholdDb: r1(thr), ratio: r1(ratio), attackMs: 10, releaseMs: 150, kneeDb: 6, makeupDb: keyed ? 0 : r1(0.5 * -thr * (1 - 1 / ratio) * 0.5) }; };\nconst compSimple = (keyed: boolean): SimpleView => ({\n  controls: [{ id: \"amount\", label: keyed ? \"\u8BA9\u591A\u5C11\" : \"\u538B\u591A\u5C11\", hint: keyed ? \"\u88AB\u90A3\u6761\u8F68\u538B\uFF1A\u5B83\u4E00\u54CD\uFF0C\u8FD9\u6761\u5C31\u8BA9\u51FA\u6765\uFF1B\u5F80\u53F3 = \u8BA9\u5F97\u8D8A\u591A\uFF08\u4E0D\u8865\u507F\uFF1A\u5B83\u4E0D\u54CD\u7684\u65F6\u5019\u8FD9\u6761\u7167\u63A8\u5B50\u7684\u97F3\u91CF\uFF09\" : \"\u628A\u5FFD\u5927\u5FFD\u5C0F\u62C9\u5E73\uFF1A\u5F80\u53F3 = \u538B\u5F97\u8D8A\u72E0\uFF08\u54CD\u7684\u5B57\u538B\u4E0B\u6765\u3001\u8F7B\u7684\u76F8\u5BF9\u663E\u51FA\u6765\uFF09\", kind: \"knob\", min: 0, max: 1, step: 0.05, fmt: (a) => { const c = compOf(a, keyed); return `${c.thresholdDb} dB \u8D77\u538B \u00B7 ${c.ratio}:1`; } }],\n  read(p) {\n    const a = (-p.thresholdDb - 6) / 30; if (a < -1e-3 || a > 1 + 1e-3) return null;\n    const c = compOf(a, keyed);\n    return near(p.ratio, c.ratio, 0.06) && p.attackMs === c.attackMs && p.releaseMs === c.releaseMs && p.kneeDb === c.kneeDb && near(p.makeupDb, c.makeupDb, 0.06) ? { amount: Math.round(a * 20) / 20 } : null;\n  },\n  write(v, p) { return { ...p, ...compOf(Math.max(0, Math.min(1, v.amount ?? 0)), keyed) }; },\n  project(p) { return { amount: knob01((-p.thresholdDb - 6) / 30, (p.ratio - 1.5) / 4.5) }; },\n});\nconst COMP_SIMPLE = compSimple(false), COMP_SIMPLE_KEYED = compSimple(true);\n/** \u6DF7\u54CD\u4E00\u952E = \u300C\u8FDC\u8FD1\u300Dd\uFF1A**\u539F\u58F0 100% \u4E0D\u52A8**\u3001\u6E7F 8% \u2192 48% \u52A0\u5728\u4E0A\u9762\uFF08v0.10.10 \u6539\uFF1B\u539F\u6765\u662F\u539F\u58F0\u548C\u6E7F\u4EA4\u53C9\uFF0C\u5F80\u53F3\u62E7\u539F\u58F0\u5C31\u6389 = user\u300C\u5F00\u4E86\u6DF7\u54CD\u7ED3\u679C\u94C3\u58F0\u90FD\u54D1\u6389\u4E86\u300D\u300C\u6709\u53EF\u80FD\u662F\u4F60\u6DF7\u54CD\u7684\u65B0\u624B\u6A21\u5F0FPreset\u4E0D\u5408\u7406\u300D\uFF09\u3001\n *  \u623F\u95F4 0.3 \u2192 0.95\uFF1B\u9AD8\u9891\u5438\u6536 0.5\u3001\u9884\u5EF6\u8FDF 10 ms\u3001\u5BBD\u5EA6\u6EE1\u3002 */\nconst revOf = (d: number) => ({ mix: r1((0.08 + 0.4 * d) * 100) / 100, dry: 1, room: r1((0.3 + 0.65 * d) * 100) / 100, damp: 0.5, preDelayMs: 10, width: 1 });\nconst REV_SIMPLE: SimpleView = {\n  controls: [{ id: \"far\", label: \"\u8FDC\u8FD1\", hint: \"\u5F80\u53F3 = \u8D8A\u8FDC\u3001\u8D8A\u5927\u7684\u623F\u95F4\uFF08\u94C3\u53EF\u4EE5\u8FDC\u4E00\u70B9\uFF0C\u8D34\u8033\u7684\u4EBA\u58F0\u8FD1\u4E00\u70B9\uFF09\uFF1B\u539F\u58F0\u4E0D\u52A8\uFF0C\u53EA\u5F80\u4E0A\u52A0\u6DF7\u54CD\", kind: \"knob\", min: 0, max: 1, step: 0.05, fmt: (d) => { const c = revOf(d); return `\u6E7F ${dbt(linDb(c.mix))} \u00B7 ${rt60OfRoom(c.room).toFixed(1)} s`; } }],\n  read(p) { const d = (p.mix - 0.08) / 0.4, c = revOf(d); return d >= -1e-3 && d <= 1 + 1e-3 && p.dry === 1 && near(p.room, c.room, 0.006) && p.damp === 0.5 && p.preDelayMs === 10 && p.width === 1 ? { far: Math.round(d * 20) / 20 } : null; },\n  write(v, p) { return { ...p, ...revOf(Math.max(0, Math.min(1, v.far ?? 0))) }; },\n  project(p) { return { far: knob01((p.mix - 0.08) / 0.4, (p.room - 0.3) / 0.65) }; },\n};\n/** \u5EF6\u8FDF\u4E00\u952E = \u300C\u56DE\u58F0\u591A\u5C11\u300De + \u300C\u51E0\u62CD\u4E00\u6B21\u300D\uFF1A\u6E7F 10% \u2192 50%\u3001\u53CD\u9988 0.15 \u2192 0.65\uFF1B\u53CD\u9988\u9AD8\u5207 6000 Hz\uFF1B\u65F6\u95F4\u8DDF\u901F\u5EA6\u3002 */\nconst dlyOf = (e: number) => ({ mix: r1((0.1 + 0.4 * e) * 100) / 100, dry: 1, feedback: r1((0.15 + 0.5 * e) * 100) / 100, dampHz: 6000 });   // \u539F\u58F0 100% \u4E0D\u52A8\uFF08\u540C\u6DF7\u54CD\uFF0Cv0.10.10\uFF09\nconst DLY_SIMPLE: SimpleView = {\n  controls: [\n    { id: \"echo\", label: \"\u56DE\u58F0\u591A\u5C11\", hint: \"\u5F80\u53F3 = \u56DE\u58F0\u8D8A\u54CD\u3001\u8D8A\u4E45\uFF1B\u539F\u58F0\u4E0D\u52A8\", kind: \"knob\", min: 0, max: 1, step: 0.05, fmt: (e) => { const c = dlyOf(e); return `\u6E7F ${dbt(linDb(c.mix))} \u00B7 \u6BCF\u6B21 ${linDb(c.feedback).toFixed(1)} dB`; } },\n    { id: \"beats\", label: \"\u51E0\u62CD\u4E00\u6B21\", hint: \"\u56DE\u58F0\u548C\u62CD\u5B50\u5BF9\u9F50\uFF08\u8DDF\u7740\u6B4C\u7684\u901F\u5EA6\uFF09\", kind: \"choice\", choices: [{ v: 0.5, label: \"\u516B\u5206\" }, { v: 0.75, label: \"\u9644\u70B9\u516B\u5206\" }, { v: 1, label: \"\u56DB\u5206\" }] },\n  ],\n  read(p) { const e = (p.mix - 0.1) / 0.4, c = dlyOf(e); return e >= -1e-3 && e <= 1 + 1e-3 && p.dry === 1 && near(p.feedback, c.feedback, 0.006) && p.dampHz === 6000 && [0.5, 0.75, 1].includes(p.syncBeats) ? { echo: Math.round(e * 20) / 20, beats: p.syncBeats } : null; },\n  write(v, p) { return { ...p, ...dlyOf(Math.max(0, Math.min(1, v.echo ?? 0))), syncBeats: [0.5, 0.75, 1].includes(v.beats) ? v.beats : 0.75 }; },\n  project(p) { return { echo: knob01((p.mix - 0.1) / 0.4, (p.feedback - 0.15) / 0.5), beats: nearestBeat(p.syncBeats) }; },\n};\n/** \u5408\u5531\u4E00\u952E = \u300C\u5BBD\u300Dw\uFF1A\u6E7F 20% \u2192 60%\u3001\u6296\u52A8\u6DF1\u5EA6 1 \u2192 5 ms\u3001\u5DE6\u53F3\u94FA\u5F00 0.4 \u2192 1\uFF1B\u4E09\u6761\u3001\u5EF6\u8FDF 18 ms\u3001\u6296\u52A8 0.6 Hz\u3002 */\nconst choOf = (w: number) => ({ mix: r1((0.2 + 0.4 * w) * 100) / 100, dry: 1, depthMs: r1(1 + 4 * w), spread: r1((0.4 + 0.6 * w) * 100) / 100, voices: 3, delayMs: 18, rateHz: 0.6 });   // \u539F\u58F0 100% \u4E0D\u52A8\uFF08\u540C\u6DF7\u54CD\uFF0Cv0.10.10\uFF09\nconst CHO_SIMPLE: SimpleView = {\n  controls: [{ id: \"wide\", label: \"\u5BBD\", hint: \"\u5F80\u53F3 = \u8D8A\u5BBD\u3001\u8D8A\u50CF\u597D\u51E0\u4E2A\u4EBA\uFF1B\u539F\u58F0\u4E0D\u52A8\", kind: \"knob\", min: 0, max: 1, step: 0.05, fmt: (w) => { const c = choOf(w); return `\u6E7F ${dbt(linDb(c.mix))} \u00B7 \u6296\u52A8 ${c.depthMs} ms`; } }],\n  read(p) { const w = (p.mix - 0.2) / 0.4, c = choOf(w); return w >= -1e-3 && w <= 1 + 1e-3 && p.dry === 1 && near(p.depthMs, c.depthMs, 0.06) && near(p.spread, c.spread, 0.006) && p.voices === 3 && p.delayMs === 18 && p.rateHz === 0.6 ? { wide: Math.round(w * 20) / 20 } : null; },\n  write(v, p) { return { ...p, ...choOf(Math.max(0, Math.min(1, v.wide ?? 0))) }; },\n  project(p) { return { wide: knob01((p.mix - 0.2) / 0.4, (p.depthMs - 1) / 4, (p.spread - 0.4) / 0.6) }; },\n};\nconst GAIN_SIMPLE: SimpleView = {\n  controls: [{ id: \"dB\", label: \"\u589E\u76CA\", hint: \"\u63D2\u4EF6\u94FE\u4E2D\u95F4\u5355\u7EAF\u8C03\u5927\u8C03\u5C0F\uFF08\u524D\u9762\u7684\u63D2\u4EF6\u628A\u97F3\u91CF\u6539\u4E86\uFF0C\u7528\u5B83\u8865\u56DE\u6765\uFF09\", kind: \"knob\", min: -24, max: 12, step: 0.5, fmt: (v) => `${v > 0 ? \"+\" : \"\"}${v.toFixed(1)} dB` }],\n  read(p) { return { dB: p.dB }; },\n  write(v, p) { return { ...p, dB: v.dB ?? 0 }; },\n  project(p) { return { dB: p.dB }; },\n};\nexport const SIMPLE: Record<string, SimpleView> = { eq: EQ_SIMPLE, comp: COMP_SIMPLE, reverb: REV_SIMPLE, delay: DLY_SIMPLE, chorus: CHO_SIMPLE, gain: GAIN_SIMPLE };\n/** \u653E\u5728\u8DEF\u7531\u8F68\u4E0A\uFF08\u53D1\u9001\u7684\u8FD4\u56DE\u8F68\uFF09\u7684\u6DF7\u54CD / \u5EF6\u8FDF / \u5408\u5531\uFF1A\u6DF7\u97F3\u7684\u8001\u89C4\u77E9 = \u5168\u6E7F\uFF08\u539F\u58F0\u7559\u5728\u6B4C\u624B\u81EA\u5DF1\u90A3\u6761\u8DEF\u4E0A\uFF0C\u53D1\u591A\u5C11 = \u52A0\u591A\u5C11\u6548\u679C\uFF1B\u4E0D\u5168\u6E7F = \u53D1\u5F97\u8D8A\u591A\u539F\u58F0\u8D8A\u54CD\uFF09\u3002\n *  \u540C\u4E00\u4E2A\u63D2\u4EF6\u3001\u540C\u4E00\u7EC4\u53C2\u6570\uFF0C\u53EA\u662F\u4E00\u952E\u9762\u677F\u7684\u516C\u5F0F\u6362\u4E00\u5957\uFF1A\u6E7F = 100% \u56FA\u5B9A\uFF0C\u65CB\u94AE\u7BA1\u623F\u95F4\u5927\u5C0F / \u56DE\u58F0\u957F\u77ED / \u5BBD\u7A84\uFF08v0.10.9\uFF09\u3002 */\nconst wet1 = (p: Params) => p.mix === 1 && p.dry === 0;\nexport const SIMPLE_BUS: Record<string, SimpleView> = {\n  reverb: { controls: [{ id: \"size\", label: \"\u6DF7\u54CD\u65F6\u95F4\", hint: \"\u5C3E\u5DF4\u8870\u51CF 60 dB \u8981\u591A\u4E45\uFF08RT60\uFF09\uFF1A\u5F80\u53F3 = \u8D8A\u5927\u7684\u623F\u95F4\uFF08\u53D1\u591A\u5C11\u7531\u53D1\u9001\u90A3\u8FB9\u7684\u65CB\u94AE\u7BA1\uFF09\", kind: \"knob\", min: 0, max: 1, step: 0.05, fmt: (d) => `${rt60OfRoom(0.3 + 0.65 * d).toFixed(1)} s` }],\n    read(p) { const d = (p.room - 0.3) / 0.65; return wet1(p) && d >= -1e-3 && d <= 1 + 1e-3 && p.damp === 0.5 && p.preDelayMs === 10 && p.width === 1 ? { size: Math.round(d * 20) / 20 } : null; },\n    write(v, p) { const d = Math.max(0, Math.min(1, v.size ?? 0)); return { ...p, room: r1((0.3 + 0.65 * d) * 100) / 100, damp: 0.5, preDelayMs: 10, width: 1, mix: 1, dry: 0 }; },\n    project(p) { return { size: knob01((p.room - 0.3) / 0.65) }; } },\n  delay: { controls: [{ id: \"echo\", label: \"\u56DE\u58F0\u591A\u957F\", hint: \"\u5F80\u53F3 = \u56DE\u58F0\u91CD\u590D\u5F97\u8D8A\u4E45\uFF08\u53D1\u591A\u5C11\u7531\u53D1\u9001\u90A3\u8FB9\u7684\u65CB\u94AE\u7BA1\uFF09\", kind: \"knob\", min: 0, max: 1, step: 0.05, fmt: (e) => `\u6BCF\u6B21 ${linDb(0.15 + 0.5 * e).toFixed(1)} dB` }, DLY_SIMPLE.controls[1]],\n    read(p) { const e = (p.feedback - 0.15) / 0.5; return wet1(p) && e >= -1e-3 && e <= 1 + 1e-3 && p.dampHz === 6000 && [0.5, 0.75, 1].includes(p.syncBeats) ? { echo: Math.round(e * 20) / 20, beats: p.syncBeats } : null; },\n    write(v, p) { const e = Math.max(0, Math.min(1, v.echo ?? 0)); return { ...p, feedback: r1((0.15 + 0.5 * e) * 100) / 100, dampHz: 6000, mix: 1, dry: 0, syncBeats: [0.5, 0.75, 1].includes(v.beats) ? v.beats : 0.75 }; },\n    project(p) { return { echo: knob01((p.feedback - 0.15) / 0.5), beats: nearestBeat(p.syncBeats) }; } },\n  chorus: { controls: [{ ...CHO_SIMPLE.controls[0], hint: \"\u5F80\u53F3 = \u8D8A\u5BBD\u3001\u8D8A\u50CF\u597D\u51E0\u4E2A\u4EBA\uFF08\u53D1\u591A\u5C11\u7531\u53D1\u9001\u90A3\u8FB9\u7684\u65CB\u94AE\u7BA1\uFF09\", fmt: (w) => `\u6296\u52A8 ${choOf(w).depthMs} ms` }],\n    read(p) { const w = (p.depthMs - 1) / 4; return wet1(p) && w >= -1e-3 && w <= 1 + 1e-3 && near(p.spread, r1((0.4 + 0.6 * w) * 100) / 100, 0.006) && p.voices === 3 && p.delayMs === 18 && p.rateHz === 0.6 ? { wide: Math.round(w * 20) / 20 } : null; },\n    write(v, p) { const w = Math.max(0, Math.min(1, v.wide ?? 0)); return { ...p, ...choOf(w), mix: 1, dry: 0 }; },\n    project(p) { return { wide: knob01((p.depthMs - 1) / 4, (p.spread - 0.4) / 0.6) }; } },\n};\n/** \u8FD9\u4E00\u683C\u7528\u54EA\u5957\u4E00\u952E\u9762\u677F\uFF08onBus = \u5728\u8DEF\u7531\u8F68\u4E0A\uFF09\u3002 */\nexport const simpleView = (kind: string, onBus = false, keyed = false): SimpleView | undefined => (kind === \"comp\" && keyed ? COMP_SIMPLE_KEYED : undefined) ?? (onBus ? SIMPLE_BUS[kind] : undefined) ?? SIMPLE[kind];\n/** \u8FD9\u4E00\u683C\u7528\u54EA\u5957\u4E00\u952E\u9762\u677F\uFF08\u770B\u63D2\u4EF6\u79CD\u7C7B\u3001\u5728\u4E0D\u5728\u8DEF\u7531\u8F68\u4E0A\u3001\u6709\u6CA1\u6709\u300C\u88AB\u8C01\u538B\u300D\uFF09\u3002 */\nexport const viewOfFx = (fx: Pick<FxV2, \"kind\" | \"key\">, onBus = false): SimpleView | undefined => simpleView(fx.kind, onBus, !!fx.key);\n/** \u300C\u6539\u6210\u6700\u63A5\u8FD1\u7684\u4E00\u952E\u300D\uFF1A\u5168\u91CF\u53C2\u6570 \u2192 \u6700\u63A5\u8FD1\u7684\u4E00\u952E\u503C \u2192 \u6309\u4E00\u952E\u516C\u5F0F\u5199\u56DE\uFF08\u516C\u5F0F\u4E0D\u7BA1\u7684\u53C2\u6570\u7167\u7559\uFF09\u3002\u7ED3\u679C\u4E00\u5B9A\u8BFB\u5F97\u56DE\u4E00\u952E\uFF08plugins.test \u9489\u7740\uFF09\u3002 */\nexport function projectToSimple(kind: string, onBus: boolean, p: Params, keyed = false): Params {\n  const v = simpleView(kind, onBus, keyed); return v ? v.write(v.project(p), p) : p;\n}\n/** \u65B0\u63D2\u4E00\u683C\u7684\u521D\u59CB\u53C2\u6570\uFF1A\u4E00\u952E\u9762\u677F\u7684\u300C\u4E2D\u95F4\u503C\u300D\uFF08\u63D2\u4E0A\u5C31\u6709\u4E00\u70B9\u6548\u679C\uFF0C\u4E00\u773C\u80FD\u542C\u51FA\u5B83\u5728\u5E72\u4EC0\u4E48\uFF09\u3002 */\nexport function freshParams(kind: string, onBus = false): Params {\n  const p = defaults(kind), s = SIMPLE[kind];\n  if (onBus && kind === \"reverb\") return SIMPLE_BUS.reverb.write({ size: 0.5 }, p);\n  if (onBus && kind === \"delay\") return SIMPLE_BUS.delay.write({ echo: 0.3, beats: 0.75 }, p);\n  if (onBus && kind === \"chorus\") return SIMPLE_BUS.chorus.write({ wide: 0.4 }, p);\n  if (kind === \"eq\") return s.write({ autoLow: 0, tilt: 0 }, p);\n  if (kind === \"comp\") return s.write({ amount: 0.3 }, p);\n  if (kind === \"reverb\") return s.write({ far: 0.4 }, p);\n  if (kind === \"delay\") return s.write({ echo: 0.3, beats: 0.75 }, p);\n  if (kind === \"chorus\") return s.write({ wide: 0.4 }, p);\n  return p;\n}\n/** \u4E00\u683C\u5728\u5361\u7247\u4E0A\u7684\u4E00\u53E5\u8BDD\uFF08\u63D2\u4EF6\u683C\u5C0F\u94AE\u4E0A\u7684\u5B57\uFF09\u3002 */\nexport function fxSummary(fx: FxV2, onBus = false): string {\n  const view = viewOfFx(fx, onBus), p = paramsOf(fx), s = view?.read(p), name = pluginName(fx.kind);\n  if (fx.on === false) return `${name}\uFF08\u5173\uFF09`;\n  if (!s) return `${name}\uFF08\u5168\u91CF\uFF09`;\n  if (fx.kind === \"eq\") return `${name}${s.autoLow ? \" \u4F4E\u5207\" : \"\"}${near(s.tilt, 0, 0.01) ? (s.autoLow ? \"\" : \"\uFF08\u5E73\uFF09\") : s.tilt < 0 ? \" \u539A\" : \" \u4EAE\"}`;\n  const c = view!.controls[0];\n  return `${name} ${c.fmt ? c.fmt(s[c.id]) : s[c.id]}`;\n}\n\n// \u2500\u2500 \u4E3B\u7EBF\u7A0B\u6362\u7B97\uFF08\u9001\u8FDB\u5F55\u97F3\u623F\u4E4B\u524D\uFF09\uFF1A2026-10-16 \u642C\u5230 src/engine/chain.ts\uFF08\u65E0\u5934\u6E32\u67D3\u6838\u5FC3 src/core/render.ts \u4E5F\u8981\u7528\uFF0C\u6838\u5FC3\u4E0D import src/ui\uFF09\uFF1B\u8FD9\u91CC\u53EA\u8F6C\u51FA\u53E3 \u2500\u2500\nexport { autoLowCutHz, resolveChain } from \"../engine/chain.ts\";\n", "// \u53C2\u6570\u884C\uFF08\u6DF1\u6A21\u5757\uFF0Ccreated by Claude Opus 5.5 2026-10-10\uFF09\uFF1A\u540D\u5B57 + \u5C0F\u65B9\u5757\u95EE\u53F7 + \u8BFB\u6570 + \u63A7\u4EF6\u3002\n// \u6ED1\u5757\u7684\u624B\u611F\u5168\u5728\u8FD9\u91CC\uFF1A\u62D6 / \u6EDA\u8F6E\u4E00\u683C\u4E00\u6B65 / \u53CC\u51FB\u56DE\u9ED8\u8BA4\uFF0C\u4E09\u6761\u8DEF\u90FD\u53EA\u53D1 input \u4E8B\u4EF6\uFF0C\u5BBF\u4E3B\u7167\u65E7\u53EA\u542C input\u3002\n// user\u300C\u9F20\u6807\u6EDA\u8F6E\u80FD\u4E0D\u80FD\u4E00\u683C\u4E00\u683C\u6EDA\u5404\u79CDslider\uFF0C\u5E2E\u52A9\u5F3A\u8FEB\u75C7\u300D\u300C\u6216\u8005\u4F60\u5E72\u8106\u505A\u4E00\u4E2A\u65CB\u94AE\u7684\u6DF1\u6A21\u5757\u300D\u2192\u300C\u6211\u89C9\u5F97\u8FD8\u662F\u6ED1\u5757\u5427\uFF1F\u300D\uFF08\u89E6\u5C4F\u4E0A\u6ED1\u5757\u76F4\u63A5\u62D6\uFF09\u3002\nimport { wheelSteps } from \"./wheel.ts\";\n\nconst esc = (s: string) => s.replace(/[&<>\"']/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[c]!);\n\n/** \u4E00\u884C\uFF1A\u540D\u5B57 + \u95EE\u53F7\uFF08iPad \u70B9\u4E86\u5728\u8FD9\u4E00\u884C\u4E0B\u9762\u5C55\u5F00\u8BF4\u660E\uFF1B\u684C\u9762\u60AC\u505C\u4E5F\u6709\uFF09+ \u8BFB\u6570 + \u63A7\u4EF6\uFF08\u6ED1\u5757 / \u5F00\u5173 / \u4E0B\u62C9\u2026\uFF09\u3002 */\nexport function paramRow(label: string, hint: string, out: string, control: string, cls = \"fx-row\"): string {\n  return `<div class=\"param ${cls}\" title=\"${esc(hint)}\"><span class=\"row-lab\">${esc(label)}<button class=\"q\" type=\"button\" aria-label=\"\u8FD9\u662F\u4EC0\u4E48\">?</button> ${out}</span>${control}<div class=\"row-help\">${esc(hint)}</div></div>`;\n}\n\nexport interface SliderSpec {\n  min: number; max: number; step: number; value: number;\n  /** \u5BBF\u4E3B\u8BA4\u8FD9\u6839\u6ED1\u5757\u7528\u7684\u5C5E\u6027\uFF08`data-gain`\u3001`data-p=\"hpHz\"`\u2026\uFF09\uFF0C\u539F\u6837\u5199\u8FDB\u53BB\u3002 */\n  attrs: string;\n  /** \u53CC\u51FB\u56DE\u5230\u7684\u503C\uFF08\u6ED1\u5757\u4E0A\u7684\u503C\uFF09\uFF1B\u4E0D\u7ED9 = \u53CC\u51FB\u4E0D\u7BA1\u3002 */\n  def?: number;\n  /** \u300C\u53CC\u51FB\u56DE ___\u300D\u90A3\u51E0\u4E2A\u5B57\u3002 */\n  defText?: string;\n  /** \u7070\u7740\u3001\u52A8\u4E0D\u4E86\uFF08\u6EDA\u8F6E / \u53CC\u51FB\u4E5F\u4E0D\u7BA1\uFF09\u3002 */\n  disabled?: boolean;\n}\nexport function slider(s: SliderSpec): string {\n  const def = s.def == null || !Number.isFinite(s.def) ? \"\" : ` data-def=\"${s.def}\" title=\"\u53CC\u51FB\u56DE ${esc(s.defText ?? String(s.def))}\"`;\n  return `<input type=\"range\" min=\"${s.min}\" max=\"${s.max}\" step=\"${s.step}\" value=\"${s.value}\"${def}${s.disabled ? \" disabled\" : \"\"} ${s.attrs} />`;\n}\n\nconst fire = (t: HTMLInputElement) => { t.dispatchEvent(new Event(\"input\", { bubbles: true })); t.dispatchEvent(new Event(\"change\", { bubbles: true })); };\n\n/** \u6EDA\u8F6E\u6EDA\u5361\u7247\u7684\u65F6\u5019\u8DEF\u8FC7\u63A8\u5B50\u4E0D\u52A8\u5B83\uFF08v0.10.25\uFF1Buser\u300C\u6EDA\u8F6E\u6EDA\u5361\u7247\u7684\u65F6\u5019\u8BEF\u52A8\u63D2\u4EF6\u7684\u63A8\u5B50\u600E\u4E48\u529E\uFF1F\u8FD8\u662F\u4E0D\u5E94\u8BE5\u8BC6\u522B\u6EDA\u8F6E\uFF1F\u300D\uFF09\uFF1A\n *  \u521A\u6EDA\u8FC7\uFF08SCROLL_GRACE \u5185\uFF09= \u7167\u6837\u6EDA\u5361\u7247\uFF1B\u9F20\u6807\u5F97\u662F\u632A\u5230\u8FD9\u6839\u63A8\u5B50\u4E0A\u3001\u505C\u4E86 REST_MS\uFF0C\u6EDA\u8F6E\u624D\u62E8\u5B83\uFF08\u70B9\u8FC7\u5B83 = \u6709\u7126\u70B9\uFF0C\u9A6C\u4E0A\u5C31\u62E8\uFF09\u3002\n *  \u5361\u7247\u6EDA\u52A8\u65F6\u9F20\u6807\u6CA1\u52A8\u3001\u63A8\u5B50\u81EA\u5DF1\u6ED1\u5230\u9F20\u6807\u5E95\u4E0B\uFF08\u4E0D\u51FA pointermove\uFF09= \u4E0D\u7B97\u505C\u5728\u5B83\u4E0A\u9762\u3002 */\nconst SCROLL_GRACE = 600, REST_MS = 300;\n/** \u5728\u6839\u4E0A\u6302\u4E00\u6B21\uFF08\u59D4\u6258\uFF0C\u91CD\u753B\u4E0D\u7528\u91CD\u6302\uFF09\uFF1A\u6EDA\u8F6E\u3001\u53CC\u51FB\u3001\u95EE\u53F7\u3002 */\nexport function wireParamRows(root: HTMLElement): void {\n  const acc = new WeakMap<HTMLInputElement, number>();\n  let lastScroll = -1e9, hoverEl: HTMLInputElement | null = null, hoverSince = 0;\n  root.addEventListener(\"scroll\", () => { lastScroll = performance.now(); }, true);   // \u6DF7\u97F3\u53F0\u91CC\u4EFB\u4F55\u4E00\u5757\u5728\u6EDA\uFF08\u6355\u83B7\uFF1Ascroll \u4E0D\u5192\u6CE1\uFF09\n  root.addEventListener(\"pointermove\", (e) => { const t = e.target, inp = t instanceof HTMLInputElement && t.type === \"range\" ? t : null; if (inp !== hoverEl) { hoverEl = inp; hoverSince = performance.now(); } });\n  root.addEventListener(\"pointerleave\", () => { hoverEl = null; });\n  root.addEventListener(\"wheel\", (e) => {\n    const t = e.target;\n    if (!(t instanceof HTMLInputElement) || t.type !== \"range\" || t.disabled) return;\n    if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) return;   // \u6A2A\u7740\u5212 = \u8BA9\u7ED9\u5916\u9762\u6A2A\u7740\u6EDA\u5361\u7247\n    const now = performance.now();\n    if (document.activeElement !== t && (now - lastScroll < SCROLL_GRACE || hoverEl !== t || now - hoverSince < REST_MS)) return;   // \u6EDA\u5361\u7247\u65F6\u8DEF\u8FC7 = \u7167\u6837\u6EDA\u5361\u7247\n    e.preventDefault();\n    const r = wheelSteps(e, acc.get(t) ?? 0); acc.set(t, r.acc);\n    if (!r.steps) return;\n    const before = t.value;\n    if (r.steps < 0) t.stepUp(-r.steps); else t.stepDown(r.steps);   // \u5F80\u4E0A\u6EDA = \u5927\n    if (t.value !== before) fire(t);\n  }, { passive: false });\n  root.addEventListener(\"dblclick\", (e) => {\n    const t = e.target;\n    if (!(t instanceof HTMLInputElement) || t.type !== \"range\" || t.dataset.def === undefined) return;\n    const before = t.value; t.value = t.dataset.def;\n    if (t.value !== before) fire(t);\n  });\n  root.addEventListener(\"click\", (e) => {\n    const q = (e.target as HTMLElement).closest(\".param .q\"); if (!q) return;\n    q.closest(\".param\")!.classList.toggle(\"show-help\");\n  });\n}\n", "// scopes.ts \u2014\u2014 \u6DF7\u97F3\u53F0\u300C\u57FA\u7840\u300D\u9875\u603B\u8F68 / \u6DF7\u97F3\u8F68\u5361\u7247\u80CC\u666F\u7684\u674E\u8428\u5982\u56FE\uFF08\u7ACB\u4F53\u58F0\u76F8\u4F4D\u8868\uFF09+ \u5DE6\u53F3\u76F8\u5173\uFF08v0.10.16\uFF09\u3002\u7EAF\u51FD\u6570\u3002\n// created 2026-10-10 by Claude Opus 5.5\uFF08user\u300C\u58F0\u50CF\u5BF9\u5E94\u7684\u662F\u8389\u8428\u5982\u56FE\u5417\uFF1F\u300D\u300C\u4E09\u4E2A\u9875\u540C\u610F\u300D\u300C\u8BB0\u5F97\u6211\u8BF4\u7684\u7701cpu\uFF0C\u53EA\u6709\u770B\u89C1\u7684\u65F6\u5019\u624D\u8FDB\u884C\u7EDF\u8BA1\u548C\u7ED8\u5236\u300D\uFF09\n// \u523B\u5EA6\u56FA\u5B9A\uFF08\u5BF9\u6570\u534A\u5F84\uFF1A\u221248 dBFS \u5728\u4E2D\u5FC3\u30010 dBFS \u5728\u8FB9\u4E0A\uFF0C\u4E0D\u8DDF\u7740\u81EA\u52A8\u653E\u5927\uFF1B\u51E0\u5F20\u5361\u7247\u4E4B\u95F4\u80FD\u6BD4\u5927\u5C0F\uFF09\uFF1B\u5750\u6807\uFF08\u7167\u76F8\u4F4D\u8868\u7684\u8001\u89C4\u77E9\uFF09\uFF1A\u7AD6 = \u4E2D (L+R)/\u221A2\uFF08\u5F80\u4E0A\uFF09\u3001\u6A2A = (R\u2212L)/\u221A2\uFF08\u53EA\u6709\u5DE6\u58F0\u9053 = \u5DE6\u4E0A\u90A3\u6761\u659C\u7EBF\u3001\u53EA\u6709\u53F3 = \u53F3\u4E0A\uFF09\uFF1B\u5355\u58F0\u9053 = \u4E00\u6839\u7AD6\u7EBF\uFF0C\u8D8A\u5BBD\u8D8A\u5706\uFF0C\u53CD\u76F8 = \u6A2A\u7EBF\u3002\n\n/** \u753B\u591A\u5C11\u4E2A\u70B9\uFF08\u9694\u51E0\u4E2A\u91C7\u6837\u53D6\u4E00\u4E2A\uFF09\u3002v0.10.41 \u8D77 = **\u6563\u70B9**\uFF08user\u300C\u987A\u4FBF\u674E\u8428\u5982\u8BD5\u4E00\u4E0B\u6563\u70B9\u300D\uFF1B\u5BF9\u6570\u534A\u5F84\u4E4B\u540E\u518D\u8BD5\u4E00\u6B21\uFF09\u3002\n *  \u5386\u53F2\uFF1Av0.10.17 user\u300C\u674E\u8428\u5982\u56FE\u65E2\u7136\u91C7\u6837\u7387\u5C31\u662F\u4E2A\u7B11\u8BDD\uFF0C\u7528\u6563\u70B9\uFF1F\u300D\u2192\u300C\u8FD8\u662F\u7528\u7EBF\u4E0D\u8981\u7528\u6563\u70B9\uFF0C\u5C31\u662F\u80FD\u8BA9\u7EBF\u770B\u8D77\u6765\u5706\u6DA6\u4E00\u70B9\u5417\u300D= \u8FC7\u4E2D\u70B9\u7684\u4E8C\u6B21\u66F2\u7EBF\u8FDE\uFF08v0.10.17\u201340\uFF09\u3002 */\nexport const SCOPE_POINTS = 512;\n/** \u56FA\u5B9A\u7684**\u5BF9\u6570\u534A\u5F84**\uFF08v0.10.39\uFF1Buser\u300C\u674E\u8428\u5982\u56FE\u76EE\u524D\u7684normalization\u4E0B\u9762\u592A\u5C0F\u4E86\uFF0C\u53EF\u80FD0db\u662F\u9519\u8BEF\u7684\u300D\u2192 AI \u63D0\u5BF9\u6570\u534A\u5F84\u3001user\u300C\u8BD5\u8BD5\uFF0C\u4E0D\u77E5\u9053\u8FD9\u4E2A\u662F\u4E0D\u662F\u6B63\u786E\u7684\u674E\u8428\u5982\uFF0C\u5148\u8BD5\u8BD5\u300D\uFF09\uFF1A\n *  \u6BCF\u4E2A\u70B9\u7684\u65B9\u5411\u7167\u65E7\uFF08= \u5DE6\u53F3\u5173\u7CFB\uFF1A\u7AD6 = \u5355\u58F0\u9053\u3001\u6A2A = \u53CD\u76F8\u3001\u5DE6\u4E0A / \u53F3\u4E0A = \u53EA\u6709\u5DE6 / \u53F3\uFF09\uFF0C\u79BB\u4E2D\u5FC3\u591A\u8FDC\u6309\u5206\u8D1D\uFF1AFLOOR_DB\uFF08\u221248 dBFS\uFF09\u5728\u4E2D\u5FC3\u30010 dBFS \u5728\u8FB9\u4E0A\uFF080.9\uFF09\u3002\n *  \u4E0D\u81EA\u52A8\u653E\u5927\uFF08v0.10.25\uFF1A\u505C\u4E86\u4EE5\u540E\u5C3E\u5DF4\u88AB\u653E\u5927\u6210\u4E00\u56E2\uFF09\uFF1B\u51E0\u5F20\u5361\u4E4B\u95F4\u7167\u6837\u80FD\u6BD4\u5927\u5C0F\uFF0C\u5C0F\u58F0\u7684\u8F68\u4E5F\u6709\u5F62\u72B6\u3002\u7EBF\u6027\u523B\u5EA6\uFF08v0.10.25\u201338\uFF1A\u6EE1\u683C = 0 dBFS\uFF09\u4E00\u822C\u8F68\u9053\u53EA\u5360\u4E2D\u95F4\u4E00\u5C0F\u70B9\u3002 */\nconst EDGE = 0.9, FLOOR_DB = 48, FS = Math.SQRT2;   // FS = \u4E24\u8FB9\u90FD\u6EE1\u7684\u5355\u58F0\u9053 (L+R)/\u221A2 \u7684\u957F\u5EA6 = 0 dBFS\nconst radius = (len: number): number => (len <= 0 ? 0 : (EDGE * Math.max(0, Math.min(1, (20 * Math.log10(len / FS) + FLOOR_DB) / FLOOR_DB))) / len);   // \u4E58\u5230 (x, y) \u4E0A\u7684\u500D\u6570\n/** \u6BD4\u8FD9\u8FD8\u5C0F = \u5F53\u6CA1\u58F0\uFF0C\u4E0D\u753B\uFF08\u505C\u4E86\u4E0D\u7559\u4E00\u4E2A\u70B9\uFF09\u3002 */\nconst SILENT = 1e-4;\n\n/** \u4E00\u5E27\u5DE6\u53F3\u91C7\u6837 \u2192 SVG path\uFF08viewBox -1 -1 2 2\uFF1B\u6BCF\u4E2A\u70B9\u4E00\u5C0F\u622A\u5706\u5934\u7684\u7EBF = \u4E00\u4E2A\u5706\u70B9\uFF09+ \u5DE6\u53F3\u76F8\u5173\uFF08\u22121\u2026+1\uFF1B\u51E0\u4E4E\u6CA1\u58F0 = null\uFF09\u3002 */\nexport function stereoShape(L: Float32Array, R: Float32Array): { path: string; corr: number | null } {\n  const n = Math.min(L.length, R.length);\n  let lr = 0, ll = 0, rr = 0, pk = 0;\n  for (let i = 0; i < n; i++) { const l = L[i], r = R[i]; lr += l * r; ll += l * l; rr += r * r; const m = Math.abs(l + r), s = Math.abs(l - r); if (m > pk) pk = m; if (s > pk) pk = s; }\n  pk *= Math.SQRT1_2;\n  const corr = ll > 1e-9 && rr > 1e-9 ? Math.max(-1, Math.min(1, lr / Math.sqrt(ll * rr))) : ll + rr > 1e-9 ? 0 : null;   // \u53EA\u6709\u4E00\u8FB9\u6709\u58F0 = 0\n  if (pk < SILENT) return { path: \"\", corr };\n  const step = Math.max(1, Math.floor(n / SCOPE_POINTS));\n  const xs: number[] = [], ys: number[] = [];\n  for (let i = 0; i < n; i += step) { const x = (R[i] - L[i]) * Math.SQRT1_2, y = -(L[i] + R[i]) * Math.SQRT1_2, k = radius(Math.hypot(x, y)); xs.push(x * k); ys.push(y * k); }\n  const f = (v: number) => v.toFixed(3);\n  let d = \"\"; for (let i = 0; i < xs.length; i++) d += `M${f(xs[i])},${f(ys[i])}h.002`;   // \u6781\u77ED\u4E00\u622A + \u5706\u5934 = \u70B9\uFF08\u4E0D\u7528 h0\uFF1A\u96F6\u957F\u7684\u5B50\u8DEF\u5F84\u6709\u7684\u6D4F\u89C8\u5668\u4E0D\u753B\uFF09\n  return { path: d, corr };\n}\n", "// studio.ts \u2014\u2014 \u6DF7\u97F3\u53F0\uFF08\u300C\u542C\u300D\u7684\u5E95\u5EA7\uFF1Buser 2026-10-10\u300C\u80FD\u4E0D\u80FD\u6DF7\u97F3\u53F0\u5C31\u662F\u542C\u7684\u952E\u76D8\u300D\uFF09\u3002\u8C31\u7559\u7740\u80FD\u770B\u3002\n// created 2026-10-08 by Claude Fable 5.1\uFF08\u4E00\u4E2A\u58F0\u90E8\u4E00\u6761\uFF1A\u540D\u5B57 / \u8C01\u6765\u6F14 / \u589E\u76CA dB / \u58F0\u50CF / \u9759\u97F3 / \u72EC\u594F + \u603B\u8F68\uFF09\u3002\n// 2026-10-10 v0.10.8\uFF08Claude Opus 5.5\uFF09\uFF1A\u6BCF\u6761\u8F68\u4E00\u6392\u63D2\u4EF6\u683C\uFF08src/ui/plugins.ts\uFF09\u2014\u2014\u6B4C\u624B\u8F68\u7B2C\u4E00\u683C = \u9ED8\u8BA4 EQ\uFF08\u6CA1\u78B0\u8FC7 = \u4E0D\u5728\u6587\u4EF6\u91CC = \u5E73\uFF1B\u80FD\u5173\u3001\u80FD\u6362\u9762\u677F\uFF0C\u4E0D\u80FD\u5220\uFF09\uFF0C\n//   \u300C\uFF0B\u300D= \u5F80\u8FD9\u6761\u8F68\u63D2\u4EFB\u4F55\u63D2\u4EF6\uFF1B\u9762\u677F = \u4E00\u952E / \u5168\u91CF\uFF08\u540C\u4E00\u7EC4\u53C2\u6570\u7684\u4E24\u79CD\u770B\u6CD5\uFF09\u3002\u6570\u636E = studio.json v2 \u73B0\u6210\u7684\u6548\u679C\u94FE\uFF08FxV2\uFF09\uFF0C\u4E0D\u5347\u683C\u5F0F\u3002\n// v0.10.9\uFF1A\u6DF7\u97F3\u8F68\uFF08\u8DEF\u7531\u8F68\uFF09\u2014\u2014\u51FA\u5230 / \u53D1\u9001 / \u603B\u7EBF\u63A5\u603B\u7EBF\u3002\n// v0.10.10\uFF1A**\u6309\u63D2\u4EF6\u5206\u9875**\uFF08user\u300C\u628A\u4E0D\u540C\u63D2\u4EF6\u7684tab\u5207\u6362\u7ED9\u653E\u5728\u6DF7\u97F3\u53F0\u7684\u9876\u680F\u4E0A\uFF0C\u7136\u540E\u6240\u6709\u5361\u7247\u7EDF\u4E00\u663E\u793A\u5BF9\u5E94\u63D2\u4EF6\u7684\u64CD\u4F5C\u548C\u4EEA\u8868\u76D8\uFF1F\u6BD4\u5982\u6700\u57FA\u7840\u7684\u6A21\u5F0F\u5C31\u662Fgain\u548Cpan\n//   \u7136\u540E\u5CF0\u503C\u653E\u5728\u5361\u7247\u7684\u9876\u90E8\u4E00\u6761\u7EC6\u7EBF\uFF0C\u6240\u6709\u63D2\u4EF6\u6A21\u5F0F\u90FD\u6709\u2026\u7136\u540E\u4E0D\u540C\u6A21\u5F0F\u4E0B\u9762\u5177\u4F53\u7528\u54EA\u4E2A\u63D2\u4EF6\u663E\u793A\u6A21\u5F0F\u53EF\u4EE5\u4E0B\u62C9\u3002\u7136\u540Ebasic\u6A21\u5F0F\u4E0B\u5982\u679C\u6709advanced\u7684\u548Cbasic preset\u4E0D\u4E00\u6837\u7684\u60C5\u51B5\u9700\u8981\u62AB\u9732\u300D\u2192\u300C12\u90FD\u540C\u610F\u300D\uFF09\uFF1A\n//   \u9875\u7B7E = \u6DF7\u97F3\u7684\u987A\u5E8F\uFF08\u57FA\u7840 = \u589E\u76CA / \u58F0\u50CF / \u9759\u97F3\u72EC\u594F \u2192 EQ \u2192 \u538B\u7F29 \u2192 \u53D1\u9001 \u2192 \u94FE = \u5168\u90E8\u63D2\u4EF6\u683C\uFF09\uFF1BEQ / \u538B\u7F29\u9875\u6BCF\u5F20\u5361\u7247\u76F4\u63A5\u644A\u5F00\u90A3\u4E00\u683C\u7684\u63A7\u4EF6\uFF08\u4E00\u952E / \u5168\u91CF\u4E0B\u62C9\uFF0C\u5168\u90E8\u5361\u7247\u4E00\u8D77\u6362\uFF09\uFF1B\n//   \u6BCF\u5F20\u5361\u7247\u9876\u4E0A\u4E00\u6761\u5CF0\u503C\u7EC6\u7EBF\uFF08\u6240\u6709\u9875\u90FD\u6709\uFF1B\u5F55\u97F3\u623F\u53EA\u5728\u6DF7\u97F3\u53F0\u5F00\u7740\u65F6\u62A5\uFF09\u3002\u52A0\u6DF7\u97F3\u8F68\u5728\u9875\u7B7E\u90A3\u4E00\u884C\u7684\u300C\u22EF\u300D\u91CC\uFF08user\u300C\u6DF7\u97F3\u8F68\u4E0D\u8981\u7528\u4E00\u4E2A\u5355\u72EC\u7684\u7A7A\u9875\u9762\uFF0C\u53EF\u4EE5\u5728\u6DF7\u97F3\u53F0\u7684\u9876\u680F\u4E0A\u9762\u52A0\u4E00\u4E2A...\u7684\u76EE\u5F55\uFF0C\u91CC\u9762\u6709\u52A0\u6DF7\u97F3\u8F68\u3002\u7136\u540E\u6DF7\u97F3\u8F68\u4E4B\u95F4\u8FD8\u53EF\u4EE5\u6392\u5E8F\u3002\u7136\u540E\u6B4C\u624B\u5361\u7247\u7684\u6392\u5E8F\u8FD8\u662F\u4EE5\u4E94\u7EBF\u8C31\u4E3A\u51C6\u300D\uFF09\u3002\nimport type { FxV2 } from \"../format/contract.ts\";\nimport { eqResponseDb } from \"../engine/fx.ts\";\nimport { SPEC_BANDS, bandHz, bandsDb, smoothBands, areaPath, xOfHz } from \"./spectrum.ts\";\nconst SPEC_TICKS = [100, 1000, 10000];\nimport { DEFAULT_EQ_ID, PLUGIN_KINDS, freshParams, fullParams, fxSummary, paramsOf, pluginName, fullyWet, paramView, projectToSimple, viewOfFx, type Params } from \"./plugins.ts\";\nimport { paramRow, slider, wireParamRows } from \"../keyboard/param-row.ts\";\nimport { stereoShape } from \"./scopes.ts\";\nimport { sideDocked } from \"../app/workspace.ts\";\n\nexport interface StudioStrip { id: string; name: string; performer: string; gainDb: number; pan: number; muted: boolean; solo: boolean; refs: number; color?: string }   // color = \u7C7B\u522B\u8272\uFF08\u5361\u7247\u9876\u8FB9\uFF0Cv0.9.31\uFF09   // refs = \u5728\u51E0\u5F20\u7EB8\u4E0A\uFF080 = \u80FD\u5220\uFF09\nexport interface StudioHost {\n  strips(): StudioStrip[];\n  setGain(id: string, dB: number): void;\n  setPan(id: string, pan: number): void;\n  toggleMute(id: string): void;\n  toggleSolo(id: string): void;\n  play(): void;\n  close(): void;\n  /** \u5220\u4E00\u4F4D\u4E00\u5F20\u7EB8\u90FD\u4E0D\u5728\u7684\u6B4C\u624B\uFF08\u6B4C\u624B\u7BA1\u7406\uFF1B\u7EB8\u4E0A\u4E0D\u5220\uFF09\u3002 */\n  deletePart(id: string): void;\n  /** \u603B\u8F68\uFF082026-10-10 \u5200 3\uFF09\uFF1A\u589E\u76CA dB + \u6BCD\u7EBF\u9650\u5E45\u5F00\u5173\uFF1B\u8FDB\u6B4C\uFF08studio.json master\uFF09\u3002 */\n  master(): { gainDb: number; limiter: boolean };\n  setMasterGain(dB: number): void;\n  toggleLimiter(): void;\n  /** \u6548\u679C\u5168\u5173\uFF08A/B\uFF1B\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\uFF09\uFF1A\u63D2\u4EF6\u548C\u53D1\u9001\u4E0D\u54CD\uFF0C\u63A8\u5B50 / \u58F0\u50CF / \u51FA\u5230 / \u9650\u5E45\u7559\u7740\u3002 */\n  bypass(): boolean; setBypass(on: boolean): void;\n  /** \u4E00\u6761\u8F68\u7684\u6548\u679C\u94FE\uFF08MASTER = \u603B\u8F68\uFF1B\u522B\u7684 = \u6B4C\u624B\u7684 id / \u6DF7\u97F3\u8F68\u7684 id\uFF09\u3002 */\n  chain(track: string): FxV2[];\n  /** \u8FD9\u4E00\u683C\u9001\u8FDB\u5F55\u97F3\u623F\u7684\u6837\u5B50\uFF08\u81EA\u52A8\u4F4E\u5207\u6362\u6210\u8FD9\u4F4D\u6700\u4F4E\u7684\u97F3\u7B97\u51FA\u6765\u7684 Hz\u3001\u5EF6\u8FDF\u8DDF\u901F\u5EA6\u6362\u6210\u6BEB\u79D2\uFF09\uFF1A\u66F2\u7EBF / \u8BFB\u6570\u7167\u8FD9\u4E2A\u753B\uFF0C\u548C\u542C\u5230\u7684\u4E00\u81F4\u3002 */\n  resolve(track: string, fx: FxV2): FxV2;\n  /** \u6539\u4E00\u6761\u8F68\u7684\u6548\u679C\u94FE\uFF08\u8FDB undo\uFF1Bmerge = \u8FDE\u7EED\u62D6\u540C\u4E00\u4E2A\u65CB\u94AE\u5E76\u6210\u4E00\u6B65\u7684\u952E\uFF09\u3002 */\n  setChain(track: string, chain: FxV2[], label: string, merge?: string): void;\n  /** \u538B\u7F29\u300C\u88AB\u8C01\u538B\u300D\u80FD\u9009\u7684\u8F68\uFF08\u9664\u4E86\u81EA\u5DF1\uFF1B\u6CA1\u6709 = \u8FD9\u6761\u8F68\u4E0A\u7684\u538B\u7F29\u5668\u53EA\u542C\u81EA\u5DF1\uFF09\u3002 */\n  keyTracks(track: string): { id: string; name: string }[];\n  // \u8DEF\u7531\u8F68\uFF08v0.10.9\uFF09\uFF1A\u6B4C\u624B\u8F68\u548C\u8F93\u51FA\uFF08\u603B\u8F68\uFF09\u662F\u5185\u7F6E\u7684\uFF0C\u6DF7\u97F3\u8F68\u81EA\u5DF1\u52A0\uFF08user\u300C\u6709\u4E00\u4E2A\u9ED8\u8BA4\u603B\u7EBF\uFF0C\u5C31\u662F\u6B4C\u624B\u548C\u8F93\u51FA\u90FD\u662Fbuiltin\u7684\uFF0C\u4F46\u662F\u4F60\u53EF\u4EE5\u52A0\u6DF7\u97F3\u8F68\u300D\uFF09\n  buses(): { id: string; name: string; gainDb: number; pan: number; bypass: boolean; muted?: boolean }[];\n  /** \u6DF7\u97F3\u8F68\u9759\u97F3\uFF08v0.10.35\uFF0C\u89C6\u56FE\u6001\uFF1B\u4E0D\u8FDB\u6587\u4EF6\uFF09\u3002 */\n  toggleBusMute?(id: string): void;\n  /** \u6DF7\u97F3\u8F68\u6574\u6761\u65C1\u901A\uFF08\u63D2\u4EF6\u5168\u8DF3\u8FC7\uFF0C\u63A8\u5B50 / \u58F0\u50CF / \u53D1\u9001\u7167\u65E7\uFF1Bv0.10.23\uFF09\u3002 */\n  setBusBypass(id: string, on: boolean): void;\n  addBus(): string;\n  removeBus(id: string): void;\n  renameBus(id: string, name: string): void;\n  /** \u6DF7\u97F3\u8F68\u5F80\u524D / \u5F80\u540E\u632A\u4E00\u4F4D\uFF08\u53EA\u5728\u6DF7\u97F3\u8F68\u4E4B\u95F4\uFF09\u3002 */\n  moveBus(id: string, dir: -1 | 1): void;\n  /** \u6B4C\u624B\u5F80\u524D / \u5F80\u540E\u632A\u4E00\u4F4D = \u8C31\u4E0A\u58F0\u90E8\u7684\u987A\u5E8F\uFF08\u6DF7\u97F3\u53F0\u548C\u4E94\u7EBF\u8C31\u662F\u540C\u4E00\u4E2A\u987A\u5E8F\uFF1Bv0.10.17\uFF0Cuser\u300C\u6DF7\u97F3\u53F0\u91CC\u9762\u8FD8\u662F\u5E94\u8BE5\u652F\u6301\u6B4C\u624B\u987A\u5E8F\u6392\u5E8F\u300D\uFF09\u3002 */\n  movePart(id: string, dir: -1 | 1): void;\n  setBusGain(id: string, dB: number): void;\n  setBusPan(id: string, pan: number): void;\n  /** \u51FA\u5230\u54EA\uFF08\"master\" / \u8DEF\u7531\u8F68 id\uFF09\u3002 */\n  outTo(track: string): string;\n  setOutTo(track: string, to: string): void;\n  /** \u63A8\u5B50\u540E\u53D1\u7ED9\u54EA\u4E9B\u8DEF\u7531\u8F68\u3002 */\n  sends(track: string): { to: string; gainDb: number }[];\n  setSends(track: string, sends: { to: string; gainDb: number }[], label: string, merge?: string): void;\n  /** \u8FD9\u6761\u8F68\u80FD\u51FA\u5230 / \u53D1\u7ED9\u7684\u8DEF\u7531\u8F68\uFF08\u4E0D\u542B\u81EA\u5DF1\u3001\u4E0D\u542B\u4F1A\u63A5\u6210\u73AF\u7684\uFF09\u3002 */\n  targets(track: string): { id: string; name: string }[];\n  /** \u6362\u9875\u4E86\uFF08\u5BBF\u4E3B\u636E\u6B64\u5F00\u5173\u5F55\u97F3\u623F\u7684\u9891\u8C31\uFF1A\u53EA\u6709 EQ \u9875\u770B\u5F97\u89C1\u624D\u7B97\uFF1Buser\u300C\u8BB0\u5F97\u6211\u8BF4\u7684\u7701cpu\uFF0C\u53EA\u6709\u770B\u89C1\u7684\u65F6\u5019\u624D\u8FDB\u884C\u7EDF\u8BA1\u548C\u7ED8\u5236\u300D\uFF09\u3002 */\n  tabChanged?(tab: MixTab): void;\n}\nexport const MASTER = \"__master\";\nexport type MixTab = \"basic\" | \"eq\" | \"comp\" | \"send\" | \"chain\";\n/** \u9875\u7B7E = \u6DF7\u97F3\u7684\u987A\u5E8F\uFF08\u5E73\u8861 / \u6446\u4F4D \u2192 \u9891\u7387 \u2192 \u52A8\u6001 \u2192 \u7A7A\u95F4\uFF1B\u6700\u540E\u4E00\u9875\u662F\u5168\u90E8\u63D2\u4EF6\u683C\uFF09\u3002 */\nconst TABS: { id: MixTab; label: string; hint: string }[] = [\n  { id: \"basic\", label: \"\u57FA\u7840\", hint: \"\u589E\u76CA\u3001\u58F0\u50CF\u3001\u9759\u97F3 / \u72EC\u594F\uFF1A\u5148\u628A\u51E0\u6761\u8F68\u7684\u97F3\u91CF\u6446\u5E73\u3001\u5DE6\u53F3\u6446\u5F00\uFF08\u6DF7\u97F3\u7684\u7B2C\u4E00\u6B65\uFF09\" },\n  { id: \"eq\", label: \"EQ\", hint: \"\u6BCF\u6761\u8F68\u7684\u9ED8\u8BA4 EQ\uFF1A\u4E24\u6837\u4E1C\u897F\u7CCA\u5728\u4E00\u8D77\u3001\u592A\u95F7 / \u592A\u523A\" },\n  { id: \"comp\", label: \"\u538B\u7F29\", hint: \"\u6BCF\u6761\u8F68\u4E0A\u7684\u7B2C\u4E00\u4E2A\u538B\u7F29\uFF1A\u628A\u5FFD\u5927\u5FFD\u5C0F\u62C9\u5E73\" },\n  { id: \"send\", label: \"\u53D1\u9001\", hint: \"\u51FA\u5230\u54EA\u3001\u63A8\u5B50\u540E\u53D1\u7ED9\u54EA\u51E0\u6761\u6DF7\u97F3\u8F68\uFF08\u6DF7\u54CD / \u5EF6\u8FDF\u653E\u5728\u6DF7\u97F3\u8F68\u4E0A\uFF0C\u51E0\u6761\u8F68\u5171\u7528\uFF09\" },\n  { id: \"chain\", label: \"\u94FE\", hint: \"\u6BCF\u6761\u8F68\u4E0A\u7684\u5168\u90E8\u63D2\u4EF6\u683C\uFF1A\u968F\u4FBF\u63D2\u3001\u5F00\u5173\u3001\u62FF\u6389\" },\n];\nconst esc = (s: string) => s.replace(/[&<>\"']/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[c]!);\nconst panText = (p: number) => (Math.abs(p) < 0.025 ? \"\u4E2D\" : p < 0 ? `\u5DE6 ${Math.round(-p * 100)}` : `\u53F3 ${Math.round(p * 100)}`);\nconst dbText = (d: number) => `${d > 0 ? \"+\" : \"\"}${d.toFixed(1)} dB`;\nconst toDb = (x: number) => (x > 1e-5 ? 20 * Math.log10(x) : -60);\nconst row = paramRow;   // \u4E00\u884C\u53C2\u6570 = \u6DF1\u6A21\u5757 param-row.ts\uFF08\u540D\u5B57 + \u95EE\u53F7 + \u8BFB\u6570 + \u63A7\u4EF6\uFF1B\u6ED1\u5757\u7684\u6EDA\u8F6E / \u53CC\u51FB\u4E5F\u5728\u90A3\u91CC\uFF09\nconst HINT = {\n  gain: \"\u589E\u76CA\uFF08\u63A8\u5B50\uFF09\uFF1A\u8FD9\u6761\u8F68\u6574\u4F53\u7684\u97F3\u91CF\u3002\u6DF7\u97F3\u7684\u7B2C\u4E00\u6B65 = \u5148\u628A\u51E0\u6761\u8F68\u7684\u97F3\u91CF\u6446\u5E73\",\n  pan: \"\u58F0\u50CF\uFF1A\u5728\u5DE6\u53F3\u54EA\u4E2A\u4F4D\u7F6E\u3002\u51E0\u6761\u8F68\u5DE6\u53F3\u9519\u5F00\u4E00\u70B9\uFF0C\u5C31\u4E0D\u4F1A\u90FD\u6324\u5728\u6B63\u4E2D\u95F4\u3002\u6570\u5B57 = \u5F80\u4E00\u8FB9\u63A8\u4E86\u591A\u5C11\uFF08\u7B49\u529F\u7387\uFF1A\u600E\u4E48\u6446\u603B\u54CD\u5EA6\u4E0D\u53D8\uFF09\uFF1A\u4E2D = \u4E24\u4E2A\u5587\u53ED\u5404 \u22123 dB\uFF1B50 = \u8FD9\u8FB9 \u22120.7 dB\u3001\u90A3\u8FB9 \u22128.3 dB\uFF08\u5DEE 7.7 dB\uFF09\uFF1B100 = \u5168\u5728\u8FD9\u8FB9\uFF0C\u53E6\u4E00\u8FB9\u6CA1\u58F0\",\n  masterGain: \"\u603B\u8F68\u589E\u76CA\uFF1A\u6240\u6709\u8F68\u6DF7\u5728\u4E00\u8D77\u4E4B\u540E\u6574\u4F53\u518D\u8C03\u5927\u8C03\u5C0F\",\n  out: \"\u51FA\u5230\uFF1A\u8FD9\u6761\u8F68\u7684\u58F0\u97F3\u6700\u540E\u53BB\u54EA\u2014\u2014\u76F4\u63A5\u53BB\u603B\u8F68\uFF0C\u6216\u8005\u5148\u8FDB\u4E00\u6761\u6DF7\u97F3\u8F68\uFF08\u5728\u90A3\u91CC\u4E00\u8D77\u8FC7\u6548\u679C\uFF09\",\n  send: \"\u53D1\u9001\uFF1A\u63A8\u5B50\u4E4B\u540E\u518D\u590D\u5236\u4E00\u4EFD\u7ED9\u8FD9\u6761\u6DF7\u97F3\u8F68\u2014\u2014\u8DDF\u7740\u8FD9\u6761\u8F68\u7684\u589E\u76CA\u548C\u58F0\u50CF\u8D70\uFF1A\u63A8\u5B50\u62C9\u4F4E 3 dB\uFF0C\u53D1\u8FC7\u53BB\u7684\u4E5F\u4F4E 3 dB\uFF08\u539F\u58F0\u548C\u6548\u679C\u7684\u6BD4\u4F8B\u4E0D\u53D8\uFF09\uFF1B\u9759\u97F3\u4E86\u5C31\u4E0D\u53D1\u3002\u8FD9\u91CC\u7684\u6570 = \u8FD9\u4E00\u4F4D\u8FDB\u90A3\u8FB9\u7684\u91CF\uFF0C\u8D8A\u5927\u90A3\u8FB9\u7684\u6548\u679C\uFF08\u6DF7\u54CD / \u5EF6\u8FDF\uFF09\u8D8A\u591A\uFF1B\u539F\u58F0\u7167\u65E7\u8D70\u300C\u51FA\u5230\u300D\",\n  busGain: \"\u6DF7\u97F3\u8F68\u589E\u76CA\uFF1A\u4ECE\u8FD9\u6761\u6DF7\u97F3\u8F68\u51FA\u6765\u7684\u603B\u91CF\u3002\u6DF7\u54CD / \u5EF6\u8FDF\u8FD9\u7C7B\u5168\u6E7F\u7684\u6DF7\u97F3\u8F68 = \u90A3\u8FB9\u7684\u6548\u679C\u6709\u591A\u5927\uFF0C\u53D1\u7ED9\u5B83\u7684\u51E0\u4F4D\u4E00\u8D77\u53D8\uFF08\u6BCF\u4F4D\u5355\u72EC\u591A\u5C11\u770B\u5404\u81EA\u7684\u300C\u53D1\u9001\u300D\uFF09\u3002\u8981\u662F\u6709\u51E0\u4F4D\u662F\u300C\u51FA\u5230\u300D\u5B83\uFF08\u539F\u58F0\u4E5F\u8FDB\u6765\uFF09\uFF0C\u90A3\u8FD9\u4E2A\u63A8\u5B50\u8FDE\u539F\u58F0\u4E00\u8D77\u8C03\",\n  limiter: \"\u9650\u5E45\uFF08\u603B\u8F68\u6700\u540E\u4E00\u9053\uFF09\uFF1A\u8D85\u8FC7\u5929\u82B1\u677F\uFF08\u22120.18 dBFS\uFF09\u7684\u90A3\u4E00\u5C0F\u6BB5\u5F88\u5FEB\u538B\u4E0B\u6765\uFF0C\u4E0D\u8D85\u7684\u5730\u65B9\u4E00\u4E2A\u91C7\u6837\u90FD\u4E0D\u52A8\uFF0C\u4E0D\u6539\u97F3\u8272\u3002\u5173\u6389 = \u8D85\u4E86\u5C31\u524A\u6CE2\uFF08\u7206\u97F3\u3001\u5BFC\u51FA\u7684\u6587\u4EF6\u91CC\u4E5F\u662F\uFF09\u3002\u4E00\u822C\u4E00\u76F4\u5F00\u7740\uFF1B\u60F3\u770B\u81EA\u5DF1\u7684\u6DF7\u97F3\u5230\u5E95\u591A\u54CD\uFF0C\u53EF\u4EE5\u5148\u5173\u4E86\u770B\u5CF0\u503C\",\n  peak: \"\u5CF0\u503C\uFF1A\u6700\u8FD1\u8FD9\u4E00\u4E0B\u6700\u54CD\u7684\u90A3\u4E2A\u91C7\u6837\uFF08dBFS\uFF09\u30020 dB = \u6EE1\u683C\uFF0C\u518D\u5927\u5C31\u524A\u6CE2\uFF1B\u9650\u5E45\u5F00\u7740\u65F6\u6700\u591A\u5230 \u22120.18 dB\u3002\u9876\u4E0A\u7684\u7EC6\u7EBF\u662F\u540C\u4E00\u4E2A\u6570\",\n  rms: \"\u5E73\u5747\u7535\u5E73\uFF08RMS\uFF0C\u6700\u8FD1 0.3 \u79D2\uFF0C\u63A8\u5B50\u4E4B\u540E\uFF0CdBFS\uFF09\uFF1A\u6BD4\u5CF0\u503C\u66F4\u63A5\u8FD1\u8033\u6735\u89C9\u5F97\u7684\u54CD\u3002\u51E0\u6761\u8F68\u6446\u5E73\u97F3\u91CF\u770B\u8FD9\u4E2A\uFF1B\u9876\u4E0A\u7684\u7EC6\u7EBF\uFF08\u5CF0\u503C\uFF09\u770B\u4F1A\u4E0D\u4F1A\u7206\",\n  corr: \"\u5DE6\u53F3\u76F8\u5173\uFF08\u22121 \u5230 +1\uFF09\uFF1A+1 = \u5DE6\u53F3\u4E00\u6837\uFF08\u5355\u58F0\u9053\uFF09\uFF1B0 \u9644\u8FD1 = \u5F88\u5BBD\uFF1B\u5C0F\u4E8E 0 = \u5DE6\u53F3\u53CD\u76F8\uFF0C\u624B\u673A\u5916\u653E / \u5355\u58F0\u9053\u4E00\u5408\u5C31\u4F1A\u53D8\u5C0F\u3001\u53D8\u7A7A\u3002\u80CC\u666F\u7684\u56FE\uFF1A\u7AD6\u7EBF = \u5355\u58F0\u9053\uFF0C\u8D8A\u5706\u8D8A\u5BBD\uFF0C\u6A2A\u7740 = \u53CD\u76F8\uFF1B\u5F80\u5DE6\u4E0A\u659C = \u504F\u5DE6\u58F0\u9053\u3001\u5F80\u53F3\u4E0A\u659C = \u504F\u53F3\",\n  gr: \"\u538B\u4E86\u591A\u5C11\uFF1A\u8FD9\u6761\u8F68\u4E0A\u7B2C\u4E00\u53F0\u538B\u7F29\u6B64\u523B\u628A\u58F0\u97F3\u538B\u4F4E\u4E86\u51E0 dB\uFF08\u4E0B\u9762\u644A\u5F00\u7684\u5C31\u662F\u5B83\uFF09\u3002\u4E00\u76F4\u538B\u5F88\u591A = \u9608\u503C\u592A\u4F4E\u6216\u6BD4\u4F8B\u592A\u5927\",\n  key: \"\u88AB\u8C01\u538B\uFF08\u4FA7\u94FE\uFF09\uFF1A\u538B\u7F29\u5668\u4E0D\u770B\u81EA\u5DF1\uFF0C\u800C\u770B\u53E6\u4E00\u6761\u8F68\u6709\u591A\u54CD\u2014\u2014\u6BD4\u5982\u5C0F\u6708\u76F8\u4E00\u5531\uFF0C\u4F34\u594F\u81EA\u5DF1\u8BA9\u4E00\u70B9\",\n};\n/** \u538B\u7F29\u9875\u7684\u6CE2\u5F62\u56FE\u5B58\u591A\u5C11\u6BB5\uFF08~21 ms \u4E00\u6BB5 = ~4 s\uFF09\u3002 */\nconst COMP_HIST = 192;\nconst RMS_ROW = row(\"\u5E73\u5747\", HINT.rms, `<output class=\"rms-val\">\u2014</output>`, \"\", \"strip-row\");\nconst CORR_ROW = row(\"\u5DE6\u53F3\u76F8\u5173\", HINT.corr, `<output class=\"corr-val\">\u2014</output>`, \"\", \"strip-row\");\n/** \u674E\u8428\u5982\u56FE\u7684\u5E95\uFF1A\u7AD6\u7EBF = \u5355\u58F0\u9053\u3001\u6A2A\u7EBF = \u53CD\u76F8\uFF1B\u5DE6\u4E0A / \u53F3\u4E0A = \u53EA\u6709\u5DE6 / \u53F3\u58F0\u9053\u3002 */\nconst GONIO_SVG = `<svg class=\"strip-gonio\" viewBox=\"-1 -1 2 2\" preserveAspectRatio=\"xMidYMid meet\" aria-hidden=\"true\"><path class=\"gon-axis\" d=\"M0,-1L0,1M-1,0L1,0\"/><path class=\"gon\" d=\"\"/></svg>`;   // \u4E0D\u5199\u300C\u5DE6 / \u53F3\u300D\u5B57\uFF08v0.10.21\uFF0Cuser\u300C\u674E\u8428\u5982 \u5DE6\u5B57\u548Cui overlap\u4E86\u300D\uFF09\uFF1A\u65B9\u5411\u5199\u5728\u300C\u5DE6\u53F3\u76F8\u5173\u300D\u7684\u95EE\u53F7\u91CC\n/** \u4E00\u683C\u7684\u4F4D\u7F6E\uFF1A\u54EA\u6761\u8F68\u7684\u54EA\u4E00\u683C\uFF08\u63D2\u4EF6\u683C\u7684\u8BFB\u5199\u3001\u9762\u677F\u548C\u5361\u7247\u4E0A\u644A\u5F00\u7684\u63A7\u4EF6\u90FD\u6309\u5B83\u627E\uFF09\u3002 */\ninterface Target { track: string; fx: string }\n\nexport class Studio {\n  readonly el: HTMLDivElement;\n  private tab: MixTab = \"basic\";\n  /** \u6BCF\u4E00\u683C\u81EA\u5DF1\u8BB0\u7740\u7528\u4E00\u952E\u8FD8\u662F\u5168\u91CF\uFF08\u5361\u7247\u91CC\u5207\uFF0C\u4E0D\u662F\u5168\u5C40\u5207\uFF1Buser\u300C\u4E00\u952E\u548C\u5168\u91CF\u5E94\u8BE5\u662F\u5361\u7247\u5185\u90E8\u5207\uFF0C\u800C\u4E0D\u662F\u5168\u5C40\u5207\u3002\u6BCF\u4E2A\u5361\u7247\u8BB0\u4F4F\u81EA\u5DF1\u662F\u4E00\u952E\u8FD8\u662F\u5168\u91CF\u300D\uFF09\u3002\n   *  \u6CA1\u5207\u8FC7 = \u8BFB\u5F97\u56DE\u4E00\u952E\u5C31\u4E00\u952E\u3001\u8BFB\u4E0D\u56DE\uFF08\u5728\u5168\u91CF\u91CC\u8C03\u8FC7\uFF09\u5C31\u5168\u91CF\uFF1B\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\u3002 */\n  private cardMode = new Map<string, \"simple\" | \"full\">();\n  /** \u300C\u94FE\u300D\u9875\u9876\u4E0A\u5C55\u5F00\u7740\u7684\u63D2\u4EF6\u9762\u677F\uFF1A\u54EA\u6761\u8F68\u7684\u54EA\u4E00\u683C\u3002 */\n  private open: Target | null = null;\n  private addFor: string | null = null;   // \u300C\u94FE\u300D\u9875\u300C\uFF0B\u300D\u7684\u5C0F\u83DC\u5355\u5F00\u5728\u54EA\u6761\u8F68\n  private menuOpen = false;               // \u9875\u7B7E\u90A3\u4E00\u884C\u7684\u300C\u22EF\u300D\n  // \u5CF0\u503C\u7EC6\u7EBF\uFF1A\u5F55\u97F3\u623F\u6BCF ~21 ms \u62A5\u4E00\u6B21\uFF08\u63A8\u5B50\u540E\uFF09\uFF1B\u753B\u7684\u65F6\u5019\u6DA8\u5F97\u5FEB\u3001\u843D\u5F97\u6162\uFF08\u6BCF\u79D2 30 dB\uFF09\uFF0C\u53EA\u5728\u770B\u5F97\u89C1\u3001\u6709\u58F0\u97F3\u65F6\u8DD1\u52A8\u753B\n  private target = new Map<string, number>();\n  private shown = new Map<string, number>();\n  private raf = 0; private lastTick = 0; private lastMeter = 0;\n  /** EQ \u9875\u5361\u7247\u80CC\u666F\u7684\u9891\u8C31\uFF08v0.10.11\uFF09\uFF1A\u6BCF\u6761\u8F68\u5E73\u6ED1\u540E\u7684 96 \u4E2A\u9891\u5E26\uFF08dB\uFF09\u3002 */\n  private specShown = new Map<string, Float32Array>();\n  /** \u4EEA\u8868\uFF08v0.10.16\uFF1Buser\u300C\u4E09\u4E2A\u9875\u540C\u610F\u300D\uFF09\uFF1A\u5E73\u5747\u7535\u5E73 = \u5747\u65B9\u6309 0.3 s \u5E73\u6ED1\uFF1B\u538B\u7F29\u9875 = \u538B\u4E86\u591A\u5C11\uFF08\u6DA8\u5F97\u5FEB\u3001\u6BCF\u79D2\u56DE 20 dB\uFF09\uFF1B\u57FA\u7840\u9875\u603B\u8F68 / \u6DF7\u97F3\u8F68 = \u674E\u8428\u5982\u56FE + \u5DE6\u53F3\u76F8\u5173\u3002\u8BFB\u6570\u4E00\u79D2\u5237 4 \u6B21\uFF08\u4E0D\u95EA\uFF09\u3002 */\n  private msTarget = new Map<string, number>(); private msShown = new Map<string, number>();\n  private grTarget = new Map<string, number>(); private grShown = new Map<string, number>();\n  private corrShown = new Map<string, number>(); private lastText = 0;\n  private full = false;\n  /** \u63D2\u4EF6\u53C2\u6570\u7684\u526A\u8D34\u677F\uFF08v0.10.23\uFF1Buser\u300C\u5F85\u4F1A\uFF1A\u6548\u679C\u5668\u9884\u8BBE\u53EF\u4EE5\u62F7\u8D1D\uFF0C\u7C7B\u4F3CUnity\u7684component\uFF0C\u5C3D\u91CF\u4E25\u683C\u4E00\u70B9\u907F\u514D\u6DF7\u6DC6\u3002\u4E0D\u8BFB\u5FEB\u6377\u952E\u300D\uFF09\uFF1A\n   *  \u62F7 = \u8FD9\u4E00\u683C\u7684\u79CD\u7C7B + \u5168\u90E8\u53C2\u6570\uFF08\u4E0D\u62F7\u5F00 / \u5173\u3001\u4E0D\u62F7\u300C\u88AB\u8C01\u538B\u300D\uFF09\uFF1B\u7C98\u53C2\u6570 = \u53EA\u80FD\u7C98\u5230\u540C\u4E00\u79CD\u63D2\u4EF6\u4E0A\uFF08\u8986\u76D6\u53C2\u6570\uFF0C\u5F00\u5173 / \u88AB\u8C01\u538B\u7167\u65E7\uFF09\uFF1B\u7C98\u6210\u65B0\u7684\u4E00\u683C = \u94FE\u5C3E\u52A0\u4E00\u683C\u3002\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\u3001\u6CA1\u6709\u5FEB\u6377\u952E\u3002 */\n  private fxClip: { kind: string; params: Params; from: string } | null = null;\n  private clipBtns(tg: Target, fx: FxV2): string {\n    const c = this.fxClip, here = `${this.trackName(tg.track)} \u00B7 ${pluginName(fx.kind)}`;\n    const copy = `<button class=\"btn\" data-v=\"fxcopy\" title=\"\u62F7\u8FD9\u4E00\u683C\u7684\u53C2\u6570\uFF08\u79CD\u7C7B + \u5168\u90E8\u53C2\u6570\uFF1B\u4E0D\u62F7\u5F00\u5173\u3001\u4E0D\u62F7\u88AB\u8C01\u538B\uFF09\">\u62F7\u53C2\u6570</button>`;\n    const paste = c && c.kind === fx.kind ? `<button class=\"btn\" data-v=\"fxpaste\" title=\"\u628A\u62F7\u7684\u53C2\u6570\uFF08\u6765\u81EA\u300C${esc(c.from)}\u300D\uFF09\u76D6\u5230\u8FD9\u4E00\u683C\u4E0A\uFF1B\u5F00\u5173 / \u88AB\u8C01\u538B\u7167\u65E7\uFF1B\u80FD\u64A4\u9500\">\u7C98\u53C2\u6570</button>` : \"\";\n    return copy + (c && c.from === here && paste ? \"\" : paste);\n  }\n  /** \u538B\u7F29\u9875\uFF1A\u6BCF\u6761\u8F68\u6700\u8FD1 COMP_HIST \u6BB5\uFF08~21 ms \u4E00\u6BB5\uFF09\u7684 [\u8FDB\u5CF0\u503C, \u51FA\u5CF0\u503C, \u538B\u4E86\u591A\u5C11 dB]\u3002 */\n  private compHist = new Map<string, [number, number, number][]>();\n  /** \u5DEE\u8BBE\u5907\uFF08v0.10.17\uFF1Buser\u300C\u4EE5\u53CA\u6CE8\u610F\u4E00\u4E0B\u5DEE\u8BBE\u5907\u4E0A\u7684\u6027\u80FD\u5F71\u54CD\u300D\uFF09\uFF1A\u2460 \u53EA\u7B97 / \u53EA\u753B\u770B\u5F97\u89C1\u7684\u5361\u7247\uFF08\u6DF7\u97F3\u53F0\u91CC\u6EDA\u51FA\u53BB\u7684\u4E0D\u7B97 FFT\u3001\u4E0D\u753B\u674E\u8428\u5982\u56FE\uFF09\uFF1B\n   *  \u2461 \u80CC\u666F\u7EDF\u8BA1\u6309\u82B1\u7684\u65F6\u95F4\u81EA\u5DF1\u964D\u9891\uFF1A\u6700\u8FD1\u5E73\u5747\u4E00\u6B21\u8D85\u8FC7 4 ms = \u9694\u4E00\u5E27\u753B\u4E00\u5E27\uFF08\u6700\u591A 4 \u5E27\u753B 1 \u5E27\uFF09\uFF0C\u964D\u5230 1.5 ms \u4EE5\u4E0B\u518D\u6062\u590D\u3002 */\n  private seen = new Set<string>(); private io: IntersectionObserver | null = null;\n  private bgCost = 0; private bgSkip = 0; private bgN = 0;\n  private budgeted(f: () => void): void {\n    if (this.bgSkip && this.bgN++ % (this.bgSkip + 1)) return;\n    const t0 = performance.now(); f(); const dt = performance.now() - t0;\n    this.bgCost = this.bgCost * 0.8 + dt * 0.2;\n    if (this.bgCost > 4 && this.bgSkip < 3) this.bgSkip++; else if (this.bgCost < 1.5 && this.bgSkip > 0) this.bgSkip--;\n  }\n  private watchCards(): void {\n    if (typeof IntersectionObserver !== \"function\") return;   // \u6CA1\u6709\uFF08\u5F88\u8001\u7684\u6D4F\u89C8\u5668\uFF09= \u5F53\u5168\u770B\u5F97\u89C1\n    this.io ??= new IntersectionObserver((es) => { for (const e of es) { const id = (e.target as HTMLElement).dataset.id!; if (e.isIntersecting) this.seen.add(id); else this.seen.delete(id); } });\n    this.io.disconnect(); this.seen.clear();\n    for (const el of this.el.querySelectorAll<HTMLElement>(\".studio-strips .strip[data-id]\")) this.io.observe(el);\n  }\n  private shownCard(id: string): boolean { return !this.io || this.seen.has(id); }\n  constructor(parent: HTMLElement, private host: StudioHost) {\n    addEventListener(\"resize\", () => this.fitHeight());   // \u8F6C\u5C4F / \u7A97\u53E3\u53D8\u4E86\uFF1A\u91CD\u65B0\u6309\u6574\u6392\u5BF9\u9F50\n    this.el = document.createElement(\"div\"); this.el.className = \"studio\"; this.el.hidden = true;\n    this.el.innerHTML = `<div class=\"finder-bar\"><span class=\"finder-title\">\u6DF7\u97F3\u53F0</span><button class=\"btn\" data-v=\"back\" title=\"\u6536\u8D77\u6DF7\u97F3\u53F0\uFF1A\u5E95\u5EA7\u8BA9\u51FA\u6765\u3001\u8FD8\u5728\u300C\u542C\u300D\uFF08Esc = \u56DE\u53BB\u5199\uFF09\">\u6536\u8D77</button><button class=\"btn\" data-v=\"play\" title=\"\u64AD\u653E\uFF08\u7A7A\u683C\uFF09\"><svg class=\"ico\"><use href=\"#play\"/></svg></button><button class=\"btn mix-ab\" data-v=\"bypass\"></button><button class=\"btn mix-full\" data-v=\"full\" title=\"\u6DF7\u97F3\u53F0\u94FA\u6EE1\uFF08\u63A8\u5230\u6700\u4E0A\u9762\uFF0C\u5361\u7247\u6392\u6210\u597D\u51E0\u5217\uFF0C\u4E00\u773C\u770B\u5168\uFF09\uFF1B\u518D\u70B9 = \u56DE\u5230\u5E95\u5EA7\">\u5168\u5C4F</button></div>` +\n      `<div class=\"mix-tabbar\"></div><div class=\"fx-note mix-ab-note\" hidden>\u6548\u679C\u5168\u5173\u7740\uFF1A\u63D2\u4EF6\u548C\u53D1\u9001\u90FD\u4E0D\u54CD\uFF0C\u53EA\u5269\u63A8\u5B50\u3001\u58F0\u50CF\u3001\u51FA\u5230\u548C\u603B\u8F68\u9650\u5E45\u2014\u2014\u542C\u8C31\u5B50\u672C\u8EAB / \u542C\u5DEE\u522B\u7528\uFF1B\u518D\u70B9\u4E00\u4E0B\u56DE\u6765\u3002\u5BFC\u51FA\u7167\u5E38\u5E26\u6548\u679C\u3002</div><div class=\"mix-menu\" hidden></div><div class=\"fx-panel\" data-fxwrap hidden></div><div class=\"studio-strips\"></div>`;\n    parent.append(this.el);\n    this.el.addEventListener(\"click\", (e) => this.onClick(e));\n    this.el.addEventListener(\"input\", (e) => this.onInput(e));\n    this.el.addEventListener(\"change\", (e) => this.onChange(e));\n    wireParamRows(this.el);   // \u6EDA\u8F6E\u4E00\u683C\u4E00\u6B65\u3001\u53CC\u51FB\u56DE\u9ED8\u8BA4\u3001\u95EE\u53F7\uFF08v0.10.13\uFF09\n  }\n  get isOpen(): boolean { return !this.el.hidden; }\n  get currentTab(): MixTab { return this.tab; }\n  show(): void { this.el.hidden = false; this.render(); }\n  hide(): void { this.el.hidden = true; this.menuOpen = false; this.io?.disconnect(); this.seen.clear(); }\n\n  // \u2500\u2500 \u5CF0\u503C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  /** \u5F55\u97F3\u623F\u62A5\u7684\u5CF0\u503C\uFF080\u20131\uFF1B\u603B\u8F68 = \u51FA\u58F0\u53E3\uFF1Btracks = \u6BCF\u6761\u8F68 / \u6DF7\u97F3\u8F68\u63A8\u5B50\u540E\uFF09\u3002 */\n  meter(peak: number, tracks: Record<string, number> = {}, ms: Record<string, number> = {}, gr: Record<string, number> = {}, cl: Record<string, [number, number]> = {}): void {\n    // \u538B\u7F29\u9875\u7684\u6CE2\u5F62\u56FE\uFF08v0.10.21\uFF1Buser\u300C\u538B\u7F29\u5668\u505A\u4E00\u4E2A\u6CE2\u5F62\u56FE\u548C\u5B9E\u65F6\u7684\u538B\u7F29\u5EA6\u7684\u53EF\u89C6\u5316\u300D\uFF09\uFF1A\u6BCF\u6761\u8F68\u7B2C\u4E00\u53F0\u538B\u7F29\u6700\u8FD1 ~4 s \u7684\u8FDB / \u51FA\u5CF0\u503C + \u538B\u4E86\u591A\u5C11\uFF0C\u53EA\u5728\u538B\u7F29\u9875\u3001\u770B\u5F97\u89C1\u7684\u5361\u7247\u4E0A\u753B\n    if (!this.el.hidden && this.tab === \"comp\") {\n      for (const [id, [i, o]] of Object.entries(cl)) { let h = this.compHist.get(id); if (!h) { h = []; this.compHist.set(id, h); } h.push([i, o, gr[id] ?? 0]); if (h.length > COMP_HIST) h.splice(0, h.length - COMP_HIST); }\n      this.budgeted(() => this.drawComp());\n    }\n    this.target.set(MASTER, peak); for (const [k, v] of Object.entries(tracks)) this.target.set(k, v);\n    this.msTarget.clear(); for (const [k, v] of Object.entries(ms)) this.msTarget.set(k, v);\n    this.grTarget.clear(); for (const [k, v] of Object.entries(gr)) this.grTarget.set(k, v);\n    this.lastMeter = performance.now();\n    const val = this.el.querySelector<HTMLElement>(\".meter-val\"); if (val) { const db = toDb(peak); val.textContent = db <= -59 ? \"\u2014\" : `${db.toFixed(1)} dB`; }\n    if (!this.raf && !this.el.hidden) { this.lastTick = performance.now(); this.raf = requestAnimationFrame(this.tick); }\n  }\n  /** \u5F55\u97F3\u623F\u62F7\u6765\u7684\u6700\u8FD1\u4E00\u6BB5\u91C7\u6837\uFF08\u6BCF\u6761\u8F68 / \u6DF7\u97F3\u8F68 / \u603B\u8F68\uFF09\u2192 EQ \u9875\u5361\u7247\u80CC\u666F\u7684\u9891\u8C31\u9762\u3002\u53EA\u5728 EQ \u9875\u3001\u6DF7\u97F3\u53F0\u770B\u5F97\u89C1\u65F6\u5F55\u97F3\u623F\u624D\u53D1\u3002 */\n  spectrum(sr: number, tracks: Record<string, Float32Array>): void {\n    if (this.el.hidden || this.tab !== \"eq\") return;\n    this.budgeted(() => this.drawSpectrum(sr, tracks));\n  }\n  private drawSpectrum(sr: number, tracks: Record<string, Float32Array>): void {\n    for (const [id, x] of Object.entries(tracks)) {\n      if (!this.shownCard(id)) continue;\n      const path = this.el.querySelector<SVGPathElement>(`.strip[data-id=\"${CSS.escape(id)}\"] .strip-spec .spec`); if (!path) continue;\n      const b = smoothBands(this.specShown.get(id), bandsDb(x, sr)); this.specShown.set(id, b);\n      path.setAttribute(\"d\", areaPath(b));\n    }\n  }\n  /** \u603B\u8F68 / \u6DF7\u97F3\u8F68\u63A8\u5B50\u540E\u7684\u5DE6\u53F3\u91C7\u6837 \u2192 \u57FA\u7840\u9875\u5361\u7247\u80CC\u666F\u7684\u674E\u8428\u5982\u56FE + \u5DE6\u53F3\u76F8\u5173\uFF08v0.10.16\uFF1Buser\u300C\u58F0\u50CF\u5BF9\u5E94\u7684\u662F\u8389\u8428\u5982\u56FE\u5417\uFF1F\u300D\u300C\u4E09\u4E2A\u9875\u540C\u610F\u300D\uFF09\u3002\n   *  \u7AD6\u7740 = \u4E2D (L+R)/\u221A2\u3001\u6A2A\u7740 = (R\u2212L)/\u221A2\uFF08\u53EA\u6709\u5DE6 = \u5DE6\u4E0A\u659C\u7EBF\uFF09\uFF1A\u7AD6\u7EBF = \u5355\u58F0\u9053\u3001\u8D8A\u5706\u8D8A\u5BBD\u3001\u6A2A\u7740 = \u53CD\u76F8\u3002\u5F62\u72B6\u770B\u7684\u662F\u5DE6\u53F3\u5173\u7CFB\uFF0C\u4E0D\u770B\u591A\u54CD\uFF1A\u6309\u8FD9\u4E00\u5E27\u6700\u5927\u7684\u90A3\u4E0B\u7F29\u653E\uFF08\u592A\u5C0F\u7684\u4E0D\u653E\u5927\uFF09\u3002 */\n  stereo(tracks: Record<string, { L: Float32Array; R: Float32Array }>): void {\n    if (this.el.hidden || this.tab !== \"basic\") return;\n    this.budgeted(() => this.drawStereo(tracks));\n  }\n  private drawStereo(tracks: Record<string, { L: Float32Array; R: Float32Array }>): void {\n    for (const [id, { L, R }] of Object.entries(tracks)) {\n      if (!this.shownCard(id)) continue;\n      const card = this.el.querySelector<HTMLElement>(`.strip[data-id=\"${CSS.escape(id)}\"]`); if (!card) continue;\n      const g = stereoShape(L, R), path = card.querySelector<SVGPathElement>(\".strip-gonio .gon\"); if (path) path.setAttribute(\"d\", g.path);\n      const prev = this.corrShown.get(id), c = g.corr === null ? null : prev === undefined ? g.corr : prev + (g.corr - prev) * 0.3;\n      if (c === null) this.corrShown.delete(id); else this.corrShown.set(id, c);\n      const out = card.querySelector<HTMLElement>(\".corr-val\"); if (out) { out.textContent = c === null ? \"\u2014\" : `${c >= 0 ? \"+\" : \"\u2212\"}${Math.abs(c).toFixed(2)}`; out.classList.toggle(\"neg\", c !== null && c < -0.05); }\n    }\n  }\n  /** \u538B\u7F29\u9875\u5361\u7247\u80CC\u666F\uFF1A\u8FDB\u6765\u7684\u7535\u5E73 = \u5E95\u4E0B\u4E00\u7247\u6DE1\u7684\u3001\u51FA\u53BB\u7684 = \u4E00\u6839\u7EBF\u3001\u538B\u4E86\u591A\u5C11 = \u4ECE\u9876\u4E0A\u5F80\u4E0B\u5782\u7684\u7EBF\u3001\u9608\u503C = \u865A\u7EBF\uFF08\u7535\u5E73 \u221248\u20260 dBFS \u6620\u5230\u5361\u7247\u9AD8\u5EA6\uFF1B\u538B\u4E86\u591A\u5C11 0\u2026\u221224 dB \u6620\u5230\u4E0A\u534A\u622A\uFF09\u3002 */\n  private drawComp(): void {\n    for (const [id, h] of this.compHist) {\n      if (!this.shownCard(id)) continue;\n      const svg = this.el.querySelector<SVGSVGElement>(`.strip[data-id=\"${CSS.escape(id)}\"] .strip-comp`); if (!svg) continue;\n      const n = h.length, x = (k: number) => ((100 * (k + COMP_HIST - n)) / (COMP_HIST - 1)).toFixed(2), lv = (v: number) => { const d = v > 1e-6 ? 20 * Math.log10(v) : -96; return (100 * Math.min(1, Math.max(0, -d / 48))).toFixed(2); };\n      let a = \"\", o = \"\", g = \"\";\n      h.forEach(([i, out, gr], k) => { a += `${k ? \"L\" : `M${x(0)},100L`}${x(k)},${lv(i)}`; o += `${k ? \"L\" : \"M\"}${x(k)},${lv(out)}`; g += `${k ? \"L\" : \"M\"}${x(k)},${((Math.min(24, -gr) / 24) * 50).toFixed(2)}`; });\n      if (n) a += `L${x(n - 1)},100Z`;\n      svg.querySelector(\".cin\")!.setAttribute(\"d\", a); svg.querySelector(\".cout\")!.setAttribute(\"d\", o); svg.querySelector(\".cgr\")!.setAttribute(\"d\", g);\n    }\n  }\n  private compSvg(track: string): string {\n    const c = this.slots(track).find((s) => s.fx.kind === \"comp\")?.fx, thr = c && c.on !== false ? paramsOf(c).thresholdDb : null;\n    const ty = thr === null || thr === undefined ? null : (100 * Math.min(1, Math.max(0, -thr / 48))).toFixed(2);\n    return `<svg class=\"strip-comp\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" aria-hidden=\"true\"><path class=\"cin\" d=\"\"/><path class=\"cout\" d=\"\"/><path class=\"cgr\" d=\"\"/>${ty ? `<path class=\"cthr\" d=\"M0,${ty}L100,${ty}\"/>` : \"\"}</svg>`;\n  }\n  /** \u8FD9\u4E00\u683C EQ \u7684\u54CD\u5E94\u66F2\u7EBF\uFF08\u00B118 dB \u6620\u5230\u5361\u7247\u9AD8\u5EA6\uFF0C\u4E2D\u7EBF = 0 dB\uFF09\u3002 */\n  private curvePath(track: string, fx: FxV2 | null): string {\n    if (!fx || fx.on === false) return \"M0,50L100,50\";\n    const db = eqResponseDb(paramsOf(this.host.resolve(track, fx)), 48000, Array.from({ length: SPEC_BANDS }, (_, k) => bandHz(k)));\n    return db.map((d, k) => `${k ? \"L\" : \"M\"}${((100 * (k + 0.5)) / SPEC_BANDS).toFixed(2)},${(50 - (Math.max(-18, Math.min(18, d)) / 18) * 45).toFixed(2)}`).join(\"\");\n  }\n  private specSvg(track: string): string {\n    const eq = this.slots(track).find((s) => s.fx.kind === \"eq\")?.fx ?? null;\n    // \u9891\u7387\u523B\u5EA6\uFF08user\u300C\u2026\u53EF\u80FD\u8FD8\u662F\u9700\u8981\u9891\u7387\u523B\u5EA6\uFF0C\u5F88subtle\u7684\u6DE1\u5B57\u653E\u5728\u5E95\u4E0B\uFF1F\u300D\uFF09\uFF1A100 / 1k / 10k \u4E09\u6839\u7AD6\u7EBF + \u5E95\u4E0B\u5C0F\u5B57\uFF1B\u5B57\u7528 HTML \u653E\uFF08SVG \u62C9\u4F38\u4E86\u5B57\u4F1A\u53D8\u5F62\uFF09\n    const ticks = SPEC_TICKS.map((f) => ({ f, x: 100 * xOfHz(f) }));\n    return `<svg class=\"strip-spec\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" aria-hidden=\"true\"><path class=\"grid\" d=\"${ticks.map((t) => `M${t.x.toFixed(2)},0L${t.x.toFixed(2)},100`).join(\"\")}\"/><path class=\"spec\" d=\"\"/><path class=\"eqc\" d=\"${this.curvePath(track, eq)}\"/></svg>` +\n      `<div class=\"spec-ticks\" aria-hidden=\"true\">${ticks.map((t) => `<span style=\"left:${t.x.toFixed(2)}%\">${t.f >= 1000 ? `${t.f / 1000}k` : t.f}</span>`).join(\"\")}</div>`;\n  }\n  private tick = (now: number): void => {\n    this.raf = 0; if (this.el.hidden) return;\n    const dt = Math.min(0.1, (now - this.lastTick) / 1000); this.lastTick = now;\n    const stale = now - this.lastMeter > 200;   // \u4E00\u9635\u6CA1\u62A5\u4E86 = \u5F53\u5B83\u9759\u4E86\n    const text = now - this.lastText > 250; if (text) this.lastText = now;\n    let alive = false;\n    for (const el of this.el.querySelectorAll<HTMLElement>(\".strip[data-id]\")) {\n      const id = el.dataset.id!, raw = stale ? 0 : this.target.get(id) ?? 0, want = toDb(raw), cur = this.shown.get(id) ?? -60;\n      const next = want >= cur ? want : Math.max(want, cur - 30 * dt);\n      this.shown.set(id, next); if (next > -59.5) alive = true;\n      const bar = el.querySelector<HTMLElement>(\".strip-meter > i\");\n      if (bar) { bar.style.width = `${Math.max(0, Math.min(100, ((next + 60) / 60) * 100))}%`; bar.classList.toggle(\"hot\", raw >= 0.98); bar.parentElement!.classList.toggle(\"hot\", raw >= 0.98); }\n      // \u5E73\u5747\u7535\u5E73\uFF1A\u5747\u65B9\u6309 0.3 s \u65F6\u95F4\u5E38\u6570\u5E73\u6ED1\uFF08RMS\uFF09\n      const msWant = stale ? 0 : this.msTarget.get(id) ?? 0, msCur = this.msShown.get(id) ?? 0, ms = msCur + (msWant - msCur) * (1 - Math.exp(-dt / 0.3));\n      this.msShown.set(id, ms); if (ms > 1e-6) alive = true;\n      { const rb = el.querySelector<HTMLElement>(\".strip-meter > b\"); if (rb) { const d = ms > 1e-9 ? 10 * Math.log10(ms) : -120; rb.style.width = `${Math.max(0, Math.min(100, ((d + 60) / 60) * 100))}%`; } }   // \u7535\u5E73\u6761\u7684\u5B9E\u5FC3\u6BB5 = \u5E73\u5747\uFF08\u540C\u4E00\u628A \u221260\u20260 dB \u5C3A\u5B50\uFF09\n      // \u538B\u4E86\u591A\u5C11\uFF1A\u4E00\u538B\u5C31\u5230\u3001\u6BCF\u79D2\u56DE 20 dB\n      const grWant = stale ? 0 : this.grTarget.get(id) ?? 0, grCur = this.grShown.get(id) ?? 0, gr = grWant <= grCur ? grWant : Math.min(0, grCur + 20 * dt);\n      this.grShown.set(id, gr); if (gr < -0.05) alive = true;\n      const gb = el.querySelector<HTMLElement>(\".gr-bar > i\"); if (gb) gb.style.width = `${Math.min(100, (-gr / 20) * 100)}%`;\n      if (text) {\n        const rv = el.querySelector<HTMLElement>(\".rms-val\"); if (rv) { const db = ms > 1e-6 ? 10 * Math.log10(ms) : -99; rv.textContent = db <= -59 ? \"\u2014\" : `${db.toFixed(1)} dB`; }\n        const gv = el.querySelector<HTMLElement>(\".gr-val\"); if (gv) gv.textContent = gr > -0.05 ? \"0 dB\" : `${gr.toFixed(1)} dB`;\n      }\n    }\n    if (alive || !stale) this.raf = requestAnimationFrame(this.tick);\n  };\n\n  // \u2500\u2500 \u4E8B\u4EF6 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  private targetOf(el: Element): Target | null { const w = el.closest<HTMLElement>(\"[data-fxwrap]\"); return w?.dataset.track && w.dataset.fx ? { track: w.dataset.track, fx: w.dataset.fx } : null; }\n  private onClick(e: Event): void {\n    const t = e.target as HTMLElement, v = t.closest<HTMLElement>(\"[data-v]\")?.dataset.v, strip = t.closest<HTMLElement>(\".strip\")?.dataset.id, tg = this.targetOf(t);\n    if (!v) return;\n    if (v === \"back\") this.host.close();\n    else if (v === \"play\") this.host.play();\n    else if (v === \"bypass\") { this.host.setBypass(!this.host.bypass()); this.render(); }\n    else if (v === \"full\") { this.full = !this.full; this.el.classList.toggle(\"full\", this.full); this.render(); }   // \u6DF7\u97F3\u53F0\u5168\u5C4F\uFF08user\u300C\u6DF7\u97F3\u53F0\u53EF\u4EE5\u5207\u5168\u5C4F\uFF08\u5C31\u662F\u63A8\u5230\u6700\u4E0A\u9762\u300D\uFF09\uFF1A\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\n    else if (v === \"tab\") { this.tab = t.closest<HTMLElement>(\"[data-tab]\")!.dataset.tab as MixTab; this.menuOpen = false; this.addFor = null; this.specShown.clear(); this.compHist.clear(); this.render(); this.host.tabChanged?.(this.tab); }\n    else if (v === \"more\") { this.menuOpen = !this.menuOpen; this.render(); }\n    else if (v === \"addbus\") { this.menuOpen = false; const id = this.host.addBus(); this.render(); this.el.querySelector<HTMLElement>(`.strip[data-id=\"${CSS.escape(id)}\"]`)?.scrollIntoView({ block: \"nearest\" }); }\n    else if (v === \"mute\" && strip) { this.host.toggleMute(strip); this.render(); }\n    else if (v === \"solo\" && strip) { this.host.toggleSolo(strip); this.render(); }\n    else if (v === \"busmute\" && strip) { this.host.toggleBusMute?.(strip); this.render(); }\n    else if (v === \"busbypass\" && strip) { const b = this.host.buses().find((x) => x.id === strip); if (b) { this.host.setBusBypass(strip, !b.bypass); this.render(); } }\n    else if ((v === \"partleft\" || v === \"partright\") && strip) { this.host.movePart(strip, v === \"partleft\" ? -1 : 1); this.render(); }\n    else if (v === \"delpart\" && strip) this.host.deletePart(strip);\n    else if (v === \"limiter\") { this.host.toggleLimiter(); this.render(); }\n    else if (v === \"delbus\" && strip) { if (this.open?.track === strip) this.open = null; this.host.removeBus(strip); this.render(); }\n    else if ((v === \"busleft\" || v === \"busright\") && strip) { this.host.moveBus(strip, v === \"busleft\" ? -1 : 1); this.render(); }\n    else if (v === \"sendx\" && strip) { const to = t.closest<HTMLElement>(\"[data-to]\")!.dataset.to!; this.host.setSends(strip, this.host.sends(strip).filter((x) => x.to !== to), `\u4E0D\u518D\u53D1\u7ED9 ${this.trackName(to)}`); this.render(); }\n    else if (v === \"fx\" && strip) { const id = t.closest<HTMLElement>(\"[data-fx]\")!.dataset.fx!; this.toggleOpen(strip, id); }\n    else if (v === \"fxadd\" && strip) { this.addFor = this.addFor === strip ? null : strip; this.render(); }\n    else if (v === \"fxpick\" && strip) this.addFx(strip, t.closest<HTMLElement>(\"[data-kind]\")!.dataset.kind!, true);\n    else if (v === \"fxaddkind\" && strip) this.addFx(strip, t.closest<HTMLElement>(\"[data-kind]\")!.dataset.kind!, false);\n    else if (v === \"fxmode\" && tg) { this.cardMode.set(`${tg.track}\\n${tg.fx}`, t.closest<HTMLElement>(\"[data-mode]\")!.dataset.mode as \"simple\" | \"full\"); this.render(); }\n    else if (v === \"fxclose\") { this.open = null; this.render(); }\n    else if (v === \"fxdel\" && tg) this.deleteFx(tg);\n    else if (v === \"fxon\" && tg) { this.patch(tg, (fx) => ({ ...fx, on: fx.on === false }), \"\u5F00 / \u5173\"); this.render(); }\n    else if (v === \"fxtoggle\" && tg) { const id = t.closest<HTMLElement>(\"[data-c]\")!.dataset.c!; this.simpleSet(tg, id, (this.simpleNow(tg)?.[id] ?? 0) ? 0 : 1, false); this.render(); }\n    else if (v === \"fxchoice\" && tg) { const b = t.closest<HTMLElement>(\"[data-c]\")!; this.simpleSet(tg, b.dataset.c!, Number(b.dataset.val), false); this.render(); }\n    else if (v === \"fxcopy\" && tg) { const sl = this.slotOf(tg); if (sl) { this.fxClip = { kind: sl.fx.kind, params: structuredClone(paramsOf(sl.fx)), from: `${this.trackName(tg.track)} \u00B7 ${pluginName(sl.fx.kind)}` }; this.render(); } }\n    else if (v === \"fxpaste\" && tg && this.fxClip) { const c = this.fxClip, sl = this.slotOf(tg); if (sl && sl.fx.kind === c.kind) { this.patch(tg, (fx) => ({ ...fx, params: structuredClone(c.params) }), \"\u7C98\u53C2\u6570\"); this.render(); } }   // \u4E25\u683C\uFF1A\u79CD\u7C7B\u4E0D\u540C\u4E0D\u7C98\n    else if (v === \"fxpastenew\" && strip && this.fxClip) { const c = this.fxClip, ch = this.host.chain(strip), used = new Set(ch.map((f) => f.id)); let n = 1; while (used.has(`${c.kind}${n}`)) n++;\n      const fx: FxV2 = { id: `${c.kind}${n}`, kind: c.kind, params: structuredClone(c.params) };\n      this.host.setChain(strip, [...ch, fx], `${this.trackName(strip)} \u7C98\u6210\u65B0\u7684\u4E00\u683C\uFF1A${pluginName(c.kind)}`); this.addFor = null; this.open = { track: strip, fx: fx.id }; this.render(); }\n    else if (v === \"fxproject\" && tg) { this.patch(tg, (fx) => ({ ...fx, params: projectToSimple(fx.kind, this.onBus(tg.track), paramsOf(fx), !!fx.key) }), \"\u6539\u6210\u6700\u63A5\u8FD1\u7684\u4E00\u952E\"); this.render(); }\n    else if (v === \"fxbool\" && tg) { const id = t.closest<HTMLElement>(\"[data-p]\")!.dataset.p!; this.patch(tg, (fx) => ({ ...fx, params: { ...paramsOf(fx), [id]: paramsOf(fx)[id] ? 0 : 1 } }), id); this.render(); }\n  }\n  private onInput(e: Event): void {\n    const t = e.target as HTMLInputElement, tg = this.targetOf(t);\n    if (tg && t.dataset.c !== undefined) { this.simpleSet(tg, t.dataset.c, Number(t.value), true, t); return; }   // \u4E00\u952E\u7684\u65CB\u94AE\n    if (tg && t.dataset.p !== undefined) { this.fullSet(tg, t); return; }                                       // \u5168\u91CF\u7684\u53C2\u6570\n    const strip = t.closest<HTMLElement>(\".strip\"); if (!strip) return;\n    const id = strip.dataset.id!, out = t.parentElement?.querySelector(\"output\"), v = Number(t.value);\n    if (t.dataset.send !== undefined) { const to = t.dataset.send; this.host.setSends(id, this.host.sends(id).map((x) => (x.to === to ? { ...x, gainDb: v } : x)), `\u53D1\u7ED9 ${this.trackName(to)} ${dbText(v)}`, `send:${id}:${to}`); if (out) out.textContent = dbText(v); }\n    else if (t.dataset.busgain !== undefined) { this.host.setBusGain(id, v); if (out) out.textContent = dbText(v); }\n    else if (t.dataset.buspan !== undefined) { this.host.setBusPan(id, v); if (out) out.textContent = panText(v); }\n    else if (t.dataset.master !== undefined) { this.host.setMasterGain(v); if (out) out.textContent = dbText(v); }\n    else if (t.dataset.gain !== undefined) { this.host.setGain(id, v); if (out) out.textContent = dbText(v); }\n    else if (t.dataset.pan !== undefined) { this.host.setPan(id, v); if (out) out.textContent = panText(v); }\n  }\n  private onChange(e: Event): void {\n    const t = e.target as HTMLSelectElement & HTMLInputElement, strip = t.closest<HTMLElement>(\".strip\")?.dataset.id, tg = this.targetOf(t);\n    if (strip && t.dataset.out !== undefined) { this.host.setOutTo(strip, t.value); this.render(); return; }\n    if (strip && t.dataset.sendadd !== undefined && t.value) { this.host.setSends(strip, [...this.host.sends(strip), { to: t.value, gainDb: -12 }], `\u53D1\u7ED9 ${this.trackName(t.value)}`); this.render(); return; }\n    if (strip && t.classList.contains(\"bus-name\")) { const name = t.value.trim(); if (name) this.host.renameBus(strip, name); this.render(); return; }\n    if (tg && t.dataset.key !== undefined) {   // \u6362\u300C\u88AB\u8C01\u538B\u300D\uFF1A\u539F\u6765\u662F\u4E00\u952E\u7684\u6837\u5B50 = \u6362\u6210\u53E6\u4E00\u5957\u516C\u5F0F\uFF08\u4FA7\u94FE\u4E0D\u8865\u507F\uFF09\u7167\u65E7\u662F\u4E00\u952E\uFF0C\u300C\u538B\u591A\u5C11\u300D\u4E0D\u53D8\n      const v = t.value, bus = this.onBus(tg.track);\n      this.patch(tg, (fx) => { const { key: _k, ...rest } = fx, nx: FxV2 = v ? { ...rest, key: v } : rest, was = viewOfFx(fx, bus)?.read(paramsOf(fx)), view = viewOfFx(nx, bus);\n        return was && view ? { ...nx, params: view.write(was, paramsOf(nx)) } : nx; }, \"\u88AB\u8C01\u538B\"); this.render(); }\n  }\n\n  // \u2500\u2500 \u63D2\u4EF6\u683C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  /** \u4E00\u6761\u8F68\u663E\u793A\u7684\u683C\u5B50\uFF1A\u6B4C\u624B\u8F68 / \u6DF7\u97F3\u8F68\u6CA1\u6709\u9ED8\u8BA4 EQ \u90A3\u4E00\u683C = \u8865\u4E00\u4E2A\u865A\u7684\uFF08\u5E73\uFF0C\u4E0D\u5728\u6587\u4EF6\u91CC\uFF09\u3002 */\n  private slots(track: string): { fx: FxV2; virtual: boolean }[] {\n    const ch = this.host.chain(track), out = ch.map((fx) => ({ fx, virtual: false }));\n    if (track !== MASTER && !ch.some((f) => f.id === DEFAULT_EQ_ID)) out.unshift({ fx: { id: DEFAULT_EQ_ID, kind: \"eq\", params: freshParams(\"eq\") }, virtual: true });\n    return out;\n  }\n  private slotOf(tg: Target): { fx: FxV2; virtual: boolean } | null { return this.slots(tg.track).find((s) => s.fx.id === tg.fx) ?? null; }\n  private onBus(track: string): boolean { return this.host.buses().some((b) => b.id === track); }\n  private trackName(track: string): string { return track === MASTER || track === \"master\" ? \"\u603B\u8F68\" : this.host.strips().find((s) => s.id === track)?.name ?? this.host.buses().find((b) => b.id === track)?.name ?? track; }\n  private toggleOpen(track: string, fx: string): void {\n    this.open = this.open && this.open.track === track && this.open.fx === fx ? null : { track, fx };\n    this.addFor = null; this.render();\n  }\n  private modeOf(tg: Target): \"simple\" | \"full\" {\n    const m = this.cardMode.get(`${tg.track}\\n${tg.fx}`); if (m) return m;\n    const s = this.slotOf(tg); return s && viewOfFx(s.fx, this.onBus(tg.track))?.read(paramsOf(s.fx)) ? \"simple\" : \"full\";\n  }\n  /** \u4E00\u952E | \u5168\u91CF \u4E24\u4E2A\u5C0F\u94AE\uFF08\u5361\u7247\u4E0A\u644A\u5F00\u7684\u90A3\u4E00\u5757\u3001\u300C\u94FE\u300D\u9875\u9876\u4E0A\u7684\u9762\u677F\u90FD\u7528\u8FD9\u4E00\u4EFD\uFF09\u3002 */\n  private modeSeg(tg: Target): string {\n    const m = this.modeOf(tg);\n    return `<span class=\"fx-seg\"><button class=\"btn${m === \"simple\" ? \" is-on\" : \"\"}\" data-v=\"fxmode\" data-mode=\"simple\" title=\"\u51E0\u4E2A\u5927\u65CB\u94AE\uFF0C\u6309\u516C\u5F0F\u8C03\u4E0B\u9762\u5168\u91CF\u7684\u53C2\u6570\uFF08\u53EA\u6362\u8FD9\u4E00\u683C\uFF09\">\u4E00\u952E</button><button class=\"btn${m === \"full\" ? \" is-on\" : \"\"}\" data-v=\"fxmode\" data-mode=\"full\" title=\"\u6BCF\u4E00\u4E2A\u53C2\u6570\u90FD\u644A\u5F00\uFF08\u53EA\u6362\u8FD9\u4E00\u683C\uFF09\">\u5168\u91CF</button></span>`;\n  }\n  private addFx(track: string, kind: string, openPanel: boolean): void {\n    const ch = this.host.chain(track), used = new Set(ch.map((f) => f.id)); let n = 1; while (used.has(`${kind}${n}`)) n++;\n    const fx: FxV2 = { id: `${kind}${n}`, kind, params: freshParams(kind, this.onBus(track)) };\n    this.host.setChain(track, [...ch, fx], `${this.trackName(track)} \u63D2\u4E0A${pluginName(kind)}`);\n    this.addFor = null; if (openPanel) this.open = { track, fx: fx.id }; this.render();\n  }\n  /** \u6539\u4E00\u683C\uFF08\u865A\u7684\u9ED8\u8BA4 EQ = \u7B2C\u4E00\u6B21\u6539\u7684\u65F6\u5019\u5199\u8FDB\u94FE\u7684\u6700\u524D\u9762\uFF09\u3002 */\n  private patch(tg: Target, f: (fx: FxV2) => FxV2, what: string, merge = false): void {\n    const s = this.slotOf(tg); if (!s) return;\n    const ch = this.host.chain(tg.track), nx = f(s.fx);\n    const next = s.virtual ? [nx, ...ch] : ch.map((x) => (x.id === tg.fx ? nx : x));\n    this.host.setChain(tg.track, next, `${this.trackName(tg.track)} ${pluginName(nx.kind)} ${what}`, merge ? `fx:${tg.track}:${tg.fx}:${what}` : undefined);\n    const b = this.el.querySelector<HTMLElement>(`.strip[data-id=\"${CSS.escape(tg.track)}\"] .fx-chip[data-fx=\"${CSS.escape(nx.id)}\"]`);   // \u53EA\u627E\u300C\u94FE\u300D\u9875\u7684\u5C0F\u94AE\uFF08EQ / \u538B\u7F29\u9875\u644A\u5F00\u7684\u90A3\u4E00\u5757\u4E5F\u5E26 data-fx\uFF0C\u522B\u628A\u5B83\u6574\u5757\u6362\u6210\u4E00\u884C\u5B57\uFF09\n    if (b) { b.textContent = fxSummary(nx, this.onBus(tg.track)); b.classList.toggle(\"off\", nx.on === false); }\n    if (nx.kind === \"eq\") { const c = this.el.querySelector(`.strip[data-id=\"${CSS.escape(tg.track)}\"] .strip-spec .eqc`); if (c) c.setAttribute(\"d\", this.curvePath(tg.track, nx)); }   // EQ \u9875\u7684\u66F2\u7EBF\u8DDF\u7740\u62E7\n  }\n  private deleteFx(tg: Target): void {\n    if (tg.fx === DEFAULT_EQ_ID) return;\n    const ch = this.host.chain(tg.track), gone = ch.find((x) => x.id === tg.fx);\n    this.host.setChain(tg.track, ch.filter((x) => x.id !== tg.fx), `${this.trackName(tg.track)} \u62FF\u6389${pluginName(gone?.kind ?? \"\")}`);\n    if (this.open && this.open.track === tg.track && this.open.fx === tg.fx) this.open = null;\n    this.render();\n  }\n  private simpleNow(tg: Target): Record<string, number> | null { const s = this.slotOf(tg); return s ? viewOfFx(s.fx, this.onBus(tg.track))?.read(paramsOf(s.fx)) ?? null : null; }\n  /** \u4E00\u952E\u6539\u4E00\u4E2A\u63A7\u4EF6\uFF1A\u5728\u5F53\u524D\u8BFB\u6570\u4E0A\u6539\u8FD9\u4E00\u4E2A\uFF08\u8BFB\u4E0D\u51FA = \u5728\u5168\u91CF\u91CC\u8C03\u8FC7 = \u4ECE\u4E00\u952E\u7684\u9ED8\u8BA4\u8D77\uFF09\uFF0C\u6309\u516C\u5F0F\u5199\u56DE\u5168\u91CF\u53C2\u6570\u3002 */\n  private simpleSet(tg: Target, id: string, v: number, live: boolean, input?: HTMLElement): void {\n    const s = this.slotOf(tg); if (!s) return;\n    const bus = this.onBus(tg.track), view = viewOfFx(s.fx, bus)!, base = view.read(paramsOf(s.fx)); if (!base) return;   // \u9501\u7740\uFF08\u5728\u5168\u91CF\u91CC\u8C03\u8FC7\uFF09\uFF1A\u53EA\u6709\u300C\u6539\u6210\u6700\u63A5\u8FD1\u7684\u4E00\u952E\u300D\u80FD\u52A8\n    const ctl = view.controls.find((c) => c.id === id);\n    this.patch(tg, (fx) => ({ ...fx, params: view.write({ ...base, [id]: v }, paramsOf(fx)) }), ctl?.label ?? id, live);\n    if (live && input) { const w = input.closest(\"[data-fxwrap]\"); const out = w?.querySelector<HTMLElement>(`output[data-c=\"${id}\"]`); if (out && ctl?.fmt) out.textContent = ctl.fmt(v); w?.querySelector(\".fx-note\")?.remove(); }\n  }\n  private fullSet(tg: Target, t: HTMLInputElement): void {\n    const s = this.slotOf(tg); if (!s) return;\n    const id = t.dataset.p!, d = fullParams(s.fx.kind).find((x) => x.id === id); if (!d) return;\n    const sl = paramView(s.fx.kind, d), v = sl.toV(Number(t.value));\n    this.patch(tg, (fx) => ({ ...fx, params: { ...paramsOf(fx), [id]: v } }), d.label, true);\n    const out = t.parentElement?.querySelector(\"output\"); if (out) out.textContent = sl.fmt(v);\n  }\n\n  // \u2500\u2500 \u753B \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  /** \u4E00\u683C\u7684\u63A7\u4EF6\uFF08\u4E00\u952E / \u5168\u91CF\uFF09\uFF1A\u300C\u94FE\u300D\u9875\u9876\u4E0A\u7684\u9762\u677F\u548C EQ / \u538B\u7F29\u9875\u5361\u7247\u4E0A\u644A\u5F00\u7684\u5171\u7528\u3002 */\n  private controlsHtml(tg: Target, fx: FxV2, mode: \"simple\" | \"full\"): string {\n    const bus = this.onBus(tg.track), p = paramsOf(fx), view = viewOfFx(fx, bus), read = view?.read(p) ?? null;\n    const keyOpts = fx.kind === \"comp\" ? this.host.keyTracks(tg.track) : [];\n    const keyRow = keyOpts.length ? row(\"\u88AB\u8C01\u538B\", HINT.key, \"\", `<select data-key><option value=\"\">\u4E0D\u7528\uFF08\u81EA\u5DF1\u538B\u81EA\u5DF1\uFF09</option>${keyOpts.map((x) => `<option value=\"${esc(x.id)}\"${fx.key === x.id ? \" selected\" : \"\"}>${esc(x.name)}</option>`).join(\"\")}</select>`) : \"\";\n    if (mode === \"simple\" && view) {\n      // \u5728\u5168\u91CF\u91CC\u8C03\u8FC7\uFF08\u843D\u4E0D\u5230\u4E00\u952E\u516C\u5F0F\u4E0A\uFF09= \u4E00\u952E\u9501\u7740\u3001\u65CB\u94AE\u4E0D\u6446\u51FA\u6765\uFF08user\u300C\u6CA1\u6CD5\u7528\u4E00\u952E\u7684\u65F6\u5019\u90A3\u4E9B\u4E00\u952E\u7684invalid slider\u53EF\u4EE5\u4E0D\u663E\u793A\u54C8\u54C8\u300D\uFF09\uFF0C\u8981\u6539\u5148\u70B9\u300C\u6539\u6210\u6700\u63A5\u8FD1\u7684\u4E00\u952E\u300D\uFF08v0.10.14\uFF1Buser\u300Cbasic\u6A21\u5F0F\u4E0B\u5E94\u8BE5\u6709\u4E00\u4E2Aproject to basic\u6A21\u5F0F\u7684\u529F\u80FD\uFF0C\u4E0D\u7136\u7684\u8BDDbasic\u6A21\u5F0F\u4F1A\u662F\u88AB\u9501\u4F4F\uFF0C\u514D\u5F97\u4E0D\u5C0F\u5FC3override\u300D\uFF09\n      const fp = freshParams(fx.kind, bus), fresh = view.read(fp) ?? view.project(fp), locked = !read, cur = read ?? {};\n      return (locked ? `<div class=\"fx-note\">\u5728\u5168\u91CF\u91CC\u8C03\u8FC7\uFF0C\u4E00\u952E\u8868\u8FBE\u4E0D\u4E86\uFF1A\u4E00\u952E\u5148\u9501\u7740\uFF0C\u514D\u5F97\u4E00\u78B0\u5C31\u76D6\u6389\u3002<button class=\"btn cand\" data-v=\"fxproject\" title=\"\u6309\u6700\u63A5\u8FD1\u7684\u4E00\u952E\u6570\u503C\u6539\u5199\u2014\u2014\u5168\u91CF\u91CC\u591A\u8C03\u7684\u4F1A\u4E22\u6389\uFF08\u6BD4\u5982\u4E2D\u9891\u90A3\u4E00\u5200\uFF09\uFF1B\u80FD\u64A4\u9500\">\u6539\u6210\u6700\u63A5\u8FD1\u7684\u4E00\u952E</button></div>` + keyRow : \"\") + (locked ? \"\" : view.controls.map((c) => {\n        const v = cur[c.id] ?? 0;\n        if (c.id === \"autoLow\" && !this.host.strips().some((x) => x.id === tg.track)) return row(c.label, c.hint, \"\", `<span class=\"fx-dim\">\u6DF7\u97F3\u8F68 / \u603B\u8F68\u4E0A\u6CA1\u6709\u97F3\uFF0C\u7528\u4E0D\u4E0A${v ? \"\uFF08\u5F00\u7740\u4E5F\u4E0D\u5207\uFF09\" : \"\"}</span>`);   // \u81EA\u52A8\u4F4E\u5207\u6309\u8FD9\u4E00\u8F68\u6700\u4F4E\u7684\u97F3\u7B97\uFF1A\u6CA1\u6709\u97F3 = \u4E0D\u8D77\u4F5C\u7528\uFF08v0.10.15\uFF09\n        if (c.kind === \"toggle\") return row(c.label, c.hint, \"\", `<button class=\"btn cand${v ? \" is-on\" : \"\"}\" data-v=\"fxtoggle\" data-c=\"${c.id}\">${v ? \"\u5F00\" : \"\u5173\"}</button>`);\n        if (c.kind === \"choice\") return row(c.label, c.hint, \"\", `<span class=\"fx-seg\">${c.choices!.map((x) => `<button class=\"btn${Math.abs(v - x.v) < 1e-6 ? \" is-on\" : \"\"}\" data-v=\"fxchoice\" data-c=\"${c.id}\" data-val=\"${x.v}\">${esc(x.label)}</button>`).join(\"\")}</span>`);\n        return row(c.label, c.hint, `<output data-c=\"${c.id}\">${c.fmt ? c.fmt(v) : v}</output>`, slider({ min: c.min!, max: c.max!, step: c.step!, value: v, attrs: `data-c=\"${c.id}\"`, def: fresh[c.id], defText: fresh[c.id] == null ? undefined : c.fmt ? c.fmt(fresh[c.id]) : String(fresh[c.id]), }));\n      }).join(\"\") + keyRow);\n    }\n    const fresh = freshParams(fx.kind, bus);\n    return fullParams(fx.kind).map((d) => {\n      const sl = paramView(fx.kind, d);\n      if (d.unit === \"bool\") return row(sl.label, sl.hint, \"\", `<button class=\"btn cand${p[d.id] ? \" is-on\" : \"\"}\" data-v=\"fxbool\" data-p=\"${d.id}\">${p[d.id] ? \"\u5F00\" : \"\u5173\"}</button>`);\n      if (fx.kind === \"eq\" && d.id === \"hpHz\" && p.hpAuto) { const hz = this.host.resolve(tg.track, fx).params.hpHz ?? 0; return row(sl.label, sl.hint, \"\", `<span class=\"fx-dim\">${hz > 0 ? `\u81EA\u52A8\uFF1A${hz} Hz\uFF08\u8FD9\u4F4D\u6700\u4F4E\u7684\u97F3\u5F80\u4E0B\u56DB\u4E2A\u534A\u97F3\uFF09` : \"\u81EA\u52A8\uFF08\u8FD9\u6761\u8F68\u6CA1\u6709\u97F3 = \u4E0D\u5207\uFF09\"}</span>`); }\n      return row(sl.label, sl.hint, `<output>${sl.fmt(p[d.id])}</output>`, slider({ min: sl.min, max: sl.max, step: sl.step, value: sl.toS(p[d.id]), attrs: `data-p=\"${d.id}\"`, def: sl.toS(fresh[d.id]), defText: sl.fmt(fresh[d.id]) }));\n    }).join(\"\") + keyRow;\n  }\n  /** EQ / \u538B\u7F29\u9875\uFF1A\u8FD9\u6761\u8F68\u4E0A\u7B2C\u4E00\u683C\u8FD9\u79CD\u63D2\u4EF6\uFF0C\u644A\u5728\u5361\u7247\u4E0A\uFF08\u6CA1\u6709 = \u300C\uFF0B\u300D\uFF09\u3002 */\n  private inlineHtml(track: string, kind: \"eq\" | \"comp\"): string {\n    const all = this.slots(track).filter((s) => s.fx.kind === kind), s = all[0];\n    if (!s) return `<button class=\"btn cand\" data-v=\"fxaddkind\" data-kind=\"${kind}\" title=\"\u5F80\u8FD9\u6761\u8F68\u4E0A\u63D2\u4E00\u4E2A${pluginName(kind)}\">\uFF0B ${esc(pluginName(kind))}</button>`;\n    const fx = s.fx, tg = { track, fx: fx.id };\n    return `<div class=\"fx-inline${fx.on === false ? \" off\" : \"\"}\" data-fxwrap data-track=\"${esc(track)}\" data-fx=\"${esc(fx.id)}\">` +\n      `<div class=\"fx-inline-head\"><button class=\"btn cand${fx.on === false ? \"\" : \" is-on\"}\" data-v=\"fxon\" title=\"\u5173 = \u8FD9\u4E00\u683C\u8DF3\u8FC7\uFF08\u53C2\u6570\u7559\u7740\uFF09\">${fx.on === false ? \"\u5173\u7740\" : \"\u5F00\u7740\"}</button>${all.length > 1 ? `<span class=\"fx-dim\">\u8FD8\u6709 ${all.length - 1} \u4E2A${esc(pluginName(kind))}\u5728\u300C\u94FE\u300D\u91CC</span>` : \"\"}${this.modeSeg(tg)}${this.clipBtns(tg, fx)}</div>` +\n      (kind === \"comp\" ? row(\"\u538B\u4E86\", HINT.gr, `<output class=\"gr-val\">0 dB</output>`, `<span class=\"gr-bar\"><i></i></span>`, \"strip-row gr-row\") : \"\") +\n      `<div class=\"fx-body\">${this.controlsHtml(tg, fx, this.modeOf(tg))}</div></div>`;\n  }\n  /** \u51FA\u5230 + \u53D1\u9001\uFF08\u6B4C\u624B\u8F68\u548C\u8DEF\u7531\u8F68\u90FD\u6709\uFF1B\u603B\u8F68\u6CA1\u6709\uFF09\u3002 */\n  private routeHtml(track: string): string {\n    const out = this.host.outTo(track), tg = this.host.targets(track), sends = this.host.sends(track), name = (id: string) => esc(this.trackName(id));\n    const outSel = row(\"\u51FA\u5230\", HINT.out, \"\", `<select data-out>${[{ id: \"master\", name: \"\u603B\u8F68\" }, ...tg].map((x) => `<option value=\"${esc(x.id)}\"${out === x.id ? \" selected\" : \"\"}>${esc(x.name)}</option>`).join(\"\")}${out !== \"master\" && !tg.some((x) => x.id === out) ? `<option value=\"${esc(out)}\" selected>${name(out)}\uFF08\u63A5\u4E0D\u4E0A\uFF09</option>` : \"\"}</select>`, \"strip-row\");\n    const rows = sends.map((sd) => `<div class=\"strip-send\">${row(`\u53D1\u7ED9 ${this.trackName(sd.to)}`, HINT.send, `<output>${dbText(sd.gainDb)}</output>`, slider({ min: -40, max: 6, step: 0.5, value: sd.gainDb, attrs: `data-send=\"${esc(sd.to)}\"`, def: -12, defText: \"\u221212 dB\" }), \"strip-row\")}<button class=\"btn\" data-v=\"sendx\" data-to=\"${esc(sd.to)}\" title=\"\u4E0D\u518D\u53D1\u7ED9\u5B83\">\u2715</button></div>`).join(\"\");\n    const free = tg.filter((x) => !sends.some((sd) => sd.to === x.id));\n    const add = free.length ? `<select class=\"send-add\" data-sendadd title=\"\u63A8\u5B50\u4E4B\u540E\u53D1\u4E00\u4EFD\u5230\u4E00\u6761\u6DF7\u97F3\u8F68\uFF08\u6DF7\u54CD / \u5EF6\u8FDF\u8FD9\u7C7B\u653E\u5728\u6DF7\u97F3\u8F68\u4E0A\uFF0C\u51E0\u6761\u8F68\u5171\u7528\uFF09\"><option value=\"\">\uFF0B \u53D1\u9001\u5230\u2026</option>${free.map((x) => `<option value=\"${esc(x.id)}\">${esc(x.name)}</option>`).join(\"\")}</select>` : (tg.length ? \"\" : `<div class=\"fx-dim\">\u8FD8\u6CA1\u6709\u6DF7\u97F3\u8F68\uFF08\u300C\u22EF\u300D\u91CC\u52A0\uFF09</div>`);\n    // \u51FA\u5230\u4E00\u6761\u5E26\u5168\u6E7F\u6548\u679C\u7684\u6DF7\u97F3\u8F68 = \u539F\u58F0\u6CA1\u4E86\uFF1A\u660E\u8BF4\uFF08v0.10.10\uFF1Buser\u300C\u5F00\u4E86\u6DF7\u54CD\u7ED3\u679C\u94C3\u58F0\u90FD\u54D1\u6389\u4E86\u300D\uFF09\n    const wet = out !== \"master\" ? this.host.chain(out).find(fullyWet) : undefined;\n    const warn = wet ? `<div class=\"fx-note\">\u300C${name(out)}\u300D\u4E0A\u7684${esc(pluginName(wet.kind))}\u662F\u5168\u6E7F\u7684\uFF1A\u51FA\u5230\u5B83 = \u539F\u58F0\u6CA1\u4E86\uFF0C\u53EA\u5269${esc(pluginName(wet.kind))}\u3002\u8981\u539F\u58F0\u52A0${esc(pluginName(wet.kind))}\uFF1A\u51FA\u5230\u603B\u8F68\uFF0C\u7528\u4E0B\u9762\u7684\u300C\u53D1\u9001\u300D\u3002</div>` : \"\";\n    // \u51FA\u5230\u4E00\u6761\u5E26\u6DF7\u54CD / \u5EF6\u8FDF / \u5408\u5531\uFF08\u63D2\u5728\u4E0A\u9762\u3001\u4E0D\u662F\u5168\u6E7F\uFF09\u7684\u6DF7\u97F3\u8F68\uFF1A\u51E0\u6761\u8F68\u6548\u679C\u4E00\u6837\u591A\u3001\u539F\u58F0\u88AB\u5B83\u5173\u5C0F\uFF08v0.10.15\uFF1B\u67E5 user \u7684 \u56E3\u5B50\u5927\u5BB6\u65CF \u65F6\u53D1\u73B0\uFF1A\u4E94\u6761\u8F68\u51FA\u5230\u300C\u7A7A\u95F4\u611F\u300D\uFF0C\u6DF7\u54CD\u539F\u58F0 0.67 = \u6084\u6084 \u22123.5 dB\uFF09\n    const shared = !wet && out !== \"master\" ? this.host.chain(out).find((f) => (f.kind === \"reverb\" || f.kind === \"delay\" || f.kind === \"chorus\") && f.on !== false) : undefined;\n    const sharedDry = shared ? paramsOf(shared).dry : 1, dryDb = 20 * Math.log10(Math.max(1e-6, sharedDry));\n    const note = shared ? `<div class=\"fx-note\">\u51FA\u5230\u300C${name(out)}\u300D= \u6574\u6761\u58F0\u97F3\u90FD\u8FC7\u5B83\u7684${esc(pluginName(shared.kind))}\uFF1A\u51FA\u5230\u5B83\u7684\u51E0\u6761\u8F68${esc(pluginName(shared.kind))}\u4E00\u6837\u591A${sharedDry < 0.999 ? `\uFF0C\u539F\u58F0\u4E5F\u88AB\u5B83\u5173\u5C0F ${dbText(dryDb)}\uFF08\u63A8\u5B50\u4E0A\u770B\u4E0D\u51FA\u6765\uFF09` : \"\"}\u3002\u60F3\u6BCF\u6761\u8F68\u5404\u81EA\u591A\u5C11\uFF1A\u51FA\u5230\u603B\u8F68\u3001\u7528\u4E0B\u9762\u7684\u300C\u53D1\u9001\u300D\uFF0C\u90A3\u6761\u6DF7\u97F3\u8F68\u4E0A\u7684${esc(pluginName(shared.kind))}\u6539\u6210\u5168\u6E7F\u3002</div>` : \"\";\n    return outSel + warn + note + rows + add;\n  }\n  private chipsHtml(track: string): string {\n    const chips = this.slots(track).map(({ fx }) => `<button class=\"btn fx-chip${this.open?.track === track && this.open.fx === fx.id ? \" is-on\" : \"\"}${fx.on === false ? \" off\" : \"\"}\" data-v=\"fx\" data-fx=\"${esc(fx.id)}\" title=\"${esc(pluginName(fx.kind))}\uFF1A\u70B9\u5F00\u8C03${fx.id === DEFAULT_EQ_ID ? \"\uFF08\u9ED8\u8BA4\u90A3\u4E00\u683C\uFF1A\u80FD\u5173\u3001\u80FD\u6362\u9762\u677F\uFF0C\u4E0D\u80FD\u5220\uFF09\" : \"\"}\">${esc(fxSummary(fx, this.onBus(track)))}</button>`).join(\"\");\n    const clip = this.fxClip ? `<button class=\"btn cand fx-paste-new\" data-v=\"fxpastenew\" title=\"\u94FE\u5C3E\u52A0\u4E00\u683C\uFF1A\u62F7\u7684\u90A3\u4E00\u683C\uFF08\u6765\u81EA\u300C${esc(this.fxClip.from)}\u300D\uFF09\u7684\u79CD\u7C7B\u548C\u53C2\u6570\">\u7C98\u6210\u65B0\u7684\u4E00\u683C\uFF1A${esc(pluginName(this.fxClip.kind))}</button>` : \"\";\n    const menu = this.addFor === track ? `<div class=\"fx-add-menu\">${clip}${PLUGIN_KINDS.map((k) => `<button class=\"btn cand\" data-v=\"fxpick\" data-kind=\"${k}\">${esc(pluginName(k))}</button>`).join(\"\")}</div>` : \"\";\n    return `<div class=\"strip-fx\">${chips}<button class=\"btn fx-add${this.addFor === track ? \" is-on\" : \"\"}\" data-v=\"fxadd\" title=\"\u63D2\u4E00\u4E2A\u63D2\u4EF6\uFF08\u4EFB\u4F55\u63D2\u4EF6\u90FD\u80FD\u63D2\u5728\u4EFB\u4F55\u8F68\u4E0A\uFF09\">\uFF0B</button>${menu}</div>`;\n  }\n  private renderPanel(): void {\n    const box = this.el.querySelector<HTMLElement>(\".fx-panel\")!, o = this.tab === \"chain\" ? this.open : null, s = o ? this.slotOf(o) : null;\n    if (!o || !s) { box.hidden = true; box.innerHTML = \"\"; delete box.dataset.track; delete box.dataset.fx; return; }\n    const fx = s.fx, isDefault = fx.id === DEFAULT_EQ_ID;\n    box.dataset.track = o.track; box.dataset.fx = o.fx;\n    const head = `<div class=\"fx-head\"><span class=\"fx-title\">${esc(this.trackName(o.track))} \u00B7 ${esc(pluginName(fx.kind))}${s.virtual ? \"\uFF08\u5E73\uFF09\" : \"\"}</span>` +\n      this.modeSeg(o) +\n      `<button class=\"btn cand${fx.on === false ? \"\" : \" is-on\"}\" data-v=\"fxon\" title=\"\u5173 = \u8FD9\u4E00\u683C\u8DF3\u8FC7\uFF08\u53C2\u6570\u7559\u7740\uFF09\">${fx.on === false ? \"\u5173\u7740\" : \"\u5F00\u7740\"}</button>` +\n      this.clipBtns(o, fx) +\n      (isDefault ? \"\" : `<button class=\"btn cand danger\" data-v=\"fxdel\" title=\"\u4ECE\u8FD9\u6761\u8F68\u4E0A\u62FF\u6389\uFF08\u80FD\u64A4\u9500\uFF09\">\u62FF\u6389</button>`) +\n      `<button class=\"btn\" data-v=\"fxclose\" title=\"\u6536\u8D77\">\u2715</button></div>`;\n    box.innerHTML = head + `<div class=\"fx-body\">${this.controlsHtml(o, fx, this.modeOf(o))}</div>`; box.hidden = false;\n  }\n  private renderBar(): void {\n    const bar = this.el.querySelector<HTMLElement>(\".mix-tabbar\")!;\n    bar.innerHTML = `<span class=\"fx-seg mix-tabs\" role=\"tablist\">${TABS.map((x) => `<button class=\"btn${this.tab === x.id ? \" is-on\" : \"\"}\" data-v=\"tab\" data-tab=\"${x.id}\" role=\"tab\" title=\"${esc(x.hint)}\">${esc(x.label)}</button>`).join(\"\")}</span>` +\n      `<button class=\"btn mix-more${this.menuOpen ? \" is-on\" : \"\"}\" data-v=\"more\" title=\"\u66F4\u591A\uFF1A\u52A0\u6DF7\u97F3\u8F68\u2026\">\u22EF</button>`;\n    const menu = this.el.querySelector<HTMLElement>(\".mix-menu\")!;\n    menu.hidden = !this.menuOpen;\n    menu.innerHTML = this.menuOpen ? `<button class=\"btn cand\" data-v=\"addbus\" title=\"\u52A0\u4E00\u6761\u6DF7\u97F3\u8F68\uFF08\u8DEF\u7531\u8F68\uFF09\uFF1A\u51E0\u6761\u8F68\u53D1\u8FC7\u6765\u4E00\u8D77\u8FC7\u6548\u679C\uFF0C\u6BD4\u5982\u5171\u7528\u4E00\u4E2A\u6DF7\u54CD\">\uFF0B \u6DF7\u97F3\u8F68</button>` : \"\";\n  }\n  /** \u4E00\u5F20\u5361\u7247\uFF1A\u9876\u4E0A\u4E00\u6761\u5CF0\u503C\u7EC6\u7EBF + \u540D\u5B57 + \u8FD9\u4E00\u9875\u7684\u5185\u5BB9\u3002 */\n  private card(id: string, cls: string, name: string, who: string, body: string, color?: string): string {\n    const spec = this.tab === \"eq\" ? this.specSvg(id) : this.tab === \"basic\" ? GONIO_SVG : this.tab === \"comp\" ? this.compSvg(id) : \"\";   // EQ \u9875\uFF1A\u5361\u7247\u80CC\u666F = \u9891\u8C31 + \u8FD9\u4E00\u683C EQ \u7684\u66F2\u7EBF\uFF1B\u57FA\u7840\u9875 = \u6BCF\u5F20\u5361\u90FD\u6709\u674E\u8428\u5982\u56FE\uFF08\u5355\u58F0\u9053\u8F68 = \u58F0\u50CF\u89D2\u5EA6\u7684\u4E00\u6839\u7EBF\uFF09\n    // \u5361\u7247\u4E00\u6837\u9AD8\uFF08= \u57FA\u7840\u9875\u7684\u90A3\u4E48\u9AD8\uFF1Bv0.10.21\uFF0Cuser\u300C\u6DF7\u97F3\u53F0\u80FD\u89E3\u51B3\u5361\u7247\u592A\u957F\u7684\u95EE\u9898\u5417\uFF1F\u4E0D\u65B9\u4FBF\u7EB5\u89C8\u3002\u80FD\u4E0D\u80FD\u7EA6\u5B9A\u4E00\u4E2A\u5361\u7247\u7684fixed\u7684\u5927\u5C0F\uFF0C\u7136\u540E\u91CC\u9762\u81EA\u5DF1\u60F3\u529E\u6CD5\u300D\u300C\u6211\u6BD4\u8F83\u559C\u6B22\u57FA\u7840\u6A21\u5F0F\u7684\u5361\u7247\u5927\u5C0F\u300D\uFF09\uFF1A\u540D\u5B57\u9489\u5728\u4E0A\u9762\uFF0C\u4E0B\u9762\u7684\u653E\u4E0D\u4E0B = \u5361\u7247\u91CC\u81EA\u5DF1\u6EDA\n    return `<div class=\"strip${cls}\" data-id=\"${esc(id)}\"${color ? ` data-color style=\"--cat:${esc(color)}\"` : \"\"}>${spec}<div class=\"strip-meter\"><i></i><b></b></div>${name}${who ? `<div class=\"strip-who\">${esc(who)}</div>` : \"\"}<div class=\"strip-body\">${body}</div></div>`;\n  }\n  /** \u8D34\u5E95\uFF08\u6DF7\u97F3\u53F0\u5728\u5E95\u4E0B\uFF0C\u9ED8\u8BA4\uFF09\uFF1A\u9AD8\u5EA6 = \u9876\u4E0A\u4E24\u6761 + \u6B63\u597D N \u6392\u5361\u7247\uFF08N = \u534A\u5C4F\u653E\u5F97\u4E0B\u7684\u6700\u591A\u6392\uFF0C\u81F3\u5C11\u4E00\u6392\uFF1B\u5361\u7247\u4E0D\u591A = \u6709\u51E0\u6392\u5C31\u51E0\u6392\uFF09\uFF0C\u4E0D\u518D\u5207\u5728\u7B2C\u4E8C\u6392\u4E2D\u95F4\u3002\n   *  v0.10.38\uFF1Buser\u300C\u6DF7\u97F3\u53F0\u7684\u9AD8\u5EA6\u662F\u600E\u4E48\u51B3\u5B9A\u7684\uFF0C\u73B0\u5728\u600E\u4E48\u4E0D\u4E09\u4E0D\u56DB\u7684\u300D\u2192\u300C\u6309\u6574\u6392\u5361\u7247\u5BF9\u9F50\uFF0C\u6700\u9AD8\u534A\u5C4F\uFF1BiPad mini \u4E0A\u5C31\u662F\u4E00\u6392\u300D\u300C\u597D\u300D\u3002\u6A2A\u5C4F / \u5168\u5C4F = \u4E0D\u7BA1\uFF08CSS\uFF09\u3002 */\n  private fitHeight(): void {\n    const el = this.el; el.style.maxHeight = \"\";\n    if (this.full || el.hidden || sideDocked(el.closest(\"#stage\") as HTMLElement | null)) return;   // \u8D34\u5E95\uFF08\u9ED8\u8BA4\uFF09\u624D\u6309\u6574\u6392\u7B97\uFF1B\u8D34\u53F3\u8FB9\u90A3\u4E00\u6863 = CSS \u7BA1\n    const box = el.querySelector<HTMLElement>(\".studio-strips\"), card = box?.querySelector<HTMLElement>(\".strip\"); if (!box || !card) return;\n    const cs = getComputedStyle(box), gap = parseFloat(cs.rowGap) || 0, pad = (parseFloat(cs.paddingTop) || 0) + (parseFloat(cs.paddingBottom) || 0);\n    const head = [...el.children].filter((c) => c !== box && !(c as HTMLElement).hidden).reduce((n, c) => n + (c as HTMLElement).getBoundingClientRect().height, 0);\n    const H = card.getBoundingClientRect().height, cols = cs.gridTemplateColumns.split(\" \").filter(Boolean).length || 1, rows = Math.ceil(box.querySelectorAll(\".strip\").length / cols);\n    const fit = Math.max(1, Math.floor((innerHeight * 0.5 - head - pad + gap) / (H + gap))), n = Math.min(rows, fit);\n    el.style.maxHeight = `${Math.ceil(head + pad + n * H + (n - 1) * gap + 2)}px`;\n  }\n  /** \u5E95\u5EA7\u8D34\u5E95 \u2194 \u8D34\u53F3\u8FB9\u7FFB\u4E86\uFF08main.ts syncDock\uFF09\uFF1A\u91CD\u65B0\u6309\u6574\u6392\u5BF9\u9F50 / \u653E\u5F00\u3002 */\n  relayout(): void { this.fitHeight(); }\n  render(): void {\n    const box = this.el.querySelector(\".studio-strips\")!, m = this.host.master(), tab = this.tab, off = this.host.bypass();\n    const ab = this.el.querySelector<HTMLElement>(\".mix-ab\")!;   // A/B\uFF1A\u6548\u679C\u5F00\u7740 / \u5168\u5173\uFF08user\u300C\u6DF7\u97F3\u53F0\u52A0\u4E00\u4E2A\u6682\u65F6\u7981\u7528\u6240\u6709\u9B54\u6CD5\u7684toggle\u300D\uFF09\n    ab.textContent = off ? \"\u6548\u679C\u5168\u5173\" : \"\u6548\u679C\u5F00\u7740\"; ab.classList.toggle(\"is-on\", !off); ab.classList.toggle(\"ab-off\", off);\n    ab.title = off ? \"\u73B0\u5728\uFF1A\u63D2\u4EF6\u548C\u53D1\u9001\u90FD\u4E0D\u54CD\uFF08\u63A8\u5B50 / \u58F0\u50CF\u7559\u7740\uFF09\u3002\u70B9 = \u6548\u679C\u56DE\u6765\" : \"\u70B9 = \u6682\u65F6\u5173\u6389\u5168\u90E8\u6548\u679C\uFF08\u63D2\u4EF6 + \u53D1\u9001\uFF09\uFF0C\u542C\u8C31\u5B50\u672C\u8EAB / \u542C\u5DEE\u522B\uFF1B\u63A8\u5B50\u3001\u58F0\u50CF\u7559\u7740\";\n    this.el.querySelector<HTMLElement>(\".mix-ab-note\")!.hidden = !off; this.el.classList.toggle(\"bypassed\", off);\n    const fb = this.el.querySelector<HTMLElement>(\".mix-full\")!; fb.textContent = this.full ? \"\u8FD8\u539F\" : \"\u5168\u5C4F\"; fb.classList.toggle(\"is-on\", this.full);\n    if (this.open && !this.slotOf(this.open)) this.open = null;   // \u64A4\u9500\u628A\u8FD9\u4E00\u683C\u64A4\u6CA1\u4E86\n    this.renderBar();\n    const nameDiv = (s: string) => `<div class=\"strip-name\">${esc(s)}</div>`;\n    // \u603B\u8F68\n    const masterBody = tab === \"basic\" ? row(\"\u589E\u76CA\", HINT.masterGain, `<output>${dbText(m.gainDb)}</output>`, slider({ min: -24, max: 12, step: 0.5, value: m.gainDb, attrs: \"data-master\", def: 0, defText: \"0 dB\" }), \"strip-row\") +\n        row(\"\u9650\u5E45\", HINT.limiter, \"\", `<button class=\"btn cand${m.limiter ? \" is-on\" : \"\"}\" data-v=\"limiter\">${m.limiter ? \"\u5F00\u7740\" : \"\u5173\u7740\uFF08\u53EF\u80FD\u524A\u6CE2\uFF09\"}</button>`, \"strip-row\") +\n        row(\"\u5CF0\u503C\", HINT.peak, `<span class=\"meter-val\">\u2014</span>`, \"\", \"strip-row\") + RMS_ROW + CORR_ROW\n      : tab === \"eq\" || tab === \"comp\" ? this.inlineHtml(MASTER, tab) : tab === \"send\" ? `<div class=\"fx-dim\">\u603B\u8F68\u5C31\u662F\u8F93\u51FA\uFF0C\u4E0D\u518D\u53D1\u7ED9\u522B\u5904</div>` : this.chipsHtml(MASTER);\n    const master = this.card(MASTER, \" master\", nameDiv(\"\u603B\u8F68\"), \"\u6240\u6709\u58F0\u90E8\u6DF7\u5728\u4E00\u8D77\u4E4B\u540E\", masterBody);\n    // \u6DF7\u97F3\u8F68\uFF08\u81EA\u5DF1\u52A0\u7684\u8DEF\u7531\u8F68\uFF0C\u666E\u901A\u7684\u8F68\uFF09\uFF1A\u6392\u5728\u603B\u8F68\u540E\u9762\u3001\u6B4C\u624B\u524D\u9762\uFF08user\u300C\u4F60\u81EA\u5DF1\u52A0\u7684\u4E2D\u95F4\u7684\u8DEF\u7531\u8F68\u4E5F\u662F\u666E\u901A\u7684\u8F68\u9053\uFF0C\u6392\u5728\u603B\u8F68\u540E\u9762\uFF0C\u6B4C\u624B\u524D\u9762\u300D\uFF09\n    const buses = this.host.buses(), busCards = buses.map((b, k) => {\n      const body = tab === \"basic\" ? row(\"\u589E\u76CA\", HINT.busGain, `<output>${dbText(b.gainDb)}</output>`, slider({ min: -24, max: 12, step: 0.5, value: b.gainDb, attrs: \"data-busgain\", def: 0, defText: \"0 dB\" }), \"strip-row\") +\n          row(\"\u58F0\u50CF\", HINT.pan, `<output>${panText(b.pan)}</output>`, slider({ min: -1, max: 1, step: 0.05, value: b.pan, attrs: \"data-buspan\", def: 0, defText: \"\u4E2D\" }), \"strip-row\") + RMS_ROW + CORR_ROW +\n          `<div class=\"strip-btns\"><button class=\"btn cand${b.bypass ? \" is-on\" : \"\"}\" data-v=\"busbypass\" title=\"\u65C1\u901A\uFF1A\u8FD9\u6761\u6DF7\u97F3\u8F68\u4E0A\u7684\u63D2\u4EF6\u5168\u8DF3\u8FC7\uFF08\u63A8\u5B50 / \u58F0\u50CF / \u51FA\u5230 / \u53D1\u9001\u7167\u65E7\uFF09\uFF1B\u518D\u70B9 = \u56DE\u6765\">${b.bypass ? \"\u65C1\u901A\u4E2D\" : \"\u65C1\u901A\"}</button><button class=\"btn\" data-v=\"busleft\" title=\"\u5F80\u524D\u632A\u4E00\u4F4D\"${k === 0 ? \" disabled\" : \"\"}>\u2039</button><button class=\"btn\" data-v=\"busright\" title=\"\u5F80\u540E\u632A\u4E00\u4F4D\"${k === buses.length - 1 ? \" disabled\" : \"\"}>\u203A</button><button class=\"btn cand danger\" data-v=\"delbus\" title=\"\u5220\u6389\u8FD9\u6761\u6DF7\u97F3\u8F68\uFF08\u53D1\u7ED9\u5B83\u7684\u3001\u51FA\u5230\u5B83\u7684\u90FD\u6539\u56DE\u603B\u8F68\uFF1B\u80FD\u64A4\u9500\uFF09\">\u5220\u6389</button></div>`\n        : tab === \"eq\" || tab === \"comp\" ? this.inlineHtml(b.id, tab) : tab === \"send\" ? this.routeHtml(b.id) : this.chipsHtml(b.id);\n      const name = tab === \"basic\" ? `<input class=\"bus-name\" value=\"${esc(b.name)}\" title=\"\u540D\u5B57\uFF08\u70B9\u4E86\u6539\uFF09\" />` : nameDiv(b.name);\n      // \u6DF7\u97F3\u8F68\u4E5F\u80FD\u9759\u97F3\uFF08\u4E0D\u80FD\u72EC\u594F\uFF1A\u72EC\u594F\u662F\u6311\u6B4C\u624B\u542C\uFF1Buser\u300C\u54E6\uFF0C\u6DF7\u97F3\u8F68\u4E5F\u8981mute\uFF0C\uFF08\u4E0D\u8FC7\u53EF\u80FD\u4E0D\u80FDsolo\u4E86\u300D\uFF09\u2014\u2014\u9489\u5728\u540D\u5B57\u53F3\u8FB9\uFF0C\u540C\u6B4C\u624B\u5361\n      const ms = `<span class=\"strip-ms\"><button class=\"btn${b.muted ? \" is-on mute\" : \"\"}\" data-v=\"busmute\" title=\"\u9759\u97F3\uFF1A\u8FD9\u6761\u6DF7\u97F3\u8F68\u4E0D\u51FA\u58F0\u3001\u4E5F\u4E0D\u5F80\u4E0B\u53D1\uFF08\u53D1\u7ED9\u5B83\u7684\u90A3\u51E0\u4F4D\u539F\u58F0\u7167\u65E7\uFF09\">\u9759</button></span>`;\n      return this.card(b.id, ` bus${b.bypass ? \" bypassed\" : \"\"}`, `<div class=\"strip-head\">${name}${ms}</div>`, b.bypass ? \"\u6DF7\u97F3\u8F68 \u00B7 \u65C1\u901A\u4E2D\uFF08\u63D2\u4EF6\u5168\u8DF3\u8FC7\uFF09\" : \"\u6DF7\u97F3\u8F68\", body);\n    }).join(\"\");\n    // \u6B4C\u624B\uFF1A\u987A\u5E8F\u8DDF\u8C31\u4E0A\u7684\u58F0\u90E8\uFF08user\u300C\u6B4C\u624B\u5361\u7247\u7684\u6392\u5E8F\u8FD8\u662F\u4EE5\u4E94\u7EBF\u8C31\u4E3A\u51C6\u300D\uFF09\n    const strips = this.host.strips(), singers = strips.map((s, k) => {\n      const body = tab === \"basic\" ? row(\"\u589E\u76CA\", HINT.gain, `<output>${dbText(s.gainDb)}</output>`, slider({ min: -24, max: 12, step: 0.5, value: s.gainDb, attrs: \"data-gain\", def: 0, defText: \"0 dB\" }), \"strip-row\") +\n          row(\"\u58F0\u50CF\", HINT.pan, `<output>${panText(s.pan)}</output>`, slider({ min: -1, max: 1, step: 0.05, value: s.pan, attrs: \"data-pan\", def: 0, defText: \"\u4E2D\" }), \"strip-row\") + RMS_ROW +\n          `<div class=\"strip-btns\">` +\n            `<button class=\"btn\" data-v=\"partleft\" title=\"\u5F80\u524D\u632A\u4E00\u4F4D\uFF08\u8C31\u4E0A\u8FD9\u4E2A\u58F0\u90E8\u4E5F\u5F80\u4E0A\u632A\uFF09\"${k === 0 ? \" disabled\" : \"\"}>\u2039</button><button class=\"btn\" data-v=\"partright\" title=\"\u5F80\u540E\u632A\u4E00\u4F4D\uFF08\u8C31\u4E0A\u8FD9\u4E2A\u58F0\u90E8\u4E5F\u5F80\u4E0B\u632A\uFF09\"${k === strips.length - 1 ? \" disabled\" : \"\"}>\u203A</button></div>` +\n          // \u6B4C\u624B\u7BA1\u7406\uFF082026-10-08 \u6DF1\u591C\uFF0Cuser\u300C\u53EA\u6709\u6CA1\u5F15\u7528\u7684\u65F6\u5019\u624D\u53EF\u4EE5\u5728\u6B4C\u624B\u7BA1\u7406\u91CC\u9762\u5220\u300D\uFF09\uFF1A\u5728\u51E0\u5F20\u7EB8\u4E0A\uFF1B\u4E00\u5F20\u90FD\u4E0D\u5728 = \u80FD\u5220\n          (s.refs ? `<div class=\"strip-refs\">\u5728 ${s.refs} \u5F20\u7EB8\u4E0A</div>` : `<div class=\"strip-refs\">\u54EA\u5F20\u7EB8\u4E0A\u90FD\u6CA1\u6709 <button class=\"btn cand danger\" data-v=\"delpart\" title=\"\u5220\u6389\u8FD9\u4F4D\u6B4C\u624B\uFF08\u4F11\u606F\u5BA4\u91CC\u5B83\u7684\u914D\u7F6E\u4E00\u8D77\u5220\uFF1B\u80FD\u64A4\u9500\uFF09\">\u5220\u6389\u8FD9\u4F4D\u6B4C\u624B</button></div>`)\n        : tab === \"eq\" || tab === \"comp\" ? this.inlineHtml(s.id, tab) : tab === \"send\" ? this.routeHtml(s.id) : this.chipsHtml(s.id);\n      // \u9759\u97F3 / \u72EC\u594F \u9489\u5728\u540D\u5B57\u53F3\u8FB9\u3001\u6BCF\u4E00\u9875\u90FD\u5728\uFF08v0.10.34\uFF1B\u539F\u6765\u5728\u57FA\u7840\u9875\u5361\u7247\u6700\u5E95\u4E0B\uFF0C\u5361\u7247\u5B9A\u9AD8 = \u8981\u5728\u5361\u7247\u91CC\u6EDA\u624D\u770B\u5F97\u5230\uFF1Buser\u300C\u6DF7\u97F3\u53F0\u57FA\u7840\u91CC\u9762\u5E94\u8BE5\u6709mute\u548Csolo\uFF0C\u548C\u6211\u4EEC\u5DF2\u7ECF\u6709\u7684mute\u548Csolo\u7ED1\u5B9A\u300D\uFF09\u2014\u2014\n      //   \u548C\u8C31\u4E0A\u6B4C\u624B\u540D\u4E0B\u9762\u7684\u300C\u9759 / \u72EC\u300D\u3001\u6B4C\u624B\u724C\u91CC\u7684\u662F\u540C\u4E00\u4E2A\u5F00\u5173\uFF08host.toggleMute / toggleSolo \u2192 \u89C6\u56FE\u6001\uFF09\n      const ms = `<span class=\"strip-ms\"><button class=\"btn${s.muted ? \" is-on mute\" : \"\"}\" data-v=\"mute\" title=\"\u9759\u97F3\uFF08\u8FD9\u4F4D\u4E0D\u51FA\u58F0\uFF1B\u548C\u8C31\u4E0A\u6B4C\u624B\u540D\u4E0B\u9762\u7684\u300C\u9759\u300D\u662F\u540C\u4E00\u4E2A\uFF09\">\u9759</button><button class=\"btn${s.solo ? \" is-on solo\" : \"\"}\" data-v=\"solo\" title=\"\u72EC\u594F\uFF08\u53EA\u542C\u72EC\u594F\u7684\u51E0\u4F4D\uFF1B\u548C\u8C31\u4E0A\u7684\u300C\u72EC\u300D\u662F\u540C\u4E00\u4E2A\uFF09\">\u72EC</button></span>`;\n      return this.card(s.id, \"\", `<div class=\"strip-head\">${nameDiv(s.name)}${ms}</div>`, s.performer, body, s.color);\n    }).join(\"\");\n    box.innerHTML = master + busCards + singers;\n    this.watchCards();   // \u5361\u7247\u91CD\u753B\u4E86\uFF1A\u91CD\u65B0\u770B\u54EA\u4E9B\u5728\u5C4F\u5E55\u91CC\n    this.renderPanel();\n    this.fitHeight();\n  }\n}\n// \u53C2\u6570\u7684\u7C7B\u578B\uFF08\u7ED9\u5BBF\u4E3B\u7528\uFF09\nexport type { Params };\n", "// version.ts \u2014\u2014 \u6E32\u67D3\u6838\u5FC3\u81EA\u5DF1\u7684\u7248\u672C\u53F7 + \u4EE3\u7801\u54C8\u5E0C\uFF08\u548C UI \u58F3\u7684 APP_VERSION \u5206\u5F00\uFF09\u3002created 2026-10-16 by Claude Fable 5.1\uFF08W-38\uFF09\n//   user 2026-10-13\uFF1A\u300C\u6838\u5FC3\u7684\u7248\u672C\u53F7\u548Chash\u53CD\u800C\u662F\u6BCF\u6B21\u4FDD\u5B58\u7684\u65F6\u5019\u90FD\u8981\u8BB0\u7684\u3002ui\u58F3\u65E0\u6240\u8C13\u300D\u300C\u5BF9\u4EE5\u540E\u6838\u5FC3\u6709\u81EA\u5DF1\u7684\u7248\u672C\u53F7\u548Chash\u300D\u300C\u8FD8\u53EF\u4EE5\u9501\u5F15\u64CE\u7684\u7248\u672C\u300D\u3002\n//   \u00B7 CORE_VERSION\uFF1A\u4EBA\u5B9A\u3002**\u51FA\u58F0\u53EF\u80FD\u53D8**\uFF08\u5531\u6CD5\u6838\u5FC3 / \u5F55\u97F3\u623F\u6570\u5B66 / \u6548\u679C\u5668 / \u97F3\u7B26\u8868\u6362\u7B97 / \u65F6\u95F4\u7EBF / \u6F14\u594F\u8005\u63D2\u4EF6 / \u5143\u97F3\u8868\uFF09\u5C31 bump patch\uFF1B\n//     \u53EA\u662F\u642C\u5BB6 / \u6539\u6CE8\u91CA\u4E0D bump\uFF08\u54C8\u5E0C\u4F1A\u53D8\u3001\u7248\u672C\u4E0D\u53D8 = \u300C\u4EE3\u7801\u52A8\u4E86\u4F46\u58F0\u97F3\u5E94\u8BE5\u6CA1\u53D8\u300D\uFF0C\u8BFB\u7684\u4EBA\u80FD\u5206\u8FA8\uFF09\u3002\n//   \u00B7 CORE_HASH\uFF1A\u6784\u5EFA\u65F6 scripts/core-hash.mjs \u6309\u6838\u5FC3\u6E90\u7801\u7B97\uFF08scripts/build.sh --define \u8FDB\u6765\uFF1Bnode \u76F4\u8DD1\u6E90\u7801\u65F6 = \"dev\"\uFF0CCLI \u81EA\u5DF1\u73B0\u7B97\uFF09\u3002\n//   \u8BB0\u8FDB\u6BCF\u9996\u6B4C\u7684 manifest.core\uFF08\u6BCF\u6B21\u4FDD\u5B58\uFF09\u548C\u5B9A\u7A3F\u8BB0\u5F55 final.core\uFF08\u5B9A\u7A3F\u90A3\u4E00\u523B\uFF09\uFF1A\u4EE5\u540E\u60F3\u590D\u73B0\u4E00\u4EFD mp3\uFF0C\u5C31\u62FF\u8FD9\u4E00\u7248\u6838\u5FC3\u3002\nexport const CORE_VERSION = \"0.1.0\";\nexport const CORE_HASH: string = typeof __CORE_HASH__ === \"string\" ? __CORE_HASH__ : \"dev\";\nexport const coreInfo = (): { version: string; hash: string } => ({ version: CORE_VERSION, hash: CORE_HASH });\n", "// doc-file.ts \u2014\u2014 \u65E0\u5730\u9003\u751F\u53E3\u7684\u6587\u4EF6\u90A3\u4E00\u5C42\uFF1A\u9009\u6587\u4EF6\u6253\u5F00\u3001\u5B58\u56DE\u539F\u6587\u4EF6\u3001\u5B58\u4E00\u4EFD\u526F\u672C\u3001\u62D6\u8FDB\u6765\u3001\u53CC\u51FB\u6253\u5F00\u3002created 2026-10-07 by Claude Opus 5.5\n// user 2026-10-07\u300C\u5148\u4E0D\u6025\u7740store\u3002\u53EF\u4EE5\u5148\u6309\u7167\u65E0\u5730\u89C4\u8303\u5BFC\u5165\u5BFC\u51FA\u505A\u9003\u751F\u53E3\u300D\u3002\u7167 WeebPaint \u65E0\u5730\uFF08src/local-file-session.ts\uFF09\uFF1A\n//   \u684C\u9762 Chromium \u6709 File System Access\uFF08showOpenFilePicker / showSaveFilePicker\uFF09\u2192 \u62FF\u5230\u6587\u4EF6\u53E5\u67C4\uFF0CCtrl+S \u5B58\u56DE\u539F\u6587\u4EF6\uFF1B\n//   iPad / Safari \u6CA1\u6709 \u2192 \u6253\u5F00 = \u9009\u6587\u4EF6\uFF08<input type=file>\uFF09\uFF0C\u5B58 = \u4EA4\u7ED9\u5BBF\u4E3B\u505A\u4E0B\u8F7D / \u5206\u4EAB\uFF08\u8FD9\u91CC\u8FD4\u56DE null\uFF0C\u5BBF\u4E3B\u81EA\u5DF1\u5F39\u9762\u677F\uFF09\u3002\n//   \u53EA\u5728\u7528\u6237\u624B\u52BF\u91CC\u8C03\u7528\uFF08\u9009\u6587\u4EF6\u7684\u7CFB\u7EDF\u9762\u677F\u8981\u624B\u52BF\uFF09\u3002\u4E0D\u78B0 store\u3001\u4E0D\u78B0 IndexedDB / localStorage\uFF08\u65E0\u5730 = \u96F6\u6301\u4E45\u5316\uFF0C\u5BB6\u65CF\u300C\u65E0\u5E93\u4E0D\u957F gallery\u300D\uFF09\u3002\n// v0.3.0\uFF082026-10-07\uFF0Cedited by Claude Fable 5.1\uFF1Buser\u300C\u628A\u65E0\u5730\u505A\u5B8C\u7F8E\u300D\uFF09\uFF1A\n//   \u00B7 \u5199\u56DE\u524D\u9648\u65E7\u5BF9\u8868\uFF08WeebPaint 0819 spec \u00A77\u300C\u539F\u4F4D\u5199\u56DE\u524D\u67E5 lastModified\u300D\uFF09\uFF1AFS Access \u6CA1\u6709 etag\uFF0Cmtime \u662F\u96F6\u6210\u672C\u7684\u65B0\u9C9C\u5EA6\u68C0\u67E5\u2014\u2014\n//     \u6253\u5F00 / \u6BCF\u6B21\u5199\u56DE\u8BB0\u4E00\u6B21 lastModified\uFF08Picked.mtime / mtime()\uFF09\uFF0C\u518D\u5199\u4E4B\u524D isStale \u6BD4\u4E00\u6B21\uFF0C\u53D8\u4E86 = \u6587\u4EF6\u5728\u5916\u9762\u88AB\u6539\u8FC7 \u2192 \u5BBF\u4E3B\u95EE\u4EBA\u518D\u8986\u76D6\u3002\n//   \u00B7 \u62D6\u8FDB\u6765\u6253\u5F00\uFF08grabDrop / fromGrab\uFF09\uFF1A\u684C\u9762 Chromium \u7528 getAsFileSystemHandle \u62FF\u53E5\u67C4 = \u6709\u5BB6\uFF1B\u522B\u7684\u6D4F\u89C8\u5668\u53EA\u6709 File = \u6CA1\u5BB6\u3002\n//   \u00B7 \u5B89\u88C5\u6210 PWA \u540E\u53CC\u51FB .mxl \u6253\u5F00\uFF08manifest file_handlers \u2192 launchQueue\uFF0CconsumeLaunchFiles\uFF1B\u7167 WeebPaint\uFF09\u3002\n\nexport interface FileHandle {\n  name: string;\n  getFile(): Promise<File>;\n  createWritable(): Promise<{ write(data: BlobPart): Promise<void>; close(): Promise<void> }>;\n}\n/** \u62FF\u5230\u624B\u7684\u4E00\u4E2A\u6587\u4EF6\uFF1A\u5B57\u8282 + \uFF08\u684C\u9762 Chromium\uFF09\u53E5\u67C4 + \u6253\u5F00\u90A3\u4E00\u523B\u7684 lastModified\uFF08\u6CA1\u6709\u53E5\u67C4\u7684 = \u53EA\u662F\u53C2\u8003\uFF0C\u4E0D\u4F1A\u518D\u5199\u56DE\uFF09\u3002 */\nexport interface Picked { name: string; bytes: Uint8Array; handle: FileHandle | null; mtime: number | null }\n\nconst TYPES = [{ description: \"MusicXML \u4E50\u8C31\uFF08MoonSinger \u5B58\u6210 .mxl\uFF09\", accept: {\n  \"application/vnd.recordare.musicxml\": [\".mxl\"], \"application/vnd.recordare.musicxml+xml\": [\".musicxml\", \".xml\"] } }];\nconst ACCEPT = \".mxl,.musicxml,.xml\";\n/** \u8BA4\u4E0D\u8BA4\u8FD9\u4E2A\u6587\u4EF6\u540D\uFF08\u6253\u5F00 / \u62D6\u8FDB\u6765 / \u53CC\u51FB\u90FD\u770B\u5B83\uFF09\u3002 */\nexport const accepts = (name: string): boolean => /\\.(mxl|musicxml|xml)$/i.test(name);\ntype G = { showOpenFilePicker?: (o: unknown) => Promise<FileHandle[]>; showSaveFilePicker?: (o: unknown) => Promise<FileHandle> };\nconst g = globalThis as unknown as G;\nconst topLevel = () => { try { return window.self === window.top; } catch { return false; } };   // \u8DE8\u57DF iframe \u91CC\u7CFB\u7EDF\u9762\u677F\u4F1A\u88AB\u62E6\nexport const canPickOpen = () => topLevel() && typeof g.showOpenFilePicker === \"function\";\nexport const canPickSave = () => topLevel() && typeof g.showSaveFilePicker === \"function\";\nconst aborted = (e: unknown) => (e as { name?: string }).name === \"AbortError\";\n\nasync function fromFile(f: File, handle: FileHandle | null): Promise<Picked> {\n  return { name: f.name, bytes: new Uint8Array(await f.arrayBuffer()), handle, mtime: f.lastModified };\n}\n\n/** \u9009\u4E00\u4E2A\u6587\u4EF6\u6253\u5F00\u3002null = \u7528\u6237\u53D6\u6D88\u4E86\uFF08AbortError \u2260 \u73AF\u5883\u4E0D\u652F\u6301\u2014\u2014\u53D6\u6D88\u5C31\u5230\u6B64\u4E3A\u6B62\uFF0C\u4E0D\u964D\u7EA7\u518D\u5F39 input\uFF09\u3002 */\nexport async function pickOpen(): Promise<Picked | null> {\n  if (canPickOpen()) {\n    let hs: FileHandle[];\n    try { hs = await g.showOpenFilePicker!({ types: TYPES, multiple: false, excludeAcceptAllOption: false }); }\n    catch (e) { if (aborted(e)) return null; throw e; }\n    return readHandle(hs[0]);\n  }\n  return new Promise((resolve, reject) => {   // iPad / Safari\uFF1A\u9009\u6587\u4EF6\uFF1B\u53D6\u6D88\u65F6\u6D4F\u89C8\u5668\u4EC0\u4E48\u90FD\u4E0D\u544A\u8BC9\u6211\u4EEC\uFF08\u8FD9\u4E2A promise \u5C31\u4E0D\u4E86\u4E86\u4E4B\uFF09\n    const inp = document.createElement(\"input\");\n    inp.type = \"file\"; inp.accept = ACCEPT; inp.hidden = true;\n    inp.addEventListener(\"change\", async () => {\n      const f = inp.files?.[0]; inp.remove();\n      if (!f) { resolve(null); return; }\n      try { resolve(await fromFile(f, null)); } catch (e) { reject(e); }\n    }, { once: true });\n    document.body.append(inp);\n    inp.click();\n  });\n}\n\n/** \u8BFB\u4E00\u4E2A\u53E5\u67C4\uFF08\u9009\u7684 / \u62D6\u7684 / \u53CC\u51FB\u7684\u90FD\u8D70\u8FD9\uFF09\uFF1A\u5B57\u8282 + \u6253\u5F00\u90A3\u4E00\u523B\u7684 mtime\u3002 */\nexport async function readHandle(h: FileHandle): Promise<Picked> {\n  return fromFile(await h.getFile(), h);\n}\n\n/** \u95EE\u7528\u6237\u5B58\u5230\u54EA\uFF08\u684C\u9762 Chromium\uFF09\u3002null = \u7528\u6237\u53D6\u6D88\u4E86\uFF1B\u6CA1\u6709\u8FD9\u4E2A\u80FD\u529B\u65F6\u4E0D\u8981\u8C03\uFF08canPickSave() \u5148\u5224\uFF09\u3002\u5FC5\u987B\u5728\u7528\u6237\u624B\u52BF\u91CC\u8C03\uFF08\u5148\u5F00\u6846\u518D\u7F16\u7801\uFF09\u3002 */\nexport async function pickSave(suggestedName: string): Promise<FileHandle | null> {\n  try { return await g.showSaveFilePicker!({ suggestedName, types: TYPES }); }\n  catch (e) { if (aborted(e)) return null; throw e; }\n}\n\n/** \u628A\u5B57\u8282\u5199\u8FDB\u8FD9\u4E2A\u6587\u4EF6\uFF08\u6574\u4EFD\u8986\u76D6\uFF1BcreateWritable = \u6D4F\u89C8\u5668\u5148\u5199\u4E34\u65F6\u6587\u4EF6\u3001close \u65F6\u539F\u5B50\u66FF\u6362\uFF09\u3002 */\nexport async function writeTo(h: FileHandle, bytes: Uint8Array): Promise<void> {\n  const w = await h.createWritable();\n  await w.write(bytes as unknown as BlobPart);\n  await w.close();\n}\n\n/** \u53E5\u67C4\u73B0\u5728\u7684 lastModified\uFF08\u5199\u524D\u5BF9\u8868\u7528\uFF09\u3002\u8BFB\u4E0D\u5230\uFF08\u53E5\u67C4\u5931\u6548\u7B49\uFF09\u2192 null\uFF0C\u8C03\u7528\u65B9\u81EA\u5DF1\u51B3\u5B9A\u6562\u4E0D\u6562\u5199\u3002 */\nexport async function mtime(h: FileHandle): Promise<number | null> {\n  try { return (await h.getFile()).lastModified; } catch { return null; }\n}\n/** \u9648\u65E7\u5BF9\u8868\uFF1A\u4E0A\u6B21\u770B\u5230\u7684\u548C\u73B0\u5728\u7684\u90FD\u5728\u3001\u800C\u4E14\u4E0D\u4E00\u6837 = \u6587\u4EF6\u5728\u5916\u9762\u88AB\u6539\u8FC7\u3002\u4EFB\u4E00\u8FB9\u4E0D\u77E5\u9053\uFF08null\uFF09= \u4E0D\u7B97\u9648\u65E7\uFF08\u4E0D\u62FF\u300C\u4E0D\u77E5\u9053\u300D\u5413\u4EBA\uFF09\u3002 */\nexport const isStale = (seen: number | null, now: number | null): boolean => seen != null && now != null && seen !== now;\n\n/** \u62D6\u8FDB\u6765\u7684\u6587\u4EF6\uFF1A\u26A0 \u5FC5\u987B\u5728 drop \u4E8B\u4EF6\u91CC**\u540C\u6B65**\u8C03\uFF08\u4E8B\u4EF6\u8FD4\u56DE / \u7B2C\u4E00\u4E2A await \u4E4B\u540E dataTransfer.items \u5C31\u7A7A\u4E86\uFF09\u2014\u2014\n *  \u8FD9\u91CC\u53EA\u540C\u6B65\u6293\u4F4F File \u548C\u53E5\u67C4\u7684 promise\uFF0C\u771F\u6B63\u8BFB\u5B57\u8282\u5728 fromGrab \u91CC await\u3002\u53EA\u8BA4\u7B2C\u4E00\u4E2A\u8BA4\u5F97\u7684\u6587\u4EF6\uFF1B\u6CA1\u6709 = null\uFF08\u4E0D\u62E6\u8FD9\u6B21 drop\uFF09\u3002 */\nexport interface Grab { file: File; handle: Promise<FileHandle | null> }\nexport function grabDrop(dt: DataTransfer): Grab | null {\n  type Item = DataTransferItem & { getAsFileSystemHandle?: () => Promise<({ kind: string } & FileHandle) | null> };\n  for (const it of [...(dt.items ?? [])] as Item[]) {\n    if (it.kind !== \"file\") continue;\n    const file = it.getAsFile();\n    if (!file || !accepts(file.name)) continue;\n    const handle = it.getAsFileSystemHandle\n      ? it.getAsFileSystemHandle().then((h) => (h && h.kind === \"file\" ? h : null), () => null)\n      : Promise.resolve(null);\n    return { file, handle };\n  }\n  for (const file of [...(dt.files ?? [])]) if (accepts(file.name)) return { file, handle: Promise.resolve(null) };   // \u6CA1\u6709 items \u7684\u8001\u6D4F\u89C8\u5668\n  return null;\n}\nexport async function fromGrab(gr: Grab): Promise<Picked> {\n  return fromFile(gr.file, await gr.handle);\n}\n\n/** \u5B89\u88C5\u6001 PWA \u7684\u300C\u53CC\u51FB .mxl \u7528 MoonSinger \u6253\u5F00\u300D\uFF08manifest file_handlers\uFF09\u3002\u6D4F\u89C8\u5668\u7F13\u5B58 launch \u4E8B\u4EF6\uFF0Cboot \u540E\u518D setConsumer \u4E5F\u6536\u5F97\u5230\u3002\n *  \u975E\u5B89\u88C5\u6001 / \u4E0D\u652F\u6301 \u2192 \u9759\u9ED8 no-op\u3002 */\nexport function consumeLaunchFiles(cb: (h: FileHandle) => void): void {\n  const lq = (globalThis as unknown as { launchQueue?: { setConsumer(f: (p: { files?: unknown[] }) => void): void } }).launchQueue;\n  if (!lq) return;\n  lq.setConsumer((p) => { for (const f of p.files ?? []) { const h = f as FileHandle; if (accepts(h.name)) cb(h); } });\n}\n", "// main.ts \u2014\u2014 \u8BD5\u9A8C\u9875\u63A5\u7EBF\uFF1A\u9876\u680F / \u8C31\u9762\u677F / pad / \u952E\u76D8\u3002created 2026-10-06 by Claude Opus 5.5\uFF1B2026-10-07 UX-2 \u6539\n// \u7B2C\u4E00\u7248\uFF08grill \u8D26\u672C \u00A78\u00BD\uFF09\uFF1A\u4E0D\u505A\u64A4\u9500\uFF1B\u64AD\u653E = \u6708\u8BFB\u5728\u6D4F\u89C8\u5668\u91CC\u5531\uFF08src/singer/\uFF0C\u548C Lab \u547D\u4EE4\u884C\u5171\u7528\u4E00\u4EFD\u5531\u6CD5\u6838\u5FC3\uFF09\u3002\n// \u5B58\u6863 = \u65E0\u5730\u9003\u751F\u53E3\uFF082026-10-07\uFF0Cuser\u300C\u5148\u4E0D\u6025\u7740store\u3002\u53EF\u4EE5\u5148\u6309\u7167\u65E0\u5730\u89C4\u8303\u5BFC\u5165\u5BFC\u51FA\u505A\u9003\u751F\u53E3\u300D\uFF09\uFF1A\u6587\u4EF6\u83DC\u5355 \u65B0\u5EFA / \u6253\u5F00 / \u5B58 / \u5BFC\u51FA\uFF08.mxl\uFF09\n//   \uFF08\u683C\u5F0F = src/format/\uFF0C\u6570\u636E\u5951\u7EA6\u8349\u7A3F ai-docs/20261007-data-contract-draft.md\uFF09\uFF1B\u6CA1\u5B58\u5C31\u5173\u9875\u9762 = \u6D4F\u89C8\u5668\u633D\u7559\u6846\uFF08\u7167 WeebPaint\uFF0C\u4E0D\u5077\u5077\u5199\u76D8\uFF09\u3002\n//   v0.3.0\uFF082026-10-07\uFF0Cedited by Claude Fable 5.1\uFF1Buser\u300C\u628A\u65E0\u5730\u505A\u5B8C\u7F8E\u300D\uFF09\u6309 WeebPaint \u65E0\u5730\u6807\u5C3A\u5BF9\u9F50\uFF1A\u5B58 = \u56DE\u5BB6\u4E00\u4E2A\u52A8\u4F5C\u3001\u53E6\u5B58\u4E3A\u5E76\u8FDB\u5BFC\u51FA hub\u3001\n//   \u5199\u56DE\u524D mtime \u5BF9\u8868\u3001\u6709\u5BB6\u4E0D\u7ED9\u6539\u6587\u4EF6\u540D\u3001\u62D6\u8FDB\u6765 / \u53CC\u51FB .mxl \u6253\u5F00\uFF08manifest file_handlers\uFF09\u3002\n// UX-2\uFF08\u8D26\u672C \u00A79\u00BE\uFF09\uFF1A\u9009\u4E2D = \u6539\u3001\u5149\u6807 = \u5199\uFF1B\u6B4C\u8BCD\u5728\u8C31\u4E0B\u9762\u70B9\u8FDB\u53BB\u5199\uFF08\u5E95\u90E8\u6B4C\u8BCD\u680F\u62FF\u6389\u4E86\uFF09\uFF1B\u300C\u5F39\u300D= \u5373\u5174\u53EA\u5531\u4E0D\u5199\u3002\n// \u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\u662F\u8C31\u91CC\u7684\u8BB0\u53F7 token\uFF0C\u70B9\u8C31\u4E0A\u7684\u8BB0\u53F7\u5C31\u5730\u6539\uFF0Cpad\u300C\uFF0B\u300D\u5728\u5149\u6807\u5904\u63D2\u2014\u2014\u9876\u680F\u4E0D\u518D\u6709\u5168\u5C40\u7684\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\u3002\n\nimport { APP_VERSION } from \"../version.ts\";\nimport { initPwaShell } from \"./pwa-shell.ts\";\nimport { singleSel, currentIndex, ensureStartDyns, swellOf, toggleSelDot, clearMarks, stackDegree, setBarStyle, transposePapers, scopeKey, setPartAutoOttava, setLyricFit, setBarNumbers, DYNS, CLEFS, headLen, type ClefName, insertClef, insertOttava, setDisplayMark, DEFAULT_TIME, WHOLE, type Art, ART_NAME, setGroove, setRepeatBar, insertNav, NAV_LABEL, endingLabel, type NavWhat, type Repeat, tempoOwner, markAnchor, isTimed, type Dyn, dynMarkAt, editMarkAt, rampSource, toggleArtSel, toggleSlurSel, slurStateSel, artStateSel, setDynSel, dynMarkSel, type EditorState, type InputState, type Acc, type Hum, type MarkVal, type Song, type PartDef, type Token, type TempoMap, initState, writePitch, writeMark, setHum, setPaper, setCredits, setRights, tapAcc, setAccState, setUnit, setNote, effectivePitch, timeline, keyAt, timeAt, tempoAt, TPQ, tr, setFocus, setCaret, setPaperHidden, toggleChordPitch, stackPitch, songOnlyPaper, allPitches, addPart, rebindTrack, removePart, addPaper, removePaper, movePaper, addTrack, removeTrack, flattenPart, tempoMapOf, setDensity, setPartClef, movePart, setPartHost, setPartStaves, type Clef, setSelDur, select } from \"../score/song.ts\";\nimport { songPlayOrder, parseArrangement } from \"../score/arrange.ts\";\nimport { grooveWeights, grooveMapOf, grooveCategory, followOf, grooveStyle, grooveTable, grooveName, describeGroove, grooveHasPhase, swingRatio, timeMapOf, GROOVE_STYLES } from \"../score/groove.ts\";\nimport { type Pitch, midiOf, spellMidi, KEY_LABEL } from \"../score/pitch.ts\";\nimport { apply, type Command } from \"../score/commands.ts\";\nimport { type Action, type Where, route, isSoundKey } from \"../keyboard/keys.ts\";\nimport { createMidiKeyboard, type MidiStatus } from \"../keyboard/midi.ts\";\nimport { span, perfReport, perfReset } from \"../ui/perf-trace.ts\";   // \u70ED\u8DEF\u5F84\u79D2\u8868\uFF08\u6309\u952E \u2192 \u4E0A\u5C4F\u5206\u8D26\uFF09   // MIDI \u952E\u76D8\uFF08Web MIDI\uFF09\uFF1A\u7434\u952E\u53F7\u8FDB\u6765\uFF0C\u7FFB\u8BD1\u5F52 pad-host\nimport { MELISMA_MARK } from \"../score/lyrics.ts\";\nimport { lyricIssues, lyricWhyText, prettyReading, type LyricIssue } from \"../score/lyric-check.ts\";\nimport { ScoreView } from \"../ui/score-view.ts\";\nimport type { PartView } from \"../render/engrave.ts\";\nimport { installPlatformGuards } from \"../ui/platform-guards.ts\";\nimport { type HintRange } from \"../keyboard/pad.ts\";\nimport type { InspectorCtx } from \"../performers/registry.ts\";\nimport { createPadHost } from \"./pad-host.ts\";   // pad \u7684\u5BBF\u4E3B = \u7FFB\u8BD1\u5C42\uFF08\u97F3\u952E \u2192 \u5199 / \u53E0\u97F3\u89C2\u671B / \u51FA\u58F0\uFF1B\u6309\u952E id \u2192 \u547D\u4EE4 / \u63D2\u8BB0\u53F7 / \u83DC\u5355\uFF1B\u8C01\u6309\u7740\u7684\u7C3F\u8BB0\uFF09\nimport { toLabScore } from \"../score/lab-score.ts\";\nimport { Singer, type Reading } from \"../singer/client.ts\";\nimport type { LyricReading } from \"../ui/lyric-editor.ts\";\nimport { RULES, MODE_BAR, barMode, MODE_LABEL, MODE_TITLE, dockOf, hasKeys, sideDock, sideDocked, type Mode, type WorkspaceState } from \"./workspace.ts\";\nimport { budgetFor, advise, trimOnSongSwitch, describe as describeResources, totalBytes, AUDIO_HOT, type DeviceInfo, type Snapshot } from \"./resource-watch.ts\";\nimport type { LoadInfo } from \"../engine/studio-client.ts\";\nimport { holdAudio, releaseAudio } from \"../singer/audio.ts\";\nimport { DEFAULT_CALIBRATION_DB, SOUNDFONT_DEFAULTS, TSUKUYOMI_DEFAULTS } from \"../format/performance.ts\";\nimport { encodeMp3, MP3_QUALITY, type Mp3Quality } from \"../export/mp3.ts\";\nimport { id3v2, firstUrl } from \"../export/id3.ts\";\nimport { createPackStore } from \"@internal/model-packs\";\nimport { showNotice, configureFloors } from \"@internal/workbench-elements\";\nimport { PACKS, CREDIT } from \"../singer/packs.gen.ts\";\nimport { CREDIT_TRANSLATIONS } from \"../singer/credit-translations.ts\";\nimport { SOUNDS, SOUNDS_SOURCE_DEFAULT, type SoundEntry } from \"../gm/sounds.gen.ts\";\nimport { createSoundSources } from \"../sources/sounds.ts\";   // \u97F3\u6E90\u6765\u6E90 + \u5F31\u5F15\u7528\u89E3\u6790\uFF08\u5200 4 \u63A5\u7F1D\uFF09\nimport { createModelSources, MODEL_SOURCE_DEFAULT } from \"../sources/models.ts\";\nimport { sha256Hex } from \"../sources/sha256.ts\";\nimport {percOf} from \"../gm/percussion.ts\";\nimport { withFinal, withoutFinal, contentFingerprintOf, type FinalRecord, moveBus, saveMxl, openBytes, emptyExtras, roleName, roleSound, partLabels, withRoleName, withRoleConcept, activeCandidateName, activeId, activeGm, activeInstrument, candidates, gmCandidates, withActive, withSf2Candidate, withoutCandidate, newRoleId, newMicId, withNewRole, withoutRole, withMic, withThumbnail, soundUses, withPacked, withUnpacked, activeCalibrationDb, withCalibration, withGapSec, GAP_MAX_SEC, activeVelocity, activePerfSpec, activeTranspose, activeSingChunk, withSingChunk, withMaster, activeMaster, withTrack, studioTrack, studioTracks, withoutBus, newBusId, activeChain, CANDIDATE_ID, type Extras, type Engine, type GmCandidate } from \"../format/project.ts\";\nimport { packedLicenses, performerCredits, songCreditLine, licenseHints, RIGHTS_PRESETS, creditsText, type CreditLine } from \"../format/credits.ts\";\nimport { ignoredArts, whyIgnored, dynOverridden, dynLevels, type Mark } from \"../score/perform.ts\";\nimport { MARK_DEFAULTS } from \"../format/performance.ts\";\nimport { navWhy } from \"../score/repeats.ts\";\nimport { cachedSound, rememberSound, listCachedSounds, forgetSound, releaseSoundMemory, soundMemoryBytes, siteStorageEstimate, isSoundPersisted } from \"../gm/sound-cache.ts\";\n// \u2500\u2500 \u5B9E\u65F6\u8BD5\u542C\uFF082026-10-09 Claude Fable 5.1\uFF0C\u5200 1\uFF1B\u63D0\u6848 ai-docs/20261009-realtime-preview-engine-proposal.md\uFF09\uFF1A\u8C31 \u2192 \u65F6\u95F4\u7EBF\uFF08\u79D2\uFF09\u2192 \u5F55\u97F3\u623F\uFF08\u97F3\u9891\u7EBF\u7A0B\uFF09\nimport { StudioClient } from \"../engine/studio-client.ts\";\nimport { performerOf, TSUKUYOMI_RANGE } from \"../performers/index.ts\";\nimport { createPerformance, type Issue } from \"./performance.ts\";   // \u5531\u6B4C / \u64AD\u653E / \u5BFC\u51FA\u7684\u80F6\u6C34\uFF08\u5200 1 \u4E4B\u4E8C\uFF09\nimport { createOverlayRegistry, padLocked } from \"./overlay.ts\";\nimport { LATCH_OFF, latchDown, latchUp, latchWrite, latchCancel, latchOn, type Latch } from \"../keyboard/latch.ts\";   // \u4E09\u628A\u9501\u4E00\u6761\u89C4\u5219\uFF08\u7F16\u8F91\u72B6\u6001\u673A\u7B2C 2 \u671F\uFF09   // \u76D6\u5C42\u767B\u8BB0\uFF08\u5200 3 \u4E4B\u4E00\uFF09\uFF1A\u9762\u677F / \u5C0F\u83DC\u5355 / \u8F68\u7684\u5C0F\u5361\u540C\u4E00\u65F6\u523B\u53EA\u5F00\u4E00\u5F20\uFF1Bpage\uFF08\u5200 3 \u4E4B\u4E8C\uFF09\uFF1A\u8C31 / \u4E50\u5668\u9875 / \u76EE\u5F55   // \u6F14\u594F\u8005\u63D2\u4EF6\u6CE8\u518C\u8868\uFF08ADR-0004\uFF09\uFF1A\u80FD\u4EC0\u4E48 / \u600E\u4E48\u51C6\u5907 / \u600E\u4E48\u51FA\u58F0\u90FD\u95EE\u5B83\uFF0C\u4E0D\u6309\u5F15\u64CE\u540D\u5206\u652F\nimport type { AuditionInst, TrackSpec } from \"../engine/studio.ts\";\nimport { buildTimeline, lightNotes, songLangOf, sungPlan, LEAD_IN, PRE_ROLL, HUM_KANA, type Timeline, type PerformerInfo, type ChunkPlan } from \"../engine/timeline.ts\";\nimport { chunkOrder, readyToStart, prerollCount } from \"../engine/scheduler.ts\";\nimport { loadVowelTable } from \"../engine/vowel-table.ts\";\nimport { sfKey, canAlign, type SfxInfo } from \"../gm/sf-key.ts\";\nimport { Finder, type FinderPick } from \"../ui/finder.ts\";\nimport { Studio, MASTER as STUDIO_MASTER } from \"../ui/studio.ts\";\nimport { resolveChain } from \"../ui/plugins.ts\";\nimport { FINAL_MP3_ENTRY } from \"../format/final.ts\";\nimport { coreInfo } from \"../core/version.ts\";\nimport { roleNameOf, roleSoundOf, loadCatalog, rangeOf, sampleKeyOf, jointOf, sustainOf, GS_LIBRARY_ID, type Catalog } from \"../gm/catalog.ts\";\nimport { ICON_CREDITS } from \"../gm/instruments.gen.ts\";\nimport { subsetSf2, listSf2Presets, sf2Info, type Sf2PresetInfo } from \"../gm/sf2-subset.ts\";\nimport { ROLE_GROUPS, ROLE_PRESETS, DEFAULT_ROLE } from \"../score/roles.ts\";\nimport { type PaperKind, type Density, PAPER_KINDS, PAPER_NOTE, PAPER_LABEL, DENSITIES, densityOf, DEFAULT_PAPER, paperOf, paperSizeText } from \"../score/paper.ts\";\nimport * as docFile from \"./doc-file.ts\";\nimport { unzipSync } from \"../../vendor/fflate/fflate.esm.js\";\nimport { defaultStem, fileSafe, stampedCopy } from \"./names.ts\";\n// \u2500\u2500 \u6B4C\u5E93\uFF08v0.6.0\uFF0C2026-10-08 Claude Fable 5.1\uFF09\uFF1A@internal/store\uFF08\u63A5\u7F1D src/app-store.ts\uFF09+ @internal/gallery\uFF08src/gallery-host.ts\uFF09+ WeebPaint \u7684 editor-session \u8282\u5F8B \u2500\u2500\nimport { attachStore, hasStore, requireStore, storeWasAttached, auth, setActiveIdentifier, requestStoragePersistence, isSignedIn, detachStore } from \"../app-store.ts\";\nimport { identifiers } from \"../identifiers.ts\";\nimport { SONG_SUFFIX, LOCAL_SAVE_DEBOUNCE_MS, WAKE_CHECK_AFTER_MS, WAKE_CHECK_TIMEOUT_MS } from \"../config.ts\";\nimport { initGalleryHost, type GalleryHost } from \"../gallery-host.ts\";\nimport { createEditorSession } from \"../editor-session/index.ts\";\nimport { openInputSheet, openChoiceSheet, type Choice, openConfirmSheet, isSheetOpen, closeSheet, isGateOpen, lockSyncGate, unlockSyncGate } from \"../ui/sheets.ts\";\nimport { createReferenceHost, type RefImportQuestion, type RefImportChoice, RAM_ABOVE } from \"./reference-host.ts\";\nimport { RenderProgress } from \"../ui/render-progress.ts\";\nimport { scorePdf, LYRIC_RAISE, type PdfFontId } from \"../export/score-pdf.ts\";\nimport { loadPdfFont, loadMusicOutlines, PDF_FONT_MB } from \"../export/pdf-assets.ts\";\nimport { reportError, diagNote, diagText, initBlackBox } from \"./report-error.ts\";\nimport { copyDiag, shareDiag, downloadDiag, clearDiag, canShareDiag } from \"./diag-ui.ts\";\nimport { deviceKvGet, deviceKvSet } from \"../device-kv.ts\";\nimport { makeCoverPng, coverWithBlurb } from \"../image/cover.ts\";\nimport { copyTokens, cutTokens, pasteTokens, selectAll, toJianpu, fromJianpu, fifthsAtSel } from \"../score/clipboard.ts\";\nimport { type Locus, type Restored } from \"../score/history.ts\";\nimport { createDocument, type SavedMark } from \"./document.ts\";\nimport { createHome, assertNever, type Home } from \"./home.ts\";\nimport { createEncoder } from \"../format/encode-client.ts\";\nimport { runFactoryReset } from \"./factory-reset.ts\";\nimport { freshDesk, freshPartView, serializeDesk, unserializeDesk, PAD_UNITS, type Desk, type PartViewState } from \"../score/desk.ts\";\nimport { SelBar, type SelVerb } from \"../ui/sel-bar.ts\";\nimport { CLEF_LABEL, CLEF_TITLE, OTTAVA_LABEL, resolveSongClefs } from \"../score/clef.ts\";\nimport type { ClefHit } from \"../render/engrave.ts\";\nimport { TAB20, partColorIndices, partAbbr } from \"../ui/part-colors.ts\";\n\ninitBlackBox(APP_VERSION);   // \u9ED1\u5323\u5B50\u7B2C\u4E00\u4E2A\u8D77\uFF1A\u4E4B\u540E\u6240\u6709\u62A5\u9519 / \u9762\u5305\u5C51\u90FD\u6709\u5730\u65B9\u843D\uFF08\u8BBE\u7F6E\u91CC\u300C\u8BCA\u65AD\u65E5\u5FD7\u300D\u80FD\u5206\u4EAB\uFF09\n/** \u6587\u6863 = \u771F\u76F8 + **\u6539\u5B83\u7684\u552F\u4E00\u5165\u53E3**\uFF08src/app/document.ts\uFF0C2026-10-16 doc \u8FD9\u4E00\u5200\uFF09\uFF1A\u8C31\u7684\u72B6\u6001 `D.st`\u3001\u6587\u4EF6\u91CC\u7684\u5176\u4F59\u90E8\u5206 `D.extras`\u3001\u64A4\u9500\u6808\u3001\u300C\u6539\u8FC7\u6CA1\u5B58\u300D\u7684\u57FA\u7EBF\u3001\u5B9A\u7A3F\u7684\u9501\u3002\n *  \u6539\u72B6\u6001\u4E00\u5F8B `D.commit()`\uFF08\u4E0B\u9762\u7684 update / updateExtras / updateBoth \u53EA\u662F\u8584\u58F3\uFF09\uFF1B\u754C\u9762\u7684\u526F\u4F5C\u7528\u5728 afterState / afterExtras / afterRestore \u4E09\u4E2A hook \u91CC\uFF08\u51FD\u6570\u58F0\u660E\u4F1A\u63D0\u5347\uFF0C\u8FD9\u91CC\u5F15\u7528\u6CA1\u95EE\u9898\uFF09\u3002 */\nconst D = createDocument({ st: initState(), extras: emptyExtras() }, {\n  now: () => performance.now(), normalize: (next) => withStartDyns(next),\n  onState: (prev, next, moved) => afterState(prev, next, moved, true), onExtras: (prev, next, locus) => afterExtras(prev, next, locus),\n  onRefused: (what) => onLockRefused(what), onRestored: (r, verb, prev) => afterRestore(r, verb, prev), extraDirty: () => refHost.rev(),\n});\n/** \u8FD9\u9996\u6B4C\u7684\u5BB6\uFF08src/app/home.ts\uFF0C2026-10-21 F-49\u300C\u5BB6\u300D\u8FD9\u4E00\u5200\uFF09\uFF1A\u6B4C\u5E93\u91CC\u7684\u4E00\u9996 / \u672C\u673A\u6587\u4EF6\uFF08\u684C\u9762 Chromium \u7684\u53E5\u67C4 + mtime \u5BF9\u8868\uFF09/ \u8FD8\u6CA1\u5BB6\uFF08\u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31\u5E26 pendingFolder\uFF09\uFF0C\u4E09\u79CD\u4E92\u65A5\uFF1B\n *  \u5B58 / \u6539\u540D / \u79BB\u5F00 / \u5B89\u5BB6 / \u653E\u4E0B\u8EAB\u4EFD\u53EA\u7ECF H \u7684\u52A8\u8BCD\uFF0C\u4E09\u79CD\u5BB6\u7684\u5206\u652F\u90FD\u5728\u90A3\u4E2A\u6A21\u5757\u91CC\uFF08switch + assertNever\uFF0C\u6F0F\u4E00\u79CD = tsc \u7EA2\uFF09\u3002\u6587\u4EF6\u540D\u4E3B\u5E72 H.stem\uFF0C\u6B4C\u540D\u5728\u8C31\u91CC\uFF08D.st.song.title\uFF0C\u53EF\u4E0D\u586B\uFF09\uFF0C\u548C\u6587\u4EF6\u540D\u5206\u5F00\u3002\n *  ports \u91CC\u5F15\u7528\u7684 es / KV_LAST_DOC / smartSaveStore \u7B49\u58F0\u660E\u5728\u540E\u9762\uFF08\u7BAD\u5934\u51FD\u6570\u91CC\u5F15\u7528\uFF0C\u5F00\u673A\u90A3\u4E00\u4E32 loadDoc \u4E4B\u524D\u90FD\u5DF2\u5C31\u4F4D\uFF1B\u51FD\u6570\u58F0\u660E\u4F1A\u63D0\u5347\uFF09\u3002 */\nconst H = createHome({ home: { kind: \"none\", pendingFolder: null }, stem: defaultStem(), named: false }, {\n  gallery: { save: () => smartSaveStore(), flushLocal: () => es.flushLocal(), flushAndPush: () => es.flushAndPush(), markDirty: () => es.markDirty(), adopted: (id, o) => es.adopted(id, o), release: () => es.release(), rename: (to) => es.rename(to), occupied: (id) => requireStore().files.occupied(id) },\n  file: { canPickSave: docFile.canPickSave, pickSave: docFile.pickSave, writeTo: docFile.writeTo, mtime: docFile.mtime, isStale: docFile.isStale },\n  ids: { join: (folder, stem) => identifiers.join({ folder, stem, suffix: SONG_SUFFIX }), parse: (id) => identifiers.parse(id) },\n  suffix: SONG_SUFFIX,\n  bytes: () => bytesNow(), dirty: () => D.dirty(), title: () => D.st.song.title ?? \"\", freshStem: () => defaultStem(),\n  ask: { discard: (what) => confirmDiscard(what), overwriteStale: (name) => askSheet(`\u300C${name}\u300D\u5728\u5916\u9762\u88AB\u6539\u8FC7`, \"\u6253\u5F00\u6216\u4E0A\u6B21\u5B58\u4E4B\u540E\uFF0C\u8FD9\u4E2A\u6587\u4EF6\u88AB\u522B\u7684\u7A0B\u5E8F\u6539\u8FC7\u3002\u8986\u76D6 = \u5916\u9762\u6539\u7684\u90A3\u4E9B\u4F1A\u4E22\u3002\", \"\u8986\u76D6\") },\n  offerDownload: (bytes, name, onSaved) => { const file = new File([bytes as unknown as BlobPart], name, { type: \"application/vnd.recordare.musicxml\" }); offerFile(file, \"\u5B58\u6210 .mxl\", `${esc(file.name)} \u00B7 ${sizeText(file.size)}\u3002\u4E0B\u8F7D\u6216\u5206\u4EAB\u5230\u300C\u6587\u4EF6\u300D\u91CC\uFF1B\u4EE5\u540E\u4ECE\u6587\u4EF6\u83DC\u5355\u300C\u6253\u5F00\u300D\u3002`, onSaved); },\n  markSaved: () => { D.markSaved(); renderTitle(); },\n  report: (e, level) => reportError(e, level === \"error\" ? \"error\" : \"warning\"),\n  // \u5BB6\u6362\u4E86\uFF1A\u544A\u8BC9 store \u8C01\u5F00\u7740\uFF08\u51B2\u7A81\u9762 / \u6B4C\u5E93\u5361\u7247\u8981\u77E5\u9053\uFF09\u3001\u300C\u4E0A\u6B21\u5F00\u7740\u54EA\u9996\u300D\u7684\u6307\u9488\uFF08\u6B4C\u5E93\u91CC = \u5B83\uFF1B\u653E\u4E0B\u8EAB\u4EFD / \u65B0\u5EFA\u7A7A\u8C31 = \u6E05\u6389\uFF1B\u5F00\u672C\u673A\u6587\u4EF6\u4E0D\u52A8\u5B83\u2014\u2014reload \u56DE\u5230\u4E0A\u4E00\u9996\u6B4C\u5E93\u91CC\u7684\u6B4C\uFF0Cv0.6 \u8D77\u5C31\u8FD9\u6837\uFF09\u3001\u91CD\u753B\u9876\u680F\n  onHome: (prev, next) => { setActiveIdentifier(next.kind === \"gallery\" ? next.identifier : null); if (next.kind === \"gallery\") deviceKvSet(KV_LAST_DOC, next.identifier); else if (next.kind === \"none\" && (prev.kind === \"gallery\" || next.pendingFolder != null)) deviceKvSet(KV_LAST_DOC, null); renderTitle(); },\n  onName: () => renderTitle(),\n});\n/** \u5149\u6807\u6240\u5728\u7684\u58F0\u90E8 / \u5B83\u7684\u89D2\u8272 id\uFF08\u6B4C\u624B\u724C\u3001\u627E\u4EBA\u3001\u8BD5\u542C\u90FD\u5BF9\u7740\u5B83\uFF09\u3002 */\nconst curPart = (): PartDef => D.st.song.parts.find((p) => p.id === D.st.at.part) ?? D.st.song.parts[0];\n/** \u5149\u6807\u6240\u5728\u58F0\u90E8\u53F0\u4E0A\u90A3\u4F4D\u4E0D\u8BA4\u7684\u8BB0\u53F7\uFF08\u8C31\u4E0A\u753B\u7070\uFF1B\u5199\u7684\u65F6\u5019\u8BF4\u4E00\u58F0\uFF1Buser 2026-10-08 \u62CD\u300C\u6F14\u594F\u8005\u4E0D\u8BA4\u7684\u8BB0\u53F7\u4E5F\u53D8\u7070\uFF0C\u4E0D\u9759\u9ED8\u5931\u6548\uFF0C\u800C\u662F\u5411\u7528\u6237\u62AB\u9732\u300D\uFF09\u3002 */\nconst ignoredFor = (role: string): Mark[] => { const sp = activePerfSpec(D.extras, role); return ignoredArts(performerOf(activeInstrument(D.extras, role)?.engine), sp.gapSec, sp.canSwell); };\nconst ignoredHere = (): Mark[] => ignoredFor(curPart().role);\nconst MARK_NAME: Record<Mark, string> = { ...ART_NAME, slur: \"\u8FDE\u7EBF\", swellGrow: \"\u97F3\u5185\u6E10\u5F3A / \u9F13\u8D77\", swellFade: \"\u97F3\u5185\u6E10\u5F31\", inhale: \"\u51FA\u58F0\u7684\u6362\u6C14\" };\n/** \u521A\u5199\u4E0A\u4E86\u4E00\u4E2A\u53F0\u4E0A\u90A3\u4F4D\u4E0D\u8BA4\u7684\u8BB0\u53F7 \u2192 \u660E\u8BF4\uFF08\u7167\u6837\u5199\u8FDB\u8C31\u3001\u753B\u7070\uFF0C\u51FA\u58F0\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002\u8FDE\u7EBF / \u4FDD\u6301\u5728\u300C\u672C\u6765\u5C31\u4E0D\u7559\u7F1D\u300D\u7684\u4EBA\u90A3\u91CC\u4E5F\u662F\u8FD9\u6837\uFF08\u8FDE\u65AD\uFF0C2026-10-08\uFF09\u3002 */\nfunction discloseArt(prev: EditorState, a: Mark): void {\n  if (!ignoredHere().includes(a)) return;\n  const has = (t: Token) => t.kind === \"note\" && (a === \"slur\" ? !!t.slur : a === \"inhale\" ? !!t.inhale : a === \"swellGrow\" ? swellOf(t) === \"<\" || swellOf(t) === \"<>\" : a === \"swellFade\" ? swellOf(t) === \">\" : (t.art ?? []).includes(a as Art));\n  const n = (s: EditorState) => tr(s).filter(has).length;\n  if (n(D.st) <= n(prev)) return;\n  const role = curPart().role, who = activeCandidateName(D.extras, role) || \"\u53F0\u4E0A\u8FD9\u4F4D\";\n  const why = whyIgnored(performerOf(activeInstrument(D.extras, role)?.engine), a);\n  info(why === \"decay\" ? `${who}\u7684\u97F3\u6309\u4E0B\u53BB\u5C31\u81EA\u7136\u8870\u51CF\uFF0C${MARK_NAME[a]}\u505A\u4E0D\u5230\uFF1A\u5199\u5728\u8C31\u4E0A\u4E86\uFF08\u753B\u7070\uFF09\uFF0C\u51FA\u58F0\u4E0D\u53D8\uFF1B\u97F3\u5185\u6E10\u5F31\u7167\u505A`\n    : why === \"sung\" ? `${who}\u672C\u6765\u5C31\u8FDE\u7740\u5531\uFF1A${MARK_NAME[a]}\u5199\u5728\u8C31\u4E0A\u4E86\uFF08\u753B\u7070\uFF09\uFF0C\u51FA\u58F0\u4E0D\u53D8\uFF1B\u8981\u65AD\u53E5\u7528\u547C\u5438`\n    : why === \"gap\" ? `${who}\u672C\u6765\u5C31\u4E0D\u7559\u7F1D\uFF08\u4E50\u5668\u9875\u300C\u97F3\u548C\u97F3\u4E4B\u95F4\u300D= 0\uFF09\uFF1A${MARK_NAME[a]}\u5199\u5728\u8C31\u4E0A\u4E86\uFF08\u753B\u7070\uFF09\uFF0C\u51FA\u58F0\u4E0D\u53D8`\n    : `${who}\u4E0D\u8BA4${MARK_NAME[a]}\uFF1A\u5199\u5728\u8C31\u4E0A\u4E86\uFF08\u753B\u7070\uFF09\uFF0C\u51FA\u58F0\u4E0D\u53D7\u5F71\u54CD`);\n}\n/** \u521A\u5199\u7684\u529B\u5EA6\u8BB0\u53F7 / \u5F3A\u540E\u5373\u5F31\u8BA9\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u4E0D\u8D77\u4F5C\u7528\u4E86\uFF08\u7D27\u8DDF\u7740\u7684\u97F3\u662F fp\uFF1A\u97F3\u5934\u6309 f\u3001\u968F\u540E\u843D\u5230 p\uFF09\u2192 \u660E\u8BF4\uFF08\u7167\u5199\u3001\u753B\u7070\uFF1B2026-10-09 user\u300C\u8981\u4E0D\u8981\u6309\u7EAA\u5F8B\u628A mf \u753B\u7070\u3001\u8BF4\u4E00\u53E5\uFF1F \u8981\u300D\uFF09\u3002 */\nfunction discloseDynOverride(prev: EditorState): void {\n  const toks = tr(D.st), now = dynOverridden(toks);\n  if (now.size <= dynOverridden(tr(prev)).size) return;\n  const v = [...now].map((i) => toks[i]).find((t) => t.kind === \"dyn\");\n  info(`\u8FD9\u4E2A ${v && v.kind === \"dyn\" ? v.value : \"\u529B\u5EA6\u8BB0\u53F7\"} \u4E0D\u8D77\u4F5C\u7528\uFF08\u753B\u7070\uFF09\uFF1A\u540E\u9762\u90A3\u4E2A\u97F3\u662F\u5F3A\u540E\u5373\u5F31\uFF08fp\uFF09\uFF0C\u97F3\u5934\u6309 f\u3001\u968F\u540E\u843D\u5230 p`);\n}\nconst curRole = (): string => curPart().role;\n/** \u58F0\u90E8\u7684\u663E\u793A / \u51FA\u58F0\u72B6\u6001\uFF1A\u9690\u85CF\uFF08\u4E0D\u753B\uFF09\u3001\u9759\u97F3\u3001\u72EC\u594F\u2014\u2014\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\uFF0C\u4E0D\u8FDB\u6587\u4EF6\uFF08user 2026-10-08\u300C\u4E0D\u540C\u7684\u58F0\u90E8\u89C6\u56FE\u548C\u51FA\u58F0\u5E94\u8BE5\u5206\u522B\u53EF\u4EE5solo\u548Chide\u300D\uFF09\u3002 */\n//   \u4E24\u6839\u8F74\u540C\u4E00\u5957\u8BED\u6CD5\uFF08user 2026-10-08\u300Cdisplay\u6709hide \u548Cshow only\uFF0C play\u6709mute\u548Csolo\u3002\u8FD9\u4E24\u4E2A\u7684\u903B\u8F91\u5173\u7CFB\u4F60\u7406\u4E00\u4E2A\u597D\u7684\u300D\uFF09\uFF1A\u6BCF\u6839\u8F74 = \u4E00\u4E2A\u300C\u5173\u6389\u300D\u65D7\uFF08\u9690\u85CF / \u9759\u97F3\uFF09+ \u4E00\u4E2A\u300C\u53EA\u8981\u8FD9\u4E9B\u300D\u96C6\u5408\uFF08\u53EA\u770B\u5B83 / \u72EC\u594F\uFF09\uFF1B\n//   \u6709\u300C\u53EA\u8981\u300D\u65F6\u65D7\u5B50\u4E0D\u770B\uFF0C\u5173\u6389\u300C\u53EA\u8981\u300D\u5C31\u56DE\u5230\u65D7\u5B50\uFF1B\u4E24\u6839\u8F74\u4E92\u4E0D\u5F71\u54CD\uFF08\u9690\u85CF\u7684\u58F0\u90E8\u7167\u6837\u51FA\u58F0\uFF09\u3002\u9690\u85CF\u4E0D\u662F\u6D88\u5931\uFF1A\u8C31\u4E0A\u7F29\u6210\u4E00\u6761\u7EC6\u884C\u3002\nconst partView = new Map<string, PartViewState>();\nconst pv = (id: string): PartViewState => partView.get(id) ?? { hidden: false, only: false, muted: false, solo: false };\nconst setPv = (id: string, patch: Partial<PartViewState>) => partView.set(id, { ...pv(id), ...patch });\n/** \u663E\u793A\uFF1A\u6709\u300C\u53EA\u770B\u5B83\u300D\u7684\u53EA\u663E\u793A\u90A3\u4E9B\uFF0C\u5426\u5219\u663E\u793A\u6CA1\u9690\u85CF\u7684\u3002 */\nconst isShown = (id: string): boolean => { const only = D.st.song.parts.some((p) => pv(p.id).only); return only ? pv(id).only : !pv(id).hidden; };\n/** \u663E\u793A / \u5B58\u6863\u7528\u7684\u540D\u5B57\uFF1A\u586B\u4E86\u6B4C\u540D\u7528\u6B4C\u540D\uFF0C\u6CA1\u586B\u7528\u6587\u4EF6\u540D\u4E3B\u5E72\u3002 */\n/** \u6587\u4EF6\u540D\uFF08user\u300C\u7528\u6B4C\u540D\u53EF\u4EE5\uFF0C\u7136\u540E\u4E5F\u8981yyyymmdd\u89C4\u5219\u3002\u4E4B\u540E\u5404\u7BA1\u5404\u7684\u540C\u610F\u300D\uFF09\uFF1A\u6CA1\u5B58\u8FC7 = \u5E74\u6708\u65E5-\u6B4C\u540D\uFF08\u6CA1\u6B4C\u540D = \u5E74\u6708\u65E5-\u56DB\u4F4D\u968F\u673A = doc.stem\uFF09\uFF1B\n *  \u5B58\u8FC7 / \u6253\u5F00\u7684 / \u6539\u8FC7\u540D\u7684 = \u5B9A\u4E0B\u6765\uFF08named\uFF09\uFF0C\u548C\u7EB8\u4E0A\u7684\u6B4C\u540D\u5404\u7BA1\u5404\u7684\uFF1B\u6539\u6587\u4EF6\u540D\u5728\u6587\u4EF6\u83DC\u5355\u3002 */\nconst docName = () => H.name();\n\nconst $ = <T extends HTMLElement>(id: string) => document.getElementById(id) as T;\nconst bar = $(\"bar\"), scoreEl = $(\"score\"), padEl = $(\"padPanel\");\n// \u63D0\u793A\uFF08toast\uFF09\u653E\u5728\u8C31\u90A3\u4E00\u5757\u7684\u5E95\u8FB9\u5C45\u4E2D\uFF08v0.10.23\uFF1Buser\u300C\u5F85\u4F1A\uFF1Ainfo error\u7684\u5F39\u7A97\u548C\u63A7\u5236\u6761\u4E5F\u649E\u8F66\u300D\uFF1A\u539F\u6765\u9876\u680F\u4E0B\u9762\u6A2A\u7740\u5C45\u4E2D\uFF0C\u957F\u7684\u62A5\u9519\u538B\u4F4F\u5DE6\u4E0A\u7684\u6302\u7B7E / \u6DF7\u97F3\u53F0\u7684\u9876\u6761\uFF09\uFF1A\n//   \u7AD6\u5C4F = \u952E\u76D8\u4E0A\u9762\uFF08\u4E0D\u76D6\u952E\uFF09\u3001\u6A2A\u5C4F = \u8C31\u90A3\u4E00\u5757\u7684\u4E0B\u8FB9\uFF1B\u8C31\u88AB\u76D6\u7740\uFF08\u6B4C\u5E93\uFF09= \u7167\u5E93\u7684\u9ED8\u8BA4\uFF08\u5C4F\u5E55\u5E95\u4E0B\u5C45\u4E2D\uFF09\u3002\u5F00\u7740\u5BF9\u8BDD\u6846\u65F6\u5E93\u81EA\u5DF1\u632A\u5230\u9876\u4E0A\uFF08docked-top\uFF09\uFF0C\u4E0D\u7BA1\n{ const de = document.documentElement;\n  const placeNotices = () => { const r = scoreEl.getBoundingClientRect(); if (r.height < 80) { de.style.removeProperty(\"--notice-bottom\"); de.style.removeProperty(\"--notice-x\"); return; }\n    de.style.setProperty(\"--notice-bottom\", `${Math.round(Math.max(12, innerHeight - r.bottom + 60))}px`); de.style.setProperty(\"--notice-x\", `${Math.round(r.left + r.width / 2)}px`); };\n  if (typeof ResizeObserver === \"function\") new ResizeObserver(placeNotices).observe(scoreEl);\n  addEventListener(\"resize\", placeNotices); placeNotices(); }\n/** \u53C2\u8003\u7A97\uFF08v0.8\uFF0C2026-10-08 \u6DF1\u591C Opus 5.5\uFF1Bsrc/app/reference-host.ts \u662F\u552F\u4E00\u8BA4\u8BC6\u5E93\u7684\u5730\u65B9\uFF09\uFF1A\u622A\u56FE / \u6587\u5B57\u653E\u5728\u65C1\u8FB9\u5BF9\u7740\u6253\u8C31\u3002\n *  \u5361\u7247\u8FDB\u6587\u4EF6\uFF08\u52A0 / \u5220 / \u632A = \u6807\u810F\uFF0C\u4E0D\u8FDB\u64A4\u9500\uFF09\uFF1B\u7A97\u7684\u4F4D\u7F6E = \u89C6\u56FE\u6001\uFF08desk.ref\uFF09\u3002\u5E95\u8FB9\u5730\u677F = \u7AD6\u5C4F\u65F6 pad \u90A3\u4E00\u5757\uFF08\u7A97\u7684\u628A\u624B\u4E0D\u8EB2\u5230 pad \u5E95\u4E0B\uFF09\u3002 */\nconst refHost = createReferenceHost({\n  info: (t) => info(t), error: (t) => showError(t),\n  topFloor: () => Math.round(bar.getBoundingClientRect().bottom),\n  bottomFloor: () => { const r = padEl.getBoundingClientRect(); return !padEl.hidden && r.width > innerWidth * 0.6 && r.top > innerHeight * 0.3 ? Math.max(0, Math.round(innerHeight - r.top)) : 0; },\n  focusScore: () => scoreEl.focus({ preventScroll: true }),\n  askImport: (q) => askRefImport(q),\n  onCards: () => { renderTitle(); changed(); },\n});\nnew ResizeObserver(() => { refHost.relayout(); syncDock(); }).observe(padEl);   // \u952E\u76D8\u6362\u4E86\u6392\u6570 / \u5F00\u5408 = \u91CD\u5224\u5E95\u5EA7\u8D34\u5E95\u8FD8\u662F\u8D34\u53F3\u8FB9\n/** \u53C2\u8003\u7A97\u5BFC\u5165\u7684\u95EE\u8BE2\uFF08\u5E93 0.4.0\uFF1A\u8D85\u8FC7 1 MB \u7684\u56FE\u7247 / \u97F3\u9891 / \u89C6\u9891\uFF09\uFF1A\u5B58\u8FDB\u6B4C\u91CC / \u538B\u4E00\u4E0B\uFF08\u7EA6 X MB\uFF09/ \u53EA\u653E\u5185\u5B58 / \u7B97\u4E86\u3002\n *  user\u300C\u5E94\u7528\u5185\u5C0F\u9762\u677F \u5982\u679C\u652F\u6301\u538B\u7F29\u7684\u8BDD\u5E94\u8BE5\u6709\u538B\u7F29\u9009\u9879\u548C\u4F30\u8BA1\u300D\uFF1Bq.suggestRam = \u300C\u53EA\u653E\u5185\u5B58\u300D\u6392\u7B2C\u4E00\u3001\u8BF4\u4E3A\u4EC0\u4E48\u2014\u2014\u8D85\u8FC7 4 MB\uFF08user \u9009 B\uFF1A\u300C\u8FD9\u91CC\u53EF\u80FD\u662F\u5168\u5BB6\u65CF\u4ED3\u6211\u4EEC\u552F\u4E00\u4E00\u4E2A\u771F\u7684\u9700\u8981nudge\u7528\u6237\u300D\uFF09\uFF0C\n *  \u6216\u8005\u662F\u97F3\u9891 / \u89C6\u9891\uFF08\u5E93 0.5.0 \u8D77\u9ED8\u8BA4\u53EA\u653E\u5185\u5B58\u3001\u5F53\u6B21\u6709\u6548\uFF1Buser 2026-10-21\u300C\u97F3\u89C6\u9891\u5E94\u8BE5\u662F\u5F53\u6B64\u6709\u6548\u300D\uFF1BMoonSinger \u7167\u9ED8\u8BA4\u4E0D\u8986\u76D6\uFF0C\u8981\u4E0D\u8981\u4F8B\u5916 = wishlist W-44\uFF09\u3002 */\nasync function askRefImport(q: RefImportQuestion): Promise<RefImportChoice> {\n  const mb = (n: number) => `${(n / 1024 / 1024).toFixed(1)} MB`, what = q.kind === \"audio\" ? \"mp3 128k\" : \"PNG 256 \u8272\u3001\u957F\u8FB9\u6700\u591A 2048\", av = q.kind === \"audio\" || q.kind === \"video\";\n  const big = q.bytes > RAM_ABOVE;\n  const smaller = q.canCompress && (q.estimate === null || q.estimate < q.bytes * 0.9);\n  const keep: Choice<RefImportChoice> = { label: `\u5B58\u8FDB\u6B4C\u91CC\uFF08${mb(q.bytes)}\uFF09`, value: \"keep\" };\n  const zip: Choice<RefImportChoice> = { label: q.estimate === null ? `\u538B\u4E00\u4E0B\u518D\u5B58\uFF08${what}\uFF09` : `\u538B\u4E00\u4E0B\u518D\u5B58\uFF08\u7EA6 ${mb(q.estimate)}\uFF09`, value: \"compress\" };\n  const ram: Choice<RefImportChoice> = { label: q.suggestRam ? \"\u53EA\u653E\u5185\u5B58\uFF08\u63A8\u8350\uFF09\" : \"\u53EA\u653E\u5185\u5B58\uFF08\u4E0D\u5B58\u8FDB\u6B4C\u91CC\uFF09\", value: \"ram\" };\n  const msg = `\u300C${q.name}\u300D${mb(q.bytes)}\u3002\u53C2\u8003\u7A97\u91CC\u7684\u4E1C\u897F\u8DDF\u7740\u6B4C\u4E00\u8D77\u5B58\u3001\u4E00\u8D77\u540C\u6B65\u3002` +\n    (q.canCompress && !smaller ? `\u538B\u4E86\u4E5F\u4E0D\u4F1A\u66F4\u5C0F\uFF0C\u5C31\u4E0D\u5217\u4E86\u3002` : smaller ? `\u538B\u4E00\u4E0B = ${what}\u3002` : \"\") +\n    `\u53EA\u653E\u5185\u5B58 = \u8FD9\u6B21\u6253\u5F00\u80FD${q.kind === \"audio\" ? \"\u542C\" : \"\u770B\"}\uFF0C\u4E0D\u5B58\u8FDB\u6B4C\u91CC\uFF1B\u4E0B\u6B21\u6253\u5F00\u662F\u4E2A\u7A7A\u4F4D\uFF0C\u628A\u540C\u4E00\u4E2A\u6587\u4EF6\u62D6\u8FDB\u6765\u5C31\u8865\u4E0A\u3002` +\n    (q.suggestRam ? (big ? `\u8D85\u8FC7 4 MB \u7684\uFF0C\u5B58\u8FDB\u53BB\u8FD9\u9996\u6B4C\u4F1A\u5927\u8FD9\u4E48\u591A\u3001\u540C\u6B65\u4E5F\u6162\uFF0C\u6240\u4EE5\u5148\u63A8\u8350\u53EA\u653E\u5185\u5B58\u3002` : `\u97F3\u9891 / \u89C6\u9891\u9ED8\u8BA4\u53EA\u653E\u5185\u5B58\uFF08\u8FD9\u6B21\u6253\u5F00\u6709\u6548\uFF09\uFF1B\u8981\u8DDF\u7740\u6B4C\u8D70\u5C31\u9009\u300C\u5B58\u8FDB\u6B4C\u91CC\u300D\u3002`) : \"\");\n  const list = q.suggestRam ? [{ ...ram, primary: true }, ...(smaller ? [zip] : []), keep] : [{ ...keep, primary: true }, ...(smaller ? [zip] : []), ram];\n  return (await openChoiceSheet(q.kind === \"audio\" ? \"\u8FD9\u6BB5\u97F3\u9891\u6709\u70B9\u5927\" : q.kind === \"video\" ? \"\u8FD9\u6BB5\u89C6\u9891\u6709\u70B9\u5927\" : \"\u8FD9\u5F20\u56FE\u6709\u70B9\u5927\", msg, list)) ?? \"cancel\";\n}\n\nnew ResizeObserver(() => refHost.relayout()).observe(bar);\ninstallPlatformGuards([scoreEl, padEl], { zoom: (d) => (d === 0 ? view.zoomReset() : d > 0 ? view.zoomIn() : view.zoomOut()) });   // iPad\uFF1A\u957F\u6309\u653E\u5927\u955C / \u7CFB\u7EDF\u83DC\u5355 / \u53CC\u51FB\u7F29\u653E\uFF08\u7167 WeebPaint\uFF09\uFF1BCtrl / \u2318 + = / \u2212 / 0 = \u8C31\u9762\u7F29\u653E\uFF082026-10-21\uFF09\n\n// \u2500\u2500 PWA \u58F3\uFF082026-10-07 \u51FA\u751F\uFF09\uFF1Aservice worker + \u56DB\u8DEF\u66F4\u65B0\u68C0\u6D4B\uFF1B\u6709\u65B0\u7248\u4E0D\u5F3A\u5237\uFF0C\u9876\u4E0A\u51FA\u4E00\u6761\u300C\u6709\u65B0\u7248\u672C \u00B7 \u5237\u65B0\u300D\uFF08\u4E0D\u7528\u7CFB\u7EDF\u5F39\u7A97\uFF09 \u2500\u2500\u2500\u2500\u2500\nconst shell = initPwaShell({ onUpdateAvailable: () => { diagNote(\"sw\", \"update available\"); showUpdateBar(); } });\nfunction showUpdateBar(): void {\n  if (document.getElementById(\"updateBar\")) return;\n  const el = document.createElement(\"div\");\n  el.id = \"updateBar\"; el.className = \"update-bar\";\n  el.innerHTML = `<span>\u6709\u65B0\u7248\u672C</span><button class=\"btn primary\" data-v=\"reload\">\u5237\u65B0</button><button class=\"btn\" data-v=\"later\">\u5F85\u4F1A\u513F</button>`;\n  el.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (v === \"reload\") void shell.reload(); else if (v === \"later\") el.remove();\n  });\n  document.body.append(el);\n}\n\n\n// \u9876\u680F\u53EA\u6709\u4E00\u884C\uFF082026-10-07 \u7ACB\uFF1B2026-10-08 \u91CD\u7406\uFF0Cuser\u300C\u770B\u4E00\u4E0B weebpaint \u548C wxhw\uFF0Cwxhw \u5C31\u662F\u5DE6\u8FB9\u4E00\u4E2A\u5E93\u7684\u56FE\u6807\uFF0C\u7136\u540E\u662F\u6587\u4EF6\u540D\u975E\u6309\u94AE\u5C31\u662F\u4E00\u4E2A\u80FD\u6309\u7684\u5B57\u2026\u6700\u53F3\u8FB9\u662F\u52A0\u5BC6\uFF0Csmart save \u548C\u4E09\u6761\u6760\u300D\n//   \u300C\u52A0\u5BC6\u548C smart save button \u7684 status \u5FC5\u987B\u6C38\u8FDC\u53EF\u89C1\u300D\uFF09\uFF1A\u5DE6 = \u6B4C\u5E93\u56FE\u6807 + \u6587\u4EF6\u540D\uFF08\u80FD\u6309\u7684\u5B57 = \u6587\u4EF6\u83DC\u5355\uFF09\uFF1B\u53F3 = \u52A0\u5BC6\u72B6\u6001 / smart save\uFF08\u72B6\u6001\u5373\u6309\u94AE\uFF09/ \u4E09\u6761\u6760\u3002\n//   \u8D70\u5E26\uFF08\u5531 / \u5F39 / \u5F55\u97F3\u5BA4 / \u8FDB\u5EA6\uFF09\u5728\u9876\u680F\u4E2D\u95F4\uFF082026-10-08 \u8BD5\u8FC7\u6302\u80F6\u56CA\uFF0Cuser\u300C\u770B\u7740\u788D\u773C\uFF0C\u8FD8\u662F\u6536\u5230\u9876\u680F\u91CC\u9762\u5427\u300D\uFF09\u3002\n//   \u952E\u76D8\u5F00\u5173\u4E0D\u5728\u9876\u680F\uFF1Apad \u81EA\u5DF1\u6709\u300C\u6536\u8D77\u300D\uFF0C\u6536\u8D77\u540E\u5C4F\u5E55\u6700\u4E0B\u9762\u4E00\u7C92\u300C\u952E\u76D8\u300Dtab \u518D\u5F39\u51FA\u6765\uFF1B\u70B9\u8C31\u4E5F\u5F39\uFF08user\u300C\u8F6F\u952E\u76D8\u7684 toggle \u53EF\u4EE5\u653E\u5728\u5C4F\u5E55\u6700\u4E0B\u9762\u300D\uFF09\u3002\n/** |\u25B6 \u7684\u8BF4\u660E\uFF08\u9876\u680F\u548C\u5E95\u5EA7\u8FB9\u4E0A\u90A3\u4E2A\u4E00\u6837\uFF09\u3002\u22EF \u6536\u8FDB\u957F\u6309 / \u53F3\u952E\uFF08v0.10.20\uFF1Buser\u300Cplay\u7684...\u6536\u5230\u957F\u6309\u548C\u53F3\u952Eplay\u91CC\u9762 / \u7136\u540E\u9876\u680F\u53EA\u5355\u653E\u4E00\u4E2A\u4E00\u6837\u7684play\u300D\uFF09\u3002 */\nconst PLAY_TITLE = \"\u4ECE\u8D77\u70B9\u653E / \u505C\uFF08\u7A7A\u683C\uFF09\uFF1B\u8FDE\u6309\u4E24\u4E0B = \u4ECE\u5934\u653E\u3002\u957F\u6309 / \u53F3\u952E = \u63A5\u7740\u653E / \u81EA\u52A8\u7FFB / \u5FAA\u73AF / \u4ECE\u5934\u653E / \u63A5\u7F1D\u3002\u8D77\u70B9 = \u957F\u6309 / \u53F3\u952E\u8C31\u9762\u300C\u4ECE\u8FD9\u513F\u653E\u300D\u632A\";\nbar.innerHTML =\n  `<div class=\"tb-left\"><button id=\"libBtn\" class=\"btn tb-lib\" title=\"\u6B4C\u5E93\uFF1A\u8FD9\u53F0\u8BBE\u5907\u4E0A\u7684\u6B4C\uFF0C\u767B\u5F55\u5FAE\u8F6F\u8D26\u53F7\u540E\u540C\u6B65\u5230 OneDrive\uFF08\u5E94\u7528\u6587\u4EF6\u5939\uFF09\"><svg class=\"ico\"><use href=\"#album\"/></svg></button>` +\n  `<button id=\"fileBtn\" class=\"doc-name\" title=\"\u6587\u4EF6\u540D \u00B7 \u70B9\u4E86\u6539\u540D\"><span id=\"docTitle\" class=\"title\">\u672A\u547D\u540D</span></button>` +\n  `</div>` +\n  `<div class=\"tb-mid\" id=\"transport\"><button id=\"playBtn\" class=\"btn play-btn\" title=\"${PLAY_TITLE}\"><svg class=\"ico\"><use href=\"#play-from-start\"/></svg></button></div>` +\n  `<div class=\"tb-right\"><button id=\"midiBtn\" class=\"btn tb-midi\" hidden>MIDI<span class=\"midi-dot\"></span></button>` +\n  `<button id=\"lockBtn\" class=\"btn tb-lock\" title=\"\u8FD9\u9996\u6B4C\u6CA1\u52A0\u5BC6\uFF08MoonSinger \u8FD9\u4E00\u7248\u8FD8\u4E0D\u52A0\u5BC6\uFF09\"><svg class=\"ico ico-sm\"><use href=\"#unlock\"/></svg></button>` +\n  `<button id=\"saveBtn\" class=\"btn save-btn\" title=\"\u5B58\"><svg class=\"ico\"><use href=\"#floppy-disk\"/></svg></button>` +\n  `<button id=\"setBtn\" class=\"btn\" title=\"\u83DC\u5355\uFF1A\u65B0\u5EFA / \u6253\u5F00 / \u5BFC\u51FA / \u5C01\u9762 / \u58F0\u97F3\u4E0E\u7F72\u540D / \u8BBE\u7F6E\"><svg class=\"ico\"><use href=\"#menu\"/></svg></button></div>`;   // \u4E09\u6761\u6760 = \u83DC\u5355\uFF08\u540C CatsUp \u9876\u680F\uFF1B\u6273\u624B\u7559\u7ED9\u300C\u914D\u7F6E\u8FD9\u4E00\u6837\u4E1C\u897F\u300D\uFF0C\u5982\u7EB8\u53F3\u4E0A\u89D2\uFF09\n/** \u6E32\u67D3\u8FDB\u5EA6\u6761\uFF08\u9876\u680F\u5E95\u8FB9\uFF1B\u64AD\u653E\u7684\u51C6\u5907\u548C mp3 \u5BFC\u51FA\u5171\u7528 renderMix \u8FD9\u4E00\u6761\u8DEF\uFF09\u3002\u9876\u680F\u7684 HTML \u5199\u597D\u4E4B\u540E\u518D\u6302\uFF08\u4E0A\u9762 bar.innerHTML = \u2026 \u4F1A\u51B2\u6389\u5148\u6302\u7684\uFF09\u3002 */\nconst renderBar = new RenderProgress(bar);\nconst stageEl = $(\"stage\");\nconst busMuted = new Set<string>();   // \u9759\u97F3\u7684\u6DF7\u97F3\u8F68\uFF08v0.10.35\uFF0C\u89C6\u56FE\u6001\uFF1A\u4E0D\u8FDB\u6587\u4EF6\u3001\u4E0D\u8FDB undo\uFF1B\u6362\u6B4C\u6E05\u7A7A\uFF09\nlet dockedSide = 0;\n// \u2500\u2500 \u5E95\u5EA7\u8D34\u5E95\u8FD8\u662F\u8D34\u53F3\u8FB9\uFF082026-10-21 \u4E0B\u5348 user\u300C\u5B9E\u5728\u505A\u4E0D\u5230\u518D\u8D34\u53F3\u8FB9\u3002\u6BD4\u5982\u53EA\u80FD\u770B\u5230\u4E00\u884C\u8C31\u5B50\u300D\uFF09\uFF1A\u8D34\u5E95\u540E\u8C31\u9762\u5269\u7684\u9AD8\u770B\u4E0D\u5230\u4E24\u884C\u8C31 = \u8D34\u53F3\u8FB9\u3002\u5224\u65AD = workspace.ts sideDock\uFF08\u7EAF\u51FD\u6570\uFF09\uFF0C\u8FD9\u91CC\u53EA\u91CF\u6570\u3001\u5199 #stage \u7684 data-side\uFF1B\n//    CSS \u90A3\u4E00\u6863\u5168\u6302\u5728 #stage[data-side=\"right\"] \u4E0A\u3002\u91CF\uFF1A\u952E\u76D8\u8D34\u5E95\u65F6\u7684\u9AD8\uFF08\u9732\u7740\u5C31\u91CF\uFF1B\u5728\u53F3\u8FB9\u4E00\u680F\u65F6\u5148\u6309\u8D34\u5E95\u6446\u4E00\u4E0B\u518D\u91CF\uFF0C\u540C\u4E00\u5E27\u5185\u4E0D\u753B\uFF09+ \u8D34\u5E95\u65F6\u8C31\u9762\u81EA\u52A8\u5927\u5C0F\u4E00\u683C\u51E0 px\uFF08view.spaceAt\uFF0C\u548C\u7F29\u653E\u65E0\u5173\uFF09\u3002 \u2500\u2500\nlet padBottomCache = 0;\nconst PAD_BOTTOM_FALLBACK = 364;   // \u9ED8\u8BA4\u6392\u6570\u65F6\u91CF\u5230\u7684\uFF08\u6CA1\u91CF\u8FC7\u65F6\u7528\uFF09\nfunction padBottomH(): number {\n  if (padEl.hidden) return padBottomCache || PAD_BOTTOM_FALLBACK;\n  const was = stageEl.dataset.side; if (was) delete stageEl.dataset.side;\n  const h = padEl.offsetHeight; if (was) stageEl.dataset.side = was;\n  if (h > 0) padBottomCache = h;\n  return h || padBottomCache || PAD_BOTTOM_FALLBACK;\n}\nfunction syncDock(): void {\n  const side = sideDock(stageEl.clientWidth, stageEl.clientHeight, padBottomH(), view.spaceAt(stageEl.clientWidth));\n  if (side === sideDocked(stageEl)) return;\n  if (side) stageEl.dataset.side = \"right\"; else delete stageEl.dataset.side;\n  studio.relayout(); view.render(); refHost.relayout();\n}\naddEventListener(\"resize\", () => syncDock());   // \u6A2A\u5C4F\u5E95\u5EA7\u5728\u7684\u65F6\u5019\uFF0C\u821E\u53F0\u91CC\u8C31\u9762\u4EE5\u5916\u5360\u7684\u5BBD\uFF08px\uFF1B\u6392\u8C31\u5BBD\u5EA6\u4E0D\u8DDF\u7740\u5E95\u5EA7\u5F00\u5408\u8DF3\uFF0C\u89C1 view \u7684 layoutWidth\uFF1Bv0.10.33\uFF09   // \u8D70\u5E26\uFF08\u5531 / \u5F39 / \u5F55\u97F3\u5BA4\uFF09\u5728\u9876\u680F\u4E2D\u95F4\uFF08\u80F6\u56CA\u8BD5\u8FC7\u4E00\u8F6E\uFF0Cuser 2026-10-08\u300C\u64AD\u653E\u5668\u80F6\u56CA\u770B\u7740\u788D\u773C\uFF0C\u8FD8\u662F\u6536\u5230\u9876\u680F\u91CC\u9762\u5427\u300D\uFF09\nconst attr = (s: string) => s.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\");\nconst padTab = document.createElement(\"button\"); padTab.id = \"padTab\"; padTab.className = \"btn pad-tab\"; padTab.hidden = true; padTab.title = \"\u952E\u76D8\uFF08pad\uFF09\";\npadTab.innerHTML = `<svg class=\"ico\"><use href=\"#grid\"/></svg><span>\u952E\u76D8</span>`;\n// \u5E95\u5EA7\u8FB9\u4E0A\u7684\u5C0F\u6761\uFF08v0.10.20\uFF09\uFF1A\u6A21\u5F0F\u56DB\u4E2A\u94AE + |\u25B6 + \u64A4\u9500 / \u91CD\u505A + \u6536\u8D77\u540E\u53EB\u56DE\u952E\u76D8\uFF0C\u8D34\u5728\u952E\u76D8\u8FB9\u4E0A\uFF08\u7AD6\u5C4F = \u952E\u76D8\u5DE6\u4E0A\u89D2\u5F80\u4E0A\u6302\uFF1B\u6A2A\u5C4F = \u952E\u76D8\u5DE6\u8FB9\u7AD6\u7740\u6302\uFF1B\u952E\u76D8\u6536\u8D77 = \u8D34\u5C4F\u5E55\u8FB9\uFF09\u2014\u2014\n//   \u6309\u952E\u76D8\u7684\u65F6\u5019\u4E1C\u897F\u5C31\u5728\u624B\u8FB9\uFF0C\u9F20\u6807\u4E0D\u7528\u4E0A\u4E0B\u8DD1\uFF08user\u300C\u97F3\u7B26\u8BCD\u542C\u90A3\u4E2A\u5C0F\u9762\u7248\u53D8\u6210\u9760\u7740\u952E\u76D8 / \u52A0\u4E00\u4E2A\u6309\u4E00\u4E0B\u5F39\u51FA\u952E\u76D8\u7684\u94AE\u2026\u6240\u4EE5\u7AD6\u5C4F\u7684\u65F6\u5019\u5C31\u662F\u5DE6\u4E0B\u89D2\uFF0C\u62C9\u7740\u952E\u76D8\u7684\u5DE6\u4E0A\u89D2 / \u6A2A\u5C4F\u7684\u65F6\u5019\u53D8\u6210\u7AD6\u6392\u53EF\u4EE5\u5417 /\n//   \u8FD9\u6837\u6309\u952E\u76D8\u7684\u65F6\u5019\u4E1C\u897F\u5C31\u5728\u624B\u8FB9 / \u7136\u540E\u8D70\u5E26\u63A7\u5236\u4E5F\u653E\u8FD9\u4E2A\u9762\u7248\u4E0A\u9762 / \u5C31\u662F play/pause undo redo \u97F3\u7B26\u8BCD\u542C\u300D\u300C\u5C24\u5176\u662F\u6A21\u5F0F\u6761\u7684\u4F4D\u7F6E\uFF08\u8FD9\u4E2A\u5176\u5B9E\u86EE\u91CD\u8981\u7684\uFF0C\u4E0D\u7136\u9F20\u6807\u4E0A\u4E0B\u8DD1\uFF09\u300D\uFF09\u3002\u4F4D\u7F6E\u5168\u5728 CSS\uFF08grid \u533A\u57DF\u5B9A\u4F4D\uFF09\u3002\nconst dockTab = document.createElement(\"div\"); dockTab.className = \"dock-tab\"; dockTab.setAttribute(\"role\", \"toolbar\");\ndockTab.innerHTML = `<span class=\"mode-seg\" role=\"tablist\" title=\"\u6A21\u5F0F\uFF1A\u8FD9\u4E00\u4E0B\u70B9\u7684\u662F\u54EA\u4E00\u5C42\">${MODE_BAR.map((m) => `<button class=\"btn\" data-mode=\"${m}\" role=\"tab\" title=\"${attr(MODE_TITLE[m])}\">${MODE_LABEL[m]}</button>`).join(\"\")}</span>` +\n  `<span class=\"dock-tr\"><button id=\"dockPlay\" class=\"btn play-btn\" title=\"${PLAY_TITLE}\"><svg class=\"ico\"><use href=\"#play-from-start\"/></svg></button>` +\n  `<button id=\"undoBtn\" class=\"btn\" title=\"\u64A4\u9500\uFF08Ctrl / \u2318+Z\uFF09\" disabled><svg class=\"ico\"><use href=\"#arrow-undo\"/></svg></button><button id=\"redoBtn\" class=\"btn\" title=\"\u91CD\u505A\uFF08Ctrl / \u2318+Shift+Z\uFF09\" disabled><svg class=\"ico\"><use href=\"#arrow-redo\"/></svg></button></span>`;\ndockTab.append(padTab);\nstageEl.append(dockTab);\npadTab.addEventListener(\"click\", () => showPad(ws.mode === \"listen\" ? !studio.isOpen : padEl.hidden));\n// \u6302\u7B7E\uFF08v0.10.3\uFF09\uFF1A\u6A21\u5F0F\u56DB\u4E2A\u94AE + \u770B\u54EA\u4E00\u6BB5 + \u770B\u54EA\u4F4D\u6B4C\u624B\uFF0C\u4ECE\u9876\u680F\u5E95\u4E0B\u5F80\u4E0B\u6302\u3001\u6D6E\u5728\u8C31\u4E0A\uFF08\u53EF\u4EE5\u6321\u4F4F\u8C31\uFF09\u3002\n//   user 2026-10-10\u300C\u6A21\u5F0F\u5207\u6362\u4E0D\u662F\u4E0B\u62C9\uFF0C\u56DE\u5230\u4E4B\u524D\u7684\u56DB\u4E2A\u6392\u4E00\u8D77\u7684\u6309\u94AE\uFF0C\u7136\u540E\u6A21\u5F0F\u5207\u6362\uFF0C\u66F2\u6BB5\u548C\u58F0\u90E8\u9009\u62E9\u8FD9\u4E09\u4E2A\u4E0D\u662F\u5728\u9876\u680F\uFF0C\u800C\u662F\u9876\u680F\u4E0B\u9762\u521B\u5EFA\u4E00\u4E2A\u7C7B\u4F3Ctab\u7684\u5F80\u4E0B\u7684\u4E1C\u897F\uFF0C\u53EF\u4EE5\u906E\u6321\u5C4F\u5E55\u300D\n//   \uFF08v0.10.2 \u90A3\u7248 = \u4E09\u4E2A\u4E0B\u62C9\u6324\u5728\u9876\u680F\u5DE6\u4E0A\u89D2\uFF0Cuser \u539F\u8BDD\u300C\u6211\u5E0C\u671B\u6709\u4E00\u4E2A\u5FEB\u901F\u9009\u62E9\u770B\u5168\u90E8\u6216\u8005\u54EA\u4E2A\u66F2\u6BB5\uFF0C\u4EE5\u53CA\u5FEB\u901F\u770B\u5168\u90E8\u6216\u8005\u54EA\u4E2A\u58F0\u90E8\u7684\u4E0B\u62C9\u6846\u300D\u300C\u6A21\u5F0F\u6536\u5230\u4E0B\u62C9\u6846\u91CC\u9762\u300D\uFF09\u3002\nconst viewTab = document.createElement(\"div\"); viewTab.className = \"view-tab\";\nviewTab.innerHTML = `<select id=\"paperSel\" class=\"vt-sel\" title=\"\u770B\u54EA\u4E00\u6BB5\uFF1A\u5168\u90E8 / \u53EA\u770B\u8FD9\u4E00\u6BB5\"></select><select id=\"partSel\" class=\"vt-sel\" title=\"\u770B\u54EA\u4F4D\u6B4C\u624B\uFF1A\u5168\u90E8 / \u53EA\u770B\u8FD9\u4E00\u4F4D\"></select>`;\nstageEl.append(viewTab);\n// \u9009\u533A\u6761\uFF082026-10-08 \u6539\u7684\u624B\u611F\uFF1Bsrc/ui/sel-bar.ts\uFF09\uFF1A\u6709\u9009\u533A\u65F6\u6302\u5728\u80F6\u56CA\u4E0B\u9762\uFF1B\u526A\u8D34\u677F\u4E24\u5C42 = app \u5185 token\uFF08clip\uFF09+ \u7CFB\u7EDF\u526A\u8D34\u677F\u4E00\u884C\u7B80\u8C31\u6587\u5B57\uFF08clipText\uFF09\nconst selBar = new SelBar(stageEl, { verb: (v) => { void selVerb(v); } });\nlet clip: Token[] | null = null, clipText = \"\", selSig = \"\";\nlet chromeReady = false;\n/** \u80F6\u56CA / \u952E\u76D8 tab / \u9009\u533A\u6761\u8DDF\u7740\u8C01\u5728\u6700\u4E0A\u9762\u8D70\uFF1A\u6B4C\u5E93\u5F00\u7740\u90FD\u85CF\uFF1B\u627E\u4EBA\u89C6\u56FE\u91CC\u952E\u76D8 tab \u7167\u6837\u9732\uFF08\u6536\u8D77\u4E86\u80FD\u53EB\u56DE\u6765\uFF1Buser 2026-10-08\u300C\u97F3\u8272\u9884\u89C8\u4E5F\u5E94\u8BE5\u80FDtoggle\u952E\u76D8\uFF0C\u514D\u5F97\u6CA1\u5F39\u51FA\u6765\u300D\uFF09\u3001\n *  \u9009\u533A\u6761\u85CF\uFF1B\u5F55\u97F3\u5BA4\u91CC\u80F6\u56CA\u7559\u7740\uFF08\u25B6 / \u7A7A\u683C\u90FD\u80FD\u64AD\uFF09\u3001tab \u85CF\u3002 */\n/** \u6302\u7B7E\u4E0A\u300C\u770B\u54EA\u4E00\u6BB5 / \u770B\u54EA\u4F4D\u6B4C\u624B\u300D\u4E24\u4E2A\u4E0B\u62C9\uFF08v0.10.2 \u8D77\uFF1Bv0.10.3 \u642C\u8FDB\u6302\u7B7E\uFF09\uFF1A\u9009\u9879\u8DDF\u7740\u6B4C\uFF08\u7EB8 / \u6B4C\u624B\u7684\u540D\u5B57\uFF09\u91CD\u753B\uFF0C\u503C\u8DDF\u7740\u89C6\u56FE\uFF08\u672C\u6BB5 / \u5168\u90E8\u3001\u53EA\u770B\u5B83\uFF09\u3002 */\nlet topSelsSig = \"\";\nfunction renderTopSels(): void {\n  const ps = $(\"paperSel\") as HTMLSelectElement | null, qs = $(\"partSel\") as HTMLSelectElement | null; if (!ps || !qs) return;\n  const labels = partLabels(D.st.song, D.extras), only = D.st.song.parts.filter((p) => pv(p.id).only);\n  const paperOpts = [[\"all\", \"\u5168\u90E8\u66F2\u6BB5\"], ...D.st.song.papers.map((p, k) => [p.id, `${p.name || `\u7B2C ${k + 1} \u6BB5`}${p.hidden ? \"\uFF08\u9690\u85CF\uFF09\" : \"\"}`])] as const;\n  const partOpts = [[\"all\", \"\u5168\u90E8\u6B4C\u624B\"], ...D.st.song.parts.map((p, k) => [p.id, labels[k] ?? p.id])] as const;\n  const sig = JSON.stringify([paperOpts, partOpts]);\n  if (sig !== topSelsSig) {\n    topSelsSig = sig;\n    ps.innerHTML = paperOpts.map(([v, l]) => `<option value=\"${esc(v)}\">${esc(l)}</option>`).join(\"\");\n    qs.innerHTML = partOpts.map(([v, l]) => `<option value=\"${esc(v)}\">${esc(l)}</option>`).join(\"\");\n  }\n  ps.value = viewScope === \"all\" ? \"all\" : D.st.at.paper;\n  qs.value = only.length === 1 ? only[0].id : \"all\";\n  ps.hidden = D.st.song.papers.length < 2; qs.hidden = D.st.song.parts.length < 2;   // \u53EA\u6709\u4E00\u6BB5 / \u4E00\u4F4D = \u4E0D\u7528\u9009\n}\nfunction updateChrome(): void {\n  if (!chromeReady) return;\n  const over = finder.isOpen || instShown() || (gallery?.isOpen() ?? false);   // \u4E50\u5668\u9875\u5F00\u7740\uFF1A\u9009\u533A\u6761\u4E5F\u6536\uFF08\u4E0D\u7136\u76D6\u4F4F\u4E50\u5668\u9875\u9876\u6761\u7684\u300C\u2190 \u8C31\u300D\uFF09\n  dockTab.hidden = over;   // \u5E95\u5EA7\u8FB9\u4E0A\u7684\u5C0F\u6761 / \u6302\u7B7E\uFF1A\u4E50\u5668\u9875 / \u76EE\u5F55 / \u6B4C\u5E93\u76D6\u7740\u8C31\u65F6\u6536\u8D77\n  // \u5C0F\u6761\u4E0A\u7684\u300C\u952E\u76D8\u300D= \u4E00\u76F4\u5728\u7684\u5F00\u5173\uFF08v0.10.21\uFF1Buser\u300C\u5C0F\u5DE5\u5177\u6761\u4E5F\u6709\u952E\u76D8\u5C55\u5F00\u7684\u529F\u80FD\u300D\uFF09\uFF1A\u5F00\u7740\u4EAE\u3001\u70B9 = \u6536\u8D77\uFF1B\u6536\u7740\u70B9 = \u5F00\uFF08\u300C\u542C\u300D= \u6DF7\u97F3\u53F0\uFF09\u3002\u300C\u8BCD\u300D\u6CA1\u6709\u952E\u76D8 = \u4E0D\u9732\n  const dockOpen = ws.mode === \"listen\" ? studio.isOpen : !padEl.hidden;\n  padTab.hidden = ((gallery?.isOpen() ?? false) && !finderShown()) || (!hasKeys(ws.mode) && ws.mode !== \"listen\");\n  padTab.classList.toggle(\"is-on\", dockOpen);\n  { const lab = ws.mode === \"listen\" ? \"\u6DF7\u97F3\u53F0\" : \"\u952E\u76D8\", sp = padTab.querySelector(\"span\"); if (sp && sp.textContent !== lab) sp.textContent = lab; padTab.title = `${ws.mode === \"listen\" ? \"\u6DF7\u97F3\u53F0\" : \"\u952E\u76D8\uFF08pad\uFF09\"}\uFF1A${dockOpen ? \"\u70B9 = \u6536\u8D77\" : \"\u70B9 = \u6253\u5F00\"}`; }\n  renderTopSels();   // \u300C\u8BCD / \u542C\u300D\u6CA1\u6709\u952E\u76D8\uFF1A\u4E0D\u9732\u300C\u952E\u76D8\u300Dtab\n  viewTab.hidden = over || (($(\"paperSel\") as HTMLSelectElement).hidden && ($(\"partSel\") as HTMLSelectElement).hidden);   // \u6302\u7B7E\u53EA\u5269\u770B\u54EA\u4E00\u6BB5 / \u54EA\u4F4D\uFF1A\u90FD\u4E0D\u7528\u9009 = \u4E0D\u6302\n  finder.setPadShown(!padEl.hidden);\n  document.querySelector(\".ip-pad\")?.classList.toggle(\"is-on\", !padEl.hidden);\n  const n = D.st.sel ? D.st.sel.to - D.st.sel.from : 0;\n  const sig = `${n}|${!!clip}|${over || studio.isOpen}`;\n  if (sig !== selSig) { selSig = sig; selBar.update(n, !!clip, over || studio.isOpen); }\n}\nfunction setClip(t: Token[]): void {\n  clip = t; clipText = toJianpu(t, fifthsAtSel(D.st));\n  void navigator.clipboard?.writeText?.(clipText).catch(() => undefined);   // \u7CFB\u7EDF\u526A\u8D34\u677F\u90A3\u4E00\u5C42\uFF1A\u80FD\u8D34\u8FDB\u804A\u5929\uFF1B\u4E0D\u7ED9\u5199\u5C31\u53EA\u6709 app \u5185\u90A3\u5C42\n  updateChrome();\n}\n/** \u8D34\uFF1A\u7CFB\u7EDF\u526A\u8D34\u677F\u91CC\u6709\u522B\u5904\u6765\u7684\u7B80\u8C31\u6587\u5B57\u5C31\u7528\u5B83\uFF08\u548C\u81EA\u5DF1\u521A\u5199\u7684\u4E00\u6837 = app \u5185\u90A3\u4EFD\u539F token\uFF0C\u8FDE\u6B4C\u8BCD / \u8FDE\u97F3\u90FD\u5728\uFF09\uFF1B\u8BFB\u4E0D\u5230 / \u8BFB\u4E0D\u61C2 = app \u5185\u7684\u3002 */\nasync function pasteNow(): Promise<void> {\n  let sys = \"\"; try { sys = (await navigator.clipboard?.readText?.()) ?? \"\"; } catch { /* \u6D4F\u89C8\u5668\u4E0D\u7ED9\u8BFB\uFF1A\u7528 app \u5185\u7684 */ }\n  let toks: Token[] | null = sys && sys.trim() !== clipText.trim() ? fromJianpu(sys, fifthsAtSel(D.st)) : null;\n  if (!toks) toks = clip;\n  if (!toks) { info(sys ? \"\u526A\u8D34\u677F\u91CC\u7684\u4E0D\u662F\u7B80\u8C31\uFF08\u50CF 1 2 3 | 5 - - \u8FD9\u6837\u7684\u624D\u8BA4\uFF09\" : \"\u526A\u8D34\u677F\u91CC\u6CA1\u6709\u4E1C\u897F\"); return; }\n  update(pasteTokens(D.st, toks)); info(`\u8D34\u4E86 ${toks.length} \u4E2A`);\n}\nasync function selVerb(v: SelVerb): Promise<void> {\n  switch (v) {\n    case \"all\": update(selectAll(D.st)); break;\n    case \"copy\": { const t = copyTokens(D.st); if (t) { setClip(t); info(`\u590D\u5236\u4E86 ${t.length} \u4E2A`); } break; }\n    case \"cut\": { const r = cutTokens(D.st); if (r) { setClip(r.toks); update(r.st); info(`\u526A\u5207\u4E86 ${r.toks.length} \u4E2A`); } break; }\n    case \"paste\": await pasteNow(); break;\n    case \"transpose\": if (D.st.sel) openSelMenu(selBarAnchor()); break;   // \u9009\u533A\u83DC\u5355\uFF08\u79FB\u8C03 / \u8F6C\u8C03 / \u65F6\u503C\u2026\uFF1Buser\u300C\u4E0D\u8981\u7528keyboard\uFF0C\u800C\u662F\u4E00\u4E2A\u5C0F\u7684\u4E0A\u4E0B\u6587\u83DC\u5355\u300D\uFF09\n    case \"delete\": if (D.st.sel) update(apply(D.st, { k: \"delete\" })); break;\n    case \"clear\": if (D.st.sel) update(setCaret(D.st, D.st.sel.to)); break;\n    case \"forget\": clip = null; clipText = \"\"; updateChrome(); break;\n    // \u7B2C\u4E8C\u6392 = \u5FAE\u8C03\uFF08v0.10.1\uFF1Buser\u300C\u9009\u533A\u591A\u5FAE\u8C03\u540C\u610F\u300D\uFF09\uFF1A\u70B9\u4E86\u4E0D\u6536\u3001\u9009\u533A\u7559\u7740\uFF1B\u97F3\u9AD8\u53D8\u4E86\u54CD\u4E00\u4E0B\uFF08\u540C\u9009\u533A\u83DC\u5355\u7684\u79FB\u8C03\uFF09\n    case \"up\": case \"down\": if (D.st.sel) { update(apply(D.st, { k: \"step\", d: v === \"up\" ? 1 : -1 }, performance.now())); previewEdited(); } break;\n    case \"sharp\": case \"flat\": if (D.st.sel) { update(apply(D.st, { k: \"alter\", d: v === \"sharp\" ? 1 : -1 }, performance.now())); previewEdited(); } break;\n    case \"octUp\": case \"octDown\": if (D.st.sel) { update(apply(D.st, { k: \"octave\", d: v === \"octUp\" ? 1 : -1 }, performance.now())); previewEdited(); } break;\n    case \"half\": case \"double\": if (D.st.sel) { const nx = apply(D.st, { k: \"selscale\", f: v === \"half\" ? 0.5 : 2 }, performance.now()); if (nx === D.st) info(v === \"half\" ? \"\u518D\u77ED\u5C31\u6CA1\u6709\u8FD9\u79CD\u65F6\u503C\u4E86\" : \"\u518D\u957F\u5C31\u6CA1\u6709\u8FD9\u79CD\u65F6\u503C\u4E86\"); else update(nx); } break;\n    case \"dot\": if (D.st.sel) { const nx = toggleSelDot(D.st); if (nx === D.st) info(\"\u9009\u4E2D\u7684\u91CC\u9762\u6CA1\u6709\u80FD\u52A0\u9644\u70B9\u7684\u65F6\u503C\"); else update(nx); } break;\n  }\n  if (v !== \"transpose\") scoreEl.focus();\n}\nconfigureFloors({ toolbarBottom: () => bar.getBoundingClientRect().bottom });\n\n// \u2500\u2500 \u5F55\u97F3\u623F\uFF08src/engine/\uFF1A\u97F3\u9891\u7EBF\u7A0B\u91CC\u7684\u8D70\u5E26 / \u901A\u9053 / TinySoundFont / \u5143\u97F3\u91C7\u6837\u5668 / \u5757\u56DE\u653E\uFF1B\u6309\u952E\u8BD5\u542C\u4E5F\u8D70\u5B83\u7684\u901A\u9053\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//   \u66FF\u4EE3\u539F\u6765\u7684\u5143\u97F3\u91C7\u6837\u5668\uFF08\u4E3B\u7EBF\u7A0B WebAudio\uFF09\u548C\u5B9E\u65F6\u5408\u6210\u5668\uFF08gm-synth worklet\uFF09\u2014\u20142026-10-09 Claude Fable 5.1\uFF0C\u5B9E\u65F6\u8BD5\u542C\u5200 1\u3002\n//   \u8BD5\u542C\u8D70\u901A\u9053\u7684\u589E\u76CA / \u58F0\u50CF\u3001\u7ED5\u8FC7\u9759\u97F3 / \u72EC\u594F\u548C\u603B\u8F68\u9650\u5E45\uFF08user\u300C\u6309\u952E\u4E0D\u7BA1solomute\u540C\u610F\u300D\u300C\u9650\u5E45\u55EF\u300D\uFF09\uFF1B\u5149\u6807\u5904\u7684\u529B\u5EA6\u5F52\u5200 3\u3002\nconst engine = new StudioClient(() => singer.unlock(), new URL(`./${__STUDIO_WORKLET__}`, import.meta.url), new URL(\"../vendor/tsf/tsf-standalone.wasm\", import.meta.url));\nlet vowelsReady = false, vowelLoading: Promise<void> | null = null;\n/** \u5143\u97F3\u8868\u8FDB\u5F55\u97F3\u623F\uFF08\u53EA\u4E0B\u8F7D\u4E00\u6B21\uFF1B\u5931\u8D25\u4E86\u4E0B\u6B21\u91CD\u8BD5\uFF09\u3002user\u300C\u9009\u8FD9\u4E2A\u4E50\u5668\u5C31\u662F\u610F\u56FE\uFF0C\u7136\u540E\u7B2C\u4E00\u4E0B\u5C31\u54CD\u300D\u3002 */\nfunction ensureVowels(): Promise<void> { return (vowelLoading ??= loadVowelTable().then((t) => { engine.vowels(t); vowelsReady = true; }, (e) => { vowelLoading = null; throw e; })); }\n/** \u5149\u6807\u90A3\u4E00\u523B\u751F\u6548\u7684\u529B\u5EA6\uFF08\u548C\u653E\u7684\u65F6\u5019\u540C\u4E00\u4E2A\u72B6\u6001\u673A perform.ts dynLevels\uFF1A\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31 / \u6E10\u5230\u63D2\u503C\uFF1B\u6302\u5728\u97F3\u4E0A\u7684\u8BB0\u53F7\u4E0D\u7BA1\uFF09\u2014\u2014\u6309\u952E\u8BD5\u542C\u7528\uFF08\u5200 3\uFF1B\n *  user\u300C\u8F6F\u952E\u76D8\u8F93\u5165\u548C\u4E50\u8C31\u91CC\u778E\u5F39\u65F6\u80FD\u4E0D\u80FDrespect\u8FD9\u4E00\u8F68\u7684\u8868\u60C5\u8BB0\u53F7\u2026\u5C24\u5176\u662F\u97F3\u91CF\u300D\uFF09\u3002vel = MIDI \u529B\u5EA6 0\u20131\uFF08\u6709\u529B\u5EA6\u8868\u7684 SoundFont\uFF09\uFF1BdB = \u97F3\u91CF\uFF08\u6708\u8BFB / \u5143\u97F3\u7248 / \u65E7\u5019\u9009\uFF09\u3002\n *  \u5149\u6807\u5728\u4E24\u4E2A\u97F3\u4E4B\u95F4 = \u540E\u9762\u90A3\u4E2A\u97F3\u7684\u97F3\u5934\uFF1B\u5728\u7EB8\u5C3E = \u524D\u9762\u90A3\u4E2A\u97F3\u7684\u5C3E\u3002 */\nfunction dynAtCursor(role: string): { vel: number | null; dB: number } {\n  const tokens = tr(D.st), i = D.st.sel ? D.st.sel.from : D.st.caret, sp = activePerfSpec(D.extras, role);\n  const pick = (m: Map<number, { at0: number; at1: number }>) => { for (let k = i; k < tokens.length; k++) { const l = m.get(k); if (l) return l.at0; } for (let k = Math.min(i, tokens.length) - 1; k >= 0; k--) { const l = m.get(k); if (l) return l.at1; } return null; };\n  const dB = pick(dynLevels(tokens, undefined, sp.dynamicsDb, sp.dynamicsDb.mf ?? 0, sp.wedgeStepDb ?? MARK_DEFAULTS.wedgeStepDb)) ?? 0;\n  const vel = sp.dynamicsVel ? pick(dynLevels(tokens, undefined, sp.dynamicsVel, activeVelocity(D.extras, role) * 127, sp.wedgeStepVel ?? MARK_DEFAULTS.wedgeStepVel)) : null;\n  return { vel: vel === null ? null : Math.max(1, Math.min(127, vel)) / 127, dB };\n}\n/** \u6309\u952E\u8BD5\u542C\u73B0\u5728\u8BE5\u7528\u8C01\u51FA\u58F0\uFF1A\u627E\u4EBA\u89C6\u56FE = \u8BD5\u542C\u53F0\u4E0A\u7684\uFF08GS \u9884\u8BBE / \u6708\u8BFB\u5143\u97F3\uFF09\uFF1B\u8C31\u4E0A = \u5149\u6807\u6240\u5728\u90A3\u4F4D\uFF08SoundFont \u8D70\u5E93\uFF0C\u522B\u7684\u8D70\u5143\u97F3\uFF09\uFF0C\u8D70\u8FD9\u6761\u901A\u9053\u7684\u589E\u76CA / \u58F0\u50CF + \u5149\u6807\u5904\u7684\u529B\u5EA6\u3002 */\nfunction auditionTarget(): { inst: AuditionInst; key: (midi: number) => number; vel: number; gainDb: number; pan: number } | null {\n  const kana = HUM_KANA[D.st.song.hum ?? \"n\"];\n  if (finder.isOpen) {\n    const a = audition;\n    if (a) return { inst: { kind: \"sf\", sha: a.sha256, preset: engine.presetIndex(a.sha256, a.bank, a.program) }, key: (m) => sfKey(m, a), vel: SOUNDFONT_DEFAULTS.velocity, gainDb: 0, pan: 0 };\n    return { inst: { kind: \"vowel\", kana }, key: (m) => m, vel: 1, gainDb: 0, pan: 0 };\n  }\n  const part = D.st.song.parts.find((p) => p.id === D.st.at.part), ch = part ? channelOf(part) : { gainDb: 0, pan: 0 }, dyn = dynAtCursor(curRole());\n  // \u8C01\u51FA\u58F0\u3001\u600E\u4E48\u51FA = \u53F0\u4E0A\u90A3\u4F4D\u7684\u63D2\u4EF6\uFF08SoundFont \u8D70\u5E93 + sfKey\u3001\u4EBA\u58F0\u8D70\u5143\u97F3\u8868\uFF1BADR-0004\uFF09\uFF1B\u901A\u9053\u7684\u589E\u76CA / \u58F0\u50CF\u662F\u8F68\u7684\u4E8B\uFF0C\u80F6\u6C34\u52A0\n  const t = performerOf(engineNow())?.audition?.({ extras: D.extras, role: curRole(), kana, dyn, engine, ensureBank: () => { void prepareBank(); } });\n  return t ? { ...t, gainDb: ch.gainDb + t.gainDb, pan: ch.pan } : null;\n}\n/** \u6708\u8BFB\u7684\u6309\u952E\u8BD5\u542C\uFF08\u5F39 / \u5199\u97F3 / \u62D6\u97F3\u9AD8\u7684\u9884\u542C\uFF09= \u5143\u97F3\u8868\uFF08v0.10.43\uFF1Buser\u300C\u6708\u8BFB\u7684\u5373\u5174keyboard\u8FD8\u662F\u5361\u2026\u6211\u53D1\u73B0\u5B83\u8FD8\u662F\u6BCF\u6B21\u6309\u952E\u7684\u65F6\u5019\u7B97\u4E00\u4E0B\u300D\u300C\u6708\u8BFB\u9884\u89C8\u5E94\u8BE5\u662F\u6BCF\u79CD\u54FC\u6CD5\u53EA\u6709\u4E00\u4E2Acache\u300D\n *  \u300C\u800C\u4E0D\u662F\u4E00\u4E2A\u97F3\u9AD8\u4E00\u4E2A\u957F\u5EA6cache\u4E00\u4E0B\u300D\u300C\u9884\u89C8\u65F6\u8FD9\u6837\uFF0C\u4E0D\u8FC7\u64AD\u653E\u7684\u65F6\u5019\u8FD8\u662F\u5B8C\u5168\u7248\u7684\u300D\uFF09\uFF1A\u5B8C\u5168\u7248\u4E5F\u8D70 auditionTarget \u7684\u5143\u97F3\u90A3\u6761\u8DEF\u2014\u2014\u8868\u662F\u6708\u8BFB\u81EA\u5DF1\u79BB\u7EBF\u9884\u6E32\u7684\n *  \uFF08scripts/gen-preview-vowels.mjs\uFF1A\u6BCF\u79CD\u54FC\u6CD5 \u3089 / \u3093 / \u3046 / \u304A / \u3042 \u5404 7 \u4E2A\u951A\u97F3 A3\u2013D\u266F5\u3001\u9694\u5C0F\u4E09\u5EA6\uFF0C\u6309\u4F4F\u5FAA\u73AF\u98A4\u97F3\u6574\u5468\u671F\uFF09\uFF0C\u6309\u952E\u4E0D\u518D\u53BB worker \u73B0\u5531\u3002\u64AD\u653E\u7167\u65E7\u5B8C\u5168\u7248\u3002\n *  \u539F\u6765\uFF08\u5200 3\uFF0Cv0.9.5\u2013v0.10.42\uFF09\uFF1A\u6BCF\u6309\u4E00\u4E0B\u8BA9 worker \u53EA\u5531\u5149\u6807 / \u521A\u5199\u4E0B\u90A3\u4E2A\u5B57\u4E00\u79D2\u2014\u2014iPad \u4E0A\u4E00\u6761\u5DE5\u4F5C\u9053\u3001\u548C\u9884\u5531\u62A2\uFF0C\u6309\u952E\u5E38\u5E38\u8FDF\u5230\u3002 */\nconst sound = {\n  down: (p: Pitch, id = \"main\") => {\n    const t = auditionTarget(); if (!t) return; if (t.inst.kind === \"vowel\" && !vowelsReady) { void ensureVowels(); return; }\n    singer.unlock(); engine.auditionOn(id, t.inst, t.key(midiOf(p)), t.vel, t.gainDb, t.pan);\n  },\n  glide: (p: Pitch, id = \"main\") => { const t = auditionTarget(); if (t) engine.auditionGlide(id, t.key(midiOf(p))); },\n  up: (id = \"main\") => { engine.auditionOff(id); const n = chordVoices.get(id) ?? 0; for (let k = 1; k <= n; k++) engine.auditionOff(`${id}~${k}`); chordVoices.delete(id); },\n  allOff: () => { chordVoices.clear(); engine.auditionAllOff(); },\n};\n/** \u5531\u4E0B\u6807 i \u7684\u97F3\uFF1Bid = \u58F0\u97F3\u7684\u6765\u6E90\uFF08\u54EA\u6839\u624B\u6307 / \u54EA\u4E2A\u952E / \u8C31\u9762\uFF09\uFF0C\u590D\u97F3\uFF1A\u4E0D\u540C\u6765\u6E90\u540C\u65F6\u54CD\uFF0C\u540C\u4E00\u6765\u6E90\u65B0\u7684\u9876\u6389\u65E7\u7684\u3002 */\n/** \u54CD\u4E0B\u6807 i \u7684\u97F3\uFF1A\u548C\u5F26 = \u6574\u4E2A\u548C\u5F26\u4E00\u8D77\u54CD\uFF08v0.10.18\uFF1Buser\u300C\u53E0\u97F3\u7684\u65F6\u5019\u9884\u89C8\u7684\u662Fchord\u8FD8\u662F\u4E4B\u524D\u7684\u65E7\u97F3\u554A\uFF1F\u300D\u2014\u2014\u539F\u6765\u53EA\u54CD t.pitch \u90A3\u4E00\u4E2A\uFF09\u3002\n *  \u6BCF\u4E2A\u548C\u5F26\u97F3\u4E00\u4E2A\u6765\u6E90 id\uFF08id\u3001id~1\u3001id~2\u2026\uFF1B\u5F55\u97F3\u623F\u6309\u6765\u6E90\u4E00\u4E2A\u58F0\u90E8\uFF09\uFF0Csound.up(id) \u4E00\u8D77\u677E\u5F00\u3002 */\nconst chordVoices = new Map<string, number>();\nconst soundTok = (s: EditorState, i: number, id = \"main\") => {\n  const t = tr(s)[i]; if (t?.kind !== \"note\" || !t.pitch) return;\n  sound.up(id);   // \u540C\u4E00\u4E2A\u6765\u6E90\u4E0A\u6B21\u7684\u548C\u5F26\u5148\u677E\u5E72\u51C0\uFF08\u8FD9\u6B21\u7684\u97F3\u5C11\u4E86\u4E5F\u4E0D\u7559\u5C3E\u5DF4\uFF09\n  sound.down(t.pitch, id); const extra = t.chord ?? []; extra.forEach((q, k) => sound.down(q, `${id}~${k + 1}`)); if (extra.length) chordVoices.set(id, extra.length);\n};\n/** \u5148\u54CD\u540E\u5199\u4E4B\u540E\u7684\u8865\u8BFE\uFF082026-10-17 Fable\uFF09\uFF1A\u6309\u4E0B\u90A3\u4E00\u523B\u5DF2\u7ECF\u6309 sounded \u54CD\u4E86\uFF1B\u5199\u5B8C\u5982\u679C\u8FD9\u4E2A\u97F3\u6210\u4E86\u548C\u5F26 = \u53EA\u628A\u548C\u5F26\u91CC\u591A\u51FA\u6765\u7684\u97F3\u8865\u54CD\uFF08\u4E0D\u91CD\u542F\u4E3B\u97F3\uFF09\uFF1B\n *  \u5199\u5B8C\u4E3B\u97F3\u53D8\u4E86\uFF08\u53EA\u9009\u4E86\u4E00\u4E2A\u97F3\u65F6 XOR \u628A\u6309\u7684\u90A3\u4E2A\u62FF\u6389\u4E86\uFF09= \u6309\u8C31\u4E0A\u73B0\u5728\u7684\u6837\u5B50\u91CD\u54CD\u3002 */\nconst soundAfterWrite = (s: EditorState, i: number, id: string, sounded: Pitch) => {\n  const t = tr(s)[i]; if (t?.kind !== \"note\" || !t.pitch) return;\n  if (midiOf(t.pitch) !== midiOf(sounded)) { soundTok(s, i, id); return; }\n  const extra = t.chord ?? []; extra.forEach((q, k) => sound.down(q, `${id}~${k + 1}`)); if (extra.length) chordVoices.set(id, extra.length);\n};\n/** \u6539\u4E86\u97F3\u9AD8\u4E4B\u540E\u54CD\u4E00\u4E0B\uFF08user 2026-10-10\u300C\u6309\u4F4F\u97F3\u7684\u65F6\u5019\u5E94\u8BE5\u80FD\u542C\u5230preview\uFF0C\u62D6\u52A8\u97F3\u9AD8\uFF0C\u6216\u8005\u6539\u52A8yngk\u7684\u65F6\u5019\u4E5F\u4F1A\uFF0C\u4F46\u662F\u6539\u65F6\u957F\u4E0D\u4F1A\u300D\uFF09\uFF1A\u6709\u9009\u533A = \u9009\u533A\u91CC\u7B2C\u4E00\u4E2A\u97F3\uFF0C\u5426\u5219\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u3002 */\nfunction previewEdited(): void {\n  const toks = tr(D.st); let i = -1;\n  if (D.st.sel) { for (let k = D.st.sel.from; k < D.st.sel.to; k++) if (toks[k]?.kind === \"note\") { i = k; break; } }\n  else for (let k = D.st.caret - 1; k >= 0; k--) if (toks[k]?.kind === \"note\") { i = k; break; }\n  if (i < 0) return;\n  clearTimeout(upTimer); soundTok(D.st, i, \"score\"); upTimer = window.setTimeout(() => sound.up(\"score\"), 350);\n}\n/** \u7535\u8111\u952E\u76D8\u6309\u4E0B\u4E00\u4E2A\u97F3\uFF1A\u54CD + pad \u4E0A\u90A3\u4E2A\u97F3\u9AD8\u7684\u952E\u4EAE\u7740\uFF08\u548C\u624B\u6307\u6309 pad \u4E00\u6837\uFF0C\u677E\u5F00\u952E\u624D\u706D\uFF09\u3002 */\nconst keyTok = (s: EditorState, i: number, code: string) => { const t = tr(s)[i]; soundTok(s, i, `key${code}`); if (t?.kind === \"note\" && t.pitch) pad.showDown(midiOf(t.pitch), `key${code}`); };\n/** \u5199\u4E00\u4E2A\u97F3\uFF08\u5199 = \u5149\u6807\u524D\u90A3\u4E2A\u65B0\u97F3\uFF1B\u6539 = \u88AB\u8986\u76D6\u7684\u90A3\u4E2A\u97F3 = \u65E7\u9009\u4E2D\u91CC\u7684\u7B2C\u4E00\u4E2A\u97F3\uFF09\uFF0C\u8FD4\u56DE\u521A\u5199\u7684\u4E0B\u6807\uFF08\u8BD5\u542C\u7528\uFF09\u3002 */\nfunction writeAndLocate(write: (s: EditorState) => EditorState): number {\n  const n = write(D.st); if (n === D.st) return -1;   // \u6CA1\u5199\u6210\uFF08\u6CA1\u6709\u80FD\u586B\u7684\uFF09\n  update(n);\n  return D.st.caret - 1;   // \u63D2\u5165 / \u586B / \u66FF\u6362\u5199\u5B8C\uFF0C\u5149\u6807\uFF08\u5199\u5B57\u5934\uFF09\u90FD\u5728\u521A\u5199\u7684\u90A3\u4E2A\u97F3\u540E\u9762\n}\n\nlet upTimer = 0;   // \u70B9\u4E00\u4E0B\u54CD 350 ms \u7684\u90A3\u4E2A\u505C\uFF1B\u65B0\u7684\u4E00\u4E0B\u5148\u53D6\u6D88\u65E7\u7684\uFF08\u4E0D\u7136\u4F1A\u6390\u6389\u65B0\u97F3\uFF09\nconst view = new ScoreView(scoreEl, {\n  get: () => D.st,\n  set: (n, o) => update(n, o?.gesture),\n  layoutWorker: () => new URL(`./${__LAYOUT_WORKER__}`, import.meta.url),   // \u6392\u7248 worker\uFF08src/render/layout-worker.ts\uFF1B2026-10-21 \u97F3\u6E38\u7EA7\u5EF6\u8FDF\u90A3\u4E00\u5200\uFF09\n  onLayoutWorker: (why) => diagNote(\"layout\", why),\n  audition: (i, hold) => { clearTimeout(upTimer); soundTok(D.st, i, \"score\"); if (!hold) upTimer = window.setTimeout(() => sound.up(\"score\"), 350); },\n  glide: (i) => { clearTimeout(upTimer); const t = tr(D.st)[i]; if (t?.kind === \"note\" && t.pitch) sound.glide(t.pitch, \"score\"); },\n  release: () => { clearTimeout(upTimer); sound.up(\"score\"); },\n  focus: (where) => showPad(where === \"staff\"),   // \u7EB8\u5BBD\u56FA\u5B9A\u4EE5\u540E\uFF0C\u6A2A\u5C4F\u6536\u8D77\u65C1\u8FB9\u7684 pad \u4E5F\u4E0D\u4F1A\u8BA9\u8C31\u91CD\u6392\uFF08user\u300C\u56FA\u5B9A\u884C\u5BBD\u4E4B\u540E\u6A2A\u5C4F\u7684\u952E\u76D8\u4E5F\u53EF\u4EE5\u5F00\u5173\u4E86\u5427\u300D\uFF09\n  autoBars: () => autoBars,\n  parts: () => partViews(),   // \u8C31\u524D\u5199\u89D2\u8272\u540D\uFF08\u4E50\u5668\u7684\u540D\u5B57\u4E0D\u4E0A\u8C31\uFF1B\u540C\u540D\u540C\u79CD\u5E26\u53F7\uFF09\uFF1B\u9690\u85CF\u7684\u4E0D\u753B\n  onPart: (_paper, _part, at) => openTrackCard(at),\n  onBlankPress: (at, row) => openScoreMenu(at, row),\n  onListenMenu: (at, a) => openListenMenu(at, a),   // \u542C\u6A21\u5F0F\uFF1A\u957F\u6309 / \u53F3\u952E = \u4ECE\u8FD9\u513F\u653E / \u63A5\u7740\u653E / \u4ECE\u5934\u653E\n  onSelPress: (at) => openSelMenu(at),\n  onMarkPress: (i, at) => openMarkMenu(i, at),\n  lyricHint: (i) => lyricHintAt(i),\n  lyricReading: (i) => lyricReadingAt(i),\n  notice: (s) => info(s),\n  onClef: (hit, at) => openClefMenu(hit, at),\n  onPaperMenu: (id) => openPaperMenu(id),\n  onAddPaper: () => { update(addPaper(D.st)); info(\"\u65B0\u7684\u4E00\u5F20\u7EB8\"); },\n  onNav: (dir) => navPaper(dir),\n  onNavFrom: (paper, dir) => navPaperFrom(paper, dir),\n  onScopeOf: (paper) => { if (viewScope === \"segment\" && D.st.at.paper === paper) viewScope = \"all\"; else { viewScope = \"segment\"; if (D.st.at.paper !== paper) navPaperTo(paper); } view.render(); },\n  onScopeToggle: () => { viewScope = viewScope === \"segment\" ? \"all\" : \"segment\"; view.render(); },   // \u300C\u672C\u6BB5\u300D\u5F00\u5173\u5728\u66F2\u6BB5\u5BFC\u822A\u65C1\u8FB9\uFF08user\u300C\u2026\u653E\u5728\u548C\u66F2\u6BB5\u5BFC\u822A\u5728\u4E00\u8D77\u300D\u300C\u5C31\u4E00\u4E2A\u6309\u94AEtoggle\u300D\u300C\u7C7B\u4F3Csolo toggle\u300D\uFF09\n  onPaper: () => openPaperSheet(),\n  onCredits: () => openCreditsSheet(),\n  reflow: () => reflow,\n  pages: () => pageFlow && !scrollFlow,\n  scroll: () => scrollFlow,\n  // \u8D34\u53F3\u8FB9\u90A3\u4E00\u6863\uFF08\u5E95\u5EA7\u5728\u53F3\u8FB9\u4E00\u680F\uFF09\uFF1A\u8BB0\u4E0B\u5E95\u5EA7\u5728\u65F6\u8C31\u9762\u4EE5\u5916\u5360\u4E86\u591A\u5BBD\uFF1B\u5E95\u5EA7\u6536\u8D77\uFF08\u300C\u8BCD\u300D\u3001\u952E\u76D8\u6536\u7740\u2026\uFF09\u7167\u6837\u6309\u90A3\u4E2A\u5BBD\u5EA6\u6392 = \u5207\u952E\u76D8\u65F6\u8C31\u4E0D\u7A81\u7136\u53D8\u5927\u53D8\u5C0F\uFF08user\u300C\u5207\u6362\u952E\u76D8\u7684\u65F6\u5019\u6BD4\u5982\u4ECE\u7B26\u53F7\u952E\u76D8\u53D8\u6210\u6587\u5B57\u8F93\u5165\u7684\u65F6\u5019zoom\u4E0D\u5E94\u8BE5\u7A81\u53D8\u300D\uFF09\u3002\u8D34\u5E95\uFF08\u9ED8\u8BA4\uFF09= \u5E95\u5EA7\u4E0D\u5360\u5BBD\uFF0C\u8C31\u5BBD\u5C31\u662F\u8C31\u5BBD\n  layoutWidth: () => {\n    const w = scoreEl.clientWidth, sw = stageEl.clientWidth;\n    if (!sideDocked(stageEl)) return w;   // \u8D34\u5E95\uFF08\u9ED8\u8BA4\uFF09\uFF1A\u5E95\u5EA7\u5728\u4E0B\u9762\uFF0C\u4E0D\u5360\u5BBD\n    if (stageEl.dataset.dock !== \"none\") { dockedSide = sw - w; return w; }\n    return dockedSide > 0 ? Math.max(200, sw - dockedSide) : w;\n  },\n  onZoom: (phys) => deviceKvSet(KV_ZOOM, phys === null ? null : phys.toFixed(3)),   // \u7F29\u653E\u6309\u8BBE\u5907\u8BB0\u4F4F\uFF08\u7269\u7406\u500D\u6570\uFF1Bnull = \u81EA\u52A8\uFF09\uFF1B\u5F00\u673A boot \u91CC restoreZoom \u8BFB\u56DE\u6765\n  lyricRaise: () => LYRIC_RAISE[pdfFont],   // \u5206\u9875 = \u6253\u5370\u9884\u89C8\uFF1A\u9009\u4E86\u62FC\u97F3\u5B57\u4F53\u5370 PDF\uFF0C\u6B4C\u8BCD\u884C\u4E5F\u8BA9\u51FA\u62FC\u97F3\u90A3\u4E00\u622A\uFF08\u548C PDF \u6392\u51FA\u6765\u4E00\u6837\uFF09\n  scope: () => viewScope,\n});\n/** \u89C6\u56FE\u8303\u56F4\uFF08\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\uFF09\uFF1A\u672C\u6BB5 = \u4E00\u6B21\u53EA\u770B\u5149\u6807\u6240\u5728\u7684\u7EB8\uFF0C\u2039 \u203A \u7FFB\uFF08\u9ED8\u8BA4\uFF1Buser\u300C\u4E0D\u540C\u66F2\u6BB5\u5E94\u8BE5\u662F\u4E0D\u540C\u9875\uFF0C\u800C\u4E0D\u662F\u4E00\u8D77\u663E\u793A\u300D\uFF09\uFF1B\u5168\u90E8 = \u6574\u9996\uFF08\u9690\u85CF\u7684\u7EB8\u6298\u53E0\u7740\uFF09\u3002 */\nlet viewScope: \"all\" | \"segment\" = \"segment\";\nlet pdfFont: PdfFontId = \"sans\";   // \u4E50\u8C31 PDF \u7684\u5B57\u4F53\uFF08desk\uFF1B\u540C mp3 \u97F3\u8D28\uFF1A\u8DDF\u8FD9\u9996\u6B4C\u8D70\u3001\u4E0D\u6807\u810F\uFF09\nlet mp3Quality: Mp3Quality = \"standard\";   // \u5BFC\u51FA\u6B4C\u58F0\u7684\u97F3\u8D28\uFF1A\u8DDF\u8FD9\u9996\u6B4C\u8D70\uFF08desk\uFF1A\u5B58\u65F6\u987A\u624B\u5E26\u3001\u4E0D\u6807\u810F\u3001\u4E0D\u8FDB undo\uFF1Buser\u300C\u97F3\u8D28\u914D\u7F6E\u5C31\u662F\u5E94\u8BE5\u4E5F\u8DDF\u7740\u5427\u300D\uFF09\nlet impro = false;\n/** \u6309\u62CD\u53F7\u81EA\u52A8\u753B\u5C0F\u8282\u7EBF\uFF08\u9ED8\u8BA4\u5F00\uFF1B\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\uFF09\u3002user\u300C\u81EA\u52A8\u52A0\u5C0F\u8282\u4E5F\u662F\u53EF\u4EE5toggle\u7684\uFF0C\u9ED8\u8BA4\u5F00\u300D */\nlet autoBars = true;\n/** /2 = \u548C Shift \u4E00\u4E2A\u903B\u8F91\uFF08user\u300C\u6216\u8005/2\u662F\u7C7B\u4F3Cshift\uFF0C\u56E0\u4E3Aaccessibility\u7684issue\u53EF\u80FD\u6309\u4F4F\u4E0D\u65B9\u4FBF\uFF0C\u800C\u662F\u548C\u952E\u76D8shift\u7684\u903B\u8F91\u4E00\u6837\u300D\uFF09\uFF1A\n *  \u70B9\u4E00\u4E0B = \u51D1\u6EE1\u4E00\u4EFD\u539F\u6765\u7684\u65F6\u503C\u518D\u56DE\u53BB\uFF08= \u4E24\u4E2A\u51CF\u534A\u7684\u97F3 / \u4F11\u6B62 / \u62C9\u957F\uFF1Buser \u70B9\u5934 AI \u7684\u7B54\uFF1A\u53EA\u7BA1\u4E00\u4E2A\u4F1A\u7559\u534A\u62CD\u7A9F\u7ABF\uFF0C\u8282\u594F\u662F\u6210\u5BF9\u51D1\u6574\u62CD\u7684\uFF09\uFF1B\n *  \u4E2D\u9014\u632A\u4E86\u5149\u6807\u6216\u62E8\u4E86\u957F\u77ED\u65CB\u94AE = \u53D6\u6D88\uFF1B350 ms \u5185\u8FDE\u70B9\u4E24\u4E0B = \u9501\u4F4F\uFF08\u518D\u70B9\u4E00\u4E0B\u89E3\u5F00\uFF09\uFF1B\u6309\u4F4F\u5199 = \u6309\u4F4F\u671F\u95F4\u5199\u7684\u90FD\u51CF\u534A\u3001\u677E\u624B\u56DE\u53BB\u3002\n *  \u51CF\u534A = \u4E34\u65F6\u628A\u957F\u77ED\u57FA\u7EBF\u5F80\u77ED\u632A\u4E00\u6863\uFF08\u65CB\u94AE\u4E0A\u770B\u5F97\u89C1\uFF09\uFF1B\u5DF2\u7ECF\u6700\u77ED\uFF08\u4E09\u5341\u4E8C\u5206\uFF09\u5C31\u4E0D\u632A\uFF1B\u56DE\u53BB = \u632A\u56DE\u4E00\u6863\uFF08\u4E2D\u95F4\u62E8\u8FC7\u65CB\u94AE = \u7167\u62E8\u8FC7\u7684\u518D\u632A\u56DE\u4E00\u6863\uFF09\u3002 */\n//   \u9501\u7684\u89C4\u5219 = src/keyboard/latch.ts\uFF08\u548C\u5347\u964D\u3001\u6E10\u5230\u540C\u4E00\u4EFD\uFF0C2026-10-15\uFF09\uFF1B\u8FD9\u91CC\u53EA\u5269\u5B83\u7684\u526F\u4F5C\u7528\uFF1A\u5F00 = \u957F\u77ED\u57FA\u7EBF\u5F80\u77ED\u632A\u4E00\u6863\uFF0C\u5173 = \u632A\u56DE\u6765\u3002\nlet half: Latch = LATCH_OFF, halfShifted = false;\nfunction setHalf(next: Latch): void {\n  const was = latchOn(half), on = latchOn(next);\n  if (!was && on) { halfShifted = D.st.input.unit > 0; if (halfShifted) update(setUnit(D.st, D.st.input.unit - 1)); }\n  else if (was && !on && halfShifted) { halfShifted = false; update(setUnit(D.st, D.st.input.unit + 1)); }\n  half = next; pad.showHalf(next.mode);\n}\nfunction halfKey(down: boolean): void { setHalf(down ? latchDown(half, performance.now(), 2) : latchUp(half)); }   // uses = 2\uFF1A\u4E24\u4E2A\u51CF\u534A\u7684 = \u4E00\u4EFD\u539F\u6765\u7684\n/** \u53E0\u952E\uFF08pad\uFF09= \u9501\u5B9A\u5F0F\uFF08v0.10.5\uFF1Buser\u300C\u53E0\u97F3\u6A21\u5F0F\u4E5F\u5E94\u8BE5\u53EA\u6709capslock\u6CA1\u6709shift\uFF0C\u6BCF\u6B21\u90FD\u4F1A\u5F04\u9519\uFF0C\u6240\u4EE5\u4E0D\u8981shift\u6A21\u5F0F\u300D+ \u952E\u76D8 \u00D7 \u9009\u533A\u90A3\u5957\u300C\u53E0\u8FD9\u4E2A\u5B57\u5C31\u7528\u6765\u9009\u4E2D\u4E0A\u4E2A\u300D\u2192\u300C\u540C\u610F\u300D\uFF09\uFF1A\n *  \u6309\u4E00\u4E0B = \u9009\u4E2D\u5149\u6807\u524D\u90A3\u4E2A\u97F3\uFF08= \u6539\u8FD9\u4E2A\u97F3\uFF1A\u97F3\u952E XOR\u3001\u2014 / \u232B \u957F\u77ED\u4E00\u6B65\u3001\u2190 \u2192 \u6362\u90BB\u5C45\uFF09\uFF1B\u518D\u6309\u4E00\u4E0B = \u56DE\u5230\u5B83\u540E\u9762\u7684\u5149\u6807\u3002\u6CA1\u6709\u5355\u6B21\u6863\u3001\u6CA1\u6709\u6309\u4F4F\u671F\u95F4\u3002\n *  \u4EAE\u4E0D\u4EAE\u8DDF\u7740\u300C\u662F\u4E0D\u662F\u6B63\u5728\u6539\u4E00\u4E2A\u97F3\u300D\uFF08\u70B9\u4E00\u4E2A\u97F3\u9009\u4E2D\u5B83\u4E5F\u4EAE\uFF09\uFF0Cpad \u81EA\u5DF1\u770B singleSel\u3002 */\nfunction stackKey(down: boolean): void {\n  if (!down) return;\n  if (!canStack()) { info(`\u300C${roleName(D.extras, curRole())}\u300D\u662F\u5355\u58F0\u4E50\u5668\uFF0C\u8FD9\u4E2A\u58F0\u90E8\u53E0\u4E0D\u4E86\u97F3`); return; }\n  if (singleSel(D.st) >= 0) { update(setCaret(D.st, D.st.sel!.to)); return; }\n  const tk = tr(D.st); let i = -1;\n  if (D.st.sel) { for (let k = D.st.sel.to - 1; k >= D.st.sel.from; k--) if (isTimed(tk[k])) { i = k; break; } }   // \u9009\u4E86\u597D\u51E0\u4E2A = \u6539\u6700\u540E\u90A3\u4E2A\n  else i = currentIndex(D.st);\n  if (i < 0) { info(\"\u5149\u6807\u524D\u9762\u8FD8\u6CA1\u6709\u97F3\"); return; }\n  update(select(D.st, i, i + 1));\n}\n/** \u5347\u964D\u952E\uFF08pad\uFF09\uFF1A\u548C Shift \u4E00\u4E2A\u903B\u8F91\uFF08\u70B9\u4E00\u4E0B = \u4E0B\u4E00\u4E2A\u3001350 ms \u5185\u8FDE\u70B9\u4E24\u4E0B = \u9501\u3001\u518D\u70B9 = \u5173\uFF1B\u6309\u4F4F\u5199 = \u6309\u4F4F\u671F\u95F4\u3001\u677E\u624B\u56DE\u53BB\uFF09\uFF0C\n *  \u6309\u7740\u4E0A\u4E0B\u6ED1 = \u6362\u4E00\u79CD\uFF08\uD834\uDD2A / \u266F / \u266D / \uD834\uDD2B\uFF1Buser\u300C\u6309\u662F\u5F53\u4F5Cshift\uFF0C\u6ED1\u52A8\u662Ftoggle which shift\u300D\uFF09\u3002\u6709\u9009\u4E2D = \u9009\u4E2D\u7684\u97F3\u76F4\u63A5\u5347\u964D\uFF08\u540C\u7535\u8111\u952E\u76D8\u7684 [ ]\uFF09\u3002 */\n//   \u9501\u7684\u72B6\u6001\uFF08once / lock / 350 ms\uFF09\u4F4F\u5728\u8C31\u7684\u8F93\u5165\u6001\u91CC\uFF08song.ts tapAcc / consumeAcc \u8C03 latch.ts \u7684\u540C\u4E00\u4EFD\u89C4\u5219\uFF09\uFF1B\u8FD9\u91CC\u53EA\u7BA1\u300C\u6309\u4F4F\u300D\u90A3\u4E00\u6BB5\uFF1A\u6309\u7740\u7684\u65F6\u5019\u4E34\u65F6\u9501\u4F4F\u3001\u677E\u624B\u6309 latchUp \u7684\u89C4\u5219\u56DE\u53BB\u3002\nlet accG: { prior: Pick<InputState, \"acc\" | \"accMode\" | \"accAt\">; latch: Latch; slid: boolean } | null = null;\nfunction accKey(phase: \"down\" | \"slide\" | \"up\", acc: Exclude<Acc, 0>): void {\n  if (phase === \"down\") {\n    if (D.st.sel) { update(tapAcc(D.st, acc, performance.now())); accG = null; return; }\n    accG = { prior: { acc: D.st.input.acc, accMode: D.st.input.accMode, accAt: D.st.input.accAt }, latch: { ...LATCH_OFF, held: true }, slid: false };\n    update(setAccState(D.st, acc, \"lock\"));   // \u6309\u7740\u7684\u65F6\u5019\u4E00\u76F4\u751F\u6548\uFF08\u5199\u51E0\u4E2A\u90FD\u7B97\uFF09\n  } else if (phase === \"slide\") {\n    if (!accG) return;\n    accG.slid = true; update(setAccState(D.st, acc, \"lock\"));\n  } else {\n    const g = accG; accG = null;\n    if (!g) return;\n    const back = { ...D.st, input: { ...D.st.input, ...g.prior } };\n    if (g.latch.wrote) update(setAccState(back, 0, \"off\"));                                  // \u6309\u4F4F\u5199\u8FC7 = \u677E\u624B\u56DE\u53BB\uFF08latchUp \u7684\u89C4\u5219\uFF09\n    else if (g.slid) update(g.prior.accMode === \"off\" ? back : setAccState(back, acc, g.prior.accMode));   // \u53EA\u662F\u6ED1\u7740\u6362\u4E86\u4E00\u79CD\n    else update(tapAcc(back, acc, performance.now()));                                   // \u70B9\u4E86\u4E00\u4E0B = Shift\uFF08tapAcc \u91CC latchDown\uFF09\n  }\n}\n/** \u5199\u4E86\u4E00\u4E2A\u97F3 / \u4F11\u6B62 / \u62C9\u957F\uFF1A\u300C\u53EA\u7BA1\u4E0B\u4E00\u4E2A\u300D\u7684 /2 \u7528\u6389\u4E86\uFF08\u6309\u4F4F\u7684\u65F6\u5019\u4E0D\u7B97\uFF0C\u677E\u624B\u518D\u56DE\u53BB\uFF09\uFF1B\u5347\u964D\u952E\u6309\u7740\u7684\u65F6\u5019\u8BB0\u4E00\u7B14\u3002 */\n/** \u300C/2\u300D\u5F00\u7740\u65F6\u7684\u62C9\u957F = \u52A0\u534A\u4EFD\uFF08\u9644\u70B9\uFF1Buser 2026-10-08\u300C\u96642\u7684\u65F6\u5019\u62C9\u957F\u53EF\u4EE5\u51FA\u9644\u70B9\u5417\u300D\u2014\u2014\u539F\u6765\u62C9\u957F\u4E0D\u770B /2\u3001\u7167\u52A0\u4E00\u6574\u4EFD\uFF0C\u5374\u53C8\u7B97\u8FDB\u300C\u51D1\u6EE1\u4E00\u4EFD\u300D\u7684\u4E24\u4E0B\u91CC\uFF09\u3002 */\nconst withHalf = (c: Command): Command => (c.k === \"extend\" && latchOn(half) ? { k: \"extend\", half: true } : c);\nfunction afterWrite(): void { if (accG) accG.latch = latchWrite(accG.latch); setHalf(latchWrite(half)); }\n/** \u5C4F\u5E55\u653E\u4E0D\u4E0B\u7EB8\u7684\u65F6\u5019\u6298\u4E0D\u6298\u884C\uFF08\u9ED8\u8BA4\u4E0D\u6298\u884C = \u6574\u5F20\u7EB8\u6309\u6BD4\u4F8B\u7F29\u5C0F\uFF1B\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\uFF0C\u4E0D\u8FDB\u6587\u4EF6\u2014\u2014\u600E\u4E48\u770B\uFF0C\u4E0D\u662F\u8C31\u7684\u5185\u5BB9\uFF09\u3002 */\nlet reflow = false;   // \u300C\u5F39\u300D\uFF08\u9876\u680F\u5F00\u5173\uFF1B2026-10-07 user\u300C\u5F39\u5E94\u8BE5\u653E\u5728\u9876\u680F\u300D\uFF09\uFF1A\u97F3\u7B26\u53EA\u5531\u4E0D\u5199\n/** \u6392\u6CD5\uFF08\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\uFF1Buser 2026-10-08\u300C\u663E\u793A\u6CD5\u8FD8\u52A0\u4E00\u4E2A\u5206\u9875\uFF1F\u53EF\u4EE5\u9884\u89C8\u6253\u5370\uFF0C\u8981\u6C42\u548C\u4E4B\u540E\u751F\u6210\u7684pdf wysiwyg\u300D\uFF09\uFF1Afalse = \u8FDE\u7EED\uFF08\u4E00\u5F20\u957F\u7EB8\uFF09\uFF1Btrue = \u5206\u9875\uFF08\u6309\u7EB8\u9AD8\u5206\u9875\u3001\u753B\u9875\u6846\uFF0C\u548C\u4EE5\u540E\u5BFC\u51FA\u7684 PDF \u6240\u89C1\u5373\u6240\u5F97\uFF09\u3002\u6A2A\u5377 = \u4E0B\u9762 scrollFlow\u3002 */\nlet pageFlow = false;\n/** \u6392\u6CD5\u300C\u6A2A\u5377\u300D\uFF08v0.9.35\uFF1Buser 2026-10-10\u300C\u90A3\u4E2A\u65E0\u9650\u5F80\u53F3\u7684\u603B\u8C31\u6A21\u5F0F\u4E5F\u505A\u4E00\u4E0B\u300D\uFF09\uFF1A\u6BCF\u5F20\u7EB8\u4E00\u884C\u3001\u65E0\u9650\u5F80\u53F3\uFF0C\u8C31\u9762\u677F\u6A2A\u7740\u6EDA\uFF0C\u6253\u5B57 / \u653E\u7684\u65F6\u5019\u6A2A\u7740\u8DDF\uFF0C\u6B4C\u624B\u540D\u9489\u5728\u5C4F\u5E55\u5DE6\u8FB9\u3002\u548C pageFlow \u4E92\u65A5\uFF08\u6A2A\u5377\u8BF4\u4E86\u7B97\uFF09\u3002\u8DDF\u7740\u6B4C\u8D70\uFF08desk view.scroll\uFF09\u3002 */\nlet scrollFlow = false;\n/** \u5149\u6807\u6240\u5728\u58F0\u90E8\u7684\u4E50\u5668\u80FD\u53E0\u97F3\u5417\uFF08SoundFont = \u80FD\uFF1B\u6708\u8BFB / \u5143\u97F3 / \u6CA1\u4EBA = \u5355\u58F0\uFF0C\u62A4\u680F\uFF1Apad \u7684\u53E0\u952E\u7070\u6389\u3001\u540C\u65F6\u6309\u4E5F\u53EA\u5199\u7B2C\u4E00\u4E2A\uFF09\u3002 */\nconst canStack = (): boolean => performerOf(engineNow())?.poly ?? false;\n// pad \u4E00\u521B\u5EFA\u5C31\u8981\u63D0\u793A\u97F3\u57DF\uFF08padHint\uFF09\uFF1A\u5B83\u8BFB\u7684\u72B6\u6001\u5FC5\u987B\u5728 pad \u4E4B\u524D\u58F0\u660E\uFF08esbuild \u6253\u5305\u540E\u665A\u58F0\u660E\u7684 = undefined\uFF0C\u5F00\u673A\u5C31\u5D29\uFF1B2026-10-08 \u8E29\u8FC7\uFF09\nlet auditionHint: HintRange = null;   // \u627E\u4EBA\u89C6\u56FE\u91CC pad \u63D0\u793A\u7684\u97F3\u57DF = \u8BD5\u542C\u53F0\u4E0A\u90A3\u4F4D\u7684\nlet catalogNow: Catalog | null = null;   // \u76EE\u5F55\uFF08\u627E\u4EBA\u89C6\u56FE / \u4E50\u5668\u58F0\u90E8\u7684\u97F3\u57DF\u8981\u5B83\uFF1B\u7B2C\u4E00\u6B21\u7528\u5230\u65F6\u8F7D\uFF0C260 KB\uFF09\nconst ui = createOverlayRegistry();   // \u76D6\u5C42\u767B\u8BB0\uFF08F-17 \u7B2C 1 \u671F\uFF0C2026-10-14\uFF09\uFF1A\u539F\u6765\u90A3\u4E2A\u300C\u73B0\u5728\u5F00\u7740\u7684\u9762\u677F\u600E\u4E48\u5173\u300D\u7684\u95ED\u5305\u534F\u8BAE\u6536\u6210\u4E00\u4E2A\u5BF9\u8C61\uFF1B\u5F00\u65B0\u7684 = \u65E7\u7684\u5148\u5173\uFF0C\u81EA\u5DF1\u6536\u4E86\u53EA\u5728\u8FD8\u662F\u73B0\u5728\u8FD9\u5C42\u65F6\u6E05\n// \u6574\u9875\u5728\u54EA\uFF08\u8C31 / \u4E50\u5668\u9875 / \u4E50\u5668\u76EE\u5F55\uFF09= ui.page\uFF08\u5200 3 \u4E4B\u4E8C\uFF0C2026-10-14\uFF09\uFF1A\u539F\u6765\u4E94\u4E2A\u5404\u81EA\u7EF4\u62A4\u7684\u65D7\uFF08\u4E50\u5668\u9875\u5F00\u7740 / \u76EE\u5F55\u5F00\u7740 / \u53EA\u5F39\u7740\u73A9 / \u5173\u4E86\u56DE\u4E50\u5668\u9875 / \u5C0F\u5361\u7684\u91CD\u753B\uFF09\u4ECE\u8FD9\u513F\u63A8\uFF1B\n//   \u8FD9\u91CC\u8BFB ui.page \u4E0D\u8BFB finder \u5BF9\u8C61\u2014\u2014pad \u4E00\u521B\u5EFA\u5C31\u753B\u300C\u5F39\u300D\u94AE\uFF0C\u90A3\u65F6 finder \u8FD8\u6CA1\u5EFA\uFF08\u540C padHint \u7684\u5751\uFF09\nconst instShown = (): boolean => ui.page.k === \"inst\";\nconst finderShown = (): boolean => ui.page.k === \"finder\";\nconst finderPlayOnly = (): boolean => ui.page.k === \"finder\" && ui.page.playOnly;\n/** \u5728\u5149\u6807\uFF08\u6709\u9009\u4E2D = \u9009\u533A\u5F00\u5934\uFF09\u63D2\u4E00\u4E2A\u8C03\u53F7 / \u62CD\u53F7 / \u901F\u5EA6\uFF0C\u5F00\u8BB0\u53F7\u6846\u5C31\u5730\u6539\uFF1A\u9ED8\u8BA4\u503C = \u90A3\u91CC\u6B63\u751F\u6548\u7684\u90A3\u4E2A\uFF08\u6CA1\u6539\u5C31\u6536\u8D77 = \u64A4\u6389\u8FD9\u6B21\u63D2\u5165\uFF09\u3002pad \u7B26\u53F7\u5C42\u548C\u7A7A\u767D\u5904\u5C0F\u83DC\u5355\u5171\u7528\u3002 */\nfunction insertMarkHere(kind: MarkVal[\"kind\"]): void {\n  const at = D.st.sel ? D.st.sel.from : D.st.caret;\n  const v: MarkVal = kind === \"key\" ? { kind, fifths: keyAt(tr(D.st), at) } : kind === \"time\" ? { kind, ...timeAt(tr(D.st), at) } : { kind, bpm: tempoAt(tr(D.st), at) };\n  const r = writeMark(D.st, v);\n  update(r.st);\n  view.marks.openAt(r.index, r.fresh);\n}\n// pad \u7684\u5BBF\u4E3B = \u7FFB\u8BD1\u5C42\uFF08src/app/pad-host.ts\uFF0C\u5200 2 \u4E4B\u4E09\uFF09\uFF1A\u97F3\u952E \u2192 \u5199 / \u6539 / \u53E0\u97F3\u89C2\u671B / \u51FA\u58F0\uFF0C\u6309\u952E id \u2192 \u547D\u4EE4\uFF08\u9501 \u00D7 \u5149\u6807 \u00D7 \u9009\u533A\uFF09/ \u63D2\u8BB0\u53F7 / \u83DC\u5355\uFF0C\u624B\u6307\u4E0E\u7535\u8111\u952E\u76D8\u5171\u7528\u7684\u300C\u8C01\u6309\u7740\u300D\u7C3F\u8BB0\u3002\n//   \u8FD9\u91CC\u53EA\u7ED9\u5B83\u4E00\u7EC4\u8BBF\u95EE\u5668\uFF1Bpad \u4E00\u521B\u5EFA\u5C31\u753B\uFF0C\u6240\u4EE5\u5B83\u8BFB\u7684\u72B6\u6001\uFF08padHint\u3001ui.page\u3001autoBars\u2026\uFF09\u90FD\u5DF2\u5728\u4E0A\u9762\u58F0\u660E\u3002\nconst padHost = createPadHost(padEl, {\n  state: () => D.st, update: (n) => update(n), writeAndLocate, afterWrite, previewEdited, info: (m) => info(m), canStack,   // info / ghostOn \u662F\u540E\u9762\u624D\u58F0\u660E\u7684 const\uFF1A\u5305\u4E00\u5C42\u7BAD\u5934\uFF0C\u522B\u5728\u8FD9\u513F\u53D6\u503C\n  sound: { down: (p, id) => sound.down(p, id), up: (id) => sound.up(id) }, soundTok, soundAfterWrite,\n  impro: () => impro, finderOpen: () => finder.isOpen, finderShown, instShown,\n  toggleImpro: () => toggleImpro(),\n  kbSwitch: () => setMode(ws.mode === \"symbols\" ? \"notes\" : \"symbols\"),   // \u5C0F\u952E\u76D8\u9876\u4E0A\u300C\u7B26 / \u97F3\u300D\uFF1A\u53EA\u6362\u952E\u76D8\uFF08v0.10.37\uFF1B\u6A21\u5F0F\u6761\u4E0A\u53EA\u5269\u97F3 / \u8BCD / \u542C\uFF09\n  ghost: { on: () => ghostOn(), set: (id, p) => { ghostHeld.set(id, p); }, delete: (id) => ghostHeld.delete(id), sync: () => ghostSync() },\n  half: {\n    caretMoved: () => setHalf(latchCancel(half)),   // \u632A\u5149\u6807 = \u53D6\u6D88\u300C\u51D1\u6EE1\u4E00\u4EFD\u300D\uFF08\u9501\u4F4F\u7684\u4E0D\u52A8\uFF09\n    knobTurned: () => { if (half.mode === \"once\") { half = latchCancel(half); halfShifted = false; pad.showHalf(half.mode); } },   // \u62E8\u4E86\u65CB\u94AE = \u7167\u62E8\u7684\uFF0C\u53D6\u6D88\u300C\u51D1\u6EE1\u4E00\u4EFD\u300D\uFF08\u4E0D\u632A\u56DE\u4E00\u6863\uFF1A\u65CB\u94AE\u8BF4\u4E86\u7B97\uFF09\n    key: (down) => halfKey(down), wrap: (c) => withHalf(c),\n  },\n  accKey, stackKey, discloseArt, discloseDynOverride, ignoredHere,\n  hintRange: () => padHint(), staves: () => curPart().staves ?? 1,\n  autoBars: { get: () => autoBars, set: (on) => { autoBars = on; view.render(); } },\n  insertMarkHere, insertGrooveHere: () => insertGrooveHere(), openRepeatMenu: () => openRepeatMenu(),\n  openInsertClefMenu: (at) => openInsertClefMenu(at), openInsertOttavaMenu: (at) => openInsertOttavaMenu(at),\n  showPad: (on) => showPad(on),\n});\nconst pad = padHost.pad;\n\n/** \u300C\u5F39\u300D\u5F00 / \u5173\uFF08\u9876\u680F\u6309\u94AE\u3001\u7535\u8111\u952E\u76D8\u7684 `\uFF09\u3002 */\n/** \u5F39\uFF08\u53EA\u54CD\u4E0D\u5199\uFF09\uFF1A\u5F00\u5173\u5728 pad \u7B2C\u4E00\u6392\u300C\u6536\u8D77\u300D\u5DE6\u8FB9\uFF08user 2026-10-08\u300C\u5F39\u8FD9\u4E2A\u9501\u8FD8\u662F\u653E\u952E\u76D8\u4E0A\u5427\u653E\u5728\u7B2C\u4E00row\uFF0C\u6536\u8D77\u952E\u76D8\u7684\u5DE6\u8FB9\u300D\uFF09\uFF1B\u5FEB\u6377\u952E ` \u7167\u65E7\u3002\u627E\u4EBA\u89C6\u56FE\u91CC\u4E00\u76F4\u662F\u5F39\u3001\u62E8\u4E0D\u52A8\u3002 */\nfunction toggleImpro(): void { if (finder.isOpen) return; impro = !impro; if (impro) showPad(true); pad.render(); ghostHeld.clear(); ghostSync(); }\n/** \u300C\u5F39\u300D\u65F6\u6B63\u6309\u7740\u7684\u97F3 \u2192 \u8C31\u4E0A\u5149\u6807\u5904\uFF08\u53E0\u4EAE\u7740 = \u90A3\u4E2A\u97F3\u4E0A\uFF09\u753B\u9B3C\u97F3\u7B26\uFF08v0.10.6\uFF1Buser\u300C\u5F39\u6A21\u5F0F\u4E0B\u9762\u80FD\u4E0D\u80FD\u5728\u8C31\u5B50\u4E0A\u9762\u5149\u6807\u5BF9\u5E94\u7684\u90A3\u4E2A\u5730\u65B9\u663E\u793A\u9B3C\u97F3\u7B26\uFF1F\u300D\u300C\u9B3C\u97F3\u7B26\u7684\u65F6\u5019\u5343\u4E07\u4E0D\u80FD\u52A8\u6392\u7248\uFF01\u300D\uFF09\uFF1A\n *  \u53EA\u662F\u76D6\u5728\u8C31\u4E0A\u7684\u4E00\u5C42\uFF08ScoreView.showGhost\uFF09\uFF0C\u4E0D\u6539\u8C31\u3001\u4E0D\u91CD\u6392\u3002 */\nconst ghostHeld = new Map<string, Pitch>();\nconst ghostOn = (): boolean => impro && !finder.isOpen && !instShown();\nfunction ghostSync(): void { view.showGhost(ghostOn() ? [...ghostHeld.values()] : []); }\n\n// \u2500\u2500 \u64A4\u9500 / \u91CD\u505A\uFF08src/score/history.ts\uFF09\uFF1Asong \u6BCF\u53D8\u4E00\u6B21\u8BB0\u4E00\u4EFD\u6539\u4E4B\u524D\u7684\u5FEB\u7167\uFF08\u5F15\u7528\uFF0C\u4E0D\u62F7\u8D1D\uFF09\uFF1Bgesture = \u8FDE\u7EED\u52A8\u4F5C\uFF08\u62D6 / \u8FDE\u6253\u6B4C\u8BCD\uFF09\u5E76\u6210\u4E00\u6B65\uFF1B\u6362\u6B4C\u6E05\u6808 \u2500\u2500\n// \u2500\u2500 \u6539\u72B6\u6001\u7684\u552F\u4E00\u5165\u53E3 = D.commit\uFF08src/app/document.ts\uFF09\u3002\u4E0B\u9762\u4E09\u4E2A\u540D\u5B57\u53EA\u662F\u8584\u58F3\uFF08\u4E5D\u5341\u591A\u5904\u8C03\u7528\u4E0D\u7528\u6539\uFF09\uFF1B\u9501 / \u64A4\u9500\u6808 / \u810F\u90FD\u5728 D \u91CC\u4E00\u5904 \u2500\u2500\n// \u2500\u2500 \u5B9A\u7A3F\uFF08W-38\uFF1Bsrc/format/final.ts \u5934\u6CE8\u91CA = \u56DB\u5C42\u62A4\u680F\uFF09\uFF1A\u7B2C \u2461 \u5C42 = D.commit \u91CC\u90A3\u4E00\u5224\uFF08\u6574\u9996\u9501\u4F4F\uFF1A\u8C31 / \u6B4C\u540D / \u4F5C\u8005\u680F / \u8BB8\u53EF / \u5C01\u9762 / \u6B4C\u624B / \u6DF7\u97F3\uFF0Cuser 10-16\u300C\u90FD\u51BB\u540C\u610F\uFF0C\u5C01\u9762\u5F53\u7136\u8FDB\u300D\uFF09\u3002\nconst finalOn = (): boolean => D.locked() !== null;\nlet lockSaidAt = 0;\n/** \u5B9A\u7A3F\u7740\u88AB\u62D2\u7684\u90A3\u4E00\u4E0B\uFF1A\u8BF4\u4E00\u53E5\uFF08\u540C\u4E00\u53E5 3 s \u5185\u4E0D\u91CD\u590D\uFF09\u3002 */\nfunction lockedSay(what: string): void { const t = performance.now(); if (t - lockSaidAt < 3000) return; lockSaidAt = t; showError(`\u8FD9\u9996\u6B4C\u5B9A\u7A3F\u4E86\uFF0C${what}\u6539\u4E0D\u4E86\uFF1A\u5148\u5728\u4E09\u6761\u6760\u91CC\u300C\u6539\u7A3F\u300D\uFF08\u5B9A\u7A3F\u7684 mp3 \u4F1A\u4F5C\u5E9F\uFF09\uFF0C\u518D\u6539\u3002`); }\nfunction onLockRefused(what: string): void { lockedSay(what); view.render(); pad.render(); drawInst(); ui.redraw(); if (studio.isOpen) studio.show(); }\nfunction update(next: EditorState, gesture?: string): void { D.commit({ st: next }, { gesture }); }\n/** \u6BCF\u5F20\u7EB8\uFF08\u66F2\u6BB5\uFF09\u5F00\u5934\u6CA1\u5199\u529B\u5EA6\u7684\u8865\u4E0A\uFF08song.ts ensureStartDyns\uFF1A\u8865\u7684\u662F\u90A3\u91CC\u672C\u6765\u5C31\u751F\u6548\u7684\u90A3\u4E2A\uFF09\uFF1B\u8865\u5728\u5149\u6807\u90A3\u6761\u3001\u5149\u6807\u524D\u9762 = \u5149\u6807\u632A\u5230\u5B83\u540E\u9762\uFF08\u63A5\u7740\u5199\u7684\u97F3\u5728\u529B\u5EA6\u540E\u9762\uFF09\u3002 */\nfunction withStartDyns(s: EditorState): EditorState {\n  const r = ensureStartDyns(s.song, s.nextId); if (!r.added.length) return s;\n  let caret = s.caret, sel = s.sel;\n  for (const a of r.added) if (a.paper === s.at.paper && a.part === s.at.part) { if (a.index <= caret) caret++; if (sel) sel = { from: sel.from + (a.index <= sel.from ? 1 : 0), to: sel.to + (a.index < sel.to ? 1 : 0) }; }\n  return { ...s, song: r.song, nextId: r.nextId, caret, sel };\n}\n/** \u6539\u6B4C\u4EE5\u5916\u3001\u4F46\u8FDB\u6587\u4EF6\u7684\u4E1C\u897F\uFF08\u4F11\u606F\u5BA4 / \u9EA6\u514B\u98CE / \u5C01\u9762\uFF09\u2192 \u540C\u4E00\u6761 undo\uFF08user 2026-10-08\u300Cundo \u540C\u610F\u554A\u300D\u300C\u6BCF\u4E00\u6B65\u5FEB\u7167\u5E26 locus \u540C\u610F\u300D\uFF09\u3002locus = \u8FD9\u4E00\u6B65\u7684\u4EBA\u8BDD\uFF1Bgesture = \u8FDE\u7EED\u52A8\u4F5C\uFF08\u63A8\u5B50\uFF09\u5E76\u6210\u4E00\u6B65\u3002 */\nfunction updateExtras(next: Extras, locus: Locus, gesture?: string): void { D.commit({ extras: next }, { locus, gesture }); }\n/** \u6B4C\u548C extras \u4E00\u8D77\u6539\u3001\u7B97\u4E00\u6B65\uFF08\u52A0\u58F0\u90E8 / \u5220\u58F0\u90E8\uFF1A\u8C31\u548C\u4F11\u606F\u5BA4\u540C\u65F6\u52A8\uFF09\u3002 */\nfunction updateBoth(next: EditorState, nextExtras: Extras, locus: Locus): void { D.commit({ st: next, extras: nextExtras }, { locus }); }\n/** \u8C31\u6362\u4E86\u4E4B\u540E\u7684\u526F\u4F5C\u7528\uFF08\u539F applyState\uFF1BD \u6362\u597D\u771F\u76F8\u518D\u53EB\uFF09\u3002userEdit = \u4F60\u5728\u8C31\u4E0A\u52A8\u4E86\uFF08\u64AD\u653E\u51E0\u79D2\u5185\u4E0D\u62FD\u89C6\u56FE\uFF0Cv0.10.12\uFF09\uFF1B\u64A4\u9500 / \u91CD\u505A\u4E0D\u7B97\u3002 */\nfunction afterState(prev: EditorState, next: EditorState, moved: boolean, userEdit: boolean): void {\n  if (next.song.paper !== prev.song.paper) syncDock();   // \u6362\u7EB8 / \u5BC6\u5EA6 = \u4E00\u884C\u8C31\u7684\u9AD8\u53D8\u4E86\uFF0C\u91CD\u5224\u5E95\u5EA7\u8D34\u5E95\u8FD8\u662F\u8D34\u53F3\u8FB9\n  if (userEdit && (next.song !== prev.song || next.caret !== prev.caret || next.sel !== prev.sel)) view.noteUserEdit();\n  if (moved) { sound.allOff(); void prepareBank(); }\n  span(\"changed\", () => changed());\n  schedulePlaybackRefresh();   // \u653E\u7740\u7684\u65F6\u5019\u6539\u8C31\uFF1A\u65F6\u95F4\u7EBF\u91CD\u7B97\uFF08\u6B63\u5728\u54CD\u7684\u4E0D\u52A8\uFF09\n  schedulePrewarm();            // \u6CA1\u5728\u653E\uFF1A\u505C\u4E0B 700 ms \u540E\u5148\u628A\u5149\u6807\u9644\u8FD1\u5531\u597D\n  queuePaint();\n}\n// \u753B\u5408\u5E76\u5230\u4E0B\u4E00\u5E27\uFF082026-10-17 Claude Fable 5.1\uFF1B\u91CF + \u65B9\u6848 = ai-docs/20261017-input-latency-probe.md\uFF09\uFF1A\u72B6\u6001\u6539\u4E86\u8FD9\u91CC\u53EA\u6392\u4E00\u5E27\uFF0C\u91CD\u6392 / \u91CD\u753B / \u6807\u9898 / \u6302\u7B7E / \u6E05\u5355\u5728 rAF \u91CC\u505A\u4E00\u6B21\u3002\n//   \u51FA\u58F0\u4E0D\u7B49\u5B83\uFF08pad-host / \u7535\u8111\u952E\u76D8\u5148\u54CD\u540E\u5199\uFF09\uFF1B\u5FEB\u5F39\u51E0\u4E2A\u952E\u843D\u5728\u540C\u4E00\u5E27 = \u53EA\u91CD\u6392\u4E00\u6B21\u3002\u8C01\u5728\u8FD9\u4E00\u5E27\u4E4B\u524D\u5C31\u8981\u6700\u65B0\u7684\u6392\u7248 = view.layoutNow()\uFF08\u6B4C\u8BCD\u6846 / \u8BB0\u53F7\u6846 / head / E2E \u94A9\u5B50\uFF09\u3002\n//   \u4E2D\u9014\u6709\u4EBA\u663E\u5F0F view.render() \u8FC7\uFF08\u89C6\u56FE\u5F00\u5173 / \u8F6C\u5C4F\u2026\uFF09= \u8FD9\u4E00\u5E27\u4E0D\u518D\u753B\u8C31\uFF0C\u522B\u7684\u7167\u505A\u3002\nlet paintQueued = 0;\nfunction queuePaint(): void { if (!paintQueued) paintQueued = requestAnimationFrame(() => { paintQueued = 0; paintNow(); }); }\nfunction paintNow(): void {\n  if (paintQueued) { cancelAnimationFrame(paintQueued); paintQueued = 0; }\n  if (!view.paintedFor(D.st)) span(\"view.render\", () => view.renderAsync());   // \u6392\u7248\u8FDB worker\uFF082026-10-21\uFF09\uFF1A\u73B0\u6210\u5C31\u753B\uFF0C\u4E0D\u73B0\u6210\u53D1\u51FA\u53BB\u3001\u56DE\u6765\u518D\u753B\n  span(\"pad.render\", () => pad.render());\n  span(\"title\", () => renderTitle());\n  span(\"chrome\", () => updateChrome());\n  span(\"issues\", () => refreshIssues());   // \u5199\u4E86\u7B2C\u4E00\u4E2A\u97F3\u7684\u58F0\u90E8\u8981\u662F\u6CA1\u4EBA\u4E0A\u573A = \u8FDB\u6E05\u5355\uFF08\u00A72.2\u00BD\uFF09\uFF1B\u5220\u5149\u4E86 = \u51FA\u6E05\u5355\n  renderUndo();\n}\n/** extras \u6362\u4E86\u4E4B\u540E\u7684\u526F\u4F5C\u7528\uFF08\u539F updateExtras \u7684\u540E\u534A\uFF09\u3002 */\nfunction afterExtras(prev: Extras, next: Extras, locus: Locus): void {\n  if (prev.thumbnail !== next.thumbnail) coverTouched = true;   // \u843D\u76D8\u540E\u8BA9\u6B4C\u5E93\u4E22\u6389\u65E7\u7F29\u7565\u56FE\n  renderTitle(); changed(); renderUndo();\n  pushChannels(); schedulePlaybackRefresh(); schedulePrewarm();   // \u63A8\u5B50 / \u6821\u51C6\u7ACB\u523B\u8FDB\u5F55\u97F3\u623F\uFF08\u8FB9\u653E\u8FB9\u8C03\uFF09\uFF1B\u6362\u4EBA = \u65F6\u95F4\u7EBF\u91CD\u7B97\n  refreshIssues();   // \u6362\u4EBA = \u6E05\u5355\u91CD\u7B97\uFF08\u6362\u5BF9\u4E86\u89D2\u6807\u81EA\u5DF1\u6D88\uFF09\n  if (locus.kind === \"lounge\") pad.render();   // \u6F14\u594F\u8005\u53D8\u4E86 = pad \u7684\u63D0\u793A\u8DDF\u7740\uFF08\u97F3\u57DF / \u539F\u901F\u952E\uFF1B\u56FA\u5B9A\u539F\u901F = \u4E0D\u63D0\u793A\uFF09\n  if (locus.kind === \"final\") { applyWorkspace(); view.render(); }   // \u5B9A\u7A3F / \u6539\u7A3F\uFF1A\u9501\u7684\u6837\u5B50\uFF08body.doc-final / \u6A21\u5F0F\u94AE\uFF09\u8DDF\u7740\n  drawInst(); ui.redraw(); updateChrome();   // \u6B4C\u624B\u540D\u5728\u6302\u7B7E\u7684\u4E0B\u62C9\u91CC\n}\nfunction undoNow(): void { if (D.locked()) { D.undo(); return; } if (!D.history.past.length) { info(\"\u6CA1\u6709\u53EF\u64A4\u9500\u7684\"); return; } ui.close(); view.lyrics.commitAndClose(); D.undo(); }\nfunction redoNow(): void { if (D.locked()) { D.redo(); return; } if (!D.history.future.length) { info(\"\u6CA1\u6709\u53EF\u91CD\u505A\u7684\"); return; } ui.close(); view.lyrics.commitAndClose(); D.redo(); }\nlet lastUndoText = \"\";   // \u6D4B\u8BD5\u94A9\u5B50\u770B\u7684\uFF1A\u6700\u8FD1\u4E00\u6B21\u64A4\u9500 / \u91CD\u505A\u7684 toast\n/** \u64A4\u9500 / \u91CD\u505A\u843D\u5730\uFF08D \u5DF2\u6362\u597D D.st / extras / \u6808\uFF09\uFF1A\u6362 extras\uFF08\u9009\u89D2\u53D8\u4E86\u5408\u6210\u5668\u91CD\u5907\uFF09\u2192 \u89C6\u56FE\u8DDF\u7740 locus \u8D70\uFF08\u90A3\u6761\u58F0\u90E8\u8981\u770B\u5F97\u89C1\uFF1B\u7EB8\u968F\u5FEB\u7167\u7684 at\uFF09\u2192 \u6362\u8C31 \u2192 toast \u8BF4\u660E\u64A4\u4E86\u4EC0\u4E48\n *  \uFF08user 2026-10-08 \u7684\u987E\u8651\u300C\u591A\u6309\u51E0\u6B21\u4F1A\u4E0D\u4F1A\u9759\u9ED8\u53D8\u4F60\u6CA1\u6709\u76D1\u89C6\u7684\u9875\u9762\u3001\u66F2\u6BB5\u300D\uFF1A\u4E0D\u4F1A\u9759\u9ED8\u2014\u2014\u89C6\u56FE\u8DDF\u8FC7\u53BB + \u6BCF\u4E00\u4E0B\u90FD\u8BF4\u4E00\u53E5\uFF09\u3002 */\nfunction afterRestore(r: Restored, verb: \"\u64A4\u9500\" | \"\u91CD\u505A\", prev: { st: EditorState; extras: Extras }): void {\n  if (r.extras !== prev.extras) {\n    if (r.extras.thumbnail !== prev.extras.thumbnail) coverTouched = true;\n    if (r.locus.kind === \"lounge\") { sound.allOff(); void prepareBank(); pad.render(); view.render(); }   // \u8C31\u4E0A\u7684 \u00D7 \u7B26\u5934\u8DDF\u7740\u6F14\u594F\u8005\n  }\n  revealPart(r.st.at.part);\n  if (r.st !== prev.st) afterState(prev.st, r.st, r.st.at.paper !== prev.st.at.paper || r.st.at.part !== prev.st.at.part, false);\n  if (studio.isOpen) studio.render();\n  drawInst(); ui.redraw();\n  renderUndo();\n  lastUndoText = `${verb} \u00B7 ${locusText(r.st, r.locus)}`;\n  showNotice({ id: \"undo\", level: \"info\", text: lastUndoText, autoHideMs: 2500 });\n}\n/** \u64A4\u7684\u90A3\u6761\u58F0\u90E8\u8981\u662F\u88AB\u300C\u9690\u85CF\u300D/ \u522B\u4EBA\u7684\u300C\u53EA\u770B\u300D\u906E\u7740\uFF0C\u5148\u8BA9\u5B83\u9732\u51FA\u6765\uFF08\u89C6\u56FE\u8DDF\u7740 undo \u8D70\uFF0C\u4E0D\u5728\u770B\u4E0D\u89C1\u7684\u5730\u65B9\u6539\u4E1C\u897F\uFF09\u3002 */\nfunction revealPart(id: string): void {\n  if (isShown(id)) return;\n  if (D.st.song.parts.some((p) => pv(p.id).only)) setPv(id, { only: true }); else setPv(id, { hidden: false });\n}\n/** toast \u7684\u4EBA\u8BDD\uFF1A\u7EB8 \u00B7 \u58F0\u90E8 \u00B7 \u6539\u4E86\u4EC0\u4E48\uFF08\u8C31\uFF09/ \u4F11\u606F\u5BA4 \u00B7 \u2026 / \u5F55\u97F3\u5BA4 \u00B7 \u2026 / \u5C01\u9762 \u00B7 \u2026\uFF08\u53EA\u6709\u4E00\u5F20\u7EB8 / \u4E00\u4E2A\u58F0\u90E8\u65F6\u4E0D\u5570\u55E6\uFF09\u3002 */\nfunction locusText(at: EditorState, l: Locus): string {\n  const k = at.song.papers.findIndex((p) => p.id === at.at.paper), paperName = at.song.papers[k]?.name || `\u7B2C ${k + 1} \u6BB5`;\n  const part = at.song.parts.find((p) => p.id === at.at.part), partName = part ? roleName(D.extras, part.role) : \"\";\n  if (l.kind === \"score\") return `${at.song.papers.length > 1 ? paperName + \" \u00B7 \" : \"\"}${at.song.parts.length > 1 ? partName + \" \u00B7 \" : \"\"}${l.label}`;\n  if (l.kind === \"paper\") return `${paperName} \u00B7 ${l.label}`;\n  return `${l.kind === \"lounge\" ? \"\u4F11\u606F\u5BA4\" : l.kind === \"studio\" ? \"\u6DF7\u97F3\u53F0\" : \"\u5C01\u9762\"} \u00B7 ${l.label}`;\n}\nfunction renderUndo(): void { $<HTMLButtonElement>(\"undoBtn\").disabled = !D.history.past.length; $<HTMLButtonElement>(\"redoBtn\").disabled = !D.history.future.length; }\n\n// \u2500\u2500 \u64AD\u653E\uFF1A\u6708\u8BFB\u5531\uFF08\u7B2C\u4E00\u6B21\u8981\u52A0\u8F7D\u5F15\u64CE\uFF0C\u4E4B\u540E\u590D\u7528\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst singer = new Singer();\n/** \u5531 / \u5BFC\u51FA\u7684\u8FDB\u5EA6 = \u9876\u680F\u8D70\u5E26\u6761\u65C1\u8FB9\u7684\u5C0F\u5B57\uFF08\u505C\u4E86\u5C31\u6E05\uFF09\u3002 */\n// \u9876\u680F\u7684\u5C0F\u72B6\u6001\u884C\u64A4\u4E86\uFF082026-10-10 user\u300C\u5C0F\u72B6\u6001\u680F\u4E0D\u8981\u653E\u5728\u9876\u680F\uFF0C\u8FD9\u6837\u4F1A\u8BA9\u9876\u680F\u7684\u6309\u94AE\u91CD\u62CD\u2026\u6216\u8005\u5C31\u4E0D\u663E\u793A\uFF1F\u53CD\u6B63\u6709log\uFF0C\u7528\u6237\u4E5F\u4E0Dcare\uFF0C\u6709\u91CD\u8981\u7684\u4E8B\u60C5\u6709toast\u300D\uFF09\uFF1A\n//   \u6587\u5B57\u8FDB\u9ED1\u5323\u5B50\uFF08\u540C\u4E00\u53E5\u6362\u6570\u5B57\u4E0D\u91CD\u590D\u8BB0\uFF09\uFF1B\u5E26\u767E\u5206\u6BD4\u7684\uFF08\u4E0B\u8F7D\uFF09\u63A8\u9876\u680F\u5E95\u8FB9\u90A3\u6761\u7EC6\u7EBF\uFF08\u4E0D\u5360\u4F4D\u7F6E\u3001\u4E0D\u6324\u6309\u94AE\uFF09\u3002\nlet statusLast = \"\", statusBar = false;\nconst progress = (s: string): void => {\n  const pc = /(\\d+)%/.exec(s);\n  if (pc) { if (!renderBar.running) { renderBar.start(1); statusBar = true; } renderBar.frac(Number(pc[1]) / 100); }\n  else if (!s && statusBar) { renderBar.end(); statusBar = false; }\n  const key = s.replace(/\\d+(\\.\\d+)?/g, \"#\");\n  if (s && key !== statusLast) diagNote(\"status\", s);\n  statusLast = key;\n};\n/** \u4E00\u6B21\u6027\u7684\u6D88\u606F\uFF08\u5B58\u597D\u4E86\u3001\u5DF2\u5206\u4EAB\u2026\uFF09= toast\uFF0C3 \u79D2\uFF08\u5BB6\u65CF @internal/workbench-elements \u7684 notice\uFF1B\u9519\u8BEF\u53E6\u89C1 showError\uFF09\u3002 */\nconst info = (s: string) => { showNotice({ id: \"info\", level: \"info\", text: s, autoHideMs: 3000 }); };\n/** \u62A5\u9519\uFF1A\u7EA2\u8272 toast\uFF0C\u5E26\u5B8C\u6574\u539F\u56E0\uFF0C\u70B9\u4E86\u624D\u6536\uFF08\u5BB6\u65CF\u56DB\u7EA7 notice \u7684 error\uFF09\u3002user 2026-10-07\u300C\u66FF\u8865\u4E0D\u80FD\u9759\u9ED8\u66FF\u8865\uFF0C\u9700\u8981\u663E\u793A\u62A5\u9519\u300D\u2192 \u8BA2\u6B63\u300C\u4E0D\u662F\u663E\u793A\u81EA\u52A8\u4E0A\uFF0C\u800C\u662F\u5C31\u662F\u4E0D\u51FA\u58F0\uFF0C\u62A5\u9519\uFF0C\u4EBA\u7C7B\u624B\u52A8\u6362\u300D\uFF1A\n *  \u6210\u5458\u4E0A\u4E0D\u4E86\u573A\u5C31\u4E0D\u51FA\u58F0\u3001\u62A5\u9519\uFF0C\u6362\u8C01\u7531\u4EBA\u6765\uFF08\u9009\u89D2\u662F\u7A84\u63A5\u53E3\uFF1B\u8C31\u5B50\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002 */\nfunction showError(text: string): void { reportError(text, \"error\"); }   // \u552F\u4E00\u6F0F\u6597\uFF08notice + \u9ED1\u5323\u5B50\uFF09\n// \u2500\u2500 \u64AD\u653E = \u65F6\u95F4\u7EBF + \u5F55\u97F3\u623F\uFF082026-10-09 Claude Fable 5.1\uFF0C\u5B9E\u65F6\u8BD5\u542C\u5200 1\uFF1B\u63D0\u6848 ai-docs/20261009-realtime-preview-engine-proposal.md\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//   \u8C31 \u2192 \u65F6\u95F4\u7EBF\uFF08\u79D2\uFF1Bsrc/engine/timeline.ts\uFF09\u2192 \u5F55\u97F3\u623F\uFF08\u97F3\u9891\u7EBF\u7A0B\u91CC\u8D70\u5E26 / \u901A\u9053 / SoundFont / \u5143\u97F3 / \u5757\u56DE\u653E\uFF1Bsrc/engine/studio.ts\uFF09\u3002\n//   \u6708\u8BFB\u6309\u53E5\u51FA\u5757\uFF08\u5185\u5BB9\u952E\u7F13\u5B58\uFF1B\u8FD9\u4E00\u5200\u4ECD\u5728\u5F00\u64AD\u524D\u628A\u5757\u5531\u9F50\uFF0C\u8FB9\u7B97\u8FB9\u653E\u5F52\u5200 2\uFF09\uFF1B\u4ECE\u5149\u6807\u653E\u3001\u9009\u4E00\u6BB5\u3001\u5FAA\u73AF\u3001\u8FB9\u653E\u8FB9\u8C03\u6DF7\u97F3\u3001\u8303\u56F4\u5C3E / \u5FAA\u73AF\u70B9\u4E0D\u5207\u5C3E\u97F3\u3002\n//   \u65E7\u8DEF\uFF08\u6574\u9996\u79BB\u7EBF\u6E32\u67D3\u6210\u4E00\u6761 \u2192 AudioBufferSource\uFF1B\u5FAA\u73AF\u6BB5\u6E32\u67D3\u4E24\u904D\uFF1Bsrc/audio/mix.ts\uFF09\u5DF2\u5220\uFF08user\u300C\u65E7\u5F15\u64CE\u4E0D\u7528\u7559\u5FF5\u5FF5\u65E7\uFF0C\u53EA\u662Fplaceholder\uFF0C\u53EF\u4EE5\u5927\u5200\u9614\u65A7\u6539\u300D\uFF09\u3002\nconst playBtns = (): HTMLElement[] => [$(\"playBtn\"), $(\"dockPlay\")].filter((x): x is HTMLElement => !!x);\nconst playIcon = (playing: boolean) => { for (const b of playBtns()) { b.innerHTML = `<svg class=\"ico\"><use href=\"#${playing ? \"stop\" : \"play-from-start\"}\"/></svg>`; b.classList.toggle(\"is-on\", playing); } drawIssueBadges(); if (!playing) progress(\"\"); };   // \u4E00\u4E2A\u4E3B\u952E\uFF1A|\u25B6 \u4ECE\u8D77\u70B9\u653E / \u25A0 \u505C\uFF08user\u300C\u5148\u53EA\u6709\u4E00\u4E2A\u952E\u300D\uFF09\n// \u2500\u2500 \u56DB\u4E2A\u51FA\u53E3\uFF08ADR-0004 \u00A72.2\u00BD\uFF1Buser 2026-10-14\u300C\u4E00\u5957\u673A\u5236\u3001\u56DB\u4E2A\u51FA\u53E3 \u540C\u610F\u300D\uFF09\uFF1A\u6E05\u5355\u4F4F\u80F6\u6C34\uFF08performance.ts issues\uFF09\uFF0C\u8FD9\u91CC\u753B \u2460 \u8C31\u4E0A\u300C\u4E0D\u51FA\u58F0\u300D\u89D2\u6807 \u2461 |\u25B6 \u89D2\u4E0A\u7684\u6570\u5B57\uFF08\u70B9\u5B83 = \u5F00\u6E05\u5355\uFF09\u2462 toast \u7531\u80F6\u6C34\u5728\u6E05\u5355\u53D8\u4E86\u65F6\u8BF4 \u2463 \u5BFC\u51FA\u9762\u677F\u4E00\u884C \u2500\u2500\nlet issueParts = new Set<string>(), issueCount = 0;   // \u80F6\u6C34\u62A5\u7684\u6700\u65B0\u6E05\u5355\uFF08\u753B\u89D2\u6807\u7528\uFF1B\u6E32\u67D3\u65F6\u4E0D\u53BB\u95EE\u80F6\u6C34\uFF0C\u514D\u5F97\u521D\u59CB\u5316\u987A\u5E8F\uFF09\nfunction onIssuesChanged(list: readonly Issue[]): void { issueParts = new Set(list.map((i) => i.part)); issueCount = list.length; drawIssueBadges(); view.render(); }\nfunction drawIssueBadges(): void {\n  for (const b of playBtns()) {\n    b.querySelector(\".issues-badge\")?.remove();\n    if (issueCount) { const t = document.createElement(\"span\"); t.className = \"issues-badge\"; t.textContent = String(issueCount); t.title = `${issueCount} \u6761\u8F68\u4E0D\u51FA\u58F0\uFF1A\u70B9\u5F00\u770B\u6E05\u5355`; b.append(t); }\n  }\n}\n// \u2500\u2500 \u5531\u6B4C / \u64AD\u653E / \u5BFC\u51FA\u7684\u80F6\u6C34 = src/app/performance.ts\uFF08\u5200 1 \u4E4B\u4E8C\uFF0C2026-10-14\uFF09\uFF1A\u8FD9\u91CC\u53EA\u7ED9\u8BBF\u95EE\u5668\uFF0C\u62FF\u56DE\u4E00\u7EC4\u51FD\u6570 + \u8D70\u5E26\u6001\u7684 getter \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconst perfApi = createPerformance({\n  state: () => D.st, extras: () => D.extras, viewScope: () => viewScope, pv: (id) => pv(id), busMuted: () => busMuted, curRole: () => curRole(), docName: () => docName(),\n  engine, singer, view,\n  ui: { progress, info, showError, renderBar, playBtns, playIcon, offerFile: (f, t, m) => offerFile(f, t, m), onIssues: (list) => onIssuesChanged(list) },\n  sounds: { resolveGmBytes: (g) => sources.resolveGmBytes(g), ensureVowels, soundMemoryBytes, modelBases: () => models.bases() },\n  credits: { creditsOf: (roles, rights) => creditsOf(roles, rights), creditsBlock: (lines, title) => creditsBlock(lines, title) },\n  final: () => { const f = D.extras.final, b = D.extras.finalMp3; if (!f || !b) return null; const roles = D.st.song.parts.filter((p) => f.parts.includes(p.id)).map((p) => p.role); return { mp3: b, secs: f.mp3.secs, kbps: f.mp3.kbps, stereo: f.mp3.stereo, roles }; },\n});\nconst { humOpt, resetLatencyLog, refreshIssues, playSong, curFlat, songIn, audibleParts, micOf, channelOf, pushChannels, lowestMidiOf, songBpm, performerInfo, renderMixForTest, tickOfCaret, playPause, resumePlay, playFromHere, playFromHead, playSeam, stopPlay, setLoop, schedulePlaybackRefresh, schedulePrewarm, prepareBank, exportRights, exportSong, resourceSnapshot, onSongSwitch, jumpPlaybackToPaper, previewTrack } = perfApi;\nconst BUDGET = perfApi.budget, TURN_LEADS = perfApi.TURN_LEADS;\n/** \u7126\u70B9\u5728\u80FD\u6253\u5B57\u7684\u6846\u91CC\uFF08\u6587\u5B57\u8F93\u5165 / \u591A\u884C\uFF09\uFF1A\u7A7A\u683C\u5F52\u5B83\u3002\u63A8\u5B50\uFF08range\uFF09\u3001\u4E0B\u62C9\u3001\u6309\u94AE\u4E0D\u7B97\u3002 */\nfunction typingIn(t: EventTarget | null): boolean { const el = t as HTMLElement | null; if (!el) return false; if (el.tagName === \"TEXTAREA\" || el.isContentEditable) return true; return el.tagName === \"INPUT\" && ![\"range\", \"checkbox\", \"radio\", \"button\"].includes((el as HTMLInputElement).type); }\n/** \u6DF7\u97F3\u53F0\u4E0A\u4E00\u6761\u8F68\u7684 id \u2192 studio.json \u91CC\u90A3\u6761\u8F68\u7684 id\uFF08\u6B4C\u624B = \u5B83\u7684\u9EA6\u514B\u98CE\u8F68\uFF1B\u8DEF\u7531\u8F68 = \u81EA\u5DF1\uFF09\u3002 */\nfunction trackKey(track: string): string { return D.st.song.parts.find((x) => x.id === track)?.mic ?? track; }\nfunction routeName(track: string): string { if (track === \"master\") return \"\u603B\u8F68\"; const k = D.st.song.parts.findIndex((x) => x.id === track); return k >= 0 ? partLabels(D.st.song, D.extras)[k] : studioTrack(D.extras, track)?.name ?? track; }\n/** \u542C\u6A21\u5F0F\uFF082026-10-10 user\u300C\u8FD8\u6709\u4E00\u4E2A\u5C31\u662F\u64AD\u653E\u6A21\u5F0F\uFF0C\u9501\u5199\u8C31\uFF0C\u4F46\u662F\u53EF\u4EE5\u8C03\u5F55\u97F3\u5BA4\u300D\u300C\u6211\u86EE\u9700\u8981\u64AD\u653E\u6B23\u8D4F\u7684\u65F6\u5019\u9632\u8BEF\u89E6\u7684\u54C8\u54C8\u300D\uFF09\uFF1A\u8C31\u9501\u4F4F\uFF08\u8F7B\u70B9\u4E0D\u8DF3\u64AD\u3001\u957F\u6309 / \u53F3\u952E = \u4ECE\u8FD9\u513F\u653E\u3001\u62D6 = \u6EDA\u52A8\uFF09\uFF0C\n *  pad \u6536\u8D77\u3001\u952E\u76D8\u53EA\u8BA4\u7A7A\u683C\uFF08\u653E / \u6682\u505C\uFF09\u548C Esc\uFF08\u56DE\u5230\u5199\uFF09\uFF1B\u5F55\u97F3\u5BA4\u7167\u6837\u80FD\u5F00\u80FD\u8C03\u3002 */\n// \u2500\u2500 \u6A21\u5F0F + \u5E95\u5EA7\uFF082026-10-10 Opus 5.5\uFF1B\u89C4\u5219\u8868 = src/app/workspace.ts\uFF09\uFF1A\u97F3 / \u8BCD / \u7B26 + \u542C\uFF1Bpad \u90A3\u4E2A\u4F4D\u5B50 = \u5E95\u5EA7\uFF0C\u653E \u97F3\u952E / \u7B26\u53F7\u683C / \u5F55\u97F3\u5BA4\uFF08\u4E92\u65A5\uFF09\u3002\n//   user\u300C\u6A21\u5F0F\uFF01\u97F3\uFF0C\u6B4C\u8BCD\uFF0C\u5F3A\u5EA6\u548Carticulation\uFF01\u2026\u8FD8\u6709\u4E00\u4E2A\u5C31\u662F\u64AD\u653E\u6A21\u5F0F\uFF0C\u9501\u5199\u8C31\uFF0C\u4F46\u662F\u53EF\u4EE5\u8C03\u5F55\u97F3\u5BA4\u300D\u300C\u5F3A\u5EA6\u548C\u6F14\u594F\u6CD5\u80FD\u4E0D\u80FD\u5408\u5E76\uFF0C\u5C31\u662F\u7B26\u53F7\u7F16\u8F91\uFF0C\u548C\u522B\u7684\u7B26\u53F7\u4E5F\u5408\u5E76\u300D\n//   \u300C\u5F55\u97F3\u5BA4\u7684\u952E\u76D8\u4F4D\u5316\uFF0C\u548C\u952E\u76D8\u4E92\u76F8\u6392\u65A5\u2026\u952E\u76D8\u7684\u6A21\u5F0F\u952E\u662F\u4E0D\u662F\u80FD\u6458\u4E0B\u6765\u3002\u597D\u597D\u7406\u4E00\u4E0B\u67B6\u6784\u300D\u3002applyWorkspace \u662F\u552F\u4E00\u628A\u72B6\u6001\u843D\u5230\u754C\u9762\u4E0A\u7684\u5730\u65B9\u3002\nconst ws: WorkspaceState = { mode: \"notes\", collapsed: false, tryout: false };\nlet lastEditMode: Mode = \"notes\";   // \u4ECE\u300C\u542C\u300D\u56DE\u6765\u56DE\u5230\u54EA\nconst listenOn = () => ws.mode === \"listen\";\nfunction applyWorkspace(): void {\n  const d = dockOf(ws), padOn = d === \"keys\" || d === \"symbols\", wasEdit = view.rules.edit;\n  view.rules = RULES[ws.mode];\n  document.body.dataset.wmode = ws.mode; document.body.classList.toggle(\"listen-mode\", ws.mode === \"listen\"); document.body.classList.toggle(\"doc-final\", finalOn()); scoreEl.dataset.mode = ws.mode;   // \u4E0D\u7528 body[data-mode]\uFF1A\u6B4C\u5E93\u81EA\u5DF1\u7528\u5B83\uFF08gallery\uFF09\n  dockTab.querySelectorAll<HTMLElement>(\".mode-seg [data-mode]\").forEach((b) => b.classList.toggle(\"is-on\", b.dataset.mode === barMode(ws.mode)));   // \u7528\u7B26\u53F7\u683C\u65F6\u300C\u97F3\u300D\u4EAE\n  const changed = padEl.hidden === padOn || stageEl.dataset.dock !== d;\n  stageEl.dataset.dock = d;\n  padEl.hidden = !padOn; pad.setSymbols(d === \"symbols\"); if (!padOn) pad.clearHeld();\n  if (d === \"studio\" && !studio.isOpen) { studio.show(); void engine.ensure().then(() => { engine.meter(true); syncSpectrum(); }).catch(() => undefined); }   // \u5CF0\u503C\u8868 / \u9891\u8C31\uFF1A\u5F00\u7740\u624D\u8981\n  else if (d !== \"studio\" && studio.isOpen) { studio.hide(); engine.meter(false); syncSpectrum(); }\n  updateChrome();\n  if (changed || wasEdit !== view.rules.edit) view.render();   // \u8FDB\u51FA\u300C\u542C\u300D\uFF1A\u5408\u79DF\u7684\u6BCF\u4E00\u5BB6\u53E0\u8D77\u6765 / \u56DE\u5230\u8DDF\u7740\u5149\u6807\uFF08v0.10.29\uFF09\n}\n/** \u6362\u6A21\u5F0F\uFF1A\u6536\u8D77\u7F16\u8F91\u6846\uFF1B\u8FDB\u300C\u97F3 / \u7B26\u300D= \u952E\u76D8\u5F39\u51FA\u6765\uFF1B\u8FDB\u300C\u542C\u300D= \u8C31\u9501\u4F4F\u3001\u952E\u76D8\u6536\u8D77\uFF08\u5F55\u97F3\u5BA4\u5F00\u7740\u7684\u8BDD\u7559\u7740\uFF09\u3002 */\nfunction setMode(m: Mode): void {\n  if (m === ws.mode) return;\n  if (finalOn() && m !== \"listen\") { lockedSay(\"\u6A21\u5F0F\"); return; }   // \u7B2C \u2460 \u5C42\uFF1A\u5B9A\u7A3F\u7740\u53EA\u6709\u300C\u542C\u300D\n  ui.close(); view.lyrics.commitAndClose(); view.marks.commitAndClose();\n  if (m !== \"listen\") lastEditMode = m;\n  ws.mode = m; if (hasKeys(m)) ws.collapsed = false;\n  applyWorkspace();\n  // \u8FDB\u51FA\u300C\u542C\u300D\u4E0D\u5F39\u63D0\u793A\uFF08v0.10.10\uFF0Cuser\u300C\u7136\u540E\u542C\u7684\u65F6\u5019\u4F1A\u5F39\u4E00\u4E2Anudge chip\uFF0C\u6211\u89C9\u5F97\u90A3\u4E2Ainfo\u662F\u5E9F\u8BDD\uFF0C\u4E0D\u7528\u8BF4\u300D\uFF09\uFF1A\u8BF4\u660E\u5728\u300C\u542C\u300D\u94AE\u7684\u60AC\u505C\u63D0\u793A\u91CC\n}\nconst setListen = (on: boolean) => setMode(on ? \"listen\" : lastEditMode);\n/** \u542C\u6A21\u5F0F\u7684\u957F\u6309 / \u53F3\u952E\u5C0F\u83DC\u5355\uFF08\u8F7B\u70B9\u4E0D\u8DF3\u64AD\uFF0C\u9632\u8BEF\u89E6\uFF09\u3002 */\nfunction openListenMenu(at: { x: number; y: number }, a: { paper: string; part: string; index: number | null; caret: number; tick?: number }): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"track-card ctx-menu\"; box.setAttribute(\"role\", \"menu\");\n  const item = (v: string, label: string, title: string) => `<button class=\"btn ctx-item\" data-v=\"${v}\" title=\"${esc(title)}\">${label}</button>`;\n  box.innerHTML = item(\"here\", \"\u4ECE\u8FD9\u513F\u653E\", \"\u8D77\u70B9\u632A\u5230\u8FD9\u4E2A\u5C0F\u8282\u7684\u5934\uFF0C\u4ECE\u8FD9\u513F\u653E\") + (perfApi.paused && !engine.playing ? item(\"resume\", \"\u63A5\u7740\u653E\", \"\u4ECE\u4E0A\u6B21\u505C\u4E0B\u7684\u5730\u65B9\u63A5\u7740\u653E\") : \"\") + item(\"head\", \"\u4ECE\u5934\u653E\", \"\u8D77\u70B9\u56DE\u5230\u5F00\u5934\uFF0C\u4ECE\u5934\u653E\uFF08\u4E5F\u53EF\u4EE5\u8FDE\u6309\u4E24\u4E0B |\u25B6 / \u7A7A\u683C\uFF09\");\n  document.body.append(box);\n  const w = box.offsetWidth, h = box.offsetHeight, m = 8; let y = at.y + 10; if (y + h > innerHeight - m) y = at.y - h - 10;\n  box.style.left = `${Math.max(m, Math.min(at.x + 6, innerWidth - w - m))}px`; box.style.top = `${Math.max(m, y)}px`;\n  const outside = (e: PointerEvent) => { if (!box.contains(e.target as Node)) close(); };\n  const close = () => { document.removeEventListener(\"pointerdown\", outside, true); box.remove(); ui.closed(close); };\n  setTimeout(() => { if (box.isConnected) document.addEventListener(\"pointerdown\", outside, true); }, 0);\n  ui.open({ k: \"menu\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (!v) return;\n    close();\n    if (v === \"here\") playFromHere(a.paper, a.part, a.tick ?? tickOfCaret(a.paper, a.part, a.index ?? a.caret));   // tick = \u8C31\u9762\u70B9\u7684\u90A3\u4E00\u523B\uFF08score-view \u7B97\u597D\uFF1A\u8865\u9F50\u7684\u7A7A\u5C0F\u8282 / \u5408\u79DF\u53E0\u8D77\u6765\u7684\u884C\u90FD\u5BF9\uFF09\n    else if (v === \"resume\") resumePlay();\n    else if (v === \"head\") playFromHead();\n  });\n}\n/** \u9876\u680F \u22EF\uFF1A\u5FAA\u73AF\uFF08\u5F00\u5173\uFF09/ \u4ECE\u5934\u653E / \u63A5\u7F1D\uFF08\u5F00\u4E86\u5FAA\u73AF\u624D\u6709\uFF09\u3002 */\nfunction openTransportMenu(btn: HTMLElement = $(\"playBtn\")): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"track-card ctx-menu\"; box.setAttribute(\"role\", \"menu\");\n  const item = (v: string, label: string, title: string) => `<button class=\"btn ctx-item\" data-v=\"${v}\" title=\"${esc(title)}\">${label}</button>`;\n  box.innerHTML = (perfApi.paused && !engine.playing ? item(\"resume\", \"\u63A5\u7740\u653E\", \"\u4ECE\u4E0A\u6B21\u505C\u4E0B\u7684\u5730\u65B9\u63A5\u7740\u653E\uFF08\u8D77\u70B9\u4E0D\u52A8\uFF09\") : \"\") +\n    (engine.playing || perfApi.paused ? item(\"reveal\", \"\u8DF3\u5230\u6B63\u5728\u653E\u7684\u5730\u65B9\", \"\u8C31\u6EDA\u5230\u6B63\u5728\u653E\uFF08\u505C\u7740 = \u505C\u4E0B\uFF09\u7684\u90A3\u4E00\u884C\uFF1B\u521A\u624D\u81EA\u5DF1\u6EDA\u8FC7\u4E5F\u7167\u6837\u8FC7\u53BB\u3001\u63A5\u7740\u8DDF\") : \"\") +\n    `<div class=\"ctx-row\" title=\"\u7FFB\u8C31\u63D0\u524D\u591A\u5C11\uFF1A\u5FEB\u5230\u884C\u5C3E\uFF08\u6216\u7F16\u6392\u8DF3\u56DE\u53BB\u4E4B\u524D\uFF09\u8FD9\u4E48\u4E45\u5C31\u5148\u7FFB\u8FC7\u53BB\uFF0C\u6700\u540E\u4E00\u5C0F\u622A\u9760\u8BB0\u2014\u2014\u50CF\u94A2\u7434\u5BB6\u7FFB\u8C31\u30020 = \u6362\u4E86\u884C\u624D\u7FFB\"><span class=\"ctx-lab\">\u63D0\u524D\u7FFB</span>${TURN_LEADS.map((v) => `<button class=\"btn ctx-seg${v === perfApi.turnLead ? \" is-on\" : \"\"}\" data-v=\"lead:${v}\">${v ? `${v} s` : \"\u4E0D\"}</button>`).join(\"\")}</div>` +\n    item(\"follow\", `${view.autoFollow ? \"\u2713 \" : \"\"}\u81EA\u52A8\u7FFB`, \"\u653E\u7740\u7684\u65F6\u5019\u8C31\u8DDF\u7740\u6B63\u5728\u653E\u7684\u90A3\u4E00\u884C\u6EDA\uFF08\u51FA\u4E86\u5C4F\u5E55\u8212\u670D\u7684\u90A3\u4E00\u6BB5\u624D\u6EDA\uFF1B\u4F60\u81EA\u5DF1\u6EDA\u8FC7 4 \u79D2\u5185\u4E0D\u8DDF\uFF09\") +\n    item(\"loop\", `${perfApi.loopOn ? \"\u2713 \" : \"\"}\u5FAA\u73AF`, \"\u653E\u5230\u5934\u63A5\u7740\u4ECE\u5934\u653E\uFF1B\u7F16\u6392\u5199\u4E86 [\u5FAA\u73AF\u6BB5] = \u524D\u9762\u653E\u4E00\u904D\u3001\u62EC\u4F4F\u7684\u4E00\u76F4\u5FAA\u73AF\") +\n    item(\"head\", \"\u4ECE\u5934\u653E\", \"\u8D77\u70B9\u56DE\u5230\u5F00\u5934\uFF0C\u4ECE\u5934\u653E\uFF08\u4E5F\u53EF\u4EE5\u8FDE\u6309\u4E24\u4E0B |\u25B6 / \u7A7A\u683C\uFF09\") + (perfApi.loopOn ? item(\"seam\", \"\u542C\u63A5\u7F1D\", \"\u4ECE\u5FAA\u73AF\u6BB5\u7ED3\u5C3E\u524D\u51E0\u79D2\u653E\u8D77\uFF0C\u8DF3\u56DE\u5F00\u5934\u518D\u653E\u51E0\u79D2\u5C31\u505C\") : \"\");\n  document.body.append(box);\n  const b = btn.getBoundingClientRect(), w = box.offsetWidth, h = box.offsetHeight, m = 8;\n  box.style.left = `${Math.max(m, Math.min(b.left, innerWidth - w - m))}px`;\n  box.style.top = `${b.bottom + 4 + h <= innerHeight - m ? b.bottom + 4 : Math.max(m, b.top - h - 4)}px`;   // \u5E95\u5EA7\u8FB9\u4E0A\u90A3\u4E2A\uFF1A\u4E0B\u9762\u653E\u4E0D\u4E0B = \u5F80\u4E0A\u5F00\n  const outside = (e: PointerEvent) => { if (!box.contains(e.target as Node) && !btn.contains(e.target as Node)) close(); };\n  const close = () => { document.removeEventListener(\"pointerdown\", outside, true); box.remove(); ui.closed(close); };\n  setTimeout(() => { if (box.isConnected) document.addEventListener(\"pointerdown\", outside, true); }, 0);\n  ui.open({ k: \"menu\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (!v) return;\n    close();\n    if (v === \"resume\") resumePlay();\n    else if (v.startsWith(\"lead:\")) { perfApi.turnLead = Number(v.slice(5)); info(perfApi.turnLead ? `\u7FFB\u8C31\u63D0\u524D ${perfApi.turnLead} \u79D2` : \"\u7FFB\u8C31\u4E0D\u63D0\u524D\uFF08\u6362\u4E86\u884C\u624D\u7FFB\uFF09\"); }\n    else if (v === \"reveal\") { if (!view.revealPlayhead()) info(\"\u73B0\u5728\u6CA1\u6709\u5728\u653E\u7684\u5730\u65B9\"); }\n    else if (v === \"follow\") { view.autoFollow = !view.autoFollow; info(view.autoFollow ? \"\u81EA\u52A8\u7FFB\uFF1A\u5F00\" : \"\u81EA\u52A8\u7FFB\uFF1A\u5173\"); }\n    else if (v === \"loop\") setLoop(!perfApi.loopOn);\n    else if (v === \"head\") playFromHead();\n    else if (v === \"seam\") playSeam();\n  });\n}\n/** \u70B9 = \u653E / \u505C\uFF08\u8FDE\u6309\u4E24\u4E0B = \u4ECE\u5934\u653E\uFF09\uFF1B\u957F\u6309 / \u53F3\u952E = \u8D70\u5E26\u83DC\u5355\uFF08\u957F\u6309\u677E\u5F00\u4E0D\u518D\u7B97\u4E00\u4E0B\u70B9\uFF09\u3002 */\nfunction wirePlayBtn(btn: HTMLElement): void {\n  let timer = 0, held = false;\n  const cancel = () => clearTimeout(timer);\n  btn.addEventListener(\"pointerdown\", (e) => { if (e.button !== 0 || (e.target as HTMLElement).closest(\".issues-badge\")) return; held = false; cancel(); timer = window.setTimeout(() => { held = true; openTransportMenu(btn); }, 500); });\n  btn.addEventListener(\"pointerup\", cancel); btn.addEventListener(\"pointerleave\", cancel); btn.addEventListener(\"pointercancel\", cancel);\n  btn.addEventListener(\"click\", (e) => { if ((e.target as HTMLElement).closest(\".issues-badge\")) { openIssuesSheet(); return; } if (held) { held = false; return; } playPause(e.timeStamp); });   // \u89D2\u4E0A\u7684\u6570\u5B57 = \u5F00\u4E0D\u51FA\u58F0\u7684\u6E05\u5355\uFF0C\u4E0D\u662F\u653E\n  btn.addEventListener(\"contextmenu\", (e) => { e.preventDefault(); cancel(); openTransportMenu(btn); });\n}\nwirePlayBtn($(\"playBtn\")); wirePlayBtn($(\"dockPlay\"));\ndockTab.querySelectorAll<HTMLElement>(\".mode-seg [data-mode]\").forEach((b) => b.addEventListener(\"click\", () => {\n  const m = b.dataset.mode as Mode;\n  // \u70B9\u4EAE\u7740\u7684\u90A3\u4E2A = \u628A\u5B83\u5E95\u4E0B\u7684\u4E1C\u897F\u5F39\u51FA\u6765\uFF08\u97F3 / \u7B26 = \u952E\u76D8\uFF0C\u542C = \u6DF7\u97F3\u53F0\uFF09\uFF1B\u53EA\u5F39\u4E0D\u6536\uFF08\u5E42\u7B49\uFF09\u3002v0.10.42\uFF0Cuser\u300Cidiempotent\u70B9\u542C\uFF0C\u97F3\u4E5F\u5E94\u8BE5\u8DF3\u51FA\u76F8\u5E94\u7684\u8F6F\u952E\u76D8\u300D\n  if (barMode(ws.mode) === m) { if (hasKeys(ws.mode) && ws.collapsed) showPad(true); return; }\n  setMode(m);\n}));   // \u7528\u7B26\u53F7\u683C\u65F6\u70B9\u300C\u97F3\u300D= \u5DF2\u7ECF\u5728\u300C\u97F3\u300D\u91CC\uFF0C\u4E0D\u6362\u952E\u76D8\n// \u770B\u54EA\u4E00\u6BB5 / \u770B\u54EA\u4F4D\u6B4C\u624B\uFF08v0.10.2\uFF09\uFF1A\u5168\u90E8 = \u90FD\u770B\uFF1B\u9009\u4E00\u6BB5 = \u672C\u6BB5\u89C6\u56FE\u8DF3\u5230\u5B83\uFF1B\u9009\u4E00\u4F4D = \u300C\u53EA\u770B\u5B83\u300D\uFF08\u522B\u7684\u7F29\u6210\u7EC6\u884C\uFF09\uFF0C\u518D\u9009\u300C\u5168\u90E8\u300D= \u90FD\u770B\n$(\"paperSel\").addEventListener(\"change\", (e) => {\n  const v = (e.target as HTMLSelectElement).value; (e.target as HTMLSelectElement).blur();\n  if (v === \"all\") viewScope = \"all\"; else { viewScope = \"segment\"; if (v !== D.st.at.paper) navPaperTo(v); }\n  view.render(); updateChrome();\n});\n$(\"partSel\").addEventListener(\"change\", (e) => {\n  const v = (e.target as HTMLSelectElement).value; (e.target as HTMLSelectElement).blur();\n  for (const p of D.st.song.parts) setPv(p.id, { only: v !== \"all\" && p.id === v });\n  afterViewChange(); updateChrome();\n});\n/** \u5D4C\u8FDB\u6B4C\u7684\u8F6F\u4E0A\u9650\uFF08user 2026-10-07\u300C\u63A7\u5236\u572810M\u5DE6\u53F3\u7684\u4F53\u79EF\uFF08\u4E0D\u4E25\u683C\u8981\u6C42\uFF09\u300D\uFF09\uFF1A\u8D85\u4E86\u4E09\u9009\u4E00\u2014\u2014\u5D4C / \u4E0D\u5D4C\u53EA\u8BB0\u6765\u6E90\uFF08\u5F31\u5F15\u7528\uFF09/ \u7B97\u4E86\u3002 */\nlet embedSoftLimit = 10e6;\n// \u97F3\u6E90\u6765\u6E90 + \u5F31\u5F15\u7528\u89E3\u6790 = src/sources/sounds.ts\uFF08\u5200 4 \u97F3\u6E90\u6765\u6E90\u63A5\u7F1D\uFF0C2026-10-15\uFF09\uFF1B\u8FD9\u91CC\u53EA\u7559\u4E00\u4E2A\u5B9E\u4F8B\nconst sources = createSoundSources({ progress: (m) => progress(m), roleLabel: () => roleName(D.extras, curRole()) });\n\n// \u2500\u2500 \u5BFC\u51FA\u6B4C\u58F0\uFF08user\u300C\u57FA\u4E8Ewxhw\u7684\u7ECF\u9A8C\u5206\u4EAB\u662F\u53EF\u4EE5\u5F88\u65E9\u5C31\u505A\u300D\uFF09\uFF1A\u7167 WXHW \u7684\u5F62\u72B6\u2014\u2014\u5148\u751F\u6210\uFF0C\u518D\u5F39\u300C\u597D\u4E86\u300D\u9762\u677F\uFF0C\n//    \u70B9\u300C\u5206\u4EAB\u300D\u90A3\u4E00\u4E0B\u624D\u8C03\u7CFB\u7EDF\u5206\u4EAB\uFF08iOS Safari \u53EA\u8BA4\u7528\u6237\u624B\u52BF\u91CC\u7684 navigator.share\uFF09\uFF1B\u6CA1\u6709\u5206\u4EAB\u7684\uFF08\u684C\u9762 / Quest\uFF09= \u4E0B\u8F7D\u3002\n/** \u5BFC\u51FA\u9762\u677F\u8BB0\u4F4F\u7684\u9009\u62E9\uFF08\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\uFF09\u3002 */\nlet mp3Scope: \"all\" | \"segment\" = \"all\";   // \u8303\u56F4\u53EA\u5728\u8FD9\u6B21\u6253\u5F00\u91CC\u8BB0\u7740\uFF1B\u97F3\u8D28\u8DDF\u6B4C\u8D70\uFF08desk\uFF0C\u89C1 viewScope \u65C1\u8FB9\uFF09\n/** \u5BFC\u51FA\u6B4C\u58F0\u524D\u7684\u9762\u677F\uFF08user 2026-10-08\u300Cmp3\u5BFC\u51FA\u53EF\u80FD\u672C\u6765\u5C31\u8BE5\u6709\u4E00\u4E2A\u5BF9\u8BDD\u6846\uFF1F\u6BD4\u5982quality\u4E4B\u7C7B\u7684\uFF1F\u300D\u2192\u300C\u597D\uFF0C\u540C\u610F\u300D\uFF09\uFF1A\u97F3\u8D28 / \u8303\u56F4\uFF0C\u90FD\u9884\u8BBE\u597D\uFF0C\u70B9\u300C\u5BFC\u51FA\u300D\u5C31\u8D70\u3002\n *  \u8BB8\u53EF\u90A3\u4E00\u884C\u53EA\u5728\u7528\u6237\u81EA\u5DF1\u9009\u8FC7\u8BB8\u53EF\u65F6\u624D\u51FA\u73B0\uFF08user\u300C\u53EA\u6709\u7528\u6237\u81EA\u5DF1\u5173\u5FC3\u534F\u8BAE\u7684\u65F6\u5019\u624D\u63D0\u51FA\u8FD9\u4E9B\u300D\uFF09\u3002 */\n/** \u00A72.2\u00BD \u51FA\u53E3 \u2461\uFF1A\u4E0D\u51FA\u58F0\u7684\u58F0\u90E8\u6E05\u5355\uFF08\u975E\u6A21\u6001\u5C0F\u9762\u677F\uFF0C\u6BCF\u884C\u4E00\u4E2A\u8BE5\u6309\u7684\u94AE\uFF09\u3002\u5165\u53E3 = |\u25B6 \u89D2\u4E0A\u7684\u6570\u5B57\u3002\u4E0D\u66FF\u4EBA\u6362\u3001\u4E0D\u81EA\u6108\uFF0810-07 \u7EAA\u5F8B\uFF09\u3002 */\nfunction openIssuesSheet(): void {\n  ui.close();\n  const list = perfApi.issues(); if (!list.length) { info(\"\u73B0\u5728\u7684\u58F0\u90E8\u90FD\u80FD\u51FA\u58F0\"); return; }\n  const box = document.createElement(\"div\"); box.className = \"offer\";\n  box.innerHTML = `<div class=\"offer-card settings-card\"><div class=\"offer-title\">\u4E0D\u51FA\u58F0\u7684\u58F0\u90E8</div>` +\n    list.map((i) => `<div class=\"set-row issue-row\"><div class=\"issue-text\"><b>${esc(i.label)}</b><small>${esc(i.why)}</small></div><button class=\"btn primary\" data-v=\"inst:${esc(i.part)}\">\u6362\u4EBA / \u627E\u58F0\u97F3\u2026</button></div>`).join(\"\") +\n    `<div class=\"offer-msg\">\u653E\u548C\u5BFC\u51FA\u7684 mp3 \u91CC\u90FD\u6CA1\u6709\u8FD9${list.length > 1 ? `${list.length} \u6761\u8F68` : \"\u6761\u8F68\"}\u7684\u58F0\u97F3\uFF0C\u5176\u4F59\u7167\u653E\u3002\u6362\u8C01\u7531\u4F60\u5B9A\uFF0C\u4E0D\u66FF\u8865\u3002</div>` +\n    `<div class=\"offer-btns\"><button class=\"btn\" data-v=\"close\">\u77E5\u9053\u4E86</button></div></div>`;\n  document.body.append(box);\n  const close = () => { box.remove(); ui.closed(close); };\n  ui.open({ k: \"sheet\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"close\") { close(); return; }\n    if (v?.startsWith(\"inst:\")) { close(); goToPartInst(v.slice(5)); }\n  });\n}\n/** \u5149\u6807\u632A\u5230\u8FD9\u4F4D\u6B4C\u624B\uFF08\u4F18\u5148\u8FD9\u5F20\u7EB8\uFF0C\u6CA1\u6709\u5C31\u7B2C\u4E00\u5F20\u6709\u5B83\u7684\u7EB8\uFF09\u518D\u5F00\u4E50\u5668\u9875\u3002 */\nfunction goToPartInst(partId: string): void {\n  const paper = D.st.song.papers.find((pp) => pp.id === D.st.at.paper && pp.tracks[partId]) ?? D.st.song.papers.find((pp) => pp.tracks[partId]);\n  if (paper && (paper.id !== D.st.at.paper || D.st.at.part !== partId)) update(setFocus(D.st, paper.id, partId));\n  openInstPage();\n}\nfunction openMp3Panel(): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"offer\";\n  const paper = D.st.song.papers.find((p) => p.id === D.st.at.paper), k = D.st.song.papers.indexOf(paper!);\n  const draw = () => {\n    const chip = (v: string, label: string, note: string, on: boolean) => `<button class=\"btn cand${on ? \" is-on\" : \"\"}\" data-v=\"${v}\">${esc(label)}<small>${esc(note)}</small></button>`;\n    const er = D.st.song.rights ? exportRights(soundingRoles()) : null;\n    const fin = D.extras.final;\n    box.innerHTML = `<div class=\"offer-card settings-card\"><div class=\"offer-title\">\u5BFC\u51FA\u6B4C\u58F0\uFF08mp3\uFF09</div>` +\n      (fin ? `<div class=\"offer-msg\">\u5B9A\u7A3F\u7684\u90A3\u4E00\u4EFD\uFF08\u7B2C ${fin.rev} \u7248 \u00B7 ${fin.mp3.stereo ? \"\u7ACB\u4F53\u58F0\" : \"\u5355\u58F0\u9053\"} ${fin.mp3.kbps}k \u00B7 ${mp3SizeText(fin.mp3.bytes)}\uFF09\u76F4\u63A5\u5BFC\u51FA\uFF0C\u4E0D\u91CD\u6E32\uFF1B\u8981\u522B\u7684\u97F3\u8D28\u5148\u300C\u6539\u7A3F\u300D\u3002</div>` :\n      `<div class=\"part-sec\">\u97F3\u8D28</div><div class=\"set-row\">${(Object.keys(MP3_QUALITY) as Mp3Quality[]).map((q) => chip(`q:${q}`, MP3_QUALITY[q].label, MP3_QUALITY[q].note, mp3Quality === q)).join(\"\")}</div>`) +\n      (D.st.song.papers.length > 1 && !fin ? `<div class=\"part-sec\">\u8303\u56F4</div><div class=\"set-row\">${chip(\"s:all\", \"\u6574\u9996\", \"\u9690\u85CF\u7684\u7EB8\u4E0D\u653E\", mp3Scope === \"all\")}${chip(\"s:segment\", \"\u8FD9\u4E00\u5F20\u7EB8\", paper?.name || `\u7B2C ${k + 1} \u5F20`, mp3Scope === \"segment\")}</div>` : \"\") +\n      (er ? `<div class=\"offer-msg\">\u8BB8\u53EF\uFF1A${er.fellBack ? `\u8FD9\u4EFD\u6309\u300C\u672A\u58F0\u660E\u300D\u5199\u2014\u2014\u4F60\u9009\u7684\u8BB8\u53EF\u5141\u8BB8\u522B\u4EBA\u6539\u7F16\uFF0C\u548C\u5C0F\u6708\u76F8\u7684\u6761\u6B3E\u53EF\u80FD\u51B2\u7A81\uFF08\u4F5C\u8005\u680F\u91CC\u7684\u9009\u62E9\u6CA1\u52A8\uFF09` : esc(er.rights!)}\u3002\u548C\u7F72\u540D\u4E00\u8D77\u5199\u8FDB mp3 \u7684\u6807\u7B7E\u3002</div>` : \"\") +\n      ((is) => (is.length ? `<div class=\"offer-msg issue-warn\">${is.length} \u6761\u8F68\u4E0D\u51FA\u58F0\uFF0Cmp3 \u91CC\u4E0D\u4F1A\u6709\u5B83\u4EEC\uFF1A${esc(perfApi.issuesText(is))}\u3002\u6362\u4EBA\u5728\u8C31\u524D\u9762\u7684\u58F0\u90E8\u540D\u91CC\u3002</div>` : \"\"))(perfApi.issues()) +   // \u00A72.2\u00BD \u51FA\u53E3 \u2463\uFF1A\u62A4\u680F\u5728\u9762\u677F\u91CC\uFF0C\u4E0D\u62E6\uFF08user\u300C\u4E0D\u8B66\u5BDF\u7528\u6237\u300D\uFF09\n      `<div class=\"offer-btns\"><button class=\"btn primary\" data-v=\"go\">${perfApi.issues().length ? \"\u7167\u6837\u5BFC\u51FA\" : \"\u5BFC\u51FA\"}</button><button class=\"btn\" data-v=\"close\">\u7B97\u4E86</button></div></div>`;\n  };\n  draw();\n  document.body.append(box);\n  const close = () => { box.remove(); ui.closed(close); scoreEl.focus(); };\n  ui.open({ k: \"sheet\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"close\") { close(); return; }\n    if (v?.startsWith(\"q:\")) { mp3Quality = v.slice(2) as Mp3Quality; draw(); }\n    else if (v?.startsWith(\"s:\")) { mp3Scope = v.slice(2) as \"all\" | \"segment\"; draw(); }\n    else if (v === \"go\") { close(); void exportSong({ quality: mp3Quality, scope: mp3Scope }); }\n  });\n}\n\n// \u6A21\u578B\u6765\u6E90\uFF08pwa-models\uFF09= src/sources/models.ts\uFF1A\u540C\u6E90 pwa-models/ \u5148\u3001\u518D\u8BBE\u7F6E\u91CC\u7684\uFF1B\u53EA\u5728\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\nconst models = createModelSources();\nconst packStore = createPackStore({ packs: PACKS });   // \u53EA\u7528\u6765\u5BFC\u5165 / \u770B\u72B6\u6001\uFF1B\u4E0B\u8F7D\u5728 worker \u91CC\uFF08\u540C\u4E00\u4E2A Cache Storage pwa-models\uFF09\nconst esc = (s: string) => s.replace(/[&<>\"]/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\" })[c]!);\nasync function packStatusText(): Promise<string> {\n  const packs = await packStore.status(Object.keys(PACKS));\n  return packs.map((s) => `${s.ready ? \"\u2713\" : \"\u00B7\"} ${s.slug}\uFF08${(s.bytesTotal / 1e6).toFixed(1)} MB\uFF09`).join(\"\\n\");\n}\n/** \u8BBE\u7F6E\u9762\u677F\uFF08\u5E94\u7528\u5185\uFF0C\u4E0D\u7528\u7CFB\u7EDF\u5F39\u7A97\uFF09\uFF1A\u6A21\u578B\u6765\u6E90\u3001\u4ECE\u672C\u673A\u6587\u4EF6\u5BFC\u5165\u6A21\u578B\u5305\u3001\u6708\u8BFB\u7684\u7F72\u540D\u4E0E\u4F7F\u7528\u6761\u6B3E\uFF08\u5305\u5185 LICENSE [1][2] \u8981\u6C42\u663E\u793A\uFF09\u3002 */\nfunction openSettings(): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"offer\";\n  box.innerHTML = `<div class=\"offer-card settings-card\"><div class=\"offer-title\">\u8BBE\u7F6E</div>` +\n    `<label class=\"set-field\">\u6A21\u578B\u6765\u6E90<input id=\"srcIn\" type=\"url\" spellcheck=\"false\" autocomplete=\"off\" value=\"${esc(models.source)}\" /></label>` +\n    `<label class=\"set-field\">\u97F3\u6E90\u5E93\u6765\u6E90\uFF08\u4E50\u5668\u97F3\u8272\u5E93\u3001\u9F13\u7EC4\u3001\u97F3\u6548\u7D20\u6750\uFF1B\u4E0D\u662F AI \u6A21\u578B\uFF09<input id=\"sndIn\" type=\"url\" spellcheck=\"false\" autocomplete=\"off\" value=\"${esc(sources.source)}\" /></label>` +\n    `<div class=\"set-field\">\u97F3\u6E90\u5E93\u7F13\u5B58\uFF08\u7559\u5728\u8BBE\u5907\u4E0A\uFF0C\u6CA1\u7F51\u4E5F\u80FD\u7528\uFF1B\u6B4C\u81EA\u5DF1\u5E26\u58F0\u97F3\uFF0C\u8FD9\u91CC\u53EA\u662F\u8D27\u67B6\uFF09<div id=\"sndCache\" class=\"set-packs\">\u2026</div></div>` +\n    `<div class=\"set-field\">MIDI \u952E\u76D8<div class=\"set-row\"><span id=\"midiSt\">${midiStatusHtml(midi.status)}</span>${midi.status.k === \"off\" || midi.status.k === \"denied\" ? `<button class=\"btn\" data-v=\"midi:connect\">\u8FDE\u63A5</button>` : \"\"}</div></div>` +\n    `<div class=\"offer-msg\">\u5148\u627E\u8FD9\u4E2A\u7F51\u7AD9\u4E0B\u7684 <code>pwa-models/</code>\uFF08\u81EA\u5DF1\u642D\u670D\u52A1\u5668\u7684\u8BDD\uFF0C\u628A\u6A21\u578B\u4ED3\u62F7\u8FC7\u53BB\u5C31\u80FD\u7528\uFF09\uFF0C\u627E\u4E0D\u5230\u518D\u7528\u8FD9\u91CC\u586B\u7684\u3002\u53EA\u5728\u8FD9\u6B21\u6253\u5F00\u91CC\u6709\u6548\u3002</div>` +\n    `<div class=\"set-row\"><button class=\"btn\" data-v=\"default\">\u6062\u590D\u9ED8\u8BA4</button>` +\n    `<label class=\"btn\" title=\"\u9009\u6A21\u578B\u5305\u7684\u5206\u7247\u6587\u4EF6\uFF08chunk-000 \u2026\uFF0C\u540D\u5B57\u4E0D\u91CD\u8981\uFF09\uFF0C\u6216\u6574\u4E2A\u5305\u62FC\u6210\u7684\u4E00\u4E2A\u6587\u4EF6\"><svg class=\"ico\"><use href=\"#import\"/></svg>\u4ECE\u672C\u673A\u6587\u4EF6\u5BFC\u5165\u6A21\u578B\u5305<input id=\"impIn\" type=\"file\" multiple hidden /></label></div>` +\n    `<pre id=\"packSt\" class=\"set-packs\">\u2026</pre>` +\n    `<details class=\"set-credit\"><summary>\u4E50\u5668\u76EE\u5F55\u7684\u56FE\u6807\uFF08\u7B2C\u4E09\u65B9\uFF0C${ICON_CREDITS.length} \u4E2A\uFF09</summary><pre>${esc(ICON_CREDITS.map((c) => `${c.id} \u2014 ${c.author} (${c.set}, ${c.license}) ${c.url}${c.modified ? `\\n    \u6539\u52A8\uFF1A${c.modified}` : \"\"}`).join(\"\\n\"))}</pre></details>` +\n    // \u539F\u6587\u5728\u4E0A\uFF08\u6761\u6B3E\u8981\u6C42\u7684\u662F\u539F\u6587\uFF09\uFF1B\u4E2D / \u82F1\u8BD1\u6587\u5728\u4E0B\u3001\u53EA\u7ED9\u4EBA\u8BFB\uFF08user 2026-10-08\u300C\u6708\u8BFB\u7684license\u7684\u5C55\u793A\u4F60\u5B88\u7684\u5F88\u7D27\uFF0C\u4F46\u662F\u6CA1\u505A\u7FFB\u8BD1\u300D\u300C\u8FD8\u6709\u82F1\u6587\uFF0C\u4E2D\u56FD\u4EBA\u8FD8\u80FD\u8BFB\u767D\u5B57\u300D\uFF09\n    `<details class=\"set-credit\"><summary>\u5C0F\u6708\u76F8\uFF08\u3064\u304F\u3088\u307F\u3061\u3083\u3093\uFF09\u7684\u7F72\u540D\u4E0E\u4F7F\u7528\u6761\u6B3E</summary><div class=\"part-sec\">\u539F\u6587\uFF08\u4EE5\u6B64\u4E3A\u51C6\uFF09</div><pre>${esc(CREDIT.credit)}\\n\\n${esc(CREDIT.terms)}\\n${esc(CREDIT.termsUrl)}\\n\\n${esc(CREDIT.attribution.join(\"\\n\"))}</pre>` +\n      `<div class=\"part-sec\">\u4E2D\u6587\u8BD1\u6587\uFF08\u4EC5\u4F9B\u9605\u8BFB\uFF0C\u4EE5\u65E5\u6587\u539F\u6587\u4E3A\u51C6\uFF09</div><pre>${esc(CREDIT_TRANSLATIONS.zh.credit)}\\n\\n${esc(CREDIT_TRANSLATIONS.zh.terms)}</pre>` +\n      `<div class=\"part-sec\">English translation (for reading only; the Japanese original is authoritative)</div><pre>${esc(CREDIT_TRANSLATIONS.en.credit)}\\n\\n${esc(CREDIT_TRANSLATIONS.en.terms)}</pre></details>` +\n    `<div class=\"set-field\">\u5C0F\u6708\u76F8\u7684\u5FF5\u7F13\u5B58\uFF08\u8BBE\u5907\u4E0A\u7684\u5168\u5C40\u6C60\uFF1A\u5FF5\u8FC7\u7684\u53E5\u5B50\u8DE8\u6B4C\u5171\u7528\uFF0C\u91CD\u5F00 app \u4E5F\u5728\uFF1B\u53EF\u518D\u751F\uFF0C\u6E05\u4E86\u53EA\u662F\u8981\u91CD\u5FF5\uFF09<div id=\"spCache\" class=\"set-packs\">\u2026</div><div class=\"set-row\"><button class=\"btn\" data-v=\"sp:clear\">\u6E05\u7A7A\u5FF5\u7F13\u5B58</button></div></div>` +\n    `<div class=\"set-field\">\u5F15\u64CE\u8D1F\u8F7D\u4E0E\u5185\u5B58\uFF08\u80FD\u7B97\u5230\u7684\u90E8\u5206\uFF1B\u8D85\u9884\u7B97\u4F1A\u5148\u653E\u5757\u3001\u518D\u51CF\u5E76\u884C\u3001\u518D\u8D81\u7A7A\u91CD\u5F00\u5F15\u64CE\uFF0C\u5E76\u5728\u8FD9\u91CC / \u72B6\u6001\u6761\u660E\u8BF4\uFF09<div id=\"engRes\" class=\"set-packs\">\u2026</div><div class=\"set-row\"><button class=\"btn\" data-v=\"eng:restart\" title=\"\u5C0F\u6708\u76F8\u5F15\u64CE\u7684 WASM \u5185\u5B58\u53EA\u6DA8\u4E0D\u843D\uFF0C\u53EA\u6709\u91CD\u5F00\u624D\u8FD8\u56DE\u53BB\uFF1B\u5FF5\u8FC7\u7684\u53E5\u5B50\u8981\u91CD\u5FF5\">\u91CD\u5F00\u5C0F\u6708\u76F8\u5F15\u64CE</button></div></div>` +\n    // \u5F00\u53D1\u8005\u8282\uFF08\u5BB6\u65CF\u89C4\u77E9 2\u00BD\uFF0C2026-10-21\uFF09\uFF1A\u8BCA\u65AD\u65E5\u5FD7 + \u300C\u8FD8\u539F\u51FA\u5382\u8BBE\u7F6E\u2026\u300D\u4F4F\u8FD9\u91CC\uFF1B\u300C\u68C0\u67E5\u66F4\u65B0 / \u6E05\u7F13\u5B58\u91CD\u542F\u300D\u7559\u5728\u666E\u901A\u90A3\u4E00\u884C\n    `<details class=\"set-credit set-dev\"><summary>\u5F00\u53D1\u8005</summary>` +\n      `<details class=\"set-credit\"><summary>\u8BCA\u65AD\u65E5\u5FD7\uFF08\u9ED1\u5323\u5B50\uFF1A\u51FA\u9519\u4E86\u628A\u8FD9\u4E2A\u53D1\u7ED9\u5F00\u53D1\u8005\uFF1B\u4E0D\u4E0A\u4F20\uFF0C\u53EA\u6709\u70B9\u300C\u590D\u5236 / \u5206\u4EAB\u300D\u624D\u79BB\u5F00\u8BBE\u5907\uFF09</summary><pre id=\"diagTxt\" class=\"set-packs diag-log\">${esc(diagText())}</pre><div class=\"set-row\"><button class=\"btn\" data-v=\"diag:copy\">\u590D\u5236</button><button class=\"btn\" data-v=\"diag:download\">\u4E0B\u8F7D .txt</button>${canShareDiag() ? `<button class=\"btn\" data-v=\"diag:share\">\u5206\u4EAB\u2026</button>` : \"\"}<button class=\"btn\" data-v=\"diag:clear\">\u6E05\u7A7A</button></div></details>` +\n      `<div class=\"set-field\">\u8FD8\u539F\u51FA\u5382\u8BBE\u7F6E\uFF08\u8FD9\u53F0\u8BBE\u5907\u4E0A MoonSinger \u7684\u5168\u90E8\u672C\u5730\u6570\u636E\u6E05\u6210\u65B0\u88C5\uFF1A\u6B4C\u5E93\u7684\u672C\u673A\u526F\u672C\u3001\u5FF5\u7F13\u5B58\u3001\u5C01\u9762\u7F13\u5B58\u3001\u8BBE\u7F6E\u3001\u8BCA\u65AD\u65E5\u5FD7\u3001\u79BB\u7EBF\u58F3\uFF1B\u4E91\u7AEF\u7684\u6B4C\u548C\u672C\u673A\u6587\u4EF6\u4E0D\u52A8\uFF1B\u5C0F\u6708\u76F8\u6A21\u578B\u5305\u662F\u5BB6\u65CF\u5171\u4EAB\u7F13\u5B58\uFF0C\u4E0D\u52A8\u2014\u2014\u5728\u4E0A\u9762\u300C\u6A21\u578B\u5305\u300D\u91CC\u9010\u4E2A\u5220\uFF09<div class=\"set-row\"><button class=\"btn danger\" data-v=\"factory\">\u8FD8\u539F\u51FA\u5382\u8BBE\u7F6E\u2026</button></div></div>` +\n    `</details>` +\n    `<div class=\"set-row set-app\"><span class=\"set-ver\">${APP_VERSION}</span><button class=\"btn\" data-v=\"check\">\u68C0\u67E5\u66F4\u65B0</button><button class=\"btn\" data-v=\"reset\" title=\"\u5361\u5728\u65E7\u7248\u672C\u65F6\u7528\uFF1A\u6CE8\u9500\u672C app \u7684\u79BB\u7EBF\u7F13\u5B58\u518D\u91CD\u5F00\u3002\u4E0B\u597D\u7684\u5C0F\u6708\u76F8\u6A21\u578B\u5305\u4E0D\u5220\">\u6E05\u7F13\u5B58\u91CD\u542F</button></div>` +\n    `<div class=\"offer-btns\"><button class=\"btn primary\" data-v=\"close\">\u597D</button></div></div>`;\n  document.body.append(box);\n  const srcIn = box.querySelector<HTMLInputElement>(\"#srcIn\")!, packSt = box.querySelector<HTMLElement>(\"#packSt\")!;\n  const refresh = () => { void packStatusText().then((t) => (packSt.textContent = t)); };\n  refresh();\n  const engRes = box.querySelector<HTMLElement>(\"#engRes\")!;\n  const refreshRes = () => { const lat = engine.latencyMs(); engRes.textContent = `${describeResources(resourceSnapshot(), BUDGET)} \u5C0F\u6708\u76F8 ${singer.parallelism} \u6761\u9053\uFF08\u8BBE\u5907\u9884\u7B97 ${BUDGET.lanes}\uFF09\u3002${lat !== null ? `\u58F0\u97F3\u7684\u8F93\u51FA\u5EF6\u8FDF\uFF08\u6D4F\u89C8\u5668\u62A5\u7684\uFF09${Math.round(lat)} ms\u3002` : \"\"}`; };\n  refreshRes(); const resTimer = window.setInterval(refreshRes, 1000);\n  const spCache = box.querySelector<HTMLElement>(\"#spCache\")!;\n  const refreshSpeech = () => { void singer.cache(\"info\", BUDGET.speechDisk).then((d) => { spCache.textContent = d ? `${sizeText(d.bytes)} / \u9884\u7B97 ${sizeText(d.budget)}\uFF0C${d.entries} \u6761` : \"\u8FD9\u4E2A\u6D4F\u89C8\u5668\u6CA1\u6709 IndexedDB\uFF1A\u53EA\u7528\u5185\u5B58\"; }).catch((e) => { spCache.textContent = `\u8BFB\u4E0D\u5230\uFF1A${(e as Error).message}`; }); };\n  refreshSpeech();\n  const sndIn = box.querySelector<HTMLInputElement>(\"#sndIn\")!, sndCache = box.querySelector<HTMLElement>(\"#sndCache\")!;\n  const refreshSounds = async () => {\n    const cached = await listCachedSounds(), bySha = new Map(cached.map((c) => [c.sha256, c])), known = new Set(Object.values(SOUNDS).map((e) => e.sha256)), uses = new Map(soundUses(D.extras).map((u) => [u.subsetSha256, u]));\n    const total = cached.reduce((n, c) => n + c.bytes, 0), mem = soundMemoryBytes();\n    let quota = \"\"; const est = await siteStorageEstimate(); if (est) quota = `\uFF1B\u8FD9\u4E2A\u7AD9\u70B9\u5171\u7528\u4E86 ${sizeText(est.usage)} / \u914D\u989D ${sizeText(est.quota)}`;\n    sndCache.innerHTML = `<div class=\"set-row\"><span>\u8BBE\u5907\u4E0A\u7559\u7740 ${sizeText(total)}${quota}\uFF1B\u5185\u5B58\u91CC\u73B0\u5728 ${sizeText(mem)}</span>${mem ? `<button class=\"btn\" data-v=\"snd:mem\" title=\"\u653E\u6389\u5185\u5B58\u91CC\u7684\u6574\u5305\uFF08\u8BBE\u5907\u4E0A\u7559\u7740\u7684\u4E0D\u52A8\uFF0C\u4E0B\u6B21\u7528\u518D\u4ECE\u8BBE\u5907\u8BFB\uFF09\">\u653E\u6389\u5185\u5B58</button>` : \"\"}</div>` +\n      Object.values(SOUNDS).map((e) => { const c = bySha.get(e.sha256); return `<div class=\"set-row\"><span>${esc(e.name)} \u00B7 ${sizeText(e.bytes)} \u00B7 ${c ? \"\u5DF2\u7559\u5728\u8BBE\u5907\u4E0A\" : \"\u6CA1\u4E0B\u8F7D\"}</span>${c ? `<button class=\"btn\" data-v=\"snd:del:${esc(e.id)}\">\u5220\u6389</button>` : `<button class=\"btn\" data-v=\"snd:get:${esc(e.id)}\">\u4E0B\u8F7D\u7559\u7740</button>`}</div>`; }).join(\"\") +\n      // \u5B50\u96C6\uFF08\u81EA\u5DF1\u7684 .sf2 \u52A0\u8FDB\u6765\u65F6 / \u89E3\u5305\u65F6\u7559\u7684\uFF0C\u6309\u5B50\u96C6 sha256 \u5B58\uFF09\uFF1A\u8FD9\u9996\u6B4C\u5F31\u5F15\u7528\u7740\u7684\u5199\u51FA\u540D\u5B57\u2014\u2014\u5220\u4E86\u5B83\uFF0C\u6CA1\u6709\u539F\u6587\u4EF6\u5C31\u627E\u4E0D\u56DE\u6765\n      cached.filter((c) => !known.has(c.sha256)).map((c) => { const u = uses.get(c.sha256); return `<div class=\"set-row\"><span>${u ? `\u300C${esc(u.names.join(\"\u3001\"))}\u300D\u7684\u58F0\u97F3\uFF08\u8FD9\u9996\u6B4C${u.packed ? \"\u4E5F\u6253\u5305\u7740\" : \"\u5F15\u7528\u7740\uFF1B\u5220\u4E86\u8981\u4ECE\u300C\" + esc(u.origin.name) + \"\u300D\u627E\"}\uFF09` : `\u522B\u7684\u6B4C / \u522B\u7684\u7248\u672C / \u522B\u7684 app \u7559\u7684\uFF08${c.sha256.slice(0, 8)}\u2026\uFF09`} \u00B7 ${sizeText(c.bytes)}</span><button class=\"btn\" data-v=\"snd:delsha:${c.sha256}\">\u5220\u6389</button></div>`; }).join(\"\") || \"\uFF08\u6CA1\u6709\uFF09\";\n  };\n  void refreshSounds();\n  midiRowSync = (s) => { const el = box.querySelector<HTMLElement>(\"#midiSt\"); if (el) el.innerHTML = midiStatusHtml(s); if (s.k !== \"off\" && s.k !== \"denied\") box.querySelector('[data-v=\"midi:connect\"]')?.remove(); };\n  const close = () => { clearInterval(resTimer); midiRowSync = null; models.source = srcIn.value; sources.source = sndIn.value; box.remove(); ui.closed(close); scoreEl.focus(); };\n  ui.open({ k: \"sheet\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"close\") close();\n    else if (v === \"default\") { srcIn.value = MODEL_SOURCE_DEFAULT; sndIn.value = SOUNDS_SOURCE_DEFAULT; }\n    else if (v === \"midi:connect\") void midi.connect();\n    else if (v === \"diag:copy\") void copyDiag(box.querySelector(\"#diagTxt\"), info);\n    else if (v === \"diag:download\") downloadDiag(info);\n    else if (v === \"diag:share\") void shareDiag(info);\n    else if (v === \"diag:clear\") clearDiag(box.querySelector(\"#diagTxt\"), info);\n    else if (v?.startsWith(\"snd:get:\")) { const e = SOUNDS[v.slice(8)]; sources.source = sndIn.value; void sources.fetchSound(e, (done) => progress(`\u4E0B\u8F7D ${e.name} ${Math.round((done / e.bytes) * 100)}%`)).then(() => { progress(\"\"); info(`${e.name} \u7559\u5728\u8BBE\u5907\u4E0A\u4E86`); }).catch((err) => { progress(\"\"); showError((err as Error).message); }).finally(() => void refreshSounds()); }\n    else if (v?.startsWith(\"snd:del:\")) { const e = SOUNDS[v.slice(8)]; void forgetSound(e.sha256).then(refreshSounds); }\n    else if (v?.startsWith(\"snd:delsha:\")) void forgetSound(v.slice(11)).then(refreshSounds);\n    else if (v === \"snd:mem\") { releaseSoundMemory(); void refreshSounds(); }\n    else if (v === \"check\") void shell.checkForUpdate().then((r) => { if (r === \"found\") { close(); showUpdateBar(); } else info(r === \"latest\" ? \"\u5DF2\u7ECF\u662F\u6700\u65B0\u7248\" : \"\u8FD9\u91CC\u6CA1\u6709\u79BB\u7EBF\u58F3\uFF08\u672C\u673A\u5F00\u53D1 / \u6D4F\u89C8\u5668\u4E0D\u652F\u6301\uFF09\uFF0C\u4E0D\u7528\u66F4\u65B0\"); });\n    else if (v === \"reset\") void shell.forceReset();\n    else if (v === \"factory\") { close(); void runFactoryReset({\n      attached: () => hasStore(), dirtyCount: () => requireStore().files.dirty.count(), openUnsaved: () => dirty(),\n      prepare: async () => { H.release(); singer.restart(); if (hasStore()) await detachStore(); },   // \u653E\u4E0B\u8EAB\u4EFD\uFF08es \u4E0D\u518D\u5199\uFF09\u3001\u5173\u6389\u4E3E\u7740\u5FF5\u7F13\u5B58\u5E93\u7684 worker\u3001dispose store\uFF1B\u4E0D drain\u3001\u4E0D\u9020\u9003\u751F\u526F\u672C\uFF08\u8BF4\u660E sheet \u5DF2\u7ECF\u8BF4\u6E05\uFF09\n      clearShell: () => shell.clearOwnShell(), info, report: (e, level) => reportError(e, level) }); }\n    else if (v === \"sp:clear\") void singer.cache(\"clear\", BUDGET.speechDisk).then(() => { refreshSpeech(); info(\"\u5FF5\u7F13\u5B58\u6E05\u7A7A\u4E86\uFF08\u5FF5\u8FC7\u7684\u53E5\u5B50\u8981\u91CD\u5FF5\uFF09\"); });\n    else if (v === \"eng:restart\") { singer.restart(); diagNote(\"resource\", \"manual restart of singer lanes\"); refreshRes(); info(\"\u5C0F\u6708\u76F8\u5F15\u64CE\u91CD\u5F00\u4E86\uFF0C\u5185\u5B58\u8FD8\u56DE\u53BB\u4E86\uFF08\u5FF5\u8FC7\u7684\u53E5\u5B50\u5B58\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\uFF0C\u4E0D\u7528\u91CD\u5FF5\uFF09\"); }\n  });\n  box.querySelector<HTMLInputElement>(\"#impIn\")!.addEventListener(\"change\", async (e) => {\n    const files = [...((e.target as HTMLInputElement).files ?? [])]; if (!files.length) return;\n    packSt.textContent = \"\u5BFC\u5165\u4E2D\u2026\";\n    try { await packStore.importFiles(Object.keys(PACKS), files, (p) => (packSt.textContent = `\u5BFC\u5165\u4E2D\u2026 ${Math.floor((p.done / p.total) * 100)}%`)); }\n    catch (err) { showError(`\u5BFC\u5165\u6CA1\u6210\uFF1A${(err as Error).message === \"no-matching-file\" ? \"\u8FD9\u4E9B\u6587\u4EF6\u4E0D\u662F\u5C0F\u6708\u76F8\u8981\u7684\u6A21\u578B\u5305\u5206\u7247\" : (err as Error).message}`); }\n    refresh();\n  });\n}\n$(\"setBtn\").addEventListener(\"click\", () => openMainMenu());\n/** \u300C\u597D\u4E86\u300D\u9762\u677F\uFF08\u5E94\u7528\u5185\uFF0C\u4E0D\u7528\u7CFB\u7EDF\u5F39\u7A97\uFF09\uFF1A\u5206\u4EAB / \u4E0B\u8F7D / \u5173\u3002 */\nfunction offerFile(file: File, title: string, msg: string, onDone?: () => void): void {\n  const nav = navigator as Navigator & { canShare?: (d: ShareData) => boolean };\n  const canShare = typeof navigator.share === \"function\" && !!nav.canShare?.({ files: [file] });\n  const box = document.createElement(\"div\");\n  box.className = \"offer\";\n  box.innerHTML = `<div class=\"offer-card\"><div class=\"offer-title\">${title}</div><div class=\"offer-msg\">${msg}</div><div class=\"offer-btns\">` +\n    (canShare ? `<button class=\"btn primary\" data-v=\"share\">\u5206\u4EAB</button>` : \"\") +\n    `<button class=\"btn${canShare ? \"\" : \" primary\"}\" data-v=\"download\">\u4E0B\u8F7D</button><button class=\"btn\" data-v=\"close\">\u5173</button></div></div>`;\n  document.body.append(box);\n  const close = () => { box.remove(); ui.closed(close); scoreEl.focus(); };\n  ui.open({ k: \"sheet\", close });\n  box.addEventListener(\"click\", async (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"close\") { close(); return; }\n    if (v === \"download\") {\n      const a = document.createElement(\"a\"), url = URL.createObjectURL(file);\n      a.href = url; a.download = file.name; document.body.append(a); a.click(); a.remove();\n      setTimeout(() => URL.revokeObjectURL(url), 30_000);\n      info(`\u5DF2\u4E0B\u8F7D ${file.name}`); onDone?.(); close();\n    } else if (v === \"share\") {\n      try { await navigator.share({ files: [file], title: file.name }); info(\"\u5DF2\u5206\u4EAB\"); onDone?.(); close(); }\n      catch (err) { if ((err as { name?: string }).name !== \"AbortError\") showError(`\u5206\u4EAB\u5931\u8D25\uFF1A${(err as Error).message}`); }\n    }\n  });\n}\n// \u6D4B\u8BD5\u7528\u53E3\u5B50\uFF08Playwright \u9010\u6837\u672C\u6BD4\u5BF9\u6D4F\u89C8\u5668 == Node \u65F6\u7528\uFF09\n(window as unknown as Record<string, unknown>).__moonsinger = { singer, engine, exportSong, renderMix: () => renderMixForTest(),\n  transport: () => ({ startMark: perfApi.startMark, paused: perfApi.paused, listen: listenOn(), loop: perfApi.loopOn, turnLead: perfApi.turnLead }),   // \u8D70\u5E26\u7684\u72B6\u6001\uFF08E2E \u7528\uFF09\n  navPaper: (d: -1 | 1) => navPaper(d), paperSpans: () => perfApi.playTl?.papers.map((x) => ({ id: x.paper.id, t0: x.t0 })) ?? null,   // \u6362\u6BB5 / \u73B0\u5728\u653E\u7684\u65F6\u95F4\u7EBF\u91CC\u6BCF\u6BB5\u4ECE\u51E0\u79D2\u8D77\uFF08E2E \u7528\uFF09\n  workspace: () => ({ ...ws, dock: dockOf(ws) }), setMode: (m: Mode) => setMode(m),   // \u6A21\u5F0F / \u5E95\u5EA7\uFF08E2E \u7528\uFF09\n  final: () => D.extras.final, finalize: (q?: Mp3Quality) => finalizeNow(q), unfinalize: () => unfinalizeNow(false), finalMp3: () => D.extras.finalMp3,   // \u5B9A\u7A3F / \u6539\u7A3F\uFF08E2E \u7528\uFF09\n  run: (c: Command) => D.run(c), commit: (next: { st?: EditorState; extras?: Extras }, o?: Parameters<typeof D.commit>[1]) => D.commit(next, o), locked: () => D.locked(),   // \u6307\u4EE4\u5F0F\u552F\u4E00\u5165\u53E3\uFF08E2E / \u4EE5\u540E\u7684 MCP \u7528\uFF09\n  resource: () => ({ snapshot: resourceSnapshot(), text: describeResources(resourceSnapshot(), BUDGET), lanes: singer.parallelism, budgetLanes: BUDGET.lanes }),\n  perf: () => perfReport(), perfReset: () => perfReset(),   // \u70ED\u8DEF\u5F84\u79D2\u8868\uFF08scripts/probe-input-latency.mjs \u8BFB\uFF09\n  speechCache: (op: \"info\" | \"clear\") => singer.cache(op, BUDGET.speechDisk),\n  // \u5F55\u97F3\u623F\u7684\u63A5\u53E3\uFF08\u5200 4\uFF1B\u754C\u9762\u5F52 Opus / user\uFF09\uFF1A\u6539\u4E00\u6761\u8F68\uFF08\u9EA6\u514B\u98CE id / \u603B\u7EBF id\uFF09\u7684\u6548\u679C\u94FE / \u53D1\u9001 / \u53BB\u5411\u3001\u52A0\u5220\u603B\u7EBF\u3001\u603B\u8F68\u94FE\u2014\u2014\u90FD\u8D70 undo\u3001\u63A8\u8FDB\u5F55\u97F3\u623F\n  setTrack: (id: string, patch: Record<string, unknown>) => { updateExtras(withTrack(D.extras, id, patch as never), { kind: \"studio\", label: `\u8F68\u300C${id}\u300D` }); },\n  addBus: (name = \"\u603B\u7EBF\") => { const id = newBusId(D.extras); updateExtras(withTrack(D.extras, id, { kind: \"bus\", name }), { kind: \"studio\", label: `\u52A0\u603B\u7EBF\u300C${name}\u300D` }); return id; },\n  removeBus: (id: string) => updateExtras(withoutBus(D.extras, id), { kind: \"studio\", label: `\u5220\u603B\u7EBF\u300C${id}\u300D` }),\n  setMaster: (patch: Record<string, unknown>) => updateExtras(withMaster(D.extras, patch as never), { kind: \"studio\", label: \"\u603B\u8F68\" }),\n  studioTracks: () => studioTracks(D.extras), labScore: () => { const { tokens, map } = curFlat(); return toLabScore(tokens, D.st.song.hum, songLangOf(tokens, D.st.song.hum), map); }, state: () => D.st, cssHash: __CSS_HASH__, extras: () => D.extras, setEmbedSoftLimit: (n: number) => { embedSoftLimit = n; }, layout: () => ({ ...view.layoutNow(), head: view.head() }) /* head = \u5149\u6807\u753B\u5728\u54EA\uFF08ink \u5C42\uFF0CW-17 \u7B2C 1 \u5200\uFF1BE2E \u770B\u5B83\uFF09 */, zoomInfo: () => view.zoomInfo(), dockSide: () => stageEl.dataset.side ?? null, bytes: () => bytesNow(), open: (name: string, bytes: Uint8Array) => openBytes(name, bytes), view, zipList: (bytes: Uint8Array) => Object.keys(unzipSync(bytes)), zipText: (bytes: Uint8Array, path: string) => new TextDecoder().decode(unzipSync(bytes)[path]), load: (o: ReturnType<typeof openBytes>) => loadDoc(o.song, { home: { kind: \"none\", pendingFolder: null }, stem: o.stem, named: true, extras: o.extras, view: o.view, references: o.references }), refHost, makePdf: async (id: PdfFontId, pick?: PdfPick) => { const { r, file } = await makePdf(id, pick); progress(\"\"); return { bytes: r.bytes, pages: r.pages, stats: r.stats, name: file.name }; },\n  setChunk: (v: \"phrase\" | \"sheet\" | \"whole\") => { const role = D.st.song.parts.find((x) => x.id === D.st.at.part)?.role; if (role) updateExtras(withSingChunk(D.extras, role, v, D.st.song.hum), { kind: \"lounge\", label: `\u5206\u6BB5\u5531\uFF1A${v}` }); },\n  set: (n: EditorState) => update(n), addPaper: () => update(addPaper(D.st)), toggleChord: (i: number, p: Pitch) => update(toggleChordPitch(D.st, i, p)), playSong: () => playSong(), afterSignIn: () => afterSignIn(), diagText: () => diagText(), refreshOpenDoc: () => refreshOpenDoc(), wake: (awayMs: number) => wakeCheck(awayMs), pushDirtyAll: () => pushDirtyAll(), gateOpen: () => isGateOpen(), undo: () => undoNow(), redo: () => redoNow(), history: () => ({ past: D.history.past.length, future: D.history.future.length }), undoText: () => lastUndoText, desk: () => deskNow(), setScope: (v: \"all\" | \"segment\") => { viewScope = v; view.render(); }, setPages: (v: boolean) => { pageFlow = v; view.render(); }, setScroll: (v: boolean) => { scrollFlow = v; view.render(); view.followNow(); }, partView: (id: string, patch: Partial<PartViewState>) => { setPv(id, patch); afterViewChange(); view.render(); }, flatten: () => flattenPart(D.st.song, D.st.at.part), setPaperHidden: (id: string, h: boolean) => update(setPaperHidden(D.st, id, h)), store: () => (hasStore() ? requireStore() : null), es: () => es, gallery: () => gallery, attach: () => ensureAttached(), openGallery: () => openGallery(), newStoreSong: () => newStoreSong(), openStoreDoc: (id: string) => openStoreDoc(id), identifier: () => H.identifier(), home: () => H.home.kind, dirty: () => dirty(), auth };   // cssHash\uFF1A\u6837\u5F0F\u8868\u7248\u672C\uFF08\u89C1 scripts/build.sh\uFF09\n\n// \u2500\u2500 \u9876\u680F \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/** pad \u50CF\u8F6F\u952E\u76D8\u3001\u4E94\u7EBF\u8C31\u50CF\u6587\u672C\u6846\uFF08user\u300C\u952E\u76D8\u8F93\u5165\u6B4C\u8BCD\u7684\u65F6\u5019\u97F3\u4E50\u952E\u76D8\u5E94\u8BE5hide\u300D\u300C\u53EF\u4EE5\u60F3\u8C61\u4E94\u7EBF\u8C31\u662F\u6587\u672C\u6846\uFF0C\u4F60touch\u70B9\u4E86\u4F1A\u5F39\u952E\u76D8\u3002\u7136\u540E\u70B9\u522B\u7684\u5730\u65B9\u4F1A\u9690\u85CF\u300D\uFF09\uFF1A\n *  \u70B9\u8C31 = \u5F39\u51FA\uFF1B\u6253\u5F00\u6B4C\u8BCD / \u6B4C\u540D\u6846\uFF08\u7CFB\u7EDF\u952E\u76D8\u8981\u4E0A\u6765\uFF09= \u6536\u8D77\uFF1B\u70B9\u9876\u680F\u7A7A\u767D\u5904 = \u6536\u8D77\u3002\u5F00\u5C40\u662F\u5F39\u51FA\u7684\uFF08\u5149\u6807\u5C31\u5728\u8C31\u4E0A\uFF09\u3002\n *  \u6A2A\u5C4F / \u684C\u9762\u4E5F\u4E00\u6837\uFF08\u7EB8\u5BBD\u56FA\u5B9A\u4E86\uFF0C\u6536\u8D77\u65C1\u8FB9\u7684 pad \u4E0D\u4F1A\u8BA9\u8C31\u91CD\u6392\uFF09\u3002\u9876\u680F\u7684 pad \u94AE\u7167\u65E7\u624B\u52A8\u5F00\u5173\uFF1B\u5F00\u300C\u5F39\u300D= \u5F39\u51FA\u3002 */\n/** \u952E\u76D8\u6536\u8D77 / \u5F39\u51FA\uFF08pad \u7684\u300C\u6536\u8D77\u300D\u3001\u5E95\u4E0B\u7684\u300C\u952E\u76D8\u300Dtab\u3001\u70B9\u8C31\u5F39\u51FA\u3001\u70B9\u9876\u680F\u7A7A\u767D\u6536\u8D77\uFF09\u3002\u5E95\u5EA7\u91CC\u653E\u4EC0\u4E48\u6700\u7EC8\u7531\u6A21\u5F0F\u5B9A\uFF08applyWorkspace\uFF09\uFF1A\u300C\u8BCD / \u542C\u300D\u672C\u6765\u5C31\u6CA1\u6709\u952E\u76D8\u3002 */\nfunction showPad(on: boolean): void {\n  ws.collapsed = !on;\n  applyWorkspace();\n}\nbar.addEventListener(\"pointerdown\", (e) => { if (!(e.target as HTMLElement).closest(\"button, select, label, input, a\")) showPad(false); });\n\n// \u2500\u2500 \u6587\u4EF6\uFF08\u65E0\u5730\u9003\u751F\u53E3\uFF09\uFF1A\u4E00\u9996\u6B4C = \u4E00\u4E2A .mxl\uFF1B\u5BB6 = \u6253\u5F00\u7684\u90A3\u4E2A\u6587\u4EF6\uFF08\u684C\u9762 Chromium \u80FD\u5B58\u56DE\u53BB\uFF09\u6216\u6CA1\u6709\u5BB6\uFF08iPad\uFF1A\u5B58 = \u4E0B\u8F7D / \u5206\u4EAB\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\n/** \u53F0\u4E0A\u90A3\u4F4D\u7684\u5F15\u64CE\uFF08= \u8C01\u6765\u6F14\u3001\u600E\u4E48\u51FA\u58F0\uFF09\uFF1Bunknown = \u6CA1\u4EBA\u80FD\u51FA\u58F0\uFF08\u522B\u5BB6\u8C31\u539F\u6765\u7684\u4E50\u5668 / \u8FD9\u4E00\u7248\u4E0D\u8BA4\u8BC6\uFF09\u3002SSoT = \u4F11\u606F\u5BA4\u5FEB\u7167\uFF08D.extras\uFF09\uFF0C\u4E0D\u53E6\u5B58\u72B6\u6001\u3002 */\nfunction engineNow(): Engine { return activeInstrument(D.extras, curRole())?.engine ?? \"unknown\"; }\nconst dirty = () => D.dirty();   // \u6539\u8FC7\u6CA1\u5B58\uFF08\u8C31 / \u4F11\u606F\u5BA4 / \u5F55\u97F3\u623F / \u5C01\u9762 / \u5B9A\u7A3F / \u53C2\u8003\u7A97\u7684\u5361\uFF09\n/** \u9876\u680F\u7684\u540D\u5B57\uFF08\u300C\u2022\u300D= \u6539\u8FC7\u8FD8\u6CA1\u843D\u76D8\uFF1A\u65E0\u5730 = \u6CA1\u5B58\uFF1B\u6B4C\u5E93 = 2 s \u5185\u4F1A\u81EA\u52A8\u5B58\uFF09+ \u53F3\u8FB9 smart save \u94AE\u7684\u72B6\u6001\uFF08\u6C38\u8FDC\u53EF\u89C1\uFF0Cuser 2026-10-08\u300C\u6570\u636E\u5B89\u5168\u7EA2\u7EBF\u300D\uFF09\u3002 */\nfunction renderTitle(): void {\n  const d = dirty(), name = docName(), fin = D.extras.final;\n  $(\"docTitle\").textContent = `${name}${d ? \" \u2022\" : \"\"}`;\n  { const b = $(\"fileBtn\"); b.classList.toggle(\"is-final\", !!fin); b.querySelector(\".final-badge\")?.remove(); if (fin) { const t = document.createElement(\"span\"); t.className = \"final-badge\"; t.textContent = `\u5B9A\u7A3F ${fin.rev}`; t.title = `\u5B9A\u7A3F\u4E86\uFF08\u7B2C ${fin.rev} \u7248\uFF0C${fin.at.slice(0, 10)}\uFF09\uFF1A\u53EA\u80FD\u542C\uFF0C\u6539\u4E0D\u4E86\uFF1B\u4E09\u6761\u6760\u91CC\u300C\u6539\u7A3F\u300D\u89E3\u9501`; b.append(t); } }\n  $(\"fileBtn\").title = `\u6587\u4EF6\u540D\uFF08${fileWhere()}\uFF09\u00B7 ${H.home.kind === \"file\" ? \"\u672C\u673A\u6587\u4EF6\u7684\u540D\u5B57\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u91CC\u6539\" : \"\u70B9\u4E86\u6539\u540D\"}`;\n  // \u7F51\u9875\u6807\u9898\u4E0D\u8DDF\u6B4C\u540D\uFF08W-22\uFF0Cuser 2026-10-11\u300C\u6807\u9898\u4E0D\u8981\u663E\u793A\u6B4C\u540D\uFF0C\u4E0D\u7136\u8FD9\u6837\u6D4F\u89C8\u5668\u8001\u662F\u4F1A\u8BB0\u9519\u300D\uFF09\uFF1A\u6C38\u8FDC\u662F index.html \u90A3\u4E00\u53E5\uFF08\u4E5F\u662F SEO \u7684\u95E8\u9762\uFF09\uFF1B\u300C\u2022\u300D\u53EA\u5728\u9876\u680F\n  renderSaveButton();\n  renderUndo();\n}\n/** smart save \u94AE\u7684\u72B6\u6001\uFF08\u6284 WXHW / WeebPaint\u300C\u72B6\u6001\u5373\u6309\u94AE\u300D\uFF09\uFF1A\u6B4C\u5E93 = saving\uFF082 s \u5185\u81EA\u52A8\u5B58\uFF09/ local\uFF08\u5B58\u5728\u8BBE\u5907\u4E0A\uFF0C\u6CA1\u767B\u5F55\uFF09/ offline / unsynced\uFF08\u6CA1\u4E0A\u4E91\uFF09/ clean\uFF08\u4E91\u7AEF\u4E5F\u6700\u65B0\uFF09\uFF1B\n *  \u672C\u5730\u6587\u4EF6 = fileDirty / fileClean\uFF1B\u6CA1\u5BB6 = unsaved / fresh\uFF08\u65B0\u8C31\u6CA1\u6539\u8FC7\uFF09\u3002 */\ntype SyncKind = \"saving\" | \"unsynced\" | \"local\" | \"offline\" | \"clean\" | \"fileDirty\" | \"fileClean\" | \"unsaved\" | \"fresh\";\nfunction syncKind(): SyncKind {\n  const h = H.home;\n  switch (h.kind) {\n    case \"gallery\":\n      if (dirty()) return \"saving\";\n      if (!isSignedIn()) return \"local\";\n      if (!navigator.onLine) return \"offline\";\n      return es.isPushPending() ? \"unsynced\" : \"clean\";\n    case \"file\": return dirty() ? \"fileDirty\" : \"fileClean\";\n    case \"none\": return dirty() ? \"unsaved\" : \"fresh\";\n    default: return assertNever(h);\n  }\n}\nconst SAVE_SPEC: Record<SyncKind, { icon: string; cls: string; title: string }> = {\n  saving: { icon: \"database\", cls: \"s-saving\", title: \"\u6539\u4E86\uFF0C\u9A6C\u4E0A\u81EA\u52A8\u5B58\u5230\u8FD9\u53F0\u8BBE\u5907\uFF08\u70B9 = \u73B0\u5728\u5B58 + \u63A8\uFF09\" },\n  local: { icon: \"database\", cls: \"s-local\", title: \"\u5B58\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\uFF08\u6CA1\u767B\u5F55 OneDrive\uFF0C\u4E0D\u4E0A\u4E91\uFF1B\u70B9 = \u5B58 + \u53BB\u767B\u5F55\uFF09\" },\n  offline: { icon: \"cloud-unavailable\", cls: \"s-offline\", title: \"\u79BB\u7EBF\uFF1A\u5B58\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\uFF0C\u56DE\u7EBF\u518D\u63A8\u4E0A\u4E91\" },\n  unsynced: { icon: \"cloud-upload\", cls: \"s-unsynced\", title: \"\u5B58\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\u4E86\uFF0C\u8FD8\u6CA1\u63A8\u4E0A\u4E91\uFF08\u70B9 = \u73B0\u5728\u63A8\uFF09\" },\n  clean: { icon: \"cloud-synced\", cls: \"s-clean\", title: \"\u4E91\u7AEF\u4E5F\u662F\u6700\u65B0\u7684\uFF08\u70B9 = \u590D\u67E5\u4E91\u7AEF\uFF09\" },\n  fileDirty: { icon: \"floppy-disk\", cls: \"s-unsynced\", title: \"\u6539\u8FC7\u8FD8\u6CA1\u5B58\u56DE\u6587\u4EF6\uFF08\u70B9 = \u5B58\uFF09\" },\n  fileClean: { icon: \"floppy-disk\", cls: \"s-fileClean\", title: \"\u5B58\u5728\u672C\u5730\u6587\u4EF6\u91CC\u4E86\" },\n  unsaved: { icon: \"floppy-disk\", cls: \"s-unsynced\", title: \"\u8FD8\u6CA1\u5B58\uFF08\u70B9 = \u5B58\uFF09\" },\n  fresh: { icon: \"floppy-disk\", cls: \"s-fresh\", title: \"\u65B0\u7684\u4E00\u9996\uFF0C\u8FD8\u6CA1\u5B58\" },\n};\nfunction renderSaveButton(): void {\n  const k = syncKind(), spec = SAVE_SPEC[k], b = $(\"saveBtn\");\n  b.innerHTML = `<svg class=\"ico\"><use href=\"#${spec.icon}\"/></svg>`;\n  b.className = `btn save-btn ${spec.cls}`; b.title = spec.title; b.dataset.kind = k;\n}\nconst fmtDb = (dB: number) => `${dB > 0 ? \"+\" : dB < 0 ? \"\u2212\" : \"\"}${Math.abs(dB)} dB`;\n/** \u4E3B\u5531\u6CA1\u4EBA\u4E0A\u573A\uFF08\u522B\u7684\u8F6F\u4EF6\u5B58\u7684\u8C31\uFF0C\u539F\u6765\u7684\u4E50\u5668\u8FD9\u4E00\u7248\u6CA1\u6709\uFF09\uFF1A\u4E0D\u51FA\u58F0\u3001\u62A5\u9519\uFF0C\u4EBA\u6765\u9009\uFF08user\u300C\u4E0D\u51FA\u58F0\uFF0C\u62A5\u9519\uFF0C\u4EBA\u7C7B\u624B\u52A8\u6362\u300D\uFF09\u3002 */\nfunction noCast(what: string): void {\n  showError(`\u300C${roleName(D.extras, curRole())}\u300D\u8FD9\u4E2A\u89D2\u8272\u8FD8\u6CA1\u6709\u4EBA\u4E0A\u573A\uFF08\u539F\u6765\u7684\u4E50\u5668\u8FD9\u4E00\u7248\u6CA1\u6709\uFF09\uFF0C\u6240\u4EE5\u6CA1\u6709${what}\u3002\u8981\u5C0F\u6708\u76F8\u6765\u5531\uFF0C\u70B9\u8C31\u524D\u9762\u7684\u300C${roleName(D.extras, curRole())}\u300D\uFF0C\u5728\u300C\u8C01\u6765\u6F14\u300D\u9009\u5C0F\u6708\u76F8\u3002`);\n}\n// \u2500\u2500 \u627E\u4EBA\u89C6\u56FE\uFF08src/ui/finder.ts\uFF09\uFF1A\u5168\u5C4F\u66FF\u6389\u8C31\u533A\uFF0Cpad \u5F53\u8BD5\u542C\u952E\u76D8\uFF1B\u8BD5\u542C\u53F0 = \u4E34\u65F6\u7684\u4E00\u4E2A\u69FD\uFF08\u4E0D\u8FDB\u4F11\u606F\u5BA4\uFF09\uFF0C\u300C\u4E0A\u573A\u300D\u624D\u9020\u6F14\u594F\u8005 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nlet audition: { bank: number; program: number; note?: number; sfx?: SfxInfo; sha256: string; subset: Uint8Array; label: string } | null = null;\n/** pad \u952E\u5E95\u90E8\u7684\u63D0\u793A\u97F3\u57DF = \u73B0\u5728\u8C01\u5728\u5F39\uFF1A\u627E\u4EBA\u89C6\u56FE\u91CC = \u8BD5\u542C\u7684\u90A3\u4F4D\uFF1B\u5199\u8C31\u65F6 = \u5149\u6807\u6240\u5728\u58F0\u90E8\u4E0A\u573A\u7684\u90A3\u4F4D\uFF08\u6708\u8BFB / \u5143\u97F3\u7248 = \u5979\u7684\uFF1B\u4E50\u5668 = \u76EE\u5F55\u91CC\u89D2\u8272\u90A3\u4EF6\u4E50\u5668\u7684\u97F3\u57DF\uFF1B\u4E0D\u77E5\u9053 = \u4E0D\u753B\uFF09\u3002 */\nfunction padHint(): HintRange {\n  if (finderShown()) return auditionHint;\n  const plug = performerOf(activeInstrument(D.extras, curRole())?.engine);\n  if (!plug) return null;\n  if (plug.hintRange) return plug.hintRange;   // \u4EBA\u58F0\uFF1A\u56FA\u5B9A\u97F3\u57DF\uFF08\u63D2\u4EF6\u81EA\u62A5\uFF09\uFF1B\u4E50\u5668 = \u4E0B\u9762\u6309\u76EE\u5F55\u67E5\uFF08\u97F3\u6548 / \u91C7\u6837\u952E\u53EA\u5BF9 GS \u6210\u7ACB\uFF0C\u5404\u81EA\u6709\u5B88\u536B\uFF1B\u6982\u5FF5\u97F3\u57DF\u548C\u5F15\u64CE\u65E0\u5173\uFF09\n  if (!catalogNow) { void loadCatalog(new URL(import.meta.url)).then((c) => { catalogNow = c; pad.render(); }).catch(() => { /* \u76EE\u5F55\u8F7D\u4E0D\u4E86\uFF1A\u4E0D\u753B\u63D0\u793A */ }); return null; }\n  // GS \u7684\u97F3\u6548\u9884\u8BBE\uFF08\u4ED3\u9F20 v8\uFF0CTinySoundFont \u5B9E\u6D4B\uFF1B\u53EA\u5BF9 GS \u6210\u7ACB\uFF0C\u522B\u7684 .sf2 \u4E0D\u5957\uFF09\uFF1A\u56FA\u5B9A\u539F\u901F = \u54EA\u4E2A\u952E\u90FD\u4E00\u6837\u3001\u4E0D\u63D0\u793A\uFF08\u540C\u9F13\u4EF6\uFF09\uFF1B\n  //   \u5173\u4E86\u56FA\u5B9A = \u63D0\u793A\u539F\u901F\u952E\uFF1B\u518D\u5F00\u97F3\u9AD8\u5BF9\u9F50 = \u63D0\u793A\u300C\u539F\u901F\u65F6\u542C\u5230\u7684\u90A3\u4E2A\u97F3\u300D\uFF08\u8C31\u4E0A\u5199\u5B83 = \u539F\u6765\u7684\u6837\u5B50\uFF09\n  const g = activeGm(D.extras, curRole());\n  if (g?.sfx) {\n    if (g.note !== undefined) return null;\n    const s = g.sfx, al = s.align && canAlign(s), k = al ? Math.round(s.midi!) : s.key;\n    return { lo: k, hi: k, who: g.name, title: al ? \"\u5199\u8FD9\u4E2A\u97F3 = \u539F\u901F\uFF08\u97F3\u9AD8\u5BF9\u9F50\uFF1A\u5199\u7684\u97F3 \u2248 \u542C\u5230\u7684\u97F3\uFF09\" : \"\u539F\u901F\u952E\uFF1A\u6309\u8FD9\u4E2A\u952E\uFF0C\u91C7\u6837\u4E0D\u62C9\u4F38\u4E0D\u538B\u7F29\" };\n  }\n  if (g && g.note === undefined && g.origin.library === GS_LIBRARY_ID) { const sk = sampleKeyOf(catalogNow, g.bank, g.program); if (sk) return { lo: sk.key, hi: sk.key, who: g.name, title: sk.title }; }   // \u65E7\u6B4C\uFF08\u4E0A\u573A\u65F6\u8FD8\u6CA1\u6284 sfx\uFF09\n  const concept = D.extras.lounge[curRole()]?.concept as { ids?: { wikidata?: string | null; local?: string | null }; name?: { zh?: string } } | undefined;\n  const id = concept?.ids?.wikidata ?? concept?.ids?.local; if (!id) return null;\n  const r = rangeOf(catalogNow.byId.get(id));\n  return r ? { ...r, who: concept?.name?.zh ?? roleName(D.extras, curRole()) } : null;\n}   // \u8BD5\u542C\u53F0\u4E0A\u7684\uFF08GS \u9884\u8BBE\uFF1Bnote = \u9F13\u4EF6\uFF0Cpad \u4EFB\u4F55\u952E\u90FD\u6572\u5B83\uFF09\uFF1Bnull = \u6708\u8BFB / \u6CA1\u9009\nconst GS = SOUNDS[\"generaluser-gs-2.0.3\"];\n/** \u8BD5\u542C\u53F0\uFF1A\u4ECE GS \u5207\u51FA\u8FD9\u4E2A\u9884\u8BBE\u3001\u8F7D\u8FDB\u5B9E\u65F6\u5408\u6210\u5668\uFF0822 ms + \u51E0 MB\uFF09\uFF1B\u6362\u5230\u6708\u8BFB = \u6E05\u6389\u3002 */\nasync function setAudition(p: FinderPick | null): Promise<void> {\n  // \u952E\u76D8\u7684\u97F3\u57DF\u8DDF\u7740\u8BD5\u542C\u7684\u90A3\u4F4D\u8D70\uFF08user 2026-10-08\u300C\u8BD5\u5F39\u7684\u65F6\u5019\u952E\u76D8\u4E0A\u7684\u97F3\u57DF\u6CA1\u6709\u8DDF\u8FDB\u300D\uFF09\uFF1A\u6708\u8BFB = \u5979\u7684\uFF1B\u4E50\u5668 = \u76EE\u5F55\u91CC\u5B83\u7684\u97F3\u57DF\uFF08\u6CA1\u6709 = \u4E0D\u753B\u63D0\u793A\uFF0C\u7A97\u53E3\u4E0D\u52A8\uFF09\n  //   GS \u7684\u97F3\u6548\u9884\u8BBE\u8BD5\u542C = \u56FA\u5B9A\u539F\u901F\uFF08\u4ED3\u9F20 v8\uFF1B\u54EA\u4E2A\u952E\u90FD\u4E00\u6837\uFF0C\u540C\u9F13\u4EF6\uFF0C\u4E0D\u63D0\u793A\uFF09\uFF1B\u5176\u4F59 = \u6982\u5FF5\u7684\u5E38\u7528\u97F3\u57DF\n  const cat = p?.kind === \"gs\" ? (catalogNow ??= await loadCatalog(new URL(import.meta.url))) : null;\n  const sk = cat && p?.kind === \"gs\" && p.provider.note === undefined ? sampleKeyOf(cat, p.provider.bank, p.provider.program) : null;\n  auditionHint = !p || sk ? null : p.kind === \"voice\" ? TSUKUYOMI_RANGE : ((r) => (r ? { ...r, who: p.concept.names.zh } : null))(rangeOf(p.concept));\n  if (auditionHint) pad.follow(auditionHint.lo, auditionHint.hi); else pad.render();\n  if (!p || p.kind === \"voice\") { audition = null; sound.allOff(); return; }\n  try {\n    const bank = await sources.fetchSound(GS, (done) => progress(`\u4E0B\u8F7D ${GS.name} ${Math.round((done / GS.bytes) * 100)}%`)); progress(\"\");\n    const subset = subsetSf2(bank, [{ bank: p.provider.bank, program: p.provider.program }]), sha256 = await sha256Hex(subset);\n    audition = { bank: p.provider.bank, program: p.provider.program, ...(cat ? gsKeyArgs(cat, p.provider.bank, p.provider.program, p.provider.note) : {}), sha256, subset, label: p.provider.gmName };   // \u97F3\u6548\u9ED8\u8BA4\u56FA\u5B9A\u539F\u901F\uFF08\u4E0A\u573A\u540E\u4E5F\u662F\uFF09\n    sound.allOff(); await engine.bank(sha256, subset);\n  } catch (e) { progress(\"\"); audition = null; showError(`\u8BD5\u542C\u4E0D\u4E86\uFF1A${(e as Error).message}`); }\n}\n/** GS \u9884\u8BBE\u4E0A\u573A / \u8BD5\u542C\u65F6\u5E26\u7684\u952E\u8BBE\u7F6E\uFF1A\u9F13\u4EF6 = \u56FA\u5B9A\u90A3\u4E2A\u952E\uFF1B\u97F3\u6548\uFF08GM 116\u2013128\uFF0C\u4ED3\u9F20 v8 \u7684 sampleKey\uFF09= **\u9ED8\u8BA4\u56FA\u5B9A\u539F\u901F**\uFF08note = \u539F\u901F\u952E\uFF09+ \u6309\u503C\u6284\u539F\u901F\u952E\u548C\u97F3\u9AD8\u951A\u70B9\uFF08sfx\uFF09\uFF1B\n *  \u5176\u4F59\u4E0D\u5E26\uFF08user 2026-10-08\u300C\u56FA\u5B9A\u539F\u901F\u540C\u610F\uFF0C\u9ED8\u8BA4\u5F00\u3002\u78B0\u5230\u732B\u53EB\u6B4C\u624D\u5173\uFF0C\u4F46\u8FD9\u4E2A\u65F6\u5019\u4E5F\u8BB8\u9700\u8981\u97F3\u9AD8\u4FEE\u6B63\u300D\uFF09\u3002 */\nfunction gsKeyArgs(cat: Catalog, bank: number, program: number, drumNote?: number): { note?: number; sfx?: { key: number; midi?: number; centsPerKey?: number }; gapSec?: number; canSwell?: boolean } {\n  // \u8FDE\u65AD\u7684\u5E95\u8272\u4E5F\u662F\u76EE\u5F55\uFF08\u4ED3\u9F20 v11 \u7684 joint\uFF0C\u6309 GM \u53F7\u9010\u4E2A\uFF09\u6309\u503C\u7ED9\u7684\uFF1B\u6CA1\u6709 = \u4E0D\u5199 = 0\uFF08user\u300C\u4F60\u4E0D\u80FD\u6309\u4E50\u5668\u4E00\u5200\u5207\u300D\u300C\u8BA9\u97F3\u4E50\u4ED3\u9F20\u51C6\u5907\u4E00\u4E0B\u5206\u7C7B\u7528\u7684\u5143\u6570\u636E\u300D\uFF09\n  const gap = jointOf(cat, bank, program, drumNote)?.gapSec, sus = sustainOf(cat, bank, program, drumNote);\n  const g = { ...(gap ? { gapSec: gap } : {}), ...(sus && sus !== \"sustained\" ? { canSwell: false } : {}) };   // \u4ED3\u9F20 v11 \u5B9E\u6D4B\uFF1A\u4E0D\u662F\u4E00\u76F4\u80FD\u6301\u7EED\u7684 = \u97F3\u5185\u53D8\u5F3A\u505A\u4E0D\u5230\n  if (drumNote !== undefined) return { note: drumNote, ...g };\n  const sk = sampleKeyOf(cat, bank, program); if (!sk) return g;\n  return { note: sk.key, sfx: { key: sk.key, ...(sk.midi !== undefined ? { midi: sk.midi } : {}), ...(sk.centsPerKey ? { centsPerKey: sk.centsPerKey } : {}) }, ...g };\n}\n/** \u300C\u8BB0\u53F7\u600E\u4E48\u6F14\u300D\uFF1A\u8FD9\u4F4D\u6F14\u594F\u8005 by value \u5E26\u7740\u7684\u89E3\u8BFB\u8868\uFF0C\u539F\u6837\u644A\u5F00\uFF08user 2026-10-08\u300C\u8BB0\u53F7\u600E\u4E48\u89E3\u8BFB\u5E94\u8BE5\u4E50\u5668\u91CC\u9762\u6709explicit\u7684\u914D\u7F6E\uFF0C\u800C\u4E0D\u662F\u4EE3\u7801\u5199\u6B7B\u300D\uFF09\u3002\u73B0\u5728\u53EA\u8BFB\uFF1B\u6539\u6570\u4EE5\u540E\u505A\u3002 */\nfunction marksTableHtml(role: string, eng: string): string {\n  const sp = activePerfSpec(D.extras, role), ms = (x: number) => `${Math.round(x * 1000)} ms`, pct = (x: number) => `${Math.round(x * 100)}%`, db = (x: number) => `${x > 0 ? \"+\" : \"\"}${x} dB`;\n  const ign = ignoredArts(performerOf(eng), sp.gapSec), sung = performerOf(eng)?.sound === \"chunks\", gray = (m: string) => (ign.includes(m as Mark) ? ` class=\"ign\"` : \"\");\n  const singTxt = (k: string) => { const m = sp.sing[k]; return m ? `${m.at === \"next\" ? \"\u4E0B\u4E00\u4E2A\u5B57\" : \"\u8FD9\u4E2A\u5B57\"}\u524D\u300C${m.mark}\u300D${m.mark === \"^\" ? \"\uFF08\u987F\u4E00\u4E0B\uFF0C\u4E0D\u6362\u6C14\uFF09\" : m.mark === \"v\" ? \"\uFF08\u6362\u6C14\uFF09\" : \"\uFF08\u5927\u53E3\u6362\u6C14\uFF09\"}` : \"\u4E0D\u53D8\u6210\u5531\u6CD5\u8BB0\u53F7\"; };\n  const vel = !!sp.dynamicsVel;\n  // \u8FD9\u4E00\u7C7B\u600E\u4E48\u53D8\u54CD / \u53D8\u8F7B\uFF082026-10-08 \u6DF1\u591C Opus 5.5\uFF1Buser\u300C\u6708\u8BFB\u5403\u97F3\u5185\u51CF\u5F31\u5417\uFF0C\u666E\u901A\u51CF\u5F31\u53EF\u4EE5\u6709\u4E00\u6837\u7684\u6548\u679C\u5417\u8FD8\u662F\u53EA\u5F71\u54CD\u8F93\u5165\u7684\u2026\u6708\u8BFB\u53C8\u662F\u5F26\u53C8\u662F\u7BA1\u6240\u4EE5\u5E94\u8BE5\u662F\u5B9E\u65F6\u8C03\u5236\u7684\u300D\n  //   \u300C\u6211\u89C9\u5F97\u5176\u5B9E\u53EF\u4EE5\u4E0D\u540C\u7684\u7C7B\u522B\u4E50\u5668\u5361\u53EF\u4EE5\u8BF4\u4E00\u4E0B\u300D\uFF09\uFF1A\u6309\u8FD9\u4F4D\u5B9E\u9645\u8D70\u7684\u90A3\u6761\u8DEF\u8BF4\uFF08perform.ts\uFF1A\u6709\u529B\u5EA6\u8868 = MIDI \u529B\u5EA6\uFF0C\u5426\u5219 = \u97F3\u91CF\u66F2\u7EBF\u4E58\u5728\u51FA\u6765\u7684\u58F0\u97F3\u4E0A\uFF09\n  const how = vel\n    ? `\u6309\u4E0B\u90A3\u4E00\u4E0B\u7684\u8F7B\u91CD\uFF08MIDI \u529B\u5EA6\uFF09\uFF1A\u6E10\u5F3A\u6E10\u5F31 = \u6BCF\u4E2A\u65B0\u97F3\u4E00\u4E2A\u53F0\u9636\uFF0C\u6309\u4F4F\u7684\u97F3\u4E2D\u95F4\u4E0D\u53D8\uFF1B\u4E00\u4E2A\u97F3\u91CC\u9762\u8981\u53D8\uFF0C\u7528\u97F3\u5185\u8D77\u4F0F${sp.canSwell ? \"\" : \"\uFF08\u8FD9\u4EF6\u4E50\u5668\u6309\u4E0B\u53BB\u5C31\u81EA\u7136\u8870\u51CF\uFF1A\u97F3\u5185\u53EA\u80FD\u53D8\u5F31\uFF09\"}`\n    : `\u4E00\u6761\u8FDE\u7EED\u7684\u97F3\u91CF\u66F2\u7EBF\uFF08\u4E58\u5728${sung ? \"\u5531\" : \"\u5F39\"}\u51FA\u6765\u7684\u58F0\u97F3\u4E0A\uFF09\uFF1A\u6E10\u5F3A\u6E10\u5F31\u5728\u4E00\u4E2A\u957F\u97F3\u4E2D\u95F4\u4E5F\u4E00\u76F4\u5728\u53D8\uFF0C\u548C\u97F3\u5185\u8D77\u4F0F\u662F\u540C\u4E00\u79CD\u53D8\u6CD5\uFF1B\u53EA\u53D8\u54CD\u5EA6\u3001\u4E0D\u53D8\u97F3\u8272${sung ? \"\uFF08\u771F\u4EBA\u6E10\u5F31\u4F1A\u53D8\u865A\u3001\u53D8\u6697\uFF0C\u8FD9\u4E2A\u8FD8\u6CA1\u6709\uFF09\" : \"\"}`;\n  const rows: [string, string, string][] = [\n    [\"\u529B\u5EA6\u600E\u4E48\u53D8\", \"\", how],\n    [\"\u529B\u5EA6\u8BB0\u53F7\", \"\", vel ? `\u529B\u5EA6\u8868\uFF1A${(Object.entries(sp.dynamicsVel!) as [string, number][]).map(([d, x]) => `${d} ${x}`).join(\" \u00B7 \")}` : `\u97F3\u91CF\uFF1A${(Object.entries(sp.dynamicsDb) as [string, number][]).map(([d, x]) => `${d} ${db(x)}`).join(\" \u00B7 \")}`],\n    [\"\u6E10\u5F3A\u6E10\u5F31\u6CA1\u5199\u7EC8\u70B9\", \"\", vel ? `\u8D70\u4E00\u6863 = \u529B\u5EA6 ${sp.wedgeStepVel}` : `\u8D70\u4E00\u6863 = ${db(sp.wedgeStepDb)}`],\n    [\"\u5E7D\u7075\u97F3\", \"ghost\", vel ? `\u529B\u5EA6 ${sp.ghostVel}` : `\u6574\u4E2A\u97F3 ${db(sp.ghostDb)}`],\n    [\"\u5F31\u5316\", \"unstress\", vel ? `\u529B\u5EA6 ${sp.unstressVel}` : `\u6574\u4E2A\u97F3 ${db(sp.unstressDb)}`],\n    [\"\u6B21\u91CD\u97F3\", \"stress\", vel ? `\u529B\u5EA6 +${sp.stressVel}` : `\u97F3\u5934 ${ms(sp.accentSec)} ${db(sp.stressDb)}`],\n    [\"\u91CD\u97F3\", \"accent\", vel ? `\u529B\u5EA6 +${sp.accentVel}` : `\u97F3\u5934 ${ms(sp.accentSec)} ${db(sp.accentDb)}${sung ? `\uFF1B${singTxt(\"accent\")}` : \"\"}`],\n    [\"\u5F3A\u97F3\", \"marcato\", vel ? `\u529B\u5EA6 +${sp.marcatoVel}` : `\u97F3\u5934 ${ms(sp.accentSec)} ${db(sp.marcatoDb)}${sung ? `\uFF1B${singTxt(\"marcato\")}` : \"\"}`],\n    [\"\u7A81\u5F3A sfz\", \"sfz\", vel ? `\u529B\u5EA6 +${sp.sfzVel}` : `\u97F3\u5934 ${db(sp.sfzDb)}\uFF0C${ms(sp.sfzSec)} \u91CC\u843D\u56DE\u6765${sung ? `\uFF1B${singTxt(\"sfz\")}` : \"\"}`],\n    [\"\u5F3A\u540E\u5373\u5F31 fp\", \"fp\", `\u97F3\u5934\u6309 f\uFF0C${ms(sp.fpSec)} \u91CC\u843D\u5230 p\uFF0C\u4E4B\u540E\u90FD\u662F p${sung ? `\uFF1B${singTxt(\"fp\")}` : \"\"}`],\n    [\"\u97F3\u5185\u6E10\u5F3A / \u9F13\u8D77\", \"swellGrow\", sp.canSwell ? `\u5199\u7684\u529B\u5EA6\u662F\u6700\u9AD8\u70B9\uFF1A< \u4ECE \u2212${sp.swellDb} dB \u957F\u5230\u5199\u7684\u529B\u5EA6\uFF1B<> \u4E24\u5934 \u2212${sp.swellDb} dB\u3001\u4E2D\u95F4\u56DE\u5230\u5199\u7684\u529B\u5EA6\uFF08\u5F3A\u540E\u5373\u5F31\u4E4B\u540E\u7684 < \u957F\u56DE\u97F3\u5934\u7684 f\uFF09` : \"\u505A\u4E0D\u5230\uFF1A\u8FD9\u4EF6\u4E50\u5668\u6309\u4E0B\u53BB\u5C31\u81EA\u7136\u8870\u51CF\"],\n    [\"\u97F3\u5185\u6E10\u5F31\", \"swellFade\", `\u4E00\u8DEF\u5F80\u4E0B\u5230 \u2212${sp.swellDb} dB`],\n    [\"\u8DF3\u97F3\", \"staccato\", sung ? singTxt(\"staccato\") : `\u5531 / \u5F39 ${pct(sp.staccatoGate)} \u7684\u957F\u5EA6`],\n    [\"\u4FDD\u6301\", \"tenuto\", \"\u8FD9\u4E2A\u97F3\u4E0D\u7559\u7F1D\"],\n    [\"\u8FDE\u7EBF\", \"slur\", \"\u8FDE\u5230\u4E0B\u4E00\u4E2A\u97F3\u3001\u4E0D\u7559\u7F1D\"],\n    [\"\u547C\u5438\", \"breath\", sung ? singTxt(\"breath\") : `\u524D\u4E00\u4E2A\u97F3\u6536\u77ED ${ms(sp.breathSec)}\uFF08\u6700\u591A ${pct(sp.breathShare)}\uFF09`],\n    [\"\u51FA\u58F0\u7684\u6362\u6C14\uFF08\u8F7B\u5438 / \u6DF1\u5438\uFF09\", \"inhale\", sung ? \"\u6362\u6C14\u7684\u7A7A\u5F53\u91CC\u4E00\u58F0\u5438\u6C14\uFF08\u6309\u4E0B\u4E00\u4E2A\u5B57\u7684\u5143\u97F3\u5851\u5F62\uFF0C\u6BD4\u5B83\u8F7B\u7EA6 28 dB\uFF1B\u6DF1\u5438 = \u7A7A\u5F53\u957F\u4E00\u70B9\u3001\u54CD 4 dB\uFF09\" : \"\u505A\u4E0D\u5230\uFF1A\u8FD9\u4F4D\u53EA\u65AD\u5F00\uFF0C\u4E0D\u51FA\u5438\u6C14\u58F0\"],\n    [\"\u6C14\u58F0\uFF08\u00D7 \u7B26\u5934\uFF09\", \"whisper\", sung ? \"\u8FD9\u4E2A\u5B57\u4E0D\u5531\u97F3\u9AD8\uFF1A\u7528\u5FF5\u7684\u65F6\u5019\u7684\u6C14\u58F0\uFF08\u8C31\u5305\u7EDC\u7167\u65E7\u3001\u58F0\u5E26\u4E0D\u632F\uFF09\uFF0C\u518D\u8F7B 6 dB\" : \"\u505A\u4E0D\u5230\uFF1A\u8FD9\u4F4D\u53EA\u6309\u97F3\u9AD8\u51FA\u58F0\"],\n    [\"\u97F3\u548C\u97F3\u4E4B\u95F4\", \"\", sung ? \"\u8FDE\u7740\u5531\" : `${ms(sp.gapSec)}\uFF08\u6700\u591A ${pct(sp.gapShare)}\uFF09`],\n  ];\n  return `<details class=\"ip-marks\"><summary>\u8BB0\u53F7\u600E\u4E48\u6F14\uFF08\u8FD9\u4F4D\u81EA\u5DF1\u7684\u914D\u7F6E\uFF0C\u8DDF\u7740\u6F14\u594F\u8005\u5B58\u8FDB\u6B4C\uFF09</summary><table>${rows.map(([k, m, v]) => `<tr${gray(m)}><th>${k}</th><td>${esc(v)}${m && ign.includes(m as Mark) ? `<span class=\"ign-tag\">\u4E0D\u8BA4</span>` : \"\"}</td></tr>`).join(\"\")}</table></details>`;\n}\n/** \u4E50\u5668\u9875\u300C\u97F3\u548C\u97F3\u4E4B\u95F4\u300D\u7684\u9ED8\u8BA4 + \u8BF4\u660E\uFF1AGS \u8D27\u67B6\u4E0A\u7684 = \u76EE\u5F55\u7684 joint\uFF1B\u81EA\u5DF1\u7684 .sf2 = 0\uFF08\u76EE\u5F55\u4E0D\u8BA4\u8BC6\uFF09\uFF1B\u5143\u97F3\u7248 = 0\uFF08\u4EBA\u58F0\u8FDE\u7740\u5531\uFF09\u3002\u76EE\u5F55\u8FD8\u6CA1\u8F7D = null\uFF08\u5148\u8F7D\uFF0C\u8F7D\u597D\u91CD\u753B\uFF09\u3002 */\nfunction gapDefaultOf(role: string): { gapSec: number; label: string } | null {\n  const g = activeGm(D.extras, role);\n  if (!g) return { gapSec: 0, label: \"\u4EBA\u58F0\uFF08\u8FDE\u7740\u5531\uFF09\" };\n  if (g.origin.library !== GS_LIBRARY_ID) return { gapSec: 0, label: \"\u81EA\u5DF1\u7684 .sf2\uFF08\u76EE\u5F55\u91CC\u6CA1\u6709\u8FD9\u4E2A\u97F3\u8272\u7684\u8FDE\u65AD\u6570\u636E\uFF09\" };\n  if (!catalogNow) { void loadCatalog(new URL(import.meta.url)).then((c) => { catalogNow = c; if (instShown()) drawInst(); }).catch(() => undefined); return null; }\n  const j = jointOf(catalogNow, g.bank, g.program, g.note);\n  return j ? { gapSec: j.gapSec, label: j.zh } : { gapSec: 0, label: \"\u4E00\u4E0B\u5C31\u5B8C / \u97F3\u6548\uFF08\u4E0D\u7559\u7F1D\uFF09\" };\n}\n/** \u7528\u8BD5\u542C\u53F0\u4E0A\u90A3\u4F4D\u653E\u672C\u58F0\u90E8\u7684\u5F00\u5934\uFF08\u524D 8 \u79D2\uFF1B\u8D70\u5F55\u97F3\u623F\uFF0C\u4E0D\u5199\u8C31\uFF09\u3002 */\nasync function playHeadWith(p: FinderPick): Promise<void> {\n  if (engine.playing) stopPlay();\n  const { tokens, map } = curFlat(), notes = lightNotes(tokens, map).filter((n) => n.t0 < 8);\n  if (!notes.length) { info(\"\u8C31\u4E0A\u8FD8\u6CA1\u6709\u97F3\"); return; }\n  singer.unlock();\n  let track: TrackSpec, label: string;\n  if (p.kind === \"voice\") { await ensureVowels(); track = { id: \"audition\", kind: \"vowel\", kana: HUM_KANA[D.st.song.hum ?? \"n\"], notes: notes.map((n) => ({ t0: n.t0, t1: Math.min(n.t1, 8), key: n.midi, vel: 1, preset: 0 })), gain: null }; label = \"\u5C0F\u6708\u76F8\uFF08\u54FC\uFF09\"; }\n  else {\n    if (!audition || audition.bank !== p.provider.bank || audition.program !== p.provider.program) await setAudition(p);\n    if (!audition) return;\n    const a = audition;\n    track = { id: \"audition\", kind: \"sf\", sha: a.sha256, notes: notes.map((n) => ({ t0: n.t0, t1: Math.min(n.t1, 8), key: sfKey(n.midi, a), vel: SOUNDFONT_DEFAULTS.velocity, preset: engine.presetIndex(a.sha256, a.bank, a.program) })), gain: null }; label = a.label;\n  }\n  const to = Math.min(8, Math.max(...notes.map((n) => n.t1)));\n  await previewTrack(track, to, label);   // \u4E34\u65F6\u8F68\u8FDB\u5F55\u97F3\u623F\u3001\u4ECE 0 \u653E\u5230 to\uFF08src/app/performance.ts\uFF09\n}\n/** \u4E0A\u573A\uFF1A\u89D2\u8272\u6539\u6210\u8FD9\u4E2A\u6982\u5FF5\uFF08\u8C31\u4E0A\u5199\u5B83\u7684\u82F1\u6587\u540D + \u5B98\u65B9 id + id \u675F by value\uFF09\uFF0C\u518D\u9020\u6F14\u594F\u8005\u3002\n *  \u58F0\u97F3\u9ED8\u8BA4\u5F31\u5F15\u7528\uFF082026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u6211\u540E\u6094\u81EA\u52A8embed\u97F3\u6E90\u4E86\uFF0C\u6539\u6210\u5F31\u5F15\u7528\u5427\uFF0Capp\u53EF\u4EE5\u81EA\u5DF1\u627E\u5417\u300D\uFF09\uFF1A\u6B4C\u91CC\u53EA\u8BB0\u6765\u6E90 + \u5B50\u96C6 sha256\uFF0C\n *  GS \u6574\u5305\u5728\u8BBE\u5907\u7F13\u5B58 / \u5BB6\u65CF\u97F3\u6E90\u5E93\u91CC\u627E\u5F97\u5230\uFF1B\u8981\u6B4C\u81EA\u5DF1\u5E26\u7740\u58F0\u97F3 = \u6587\u4EF6\u83DC\u5355\u300C\u5168\u90E8\u6253\u5305\u8FDB\u6B4C\u300D\uFF0C\u6216\u5BFC\u51FA\u300C\u6253\u5305\u97F3\u6E90\u300D\u7684\u526F\u672C\u3002 */\nasync function castPick(p: FinderPick): Promise<void> {\n  if (finderPlayOnly()) return;   // \u53EA\u5F39\u7740\u73A9\uFF1A\u6CA1\u6709\u8981\u5199\u8FDB\u53BB\u7684\u6B4C\n  const cat = await loadCatalog(new URL(import.meta.url)), c = p.concept;\n  const sound = p.kind === \"gs\" ? (p.provider.sound ?? roleSoundOf(cat, c)) : roleSoundOf(cat, c);\n  updateExtras(withRoleConcept(D.extras, curRole(), { name: roleNameOf(c), sound, concept: { ids: { wikidata: c.ids.wikidata, local: c.ids.local, musicxml: c.ids.musicxml, gm: c.ids.gm.map((g) => ({ program: g.program, bank: g.bank })), hs: c.ids.hs }, name: { zh: c.names.zh, en: c.names.en, ...(c.names.ja ? { ja: c.names.ja } : {}) } } }, D.st.song.hum), { kind: \"lounge\", label: `\u300C${roleNameOf(c)}\u300D\u6539\u6210\u8FD9\u4E2A\u4E50\u5668` }, \"cast\");\n  if (p.kind === \"voice\") { setActive(CANDIDATE_ID.full); closeFinder(); return; }\n  if (!audition || audition.bank !== p.provider.bank || audition.program !== p.provider.program) await setAudition(p);\n  if (!audition) { view.render(); renderTitle(); return; }\n  const { subset, sha256 } = audition, inf = sf2Info(subset);\n  const fileSha256 = GS.sha256;   // \u8BD5\u542C\u53F0\u7684\u6574\u5305 = \u8D27\u67B6\u4E0A\u7684\u90A3\u4EFD\uFF08\u54C8\u5E0C\u5C31\u662F\u76EE\u5F55\u9489\u7684\uFF09\n  updateExtras(withSf2Candidate(D.extras, curRole(), { name: p.provider.gmName, bank: p.provider.bank, program: p.provider.program, ...gsKeyArgs(cat, p.provider.bank, p.provider.program, p.provider.note), subset, sha256, embed: false,\n    origin: { name: GS.name, fileSha256, bytes: GS.bytes, library: GS.id }, credit: { attribution: [GS.attribution], license: { name: GS.license.name, url: GS.homepage ?? GS.source, text: inf.comment } } }, D.st.song.hum), { kind: \"lounge\", label: `\u300C${roleNameOf(c)}\u300D\u4E0A\u573A\uFF1A${p.provider.gmName}` }, \"cast\");\n  sources.session.keep(sha256, subset);\n  closeFinder(); setActive(activeId(D.extras, curRole())); info(`\u300C${roleNameOf(c)}\u300D\u6362\u6210\uFF1A${p.provider.gmName}`);\n}\nconst finder = new Finder($(\"stage\"), { base: new URL(import.meta.url), roleName: () => roleName(D.extras, curRole()), audition: setAudition, playHead: playHeadWith, cast: castPick, close: () => closeFinder(), togglePad: () => showPad(padEl.hidden) });\n// \u2500\u2500 \u5F55\u97F3\u5BA4\uFF08src/ui/studio.ts\uFF09\uFF1A\u5168\u5C4F\u66FF\u6389\u8C31\u533A\uFF0C\u4E00\u4E2A\u58F0\u90E8\u4E00\u6761\u63A8\u5B50\u6761\uFF1B\u589E\u76CA / \u58F0\u50CF\u8FDB\u5F55\u97F3\u623F\uFF08studio.json\uFF09\uFF0C\u9759\u97F3 / \u72EC\u594F = partView \u2500\u2500\nconst partLabel = (id: string): string => { const k = D.st.song.parts.findIndex((p) => p.id === id); return k < 0 ? id : partLabels(D.st.song, D.extras)[k]; };\nconst studio = new Studio($(\"stage\"), {\n  strips: () => { const labels = partLabels(D.st.song, D.extras), cols = partColorIndices(D.st.song.parts.map((p) => roleSound(D.extras, p.role))); return D.st.song.parts.map((p, k) => ({ id: p.id, name: labels[k], color: TAB20[cols[k]], refs: D.st.song.papers.filter((pp) => pp.tracks[p.id]).length, performer: activeCandidateName(D.extras, p.role) ?? \"\uFF08\u6CA1\u4EBA\u4E0A\u573A\uFF09\", ...micOf(p), muted: pv(p.id).muted, solo: pv(p.id).solo })); },\n  setGain: (id, dB) => { const p = D.st.song.parts.find((x) => x.id === id); if (p) updateExtras(withMic(D.extras, p.mic, { gainDb: dB }), { kind: \"studio\", label: `${partLabel(id)} \u589E\u76CA ${dB > 0 ? \"+\" : \"\"}${dB.toFixed(1)} dB` }, `mix:gain:${id}`); },\n  setPan: (id, pan) => { const p = D.st.song.parts.find((x) => x.id === id); if (p) updateExtras(withMic(D.extras, p.mic, { pan }), { kind: \"studio\", label: `${partLabel(id)} \u58F0\u50CF ${Math.abs(pan) < 0.025 ? \"\u4E2D\" : pan < 0 ? `\u5DE6 ${Math.round(-pan * 100)}` : `\u53F3 ${Math.round(pan * 100)}`}` }, `mix:pan:${id}`); },\n  toggleMute: (id) => { setPv(id, { muted: !pv(id).muted }); afterViewChange(); },   // \u653E\u7740\u7684\u65F6\u5019\u9A6C\u4E0A\u9759\uFF08\u5F55\u97F3\u623F\u63A8\u5B50\u5230\u5E95\u3001\u53D1\u9001\u4E00\u8D77\u505C\uFF09+ \u65F6\u95F4\u7EBF\u91CD\u7B97\uFF08v0.10.38\uFF1Buser\u300C\u6211mute\u4E86\u4E4B\u540E\u5B83\u7684reverb\u4E3A\u4EC0\u4E48\u8FD8\u662F\u8FDB\u4E86reverb\u8F68\uFF1F\u300D\uFF09\n  toggleSolo: (id) => { setPv(id, { solo: !pv(id).solo }); afterViewChange(); },\n  play: () => playPause(),\n  close: () => closeStudio(),\n  master: () => activeMaster(D.extras),\n  setMasterGain: (dB) => updateExtras(withMaster(D.extras, { gainDb: dB }), { kind: \"studio\", label: `\u603B\u8F68\u589E\u76CA ${dB > 0 ? \"+\" : \"\"}${dB.toFixed(1)} dB` }, \"mix:master\"),\n  bypass: () => perfApi.mixBypass, setBypass: (on) => { perfApi.mixBypass = on; pushChannels(); diagNote(\"studio\", `bypass ${on ? \"on\" : \"off\"}`); },\n  toggleLimiter: () => { const on = !activeMaster(D.extras).limiter; updateExtras(withMaster(D.extras, { limiter: on }), { kind: \"studio\", label: `\u6BCD\u7EBF\u9650\u5E45${on ? \"\u5F00\" : \"\u5173\"}` }); },\n  // \u63D2\u4EF6\u683C\uFF08v0.10.8\uFF09\uFF1A\u603B\u8F68 = studio.json master.chain\uFF1B\u6B4C\u624B = \u5B83\u90A3\u6761\u9EA6\u514B\u98CE\u8F68\u7684 chain\n  chain: (track) => (track === STUDIO_MASTER ? activeMaster(D.extras).chain : studioTrack(D.extras, trackKey(track))?.chain ?? []),\n  resolve: (track, fx) => resolveChain([fx], { lowestMidi: D.st.song.parts.some((x) => x.id === track) ? lowestMidiOf(track) : null, bpm: songBpm() })[0],   // \u548C pushChannels \u540C\u4E00\u4EFD\u6362\u7B97\n  setChain: (track, chain, label, merge) => {\n    if (track === STUDIO_MASTER) { updateExtras(withMaster(D.extras, { chain }), { kind: \"studio\", label }, merge); return; }\n    updateExtras(withTrack(D.extras, trackKey(track), { chain }), { kind: \"studio\", label }, merge);\n  },\n  // \u88AB\u8C01\u538B\uFF08\u4FA7\u94FE\uFF09\uFF1A\u5F55\u97F3\u623F\u53EA\u7ED9\u6B4C\u624B\u8F68\u7684\u538B\u7F29\u5668\u63A5 key\uFF08\u603B\u7EBF / \u603B\u8F68\u4E0A\u7684\u538B\u7F29\u5668\u542C\u81EA\u5DF1\uFF09\n  tabChanged: () => syncSpectrum(),\n  keyTracks: (track) => { if (!D.st.song.parts.some((p) => p.id === track)) return []; const labels = partLabels(D.st.song, D.extras); return D.st.song.parts.flatMap((p, k) => (p.id === track ? [] : [{ id: p.id, name: labels[k] }])); },\n  // \u8DEF\u7531\u8F68\uFF08v0.10.9\uFF1Buser\u300C\u63D2\u4EF6\uFF1A\u53EF\u4EE5\u968F\u4FBF\u63D2\uFF0C\u6BD4\u5982\u6DF7\u54CD\u4E5F\u662F\uFF0C\u4F60\u53EF\u4EE5\u505A\u4E2D\u95F4\u7684\u8DEF\u7531\u8F68\u3002\u6BD4\u5982\u6211\u53EF\u4EE5\u653E\u4E24\u4E2A\u8DEF\u7531\u8F68\u7136\u540E\u653E\u6DF7\u54CD\u300D\u300C\u6709\u4E00\u4E2A\u9ED8\u8BA4\u603B\u7EBF\uFF0C\u5C31\u662F\u6B4C\u624B\u548C\u8F93\u51FA\u90FD\u662Fbuiltin\u7684\uFF0C\u4F46\u662F\u4F60\u53EF\u4EE5\u52A0\u6DF7\u97F3\u8F68\u300D\uFF09\n  buses: () => studioTracks(D.extras).filter((t) => t.kind === \"bus\").map((b) => ({ id: b.id, name: b.name, gainDb: b.gainDb, pan: b.pan, bypass: b.bypass, muted: busMuted.has(b.id) })),\n  toggleBusMute: (id) => { if (!busMuted.delete(id)) busMuted.add(id); pushChannels(); },   // \u6DF7\u97F3\u8F68\u9759\u97F3\uFF1A\u89C6\u56FE\u6001\uFF08\u4E0D\u8FDB\u6587\u4EF6\u3001\u4E0D\u8FDB undo\uFF09\uFF0C\u540C\u6B4C\u624B\u7684\u9759\u97F3\n  setBusBypass: (id, on) => updateExtras(withTrack(D.extras, id, { bypass: on }), { kind: \"studio\", label: `${studioTrack(D.extras, id)?.name ?? id} ${on ? \"\u65C1\u901A\" : \"\u53D6\u6D88\u65C1\u901A\"}` }),\n  addBus: () => { const id = newBusId(D.extras), n = studioTracks(D.extras).filter((t) => t.kind === \"bus\").length + 1, name = `\u6DF7\u97F3\u8F68 ${n}`; updateExtras(withTrack(D.extras, id, { kind: \"bus\", name }), { kind: \"studio\", label: `\u52A0${name}` }); return id; },\n  removeBus: (id) => { const name = studioTrack(D.extras, id)?.name ?? id; updateExtras(withoutBus(D.extras, id), { kind: \"studio\", label: `\u5220${name}` }); },\n  renameBus: (id, name) => updateExtras(withTrack(D.extras, id, { name }), { kind: \"studio\", label: `\u6539\u540D\u300C${name}\u300D` }),\n  movePart: (id, dir) => { update(movePart(D.st, id, dir)); renderTitle(); },   // \u548C\u8C31\u4E0A\u58F0\u90E8\u83DC\u5355\u7684\u300C\u4E0A\u79FB / \u4E0B\u79FB\u300D\u540C\u4E00\u4E2A\n  moveBus: (id, dir) => updateExtras(moveBus(D.extras, id, dir), { kind: \"studio\", label: `${studioTrack(D.extras, id)?.name ?? id} \u5F80${dir < 0 ? \"\u524D\" : \"\u540E\"}\u632A` }),\n  setBusGain: (id, dB) => updateExtras(withTrack(D.extras, id, { gainDb: dB }), { kind: \"studio\", label: `${studioTrack(D.extras, id)?.name ?? id} \u589E\u76CA ${dB > 0 ? \"+\" : \"\"}${dB.toFixed(1)} dB` }, `mix:gain:${id}`),\n  setBusPan: (id, pan) => updateExtras(withTrack(D.extras, id, { pan }), { kind: \"studio\", label: `${studioTrack(D.extras, id)?.name ?? id} \u58F0\u50CF` }, `mix:pan:${id}`),\n  outTo: (track) => studioTrack(D.extras, trackKey(track))?.to ?? \"master\",\n  setOutTo: (track, to) => updateExtras(withTrack(D.extras, trackKey(track), { to }), { kind: \"studio\", label: `${routeName(track)} \u51FA\u5230 ${routeName(to)}` }),\n  sends: (track) => studioTrack(D.extras, trackKey(track))?.sends ?? [],\n  setSends: (track, sends, label, merge) => updateExtras(withTrack(D.extras, trackKey(track), { sends }), { kind: \"studio\", label: `${routeName(track)} ${label}` }, merge),\n  /** \u8FD9\u6761\u8F68\u80FD\u51FA\u5230 / \u53D1\u7ED9\u7684\u8DEF\u7531\u8F68\uFF1A\u9664\u4E86\u81EA\u5DF1\uFF0C\u4EE5\u53CA\u4F1A\u63A5\u6210\u73AF\u7684\uFF08\u4ECE\u90A3\u6761\u8D70\u5F97\u56DE\u8FD9\u6761\u7684\uFF09\u3002 */\n  targets: (track) => { const all = studioTracks(D.extras).filter((t) => t.kind === \"bus\"), key = trackKey(track), next = (id: string) => { const t = all.find((x) => x.id === id); return t ? [t.to, ...t.sends.map((x) => x.to)].filter((x) => x && x !== \"master\") : []; };\n    const reaches = (from: string, to: string) => { const seen = new Set<string>(), stk = [from]; while (stk.length) { const x = stk.pop()!; if (x === to) return true; if (seen.has(x)) continue; seen.add(x); stk.push(...next(x)); } return false; };\n    return all.filter((b) => b.id !== key && !reaches(b.id, key)).map((b) => ({ id: b.id, name: b.name })); },\n  /** \u5220\u4E00\u4F4D\u6B4C\u624B\uFF1A\u53EA\u5220\u4E00\u5F20\u7EB8\u90FD\u4E0D\u5728\u7684\uFF08\u6CA1\u5F15\u7528 = \u6CA1\u6709\u97F3\u4F1A\u4E22\uFF09\uFF1B\u4F11\u606F\u5BA4\u91CC\u5B83\u7684\u89D2\u8272\u4E00\u8D77\u5220\uFF1B\u80FD\u64A4\u9500\u3002 */\n  deletePart: (id) => {\n    const p = D.st.song.parts.find((x) => x.id === id); if (!p || D.st.song.papers.some((pp) => pp.tracks[id])) return;\n    const name = partLabel(id);\n    updateBoth(removePart(D.st, id), withoutRole(D.extras, p.role), { kind: \"studio\", label: `\u5220\u6389\u6B4C\u624B\u300C${name}\u300D` });\n    studio.render(); renderTitle(); info(`\u5220\u6389\u4E86\u300C${name}\u300D\uFF08\u64A4\u9500\u80FD\u627E\u56DE\u6765\uFF09`);\n  },\n});\n/** \u5F55\u97F3\u5BA4 = \u5E95\u5EA7\u91CC\uFF08\u952E\u76D8\u90A3\u4E2A\u4F4D\u5B50\uFF1B\u548C\u952E\u76D8\u4E92\u65A5\uFF09\uFF0C\u8C31\u7559\u7740\u80FD\u770B\uFF082026-10-10 user\u300C\u5F55\u97F3\u5BA4\u7684\u952E\u76D8\u4F4D\u5316\uFF0C\u548C\u952E\u76D8\u4E92\u76F8\u6392\u65A5\u300D\uFF1B\u4E4B\u524D\u662F\u5168\u5C4F\u9875\uFF09\u3002 */\n/** \u6DF7\u97F3\u53F0 = \u300C\u542C\u300D\u7684\u952E\u76D8\uFF08v0.10.2\uFF1Buser\u300C\u80FD\u4E0D\u80FD\u6DF7\u97F3\u53F0\u5C31\u662F\u542C\u7684\u952E\u76D8\uFF0C\u4E0D\u7528\u5355\u72EC\u4E00\u4E2A\u952E\uFF0C\u5C31\u662F\u4E0D\u540C\u529F\u80FD\u6709\u4E0D\u540C\u952E\u76D8\u300D\uFF09\uFF1A\u6253\u5F00 = \u5207\u5230\u542C\uFF08\u5E95\u5EA7 = \u6DF7\u97F3\u53F0\uFF09\uFF1B\u6536\u8D77 = \u6536\u8D77\u5E95\u5EA7\uFF08\u5E95\u4E0B\u90A3\u7C92 tab \u53EB\u56DE\u6765\uFF09\u3002 */\nfunction openStudio(): void { ui.close(); closeFinder(false); closeInstPage(); ws.collapsed = false; if (ws.mode !== \"listen\") setMode(\"listen\"); else applyWorkspace(); }   // \u5CF0\u503C\u8868\uFF1A\u9875\u5F00\u7740\u624D\u8981\nfunction closeStudio(): void { if (!studio.isOpen) return; ws.collapsed = true; applyWorkspace(); scoreEl.focus(); }\nengine.on(\"meter\", (peak, _active, tracks, ms, gr, cl) => { if (studio.isOpen) studio.meter(peak, tracks, ms, gr, cl); });\nengine.on(\"stereo\", (tracks) => { if (studio.isOpen) studio.stereo(tracks); });   // \u674E\u8428\u5982\u56FE\uFF08v0.10.16\uFF09   // \u6BCF\u5F20\u5361\u7247\u9876\u4E0A\u7684\u5CF0\u503C\u7EC6\u7EBF\uFF08v0.10.10\uFF09\nengine.on(\"spectrum\", (sr, tracks) => studio.spectrum(sr, tracks));   // EQ \u9875\u5361\u7247\u80CC\u666F\u7684\u9891\u8C31\uFF08v0.10.11\uFF09\n/** \u5F55\u97F3\u623F\u7684\u9891\u8C31\u53EA\u5728\u300C\u6DF7\u97F3\u53F0\u5F00\u7740 + EQ \u9875 + \u9875\u9762\u770B\u5F97\u89C1\u300D\u65F6\u7B97\uFF08user\u300C\u8BB0\u5F97\u6211\u8BF4\u7684\u7701cpu\uFF0C\u53EA\u6709\u770B\u89C1\u7684\u65F6\u5019\u624D\u8FDB\u884C\u7EDF\u8BA1\u548C\u7ED8\u5236\u300D\uFF09\u3002 */\n/** \u80CC\u666F\u7684\u7EDF\u8BA1\u53EA\u5728\u770B\u5F97\u89C1\u7684\u90A3\u4E00\u9875\u5F00\uFF08user\u300C\u8BB0\u5F97\u6211\u8BF4\u7684\u7701cpu\uFF0C\u53EA\u6709\u770B\u89C1\u7684\u65F6\u5019\u624D\u8FDB\u884C\u7EDF\u8BA1\u548C\u7ED8\u5236\u300D\uFF09\uFF1AEQ \u9875 = \u9891\u8C31\uFF0C\u57FA\u7840\u9875 = \u674E\u8428\u5982\u56FE\u3002 */\nfunction syncSpectrum(): void { const on = studio.isOpen && document.visibilityState === \"visible\"; engine.spectrum(on && studio.currentTab === \"eq\"); engine.stereo(on && studio.currentTab === \"basic\"); }\nfunction openFinder(): void {\n  const back = instShown(); if (back) instEl.hidden = true;   // \u4ECE\u4E50\u5668\u9875\u5F00\u7684\uFF1A\u5173\u4E86\u56DE\u4E50\u5668\u9875\n  ui.setPage({ k: \"finder\", playOnly: gallery?.isOpen() ?? false, backToInst: back });\n  document.body.classList.toggle(\"finder-over-gallery\", finderPlayOnly());   // \u821E\u53F0\u6574\u5C42\u76D6\u5230\u6B4C\u5E93\u4E0A\u9762\uFF08styles.css\uFF09\n  ui.close(); scoreEl.hidden = true; ws.tryout = padLocked(ui.page); showPad(true); padEl.classList.add(\"is-locked\"); pad.clearHeld(); pad.render(); void finder.show({ playOnly: finderPlayOnly() }); updateChrome(); }   // \u300C\u5F39\u300D\u4EAE\u7740 = pad \u53EA\u5F39\u4E0D\u5199\n/** back = \u5173\u4E86\u56DE\u4E50\u5668\u9875\uFF08\u9ED8\u8BA4 = \u5B83\u662F\u4ECE\u4E50\u5668\u9875\u5F00\u7684\uFF09\uFF1B\u5F00\u6DF7\u97F3\u53F0 / \u5F00\u4E50\u5668\u9875 / \u8FDB\u6B4C\u5E93\u65F6\u4F20 false = \u4E0D\u56DE\u3002 */\nfunction closeFinder(back: boolean = ui.page.k === \"finder\" && ui.page.backToInst): void { if (!finder.isOpen) return; const wasPlayOnly = finderPlayOnly(); ui.setPage({ k: \"score\" }); if (wasPlayOnly) document.body.classList.remove(\"finder-over-gallery\"); finder.hide(); audition = null; auditionHint = null; sound.allOff(); padEl.classList.remove(\"is-locked\"); ws.tryout = back; applyWorkspace(); pad.render(); scoreEl.hidden = false; void prepareBank(); view.render(); renderTitle(); updateChrome(); scoreEl.focus(); if (back) openInstPage(); }\n/** \u6362\u53F0\u4E0A\u7684\u6F14\u594F\u8005\uFF08\u4EBA\u9009\u7684\uFF0C\u4E0D\u81EA\u52A8\uFF09\uFF1A\u6539\u4F11\u606F\u5BA4\u5FEB\u7167\u91CC\u7684 active\uFF0C\u91CD\u753B\u8C31\u524D\u7684\u6B4C\u624B\u724C\u3002 */\nfunction setActive(id: string): void { const next = withActive(D.extras, curRole(), id, D.st.song.hum); updateExtras(next, { kind: \"lounge\", label: `\u300C${roleName(next, curRole())}\u300D\u6362\u4EBA\uFF1A${activeCandidateName(next, curRole()) ?? id}` }); sound.allOff(); void prepareBank(); view.render(); renderTitle(); }\n/** \u4F5C\u8005\u680F\uFF08\u6807\u9898\u4E0B\u9762\u9760\u53F3\u90A3\u4E00\u5757\u70B9\u5F00\uFF09\uFF1A\u4E00\u5757\u7EAF\u6587\u672C\uFF0C\u7EB8\u4E0A\u7167\u5199\u7684\u663E\u793A\uFF08\u4E0D\u8BA4\u300C\u4F5C\u8BCD\uFF1A\u300D\u8FD9\u7C7B\u683C\u5F0F\uFF0C\u6240\u89C1\u5373\u6240\u5F97\uFF09\u3002\n *  \u4E0D\u63D0\u9192\u3001\u4E0D\u5E2E\u7528\u6237\u5199\u4EFB\u4F55\u4E1C\u897F\uFF08user\u300C\u53EA\u662F\u4E3E\u4F8B\u5B50\uFF0C\u7136\u540E\u8FD9\u4E2A\u4F60\u4E5F\u4E0D\u5E94\u8BE5\u5F3A\u8FEB\u6216\u8005\u63D0\u9192\u7528\u6237\u5199\u8FD9\u4E2A\uFF0C\u56E0\u4E3A\u8C31\u5B50\u4E5F\u4E0D\u7ED1\u5B9A\u4E50\u5668\u7684\u300D\u300C\u2026\u4E00\u952E\u63D2\u5165\u6309\u94AE \u4E0D\u8981\u300D\uFF09\u3002 */\nfunction openCreditsSheet(): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"offer\";\n  box.innerHTML = `<div class=\"offer-card credits-card\"><div class=\"offer-title\">\u4F5C\u8005\u680F</div>` +\n    `<textarea id=\"crIn\" class=\"credits-in\" rows=\"5\" spellcheck=\"false\" placeholder=\"\u51E0\u884C\u90FD\u884C\uFF0C\u7167\u5199\u7684\u663E\u793A\u5728\u7EB8\u4E0A\uFF08\u6807\u9898\u4E0B\u9762\u9760\u53F3\uFF09\">${esc(D.st.song.credits ?? \"\")}</textarea>` +\n    `<div class=\"offer-msg\">\u53EF\u4E0D\u586B\u3002\u5B58\u8FDB MusicXML\u300C\u5370\u5728\u9875\u9762\u4E0A\u7684\u5B57\u300D\uFF0C\u522B\u7684\u4E50\u8C31\u8F6F\u4EF6\u6253\u5F00\u4E5F\u5728\u7EB8\u4E0A\u3002</div>` +\n    // \u8FD9\u9996\u6B4C\u81EA\u5DF1\u7684\u8BB8\u53EF\uFF08user 2026-10-08\u300C\u4F60\u8BA1\u7B97\u7684\u65F6\u5019\u522B\u5FD8\u4E86\u7528\u6237\u81EA\u5DF1\u5199\u7684\u90A3\u4E00\u90E8\u5206\uFF0C\u7528\u6237\u53EF\u4EE5\u9009\u300D\uFF09\uFF1A\u9ED8\u8BA4\u4E0D\u5199\u3001\u4E0D\u66FF\u7528\u6237\u9009\uFF1B\u9009\u4E86\u7167\u6284\u8FDB <rights>\uFF0C\u8FD8\u80FD\u6539\n    // \u6298\u53E0\u7740\uFF08user\u300C\u53EA\u6709\u7528\u6237\u81EA\u5DF1\u5173\u5FC3\u534F\u8BAE\u7684\u65F6\u5019\u624D\u63D0\u51FA\u8FD9\u4E9B\u300D\uFF09\uFF1A\u9009\u8FC7\u8BB8\u53EF\u624D\u9ED8\u8BA4\u5C55\u5F00\n    `<details class=\"rights-sec\"${D.st.song.rights ? \" open\" : \"\"}><summary class=\"part-sec\">\u8BB8\u53EF\uFF08\u53EF\u9009\uFF1B\u4F60\u5199\u7684\u8FD9\u90E8\u5206\uFF1A\u8BCD / \u66F2 / \u7F16\uFF09</summary><div class=\"set-row\">` +\n    `<button class=\"btn cand\" data-r=\"-1\" title=\"\u4E0D\u5199\uFF1A\u6CD5\u5F8B\u9ED8\u8BA4 = \u4FDD\u7559\u6240\u6709\u6743\u5229\uFF08\u522B\u4EBA\u7528\u8981\u5148\u95EE\u4F60\uFF09\">\u672A\u58F0\u660E\uFF08\u9ED8\u8BA4\uFF09</button>` + RIGHTS_PRESETS.map((p, k) => `<button class=\"btn cand\" data-r=\"${k}\" title=\"${esc(p.note)}\">${esc(p.label)}</button>`).join(\"\") + `</div>` +\n    `<input id=\"rtIn\" class=\"credits-in rights-in\" type=\"text\" spellcheck=\"false\" autocomplete=\"off\" placeholder=\"\u7A7A\u7740 = \u672A\u58F0\u660E\uFF08\u6CD5\u5F8B\u9ED8\u8BA4\u5C31\u662F\u4FDD\u7559\u6240\u6709\u6743\u5229\uFF09\uFF1B\u4E5F\u53EF\u4EE5\u81EA\u5DF1\u5199\" value=\"${esc(D.st.song.rights ?? \"\")}\" />` +\n    `<div class=\"offer-msg\">\u4ECE\u7D27\u5230\u677E\u6392\uFF1BCC \u90A3\u51E0\u4E2A\u53D1\u51FA\u53BB\u4EE5\u540E\u5BF9\u5DF2\u7ECF\u53D1\u51FA\u53BB\u7684\u6536\u4E0D\u56DE\u3002\u5B58\u8FDB MusicXML \u7684 &lt;rights&gt;\uFF1B\u5BFC\u51FA mp3 \u65F6\u8FDE\u540C\u7F72\u540D\u5199\u8FDB\u6587\u4EF6\u7684\u6807\u7B7E\u91CC\u3002</div></details>` +\n    `<div class=\"offer-btns\"><button class=\"btn primary\" data-v=\"ok\">\u597D</button></div></div>`;\n  document.body.append(box);\n  const ta = box.querySelector<HTMLTextAreaElement>(\"#crIn\")!, rt = box.querySelector<HTMLInputElement>(\"#rtIn\")!;\n  const close = () => { update(setRights(setCredits(D.st, ta.value), rt.value)); box.remove(); ui.closed(close); scoreEl.focus(); };\n  ui.open({ k: \"sheet\", close });\n  box.addEventListener(\"click\", (e) => {\n    const t = e.target as HTMLElement, r = t.closest<HTMLElement>(\"[data-r]\")?.dataset.r;\n    if (r !== undefined) { const k = Number(r); rt.value = k < 0 ? \"\" : RIGHTS_PRESETS[k].text(new Date().getFullYear()); rt.focus(); return; }\n    const v = t.closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"ok\") close();\n  });\n  ta.focus();\n}\n/** \u7EB8\u7684\u8BBE\u7F6E\uFF08\u7EB8\u53F3\u4E0A\u89D2\u7684\u5C0F\u94AE\u70B9\u5F00\uFF09\uFF1AA4 / A5 / A6\uFF0C\u6574\u9996\u6B4C\u4E00\u4E2A\uFF1B\u4EE5\u540E\u63D2\u56FE\u7247\u4E5F\u4ECE\u8FD9\u91CC\u8FDB\uFF08user\u300C\u52A0\u56FE\u7247\u7684\u5165\u53E3\u4EE5\u540E\u4E5F\u53EF\u4EE5\u653E\u90A3\u91CC\u300D\uFF09\u3002\u6539\u4E86\u7ACB\u523B\u751F\u6548\u3002 */\nfunction openPaperSheet(): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"offer\";\n  const draw = () => {\n    const p = D.st.song.paper ?? paperOf(DEFAULT_PAPER);\n    box.innerHTML = `<div class=\"offer-card settings-card\"><div class=\"offer-title\">\u7EB8</div><div class=\"set-row\">` +\n      PAPER_KINDS.map((k) => `<button class=\"btn cand${p.kind === k ? \" is-on\" : \"\"}\" data-v=\"${k}\">${PAPER_LABEL[k]}<small>${PAPER_NOTE[k]}</small></button>`).join(\"\") +\n      (p.kind === \"other\" ? `<button class=\"btn cand is-on\" data-v=\"other\">\u5176\u4ED6<small>${paperSizeText(p)}</small></button>` : \"\") + `</div>` +\n      `<div class=\"offer-msg\">\u6574\u9996\u6B4C\u4E00\u5F20\u7EB8\u3002\u7EB8\u8D8A\u5927\u4E00\u884C\u653E\u7684\u5C0F\u8282\u8D8A\u591A\uFF1B\u5C4F\u5E55\u653E\u5F97\u4E0B\u5C31\u7167\u7EB8\u6392\u3002\u4E0D\u6253\u5370\u7684\u65F6\u5019\u4E0D\u5206\u9875\u3002</div>` +\n      `<div class=\"part-sec\">\u7248\u5F0F</div><div class=\"set-row\">` +\n      DENSITIES.map((z) => `<button class=\"btn cand${densityOf(p) === z.id ? \" is-on\" : \"\"}\" data-v=\"density:${z.id}\">${z.label}<small>${z.note}</small></button>`).join(\"\") + `</div>` +\n      `<div class=\"offer-msg\">\u7D27\u51D1 = \u8C31\u5C0F\u4E00\u53F7\u3001\u884C\u8DDD\u548C\u8C31\u8DDD\u6536\u7D27\u3001\u6CA1\u5199\u6B4C\u8BCD\u7684\u58F0\u90E8\u4E0D\u7559\u6B4C\u8BCD\u4F4D\u3002\u5B58\u8FDB MusicXML \u7684 scaling \u548C\u884C\u8DDD\uFF0C\u522B\u7684\u8F6F\u4EF6\u6253\u5F00\u4E5F\u4E00\u6837\u3002</div>` +\n      `<div class=\"part-sec\">\u7EB8\uFF08\u66F2\u6BB5\uFF09</div>` + D.st.song.papers.map((pp, k) => `<div class=\"set-row paper-row\"><span class=\"paper-row-name\">${k + 1}. ${esc(pp.name || \"\uFF08\u6CA1\u540D\u5B57\uFF09\")}${pp.hidden ? \"\uFF08\u9690\u85CF \u00B7 \u4E0D\u653E\uFF09\" : \"\"}${pp.id === D.st.at.paper ? \" \u2190\" : \"\"}</span>` +\n        `<button class=\"btn\" data-v=\"pm:${esc(pp.id)}\" title=\"\u8FD9\u5F20\u7EB8\u7684\u83DC\u5355\uFF1A\u6539\u540D / \u632A / \u52A0\u58F0\u90E8 / \u5220\">\u22EF</button></div>`).join(\"\") +\n      `<div class=\"set-row\"><button class=\"btn\" data-v=\"addpaper\">\uFF0B \u65B0\u7684\u7EB8\uFF08\u63A5\u5728\u6700\u540E\uFF09</button></div>` +\n      // \u53EA\u770B\u4E00\u53F7\u8F68\uFF08v0.9.29\uFF1Buser 2026-10-10\u300C\u7136\u540E\u89C6\u56FE\u52A0\u4E00\u4E2A\u53EA\u770B\u4E00\u53F7\u8F68\u7684\u529F\u80FD\u300D\uFF09\uFF1A= \u5168\u66F2\u7B2C\u4E00\u4F4D\u6B4C\u624B\u7684\u300C\u53EA\u770B\u5B83\u300D\uFF08\u901F\u5EA6 / \u98CE\u683C / \u53CD\u590D\u5199\u5728\u6BCF\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4F4D\u8EAB\u4E0A\uFF09\uFF1B\u548C\u6B4C\u624B\u724C\u90A3\u4E2A\u662F\u540C\u4E00\u4E2A\u5F00\u5173\n      ((one) => `<div class=\"part-sec\">\u663E\u793A</div><div class=\"set-row\"><button class=\"btn cand${one && pv(one.id).only && D.st.song.parts.every((q) => q === one || !pv(q.id).only) ? \" is-on\" : \"\"}\" data-v=\"only1\">\u53EA\u770B\u4E00\u53F7\u8F68<small>\u53EA\u770B\u300C${esc(partLabels(D.st.song, D.extras)[0] ?? \"\")}\u300D\uFF08\u901F\u5EA6\u3001\u98CE\u683C\u3001\u53CD\u590D\u5199\u5728\u6700\u4E0A\u9762\u90A3\u4F4D\u8EAB\u4E0A\uFF09\uFF1B\u518D\u70B9 = \u90FD\u770B</small></button></div>`)(D.st.song.parts[0]) +\n      `<div class=\"part-sec\">\u6392\u6CD5</div><div class=\"set-row\">` +\n      `<button class=\"btn cand${pageFlow || scrollFlow ? \"\" : \" is-on\"}\" data-v=\"flow:cont\">\u8FDE\u7EED<small>\u4E0D\u65AD\u9875\uFF0C\u6BCF\u4E00\u884C\u548C\u5206\u9875\u4E00\u6837</small></button>` +\n      `<button class=\"btn cand${pageFlow && !scrollFlow ? \" is-on\" : \"\"}\" data-v=\"flow:pages\">\u5206\u9875<small>\u6309\u7EB8\uFF08A4 / A5\uFF09\u7684\u771F\u5B9E\u9AD8\u5EA6\u65AD\u9875\uFF0C\u9884\u89C8\u6253\u5370</small></button>` +\n      `<button class=\"btn cand${scrollFlow ? \" is-on\" : \"\"}\" data-v=\"flow:scroll\">\u6A2A\u5377<small>\u6BCF\u5F20\u7EB8\u4E00\u884C\u3001\u4E00\u76F4\u5F80\u53F3\uFF0C\u6A2A\u7740\u6EDA\uFF1B\u6B4C\u624B\u540D\u9489\u5728\u5DE6\u8FB9</small></button></div>` +\n      `<div class=\"part-sec\">\u5C0F\u8282\u53F7</div><div class=\"set-row\">` +\n      `<button class=\"btn cand${D.st.song.barNumbers === \"off\" ? \"\" : \" is-on\"}\" data-v=\"bn:on\">\u6BCF\u884C\u5F00\u5934<small>\u6BCF\u884C\u6700\u4E0A\u9762\u90A3\u6761\u8C31\u7684\u5DE6\u4E0A\u89D2\uFF0C\u5C0F\u5B57\uFF1B\u6BCF\u5F20\u7EB8\u4ECE 1 \u6570\uFF0C\u5F31\u8D77\u7B97 0</small></button>` +\n      `<button class=\"btn cand${D.st.song.barNumbers === \"off\" ? \" is-on\" : \"\"}\" data-v=\"bn:off\">\u4E0D\u5370</button></div>` +\n      `<div class=\"part-sec\">\u6B4C\u8BCD</div><div class=\"set-row\">` +\n      `<button class=\"btn cand${D.st.song.lyricFit === \"lyrics\" ? \"\" : \" is-on\"}\" data-v=\"lyr:rhythm\">\u6309\u8282\u594F<small>\u97F3\u7684\u4F4D\u7F6E\u53EA\u770B\u65F6\u503C\uFF0C\u6253\u5B57\u65F6\u97F3\u7B26\u4E0D\u52A8\uFF1B\u6B4C\u8BCD\u8BA9\u8DEF\uFF1A\u501F\u65C1\u8FB9\u7684\u7A7A \u2192 \u5C0F\u4E00\u53F7 \u2192 \u4E0A\u4E0B\u9519\u5F00 \u2192 \u8FD8\u653E\u4E0D\u4E0B\u753B\u7070</small></button>` +\n      `<button class=\"btn cand${D.st.song.lyricFit === \"lyrics\" ? \" is-on\" : \"\"}\" data-v=\"lyr:lyrics\">\u6309\u6B4C\u8BCD<small>\u957F\u7684\u5B57\u628A\u97F3\u63A8\u5F00\uFF08\u51FA\u7248\u8C31\u7684\u8001\u89C4\u77E9\uFF09</small></button></div>` +\n      `<div class=\"part-sec\">\u5C4F\u5E55\u653E\u4E0D\u4E0B\u7EB8\u7684\u65F6\u5019</div><div class=\"set-row\">` +\n      `<button class=\"btn cand${reflow ? \"\" : \" is-on\"}\" data-v=\"fit\">\u4E0D\u6298\u884C<small>\u6574\u5F20\u7EB8\u7F29\u5C0F\uFF0C\u884C\u548C\u7EB8\u4E0A\u4E00\u6837</small></button>` +\n      `<button class=\"btn cand${reflow ? \" is-on\" : \"\"}\" data-v=\"reflow\">\u6298\u884C<small>\u6309\u5C4F\u5E55\u5BBD\u6392\uFF0C\u8C31\u5927\u4E00\u70B9</small></button></div>` +\n      `<div class=\"offer-msg\">\u4EE5\u540E\u63D2\u56FE\u7247\u4E5F\u5728\u8FD9\u91CC\u3002</div>` +\n      `<div class=\"offer-btns\"><button class=\"btn primary\" data-v=\"close\">\u597D</button></div></div>`;\n  };\n  draw();\n  document.body.append(box);\n  const close = () => { box.remove(); ui.closed(close); scoreEl.focus(); };\n  ui.open({ k: \"sheet\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"close\") { close(); return; }\n    if (v && (PAPER_KINDS as string[]).includes(v)) { update(setPaper(D.st, v as PaperKind)); draw(); }\n    else if (v?.startsWith(\"density:\")) { update(setDensity(D.st, v.slice(8) as Density)); draw(); }\n    else if (v === \"addpaper\") { close(); update(addPaper(D.st)); info(\"\u65B0\u7684\u4E00\u5F20\u7EB8\"); }\n    else if (v?.startsWith(\"pm:\")) { close(); openPaperMenu(v.slice(3)); }\n    else if (v === \"fit\" || v === \"reflow\") { reflow = v === \"reflow\"; view.render(); draw(); }\n    else if (v === \"bn:on\" || v === \"bn:off\") { update(setBarNumbers(D.st, v === \"bn:on\")); draw(); }   // \u5C0F\u8282\u53F7\uFF08v0.9.42\uFF09\uFF1A\u8FDB\u6B4C\u91CC\u3001\u80FD\u64A4\u9500\uFF1BPDF \u8DDF\u7740\n    else if (v === \"lyr:lyrics\" || v === \"lyr:rhythm\") { update(setLyricFit(D.st, v === \"lyr:rhythm\" ? \"rhythm\" : \"lyrics\")); draw(); }   // \u6B4C\u8BCD\u600E\u4E48\u6392\uFF08v0.9.40\uFF09\uFF1A\u8FDB\u6B4C\u91CC\u3001\u80FD\u64A4\u9500\uFF1BPDF \u8DDF\u7740\n    else if (v === \"flow:cont\" || v === \"flow:pages\" || v === \"flow:scroll\") { pageFlow = v === \"flow:pages\"; scrollFlow = v === \"flow:scroll\"; view.render(); view.followNow(); draw(); }\n    else if (v === \"scope:all\" || v === \"scope:segment\") { viewScope = v === \"scope:all\" ? \"all\" : \"segment\"; view.render(); draw(); }\n    else if (v === \"only1\") {\n      const one = D.st.song.parts[0]; if (!one) return;\n      const on = pv(one.id).only && D.st.song.parts.every((q) => q === one || !pv(q.id).only);\n      for (const q of D.st.song.parts) setPv(q.id, { only: !on && q === one });\n      afterViewChange(); draw();\n    }\n  });\n}\n/** \u89D2\u8272\u5361\uFF08\u7B2C\u4E00\u884C\u8C31\u53F7\u5DE6\u8FB9\u7684\u89D2\u8272\u540D\uFF09\u70B9\u5F00\uFF08user\u300C\u6B4C\u624B\u724C\u540C\u610F\uFF0C\u548C\u6253\u8C31\u8F6F\u4EF6\u5BF9\u9F50\u300D\u2192\u300C\u8C31\u4E0A\u9762\u663E\u793A\u7684\u4E0D\u5E94\u8DDF\u662F\u6708\u8BFB\uFF0C\u800C\u662F\u4EBA\u58F0\uFF0C\u5973\u58F0 lead bass violin\u4E4B\u7C7B\u529F\u80FD\u7684\u4E1C\u897F\u2026\n *  \u6240\u4EE5\u662F\u4F60\u53EF\u4EE5\u5199\u6216\u8005\u9009role\u7684\u540D\u5B57\uFF0C\u5E2E\u6211\u591A\u60F3\u51E0\u4E2Apreset\u3002\u7136\u540E\u540D\u5B57\u4E4B\u5916\u518D\u9009\u4E50\u5668\u300D\uFF09\uFF1A\n *  \u4E0A = \u89D2\u8272\u540D\uFF08\u8C31\u4E0A\u5199\u7684\u3001MusicXML <part-name>\uFF1B\u5199\u6216\u8005\u70B9\u9884\u8BBE\uFF09\uFF0C\u4E2D = \u8C01\u6765\u6F14\uFF08\u4E50\u5668 = \u5019\u9009\uFF0C\u540D\u5B57\u4E0D\u4E0A\u8C31\u2014\u2014\u7A84\u63A5\u53E3\uFF09\uFF0C\u4E0B = \u5C31\u5730\u6539\u5B83\u7684\u8BBE\u7F6E\u3002\u6539\u4E86\u7ACB\u523B\u751F\u6548\u3002\n *  \u73B0\u5728\u4E00\u4E2A\u58F0\u90E8\u3001\u4E50\u5668\u53EA\u6709\u6708\u8BFB\uFF08\u5B8C\u6574 / \u8F7B\u91CF\uFF09= \u591A\u4E50\u5668\u7684\u5360\u4F4D\uFF08\u6570\u636E\u5951\u7EA6\u300C\u6BCF\u4E2A\u58F0\u90E8\u5728\u8C31\u53F7\u524D\u9762\u9009\u89D2\u8272\u548C\u9EA6\u514B\u98CE\u300D\uFF09\u3002 */\nconst HUMS: [Hum, string][] = [[\"n\", \"\u3093 / \u55EF\"], [\"a\", \"\u3042 / \u554A\"], [\"o\", \"\u304A / \u54E6\"], [\"u\", \"\u3046 / \u545C\"], [\"la\", \"\u3089 / \u5566\"]];\n/** \u8981\u753B\u7684\u58F0\u90E8\uFF1A\u8C31\u4E0A\u5199\u89D2\u8272\u540D\uFF08\u540C\u540D\u540C\u79CD\u5E26\u53F7\uFF09\u3001\u6CA1\u4EBA\u4E0A\u573A\u7684\u753B\u6DE1\u8272\u3001\u7B2C\u4E00\u4E2A\u58F0\u90E8\u4E0A\u9762\u753B\u901F\u5EA6\uFF1B\u9690\u85CF\u7684\u7F29\u6210\u7EC6\u884C\uFF1B\u540D\u5B57\u4E0B\u9762\u6253\u51FA\u58F0 / \u663E\u793A\u7684\u89D2\u6807\u3002 */\n/** \u6BCF\u4E2A\u58F0\u90E8\u5531\u4E0D\u51FA\u6765\u7684\u6B4C\u8BCD\uFF08token id \u2192 \u4E3A\u4EC0\u4E48\uFF1B\u7EAA\u5F8B\u300C\u505A\u4E0D\u5230\u7684\u4E00\u5F8B\u753B\u7070 + \u660E\u8BF4\u300D\uFF09\u3002\u6309\u6B4C + \u4F11\u606F\u5BA4\u7F13\u5B58\uFF08\u6BCF\u6B21\u91CD\u753B\u90FD\u8981\uFF0C\u522B\u6BCF\u6B21\u91CD\u7B97\uFF09\u3002 */\nlet lyricMuteKey: unknown[] = [], lyricMuteVal = new Map<string, Map<number, LyricIssue>>();\nfunction lyricMutes(): Map<string, Map<number, LyricIssue>> {\n  if (lyricMuteKey[0] === D.st.song && lyricMuteKey[1] === D.extras) return lyricMuteVal;\n  const out = new Map<string, Map<number, LyricIssue>>();\n  const order = songPlayOrder(D.st.song), map = timeMapOf(D.st.song, order);\n  for (const p of D.st.song.parts) {\n    const eng = activeInstrument(D.extras, p.role)?.engine ?? null, mode = activeSingChunk(D.extras, p.role), m = new Map<number, LyricIssue>();\n    // \u8BED\u8A00 = \u5C0F\u6708\u76F8\u5531\u7684\u90A3\u4E00\u6BB5\u7684\u8BED\u8A00\uFF0C\u548C\u5531\u7684\u65F6\u5019\u540C\u4E00\u4EFD\uFF08sungPlan\uFF1A\u6309\u7F16\u6392\u538B\u5E73 + \u901F\u5EA6\u8868 + \u8FD9\u4F4D\u7684\u5206\u6BB5\u5531\u8BBE\u7F6E\uFF09\uFF1B\u7F16\u6392\u6CA1\u70B9\u5230 / \u9690\u85CF\u7684\u7EB8\u538B\u4E0D\u8FDB\u6765 = \u90A3\u5F20\u7EB8\u81EA\u5DF1\u7B97\uFF08\u6CA1\u901F\u5EA6\u8868\uFF0C\u6BB5\u754C\u53EA\u5DEE\u5728\u5361\u7740 0.25 s \u7684\u4F11\u6B62\u4E0A\uFF09\n    const flat = flattenPart(D.st.song, p.id, { order }), fl = sungPlan(flat.tokens, map, flat.starts.map((s) => s.index), mode, D.st.song.hum).at, byId = new Map(flat.tokens.map((t, i) => [t.id, fl[i]]));\n    for (const paper of D.st.song.papers) {\n      const toks = paper.tracks[p.id]; if (!toks) continue;\n      const own = toks.some((t) => !byId.has(t.id)) ? sungPlan(toks, undefined, [], mode, D.st.song.hum).at : null;\n      for (const [i, x] of lyricIssues(toks, performerOf(eng)?.lyrics ?? null, (i) => byId.get(toks[i].id) ?? own![i])) m.set(toks[i].id, x);\n    }\n    out.set(p.id, m);\n  }\n  lyricMuteKey = [D.st.song, D.extras]; lyricMuteVal = out;\n  return out;\n}\n/** \u5149\u6807\u6240\u5728\u58F0\u90E8\u3001\u4E0B\u6807 i \u90A3\u4E2A\u97F3\u7684\u6B4C\u8BCD\u5531\u4E0D\u51FA\u6765\u7684\u90A3\u53E5\u8BDD\uFF08\u6B4C\u8BCD\u6846\u5E95\u4E0B\u7684\u63D0\u793A\uFF09\uFF1B\u5531\u5F97\u51FA\u6765 = null\u3002 */\nfunction lyricHintAt(i: number): string | null {\n  const t = tr(D.st)[i], p = D.st.song.parts.find((x) => x.id === D.st.at.part); if (!t || !p) return null;\n  const x = lyricMutes().get(p.id)?.get(t.id); if (!x) return null;\n  return lyricWhyText(x, roleName(D.extras, p.role));\n}\n// \u2500\u2500 \u6B4C\u8BCD\u65C1\u663E\u793A\u5F15\u64CE\u5FF5\u6210\u4EC0\u4E48\uFF08v0.9.34\uFF0C2026-10-10 Opus 5.5\uFF1Buser\u300C\u5C0F\u4EF6\u505A\u300D\uFF0CAI \u63D0\u7684\u300C\u6B4C\u8BCD\u6846 / \u6B4C\u624B\u724C\u91CC\u663E\u793A\u5F15\u64CE\u5FF5\u6210\u4EC0\u4E48\u300D\uFF09\uFF1A\n//    \u5168\u5047\u540D\u65F6\u65E5\u8BED\u524D\u7AEF\u4F1A\u628A\u52A9\u8BCD \u306F \u6CE8\u6210 ha\uFF08\u56E2\u5B50 B\u300C\u3068\u3057\u3088\u308A\u3060\u3093\u3054\u306F\u3081\u3092\u300D= ha-me\uFF09\uFF0Cuser \u4E0D\u61C2\u65E5\u8BED\u770B\u4E0D\u51FA\u6765\uFF0C\u770B\u5F97\u89C1\u624D\u80FD\u81EA\u5DF1\u6539\u6210 \u308F\u3002\n//    \u8BFB\u97F3 = \u5531\u7684\u65F6\u5019\u540C\u4E00\u4EFD\u7B2C 1 \u6B65\uFF08sing-core readingCore\uFF09\uFF0C\u6309\u8FD9\u4E00\u53E5\u7684\u5531\u8C31\u5185\u5BB9\u7F13\u5B58\uFF1B\u53EA\u5728\u6708\u8BFB\u4E0A\u573A\u3001\u5F15\u64CE\u5DF2\u7ECF\u8D77\u6765\u65F6\u6709\uFF08\u4E0D\u4E3A\u770B\u8BFB\u97F3\u8D77\u5F15\u64CE\u3001\u4E0B\u6A21\u578B\uFF09\u3002\nlet readPlans: { song: Song; part: string; view?: ChunkPlan[]; segment?: ChunkPlan[] } | null = null;\nconst readings = new Map<string, Reading>(), readAsked = new Set<string>(); let readRetryAt = 0;\nfunction readPlanOf(tokId: number, part: PartDef): ChunkPlan | null {\n  if (!readPlans || readPlans.song !== D.st.song || readPlans.part !== part.id) readPlans = { song: D.st.song, part: part.id };\n  for (const scope of [\"view\", \"segment\"] as const) {   // \u653E\u7684\u65F6\u5019\u90A3\u4E00\u53E5\uFF08\u89C6\u56FE / \u7F16\u6392\uFF09\uFF1B\u4E0D\u5728\u91CC\u9762\uFF08\u7F16\u6392\u6CA1\u70B9\u5230\u8FD9\u5F20\u7EB8\uFF09= \u8FD9\u5F20\u7EB8\u5355\u72EC\n    const chunks = (readPlans[scope] ??= ((song) => buildTimeline({ song, order: songPlayOrder(song), parts: [part], info: performerInfo, hum: D.st.song.hum, singOpt: humOpt() }).chunks)(songIn(scope)));\n    const plan = chunks.find((c) => c.entryOf.has(tokId)); if (plan) return plan;\n  }\n  return null;\n}\nfunction lyricReadingAt(i: number): LyricReading | null {\n  const t = tr(D.st)[i], part = D.st.song.parts.find((x) => x.id === D.st.at.part);\n  if (!t || t.kind !== \"note\" || !part || performerOf(engineNow())?.lyrics !== \"words\") return null;   // \u53EA\u6709\u5531\u5B57\u7684\u90A3\u4F4D\u624D\u6709\u300C\u5FF5\u6210\u4EC0\u4E48\u300D\n  const plan = readPlanOf(t.id, part); if (!plan) return null;\n  const s = plan.score, key = `${s.LANG}|${s.TEXT}|${s.SCORE.map((e) => e.kana).join(\" \")}`, r = readings.get(key);\n  if (!r) {\n    if (!readAsked.has(key) && performance.now() >= readRetryAt) {\n      readAsked.add(key);\n      void singer.read(s).then((x) => { if (x.ready) { readings.set(key, x); if (readings.size > 200) readings.delete(readings.keys().next().value!); } else readRetryAt = performance.now() + 3000; })\n        .catch(() => undefined).finally(() => { readAsked.delete(key); view.lyrics.reposition(); });\n    }\n    return null;\n  }\n  const parts = (r.labels ?? r.said).map((x) => prettyReading(s.LANG, x));\n  if (!r.labels) return { parts, at: -1, note: `\u5C0F\u6708\u76F8\u5FF5\u51FA\u6765 ${r.said.length} \u4E2A\u97F3\u8282\u3001\u8C31\u4E0A ${s.SCORE.length} \u4E2A\uFF0C\u5BF9\u4E0D\u4E0A\uFF08\u5531\u7684\u65F6\u5019\u4F1A\u62A5\u9519\uFF09\uFF1A` };\n  return { parts, at: plan.entryOf.get(t.id) ?? -1, note: s.LANG === \"zh\" ? \"\u5C0F\u6708\u76F8\u5FF5\u6210\uFF08\u97F3\u7D20 + \u58F0\u8C03\uFF09\uFF1A\" : \"\u5C0F\u6708\u76F8\u5FF5\u6210\uFF1A\" };\n}\n/** \u6BCF\u4F4D\u6B4C\u624B\u7684\u7C7B\u522B\u8272\uFF08tab20 \u4E0B\u6807\uFF09\u548C\u8C31\u524D\u7B80\u5199\uFF08v0.9.31\uFF1Buser\u300C\u4E50\u624B\u540D\u548C\u989C\u8272\u540C\u610F\u300D\uFF09\u3002\u7B80\u5199\u8981\u76EE\u5F55\uFF08\u4ED3\u9F20 v12 \u7684 abbr\uFF09\uFF1A\u6CA1\u8F7D\u5C31\u5148\u7F29\u540D\u5B57\uFF0C\u8F7D\u597D\u4E86\u91CD\u753B\u3002 */\nfunction partLooks(): { colors: number[]; abbrs: string[] } {\n  const labels = partLabels(D.st.song, D.extras), sounds = D.st.song.parts.map((p) => roleSound(D.extras, p.role));\n  const colors = partColorIndices(sounds);\n  const needCat = !catalogNow && D.st.song.parts.some((p) => !!(D.extras.lounge[p.role] as { concept?: unknown } | undefined)?.concept);\n  if (needCat) void loadCatalog(new URL(import.meta.url)).then((c) => { catalogNow = c; view.render(); }).catch(() => undefined);\n  const abbrs = D.st.song.parts.map((p, k) => {\n    const ids = (D.extras.lounge[p.role] as { concept?: { ids?: { wikidata?: string | null; local?: string | null } } } | undefined)?.concept?.ids;\n    const c = catalogNow && ids ? (ids.wikidata ? catalogNow.byId.get(ids.wikidata) : undefined) ?? (ids.local ? catalogNow.byId.get(ids.local) ?? catalogNow.byId.get(`x:${ids.local}`) : undefined) : undefined;\n    return partAbbr(labels[k], { ...(c ? { conceptNames: [c.names.en, c.names.zh], ...(c.abbr?.en ? { conceptAbbr: c.abbr.en } : {}) } : {}), voice: sounds[k].startsWith(\"voice.\") });\n  });\n  return { colors, abbrs };\n}\nfunction partViews(): PartView[] {\n  const labels = partLabels(D.st.song, D.extras), mutes = lyricMutes(), looks = partLooks();\n  return D.st.song.parts.map((p, k) => {\n    const v = pv(p.id), badges = [v.muted ? \"\u9759\u97F3\" : \"\", v.solo ? \"\u72EC\u594F\" : \"\", v.only ? \"\u53EA\u770B\u5B83\" : \"\", issueParts.has(p.id) ? \"\u4E0D\u51FA\u58F0\" : \"\"].filter(Boolean);   // \u4E0D\u51FA\u58F0 = \u6E05\u5355\u91CC\u6709\u5B83\uFF08\u00A72.2\u00BD \u51FA\u53E3 \u2460\uFF09\n    const eng = activeInstrument(D.extras, p.role)?.engine ?? \"unknown\", plug = performerOf(eng);\n    const lm = mutes.get(p.id);\n    // \u53F0\u4E0A\u8FD9\u4F4D\u4E0D\u5531\u5B57\uFF08\u4E50\u5668 / \u5143\u97F3\u7248\uFF09\uFF1A\u8C31\u4E0B\u7A7A\u7740\u7684\u6B4C\u8BCD\u4F4D\u70B9\u4E86\u4E0D\u5F00\u6846\uFF08user 2026-10-10\u300Cwishlist \u4E0D\u652F\u6301\u5531\u6B4C\u7684track\u53EF\u4EE5\u5220\u6B4C\u8BCD\uFF0C\u4F46\u662F\u4E0D\u4F1A\u8BEF\u70B9\u521B\u5EFA\u6B4C\u8BCD\u6587\u672C\u6846\u300D\uFF09\uFF1B\u6CA1\u4EBA\u4E0A\u573A\u7684\u7167\u65E7\u80FD\u5199\uFF08\u591A\u534A\u7B49\u7740\u8BF7\u6708\u8BFB\uFF09\n    const ly = plug?.lyrics, noLyrics = ly === \"hum\" || ly === \"none\" ? `${labels[k]}${ly === \"hum\" ? \"\uFF08\u5143\u97F3\u7248\uFF09\u53EA\u54FC\" : \"\u4E0D\u5531\u6B4C\u8BCD\"}\uFF1A\u7A7A\u7740\u7684\u6B4C\u8BCD\u4F4D\u4E0D\u5F00\u6846\uFF1B\u5DF2\u7ECF\u5199\u4E86\u7684\u5B57\u70B9\u5F00\u80FD\u6539\u3001\u80FD\u5220` : \"\";\n    return { ...(noLyrics ? { noLyrics } : {}), ...(lm && lm.size ? { lyricMute: new Set(lm.keys()) } : {}), id: p.id, name: labels[k], abbr: looks.abbrs[k], colorIdx: looks.colors[k], empty: !plug, first: k === 0, ...(p.clef ? { clef: p.clef } : {}), ...(p.staves === 2 ? { staves: 2 as const } : {}), hidden: !isShown(p.id), badges, mono: !plug?.poly, ...(plug?.notation?.({ extras: D.extras, role: p.role }) ?? {}), ignores: ignoredFor(p.role) };   // xHead = \u53F0\u4E0A\u90A3\u4F4D\u56FA\u5B9A\u6572\u4E00\u4E2A\u952E\uFF08\u9F13\u4EF6 / \u97F3\u6548\u56FA\u5B9A\u539F\u901F\uFF09\u2192 \u8C31\u4E0A\u753B \u00D7\uFF1Bperc = \u9F13 / \u97F3\u6548 \u2192 \u9F13\u8C31\uFF08\u4E00\u7EBF\u8C31 / \u4E94\u7EBF\u9F13\u8C31\uFF0Cv0.10.27\uFF0C\u6709 perc \u65F6\u7B26\u5934\u6309\u4ED3\u9F20\u7684\u8868\u3001\u4E0D\u753B \u00D7\uFF09\n  });\n}\n/** \u663E\u793A\u72B6\u6001\u53D8\u4E86\uFF1A\u5149\u6807\u6240\u5728\u7684\u58F0\u90E8\u8981\u662F\u770B\u4E0D\u89C1\u4E86\uFF0C\u632A\u5230\u8FD9\u5F20\u7EB8\u4E0A\u7B2C\u4E00\u4E2A\u770B\u5F97\u89C1\u7684\u58F0\u90E8\u3002 */\nfunction afterViewChange(): void {\n  pushChannels();              // \u9759\u97F3 / \u72EC\u594F\u9A6C\u4E0A\u8FDB\u5F55\u97F3\u623F\uFF08\u63A8\u5B50\u5230\u5E95\u3001\u53D1\u9001\u4E00\u8D77\u505C\uFF1Bv0.10.38\uFF0Cuser\u300C\u6211mute\u4E86\u4E4B\u540E\u5B83\u7684reverb\u4E3A\u4EC0\u4E48\u8FD8\u662F\u8FDB\u4E86reverb\u8F68\uFF1F\u300D\uFF09\n  schedulePlaybackRefresh();   // \u9759\u97F3 / \u72EC\u594F / \u9690\u85CF\u53D8\u4E86\uFF1A\u653E\u7740\u7684\u65F6\u5019\u65F6\u95F4\u7EBF\u91CD\u7B97\uFF08\u89E3\u9664\u9759\u97F3\u7684\u90A3\u4F4D\u4E5F\u56DE\u6765\uFF09\n  if (!isShown(D.st.at.part)) {\n    const paper = D.st.song.papers.find((pp) => pp.id === D.st.at.paper), to = D.st.song.parts.find((p) => isShown(p.id) && paper?.tracks[p.id]);\n    if (to) update(setFocus(D.st, D.st.at.paper, to.id));\n  }\n  view.render();\n}\n/** \u6B4C\u540D\u5DE6\u8FB9\u300C\u2039 \u203A\u300D\uFF1A\u8DF3\u5230\u4E0A\u4E00\u5F20 / \u4E0B\u4E00\u5F20\u7EB8\uFF08\u5149\u6807\u8DDF\u7740\u8FC7\u53BB\uFF0C\u89C6\u56FE\u6EDA\u5230\u5B83\uFF09\u3002 */\nfunction navPaper(dir: -1 | 1): void { navPaperFrom(D.st.at.paper, dir); }\n/** \u4ECE\u67D0\u5F20\u7EB8\u5F80\u524D / \u5F80\u540E\u8DF3\uFF08\u6BCF\u5F20\u7EB8\u81EA\u5DF1\u7684\u66F2\u6BB5\u63A7\u4EF6\uFF1B\u5149\u6807\u8DDF\u7740\u8FC7\u53BB\uFF09\u3002 */\nfunction navPaperFrom(from: string, dir: -1 | 1): void {\n  const k = D.st.song.papers.findIndex((p) => p.id === from), to = D.st.song.papers[k + dir]; if (to) navPaperTo(to.id);\n}\nfunction navPaperTo(id: string): void {\n  const to = D.st.song.papers.find((p) => p.id === id); if (!to) return;\n  const part = to.tracks[D.st.at.part] ? D.st.at.part : D.st.song.parts.find((p) => to.tracks[p.id])?.id ?? D.st.at.part;\n  update(setFocus(D.st, to.id, part));\n  jumpPlaybackToPaper(id);\n}\n/** \u65B0\u6B4C\u624B\uFF08\u58F0\u90E8\u5C31\u662F\u6B4C\u624B\uFF1B2026-10-08 user\u300C\u55EF\u58F0\u90E8\u5C31\u662F\u6B4C\u624B\u300D\uFF09\uFF1A\u4F11\u606F\u5BA4\u91CC\u5EFA\u4E00\u4EFD\u9ED8\u8BA4\u89D2\u8272\uFF08\u6708\u8BFB\u4E24\u4E2A\u5019\u9009\uFF09+ \u5F55\u97F3\u623F\u4E00\u4E2A\u9EA6\u514B\u98CE\uFF08\u6B4C\u624B\u8BA4\u9886\u9EA6\u514B\u98CE\uFF09\u3002\n *  \u53EA\u5728 paper \u8FD9\u5F20\u7EB8\u4E0A\u7ED9\u5B83\u4E00\u884C\uFF08user\u300C\u65B0\u6B4C\u624B\u53EA\u51FA\u73B0\u5728\u5F53\u524D\u8FD9\u5F20\u7EB8\u55EF\u300D\uFF09\uFF1BgiveFrom = \u300C\u4EA4\u7ED9\u65B0\u6B4C\u624B\u300D\uFF1A\u8FD9\u5F20\u7EB8\u4E0A giveFrom \u90A3\u4E00\u884C\u76F4\u63A5\u4EA4\u7ED9\u5B83\uFF08\u4E0D\u53E6\u8D77\u7A7A\u884C\uFF09\u3002\n *  \u5149\u6807\u8DF3\u8FC7\u53BB\u3001\u5F00\u5B83\u7684\u4E50\u5668\u9875\u6311\u4E50\u5668\u3002 */\nfunction addNewPart(paper = D.st.at.paper, giveFrom?: string): void {\n  const role = newRoleId(D.extras, D.st.song), mic = newMicId(D.extras, D.st.song);\n  const id = `P${Math.max(0, ...D.st.song.parts.map((p) => Number(/^P(\\d+)$/.exec(p.id)?.[1] ?? 0))) + 1}`;\n  let next = addPart(D.st, { id, role, mic }, giveFrom ? null : paper);\n  if (giveFrom) next = rebindTrack(next, paper, giveFrom, id);\n  updateBoth(next, withNewRole(D.extras, role, D.st.song.hum), { kind: \"score\", label: giveFrom ? \"\u8FD9\u4E00\u884C\u4EA4\u7ED9\u4E86\u65B0\u6B4C\u624B\" : \"\u52A0\u4E86\u4E00\u4F4D\u6B4C\u624B\" });\n  renderTitle();\n  openInstPage();   // \u65B0\u6B4C\u624B\uFF1A\u5148\u7ED9\u5B83\u6311\u4E50\u5668\n}\n/** \u7EB8\u7684\u83DC\u5355\uFF08\u7EB8\u9876\u300C\u22EF\u300D\uFF09\uFF1A\u6539\u66F2\u6BB5\u540D\u3001\u632A\u3001\u5728\u540E\u9762\u52A0\u4E00\u5F20\u3001\u8FD9\u5F20\u7EB8\u4E0A\u52A0 / \u4E0D\u52A0\u67D0\u4E2A\u58F0\u90E8\u3001\u5220\u8FD9\u5F20\u7EB8\u3002 */\nfunction openPaperMenu(id: string): void {\n  ui.close();\n  const paper = D.st.song.papers.find((p) => p.id === id); if (!paper) return;\n  const k = D.st.song.papers.indexOf(paper), labels = partLabels(D.st.song, D.extras);\n  const absent = D.st.song.parts.flatMap((p, i) => (paper.tracks[p.id] ? [] : [{ id: p.id, name: labels[i] }]));\n  const box = document.createElement(\"div\");\n  box.className = \"offer\";\n  box.innerHTML = `<div class=\"offer-card settings-card\"><div class=\"offer-title\">${esc(paper.name || `\u7B2C ${k + 1} \u5F20\u7EB8`)}</div>` +\n    `<div class=\"set-row\"><button class=\"btn\" data-v=\"name\">\u6539\u66F2\u6BB5\u540D\u2026</button><button class=\"btn\" data-v=\"up\"${k === 0 ? \" disabled\" : \"\"}>\u4E0A\u79FB</button><button class=\"btn\" data-v=\"down\"${k === D.st.song.papers.length - 1 ? \" disabled\" : \"\"}>\u4E0B\u79FB</button><button class=\"btn\" data-v=\"add\">\u5728\u5B83\u540E\u9762\u52A0\u4E00\u5F20\u7EB8</button><button class=\"btn\" data-v=\"transpose\" title=\"\u8FD9\u5F20\u7EB8 / \u6574\u9996\u6240\u6709\u58F0\u90E8\u4E00\u8D77\u79FB\u8C03\u3001\u8F6C\u8C03\uFF08\u8C03\u53F7\u8DDF\u7740\u632A\uFF09\">\u79FB\u8C03 / \u8F6C\u8C03\u2026</button>` +\n    `<button class=\"btn${paper.hidden ? \" is-on\" : \"\"}\" data-v=\"hide\" title=\"\u9690\u85CF = \u4E0D\u653E\u3001\u4E0D\u8FDB\u538B\u5E73\u4EF6\uFF1B\u8C31\u4E0A\u6298\u53E0\u7740\uFF0C\u7FFB\u9875\u80FD\u8FDB\u53BB\">${paper.hidden ? \"\u663E\u793A\uFF08\u73B0\u5728\u9690\u85CF\u7740\uFF09\" : \"\u9690\u85CF\uFF08\u4E0D\u653E\uFF09\"}</button></div>` +\n    (absent.length ? `<div class=\"part-sec\">\u8FD9\u5F20\u7EB8\u4E0A\u52A0\u6B4C\u624B</div><div class=\"set-row\">${absent.map((a) => `<button class=\"btn cand\" data-v=\"track:${esc(a.id)}\">${esc(a.name)}</button>`).join(\"\")}</div>` : \"\") +\n    `<div class=\"set-row\"><button class=\"btn\" data-v=\"newpart\" title=\"\u65B0\u7684\u4E00\u4F4D\u6B4C\u624B\uFF0C\u53EA\u51FA\u73B0\u5728\u8FD9\u5F20\u7EB8\u4E0A\">\uFF0B \u65B0\u6B4C\u624B\u2026</button>${D.st.song.papers.length > 1 ? `<button class=\"btn cand danger\" data-v=\"del\">\u5220\u8FD9\u5F20\u7EB8\u2026</button>` : \"\"}</div>` +\n    `<div class=\"offer-msg\">\u7EB8 = \u66F2\u6BB5\uFF1A\u6BCF\u5F20\u7EB8\u662F\u4E00\u4E2A\u65B0\u7684\u5F00\u59CB\uFF0C\u5404\u58F0\u90E8\u5728\u8FD9\u91CC\u91CD\u65B0\u5BF9\u9F50\uFF1B\u4E00\u5F20\u7EB8\u4E0A\u8981\u54EA\u4E9B\u58F0\u90E8\u968F\u5B83\u3002</div>` +\n    `<div class=\"offer-btns\"><button class=\"btn primary\" data-v=\"close\">\u597D</button></div></div>`;\n  document.body.append(box);\n  const close = () => { box.remove(); ui.closed(close); scoreEl.focus(); };\n  ui.open({ k: \"menu\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"close\") { close(); return; }\n    if (!v) return;\n    if (v === \"name\") { close(); view.title.openNow(id); return; }\n    if (v === \"up\" || v === \"down\") { update(movePaper(D.st, id, v === \"up\" ? -1 : 1)); close(); return; }\n    if (v === \"add\") { update(addPaper(D.st, id)); close(); info(\"\u65B0\u7684\u4E00\u5F20\u7EB8\"); return; }\n    if (v === \"transpose\") { close(); const r = scoreEl.getBoundingClientRect(); openTransposeMenu(id, { x: r.left + r.width / 2, y: r.top + 60 }); return; }\n    if (v === \"hide\") { update(setPaperHidden(D.st, id, !paper.hidden)); close(); info(paper.hidden ? \"\u8FD9\u5F20\u7EB8\u663E\u793A\u4E86\uFF08\u4F1A\u653E\uFF09\" : \"\u8FD9\u5F20\u7EB8\u9690\u85CF\u4E86\uFF08\u4E0D\u653E\uFF09\"); return; }\n    if (v.startsWith(\"track:\")) { update(addTrack(D.st, id, v.slice(6))); close(); return; }\n    if (v === \"newpart\") { close(); addNewPart(id); return; }\n    if (v === \"del\") {\n      close();\n      void askSheet(`\u5220\u6389\u300C${paper.name || `\u7B2C ${k + 1} \u5F20\u7EB8`}\u300D\uFF1F`, \"\u8FD9\u5F20\u7EB8\u4E0A\u6240\u6709\u58F0\u90E8\u5199\u7684\u4E1C\u897F\u4E00\u8D77\u5220\u6389\uFF08\u80FD\u64A4\u9500\uFF1A\u64A4\u9500 / Ctrl+Z\uFF09\u3002\", \"\u5220\").then((ok) => { if (ok) update(removePaper(D.st, id)); });\n    }\n  });\n}\n// \u2500\u2500 \u58F0\u90E8\u7684\u8BBE\u7F6E\u5206\u4E24\u5904\uFF082026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u6211\u5EFA\u8BAE\u4F60\u628A\u4E50\u5668\u8BBE\u7F6E\u7ED9ux\u5206\u5F00\u6765\uFF0C\u4E50\u5668\u8BBE\u7F6E\u548C\u8F68\u8BBE\u7F6E\u89C6\u89C9\u4E0A\u5206\u5F00\u6765\uFF0C\u7136\u540E\u8FD9\u4E2A\u5F39\u7A97\u5176\u5B9E\u8FD8\u662Fplaceholder\uFF0C\n//    \u597D\u597D\u91CD\u65B0\u8BBE\u8BA1\u4E00\u4E0B\uFF0C\u4EE5\u53CA\u662F\u5426\u662F\u5F39\u7A97\u7684\u6A21\u6001\u3002\u8FD8\u662F\u522B\u7684\u66F4\u597D\uFF1F\u4F60\u5224\u65AD\u4E00\u4E0B\u300D\uFF09\u3002\u5224\u65AD\uFF1A\n//   \u00B7 \u8F68\uFF08\u8FD9\u6761\u8C31\u600E\u4E48\u663E\u793A\u3001\u51FA\u4E0D\u51FA\u58F0\u3001\u51E0\u5F20\u8C31\u8868\uFF09\u8981\u770B\u7740\u8C31\u53D8 \u2192 \u6B4C\u624B\u724C\u65C1\u8FB9\u7684**\u975E\u6A21\u6001\u5C0F\u5361**\uFF0C\u6CA1\u6709\u906E\u7F69\uFF0C\u8C31\u7167\u5E38\u770B\u5F97\u89C1\u3001\u70B9\u5916\u9762\u5C31\u6536\uFF1B\n//   \u00B7 \u4E50\u5668\uFF08\u8FD9\u4E2A\u58F0\u90E8\u662F\u4EC0\u4E48\u3001\u8C01\u6765\u6F14\u3001\u8FD9\u4F4D\u600E\u4E48\u6F14\uFF09\u8981\u8FB9\u6539\u8FB9\u5F39\u7740\u542C \u2192 **\u5168\u5C4F\u4E00\u9875**\uFF0C\u548C\u4E50\u5668\u76EE\u5F55 / \u5F55\u97F3\u5BA4\u4E00\u5BB6\uFF0C\u53F3\u8FB9\u7684 pad \u7559\u7740\u53EA\u5F39\u4E0D\u5199\uFF08\u6A21\u6001\u4F1A\u6321\u4F4F pad\uFF09\u3002\nconst chip = (v: string, label: string, on: boolean, title = \"\") => `<button class=\"btn cand${on ? \" is-on\" : \"\"}\" data-v=\"${esc(v)}\"${title ? ` title=\"${esc(title)}\"` : \"\"}>${label}</button>`;\n/** \u8F68\u7684\u5C0F\u5361\uFF1A\u6328\u7740\u6B4C\u624B\u724C\u5F00\uFF08at = \u6B4C\u624B\u724C\u5728\u5C4F\u5E55\u4E0A\u7684\u6846\uFF1B\u6CA1\u6709 = \u5C4F\u5E55\u4E2D\u95F4\uFF09\u3002 */\nfunction openTrackCard(at?: { left: number; top: number; right: number; bottom: number }): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"track-card\"; box.setAttribute(\"role\", \"dialog\");\n  let page: \"main\" | \"give\" | \"add\" = \"main\";   // give = \u8FD9\u4E00\u884C\u4EA4\u7ED9\u2026\uFF08\u6362\u7ED1\uFF09\uFF1Badd = \u8FD9\u5F20\u7EB8\u4E0A\u52A0\u6B4C\u624B\n  const draw = () => {\n    const me = curPart(), v = pv(me.id), k = D.st.song.parts.indexOf(me), labels = partLabels(D.st.song, D.extras), label = labels[k] ?? \"\";\n    const here = D.st.song.papers.find((p) => p.id === D.st.at.paper)?.tracks ?? {};\n    // \u6362\u7ED1 / \u52A0\u6B4C\u624B\uFF082026-10-08\uFF0Cuser\u300C\u5DF2\u6709\u7684track\u7ED1\u6362\u4E0D\u540C\u7684\u58F0\u90E8\u300D\u300C\u8FD9\u4E00\u6BB5\u4EA4\u7ED9\u522B\u7684\u6B4C\u624B \u5C31\u662F\u6211\u521A\u624D\u8BF4\u7684\u6362\u7ED1\u300D\u300C\u65B0\u6B4C\u624B\u53EA\u51FA\u73B0\u5728\u5F53\u524D\u8FD9\u5F20\u7EB8\u55EF\u300D\uFF09\uFF1A\u53EA\u6539\u8FD9\u4E00\u5F20\u7EB8\n    if (page !== \"main\") {\n      const list = page === \"give\" ? D.st.song.parts.filter((p) => p.id !== me.id) : D.st.song.parts.filter((p) => !here[p.id]);\n      box.innerHTML = `<div class=\"tc-sub\"><button class=\"btn\" data-v=\"back\">\u2039 ${page === \"give\" ? `\u300C${esc(label)}\u300D\u8FD9\u4E00\u884C\u4EA4\u7ED9\u2026` : \"\u8FD9\u5F20\u7EB8\u4E0A\u52A0\u6B4C\u624B\"}</button></div>` +\n        `<div class=\"tc-list\">${list.map((p) => `<button class=\"btn cand\" data-v=\"${page}:${esc(p.id)}\">${esc(labels[D.st.song.parts.indexOf(p)] ?? p.id)}${page === \"give\" && here[p.id] ? \"<small>\uFF08\u5BF9\u8C03\uFF09</small>\" : \"\"}</button>`).join(\"\")}` +\n        `<button class=\"btn cand\" data-v=\"${page}new\">\uFF0B \u65B0\u6B4C\u624B\u2026</button></div>` +\n        `<div class=\"tc-hint\">${page === \"give\" ? \"\u53EA\u6539\u8FD9\u5F20\u7EB8\uFF1A\u97F3\u3001\u6B4C\u8BCD\u3001\u8BB0\u53F7\u90FD\u4E0D\u52A8\uFF0C\u6362\u4E00\u4F4D\u6B4C\u624B\u5531\uFF1B\u8DE8\u7EB8\u6309\u6B4C\u624B\u63A5\u8D77\u6765\u3002\u5BF9\u65B9\u5728\u8FD9\u5F20\u7EB8\u4E0A\u5DF2\u7ECF\u6709\u4E00\u884C = \u4E24\u884C\u5BF9\u8C03\u3002\" : \"\u53EA\u52A0\u5728\u8FD9\u5F20\u7EB8\u4E0A\uFF08\u522B\u7684\u7EB8\u7167\u65E7\uFF09\u3002\"}</div>`;\n      return;\n    }\n    const onPaper = Object.keys(D.st.song.papers.find((p) => p.id === D.st.at.paper)?.tracks ?? {}).length, one = (me.staves ?? 1) === 1;\n    box.innerHTML =\n      `<button class=\"tc-inst\" data-v=\"inst\" title=\"\u8FD9\u4E2A\u58F0\u90E8\u662F\u4EC0\u4E48\u3001\u8C01\u6765\u6F14\u3001\u600E\u4E48\u6F14\uFF08\u5168\u5C4F\u4E00\u9875\uFF0C\u53F3\u8FB9\u7684\u952E\u76D8\u80FD\u8BD5\uFF09\"><span class=\"tc-l\"><b>${esc(label)}</b><small>${((who) => (who ? `${esc(who)} \u5728\u6F14` : \"\u6CA1\u4EBA\u4E0A\u573A\"))(activeCandidateName(D.extras, me.role))}</small></span><span class=\"tc-go\">\u4E50\u5668 \u203A</span></button>` +\n      ((m) => { if (!m || !m.size) return \"\"; const xs = [...m.values()], first = xs[0];   // \u5531\u4E0D\u51FA\u6765\u7684\u6B4C\u8BCD\uFF1A\u51E0\u4E2A\u3001\u4E3A\u4EC0\u4E48\uFF08\u7EAA\u5F8B\uFF1A\u753B\u7070 + \u660E\u8BF4\uFF09\n        return `<div class=\"tc-warn\">${first.why === \"notSung\" ? esc(lyricWhyText(first, roleName(D.extras, me.role))) : `\u6709 ${xs.length} \u4E2A\u5B57\u5531\u4E0D\u51FA\u6765\uFF08\u8C31\u4E0A\u753B\u7070\uFF09\uFF1A${esc(lyricWhyText(first, roleName(D.extras, me.role)))}${xs.some((x) => x.why !== first.why) ? \" \u7B49\" : \"\"}`}</div>`; })(lyricMutes().get(me.id)) +\n      `<div class=\"tc-grid\">` +\n      `<span class=\"tc-k\">\u663E\u793A</span><div class=\"tc-v\">${chip(\"hide\", \"\u9690\u85CF\", v.hidden, \"\u8C31\u4E0A\u7F29\u6210\u4E00\u6761\u7EC6\u884C\uFF08\u70B9\u7EC6\u884C\u518D\u653E\u51FA\u6765\uFF09\uFF1B\u7167\u6837\u51FA\u58F0\")}${chip(\"only\", \"\u53EA\u770B\u5B83\", v.only, \"\u5176\u4F59\u58F0\u90E8\u90FD\u7F29\u6210\u7EC6\u884C\uFF08\u53EF\u4EE5\u51E0\u4E2A\u4E00\u8D77\u300C\u53EA\u770B\u300D\uFF09\")}</div>` +\n      `<span class=\"tc-k\">\u51FA\u58F0</span><div class=\"tc-v\">${chip(\"mute\", \"\u9759\u97F3\", v.muted, \"\u64AD\u653E\u65F6\u4E0D\u51FA\u58F0\uFF1B\u8C31\u4E0A\u7167\u753B\")}${chip(\"solo\", \"\u72EC\u594F\", v.solo, \"\u64AD\u653E\u65F6\u53EA\u51FA\u6709\u72EC\u594F\u7684\u58F0\u90E8\")}</div>` +\n      `<span class=\"tc-k\">\u8C31\u8868</span><div class=\"tc-v\">${chip(\"staves:1\", \"\u4E00\u5F20\", one)}${chip(\"staves:2\", \"\u5927\u8C31\u8868\", !one, \"\u4E0A\u9AD8\u97F3\u4E0B\u4F4E\u97F3\uFF08\u94A2\u7434\uFF09\uFF1A\u4E2D\u592E C \u4EE5\u4E0B\u81EA\u52A8\u843D\u4E0B\u9762\uFF0Cpad\u300C\u22EF \u2192 \u6362\u8C31\u8868\u300D\u80FD\u624B\u52A8\u632A\")}</div>` +\n      (one ? `<span class=\"tc-k\">\u8C31\u53F7</span><div class=\"tc-v\">${chip(\"clef:auto\", \"\u81EA\u52A8\", !me.clef, \"\u6309\u6BCF\u5F20\u7EB8\u7684\u97F3\u6311\u52A0\u7EBF\u6700\u7701\u7684\u8C31\u53F7\uFF08\u5F88\u9AD8\u7684\u4F1A\u6311 15ma / 8va\uFF0C\u5F88\u4F4E\u7684\u6311\u4F4E\u97F3 / \u4F4E\u97F3 8vb\uFF09\uFF1B\u53EA\u7BA1\u753B\uFF0C\u97F3\u9AD8\u4E0D\u53D8\u3002\u8FD8\u4E0D\u770B\u4E50\u5668\u7684\u4E60\u60EF\uFF08\u6BD4\u5982\u5409\u4ED6\u5199 8vb\uFF09\uFF0C\u8981\u7684\u8BDD\u624B\u52A8\u9009\")}${CLEFS.map((c) => chip(`clef:${c}`, CLEF_LABEL[c], me.clef === c, CLEF_TITLE[c])).join(\"\")}</div>` : \"\") +\n      // \u5408\u79DF\uFF08v0.10.24\uFF1Buser\u300C\u5408\u79DF\u8FD8\u662F\u6709\u4E3B\u4EBA\u5427\uFF0C\u8FD9\u6837\u94A2\u7434\u5C0F\u82B1\u53EF\u4EE5\u6302\u94A2\u7434\u4E0A\u300D\uFF09\uFF1A\u753B\u5728\u8C01\u7684\u8C31\u7EBF\u4E0A\uFF1B\u53EA\u7BA1\u753B\uFF0C\u51FA\u58F0 / \u6DF7\u97F3\u53F0\u7167\u65E7\u5404\u662F\u5404\u7684\n      ((cands, hasTenants) => D.st.song.parts.length > 1 ? `<span class=\"tc-k\">\u5408\u79DF</span><div class=\"tc-v\">${hasTenants ? `<span class=\"tc-hint\">\u6709\u522B\u7684\u6B4C\u624B\u6302\u5728\u8FD9\u4E00\u884C\u4E0A\uFF08\u5B83\u662F\u4E3B\u4EBA\uFF09\uFF0C\u4E0D\u80FD\u518D\u53BB\u6302\u522B\u4EBA</span>`\n        : `<select class=\"tc-sel\" data-hostsel title=\"\u6302\u5728\u522B\u4EBA\u7684\u8C31\u7EBF\u4E0A\u753B\uFF08\u5408\u79DF\uFF1A\u53EA\u770B\u4E2A\u5927\u6982\uFF0C\u97F3\u649E\u5728\u4E00\u8D77\u5C31\u649E\uFF1B\u53EA\u753B\u97F3\uFF0C\u4E0D\u753B\u4F11\u6B62 / \u6B4C\u8BCD / \u529B\u5EA6\uFF1B\u70B9\u540D\u5B57 = \u62C6\u5F00\u6765\u5199\uFF09\"><option value=\"\">\u81EA\u5DF1\u4E00\u884C</option>${cands.map((p) => `<option value=\"${esc(p.id)}\"${me.host === p.id ? \" selected\" : \"\"}>\u6302\u5728\u300C${esc(labels[D.st.song.parts.indexOf(p)] ?? p.id)}\u300D\u4E0A</option>`).join(\"\")}</select>`}</div>` : \"\")(\n        D.st.song.parts.filter((p) => p.id !== me.id && !p.host), D.st.song.parts.some((p) => p.host === me.id)) +\n      (D.st.song.parts.length > 1 ? `<span class=\"tc-k\">\u987A\u5E8F</span><div class=\"tc-v\"><button class=\"btn\" data-v=\"moveup\"${k === 0 ? \" disabled\" : \"\"} title=\"\u5F80\u4E0A\u632A\u4E00\u683C\uFF08\u6700\u4E0A\u9762\u90A3\u4E2A\u58F0\u90E8\u7684\u901F\u5EA6\u8BB0\u53F7\u8BF4\u4E86\u7B97\uFF09\">\u2191 \u5F80\u4E0A</button><button class=\"btn\" data-v=\"movedown\"${k === D.st.song.parts.length - 1 ? \" disabled\" : \"\"} title=\"\u5F80\u4E0B\u632A\u4E00\u683C\">\u2193 \u5F80\u4E0B</button></div>` : \"\") +\n      `</div><div class=\"tc-foot\"><button class=\"btn\" data-v=\"give\" title=\"\u8FD9\u5F20\u7EB8\u4E0A\u8FD9\u4E00\u884C\u6362\u4E00\u4F4D\u6B4C\u624B\u5531\uFF08\u53EA\u6539\u8FD9\u5F20\u7EB8\uFF1B\u97F3\u548C\u6B4C\u8BCD\u4E0D\u52A8\uFF09\">\u4EA4\u7ED9\u2026</button><button class=\"btn\" data-v=\"add\" title=\"\u8FD9\u5F20\u7EB8\u4E0A\u518D\u52A0\u4E00\u4F4D\u6B4C\u624B\uFF08\u5DF2\u6709\u7684\u6216\u65B0\u7684\uFF1B\u53EA\u52A0\u5728\u8FD9\u5F20\u7EB8\u4E0A\uFF09\">\uFF0B \u52A0\u6B4C\u624B\u2026</button>` +\n      (onPaper > 1 ? `<button class=\"btn\" data-v=\"droptrack\" title=\"\u8FD9\u5F20\u7EB8\u4E0A\u4E0D\u8981\u8FD9\u4E2A\u58F0\u90E8\uFF08\u522B\u7684\u7EB8\u7167\u65E7\uFF09\">\u8FD9\u5F20\u7EB8\u4E0A\u53BB\u6389</button>` : \"\") +\n      `<button class=\"btn\" data-v=\"studio\" title=\"\u6DF7\u97F3\u53F0\uFF08= \u542C\u7684\u5E95\u5EA7\uFF09\uFF1A\u6BCF\u4F4D\u6B4C\u624B\u4E00\u6761\uFF08\u589E\u76CA / \u58F0\u50CF / \u9759\u97F3 / \u72EC\u594F\uFF09\uFF1B\u4E00\u5F20\u7EB8\u90FD\u4E0D\u5728\u7684\u6B4C\u624B\u5728\u90A3\u91CC\u5220\">\u6B4C\u624B\u7BA1\u7406\uFF08\u6DF7\u97F3\u53F0\uFF09\u2026</button></div>`;   // \u7EB8\u4E0A\u4E0D\u5220\u6B4C\u624B\uFF082026-10-08 \u6DF1\u591C user\u300C\u5728\u7EB8\u4E0A\u4E0D\u5E94\u8BE5\u53EF\u4EE5\u76F4\u63A5\u5220\u6B4C\u624B\uFF0C\u8FD9\u4E2A\u529F\u80FD\u53BB\u6389\uFF0C\u53EA\u6709\u6CA1\u5F15\u7528\u7684\u65F6\u5019\u624D\u53EF\u4EE5\u5728\u6B4C\u624B\u7BA1\u7406\u91CC\u9762\u5220\u300D\uFF09\uFF1A\u5220 = \u5F55\u97F3\u5BA4\u91CC\u3001\u4E00\u5F20\u7EB8\u90FD\u4E0D\u5728\u7684\u90A3\u4F4D\uFF1B\u4E09\u6761\u6760\u91CC\u4E0D\u653E\u5F55\u97F3\u5BA4\uFF08user\u300C\u4E09\u6761\u6760\u91CC\u9762\u4E0D\u5E94\u8BE5\u6709\u4E50\u5668\u76EE\u5F55\uFF0C\u4E91\u7AEF\uFF0C\u6B4C\u5E93 \u5F55\u97F3\u5BA4\u300D\uFF09\uFF0C\u624B\u673A\u4E0A\u4ECE\u8FD9\u91CC\u8FDB\n  };\n  draw(); document.body.append(box);\n  const w = box.offsetWidth, h = box.offsetHeight, m = 8;\n  // \u5F00\u5728\u8FD9\u6761\u8C31\u7684\u4E0B\u9762\uFF08\u53F3\u8FB9\u5C31\u662F\u8FD9\u6761\u8C31\u672C\u8EAB\u2014\u2014\u9690\u85CF / \u8C31\u53F7\u4E00\u70B9\u5C31\u8981\u770B\u5F97\u89C1\u5B83\u53D8\uFF09\uFF1B\u4E0B\u9762\u653E\u4E0D\u4E0B = \u4E0A\u9762\n  let x = (innerWidth - w) / 2, y = (innerHeight - h) / 2;\n  if (at) {\n    const below = at.bottom + 30, above = at.top - h - 10;\n    if (below + h <= innerHeight - m) { x = at.left - 8; y = below; }\n    else if (above >= m) { x = at.left - 8; y = above; }\n    else { x = at.right + 10; y = (at.top + at.bottom) / 2 - h / 2; }   // \u4E0A\u4E0B\u90FD\u653E\u4E0D\u4E0B\uFF08\u77EE\u7A97\u53E3\uFF09\uFF1A\u653E\u540D\u5B57\u53F3\u8FB9\uFF0C\u522B\u628A\u540D\u5B57\u672C\u8EAB\u76D6\u4F4F\n  }\n  box.style.left = `${Math.max(m, Math.min(x, innerWidth - w - m))}px`; box.style.top = `${Math.max(m, Math.min(y, innerHeight - h - m))}px`;\n  const outside = (e: PointerEvent) => { if (!box.contains(e.target as Node)) close(); };   // \u975E\u6A21\u6001\uFF1A\u70B9\u5916\u9762\u5C31\u6536\uFF0C\u90A3\u4E00\u4E0B\u7167\u5E38\u843D\u5230\u8C31\u4E0A\n  const close = () => { document.removeEventListener(\"pointerdown\", outside, true); box.remove(); ui.closed(close); };\n  setTimeout(() => { if (box.isConnected) document.addEventListener(\"pointerdown\", outside, true); }, 0);\n  ui.open({ k: \"card\", close, redraw: draw });\n  box.addEventListener(\"change\", (e) => {   // \u5408\u79DF\uFF1A\u6302\u5230\u8C01\u4E0A / \u81EA\u5DF1\u4E00\u884C\n    const t = e.target as HTMLSelectElement; if (t.dataset.hostsel === undefined) return;\n    const next = setPartHost(D.st, curPart().id, t.value || null);\n    update(next); renderTitle(); draw();\n    // \u4E00\u5BB6\uFF08\u4E3B\u4EBA + \u623F\u5BA2\uFF09\u91CC\u6709\u8C01\u5728\u5199 = \u6574\u5BB6\u62C6\u5F00\uFF08user\u300Chost\u4E5F\u5E94\u8BE5\u53EA\u8BFB\uFF0C\u53EA\u6709\u5C55\u5F00\u65F6\u624D\u80FD\u7F16\u8F91\u300D\uFF09\uFF1A\u6302\u4E0A\u4E4B\u540E\u53BB\u522B\u7684\u6B4C\u624B\u90A3\u513F\u5199\uFF0C\u8FD9\u4E00\u5BB6\u624D\u53E0\u6210\u4E00\u884C\n    if (t.value && next !== D.st) info(\"\u6302\u4E0A\u4E86\uFF1A\u5728\u522B\u7684\u6B4C\u624B\u90A3\u513F\u5199\u7684\u65F6\u5019\uFF0C\u8FD9\u4E00\u5BB6\u53E0\u5728\u4E00\u884C\u4E0A\u770B\uFF08\u53EA\u8BFB\uFF09\uFF1B\u70B9\u540D\u5B57 = \u62C6\u5F00\u6765\u5199\");\n  });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (!v) return;\n    const me = curPart();\n    if (v === \"inst\") { close(); openInstPage(); return; }\n    if (v === \"studio\") { close(); openStudio(); return; }\n    if (v === \"give\" || v === \"add\") { page = v; draw(); return; }\n    if (v === \"back\") { page = \"main\"; draw(); return; }\n    if (v.startsWith(\"give:\")) { const to = v.slice(5), name = partLabels(D.st.song, D.extras)[D.st.song.parts.findIndex((p) => p.id === to)] ?? \"\"; close(); update(rebindTrack(D.st, D.st.at.paper, me.id, to)); renderTitle(); info(`\u8FD9\u5F20\u7EB8\u4E0A\u8FD9\u4E00\u884C\u4EA4\u7ED9\u4E86\u300C${name}\u300D`); return; }\n    if (v === \"givenew\") { close(); addNewPart(D.st.at.paper, me.id); return; }\n    if (v.startsWith(\"add:\")) { close(); update(addTrack(D.st, D.st.at.paper, v.slice(4))); return; }\n    if (v === \"addnew\") { close(); addNewPart(D.st.at.paper); return; }\n    if (v === \"hide\") { setPv(me.id, { hidden: !pv(me.id).hidden }); afterViewChange(); }\n    else if (v === \"only\") { setPv(me.id, { only: !pv(me.id).only }); afterViewChange(); }\n    else if (v === \"mute\") { setPv(me.id, { muted: !pv(me.id).muted }); afterViewChange(); }\n    else if (v === \"solo\") { setPv(me.id, { solo: !pv(me.id).solo }); afterViewChange(); }\n    else if (v.startsWith(\"clef:\")) update(setPartClef(D.st, me.id, v.slice(5) === \"auto\" ? null : (v.slice(5) as ClefName)));\n    else if (v === \"moveup\" || v === \"movedown\") { update(movePart(D.st, me.id, v === \"moveup\" ? -1 : 1)); renderTitle(); }\n    else if (v.startsWith(\"staves:\")) { update(setPartStaves(D.st, me.id, v.slice(7) === \"2\" ? 2 : 1)); pad.render(); }\n    else if (v === \"droptrack\") { close(); update(removeTrack(D.st, D.st.at.paper, me.id)); return; }\n    else return;\n    draw();\n  });\n}\n\n/** \u7A7A\u767D\u5904\u7684\u5C0F\u83DC\u5355\uFF08\u957F\u6309 / \u7535\u8111\u53F3\u952E\uFF1Buser 2026-10-08\u300C\u7A7A\u767D\u957F\u6309\u53EF\u4EE5\u9ECF\u8D34\u6216\u8005\u7C7B\u4F3C\u7684\u53F3\u952E\u4E0A\u4E0B\u6587\u83DC\u5355\u300D\u300C\u5C0F\u83DC\u5355\u540C\u610F\u300D\uFF09\uFF1A\u975E\u6A21\u6001\uFF0C\u5F00\u5728\u6309\u7684\u5730\u65B9\uFF0C\u70B9\u5916\u9762\u5C31\u6536\u3002\n *  \u5149\u6807\u5DF2\u7ECF\u7531 score-view \u653E\u5230\u6309\u7684\u4F4D\u7F6E\uFF1A\u7C98\u8D34 = \u8D34\u5728\u90A3\u91CC\uFF1B\u63D2\u8BB0\u53F7 = \u63D2\u5728\u90A3\u91CC\u3002 */\nconst DYN_MENU = { ppp: \"\\u{E52A}\", pp: \"\\u{E52B}\", p: \"\\u{E520}\", mp: \"\\u{E52C}\", mf: \"\\u{E52D}\", f: \"\\u{E522}\", ff: \"\\u{E52F}\", fff: \"\\u{E530}\" } as const;   // Bravura \u529B\u5EA6\u5B57\u5F62\n/** \u529B\u5EA6\u6362\u7B97\u8868\uFF08v0.9.23\uFF1Buser 2026-10-10\u300Cwishlist: ppp fff\uFF0C\u4EE5\u53CA\u5E2E\u6211\u79D1\u666E\u8FD9\u4E9B\u548Cdb\u7684\u6362\u7B97\u5173\u7CFB\uFF0C\u7136\u540E\u5E94\u8BE5\u5411\u7528\u6237\u63ED\u9732\uFF0C\u65B9\u4FBF\u5BF9\u6BD4\u300D\u300C\u63ED\u9732\u8868\u7684\u4F4D\u7F6E\u5EFA\u8BAE\u662F\u4E50\u5668\u9875\u300C\u529B\u5EA6\u300D\u90A3\u4E00\u884C \u540C\u610F\u300D\uFF09\uFF1A\n *  \u6BCF\u4E2A\u529B\u5EA6\u8BB0\u53F7 \u2192 \u8FD9\u4F4D\u7684 MIDI \u529B\u5EA6\uFF08\u6709\u529B\u5EA6\u8868\u7684\u4E50\u5668\uFF09\u6216\u97F3\u91CF dB\uFF08\u6708\u8BFB / \u5143\u97F3\u7248 / \u65E7\u5019\u9009\uFF09\uFF0C\u6709 GS \u529B\u5EA6\u5C42\u6570\u636E\u7684\u518D\u52A0\u4E00\u884C\u300C\u7B2C\u51E0\u5C42\u300D\uFF08\u8DE8\u5C42 = \u6362\u4E00\u4EFD\u5F55\u97F3\uFF09\u3002\u6570\u90FD\u662F\u8FD9\u4F4D by value \u7684\u914D\u7F6E\u3002 */\nfunction dynTable(sp: { dynamicsDb: Record<Dyn, number>; dynamicsVel: Record<Dyn, number> | null }, layers: { count: number; ranges: [number, number][] } | null): string {\n  const db = (x: number) => `${x > 0 ? \"+\" : x < 0 ? \"\u2212\" : \"\"}${Math.abs(x)}`;\n  const cells = (f: (d: Dyn) => string) => DYNS.map((d) => `<td>${f(d)}</td>`).join(\"\");\n  const vel = sp.dynamicsVel;\n  return `<table class=\"dyn-tab\"><tr><th></th>${DYNS.map((d) => `<th title=\"${d}\"><span class=\"smufl\">${DYN_MENU[d]}</span></th>`).join(\"\")}</tr>` +\n    (vel ? `<tr><th>MIDI \u529B\u5EA6</th>${cells((d) => String(vel[d]))}</tr>` : `<tr><th>\u97F3\u91CF dB</th>${cells((d) => db(sp.dynamicsDb[d]))}</tr>`) +\n    (vel && layers && layers.count > 1 ? `<tr><th>GS \u529B\u5EA6\u5C42</th>${cells((d) => { const k = layers.ranges.findIndex(([lo, hi]) => vel[d] >= lo && vel[d] <= hi); return k >= 0 ? String(k + 1) : \"\u2013\"; })}</tr>` : \"\") + `</table>`;\n}\nfunction openScoreMenu(at: { x: number; y: number }, _row: { from: number; to: number } | null): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"track-card ctx-menu\"; box.setAttribute(\"role\", \"menu\");\n  const item = (v: string, label: string, title = \"\", disabled = false) => `<button class=\"btn ctx-item\" data-v=\"${v}\"${disabled ? \" disabled\" : \"\"}${title ? ` title=\"${esc(title)}\"` : \"\"}>${label}</button>`;\n  box.innerHTML =\n    item(\"play\", \"\u4ECE\u8FD9\u513F\u653E\", \"\u8D77\u70B9\u632A\u5230\u8FD9\u4E2A\u5C0F\u8282\u7684\u5934\uFF0C\u4ECE\u8FD9\u513F\u653E\uFF08\u4E4B\u540E |\u25B6 \u56DE\u5230\u8FD9\u513F\u91CD\u653E\uFF1B\u7F16\u8F91\u3001\u632A\u5149\u6807\u90FD\u4E0D\u52A8\u8D77\u70B9\uFF09\") + `<div class=\"ctx-sep\"></div>` +\n    item(\"paste\", \"\u7C98\u8D34\", \"\u8D34\u5728\u8FD9\u91CC\uFF1Aapp \u91CC\u590D\u5236\u7684\uFF0C\u6216\u7CFB\u7EDF\u526A\u8D34\u677F\u91CC\u7684\u7B80\u8C31\u6587\u5B57\uFF081 2 3 | 5 - -\uFF09\") +\n    `<div class=\"ctx-sep\"></div>` +\n    item(\"bar\", \"\u5C0F\u8282\u7EBF |\", \"\u4ECE\u8FD9\u91CC\u91CD\u65B0\u6570\u5C0F\u8282\uFF08\u5F31\u8D77\uFF09\") + item(\"phrase\", \"\u53E5\u53F7\", \"\u8FD9\u4E00\u53E5\u5230\u8FD9\u513F\uFF08\u300C\u5408\u300D\u632A\u5B57\u7684\u8FB9\u754C\uFF1B\u4E0D\u6362\u884C\u4E0D\u6362\u6C14\uFF09\") +\n    item(\"mark:key\", \"\u8C03\u53F7\u2026\") + item(\"mark:time\", \"\u62CD\u53F7\u2026\") + item(\"mark:tempo\", \"\u901F\u5EA6\u2026\") + item(\"clef\", \"\u8C31\u53F7\u2026\", \"\u4ECE\u8FD9\u513F\u8D77\u6362\u8C31\u53F7\uFF08\u53EA\u7BA1\u753B\uFF09\") + item(\"ottava\", \"\u516B\u5EA6\u7EBF\u2026\", \"8va / 15ma / 8vb\uFF08\u53EA\u7BA1\u753B\uFF09\") + item(\"transpose\", \"\u79FB\u8C03 / \u8F6C\u8C03\u2026\", \"\u8FD9\u5F20\u7EB8 / \u6574\u9996\u6240\u6709\u58F0\u90E8\u4E00\u8D77\u632A\uFF08\u8C03\u53F7\u8DDF\u7740\u632A\uFF09\uFF1B\u53EA\u632A\u4E00\u6BB5 = \u9009\u4E2D\u5B83\uFF0C\u7528\u9009\u533A\u83DC\u5355\") +\n    // \u529B\u5EA6\uFF08\u72B6\u6001\uFF1A\u4ECE\u8FD9\u513F\u8D77\u7BA1\u5230\u4E0B\u4E00\u4E2A\uFF1Buser 2026-10-08\u300C\u957F\u6309\u7684\u5C0F\u83DC\u5355\u4E5F\u80FD\u8F93\u5165\u529B\u5EA6\u7B26\u53F7\u300D\uFF09\uFF1A\u4EAE\u7740\u7684 = \u8FD9\u513F\u73B0\u5728\u751F\u6548\u7684\n    `<div class=\"ctx-row ctx-dyn\">${([\"ppp\", \"pp\", \"p\", \"mp\", \"mf\", \"f\", \"ff\", \"fff\"] as const).map((d) => `<button class=\"btn ctx-chip${dynMarkAt(tr(D.st), D.st.caret) === d ? \" is-on\" : \"\"}\" data-v=\"dyn:${d}\" title=\"\u529B\u5EA6 ${d}\uFF1A\u4ECE\u8FD9\u513F\u524D\u9762\u90A3\u4E2A\u97F3\u8D77\"><span class=\"smufl\">${DYN_MENU[d]}</span></button>`).join(\"\")}</div>` +\n    `<div class=\"ctx-sep\"></div>` +\n    item(\"all\", \"\u5168\u9009\");   // \u300C\u5168\u9009\u8FD9\u4E00\u884C\u300D\u53BB\u6389\u4E86\uFF082026-10-10 user\u300Cwishlist \u5168\u9009\u8FD9\u4E00\u884C\u6CA1\u5565\u7528\uFF0C\u53BB\u6389\u300D\uFF09\n  document.body.append(box);\n  const w = box.offsetWidth, h = box.offsetHeight, m = 8;\n  let x = at.x + 6, y = at.y + 10;\n  if (y + h > innerHeight - m) y = at.y - h - 10;\n  box.style.left = `${Math.max(m, Math.min(x, innerWidth - w - m))}px`; box.style.top = `${Math.max(m, Math.min(y, innerHeight - h - m))}px`;\n  const outside = (e: PointerEvent) => { if (!box.contains(e.target as Node)) close(); };\n  const close = () => { document.removeEventListener(\"pointerdown\", outside, true); box.remove(); ui.closed(close); };\n  setTimeout(() => { if (box.isConnected) document.addEventListener(\"pointerdown\", outside, true); }, 0);\n  ui.open({ k: \"menu\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (!v) return;\n    close();\n    if (v === \"play\") { playFromHere(D.st.at.paper, D.st.at.part, tickOfCaret(D.st.at.paper, D.st.at.part, D.st.caret) + (D.st.lead ?? 0)); return; }   // \u5149\u6807\u5728\u540E\u9762\u8865\u9F50\u7684\u7A7A\u5C0F\u8282\u91CC\uFF1A\u52A0\u4E0A lead\n    if (v === \"paste\") void pasteNow();\n    else if (v === \"bar\") update(apply(D.st, { k: \"bar\" }, performance.now()));\n    else if (v === \"phrase\") update(apply(D.st, { k: \"phrase\" }, performance.now()));\n    else if (v.startsWith(\"mark:\")) insertMarkHere(v.slice(5) as MarkVal[\"kind\"]);\n    else if (v === \"clef\") { openInsertClefMenu(at); return; }\n    else if (v === \"ottava\") { openInsertOttavaMenu(at); return; }\n    else if (v === \"transpose\") { openTransposeMenu(D.st.at.paper, at); return; }\n    else if (v.startsWith(\"dyn:\")) update(apply(D.st, { k: \"dyn\", v: v.slice(4) as Dyn }, performance.now()));\n    else if (v === \"all\") { update(selectAll(D.st)); updateChrome(); }\n    scoreEl.focus();\n  });\n}\n/** \u70B9\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\uFF08\u6216\u957F\u6309\u539F\u5730\u677E\u624B / \u53F3\u952E\uFF09\u7684\u5C0F\u83DC\u5355\uFF082026-10-08 Opus 5.5\uFF0C\u957F\u6309\u62D6\u90A3\u4E00\u8F6E\uFF09\uFF1A\u529B\u5EA6 = \u6362\u6210\u522B\u7684\u529B\u5EA6\uFF0C\u6E10\u5F3A\u6E10\u5F31 = \u6362\u65B9\u5411\uFF1B\u90FD\u80FD\u5220\u3002\u62D6 = \u632A\uFF0C\u5728 score-view \u91CC\u3002 */\nconst WEDGE_MENU = { cresc: `<svg class=\"slur-ico\" viewBox=\"0 0 22 12\" aria-hidden=\"true\"><path d=\"M20,2 L3,6 L20,10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`,\n  dim: `<svg class=\"slur-ico\" viewBox=\"0 0 22 12\" aria-hidden=\"true\"><path d=\"M2,2 L19,6 L2,10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>` } as const;\n/** \u98CE\u683C\u8BB0\u53F7\uFF08\u62CD\u5B50\u8F7B\u91CD\uFF09\uFF1A\u653E\u5728\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u4E0A\uFF08\u5148\u653E\u300C\u53E4\u5178\u300D= \u62CD\u53F7\u81EA\u5E26\u7684\u5F3A\u5F31\uFF0C\u6700\u4E0D\u6311\u4EBA\uFF09\uFF0C\u9A6C\u4E0A\u5F00\u5B83\u7684\u5C0F\u83DC\u5355\u6362\u98CE\u683C / \u5E45\u5EA6\u3002 */\nfunction insertGrooveHere(): void {\n  const nx = setGroove(D.st, \"classical\");\n  if (nx === D.st) { info(\"\u98CE\u683C\u8BB0\u53F7\u8981\u653E\u5728\u4E00\u4E2A\u97F3\u4E0A\uFF08\u8FD9\u5F20\u7EB8\u91CC\u8FD8\u6CA1\u6709\u97F3\uFF09\"); return; }\n  update(nx);\n  const toks = tr(D.st), an = markAnchor(D.st);\n  let k = -1; for (let j = an - 1; j >= 0 && !isTimed(toks[j]) && toks[j].kind !== \"bar\"; j--) if (toks[j].kind === \"groove\") { k = j; break; }\n  if (k >= 0) view.menuFor(k);\n}\n/** \u98CE\u683C\u8BB0\u53F7\u7684\u5C0F\u83DC\u5355\uFF1A\u6362\u98CE\u683C / \u5E45\u5EA6 / \u5220\uFF1B\u4E0B\u9762\u660E\u8BF4\u2014\u2014\u8FD9\u5F20\u7EB8\u7684\u62CD\u53F7\u9884\u8BBE\u91CC\u6CA1\u5217\uFF08\u6309\u53E4\u5178\u5C42\u7EA7\u63A8\uFF09\u3001\u6447\u6446\u8FD8\u6CA1\u63A5\u3001\u8FD9\u5F20\u7EB8\u4E0A\u7684\u6B4C\u624B\u5404\u8DDF\u591A\u5C11\uFF08\u7EAA\u5F8B\uFF1A\u505A\u4E0D\u5230\u7684\u660E\u8BF4\uFF09\u3002 */\n// \u2500\u2500 \u8C31\u5185\u53CD\u590D / \u8DF3\u8F6C\uFF082026-10-09 Opus 5.5\uFF1Buser\u300C\u2026\u8C31\u5185\u7684\u5FAA\u73AF\u548C\u6807\u51C6\u7684dc\u8FD9\u79CD\u662F\u4E0D\u662F\u652F\u6301\u4E0B\u4E5F\u4E0D\u96BE\uFF1F\u2026\u5C31\u662F\u666E\u901A\u8BB0\u8C31\u8F6F\u4EF6\u652F\u6301\u7684\u90A3\u79CD\u3002\u8FD9\u6837\uFF0C\u4E0D\u8D85\u8FC7sheet\u8FB9\u754C\u300D\u300C\u4F60\u5148\u628A\u4E09\u4E2A\u5C0F\u4EF6\u505A\u4E86\u300D\uFF09\u2500\u2500\nconst JUMPS: Exclude<NavWhat, \"ending\">[] = [\"segno\", \"coda\", \"fine\", \"toCoda\", \"dc\", \"dcFine\", \"dcCoda\", \"ds\", \"dsFine\", \"dsCoda\"];\nconst ENDINGS: number[][] = [[1], [2], [3], [1, 2], [2, 3]];\n/** \u5C0F\u83DC\u5355\u7684\u58F3\uFF08\u540C\u98CE\u683C / \u529B\u5EA6\u8BB0\u53F7\u7684\u5C0F\u83DC\u5355\uFF09\uFF1Aat = \u5C4F\u5E55\u5750\u6807\uFF1Bpick(v) \u8FD4\u56DE true = \u70B9\u4E86\u4E0D\u6536\u3002 */\nfunction ctxMenu(cls: string, html: string, at: { x: number; y: number }, pick: (v: string) => boolean | void): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = `track-card ctx-menu ${cls}`; box.setAttribute(\"role\", \"menu\"); box.innerHTML = html;\n  document.body.append(box);\n  const w = box.offsetWidth, h = box.offsetHeight, m = 8;\n  let y = at.y + 6; if (y + h > innerHeight - m) y = at.y - h - 30;\n  box.style.left = `${Math.max(m, Math.min(at.x - w / 2, innerWidth - w - m))}px`; box.style.top = `${Math.max(m, Math.min(y, innerHeight - h - m))}px`;\n  const outside = (e: PointerEvent) => { if (!box.contains(e.target as Node)) close(); };\n  const close = () => { document.removeEventListener(\"pointerdown\", outside, true); box.remove(); ui.closed(close); };\n  setTimeout(() => { if (box.isConnected) document.addEventListener(\"pointerdown\", outside, true); }, 0);\n  ui.open({ k: \"menu\", close });\n  box.addEventListener(\"click\", (e) => { const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (!v) return; if (!pick(v)) close(); scoreEl.focus({ preventScroll: true }); });\n}\n/** \u5199\u4E86\u53CD\u590D / \u8DF3\u8F6C\u4E4B\u540E\uFF1A\u5149\u6807\u6240\u5728\u8FD9\u4E00\u884C\u4E0D\u662F\u8FD9\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4F4D = \u660E\u8BF4\uFF08\u8C31\u4E0A\u753B\u7070\uFF1B\u7EAA\u5F8B\u300C\u505A\u4E0D\u5230\u7684\u4E00\u5F8B\u753B\u7070 + \u660E\u8BF4\u300D\uFF09\u3002 */\nfunction discloseNav(): void {\n  const paper = D.st.song.papers.find((p) => p.id === D.st.at.paper), owner = paper ? tempoOwner(D.st.song, paper) : null;\n  if (owner && owner !== D.st.at.part) info(`\u53CD\u590D / \u8DF3\u8F6C\u53EA\u770B\u8FD9\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4F4D\uFF08${roleName(D.extras, D.st.song.parts.find((p) => p.id === owner)?.role ?? \"\")}\uFF09\u90A3\u4E00\u884C\uFF1A\u8FD9\u4E00\u884C\u5199\u7684\u753B\u7070\u3001\u4E0D\u8D77\u4F5C\u7528`);\n}\n/** \u6574\u6BB5 / \u6574\u9996\u79FB\u8C03\u8F6C\u8C03\uFF08v0.9.33\uFF1Buser 2026-10-09\u300C\u6742\u4E8B\u8BB0\u8D26\uFF1A\u6BB5\u7EA7\u522B\u548C\u5DE5\u7A0B\u7EA7\u522B\u7684\u6574\u4F53\u79FB\u8C03\u8F6C\u8C03\u300D\u2192 10-10\u300C\u5C0F\u4EF6\u505A\u300D\uFF09\uFF1A\n *  \u7EB8\u7684\u300C\u22EF\u300D/ \u7A7A\u767D\u5904\u5C0F\u83DC\u5355 \u2192\u300C\u79FB\u8C03 / \u8F6C\u8C03\u2026\u300D\u3002\u8FD9\u5F20\u7EB8\uFF08\u6216\u6574\u9996\uFF09\u4E0A\u6240\u6709\u58F0\u90E8\u4E00\u8D77\u632A\u3001\u8C03\u53F7\u8DDF\u7740\u632A\uFF1B\u70B9\u4E86\u4E0D\u6536\u3001\u53EF\u4EE5\u8FDE\u7740\u70B9\uFF0C\u6BCF\u4E00\u4E0B\u4E00\u6B65\u64A4\u9500\u3002\n *  \u53F0\u4E0A\u56FA\u5B9A\u6572\u4E00\u4E2A\u952E\u7684\u58F0\u90E8\uFF08\u9F13\u4EF6 / \u97F3\u6548\u56FA\u5B9A\u539F\u901F\uFF0C\u8C31\u4E0A\u753B \u00D7\uFF09\u4E0D\u52A8\u2014\u2014\u8C31\u4E0A\u7684\u97F3\u9AD8\u4E0D\u62FF\u6765\u51FA\u58F0\u3002\u9009\u4E00\u6BB5 = \u9009\u533A\u83DC\u5355\u90A3\u4E2A\uFF08\u53EA\u632A\u9009\u4E2D\u7684\u3001\u8C03\u53F7\u4E0D\u52A8\uFF09\u3002 */\nfunction openTransposeMenu(paperId: string, at: { x: number; y: number }): void {\n  let whole = false, told = false;\n  const many = D.st.song.papers.length > 1;\n  const nameOf = (id: string) => { const k = D.st.song.papers.findIndex((p) => p.id === id); return D.st.song.papers[k]?.name || `\u7B2C ${k + 1} \u5F20\u7EB8`; };\n  const ids = () => (whole ? D.st.song.papers.map((p) => p.id) : [paperId]);\n  const chip = (v: string, label: string, on = false, title = \"\") => `<button class=\"btn ctx-chip${on ? \" is-on\" : \"\"}\" data-v=\"${v}\"${title ? ` title=\"${esc(title)}\"` : \"\"}>${label}</button>`;\n  const html = () => {\n    const now = scopeKey(D.st.song, ids());\n    return (many ? `<div class=\"ctx-row\"><span class=\"ctx-k\">\u8303\u56F4</span>${chip(\"scope:paper\", `\u8FD9\u4E00\u6BB5\u300C${esc(nameOf(paperId))}\u300D`, !whole)}${chip(\"scope:song\", \"\u6574\u9996\", whole)}</div>` : \"\") +\n      `<div class=\"ctx-row\"><span class=\"ctx-k\">\u79FB\u8C03</span>${chip(\"tr:1\", \"\u2191 \u534A\u97F3\")}${chip(\"tr:-1\", \"\u2193 \u534A\u97F3\")}${chip(\"tr:2\", \"\u2191 \u5168\u97F3\")}${chip(\"tr:-2\", \"\u2193 \u5168\u97F3\")}</div>` +\n      `<div class=\"ctx-row\"><span class=\"ctx-k\">\u516B\u5EA6</span>${chip(\"tr:12\", \"\u2191 \u516B\u5EA6\")}${chip(\"tr:-12\", \"\u2193 \u516B\u5EA6\")}</div>` +\n      `<div class=\"ctx-hint ctx-what\">\u8F6C\u8C03\u5230\uFF08\u73B0\u5728 1=${KEY_LABEL[now] ?? now}\uFF09\uFF1A\u97F3\u6309\u4E24\u4E2A\u4E3B\u97F3\u4E4B\u95F4\u7684\u97F3\u7A0B\u632A</div><div class=\"ctx-grid\">${KEY_CIRCLE_MENU.map((k) => chip(`mod:${k}`, `1=${KEY_LABEL[k]}`, k === now)).join(\"\")}</div>` +\n      `<div class=\"ctx-hint\">${whole ? \"\u6574\u9996\" : \"\u8FD9\u5F20\u7EB8\u4E0A\"}\u6240\u6709\u58F0\u90E8\u4E00\u8D77\u632A\uFF0C\u8C03\u53F7\u8DDF\u7740\u632A\uFF08\u53D6\u5347\u964D\u53F7\u5C11\u7684\u5199\u6CD5\uFF1B\u632A\u516B\u5EA6\u8C03\u53F7\u4E0D\u53D8\uFF09\u3002\u6B4C\u8BCD\u3001\u8BB0\u53F7\u3001\u8C31\u53F7\u4E0D\u52A8\uFF1B\u9F13 / \u56FA\u5B9A\u6572\u4E00\u4E2A\u952E\u7684\u58F0\u90E8\uFF08\u5199\u7684\u97F3\u9AD8 = \u6572\u54EA\u4E2A\uFF09\u4E0D\u52A8\uFF1Bpad \u7684\u300C1=\u300D\u4E0D\u8DDF\u3002</div>`;\n  };\n  ctxMenu(\"transpose-menu\", html(), at, (v) => {\n    if (v.startsWith(\"scope:\")) whole = v === \"scope:song\";\n    else {\n      const skip = new Set(partViews().filter((x) => x.xHead || x.perc).map((x) => x.id));   // \u56FA\u5B9A\u6572\u4E00\u4E2A\u952E / \u9F13\uFF08\u6574\u5957\u9F13\uFF1A\u5199\u7684\u97F3\u9AD8 = \u6572\u54EA\u4E2A\u9F13\uFF0C\u632A\u4E86\u5C31\u6362\u4E86\u9F13\uFF0Cv0.10.27\uFF09\u4E0D\u632A\n      const nx = v.startsWith(\"tr:\") ? transposePapers(D.st, ids(), { semis: Number(v.slice(3)) }, skip) : v.startsWith(\"mod:\") ? transposePapers(D.st, ids(), { toFifths: Number(v.slice(4)) }, skip) : D.st;\n      if (nx === D.st) info(v.startsWith(\"mod:\") ? \"\u5DF2\u7ECF\u662F\u8FD9\u4E2A\u8C03\" : \"\u6CA1\u6709\u53EF\u4EE5\u632A\u7684\u97F3\");\n      else {\n        update(nx);\n        const held = ids().flatMap((id) => Object.keys(D.st.song.papers.find((p) => p.id === id)?.tracks ?? {})).filter((pid) => skip.has(pid));\n        if (held.length && !told) { told = true; const labels = partLabels(D.st.song, D.extras); info(`${[...new Set(held)].map((pid) => labels[D.st.song.parts.findIndex((p) => p.id === pid)]).join(\"\u3001\")} \u662F\u9F13 / \u56FA\u5B9A\u6572\u4E00\u4E2A\u952E\uFF08\u5199\u7684\u97F3\u9AD8 = \u6572\u54EA\u4E2A\uFF09\uFF0C\u6CA1\u632A`); }\n      }\n    }\n    const box = document.querySelector<HTMLElement>(\".ctx-menu.transpose-menu\"); if (box) box.innerHTML = html();\n    return true;   // \u4E0D\u6536\uFF1A\u53EF\u4EE5\u8FDE\u7740\u70B9\n  });\n}\n/** pad \u7B26\u53F7\u5C42\u300C\u53CD\u590D\u300D\uFF1A\u63D2\u5728\u5149\u6807\u5904\uFF08\u6328\u7740\u5C0F\u8282\u7EBF = \u628A\u90A3\u6761\u6539\u6210\u53CD\u590D\u7684\uFF09\u3002 */\nfunction openRepeatMenu(): void {\n  const r = padEl.getBoundingClientRect();\n  const chip = (v: string, label: string, title: string) => `<button class=\"btn ctx-chip\" data-v=\"${v}\" title=\"${esc(title)}\">${esc(label)}</button>`;\n  ctxMenu(\"repeat-menu\",\n    `<div class=\"ctx-hint ctx-what\">\u8C31\u5185\u53CD\u590D\uFF1A\u63D2\u5728\u5149\u6807\u5904\uFF1B\u5149\u6807\u6328\u7740\u5C0F\u8282\u7EBF = \u628A\u90A3\u6761\u6539\u6210\u53CD\u590D\u7684\u3002\u653E\u7684\u65F6\u5019\u6309\u8FD9\u5F20\u7EB8\u6700\u4E0A\u9762\u90A3\u4F4D\u6B4C\u624B\u90A3\u4E00\u884C\u5C55\u5F00\uFF0C\u522B\u7684\u58F0\u90E8\u8DDF\u7740\uFF1B\u4E0D\u8DE8\u7EB8\u3002\u8DF3\u56DE\u6765\uFF08D.C. / D.S.\uFF09\u4E4B\u540E\u53CD\u590D\u4E0D\u518D\u53CD\u590D\u3002</div>` +\n    `<div class=\"ctx-row\">${chip(\"bar:start\", \"|:\", \"\u53CD\u590D\u5F00\u59CB\")}${chip(\"bar:end\", \":|\", \"\u53CD\u590D\u7ED3\u675F\uFF1A\u56DE\u5230 |:\uFF08\u6CA1\u6709 = \u8FD9\u5F20\u7EB8\u5F00\u5934\uFF09\u518D\u653E\u4E00\u904D\")}${chip(\"bar:both\", \":|:\", \"\u524D\u4E00\u6BB5\u53CD\u590D\u7ED3\u675F\u3001\u540E\u4E00\u6BB5\u53CD\u590D\u5F00\u59CB\")}${chip(\"bar:end:3\", \":| \u00D73\", \"\u4E00\u5171\u653E\u4E09\u904D\")}${chip(\"bar:end:4\", \":| \u00D74\", \"\u4E00\u5171\u653E\u56DB\u904D\")}${chip(\"bar:plain\", \"|\", \"\u6539\u56DE\u666E\u901A\u5C0F\u8282\u7EBF\")}</div>` +\n    `<div class=\"ctx-row\">${chip(\"bs:double\", \"\u2016 \u6BB5\u843D\u7EBF\", \"\u6BB5\u843D\u7EBF\uFF08\u4E24\u6839\u7EC6\u7EBF\uFF09\uFF1A\u5206\u6BB5\u7684\u8BB0\u53F7\uFF0C\u4E0D\u662F\u4E24\u6839\u5C0F\u8282\u7EBF\uFF1B\u6328\u7740\u5C0F\u8282\u7EBF = \u628A\u90A3\u6761\u6539\u6210\u6BB5\u843D\u7EBF\")}${chip(\"bs:final\", \"\u7EC8\u6B62\u7EBF\", \"\u7EC8\u6B62\u7EBF\uFF08\u7EC6 + \u7C97\uFF09\uFF1A\u66F2\u5B50 / \u8FD9\u4E00\u6BB5\u5230\u8FD9\u513F\u7ED3\u675F\")}</div>` +\n    `<div class=\"ctx-row\">${ENDINGS.map((n) => chip(`end:${n.join(\",\")}`, endingLabel(n), `\u623F\u5B50\uFF1A\u7B2C ${n.join(\"\u3001\")} \u904D\u8D70\u8FD9\u91CC`)).join(\"\")}</div>` +\n    `<div class=\"ctx-row\">${JUMPS.slice(0, 4).map((w) => chip(`nav:${w}`, NAV_LABEL[w], NAV_HELP[w])).join(\"\")}</div>` +\n    `<div class=\"ctx-row\">${JUMPS.slice(4).map((w) => chip(`nav:${w}`, NAV_LABEL[w], NAV_HELP[w])).join(\"\")}</div>`,\n    { x: r.left + r.width / 2, y: r.top - 4 },\n    (v) => {\n      if (v.startsWith(\"bar:\")) { const [, k, tm] = v.split(\":\"); update(setRepeatBar(D.st, k === \"plain\" ? null : (k as Repeat), tm ? Number(tm) : undefined)); }\n      else if (v.startsWith(\"bs:\")) update(setBarStyle(D.st, v.slice(3) as \"double\" | \"final\"));   // \u6BB5\u843D\u7EBF / \u7EC8\u6B62\u7EBF\uFF08v0.9.32\uFF1Buser\u300C\u55EF\u53CC\u5C0F\u8282\u7EBF\u7684\u8BED\u4E49\u4E0D\u662F\u4E24\u4E2A\u5C0F\u8282\u7EBF\uFF0C\u540C\u610F\u4F60\u7684\u5F52\u7C7B\u300D\uFF09\n      else if (v.startsWith(\"end:\")) update(insertNav(D.st, \"ending\", v.slice(4).split(\",\").map(Number)));\n      else if (v.startsWith(\"nav:\")) update(insertNav(D.st, v.slice(4) as NavWhat));\n      discloseNav();\n    });\n}\n// \u2500\u2500 \u8C31\u53F7 / \u516B\u5EA6\u7EBF\uFF08v0.9.28\uFF1Buser\u300C\u8C31\u53F7\u7684\u663E\u793A\u6A21\u5F0F\u8DDF\u7740\u8C31\u53F7\u800C\u4E0D\u662F\u4E50\u5668\u300D\u300C\u9ED8\u8BA4\u81EA\u52A8\u540C\u610F\u300D\u300C\u52A0\u683C\u5F0F\u540C\u610F\u300D\u300C8va\u53EF\u4EE5\u505A\u4E86\u5417\u300D\uFF09\uFF1A\u53EA\u7BA1\u753B\uFF0C\u97F3\u9AD8\u6570\u636E\u4E0D\u52A8 \u2500\u2500\nconst OTTAVAS: readonly (1 | 2 | -1)[] = [1, 2, -1];\nconst OTT_HELP: Record<number, string> = { 1: \"8va\uFF1A\u8C31\u4E0A\u753B\u4F4E\u4E00\u4E2A\u516B\u5EA6\uFF08\u5B9E\u9645\u7167\u5199\u7684\u9AD8\u516B\u5EA6\u54CD\uFF09\", 2: \"15ma\uFF1A\u8C31\u4E0A\u753B\u4F4E\u4E24\u4E2A\u516B\u5EA6\", [-1]: \"8vb\uFF1A\u8C31\u4E0A\u753B\u9AD8\u4E00\u4E2A\u516B\u5EA6\uFF08\u5B9E\u9645\u7167\u5199\u7684\u4F4E\u516B\u5EA6\u54CD\uFF09\", 0: \"\u5230\u8FD9\u513F\u7ED3\u675F\u516B\u5EA6\u7EBF\" };\nconst clefChips = (on: ClefName | null, prefix: string) => CLEFS.map((c) => `<button class=\"btn ctx-chip${on === c ? \" is-on\" : \"\"}\" data-v=\"${prefix}${c}\" title=\"${esc(CLEF_TITLE[c])}\">${esc(CLEF_LABEL[c])}</button>`).join(\"\");\n/** \u63D2\u8C31\u53F7\uFF08pad \u7B26\u53F7\u5C42 / \u7A7A\u767D\u5904\u83DC\u5355\uFF09\uFF1A\u4ECE\u5149\u6807\u5904\u8D77\u6362\u3002 */\nfunction openInsertClefMenu(at: { x: number; y: number }): void {\n  ctxMenu(\"clef-menu\", `<div class=\"ctx-hint ctx-what\">\u8C31\u53F7\uFF1A\u4ECE\u5149\u6807\u5904\u8D77\u6362\uFF08\u53EA\u7BA1\u753B\uFF0C\u97F3\u9AD8\u4E0D\u53D8\uFF09\u3002\u6BCF\u884C\u5F00\u5934\u7684\u8C31\u53F7\u4E5F\u80FD\u76F4\u63A5\u70B9\u3002</div><div class=\"ctx-row\">${clefChips(null, \"c:\")}</div>`, at,\n    (v) => { if (v.startsWith(\"c:\")) update(insertClef(D.st, v.slice(2) as ClefName)); });\n}\n/** \u63D2\u516B\u5EA6\u7EBF\uFF1A\u4ECE\u5149\u6807\u5904\u8D77\uFF08\u6709\u9009\u533A = \u8FD9\u4E00\u6BB5\uFF09\u3002 */\nfunction openInsertOttavaMenu(at: { x: number; y: number }): void {\n  ctxMenu(\"ottava-menu\", `<div class=\"ctx-hint ctx-what\">\u516B\u5EA6\u7EBF\uFF1A\u4ECE\u5149\u6807\u5904\u8D77${D.st.sel ? \"\uFF08\u6709\u9009\u533A = \u53EA\u753B\u8FD9\u4E00\u6BB5\uFF09\" : \"\uFF0C\u5230\u4E0B\u4E00\u4E2A\u516B\u5EA6\u7EBF\u8BB0\u53F7\u4E3A\u6B62\"}\u3002\u53EA\u7BA1\u753B\uFF0C\u97F3\u9AD8\u4E0D\u53D8\u3002</div>` +\n    `<div class=\"ctx-row\">${[...OTTAVAS, 0].map((v) => `<button class=\"btn ctx-chip\" data-v=\"o:${v}\" title=\"${esc(OTT_HELP[v])}\">${esc(OTTAVA_LABEL[v])}</button>`).join(\"\")}</div>`, at,\n    (v) => { if (v.startsWith(\"o:\")) update(insertOttava(D.st, Number(v.slice(2)) as -1 | 0 | 1 | 2)); });\n}\n/** \u70B9\u8C31\u4E0A\u7684\u8C31\u53F7 / \u516B\u5EA6\u7EBF\u3002\u884C\u9996\u7684\u8C31\u53F7\uFF1A\u7BA1\u7740\u5B83\u7684\u662F\u58F0\u90E8\u81EA\u5DF1\u7684\u8C31\u53F7 = \u6539\u58F0\u90E8\u7684\uFF08\u5168\u66F2\uFF0C\u81EA\u52A8\u4E5F\u5728\u8FD9\uFF09+\u300C\u53EA\u6539\u8FD9\u5F20\u7EB8\u300D\uFF1B\u662F\u8C31\u53F7\u8BB0\u53F7 = \u6539 / \u5220\u90A3\u4E2A\u8BB0\u53F7\u3002 */\nfunction openClefMenu(hit: ClefHit, at: { x: number; y: number }): void {\n  const paper = D.st.song.papers.find((p) => p.id === hit.paper), toks = paper?.tracks[hit.part]; if (!toks) return;\n  const part = D.st.song.parts.find((p) => p.id === hit.part); if (!part) return;\n  if (hit.kind === \"ottava\" && hit.run) {   // \u81EA\u52A8\u753B\u7684\u516B\u5EA6\u7EBF\uFF08v0.9.37\uFF1Buser\u300C\u81EA\u52A8\u52A0\u300D\uFF09\uFF1A\u4E0D\u5B58\u8FDB\u8C31\uFF1B\u53EF\u4EE5\u56FA\u5B9A\u6210\u624B\u5199\u7684\uFF0C\u6216\u8005\u8FD9\u4F4D\u4E0D\u8981\u81EA\u52A8\n    const r = hit.run, lab = OTTAVA_LABEL[r.shift];\n    ctxMenu(\"ottava-menu\", `<div class=\"ctx-hint ctx-what\">\u81EA\u52A8\u516B\u5EA6\u7EBF\uFF1A\u8FD9\u4E00\u4E32\u97F3\u8981\u4E09\u6761\u4EE5\u4E0A\u52A0\u7EBF\uFF0C\u81EA\u52A8\u753B\u4E86 ${esc(lab)}\u3002\u53EA\u7BA1\u753B\u3001\u4E0D\u5B58\u8FDB\u8C31\uFF0C\u97F3\u9AD8\u4E0D\u53D8\uFF1B\u6539\u4E86\u97F3\u4F1A\u8DDF\u7740\u91CD\u7B97\u3002\u624B\u5199\u7684\u516B\u5EA6\u7EBF\u8BF4\u4E86\u7B97\u3002</div>` +\n      `<button class=\"btn ctx-item\" data-v=\"pin\">\u56FA\u5B9A\u6210\u624B\u5199\u7684 ${esc(lab)}\uFF08\u4E4B\u540E\u81EA\u5DF1\u6539\uFF09</button><button class=\"btn ctx-item\" data-v=\"off\">\u8FD9\u4F4D\u6B4C\u624B\u4E0D\u8981\u81EA\u52A8\u516B\u5EA6\u7EBF</button>`, at,\n      (v) => {\n        if (v === \"pin\") update(insertOttava({ ...setFocus(D.st, hit.paper, hit.part, r.from), sel: { from: r.from, to: r.to + 1 } }, r.shift));\n        else if (v === \"off\") { update(setPartAutoOttava(D.st, hit.part, false)); info(\"\u8FD9\u4F4D\u6B4C\u624B\u7684\u81EA\u52A8\u516B\u5EA6\u7EBF\u5173\u4E86\uFF08\u8C31\u53F7\u5C0F\u83DC\u5355\u91CC\u80FD\u518D\u5F00\uFF09\"); }\n      });\n    return;\n  }\n  if (hit.kind === \"ottava\") {\n    const t = toks[hit.index]; if (!t || t.kind !== \"ottava\") return;\n    ctxMenu(\"ottava-menu\", `<div class=\"ctx-hint ctx-what\">\u516B\u5EA6\u7EBF\uFF1A${esc(OTT_HELP[t.shift])}\u3002\u53EA\u7BA1\u753B\uFF0C\u97F3\u9AD8\u4E0D\u53D8\u3002</div>` +\n      `<div class=\"ctx-row\">${OTTAVAS.map((v) => `<button class=\"btn ctx-chip${t.shift === v ? \" is-on\" : \"\"}\" data-v=\"o:${v}\" title=\"${esc(OTT_HELP[v])}\">${esc(OTTAVA_LABEL[v])}</button>`).join(\"\")}</div><div class=\"ctx-sep\"></div><button class=\"btn ctx-item danger\" data-v=\"del\">\u5220\u6389\u8FD9\u6761\u516B\u5EA6\u7EBF</button>`, at,\n      (v) => { if (v === \"del\") update(setDisplayMark(D.st, hit.paper, hit.part, hit.index, null)); else if (v.startsWith(\"o:\")) update(setDisplayMark(D.st, hit.paper, hit.part, hit.index, Number(v.slice(2)) as -1 | 1 | 2)); });\n    return;\n  }\n  if (hit.index >= 0) {   // \u8C31\u53F7\u8BB0\u53F7\uFF08\u884C\u4E2D\u95F4\u7684\uFF0C\u6216\u7BA1\u7740\u8FD9\u4E00\u884C\u5F00\u5934\u7684\uFF09\n    const t = toks[hit.index]; if (!t || t.kind !== \"clef\") return;\n    ctxMenu(\"clef-menu\", `<div class=\"ctx-hint ctx-what\">\u8FD9\u4E2A\u8C31\u53F7\u8BB0\u53F7\uFF1A\u4ECE\u8FD9\u513F\u8D77\u6362\u6210\u522B\u7684\u8C31\u53F7\uFF08\u53EA\u7BA1\u753B\uFF0C\u97F3\u9AD8\u4E0D\u53D8\uFF09\u3002</div><div class=\"ctx-row\">${clefChips(t.clef, \"c:\")}</div><div class=\"ctx-sep\"></div><button class=\"btn ctx-item danger\" data-v=\"del\">\u5220\u6389\u8FD9\u4E2A\u8C31\u53F7\u8BB0\u53F7</button>`, at,\n      (v) => { if (v === \"del\") update(setDisplayMark(D.st, hit.paper, hit.part, hit.index, null)); else if (v.startsWith(\"c:\")) update(setDisplayMark(D.st, hit.paper, hit.part, hit.index, v.slice(2) as ClefName)); });\n    return;\n  }\n  const auto = !part.clef, now = auto ? (resolveSongClefs(D.st.song).get(hit.paper)?.get(hit.part) ?? \"G\") : part.clef!;\n  ctxMenu(\"clef-menu\",\n    `<div class=\"ctx-hint ctx-what\">\u8FD9\u4E2A\u58F0\u90E8\u7684\u8C31\u53F7\uFF08\u6BCF\u5F20\u7EB8\u5F00\u5934\u90FD\u7528\u5B83\uFF09\uFF1A${auto ? `\u81EA\u52A8\uFF08\u8FD9\u5F20\u7EB8\u6311\u4E86\u300C${esc(CLEF_LABEL[now])}\u300D\uFF09` : esc(CLEF_LABEL[now])}\u3002\u53EA\u7BA1\u753B\uFF0C\u97F3\u9AD8\u4E0D\u53D8\u3002</div>` +\n    `<div class=\"ctx-row\"><button class=\"btn ctx-chip${auto ? \" is-on\" : \"\"}\" data-v=\"p:auto\" title=\"\u6309\u6BCF\u5F20\u7EB8\u7684\u97F3\u6311\u52A0\u7EBF\u6700\u5C11\u7684\u8C31\u53F7\">\u81EA\u52A8</button>${clefChips(auto ? null : now, \"p:\")}</div>` +\n    `<div class=\"ctx-hint\">\u53EA\u6539\u8FD9\u5F20\u7EB8\uFF08\u5728\u8FD9\u5F20\u7EB8\u5F00\u5934\u653E\u4E00\u4E2A\u8C31\u53F7\u8BB0\u53F7\uFF09\uFF1A</div><div class=\"ctx-row\">${clefChips(null, \"here:\")}</div>` +\n    `<div class=\"ctx-hint\">\u81EA\u52A8\u516B\u5EA6\u7EBF\uFF1A\u4E00\u4E32\u5F88\u9AD8 / \u5F88\u4F4E\u7684\u97F3\uFF08\u6BCF\u4E2A\u90FD\u8981\u4E09\u6761\u4EE5\u4E0A\u52A0\u7EBF\uFF09\u81EA\u52A8\u753B 8va / 15ma / 8vb\uFF1B\u624B\u5199\u7684\u8BF4\u4E86\u7B97\uFF0C\u4E0D\u5B58\u8FDB\u8C31\u3002</div>` +\n    `<div class=\"ctx-row\"><button class=\"btn ctx-chip${part.autoOttava !== false ? \" is-on\" : \"\"}\" data-v=\"ao:on\">\u5F00</button><button class=\"btn ctx-chip${part.autoOttava === false ? \" is-on\" : \"\"}\" data-v=\"ao:off\">\u5173</button></div>`, at,\n    (v) => {\n      if (v.startsWith(\"ao:\")) { update(setPartAutoOttava(D.st, hit.part, v === \"ao:on\")); return; }\n      if (v.startsWith(\"p:\")) update(setPartClef(D.st, hit.part, v === \"p:auto\" ? null : (v.slice(2) as ClefName)));\n      else if (v.startsWith(\"here:\")) update(insertClef(setFocus(D.st, hit.paper, hit.part, headLen(toks)), v.slice(5) as ClefName));\n    });\n}\nconst NAV_HELP: Record<Exclude<NavWhat, \"ending\">, string> = {\n  segno: \"Segno\uFF1AD.S. \u8DF3\u56DE\u5230\u8FD9\u513F\", coda: \"Coda\uFF1ATo Coda \u8DF3\u5230\u8FD9\u513F\", fine: \"Fine\uFF1A\u8DF3\u56DE\u6765\uFF08al Fine\uFF09\u4E4B\u540E\u5728\u8FD9\u513F\u505C\", toCoda: \"To Coda\uFF1A\u8DF3\u56DE\u6765\uFF08al Coda\uFF09\u4E4B\u540E\u4ECE\u8FD9\u513F\u53BB Coda\",\n  dc: \"D.C.\uFF1A\u8DF3\u56DE\u8FD9\u5F20\u7EB8\u5F00\u5934\uFF0C\u653E\u5230\u7EB8\u5C3E\", dcFine: \"D.C. al Fine\uFF1A\u8DF3\u56DE\u5F00\u5934\uFF0C\u653E\u5230 Fine\", dcCoda: \"D.C. al Coda\uFF1A\u8DF3\u56DE\u5F00\u5934\uFF0C\u5230 To Coda \u53BB Coda\",\n  ds: \"D.S.\uFF1A\u8DF3\u56DE Segno\uFF0C\u653E\u5230\u7EB8\u5C3E\", dsFine: \"D.S. al Fine\uFF1A\u8DF3\u56DE Segno\uFF0C\u653E\u5230 Fine\", dsCoda: \"D.S. al Coda\uFF1A\u8DF3\u56DE Segno\uFF0C\u5230 To Coda \u53BB Coda\",\n};\n/** \u70B9\u8C31\u4E0A\u7684\u623F\u5B50 / \u8DF3\u8F6C\u8BB0\u53F7\uFF1A\u6362\u6210\u522B\u7684 / \u5220\uFF1B\u4E0D\u8D77\u4F5C\u7528\u7684\u8BF4\u4E3A\u4EC0\u4E48\u3002 */\nfunction openNavMenu(i: number, at: { x: number; y: number }): void {\n  const t = tr(D.st)[i]; if (!t || t.kind !== \"nav\") return;\n  const paper = D.st.song.papers.find((p) => p.id === D.st.at.paper), why = paper ? navWhy(D.st.song, paper, D.st.at.part, t) : null;\n  const chips = t.what === \"ending\"\n    ? ENDINGS.map((n) => `<button class=\"btn ctx-chip${n.join() === (t.nums ?? [1]).join() ? \" is-on\" : \"\"}\" data-v=\"nums:${n.join(\",\")}\">${esc(endingLabel(n))}</button>`).join(\"\")\n    : JUMPS.map((w) => `<button class=\"btn ctx-chip${t.what === w ? \" is-on\" : \"\"}\" data-v=\"nav:${w}\" title=\"${esc(NAV_HELP[w])}\">${esc(NAV_LABEL[w])}</button>`).join(\"\");\n  ctxMenu(\"nav-menu\",\n    (why ? `<div class=\"ctx-hint\">\u4E0D\u8D77\u4F5C\u7528\uFF08\u753B\u7070\uFF09\uFF1A${esc(why)}</div>` : \"\") +\n    `<div class=\"ctx-hint ctx-what\">${esc(t.what === \"ending\" ? `\u623F\u5B50\uFF1A\u7B2C ${(t.nums ?? [1]).join(\"\u3001\")} \u904D\u8D70\u8FD9\u4E2A\u62EC\u53F7\uFF0C\u522B\u7684\u904D\u8DF3\u8FC7` : NAV_HELP[t.what])}</div>` +\n    `<div class=\"ctx-row\">${chips}</div><div class=\"ctx-sep\"></div><button class=\"btn ctx-item danger\" data-v=\"del\">\u5220\u9664</button>`,\n    at,\n    (v) => {\n      if (v === \"del\") { update(editMarkAt(D.st, i, null)); return; }\n      if (v.startsWith(\"nums:\")) { update(editMarkAt(D.st, i, { nums: v.slice(5).split(\",\").map(Number) })); return true; }\n      if (v.startsWith(\"nav:\")) { update(editMarkAt(D.st, i, { nav: v.slice(4) as Exclude<NavWhat, \"ending\"> })); return true; }\n    });\n}\nfunction openGrooveMenu(i: number, at: { x: number; y: number }): void {\n  const toks = tr(D.st), t = toks[i]; if (!t || t.kind !== \"groove\") return;\n  ui.close();\n  let end = toks.length; for (let j = i + 1; j < toks.length; j++) if (toks[j].kind === \"groove\") { end = j; break; }\n  view.setSpan({ from: i + 1, to: end });   // \u5B83\u7BA1\u7684\u97F3\u67D3\u8272\uFF08\u5230\u4E0B\u4E00\u4E2A\u98CE\u683C\u8BB0\u53F7 / \u8FD9\u5F20\u7EB8\u7ED3\u5C3E\uFF09\n  const style = grooveStyle(t.style), amount = t.amount ?? 1;\n  const meters = new Set([`${timeAt(toks, i).beats}/${timeAt(toks, i).beatType}`]);\n  for (let j = i + 1; j < end; j++) { const u = toks[j]; if (u.kind === \"time\") meters.add(`${u.beats}/${u.beatType}`); }\n  const hints: string[] = [];\n  if (!style && t.style !== \"none\") hints.push(`\u8FD9\u4E00\u7248\u4E0D\u8BA4\u8BC6\u300C${t.style}\u300D\uFF1A\u4E0D\u52A0\u8F7B\u91CD\uFF08\u6362\u4E00\u4E2A\u98CE\u683C\u5C31\u597D\uFF09`);\n  if (style && t.style !== \"none\") for (const m of meters) { const [b, bt] = m.split(\"/\").map(Number), d = describeGroove(style, b, bt); if (d) hints.push(`${grooveName(t.style)} ${m}\uFF1A${d}`); }   // \u8FD9\u4E2A\u98CE\u683C\u5728\u8FD9\u513F\u600E\u4E48\u8F7B\u91CD\uFF08\u4ECE\u6570\u636E\u73B0\u7B97\uFF09\n  if (style && t.style !== \"none\") {\n    const derived = [...meters].filter((m) => { const [b, bt] = m.split(\"/\").map(Number); return grooveTable(style, b, bt)?.derived; });\n    const none = [...meters].filter((m) => { const [b, bt] = m.split(\"/\").map(Number); return !grooveTable(style, b, bt); });\n    if (derived.length) hints.push(`${derived.join(\"\u3001\")} \u8FD9\u4E2A\u9884\u8BBE\u6CA1\u5217\uFF1A\u6309\u53E4\u5178\u7684\u5F3A\u5F31\u63A8${derived.some((m) => m.endsWith(\"/8\") && Number(m.split(\"/\")[0]) % 3 !== 0 && Number(m.split(\"/\")[0]) > 3) ? \"\uFF08\u51E0\u4E2A\u516B\u5206\u4E00\u7EC4\u8C31\u4E0A\u6CA1\u8BB0\uFF0C\u6309 2 + 2 + \u2026 + 3 \u63A8\uFF09\" : \"\"}`);\n    if (none.length) hints.push(`${none.join(\"\u3001\")}\uFF1A\u8FD9\u4E2A\u9884\u8BBE\u4E0D\u52A0\u8F7B\u91CD`);\n    if (style.swing) { const r = swingRatio(t.style, amount), [lo, hi] = style.swing.range;   // \u6447\u6446\uFF08v0.9.36\uFF09\uFF1A\u6309\u6570\u636E\u73B0\u7B97\uFF08\u7EAA\u5F8B\uFF1A\u505A\u5230\u4EC0\u4E48\u7A0B\u5EA6\u660E\u8BF4\uFF09\n      hints.push(`\u6447\u6446\uFF1A\u4E00\u62CD\u91CC\u524D\u4E00\u4E2A\u516B\u5206\u5360 ${Math.round(r * 100)}%\uFF08\u76F4 = 50%\uFF0C\u4E09\u8FDE\u97F3\u611F \u2248 67%\uFF1B\u5E45\u5EA6\u53EA\u653E\u5927 / \u7F29\u5C0F\u6BD4\u76F4\u7684\u591A\u51FA\u6765\u7684\u90A3\u4E00\u622A\uFF0C\u5939\u5728 ${Math.round(lo * 100)}\u2013${Math.round(hi * 100)}%\uFF09\u3002\u8FD9\u5F20\u7EB8\u4E0A\u6240\u6709\u6B4C\u624B\u4E00\u8D77\u6447\uFF08\u5C0F\u6708\u76F8\u4E5F\u662F\uFF0C\u4E0D\u5206\u8DDF\u591A\u5C11\uFF09\uFF1B\u5199\u6210\u8FDE\u97F3\u7684\u97F3\u30016/8 \u8FD9\u7C7B\u62CD\u53F7\u4E0D\u6447`); }\n    const paper = D.st.song.papers.find((p) => p.id === D.st.at.paper);\n    const who = D.st.song.parts.filter((p) => paper?.tracks[p.id]).map((p) => {\n      const f = followOf(style, grooveCategory(performerOf(activeInstrument(D.extras, p.role)?.engine)?.grooveCategory ?? null, activeGm(D.extras, p.role)));\n      return `${roleName(D.extras, p.role)} ${f > 0 ? `\u8DDF ${Math.round(f * 100)}%` : \"\u4E0D\u8DDF\"}`;\n    });\n    if (who.length) hints.push(`\u8FD9\u5F20\u7EB8\u4E0A\uFF1A${who.join(\" \u00B7 \")}\uFF08\u6309\u4E50\u5668\u7C7B\u522B\uFF0C\u9884\u8BBE\u7ED9\u7684\uFF09`);\n  }\n  const chips = GROOVE_STYLES.filter((x) => x.id !== \"none\").map((x) => `<button class=\"btn ctx-chip${t.style === x.id ? \" is-on\" : \"\"}\" data-v=\"style:${x.id}\" title=\"${esc(x.aliases.length ? `\u4E5F\u53EB ${x.aliases.join(\" / \")}` : x.name.zh)}\">${esc(x.name.en)}<small> \u00B7 ${esc(x.name.zh)}</small></button>`).join(\"\") +   // \u8C31\u4E0A\u5199\u82F1\u6587\uFF08user\u300C\u98CE\u683C\u540D\u7528\u82F1\u6587\u300D\uFF09\uFF0C\u6309\u94AE\u5E26\u4E2D\u6587\n    `<button class=\"btn ctx-chip${t.style === \"none\" ? \" is-on\" : \"\"}\" data-v=\"style:none\" title=\"\u4ECE\u8FD9\u513F\u8D77\u4E0D\u52A0\u62CD\u5B50\u8F7B\u91CD\">\u4E0D\u52A0\u8F7B\u91CD</button>`;\n  const amounts = [0.5, 1, 1.5, 2].map((a) => `<button class=\"btn ctx-chip${Math.abs(amount - a) < 1e-9 ? \" is-on\" : \"\"}\" data-v=\"amount:${a}\" title=\"\u5E45\u5EA6\uFF1A\u9884\u8BBE\u7684 ${a} \u500D\">\u00D7${a}</button>`).join(\"\");\n  const box = document.createElement(\"div\");\n  box.className = \"track-card ctx-menu groove-menu\"; box.setAttribute(\"role\", \"menu\");\n  box.innerHTML = `<div class=\"ctx-hint ctx-what\">\u98CE\u683C = \u62CD\u5B50\u8F7B\u91CD\uFF1A\u4ECE\u8FD9\u4E2A\u97F3\u8D77\u5230\u8FD9\u5F20\u7EB8\u7ED3\u5C3E\uFF0C\u6BCF\u4E2A\u97F3\u6309\u5B83\u843D\u5728\u5C0F\u8282\u91CC\u7684\u54EA\u4E00\u62CD\u8F7B\u4E00\u70B9\u6216\u91CD\u4E00\u70B9\uFF08\u50CF\u9F13\u624B\u7684\u5F8B\u52A8\uFF09\uFF1B\u5199\u4E86\u91CD\u97F3 / \u5F31\u5316\u7684\u97F3\u7167\u5199\u7684\u6765\u3002</div>` +\n    `<div class=\"ctx-row ctx-groove\">${chips}</div>` + (t.style !== \"none\" ? `<div class=\"ctx-row ctx-amount\">${amounts}</div>` : \"\") +\n    (grooveHasPhase(style) ? `<div class=\"ctx-row ctx-phase\"><button class=\"btn ctx-chip${t.shift ? \"\" : \" is-on\"}\" data-v=\"shift:0\" title=\"\u4E00\u8F6E\u7684\u7B2C\u4E00\u5C0F\u8282\u662F\u4E09\u51FB\u90A3\u8FB9\uFF08\u524D\u53E5\uFF09\uFF0C\u4ECE\u8FD9\u4E2A\u8BB0\u53F7\u90A3\u4E00\u5C0F\u8282\u8D77\u6570\">3-2</button><button class=\"btn ctx-chip${t.shift ? \" is-on\" : \"\"}\" data-v=\"shift:1\" title=\"\u9519\u5F00\u4E00\u5C0F\u8282\uFF1A\u4E24\u5C0F\u8282\u5BF9\u8C03\uFF0C\u7B2C\u4E00\u5C0F\u8282\u662F\u4E24\u51FB\u90A3\u8FB9\">2-3\uFF08\u9519\u5F00\u4E00\u5C0F\u8282\uFF09</button></div>` : \"\") +\n    hints.map((h) => `<div class=\"ctx-hint\">${esc(h)}</div>`).join(\"\") + `<div class=\"ctx-sep\"></div>` +\n    `<button class=\"btn ctx-item danger\" data-v=\"del\" title=\"\u53BB\u6389\u8FD9\u4E2A\u98CE\u683C\u8BB0\u53F7\uFF08\u8FD9\u513F\u8D77\u56DE\u5230\u524D\u4E00\u4E2A\u98CE\u683C\uFF1B\u8FD9\u5F20\u7EB8\u5F00\u5934 = \u4E0D\u52A0\uFF09\">\u5220\u9664</button>` +\n    `<div class=\"ctx-hint\">\u53EA\u7BA1\u8FD9\u5F20\u7EB8\uFF1A\u4ECE\u8FD9\u4E2A\u97F3\u5230\u8FD9\u5F20\u7EB8\u7ED3\u5C3E\uFF08\u6216\u4E0B\u4E00\u4E2A\u98CE\u683C\u8BB0\u53F7\uFF09\u3002\u957F\u6309\u62D6 = \u632A\u5230\u522B\u7684\u97F3\u4E0A</div>`;\n  document.body.append(box);\n  const w = box.offsetWidth, h = box.offsetHeight, m = 8;\n  let y = at.y + 6; if (y + h > innerHeight - m) y = at.y - h - 30;\n  box.style.left = `${Math.max(m, Math.min(at.x - w / 2, innerWidth - w - m))}px`; box.style.top = `${Math.max(m, Math.min(y, innerHeight - h - m))}px`;\n  const outside = (e: PointerEvent) => { if (!box.contains(e.target as Node)) close(); };\n  const close = () => { document.removeEventListener(\"pointerdown\", outside, true); box.remove(); ui.closed(close); view.setSpan(null); };\n  setTimeout(() => { if (box.isConnected) document.addEventListener(\"pointerdown\", outside, true); }, 0);\n  ui.open({ k: \"menu\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (!v) return;\n    close();\n    if (v === \"del\") update(editMarkAt(D.st, i, null));\n    else if (v.startsWith(\"style:\")) {   // \u6362\u4E86\u63A5\u7740\u770B\uFF08\u8BF4\u660E\u4F1A\u8DDF\u7740\u53D8\uFF09\uFF1B\u6362\u6210\u6CA1\u6709\u4E24\u5C0F\u8282\u4E00\u8F6E\u7684\u98CE\u683C = \u9519\u5F00\u4E00\u5C0F\u8282\u987A\u624B\u53BB\u6389\n      let n = editMarkAt(D.st, i, { style: v.slice(6) }); if (!grooveHasPhase(grooveStyle(v.slice(6)))) n = editMarkAt(n, i, { shift: false });\n      update(n); view.menuFor(i); return;\n    }\n    else if (v.startsWith(\"amount:\")) { update(editMarkAt(D.st, i, { amount: Number(v.slice(7)) })); view.menuFor(i); return; }\n    else if (v.startsWith(\"shift:\")) { update(editMarkAt(D.st, i, { shift: v === \"shift:1\" })); view.menuFor(i); return; }   // \u4E24\u5C0F\u8282\u4E00\u8F6E\uFF1A3-2 / 2-3\uFF08\u9519\u5F00\u4E00\u5C0F\u8282\uFF09\n    scoreEl.focus();\n  });\n}\nfunction openMarkMenu(i: number, at: { x: number; y: number }): void {\n  if (tr(D.st)[i]?.kind === \"groove\") { openGrooveMenu(i, at); return; }\n  if (tr(D.st)[i]?.kind === \"nav\") { openNavMenu(i, at); return; }\n  const t = tr(D.st)[i]; if (!t || (t.kind !== \"dyn\" && t.kind !== \"hairpin\")) return;\n  ui.close();\n  // \u5B83\u7BA1\u54EA\u51E0\u4E2A\u97F3\uFF08\u67D3\u5F3A\u8C03\u8272\uFF0C\u83DC\u5355\u6536\u8D77\u5C31\u6E05\uFF1Buser\u300C\u5982\u4F55\u4E0D\u6DF7\u6DC6\u7684\u641E\u6E05\u695A<\u5230\u5E95\u662F\u54EA\u91CC\u5F00\u59CB\u7684\uFF1F\u300D\uFF09\uFF1A\u6E10\u5F3A\u6E10\u5F31 = \u5230\u7EC8\u70B9\u4E3A\u6B62\uFF1B\u6E10\u5230 = \u4ECE\u4E0A\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u540E\u9762\u5230\u8FD9\u513F\uFF1B\n  //   \u522B\u7684\u529B\u5EA6\u8BB0\u53F7 = \u4ECE\u8FD9\u513F\u7BA1\u5230\u4E0B\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7 / \u6E10\u5F3A\u6E10\u5F31\n  const toks = tr(D.st), src = t.kind === \"dyn\" ? rampSource(toks, i) : \"none\";\n  const nextMark = (k: number) => { for (let j = k + 1; j < toks.length; j++) if (toks[j].kind === \"dyn\" || toks[j].kind === \"hairpin\") return j; return toks.length; };\n  view.setSpan(t.kind === \"hairpin\" ? { from: i + 1, to: nextMark(i) } : t.ramp && typeof src === \"number\" ? { from: src + 1, to: i } : { from: i + 1, to: nextMark(i) });\n  const box = document.createElement(\"div\");\n  box.className = \"track-card ctx-menu\"; box.setAttribute(\"role\", \"menu\");\n  const row = t.kind === \"dyn\"\n    ? ([\"ppp\", \"pp\", \"p\", \"mp\", \"mf\", \"f\", \"ff\", \"fff\"] as const).map((d) => `<button class=\"btn ctx-chip${t.value === d ? \" is-on\" : \"\"}\" data-v=\"dyn:${d}\" title=\"\u6539\u6210 ${d}\"><span class=\"smufl\">${DYN_MENU[d]}</span></button>`).join(\"\")\n    : ([\"cresc\", \"dim\"] as const).map((d) => `<button class=\"btn ctx-chip${t.dir === d ? \" is-on\" : \"\"}\" data-v=\"dir:${d}\" title=\"${d === \"cresc\" ? \"\u6E10\u5F3A\" : \"\u6E10\u5F31\"}\">${WEDGE_MENU[d]}</button>`).join(\"\");\n  // \u6E10\u5230\uFF08\u53EA\u7ED9\u529B\u5EA6\u8BB0\u53F7\uFF09\uFF1A\u5F00\u5173 + \u505A\u4E0D\u5230\u65F6\u8BF4\u4E3A\u4EC0\u4E48\uFF08\u7EAA\u5F8B\uFF1A\u753B\u7070 + \u660E\u8BF4\uFF09\n  const rampWhy = src === \"none\" ? \"\u8FD9\u5F20\u7EB8\u91CC\u524D\u9762\u6CA1\u6709\u529B\u5EA6\u8BB0\u53F7\uFF0C\u6CA1\u6709\u5730\u65B9\u6E10\u8FC7\u6765\" : src === \"hairpin\" ? \"\u4E2D\u95F4\u6709\u624B\u5199\u7684\u6E10\u5F3A\u6E10\u5F31\uFF0C\u6309\u624B\u5199\u7684\u8D70\" : \"\";\n  const offWhy = t.kind === \"dyn\" && dynOverridden(toks).has(i) ? `<div class=\"ctx-hint\">\u4E0D\u8D77\u4F5C\u7528\uFF08\u753B\u7070\uFF09\uFF1A\u540E\u9762\u90A3\u4E2A\u97F3\u662F\u5F3A\u540E\u5373\u5F31\uFF08fp\uFF09\u2014\u2014\u97F3\u5934\u6309 f\u3001\u968F\u540E\u843D\u5230 p\uFF0C\u4E4B\u540E\u4E5F\u662F p\uFF0C\u8FD9\u4E2A ${t.value} \u7BA1\u4E0D\u5230</div>` : \"\";\n  const rampRow = t.kind !== \"dyn\" ? \"\" : `<div class=\"ctx-sep\"></div><button class=\"btn ctx-item${t.ramp ? \" is-on\" : \"\"}\" data-v=\"ramp\"${rampWhy && !t.ramp ? \" disabled\" : \"\"} title=\"\u6E10\u5230\uFF1A\u4ECE\u8FD9\u5F20\u7EB8\u91CC\u4E0A\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\u90A3\u513F\u4E00\u8DEF\u6E10\u53D8\u5230\u8FD9\u91CC\uFF08\u8C31\u4E0A\u865A\u7EBF\u53D1\u5939\uFF09\uFF1B\u5173 = \u5230\u8FD9\u513F\u7A81\u53D8\">${t.ramp ? \"\u2713 \" : \"\"}\u6E10\u5230\uFF08\u4ECE\u4E0A\u4E00\u4E2A\u529B\u5EA6\u6E10\u53D8\u8FC7\u6765\uFF09</button>` +\n    (rampWhy ? `<div class=\"ctx-hint\">${t.ramp ? \"\u4E0D\u8D77\u4F5C\u7528\uFF1A\" : \"\"}${esc(rampWhy)}</div>` : \"\");\n  box.innerHTML = `${offWhy}<div class=\"ctx-row ctx-dyn\">${row}</div>${rampRow}<div class=\"ctx-sep\"></div>` +\n    `<button class=\"btn ctx-item danger\" data-v=\"del\" title=\"${t.kind === \"dyn\" ? \"\u53BB\u6389\u8FD9\u4E2A\u529B\u5EA6\u8BB0\u53F7\uFF08\u540E\u9762\u7684\u97F3\u56DE\u5230\u524D\u4E00\u4E2A\u529B\u5EA6\u8BB0\u53F7\uFF09\" : \"\u53BB\u6389\u8FD9\u4E2A\u6E10\u5F3A / \u6E10\u5F31\"}\">\u5220\u9664</button>` +\n    `<div class=\"ctx-hint\">\u957F\u6309\u62D6 = \u632A\u5230\u522B\u7684\u97F3\u4E0A</div>`;\n  document.body.append(box);\n  const w = box.offsetWidth, h = box.offsetHeight, m = 8;\n  let y = at.y + 6; if (y + h > innerHeight - m) y = at.y - h - 30;\n  box.style.left = `${Math.max(m, Math.min(at.x - w / 2, innerWidth - w - m))}px`; box.style.top = `${Math.max(m, Math.min(y, innerHeight - h - m))}px`;\n  const outside = (e: PointerEvent) => { if (!box.contains(e.target as Node)) close(); };\n  const close = () => { document.removeEventListener(\"pointerdown\", outside, true); box.remove(); ui.closed(close); view.setSpan(null); };   // \u6536\u8D77 = \u4E0D\u518D\u67D3\n  setTimeout(() => { if (box.isConnected) document.addEventListener(\"pointerdown\", outside, true); }, 0);\n  ui.open({ k: \"menu\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (!v) return;\n    close();\n    if (v === \"ramp\" && t.kind === \"dyn\") update(editMarkAt(D.st, i, { ramp: !t.ramp }));\n    else if (v === \"del\") update(editMarkAt(D.st, i, null));\n    else if (v.startsWith(\"dyn:\")) update(editMarkAt(D.st, i, { value: v.slice(4) as Dyn }));\n    else if (v.startsWith(\"dir:\")) update(editMarkAt(D.st, i, { dir: v.slice(4) as \"cresc\" | \"dim\" }));\n    scoreEl.focus();\n  });\n}\n/** \u9009\u533A\u83DC\u5355\uFF082026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u79FB\u8C03\u8F6C\u8C03\u548C\u957F\u5EA6\u4EE5\u53CA\u5176\u4ED6\u7684\u64CD\u4F5C\u4E0D\u8981\u7528keyboard\uFF0C\u800C\u662F\u4E00\u4E2A\u5C0F\u7684\u4E0A\u4E0B\u6587\u83DC\u5355\uFF0C\u952E\u76D8\u53EA\u505A\u7EAF\u7CB9\u7684\u6253\u8C31\u300D\uFF09\uFF1A\n *  \u9009\u533A\u6761\u300C\u64CD\u4F5C\u2026\u300D/ \u957F\u6309\u9009\u533A\u91CC\u7684\u97F3 / \u53F3\u952E\u9009\u4E2D\u7684\u97F3 \u2192 \u5F00\u5728\u90A3\u91CC\u3002\u79FB\u8C03\u3001\u65F6\u503C\u70B9\u4E86\u4E0D\u6536\uFF08\u53EF\u4EE5\u8FDE\u7740\u70B9\uFF09\uFF1B\u8F6C\u8C03\u5148\u6362\u6210\u8C03\u7684\u5217\u8868\uFF1B\u5176\u4F59\u70B9\u4E86\u5C31\u6536\u3002 */\nconst UNIT_SMUFL = [\"\\uE1DB\", \"\\uE1D9\", \"\\uE1D7\", \"\\uE1D5\", \"\\uE1D3\", \"\\uE1D2\"];   // \u540C pad \u7684\u957F\u77ED\u65CB\u94AE\nconst KEY_CIRCLE_MENU = [-6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6];\nfunction selBarAnchor(): { x: number; y: number } {\n  const r = document.querySelector<HTMLElement>('.sel-bar [data-v=\"transpose\"]')?.getBoundingClientRect();\n  return r ? { x: r.left, y: r.bottom } : { x: innerWidth / 2 - 100, y: 120 };\n}\nfunction openSelMenu(at: { x: number; y: number }): void {\n  if (!D.st.sel) return;\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"track-card ctx-menu sel-menu\"; box.setAttribute(\"role\", \"menu\");\n  const item = (v: string, label: string, title = \"\", cls = \"\") => `<button class=\"btn ctx-item ${cls}\" data-v=\"${v}\"${title ? ` title=\"${esc(title)}\"` : \"\"}>${label}</button>`;\n  const chip = (v: string, label: string, title = \"\") => `<button class=\"btn ctx-chip\" data-v=\"${v}\"${title ? ` title=\"${esc(title)}\"` : \"\"}>${label}</button>`;\n  const draw = (page: \"main\" | \"keys\") => {\n    if (page === \"keys\") {\n      const now = keyAt(tr(D.st), D.st.sel?.from ?? 0);\n      box.innerHTML = item(\"back\", \"\u2039 \u8F6C\u8C03\u5230\u2026\") + `<div class=\"ctx-grid\">` + KEY_CIRCLE_MENU.map((k) => chip(`mod:${k}`, `1=${KEY_LABEL[k]}`, k === now ? \"\u73B0\u5728\u7684\u8C03\" : \"\")).join(\"\") + `</div>`;\n      return;\n    }\n    box.innerHTML =\n      `<div class=\"ctx-row\"><span class=\"ctx-k\">\u79FB\u8C03</span>${chip(\"tr:1\", \"\u2191 \u534A\u97F3\")}${chip(\"tr:-1\", \"\u2193 \u534A\u97F3\")}${chip(\"tr:2\", \"\u2191 \u5168\u97F3\")}${chip(\"tr:-2\", \"\u2193 \u5168\u97F3\")}${chip(\"oct:1\", \"\u2191 \u516B\u5EA6\")}${chip(\"oct:-1\", \"\u2193 \u516B\u5EA6\")}</div>` +\n      item(\"keys\", \"\u8F6C\u8C03\u2026\", \"\u6574\u6BB5\u8F6C\u5230\u53E6\u4E00\u4E2A\u8C03\uFF1A\u97F3\u6309\u4E24\u4E2A\u4E3B\u97F3\u4E4B\u95F4\u7684\u97F3\u7A0B\u632A\uFF0C\u8C03\u53F7\u8DDF\u7740\u6362\") +\n      item(\"respell\", \"\u6309\u8C03\u53F7\u62FC\u5199\", \"\u97F3\u9AD8\u4E0D\u53D8\uFF1A\u8C03\u5185\u7684\u97F3\u6362\u6210\u8C03\u53F7\u91CC\u7684\u5199\u6CD5\uFF08A\u266D \u5728\u4E94\u4E2A\u5347\u53F7\u7684\u8C03\u91CC = G\u266F\uFF09\uFF0C\u8C03\u5916\u7684\u4E0D\u52A8\") +\n      `<div class=\"ctx-row\"><span class=\"ctx-k\">\u65F6\u503C</span>${chip(\"short\", \"\u00F72\")}${chip(\"long\", \"\u00D72\")}${chip(\"seldur\", `\u90FD\u6539\u6210 <span class=\"smufl\">${UNIT_SMUFL[D.st.input.unit]}</span>`, \"\u90FD\u6539\u6210\u957F\u77ED\u65CB\u94AE\u73B0\u5728\u90A3\u4E00\u6863\")}</div>` +\n      `<div class=\"ctx-row\"><span class=\"ctx-k\">\u6E05\u6389\u8BB0\u53F7</span>${chip(\"clr:phrase\", \"\u66F2\u7EA7\", \"\u529B\u5EA6\u5B57\u3001\u6E10\u5F3A\u6E10\u5F31\u3001\u6E10\u5230\u3001\u98CE\u683C\uFF08\u9009\u533A\u7B2C\u4E00\u4E2A\u97F3\u524D\u9762\u6302\u7740\u7684\u4E5F\u7B97\uFF09\")}${chip(\"clr:note\", \"\u97F3\u7EA7\", \"\u6F14\u594F\u6CD5\u3001\u97F3\u5934\uFF08\u91CD\u97F3 / \u7A81\u5F3A\u2026\uFF09\u3001\u97F3\u5185\u8D77\u4F0F\u3001\u8FDE\u7EBF\u3001\u547C\u5438\u3001\u6C14\u58F0\")}${chip(\"clr:all\", \"\u90FD\u6E05\", \"\u66F2\u7EA7 + \u97F3\u7EA7\uFF1B\u97F3\u3001\u6B4C\u8BCD\u3001\u8C03\u53F7\u62CD\u53F7\u901F\u5EA6\u3001\u53CD\u590D\u4E0D\u52A8\")}</div>` +\n      `<div class=\"ctx-sep\"></div>` + item(\"copy\", \"\u590D\u5236\") + item(\"cut\", \"\u526A\u5207\") + (clip ? item(\"paste\", \"\u7C98\u8D34\uFF08\u66FF\u6362\u9009\u4E2D\u7684\uFF09\") : \"\") + item(\"delete\", \"\u5220\u6389\", \"\", \"danger\");\n  };\n  draw(\"main\");\n  document.body.append(box);\n  const place = () => {\n    const w = box.offsetWidth, h = box.offsetHeight, m = 8;\n    let y = at.y + 8; if (y + h > innerHeight - m) y = at.y - h - 8;\n    box.style.left = `${Math.max(m, Math.min(at.x, innerWidth - w - m))}px`; box.style.top = `${Math.max(m, Math.min(y, innerHeight - h - m))}px`;\n  };\n  place();\n  const outside = (e: PointerEvent) => { if (!box.contains(e.target as Node)) close(); };\n  const close = () => { document.removeEventListener(\"pointerdown\", outside, true); box.remove(); ui.closed(close); };\n  setTimeout(() => { if (box.isConnected) document.addEventListener(\"pointerdown\", outside, true); }, 0);\n  ui.open({ k: \"menu\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (!v || !D.st.sel) return;\n    const cmd = (c: Command) => update(apply(D.st, c, performance.now()));\n    if (v.startsWith(\"tr:\")) { cmd({ k: \"transpose\", semis: Number(v.slice(3)) }); previewEdited(); return; }   // \u4E0D\u6536\uFF1A\u53EF\u4EE5\u8FDE\u7740\u70B9\n    if (v.startsWith(\"oct:\")) { cmd({ k: \"octave\", d: Number(v.slice(4)) }); previewEdited(); return; }\n    if (v === \"short\") { cmd({ k: \"selscale\", f: 0.5 }); return; }\n    if (v === \"long\") { cmd({ k: \"selscale\", f: 2 }); return; }\n    if (v === \"seldur\") { cmd({ k: \"seldur\" }); return; }\n    if (v.startsWith(\"clr:\")) { const n = clearMarks(D.st, v.slice(4) as \"phrase\" | \"note\" | \"all\"); if (n === D.st) info(\"\u9009\u4E2D\u7684\u8FD9\u4E00\u6BB5\u6CA1\u6709\u8FD9\u7C7B\u8BB0\u53F7\"); else update(n); close(); scoreEl.focus(); return; }\n    if (v === \"keys\") { draw(\"keys\"); place(); return; }\n    if (v === \"back\") { draw(\"main\"); place(); return; }\n    close();\n    if (v.startsWith(\"mod:\")) cmd({ k: \"modulate\", fifths: Number(v.slice(4)) });\n    else if (v === \"respell\") cmd({ k: \"respell\" });\n    else void selVerb(v as SelVerb);\n    updateChrome();\n  });\n}\n// \u4E50\u5668\u9875\uFF1A\u5360 #stage \u7684 main \u533A\uFF08\u548C\u4E50\u5668\u76EE\u5F55 / \u5F55\u97F3\u5BA4\u540C\u4E00\u4E2A\u4F4D\u7F6E\uFF09\uFF0Cpad \u7559\u5728\u65C1\u8FB9\u53EA\u5F39\u4E0D\u5199\u2014\u2014\u5F39\u7684\u5C31\u662F\u53F0\u4E0A\u8FD9\u4F4D\uFF0C\u6539\u4E86\u9A6C\u4E0A\u80FD\u8BD5\u3002\nconst instEl = document.createElement(\"div\");\ninstEl.className = \"inst-page\"; instEl.hidden = true;\n$(\"stage\").append(instEl);\n// \u627E\u4EBA\uFF1A\u4ECE\u8D27\u67B6\uFF08\u5BB6\u65CF\u97F3\u6E90\u5E93\uFF09\u6216\u81EA\u5DF1\u7684 .sf2 \u6587\u4EF6\u6311\u4E00\u628A\u7434 \u2192 \u53EA\u628A\u90A3\u4E00\u4EF6\u5207\u51FA\u6765\uFF08\u5951\u7EA6 \u00A710.2\uFF09\nlet instPicked: { name: string; bytes: Uint8Array; presets: Sf2PresetInfo[]; sel: string; library?: SoundEntry } | null = null;\ntype Chosen = { name: string; bank: number; program: number; note?: number; sfx?: SfxInfo; subset: Uint8Array; sha256: string; origin: GmCandidate[\"origin\"]; credit: { attribution: string[]; license: { name: string; url?: string; text?: string } } };\nconst UNKNOWN_TITLE = \"\u8FD9\u4E00\u7248\u51FA\u4E0D\u4E86\u58F0\uFF08\u522B\u7684\u8F6F\u4EF6\u539F\u6765\u7684\u4E50\u5668\uFF09\";   // \u8BA4\u5F97\u51FA\u7684\u5019\u9009\uFF1A\u8BF4\u660E\u7531\u63D2\u4EF6\u81EA\u62A5\uFF08description\uFF09\n/** \u5C0F\u6708\u76F8\u5531\u6CD5\u6838\u5FC3\u7684\u65CB\u94AE = \u4E50\u5668\u9875\u300C\u9AD8\u7EA7\u300D\uFF08\u5B58\u8FDB\u5019\u9009 defaults\uFF0Cby value\u3001\u8D70 undo\u3001\u6362\u4EBA\u8DDF\u4EBA\u8D70\uFF1B\u9ED8\u8BA4 = TSUKUYOMI_DEFAULTS\uFF09\u3002\n *  2026-10-15 user \u62CD\u677F\uFF1A\u9F50\u5E73\u9ED8\u8BA4\u5173\uFF08\u300C\u5E94\u8BE5leverage\u5C31\u662F\u9F50\u5E73\uFF0C\u6211\u89C9\u5F97\u4E0D\u5F00\u6CA1\u4EC0\u4E48\u5F71\u54CD\u5427\uFF0C\u9ED8\u8BA4\u4E0D\u5F00\u300D\uFF09\uFF0C\u65CB\u94AE\u8FDB\u9AD8\u7EA7\u8BBE\u7F6E\u6301\u4E45\u5316\uFF1B\u300C\u8FDE\u7EED\u300D\u4E5F\u653E\u7740\u8BD5\u3002\u7269\u7406\u610F\u4E49 = ai-docs/20261013-dango-c10-pop-probe.md \u00A76\u3002\n *  2026-10-17 \u6539\u56DE\u9F50\u5E73 0.8 + \u8FDE\u7EED\uFF08user\u300C\u90A3\u4E2A\u7834\u97F3\u662F\u56E0\u4E3A\u9ED8\u8BA4\u5173\u4E86\u9F50\u5E73\u5BFC\u81F4\u7684\u2026\u52A0\u4E0A\u8FDE\u7EED\u8FC7\u6E21\u7136\u540E\u7528\u90A3\u4E2A\u9ED8\u8BA4\u300D\u300C\u9F50\u5E73\u8FD8\u662F\u9ED8\u8BA4\u5F00\u5427\u3002\u7206\u97F3\u81F3\u5C11\u6BD4\u54CD\u5EA6\u4E0D\u53EF\u63A7\u597D\u300D\uFF1Bformat/performance.ts TSUKUYOMI_DEFAULTS\uFF09\u3002 */\nlet instAdvOpen = false;   // \u4E50\u5668\u9875\u300C\u9AD8\u7EA7\u300D\u6298\u53E0\u5F00\u7740\u6CA1\uFF08\u91CD\u753B\u4FDD\u6301\uFF09\nfunction openInstPage(): void {\n  ui.close();\n  if (finder.isOpen) closeFinder(false);\n  ui.setPage({ k: \"inst\" }); instPicked = null; scoreEl.hidden = true; instEl.hidden = false;\n  ws.tryout = padLocked(ui.page); showPad(true); padEl.classList.add(\"is-locked\"); pad.clearHeld(); pad.render();\n  drawInst(); updateChrome();\n  instEl.querySelector<HTMLElement>(\".ip-body\")?.scrollTo({ top: 0 });\n}\nfunction closeInstPage(): void {\n  if (!instShown()) return;\n  commitRoleName();\n  ui.setPage({ k: \"score\" }); instPicked = null; instEl.hidden = true; ws.tryout = false; applyWorkspace();   // \u4E50\u5668\u9875\u548C\u76EE\u5F55\u4E92\u65A5\uFF1A\u5173\u4E50\u5668\u9875\u65F6\u76EE\u5F55\u4E00\u5B9A\u6CA1\u5F00\n  padEl.classList.remove(\"is-locked\"); pad.clearHeld(); pad.render(); scoreEl.hidden = false; view.render(); renderTitle(); updateChrome(); scoreEl.focus();\n}\nconst setRole = (name: string, sound?: string) => {\n  const n = name.trim(); if (!n || (n === roleName(D.extras, curRole()) && (!sound || sound === roleSound(D.extras, curRole())))) return;\n  updateExtras(withRoleName(D.extras, curRole(), n, D.st.song.hum, sound), { kind: \"lounge\", label: `\u89D2\u8272\u6539\u540D\uFF1A${n}` }); view.render();\n};\nconst commitRoleName = () => { const inp = instEl.querySelector<HTMLInputElement>(\"#roleIn\"); if (inp && !instEl.hidden) setRole(inp.value); };\nconst fileInput = (accept: string, onFile: (f: File) => Promise<void>) => {\n  const inp = document.createElement(\"input\"); inp.type = \"file\"; inp.accept = accept; inp.hidden = true; document.body.append(inp);\n  inp.addEventListener(\"change\", async () => { const f = inp.files?.[0]; inp.remove(); if (f) await onFile(f); });\n  inp.click();\n};\nasync function pickOfficial(id: string): Promise<void> {\n  const e = SOUNDS[id];\n  try {\n    const bytes = await sources.fetchSound(e, (done) => progress(`\u4E0B\u8F7D ${e.name} ${Math.round((done / e.bytes) * 100)}%`));\n    progress(\"\");\n    const presets = listSf2Presets(bytes), first = presets.find((p) => p.bank === 0) ?? presets[0];\n    instPicked = { name: e.name, bytes, presets, sel: `${first.bank}:${first.program}`, library: e }; drawInst();\n  } catch (err) { progress(\"\"); showError((err as Error).message); }\n}\nconst pickFile = () => fileInput(\".sf2,audio/x-soundfont\", async (f) => {\n  try {\n    const bytes = new Uint8Array(await f.arrayBuffer()), presets = listSf2Presets(bytes);\n    if (!presets.length) throw new Error(\"\u91CC\u9762\u6CA1\u6709\u4E50\u5668\");\n    const first = presets.find((p) => p.bank === 0) ?? presets[0];\n    instPicked = { name: f.name, bytes, presets, sel: `${first.bank}:${first.program}` }; drawInst();\n  } catch (e) { showError(`\u8BFB\u4E0D\u4E86\u300C${f.name}\u300D\uFF1A${(e as Error).message}`); }\n});\n// \u5F31\u5F15\u7528\u627E\u4E0D\u5230\u6574\u5305\u65F6\uFF1A\u4EBA\u628A\u6587\u4EF6\u7ED9\u5B83\uFF08\u6838\u6574\u5305 sha256\uFF1B\u5BF9\u4E86\u5C31\u7559\u5728\u8BBE\u5907\u4E0A\uFF09\nconst findBankFile = (id: string) => {\n  const g = gmCandidates(D.extras, curRole()).find((c) => c.id === id); if (!g) return;\n  fileInput(\".sf2,audio/x-soundfont\", async (f) => {\n    try {\n      const bytes = new Uint8Array(await f.arrayBuffer()), sha = await sha256Hex(bytes);\n      if (sha !== g.origin.fileSha256) throw new Error(`\u300C${f.name}\u300D\u4E0D\u662F\u6B4C\u91CC\u8BB0\u7684\u90A3\u4E2A\u300C${g.origin.name}\u300D\uFF08sha256 ${sha.slice(0, 12)}\u2026 \u2260 ${g.origin.fileSha256.slice(0, 12)}\u2026\uFF09`);\n      await rememberSound(sha, bytes, true); sources.session.drop(g.subsetSha256);\n      await sources.resolveGmBytes(g); info(`\u627E\u5230\u4E86\uFF1A\u300C${g.name}\u300D\u80FD\u54CD\u4E86`); drawInst();\n    } catch (e) { showError((e as Error).message); }\n  });\n};\n// \u9ED8\u8BA4\u5F31\u5F15\u7528\uFF082026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u6211\u540E\u6094\u81EA\u52A8embed\u97F3\u6E90\u4E86\uFF0C\u6539\u6210\u5F31\u5F15\u7528\u5427\uFF0Capp\u53EF\u4EE5\u81EA\u5DF1\u627E\u5417\u300D\uFF09\uFF1A\u6B4C\u91CC\u53EA\u8BB0\u6765\u6E90 + \u5B50\u96C6 sha256\u3002\n//   \u8D27\u67B6\u4E0A\u7684\uFF08\u97F3\u6E90\u5E93\uFF09= \u6574\u5305\u5728\u8BBE\u5907\u7F13\u5B58 / \u97F3\u6E90\u5E93\u91CC\u627E\u5F97\u5230\uFF1B\u81EA\u5DF1\u7684 .sf2 = \u628A\u5207\u51FA\u6765\u7684\u5B50\u96C6\u7559\u8FDB\u8BBE\u5907\u7684\u97F3\u6E90\u7F13\u5B58\uFF08\u51E0 MB\uFF09\uFF0C\u4E0B\u6B21\u6253\u5F00 app \u81EA\u5DF1\u627E\u5F97\u5230\u3002\n//   \u8981\u6B4C\u81EA\u5DF1\u5E26\u7740\u58F0\u97F3\uFF08\u53D1\u7ED9\u522B\u4EBA\uFF09= \u6587\u4EF6\u83DC\u5355\u300C\u5168\u90E8\u6253\u5305\u8FDB\u6B4C\u300D\u6216\u5BFC\u51FA\u300C\u6253\u5305\u97F3\u6E90\u300D\u7684\u526F\u672C\u3002\nasync function finishAdd(c: Chosen): Promise<void> {\n  updateExtras(withSf2Candidate(D.extras, curRole(), { ...c, embed: false }, D.st.song.hum), { kind: \"lounge\", label: `\u300C${roleName(D.extras, curRole())}\u300D\u6362\u6210\uFF1A${c.name}` });\n  sources.session.keep(c.sha256, c.subset);   // \u672C\u6B21\u6253\u5F00\u91CC\u76F4\u63A5\u80FD\u54CD\n  instPicked = null; sound.allOff(); void prepareBank(); view.render(); renderTitle(); drawInst();\n  if (!c.origin.library) {\n    await rememberSound(c.sha256, c.subset, true);\n    if (!(await isSoundPersisted(c.sha256))) showError(`\u300C${c.name}\u300D\u7684\u58F0\u97F3\u6CA1\u80FD\u7559\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\uFF08\u7A7A\u95F4\u4E0D\u591F\uFF0C\u6216\u8FD9\u4E2A\u6D4F\u89C8\u5668\u4E0D\u8BA9\u5B58\uFF09\uFF1A\u8FD9\u6B21\u6253\u5F00\u91CC\u80FD\u54CD\uFF1B\u4E0B\u6B21\u8981\u4ECE\u300C${c.origin.name}\u300D\u6587\u4EF6\u627E\u3002\u60F3\u8BA9\u6B4C\u81EA\u5DF1\u5E26\u7740\u5B83\uFF1A\u6587\u4EF6\u83DC\u5355\u300C\u5168\u90E8\u6253\u5305\u8FDB\u6B4C\u300D\u3002`);\n  }\n}\nasync function addPicked(): Promise<void> {\n  const picked = instPicked; if (!picked) return;\n  const [bank, program] = picked.sel.split(\":\").map(Number), preset = picked.presets.find((p) => p.bank === bank && p.program === program);\n  if (!preset) return;\n  const name = instEl.querySelector<HTMLInputElement>(\"#sfName\")?.value.trim() || preset.name;\n  try {\n    const subset = subsetSf2(picked.bytes, [{ bank, program }]), inf = sf2Info(picked.bytes);\n    const [sha256, fileSha256] = await Promise.all([sha256Hex(subset), sha256Hex(picked.bytes)]);\n    // \u7F72\u540D / \u8BB8\u53EF\u8BC1\u5FEB\u7167 by value\uFF1A\u8D27\u67B6\u4E0A\u7684\u4ECE\u76EE\u5F55\u6761\u76EE\u6284\uFF08\u540D\u5B57 + \u51FA\u5904 + \u8BB8\u53EF\u8BC1\u540D\uFF09\uFF0C\u81EA\u5DF1\u62D6\u8FDB\u6765\u7684\u53EA\u6709 INFO \u5757\u91CC\u7684\u5B57\u3001\u8BB8\u53EF\u8BC1 unknown\n    const lib = picked.library;\n    const credit = lib\n      ? { attribution: [lib.attribution], license: { name: lib.license.name, url: lib.homepage ?? lib.source, text: inf.comment } }\n      : { attribution: [inf.name, inf.engineer, inf.copyright].filter((x): x is string => !!x), license: { name: \"unknown\", text: inf.comment } };\n    // GS \u7684\u97F3\u6548\uFF1A\u548C\u627E\u4EBA\u89C6\u56FE\u4E0A\u573A\u4E00\u6837\u9ED8\u8BA4\u56FA\u5B9A\u539F\u901F\uFF08sampleKey \u53EA\u5BF9 GS \u6210\u7ACB\uFF1B\u9F13\u7EC4 bank 128 \u7684\u9884\u8BBE\u5728 GS \u91CC\u662F\u6574\u5957\u9F13\uFF0C\u4E0D\u662F\u5355\u4EF6\uFF0C\u4E0D\u5E26 note\uFF09\n    const keys = lib?.id === GS_LIBRARY_ID ? gsKeyArgs(catalogNow ??= await loadCatalog(new URL(import.meta.url)), bank, program) : {};\n    await finishAdd({ name, bank, program, ...keys, subset, sha256, origin: { name: picked.name, fileSha256, bytes: picked.bytes.length, ...(lib ? { library: lib.id } : {}) }, credit });\n  } catch (e) { showError(`\u52A0\u4E0D\u8FDB\u6765\uFF1A${(e as Error).message}`); }\n}\nfunction pickerHtml(): string {\n  const picked = instPicked; if (!picked) return \"\";\n  const banks = [...new Set(picked.presets.map((p) => p.bank))].sort((a, b) => a - b);\n  const label = (b: number) => (b === 128 ? \"\u9F13\u7EC4\" : b === 0 ? \"\u4E50\u5668\" : `\u53D8\u4F53\uFF08bank ${b}\uFF09`);\n  const cur = picked.presets.find((p) => `${p.bank}:${p.program}` === picked.sel);\n  return `<div class=\"ip-picker\"><div class=\"ip-sub\">${esc(picked.name)}\uFF08${picked.presets.length} \u4EF6\uFF09</div><select id=\"sfSel\" class=\"role-sel\">` +\n    banks.map((b) => `<optgroup label=\"${label(b)}\">${picked.presets.filter((p) => p.bank === b).map((p) => `<option value=\"${p.bank}:${p.program}\"${`${p.bank}:${p.program}` === picked.sel ? \" selected\" : \"\"}>${String(p.program).padStart(3, \"0\")} ${esc(p.name)}</option>`).join(\"\")}</optgroup>`).join(\"\") +\n    `</select><label class=\"role-name\">\u53EB<input id=\"sfName\" class=\"role-in\" type=\"text\" spellcheck=\"false\" autocomplete=\"off\" value=\"${esc(cur?.name ?? \"\")}\" /></label>` +\n    `<div class=\"ip-btns\"><button class=\"btn primary\" data-v=\"sf2:add\">\u52A0\u8FDB\u6765\u3001\u9009\u5B83</button><button class=\"btn\" data-v=\"sf2:cancel\">\u7B97\u4E86</button></div></div>`;\n}\n/** \u4E50\u5668\u9875\u7684\u5185\u5BB9\uFF08\u6BCF\u6B21\u6539\u5B8C\u6574\u9875\u91CD\u753B\uFF1B\u8F93\u5165\u6846\u91CC\u6B63\u5728\u6253\u7684\u5B57\u4E0D\u53D7\u5F71\u54CD\u2014\u2014\u53EA\u6709\u63D0\u4EA4\u65F6\u624D\u6539 extras\uFF09\u3002 */\n/** \u63D2\u4EF6\u81EA\u62A5\u53C2\u6570\u884C\u8981\u7684\u4E0A\u4E0B\u6587\uFF08ADR-0004 \u00A72.5\uFF09\uFF1A\u4F11\u606F\u5BA4 / \u89D2\u8272 / \u54FC\u7684\u5B57 / \u97F3\u4E50\u76EE\u5F55\uFF08\u6CA1\u8F7D = null\uFF09/ \u6392\u7248\u5C0F\u5DE5\u5177\u3002 */\nfunction inspectorCtx(role: string): InspectorCtx {\n  return { extras: D.extras, role, hum: D.st.song.hum, catalog: catalogNow, esc, chip, dynTable: (L) => dynTable(activePerfSpec(D.extras, role), L) };\n}\nfunction drawInst(): void {\n  if (!instShown()) return;\n  const eng = engineNow(), h = D.st.song.hum, role = curRole(), rn = roleName(D.extras, role), rs = roleSound(D.extras, role), aid = activeId(D.extras, role);\n  const gms = new Map(gmCandidates(D.extras, role).map((g) => [g.id, g])), active = gms.get(aid), who = activeCandidateName(D.extras, role) ?? \"\uFF08\u6CA1\u4EBA\u4E0A\u573A\uFF09\";\n  const chipTitle = (c: { id: string; engine: Engine }) => { const g = gms.get(c.id); if (!g) return performerOf(c.engine)?.description ?? UNKNOWN_TITLE; return g.bytes ? `SoundFont ${g.bank}:${g.program}\uFF0C\u58F0\u97F3\u5D4C\u5728\u6B4C\u91CC\uFF08${sizeText(g.bytes.length)}\uFF09` : g.path ? \"\u58F0\u97F3\u6CA1\u968F\u8FD9\u9996\u6B4C\u5E26\u6765\" : `\u5F31\u5F15\u7528\uFF1A\u58F0\u97F3\u4E0D\u5728\u6B4C\u91CC\uFF0C\u7528\u65F6\u4ECE\u300C${g.origin.name}\u300D\u627E`; };\n  const status = !active ? \"\" : active.bytes ? `<div class=\"cand-status\">\u58F0\u97F3\u5D4C\u5728\u6B4C\u91CC\uFF08${sizeText(active.bytes.length)}\uFF09${active.origin.library ? `\uFF0C\u6765\u81EA\u5BB6\u65CF\u97F3\u6E90\u5E93\u7684 ${esc(active.origin.name)}` : `\uFF0C\u6765\u81EA ${esc(active.origin.name)}`}</div>`\n    : active.path ? `<div class=\"cand-status\">\u58F0\u97F3\u6CA1\u968F\u8FD9\u9996\u6B4C\u5E26\u6765\uFF0C\u6240\u4EE5\u6CA1\u4EBA\u4E0A\u573A\u2014\u2014\u6362\u4E00\u4E2A\u300C\u8C01\u6765\u6F14\u300D</div>`\n    : ((found) => `<div class=\"cand-status\">\u5F31\u5F15\u7528\uFF1A\u6B4C\u91CC\u4E0D\u5E26\u58F0\u97F3\uFF0C\u7528\u65F6\u4ECE\u300C${esc(active.origin.name)}\u300D\u627E\uFF08${found ? \"\u672C\u6B21\u5DF2\u627E\u5230\" : \"\u5BB6\u65CF\u97F3\u6E90\u5E93 / \u8BBE\u5907\u7F13\u5B58 / \u4F60\u7684\u6587\u4EF6\"}\uFF09${found ? \"\" : `<button class=\"btn\" data-v=\"find:${esc(active.id)}\">\u627E\u6587\u4EF6\u2026</button>`}</div>`)(sources.session.has(active.subsetSha256));\n  const labels = partLabels(D.st.song, D.extras), onPaper = new Set(Object.keys(D.st.song.papers.find((p) => p.id === D.st.at.paper)?.tracks ?? {}));\n  const parts = D.st.song.parts.map((p, k) => ({ p, label: labels[k] })).filter((x) => onPaper.has(x.p.id));\n  const cal = activeCalibrationDb(D.extras, role), tr = activeTranspose(D.extras, role);\n  const row = (k: string, v: string, note = \"\") => `<span class=\"ip-k\">${k}</span><div class=\"ip-v\"><div class=\"ip-ctl\">${v}</div>${note ? `<div class=\"ip-note\">${note}</div>` : \"\"}</div>`;\n  // \u8FD9\u4F4D\u600E\u4E48\u6F14\uFF1A\u901A\u7528\u7684\u884C\uFF08\u54CD\u5EA6 / \u97F3\u548C\u97F3\u4E4B\u95F4 / \u529B\u5EA6\u8BB0\u53F7 dB \u8868 / \u54FC\u7684\u5B57\uFF09\u6309\u80FD\u529B\u5B57\u6BB5\u6446\uFF1B\u8FD9\u4F4D\u81EA\u5DF1\u7684\u884C\uFF08\u529B\u5EA6 / \u97F3\u6548 / \u4FEE\u516B\u5EA6 / \u516B\u5EA6 / \u5531\u6CD5\u65CB\u94AE / \u5206\u6BB5\u5531\u2026\uFF09\u7531\u63D2\u4EF6\u81EA\u62A5\n  //   \uFF08ADR-0004 \u00A72.5\u300C\u69FD\u65C1\u7684\u53C2\u6570\u884C\u7531\u63D2\u4EF6\u81EA\u62A5\uFF0C\u4E0D\u662F main.ts \u5199\u6B7B\u300D\uFF1B2026-10-15 \u5200 5 \u4E4B\u4E00\uFF09\u3002\n  const plug = performerOf(eng), ictx = inspectorCtx(role);\n  const own = plug?.inspector?.(ictx) ?? [], ownMain = own.filter((x) => !x.place), ownAdv = own.filter((x) => x.place === \"adv\"), ownTail = own.filter((x) => x.place === \"tail\");\n  const rowOf = (x: { label: string; control: string; note?: string }) => row(x.label, x.control, x.note ?? \"\");\n  const how =\n    (plug ? row(\"\u54CD\u5EA6\", `<b class=\"ip-val\">${fmtDb(cal)}</b><button class=\"btn\" data-v=\"cal:-1\" title=\"\u8FD9\u4F4D\u6F14\u594F\u8005\u5C0F\u58F0 1 dB\">\u22121 dB</button><button class=\"btn\" data-v=\"cal:1\" title=\"\u5927\u58F0 1 dB\">+1 dB</button>${cal !== DEFAULT_CALIBRATION_DB ? `<button class=\"btn\" data-v=\"cal:def\" title=\"\u56DE\u5230\u9ED8\u8BA4 ${fmtDb(DEFAULT_CALIBRATION_DB)}\">\u9ED8\u8BA4</button>` : \"\"}`,\n      `\u8FD9\u4F4D\u6F14\u594F\u8005\u81EA\u5DF1\u7684\u97F3\u91CF\uFF1A\u9ED8\u8BA4\u90FD\u662F ${fmtDb(DEFAULT_CALIBRATION_DB)}\uFF08\u5C0F\u6708\u76F8\u4E5F\u662F\uFF09\uFF0C\u51E0\u4E2A\u58F0\u90E8\u53E0\u5728\u4E00\u8D77\u624D\u4E0D\u9876\u5230\u5929\u82B1\u677F\u3001\u4E0D\u628A\u58F0\u97F3\u538B\u53D8\u6837\uFF1B\u6DF7\u97F3\u53F0\u7684\u63A8\u5B50\u53E6\u7B97`) : \"\") +\n    // \u8FDE\u65AD\u7684\u5E95\u8272\uFF082026-10-08\uFF0Cuser\u300C\u8FDE\u65AD \u9884\u8BBE \u90FD\u540C\u610F\u300D\uFF09\uFF1A\u4E0D\u5199\u8BB0\u53F7\u7684\u97F3\u4E4B\u95F4\u7559\u591A\u5927\u7F1D\uFF08\u6BEB\u79D2\uFF09\uFF1B\u6309 GM \u97F3\u8272\u5BB6\u65CF\u7ED9\u7684\u9ED8\u8BA4\u53EA\u662F\u8D77\u70B9\uFF0C\u597D\u4E0D\u597D\u542C\u5F52\u8033\u6735\u3002\n    //   \u6708\u8BFB\u8FD8\u4E0D\u8BA4\uFF08\u5531\u6CD5\u6838\u5FC3\u7684\u8FDE / \u65AD\u662F\u7B2C 3 \u6B65\uFF09\uFF1A\u4E0D\u7ED9\u8FD9\u4E00\u884C\uFF0C\u8C31\u4E0A\u7684\u8FDE\u7EBF / \u4FDD\u6301\u7167\u89C4\u77E9\u753B\u7070\n    (plug?.sound === \"notes\" ? ((gap, d) => row(\"\u97F3\u548C\u97F3\u4E4B\u95F4\", `<b class=\"ip-val\">${Math.round(gap * 1000)} ms</b>` +\n      `<button class=\"btn\" data-v=\"gap:-0.01\" title=\"\u7F1D\u5C0F 10 ms\uFF08\u66F4\u8FDE\uFF09\">\u221210</button><button class=\"btn\" data-v=\"gap:0.01\" title=\"\u7F1D\u5927 10 ms\uFF08\u66F4\u65AD\uFF09\">+10</button>` +\n      (d && Math.abs(gap - d.gapSec) > 1e-9 ? `<button class=\"btn\" data-v=\"gap:def\" title=\"\u56DE\u5230\u9ED8\u8BA4 ${Math.round(d.gapSec * 1000)} ms\">\u9ED8\u8BA4</button>` : \"\"),\n      `\u4E0D\u5199\u8BB0\u53F7\u7684\u97F3\u548C\u4E0B\u4E00\u4E2A\u97F3\u4E4B\u95F4\u7559\u7684\u7F1D\uFF1A0 = \u8FDE\u7740\u3002${d ? `${esc(d.label)}\uFF1A\u9ED8\u8BA4 ${Math.round(d.gapSec * 1000)} ms\uFF08\u97F3\u4E50\u76EE\u5F55\u7ED9\u7684\uFF0C\u6309\u97F3\u8272\u9010\u4E2A\uFF09\u3002` : \"\"}\u8FDE\u7EBF\uFF08\u8FDE\u594F\uFF09\u3001\u4FDD\u6301\u7684\u97F3\u4E0D\u7559\u7F1D\uFF1B\u547C\u5438 = \u8FD9\u91CC\u65AD\u5F00\uFF1B\u8DF3\u97F3\u53E6\u7B97`))(activePerfSpec(D.extras, role).gapSec, gapDefaultOf(role)) : \"\") +\n    ownMain.map(rowOf).join(\"\") +\n    // \u6708\u8BFB / \u5143\u97F3\u7248\uFF1A\u6CA1\u6709\u300C\u6309\u4E0B\u53BB\u7684\u529B\u5EA6\u300D\uFF0C\u529B\u5EA6\u8BB0\u53F7 = \u97F3\u91CF\u66F2\u7EBF\uFF1B\u540C\u4E00\u4E2A\u4F4D\u7F6E\u6446\u540C\u4E00\u5F20\u8868\uFF08v0.9.23\uFF0C\u65B9\u4FBF\u548C\u4E50\u5668\u7684\u90A3\u5F20\u5BF9\u6BD4\uFF09\n    (plug?.dynamics === \"gain\" ? row(\"\u529B\u5EA6\u8BB0\u53F7\", \"\", `\u529B\u5EA6\u8BB0\u53F7 = \u97F3\u91CF\uFF08\u76F8\u5BF9 mf\uFF0CdB\uFF09\uFF1B\u4E00\u6863 6 dB \u2248 \u632F\u5E45\u7FFB\u500D / \u51CF\u534A\u3002\u529B\u5EA6\u8BB0\u53F7\u6CA1\u6709\u6807\u51C6\u7684 dB\uFF0C\u662F\u76F8\u5BF9\u7684\uFF1A\u6BCF\u4F4D\u6F14\u594F\u8005\u81EA\u5DF1\u5E26\u4E00\u5F20\u8868\uFF0C\u8FD9\u662F\u8FD9\u4F4D\u7684\uFF1A${dynTable(activePerfSpec(D.extras, role), null)}`) : \"\") +\n    ((plug?.lyrics ?? \"none\") !== \"none\" ? row(\"\u54FC\u7684\u5B57\", HUMS.map(([v, l]) => chip(`hum:${v}`, l, h === v)).join(\"\"), \"\u6CA1\u5199\u6B4C\u8BCD\u7684\u97F3\u5531\u4EC0\u4E48\uFF08\u6574\u9996\u6B4C\u4E00\u4E2A\uFF09\") : \"\") +\n    (ownAdv.length ? `<details class=\"ip-adv\"${instAdvOpen ? \" open\" : \"\"}><summary>\u9AD8\u7EA7\uFF1A\u5531\u6CD5\u6838\u5FC3\u7684\u65CB\u94AE</summary>${ownAdv.map(rowOf).join(\"\")}</details>` : \"\") +\n    ownTail.map(rowOf).join(\"\") +\n    (!plug ? row(\"\", \"\", \"\u8FD9\u4E00\u7248\u51FA\u4E0D\u4E86\u58F0\uFF08\u522B\u7684\u8F6F\u4EF6\u539F\u6765\u7684\u4E50\u5668\uFF09\uFF1A\u6362\u4E00\u4E2A\u300C\u8C01\u6765\u6F14\u300D\") : \"\");\n  // \u6574\u9875\u91CD\u753B\u4F1A\u6362\u6389\u6EDA\u52A8\u7684\u90A3\u4E00\u5C42\uFF08.ip-body\uFF09\uFF1A\u8BB0\u4E0B\u6EDA\u5230\u54EA\u3001\u753B\u5B8C\u653E\u56DE\u53BB\uFF08user 2026-10-17\u300C\u6211\u8C03\u6B4C\u624B\u8BBE\u7F6E\u7684\u65F6\u5019\u6BCF\u8C03\u4E00\u4E0B\u9875\u9762\u90FD\u4F1A\u5F39\u56DE\u9876\u7AEF\u300D\uFF09\uFF1B\u521A\u6253\u5F00\u90A3\u4E00\u4E0B\u7531 openInstPage \u6EDA\u56DE\u9876\n  const keepScroll = instEl.querySelector<HTMLElement>(\".ip-body\")?.scrollTop ?? 0;\n  instEl.innerHTML =\n    `<div class=\"ip-bar\"><button class=\"btn\" data-v=\"back\" title=\"\u56DE\u5230\u8C31\uFF08Esc\uFF09\">\u2190 \u8C31</button><span class=\"ip-title\">\u4E50\u5668</span>` +\n    (parts.length > 1 ? `<select class=\"ip-part\" title=\"\u6362\u4E00\u4E2A\u58F0\u90E8\">${parts.map((x) => `<option value=\"${esc(x.p.id)}\"${x.p.id === D.st.at.part ? \" selected\" : \"\"}>${esc(x.label)}</option>`).join(\"\")}</select>` : `<span class=\"ip-part-one\">${esc(parts[0]?.label ?? rn)}</span>`) +\n    `<span class=\"ip-gap\"></span><button class=\"btn finder-pad ip-pad${padEl.hidden ? \"\" : \" is-on\"}\" data-v=\"pad\" title=\"\u8BD5\u542C\u952E\u76D8\uFF1A\u5F00 / \u5173\"><svg class=\"ico\"><use href=\"#grid\"/></svg><span>\u952E\u76D8</span></button></div>` +\n    `<div class=\"ip-body\"><div class=\"ip-cols\">` +\n    `<section class=\"ip-card\"><h3>\u8FD9\u4E2A\u58F0\u90E8\u662F\u4EC0\u4E48<small>\u8C31\u4E0A\u5199\u5B83\u7684\u540D\u5B57</small></h3><select id=\"roleSel\" class=\"role-sel\">` +\n      (ROLE_PRESETS.some((r) => r.name === rn && r.sound === rs) ? \"\" : `<option value=\"\" selected>${esc(rn)}\uFF08\u81EA\u5DF1\u5199\u7684\uFF09</option>`) +\n      ROLE_GROUPS.map((g) => `<optgroup label=\"${g.group}\">${g.items.map((r) => `<option value=\"${esc(`${r.sound}|${r.name}`)}\"${r.name === rn && r.sound === rs ? \" selected\" : \"\"}>${esc(r.name)} \u2014 ${r.zh}</option>`).join(\"\")}</optgroup>`).join(\"\") +\n      `</select><label class=\"role-name\">\u8C31\u4E0A\u5199<input id=\"roleIn\" class=\"role-in\" type=\"text\" spellcheck=\"false\" autocomplete=\"off\" value=\"${esc(rn)}\" /></label><div class=\"role-sound\">MusicXML\uFF1A<code>${esc(rs)}</code></div></section>` +\n    `<section class=\"ip-card\"><h3>\u8C01\u6765\u6F14<small>\u6F14\u594F\u8005\u548C\u4ED6\u624B\u91CC\u7684\u7434\uFF1B\u540D\u5B57\u4E0D\u4E0A\u8C31</small></h3><div class=\"ip-cands\">` +\n      candidates(D.extras, role).map((c) => chip(`cand:${c.id}`, !performerOf(c.engine) ? `${esc(c.name)}\uFF08\u6CA1\u4EBA\u80FD\u6F14\uFF09` : esc(c.name), aid === c.id, chipTitle(c)) +\n        (aid !== c.id && (performerOf(c.engine)?.removable ?? true) ? `<button class=\"btn cand-del\" data-v=\"del:${esc(c.id)}\" title=\"\u4ECE\u4F11\u606F\u5BA4\u5220\u6389\uFF08\u5B83\u5D4C\u5728\u6B4C\u91CC\u7684\u58F0\u97F3\u4E00\u8D77\u4E22\uFF09\">\u00D7</button>` : \"\")).join(\"\") + `</div>` + status +\n      `<div class=\"ip-sub\">\u6362\u4EBA</div><div class=\"ip-btns\"><button class=\"btn primary\" data-v=\"finder\" title=\"\u5168\u5C4F\u7684\u4E50\u5668\u76EE\u5F55\uFF1A\u6309\u66F2\u98CE / \u5E74\u4EE3 / \u65CF / \u53D1\u58F0\u65B9\u5F0F\u6D4F\u89C8\uFF0C\u53F3\u8FB9\u7684\u952E\u76D8\u8BD5\u542C\uFF0C\u4E0A\u573A\">\u6253\u5F00\u4E50\u5668\u76EE\u5F55\u2026</button>` +\n      Object.values(SOUNDS).map((e) => `<button class=\"btn\" data-v=\"sound:${esc(e.id)}\" title=\"${esc(`${e.description ?? e.name}\uFF08${sizeText(e.bytes)}\uFF1B\u5BB6\u65CF\u97F3\u6E90\u5E93\uFF0C\u7B2C\u4E00\u6B21\u70B9\u624D\u4E0B\u8F7D\u3001\u4E4B\u540E\u7559\u5728\u8BBE\u5907\u4E0A\uFF1B${e.license.name}\uFF09`)}\">\u4ECE ${esc(e.name)} \u9009\u2026</button>`).join(\"\") +\n      `<button class=\"btn\" data-v=\"sf2:pick\" title=\"\u81EA\u5DF1\u7684 .sf2 \u6587\u4EF6\uFF1A\u9009\u4E2D\u7684\u90A3\u4E00\u4EF6\u5207\u51FA\u6765\u7559\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\uFF08\u51E0 MB\uFF09\uFF0C\u6B4C\u91CC\u53EA\u8BB0\u6765\u6E90\uFF1B\u6574\u4E2A\u6587\u4EF6\u4E0D\u7559\">\u4ECE .sf2 \u6587\u4EF6\u9009\u2026</button></div>` + pickerHtml() +\n      `<div class=\"ip-note\">\u9009\u7684\u7434\u6B4C\u91CC\u53EA\u8BB0\u6765\u6E90\uFF08\u6B4C\u5C0F\uFF09\uFF1A\u58F0\u97F3\u4ECE\u8FD9\u53F0\u8BBE\u5907 / \u5BB6\u65CF\u97F3\u6E90\u5E93 / \u4F60\u7684\u6587\u4EF6\u91CC\u627E\u3002\u8981\u6B4C\u81EA\u5DF1\u5E26\u7740\u58F0\u97F3 = \u6587\u4EF6\u83DC\u5355\u300C\u5168\u90E8\u6253\u5305\u8FDB\u6B4C\u300D\uFF0C\u6216\u5BFC\u51FA\u300C\u6253\u5305\u97F3\u6E90\u300D\u7684\u526F\u672C\u3002</div></section>` +\n    `<section class=\"ip-card ip-how\"><h3>${esc(who)} \u600E\u4E48\u6F14<small>\u53F3\u8FB9\u7684\u952E\u76D8\u5F39\u7684\u5C31\u662F\u53F0\u4E0A\u8FD9\u4F4D\uFF0C\u6539\u4E86\u9A6C\u4E0A\u80FD\u8BD5</small></h3><div class=\"ip-grid\">${how}</div>${eng !== \"unknown\" ? marksTableHtml(role, eng) : \"\"}</section>` +\n    `</div></div>`;\n  const inp = instEl.querySelector<HTMLInputElement>(\"#roleIn\")!, sel = instEl.querySelector<HTMLSelectElement>(\"#roleSel\")!;\n  sel.addEventListener(\"change\", () => { const [snd, ...nm] = sel.value.split(\"|\"); if (snd) { setRole(nm.join(\"|\"), snd); drawInst(); } });\n  inp.addEventListener(\"change\", () => setRole(inp.value));\n  inp.addEventListener(\"keydown\", (e) => { if (e.isComposing) return; if (e.key === \"Enter\") { e.preventDefault(); e.stopPropagation(); setRole(inp.value); drawInst(); } });\n  instEl.querySelector<HTMLSelectElement>(\"#sfSel\")?.addEventListener(\"change\", (e) => { const picked = instPicked; if (!picked) return; picked.sel = (e.target as HTMLSelectElement).value; const p = picked.presets.find((x) => `${x.bank}:${x.program}` === picked.sel); const n = instEl.querySelector<HTMLInputElement>(\"#sfName\"); if (n && p) n.value = p.name; });\n  if (keepScroll) instEl.querySelector<HTMLElement>(\".ip-body\")!.scrollTop = keepScroll;\n  instEl.querySelector<HTMLDetailsElement>(\"details.ip-adv\")?.addEventListener(\"toggle\", (e) => { instAdvOpen = (e.target as HTMLDetailsElement).open; });\n  instEl.querySelector<HTMLSelectElement>(\".ip-part\")?.addEventListener(\"change\", (e) => { commitRoleName(); instPicked = null; update(setFocus(D.st, D.st.at.paper, (e.target as HTMLSelectElement).value)); sound.allOff(); void prepareBank(); pad.render(); drawInst(); });\n}\ninstEl.addEventListener(\"click\", (e) => {\n  const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (!v) return;\n  const role = curRole(), rn = roleName(D.extras, role);\n  if (v === \"back\") { closeInstPage(); return; }\n  if (v === \"pad\") { showPad(padEl.hidden); drawInst(); return; }\n  if (v === \"finder\") { commitRoleName(); openFinder(); return; }\n  if (v.startsWith(\"cand:\")) setActive(v.slice(5));\n  else if (v.startsWith(\"del:\")) { try { updateExtras(withoutCandidate(D.extras, role, v.slice(4)), { kind: \"lounge\", label: `\u300C${rn}\u300D\u9000\u6389\u4E00\u4F4D\u5019\u9009` }); } catch (err) { showError((err as Error).message); } }\n  else if (v.startsWith(\"find:\")) { findBankFile(v.slice(5)); return; }\n  else if (v === \"sf2:pick\") { pickFile(); return; }\n  else if (v.startsWith(\"sound:\")) { void pickOfficial(v.slice(6)); return; }\n  else if (v === \"sf2:add\") { void addPicked(); return; }\n  else if (v === \"sf2:cancel\") instPicked = null;\n  else if (v.startsWith(\"gap:\")) { const def = gapDefaultOf(role)?.gapSec ?? 0, next = v === \"gap:def\" ? def : Math.max(0, Math.min(GAP_MAX_SEC, activePerfSpec(D.extras, role).gapSec + Number(v.slice(4)))); updateExtras(withGapSec(D.extras, role, next, D.st.song.hum), { kind: \"lounge\", label: `\u300C${rn}\u300D\u97F3\u548C\u97F3\u4E4B\u95F4 ${Math.round(next * 1000)} ms` }, \"gap\"); }\n  else if (v.startsWith(\"cal:\")) { const d = v === \"cal:def\" ? NaN : Number(v.slice(4)), next = Math.max(-30, Math.min(12, Number.isNaN(d) ? DEFAULT_CALIBRATION_DB : activeCalibrationDb(D.extras, role) + d)); updateExtras(withCalibration(D.extras, role, next, D.st.song.hum), { kind: \"lounge\", label: `\u300C${rn}\u300D\u54CD\u5EA6\u6821\u51C6 ${next} dB` }, \"cal\"); }\n  else if (v.startsWith(\"hum:\")) update(setHum(D.st, v.slice(4) as Hum));\n  else { const ch = performerOf(engineNow())?.onInspector?.(v, inspectorCtx(role)); if (!ch) return; updateExtras(ch.extras, { kind: \"lounge\", label: ch.label }, ch.gesture); if (ch.silence) sound.allOff(); }   // \u8FD9\u4F4D\u81EA\u5DF1\u7684\u884C\uFF08\u529B\u5EA6 / \u97F3\u6548 / \u4FEE\u516B\u5EA6 / \u5531\u6CD5\u65CB\u94AE / \u5206\u6BB5\u5531\u2026\uFF09\uFF1A\u63D2\u4EF6\u81EA\u5DF1\u7BA1\uFF08ADR-0004 \u00A72.5\uFF09\n  drawInst();\n});\n/** \u89C6\u56FE\u6001\uFF08desk\uFF0Csrc/score/desk.ts\uFF09\uFF1A\u5B58\u65F6\u805A\u4E00\u4E0B\uFF08bytesNow\uFF09\u3001\u5F00\u6B4C\u65F6\u6563\u56DE\u53BB\uFF08loadDoc\uFF09\u3002\u53D8\u91CF\u672C\u8EAB\u4ECD\u4F4F\u8FD9\u91CC\uFF08viewScope / pageFlow / partView\uFF09\u3002 */\nconst deskNow = (): Desk => ({ scope: viewScope, pageFlow, scroll: scrollFlow, paper: D.st.at.paper, parts: Object.fromEntries(partView), mp3: mp3Quality, mode: ws.mode,\n  pad: { fifths: D.st.input.inputFifths, scale: D.st.input.inputScale, unit: PAD_UNITS[D.st.input.unit], tuplet: D.st.input.tuplet, low: pad.rangeLow() }, ref: refHost.panel(), pdf: pdfFont });   // pad \u7684\u72B6\u6001\u8DDF\u7740\u6B4C\u8D70\uFF08\u540C WeebPaint editor-state\uFF09\nfunction applyDesk(d: Desk): void {\n  viewScope = d.scope; pageFlow = d.pageFlow; scrollFlow = d.scroll; mp3Quality = d.mp3; pdfFont = d.pdf;\n  D.commit({ st: { ...D.st, input: { ...D.st.input, inputFifths: d.pad.fifths, inputScale: d.pad.scale, unit: Math.max(0, PAD_UNITS.indexOf(d.pad.unit)), tuplet: d.pad.tuplet } } }, { silent: true, undo: false });   // \u89C6\u56FE\u6001 / \u8F93\u5165\u6001\uFF1A\u53EA\u6362\u771F\u76F8\uFF0C\u4E0D\u91CD\u753B\uFF08\u8C03\u7528\u65B9\u81EA\u5DF1\u753B\uFF09\n  partView.clear(); for (const [id, p] of Object.entries(d.parts)) partView.set(id, { ...freshPartView(), ...p });\n  if (d.paper && d.paper !== D.st.at.paper) {\n    const paper = D.st.song.papers.find((p) => p.id === d.paper), part = paper?.tracks[D.st.at.part] ? D.st.at.part : D.st.song.parts.find((p) => paper?.tracks[p.id])?.id;\n    if (paper && part) D.commit({ st: setFocus(D.st, paper.id, part) }, { silent: true, undo: false });\n  }\n}\nfunction loadDoc(song: Song, o: { home: Home; stem: string; named: boolean; extras: Extras; view?: unknown; references?: Record<string, Uint8Array> }): void {\n  perfApi.mixBypass = false; busMuted.clear();   // \u6548\u679C\u5168\u5173 / \u6DF7\u97F3\u8F68\u9759\u97F3\u662F\u8FD9\u6B21\u542C\u7684\uFF0C\u6362\u6B4C\u590D\u4F4D\n  if (impro) toggleImpro();\n  ui.close(); closeInstPage();\n  H.load(o.home, { stem: o.stem, named: o.named }); coverTouched = false;   // \u6362\u5BB6\uFF08\u6B4C\u5E93 \u2192 \u522B\u5904 = \u653E\u4E0B es \u7684\u8EAB\u4EFD\uFF1B\u6307\u9488 / store \u7684\u300C\u8C01\u5F00\u7740\u300D\u5728 onHome \u91CC\uFF09\n  const st0 = initState(song), startDyns = ensureStartDyns(st0.song, st0.nextId).added.length;\n  D.load(withStartDyns(st0), o.extras);   // \u6362\u6B4C / \u4E91\u7AEF\u8986\u76D6\u91CD\u8F7D = \u53E6\u4E00\u9996\u7684\u5386\u53F2\uFF1B\u57FA\u7EBF = \u6253\u5F00\u7684\u6837\u5B50\uFF08v0.10.39\uFF1A\u8001\u6B4C\u6BCF\u5F20\u7EB8\u5F00\u5934\u6CA1\u5199\u529B\u5EA6 = \u8865\u4E0A\uFF0C\u4E0D\u6807\u810F\u3001\u4E0D\u8FDB undo\uFF0C\u4E0B\u6B21\u5B58\u65F6\u4E00\u8D77\u5199\u8FDB\u53BB\uFF09\n  const d = o.view ? unserializeDesk(o.view) : freshDesk();\n  applyDesk(d);\n  // \u6253\u5F00 = \u4E0A\u6B21\u5B58\u65F6\u7684\u6A21\u5F0F\uFF1B\u8C31\u91CC\u5DF2\u7ECF\u6709\u97F3 = \u952E\u76D8\u5148\u6536\u7740\uFF0C\u70B9\u4E00\u4E0B\u624D\u5F00\uFF08v0.10.21\uFF1Buser\u300C\u6253\u5F00\u65F6\u8BB0\u4F4F\u4E0A\u6B21\u7684\u6A21\u5F0F\uFF0C\u6210\u54C1\u66F2\u4E0D\u5E94\u8BE5\u8001\u662F\u8DF3\u5230\u97F3\u7B26\u8F93\u5165\uFF0C\u5BB9\u6613\u8BEF\u89E6\u300D\u300C\u6216\u8005\u9ED8\u8BA4\u952E\u76D8\u662F\u5173\u7684\uFF0C\u70B9\u4E00\u4E0B\u624D\u4F1A\u5F00\u3002\u300D\uFF09\u3002\u7A7A\u7684\u65B0\u6B4C\u7167\u65E7\u5F00\u7740\u952E\u76D8\n  ws.mode = finalOn() ? \"listen\" : d.mode; if (d.mode !== \"listen\") lastEditMode = d.mode;   // \u5B9A\u7A3F\u7740 = \u53EA\u80FD\u542C\uFF08\u5B58\u7684\u6A21\u5F0F\u4E0D\u770B\uFF09\n  ws.collapsed = D.st.song.papers.some((pp) => Object.values(pp.tracks).some((t) => t.some((x) => x.kind === \"note\")));\n  applyWorkspace();\n  void refHost.apply(o.references ?? {}, d.ref);   // \u53C2\u8003\u7A97\uFF1A\u6B4C\u91CC\u7684\u5361 + \u7A97\u8BB0\u5728\u54EA\uFF08\u65B0\u6B4C = \u7A7A\u3001\u6536\u7740\uFF09   // \u89C6\u56FE\u6001 + pad \u7684\u72B6\u6001\uFF081= / \u8C03\u5F0F / \u65F6\u503C / \u8FDE\u97F3 / \u97F3\u57DF\uFF09\u968F\u6B4C\u56DE\u6765\uFF08\u6CA1\u6709 = \u9ED8\u8BA4\uFF0C\u540C WeebPaint\uFF09\uFF1B\u6539\u5B83\u4EEC\u4E0D\u6807\u810F\u3001\u4E0D\u8FDB undo\n  pad.setRangeLow(d.pad.low);\n  onSongSwitch(); sound.allOff(); void prepareBank(); refreshIssues();   // \u5F00\u6B4C\u90A3\u4E00\u523B\u6E05\u5355\u91CD\u7B97\uFF1A\u6709\u4E8B = \u4E00\u6761 toast + \u89D2\u6807\uFF08\u00A72.2\u00BD \u51FA\u53E3 \u2462\uFF09   // \u6362\u6B4C = \u5F55\u97F3\u623F\u91CC\u7684\u5757\u5168\u653E\u6389\u3001\u6392\u7740\u7684\u4E0D\u5531\u4E86\u3001\u6B63\u5728\u5531\u7684\u4E5F\u53D6\u6D88\u3001\u4E0A\u4E00\u9996\u7684\u8BA1\u5212\u6E05\u7A7A\uFF08W-37\uFF1A\u65E7\u8BF7\u6C42\u56DE\u6765\u624D\u4E0D\u4F1A\u88AB\u5F53\u6210\u8FD9\u9996\u7684\u62A5\u51FA\u6765\uFF09\u3001\u4E0A\u4E00\u9996\u6491\u5927\u7684\u5806\u8FD8\u56DE\u53BB\n  view.render(); pad.render(); renderTitle(); updateChrome();   // \u6302\u7B7E\u7684\u4E24\u4E2A\u4E0B\u62C9\u8DDF\u7740\u8FD9\u9996\u6B4C\uFF08v0.10.10 \u4FEE\uFF1A\u5F00\u673A\u76F4\u63A5\u6062\u590D\u4E0A\u6B21\u90A3\u9996\u65F6\u4E0B\u62C9\u6CA1\u5237\uFF0C\u8981\u5207\u4E00\u4E0B\u6A21\u5F0F\u624D\u51FA\u6765\u2014\u2014user\u300Cctrl shift r\u7684\u65F6\u5019\u6A21\u5F0F\u680F\u53EA\u80FD\u770B\u5230\u6A21\u5F0F\u5207\u6362\uFF0C\u770B\u4E0D\u5230\u4E0B\u62C9\u6846\u300D\uFF09\n  if (D.st.song.parts.some((p) => performerOf(activeInstrument(D.extras, p.role)?.engine)?.sound === \"chunks\")) void singer.warm(models.bases(), BUDGET.speechDisk);   // \u6B4C\u91CC\u6709\u6708\u8BFB = \u610F\u56FE\uFF1A\u5F15\u64CE\u7ACB\u523B\u8D77\uFF08PC \u70ED\u542F\u52A8 \u2248 1.5 s\uFF0C\u85CF\u5728\u770B\u8C31\u7684\u90A3\u51E0\u79D2\u91CC\uFF09\n  if (D.extras.final) info(`\u8FD9\u9996\u6B4C\u5B9A\u7A3F\u4E86\uFF08\u7B2C ${D.extras.final.rev} \u7248\uFF0Cmp3 ${mp3SizeText(D.extras.final.mp3.bytes)}\uFF09\uFF1A\u53EA\u80FD\u542C\u3002\u8981\u6539\uFF0C\u4E09\u6761\u6760\u91CC\u300C\u6539\u7A3F\u300D\u3002`);\n  if (startDyns) info(`\u6BCF\u5F20\u7EB8\u5F00\u5934\u8865\u4E86 ${startDyns} \u4E2A\u529B\u5EA6\u8BB0\u53F7\uFF08\u5C31\u662F\u90A3\u91CC\u672C\u6765\u751F\u6548\u7684\uFF0C\u542C\u8D77\u6765\u4E0D\u53D8\uFF1B\u4E0B\u6B21\u5B58\u65F6\u4E00\u8D77\u5199\u8FDB\u6587\u4EF6\uFF09`);   // v0.10.39\uFF08user\u300C\u6BCF\u5F20\u7EB8\uFF08\u66F2\u6BB5\uFF09\u5F00\u5934\uFF0C\u5BF9\u300D\uFF09\n  schedulePrewarm();   // \u6253\u5F00\u6B4C\u5C31\u9884\u70ED\uFF08\u5F15\u64CE\u8D77\u6765 + \u5149\u6807\u9644\u8FD1\u5148\u5531\uFF09\uFF1A\u7B2C\u4E00\u6B21\u70B9\u64AD\u653E\u4E0D\u7528\u7B49\u5341\u79D2\uFF08user 2026-10-10\u300C\u4E3A\u4EC0\u4E48\u7B2C\u4E09\u5200\u4E4B\u540E\u7B2C\u4E00\u6B21\u70B9\u64AD\u653E\u8FD8\u662F\u8981\u7B49\u6708\u8BFB\u4E00\u6BB5\u65F6\u95F4\uFF0Cpc\u4E0A\u5927\u6982\u6709\u5341\u79D2\u300D\uFF09\n}\n/** \u6539\u8FC7\u6CA1\u5B58\u65F6\u5148\u95EE\u4E00\u53E5\uFF08\u5E94\u7528\u5185\u9762\u677F\uFF0C\u4E0D\u7528\u7CFB\u7EDF\u5F39\u7A97\uFF09\u3002 */\nfunction confirmDiscard(what: string): Promise<boolean> {\n  if (!dirty()) return Promise.resolve(true);\n  return new Promise((resolve) => {\n    ui.close();\n    const box = document.createElement(\"div\");\n    box.className = \"offer\";\n    box.innerHTML = `<div class=\"offer-card\"><div class=\"offer-title\">\u300C${esc(docName())}\u300D\u6539\u8FC7\u8FD8\u6CA1\u5B58</div><div class=\"offer-msg\">${what}\u4F1A\u4E22\u6389\u8FD9\u4E9B\u6539\u52A8\u3002</div>` +\n      `<div class=\"offer-btns\"><button class=\"btn\" data-v=\"save\">\u5148\u5B58</button><button class=\"btn\" data-v=\"go\">\u4E22\u6389\uFF0C\u7EE7\u7EED</button><button class=\"btn primary\" data-v=\"no\">\u7B97\u4E86</button></div></div>`;\n    document.body.append(box);\n    const dismiss = () => close(false), close = (ok: boolean) => { box.remove(); ui.closed(dismiss); resolve(ok); };\n    ui.open({ k: \"sheet\", close: dismiss });\n    box.addEventListener(\"click\", (e) => {\n      const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n      if (e.target === box || v === \"no\") close(false);\n      else if (v === \"go\") close(true);\n      else if (v === \"save\") { close(false); void fileSave(); }\n    });\n  });\n}\nasync function fileNew(): Promise<void> {\n  if (hasStore()) { await newStoreSong(); return; }   // \u8FDB\u8FC7\u6B4C\u5E93 = \u65B0\u6B4C\u751F\u5728\u6B4C\u5E93\u91CC\n  if (!(await H.leave(\"\u65B0\u5EFA\"))) return;\n  loadDoc(initState().song, { home: { kind: \"none\", pendingFolder: null }, stem: defaultStem(), named: false, extras: emptyExtras() });\n  info(\"\u65B0\u7684\u4E00\u9996\");\n}\nasync function fileOpen(): Promise<void> {\n  if (!(await H.leave(\"\u6253\u5F00\u522B\u7684\u6B4C\"))) return;\n  let picked: docFile.Picked | null;\n  try { picked = await docFile.pickOpen(); } catch (e) { showError(`\u6CA1\u6253\u5F00\uFF1A${(e as Error).message}`); return; }\n  if (picked) openPicked(picked);\n}\n/** \u62FF\u5230\u7684\u6587\u4EF6\uFF08\u9009\u7684 / \u62D6\u8FDB\u6765\u7684 / \u53CC\u51FB\u6253\u5F00\u7684\uFF09\u2192 \u8BFB\u8FDB\u6765\u3002\u522B\u7684\u8F6F\u4EF6\u5B58\u7684\u8C31\u3001\u6216\u6709\u8BFB\u4E0D\u8FDB\u6765\u7684\u4E1C\u897F\uFF1A\u4E0D\u8BA4\u5B83\u7684\u5BB6\uFF08\u5B58\u56DE\u53BB\u4F1A\u628A\u6CA1\u8BFB\u8FDB\u6765\u7684\u4E22\u6389 \u2192 \u7B2C\u4E00\u6B21\u300C\u5B58\u300D= \u95EE\u5B58\u5230\u54EA\uFF09\u3002 */\nfunction openPicked(picked: docFile.Picked): void {\n  try {\n    const o = openBytes(picked.name, picked.bytes), own = o.ours && !o.notices.length;\n    loadDoc(o.song, { home: own && picked.handle ? { kind: \"file\", handle: picked.handle, mtime: picked.mtime } : { kind: \"none\", pendingFolder: null }, stem: o.stem, named: true, extras: o.extras, view: o.view, references: o.references });\n    if (o.notices.length) showError(o.notices.join(\" \")); if (o.advice.length) info(o.advice.join(\" \"));\n    else info(`\u6253\u5F00\u4E86 ${picked.name}`);\n  } catch (e) { showError(`\u6253\u4E0D\u5F00 ${picked.name}\uFF1A${(e as Error).message}`); }\n}\n/** \u5C01\u9762\u7684\u8170\u5C01 = \u4F5C\u8005\u680F\u7B2C\u4E00\u884C\uFF08\u6BCF\u6B21\u5B58\u91CD\u5199\uFF0CwithPngText \u5148\u5220\u65E7\u5757\uFF09\uFF1B\u6CA1\u6709\u5C01\u9762\u56FE\u5C31\u6CA1\u6709\u5C01\u9762 entry\u3002 */\nconst extrasForSave = (base: Extras = D.extras): Extras => (base.thumbnail ? withThumbnail(base, coverWithBlurb(base.thumbnail, (D.st.song.credits ?? \"\").split(\"\\n\").map((l) => l.trim()).find(Boolean) ?? null)) : base);\n/** \u81EA\u52A8\u5B58 / \u5B58\u7684\u7F16\u7801\u53E3\uFF1Aworker \u91CC saveMxl\uFF08\u5927\u6B4C 20\u201360 ms \u4E0D\u518D\u5360\u4E3B\u7EBF\u7A0B\uFF1B2026-10-21 \u97F3\u6E38\u7EA7\u5EF6\u8FDF\u90A3\u4E00\u5200\uFF09\u3002\u5BFC\u51FA / PDF / \u5B9A\u7A3F\u90A3\u4E9B\u540C\u6B65\u8981\u5B57\u8282\u7684\u7167\u65E7 bytesNow()\u3002 */\nconst encoder = createEncoder(() => new URL(`./${__ENCODE_WORKER__}`, import.meta.url), (why) => diagNote(\"encode\", why));\n/** \u8FD9\u9996\u6B4C\u7684 .mxl \u5B57\u8282\uFF1Bextras = \u6362\u4E00\u4EFD\u4F11\u606F\u5BA4 / \u97F3\u6E90\u6765\u5B58\uFF08\u5BFC\u51FA\u300C\u6253\u5305\u97F3\u6E90\u300D\u7684\u526F\u672C\uFF1A\u53EA\u6539\u90A3\u4E00\u4EFD\uFF0C\u4E0D\u6539\u6B63\u672C\uFF09\u3002 */\nconst bytesNow = (extras?: Extras, song: Song = D.st.song) => saveMxl({ ...saveArgs(extras, song), references: refHost.files() });\n/** saveMxl \u8981\u7684\u90A3\u4E00\u4EFD\uFF08\u6307\u7EB9\u4E5F\u6309\u5B83\u7B97\uFF0C\u4E0D\u5E26\u53C2\u8003\u7A97\u2014\u2014\u53C2\u8003\u7A97\u4E0D\u8FDB\u6307\u7EB9\uFF09\u3002core = \u6E32\u67D3\u6838\u5FC3\u7684\u7248\u672C + \u54C8\u5E0C\uFF08\u6BCF\u6B21\u4FDD\u5B58\u90FD\u8BB0\uFF09\u3002 */\nconst saveArgs = (extras?: Extras, song: Song = D.st.song) => ({ view: serializeDesk(deskNow()) as Record<string, unknown> | null, song, hum: song.hum, extras: extrasForSave(extras), app: APP_VERSION, date: new Date().toISOString(), core: coreInfo() });\nconst mp3SizeText = (n: number) => (n < 1e6 ? `${Math.round(n / 1e3)} KB` : `${(n / 1e6).toFixed(1)} MB`);   // song = \u6362\u4E00\u4EFD\u6B4C\u6765\u5B58\uFF08\u5BFC\u51FA\u526F\u672C\uFF1A\u8BB8\u53EF\u51B2\u7A81\u65F6\u6309\u672A\u58F0\u660E\u5199\uFF09\nconst mxlFile = (name: string, extras?: Extras, song?: Song) => new File([bytesNow(extras, song) as unknown as BlobPart], name, { type: \"application/vnd.recordare.musicxml\" });\nconst sizeText = (n: number) => (n < 1e6 ? `${Math.max(1, Math.round(n / 1e3))} KB` : `${(n / 1e6).toFixed(1)} MB`);\n/** \u5B58 = \u56DE\u5BB6\uFF0C\u4E00\u4E2A\u52A8\u4F5C\uFF08WeebPaint \u4E00\u753B\u4E00\u5BB6\uFF1Buser 2026-08-25 grill\u300C\u4FDD\u5B58\u6309\u94AE=\u56DE\u5BB6\uFF08\u5355\u4E00\u52A8\u4F5C\uFF09\uFF0C\u5BFC\u51FA hub=\u5BC4\u660E\u4FE1\u7247\u300D\uFF09\uFF1A\n *  \u00B7 \u6709\u5BB6\uFF08\u6253\u5F00\u7684\u90A3\u4E2A\u6587\u4EF6\uFF09= \u5B58\u56DE\u53BB\u3002\u5199\u4E4B\u524D\u5BF9\u4E00\u6B21 mtime\uFF0C\u6587\u4EF6\u5728\u5916\u9762\u88AB\u6539\u8FC7\u5C31\u5148\u95EE\uFF080819 spec \u00A77\u300C\u539F\u4F4D\u5199\u56DE\u524D\u67E5 lastModified\u300D\uFF09\u3002\n *  \u00B7 \u8FD8\u6CA1\u6709\u5BB6 = \u5B89\u5BB6\uFF1A\u684C\u9762 Chromium \u5148\u5F00\u7CFB\u7EDF\u4FDD\u5B58\u6846\uFF08\u5728\u624B\u52BF\u91CC\uFF1B\u53D6\u6D88 = \u5230\u6B64\u4E3A\u6B62\uFF0C\u4E0D\u964D\u7EA7\u5F39\u4E0B\u8F7D\u2014\u2014\u300CAbortError \u2260 \u73AF\u5883\u4E0D\u652F\u6301\u300D\uFF09\uFF0C\u518D\u7F16\u7801\u3001\u5199\u3001\u8BA4\u9886\u53E5\u67C4\u3002\n *  \u00B7 iPad / Safari \u6CA1\u6709\u53E5\u67C4\u8FD9\u56DE\u4E8B = \u4E0B\u8F7D\u6216\u5206\u4EAB\u4E00\u4E2A .mxl \u5230\u300C\u6587\u4EF6\u300D\u91CC\uFF0C\u70B9\u4E86\u624D\u7B97\u5B58\u4E86\u3002\u8FD9\u53F0\u8BBE\u5907\u4E0A\u4E0B\u8F7D\u5C31\u662F\u5B58\uFF08\u6CA1\u6709\u522B\u7684\u5BB6\u53EF\u56DE\uFF1B\n *    WeebPaint \u7684\u300C\u4E0B\u8F7D\u4E0D\u6E05 dirty\u300D\u662F\u56E0\u4E3A\u5B83 iPad \u7684\u5BB6\u5728\u56FE\u5E93\u2014\u2014\u8FD9\u91CC\u6CA1\u6709\uFF0C\u300C\u2022\u300D\u7559\u7740\u53EA\u4F1A\u72FC\u6765\u4E86\uFF0C0819 \u00A77.2\u300C\u6709\u771F\u6B63\u4F1A\u4E22\u7684\u5B57\u8282\u624D\u62E6\u300D\uFF09\u3002\n *  \u4E09\u79CD\u5BB6 \u00D7 \u5B58 \u7684\u5206\u652F\u5728 src/app/home.ts `H.save()`\uFF082026-10-21 \u8D77\uFF09\uFF0C\u8FD9\u91CC\u53EA\u628A\u7ED3\u679C\u7FFB\u6210\u4EBA\u8BDD\uFF1B\u6B4C\u5E93\u90A3\u6761 = smartSaveStore\uFF08H \u7684 gallery.save \u53E3\uFF09\u3002\u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31\uFF1A\u6709\u7B14\u5148\u5B89\u5BB6\u518D\u8D70\u6B4C\u5E93\u7684\u5B58\uFF0C\u6CA1\u7B14\u8BDA\u5B9E\u56DE\u8BDD\u3002 */\nasync function fileSave(): Promise<void> {\n  try {\n    const r = await H.save();\n    switch (r.k) {\n      case \"blank\": info(\"\u8FD8\u662F\u7A7A\u7684\uFF0C\u6CA1\u4EC0\u4E48\u53EF\u5B58\"); return;   // WeebPaint blankNothingToSave\n      case \"gallery\": case \"offered\": return;\n      case \"written\": info(`\u5B58\u597D\u4E86\uFF1A${r.name}`); return;\n      case \"declined\": info(\"\u6CA1\u5B58\"); return;\n      case \"cancelled\": info(\"\u6CA1\u5B58\uFF08\u53D6\u6D88\u4E86\uFF09\"); return;\n      default: return assertNever(r);\n    }\n  } catch (e) { showError(`\u6CA1\u5B58\u4E0A\uFF1A${(e as Error).message}`); }\n}\n/** \u5BFC\u51FA hub \u7684\u300C\u5B58\u4E00\u4EFD .mxl \u526F\u672C\u300D= \u539F\u6765\u7684\u53E6\u5B58\u4E3A\uFF08user 2026-08-20\u300C\u53E6\u5B58\u4E3A\u4E5F\u53D8\u6210\u5BFC\u51FA\u300D\u300C\u590D\u5236\u4E00\u4EFD\u5C31\u662F\u5BFC\u51FA\u7684\u8BED\u4E49\u2026\u653E\u5728\u5BFC\u51FA\u7684\u9009\u9879\u91CC\u9762\u300D\uFF09\uFF1A\n *  \u4E00\u4EFD\u5E26\u65F6\u523B\u6233\u7684\u62F7\u8D1D\uFF0C\u5BB6\u4E0D\u53D8\u3001\u300C\u2022\u300D\u4E0D\u53D8\uFF08\u5BFC\u51FA\u6C38\u4E0D\u6E05 dirty\uFF09\u3002\u684C\u9762 = \u7CFB\u7EDF\u4FDD\u5B58\u6846\uFF1BiPad = \u4E0B\u8F7D / \u5206\u4EAB\u3002\n *  packed = \u6253\u5305\u97F3\u6E90\u7684\u526F\u672C\uFF08user 2026-10-08\u300C\u5BFC\u51FA\u7684\u65F6\u5019\u53EF\u4EE5\u9009\u5BFC\u51FApacked\u7248\u672C\u7684\u300D\uFF09\uFF1A\u53EA\u8FD9\u4E00\u4EFD\u628A\u5F31\u5F15\u7528\u7684\u58F0\u97F3\u88C5\u8FDB\u53BB\uFF0C\u6B63\u672C\u7167\u65E7\uFF08\u5BFC\u51FA = \u5BC4\u660E\u4FE1\u7247\uFF09\u3002\n *  \u597D\u4E86\u7684\u9762\u677F\u91CC\u5E26\u7F72\u540D\uFF08\u6298\u53E0\uFF09\u3002\u8BB8\u53EF\u548C\u6708\u8BFB\u6761\u6B3E\u53EF\u80FD\u51B2\u7A81 = \u8FD9\u4E00\u4EFD\u526F\u672C\u7684 <rights> \u6309\u672A\u58F0\u660E\u5199\uFF08user\u300C\u4E0Dblock\u5BFC\u51FAmp3\u548C\u5DE5\u7A0B\u6587\u4EF6\u3002\u800C\u53EA\u662F\u56DE\u5230\u672A\u58F0\u660E\u300D\uFF09\uFF0C\u6B63\u672C\u4E0D\u52A8\u3002 */\nasync function exportCopyMxl(packed = false): Promise<void> {\n  const name = `${stampedCopy(docName())}${packed ? \"-packed\" : \"\"}.mxl`;\n  try {\n    let extras = D.extras;\n    if (packed) {\n      const { got, missing } = await gatherSubsets(extras);\n      extras = withPacked(extras, (sha) => got.get(sha)).extras;\n      if (missing.length) showError(`\u8FD9\u51E0\u4EF6\u627E\u4E0D\u5230\u58F0\u97F3\uFF0C\u526F\u672C\u91CC\u6CA1\u5E26\uFF1A${missing.join(\"\u3001\")}\u3002\u70B9\u8C31\u524D\u9762\u7684\u58F0\u90E8\u540D\uFF0C\u5728\u300C\u8C01\u6765\u6F14\u300D\u91CC\u300C\u627E\u6587\u4EF6\u2026\u300D\uFF0C\u518D\u5BFC\u51FA\u4E00\u6B21\u3002`);\n    }\n    const roles = soundingRoles(), { rights, fellBack } = exportRights(roles);\n    const song: Song = fellBack ? (({ rights: _r, ...rest }) => rest)(D.st.song) : D.st.song;\n    const credits = (fellBack ? `<div class=\"offer-msg\">\u8BB8\u53EF\u8FD9\u4E00\u4EFD\u6309\u300C\u672A\u58F0\u660E\u300D\u5199\u4E86\uFF08\u4F60\u9009\u7684\u8BB8\u53EF\u548C\u5C0F\u6708\u76F8\u7684\u6761\u6B3E\u53EF\u80FD\u51B2\u7A81\uFF1B\u4F5C\u8005\u680F\u91CC\u7684\u9009\u62E9\u6CA1\u52A8\uFF09\u3002</div>` : \"\") +\n      creditsBlock(creditsOf(roles, rights).lines, \"\u7F72\u540D\") + creditsBlock(packedLicenses(extras), \"\u6253\u5305\u5206\u53D1\u7684\u8BB8\u53EF\uFF08\u8FD9\u4EFD\u526F\u672C\u91CC\u5E26\u7740\u8FD9\u4E9B\u6E90\u6587\u4EF6\uFF09\");\n    if (docFile.canPickSave()) {\n      const h = await docFile.pickSave(name); if (!h) return;\n      await docFile.writeTo(h, bytesNow(extras, song)); info(`\u5B58\u4E86\u4E00\u4EFD\uFF1A${h.name}${fellBack ? \"\uFF08\u8BB8\u53EF\u6309\u672A\u58F0\u660E\u5199\uFF09\" : \"\"}`); return;\n    }\n    const file = mxlFile(name, extras, song);\n    offerFile(file, packed ? \"\u5B58\u4E00\u4EFD .mxl \u526F\u672C\uFF08\u6253\u5305\u97F3\u6E90\uFF09\" : \"\u5B58\u4E00\u4EFD .mxl \u526F\u672C\", `${esc(file.name)} \u00B7 ${sizeText(file.size)}\u3002\u73B0\u5728\u8FD9\u9996\u6B4C\u7684\u4E00\u4EFD\u62F7\u8D1D\uFF1B\u8FD9\u91CC\u518D\u6539\uFF0C\u5B83\u4E0D\u4F1A\u8DDF\u7740\u53D8\u3002${credits}`);\n  } catch (e) { showError(`\u6CA1\u5B58\u4E0A\uFF1A${(e as Error).message}`); }\n}\n// \u2500\u2500 \u97F3\u6E90\u6253\u5305 / \u89E3\u5305\uFF08Blender \u5F0F\uFF1B2026-10-08 by Claude Opus 5.5\uFF1Buser\u300C\u7C7B\u4F3Cblender\uFF0C\u53EF\u4EE5pack all packable resources\u6216\u8005unpack all\u2026\u4E0D\u8FC7\u6708\u8BFB\u4E0D\u80FDpack\u5427\uFF0Cpack\u4E86\u4E5F\u5F88\u96BE\u8DD1\u8D77\u6765\u300D\uFF09\u2500\u2500\n//   \u53EA\u52A8\u5B57\u8282\uFF08embedded\uFF09\uFF0Csha256 / origin \u4E0D\u78B0\uFF08project.ts withPacked / withUnpacked\uFF09\uFF1B\u6708\u8BFB / \u5143\u97F3\u7248\u4E0D\u5728\u5176\u5217\uFF08\u5BB6\u65CF\u6A21\u578B\u5305 / app \u968F\u5E26\u7684\u8868\uFF0C\u6B4C\u91CC\u53EA\u9489\u54C8\u5E0C\uFF09\u3002\n/** \u628A\u6B4C\u91CC\u8FD8\u6CA1\u6253\u5305\u7684 SoundFont \u5B50\u96C6\u627E\u9F50\uFF1A\u89E3\u6790\u94FE\u540C\u51FA\u58F0\uFF08\u672C\u6B21 \u2192 \u8BBE\u5907\u7F13\u5B58 \u2192 \u97F3\u6E90\u5E93\u4E0B\u8F7D \u2192 \u90FD\u6CA1\u6709 = \u5217\u8FDB missing\uFF09\u3002 */\nasync function gatherSubsets(extras: Extras): Promise<{ got: Map<string, Uint8Array>; missing: string[] }> {\n  const got = new Map<string, Uint8Array>(), missing: string[] = [], seen = new Set<string>();\n  for (const role of Object.keys(extras.lounge)) for (const g of gmCandidates(extras, role)) {\n    if (g.bytes || seen.has(g.subsetSha256)) continue;\n    seen.add(g.subsetSha256);\n    try { got.set(g.subsetSha256, await sources.resolveGmBytes({ ...g, path: null })); } catch { missing.push(g.name); }   // path: null = \u5F3A\u5F15\u7528\u4F46\u6587\u4EF6\u91CC\u5C11\u4E86\u90A3\u5757\u7684\uFF0C\u4E5F\u53BB\u627E\u4E00\u6B21\n  }\n  return { got, missing };\n}\nasync function packAll(): Promise<void> {\n  const { got, missing } = await gatherSubsets(D.extras);\n  const r = withPacked(D.extras, (sha) => got.get(sha));\n  if (r.packed.length) {\n    updateExtras(r.extras, { kind: \"lounge\", label: `\u6253\u5305\u4E86 ${r.packed.length} \u4EF6\u58F0\u97F3` });\n    const size = Object.values(D.extras.sounds).reduce((n, b) => n + b.length, 0);\n    info(`\u6253\u5305\u4E86 ${r.packed.length} \u4EF6\u58F0\u97F3\u8FDB\u6B4C\uFF1A\u73B0\u5728\u6B4C\u91CC\u5E26\u7740 ${sizeText(size)}${size > embedSoftLimit ? `\uFF08\u8D85\u8FC7 ${sizeText(embedSoftLimit)}\uFF1A\u5B58 / \u540C\u6B65\u4F1A\u6162\u4E00\u70B9\uFF09` : \"\"}\uFF0C\u53D1\u7ED9\u522B\u4EBA\u4E5F\u80FD\u54CD`);\n  }\n  if (missing.length) showError(`\u8FD9\u51E0\u4EF6\u627E\u4E0D\u5230\u58F0\u97F3\uFF0C\u6CA1\u6253\u5305\uFF1A${missing.join(\"\u3001\")}\u3002\u70B9\u8C31\u524D\u9762\u7684\u58F0\u90E8\u540D\uFF0C\u5728\u300C\u8C01\u6765\u6F14\u300D\u91CC\u300C\u627E\u6587\u4EF6\u2026\u300D\u3002`);\n  if (!r.packed.length && !missing.length) info(\"\u6CA1\u6709\u8981\u6253\u5305\u7684\uFF08\u5C0F\u6708\u76F8 / \u5143\u97F3\u7248\u4E0D\u6253\u5305\uFF1A\u5B83\u4EEC\u662F\u6A21\u578B\u5305\uFF0C\u6B4C\u91CC\u53EA\u9489\u54C8\u5E0C\uFF09\");\n}\nasync function unpackAll(): Promise<void> {\n  // \u5148\u628A\u5B57\u8282\u7559\u5230\u8BBE\u5907\u4E0A\uFF1B\u7559\u4E0D\u4F4F\u3001\u5BB6\u65CF\u97F3\u6E90\u5E93\u91CC\u53C8\u6CA1\u6709\u7684\u4E0D\u89E3\uFF08\u89E3\u4E86\u5C31\u627E\u4E0D\u56DE\u6765\u2014\u2014\u6570\u636E\u5B89\u5168\u4F18\u5148\uFF0C\u660E\u8BF4\uFF09\n  const bytesBySha = new Map<string, Uint8Array>();\n  for (const role of Object.keys(D.extras.lounge)) for (const g of gmCandidates(D.extras, role)) if (g.bytes) bytesBySha.set(g.subsetSha256, g.bytes);\n  const uses = soundUses(D.extras).filter((u) => u.packed && bytesBySha.has(u.subsetSha256));\n  if (!uses.length) { info(\"\u6B4C\u91CC\u6CA1\u6709\u6253\u5305\u7740\u7684\u58F0\u97F3\"); return; }\n  const ok = new Set<string>(), stuck: string[] = [];\n  for (const u of uses) {\n    const b = bytesBySha.get(u.subsetSha256)!;\n    sources.session.keep(u.subsetSha256, b);\n    await rememberSound(u.subsetSha256, b, true);\n    if (u.origin.library || (await isSoundPersisted(u.subsetSha256))) ok.add(u.subsetSha256); else stuck.push(u.names.join(\"\u3001\"));\n  }\n  const r = withUnpacked(D.extras, (sha) => ok.has(sha));\n  if (r.removed.size) {\n    updateExtras(r.extras, { kind: \"lounge\", label: `\u89E3\u5305\u4E86 ${r.removed.size} \u4EF6\u58F0\u97F3` });\n    info(`\u89E3\u5305\u4E86 ${r.removed.size} \u4EF6\uFF1A\u6B4C\u91CC\u53EA\u8BB0\u6765\u6E90\uFF08\u5C0F\u4E86 ${sizeText([...r.removed.values()].reduce((n, b) => n + b.length, 0))}\uFF09\uFF1B\u8FD9\u53F0\u8BBE\u5907\u4E0A\u7559\u7740\uFF0C\u7167\u6837\u80FD\u54CD\u3002\u522B\u7684\u8BBE\u5907\u4E0A\u4ECE\u5BB6\u65CF\u97F3\u6E90\u5E93\u6216\u539F\u6587\u4EF6\u627E`);\n  }\n  if (stuck.length) showError(`\u8FD9\u51E0\u4EF6\u6CA1\u89E3\u5305\uFF1A${stuck.join(\"\uFF1B\")}\u2014\u2014\u8FD9\u53F0\u8BBE\u5907\u7559\u4E0D\u4F4F\u5B83\u7684\u58F0\u97F3\uFF08\u7A7A\u95F4\u4E0D\u591F\uFF0C\u6216\u6D4F\u89C8\u5668\u4E0D\u8BA9\u5B58\uFF09\uFF0C\u5BB6\u65CF\u97F3\u6E90\u5E93\u91CC\u4E5F\u6CA1\u6709\uFF0C\u89E3\u4E86\u5C31\u627E\u4E0D\u56DE\u6765\u3002`);\n}\n/** \u7F72\u540D\u63A8\u6F14\u7684\u4E00\u5757\uFF08\u6587\u4EF6\u83DC\u5355 / \u5BFC\u51FA\u597D\u4E86\u7684\u9762\u677F\u91CC\uFF1Bsrc/format/credits.ts\uFF09\uFF1A\u7A7A = \u4E0D\u753B\u3002\u300C\u590D\u5236\u7F72\u540D\u300D\u7531\u4E0B\u9762\u90A3\u4E2A\u5168\u5C40\u76D1\u542C\u63A5\u3002 */\n/** \u7F72\u540D\u4E00\u5757\uFF1A**\u6298\u53E0\u7740**\uFF0C\u70B9\u5F00\u624D\u770B\uFF08user 2026-10-08\u300C\u53EA\u6709\u7528\u6237\u81EA\u5DF1\u5173\u5FC3\u534F\u8BAE\u7684\u65F6\u5019\u624D\u63D0\u51FA\u8FD9\u4E9B\u300D\u2014\u2014\u4E0D\u63A8\u5230\u773C\u524D\uFF09\u3002 */\nfunction creditsBlock(lines: CreditLine[], title: string): string {\n  if (!lines.length) return \"\";\n  return `<details class=\"credits-box\"><summary class=\"part-sec\">${esc(title)}</summary><pre class=\"credits-pre\">${esc(creditsText(lines))}</pre>` +\n    `<button class=\"btn\" data-copy-credits title=\"\u590D\u5236\u4E0B\u6765\u8D34\u8FDB\u4F5C\u54C1\u8BF4\u660E\">\u590D\u5236\u7F72\u540D</button></details>`;\n}\ndocument.addEventListener(\"click\", (e) => {\n  const b = (e.target as HTMLElement).closest<HTMLElement>(\"[data-copy-credits]\"); if (!b) return;\n  e.stopPropagation();\n  const text = b.parentElement?.querySelector(\".credits-pre\")?.textContent ?? \"\";\n  void navigator.clipboard?.writeText(text).then(() => info(\"\u7F72\u540D\u590D\u5236\u597D\u4E86\"), () => showError(\"\u590D\u5236\u4E0D\u4E86\uFF08\u6D4F\u89C8\u5668\u4E0D\u8BA9\uFF09\uFF1A\u957F\u6309\u4E0A\u9762\u7684\u5B57\u81EA\u5DF1\u9009\"));\n}, true);\n/** \u5BFC\u51FA hub\uFF08\u7167 WeebPaint\u300C\u5BFC\u51FA\u4E0E\u53E6\u5B58\u300Dhub\uFF1A\u5BFC\u51FA = \u5BC4\u660E\u4FE1\u7247\uFF0C\u548C\u300C\u5B58 = \u56DE\u5BB6\u300D\u5206\u5F00\u4F4F\uFF09\uFF1A\u6B4C\u58F0 mp3 / .mxl \u526F\u672C\uFF1B\u4E50\u8C31 PDF \u4EE5\u540E\u4E5F\u8FDB\u8FD9\u91CC\u3002 */\nfunction openExportHub(): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"offer\";\n  box.innerHTML = `<div class=\"offer-card settings-card\"><div class=\"offer-title\">\u5BFC\u51FA</div>` +\n    `<div class=\"set-row file-row\">` +\n    `<button class=\"btn\" data-v=\"mp3\" title=\"${finalOn() ? \"\u5B9A\u7A3F\u7684\u90A3\u4E00\u4EFD mp3\uFF0C\u76F4\u63A5\u5206\u4EAB\u6216\u4E0B\u8F7D\uFF08\u4E0D\u91CD\u6E32\uFF09\" : \"\u5C0F\u6708\u76F8\u5531\u4E00\u904D\uFF0C\u7F16\u6210 mp3\uFF0C\u5206\u4EAB\u6216\u4E0B\u8F7D\"}\"><svg class=\"ico\"><use href=\"#export\"/></svg>\u6B4C\u58F0\uFF08mp3${finalOn() ? \"\uFF0C\u5B9A\u7A3F\u7684\u90A3\u4EFD\" : \"\"}\uFF09\u2026</button>` +\n    `<button class=\"btn\" data-v=\"pdf\" title=\"\u5370\u51FA\u6765\u7684\u8C31\uFF08\u6309\u8FD9\u9996\u6B4C\u7684\u7EB8\u5F20\u5206\u9875\uFF1B\u6B4C\u8BCD\u7528\u5D4C\u8FDB\u53BB\u7684\u5B57\u4F53\uFF0C\u80FD\u9009\u4E2D\u590D\u5236\uFF09\"><svg class=\"ico\"><use href=\"#export\"/></svg>\u4E50\u8C31\uFF08PDF\uFF09\u2026</button>` +\n    `<button class=\"btn\" data-v=\"mxl\" title=\"\u73B0\u5728\u8FD9\u9996\u6B4C\u7684\u4E00\u4EFD\u62F7\u8D1D\uFF08\u6587\u4EF6\u540D\u5E26\u65F6\u523B\uFF09\uFF1B\u8FD9\u91CC\u7684\u6B4C\u8FD8\u4F4F\u539F\u6765\u7684\u5BB6\"><svg class=\"ico\"><use href=\"#save-as\"/></svg>\u5B58\u4E00\u4EFD .mxl \u526F\u672C\u2026</button>` +\n    (soundUses(D.extras).some((u) => !u.packed) ? `<button class=\"btn\" data-v=\"mxlPacked\" title=\"\u526F\u672C\u91CC\u628A\u4E50\u5668\u7684\u58F0\u97F3\u4E5F\u88C5\u8FDB\u53BB\uFF08\u53D1\u7ED9\u522B\u4EBA\u4E5F\u80FD\u54CD\uFF09\uFF1B\u8FD9\u91CC\u7684\u6B4C\u7167\u65E7\u53EA\u8BB0\u6765\u6E90\"><svg class=\"ico\"><use href=\"#save-as\"/></svg>\u5B58\u4E00\u4EFD .mxl \u526F\u672C\uFF08\u6253\u5305\u97F3\u6E90\uFF09\u2026</button>` : \"\") + `</div>` +\n    `<div class=\"offer-msg\">\u5BFC\u51FA = \u5BC4\u4E00\u4EFD\u51FA\u53BB\uFF0C\u8FD9\u91CC\u7684\u6B4C\u8FD8\u662F\u539F\u6765\u90A3\u4E2A\u5BB6\uFF0C\u300C\u5B58\u300D\u624D\u662F\u5B58\u56DE\u53BB\u3002</div>` +\n    `<div class=\"offer-btns\"><button class=\"btn primary\" data-v=\"close\">\u597D</button></div></div>`;\n  document.body.append(box);\n  const close = () => { box.remove(); ui.closed(close); scoreEl.focus(); };\n  ui.open({ k: \"sheet\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"close\") { close(); return; }\n    if (!v) return;\n    close();\n    if (v === \"mp3\") openMp3Panel(); else if (v === \"pdf\") openPdfPanel(); else if (v === \"mxl\") void exportCopyMxl(); else if (v === \"mxlPacked\") void exportCopyMxl(true);\n  });\n}\n/** \u4E50\u8C31 PDF \u7684\u9762\u677F\uFF082026-10-09 Opus 5.5\uFF1Buser\u300C\u81EA\u5DF1\u5199pdf\uFF0C\u7136\u540E\u5B57\u4F53\u53EF\u4EE5\u9009\u666E\u901A\u7684\u548C\u90A3\u4E2A\u62FC\u97F3\u53EF\u7231\u7684\u2026\u6B4C\u8BCD\u7528\u5B57\u4F53\u300D\uFF09\uFF1A\u9009\u5B57\u4F53 \u2192 \u751F\u6210 \u2192 \u5206\u4EAB / \u4E0B\u8F7D\uFF08\u540C mp3\uFF09\u3002\n *  \u5B57\u4F53\u70B9\u4E86\u624D\u4E0B\uFF08\u9ED1\u4F53\u7EA6 6 MB / \u62FC\u97F3\u7EA6 12 MB\uFF0C\u7B2C\u4E00\u6B21\uFF09\uFF0C\u7528\u5B8C\u5C31\u653E\u6389\u3002\u840C\u795E\u62FC\u97F3 = \u6C49\u5B57\u5934\u4E0A\u6807\u666E\u901A\u8BDD\u62FC\u97F3\uFF08\u65E5\u6587\u6B4C\u7684\u6C49\u5B57\u4E5F\u4F1A\u88AB\u6807\u4E0A\uFF09\u3002 */\nfunction openPdfPanel(): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"offer\";\n  // \u5370\u54EA\u4E9B\uFF082026-10-09\uFF0Cuser\u300C\u53EA\u5370\u4E00\u6BB5\u6216\u4E00\u4E2A\u58F0\u90E8 \u8FD9\u4E2A\u4E5F\u5230\u65F6\u5019\u9700\u8981\u505A\uFF0C\u548Cwxhw\u5DEE\u4E0D\u591A\uFF0C\u5728\u53EA\u663E\u793A\u4E00\u4E2A\u58F0\u90E8\u7684\u65F6\u5019\u4F60\u53EF\u4EE5\u9009\u300D\uFF1B\u7167 WXHW \u5BFC\u51FA\u9762\u677F\u7684\u300C\u8303\u56F4\u300D\u6BB5\u9009\uFF0C\u7528\u4E0D\u4E0A\u7684\u4E0D\u9732\uFF09\uFF1A\n  //   \u7EB8 = \u6574\u9996 / \u8FD9\u4E00\u6BB5\uFF08\u9ED8\u8BA4\u8DDF\u73B0\u5728\u7684\u89C6\u56FE\uFF1A\u672C\u6BB5 = \u8FD9\u4E00\u6BB5\uFF09\uFF1B\u58F0\u90E8\uFF08\u6709\u9690\u85CF\u7684\u624D\u9732\uFF09= \u7167\u5206\u9875\u9884\u89C8\uFF08\u9690\u85CF\u7684\u7A7A\u7740\u4F4D\u7F6E\uFF09/ \u53EA\u6392\u770B\u5F97\u89C1\u7684\uFF08\u91CD\u6392\u3001\u4E0D\u7559\u7A7A\u4F4D = \u5206\u8C31\uFF09\n  const curPaper = D.st.song.papers.find((p) => p.id === D.st.at.paper) ?? D.st.song.papers[0]!;\n  let paperPick: \"all\" | \"one\" = viewScope === \"segment\" && D.st.song.papers.length > 1 ? \"one\" : \"all\", partPick: \"view\" | \"shown\" = \"view\";\n  const someHidden = D.st.song.parts.some((p) => !isShown(p.id)), shownNames = partLabels(D.st.song, D.extras).filter((_, k) => isShown(D.st.song.parts[k].id));\n  const draw = () => {\n    const chip = (id: PdfFontId, label: string, note: string) => `<button class=\"btn cand${pdfFont === id ? \" is-on\" : \"\"}\" data-v=\"font:${id}\" title=\"${esc(note)}\">${label}</button>`;\n    const pick = (v: string, on: boolean, label: string, note: string) => `<button class=\"btn cand${on ? \" is-on\" : \"\"}\" data-v=\"${v}\" title=\"${esc(note)}\">${esc(label)}</button>`;\n    box.innerHTML = `<div class=\"offer-card settings-card\"><div class=\"offer-title\">\u4E50\u8C31\uFF08PDF\uFF09</div>` +\n      (D.st.song.papers.length > 1 ? `<div class=\"part-sec\">\u5370\u54EA\u4E9B</div><div class=\"set-row\">${pick(\"paper:all\", paperPick === \"all\", \"\u6574\u9996\", \"\u6BCF\u5F20\u7EB8\u6309\u987A\u5E8F\u63A5\u7740\u6392\uFF08= \u5206\u9875 + \u300C\u5168\u90E8\u300D\uFF09\")}${pick(\"paper:one\", paperPick === \"one\", `\u8FD9\u4E00\u6BB5\u300C${curPaper.name || \"\u8FD9\u5F20\u7EB8\"}\u300D`, \"\u53EA\u5370\u5149\u6807\u6240\u5728\u7684\u8FD9\u5F20\u7EB8\uFF08= \u5206\u9875 + \u300C\u672C\u6BB5\u300D\uFF09\")}</div>` : \"\") +\n      (someHidden ? `<div class=\"part-sec\">\u58F0\u90E8</div><div class=\"set-row\">${pick(\"parts:view\", partPick === \"view\", \"\u7167\u5206\u9875\u9884\u89C8\", \"\u9690\u85CF\u7684\u58F0\u90E8\u4E0D\u5370\uFF0C\u9884\u89C8\u91CC\u90A3\u6761\u7EC6\u884C\u7684\u4F4D\u7F6E\u7A7A\u7740\uFF08\u548C\u9884\u89C8\u4E00\u6837\uFF09\")}${pick(\"parts:shown\", partPick === \"shown\", `\u53EA\u6392\u770B\u5F97\u89C1\u7684\uFF1A${shownNames.join(\"\u3001\")}`, \"\u9690\u85CF\u7684\u58F0\u90E8\u6574\u4E2A\u62FF\u6389\u3001\u91CD\u65B0\u6392\uFF0C\u4E0D\u7559\u7A7A\u4F4D\uFF08\u50CF\u62BD\u51FA\u6765\u7684\u5206\u8C31\uFF1B\u548C\u5206\u9875\u9884\u89C8\u4E0D\u4E00\u6837\uFF09\")}</div>` : \"\") +\n      `<div class=\"part-sec\">\u6B4C\u8BCD\u7684\u5B57\u4F53</div><div class=\"set-row\">${chip(\"sans\", \"\u9ED1\u4F53\", \"\u601D\u6E90\u9ED1\u4F53\uFF1A\u4E2D\u6587 / \u65E5\u6587 / \u82F1\u6587\u90FD\u6709\")}${chip(\"pinyin\", \"\u62FC\u97F3\", \"\u840C\u795E\u624B\u5199\u4F53\uFF1A\u6C49\u5B57\u5934\u4E0A\u6807\u666E\u901A\u8BDD\u62FC\u97F3\uFF08\u53EF\u7231\uFF09\uFF1B\u65E5\u6587\u6B4C\u7684\u6C49\u5B57\u4E5F\u4F1A\u88AB\u6807\u4E0A\u666E\u901A\u8BDD\u62FC\u97F3\")}</div>` +\n      `<div class=\"offer-msg\">${pdfFont === \"pinyin\" ? \"\u840C\u795E\u624B\u5199\u4F53\uFF1A\u6C49\u5B57\u5934\u4E0A\u6807\u666E\u901A\u8BDD\u62FC\u97F3\uFF0C\u6B4C\u8BCD\u90A3\u4E00\u884C\u4F1A\u5F80\u4E0B\u8BA9\u51FA\u62FC\u97F3\u7684\u5730\u65B9\u3002\u65E5\u6587\u6B4C\u7684\u6C49\u5B57\u4E5F\u4F1A\u88AB\u6807\u4E0A\u666E\u901A\u8BDD\u62FC\u97F3\u3002\" : \"\u601D\u6E90\u9ED1\u4F53\uFF1A\u4E2D\u6587\u3001\u65E5\u6587\u3001\u82F1\u6587\u90FD\u6709\u3002\"}\u7B2C\u4E00\u6B21\u8981\u4E0B\u8F7D\u5B57\u4F53\uFF08\u7EA6 ${PDF_FONT_MB[pdfFont]} MB\uFF09\uFF0C\u4E4B\u540E\u79BB\u7EBF\u4E5F\u80FD\u7528\u3002\u7EB8\u5F20 = \u8FD9\u9996\u6B4C\u7684\u7EB8\uFF08\u7EB8\u7684\u6273\u624B\u91CC\u6539\uFF09\u3002</div>` +\n      `<div class=\"offer-msg\">${partPick === \"shown\" ? `\u53EA\u6392\u770B\u5F97\u89C1\u7684\u58F0\u90E8\uFF08${esc(shownNames.join(\"\u3001\"))}\uFF09\uFF1A\u91CD\u65B0\u6392\u3001\u4E0D\u7559\u7A7A\u4F4D\u2014\u2014\u548C\u5206\u9875\u9884\u89C8\u4E0D\u4E00\u6837\u3002` : `\u5370\u51FA\u6765\u7684 = \u6273\u624B\u91CC\u300C\u5206\u9875\u300D+ \u66F2\u6BB5\u63A7\u4EF6\u300C${paperPick === \"one\" ? \"\u672C\u6BB5\" : \"\u5168\u90E8\"}\u300D\u770B\u5230\u7684\u6837\u5B50\uFF0C\u53BB\u6389\u6309\u94AE\u548C\u63D0\u793A\uFF1B\u9690\u85CF\u7684${paperPick === \"one\" ? \"\" : \"\u7EB8 / \"}\u58F0\u90E8\u4E0D\u5370\uFF08\u9884\u89C8\u91CC\u90A3\u6761\u7EC6\u884C\u7684\u4F4D\u7F6E\u7A7A\u7740\uFF09\u3002`}</div>` +\n      `<div class=\"offer-btns\"><button class=\"btn\" data-v=\"close\">\u7B97\u4E86</button><button class=\"btn primary\" data-v=\"go\">\u751F\u6210 PDF</button></div></div>`;\n  };\n  draw(); document.body.append(box);\n  const close = () => { box.remove(); ui.closed(close); scoreEl.focus(); };\n  ui.open({ k: \"sheet\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"close\") { close(); return; }\n    if (v?.startsWith(\"font:\")) { pdfFont = v.slice(5) as PdfFontId; draw(); view.render(); return; }   // \u89C6\u56FE\u6001\uFF08desk\uFF09\uFF1A\u5B58\u65F6\u987A\u624B\u5E26\u3001\u4E0D\u6807\u810F\uFF1B\u5206\u9875\u9884\u89C8\u8DDF\u7740\u8BA9\u51FA\u62FC\u97F3\u90A3\u4E00\u622A\n    if (v === \"paper:all\" || v === \"paper:one\") { paperPick = v === \"paper:all\" ? \"all\" : \"one\"; draw(); return; }\n    if (v === \"parts:view\" || v === \"parts:shown\") { partPick = v === \"parts:view\" ? \"view\" : \"shown\"; draw(); return; }\n    if (v === \"go\") { close(); void exportPdf(pdfFont, { ...(paperPick === \"one\" ? { paper: curPaper.id } : {}), ...(partPick === \"shown\" ? { onlyShown: true } : {}) }); }\n  });\n}\n/** PDF \u5370\u54EA\u4E9B\uFF1Apaper = \u53EA\u5370\u8FD9\u4E00\u5F20\u7EB8\uFF1BonlyShown = \u53EA\u6392\u770B\u5F97\u89C1\u7684\u58F0\u90E8\uFF08\u9690\u85CF\u7684\u6574\u4E2A\u62FF\u6389\u3001\u91CD\u6392\uFF09\u3002 */\ninterface PdfPick { paper?: string; onlyShown?: boolean }\nlet pdfBusy = false;\n/** \u751F\u6210\u4E50\u8C31 PDF = \u300C\u5168\u90E8 + \u5206\u9875\u300D\u9884\u89C8\u9664\u4E86\u63A7\u4EF6\u548C\u63D0\u793A\u7684\u6837\u5B50\uFF082026-10-09 user\u300C\u2026\u505A\u5230\u9664\u4E86\u63A7\u4EF6\u548C\u63D0\u793A\u5916\u7684wysiwyg\u300D\uFF09\uFF1A\u6574\u9996\uFF1B\u9690\u85CF\u7684\u7EB8 / \u58F0\u90E8\u4E0D\u5370\uFF08\u9884\u89C8\u91CC\u90A3\u6761\u7EC6\u884C\u7684\u4F4D\u7F6E\u7A7A\u7740\uFF09\uFF0C\n *  \u540C\u4E00\u4EFD\u58F0\u90E8\u89C6\u56FE\u3001\u540C\u4E00\u628A\u91CF\u5B57\u7684\u5C3A\u5B50\uFF08view.measureAt\uFF09\u3001\u540C\u4E00\u4E2A\u5C0F\u8282\u7EBF\u5F00\u5173\u3001\u540C\u6837\u7684\u62FC\u97F3\u8BA9\u4F4D\u3002 */\nasync function makePdf(fontId: PdfFontId, pick: PdfPick = {}): Promise<{ file: File; r: ReturnType<typeof scorePdf> }> {\n    progress(`\u4E0B\u8F7D\u5B57\u4F53\uFF08\u7B2C\u4E00\u6B21\u7EA6 ${PDF_FONT_MB[fontId]} MB\uFF09\u2026`);\n    const [font, music] = await Promise.all([loadPdfFont(fontId), loadMusicOutlines()]);\n    progress(\"\u6392\u7248\u2026\");\n    const title = D.st.song.title || docName();\n    let song = D.st.song, parts = partViews();\n    if (pick.onlyShown) {   // \u53EA\u6392\u770B\u5F97\u89C1\u7684\uFF1A\u9690\u85CF\u7684\u58F0\u90E8\uFF08\u8FDE\u5B83\u5728\u5404\u5F20\u7EB8\u4E0A\u7684\u8F68\uFF09\u6574\u4E2A\u62FF\u6389\uFF1B\u4E00\u4E2A\u770B\u5F97\u89C1\u7684\u58F0\u90E8\u90FD\u6CA1\u6709\u7684\u7EB8\u4E5F\u62FF\u6389\n      const keep = new Set(D.st.song.parts.filter((p) => isShown(p.id)).map((p) => p.id));\n      song = { ...song, parts: song.parts.filter((p) => keep.has(p.id)), papers: song.papers.map((p) => ({ ...p, tracks: Object.fromEntries(Object.entries(p.tracks).filter(([k]) => keep.has(k))) })).filter((p) => Object.keys(p.tracks).length || p.id === pick.paper) };\n      parts = parts.filter((v) => keep.has(v.id)).map((v, k) => ({ ...v, hidden: false, first: k === 0 }));\n    }\n    const r = scorePdf({ song, parts, font, fontId, music, title, created: new Date(), measureAt: (px) => view.measureAt(px), autoBars, ...(pick.paper ? { onlyPaper: pick.paper } : {}) });\n    const paperName = pick.paper ? (D.st.song.papers.find((p) => p.id === pick.paper)?.name || \"\u8FD9\u4E00\u6BB5\") : \"\";\n    const suffix = [paperName, pick.onlyShown ? parts.map((v) => v.name).join(\"+\") : \"\"].filter(Boolean).map((x) => fileSafe(x)).join(\"-\");\n    return { file: new File([r.bytes as unknown as BlobPart], `${stampedCopy(`${docName()}${suffix ? `-${suffix}` : \"\"}`)}.pdf`, { type: \"application/pdf\" }), r };   // \u540D[-\u66F2\u6BB5 / \u58F0\u90E8]-YYYYMMDD-HHMM\uFF08v0.9.47\uFF09\n}\nasync function exportPdf(fontId: PdfFontId, pick: PdfPick = {}): Promise<void> {\n  if (pdfBusy) return;\n  pdfBusy = true;\n  try {\n    const { file, r } = await makePdf(fontId, pick);\n    progress(\"\");\n    const miss = r.stats.missing.length ? `<div class=\"offer-msg\">\u8FD9\u4E9B\u5B57\u8FD9\u6B3E\u5B57\u4F53\u91CC\u6CA1\u6709\uFF0CPDF \u91CC\u662F\u7A7A\u767D\uFF1A${esc(r.stats.missing.slice(0, 20).join(\" \"))}${r.stats.missing.length > 20 ? \" \u2026\" : \"\"}</div>` : \"\";\n    const missM = r.stats.missingMusic.length ? `<div class=\"offer-msg\">\u6709 ${r.stats.missingMusic.length} \u79CD\u8BB0\u8C31\u7B26\u53F7\u6CA1\u753B\u51FA\u6765\uFF08${esc(r.stats.missingMusic.join(\" \"))}\uFF09\u2014\u2014\u8FD9\u662F app \u7684\u6BDB\u75C5\uFF0C\u8BF7\u544A\u8BC9\u6211\u4EEC\u3002</div>` : \"\";\n    offerFile(file, \"\u4E50\u8C31 PDF \u597D\u4E86\", `${r.pages} \u9875 \u00B7 ${fontId === \"pinyin\" ? \"\u62FC\u97F3\u5B57\u4F53\" : \"\u9ED1\u4F53\"} \u00B7 ${file.size < 1e6 ? `${Math.round(file.size / 1e3)} KB` : `${(file.size / 1e6).toFixed(1)} MB`}` + miss + missM);\n  } catch (e) {\n    progress(\"\"); showError(`PDF \u751F\u6210\u5931\u8D25\uFF1A${(e as Error).message}`);\n  } finally { pdfBusy = false; }\n}\n/** \u73B0\u5728\u4F1A\u51FA\u58F0\u7684\u58F0\u90E8\u7684\u89D2\u8272\uFF08\u9884\u89C8\u6F14\u51FA\u7F72\u540D\u7528\uFF09\uFF1A\u51FA\u58F0\u7684\uFF08\u9759\u97F3 / \u72EC\u594F\u7167\u73B0\u5728\u7684\uFF09\u3001\u6574\u9996\u91CC\u6709\u97F3\u7684\uFF1B\u5BFC\u51FA mp3 \u65F6\u6309\u771F\u6E32\u67D3\u51FA\u4E86\u58F0\u7684\u7B97\uFF08renderMix \u7684 roles\uFF09\u3002 */\nfunction soundingRoles(): string[] {\n  return audibleParts().filter((p) => flattenPart(D.st.song, p.id).tokens.some((t) => t.kind === \"note\")).map((p) => p.role);\n}\n/** \u6587\u4EF6\u83DC\u5355\u91CC\u300C\u4E50\u5668\u7684\u58F0\u97F3\u300D\u4E00\u8282\uFF1A\u6253\u5305 / \u53EA\u8BB0\u6765\u6E90\u5404\u51E0\u4EF6 + \u5168\u90E8\u6253\u5305 / \u5168\u90E8\u89E3\u5305 + \u6253\u5305\u5206\u53D1\u7684\u8BB8\u53EF\uFF08\u6587\u4EF6\u91CC\u5E26\u7740\u8C01\u7684\u6E90\u6587\u4EF6\uFF09\u3002\u6B4C\u91CC\u6CA1\u6709 SoundFont \u4E50\u5668 = \u4E0D\u753B\u3002 */\nfunction soundsSection(): string {\n  const uses = soundUses(D.extras); if (!uses.length) return \"\";\n  const packed = uses.filter((u) => u.packed), size = packed.reduce((n, u) => n + u.bytes, 0);\n  return `<div class=\"part-sec\">\u4E50\u5668\u7684\u58F0\u97F3</div>` +\n    `<div class=\"offer-msg\">${uses.length} \u4EF6\uFF1A\u6253\u5305\u5728\u6B4C\u91CC ${packed.length} \u4EF6${packed.length ? `\uFF08${sizeText(size)}\uFF09` : \"\"}\uFF0C\u53EA\u8BB0\u6765\u6E90 ${uses.length - packed.length} \u4EF6\u3002\u6253\u5305 = \u58F0\u97F3\u8DDF\u7740\u6B4C\u8D70\uFF08\u53D1\u7ED9\u522B\u4EBA\u4E5F\u80FD\u54CD\uFF0C\u6587\u4EF6\u53D8\u5927\uFF09\uFF1B\u53EA\u8BB0\u6765\u6E90 = \u6B4C\u5C0F\uFF0C\u58F0\u97F3\u4ECE\u8FD9\u53F0\u8BBE\u5907 / \u5BB6\u65CF\u97F3\u6E90\u5E93 / \u4F60\u7684\u6587\u4EF6\u91CC\u627E\u3002\u5C0F\u6708\u76F8\u4E0D\u6253\u5305\uFF08\u5979\u662F\u6A21\u578B\u5305\uFF0C\u6B4C\u91CC\u53EA\u9489\u54C8\u5E0C\uFF09\u3002</div>` +\n    `<div class=\"set-row\">${packed.length < uses.length ? `<button class=\"btn\" data-v=\"pack\">\u5168\u90E8\u6253\u5305\u8FDB\u6B4C</button>` : \"\"}${packed.length ? `<button class=\"btn\" data-v=\"unpack\">\u5168\u90E8\u89E3\u5305\uFF08\u53EA\u8BB0\u6765\u6E90\uFF09</button>` : \"\"}</div>` +\n    creditsBlock(packedLicenses(D.extras), \"\u6253\u5305\u5206\u53D1\u7684\u8BB8\u53EF\uFF08\u6587\u4EF6\u91CC\u5E26\u7740\u8FD9\u4E9B\u6E90\u6587\u4EF6\uFF09\");\n}\n/** \u6F14\u51FA\u7F72\u540D\uFF08\u6587\u4EF6\u83DC\u5355 / \u5BFC\u51FA\uFF09\uFF1A\u7528\u4E86\u8C01\u7684\u58F0\u97F3\u2014\u2014\u51FA\u4E86\u58F0\u7684\u58F0\u90E8\u4E0A\u573A\u90A3\u4F4D\uFF0C\u6253\u5305 / \u5F31\u5F15\u7528\u90FD\u7B97\uFF1B\u51B7\u677F\u51F3\u3001\u6CA1\u51FA\u58F0\u7684\u58F0\u90E8\u4E0D\u7B97\uFF08user 2026-10-08 \u53E3\u5F84\uFF09\u3002 */\n/** \u7F72\u540D = \u8FD9\u9996\u6B4C\u81EA\u5DF1\u90A3\u4E00\u6761\uFF08\u4F5C\u8005\u680F + \u7528\u6237\u9009\u7684\u8BB8\u53EF\uFF1B\u90FD\u7A7A = \u6CA1\u6709\u8FD9\u6761\uFF09+ \u6F14\u51FA\u7F72\u540D\uFF1B\u5916\u52A0\u53EA\u63D0\u793A\u4E0D\u62E6\u7684\u63D0\u9192\uFF08licenseHints\uFF09\u3002\u5BFC\u51FA mp3 \u5199\u8FDB ID3 \u4E5F\u7528\u8FD9\u4E00\u4EFD\u3002 */\n/** rights = \u8FD9\u4E00\u4EFD\u5199\u7684\u8BB8\u53EF\uFF08\u5BFC\u51FA\u65F6\u53EF\u80FD\u56DE\u9000\u6210\u672A\u58F0\u660E\uFF1AexportRights\uFF09\uFF1B\u4E0D\u7ED9 = \u6B4C\u91CC\u9009\u7684\u3002 */\nfunction creditsOf(roles: readonly string[], rights: string | undefined = D.st.song.rights): { lines: CreditLine[]; hints: string[] } {\n  const perf = performerCredits(D.extras, roles), own = songCreditLine({ ...D.st.song, rights });\n  return { lines: own ? [own, ...perf] : perf, hints: licenseHints(rights, perf) };\n}\n/** \u6587\u4EF6\u83DC\u5355\u91CC\u7684\u7F72\u540D\uFF08\u6298\u53E0\uFF09\uFF1B\u63D0\u9192\u53EA\u5728\u7528\u6237\u81EA\u5DF1\u9009\u4E86\u8BB8\u53EF\u65F6\u624D\u53EF\u80FD\u51FA\u73B0\uFF08licenseHints \u8981 rights\uFF09\u3002 */\nconst performersBlock = (roles: readonly string[], title = \"\u7F72\u540D\") => {\n  const { lines, hints } = creditsOf(roles);\n  return creditsBlock(lines, title) + hints.map((h) => `<div class=\"offer-msg credits-hint\">${esc(h)}</div>`).join(\"\");\n};\n/** \u9876\u680F\u7684\u83DC\u5355\uFF082026-10-08 \u665A\u91CD\u7406\uFF0CClaude Opus 5.5\uFF1Buser\u300C\u70B9\u4E86\u6587\u4EF6\u540D\u4E4B\u540E\u5F39\u51FA\u7684\u90A3\u4E2A\u83DC\u5355\u4E5F\u4E25\u91CDobsolete\u4E86\uFF0C\u4E09\u6761\u6760\u83DC\u5355\u4E5F\u6709obsolete\u7684\u4E1C\u897F\u300D\n *  \u300C\u4E09\u6761\u6760\u91CC\u9762\u4E0D\u5E94\u8BE5\u6709\u4E50\u5668\u76EE\u5F55\uFF0C\u4E91\u7AEF\uFF0C\u6B4C\u5E93 \u5F55\u97F3\u5BA4\uFF0C\u4ED6\u4EEC\u7684\u5165\u53E3\u5728\u522B\u7684\u5730\u65B9\uFF0C\u6587\u4EF6\u83DC\u5355\u4E5F\u4E0D\u5BF9\uFF0C\u548C\u4E09\u6761\u6760\u6DF7\u6DC6\u4E86\uFF0C\u53C2\u8003\u4E0Bweebpaint\u548Cwxhw\u7684\u83DC\u5355\u8BBE\u8BA1\u300D\uFF09\uFF1A\n *  - \u6587\u4EF6\u540D = \u7BA1\u7406\u7528\u7684\u628A\u624B\uFF0C\u70B9\u4E86 = \u6539\u540D\uFF08\u540C WXHW ADR-0007\uFF09\uFF1B\u672C\u673A\u6587\u4EF6\uFF08\u6709\u53E5\u67C4\uFF09\u7684\u540D\u5B57\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u91CC\u6539\uFF0C\u8FD9\u91CC\u53EA\u8BF4\u4E00\u58F0\u3002\n *  - \u4E09\u6761\u6760 = \u8FD9\u9996\u6B4C\u7684\u4F4E\u9891\u4E8B\u52A1\uFF08\u540C WeebPaint \u2630\u300C\u6587\u4EF6\u300D\u9875\uFF09\uFF1A\u65B0\u5EFA / \u6253\u5F00\u672C\u673A\u6587\u4EF6 / \u5BFC\u51FA / \u5B58\u8FDB\u6B4C\u5E93 / \u6539\u6587\u4EF6\u540D / \u5C01\u9762 / \u58F0\u97F3\u4E0E\u7F72\u540D\uFF0C\u6700\u540E\u662F\u8BBE\u7F6E\u3002\n *    \u5B58 = \u9876\u680F\u7684 smart save\uFF08\u72B6\u6001\u5373\u6309\u94AE\uFF09\uFF1B\u6B4C\u5E93 = \u5DE6\u4E0A\u89D2\u56FE\u6807\uFF1B\u4E91\u7AEF = \u6B4C\u5E93\u91CC\u7684\u4E91\u6735\uFF1B\u5F55\u97F3\u5BA4 = \u8D70\u5E26\u91CC\u7684\u63A8\u5B50\uFF1B\u4E50\u5668\u76EE\u5F55 = \u4E50\u5668\u9875 / \u6B4C\u5E93\u2014\u2014\u90FD\u4E0D\u5728\u8FD9\u91CC\u91CD\u590D\u3002\n *  \u6CA1\u6709\u300C\u53E6\u5B58\u4E3A\u300D\uFF08\u5B83\u4F4F\u5BFC\u51FA\u91CC\uFF0Cuser 2026-08-20\u300Copen local file \u548C save as \u4E00\u52A0\u591A\u4E86\u5F88\u591A\u4F1A\u6DF7\u6DC6\u7528\u6237\u7684\u4E1C\u897F\u300D\uFF09\u3002 */\nfunction fileWhere(): string {\n  const h = H.home;\n  switch (h.kind) {\n    case \"gallery\": return `\u5728\u6B4C\u5E93\u91CC\uFF0C\u81EA\u52A8\u5B58${isSignedIn() ? \"\uFF1B\u6362\u6B4C / \u9000\u51FA / \u6309\u300C\u5B58\u300D\u65F6\u63A8\u4E0A OneDrive\" : \"\uFF08\u6CA1\u767B\u5F55\uFF0C\u53EA\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\uFF09\"}`;\n    case \"file\": return `\u5B58\u5728\u672C\u673A\u6587\u4EF6 ${h.handle.name}\uFF0C\u300C\u5B58\u300D= \u5B58\u56DE\u53BB`;\n    case \"none\": return h.pendingFolder != null ? \"\u65B0\u7684\u4E00\u9996\uFF1A\u7B2C\u4E00\u7B14\u5199\u4E0B\u53BB\u5C31\u8FDB\u6B4C\u5E93\" : docFile.canPickSave() ? \"\u8FD8\u6CA1\u5B58\u8FC7\uFF1A\u300C\u5B58\u300D\u4F1A\u95EE\u5B58\u5230\u54EA\" : \"\u8FD9\u53F0\u8BBE\u5907\u4E0A\u300C\u5B58\u300D= \u4E0B\u8F7D\u6216\u5206\u4EAB\u4E00\u4E2A .mxl\";\n    default: return assertNever(h);\n  }\n}\nfunction clickFileName(): void {\n  if (H.home.kind === \"file\") { info(`\u672C\u673A\u6587\u4EF6\u7684\u540D\u5B57\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u91CC\u6539\uFF08\u73B0\u5728\u662F ${H.home.handle.name}\uFF09`); return; }\n  void renameActive();\n}\n$(\"fileBtn\").addEventListener(\"click\", () => clickFileName());\nfunction openMainMenu(): void {\n  if (ui.overlay) { ui.close(); return; }   // \u518D\u70B9\u4E00\u4E0B\u4E09\u6761\u6760 = \u6536\u8D77\n  const box = document.createElement(\"div\");\n  box.className = \"track-card ctx-menu main-menu\"; box.setAttribute(\"role\", \"menu\");\n  const inStore = H.home.kind === \"gallery\";\n  const item = (v: string, icon: string, label: string, title = \"\") => `<button class=\"btn ctx-item\" data-v=\"${v}\"${title ? ` title=\"${esc(title)}\"` : \"\"}>${icon ? `<svg class=\"ico\"><use href=\"#${icon}\"/></svg>` : `<span class=\"ico\"></span>`}${label}</button>`;\n  box.innerHTML =\n    `<div class=\"ctx-head\"><b>${esc(H.fileName())}</b><span>${esc(fileWhere())}</span></div>` +\n    item(\"new\", \"new\", \"\u65B0\u5EFA\") + item(\"open\", \"folder-open\", \"\u6253\u5F00\u672C\u673A\u6587\u4EF6\u2026\", \"\u6253\u5F00 .mxl / .musicxml\uFF08\u62D6\u8FDB\u6765\u4E5F\u884C\uFF1BCtrl / \u2318+O\uFF09\") +\n    item(\"export\", \"export\", \"\u5BFC\u51FA\u2026\", \"mp3\u3001.mxl \u526F\u672C\uFF08\u6253\u5305\u97F3\u6E90\uFF09\u2026\uFF08Ctrl / \u2318+Shift+S\uFF09\") +\n    (hasStore() && !inStore && !H.pending() ? item(\"intoLib\", \"import\", \"\u5B58\u8FDB\u6B4C\u5E93\", \"\u628A\u8FD9\u9996\u6B4C\u653E\u8FDB\u6B4C\u5E93\uFF08\u8FD9\u53F0\u8BBE\u5907\u4E0A\u7559\u4E00\u4EFD\uFF1B\u767B\u5F55\u540E\u540C\u6B65\u5230 OneDrive\uFF09\") : \"\") +\n    `<div class=\"ctx-sep\"></div>` +\n    (H.home.kind === \"file\" ? \"\" : item(\"rename\", \"rename\", \"\u6539\u6587\u4EF6\u540D\u2026\", \"\u53EA\u6539\u6587\u4EF6\u540D\uFF0C\u7EB8\u4E0A\u7684\u6B4C\u540D\u4E0D\u53D8\uFF08\u70B9\u9876\u680F\u7684\u6587\u4EF6\u540D\u4E5F\u4E00\u6837\uFF09\")) +\n    item(\"cover\", \"image\", \"\u5C01\u9762\u56FE\u2026\", \"\u6B4C\u5E93\u5361\u7247\u4E0A\u7684\u56FE\") +\n    item(\"sounds\", \"volume\", \"\u58F0\u97F3\u4E0E\u7F72\u540D\u2026\", \"\u4E50\u5668\u7684\u58F0\u97F3\u6253\u5305 / \u89E3\u5305\uFF1B\u8FD9\u9996\u6B4C\u7528\u4E86\u8C01\u7684\u58F0\u97F3\") +\n    (finalOn() ? item(\"unfinal\", \"unlock\", `\u6539\u7A3F\u2026\uFF08\u7B2C ${D.extras.final!.rev} \u7248\u5B9A\u7A3F\u4F5C\u5E9F\uFF09`, \"\u89E3\u9501\uFF1A\u8C31 / \u6B4C\u624B / \u6DF7\u97F3\u53C8\u80FD\u6539\uFF1B\u5B9A\u7A3F\u90A3\u4EFD mp3 \u4F5C\u5E9F\uFF08\u4E0B\u6B21\u5B58\u5C31\u6CA1\u4E86\uFF09\") : item(\"final\", \"lock\", \"\u5B9A\u7A3F\u2026\", \"\u5199\u597D\u4E86\uFF1A\u6574\u9996\u6E32\u67D3\u6210 mp3 \u5B58\u8FDB\u6B4C\u91CC\uFF0C\u4E4B\u540E\u53EA\u80FD\u542C\u3001\u4E0D\u80FD\u6539\uFF1B\u6B4C\u5E93\u5C01\u9762\u4E0A\u80FD\u76F4\u63A5\u542C\u3002\u6539\u7A3F\u968F\u65F6\u89E3\u9501\")) +\n    item(\"ref\", \"picture-in-picture\", refHost.isOpen() ? \"\u6536\u8D77\u53C2\u8003\u7A97\" : `\u53C2\u8003\u7A97${refHost.count() ? `\uFF08${refHost.count()} \u5F20\uFF09` : \"\"}`, \"\u622A\u56FE / \u6587\u5B57\u653E\u5728\u65C1\u8FB9\u5BF9\u7740\u770B\uFF1A\u70B9\u5F00\u540E\u7C98\u8D34\uFF08Ctrl / \u2318+V\uFF09\u3001\u62D6\u8FDB\u6765\uFF0C\u6216\u8005\u300C\uFF0B\u300D\u5BFC\u5165\uFF1B\u8DDF\u7740\u6B4C\u4E00\u8D77\u5B58\") +\n    `<div class=\"ctx-sep\"></div>` +\n    `<div class=\"ctx-ver\">${esc(APP_VERSION)}</div>` +   // \u7248\u672C\u53F7\u5C0F\u7070\u5B57\uFF08user 2026-10-08\u300C\u7248\u672C\u53F7\u5C0F\u7070\u5B57\u653E\u5728\u8BBE\u7F6Emenuitem\u4E0A\u9762\u300D\uFF09\n    item(\"settings\", \"settings\", \"\u8BBE\u7F6E\u2026\", \"\u6A21\u578B / \u97F3\u6E90\u5E93\u6765\u6E90\u3001\u7F13\u5B58\u3001\u7F72\u540D\u4E0E\u6761\u6B3E\u3001\u8BCA\u65AD\u65E5\u5FD7\u3001\u7248\u672C\");\n  document.body.append(box);\n  const r = $(\"setBtn\").getBoundingClientRect(), w = box.offsetWidth, h = box.offsetHeight, m = 8;\n  box.style.left = `${Math.max(m, Math.min(r.right - w, innerWidth - w - m))}px`; box.style.top = `${Math.max(m, Math.min(r.bottom + 6, innerHeight - h - m))}px`;\n  const outside = (e: PointerEvent) => { if (!box.contains(e.target as Node) && !$(\"setBtn\").contains(e.target as Node)) close(); };\n  const close = () => { document.removeEventListener(\"pointerdown\", outside, true); box.remove(); ui.closed(close); };\n  setTimeout(() => { if (box.isConnected) document.addEventListener(\"pointerdown\", outside, true); }, 0);\n  ui.open({ k: \"menu\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (!v) return;\n    close();\n    if (v === \"new\") void fileNew(); else if (v === \"open\") void fileOpen(); else if (v === \"export\") openExportHub();\n    else if (v === \"intoLib\") void saveIntoGallery(); else if (v === \"rename\") void renameActive();\n    else if (v === \"cover\") openCoverSheet(); else if (v === \"sounds\") openSoundsSheet(); else if (v === \"settings\") openSettings(); else if (v === \"ref\") refHost.toggle();\n    else if (v === \"final\") openFinalPanel(); else if (v === \"unfinal\") void unfinalizeNow();\n  });\n}\n// \u2500\u2500 \u5B9A\u7A3F / \u6539\u7A3F\uFF08W-38\uFF1Buser 2026-10-13\u300C\u5199\u597D\u4E86\u4E4B\u540E\u52A0\u9501\uFF0C\u4F1A\u6E32\u67D3mp3\uFF0C\u4E4B\u540E\u53EA\u80FD\u542C\uFF0C\u4E0D\u80FD\u4FEE\u6539\u2026gallery\u53EF\u4EE5\u8BD5\u542Cmp3\u4E0D\u7528\u5F00app\u300D\u300C\u5B9A\u7A3F\u6539\u7A3F\u540C\u610F\u300D\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//   \u5B9A\u7A3F = \u8D70\u65E0\u5934\u6E32\u67D3\u6838\u5FC3\u628A\u6574\u9996\u6E32\u6210 mp3\uFF08\u9759\u97F3 / \u72EC\u594F\u6309\u73B0\u5728\uFF1B\u6548\u679C\u7167\u5E38\uFF09\u2192 \u8BB0\u5F55\uFF08\u65F6\u523B / \u7B2C\u51E0\u7248 / \u6838\u5FC3\u7248\u672C + \u54C8\u5E0C / \u51FA\u58F0\u5185\u5BB9\u7684\u6307\u7EB9 / mp3 \u53C2\u6570 / \u54EA\u4E9B\u58F0\u90E8\uFF09+ \u88F8 mp3 \u8FDB extras \u2192\n//   \u81EA\u52A8\u5B58\uFF08\u6B4C\u5E93\uFF09/\u300C\u2022\u300D\uFF08\u672C\u673A\uFF09\u3002\u4E4B\u540E\u56DB\u5C42\u62A4\u680F\uFF08final.ts \u5934\u6CE8\u91CA\uFF09\u3002\u6539\u7A3F = \u8BB0\u5F55\u548C mp3 \u4E00\u8D77\u4E22\u6389\u3002\u4E24\u4EF6\u90FD\u4E0D\u8FDB undo\uFF08\u5B9A\u7A3F\u662F\u4E00\u6B21\u6E32\u67D3\uFF0C\u64A4\u9500 = \u6539\u7A3F\uFF09\u3002\nfunction openFinalPanel(): void {\n  ui.close();\n  if (finalOn()) { info(\"\u5DF2\u7ECF\u5B9A\u7A3F\u4E86\u3002\u8981\u6539\u5148\u300C\u6539\u7A3F\u300D\u3002\"); return; }\n  const box = document.createElement(\"div\");\n  box.className = \"offer\";\n  const draw = () => {\n    const chip = (v: string, label: string, note: string, on: boolean) => `<button class=\"btn cand${on ? \" is-on\" : \"\"}\" data-v=\"${v}\">${esc(label)}<small>${esc(note)}</small></button>`;\n    const parts = audibleParts(), labels = partLabels(D.st.song, D.extras), names = D.st.song.parts.map((p, k) => (parts.includes(p) ? labels[k] : null)).filter((x): x is string => !!x);\n    const is = perfApi.issues().filter((i) => parts.some((p) => p.id === i.part));\n    box.innerHTML = `<div class=\"offer-card settings-card\"><div class=\"offer-title\">\u5B9A\u7A3F${D.extras.finalRev ? `\uFF08\u7B2C ${D.extras.finalRev + 1} \u7248\uFF09` : \"\"}</div>` +\n      `<div class=\"offer-msg\">\u5199\u597D\u4E86\uFF1A\u6574\u9996\u6E32\u67D3\u6210 mp3\uFF08\u5E26\u6B4C\u540D / \u4F5C\u8005\u680F / \u8BB8\u53EF\u7684\u6807\u7B7E\u548C\u5C01\u9762\u56FE\uFF09\u5B58\u8FDB\u6B4C\u91CC\uFF1B\u4E4B\u540E<b>\u53EA\u80FD\u542C</b>\u2014\u2014\u8C31\u3001\u6B4C\u540D\u3001\u4F5C\u8005\u680F\u3001\u8BB8\u53EF\u3001\u5C01\u9762\u3001\u6B4C\u624B\u3001\u6DF7\u97F3\u5168\u9501\u4F4F\uFF0C\u80FD\u6539\u7684\u53EA\u6709\u6587\u4EF6\u540D\u3002\u968F\u65F6\u300C\u6539\u7A3F\u300D\u89E3\u9501\uFF08\u90A3\u4EFD mp3 \u4F5C\u5E9F\uFF09\u3002\u6B4C\u5E93\u7684\u5C01\u9762\u4E0A\u80FD\u76F4\u63A5\u542C\u3002</div>` +\n      `<div class=\"part-sec\">\u97F3\u8D28</div><div class=\"set-row\">${(Object.keys(MP3_QUALITY) as Mp3Quality[]).map((q) => chip(`q:${q}`, MP3_QUALITY[q].label, MP3_QUALITY[q].note, mp3Quality === q)).join(\"\")}</div>` +\n      `<div class=\"offer-msg\">\u8FDB mp3 \u7684\uFF1A${names.length ? esc(names.join(\"\u3001\")) : \"\uFF08\u6CA1\u6709\u51FA\u58F0\u7684\u58F0\u90E8\uFF09\"}${D.st.song.parts.length !== parts.length ? \"\uFF08\u9759\u97F3 / \u72EC\u594F\u6309\u73B0\u5728\u7684\uFF1B\u8981\u90FD\u8FDB\u6765\u5148\u53D6\u6D88\u9759\u97F3\uFF09\" : \"\"}\u3002</div>` +\n      (is.length ? `<div class=\"offer-msg issue-warn\">${is.length} \u6761\u8F68\u4E0D\u51FA\u58F0\uFF0Cmp3 \u91CC\u4E0D\u4F1A\u6709\u5B83\u4EEC\uFF1A${esc(perfApi.issuesText(is))}\u3002\u6362\u4EBA\u5728\u8C31\u524D\u9762\u7684\u58F0\u90E8\u540D\u91CC\u3002</div>` : \"\") +\n      `<div class=\"offer-btns\"><button class=\"btn primary\" data-v=\"go\"${names.length ? \"\" : \" disabled\"}>${is.length ? \"\u7167\u6837\u5B9A\u7A3F\" : \"\u5B9A\u7A3F\"}</button><button class=\"btn\" data-v=\"close\">\u7B97\u4E86</button></div></div>`;\n  };\n  draw();\n  document.body.append(box);\n  const close = () => { box.remove(); ui.closed(close); scoreEl.focus(); };\n  ui.open({ k: \"sheet\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"close\") { close(); return; }\n    if (v?.startsWith(\"q:\")) { mp3Quality = v.slice(2) as Mp3Quality; draw(); }\n    else if (v === \"go\") { close(); void finalizeNow(mp3Quality); }\n  });\n}\nlet finalizing = false;\n/** \u5B9A\u7A3F\uFF1A\u6E32 \u2192 \u8BB0\u5F55 + mp3 \u8FDB extras \u2192 \u542C\u6A21\u5F0F \u2192 \u81EA\u52A8\u5B58 / \u300C\u2022\u300D\u3002\u5931\u8D25 = \u4EC0\u4E48\u90FD\u4E0D\u53D8\uFF08\u62A5\u51FA\u6765\uFF09\u3002\u8FD4\u56DE\u8BB0\u5F55\uFF08E2E \u7528\uFF09\u3002 */\nasync function finalizeNow(quality: Mp3Quality = mp3Quality): Promise<FinalRecord | null> {\n  if (finalizing || finalOn()) return null;\n  finalizing = true;\n  try {\n    await H.settleIfEdited();   // \u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31\u6709\u7B14 = \u5148\u5B89\u5BB6\uFF08\u5B9A\u7A3F\u8981\u81EA\u52A8\u5B58\u8FDB\u6B4C\u5E93\uFF09\n    const r = await perfApi.renderMp3({ quality, scope: \"all\" });\n    const is = perfApi.issues();   // \u5B9A\u7A3F\u90A3\u4E00\u523B\u7684\u6E05\u5355\uFF08mp3 \u91CC\u6CA1\u6709\u5B83\u4EEC\uFF09\n    // \u5B58\u7684\u5C31\u662F\u53D1\u884C\u7684\u90A3\u4E00\u4EFD\uFF1AID3\uFF08\u6B4C\u540D / \u4F5C\u8005 / \u8BB8\u53EF / \u7F72\u540D / \u8F6F\u4EF6\uFF09+ \u5C01\u9762\u56FE\uFF08APIC\uFF09+ \u97F3\u9891\u5E27\uFF0C\u4E4B\u540E\u539F\u5B57\u8282\u5BFC\u51FA\uFF08user\u300C\u90FD\u51BB\u540C\u610F\uFF0C\u5C01\u9762\u5F53\u7136\u8FDB\u300D\uFF09\n    const tagged = new Uint8Array(perfApi.mp3Tag(r.roles).tag.length + r.bytes.length); tagged.set(perfApi.mp3Tag(r.roles).tag, 0); tagged.set(r.bytes, tagged.length - r.bytes.length);\n    const rec: FinalRecord = { at: new Date().toISOString(), rev: D.extras.finalRev + 1, app: APP_VERSION, core: coreInfo(), fingerprint: contentFingerprintOf(saveArgs()),\n      mp3: { path: FINAL_MP3_ENTRY, bytes: tagged.length, sha256: await sha256Hex(tagged), secs: r.secs, sr: r.sr, kbps: r.kbps, stereo: r.stereo }, parts: r.parts, ...(is.length ? { issues: is.map((i) => ({ part: i.part, why: i.why })) } : {}) };\n    if (ws.mode !== \"listen\") { lastEditMode = ws.mode; ws.mode = \"listen\"; }\n    const c = D.commit({ extras: withFinal(D.extras, rec, tagged) }, { locus: { kind: \"final\", label: \"\u5B9A\u7A3F\" }, undo: false });   // \u540C\u4E00\u4E2A\u5165\u53E3\uFF08\u4E0D\u8FDB undo\uFF1A\u64A4\u9500 = \u6539\u7A3F\uFF09\uFF1B\u57FA\u7EBF\u5E26\u7740 final.at \u2192 \u6807\u810F \u2192 \u6B4C\u5E93\u81EA\u52A8\u5B58 / \u672C\u673A\u300C\u2022\u300D\n    if (!c.ok) throw new Error(c.why);\n    info(`\u5B9A\u7A3F\u4E86\uFF08\u7B2C ${rec.rev} \u7248\uFF09\uFF1Amp3 ${mp3SizeText(r.bytes.length)}\u3001${r.secs.toFixed(1)} \u79D2\uFF0C\u5B58\u8FDB\u4E86\u6B4C\u91CC\uFF1B${H.home.kind === \"gallery\" ? \"\u6B4C\u5E93\u5C01\u9762\u4E0A\u80FD\u76F4\u63A5\u542C\u3002\" : \"\u6309\u300C\u5B58\u300D\u5199\u8FDB\u6587\u4EF6\u3002\"}\u53EA\u80FD\u542C\u4E86\u2014\u2014\u8981\u6539\uFF0C\u4E09\u6761\u6760\u91CC\u300C\u6539\u7A3F\u300D\u3002`);\n    diagNote(\"doc\", `finalized rev ${rec.rev} core ${rec.core.version}@${rec.core.hash} mp3 ${r.bytes.length}B`);\n    return rec;\n  } catch (e) { showError(`\u6CA1\u5B9A\u7A3F\uFF1A${(e as Error).message}`); return null; }\n  finally { finalizing = false; }\n}\n/** \u6539\u7A3F\uFF1A\u95EE\u4E00\u53E5 \u2192 \u8BB0\u5F55\u548C mp3 \u4E00\u8D77\u4E22\u6389 \u2192 \u56DE\u5230\u5199\u3002 */\nasync function unfinalizeNow(ask = true): Promise<boolean> {\n  const f = D.extras.final; if (!f) return false;\n  if (ask && !(await askSheet(\"\u6539\u7A3F\", `\u89E3\u9501\u540E\u8C31\u3001\u6B4C\u540D\u3001\u4F5C\u8005\u680F\u3001\u5C01\u9762\u3001\u6B4C\u624B\u3001\u6DF7\u97F3\u53C8\u80FD\u6539\uFF1B\u7B2C ${f.rev} \u7248\u5B9A\u7A3F\u7684 mp3 \u4F5C\u5E9F\uFF08\u4E0B\u6B21\u5B58\u5C31\u4ECE\u6B4C\u91CC\u53BB\u6389\uFF1B\u6B4C\u5E93\u5C01\u9762\u4E0A\u4E5F\u542C\u4E0D\u4E86\uFF0C\u8981\u518D\u5B9A\u7A3F\u4E00\u6B21\uFF09\u3002`, \"\u6539\u7A3F\"))) return false;\n  D.commit({ extras: withoutFinal(D.extras) }, { locus: { kind: \"final\", label: \"\u6539\u7A3F\" }, undo: false });\n  setMode(lastEditMode === \"listen\" ? \"notes\" : lastEditMode);\n  info(`\u6539\u7A3F\u4E86\uFF1A\u7B2C ${f.rev} \u7248\u5B9A\u7A3F\u4F5C\u5E9F\uFF0C\u80FD\u6539\u4E86\u3002`);\n  diagNote(\"doc\", `unfinalized rev ${f.rev}`);\n  return true;\n}\n/** \u5C01\u9762\u56FE\uFF08\u6B4C\u5E93\u5361\u7247\u4E0A\u7684\u56FE\uFF1B\u7F29\u6210 256\u00B2 \u5B58\u8FDB\u6B4C\u91CC\uFF09\u3002 */\nfunction openCoverSheet(): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"offer\";\n  const thumb = D.extras.thumbnail;\n  const coverUrl = thumb ? URL.createObjectURL(new Blob([thumb as unknown as BlobPart], { type: \"image/png\" })) : null;\n  box.innerHTML = `<div class=\"offer-card settings-card\"><div class=\"offer-title\">\u5C01\u9762\u56FE</div>` +\n    `<div class=\"set-row cover-row\"><span class=\"cover-thumb\">${coverUrl ? `<img src=\"${coverUrl}\" alt=\"\u5C01\u9762\" />` : `<span class=\"cover-none\">\u6CA1\u6709\u5C01\u9762\u56FE</span>`}</span>` +\n    `<label class=\"btn\" title=\"\u9009\u4E00\u5F20\u56FE\u5F53\u5C01\u9762\uFF08\u7F29\u6210 256\u00B2 \u5B58\u8FDB\u6B4C\u91CC\uFF1B\u6B4C\u5E93\u5361\u7247\u4E0A\u6B4C\u540D\u5370\u5728\u56FE\u4E0A\u9762\uFF09\"><svg class=\"ico\"><use href=\"#image\"/></svg>${thumb ? \"\u6362\u4E00\u5F20\u2026\" : \"\u9009\u4E00\u5F20\u56FE\u2026\"}<input id=\"coverIn\" type=\"file\" accept=\"image/*\" hidden /></label>` +\n    (thumb ? `<button class=\"btn\" data-v=\"coverOff\">\u53BB\u6389\u5C01\u9762\u56FE</button>` : \"\") + `</div>` +\n    `<div class=\"offer-msg\">\u6B4C\u5E93\u5361\u7247\u4E0A\u7684\u56FE\uFF1B\u6B4C\u540D\u548C\u65E5\u671F\u7167\u6837\u5370\u5728\u4E0A\u9762\u3002\u7F29\u6210 256\u00B2 \u5B58\u8FDB\u6B4C\u91CC\u3002</div>` +\n    `<div class=\"offer-btns\"><button class=\"btn primary\" data-v=\"close\">\u597D</button></div></div>`;\n  document.body.append(box);\n  const close = () => { box.remove(); ui.closed(close); if (coverUrl) URL.revokeObjectURL(coverUrl); scoreEl.focus(); };\n  ui.open({ k: \"sheet\", close });\n  box.querySelector<HTMLInputElement>(\"#coverIn\")!.addEventListener(\"change\", (e) => { const f = (e.target as HTMLInputElement).files?.[0]; close(); if (f) void setCover(f); });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"close\") { close(); return; }\n    if (v === \"coverOff\") { close(); updateExtras(withThumbnail(D.extras, null), { kind: \"cover\", label: \"\u53BB\u6389\u5C01\u9762\u56FE\" }); info(\"\u53BB\u6389\u4E86\u5C01\u9762\u56FE\"); }\n  });\n}\n/** \u58F0\u97F3\u4E0E\u7F72\u540D\uFF1A\u4E50\u5668\u7684\u58F0\u97F3\u6253\u5305 / \u89E3\u5305\uFF08Blender \u5F0F\uFF09+ \u8FD9\u9996\u6B4C\u7528\u4E86\u8C01\u7684\u58F0\u97F3\uFF08\u6F14\u51FA\u7F72\u540D\uFF0C\u6298\u53E0\uFF09\u3002 */\nfunction openSoundsSheet(): void {\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"offer\";\n  const sounds = soundsSection();\n  box.innerHTML = `<div class=\"offer-card settings-card\"><div class=\"offer-title\">\u58F0\u97F3\u4E0E\u7F72\u540D</div>` +\n    (sounds || `<div class=\"offer-msg\">\u8FD9\u9996\u6B4C\u6CA1\u7528\u4E50\u5668\u7684\u58F0\u97F3\u6587\u4EF6\uFF08\u5C0F\u6708\u76F8 / \u5143\u97F3\u7248\u7684\u58F0\u97F3\u968F app \u8D70\uFF0C\u4E0D\u8FDB\u6B4C\uFF09\u3002</div>`) + performersBlock(soundingRoles()) +\n    `<div class=\"offer-btns\"><button class=\"btn primary\" data-v=\"close\">\u597D</button></div></div>`;\n  document.body.append(box);\n  const close = () => { box.remove(); ui.closed(close); scoreEl.focus(); };\n  ui.open({ k: \"sheet\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"close\") { close(); return; }\n    if (v === \"pack\" || v === \"unpack\") { close(); void (v === \"pack\" ? packAll() : unpackAll()).then(() => openSoundsSheet()); }   // \u505A\u5B8C\u56DE\u5230\u8FD9\u91CC\uFF1A\u770B\u5F97\u89C1\u65B0\u72B6\u6001\u548C\u7F72\u540D\n  });\n}\n/** \u6539\u6587\u4EF6\u540D\uFF08\u53EA\u7ED9\u8FD8\u6CA1\u6709\u5BB6\u7684\uFF1A\u4E0B\u6B21\u5B58 / \u4E0B\u8F7D\u7528\u8FD9\u4E2A\u540D\u5B57\uFF1B\u7EB8\u4E0A\u7684\u6B4C\u540D\u4E0D\u53D8\uFF1Buser\u300C\u4E4B\u540E\u5404\u7BA1\u5404\u7684\u540C\u610F\uFF0C\u4F46\u662F\u8981\u6709\u6539\u6587\u4EF6\u540D\u7684\u89C4\u5219\uFF1F\u300D\uFF09\u3002\n *  \u6709\u5BB6\u7684\u4E0D\u8FDB\u8FD9\u91CC\uFF08\u83DC\u5355\u4E0D\u9732\uFF09\uFF1A\u6D4F\u89C8\u5668\u6539\u4E0D\u4E86\u78C1\u76D8\u4E0A\u7684\u540D\u5B57\uFF0C\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u91CC\u6539\u3002 */\nfunction renameFile(): void {\n  if (H.home.kind === \"file\") return;\n  ui.close();\n  const box = document.createElement(\"div\");\n  box.className = \"offer\";\n  box.innerHTML = `<div class=\"offer-card\"><div class=\"offer-title\">\u6539\u6587\u4EF6\u540D</div>` +\n    `<label class=\"set-field\">\u6587\u4EF6\u540D<input id=\"fnIn\" type=\"text\" spellcheck=\"false\" autocomplete=\"off\" value=\"${esc(docName())}\" /></label>` +\n    `<div class=\"offer-msg\">\u53EA\u6539\u6587\u4EF6\u540D\uFF0C\u7EB8\u4E0A\u7684\u6B4C\u540D\u4E0D\u53D8\u3002\u4E0B\u6B21\u5B58\u7684\u65F6\u5019\u7528\u8FD9\u4E2A\u540D\u5B57\u3002</div>` +\n    `<div class=\"offer-btns\"><button class=\"btn\" data-v=\"cancel\">\u7B97\u4E86</button><button class=\"btn primary\" data-v=\"ok\">\u6539</button></div></div>`;\n  document.body.append(box);\n  const inp = box.querySelector<HTMLInputElement>(\"#fnIn\")!;\n  const close = () => { box.remove(); ui.closed(close); scoreEl.focus(); };\n  const ok = () => { const v = inp.value; close(); void H.rename(v).then((r) => { if (r.k === \"renamed\") info(`\u6587\u4EF6\u540D\u6539\u6210 ${r.stem}${SONG_SUFFIX}`); }); };\n  ui.open({ k: \"sheet\", close });\n  inp.addEventListener(\"keydown\", (e) => { if (e.isComposing) return; if (e.key === \"Enter\") { e.preventDefault(); e.stopPropagation(); ok(); } else if (e.key === \"Escape\") { e.preventDefault(); e.stopPropagation(); close(); } });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (e.target === box || v === \"cancel\") close(); else if (v === \"ok\") ok();\n  });\n  inp.focus(); inp.select();\n}\n/** \u95EE\u4E00\u53E5\uFF08\u5E94\u7528\u5185\u9762\u677F\uFF0C\u4E0D\u7528\u7CFB\u7EDF\u5F39\u7A97\uFF09\uFF1A\u70B9\u4E86 okLabel = true\uFF1B\u70B9\u80CC\u677F / \u7B97\u4E86 / Esc = false\u3002 */\nfunction askSheet(title: string, msg: string, okLabel: string): Promise<boolean> {\n  return new Promise((resolve) => {\n    ui.close();\n    const box = document.createElement(\"div\");\n    box.className = \"offer\";\n    box.innerHTML = `<div class=\"offer-card\"><div class=\"offer-title\">${esc(title)}</div><div class=\"offer-msg\">${esc(msg)}</div>` +\n      `<div class=\"offer-btns\"><button class=\"btn\" data-v=\"ok\">${esc(okLabel)}</button><button class=\"btn primary\" data-v=\"no\">\u7B97\u4E86</button></div></div>`;\n    document.body.append(box);\n    const dismiss = () => close(false), close = (ok: boolean) => { box.remove(); ui.closed(dismiss); scoreEl.focus(); resolve(ok); };\n    ui.open({ k: \"sheet\", close: dismiss });\n    box.addEventListener(\"click\", (e) => {\n      const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n      if (e.target === box || v === \"no\") close(false); else if (v === \"ok\") close(true);\n    });\n  });\n}\n// \u6539\u8FC7\u6CA1\u5B58\u5C31\u5173\u9875\u9762 / \u5237\u65B0\uFF1A\u6D4F\u89C8\u5668\u81EA\u5DF1\u7684\u633D\u7559\u6846\uFF08\u7167 WeebPaint\uFF1B\u65E0\u5730\u4E0D\u5077\u5077\u5199\u76D8\u2014\u2014\u9759\u9ED8\u5199\u7528\u6237\u6587\u4EF6\u8FDD\u80CC\u6587\u4EF6\u8BED\u4E49\uFF09\n// \u9000\u51FA\uFF1A\u633D\u7559\u6846\uFF08\u540C WeebPaint\uFF1Buser 2026-10-08\u300C2 \u548Cweebpaint\u5BF9\u9F50\u300D\uFF09\u2014\u2014\u5185\u5B58\u91CC\u6709\u6CA1\u843D\u76D8\u7684\u6539\u52A8\u5C31\u62E6\u4E00\u4E0B\uFF08\u5BF9\u8BDD\u6846\u5185\u5BB9\u6D4F\u89C8\u5668\u81EA\u7BA1\uFF09\uFF0C\u6B4C\u5E93\u91CC\u7684\u6B4C\u987A\u624B\u5077\u5B58\u672C\u673A\n//   \uFF08\u4E0D await\uFF0C\u8BA9\u5BF9\u8BDD\u6846\u7ACB\u523B\u8D77\uFF1B\u65E0\u5730\u7684\u6CA1\u5730\u65B9\u53EF\u4EE5\u5077\u5077\u5199\uFF09\u3002pagehide / \u9875\u9762\u9690\u85CF\u90A3\u4E24\u4E0B editor-session \u7167\u6837 flush\u3002\u767B\u5F55\u8DF3\u8F6C\u671F\u95F4\u4E0D\u62E6\u3002\nwindow.addEventListener(\"beforeunload\", (e) => {\n  if (navigatingForAuth || !dirty()) return;\n  e.preventDefault(); e.returnValue = \"\";\n  if (H.home.kind === \"gallery\") void es.flushLocal().catch(() => undefined);\n});\n// \u62D6\u8FDB\u6765\u6253\u5F00\uFF08.mxl / .musicxml / .xml\uFF1B\u684C\u9762 Chromium \u8FD8\u80FD\u62FF\u5230\u53E5\u67C4 = \u6709\u5BB6\uFF09\u3002\u26A0 \u53E5\u67C4\u8981\u5728 drop \u4E8B\u4EF6\u91CC\u540C\u6B65\u6293\uFF08docFile.grabDrop\uFF09\uFF0Cawait \u4E4B\u540E items \u5C31\u7A7A\u4E86\u3002\nwindow.addEventListener(\"dragover\", (e) => { if (e.dataTransfer?.types.includes(\"Files\")) { e.preventDefault(); e.dataTransfer.dropEffect = \"copy\"; } });\nwindow.addEventListener(\"drop\", (e) => {\n  const gr = e.dataTransfer ? docFile.grabDrop(e.dataTransfer) : null;\n  if (!gr) return;   // \u4E0D\u662F\u6211\u4EEC\u8BA4\u7684\u6587\u4EF6 = \u4E0D\u62E6\u8FD9\u6B21 drop\n  e.preventDefault();\n  void (async () => {\n    if (!(await H.leave(`\u6253\u5F00\u300C${gr.file.name}\u300D`))) return;\n    try { openPicked(await docFile.fromGrab(gr)); } catch (err) { showError(`\u6CA1\u6253\u5F00\uFF1A${(err as Error).message}`); }\n  })();\n});\n// \u5B89\u88C5\u6210 PWA \u540E\u53CC\u51FB .mxl \u7528 MoonSinger \u6253\u5F00\uFF08manifest file_handlers \u2192 launchQueue\uFF1B\u7167 WeebPaint consumeLaunchFiles\uFF09\u3002\ndocFile.consumeLaunchFiles((h) => { void (async () => {\n  if (!(await H.leave(`\u6253\u5F00\u300C${h.name}\u300D`))) return;\n  try { openPicked(await docFile.readHandle(h)); } catch (err) { showError(`\u6CA1\u6253\u5F00\uFF1A${(err as Error).message}`); }\n})(); });\n\n// \u2500\u2500 \u6B4C\u5E93\uFF08v0.6.0\uFF0C2026-10-08 Claude Fable 5.1\uFF09\uFF1Astore\uFF08\u63A5\u7F1D src/app-store.ts\uFF09+ \u6B4C\u5E93\u5C4F\uFF08src/gallery-host.ts\uFF09+ WeebPaint \u7684 editor-session \u8282\u5F8B \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//   \u5BB6\u6709\u4E09\u79CD\uFF08\u4E92\u65A5\uFF1Bsrc/app/home.ts `H.home`\uFF09\uFF1A\u6B4C\u5E93\u91CC\u7684\u4E00\u9996\uFF08gallery\uFF1B\u81EA\u52A8\u5B58 + \u63A8\u4E91\uFF09/ \u672C\u5730\u6587\u4EF6\uFF08file\uFF1Bv0.3.0 \u65E0\u5730\uFF09/ \u8FD8\u6CA1\u5BB6\uFF08none\uFF09\u3002\n//   \u6B4C\u5E93\u662F\u61D2\u7684\uFF1A\u6CA1\u8FDB\u8FC7\u6B4C\u5E93\u7684\u8BBE\u5907 = \u65E0\u5730\uFF08\u4E0D\u5F00 IDB\u3001\u4E0D\u8F7D MSAL\uFF09\uFF1B\u70B9\u300C\u6B4C\u5E93\u300D= attach\uFF08\u5728\u624B\u52BF\u91CC\u987A\u4FBF requestStoragePersistence\uFF09\uFF1B\u8FDB\u8FC7\u4E00\u6B21\u4EE5\u540E\u5F00\u5C40\u5C31\u5EFA\u3002\n//   \u8282\u5F8B\uFF082026-10-08 \u665A\u8D77 = WeebPaint \u7684 consent \u5236\uFF0Cuser\u300C\u7528weebpaint\u65B9\u6848\uFF0C\u5BF9\u4ED8\u5927\u6B4C\uFF0C\u8FD9\u4E0D\u662Ftxt\u300D\uFF1B\u5E38\u91CF\u5728 src/config.ts\uFF09\uFF1A\u6539\u4E86 2 s \u81EA\u52A8\u843D\u672C\u5730\uFF08\u300C\u2022\u300D= \u8FD8\u6CA1\u843D\uFF09\uFF1B\u63A8\u4E91\u53EA\u5728\u6362\u6B4C / \u9000\u51FA / \u8FDB\u6B4C\u5E93 / \u6309\u300C\u5B58\u300D/ \u767B\u5F55\u540E pushAll\uFF1B\n//   \u300C\u5B58\u300D= \u7ACB\u523B\u843D\u76D8 + \u63A8\uFF08\u4E0D\u810F\u4E5F\u52A8\uFF09\u3002\u51B2\u7A81 / \u62A5\u9519 / busy \u5728\u5EFA store \u65F6\u5C31\u63A5\u597D\u7EBF\uFF08src/store-ui.ts\uFF1Btest/store-wiring.test.mjs \u5B88\u7740\uFF09\u3002\nconst KV_LAST_DOC = \"last-doc\";\nconst KV_ZOOM = \"zoom\";   // \u8C31\u9762\u7F29\u653E\uFF08\u7269\u7406\u500D\u6570\uFF1B\u6CA1\u6709 = \u81EA\u52A8\uFF09\u2014\u2014\u6309\u8BBE\u5907\u8BB0\u3001\u4E0D\u8DDF\u8D26\u53F7\uFF082026-10-21 user\u300C\u7F29\u653E\u8DE8\u4F1A\u8BDD\u8BB0\u4F4F\uFF0C\u6309\u8BBE\u5907\u5B58\u300D\u300C\u6BCF\u53F0\u5C4F\u5E55\u4E0D\u540C\u300D\uFF09\nlet gallery: GalleryHost | null = null;\nlet pendingOpenId: string | null = null;   // es.open(id) \u8FDB\u884C\u4E2D\u7684\u90A3\u4E2A\u8EAB\u4EFD\uFF08adapter.adopt \u6536\u5B57\u8282\u65F6\u8981\u77E5\u9053\u662F\u8C01\u7684\uFF09\nlet encodedSnap: SavedMark | null = null;   // encode \u90A3\u4E00\u523B\u7684\u5FEB\u7167\uFF1A\u843D\u76D8\u6210\u529F\u624D\u628A\u5B83\u8BB0\u6210\u300C\u5DF2\u5B58\u300D\uFF08\u5FEB\u7167\u4E4B\u540E\u7684\u6539\u52A8\u7EE7\u7EED\u7B97\u810F\uFF09\nlet coverTouched = false;   // \u8FD9\u6B21\u6253\u5F00\u91CC\u6362\u8FC7\u5C01\u9762 \u2192 \u843D\u76D8\u540E\u8BA9\u6B4C\u5E93\u4E22\u6389\u65E7\u7F29\u7565\u56FE\nconst es = createEditorSession({\n  // store 0.16.1\uFF1Azip \u79CD\u7C7B\u8D70 store.zip\uFF08\u6709 getPeek\uFF09\uFF1BisZip \u7531\u79CD\u7C7B\u8868\u8BF4\u4E86\u7B97\u3002save \u7684\u7ED3\u679C\u8FDB\u9ED1\u5323\u5B50\uFF1A\u63A8\u6CA1\u63A8\u4E0A\u3001\u4E3A\u4EC0\u4E48\uFF08\u79BB\u7EBF / \u51B2\u7A81\u9762\u9009\u4E86\u4EC0\u4E48\uFF09\u2014\u2014\u8BCA\u65AD\u65E5\u5FD7\u91CC\u80FD\u770B\u5230\u6BCF\u4E00\u6B21\u63A8\u3002\n  store: { file: (name, o) => { const f = requireStore().zip(name, { mode: o.mode }); return { open: () => f.open(), tryMove: (to) => f.tryMove(to), trash: () => f.trash(),\n    save: async (bytes, opts) => { const r = await f.save(bytes, opts); if (opts?.tryPush) diagNote(\"sync\", `push ${name}: ${r.pushed ? \"pushed\" : \"not pushed\"}${r.reason ? \" \" + r.reason : \"\"}${r.resolution ? \" \u2192 \" + r.resolution : \"\"}`); return r; } }; } },\n  editor: {\n    adopt: async (blob) => { const id = pendingOpenId ?? H.identifier(); if (!id) throw new Error(\"adopt without an identifier\"); adoptStoreBytes(id, new Uint8Array(await blob.arrayBuffer())); },\n    onChange: () => { /* \u5185\u5BB9\u53D8\u5316\u8D70 changed()\uFF08update() + 1 s \u5FC3\u8DF3\uFF09\u2192 es.markDirty() */ },\n    // \u7F16\u7801\u5728 worker \u91CC\uFF08src/format/encode-client.ts\uFF1B2026-10-21\uFF09\uFF1A\u4E3B\u7EBF\u7A0B\u53EA\u514B\u9686\u4E00\u4EFD\u6B4C + \u4F11\u606F\u5BA4 + \u53C2\u8003\u7A97\u7684\u6587\u4EF6\uFF1Bworker \u6CA1\u4E86\u5C31\u5728\u4E3B\u7EBF\u7A0B\u7B97\uFF08\u540C\u4EE5\u524D\uFF09\n    encode: async () => { await refHost.settled(); encodedSnap = D.savedMark(); const bytes = await encoder.encode({ ...saveArgs(), references: refHost.files() }); return { bytes: new Blob([bytes as unknown as BlobPart], { type: \"application/vnd.recordare.musicxml\" }) }; },\n    // \u7B2C \u2463 \u5C42\u62A4\u680F\uFF08store \u63A5\u7F1D\uFF09\uFF1A\u5B9A\u7A3F\u7740\u3001\u51FA\u58F0\u5185\u5BB9\u7684\u6307\u7EB9\u5374\u53D8\u4E86 = \u4E0D\u843D\u76D8\u3001\u4E0D\u63A8\uFF0C\u810F\u7559\u7740\uFF08\u9876\u680F\u300C\u2022\u300D\u7167\u4EAE = \u8BDA\u5B9E\uFF09\uFF0C\u8BF4\u4E00\u53E5\u3002\u524D\u9762\u4E09\u5C42\u90FD\u6CA1\u62E6\u4F4F\u624D\u4F1A\u8D70\u5230\u8FD9\u513F\u3002\n    canPersist: () => { const f = D.extras.final; if (!f) return null; try { return contentFingerprintOf(saveArgs()) === f.fingerprint ? null : \"\u8FD9\u9996\u6B4C\u5B9A\u7A3F\u4E86\uFF0C\u5185\u5BB9\u5374\u53D8\u4E86\uFF1A\u6CA1\u6709\u5B58\u3001\u4E5F\u4E0D\u4F1A\u63A8\u4E0A\u4E91\u3002\u5148\u300C\u6539\u7A3F\u300D\uFF08\u5B9A\u7A3F\u7684 mp3 \u4F5C\u5E9F\uFF09\u518D\u5B58\uFF0C\u6216\u8005\u64A4\u9500\u521A\u624D\u7684\u6539\u52A8\u3002\"; } catch (e) { return `\u5B58\u4E0D\u4E86\uFF1A${(e as Error).message}`; } },\n    onRefused: (why) => { showError(why); diagNote(\"doc\", `persist refused: ${why}`); },\n    onSaved: (name) => { if (encodedSnap) { D.adoptSaved(encodedSnap); encodedSnap = null; } if (coverTouched) { coverTouched = false; gallery?.invalidateThumb(name); } renderTitle(); },\n  },\n  isZip: true,\n  policy: { autosaveMs: LOCAL_SAVE_DEBOUNCE_MS, pushOn: [\"exit\"] },   // consent \u5236\uFF08\u540C WeebPaint\uFF09\uFF1A\u63A8\u4E91\u53EA\u5728\u6362\u6B4C / \u9000\u51FA / \u6309\u300C\u5B58\u300D/ \u8FDB\u6B4C\u5E93\uFF1B\u5931\u7126\u53EA\u843D\u672C\u673A\n});\n/** \u5185\u5BB9\u53D8\u4E86\uFF08\u8C31 / \u4F11\u606F\u5BA4 / \u9EA6\u514B\u98CE / \u5C01\u9762\uFF09\u2192 \u6B4C\u5E93\u91CC\u7684\u6B4C\u544A\u8BC9 editor-session\uFF08autosave \u8282\u5F8B\uFF09\uFF1B\u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31\u6709\u4E86\u7B2C\u4E00\u7B14 = \u9996\u7B14\u5B89\u5BB6\uFF08H.settle\uFF1A\u94F8\u8EAB\u4EFD \u2192 es \u63A5\u7BA1 \u2192 \u843D\u672C\u5730\uFF09\u3002\n *  \u5E42\u7B49\uFF1B1 s \u5FC3\u8DF3\u515C\u5E95\u6CA1\u7ECF\u8FC7 update() \u7684\u6539\u52A8\uFF08\u4F11\u606F\u5BA4 / \u5F55\u97F3\u5BA4\u76F4\u63A5\u6539 D.extras \u7684\u90A3\u4E9B\uFF09\u3002 */\nfunction changed(): void { H.noteChanged(); }\nes.start();   // autosave \u5B9A\u65F6\u5668 + \u9875\u9762\u9690\u85CF / pagehide \u843D\u76D8 + \u5931\u7126\u63A8\u4E91\uFF08editor-session \u7684\u901A\u7528\u89E6\u53D1\u70B9\uFF1B\u4E0D\u8C03\u5C31\u6CA1\u6709\u81EA\u52A8\u5B58\uFF09\nsetInterval(() => { changed(); if (H.home.kind === \"gallery\") renderTitle(); }, 1000);\n// \uFF0830 s \u5FC3\u8DF3\u8865\u63A8\u64A4\u4E86\uFF1Aconsent \u5236\uFF0Cuser 2026-10-08\u300C\u7528weebpaint\u65B9\u6848\u300D\uFF1B\u6CA1\u4E0A\u4E91\u7684\u5728\u6362\u6B4C / \u9000\u51FA / \u6309\u300C\u5B58\u300D/ \u767B\u5F55\u540E pushAll \u65F6\u63A8\uFF09\n/** store \u5B57\u8282 \u2192 \u7F16\u8F91\u5668\uFF08es.open \u4E0E takeCloud \u91CD\u8F7D\u5171\u7528\u7684\u88C5\u5165\u6BB5\uFF09\u3002 */\nfunction adoptStoreBytes(id: string, bytes: Uint8Array): void {\n  const o = openBytes(id, bytes);\n  loadDoc(o.song, { home: { kind: \"gallery\", identifier: id }, stem: identifiers.parse(id)?.stem ?? o.stem, named: true, extras: o.extras, view: o.view, references: o.references });\n  if (o.notices.length) showError(o.notices.join(\" \")); if (o.advice.length) info(o.advice.join(\" \"));\n}\nconst stemOfId = (id: string) => identifiers.parse(id)?.stem ?? id;\n/** \u6253\u5F00\u6B4C\u5E93\u91CC\u7684\u4E00\u9996\u3002false = \u6CA1\u5207\u8FC7\u53BB\uFF08\u672C\u5730\u6CA1\u5B57\u8282 / \u8BFB\u4E0D\u4E86 / \u7528\u6237\u4E0D\u8D70\uFF09\u3002\n *  \u767B\u5F55\u7740\u4E14\u8BBE\u5907\u4E0A\u6709\u6CA1\u63A8\u4E0A\u53BB\u7684\u5B57\u8282 \u2192 **\u5148\u63A8\u518D\u5F00**\uFF1A\u4E0A\u4E00\u6B21\u63A8\u8981\u662F\u300C\u4E0A\u4F20\u843D\u4E86\u4E91\u3001\u56DE\u6267\u6CA1\u56DE\u6765\u300D\uFF08\u5207\u540E\u53F0 / reload \u628A\u9875\u9762\u6740\u4E86\uFF09\uFF0C\u672C\u5730\u5C31\u5E26\u7740\u65E7 base \u548C\u810F\u6807\uFF1B\n *  \u5E93\u7684\u63A8\u8DEF\u5F84\u4F1A\u62FF\u4E91\u7AEF\u5B57\u8282\u548C\u672C\u5730\u5B57\u8282\u6BD4\u5BF9\u3001\u76F8\u540C\u5C31\u81EA\u6108\uFF08lost-response heal\uFF09\uFF0C\u800C open \u7684\u65B0\u9C9C\u5EA6\u68C0\u67E5\u4E0D\u6BD4\u5B57\u8282\u3001\u76F4\u63A5\u5F39\u300C\u6253\u5F00\u672C\u5730 / \u4E91\u7AEF\u8986\u76D6\u672C\u5730\u300D\u2014\u2014\n *  \u4E24\u8FB9\u5176\u5B9E\u4E00\u6837\uFF0C\u767D\u95EE\u4E00\u6B21\uFF082026-10-08 user\u300C\u4E00\u76F4\u4F1A\u9047\u5230\u4E91\u7AEF\u51B2\u7A81\u7684\u63D0\u793A\u300D\uFF1Btest/e2e/sync.mjs \u2462b \u590D\u73B0\uFF09\u3002\u771F\u5206\u53C9 pushAll \u4E0D\u5F39\u9762\u3001\u7559\u810F\uFF0C\u7167\u65E7\u7531 open \u7684\u51B2\u7A81\u9762\u95EE\u4EBA\u3002 */\nasync function openStoreDoc(id: string): Promise<boolean> {\n  if (!(await H.leave(`\u6253\u5F00\u300C${stemOfId(id)}\u300D`, { nextIsGallery: true }))) return false;   // \u7B49\u7740\u5B89\u5BB6\u7684\u6709\u7B14\u5148\u5B89\u5BB6\uFF1B\u65E0\u5730 / \u672C\u673A\u6587\u4EF6\u6539\u8FC7\u6CA1\u5B58\u5148\u95EE\uFF1B\u6B4C\u5E93\u91CC\u7684\u4E0D\u5728\u8FD9\u513F\u63A8\uFF08es.open \u5207\u6B4C\u524D\u81EA\u5DF1\u5148\u5B58\u65E7\u7684\uFF09\n  if (isSignedIn() && navigator.onLine) { try { if ((await requireStore().files.dirty.count()) > 0) await pushDirtyAll(); } catch (e) { reportError(e, \"log\"); } }\n  pendingOpenId = id;\n  try {\n    const ok = await es.open(id);   // \u5207\u6B4C\u524D es \u81EA\u5DF1\u5148\u5B58\u65E7\u7684\uFF08\u9000\u51FA\u8BED\u4E49\uFF09\uFF1Bopen \u91CC\u542B\u65B0\u9C9C\u5EA6\u68C0\u67E5 / \u51B2\u7A81\u9762 / \u5D29\u6E83\u6062\u590D\uFF08store \u7684 ui\uFF09\n    if (!ok) { showError(`\u6253\u4E0D\u5F00\u300C${stemOfId(id)}\u300D\uFF1A\u8FD9\u53F0\u8BBE\u5907\u4E0A\u6CA1\u6709\u5B83\u7684\u5B57\u8282\uFF08\u79BB\u7EBF\u3001\u6216\u8FD8\u6CA1\u4ECE\u4E91\u7AEF\u62C9\u4E0B\u6765\uFF09`); return false; }\n    diagNote(\"doc\", `open ${id}`);\n    return true;\n  } catch (e) { reportError(e); return false; }\n  finally { pendingOpenId = null; }\n}\n/** \u5728\u6B4C\u5E93\u91CC\u65B0\u5EFA\u4E00\u9996\uFF1A\u4E00\u5F20\u7A7A\u8C31\u3001**\u4E0D\u843D\u76D8**\uFF08\u9996\u7B14\u5B89\u5BB6\uFF0C\u7167 WeebPaint lazyblank\uFF1Buser 2026-10-08\u300C\u9996\u7B14\u5B89\u5BB6\u505A\u300D\uFF09\u2014\u2014\u7B2C\u4E00\u7B14\u7F16\u8F91\u624D\u94F8\u8EAB\u4EFD\u8FDB\u6B4C\u5E93\uFF08H.settle\uFF1B\u9996\u5B58 mode:\"new\" \u649E\u540D\u4E0D\u8986\u76D6\uFF09\u3002\n *  \u7A7A\u7740\u79BB\u5F00 = \u96F6\u635F\u5931\u3001\u6B4C\u5E93\u91CC\u4E0D\u7559\u7A7A\u58F3\uFF1B\u7A7A\u8C31\u4E0D\u7B97\u300C\u4E0A\u6B21\u5F00\u7740\u7684\u6B4C\u300D\uFF08reload \u56DE\u6B4C\u5E93\uFF09\u3002 */\nasync function newStoreSong(): Promise<void> {\n  attachForUser();\n  if (!(await H.leave(\"\u65B0\u5EFA\"))) return;\n  const folder = gallery?.currentFolder() ?? \"\";\n  loadDoc(initState().song, { home: { kind: \"none\", pendingFolder: folder }, stem: defaultStem(), named: false, extras: emptyExtras() });   // \u6362\u5BB6 = \u653E\u4E0B\u65E7\u8EAB\u4EFD\uFF08autosave \u7EDD\u4E0D\u80FD\u628A\u7A7A\u8C31\u5199\u8FDB\u4E0A\u4E00\u9996\uFF09+ last-doc \u6E05\u7A7A\uFF08reload \u56DE\u6B4C\u5E93\uFF09\n  info(\"\u65B0\u7684\u4E00\u9996\uFF08\u7B2C\u4E00\u7B14\u5199\u4E0B\u53BB\u5C31\u8FDB\u6B4C\u5E93\uFF09\");\n}\n/** \u628A\u624B\u91CC\u8FD9\u9996\u65E0\u5730\u7684\u6B4C\u653E\u8FDB\u6B4C\u5E93\uFF08\u6587\u4EF6\u540D\u6CBF\u7528\uFF1B\u649E\u540D\u52A0 -hex4\uFF0C\u4E0D\u52A0\u5E8F\u53F7\u2014\u2014user 2026-10-08\u300C3 weebpaint\u5199handoff\u548C\u6211\u4EEC\u5BF9\u9F50\u300D\uFF09\u3002 */\nasync function saveIntoGallery(): Promise<void> {\n  attachForUser();\n  const r = await H.intoGallery(gallery?.currentFolder() ?? \"\");   // \u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31\uFF1A\u6709\u7B14\u5C31\u5B89\u5BB6\uFF0C\u6CA1\u7B14\u4E0D\u585E\u7A7A\u58F3\uFF08WeebPaint\u300C\u672A\u52A8\u8FC7\u7684\u7A7A\u767D\u4E0D\u585E\u8FDB\u65B0\u5E93\u300D\uFF09\uFF1B\u843D\u76D8\u62A5\u4E86\u9519 = \u8EAB\u4EFD\u7559\u7740\u3001\u4E0B\u4E00\u8F6E autosave \u518D\u8BD5\uFF08\u9519\u5DF2\u62A5\uFF09\n  if (r.k === \"blank\") info(\"\u8FD8\u662F\u7A7A\u7684\uFF1A\u5199\u4E0B\u7B2C\u4E00\u7B14\u5C31\u81EA\u52A8\u8FDB\u6B4C\u5E93\");\n  else if (r.k === \"moved\" && r.flushed) info(`\u8FDB\u6B4C\u5E93\u4E86\uFF1A${H.stem}${SONG_SUFFIX}`);\n}\n/** \u6539\u5F53\u524D\u8FD9\u9996\u7684\u6587\u4EF6\u540D\uFF1A\u6B4C\u5E93\u91CC\u7684\u8D70 store\uFF08tryMove\uFF1A\u649E\u540D\u4E0D\u8986\u76D6\u3001\u65E7\u540D\u8FDB\u56DE\u6536\u7AD9\uFF09\uFF1B\u65E0\u5730\u7684\u53EA\u6539\u4E0B\u6B21\u5B58\u7684\u540D\u5B57\u3002\u8FD4\u56DE\u65B0\u8EAB\u4EFD\uFF08\u6B4C\u5E93 VerbDoc.renameActive \u7684\u5951\u7EA6\uFF09\u3002 */\nasync function renameActive(): Promise<string | null> {\n  if (H.home.kind !== \"gallery\") { renameFile(); return null; }\n  const p = identifiers.parse(H.home.identifier); if (!p) return null;\n  const v = await openInputSheet(\"\u6539\u6587\u4EF6\u540D\", { defaultValue: p.stem, message: \"\u53EA\u6539\u6587\u4EF6\u540D\uFF0C\u7EB8\u4E0A\u7684\u6B4C\u540D\u4E0D\u53D8\u3002\", okLabel: \"\u6539\" });\n  if (v == null) return null;\n  try {\n    const r = await H.rename(v);\n    if (r.k === \"taken\") { showError(`\u300C${fileSafe(v)}\u300D\u5DF2\u7ECF\u6709\u4E86\uFF08${r.where === \"cloud\" ? \"\u4E91\u7AEF\" : \"\u8FD9\u53F0\u8BBE\u5907\u4E0A\"}\uFF09\uFF0C\u6CA1\u6539`); return null; }\n    if (r.k !== \"renamed\") return null;\n    info(r.oldKept ? `\u6587\u4EF6\u540D\u6539\u6210 ${r.stem}${SONG_SUFFIX}\uFF08\u65E7\u540D\u7684\u90A3\u4EFD\u8C31\u7CFB\u4E0D\u660E\uFF0C\u539F\u5730\u7559\u7740\u4E86\uFF09` : `\u6587\u4EF6\u540D\u6539\u6210 ${r.stem}${SONG_SUFFIX}`);\n    return H.identifier();\n  } catch (e) { reportError(e); return null; }\n}\nlet authStarted = false, afterSignInInFlight: Promise<void> | null = null;\n/** \u5EFA store + \u6B4C\u5E93\u5C4F\uFF08\u5E42\u7B49\uFF1B\u4E0D\u78B0\u767B\u5F55\uFF09\u3002\u7B2C\u4E00\u6B21\u8981\u5728\u7528\u6237\u624B\u52BF\u91CC\uFF08persist \u7533\u8BF7\uFF09\u3002 */\nfunction ensureAttached(): void {\n  const fresh = !hasStore();\n  attachStore();\n  if (fresh) {\n    void requestStoragePersistence(); diagNote(\"boot\", \"store attached\");\n    // \u6309\u8EAB\u4EFD\u8BB0\u7684\u4E1C\u897F\u8DDF\u7740\u6539\u540D\u8D70\uFF08store 0.14.0 onRenamed\uFF1A\u8C01\u53D1\u8D77\u7684\u6539\u540D / \u632A\u5939\u90FD\u62A5\uFF09\u2014\u2014\u8FD9\u91CC\u53EA\u6709\u300C\u4E0A\u6B21\u5F00\u7740\u54EA\u9996\u300D\n    requireStore().files.onRenamed((from, to) => { if (deviceKvGet(KV_LAST_DOC) === from) deviceKvSet(KV_LAST_DOC, to); });\n  }\n  ensureGallery();\n}\n/** \u767B\u5F55\u63A2\u6D4B\uFF08\u4E00\u6B21\uFF09\uFF1A\u5148\u5EFA store\uFF08\u5E93\u7684\u62A5\u9519\u5668\u5728 createStore \u65F6\u624D\u63A5\u4E0A\uFF0CCatsUp 2026-09-22\uFF09\u3001\u672C\u5730\u6062\u590D\u5B8C\u4E86\u518D\u8C03\uFF08boot \u987A\u5E8F = \u5EFA store \u2192 \u672C\u5730\u6062\u590D \u2192 initAuth\uFF09\u3002 */\nfunction startAuth(): void {\n  if (authStarted) return;\n  authStarted = true;\n  auth.onAuthChanged((s) => { diagNote(\"auth\", `changed signedIn=${String(s.signedIn)}`); gallery?.renderCloud(); renderTitle(); if (s.signedIn) void afterSignIn(); });\n  void auth.initAuth().then((s) => { diagNote(\"auth\", `initAuth signedIn=${s.signedIn}`); gallery?.renderCloud(); renderTitle(); if (s.signedIn) void afterSignIn(); }).catch((e) => reportError(e, \"warning\"));\n}\n/** \u7528\u6237\u52A8\u4F5C\u8FDB\u6B4C\u5E93\uFF08\u70B9\u300C\u6B4C\u5E93\u300D/ \u65B0\u5EFA / \u5B58\u8FDB\u6B4C\u5E93\uFF09\uFF1A\u5EFA store + \u8D77\u767B\u5F55\u63A2\u6D4B\u3002 */\nfunction attachForUser(): void { ensureAttached(); startAuth(); }\nfunction ensureGallery(): GalleryHost {\n  if (gallery) return gallery;\n  let padWas = true;\n  gallery = initGalleryHost({\n    activeIdentifier: () => H.identifier(),\n    openAny: (id) => openStoreDoc(id),\n    // \u6253\u5F00\u4E2D\u7684\u90A3\u9996\u88AB\u6B4C\u5E93\u632A\u4E86\u5939\uFF1A\u5B57\u8282\u5DF2\u5728\u65B0\u8EAB\u4EFD\u4E0B \u2192 \u5148\u653E\u4E0B\u65E7\u8EAB\u4EFD\uFF08\u4E0D\u7136 es.open \u7684\u300C\u5207\u6B4C\u524D\u5148\u5B58\u65E7\u7684\u300D\u4F1A\u628A\u65E7\u540D\u5B57\u5199\u56DE\u53BB\u590D\u6D3B\uFF09\uFF0C\u518D\u6309\u65B0\u8EAB\u4EFD\u91CD\u5F00\n    setIdentifier: (id) => { H.release(); void openStoreDoc(id); },\n    renameActive,\n    pushNow: () => es.forceSaveAndPush().then(renderTitle),\n    flushLocal: () => (H.home.kind === \"gallery\" ? es.flushLocal() : Promise.resolve()),\n    newSong: async () => { await newStoreSong(); if (H.home.kind === \"gallery\" || H.pending()) gallery!.close(); },   // \u9996\u7B14\u5B89\u5BB6\uFF1A\u65B0\u5EFA\u51FA\u6765\u7684\u7A7A\u8C31\u8FD8\u6CA1\u8EAB\u4EFD\uFF08pendingFolder\uFF09\u4E5F\u56DE\u5230\u8C31\n    openSettings: () => openSettings(),\n    openInstruments: () => openFinder(),   // \u6B4C\u5E93\u5F00\u7740 = \u53EA\u5F39\u7740\u73A9\u7684\u76EE\u5F55\uFF0C\u76D6\u5728\u6B4C\u5E93\u4E0A\u9762\n    openCloudMenu: () => { void openCloudMenu(); },\n    onOpened: () => { ui.close(); closeFinder(false); if (ws.mode === \"listen\") { ws.mode = lastEditMode; applyWorkspace(); } closeInstPage(); padWas = !padEl.hidden; showPad(false); updateChrome(); },   // \u8FDB\u6B4C\u5E93 = \u653E\u4E0B\u624B\u91CC\u7684\u6B4C\uFF1A\u6DF7\u97F3\u53F0\uFF08\u542C\uFF09\u4E5F\u6536\n    onClosed: () => { void afterGalleryClosed(); showPad(padWas); updateChrome(); scoreEl.focus(); },\n  });\n  return gallery;\n}\n/** \u4ECE\u6B4C\u5E93\u56DE\u6765\uFF1A\u624B\u91CC\u8FD9\u9996\u8981\u662F\u5728\u6B4C\u5E93\u91CC\u88AB\u6254\u8FDB\u4E86\u56DE\u6536\u7AD9\uFF08gallery \u7684\u5220\u9664\u52A8\u8BCD\u5141\u8BB8\u5220\u300C\u6253\u5F00\u4E2D\u300D\u7684\u90A3\u9996\uFF0C\u5148\u95EE\u8FC7\uFF09\uFF0C\u5C31\u4E0D\u518D\u8BA4\u90A3\u4E2A\u5BB6\u2014\u2014\u7559\u5728\u5185\u5B58\u91CC\u5F53\u65E0\u5730\u7A3F\uFF0C\u7EDD\u4E0D\u81EA\u52A8\u5B58\u56DE\u53BB\u628A\u5B83\u590D\u6D3B\u3002 */\nasync function afterGalleryClosed(): Promise<void> {\n  if (H.home.kind !== \"gallery\") return;\n  try {\n    if (await requireStore().files.occupied(H.home.identifier)) return;\n    const stem = H.stem; H.release();\n    showError(`\u300C${stem}\u300D\u5DF2\u7ECF\u8FDB\u4E86\u56DE\u6536\u7AD9\uFF1B\u624B\u91CC\u8FD9\u4EFD\u73B0\u5728\u6CA1\u6709\u5BB6\u4E86\uFF08\u300C\u5B58\u300D\u4F1A\u95EE\u5B58\u5230\u54EA\uFF0C\u6216\u300C\u5B58\u8FDB\u6B4C\u5E93\u300D\uFF09\u3002`);\n  } catch (e) { reportError(e, \"log\"); }\n}\n/** \u8FDB\u6B4C\u5E93 = \u653E\u4E0B\u624B\u91CC\u7684\u6B4C\uFF08gallery-first\uFF0C\u540C WeebPaint\u300C\u8FDB\u56FE\u5E93 = \u5173\u95ED\u5F53\u524D\u753B\u4F5C\u300D\uFF1Buser 2026-10-08\u300C7 \u548Cweebpaint\u5BF9\u9F50\u300D\uFF09\uFF1A\n *  \u6B4C\u5E93\u91CC\u7684\u5148\u843D\u76D8 + \u63A8\uFF08\u9000\u51FA\u8BED\u4E49\uFF09\u518D\u653E\u4E0B\u8EAB\u4EFD\uFF1B\u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31\u6709\u7B14\u5148\u5B89\u5BB6\uFF1B\u65E0\u5730\u7684\u6539\u8FC7\u6CA1\u5B58\u5148\u95EE\uFF08\u540C\u300C\u65B0\u5EFA\u300D\uFF09\u3002\u6B4C\u5E93\u6CA1\u6709\u300C\u56DE\u5230\u8C31\u300D\u2014\u2014\u51FA\u53E3 = \u6253\u5F00\u4E00\u9996 / \u65B0\u5EFA\u3002 */\nasync function openGallery(): Promise<void> {\n  attachForUser();\n  if (!(await H.leave(\"\u8FDB\u6B4C\u5E93\"))) return;\n  H.release();\n  deviceKvSet(KV_LAST_DOC, null);   // \u672C\u673A\u6587\u4EF6 / \u65E0\u5730\u7684\u7A3F\u4E5F\u4E00\u6837\uFF1A\u8FDB\u4E86\u6B4C\u5E93 = \u6CA1\u6709\u300C\u4E0A\u6B21\u5F00\u7740\u7684\u90A3\u9996\u300D\n  renderTitle();\n  await gallery!.open();\n}\n$(\"libBtn\").addEventListener(\"click\", () => { void openGallery(); });\nasync function openCloudMenu(): Promise<void> {\n  const signed = isSignedIn();\n  let who = \"\"; try { const a = auth.getActiveAccount() as { username?: string; name?: string } | null; who = a?.name || a?.username || \"\"; } catch { /* \u6CA1\u767B\u5F55 */ }\n  const v = await openChoiceSheet<\"in\" | \"out\" | \"refresh\" | \"pushAll\">(\"\u4E91\u7AEF\uFF08OneDrive\uFF09\",\n    signed ? `\u5DF2\u767B\u5F55${who ? ` ${who}` : \"\"}\u3002\u6B4C\u5E93\u540C\u6B65\u5230 OneDrive \u7684\u300C\u5E94\u7528\u300D\u6587\u4EF6\u5939\uFF08\u8FD9\u4E2A app \u53EA\u80FD\u770B\u81EA\u5DF1\u7684\u90A3\u4E2A\u5939\uFF0C\u770B\u4E0D\u5230\u4F60\u522B\u7684\u6587\u4EF6\uFF09\u3002` : \"\u767B\u5F55\u5FAE\u8F6F\u4E2A\u4EBA\u8D26\u53F7\u540E\uFF0C\u6B4C\u5E93\u540C\u6B65\u5230 OneDrive \u7684\u300C\u5E94\u7528\u300D\u6587\u4EF6\u5939\uFF08\u8FD9\u4E2A app \u53EA\u80FD\u770B\u81EA\u5DF1\u7684\u90A3\u4E2A\u5939\uFF0C\u770B\u4E0D\u5230\u4F60\u522B\u7684\u6587\u4EF6\uFF09\u3002\u4E0D\u767B\u5F55\u4E5F\u80FD\u7528\uFF0C\u6B4C\u53EA\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\u3002\",\n    signed ? [{ label: \"\u5237\u65B0\u4E91\u7AEF\", value: \"refresh\" }, { label: \"\u628A\u6CA1\u4E0A\u4E91\u7684\u90FD\u63A8\u4E0A\u53BB\", value: \"pushAll\" }, { label: \"\u9000\u51FA\u767B\u5F55\", value: \"out\", danger: true, hint: \"\u6B4C\u8FD8\u7559\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\" }] : [{ label: \"\u767B\u5F55\u5FAE\u8F6F\u8D26\u53F7\", value: \"in\", primary: true }]);\n  if (v === \"in\") await signInFlow();\n  else if (v === \"out\") await signOutFlow();\n  else if (v === \"refresh\") gallery?.refresh();\n  else if (v === \"pushAll\") await pushDirtyAll({ verbose: true });\n}\n/** \u9000\u51FA\u767B\u5F55 = \u810F\u95E8 + \u5907\u4EFD + \u62C6\u5E93 + \u9000\u51FA\uFF08\u540C WeebPaint disconnectFlow\uFF1A\u5148\u7EFF\u706F\u95E8\u5378\u5E93\uFF0C\u540E signOut\uFF1Buser 2026-10-08\u300C4 \u548Cweebpaint\u5BF9\u9F50\u300D\uFF09\uFF1A\n *  \u8FD8\u6709\u6CA1\u4E0A\u4E91\u7684 \u2192 \u95EE\uFF1A\u300C\u5148\u63A8\u4E0A\u53BB / \u63A8\u4E0D\u4E0A\u7684\u9010\u9996\u4E0B\u8F7D\u5907\u4EFD\u300D\uFF08\u63A8\u5B8C\u91CD\u626B\u518D\u95EE\uFF0C\u6570\u5B57\u4F1A\u53D8\u5C0F\uFF09\u6216\u300C\u7167\u6837\u9000\u51FA\u300D\u6216\u7B97\u4E86\uFF1B\n *  \u7136\u540E\u653E\u6389 store\uFF08\u8FD9\u53F0\u8BBE\u5907\u4E0A\u7684\u6B4C\u90FD\u8FD8\u5728 IDB \u91CC\u2014\u2014\u518D\u8FDB\u6B4C\u5E93\u5C31\u63A5\u4E0A\uFF09\u3001\u9000\u51FA\u5FAE\u8F6F\u8D26\u53F7\u3001\u56DE\u5230\u65E0\u5730\u7684\u7A7A\u8C31\u3002 */\nasync function signOutFlow(): Promise<void> {\n  const store = requireStore();\n  for (;;) {\n    let n = 0; try { n = await store.files.dirty.count(); } catch (e) { reportError(e, \"warning\"); }\n    if (n === 0) break;\n    const v = await openChoiceSheet<\"backup\" | \"force\">(`\u8FD8\u6709 ${n} \u9996\u6CA1\u4E0A\u4E91`, \"\u9000\u51FA\u540E\u8FD9\u4E9B\u6539\u52A8\u53EA\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\u3002\u53EF\u4EE5\u5148\u63A8\u4E0A\u53BB\uFF08\u63A8\u4E0D\u4E0A\u53BB\u7684\u9010\u9996\u4E0B\u8F7D\u5907\u4EFD\uFF09\uFF0C\u6216\u8005\u7167\u6837\u9000\u51FA\u3002\",\n      [{ label: \"\u5148\u63A8\u4E0A\u53BB / \u4E0B\u8F7D\u5907\u4EFD\", value: \"backup\", primary: true }, { label: \"\u7167\u6837\u9000\u51FA\", value: \"force\", danger: true }]);\n    if (v == null) return;\n    if (v === \"force\") break;\n    await backupDirty();\n  }\n  gallery?.close();\n  H.release();\n  try { await detachStore(); } catch (e) { reportError(e, \"warning\"); }\n  try { await auth.signOut(); } catch (e) { reportError(e); }\n  loadDoc(initState().song, { home: { kind: \"none\", pendingFolder: null }, stem: defaultStem(), named: false, extras: emptyExtras() });\n  renderTitle(); info(\"\u9000\u51FA\u4E86\uFF1A\u6B4C\u90FD\u8FD8\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\uFF0C\u518D\u8FDB\u6B4C\u5E93\u5C31\u80FD\u63A5\u7740\u7528\");\n}\n/** \u4E0B\u8F7D\u5907\u4EFD\uFF1A\u5148 pushAll \u5C3D\u529B\u63A8\uFF08\u5728\u7EBF\u65F6\u6700\u597D\u7684\u5907\u4EFD\u5C31\u662F\u4E91\uFF09\uFF1B\u63A8\u4E0D\u4E0A\u53BB\u7684\uFF08failed = \u9519\u8BEF\u62A5\u544A\u9762\uFF09\u9010\u9996\u4E0B\u8F7D .mxl\u3002 */\nasync function backupDirty(): Promise<void> {\n  const store = requireStore();\n  let failed: string[] = [];\n  try { failed = (await store.files.dirty.pushAll()).failed; } catch (e) { reportError(e, \"warning\"); }\n  for (const id of failed) {\n    try { const bl = await store.zip(id, { mode: \"existing\" }).open(); if (bl) downloadFile(new File([bl], `${stemOfId(id)}${SONG_SUFFIX}`, { type: \"application/vnd.recordare.musicxml\" })); }\n    catch (e) { reportError(e, \"warning\"); }\n  }\n  info(failed.length ? `\u63A8\u4E0D\u4E0A\u53BB\u7684 ${failed.length} \u9996\u5DF2\u4E0B\u8F7D\u5907\u4EFD` : \"\u90FD\u63A8\u4E0A\u53BB\u4E86\");\n}\nfunction downloadFile(file: File): void {\n  const a = document.createElement(\"a\"), url = URL.createObjectURL(file);\n  a.href = url; a.download = file.name; document.body.append(a); a.click(); a.remove();\n  setTimeout(() => URL.revokeObjectURL(url), 30_000);\n}\n/** \u767B\u5F55 = \u9875\u9762\u8DF3\u53BB\u5FAE\u8F6F\u518D\u8DF3\u56DE\u6765\uFF08redirect\uFF1BiPad PWA \u5F39\u7A97\u4E0D\u53EF\u9760\uFF09\uFF1A\u5148\u628A\u624B\u91CC\u7684\u6B4C\u843D\u76D8\uFF0C\u518D\u5728\u4E00\u4E2A\u70B9\u51FB\u91CC**\u540C\u6B65**\u8D77\u8DF3\uFF08WeebPaint / WXHW \u7684\u4E24\u6B65\u6CD5\uFF1BonPick \u7AD9\u5728\u7528\u6237\u624B\u52BF\u91CC\uFF09\u3002 */\nlet navigatingForAuth = false;\nasync function signInFlow(): Promise<void> {\n  const inGallery = H.home.kind === \"gallery\";\n  if (inGallery) { try { await es.flushLocal(); } catch (e) { reportError(e, \"warning\"); } }\n  await openChoiceSheet(\"\u53BB\u5FAE\u8F6F\u767B\u5F55\", `\u9875\u9762\u4F1A\u8DF3\u5230\u5FAE\u8F6F\u7684\u767B\u5F55\u9875\uFF08\u53EA\u8BA4\u4E2A\u4EBA\u8D26\u53F7\uFF09\uFF0C\u767B\u5F55\u5B8C\u81EA\u52A8\u56DE\u5230\u8FD9\u91CC\u3002${inGallery ? \"\u624B\u91CC\u7684\u6B4C\u5DF2\u7ECF\u5B58\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\u4E86\u3002\" : dirty() ? \"\u624B\u91CC\u8FD9\u9996\u65E0\u5730\u7684\u6B4C\u6539\u8FC7\u8FD8\u6CA1\u5B58\u2014\u2014\u8DF3\u8D70\u4F1A\u4E22\uFF0C\u5148\u5B58\u4E00\u4E0B\u518D\u6765\u3002\" : \"\"}`,\n    [{ label: \"\u53BB\u767B\u5F55\", value: \"go\", primary: true, onPick: redirectToSignIn }]);\n}\n/** \u5728\u70B9\u51FB\u91CC\u540C\u6B65\u8D77\u8DF3\uFF08redirect\uFF09\uFF1B\u8DF3\u8D70\u671F\u95F4\u4E0D\u62E6 beforeunload\u3002 */\nfunction redirectToSignIn(): void { navigatingForAuth = true; void requestStoragePersistence(); diagNote(\"auth\", \"signIn redirect\"); auth.signIn({ prompt: \"select_account\" }).catch((e) => { navigatingForAuth = false; reportError(e); }); }\n/** \u56DE\u524D\u53F0 / \u56DE\u7EBF\uFF1A\u5E72\u51C0\u7684\u6B4C\u5FEB\u8FDB\u5230\u4E91\u7AEF\u7684\u65B0\u7248\u672C\uFF08\u53E6\u4E00\u53F0\u8BBE\u5907\u6539\u8FC7\u7684\uFF09\uFF1B\u672C\u5730\u810F / \u6CA1\u4E0A\u4E91 = \u4E0D\u52A8\uFF08\u4E4B\u540E push \u7684 412 \u4F1A surface \u771F\u5206\u53C9\uFF09\u3002 */\nlet refreshing = false, replaceInFlight = false;   // replaceInFlight = \u5E93\u6B63\u5728\u628A\u4E91\u7AEF\u65B0\u7248\u672C\u6362\u8FDB\u6765\uFF08\u95F8\u9501\u7740\uFF1B\u9192\u6765\u90A3\u6B21\u6838\u5BF9\u8D85\u65F6\u4E5F\u4E0D\u8BB8\u653E\u5F00\u5B83\uFF09\nasync function refreshOpenDoc(): Promise<void> {\n  const id = H.identifier();\n  if (!id || refreshing || !hasStore() || !isSignedIn() || !navigator.onLine || dirty() || es.isPushPending()) return;\n  refreshing = true; let froze = false;\n  try {\n    // \u5E93\u51B3\u5B9A\u66FF\u6362\uFF08onReplaceStart\uFF0C\u540C\u6B65\u56DE\u8C03\uFF09\u2192 \u9501\u540C\u6B65\u95F8\u76F4\u5230\u65B0\u7248\u8F7D\u5165\uFF1A\u4E0B\u8F7D\u9014\u4E2D\u6253\u8FDB\u53BB\u7684\u97F3\u4F1A\u88AB\u6574\u7BC7\u8986\u76D6\u4E14\u4E0D\u8FDB\u5907\u4EFD\u7BB1\uFF08WXHW 2026-09-29 \u7AEF\u5230\u7AEF\u590D\u73B0\uFF1B\n    //   user 2026-10-08\u300C\u6211\u4EEC\u4E5F\u8981\u62FF\u65B0\u7248\u672C\u65F6\u9501\u8F93\u5165\uFF0C\u611F\u89C9wxhw\u66F4\u7406\u60F3\u4E00\u70B9\u300D\uFF09\u3002\u95F8 = \u906E\u7F69 + \u6CA1\u6709\u6309\u94AE\uFF1B\u91CD\u8F7D\u5B8C\uFF08\u6216\u5931\u8D25\uFF09\u89E3\u9501\n    // store 0.18.1 trustHints:false\uFF1A\u8FD9\u91CC\u7684\u5237\u65B0\u90FD\u53D1\u751F\u5728\u56DE\u524D\u53F0 / \u56DE\u7EBF / \u767B\u5F55\u540E\u2014\u2014\u6000\u7591\u81EA\u5DF1\u8FC7\u671F\u7684\u65F6\u523B\uFF0C\u4E0D\u91C7\u4FE1 30 s \u5185\u7684\u65E7\u6E05\u5355\uFF0C\u4E00\u5B9A\u95EE\u4E91\u7AEF\uFF08WXHW e2e 10-16 \u7FFB\u7EA2\u90A3\u6761\uFF09\n    const r = await requireStore().zip(id, { mode: \"existing\" }).pullIfClean({ trustHints: false, localDirty: () => dirty() || es.isPushPending(),\n      onReplaceStart: () => { froze = true; replaceInFlight = true; diagNote(\"sync\", `replace-start ${stemOfId(id)}: input frozen`); void lockSyncGate({ title: \"\u4E91\u7AEF\u6709\u65B0\u7248\u672C\", message: `\u300C${stemOfId(id)}\u300D\u5728\u522B\u7684\u8BBE\u5907\u4E0A\u6539\u8FC7\u4E86\uFF0C\u6B63\u5728\u6362\u6210\u6700\u65B0\u7684\u2026\u2026\u5148\u522B\u6253\u5B57\u3002`, showSpinner: true, actions: [] }); } });\n    if (r?.status === \"fast-forwarded\" && H.identifier() === id) {\n      // \u672C\u5730\u5B57\u8282\u5DF2\u6362\u6210\u4E91\u7AEF\u7248\u672C\uFF08\u521A markSynced\uFF09\u2192 \u5185\u5B58\u91CC\u7684\u662F\u65E7\u4E16\u754C\u7EBF\uFF0C\u5FC5\u987B\u6574\u4F53\u91CD\u8F7D\uFF08\u540C\u540D es.open = openInto \u7BA1\u7EBF\uFF1B\u4E0D\u91CD\u8F7D = \u4E0B\u6B21\u81EA\u52A8\u5B58\u628A\u65E7\u7248\u5199\u56DE\u4E91\u7AEF\uFF0CWeebPaint 2026-08-25 \u6848\u5377\uFF09\n      pendingOpenId = id;\n      const ok = await es.open(id).finally(() => { pendingOpenId = null; });\n      if (ok) info(\"\u6362\u6210\u4E91\u7AEF\u7684\u65B0\u7248\u672C\u4E86\"); else showError(`\u300C${stemOfId(id)}\u300D\u4E91\u7AEF\u7684\u65B0\u7248\u672C\u62C9\u4E0B\u6765\u4E86\uFF0C\u4F46\u91CD\u5F00\u5931\u8D25\u2014\u2014\u8BF7\u4ECE\u6B4C\u5E93\u518D\u6253\u5F00\u4E00\u6B21`);\n    } else if (r?.status === \"ff-failed\" || r?.status === \"cloud-error\") reportError(r.error ?? new Error(`refresh ${r.status}: ${r.reason ?? \"\"}`), \"warning\");\n  } catch (e) { reportError(e, \"warning\"); }\n  finally { if (froze) { replaceInFlight = false; unlockSyncGate(); } refreshing = false; }\n}\n/** \u767B\u5F55\u8FC7\u671F / \u56DE\u7EBF\uFF1A\u6CA1\u767B\u5F55\u7740\u5C31\u9759\u9ED8\u518D\u8BD5\u4E00\u6B21\uFF08\u4E0D\u5F39\u4EFB\u4F55\u4E1C\u897F\uFF09\u3002 */\nfunction retrySilent(): void { if (hasStore() && authStarted && !isSignedIn() && auth.isAuthConfigured()) void auth.retrySilentSignIn().catch((e) => reportError(e, \"log\")); }\n/** \u767B\u5F55\u6210\u529F\u540E\uFF08boot \u65F6 onAuthChanged \u4E0E initAuth.then \u4F1A\u53CC\u89E6\u53D1 \u2192 \u540C\u4E00\u65F6\u523B\u53EA\u8DD1\u4E00\u4EFD\uFF09\uFF1A\u5148\u63A8\u5F00\u7740\u7684\u3001\u518D\u56DE\u653E\u79BB\u7EBF\u961F\u5217\u3001\u518D\u63A8\u6240\u6709\u6CA1\u4E0A\u4E91\u7684\u3001\u5237\u65B0\u6B4C\u5E93\u3002 */\nfunction afterSignIn(): Promise<void> {\n  if (afterSignInInFlight) return afterSignInInFlight;\n  afterSignInInFlight = (async () => {\n    diagNote(\"auth\", \"afterSignIn\");\n    try { await requireStore().files.drainOfflineQueue(); } catch (e) { reportError(e, \"log\"); }   // \u6392\u7740\u7684\u79BB\u7EBF\u64CD\u4F5C\u672C\u6765\u5C31\u540C\u610F\u8FC7\n    // \u5168\u5BB6 2026-10-21\uFF08\u7EDF\u7B79\u8F6C\u8FF0 user\uFF09\uFF1A\u767B\u5F55 / \u56DE\u7EBF\u540E\u4E0D\u518D\u9759\u9ED8\u63A8\u2014\u2014\u6709\u6CA1\u4F20\u4E0A\u53BB\u7684\u5148\u95EE\u4E00\u6B21\uFF1B\u6570\u5B57 = dirty.count()\uFF08\u4ECE\u6CA1\u4F20\u8FC7\u7684 + \u4F20\u8FC7\u6539\u4E86\u6CA1\u63A8\u7684\u5408\u8BA1\uFF09+ \u624B\u91CC\u8FD9\u9996\u5185\u5B58\u91CC\u8FD8\u6CA1\u843D\u76D8\u7684\uFF1B\n    //   \u300C\u6682\u4E0D\u300D= \u7559\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\uFF0C\u6362\u6B4C / \u9000\u51FA / \u6309\u300C\u5B58\u300D/ \u8FDB\u6B4C\u5E93\u90A3\u4E9B consent \u65F6\u523B\u7167\u65E7\u63A8\uFF08v0.6 \u8D77\u7684\u8282\u5F8B\u4E0D\u53D8\uFF09\u3002\u9762\u88AB busy \u6321\u4F4F\u5F00\u4E0D\u4E86 = \u5F53\u300C\u6682\u4E0D\u300D\u3001\u8BB0\u4E00\u7B14\u3002\n    let n = 0; try { n = await requireStore().files.dirty.count(); } catch (e) { reportError(e, \"log\"); }\n    if (H.home.kind === \"gallery\" && dirty()) n = Math.max(n, 1);\n    let go = n === 0;\n    if (n > 0) {\n      try { go = (await openChoiceSheet<\"push\" | \"later\">(`\u6709 ${n} \u9996\u6B4C\u8FD8\u6CA1\u4F20\u4E0A\u53BB\uFF0C\u73B0\u5728\u4F20\u5417\uFF1F`, \"\u4F20\u4E0A\u53BB = \u540C\u6B65\u5230 OneDrive \u7684\u300C\u5E94\u7528\u300D\u6587\u4EF6\u5939\uFF1B\u6682\u4E0D = \u5148\u7559\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\uFF0C\u6362\u6B4C / \u9000\u51FA / \u6309\u300C\u5B58\u300D\u7684\u65F6\u5019\u7167\u65E7\u4F1A\u63A8\u3002\", [{ label: \"\u4F20\u4E0A\u53BB\", value: \"push\", primary: true }, { label: \"\u6682\u4E0D\", value: \"later\" }])) === \"push\"; }\n      catch (e) { reportError(e, \"log\"); go = false; }\n    }\n    diagNote(\"auth\", `afterSignIn: ${n} not pushed \u2192 ${go ? \"push\" : \"later\"}`);\n    if (go) { if (H.home.kind === \"gallery\") { try { await es.flushAndPush(); } catch (e) { reportError(e, \"warning\"); } } await pushDirtyAll(); }\n    await refreshOpenDoc();\n    gallery?.refresh(); gallery?.renderCloud(); renderTitle();\n  })().finally(() => { afterSignInInFlight = null; });\n  return afterSignInInFlight;\n}\nlet pushAllInFlight: Promise<void> | null = null;\nfunction pushDirtyAll(opts: { verbose?: boolean } = {}): Promise<void> {\n  if (pushAllInFlight) return pushAllInFlight;\n  pushAllInFlight = (async () => {\n    try {\n      const r = await requireStore().files.dirty.pushAll();\n      if (r.pushed || r.failed.length) diagNote(\"sync\", `dirty.pushAll: pushed=${r.pushed} failed=${r.failed.length}${r.failed.length ? \" [\" + r.failed.join(\", \") + \"]\" : \"\"}`);\n      if (r.failed.length) showError(`\u6709 ${r.failed.length} \u9996\u6CA1\u63A8\u4E0A\u4E91\uFF1A${r.failed.map(stemOfId).join(\"\u3001\")}`);\n      else if (opts.verbose) info(r.pushed ? `\u63A8\u4E0A\u53BB\u4E86 ${r.pushed} \u9996` : \"\u6CA1\u6709\u8981\u63A8\u7684\");\n    } catch (e) { reportError(e, \"warning\"); }\n  })().finally(() => { pushAllInFlight = null; });\n  return pushAllInFlight;\n}\n/** \u9009\u4E00\u5F20\u56FE\u5F53\u5C01\u9762\uFF1A\u7F29\u6210 \u2264 256\u00B2\u3001\u2264 70 KB \u7684 PNG \u5B58\u8FDB\u6B4C\uFF08Thumbnails/thumbnail.png\uFF0Czip \u6700\u540E\u4E00\u4E2A entry\uFF0C\u6B4C\u5E93\u5C3E\u8BFB\uFF09\uFF1B\u539F\u56FE\u4E0D\u7559\u3002 */\nasync function setCover(f: File): Promise<void> {\n  try {\n    const png = await makeCoverPng(new Uint8Array(await f.arrayBuffer()));\n    updateExtras(withThumbnail(D.extras, png), { kind: \"cover\", label: \"\u6362\u5C01\u9762\u56FE\" });\n    info(`\u5C01\u9762\u56FE\u6362\u597D\u4E86\uFF08${sizeText(png.length)}\uFF09`);\n  } catch (e) { showError(`\u8FD9\u5F20\u56FE\u7528\u4E0D\u4E86\uFF1A${(e as Error).message}`); }\n}\n/** smart save\uFF08\u6B4C\u5E93\u91CC\u7684\u6B4C\uFF1B\u9876\u680F\u94AE / Ctrl+S / \u6587\u4EF6\u83DC\u5355\u300C\u5B58\u300D\u540C\u4E00\u5165\u53E3\uFF09\uFF1A\u810F \u2192 \u7ACB\u523B\u843D\u76D8 + \u63A8\uFF1B\u5E72\u51C0\u4E14\u767B\u5F55\u7740 \u2192 \u590D\u67E5\u4E91\u7AEF\u518D force \u63A8\u4E00\u6B21\uFF08\u65F6\u95F4\u6233\u8D70\u5B57\uFF09\uFF1B\n *  \u6CA1\u767B\u5F55 \u2192 \u843D\u672C\u5730 + \u95EE\u4E00\u6B21\u300C\u53BB\u767B\u5F55\uFF1F\u300D\uFF08\u540C\u4E00 session \u70B9\u8FC7\u300C\u6682\u4E0D\u300D\u5C31\u4E0D\u518D\u5F39\uFF0C\u53EA\u63D0\u793A\uFF09\u3002 */\nlet signInDeclined = false;\nasync function smartSaveStore(): Promise<void> {\n  const b = $(\"saveBtn\"); b.classList.add(\"flash\"); setTimeout(() => b.classList.remove(\"flash\"), 500);\n  void requestStoragePersistence();\n  const before = syncKind();\n  if (before === \"clean\") { await refreshOpenDoc(); }\n  await es.forceSaveAndPush(); renderTitle();\n  if (!isSignedIn()) {\n    if (signInDeclined || navigator.onLine === false || !auth.isAuthConfigured()) { info(\"\u5B58\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\u4E86\"); return; }\n    const v = await openChoiceSheet(\"\u5B58\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\u4E86\", \"\u8981\u540C\u6B65\u5230 OneDrive \u5417\uFF1F\u767B\u5F55\u5FAE\u8F6F\u4E2A\u4EBA\u8D26\u53F7\u540E\uFF0C\u6B4C\u5E93\u540C\u6B65\u5230\u4F60 OneDrive \u7684\u300C\u5E94\u7528\u300D\u6587\u4EF6\u5939\uFF08\u8FD9\u4E2A app \u53EA\u80FD\u770B\u81EA\u5DF1\u7684\u90A3\u4E2A\u5939\uFF09\u3002\",\n      [{ label: \"\u53BB\u767B\u5F55\", value: \"go\", primary: true, onPick: redirectToSignIn }, { label: \"\u6682\u4E0D\", value: \"later\" }]);\n    if (v === \"later\") signInDeclined = true;\n    return;\n  }\n  info(es.isPushPending() ? \"\u5B58\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\u4E86\uFF0C\u4E91\u7AEF\u7A0D\u540E\u518D\u63A8\" : before === \"clean\" ? \"\u4E91\u7AEF\u4E5F\u662F\u6700\u65B0\u7684\" : \"\u5B58\u597D\u4E86\uFF0C\u4E91\u7AEF\u4E5F\u66F4\u65B0\u4E86\");\n}\n$(\"saveBtn\").addEventListener(\"click\", () => { void fileSave(); });   // smart save = \u5B58 = \u56DE\u5BB6\uFF08\u4E09\u79CD\u5BB6\u7684\u5206\u652F\u5728 H.save\uFF09\n$(\"undoBtn\").addEventListener(\"click\", () => undoNow());\n$(\"redoBtn\").addEventListener(\"click\", () => redoNow());\n$(\"lockBtn\").addEventListener(\"click\", () => info(\"\u8FD9\u9996\u6B4C\u6CA1\u52A0\u5BC6\u3002MoonSinger \u8FD9\u4E00\u7248\u8FD8\u4E0D\u52A0\u5BC6\uFF08\u8981\u7684\u8BDD\u544A\u8BC9\u5F00\u53D1\u8005\uFF1A\u7167 WXHW \u63A5 zip.js + 7z \u5C31\u80FD\u5F00\uFF09\u3002\"));\n// iOS \u8F6F\u952E\u76D8\uFF08user 2026-10-08\u300C\u5F39\u8F6F\u952E\u76D8\u7684\u65F6\u5019\u6700\u4E0B\u9762\u6EDA\u52A8\u4E0D\u4E0A\u53BB\u300D\uFF09\uFF1AvisualViewport \u77EE\u4E86\u591A\u5C11 = --kb-offset\uFF0C\u6574\u4E2A app \u7F29\u5230\u952E\u76D8\u4E0A\u9762\uFF08styles #app\uFF09\uFF0C\u8C31\u7684\u6700\u5E95\u4E0B\u624D\u6EDA\u5F97\u5230\uFF1B\n//   iOS \u628A\u89C6\u53E3\u9876\u4E0A\u53BB\u65F6\u62C9\u56DE 0\uFF08\u56FA\u5B9A\u7684\u9876\u680F\u522B\u88AB\u63A8\u51FA\u5C4F\uFF09\uFF1B\u952E\u76D8\u9732 / \u6536\u4E4B\u540E\u5149\u6807\u90A3\u884C\u6EDA\u8FDB\u89C6\u91CE\u3002\u7167 WXHW app.ts \u7684\u505A\u6CD5\u3002\nif (window.visualViewport) {\n  const vv = window.visualViewport;\n  const upd = () => {\n    const textFocused = document.activeElement instanceof HTMLElement && /^(INPUT|TEXTAREA)$/.test(document.activeElement.tagName);\n    if (vv.offsetTop > 0 && textFocused) window.scrollTo(0, 0);\n    const next = `${Math.max(0, Math.round(window.innerHeight - vv.height - vv.offsetTop))}px`;\n    if (document.documentElement.style.getPropertyValue(\"--kb-offset\") === next) return;\n    document.documentElement.style.setProperty(\"--kb-offset\", next);\n    diagNote(\"viewport\", `kb-offset=${next} inner=${window.innerHeight} vv=${Math.round(vv.height)}+${Math.round(vv.offsetTop)}`);\n    requestAnimationFrame(() => view.followNow());\n  };\n  vv.addEventListener(\"resize\", upd); vv.addEventListener(\"scroll\", upd);\n  document.addEventListener(\"focusin\", () => setTimeout(upd, 60)); document.addEventListener(\"focusout\", () => setTimeout(upd, 60));\n}\nwindow.addEventListener(\"online\", () => { renderTitle(); if (!hasStore()) return; if (isSignedIn()) void afterSignIn(); else retrySilent(); });\nwindow.addEventListener(\"offline\", () => renderTitle());\n// \u2500\u2500 \u6302\u673A\u5F88\u4E45\u9192\u6765\uFF1A\u5148\u6838\u4E91\u7AEF\u3001\u518D\u653E\u884C\u8F93\u5165\uFF08\u5BB6\u65CF\u5468\u8D26 F-67 = KudsRocket W-25 \u7684 MoonSinger \u90A3\u4E00\u534A\uFF1Buser 2026-10-15\u300Cunlock\u4E4B\u540E\u4E0D\u5E94\u8BE5\u662F\u5224\u65AD\u7ACB\u523B\u63A8autosave\u3002\u4F60\u770B\u4E00\u4E0Bwxhw weebpaint\n//   \u5982\u679C\u4E00\u6BB5\u65F6\u95F4\u4E0D\u7528\u4F1A\u9501\u5C4F\uFF0C\u7136\u540E\u6000\u7591\u4E91\u7AEF\u6709\u66F4\u65B0\u3002\u60F3\u4E00\u4E0B\u8FD9\u4E2A\u9632\u7684\u662F\u4EC0\u4E48\u3002\u987A\u4FBFmoonsinger\u4E5F\u6CA1\u505A\u8FD9\u4E2A\u529F\u80FD\u3002\u5C31\u662F\u9632\u6B62\u4E00\u4E2A\u6302\u673A\u4E86\u4E00\u5E74\u7684\u8BBE\u5907\u8BEF\u8986\u76D6\u65B0\u7248\u672C\u300D\uFF1Badded 2026-10-21 by Claude Fable 5.1\uFF09\u2500\u2500\n//   \u9632\u7684\u662F\uFF1A\u4E00\u53F0\u5E26\u7740\u9648\u65E7\u72B6\u6001\u7761\u4E86\u5F88\u4E45\u7684\u8BBE\u5907\u9192\u6765\uFF0C\u4E91\u7AEF\u7684\u65B0\u7248\u672C\u8FD8\u6CA1\u62C9\u4E0B\u6765\u3001\u7528\u6237\u5DF2\u7ECF\u63A5\u7740\u5199\u4E86 = \u5206\u53C9\u3002If-Match \u6321\u5F97\u4F4F\u9759\u9ED8\u8986\u76D6\uFF08\u63A8\u4F1A 412 \u2192 \u51B2\u7A81\u9762\uFF09\uFF0C\n//   \u4F46\u90A3\u5F20\u9762\u4F1A\u5F39\u5728\u534A\u68A6\u534A\u9192\u90A3\u4E00\u523B\u3001\u5BB9\u6613\u70B9\u9519\u300C\u7528\u8FD9\u53F0\u7684\u300D\u3002\u6240\u4EE5\uFF1A\u79BB\u5F00\u524D\u53F0\u8D85\u8FC7 WAKE_CHECK_AFTER_MS \u56DE\u6765 = \u540C\u6B65\u95F8\u5148\u9501\u4F4F\u8F93\u5165\uFF08\u6CA1\u6709\u6309\u94AE\uFF09\u2192 \u5E72\u51C0\u7684\u6B4C\u5FEB\u8FDB\u5230\u4E91\u7AEF\n//   \uFF08refreshOpenDoc\uFF1B\u771F\u6709\u65B0\u7248\u672C\u90A3\u6761\u8DEF\u672C\u6765\u5C31\u9501\u5230\u91CD\u8F7D\u5B8C\uFF09\u2192 \u653E\u5F00\u3002\u77ED\u6682\u5207\u8D70\u4E0D\u9501\uFF1B\u6CA1\u767B\u5F55 / \u79BB\u7EBF / \u4E0D\u5728\u6B4C\u5E93\u91CC = \u6CA1\u6CD5\u6838\u3001\u4E0D\u9501\uFF1B\u672C\u673A\u6709\u6CA1\u63A8\u4E0A\u53BB\u7684\u6539\u52A8 = \u5E93\u7684\u5FEB\u8FDB\u672C\u6765\u5C31\u4E0D\u52A8\u5B83\uFF0C\n//   \u4E0D\u9501\uFF08\u5206\u53C9\u7167\u65E7\u7531\u4E0B\u4E00\u6B21 consent \u63A8\u7684 412 \u515C\u5E95\u2014\u2014\u63A8\u53EA\u5728\u6362\u6B4C / \u9000\u51FA / \u6309\u300C\u5B58\u300D\uFF0C\u90A3\u662F\u4EBA\u6E05\u9192\u7740\u7684\u52A8\u4F5C\uFF09\u3002\u8D85\u65F6\u5148\u653E\u5F00\uFF0C\u6838\u5BF9\u5728\u540E\u53F0\u63A5\u7740\u8DD1\u3002\nlet hiddenAt = 0;\nconst describeAway = (ms: number): string => { const m = Math.round(ms / 60000); return m < 60 ? `${m} \u5206\u949F` : m < 60 * 24 ? `${Math.round(m / 60)} \u5C0F\u65F6` : `${Math.round(m / 60 / 24)} \u5929`; };\n/** \u9192\u6765\u90A3\u6B21\u6838\u5BF9\u3002\u8FD4\u56DE\u6709\u6CA1\u6709\u9501\u8FC7\u95F8\uFF08E2E \u770B\uFF09\u3002 */\nasync function wakeCheck(awayMs: number): Promise<boolean> {\n  if (H.home.kind !== \"gallery\" || !hasStore() || !isSignedIn() || !navigator.onLine) return false;\n  if (dirty() || es.isPushPending()) { diagNote(\"sync\", `wake after ${describeAway(awayMs)}: local changes pending, cloud check skipped`); return false; }\n  diagNote(\"sync\", `wake after ${describeAway(awayMs)}: checking cloud before input`);\n  void lockSyncGate({ title: \"\u56DE\u6765\u4E86\", message: `\u79BB\u5F00\u4E86 ${describeAway(awayMs)}\uFF0C\u5148\u770B\u770B\u4E91\u7AEF\u6709\u6CA1\u6709\u65B0\u7248\u672C\u2026\u2026\u7A0D\u7B49\uFF0C\u5148\u522B\u6253\u5B57\u3002`, showSpinner: true, actions: [] });\n  let timedOut = false;\n  try { await Promise.race([refreshOpenDoc(), new Promise<void>((r) => setTimeout(() => { timedOut = true; r(); }, WAKE_CHECK_TIMEOUT_MS))]); }\n  finally {\n    if (!timedOut) unlockSyncGate();\n    else { diagNote(\"sync\", \"wake check timed out: input released, check continues in background\"); if (!replaceInFlight) unlockSyncGate(); }   // \u6B63\u5728\u6362\u6210\u4E91\u7AEF\u65B0\u7248\u672C = \u90A3\u628A\u9501\u5F52 refreshOpenDoc\uFF0C\u522B\u5728\u8FD9\u513F\u653E\u5F00\n  }\n  return true;\n}\ndocument.addEventListener(\"visibilitychange\", () => {\n  if (document.visibilityState !== \"visible\") { hiddenAt = Date.now(); return; }\n  const away = hiddenAt ? Date.now() - hiddenAt : 0; hiddenAt = 0;\n  if (!hasStore()) return;\n  if (!isSignedIn()) { retrySilent(); return; }\n  if (away >= WAKE_CHECK_AFTER_MS) void wakeCheck(away); else void refreshOpenDoc();\n});\n\n// \u2500\u2500 \u952E\u76D8\uFF1A\u6620\u5C04\u662F\u4E00\u5F20\u8868\uFF08src/keyboard/keys.ts\uFF09\uFF1B\u8FD9\u91CC\u53EA\u7B97\u300C\u952E\u76D8\u73B0\u5728\u5F52\u8C01\u300D\uFF0C\u518D\u7167\u8DEF\u7531\u7684\u7ED3\u679C\u505A \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n/** \u8C01\u5728\u6700\u4E0A\u9762\u5F52\u8C01\uFF1A\u5BFC\u51FA\u9762\u677F > \u8BB0\u53F7\u6846 > \u6B4C\u8BCD\u6846 > \u8C31\u9762\uFF08\u5F39 / \u6539 / \u5199\uFF09\u3002 */\nfunction whereNow(): Where {\n  if (ui.overlay || isSheetOpen() || isGateOpen()) return \"sheet\";\n  if (view.marks.open) return \"mark\";\n  if (view.lyrics.open) return \"lyric\";\n  return impro ? \"impro\" : D.st.sel ? \"edit\" : \"write\";\n}\n/** \u7167\u505A\uFF1B\u8FD4\u56DE false = \u8FD9\u4E00\u4E0B\u5176\u5B9E\u4E0D\u5F52\u6211\u4EEC\u7BA1\uFF08\u4F8B\u5982\u6B4C\u8BCD\u6846\u91CC\u300C-\u300D\u4E0D\u8DDF\u5728\u5B57\u6BCD\u540E\u9762\uFF09\uFF0C\u8BA9\u6D4F\u89C8\u5668\u7167\u5E38\u6253\u5B57\u3002 */\n/** \u5199\u97F3\u7684\u90A3\u4E9B\u547D\u4EE4\uFF1A\u53EA\u5728\u300C\u97F3\u300D\u91CC\uFF08\u300C\u8BCD / \u7B26\u300D\u91CC\u952E\u76D8\u4E0D\u5199\u97F3\u2014\u2014\u8FD9\u4E00\u5C42\u4E0D\u662F\u97F3\uFF1Buser\u300C\u6A21\u5F0F\uFF01\u97F3\uFF0C\u6B4C\u8BCD\uFF0C\u5F3A\u5EA6\u548Carticulation\uFF01\u300D\uFF09\u3002 */\nconst NOTE_EDIT = new Set([\"degree\", \"rest\", \"bar\", \"shorter\", \"longer\", \"tuplet\", \"extend\", \"acc\", \"octave\", \"step\", \"alter\", \"delete\", \"transpose\", \"respell\", \"seldur\", \"selscale\", \"modulate\", \"staff\"]);\nlet modeHintShown: Mode | null = null;\n/** \u300C\u8BCD\u300D\u91CC\u7684\u9000\u683C\uFF1A\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u6709\u5B57 = \u5220\u6389\u5B83\u7684\u5B57\uFF1B\u5149\u6807\u90FD\u5F80\u56DE\u9000\u8FC7\u8FD9\u4E2A\u97F3\uFF08\u50CF\u5220\u6587\u5B57\uFF09\u3002 */\nfunction lyricBackspace(): void {\n  const toks = tr(D.st);\n  for (let i = D.st.caret - 1; i >= 0; i--) {\n    const t = toks[i]; if (t.kind !== \"note\") continue;\n    update(setCaret(t.lyric ? setNote(D.st, i, { lyric: null }) : D.st, i));\n    return;\n  }\n}\nfunction run(a: Action, repeat: boolean, code: string): boolean {\n  switch (a.k) {\n    case \"cmd\":\n      if (ws.mode === \"lyrics\" && NOTE_EDIT.has(a.cmd.k)) { if (modeHintShown !== ws.mode) { modeHintShown = ws.mode; info(`\u300C${MODE_LABEL[ws.mode]}\u300D\u91CC\u952E\u76D8\u4E0D\u5199\u97F3\uFF08\u5207\u5230\u300C\u97F3\u300D\u518D\u5199\uFF09`); } return true; }   // \u300C\u7B26\u300D\u91CC\u7535\u8111\u952E\u76D8\u7167\u6837\u5199\u97F3\uFF08v0.10.36 \u97F3\u7B26\u4E00\u8D77\u7F16\u8F91\uFF09\uFF1B\u53EA\u6709\u300C\u8BCD\u300D\u4E0D\u5199\n      if (a.cmd.k === \"backspace\" && ws.mode === \"symbols\") { update(apply(D.st, { k: \"symBackspace\" }, performance.now())); return true; }   // \u7B26\uFF1A\u9000\u683C\u5220\u8BB0\u53F7\uFF08user\u300C\u6211\u65E9\u5C31\u60F3\u7528\u9000\u683C\u5220\u5F3A\u5EA6\u66F2\u7EBF\u4E86\u300D\uFF09\n      if (a.cmd.k === \"backspace\" && ws.mode === \"lyrics\") { lyricBackspace(); return true; }\n      if (a.cmd.k === \"degree\") {\n        if (!repeat && padHost.monoAccept(`key${code}`)) {   // \u5148\u54CD\u540E\u5199\uFF082026-10-17 Fable\uFF09\uFF1A\u54CD\u7684\u5C31\u662F\u8981\u5199\u8FDB\u53BB\u7684\u90A3\u4E2A\u97F3\uFF08\u7B97\u5728\u6CA1\u63D0\u4EA4\u7684 n \u91CC\uFF09\uFF1B\u5199\u5B8C\u6309 D.st \u5B9A\u4F4D\uFF08normalize \u53EF\u80FD\u5728\u524D\u9762\u8865\u529B\u5EA6\uFF0C\u4E0B\u6807\u4F1A\u632A\uFF09\n          const c = { ...a.cmd, mono: !canStack() }, n = apply(D.st, c, performance.now());\n          if (n !== D.st) {\n            const t0 = tr(n)[n.caret - 1];\n            if (t0?.kind === \"note\" && t0.pitch) { sound.down(t0.pitch, `key${code}`); pad.showDown(midiOf(t0.pitch), `key${code}`); }\n            update(n);\n            if (t0?.kind === \"note\" && t0.pitch) soundAfterWrite(D.st, D.st.caret - 1, `key${code}`, t0.pitch);   // \u6210\u4E86\u548C\u5F26\uFF08\u53E0\u4EAE\u7740\uFF09= \u8865\u54CD\u591A\u51FA\u6765\u7684\u97F3\uFF1B\u4E3B\u97F3\u53D8\u4E86 = \u91CD\u54CD\n          }\n          afterWrite();\n        }\n        return true;\n      }\n      update(apply(D.st, withHalf(a.cmd), performance.now()));\n      if (a.cmd.k === \"rest\" || a.cmd.k === \"extend\") afterWrite();\n      if (a.cmd.k === \"step\" || a.cmd.k === \"alter\" || a.cmd.k === \"octave\") previewEdited();   // \u6539\u97F3\u9AD8 = \u54CD\u4E00\u4E0B\uFF08\u6539\u65F6\u957F\u4E0D\u54CD\uFF1Buser 2026-10-10\uFF09\n      return true;\n    case \"audition\": {   // \u5F39\uFF1A\u5728\u8349\u7A3F\u72B6\u6001\u4E0A\u5199\u4E00\u4E0B\uFF0C\u62FF\u5230\u90A3\u4E2A\u97F3\u9AD8\u5C31\u6254\n      if (repeat) return true;\n      const probe = apply({ ...D.st, sel: null, log: [] }, { k: \"degree\", degree: a.degree, dir: a.dir }, performance.now());\n      keyTok(probe, probe.caret - 1, code);\n      { const t = tr(probe)[probe.caret - 1]; if (ghostOn() && t?.kind === \"note\" && t.pitch) { ghostHeld.set(`key${code}`, t.pitch); ghostSync(); } }   // \u5F39\uFF1A\u9B3C\u97F3\u7B26\n      if (probe.input !== D.st.input) update({ ...D.st, input: probe.input });   // \u300C\u53EA\u7BA1\u4E0B\u4E00\u4E2A\u97F3\u300D\u7684 \u266F / \u266D \u7528\u6389\u4E86\n      return true;\n    }\n    case \"stack\":   // Shift+1\u20137 = \u53E0\uFF08\u540C pad\u300C\u53E0\u300D\uFF1AXOR\uFF1B\u5355\u58F0\u4E50\u5668\u7684\u58F0\u90E8\u53E0\u4E0D\u4E86\uFF09\n      if (repeat) return true;\n      if (ws.mode !== \"notes\") { if (modeHintShown !== ws.mode) { modeHintShown = ws.mode; info(`\u300C${MODE_LABEL[ws.mode]}\u300D\u91CC\u952E\u76D8\u4E0D\u5199\u97F3\uFF08\u5207\u5230\u300C\u97F3\u300D\u518D\u5199\uFF09`); } return true; }\n      if (!canStack()) { info(\"\u8FD9\u6761\u58F0\u90E8\u53F0\u4E0A\u662F\u5355\u58F0\u7684\uFF08\u5C0F\u6708\u76F8 / \u5143\u97F3\u7248 / \u6CA1\u4EBA\uFF09\uFF1A\u53E0\u4E0D\u4E86\u3002\u6362\u6210\u80FD\u53E0\u97F3\u7684\u4E50\u5668\u518D\u53E0\"); return true; }\n      { const n = stackDegree(D.st, a.degree); if (n === D.st) return true; update(n); previewEdited(); }\n      return true;\n    case \"play\": playPause(keyTs); return true;\n    case \"impro\": toggleImpro(); return true;\n    case \"lyric\": return view.lyrics.act(a.a);\n    case \"mark\": view.marks.act(a.a); return true;\n    case \"sheet\": ui.close(); closeSheet(); return true;\n    case \"file\": if (a.a === \"open\") void fileOpen(); else if (a.a === \"save\") void fileSave(); else openExportHub(); return true;\n    case \"clip\": void selVerb(a.a); return true;\n    case \"undo\": undoNow(); return true;\n    case \"redo\": redoNow(); return true;\n  }\n}\nlet keyTs = 0;   // \u8FD9\u4E00\u4E0B\u6309\u952E\u7684\u65F6\u523B\uFF08\u4E8B\u4EF6\u7684 timeStamp\uFF09\uFF1A\u7A7A\u683C\u8FDE\u6309\u4E24\u4E0B = \u4ECE\u5934\u653E\uFF0C\u6309\u771F\u7684\u95F4\u9694\u7B97\n/** \u627E\u4E50\u5668\uFF08\u6B4C\u91CC\u7684\u627E\u4EBA\u89C6\u56FE / \u6B4C\u5E93\u4E0A\u9762\u7684\u4E50\u5668\u76EE\u5F55\uFF09\uFF1A\u7535\u8111\u952E\u76D8\u7684\u97F3\u952E = \u5F39\uFF08\u53EA\u51FA\u58F0\u3001\u4E0D\u78B0\u8C31\uFF1B\u540C\u300C\u5F39\u300D\u7684\u63A8\u97F3\u9AD8\uFF09\uFF0C\u522B\u7684\u952E\u4E0D\u63A5\uFF08v0.10.31\uFF1Buser\u300C\u5F39\u7740\u73A9/\u627E\u4E50\u5668\u7684\u65F6\u5019\u5E94\u8BE5\u4E5F\u80FD\u952E\u76D8\u5F39\u300D\uFF09\u3002 */\nfunction finderKey(e: KeyboardEvent): void {\n  if (!isSoundKey(e) || e.ctrlKey || e.metaKey || e.altKey || typingIn(e.target)) return;\n  const a = route(e, \"impro\", \"write\"); if (!a || a.k !== \"audition\") return;\n  e.preventDefault(); if (e.repeat) return;\n  const probe = apply({ ...D.st, sel: null, log: [] }, { k: \"degree\", degree: a.degree, dir: a.dir }, performance.now());\n  keyTok(probe, probe.caret - 1, e.code);\n}\nwindow.addEventListener(\"keydown\", (e) => {\n  keyTs = e.timeStamp;\n  if (finderShown() && gallery?.isOpen()) { if (e.key === \"Escape\") { e.preventDefault(); closeFinder(); } else finderKey(e); return; }   // \u6B4C\u5E93\u4E0A\u9762\u7684\u4E50\u5668\u76EE\u5F55\uFF08\u53EA\u5F39\u7740\u73A9\uFF09\uFF1AEsc \u56DE\u6B4C\u5E93\uFF1B\u97F3\u952E = \u5F39\n  if (gallery?.isOpen()) return;   // \u6B4C\u5E93\u5F00\u7740\uFF1A\u952E\u76D8\u5F52\u5B83\u3002\u6CA1\u6709\u300C\u56DE\u5230\u8C31\u300D\uFF08gallery-first\uFF09\uFF1A\u51FA\u53E3 = \u6253\u5F00\u4E00\u9996 / \u65B0\u5EFA\n  // \u5B58 / \u5BFC\u51FA / \u6253\u5F00\uFF08Ctrl / \u2318+S\u3001+Shift+S\u3001+O\uFF09\u6302\u5728\u6700\u5916\u5C42\uFF1A\u4E0D\u7BA1\u54EA\u4E00\u9875\u5F00\u7740\u3001\u7126\u70B9\u5728\u8C01\u8EAB\u4E0A\uFF08\u5F55\u97F3\u5BA4 / \u4E50\u5668\u9875 / \u4E50\u5668\u76EE\u5F55 / \u53C2\u8003\u7A97\uFF09\u90FD\u662F\u8FD9\u9996\u6B4C\u7684\u4E8B\uFF0C\n  //   \u4E0D\u80FD\u843D\u5230\u6D4F\u89C8\u5668\u7684\u300C\u4FDD\u5B58\u7F51\u9875\u300D\uFF082026-10-10 user\u300C\u5F88\u591A\u5730\u65B9save\u6CA1\u6709\u62E6\u622A\u300D\uFF09\u3002\u5404\u9875\u53EA\u51B3\u5B9A\u522B\u7684\u952E\u3002\n  if ((e.ctrlKey || e.metaKey) && !e.altKey && /^[so]$/i.test(e.key)) { const a = route(e, whereNow(), \"write\"); if (a && a.k === \"file\") { e.preventDefault(); run(a, e.repeat, e.code); return; } }\n  if (finder.isOpen) { if (e.key === \"Escape\") { e.preventDefault(); closeFinder(); } else finderKey(e); return; }   // \u627E\u4EBA\u89C6\u56FE\u5F00\u7740\uFF1AEsc + \u97F3\u952E\u53EA\u5F39\u4E0D\u5199\uFF08pad \u7684\u89E6\u5C4F\u952E\u7167\u5E38\uFF09\n  if (instShown()) {   // \u4E50\u5668\u9875\uFF1A\u53EA\u8BA4 Esc\uFF08\u56DE\u8C31\uFF09\u548C\u64A4\u9500 / \u91CD\u505A\uFF1B\u8F93\u5165\u6846\u91CC\u7684\u7167\u5E38\u6253\u5B57\n    const inField = (e.target as HTMLElement | null)?.closest(\"input, select, textarea\");\n    if (e.key === \"Escape\") { e.preventDefault(); closeInstPage(); }\n    else if (!inField && (e.ctrlKey || e.metaKey) && e.key.toLowerCase() === \"z\") { e.preventDefault(); if (e.shiftKey) redoNow(); else undoNow(); }\n    else if (!inField && (e.ctrlKey || e.metaKey) && e.key.toLowerCase() === \"y\") { e.preventDefault(); redoNow(); }\n    return;\n  }\n  if ((e.target as HTMLElement | null)?.closest?.(\"wp-reference-window\")) return;   // \u53C2\u8003\u7A97\u62FF\u7740\u7126\u70B9\uFF1A\u952E\u76D8\u5F52\u5B83\uFF08Ctrl / \u2318+V \u8FDB\u7A97\uFF1BEsc \u5B83\u81EA\u5DF1\u4EA4\u56DE\u8C31\uFF09\n  if (studio.isOpen && e.key === \"Escape\" && !D.st.sel && !view.lyrics.open && !view.marks.open && !ui.overlay) { e.preventDefault(); setMode(lastEditMode); return; }   // \u6DF7\u97F3\u53F0 = \u542C\uFF1AEsc = \u56DE\u5230\u5199   // \u8C31\u4E0A\u6CA1\u522B\u7684\u53EF\u9000 = Esc \u6536\u8D77\u5F55\u97F3\u5BA4\n  if (studio.isOpen && (e.target as HTMLElement | null)?.closest?.(\".studio\")) { if (e.key === \"Escape\") { e.preventDefault(); setMode(lastEditMode); } else if (e.key === \" \" && !typingIn(e.target)) { e.preventDefault(); playPause(e.timeStamp); } return; }   // \u6DF7\u97F3\u53F0\u5728\u5E95\u5EA7\u91CC\uFF1A\u7126\u70B9\u5728\u5B83\u91CC\u9762\u624D\u5F52\u5B83\uFF0C\u8C31\u7167\u6837\u80FD\u5199\uFF1BEsc \u56DE\u8C31\u3001\u7A7A\u683C\u64AD\u653E\u2014\u2014\u7126\u70B9\u5728\u63A8\u5B50 / \u4E0B\u62C9 / \u6309\u94AE\u4E0A\u4E5F\u662F\uFF08v0.10.10 \u4FEE\uFF1A\u539F\u6765\u7126\u70B9\u5728\u4EFB\u4F55 input\uFF08\u63A8\u5B50\u4E5F\u662F\uFF09\u4E0A\u90FD\u653E\u8FC7 = user\u300C\u6DF7\u97F3\u53F0\u7684\u7A7A\u683C\u6CA1\u6709\u6355\u6349\u300D\uFF09\uFF0C\u53EA\u6709\u6253\u5B57\u7684\u6846\uFF08\u6DF7\u97F3\u8F68\u7684\u540D\u5B57\uFF09\u4E0D\u62A2\n  if (listenOn()) {   // \u542C\u6A21\u5F0F\uFF1A\u53EA\u8BA4 \u7A7A\u683C\uFF08\u653E / \u6682\u505C\uFF09\u3001Esc\uFF08\u56DE\u5230\u5199\uFF09\u548C Ctrl / \u2318+S\uFF08\u5B58\uFF09\uFF1B\u522B\u7684\u952E\u4E0D\u5199\u8C31\n    if (e.key === \" \") { e.preventDefault(); playPause(e.timeStamp); }\n    else if (e.key === \"Escape\") { e.preventDefault(); setListen(false); }\n    else if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === \"s\") { const a = route(e, whereNow(), \"write\"); if (a && run(a, e.repeat, e.code)) e.preventDefault(); }\n    return;\n  }\n  // \u522B\u7684\u8868\u5355\u63A7\u4EF6\uFF08\u9876\u680F\u7684\u4E0B\u62C9\u6846\uFF09\u62FF\u7740\u7126\u70B9\uFF1A\u4E0D\u63A5\uFF0C\u5B83\u4EEC\u81EA\u5DF1\u5403\u65B9\u5411\u952E / \u7A7A\u683C\u3002\u6B4C\u8BCD\u6846\u3001\u8BB0\u53F7\u6846\u7684\u8F93\u5165\u6846\u7167\u5E38\u8DEF\u7531\u3002\n  const t = e.target as HTMLElement | null;\n  const ownField = !!t?.closest?.(\".lyric-input, .mark-ed\");\n  if (!(e.ctrlKey || e.metaKey) && t && (t.tagName === \"SELECT\" || t.tagName === \"TEXTAREA\" || (t.tagName === \"INPUT\" && !ownField))) return;\n  // \u6253\u5B57\u7684\u6846\uFF08\u6B4C\u540D / \u66F2\u6BB5\u540D / \u7F16\u6392\u90A3\u4E00\u884C\u3001\u9762\u677F\u91CC\u7684\u6846\uFF09\u62FF\u7740\u7126\u70B9\uFF1ACtrl / \u2318 \u7EC4\u5408\uFF08\u8D34 / \u5168\u9009 / \u64A4\u9500 / \u590D\u5236\u526A\u5207\uFF09\u5F52\u6D4F\u89C8\u5668\uFF0C\u4E0D\u843D\u5230\u8C31\u4E0A\uFF08W-36\uFF1Buser 2026-10-13\u300C\u590D\u5236\u8FDB\u6587\u672C\u6846\u7684\u65F6\u5019ctrl v\u8BEF\u62E6\u622A\u4E86\u300D\uFF09\u3002\u5B58 / \u53E6\u5B58 / \u6253\u5F00\u4E0A\u9762\u5DF2\u7ECF\u63A5\u4F4F\u4E86\n  if ((e.ctrlKey || e.metaKey) && !ownField && typingIn(t)) return;\n  const a = route(e, whereNow(), D.st.sel ? \"edit\" : \"write\");\n  if (a && run(a, e.repeat, e.code)) e.preventDefault();\n});\nwindow.addEventListener(\"keyup\", (e) => { padHost.release(`key${e.code}`); if (ghostHeld.delete(`key${e.code}`)) ghostSync(); if (isSoundKey(e)) { sound.up(`key${e.code}`); pad.showUp(`key${e.code}`); } });   // \u590D\u97F3\uFF1A\u53EA\u505C\u8FD9\u4E2A\u952E\u7684\n// \u5207\u8D70 app / \u5931\u7126\uFF1A\u62AC\u624B\u7684\u4E8B\u4EF6\u53EF\u80FD\u6536\u4E0D\u5230\uFF0C\u5168\u90E8\u505C\u6389\uFF08\u540C WeebPaint \u7684 pointer \u81EA\u6108\uFF09\nwindow.addEventListener(\"blur\", () => { padHost.reset(); sound.allOff(); pad.clearHeld(); if (ghostHeld.size) { ghostHeld.clear(); ghostSync(); } });\ndocument.addEventListener(\"visibilitychange\", () => { if (document.visibilityState === \"hidden\") { padHost.reset(); sound.allOff(); pad.clearHeld(); if (ghostHeld.size) { ghostHeld.clear(); ghostSync(); } } });\n// MIDI \u952E\u76D8\uFF08src/keyboard/midi.ts\uFF1B2026-10-16 by Claude Opus 5.5\uFF0Cuser\u300C\u4ECA\u5929\u628Amidi\u952E\u76D8\u505A\u4E00\u4E0B\u5427\u2026\u53EF\u4EE5\u63D2\u7535\u5B50\u7434\u4E0A\u5F04\u300D\uFF09\uFF1A\u7434\u952E = \u7EDD\u5BF9\u97F3\u9AD8\uFF0C\n//   \u80FD\u5199\u8C31\u7684\u65F6\u5019\u8D70 pad \u7684\u540C\u4E00\u4E2A\u7FFB\u8BD1\u5C42\uFF08\u5199 / \u6539 / \u53E0\u97F3\u89C2\u671B / \u5355\u58F0\u62A4\u680F / \u5F39 = \u53EA\u54CD\uFF09\uFF1B\u522B\u7684\u573A\u5408\uFF08\u8BCD / \u542C / \u6B4C\u8BCD\u6846 / \u9762\u677F\u5F00\u7740 / \u6B4C\u5E93\u4E0A\u7684\u4E50\u5668\u76EE\u5F55\uFF09\u53EA\u51FA\u58F0\uFF1B\u6B4C\u5E93 = \u4E0D\u63A5\u3002\n//   \u62FC\u5199 = \u5149\u6807\u5904\u7684\u8C03\u53F7\uFF08\u8C03\u5185\u7528\u8C03\u53F7\u7684\u5199\u6CD5\uFF0C\u8C03\u5916\u6309\u8C03\u7684\u65B9\u5411\uFF1B\u843D\u8FDB\u8C31\u65F6 writePitch \u7167\u6837\u6309\u8C03\u53F7\u7B80\u5316\uFF09\u3002\u529B\u5EA6\u8FD9\u4E00\u7248\u4E0D\u7BA1\uFF08\u540C pad\uFF1A\u54CD\u591A\u5927\u542C\u5149\u6807\u5904\u7684\u529B\u5EA6\uFF09\u3002\nconst midiHeld = new Map<string, \"pad\" | \"sound\">();   // \u6309\u7740\u7684\u7434\u952E\u8D70\u4E86\u54EA\u6761\u8DEF\uFF08\u677E\u5F00\u8D70\u540C\u4E00\u6761\uFF09\nfunction midiRoute(): \"pad\" | \"sound\" | null {\n  if (gallery?.isOpen()) return finderShown() ? \"sound\" : null;\n  if (finder.isOpen || instShown()) return \"pad\";   // \u627E\u4EBA\u89C6\u56FE / \u4E50\u5668\u9875\uFF1Apad \u5BBF\u4E3B\u81EA\u5DF1\u5F53\u300C\u5F39\u300D\uFF08\u53EA\u54CD\u3001\u4E0D\u78B0\u8C31\uFF09\n  if (listenOn() || ws.mode === \"lyrics\") return \"sound\";\n  const w = whereNow(); return w === \"write\" || w === \"edit\" || w === \"impro\" ? \"pad\" : \"sound\";\n}\nlet midiRowSync: ((s: MidiStatus) => void) | null = null;   // \u8BBE\u7F6E\u9762\u677F\u5F00\u7740\u65F6\u90A3\u4E00\u884C\u8DDF\u7740\u53D8\nconst midi = createMidiKeyboard({\n  down: (note, _vel, id) => {\n    const r = midiRoute(); if (!r) { midiBlink(); return; }\n    const p = spellMidi(note, keyAt(tr(D.st), D.st.sel ? D.st.sel.from : D.st.caret));\n    if (r === \"pad\") { if (padHost.noteDown(p, id)) midiHeld.set(id, r); }\n    else { sound.down(p, id); midiHeld.set(id, r); }\n    midiBlink();\n  },\n  up: (id) => { const r = midiHeld.get(id); midiHeld.delete(id); if (r === \"pad\") padHost.noteUp(id); else if (r === \"sound\") sound.up(id); },\n  plug: (name, on) => info(on ? `MIDI \u952E\u76D8\u63A5\u4E0A\u4E86\uFF1A${name}` : `MIDI \u952E\u76D8\u62D4\u6389\u4E86\uFF1A${name}`),\n  status: (s) => { diagNote(\"midi\", s.k === \"on\" ? `on: ${s.inputs.join(\", \") || \"(no input)\"}` : s.k === \"denied\" ? `denied: ${s.why}` : s.k); midiRowSync?.(s); syncMidiChip(s); },\n});\n// \u9876\u680F\u300CMIDI\u300D\uFF08W-42\uFF1Buser 2026-10-17\u300Cmidi\u662Fux\u7684\u95EE\u9898\uFF1A\u6211\u4E0D\u77E5\u9053\u9700\u8981\u8FDB\u8BBE\u7F6E\u8FDE\u300D\u2192\u300C\u540C\u610F\u9876\u680F\u663E\u793Amidi\u72B6\u6001\u3002\u4E0D\u4E00\u5F00\u59CB\u5F39\u300D\uFF09\uFF1A\u72B6\u6001\u5373\u6309\u94AE\uFF0C\u70B9\u5F00 = \u73B0\u5728\u600E\u6837 + \u80FD\u505A\u7684\uFF08\u8FDE\u63A5 / \u6211\u6CA1\u6709\uFF09\u3002\n//   \u6CA1\u6709 Web MIDI\uFF08iPad / iPhone\uFF09= \u4E0D\u9732\uFF1B\u6CA1\u8FDE = \u7070\u5B57\uFF08\u7A84\u5C4F\u4E0D\u9732\uFF0C\u8BBE\u7F6E\u91CC\u7167\u6837\u80FD\u8FDE\uFF09\uFF1B\u8FDE\u7740\u6CA1\u63D2\u7434 = \u7A7A\u5FC3\u70B9\uFF1B\u63D2\u7740 = \u5B9E\u5FC3\u70B9\uFF0C\u6765\u4E00\u4E2A\u97F3\u95EA\u4E00\u4E0B\uFF08\u4E00\u773C\u77E5\u9053\u7434\u5230\u4E86 app\uFF09\uFF1B\u6CA1\u7ED9 = \u8B66\u544A\u8272\u3002\n//   \u5F00 app \u4E0D\u5F39\u6D4F\u89C8\u5668\u7684\u8BB8\u53EF\u6846\uFF08\u6D4F\u89C8\u5668\u8BB0\u4F4F\u4E86\u5141\u8BB8 = \u9759\u9ED8\u63A5\u4E0A\uFF0C\u540C v0.12.26\uFF09\u3002\nconst midiBtn = $(\"midiBtn\"), KV_MIDI_CHIP_HIDDEN = \"midi-chip-hidden\";   // \u300C\u6211\u6CA1\u6709 MIDI \u952E\u76D8\u300D= \u8FD9\u53F0\u6D4F\u89C8\u5668\u6CA1\u8FDE\u7684\u65F6\u5019\u9876\u680F\u4E0D\u9732\uFF08\u8FDE\u4E0A\u4E86\u7167\u6837\u9732\uFF09\nconst MIDI_CHIP_TITLE: Record<string, string> = { off: \"MIDI \u952E\u76D8\uFF1A\u8FD8\u6CA1\u8FDE\uFF08\u70B9\u4E00\u4E0B\u770B\u600E\u4E48\u8FDE\uFF09\", asking: \"MIDI \u952E\u76D8\uFF1A\u7B49\u6D4F\u89C8\u5668\u7684\u8BB8\u53EF\u2026\", denied: \"MIDI \u952E\u76D8\uFF1A\u6D4F\u89C8\u5668\u6CA1\u7ED9\uFF08\u70B9\u4E00\u4E0B\u770B\u600E\u4E48\u529E\uFF09\", idle: \"MIDI \u952E\u76D8\uFF1A\u5F00\u7740\uFF0C\u8FD8\u6CA1\u63D2\u7434\uFF08\u63D2\u4E0A\u5C31\u8BA4\uFF09\" };\nfunction syncMidiChip(s: MidiStatus): void {\n  const k = s.k === \"on\" ? (s.inputs.length ? \"on\" : \"idle\") : s.k;\n  midiBtn.hidden = s.k === \"unsupported\" || (s.k === \"off\" && deviceKvGet(KV_MIDI_CHIP_HIDDEN) === \"1\");\n  midiBtn.classList.remove(\"m-off\", \"m-asking\", \"m-denied\", \"m-idle\", \"m-on\"); midiBtn.classList.add(`m-${k}`);\n  midiBtn.title = s.k === \"on\" && s.inputs.length ? `MIDI \u952E\u76D8\uFF1A\u63A5\u7740 ${s.inputs.join(\"\u3001\")}\uFF08\u5F39\u4E00\u4E0B\u8FD9\u4E2A\u70B9\u4F1A\u95EA\uFF09` : MIDI_CHIP_TITLE[k] ?? \"MIDI \u952E\u76D8\";\n}\nlet midiBlinkT = 0;\nfunction midiBlink(): void { midiBtn.classList.add(\"hit\"); clearTimeout(midiBlinkT); midiBlinkT = window.setTimeout(() => midiBtn.classList.remove(\"hit\"), 120); }\nlet midiMenuClose: (() => void) | null = null;\nfunction openMidiMenu(): void {\n  if (midiMenuClose) { midiMenuClose(); return; }   // \u518D\u70B9\u4E00\u4E0B\u94AE = \u6536\n  ui.close();\n  const s = midi.status, box = document.createElement(\"div\");\n  box.className = \"track-card ctx-menu midi-menu\"; box.setAttribute(\"role\", \"menu\");\n  const item = (v: string, label: string, title: string) => `<button class=\"btn ctx-item\" data-v=\"${v}\" title=\"${esc(title)}\">${label}</button>`;\n  box.innerHTML = `<div class=\"ctx-msg\">${midiStatusHtml(s)}</div>` +\n    (s.k === \"off\" || s.k === \"denied\" ? item(\"connect\", \"\u8FDE\u63A5\", \"\u95EE\u6D4F\u89C8\u5668\u8981 MIDI \u7684\u8BB8\u53EF\uFF08\u6D4F\u89C8\u5668\u4F1A\u5F39\u5B83\u81EA\u5DF1\u7684\u6846\uFF09\uFF1B\u7ED9\u8FC7\u4E00\u6B21\u4EE5\u540E\u5F00 app \u81EA\u5DF1\u63A5\u4E0A\") : \"\") +\n    (s.k === \"off\" ? item(\"hide\", \"\u6211\u6CA1\u6709 MIDI \u952E\u76D8\", \"\u9876\u680F\u4E0D\u518D\u9732\u300CMIDI\u300D\uFF1B\u4EE5\u540E\u8981\u8FDE\uFF1A\u83DC\u5355 \u2192 \u8BBE\u7F6E \u2192 MIDI \u952E\u76D8\") : \"\");\n  document.body.append(box);\n  const b = midiBtn.getBoundingClientRect(), w = box.offsetWidth, m = 8;\n  box.style.left = `${Math.max(m, Math.min(b.right - w, innerWidth - w - m))}px`; box.style.top = `${b.bottom + 4}px`;\n  const outside = (e: PointerEvent) => { if (!box.contains(e.target as Node) && !midiBtn.contains(e.target as Node)) close(); };\n  const close = () => { document.removeEventListener(\"pointerdown\", outside, true); box.remove(); midiMenuClose = null; ui.closed(close); };\n  setTimeout(() => { if (box.isConnected) document.addEventListener(\"pointerdown\", outside, true); }, 0);\n  midiMenuClose = close; ui.open({ k: \"menu\", close });\n  box.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (!v) return;\n    close();\n    if (v === \"connect\") void midi.connect();\n    else if (v === \"hide\") { deviceKvSet(KV_MIDI_CHIP_HIDDEN, \"1\"); syncMidiChip(midi.status); info(\"\u9876\u680F\u4E0D\u9732\u300CMIDI\u300D\u4E86\uFF1B\u4EE5\u540E\u8981\u8FDE\uFF1A\u83DC\u5355 \u2192 \u8BBE\u7F6E \u2192 MIDI \u952E\u76D8\"); }\n  });\n}\nmidiBtn.addEventListener(\"click\", openMidiMenu);\nsyncMidiChip(midi.status);\n/** \u8BBE\u7F6E\u91CC\u300CMIDI \u952E\u76D8\u300D\u90A3\u4E00\u884C\u7684\u5B57\u3002 */\nfunction midiStatusHtml(s: MidiStatus): string {\n  if (s.k === \"unsupported\") return `\u8FD9\u4E2A\u6D4F\u89C8\u5668\u8BFB\u4E0D\u4E86 MIDI \u952E\u76D8\uFF08iPad / iPhone \u4E0A\u7684\u6D4F\u89C8\u5668\u90FD\u6CA1\u6709 Web MIDI\uFF09\uFF1B\u7535\u8111\u4E0A\u7684 Chrome / Edge / Firefox \u53EF\u4EE5`;\n  if (s.k === \"asking\") return `\u7B49\u6D4F\u89C8\u5668\u7684\u8BB8\u53EF\u2026`;\n  if (s.k === \"denied\") return `\u6D4F\u89C8\u5668\u6CA1\u7ED9\uFF08${esc(s.why)}\uFF09\u3002\u5728\u5730\u5740\u680F\u5DE6\u8FB9\u7684\u7AD9\u70B9\u8BBE\u7F6E\u91CC\u5141\u8BB8 MIDI\uFF0C\u518D\u70B9\u8FDE\u63A5`;\n  if (s.k === \"off\") return `\u7434\u7528 USB \u63D2\u4E0A\u7535\u8111\uFF0C\u70B9\u300C\u8FDE\u63A5\u300D\uFF08\u6D4F\u89C8\u5668\u4F1A\u95EE\u4E00\u6B21\uFF0C\u4EE5\u540E\u5F00 app \u81EA\u5DF1\u63A5\u4E0A\uFF09`;\n  return s.inputs.length ? `\u63A5\u7740\uFF1A${esc(s.inputs.join(\"\u3001\"))}\u3002\u5F39\u7684\u97F3\u6309\u5149\u6807\u5904\u7684\u957F\u77ED\u5199\u8FDB\u8C31\uFF1B\u300C\u5F39\u300D\u5F00\u7740 / \u8BCD / \u542C\u91CC\u53EA\u51FA\u58F0` : `\u5F00\u7740\uFF0C\u8FD8\u6CA1\u63D2\u7434\uFF08\u63D2\u4E0A\u5C31\u8BA4\uFF09`;\n}\n// \u5207\u540E\u53F0\u56DE\u6765\uFF1A\u58F0\u97F3\u88AB\u7CFB\u7EDF\u6536\u8D77\u6765\u4E86\uFF08iPad = interrupted\uFF09\u5C31\u53EB\u9192\uFF1B\u8BB0\u4E00\u7B14\u5EF6\u8FDF\uFF08\u56DE\u6765\u540E\u7CFB\u7EDF\u53EF\u80FD\u6362\u4E86\u7F13\u51B2\u5927\u5C0F\u2014\u2014\u64AD\u653E\u5934\u6309\u626C\u58F0\u5668\u7684\u65F6\u949F\u8D70\uFF0C\u4F1A\u81EA\u5DF1\u8DDF\u4E0A\uFF09\ndocument.addEventListener(\"visibilitychange\", () => {\n  if (studio.isOpen) { engine.meter(document.visibilityState === \"visible\"); syncSpectrum(); }   // \u770B\u4E0D\u89C1\u5C31\u4E0D\u7EDF\u8BA1\uFF08user\u300C\u8BB0\u5F97\u6211\u8BF4\u7684\u7701cpu\uFF0C\u53EA\u6709\u770B\u89C1\u7684\u65F6\u5019\u624D\u8FDB\u884C\u7EDF\u8BA1\u548C\u7ED8\u5236\u300D\uFF09\n  if (document.visibilityState !== \"visible\") return;\n  const c = singer.unlock(); resetLatencyLog();\n  const ts = typeof c.getOutputTimestamp === \"function\" ? c.getOutputTimestamp() : null;   // \u539F\u59CB\u7684\u4E00\u5BF9\u65F6\u949F\u4E5F\u8BB0\u4E0B\u6765\uFF1A\u9519\u4F4D\u518D\u62A5\u65F6\u80FD\u770B\u51FA\u662F\u54EA\u4E2A\u65F6\u949F\u8DF3\u4E86\n  diagNote(\"audio\", `visible again: ctx ${c.state}, playing ${engine.playing}, currentTime ${c.currentTime.toFixed(3)}, ts ${ts ? `${ts.contextTime?.toFixed(3)} @ ${ts.performanceTime?.toFixed(0)}` : \"none\"}, now ${performance.now().toFixed(0)}`);\n});\n\nawait document.fonts.load(`40px Bravura`).catch(() => undefined);\n{ const z = deviceKvGet(KV_ZOOM); view.restoreZoom(z === null ? null : Number(z)); }   // \u8FD9\u53F0\u8BBE\u5907\u8BB0\u4F4F\u7684\u7F29\u653E\uFF08\u7269\u7406\u500D\u6570\uFF1B2026-10-21 user\u300C\u7F29\u653E\u8DE8\u4F1A\u8BDD\u8BB0\u4F4F\uFF0C\u6309\u8BBE\u5907\u5B58\u300D\uFF09\u2014\u2014\u7B2C\u4E00\u5E27\u5C31\u6309\u5B83\u6392\nview.render();\npad.render();\nrenderTitle();\nchromeReady = true; applyWorkspace();   // \u6A21\u5F0F / \u5E95\u5EA7\u7684\u521D\u59CB\u72B6\u6001\uFF08\u97F3\u3001\u952E\u76D8\u5728\uFF09\u843D\u5230\u754C\u9762\u4E0A\nscoreEl.focus();\n// \u6B4C\u5E93 boot\uFF1A\u8FDB\u8FC7\u6B4C\u5E93\u7684\u8BBE\u5907\uFF08\u6216\u5E26\u7740 OAuth \u56DE\u8DF3\uFF09\u5F00\u5C40\u5C31\u5EFA store\uFF08\u5148\u5EFA\u518D initAuth\uFF09\uFF0C\u56DE\u5230\u4E0A\u6B21\u7684\u5730\u65B9\u2014\u2014\u4E0A\u6B21\u5728\u6B4C\u5E93\u91CC\u5C31\u5F00\u6B4C\u5E93\uFF0C\u4E0A\u6B21\u5F00\u7740\u54EA\u9996\u5C31\u5F00\u54EA\u9996\uFF0C\u5F00\u4E0D\u4E86\u5C31\u8FDB\u6B4C\u5E93\u3002\u6CA1\u8FDB\u8FC7\u7684 = \u65E0\u5730\uFF0C\u7167\u65E7\u3002\nif (storeWasAttached() || /[#&](code|error|state)=/.test(location.hash)) {\n  ensureAttached();\n  const last = deviceKvGet(KV_LAST_DOC);\n  if (gallery!.wasInGallery() || !last) await gallery!.open();\n  else if (!(await openStoreDoc(last))) await gallery!.open();\n  startAuth();   // \u672C\u5730\u6062\u590D\u5B8C\u4E86\u518D initAuth\uFF08CatsUp 2026-09-22 \u987A\u5E8F\uFF1A\u5EFA store \u2192 \u672C\u5730\u6062\u590D \u2192 \u767B\u5F55\u63A2\u6D4B\uFF09\n}\n// \u8BD5\u542C\u5143\u97F3\u8868\uFF08\u7EA6 3 MB\uFF09\u5728\u753B\u597D\u4E4B\u540E\u7684\u7A7A\u95F2\u65F6\u4E0B\u8F7D\uFF1A\u9009\u4E86\u6708\u8BFB\u5C31\u662F\u610F\u56FE\uFF0C\u7B2C\u4E00\u4E0B\u5C31\u8BE5\u54CD\uFF08user\u300C\u9009\u8FD9\u4E2A\u4E50\u5668\u5C31\u662F\u610F\u56FE\uFF0C\u7136\u540E\u7B2C\u4E00\u4E0B\u5C31\u54CD\u300D\uFF09\nsetTimeout(() => { void ensureVowels().catch((e) => showError(`\u8BD5\u542C\u5143\u97F3\u8868\u6CA1\u4E0B\u8F7D\u4E0B\u6765\uFF1A${(e as Error).message}`)); void engine.ensure().catch(() => undefined); }, 300);\nsetTimeout(() => schedulePrewarm(), 1200);\nvoid midi.resume();   // \u6D4F\u89C8\u5668\u8BB0\u4F4F\u4E86\u300C\u5141\u8BB8\u300D= \u9759\u9ED8\u63A5\u4E0A MIDI \u952E\u76D8\uFF08\u6CA1\u8BB0\u4F4F\u4E0D\u5F39\u6846\uFF0C\u7B49\u9876\u680F\u300CMIDI\u300D\u6216\u8BBE\u7F6E\u91CC\u70B9\u300C\u8FDE\u63A5\u300D\uFF1BW-42\uFF09   // \u542F\u52A8\u65F6\u6253\u5F00\u7684\u90A3\u9996\u6B4C\uFF08\u6B4C\u5E93 / \u4E0A\u6B21\u7684\uFF09\u4E5F\u9884\u70ED   // \u5F55\u97F3\u623F\u7684 worklet \u6A21\u5757\u4E5F\u987A\u624B\u88C5\u597D\uFF08\u51E0\u5341 KB\uFF09\uFF0C\u7B2C\u4E00\u4E0B\u6309\u952E\u5C31\u54CD\n", "// config.ts \u2014\u2014 \u5E38\u91CF SSoT\uFF08\u4EBA\u7C7B\u62CD\u8FC7\u677F\u7684\u6570\u5B57\u90FD\u5728\u8FD9\u91CC\uFF0C\u522B\u6563\u5728\u5404\u5904\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\uFF08\u6284 WebXiaoHeiWu src/config.ts \u7684\u5F62\u72B6\uFF09\n//\n// OneDrive\uFF1Ascope \u6C38\u4E45 AppFolder\uFF08\u5BB6\u89C4\u786C\u89C4\u5219 #6\uFF09\uFF1Bauthority /consumers = personal-account-only\uFF08\u786C\u89C4\u5219 #7\uFF1BEntra \u6CE8\u518C\u300CMoonSinger\u300D= Personal Microsoft accounts only\uFF0C\n//   user 2026-10-08 \u6CE8\u518C\u5E76\u7ED9\u4E86 client id\uFF09\u3002\u7FFB\u6CE8\u518C audience \u4E0E\u6539 authority \u5FC5\u987B\u6210\u5BF9\u505A\u3002\nexport const APP_ID = \"moonsinger\";   // \u672C origin \u5185\u552F\u4E00\u547D\u540D\u7A7A\u95F4\uFF1AIDB `moonsinger.*` + localStorage \u524D\u7F00\u30022026-10-11 \u8D77 origin = sing.weebpaint.com\uFF08\u81EA\u5DF1\u72EC\u5360\uFF09\uFF1B\u4E4B\u524D\u662F\u548C WXHW / JRB / CatsUp \u7B49\u5144\u5F1F\u5171\u7528\u7684 fangzhangmnm.github.io\uFF0C\u65E7\u7BB1\u5B50\u91CC\u7684\u6570\u636E\u4ECD\u7528\u8FD9\u4E2A\u524D\u7F00\u3002\u6709\u6570\u636E\u540E\u6C38\u4E0D\u6539\nexport const CLIENT_ID = \"ce612efe-ea39-4a52-872d-550cd9f7d71b\";   // Entra\u300CMoonSinger\u300D\uFF08= OneDrive `Apps/MoonSinger` \u6587\u4EF6\u5939\u540D\uFF09\nexport const AUTHORITY = \"https://login.microsoftonline.com/consumers\";\nexport const SCOPES = [\"Files.ReadWrite.AppFolder\", \"offline_access\"];\nexport const MSAL_URL = \"./vendor/msal/msal-browser.min.js\";\n\n/** \u6B4C\u7684\u6587\u6863\u79CD\u7C7B\uFF08store 0.16 docKinds\uFF09\uFF1A\u4E00\u9996\u6B4C = \u4E00\u4E2A `.mxl`\uFF08MusicXML \u538B\u7F29\u5305\uFF0C\u522B\u7684\u4E50\u8C31\u8F6F\u4EF6\u4E5F\u80FD\u5F00\uFF1B\u81EA\u5BB6\u7684\u4E1C\u897F\u5728\u91CC\u9762\u7684 `.moonsinger/`\uFF09\u3002 */\nexport const SONG_SUFFIX = \".mxl\";\n/** \u672C app \u79C1\u6709\u5E93\u7684 GUID \u524D\u7F00\uFF08\u5BB6\u65CF\u547D\u540D\u89C4\u77E9\u300C<app>-<guid>.<\u7528\u9014>\u300D\uFF09\uFF1Agallery-registry \u7B49\u5F52\u8FD9\u4E2A\u524D\u7F00\uFF1Bdevice-kv \u7684\u952E\u524D\u7F00\u662F\u540C\u4E00\u4E2A GUID\uFF08`moonsinger-5b1e7c0a92d34f6e:`\uFF09\u3002\n *  \u8FD8\u539F\u51FA\u5382\uFF08src/app/factory-reset.ts\uFF09\u6309\u5B83\u5220\u81EA\u5BB6\u7684\u5E93\u3002added 2026-10-21 by Claude Fable 5.1 */\nexport const APP_DB_PREFIX = \"moonsinger-5b1e7c0a92d34f6e.\";\n\n// \u2500\u2500 \u8282\u5F8B\uFF082026-10-08 \u665A\u8D77 = WeebPaint \u7684 consent \u5236\uFF1A\u63A8\u4E91\u53EA\u5728\u6362\u6B4C / \u9000\u51FA / \u6309\u300C\u5B58\u300D/ \u8FDB\u6B4C\u5E93\uFF1B\u5E73\u65F6\u53EA\u843D\u672C\u673A\u3002\n//    user\u300C\u7528weebpaint\u65B9\u6848\uFF0C\u5BF9\u4ED8\u5927\u6B4C\uFF0C\u8FD9\u4E0D\u662Ftxt\u300D\u2014\u2014\u6B4C\u662F\u6574\u4E2A .mxl\uFF08\u5C01\u9762\u3001\u4EE5\u540E\u8FD8\u6709\u97F3\u6E90\uFF09\uFF0C15 s \u4E00\u63A8\u592A\u52E4\u3002\u539F\u6765\u7684 15 s \u9632\u6296 / 30 s \u5FC3\u8DF3\uFF08WXHW \u5236\uFF09\u64A4\u4E86\uFF09\u2500\u2500\n/** \u7F16\u8F91 \u2192 \u672C\u5730\u843D\u76D8\uFF08IDB\uFF09\u9632\u6296\uFF1A\u6B63\u6587\u6539\u4E86 2 s \u540E\u843D\u672C\u673A\uFF08\u300C\u2022\u300D= \u8FD8\u6CA1\u843D\uFF09\u3002 */\nexport const LOCAL_SAVE_DEBOUNCE_MS = 2_000;\n/** \u6302\u673A\u5F88\u4E45\u9192\u6765\u5148\u6838\u4E91\u7AEF\u3001\u518D\u653E\u884C\u8F93\u5165\uFF08\u5BB6\u65CF\u5468\u8D26 F-67 / KudsRocket W-25\uFF1Buser 2026-10-15\u300C\u5C31\u662F\u9632\u6B62\u4E00\u4E2A\u6302\u673A\u4E86\u4E00\u5E74\u7684\u8BBE\u5907\u8BEF\u8986\u76D6\u65B0\u7248\u672C\u300D\uFF09\uFF1A\n *  \u79BB\u5F00\u524D\u53F0\u8D85\u8FC7\u8FD9\u4E48\u4E45\u56DE\u6765 = \u540C\u6B65\u95F8\u5148\u9501\u4F4F\u8F93\u5165\u3001\u6838\u5B8C\u4E91\u7AEF\u518D\u653E\u5F00\u3002\u77ED\u6682\u5207\u8D70\u4E0D\u9501\uFF08\u6BCF\u6B21\u5207 tab \u90FD\u5F39\u592A\u70E6\uFF09\u3002\u6570\u662F AI \u8D77\u7684\uFF0810 \u5206\u949F\uFF09\uFF0Cuser \u53EF\u6539\u3002added 2026-10-21 by Claude Fable 5.1 */\nexport const WAKE_CHECK_AFTER_MS = 10 * 60_000;\n/** \u9192\u6765\u90A3\u6B21\u6838\u5BF9\u6700\u591A\u8BA9\u4EBA\u7B49\u591A\u4E45\uFF1A\u8D85\u65F6\u95F8\u5148\u653E\u5F00\uFF08\u6838\u5BF9\u5728\u540E\u53F0\u63A5\u7740\u8DD1\uFF0C\u771F\u6709\u65B0\u7248\u672C\u5230\u4E86\u7167\u6837\u9501\u5230\u91CD\u8F7D\u5B8C\uFF09\u3002 */\nexport const WAKE_CHECK_TIMEOUT_MS = 20_000;\n", "// identifiers.ts \u2014\u2014 \u8EAB\u4EFD\u7684\u8BED\u6CD5\uFF08store 0.16\uFF1A\u6587\u6863\u79CD\u7C7B\u8868\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\uFF08\u6284 WebXiaoHeiWu src/identifiers.ts\uFF09\n//   \u672C app \u53EA\u6709\u4E00\u79CD\u6587\u6863\uFF1A\u6B4C\uFF08`<\u540D>.mxl`\uFF0Czip \u5BB9\u5668 = MusicXML \u538B\u7F29\u5305\uFF0C\u522B\u7684\u4E50\u8C31\u8F6F\u4EF6\u4E5F\u80FD\u5F00\uFF09\u3002\u8FD9\u5F20\u8868\u62A5\u7ED9 createStore\uFF08app-store.ts\uFF09\uFF0C\n//   \u540C\u4E00\u5F20\u8868\u5728\u8FD9\u91CC\u518D\u9020\u4E00\u4EFD identifiers \u7ED9\u7EAF\u4EE3\u7801\u548C\u6D4B\u8BD5\u7528\u2014\u2014\u4E24\u8FB9\u6C38\u8FDC\u662F\u540C\u4E00\u5957\u5207\u6CD5\u3002\n//   \u8FD9\u662F @internal/store \u7684\u7B2C\u4E8C\u4E2A\u503C\u7EA7 import \u70B9\uFF08test/redline-guard.test.mjs \u91CC\u653E\u884C\uFF09\uFF1AcreateIdentifiers \u662F\u7EAF\u51FD\u6570\uFF0C\u4E0D\u78B0\u5B58\u50A8\u3001\u4E0D\u78B0\u4E91\u3002\n//   \u7528\u8BCD\uFF08user 2026-09-29 \u5B9A\uFF09\uFF1Aidentifier \u8EAB\u4EFD / folder / stem \u4E3B\u5E72 / suffix \u540E\u7F00 / kind \u79CD\u7C7B\u3002name \u4E0D\u518D\u6307\u4EFB\u4F55\u7CBE\u786E\u7684\u4E1C\u897F\u3002\nimport { createIdentifiers, type DocKind, type Identifiers } from \"@internal/store\";\nimport { SONG_SUFFIX } from \"./config.ts\";\n\nexport const SONG_KIND = \"song\";\nexport const DOC_KINDS: readonly DocKind[] = Object.freeze([\n  { kind: SONG_KIND, suffix: SONG_SUFFIX, container: \"zip\" },\n]);\nexport const identifiers: Identifiers = createIdentifiers(DOC_KINDS);\n", "// sheets.ts \u2014\u2014 \u5E94\u7528\u5185\u6A21\u6001\u539F\u8BED\uFF1Abusy \u906E\u7F69 / \u540C\u6B65\u95F8\uFF08\u51B2\u7A81\u9762\uFF0C\u4E0D\u53EF dismiss\uFF09/ \u95EE\u4E00\u53E5 / \u8F93\u5165\u4E00\u884C / \u9009\u4E00\u4E2A\u3002created 2026-10-08 by Claude Fable 5.1\n//   \u6284 WebXiaoHeiWu src/sheets.ts \u7684\u5F62\u72B6\uFF0CDOM \u81EA\u5DF1\u9020\uFF08\u4E0D\u9760 index.html \u91CC\u9884\u57CB id\uFF09\uFF1B\u6837\u5F0F\u7528\u672C\u4ED3\u5DF2\u6709\u7684 .offer / .offer-card\uFF08settings \u9762\u677F\u540C\u6B3E\uFF09\u3002\n//   \u5BB6\u89C4\uFF1A\u7981\u7CFB\u7EDF alert / prompt / confirm\u3002busy \u4E0E\u4EA4\u4E92 sheet \u4E92\u65A5\uFF08WeebPaint 2026-06-12 \u6B7B\u9501\uFF1A\u906E\u7F69\u76D6\u4F4F\u8F93\u5165\u6846 \u2192 await \u6C38\u4E0D resolve\uFF09\uFF1A\n//   confirm / input / choice \u5728 busy \u671F\u95F4\u54CD\u4EAE throw\uFF1Bgate \u4E0D\u53D7\u6B64\u9650\uFF08\u5B83\u5C31\u662F\u5728 busy \u91CC\u5F39\u7684\u51B2\u7A81\u9762\uFF09\u3002\n//   \u952E\u76D8\uFF1A\u5F00\u7740 sheet \u65F6 Esc = \u53D6\u6D88\u3001Enter = \u4E3B\u94AE\uFF08capture \u9636\u6BB5\u5403\u6389\uFF0C\u4E0D\u6F0F\u7ED9\u8C31\u9762\u7684\u8DEF\u7531\uFF09\u3002\n\nconst esc = (s: string) => s.replace(/[&<>\"]/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\" })[c]!);\n\n// \u2500\u2500 busy \u906E\u7F69\uFF08\u53EF\u91CD\u5165 ref-count\uFF1Bstore \u5185\u90E8\u4E5F\u4F1A\u5D4C\u5957\u8C03 busy\uFF09\u2500\u2500\nlet busyEl: HTMLElement | null = null, busyDepth = 0;\nfunction busyBox(): HTMLElement {\n  if (!busyEl) { busyEl = document.createElement(\"div\"); busyEl.className = \"busy-overlay\"; busyEl.hidden = true; busyEl.innerHTML = `<div class=\"offer-card busy-card\"><div class=\"busy-spinner\"></div><div class=\"busy-text\"></div></div>`; document.body.append(busyEl); }\n  return busyEl;\n}\nexport function isBusyActive(): boolean { return busyDepth > 0; }\nexport async function withBusy<T>(label: string, fn: () => Promise<T> | T): Promise<T> {\n  const box = busyBox();\n  busyDepth++; box.querySelector(\".busy-text\")!.textContent = label; box.hidden = false;\n  try { return await fn(); }\n  finally { busyDepth--; if (busyDepth <= 0) { busyDepth = 0; box.hidden = true; } }\n}\nexport function setBusyText(label: string): void { if (busyEl && !busyEl.hidden) busyEl.querySelector(\".busy-text\")!.textContent = label; }\n\n// \u2500\u2500 \u540C\u6B65\u95F8\uFF08store \u7684\u51B2\u7A81\u9762 / \u300C\u8DF3\u8FC7\u5230\u79BB\u7EBF\u300D\u9003\u751F\u95F8\uFF1B\u9501\u5C4F + \u6709\u9650\u9009\u9879\uFF1B\u4E0D\u53EF dismiss\uFF1B\u7A7F\u900F busy\uFF09\u2500\u2500\ninterface GateAction<T> { label: string; value: T; primary?: boolean }\nexport interface GateOpts<T> { title: string; message: string; note?: string; showSpinner?: boolean; actions: GateAction<T>[] }\nlet gateEl: HTMLElement | null = null, gatePending: ((v: unknown) => void) | null = null, gateFocusBack: HTMLElement | null = null;\nexport function lockSyncGate<T = string>({ title, message, note, showSpinner, actions }: GateOpts<T>): Promise<T> {\n  // \u7126\u70B9\u5148\u62FF\u8D70\uFF1A\u5F39\u51FA\u6765\u65F6\u5E38\u5E38\u6B63\u5728\u6253\u5B57\uFF0C\u4E0D\u7136\u952E\u76D8\u9694\u7740\u906E\u7F69\u7EE7\u7EED\u5F80\u8C31\u91CC\u5199\uFF08WXHW 2026-09-29\uFF09\u3002\n  const a = document.activeElement;\n  if (a instanceof HTMLElement && a !== document.body) { gateFocusBack = a; a.blur(); }\n  if (!gateEl) { gateEl = document.createElement(\"div\"); gateEl.className = \"offer gate-sheet\"; document.body.append(gateEl); }\n  gateEl.innerHTML = `<div class=\"offer-card\"><div class=\"offer-title\">${esc(title)}</div><div class=\"offer-msg\">${esc(message)}</div>` +\n    (showSpinner ? `<div class=\"busy-spinner\"></div>` : \"\") + `<div class=\"offer-btns gate-actions\"></div>` + (note ? `<div class=\"offer-msg gate-note\">${esc(note)}</div>` : \"\") + `</div>`;\n  const box = gateEl.querySelector(\".gate-actions\")!;\n  return new Promise<T>((resolve) => {\n    for (const act of actions) {\n      const btn = document.createElement(\"button\"); btn.type = \"button\"; btn.className = `btn${act.primary ? \" primary\" : \"\"}`; btn.textContent = act.label;\n      btn.addEventListener(\"click\", () => { unlockSyncGate(); resolve(act.value); });\n      box.append(btn);\n    }\n    gateEl!.hidden = false;\n    gatePending = resolve as (v: unknown) => void;\n  });\n}\nexport function unlockSyncGate(): void {\n  if (gateEl) gateEl.hidden = true;\n  gatePending = null;\n  const back = gateFocusBack; gateFocusBack = null;\n  if (back?.isConnected && (document.activeElement === document.body || document.activeElement == null)) { try { back.focus({ preventScroll: true }); } catch { /* ignore */ } }\n}\nexport function settleSyncGate(value: unknown): void { if (gatePending) { const r = gatePending; unlockSyncGate(); r(value); } }\nexport const isGateOpen = (): boolean => gatePending != null;\n\n// \u2500\u2500 \u4EA4\u4E92 sheet\uFF1A\u4E00\u6B21\u53EA\u5F00\u4E00\u4E2A\uFF1B\u4E3B\u94AE / \u53D6\u6D88 / \u80CC\u677F / Esc \u2500\u2500\nlet sheetOpen: (() => void) | null = null;   // \u5F53\u524D sheet \u7684\u53D6\u6D88\u8DEF\u5F84\nexport const isSheetOpen = (): boolean => sheetOpen != null;\n/** \u5173\u6389\u5F53\u524D\u5F00\u7740\u7684\u4EA4\u4E92 sheet\uFF08= \u53D6\u6D88\uFF09\u3002 */\nexport function closeSheet(): void { sheetOpen?.(); }\nfunction assertNotBusy(what: string): void {\n  if (isBusyActive()) throw new Error(`sheet \"${what}\" opened while the busy overlay is active (would deadlock): move the interaction outside withBusy`);\n}\nfunction mount(html: string, onCancel: () => void, onEnter?: () => void): { box: HTMLElement; close: () => void } {\n  sheetOpen?.();\n  const box = document.createElement(\"div\"); box.className = \"offer\"; box.innerHTML = `<div class=\"offer-card\">${html}</div>`;\n  const onKey = (e: KeyboardEvent) => {\n    if (e.isComposing) return;\n    if (e.key === \"Escape\") { e.preventDefault(); e.stopPropagation(); onCancel(); }\n    else if (e.key === \"Enter\" && onEnter && !(e.target as HTMLElement)?.closest(\"textarea\")) { e.preventDefault(); e.stopPropagation(); onEnter(); }\n    else if (!(e.target as HTMLElement)?.closest(\"input, textarea\")) e.stopPropagation();   // \u522B\u7684\u952E\u4E0D\u6F0F\u7ED9\u8C31\u9762\n  };\n  window.addEventListener(\"keydown\", onKey, true);\n  const close = () => { window.removeEventListener(\"keydown\", onKey, true); box.remove(); if (sheetOpen === cancelRef) sheetOpen = null; };\n  const cancelRef = () => onCancel();\n  sheetOpen = cancelRef;\n  box.addEventListener(\"pointerdown\", (e) => { if (e.target === box) { e.preventDefault(); onCancel(); } });\n  document.body.append(box);\n  return { box, close };\n}\n\nexport interface ConfirmOpts { okLabel?: string; cancelLabel?: string; danger?: boolean }\n/** \u95EE\u4E00\u53E5\uFF1Atrue = \u70B9\u4E86 okLabel\uFF1B\u53D6\u6D88 / \u80CC\u677F / Esc = false\u3002 */\nexport function openConfirmSheet(title: string, message: string, opts: ConfirmOpts = {}): Promise<boolean> {\n  assertNotBusy(\"confirm\");\n  return new Promise((resolve) => {\n    const done = (v: boolean) => { m.close(); resolve(v); };\n    const m = mount(`<div class=\"offer-title\">${esc(title)}</div><div class=\"offer-msg\">${esc(message)}</div>` +\n      `<div class=\"offer-btns\"><button type=\"button\" class=\"btn\" data-v=\"no\">${esc(opts.cancelLabel ?? \"\u7B97\u4E86\")}</button><button type=\"button\" class=\"btn ${opts.danger ? \"danger\" : \"primary\"}\" data-v=\"ok\">${esc(opts.okLabel ?? \"\u597D\")}</button></div>`,\n      () => done(false), () => done(true));\n    m.box.addEventListener(\"click\", (e) => { const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (v === \"ok\") done(true); else if (v === \"no\") done(false); });\n    m.box.querySelector<HTMLButtonElement>('[data-v=\"ok\"]')!.focus();\n  });\n}\n\nexport interface InputOpts { defaultValue?: string; placeholder?: string; okLabel?: string; message?: string }\n/** \u8F93\u5165\u4E00\u884C\uFF1A\u5B57\u7B26\u4E32 = \u786E\u5B9A\uFF1Bnull = \u53D6\u6D88\u3002 */\nexport function openInputSheet(title: string, opts: InputOpts = {}): Promise<string | null> {\n  assertNotBusy(\"input\");\n  return new Promise((resolve) => {\n    const done = (v: string | null) => { m.close(); resolve(v); };\n    const m = mount(`<div class=\"offer-title\">${esc(title)}</div>` + (opts.message ? `<div class=\"offer-msg\">${esc(opts.message)}</div>` : \"\") +\n      `<label class=\"set-field\"><input class=\"sheet-input\" type=\"text\" spellcheck=\"false\" autocomplete=\"off\" autocapitalize=\"off\" value=\"${esc(opts.defaultValue ?? \"\")}\" placeholder=\"${esc(opts.placeholder ?? \"\")}\" /></label>` +\n      `<div class=\"offer-btns\"><button type=\"button\" class=\"btn\" data-v=\"no\">\u7B97\u4E86</button><button type=\"button\" class=\"btn primary\" data-v=\"ok\">${esc(opts.okLabel ?? \"\u597D\")}</button></div>`,\n      () => done(null), () => done(inp.value));\n    const inp = m.box.querySelector<HTMLInputElement>(\"input\")!;\n    m.box.addEventListener(\"click\", (e) => { const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v; if (v === \"ok\") done(inp.value); else if (v === \"no\") done(null); });\n    inp.focus(); inp.select();\n  });\n}\n\n/** onPick\uFF1A\u5728\u70B9\u51FB\u4E8B\u4EF6\u91CC**\u540C\u6B65**\u8C03\uFF08sheet \u5173\u6389\u4E4B\u524D\uFF09\u2014\u2014\u767B\u5F55\u8DF3\u8F6C\u8FD9\u79CD\u5FC5\u987B\u7AD9\u5728\u7528\u6237\u624B\u52BF\u91CC\u8D77\u8DF3\u7684\u52A8\u4F5C\u7528\u5B83\uFF08WeebPaint / WXHW \u540C\u6B3E\uFF09\u3002 */\nexport interface Choice<T> { label: string; value: T; primary?: boolean; danger?: boolean; hint?: string; onPick?: () => void }\n/** \u9009\u4E00\u4E2A\uFF1Avalue = \u70B9\u4E86\u90A3\u4E2A\uFF1Bnull = \u53D6\u6D88\u3002 */\nexport function openChoiceSheet<T>(title: string, message: string, choices: Choice<T>[]): Promise<T | null> {\n  assertNotBusy(\"choice\");\n  return new Promise((resolve) => {\n    const done = (v: T | null) => { m.close(); resolve(v); };\n    const m = mount(`<div class=\"offer-title\">${esc(title)}</div>` + (message ? `<div class=\"offer-msg\">${esc(message)}</div>` : \"\") +\n      `<div class=\"sheet-choices\">${choices.map((c, i) => `<button type=\"button\" class=\"btn${c.primary ? \" primary\" : \"\"}${c.danger ? \" danger\" : \"\"}\" data-i=\"${i}\" ${c.hint ? `title=\"${esc(c.hint)}\"` : \"\"}>${esc(c.label)}</button>`).join(\"\")}</div>` +\n      `<div class=\"offer-btns\"><button type=\"button\" class=\"btn\" data-v=\"no\">\u7B97\u4E86</button></div>`,\n      () => done(null));\n    m.box.addEventListener(\"click\", (e) => {\n      const t = e.target as HTMLElement, b = t.closest<HTMLElement>(\"[data-i]\");\n      if (b) { const c = choices[Number(b.dataset.i)]; c.onPick?.(); done(c.value); } else if (t.closest<HTMLElement>(\"[data-v]\")?.dataset.v === \"no\") done(null);\n    });\n  });\n}\n", "// store-ui.ts \u2014\u2014 \u7ED9 @internal/store \u7684 ui bundle\uFF08busy / \u51B2\u7A81\u9762 / \u62A5\u9519 / \u8865\u63A8\u8FDB\u5EA6 / \u8DF3\u8FC7\u5230\u79BB\u7EBF\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\n//   \u63A5\u7EBF\u5668 = \u56FE\u5E93\u5305\u7684 storeUIFor\uFF08WeebPaint / WXHW \u540C\u5F62\u7684 sheet \u5951\u7EA6\uFF09\uFF1A\u51B2\u7A81\u5FC5 surface\uFF08\u771F gate sheet\u3001\u6309 occasion \u5206\u4E24\u5957\u6309\u94AE\uFF0C\u7EDD\u4E0D\u9759\u9ED8 cancel\uFF09\uFF1B\n//   \u9519\u8BEF\u5FC5 surface\uFF08\u8D70 src/app/report-error.ts \u8FD9\u4E00\u4E2A\u6F0F\u6597\uFF0C\u6BCF\u7EA7\u90FD\u8FDB\u9ED1\u5323\u5B50\uFF09\uFF1Bbusy \u6309 key \u8DEF\u7531\uFF08\u63A8\u4E91 / \u6539\u540D\u662F\u540E\u53F0\u8282\u5F8B\uFF0C\u4E0D\u4E0A\u5168\u5C4F\u906E\u7F69\uFF09\u3002\n//   user 2026-10-08\u300C\u51B2\u7A81\u9762\u7167\u5BB6\u89C4 \u5FC5\u987B\u505A\u7684\u975E\u5E38\u4E25\u683C\u2026\u4E0D\u8981\u53D1\u751F\u6CA1\u6709\u63A5\u7EBF\u7684\u60C5\u51B5\u300D\u2014\u2014test/store-wiring.test.mjs \u5B88\u7740\u8FD9\u4E09\u4E2A handler \u90FD\u5728\u3002\nimport { storeUIFor } from \"@internal/gallery\";\nimport type { StoreUI } from \"@internal/store\";\nimport { showNotice } from \"@internal/workbench-elements\";\nimport { withBusy, lockSyncGate, settleSyncGate } from \"./ui/sheets.ts\";\nimport { reportError, diagNote } from \"./app/report-error.ts\";\nimport { identifiers } from \"./identifiers.ts\";\n\nconst stemOf = (id: string) => identifiers.parse(id)?.stem ?? id;\nconst base = storeUIFor({\n  busy: (label, fn) => withBusy(label, fn),\n  showNotice,\n  sheets: { lockSyncGate, settleSyncGate },\n  reportError,\n  stemOf,\n});\nexport const storeUI: StoreUI = {\n  ...base,\n  // \u51B2\u7A81\u9762\u6BCF\u6B21\u5F39\u51FA / \u4EBA\u9009\u4E86\u4EC0\u4E48\u90FD\u8FDB\u9ED1\u5323\u5B50\uFF08user 2026-10-08\u300C\u4E00\u76F4\u4F1A\u9047\u5230\u4E91\u7AEF\u51B2\u7A81\u7684\u63D0\u793A\u300D\u2014\u2014\u8BCA\u65AD\u65E5\u5FD7\u91CC\u5F97\u770B\u5F97\u89C1\u662F\u54EA\u9996\u3001\u54EA\u4E2A\u573A\u5408\u3001\u600E\u4E48\u9009\u7684\uFF09\u3002\n  resolveConflict: async (q) => { diagNote(\"sync\", `conflict occasion=${q.occasion} ${stemOf(q.name)}`); const r = await base.resolveConflict(q); diagNote(\"sync\", `conflict \u2192 ${r}`); return r; },\n  // \u672A\u767B\u5F55\u65F6\u5E93\u7684\u540E\u53F0\u4E91\u52A8\u4F5C\u4F1A\u649E auth \u7684 \"Not signed in\"\u2014\u2014\u90A3\u662F\u6B63\u5E38\u6001\u4E0D\u662F\u6545\u969C\uFF0C\u53EA\u8FDB\u9ED1\u5323\u5B50\u4E0D\u4E0A\u6A2A\u5E45\uFF08WXHW 2026-09-03 \u622A\u56FE\uFF1A\u6A59\u6761\u5E38\u9A7B\uFF09\u3002\u5176\u4F59\u7167\u5305\u7684\u5206\u7EA7\uFF08CloudNetworkError \u6362\u4EBA\u8BDD\uFF09\u3002\n  reportError: (err, level) => { if ((err as { message?: string } | null)?.message === \"Not signed in\") { reportError(err, \"log\"); return; } base.reportError(err, level); },\n  // ADR-0018\uFF1AofflineUploadReplay:\"auto\"\uFF08\u79BB\u7EBF\u65B0\u5EFA\u7684\u6B4C\u56DE\u7EBF\u81EA\u52A8\u8865\u63A8\uFF09\u7684\u8FDB\u5EA6 / \u649E\u540D surface\u2014\u2014\u5E93\u5728 createStore \u65F6\u5F3A\u5236\u8981\u6709\u8FD9\u6761\u7EBF\uFF08\u6CA1\u6709\u5C31\u5F53\u573A\u629B\uFF09\u3002\n  onReplayStatus: ({ phase, name, done, total }) => {\n    const n = name ? stemOf(name) : \"\";\n    if (phase === \"collision\") reportError(new Error(`\u300C${n}\u300D\u4E91\u7AEF\u5DF2\u7ECF\u6709\u540C\u540D\u7684\u4E86\uFF0C\u79BB\u7EBF\u65F6\u5B58\u7684\u8FD9\u4EFD\u6CA1\u63A8\u4E0A\u53BB\uFF08\u5728\u6B4C\u5E93\u91CC\u6539\u4E2A\u540D\u518D\u63A8\uFF09`), \"warning\");\n    else if (phase === \"done\") reportError(`\u79BB\u7EBF\u65F6\u5B58\u7684\u6B4C\u63A8\u4E0A\u4E91\u4E86\uFF08${done} / ${total}\uFF09`, \"info\");\n    else if (phase === \"pushed\") reportError(`\u6B63\u5728\u628A\u79BB\u7EBF\u65F6\u5B58\u7684\u6B4C\u63A8\u4E0A\u4E91\u2026 ${done} / ${total}`, \"info\");\n  },\n};\n", "// @internal/encryption \u2014\u2014 \u5BB6\u65CF\u5185\u5BB9\u52A0\u5BC6\u5E93\uFF082026-08-28 \u81EA @internal/store crypto-container.ts \u7ACB\u6237\uFF09\u3002\n// created 2026-08-28 by Claude Fable 5. \u51FA\u5904 = user \u62CD\u677F\u300Cencryption \u4ECE store \u4E0A\u9762\u72EC\u7ACB\u51FA\u6765\uFF0C\u4E00\u4E2A\u65B0\u7684 internal \u5E93\u300D\n//   \uFF08store \u5355\u4E00\u804C\u8D23 = \u540C\u6B65\uFF1B\u52A0\u5BC6\u662F\u7EAF\u5185\u5BB9\u64CD\u4F5C\uFF0Cblob \u8FDB blob \u51FA\uFF0C\u96F6 provider/\u6301\u4E45\u5316\u4F9D\u8D56\u2014\u2014\n//   \u6302\u5728 Store \u5B9E\u4F8B\u4E0A\u5BFC\u81F4\u65E0\u5E93\u6A21\u5F0F\u63A2\u6D4B\u4E0D\u4E86\u52A0\u5BC6\u4EF6\uFF0CWeebPaint ambient \u9000\u5F79\u8F6E\u5B9E\u9524\uFF09\u3002\n//\n// \u5BB9\u5668\u683C\u5F0F\uFF08ADR-0012\uFF0C\u683C\u5F0F\u76F2\uFF1Adata.bin \u662F\u4E0D\u900F\u660E\u5B57\u8282\uFF0Cpeek \u4E5F\u662F\u4E0D\u900F\u660E\u5B57\u8282\u2014\u2014app \u81EA\u5B9A\u4E49\u8BED\u4E49\uFF09\uFF1A\n//\n//   <name>.zip           \u2190 \u5916\u5C42\uFF1A\u660E\u6587 STORE zip\u3002central directory 100% \u5E72\u51C0\n//     \u251C\u2500\u2500 <GUID>            payload = \u52A0\u5BC6 .7z\uFF08AES-256 + \u5F3A KDF + \u52A0\u5BC6\u5934 -mhe\uFF09\uFF1A\n//     \u2502       \u251C\u2500\u2500 data.bin     \u539F\u59CB\u6587\u4EF6\u5B57\u8282\uFF0C\u6269\u5C55\u540D\u6DF7\u6DC6\n//     \u2502       \u2514\u2500\u2500 meta.bin     \"WPMETA1\\n\" + JSON {v,name,ext}\uFF08\u6062\u590D\u65F6\u6539\u56DE\u771F\u540D\u7528\uFF09\n//     \u2514\u2500\u2500 peek              \u2190 \u52A0\u5BC6\u65C1\u8DEF\u5C0F\u5757\uFF0C**\u6700\u540E\u4E00\u4E2A entry**\uFF1A\n//           [MAGIC 8][ver 1][salt 16][iv 12][len 4LE][AES-GCM(\u4E0D\u900F\u660E\u5B57\u8282)]\n//           \u4E00\u6B21 byte-range \u62C9\u5C3E\u90E8 \u2192 \u626B MAGIC \u2192 \u89E3\u5BC6\uFF0C\u65E0\u9700\u5168\u91CF\u4E0B\u8F7D\u3002peek \u517C\u4EFB\u300C\u8FD9\u662F\u52A0\u5BC6\u5BB9\u5668\u300D\u63A2\u6D4B\u6807\u8BB0\uFF0C\u6C38\u8FDC\u5199\u3002\n//\n// \u6062\u590D\uFF08anti-abandonware\uFF09\uFF1A7-Zip \u5F00 <name>.zip \u2192 \u53D6 <GUID> \u2192 \u6539\u540D .7z \u2192 \u8F93\u5BC6\u7801 \u2192 data.bin\uFF08\u6309 meta \u6539\u56DE\u771F\u540D\uFF09\u3002\n// KDF\uFF1Apayload = 7z AES-256 \u5F3A KDF\uFF1Bpeek = PBKDF2-SHA256\u00D7250k + AES-GCM\uFF08GCM tag \u517C\u4EFB\u5BC6\u7801\u9A8C\u8BC1\u5668\uFF09\u3002\n// \u65E0\u5BC6\u94A5\u6258\u7BA1\u3001\u65E0 salt \u6587\u4EF6\uFF08salt \u5728\u5404\u81EA header\uFF09\uFF0C\u6362/\u4E22\u8BBE\u5907\u96F6\u8FC1\u79FB\u3002GUID \u53EA\u662F\u6DF7\u6DC6\u540D\u975E\u8EAB\u4EFD\uFF080607 \u5426\u51B3\uFF09\u3002\n//\n// HOST-SEAM\uFF1Azip/7z codec \u7531 createEncryption \u6CE8\u5165\uFF08vendored zip.js + 7z-wasm \u5F52\u5BBF\u4E3B\uFF09\uFF1B\n//   \u4E0D\u6CE8\u5165 codec = \u63A2\u6D4B\u7C7B\u7167\u5E38\u5DE5\u4F5C\u3001pack/unpack \u54CD\u4EAE\u629B\u2014\u2014**\u6CA1\u6709\u9759\u9ED8\u66FF\u8EAB**\uFF08null-store \u6559\u8BAD\uFF0C2026-08-27/28\uFF09\u3002\n// payload \u6C38\u8FDC\u8D70 unpack7z\uFF087z-wasm = \u771F 7-Zip\uFF09\u2014\u2014\u65E2\u8BA4 .7z \u4E5F\u8BA4\u8001 WinZip-AES zip\uFF08\u5B9E\u6D4B\u9010\u4F4D\u8FD8\u539F\uFF09\u3002\nconst SEVENZ_MAGIC = [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c];\nconst ZIP_MAGIC = [0x50, 0x4b, 0x03, 0x04];\nfunction _startsWith(u8, sig) {\n    if (u8.length < sig.length)\n        return false;\n    for (let i = 0; i < sig.length; i++)\n        if (u8[i] !== sig[i])\n            return false;\n    return true;\n}\n// \u5C3E\u90E8 peek blob \u7684 MAGIC\uFF088 \u5B57\u8282\uFF1B\u9996\u5B57\u8282\u975E\u6587\u672C\u9632 false-match\uFF09\nexport const PEEK_MAGIC = [0x9e, 0x57, 0x50, 0x54, 0x48, 0x0d, 0x0a, 0x1a];\nconst PEEK_VER = 1;\nconst PEEK_HEADER_LEN = 8 + 1 + 16 + 12 + 4; // MAGIC + ver + salt + iv + len\nconst PEEK_MAX_LEN = 8 * 1024 * 1024;\nconst PBKDF2_ITERS = 250_000;\n/** \u5C3E\u90E8\u626B\u63CF\u7A97\u53E3\uFF1Apeek\uFF08\u226470KB \u81EA\u9002\u5E94\u7F29\u7565\u56FE\uFF09+ \u5916\u5C42 CD/EOCD \u4F59\u91CF\u3002\u4E0E 80KB byte-range \u9884\u7B97\u517C\u5BB9\u3002 */\nexport const PEEK_TAIL_WINDOW = 98304;\n/** \u52A0\u5BC6 peek blob \u7684 Blob.type \u6807\u8BB0\u2014\u2014byte-range \u7BA1\u7EBF/\u7F13\u5B58\u5C42\u9760\u5B83\u533A\u5206\u660E\u6587\u4E0E\u5BC6\u6587\uFF08\u4E0D\u89E3\u91CA\u5185\u5BB9\uFF09\u3002 */\nexport const ENC_PEEK_MIME = \"application/x-sync-store-enc-peek\";\n/** \u52A0\u5BC6\u5BB9\u5668\u5916\u5C42 zip \u91CC\u300C\u52A0\u5BC6\u65C1\u8DEF\u5C0F\u5757\u300Dentry \u540D\u3002\u6309\u540D\u547D\u4E2D =\u300C\u8FD9\u662F\u52A0\u5BC6\u5BB9\u5668\u300D\u3002 */\nexport const CONTAINER_PEEK_ENTRY = \"peek\";\nexport const CONTAINER_PEEK_ENTRIES = [CONTAINER_PEEK_ENTRY];\nconst META_MAGIC = \"WPMETA1\\n\";\nexport function makeGuid() {\n    return (globalThis.crypto && crypto.randomUUID) ? crypto.randomUUID()\n        : \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n            const r = (Math.random() * 16) | 0;\n            return (c === \"x\" ? r : (r & 3) | 8).toString(16);\n        });\n}\n// ---- peek blob\uFF1A\u5F3A KDF + AES-GCM\uFF08\u8FDB\u51FA\u90FD\u662F\u4E0D\u900F\u660E\u5B57\u8282\uFF1B\u7EAF WebCrypto\uFF0C\u96F6 codec\uFF09----\nconst _keyCache = new Map(); // `${password}\\x00${saltHex}` \u2192 CryptoKey\nfunction _hex(u8) { return [...u8].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\"); }\nasync function _deriveKey(password, salt) {\n    const cacheKey = `${password}\\x00${_hex(salt)}`;\n    const hit = _keyCache.get(cacheKey);\n    if (hit)\n        return hit;\n    const subtle = globalThis.crypto.subtle;\n    const base = await subtle.importKey(\"raw\", new TextEncoder().encode(password), \"PBKDF2\", false, [\"deriveKey\"]);\n    const key = await subtle.deriveKey({ name: \"PBKDF2\", hash: \"SHA-256\", salt: salt, iterations: PBKDF2_ITERS }, base, { name: \"AES-GCM\", length: 256 }, false, [\"encrypt\", \"decrypt\"]);\n    _keyCache.set(cacheKey, key);\n    return key;\n}\n/** \u4E0D\u900F\u660E\u5B57\u8282\uFF08\u53EF\u7A7A\uFF09\u2192 \u5B8C\u6574\u52A0\u5BC6 peek blob \u5B57\u8282\uFF08\u542B MAGIC \u5934\uFF09\u3002\u7A7A\u4E5F\u52A0\u5BC6\uFF08\u63A2\u6D4B\u6807\u8BB0\u5FC5\u987B\u5728\uFF09\u3002 */\nexport async function encryptPeek(bytes, password) {\n    const plain = bytes && bytes.length ? bytes : new Uint8Array(0);\n    const salt = new Uint8Array(16), iv = new Uint8Array(12);\n    globalThis.crypto.getRandomValues(salt);\n    globalThis.crypto.getRandomValues(iv);\n    const key = await _deriveKey(password, salt);\n    const ct = new Uint8Array(await globalThis.crypto.subtle.encrypt({ name: \"AES-GCM\", iv: iv }, key, plain));\n    const out = new Uint8Array(PEEK_HEADER_LEN + ct.length);\n    out.set(PEEK_MAGIC, 0);\n    out[8] = PEEK_VER;\n    out.set(salt, 9);\n    out.set(iv, 25);\n    new DataView(out.buffer).setUint32(37, ct.length, true);\n    out.set(ct, PEEK_HEADER_LEN);\n    return out;\n}\n/** \u4ECE\u5B57\u8282\u6D41**\u672B\u5C3E\u5411\u524D**\u626B\u52A0\u5BC6 peek blob\u3002\u5E26 sanity\uFF08ver/len/\u8FB9\u754C\uFF09\uFF0Cfalse-positive \u7EE7\u7EED\u5411\u524D\u3002\u627E\u4E0D\u5230\u8FD4 null\u3002 */\nexport function scanEncPeekFromEnd(u8) {\n    const n = u8.length;\n    outer: for (let i = n - PEEK_HEADER_LEN; i >= 0; i--) {\n        for (let k = 0; k < 8; k++)\n            if (u8[i + k] !== PEEK_MAGIC[k])\n                continue outer;\n        const ver = u8[i + 8];\n        if (ver !== PEEK_VER)\n            continue;\n        const len = new DataView(u8.buffer, u8.byteOffset + i + 37, 4).getUint32(0, true);\n        if (len < 16 || len > PEEK_MAX_LEN || i + PEEK_HEADER_LEN + len > n)\n            continue; // GCM tag \u81F3\u5C11 16B\n        return {\n            start: i,\n            end: i + PEEK_HEADER_LEN + len,\n            ver,\n            salt: u8.slice(i + 9, i + 25),\n            iv: u8.slice(i + 25, i + 37),\n            ct: u8.slice(i + PEEK_HEADER_LEN, i + PEEK_HEADER_LEN + len),\n        };\n    }\n    return null;\n}\n/** \u89E3\u5BC6 peek \u2192 \u4E0D\u900F\u660E\u5B57\u8282\uFF08\u53EF\u80FD\u4E3A\u7A7A\uFF09\u3002\u5BC6\u7801\u9519 \u2192 throw code=WRONG_PASSWORD\uFF08GCM tag \u5373\u9A8C\u8BC1\u5668\uFF09\u3002 */\nexport async function decryptPeek(parsed, password) {\n    const key = await _deriveKey(password, parsed.salt);\n    try {\n        return new Uint8Array(await globalThis.crypto.subtle.decrypt({ name: \"AES-GCM\", iv: parsed.iv }, key, parsed.ct));\n    }\n    catch {\n        const err = new Error(\"wrong password\");\n        err.code = \"WRONG_PASSWORD\";\n        throw err;\n    }\n}\nasync function _tailBytes(blobOrBytes, window = PEEK_TAIL_WINDOW) {\n    if (blobOrBytes instanceof Uint8Array) {\n        return blobOrBytes.length <= window ? blobOrBytes : blobOrBytes.slice(blobOrBytes.length - window);\n    }\n    const blob = blobOrBytes.slice(Math.max(0, blobOrBytes.size - window));\n    return new Uint8Array(await blob.arrayBuffer());\n}\n/** \u5DE5\u5382\u3002codec \u7F3A\u7701 null = \u53EA\u63A2\u6D4B\uFF1BreportError \u7F3A\u7701\u541E\u566C\u964D\u7EA7\u4E3A\u9759\u9ED8 false\uFF08\u63A2\u6D4B\u5BB9\u9519\u8DEF\u5F84\uFF09\uFF0C\u5EFA\u8BAE\u6CE8\u5165 app \u7684 funnel\u3002 */\nexport function createEncryption(opts = {}) {\n    const _codec = opts.codec ?? null;\n    const report = opts.reportError ?? (() => { });\n    const codec = () => {\n        if (!_codec)\n            throw new Error(\"encryption codec not configured (createEncryption({codec}) missing) \u2014 detection works, pack/unpack unavailable\");\n        return _codec;\n    };\n    async function looksEncryptedContainer(blobOrBytes) {\n        try {\n            const head = blobOrBytes instanceof Uint8Array ? blobOrBytes.slice(0, 6)\n                : new Uint8Array(await blobOrBytes.slice(0, 6).arrayBuffer());\n            if (_startsWith(head, SEVENZ_MAGIC))\n                return true; // \u88F8 .7z\n            return scanEncPeekFromEnd(await _tailBytes(blobOrBytes)) != null; // app \u5BB9\u5668\uFF08peek MAGIC\uFF09\n        }\n        catch (e) {\n            report(e);\n            return false;\n        }\n    }\n    async function packContainer({ dataBytes, fileName, ext = \"bin\", guid, peek = null, password }) {\n        if (!password)\n            throw new Error(\"cannot encrypt without a password\");\n        const metaJson = JSON.stringify({ v: 1, name: fileName || null, ext });\n        const payloadBytes = await codec().pack7z([\n            { path: \"data.bin\", data: dataBytes },\n            { path: \"meta.bin\", data: META_MAGIC + metaJson },\n        ], password);\n        const peekEnc = await encryptPeek(peek, password);\n        // peek \u5FC5\u987B\u6700\u540E\uFF08byte-range \u5C3E\u90E8\u4E00\u53D1\u547D\u4E2D + \u5BB9\u5668\u63A2\u6D4B\uFF09\uFF1B\u5916\u5C42\u5168 STORE\uFF08zipPack level:0\uFF09\n        return await codec().zipPack([\n            { path: guid || makeGuid(), data: payloadBytes },\n            { path: CONTAINER_PEEK_ENTRY, data: peekEnc },\n        ]);\n    }\n    function _pickData(inner) {\n        if (inner[\"data.bin\"])\n            return inner[\"data.bin\"];\n        const names = Object.keys(inner).filter((n) => n !== \"meta.bin\");\n        return names.length ? inner[names[0]] : null;\n    }\n    function _readMeta(inner) {\n        if (!inner[\"meta.bin\"])\n            return null;\n        try {\n            const text = new TextDecoder().decode(inner[\"meta.bin\"]);\n            if (text.startsWith(META_MAGIC))\n                return JSON.parse(text.slice(META_MAGIC.length));\n        }\n        catch (e) {\n            report(e); /* meta \u662F\u6062\u590D\u8F85\u52A9\u4EF6\uFF0C\u574F\u4E86\u4E0D\u963B\u65AD */\n        }\n        return null;\n    }\n    /** \u5411\u540E\u517C\u5BB9 + \u5BB9\u9519\uFF08\u8BE6\u5BB9\u5668\u683C\u5F0F\u5934\u6CE8\u91CA\uFF09\uFF1A\u5916\u58F3\u660E\u6587 zip \u2192 \u53D6 payload\uFF1B\u88F8 .7z/\u88F8 WinZip-AES \u2192 \u6574\u5757 unpack7z\u3002 */\n    async function unpackContainer(blob, password) {\n        const whole = blob instanceof Uint8Array ? blob : new Uint8Array(await blob.arrayBuffer());\n        let payload = null, guid = \"\";\n        if (_startsWith(whole, ZIP_MAGIC)) {\n            try {\n                const outer = await codec().zipUnpack(blob instanceof Blob ? blob : new Blob([whole]));\n                const g = Object.keys(outer).find((n) => !CONTAINER_PEEK_ENTRIES.includes(n)); // \u975E peek \u65C1\u8DEF = payload\n                if (g && outer[g] && (_startsWith(outer[g], SEVENZ_MAGIC) || _startsWith(outer[g], ZIP_MAGIC))) {\n                    payload = outer[g];\n                    guid = g;\n                }\n            }\n            catch (e) {\n                report(e); /* \u5916\u5C42 entries \u52A0\u5BC6\uFF08\u88F8 WinZip-AES\uFF09\u2192 payload \u7559 null\uFF0C\u6574\u5757\u89E3 */\n            }\n        }\n        const inner = await codec().unpack7z(payload ?? whole, password);\n        const data = _pickData(inner);\n        if (!data)\n            throw new Error(\"encrypted container has no readable payload\");\n        return { dataBlob: new Blob([data], { type: \"application/zip\" }), meta: _readMeta(inner), guid };\n    }\n    return {\n        looksEncryptedContainer,\n        isEncryptedPeekBlob: (b) => !!b && b.type === ENC_PEEK_MIME,\n        scanEncPeekFromEnd,\n        encryptPeek,\n        decryptPeek,\n        packContainer,\n        unpackContainer,\n        isEncryptedBlob: (b) => looksEncryptedContainer(b),\n        async tryDecryptEncryptedBlob(blob, pw) {\n            if (!pw)\n                return null;\n            if (!(await looksEncryptedContainer(blob)))\n                return null;\n            try {\n                return (await unpackContainer(blob, pw)).dataBlob;\n            }\n            catch {\n                return null;\n            }\n        },\n        PEEK_TAIL_WINDOW,\n        ENC_PEEK_MIME,\n        CONTAINER_PEEK_ENTRIES,\n    };\n}\n", "// encryption \u5668\u5B98 \u2014\u2014 app \u7684\u5185\u5BB9\u52A0\u5BC6\u5355\u4F8B\uFF08@internal/encryption \u5B9E\u4F8B\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\n// MoonSinger \u8FD9\u4E00\u7248**\u4E0D\u52A0\u5BC6**\uFF1A\u4F20\u96F6 codec \u7684 createEncryption()\uFF08\u63A2\u6D4B\u7167\u5E38\u3001pack / unpack \u54CD\u4EAE\u629B\uFF09\u2014\u2014store 0.7.0 \u8D77 encryption \u662F\u5FC5\u586B\u8868\u6001\uFF0C\n//   \u6CA1\u6709 dormant \u66FF\u8EAB\u3002\u4EE5\u540E\u8981\u52A0\u5BC6\u518D vendor zip.js + 7z-wasm \u7167 WXHW \u63A5 codec\u3002\n// \u8FD9\u662F @internal/encryption \u5728\u672C\u4ED3\u7684**\u552F\u4E00\u503C\u7EA7 import \u70B9**\uFF08test/redline-guard.test.mjs \u5B88\u7740\uFF09\u3002\nimport { createEncryption } from \"@internal/encryption\";\n\nexport const appEncryption = createEncryption();\n", "// app-store.ts \u2014\u2014 @internal/store \u5728\u672C\u4ED3\u7684**\u552F\u4E00\u503C\u7EA7 import \u70B9**\uFF08\u63A5\u7F1D\uFF1Btest/redline-guard.test.mjs + scripts/build.sh \u5B88\u7740\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\n//   \u7167 WebXiaoHeiWu src/app-store.ts\uFF080.16.1 \u5F62\uFF09\u3002\u5BB6\u89C4\uFF1AOneDrive \u53EA\u8981 AppFolder\u3001\u53EA\u8BA4 personal \u8D26\u53F7\uFF08../CLAUDE.md \u786C\u89C4\u5219 #6 / #7\uFF09\uFF1B\n//   \u8EAB\u4EFD / \u5B57\u8282 / \u4E91\u8BBF\u95EE\u5168\u8D70\u5E93\uFF0Capp \u5C42\u4E0D\u78B0 localStorage / IDB / MSAL / Graph\uFF08device \u5C42\u6807\u91CF\u8D70 src/device-kv.ts\uFF09\u3002\n//   store **\u61D2\u5EFA**\uFF08attachStore\uFF09\uFF1A\u6CA1\u8FDB\u8FC7\u6B4C\u5E93\u7684\u8BBE\u5907 = \u65E0\u5730\u6A21\u5F0F\uFF08v0.3.0\uFF09\uFF0C\u4E0D\u5F00 IDB\u3001\u4E0D\u8F7D MSAL\uFF08user 2026-10-01\u300C\u7528\u6237\u6709\u610F\u56FE\u624D\u5F04\u300D\uFF09\uFF1B\n//   \u8FDB\u8FC7\u4E00\u6B21\uFF08device-kv storeAttached\uFF09\u4EE5\u540E\u5F00\u5C40\u5C31\u5EFA\uFF0C\u4E14**\u5148\u5EFA store \u518D initAuth**\uFF08CatsUp 2026-09-22 \u6559\u8BAD\uFF1A\u6CA1\u5EFA store \u65F6\u5E93\u7684\u62A5\u9519\u662F no-op\uFF0C\u767B\u5F55\u56DE\u8DF3\u5931\u8D25\u4EBA\u770B\u4E0D\u5230\uFF09\u3002\nimport { createStore, createOneDriveProvider, requestStoragePersistence, isCached, isDirty, withStemTail, wipeAppNamespace, scanAppNamespace, WipeConsentError } from \"@internal/store\";\nimport type { Store, OneDriveAuth, CloudProvider } from \"@internal/store\";\nimport { APP_ID, CLIENT_ID, AUTHORITY, SCOPES, MSAL_URL } from \"./config.ts\";\nimport { DOC_KINDS } from \"./identifiers.ts\";\nimport { storeUI } from \"./store-ui.ts\";\nimport { appEncryption } from \"./encryption.ts\";\nimport { deviceKvGet, deviceKvSet } from \"./device-kv.ts\";\n\nconst od = createOneDriveProvider({ clientId: CLIENT_ID, scopes: SCOPES, authority: AUTHORITY, msalUrl: MSAL_URL });\n/** OneDrive \u767B\u5F55\u6001\uFF08initAuth / signIn / signOut / onAuthChanged\uFF09\u3002MSAL \u811A\u672C\u5728 initAuth \u65F6\u624D\u8F7D\u3002 */\nexport const auth: OneDriveAuth = od.auth;\n\nlet _activeIdentifier: string | null = null;\n/** \u5F53\u524D\u6253\u5F00\u7684\u6B4C\u7684\u8EAB\u4EFD\uFF08cloud-gone \u53BB\u6296\u7EDD\u4E0D\u52A8\u5B83\uFF09\u3002 */\nexport function setActiveIdentifier(id: string | null): void { _activeIdentifier = id; }\n\nconst KV_ATTACHED = \"storeAttached\";\n/** \u8FD9\u53F0\u8BBE\u5907\u8FDB\u8FC7\u6B4C\u5E93\u6CA1\u6709\uFF08\u8FDB\u8FC7 = \u4EE5\u540E\u5F00\u5C40\u5C31\u5EFA store\uFF09\u3002 */\nexport const storeWasAttached = (): boolean => deviceKvGet(KV_ATTACHED) === \"1\";\n\nlet _store: Store | null = null, _signedIn: () => boolean = () => od.auth.isSignedIn();\n/** \u767B\u5F55\u7740\u6CA1\u6709\uFF08= store \u7684 signedIn \u8868\u6001\uFF1BE2E \u7684 mock \u4E91\u4E0B = \u9875\u9762\u5168\u5C40 `__moonsingerCloudSignedIn`\uFF0Creload \u540E\u56DE\u5230\u672A\u767B\u5F55\u3001\u548C\u771F\u673A initAuth \u4E4B\u524D\u4E00\u6837\uFF09\u3002app \u5C42\u4E00\u5F8B\u95EE\u8FD9\u4E2A\uFF0C\u522B\u76F4\u63A5\u95EE auth\u3002 */\nexport const isSignedIn = (): boolean => _signedIn();\n/** \u53EA\u7ED9 E2E\uFF08test/e2e/sync.mjs\uFF09\uFF1A\u9875\u9762\u5F00\u5C40\u524D\uFF08addInitScript\uFF09\u585E\u4E00\u6735 mock \u4E91\u2014\u2014@internal/store/testing \u7684 provider \u4F4F node \u4FA7\u3001\u7ECF RPC \u6865\u8FDB\u9875\u9762\uFF0C\n *  reload / \u4E24\u4E2A\u6D4F\u89C8\u5668 context\uFF08= \u4E24\u53F0\u8BBE\u5907\uFF09\u5171\u7528\u540C\u4E00\u6735\u4E91\u3002**\u53EA\u5728\u672C\u673A\u5730\u5740\u4E0A\u8BA4**\uFF08127.0.0.1 / localhost\uFF09\uFF0C\u7EBF\u4E0A\u9875\u9762\u8FD9\u6761\u8DEF\u4E0D\u5B58\u5728\u3002 */\nfunction injectedCloud(): CloudProvider | null {\n  const g = globalThis as { __moonsingerCloud?: CloudProvider; location?: { hostname: string } };\n  return g.__moonsingerCloud && /^(127\\.0\\.0\\.1|localhost)$/.test(g.location?.hostname ?? \"\") ? g.__moonsingerCloud : null;\n}\n/** \u5EFA store\uFF08\u5E42\u7B49\uFF09\u3002\u7B2C\u4E00\u6B21\u8981\u5728\u7528\u6237\u624B\u52BF\u91CC\u8C03\uFF08attach \u7684\u65F6\u5019\u987A\u4FBF requestStoragePersistence\uFF09\u3002 */\nexport function attachStore(): Store {\n  if (_store) return _store;\n  const inj = injectedCloud();\n  if (inj) _signedIn = () => (globalThis as { __moonsingerCloudSignedIn?: boolean }).__moonsingerCloudSignedIn === true;\n  _store = createStore({\n    provider: inj ?? od.provider,\n    ui: storeUI,\n    appId: APP_ID,\n    persistence: \"app-managed\",          // app \u5728\u8FDB\u6B4C\u5E93 / \u9996\u5B58\u7684\u624B\u52BF\u91CC\u8C03 requestStoragePersistence()\n    encryption: appEncryption,           // \u96F6 codec\uFF08\u4E0D\u52A0\u5BC6\uFF09\uFF1Bstore 0.7.0 \u8D77\u5FC5\u586B\u8868\u6001\n    reconcilePolicy: \"app-driven\",       // \u56FE\u5E93\u5305\u7684\u8F6E\u8BE2 / focus \u5BF9\u9F50\u5F52 app\n    // \u91C7\u7EB3\u4E91\u7AEF\u5B57\u8282\u524D\u7684\u6709\u6548\u6027\u95F8\uFF1A\u4E00\u9996\u6B4C = \u4E00\u4E2A .mxl = zip\uFF08PK\\x03\\x04\uFF09\u3002captive portal \u7684 200 HTML \u6C38\u8FDC\u4E0D\u8BB8\u76D6\u6389\u672C\u5730\u552F\u4E00\u597D\u526F\u672C\u3002\n    validateAdopt: async (plain) => { if (plain.size < 22) return false; const h = new Uint8Array(await plain.slice(0, 4).arrayBuffer()); return h[0] === 0x50 && h[1] === 0x4b && h[2] === 0x03 && h[3] === 0x04; },\n    docKinds: DOC_KINDS,\n    autoCacheOpenedFile: true,           // \u7F16\u8F91\u5668\uFF1A\u6253\u5F00\u5C31\u7559\u672C\u5730\uFF08\u79BB\u7EBF\u80FD\u5F00\uFF09\n    offlineUploadReplay: \"auto\",         // \u79BB\u7EBF\u65B0\u5EFA\u7684\u6B4C\u56DE\u7EBF\u81EA\u52A8\u8865\u63A8\uFF08ADR-0018\uFF1B\u8FDB\u5EA6\u8D70 storeUI.onReplayStatus\uFF09\n    signedIn: () => _signedIn(),\n    activeIdentifier: () => _activeIdentifier,\n  });\n  deviceKvSet(KV_ATTACHED, \"1\");\n  return _store;\n}\nexport const hasStore = (): boolean => _store != null;\n/** \u62FF store\uFF1B\u6CA1\u5EFA\u5C31\u629B\uFF08\u8C03\u7528\u65B9\u5148 attachStore\uFF09\u3002 */\nexport function requireStore(): Store {\n  if (!_store) throw new Error(\"store not attached yet (call attachStore() first)\");\n  return _store;\n}\nexport async function disposeStore(): Promise<void> { const s = _store; _store = null; if (s) await s.dispose(); }\n/** \u62C6\u5E93\uFF08\u9000\u51FA\u767B\u5F55\u65F6\uFF0C\u540C WeebPaint\u300C\u4E3B\u52A8\u65AD\u5F00 = \u5378\u5E93 + \u9000\u51FA\u767B\u5F55\u300D\uFF09\uFF1A\u653E\u6389 store \u5BF9\u8C61 + \u8FD9\u53F0\u8BBE\u5907\u4E0D\u518D\u5F00\u5C40\u5C31\u5EFA store\u3002**IDB \u91CC\u7684\u6B4C\u4E0D\u5220**\u2014\u2014\u518D\u8FDB\u6B4C\u5E93 attachStore \u5C31\u63A5\u4E0A\u3002 */\nexport async function detachStore(): Promise<void> { await disposeStore(); deviceKvSet(KV_ATTACHED, null); }\n\nexport { requestStoragePersistence, isCached, isDirty, withStemTail };\n/** \u8FD8\u539F\u51FA\u5382\uFF08src/app/factory-reset.ts\uFF09\u7528\u7684\u5E93\u53E3\u5B50\uFF1A\u6DF1\u6E05\u672C appId \u7684\u5168\u90E8\u547D\u540D\u7A7A\u95F4 / \u65E0\u75D5\u626B\u6B8B\u7559\uFF08\u540C WeebPaint\uFF1Amaintenance \u9762\u7ECF\u63A5\u7F1D\uFF09\u30022026-10-21 */\nexport { wipeAppNamespace, scanAppNamespace, WipeConsentError };\nexport type { Store, OneDriveAuth };\n", "/**\n* vue v3.5.35\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/let e,t,n,r,i,l,s,o,a,c,u,d,p;function h(e){let t=Object.create(null);for(let n of e.split(\",\"))t[n]=1;return e=>e in t}let f={},g=[],m=()=>{},y=()=>!1,b=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||97>e.charCodeAt(2)),_=e=>e.startsWith(\"onUpdate:\"),S=Object.assign,x=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},C=Object.prototype.hasOwnProperty,k=(e,t)=>C.call(e,t),T=Array.isArray,w=e=>\"function\"==typeof e,N=e=>\"string\"==typeof e,A=e=>\"symbol\"==typeof e,E=e=>null!==e&&\"object\"==typeof e,R=e=>(E(e)||w(e))&&w(e.then)&&w(e.catch),I=Object.prototype.toString,O=e=>N(e)&&\"NaN\"!==e&&\"-\"!==e[0]&&\"\"+parseInt(e,10)===e,P=h(\",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"),M=h(\"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"),D=e=>{let t=Object.create(null);return n=>t[n]||(t[n]=e(n))},F=/-\\w/g,L=D(e=>e.replace(F,e=>e.slice(1).toUpperCase())),$=/\\B([A-Z])/g,V=D(e=>e.replace($,\"-$1\").toLowerCase()),B=D(e=>e.charAt(0).toUpperCase()+e.slice(1)),j=D(e=>e?`on${B(e)}`:\"\"),U=(e,t)=>!Object.is(e,t),H=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},q=(e,t,n,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},W=e=>{let t=parseFloat(e);return isNaN(t)?e:t},K=e=>{let t=N(e)?Number(e):NaN;return isNaN(t)?e:t},z=()=>e||(e=\"u\">typeof globalThis?globalThis:\"u\">typeof self?self:\"u\">typeof window?window:\"u\">typeof global?global:{}),J=h(\"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\");function G(e){if(T(e)){let t={};for(let n=0;n<e.length;n++){let r=e[n],i=N(r)?Y(r):G(r);if(i)for(let e in i)t[e]=i[e]}return t}if(N(e)||E(e))return e}let X=/;(?![^(]*\\))/g,Q=/:([^]+)/,Z=/\\/\\*[^]*?\\*\\//g;function Y(e){let t={};return e.replace(Z,\"\").split(X).forEach(e=>{if(e){let n=e.split(Q);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function ee(e){let t=\"\";if(N(e))t=e;else if(T(e))for(let n=0;n<e.length;n++){let r=ee(e[n]);r&&(t+=r+\" \")}else if(E(e))for(let n in e)e[n]&&(t+=n+\" \");return t.trim()}function et(e){if(!e)return null;let{class:t,style:n}=e;return t&&!N(t)&&(e.class=ee(t)),n&&(e.style=G(n)),e}let en=h(\"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\"),er=h(\"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\"),ei=h(\"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\"),el=h(\"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\"),es=h(\"itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly\");function eo(e,t){let n,r;if(e===t)return!0;let i=\"[object Date]\"===(n=e,I.call(n)),l=\"[object Date]\"===(r=t,I.call(r));if(i||l)return!!i&&!!l&&e.getTime()===t.getTime();if(i=A(e),l=A(t),i||l)return e===t;if(i=T(e),l=T(t),i||l)return!!i&&!!l&&function(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=eo(e[r],t[r]);return n}(e,t);if(i=E(e),l=E(t),i||l){if(!i||!l||Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e){let r=e.hasOwnProperty(n),i=t.hasOwnProperty(n);if(r&&!i||!r&&i||!eo(e[n],t[n]))return!1}}return String(e)===String(t)}function ea(e,t){return e.findIndex(e=>eo(e,t))}let ec=e=>!!(e&&!0===e.__v_isRef),eu=e=>N(e)?e:null==e?\"\":T(e)||E(e)&&(e.toString===I||!w(e.toString))?ec(e)?eu(e.value):JSON.stringify(e,ed,2):String(e),ed=(e,t)=>{let n;if(ec(t))return ed(e,t.value);if(\"[object Map]\"===(n=t,I.call(n)))return{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[ep(t,r)+\" =>\"]=n,e),{})};{let e;if(\"[object Set]\"===(e=t,I.call(e)))return{[`Set(${t.size})`]:[...t.values()].map(e=>ep(e))};else{if(A(t))return ep(t);let e;if(E(t)&&!T(t)&&\"[object Object]\"!==(e=t,I.call(e)))return String(t)}}return t},ep=(e,t=\"\")=>{var n;return A(e)?`Symbol(${null!=(n=e.description)?n:t})`:e};class eh{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&t&&(t.active?(this.parent=t,this.index=(t.scopes||(t.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){let e,t;if(this._isPaused=!0,this.scopes)for(e=0,t=this.scopes.length;e<t;e++)this.scopes[e].pause();for(e=0,t=this.effects.length;e<t;e++)this.effects[e].pause()}}resume(){if(this._active&&this._isPaused){let e,t;if(this._isPaused=!1,this.scopes)for(e=0,t=this.scopes.length;e<t;e++)this.scopes[e].resume();for(e=0,t=this.effects.length;e<t;e++)this.effects[e].resume()}}run(e){if(this._active){let n=t;try{return t=this,e()}finally{t=n}}}on(){1==++this._on&&(this.prevScope=t,t=this)}off(){if(this._on>0&&0==--this._on){if(t===this)t=this.prevScope;else{let e=t;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){let t,n;for(this._active=!1,t=0,n=this.effects.length;t<n;t++)this.effects[t].stop();for(this.effects.length=0,t=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.cleanups.length=0,this.scopes){for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!e){let e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.parent=void 0}}}function ef(e){return new eh(e)}function eg(){return t}function em(e,n=!1){t&&t.cleanups.push(e)}let ev=new WeakSet;class ey{constructor(e){this.fn=e,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,t&&(t.active?t.effects.push(this):this.flags&=-2)}pause(){this.flags|=64}resume(){64&this.flags&&(this.flags&=-65,ev.has(this)&&(ev.delete(this),this.trigger()))}notify(){(!(2&this.flags)||32&this.flags)&&(8&this.flags||e_(this))}run(){if(!(1&this.flags))return this.fn();this.flags|=2,eP(this),ex(this);let e=n,t=eE;n=this,eE=!0;try{return this.fn()}finally{eC(this),n=e,eE=t,this.flags&=-3}}stop(){if(1&this.flags){for(let e=this.deps;e;e=e.nextDep)ew(e);this.deps=this.depsTail=void 0,eP(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){64&this.flags?ev.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){ek(this)&&this.run()}get dirty(){return ek(this)}}let eb=0;function e_(e,t=!1){if(e.flags|=8,t){e.next=i,i=e;return}e.next=r,r=e}function eS(){let e;if(!(--eb>0)){if(i){let e=i;for(i=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}for(;r;){let t=r;for(r=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,1&t.flags)try{t.trigger()}catch(t){e||(e=t)}t=n}}if(e)throw e}}function ex(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function eC(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;-1===r.version?(r===n&&(n=e),ew(r),function(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function ek(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(eT(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function eT(e){if(4&e.flags&&!(16&e.flags)||(e.flags&=-17,e.globalVersion===eM)||(e.globalVersion=eM,!e.isSSR&&128&e.flags&&(!e.deps&&!e._dirty||!ek(e))))return;e.flags|=2;let t=e.dep,r=n,i=eE;n=e,eE=!0;try{ex(e);let n=e.fn(e._value);(0===t.version||U(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{n=r,eE=i,eC(e),e.flags&=-3}}function ew(e,t=!1){let{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)ew(e,!0)}t||--n.sc||!n.map||n.map.delete(n.key)}function eN(e,t){e.effect instanceof ey&&(e=e.effect.fn);let n=new ey(e);t&&S(n,t);try{n.run()}catch(e){throw n.stop(),e}let r=n.run.bind(n);return r.effect=n,r}function eA(e){e.effect.stop()}let eE=!0,eR=[];function eI(){eR.push(eE),eE=!1}function eO(){let e=eR.pop();eE=void 0===e||e}function eP(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=n;n=void 0;try{t()}finally{n=e}}}let eM=0;class eD{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class eF{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!n||!eE||n===this.computed)return;let t=this.activeLink;if(void 0===t||t.sub!==n)t=this.activeLink=new eD(n,this),n.deps?(t.prevDep=n.depsTail,n.depsTail.nextDep=t,n.depsTail=t):n.deps=n.depsTail=t,function e(t){if(t.dep.sc++,4&t.sub.flags){let n=t.dep.computed;if(n&&!t.dep.subs){n.flags|=20;for(let t=n.deps;t;t=t.nextDep)e(t)}let r=t.dep.subs;r!==t&&(t.prevSub=r,r&&(r.nextSub=t)),t.dep.subs=t}}(t);else if(-1===t.version&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=n.depsTail,t.nextDep=void 0,n.depsTail.nextDep=t,n.depsTail=t,n.deps===t&&(n.deps=e)}return t}trigger(e){this.version++,eM++,this.notify(e)}notify(e){eb++;try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{eS()}}}let eL=new WeakMap,e$=Symbol(\"\"),eV=Symbol(\"\"),eB=Symbol(\"\");function ej(e,t,r){if(eE&&n){let t=eL.get(e);t||eL.set(e,t=new Map);let n=t.get(r);n||(t.set(r,n=new eF),n.map=t,n.key=r),n.track()}}function eU(e,t,n,r,i,l){let s=eL.get(e);if(!s)return void eM++;let o=e=>{e&&e.trigger()};if(eb++,\"clear\"===t)s.forEach(o);else{let i=T(e),l=i&&O(n);if(i&&\"length\"===n){let e=Number(r);s.forEach((t,n)=>{(\"length\"===n||n===eB||!A(n)&&n>=e)&&o(t)})}else switch((void 0!==n||s.has(void 0))&&o(s.get(n)),l&&o(s.get(eB)),t){case\"add\":if(i)l&&o(s.get(\"length\"));else{let t;o(s.get(e$));\"[object Map]\"===(t=e,I.call(t))&&o(s.get(eV))}break;case\"delete\":if(!i){let t;o(s.get(e$));\"[object Map]\"===(t=e,I.call(t))&&o(s.get(eV))}break;case\"set\":let a;\"[object Map]\"===(a=e,I.call(a))&&o(s.get(e$))}}eS()}function eH(e){let t=tb(e);return t===e?t:(ej(t,\"iterate\",eB),tv(e)?t:t.map(tS))}function eq(e){return ej(e=tb(e),\"iterate\",eB),e}function eW(e,t){return tm(e)?tg(e)?tx(tS(t)):tx(t):tS(t)}let eK={__proto__:null,[Symbol.iterator](){return ez(this,Symbol.iterator,e=>eW(this,e))},concat(...e){return eH(this).concat(...e.map(e=>T(e)?eH(e):e))},entries(){return ez(this,\"entries\",e=>(e[1]=eW(this,e[1]),e))},every(e,t){return eG(this,\"every\",e,t,void 0,arguments)},filter(e,t){return eG(this,\"filter\",e,t,e=>e.map(e=>eW(this,e)),arguments)},find(e,t){return eG(this,\"find\",e,t,e=>eW(this,e),arguments)},findIndex(e,t){return eG(this,\"findIndex\",e,t,void 0,arguments)},findLast(e,t){return eG(this,\"findLast\",e,t,e=>eW(this,e),arguments)},findLastIndex(e,t){return eG(this,\"findLastIndex\",e,t,void 0,arguments)},forEach(e,t){return eG(this,\"forEach\",e,t,void 0,arguments)},includes(...e){return eQ(this,\"includes\",e)},indexOf(...e){return eQ(this,\"indexOf\",e)},join(e){return eH(this).join(e)},lastIndexOf(...e){return eQ(this,\"lastIndexOf\",e)},map(e,t){return eG(this,\"map\",e,t,void 0,arguments)},pop(){return eZ(this,\"pop\")},push(...e){return eZ(this,\"push\",e)},reduce(e,...t){return eX(this,\"reduce\",e,t)},reduceRight(e,...t){return eX(this,\"reduceRight\",e,t)},shift(){return eZ(this,\"shift\")},some(e,t){return eG(this,\"some\",e,t,void 0,arguments)},splice(...e){return eZ(this,\"splice\",e)},toReversed(){return eH(this).toReversed()},toSorted(e){return eH(this).toSorted(e)},toSpliced(...e){return eH(this).toSpliced(...e)},unshift(...e){return eZ(this,\"unshift\",e)},values(){return ez(this,\"values\",e=>eW(this,e))}};function ez(e,t,n){let r=eq(e),i=r[t]();return r===e||tv(e)||(i._next=i.next,i.next=()=>{let e=i._next();return e.done||(e.value=n(e.value)),e}),i}let eJ=Array.prototype;function eG(e,t,n,r,i,l){let s=eq(e),o=s!==e&&!tv(e),a=s[t];if(a!==eJ[t]){let t=a.apply(e,l);return o?tS(t):t}let c=n;s!==e&&(o?c=function(t,r){return n.call(this,eW(e,t),r,e)}:n.length>2&&(c=function(t,r){return n.call(this,t,r,e)}));let u=a.call(s,c,r);return o&&i?i(u):u}function eX(e,t,n,r){let i=eq(e),l=i!==e&&!tv(e),s=n,o=!1;i!==e&&(l?(o=0===r.length,s=function(t,r,i){return o&&(o=!1,t=eW(e,t)),n.call(this,t,eW(e,r),i,e)}):n.length>3&&(s=function(t,r,i){return n.call(this,t,r,i,e)}));let a=i[t](s,...r);return o?eW(e,a):a}function eQ(e,t,n){let r=tb(e);ej(r,\"iterate\",eB);let i=r[t](...n);return(-1===i||!1===i)&&ty(n[0])?(n[0]=tb(n[0]),r[t](...n)):i}function eZ(e,t,n=[]){eI(),eb++;let r=tb(e)[t].apply(e,n);return eS(),eO(),r}let eY=h(\"__proto__,__v_isRef,__isVue\"),e0=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>\"arguments\"!==e&&\"caller\"!==e).map(e=>Symbol[e]).filter(A));function e1(e){A(e)||(e=String(e));let t=tb(this);return ej(t,\"has\",e),t.hasOwnProperty(e)}class e2{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if(\"__v_skip\"===t)return e.__v_skip;let r=this._isReadonly,i=this._isShallow;if(\"__v_isReactive\"===t)return!r;if(\"__v_isReadonly\"===t)return r;if(\"__v_isShallow\"===t)return i;if(\"__v_raw\"===t)return n===(r?i?tc:ta:i?to:ts).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let l=T(e);if(!r){let e;if(l&&(e=eK[t]))return e;if(\"hasOwnProperty\"===t)return e1}let s=Reflect.get(e,t,tC(e)?e:n);if((A(t)?e0.has(t):eY(t))||(r||ej(e,\"get\",t),i))return s;if(tC(s)){let e=l&&O(t)?s:s.value;return r&&E(e)?tp(e):e}return E(s)?r?tp(s):tu(s):s}}class e6 extends e2{constructor(e=!1){super(!1,e)}set(e,t,n,r){let i=e[t],l=T(e)&&O(t);if(!this._isShallow){let e=tm(i);if(tv(n)||tm(n)||(i=tb(i),n=tb(n)),!l&&tC(i)&&!tC(n))if(e)return!0;else return i.value=n,!0}let s=l?Number(t)<e.length:k(e,t),o=Reflect.set(e,t,n,tC(e)?e:r);return e===tb(r)&&(s?U(n,i)&&eU(e,\"set\",t,n):eU(e,\"add\",t,n)),o}deleteProperty(e,t){let n=k(e,t);e[t];let r=Reflect.deleteProperty(e,t);return r&&n&&eU(e,\"delete\",t,void 0),r}has(e,t){let n=Reflect.has(e,t);return A(t)&&e0.has(t)||ej(e,\"has\",t),n}ownKeys(e){return ej(e,\"iterate\",T(e)?\"length\":e$),Reflect.ownKeys(e)}}class e3 extends e2{constructor(e=!1){super(!0,e)}set(e,t){return!0}deleteProperty(e,t){return!0}}let e4=new e6,e8=new e3,e5=new e6(!0),e9=new e3(!0),e7=e=>e;function te(e){return function(){return\"delete\"!==e&&(\"clear\"===e?void 0:this)}}function tt(e,t){let n,r=(S(n={get(n){let r=this.__v_raw,i=tb(r),l=tb(n);e||(U(n,l)&&ej(i,\"get\",n),ej(i,\"get\",l));let{has:s}=Reflect.getPrototypeOf(i),o=t?e7:e?tx:tS;return s.call(i,n)?o(r.get(n)):s.call(i,l)?o(r.get(l)):void(r!==i&&r.get(n))},get size(){let t=this.__v_raw;return e||ej(tb(t),\"iterate\",e$),t.size},has(t){let n=this.__v_raw,r=tb(n),i=tb(t);return e||(U(t,i)&&ej(r,\"has\",t),ej(r,\"has\",i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,r){let i=this,l=i.__v_raw,s=tb(l),o=t?e7:e?tx:tS;return e||ej(s,\"iterate\",e$),l.forEach((e,t)=>n.call(r,o(e),o(t),i))}},e?{add:te(\"add\"),set:te(\"set\"),delete:te(\"delete\"),clear:te(\"clear\")}:{add(e){let n=tb(this),r=Reflect.getPrototypeOf(n),i=tb(e),l=t||tv(e)||tm(e)?e:i;return r.has.call(n,l)||U(e,l)&&r.has.call(n,e)||U(i,l)&&r.has.call(n,i)||(n.add(l),eU(n,\"add\",l,l)),this},set(e,n){t||tv(n)||tm(n)||(n=tb(n));let r=tb(this),{has:i,get:l}=Reflect.getPrototypeOf(r),s=i.call(r,e);s||(e=tb(e),s=i.call(r,e));let o=l.call(r,e);return r.set(e,n),s?U(n,o)&&eU(r,\"set\",e,n):eU(r,\"add\",e,n),this},delete(e){let t=tb(this),{has:n,get:r}=Reflect.getPrototypeOf(t),i=n.call(t,e);i||(e=tb(e),i=n.call(t,e)),r&&r.call(t,e);let l=t.delete(e);return i&&eU(t,\"delete\",e,void 0),l},clear(){let e=tb(this),t=0!==e.size,n=e.clear();return t&&eU(e,\"clear\",void 0,void 0),n}}),[\"keys\",\"values\",\"entries\",Symbol.iterator].forEach(r=>{n[r]=function(...n){let i,l=this.__v_raw,s=tb(l),o=\"[object Map]\"===(i=s,I.call(i)),a=\"entries\"===r||r===Symbol.iterator&&o,c=l[r](...n),u=t?e7:e?tx:tS;return e||ej(s,\"iterate\",\"keys\"===r&&o?eV:e$),S(Object.create(c),{next(){let{value:e,done:t}=c.next();return t?{value:e,done:t}:{value:a?[u(e[0]),u(e[1])]:u(e),done:t}}})}}),n);return(t,n,i)=>\"__v_isReactive\"===n?!e:\"__v_isReadonly\"===n?e:\"__v_raw\"===n?t:Reflect.get(k(r,n)&&n in t?r:t,n,i)}let tn={get:tt(!1,!1)},tr={get:tt(!1,!0)},ti={get:tt(!0,!1)},tl={get:tt(!0,!0)},ts=new WeakMap,to=new WeakMap,ta=new WeakMap,tc=new WeakMap;function tu(e){return tm(e)?e:tf(e,!1,e4,tn,ts)}function td(e){return tf(e,!1,e5,tr,to)}function tp(e){return tf(e,!0,e8,ti,ta)}function th(e){return tf(e,!0,e9,tl,tc)}function tf(e,t,n,r,i){let l;if(!E(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let s=i.get(e);if(s)return s;let o=function(e){switch(e){case\"Object\":case\"Array\":return 1;case\"Map\":case\"Set\":case\"WeakMap\":case\"WeakSet\":return 2;default:return 0}}((l=e,I.call(l)).slice(8,-1));if(0===o)return e;let a=new Proxy(e,2===o?r:n);return i.set(e,a),a}function tg(e){return tm(e)?tg(e.__v_raw):!!(e&&e.__v_isReactive)}function tm(e){return!!(e&&e.__v_isReadonly)}function tv(e){return!!(e&&e.__v_isShallow)}function ty(e){return!!e&&!!e.__v_raw}function tb(e){let t=e&&e.__v_raw;return t?tb(t):e}function t_(e){return!k(e,\"__v_skip\")&&Object.isExtensible(e)&&q(e,\"__v_skip\",!0),e}let tS=e=>E(e)?tu(e):e,tx=e=>E(e)?tp(e):e;function tC(e){return!!e&&!0===e.__v_isRef}function tk(e){return tw(e,!1)}function tT(e){return tw(e,!0)}function tw(e,t){return tC(e)?e:new tN(e,t)}class tN{constructor(e,t){this.dep=new eF,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:tb(e),this._value=t?e:tS(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||tv(e)||tm(e);U(e=n?e:tb(e),t)&&(this._rawValue=e,this._value=n?e:tS(e),this.dep.trigger())}}function tA(e){e.dep&&e.dep.trigger()}function tE(e){return tC(e)?e.value:e}function tR(e){return w(e)?e():tE(e)}let tI={get:(e,t,n)=>\"__v_raw\"===t?e:tE(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return tC(i)&&!tC(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function tO(e){return tg(e)?e:new Proxy(e,tI)}class tP{constructor(e){this.__v_isRef=!0,this._value=void 0;let t=this.dep=new eF,{get:n,set:r}=e(t.track.bind(t),t.trigger.bind(t));this._get=n,this._set=r}get value(){return this._value=this._get()}set value(e){this._set(e)}}function tM(e){return new tP(e)}function tD(e){let t=T(e)?Array(e.length):{};for(let n in e)t[n]=new tF(e,n,void 0);return t}class tF{constructor(e,t,n){this._object=e,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=A(t)?t:String(t),this._raw=tb(e);let r=!0,i=e;if(!T(e)||A(this._key)||!O(this._key))do r=!ty(i)||tv(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let e=this._object[this._key];return this._shallow&&(e=tE(e)),this._value=void 0===e?this._defaultValue:e}set value(e){if(this._shallow&&tC(this._raw[this._key])){let t=this._object[this._key];if(tC(t)){t.value=e;return}}this._object[this._key]=e}get dep(){var e,t;let n;return e=this._raw,t=this._key,(n=eL.get(e))&&n.get(t)}}class tL{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function t$(e,t,n){if(tC(e))return e;if(w(e))return new tL(e);if(!E(e)||!(arguments.length>1))return tk(e);return new tF(e,t,n)}class tV{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new eF(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=eM-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(8&this.flags)&&n!==this)return e_(this,!0),!0}get value(){let e=this.dep.track();return eT(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}}let tB={GET:\"get\",HAS:\"has\",ITERATE:\"iterate\"},tj={SET:\"set\",ADD:\"add\",DELETE:\"delete\",CLEAR:\"clear\"},tU={},tH=new WeakMap;function tq(){return d}function tW(e,t=!1,n=d){if(n){let t=tH.get(n);t||tH.set(n,t=[]),t.push(e)}}function tK(e,t=1/0,n){if(t<=0||!E(e)||e.__v_skip||((n=n||new Map).get(e)||0)>=t)return e;if(n.set(e,t),t--,tC(e))tK(e.value,t,n);else if(T(e))for(let r=0;r<e.length;r++)tK(e[r],t,n);else{let r,i;if(\"[object Set]\"===(r=e,I.call(r))||\"[object Map]\"===(i=e,I.call(i)))e.forEach(e=>{tK(e,t,n)});else{let r;if(\"[object Object]\"===(r=e,I.call(r))){for(let r in e)tK(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&tK(e[r],t,n)}}}return e}function tz(e,t){}let tJ={SETUP_FUNCTION:0,0:\"SETUP_FUNCTION\",RENDER_FUNCTION:1,1:\"RENDER_FUNCTION\",NATIVE_EVENT_HANDLER:5,5:\"NATIVE_EVENT_HANDLER\",COMPONENT_EVENT_HANDLER:6,6:\"COMPONENT_EVENT_HANDLER\",VNODE_HOOK:7,7:\"VNODE_HOOK\",DIRECTIVE_HOOK:8,8:\"DIRECTIVE_HOOK\",TRANSITION_HOOK:9,9:\"TRANSITION_HOOK\",APP_ERROR_HANDLER:10,10:\"APP_ERROR_HANDLER\",APP_WARN_HANDLER:11,11:\"APP_WARN_HANDLER\",FUNCTION_REF:12,12:\"FUNCTION_REF\",ASYNC_COMPONENT_LOADER:13,13:\"ASYNC_COMPONENT_LOADER\",SCHEDULER:14,14:\"SCHEDULER\",COMPONENT_UPDATE:15,15:\"COMPONENT_UPDATE\",APP_UNMOUNT_CLEANUP:16,16:\"APP_UNMOUNT_CLEANUP\"};function tG(e,t,n,r){try{return r?e(...r):e()}catch(e){tQ(e,t,n)}}function tX(e,t,n,r){if(w(e)){let i=tG(e,t,n,r);return i&&R(i)&&i.catch(e=>{tQ(e,t,n)}),i}if(T(e)){let i=[];for(let l=0;l<e.length;l++)i.push(tX(e[l],t,n,r));return i}}function tQ(e,t,n,r=!0){let i=t?t.vnode:null,{errorHandler:l,throwUnhandledErrorInProduction:s}=t&&t.appContext.config||f;if(t){let r=t.parent,i=t.proxy,s=`https://vuejs.org/error-reference/#runtime-${n}`;for(;r;){let t=r.ec;if(t){for(let n=0;n<t.length;n++)if(!1===t[n](e,i,s))return}r=r.parent}if(l){eI(),tG(l,null,10,[e,i,s]),eO();return}}!function(e,t=!0,n=!1){if(n)throw e;console.error(e)}(e,r,s)}let tZ=[],tY=-1,t0=[],t1=null,t2=0,t6=Promise.resolve(),t3=null;function t4(e){let t=t3||t6;return e?t.then(this?e.bind(this):e):t}function t8(e){if(!(1&e.flags)){let t=nt(e),n=tZ[tZ.length-1];!n||!(2&e.flags)&&t>=nt(n)?tZ.push(e):tZ.splice(function(e){let t=tY+1,n=tZ.length;for(;t<n;){let r=t+n>>>1,i=tZ[r],l=nt(i);l<e||l===e&&2&i.flags?t=r+1:n=r}return t}(t),0,e),e.flags|=1,t5()}}function t5(){t3||(t3=t6.then(function e(t){try{for(tY=0;tY<tZ.length;tY++){let e=tZ[tY];e&&!(8&e.flags)&&(4&e.flags&&(e.flags&=-2),tG(e,e.i,e.i?15:14),4&e.flags||(e.flags&=-2))}}finally{for(;tY<tZ.length;tY++){let e=tZ[tY];e&&(e.flags&=-2)}tY=-1,tZ.length=0,ne(),t3=null,(tZ.length||t0.length)&&e()}}))}function t9(e){T(e)?t0.push(...e):t1&&-1===e.id?t1.splice(t2+1,0,e):1&e.flags||(t0.push(e),e.flags|=1),t5()}function t7(e,t,n=tY+1){for(;n<tZ.length;n++){let t=tZ[n];if(t&&2&t.flags){if(e&&t.id!==e.uid)continue;tZ.splice(n,1),n--,4&t.flags&&(t.flags&=-2),t(),4&t.flags||(t.flags&=-2)}}}function ne(e){if(t0.length){let e=[...new Set(t0)].sort((e,t)=>nt(e)-nt(t));if(t0.length=0,t1)return void t1.push(...e);for(t1=e,t2=0;t2<t1.length;t2++){let e=t1[t2];4&e.flags&&(e.flags&=-2),8&e.flags||e(),e.flags&=-2}t1=null,t2=0}}let nt=e=>null==e.id?2&e.flags?-1:1/0:e.id,nn=null,nr=null;function ni(e){let t=nn;return nn=e,nr=e&&e.type.__scopeId||null,t}function nl(e){nr=e}function ns(){nr=null}let no=e=>na;function na(e,t=nn,n){if(!t||e._n)return e;let r=(...n)=>{let i;r._d&&i8(-1);let l=ni(t);try{i=e(...n)}finally{ni(l),r._d&&i8(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function nc(e,t){if(null===nn)return e;let n=lP(nn),r=e.dirs||(e.dirs=[]);for(let e=0;e<t.length;e++){let[i,l,s,o=f]=t[e];i&&(w(i)&&(i={mounted:i,updated:i}),i.deep&&tK(l),r.push({dir:i,instance:n,value:l,oldValue:void 0,arg:s,modifiers:o}))}return e}function nu(e,t,n,r){let i=e.dirs,l=t&&t.dirs;for(let s=0;s<i.length;s++){let o=i[s];l&&(o.oldValue=l[s].value);let a=o.dir[r];a&&(eI(),tX(a,n,8,[e.el,o,e,t]),eO())}}function nd(e,t){if(l_){let n=l_.provides,r=l_.parent&&l_.parent.provides;r===n&&(n=l_.provides=Object.create(r)),n[e]=t}}function np(e,t,n=!1){let r=lS();if(r||ic){let i=ic?ic._context.provides:r?null==r.parent||r.ce?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides:void 0;if(i&&e in i)return i[e];if(arguments.length>1)return n&&w(t)?t.call(r&&r.proxy):t}}function nh(){return!!(lS()||ic)}let nf=Symbol.for(\"v-scx\"),ng=()=>np(nf);function nm(e,t){return n_(e,null,t)}function nv(e,t){return n_(e,null,{flush:\"post\"})}function ny(e,t){return n_(e,null,{flush:\"sync\"})}function nb(e,t,n){return n_(e,t,n)}function n_(e,t,n=f){let r,{immediate:i,flush:l}=n,s=S({},n),o=t&&i||!t&&\"post\"!==l;if(lT){if(\"sync\"===l){let e=ng();r=e.__watcherHandles||(e.__watcherHandles=[])}else if(!o){let e=()=>{};return e.stop=m,e.resume=m,e.pause=m,e}}let a=l_;s.call=(e,t,n)=>tX(e,a,t,n);let c=!1;\"post\"===l?s.scheduler=e=>{iM(e,a&&a.suspense)}:\"sync\"!==l&&(c=!0,s.scheduler=(e,t)=>{t?e():t8(e)}),s.augmentJob=e=>{t&&(e.flags|=4),c&&(e.flags|=2,a&&(e.id=a.uid,e.i=a))};let u=function(e,t,n=f){let r,i,l,s,{immediate:o,deep:a,once:c,scheduler:u,augmentJob:p,call:h}=n,g=e=>a?e:tv(e)||!1===a||0===a?tK(e,1):tK(e),y=!1,b=!1;if(tC(e)?(i=()=>e.value,y=tv(e)):tg(e)?(i=()=>g(e),y=!0):T(e)?(b=!0,y=e.some(e=>tg(e)||tv(e)),i=()=>e.map(e=>tC(e)?e.value:tg(e)?g(e):w(e)?h?h(e,2):e():void 0)):i=w(e)?t?h?()=>h(e,2):e:()=>{if(l){eI();try{l()}finally{eO()}}let t=d;d=r;try{return h?h(e,3,[s]):e(s)}finally{d=t}}:m,t&&a){let e=i,t=!0===a?1/0:a;i=()=>tK(e(),t)}let _=eg(),S=()=>{r.stop(),_&&_.active&&x(_.effects,r)};if(c&&t){let e=t;t=(...t)=>{e(...t),S()}}let C=b?Array(e.length).fill(tU):tU,k=e=>{if(1&r.flags&&(r.dirty||e))if(t){let e=r.run();if(a||y||(b?e.some((e,t)=>U(e,C[t])):U(e,C))){l&&l();let n=d;d=r;try{let n=[e,C===tU?void 0:b&&C[0]===tU?[]:C,s];C=e,h?h(t,3,n):t(...n)}finally{d=n}}}else r.run()};return p&&p(k),(r=new ey(i)).scheduler=u?()=>u(k,!1):k,s=e=>tW(e,!1,r),l=r.onStop=()=>{let e=tH.get(r);if(e){if(h)h(e,4);else for(let t of e)t();tH.delete(r)}},t?o?k(!0):C=r.run():u?u(k.bind(null,!0),!0):r.run(),S.pause=r.pause.bind(r),S.resume=r.resume.bind(r),S.stop=S,S}(e,t,s);return lT&&(r?r.push(u):o&&u()),u}function nS(e,t,n){let r,i=this.proxy,l=N(e)?e.includes(\".\")?nx(i,e):()=>i[e]:e.bind(i,i);w(t)?r=t:(r=t.handler,n=t);let s=lx(this),o=n_(l,r.bind(i),n);return s(),o}function nx(e,t){let n=t.split(\".\");return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}let nC=new WeakMap,nk=Symbol(\"_vte\"),nT=e=>e&&(e.disabled||\"\"===e.disabled),nw=e=>\"u\">typeof SVGElement&&e instanceof SVGElement,nN=e=>\"function\"==typeof MathMLElement&&e instanceof MathMLElement,nA=(e,t)=>{let n=e&&e.to;return N(n)?t?t(n):null:n};function nE(e,t,n,{o:{insert:r},m:i},l=2){0===l&&r(e.targetAnchor,t,n);let{el:s,anchor:o,shapeFlag:a,children:c,props:u}=e,d=2===l;if(d&&r(s,t,n),!nC.has(e)&&(!d||nT(u))&&16&a)for(let e=0;e<c.length;e++)i(c[e],t,n,2);d&&r(o,t,n)}let nR={name:\"Teleport\",__isTeleport:!0,process(e,t,n,r,i,l,s,o,a,c){let{mc:u,pc:d,pbc:p,o:{insert:h,querySelector:f,createText:g,parentNode:m}}=c,y=nT(t.props),{dynamicChildren:b}=t,_=(e,t,n)=>{16&e.shapeFlag&&u(e.children,t,n,i,l,s,o,a)},S=(e=t)=>{let n=nT(e.props),r=e.target=nA(e.props,f),l=nO(r,e,g,h);r&&(\"svg\"!==s&&nw(r)?s=\"svg\":\"mathml\"!==s&&nN(r)&&(s=\"mathml\"),i&&i.isCE&&(i.ce._teleportTargets||(i.ce._teleportTargets=new Set)).add(r),n||(_(e,r,l),nI(e,!1)))},x=e=>{let t=()=>{if(nC.get(e)===t){if(nC.delete(e),nT(e.props)){let t=m(e.el)||n;_(e,t,e.anchor),nI(e,!0)}S(e)}};nC.set(e,t),iM(t,l)};if(null==e){let e,i=t.el=g(\"\"),s=t.anchor=g(\"\");if(h(i,n,r),h(s,n,r),(e=t.props)&&(e.defer||\"\"===e.defer)||l&&l.pendingBranch)return void x(t);y&&(_(t,n,s),nI(t,!0)),S()}else{t.el=e.el;let r=t.anchor=e.anchor,u=nC.get(e);if(u){u.flags|=8,nC.delete(e),x(t);return}t.targetStart=e.targetStart;let h=t.target=e.target,g=t.targetAnchor=e.targetAnchor,m=nT(e.props),_=m?n:h,S=m?r:g;if(\"svg\"===s||nw(h)?s=\"svg\":(\"mathml\"===s||nN(h))&&(s=\"mathml\"),b?(p(e.dynamicChildren,b,_,i,l,s,o),ij(e,t,!0)):a||d(e,t,_,S,i,l,s,o,!1),y)m?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):nE(t,n,r,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){let e=t.target=nA(t.props,f);e&&nE(t,e,null,c,0)}else m&&nE(t,h,g,c,1);nI(t,y)}},remove(e,t,n,{um:r,o:{remove:i}},l){let{shapeFlag:s,children:o,anchor:a,targetStart:c,targetAnchor:u,target:d,props:p}=e,h=l||!nT(p),f=nC.get(e);if(f&&(f.flags|=8,nC.delete(e)),d&&(i(c),i(u)),l&&i(a),!f&&16&s)for(let e=0;e<o.length;e++){let i=o[e];r(i,t,n,h,!!i.dynamicChildren)}},move:nE,hydrate:function(e,t,n,r,i,l,{o:{nextSibling:s,parentNode:o,querySelector:a,insert:c,createText:u}},d){function p(e,n){let r=n;for(;r;){if(r&&8===r.nodeType){if(\"teleport start anchor\"===r.data)t.targetStart=r;else if(\"teleport anchor\"===r.data){t.targetAnchor=r,e._lpa=t.targetAnchor&&s(t.targetAnchor);break}}r=s(r)}}function h(e,t){t.anchor=d(s(e),t,o(e),n,r,i,l)}let f=t.target=nA(t.props,a),g=nT(t.props);if(f){let a=f._lpa||f.firstChild;16&t.shapeFlag&&(g?(h(e,t),p(f,a),t.targetAnchor||nO(f,t,u,c,o(e)===f?e:null)):(t.anchor=s(e),p(f,a),t.targetAnchor||nO(f,t,u,c),d(a&&s(a),t,f,n,r,i,l))),nI(t,g)}else g&&16&t.shapeFlag&&(h(e,t),t.targetStart=e,t.targetAnchor=s(e));return t.anchor&&s(t.anchor)}};function nI(e,t){let n=e.ctx;if(n&&n.ut){let r,i;for(t?(r=e.el,i=e.anchor):(r=e.targetStart,i=e.targetAnchor);r&&r!==i;)1===r.nodeType&&r.setAttribute(\"data-v-owner\",n.uid),r=r.nextSibling;n.ut()}}function nO(e,t,n,r,i=null){let l=t.targetStart=n(\"\"),s=t.targetAnchor=n(\"\");return l[nk]=s,e&&(r(l,e,i),r(s,e,i)),s}let nP=Symbol(\"_leaveCb\"),nM=Symbol(\"_enterCb\");function nD(){let e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return rb(()=>{e.isMounted=!0}),rx(()=>{e.isUnmounting=!0}),e}let nF=[Function,Array],nL={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:nF,onEnter:nF,onAfterEnter:nF,onEnterCancelled:nF,onBeforeLeave:nF,onLeave:nF,onAfterLeave:nF,onLeaveCancelled:nF,onBeforeAppear:nF,onAppear:nF,onAfterAppear:nF,onAppearCancelled:nF},n$=e=>{let t=e.subTree;return t.component?n$(t.component):t};function nV(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==iY){t=n;break}}return t}let nB={name:\"BaseTransition\",props:nL,setup(e,{slots:t}){let n=lS(),r=nD();return()=>{let i=t.default&&nK(t.default(),!0),l=i&&i.length?nV(i):n.subTree?ld():void 0;if(!l)return;let s=tb(e),{mode:o}=s;if(r.isLeaving)return nH(l);let a=nq(l);if(!a)return nH(l);let c=nU(a,s,r,n,e=>c=e);a.type!==iY&&nW(a,c);let u=n.subTree&&nq(n.subTree);if(u&&u.type!==iY&&!lt(u,a)&&n$(n).type!==iY){let e=nU(u,s,r,n);if(nW(u,e),\"out-in\"===o&&a.type!==iY)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,8&n.job.flags||n.update(),delete e.afterLeave,u=void 0},nH(l);\"in-out\"===o&&a.type!==iY?e.delayLeave=(e,t,n)=>{nj(r,u)[String(u.key)]=u,e[nP]=()=>{t(),e[nP]=void 0,delete c.delayedLeave,u=void 0},c.delayedLeave=()=>{n(),delete c.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return l}}};function nj(e,t){let{leavingVNodes:n}=e,r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function nU(e,t,n,r,i){let{appear:l,mode:s,persisted:o=!1,onBeforeEnter:a,onEnter:c,onAfterEnter:u,onEnterCancelled:d,onBeforeLeave:p,onLeave:h,onAfterLeave:f,onLeaveCancelled:g,onBeforeAppear:m,onAppear:y,onAfterAppear:b,onAppearCancelled:_}=t,S=String(e.key),x=nj(n,e),C=(e,t)=>{e&&tX(e,r,9,t)},k=(e,t)=>{let n=t[1];C(e,t),T(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},w={mode:s,persisted:o,beforeEnter(t){let r=a;if(!n.isMounted)if(!l)return;else r=m||a;t[nP]&&t[nP](!0);let i=x[S];i&&lt(e,i)&&i.el[nP]&&i.el[nP](),C(r,[t])},enter(t){if(x[S]===e)return;let r=c,i=u,s=d;if(!n.isMounted)if(!l)return;else r=y||c,i=b||u,s=_||d;let o=!1;t[nM]=e=>{o||(o=!0,e?C(s,[t]):C(i,[t]),w.delayedLeave&&w.delayedLeave(),t[nM]=void 0)};let a=t[nM].bind(null,!1);r?k(r,[t,a]):a()},leave(t,r){let i=String(e.key);if(t[nM]&&t[nM](!0),n.isUnmounting)return r();C(p,[t]);let l=!1;t[nP]=n=>{l||(l=!0,r(),n?C(g,[t]):C(f,[t]),t[nP]=void 0,x[i]===e&&delete x[i])};let s=t[nP].bind(null,!1);x[i]=e,h?k(h,[t,s]):s()},clone(e){let l=nU(e,t,n,r,i);return i&&i(l),l}};return w}function nH(e){if(ra(e))return(e=la(e)).children=null,e}function nq(e){if(!ra(e))return e.type.__isTeleport&&e.children?nV(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(16&t)return n[0];if(32&t&&w(n.default))return n.default()}}function nW(e,t){6&e.shapeFlag&&e.component?(e.transition=t,nW(e.component.subTree,t)):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function nK(e,t=!1,n){let r=[],i=0;for(let l=0;l<e.length;l++){let s=e[l],o=null==n?s.key:String(n)+String(null!=s.key?s.key:l);s.type===iQ?(128&s.patchFlag&&i++,r=r.concat(nK(s.children,t,o))):(t||s.type!==iY)&&r.push(null!=o?la(s,{key:o}):s)}if(i>1)for(let e=0;e<r.length;e++)r[e].patchFlag=-2;return r}function nz(e,t){return w(e)?S({name:e.name},t,{setup:e}):e}function nJ(){let e=lS();return e?(e.appContext.config.idPrefix||\"v\")+\"-\"+e.ids[0]+e.ids[1]++:\"\"}function nG(e){e.ids=[e.ids[0]+e.ids[2]+++\"-\",0,0]}function nX(e){let t=lS(),n=tT(null);return t&&Object.defineProperty(t.refs===f?t.refs={}:t.refs,e,{enumerable:!0,get:()=>n.value,set:e=>n.value=e}),n}function nQ(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}let nZ=new WeakMap;function nY(e,t,n,r,i=!1){if(T(e))return void e.forEach((e,l)=>nY(e,t&&(T(t)?t[l]:t),n,r,i));if(rl(r)&&!i){512&r.shapeFlag&&r.type.__asyncResolved&&r.component.subTree.component&&nY(e,t,n,r.component.subTree);return}let l=4&r.shapeFlag?lP(r.component):r.el,s=i?null:l,{i:o,r:a}=e,c=t&&t.r,u=o.refs===f?o.refs={}:o.refs,d=o.setupState,p=tb(d),h=d===f?y:e=>!nQ(u,e)&&k(p,e),g=(e,t)=>!(t&&nQ(u,t));if(null!=c&&c!==a&&(n0(t),N(c)?(u[c]=null,h(c)&&(d[c]=null)):tC(c)&&(g(c,t.k)&&(c.value=null),t.k&&(u[t.k]=null))),w(a))tG(a,o,12,[s,u]);else{let t=N(a),r=tC(a);if(t||r){let o=()=>{if(e.f){let n=t?h(a)?d[a]:u[a]:g()||!e.k?a.value:u[e.k];if(i)T(n)&&x(n,l);else if(T(n))n.includes(l)||n.push(l);else if(t)u[a]=[l],h(a)&&(d[a]=u[a]);else{let t=[l];g(a,e.k)&&(a.value=t),e.k&&(u[e.k]=t)}}else t?(u[a]=s,h(a)&&(d[a]=s)):r&&(g(a,e.k)&&(a.value=s),e.k&&(u[e.k]=s))};if(s){let t=()=>{o(),nZ.delete(e)};t.id=-1,nZ.set(e,t),iM(t,n)}else n0(e),o()}}}function n0(e){let t=nZ.get(e);t&&(t.flags|=8,nZ.delete(e))}let n1=!1,n2=()=>{n1||(console.error(\"Hydration completed but contains mismatches.\"),n1=!0)},n6=e=>{if(1===e.nodeType){if(e.namespaceURI.includes(\"svg\")&&\"foreignObject\"!==e.tagName)return\"svg\";if(e.namespaceURI.includes(\"MathML\"))return\"mathml\"}},n3=e=>8===e.nodeType;function n4(e){let{mt:t,p:n,o:{patchProp:r,createText:i,nextSibling:l,parentNode:s,remove:o,insert:a,createComment:c}}=e,u=(n,r,o,c,b,_=!1)=>{_=_||!!r.dynamicChildren;let S=n3(n)&&\"[\"===n.data,x=()=>f(n,r,o,c,b,S),{type:C,ref:k,shapeFlag:T,patchFlag:w}=r,N=n.nodeType;r.el=n,-2===w&&(_=!1,r.dynamicChildren=null);let A=null;switch(C){case iZ:3!==N?\"\"===r.children?(a(r.el=i(\"\"),s(n),n),A=n):A=x():(n.data!==r.children&&(n2(),n.data=r.children),A=l(n));break;case iY:y(n)?(A=l(n),m(r.el=n.content.firstChild,n,o)):A=8!==N||S?x():l(n);break;case i0:if(S&&(N=(n=l(n)).nodeType),1===N||3===N){A=n;let e=!r.children.length;for(let t=0;t<r.staticCount;t++)e&&(r.children+=1===A.nodeType?A.outerHTML:A.data),t===r.staticCount-1&&(r.anchor=A),A=l(A);return S?l(A):A}x();break;case iQ:A=S?h(n,r,o,c,b,_):x();break;default:if(1&T)A=1===N&&r.type.toLowerCase()===n.tagName.toLowerCase()||y(n)?d(n,r,o,c,b,_):x();else if(6&T){r.slotScopeIds=b;let e=s(n);if(A=S?g(n):n3(n)&&\"teleport start\"===n.data?g(n,n.data,\"teleport end\"):l(n),t(r,e,null,o,c,n6(e),_),rl(r)&&!r.type.__asyncResolved){let t;S?(t=ls(iQ)).anchor=A?A.previousSibling:e.lastChild:t=3===n.nodeType?lc(\"\"):ls(\"div\"),t.el=n,r.component.subTree=t}}else 64&T?A=8!==N?x():r.type.hydrate(n,r,o,c,b,_,e,p):128&T&&(A=r.type.hydrate(n,r,o,c,n6(s(n)),b,_,e,u))}return null!=k&&nY(k,null,c,r),A},d=(e,t,n,i,l,s)=>{s=s||!!t.dynamicChildren;let{type:a,props:c,patchFlag:u,shapeFlag:d,dirs:h,transition:f}=t,g=\"input\"===a||\"option\"===a;if(g||-1!==u){let a;h&&nu(t,null,n,\"created\");let _=!1;if(y(e)){_=iB(null,f)&&n&&n.vnode.props&&n.vnode.props.appear;let r=e.content.firstChild;if(_){let e=r.getAttribute(\"class\");e&&(r.$cls=e),f.beforeEnter(r)}m(r,e,n),t.el=e=r}if(16&d&&!(c&&(c.innerHTML||c.textContent))){let r=p(e.firstChild,t,e,n,i,l,s);for(r&&!n9(e,1)&&n2();r;){let e=r;r=r.nextSibling,o(e)}}else if(8&d){let n=t.children;`\n`===n[0]&&(\"PRE\"===e.tagName||\"TEXTAREA\"===e.tagName)&&(n=n.slice(1));let{textContent:r}=e;r!==n&&r!==n.replace(/\\r\\n|\\r/g,`\n`)&&(n9(e,0)||n2(),e.textContent=t.children)}if(c){if(g||!s||48&u){let t=e.tagName.includes(\"-\");for(let i in c)(g&&(i.endsWith(\"value\")||\"indeterminate\"===i)||b(i)&&!P(i)||\".\"===i[0]||t&&!P(i))&&r(e,i,null,c[i],void 0,n)}else if(c.onClick)r(e,\"onClick\",null,c.onClick,void 0,n);else if(4&u&&tg(c.style))for(let e in c.style)c.style[e]}(a=c&&c.onVnodeBeforeMount)&&lm(a,n,t),h&&nu(t,null,n,\"beforeMount\"),((a=c&&c.onVnodeMounted)||h||_)&&iG(()=>{a&&lm(a,n,t),_&&f.enter(e),h&&nu(t,null,n,\"mounted\")},i)}return e.nextSibling},p=(e,t,r,s,o,c,d)=>{d=d||!!t.dynamicChildren;let p=t.children,h=p.length,f=!1;for(let t=0;t<h;t++){let g=d?p[t]:p[t]=lp(p[t]),m=g.type===iZ;e?(m&&!d&&t+1<h&&lp(p[t+1]).type===iZ&&(a(i(e.data.slice(g.children.length)),r,l(e)),e.data=g.children),e=u(e,g,s,o,c,d)):m&&!g.children?a(g.el=i(\"\"),r):(!f&&(f=!0,n9(r,1)||n2()),n(null,g,r,null,s,o,n6(r),c))}return e},h=(e,t,n,r,i,o)=>{let{slotScopeIds:u}=t;u&&(i=i?i.concat(u):u);let d=s(e),h=p(l(e),t,d,n,r,i,o);return h&&n3(h)&&\"]\"===h.data?l(t.anchor=h):(n2(),a(t.anchor=c(\"]\"),d,h),h)},f=(e,t,r,i,a,c)=>{if(n9(e.parentElement,1)||n2(),t.el=null,c){let t=g(e);for(;;){let n=l(e);if(n&&n!==t)o(n);else break}}let u=l(e),d=s(e);return o(e),n(null,t,d,u,r,i,n6(d),a),r&&(r.vnode.el=t.el,iS(r,t.el)),u},g=(e,t=\"[\",n=\"]\")=>{let r=0;for(;e;)if((e=l(e))&&n3(e)&&(e.data===t&&r++,e.data===n))if(0===r)return l(e);else r--;return e},m=(e,t,n)=>{let r=t.parentNode;r&&r.replaceChild(e,t);let i=n;for(;i;)i.vnode.el===t&&(i.vnode.el=i.subTree.el=e),i=i.parent},y=e=>1===e.nodeType&&\"TEMPLATE\"===e.tagName;return[(e,t)=>{if(!t.hasChildNodes()){n(null,e,t),ne(),t._vnode=e;return}u(t.firstChild,e,null,null,null),ne(),t._vnode=e},u]}let n8=\"data-allow-mismatch\",n5={0:\"text\",1:\"children\",2:\"class\",3:\"style\",4:\"attribute\"};function n9(e,t){if(0===t||1===t)for(;e&&!e.hasAttribute(n8);)e=e.parentElement;let n=e&&e.getAttribute(n8);if(null==n)return!1;{if(\"\"===n)return!0;let e=n.split(\",\");return!!(0===t&&e.includes(\"children\"))||e.includes(n5[t])}}let n7=z().requestIdleCallback||(e=>setTimeout(e,1)),re=z().cancelIdleCallback||(e=>clearTimeout(e)),rt=(e=1e4)=>t=>{let n=n7(t,{timeout:e});return()=>re(n)},rn=e=>(t,n)=>{let r=new IntersectionObserver(e=>{for(let n of e)if(n.isIntersecting){r.disconnect(),t();break}},e);return n(e=>{if(e instanceof Element){if(function(e){let{top:t,left:n,bottom:r,right:i}=e.getBoundingClientRect(),{innerHeight:l,innerWidth:s}=window;return(t>0&&t<l||r>0&&r<l)&&(n>0&&n<s||i>0&&i<s)}(e))return t(),r.disconnect(),!1;r.observe(e)}}),()=>r.disconnect()},rr=e=>t=>{if(e){let n=matchMedia(e);if(!n.matches)return n.addEventListener(\"change\",t,{once:!0}),()=>n.removeEventListener(\"change\",t);t()}},ri=(e=[])=>(t,n)=>{N(e)&&(e=[e]);let r=!1,i=e=>{r||(r=!0,l(),t(),e.target.dispatchEvent(new e.constructor(e.type,e)))},l=()=>{n(t=>{for(let n of e)t.removeEventListener(n,i)})};return n(t=>{for(let n of e)t.addEventListener(n,i,{once:!0})}),l},rl=e=>!!e.type.__asyncLoader;function rs(e){let t;w(e)&&(e={loader:e});let{loader:n,loadingComponent:r,errorComponent:i,delay:l=200,hydrate:s,timeout:o,suspensible:a=!0,onError:c}=e,u=null,d=0,p=()=>{let e;return u||(e=u=n().catch(e=>{if(e=e instanceof Error?e:Error(String(e)),c)return new Promise((t,n)=>{c(e,()=>t((d++,u=null,p())),()=>n(e),d+1)});throw e}).then(n=>e!==u&&u?u:(n&&(n.__esModule||\"Module\"===n[Symbol.toStringTag])&&(n=n.default),t=n,n)))};return nz({name:\"AsyncComponentWrapper\",__asyncLoader:p,__asyncHydrate(e,n,r){let i=!1;(n.bu||(n.bu=[])).push(()=>i=!0);let l=()=>{i||r()},o=s?()=>{let t=s(l,t=>(function(e,t){if(n3(e)&&\"[\"===e.data){let n=1,r=e.nextSibling;for(;r;){if(1===r.nodeType){if(!1===t(r))break}else if(n3(r))if(\"]\"===r.data){if(0==--n)break}else\"[\"===r.data&&n++;r=r.nextSibling}}else t(e)})(e,t));t&&(n.bum||(n.bum=[])).push(t)}:l;t?o():p().then(()=>!n.isUnmounted&&o())},get __asyncResolved(){return t},setup(){let e=l_;if(nG(e),t)return()=>ro(t,e);let n=t=>{u=null,tQ(t,e,13,!i)};if(a&&e.suspense||lT)return p().then(t=>()=>ro(t,e)).catch(e=>(n(e),()=>i?ls(i,{error:e}):null));let s=tk(!1),c=tk(),d=tk(!!l);return l&&setTimeout(()=>{d.value=!1},l),null!=o&&setTimeout(()=>{if(!s.value&&!c.value){let e=Error(`Async component timed out after ${o}ms.`);n(e),c.value=e}},o),p().then(()=>{s.value=!0,e.parent&&ra(e.parent.vnode)&&e.parent.update()}).catch(e=>{n(e),c.value=e}),()=>s.value&&t?ro(t,e):c.value&&i?ls(i,{error:c.value}):r&&!d.value?ro(r,e):void 0}})}function ro(e,t){let{ref:n,props:r,children:i,ce:l}=t.vnode,s=ls(e,r,i);return s.ref=n,s.ce=l,delete t.vnode.ce,s}let ra=e=>e.type.__isKeepAlive,rc={name:\"KeepAlive\",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){let n=lS(),r=n.ctx;if(!r.renderer)return()=>{let e=t.default&&t.default();return e&&1===e.length?e[0]:e};let i=new Map,l=new Set,s=null,o=n.suspense,{renderer:{p:a,m:c,um:u,o:{createElement:d}}}=r,p=d(\"div\");function h(e){rf(e),u(e,n,o,!0)}function f(e){i.forEach((t,n)=>{let r=lM(rl(t)?t.type.__asyncResolved||{}:t.type);r&&!e(r)&&g(n)})}function g(e){let t=i.get(e);!t||s&&lt(t,s)?s&&rf(s):h(t),i.delete(e),l.delete(e)}r.activate=(e,t,n,r,i)=>{let l=e.component;c(e,t,n,0,o),a(l.vnode,e,t,n,l,o,r,e.slotScopeIds,i),iM(()=>{l.isDeactivated=!1,l.a&&H(l.a);let t=e.props&&e.props.onVnodeMounted;t&&lm(t,l.parent,e)},o)},r.deactivate=e=>{let t=e.component;iU(t.m),iU(t.a),c(e,p,null,1,o),iM(()=>{t.da&&H(t.da);let n=e.props&&e.props.onVnodeUnmounted;n&&lm(n,t.parent,e),t.isDeactivated=!0},o)},nb(()=>[e.include,e.exclude],([e,t])=>{e&&f(t=>ru(e,t)),t&&f(e=>!ru(t,e))},{flush:\"post\",deep:!0});let m=null,y=()=>{null!=m&&(iH(n.subTree.type)?iM(()=>{i.set(m,rg(n.subTree))},n.subTree.suspense):i.set(m,rg(n.subTree)))};return rb(y),rS(y),rx(()=>{i.forEach(e=>{let{subTree:t,suspense:r}=n,i=rg(t);if(e.type===i.type&&e.key===i.key){rf(i);let e=i.component.da;e&&iM(e,r);return}h(e)})}),()=>{if(m=null,!t.default)return s=null;let n=t.default(),r=n[0];if(n.length>1)return s=null,n;if(!le(r)||!(4&r.shapeFlag)&&!(128&r.shapeFlag))return s=null,r;let o=rg(r);if(o.type===iY)return s=null,o;let a=o.type,c=lM(rl(o)?o.type.__asyncResolved||{}:a),{include:u,exclude:d,max:p}=e;if(u&&(!c||!ru(u,c))||d&&c&&ru(d,c))return o.shapeFlag&=-257,s=o,r;let h=null==o.key?a:o.key,f=i.get(h);return o.el&&(o=la(o),128&r.shapeFlag&&(r.ssContent=o)),m=h,f?(o.el=f.el,o.component=f.component,o.transition&&nW(o,o.transition),o.shapeFlag|=512,l.delete(h),l.add(h)):(l.add(h),p&&l.size>parseInt(p,10)&&g(l.values().next().value)),o.shapeFlag|=256,s=o,iH(r.type)?r:o}}};function ru(e,t){let n;if(T(e))return e.some(e=>ru(e,t));if(N(e))return e.split(\",\").includes(t);return\"[object RegExp]\"===(n=e,I.call(n))&&(e.lastIndex=0,e.test(t))}function rd(e,t){rh(e,\"a\",t)}function rp(e,t){rh(e,\"da\",t)}function rh(e,t,n=l_){let r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(rm(t,r,n),n){let e=n.parent;for(;e&&e.parent;)ra(e.parent.vnode)&&function(e,t,n,r){let i=rm(t,e,r,!0);rC(()=>{x(r[t],i)},n)}(r,t,n,e),e=e.parent}}function rf(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function rg(e){return 128&e.shapeFlag?e.ssContent:e}function rm(e,t,n=l_,r=!1){if(n){let i=n[e]||(n[e]=[]),l=t.__weh||(t.__weh=(...r)=>{eI();let i=lx(n),l=tX(t,n,e,r);return i(),eO(),l});return r?i.unshift(l):i.push(l),l}}let rv=e=>(t,n=l_)=>{lT&&\"sp\"!==e||rm(e,(...e)=>t(...e),n)},ry=rv(\"bm\"),rb=rv(\"m\"),r_=rv(\"bu\"),rS=rv(\"u\"),rx=rv(\"bum\"),rC=rv(\"um\"),rk=rv(\"sp\"),rT=rv(\"rtg\"),rw=rv(\"rtc\");function rN(e,t=l_){rm(\"ec\",e,t)}let rA=\"components\";function rE(e,t){return rP(rA,e,!0,t)||e}let rR=Symbol.for(\"v-ndc\");function rI(e){return N(e)?rP(rA,e,!1)||e:e||rR}function rO(e){return rP(\"directives\",e)}function rP(e,t,n=!0,r=!1){let i=nn||l_;if(i){let n=i.type;if(e===rA){let e=lM(n,!1);if(e&&(e===t||e===L(t)||e===B(L(t))))return n}let l=rM(i[e]||n[e],t)||rM(i.appContext[e],t);return!l&&r?n:l}}function rM(e,t){return e&&(e[t]||e[L(t)]||e[B(L(t))])}function rD(e,t,n,r){let i,l=n&&n[r],s=T(e);if(s||N(e)){let n=s&&tg(e),r=!1,o=!1;n&&(r=!tv(e),o=tm(e),e=eq(e)),i=Array(e.length);for(let n=0,s=e.length;n<s;n++)i[n]=t(r?o?tx(tS(e[n])):tS(e[n]):e[n],n,void 0,l&&l[n])}else if(\"number\"==typeof e){i=Array(e);for(let n=0;n<e;n++)i[n]=t(n+1,n,void 0,l&&l[n])}else if(E(e))if(e[Symbol.iterator])i=Array.from(e,(e,n)=>t(e,n,void 0,l&&l[n]));else{let n=Object.keys(e);i=Array(n.length);for(let r=0,s=n.length;r<s;r++){let s=n[r];i[r]=t(e[s],s,r,l&&l[r])}}else i=[];return n&&(n[r]=i),i}function rF(e,t){for(let n=0;n<t.length;n++){let r=t[n];if(T(r))for(let t=0;t<r.length;t++)e[r[t].name]=r[t].fn;else r&&(e[r.name]=r.key?(...e)=>{let t=r.fn(...e);return t&&(t.key=r.key),t}:r.fn)}return e}function rL(e,t,n={},r,i){if(nn.ce||nn.parent&&rl(nn.parent)&&nn.parent.ce){let e=Object.keys(n).length>0;return\"default\"!==t&&(n.name=t),i6(),i7(iQ,null,[ls(\"slot\",n,r&&r())],e?-2:64)}let l=e[t];l&&l._c&&(l._d=!1),i6();let s=l&&r$(l(n)),o=n.key||s&&s.key,a=i7(iQ,{key:(o&&!A(o)?o:`_${t}`)+(!s&&r?\"_fb\":\"\")},s||(r?r():[]),s&&1===e._?64:-2);return!i&&a.scopeId&&(a.slotScopeIds=[a.scopeId+\"-s\"]),l&&l._c&&(l._d=!0),a}function r$(e){return e.some(e=>!le(e)||e.type!==iY&&(e.type!==iQ||!!r$(e.children)))?e:null}function rV(e,t){let n={};for(let r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:j(r)]=e[r];return n}let rB=e=>e?lk(e)?lP(e):rB(e.parent):null,rj=S(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>rB(e.parent),$root:e=>rB(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>r9(e),$forceUpdate:e=>e.f||(e.f=()=>{t8(e.update)}),$nextTick:e=>e.n||(e.n=t4.bind(e.proxy)),$watch:e=>nS.bind(e)}),rU=(e,t)=>e!==f&&!e.__isScriptSetup&&k(e,t),rH={get({_:e},t){let n,r;if(\"__v_skip\"===t)return!0;let{ctx:i,setupState:l,data:s,props:o,accessCache:a,type:c,appContext:u}=e;if(\"$\"!==t[0]){let e=a[t];if(void 0!==e)switch(e){case 1:return l[t];case 2:return s[t];case 4:return i[t];case 3:return o[t]}else{if(rU(l,t))return a[t]=1,l[t];if(s!==f&&k(s,t))return a[t]=2,s[t];if(k(o,t))return a[t]=3,o[t];if(i!==f&&k(i,t))return a[t]=4,i[t];r8&&(a[t]=0)}}let d=rj[t];return d?(\"$attrs\"===t&&ej(e.attrs,\"get\",\"\"),d(e)):(n=c.__cssModules)&&(n=n[t])?n:i!==f&&k(i,t)?(a[t]=4,i[t]):k(r=u.config.globalProperties,t)?r[t]:void 0},set({_:e},t,n){let{data:r,setupState:i,ctx:l}=e;return rU(i,t)?(i[t]=n,!0):r!==f&&k(r,t)?(r[t]=n,!0):!k(e.props,t)&&!(\"$\"===t[0]&&t.slice(1)in e)&&(l[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:i,props:l,type:s}},o){let a;return!!(n[o]||e!==f&&\"$\"!==o[0]&&k(e,o)||rU(t,o)||k(l,o)||k(r,o)||k(rj,o)||k(i.config.globalProperties,o)||(a=s.__cssModules)&&a[o])},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:k(n,\"value\")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},rq=S({},rH,{get(e,t){if(t!==Symbol.unscopables)return rH.get(e,t,e)},has:(e,t)=>\"_\"!==t[0]&&!J(t)});function rW(){return null}function rK(){return null}function rz(e){}function rJ(e){}function rG(){return null}function rX(){}function rQ(e,t){return null}function rZ(){return r0().slots}function rY(){return r0().attrs}function r0(e){let t=lS();return t.setupContext||(t.setupContext=lO(t))}function r1(e){return T(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}function r2(e,t){let n=r1(e);for(let e in t){if(e.startsWith(\"__skip\"))continue;let r=n[e];r?T(r)||w(r)?r=n[e]={type:r,default:t[e]}:r.default=t[e]:null===r&&(r=n[e]={default:t[e]}),r&&t[`__skip_${e}`]&&(r.skipFactory=!0)}return n}function r6(e,t){return e&&t?T(e)&&T(t)?e.concat(t):S({},r1(e),r1(t)):e||t}function r3(e,t){let n={};for(let r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function r4(e){let t=lS(),n=lT,r=e();lC(),n&&s(!1);let i=()=>{lx(t),n&&s(!0)},l=()=>{lS()!==t&&t.scope.off(),lC(),n&&s(!1)};return R(r)&&(r=r.catch(e=>{throw i(),Promise.resolve().then(()=>Promise.resolve().then(l)),e})),[r,()=>{i(),Promise.resolve().then(l)}]}let r8=!0;function r5(e,t,n){tX(T(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function r9(e){let t,n=e.type,{mixins:r,extends:i}=n,{mixins:l,optionsCache:s,config:{optionMergeStrategies:o}}=e.appContext,a=s.get(n);return a?t=a:l.length||r||i?(t={},l.length&&l.forEach(e=>r7(t,e,o,!0)),r7(t,n,o)):t=n,E(n)&&s.set(n,t),t}function r7(e,t,n,r=!1){let{mixins:i,extends:l}=t;for(let s in l&&r7(e,l,n,!0),i&&i.forEach(t=>r7(e,t,n,!0)),t)if(r&&\"expose\"===s);else{let r=ie[s]||n&&n[s];e[s]=r?r(e[s],t[s]):t[s]}return e}let ie={data:it,props:is,emits:is,methods:il,computed:il,beforeCreate:ii,created:ii,beforeMount:ii,mounted:ii,beforeUpdate:ii,updated:ii,beforeDestroy:ii,beforeUnmount:ii,destroyed:ii,unmounted:ii,activated:ii,deactivated:ii,errorCaptured:ii,serverPrefetch:ii,components:il,directives:il,watch:function(e,t){if(!e)return t;if(!t)return e;let n=S(Object.create(null),e);for(let r in t)n[r]=ii(e[r],t[r]);return n},provide:it,inject:function(e,t){return il(ir(e),ir(t))}};function it(e,t){return t?e?function(){return S(w(e)?e.call(this,this):e,w(t)?t.call(this,this):t)}:t:e}function ir(e){if(T(e)){let t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function ii(e,t){return e?[...new Set([].concat(e,t))]:t}function il(e,t){return e?S(Object.create(null),e,t):t}function is(e,t){return e?T(e)&&T(t)?[...new Set([...e,...t])]:S(Object.create(null),r1(e),r1(null!=t?t:{})):t}function io(){return{app:null,config:{isNativeTag:y,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let ia=0,ic=null;function iu(e,t,n=f){let r=lS(),i=L(t),l=V(t),s=id(e,i),o=tM((s,o)=>{let a,c,u=f;return ny(()=>{let t=e[i];U(a,t)&&(a=t,o())}),{get:()=>(s(),n.get?n.get(a):a),set(e){let s=n.set?n.set(e):e;if(!U(s,a)&&!(u!==f&&U(e,u)))return;let d=r.vnode.props;d&&(t in d||i in d||l in d)&&(`onUpdate:${t}`in d||`onUpdate:${i}`in d||`onUpdate:${l}`in d)||(a=e,o()),r.emit(`update:${t}`,s),U(e,s)&&U(e,u)&&!U(s,c)&&o(),u=e,c=s}}});return o[Symbol.iterator]=()=>{let e=0;return{next:()=>e<2?{value:e++?s||f:o,done:!1}:{done:!0}}},o}let id=(e,t)=>\"modelValue\"===t||\"model-value\"===t?e.modelModifiers:e[`${t}Modifiers`]||e[`${L(t)}Modifiers`]||e[`${V(t)}Modifiers`];function ip(e,t,...n){let r;if(e.isUnmounted)return;let i=e.vnode.props||f,l=n,s=t.startsWith(\"update:\"),o=s&&id(i,t.slice(7));o&&(o.trim&&(l=n.map(e=>N(e)?e.trim():e)),o.number&&(l=n.map(W)));let a=i[r=j(t)]||i[r=j(L(t))];!a&&s&&(a=i[r=j(V(t))]),a&&tX(a,e,6,l);let c=i[r+\"Once\"];if(c){if(e.emitted){if(e.emitted[r])return}else e.emitted={};e.emitted[r]=!0,tX(c,e,6,l)}}let ih=new WeakMap;function ig(e,t){return!!e&&!!b(t)&&(k(e,(t=t.slice(2).replace(/Once$/,\"\"))[0].toLowerCase()+t.slice(1))||k(e,V(t))||k(e,t))}function im(e){let t,n,{type:r,vnode:i,proxy:l,withProxy:s,propsOptions:[o],slots:a,attrs:c,emit:u,render:d,renderCache:p,props:h,data:f,setupState:g,ctx:m,inheritAttrs:y}=e,b=ni(e);try{if(4&i.shapeFlag){let e=s||l;t=lp(d.call(e,e,p,h,g,f,m)),n=c}else t=lp(r.length>1?r(h,{attrs:c,slots:a,emit:u}):r(h,null)),n=r.props?c:iv(c)}catch(n){i1.length=0,tQ(n,e,1),t=ls(iY)}let S=t;if(n&&!1!==y){let e=Object.keys(n),{shapeFlag:t}=S;e.length&&7&t&&(o&&e.some(_)&&(n=iy(n,o)),S=la(S,n,!1,!0))}return i.dirs&&((S=la(S,null,!1,!0)).dirs=S.dirs?S.dirs.concat(i.dirs):i.dirs),i.transition&&nW(S,i.transition),t=S,ni(b),t}let iv=e=>{let t;for(let n in e)(\"class\"===n||\"style\"===n||b(n))&&((t||(t={}))[n]=e[n]);return t},iy=(e,t)=>{let n={};for(let r in e)_(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function ib(e,t,n){let r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let i=0;i<r.length;i++){let l=r[i];if(i_(t,e,l)&&!ig(n,l))return!0}return!1}function i_(e,t,n){let r=e[n],i=t[n];return\"style\"===n&&E(r)&&E(i)?!eo(r,i):r!==i}function iS({vnode:e,parent:t,suspense:n},r){for(;t;){let n=t.subTree;if(n.suspense&&n.suspense.activeBranch===e&&(n.suspense.vnode.el=n.el=r,e=n),n===e)(e=t.vnode).el=r,t=t.parent;else break}n&&n.activeBranch===e&&(n.vnode.el=r)}let ix={},iC=e=>Object.getPrototypeOf(e)===ix;function ik(e,t,n,r){let i,[l,s]=e.propsOptions,o=!1;if(t)for(let a in t){let c;if(P(a))continue;let u=t[a];l&&k(l,c=L(a))?s&&s.includes(c)?(i||(i={}))[c]=u:n[c]=u:ig(e.emitsOptions,a)||a in r&&u===r[a]||(r[a]=u,o=!0)}if(s){let t=tb(n),r=i||f;for(let i=0;i<s.length;i++){let o=s[i];n[o]=iT(l,t,o,r[o],e,!k(r,o))}}return o}function iT(e,t,n,r,i,l){let s=e[n];if(null!=s){let e=k(s,\"default\");if(e&&void 0===r){let e=s.default;if(s.type!==Function&&!s.skipFactory&&w(e)){let{propsDefaults:l}=i;if(n in l)r=l[n];else{let s=lx(i);r=l[n]=e.call(null,t),s()}}else r=e;i.ce&&i.ce._setProp(n,r)}s[0]&&(l&&!e?r=!1:s[1]&&(\"\"===r||r===V(n))&&(r=!0))}return r}let iw=new WeakMap;function iN(e){return!(\"$\"===e[0]||P(e))}let iA=e=>\"_\"===e||\"_ctx\"===e||\"$stable\"===e,iE=e=>T(e)?e.map(lp):[lp(e)],iR=(e,t,n)=>{if(t._n)return t;let r=na((...e)=>iE(t(...e)),n);return r._c=!1,r},iI=(e,t,n)=>{let r=e._ctx;for(let n in e){if(iA(n))continue;let i=e[n];if(w(i))t[n]=iR(n,i,r);else if(null!=i){let e=iE(i);t[n]=()=>e}}},iO=(e,t)=>{let n=iE(t);e.slots.default=()=>n},iP=(e,t,n)=>{for(let r in t)(n||!iA(r))&&(e[r]=t[r])},iM=iG;function iD(e){return iL(e)}function iF(e){return iL(e,n4)}function iL(e,t){var n;let r,i;z().__VUE__=!0;let{insert:l,remove:s,patchProp:o,createElement:a,createText:c,createComment:u,setText:d,setElementText:p,parentNode:h,nextSibling:y,setScopeId:b=m,insertStaticContent:_}=e,x=(e,t,n,r=null,i=null,l=null,s,o=null,a=!!t.dynamicChildren)=>{if(e===t)return;e&&!lt(e,t)&&(r=en(e),Q(e,i,l,!0),e=null),-2===t.patchFlag&&(a=!1,t.dynamicChildren=null);let{type:c,ref:u,shapeFlag:d}=t;switch(c){case iZ:C(e,t,n,r);break;case iY:T(e,t,n,r);break;case i0:null==e&&N(t,n,r,s);break;case iQ:$(e,t,n,r,i,l,s,o,a);break;default:1&d?A(e,t,n,r,i,l,s,o,a):6&d?B(e,t,n,r,i,l,s,o,a):64&d?c.process(e,t,n,r,i,l,s,o,a,el):128&d&&c.process(e,t,n,r,i,l,s,o,a,el)}null!=u&&i?nY(u,e&&e.ref,l,t||e,!t):null==u&&e&&null!=e.ref&&nY(e.ref,null,l,e,!0)},C=(e,t,n,r)=>{if(null==e)l(t.el=c(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&d(n,t.children)}},T=(e,t,n,r)=>{null==e?l(t.el=u(t.children||\"\"),n,r):t.el=e.el},N=(e,t,n,r)=>{[e.el,e.anchor]=_(e.children,t,n,r,e.el,e.anchor)},A=(e,t,n,r,i,l,s,o,a)=>{if(\"svg\"===t.type?s=\"svg\":\"math\"===t.type&&(s=\"mathml\"),null==e)R(t,n,r,i,l,s,o,a);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),M(e,t,i,l,s,o,a)}finally{n&&n._endPatch()}}},R=(e,t,n,r,i,s,c,u)=>{let d,h,{props:f,shapeFlag:g,transition:m,dirs:y}=e;if(d=e.el=a(e.type,s,f&&f.is,f),8&g?p(d,e.children):16&g&&O(e.children,d,null,r,i,i$(e,s),c,u),y&&nu(e,null,r,\"created\"),I(d,e,e.scopeId,c,r),f){for(let e in f)\"value\"===e||P(e)||o(d,e,null,f[e],s,r);\"value\"in f&&o(d,\"value\",null,f.value,s),(h=f.onVnodeBeforeMount)&&lm(h,r,e)}y&&nu(e,null,r,\"beforeMount\");let b=iB(i,m);b&&m.beforeEnter(d),l(d,t,n),((h=f&&f.onVnodeMounted)||b||y)&&iM(()=>{h&&lm(h,r,e),b&&m.enter(d),y&&nu(e,null,r,\"mounted\")},i)},I=(e,t,n,r,i)=>{if(n&&b(e,n),r)for(let t=0;t<r.length;t++)b(e,r[t]);if(i){let n=i.subTree;if(t===n||iH(n.type)&&(n.ssContent===t||n.ssFallback===t)){let t=i.vnode;I(e,t,t.scopeId,t.slotScopeIds,i.parent)}}},O=(e,t,n,r,i,l,s,o,a=0)=>{for(let c=a;c<e.length;c++)x(null,e[c]=o?lh(e[c]):lp(e[c]),t,n,r,i,l,s,o)},M=(e,t,n,r,i,l,s)=>{let a,c=t.el=e.el,{patchFlag:u,dynamicChildren:d,dirs:h}=t;u|=16&e.patchFlag;let g=e.props||f,m=t.props||f;if(n&&iV(n,!1),(a=m.onVnodeBeforeUpdate)&&lm(a,n,t,e),h&&nu(t,e,n,\"beforeUpdate\"),n&&iV(n,!0),(g.innerHTML&&null==m.innerHTML||g.textContent&&null==m.textContent)&&p(c,\"\"),d?D(e.dynamicChildren,d,c,n,r,i$(t,i),l):s||K(e,t,c,null,n,r,i$(t,i),l,!1),u>0){if(16&u)F(c,g,m,n,i);else if(2&u&&g.class!==m.class&&o(c,\"class\",null,m.class,i),4&u&&o(c,\"style\",g.style,m.style,i),8&u){let e=t.dynamicProps;for(let t=0;t<e.length;t++){let r=e[t],l=g[r],s=m[r];(s!==l||\"value\"===r)&&o(c,r,l,s,i,n)}}1&u&&e.children!==t.children&&p(c,t.children)}else s||null!=d||F(c,g,m,n,i);((a=m.onVnodeUpdated)||h)&&iM(()=>{a&&lm(a,n,t,e),h&&nu(t,e,n,\"updated\")},r)},D=(e,t,n,r,i,l,s)=>{for(let o=0;o<t.length;o++){let a=e[o],c=t[o],u=a.el&&(a.type===iQ||!lt(a,c)||198&a.shapeFlag)?h(a.el):n;x(a,c,u,null,r,i,l,s,!0)}},F=(e,t,n,r,i)=>{if(t!==n){if(t!==f)for(let l in t)P(l)||l in n||o(e,l,t[l],null,i,r);for(let l in n){if(P(l))continue;let s=n[l],a=t[l];s!==a&&\"value\"!==l&&o(e,l,a,s,i,r)}\"value\"in n&&o(e,\"value\",t.value,n.value,i)}},$=(e,t,n,r,i,s,o,a,u)=>{let d=t.el=e?e.el:c(\"\"),p=t.anchor=e?e.anchor:c(\"\"),{patchFlag:h,dynamicChildren:f,slotScopeIds:g}=t;g&&(a=a?a.concat(g):g),null==e?(l(d,n,r),l(p,n,r),O(t.children||[],n,p,i,s,o,a,u)):h>0&&64&h&&f&&e.dynamicChildren&&e.dynamicChildren.length===f.length?(D(e.dynamicChildren,f,n,i,s,o,a),(null!=t.key||i&&t===i.subTree)&&ij(e,t,!0)):K(e,t,n,p,i,s,o,a,u)},B=(e,t,n,r,i,l,s,o,a)=>{t.slotScopeIds=o,null==e?512&t.shapeFlag?i.ctx.activate(t,n,r,s,a):j(t,n,r,i,l,s,a):U(e,t,a)},j=(e,t,n,r,i,l,s)=>{let o=e.component=lb(e,r,i);if(ra(e)&&(o.ctx.renderer=el),lw(o,!1,s),o.asyncDep){if(i&&i.registerDep(o,q,s),!e.el){let r=o.subTree=ls(iY);T(null,r,t,n),e.placeholder=r.el}}else q(o,e,t,n,i,l,s)},U=(e,t,n)=>{let r=t.component=e.component;if(function(e,t,n){let{props:r,children:i,component:l}=e,{props:s,children:o,patchFlag:a}=t,c=l.emitsOptions;if(t.dirs||t.transition)return!0;if(!n||!(a>=0))return(!!i||!!o)&&(!o||!o.$stable)||r!==s&&(r?!s||ib(r,s,c):!!s);if(1024&a)return!0;if(16&a)return r?ib(r,s,c):!!s;if(8&a){let e=t.dynamicProps;for(let t=0;t<e.length;t++){let n=e[t];if(i_(s,r,n)&&!ig(c,n))return!0}}return!1}(e,t,n))if(r.asyncDep&&!r.asyncResolved)return void W(r,t,n);else r.next=t,r.update();else t.el=e.el,r.vnode=t},q=(e,t,n,r,l,s,o)=>{e.scope.on();let a=e.effect=new ey(()=>{if(e.isMounted){let t,{next:n,bu:r,u:i,parent:a,vnode:u}=e;{let t=function e(t){let n=t.subTree.component;if(n)if(n.asyncDep&&!n.asyncResolved)return n;else return e(n)}(e);if(t){n&&(n.el=u.el,W(e,n,o)),t.asyncDep.then(()=>{iM(()=>{e.isUnmounted||c()},l)});return}}let d=n;iV(e,!1),n?(n.el=u.el,W(e,n,o)):n=u,r&&H(r),(t=n.props&&n.props.onVnodeBeforeUpdate)&&lm(t,a,n,u),iV(e,!0);let p=im(e),f=e.subTree;e.subTree=p,x(f,p,h(f.el),en(f),e,l,s),n.el=p.el,null===d&&iS(e,p.el),i&&iM(i,l),(t=n.props&&n.props.onVnodeUpdated)&&iM(()=>lm(t,a,n,u),l)}else{let o,{el:a,props:c}=t,{bm:u,m:d,parent:p,root:h,type:f}=e,g=rl(t);if(iV(e,!1),u&&H(u),!g&&(o=c&&c.onVnodeBeforeMount)&&lm(o,p,t),iV(e,!0),a&&i){let t=()=>{e.subTree=im(e),i(a,e.subTree,e,l,null)};g&&f.__asyncHydrate?f.__asyncHydrate(a,e,t):t()}else{h.ce&&h.ce._hasShadowRoot()&&h.ce._injectChildStyle(f,e.parent?e.parent.type:void 0);let i=e.subTree=im(e);x(null,i,n,r,e,l,s),t.el=i.el}if(d&&iM(d,l),!g&&(o=c&&c.onVnodeMounted)){let e=t;iM(()=>lm(o,p,e),l)}(256&t.shapeFlag||p&&rl(p.vnode)&&256&p.vnode.shapeFlag)&&e.a&&iM(e.a,l),e.isMounted=!0,t=n=r=null}});e.scope.off();let c=e.update=a.run.bind(a),u=e.job=a.runIfDirty.bind(a);u.i=e,u.id=e.uid,a.scheduler=()=>t8(u),iV(e,!0),c()},W=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,r){let{props:i,attrs:l,vnode:{patchFlag:s}}=e,o=tb(i),[a]=e.propsOptions,c=!1;if((r||s>0)&&!(16&s)){if(8&s){let n=e.vnode.dynamicProps;for(let r=0;r<n.length;r++){let s=n[r];if(ig(e.emitsOptions,s))continue;let u=t[s];if(a)if(k(l,s))u!==l[s]&&(l[s]=u,c=!0);else{let t=L(s);i[t]=iT(a,o,t,u,e,!1)}else u!==l[s]&&(l[s]=u,c=!0)}}}else{let r;for(let s in ik(e,t,i,l)&&(c=!0),o)t&&(k(t,s)||(r=V(s))!==s&&k(t,r))||(a?n&&(void 0!==n[s]||void 0!==n[r])&&(i[s]=iT(a,o,s,void 0,e,!0)):delete i[s]);if(l!==o)for(let e in l)t&&k(t,e)||(delete l[e],c=!0)}c&&eU(e.attrs,\"set\",\"\")}(e,t.props,r,n),((e,t,n)=>{let{vnode:r,slots:i}=e,l=!0,s=f;if(32&r.shapeFlag){let e=t._;e?n&&1===e?l=!1:iP(i,t,n):(l=!t.$stable,iI(t,i)),s=t}else t&&(iO(e,t),s={default:1});if(l)for(let e in i)iA(e)||null!=s[e]||delete i[e]})(e,t.children,n),eI(),t7(e),eO()},K=(e,t,n,r,i,l,s,o,a=!1)=>{let c=e&&e.children,u=e?e.shapeFlag:0,d=t.children,{patchFlag:h,shapeFlag:f}=t;if(h>0){if(128&h)return void G(c,d,n,r,i,l,s,o,a);else if(256&h)return void J(c,d,n,r,i,l,s,o,a)}8&f?(16&u&&et(c,i,l),d!==c&&p(n,d)):16&u?16&f?G(c,d,n,r,i,l,s,o,a):et(c,i,l,!0):(8&u&&p(n,\"\"),16&f&&O(d,n,r,i,l,s,o,a))},J=(e,t,n,r,i,l,s,o,a)=>{let c;e=e||g,t=t||g;let u=e.length,d=t.length,p=Math.min(u,d);for(c=0;c<p;c++){let r=t[c]=a?lh(t[c]):lp(t[c]);x(e[c],r,n,null,i,l,s,o,a)}u>d?et(e,i,l,!0,!1,p):O(t,n,r,i,l,s,o,a,p)},G=(e,t,n,r,i,l,s,o,a)=>{let c=0,u=t.length,d=e.length-1,p=u-1;for(;c<=d&&c<=p;){let r=e[c],u=t[c]=a?lh(t[c]):lp(t[c]);if(lt(r,u))x(r,u,n,null,i,l,s,o,a);else break;c++}for(;c<=d&&c<=p;){let r=e[d],c=t[p]=a?lh(t[p]):lp(t[p]);if(lt(r,c))x(r,c,n,null,i,l,s,o,a);else break;d--,p--}if(c>d){if(c<=p){let e=p+1,d=e<u?t[e].el:r;for(;c<=p;)x(null,t[c]=a?lh(t[c]):lp(t[c]),n,d,i,l,s,o,a),c++}}else if(c>p)for(;c<=d;)Q(e[c],i,l,!0),c++;else{let h,f=c,m=c,y=new Map;for(c=m;c<=p;c++){let e=t[c]=a?lh(t[c]):lp(t[c]);null!=e.key&&y.set(e.key,c)}let b=0,_=p-m+1,S=!1,C=0,k=Array(_);for(c=0;c<_;c++)k[c]=0;for(c=f;c<=d;c++){let r,u=e[c];if(b>=_){Q(u,i,l,!0);continue}if(null!=u.key)r=y.get(u.key);else for(h=m;h<=p;h++)if(0===k[h-m]&&lt(u,t[h])){r=h;break}void 0===r?Q(u,i,l,!0):(k[r-m]=c+1,r>=C?C=r:S=!0,x(u,t[r],n,null,i,l,s,o,a),b++)}let T=S?function(e){let t,n,r,i,l,s=e.slice(),o=[0],a=e.length;for(t=0;t<a;t++){let a=e[t];if(0!==a){if(e[n=o[o.length-1]]<a){s[t]=n,o.push(t);continue}for(r=0,i=o.length-1;r<i;)e[o[l=r+i>>1]]<a?r=l+1:i=l;a<e[o[r]]&&(r>0&&(s[t]=o[r-1]),o[r]=t)}}for(r=o.length,i=o[r-1];r-- >0;)o[r]=i,i=s[i];return o}(k):g;for(h=T.length-1,c=_-1;c>=0;c--){let e=m+c,d=t[e],p=t[e+1],f=e+1<u?p.el||function e(t){if(t.placeholder)return t.placeholder;let n=t.component;return n?e(n.subTree):null}(p):r;0===k[c]?x(null,d,n,f,i,l,s,o,a):S&&(h<0||c!==T[h]?X(d,n,f,2):h--)}}},X=(e,t,n,r,i=null)=>{let{el:o,type:a,transition:c,children:u,shapeFlag:d}=e;if(6&d)return void X(e.component.subTree,t,n,r);if(128&d)return void e.suspense.move(t,n,r);if(64&d)return void a.move(e,t,n,el);if(a===iQ){l(o,t,n);for(let e=0;e<u.length;e++)X(u[e],t,n,r);l(e.anchor,t,n);return}if(a===i0)return void(({el:e,anchor:t},n,r)=>{let i;for(;e&&e!==t;)i=y(e),l(e,n,r),e=i;l(t,n,r)})(e,t,n);if(2!==r&&1&d&&c)if(0===r)c.persisted&&!o[nP]?l(o,t,n):(c.beforeEnter(o),l(o,t,n),iM(()=>c.enter(o),i));else{let{leave:r,delayLeave:i,afterLeave:a}=c,u=()=>{e.ctx.isUnmounted?s(o):l(o,t,n)},d=()=>{let e=o._isLeaving||!!o[nP];o._isLeaving&&o[nP](!0),c.persisted&&!e?u():r(o,()=>{u(),a&&a()})};i?i(o,u,d):d()}else l(o,t,n)},Q=(e,t,n,r=!1,i=!1)=>{let l,{type:s,props:o,ref:a,children:c,dynamicChildren:u,shapeFlag:d,patchFlag:p,dirs:h,cacheIndex:f,memo:g}=e;if(-2===p&&(i=!1),null!=a&&(eI(),nY(a,null,n,e,!0),eO()),null!=f&&(t.renderCache[f]=void 0),256&d)return void t.ctx.deactivate(e);let m=1&d&&h,y=!rl(e);if(y&&(l=o&&o.onVnodeBeforeUnmount)&&lm(l,t,e),6&d)ee(e.component,n,r);else{if(128&d)return void e.suspense.unmount(n,r);m&&nu(e,null,t,\"beforeUnmount\"),64&d?e.type.remove(e,t,n,el,r):u&&!u.hasOnce&&(s!==iQ||p>0&&64&p)?et(u,t,n,!1,!0):(s===iQ&&384&p||!i&&16&d)&&et(c,t,n),r&&Z(e)}let b=null!=g&&null==f;(y&&(l=o&&o.onVnodeUnmounted)||m||b)&&iM(()=>{l&&lm(l,t,e),m&&nu(e,null,t,\"unmounted\"),b&&(e.el=null)},n)},Z=e=>{let{type:t,el:n,anchor:r,transition:i}=e;if(t===iQ)return void Y(n,r);if(t===i0)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=y(e),s(e),e=n;s(t)})(e);let l=()=>{s(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(1&e.shapeFlag&&i&&!i.persisted){let{leave:t,delayLeave:r}=i,s=()=>t(n,l);r?r(e.el,l,s):s()}else l()},Y=(e,t)=>{let n;for(;e!==t;)n=y(e),s(e),e=n;s(t)},ee=(e,t,n)=>{let{bum:r,scope:i,job:l,subTree:s,um:o,m:a,a:c}=e;iU(a),iU(c),r&&H(r),i.stop(),l&&(l.flags|=8,Q(s,e,t,n)),o&&iM(o,t),iM(()=>{e.isUnmounted=!0},t)},et=(e,t,n,r=!1,i=!1,l=0)=>{for(let s=l;s<e.length;s++)Q(e[s],t,n,r,i)},en=e=>{if(6&e.shapeFlag)return en(e.component.subTree);if(128&e.shapeFlag)return e.suspense.next();let t=y(e.anchor||e.el),n=t&&t[nk];return n?y(n):t},er=!1,ei=(e,t,n)=>{let r;null==e?t._vnode&&(Q(t._vnode,null,null,!0),r=t._vnode.component):x(t._vnode||null,e,t,null,null,null,n),t._vnode=e,er||(er=!0,t7(r),ne(),er=!1)},el={p:x,um:Q,m:X,r:Z,mt:j,mc:O,pc:K,pbc:D,n:en,o:e};return t&&([r,i]=t(el)),{render:ei,hydrate:r,createApp:(n=r,function(e,t=null){w(e)||(e=S({},e)),null==t||E(t)||(t=null);let r=io(),i=new WeakSet,l=[],s=!1,o=r.app={_uid:ia++,_component:e,_props:t,_container:null,_context:r,_instance:null,version:lB,get config(){return r.config},set config(v){},use:(e,...t)=>(i.has(e)||(e&&w(e.install)?(i.add(e),e.install(o,...t)):w(e)&&(i.add(e),e(o,...t))),o),mixin:e=>(r.mixins.includes(e)||r.mixins.push(e),o),component:(e,t)=>t?(r.components[e]=t,o):r.components[e],directive:(e,t)=>t?(r.directives[e]=t,o):r.directives[e],mount(i,l,a){if(!s){let c=o._ceVNode||ls(e,t);return c.appContext=r,!0===a?a=\"svg\":!1===a&&(a=void 0),l&&n?n(c,i):ei(c,i,a),s=!0,o._container=i,i.__vue_app__=o,lP(c.component)}},onUnmount(e){l.push(e)},unmount(){s&&(tX(l,o._instance,16),ei(null,o._container),delete o._container.__vue_app__)},provide:(e,t)=>(r.provides[e]=t,o),runWithContext(e){let t=ic;ic=o;try{return e()}finally{ic=t}}};return o})}}function i$({type:e,props:t},n){return\"svg\"===n&&\"foreignObject\"===e||\"mathml\"===n&&\"annotation-xml\"===e&&t&&t.encoding&&t.encoding.includes(\"html\")?void 0:n}function iV({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function iB(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ij(e,t,n=!1){let r=e.children,i=t.children;if(T(r)&&T(i))for(let e=0;e<r.length;e++){let t=r[e],l=i[e];1&l.shapeFlag&&!l.dynamicChildren&&((l.patchFlag<=0||32===l.patchFlag)&&((l=i[e]=lh(i[e])).el=t.el),n||-2===l.patchFlag||ij(t,l)),l.type===iZ&&(-1===l.patchFlag&&(l=i[e]=lh(l)),l.el=t.el),l.type!==iY||l.el||(l.el=t.el)}}function iU(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}let iH=e=>e.__isSuspense,iq=0,iW={name:\"Suspense\",__isSuspense:!0,process(e,t,n,r,i,l,s,o,a,c){if(null==e)!function(e,t,n,r,i,l,s,o,a){let{p:c,o:{createElement:u}}=a,d=u(\"div\"),p=e.suspense=iz(e,i,r,t,d,n,l,s,o,a);c(null,p.pendingBranch=e.ssContent,d,null,r,p,l,s),p.deps>0?(iK(e,\"onPending\"),iK(e,\"onFallback\"),c(null,e.ssFallback,t,n,r,null,l,s),iX(p,e.ssFallback)):p.resolve(!1,!0)}(t,n,r,i,l,s,o,a,c);else{if(l&&l.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}!function(e,t,n,r,i,l,s,o,{p:a,um:c,o:{createElement:u}}){let d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;let p=t.ssContent,h=t.ssFallback,{activeBranch:f,pendingBranch:g,isInFallback:m,isHydrating:y}=d;if(g)d.pendingBranch=p,lt(g,p)?(a(g,p,d.hiddenContainer,null,i,d,l,s,o),d.deps<=0?d.resolve():m&&!y&&(a(f,h,n,r,i,null,l,s,o),iX(d,h))):(d.pendingId=iq++,y?(d.isHydrating=!1,d.activeBranch=g):c(g,i,d),d.deps=0,d.effects.length=0,d.hiddenContainer=u(\"div\"),m?(a(null,p,d.hiddenContainer,null,i,d,l,s,o),d.deps<=0?d.resolve():(a(f,h,n,r,i,null,l,s,o),iX(d,h))):f&&lt(f,p)?(a(f,p,n,r,i,d,l,s,o),d.resolve(!0)):(a(null,p,d.hiddenContainer,null,i,d,l,s,o),d.deps<=0&&d.resolve()));else if(f&&lt(f,p))a(f,p,n,r,i,d,l,s,o),iX(d,p);else if(iK(t,\"onPending\"),d.pendingBranch=p,512&p.shapeFlag?d.pendingId=p.component.suspenseId:d.pendingId=iq++,a(null,p,d.hiddenContainer,null,i,d,l,s,o),d.deps<=0)d.resolve();else{let{timeout:e,pendingId:t}=d;e>0?setTimeout(()=>{d.pendingId===t&&d.fallback(h)},e):0===e&&d.fallback(h)}}(e,t,n,r,i,s,o,a,c)}},hydrate:function(e,t,n,r,i,l,s,o,a){let c=t.suspense=iz(t,r,n,e.parentNode,document.createElement(\"div\"),null,i,l,s,o,!0),u=a(e,c.pendingBranch=t.ssContent,n,c,l,s);return 0===c.deps&&c.resolve(!1,!0),u},normalize:function(e){let{shapeFlag:t,children:n}=e,r=32&t;e.ssContent=iJ(r?n.default:n),e.ssFallback=r?iJ(n.fallback):ls(iY)}};function iK(e,t){let n=e.props&&e.props[t];w(n)&&n()}function iz(e,t,n,r,i,l,s,o,a,c,u=!1){var d;let p,h,{p:f,m:g,um:m,n:y,o:{parentNode:b,remove:_}}=c,S=null!=(p=(d=e).props&&d.props.suspensible)&&!1!==p;S&&t&&t.pendingBranch&&(h=t.pendingId,t.deps++);let x=e.props?K(e.props.timeout):void 0,C=l,k={vnode:e,parent:t,parentComponent:n,namespace:s,container:r,hiddenContainer:i,deps:0,pendingId:iq++,timeout:\"number\"==typeof x?x:-1,activeBranch:null,isFallbackMountPending:!1,pendingBranch:null,isInFallback:!u,isHydrating:u,isUnmounted:!1,effects:[],resolve(e=!1,n=!1){let{vnode:r,activeBranch:i,pendingBranch:s,pendingId:o,effects:a,parentComponent:c,container:u,isInFallback:d}=k,p=!1;if(k.isHydrating)k.isHydrating=!1;else if(!e){p=i&&s.transition&&\"out-in\"===s.transition.mode;let e=!1;p&&(i.transition.afterLeave=()=>{o===k.pendingId&&(g(s,u,l!==C||e?l:y(i),0),t9(a),d&&r.ssFallback&&(r.ssFallback.el=null))}),i&&!k.isFallbackMountPending&&(b(i.el)===u&&(l=y(i),e=!0),m(i,c,k,!0),!p&&d&&r.ssFallback&&iM(()=>r.ssFallback.el=null,k)),p||g(s,u,l,0)}k.isFallbackMountPending=!1,iX(k,s),k.pendingBranch=null,k.isInFallback=!1;let f=k.parent,_=!1;for(;f;){if(f.pendingBranch){f.effects.push(...a),_=!0;break}f=f.parent}_||p||t9(a),k.effects=[],S&&t&&t.pendingBranch&&h===t.pendingId&&(t.deps--,0!==t.deps||n||t.resolve()),iK(r,\"onResolve\")},fallback(e){if(!k.pendingBranch)return;let{vnode:t,activeBranch:n,parentComponent:r,container:i,namespace:l}=k;iK(t,\"onFallback\");let s=y(n),c=()=>{k.isFallbackMountPending=!1,k.isInFallback&&(f(null,e,i,s,r,null,l,o,a),iX(k,e))},u=e.transition&&\"out-in\"===e.transition.mode;u&&(k.isFallbackMountPending=!0,n.transition.afterLeave=c),k.isInFallback=!0,m(n,r,null,!0),u||c()},move(e,t,n){k.activeBranch&&g(k.activeBranch,e,t,n),k.container=e},next:()=>k.activeBranch&&y(k.activeBranch),registerDep(e,t,n){let r=!!k.pendingBranch;r&&k.deps++;let i=e.vnode.el;e.asyncDep.catch(t=>{tQ(t,e,0)}).then(l=>{if(e.isUnmounted||k.isUnmounted||k.pendingId!==e.suspenseId)return;lC(),e.asyncResolved=!0;let{vnode:o}=e;lN(e,l,!1),i&&(o.el=i);let a=!i&&e.subTree.el;t(e,o,b(i||e.subTree.el),i?null:y(e.subTree),k,s,n),a&&(o.placeholder=null,_(a)),iS(e,o.el),r&&0==--k.deps&&k.resolve()})},unmount(e,t){k.isUnmounted=!0,k.activeBranch&&m(k.activeBranch,n,e,t),k.pendingBranch&&m(k.pendingBranch,n,e,t)}};return k}function iJ(e){let t;if(w(e)){let n=i4&&e._c;n&&(e._d=!1,i6()),e=e(),n&&(e._d=!0,t=i2,i3())}return T(e)&&(e=function(e){let t;for(let n=0;n<e.length;n++){let r=e[n];if(!le(r))return;if(r.type!==iY||\"v-if\"===r.children)if(t)return;else t=r}return t}(e)),e=lp(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(t=>t!==e)),e}function iG(e,t){t&&t.pendingBranch?T(e)?t.effects.push(...e):t.effects.push(e):t9(e)}function iX(e,t){e.activeBranch=t;let{vnode:n,parentComponent:r}=e,i=t.el;for(;!i&&t.component;)i=(t=t.component.subTree).el;n.el=i,r&&r.subTree===n&&(r.vnode.el=i,iS(r,i))}let iQ=Symbol.for(\"v-fgt\"),iZ=Symbol.for(\"v-txt\"),iY=Symbol.for(\"v-cmt\"),i0=Symbol.for(\"v-stc\"),i1=[],i2=null;function i6(e=!1){i1.push(i2=e?null:[])}function i3(){i1.pop(),i2=i1[i1.length-1]||null}let i4=1;function i8(e,t=!1){i4+=e,e<0&&i2&&t&&(i2.hasOnce=!0)}function i5(e){return e.dynamicChildren=i4>0?i2||g:null,i3(),i4>0&&i2&&i2.push(e),e}function i9(e,t,n,r,i,l){return i5(ll(e,t,n,r,i,l,!0))}function i7(e,t,n,r,i){return i5(ls(e,t,n,r,i,!0))}function le(e){return!!e&&!0===e.__v_isVNode}function lt(e,t){return e.type===t.type&&e.key===t.key}function ln(e){}let lr=({key:e})=>null!=e?e:null,li=({ref:e,ref_key:t,ref_for:n})=>(\"number\"==typeof e&&(e=\"\"+e),null!=e?N(e)||tC(e)||w(e)?{i:nn,r:e,k:t,f:!!n}:e:null);function ll(e,t=null,n=null,r=0,i=null,l=+(e!==iQ),s=!1,o=!1){let a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&lr(t),ref:t&&li(t),scopeId:nr,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:l,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:nn};return o?(lf(a,n),128&l&&e.normalize(a)):n&&(a.shapeFlag|=N(n)?8:16),i4>0&&!s&&i2&&(a.patchFlag>0||6&l)&&32!==a.patchFlag&&i2.push(a),a}let ls=function(e,t=null,n=null,r=0,i=null,l=!1){var s;if(e&&e!==rR||(e=iY),le(e)){let r=la(e,t,!0);return n&&lf(r,n),i4>0&&!l&&i2&&(6&r.shapeFlag?i2[i2.indexOf(e)]=r:i2.push(r)),r.patchFlag=-2,r}if(w(s=e)&&\"__vccOpts\"in s&&(e=e.__vccOpts),t){let{class:e,style:n}=t=lo(t);e&&!N(e)&&(t.class=ee(e)),E(n)&&(ty(n)&&!T(n)&&(n=S({},n)),t.style=G(n))}let o=N(e)?1:iH(e)?128:e.__isTeleport?64:E(e)?4:2*!!w(e);return ll(e,t,n,r,i,o,l,!0)};function lo(e){return e?ty(e)||iC(e)?S({},e):e:null}function la(e,t,n=!1,r=!1){let{props:i,ref:l,patchFlag:s,children:o,transition:a}=e,c=t?lg(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&lr(c),ref:t&&t.ref?n&&l?T(l)?l.concat(li(t)):[l,li(t)]:li(t):l,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==iQ?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&la(e.ssContent),ssFallback:e.ssFallback&&la(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&r&&nW(u,a.clone(u)),u}function lc(e=\" \",t=0){return ls(iZ,null,e,t)}function lu(e,t){let n=ls(i0,null,e);return n.staticCount=t,n}function ld(e=\"\",t=!1){return t?(i6(),i7(iY,null,e)):ls(iY,null,e)}function lp(e){return null==e||\"boolean\"==typeof e?ls(iY):T(e)?ls(iQ,null,e.slice()):le(e)?lh(e):ls(iZ,null,String(e))}function lh(e){return null===e.el&&-1!==e.patchFlag||e.memo?e:la(e)}function lf(e,t){let n=0,{shapeFlag:r}=e;if(null==t)t=null;else if(T(t))n=16;else if(\"object\"==typeof t)if(65&r){let n=t.default;n&&(n._c&&(n._d=!1),lf(e,n()),n._c&&(n._d=!0));return}else{n=32;let r=t._;r||iC(t)?3===r&&nn&&(1===nn.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=nn}else w(t)?(t={default:t,_ctx:nn},n=32):(t=String(t),64&r?(n=16,t=[lc(t)]):n=8);e.children=t,e.shapeFlag|=n}function lg(...e){let t={};for(let n=0;n<e.length;n++){let r=e[n];for(let e in r)if(\"class\"===e)t.class!==r.class&&(t.class=ee([t.class,r.class]));else if(\"style\"===e)t.style=G([t.style,r.style]);else if(b(e)){let n=t[e],i=r[e];i&&n!==i&&!(T(n)&&n.includes(i))?t[e]=n?[].concat(n,i):i:null!=i||null!=n||_(e)||(t[e]=i)}else\"\"!==e&&(t[e]=r[e])}return t}function lm(e,t,n,r=null){tX(e,t,7,[n,r])}let lv=io(),ly=0;function lb(e,t,n){let r=e.type,i=(t?t.appContext:e.appContext)||lv,l={uid:ly++,vnode:e,type:r,parent:t,appContext:i,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new eh(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(i.provides),ids:t?t.ids:[\"\",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:function e(t,n,r=!1){let i=r?iw:n.propsCache,l=i.get(t);if(l)return l;let s=t.props,o={},a=[],c=!1;if(!w(t)){let i=t=>{c=!0;let[r,i]=e(t,n,!0);S(o,r),i&&a.push(...i)};!r&&n.mixins.length&&n.mixins.forEach(i),t.extends&&i(t.extends),t.mixins&&t.mixins.forEach(i)}if(!s&&!c)return E(t)&&i.set(t,g),g;if(T(s))for(let e=0;e<s.length;e++){let t=L(s[e]);iN(t)&&(o[t]=f)}else if(s)for(let e in s){let t=L(e);if(iN(t)){let n=s[e],r=o[t]=T(n)||w(n)?{type:n}:S({},n),i=r.type,l=!1,c=!0;if(T(i))for(let e=0;e<i.length;++e){let t=i[e],n=w(t)&&t.name;if(\"Boolean\"===n){l=!0;break}\"String\"===n&&(c=!1)}else l=w(i)&&\"Boolean\"===i.name;r[0]=l,r[1]=c,(l||k(r,\"default\"))&&a.push(t)}}let u=[o,a];return E(t)&&i.set(t,u),u}(r,i),emitsOptions:function e(t,n,r=!1){let i=r?ih:n.emitsCache,l=i.get(t);if(void 0!==l)return l;let s=t.emits,o={},a=!1;if(!w(t)){let i=t=>{let r=e(t,n,!0);r&&(a=!0,S(o,r))};!r&&n.mixins.length&&n.mixins.forEach(i),t.extends&&i(t.extends),t.mixins&&t.mixins.forEach(i)}return s||a?(T(s)?s.forEach(e=>o[e]=null):S(o,s),E(t)&&i.set(t,o),o):(E(t)&&i.set(t,null),null)}(r,i),emit:null,emitted:null,propsDefaults:f,inheritAttrs:r.inheritAttrs,ctx:f,data:f,props:f,attrs:f,slots:f,refs:f,setupState:f,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return l.ctx={_:l},l.root=t?t.root:l,l.emit=ip.bind(null,l),e.ce&&e.ce(l),l}let l_=null,lS=()=>l_||nn;{let e=z(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach(t=>t(e)):r[0](e)}};l=t(\"__VUE_INSTANCE_SETTERS__\",e=>l_=e),s=t(\"__VUE_SSR_SETTERS__\",e=>lT=e)}let lx=e=>{let t=l_;return l(e),e.scope.on(),()=>{e.scope.off(),l(t)}},lC=()=>{l_&&l_.scope.off(),l(null)};function lk(e){return 4&e.vnode.shapeFlag}let lT=!1;function lw(e,t=!1,n=!1){t&&s(t);let{props:r,children:i}=e.vnode,l=lk(e);!function(e,t,n,r=!1){let i={},l=Object.create(ix);for(let n in e.propsDefaults=Object.create(null),ik(e,t,i,l),e.propsOptions[0])n in i||(i[n]=void 0);n?e.props=r?i:td(i):e.type.props?e.props=i:e.props=l,e.attrs=l}(e,r,l,t);var o=n||t;let a=e.slots=Object.create(ix);if(32&e.vnode.shapeFlag){let e=i._;e?(iP(a,i,o),o&&q(a,\"_\",e,!0)):iI(i,a)}else i&&iO(e,i);let c=l?function(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,rH);let{setup:r}=n;if(r){eI();let n=e.setupContext=r.length>1?lO(e):null,i=lx(e),l=tG(r,e,0,[e.props,n]),s=R(l);if(eO(),i(),(s||e.sp)&&!rl(e)&&nG(e),s){if(l.then(lC,lC),t)return l.then(n=>{lN(e,n,t)}).catch(t=>{tQ(t,e,0)});e.asyncDep=l}else lN(e,l,t)}else lR(e,t)}(e,t):void 0;return t&&s(!1),c}function lN(e,t,n){w(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:E(t)&&(e.setupState=tO(t)),lR(e,n)}function lA(e){o=e,a=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,rq))}}let lE=()=>!o;function lR(e,t,n){let r=e.type;if(!e.render){if(!t&&o&&!r.render){let t=r.template||r9(e).template;if(t){let{isCustomElement:n,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:s}=r,a=S(S({isCustomElement:n,delimiters:l},i),s);r.render=o(t,a)}}e.render=r.render||m,a&&a(e)}{let t=lx(e);eI();try{!function(e){let t=r9(e),n=e.proxy,r=e.ctx;r8=!1,t.beforeCreate&&r5(t.beforeCreate,e,\"bc\");let{data:i,computed:l,methods:s,watch:o,provide:a,inject:c,created:u,beforeMount:d,mounted:p,beforeUpdate:h,updated:f,activated:g,deactivated:y,beforeUnmount:b,unmounted:_,render:S,renderTracked:x,renderTriggered:C,errorCaptured:k,serverPrefetch:A,expose:R,inheritAttrs:I,components:O,directives:P}=t;if(c&&function(e,t){for(let n in T(e)&&(e=ir(e)),e){let r,i=e[n];tC(r=E(i)?\"default\"in i?np(i.from||n,i.default,!0):np(i.from||n):np(i))?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>r.value,set:e=>r.value=e}):t[n]=r}}(c,r),s)for(let e in s){let t=s[e];w(t)&&(r[e]=t.bind(n))}if(i){let t=i.call(n,n);E(t)&&(e.data=tu(t))}if(r8=!0,l)for(let e in l){let t=l[e],i=w(t)?t.bind(n,n):w(t.get)?t.get.bind(n,n):m,s=lD({get:i,set:!w(t)&&w(t.set)?t.set.bind(n):m});Object.defineProperty(r,e,{enumerable:!0,configurable:!0,get:()=>s.value,set:e=>s.value=e})}if(o)for(let e in o)!function e(t,n,r,i){let l=i.includes(\".\")?nx(r,i):()=>r[i];if(N(t)){let e=n[t];w(e)&&nb(l,e)}else if(w(t))nb(l,t.bind(r));else if(E(t))if(T(t))t.forEach(t=>e(t,n,r,i));else{let e=w(t.handler)?t.handler.bind(r):n[t.handler];w(e)&&nb(l,e,t)}}(o[e],r,n,e);if(a){let e=w(a)?a.call(n):a;Reflect.ownKeys(e).forEach(t=>{nd(t,e[t])})}function M(e,t){T(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(u&&r5(u,e,\"c\"),M(ry,d),M(rb,p),M(r_,h),M(rS,f),M(rd,g),M(rp,y),M(rN,k),M(rw,x),M(rT,C),M(rx,b),M(rC,_),M(rk,A),T(R))if(R.length){let t=e.exposed||(e.exposed={});R.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||(e.exposed={});S&&e.render===m&&(e.render=S),null!=I&&(e.inheritAttrs=I),O&&(e.components=O),P&&(e.directives=P),A&&nG(e)}(e)}finally{eO(),t()}}}let lI={get:(e,t)=>(ej(e,\"get\",\"\"),e[t])};function lO(e){return{attrs:new Proxy(e.attrs,lI),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function lP(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(tO(t_(e.exposed)),{get:(t,n)=>n in t?t[n]:n in rj?rj[n](e):void 0,has:(e,t)=>t in e||t in rj})):e.proxy}function lM(e,t=!0){return w(e)?e.displayName||e.name:e.name||t&&e.__name}let lD=(e,t)=>(function(e,t=!1){let n,r;return w(e)?n=e:(n=e.get,r=e.set),new tV(n,r,t)})(e,lT);function lF(e,t,n){try{i8(-1);let r=arguments.length;if(2!==r)return r>3?n=Array.prototype.slice.call(arguments,2):3===r&&le(n)&&(n=[n]),ls(e,t,n);if(!E(t)||T(t))return ls(e,null,t);if(le(t))return ls(e,null,[t]);return ls(e,t)}finally{i8(1)}}function lL(){}function l$(e,t,n,r){let i=n[r];if(i&&lV(i,e))return i;let l=t();return l.memo=e.slice(),l.cacheIndex=r,n[r]=l}function lV(e,t){let n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++)if(U(n[e],t[e]))return!1;return i4>0&&i2&&i2.push(e),!0}let lB=\"3.5.35\",lj=m,lU=null,lH,lq=m,lW={createComponentInstance:lb,setupComponent:lw,renderComponentRoot:im,setCurrentRenderingInstance:ni,isVNode:le,normalizeVNode:lp,getComponentPublicInstance:lP,ensureValidVNode:r$,pushWarningContext:function(e){},popWarningContext:function(){}},lK=null,lz=null,lJ=null,lG=\"u\">typeof window&&window.trustedTypes;if(lG)try{p=lG.createPolicy(\"vue\",{createHTML:e=>e})}catch(e){}let lX=p?e=>p.createHTML(e):e=>e,lQ=\"u\">typeof document?document:null,lZ=lQ&&lQ.createElement(\"template\"),lY={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i=\"svg\"===t?lQ.createElementNS(\"http://www.w3.org/2000/svg\",e):\"mathml\"===t?lQ.createElementNS(\"http://www.w3.org/1998/Math/MathML\",e):n?lQ.createElement(e,{is:n}):lQ.createElement(e);return\"select\"===e&&r&&null!=r.multiple&&i.setAttribute(\"multiple\",r.multiple),i},createText:e=>lQ.createTextNode(e),createComment:e=>lQ.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>lQ.querySelector(e),setScopeId(e,t){e.setAttribute(t,\"\")},insertStaticContent(e,t,n,r,i,l){let s=n?n.previousSibling:t.lastChild;if(i&&(i===l||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),i!==l&&(i=i.nextSibling););else{lZ.innerHTML=lX(\"svg\"===r?`<svg>${e}</svg>`:\"mathml\"===r?`<math>${e}</math>`:e);let i=lZ.content;if(\"svg\"===r||\"mathml\"===r){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},l0=\"transition\",l1=\"animation\",l2=Symbol(\"_vtc\"),l6={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},l3=S({},nL,l6),l4=((og=(e,{slots:t})=>lF(nB,l9(e),t)).displayName=\"Transition\",og.props=l3,og),l8=(e,t=[])=>{T(e)?e.forEach(e=>e(...t)):e&&e(...t)},l5=e=>!!e&&(T(e)?e.some(e=>e.length>1):e.length>1);function l9(e){let t={};for(let n in e)n in l6||(t[n]=e[n]);if(!1===e.css)return t;let{name:n=\"v\",type:r,duration:i,enterFromClass:l=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:o=`${n}-enter-to`,appearFromClass:a=l,appearActiveClass:c=s,appearToClass:u=o,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,f=function(e){if(null==e)return null;{if(E(e))return[function(e){return K(e)}(e.enter),function(e){return K(e)}(e.leave)];let t=function(e){return K(e)}(e);return[t,t]}}(i),g=f&&f[0],m=f&&f[1],{onBeforeEnter:y,onEnter:b,onEnterCancelled:_,onLeave:x,onLeaveCancelled:C,onBeforeAppear:k=y,onAppear:T=b,onAppearCancelled:w=_}=t,N=(e,t,n,r)=>{e._enterCancelled=r,se(e,t?u:o),se(e,t?c:s),n&&n()},A=(e,t)=>{e._isLeaving=!1,se(e,d),se(e,h),se(e,p),t&&t()},R=e=>(t,n)=>{let i=e?T:b,s=()=>N(t,e,n);l8(i,[t,s]),st(()=>{se(t,e?a:l),l7(t,e?u:o),l5(i)||sr(t,r,g,s)})};return S(t,{onBeforeEnter(e){l8(y,[e]),l7(e,l),l7(e,s)},onBeforeAppear(e){l8(k,[e]),l7(e,a),l7(e,c)},onEnter:R(!1),onAppear:R(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>A(e,t);l7(e,d),e._enterCancelled?(l7(e,p),so(e)):(so(e),l7(e,p)),st(()=>{e._isLeaving&&(se(e,d),l7(e,h),l5(x)||sr(e,r,m,n))}),l8(x,[e,n])},onEnterCancelled(e){N(e,!1,void 0,!0),l8(_,[e])},onAppearCancelled(e){N(e,!0,void 0,!0),l8(w,[e])},onLeaveCancelled(e){A(e),l8(C,[e])}})}function l7(e,t){t.split(/\\s+/).forEach(t=>t&&e.classList.add(t)),(e[l2]||(e[l2]=new Set)).add(t)}function se(e,t){t.split(/\\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[l2];n&&(n.delete(t),n.size||(e[l2]=void 0))}function st(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let sn=0;function sr(e,t,n,r){let i=e._endId=++sn,l=()=>{i===e._endId&&r()};if(null!=n)return setTimeout(l,n);let{type:s,timeout:o,propCount:a}=si(e,t);if(!s)return r();let c=s+\"end\",u=0,d=()=>{e.removeEventListener(c,p),l()},p=t=>{t.target===e&&++u>=a&&d()};setTimeout(()=>{u<a&&d()},o+1),e.addEventListener(c,p)}function si(e,t){let n=window.getComputedStyle(e),r=e=>(n[e]||\"\").split(\", \"),i=r(`${l0}Delay`),l=r(`${l0}Duration`),s=sl(i,l),o=r(`${l1}Delay`),a=r(`${l1}Duration`),c=sl(o,a),u=null,d=0,p=0;t===l0?s>0&&(u=l0,d=s,p=l.length):t===l1?c>0&&(u=l1,d=c,p=a.length):p=(u=(d=Math.max(s,c))>0?s>c?l0:l1:null)?u===l0?l.length:a.length:0;let h=u===l0&&/\\b(?:transform|all)(?:,|$)/.test(r(`${l0}Property`).toString());return{type:u,timeout:d,propCount:p,hasTransform:h}}function sl(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((t,n)=>ss(t)+ss(e[n])))}function ss(e){return\"auto\"===e?0:1e3*Number(e.slice(0,-1).replace(\",\",\".\"))}function so(e){return(e?e.ownerDocument:document).body.offsetHeight}let sa=Symbol(\"_vod\"),sc=Symbol(\"_vsh\"),su={name:\"show\",beforeMount(e,{value:t},{transition:n}){e[sa]=\"none\"===e.style.display?\"\":e.style.display,n&&t?n.beforeEnter(e):sd(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),sd(e,!0),r.enter(e)):r.leave(e,()=>{sd(e,!1)}):sd(e,t))},beforeUnmount(e,{value:t}){sd(e,t)}};function sd(e,t){e.style.display=t?e[sa]:\"none\",e[sc]=!t}let sp=Symbol(\"\");function sh(e){let t=lS();if(!t)return;let n=t.ut=(n=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner=\"${t.uid}\"]`)).forEach(e=>sf(e,n))},r=()=>{let r=e(t.proxy);t.ce?sf(t.ce,r):function e(t,n){if(128&t.shapeFlag){let r=t.suspense;t=r.activeBranch,r.pendingBranch&&!r.isHydrating&&r.effects.push(()=>{e(r.activeBranch,n)})}for(;t.component;)t=t.component.subTree;if(1&t.shapeFlag&&t.el)sf(t.el,n);else if(t.type===iQ)t.children.forEach(t=>e(t,n));else if(t.type===i0){let{el:e,anchor:r}=t;for(;e&&(sf(e,n),e!==r);)e=e.nextSibling}}(t.subTree,r),n(r)};r_(()=>{t9(r)}),rb(()=>{nb(r,m,{flush:\"post\"});let e=new MutationObserver(r);e.observe(t.subTree.el.parentNode,{childList:!0}),rC(()=>e.disconnect())})}function sf(e,t){if(1===e.nodeType){let r=e.style,i=\"\";for(let e in t){var n;let l=null==(n=t[e])?\"initial\":\"string\"==typeof n?\"\"===n?\" \":n:String(n);r.setProperty(`--${e}`,l),i+=`--${e}: ${l};`}r[sp]=i}}let sg=/(?:^|;)\\s*display\\s*:/,sm=/\\s*!important$/;function sv(e,t,n){if(T(n))n.forEach(n=>sv(e,t,n));else if(null==n&&(n=\"\"),t.startsWith(\"--\"))e.setProperty(t,n);else{let r=function(e,t){let n=sb[t];if(n)return n;let r=L(t);if(\"filter\"!==r&&r in e)return sb[t]=r;r=B(r);for(let n=0;n<sy.length;n++){let i=sy[n]+r;if(i in e)return sb[t]=i}return t}(e,t);sm.test(n)?e.setProperty(V(r),n.replace(sm,\"\"),\"important\"):e[r]=n}}let sy=[\"Webkit\",\"Moz\",\"ms\"],sb={},s_=\"http://www.w3.org/1999/xlink\";function sS(e,t,n,r,i,l=es(t)){if(r&&t.startsWith(\"xlink:\"))null==n?e.removeAttributeNS(s_,t.slice(6,t.length)):e.setAttributeNS(s_,t,n);else null==n||l&&!(n||\"\"===n)?e.removeAttribute(t):e.setAttribute(t,l?\"\":A(n)?String(n):n)}function sx(e,t,n,r,i){if(\"innerHTML\"===t||\"textContent\"===t){null!=n&&(e[t]=\"innerHTML\"===t?lX(n):n);return}let l=e.tagName;if(\"value\"===t&&\"PROGRESS\"!==l&&!l.includes(\"-\")){let r=\"OPTION\"===l?e.getAttribute(\"value\")||\"\":e.value,i=null==n?\"checkbox\"===e.type?\"on\":\"\":String(n);r===i&&\"_value\"in e||(e.value=i),null==n&&e.removeAttribute(t),e._value=n;return}let s=!1;if(\"\"===n||null==n){let r=typeof e[t];if(\"boolean\"===r){var o;n=!!(o=n)||\"\"===o}else null==n&&\"string\"===r?(n=\"\",s=!0):\"number\"===r&&(n=0,s=!0)}try{e[t]=n}catch(e){}s&&e.removeAttribute(i||t)}function sC(e,t,n,r){e.addEventListener(t,n,r)}let sk=Symbol(\"_vei\"),sT=/(?:Once|Passive|Capture)$/,sw=0,sN=Promise.resolve(),sA=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&e.charCodeAt(2)>96&&123>e.charCodeAt(2),sE=(e,t,n,r,i,l)=>{let s=\"svg\"===i;if(\"class\"===t){var o;let t;o=r,(t=e[l2])&&(o=(o?[o,...t]:[...t]).join(\" \")),null==o?e.removeAttribute(\"class\"):s?e.setAttribute(\"class\",o):e.className=o}else\"style\"===t?function(e,t,n){let r=e.style,i=N(n),l=!1;if(n&&!i){if(t)if(N(t))for(let e of t.split(\";\")){let t=e.slice(0,e.indexOf(\":\")).trim();null==n[t]&&sv(r,t,\"\")}else for(let e in t)null==n[e]&&sv(r,e,\"\");for(let i in n){var s,o,a,c;\"display\"===i&&(l=!0);let u=n[i];null!=u?(s=e,o=i,a=!N(t)&&t?t[i]:void 0,c=u,\"TEXTAREA\"===s.tagName&&(\"width\"===o||\"height\"===o)&&N(c)&&a===c||sv(r,i,u)):sv(r,i,\"\")}}else if(i){if(t!==n){let e=r[sp];e&&(n+=\";\"+e),r.cssText=n,l=sg.test(n)}}else t&&e.removeAttribute(\"style\");sa in e&&(e[sa]=l?r.display:\"\",e[sc]&&(r.display=\"none\"))}(e,n,r):b(t)?_(t)||function(e,t,n,r=null){let i=e[sk]||(e[sk]={}),l=i[t];if(n&&l)l.value=n;else{let[a,c]=function(e){let t;if(sT.test(e)){let n;for(t={};n=e.match(sT);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[\":\"===e[2]?e.slice(3):V(e.slice(2)),t]}(t);if(n){var s,o;let l;sC(e,a,i[t]=(s=n,o=r,(l=e=>{if(e._vts){if(e._vts<=l.attached)return}else e._vts=Date.now();let t=l.value;if(T(t)){let n=e.stopImmediatePropagation;e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0};let r=t.slice(),i=[e];for(let t=0;t<r.length&&!e._stopped;t++){let e=r[t];e&&tX(e,o,5,i)}}else tX(t,o,5,[e])}).value=s,l.attached=sw||(sN.then(()=>sw=0),sw=Date.now()),l),c)}else l&&(e.removeEventListener(a,l,c),i[t]=void 0)}}(e,t,r,l):(\".\"===t[0]?(t=t.slice(1),0):\"^\"===t[0]?(t=t.slice(1),1):!function(e,t,n,r){if(r)return!!(\"innerHTML\"===t||\"textContent\"===t||t in e&&sA(t)&&w(n));if(\"spellcheck\"===t||\"draggable\"===t||\"translate\"===t||\"autocorrect\"===t||\"sandbox\"===t&&\"IFRAME\"===e.tagName||\"form\"===t||\"list\"===t&&\"INPUT\"===e.tagName||\"type\"===t&&\"TEXTAREA\"===e.tagName)return!1;if(\"width\"===t||\"height\"===t){let t=e.tagName;if(\"IMG\"===t||\"VIDEO\"===t||\"CANVAS\"===t||\"SOURCE\"===t)return!1}return!(sA(t)&&N(n))&&t in e}(e,t,r,s))?e._isVueCE&&(function(e,t){let n=e._def.props;if(!n)return!1;let r=L(t);return Array.isArray(n)?n.some(e=>L(e)===r):Object.keys(n).some(e=>L(e)===r)}(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!N(r)))?sx(e,L(t),r,l,t):(\"true-value\"===t?e._trueValue=r:\"false-value\"===t&&(e._falseValue=r),sS(e,t,r,s)):(sx(e,t,r),e.tagName.includes(\"-\")||\"value\"!==t&&\"checked\"!==t&&\"selected\"!==t||sS(e,t,r,s,l,\"value\"!==t))},sR={};function sI(e,t,n){let r,i=nz(e,t);\"[object Object]\"===(r=i,I.call(r))&&(i=S({},i,t));class l extends sM{constructor(e){super(i,e,n)}}return l.def=i,l}let sO=(e,t)=>sI(e,t,ou),sP=\"u\">typeof HTMLElement?HTMLElement:class{};class sM extends sP{constructor(e,t={},n=oc){super(),this._def=e,this._props=t,this._createApp=n,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._patching=!1,this._dirty=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._styleAnchors=new WeakMap,this._ob=null,this.shadowRoot&&n!==oc?this._root=this.shadowRoot:!1!==e.shadowRoot?(this.attachShadow(S({},e.shadowRootOptions,{mode:\"open\"})),this._root=this.shadowRoot):this._root=this}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._resolved||this._parseSlots(),this._connected=!0;let e=this;for(;e=e&&(e.assignedSlot||e.parentNode||e.host);)if(e instanceof sM){this._parent=e;break}this._instance||(this._resolved?this._mount(this._def):e&&e._pendingResolve?this._pendingResolve=e._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(e=this._parent){e&&(this._instance.parent=e._instance,this._inheritParentContext(e))}_inheritParentContext(e=this._parent){e&&this._app&&Object.setPrototypeOf(this._app._context.provides,e._instance.provides)}disconnectedCallback(){this._connected=!1,t4(()=>{!this._connected&&(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null,this._teleportTargets&&(this._teleportTargets.clear(),this._teleportTargets=void 0))})}_processMutations(e){for(let t of e)this._setAttr(t.attributeName)}_resolveDef(){if(this._pendingResolve)return;for(let e=0;e<this.attributes.length;e++)this._setAttr(this.attributes[e].name);this._ob=new MutationObserver(this._processMutations.bind(this)),this._ob.observe(this,{attributes:!0});let e=(e,t=!1)=>{let n;this._resolved=!0,this._pendingResolve=void 0;let{props:r,styles:i}=e;if(r&&!T(r))for(let e in r){let t=r[e];(t===Number||t&&t.type===Number)&&(e in this._props&&(this._props[e]=K(this._props[e])),(n||(n=Object.create(null)))[L(e)]=!0)}this._numberProps=n,this._resolveProps(e),this.shadowRoot&&this._applyStyles(i),this._mount(e)},t=this._def.__asyncLoader;t?this._pendingResolve=t().then(t=>{t.configureApp=this._def.configureApp,e(this._def=t,!0)}):e(this._def)}_mount(e){this._app=this._createApp(e),this._inheritParentContext(),e.configureApp&&e.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);let t=this._instance&&this._instance.exposed;if(t)for(let e in t)k(this,e)||Object.defineProperty(this,e,{get:()=>tE(t[e])})}_resolveProps(e){let{props:t}=e,n=T(t)?t:Object.keys(t||{});for(let e of Object.keys(this))\"_\"!==e[0]&&n.includes(e)&&this._setProp(e,this[e]);for(let e of n.map(L))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t,!0,!this._patching)}})}_setAttr(e){if(e.startsWith(\"data-v-\"))return;let t=this.hasAttribute(e),n=t?this.getAttribute(e):sR,r=L(e);t&&this._numberProps&&this._numberProps[r]&&(n=K(n)),this._setProp(r,n,!1,!0)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!1){if(t!==this._props[e]&&(this._dirty=!0,t===sR?delete this._props[e]:(this._props[e]=t,\"key\"===e&&this._app&&(this._app._ceVNode.key=t)),r&&this._instance&&this._update(),n)){let n=this._ob;n&&(this._processMutations(n.takeRecords()),n.disconnect()),!0===t?this.setAttribute(V(e),\"\"):\"string\"==typeof t||\"number\"==typeof t?this.setAttribute(V(e),t+\"\"):t||this.removeAttribute(V(e)),n&&n.observe(this,{attributes:!0})}}_update(){let e=this._createVNode();this._app&&(e.appContext=this._app._context),oo(e,this._root)}_createVNode(){let e={};this.shadowRoot||(e.onVnodeMounted=e.onVnodeUpdated=this._renderSlots.bind(this));let t=ls(this._def,S(e,this._props));return this._instance||(t.ce=e=>{this._instance=e,e.ce=this,e.isCE=!0;let t=(e,t)=>{let n;this.dispatchEvent(new CustomEvent(e,\"[object Object]\"===(n=t[0],I.call(n))?S({detail:t},t[0]):{detail:t}))};e.emit=(e,...n)=>{t(e,n),V(e)!==e&&t(V(e),n)},this._setParent()}),t}_applyStyles(e,t,n){if(!e)return;if(t){if(t===this._def||this._styleChildren.has(t))return;this._styleChildren.add(t)}let r=this._nonce,i=this.shadowRoot,l=n?this._getStyleAnchor(n)||this._getStyleAnchor(this._def):this._getRootStyleInsertionAnchor(i),s=null;for(let o=e.length-1;o>=0;o--){let a=document.createElement(\"style\");r&&a.setAttribute(\"nonce\",r),a.textContent=e[o],i.insertBefore(a,s||l),s=a,0===o&&(n||this._styleAnchors.set(this._def,a),t&&this._styleAnchors.set(t,a))}}_getStyleAnchor(e){if(!e)return null;let t=this._styleAnchors.get(e);return t&&t.parentNode===this.shadowRoot?t:(t&&this._styleAnchors.delete(e),null)}_getRootStyleInsertionAnchor(e){for(let t=0;t<e.childNodes.length;t++){let n=e.childNodes[t];if(!(n instanceof HTMLStyleElement))return n}return null}_parseSlots(){let e,t=this._slots={};for(;e=this.firstChild;){let n=1===e.nodeType&&e.getAttribute(\"slot\")||\"default\";(t[n]||(t[n]=[])).push(e),this.removeChild(e)}}_renderSlots(){let e=this._getSlots(),t=this._instance.type.__scopeId;for(let n=0;n<e.length;n++){let r=e[n],i=r.getAttribute(\"name\")||\"default\",l=this._slots[i],s=r.parentNode;if(l)for(let e of l){if(t&&1===e.nodeType){let n,r=t+\"-s\",i=document.createTreeWalker(e,1);for(e.setAttribute(r,\"\");n=i.nextNode();)n.setAttribute(r,\"\")}s.insertBefore(e,r)}else for(;r.firstChild;)s.insertBefore(r.firstChild,r);s.removeChild(r)}}_getSlots(){let e=[this];this._teleportTargets&&e.push(...this._teleportTargets);let t=new Set;for(let n of e){let e=n.querySelectorAll(\"slot\");for(let n=0;n<e.length;n++)t.add(e[n])}return Array.from(t)}_injectChildStyle(e,t){this._applyStyles(e.styles,e,t)}_beginPatch(){this._patching=!0,this._dirty=!1}_endPatch(){this._patching=!1,this._dirty&&this._instance&&this._update()}_hasShadowRoot(){return!1!==this._def.shadowRoot}_removeChildStyle(e){}}function sD(e){let t=lS(),n=t&&t.ce;return n||null}function sF(){let e=sD();return e&&e.shadowRoot}function sL(e=\"$style\"){{let t=lS();if(!t)return f;let n=t.type.__cssModules;if(!n)return f;let r=n[e];return r||f}}let s$=new WeakMap,sV=new WeakMap,sB=Symbol(\"_moveCb\"),sj=Symbol(\"_enterCb\"),sU=(om={name:\"TransitionGroup\",props:S({},l3,{tag:String,moveClass:String}),setup(e,{slots:t}){let n,r,i=lS(),l=nD();return rS(()=>{if(!n.length)return;let t=e.moveClass||`${e.name||\"v\"}-move`;if(!function(e,t,n){let r=e.cloneNode(),i=e[l2];i&&i.forEach(e=>{e.split(/\\s+/).forEach(e=>e&&r.classList.remove(e))}),n.split(/\\s+/).forEach(e=>e&&r.classList.add(e)),r.style.display=\"none\";let l=1===t.nodeType?t:t.parentNode;l.appendChild(r);let{hasTransform:s}=si(r);return l.removeChild(r),s}(n[0].el,i.vnode.el,t)){n=[];return}n.forEach(sH),n.forEach(sq);let r=n.filter(sW);so(i.vnode.el),r.forEach(e=>{let n=e.el,r=n.style;l7(n,t),r.transform=r.webkitTransform=r.transitionDuration=\"\";let i=n[sB]=e=>{(!e||e.target===n)&&(!e||e.propertyName.endsWith(\"transform\"))&&(n.removeEventListener(\"transitionend\",i),n[sB]=null,se(n,t))};n.addEventListener(\"transitionend\",i)}),n=[]}),()=>{let s=tb(e),o=l9(s),a=s.tag||iQ;if(n=[],r)for(let e=0;e<r.length;e++){let t=r[e];t.el&&t.el instanceof Element&&(n.push(t),nW(t,nU(t,o,l,i)),s$.set(t,sK(t.el)))}r=t.default?nK(t.default()):[];for(let e=0;e<r.length;e++){let t=r[e];null!=t.key&&nW(t,nU(t,o,l,i))}return ls(a,null,r)}}},delete om.props.mode,om);function sH(e){let t=e.el;t[sB]&&t[sB](),t[sj]&&t[sj]()}function sq(e){sV.set(e,sK(e.el))}function sW(e){let t=s$.get(e),n=sV.get(e),r=t.left-n.left,i=t.top-n.top;if(r||i){let t=e.el,n=t.style,l=t.getBoundingClientRect(),s=1,o=1;return t.offsetWidth&&(s=l.width/t.offsetWidth),t.offsetHeight&&(o=l.height/t.offsetHeight),Number.isFinite(s)&&0!==s||(s=1),Number.isFinite(o)&&0!==o||(o=1),.01>Math.abs(s-1)&&(s=1),.01>Math.abs(o-1)&&(o=1),n.transform=n.webkitTransform=`translate(${r/s}px,${i/o}px)`,n.transitionDuration=\"0s\",e}}function sK(e){let t=e.getBoundingClientRect();return{left:t.left,top:t.top}}let sz=e=>{let t=e.props[\"onUpdate:modelValue\"]||!1;return T(t)?e=>H(t,e):t};function sJ(e){e.target.composing=!0}function sG(e){let t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(\"input\")))}let sX=Symbol(\"_assign\");function sQ(e,t,n){return t&&(e=e.trim()),n&&(e=W(e)),e}let sZ={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e[sX]=sz(i);let l=r||i.props&&\"number\"===i.props.type;sC(e,t?\"change\":\"input\",t=>{t.target.composing||e[sX](sQ(e.value,n,l))}),(n||l)&&sC(e,\"change\",()=>{e.value=sQ(e.value,n,l)}),t||(sC(e,\"compositionstart\",sJ),sC(e,\"compositionend\",sG),sC(e,\"change\",sG))},mounted(e,{value:t}){e.value=null==t?\"\":t},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:l}},s){if(e[sX]=sz(s),e.composing)return;let o=(l||\"number\"===e.type)&&!/^0\\d/.test(e.value)?W(e.value):e.value,a=null==t?\"\":t;if(o===a)return;let c=e.getRootNode();(c instanceof Document||c instanceof ShadowRoot)&&c.activeElement===e&&\"range\"!==e.type&&(r&&t===n||i&&e.value.trim()===a)||(e.value=a)}},sY={deep:!0,created(e,t,n){e[sX]=sz(n),sC(e,\"change\",()=>{let t=e._modelValue,n=s3(e),r=e.checked,i=e[sX];if(T(t)){let e=ea(t,n),l=-1!==e;if(r&&!l)i(t.concat(n));else if(!r&&l){let n=[...t];n.splice(e,1),i(n)}}else{let l;if(\"[object Set]\"===(l=t,I.call(l))){let e=new Set(t);r?e.add(n):e.delete(n),i(e)}else i(s4(e,r))}})},mounted:s0,beforeUpdate(e,t,n){e[sX]=sz(n),s0(e,t,n)}};function s0(e,{value:t,oldValue:n},r){let i;if(e._modelValue=t,T(t))i=ea(t,r.props.value)>-1;else{let l;if(\"[object Set]\"===(l=t,I.call(l)))i=t.has(r.props.value);else{if(t===n)return;i=eo(t,s4(e,!0))}}e.checked!==i&&(e.checked=i)}let s1={created(e,{value:t},n){e.checked=eo(t,n.props.value),e[sX]=sz(n),sC(e,\"change\",()=>{e[sX](s3(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[sX]=sz(r),t!==n&&(e.checked=eo(t,r.props.value))}},s2={deep:!0,created(e,{value:t,modifiers:{number:n}},r){let i,l=\"[object Set]\"===(i=t,I.call(i));sC(e,\"change\",()=>{let t=Array.prototype.filter.call(e.options,e=>e.selected).map(e=>n?W(s3(e)):s3(e));e[sX](e.multiple?l?new Set(t):t:t[0]),e._assigning=!0,t4(()=>{e._assigning=!1})}),e[sX]=sz(r)},mounted(e,{value:t}){s6(e,t)},beforeUpdate(e,t,n){e[sX]=sz(n)},updated(e,{value:t}){e._assigning||s6(e,t)}};function s6(e,t){let n,r=e.multiple,i=T(t);if(!r||i||\"[object Set]\"===(n=t,I.call(n))){for(let n=0,l=e.options.length;n<l;n++){let l=e.options[n],s=s3(l);if(r)if(i){let e=typeof s;\"string\"===e||\"number\"===e?l.selected=t.some(e=>String(e)===String(s)):l.selected=ea(t,s)>-1}else l.selected=t.has(s);else if(eo(s3(l),t)){e.selectedIndex!==n&&(e.selectedIndex=n);return}}r||-1===e.selectedIndex||(e.selectedIndex=-1)}}function s3(e){return\"_value\"in e?e._value:e.value}function s4(e,t){let n=t?\"_trueValue\":\"_falseValue\";return n in e?e[n]:t}let s8={created(e,t,n){s9(e,t,n,null,\"created\")},mounted(e,t,n){s9(e,t,n,null,\"mounted\")},beforeUpdate(e,t,n,r){s9(e,t,n,r,\"beforeUpdate\")},updated(e,t,n,r){s9(e,t,n,r,\"updated\")}};function s5(e,t){switch(e){case\"SELECT\":return s2;case\"TEXTAREA\":return sZ;default:switch(t){case\"checkbox\":return sY;case\"radio\":return s1;default:return sZ}}}function s9(e,t,n,r,i){let l=s5(e.tagName,n.props&&n.props.type)[i];l&&l(e,t,n,r)}let s7=[\"ctrl\",\"shift\",\"alt\",\"meta\"],oe={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>\"button\"in e&&0!==e.button,middle:e=>\"button\"in e&&1!==e.button,right:e=>\"button\"in e&&2!==e.button,exact:(e,t)=>s7.some(n=>e[`${n}Key`]&&!t.includes(n))},ot=(e,t)=>{if(!e)return e;let n=e._withMods||(e._withMods={}),r=t.join(\".\");return n[r]||(n[r]=(n,...r)=>{for(let e=0;e<t.length;e++){let r=oe[t[e]];if(r&&r(n,t))return}return e(n,...r)})},on={esc:\"escape\",space:\" \",up:\"arrow-up\",left:\"arrow-left\",right:\"arrow-right\",down:\"arrow-down\",delete:\"backspace\"},or=(e,t)=>{let n=e._withKeys||(e._withKeys={}),r=t.join(\".\");return n[r]||(n[r]=n=>{if(!(\"key\"in n))return;let r=V(n.key);if(t.some(e=>e===r||on[e]===r))return e(n)})},oi=S({patchProp:sE},lY),ol=!1;function os(){return c=ol?c:iF(oi),ol=!0,c}let oo=(...e)=>{(c||(c=iD(oi))).render(...e)},oa=(...e)=>{os().hydrate(...e)},oc=(...e)=>{let t=(c||(c=iD(oi))).createApp(...e),{mount:n}=t;return t.mount=e=>{let r=op(e);if(!r)return;let i=t._component;w(i)||i.render||i.template||(i.template=r.innerHTML),1===r.nodeType&&(r.textContent=\"\");let l=n(r,!1,od(r));return r instanceof Element&&(r.removeAttribute(\"v-cloak\"),r.setAttribute(\"data-v-app\",\"\")),l},t},ou=(...e)=>{let t=os().createApp(...e),{mount:n}=t;return t.mount=e=>{let t=op(e);if(t)return n(t,!0,od(t))},t};function od(e){return e instanceof SVGElement?\"svg\":\"function\"==typeof MathMLElement&&e instanceof MathMLElement?\"mathml\":void 0}function op(e){return N(e)?document.querySelector(e):e}let oh=!1,of=()=>{oh||(oh=!0,sZ.getSSRProps=({value:e})=>({value:e}),s1.getSSRProps=({value:e},t)=>{if(t.props&&eo(t.props.value,e))return{checked:!0}},sY.getSSRProps=({value:e},t)=>{if(T(e)){if(t.props&&ea(e,t.props.value)>-1)return{checked:!0}}else{let n;if(\"[object Set]\"===(n=e,I.call(n))){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}}},s8.getSSRProps=(e,t)=>{if(\"string\"!=typeof t.type)return;let n=s5(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)},su.getSSRProps=({value:e})=>{if(!e)return{style:{display:\"none\"}}})};var og,om,ov,oy=Object.freeze({__proto__:null,BaseTransition:nB,BaseTransitionPropsValidators:nL,Comment:iY,DeprecationTypes:lJ,EffectScope:eh,ErrorCodes:tJ,ErrorTypeStrings:lU,Fragment:iQ,KeepAlive:rc,ReactiveEffect:ey,Static:i0,Suspense:iW,Teleport:nR,Text:iZ,TrackOpTypes:tB,Transition:l4,TransitionGroup:sU,TriggerOpTypes:tj,VueElement:sM,assertNumber:tz,callWithAsyncErrorHandling:tX,callWithErrorHandling:tG,camelize:L,capitalize:B,cloneVNode:la,compatUtils:lz,computed:lD,createApp:oc,createBlock:i7,createCommentVNode:ld,createElementBlock:i9,createElementVNode:ll,createHydrationRenderer:iF,createPropsRestProxy:r3,createRenderer:iD,createSSRApp:ou,createSlots:rF,createStaticVNode:lu,createTextVNode:lc,createVNode:ls,customRef:tM,defineAsyncComponent:rs,defineComponent:nz,defineCustomElement:sI,defineEmits:rK,defineExpose:rz,defineModel:rX,defineOptions:rJ,defineProps:rW,defineSSRCustomElement:sO,defineSlots:rG,devtools:lH,effect:eN,effectScope:ef,getCurrentInstance:lS,getCurrentScope:eg,getCurrentWatcher:tq,getTransitionRawChildren:nK,guardReactiveProps:lo,h:lF,handleError:tQ,hasInjectionContext:nh,hydrate:oa,hydrateOnIdle:rt,hydrateOnInteraction:ri,hydrateOnMediaQuery:rr,hydrateOnVisible:rn,initCustomFormatter:lL,initDirectivesForSSR:of,inject:np,isMemoSame:lV,isProxy:ty,isReactive:tg,isReadonly:tm,isRef:tC,isRuntimeOnly:lE,isShallow:tv,isVNode:le,markRaw:t_,mergeDefaults:r2,mergeModels:r6,mergeProps:lg,nextTick:t4,nodeOps:lY,normalizeClass:ee,normalizeProps:et,normalizeStyle:G,onActivated:rd,onBeforeMount:ry,onBeforeUnmount:rx,onBeforeUpdate:r_,onDeactivated:rp,onErrorCaptured:rN,onMounted:rb,onRenderTracked:rw,onRenderTriggered:rT,onScopeDispose:em,onServerPrefetch:rk,onUnmounted:rC,onUpdated:rS,onWatcherCleanup:tW,openBlock:i6,patchProp:sE,popScopeId:ns,provide:nd,proxyRefs:tO,pushScopeId:nl,queuePostFlushCb:t9,reactive:tu,readonly:tp,ref:tk,registerRuntimeCompiler:lA,render:oo,renderList:rD,renderSlot:rL,resolveComponent:rE,resolveDirective:rO,resolveDynamicComponent:rI,resolveFilter:lK,resolveTransitionHooks:nU,setBlockTracking:i8,setDevtoolsHook:lq,setTransitionHooks:nW,shallowReactive:td,shallowReadonly:th,shallowRef:tT,ssrContextKey:nf,ssrUtils:lW,stop:eA,toDisplayString:eu,toHandlerKey:j,toHandlers:rV,toRaw:tb,toRef:t$,toRefs:tD,toValue:tR,transformVNodeArgs:ln,triggerRef:tA,unref:tE,useAttrs:rY,useCssModule:sL,useCssVars:sh,useHost:sD,useId:nJ,useModel:iu,useSSRContext:ng,useShadowRoot:sF,useSlots:rZ,useTemplateRef:nX,useTransitionState:nD,vModelCheckbox:sY,vModelDynamic:s8,vModelRadio:s1,vModelSelect:s2,vModelText:sZ,vShow:su,version:lB,warn:lj,watch:nb,watchEffect:nm,watchPostEffect:nv,watchSyncEffect:ny,withAsyncContext:r4,withCtx:na,withDefaults:rQ,withDirectives:nc,withKeys:or,withMemo:l$,withModifiers:ot,withScopeId:no});let ob=Symbol(\"\"),o_=Symbol(\"\"),oS=Symbol(\"\"),ox=Symbol(\"\"),oC=Symbol(\"\"),ok=Symbol(\"\"),oT=Symbol(\"\"),ow=Symbol(\"\"),oN=Symbol(\"\"),oA=Symbol(\"\"),oE=Symbol(\"\"),oR=Symbol(\"\"),oI=Symbol(\"\"),oO=Symbol(\"\"),oP=Symbol(\"\"),oM=Symbol(\"\"),oD=Symbol(\"\"),oF=Symbol(\"\"),oL=Symbol(\"\"),o$=Symbol(\"\"),oV=Symbol(\"\"),oB=Symbol(\"\"),oj=Symbol(\"\"),oU=Symbol(\"\"),oH=Symbol(\"\"),oq=Symbol(\"\"),oW=Symbol(\"\"),oK=Symbol(\"\"),oz=Symbol(\"\"),oJ=Symbol(\"\"),oG=Symbol(\"\"),oX=Symbol(\"\"),oQ=Symbol(\"\"),oZ=Symbol(\"\"),oY=Symbol(\"\"),o0=Symbol(\"\"),o1=Symbol(\"\"),o2=Symbol(\"\"),o6=Symbol(\"\"),o3={[ob]:\"Fragment\",[o_]:\"Teleport\",[oS]:\"Suspense\",[ox]:\"KeepAlive\",[oC]:\"BaseTransition\",[ok]:\"openBlock\",[oT]:\"createBlock\",[ow]:\"createElementBlock\",[oN]:\"createVNode\",[oA]:\"createElementVNode\",[oE]:\"createCommentVNode\",[oR]:\"createTextVNode\",[oI]:\"createStaticVNode\",[oO]:\"resolveComponent\",[oP]:\"resolveDynamicComponent\",[oM]:\"resolveDirective\",[oD]:\"resolveFilter\",[oF]:\"withDirectives\",[oL]:\"renderList\",[o$]:\"renderSlot\",[oV]:\"createSlots\",[oB]:\"toDisplayString\",[oj]:\"mergeProps\",[oU]:\"normalizeClass\",[oH]:\"normalizeStyle\",[oq]:\"normalizeProps\",[oW]:\"guardReactiveProps\",[oK]:\"toHandlers\",[oz]:\"camelize\",[oJ]:\"capitalize\",[oG]:\"toHandlerKey\",[oX]:\"setBlockTracking\",[oQ]:\"pushScopeId\",[oZ]:\"popScopeId\",[oY]:\"withCtx\",[o0]:\"unref\",[o1]:\"isRef\",[o2]:\"withMemo\",[o6]:\"isMemoSame\"},o4={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:\"\"};function o8(e,t,n,r,i,l,s,o=!1,a=!1,c=!1,u=o4){var d,p,h,f;return e&&(o?(e.helper(ok),e.helper((d=e.inSSR,p=c,d||p?oT:ow))):e.helper((h=e.inSSR,f=c,h||f?oN:oA)),s&&e.helper(oF)),{type:13,tag:t,props:n,children:r,patchFlag:i,dynamicProps:l,directives:s,isBlock:o,disableTracking:a,isComponent:c,loc:u}}function o5(e,t=o4){return{type:17,loc:t,elements:e}}function o9(e,t=o4){return{type:15,loc:t,properties:e}}function o7(e,t){return{type:16,loc:o4,key:N(e)?ae(e,!0):e,value:t}}function ae(e,t=!1,n=o4,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function at(e,t=o4){return{type:8,loc:t,children:e}}function an(e,t=[],n=o4){return{type:14,loc:n,callee:e,arguments:t}}function ar(e,t,n=!1,r=!1,i=o4){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:i}}function ai(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:o4}}function al(e,{helper:t,removeHelper:n,inSSR:r}){if(!e.isBlock){var i,l;e.isBlock=!0,n((i=e.isComponent,r||i?oN:oA)),t(ok),t((l=e.isComponent,r||l?oT:ow))}}let as=new Uint8Array([123,123]),ao=new Uint8Array([125,125]);function aa(e){return e>=97&&e<=122||e>=65&&e<=90}function ac(e){return 32===e||10===e||9===e||12===e||13===e}function au(e){return 47===e||62===e||ac(e)}function ad(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t}let ap={Cdata:new Uint8Array([67,68,65,84,65,91]),CdataEnd:new Uint8Array([93,93,62]),CommentEnd:new Uint8Array([45,45,62]),ScriptEnd:new Uint8Array([60,47,115,99,114,105,112,116]),StyleEnd:new Uint8Array([60,47,115,116,121,108,101]),TitleEnd:new Uint8Array([60,47,116,105,116,108,101]),TextareaEnd:new Uint8Array([60,47,116,101,120,116,97,114,101,97])};function ah(e){throw e}function af(e){}function ag(e,t,n,r){let i=SyntaxError(String(`https://vuejs.org/error-reference/#compiler-${e}`));return i.code=e,i.loc=t,i}let am=e=>4===e.type&&e.isStatic;function av(e){switch(e){case\"Teleport\":case\"teleport\":return o_;case\"Suspense\":case\"suspense\":return oS;case\"KeepAlive\":case\"keep-alive\":return ox;case\"BaseTransition\":case\"base-transition\":return oC}}let ay=/^$|^\\d|[^\\$\\w\\xA0-\\uFFFF]/,ab=/[A-Za-z_$\\xA0-\\uFFFF]/,a_=/[\\.\\?\\w$\\xA0-\\uFFFF]/,aS=/\\s+[.[]\\s*|\\s*[.[]\\s+/g,ax=e=>4===e.type?e.content:e.loc.source,aC=e=>{let t=ax(e).trim().replace(aS,e=>e.trim()),n=0,r=[],i=0,l=0,s=null;for(let e=0;e<t.length;e++){let o=t.charAt(e);switch(n){case 0:if(\"[\"===o)r.push(n),n=1,i++;else if(\"(\"===o)r.push(n),n=2,l++;else if(!(0===e?ab:a_).test(o))return!1;break;case 1:\"'\"===o||'\"'===o||\"`\"===o?(r.push(n),n=3,s=o):\"[\"===o?i++:\"]\"!==o||--i||(n=r.pop());break;case 2:if(\"'\"===o||'\"'===o||\"`\"===o)r.push(n),n=3,s=o;else if(\"(\"===o)l++;else if(\")\"===o){if(e===t.length-1)return!1;--l||(n=r.pop())}break;case 3:o===s&&(n=r.pop(),s=null)}}return!i&&!l},ak=/^\\s*(?:async\\s*)?(?:\\([^)]*?\\)|[\\w$_]+)\\s*(?::[^=]+)?=>|^\\s*(?:async\\s+)?function(?:\\s+[\\w$]+)?\\s*\\(/;function aT(e,t,n=!1){for(let r=0;r<e.props.length;r++){let i=e.props[r];if(7===i.type&&(n||i.exp)&&(N(t)?i.name===t:t.test(i.name)))return i}}function aw(e,t,n=!1,r=!1){for(let i=0;i<e.props.length;i++){let l=e.props[i];if(6===l.type){if(n)continue;if(l.name===t&&(l.value||r))return l}else if(\"bind\"===l.name&&(l.exp||r)&&aN(l.arg,t))return l}}function aN(e,t){return!!(e&&am(e)&&e.content===t)}function aA(e){return 5===e.type||2===e.type}function aE(e){return 7===e.type&&\"pre\"===e.name}function aR(e){return 7===e.type&&\"slot\"===e.name}function aI(e){return 1===e.type&&3===e.tagType}function aO(e){return 1===e.type&&2===e.tagType}let aP=new Set([oq,oW]);function aM(e,t,n){let r,i,l=13===e.type?e.props:e.arguments[2],s=[];if(l&&!N(l)&&14===l.type){let e=function e(t,n=[]){if(t&&!N(t)&&14===t.type){let r=t.callee;if(!N(r)&&aP.has(r))return e(t.arguments[0],n.concat(t))}return[t,n]}(l);l=e[0],i=(s=e[1])[s.length-1]}if(null==l||N(l))r=o9([t]);else if(14===l.type){let e=l.arguments[0];N(e)||15!==e.type?l.callee===oK?r=an(n.helper(oj),[o9([t]),l]):l.arguments.unshift(o9([t])):aD(t,e)||e.properties.unshift(t),r||(r=l)}else 15===l.type?(aD(t,l)||l.properties.unshift(t),r=l):(r=an(n.helper(oj),[o9([t]),l]),i&&i.callee===oW&&(i=s[s.length-2]));13===e.type?i?i.arguments[0]=r:e.props=r:i?i.arguments[0]=r:e.arguments[2]=r}function aD(e,t){let n=!1;if(4===e.key.type){let r=e.key.content;n=t.properties.some(e=>4===e.key.type&&e.key.content===r)}return n}function aF(e,t){return`_${t}_${e.replace(/[^\\w]/g,(t,n)=>\"-\"===t?\"_\":e.charCodeAt(n).toString())}`}let aL=/([\\s\\S]*?)\\s+(?:in|of)\\s+(\\S[\\s\\S]*)/;function a$(e){for(let t=0;t<e.length;t++)if(!ac(e.charCodeAt(t)))return!1;return!0}function aV(e){return 2===e.type&&a$(e.content)||12===e.type&&aV(e.content)}function aB(e){return 3===e.type||aV(e)}let aj={parseMode:\"base\",ns:0,delimiters:[\"{{\",\"}}\"],getNamespace:()=>0,isVoidTag:y,isPreTag:y,isIgnoreNewlineTag:y,isCustomElement:y,onError:ah,onWarn:af,comments:!1,prefixIdentifiers:!1},aU=aj,aH=null,aq=\"\",aW=null,aK=null,az=\"\",aJ=-1,aG=-1,aX=0,aQ=!1,aZ=null,aY=[],a0=new class{constructor(e,t){this.stack=e,this.cbs=t,this.state=1,this.buffer=\"\",this.sectionStart=0,this.index=0,this.entityStart=0,this.baseState=1,this.inRCDATA=!1,this.inXML=!1,this.inVPre=!1,this.newlines=[],this.mode=0,this.delimiterOpen=as,this.delimiterClose=ao,this.delimiterIndex=-1,this.currentSequence=void 0,this.sequenceIndex=0}get inSFCRoot(){return 2===this.mode&&0===this.stack.length}reset(){this.state=1,this.mode=0,this.buffer=\"\",this.sectionStart=0,this.index=0,this.baseState=1,this.inRCDATA=!1,this.currentSequence=void 0,this.newlines.length=0,this.delimiterOpen=as,this.delimiterClose=ao}getPos(e){let t=1,n=e+1,r=this.newlines.length,i=-1;if(r>100){let t=-1,n=r;for(;t+1<n;){let r=t+n>>>1;this.newlines[r]<e?t=r:n=r}i=t}else for(let t=r-1;t>=0;t--)if(e>this.newlines[t]){i=t;break}return i>=0&&(t=i+2,n=e-this.newlines[i]),{column:n,line:t,offset:e}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(e){60===e?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):this.inVPre||e!==this.delimiterOpen[0]||(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(e))}stateInterpolationOpen(e){if(e===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){let e=this.index+1-this.delimiterOpen.length;e>this.sectionStart&&this.cbs.ontext(this.sectionStart,e),this.state=3,this.sectionStart=e}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(e)):(this.state=1,this.stateText(e))}stateInterpolation(e){e===this.delimiterClose[0]&&(this.state=4,this.delimiterIndex=0,this.stateInterpolationClose(e))}stateInterpolationClose(e){e===this.delimiterClose[this.delimiterIndex]?this.delimiterIndex===this.delimiterClose.length-1?(this.cbs.oninterpolation(this.sectionStart,this.index+1),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):this.delimiterIndex++:(this.state=3,this.stateInterpolation(e))}stateSpecialStartSequence(e){let t=this.sequenceIndex===this.currentSequence.length;if(t?au(e):(32|e)===this.currentSequence[this.sequenceIndex]){if(!t)return void this.sequenceIndex++}else this.inRCDATA=!1;this.sequenceIndex=0,this.state=6,this.stateInTagName(e)}stateInRCDATA(e){if(this.sequenceIndex===this.currentSequence.length){if(62===e||ac(e)){let t=this.index-this.currentSequence.length;if(this.sectionStart<t){let e=this.index;this.index=t,this.cbs.ontext(this.sectionStart,t),this.index=e}this.sectionStart=t+2,this.stateInClosingTagName(e),this.inRCDATA=!1;return}this.sequenceIndex=0}(32|e)===this.currentSequence[this.sequenceIndex]?this.sequenceIndex+=1:0===this.sequenceIndex?this.currentSequence!==ap.TitleEnd&&(this.currentSequence!==ap.TextareaEnd||this.inSFCRoot)?this.fastForwardTo(60)&&(this.sequenceIndex=1):this.inVPre||e!==this.delimiterOpen[0]||(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(e)):this.sequenceIndex=Number(60===e)}stateCDATASequence(e){e===ap.Cdata[this.sequenceIndex]?++this.sequenceIndex===ap.Cdata.length&&(this.state=28,this.currentSequence=ap.CdataEnd,this.sequenceIndex=0,this.sectionStart=this.index+1):(this.sequenceIndex=0,this.state=23,this.stateInDeclaration(e))}fastForwardTo(e){for(;++this.index<this.buffer.length;){let t=this.buffer.charCodeAt(this.index);if(10===t&&this.newlines.push(this.index),t===e)return!0}return this.index=this.buffer.length-1,!1}stateInCommentLike(e){e===this.currentSequence[this.sequenceIndex]?++this.sequenceIndex===this.currentSequence.length&&(this.currentSequence===ap.CdataEnd?this.cbs.oncdata(this.sectionStart,this.index-2):this.cbs.oncomment(this.sectionStart,this.index-2),this.sequenceIndex=0,this.sectionStart=this.index+1,this.state=1):0===this.sequenceIndex?this.fastForwardTo(this.currentSequence[0])&&(this.sequenceIndex=1):e!==this.currentSequence[this.sequenceIndex-1]&&(this.sequenceIndex=0)}startSpecial(e,t){this.enterRCDATA(e,t),this.state=31}enterRCDATA(e,t){this.inRCDATA=!0,this.currentSequence=e,this.sequenceIndex=t}stateBeforeTagName(e){33===e?(this.state=22,this.sectionStart=this.index+1):63===e?(this.state=24,this.sectionStart=this.index+1):aa(e)?(this.sectionStart=this.index,0===this.mode?this.state=6:this.inSFCRoot?this.state=34:this.inXML?this.state=6:116===e?this.state=30:this.state=115===e?29:6):47===e?this.state=8:(this.state=1,this.stateText(e))}stateInTagName(e){au(e)&&this.handleTagName(e)}stateInSFCRootTagName(e){if(au(e)){let t=this.buffer.slice(this.sectionStart,this.index);\"template\"!==t&&this.enterRCDATA(ad(\"</\"+t),0),this.handleTagName(e)}}handleTagName(e){this.cbs.onopentagname(this.sectionStart,this.index),this.sectionStart=-1,this.state=11,this.stateBeforeAttrName(e)}stateBeforeClosingTagName(e){ac(e)||(62===e?(this.state=1,this.sectionStart=this.index+1):(this.state=aa(e)?9:27,this.sectionStart=this.index))}stateInClosingTagName(e){(62===e||ac(e))&&(this.cbs.onclosetag(this.sectionStart,this.index),this.sectionStart=-1,this.state=10,this.stateAfterClosingTagName(e))}stateAfterClosingTagName(e){62===e&&(this.state=1,this.sectionStart=this.index+1)}stateBeforeAttrName(e){62===e?(this.cbs.onopentagend(this.index),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):47===e?this.state=7:60===e&&47===this.peek()?(this.cbs.onopentagend(this.index),this.state=5,this.sectionStart=this.index):ac(e)||this.handleAttrStart(e)}handleAttrStart(e){118===e&&45===this.peek()?(this.state=13,this.sectionStart=this.index):46===e||58===e||64===e||35===e?(this.cbs.ondirname(this.index,this.index+1),this.state=14,this.sectionStart=this.index+1):(this.state=12,this.sectionStart=this.index)}stateInSelfClosingTag(e){62===e?(this.cbs.onselfclosingtag(this.index),this.state=1,this.sectionStart=this.index+1,this.inRCDATA=!1):ac(e)||(this.state=11,this.stateBeforeAttrName(e))}stateInAttrName(e){(61===e||au(e))&&(this.cbs.onattribname(this.sectionStart,this.index),this.handleAttrNameEnd(e))}stateInDirName(e){61===e||au(e)?(this.cbs.ondirname(this.sectionStart,this.index),this.handleAttrNameEnd(e)):58===e?(this.cbs.ondirname(this.sectionStart,this.index),this.state=14,this.sectionStart=this.index+1):46===e&&(this.cbs.ondirname(this.sectionStart,this.index),this.state=16,this.sectionStart=this.index+1)}stateInDirArg(e){61===e||au(e)?(this.cbs.ondirarg(this.sectionStart,this.index),this.handleAttrNameEnd(e)):91===e?this.state=15:46===e&&(this.cbs.ondirarg(this.sectionStart,this.index),this.state=16,this.sectionStart=this.index+1)}stateInDynamicDirArg(e){93===e?this.state=14:(61===e||au(e))&&(this.cbs.ondirarg(this.sectionStart,this.index+1),this.handleAttrNameEnd(e))}stateInDirModifier(e){61===e||au(e)?(this.cbs.ondirmodifier(this.sectionStart,this.index),this.handleAttrNameEnd(e)):46===e&&(this.cbs.ondirmodifier(this.sectionStart,this.index),this.sectionStart=this.index+1)}handleAttrNameEnd(e){this.sectionStart=this.index,this.state=17,this.cbs.onattribnameend(this.index),this.stateAfterAttrName(e)}stateAfterAttrName(e){61===e?this.state=18:47===e||62===e?(this.cbs.onattribend(0,this.sectionStart),this.sectionStart=-1,this.state=11,this.stateBeforeAttrName(e)):ac(e)||(this.cbs.onattribend(0,this.sectionStart),this.handleAttrStart(e))}stateBeforeAttrValue(e){34===e?(this.state=19,this.sectionStart=this.index+1):39===e?(this.state=20,this.sectionStart=this.index+1):ac(e)||(this.sectionStart=this.index,this.state=21,this.stateInAttrValueNoQuotes(e))}handleInAttrValue(e,t){(e===t||this.fastForwardTo(t))&&(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(34===t?3:2,this.index+1),this.state=11)}stateInAttrValueDoubleQuotes(e){this.handleInAttrValue(e,34)}stateInAttrValueSingleQuotes(e){this.handleInAttrValue(e,39)}stateInAttrValueNoQuotes(e){ac(e)||62===e?(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(1,this.index),this.state=11,this.stateBeforeAttrName(e)):(39===e||60===e||61===e||96===e)&&this.cbs.onerr(18,this.index)}stateBeforeDeclaration(e){91===e?(this.state=26,this.sequenceIndex=0):this.state=45===e?25:23}stateInDeclaration(e){(62===e||this.fastForwardTo(62))&&(this.state=1,this.sectionStart=this.index+1)}stateInProcessingInstruction(e){(62===e||this.fastForwardTo(62))&&(this.cbs.onprocessinginstruction(this.sectionStart,this.index),this.state=1,this.sectionStart=this.index+1)}stateBeforeComment(e){45===e?(this.state=28,this.currentSequence=ap.CommentEnd,this.sequenceIndex=2,this.sectionStart=this.index+1):this.state=23}stateInSpecialComment(e){(62===e||this.fastForwardTo(62))&&(this.cbs.oncomment(this.sectionStart,this.index),this.state=1,this.sectionStart=this.index+1)}stateBeforeSpecialS(e){e===ap.ScriptEnd[3]?this.startSpecial(ap.ScriptEnd,4):e===ap.StyleEnd[3]?this.startSpecial(ap.StyleEnd,4):(this.state=6,this.stateInTagName(e))}stateBeforeSpecialT(e){e===ap.TitleEnd[3]?this.startSpecial(ap.TitleEnd,4):e===ap.TextareaEnd[3]?this.startSpecial(ap.TextareaEnd,4):(this.state=6,this.stateInTagName(e))}startEntity(){}stateInEntity(){}parse(e){for(this.buffer=e;this.index<this.buffer.length;){let e=this.buffer.charCodeAt(this.index);switch(10===e&&33!==this.state&&this.newlines.push(this.index),this.state){case 1:this.stateText(e);break;case 2:this.stateInterpolationOpen(e);break;case 3:this.stateInterpolation(e);break;case 4:this.stateInterpolationClose(e);break;case 31:this.stateSpecialStartSequence(e);break;case 32:this.stateInRCDATA(e);break;case 26:this.stateCDATASequence(e);break;case 19:this.stateInAttrValueDoubleQuotes(e);break;case 12:this.stateInAttrName(e);break;case 13:this.stateInDirName(e);break;case 14:this.stateInDirArg(e);break;case 15:this.stateInDynamicDirArg(e);break;case 16:this.stateInDirModifier(e);break;case 28:this.stateInCommentLike(e);break;case 27:this.stateInSpecialComment(e);break;case 11:this.stateBeforeAttrName(e);break;case 6:this.stateInTagName(e);break;case 34:this.stateInSFCRootTagName(e);break;case 9:this.stateInClosingTagName(e);break;case 5:this.stateBeforeTagName(e);break;case 17:this.stateAfterAttrName(e);break;case 20:this.stateInAttrValueSingleQuotes(e);break;case 18:this.stateBeforeAttrValue(e);break;case 8:this.stateBeforeClosingTagName(e);break;case 10:this.stateAfterClosingTagName(e);break;case 29:this.stateBeforeSpecialS(e);break;case 30:this.stateBeforeSpecialT(e);break;case 21:this.stateInAttrValueNoQuotes(e);break;case 7:this.stateInSelfClosingTag(e);break;case 23:this.stateInDeclaration(e);break;case 22:this.stateBeforeDeclaration(e);break;case 25:this.stateBeforeComment(e);break;case 24:this.stateInProcessingInstruction(e);break;case 33:this.stateInEntity()}this.index++}this.cleanup(),this.finish()}cleanup(){this.sectionStart!==this.index&&(1===this.state||32===this.state&&0===this.sequenceIndex?(this.cbs.ontext(this.sectionStart,this.index),this.sectionStart=this.index):(19===this.state||20===this.state||21===this.state)&&(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=this.index))}finish(){this.handleTrailingData(),this.cbs.onend()}handleTrailingData(){let e=this.buffer.length;this.sectionStart>=e||(28===this.state?this.currentSequence===ap.CdataEnd?this.cbs.oncdata(this.sectionStart,e):this.cbs.oncomment(this.sectionStart,e):6===this.state||11===this.state||18===this.state||17===this.state||12===this.state||13===this.state||14===this.state||15===this.state||16===this.state||20===this.state||19===this.state||21===this.state||9===this.state||this.cbs.ontext(this.sectionStart,e))}emitCodePoint(e,t){}}(aY,{onerr:cs,ontext(e,t){a4(a6(e,t),e,t)},ontextentity(e,t,n){a4(e,t,n)},oninterpolation(e,t){if(aQ)return a4(a6(e,t),e,t);let n=e+a0.delimiterOpen.length,r=t-a0.delimiterClose.length;for(;ac(aq.charCodeAt(n));)n++;for(;ac(aq.charCodeAt(r-1));)r--;let i=a6(n,r);i.includes(\"&\")&&(i=aU.decodeEntities(i,!1)),cn({type:5,content:cl(i,!1,cr(n,r)),loc:cr(e,t)})},onopentagname(e,t){let n=a6(e,t);aW={type:1,tag:n,ns:aU.getNamespace(n,aY[0],aU.ns),tagType:0,props:[],children:[],loc:cr(e-1,t),codegenNode:void 0}},onopentagend(e){a3(e)},onclosetag(e,t){let n=a6(e,t);if(!aU.isVoidTag(n)){let r=!1;for(let e=0;e<aY.length;e++)if(aY[e].tag.toLowerCase()===n.toLowerCase()){r=!0,e>0&&aY[0].loc.start.offset;for(let n=0;n<=e;n++)a8(aY.shift(),t,n<e);break}r||a5(e,60)}},onselfclosingtag(e){let t=aW.tag;aW.isSelfClosing=!0,a3(e),aY[0]&&aY[0].tag===t&&a8(aY.shift(),e)},onattribname(e,t){aK={type:6,name:a6(e,t),nameLoc:cr(e,t),value:void 0,loc:cr(e)}},ondirname(e,t){let n=a6(e,t),r=\".\"===n||\":\"===n?\"bind\":\"@\"===n?\"on\":\"#\"===n?\"slot\":n.slice(2);if(aQ||\"\"===r)aK={type:6,name:n,nameLoc:cr(e,t),value:void 0,loc:cr(e)};else if(aK={type:7,name:r,rawName:n,exp:void 0,arg:void 0,modifiers:\".\"===n?[ae(\"prop\")]:[],loc:cr(e)},\"pre\"===r){aQ=a0.inVPre=!0,aZ=aW;let e=aW.props;for(let t=0;t<e.length;t++)7===e[t].type&&(e[t]=function(e){let t={type:6,name:e.rawName,nameLoc:cr(e.loc.start.offset,e.loc.start.offset+e.rawName.length),value:void 0,loc:e.loc};if(e.exp){let n=e.exp.loc;n.end.offset<e.loc.end.offset&&(n.start.offset--,n.start.column--,n.end.offset++,n.end.column++),t.value={type:2,content:e.exp.content,loc:n}}return t}(e[t]))}},ondirarg(e,t){if(e===t)return;let n=a6(e,t);if(aQ&&!aE(aK))aK.name+=n,ci(aK.nameLoc,t);else{let r=\"[\"!==n[0];aK.arg=cl(r?n:n.slice(1,-1),r,cr(e,t),3*!!r)}},ondirmodifier(e,t){let n=a6(e,t);if(aQ&&!aE(aK))aK.name+=\".\"+n,ci(aK.nameLoc,t);else if(\"slot\"===aK.name){let e=aK.arg;e&&(e.content+=\".\"+n,ci(e.loc,t))}else{let r=ae(n,!0,cr(e,t));aK.modifiers.push(r)}},onattribdata(e,t){az+=a6(e,t),aJ<0&&(aJ=e),aG=t},onattribentity(e,t,n){az+=e,aJ<0&&(aJ=t),aG=n},onattribnameend(e){let t=a6(aK.loc.start.offset,e);7===aK.type&&(aK.rawName=t),aW.props.some(e=>(7===e.type?e.rawName:e.name)===t)},onattribend(e,t){aW&&aK&&(ci(aK.loc,t),0!==e&&(az.includes(\"&\")&&(az=aU.decodeEntities(az,!0)),6===aK.type?(\"class\"===aK.name&&(az=ct(az).trim()),aK.value={type:2,content:az,loc:1===e?cr(aJ,aG):cr(aJ-1,aG+1)},a0.inSFCRoot&&\"template\"===aW.tag&&\"lang\"===aK.name&&az&&\"html\"!==az&&a0.enterRCDATA(ad(\"</template\"),0)):(aK.exp=cl(az,!1,cr(aJ,aG),0,0),\"for\"===aK.name&&(aK.forParseResult=function(e){let t=e.loc,n=e.content,r=n.match(aL);if(!r)return;let[,i,l]=r,s=(e,n,r=!1)=>{let i=t.start.offset+n,l=i+e.length;return cl(e,!1,cr(i,l),0,+!!r)},o={source:s(l.trim(),n.indexOf(l,i.length)),value:void 0,key:void 0,index:void 0,finalized:!1},a=i.trim().replace(a2,\"\").trim(),c=i.indexOf(a),u=a.match(a1);if(u){let e;a=a.replace(a1,\"\").trim();let t=u[1].trim();if(t&&(e=n.indexOf(t,c+a.length),o.key=s(t,e,!0)),u[2]){let r=u[2].trim();r&&(o.index=s(r,n.indexOf(r,o.key?e+t.length:c+a.length),!0))}}return a&&(o.value=s(a,c,!0)),o}(aK.exp)))),(7!==aK.type||\"pre\"!==aK.name)&&aW.props.push(aK)),az=\"\",aJ=aG=-1},oncomment(e,t){aU.comments&&cn({type:3,content:a6(e,t),loc:cr(e-4,t+3)})},onend(){let e=aq.length;for(let t=0;t<aY.length;t++)a8(aY[t],e-1),aY[t].loc.start.offset},oncdata(e,t){0!==aY[0].ns&&a4(a6(e,t),e,t)},onprocessinginstruction(e){(aY[0]?aY[0].ns:aU.ns)===0&&cs(21,e-1)}}),a1=/,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/,a2=/^\\(|\\)$/g;function a6(e,t){return aq.slice(e,t)}function a3(e){a0.inSFCRoot&&(aW.innerLoc=cr(e+1,e+1)),cn(aW);let{tag:t,ns:n}=aW;0===n&&aU.isPreTag(t)&&aX++,aU.isVoidTag(t)?a8(aW,e):(aY.unshift(aW),(1===n||2===n)&&(a0.inXML=!0)),aW=null}function a4(e,t,n){{let t=aY[0]&&aY[0].tag;\"script\"!==t&&\"style\"!==t&&e.includes(\"&\")&&(e=aU.decodeEntities(e,!1))}let r=aY[0]||aH,i=r.children[r.children.length-1];i&&2===i.type?(i.content+=e,ci(i.loc,n)):r.children.push({type:2,content:e,loc:cr(t,n)})}function a8(e,t,n=!1){n?ci(e.loc,a5(t,60)):ci(e.loc,function(e){let t=e;for(;62!==aq.charCodeAt(t)&&t<aq.length-1;)t++;return t}(t)+1),a0.inSFCRoot&&(e.children.length?e.innerLoc.end=S({},e.children[e.children.length-1].loc.end):e.innerLoc.end=S({},e.innerLoc.start),e.innerLoc.source=a6(e.innerLoc.start.offset,e.innerLoc.end.offset));let{tag:r,ns:i,children:l}=e;if(!aQ&&(\"slot\"===r?e.tagType=2:!function({tag:e,props:t}){if(\"template\"===e){for(let e=0;e<t.length;e++)if(7===t[e].type&&a9.has(t[e].name))return!0}return!1}(e)?function({tag:e,props:t}){var n;if(aU.isCustomElement(e))return!1;if(\"component\"===e||(n=e.charCodeAt(0))>64&&n<91||av(e)||aU.isBuiltInComponent&&aU.isBuiltInComponent(e)||aU.isNativeTag&&!aU.isNativeTag(e))return!0;for(let e=0;e<t.length;e++){let n=t[e];if(6===n.type&&\"is\"===n.name&&n.value&&n.value.content.startsWith(\"vue:\"))return!0}return!1}(e)&&(e.tagType=1):e.tagType=3),a0.inRCDATA||(e.children=ce(l)),0===i&&aU.isIgnoreNewlineTag(r)){let e=l[0];e&&2===e.type&&(e.content=e.content.replace(/^\\r?\\n/,\"\"))}0===i&&aU.isPreTag(r)&&aX--,aZ===e&&(aQ=a0.inVPre=!1,aZ=null),a0.inXML&&(aY[0]?aY[0].ns:aU.ns)===0&&(a0.inXML=!1)}function a5(e,t){let n=e;for(;aq.charCodeAt(n)!==t&&n>=0;)n--;return n}let a9=new Set([\"if\",\"else\",\"else-if\",\"for\",\"slot\"]),a7=/\\r\\n/g;function ce(e){let t=\"preserve\"!==aU.whitespace,n=!1;for(let r=0;r<e.length;r++){let i=e[r];if(2===i.type)if(aX)i.content=i.content.replace(a7,`\n`);else if(a$(i.content)){let l=e[r-1]&&e[r-1].type,s=e[r+1]&&e[r+1].type;!l||!s||t&&(3===l&&(3===s||1===s)||1===l&&(3===s||1===s&&function(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(10===n||13===n)return!0}return!1}(i.content)))?(n=!0,e[r]=null):i.content=\" \"}else t&&(i.content=ct(i.content))}return n?e.filter(Boolean):e}function ct(e){let t=\"\",n=!1;for(let r=0;r<e.length;r++)ac(e.charCodeAt(r))?n||(t+=\" \",n=!0):(t+=e[r],n=!1);return t}function cn(e){(aY[0]||aH).children.push(e)}function cr(e,t){return{start:a0.getPos(e),end:null==t?t:a0.getPos(t),source:null==t?t:a6(e,t)}}function ci(e,t){e.end=a0.getPos(t),e.source=a6(e.start.offset,t)}function cl(e,t=!1,n,r=0,i=0){return ae(e,t,n,r)}function cs(e,t,n){aU.onError(ag(e,cr(t,t)))}function co(e){let t=e.children.filter(e=>3!==e.type);return 1!==t.length||1!==t[0].type||aO(t[0])?null:t[0]}function ca(e,t){let{constantCache:n}=t;switch(e.type){case 1:if(0!==e.tagType)return 0;let r=n.get(e);if(void 0!==r)return r;let i=e.codegenNode;if(13!==i.type||i.isBlock&&\"svg\"!==e.tag&&\"foreignObject\"!==e.tag&&\"math\"!==e.tag)return 0;if(void 0!==i.patchFlag)return n.set(e,0),0;{let r=3,c=cu(e,t);if(0===c)return n.set(e,0),0;c<r&&(r=c);for(let i=0;i<e.children.length;i++){let l=ca(e.children[i],t);if(0===l)return n.set(e,0),0;l<r&&(r=l)}if(r>1)for(let i=0;i<e.props.length;i++){let l=e.props[i];if(7===l.type&&\"bind\"===l.name&&l.exp){let i=ca(l.exp,t);if(0===i)return n.set(e,0),0;i<r&&(r=i)}}if(i.isBlock){var l,s,o,a;for(let t=0;t<e.props.length;t++)if(7===e.props[t].type)return n.set(e,0),0;t.removeHelper(ok),t.removeHelper((l=t.inSSR,s=i.isComponent,l||s?oT:ow)),i.isBlock=!1,t.helper((o=t.inSSR,a=i.isComponent,o||a?oN:oA))}return n.set(e,r),r}case 2:case 3:return 3;case 9:case 11:case 10:default:return 0;case 5:case 12:return ca(e.content,t);case 4:return e.constType;case 8:let c=3;for(let n=0;n<e.children.length;n++){let r=e.children[n];if(N(r)||A(r))continue;let i=ca(r,t);if(0===i)return 0;i<c&&(c=i)}return c;case 20:return 2}}let cc=new Set([oU,oH,oq,oW]);function cu(e,t){let n=3,r=cd(e);if(r&&15===r.type){let{properties:e}=r;for(let r=0;r<e.length;r++){let i,{key:l,value:s}=e[r],o=ca(l,t);if(0===o)return o;if(o<n&&(n=o),0===(i=4===s.type?ca(s,t):14===s.type?function e(t,n){if(14===t.type&&!N(t.callee)&&cc.has(t.callee)){let r=t.arguments[0];if(4===r.type)return ca(r,n);if(14===r.type)return e(r,n)}return 0}(s,t):0))return i;i<n&&(n=i)}}return n}function cd(e){let t=e.codegenNode;if(13===t.type)return t.props}function cp(e,t){t.currentNode=e;let{nodeTransforms:n}=t,r=[];for(let i=0;i<n.length;i++){let l=n[i](e,t);if(l&&(T(l)?r.push(...l):r.push(l)),!t.currentNode)return;e=t.currentNode}switch(e.type){case 3:t.ssr||t.helper(oE);break;case 5:t.ssr||t.helper(oB);break;case 9:for(let n=0;n<e.branches.length;n++)cp(e.branches[n],t);break;case 10:case 11:case 1:case 0:var i=e;let l=0,s=()=>{l--};for(;l<i.children.length;l++){let e=i.children[l];N(e)||(t.grandParent=t.parent,t.parent=i,t.childIndex=l,t.onNodeRemoved=s,cp(e,t))}}t.currentNode=e;let o=r.length;for(;o--;)r[o]()}function ch(e,t){let n=N(e)?t=>t===e:t=>e.test(t);return(e,r)=>{if(1===e.type){let{props:i}=e;if(3===e.tagType&&i.some(aR))return;let l=[];for(let s=0;s<i.length;s++){let o=i[s];if(7===o.type&&n(o.name)){i.splice(s,1),s--;let n=t(e,o,r);n&&l.push(n)}}return l}}}let cf=\"/*@__PURE__*/\",cg=e=>`${o3[e]}: _${o3[e]}`;function cm(e,t,{helper:n,push:r,newline:i,isTS:l}){let s=n(\"component\"===t?oO:oM);for(let n=0;n<e.length;n++){let o=e[n],a=o.endsWith(\"__self\");a&&(o=o.slice(0,-6)),r(`const ${aF(o,t)} = ${s}(${JSON.stringify(o)}${a?\", true\":\"\"})${l?\"!\":\"\"}`),n<e.length-1&&i()}}function cv(e,t){let n=e.length>3;t.push(\"[\"),n&&t.indent(),cy(e,t,n),n&&t.deindent(),t.push(\"]\")}function cy(e,t,n=!1,r=!0){let{push:i,newline:l}=t;for(let s=0;s<e.length;s++){let o=e[s];N(o)?i(o,-3):T(o)?cv(o,t):cb(o,t),s<e.length-1&&(n?(r&&i(\",\"),l()):r&&i(\", \"))}}function cb(e,t){var n,r,i;if(N(e))return void t.push(e,-3);if(A(e))return void t.push(t.helper(e));switch(e.type){case 1:case 9:case 11:case 12:cb(e.codegenNode,t);break;case 2:n=e,t.push(JSON.stringify(n.content),-3,n);break;case 4:c_(e,t);break;case 5:!function(e,t){let{push:n,helper:r,pure:i}=t;i&&n(cf),n(`${r(oB)}(`),cb(e.content,t),n(\")\")}(e,t);break;case 8:cS(e,t);break;case 3:!function(e,t){let{push:n,helper:r,pure:i}=t;i&&n(cf),n(`${r(oE)}(${JSON.stringify(e.content)})`,-3,e)}(e,t);break;case 13:!function(e,t){var n,r;let i,{push:l,helper:s,pure:o}=t,{tag:a,props:c,children:u,patchFlag:d,dynamicProps:p,directives:h,isBlock:f,disableTracking:g,isComponent:m}=e;d&&(i=String(d)),h&&l(s(oF)+\"(\"),f&&l(`(${s(ok)}(${g?\"true\":\"\"}), `),o&&l(cf),l(s(f?(n=t.inSSR,n||m?oT:ow):(r=t.inSSR,r||m?oN:oA))+\"(\",-2,e),cy(function(e){let t=e.length;for(;t--&&null==e[t];);return e.slice(0,t+1).map(e=>e||\"null\")}([a,c,u,i,p]),t),l(\")\"),f&&l(\")\"),h&&(l(\", \"),cb(h,t),l(\")\"))}(e,t);break;case 14:!function(e,t){let{push:n,helper:r,pure:i}=t,l=N(e.callee)?e.callee:r(e.callee);i&&n(cf),n(l+\"(\",-2,e),cy(e.arguments,t),n(\")\")}(e,t);break;case 15:!function(e,t){let{push:n,indent:r,deindent:i,newline:l}=t,{properties:s}=e;if(!s.length)return n(\"{}\",-2,e);let o=s.length>1;n(o?\"{\":\"{ \"),o&&r();for(let e=0;e<s.length;e++){let{key:r,value:i}=s[e];!function(e,t){let{push:n}=t;if(8===e.type)n(\"[\"),cS(e,t),n(\"]\");else if(e.isStatic){let t;n((t=e.content,ay.test(t))?JSON.stringify(e.content):e.content,-2,e)}else n(`[${e.content}]`,-3,e)}(r,t),n(\": \"),cb(i,t),e<s.length-1&&(n(\",\"),l())}o&&i(),n(o?\"}\":\" }\")}(e,t);break;case 17:r=e,i=t,cv(r.elements,i);break;case 18:!function(e,t){let{push:n,indent:r,deindent:i}=t,{params:l,returns:s,body:o,newline:a,isSlot:c}=e;c&&n(`_${o3[oY]}(`),n(\"(\",-2,e),T(l)?cy(l,t):l&&cb(l,t),n(\") => \"),(a||o)&&(n(\"{\"),r()),s?(a&&n(\"return \"),T(s)?cv(s,t):cb(s,t)):o&&cb(o,t),(a||o)&&(i(),n(\"}\")),c&&n(\")\")}(e,t);break;case 19:!function(e,t){let{test:n,consequent:r,alternate:i,newline:l}=e,{push:s,indent:o,deindent:a,newline:c}=t;if(4===n.type){let e,r=(e=n.content,!!ay.test(e));r&&s(\"(\"),c_(n,t),r&&s(\")\")}else s(\"(\"),cb(n,t),s(\")\");l&&o(),t.indentLevel++,l||s(\" \"),s(\"? \"),cb(r,t),t.indentLevel--,l&&c(),l||s(\" \"),s(\": \");let u=19===i.type;!u&&t.indentLevel++,cb(i,t),!u&&t.indentLevel--,l&&a(!0)}(e,t);break;case 20:!function(e,t){let{push:n,helper:r,indent:i,deindent:l,newline:s}=t,{needPauseTracking:o,needArraySpread:a}=e;a&&n(\"[...(\"),n(`_cache[${e.index}] || (`),o&&(i(),n(`${r(oX)}(-1`),e.inVOnce&&n(\", true\"),n(\"),\"),s(),n(\"(\")),n(`_cache[${e.index}] = `),cb(e.value,t),o&&(n(`).cacheIndex = ${e.index},`),s(),n(`${r(oX)}(1),`),s(),n(`_cache[${e.index}]`),l()),n(\")\"),a&&n(\")]\")}(e,t);break;case 21:cy(e.body,t,!0,!1)}}function c_(e,t){let{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,-3,e)}function cS(e,t){for(let n=0;n<e.children.length;n++){let r=e.children[n];N(r)?t.push(r,-3):cb(r,t)}}let cx=ch(/^(?:if|else|else-if)$/,(e,t,n)=>(function(e,t,n,r){if(\"else\"!==t.name&&(!t.exp||!t.exp.content.trim())){let r=t.exp?t.exp.loc:e.loc;n.onError(ag(28,t.loc)),t.exp=ae(\"true\",!1,r)}if(\"if\"===t.name){var i;let l=cC(e,t),s={type:9,loc:cr((i=e.loc).start.offset,i.end.offset),branches:[l]};if(n.replaceNode(s),r)return r(s,l,!0)}else{let i=n.parent.children,l=i.indexOf(e);for(;l-- >=-1;){let s=i[l];if(s&&aB(s)){n.removeNode(s);continue}if(s&&9===s.type){(\"else-if\"===t.name||\"else\"===t.name)&&void 0===s.branches[s.branches.length-1].condition&&n.onError(ag(30,e.loc)),n.removeNode();let i=cC(e,t);s.branches.push(i);let l=r&&r(s,i,!1);cp(i,n),l&&l(),n.currentNode=null}else n.onError(ag(30,e.loc));break}}})(e,t,n,(e,t,r)=>{let i=n.parent.children,l=i.indexOf(e),s=0;for(;l-- >=0;){let e=i[l];e&&9===e.type&&(s+=e.branches.length)}return()=>{r?e.codegenNode=ck(t,s,n):function(e){for(;;)if(19===e.type)if(19!==e.alternate.type)return e;else e=e.alternate;else 20===e.type&&(e=e.value)}(e.codegenNode).alternate=ck(t,s+e.branches.length-1,n)}}));function cC(e,t){let n=3===e.tagType;return{type:10,loc:e.loc,condition:\"else\"===t.name?void 0:t.exp,children:n&&!aT(e,\"for\")?e.children:[e],userKey:aw(e,\"key\"),isTemplateIf:n}}function ck(e,t,n){return e.condition?ai(e.condition,cT(e,t,n),an(n.helper(oE),['\"\"',\"true\"])):cT(e,t,n)}function cT(e,t,n){let{helper:r}=n,i=o7(\"key\",ae(`${t}`,!1,o4,2)),{children:l}=e,s=l[0];if(1!==l.length||1!==s.type)if(1!==l.length||11!==s.type)return o8(n,r(ob),o9([i]),l,64,void 0,void 0,!0,!1,!1,e.loc);else{let e=s.codegenNode;return aM(e,i,n),e}{let e=s.codegenNode,t=14===e.type&&e.callee===o2?e.arguments[1].returns:e;return 13===t.type&&al(t,n),aM(t,i,n),e}}let cw=ch(\"for\",(e,t,n)=>{let{helper:r,removeHelper:i}=n;return function(e,t,n,r){if(!t.exp)return void n.onError(ag(31,t.loc));let i=t.forParseResult;if(!i)return void n.onError(ag(32,t.loc));cN(i);let{scopes:l}=n,{source:s,value:o,key:a,index:c}=i,u={type:11,loc:t.loc,source:s,valueAlias:o,keyAlias:a,objectIndexAlias:c,parseResult:i,children:aI(e)?e.children:[e]};n.replaceNode(u),l.vFor++;let d=r&&r(u);return()=>{l.vFor--,d&&d()}}(e,t,n,t=>{let l=an(r(oL),[t.source]),s=aI(e),o=aT(e,\"memo\"),a=aw(e,\"key\",!1,!0);a&&a.type;let c=a&&(6===a.type?a.value?ae(a.value.content,!0):void 0:a.exp),u=c?o7(\"key\",c):null,d=4===t.source.type&&t.source.constType>0,p=d?64:a?128:256;return t.codegenNode=o8(n,r(ob),void 0,l,p,void 0,void 0,!0,!d,!1,e.loc),()=>{let a,{children:p}=t,h=1!==p.length||1!==p[0].type,f=aO(e)?e:s&&1===e.children.length&&aO(e.children[0])?e.children[0]:null;if(f)a=f.codegenNode,s&&u&&aM(a,u,n);else if(h)a=o8(n,r(ob),u?o9([u]):void 0,e.children,64,void 0,void 0,!0,void 0,!1);else{var g,m,y,b,_,S,x,C;a=p[0].codegenNode,s&&u&&aM(a,u,n),!d!==a.isBlock&&(a.isBlock?(i(ok),i((g=n.inSSR,m=a.isComponent,g||m?oT:ow))):i((y=n.inSSR,b=a.isComponent,y||b?oN:oA))),(a.isBlock=!d,a.isBlock)?(r(ok),r((_=n.inSSR,S=a.isComponent,_||S?oT:ow))):r((x=n.inSSR,C=a.isComponent,x||C?oN:oA))}if(o){let e=ar(cA(t.parseResult,[ae(\"_cached\")]));e.body={type:21,body:[at([\"const _memo = (\",o.exp,\")\"]),at([\"if (_cached && _cached.el\",...c?[\" && _cached.key === \",c]:[],` && ${n.helperString(o6)}(_cached, _memo)) return _cached`]),at([\"const _item = \",a]),ae(\"_item.memo = _memo\"),ae(\"return _item\")],loc:o4},l.arguments.push(e,ae(\"_cache\"),ae(String(n.cached.length))),n.cached.push(null)}else l.arguments.push(ar(cA(t.parseResult),a,!0))}})});function cN(e,t){e.finalized||(e.finalized=!0)}function cA({value:e,key:t,index:n},r=[]){var i=[e,t,n,...r];let l=i.length;for(;l--&&!i[l];);return i.slice(0,l+1).map((e,t)=>e||ae(\"_\".repeat(t+1),!1))}let cE=ae(\"undefined\",!1),cR=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){let n=aT(e,\"slot\");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}};function cI(e,t,n){let r=[o7(\"name\",e),o7(\"fn\",t)];return null!=n&&r.push(o7(\"key\",ae(String(n),!0))),o9(r)}let cO=new WeakMap,cP=(e,t)=>function(){let n,r,i,l,s;if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;let{tag:o,props:a}=e,c=1===e.tagType,u=c?function(e,t,n=!1){let{tag:r}=e,i=cF(r),l=aw(e,\"is\",!1,!0);if(l)if(i){let e;if(6===l.type?e=l.value&&ae(l.value.content,!0):(e=l.exp)||(e=ae(\"is\",!1,l.arg.loc)),e)return an(t.helper(oP),[e])}else 6===l.type&&l.value.content.startsWith(\"vue:\")&&(r=l.value.content.slice(4));let s=av(r)||t.isBuiltInComponent(r);return s?(n||t.helper(s),s):(t.helper(oO),t.components.add(r),aF(r,\"component\"))}(e,t):`\"${o}\"`,d=E(u)&&u.callee===oP,p=0,h=d||u===o_||u===oS||!c&&(\"svg\"===o||\"foreignObject\"===o||\"math\"===o);if(a.length>0){let r=cM(e,t,void 0,c,d);n=r.props,p=r.patchFlag,l=r.dynamicPropNames;let i=r.directives;s=i&&i.length?o5(i.map(e=>(function(e,t){let n=[],r=cO.get(e);r?n.push(t.helperString(r)):(t.helper(oM),t.directives.add(e.name),n.push(aF(e.name,\"directive\")));let{loc:i}=e;if(e.exp&&n.push(e.exp),e.arg&&(e.exp||n.push(\"void 0\"),n.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||n.push(\"void 0\"),n.push(\"void 0\"));let t=ae(\"true\",!1,i);n.push(o9(e.modifiers.map(e=>o7(e,t)),i))}return o5(n,e.loc)})(e,t))):void 0,r.shouldUseBlock&&(h=!0)}if(e.children.length>0)if(u===ox&&(h=!0,p|=1024),c&&u!==o_&&u!==ox){let{slots:n,hasDynamicSlots:i}=function(e,t,n=(e,t,n,r)=>ar(e,n,!1,!0,n.length?n[0].loc:r)){t.helper(oY);let{children:r,loc:i}=e,l=[],s=[],o=t.scopes.vSlot>0||t.scopes.vFor>0,a=aT(e,\"slot\",!0);if(a){let{arg:e,exp:t}=a;e&&!am(e)&&(o=!0),l.push(o7(e||ae(\"default\",!0),n(t,void 0,r,i)))}let c=!1,u=!1,d=[],p=new Set,h=0;for(let e=0;e<r.length;e++){let i,f,g,m,y=r[e];if(!aI(y)||!(i=aT(y,\"slot\",!0))){3!==y.type&&d.push(y);continue}if(a){t.onError(ag(37,i.loc));break}c=!0;let{children:b,loc:_}=y,{arg:S=ae(\"default\",!0),exp:x,loc:C}=i;am(S)?f=S?S.content:\"default\":o=!0;let k=aT(y,\"for\"),T=n(x,k,b,_);if(g=aT(y,\"if\"))o=!0,s.push(ai(g.exp,cI(S,T,h++),cE));else if(m=aT(y,/^else(?:-if)?$/,!0)){let n,i=e;for(;i--&&aB(n=r[i]););if(n&&aI(n)&&aT(n,/^(?:else-)?if$/)){let e=s[s.length-1];for(;19===e.alternate.type;)e=e.alternate;e.alternate=m.exp?ai(m.exp,cI(S,T,h++),cE):cI(S,T,h++)}else t.onError(ag(30,m.loc))}else if(k){o=!0;let e=k.forParseResult;e?(cN(e),s.push(an(t.helper(oL),[e.source,ar(cA(e),cI(S,T),!0)]))):t.onError(ag(32,k.loc))}else{if(f){if(p.has(f)){t.onError(ag(38,C));continue}p.add(f),\"default\"===f&&(u=!0)}l.push(o7(S,T))}}if(!a){let e=(e,t)=>o7(\"default\",n(e,void 0,t,i));c?d.length&&!d.every(aV)&&(u?t.onError(ag(39,d[0].loc)):l.push(e(void 0,d))):l.push(e(void 0,r))}let f=o?2:!function e(t){for(let n=0;n<t.length;n++){let r=t[n];switch(r.type){case 1:if(2===r.tagType||e(r.children))return!0;break;case 9:if(e(r.branches))return!0;break;case 10:case 11:if(e(r.children))return!0}}return!1}(e.children)?1:3,g=o9(l.concat(o7(\"_\",ae(f+\"\",!1))),i);return s.length&&(g=an(t.helper(oV),[g,o5(s)])),{slots:g,hasDynamicSlots:o}}(e,t);r=n,i&&(p|=1024)}else if(1===e.children.length&&u!==o_){let n=e.children[0],i=n.type,l=5===i||8===i;l&&0===ca(n,t)&&(p|=1),r=l||2===i?n:e.children}else r=e.children;l&&l.length&&(i=function(e){let t=\"[\";for(let n=0,r=e.length;n<r;n++)t+=JSON.stringify(e[n]),n<r-1&&(t+=\", \");return t+\"]\"}(l)),e.codegenNode=o8(t,u,n,r,0===p?void 0:p,i,s,!!h,!1,c,e.loc)};function cM(e,t,n=e.props,r,i,l=!1){let s,{tag:o,loc:a,children:c}=e,u=[],d=[],p=[],h=c.length>0,f=!1,g=0,m=!1,y=!1,_=!1,S=!1,x=!1,C=!1,k=[],T=e=>{u.length&&(d.push(o9(cD(u),a)),u=[]),e&&d.push(e)},w=()=>{t.scopes.vFor>0&&u.push(o7(ae(\"ref_for\",!0),ae(\"true\")))},N=({key:e,value:n})=>{if(am(e)){let l=e.content,s=b(l);s&&(!r||i)&&\"onclick\"!==l.toLowerCase()&&\"onUpdate:modelValue\"!==l&&!P(l)&&(S=!0),s&&P(l)&&(C=!0),s&&14===n.type&&(n=n.arguments[0]),20===n.type||(4===n.type||8===n.type)&&ca(n,t)>0||(\"ref\"===l?m=!0:\"class\"===l?y=!0:\"style\"===l?_=!0:\"key\"===l||k.includes(l)||k.push(l),r&&(\"class\"===l||\"style\"===l)&&!k.includes(l)&&k.push(l))}else x=!0};for(let i=0;i<n.length;i++){let s=n[i];if(6===s.type){let{loc:e,name:t,nameLoc:n,value:r}=s;if(\"ref\"===t&&(m=!0,w()),\"is\"===t&&(cF(o)||r&&r.content.startsWith(\"vue:\")))continue;u.push(o7(ae(t,!0,n),ae(r?r.content:\"\",!0,r?r.loc:e)))}else{let{name:n,arg:i,exp:c,loc:m,modifiers:y}=s,b=\"bind\"===n,_=\"on\"===n;if(\"slot\"===n){r||t.onError(ag(40,m));continue}if(\"once\"===n||\"memo\"===n||\"is\"===n||b&&aN(i,\"is\")&&cF(o)||_&&l)continue;if((b&&aN(i,\"key\")||_&&h&&aN(i,\"vue:before-update\"))&&(f=!0),b&&aN(i,\"ref\")&&w(),!i&&(b||_)){x=!0,c?b?(w(),T(),d.push(c)):T({type:14,loc:m,callee:t.helper(oK),arguments:r?[c]:[c,\"true\"]}):t.onError(ag(b?34:35,m));continue}b&&y.some(e=>\"prop\"===e.content)&&(g|=32);let S=t.directiveTransforms[n];if(S){let{props:n,needRuntime:r}=S(s,e,t);l||n.forEach(N),_&&i&&!am(i)?T(o9(n,a)):u.push(...n),r&&(p.push(s),A(r)&&cO.set(s,r))}else!M(n)&&(p.push(s),h&&(f=!0))}}if(d.length?(T(),s=d.length>1?an(t.helper(oj),d,a):d[0]):u.length&&(s=o9(cD(u),a)),x?g|=16:(y&&!r&&(g|=2),_&&!r&&(g|=4),k.length&&(g|=8),S&&(g|=32)),!f&&(0===g||32===g)&&(m||C||p.length>0)&&(g|=512),!t.inSSR&&s)switch(s.type){case 15:let E=-1,R=-1,I=!1;for(let e=0;e<s.properties.length;e++){let t=s.properties[e].key;am(t)?\"class\"===t.content?E=e:\"style\"===t.content&&(R=e):t.isHandlerKey||(I=!0)}let O=s.properties[E],D=s.properties[R];I?s=an(t.helper(oq),[s]):(O&&!am(O.value)&&(O.value=an(t.helper(oU),[O.value])),D&&(_||4===D.value.type&&\"[\"===D.value.content.trim()[0]||17===D.value.type)&&(D.value=an(t.helper(oH),[D.value])));break;case 14:break;default:s=an(t.helper(oq),[an(t.helper(oW),[s])])}return{props:s,directives:p,patchFlag:g,dynamicPropNames:k,shouldUseBlock:f}}function cD(e){let t=new Map,n=[];for(let l=0;l<e.length;l++){var r,i;let s=e[l];if(8===s.key.type||!s.key.isStatic){n.push(s);continue}let o=s.key.content,a=t.get(o);a?(\"style\"===o||\"class\"===o||b(o))&&(r=a,i=s,17===r.value.type?r.value.elements.push(i.value):r.value=o5([r.value,i.value],r.loc)):(t.set(o,s),n.push(s))}return n}function cF(e){return\"component\"===e||\"Component\"===e}let cL=(e,t)=>{if(aO(e)){let{children:n,loc:r}=e,{slotName:i,slotProps:l}=function(e,t){let n,r='\"default\"',i=[];for(let t=0;t<e.props.length;t++){let n=e.props[t];if(6===n.type)n.value&&(\"name\"===n.name?r=JSON.stringify(n.value.content):(n.name=L(n.name),i.push(n)));else if(\"bind\"===n.name&&aN(n.arg,\"name\")){if(n.exp)r=n.exp;else if(n.arg&&4===n.arg.type){let e=L(n.arg.content);r=n.exp=ae(e,!1,n.arg.loc)}}else\"bind\"===n.name&&n.arg&&am(n.arg)&&(n.arg.content=L(n.arg.content)),i.push(n)}if(i.length>0){let{props:r,directives:l}=cM(e,t,i,!1,!1);n=r,l.length&&t.onError(ag(36,l[0].loc))}return{slotName:r,slotProps:n}}(e,t),s=[t.prefixIdentifiers?\"_ctx.$slots\":\"$slots\",i,\"{}\",\"undefined\",\"true\"],o=2;l&&(s[2]=l,o=3),n.length&&(s[3]=ar([],n,!1,!1,r),o=4),t.scopeId&&!t.slotted&&(o=5),s.splice(o),e.codegenNode=an(t.helper(o$),s,r)}},c$=(e,t,n,r)=>{let i,{loc:l,modifiers:s,arg:o}=e;if(!e.exp&&!s.length,4===o.type)if(o.isStatic){let e=o.content;e.startsWith(\"vue:\")&&(e=`vnode-${e.slice(4)}`),i=ae(0!==t.tagType||e.startsWith(\"vnode\")||!/[A-Z]/.test(e)?j(L(e)):`on:${e}`,!0,o.loc)}else i=at([`${n.helperString(oG)}(`,o,\")\"]);else(i=o).children.unshift(`${n.helperString(oG)}(`),i.children.push(\")\");let a=e.exp;a&&!a.content.trim()&&(a=void 0);let c=n.cacheHandlers&&!a&&!n.inVOnce;if(a){let e,t=aC(a),n=!(t||(e=a,ak.test(ax(e)))),r=a.content.includes(\";\");(n||c&&t)&&(a=at([`${n?\"$event\":\"(...args)\"} => ${r?\"{\":\"(\"}`,a,r?\"}\":\")\"]))}let u={props:[o7(i,a||ae(\"() => {}\",!1,l))]};return r&&(u=r(u)),c&&(u.props[0].value=n.cache(u.props[0].value)),u.props.forEach(e=>e.key.isHandlerKey=!0),u},cV=(e,t,n)=>{let{modifiers:r}=e,i=e.arg,{exp:l}=e;return l&&4===l.type&&!l.content.trim()&&(l=void 0),4!==i.type?(i.children.unshift(\"(\"),i.children.push(') || \"\"')):i.isStatic||(i.content=i.content?`${i.content} || \"\"`:'\"\"'),r.some(e=>\"camel\"===e.content)&&(4===i.type?i.isStatic?i.content=L(i.content):i.content=`${n.helperString(oz)}(${i.content})`:(i.children.unshift(`${n.helperString(oz)}(`),i.children.push(\")\"))),!n.inSSR&&(r.some(e=>\"prop\"===e.content)&&cB(i,\".\"),r.some(e=>\"attr\"===e.content)&&cB(i,\"^\")),{props:[o7(i,l)]}},cB=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\\`${t}\\${${e.content}}\\``:(e.children.unshift(`'${t}' + (`),e.children.push(\")\"))},cj=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{let n,r=e.children,i=!1;for(let e=0;e<r.length;e++){let t=r[e];if(aA(t)){i=!0;for(let i=e+1;i<r.length;i++){let l=r[i];if(aA(l))n||(n=r[e]=at([t],t.loc)),n.children.push(\" + \",l),r.splice(i,1),i--;else{n=void 0;break}}}}if(i&&(1!==r.length||0!==e.type&&(1!==e.type||0!==e.tagType||e.props.find(e=>7===e.type&&!t.directiveTransforms[e.name]))))for(let e=0;e<r.length;e++){let n=r[e];if(aA(n)||8===n.type){let i=[];(2!==n.type||\" \"!==n.content)&&i.push(n),t.ssr||0!==ca(n,t)||i.push(\"1\"),r[e]={type:12,content:n,loc:n.loc,codegenNode:an(t.helper(oR),i)}}}}},cU=new WeakSet,cH=(e,t)=>{if(1===e.type&&aT(e,\"once\",!0)&&!cU.has(e)&&!t.inVOnce&&!t.inSSR)return cU.add(e),t.inVOnce=!0,t.helper(oX),()=>{t.inVOnce=!1;let e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0,!0))}},cq=(e,t,n)=>{let r,{exp:i,arg:l}=e;if(!i)return n.onError(ag(41,e.loc)),cW();let s=i.loc.source.trim(),o=4===i.type?i.content:s,a=n.bindingMetadata[s];if(\"props\"===a||\"props-aliased\"===a||\"literal-const\"===a||\"setup-const\"===a)return i.loc,cW();if(!o.trim()||!aC(i))return n.onError(ag(42,i.loc)),cW();let c=l||ae(\"modelValue\",!0),u=l?am(l)?`onUpdate:${L(l.content)}`:at(['\"onUpdate:\" + ',l]):\"onUpdate:modelValue\",d=n.isTS?\"($event: any)\":\"$event\";r=at([`${d} => ((`,i,\") = $event)\"]);let p=[o7(c,e.exp),o7(u,r)];if(e.modifiers.length&&1===t.tagType){let t=e.modifiers.map(e=>e.content).map(e=>(ay.test(e)?JSON.stringify(e):e)+\": true\").join(\", \"),n=l?am(l)?`${l.content}Modifiers`:at([l,' + \"Modifiers\"']):\"modelModifiers\";p.push(o7(n,ae(`{ ${t} }`,!1,e.loc,2)))}return cW(p)};function cW(e=[]){return{props:e}}let cK=new WeakSet,cz=(e,t)=>{if(1===e.type){let n=aT(e,\"memo\");if(!(!n||cK.has(e))&&!t.inSSR)return cK.add(e),()=>{let r=e.codegenNode||t.currentNode.codegenNode;r&&13===r.type&&(1!==e.tagType&&al(r,t),e.codegenNode=an(t.helper(o2),[n.exp,ar(void 0,r),\"_cache\",String(t.cached.length)]),t.cached.push(null))}}},cJ=(e,t)=>{if(1===e.type){for(let n of e.props)if(7===n.type&&\"bind\"===n.name&&(!n.exp||4===n.exp.type&&!n.exp.content.trim())&&n.arg){let e=n.arg;if(4===e.type&&e.isStatic){let t=L(e.content);(ab.test(t[0])||\"-\"===t[0])&&(n.exp=ae(t,!1,e.loc))}else t.onError(ag(53,e.loc)),n.exp=ae(\"\",!0,e.loc)}}},cG=Symbol(\"\"),cX=Symbol(\"\"),cQ=Symbol(\"\"),cZ=Symbol(\"\"),cY=Symbol(\"\"),c0=Symbol(\"\"),c1=Symbol(\"\"),c2=Symbol(\"\"),c6=Symbol(\"\"),c3=Symbol(\"\");Object.getOwnPropertySymbols(ov={[cG]:\"vModelRadio\",[cX]:\"vModelCheckbox\",[cQ]:\"vModelText\",[cZ]:\"vModelSelect\",[cY]:\"vModelDynamic\",[c0]:\"withModifiers\",[c1]:\"withKeys\",[c2]:\"vShow\",[c6]:\"Transition\",[c3]:\"TransitionGroup\"}).forEach(e=>{o3[e]=ov[e]});let c4={parseMode:\"html\",isVoidTag:el,isNativeTag:e=>en(e)||er(e)||ei(e),isPreTag:e=>\"pre\"===e,isIgnoreNewlineTag:e=>\"pre\"===e||\"textarea\"===e,decodeEntities:function(e,t=!1){return(u||(u=document.createElement(\"div\")),t)?(u.innerHTML=`<div foo=\"${e.replace(/\"/g,\"&quot;\")}\">`,u.children[0].getAttribute(\"foo\")):(u.innerHTML=e,u.textContent)},isBuiltInComponent:e=>\"Transition\"===e||\"transition\"===e?c6:\"TransitionGroup\"===e||\"transition-group\"===e?c3:void 0,getNamespace(e,t,n){let r=t?t.ns:n;if(t&&2===r)if(\"annotation-xml\"===t.tag){if(\"svg\"===e)return 1;t.props.some(e=>6===e.type&&\"encoding\"===e.name&&null!=e.value&&(\"text/html\"===e.value.content||\"application/xhtml+xml\"===e.value.content))&&(r=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&\"mglyph\"!==e&&\"malignmark\"!==e&&(r=0);else t&&1===r&&(\"foreignObject\"===t.tag||\"desc\"===t.tag||\"title\"===t.tag)&&(r=0);if(0===r){if(\"svg\"===e)return 1;if(\"math\"===e)return 2}return r}},c8=h(\"passive,once,capture\"),c5=h(\"stop,prevent,self,ctrl,shift,alt,meta,exact,middle\"),c9=h(\"left,right\"),c7=h(\"onkeyup,onkeydown,onkeypress\"),ue=(e,t)=>am(e)&&\"onclick\"===e.content.toLowerCase()?ae(t,!0):4!==e.type?at([\"(\",e,`) === \"onClick\" ? \"${t}\" : (`,e,\")\"]):e,ut=(e,t)=>{1===e.type&&0===e.tagType&&(\"script\"===e.tag||\"style\"===e.tag)&&t.removeNode()},un=[e=>{1===e.type&&e.props.forEach((t,n)=>{let r,i;6===t.type&&\"style\"===t.name&&t.value&&(e.props[n]={type:7,name:\"bind\",arg:ae(\"style\",!0,t.loc),exp:(r=t.value.content,i=t.loc,ae(JSON.stringify(Y(r)),!1,i,3)),modifiers:[],loc:t.loc})})}],ur={cloak:()=>({props:[]}),html:(e,t,n)=>{let{exp:r,loc:i}=e;return r||n.onError(ag(54,i)),t.children.length&&(n.onError(ag(55,i)),t.children.length=0),{props:[o7(ae(\"innerHTML\",!0,i),r||ae(\"\",!0))]}},text:(e,t,n)=>{let{exp:r,loc:i}=e;return r||n.onError(ag(56,i)),t.children.length&&(n.onError(ag(57,i)),t.children.length=0),{props:[o7(ae(\"textContent\",!0),r?ca(r,n)>0?r:an(n.helperString(oB),[r],i):ae(\"\",!0))]}},model:(e,t,n)=>{let r=cq(e,t,n);if(!r.props.length||1===t.tagType)return r;e.arg&&n.onError(ag(59,e.arg.loc));let{tag:i}=t,l=n.isCustomElement(i);if(\"input\"===i||\"textarea\"===i||\"select\"===i||l){let s=cQ,o=!1;if(\"input\"===i||l){let r=aw(t,\"type\");if(r){if(7===r.type)s=cY;else if(r.value)switch(r.value.content){case\"radio\":s=cG;break;case\"checkbox\":s=cX;break;case\"file\":o=!0,n.onError(ag(60,e.loc))}}else t.props.some(e=>7===e.type&&\"bind\"===e.name&&(!e.arg||4!==e.arg.type||!e.arg.isStatic))&&(s=cY)}else\"select\"===i&&(s=cZ);o||(r.needRuntime=n.helper(s))}else n.onError(ag(58,e.loc));return r.props=r.props.filter(e=>4!==e.key.type||\"modelValue\"!==e.key.content),r},on:(e,t,n)=>c$(e,t,n,t=>{let{modifiers:r}=e;if(!r.length)return t;let{key:i,value:l}=t.props[0],{keyModifiers:s,nonKeyModifiers:o,eventOptionModifiers:a}=((e,t,n,r)=>{let i=[],l=[],s=[];for(let n=0;n<t.length;n++){let r=t[n].content;c8(r)?s.push(r):c9(r)?am(e)?c7(e.content.toLowerCase())?i.push(r):l.push(r):(i.push(r),l.push(r)):c5(r)?l.push(r):i.push(r)}return{keyModifiers:i,nonKeyModifiers:l,eventOptionModifiers:s}})(i,r,0,e.loc);if(o.includes(\"right\")&&(i=ue(i,\"onContextmenu\")),o.includes(\"middle\")&&(i=ue(i,\"onMouseup\")),o.length&&(l=an(n.helper(c0),[l,JSON.stringify(o)])),s.length&&(!am(i)||c7(i.content.toLowerCase()))&&(l=an(n.helper(c1),[l,JSON.stringify(s)])),a.length){let e=a.map(B).join(\"\");i=am(i)?ae(`${i.content}${e}`,!0):at([\"(\",i,`) + \"${e}\"`])}return{props:[o7(i,l)]}}),show:(e,t,n)=>{let{exp:r,loc:i}=e;return r||n.onError(ag(62,i)),{props:[],needRuntime:n.helper(c2)}}},ui=Object.create(null);function ul(e,t){if(!N(e))if(!e.nodeType)return m;else e=e.innerHTML;let n=e+JSON.stringify(t,(e,t)=>\"function\"==typeof t?t.toString():t),r=ui[n];if(r)return r;if(\"#\"===e[0]){let t=document.querySelector(e);e=t?t.innerHTML:\"\"}let i=S({hoistStatic:!0,onError:void 0,onWarn:m},t);!i.isCustomElement&&\"u\">typeof customElements&&(i.isCustomElement=e=>!!customElements.get(e));let{code:l}=function(e,t={}){return function(e,t={}){var n;let r,i=t.onError||ah,l=\"module\"===t.mode;!0===t.prefixIdentifiers?i(ag(48)):l&&i(ag(49)),t.cacheHandlers&&i(ag(50)),t.scopeId&&!l&&i(ag(51));let s=S({},t,{prefixIdentifiers:!1}),o=N(e)?function(e,t){if(a0.reset(),aW=null,aK=null,az=\"\",aJ=-1,aG=-1,aY.length=0,aq=e,aU=S({},aj),t){let e;for(e in t)null!=t[e]&&(aU[e]=t[e])}a0.mode=\"html\"===aU.parseMode?1:2*(\"sfc\"===aU.parseMode),a0.inXML=1===aU.ns||2===aU.ns;let n=t&&t.delimiters;n&&(a0.delimiterOpen=ad(n[0]),a0.delimiterClose=ad(n[1]));let r=aH=function(e,t=\"\"){return{type:0,source:t,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:[],temps:0,codegenNode:void 0,loc:o4}}([],e);return a0.parse(aq),r.loc=cr(0,e.length),r.children=ce(r.children),aH=null,r}(e,s):e,[a,c]=[[cJ,cH,cx,cz,cw,cL,cP,cR,cj],{on:c$,bind:cV,model:cq}];return r=function(e,{filename:t=\"\",prefixIdentifiers:n=!1,hoistStatic:r=!1,hmr:i=!1,cacheHandlers:l=!1,nodeTransforms:s=[],directiveTransforms:o={},transformHoist:a=null,isBuiltInComponent:c=m,isCustomElement:u=m,expressionPlugins:d=[],scopeId:p=null,slotted:h=!0,ssr:g=!1,inSSR:y=!1,ssrCssVars:b=\"\",bindingMetadata:_=f,inline:S=!1,isTS:x=!1,onError:C=ah,onWarn:k=af,compatConfig:T}){let w=t.replace(/\\?.*$/,\"\").match(/([^/\\\\]+)\\.\\w+$/),A={filename:t,selfName:w&&B(L(w[1])),prefixIdentifiers:n,hoistStatic:r,hmr:i,cacheHandlers:l,nodeTransforms:s,directiveTransforms:o,transformHoist:a,isBuiltInComponent:c,isCustomElement:u,expressionPlugins:d,scopeId:p,slotted:h,ssr:g,inSSR:y,ssrCssVars:b,bindingMetadata:_,inline:S,isTS:x,onError:C,onWarn:k,compatConfig:T,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],cached:[],constantCache:new WeakMap,temps:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,grandParent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){let t=A.helpers.get(e)||0;return A.helpers.set(e,t+1),e},removeHelper(e){let t=A.helpers.get(e);if(t){let n=t-1;n?A.helpers.set(e,n):A.helpers.delete(e)}},helperString:e=>`_${o3[A.helper(e)]}`,replaceNode(e){A.parent.children[A.childIndex]=A.currentNode=e},removeNode(e){let t=A.parent.children,n=e?t.indexOf(e):A.currentNode?A.childIndex:-1;e&&e!==A.currentNode?A.childIndex>n&&(A.childIndex--,A.onNodeRemoved()):(A.currentNode=null,A.onNodeRemoved()),A.parent.children.splice(n,1)},onNodeRemoved:m,addIdentifiers(e){},removeIdentifiers(e){},hoist(e){N(e)&&(e=ae(e)),A.hoists.push(e);let t=ae(`_hoisted_${A.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache(e,t=!1,n=!1){let r=function(e,t,n=!1,r=!1){return{type:20,index:e,value:t,needPauseTracking:n,inVOnce:r,needArraySpread:!1,loc:o4}}(A.cached.length,e,t,n);return A.cached.push(r),r}};return A}(o,n=S({},s,{nodeTransforms:[...a,...t.nodeTransforms||[]],directiveTransforms:S({},c,t.directiveTransforms||{})})),cp(o,r),n.hoistStatic&&function e(t,n,r,i=!1,l=!1){let{children:s}=t,o=[];for(let n=0;n<s.length;n++){let a=s[n];if(1===a.type&&0===a.tagType){let e=i?0:ca(a,r);if(e>0){if(e>=2){a.codegenNode.patchFlag=-1,o.push(a);continue}}else{let e=a.codegenNode;if(13===e.type){let t=e.patchFlag;if((void 0===t||512===t||1===t)&&cu(a,r)>=2){let t=cd(a);t&&(e.props=r.hoist(t))}e.dynamicProps&&(e.dynamicProps=r.hoist(e.dynamicProps))}}}else if(12===a.type&&(i?0:ca(a,r))>=2){14===a.codegenNode.type&&a.codegenNode.arguments.length>0&&a.codegenNode.arguments.push(\"-1\"),o.push(a);continue}if(1===a.type){let n=1===a.tagType;n&&r.scopes.vSlot++,e(a,t,r,!1,l),n&&r.scopes.vSlot--}else if(11===a.type)e(a,t,r,1===a.children.length,!0);else if(9===a.type)for(let n=0;n<a.branches.length;n++)e(a.branches[n],t,r,1===a.branches[n].children.length,l)}let a=!1;if(o.length===s.length&&1===t.type){if(0===t.tagType&&t.codegenNode&&13===t.codegenNode.type&&T(t.codegenNode.children))t.codegenNode.children=c(o5(t.codegenNode.children)),a=!0;else if(1===t.tagType&&t.codegenNode&&13===t.codegenNode.type&&t.codegenNode.children&&!T(t.codegenNode.children)&&15===t.codegenNode.children.type){let e=u(t.codegenNode,\"default\");e&&(e.returns=c(o5(e.returns)),a=!0)}else if(3===t.tagType&&n&&1===n.type&&1===n.tagType&&n.codegenNode&&13===n.codegenNode.type&&n.codegenNode.children&&!T(n.codegenNode.children)&&15===n.codegenNode.children.type){let e=aT(t,\"slot\",!0),r=e&&e.arg&&u(n.codegenNode,e.arg);r&&(r.returns=c(o5(r.returns)),a=!0)}}if(!a)for(let e of o)e.codegenNode=r.cache(e.codegenNode);function c(e){let t=r.cache(e);return t.needArraySpread=!0,t}function u(e,t){if(e.children&&!T(e.children)&&15===e.children.type){let n=e.children.properties.find(e=>e.key===t||e.key.content===t);return n&&n.value}}o.length&&r.transformHoist&&r.transformHoist(s,r,t)}(o,void 0,r,!!co(o)),n.ssr||function(e,t){let{helper:n}=t,{children:r}=e;if(1===r.length){let n=co(e);if(n&&n.codegenNode){let r=n.codegenNode;13===r.type&&al(r,t),e.codegenNode=r}else e.codegenNode=r[0]}else r.length>1&&(e.codegenNode=o8(t,n(ob),void 0,e.children,64,void 0,void 0,!0,void 0,!1))}(o,r),o.helpers=new Set([...r.helpers.keys()]),o.components=[...r.components],o.directives=[...r.directives],o.imports=r.imports,o.hoists=r.hoists,o.temps=r.temps,o.cached=r.cached,o.transformed=!0,function(e,t={}){let n=function(e,{mode:t=\"function\",prefixIdentifiers:n=\"module\"===t,sourceMap:r=!1,filename:i=\"template.vue.html\",scopeId:l=null,optimizeImports:s=!1,runtimeGlobalName:o=\"Vue\",runtimeModuleName:a=\"vue\",ssrRuntimeModuleName:c=\"vue/server-renderer\",ssr:u=!1,isTS:d=!1,inSSR:p=!1}){let h={mode:t,prefixIdentifiers:n,sourceMap:r,filename:i,scopeId:l,optimizeImports:s,runtimeGlobalName:o,runtimeModuleName:a,ssrRuntimeModuleName:c,ssr:u,isTS:d,inSSR:p,source:e.source,code:\"\",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:e=>`_${o3[e]}`,push(e,t=-2,n){h.code+=e},indent(){f(++h.indentLevel)},deindent(e=!1){e?--h.indentLevel:f(--h.indentLevel)},newline(){f(h.indentLevel)}};function f(e){h.push(`\n`+\"  \".repeat(e),0)}return h}(e,t);t.onContextCreated&&t.onContextCreated(n);let{mode:r,push:i,prefixIdentifiers:l,indent:s,deindent:o,newline:a,ssr:c}=n,u=Array.from(e.helpers),d=u.length>0,p=!l&&\"module\"!==r;!function(e,t){let{push:n,newline:r,runtimeGlobalName:i}=t,l=Array.from(e.helpers);if(l.length>0&&(n(`const _Vue = ${i}\n`,-1),e.hoists.length)){let e=[oN,oA,oE,oR,oI].filter(e=>l.includes(e)).map(cg).join(\", \");n(`const { ${e} } = _Vue\n`,-1)}(function(e,t){if(!e.length)return;t.pure=!0;let{push:n,newline:r}=t;r();for(let i=0;i<e.length;i++){let l=e[i];l&&(n(`const _hoisted_${i+1} = `),cb(l,t),r())}t.pure=!1})(e.hoists,t),r(),n(\"return \")}(e,n);let h=(c?[\"_ctx\",\"_push\",\"_parent\",\"_attrs\"]:[\"_ctx\",\"_cache\"]).join(\", \");if(i(`function ${c?\"ssrRender\":\"render\"}(${h}) {`),s(),p&&(i(\"with (_ctx) {\"),s(),d&&(i(`const { ${u.map(cg).join(\", \")} } = _Vue\n`,-1),a())),e.components.length&&(cm(e.components,\"component\",n),(e.directives.length||e.temps>0)&&a()),e.directives.length&&(cm(e.directives,\"directive\",n),e.temps>0&&a()),e.temps>0){i(\"let \");for(let t=0;t<e.temps;t++)i(`${t>0?\", \":\"\"}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(i(`\n`,0),a()),c||i(\"return \"),e.codegenNode?cb(e.codegenNode,n):i(\"null\"),p&&(o(),i(\"}\")),o(),i(\"}\"),{ast:e,code:n.code,preamble:\"\",map:n.map?n.map.toJSON():void 0}}(o,s)}(e,S({},c4,t,{nodeTransforms:[ut,...un,...t.nodeTransforms||[]],directiveTransforms:S({},ur,t.directiveTransforms||{}),transformHoist:null}))}(e,i),s=Function(\"Vue\",l)(oy);return s._rc=!0,ui[n]=s}lA(ul);export{nB as BaseTransition,nL as BaseTransitionPropsValidators,iY as Comment,lJ as DeprecationTypes,eh as EffectScope,tJ as ErrorCodes,lU as ErrorTypeStrings,iQ as Fragment,rc as KeepAlive,ey as ReactiveEffect,i0 as Static,iW as Suspense,nR as Teleport,iZ as Text,tB as TrackOpTypes,l4 as Transition,sU as TransitionGroup,tj as TriggerOpTypes,sM as VueElement,tz as assertNumber,tX as callWithAsyncErrorHandling,tG as callWithErrorHandling,L as camelize,B as capitalize,la as cloneVNode,lz as compatUtils,ul as compile,lD as computed,oc as createApp,i7 as createBlock,ld as createCommentVNode,i9 as createElementBlock,ll as createElementVNode,iF as createHydrationRenderer,r3 as createPropsRestProxy,iD as createRenderer,ou as createSSRApp,rF as createSlots,lu as createStaticVNode,lc as createTextVNode,ls as createVNode,tM as customRef,rs as defineAsyncComponent,nz as defineComponent,sI as defineCustomElement,rK as defineEmits,rz as defineExpose,rX as defineModel,rJ as defineOptions,rW as defineProps,sO as defineSSRCustomElement,rG as defineSlots,lH as devtools,eN as effect,ef as effectScope,lS as getCurrentInstance,eg as getCurrentScope,tq as getCurrentWatcher,nK as getTransitionRawChildren,lo as guardReactiveProps,lF as h,tQ as handleError,nh as hasInjectionContext,oa as hydrate,rt as hydrateOnIdle,ri as hydrateOnInteraction,rr as hydrateOnMediaQuery,rn as hydrateOnVisible,lL as initCustomFormatter,of as initDirectivesForSSR,np as inject,lV as isMemoSame,ty as isProxy,tg as isReactive,tm as isReadonly,tC as isRef,lE as isRuntimeOnly,tv as isShallow,le as isVNode,t_ as markRaw,r2 as mergeDefaults,r6 as mergeModels,lg as mergeProps,t4 as nextTick,lY as nodeOps,ee as normalizeClass,et as normalizeProps,G as normalizeStyle,rd as onActivated,ry as onBeforeMount,rx as onBeforeUnmount,r_ as onBeforeUpdate,rp as onDeactivated,rN as onErrorCaptured,rb as onMounted,rw as onRenderTracked,rT as onRenderTriggered,em as onScopeDispose,rk as onServerPrefetch,rC as onUnmounted,rS as onUpdated,tW as onWatcherCleanup,i6 as openBlock,sE as patchProp,ns as popScopeId,nd as provide,tO as proxyRefs,nl as pushScopeId,t9 as queuePostFlushCb,tu as reactive,tp as readonly,tk as ref,lA as registerRuntimeCompiler,oo as render,rD as renderList,rL as renderSlot,rE as resolveComponent,rO as resolveDirective,rI as resolveDynamicComponent,lK as resolveFilter,nU as resolveTransitionHooks,i8 as setBlockTracking,lq as setDevtoolsHook,nW as setTransitionHooks,td as shallowReactive,th as shallowReadonly,tT as shallowRef,nf as ssrContextKey,lW as ssrUtils,eA as stop,eu as toDisplayString,j as toHandlerKey,rV as toHandlers,tb as toRaw,t$ as toRef,tD as toRefs,tR as toValue,ln as transformVNodeArgs,tA as triggerRef,tE as unref,rY as useAttrs,sL as useCssModule,sh as useCssVars,sD as useHost,nJ as useId,iu as useModel,ng as useSSRContext,sF as useShadowRoot,rZ as useSlots,nX as useTemplateRef,nD as useTransitionState,sY as vModelCheckbox,s8 as vModelDynamic,s1 as vModelRadio,s2 as vModelSelect,sZ as vModelText,su as vShow,lB as version,lj as warn,nb as watch,nm as watchEffect,nv as watchPostEffect,ny as watchSyncEffect,r4 as withAsyncContext,na as withCtx,rQ as withDefaults,nc as withDirectives,or as withKeys,l$ as withMemo,ot as withModifiers,no as withScopeId};\n", "// icon.ts \u2014\u2014 \u56FE\u6807 = \u6307\u5411\u5185\u8054 sprite \u7684 <use>\uFF08\u6284 WeebPaint / WXHW src/ui/icon.ts\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\n//   \u56FE\u6807\u540D = \u5171\u4EAB\u5E93\uFF0820260708 SVG Icons\uFF09\u7684 symbol id\uFF08assets/icons.svg \u7531 extract-icons.py \u53D6\u3001scripts/inline-sprites.py \u8D34\u8FDB index.html\uFF09\u3002\nexport function iconHtml(name: string, opts: { size?: number; cls?: string } = {}): string {\n  const { size, cls } = opts;\n  const attrs = ['viewBox=\"0 0 24 24\"', `class=\"ico${cls ? ` ${cls}` : \"\"}\"`, size ? `width=\"${size}\" height=\"${size}\"` : \"\", 'aria-hidden=\"true\"'].filter(Boolean).join(\" \");\n  return `<svg ${attrs}><use href=\"#${name}\"/></svg>`;\n}\n", "// song-cover.ts \u2014\u2014 \u4E66\u67B6\u5361\u7247\u7684\u5C01\u9762\uFF1A\u5531\u7247\u5C01\u9762\u5F0F\uFF08\u65B9\u56FE\uFF09\uFF0C\u6B4C\u540D\u5370\u5927\u5B57\u3001\u4F5C\u8005\u4E00\u884C\u5C0F\u5B57\u3001\u65E5\u671F\u66F4\u5C0F\uFF1B\u56FE\u53EA\u662F\u80CC\u666F\u3002created 2026-10-08 by Claude Fable 5.1\n//   user 2026-10-08\uFF1A\u300C\u7528\u6237\u9009\u7684\u5C01\u9762\u56FE\uFF0C\u4E0D\u7528\u7B2C\u4E00\u9875\u2026\u6CA1\u6709\u7684\u65F6\u5019\u81EA\u5DF1\u751F\u6210\u6392\u7248\uFF0C\u770B\u770Bwxhw\u7684\u81EA\u52A8\u5C01\u9762\u300D\u300C\u6211\u4EEC\u8FD9\u4E2A\u5E94\u8BE5\u662F\u5531\u7247\u5C01\u9762\uFF0C\u662F\u77E9\u5F62\u7684\uFF0C\u4F60\u53EF\u4EE5\u60F3\u60F3\u5404\u4E2A\u97F3\u4E50app\u662F\u600E\u4E48\u5F04\u7684\uFF0C\n//   \u4E0D\u7BA1\u65E5\u671F\u5C0F\u5B57\uFF0C\u6D88\u6B67\u7801\u7684\u903B\u8F91\u90FD\u53EF\u4EE5\u5B66\u300D\u300C\u90FD\u662F HTML \u6392\u7248\u8FDB gallery \u7684\u4E24\u4E2A\u69FD \u5BF9\u300D\u3002\n//   \u843D\u5728\u54EA\u4E00\u5C42\uFF1A\u5370\u5B57\u662F\u5BBF\u4E3B\u7684\u6392\u7248\uFF0C\u4E0D\u8FDB\u56FE\u5E93\u5305\u3002\u5305\u7ED9\u4E24\u4E2A\u69FD\u2014\u2014\u5360\u4F4D\uFF08ui.tilePlaceholderHtml\uFF0C\u6CA1\u6709\u5C01\u9762\u56FE\u65F6\u57AB\u7684\u90A3\u5757\u5E95\u8272\uFF09\u548C\u8986\u76D6\u5C42\uFF08ui.tileOverlayHtml\uFF0C\u6709\u6CA1\u6709\u56FE\u90FD\u76D6\u5728\u4E0A\u9762\uFF09\u3002\n//   \u672C\u6587\u4EF6\u53EA\u51FA\u4E24\u6BB5 HTML\uFF08\u7EAF\u51FD\u6570\uFF0C\u65E0 DOM\uFF09\uFF1B\u989C\u8272 / \u5B57\u53F7\u5168\u5728 styles.css\u300C\u4E66\u67B6\u5C01\u9762\u300D\u4E00\u8282\u3002\n// \u6392\u7248\u89C4\u5219\uFF08\u5B66 WXHW book-cover.ts\uFF0C\u5F62\u72B6\u6362\u6210\u5531\u7247\u5C01\u9762\uFF09\uFF1A\n//   \u00B7 \u540D\u5B57\u5148\u62C6\u65E5\u671F\u524D\u7F00\uFF08\u516B\u4F4D\u65E5\u671F + \u5206\u9694 + \u5176\u4F59\uFF0C\u5206\u9694\u54EA\u8FB9\u90FD\u4E0D\u8FDB\uFF09\uFF1A\u6B4C\u540D\u5370\u5927\u5B57\uFF1B\u65E5\u671F\u5370\u5C0F\u5B57\uFF08\u5DE6\u4E0A\uFF09\u3002\n//   \u00B7 \u6CA1\u8D77\u540D\u7684\u6B4C\uFF08`yyyymmdd-hex4`\uFF09\uFF1A\u5927\u5B57\u7684\u4F4D\u7F6E\u5370\u90A3\u56DB\u4F4D\u6D88\u6B67\u7801\uFF0C\u7B49\u5BBD\u3001\u6DE1\u8272\uFF08\u4E00\u773C\u770B\u51FA\u6CA1\u8D77\u540D\uFF09\u3002\n//   \u00B7 \u6C49\u5B57\u4E3A\u4E3B \u2192 \u7AD6\u6392\uFF08\u53F3\u4E0A\u8D77\u4E00\u5217\u4E00\u5217\uFF09\uFF1B\u62C9\u4E01\u4E3A\u4E3B \u2192 \u6A2A\u6392\u3001\u6309\u8BCD\u6298\u884C\u3001\u9760\u5DE6\u4E0B\uFF08\u4E13\u8F91\u5C01\u9762\u7684\u60EF\u4F8B\uFF1A\u5927\u5B57\u5728\u4E0B\uFF0C\u827A\u4EBA\u4E00\u884C\u5728\u5B83\u4E0B\u9762\uFF09\u3002\n//   \u00B7 \u5B57\u53F7\u6309\u5B57\u6570\u5206\u56DB\u6863\uFF0C\u5355\u4F4D\u662F\u5361\u7247\u5BBD\u5EA6\u7684\u767E\u5206\u6BD4\uFF08cqw\uFF09\u3002\n//   \u00B7 \u5E95\u8272\uFF1A\u6CA1\u6709\u56FE\u65F6\u6309\u6B4C\u540D\u54C8\u5E0C\u4ECE\u4E00\u5C0F\u7EC4\u54D1\u8272\u91CC\u9009\u4E00\u5757\uFF08\u6241\u5E73\u3001\u4E0D\u6E10\u53D8\uFF09\uFF1B\u6709\u56FE\u65F6\u56FE\u94FA\u6EE1 + \u5E95\u90E8\u4E00\u9053\u6DE1\u6E10\u53D8\u6258\u4F4F\u5B57\u3002\n//   \u00B7 \u4F5C\u8005\u884C = \u4F5C\u8005\u680F\u7B2C\u4E00\u884C\uFF08\u5BBF\u4E3B\u7ED9\uFF09\uFF1B\u6CA1\u6709\u5C31\u4E0D\u5370\u3002\n\nconst CJK = /[\u3040-\u30FF\u3400-\u9FFF\uAC00-\uD7AF\u8C48-\uFAFF]/;\nconst esc = (x: string): string => x.replace(/[&<>\"]/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\" }[c]!));\n\n/** `yyyymmdd[-_ ]\u5176\u4F59` \u2192 { date, title }\uFF1B\u4E0D\u5E26\u65E5\u671F\u7684\u539F\u6837\u5F53 title\u3002 */\nexport function splitDatedStem(stem: string): { date: string | null; title: string } {\n  const m = /^(\\d{8})(?:[\\s_\\-\uFF0D\u2014\u2013]+)?(.*)$/.exec(stem.trim());\n  if (!m) return { date: null, title: stem.trim() };\n  return { date: m[1], title: m[2].trim() };\n}\n/** \u56DB\u4F4D\u6D88\u6B67\u7801\uFF08\u6CA1\u8D77\u540D\u7684\u6B4C\uFF1A`yyyymmdd-hex4`\uFF09\u3002 */\nexport const isCodeTitle = (t: string): boolean => /^[0-9a-f]{4}$/i.test(t);\n\nexport interface CoverPlan { date: string | null; title: string; vertical: boolean; size: \"xl\" | \"l\" | \"m\" | \"s\"; coded: boolean; hue: number }\n/** \u6B4C\u540D\u600E\u4E48\u6392\uFF08\u7EAF\u51FD\u6570\uFF0C\u6D4B\u8BD5\u7528\u5B83\uFF09\uFF1A\u7AD6 / \u6A2A\u3001\u5B57\u53F7\u6863\u3001\u5E95\u8272\u8272\u76F8\uFF08\u540D\u5B57\u54C8\u5E0C\uFF09\u3002 */\nexport function planCover(stem: string): CoverPlan {\n  const { date, title } = splitDatedStem(stem);\n  const chars = [...title].filter((c) => !/\\s/.test(c));\n  const cjk = chars.filter((c) => CJK.test(c)).length, other = chars.length - cjk;\n  const vertical = cjk > 0 && cjk * 2 >= other;\n  const n = chars.length;\n  const size = vertical ? (n <= 4 ? \"xl\" : n <= 8 ? \"l\" : n <= 14 ? \"m\" : \"s\") : (n <= 7 ? \"xl\" : n <= 16 ? \"l\" : n <= 32 ? \"m\" : \"s\");\n  let h = 0; for (const c of stem) h = (h * 31 + c.codePointAt(0)!) >>> 0;\n  return { date, title, vertical, size, coded: date != null && isCodeTitle(title), hue: h % 8 };\n}\n/** \u7AD6\u6392\u6B63\u6587\uFF1A\u4E00\u4E24\u4E2A\u5B57\u7B26\u7684\u62C9\u4E01 / \u6570\u5B57\u5C0F\u4E32\u5305\u6210\u7EB5\u4E2D\u6A2A\u3002 */\nfunction verticalRuns(title: string): string {\n  return title.split(/([A-Za-z0-9]+)/).map((run, i) => (i % 2 === 1 && run.length <= 2 ? `<span class=\"tcy\">${esc(run)}</span>` : esc(run))).join(\"\");\n}\n/** \u6CA1\u6709\u5C01\u9762\u56FE\u65F6\u57AB\u5728\u4E0B\u9762\u7684\u90A3\u5757\u5E95\u8272\uFF08\u56FE\u5E93\u5305\u7684\u5360\u4F4D\u69FD\uFF09\uFF1A\u53EA\u6709\u989C\u8272\uFF0C\u4E0D\u5370\u5B57\u2014\u2014\u5B57\u5728\u4E0A\u9762\u90A3\u4E00\u5C42\u3002 */\nexport function placeholderHtml(stem: string): string {\n  return `<span class=\"ms-cover-bg hue-${planCover(stem).hue}\"></span>`;\n}\n/** \u5370\u5728\u5C01\u9762\u4E0A\u7684\u90A3\u4E00\u5C42\uFF08\u56FE\u5E93\u5305\u7684\u8986\u76D6\u5C42\u69FD\uFF09\uFF1A\u6B4C\u540D / \u4F5C\u8005 / \u65E5\u671F\u3002\u5E95\u4E0B\u662F\u5C01\u9762\u56FE\u8FD8\u662F\u5E95\u8272\uFF0C\u5370\u6CD5\u90FD\u4E00\u6837\u3002\n *  finalRev = \u5B9A\u7A3F\u4E86\u7B2C\u51E0\u7248\uFF08W-38\uFF1Buser 2026-10-16\u300C\u5370\u5B9A\u7A3Fn\u300D\uFF09\uFF1A\u5E95\u680F\u5DE6\u8FB9\u65E5\u671F\u540E\u9762\u5370\u300C\u5B9A\u7A3F N\u300D\uFF1B\u6CA1\u5B9A\u7A3F = \u4E0D\u5370\u3002 */\nexport interface CoverExtra { artist?: string | null; sizeText?: string; editedText?: string; finalRev?: number | null }\nexport function coverHtml(stem: string, extra: CoverExtra = {}): string {\n  const p = planCover(stem);\n  const cls = `ms-cover ${p.vertical ? \"v\" : \"h\"} sz-${p.size}${p.coded ? \" coded\" : \"\"}`;\n  const title = p.vertical ? verticalRuns(p.title) : esc(p.title);\n  const artist = extra.artist ? `<span class=\"ms-cover-artist\">${esc(extra.artist)}</span>` : \"\";\n  const fin = extra.finalRev != null ? `<span class=\"ms-cover-final\">\u5B9A\u7A3F ${extra.finalRev}</span>` : \"\";\n  const left = p.date || fin ? `<span class=\"ms-cover-left\">${p.date ? `<span class=\"ms-cover-date\">${esc(p.date)}</span>` : \"\"}${fin}</span>` : \"<span></span>\";\n  const bar = `<span class=\"ms-cover-bar\">${left}${extra.sizeText ? `<span class=\"ms-cover-size\">${esc(extra.sizeText)}</span>` : \"\"}</span>`;\n  return `<span class=\"${cls}\"${extra.editedText ? ` title=\"${esc(extra.editedText)}\"` : \"\"}><span class=\"ms-cover-title\"${p.vertical ? \"\" : ' lang=\"en\"'}>${title}</span>${artist}${bar}</span>`;\n}\n", "// song-player.ts \u2014\u2014 \u6B4C\u5E93\u7684\u64AD\u653E\u5668\uFF1A\u4E00\u4E2A <audio> + \u7CFB\u7EDF\u5A92\u4F53\u63A7\u4EF6\uFF08\u9501\u5C4F / \u63A7\u5236\u4E2D\u5FC3 / \u8033\u673A\u952E / \u952E\u76D8\u5A92\u4F53\u952E\uFF09\u3002created 2026-10-16 by Claude Opus 5.5\n//   user 2026-10-16\u300C\u81F3\u5C11\u5728gallery\u4FA7\u80FD\u505A\u5230\u9501\u5C4F\u64AD\u653E\u5417\uFF08\u53EF\u4EE5\u9009\u62E9\u662F\u5426loop\uFF09\u300D\u2192\u300C\u90A3\u4E48\u53EA\u505A\u6B4C\u5E93\u7684\u9501\u5C4F\uFF0C\u505A\u5E72\u51C0\u70B9\u300D\u300C\u6B4C\u5E93\u91CC\u9762\u53EF\u4EE5\u8BBE\u7F6E\u5FAA\u73AF\u4E0E\u5426\u300D\u3002\n//   \u4E3A\u4EC0\u4E48\u662F <audio> \u4E0D\u662F Web Audio\uFF1AiPad \u4E00\u9501\u5C4F\u5C31\u628A Web Audio \u6390\u6389\uFF08\u7F16\u8F91\u5668\u7684\u5B9E\u65F6\u5F15\u64CE\u5C31\u662F\u8FD9\u6837\uFF0C\u90A3\u8FB9\u4E0D\u505A\uFF09\uFF1B\u5A92\u4F53\u5143\u7D20\u5728\u4E3B\u5C4F PWA \u91CC\u9501\u5C4F\u7167\u653E\u3002\n//   iPad \u7684\u5751\uFF08\u5BB6\u65CF Background Radio docs/20260524-media-session.md\u300120260524-ios-safari-pwa-quirks.md \u8BB0\u7684\uFF09\u5728\u8FD9\u91CC\u4E00\u6B21\u6536\u6389\uFF1A\n//   \u2460 \u53EA\u8BA4\u624B\u6307\u70B9\u4E0B\u90A3\u4E00\u523B\u7684 play()\uFF1B\u53D6 mp3 \u8981\u7B49\uFF08\u4E91\u7AEF\u8D70\u7F51\u7EDC\uFF09\u2192 \u70B9\u4E0B\u65F6\u5148 arm()\uFF1A\u7A7A\u653E\u4E00\u5C0F\u6BB5\u9759\u97F3\uFF0C\u8FD9\u4E2A\u5143\u7D20\u62FF\u5230\u8BB8\u53EF\uFF0C\u53D6\u5230\u4E86\u518D\u6362\u771F\u7684\uFF1B\n//   \u2461 \u9501\u5C4F\u6309\u94AE\u5728\u5F00\u59CB\u653E\u4E4B\u524D\u767B\u8BB0 iPad \u53EF\u80FD\u4E0D\u8BA4 \u2192 \u6BCF\u9996\u7B2C\u4E00\u6B21 playing \u65F6\u624D\u767B\u8BB0\uFF1B\n//   \u2462 \u64AD\u653E / \u6682\u505C\u3001\u8FDB\u5EA6\uFF08\u542B\u5FAA\u73AF\u7ED5\u56DE\u5F00\u5934\uFF09\u90FD\u62A5\u7ED9\u7CFB\u7EDF\uFF0C\u9501\u5C4F\u4E0A\u7684\u6309\u94AE\u548C\u8FDB\u5EA6\u6761\u624D\u5BF9\u5F97\u4E0A\u3001\u80FD\u62D6\u3002\n//   \u5FAA\u73AF = \u8FD9\u6B21\u6253\u5F00\u6709\u6548\uFF08\u540C\u7F16\u8F91\u5668\u7684\u300C\u5FAA\u73AF\u300D\uFF0C\u4E0D\u8FDB\u5B58\u50A8\uFF09\uFF1B\u9501\u5C4F\u4E0A\u7CFB\u7EDF\u6CA1\u6709\u5FAA\u73AF\u94AE\uFF0C\u5728\u64AD\u653E\u6761\u4E0A\u5F00\u597D\u518D\u9501\u5C4F\u3002\n//   \u4ECE\u5934\u653E = restart()\uFF082026-10-17 by Claude Opus 5.5\uFF1Buser\u300Cgallery\u64AD\u653E\u6CA1\u6709\u4ECE\u5934\u518D\u6765\u7684\u529F\u80FD\uFF0C\u6211\u6709\u65F6\u5019\u60F3\u4ECE\u5934\u542C\u300D\u2192 \u64AD\u653E\u6761\u52A0\u952E\u300C\u505A\u300D\uFF09\uFF1A\u64AD\u653E\u6761\u7684 |\u25B6 \u548C\u9501\u5C4F / \u8033\u673A\u7684\u300C\u4E0A\u4E00\u9996\u300D\u90FD\u8D70\u5B83\u3002\n//   \u4E0D\u78B0\u754C\u9762\uFF1A\u64AD\u653E\u6761\u5F52\u5BBF\u4E3B\uFF08gallery-host.ts\uFF09\uFF0C\u8FD9\u91CC\u53EA\u51FA\u72B6\u6001 + onChange\u3002\n\nexport interface SongTrack {\n  /** \u8C01\u5728\u653E\uFF08\u6B4C\u5E93 = \u8EAB\u4EFD\uFF09\uFF1Btoggle / \u72B6\u6001\u6309\u5B83\u8BA4\u3002 */\n  key: string;\n  /** mp3 \u5B57\u8282\uFF08type \u7531\u8C03\u7528\u65B9\u7ED9\uFF0C\u6B4C\u5E93 = audio/mpeg\uFF09\u3002 */\n  blob: Blob;\n  title: string;\n  artist?: string;\n  album?: string;\n  /** \u5C01\u9762\u56FE\uFF1B\u6CA1\u6709 = \u7528 fallbackArtwork\uFF08app \u56FE\u6807\uFF09\u3002 */\n  cover?: Blob | null;\n}\nexport interface SongPlayerState {\n  /** \u88C5\u7740\u54EA\u9996\uFF08null = \u6CA1\u6709\uFF0C\u64AD\u653E\u6761\u6536\u8D77\uFF09\u3002 */\n  key: string | null;\n  paused: boolean;\n  time: number;\n  duration: number;\n  loop: boolean;\n}\n/** playing = \u5728\u653E\uFF1Bblocked = \u6D4F\u89C8\u5668\u6CA1\u8BA9\u81EA\u5DF1\u5F00\u59CB\u653E\uFF08\u88C5\u597D\u4E86\u3001\u6682\u505C\u7740\uFF0C\u70B9\u64AD\u653E\u6761\u4E0A\u7684 \u25B6 \u5C31\u653E\uFF09\uFF1Breplaced = \u7B49\u7684\u65F6\u5019\u88AB\u4E0B\u4E00\u9996 / \u505C\u9876\u6389\u4E86\u3002 */\nexport type PlayResult = \"playing\" | \"blocked\" | \"replaced\";\n\nexport interface SongPlayerDeps {\n  /** \u6D4B\u8BD5\u6CE8\u5165\u5047\u7684\uFF1B\u4E0D\u7ED9 = new Audio()\u3002 */\n  audio?: HTMLAudioElement;\n  /** \u4E0D\u7ED9 = navigator.mediaSession\uFF08\u6CA1\u6709\u5C31\u53EA\u5728 app \u91CC\u653E\uFF09\uFF1Bnull = \u4E0D\u63A5\u7CFB\u7EDF\u63A7\u4EF6\u3002 */\n  mediaSession?: MediaSession | null;\n  makeMetadata?: (init: MediaMetadataInit) => MediaMetadata;\n  /** \u6CA1\u5C01\u9762\u65F6\u9501\u5C4F\u4E0A\u7684\u56FE\uFF08\u7EDD\u5BF9\u5730\u5740\uFF09\u3002 */\n  fallbackArtwork?: MediaImage[];\n  /** \u653E\u7684\u9014\u4E2D\u574F\u4E86\uFF08\u6587\u4EF6\u574F / \u89E3\u4E0D\u4E86\uFF09\uFF1A\u5DF2\u7ECF\u505C\u4E86\uFF0C\u544A\u8BC9\u4EBA\u4E00\u58F0\u3002 */\n  onError?: (message: string) => void;\n}\n\n/** \u9501\u5C4F\u4E0A\u300C\u5FEB\u9000 / \u5FEB\u8FDB\u300D\u4E00\u4E0B\u7684\u79D2\u6570\uFF08\u7CFB\u7EDF\u6CA1\u7ED9 seekOffset \u65F6\uFF09\u3002 */\nconst SEEK_STEP_SECS = 10;\n\nexport function createSongPlayer(deps: SongPlayerDeps = {}) {\n  const audio = deps.audio ?? new Audio();\n  audio.preload = \"auto\";\n  const ms: MediaSession | null = deps.mediaSession !== undefined ? deps.mediaSession\n    : (typeof navigator !== \"undefined\" && \"mediaSession\" in navigator ? navigator.mediaSession : null);\n  const makeMetadata = deps.makeMetadata ?? ((init: MediaMetadataInit) => new MediaMetadata(init));\n  let track: SongTrack | null = null;   // \u771F\u88C5\u7740\u7684\u90A3\u9996\uFF08arm \u7684\u9759\u97F3\u4E0D\u7B97\uFF1A\u4E8B\u4EF6\u4E00\u5F8B\u4E0D\u8BA4\uFF09\n  let url: string | null = null;\n  let loop = false;\n  let blessed = false;   // \u8FD9\u4E2A\u5143\u7D20\u5728\u624B\u52BF\u91CC\u653E\u6210\u529F\u8FC7 = \u4EE5\u540E\u4E0D\u7528\u518D arm\n  let announced = false; // \u8FD9\u9996\u767B\u8BB0\u8FC7\u9501\u5C4F\u6CA1\u6709\n  let artwork: MediaImage[] | null = null;\n  let lastTime = 0;\n  let silentUrl: string | null = null;\n  const listeners = new Set<() => void>();\n  const emit = () => { for (const f of listeners) { try { f(); } catch { /* \u4E00\u4E2A\u542C\u4F17\u574F\u4E86\u4E0D\u62D6\u7D2F\u522B\u7684 */ } } };\n\n  const setAction = (a: MediaSessionAction, f: MediaSessionActionHandler | null) => { try { ms?.setActionHandler(a, f); } catch { /* \u8FD9\u4E2A\u6D4F\u89C8\u5668\u4E0D\u8BA4\u8FD9\u4E2A\u52A8\u4F5C */ } };\n  const setPlaybackState = (s: MediaSessionPlaybackState) => { try { if (ms) ms.playbackState = s; } catch { /* \u65E0\u59A8 */ } };\n  function setMetadata(): void {\n    if (!ms || !track) return;\n    try { ms.metadata = makeMetadata({ title: track.title, artist: track.artist ?? \"\", album: track.album ?? \"\", artwork: artwork ?? deps.fallbackArtwork ?? [] }); } catch { /* \u65E0\u59A8 */ }\n  }\n  function pushPosition(): void {\n    if (!ms || !track) return;\n    const d = audio.duration;\n    if (!Number.isFinite(d) || d <= 0) return;   // \u7CFB\u7EDF\u8981 duration > 0\u3001position \u2264 duration\uFF0C\u4E0D\u7136\u629B\n    try { ms.setPositionState?.({ duration: d, position: Math.min(Math.max(0, audio.currentTime), d), playbackRate: audio.playbackRate || 1 }); } catch { /* \u8001 Safari \u6CA1\u6709 */ }\n  }\n  function seek(to: number): void {\n    if (!track) return;\n    const d = audio.duration;\n    audio.currentTime = Math.max(0, Number.isFinite(d) ? Math.min(to, d) : to);\n  }\n  /** \u7B2C\u4E00\u6B21 playing \u65F6\u767B\u8BB0\u9501\u5C4F\uFF08\u592A\u65E9 iPad \u4E0D\u8BA4\uFF09\u3002\u53EA\u6709\u4E00\u9996\uFF1A\u300C\u4E0A\u4E00\u9996\u300D= \u4ECE\u5934\u653E\uFF08\u540C\u97F3\u4E50 app \u7684 \u23EE\uFF09\u3001\u4E0D\u753B\u4E0B\u4E00\u9996\uFF1B\u7ED9\u5FEB\u9000 / \u5FEB\u8FDB / \u62D6\u8FDB\u5EA6\u3002\n   *  iPad \u9501\u5C4F\u767B\u8BB0\u4E86\u300C\u4E0A\u4E00\u9996\u300D\u5DE6\u8FB9\u90A3\u9897\u4F1A\u4ECE\u5FEB\u9000\u6362\u6210 \u23EE\uFF08\u8FDB\u5EA6\u6761\u7167\u6837\u80FD\u62D6\uFF09\u3002 */\n  function announce(): void {\n    if (!ms || !track) return;\n    setMetadata();\n    setAction(\"play\", () => resume());\n    setAction(\"pause\", () => audio.pause());\n    setAction(\"stop\", () => stop());\n    setAction(\"seekto\", (e) => { if (e.seekTime != null) seek(e.seekTime); });\n    setAction(\"seekbackward\", (e) => seek(audio.currentTime - (e.seekOffset || SEEK_STEP_SECS)));\n    setAction(\"seekforward\", (e) => seek(audio.currentTime + (e.seekOffset || SEEK_STEP_SECS)));\n    setAction(\"previoustrack\", () => restart()); setAction(\"nexttrack\", null);\n    announced = true;\n  }\n  function unannounce(): void {\n    if (!ms) return;\n    for (const a of [\"play\", \"pause\", \"stop\", \"seekto\", \"seekbackward\", \"seekforward\", \"previoustrack\"] as MediaSessionAction[]) setAction(a, null);\n    try { ms.metadata = null; } catch { /* \u65E0\u59A8 */ }\n    setPlaybackState(\"none\");\n  }\n  /** \u5378\u4E0B\u88C5\u7740\u7684\u90A3\u9996\uFF08\u5148\u6E05 track\uFF1A\u5143\u7D20\u590D\u4F4D\u65F6\u5192\u51FA\u6765\u7684\u4E8B\u4EF6\u4E0D\u8BA4\uFF09\u3002 */\n  function unload(): void {\n    track = null; announced = false; artwork = null; lastTime = 0;\n    audio.pause(); audio.removeAttribute(\"src\"); audio.load();\n    if (url) { URL.revokeObjectURL(url); url = null; }\n  }\n\n  audio.addEventListener(\"playing\", () => { if (!track) return; if (!announced) announce(); setPlaybackState(\"playing\"); pushPosition(); emit(); });\n  audio.addEventListener(\"pause\", () => { if (!track) return; setPlaybackState(\"paused\"); pushPosition(); emit(); });\n  audio.addEventListener(\"loadedmetadata\", () => { if (track) { pushPosition(); emit(); } });\n  audio.addEventListener(\"seeked\", () => { if (track) { lastTime = audio.currentTime; pushPosition(); emit(); } });\n  // \u5FAA\u73AF\u7ED5\u56DE\u5F00\u5934\u4E0D\u4E00\u5B9A\u6709 seeked\uFF1A\u65F6\u95F4\u5F80\u56DE\u8DF3\u4E86\u5C31\u91CD\u62A5\u4E00\u6B21\u8FDB\u5EA6\uFF08\u9501\u5C4F\u7684\u8FDB\u5EA6\u6761\u662F\u7CFB\u7EDF\u6309\u4E0A\u6B21\u62A5\u7684\u81EA\u5DF1\u5F80\u524D\u63A8\u7684\uFF09\n  audio.addEventListener(\"timeupdate\", () => { if (!track) return; const t = audio.currentTime; if (t + 1 < lastTime) pushPosition(); lastTime = t; emit(); });\n  audio.addEventListener(\"ended\", () => { if (track) emit(); });   // \u6CA1\u5F00\u5FAA\u73AF\uFF1A\u653E\u5B8C\u505C\u5728\u7ED3\u5C3E\uFF0C\u518D\u70B9 \u25B6 \u4ECE\u5934\u653E\n  audio.addEventListener(\"error\", () => { if (!track) return; stop(); deps.onError?.(\"\u8FD9\u4EFD mp3 \u653E\u4E0D\u4E86\uFF08\u6587\u4EF6\u574F\u4E86\uFF1F\uFF09\"); });\n\n  /** \u5728\u70B9\u51FB\u91CC\u540C\u6B65\u8C03\uFF08\u53D6 mp3 \u4E4B\u524D\uFF09\uFF1A\u7A7A\u653E\u4E00\u5C0F\u6BB5\u9759\u97F3\uFF0C\u8BA9 iPad \u7ED9\u8FD9\u4E2A\u5143\u7D20\u653E\u7684\u8BB8\u53EF\u3002\u62FF\u5230\u8FC7\u5C31\u4E0D\u518D\u505A\u3002 */\n  function arm(): void {\n    if (blessed) return;\n    if (track) stop();   // \u88C5\u7740\u5374\u6CA1\u62FF\u5230\u8BB8\u53EF\u7684\u90A3\u9996\uFF08blocked\uFF09\uFF1A\u6362\u6210\u9759\u97F3\u53BB\u62FF\n    silentUrl ??= URL.createObjectURL(silentWav());\n    audio.loop = false;\n    audio.src = silentUrl;\n    void audio.play()?.then(() => { blessed = true; }, () => { /* \u6CA1\u62FF\u5230\uFF1Aplay() \u65F6\u518D\u8BF4 */ });\n  }\n  /** \u6362\u4E0A\u8FD9\u9996\u5E76\u5F00\u59CB\u653E\u3002 */\n  async function play(t: SongTrack): Promise<PlayResult> {\n    unload();\n    track = t;\n    url = URL.createObjectURL(t.blob);\n    audio.src = url; audio.loop = loop;\n    if (t.cover) void artworkOf(t.cover).then((a) => { if (track !== t || !a) return; artwork = a; if (announced) setMetadata(); }, () => { /* \u5C01\u9762\u8BFB\u4E0D\u4E86 = \u7528 app \u56FE\u6807 */ });\n    emit();\n    try { await audio.play(); blessed = true; return \"playing\"; }\n    catch (e) {\n      if (track !== t) return \"replaced\";\n      if ((e as { name?: string })?.name === \"NotAllowedError\") { emit(); return \"blocked\"; }\n      stop(); throw e;\n    }\n  }\n  function resume(): void {\n    if (!track) return;\n    void audio.play().then(() => { blessed = true; }, () => emit());\n  }\n  function toggle(): void { if (!track) return; if (audio.paused) resume(); else audio.pause(); }\n  /** \u4ECE\u5934\u653E\uFF1A\u56DE\u5230\u5F00\u5934\u3001\u653E\u7740 / \u505C\u7740 / \u653E\u5B8C\u4E86\u90FD\u63A5\u7740\u653E\u3002 */\n  function restart(): void { if (!track) return; seek(0); resume(); }\n  function stop(): void { const had = track != null; unload(); unannounce(); if (had) emit(); }\n  function setLoop(on: boolean): void { loop = on; if (track) audio.loop = on; emit(); }\n  const state = (): SongPlayerState => ({ key: track?.key ?? null, paused: !track || audio.paused, time: track ? audio.currentTime : 0, duration: track ? audio.duration : NaN, loop });\n  return {\n    arm, play, toggle, restart, stop, setLoop, state,\n    /** \u5728\u653E\u7684\u90A3\u9996\uFF08\u6682\u505C / \u6CA1\u88C5 = null\uFF09\u3002 */\n    playing: (): string | null => (track && !audio.paused ? track.key : null),\n    onChange(fn: () => void): () => void { listeners.add(fn); return () => listeners.delete(fn); },\n  };\n}\nexport type SongPlayer = ReturnType<typeof createSongPlayer>;\n\n/** \u4E00\u5C0F\u6BB5\u9759\u97F3 WAV\uFF0816-bit \u5355\u58F0\u9053\uFF09\uFF1Aarm() \u62FF\u8BB8\u53EF\u7528\u3002 */\nexport function silentWav(ms = 50, sampleRate = 8000): Blob {\n  const n = Math.round(sampleRate * ms / 1000), buf = new ArrayBuffer(44 + n * 2), v = new DataView(buf);\n  const tag = (o: number, s: string) => { for (let i = 0; i < s.length; i++) v.setUint8(o + i, s.charCodeAt(i)); };\n  tag(0, \"RIFF\"); v.setUint32(4, 36 + n * 2, true); tag(8, \"WAVE\");\n  tag(12, \"fmt \"); v.setUint32(16, 16, true); v.setUint16(20, 1, true); v.setUint16(22, 1, true);\n  v.setUint32(24, sampleRate, true); v.setUint32(28, sampleRate * 2, true); v.setUint16(32, 2, true); v.setUint16(34, 16, true);\n  tag(36, \"data\"); v.setUint32(40, n * 2, true);\n  return new Blob([buf], { type: \"audio/wav\" });\n}\n\n/** \u5C01\u9762 \u2192 \u9501\u5C4F\u7684\u56FE\u3002\u7528 data: \u5730\u5740\u4E0D\u7528 blob:\uFF08\u9501\u5C4F\u90A3\u8FB9\u4E0D\u4E00\u5B9A\u5728\u8FD9\u4E2A\u9875\u9762\u91CC\u53D6\u56FE\uFF0C\u5B57\u8282\u5E26\u5728\u5730\u5740\u91CC\u6700\u7A33\uFF09\uFF1BPNG \u8BFB\u5F97\u51FA\u5C3A\u5BF8\u5C31\u5199\u4E0A\u3002 */\nexport async function artworkOf(cover: Blob): Promise<MediaImage[] | null> {\n  const u8 = new Uint8Array(await cover.arrayBuffer());\n  if (!u8.length) return null;\n  let s = \"\";\n  for (let i = 0; i < u8.length; i += 0x8000) s += String.fromCharCode(...u8.subarray(i, i + 0x8000));\n  const type = cover.type || \"image/png\";\n  const img: MediaImage = { src: `data:${type};base64,${btoa(s)}`, type };\n  const isPng = u8.length >= 24 && u8[0] === 0x89 && u8[1] === 0x50 && u8[2] === 0x4e && u8[3] === 0x47;\n  if (isPng) { const dv = new DataView(u8.buffer, u8.byteOffset); img.sizes = `${dv.getUint32(16)}x${dv.getUint32(20)}`; }\n  return [img];\n}\n", "// gallery-host.ts \u2014\u2014 \u6B4C\u5E93\uFF08@internal/gallery \u7684 MoonSinger \u6D88\u8D39\u9762\uFF09\uFF1A\u72EC\u7ACB\u4E00\u5C4F\u76D6\u4F4F\u7F16\u8F91\u5668\uFF0C\u5361\u7247 = \u5531\u7247\u5C01\u9762\u3002created 2026-10-08 by Claude Fable 5.1\n//   \u6284 WebXiaoHeiWu src/gallery-host.ts\uFF080.7.0 \u5F62\uFF09\u3002\u5305\u51FA\u5C4F\u5E55 + \u52A8\u8BCD + \u6570\u636E\u9762\uFF1B\u672C\u6587\u4EF6\u53EA\u51FA\uFF1AVue \u6CE8\u5165\u3001DocHost\uFF08\u7F16\u8F91\u5668\u7AEF\u53E3\uFF09\u3001policy\uFF08\u4E00\u79CD\u6587\u6863 song = .mxl\uFF1B\n//   \u7F29\u7565\u56FE = \u6B4C zip \u6700\u540E\u4E00\u4E2A entry Thumbnails/thumbnail.png \u5C3E\u8BFB\uFF0CWXHW ADR-0012 \u540C\u6B3E\uFF09\u3001chrome\uFF08\u8FD4\u56DE / \u4E91 / \u5237\u65B0 / \u65B0\u5EFA / \u56DE\u6536\u7AD9 / \u8BBE\u7F6E\uFF09\u3002\n//   \u5C01\u9762\u7684\u5B57\uFF08\u6B4C\u540D / \u65E5\u671F / \u5927\u5C0F\uFF09= src/ui/song-cover.ts \u6392\u7248\u8FDB\u5305\u7684\u4E24\u4E2A\u69FD\uFF1B\u6587\u6848 = \u5305\u5185 zh \u9ED8\u8BA4 + \u51E0\u6761\u6362\u6210\u6B4C\u5E93\u53E3\u543B\u3002\n//   \u6D3E\u751F\u7F13\u5B58 IDB `moonsinger-thumbs`\uFF08user 2026-10-08\u300C\u6CA1\u95EE\u9898\u300D\u6279\uFF1BCLAUDE.md \u6301\u4E45\u5C42\u767D\u540D\u5355\u8868\u767B\u8BB0\uFF09\u3002\nimport { createApp, defineComponent, reactive, ref, computed, watch, onMounted, onUnmounted, nextTick, Teleport } from \"../vendor/vue/vue.esm-browser.prod.js\";\nimport { createGallery, humanSize, type CreateGalleryDeps, type GalleryDocHost, type VueRuntime, type GItem, type TileInfo, type TileAction, type VerbStore, type DataFaceStore, type Gallery, type GalleryView, type AsideKind, type AsideScope } from \"@internal/gallery\";\nimport { configureGalleryRegistry } from \"@internal/gallery\";\nimport { APP_DB_PREFIX } from \"./config.ts\";\n// \u56FE\u5E93\u5305\u7684\u6CE8\u518C\u8868\uFF080.8.7 \u8D77\u5E93\u540D\u5F52\u5BBF\u4E3B\uFF09\uFF1A\u672C app \u4E0D\u7528\u5B83\uFF08\u5355\u5E93\uFF09\uFF0C\u4F46\u4E07\u4E00\u5305\u5185\u90E8\u5F00\u4E86\uFF0C\u4E5F\u843D\u5728\u81EA\u5BB6 GUID \u524D\u7F00\u4E0B\uFF08\u5BB6\u65CF\u547D\u540D\u89C4\u77E9\uFF1B\u8FD8\u539F\u51FA\u5382\u6309\u524D\u7F00\u5220\u5F97\u5230\uFF09\u3002import \u672C\u8EAB\u96F6 IDB \u8BBF\u95EE\u30022026-10-21\nconfigureGalleryRegistry({ dbName: `${APP_DB_PREFIX}gallery-registry` });\nimport { requireStore, auth, hasStore, isSignedIn } from \"./app-store.ts\";\nimport { THUMBNAIL_ENTRY, FINAL_MP3_ENTRY } from \"./format/project.ts\";\nimport { parseFinalRecord, type FinalRecord } from \"./format/final.ts\";\nimport { identifiers } from \"./identifiers.ts\";\nimport { openConfirmSheet, openInputSheet, openChoiceSheet, withBusy } from \"./ui/sheets.ts\";\nimport { iconHtml } from \"./ui/icon.ts\";\nimport { coverHtml, placeholderHtml } from \"./ui/song-cover.ts\";\nimport { deviceKvGet, deviceKvSet } from \"./device-kv.ts\";\nimport { reportError, diagNote } from \"./app/report-error.ts\";\nimport { createSongPlayer } from \"./app/song-player.ts\";\n\nexport interface GalleryHostDeps {\n  activeIdentifier: () => string | null;\n  /** \u6253\u5F00\u4E00\u4E2A\u8EAB\u4EFD\uFF08\u6B4C\u5E93\u70B9\u5361\u7247\uFF09\u3002\u8FD4\u56DE true = \u7F16\u8F91\u5668\u5DF2\u5207\u8FC7\u53BB\u3002 */\n  openAny: (identifier: string) => Promise<boolean>;\n  /** \u6253\u5F00\u4E2D\u7684\u90A3\u9996\u88AB\u6B4C\u5E93\u632A\u4E86\u5939\uFF08\u5B57\u8282\u5DF2\u5728\u65B0\u8EAB\u4EFD\u4E0B\uFF09\uFF1A\u7F16\u8F91\u5668\u653E\u4E0B\u65E7\u8EAB\u4EFD\u3001\u6309\u65B0\u8EAB\u4EFD\u91CD\u5F00\uFF08\u7EDD\u4E0D\u628A\u65E7\u540D\u5B57\u5199\u56DE\u53BB\uFF09\u3002 */\n  setIdentifier: (identifier: string) => void;\n  /** \u7F16\u8F91\u5668\u81EA\u5DF1\u7684\u6539\u540D UI\uFF1B\u8FD4\u56DE\u65B0\u8EAB\u4EFD\uFF0C\u6CA1\u6539 \u2192 null\u3002 */\n  renameActive: () => Promise<string | null>;\n  pushNow: () => Promise<void>;\n  flushLocal: () => Promise<void>;\n  /** \u300C\u65B0\u5EFA\u300D\uFF1A\u5728\u6B4C\u5E93\u91CC\u65B0\u5EFA\u4E00\u9996\uFF08\u7A7A\u8C31\uFF09\u5E76\u6253\u5F00\u3002 */\n  newSong: () => Promise<void>;\n  openSettings: () => void;\n  /** \u300C\u5373\u5174\u300D\uFF08\u539F\u300C\u4E50\u5668\u300D\uFF0Cv0.9.41 user\u300Cgallery\u4E50\u5668\u6539\u6210\u5373\u5174\u300D\uFF09\uFF1A\u6B4C\u5E93\u4E0A\u9762\u5F00\u4E50\u5668\u76EE\u5F55\uFF0C\u53EA\u5F39\u7740\u73A9\u3001\u4E0D\u5199\u8FDB\u54EA\u9996\u6B4C\uFF08user 2026-10-08\u300C\u6B4C\u5E93\u5E94\u8BE5\u6709\u4E00\u4E2A\u4E13\u95E8\u7684\u4E50\u5668\u76EE\u5F55\u7684\u5165\u53E3\u300D\uFF09\u3002 */\n  openInstruments: () => void;\n  /** \u4E91\u6309\u94AE\uFF1A\u767B\u5F55 / \u9000\u51FA / \u8D26\u53F7\uFF08\u5BBF\u4E3B\u7684 auth \u83DC\u5355\uFF09\u3002 */\n  openCloudMenu: (anchor: HTMLElement) => void;\n  onOpened?: () => void;\n  onClosed?: () => void;\n}\nconst KV_FOLDER = \"gallery-folder\";\n/** \u4E0A\u6B21\u79BB\u5F00\u65F6\u5728\u54EA\u4E2A\u573A\u666F\uFF08WeebPaint \u884C\u4E3A\uFF1A\u4ECE\u6B4C\u5E93\u51FA \u2192 \u56DE\u6765\u5728\u6B4C\u5E93\uFF1B\u4ECE\u7F16\u8F91\u5668\u51FA \u2192 \u56DE\u6765\u5728\u7F16\u8F91\u5668\uFF09\u3002 */\nconst KV_SCENE = \"last-scene\";\n/** \u5C01\u9762\u5C3E\u8BFB\uFF08ADR-0012\uFF09\uFF1AThumbnails/thumbnail.png \u662F\u6B4C zip \u7684\u6700\u540E\u4E00\u4E2A entry\uFF08\u5B58\u7684\u65F6\u5019 STORE \u4E0D\u538B\uFF09\uFF1B\u5C3E\u7A97 128 KB\uFF08central directory + \u5C01\u9762 \u2264 70 KB \u4E00\u6B21\u547D\u4E2D\uFF09\u3002 */\nconst THUMB_PEEK_BYTES = 128 * 1024;\n/** \u5B9A\u7A3F\uFF08W-38\uFF1Buser 2026-10-13\u300Cgallery\u53EF\u4EE5\u8BD5\u542Cmp3\u4E0D\u7528\u5F00app\u300D\uFF09\uFF1A\u603B\u76EE\u5F55 `.moonsinger/manifest.json` \u6392\u5728\u5C01\u9762\u524D\u9762 = \u540C\u4E00\u4E2A\u5C3E\u7A97\u91CC\uFF0C\u6309 entry \u540D\u6293\u6765\u770B\u6709\u6CA1\u6709 `final`\n *  = \u56FE\u5E93\u5305 0.8.0 \u7684\u300C\u4E8B\u5B9E\u300D\uFF08`policy.facts`\uFF0C\u5305\u6309\u8EAB\u4EFD + \u5B57\u8282\u7248\u672C\u7F13\u5B58\u8FDB IDB `moonsinger-facts`\u3001\u5168\u5220\u53EF\u518D\u751F\u3001\u5230\u4E86\u54CD\u5E94\u5F0F\u91CD\u753B\uFF1Buser 2026-10-16\u300C\u56FE\u5E93\u5305\u6279\u4E86\u300D\uFF09\uFF1B\n *  \u6709 = \u5361\u7247\u53F3\u4E0B\u89D2\u4E00\u7C92 \u25B6\uFF08`ui.tileAction`\uFF0C\u5305\u753B\u3001\u5305\u63A5\u70B9\u51FB\u3001\u4E0D\u5F00\u5361\uFF09\uFF0C\u70B9\u4E86\u6309 entry \u540D\u6293 `.moonsinger/final.mp3`\uFF08\u4E0D\u538B\u7F29\uFF1B\u672C\u5730 = Blob.slice\uFF0C\u4E91\u7AEF = byte-range\uFF0C\u4E0D\u6574\u4EFD\u4E0B\u8F7D\uFF09\u653E\u7ED9\u4F60\u542C\u3002 */\nconst MANIFEST_ENTRY = \".moonsinger/manifest.json\";\nconst FACTS_DB = \"moonsinger-facts\";\n/** \u5361\u7247\u7684\u4E8B\u5B9E\uFF08\u6211\u4EEC\u8FD9\u8FB9\u7684\u5F62\u72B6\uFF1B\u5305\u4E0D\u8BA4\u8BC6\u5B83\uFF09\uFF1A\u5B9A\u7A3F\u4E86 = { final: { rev, secs } }\uFF1B\u6CA1\u5B9A\u7A3F = null\u3002 */\ntype SongFacts = { final: { rev: number; secs: number } } | null;\nconst factsOf = (v: unknown): SongFacts => { const f = (v as { final?: { rev?: unknown; secs?: unknown } } | null)?.final; return f && typeof f.rev === \"number\" ? { final: { rev: f.rev, secs: Number(f.secs ?? 0) } } : null; };\nconst THUMB_DB = \"moonsinger-thumbs\";\n// \u5305\u5185 zh \u9ED8\u8BA4\u662F WeebPaint \u53E3\u543B\uFF1B\u4F1A\u9732\u9762\u7684\u51E0\u6761\u6362\u6210\u6B4C\u5E93\u53E3\u543B\uFF08\u5176\u4F59\u6CBF\u7528\uFF09\u3002key \u5FC5\u987B\u662F\u5305\u7684 GalleryTextKey\uFF08\u7C7B\u578B\u5B88\u7740\uFF09\u3002\nconst TEXT: Partial<Record<Parameters<NonNullable<NonNullable<CreateGalleryDeps[\"text\"]>[\"t\"]>>[0], string>> = {\n  \"gal.empty.none\": \"\u8FD8\u6CA1\u6709\u6B4C\u3002\u70B9\u300C\u65B0\u5EFA\u300D\u5199\u4E00\u9996\uFF0C\u6216\u628A .mxl \u62D6\u8FDB\u6765\u3002\",\n  \"gal.empty.folder\": \"\u8FD9\u4E2A\u5939\u91CC\u8FD8\u6CA1\u6709\u6B4C\u3002\",\n  \"gal.empty.trash\": \"\u56DE\u6536\u7AD9\u662F\u7A7A\u7684\u3002\",\n  \"gal.tile.active\": \"\u6253\u5F00\u4E2D\",\n};\n\nexport function initGalleryHost(d: GalleryHostDeps) {\n  const vue = { createApp, defineComponent, reactive, ref, computed, watch, onMounted, onUnmounted, nextTick, Teleport } as unknown as VueRuntime;   // Teleport\uFF1Agallery 0.6.2 \u5361\u7247 \u22EF \u83DC\u5355\u642C\u51FA\u5361\u7247\n  // \u4E00\u5C4F\u5BB9\u5668 + chrome\uFF08\u4E0D\u8FDB index.html\uFF1A\u6B4C\u5E93\u662F\u61D2\u7684\uFF0C\u6CA1\u8FDB\u8FC7\u6B4C\u5E93\u7684\u8BBE\u5907\u8FDE DOM \u90FD\u4E0D\u957F\uFF09\u3002\u6CA1\u6709\u300C\u56DE\u5230\u8C31\u300D\uFF1A\u8FDB\u6B4C\u5E93 = \u653E\u4E0B\u624B\u91CC\u7684\u6B4C\uFF08gallery-first\uFF0C\u540C WeebPaint\uFF1Buser 2026-10-08\u300C7 \u548Cweebpaint\u5BF9\u9F50\u300D\uFF09\uFF0C\u51FA\u53E3 = \u6253\u5F00\u4E00\u9996 / \u65B0\u5EFA\n  const fullEl = document.createElement(\"div\");\n  fullEl.id = \"galleryFull\"; fullEl.className = \"gallery-full\"; fullEl.hidden = true;\n  fullEl.setAttribute(\"role\", \"dialog\"); fullEl.setAttribute(\"aria-modal\", \"true\"); fullEl.setAttribute(\"aria-label\", \"\u6B4C\u5E93\");\n  fullEl.innerHTML = `<div class=\"gallery-chrome\">` +\n    `<div class=\"gallery-chrome-title\">\u6B4C\u5E93</div><span class=\"spacer\"></span>` +\n    `<button type=\"button\" class=\"btn\" data-v=\"cloud\" title=\"\u4E91\u7AEF\uFF1A\u767B\u5F55 / \u9000\u51FA\">${iconHtml(\"cloud\")}</button>` +\n    `<button type=\"button\" class=\"btn\" data-v=\"refresh\" title=\"\u5237\u65B0\u4E91\u7AEF\" hidden>${iconHtml(\"refresh\")}</button>` +\n    `<button type=\"button\" class=\"btn gallery-inst\" data-v=\"instruments\" title=\"\u5373\u5174\uFF1A\u6311\u4E50\u5668\u3001\u7528\u952E\u76D8\u5F39\u7740\u73A9\uFF08\u4E0D\u5199\u8FDB\u54EA\u9996\u6B4C\uFF09\"><span>\u5373\u5174</span></button>` +\n    `<button type=\"button\" class=\"btn\" data-v=\"new\" title=\"\u65B0\u5EFA\uFF1A\u4E00\u9996\u6B4C / \u4E00\u4E2A\u6587\u4EF6\u5939\" aria-haspopup=\"menu\">${iconHtml(\"new\")}<span>\u65B0\u5EFA</span></button>` +\n    `<button type=\"button\" class=\"btn\" data-v=\"aside\" title=\"\u56DE\u6536\u7AD9\u548C\u5907\u4EFD\u7BB1\">${iconHtml(\"trash-can\")}</button>` +\n    `<button type=\"button\" class=\"btn\" data-v=\"settings\" title=\"\u8BBE\u7F6E\">${iconHtml(\"menu\")}</button></div>` +\n    `<div class=\"gallery-asidebar\" hidden><button type=\"button\" class=\"btn\" data-v=\"files\">${iconHtml(\"back\")}<span>\u56DE\u5230\u6B4C</span></button>` +\n    `<div class=\"gallery-aside-tabs\"><button type=\"button\" class=\"btn gallery-aside-tab\" data-v=\"trash\">${iconHtml(\"trash-can\")}<span>\u56DE\u6536\u7AD9</span></button><button type=\"button\" class=\"btn gallery-aside-tab\" data-v=\"backup\">${iconHtml(\"archive-box\")}<span>\u5907\u4EFD\u7BB1</span></button></div>` +\n    `<span class=\"spacer\"></span><button type=\"button\" class=\"btn danger\" data-v=\"empty\">\u6E05\u7A7A</button></div>` +\n    `<div class=\"gallery-mount\"></div>`;\n  document.body.append(fullEl);\n  const mountEl = fullEl.querySelector<HTMLElement>(\".gallery-mount\")!, asideBar = fullEl.querySelector<HTMLElement>(\".gallery-asidebar\")!;\n  const cloudBtn = fullEl.querySelector<HTMLElement>('[data-v=\"cloud\"]')!, refreshBtn = fullEl.querySelector<HTMLElement>('[data-v=\"refresh\"]')!;\n\n  const storeFace = (): (VerbStore & DataFaceStore) | null => (hasStore() ? (requireStore() as unknown as VerbStore & DataFaceStore) : null);\n  const doc: GalleryDocHost = {\n    open: async (item: GItem) => { const ok = await d.openAny(item.identifier); if (ok) close(); },\n    renameActive: () => d.renameActive(),\n    setIdentifier: (id) => d.setIdentifier(id),\n    push: async () => { await d.pushNow(); },\n    unload: async (item: GItem) => { try { await requireStore().file(item.identifier, { mode: \"existing\" }).offload(); } catch (e) { reportError(e, \"warning\"); } },\n    exit: async () => { await d.flushLocal(); },\n    dropCheckpoint: () => {},\n    tileAction: (item, facts) => playTile(item.identifier, factsOf(facts)),   // \u5C01\u9762\u4E0A\u7684 \u25B6\uFF080.8.0 \u5305\u753B\u3001\u5305\u63A5\u70B9\u51FB\u3001\u4E0D\u5F00\u5361\uFF09\n  };\n  const zipFile = (id: string) => requireStore().zip(id, { mode: \"existing\" });\n  const status = (msg: string, isError?: boolean) => reportError(msg, isError ? \"error\" : \"info\");\n  const deps: CreateGalleryDeps = {\n    vue,\n    store: storeFace,\n    doc,\n    host: {\n      signedIn: () => isSignedIn(), online: () => (typeof navigator === \"undefined\" || navigator.onLine !== false), activeIdentifier: () => d.activeIdentifier(),\n      confirm: (title, msg) => openConfirmSheet(title, msg),\n      input: (title, def, opts) => openInputSheet(title, { defaultValue: def, placeholder: opts?.placeholder }),\n      chooseFolder: (title, msg, options) => openChoiceSheet<string>(title, msg, options.map((o) => ({ label: o.label, value: o.value }))),\n      status,\n      busy: (label, fn) => withBusy(label, fn),\n    },\n    // \u5C01\u9762 = \u4E24\u5C42\uFF08\u6392\u7248\u5728 ui/song-cover.ts\uFF09\uFF1A\u5E95\u4E0B\u4E00\u5C42 = \u5C01\u9762\u56FE\uFF0C\u6CA1\u6709\u56FE\u5C31\u662F\u4E00\u5757\u6309\u6B4C\u540D\u9009\u7684\u5E95\u8272\uFF08\u5360\u4F4D\u69FD\uFF09\uFF1B\u4E0A\u9762\u4E00\u5C42\u5370\u6B4C\u540D / \u65E5\u671F / \u5927\u5C0F\uFF0C**\u6709\u6CA1\u6709\u56FE\u90FD\u4E00\u6837\u5370**\u3002\n    ui: {\n      iconHtml: (name, opts) => iconHtml(name, opts),\n      tilePlaceholderHtml: (id) => placeholderHtml(identifiers.parse(id)?.stem ?? id),\n      tileOverlayHtml: (id: string, item?: TileInfo, facts?: unknown) => coverHtml(identifiers.parse(id)?.stem ?? id, {\n        sizeText: item?.size != null ? humanSize(item.size) : undefined,\n        editedText: item?.lastModified ? `\u6539\u4E8E ${new Date(item.lastModified).toLocaleString()}` : undefined,\n        finalRev: factsOf(facts ?? null)?.final.rev,   // \u5E95\u680F\u5370\u300C\u5B9A\u7A3F N\u300D\uFF08user 2026-10-16\u300C\u5370\u5B9A\u7A3Fn\u300D\uFF09\n      }),\n      // \u5B9A\u7A3F\u4E86\u7684\u6B4C\uFF1A\u53F3\u4E0B\u89D2 \u25B6\uFF0C\u5728\u653E\u7684\u90A3\u9996 = \u23F8\uFF08user 2026-10-16\u300C\u64AD\u653E\u4E2D\u65F6play\u6309\u94AE\u6CA1\u6709\u53D8\u300D\uFF09\uFF1B\u4E8B\u5B9E\u6CA1\u5230 = \u4E0D\u753B\uFF1B\u6CA1\u5B9A\u7A3F = \u4E0D\u753B\u3002\n      //   \u8DDF\u7740\u64AD\u653E\u53D8\uFF1A\u5305\u5728 Vue \u7684 computed \u91CC\u7B97\u8FD9\u4E2A\u51FD\u6570\uFF0C\u8BFB\u4E86 playTick\uFF08\u540C\u4E00\u4E2A Vue \u7684 ref\uFF09= \u5305\u8BB0\u4F4F\u8FD9\u4E2A\u4F9D\u8D56\uFF0C\u64AD\u653E\u72B6\u6001\u4E00\u53D8 +1 \u5C31\u91CD\u7B97\u3002\n      //   \u9760\u7684\u662F\u5305\u300C\u5728\u54CD\u5E94\u5F0F\u91CC\u8C03 tileAction\u300D\u8FD9\u4E00\u70B9\uFF08d.ts\uFF1A\u4E8B\u5B9E\u5230\u4E86\u4F1A\u91CD\u7B97\uFF09\uFF1B\u5305\u8981\u662F\u6539\u4E86\uFF0CE2E final.mjs\u300C\u5361\u7247 \u25B6 \u8DDF\u7740\u53D8\u300D\u4F1A\u7EA2\u3002\n      tileAction: (id: string, _info: TileInfo, facts: unknown): TileAction | null => {\n        const f = factsOf(facts); if (!f) return null;\n        void playTick.value;\n        return player.playing() === id ? { icon: \"pause\", title: \"\u6682\u505C\uFF08\u5E95\u8FB9\u64AD\u653E\u6761\u4E0A\u4E5F\u80FD\u63A7\uFF09\", state: \"ready\" } : { icon: \"play\", title: `\u542C\u5B9A\u7A3F\u7684 mp3\uFF08\u7B2C ${f.final.rev} \u7248\uFF0C${f.final.secs.toFixed(0)} \u79D2\uFF09`, state: \"ready\" };\n      },\n    },\n    policy: {\n      isImage: () => false,\n      // \u7F29\u7565\u56FE\uFF1Afetch = store getPeek \u6309\u8EAB\u4EFD\u5C3E\u8BFB\uFF08source \u5FC5\u586B\uFF1Acloud \u7EDD\u4E0D\u843D\u56DE\u672C\u5730\uFF09\u3002null = \u5230\u8FBE\u4E86\u4F46\u6CA1\u6709\uFF08\u8FDB\u7F13\u5B58\u3001\u663E\u793A\u5E95\u8272\uFF09\uFF1B\u629B = \u591F\u4E0D\u7740\uFF08\u4E0D\u7F13\u5B58\uFF09\u3002\n      thumbs: { kinds: [\"song\"], dbName: THUMB_DB, fetch: (id, source) => zipFile(id).getPeek({ bytesLength: THUMB_PEEK_BYTES, zipEntry: THUMBNAIL_ENTRY, source }) },\n      // \u4E8B\u5B9E\uFF080.8.0\uFF09\uFF1A\u5C3E\u8BFB\u603B\u76EE\u5F55\u770B\u6709\u6CA1\u6709\u5B9A\u7A3F\u8BB0\u5F55\uFF1Bnull = \u786E\u5B9A\u6CA1\u5B9A\u7A3F\uFF08\u8FDB\u7F13\u5B58\uFF09\uFF1B\u629B = \u591F\u4E0D\u7740\uFF08\u4E0D\u7F13\u5B58\uFF0C\u4E0B\u6B21\u518D\u95EE\uFF09\n      facts: { kinds: [\"song\"], dbName: FACTS_DB, fetch: async (id, source) => { const rec = await peekFinal(id, source); return rec ? { final: { rev: rec.rev, secs: rec.mp3.secs } } : null; } },\n    },\n    tile: { aspect: 1 },   // \u5531\u7247\u5C01\u9762 = \u65B9\u56FE\uFF08user 2026-10-08\u300C\u6211\u4EEC\u8FD9\u4E2A\u5E94\u8BE5\u662F\u5531\u7247\u5C01\u9762\uFF0C\u662F\u77E9\u5F62\u7684\u300D\uFF09\n    folderMemory: { get: () => deviceKvGet(KV_FOLDER) ?? \"\", set: (p) => deviceKvSet(KV_FOLDER, p || null) },\n    isGalleryVisible: () => document.body.dataset.mode === \"gallery\",\n    reportError: (e, level) => reportError(e, level ?? \"error\"),\n    reloadApp: () => location.reload(),\n    text: { lang: \"zh\", t: (key) => TEXT[key] },\n  };\n  let gallery: Gallery | null = null;\n  /** \u8FD9\u9996\u7684\u603B\u76EE\u5F55\u91CC\u6709\u6CA1\u6709\u5B9A\u7A3F\u8BB0\u5F55\uFF08\u5C3E\u8BFB\u4E00\u6B21\uFF1Bsource \u540C\u7F29\u7565\u56FE\uFF1A\u672C\u5730\u4F18\u5148 / \u53EA\u770B\u4E91\u7AEF\uFF09\u3002\u4E91\u7AEF\u4E0D\u53EF\u8FBE = \u629B \u2192 \u5305\u4E0D\u8BB0\uFF0C\u4E0B\u6B21\u518D\u95EE\u3002 */\n  async function peekFinal(id: string, source: \"local\" | \"cloud\" = \"local\"): Promise<FinalRecord | null> {\n    const b = await zipFile(id).getPeek({ bytesLength: THUMB_PEEK_BYTES, zipEntry: MANIFEST_ENTRY, source });\n    if (!b) return null;\n    try { return parseFinalRecord((JSON.parse(await b.text()) as { final?: unknown }).final); } catch { return null; }\n  }\n  // \u2500\u2500 \u8FF7\u4F60\u64AD\u653E\u6761\uFF08\u6B4C\u5E93\u5E95\u8FB9\uFF09\uFF1A|\u25B6 \u4ECE\u5934\u653E\u3001\u25B6 / \u23F8\u3001\u6B4C\u540D\u3001\u65F6\u95F4\u3001\u5FAA\u73AF\u3001\u2715\u3002\u51FA\u58F0 = src/app/song-player.ts\uFF08<audio> + \u7CFB\u7EDF\u5A92\u4F53\u63A7\u4EF6\uFF1A\u4E3B\u5C4F PWA \u9501\u5C4F\u7167\u653E\uFF0C\u9501\u5C4F / \u63A7\u5236\u4E2D\u5FC3 / \u8033\u673A\u952E\u80FD\u63A7\uFF09\u2500\u2500\n  //   user 2026-10-16\u300C\u81F3\u5C11\u5728gallery\u4FA7\u80FD\u505A\u5230\u9501\u5C4F\u64AD\u653E\u5417\uFF08\u53EF\u4EE5\u9009\u62E9\u662F\u5426loop\uFF09\u300D\u300C\u6B4C\u5E93\u91CC\u9762\u53EF\u4EE5\u8BBE\u7F6E\u5FAA\u73AF\u4E0E\u5426\u300D\uFF1A\u5FAA\u73AF = \u64AD\u653E\u6761\u4E0A\u7684\u5F00\u5173\uFF0C\u8FD9\u6B21\u6253\u5F00\u6709\u6548\uFF0C\u9501\u5C4F\u4E0B\u7167\u6837\u7ED5\u56DE\u5F00\u5934\u3002\n  const playerEl = document.createElement(\"div\");\n  playerEl.className = \"ms-player\"; playerEl.hidden = true;\n  playerEl.innerHTML = `<button type=\"button\" class=\"btn\" data-p=\"restart\" title=\"\u4ECE\u5934\u653E\uFF08\u9501\u5C4F / \u8033\u673A\u7684\u300C\u4E0A\u4E00\u9996\u300D\u4E5F\u662F\uFF09\">${iconHtml(\"play-from-start\")}</button>` +   // user 2026-10-17\u300Cgallery\u64AD\u653E\u6CA1\u6709\u4ECE\u5934\u518D\u6765\u7684\u529F\u80FD\uFF0C\u6211\u6709\u65F6\u5019\u60F3\u4ECE\u5934\u542C\u300D\uFF1A\u52A0\u952E\u4E0D\u505A\u624B\u52BF\uFF08\u6B4C\u5E93\u53EA\u6709\u63A5\u7740 / \u4ECE\u5934\u4E24\u6837\uFF0C\u85CF\u8FDB\u624B\u52BF\u5C31\u627E\u4E0D\u5230\uFF09\n    `<button type=\"button\" class=\"btn ms-player-toggle\" data-p=\"toggle\" title=\"\u653E / \u6682\u505C\">${iconHtml(\"pause\")}</button>` +\n    `<span class=\"ms-player-title\"></span><span class=\"ms-player-time\">0:00 / 0:00</span>` +\n    `<button type=\"button\" class=\"btn ms-player-loop\" data-p=\"loop\" aria-pressed=\"false\">\u5FAA\u73AF</button>` +\n    `<button type=\"button\" class=\"btn\" data-p=\"close\" title=\"\u505C\">${iconHtml(\"x\")}</button>`;\n  fullEl.append(playerEl);\n  const appIcon = (file: string, sizes: string) => ({ src: new URL(file, document.baseURI).href, sizes, type: \"image/png\" });\n  const player = createSongPlayer({ fallbackArtwork: [appIcon(\"icon-512.png\", \"512x512\"), appIcon(\"icon-192.png\", \"192x192\")], onError: (msg) => status(msg, true) });\n  let barTitle = \"\";\n  const fmtTime = (s: number) => (Number.isFinite(s) ? `${Math.floor(s / 60)}:${String(Math.floor(s % 60)).padStart(2, \"0\")}` : \"0:00\");\n  function drawPlayer(): void {\n    const s = player.state();\n    playerEl.hidden = s.key == null;\n    if (s.key == null) return;\n    playerEl.querySelector<HTMLElement>(\".ms-player-title\")!.textContent = barTitle;\n    playerEl.querySelector<HTMLElement>(\".ms-player-time\")!.textContent = `${fmtTime(s.time)} / ${fmtTime(s.duration)}`;\n    playerEl.querySelector<HTMLElement>(\".ms-player-toggle\")!.innerHTML = iconHtml(s.paused ? \"play\" : \"pause\");\n    const loopBtn = playerEl.querySelector<HTMLElement>(\".ms-player-loop\")!;\n    loopBtn.classList.toggle(\"is-on\", s.loop); loopBtn.setAttribute(\"aria-pressed\", String(s.loop));\n    loopBtn.title = s.loop ? \"\u5355\u66F2\u5FAA\u73AF\uFF1A\u5F00\u7740\uFF08\u653E\u5B8C\u4ECE\u5934\u518D\u653E\uFF0C\u9501\u5C4F\u4E5F\u4E00\u6837\uFF09\" : \"\u5355\u66F2\u5FAA\u73AF\uFF1A\u5173\u7740\uFF08\u653E\u5B8C\u5C31\u505C\uFF09\";\n  }\n  const playTick = ref(0);   // \u5728\u653E\u54EA\u9996\uFF08\u542B\u6682\u505C\uFF09\u53D8\u4E86\u624D +1\uFF1A\u5361\u7247\u4E0A\u7684 \u25B6 / \u23F8 \u91CD\u7B97\uFF08\u8FDB\u5EA6\u6BCF\u79D2\u51E0\u8DF3\u4E0D\u78B0\u5B83\uFF0C\u4E0D\u7136\u6574\u4E2A\u7F51\u683C\u8DDF\u7740\u91CD\u7B97\uFF09\n  let tickedFor: string | null = null;\n  player.onChange(() => { const k = player.playing(); if (k !== tickedFor) { tickedFor = k; playTick.value++; } drawPlayer(); });\n  /** \u70B9\u4E86\u5C01\u9762\u4E0A\u7684 \u25B6\uFF08\u5305\u53EA\u5728\u5B9A\u7A3F\u4E86\u7684\u5361\u4E0A\u753B\u5B83\uFF1Bfacts = \u5305\u7F13\u5B58\u7684\u4E8B\u5B9E\uFF09\uFF1A\u6293 mp3 \u653E\uFF1B\u518D\u70B9\u540C\u4E00\u9996 = \u653E / \u6682\u505C\u3002 */\n  async function playTile(id: string, facts: SongFacts): Promise<void> {\n    if (player.state().key === id) { player.toggle(); return; }\n    if (!facts) { status(\"\u8FD9\u9996\u8FD8\u6CA1\u5B9A\u7A3F\uFF1A\u6253\u5F00\u5B83\uFF0C\u4E09\u6761\u6760\u91CC\u300C\u5B9A\u7A3F\u2026\u300D\u2014\u2014\u5B9A\u7A3F\u540E\u5C01\u9762\u4E0A\u5C31\u80FD\u76F4\u63A5\u542C\u3002\"); return; }\n    player.arm();   // \u8FD8\u5728\u70B9\u51FB\u91CC\uFF1A\u5148\u62FF iPad \u653E\u7684\u8BB8\u53EF\uFF08\u4E0B\u9762\u8981\u7B49\u53D6 mp3\uFF0C\u7B49\u5B8C\u5C31\u4E0D\u7B97\u70B9\u51FB\u4E86\uFF09\n    const stem = identifiers.parse(id)?.stem ?? id;\n    try {\n      const b = await withBusy(`\u53D6\u300C${stem}\u300D\u7684 mp3\u2026`, async () => {\n        const rec = await peekFinal(id);\n        if (!rec) { void gallery?.facts?.invalidate(id); return null; }   // \u4E8B\u5B9E\u8FC7\u671F\u4E86\uFF08\u6539\u7A3F\u540E\u8FD8\u6CA1\u91CD\u53D6\uFF09\uFF1A\u6E05\u6389\u8BA9\u5305\u91CD\u95EE\n        const blob = await zipFile(id).getPeek({ bytesLength: THUMB_PEEK_BYTES, zipEntry: rec.mp3.path, source: \"local\" });\n        if (!blob || blob.size !== rec.mp3.bytes) throw new Error(`mp3 \u6CA1\u53D6\u5230\uFF08${blob ? `${blob.size} \u2260 ${rec.mp3.bytes}` : \"\u7A7A\"}\uFF09`);\n        return { rec, blob };\n      });\n      if (!b) { status(\"\u8FD9\u9996\u8FD8\u6CA1\u5B9A\u7A3F\uFF1A\u6253\u5F00\u5B83\uFF0C\u4E09\u6761\u6760\u91CC\u300C\u5B9A\u7A3F\u2026\u300D\u2014\u2014\u5B9A\u7A3F\u540E\u5C01\u9762\u4E0A\u5C31\u80FD\u76F4\u63A5\u542C\u3002\"); return; }\n      const cover = (await gallery?.thumbs?.read(id).catch(() => null))?.blob ?? null;   // \u9501\u5C4F\u4E0A\u7684\u56FE = \u6B4C\u5E93\u7F13\u5B58\u7740\u7684\u5C01\u9762\uFF08\u6CA1\u6709 = app \u56FE\u6807\uFF09\n      barTitle = `${stem} \u00B7 \u5B9A\u7A3F ${b.rec.rev}`;\n      const r = await player.play({ key: id, blob: new Blob([b.blob], { type: \"audio/mpeg\" }), title: stem, artist: \"MoonSinger\", album: `\u5B9A\u7A3F \u7B2C ${b.rec.rev} \u7248`, cover });\n      if (r === \"blocked\") status(\"\u6CA1\u80FD\u81EA\u5DF1\u5F00\u59CB\u653E\uFF1A\u70B9\u5E95\u8FB9\u64AD\u653E\u6761\u4E0A\u7684 \u25B6\");\n      diagNote(\"gallery\", `play final ${id} (${b.blob.size} B) \u2192 ${r}`);\n    } catch (e) { reportError(e, \"warning\"); status(`\u653E\u4E0D\u4E86\uFF1A${(e as Error).message ?? String(e)}`, true); player.stop(); }\n  }\n  playerEl.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-p]\")?.dataset.p; if (!v) return;\n    if (v === \"toggle\") player.toggle(); else if (v === \"restart\") player.restart(); else if (v === \"loop\") player.setLoop(!player.state().loop); else if (v === \"close\") player.stop();\n  });\n  /** \u65B0\u5EFA\u6587\u4EF6\u5939\uFF082026-10-10 user\u300Cgallery\u600E\u4E48\u6CA1\u63A5\u65B0\u5EFA\u6587\u4EF6\u5939\u7684\u529F\u80FD\uFF0C\u8FD9\u4E2A\u5E94\u8BE5\u53EA\u662F\u63A5\u7EBF\u5427\uFF0C\u4E0D\u8FC7\u5C0F\u5FC3\u4E00\u70B9\u300D\uFF09\uFF1A\u7167 WeebPaint gallery-shell \u7684\u63A5\u6CD5\u2014\u2014\n   *  \u540D\u5B57\u5148\u67E5\u5408\u6CD5\uFF08OneDrive \u4E0D\u6536\u7684\u5B57\u7B26\uFF09\u2192 \u9501\u5C4F \u2192 store \u7684\u552F\u4E00\u5360\u7528\u68C0\u67E5\uFF08files.occupied\uFF1A\u540C\u540D\u6587\u4EF6 / \u5939\u5360\u7740\u5C31\u8BF4\uFF09\u2192 store.files.newFolder\uFF08\u5E93\u5185\u5355\u98DE\uFF1B\u79BB\u7EBF\u4E5F\u80FD\u5EFA\uFF0C\u56DE\u7EBF\u8865\u5EFA\uFF09\u2192 \u5237\u65B0\u6B4C\u5E93\u3002\n   *  \u53EA\u5EFA\u5728\u73B0\u5728\u8FD9\u4E2A\u5939\u91CC\uFF1Bapp \u4E0D\u78B0\u4E91\u7AEF\u3001\u4E0D\u81EA\u5DF1\u62FC\u8BF7\u6C42\u3002 */\n  const warn = (msg: string) => reportError(msg, \"warning\");   // \u540D\u5B57\u4E0D\u5BF9 / \u5360\u4E86 = \u63D0\u9192\uFF08\u4E0D\u662F\u51FA\u9519\uFF09\n  async function newFolder(): Promise<void> {\n    if (!hasStore()) { warn(\"\u6B4C\u5E93\u8FD8\u6CA1\u63A5\u4E0A\uFF0C\u5EFA\u4E0D\u4E86\u6587\u4EF6\u5939\"); return; }\n    const g = ensureMounted();\n    const name = await openInputSheet(\"\u65B0\u5EFA\u6587\u4EF6\u5939\", { defaultValue: \"\u65B0\u6587\u4EF6\u5939\", placeholder: \"\u6587\u4EF6\u5939\u540D\" });\n    if (name == null) return;\n    const n = name.trim();\n    if (!n) { warn(\"\u6587\u4EF6\u5939\u540D\u4E0D\u80FD\u7A7A\u7740\"); return; }\n    if (/[\\\\/:*?\"<>|]/.test(n) || /^[.\\s]|[.\\s]$/.test(n)) { warn(\"\u6587\u4EF6\u5939\u540D\u91CC\u4E0D\u80FD\u6709 / \\\\ : * ? \\\" < > |\uFF0C\u4E5F\u4E0D\u80FD\u7528\u70B9\u6216\u7A7A\u683C\u5F00\u5934 / \u7ED3\u5C3E\uFF08OneDrive \u4E0D\u6536\uFF09\"); return; }\n    const here = g.handle.getFolder(), full = here ? `${here}/${n}` : n;\n    await withBusy(`\u65B0\u5EFA\u6587\u4EF6\u5939\u300C${n}\u300D\u2026`, async () => {\n      if (await requireStore().files.occupied(full)) { warn(`\u300C${n}\u300D\u8FD9\u4E2A\u540D\u5B57\u5DF2\u7ECF\u6709\u4E86\uFF08\u540C\u540D\u7684\u6B4C\u6216\u6587\u4EF6\u5939\uFF09`); return; }\n      try { await requireStore().files.newFolder(full); status(`\u5EFA\u597D\u4E86\u6587\u4EF6\u5939\u300C${n}\u300D`); diagNote(\"gallery\", `new folder ${full}`); }\n      catch (e) { reportError(e, \"warning\"); status(`\u65B0\u5EFA\u6587\u4EF6\u5939\u6CA1\u6210\u529F\uFF1A${(e as Error).message ?? String(e)}`, true); }\n    });\n    g.handle.refresh();\n  }\n  function ensureMounted(): Gallery { if (!gallery) gallery = createGallery(mountEl, deps); return gallery; }\n  function showAside(kind: AsideKind | null): void {\n    asideBar.hidden = kind == null;\n    for (const b of asideBar.querySelectorAll<HTMLElement>(\".gallery-aside-tab\")) b.classList.toggle(\"is-on\", b.dataset.v === kind);\n    ensureMounted().handle.setView(kind ?? \"files\");\n  }\n  let newMenu: HTMLElement | null = null;\n  const outsideNew = (e: PointerEvent) => { const t = e.target as HTMLElement; if (newMenu && !newMenu.contains(t) && !t.closest('[data-v=\"new\"]')) closeNewMenu(); };\n  function closeNewMenu(): void { newMenu?.remove(); newMenu = null; document.removeEventListener(\"pointerdown\", outsideNew, true); }\n  function openNewMenu(btn: HTMLElement): void {\n    if (newMenu) { closeNewMenu(); return; }\n    const m = document.createElement(\"div\"); newMenu = m;\n    m.className = \"track-card ctx-menu gallery-new-menu\"; m.setAttribute(\"role\", \"menu\");\n    m.innerHTML = `<button type=\"button\" class=\"btn ctx-item\" data-v=\"new-song\">${iconHtml(\"new\")}<span>\u65B0\u5EFA\u6B4C</span></button>` +\n      `<button type=\"button\" class=\"btn ctx-item\" data-v=\"new-folder\" title=\"\u5728\u73B0\u5728\u8FD9\u4E2A\u5939\u91CC\">${iconHtml(\"create-folder\")}<span>\u65B0\u5EFA\u6587\u4EF6\u5939\u2026</span></button>`;\n    fullEl.append(m);\n    const r = btn.getBoundingClientRect(), w = m.offsetWidth;\n    Object.assign(m.style, { position: \"fixed\", top: `${r.bottom + 4}px`, left: `${Math.max(8, Math.min(r.right - w, innerWidth - w - 8))}px` });\n    setTimeout(() => { if (newMenu === m) document.addEventListener(\"pointerdown\", outsideNew, true); }, 0);\n  }\n  fullEl.addEventListener(\"click\", (e) => {\n    const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v;\n    if (!v) return;\n    if (v === \"cloud\") d.openCloudMenu(cloudBtn);\n    else if (v === \"refresh\") gallery?.handle.refresh();\n    else if (v === \"new\") openNewMenu((e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")!);   // \u300C\u65B0\u5EFA\u300D= \u5C0F\u83DC\u5355\uFF08v0.9.41\uFF1Buser\u300Cgallery\u7684\u65B0\u5EFA\u6309\u94AE\u5E94\u8BE5\u662F\u4E00\u4E2A\u83DC\u5355\uFF0C\u91CC\u9762\u6709\u65B0\u5EFA\u6B4C\u548C\u6587\u4EF6\u5939\u300D\uFF0C\u540C WeebPaint \u56FE\u5E93\u7684\u300C\uFF0B\u300D\uFF09\n    else if (v === \"new-song\") { closeNewMenu(); void d.newSong(); }\n    else if (v === \"new-folder\") { closeNewMenu(); void newFolder(); }\n    else if (v === \"instruments\") d.openInstruments();\n    else if (v === \"aside\") showAside(\"trash\");\n    else if (v === \"files\") showAside(null);\n    else if (v === \"trash\" || v === \"backup\") showAside(v);\n    else if (v === \"empty\") { const h = ensureMounted().handle, cur = h.getView(); if (cur === \"trash\") h.emptyTrash(); else if (cur === \"backup\") h.emptyBackup(); }\n    else if (v === \"settings\") d.openSettings();\n  });\n  /** \u4E91\u6309\u94AE\u7684\u6837\u5B50\u8DDF\u767B\u5F55\u6001\u8D70\uFF08\u56FE\u6807 + \u300C\u5DF2\u767B\u5F55\u300D\u6001\uFF09\u3002 */\n  function renderCloud(): void {\n    const on = isSignedIn();\n    cloudBtn.classList.toggle(\"is-on\", on); cloudBtn.title = on ? `\u4E91\u7AEF\uFF1A\u5DF2\u767B\u5F55${accountName() ? ` ${accountName()}` : \"\"}` : \"\u4E91\u7AEF\uFF1A\u6CA1\u767B\u5F55\uFF08\u6B4C\u53EA\u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\uFF09\";\n    refreshBtn.hidden = !on;\n  }\n  function accountName(): string { try { const a = auth.getActiveAccount() as { username?: string; name?: string } | null; return a?.name || a?.username || \"\"; } catch { return \"\"; } }\n  auth.onAuthChanged(() => renderCloud());\n\n  async function open(): Promise<void> {\n    await d.flushLocal();\n    const g = ensureMounted();\n    document.body.dataset.mode = \"gallery\";\n    fullEl.hidden = false;\n    const dir = deviceKvGet(KV_FOLDER) ?? \"\";\n    if (dir !== g.handle.getFolder()) g.handle.setFolder(dir);\n    showAside(null);\n    renderCloud();\n    deviceKvSet(KV_SCENE, \"gallery\");\n    diagNote(\"gallery\", \"open\");\n    d.onOpened?.();\n  }\n  function close(): void {\n    player.stop();   // \u79BB\u5F00\u6B4C\u5E93 = \u505C\uFF08\u7F16\u8F91\u5668\u91CC\u6709\u81EA\u5DF1\u7684\u8D70\u5E26\uFF09\n    fullEl.hidden = true;\n    delete document.body.dataset.mode;\n    deviceKvSet(KV_SCENE, null);\n    d.onClosed?.();\n  }\n  const isOpen = () => !fullEl.hidden;\n  return {\n    open, close, isOpen, renderCloud,\n    /** boot \u7528\uFF1A\u4E0A\u6B21\u662F\u5728\u6B4C\u5E93\u91CC\u79BB\u5F00\u7684\uFF08\u5237\u65B0 / \u5173\u6807\u7B7E / SW \u66F4\u65B0\u91CD\u8F7D\uFF09\u3002 */\n    wasInGallery: () => deviceKvGet(KV_SCENE) === \"gallery\",\n    refresh: () => gallery?.handle.refresh(),\n    setView: (v: GalleryView) => showAside(v === \"files\" ? null : v),\n    getView: (): GalleryView => gallery?.handle.getView() ?? \"files\",\n    emptyAside: (kind: AsideKind, scope: AsideScope) => { const h = ensureMounted().handle; if (kind === \"trash\") h.emptyTrash(scope); else h.emptyBackup(scope); },\n    currentFolder: () => gallery?.handle.getFolder() ?? (deviceKvGet(KV_FOLDER) ?? \"\"),\n    /** \u5C01\u9762\u53D8\u4E86\uFF08\u5B58\u4E86\u65B0\u5C01\u9762\uFF09\uFF1A\u4E22\u6389\u8FD9\u9996\u6B4C\u7684\u7F29\u7565\u56FE\u7F13\u5B58\uFF0C\u4E0B\u6B21\u9732\u9762\u91CD\u53D6\u3002 */\n    invalidateThumb: (id: string) => { void gallery?.thumbs?.invalidate(id); void gallery?.facts?.invalidate(id); },   // \u5C01\u9762 / \u5B9A\u7A3F\u53D8\u4E86\uFF1A\u7F29\u7565\u56FE\u548C\u4E8B\u5B9E\u90FD\u91CD\u53D6\n    /** \u5C01\u9762\u4E0A\u5728\u653E\u7684\u90A3\u9996 / \u64AD\u653E\u5668\u72B6\u6001\uFF08E2E \u7528\uFF09\u3002 */\n    playing: () => player.playing(),\n    playerState: () => player.state(),\n  };\n}\nexport type GalleryHost = ReturnType<typeof initGalleryHost>;\n", "// \u26A0 \u63A5\u672C\u6A21\u5757\u5FC5\u8BFB\u540C\u76EE\u5F55 README.md + CONTEXT.md\u3002\u5BB6\u65CF\u5171\u4EAB\u6DF1\u6A21\u5757\uFF08\u4E0E sync-store \u5E73\u7EA7\uFF0C\u4E92\u62F7\uFF09\u3002\n//\n// editor-session \u2014\u2014 \u4E00\u4E2A doc\u300C\u4ECE\u6253\u5F00\u5230\u5173\u95ED\u3001\u4FDD\u6301\u540C\u6B65\u300D\u7684\u751F\u547D\u5468\u671F\u7F16\u6392\u8005\u3002**app-agnostic**\uFF1A\n//   \u81EA\u5DF1\u4E0D\u61C2 paint/ora/canvas\uFF0C\u53EA\u8DDF**\u4E0D\u900F\u660E\u5B57\u8282** + \u6CE8\u5165\u7684 editor \u9002\u914D\u5668 + policy \u6253\u4EA4\u9053\u3002\n//   \u5B83\u662F sync-store \u7684**\u6D88\u8D39\u8005**\uFF08app \u5EFA store\uFF0C\u628A store \u4F20\u8FDB\u6765\uFF1B\u672C\u6A21\u5757\u4E0D\u521B\u5EFA store\u3001\u4E0D\u78B0 provider/\u52A0\u5BC6/ui\uFF09\u3002\n//\n// \u4E09\u5C42\uFF1Aapp \u2192 editor-session \u2192 store\u3002\n//   \u00B7 editor\uFF08app \u7684\u7F16\u8F91\u5F15\u64CE\uFF09\uFF1Aadopt(bytes) / encode()\u2192bytes / onChange \u2014\u2014 persistence-agnostic\uFF0C\u4E0D\u77E5\u6709\u4E91\u3002\n//   \u00B7 editor-session\uFF08\u672C\u6A21\u5757\uFF0C\u5171\u4EAB\uFF09\uFF1A\u6253\u5F00/\u5B58/\u63A8/\u5931\u7126 flush/\u9000\u51FA\u63A8/\u5D29\u6E83\u6062\u590D \u7684**\u901A\u7528\u7F16\u6392**\uFF1Bautosave \u7B56\u7565\u6CE8\u5165\u3002\n//   \u00B7 store\uFF08sync-store \u5E93\uFF09\uFF1A\u85CF\u8D77\u540C\u6B65\u7684\u6587\u4EF6\u7CFB\u7EDF\u3002app \u5EFA\u5B83\uFF08\u542B ui bundle\uFF09\uFF0C\u672C\u6A21\u5757\u53EA\u8C03 file/reconcile\u3002\n//\n// \u5206\u5C42\u7EA2\u7EBF\uFF1A\n//   \u00B7 **editor \u7EDD\u4E0D\u78B0 store**\uFF08\u53EA\u7ECF\u672C\u6A21\u5757\u7684 adopt/encode\uFF09\u3002\n//   \u00B7 **\u672C\u6A21\u5757\u53EA\u66B4\u9732 sync \u65E0\u5173\u7684\u7F16\u8F91\u751F\u547D\u5468\u671F**\uFF1B\u51B2\u7A81/\u9519\u8BEF/busy \u662F store \u7684 ui bundle\uFF08app \u5EFA store \u65F6\u63A5\uFF09\uFF0C\u672C\u6A21\u5757\u4E0D\u8F6C\u53D1\u3002\n//   \u00B7 autosave cadence / push \u65F6\u673A**\u6BCF app \u4E0D\u540C \u2192 policy \u6CE8\u5165**\uFF08\u672C\u6A21\u5757\u53EA\u7ED9\u673A\u5236 + \u901A\u7528\u89E6\u53D1\u70B9\uFF09\u3002\n\n// \u2500\u2500 \u6CE8\u5165\u5951\u7EA6 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** app \u7684\u7F16\u8F91\u5F15\u64CE\u66B4\u9732\u7ED9 editor-session \u7684\u6700\u5C0F\u9762\u3002\u672C\u6A21\u5757\u4E0D\u61C2\u5185\u5BB9\uFF0C\u53EA\u8C03\u8FD9\u51E0\u4E2A\u3002 */\nexport interface EditorAdapter {\n  adopt(bytes: Blob): Promise<void>;    // \u6536\u5B57\u8282 \u2192 \u89E3\u7801\u8FDB\u7F16\u8F91\u5668\uFF08\u66FF\u6362\u5F53\u524D\u5185\u5BB9\uFF09\u3002null/\u5931\u8D25\u7531 app \u57DF\u5904\u7406\u3002\n  onChange(cb: () => void): void;       // \u7528\u6237\u6539\u52A8 \u2192 fire \u4E00\u6B21\uFF08\u672C\u6A21\u5757\u636E\u6B64\u6807\u300C\u5185\u5B58\u810F\u300D\uFF09\u3002register-once\u3002\n  // \u5F53\u524D\u5185\u5BB9 \u2192 { bytes, peek }\u3002peek = **content-blind \u7684\u4E0D\u900F\u660E sidecar \u5B57\u8282**\uFF08app \u57DF\u81EA\u5DF1\u51B3\u5B9A\u8BED\u4E49\uFF0C\n  //   \u5982\u753B\u4F5C\u7F29\u7565\u56FE/\u6587\u672C\u6458\u8981\uFF1Beditor-session \u4E0D\u770B\u3001\u53EA\u628A\u5B83\u4F5C store.save \u7684 hint \u900F\u4F20\uFF09\u3002\u65E0\u5219 peek \u7701\u7565\u3002\n  encode(): Promise<{ bytes: Blob; peek?: Blob | null }>;\n  // \u53EF\u9009\uFF1A\u67D0\u8EAB\u4EFD\u7684\u5B57\u8282**\u6210\u529F\u843D\u76D8**\u540E fire\uFF08\u672C\u5730\u5199\u6210\u5373\u7B97\uFF1Bpush \u4E0E\u5426\u4E0D\u5F71\u54CD\uFF09\u3002app \u57DF\u7528\u6765\u4F5C\u5E9F\u6D3E\u751F\u7F13\u5B58\n  //   \uFF08\u5982\u753B\u4F5C\u7F29\u7565\u56FE\uFF09\u3002\u672C\u6A21\u5757\u4ECD content-blind\u2014\u2014\u53EA\u62A5\u300Cname \u7684\u5B57\u8282\u53D8\u4E86\u300D\uFF0C\u4E0D\u77E5\u9053\u53D8\u4E86\u4EC0\u4E48\u3002\n  onSaved?(name: string): void;\n  // \u53EF\u9009\uFF08MoonSinger 2026-10-16 \u52A0\uFF0CClaude Fable 5.1\uFF1BW-38 \u5B9A\u7A3F\u7684\u7B2C \u2463 \u5C42\u62A4\u680F = store \u63A5\u7F1D\uFF1Auser\u300C\u5B9A\u7A3F\u7684\u65F6\u5019\u5F97\u4ECE\u591A\u4E2A\u7A84\u63A5\u53E3\u4E0A\u62A4\u680F\u4F4F\u5199\u5165\uFF0C\u751A\u81F3store\u7EA7\u522B\u300D\uFF09\uFF1A\n  //   \u843D\u76D8\u524D\u95EE\u4E00\u53E5\u300C\u73B0\u5728\u80FD\u5199\u5417\u300D\u3002\u8FD4\u56DE null = \u80FD\uFF1B\u8FD4\u56DE\u4E00\u53E5\u8BDD = \u8FD9\u4E00\u8F6E\u4E0D encode\u3001\u4E0D save\uFF0C**\u810F\u7559\u7740**\uFF08\u7EDD\u4E0D\u5047\u6E05\uFF09\uFF0C\u4E0B\u4E00\u8F6E\u518D\u95EE\uFF1B\u540C\u4E00\u4EE3\u7F16\u8F91\u53EA onRefused \u4E00\u6B21\u3002\n  //   \u672C\u6A21\u5757\u4ECD content-blind\uFF1A\u4E3A\u4EC0\u4E48\u4E0D\u80FD\u5199\u5F52 app \u57DF\uFF08MoonSinger\uFF1A\u5B9A\u7A3F\u7740\u3001\u51FA\u58F0\u5185\u5BB9\u7684\u6307\u7EB9\u5374\u53D8\u4E86\uFF09\u3002\n  canPersist?(): string | null;\n  onRefused?(why: string): void;\n}\n\n/** editor-session \u6D88\u8D39\u7684 store \u6700\u5C0F\u9762\uFF08\u7ED3\u6784\u7C7B\u578B\uFF1B\u771F sync-store \u5929\u7136\u6EE1\u8DB3\uFF0C\u6D4B\u8BD5\u53EF mock\uFF09\u3002 */\n// tryMove \u7ED3\u679C\uFF08rename/move \u552F\u4E00\u5165\u53E3\uFF1B\u542B\u76EE\u6807\u5360\u7528\u68C0\u67E5\uFF0C\u5360\u7528\u5219\u4E0D\u52A8\u5B57\u8282\u8FD4\u9519\uFF0C\u4E0D\u629B\uFF09\u3002\n//   ok:true \u4ECD\u53EF\u80FD\u6709\u8BDD\u8981\u8BF4 \u2014\u2014 \u65E7\u540D\u7684\u53BB\u5411\u4E0D\u662F\u53EA\u6709\u300C\u642C\u8D70\u4E86\u300D\u4E00\u79CD\uFF1A\n//   oldKept=\u8C31\u7CFB\u4E0D\u660E\uFF0C\u6539\u540D\u964D\u7EA7\u4E3A\u53E6\u5B58\u3001\u65E7\u540D\u539F\u5730\u7559\u7740 \u00B7 oldCloudOrphan=\u65E7\u540D\u6CA1\u80FD\u632A\u8FDB\u56DE\u6536\u7AD9 \u00B7 cloudDeferred=\u4E91\u7AEF\u6CA1\u63A8\u6210\u3002\nexport type TryMoveResult =\n  | { ok: true; where?: string; oldName?: string; oldKept?: boolean; oldUnknown?: boolean; oldCloudOrphan?: boolean; cloudDeferred?: boolean }\n  | { ok: false; reason: \"name-collision\"; where: \"local\" | \"cloud\" };\nexport interface StoreLike {\n  // mode \u663E\u5F0F\u5FC5\u586B\uFF08new=\u65B0\u5EFA\u3001existing=\u6253\u5F00\u5DF2\u6709\uFF09\uFF1Beditor-session \u5904\u7406\u7684\u90FD\u662F\u5DF2\u5EFA\u8EAB\u4EFD \u2192 \u6052 \"existing\"\u3002\n  file(name: string, opts: { isZip: boolean; mode: \"new\" | \"existing\" }): {\n    open(): Promise<Blob | null>;\n    // pushed=false \u4E0D\u662F\u9519\u8BEF\uFF0C\u662F\u4E8B\u5B9E\uFF08\u79BB\u7EBF/\u51B2\u7A81\u672A\u89E3\u51B3/\u53EA\u843D\u672C\u5730\uFF09\u2192 \u636E\u6B64\u4FDD\u4F4F push-pending\uFF0C\u522B\u4E50\u89C2\u6E05\u3002\n    // resolution=\"takeCloud\"\uFF08save \u9014\u4E2D\u51B2\u7A81\u9762\u7528\u6237\u9009\u4E86\u300C\u4E91\u7AEF\u8986\u76D6\u672C\u5730\u300D\uFF09= **\u6362\u4E16\u754C\u7EBF**\uFF1A\u672C\u5730\u5B57\u8282\u5DF2\u88AB\u4E91\u7AEF\u7248\u672C\n    //   \u8986\u76D6\uFF0C\u5185\u5B58\u91CC\u7684 doc \u662F\u9648\u65E7\u4E16\u754C\u7EBF \u2192 persist \u6536\u5C3E\u5FC5\u987B\u6574\u4F53\u91CD\u8F7D\uFF08\u590D\u7528 open \u7BA1\u7EBF\uFF09\u3002\u65E7 store \u4E0D\u56DE\u62A5\n    //   \u6B64\u5B57\u6BB5\uFF08undefined\uFF09\u2192 \u884C\u4E3A\u9000\u5316\u4E3A\u4FEE\u524D\u73B0\u72B6\uFF0C\u7ED3\u6784\u7C7B\u578B\u5929\u7136\u5411\u540E\u517C\u5BB9\u3002\n    save(bytes: Blob, opts?: { tryPush?: boolean; hint?: unknown }): Promise<{ pushed: boolean; reason?: string; resolution?: string }>;\n    tryMove(to: string): Promise<TryMoveResult>;   // \u6539\u8EAB\u4EFD/\u79FB\u52A8\u552F\u4E00\u5165\u53E3\uFF08\u542B nameOccupied \u5360\u7528\u68C0\u67E5\uFF09\u2014\u2014\u6302\u5728 file \u4E0A\n    trash(): Promise<{ status: string }>;   // = store \u7684 file.trash()\uFF082.1.2 \u524D\u53EB delete\uFF1B\u79FB\u8FDB\u56DE\u6536\u7AD9\uFF09\u3002status \u4E0D\u662F\u300C\u6210\u529F\u300D\u7684\u540C\u4E49\u8BCD\uFF08cancelled/noop \u4E5F\u8D70\u8FD9\u91CC\uFF09\n  };\n}\n\n/** app-agnostic \u7684 autosave / push \u7B56\u7565\uFF08\u6BCF app \u4E0D\u540C \u2192 \u6CE8\u5165\uFF09\u3002 */\nexport interface LifecyclePolicy {\n  autosaveMs?: number;                           // \u672C\u5730\u81EA\u52A8\u5B58\u95F4\u9694\uFF080/\u7F3A = \u4E0D\u81EA\u52A8\uFF0Capp \u81EA\u5DF1\u9A71\u52A8 flushLocal\uFF09\n  pushOn?: Array<\"exit\" | \"blur\" | \"idle\">;      // \u4F55\u65F6 consent-push\uFF08WeebPaint = [\"exit\"]\uFF09\uFF1B\u7F3A = \u53EA exit\n  idleMs?: number;                               // pushOn \u542B \"idle\" \u65F6\u7684\u7A7A\u95F2\u9608\u503C\uFF08\u7F3A = \u4E0D idle-push\uFF09\n}\n\nexport interface EditorSessionConfig {\n  store: StoreLike;\n  editor: EditorAdapter;\n  isZip?: boolean;                               // \u8FD9\u4E2A app \u7684 doc \u662F\u4E0D\u662F zip \u5BB9\u5668\uFF08\u6709 peek\uFF09\u3002\u9ED8\u8BA4 false\u3002\n  policy?: LifecyclePolicy;\n}\n\n// \u2500\u2500 \u751F\u547D\u5468\u671F\u7F16\u6392\u8005 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface EditorSession {\n  open(name: string): Promise<boolean>;          // \u6253\u5F00 doc\uFF1A\u5148\u5B58\u65E7 \u2192 file.open() \u2192 adopt\u3002\u8FD4\u56DE\u662F\u5426 adopt \u4E86\uFF08false=\u6587\u4EF6\u7F3A\u5931/\u9501\u5B9A\uFF0C\u672A\u88C5\u5165\uFF09\n  adopted(name: string, opts?: { create?: boolean }): void;   // \u7F16\u8F91\u5668\u5185\u5BB9\u5DF2\u7531 app \u88C5\u5165\uFF08new-doc/import\uFF0C\u975E store.open\uFF09\u2192 \u8BB0\u4E3A\u5F53\u524D + \u6807\u810F\uFF1B{create:true}=\u9996\u5B58 mode:\"new\"\uFF08\u649E\u540D\u4E0D\u8986\u76D6\uFF09\n  markDirty(): void;                              // app \u9A71\u52A8\u7684\u5185\u5BB9\u53D8\u5316\uFF08\u4E0D\u8D70 editor onChange\uFF0C\u5982\u8BBE\u7F6E/\u53C2\u8003\u7A97\uFF09\u2192 \u6807\u810F\n  flushLocal(): Promise<void>;                    // \u7ACB\u5373\u5B58\u672C\u5730\uFF08\u4E0D\u63A8\uFF09\u2014\u2014\u5185\u5B58\u810F\u624D\u52A8\n  flushAndPush(): Promise<void>;                  // \u7ACB\u5373\u5B58\u672C\u5730 + best-effort \u63A8\u4E91\u2014\u2014\u5185\u5B58\u810F **\u6216** push-pending \u624D\u52A8\uFF08\u9000\u51FA\u7528\uFF09\n  forceSaveAndPush(): Promise<void>;              // **\u65E0\u6761\u4EF6** encode + \u5B58 + \u63A8\uFF08\u7528\u6237\u663E\u5F0F\u6309 save\uFF09\u2014\u2014\u4E0D\u810F\u4E5F\u8981\u52A8\uFF0C\u8BA9\u65F6\u95F4\u6233\u8D70\u5B57\uFF08v409\uFF09\n  rename(newName: string): Promise<TryMoveResult>;   // \u6539\u8EAB\u4EFD\uFF08\u5148 flush \u65E7\u5185\u5BB9\uFF09\u2192 \u8D70 file.tryMove\uFF1B\u5360\u7528\u5219\u8FD4 {ok:false}\uFF08\u4E0D\u6539 _name\uFF09\n  delete(): Promise<void>;                        // \u5220\u5F53\u524D doc\n  currentName(): string | null;\n  // MoonSinger 2026-10-08\uFF08Claude Fable 5.1\uFF09\u52A0\uFF1A**\u653E\u4E0B**\u5F53\u524D\u8EAB\u4EFD\u2014\u2014\u4E0D\u518D\u6307\u5411\u5B83\u3001\u4E0D\u518D\u4E3A\u5B83\u843D\u76D8 / \u63A8\u3002\n  //   \u7528\u5728\u8EAB\u4EFD\u5DF2\u7ECF\u88AB\u522B\u5904\u5904\u7F6E\u4E4B\u540E\uFF08\u6B4C\u5E93\u628A\u6D3B\u52A8\u7A3F\u632A\u4E86\u5939 / \u6254\u8FDB\u56DE\u6536\u7AD9\uFF09\uFF1A\u6B64\u65F6\u518D\u8BA9 open(\u65B0\u540D) \u987A\u624B persist(\u65E7\u540D)\uFF08pushOn exit \u7684\u300C\u5207 doc \u524D\u5148\u5B58\u65E7\u7684\u300D\uFF09\n  //   \u5C31\u662F\u628A\u5DF2\u7ECF\u642C\u8D70 / \u5220\u6389\u7684\u540D\u5B57**\u5199\u56DE\u53BB\u590D\u6D3B**\uFF08WXHW \u5BA1\u8BA1 L7 \u540C\u7C7B\uFF09\u3002\u8C03\u7528\u524D app \u81EA\u5DF1\u5148 flush \u8FC7\uFF1B\u672A\u4E0A\u4E91\u7684\u4E8B\u5B9E\u7531 store \u8BB0\u7740\uFF08files.dirty.pushAll \u515C\uFF09\uFF0C\u4E0D\u9760\u672C\u6A21\u5757\u7684 push-pending\u3002\n  //   \u4E0D\u662F delete\uFF08\u4E0D\u52A8\u5B57\u8282\uFF09\u3001\u4E0D\u662F open\uFF08\u4E0D\u88C5\u65B0\u5185\u5BB9\uFF09\uFF1B\u7F16\u8F91\u5668\u91CC\u7684\u5185\u5BB9\u539F\u6837\u7559\u7740\uFF0C\u5F52 app \u51B3\u5B9A\u5B83\u7684\u4E0B\u4E00\u4E2A\u5BB6\u3002\n  release(): void;\n  isDirty(): boolean;                             // **\u5185\u5B58\u810F**\uFF08\u81EA\u4E0A\u6B21\u843D\u76D8\u540E editor \u6539\u8FC7\uFF09\u2014\u2014app \u5C42\u6982\u5FF5\uFF0C\u975E sync \u810F\n  // **\u672A\u4E0A\u4E91**\uFF1A\u5B57\u8282\u5DF2\u843D\u672C\u5730\uFF0C\u4F46\u4E91\u7AEF\u90A3\u6761\u817F\u6CA1\u6210\uFF08\u79BB\u7EBF / \u51B2\u7A81\u9762\u9009\u4E86\u53D6\u6D88 / deferred \u843D\u5730\u672A\u786E\u8BA4\uFF09\u3002\n  //   \u4E0E isDirty \u6B63\u4EA4\uFF1AisDirty=false \u2227 isPushPending=true \u662F\u6700\u8981\u547D\u7684\u7EC4\u5408\u2014\u2014\u300C\u5B58\u8FC7\u4E86\u300D\u4F46\u300C\u6CA1\u4E0A\u4E91\u300D\uFF0C\n  //   \u800C v432 \u4E4B\u524D\u5B83\u6CA1\u6709\u4EFB\u4F55\u6E32\u67D3\u9762\uFF0C\u4E8E\u662F\u5FBD\u7AE0\u7167\u753B\u4E91\u6735\u5BF9\u52FE\uFF08\u7528\u6237\u62A5\u7684\u300C\u8FDC\u7AEF\u6587\u4EF6\u4E0D\u4E00\u6837\u800C UI \u4ECE\u6CA1\u8BF4\u8FC7\u300D\uFF09\u3002\n  isPushPending(): boolean;\n  start(): void;                                  // \u6302 autosave timer + \u5931\u7126/pagehide \u76D1\u542C\uFF08\u6309 policy\uFF09\uFF1BDOM \u65E0\u5219 no-op\n  dispose(): void;                                // \u62C6\u76D1\u542C + \u505C timer\n}\n\nexport function createEditorSession(config: EditorSessionConfig): EditorSession {\n  const { store, editor, isZip = false } = config;\n  const policy = config.policy ?? {};\n  const pushOn = new Set(policy.pushOn ?? [\"exit\"]);\n\n  let _name: string | null = null;\n  let _dirty = false;                              // \u5185\u5B58\u810F\uFF1Aeditor \u6539\u8FC7\u3001\u8FD8\u6CA1\u843D\u672C\u5730\uFF08\u9A71\u52A8 autosave\uFF09\n  let _editEpoch = 0;                              // \u7F16\u8F91\u4EE3\u6570\uFF1AonChange \u5355\u8C03\u9012\u589E\u3002persist \u7528\u300Cfreeze \u65F6\u7684\u4EE3\u6570\u300D\u5224\u5B9A\n                                                   //   \u6E05\u810F\u662F\u5426\u5408\u6CD5\u2014\u2014encode/save \u7684 await \u7A97\u53E3\u91CC\u8FDB\u6765\u7684\u7F16\u8F91\u7EDD\u4E0D\u88AB\n                                                   //   \u4E50\u89C2\u6E05\u810F\u541E\u6389\uFF08QA 2026-08-21\uFF1Abusy \u671F\u952E\u76D8 undo \u66FE\u88AB\u9759\u9ED8\u5BA3\u5E03\u5DF2\u843D\u76D8\uFF09\u3002\n  let _pushPending = false;\n  let _refusedEpoch = -1;                          // canPersist \u62D2\u8FC7\u7684\u90A3\u4E00\u4EE3\u7F16\u8F91\uFF08\u540C\u4E00\u4EE3\u53EA\u8BF4\u4E00\u6B21\uFF09                        // \u63A8-pending\uFF1A\u81EA\u4E0A\u6B21\u6210\u529F\u63A8\u540E\u7F16\u8F91\u8FC7\uFF08\u9A71\u52A8\u9000\u51FA\u63A8\uFF1B\u2260\u5185\u5B58\u810F\uFF0CflushLocal \u6E05\u5185\u5B58\u810F\u4F46\u7559 push-pending\uFF09\n  let _saving = false;                             // \u843D\u76D8\u4E2D\uFF08\u9632\u91CD\u5165/\u7ADE\u6001\uFF09\n  let _timer: ReturnType<typeof setInterval> | null = null;\n  let _idleTimer: ReturnType<typeof setTimeout> | null = null;\n  let _onChangeWired = false;\n\n  // editor \u6539\u52A8 \u2192 \u6807\u5185\u5B58\u810F\uFF08register-once\uFF1Beditor \u751F\u547D\u5468\u671F = \u6574\u4E2A app\uFF0C\u65E0\u9700\u89E3\u7ED1\uFF09\u3002\n  function wireOnChange(): void {\n    if (_onChangeWired) return;\n    _onChangeWired = true;\n    editor.onChange(() => {\n      _dirty = true; _pushPending = true; _editEpoch++;\n      if (pushOn.has(\"idle\")) scheduleIdle();\n    });\n  }\n\n  const fileOf = (name: string) => store.file(name, { isZip, mode: \"existing\" });   // open/rename/\u5220\uFF1A\u5DF2\u5EFA\u8EAB\u4EFD\n  // adopted({create:true})\uFF08\u65B0\u5EFA\u753B\u5E03/import\uFF09\u2192 \u8BE5\u8EAB\u4EFD\u7684**\u9996\u5B58**\u7528 mode:\"new\"\uFF08\u649E\u540D\u4E0D\u8986\u76D6\uFF09\uFF0C\u9996\u5B58\u6210\u529F\u5373\u8F6C existing\u3002\n  // \u26A0 **per-name\uFF0C\u4E0D\u662F\u4F1A\u8BDD\u7EA7\u5E03\u5C14**\uFF08v417 \u4FEE\uFF09\uFF1A\u65E7\u7248\u662F `let _createNext = false`\uFF0C\u53EA\u5728 save() **resolve** \u540E\n  //   \u624D\u590D\u4F4D\uFF0C\u4E14 open() \u4ECE\u4E0D\u590D\u4F4D\u5B83\u3002\u4E8E\u662F\u4EFB\u610F\u4E00\u6B21 save \u629B\u5F02\u5E38\uFF08\u6BD4\u5982\u5BFC\u5165\u4E00\u4E2A\u91CD\u540D .ora\uFF09\u5C31\u628A\u5B83\u6C38\u4E45\u9489\u5728 true\n  //   \u76F4\u5230\u5173\u6807\u7B7E\u9875\u2014\u2014\u4E4B\u540E**\u6BCF\u4E2A\u6587\u4EF6\u7684\u6BCF\u6B21\u4FDD\u5B58**\u90FD\u8D70 mode:\"new\" \u2192 create-store \u7684 nameOccupied \u5148\u67E5\u672C\u5730 \u2192\n  //   \u521A\u6253\u5F00\u7684\u6587\u4EF6\u672C\u5730\u5F53\u7136\u6709 \u2192 \u629B CloudNameCollisionError\uFF08\u6587\u6848\u8FD8\u8BF4\"\u4E91\u7AEF\u540C\u540D\"\uFF09\u3002\u81EA\u6211\u5EF6\u7EED\uFF1A\u8BA9 flag \u5361\u4F4F\u7684\n  //   \u90A3\u4E2A\u629B\u9519\uFF0C\u672C\u8EAB\u5C31\u662F flag \u9020\u6210\u7684\u3002\u7ED1\u5230\u5177\u4F53\u8EAB\u4EFD\u4E0A\uFF0C\u8DE8\u6587\u6863\u6CC4\u6F0F\u5C31\u4E0D\u53EF\u8868\u793A\u4E86\u3002\n  let _createFor: string | null = null;\n\n  // tryPush=false\uFF08flushLocal/autosave\uFF09\uFF1A\u5185\u5B58\u810F\u624D\u52A8\u3002tryPush=true\uFF08flushAndPush/**\u9000\u51FA**\uFF09\uFF1A\u5185\u5B58\u810F **\u6216** push-pending \u5C31\u52A8\n  //   \uFF08= autosave \u5DF2\u628A\u5185\u5BB9\u843D\u672C\u5730\u3001\u5185\u5B58\u4E0D\u810F\u4F46\u8FD8\u6CA1\u63A8 \u2192 \u9000\u51FA\u4ECD\u8981\u63A8\uFF0C\u5426\u5219\u672C\u6B21\u7F16\u8F91\u53EA\u5728\u672C\u5730\uFF09\u3002\n  // force=true\uFF08forceSaveAndPush/**\u7528\u6237\u663E\u5F0F\u6309 save**\uFF09\uFF1A\u8DF3\u8FC7 need \u95E8\uFF0C\u4E0D\u810F\u4E5F encode+\u63A8\uFF08v409\uFF1A\u65F6\u95F4\u6233\u5FC5\u987B\u8D70\u5B57\uFF0C\n  //   \u5426\u5219\u7528\u6237\u70B9\u4E86 save \u770B\u5230\u65F6\u95F4\u6233\u6CA1\u52A8\u4F1A\u4EE5\u4E3A\u574F\u4E86\uFF09\u3002desk \u6539\u52A8**\u4E0D\u8FDB** need \u2014\u2014 \u53EA\u5728\u987A\u8DEF\u843D\u76D8\u65F6\u88AB encode \u987A\u624B\u635E\u8D70\n  //   \uFF08v409 \u51B3\u7B56\uFF1A\u9000\u51FA\u53EA\u6709 contentDirty \u624D\u63A8\uFF0Cdesk \u53EF\u629B\uFF1B\u8BE6 editor-state.ts \u7684 \u26A0 \u6BB5\uFF09\u3002\n  async function persist(tryPush: boolean, force = false): Promise<void> {\n    const need = force || (tryPush ? (_dirty || _pushPending) : _dirty);\n    if (!_name || !need || _saving) return;\n    { const why = editor.canPersist?.(); if (why) { if (_refusedEpoch !== _editEpoch) { _refusedEpoch = _editEpoch; editor.onRefused?.(why); } return; } }   // \u7B2C \u2463 \u5C42\u62A4\u680F\uFF1Aapp \u8BF4\u4E0D\u80FD\u5199 = \u8FD9\u4E00\u8F6E\u4EC0\u4E48\u90FD\u4E0D\u52A8\u3001\u810F\u7559\u7740\n    _saving = true;\n    let takeCloudReload = false;   // save \u9014\u4E2D\u7528\u6237\u9009\u4E86\u300C\u4E91\u7AEF\u8986\u76D6\u672C\u5730\u300D\u2192 \u6536\u5C3E\u5FC5\u987B\u6574\u4F53\u91CD\u8F7D\uFF08\u89C1 finally \u4E4B\u540E\uFF09\n    // \u2605 \u5931\u8D25\u56DE\u6EDA\u7528\uFF08v417\uFF09\uFF1A\u4E0B\u9762\u4F1A**\u5148**\u4E50\u89C2\u6E05\u810F\u3001**\u518D** await save()\u3002save() \u629B\u5F02\u5E38\u65F6\u82E5\u4E0D\u8FD8\u539F\uFF0C\n    //   \u672C\u6B21\u7F16\u8F91\u5C31\u5728\u5185\u5B58\u91CC\u88AB\u5BA3\u5E03\"\u5DF2\u843D\u76D8\"\u800C\u5B9E\u9645\u4E00\u4E2A\u5B57\u8282\u90FD\u6CA1\u5199 \u2014\u2014 badge \u753B\u5E72\u51C0\u3001autosave \u770B need=false\n    //   \u6C38\u4E0D\u91CD\u8BD5\u3001\u9000\u51FA\u65F6\u90A3\u4E2A\u4E13\u4E3A\u4FDD\u5B58\u5931\u8D25\u8BBE\u8BA1\u7684\u300C\u91CD\u8BD5/\u4E22\u5F03\u300D\u5FAA\u73AF\uFF08session-state \u7684 while (es.isDirty())\uFF09\n    //   \u4E5F\u88AB\u4E00\u5E76\u89E3\u9664\u6B66\u88C5\u3002\u90A3\u662F K2 \u7EA2\u7EBF\uFF08\u7EDD\u4E0D\u65E0\u6761\u4EF6\u5BA3\u5E03\u5E72\u51C0\uFF09\u7834\u5728\u6267\u884C\u5B83\u7684\u6A21\u5757\u4E0B\u9762\u4E00\u5C42\u3002\n    const wasDirty = _dirty, wasPushPending = _pushPending;\n    // freeze \u4EE3\u6570\uFF1Aencode() \u7684\u540C\u6B65\u524D\u7F00\u5C31\u662F\u5FEB\u7167\u51BB\u7ED3\u70B9\uFF08\u6B64\u884C\u5230\u8C03\u7528\u4E4B\u95F4\u65E0 await\uFF0C\u4E0D\u53EF\u80FD\u63D2\u8FDB\u7F16\u8F91\uFF09\u3002\n    //   encode/save \u7684 await \u7A97\u53E3\u91CC\u82E5\u6709\u7F16\u8F91\uFF08busy \u53EA\u6709\u51E0\u4F55\u906E\u7F69\uFF0C\u952E\u76D8 undo/redo \u7A7F\u5F97\u8FDB\u6765\uFF09\uFF0C\n    //   \u4EE3\u6570\u5C31\u4F1A\u8D70\u52A8 \u2192 \u4E0B\u9762\u7684\u6E05\u810F/\u6E05 push-pending \u4E00\u5F8B\u4E0D\u8BB8\u6267\u884C\uFF08\u5B81\u53EF\u591A\u5B58\u4E00\u8F6E\uFF0C\u7EDD\u4E0D\u5047\u6E05\uFF09\u3002\n    const epochAtFreeze = _editEpoch;\n    try {\n      const { bytes, peek } = await editor.encode();\n      if (_editEpoch === epochAtFreeze) _dirty = false;   // \u6E05\u5185\u5B58\u810F\uFF1Aencode \u5DF2\u53D6\u5FEB\u7167\uFF1B\u5FEB\u7167**\u4E4B\u540E**\u7684\u7F16\u8F91\u4FDD\u4F4F\u810F\uFF08\u4E0B\u8F6E autosave \u6536\uFF09\n      // \u65B0\u5EFA\u753B\u5E03/import \u9996\u5B58 \u2192 mode:\"new\"\uFF08\u649E\u540D\u4E0D\u9759\u9ED8\u8986\u76D6\uFF0C\u629B CloudNameCollisionError\uFF1BsaveNow \u5DF2 try/catch surface\uFF09\uFF1B\u6210\u529F\u5373\u8F6C existing\uFF08\u540E\u7EED autosave = \u7F16\u8F91\uFF09\u3002\n      const mode = _createFor === _name ? \"new\" : \"existing\";\n      const res = await store.file(_name, { isZip, mode }).save(bytes, { tryPush, hint: peek != null ? { peek } : undefined });\n      // push-pending \u6309**\u5B9E\u9645\u7ED3\u679C**\u6E05\uFF0C\u4E0D\u518D\u4E50\u89C2\u6E05\uFF08v432\uFF09\u3002\u65E7\u7248\u5728 save \u4E4B\u524D\u5C31 `_pushPending = false`\uFF0C\n      //   \u800C store \u5185\u90E8\u628A push \u5931\u8D25 catch \u6210 banner \u540E save() \u7167\u5E38 resolve \u2192 \u8FD9\u91CC\u6C38\u8FDC\u770B\u4E0D\u5230\u5931\u8D25 \u2192\n      //   badge \u753B\u5E72\u51C0\u3001\u9000\u51FA\u4E0D\u518D\u91CD\u63A8\u3001\u4E0B\u6B21 autosave \u4E5F\u4E0D\u8865 \u2192 \u4E91\u7AEF\u59CB\u7EC8\u505C\u5728\u65E7\u7248\u800C UI \u4ECE\u6CA1\u8BF4\u8FC7\u5931\u8D25\u3002\n      //   \uFF08\u65E7\u6CE8\u91CA\u8BF4\"store \u5185\u90E8 queue \u8865\u63A8\"\u662F\u5047\u4FDD\u8BC1\uFF1AWeebPaint \u7528\u9ED8\u8BA4 \"manual\" \u7B56\u7565\uFF0Cupload-queue \u7B2C\u4E00\u884C\u5C31\u8FD4\u56DE\uFF0C\n      //    \u90A3\u4E2A\u961F\u5217\u6C38\u4E0D drain\u3002\uFF09\n      //   `res?.pushed !== true` \u800C\u975E `!res.pushed`\uFF1Astore \u6CA1\u62A5\u544A\u7ED3\u679C\uFF08\u65E7\u9002\u914D\u5668/mock\uFF09\u65F6**\u5047\u5B9A\u6CA1\u63A8\u4E0A\u53BB**\uFF0C\n      //   \u4FDD\u4F4F push-pending \u4E0B\u6B21\u91CD\u8BD5\u3002\u5B81\u53EF\u591A\u63A8\u4E00\u6B21\uFF0C\u4E5F\u4E0D\u8981\u9759\u9ED8\u6E05\u5E72\u51C0\uFF08\u4F18\u5148\u7EA7\u2461\uFF09\u3002\n      if (tryPush) _pushPending = res?.pushed !== true || _editEpoch !== epochAtFreeze;   // \u63A8\u4E0A\u53BB\u7684\u662F freeze \u5FEB\u7167\u2014\u2014\u4E4B\u540E\u7684\u7F16\u8F91\u8FD8\u6B20\u4E00\u63A8\n      takeCloudReload = res?.resolution === \"takeCloud\";   // \u6362\u4E16\u754C\u7EBF\u6807\u8BB0\uFF08\u91CD\u8F7D\u5728 finally \u4E4B\u540E\u505A\uFF0C_saving \u5DF2\u653E\u5F00\uFF09\n      if (_createFor === _name) _createFor = null;   // \u9996\u5B58\u6210\u529F \u2192 \u8FD9\u4E2A\u8EAB\u4EFD\u5DF2\u5EFA\uFF0C\u540E\u7EED\u90FD\u662F\u7F16\u8F91\n      // \u843D\u76D8\u6210\u529F \u2192 \u901A\u77E5 app \u57DF\u5B57\u8282\u53D8\u4E86\uFF08\u7F29\u7565\u56FE\u7B49\u6D3E\u751F\u7F13\u5B58\u4F5C\u5E9F\uFF09\u3002save() \u80FD resolve = \u672C\u5730\u5DF2\u5199\u6210\n      //   \uFF08push \u5931\u8D25\u88AB store \u5185\u90E8 catch \u6210 banner\uFF0C\u4E0D\u5F71\u54CD\u300C\u5B57\u8282\u5DF2\u53D8\u300D\u8FD9\u4E2A\u4E8B\u5B9E\uFF09\u3002\n      if (_name != null) editor.onSaved?.(_name);\n    } catch (e) {\n      // \u8FD8\u539F**\u5165\u573A\u65F6\u7684\u771F\u5B9E\u72B6\u6001**\uFF08\u4E0D\u662F\u65E0\u8111\u7F6E\u810F\uFF09\uFF1A\u672C\u6765\u810F\u5C31\u7EE7\u7EED\u810F\uFF08\u5DE5\u4F5C\u6CA1\u4E22\u3001\u91CD\u8BD5\u6B66\u88C5\u7740\uFF09\uFF1B\n      //   \u672C\u6765\u5E72\u51C0\uFF08force save \u4E00\u4E2A\u672A\u6539\u52A8\u7684 doc\uFF09\u5C31\u4FDD\u6301\u5E72\u51C0\uFF0C\u522B\u9020\u4E00\u4E2A\u5047\u7684\u810F badge\u3002\n      //   store.save() \u5185\u90E8\u5DF2\u541E\u6389 push \u5931\u8D25\uFF08\u53EA reportError\uFF09\uFF0C\u6240\u4EE5\u80FD\u629B\u5230\u8FD9\u91CC\u7684\u57FA\u672C\u90FD\u662F\"\u672C\u5730\u4E5F\u6CA1\u5199\u6210\"\u3002\n      //   \u5165\u573A\u540E\uFF08await \u7A97\u53E3\u91CC\uFF09\u53C8\u7F16\u8F91\u8FC7 \u2192 \u65E0\u8BBA\u5165\u573A\u65F6\u591A\u5E72\u51C0\uFF0C\u73B0\u5728\u5FC5\u987B\u662F\u810F\u7684\uFF08epoch \u515C\u5E95\uFF09\u3002\n      _dirty = wasDirty || _editEpoch !== epochAtFreeze;\n      _pushPending = wasPushPending || _editEpoch !== epochAtFreeze;\n      throw e;\n    } finally {\n      _saving = false;\n    }\n    // \u2500\u2500 takeCloud \u6536\u5C3E\uFF1A\u6362\u4E16\u754C\u7EBF\uFF082026-08-25 \u6848\u5377 20260825-cloud-override-adopt-noop-case.md \u00A71\uFF09\u2500\u2500\n    // takeCloud \u4E0D\u662F\u4F5C\u7528\u5728 workspace \u4E0A\u7684\u64CD\u4F5C\uFF0C\u662F**\u6587\u4EF6\u7248\u672C\u6A21\u578B\u7684\u6362\u4E16\u754C\u7EBF**\uFF08user 2026-08-25 \u62CD\u677F\u53D6 B \u5F62\u72B6\uFF1A\n    //   \u590D\u7528\u91CD\u5F00\u7BA1\u7EBF\uFF0C\u4E0D\u505A\u5F15\u64CE\u4FA7\u6D3B\u66FF\u6362\uFF09\u3002\u6B64\u523B store \u672C\u5730\u5B57\u8282\u5DF2\u662F\u4E91\u7AEF\u7248\u672C\u3001\u8C31\u7CFB\u5DF2 markSynced\uFF0C\u800C\u5185\u5B58 doc\n    //   \u8FD8\u662F\u88AB\u6362\u6389\u7684\u65E7\u4E16\u754C\u7EBF\u2014\u2014\u4FEE\u524D\u8FD9\u91CC\u4EC0\u4E48\u90FD\u4E0D\u505A\uFF0C\u5C31\u662F\u300C\u753B\u5E03\u9648\u65E7 + UI \u62A5 synced \u2192 \u4E0B\u6B21\u4FDD\u5B58\u9759\u9ED8\u8986\u5199\u4E91\u7AEF\u300D\n    //   \u7684\u4E8B\u6545\u6839\u56E0\u3002openInto = \u4E0E open() \u540C\u4E00\u6761 vetted \u7BA1\u7EBF\uFF08store.open \u2192 editor.adopt \u5168\u91CF\u91CD\u5EFA\uFF09\uFF1B\n    //   adopt \u66FF\u6362\u5373\u65B0 session\uFF0Cundo \u6808\u81EA\u7136\u4ECE\u96F6\u8D77\uFF08\u65E7\u4E16\u754C\u7EBF\u7684 undo \u5386\u53F2\u8DE8\u7248\u672C\u65E0\u6548\uFF0C\u88AB\u6362\u6389\u7684\u5B57\u8282\u5DF2\u5728 .backup\uFF09\u3002\n    //   freeze \u5FEB\u7167\u4E4B\u540E\u3001sheet \u671F\u95F4\u7A7F\u8FDB\u6765\u7684\u7F16\u8F91\uFF08\u952E\u76D8 undo \u7B49\uFF09\u5C5E\u4E8E\u88AB\u4E22\u5F03\u7684\u65E7\u4E16\u754C\u7EBF\uFF0C\u968F\u91CD\u8F7D\u4E00\u5E76\u8BA9\u4F4D\u3002\n    if (takeCloudReload && _name) {\n      const ok = await openInto(_name);\n      // \u91CD\u8F7D\u5931\u8D25\uFF08\u51E0\u4E4E\u4E0D\u53EF\u80FD\uFF1A\u5B57\u8282\u521A\u5199\u8FDB\u672C\u5730\u3001\u521A\u8FC7 validateAdopt\uFF09\u2192 \u5FC5\u987B\u54CD\u4EAE\uFF1A\u753B\u5E03\u4ECD\u662F\u65E7\u4E16\u754C\u7EBF\uFF0C\n      //   \u9759\u9ED8\u7559\u7740\u5C31\u662F\u539F\u4E8B\u6545\u7684\u5931\u8D25\u8DEF\u5F84\u590D\u6D3B\u3002\u629B\u7ED9\u8C03\u7528\u65B9 surface\uFF1Bflags \u6B64\u523B pushed=true \u2192 \u65E0\u5F85\u63A8\uFF0C\n      //   \u4E0D\u4F1A\u56E0\u6B64\u628A\u9648\u65E7\u753B\u5E03\u518D\u63A8\u4E0A\u4E91\u3002\n      if (!ok) throw new Error(\"[editor-session] takeCloud reload failed: canvas still shows the pre-override version \u2014 reopen the file\");\n    }\n  }\n\n  // open \u7684\u88C5\u5165\u6BB5\uFF08open() \u4E0E takeCloud \u91CD\u8F7D\u5171\u7528\u7684\u540C\u4E00\u6761\u7BA1\u7EBF\uFF09\uFF1Astore.open\uFF08\u5185\u542B freshness/\u51B2\u7A81 surface/\u5D29\u6E83\u6062\u590D\uFF09\n  //   \u2192 editor.adopt \u5168\u91CF\u91CD\u5EFA \u2192 \u8BB0\u8EAB\u4EFD + \u7F6E\u5E72\u51C0\u3002\n  // \u2605 \u5F00\u4E00\u4E2A\u8EAB\u4EFD\u662F**\u4E8B\u52A1\u6027**\u7684\uFF1A\u6CA1\u771F\u7684\u88C5\u5165\u5B57\u8282\uFF0C\u4F1A\u8BDD\u5C31\u7EDD\u4E0D\u6307\u5411\u5B83\uFF08v417 \u4FEE\uFF0C\u4F18\u5148\u7EA7 1 = OneDrive \u4E0D\u4E22\u753B\uFF09\u3002\n  //   \u65E7\u7248\u65E0\u6761\u4EF6 `_name = name`\uFF0C\u4E8E\u662F blob==null\uFF08\u79BB\u7EBF\u7EAF\u4E91\u7AEF / \u6587\u4EF6\u9501\u5B9A / \u672C\u5730\u5B57\u8282\u6CA1\u4E86\uFF09\u65F6\uFF1A\n  //     \u00B7 \u753B\u5E03\u4E0A\u8FD8\u662F**\u4E0A\u4E00\u5F20\u753B**\uFF0C\u8EAB\u4EFD\u5374\u5DF2\u7ECF\u6362\u6210\u65B0\u540D\u5B57 \u2192 \u4E0B\u6B21 autosave \u628A\u4E0A\u4E00\u5F20\u753B\u7684\u50CF\u7D20\u5199\u8FDB\u65B0\u8EAB\u4EFD\n  //       \u2192 \u9000\u51FA\u65F6 pushOn:[\"exit\"] \u63A8\u4E0A OneDrive\uFF0C\u8986\u76D6\u6389\u76EE\u6807\u90A3\u5F20\u753B\u3002\n  //     \u00B7 boot \u5931\u8D25\u8DEF\u5F84\u66F4\u9690\u853D\uFF1Aboot.ts \u7684 session.setName(null) \u53EA\u6E05 app \u5C42\u7684 _activeSessionName\uFF0C\n  //       es._name \u8FD8\u7559\u7740 X.ora \u2192 \u7528\u6237\u5728\u7A7A\u767D\u753B\u5E03\u4E0A\u753B\u4E00\u7B14 \u2192 autosave \u628A\u7A7A\u767D\u8986\u76D6\u5230 X.ora\u3002\n  //   `session.ts:48-52` \u8BB0\u7740 AtlasMaker 0.7.2 \u5C31\u662F\u8FD9\u4E48\u5403\u6389\u4E00\u4E2A\u52A0\u5BC6\u6587\u4EF6\u7684\uFF1A**app \u5C42\u7684\u5E7D\u7075\u8DEF\u5F84\u5B88\u536B\n  //   \u672C\u8EAB\u662F\u5BF9\u7684**\uFF0C\u5B83\u662F\u88AB\u8FD9\u91CC\u79C1\u7559\u7684\u7B2C\u4E8C\u4EFD\u540D\u5B57\u7ED5\u8FC7\u53BB\u7684\u3002\n  //   \u5931\u8D25\u65F6**\u4FDD\u6301\u539F\u6709 _name/_dirty \u4E0D\u52A8**\uFF08\u4E0D\u662F\u6E05\u6210 null\uFF09\uFF1A\u753B\u5E03\u4E0A\u4ECD\u662F\u65E7\u6587\u6863\uFF0C\u5B83\u5C31\u8BE5\u7EE7\u7EED\u5B58\u56DE\u81EA\u5DF1\u7684\u8EAB\u4EFD\u3002\n  async function openInto(name: string): Promise<boolean> {\n    const blob = await fileOf(name).open();      // open \u5185\u542B freshness / \u51B2\u7A81 surface\uFF08store \u7684 ui\uFF09/ \u5D29\u6E83\u6062\u590D\n    if (!blob) return false;                     // false = \u6587\u4EF6\u7F3A\u5931/\u9501\u5B9A\uFF0Cdoc \u672A\u88C5\u5165\uFF08caller \u636E\u6B64\u56DE\u56FE\u5E93\u3001\u522B\u6539\u6D3B\u52A8\u540D\uFF09\n    await editor.adopt(blob);\n    _name = name;\n    _dirty = false; _pushPending = false;        // \u521A adopt = \u5E72\u51C0\uFF08\u672C\u4F1A\u8BDD\u672A\u7F16\u8F91\uFF1Bdesk \u7531 Unserialize \u8F7D\u5165\uFF09\n    if (_createFor === name) _createFor = null;  // \u8FD9\u4E2A\u540D\u5B57\u5DF2\u80FD\u4ECE store \u6253\u5F00 \u2192 \u8EAB\u4EFD\u5DF2\u5EFA\uFF0C\u4E0D\u8BE5\u518D\u8D70 mode:\"new\"\n    return true;\n  }\n\n  function scheduleIdle(): void {\n    if (!pushOn.has(\"idle\") || !policy.idleMs) return;\n    if (_idleTimer != null) clearTimeout(_idleTimer);\n    _idleTimer = setTimeout(() => { void persist(true); }, policy.idleMs);\n  }\n\n  return {\n    currentName: () => _name,\n    isDirty: () => _dirty,\n    isPushPending: () => _pushPending,\n\n    async open(name: string): Promise<boolean> {\n      if (_name && _name !== name) await persist(pushOn.has(\"exit\"));   // \u5207 doc \u524D\u5148\u5B58\u65E7\u7684\uFF08\u9000\u51FA\u8BED\u4E49\uFF09\n      wireOnChange();\n      return openInto(name);                       // \u88C5\u5165\u6BB5\u62BD\u6210 openInto\uFF08\u4E0E takeCloud \u91CD\u8F7D\u5171\u7528\uFF1B\u4E8B\u52A1\u6027\u4FDD\u8BC1\u89C1\u5176\u6CE8\u91CA\uFF09\n    },\n\n    adopted(name: string, opts?: { create?: boolean }): void {   // new-doc/import\uFF1A\u7F16\u8F91\u5668\u5185\u5BB9\u7531 app \u88C5\u5165\uFF08\u975E store.open\uFF09\u2192 \u5F53\u524D + \u810F\n      wireOnChange();\n      _name = name;\n      _dirty = true; _pushPending = true;          // \u65B0\u5185\u5BB9\u672A\u843D\u76D8/\u672A\u63A8\uFF1Bdesk=\u9ED8\u8BA4\uFF08reset \u8FC7\uFF09\n      _createFor = opts?.create ? name : null;     // \u65B0\u5EFA\u753B\u5E03/import \u2192 **\u8BE5\u8EAB\u4EFD**\u9996\u5B58 mode:\"new\"\uFF08\u649E\u540D\u4E0D\u8986\u76D6\uFF09\uFF1B\u7EAF adopt(revert/\u5207\u540D) \u4E0D\u8BBE = existing\n    },\n\n    markDirty(): void { _dirty = true; _pushPending = true; },   // app \u9A71\u52A8\u5185\u5BB9\u53D8\u5316\uFF08onChange \u4E4B\u5916\uFF09\u2192 \u6807\u810F\n\n    release(): void { _name = null; _dirty = false; _pushPending = false; _createFor = null; },   // \u653E\u4E0B\u8EAB\u4EFD\uFF08\u89C1\u63A5\u53E3\u6CE8\u91CA\uFF09\n\n    flushLocal: () => persist(false),\n    flushAndPush: () => persist(true),\n    forceSaveAndPush: () => persist(true, true),   // \u7528\u6237\u663E\u5F0F\u6309 save\uFF1A\u65E0\u6761\u4EF6 encode+\u63A8\uFF08v409\uFF09\n\n    async rename(newName: string): Promise<TryMoveResult> {\n      if (!_name) return { ok: true };\n      await persist(false);                        // \u5148\u628A\u5185\u5B58\u843D\u5230\u65E7\u540D\n      const r = await fileOf(_name).tryMove(newName);   // \u552F\u4E00\u5165\u53E3\uFF08\u542B\u5360\u7528\u68C0\u67E5\uFF0C\u6302\u5728 file \u4E0A\uFF09\uFF1B\u5360\u7528\u2192\u4E0D\u6539 _name\n      if (r.ok) _name = newName;\n      return r;\n    },\n\n    async delete(): Promise<void> {\n      if (!_name) return;\n      const n = _name;\n      _name = null; _dirty = false; _pushPending = false;\n      await fileOf(n).trash();\n    },\n\n    start(): void {\n      wireOnChange();\n      if (policy.autosaveMs && policy.autosaveMs > 0) {\n        if (_timer != null) clearInterval(_timer);\n        _timer = setInterval(() => { void persist(false); }, policy.autosaveMs);   // autosave \u53EA\u672C\u5730\uFF08consent-safe\uFF09\n      }\n      const doc = (globalThis as { document?: EventTarget }).document;\n      const win = (globalThis as { addEventListener?: typeof addEventListener }).addEventListener\n        ? (globalThis as unknown as EventTarget) : null;\n      // \u5D29\u6E83\u5B89\u5168\uFF1A\u9875\u9762\u9690\u85CF/\u5378\u8F7D \u2192 flushLocal\uFF08\u4E0D\u63A8\uFF1A\u9875\u9762\u8981\u5173\uFF0Cpush \u672A\u5FC5\u5B8C\u6210\uFF09\u3002\n      doc?.addEventListener?.(\"visibilitychange\", () => {\n        if ((globalThis as { document?: { visibilityState?: string } }).document?.visibilityState === \"hidden\") void persist(false);\n      });\n      // #60-C\uFF082026-09-09\uFF09\uFF1Apersisted=true\uFF08\u8981\u8FDB bfcache\uFF09\u4E0D\u5199\u2014\u2014\u51BB\u7ED3\u9875\u91CC\u7684 IDB \u5199\u6C38\u8FDC commit \u4E0D\u4E86\uFF0C\u53EA\u4F1A\u6301\u9501\uFF08\u6848\u5377 20260909-bfcache-idb-lock\uFF09\u3002\n      win?.addEventListener?.(\"pagehide\", (e: Event) => { if (!(e as { persisted?: boolean }).persisted) void persist(false); });\n      // \u5931\u7126\uFF1A\u6309 policy \u51B3\u5B9A\u63A8\u4E0D\u63A8\u3002\n      win?.addEventListener?.(\"blur\", () => { void persist(pushOn.has(\"blur\")); });\n    },\n\n    dispose(): void {\n      if (_timer != null) { clearInterval(_timer); _timer = null; }\n      if (_idleTimer != null) { clearTimeout(_idleTimer); _idleTimer = null; }\n    },\n  };\n}\n", "// \u53C2\u8003\u7A97\u7528\u5230\u7684\u4E24\u6BB5\u624B\u52BF\u4E09\u89D2\uFF08\u7EAF\u51FD\u6570\uFF1A\u7ED9\u6570\u5B57 \u2192 \u51FA\u6570\u5B57\uFF0C\u65E0 DOM\uFF09\u3002\n// created 2026-09-29 by Claude Fable 5.1\n//\n// \u6E90 = WeebPaint src/common/pointer-gesture.ts\uFF08v0.14.20\uFF09\u7684\u4E24\u4E2A\u5171\u4EAB kernel\uFF0C\u9010\u5B57\u6284\u5165\u3001\u4E0D\u6539\u8BED\u4E49\u3002\n// WeebPaint \u90A3\u4EFD\u8FD8\u8981\u7ED9\u4E3B\u753B\u5E03\u7684\u8F93\u5165\u7528\uFF0C\u6240\u4EE5\u7559\u5728\u539F\u5904\uFF1B\u4E24\u4EFD\u4E4B\u95F4\u7684\u6F02\u79FB\u7531 WeebPaint \u4FA7\u7684\u5BF9\u62CD\u6D4B\u8BD5\u5B88\u7740\n// \uFF08\u540C\u4E00\u7EC4\u8F93\u5165\u5582\u4E24\u8FB9\uFF0C\u8F93\u51FA\u5FC5\u987B\u9010\u4F4D\u76F8\u540C\uFF09\u3002\u6539\u8FD9\u91CC\u7684\u6570\u5B66 = \u4E24\u8FB9\u4E00\u8D77\u6539\u3002\n// \u53CC\u6307 scale+rot \u589E\u91CF\u3002\n//   start = { dist, angle, vp:{scale,rot} }\uFF08caller \u62CD\u7684\u8D77\u624B\u5FEB\u7167\uFF1Bmid/\u5750\u6807\u7CFB\u5404\u81EA\u7BA1\uFF09\n//   dist/angle = \u5F53\u524D\u4E24\u6307\u7684\u8FDE\u7EBF\u957F\u5EA6/\u89D2\u5EA6\n//   \u2192 { scale\uFF08\u5DF2\u5939 [minScale,maxScale]\uFF09, rot\uFF08\u5DF2\u628A\u89D2\u5EA6\u5DEE\u5F52\u4E00\u5316\u5230 [-\u03C0,\u03C0] \u518D\u53E0\u52A0\uFF09}\nexport function pinchScaleRot(start, dist, angle, minScale, maxScale) {\n    const scale = Math.max(minScale, Math.min(maxScale, start.vp.scale * (dist / start.dist)));\n    let dRot = angle - start.angle;\n    if (dRot > Math.PI)\n        dRot -= 2 * Math.PI;\n    if (dRot < -Math.PI)\n        dRot += 2 * Math.PI;\n    return { scale, rot: start.vp.rot + dRot };\n}\n// anchor-preserving \u5E73\u79FB\u89E3\uFF08origin-affine\uFF1Ascreen = scale\u00B7R(rot)\u00B7model + (tx,ty)\uFF09\uFF1A\n// \u6C42 (tx,ty) \u8BA9\u56FA\u5B9A\u7684 model \u70B9\u843D\u5230\u5C4F\u5E55 (screenX, screenY)\u3002\nexport function solveAnchorTranslation(modelPt, scale, rot, screenX, screenY) {\n    const c = Math.cos(rot), s = Math.sin(rot);\n    return {\n        tx: screenX - (modelPt.x * scale * c - modelPt.y * scale * s),\n        ty: screenY - (modelPt.x * scale * s + modelPt.y * scale * c),\n    };\n}\n", "// \u724C\u7EC4\u6A21\u578B\uFF1A\u53C2\u8003\u7A97\u91CC\u90A3\u4E00\u53E0\u5361\u3002\u96F6 DOM\u2014\u2014node \u76F4\u6D4B\uFF1BCatsUp \u7684 VR \u89C6\u56FE\u3001\u5BBF\u4E3B\u81EA\u5DF1\u91CD\u5199\u7684\u89C6\u56FE\u4E5F\u4ECE\u8FD9\u91CC\u8FDB\u3002\n// created 2026-09-29 by Claude Fable 5.1\n// \u5951\u7EA6\u51FA\u5904 = \u5BB6\u65CF\u6839 ai-docs/20260929-reference-window-tech-plan.md \u00A73\u3002\n//\n// \u4E09\u6761\u89C4\u77E9\uFF1A\n//   1. \u672C\u6A21\u5757\u4E0D\u6301\u4E45\u5316\u3001\u4E0D\u8054\u7F51\u3001\u4E0D\u78B0 DOM\u3002\u5BBF\u4E3B\u7528 snapshot() \u628A\u724C\u7EC4\u62FF\u8D70\uFF0C\u5199\u8FDB\u81EA\u5DF1\u7684\u5BB9\u5668\u3002\n//   2. restore() \u662F\u8F7D\u5165\u6062\u590D\u4E13\u7528\uFF0C\u9759\u9ED8\uFF1B\u5176\u4F59\u4E00\u5207\u53D8\u66F4\u90FD\u901A\u77E5 onChange\uFF08\u5BBF\u4E3B\u636E\u6B64\u540C\u6B65\u6E05\u5355\u3001\u51B3\u5B9A\u6807\u4E0D\u6807\u810F\uFF09\u3002\n//   3. \u8FD9\u4E2A\u5BBF\u4E3B\u4E0D\u8BA4\u8BC6\u7684\u5361\u4E0D\u8FDB cards\uFF08\u753B\u4E0D\u51FA\u6765\uFF09\uFF0C\u4F46\u539F\u6837\u7559\u5728 carried \u91CC\uFF0C\u4FDD\u5B58\u65F6\u539F\u6837\u5199\u56DE\u3002\nfunction cloneView(v) {\n    if (!v)\n        return null;\n    const ok = Number.isFinite(v.tx) && Number.isFinite(v.ty) && Number.isFinite(v.scale) && Number.isFinite(v.rot);\n    return ok ? { tx: v.tx, ty: v.ty, scale: v.scale, rot: v.rot } : null;\n}\nfunction clonePlay(p) {\n    if (!p || !Number.isFinite(p.t))\n        return null;\n    const fps = typeof p.fps === \"number\" && Number.isFinite(p.fps) && p.fps > 0 ? p.fps : undefined;\n    return fps !== undefined ? { t: p.t, loop: !!p.loop, fps } : { t: p.t, loop: !!p.loop };\n}\nfunction cloneExtra(x) {\n    if (!x || typeof x !== \"object\" || Array.isArray(x) || Object.keys(x).length === 0)\n        return null;\n    return JSON.parse(JSON.stringify(x));\n}\nfunction cloneCarried(c) {\n    return { at: c.at, item: JSON.parse(JSON.stringify(c.item)), files: { ...c.files } };\n}\nfunction clampIndex(i, n) {\n    if (n <= 0)\n        return 0;\n    if (!Number.isFinite(i))\n        return 0;\n    return Math.max(0, Math.min(n - 1, Math.trunc(i)));\n}\nexport function createDeck() {\n    let cards = [];\n    let carried = [];\n    let extra = {};\n    let index = 0;\n    let seq = 0;\n    const listeners = new Set();\n    const emit = (what) => {\n        // \u9010\u4E2A\u8C03\uFF1B\u4E00\u4E2A\u76D1\u542C\u8005\u629B\u9519\u4E0D\u8BB8\u62D6\u57AE\u522B\u7684\u76D1\u542C\u8005\uFF0C\u4E5F\u4E0D\u8BB8\u541E\u6389\u2014\u2014\u6536\u96C6\u540E\u7EDF\u4E00\u91CD\u629B\u7B2C\u4E00\u4E2A\u3002\n        let first = null, threw = false;\n        for (const fn of [...listeners]) {\n            try {\n                fn(what);\n            }\n            catch (e) {\n                if (!threw) {\n                    threw = true;\n                    first = e;\n                }\n            }\n        }\n        if (threw)\n            throw first;\n    };\n    const make = (c) => ({\n        id: `c${++seq}`,\n        kind: c.kind,\n        name: c.name ?? \"\",\n        bytes: c.bytes ?? null,\n        mime: c.mime ?? (c.bytes?.type || \"\"),\n        target: c.target ?? null,\n        vp: cloneView(c.vp),\n        play: clonePlay(c.play),\n        origin: c.origin ?? null,\n        ram: c.ram && Number.isFinite(c.ram.bytes) ? { bytes: c.ram.bytes } : null,\n        extra: cloneExtra(c.extra),\n    });\n    const copy = (c) => ({ ...c, vp: cloneView(c.vp), play: clonePlay(c.play), ram: c.ram ? { bytes: c.ram.bytes } : null, extra: cloneExtra(c.extra) });\n    const deck = {\n        get size() { return cards.length; },\n        get index() { return index; },\n        get current() { return cards[index] ?? null; },\n        cards: () => cards,\n        get: (id) => cards.find((c) => c.id === id) ?? null,\n        indexOf: (id) => cards.findIndex((c) => c.id === id),\n        snapshot: () => ({ index, cards: cards.map(copy), carried: carried.map(cloneCarried), extra: cloneExtra(extra) ?? {} }),\n        restore(s) {\n            if (!s || !Array.isArray(s.cards))\n                throw new TypeError(\"Deck.restore expects { cards: [...] }\");\n            cards = s.cards.map((c) => {\n                if (!c || typeof c.kind !== \"string\" || !c.kind)\n                    throw new TypeError(\"Deck.restore: every card needs a non-empty string kind\");\n                return make(c);\n            });\n            carried = (s.carried ?? []).map(cloneCarried);\n            extra = cloneExtra(s.extra) ?? {};\n            index = clampIndex(s.index ?? 0, cards.length);\n            emit({ type: \"reset\" });\n            return cards.map((c) => c.id);\n        },\n        clear() {\n            cards = [];\n            carried = [];\n            extra = {};\n            index = 0;\n            emit({ type: \"reset\" });\n        },\n        add(card, opts) {\n            if (!card || typeof card.kind !== \"string\" || !card.kind)\n                throw new TypeError(\"Deck.add: card needs a non-empty string kind\");\n            const c = make(card);\n            cards.push(c);\n            if (opts?.select ?? true)\n                index = cards.length - 1;\n            emit({ type: \"cards\" });\n            return c.id;\n        },\n        remove(id) {\n            const i = deck.indexOf(id);\n            if (i < 0)\n                return;\n            cards.splice(i, 1);\n            // \u5220\u7684\u5728\u5F53\u524D\u4E4B\u524D \u2192 \u5F53\u524D\u90A3\u5F20\u5361\u5F80\u524D\u632A\u4E86\u4E00\u4F4D\uFF0Cindex \u8DDF\u7740\u51CF\uFF1B\u5220\u7684\u5C31\u662F\u5F53\u524D \u2192 \u505C\u5728\u539F\u4F4D\uFF08\u770B\u4E0B\u4E00\u5F20\uFF09\uFF0C\u5230\u5C3E\u5219\u9000\u4E00\u683C\u3002\n            if (i < index)\n                index -= 1;\n            index = clampIndex(index, cards.length);\n            emit({ type: \"cards\" });\n        },\n        move(id, toIndex) {\n            const from = deck.indexOf(id);\n            if (from < 0)\n                return;\n            const to = clampIndex(toIndex, cards.length);\n            if (to === from)\n                return;\n            const viewing = cards[index]?.id ?? null;\n            const [c] = cards.splice(from, 1);\n            cards.splice(to, 0, c);\n            if (viewing)\n                index = deck.indexOf(viewing);\n            emit({ type: \"cards\" });\n        },\n        select(i) {\n            const next = clampIndex(i, cards.length);\n            if (next === index)\n                return;\n            index = next;\n            emit({ type: \"view\" });\n        },\n        setView(id, vp) {\n            const c = deck.get(id);\n            const v = cloneView(vp);\n            if (!c || !v)\n                return;\n            const o = c.vp;\n            if (o && o.tx === v.tx && o.ty === v.ty && o.scale === v.scale && o.rot === v.rot)\n                return;\n            c.vp = v;\n            emit({ type: \"view\" });\n        },\n        setPlay(id, play) {\n            const c = deck.get(id);\n            const p = clonePlay(play);\n            if (!c || !p)\n                return;\n            if (c.play && c.play.t === p.t && c.play.loop === p.loop && c.play.fps === p.fps)\n                return;\n            c.play = p;\n            emit({ type: \"view\" });\n        },\n        setRam(id, on) {\n            const c = deck.get(id);\n            if (!c)\n                return;\n            if (on) {\n                if (c.ram)\n                    return;\n                c.ram = { bytes: c.bytes?.size ?? 0 };\n            }\n            else {\n                if (!c.ram || !c.bytes)\n                    return;\n                c.ram = null;\n            }\n            emit({ type: \"cards\" });\n        },\n        fill(id, bytes, mime) {\n            const c = deck.get(id);\n            if (!c || !c.ram)\n                return;\n            c.bytes = bytes;\n            if (mime)\n                c.mime = mime;\n            emit({ type: \"view\" });\n        },\n        setTarget(id, target) {\n            const c = deck.get(id);\n            if (!c || c.target === target)\n                return;\n            c.target = target;\n            emit({ type: \"cards\" });\n            emit({ type: \"invalidate\", id });\n        },\n        invalidate(id) {\n            if (deck.indexOf(id) < 0)\n                return;\n            emit({ type: \"invalidate\", id });\n        },\n        onChange(fn) {\n            listeners.add(fn);\n            return () => { listeners.delete(fn); };\n        },\n    };\n    return deck;\n}\n", "/** 0.5.0\uFF1A\u6309\u79CD\u7C7B\u7684\u9ED8\u8BA4\u5B58\u6CD5\u3002**\u97F3\u9891 / \u89C6\u9891\u9ED8\u8BA4\u300C\u53EA\u653E\u5185\u5B58\u300D\uFF08\u5F53\u6B21\u6709\u6548\uFF09**\uFF0C\u56FE\u7247 / \u6587\u5B57\u9ED8\u8BA4\u968F\u6587\u6863\u4FDD\u5B58\u3002\n *  user 2026-10-21\u300C\u97F3\u89C6\u9891\u5E94\u8BE5\u662F\u5F53\u6B64\u6709\u6548\uFF0C\u540E\u6765\u5E94\u8BE5\u62CD\u4E86\u300D\uFF1B2026-10-09\u300C\u80FD\u4E0D\u80FD\u52A0 RAM only\uFF0C\u5C31\u662F\u4E0D\u843D\u76D8\uFF0C\u6BCF\u6B21\u91CD\u65B0\u4E0A\u4F20\uFF0C\u8FD9\u4E2A\u975E\u5E38\u6709\u7528\uFF01\uFF01\uFF01\u300D\u3002\u5BBF\u4E3B\u53EF\u6309\u79CD\u7C7B\u8986\u76D6\uFF08RefImportOptions.defaultRam\uFF09\u3002 */\nexport const DEFAULT_RAM = { image: false, text: false, audio: true, video: true };\n/** \u770B mime\uFF08\u518D\u770B\u6269\u5C55\u540D\uFF09\u662F\u54EA\u79CD\u5361\uFF1B\u8BA4\u4E0D\u51FA = null\u3002 */\nexport function sniffKind(f) {\n    const t = (f.type || \"\").toLowerCase(), n = (f.name || \"\").toLowerCase();\n    if (t.startsWith(\"image/\"))\n        return \"image\";\n    if (t.startsWith(\"audio/\"))\n        return \"audio\";\n    if (t.startsWith(\"video/\"))\n        return \"video\";\n    if (t.startsWith(\"text/\") || /\\.(txt|md)$/.test(n))\n        return \"text\";\n    if (/\\.(mp3|m4a|wav|flac|ogg|opus|aac|weba)$/.test(n))\n        return \"audio\";\n    if (/\\.(png|jpe?g|webp|gif)$/.test(n))\n        return \"image\";\n    if (/\\.(mp4|webm|mov)$/.test(n))\n        return \"video\";\n    return null;\n}\n/** \u4E00\u4E2A\u4E00\u4E2A\u8FDB\u724C\u7EC4\uFF08\u987A\u5E8F = \u7ED9\u7684\u987A\u5E8F\uFF09\uFF1B\u6BCF\u5F20\u95EE\u4E0D\u95EE\u3001\u538B\u4E0D\u538B\u6309\u4E0A\u9762\u7684\u89C4\u77E9\u3002\u4E0D\u629B\uFF1A\u6BCF\u4E2A\u6587\u4EF6\u7684\u7ED3\u679C\u5199\u5728 added / skipped \u91CC\uFF0C\u8C03\u7528\u65B9\u5982\u5B9E\u8BF4\u3002 */\nexport async function importIntoDeck(deck, files, o) {\n    const out = { added: [], filled: [], skipped: [], notes: [] };\n    for (const f of files) {\n        const name = f.name ?? \"\", kind = sniffKind(f);\n        if (!kind || !o.kinds.includes(kind)) {\n            out.skipped.push({ name, why: \"unsupported\" });\n            continue;\n        }\n        // \u300C\u53EA\u653E\u5185\u5B58\u300D\u7684\u7A7A\u4F4D\uFF1A\u540C\u79CD\u7C7B\u3001\u540C\u540D = \u8865\u56DE\u539F\u4F4D\uFF08\u4E0D\u95EE\u3001\u4E0D\u65B0\u52A0\uFF1B\u4F4D\u7F6E / \u64AD\u653E\u4F4D\u7F6E / \u5FAA\u73AF\u90FD\u8FD8\u5728\uFF09\n        const hole = deck.cards().find((c) => c.ram && !c.bytes && c.kind === kind && c.name === name);\n        if (hole) {\n            deck.fill(hole.id, f, f.type || undefined);\n            deck.select(deck.indexOf(hole.id));\n            out.filled.push(hole);\n            continue;\n        }\n        try {\n            // \u9ED8\u8BA4\u5B58\u6CD5\u6309\u79CD\u7C7B\uFF080.5.0\uFF1A\u97F3\u89C6\u9891\u9ED8\u8BA4\u53EA\u653E\u5185\u5B58\uFF09\uFF1B\u95EE\u4E86 = \u7528\u6237\u7684\u9009\u62E9\u8BF4\u4E86\u7B97\uFF08keep / compress \u90FD\u662F\u300C\u5B58\u8FDB\u6587\u6863\u300D\uFF09\n            const ramDefault = o.defaultRam?.[kind] ?? DEFAULT_RAM[kind];\n            let blob = f, mime = f.type || \"\", ram = ramDefault;\n            const canCompress = !!o.transcoder?.kinds.includes(kind), limit = o.askAbove?.[kind];\n            if (o.ask && limit !== undefined && f.size > limit) {\n                const estimate = canCompress && o.transcoder?.estimate ? await o.transcoder.estimate(kind, f).catch(() => null) : null;\n                const choice = await o.ask({ name, kind, bytes: f.size, estimate, canCompress, suggestRam: ramDefault || (o.ramAbove !== undefined && f.size > o.ramAbove) });\n                if (choice === \"cancel\") {\n                    out.skipped.push({ name, why: \"cancelled\" });\n                    continue;\n                }\n                ram = choice === \"ram\";\n                if (choice === \"compress\" && canCompress) {\n                    const r = await o.transcoder.encode(kind, f);\n                    blob = r.blob;\n                    mime = r.mime;\n                    if (r.note)\n                        out.notes.push(`${name}: ${r.note}`);\n                }\n            }\n            if (kind === \"text\" && !mime)\n                mime = /\\.md$/i.test(name) ? \"text/markdown\" : \"text/plain\";\n            const id = deck.add({ kind, bytes: blob, mime, name, ...(ram ? { ram: { bytes: blob.size } } : {}) });\n            const c = deck.cards().find((x) => x.id === id);\n            if (c)\n                out.added.push(c);\n        }\n        catch (e) {\n            out.skipped.push({ name, why: \"failed\", message: String(e?.message ?? e) });\n        }\n    }\n    return out;\n}\n", "// <wp-reference-window> \u2014\u2014 \u53C2\u8003\u56FE\u6D6E\u52A8\u5C0F\u7A97\uFF0C\u5BB6\u65CF web component \u7EA6\u5B9A\u8BD5\u70B9\uFF08C9\uFF09\u3002\n// \u7EA6\u5B9A\u5168\u6587\u89C1 ai-docs/20260810-family-web-component-convention.md\u3002\u8981\u70B9\uFF1A\n//   - \u7EC4\u4EF6\u81EA\u5E26 chrome\uFF08shadow DOM\uFF1A\u6837\u5F0F/\u56FE\u6807/\u624B\u52BF\uFF09\uFF0C\u5BBF\u4E3B store \u96F6\u77E5\u8BC6\u2014\u2014\u4E0D import desk/i18n/backend\u3002\n//   - \u5165\u5411 = \u5C5E\u6027/property \u4E0B\u704C\uFF08**\u7A0B\u5E8F\u6027 set \u4E0D\u53D1\u4E8B\u4EF6**\uFF0C\u540C\u539F\u751F <input>.value \u8BED\u4E49\uFF09\uFF1B\n//     \u51FA\u5411 = CustomEvent\uFF08\u53EA\u6709**\u7528\u6237\u4EA4\u4E92**\u53D1\uFF1Apan/pinch/wheel/\u62D6\u7A97/resize/\u83DC\u5355/\u7FFB\u9875/\u5220\u9664/\u5438\u8272\uFF09\u3002\n//     \u5BBF\u4E3B\u5BF9\u56DE\u58F0\u4E8B\u4EF6\u505A\u503C\u6BD4\u8F83\uFF08RO \u5728\u7A0B\u5E8F\u6027\u6539\u52A8\u540E\u4E5F\u4F1A fire\uFF09\u2014\u2014\u89C1 side-windows.ts \u9002\u914D\u5C42\u3002\n//   - \u4E3B\u9898 = CSS \u53D8\u91CF\u7A7F\u900F\uFF08--bg/--ink/--line/--radius/--shadow/--z-window/--void\uFF0C\n//     \u5168\u5E26 fallback\uFF0C\u88F8\u6302\u4E5F\u80FD\u770B\uFF09\uFF1B\u6587\u6848 = slot\uFF08empty\uFF0C\u5BBF\u4E3B light DOM \u8D70\u81EA\u5BB6 i18n\uFF09+ labels property\u3002\n//   - \u56FE\u6807\u70E4\u8FDB shadow\uFF08<use href=\"#id\"> \u4E0D\u7A7F shadow \u8FB9\u754C\uFF09\uFF0C\u6E90=\u5BB6\u65CF sprite\uFF0820260708 SVG Icons\uFF09\uFF0C\n//     \u5BF9\u8D26 id\uFF1Afolder / cloud / picture-in-picture / x / new(\uFF0B) / paste / trash-can\uFF08\u5E93\u539F\u51E0\u4F55\u70E4\u5165\uFF09\uFF1B\n//     \u5E93\u7F3A\u7684\u4E24\u4EF6 = chips \u88F8 chevron \u5DE6\u53F3 + 1:1 \u50CF\u7D20\uFF0Cstopgap \u81EA\u7ED8\uFF0C2026-08-30 \u767B\u8BB0\u8BE5\u4ED3 TODO.md \u5F85\u753B\u3002\n//   - live \u955C\u50CF\u7684**\u5408\u6210\u77E5\u8BC6\u5728\u5BBF\u4E3B**\uFF08backend/doc-render\uFF09\uFF1A\u5BBF\u4E3B set \u4E00\u6B21 liveProvider \u7AEF\u53E3\u3002\n//\n// \u2550\u2550 0830 \u6574\u6539\u6279\uFF08spec=ai-docs/20260830-reference-window-rework-spec.md\uFF0Cuser \u9010\u6761\u62CD\u677F\uFF09\u2550\u2550\n//   borderless\uFF1A\u6807\u9898\u680F\u9000\u5F79\uFF1B\u5E38\u9A7B\u4EF6\u53EA\u5269 \uFF0B\uFF08\u83DC\u5355+\u62D6\u628A\uFF09/ \u89D2 grip / N>1 \u65F6 \u2039 \u203A chip\uFF08\u95F2\u7F6E\u6DE1\u51FA\uFF09\u3002\n//   \u591A\u53C2\u8003\uFF1A\u5355\u7A97\u7FFB\u9875\u6A21\u578B\uFF08items[]\uFF0C\u6BCF\u9879\u81EA\u5E26 vp\uFF1Blive=\u5176\u4E2D\u4E00\u9875\uFF09\u3002\n//   \u957F\u6309=\u5438\u8272\uFF08\u6052\u5F00\uFF0C\u5438\u8272\u94AE/\u5F00\u5173\u95E8\u9000\u5F79\u2014\u2014\u7A97\u5185\u4E0D\u80FD\u753B\uFF0C\u957F\u6309\u65E0\u6B67\u4E49\uFF09\uFF1B\u53CC\u51FB=\u9002\u5E94\uFF08\u663E\u5F0F\u94AE\u9000\u5F79\uFF09\u3002\n//   \u653E\u5927 nearest\uFF08scale\u22652 \u5173 smoothing\uFF0C\u50CF\u7D20\u753B friendly\uFF09\uFF1B\u5E95=void+\u70B9\u9635\uFF08\u5C4F\u5E55\u7A7A\u95F4\uFF0C\u5BF9\u9F50\u4E3B\u753B\u5E03\uFF09\u3002\n//\n// \u624B\u52BF\u6570\u5B66\u4ECD\u8D70 common/pointer-gesture\uFF08\u4E0E\u4E3B\u753B\u5E03\u540C\u4E00\u5957\u4E09\u89D2\uFF09\u3002\n//\n// \u2550\u2550 2026-09-29 \u62BD\u5E93\uFF08edited by Claude Fable 5.1\uFF09\u2550\u2550\n//   \u672C\u6587\u4EF6\u4ECE WeebPaint v0.14.20 src/frontend/reference-window.ts \u539F\u6837\u6284\u5165\uFF0C\u968F\u540E\u628A\u300C\u90A3\u4E00\u53E0\u5361\u300D\u62C6\u8FDB\u4E86\n//   \u724C\u7EC4\u6A21\u578B\uFF08./deck/deck.ts\uFF0C\u96F6 DOM\uFF09\u3002\u672C\u7EC4\u4EF6 = \u724C\u7EC4\u7684\u9ED8\u8BA4\u89C6\u56FE\uFF1A\u5361\u7247 / \u987A\u5E8F / \u5F53\u524D\u9875 / \u6BCF\u5361\u89C6\u56FE\u72B6\u6001\u5F52\u724C\u7EC4\uFF0C\n//   \u89E3\u597D\u7684\u4F4D\u56FE\u3001\u753B\u5E03\u5C0F\u7A97\u7684\u5E27\u3001\u624B\u52BF\u548C gizmo \u5F52\u8FD9\u91CC\u3002\u5BF9\u5916\u7684\u65B9\u6CD5\u548C\u4E8B\u4EF6\u4FDD\u6301\u539F\u6837\uFF08setItems / addImage / \u2026\uFF09\uFF0C\n//   \u5B83\u4EEC\u73B0\u5728\u662F\u724C\u7EC4\u4E4B\u4E0A\u7684\u8584\u5305\u88C5\uFF1B\u5BBF\u4E3B\u4E5F\u53EF\u4EE5\u76F4\u63A5\u7528 .deck\u3002\u4E0A\u9762\u6CE8\u91CA\u91CC\u7684 ai-docs \u8DEF\u5F84\u90FD\u6307 WeebPaint \u4ED3\u3002\n// \u2550\u2550 0.3.0\uFF1A\u6587\u5B57\u5361 + \u94FE\u63A5\uFF08user 2026-09-29\u300Creference window\u80FD\u4E0D\u80FDlink\u56FE\u7247\u9875\u548C\u6587\u5B57\u9875\u2026\u4E00\u4E2A\u7ACB\u7ED8\u53EA\u7528\u5B58\u4E00\u6B21\u300D\uFF09\u2550\u2550\n//   \u6587\u5B57\u5361 = \u53EA\u8BFB\u3001\u53EF\u9009\u4E2D\u3001\u53EF\u6EDA\u52A8\u7684\u4E00\u5C42 DOM\uFF08.text\uFF09\uFF1Avp.scale = \u5B57\u53F7\u500D\u7387\uFF0Cvp.ty = \u6EDA\u52A8\u4F4D\u7F6E\uFF1B\u4E0D\u8D70\u753B\u5E03\u3002\n//   \u94FE\u63A5\u5361 = bytes \u4E3A\u7A7A\u4F46\u6709 target \u7684\u975E live \u5361\uFF1A\u5185\u5BB9\u7531\u5BBF\u4E3B\u7684 linkProvider(target, kind) \u6309\u9700\u7ED9\uFF08\u4E66\u91CC\u7684\u67D0\u4E00\u9875\u3001\n//   \u67D0\u4E2A\u56FE\u5C42\u2026\uFF09\uFF0C\u53EA\u663E\u793A\u4E0D\u5B58\uFF1B\u5BBF\u4E3B deck.invalidate \u5C31\u91CD\u53D6\uFF1B\u7ED9\u4E0D\u51FA\u6765 \u2192 \u5361\u4E0A\u5982\u5B9E\u5199\u300C\u5185\u5BB9\u4E0D\u53EF\u7528\u300D\u3002\n// \u2550\u2550 0.5.0\uFF1A\u89C6\u9891\u5361\uFF08user 2026-09-30\u300C\u89C6\u9891\u4E00\u5B9A\u9700\u8981\u652F\u6301\u6309\u5E27\u64AD\u653E\uFF0C\u6309\u5E27rewind\u600E\u4E48\u529E\u5462\u300D\u300C\u6211\u8D2A\u4E00\u4E0B\uFF0C\u6253\u5F00\u4E00\u4E2Aanime\uFF0C\u4E00\u5E27\u5E27\u7167\u7740\u753B\u300D\uFF1B\n//   2026-10-21\u300C\u97F3\u89C6\u9891\u5E94\u8BE5\u662F\u5F53\u6B64\u6709\u6548\u300D\uFF1BClaude Fable 5.1 lane 7\uFF09\u2550\u2550\n//   \u89C6\u9891**\u753B\u5728\u540C\u4E00\u5757 canvas \u4E0A**\uFF08<video> \u662F\u5408\u6CD5\u7684 drawImage \u6E90\uFF09\uFF1A\u5E73\u79FB / \u634F\u5408 / \u65CB\u8F6C / 1:1 / \u957F\u6309\u5438\u8272\u5168\u548C\u56FE\u7247\u5361\u4E00\u5957\uFF0C\u96F6\u65B0\u4EE3\u7801\uFF1B\n//   <video> \u672C\u8EAB\u85CF\u5728 shadow \u91CC\uFF081 px\u3001clip-path \u88C1\u7A7A\uFF0C\u4ECD\u7B97\u300C\u53EF\u89C1\u300D\u2014\u2014Safari \u5BF9\u4E0D\u5728\u753B\u9762\u91CC\u7684 video \u4F1A\u505C\u66F4\u5E27\uFF09\u3002\u5361\u4E0A\u53EA\u591A\u4E00\u6761\u5E95\u90E8\u63A7\u5236\u6761\uFF1A\n//   \u4E0A\u4E00\u5E27 / \u64AD\u653E / \u4E0B\u4E00\u5E27 / \u8FDB\u5EA6 / \u65F6\u95F4\u3002**\u9010\u5E27**\uFF1A\u6D4F\u89C8\u5668\u6CA1\u6709\u6309\u5E27 API\uFF0C\u6B63\u89E3\u662F\u2014\u2014\n//   \u00B7 \u4E0B\u4E00\u5E27\uFF1A\u77E5\u9053\u5E27\u957F\u5C31 seek \u5230\u300C\u8FD9\u4E00\u5E27\u7684\u8D77\u70B9 + 1.5 \u5E27\u300D\uFF08\u843D\u5728\u4E0B\u4E00\u5E27\u6B63\u4E2D\uFF0C\u7A33\uFF09\uFF1B\u8FD8\u4E0D\u77E5\u9053\u5E27\u957F\u65F6**\u9759\u97F3\u64AD\u5230\u4E0B\u4E00\u5E27\u5C31\u505C**\uFF08requestVideoFrameCallback\n//     \u62A5\u51FA\u4E0B\u4E00\u5E27\u7684 mediaTime \u2192 \u6682\u505C \u2192 \u7CBE\u786E seek \u56DE\u90A3\u4E00\u5E27\uFF09\uFF0C\u987A\u624B\u91CF\u51FA\u5E27\u957F\uFF1B\n//   \u00B7 \u4E0A\u4E00\u5E27\uFF1Aseek \u5230\u300C\u8FD9\u4E00\u5E27\u7684\u8D77\u70B9 \u2212 0.5 \u5E27\u300D\uFF08\u843D\u5728\u4E0A\u4E00\u5E27\u6B63\u4E2D\uFF09\uFF1B\n//   \u00B7 \u5E27\u957F = \u8FDE\u7EED\u64AD\u653E\u65F6\u76F8\u90BB\u4E24\u5E27 mediaTime \u4E4B\u5DEE\u7684\u6700\u5C0F\u503C\uFF08\u5E27\u6389\u4E86\u5DEE\u4F1A\u53D8\u5927\uFF0C\u53D6\u6700\u5C0F = \u771F\u5E27\u957F\uFF09\uFF0C\u8BB0\u8FDB Card.play.fps\uFF08\u89C6\u56FE\u6001\uFF0C\u4E0D\u6807\u810F\uFF09\uFF0C\u4E0B\u6B21\u5F00\u76D8\u76F4\u63A5\u7528\uFF1B\n//   \u00B7 \u6CA1\u6709 requestVideoFrameCallback \u7684\u6D4F\u89C8\u5668\uFF08\u8001 Firefox\uFF09\uFF1A\u6309 play.fps \u6216 24 \u4F30\uFF0C\u65F6\u95F4\u680F\u5982\u5B9E\u4E0D\u663E\u793A\u5E27\u53F7\u3002\n//   \u7FFB\u5230\u522B\u7684\u5361 = \u6682\u505C\uFF08\u753B\u9762\u4E0D\u5728\u773C\u524D\uFF1B\u97F3\u9891\u90A3\u5957\u300C\u4E0D\u505C\u300D\u662F\u7ED9 BGM \u7684\uFF0C\u4E0D\u9002\u7528\uFF09\uFF1B\u7A7A\u683C = \u64AD\u653E / \u6682\u505C\uFF0C\u2190 \u2192 \u3001, . = \u4E0A\u4E00\u5E27 / \u4E0B\u4E00\u5E27\uFF08\u7A97\u6709\u7126\u70B9\u65F6\uFF09\u3002\nimport { pinchScaleRot, solveAnchorTranslation } from \"./pointer-gesture.js\";\nimport { createDeck } from \"./deck/deck.js\";\nimport { importIntoDeck } from \"./deck/import.js\";\n/** \u5361\u4E0A\u5199\u7684\u5927\u5C0F\uFF08\u300C3.2 MB\u300D\uFF09\u3002 */\nfunction fmtBytes(n) { return n >= 1048576 ? `${(n / 1048576).toFixed(1)} MB` : `${Math.max(1, Math.round(n / 1024))} KB`; }\nconst REF_LONG_PRESS_MS = 450; // \u957F\u6309\u5438\u8272\u5EF6\u8FDF\uFF08\u5BF9\u9F50 input.ts\uFF09\nconst REF_LONG_PRESS_CANCEL_SQ = 64; // 8px\u00B2\uFF1A\u957F\u6309\u671F\u95F4\u79FB\u52A8\u8D85\u6B64 \u2192 \u53D6\u6D88\uFF0C\u56DE pan\nconst LIVE_THROTTLE_MS = 300; // S9\uFF1Alive \u5168\u91CF\u5408\u6210\u8282\u6D41\uFF1B\u5230\u671F timer \u8865\u5E27\u6536\u5C3E\u3002\u8FD9\u662F\u7F3A\u7701\u503C\uFF0C\u5BBF\u4E3B\u6309\u81EA\u5DF1\u7684\u51FA\u5E27\u6210\u672C\u6539 liveMinIntervalMs\nconst IDLE_DIM_MS = 2500; // \u95F2\u7F6E\u6DE1\u51FA\uFF08.35 \u900F\u660E\u5EA6\uFF09\nconst NEAREST_MIN_SCALE = 2; // \u653E\u5927 nearest \u9608\u503C\uFF08\u50CF\u7D20\u753B friendly\uFF1B\u4E0E\u7F16\u8F91\u5668\u624B\u611F\u5BF9\u9F50\u53EF\u8C03\uFF09\n// \u7F29\u653E\u62A4\u680F\uFF08user 0830\uFF09\uFF1A\u653E\u5927\u9876 50\u00D7\uFF1B\u7F29\u5C0F\u53EA\u62A4\u5230\u300C\u773C\u775B\u80FD\u770B\u5230\u300D\u2014\u2014\u957F\u8FB9\u663E\u793A \u226516px \u5373\u53EF\n//   \uFF08user \u4F1A\u6545\u610F\u7F29\u5F88\u5C0F\u770B\u50CF\u7D20\u56FE\u6807\u6548\u679C\uFF0C\u522B\u62A4\u8FC7\u5934\uFF09\u3002\u5E73\u79FB\u62A4\u680F = \u56FE\u7684 bbox \u4E0E\u753B\u5E03\u4FDD \u226524px \u91CD\u53E0\uFF08\u627E\u5F97\u56DE\u6765\uFF09\u3002\nconst MAX_SCALE = 50;\nconst MIN_VISIBLE_PX = 16;\nconst PAN_KEEP_PX = 24;\n// WeebPaint \u5E03\u5C40\u4E8B\u5B9E\uFF08\u7EC4\u4EF6\u81EA\u6709\u9ED8\u8BA4\uFF1B\u5BBF\u4E3B\u5E03\u5C40\u5927\u6539\u65F6\u540C\u6B65\u8FD9\u91CC\uFF09\uFF1A\nconst SPAWN_LEFT = 112, SPAWN_TOP = 104; // v112/v267\uFF1A\u9ED8\u8BA4\u907F\u5F00 topbar(56)+\u5DE6\u680F(80)+iPad \u72B6\u6001\u680F\nconst CLAMP_MIN_LEFT = 96, CLAMP_MIN_TOP = 96; // v268b\uFF1A\u65E7\u6301\u4E45\u5316\u4F4D\u7F6E\u94B3\u8FDB\u5B89\u5168\u533A\nconst DRAG_TOP_FLOOR = 60; // \u62D6\u7A97 top \u5730\u677F=\u51FA\u8840\u533A\uFF08v0.4.11\uFF0C\u540C layers-panel\uFF09\nconst MIN_EDGE = 96; // \u4E1D\u8584\uFF1A\u6700\u5C0F\u8FB9\uFF08user 0830\u300C\u6700\u5C0F\u5BBD\u5EA6\u4E5F\u9700\u8981\u80FD\u975E\u5E38\u5C0F\u300D\uFF09\nconst TEXT_SCALE_MIN = 0.5, TEXT_SCALE_MAX = 4; // \u6587\u5B57\u5361\u5B57\u53F7\u500D\u7387\u754C\u9650\uFF08\u57FA\u51C6 13px\uFF09\n// \u2550\u2550 \u56FE\u6807\uFF1A\u96F6\u624B\u6284\uFF08user 0830\u300Csvg \u98CE\u683C\u4ECE svg icons \u53D6\u4F5C SSoT\uFF0C\u4E0D\u8981\u5728\u522B\u5904\u4E71\u585E\u300D\uFF09\u2550\u2550\n// <use href=\"#id\"> \u7A7F\u4E0D\u8FC7 shadow \u8FB9\u754C\uFF0C\u6B64\u524D\u7684\u505A\u6CD5\u662F\u628A\u51E0\u4F55\u70E4\u8FDB\u7EC4\u4EF6\u2014\u2014\u4E00\u70E4\u5C31\u6F02\uFF08\u624B\u753B chevron/1:1 \u4E8B\u6545\uFF09\u3002\n// \u73B0\u5728\uFF1A\u6784\u9020\u65F6\u4ECE\u5BBF\u4E3B\u6587\u6863\u7684\u5185\u8054 sprite\uFF08assets/icons.svg + icons-local.svg\uFF0C\u7686\u56FE\u6807\u5E93\u63D0\u53D6\u7269/\u70E4\u5B57 stopgap\uFF09\n// **clone `<symbol>` \u5185\u5BB9**\u8FDB shadow\uFF1B\u6587\u6863\u91CC\u6CA1\u8FD9\u4E2A id \u2192 \u6309\u5E93\u534F\u8BAE\u51FA\u865A\u7EBF\u5360\u4F4D\uFF08icon-missing \u540C\u5F62\uFF09\uFF0C\n// \u4E14 test/reference-icons.test.mjs \u9010 id \u5BF9 index.html \u5B88\u7740\u2014\u2014\u7EC4\u4EF6\u91CC\u4E0D\u5B58\u5728\u4EFB\u4F55\u81EA\u7ED8\u51E0\u4F55\u3002\nexport const REF_ICON_IDS = {\n    folder: \"folder\", paste: \"paste\", cloud: \"cloud\", pip: \"picture-in-picture\", oneToOne: \"one-to-one\",\n    trash: \"trash-can\", x: \"x\", plus: \"new\", prev: \"chevron-left\", next: \"chevron-right\",\n    // 2026-09-29\uFF1A\u632A\u52A8\u987A\u5E8F / \u8DF3\u8F6C\u5217\u8868\u3002\u90FD\u662F\u5E93\u91CC\u73B0\u6210\u7684\u56FE\u6807\uFF08\u5E26\u6746\u7684\u5DE6\u53F3\u7BAD\u5934\u3001\u52FE\uFF09\uFF0C\u6CA1\u6709\u65B0\u753B\u3002\n    earlier: \"back\", later: \"forward\", current: \"check\",\n    // 0.4.0\uFF082026-10-09\uFF09\uFF1A\u97F3\u9891\u5361\u7684\u64AD\u653E / \u6682\u505C\u3002\u56FE\u6807\u5E93\u91CC\u73B0\u6210\u7684\u3002\n    play: \"play\", pause: \"pause\",\n    // 0.5.0\uFF082026-10-21\uFF09\uFF1A\u89C6\u9891\u5361\u7684\u4E0A\u4E00\u5E27 / \u4E0B\u4E00\u5E27 = \u56FE\u6807\u5E93\u73B0\u6210\u7684 \u23EE \u23ED\uFF08skip-prev / skip-next\uFF0C20260821 \u5165\u5E93\uFF09\u3002\u6CA1\u6709\u65B0\u753B\u3002\n    prevFrame: \"skip-prev\", nextFrame: \"skip-next\",\n};\nfunction iconMarkup(id) {\n    const sym = (typeof document !== \"undefined\") ? document.querySelector(`svg symbol[id=\"${id}\"]`) : null;\n    if (!sym) {\n        // icon-missing \u5360\u4F4D\uFF08\u5E93\u534F\u8BAE\u540C\u5F62\uFF1A\u865A\u7EBF\u65B9\u6846\uFF09\uFF0C\u4E0D\u9759\u9ED8\u7A7A\u767D\n        return `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-dasharray=\"2 2\" aria-hidden=\"true\" data-icon-missing=\"${id}\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\"/></svg>`;\n    }\n    const attrs = [\"viewBox\", \"fill\", \"stroke\", \"stroke-width\", \"stroke-linecap\", \"stroke-linejoin\"]\n        .map((a) => { const v = sym.getAttribute(a); return v != null ? `${a}=\"${v}\"` : \"\"; })\n        .filter(Boolean).join(\" \");\n    return `<svg ${attrs} aria-hidden=\"true\" data-icon=\"${id}\">${sym.innerHTML}</svg>`;\n}\n// chrome \u5168 overlay\uFF08borderless\uFF09\uFF1A\u7A97\u4F53\u53EA\u6709 1px \u8FB9\u6846+\u9634\u5F71\u5F53\u8FB9\u754C affordance\uFF08\u65E0\u8FB9\u754C\u5728\u540C\u6B3E\u70B9\u9635\u5E95\u4E0A\n// \u6839\u672C\u770B\u4E0D\u89C1\u7A97\u5728\u54EA\uFF09\uFF0C\u5185\u5BB9\u6EE1\u94FA\u3002\u6A21\u677F\u5728\u6784\u9020\u65F6\u523B\u751F\u6210\uFF08\u56FE\u6807\u4ECE\u5BBF\u4E3B sprite clone\uFF0C\u89C1 iconMarkup\uFF09\u3002\nfunction buildTemplate() {\n    return `<style>\n:host {\n  position: fixed;\n  top: 60px; left: 16px;\n  display: block;\n  width: 280px; height: 320px;\n  min-width: ${MIN_EDGE}px; min-height: ${MIN_EDGE}px;\n  resize: both;              /* \u684C\u9762\u9F20\u6807\u62D6\u53F3\u4E0B\u89D2\uFF1Btouch \u8D70 .grip */\n  overflow: hidden;\n  border: 1px solid var(--line, #3c4043);\n  border-radius: var(--radius, 10px);\n  outline: none;\n  box-shadow: var(--shadow, 0 8px 24px rgba(0, 0, 0, 0.4));\n  z-index: var(--z-window, 100);\n  -webkit-tap-highlight-color: transparent;\n  font-size: 13px;\n  /* \u5E95 = \u7EAF\u8272 --void\uFF080.3.1\uFF0Cuser 2026-09-30\u300C\u80CC\u666F\u4E5F\u4E0D\u9700\u8981\u52A0\u70B9\uFF0C\u5C31\u7EAF\u8272\u300D\uFF09\u3002\u60F3\u8981\u548C\u81EA\u5DF1\u753B\u5E03\u540C\u6B3E\u70B9\u9635\u7684\u5BBF\u4E3B\n     \uFF08WeebPaint 0830\u300C\u5E95=editor \u753B\u5E03 void \u540C\u6B3E\u300D\uFF09\u5728\u5BBF\u4E3B CSS \u91CC\u5BF9 wp-reference-window \u5199 background-image\u2014\u2014\n     \u5916\u90E8\u6837\u5F0F\u76D6\u5F97\u8FC7 :host\u3002 */\n  background-color: var(--void, #e6e2d6);\n}\n:host(:not([open])) { display: none; }\ncanvas {\n  position: absolute; inset: 0; display: block;\n  width: 100%; height: 100%;\n  touch-action: none; cursor: grab;\n}\ncanvas:active { cursor: grabbing; }\n:host([pick]) canvas, :host([pick]) canvas:active { cursor: crosshair; }\n/* gizmo \u5C3A\u5BF8 = \u5BB6\u65CF\u6D6E\u7A97\u6807\u51C6\u4EF6\uFF08user 0830\u300C\u6309 Layers \u7684\u5927\u5C0F\u6765\u300D\uFF09\uFF1A\u628A\u624B 22\u00D722 \u6EE1\u94FA\uFF08\u540C styles.css\n   .float-panel-resize \u7684\u53CC\u659C\u7EB9\u6E10\u53D8\uFF09\uFF0C\uFF0B 28\uFF0Cchips 14px \u56FE\u6807\u3002 */\n/* \u53F3\u4E0A\u89D2\u4E24\u9897\u5706\u94AE\uFF1A\uFF0B\uFF08\u83DC\u5355\uFF09\u5728\u5DE6\u3001\u00D7\uFF08\u5173\u7A97\uFF09\u5728\u6700\u53F3\u2014\u2014\u5173\u95ED\u4ECE\u83DC\u5355\u91CC\u63D0\u51FA\u6765\uFF082026-09-11 user\u300C\u53C2\u8003\u7A97\u7684\u5173\u95ED\u6309\u94AE\u63D0\u51FA\u6765\u653E\u5728\u2026\u53F3\u8FB9\u3002\u4E0D\u7136\u627E\u4E0D\u5230\u300D\uFF09 */\n.plus, .close {\n  position: absolute; top: 4px; z-index: 3;\n  width: 28px; height: 28px; padding: 0; border: none; border-radius: 50%;\n  display: flex; align-items: center; justify-content: center;\n  background: color-mix(in srgb, var(--bg, #202124) 72%, transparent);\n  color: var(--ink, #e8eaed); cursor: pointer;   /* \u7EAF\u83DC\u5355\u94AE\uFF080830 user\uFF1A\uFF0B\u517C\u62D6\u628A\u5F88\u5947\u602A\uFF0C\u62D6\u5F52\u5DE6\u4E0A\u89D2\u70B9\u9635\u628A\u624B\uFF09 */\n  user-select: none; -webkit-user-select: none;\n  transition: opacity 0.35s;\n}\n.close { right: 4px; }\n.plus { right: 36px; }\n.plus svg, .close svg { width: 16px; height: 16px; pointer-events: none; }\n/* 0.4.4\uFF1A\u4E09\u9897\u5706\u94AE\u52A0\u4E00\u5708\u6DE1\u8FB9\u2014\u2014\u5E95\u8272\u548C\u5361\u7247\u4E00\u6837\u6697\u7684\u65F6\u5019\uFF08KudsRocket \u6587\u5B57\u5361\uFF09\u5706\u94AE\u6574\u4E2A\u770B\u4E0D\u89C1\u3001\u53EA\u5269\u4E2A\u56FE\u6807\uFF0810-18 \u622A\u56FE\u6838\u8FC7\uFF09 */\n.plus, .close, .move .knob { box-shadow: 0 0 0 1px color-mix(in srgb, var(--ink, #e8eaed) 28%, transparent); }\n.plus:hover, .close:hover { background: color-mix(in srgb, var(--bg, #202124) 90%, transparent); }\n/* \u62D6\u52A8\u628A\u624B\uFF08user 0830\u300C\u5DE6\u4E0A\u89D2\u52A0\u4E00\u70B9\u5C0F\u70B9\u4E00\u6837\u7684\u62D6\u52A8\u533A\u57DF\u2026\u4E09\u89D2\u5F62\u5E03\u5C40\uFF0C\u6CA1\u6709\u6309\u94AE\u5F0F\u9AD8\u4EAE\uFF0C\u53C2\u8003 resize\u300D\uFF09\uFF1A\n   \u4E0E\u53F3\u4E0B resize \u628A\u624B\u540C\u5F62\u5236\u540C\u5C3A\u5BF8\u2014\u2014\u70B9\u9635\u88C1\u6210\u5DE6\u4E0A\u4E09\u89D2\u3001\u65E0\u5E95\u65E0\u6846\uFF0C\u53EA\u9760 opacity \u547C\u5438\u3002gizmo \u7EB9\u7406\u975E icon\u3002 */\n/* \u4E24\u628A\u624B\u5728\u6697\u56FE\uFF08\u4E09\u6B21\u5143\u76F8\u7247\uFF09\u4E0A\u770B\u4E0D\u6E05\uFF08user 0830\uFF09\u2192 \u4E0E \uFF0B \u540C\u6B3E\u300C\u534A\u900F\u660E\u4E3B\u9898\u5E95 + \u4E3B\u8272 gizmo\u300D\uFF1A\n   \u5143\u7D20\u672C\u8EAB\u88C1\u6210\u4E09\u89D2\u5F62\u5E95\u677F\uFF08clip-path\uFF09\uFF0C\u7EB9\u7406\u8D70 ::after \u7528 currentColor=--ink\u3002\u6D45\u4E3B\u9898=\u767D\u5E95\u9ED1\u70B9\u3001\u6697\u4E3B\u9898=\u9ED1\u5E95\u767D\u70B9\u3002 */\n/* 0.4.1\uFF08user 2026-10-13\u300C\u53C2\u8003\u7A97\u5DE6\u4E0A\u89D2\u5176\u5B9E\u4E00\u76F4\u6BD4\u8F83\u96BE\u62D6\u300D\uFF09\uFF1A\u53EF\u70B9\u533A\u653E\u5927\u5230 36 px \u900F\u660E\u65B9\u5757\uFF0C\u770B\u5F97\u89C1\u7684\u8FD8\u662F 22 px \u5C0F\u4E09\u89D2\u2014\u2014\u4EBA\u7784\u7740\u4E09\u89D2\u6309\uFF0C\u8FD8\u662F\u70B9\u4E0D\u4E2D\u3002\n   0.4.3\uFF08user 2026-10-18\u300C\u5DE6\u4E0A\u89D2\u90A3\u4E2A\u5F88akward\u5F88\u96BE\u70B9\u7684\u3002\u3002\u3002\u603B\u662F\u70B9\u4E0D\u4E2D\uFF0C\u4F18\u5316\u4E00\u4E0B\uFF0C\u6216\u8005\u5E72\u8106\u6362\u6210\u4E00\u4E2A\u70B9\u4E86\u4E4B\u540E\u53D8\u6210\u56FE\u6807\uFF0C\u62D6\u52A8\u662F\u62D6\u52A8\u7684\u591A\u4E49\u6309\u94AE\u300D\uFF09\uFF1A\n   \u6362\u6210\u548C \uFF0B / \u00D7 \u540C\u6B3E\u7684\u5706\u94AE\uFF0828 px\uFF0C\u534A\u900F\u660E\u4E3B\u9898\u5E95 + \u56FE\u6807\uFF09\uFF0C\u53EF\u70B9\u533A 36 px\uFF08\u89E6\u5C4F 44 px\uFF09\u3002**\u70B9\u4E00\u4E0B = \u7F29\u6210\u5C0F\u56FE\u6807**\uFF08\u5C0F\u56FE\u6807\u5C31\u51FA\u73B0\u5728\u540C\u4E00\u4E2A\u4F4D\u7F6E\u3001\u540C\u4E00\u4E2A\u56FE\u6807\uFF0C\n   \u518D\u70B9\u4E00\u4E0B\u6062\u590D\uFF09\uFF0C**\u6309\u4F4F\u62D6 = \u632A\u7A97**\uFF08\u52A8\u8FC7 4 px \u624D\u7B97\u62D6\uFF09\u3002\u56FE\u6807\u7528\u5C0F\u7A97\u90A3\u4E2A\uFF08= \u6536\u8D77\u540E\u7684\u5C0F\u56FE\u6807\uFF09\uFF0C\u770B\u5F97\u51FA\u300C\u70B9\u4E86\u4F1A\u53D8\u6210\u4EC0\u4E48\u300D\u3002 */\n.move {\n  position: absolute; left: 0; top: 0; width: 36px; height: 36px; z-index: 3;\n  padding: 0; border: none; background: transparent;\n  cursor: grab; touch-action: none; user-select: none; -webkit-user-select: none;\n  color: var(--ink, #e8eaed); opacity: 0.85;\n  transition: opacity 0.35s;\n}\n@media (pointer: coarse) { .move { width: 44px; height: 44px; } }\n.move .knob {\n  position: absolute; left: 4px; top: 4px; width: 28px; height: 28px; border-radius: 50%;\n  display: flex; align-items: center; justify-content: center;\n  background: color-mix(in srgb, var(--bg, #202124) 72%, transparent);\n  pointer-events: none;\n}\n.move .knob svg { width: 16px; height: 16px; }\n.move:hover { opacity: 1; }\n.move:hover .knob { background: color-mix(in srgb, var(--bg, #202124) 90%, transparent); }\n.move:active { cursor: grabbing; }\n/* resize \u628A\u624B\uFF1A\u659C\u7EB9\u6CBF styles.css .float-panel-resize \u5BB6\u65CF\u6807\u51C6\u4EF6\uFF1B19\uFF08user 0830\uFF1A\u89C6\u89C9\u4E0A\u659C\u7EB9\u6BD4\u70B9\u9635\u663E\u5927\uFF0C\u7A0D\u5C0F\u4E00\u70B9\uFF09 */\n.grip {\n  position: absolute; right: 0; bottom: 0; width: 19px; height: 19px;\n  cursor: nwse-resize; touch-action: none; z-index: 2;\n  color: var(--ink, #e8eaed); opacity: 0.85;\n  background: color-mix(in srgb, var(--bg, #202124) 72%, transparent);\n  clip-path: polygon(100% 0, 100% 100%, 0 100%);\n  transition: opacity 0.35s;\n}\n.grip:hover { opacity: 1; }\n/* \u659C\u7EB9\u4F4D\u7F6E\uFF1A\u6807\u51C6\u4EF6\u662F 45\u201352 / 66\u201373%\uFF0C\u4F46\u672C\u628A\u624B\u88C1\u6210\u4E09\u89D2\u540E\u659C\u8FB9\u6B63\u843D\u5728 135\u00B0 \u6E10\u53D8\u7EBF\u7684 50% \u4F4D\u2014\u2014\u7B2C\u4E00\u9053\u7EB9\u4F1A\u88AB\n   \u8170\u65A9\u6210\u7EC6\u4E1D\uFF08user 0830 \u6293\u5230\uFF09\u3002\u6574\u4F53\u5F80\u89D2\u843D\u632A 13%\uFF1A58\u201365 / 79\u201386%\uFF0C\u659C\u8FB9\u5916\u7559 ~2px \u5E95\u677F\u767D\u8FB9\u3002 */\n.grip::after {\n  content: \"\"; position: absolute; inset: 0;\n  background: linear-gradient(135deg,\n    transparent 0 58%, currentColor 58% 65%,\n    transparent 65% 79%, currentColor 79% 86%,\n    transparent 86%);\n}\n.chips {\n  position: absolute; left: 50%; bottom: 4px; transform: translateX(-50%); z-index: 2;\n  display: flex; align-items: center; gap: 2px;\n  background: color-mix(in srgb, var(--bg, #202124) 72%, transparent);\n  border-radius: 12px; padding: 1px 4px;\n  color: var(--ink, #e8eaed);\n  cursor: default;   /* \u8BA1\u6570\u6587\u672C\u4E0D\u51FA I-beam\uFF1B\u6309\u94AE\u5404\u81EA pointer */\n  transition: opacity 0.35s;\n}\n.chips.hidden { display: none; }\n.chip { background: transparent; border: none; color: inherit; padding: 2px; cursor: pointer; display: flex; }\n.chip svg { width: 14px; height: 14px; }\n.chip-count { font-size: 11px; min-width: 26px; text-align: center; color: var(--ink-soft, #9aa0a6); font-family: inherit; justify-content: center; }\n/* gizmo \u663E\u9690\u4E24\u6863\uFF08user 0830\u300C\u9F20\u6807\u79FB\u8D70\u65F6 gizmos \u90FD\u9690\u85CF\u300D\uFF1B\u300C12.12 iPad \u770B\u8D77\u6765\u8FD8\u884C\u4E0D\u5E72\u6270\u300D\u2192 \u89E6\u5C4F\u6863\u7EF4\u6301\uFF09\uFF1A\n   .away = \u80FD\u60AC\u505C\u7684\u8BBE\u5907\u6307\u9488\u79BB\u7A97 \u2192 \u5168\u9690\uFF08\u8FDB\u7A97\u5373\u73B0\uFF09\uFF1B.idle = \u95F2\u7F6E 2.5s \u6DE1\u81F3 .35\uFF08\u89E6\u5C4F\u65E0\u60AC\u505C\u53EA\u6709\u8FD9\u6863\uFF0C\n   \u5168\u9690\u4F1A\u8BA9 chips \u53D8\u76F2\u64CD\u4F5C\uFF09\u3002\u83DC\u5355\u5F39\u5C42\u4E0D\u5728\u5176\u5217\u3002 */\n:host(.idle) .plus, :host(.idle) .close, :host(.idle) .grip, :host(.idle) .chips, :host(.idle) .move { opacity: 0.35; }\n/* 0.4.1 \u6536\u6210\u5C0F\u56FE\u6807\uFF08user 2026-10-09\u300Creference window\u52A0\u4E00\u4E2A\u6700\u5C0F\u5316\uFF08\u53D8\u6210\u4E00\u4E2A\u53EF\u62D6\u52A8\u5C0F\u56FE\u6807\uFF09\u7684\u529F\u80FD\uFF0C\u4EE5\u540E\u8BA9opus\u5F04\u300D\uFF09\uFF1A\n   \u7A97\u7F29\u6210 44 px \u5706\u94AE\uFF08\u5C3A\u5BF8\u7528 !important \u538B\u4F4F style \u91CC\u7684\u5BBD\u9AD8\u2014\u2014\u539F\u6765\u7684\u5BBD\u9AD8\u539F\u6837\u7559\u7740\uFF0C\u6062\u590D\u5C31\u56DE\u53BB\uFF09\uFF1B\u91CC\u9762\u53EA\u5269 .bubble\uFF1A\u62D6 = \u632A\u4F4D\u7F6E\uFF0C\u70B9 = \u6062\u590D\u3002 */\n:host([minimized]) {\n  box-sizing: border-box !important; width: 44px !important; height: 44px !important; min-width: 0 !important; min-height: 0 !important;\n  border-radius: 50% !important; resize: none !important; background-color: color-mix(in srgb, var(--bg, #202124) 85%, transparent);\n}\n:host([minimized]) :is(canvas, .text, .audio, .video, .empty, .move, .plus, .close, .grip, .chips) { display: none !important; }\n.bubble { display: none; }\n:host([minimized]) .bubble {\n  display: flex; position: absolute; inset: 0; z-index: 4; align-items: center; justify-content: center;\n  padding: 0; border: none; border-radius: 50%; background: transparent; color: var(--ink, #e8eaed);\n  cursor: grab; touch-action: none; user-select: none; -webkit-user-select: none;\n}\n:host([minimized]) .bubble:active { cursor: grabbing; }\n.bubble svg { width: 22px; height: 22px; pointer-events: none; }\n:host(.away) .plus, :host(.away) .close, :host(.away) .grip, :host(.away) .chips, :host(.away) .move { opacity: 0; }\n/* \u83DC\u5355\u4E0D\u5728 shadow \u91CC\uFF082026-09-02\uFF09\uFF1A\u6302 body \u8D70 ui/popup-menu\u2014\u2014absolute \u5B50\u8282\u70B9\u4F1A\u88AB :host overflow:hidden \u88C1\u3001\n   \u4E5F\u56F0\u5728 :host \u7684 stacking context \u91CC\u88AB\u522B\u7684\u6D6E\u7A97\u76D6\uFF08\u8001\u9519\u8BEF\u590D\u53D1\u6839\u56E0\uFF09\u3002 */\n/* \u6587\u5B57\u5361\uFF1A\u53EA\u8BFB\u3001\u53EF\u9009\u4E2D\u3001\u53EF\u6EDA\u52A8\u3002\u5355\u6307\u6EDA\u52A8\u4EA4\u7ED9\u6D4F\u89C8\u5668\uFF08touch-action: pan-y\uFF09\uFF0C\u53CC\u6307\u634F\u5408\u8C03\u5B57\u53F7\u7531\u7EC4\u4EF6\u63A5\u3002\n   \u5E95\u8272\u7528\u4E3B\u9898\u5E95\u800C\u4E0D\u662F\u70B9\u9635\uFF1A\u5B57\u8981\u80FD\u8BFB\u3002\u9009\u4E2D\u6587\u5B57\u9700\u8981\u628A\u7126\u70B9\u62FF\u8FC7\u6765 \u2192 data-takes-focus \u653E\u884C\uFF08\u5176\u4F59 gizmo \u4E0D\u62A2\u7126\u70B9\uFF09\u3002 */\n.text {\n  position: absolute; inset: 0; display: none; overflow: auto; z-index: 1;\n  box-sizing: border-box; padding: 36px 12px 30px 12px;   /* 0.4.4\uFF1A\u4E0A\u8FB9\u7559\u51FA\u5706\u94AE\u90A3\u4E00\u6392\uFF084 + 28 px\uFF09\uFF0C\u5B57\u4E0D\u518D\u88AB\u5DE6\u4E0A\u89D2\u5706\u94AE / \uFF0B / \u00D7 \u76D6\u4F4F */\n  color: var(--ink, #e8eaed);\n  background: color-mix(in srgb, var(--bg, #202124) 94%, transparent);\n  font-size: calc(13px * var(--ref-text-scale, 1)); line-height: 1.55;\n  white-space: pre-wrap; overflow-wrap: anywhere;\n  user-select: text; -webkit-user-select: text;\n  touch-action: pan-y; cursor: text;\n  -webkit-overflow-scrolling: touch;\n}\n.text.shown { display: block; }\n.text.missing { color: var(--ink-soft, #9aa0a6); font-style: italic; }\n.empty {\n  position: absolute; inset: 0;\n  display: flex; flex-direction: column; align-items: center; justify-content: center;\n  gap: 6px; text-align: center; color: var(--ink-soft, #9aa0a6);\n  pointer-events: none; padding: 12px; font-size: 12px;\n}\n.empty.hidden { display: none; }\n/* 0.4.0 \u97F3\u9891\u5361\uFF082026-10-09\uFF09\uFF1A\u5361\u7247\u5185\u5BB9\u533A\u4E00\u4E2A\u64AD\u653E / \u6682\u505C + \u540D\u5B57 + \u80FD\u62D6\u7684\u8FDB\u5EA6\u6761 + \u65F6\u95F4\uFF1B\u4E0D\u81EA\u52A8\u653E\uFF08user\u300C\u5176\u5B9E\u6211\u4E5F\u89C9\u5F97\u81EA\u52A8\u653E\u53CD\u800C\u70E6\uFF0C\u8981\u4E0D\u8FD8\u662F\u64AD\u653E\u952E\u5427\u300D\uFF09 */\n.audio { position: absolute; inset: 0; display: none; z-index: 1; align-items: center; gap: 12px; padding: 12px 14px 30px 14px; box-sizing: border-box;\n  color: var(--ink, #e8eaed); background: color-mix(in srgb, var(--bg, #202124) 94%, transparent); }\n.audio.shown { display: flex; }\n.audio .aplay { flex: none; width: 52px; height: 52px; border-radius: 50%; border: 1px solid var(--line, #5f6368); background: transparent; color: inherit; display: grid; place-items: center; cursor: pointer; padding: 0; }\n.audio .aplay svg { width: 26px; height: 26px; }\n.audio .ainfo { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 6px; }\n.audio .aname { font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.audio .aseek { width: 100%; margin: 0; accent-color: var(--ink, #e8eaed); }\n.audio .atime { font-size: 12px; color: var(--ink-soft, #9aa0a6); font-variant-numeric: tabular-nums; }\n.audio.missing .aname { color: var(--ink-soft, #9aa0a6); font-style: italic; }\n/* 0.5.0 \u89C6\u9891\u5361\uFF082026-10-21\uFF09\uFF1A\u753B\u9762\u8D70 canvas\uFF08\u548C\u56FE\u7247\u4E00\u5957\u624B\u52BF\uFF09\uFF0C\u8FD9\u91CC\u53EA\u6709\u4E00\u6761\u5E95\u90E8\u63A7\u5236\u6761\uFF1A\u4E0A\u4E00\u5E27 / \u64AD\u653E / \u4E0B\u4E00\u5E27 / \u8FDB\u5EA6 / \u65F6\u95F4\u3002\u7FFB\u9875\u6761\u5728\u5E95\u4E0B\u65F6\u8BA9\u51FA\u4E00\u6392\u3002 */\n.video { position: absolute; left: 4px; right: 4px; bottom: 4px; display: none; z-index: 2; align-items: center; gap: 2px; padding: 2px 6px; box-sizing: border-box; border-radius: 14px;\n  background: color-mix(in srgb, var(--bg, #202124) 72%, transparent); color: var(--ink, #e8eaed); font-size: 11px; transition: opacity 0.35s; }\n.video.shown { display: flex; }\n.video.paged { bottom: 28px; }\n.video button { flex: none; width: 24px; height: 24px; padding: 0; border: none; border-radius: 50%; background: transparent; color: inherit; cursor: pointer; display: grid; place-items: center; }\n.video button:hover { background: color-mix(in srgb, var(--ink, #e8eaed) 14%, transparent); }\n.video button:disabled { opacity: 0.35; cursor: default; }\n.video button svg { width: 16px; height: 16px; pointer-events: none; }\n.video .vseek { flex: 1; min-width: 24px; margin: 0 4px; accent-color: var(--ink, #e8eaed); }\n.video .vtime { flex: none; color: var(--ink-soft, #9aa0a6); font-variant-numeric: tabular-nums; white-space: nowrap; }\n/* <video> \u672C\u5C0A\uFF1A\u85CF\u8D77\u6765\u4F46\u4E0D display:none\uFF08WebKit \u5BF9\u4E0D\u5728\u753B\u9762\u91CC\u7684 video \u4F1A\u505C\u66F4\u5E27 / \u4E0D\u53D1\u5E27\u56DE\u8C03\uFF09\uFF0C\u753B\u9762\u7531 canvas \u753B */\n.vsrc { position: absolute; left: 0; top: 0; width: 1px; height: 1px; clip-path: inset(50%); pointer-events: none; }\n.empty ::slotted(*), .empty p { margin: 0; }\n:host(:focus) { box-shadow: var(--shadow, 0 8px 24px rgba(0, 0, 0, 0.4)), inset 0 0 0 2px color-mix(in srgb, var(--ink, #e8eaed) 45%, transparent); }   /* \u6709\u7126\u70B9 = \u7C98\u8D34\u843D\u8FD9\u91CC\uFF1A\u4E00\u5708\u7EC6\u63CF\u8FB9 */\n</style>\n<canvas></canvas>\n<div class=\"text\" part=\"text\" data-takes-focus></div>\n<div class=\"audio\" part=\"audio\"><button class=\"aplay\" type=\"button\"></button><div class=\"ainfo\"><div class=\"aname\"></div><input class=\"aseek\" type=\"range\" min=\"0\" max=\"1000\" step=\"1\" value=\"0\"><div class=\"atime\"></div></div></div>\n<div class=\"video\" part=\"video\"><button class=\"vprev\" type=\"button\" title=\"Previous frame\" aria-label=\"Previous frame\">${iconMarkup(REF_ICON_IDS.prevFrame)}</button><button class=\"vplay\" type=\"button\"></button><button class=\"vnext\" type=\"button\" title=\"Next frame\" aria-label=\"Next frame\">${iconMarkup(REF_ICON_IDS.nextFrame)}</button><input class=\"vseek\" type=\"range\" min=\"0\" max=\"1000\" step=\"1\" value=\"0\"><div class=\"vtime\"></div></div>\n<div class=\"empty\"><slot name=\"empty\"><p>\uFF0B \u5BFC\u5165\u53C2\u8003</p></slot></div>\n<button class=\"move\" part=\"move\" type=\"button\" title=\"Tap: minimize \u00B7 drag: move\" aria-label=\"Tap: minimize \u00B7 drag: move\"><span class=\"knob\">${iconMarkup(REF_ICON_IDS.pip)}</span></button>\n<button class=\"plus\" part=\"plus\" type=\"button\" aria-haspopup=\"true\">${iconMarkup(REF_ICON_IDS.plus)}</button>\n<button class=\"close\" part=\"close\" type=\"button\">${iconMarkup(REF_ICON_IDS.x)}</button>\n<div class=\"grip\" part=\"grip\"></div>\n<button class=\"bubble\" part=\"bubble\" type=\"button\" title=\"Restore (drag to move)\" aria-label=\"Restore (drag to move)\">${iconMarkup(REF_ICON_IDS.pip)}</button>\n<div class=\"chips hidden\">\n  <button class=\"chip\" data-page=\"-1\" type=\"button\">${iconMarkup(REF_ICON_IDS.prev)}</button>\n  <button class=\"chip chip-count\" data-jump type=\"button\">1/1</button>\n  <button class=\"chip\" data-page=\"1\" type=\"button\">${iconMarkup(REF_ICON_IDS.next)}</button>\n</div>\n`;\n}\nexport class WpReferenceWindow extends HTMLElement {\n    static get observedAttributes() { return [\"open\", \"no-cloud\", \"minimized\"]; }\n    /** 0.3.1\uFF1A\u7A97\u8EAB\u53EF\u62FF\u7126\u70B9\uFF08\u7C98\u8D34\u5F52\u7126\u70B9\uFF09\u3002\u5C5E\u6027\u53EA\u80FD\u5728\u8FD9\u91CC\u52A0\uFF08\u81EA\u5B9A\u4E49\u5143\u7D20\u6784\u9020\u5668\u91CC\u52A0\u5C5E\u6027 = createElement \u76F4\u63A5\u70B8\uFF09\uFF1B\u5BBF\u4E3B\u53EF\u81EA\u5B9A tabindex\u3002 */\n    connectedCallback() { if (!this.hasAttribute(\"tabindex\"))\n        this.tabIndex = 0; } // no-cloud\uFF1A\u5BBF\u4E3B\u4E91\u529F\u80FD\u5173 \u2192 \u85CF\u4E91\u76D8\u9009\u56FE\u9879\n    // \u5BBF\u4E3B\u7AEF\u53E3\uFF1Alive \u5408\u6210 provider\uFF08\u4E00\u6B21\u6027 set\uFF1B\u7EC4\u4EF6\u5728\u5F53\u524D\u9875 kind=live \u65F6\u6D88\u8D39\uFF09\u3002null = \u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u753B\u9762\u53EF\u51FA\u3002\n    liveProvider = null;\n    /** \u4E24\u5E27\u4E4B\u95F4\u81F3\u5C11\u9694\u591A\u4E45\uFF08\u6BEB\u79D2\uFF09\u3002\u5F52\u5BBF\u4E3B\u5B9A\uFF1A\u53EA\u6709\u5BBF\u4E3B\u77E5\u9053\u81EA\u5DF1\u51FA\u4E00\u5E27\u591A\u8D35\u3002\u7F3A\u7701 300 = WeebPaint \u73B0\u503C\u3002 */\n    liveMinIntervalMs = LIVE_THROTTLE_MS;\n    /** \uFF0B \u83DC\u5355\u91CC\u5217\u54EA\u4E9B\u753B\u9762\uFF08\u591A\u53F0\u76F8\u673A\u7684\u5BBF\u4E3B\u7528\uFF09\u3002null = \u53EA\u5217\u4E00\u9879\u3002 */\n    liveTargets = null;\n    /** \u94FE\u63A5\u5361\u7684\u5185\u5BB9\u7AEF\u53E3\uFF080.3.0\uFF09\uFF1Abytes \u4E3A\u7A7A\u3001\u6709 target \u7684\u975E live \u5361\u4ECE\u8FD9\u91CC\u8981\u5185\u5BB9\u3002null = \u8FD9\u4E2A\u5BBF\u4E3B\u6CA1\u6709\u53EF\u94FE\u63A5\u7684\u4E1C\u897F\u3002 */\n    linkProvider = null;\n    // \u5BBF\u4E3B\u7AEF\u53E3\uFF1A\uFF0B \u83DC\u5355\uFF08\u4E00\u6B21\u6027 set = ui/popup-menu \u7684 togglePopupMenu\uFF09\u3002null = \u6CA1\u83DC\u5355\uFF08\u88F8\u6302\u65F6 \uFF0B \u65E0\u53CD\u5E94\uFF09\u3002\n    menuPort = null;\n    /** \u62D6\u628A\u5730\u677F\uFF08\u5BBF\u4E3B\u6CE8\u5165 = ui/floating-window \u8FD0\u884C\u65F6\u91CF\u7684\u300C\u9876\u680F\u4E0B\u7F18\u300D\uFF1B\u7F3A\u7701 60 = \u65E7\u5E38\u6570\uFF0C\u88F8\u6302\u53EF\u7528\uFF09\u3002\n     *  \u62D6 / \u6062\u590D / \u89C6\u53E3\u94B3\u5236\u4E09\u6761\u8DEF\u90FD\u5403\u5B83\u2014\u2014\u51FA\u8840\u533A\u89C4\u5219\u53EA\u51C6\u4E00\u4E2A\u51FA\u5904\uFF082026-09-02 C2\uFF09\u3002 */\n    topFloor = DRAG_TOP_FLOOR;\n    /** 0.4.0 \u97F3\u9891\u5361\u7684\u901F\u5EA6\u6863\uFF08\u5BBF\u4E3B\u6CE8\u5165\uFF0C\u5982 [1, 0.75, 0.5]\uFF1B\u4FDD\u97F3\u9AD8\uFF09\u3002null = \u4E0D\u7ED9\u901F\u5EA6\uFF08\u5E93\u7684\u7F3A\u7701\uFF1Buser 2026-10-09\u300C\u9ED8\u8BA4\u4E0D\u5F00\uFF0Cmoonsinger\u5F00\u300D\uFF09\u30020.5.0 \u8D77\u89C6\u9891\u5361\u4E5F\u7528\u5B83\u3002 */\n    audioRates = null;\n    /** \u5E95\u8FB9\u5730\u677F\uFF08\u5BBF\u4E3B\u6CE8\u5165 = \u5C4F\u5E95\u88AB\u5360\u6389\u7684\u9AD8\u5EA6\uFF1Aapp \u5185\u8F6F\u952E\u76D8\u3001iOS \u952E\u76D8\u90A3\u4E00\u5757\u2026\u2026\uFF1B\u7F3A\u7701 0\uFF09\u3002\u62D6 / resize / \u89C6\u53E3\u94B3\u5236\u90FD\u5403\u5B83\u2014\u2014\n     *  \u5426\u5219\u53F3\u4E0B\u89D2\u7684 resize \u628A\u624B\u4F1A\u88AB\u952E\u76D8\u76D6\u4F4F\uFF08user 2026-09-30\u300C\u53C2\u8003\u7A97\u6216\u8005\u4EFB\u4F55\u6D6E\u7A97\u9700\u8981\u4FDD\u8BC1 move \u548C resize \u80FD\u70B9\u5230\u300D\uFF09\u3002\u6539\u4E86\u4E4B\u540E\u5BBF\u4E3B\u8C03 reclamp()\u3002 */\n    bottomFloor = 0;\n    _canvas;\n    _cctx;\n    _textEl;\n    _audioLayer;\n    _aPlay;\n    _aName;\n    _aSeek;\n    _aTime;\n    /** 0.4.0 \u97F3\u9891\u5361\uFF1A\u4E00\u4E2A\u7A97\u4E00\u4E2A <audio>\uFF0C\u8BB0\u7740\u6B63\u5728\u653E\u54EA\u5F20\u5361\u3002\u7FFB\u5230\u522B\u7684\u5361 / \u5173\u7A97\u90FD\u4E0D\u505C\uFF08user\u300C\u5173\u7A97\u7684\u65F6\u5019\u97F3\u4E50\u4E0D\u505C\u300D\u30012026-10-09\u300C1. \u4E0D\u505C\u300D\uFF09\u3002 */\n    _audio = null;\n    _audioOf = null;\n    _audioUrl = null;\n    _rate = 1;\n    /** 0.5.0 \u89C6\u9891\u5361\uFF1A\u4E00\u4E2A\u7A97\u4E00\u4E2A <video>\uFF08\u85CF\u5728 shadow \u91CC\uFF0C\u753B\u9762\u7531 canvas \u753B\uFF09\u3002 */\n    _videoLayer;\n    _vPlay;\n    _vPrev;\n    _vNext;\n    _vSeek;\n    _vTime;\n    _video = null;\n    _videoOf = null;\n    _videoUrl = null;\n    _vFrameTime = null; // \u73B0\u5728\u753B\u7740\u7684\u8FD9\u4E00\u5E27\u7684 mediaTime\uFF08requestVideoFrameCallback \u62A5\u7684\uFF1Bseek \u4E4B\u540E\u6E05\u7A7A\u7B49\u4E0B\u4E00\u5E27\uFF09\n    _vFrameDur = null; // \u91CF\u5230 / \u5BBF\u4E3B\u7ED9\u7684\u5E27\u957F\uFF08\u79D2\uFF09\uFF1Bnull = \u8FD8\u4E0D\u77E5\u9053\n    _vStepping = null; // \u300C\u64AD\u5230\u4E0B\u4E00\u5E27\u5C31\u505C\u300D\u8FDB\u884C\u4E2D\n    _vRaf = null; // \u64AD\u653E\u65F6\u9010\u5E27\u91CD\u753B\u7684\u5FAA\u73AF\n    _emptyEl;\n    _plusEl;\n    _menu = null; // \u83DC\u5355\u53E5\u67C4\uFF08\u5F00\u7740\u624D\u975E null\uFF09\n    _delArmed = false; // \u5220\u9664\u4E8C\u6BB5\u786E\u8BA4 armed\uFF08\u83DC\u5355\u5173\u5373\u590D\u4F4D\uFF09\n    _chipsEl;\n    _chipCountEl;\n    _menuAnchor = null; // \u73B0\u5728\u5F00\u7740\u7684\u83DC\u5355\u6302\u5728\u8C01\u8EAB\u4E0A\uFF08\uFF0B \u6216\u8BA1\u6570\u94AE\uFF09\n    // ---- \u591A\u53C2\u8003\u6A21\u578B\uFF1A\u5361\u7247\u5F52\u724C\u7EC4\uFF1B\u8FD9\u91CC\u53EA\u7559\u753B\u5B83\u4EEC\u8981\u7528\u7684\u4E1C\u897F ----\n    _deck = createDeck();\n    _offDeck = null;\n    _muted = false; // \u81EA\u5DF1\u6539\u724C\u7EC4\u7684\u90A3\u4E00\u4E0B\u4E0D\u542C\u81EA\u5DF1\u7684\u56DE\u58F0\uFF08\u540C\u6B65\u7684\u91CD\u5165\u5B88\u536B\uFF0C\u4E0D\u662F\u65F6\u95F4\u7A97\uFF09\n    _shownId = null; // \u73B0\u5728\u753B\u7740\u7684\u662F\u54EA\u5F20\u5361\n    _bitmaps = new Map(); // \u89E3\u597D\u7684\u4F4D\u56FE\uFF0C\u6309\u5361 id\n    _decoding = new Set(); // \u6B63\u5728\u89E3\u7684\u5361\n    _texts = new Map(); // \u89E3\u597D\u7684\u6587\u5B57\uFF0C\u6309\u5361 id\n    _linked = new Map(); // \u94FE\u63A5\u5361\u53D6\u56DE\u6765\u7684\u5B57\u8282\uFF08\u53EA\u663E\u793A\u4E0D\u5B58\uFF09\n    _linkMissing = new Set(); // \u94FE\u63A5\u5361\u8FD9\u6B21\u53D6\u4E0D\u5230\uFF08\u9875\u5220\u4E86\u2026\uFF09\n    _resolving = new Set(); // \u6B63\u5728\u5411\u5BBF\u4E3B\u8981\u5185\u5BB9\u7684\u94FE\u63A5\u5361\n    _textPinch = []; // \u6587\u5B57\u5C42\u4E0A\u7684\u6307\u9488\uFF08\u634F\u5408\u8C03\u5B57\u53F7\uFF09\n    _textPinchStart = null;\n    _textScrollRaf = null;\n    _labels = {};\n    _liveSource = null;\n    _liveSize = null; // \u8FD9\u5F20\u5361\u300C\u672C\u6765\u591A\u5927\u300D\uFF08\u5BBF\u4E3B\u6CA1\u8BF4 = \u753B\u9762\u7684\u50CF\u7D20\u5C3A\u5BF8\uFF09\n    _liveOf = null; // \u624B\u4E0A\u8FD9\u4E00\u5E27\u662F\u54EA\u5F20\u5361\u7684\n    _liveDirty = false;\n    _lastLiveComposeT;\n    _liveThrottle = null;\n    _vp = { tx: 0, ty: 0, scale: 1, rot: 0 };\n    _raf = null;\n    _panelDrag = null;\n    _resizeDrag = null;\n    _pointers = new Map();\n    _gestureStart = null;\n    _picking = false;\n    _longPressTimer = null;\n    _lpStart = null;\n    _lpEvent = null;\n    _idleTimer = null;\n    constructor() {\n        super();\n        // \u89C6\u53E3\u62A4\u680F\uFF08user 0830 \u53CD\u9988\uFF09\uFF1A\u6D4F\u89C8\u5668\u7A97\u53E3 resize \u540E\u5C0F\u7A97\u53EF\u80FD\u6574\u4E2A\u843D\u5C4F\u5916\u2014\u2014\u94B3\u56DE\u3002\u8FD9\u4E0D\u662F\u5BBF\u4E3B app\n        //   \u4E8B\u4EF6\uFF08\u7EC4\u4EF6\u7EA6\u5B9A\u7981\u7684\u662F wp:*\uFF09\uFF0C\u662F\u7EC4\u4EF6\u5BF9\u81EA\u8EAB\u5B9A\u4F4D\u73AF\u5883\u7684\u81EA\u7406\uFF1B\u4FEE\u6B63\u540E emitRect \u8BA9\u5BBF\u4E3B\u6301\u4E45\u5316\u771F\u503C\u3002\n        window.addEventListener?.(\"resize\", () => {\n            if (!this.open)\n                return;\n            if (this._clampIntoViewport())\n                this._emitRect();\n        });\n        const root = this.attachShadow({ mode: \"open\" });\n        root.innerHTML = buildTemplate();\n        this._canvas = root.querySelector(\"canvas\");\n        this._textEl = root.querySelector(\".text\");\n        this._audioLayer = root.querySelector(\".audio\");\n        this._aPlay = root.querySelector(\".aplay\");\n        this._aName = root.querySelector(\".aname\");\n        this._aSeek = root.querySelector(\".aseek\");\n        this._aTime = root.querySelector(\".atime\");\n        this._aPlay.innerHTML = iconMarkup(REF_ICON_IDS.play);\n        this._aPlay.addEventListener(\"click\", () => this.togglePlay());\n        this._aSeek.addEventListener(\"input\", () => { const a = this._audio; if (a && this._audioOf === this._deck.current?.id && Number.isFinite(a.duration)) {\n            a.currentTime = (Number(this._aSeek.value) / 1000) * a.duration;\n            this._updateAudioLayer();\n        } });\n        this._aSeek.addEventListener(\"change\", () => this._saveAudioPos());\n        // 0.5.0 \u89C6\u9891\u5361\u7684\u63A7\u5236\u6761\n        this._videoLayer = root.querySelector(\".video\");\n        this._vPlay = root.querySelector(\".vplay\");\n        this._vPrev = root.querySelector(\".vprev\");\n        this._vNext = root.querySelector(\".vnext\");\n        this._vSeek = root.querySelector(\".vseek\");\n        this._vTime = root.querySelector(\".vtime\");\n        this._vPlay.innerHTML = iconMarkup(REF_ICON_IDS.play);\n        this._vPlay.addEventListener(\"click\", () => this.togglePlay());\n        this._vPrev.addEventListener(\"click\", () => this.stepFrame(-1));\n        this._vNext.addEventListener(\"click\", () => this.stepFrame(1));\n        this._vSeek.addEventListener(\"input\", () => { const v = this._video; if (v && this._videoOf === this._deck.current?.id && Number.isFinite(v.duration)) {\n            this._cancelStep();\n            v.currentTime = (Number(this._vSeek.value) / 1000) * v.duration;\n            this._updateVideoLayer();\n        } });\n        // \u7A7A\u683C = \u64AD\u653E / \u6682\u505C\uFF08\u7A97\u6709\u7126\u70B9\u3001\u5F53\u524D\u662F\u97F3\u89C6\u9891\u5361\u65F6\uFF1B\u6587\u5B57\u5361 / \u8FDB\u5EA6\u6761\u81EA\u5DF1\u7684\u952E\u7167\u65E7\uFF09\uFF1B\u89C6\u9891\u5361\u53E6\u6709 \u2190 \u2192 \u3001, . = \u4E0A\u4E00\u5E27 / \u4E0B\u4E00\u5E27\n        this.addEventListener(\"keydown\", (e) => {\n            const cur = this._deck.current;\n            if (!cur || (cur.kind !== \"audio\" && cur.kind !== \"video\") || e.composedPath()[0]?.closest?.(\"input, .text\"))\n                return;\n            if (e.key === \" \") {\n                e.preventDefault();\n                e.stopPropagation();\n                this.togglePlay();\n            }\n            else if (cur.kind === \"video\" && (e.key === \"ArrowRight\" || e.key === \".\")) {\n                e.preventDefault();\n                e.stopPropagation();\n                this.stepFrame(1);\n            }\n            else if (cur.kind === \"video\" && (e.key === \"ArrowLeft\" || e.key === \",\")) {\n                e.preventDefault();\n                e.stopPropagation();\n                this.stepFrame(-1);\n            }\n        });\n        this._emptyEl = root.querySelector(\".empty\");\n        this._plusEl = root.querySelector(\".plus\");\n        this._chipsEl = root.querySelector(\".chips\");\n        this._chipCountEl = root.querySelector(\".chip-count\");\n        this._cctx = this._canvas.getContext(\"2d\");\n        this._bind(root);\n        this._offDeck = this._deck.onChange((what) => this._onDeckChange(what));\n    }\n    // ---- \u724C\u7EC4\uFF08\u5BBF\u4E3B\u53EF\u4EE5\u76F4\u63A5\u7528\uFF1B\u4E5F\u53EF\u4EE5\u6362\u6210\u81EA\u5DF1\u7684\uFF0C\u6BD4\u5982\u548C VR \u89C6\u56FE\u5171\u7528\u4E00\u526F\uFF09----\n    get deck() { return this._deck; }\n    set deck(d) {\n        if (!d || d === this._deck)\n            return;\n        this._offDeck?.();\n        this._closeAllBitmaps();\n        this._deck = d;\n        this._shownId = null;\n        this._offDeck = d.onChange((what) => this._onDeckChange(what));\n        this._syncFromDeck();\n    }\n    // ---- \u5C5E\u6027\u9762\uFF08\u5165\u5411\uFF1B\u7A0B\u5E8F\u6027 set \u4E0D\u53D1\u4E8B\u4EF6\uFF09----\n    /** \u952E\u76D8\u7126\u70B9\u5728\u53C2\u8003\u7A97\u4E0A\uFF08\u542B\u7A97\u5185\u6587\u5B57\u5361\uFF09= \u5BBF\u4E3B\u7684 Ctrl+V \u5E94\u843D\u5230\u8FD9\u91CC\uFF080.3.1\uFF0Cuser\u300C\u770B focus\u300D\uFF09\u3002 */\n    get hasFocus() { return document.activeElement === this; }\n    get open() { return this.hasAttribute(\"open\"); }\n    set open(v) { this.toggleAttribute(\"open\", !!v); if (!v) {\n        this._menu?.close();\n        this.toggleAttribute(\"minimized\", false);\n    } } // \u5173\u7A97 = \u83DC\u5355\u4E00\u5E76\u6536\uFF08\u83DC\u5355\u6302 body\uFF0C\u4E0D\u968F\u7A97\u9690\uFF09\uFF1B\u6536\u7740\u7684\u5C0F\u56FE\u6807\u4E5F\u4E00\u8D77\u8FD8\u539F\uFF08\u518D\u5F00 = \u6574\u7A97\uFF09\n    /** 0.4.1 \u6536\u6210\u5C0F\u56FE\u6807\uFF08\u7A0B\u5E8F\u6027 set \u4E0D\u53D1\u4E8B\u4EF6\uFF0C\u540C open\uFF09\u3002\u6536\u7740\u7684\u65F6\u5019 `rect` \u7167\u6837\u62A5\u539F\u6765\u7684\u5BBD\u9AD8\uFF08\u53EA\u6709\u4F4D\u7F6E\u8DDF\u7740\u5C0F\u56FE\u6807\u8D70\uFF09\uFF0C\u5BBF\u4E3B\u5B58\u7684\u5927\u5C0F\u4E0D\u4F1A\u88AB 44\u00D744 \u76D6\u6389\u3002 */\n    get minimized() { return this.hasAttribute(\"minimized\"); }\n    set minimized(v) {\n        if (!!v === this.minimized)\n            return;\n        if (v) { // \u6536\u8D77\u524D\u8BB0\u4E0B\u5916\u6846\u5927\u5C0F\uFF08rect \u7684\u53E3\u5F84 = \u5916\u6846\uFF0C\u542B\u8FB9\u6846\uFF09\uFF0C\u6536\u7740\u7684\u65F6\u5019 rect \u62A5\u5B83\n            const r = this.getBoundingClientRect();\n            if (r.width > 0 && r.height > 0)\n                this._restoreSize = { w: r.width, h: r.height };\n        }\n        this.toggleAttribute(\"minimized\", !!v);\n        if (v)\n            this._menu?.close();\n        else\n            this._afterRestore();\n    }\n    _restoreSize = null;\n    attributeChangedCallback(name, oldV, newV) {\n        if (name === \"no-cloud\") {\n            this._menu?.refresh(); // \u4E91\u76D8\u9879\u663E\u9690\u7531 items() \u73B0\u7B97\n            return;\n        }\n        if (name === \"open\" && oldV !== newV && newV != null)\n            this._afterShow();\n    }\n    close() { this.open = false; } // \u7A0B\u5E8F\u6027\u5173\uFF08\u4E0D\u53D1\u4E8B\u4EF6\uFF09\n    /** 0.4.0 \u5BFC\u5165\u6F0F\u6597\uFF08deck/import.ts\uFF09\uFF1A\u55C5\u79CD\u7C7B \u2192 \u591F\u5927\u5C31\u95EE\u5BBF\u4E3B\uFF08ask\uFF09\u2192 \u539F\u6837 / \u538B\uFF08\u5BBF\u4E3B\u6CE8\u5165\u7684 transcoder\uFF09/ \u53EA\u653E\u5185\u5B58 / \u4E0D\u8981 \u2192 \u8FDB\u724C\u7EC4\uFF1B\u52A0\u8FDB\u53BB\u4E86\u5C31\u5F00\u7A97\u3002\n     *  kinds \u7F3A\u7701 = \u56FE\u7247 / \u6587\u5B57 / \u97F3\u9891 / \u89C6\u9891\uFF080.5.0 \u8D77\u542B\u89C6\u9891\uFF09\u3002\u97F3\u9891 / \u89C6\u9891\u9ED8\u8BA4\u53EA\u653E\u5185\u5B58\uFF080.5.0\uFF1Bopts.defaultRam \u53EF\u6309\u79CD\u7C7B\u6539\uFF09\u3002\u7ED3\u679C\uFF08\u52A0\u4E86\u54EA\u4E9B\u3001\u54EA\u4E9B\u6CA1\u8FDB\u3001\u4E3A\u4EC0\u4E48\uFF09\u539F\u6837\u8FD8\u7ED9\u5BBF\u4E3B\uFF0C\u7531\u5BBF\u4E3B\u660E\u8BF4\u3002 */\n    async importFiles(files, opts = {}) {\n        const r = await importIntoDeck(this._deck, files, { ...opts, kinds: opts.kinds ?? [\"image\", \"text\", \"audio\", \"video\"] });\n        if (r.added.length || r.filled.length)\n            this.open = true;\n        return r;\n    }\n    /** \u5143\u7D20\u4ECE\u6587\u6863\u91CC\u62FF\u6389 = \u505C\uFF08\u5173\u7A97\u4E0D\u505C\uFF1B\u6574\u4E2A\u7A97\u6CA1\u4E86\u624D\u505C\uFF09\u3002 */\n    disconnectedCallback() { this._audio?.pause(); this._cancelStep(); this._video?.pause(); }\n    // ---- 0.4.0 \u97F3\u9891\u5361 / 0.5.0 \u89C6\u9891\u5361 ----\n    /** \u5F53\u524D\u8FD9\u5F20\u97F3\u9891 / \u89C6\u9891\u5361\uFF1A\u64AD\u653E / \u6682\u505C\uFF08\u6362\u4E86\u4E00\u5F20\u5361 = \u5148\u505C\u4E0A\u4E00\u5F20\u3001\u4ECE\u8FD9\u5F20\u8BB0\u7740\u7684\u4F4D\u7F6E\u653E\uFF09\u3002\u4E0D\u662F\u97F3\u89C6\u9891\u5361 = \u4EC0\u4E48\u90FD\u4E0D\u505A\u3002 */\n    togglePlay() {\n        const cur = this._deck.current;\n        if (!cur || (cur.kind !== \"audio\" && cur.kind !== \"video\"))\n            return;\n        const bytes = cur.bytes ?? this._linked.get(cur.id) ?? null;\n        if (!bytes)\n            return;\n        const fail = (e) => this._emit(\"notice\", { level: \"error\", code: \"decode-failed\", id: cur.id, name: cur.name, message: String(e?.message ?? e) });\n        if (cur.kind === \"video\") {\n            if (this._videoOf !== cur.id)\n                this._loadVideo(cur, bytes);\n            this._cancelStep();\n            const v = this._video;\n            if (v.paused || v.ended)\n                v.play().catch(fail);\n            else\n                v.pause();\n            this._updateVideoLayer();\n            return;\n        }\n        if (this._audioOf !== cur.id)\n            this._loadAudio(cur, bytes);\n        const a = this._audio;\n        if (a.paused)\n            a.play().catch(fail);\n        else\n            a.pause();\n        this._updateAudioLayer();\n    }\n    /** \u6B63\u5728\u653E\uFF08\u4EFB\u4F55\u4E00\u5F20\u97F3\u9891\u5361\uFF0C\u6216\u5F53\u524D\u8FD9\u5F20\u89C6\u9891\u5361\uFF1B\u9010\u5E27\u65F6\u90A3\u4E00\u4E0B\u77ED\u6682\u7684\u9759\u97F3\u64AD\u653E\u4E0D\u7B97\uFF09\u3002 */\n    get playing() { return (!!this._audio && !this._audio.paused) || (!!this._video && !this._video.paused && !this._video.ended && !this._vStepping); }\n    // ---- 0.5.0 \u89C6\u9891\u5361 ----\n    /** \u5F53\u524D\u8FD9\u5F20\u89C6\u9891\u5361\uFF1A\u4E0A\u4E00\u5E27\uFF08-1\uFF09/ \u4E0B\u4E00\u5E27\uFF08+1\uFF09\u3002\u653E\u7740\u7684\u5148\u6682\u505C\u3002\u4E0D\u662F\u89C6\u9891\u5361 = \u4EC0\u4E48\u90FD\u4E0D\u505A\u3002\u505A\u6CD5\u89C1\u6587\u4EF6\u5934\u300C0.5.0\u300D\u3002 */\n    stepFrame(delta) {\n        const cur = this._deck.current;\n        if (!cur || cur.kind !== \"video\")\n            return;\n        const bytes = cur.bytes ?? this._linked.get(cur.id) ?? null;\n        if (!bytes)\n            return;\n        if (this._videoOf !== cur.id)\n            this._loadVideo(cur, bytes);\n        const v = this._video;\n        if (this._vStepping)\n            return; // \u4E0A\u4E00\u6B65\u8FD8\u6CA1\u843D\u5B9A\n        if (!v.paused)\n            v.pause();\n        const base = this._vFrameTime ?? v.currentTime; // \u8FD9\u4E00\u5E27\u7684\u8D77\u70B9\uFF08\u6709\u5E27\u56DE\u8C03\u5C31\u662F\u7CBE\u786E\u7684\uFF1B\u6CA1\u6709\u5C31\u662F currentTime\uFF09\n        const d = this._vFrameDur;\n        if (delta > 0) {\n            if (d != null)\n                this._seekVideo(base + 1.5 * d);\n            else if (typeof v.requestVideoFrameCallback === \"function\") {\n                // \u8FD8\u4E0D\u77E5\u9053\u5E27\u957F\uFF1A\u9759\u97F3\u64AD\u5230\u4E0B\u4E00\u5E27\u5C31\u505C\uFF08_onVideoFrame \u6536\u5C3E\uFF09\uFF1B300 ms \u6CA1\u7B49\u5230\u5E27\uFF08\u5230\u5C3E\u4E86 / \u89E3\u4E0D\u51FA\uFF09\u5C31\u5728\u539F\u5730\u505C\u4E0B\n                const timer = setTimeout(() => { if (this._vStepping?.timer === timer) {\n                    const st = this._vStepping;\n                    this._vStepping = null;\n                    v.pause();\n                    v.muted = st.restoreMuted;\n                    this._updateVideoLayer();\n                } }, 300);\n                this._vStepping = { from: base, restoreMuted: v.muted, timer };\n                v.muted = true;\n                v.play().catch(() => { this._cancelStep(); });\n            }\n            else\n                this._seekVideo(v.currentTime + 1 / (cur.play?.fps ?? 24));\n        }\n        else {\n            this._seekVideo(Math.max(0, base - 0.5 * (d ?? 1 / (cur.play?.fps ?? 24))));\n        }\n        this._updateVideoLayer();\n    }\n    _seekVideo(t) {\n        const v = this._video;\n        if (!v)\n            return;\n        v.currentTime = Number.isFinite(v.duration) ? Math.max(0, Math.min(v.duration, t)) : Math.max(0, t);\n    }\n    _cancelStep() {\n        const st = this._vStepping;\n        if (!st)\n            return;\n        this._vStepping = null;\n        clearTimeout(st.timer);\n        const v = this._video;\n        if (v) {\n            v.pause();\n            v.muted = st.restoreMuted;\n        }\n    }\n    /** requestVideoFrameCallback\uFF1A\u65B0\u753B\u4E86\u4E00\u5E27\u3002\u8BB0\u5E27\u7684\u8D77\u70B9\u3001\u91CF\u5E27\u957F\u3001\u6536\u300C\u64AD\u5230\u4E0B\u4E00\u5E27\u5C31\u505C\u300D\u7684\u5C3E\u3002 */\n    _onVideoFrame(v, mediaTime) {\n        const prev = this._vFrameTime;\n        this._vFrameTime = mediaTime;\n        if (prev != null && !v.seeking) { // \u8FDE\u7EED\u64AD\u653E\u65F6\u76F8\u90BB\u4E24\u5E27\u4E4B\u5DEE\uFF1B\u53D6\u6700\u5C0F = \u771F\u5E27\u957F\uFF08\u6389\u5E27\u53EA\u4F1A\u8BA9\u5DEE\u53D8\u5927\uFF09\n            const d = mediaTime - prev;\n            if (d > 1 / 240 && d < 1 && (this._vFrameDur == null || d < this._vFrameDur - 1e-6)) {\n                this._vFrameDur = d;\n                this._saveVideoPos();\n            }\n        }\n        const st = this._vStepping;\n        if (st && mediaTime > st.from + 1e-6) { // \u5230\u4E0B\u4E00\u5E27\u4E86\uFF1A\u505C\u3001\u7CBE\u786E\u505C\u5728\u8FD9\u4E00\u5E27\n            this._vStepping = null;\n            clearTimeout(st.timer);\n            v.pause();\n            v.muted = st.restoreMuted;\n            if (Math.abs(v.currentTime - mediaTime) > 1e-4)\n                v.currentTime = mediaTime;\n        }\n        this._invalidate();\n        this._updateVideoLayer();\n    }\n    _armFrameCallback(v) {\n        const rvfc = v.requestVideoFrameCallback;\n        if (typeof rvfc !== \"function\")\n            return;\n        rvfc.call(v, (_now, meta) => { if (this._video !== v)\n            return; this._onVideoFrame(v, meta.mediaTime); this._armFrameCallback(v); });\n    }\n    _loadVideo(c, bytes) {\n        this._stopVideo();\n        const v = document.createElement(\"video\"), t0 = c.play?.t ?? 0;\n        v.className = \"vsrc\";\n        v.playsInline = true;\n        v.preload = \"auto\";\n        v.loop = !!c.play?.loop;\n        v.playbackRate = this._rate;\n        v.preservesPitch = true;\n        this._videoUrl = URL.createObjectURL(bytes);\n        v.src = this._videoUrl;\n        this._vFrameDur = c.play?.fps ? 1 / c.play.fps : null;\n        this._vFrameTime = null;\n        // \u5A92\u4F53\u4E8B\u4EF6\u662F\u5F02\u6B65\u6D3E\u53D1\u7684\uFF1A\u8FD9\u4E2A <video> \u88AB\u6362\u6389\u4E4B\u540E\u665A\u5230\u7684 pause / seeked / error \u4E0D\u8BB8\u78B0\u65B0\u7684\u90A3\u4E2A\uFF08\u505C\u6389\u65B0\u89C6\u9891\u7684\u91CD\u753B\u5FAA\u73AF\u3001\u5F80\u522B\u7684\u5361\u8BB0\u4F4D\u7F6E\u3001\u62A5\u5047\u9519\uFF09\n        const on = (ev, fn, opts) => v.addEventListener(ev, () => { if (this._video === v)\n            fn(); }, opts);\n        on(\"loadedmetadata\", () => { if (t0 > 0)\n            v.currentTime = Math.min(t0, Number.isFinite(v.duration) ? v.duration : t0); this._updateVideoLayer(); }, { once: true });\n        on(\"loadeddata\", () => {\n            if (this._deck.current?.id === c.id) {\n                if (!this._deck.current.vp)\n                    this.fitToPanelSilent();\n                this._invalidate();\n            }\n            this._updateVideoLayer();\n        });\n        for (const ev of [\"play\", \"pause\", \"ended\", \"timeupdate\", \"durationchange\"])\n            on(ev, () => this._updateVideoLayer());\n        on(\"seeking\", () => { this._vFrameTime = null; });\n        on(\"seeked\", () => { this._saveVideoPos(); this._invalidate(); this._updateVideoLayer(); });\n        on(\"play\", () => this._startVideoLoop(v));\n        on(\"pause\", () => { this._saveVideoPos(); this._stopVideoLoop(); });\n        on(\"ended\", () => { this._cancelStep(); this._stopVideoLoop(); this._saveVideoPos(); });\n        on(\"error\", () => this._emit(\"notice\", { level: \"error\", code: \"decode-failed\", id: c.id, name: c.name, message: \"video could not be decoded\" }));\n        this.shadowRoot.appendChild(v);\n        this._video = v;\n        this._videoOf = c.id;\n        this._armFrameCallback(v);\n    }\n    _stopVideo() {\n        this._cancelStep();\n        this._stopVideoLoop();\n        if (this._video) {\n            this._saveVideoPos();\n            this._video.pause();\n            this._video.removeAttribute(\"src\");\n            this._video.load();\n            this._video.remove();\n        }\n        if (this._videoUrl)\n            URL.revokeObjectURL(this._videoUrl);\n        this._video = null;\n        this._videoOf = null;\n        this._videoUrl = null;\n        this._vFrameTime = null;\n        this._vFrameDur = null;\n    }\n    /** \u64AD\u653E\u4E2D\u9010\u5E27\u91CD\u753B\uFF08\u6709\u6CA1\u6709\u5E27\u56DE\u8C03\u90FD\u753B\u2014\u2014\u5E27\u56DE\u8C03\u53EA\u7BA1\u7CBE\u786E\u8BA1\u65F6\uFF09\u3002 */\n    _startVideoLoop(v) {\n        if (this._vRaf != null)\n            return;\n        const tick = () => { this._vRaf = null; if (this._video !== v || v.paused || v.ended)\n            return; this._render(); this._updateVideoLayer(); this._vRaf = requestAnimationFrame(tick); };\n        this._vRaf = requestAnimationFrame(tick);\n    }\n    _stopVideoLoop() { if (this._vRaf != null) {\n        cancelAnimationFrame(this._vRaf);\n        this._vRaf = null;\n    } }\n    /** \u653E\u5230\u54EA / \u5FAA\u73AF / \u5E27\u7387\u8BB0\u8FDB\u5361\uFF08\u89C6\u56FE\u6001\uFF1A\u724C\u7EC4\u53D1 view\uFF0C\u4E0D\u6807\u810F\uFF09\u3002 */\n    _saveVideoPos() {\n        const v = this._video, id = this._videoOf;\n        if (!v || !id || this._deck.indexOf(id) < 0)\n            return;\n        const fps = this._vFrameDur ? Math.round((1 / this._vFrameDur) * 1000) / 1000 : undefined;\n        this._deck.setPlay(id, { t: Math.round(v.currentTime * 1000) / 1000, loop: v.loop, ...(fps ? { fps } : {}) });\n    }\n    _updateVideoLayer() {\n        const cur = this._deck.current, isVideo = cur?.kind === \"video\";\n        const v = this._video;\n        if (v && (!isVideo || this._videoOf !== cur.id)) {\n            this._cancelStep();\n            if (!v.paused)\n                v.pause();\n        } // \u7FFB\u5230\u522B\u7684\u5361 = \u6682\u505C\n        const bytes = isVideo && cur ? (cur.bytes ?? this._linked.get(cur.id) ?? null) : null;\n        const shown = !!bytes;\n        this._videoLayer.classList.toggle(\"shown\", shown);\n        if (!shown || !cur)\n            return;\n        if (this._videoOf !== cur.id)\n            this._loadVideo(cur, bytes);\n        const vv = this._video, playing = !vv.paused && !vv.ended && !this._vStepping;\n        const want = playing ? REF_ICON_IDS.pause : REF_ICON_IDS.play;\n        if (this._vPlay.dataset.icon !== want) {\n            this._vPlay.innerHTML = iconMarkup(want);\n            this._vPlay.dataset.icon = want;\n        }\n        this._vPlay.setAttribute(\"aria-label\", playing ? (this._labels.pause ?? \"Pause\") : (this._labels.play ?? \"Play\"));\n        this._videoLayer.classList.toggle(\"paged\", this._deck.size >= 2);\n        const dur = Number.isFinite(vv.duration) ? vv.duration : null, t = vv.currentTime, d = this._vFrameDur;\n        this._vSeek.disabled = !dur;\n        this._vSeek.value = String(dur ? Math.round((t / dur) * 1000) : 0);\n        this._vPrev.disabled = this._vNext.disabled = !!this._vStepping;\n        const fmt = (x) => `${Math.floor(x / 60)}:${String(Math.floor(x % 60)).padStart(2, \"0\")}.${Math.floor((x % 1) * 10)}`;\n        const text = `${fmt(t)}${dur ? ` / ${fmt(dur)}` : \"\"}${d ? ` \u00B7 #${Math.round((this._vFrameTime ?? t) / d)}` : \"\"}${vv.playbackRate !== 1 ? ` \u00B7 ${vv.playbackRate}\u00D7` : \"\"}${cur.play?.loop ? ` \u00B7 ${this._labels.loop ?? \"loop\"}` : \"\"}`;\n        if (this._vTime.textContent !== text)\n            this._vTime.textContent = text;\n    }\n    _loadAudio(c, bytes) {\n        this._stopAudio();\n        const a = new Audio(), t0 = c.play?.t ?? 0;\n        this._audioUrl = URL.createObjectURL(bytes);\n        a.preload = \"auto\";\n        a.src = this._audioUrl;\n        a.loop = !!c.play?.loop;\n        a.playbackRate = this._rate;\n        a.preservesPitch = true;\n        if (t0 > 0)\n            a.addEventListener(\"loadedmetadata\", () => { a.currentTime = Math.min(t0, Number.isFinite(a.duration) ? a.duration : t0); }, { once: true });\n        for (const ev of [\"timeupdate\", \"play\", \"pause\", \"ended\", \"loadedmetadata\", \"durationchange\"])\n            a.addEventListener(ev, () => this._updateAudioLayer());\n        a.addEventListener(\"pause\", () => this._saveAudioPos());\n        a.addEventListener(\"error\", () => this._emit(\"notice\", { level: \"error\", code: \"decode-failed\", id: c.id, name: c.name, message: \"audio could not be decoded\" }));\n        this._audio = a;\n        this._audioOf = c.id;\n    }\n    _stopAudio() {\n        if (this._audio) {\n            this._saveAudioPos();\n            this._audio.pause();\n            this._audio.removeAttribute(\"src\");\n        }\n        if (this._audioUrl)\n            URL.revokeObjectURL(this._audioUrl);\n        this._audio = null;\n        this._audioOf = null;\n        this._audioUrl = null;\n    }\n    /** \u653E\u5230\u54EA / \u5FAA\u73AF\u8BB0\u8FDB\u5361\uFF08\u89C6\u56FE\u6001\uFF1A\u724C\u7EC4\u53D1 view\uFF0C\u4E0D\u6807\u810F\uFF09\u3002 */\n    _saveAudioPos() {\n        const a = this._audio, id = this._audioOf;\n        if (!a || !id || this._deck.indexOf(id) < 0)\n            return;\n        this._deck.setPlay(id, { t: Math.round(a.currentTime * 100) / 100, loop: a.loop });\n    }\n    _updateAudioLayer() {\n        const cur = this._deck.current, isAudio = cur?.kind === \"audio\";\n        this._audioLayer.classList.toggle(\"shown\", isAudio);\n        if (!isAudio || !cur)\n            return;\n        const a = this._audio && this._audioOf === cur.id ? this._audio : null, playing = !!a && !a.paused;\n        const want = playing ? REF_ICON_IDS.pause : REF_ICON_IDS.play;\n        if (this._aPlay.dataset.icon !== want) {\n            this._aPlay.innerHTML = iconMarkup(want);\n            this._aPlay.dataset.icon = want;\n        }\n        this._aPlay.setAttribute(\"aria-label\", playing ? (this._labels.pause ?? \"Pause\") : (this._labels.play ?? \"Play\"));\n        const missing = !cur.bytes && !this._linked.get(cur.id);\n        this._audioLayer.classList.toggle(\"missing\", missing);\n        const hole = missing && !!cur.ram; // \u300C\u53EA\u653E\u5185\u5B58\u300D\u8BFB\u56DE\u6765\u7684\u7A7A\u4F4D\uFF1A\u8BF4\u6E05\u695A\u3001\u6559\u600E\u4E48\u8865\n        const name = hole ? `${cur.name || this._labels.kindNames?.audio || \"audio\"} \u00B7 ${fmtBytes(cur.ram.bytes)} \u2014 ${this._ramMissingText()}`\n            : missing && this._linkMissing.has(cur.id) ? (this._labels.linkMissing ?? \"Content unavailable\") : (cur.name || this._labels.kindNames?.audio || \"audio\");\n        if (this._aName.textContent !== name)\n            this._aName.textContent = name;\n        const dur = a && Number.isFinite(a.duration) ? a.duration : null, t = a ? a.currentTime : (cur.play?.t ?? 0);\n        this._aPlay.disabled = missing;\n        this._aSeek.disabled = !dur;\n        this._aSeek.value = String(dur ? Math.round((t / dur) * 1000) : 0);\n        const fmt = (x) => `${Math.floor(x / 60)}:${String(Math.floor(x % 60)).padStart(2, \"0\")}`;\n        this._aTime.textContent = `${fmt(t)}${dur ? ` / ${fmt(dur)}` : \"\"}${a && a.playbackRate !== 1 ? ` \u00B7 ${a.playbackRate}\u00D7` : \"\"}${cur.play?.loop ? ` \u00B7 ${this._labels.loop ?? \"loop\"}` : \"\"}`;\n    }\n    get live() { return this._deck.current?.kind === \"live\"; }\n    isLive() { return this.live; }\n    get viewport() { return { ...this._vp }; }\n    set viewport(v) {\n        if (!v)\n            return;\n        if (Number.isFinite(v.tx))\n            this._vp.tx = v.tx;\n        if (Number.isFinite(v.ty))\n            this._vp.ty = v.ty;\n        if (Number.isFinite(v.scale))\n            this._vp.scale = v.scale;\n        if (Number.isFinite(v.rot))\n            this._vp.rot = v.rot;\n        this._saveCurrentVp();\n        this._invalidate();\n    }\n    get rect() {\n        const r = this.getBoundingClientRect();\n        if (this.minimized) { // \u6536\u7740\uFF1A\u4F4D\u7F6E\u662F\u5C0F\u56FE\u6807\u7684\uFF0C\u5BBD\u9AD8\u62A5\u6536\u8D77\u524D\u7684\u5916\u6846\uFF08\u6CA1\u91CF\u5230 = style \u91CC\u7684\u5BBD\u9AD8 + \u8FB9\u6846\uFF1B\u90FD\u6CA1\u6709 = \u9ED8\u8BA4 280 \u00D7 320\uFF09\n            const w = this._restoreSize?.w ?? (parseFloat(this.style.width) || 280) + 2, h = this._restoreSize?.h ?? (parseFloat(this.style.height) || 320) + 2;\n            return { left: r.left, top: r.top, width: w, height: h };\n        }\n        return { left: r.left, top: r.top, width: r.width, height: r.height };\n    }\n    set rect(o) {\n        if (o && o.left != null && o.top != null) {\n            // v268b\uFF1A\u65E7\u7684(\u6216\u8D8A\u754C\u7684)\u6301\u4E45\u5316\u4F4D\u7F6E\u94B3\u8FDB\u5B89\u5168\u533A\uFF08iPad \u9876\u90E8\u65E5\u671F\u680F + \u5DE6\u4FA7\u5DE5\u5177\u680F\uFF09\n            this.style.left = Math.max(CLAMP_MIN_LEFT, o.left) + \"px\";\n            this.style.top = Math.max(CLAMP_MIN_TOP, this.topFloor, o.top) + \"px\";\n            if (o.width)\n                this.style.width = o.width + \"px\";\n            if (o.height)\n                this.style.height = o.height + \"px\";\n            if (this.minimized && o.width && o.height)\n                this._restoreSize = null; // \u5BBF\u4E3B\u6536\u7740\u7684\u65F6\u5019\u704C\u4E86\u65B0\u5927\u5C0F\uFF1A\u4EE5 style \u4E3A\u51C6\n            this._clampIntoViewport(); // \u8D8A\u754C\u6301\u4E45\u5316\uFF08\u5927\u5C4F\u5B58\u5C0F\u5C4F\u5F00\uFF09\uFF1A\u53F3/\u4E0B\u8FB9\u540C\u6837\u94B3\u56DE\uFF08\u672A open \u65F6 _afterShow \u515C\uFF09\n        }\n        else if (!this.style.left || !this.style.top) {\n            this.style.left = SPAWN_LEFT + \"px\";\n            this.style.top = SPAWN_TOP + \"px\";\n        }\n    }\n    set labels(l) {\n        this._labels = { ...this._labels, ...l };\n        this._menu?.refresh(); // \u83DC\u5355\u6587\u6848\u7531 items() \u73B0\u7B97\uFF08\u5F00\u7740\u5C31\u91CD\u7ED8\uFF09\n        const setTitle = (sel, title, aria) => {\n            const b = this.shadowRoot.querySelector(sel);\n            if (!b)\n                return;\n            if (title)\n                b.title = title;\n            if (aria || title)\n                b.setAttribute(\"aria-label\", aria || title);\n        };\n        setTitle(\".plus\", l.menu);\n        setTitle(\".close\", l.closeWin);\n        setTitle(\".move\", l.move);\n        setTitle('[data-page=\"-1\"]', l.prev);\n        setTitle('[data-page=\"1\"]', l.next);\n        setTitle(\"[data-jump]\", l.jump);\n        setTitle(\".grip\", l.resize, l.resizeAria);\n        setTitle(\".bubble\", l.restore); // 0.4.2\uFF1A\u6536\u8D77\u540E\u7684\u5C0F\u56FE\u6807\uFF080.4.1 \u6F0F\u6302\u4E86\uFF1B\u6CA1\u7ED9 = \u6A21\u677F\u91CC\u7684\u82F1\u6587\u9ED8\u8BA4\uFF09\n        setTitle(\".vprev\", l.prevFrame);\n        setTitle(\".vnext\", l.nextFrame); // 0.5.0 \u89C6\u9891\u5361\n    }\n    // ---- \u591A\u53C2\u8003\u5185\u5BB9 API\uFF08\u5BBF\u4E3B\u704C\u6CE8\uFF1B\u7A0B\u5E8F\u6027\uFF0C\u4E0D\u53D1\u4E8B\u4EF6\uFF09----\n    /** \u6574\u8868\u66FF\u6362\uFF08load \u6062\u590D\u7528\uFF09\u3002\u65E7 image bitmap \u5168\u90E8\u91CA\u653E\u3002 */\n    setItems(items, index = 0) {\n        this._closeAllBitmaps();\n        const ids = this._mute(() => this._deck.restore({\n            index,\n            cards: items.map((it) => it.kind === \"image\"\n                ? { kind: \"image\", bytes: it.blob, mime: it.blob?.type ?? \"\", vp: it.vp }\n                : { kind: \"live\", vp: it.vp }),\n        }));\n        items.forEach((it, i) => { if (it.kind === \"image\")\n            this._bitmaps.set(ids[i], it.bitmap); });\n        this._shownId = this._deck.current?.id ?? null;\n        this._loadCurrentVp({ fitIfMissing: true });\n        this._afterItemsChanged();\n    }\n    /** \u8FFD\u52A0\u4E00\u5F20\u56FE\u5E76\u7FFB\u5230\u5B83\uFF08\u5BFC\u5165\u6F0F\u6597\u5C3E\uFF09\u3002 */\n    addImage(bitmap, blob, opts) {\n        this._saveCurrentVp();\n        const id = this._mute(() => this._deck.add({ kind: \"image\", bytes: blob, mime: blob?.type ?? \"\", name: opts?.name ?? \"\", origin: opts?.origin ?? null }));\n        this._bitmaps.set(id, bitmap);\n        this._shownId = id;\n        this._loadCurrentVp({ fitIfMissing: true });\n        this._afterItemsChanged();\n    }\n    /** \u8FFD\u52A0\u4E00\u5F20\u6587\u5B57\u5361\u5E76\u7FFB\u5230\u5B83\uFF080.3.0\uFF09\u3002name \u7F3A\u7701\u53D6\u9996\u884C\u3002 */\n    addText(text, opts) {\n        this._saveCurrentVp();\n        const mime = opts?.mime ?? \"text/plain\";\n        const id = this._mute(() => this._deck.add({ kind: \"text\", bytes: new Blob([text], { type: mime }), mime, name: opts?.name ?? \"\", origin: opts?.origin ?? null }));\n        this._texts.set(id, text);\n        this._shownId = id;\n        this._loadCurrentVp({ fitIfMissing: true });\n        this._afterItemsChanged();\n    }\n    /** \u753B\u5E03\u955C\u50CF\u9875\uFF1A\u5DF2\u6709 \u2192 \u7FFB\u8FC7\u53BB\uFF1B\u6CA1\u6709 \u2192 \u8FFD\u52A0\u5E76\u7FFB\u5230\uFF08liveProvider \u7F3A\u5E2D = no-op\uFF09\u3002 */\n    showLive(target = null, name = \"\") {\n        if (!this.liveProvider)\n            return;\n        const i = this._deck.cards().findIndex((c) => c.kind === \"live\" && (c.target ?? null) === target);\n        this._saveCurrentVp();\n        this._mute(() => { if (i >= 0)\n            this._deck.select(i);\n        else\n            this._deck.add({ kind: \"live\", target, name }); });\n        this._shownId = this._deck.current?.id ?? null;\n        this._liveDirty = true;\n        this._loadCurrentVp({ fitIfMissing: true });\n        this._afterItemsChanged();\n    }\n    /** \u6E05\u7A7A\uFF08\u6362\u753B/\u91CD\u7F6E\uFF09\u3002 */\n    clearAll() {\n        this._closeAllBitmaps();\n        this._mute(() => this._deck.clear());\n        this._shownId = null;\n        this._stopLiveTimer();\n        this._afterItemsChanged();\n    }\n    /** \u5BBF\u4E3B\u8BFB\u8D70\u5168\u90E8\u72B6\u6001\uFF08desk \u540C\u6B65 + \u4FDD\u5B58\u6536\u96C6\uFF09\u3002\u5F53\u524D\u9875 vp \u5148\u56DE\u5199\u3002 */\n    getRefState() {\n        this._saveCurrentVp();\n        return {\n            index: this._deck.index,\n            items: this._deck.cards().map((c) => c.kind === \"live\"\n                ? { kind: \"live\", vp: c.vp ? { ...c.vp } : null }\n                : { kind: \"image\", blob: c.bytes, vp: c.vp ? { ...c.vp } : null }),\n        };\n    }\n    get itemCount() { return this._deck.size; }\n    fitToPanel() {\n        const src = this._sourceSize();\n        if (!src)\n            return;\n        const bw = this._canvas.width / (window.devicePixelRatio || 1);\n        const bh = this._canvas.height / (window.devicePixelRatio || 1);\n        if (src.w <= 0 || src.h <= 0 || bw <= 0 || bh <= 0)\n            return;\n        const s = Math.min(bw / src.w, bh / src.h) * 0.95;\n        this._vp = { tx: bw / 2, ty: bh / 2, scale: s, rot: 0 };\n        this._saveCurrentVp();\n        this._emitViewport(); // \u72B6\u6001\u771F\u53D8\uFF08\u53CC\u51FB\u9002\u5E94/\u8F7D\u56FE\u81EA\u9002\u5E94\uFF09\u2192 \u5BBF\u4E3B\u8BE5\u6301\u4E45\u5316\uFF1B\u975E\u5C5E\u6027\u56DE\u704C\n        this._invalidate();\n    }\n    /** 1:1 \u50CF\u7D20\uFF08user 0830\uFF09\uFF1A1 \u56FE\u50CF\u7D20 = 1 **\u8BBE\u5907**\u50CF\u7D20\uFF08\u50CF\u7D20\u56FE\u6807\u771F\u9762\u76EE\uFF1Bscale=1/dpr\uFF09\u3001\u6446\u6B63\uFF08rot=0\uFF09\u3001\n     *  \u5F53\u524D\u753B\u5E03\u4E2D\u5FC3\u7684\u56FE\u70B9\u4FDD\u6301\u951A\u5B9A\u3002\u83DC\u5355\u9879\u89E6\u53D1 = \u7528\u6237\u4EA4\u4E92 \u2192 \u53D1\u4E8B\u4EF6\u3002 */\n    oneToOne() {\n        const src = this._sourceSize();\n        if (!src)\n            return;\n        const dpr = window.devicePixelRatio || 1;\n        const bw = this._canvas.width / dpr, bh = this._canvas.height / dpr;\n        const ip = screenToImg(bw / 2, bh / 2, this._vp); // \u951A\uFF1A\u5F53\u524D\u5728\u753B\u5E03\u4E2D\u5FC3\u7684\u56FE\u70B9\n        const scale = 1 / dpr;\n        const t = solveAnchorTranslation(ip, scale, 0, bw / 2, bh / 2);\n        this._vp = { tx: t.tx, ty: t.ty, scale, rot: 0 };\n        this._containVp();\n        this._saveCurrentVp();\n        this._emitViewport();\n        this._invalidate();\n    }\n    // \u7F29\u653E\u754C\u9650\uFF1A\u653E\u5927\u9876 MAX_SCALE\uFF1B\u7F29\u5C0F\u5230\u957F\u8FB9\u663E\u793A \u2265 MIN_VISIBLE_PX \u5373\u6B62\uFF08\u5C0F\u56FE\u4E0D\u8BBE\u9650\u5230 1:1 \u4E4B\u4E0A\uFF09\u3002\n    _scaleBounds() {\n        const src = this._sourceSize();\n        const lo = src ? Math.min(1, MIN_VISIBLE_PX / Math.max(src.w, src.h)) : 0.02;\n        return { lo, hi: MAX_SCALE };\n    }\n    // \u5E73\u79FB\u62A4\u680F\uFF1A\u56FE\u7684\uFF08\u65CB\u8F6C\u540E\uFF09bbox \u4E0E\u753B\u5E03\u4FDD \u2265keep \u91CD\u53E0\u2014\u2014\u56FE\u6C38\u8FDC\u627E\u5F97\u56DE\u6765\uFF1Bkeep \u5BF9\u5C0F\u56FE/\u5C0F\u7A97\u81EA\u9002\u5E94\u6536\u7F29\u3002\n    _containVp() {\n        const src = this._sourceSize();\n        if (!src)\n            return;\n        const dpr = window.devicePixelRatio || 1;\n        const cw = this._canvas.width / dpr, ch = this._canvas.height / dpr;\n        if (!(cw > 0) || !(ch > 0))\n            return;\n        const v = this._vp;\n        const c = Math.abs(Math.cos(v.rot)), s = Math.abs(Math.sin(v.rot));\n        const halfW = ((src.w * c + src.h * s) / 2) * v.scale;\n        const halfH = ((src.w * s + src.h * c) / 2) * v.scale;\n        const keepX = Math.min(PAN_KEEP_PX, halfW, cw / 2);\n        const keepY = Math.min(PAN_KEEP_PX, halfH, ch / 2);\n        v.tx = clamp(v.tx, keepX - halfW, cw - keepX + halfW);\n        v.ty = clamp(v.ty, keepY - halfH, ch - keepY + halfH);\n    }\n    // \u5BBF\u4E3B\u5728 doc \u50CF\u7D20/\u7ED3\u6784\u53D8\u5316\u65F6\u8C03\uFF08\u7EC4\u4EF6\u4E0D\u76D1\u542C\u5BBF\u4E3B\u5168\u5C40\u4E8B\u4EF6\uFF09\u3002\u771F\u5408\u6210\u5728 _render \u91CC\u6309\u810F\u6807+\u8282\u6D41\u505A\u3002\n    //   target \u4E0D\u7ED9 = \u300C\u6709\u4E1C\u897F\u53D8\u4E86\u300D\uFF08WeebPaint \u73B0\u6709\u7528\u6CD5\uFF09\uFF1B\u7ED9\u4E86 = \u53EA\u6709\u90A3\u4E00\u4E2A\u753B\u9762\u53D8\u4E86\uFF0C\u5F53\u524D\u770B\u7684\u4E0D\u662F\u5B83\u5C31\u4E0D\u7406\u3002\n    markLiveDirty(target) {\n        if (!this.live)\n            return;\n        if (target !== undefined && (this._deck.current?.target ?? null) !== target)\n            return;\n        this._liveDirty = true;\n        this._invalidate();\n    }\n    // ---- \u51FA\u5411\u4E8B\u4EF6 ----\n    _emit(name, detail) {\n        this.dispatchEvent(new CustomEvent(name, { detail }));\n    }\n    _emitViewport() { this._emit(\"viewportchange\", { ...this._vp }); }\n    _emitRect() { this._emit(\"rectchange\", this.rect); }\n    _emitItems() { this._emit(\"itemschange\", { index: this._deck.index, count: this._deck.size }); }\n    // ---- \u5185\u90E8\uFF1Aitem \u5207\u6362 ----\n    _saveCurrentVp() {\n        const cur = this._deck.current;\n        if (cur)\n            this._mute(() => this._deck.setView(cur.id, this._vp));\n    }\n    _loadCurrentVp(opts) {\n        const cur = this._deck.current;\n        if (!cur)\n            return;\n        if (cur.vp)\n            this._vp = { ...cur.vp };\n        else if (opts.fitIfMissing) {\n            // \u753B\u5E03\u53EF\u80FD\u8FD8\u6CA1 size\uFF08\u7A97\u672A\u5F00\uFF09\uFF1A\u5148\u7F6E\u5355\u4F4D vp\uFF0C_afterShow/_render \u524D\u518D fit\n            this._vp = { tx: 0, ty: 0, scale: 1, rot: 0 };\n            queueMicrotask(() => { if (!this._deck.current?.vp)\n                this.fitToPanelSilent(); });\n        }\n    }\n    /** fit \u4F46\u4E0D\u53D1\u4E8B\u4EF6\uFF08\u7A0B\u5E8F\u6027\u521D\u59CB\u9002\u5E94\uFF1B\u7528\u6237\u53CC\u51FB\u8D70 fitToPanel\uFF09\u3002 */\n    fitToPanelSilent() {\n        if (this._deck.current?.kind === \"text\") {\n            this._vp = { tx: 0, ty: 0, scale: 1, rot: 0 };\n            this._saveCurrentVp();\n            this._updateTextLayer();\n            return;\n        }\n        const src = this._sourceSize();\n        if (!src)\n            return;\n        const bw = this._canvas.width / (window.devicePixelRatio || 1);\n        const bh = this._canvas.height / (window.devicePixelRatio || 1);\n        if (src.w <= 0 || src.h <= 0 || bw <= 0 || bh <= 0)\n            return;\n        const s = Math.min(bw / src.w, bh / src.h) * 0.95;\n        this._vp = { tx: bw / 2, ty: bh / 2, scale: s, rot: 0 };\n        this._saveCurrentVp();\n        this._invalidate();\n    }\n    _page(delta) {\n        const n = this._deck.size;\n        if (n < 2)\n            return;\n        this._saveCurrentVp();\n        this._mute(() => this._deck.select((this._deck.index + delta + n) % n));\n        this._shownId = this._deck.current?.id ?? null;\n        if (this.live)\n            this._liveDirty = true;\n        this._loadCurrentVp({ fitIfMissing: true });\n        this._afterItemsChanged();\n        this._emitItems(); // \u7528\u6237\u7FFB\u9875 \u2192 \u5BBF\u4E3B\u6301\u4E45\u5316 index\n    }\n    /** \u7528\u6237\u628A\u5F53\u524D\u8FD9\u5F20\u5361\u632A\u4E00\u4F4D\u3002\u8FD8\u5728\u770B\u8FD9\u5F20\u5361\uFF0C\u53EA\u662F\u5B83\u6392\u7684\u4F4D\u7F6E\u53D8\u4E86\u3002 */\n    _moveCurrent(delta) {\n        const cur = this._deck.current;\n        const to = this._deck.index + delta;\n        if (!cur || to < 0 || to >= this._deck.size)\n            return;\n        this._saveCurrentVp();\n        this._mute(() => this._deck.move(cur.id, to));\n        this._afterItemsChanged();\n        this._emitItems(); // \u7528\u6237\u6539\u4E86\u987A\u5E8F \u2192 \u5BBF\u4E3B\u6301\u4E45\u5316\n    }\n    /** \u7528\u6237\u4ECE\u8DF3\u8F6C\u5217\u8868\u91CC\u70B9\u4E86\u7B2C i \u5F20\u3002 */\n    _jumpTo(i) {\n        if (i === this._deck.index || i < 0 || i >= this._deck.size)\n            return;\n        this._saveCurrentVp();\n        this._mute(() => this._deck.select(i));\n        this._shownId = this._deck.current?.id ?? null;\n        if (this.live)\n            this._liveDirty = true;\n        this._loadCurrentVp({ fitIfMissing: true });\n        this._afterItemsChanged();\n        this._emitItems();\n    }\n    _cardLabel(c, i) {\n        const firstLine = c.kind === \"text\" ? (this._texts.get(c.id) ?? \"\").split(\"\\n\").find((l) => l.trim())?.trim().slice(0, 24) : \"\";\n        const name = c.name || firstLine || this._labels.kindNames?.[c.kind] || c.kind;\n        return `${i + 1}  ${name}`;\n    }\n    _deleteCurrent() {\n        const cur = this._deck.current;\n        if (!cur)\n            return;\n        this._bitmaps.get(cur.id)?.close?.();\n        this._bitmaps.delete(cur.id);\n        this._mute(() => this._deck.remove(cur.id));\n        this._shownId = this._deck.current?.id ?? null;\n        if (this.live)\n            this._liveDirty = true;\n        this._loadCurrentVp({ fitIfMissing: true });\n        this._afterItemsChanged();\n        this._emitItems(); // \u7528\u6237\u5220\u9664 \u2192 \u5BBF\u4E3B\u6301\u4E45\u5316\n    }\n    // ---- \u724C\u7EC4 \u21C4 \u89C6\u56FE ----\n    /** \u81EA\u5DF1\u6539\u724C\u7EC4\u7684\u90A3\u4E00\u4E0B\u4E0D\u542C\u81EA\u5DF1\u7684\u56DE\u58F0\u3002\u522B\u7684\u76D1\u542C\u8005\uFF08\u5BBF\u4E3B\u3001VR \u89C6\u56FE\uFF09\u7167\u5E38\u6536\u5230\u3002 */\n    _mute(fn) {\n        const was = this._muted;\n        this._muted = true;\n        try {\n            return fn();\n        }\n        finally {\n            this._muted = was;\n        }\n    }\n    _closeAllBitmaps() {\n        for (const bm of this._bitmaps.values())\n            bm.close?.();\n        this._bitmaps.clear();\n        this._texts.clear();\n        this._linked.clear();\n        this._linkMissing.clear();\n        this._stopVideo(); // \u6574\u526F\u724C\u6362\u4E86\uFF1A\u89C6\u9891\u8DDF\u7740\u5361\u8D70\n    }\n    /** \u522B\u4EBA\uFF08\u5BBF\u4E3B\u76F4\u63A5\u7528 .deck\u3001\u6216\u5171\u7528\u8FD9\u526F\u724C\u7684\u53E6\u4E00\u4E2A\u89C6\u56FE\uFF09\u6539\u4E86\u724C\u7EC4\u3002 */\n    _onDeckChange(what) {\n        if (this._muted)\n            return;\n        if (what.type === \"invalidate\") {\n            const c = this._deck.get(what.id);\n            if (c?.kind === \"live\") {\n                if (this._deck.current?.id === what.id)\n                    this.markLiveDirty();\n                return;\n            }\n            // \u94FE\u63A5\u5361\uFF1A\u5185\u5BB9\u53D8\u4E86 \u2192 \u6254\u6389\u624B\u4E0A\u90A3\u4EFD\uFF0C\u91CD\u65B0\u5411\u5BBF\u4E3B\u8981\n            if (c && !c.bytes && c.target) {\n                this._linked.delete(c.id);\n                this._linkMissing.delete(c.id);\n                this._texts.delete(c.id);\n                this._bitmaps.get(c.id)?.close?.();\n                this._bitmaps.delete(c.id);\n                if (this._videoOf === c.id)\n                    this._stopVideo(); // 0.5.0\uFF1A\u94FE\u63A5\u89C6\u9891\u5361\u5185\u5BB9\u53D8\u4E86 \u2192 \u62FF\u6389\u65E7 <video>\uFF0C\u53D6\u56DE\u65B0\u5B57\u8282\u540E\u91CD\u65B0\u88C5\uFF08\u4E0D\u63A5\u7740\u653E\u65E7\u7684\uFF09\n            }\n        }\n        this._syncFromDeck();\n    }\n    /** \u628A\u89C6\u56FE\u5BF9\u9F50\u5230\u724C\u7EC4\u73B0\u72B6\u3002\u5E42\u7B49\uFF1A\u724C\u7EC4\u6CA1\u53D8\u5C31\u4EC0\u4E48\u90FD\u4E0D\u505A\u3002 */\n    _syncFromDeck() {\n        for (const [id, bm] of this._bitmaps) {\n            if (this._deck.indexOf(id) < 0) {\n                bm.close?.();\n                this._bitmaps.delete(id);\n            }\n        }\n        for (const m of [this._texts, this._linked])\n            for (const id of [...m.keys()])\n                if (this._deck.indexOf(id) < 0)\n                    m.delete(id);\n        for (const id of [...this._linkMissing])\n            if (this._deck.indexOf(id) < 0)\n                this._linkMissing.delete(id);\n        if (this._audioOf && this._deck.indexOf(this._audioOf) < 0)\n            this._stopAudio(); // \u6B63\u5728\u653E\u7684\u90A3\u5F20\u88AB\u5220\u4E86 = \u505C\n        if (this._videoOf && this._deck.indexOf(this._videoOf) < 0)\n            this._stopVideo();\n        for (const c of this._deck.cards()) {\n            if (c.kind === \"live\")\n                continue;\n            const bytes = c.bytes ?? this._linked.get(c.id) ?? null;\n            if (!bytes) {\n                if (c.target && !this._linkMissing.has(c.id) && !this._resolving.has(c.id))\n                    this._resolveLink(c);\n                continue;\n            }\n            if (c.kind === \"image\" && !this._bitmaps.has(c.id) && !this._decoding.has(c.id))\n                this._decode(c, bytes);\n            else if (c.kind === \"text\" && !this._texts.has(c.id) && !this._decoding.has(c.id))\n                this._decodeText(c, bytes);\n        }\n        const cur = this._deck.current;\n        if ((cur?.id ?? null) !== this._shownId) {\n            this._shownId = cur?.id ?? null;\n            if (cur?.kind === \"live\")\n                this._liveDirty = true;\n            this._loadCurrentVp({ fitIfMissing: true });\n        }\n        else if (cur?.vp) {\n            const a = cur.vp, b = this._vp;\n            if (a.tx !== b.tx || a.ty !== b.ty || a.scale !== b.scale || a.rot !== b.rot)\n                this._vp = { ...a };\n        }\n        this._afterItemsChanged();\n    }\n    /** \u53EA\u7ED9\u4E86\u5B57\u8282\u6CA1\u7ED9\u4F4D\u56FE\u7684\u56FE\u7247\u5361\uFF08\u5BBF\u4E3B\u76F4\u63A5\u5F80\u724C\u7EC4\u91CC\u52A0\u7684\uFF09\uFF1A\u8FD9\u91CC\u89E3\u3002\u89E3\u4E0D\u51FA\u6765\u8981\u8BF4\uFF0C\u4E0D\u8BB8\u88C5\u6CA1\u4E8B\u3002 */\n    _decode(c, bytes) {\n        if (typeof createImageBitmap !== \"function\")\n            return;\n        this._decoding.add(c.id);\n        createImageBitmap(bytes).then((bm) => {\n            this._decoding.delete(c.id);\n            if (this._deck.indexOf(c.id) < 0 || this._bitmaps.has(c.id)) {\n                bm.close?.();\n                return;\n            }\n            this._bitmaps.set(c.id, bm);\n            if (this._deck.current?.id === c.id) {\n                if (!this._deck.current.vp)\n                    this.fitToPanelSilent();\n                this._invalidate();\n            }\n        }, (e) => {\n            this._decoding.delete(c.id);\n            this._emit(\"notice\", { level: \"error\", code: \"decode-failed\", id: c.id, name: c.name, message: String(e?.message ?? e) });\n        });\n    }\n    _decodeText(c, bytes) {\n        this._decoding.add(c.id);\n        bytes.text().then((text) => {\n            this._decoding.delete(c.id);\n            if (this._deck.indexOf(c.id) < 0)\n                return;\n            this._texts.set(c.id, text);\n            if (this._deck.current?.id === c.id)\n                this._afterItemsChanged();\n        }, (e) => {\n            this._decoding.delete(c.id);\n            this._emit(\"notice\", { level: \"error\", code: \"decode-failed\", id: c.id, name: c.name, message: String(e?.message ?? e) });\n        });\n    }\n    /** \u94FE\u63A5\u5361\uFF1A\u5411\u5BBF\u4E3B\u8981\u5185\u5BB9\u3002\u8981\u4E0D\u5230 \u2192 \u8BB0\u4E0B\u300C\u7F3A\u300D\uFF0C\u5361\u4E0A\u5982\u5B9E\u5199\uFF1B\u5BBF\u4E3B invalidate \u540E\u518D\u8981\u3002 */\n    _resolveLink(c) {\n        if (!this.linkProvider || !c.target) {\n            this._linkMissing.add(c.id);\n            if (this._deck.current?.id === c.id)\n                this._afterItemsChanged();\n            return;\n        }\n        this._resolving.add(c.id);\n        Promise.resolve().then(() => this.linkProvider(c.target, c.kind)).then((blob) => {\n            this._resolving.delete(c.id);\n            if (this._deck.indexOf(c.id) < 0)\n                return;\n            if (blob)\n                this._linked.set(c.id, blob);\n            else\n                this._linkMissing.add(c.id);\n            this._syncFromDeck();\n        }, (e) => {\n            this._resolving.delete(c.id);\n            this._linkMissing.add(c.id);\n            this._emit(\"notice\", { level: \"error\", code: \"link-failed\", id: c.id, name: c.name, target: c.target, message: String(e?.message ?? e) });\n            this._syncFromDeck();\n        });\n    }\n    _afterItemsChanged() {\n        if (!this.live)\n            this._stopLiveTimer();\n        this._updateEmptyHint();\n        this._updateChips();\n        this._updateTextLayer();\n        this._updateAudioLayer();\n        this._updateVideoLayer();\n        this._invalidate();\n    }\n    /** \u6587\u5B57\u5361\uFF1A\u5185\u5BB9\u5C42\u663E\u793A / \u9690\u85CF + \u704C\u5185\u5BB9 + \u5B57\u53F7 + \u6EDA\u52A8\u4F4D\u7F6E\u3002 */\n    _updateTextLayer() {\n        const cur = this._deck.current;\n        const hole = !!cur && cur.kind !== \"audio\" && cur.kind !== \"live\" && !!cur.ram && !cur.bytes; // \u300C\u53EA\u653E\u5185\u5B58\u300D\u7684\u7A7A\u4F4D\uFF08\u56FE\u7247 / \u6587\u5B57\uFF09\uFF1A\u8FD9\u4E00\u5C42\u5199\u4E00\u53E5\u8BDD\n        const isText = cur?.kind === \"text\" || hole;\n        this._textEl.classList.toggle(\"shown\", isText);\n        this._canvas.style.visibility = isText || cur?.kind === \"audio\" ? \"hidden\" : \"\";\n        if (!isText || !cur)\n            return;\n        if (hole) {\n            this._textEl.classList.add(\"missing\");\n            const content = `${cur.name || this._labels.kindNames?.[cur.kind] || cur.kind} \u00B7 ${fmtBytes(cur.ram.bytes)}\\n${this._ramMissingText()}`;\n            if (this._textEl.textContent !== content)\n                this._textEl.textContent = content;\n            return;\n        }\n        const text = this._texts.get(cur.id);\n        const missing = text === undefined && this._linkMissing.has(cur.id);\n        this._textEl.classList.toggle(\"missing\", missing);\n        const content = text ?? (missing ? (this._labels.linkMissing ?? \"Content unavailable\") : \"\");\n        if (this._textEl.textContent !== content)\n            this._textEl.textContent = content;\n        this._textEl.style.setProperty(\"--ref-text-scale\", String(this._vp.scale));\n        // \u6EDA\u52A8\u4F4D\u7F6E\uFF1A\u5185\u5BB9\u521A\u704C\u8FDB\u53BB\u65F6 scrollHeight \u8FD8\u6CA1\u957F\u51FA\u6765\uFF0C\u4E0B\u4E00\u5E27\u518D\u5BF9\n        const ty = this._vp.ty;\n        if (Math.abs(this._textEl.scrollTop - ty) > 0.5)\n            requestAnimationFrame(() => { if (this._deck.current?.id === cur.id)\n                this._textEl.scrollTop = ty; });\n    }\n    _updateChips() {\n        const n = this._deck.size;\n        this._chipsEl.classList.toggle(\"hidden\", n < 2);\n        if (n >= 2)\n            this._chipCountEl.textContent = `${this._deck.index + 1}/${n}`;\n    }\n    _sourceSize() {\n        const cur = this._deck.current;\n        if (!cur)\n            return null;\n        if (cur.kind === \"live\") {\n            this._dropLiveIfOther(cur);\n            if (!this._liveSource && this.liveProvider)\n                this._takeLiveFrame(cur);\n            return this._liveSource ? this._liveSize : null;\n        }\n        if (cur.kind === \"video\") {\n            const v = this._video;\n            return v && this._videoOf === cur.id && v.videoWidth > 0 ? { w: v.videoWidth, h: v.videoHeight } : null; // \u8FD8\u6CA1\u5230\u7B2C\u4E00\u5E27 \u2192 \u6682\u65F6\u6CA1\u6709\u5C3A\u5BF8\n        }\n        const bm = this._bitmaps.get(cur.id);\n        return bm ? { w: bm.width, h: bm.height } : null; // \u8FD8\u5728\u89E3 \u2192 \u6682\u65F6\u6CA1\u6709\u5C3A\u5BF8\n    }\n    // ---- \u5185\u90E8\uFF1A\u663E\u793A/\u7ED1\u5B9A ----\n    _afterShow() {\n        if (!this.style.left || !this.style.top) {\n            this.style.left = SPAWN_LEFT + \"px\";\n            this.style.top = SPAWN_TOP + \"px\";\n        }\n        this._clampIntoViewport(); // \u5F00\u7A97\u5373\u94B3\uFF08restore \u7684\u8D8A\u754C\u4F4D\u7F6E\u5728 display:none \u671F\u94B3\u4E0D\u4E86\uFF09\n        this._resizeCanvasToBody();\n        this._updateEmptyHint();\n        this._updateChips();\n        if (this.live)\n            this._liveDirty = true; // \u91CD\u65B0\u6253\u5F00 = \u9ED8\u8BA4\u91CD\u753B\u4E00\u6B21\n        // \u7A97\u5173\u7740\u65F6\u704C\u5165\u7684 item \u6CA1\u6CD5 fit\uFF08canvas \u96F6\u5C3A\u5BF8\uFF09\u2192 \u5F00\u7A97\u8865\u4E00\u6B21\u9759\u9ED8\u9002\u5E94\n        if (this._deck.current && !this._deck.current.vp)\n            this.fitToPanelSilent();\n        this._pokeIdle();\n        this._invalidate();\n    }\n    _bind(root) {\n        // \uFF0B = \u7EAF\u83DC\u5355\u94AE\uFF080830\uFF1A\u517C\u62D6\u628A\u300C\u5F88\u5947\u602A\u300D\u2192 \u62D6\u5F52\u5DE6\u4E0A\u89D2\u70B9\u9635\u628A\u624B .move\uFF09\n        this._plusEl.addEventListener(\"click\", () => this._toggleMenu());\n        // \u00D7\uFF082026-09-11 \u4ECE\u83DC\u5355\u63D0\u51FA\u6765\uFF09\uFF1A\u7528\u6237\u4EA4\u4E92\u5173\u7A97 \u2192 \u53D1 openchange\uFF08\u5BBF\u4E3B\u5199 desk + \u540C\u6B65\u4E3B\u83DC\u5355 toggle \u6001\uFF09\n        root.querySelector(\".close\").addEventListener(\"click\", () => { this.open = false; this._emit(\"openchange\", { open: false }); });\n        // \u5DE6\u4E0A\u89D2\u5706\u94AE\uFF080.4.3\uFF09\uFF1A\u6309\u4F4F\u62D6\u8FC7 4 px = \u62D6\u6574\u7A97\uFF08\u94B3\u5728\u89C6\u53E3\u5185\uFF09\uFF1B\u6CA1\u62D6\u5C31\u677E\u624B = \u7F29\u6210\u5C0F\u56FE\u6807\uFF08\u540C \uFF0B \u83DC\u5355\u90A3\u4E00\u9879\uFF0C\u53D1 minimizechange\uFF09\uFF1B\u952E\u76D8\u56DE\u8F66 / \u7A7A\u683C\u540C\u70B9\u4E00\u4E0B\n        const move = root.querySelector(\".move\");\n        move.addEventListener(\"pointerdown\", (e) => {\n            const r = this.getBoundingClientRect();\n            this._panelDrag = { id: e.pointerId, sx: e.clientX, sy: e.clientY, ol: r.left, ot: r.top, moved: false };\n            try {\n                move.setPointerCapture(e.pointerId);\n            }\n            catch { }\n            e.preventDefault();\n        });\n        move.addEventListener(\"pointermove\", (e) => {\n            const d = this._panelDrag;\n            if (!d || e.pointerId !== d.id)\n                return;\n            if (!d.moved && Math.hypot(e.clientX - d.sx, e.clientY - d.sy) < 4)\n                return; // \u624B\u6296\u4E0D\u7B97\u62D6\uFF08\u677E\u624B = \u70B9\uFF09\n            d.moved = true;\n            const w = this.offsetWidth, h = this.offsetHeight;\n            const left = clamp(d.ol + (e.clientX - d.sx), 0, window.innerWidth - w);\n            const top = clamp(d.ot + (e.clientY - d.sy), this.topFloor, Math.max(this.topFloor, window.innerHeight - this.bottomFloor - h));\n            this.style.left = left + \"px\";\n            this.style.top = top + \"px\";\n            this._emitRect();\n        });\n        const endMove = (e) => {\n            const d = this._panelDrag;\n            if (d && e.pointerId === d.id) {\n                try {\n                    move.releasePointerCapture(e.pointerId);\n                }\n                catch { }\n                this._panelDrag = null;\n                if (e.type === \"pointerup\" && !d.moved)\n                    this._setMinimizedByUser(true);\n            }\n        };\n        move.addEventListener(\"pointerup\", endMove);\n        move.addEventListener(\"pointercancel\", endMove);\n        move.addEventListener(\"click\", (e) => { if (e.detail === 0)\n            this._setMinimizedByUser(true); }); // \u952E\u76D8\uFF08detail 0\uFF09\uFF1B\u9F20\u6807 / \u89E6\u5C4F\u7684\u70B9\u5728 pointerup \u91CC\u5904\u7406\u8FC7\u4E86\n        // 0.4.1 \u6536\u8D77\u540E\u7684\u5C0F\u56FE\u6807\uFF1A\u6309\u4E0B\u62D6\u8FC7 4 px = \u632A\u4F4D\u7F6E\uFF08\u94B3\u5728\u89C6\u53E3\u5185\uFF0C\u53D1 rectchange\u2014\u2014\u5BBF\u4E3B\u5B58\u7684\u5BBD\u9AD8\u4E0D\u53D8\uFF0C\u89C1 rect getter\uFF09\uFF1B\u6CA1\u62D6\u5C31\u677E\u624B = \u6062\u590D\u3002\n        const bubble = root.querySelector(\".bubble\");\n        let bub = null;\n        bubble.addEventListener(\"pointerdown\", (e) => {\n            const r = this.getBoundingClientRect();\n            bub = { id: e.pointerId, sx: e.clientX, sy: e.clientY, ol: r.left, ot: r.top, moved: false };\n            try {\n                bubble.setPointerCapture(e.pointerId);\n            }\n            catch { }\n            e.preventDefault();\n        });\n        bubble.addEventListener(\"pointermove\", (e) => {\n            if (!bub || e.pointerId !== bub.id)\n                return;\n            const dx = e.clientX - bub.sx, dy = e.clientY - bub.sy;\n            if (!bub.moved && Math.hypot(dx, dy) < 4)\n                return;\n            bub.moved = true;\n            const w = this.offsetWidth, h = this.offsetHeight;\n            this.style.left = clamp(bub.ol + dx, 0, window.innerWidth - w) + \"px\";\n            this.style.top = clamp(bub.ot + dy, this.topFloor, Math.max(this.topFloor, window.innerHeight - this.bottomFloor - h)) + \"px\";\n            this._emitRect();\n        });\n        const endBubble = (e) => {\n            if (!bub || e.pointerId !== bub.id)\n                return;\n            try {\n                bubble.releasePointerCapture(e.pointerId);\n            }\n            catch { }\n            const tap = !bub.moved && e.type === \"pointerup\";\n            bub = null;\n            if (tap)\n                this._setMinimizedByUser(false);\n        };\n        bubble.addEventListener(\"pointerup\", endBubble);\n        bubble.addEventListener(\"pointercancel\", endBubble);\n        // \u83DC\u5355 = ui/popup-menu \u6DF1\u6A21\u5757\uFF08\u6302 body\uFF1B\u5916\u70B9\u5173 + \u541E\u6389\u90A3\u4E00\u51FB + Escape \u90FD\u5728\u6A21\u5757\u91CC\uFF09\u3002\u8FD9\u91CC\u53EA\u5269\u95F2\u7F6E\u8BA1\u65F6\u3002\n        root.addEventListener(\"pointerdown\", () => this._pokeIdle(), { capture: true });\n        root.addEventListener(\"pointermove\", () => this._pokeIdle(), { capture: true, passive: true });\n        // \u80FD\u60AC\u505C\u7684\u8BBE\u5907\uFF08\u9F20\u6807 / \u5E26\u60AC\u505C\u7684\u7B14\uFF1BiPad \u89E6\u5C4F\u4E3B\u6307\u9488 = hover:none \u8D70 idle \u6863\uFF09\uFF1A\u6307\u9488\u79BB\u7A97\u5168\u9690\u3001\u8FDB\u7A97\u5373\u73B0\u3002\n        //   \u62D6\u7A97/resize/\u624B\u52BF\u8FDB\u884C\u4E2D\u4E0D\u9690\uFF08capture \u671F\u6307\u9488\u53EF\u80FD\u5728\u7A97\u5916\uFF09\u3002\n        const hoverCapable = typeof matchMedia === \"function\" && matchMedia(\"(hover: hover)\").matches;\n        if (hoverCapable) {\n            this.addEventListener(\"pointerenter\", () => this.classList.remove(\"away\"));\n            this.addEventListener(\"pointerleave\", () => {\n                if (this._panelDrag || this._resizeDrag || this._pointers.size > 0)\n                    return;\n                this.classList.add(\"away\");\n            });\n        }\n        // \u7FFB\u9875 chips\uFF1B\u4E2D\u95F4\u7684\u8BA1\u6570\u662F\u8DF3\u8F6C\u5217\u8868\u7684\u5165\u53E3\n        this._chipsEl.addEventListener(\"click\", (e) => {\n            const t = e.target;\n            if (t.closest(\"[data-jump]\")) {\n                this._toggleJump();\n                return;\n            }\n            const b = t.closest(\"[data-page]\");\n            if (b)\n                this._page(parseInt(b.dataset.page, 10));\n        });\n        // \u77A5\u4E00\u773C\u4E0D\u80FD\u6709\u4EE3\u4EF7\uFF08user 2026-09-29 \u540C\u610F\uFF09\uFF1A\u7528\u9F20\u6807 / \u624B\u6307\u70B9\u7A97\u91CC\u7684\u4EFB\u4F55\u4E1C\u897F\uFF0C\u90FD\u4E0D\u8BB8\u628A\u952E\u76D8\u7126\u70B9\u4ECE\u5BBF\u4E3B\u90A3\u91CC\u62FF\u8D70\n        //   \u2014\u2014\u5199\u4F5C app \u91CC\u70B9\u4E00\u4E0B\u53C2\u8003\u7A97\u5C31\u628A\u8F6F\u952E\u76D8\u6536\u4E86\uFF0C\u662F\u5728\u51B7\u542F\u52A8\u65F6\u6DFB\u5835\u3002\u62E6\u7684\u662F\u300C\u6309\u4E0B\u300D\u7684\u9ED8\u8BA4\u884C\u4E3A\uFF08\u632A\u7126\u70B9\u3001\u8D77\u9009\u533A\uFF09\uFF0C\n        //   click \u7167\u5E38\u89E6\u53D1\uFF1B\u7528 Tab \u952E\u8D70\u5230\u8FD9\u4E9B\u6309\u94AE\u4E0A\u4E0D\u53D7\u5F71\u54CD\u3002\u5C06\u6765\u8981\u8BA9\u7528\u6237\u9009\u4E2D\u6587\u5B57\u7684\u5361\uFF0C\u5728\u5185\u5BB9\u4E0A\u6807 data-takes-focus \u653E\u884C\u3002\n        //   **0.3.1\uFF08user 2026-09-30\u300C\u8FD9\u4E2A\u770B focus \u5427\u300D\uFF09**\uFF1A\u7C98\u8D34\u5F52\u7126\u70B9\u2014\u2014\u7A97\u8EAB\uFF08\u753B\u9762 / \u7A7A\u6001 / \u62D6\u628A / \u624B\u67C4\uFF09\u6309\u4E0B\u5C31\u62FF\u7126\u70B9\n        //   \uFF08\u5BBF\u4E3B\u5143\u7D20 tabindex=0\uFF1B\u5BBF\u4E3B\u7684 paste \u76D1\u542C\u770B hasFocus \u5206\u6D41\uFF09\uFF0C\u53EA\u6709\u56DB\u4E2A\u5C0F\u94AE\uFF08\u7FFB\u9875 / \uFF0B / \u00D7\uFF09\u4ECD\u4E0D\u593A\u7126\u70B9\uFF1A\u77A5\u4E00\u773C\u7FFB\u9875\u96F6\u4EE3\u4EF7\u3002\n        const keepHostFocus = (e) => {\n            const t = e.target;\n            if (!t?.closest?.(\"button\"))\n                return; // \u7A97\u8EAB \u2192 \u8BA9\u6D4F\u89C8\u5668\u628A\u7126\u70B9\u843D\u5230 host\uFF08tabindex=0\uFF09\n            e.preventDefault();\n        };\n        root.addEventListener(\"pointerdown\", keepHostFocus);\n        root.addEventListener(\"mousedown\", keepHostFocus);\n        // v134 touch resize \u624B\u67C4\uFF08CSS resize:both \u53EA\u652F\u6301\u9F20\u6807\uFF09\n        const grip = root.querySelector(\".grip\");\n        grip.addEventListener(\"pointerdown\", (e) => {\n            e.preventDefault();\n            e.stopPropagation();\n            try {\n                grip.setPointerCapture(e.pointerId);\n            }\n            catch { }\n            const r = this.getBoundingClientRect();\n            this._resizeDrag = { id: e.pointerId, sx: e.clientX, sy: e.clientY, w0: r.width, h0: r.height, l0: r.left, t0: r.top };\n        });\n        grip.addEventListener(\"pointermove\", (e) => {\n            if (!this._resizeDrag || e.pointerId !== this._resizeDrag.id)\n                return;\n            // \u53F3 / \u4E0B\u8FB9\u4E0D\u51FA\u89C6\u53E3\uFF08\u4E0B\u8FB9\u8FD8\u8981\u7559\u51FA bottomFloor\uFF1A\u628A\u624B\u522B\u7F29\u8FDB\u952E\u76D8\u5E95\u4E0B\uFF09\n            const w = Math.max(MIN_EDGE, Math.min(window.innerWidth - 8 - this._resizeDrag.l0, this._resizeDrag.w0 + (e.clientX - this._resizeDrag.sx)));\n            const h = Math.max(MIN_EDGE, Math.min(window.innerHeight - this.bottomFloor - 8 - this._resizeDrag.t0, this._resizeDrag.h0 + (e.clientY - this._resizeDrag.sy)));\n            this.style.width = w + \"px\";\n            this.style.height = h + \"px\";\n            this._emitRect();\n        });\n        const endResize = (e) => {\n            if (this._resizeDrag && e.pointerId === this._resizeDrag.id) {\n                try {\n                    grip.releasePointerCapture(e.pointerId);\n                }\n                catch { }\n                this._resizeDrag = null;\n            }\n        };\n        grip.addEventListener(\"pointerup\", endResize);\n        grip.addEventListener(\"pointercancel\", endResize);\n        // \u6587\u5B57\u5C42\uFF080.3.0\uFF09\uFF1A\u5355\u6307\u6EDA\u52A8 / \u9009\u5B57\u5F52\u6D4F\u89C8\u5668\uFF1B\u53CC\u6307\u634F\u5408 = \u5B57\u53F7\uFF1Bctrl+\u6EDA\u8F6E = \u5B57\u53F7\uFF1B\u6EDA\u52A8\u4F4D\u7F6E\u8FDB\u724C\u7EC4\uFF08\u4E0D\u6807\u810F\uFF09\n        const tx = this._textEl;\n        tx.addEventListener(\"scroll\", () => {\n            if (this._textScrollRaf != null)\n                return;\n            this._textScrollRaf = requestAnimationFrame(() => {\n                this._textScrollRaf = null;\n                if (this._deck.current?.kind !== \"text\")\n                    return;\n                this._vp.ty = tx.scrollTop;\n                this._saveCurrentVp();\n                this._emitViewport();\n            });\n        }, { passive: true });\n        tx.addEventListener(\"pointerdown\", (e) => {\n            this._textPinch.push({ id: e.pointerId, x: e.clientX, y: e.clientY });\n            if (this._textPinch.length === 2) {\n                const [a, b] = this._textPinch;\n                this._textPinchStart = { dist: Math.hypot(b.x - a.x, b.y - a.y) || 1, scale: this._vp.scale };\n                try {\n                    tx.setPointerCapture(e.pointerId);\n                }\n                catch { }\n                e.preventDefault();\n            }\n        });\n        tx.addEventListener(\"pointermove\", (e) => {\n            const p = this._textPinch.find((q) => q.id === e.pointerId);\n            if (!p)\n                return;\n            p.x = e.clientX;\n            p.y = e.clientY;\n            if (this._textPinch.length >= 2 && this._textPinchStart) {\n                const [a, b] = this._textPinch;\n                const dist = Math.hypot(b.x - a.x, b.y - a.y) || 1;\n                this._setTextScale(this._textPinchStart.scale * (dist / this._textPinchStart.dist));\n                e.preventDefault();\n            }\n        });\n        const endTextPointer = (e) => {\n            this._textPinch = this._textPinch.filter((q) => q.id !== e.pointerId);\n            if (this._textPinch.length < 2)\n                this._textPinchStart = null;\n        };\n        tx.addEventListener(\"pointerup\", endTextPointer);\n        tx.addEventListener(\"pointercancel\", endTextPointer);\n        tx.addEventListener(\"wheel\", (e) => {\n            if (!(e.ctrlKey || e.metaKey))\n                return; // \u666E\u901A\u6EDA\u8F6E = \u6EDA\u52A8\uFF0C\u5F52\u6D4F\u89C8\u5668\n            e.preventDefault();\n            this._setTextScale(this._vp.scale * Math.exp(-e.deltaY * 0.005));\n        }, { passive: false });\n        // \u5185\u90E8\u753B\u5E03\u624B\u52BF\uFF08pan / pinch / rotate / wheel / \u53CC\u51FB\u9002\u5E94 / \u5438\u8272\uFF09\n        this._canvas.addEventListener(\"pointerdown\", (e) => this._onDown(e), { passive: false });\n        this._canvas.addEventListener(\"pointermove\", (e) => this._onMove(e), { passive: false });\n        this._canvas.addEventListener(\"pointerup\", (e) => this._onUp(e), { passive: false });\n        this._canvas.addEventListener(\"pointercancel\", (e) => this._onUp(e), { passive: false });\n        this._canvas.addEventListener(\"wheel\", (e) => this._onWheel(e), { passive: false });\n        this._canvas.addEventListener(\"dblclick\", () => this.fitToPanel());\n        // \u7A97\u53E3\u5927\u5C0F\u53D8 \u2192 \u91CD\u753B\u3002v216\uFF1Acanvas.width \u8D4B\u503C\u7ACB\u5373\u6E05\u7A7A\u753B\u5E03\u2014\u2014\u540C\u6B65 _render \u800C\u975E rAF defer\uFF0C\n        // \u907F\u514D resize \u65F6 1 \u5E27\u7A7A\u767D\u95EA\u5C4F\u3002rectchange \u5728\u8FD9\u91CC\u4E5F\u53D1\uFF08\u684C\u9762 CSS resize:both \u6CA1\u6709\u62D6 handle \u4E8B\u4EF6\uFF0C\n        // RO \u662F\u552F\u4E00\u51FA\u53E3\uFF09\uFF1B\u7A0B\u5E8F\u6027 rect \u4E0B\u704C\u4EA7\u751F\u7684\u56DE\u58F0\u7531\u5BBF\u4E3B\u503C\u6BD4\u8F83\u5438\u6536\u3002\n        const ro = new ResizeObserver(() => {\n            this._clampIntoViewport(); // native CSS resize:both \u6CA1\u6709 handle \u4E8B\u4EF6\u53EF\u94B3 \u2192 \u8FD9\u91CC\u515C\uFF08\u5E42\u7B49\u6536\u655B\uFF09\n            this._resizeCanvasToBody();\n            if (this._raf) {\n                cancelAnimationFrame(this._raf);\n                this._raf = null;\n            }\n            this._render();\n            this._emitRect();\n        });\n        ro.observe(this);\n    }\n    _ramMissingText() { return this._labels.ramMissing ?? \"Kept in memory only, not saved. Drop the file here or import it again with \uFF0B.\"; }\n    _menuItems() {\n        const l = this._labels, cur = this._deck.current;\n        return [\n            { id: \"load\", label: l.load ?? \"Load image\", icon: REF_ICON_IDS.folder },\n            { id: \"paste\", label: l.paste ?? \"Paste\", icon: REF_ICON_IDS.paste },\n            { id: \"cloud\", label: l.cloud ?? \"From cloud\", icon: REF_ICON_IDS.cloud, hidden: this.hasAttribute(\"no-cloud\") },\n            // \u5BBF\u4E3B\u51FA\u753B\u9762\u7684\u5361\uFF1A\u5BBF\u4E3B\u6CA1\u7ED9 provider \u5C31\u4E0D\u5217\uFF08\u5199\u4F5C app \u6CA1\u6709\u753B\u5E03\u53EF\u955C\u50CF\uFF09\uFF1B\u591A\u53F0\u76F8\u673A\u7684\u5BBF\u4E3B\u7ECF liveTargets \u5217\u591A\u9879\n            ...this._liveMenuItems(),\n            { id: \"onetoone\", label: l.oneToOne ?? \"1:1\", icon: REF_ICON_IDS.oneToOne, hidden: this._deck.current?.kind === \"audio\" },\n            // 0.4.0 \u97F3\u9891\u5361\uFF080.5.0 \u89C6\u9891\u5361\u540C\uFF09\uFF1A\u5FAA\u73AF\uFF08ROUND \u7684\u8BBE\u60F3\uFF1A\u653E\u5728 \uFF0B \u83DC\u5355\uFF09\uFF1B\u901F\u5EA6\u53EA\u5728\u5BBF\u4E3B\u7ED9\u4E86\u6863\u4F4D\u65F6\u5217\uFF08user 2026-10-09\u300C\u9ED8\u8BA4\u4E0D\u5F00\uFF0Cmoonsinger\u5F00\u300D\uFF09\u3002\u70B9\u4E86\u4E0D\u5173\uFF0C\u53EF\u4EE5\u8FDE\u70B9\n            ...(cur?.kind === \"audio\" || cur?.kind === \"video\" ? this._audioMenuItems() : []),\n            // \u53EA\u653E\u5185\u5B58\uFF08user 2026-10-09\u300C\u7136\u540E\u80FD\u4E0D\u80FD\u52A0RAM only\uFF0C\u5C31\u662F\u4E0D\u843D\u76D8\uFF0C\u6BCF\u6B21\u91CD\u65B0\u4E0A\u4F20\u300D\uFF09\uFF1A\u6709\u81EA\u5DF1\u5B57\u8282\u7684\u5361\u624D\u6709\uFF08\u94FE\u63A5\u5361 / \u5BBF\u4E3B\u753B\u9762 / \u8BFB\u56DE\u6765\u7684\u7A7A\u4F4D\u6CA1\u6709\uFF09\n            { id: \"minimize\", label: l.minimize ?? \"Minimize to icon\", icon: REF_ICON_IDS.pip, separatorBefore: true },\n            { id: \"ram\", label: l.ram ?? \"Keep in memory only (not saved)\", ...(cur?.ram ? { icon: REF_ICON_IDS.current } : {}),\n                hidden: !cur || cur.kind === \"live\" || !!cur.target || !cur.bytes, separatorBefore: true },\n            // \u632A\u52A8\u987A\u5E8F\u7684\u9003\u751F\u53E3\uFF08user 2026-09-29\u300Creorder\u4E5F\u9700\u8981\u6709\u9003\u751F\u53E3\u300D\uFF09\uFF1A\u70B9\u5B8C\u83DC\u5355\u4E0D\u5173\uFF0C\u53EF\u4EE5\u8FDE\u70B9\uFF1B\u5230\u5934\u7684\u90A3\u4E00\u9879\u85CF\u8D77\u6765\n            { id: \"earlier\", label: l.moveEarlier ?? \"Move earlier\", icon: REF_ICON_IDS.earlier,\n                hidden: this._deck.size < 2 || this._deck.index === 0, separatorBefore: true },\n            { id: \"later\", label: l.moveLater ?? \"Move later\", icon: REF_ICON_IDS.later,\n                hidden: this._deck.size < 2 || this._deck.index === this._deck.size - 1,\n                separatorBefore: this._deck.size >= 2 && this._deck.index === 0 },\n            // \u5220\u9664 = \u4E8C\u6BB5\u786E\u8BA4\uFF08\u9632\u8BEF\u78B0\uFF0Cuser 0830\uFF09\uFF1A\u7B2C\u4E00\u4E0B arm\uFF08\u6587\u6848\u6362 delConfirm \u53D8\u7EA2\uFF09\uFF0C\u7B2C\u4E8C\u4E0B\u624D\u5220\uFF1B\u6CA1\u6709\u53EF\u5220\u7684\u9875\u65F6\u85CF\u3002\n            { id: \"delete\", label: this._delArmed ? (l.delConfirm ?? l.del ?? \"Delete\") : (l.del ?? \"Delete\"),\n                icon: REF_ICON_IDS.trash, danger: this._delArmed, hidden: this._deck.size === 0, separatorBefore: true },\n            // \u300C\u5173\u95ED\u300D2026-09-11 \u4ECE\u83DC\u5355\u63D0\u51FA\u6210\u7A97\u53F3\u4E0A\u89D2 \u00D7 \u94AE\uFF08user\u300C\u4E0D\u7136\u627E\u4E0D\u5230\u300D\uFF09\n        ];\n    }\n    _audioMenuItems() {\n        const cur = this._deck.current, l = this._labels, loop = !!cur.play?.loop;\n        return [\n            { id: \"loop\", label: l.loop ?? \"Loop\", ...(loop ? { icon: REF_ICON_IDS.current } : {}), separatorBefore: true },\n            ...(this.audioRates ?? []).map((r, i) => ({ id: \"rate:\" + r, label: `${l.rate ?? \"Speed\"} ${r}\u00D7`, ...(r === this._rate ? { icon: REF_ICON_IDS.current } : {}), ...(i === 0 ? { separatorBefore: true } : {}) })),\n        ];\n    }\n    _liveMenuId(target) { return target == null ? \"live\" : \"live:\" + target; }\n    _liveMenuTargets() {\n        if (!this.liveProvider)\n            return [];\n        const list = this.liveTargets?.();\n        return list && list.length ? list : [{ target: null, label: this._labels.live ?? \"Live mirror\" }];\n    }\n    _liveMenuItems() {\n        return this._liveMenuTargets().map((t) => ({ id: this._liveMenuId(t.target), label: t.label, icon: REF_ICON_IDS.pip }));\n    }\n    /** \u8DF3\u8F6C\u5217\u8868\uFF1A\u70B9\u8BA1\u6570\u94AE\u5F39\u51FA\uFF0C\u4E00\u5F20\u5361\u4E00\u884C\uFF0C\u70B9\u54EA\u4E2A\u8DF3\u54EA\u4E2A\u3002\u590D\u7528\u540C\u4E00\u4E2A\u83DC\u5355\u7AEF\u53E3\uFF0C\u4E0D\u52A0\u65B0 gizmo\u3002 */\n    _toggleJump() {\n        if (!this.menuPort || this._deck.size < 2)\n            return;\n        this._swapMenuAnchor(this._chipCountEl);\n        this._menu = this.menuPort({\n            anchor: this._chipCountEl,\n            items: () => this._deck.cards().map((c, i) => ({\n                id: \"jump:\" + i, label: this._cardLabel(c, i),\n                ...(i === this._deck.index ? { icon: REF_ICON_IDS.current } : {}),\n            })),\n            align: \"left\", band: \"menu\",\n            swallowOutsideTap: true,\n            ariaLabel: this._labels.jump,\n            onClose: () => { this._menu = null; this._menuAnchor = null; },\n            onPick: (id) => { this._jumpTo(parseInt(id.slice(5), 10)); },\n        });\n        this._menuAnchor = this._menu ? this._chipCountEl : null;\n    }\n    /** \u4E24\u4E2A\u83DC\u5355\u5171\u7528\u4E00\u4E2A\u7AEF\u53E3\uFF1A\u8981\u5F00\u7684\u548C\u6B63\u5F00\u7740\u7684\u4E0D\u662F\u540C\u4E00\u4E2A\u951A \u2192 \u5148\u628A\u5F00\u7740\u7684\u6536\u6389\uFF08\u540C\u4E00\u4E2A\u951A\u5219\u4EA4\u7ED9\u7AEF\u53E3\u81EA\u5DF1\u7684 toggle \u8BED\u4E49\uFF09\u3002 */\n    _swapMenuAnchor(next) {\n        if (this._menu && this._menuAnchor !== next)\n            this._menu.close();\n    }\n    _toggleMenu() {\n        if (!this.menuPort)\n            return;\n        this._swapMenuAnchor(this._plusEl);\n        this._delArmed = false;\n        this._menu = this.menuPort({\n            anchor: this._plusEl,\n            items: () => this._menuItems(),\n            align: \"right\", band: \"menu\",\n            swallowOutsideTap: true, // \u83DC\u5355\u5F00\u7740\u65F6\u70B9\u522B\u5904 = \u53EA\u5173\u83DC\u5355\uFF0C\u90A3\u4E00\u51FB\u4E0D\u843D\u5230\u753B\u5E03/\u4E3B\u753B\u5E03\uFF08\u539F shadow \u5185\u884C\u4E3A\u4FDD\u7559\u5E76\u63A8\u5E7F\uFF09\n            ariaLabel: this._labels.menu,\n            onClose: () => { this._menu = null; this._menuAnchor = null; this._delArmed = false; },\n            onPick: (id) => {\n                if (id === \"delete\") {\n                    if (!this._delArmed) {\n                        this._delArmed = true;\n                        return \"keep\";\n                    }\n                    this._deleteCurrent();\n                    return;\n                }\n                if (id === \"earlier\" || id === \"later\") {\n                    this._delArmed = false;\n                    this._moveCurrent(id === \"earlier\" ? -1 : 1);\n                    return \"keep\";\n                }\n                if (id === \"loop\") {\n                    const cur = this._deck.current;\n                    if (!cur)\n                        return;\n                    const loop = !cur.play?.loop;\n                    if (this._audio && this._audioOf === cur.id)\n                        this._audio.loop = loop;\n                    if (this._video && this._videoOf === cur.id)\n                        this._video.loop = loop;\n                    const media = this._audioOf === cur.id ? this._audio : this._videoOf === cur.id ? this._video : null;\n                    this._deck.setPlay(cur.id, { t: media ? media.currentTime : (cur.play?.t ?? 0), loop, ...(cur.play?.fps ? { fps: cur.play.fps } : {}) });\n                    this._updateAudioLayer();\n                    this._updateVideoLayer();\n                    return \"keep\";\n                }\n                if (id === \"ram\") {\n                    const cur = this._deck.current;\n                    if (cur)\n                        this._deck.setRam(cur.id, !cur.ram);\n                    return \"keep\";\n                }\n                if (id.startsWith(\"rate:\")) {\n                    this._rate = Number(id.slice(5)) || 1;\n                    if (this._audio)\n                        this._audio.playbackRate = this._rate;\n                    if (this._video)\n                        this._video.playbackRate = this._rate;\n                    this._updateAudioLayer();\n                    this._updateVideoLayer();\n                    return \"keep\";\n                }\n                if (id === \"load\")\n                    this._emit(\"requestload\");\n                else if (id === \"paste\")\n                    this._emit(\"requestpaste\");\n                else if (id === \"cloud\")\n                    this._emit(\"requestcloudload\");\n                else if (id === \"live\" || id.startsWith(\"live:\")) {\n                    const t = this._liveMenuTargets().find((x) => this._liveMenuId(x.target) === id);\n                    this.showLive(t?.target ?? null, t?.target == null ? \"\" : t.label);\n                    this._emitItems();\n                }\n                else if (id === \"onetoone\")\n                    this.oneToOne();\n                else if (id === \"minimize\")\n                    this._setMinimizedByUser(true);\n            },\n        });\n        this._menuAnchor = this._menu ? this._plusEl : null;\n    }\n    _pokeIdle() {\n        this.classList.remove(\"idle\");\n        if (this._idleTimer)\n            clearTimeout(this._idleTimer);\n        this._idleTimer = setTimeout(() => { this.classList.add(\"idle\"); }, IDLE_DIM_MS);\n    }\n    _onDown(e) {\n        if (!this.hasAttribute(\"pick\"))\n            this.focus({ preventScroll: true }); // 0.3.1 \u7C98\u8D34\u5F52\u7126\u70B9\uFF1A\u70B9\u7A97\u8EAB = \u7A97\u62FF\u7126\u70B9\uFF08\u624B\u52BF preventDefault \u4F1A\u541E\u6389\u9ED8\u8BA4\u7684\u843D\u7126\uFF0C\u6240\u4EE5\u663E\u5F0F\u6765\uFF09\uFF1B\u5438\u7BA1\u6001\u4E0D\u52A8\u7126\u70B9\n        try {\n            this._canvas.setPointerCapture?.(e.pointerId);\n        }\n        catch { }\n        this._pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n        // \u5438\u8272\uFF1Apick \u5C5E\u6027\uFF08\u5438\u7BA1\u5DE5\u5177\u6001\uFF09\u2192 \u7ACB\u5373\u5438\uFF1Btouch \u957F\u6309 \u2192 \u6052\u5438\u8272\uFF080830\uFF1A\u5438\u8272\u94AE/\u8BBE\u7F6E\u95E8\u9000\u5F79\uFF0C\n        //   \u7A97\u5185\u4E0D\u80FD\u753B\u957F\u6309\u65E0\u6B67\u4E49\uFF0C\u4E0E\u753B\u5E03\u957F\u6309\u5438\u8272\u808C\u8089\u8BB0\u5FC6\u540C\u6784\uFF09\n        if (this._pointers.size === 1) {\n            if (this.hasAttribute(\"pick\")) {\n                this._beginPick(e);\n                e.preventDefault();\n                return;\n            }\n            if (e.pointerType === \"touch\") {\n                this._lpStart = { x: e.clientX, y: e.clientY };\n                this._lpEvent = e;\n                this._longPressTimer = setTimeout(() => {\n                    this._longPressTimer = null;\n                    if (this._lpEvent)\n                        this._beginPick(this._lpEvent);\n                }, REF_LONG_PRESS_MS);\n            }\n        }\n        if (this._pointers.size === 2) {\n            // \u7B2C\u4E8C\u6307\u8FDB\u6765 \u2192 \u53D6\u6D88\u5438\u8272/\u957F\u6309\uFF0C\u8FDB gesture\n            this._cancelLongPress();\n            this._endPick();\n            const arr = [...this._pointers.values()];\n            const dx = arr[1].x - arr[0].x, dy = arr[1].y - arr[0].y;\n            this._gestureStart = {\n                midX: (arr[0].x + arr[1].x) / 2,\n                midY: (arr[0].y + arr[1].y) / 2,\n                dist: Math.hypot(dx, dy) || 1,\n                angle: Math.atan2(dy, dx),\n                vp: { ...this._vp },\n            };\n        }\n        e.preventDefault();\n    }\n    _onMove(e) {\n        const p = this._pointers.get(e.pointerId);\n        if (!p)\n            return;\n        const px = p.x, py = p.y;\n        p.x = e.clientX;\n        p.y = e.clientY;\n        if (this._longPressTimer && this._lpStart) {\n            const ddx = e.clientX - this._lpStart.x, ddy = e.clientY - this._lpStart.y;\n            if (ddx * ddx + ddy * ddy > REF_LONG_PRESS_CANCEL_SQ)\n                this._cancelLongPress();\n        }\n        if (this._picking && this._pointers.size === 1) {\n            this._pickAt(e.clientX, e.clientY);\n            e.preventDefault();\n            return;\n        }\n        if (this._pointers.size === 1) {\n            this._vp.tx += (e.clientX - px);\n            this._vp.ty += (e.clientY - py);\n            this._containVp();\n            this._saveCurrentVp();\n            this._emitViewport();\n            this._invalidate();\n        }\n        else if (this._pointers.size >= 2 && this._gestureStart) {\n            const arr = [...this._pointers.values()];\n            const dx = arr[1].x - arr[0].x, dy = arr[1].y - arr[0].y;\n            const dist = Math.hypot(dx, dy) || 1;\n            const midX = (arr[0].x + arr[1].x) / 2;\n            const midY = (arr[0].y + arr[1].y) / 2;\n            const angle = Math.atan2(dy, dx);\n            const g = this._gestureStart;\n            // \u5171\u4EAB scale/rot + anchor \u89E3\uFF08image-origin \u7EA6\u5B9A\uFF09\uFF1A\u8D77\u624B\u6309\u4F4F\u7684 image \u70B9\u4FDD\u6301\u5728\u5F53\u524D\u4E24\u6307\u4E2D\u70B9\n            const b = this._scaleBounds();\n            const { scale, rot } = pinchScaleRot(g, dist, angle, b.lo, b.hi);\n            const rect = this._canvas.getBoundingClientRect();\n            const ip = screenToImg(g.midX - rect.left, g.midY - rect.top, g.vp);\n            const t = solveAnchorTranslation(ip, scale, rot, midX - rect.left, midY - rect.top);\n            this._vp = { tx: t.tx, ty: t.ty, scale, rot };\n            this._containVp();\n            this._saveCurrentVp();\n            this._emitViewport();\n            this._invalidate();\n        }\n        e.preventDefault();\n    }\n    _onUp(e) {\n        this._pointers.delete(e.pointerId);\n        this._cancelLongPress();\n        if (this._pointers.size === 0)\n            this._endPick();\n        if (this._pointers.size < 2)\n            this._gestureStart = null;\n        e.preventDefault?.();\n    }\n    _onWheel(e) {\n        e.preventDefault();\n        const rect = this._canvas.getBoundingClientRect();\n        const sx = e.clientX - rect.left;\n        const sy = e.clientY - rect.top;\n        const ip = screenToImg(sx, sy, this._vp);\n        const factor = e.ctrlKey || e.metaKey ? Math.exp(-e.deltaY * 0.01) : Math.exp(-e.deltaY * 0.005);\n        const b = this._scaleBounds();\n        const newScale = clamp(this._vp.scale * factor, b.lo, b.hi);\n        const t = solveAnchorTranslation(ip, newScale, this._vp.rot, sx, sy);\n        this._vp.tx = t.tx;\n        this._vp.ty = t.ty;\n        this._vp.scale = newScale;\n        this._containVp();\n        this._saveCurrentVp();\n        this._emitViewport();\n        this._invalidate();\n    }\n    _setTextScale(scale) {\n        const s = clamp(scale, TEXT_SCALE_MIN, TEXT_SCALE_MAX);\n        if (s === this._vp.scale)\n            return;\n        this._vp.scale = s;\n        this._textEl.style.setProperty(\"--ref-text-scale\", String(s));\n        this._saveCurrentVp();\n        this._emitViewport();\n    }\n    // ---- \u5438\u8272\uFF08v154\uFF1B\u5BBF\u4E3B\u62FF\u4E8B\u4EF6\u63A5\u4E3B\u5438\u8272 setColor + pin\uFF09----\n    _cancelLongPress() {\n        if (this._longPressTimer) {\n            clearTimeout(this._longPressTimer);\n            this._longPressTimer = null;\n        }\n        this._lpStart = null;\n        this._lpEvent = null;\n    }\n    _beginPick(e) {\n        this._picking = true;\n        this._cancelLongPress();\n        this._emit(\"colorpickstart\");\n        this._pickAt(e.clientX, e.clientY);\n    }\n    _endPick() {\n        if (!this._picking)\n            return;\n        this._picking = false;\n        this._emit(\"colorpickend\");\n    }\n    // \u8BFB\u81EA\u5BB6 canvas \u50CF\u7D20\uFF08\u6240\u89C1\u5373\u6240\u5438\uFF09\u3002\u900F\u660E\u533A hex=null\uFF08\u5BBF\u4E3B\u6536 pin\uFF09\u3002\u534A\u900F\u660E\u5408\u6210\u5230\u767D\u5E95\u3002\n    _pickAt(clientX, clientY) {\n        const rect = this._canvas.getBoundingClientRect();\n        const dpr = window.devicePixelRatio || 1;\n        let px = Math.round((clientX - rect.left) * dpr);\n        let py = Math.round((clientY - rect.top) * dpr);\n        px = Math.max(0, Math.min(this._canvas.width - 1, px));\n        py = Math.max(0, Math.min(this._canvas.height - 1, py));\n        let d;\n        try {\n            d = this._cctx.getImageData(px, py, 1, 1).data;\n        }\n        catch {\n            return;\n        }\n        let r = d[0], g = d[1], b = d[2];\n        const a = d[3];\n        if (a === 0) {\n            this._emit(\"colorpick\", { hex: null, screenX: clientX, screenY: clientY });\n            return;\n        }\n        if (a < 255) {\n            const f = a / 255;\n            r = Math.round(r * f + 255 * (1 - f));\n            g = Math.round(g * f + 255 * (1 - f));\n            b = Math.round(b * f + 255 * (1 - f));\n        }\n        const hex = \"#\" + [r, g, b].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\");\n        this._emit(\"colorpick\", { hex, screenX: clientX, screenY: clientY });\n    }\n    // ---- \u6E32\u67D3 ----\n    _resizeCanvasToBody() {\n        const dpr = window.devicePixelRatio || 1;\n        const w = this.clientWidth;\n        const h = this.clientHeight;\n        if (w <= 0 || h <= 0)\n            return;\n        this._canvas.width = Math.round(w * dpr);\n        this._canvas.height = Math.round(h * dpr);\n        this._canvas.style.width = w + \"px\";\n        this._canvas.style.height = h + \"px\";\n    }\n    _invalidate() {\n        if (this._raf)\n            return;\n        this._raf = requestAnimationFrame(() => {\n            this._raf = null;\n            this._render();\n        });\n    }\n    _stopLiveTimer() {\n        this._liveSource = null;\n        this._liveSize = null;\n        this._liveOf = null;\n        this._liveDirty = false;\n        if (this._liveThrottle != null) {\n            clearTimeout(this._liveThrottle);\n            this._liveThrottle = null;\n        }\n    }\n    /** \u624B\u4E0A\u7684\u5E27\u662F\u53E6\u4E00\u5F20\u5361\u7684\uFF08\u591A\u53F0\u76F8\u673A\u4E4B\u95F4\u7FFB\u9875\uFF09\u2192 \u6254\u6389\uFF0C\u8FDE\u8282\u6D41\u7684\u8BA1\u65F6\u4E00\u8D77\u6E05\uFF1A\u65B0\u5361\u7684\u7B2C\u4E00\u5E27\u8981\u7ACB\u523B\u51FA\uFF0C\u4E0D\u8BB8\u5148\u753B\u4E00\u4E0B\u522B\u4EBA\u7684\u753B\u9762\u3002 */\n    _dropLiveIfOther(cur) {\n        if (this._liveOf === cur.id)\n            return;\n        this._liveSource = null;\n        this._liveSize = null;\n        this._liveOf = cur.id;\n        this._lastLiveComposeT = undefined;\n        if (this._liveThrottle != null) {\n            clearTimeout(this._liveThrottle);\n            this._liveThrottle = null;\n        }\n    }\n    /** \u5411\u5BBF\u4E3B\u8981\u4E00\u5E27\u3002\u8981\u5230\u4E86\u8FD4\u56DE true\u3002 */\n    _takeLiveFrame(cur) {\n        if (!this.liveProvider)\n            return false;\n        const want = { width: this._canvas.width, height: this._canvas.height };\n        const got = this.liveProvider(want, cur.target ?? null);\n        if (!got)\n            return false;\n        const wrapped = \"source\" in got;\n        const src = wrapped ? got.source : got;\n        this._liveSource = src;\n        this._liveSize = wrapped ? { w: got.width, h: got.height } : { w: src.width, h: src.height };\n        this._liveOf = cur.id;\n        this._lastLiveComposeT = performance.now();\n        return true;\n    }\n    // live \u5408\u6210\uFF1A\u53EA\u5728\u810F\u6807\u771F\u8D77\u65F6\u95EE provider\uFF1B\u8282\u6D41\u5185\u4FDD\u7559\u810F\u6807\u7B49 timer \u8865\u5E27\uFF08S9\uFF09\u3002\n    _recomposeLive() {\n        const cur = this._deck.current;\n        if (!this.liveProvider || !cur)\n            return true;\n        this._dropLiveIfOther(cur);\n        const gap = Math.max(0, this.liveMinIntervalMs);\n        const now = performance.now();\n        const since = now - (this._lastLiveComposeT ?? -Infinity);\n        if (since < gap) {\n            if (this._liveThrottle == null) {\n                this._liveThrottle = setTimeout(() => { this._liveThrottle = null; this._invalidate(); }, gap + 20 - since);\n            }\n            return false;\n        }\n        this._takeLiveFrame(cur); // \u8981\u4E0D\u5230\uFF08GL lost\uFF09\u2192 \u4FDD\u7559\u4E0A\u5E27\uFF1B\u7167\u6837\u4E22\u810F\u6807\uFF0C\u907F\u514D\u7A7A\u8F6C\n        return true;\n    }\n    _render() {\n        const cur = this._deck.current;\n        if (cur?.kind === \"live\" && this._liveDirty) {\n            if (this._recomposeLive())\n                this._liveDirty = false;\n        }\n        const dpr = window.devicePixelRatio || 1;\n        const W = this._canvas.width, H = this._canvas.height;\n        const ctx = this._cctx;\n        ctx.setTransform(1, 0, 0, 1, 0, 0);\n        ctx.clearRect(0, 0, W, H);\n        let source = null;\n        if (cur?.kind === \"live\") {\n            if (!this._liveSource)\n                this._recomposeLive(); // \u9996\u5E27\uFF08\u8282\u6D41\u7A97\u81EA\u5DF1\u6392 timer \u8865\uFF09\n            source = this._liveSource;\n        }\n        else if (cur?.kind === \"video\") {\n            const v = this._video;\n            source = v && this._videoOf === cur.id && v.readyState >= 2 && v.videoWidth > 0 ? v : null; // HAVE_CURRENT_DATA\uFF1A\u624B\u4E0A\u6709\u4E00\u5E27\u624D\u753B\n        }\n        else if (cur)\n            source = this._bitmaps.get(cur.id) ?? null;\n        if (!source)\n            return;\n        // \u5E95\u4E0D canvas \u81EA\u753B\uFF1AclearRect \u900F\u5E95\uFF0C:host \u7684 void+\u70B9\u9635 CSS \u4ECE\u56FE\u5916\u4E0E\u56FE\u7684\u900F\u660E\u90E8\u5206\u900F\u51FA\uFF08\u5BF9\u9F50 editor\uFF09\u3002\n        // \u653E\u5927 nearest\uFF080830 \u50CF\u7D20\u753B friendly\uFF09\uFF1Ascale\u22652 \u5173\u5E73\u6ED1\u8D70\u786C\u50CF\u7D20\uFF1B\u7F29\u5C0F\u4FDD\u6301\u5E73\u6ED1\u9632\u6469\u5C14\u7EB9\u3002\n        const nearest = this._vp.scale >= NEAREST_MIN_SCALE;\n        ctx.imageSmoothingEnabled = !nearest;\n        if (!nearest)\n            ctx.imageSmoothingQuality = \"high\";\n        // viewport\uFF1Atx/ty \u662F CSS \u50CF\u7D20\uFF0C\u8981 \u00D7 dpr\uFF1Bscale/rot \u4E0D\u52A8\n        const v = this._vp;\n        const c = Math.cos(v.rot), s = Math.sin(v.rot);\n        ctx.setTransform(v.scale * c * dpr, v.scale * s * dpr, -v.scale * s * dpr, v.scale * c * dpr, v.tx * dpr, v.ty * dpr);\n        // \u5BBF\u4E3B\u51FA\u7684\u5E27\u53EF\u80FD\u6BD4\u8FD9\u5F20\u5361\u300C\u672C\u6765\u7684\u5927\u5C0F\u300D\u5C0F\uFF08\u6309\u63D0\u793A\u51FA\u4E86\u5C0F\u5C3A\u5BF8\uFF09\u2192 \u62C9\u4F38\u5230\u672C\u6765\u7684\u5927\u5C0F\u753B\uFF1B\u56FE\u7247\u5361\u4E24\u8005\u76F8\u7B49\uFF1B\u89C6\u9891\u6309\u753B\u9762\u50CF\u7D20\uFF08videoWidth\uFF0C\u4E0D\u662F\u5143\u7D20\u7684 width\uFF09\u3002\n        const size = cur?.kind === \"live\" && this._liveSize ? this._liveSize\n            : source instanceof HTMLVideoElement ? { w: source.videoWidth, h: source.videoHeight }\n                : { w: source.width, h: source.height };\n        ctx.drawImage(source, -size.w / 2, -size.h / 2, size.w, size.h);\n    }\n    _updateEmptyHint() {\n        this._emptyEl.classList.toggle(\"hidden\", this._deck.size > 0);\n    }\n    /** \u89C6\u53E3\u62A4\u680F\uFF1A\u5C3A\u5BF8\u4E0D\u8D85\u89C6\u53E3\u9884\u7B97\u3001\u4F4D\u7F6E\u4E0D\u843D\u5C4F\u5916\uFF08\u62D6\u5DF2\u81EA\u94B3\uFF1B\u8FD9\u91CC\u515C restore/open/\u6D4F\u89C8\u5668\u7A97\u53E3 resize/\n     *  native CSS resize \u56DB\u6761\u8DEF\uFF09\u3002\u8FD4\u56DE\u662F\u5426\u6709\u4FEE\u6B63\u3002 */\n    /** \u5730\u677F\u53D8\u4E86\uFF08\u952E\u76D8\u9732 / \u6536\u3001\u9876\u680F\u9AD8\u5EA6\u53D8\uFF09\u4E4B\u540E\u5BBF\u4E3B\u8C03\uFF1A\u6574\u7A97\u94B3\u56DE\u53EF\u89C1\u533A\uFF0C\u52A8\u4E86\u5C31\u53D1 rectchange\u3002 */\n    reclamp() { if (this._clampIntoViewport())\n        this._emitRect(); }\n    /** 0.4.1 \u7528\u6237\u6536\u8D77 / \u6062\u590D\uFF08\u83DC\u5355\u9879\u3001\u70B9\u5C0F\u56FE\u6807\uFF09\uFF1A\u6539\u72B6\u6001 + \u53D1 minimizechange\uFF08\u5BBF\u4E3B\u60F3\u8BB0\u4F4F\u5C31\u8BB0\uFF09\u3002 */\n    _setMinimizedByUser(v) {\n        if (v === this.minimized)\n            return;\n        this.minimized = v;\n        this._emit(\"minimizechange\", { minimized: v });\n    }\n    /** \u6062\u590D\u6210\u6574\u7A97\u4E4B\u540E\uFF1A\u5C0F\u56FE\u6807\u53EF\u80FD\u88AB\u632A\u5230\u4E86\u53F3\u4E0B\u89D2\u2014\u2014\u6574\u7A97\u94B3\u56DE\u53EF\u89C1\u533A\uFF1B\u753B\u9762\u91CD\u65B0\u6309\u7A97\u5927\u5C0F\u94FA\uFF08\u6536\u7740\u65F6 canvas \u662F\u9690\u85CF\u7684\uFF09\u3002 */\n    _afterRestore() {\n        if (!this.open)\n            return;\n        if (this._clampIntoViewport())\n            this._emitRect();\n        this._resizeCanvasToBody();\n        if (this.live)\n            this._liveDirty = true;\n        this._pokeIdle();\n        this._invalidate();\n    }\n    _clampIntoViewport() {\n        const vw = window.innerWidth, vh = window.innerHeight;\n        if (!(vw > 0) || !(vh > 0))\n            return false;\n        let w = this.offsetWidth, h = this.offsetHeight;\n        if (!(w > 0) || !(h > 0))\n            return false; // display:none\uFF08\u672A open\uFF09\uFF1A\u5F00\u7A97\u65F6 _afterShow \u518D\u94B3\n        let changed = false;\n        const maxW = Math.max(MIN_EDGE, vw - 8), maxH = Math.max(MIN_EDGE, vh - this.topFloor - this.bottomFloor - 8);\n        // \u91CF\u7684\u662F\u5916\u6846\uFF08offset*\uFF0C\u542B\u8FB9\u6846\uFF09\uFF0C\u5199\u7684\u662F style\uFF08\u53EF\u80FD\u4E0D\u542B\u8FB9\u6846\uFF09\uFF1A\u5DEE\u7684\u90A3\u4E00\u5708\u8981\u6263\u6389\uFF0C\u5426\u5219\u7F29\u5B8C\u8FD8\u662F\u9AD8\u51FA\u4E24\u50CF\u7D20\u3001\u94B3\u4F4D\u7F6E\u65F6\u4E5F\u6309\u9519\u7684\u9AD8\u7B97\n        if (w > maxW || h > maxH) {\n            const cs = getComputedStyle(this), bw = w - parseFloat(cs.width), bh = h - parseFloat(cs.height);\n            if (w > maxW) {\n                this.style.width = Math.max(0, maxW - (bw > 0 ? bw : 0)) + \"px\";\n                changed = true;\n            }\n            if (h > maxH) {\n                this.style.height = Math.max(0, maxH - (bh > 0 ? bh : 0)) + \"px\";\n                changed = true;\n            }\n            w = this.offsetWidth;\n            h = this.offsetHeight;\n        }\n        const r = this.getBoundingClientRect();\n        const left = clamp(r.left, 0, vw - w);\n        const top = clamp(r.top, this.topFloor, Math.max(this.topFloor, vh - this.bottomFloor - h));\n        if (Math.abs(left - r.left) > 0.5) {\n            this.style.left = left + \"px\";\n            changed = true;\n        }\n        if (Math.abs(top - r.top) > 0.5) {\n            this.style.top = top + \"px\";\n            changed = true;\n        }\n        return changed;\n    }\n}\nfunction clamp(x, lo, hi) { return Math.max(lo, Math.min(hi, x)); }\n// \u5C4F\u5E55\u2192\u56FE\u50CF\u5750\u6807\u9006\u53D8\u6362\uFF08anchor-preserving \u7528\uFF09\u3002\u6B63\u53D8\u6362\uFF1Ascreen = R(rot)\u00B7S(scale)\u00B7img + (tx,ty)\nfunction screenToImg(sx, sy, vp) {\n    const c = Math.cos(-vp.rot), s = Math.sin(-vp.rot);\n    const dx = sx - vp.tx, dy = sy - vp.ty;\n    return { x: (dx * c - dy * s) / vp.scale, y: (dx * s + dy * c) / vp.scale };\n}\nexport const WP_REFERENCE_WINDOW_TAG = \"wp-reference-window\";\nif (!customElements.get(WP_REFERENCE_WINDOW_TAG)) {\n    customElements.define(WP_REFERENCE_WINDOW_TAG, WpReferenceWindow);\n}\n", "// \u53C2\u8003\u7A97\u7684\u6570\u636E\u5951\u7EA6 = \u5BB9\u5668\u91CC\u7684**\u4E00\u4E2A\u76EE\u5F55**\uFF1A`.<app>/references/`\uFF0C\u91CC\u9762\u4E00\u4EFD `manifest.json` + \u6BCF\u5F20\u5361\u7684\u5B57\u8282\u3002\n// created 2026-09-29 by Claude Fable 5.1\uFF1B0.2.0 \u6539\u6210\u76EE\u5F55\u5236\uFF08user 2026-09-29\u300Creference\u8981\u4E0D\u8981\u81EA\u5DF1\u72EC\u7ACB\u7684json\u8FD9\u6837\u662F\u4E0D\u662F\u5C31\u662F\u6DF1\u6A21\u5757\u7A84\u63A5\u53E3\u4E86\uFF1F\u300D\uFF09\n//\n// \u5BBF\u4E3B\u7684\u63A5\u53E3\u53EA\u6709\u4E24\u4EF6\u4E8B\uFF1A\u8BF4\u81EA\u5DF1\u53EB\u4EC0\u4E48\uFF08app\uFF09\uFF0C\u6309\u540D\u5B57\u53D6\u5B57\u8282 / \u5B58\u5B57\u8282\u3002\u547D\u540D\u3001\u6E05\u5355\u7684\u5F62\u72B6\u3001\u7248\u672C\u6233\u3001\u8FC1\u79FB\u3001\n// \u4E0D\u8BA4\u8BC6\u7684\u5361\u600E\u4E48\u5E26\u7740\u2014\u2014\u5168\u5728\u8FD9\u4E2A\u6A21\u5757\u91CC\u3002\u5BBF\u4E3B\u4E0D\u9700\u8981\u89E3\u6790\u6E05\u5355\uFF0C\u4E5F\u4E0D\u9700\u8981\u77E5\u9053\u6709\u6E05\u5355\u3002\n//\n// \u76EE\u5F55\u5E03\u5C40\uFF080.2.0 \u8D77\uFF09\uFF1A\n//   .<app>/references/manifest.json        \u2190 \u6E05\u5355\uFF1A{ version, index, items[] }\n//   .<app>/references/r<\u4F4D\u7F6E>.<\u6269\u5C55\u540D>       \u2190 \u6BCF\u5F20\u6709\u5B57\u8282\u7684\u5361\uFF1B\u4F4D\u7F6E = \u6E05\u5355\u5E8F\u53F7\uFF08\u96F6\u5B57\u8282\u7684\u5361\u4E0D\u843D\u6587\u4EF6\uFF0C\u5E8F\u53F7\u4F1A\u8DF3\uFF09\n//\n// \u517C\u5BB9\u6027\uFF1A\u6E05\u5355\u6761\u76EE\u7684\u952E\u540D\u6CBF\u7528 WeebPaint format 2 \u7684 refPanels\uFF08kind / src / vp\uFF09\uFF0C\u65B0\u5B57\u6BB5\u53EF\u9009\u3001\u7A7A\u503C\u4E0D\u5199\uFF1B\n//   \u6CA1\u6709 version \u7684\u6E05\u5355\u5F53 v1 \u8BFB\uFF08WeebPaint \u8001\u6587\u4EF6\u91CC refPanels \u7684\u90A3\u6BB5 JSON \u642C\u8FDB manifest.json \u5C31\u80FD\u76F4\u63A5\u8BFB\uFF09\u3002\n//   \u628A\u8001\u6587\u4EF6\u91CC\u7684\u6E05\u5355**\u642C**\u5230\u8FD9\u4E2A\u76EE\u5F55\u662F\u5BBF\u4E3B\u7684\u5E03\u5C40\u8FC1\u79FB\uFF1B\u6E05\u5355**\u81EA\u5DF1**\u7684\u7248\u672C\u6F14\u5316\u5728\u672C\u6A21\u5757\uFF08migrateDeckManifest\uFF09\u3002\n// \u672C\u6A21\u5757\u53EA\u505A\u5185\u5B58\u91CC\u7684\u53D8\u6362\uFF1A\u4E0D\u8BFB\u5199\u6587\u4EF6\u3001\u4E0D\u8054\u7F51\u3002\nexport const DECK_MANIFEST_STAMP = { major: 1, minor: 1, patch: 0 };\n/** = DECK_MANIFEST_STAMP.major\uFF080.2.0 \u8D77\u7684\u540D\u5B57\uFF0C\u7559\u7740\uFF09\u3002 */\nexport const DECK_MANIFEST_VERSION = DECK_MANIFEST_STAMP.major;\nexport const DECK_MANIFEST_NAME = \"manifest.json\";\nconst nat = (v) => (typeof v === \"number\" && Number.isInteger(v) && v >= 0 ? v : null);\n/** \u8BFB\u4E00\u4EFD\u6E05\u5355 JSON \u7684\u62CD\u5B50\uFF1Aversion \u7F3A = 1\uFF08WeebPaint format 2 \u642C\u6765\u7684\u6E05\u5355\uFF09\uFF1Bminor / patch \u7F3A\u6216\u975E\u6CD5 = 0\u3002 */\nexport function readDeckStamp(json) {\n    const o = isObj(json) ? json : {};\n    const major = typeof o.version === \"number\" && Number.isFinite(o.version) ? Math.trunc(o.version) : 1;\n    return { major, minor: nat(o.minor) ?? 0, patch: nat(o.patch) ?? 0 };\n}\nexport function compareDeckStamp(file, mine = DECK_MANIFEST_STAMP) {\n    if (file.major !== mine.major)\n        return \"older\"; // major \u4E0D\u540C\u53EA\u4F1A\u662F\u5C0F\uFF08\u5927\u7684\u65E9\u5728 migrate \u91CC\u629B\u4E86\uFF09\n    if (file.minor > mine.minor)\n        return \"newer-minor\";\n    if (file.minor < mine.minor)\n        return \"older\";\n    if (file.patch > mine.patch)\n        return \"newer-patch\";\n    if (file.patch < mine.patch)\n        return \"older\";\n    return \"same\";\n}\n/** \u6E05\u5355\u9876\u5C42\u672C\u5E93\u8BA4\u8BC6\u7684\u952E\uFF1B\u5176\u4F59\u539F\u6837\u76F4\u901A\uFF08DeckSnapshot.extra\uFF09\u3002 */\nconst KNOWN_MANIFEST_KEYS = new Set([\"version\", \"minor\", \"patch\", \"index\", \"items\"]);\n/** \u6761\u76EE\u91CC\u672C\u5E93\u8BA4\u8BC6\u7684\u952E\uFF1B\u5176\u4F59\u539F\u6837\u76F4\u901A\uFF08Card.extra\uFF09\u3002 */\nconst KNOWN_ITEM_KEYS = new Set([\"kind\", \"src\", \"vp\", \"name\", \"mime\", \"target\", \"origin\", \"play\", \"ram\"]);\nfunction pickExtra(o, known) {\n    let out = null;\n    for (const k of Object.keys(o))\n        if (!known.has(k)) {\n            (out ??= {})[k] = JSON.parse(JSON.stringify(o[k] ?? null));\n        }\n    return out;\n}\n/** \u53C2\u8003\u7A97\u5728\u5BB9\u5668\u91CC\u4F4F\u7684\u76EE\u5F55\uFF08\u4E0D\u5E26\u5C3E\u659C\u6760\uFF09\u3002 */\nexport function deckDir(app) {\n    if (!/^[a-z][a-z0-9-]*$/.test(app))\n        throw new Error(`deckDir: app name must be lowercase [a-z0-9-], got \"${app}\"`);\n    return `.${app}/references`;\n}\n/** \u6E05\u5355\u7248\u672C\uFF08major\uFF09\u6BD4\u8FD9\u4E2A\u5E93\u65B0\uFF1A\u4E0D\u964D\u7EA7\u3001\u4E0D\u731C\uFF0C\u62A5\u51FA\u53BB\u3002 */\nexport class DeckManifestTooNewError extends Error {\n    fileVersion;\n    libVersion;\n    constructor(fileVersion, libVersion) {\n        super(`reference manifest version ${fileVersion} is newer than this library supports (${libVersion}); refusing to read`);\n        this.name = \"DeckManifestTooNewError\";\n        this.fileVersion = fileVersion;\n        this.libVersion = libVersion;\n    }\n}\n// ---- \u6269\u5C55\u540D \u2194 mime\uFF08\u300C\u6269\u5C55\u540D\u8BF4\u771F\u8BDD\u300D\u662F WeebPaint \u7684\u65E2\u6709\u7EA6\u5B9A\uFF09----\nconst EXT_BY_MIME = {\n    \"image/jpeg\": \"jpg\", \"image/png\": \"png\", \"image/webp\": \"webp\", \"image/gif\": \"gif\",\n    \"text/plain\": \"txt\", \"text/markdown\": \"md\",\n    \"video/mp4\": \"mp4\", \"video/webm\": \"webm\",\n    \"audio/mpeg\": \"mp3\", \"audio/mp4\": \"m4a\", \"audio/ogg\": \"ogg\", \"audio/opus\": \"opus\", \"audio/webm\": \"weba\",\n    // 0.4.0\uFF082026-10-09\uFF0C\u97F3\u9891\u5361\uFF1BClaude Opus 5.5\uFF09\uFF1A\u4EE5\u524D\u8FD9\u51E0\u79CD\u843D\u6210 bin\n    \"audio/wav\": \"wav\", \"audio/flac\": \"flac\", \"audio/aac\": \"aac\", \"video/quicktime\": \"mov\",\n};\nconst MIME_BY_EXT = Object.fromEntries(Object.entries(EXT_BY_MIME).map(([m, e]) => [e, m]));\n/** \u540C\u4E00\u79CD\u683C\u5F0F\u7684\u522B\u540D mime\uFF08\u6D4F\u89C8\u5668 / \u7CFB\u7EDF\u5404\u62A5\u5404\u7684\uFF09\uFF1A\u53EA\u7528\u6765\u5B9A\u6269\u5C55\u540D\uFF0C\u4E0D\u53C2\u4E0E\u53CD\u63A8\u3002 */\nconst EXT_BY_MIME_ALIAS = {\n    \"audio/x-wav\": \"wav\", \"audio/wave\": \"wav\", \"audio/vnd.wave\": \"wav\", \"audio/x-m4a\": \"m4a\", \"audio/mp3\": \"mp3\", \"audio/x-flac\": \"flac\", \"audio/aacp\": \"aac\",\n};\n/** mime \u2192 \u6269\u5C55\u540D\uFF08\u4E0D\u5E26\u70B9\uFF09\u3002\u4E0D\u8BA4\u8BC6\u7684\u56FE\u7247\u7ED9 \"img\"\uFF08WeebPaint \u65E2\u6709\uFF09\uFF0C\u5176\u4F59\u4E0D\u8BA4\u8BC6\u7684\u7ED9 \"bin\"\u3002 */\nexport function extForMime(mime) {\n    const base = (mime || \"\").split(\";\")[0].trim().toLowerCase();\n    return EXT_BY_MIME[base] ?? EXT_BY_MIME_ALIAS[base] ?? (base.startsWith(\"image/\") ? \"img\" : \"bin\");\n}\n/** \u6587\u4EF6\u540D \u2192 mime\uFF08\u6309\u6269\u5C55\u540D\u731C\uFF09\u3002\u731C\u4E0D\u51FA \u2192 \"\"\u3002 */\nexport function mimeForName(name) {\n    const m = /\\.([A-Za-z0-9]+)$/.exec(name || \"\");\n    return m ? (MIME_BY_EXT[m[1].toLowerCase()] ?? \"\") : \"\";\n}\nfunction extOfName(name) {\n    const m = /\\.([A-Za-z0-9]+)$/.exec(name || \"\");\n    return m ? m[1].toLowerCase() : \"bin\";\n}\nconst fileName = (dir, position, ext) => `${dir}/r${position}.${ext}`;\n/** STEPS[v] = \u4ECE v \u5347\u5230 v+1\u3002\u52A0\u8FC1\u79FB = \u5728\u8FD9\u91CC\u767B\u8BB0\u4E00\u6761 + \u5728 test/fixtures/ \u51BB\u7ED3\u4E00\u4EFD\u65E7\u7248\u6E05\u5355\u3002 */\nconst STEPS = {};\nfunction isObj(x) { return !!x && typeof x === \"object\" && !Array.isArray(x); }\n/** \u628A\u4EFB\u4F55\u7248\u672C\u7684\u6E05\u5355\u5347\u5230\u5F53\u524D major\u3002\u7F3A version \u89C6\u4E3A 1\uFF1B\u4E0D\u662F\u5BF9\u8C61 \u2192 \u7A7A\u6E05\u5355\u3002minor / patch \u7167\u6587\u4EF6\uFF08\u7ECF\u8FC7 STEP \u7684\u4EE5 STEP \u5199\u7684\u4E3A\u51C6\uFF0C\u7F3A = 0\uFF09\uFF1B\u9876\u5C42\u4E0D\u8BA4\u8BC6\u7684\u952E\u8FDB extra\u3002 */\nexport function migrateDeckManifest(json) {\n    const src = isObj(json) ? json : {};\n    let v = readDeckStamp(src).major;\n    if (v > DECK_MANIFEST_VERSION)\n        throw new DeckManifestTooNewError(v, DECK_MANIFEST_VERSION);\n    let cur = src;\n    while (v < DECK_MANIFEST_VERSION) {\n        const step = STEPS[v];\n        if (!step)\n            throw new Error(`migrateDeckManifest: no step registered for v${v} \u2192 v${v + 1}`);\n        cur = step(cur);\n        v++;\n        if (cur.version !== v)\n            throw new Error(`migrateDeckManifest: step v${v - 1}\u2192v${v} did not set version`);\n    }\n    const items = Array.isArray(cur.items) ? cur.items.filter((it) => isObj(it) && typeof it.kind === \"string\" && !!it.kind) : [];\n    const index = typeof cur.index === \"number\" && Number.isFinite(cur.index) ? Math.trunc(cur.index) : 0;\n    const { minor, patch } = readDeckStamp(cur);\n    return { version: DECK_MANIFEST_VERSION, minor, patch, index, items, extra: pickExtra(cur, KNOWN_MANIFEST_KEYS) ?? {} };\n}\nfunction readView(x) {\n    if (!isObj(x))\n        return null;\n    const { tx, ty, scale, rot } = x;\n    const ok = [tx, ty, scale, rot].every((n) => typeof n === \"number\" && Number.isFinite(n));\n    return ok ? { tx: tx, ty: ty, scale: scale, rot: rot } : null;\n}\nfunction readPlay(x) {\n    if (!isObj(x) || typeof x.t !== \"number\" || !Number.isFinite(x.t))\n        return null;\n    const fps = typeof x.fps === \"number\" && Number.isFinite(x.fps) && x.fps > 0 ? x.fps : undefined;\n    return fps !== undefined ? { t: x.t, loop: !!x.loop, fps } : { t: x.t, loop: !!x.loop };\n}\nconst str = (x) => (typeof x === \"string\" ? x : \"\");\n/** \u4ECE\u5BB9\u5668\u91CC\u8BFB\u56DE\u724C\u7EC4\u3002\u76EE\u5F55\u91CC\u6CA1\u6709 manifest.json \u2192 \u7A7A\u724C\u7EC4\uFF08\u4E0D\u662F\u9519\uFF09\u3002\u6E05\u5355\u4E0D\u662F\u5408\u6CD5 JSON \u2192 \u629B\u9519\uFF08\u4E0D\u9759\u9ED8\u5F53\u7A7A\uFF09\u3002 */\nexport async function decodeDeck(o) {\n    const dir = deckDir(o.app);\n    const blob = o.getFile(`${dir}/${DECK_MANIFEST_NAME}`);\n    if (!blob)\n        return { index: 0, cards: [], carried: [], extra: {}, stamp: { ...DECK_MANIFEST_STAMP }, verdict: \"same\" };\n    let json;\n    try {\n        json = JSON.parse(await blob.text());\n    }\n    catch (e) {\n        throw new Error(`decodeDeck: ${dir}/${DECK_MANIFEST_NAME} is not valid JSON: ${String(e.message)}`);\n    }\n    return decodeDeckFromJson(json, o);\n}\n/** \u6E05\u5355\u5DF2\u7ECF\u5728\u624B\u4E0A\uFF08\u5BBF\u4E3B\u4ECE\u522B\u5904\u642C\u6765\u7684\u3001\u6216\u6D4B\u8BD5\uFF09\u65F6\u7528\u8FD9\u4E2A\u3002 */\nexport function decodeDeckFromJson(manifestJson, o) {\n    const stamp = readDeckStamp(manifestJson); // \u6587\u4EF6\u539F\u6765\u7684\u62CD\u5B50\uFF08\u5224\u51B3\u6309\u5B83\uFF1Bmajor \u6BD4\u672C\u5E93\u65B0\u7684\u5728\u4E0B\u4E00\u884C\u629B\uFF09\n    const m = migrateDeckManifest(manifestJson);\n    const verdict = compareDeckStamp(stamp);\n    const known = new Set(o.knownKinds);\n    const cards = [];\n    const carried = [];\n    let index = 0, indexSet = false;\n    m.items.forEach((raw, at) => {\n        if (!known.has(raw.kind)) {\n            const files = {};\n            const s = str(raw.src) ? o.getFile(str(raw.src)) : null;\n            if (s)\n                files.src = s;\n            carried.push({ at, item: JSON.parse(JSON.stringify(raw)), files });\n            return;\n        }\n        const ram = isObj(raw.ram) && typeof raw.ram.bytes === \"number\" && Number.isFinite(raw.ram.bytes) ? { bytes: raw.ram.bytes } : null;\n        const src = ram ? \"\" : str(raw.src);\n        const bytes = src ? o.getFile(src) : null;\n        if (at === m.index) {\n            index = cards.length;\n            indexSet = true;\n        }\n        cards.push({\n            kind: raw.kind,\n            name: str(raw.name),\n            bytes,\n            mime: str(raw.mime) || bytes?.type || mimeForName(src),\n            target: str(raw.target) || null,\n            vp: readView(raw.vp),\n            play: readPlay(raw.play),\n            origin: str(raw.origin) || null,\n            ram,\n            extra: pickExtra(raw, KNOWN_ITEM_KEYS),\n        });\n    });\n    if (!indexSet)\n        index = Math.max(0, Math.min(cards.length - 1, m.index));\n    return { index, cards, carried, extra: m.extra, stamp, verdict };\n}\n/** \u628A\u724C\u7EC4\u7F16\u6210\u5BB9\u5668\u91CC\u7684\u4E00\u7EC4\u6587\u4EF6\uFF1A`.<app>/references/manifest.json` + \u6BCF\u5F20\u5361\u7684\u5B57\u8282\u3002\u5BBF\u4E3B\u539F\u6837\u5B58\u3002 */\nexport function encodeDeck(s, o) {\n    const dir = deckDir(o.app);\n    const slots = s.cards.map((card) => ({ card }));\n    for (const c of [...s.carried].sort((a, b) => a.at - b.at)) {\n        const at = Math.max(0, Math.min(slots.length, Math.trunc(c.at) || 0));\n        slots.splice(at, 0, { carried: c });\n    }\n    const files = new Map();\n    const items = [];\n    let index = 0;\n    const viewing = s.cards[s.index] ?? null;\n    slots.forEach((slot, position) => {\n        if (\"carried\" in slot) {\n            // \u4E0D\u8BA4\u8BC6\u7684\u5361\uFF1A\u6761\u76EE\u539F\u6587\u7167\u5199\uFF1B\u5B57\u8282\u6309\u65B0\u4F4D\u7F6E\u91CD\u65B0\u8D77\u540D\uFF08\u5426\u5219\u4F1A\u548C\u8BA4\u8BC6\u7684\u5361\u649E\u540D\uFF09\n            const item = JSON.parse(JSON.stringify(slot.carried.item));\n            const src = slot.carried.files.src;\n            if (src) {\n                const n = fileName(dir, position, extOfName(str(item.src)));\n                files.set(n, src);\n                item.src = n;\n            }\n            else\n                delete item.src; // \u5B57\u8282\u65E9\u5C31\u6CA1\u4E86\uFF1A\u522B\u7559\u4E00\u4E2A\u6307\u5411\u4E0D\u5B58\u5728\u6587\u4EF6\u7684\u540D\u5B57\n            items.push(item);\n            return;\n        }\n        const c = slot.card;\n        if (c === viewing)\n            index = position;\n        // \u952E\u7684\u987A\u5E8F\u56FA\u5B9A\uFF1Akind, src, vp \u5728\u524D\uFF08= WeebPaint format 2\uFF09\uFF0C\u65B0\u5B57\u6BB5\u5728\u540E\uFF1B\u7A7A\u503C\u4E0D\u5199\u3002\n        const item = { kind: c.kind };\n        if (c.bytes && !c.ram) {\n            const n = fileName(dir, position, extForMime(c.mime || c.bytes.type));\n            files.set(n, c.bytes);\n            item.src = n;\n        } // \u53EA\u653E\u5185\u5B58 = \u5B57\u8282\u4E0D\u8FDB\u6587\u4EF6\n        item.vp = c.vp ? { tx: c.vp.tx, ty: c.vp.ty, scale: c.vp.scale, rot: c.vp.rot } : null;\n        if (c.name)\n            item.name = c.name;\n        if (c.mime && (!item.src || mimeForName(item.src) !== c.mime.split(\";\")[0].trim().toLowerCase()))\n            item.mime = c.mime;\n        if (c.target)\n            item.target = c.target;\n        if (c.origin)\n            item.origin = c.origin;\n        if (c.play)\n            item.play = c.play.fps ? { t: c.play.t, loop: c.play.loop, fps: c.play.fps } : { t: c.play.t, loop: c.play.loop };\n        if (c.ram)\n            item.ram = { bytes: c.ram.bytes };\n        // \u6761\u76EE\u91CC\u4E0D\u8BA4\u8BC6\u7684\u952E\uFF08\u66F4\u65B0\u7248\u672C\u7684\u5E93\u5199\u7684\uFF09\u539F\u6837\u5E26\u56DE\uFF0C\u6392\u5728\u5DF2\u77E5\u952E\u540E\u9762\uFF1B\u5DF2\u77E5\u952E\u6C38\u8FDC\u8D62\n        if (c.extra)\n            for (const k of Object.keys(c.extra))\n                if (!KNOWN_ITEM_KEYS.has(k))\n                    item[k] = c.extra[k];\n        items.push(item);\n    });\n    // \u62CD\u5B50\u5199\u5728\u6700\u524D\uFF08\u4EBA\u773C\u4E00\u770B\u5C31\u77E5\u9053\u591A\u65B0\uFF09\uFF1B\u9876\u5C42\u4E0D\u8BA4\u8BC6\u7684\u952E\u5939\u5728\u4E2D\u95F4\u539F\u6837\u5E26\u56DE\uFF1Bindex / items \u6BBF\u540E\u3002\u5199\u5165\u5668\u53EA\u5199\u672C\u5E93\u7684\u62CD\uFF0C\u76F4\u901A\u7684\u952E\u91CC\u4E0D\u542B\u62CD\u5B50\u672C\u8EAB\u3002\n    const manifest = { version: DECK_MANIFEST_STAMP.major, minor: DECK_MANIFEST_STAMP.minor, patch: DECK_MANIFEST_STAMP.patch };\n    for (const k of Object.keys(s.extra ?? {}))\n        if (!KNOWN_MANIFEST_KEYS.has(k))\n            manifest[k] = s.extra[k];\n    manifest.index = index;\n    manifest.items = items;\n    const out = new Map();\n    out.set(`${dir}/${DECK_MANIFEST_NAME}`, new Blob([JSON.stringify(manifest)], { type: \"application/json\" }));\n    for (const [n, b] of files)\n        out.set(n, b);\n    return out;\n}\n", "// codec.ts \u2014\u2014 \u56FE\u7247\u89E3\u7801 / \u7F16\u7801\u63A5\u7F1D\uFF08app \u57DF\u552F\u4E00\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\uFF08\u6284 WebXiaoHeiWu src/image/codec.ts \u7684\u89E3\u7801\u8FB9\u754C\uFF09\n//   \u3010\u786C\u539F\u5219\u3011\u5E93\u5916\u4E0D\u8BB8\u518D\u4E3A\u56FE\u7247\u5EFA canvas / \u8C03 createImageBitmap\u2014\u2014\u5B57\u8282\u8FDB\u51FA\u4E00\u5F8B\u8D70\u8FD9\u91CC\uFF08\u5BB6\u89C4\u300C\u5B57\u8282\u8FDB\u51FA\u4E0D\u8D70 canvas\u300D\u7684\u552F\u4E00\u8C41\u514D\u70B9\uFF1A\n//   \u6D4F\u89C8\u5668\u89E3\u7801\u5668 + canvas **\u8BFB\u51FA\u4E00\u6B21**\uFF0C\u4E4B\u540E\u5168\u5B57\u8282\uFF1B\u91CD\u91C7\u6837 / \u538B PNG \u5728 @internal/gallery \u7684\u7EAF\u51FD\u6570\u91CC\uFF09\u3002\n//   user 2026-10-08\u300C\u7F29\u5C01\u9762\u90A3\u4E00\u6B21 canvas\u2026\u8001\u89C4\u77E9\uFF0C\u62BD\u8C61\u5C01\u88C5\u4E00\u4E0B\u53EA\u66B4\u9732\u8FD9\u4E2A\u538B\u7F29\u529F\u80FD\uFF0C\u4EE5\u540E\u80FD\u7528\u522B\u7684\u5E73\u66FF\u6362\u300D\u2192 \u4EE5\u540E\u6362 WASM \u89E3\u7801\u5668\u53EA\u6362\u8FD9\u4E00\u4E2A\u6587\u4EF6\u3002\nimport type { RgbaImage } from \"@internal/gallery\";\n\nexport type { RgbaImage };\n\nfunction makeCanvas(w: number, h: number): OffscreenCanvas | HTMLCanvasElement {\n  w = Math.max(1, w | 0); h = Math.max(1, h | 0);\n  return (typeof OffscreenCanvas !== \"undefined\") ? new OffscreenCanvas(w, h) : (() => { const c = document.createElement(\"canvas\"); c.width = w; c.height = h; return c; })();\n}\ntype Decoded = ImageBitmap | HTMLImageElement;\nasync function decodeBlob(blob: Blob): Promise<Decoded> {\n  // \u65B9\u5411\uFF1Afrom-image = \u6309 EXIF \u6446\u6B63\uFF08\u73B0\u4EE3\u6D4F\u89C8\u5668\u9ED8\u8BA4\u5373\u5982\u6B64\uFF1B\u663E\u5F0F\u5199\u4E0A\uFF0C\u8001\u5F15\u64CE\u4E0D\u8BA4\u8FD9\u4E2A\u9009\u9879\u5C31\u9000\u56DE\u65E0\u9009\u9879\uFF09\u3002\n  try { return await createImageBitmap(blob, { imageOrientation: \"from-image\" } as ImageBitmapOptions); } catch { /* fall through */ }\n  try { return await createImageBitmap(blob); } catch { /* fall through */ }\n  return await new Promise((resolve, reject) => {\n    const url = URL.createObjectURL(blob); const img = new Image();\n    img.onload = () => { URL.revokeObjectURL(url); resolve(img); };\n    img.onerror = () => { URL.revokeObjectURL(url); reject(new Error(\"image decode failed\")); };\n    img.src = url;\n  });\n}\n/** \u89E3\u7801\u8FB9\u754C\uFF1A\u6D4F\u89C8\u5668\u89E3\u7801 + canvas \u8BFB\u51FA**\u4E00\u6B21** \u2192 straight RGBA \u5B57\u8282\u3002GIF \u53D6\u9996\u5E27\u3002 */\nexport async function decodeToRgba(blob: Blob): Promise<RgbaImage> {\n  const src = await decodeBlob(blob);\n  const w = src.width || (src as HTMLImageElement).naturalWidth, h = src.height || (src as HTMLImageElement).naturalHeight;\n  const c = makeCanvas(w, h);\n  const cx = c.getContext(\"2d\", { willReadFrequently: true }) as CanvasRenderingContext2D | null;\n  if (!cx) throw new Error(\"2d context unavailable\");\n  cx.drawImage(src as CanvasImageSource, 0, 0);\n  const img = cx.getImageData(0, 0, w, h);\n  if (\"close\" in src) try { (src as ImageBitmap).close(); } catch { /* ignore */ }\n  return { data: img.data, w, h };\n}\n/** PNG \u7F16\u7801\uFF08vendored UPNG\uFF0C\u60F0\u6027\u52A0\u8F7D\uFF09\uFF1Acolors=0 \u65E0\u635F RGBA8\uFF1B>0 \u8C03\u8272\u677F\u91CF\u5316\uFF08\u5C01\u9762\u7F29\u7565\u56FE\u9884\u7B97\u6863\uFF09\u3002\u7EAF JS\uFF0C\u4E0D\u78B0 canvas\u3002 */\nexport async function encodePng(rgba: Uint8ClampedArray, w: number, h: number, colors: number): Promise<Uint8Array> {\n  const { default: UPNG } = await import(\"../../vendor/upng/upng.esm.js\");\n  return new Uint8Array(UPNG.encode([new Uint8Array(rgba).buffer], w, h, colors));\n}\n", "// shrink.ts \u2014\u2014 \u53C2\u8003\u7A97\u56FE\u7247\u7684\u300C\u538B\u4E00\u4E0B\u300D\uFF1A\u957F\u8FB9\u5C01\u9876 + \u8C03\u8272\u677F PNG\u3002created 2026-10-09 by Claude Opus 5.5\n// user\u300C\u4E0D\u8FC7\u6211\u4EECmp3\u5176\u5B9E\u9ED8\u8BA4\u4E0D\u538B\uFF0C\u5BFC\u5165\u7684\u65F6\u5019\u6709\u4E00\u4E2A\u5BF9\u8BDD\u6846\u544A\u8BC9\u4F60\u5927\u5C0F\uFF0C\u7136\u540E\u95EE\u4F60\u8981\u4E0D\u8981\u538B\u3002\u56FE\u7247\u4E5F\u4E00\u6837\u300D\uFF08\u9ED8\u8BA4\u539F\u6837\u5B58\uFF0C\u7528\u6237\u9009\u4E86\u624D\u538B\uFF09\u3002\n// \u89E3\u7801 = src/image/codec.ts\uFF08\u552F\u4E00 canvas \u70B9\uFF09\uFF1B\u7F29\u56FE = @internal/gallery \u7684\u7EAF\u51FD\u6570\uFF08\u9762\u79EF\u5E73\u5747\uFF09\uFF1B\u7F16\u7801 = vendored UPNG\uFF08256 \u8272\u8C03\u8272\u677F\u2014\u2014\u8C31\u9762\u622A\u56FE\u591A\u534A\u9ED1\u767D\uFF0C\u538B\u5F97\u6700\u72E0\uFF1B\u7167\u7247\u4F1A\u6709\u8272\u5E26\uFF0C\u7528\u6237\u770B\u4E86\u4F30\u8BA1\u518D\u9009\uFF09\u3002\nimport { areaResampleRgba, fitWithin } from \"@internal/gallery\";\nimport { decodeToRgba, encodePng } from \"./codec.ts\";\n\nexport const REF_IMAGE_EDGE = 2048;   // \u957F\u8FB9\u4E0A\u9650\uFF08px\uFF09\uFF1AiPad \u622A\u56FE 2048 \u00D7 2732 \u7F29\u5230 1533 \u00D7 2048\uFF0C\u8C31\u4E0A\u7684\u5B57\u8FD8\u770B\u5F97\u6E05\nexport const REF_IMAGE_COLORS = 256;\n\n/** \u56FE\u7247\u5B57\u8282 \u2192 PNG\uFF08\u957F\u8FB9 \u2264 edge\u3001\u8C03\u8272\u677F colors \u8272\uFF1B\u900F\u660E\u7167\u65E7\u900F\u660E\uFF09\u3002 */\nexport async function shrinkImage(blob: Blob, edge = REF_IMAGE_EDGE, colors = REF_IMAGE_COLORS): Promise<{ png: Uint8Array; w: number; h: number }> {\n  const src = await decodeToRgba(blob), t = fitWithin(src.w, src.h, edge);\n  const px = t.w === src.w && t.h === src.h ? new Uint8ClampedArray(src.data) : areaResampleRgba(src.data, src.w, src.h, t.w, t.h);\n  return { png: await encodePng(px, t.w, t.h, colors), w: t.w, h: t.h };\n}\n", "// ref-transcode.ts \u2014\u2014 \u53C2\u8003\u7A97\u7684\u300C\u538B\u4E00\u4E0B\u300D\uFF08\u6CE8\u5165\u7ED9 @internal/reference-window 0.4.0 \u7684 RefTranscoder\uFF09\u3002created 2026-10-09 by Claude Opus 5.5\n// user\u300C\u5E93\u5347minor + mp3\u529F\u80FD\uFF0C\u6700\u597D\u52A0\u4E00\u4E2A\u538B\u5236\u8F6C\u5F55\u7684injection\u62BD\u8C61\u63A5\u53E3\u300D\u300C\u7136\u540Eapi\u7684\u5E94\u8BE5\u662F\u56FE\u7247\u97F3\u9891\u89C6\u9891\u8F6C\u7801\u90FD\u662Fapp\u63D0\u4F9B\u300D\n//   \u300C\u4E0D\u8FC7\u6211\u4EECmp3\u5176\u5B9E\u9ED8\u8BA4\u4E0D\u538B\uFF0C\u5BFC\u5165\u7684\u65F6\u5019\u6709\u4E00\u4E2A\u5BF9\u8BDD\u6846\u544A\u8BC9\u4F60\u5927\u5C0F\uFF0C\u7136\u540E\u95EE\u4F60\u8981\u4E0D\u8981\u538B\u3002\u56FE\u7247\u4E5F\u4E00\u6837\u300D\u300C\u5E94\u7528\u5185\u5C0F\u9762\u677F \u5982\u679C\u652F\u6301\u538B\u7F29\u7684\u8BDD\u5E94\u8BE5\u6709\u538B\u7F29\u9009\u9879\u548C\u4F30\u8BA1\u300D\u3002\n// \u00B7 \u97F3\u9891\uFF1A\u6D4F\u89C8\u5668\u89E3\u7801\uFF08OfflineAudioContext\uFF0C\u7EDF\u4E00\u5230 44.1 kHz\uFF09\u2192 \u5BFC\u51FA mp3 \u7528\u7684\u540C\u4E00\u4E2A LAME worker\uFF0C128 kbps\uFF08\u5355\u58F0\u9053\u4E5F 128k\uFF1A\u6252\u8C31\u8981\u542C\u5F97\u6E05\uFF09\uFF1B\n//   \u4F30\u8BA1 = \u65F6\u957F \u00D7 128 kbps\uFF08\u65F6\u957F\u4ECE <audio> \u7684\u5143\u6570\u636E\u8BFB\uFF0C\u4E0D\u89E3\u7801\u2014\u2014\u4F30\u7684\u65F6\u5019\u4E0D\u5403\u5185\u5B58\uFF09\u3002\n// \u00B7 \u56FE\u7247\uFF1Asrc/image/shrink.ts\uFF08\u957F\u8FB9 \u2264 2048\u3001256 \u8272 PNG\uFF09\uFF1B\u4F30\u8BA1 = \u771F\u538B\u4E00\u904D\uFF08\u8BB0\u4F4F\u7ED3\u679C\uFF0C\u9009\u4E86\u300C\u538B\u4E00\u4E0B\u300D\u76F4\u63A5\u7528\u8FD9\u4EFD\uFF0C\u4E0D\u538B\u7B2C\u4E8C\u904D\uFF09\u3002\n// \u00B7 \u89C6\u9891\uFF1A\u4E0D\u538B\uFF08\u5E93\u8FD9\u4E00\u7248\u4E5F\u6CA1\u6709\u89C6\u9891\u5361\uFF09\u3002\n// \u672C\u6587\u4EF6\u53EA import \u5E93\u7684\u7C7B\u578B\uFF08\u63A5\u7F1D\u5B88\u536B\u53EA\u7BA1\u503C\u7EA7 import\uFF1B\u503C\u7EA7\u53EA\u5728 reference-host.ts\uFF09\u3002\nimport type { RefTranscoder, RefImportKind } from \"@internal/reference-window\";\nimport { encodeMp3 } from \"../export/mp3.ts\";\nimport { shrinkImage, REF_IMAGE_EDGE, REF_IMAGE_COLORS } from \"../image/shrink.ts\";\n\nexport const REF_MP3_KBPS = 128;\nconst SR = 44100;\n\n/** \u97F3\u9891\u65F6\u957F\uFF08\u79D2\uFF1B\u8BFB\u5143\u6570\u636E\uFF0C\u4E0D\u89E3\u7801\uFF09\u3002\u8BFB\u4E0D\u51FA / \u6D41\u5F0F\uFF08Infinity\uFF09= null\u3002 */\nfunction durationOf(f: Blob): Promise<number | null> {\n  return new Promise((ok) => {\n    const a = document.createElement(\"audio\"), url = URL.createObjectURL(f);\n    const done = (v: number | null) => { clearTimeout(t); URL.revokeObjectURL(url); a.removeAttribute(\"src\"); ok(v); };\n    const t = setTimeout(() => done(null), 5000);\n    a.preload = \"metadata\";\n    a.onloadedmetadata = () => done(Number.isFinite(a.duration) && a.duration > 0 ? a.duration : null);\n    a.onerror = () => done(null);\n    a.src = url;\n  });\n}\nasync function decodeAudio(f: Blob): Promise<AudioBuffer> {\n  const Ctx = (globalThis as { OfflineAudioContext?: typeof OfflineAudioContext; webkitOfflineAudioContext?: typeof OfflineAudioContext }).OfflineAudioContext\n    ?? (globalThis as { webkitOfflineAudioContext?: typeof OfflineAudioContext }).webkitOfflineAudioContext;\n  if (!Ctx) throw new Error(\"\u8FD9\u4E2A\u6D4F\u89C8\u5668\u89E3\u4E0D\u4E86\u97F3\u9891\");\n  return await new Ctx(1, 1, SR).decodeAudioData(await f.arrayBuffer());\n}\n\nexport function createRefTranscoder(): RefTranscoder {\n  const images = new WeakMap<Blob, Promise<{ blob: Blob; mime: string; note: string }>>();   // \u4F30\u8BA1\u65F6\u538B\u8FC7\u7684\u90A3\u4EFD\uFF08\u9009\u4E86\u300C\u538B\u4E00\u4E0B\u300D\u76F4\u63A5\u7528\uFF09\n  const image = (f: Blob) => {\n    let p = images.get(f);\n    if (!p) {\n      p = shrinkImage(f).then((r) => ({ blob: new Blob([r.png as unknown as BlobPart], { type: \"image/png\" }), mime: \"image/png\", note: `PNG ${REF_IMAGE_COLORS} \u8272\u3001${r.w} \u00D7 ${r.h}\uFF08\u957F\u8FB9\u6700\u591A ${REF_IMAGE_EDGE}\uFF09` }));\n      images.set(f, p); p.catch(() => images.delete(f));\n    }\n    return p;\n  };\n  return {\n    kinds: [\"image\", \"audio\"],\n    async estimate(kind: RefImportKind, f: Blob) {\n      if (kind === \"image\") return (await image(f)).blob.size;\n      if (kind === \"audio\") { const d = await durationOf(f); return d === null ? null : Math.round((d * REF_MP3_KBPS * 1000) / 8); }\n      return null;\n    },\n    async encode(kind: RefImportKind, f: Blob) {\n      if (kind === \"image\") { const r = await image(f); images.delete(f); return r; }\n      if (kind === \"audio\") {\n        const buf = await decodeAudio(f), left = buf.getChannelData(0), right = buf.numberOfChannels > 1 ? buf.getChannelData(1) : null;\n        const bytes = await encodeMp3(left, right, buf.sampleRate, REF_MP3_KBPS);\n        return { blob: new Blob([bytes], { type: \"audio/mpeg\" }), mime: \"audio/mpeg\", note: `mp3 ${REF_MP3_KBPS}k${right ? \"\" : \" \u5355\u58F0\u9053\"}\u3001${(buf.duration / 60).toFixed(1)} \u5206\u949F` };\n      }\n      throw new Error(`\u4E0D\u4F1A\u538B\u8FD9\u79CD\uFF1A${kind}`);\n    },\n  };\n}\n", "// \u53C2\u8003\u7A97\u7684\u5BBF\u4E3B\u9002\u914D\u5C42\u3002created 2026-10-08 \u6DF1\u591C by Claude Opus 5.5\uFF08v0.8 \u53C2\u8003\u7A97\u7EAA\u5143\uFF1B\u5BF9\u9F50\u7A3F = ai-docs/20261008-reference-window-alignment.md\uFF09\n// user\uFF1A\u300C\u73B0\u5728\u6700\u536B\u751F\u7684\u662Freference window\u7136\u540E\u8FD8\u6709\u5B9E\u65F6\u9884\u89C8\u300D\u300Cmp3\u53EF\u4EE5\u6682\u7F13\u3002\u73B0\u5728\u4E3B\u8981\u5C31\u662F\u5BF9\u7740\u622A\u56FE\u6253\u8C31\u54C8\u54C8\u54C8\u300D\n//   \u300C\u6587\u5B57\u4E5F\u652F\u6301\uFF0C\u53CD\u6B63\u5C31\u662F\u65E0\u8111\u4E00\u5305\u76F4\u63A5\u7528\u3002\u6587\u5B57\u6BD4\u5982\u4E00\u4E9B\u548C\u58F0\u4E4B\u7C7B\u7684\u4E1C\u897F\u90FD\u86EE\u6709\u7528\u7684\u300D\u3002\n//\n// \u53C2\u8003\u7A97\u672C\u4F53 = \u5BB6\u65CF\u5171\u4EAB\u5E93 @internal/reference-window\uFF08\u724C\u7EC4\u6A21\u578B + \u9ED8\u8BA4\u89C6\u56FE <wp-reference-window>\uFF09\u3002**\u672C\u6587\u4EF6\u662F MoonSinger \u91CC\u552F\u4E00\u8BA4\u8BC6\u90A3\u4E2A\u5E93\u7684\u5730\u65B9**\n//   \uFF08test/reference-guard.test.ts \u5B88\u7740\uFF09\uFF0C\u6837\u677F = WXHW src/reference-host.ts\uFF1A\n//   \u00B7 \u5361\uFF1A\u5E93\u73B0\u6709\u7684\u56FE\u7247\u5361 / \u6587\u5B57\u5361\u6574\u5305\u6536\uFF08\u622A\u56FE\u3001\u548C\u58F0\u7B14\u8BB0\uFF09\uFF1Blive / \u94FE\u63A5\u5361\u8FD9\u4E00\u7248\u4E0D\u63A5\uFF0C\u522B\u7684\u79CD\u7C7B\u5E93\u539F\u6837\u5E26\u7740\n//   \u00B7 \u5B58\uFF1A`.moonsinger/references/` \u6574\u4E2A\u76EE\u5F55\uFF08manifest.json + \u6BCF\u5F20\u5361\u7684\u5B57\u8282\uFF09\u7ECF\u5E93\u7684 encodeDeck / decodeDeck \u8FDB\u51FA\uFF0C\u672C\u6587\u4EF6\u53EA\u642C\u5B57\u8282\uFF1B\n//     \u4E0D\u653E\u8FDB extras\uFF08extras \u8FDB\u64A4\u9500\u5FEB\u7167\u2014\u2014\u53C2\u8003\u7A97\u4E0D\u8FDB\u64A4\u9500\uFF0C\u540C WXHW\uFF09\uFF0C\u5BBF\u4E3B\u62FF files() / rev() \u5B58\u3001\u62FF apply() \u5F00\n//   \u00B7 \u810F\uFF1A\u52A0 / \u5220 / \u632A\u5361 = \u6B63\u7ECF\u6539\u52A8\uFF08\u7F16\u597D\u5B57\u8282\u4E4B\u540E rev +1\u3001onCards() \u901A\u77E5\u5BBF\u4E3B\uFF09\uFF1B\u5F00\u5173\u7A97 / \u632A\u7A97 / \u7FFB\u5361 = \u89C6\u56FE\u6001\uFF08\u5BBF\u4E3B\u5B58\u65F6\u987A\u624B\u635E\uFF0C\u4E0D\u6807\u810F\uFF09\n//   \u00B7 \u6E05\u5355\u6BD4\u5E93\u65B0\uFF08DeckManifestTooNewError\uFF09\u2192 \u76EE\u5F55\u539F\u6837\u5E26\u7740\u3001\u5B58\u7684\u65F6\u5019\u539F\u6837\u5199\u56DE\u3001\u660E\u8BF4\uFF1B\u4E0D\u541E\u3001\u4E0D\u731C\n//   \u00B7 \u56FE\u7247\u539F\u6837\u5B58\uFF08\u5BB6\u89C4\u300C\u5B57\u8282\u8FDB\u51FA\u4E0D\u8D70 canvas\u300D\uFF1B\u5E93\u4E5F\u8BF4\u6CA1\u7F16\u7801\u5668\u5C31\u7559\u539F\u5B57\u8282\uFF09\uFF1B\u5355\u5F20\u8D85\u8FC7 4 MB \u5148\u95EE\u4E00\u53E5\u300C\u5B58\u8FDB\u6B4C\u91CC / \u53D6\u6D88\u300D\uFF08\u5BB6\u65CF\u6279\u8FC7\u7684\u63D0\u9192\u7EBF\uFF09\n//     \u2192 0.4.0\uFF082026-10-09\uFF0Cv0.9.x\uFF09\uFF1A\u56FE\u7247 / \u97F3\u9891\u8D85\u8FC7 1 MB \u90FD\u95EE\uFF08user\u300C3. \u97F3\u9891\u4E5F\u8D85\u8FC71MB\u624D\u95EE\uFF1F\u300D\uFF09\uFF1A\u5B58\u8FDB\u6B4C\u91CC / \u538B\u4E00\u4E0B\uFF08\u7EA6 X MB\uFF1Bsrc/app/ref-transcode.ts \u6CE8\u5165\uFF09/\n//       \u53EA\u653E\u5185\u5B58\uFF08\u4E0D\u5B58\u8FDB\u6B4C\u91CC\uFF1B\u8BFB\u56DE\u6765\u662F\u7A7A\u4F4D\uFF0C\u540C\u540D\u6587\u4EF6\u62D6\u8FDB\u6765\u8865\u4E0A\u2014\u2014user\u300C\u7136\u540E\u80FD\u4E0D\u80FD\u52A0RAM only\uFF0C\u5C31\u662F\u4E0D\u843D\u76D8\uFF0C\u6BCF\u6B21\u91CD\u65B0\u4E0A\u4F20\u300D\uFF09/ \u7B97\u4E86\u3002\n//       \u8D85\u8FC7 4 MB \u628A\u300C\u53EA\u653E\u5185\u5B58\u300D\u6392\u7B2C\u4E00\uFF08user\u300C\u8FD9\u91CC\u53EF\u80FD\u662F\u5168\u5BB6\u65CF\u4ED3\u6211\u4EEC\u552F\u4E00\u4E00\u4E2A\u771F\u7684\u9700\u8981nudge\u7528\u6237\u300D\uFF09\u3002\u95EE\u7684\u9762\u677F\u662F\u5BBF\u4E3B\u7684\uFF08main.ts askImport\uFF09\uFF0C\u4E0D\u7528\u7CFB\u7EDF\u5BF9\u8BDD\u6846\u3002\n//   \u00B7 \u97F3\u9891\u5361\uFF08\u5E93 0.4.0\uFF09\uFF1A\u64AD\u653E / \u6682\u505C + \u8FDB\u5EA6\u6761\uFF1B\u5FAA\u73AF\u3001\u901F\u5EA6 1 / 0.75 / 0.5\uFF08user\u300C\u9ED8\u8BA4\u4E0D\u5F00\uFF0Cmoonsinger\u5F00\u300D\uFF09\uFF1B\u5173\u7A97\u3001\u7FFB\u5361\u4E0D\u505C\uFF08user\u300C\u4E0D\u505C\u300D\uFF09\n//   \u00B7 \u7C98\u8D34\u770B\u7126\u70B9\uFF1A\u7A97\u6709\u7126\u70B9 = \u8D34\u8FDB\u7A97\uFF1B\u6CA1\u6709 = \u5BBF\u4E3B\u7167\u65E7\uFF08\u8C31\u91CC\u8D34\u7B80\u8C31\u6587\u5B57\uFF09\nimport \"@internal/reference-window\";\nimport type { WpReferenceWindow, RefMenuPort, RefPanelRect, RefImportQuestion, RefImportChoice } from \"@internal/reference-window\";\nimport { encodeDeck, decodeDeck, mimeForName, DeckManifestTooNewError } from \"@internal/reference-window/deck\";\nimport { togglePopupMenu } from \"@internal/workbench-elements\";\nimport { createRefTranscoder } from \"./ref-transcode.ts\";\n\nconst APP = \"moonsinger\";                          // \u76EE\u5F55 = .moonsinger/references/\uFF08\u5E93\u6309 app \u540D\u7B97\uFF09\nconst KINDS = [\"image\", \"text\", \"audio\", \"video\"] as const; // \u8FD9\u4E2A\u5BBF\u4E3B\u753B\u5F97\u51FA\u6765\u7684\uFF08\u89C6\u9891 = \u53C2\u8003\u7A97 0.5.0 \u8D77\uFF09\uFF1B\u5176\u4F59\u7684\u5E93\u539F\u6837\u5E26\u7740\nexport const ASK_ABOVE = 1024 * 1024;              // \u56FE\u7247 / \u97F3\u9891 / \u89C6\u9891\u8D85\u8FC7 1 MB \u5148\u95EE\uFF08\u5B58 / \u538B / \u53EA\u653E\u5185\u5B58 / \u7B97\u4E86\uFF09\uFF1B\u97F3\u9891 / \u89C6\u9891\u9ED8\u8BA4\u53EA\u653E\u5185\u5B58\uFF08\u5E93 0.5.0\uFF0C\u4E0D\u8986\u76D6\uFF09\nexport const RAM_ABOVE = 4 * 1024 * 1024;          // \u8D85\u8FC7 4 MB\uFF1A\u95EE\u7684\u65F6\u5019\u300C\u53EA\u653E\u5185\u5B58\u300D\u6392\u7B2C\u4E00\uFF08\u6280\u672F\u65B9\u6848\u6279\u8FC7\u7684 4 MB \u63D0\u9192\u7EBF\uFF09\nexport type { RefImportQuestion, RefImportChoice };\n/** \u7A97\u7684\u4F4D\u7F6E / \u5F00\u7740\u6CA1\u6709\uFF08\u89C6\u56FE\u6001\uFF1A\u5B58\u8FDB score.json \u7684 view.ref\uFF0C\u4E0D\u6807\u810F\u3001\u4E0D\u8FDB\u64A4\u9500\uFF09\u3002 */\nexport interface RefPanel { open: boolean; left: number; top: number; width: number; height: number }\n\nexport interface ReferenceHostDeps {\n  info(text: string): void;\n  error(text: string): void;\n  /** \u9876\u680F\u4E0B\u7F18\uFF08\u6D6E\u7A97\u4E0D\u5F80\u4E0A\u8D8A\u8FC7\u5B83\uFF09\u3002 */\n  topFloor(): number;\n  /** \u5C4F\u5E95\u88AB\u5360\u6389\u7684\u9AD8\u5EA6\uFF08\u7AD6\u5C4F\u65F6 pad \u90A3\u4E00\u5757 + iOS \u952E\u76D8\u628A\u89C6\u53E3\u9876\u8D77\u7684\u4E00\u622A\uFF09\uFF1A\u62D6 / \u7F29\u653E / \u94B3\u5236\u90FD\u7559\u51FA\u5B83\uFF0C\u53F3\u4E0B\u89D2\u7684\u628A\u624B\u4E0D\u8EB2\u5230 pad \u5E95\u4E0B\u3002 */\n  bottomFloor(): number;\n  /** \u5173\u7A97 / Esc \u4E4B\u540E\u7126\u70B9\u8FD8\u7ED9\u8C31\u3002 */\n  focusScore(): void;\n  /** \u6587\u4EF6\u8D85\u8FC7 1 MB\uFF1A\u95EE\u5B58 / \u538B / \u53EA\u653E\u5185\u5B58 / \u7B97\u4E86\uFF08\u5E94\u7528\u5185\u9762\u677F\uFF0C\u4E0D\u7528\u7CFB\u7EDF\u5BF9\u8BDD\u6846\uFF09\u3002 */\n  askImport(q: RefImportQuestion): Promise<RefImportChoice>;\n  /** \u5361\u7247\u53D8\u4E86\u3001\u5B57\u8282\u5DF2\u7ECF\u7F16\u597D\uFF08files() / rev() \u5DF2\u662F\u65B0\u7684\uFF09\uFF1A\u5BBF\u4E3B\u6807\u810F\u3001\u901A\u77E5\u5B58\u6863\u8282\u5F8B\u3002 */\n  onCards(): void;\n}\n\nexport function createReferenceHost(d: ReferenceHostDeps) {\n  const el = document.createElement(\"wp-reference-window\") as WpReferenceWindow;\n  el.className = \"ref-window\";\n  const fileInput = document.createElement(\"input\");\n  fileInput.type = \"file\"; fileInput.multiple = true; fileInput.hidden = true; fileInput.accept = \"image/*,audio/*,video/*,.txt,.md,text/plain,text/markdown\";\n  document.body.append(el, fileInput);\n\n  let encoded: Record<string, Uint8Array> = {};      // \u73B0\u5728\u8981\u5B58\u7684\u90A3\u4EFD\u5B57\u8282\uFF08\u8DEF\u5F84 \u2192 \u5B57\u8282\uFF1B\u8DEF\u5F84\u90FD\u5728 .moonsinger/references/ \u4E0B\uFF09\n  let rev = 0;                                         // \u5361\u7247\u6539\u52A8\u7684\u4FEE\u8BA2\u53F7\uFF08\u5BBF\u4E3B\u62FF\u5B83\u5224\u810F\uFF09\n  let seq = 0;                                         // \u7F16\u7801\u6392\u961F\uFF1A\u540E\u6765\u7684\u8D62\n  let carried = false;                                 // \u6E05\u5355\u6BD4\u5E93\u65B0\uFF1Aencoded \u662F\u539F\u6837\u5E26\u7740\u7684\uFF0C\u4E0D\u4ECE\u724C\u7EC4\u91CD\u7F16\n  let applying = false;                                // apply \u671F\u95F4\u724C\u7EC4\u7684 reset \u4E0D\u7B97\u7528\u6237\u6539\u52A8\n  let placed = false;                                  // \u8FD9\u9996\u6B4C\u91CC\u5F00\u8FC7\u7A97\uFF08\u6CA1\u5F00\u8FC7 = view \u91CC\u4E0D\u5199 ref\uFF09\n  let pending: Promise<void> = Promise.resolve();\n\n  // \u2500\u2500 \u6CE8\u5165 \u2500\u2500\n  el.menuPort = ((o) => togglePopupMenu(o)) as RefMenuPort;\n  el.setAttribute(\"no-cloud\", \"\");                     // \u4E0D\u4ECE\u4E91\u76D8\u9009\u56FE\uFF08\u6B4C\u5E93\u4E0D\u662F\u56FE\u5E93\uFF1BiPad \u7684\u300C\u6587\u4EF6\u300D\u5DF2\u7ECF\u80FD\u6311\u76F8\u518C / OneDrive\uFF09\n  el.labels = {\n    paste: \"\u7C98\u8D34\", oneToOne: \"\u539F\u5C3A\u5BF8\", del: \"\u5220\u6389\u8FD9\u5F20\", delConfirm: \"\u518D\u70B9\u4E00\u6B21\u5220\u6389\", closeWin: \"\u6536\u8D77\u53C2\u8003\u7A97\",\n    prev: \"\u4E0A\u4E00\u5F20\", next: \"\u4E0B\u4E00\u5F20\", menu: \"\u53C2\u8003\u7A97\u83DC\u5355\", move: \"\u70B9\u4E00\u4E0B\u7F29\u6210\u5C0F\u56FE\u6807\uFF0C\u6309\u4F4F\u62D6\u52A8\u632A\u4F4D\u7F6E\", resize: \"\u6539\u5927\u5C0F\", resizeAria: \"\u6539\u5927\u5C0F\",\n    moveEarlier: \"\u5F80\u524D\u632A\", moveLater: \"\u5F80\u540E\u632A\", jump: \"\u8DF3\u5230\u2026\", kindNames: { image: \"\u56FE\u7247\", text: \"\u6587\u5B57\", audio: \"\u97F3\u9891\", video: \"\u89C6\u9891\" }, linkMissing: \"\u5185\u5BB9\u4E0D\u5728\u4E86\",\n    load: \"\u5BFC\u5165\u56FE\u7247 / \u97F3\u9891 / \u89C6\u9891 / \u6587\u5B57\u2026\", play: \"\u64AD\u653E\", pause: \"\u6682\u505C\", loop: \"\u5FAA\u73AF\", rate: \"\u901F\u5EA6\",\n    prevFrame: \"\u4E0A\u4E00\u5E27\", nextFrame: \"\u4E0B\u4E00\u5E27\",   // \u53C2\u8003\u7A97 0.5.0 \u89C6\u9891\u5361\uFF08\u56FE\u6807 = \u5E93\u91CC\u7684 skip-prev / skip-next\uFF0Cuser\u300C\u9010\u5E27\u6309\u94AE\u5148\u4E0D\u7528\u300D= \u4E0D\u53E6\u753B\uFF09\n    ram: \"\u53EA\u653E\u5185\u5B58\uFF08\u4E0D\u5B58\u8FDB\u6B4C\u91CC\uFF09\", ramMissing: \"\u53EA\u5728\u5185\u5B58\u91CC\uFF0C\u6CA1\u5B58\u8FDB\u6B4C\u91CC\u2014\u2014\u628A\u8FD9\u4E2A\u6587\u4EF6\u62D6\u8FDB\u6765\uFF0C\u6216\u8005\u70B9 \uFF0B \u91CD\u65B0\u5BFC\u5165\uFF0C\u5C31\u8865\u56DE\u8FD9\u91CC\",\n    minimize: \"\u7F29\u6210\u5C0F\u56FE\u6807\", restore: \"\u70B9\u4E00\u4E0B\u6062\u590D\uFF0C\u6309\u4F4F\u62D6\u52A8\u632A\u4F4D\u7F6E\",   // \u53C2\u8003\u7A97 0.4.1\uFF08\u5173\u7A97\u90A3\u4E2A\u5DF2\u7ECF\u53EB\u300C\u6536\u8D77\u300D\uFF0C\u8FD9\u91CC\u7528\u300C\u7F29\u300D\u533A\u5206\uFF09\n  };\n  el.audioRates = [1, 0.75, 0.5];   // \u6252\u8C31\u7528\uFF08\u4FDD\u97F3\u9AD8\uFF09\n  const transcoder = createRefTranscoder();\n  const syncFloor = () => { el.topFloor = d.topFloor(); el.bottomFloor = d.bottomFloor(); if (el.open) el.reclamp(); };\n  window.addEventListener(\"resize\", syncFloor);\n\n  // \u2500\u2500 \u724C\u7EC4\u53D8\u5316 \u2192 \u7F16\u5B57\u8282 \u2192 \u810F \u2500\u2500\n  const reencode = () => {\n    const my = ++seq;\n    pending = (async () => {\n      const out: Record<string, Uint8Array> = {};\n      for (const [path, blob] of encodeDeck(el.deck.snapshot(), { app: APP })) out[path] = new Uint8Array(await blob.arrayBuffer());\n      if (my !== seq) return;   // \u53C8\u6539\u8FC7\u4E86\uFF1A\u8BA9\u540E\u6765\u7684\u90A3\u6B21\u843D\n      encoded = out; carried = false; rev++;\n      d.onCards();\n    })();\n  };\n  el.deck.onChange((what) => { if (!applying && what.type === \"cards\") reencode(); });\n  el.addEventListener(\"openchange\", () => { if (el.open) { placed = true; syncFloor(); } });\n  el.addEventListener(\"rectchange\", () => { placed = true; });\n\n  // \u2500\u2500 \uFF0B \u83DC\u5355 / \u7C98\u8D34 / \u62D6\u653E \u2500\u2500\n  el.addEventListener(\"requestload\", () => { fileInput.value = \"\"; fileInput.click(); });\n  fileInput.addEventListener(\"change\", () => { const files = [...(fileInput.files ?? [])]; if (files.length) void importFiles(files); });\n  el.addEventListener(\"requestpaste\", () => { void pasteFromClipboard(); });\n  window.addEventListener(\"paste\", (e) => {   // \u7C98\u8D34\u770B\u7126\u70B9\uFF08\u5E93 0.3.1\uFF09\uFF1A\u7A97\u6709\u7126\u70B9 \u2192 \u6587\u4EF6 / \u6587\u5B57\u8FDB\u7A97\uFF1B\u6CA1\u6709 \u2192 \u4E0D\u7BA1\uFF0C\u5BBF\u4E3B\u7684\u7C98\u8D34\u7167\u65E7\n    if (!el.hasFocus) return;\n    const cd = e.clipboardData; if (!cd) return;\n    e.preventDefault(); e.stopPropagation();\n    const files = [...cd.files];\n    if (files.length) { void importFiles(files); return; }\n    const text = cd.getData(\"text/plain\");\n    if (text.trim()) { el.addText(text, { name: \"\" }); el.open = true; return; }\n    d.error(\"\u526A\u8D34\u677F\u91CC\u6CA1\u6709\u56FE\u7247\u6216\u6587\u5B57\");\n  }, true);\n  el.addEventListener(\"dragover\", (e) => { if (e.dataTransfer && Array.from(e.dataTransfer.types).includes(\"Files\")) { e.preventDefault(); e.stopPropagation(); e.dataTransfer.dropEffect = \"copy\"; } });\n  el.addEventListener(\"drop\", (e) => { const files = [...(e.dataTransfer?.files ?? [])]; if (!files.length) return; e.preventDefault(); e.stopPropagation(); void importFiles(files); });\n  el.addEventListener(\"notice\", (e) => {\n    const n = (e as CustomEvent).detail as { level: string; code: string; name?: string; message: string };\n    d.error(n.code === \"decode-failed\" ? `\u8FD9\u5F20\u56FE\u8FD9\u4E2A\u6D4F\u89C8\u5668\u6253\u4E0D\u5F00${n.name ? `\uFF1A${n.name}` : \"\"}` : `\u53C2\u8003\u7A97\uFF1A${n.message}`);\n  });\n  el.addEventListener(\"keydown\", (e) => { if (e.key === \"Escape\") { e.preventDefault(); d.focusScore(); } });   // Esc = \u7126\u70B9\u56DE\u8C31\uFF08\u7A97\u7559\u7740\uFF09\n\n  /** \u5BFC\u5165\uFF08\u83DC\u5355 / \u62D6\u653E / \u7C98\u8D34\u6587\u4EF6\uFF09\uFF1A\u5E93\u7684\u6F0F\u6597\uFF08\u55C5\u79CD\u7C7B \u2192 \u8D85\u8FC7 1 MB \u95EE \u2192 \u539F\u6837 / \u538B / \u53EA\u653E\u5185\u5B58 / \u4E0D\u8981\uFF09\uFF0C\u7ED3\u679C\u5982\u5B9E\u8BF4\u3002 */\n  async function importFiles(files: File[]): Promise<void> {\n    const r = await el.importFiles(files, { kinds: KINDS, transcoder, ask: (q) => d.askImport(q), askAbove: { image: ASK_ABOVE, audio: ASK_ABOVE, video: ASK_ABOVE }, ramAbove: RAM_ABOVE });   // defaultRam \u4E0D\u4F20 = \u5E93 0.5.0 \u7684\u9ED8\u8BA4\uFF1A\u97F3\u9891 / \u89C6\u9891\u53EA\u653E\u5185\u5B58\uFF08\u5F53\u6B21\u6709\u6548\uFF09\uFF0C\u56FE\u7247 / \u6587\u5B57\u968F\u6B4C\n    for (const k of r.skipped) {\n      if (k.why === \"unsupported\") d.error(`\u8BA4\u4E0D\u51FA\uFF1A${k.name}\uFF08\u53C2\u8003\u7A97\u6536\u56FE\u7247\u3001\u97F3\u9891\u548C\u6587\u5B57\uFF09`);\n      else if (k.why === \"failed\") d.error(`\u6CA1\u52A0\u4E0A\uFF1A${k.name}\uFF08${k.message ?? \"\u51FA\u9519\u4E86\"}\uFF09`);\n    }\n    const said = [r.added.length ? `\u52A0\u4E86 ${r.added.length} \u5F20` : \"\", r.filled.length ? `\u8865\u56DE ${r.filled.length} \u5F20\uFF08\u53EA\u653E\u5185\u5B58\u7684\u7A7A\u4F4D\uFF09` : \"\", ...r.notes].filter(Boolean);\n    if (r.added.length || r.filled.length) { el.focus({ preventScroll: true }); d.info(`\u53C2\u8003\u7A97\uFF1A${said.join(\"\uFF1B\")}`); }\n  }\n  async function pasteFromClipboard(): Promise<void> {\n    try {\n      for (const it of await navigator.clipboard.read()) {\n        const img = it.types.find((x) => x.startsWith(\"image/\"));\n        if (img) { await importFiles([new File([await it.getType(img)], `\u7C98\u8D34.${img.split(\"/\")[1] ?? \"png\"}`, { type: img })]); return; }\n        if (it.types.includes(\"text/plain\")) { const text = await (await it.getType(\"text/plain\")).text(); if (text.trim()) { el.addText(text, { name: \"\" }); el.open = true; return; } }\n      }\n      d.error(\"\u526A\u8D34\u677F\u91CC\u6CA1\u6709\u56FE\u7247\u6216\u6587\u5B57\");\n    } catch {\n      try { const text = await navigator.clipboard.readText(); if (text.trim()) { el.addText(text, { name: \"\" }); el.open = true; return; } } catch { /* \u6D4F\u89C8\u5668\u4E0D\u7ED9\u8BFB */ }\n      d.error(\"\u8BFB\u4E0D\u4E86\u526A\u8D34\u677F\uFF1A\u70B9\u4E00\u4E0B\u53C2\u8003\u7A97\uFF0C\u518D\u6309 Ctrl / \u2318+V\");\n    }\n  }\n\n  return {\n    /** \u73B0\u5728\u8981\u5B58\u7684\u5B57\u8282\uFF08\u8DEF\u5F84 \u2192 \u5B57\u8282\uFF09\u3002 */\n    files: (): Record<string, Uint8Array> => encoded,\n    /** \u5361\u7247\u6539\u52A8\u7684\u4FEE\u8BA2\u53F7\u3002 */\n    rev: () => rev,\n    /** \u7F16\u7801\u8FD8\u5728\u8DD1\u7684\u8BDD\u7B49\u5B83\uFF08\u5B58\u4E4B\u524D\u8C03\uFF0C\u514D\u5F97\u521A\u52A0\u7684\u5361\u6CA1\u8D76\u4E0A\uFF09\u3002 */\n    settled: () => pending,\n    /** \u5F00\u4E00\u9996\u6B4C\uFF1Afiles = \u6B4C\u91CC `.moonsinger/references/` \u4E0B\u7684\u5168\u90E8\u5B57\u8282\uFF1Bpanel = \u89C6\u56FE\u6001\u91CC\u8BB0\u7684\u7A97\uFF08\u6CA1\u6709 = \u6536\u7740\uFF09\u3002 */\n    async apply(files: Record<string, Uint8Array>, panel: RefPanel | null): Promise<void> {\n      seq++; applying = true; carried = false; encoded = { ...files }; placed = !!panel;\n      try {\n        if (!Object.keys(files).length) el.deck.clear();\n        else {\n          const decoded = await decodeDeck({ app: APP, knownKinds: KINDS, getFile: (p) => { const b = files[p]; return b ? new Blob([b as unknown as BlobPart], { type: mimeForName(p) }) : null; } });\n          el.deck.restore(decoded);\n          // \u5E93 0.5.0 \u6E05\u5355\u62CD\u5B50\uFF1Aminor \u6BD4\u8FD9\u7248\u65B0 = \u7167\u6837\u8BFB\u5199\uFF0C\u544A\u8BC9\u7528\u6237\u4E00\u6B21\uFF08\u4E0D\u5F39\u7A97\u4E0D\u62E6\uFF09\uFF1Bpatch \u6BD4\u8FD9\u7248\u65B0 = \u9759\u9ED8\uFF1Bmajor \u6BD4\u8FD9\u7248\u65B0 = \u4E0B\u9762\u7684 DeckManifestTooNewError\n          if (decoded.verdict === \"newer-minor\") d.info(\"\u8FD9\u9996\u6B4C\u7684\u53C2\u8003\u7A97\u662F\u66F4\u65B0\u7248\u672C\u7684 app \u5B58\u7684\uFF1A\u8FD9\u7248\u6CA1\u6709\u7684\u529F\u80FD\u4FDD\u5B58\u65F6\u4E0D\u4E22\uFF0C\u53EA\u662F\u770B\u4E0D\u5230\");\n        }\n      } catch (e) {\n        el.deck.clear();\n        if (e instanceof DeckManifestTooNewError) { carried = true; d.error(`\u8FD9\u9996\u6B4C\u7684\u53C2\u8003\u7A97\u662F\u66F4\u65B0\u7248\u672C\u7684 app \u5B58\u7684\uFF08\u53C2\u8003\u6E05\u5355\u7B2C ${e.fileVersion} \u7248\uFF0C\u8FD9\u4E00\u7248\u8BA4\u5230\u7B2C ${e.libVersion} \u7248\uFF09\uFF1A\u539F\u6837\u7559\u7740\u3001\u5B58\u7684\u65F6\u5019\u539F\u6837\u5199\u56DE\uFF0C\u8FD9\u91CC\u5148\u4E0D\u663E\u793A`); }\n        else { carried = true; d.error(`\u53C2\u8003\u7A97\u8BFB\u4E0D\u51FA\u6765\uFF1A${(e as Error).message}\uFF08\u5B57\u8282\u539F\u6837\u7559\u7740\u3001\u5B58\u7684\u65F6\u5019\u539F\u6837\u5199\u56DE\uFF09`); }\n      } finally { applying = false; }\n      if (panel) el.rect = { left: panel.left, top: panel.top, width: panel.width, height: panel.height };\n      el.open = !!panel?.open && !carried;\n      if (el.open) syncFloor();\n    },\n    /** \u89C6\u56FE\u6001\uFF1A\u5F00\u8FC7\u7A97\u624D\u6709\u3002 */\n    panel(): RefPanel | null { if (!placed) return null; const r: RefPanelRect = el.rect; return { open: el.open, left: Math.round(r.left), top: Math.round(r.top), width: Math.round(r.width), height: Math.round(r.height) }; },\n    /** \u83DC\u5355\u5165\u53E3\uFF1A\u5F00 = \u987A\u624B\u7ED9\u7126\u70B9\uFF08\u5F00\u7A97 \u2192 Ctrl+V \u4E00\u6B65\u5230\u4F4D\uFF09\uFF1B\u5173 = \u7126\u70B9\u56DE\u8C31\u3002 */\n    toggle(): void {\n      if (carried) { d.error(\"\u8FD9\u9996\u6B4C\u7684\u53C2\u8003\u7A97\u662F\u66F4\u65B0\u7248\u672C\u7684 app \u5B58\u7684\uFF0C\u8FD9\u4E00\u7248\u5148\u4E0D\u663E\u793A\uFF08\u539F\u6837\u7559\u7740\uFF09\"); return; }\n      el.open = !el.open;\n      if (el.open) { placed = true; syncFloor(); el.focus({ preventScroll: true }); } else d.focusScore();\n    },\n    isOpen: () => el.open,\n    hasFocus: () => el.hasFocus,\n    count: () => el.deck.cards().length,\n    /** pad \u9732 / \u6536\u3001\u89C6\u53E3\u53D8\u4E86\u4E4B\u540E\u5BBF\u4E3B\u8C03\u3002 */\n    relayout: syncFloor,\n    /** \u6D4B\u8BD5\u7528\uFF1A\u5BFC\u5165\uFF08\u540C\u83DC\u5355\u90A3\u6761\u8DEF\uFF09\u3002 */\n    importFiles,\n    el,\n  };\n}\nexport type ReferenceHost = ReturnType<typeof createReferenceHost>;\n", "// pdf.ts \u2014\u2014 \u6700\u5C0F PDF \u5199\u51FA\u5668\uFF08\u8C31\u7528\uFF09\u3002created 2026-10-09 by Claude Opus 5.5\uFF08user\u300C\u81EA\u5DF1\u5199pdf\uFF0C\u7136\u540E\u5B57\u4F53\u53EF\u4EE5\u9009\u666E\u901A\u7684\u548C\u90A3\u4E2A\u62FC\u97F3\u53EF\u7231\u7684\u2026\u6B4C\u8BCD\u7528\u5B57\u4F53\u300D\uFF09\u3002\n// \u9AA8\u67B6 = \u5144\u5F1F\u4ED3 WebXiaoHeiWu src/export/pdf.ts\uFF08Claude Fable 5.1\uFF0C2026-09-30\uFF09\uFF1A\u5BF9\u8C61\u3001\u6D41\uFF08Flate\uFF09\u3001\u9875\u6811\u3001\u4E00\u6B3E\u5B50\u96C6 TrueType\uFF08Type0 / CIDFontType2 / Identity-H\uFF0C\n//   \u5B57\u5F62\u53F7 = CID\u3001ToUnicode \u8BA9\u9605\u8BFB\u5668\u80FD\u9009\u4E2D / \u590D\u5236 / \u641C\u7D22\u6B4C\u8BCD\uFF09\u3002\u8C31\u53E6\u5916\u8981\u7684\u4E09\u6837\u662F\u8FD9\u91CC\u52A0\u7684\uFF1A\n//   \u00B7 \u8DEF\u5F84\uFF08\u8C31\u7EBF\u4EE5\u5916\u7684\u4E00\u5207\uFF1A\u7B26\u6760\u3001\u8FDE\u97F3\u7EBF\u3001\u53D1\u5939\u3001\u82B1\u62EC\u53F7\u2026\uFF09\uFF1A\u5B50\u8DEF\u5F84 = \u76F4\u7EBF / \u4E8C\u6B21 / \u4E09\u6B21\u66F2\u7EBF / \u95ED\u5408\uFF0C\u586B\u5145\u6216\u63CF\u8FB9\uFF08\u7EBF\u5BBD\u3001\u865A\u7EBF\u3001\u5706\u5934\uFF09\uFF1B\n//   \u00B7 \u97F3\u4E50\u5B57\u5F62\uFF1ABravura \u7684\u8F6E\u5ED3\uFF08\u6784\u5EFA\u65F6\u63D0\u51FA\u6765\u7684 vendor/fonts/bravura/outlines.json\uFF09\uFF0C\u4E00\u4E2A\u5B57\u4E00\u4E2A Form XObject\uFF08\u4E00\u9875\u51E0\u767E\u4E2A\u7B26\u5934\u53EA\u5B58\u4E00\u4EFD\u8F6E\u5ED3\uFF09\uFF0C\u6446\u7684\u65F6\u5019\u53EA\u7ED9\u53D8\u6362\uFF1B\n//     \u4E0D\u5728 PDF \u91CC\u5D4C Bravura\uFF08\u5B83\u662F CFF \u8F6E\u5ED3\uFF0Cttf.ts \u4E0D\u5403\uFF1B\u753B\u6210\u8DEF\u5F84\u5BF9\u4EFB\u4F55\u9605\u8BFB\u5668\u90FD\u4E00\u6837\uFF09\uFF1B\n//   \u00B7 \u6587\u5B57\u7684\u7C97 / \u659C\uFF1A\u53EA\u5D4C\u4E00\u6B3E\u5B57\u4F53\uFF0C\u7C97 = \u586B\u5145 + \u540C\u8272\u7EC6\u63CF\u8FB9\uFF08Tr 2\uFF09\uFF0C\u659C = \u503E\u659C\u77E9\u9635\u3002\n// \u5750\u6807\uFF1A\u8C03\u7528\u65B9\u7528\u300C\u5DE6\u4E0A\u89D2\u4E3A\u539F\u70B9\u3001y \u5411\u4E0B\u300D\u7684\u9875\u9762\u5750\u6807\uFF08pt\uFF09\uFF0C\u8FD9\u91CC\u7FFB\u6210 PDF \u7684\u5DE6\u4E0B\u89D2\u539F\u70B9\u3002\u7EAF\u51FD\u6570\uFF0C\u96F6 DOM\u3002\nimport { zlibSync } from \"../../vendor/fflate/fflate.esm.js\";\nimport type { TtfFont } from \"./ttf.ts\";\n\nexport type Rgb = [number, number, number];   // 0..1\n/** \u8DEF\u5F84\u7684\u4E00\u6BB5\uFF08\u9875\u9762\u5750\u6807\uFF09\u3002 */\nexport type Seg = { k: \"M\" | \"L\"; x: number; y: number } | { k: \"C\"; x1: number; y1: number; x2: number; y2: number; x: number; y: number } | { k: \"Z\" };\nexport type PdfOp =\n  | { op: \"rect\"; x: number; y: number; w: number; h: number; color: Rgb }\n  | { op: \"line\"; x1: number; y1: number; x2: number; y2: number; color: Rgb; width: number; dash?: number[]; round?: boolean }\n  | { op: \"path\"; segs: Seg[]; color: Rgb; fill: boolean; width?: number; dash?: number[]; round?: boolean }\n  | { op: \"glyph\"; code: string; x: number; y: number; size: number; color: Rgb }   // code = SMuFL \u7801\u4F4D\u7684\u5341\u516D\u8FDB\u5236\uFF08\"E050\"\uFF09\uFF1By = \u57FA\u7EBF\uFF1Bsize = \u5B57\u53F7\uFF08pt\uFF0C\u4E00\u4E2A em\uFF09\n  | { op: \"text\"; x: number; y: number; text: string; size: number; color: Rgb; bold?: boolean; italic?: boolean };\nexport interface PdfPage { w: number; h: number; ops: PdfOp[] }\nexport interface PdfDoc { title: string; pages: PdfPage[]; producer?: string; created?: Date }\n/** \u97F3\u4E50\u5B57\u5F62\u7684\u8F6E\u5ED3\uFF1Aoutlines.json \u7684\u5F62\u72B6\uFF08\u5B57\u4F53\u5355\u4F4D\u3001y \u5411\u4E0A\uFF1Bd = SVG \u8DEF\u5F84\uFF09\u3002 */\nexport interface MusicOutlines { unitsPerEm: number; glyphs: Record<string, { adv: number; d: string }> }\nexport interface PdfStats { glyphs: number; missing: string[]; missingMusic: string[]; fontBytes: number }\n\nconst enc = new TextEncoder();\nconst num = (v: number): string => (Math.round(v * 1000) / 1000).toString();\nconst hex4 = (v: number): string => (v & 0xffff).toString(16).padStart(4, \"0\").toUpperCase();\nconst hexString = (s: string): string => { let out = \"<FEFF\"; for (let i = 0; i < s.length; i++) out += hex4(s.charCodeAt(i)); return out + \">\"; };\nconst rgb = (c: Rgb, stroke: boolean) => `${num(c[0])} ${num(c[1])} ${num(c[2])} ${stroke ? \"RG\" : \"rg\"}`;\n\n/** SVG \u8DEF\u5F84\uFF08\u5B57\u4F53\u5355\u4F4D\u7684 M L H V Q C Z\uFF0C\u7EDD\u5BF9\u5750\u6807\uFF1BfontTools SVGPathPen \u7684\u8F93\u51FA\u4F1A\u7528 H / V\uFF09\u2192 PDF \u8DEF\u5F84\u6307\u4EE4\uFF08\u539F\u6837\u5750\u6807\uFF0C\u4E0D\u7FFB y\uFF1A\u5B57\u5F62\u7528 cm \u6446\uFF09\u3002\n *  \u8BA4\u4E0D\u51FA\u7684\u547D\u4EE4 \u2192 \u629B\u9519\uFF08\u4E0D\u9759\u9ED8\u753B\u7F3A\u4E00\u7B14\uFF1B2026-10-09 \u6293\u5230\u8FC7\uFF1A\u6F0F\u4E86 V / H\uFF0C\u901F\u5EA6\u8BB0\u53F7\u7684\u56DB\u5206\u97F3\u7B26\u6CA1\u4E86\u7B26\u5E72\uFF09\u3002 */\nexport function svgToPdfPath(d: string): string {\n  const t = d.match(/[A-Za-z]|-?\\d*\\.?\\d+(?:e-?\\d+)?/g) ?? [];\n  let i = 0, cmd = \"\", cx = 0, cy = 0, sx = 0, sy = 0, out = \"\";\n  const n = () => Number(t[i++]);\n  while (i < t.length) {\n    if (/[A-Za-z]/.test(t[i]!)) cmd = t[i++]!;\n    switch (cmd) {\n      case \"M\": cx = sx = n(); cy = sy = n(); out += `${num(cx)} ${num(cy)} m `; cmd = \"L\"; break;\n      case \"L\": cx = n(); cy = n(); out += `${num(cx)} ${num(cy)} l `; break;\n      case \"H\": cx = n(); out += `${num(cx)} ${num(cy)} l `; break;\n      case \"V\": cy = n(); out += `${num(cx)} ${num(cy)} l `; break;\n      case \"C\": { const a = n(), b = n(), c = n(), e = n(); cx = n(); cy = n(); out += `${num(a)} ${num(b)} ${num(c)} ${num(e)} ${num(cx)} ${num(cy)} c `; break; }\n      case \"Q\": { const qx = n(), qy = n(), x = n(), y = n(); out += `${num(cx + (2 / 3) * (qx - cx))} ${num(cy + (2 / 3) * (qy - cy))} ${num(x + (2 / 3) * (qx - x))} ${num(y + (2 / 3) * (qy - y))} ${num(x)} ${num(y)} c `; cx = x; cy = y; break; }\n      case \"Z\": out += \"h \"; cx = sx; cy = sy; cmd = \"\"; break;\n      default: throw new Error(`svgToPdfPath: unsupported path command \"${cmd || t[i]}\"`);\n    }\n  }\n  return out;\n}\n\n/** \u5199\u6210 PDF \u5B57\u8282\u3002font = \u89E3\u6790\u597D\u7684 TTF\uFF08\u6587\u5B57\u5D4C\u5B83\u7684\u5B50\u96C6\uFF09\uFF1Bmusic = \u97F3\u4E50\u5B57\u5F62\u8F6E\u5ED3\u3002 */\nexport function writePdf(doc: PdfDoc, font: TtfFont, music: MusicOutlines, opts: { stats?: PdfStats } = {}): Uint8Array {\n  const chunks: Uint8Array[] = []; let length = 0;\n  const offsets: number[] = [0];\n  const push = (d: Uint8Array | string): void => { const b = typeof d === \"string\" ? enc.encode(d) : d; chunks.push(b); length += b.length; };\n  const reserve = (): number => { offsets.push(-1); return offsets.length - 1; };\n  const begin = (n: number): void => { offsets[n] = length; push(`${n} 0 obj\\n`); };\n  const obj = (n: number, body: string): void => { begin(n); push(body + \"\\nendobj\\n\"); };\n  const stream = (n: number, dict: string, data: Uint8Array): void => { const body = zlibSync(data); begin(n); push(`<< ${dict} /Filter /FlateDecode /Length ${body.length} >>\\nstream\\n`); push(body); push(\"\\nendstream\\nendobj\\n\"); };\n\n  push(\"%PDF-1.7\\n%\u00E2\u00E3\u00CF\u00D3\\n\");\n  const catalog = reserve(), pagesObj = reserve(), fontObj = reserve(), cidObj = reserve(), descObj = reserve(), fileObj = reserve(), uniObj = reserve(), infoObj = reserve();\n  const used = new Map<number, number>(), missing = new Set<string>(), missingMusic = new Set<string>();\n  const forms = new Map<string, number>();   // \u97F3\u4E50\u5B57\u5F62 \u2192 Form XObject \u5BF9\u8C61\u53F7\n  const pageObjs = doc.pages.map(() => reserve());\n  const em = music.unitsPerEm;\n  doc.pages.forEach((page, pi) => {\n    const H = page.h; let c = \"\"; const xobj = new Set<string>();\n    for (const o of page.ops) {\n      if (o.op === \"rect\") c += `${rgb(o.color, false)} ${num(o.x)} ${num(H - o.y - o.h)} ${num(o.w)} ${num(o.h)} re f\\n`;\n      else if (o.op === \"line\") c += `${rgb(o.color, true)} ${num(o.width)} w ${o.round ? 1 : 0} J [${(o.dash ?? []).map(num).join(\" \")}] 0 d ${num(o.x1)} ${num(H - o.y1)} m ${num(o.x2)} ${num(H - o.y2)} l S\\n`;\n      else if (o.op === \"path\") {\n        let p = \"\";\n        for (const s of o.segs) p += s.k === \"Z\" ? \"h \" : s.k === \"C\" ? `${num(s.x1)} ${num(H - s.y1)} ${num(s.x2)} ${num(H - s.y2)} ${num(s.x)} ${num(H - s.y)} c ` : `${num(s.x)} ${num(H - s.y)} ${s.k === \"M\" ? \"m\" : \"l\"} `;\n        c += o.fill ? `${rgb(o.color, false)} ${p}f\\n` : `${rgb(o.color, true)} ${num(o.width ?? 1)} w ${o.round ? 1 : 0} J ${o.round ? 1 : 0} j [${(o.dash ?? []).map(num).join(\" \")}] 0 d ${p}S\\n`;\n      } else if (o.op === \"glyph\") {\n        const g = music.glyphs[o.code];\n        if (!g) { missingMusic.add(o.code); continue; }\n        let n = forms.get(o.code); if (n === undefined) { n = reserve(); forms.set(o.code, n); }\n        xobj.add(o.code);\n        const s = o.size / em;\n        c += `q ${rgb(o.color, false)} ${num(s)} 0 0 ${num(s)} ${num(o.x)} ${num(H - o.y)} cm /G${o.code} Do Q\\n`;\n      } else {\n        let hex = \"\";\n        const chars = [...o.text], shaped = font.shape(o.text);\n        chars.forEach((ch, k) => { const cp = ch.codePointAt(0)!, g = shaped[k] ?? 0; if (g === 0 && ch.trim()) missing.add(ch); if (!used.has(g)) used.set(g, cp); hex += hex4(g); });\n        if (!hex) continue;\n        const tm = o.italic ? `1 0 0.2 1 ${num(o.x)} ${num(H - o.y)} Tm` : `1 0 0 1 ${num(o.x)} ${num(H - o.y)} Tm`;\n        const bold = o.bold ? ` 2 Tr ${num(o.size * 0.035)} w ${rgb(o.color, true)}` : \" 0 Tr\";\n        c += `BT /F1 ${num(o.size)} Tf ${rgb(o.color, false)}${bold} ${tm} <${hex}> Tj ET\\n`;\n      }\n    }\n    const content = reserve();\n    stream(content, \"\", enc.encode(c));\n    const xo = xobj.size ? ` /XObject << ${[...xobj].map((code) => `/G${code} ${forms.get(code)} 0 R`).join(\" \")} >>` : \"\";\n    obj(pageObjs[pi]!, `<< /Type /Page /Parent ${pagesObj} 0 R /MediaBox [0 0 ${num(page.w)} ${num(page.h)}] /Resources << /Font << /F1 ${fontObj} 0 R >>${xo} >> /Contents ${content} 0 R >>`);\n  });\n  // \u97F3\u4E50\u5B57\u5F62\uFF1AForm XObject\uFF08\u5B57\u4F53\u5355\u4F4D\uFF1B\u989C\u8272\u8DDF\u7740\u6446\u5B83\u65F6\u7684\u586B\u5145\u8272\u8D70\u2014\u2014\u8FD9\u91CC\u4E0D\u8BBE\u989C\u8272\uFF09\n  for (const [code, n] of forms) {\n    const g = music.glyphs[code]!;\n    stream(n, `/Type /XObject /Subtype /Form /BBox [-${em * 2} -${em * 2} ${em * 4} ${em * 4}]`, enc.encode(`${svgToPdfPath(g.d)}f\\n`));\n  }\n  obj(pagesObj, `<< /Type /Pages /Kids [${pageObjs.map((n) => `${n} 0 R`).join(\" \")}] /Count ${pageObjs.length} >>`);\n\n  // \u6587\u5B57\u5B57\u4F53\uFF1A\u5B50\u96C6 + \u5BBD\u5EA6\u8868 + ToUnicode\uFF08\u540C WXHW\uFF09\n  const k = 1000 / font.unitsPerEm, sc = (v: number): number => Math.round(v * k);\n  const gids = [...used.keys()].sort((a, b) => a - b), sub = font.subset(gids);\n  const tagSeed = gids.reduce((a, g) => (a * 31 + g) >>> 0, gids.length);\n  let prefix = \"\"; for (let i = 0, v = tagSeed; i < 6; i++) { prefix += String.fromCharCode(65 + (v % 26)); v = Math.floor(v / 26) + i * 7; }\n  const base = `${prefix}+${font.psName}`;\n  let W = \"\"; for (let i = 0; i < gids.length;) { let j = i; const ws: number[] = []; while (j < gids.length && gids[j] === gids[i]! + (j - i)) { ws.push(sc(font.advance(gids[j]!))); j++; } W += `${gids[i]} [${ws.join(\" \")}] `; i = j; }\n  stream(fileObj, `/Length1 ${sub.length}`, sub);\n  obj(descObj, `<< /Type /FontDescriptor /FontName /${base} /Flags 4 /FontBBox [${font.bbox.map(sc).join(\" \")}] /ItalicAngle 0 /Ascent ${sc(font.ascender)} /Descent ${sc(font.descender)} /CapHeight ${sc(font.capHeight)} /StemV 80 /FontFile2 ${fileObj} 0 R >>`);\n  obj(cidObj, `<< /Type /Font /Subtype /CIDFontType2 /BaseFont /${base} /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor ${descObj} 0 R /DW 1000 /W [ ${W}] /CIDToGIDMap /Identity >>`);\n  let cmapText = \"/CIDInit /ProcSet findresource begin\\n12 dict begin\\nbegincmap\\n/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def\\n/CMapName /Adobe-Identity-UCS def\\n/CMapType 2 def\\n1 begincodespacerange\\n<0000> <FFFF>\\nendcodespacerange\\n\";\n  const pairs = gids.filter((g) => g !== 0).map((g) => { const cp = used.get(g)!; const u = cp > 0xffff ? hex4(0xd800 + ((cp - 0x10000) >> 10)) + hex4(0xdc00 + ((cp - 0x10000) & 0x3ff)) : hex4(cp); return `<${hex4(g)}> <${u}>`; });\n  for (let i = 0; i < pairs.length; i += 100) { const part = pairs.slice(i, i + 100); cmapText += `${part.length} beginbfchar\\n${part.join(\"\\n\")}\\nendbfchar\\n`; }\n  cmapText += \"endcmap\\nCMapName currentdict /CMap defineresource pop\\nend\\nend\\n\";\n  stream(uniObj, \"\", enc.encode(cmapText));\n  obj(fontObj, `<< /Type /Font /Subtype /Type0 /BaseFont /${base} /Encoding /Identity-H /DescendantFonts [${cidObj} 0 R] /ToUnicode ${uniObj} 0 R >>`);\n\n  const pdfDate = (d: Date): string => { const p2 = (v: number): string => String(v).padStart(2, \"0\"); const off = -d.getTimezoneOffset(), sign = off < 0 ? \"-\" : \"+\", ao = Math.abs(off); return `D:${d.getFullYear()}${p2(d.getMonth() + 1)}${p2(d.getDate())}${p2(d.getHours())}${p2(d.getMinutes())}${p2(d.getSeconds())}${sign}${p2(Math.floor(ao / 60))}'${p2(ao % 60)}'`; };\n  obj(infoObj, `<< /Title ${hexString(doc.title)} /Producer ${hexString(doc.producer ?? \"MoonSinger\")}${doc.created ? ` /CreationDate (${pdfDate(doc.created)})` : \"\"} >>`);\n  obj(catalog, `<< /Type /Catalog /Pages ${pagesObj} 0 R >>`);\n  const xrefAt = length, count = offsets.length;\n  let xref = `xref\\n0 ${count}\\n0000000000 65535 f \\n`;\n  for (let i = 1; i < count; i++) xref += `${String(offsets[i]).padStart(10, \"0\")} 00000 n \\n`;\n  push(xref); push(`trailer\\n<< /Size ${count} /Root ${catalog} 0 R /Info ${infoObj} 0 R >>\\nstartxref\\n${xrefAt}\\n%%EOF\\n`);\n  if (opts.stats) { opts.stats.glyphs = gids.length; opts.stats.missing = [...missing]; opts.stats.missingMusic = [...missingMusic]; opts.stats.fontBytes = sub.length; }\n  const out = new Uint8Array(length); let p = 0;\n  for (const cnk of chunks) { out.set(cnk, p); p += cnk.length; }\n  return out;\n}\n", "// score-pdf.ts \u2014\u2014 \u8C31 \u2192 PDF\uFF08\u5206\u9875\u6392\u7248\u7684\u90A3\u4E00\u5957\uFF0C\u539F\u6837\u5370\u51FA\u6765\uFF09\u3002created 2026-10-09 by Claude Opus 5.5\n// user\u300C\u81EA\u5DF1\u5199pdf\uFF0C\u7136\u540E\u5B57\u4F53\u53EF\u4EE5\u9009\u666E\u901A\u7684\u548C\u90A3\u4E2A\u62FC\u97F3\u53EF\u7231\u7684\uFF0C\u8BB0\u5F97\u770B\u4E00\u4E0B\u90A3\u4E2A\u62FC\u97F3\u7684\u7684\u5B57\u9AD8\u662F\u600E\u4E48\u7B97\u7684\u3002\u6B4C\u8BCD\u7528\u5B57\u4F53\u3002\u300D\u300C\u7136\u540E\u53E6\u5916\u4E00\u4E2A\u5F88\u5FEB\u8981\u7684\u662Fpdf\u5BFC\u51FA\u54C8\u54C8\u54C8\u300D\u3002\n// \u505A\u6CD5\uFF1A\u7528\u5C4F\u5E55\u4E0A\u5206\u9875\u89C6\u56FE\u540C\u4E00\u4E2A\u6392\u7248\u51FD\u6570\uFF08engrave\uFF0C\u6240\u89C1\u5373\u6240\u5F97\uFF09\uFF0C\u5355\u4F4D\u76F4\u63A5\u53D6\u300C\u70B9\u300D\uFF08\u4E00\u4E2A\u7EBF\u95F4\u8DDD = \u8FD9\u5F20\u7EB8\u7684 spMm \u6BEB\u7C73\uFF09\uFF0C\u6240\u4EE5\u6392\u51FA\u6765\u7684\u9875 = \u7EB8\u7684\u771F\u5B9E\u5927\u5C0F\uFF1B\n//   **\u548C\u300C\u5168\u90E8 + \u5206\u9875\u300D\u9884\u89C8\u4E00\u6A21\u4E00\u6837\uFF08\u9664\u4E86\u63A7\u4EF6\u548C\u63D0\u793A\uFF09**\uFF082026-10-09 user\u300Cpdf\u753B\u51FA\u6765\u548C\u5F00\u5206\u9875\u9884\u89C8\u7684\u4E0D\u4E00\u6837\uFF0C\u6CA1\u6709respect track hidding\uFF0C\u5230\u65F6\u5019\u8BB0\u5F97\u90FD\u4E00\u8D77\u4FEE\u4E00\u4E0B\uFF0C\n//   \u505A\u5230\u9664\u4E86\u63A7\u4EF6\u548C\u63D0\u793A\u5916\u7684wysiwyg\u300D\uFF09\uFF1A\u540C\u4E00\u4EFD\u58F0\u90E8\u89C6\u56FE\uFF08\u9690\u85CF\u7684\u58F0\u90E8 = \u9884\u89C8\u91CC\u90A3\u6761\u7EC6\u884C\u7684\u4F4D\u7F6E\u7A7A\u7740\uFF0C\u4E0D\u5370\uFF1B\u53EA\u770B\u5B83\u540C\u7406\uFF1B\u56FA\u5B9A\u6572\u4E00\u4E2A\u952E\u7684 \u00D7 \u7B26\u5934\uFF09\u3001\u540C\u4E00\u628A\u91CF\u5B57\u7684\u5C3A\u5B50\n//   \uFF08\u5206\u9875\u9884\u89C8\u7684 measureAt\uFF1A\u5BBD\u5EA6\u6309\u5C4F\u5E55\u5B57\u4F53\u91CF\uFF0CPDF \u7684\u5B57\u6309\u540C\u4E00\u4E2A\u951A\u70B9\u753B\uFF09\u3001\u540C\u4E00\u4E2A\u5C0F\u8282\u7EBF\u5F00\u5173\u3001\u540C\u6837\u7684\u62FC\u97F3\u8BA9\u4F4D\uFF08\u9884\u89C8\u5728\u5206\u9875\u65F6\u4E5F\u8BA9\uFF09\uFF1B\u9690\u85CF\u7684\u7EB8 = \u9884\u89C8\u91CC\u6298\u53E0\u7684\u90A3\u4E00\u6761\uFF0C\u4E0D\u5370\u3001\u4F4D\u7F6E\u7A7A\u7740\u3002\n//   \uFF08v0.8.8 \u8D77\u91CF\u5BBD\u7528\u7684\u662F\u8FD9\u6B3E\u5B57\u4F53\u81EA\u5DF1\u7684\u5B57\u5BBD\uFF0C\u548C\u9884\u89C8\u91CF\u7684\u4E0D\u4E00\u6837 \u2192 \u65AD\u884C / \u5206\u9875\u53EF\u80FD\u4E0D\u540C\uFF0C\u8FD9\u4E00\u7248\u6539\u6389\u3002\uFF09\u56FE\u5143\u9010\u4E2A\u7FFB\u6210 PDF \u6307\u4EE4\uFF08pdf.ts\uFF09\uFF1A\n//   \u00B7 \u97F3\u4E50\u5B57\u5F62 = Bravura \u8F6E\u5ED3\uFF08vendor/fonts/bravura/outlines.json\uFF09\u753B\u6210\u8DEF\u5F84\uFF1B\u6587\u5B57\uFF08\u6B4C\u8BCD / \u6B4C\u540D / \u901F\u5EA6 / \u98CE\u683C\u2026\uFF09= \u5D4C\u8FD9\u6B3E\u5B57\u4F53\u7684\u5B50\u96C6\uFF08\u9605\u8BFB\u5668\u91CC\u80FD\u9009\u4E2D\u590D\u5236\uFF09\uFF1B\n//   \u00B7 \u7F16\u8F91\u5668\u4E13\u7528\u7684\u4E0D\u5370\uFF08\u66F2\u6BB5\u63A7\u4EF6\u3001\u5149\u6807\u3001\u9009\u533A\u3001\u9690\u85CF\u58F0\u90E8\u7684\u7EC6\u884C\u3001\u5360\u4F4D\u7070\u5B57\u3001AI \u63A8\u5B9A\u7684\u7070\u5B57\u3001\u901F\u5EA6\u53D8\u5316\u7684 \u2191\u2193\u3001\u53E5\u53F7\u2026\uFF09\uFF1B\u300C\u4E0D\u8BA4\u300D\u7684\u7070\uFF08\u6F14\u594F\u8005\u4E0D\u8BA4\u7684\u8BB0\u53F7\u3001\n//     \u5531\u4E0D\u51FA\u7684\u6B4C\u8BCD\uFF09\u5370\u6210\u9ED1\u7684\u2014\u2014\u90A3\u662F\u7ED9\u5199\u8C31\u7684\u4EBA\u770B\u7684\u62AB\u9732\uFF0C\u4E0D\u662F\u8C31\u9762\u5185\u5BB9\u3002\n// \u840C\u795E\u62FC\u97F3\u7684\u5B57\u9AD8\uFF1A\u5B57\u4F53\u81EA\u62A5\u7684\u4E0A\u4F38\u628A\u62FC\u97F3\u5E26\u7B97\u8FDB\u53BB\u4E86\uFF08hhea 1300\uFF09\uFF0C\u4E0D\u80FD\u62FF\u6765\u5B9A\u6C49\u5B57\u4F4D\u7F6E\uFF1B\u6309\u5B57\u5F62\u58A8\u8FF9\uFF08ttf.ts inkOf\uFF09\u91CF\u300C\u56FD\u300D\u2014\u2014\u62FC\u97F3\u753B\u5728\u6C49\u5B57\u4E0A\u65B9\uFF0C\n//   \u6B4C\u8BCD\u884C\u5728\u8C31\u4E0B\u9762\uFF0C\u6240\u4EE5\u6B4C\u8BCD\u884C\u5F80\u4E0B\u8BA9\u51FA\u300C\u62FC\u97F3\u5B57\u4F53\u7684\u58A8\u8FF9\u9876 \u2212 \u9ED1\u4F53\u7684\u58A8\u8FF9\u9876\u300D\u90A3\u4E00\u622A\uFF08engrave lyricRaise\uFF09\u3002\u540C WXHW v2.3.13 \u7684\u7ED3\u8BBA\u3002\nimport { engrave, LYRIC_EM, type Prim, type PartView, type EngraveOpts } from \"../render/engrave.ts\";\nimport type { Song } from \"../score/song.ts\";\nimport { paperOf, DEFAULT_PAPER, spMm, lineSp, pageGeoOf } from \"../score/paper.ts\";\nimport { writePdf, type PdfOp, type PdfPage, type Seg, type MusicOutlines, type PdfStats, type Rgb } from \"./pdf.ts\";\nimport type { TtfFont } from \"./ttf.ts\";\n\nexport type PdfFontId = \"sans\" | \"pinyin\";\nconst PT_PER_MM = 72 / 25.4;\nconst INK: Rgb = [0.1, 0.1, 0.1];\n/** \u7F16\u8F91\u5668\u4E13\u7528\u3001\u4E0D\u5370\u7684\u6837\u5F0F\u7C7B\uFF08\u4EFB\u4E00\u4E2A\u547D\u4E2D\u5C31\u4E0D\u5370\uFF09\u3002 */\nconst SKIP = new Set([\"cat-bar\", \"cat-dot\", \"paper-chip\", \"paper-chip-text\", \"paper-chip-icon\", \"part-stub\", \"part-stub-line\", \"hidden-note\", \"hidden-paper\", \"warn\", \"selbox\", \"caret\", \"nav-text\", \"part-badge\",\n  \"tempo-change\", \"dyn-implied\", \"arr-issue\", \"arr-empty\", \"empty\", \"phrase-mark\", \"page\", \"in-span\"]);\n/** \u300Cempty\u300D\u5728\u5360\u4F4D\u63D0\u793A\u4E0A = \u4E0D\u5370\uFF1B\u5728\u58F0\u90E8\u540D\u4E0A = \u8FD8\u6CA1\u4EBA\u4E0A\u573A\uFF08\u5C4F\u5E55\u4E0A\u753B\u6DE1\uFF09\uFF0C\u540D\u5B57\u7167\u5370\u3002 */\nconst skipped = (cls: string[]) => cls.some((c) => SKIP.has(c) && !(c === \"empty\" && cls.includes(\"part-name\")));\n/** \u8FD9\u4E2A\u56FE\u5143\u5370\u4E0D\u5370\uFF08\u6309\u6837\u5F0F\u7C7B\uFF1B\u6D4B\u8BD5\u7528\uFF09\u3002 */\nexport const isPrinted = (cls: string | undefined): boolean => !skipped((cls ?? \"\").split(/\\s+/).filter(Boolean));\n/** \u6B4C\u8BCD\u884C\u5F80\u4E0B\u8BA9\u591A\u5C11\uFF08sp\uFF09\uFF1A\u62FC\u97F3\u5B57\u4F53 = \u300C\u56FD\u300D\u7684\u58A8\u8FF9\u9876\u6BD4\u9ED1\u4F53\u9AD8\u51FA\u7684\u90A3\u4E00\u622A\uFF08\u840C\u795E 1184 vs \u601D\u6E90\u9ED1\u4F53 795\uFF0CunitsPerEm \u90FD\u662F 1000\uFF1Btest/pdf.test.ts \u62FF\u771F\u5B57\u4F53\u6838\uFF09\u3002\n *  \u5206\u9875\u9884\u89C8\u4E5F\u7528\u5B83\uFF08\u9009\u4E86\u62FC\u97F3\u5B57\u4F53\u65F6\uFF09\uFF0C\u6240\u4EE5\u4E0D\u7528\u4E3A\u4E86\u9884\u89C8\u53BB\u4E0B 12 MB \u7684\u5B57\u4F53\u3002 */\nexport const LYRIC_RAISE: Record<PdfFontId, number> = { sans: 0, pinyin: ((1184 - 795) / 1000) * LYRIC_EM };\n/** \u63CF\u8FB9\u7684\u8DEF\u5F84\uFF08\u5176\u4F59\u8DEF\u5F84\u90FD\u662F\u586B\u5145\uFF09\uFF1A\u5C4F\u5E55\u4E0A\u7684\u7EBF\u5BBD\u662F\u56FA\u5B9A px\uFF08\u8C31\u95F4\u8DDD ~10 px \u65F6\uFF09\uFF0C\u8FD9\u91CC\u6309\u8C31\u95F4\u8DDD\u7B49\u6BD4\u6362\u3002 */\nconst STROKE: Record<string, { w: number; dash?: number[]; round?: boolean }> = { arpeggio: { w: 1.1, round: true }, tie: { w: 1.4 }, slur: { w: 1.3 }, hairpin: { w: 1.1 }, \"tuplet-bracket\": { w: 1 }, brace: { w: 2.2, round: true }, volta: { w: 1.1 } };\nconst BOLD = new Set([\"song-title\", \"tempo-word\", \"paper-name\", \"groove-mark\", \"part-name\"]), ITALIC = new Set([\"groove-mark\", \"dyn-word\", \"nav-word\"]);\n\n/** \u4E00\u4E32\u5B57\u5728\u8FD9\u6B3E\u5B57\u4F53\u91CC\u591A\u5BBD\uFF08em\uFF1B\u6309 shape \u51FA\u6765\u7684\u5B57\u5F62\u2014\u2014\u6CE8\u97F3\u5B57\u4F53\u6309\u8BCD\u6362\u7684\u5B57\u5F62\u5BBD\u5EA6\u4E00\u6837\uFF09\u3002 */\nexport function textEm(font: TtfFont, s: string): number { return font.shape(s).reduce((a, g) => a + font.advance(g), 0) / font.unitsPerEm; }\n/** \u9009\u4E86\u840C\u795E\u62FC\u97F3\u65F6\u6B4C\u8BCD\u884C\u8981\u5F80\u4E0B\u8BA9\u591A\u5C11\uFF08sp\uFF09\uFF1A\u300C\u56FD\u300D\u7684\u58A8\u8FF9\u9876\uFF0C\u62FC\u97F3\u5B57\u4F53\u6BD4\u9ED1\u4F53\u9AD8\u51FA\u6765\u7684\u90A3\u4E00\u622A\u3002\u9ED1\u4F53 = 0\u3002 */\nexport function lyricRaiseOf(font: TtfFont, ref: TtfFont | null): number {\n  if (!ref) return 0;\n  const top = (f: TtfFont) => { const ink = f.inkOf(f.glyphId(0x56fd)); return ink ? ink[3] / f.unitsPerEm : 0; };\n  return Math.max(0, top(font) - top(ref)) * LYRIC_EM;\n}\n\n/** SVG \u8DEF\u5F84\uFF08engrave \u753B\u7684\uFF1AM / L / Q / C / Z\uFF0C\u7EDD\u5BF9\u5750\u6807\uFF1BH / V \u4E5F\u8BA4\uFF09\u2192 \u9875\u9762\u5750\u6807\u7684\u6BB5\uFF08\u5E73\u79FB dx, dy\uFF09\u3002 */\nexport function segsOf(d: string, dx: number, dy: number): Seg[] {\n  const t = d.match(/[MLQCZHVmlqczhv]|-?\\d*\\.?\\d+(?:e-?\\d+)?/g) ?? [], out: Seg[] = [];\n  let i = 0, cmd = \"\", cx = 0, cy = 0, sx = 0, sy = 0;\n  const n = () => Number(t[i++]);\n  while (i < t.length) {\n    if (/[A-Za-z]/.test(t[i]!)) cmd = t[i++]!.toUpperCase();\n    if (cmd === \"M\") { cx = sx = n(); cy = sy = n(); out.push({ k: \"M\", x: cx + dx, y: cy + dy }); cmd = \"L\"; }\n    else if (cmd === \"L\") { cx = n(); cy = n(); out.push({ k: \"L\", x: cx + dx, y: cy + dy }); }\n    else if (cmd === \"H\") { cx = n(); out.push({ k: \"L\", x: cx + dx, y: cy + dy }); }\n    else if (cmd === \"V\") { cy = n(); out.push({ k: \"L\", x: cx + dx, y: cy + dy }); }\n    else if (cmd === \"C\") { const a = n(), b = n(), c = n(), e = n(); cx = n(); cy = n(); out.push({ k: \"C\", x1: a + dx, y1: b + dy, x2: c + dx, y2: e + dy, x: cx + dx, y: cy + dy }); }\n    else if (cmd === \"Q\") { const qx = n(), qy = n(), x = n(), y = n(); out.push({ k: \"C\", x1: cx + (2 / 3) * (qx - cx) + dx, y1: cy + (2 / 3) * (qy - cy) + dy, x2: x + (2 / 3) * (qx - x) + dx, y2: y + (2 / 3) * (qy - y) + dy, x: x + dx, y: y + dy }); cx = x; cy = y; }\n    else if (cmd === \"Z\") { out.push({ k: \"Z\" }); cx = sx; cy = sy; cmd = \"\"; }\n    else i++;\n  }\n  return out;\n}\n\nexport interface ScorePdfArgs { song: Song; parts: PartView[]; font: TtfFont; fontId: PdfFontId; music: MusicOutlines; title: string; created?: Date;\n  /** \u91CF\u6587\u5B57\u5BBD\u7684\u5C3A\u5B50\uFF08\u7ED9\u6B4C\u8BCD\u5B57\u53F7 px\uFF0C\u56DE\u4E00\u4E2A\u91CF\u5BBD\u51FD\u6570\uFF09\uFF1A\u548C\u5206\u9875\u9884\u89C8\u540C\u4E00\u628A\uFF08score-view measureAt\uFF09\u3002\u4E0D\u7ED9 = \u7528\u8FD9\u6B3E\u5B57\u4F53\u81EA\u5DF1\u7684\u5B57\u5BBD\uFF08\u6D4B\u8BD5\u7528\uFF09\u3002 */\n  measureAt?: (px: number) => (s: string) => number;\n  /** \u81EA\u52A8\u5C0F\u8282\u7EBF\uFF08\u548C\u7F16\u8F91\u5668\u7684\u5F00\u5173\u4E00\u81F4\uFF09\u3002 */\n  autoBars?: boolean;\n  /** \u53EA\u5370\u8FD9\u4E00\u5F20\u7EB8\uFF08= \u5206\u9875\u9884\u89C8\u7684\u300C\u672C\u6BB5\u300D\uFF1B2026-10-09 user\u300C\u53EA\u5370\u4E00\u6BB5\u6216\u4E00\u4E2A\u58F0\u90E8 \u8FD9\u4E2A\u4E5F\u5230\u65F6\u5019\u9700\u8981\u505A\uFF0C\u548Cwxhw\u5DEE\u4E0D\u591A\u300D\uFF09\u3002\u4E0D\u7ED9 = \u6574\u9996\u3002 */\n  onlyPaper?: string }\n/** \u5370\u7684\u6392\u7248\u53C2\u6570 = \u5206\u9875\u9884\u89C8\u53BB\u6389\u63A7\u4EF6\u7684\u90A3\u4E00\u5957\uFF08\u5149\u6807\u3001\u9009\u533A\u3001\u5360\u4F4D\u63D0\u793A\u3001\u66F2\u6BB5\u63A7\u4EF6\u90FD\u4E0D\u8981\uFF09\u3002\u5206\u9875\u9884\u89C8 = \u8FD9\u4E00\u5957 + \u63A7\u4EF6\u5F00\u5173\uFF08test/pdf-wysiwyg.test.ts \u6838\uFF1A\u63A7\u4EF6\u5F00\u5173\u4E0D\u6539\u7248\u9762\uFF09\u3002 */\nexport function printOpts(song: Song, sp: number, parts: PartView[], measureLyric: (s: string) => number, autoBars: boolean, lyricRaise: number, onlyPaper?: string): EngraveOpts {\n  const paper = song.paper ?? paperOf(DEFAULT_PAPER);\n  return { width: lineSp(paper) * sp, sp, at: { paper: onlyPaper ?? song.papers[0]!.id, part: song.parts[0]!.id }, parts, measureLyric, titlePlaceholder: false, autoBars, page: pageGeoOf(paper), lyricRaise, ...(onlyPaper ? { onlyPaper } : {}) };\n}\n/** \u6392\u7248 + \u7FFB\u6210 PDF\u3002\u8FD4\u56DE\u5B57\u8282\u3001\u9875\u6570\u3001\u7F3A\u5B57\uFF08\u8FD9\u6B3E\u5B57\u4F53\u91CC\u6CA1\u6709\u7684\u5B57 / \u8F6E\u5ED3\u91CC\u6CA1\u6709\u7684\u97F3\u4E50\u5B57\u5F62\u2014\u2014\u8C03\u7528\u65B9\u5982\u5B9E\u8BF4\uFF09\u3002 */\nexport function scorePdf(a: ScorePdfArgs): { bytes: Uint8Array; pages: number; stats: PdfStats } {\n  const paper = a.song.paper ?? paperOf(DEFAULT_PAPER), sp = spMm(paper) * PT_PER_MM, lyricPx = LYRIC_EM * sp;\n  const L = engrave(a.song, printOpts(a.song, sp, a.parts, a.measureAt ? a.measureAt(lyricPx) : (s) => textEm(a.font, s) * lyricPx, a.autoBars ?? true, LYRIC_RAISE[a.fontId], a.onlyPaper));\n  const W = paper.widthMm * PT_PER_MM, H = paper.heightMm * PT_PER_MM, dx = L.pageX.left;\n  const pages: PdfPage[] = L.pages.map(() => ({ w: W, h: H, ops: [] }));\n  const pageOf = (y: number) => { for (let k = 0; k < L.pages.length; k++) if (y >= L.pages[k]!.top && y < L.pages[k]!.top + L.pages[k]!.h) return k; return -1; };\n  const scaleW = sp / 10;   // \u5C4F\u5E55\u4E0A\u7684\u56FA\u5B9A\u7EBF\u5BBD\uFF08px\uFF0C\u8C31\u95F4\u8DDD ~10 px\uFF09\u2192 \u6309\u8C31\u95F4\u8DDD\u7B49\u6BD4\n  const em = a.music.unitsPerEm;\n  for (const p of L.prims) {\n    if (p.t === \"icon\") continue;\n    const cls = (p.cls ?? \"\").split(/\\s+/).filter(Boolean);\n    if (skipped(cls)) continue;\n    const y0 = p.t === \"line\" ? Math.min(p.y1, p.y2) : p.t === \"path\" ? Number(/M\\s*-?[\\d.]+[ ,]+(-?[\\d.]+)/.exec(p.d)?.[1] ?? NaN) : p.y;\n    const k = pageOf(y0); if (k < 0) continue;\n    const top = L.pages[k]!.top, ops = pages[k]!.ops;\n    ops.push(...toOps(p, cls, dx, top));\n  }\n  function toOps(p: Prim, cls: string[], ox: number, top: number): PdfOp[] {\n    switch (p.t) {\n      case \"line\": return [{ op: \"line\", x1: p.x1 + ox, y1: p.y1 - top, x2: p.x2 + ox, y2: p.y2 - top, color: INK, width: p.w }];\n      case \"rect\": return [{ op: \"rect\", x: p.x + ox, y: p.y - top, w: p.w, h: p.h, color: INK }];\n      case \"path\": {\n        const st = cls.map((c) => STROKE[c]).find(Boolean), segs = segsOf(p.d, ox, -top);\n        return st ? [{ op: \"path\", segs, color: INK, fill: false, width: st.w * scaleW, ...(cls.includes(\"ramp\") ? { dash: [4 * scaleW, 3 * scaleW] } : {}), ...(st.round ? { round: true } : {}) }] : [{ op: \"path\", segs, color: INK, fill: true }];\n      }\n      case \"glyph\": {\n        const size = p.size ?? 4 * sp, out: PdfOp[] = [];\n        let x = p.x + ox;\n        for (const ch of p.ch) { const code = ch.codePointAt(0)!.toString(16).toUpperCase().padStart(4, \"0\"); out.push({ op: \"glyph\", code, x, y: p.y - top, size, color: INK }); x += ((a.music.glyphs[code]?.adv ?? 0) / em) * size; }\n        return out;\n      }\n      case \"text\": {\n        const size = p.size ?? lyricPx, w = textEm(a.font, p.s) * size, anchor = p.anchor ?? \"middle\";\n        const x = p.x + ox - (anchor === \"middle\" ? w / 2 : anchor === \"end\" ? w : 0);\n        return [{ op: \"text\", x, y: p.y - top, text: p.s, size, color: INK, ...(cls.some((c) => BOLD.has(c)) ? { bold: true } : {}), ...(cls.some((c) => ITALIC.has(c)) ? { italic: true } : {}) }];\n      }\n      default: return [];\n    }\n  }\n  const stats: PdfStats = { glyphs: 0, missing: [], missingMusic: [], fontBytes: 0 };\n  const bytes = writePdf({ title: a.title, pages, producer: \"MoonSinger\", ...(a.created ? { created: a.created } : {}) }, a.font, a.music, { stats });\n  return { bytes, pages: pages.length, stats };\n}\n", "// pdf-assets.ts \u2014\u2014 PDF \u5BFC\u51FA\u8981\u7684\u5B57\u4F53 / \u97F3\u4E50\u5B57\u5F62\u8F6E\u5ED3\uFF1A\u70B9\u4E86\u5BFC\u51FA\u624D\u53D6\uFF08\u5BB6\u89C4\u300C\u91CD\u8D44\u6E90\u8981\u7B49\u7528\u6237\u6709\u610F\u56FE\u624D\u52A0\u8F7D\u300D\uFF09\uFF0C\u7528\u5B8C\u8C03\u7528\u65B9\u653E\u624B\uFF08\u4E0D\u7559\u5728\u5185\u5B58\u91CC\uFF09\u3002\n// created 2026-10-09 by Claude Opus 5.5\u3002\u5B57\u4F53\u5B57\u8282 = vendor/fonts/*.ttf.gz\uFF08\u4ECE WXHW \u62F7\u6765\uFF0C\u89C1\u8BE5\u76EE\u5F55 README\uFF09\uFF1B\u8F6E\u5ED3 = vendor/fonts/bravura/outlines.json\u3002\n// \u53D6\u8FC7\u4E00\u6B21\u4E4B\u540E service worker \u7684\u8FD0\u884C\u65F6\u7F13\u5B58\u91CC\u6709\uFF08\u79BB\u7EBF\u4E5F\u80FD\u5BFC\u51FA\uFF09\uFF1B\u6362\u7248\u672C\u65F6\u7F13\u5B58\u6362\u4EE3\u3001\u4E0B\u6B21\u518D\u53D6\u4E00\u6B21\uFF08\u540C WXHW\uFF09\u3002\nimport { gunzipSync } from \"../../vendor/fflate/fflate.esm.js\";\nimport { parseTtf, type TtfFont } from \"./ttf.ts\";\nimport type { MusicOutlines } from \"./pdf.ts\";\nimport type { PdfFontId } from \"./score-pdf.ts\";\n\nasync function gunzip(b: Uint8Array): Promise<Uint8Array> {\n  if (typeof DecompressionStream !== \"undefined\") {\n    try { return new Uint8Array(await new Response(new Blob([b as unknown as BlobPart]).stream().pipeThrough(new DecompressionStream(\"gzip\"))).arrayBuffer()); }\n    catch { /* \u6D41\u5F0F\u89E3\u4E0D\u4E86\u5C31\u540C\u6B65\u89E3 */ }\n  }\n  return gunzipSync(b);\n}\n/** \u53D6\u4E00\u6B3E\u5B57\u4F53\uFF08TTF\uFF09\u5E76\u89E3\u6790\u3002\u62FF\u4E0D\u5230\uFF08\u79BB\u7EBF\u4E14\u6CA1\u7F13\u5B58\uFF09\u2192 \u629B\u9519\uFF08\u8C03\u7528\u65B9\u660E\u8BF4\uFF09\u3002 */\nexport async function loadPdfFont(id: PdfFontId): Promise<TtfFont> {\n  const r = await fetch(id === \"pinyin\" ? \"./vendor/fonts/pinyin.ttf.gz\" : \"./vendor/fonts/sans.ttf.gz\");   // \u76F8\u5BF9\u8DEF\u5F84\u5199\u6210\u5B57\u9762\u91CF\uFF1A\u6784\u5EFA / SW \u626B\u5F97\u5230\n  if (!r.ok) throw new Error(`\u5B57\u4F53\u4E0B\u4E0D\u6765\uFF08${r.status}\uFF09`);\n  const b = new Uint8Array(await r.arrayBuffer());\n  return parseTtf(b[0] === 0x1f && b[1] === 0x8b ? await gunzip(b) : b);   // \u6709\u7684\u4E3B\u673A\u66FF .gz \u52A0 Content-Encoding \u5148\u89E3\u6389\uFF1A\u770B\u9B54\u6570\uFF0C\u522B\u89E3\u4E24\u6B21\n}\nexport async function loadMusicOutlines(): Promise<MusicOutlines> {\n  const r = await fetch(\"./vendor/fonts/bravura/outlines.json\");\n  if (!r.ok) throw new Error(`\u97F3\u4E50\u5B57\u5F62\u4E0B\u4E0D\u6765\uFF08${r.status}\uFF09`);\n  return (await r.json()) as MusicOutlines;\n}\n/** \u7B2C\u4E00\u6B21\u8981\u4E0B\u591A\u5C11\uFF08\u7ED9\u4EBA\u770B\u7684\u4F30\u8BA1\uFF09\u3002 */\nexport const PDF_FONT_MB: Record<PdfFontId, number> = { sans: 6.3, pinyin: 12.2 };\n", "// \u4ECE\u5144\u5F1F\u4ED3 WebXiaoHeiWu src/export/ttf.ts \u539F\u6837\u62F7\u6765\uFF082026-10-08 \u6DF1\u591C by Claude Opus 5.5\uFF0CWXHW \u63D0\u4EA4 f099221\uFF1B\u4F5C\u8005 Claude Fable 5.1\uFF09\u3002MoonSinger \u7684 PDF \u5BFC\u51FA\u7528\u5B83\u89E3\u6790 / \u53D6\u5B50\u96C6 / \u6309\u8BCD\u9009\u8BFB\u97F3\u3002\n// \u6539\u8FD9\u4EFD\u4E4B\u524D\u60F3\u60F3\u8981\u4E0D\u8981\u4E24\u8FB9\u4E00\u8D77\u6539\uFF08\u4EE5\u540E\u53EF\u4EE5\u62BD\u6210\u5BB6\u65CF\u5E93\uFF09\u3002\n// TrueType\uFF08glyf \u8F6E\u5ED3\uFF09\u6700\u5C0F\u89E3\u6790 + \u5B50\u96C6\u5668\u2014\u2014\u7ED9 PDF \u5D4C\u5B57\u7528\u3002\u7EAF\u51FD\u6570\uFF0C\u96F6 DOM\u3002created 2026-09-30 by Claude Fable 5.1\n//   user 2026-09-30\u300C\u8001\u8001\u5B9E\u5B9E\u505A pdf \u5427\u300D\u300C\u5148\u628A pdf \u5BFC\u51FA\u7ED9\u505A\u51FA\u6765\u300D\u3002PDF \u4E0D\u5D4C\u5B57\u4F53\uFF0C\u8BFB\u8005\u8BBE\u5907\u6CA1\u8FD9\u6B3E\u5B57\u4F53\u5C31\u662F\u65B9\u5757\uFF1B\u6574\u672C\u5D4C\u8FDB\u53BB\u53C8\u662F 7 MB\u2014\u2014\u6240\u4EE5\u53EA\u5D4C\u7528\u5230\u7684\u5B57\u5F62\u3002\n//   \u53EA\u5403 glyf \u8F6E\u5ED3\u7684 TTF\uFF08sfnt 0x00010000 / 'true'\uFF09\uFF1BCFF\uFF08'OTTO'\uFF09\u54CD\u4EAE\u62D2\u7EDD\u2014\u2014CFF \u5B50\u96C6\u5316\u662F\u53E6\u4E00\u4E2A\u91CF\u7EA7\u7684\u6D3B\uFF0C\u5C0F\u7684 CFF \u5B57\u4F53\u5C06\u6765\u6574\u4E2A\u5D4C\u3002\n//   \u5B50\u96C6\u7B56\u7565 = **\u5B57\u5F62\u53F7\u4E0D\u52A8**\uFF1A\u6CA1\u7528\u5230\u7684\u5B57\u5F62\u5728 glyf \u91CC\u6E05\u7A7A\uFF08loca \u76F8\u90BB\u4E24\u9879\u76F8\u7B49\uFF09\uFF0C\u7528\u5230\u7684\u539F\u6837\u62F7\uFF08\u590D\u5408\u5B57\u5F62\u628A\u90E8\u4EF6\u9012\u5F52\u5E26\u4E0A\uFF09\u3002\n//   \u8FD9\u6837 PDF \u91CC CID = \u539F\u5B57\u5F62\u53F7\u3001CIDToGIDMap /Identity\uFF0C\u4E0D\u7528\u91CD\u6392\u53F7\u4E5F\u4E0D\u7528\u6539\u4EFB\u4F55\u5F15\u7528\uFF1B\u4EE3\u4EF7\u662F loca / hmtx \u4ECD\u662F\u5168\u8868\uFF08\u51E0\u4E07\u9879\u91CD\u590D\u503C\uFF0CFlate \u4E00\u538B\u5C31\u6CA1\u4E86\uFF09\u3002\n//   \u4EA7\u51FA\u7684\u5B57\u4F53\u53EA\u542B PDF \u7684 CIDFontType2 \u9700\u8981\u7684\u8868\uFF1Ahead hhea maxp hmtx loca glyf\uFF08+ \u539F\u5B57\u4F53\u91CC\u6709\u7684 cvt fpgm prep\uFF09\uFF1Bcmap / name / post / OS/2 \u4E0D\u5E26\u3002\n\nexport interface TtfFont {\n  unitsPerEm: number;\n  /** hhea \u7684\u4E0A\u4E0B\u4F38\uFF08\u5B57\u4F53\u5355\u4F4D\uFF09\u3002\u6CE8\u97F3\u5B57\u4F53\u4F1A\u628A\u62FC\u97F3\u5E26\u7B97\u8FDB\u53BB\u2014\u2014\u6392\u7248\u522B\u7528\u5B83\u5B9A\u6C49\u5B57\u4F4D\u7F6E\uFF0C\u7528 inkOf\u3002 */\n  ascender: number; descender: number;\n  capHeight: number;\n  bbox: [number, number, number, number];\n  numGlyphs: number;\n  /** PostScript \u540D\uFF08name id 6\uFF1B\u6CA1\u6709\u5C31 \"Font\"\uFF09\u3002\u53EA\u542B\u53EF\u6253\u5370 ASCII\u3002 */\n  psName: string;\n  /** \u7801\u70B9 \u2192 \u5B57\u5F62\u53F7\uFF1B0 = \u8FD9\u6B3E\u5B57\u4F53\u91CC\u6CA1\u6709\u3002 */\n  glyphId(codePoint: number): number;\n  /** \u5B57\u5F62\u7684\u524D\u8FDB\u5BBD\uFF08\u5B57\u4F53\u5355\u4F4D\uFF09\u3002 */\n  advance(gid: number): number;\n  /** \u5B57\u5F62\u58A8\u8FF9\u6846 [xMin, yMin, xMax, yMax]\uFF08\u5B57\u4F53\u5355\u4F4D\uFF09\uFF1B\u7A7A\u5B57\u5F62 \u2192 null\u3002 */\n  inkOf(gid: number): [number, number, number, number] | null;\n  /** \u53EA\u7559\u8FD9\u4E9B\u5B57\u5F62\uFF08\u5916\u52A0 .notdef \u4E0E\u590D\u5408\u5B57\u5F62\u7684\u90E8\u4EF6\uFF09\u7684 TTF\u3002\u5B57\u5F62\u53F7\u4E0D\u53D8\u3002 */\n  subset(gids: Iterable<number>): Uint8Array;\n  /** \u4E00\u4E32\u5B57 \u2192 \u4E00\u4E32\u5B57\u5F62\u53F7\uFF08\u4E00\u4E2A\u7801\u70B9\u4E00\u4E2A\uFF09\u3002\u5148\u67E5 cmap\uFF0C\u518D\u505A GSUB \u7684 `rclt`\uFF08\u4E0A\u4E0B\u6587\u5FC5\u6362\uFF09\u2014\u2014\u6CE8\u97F3\u5B57\u4F53\u9760\u5B83\u6309\u8BCD\u7ED9\u591A\u97F3\u5B57\u9009\u8BFB\u97F3\uFF08\u300C\u94F6\u884C\u300D\u7684\u884C \u2260 \u300C\u884C\u8D70\u300D\u7684\u884C\uFF09\u3002\n   *  \u6CA1\u6709 rclt \u7684\u5B57\u4F53 = \u9010\u5B57\u67E5 cmap\u3002\u53EA\u505A\u4E00\u5BF9\u4E00\u66FF\u6362\uFF0C\u6240\u4EE5\u957F\u5EA6\u4E0D\u53D8\u3002 */\n  shape(text: string): number[];\n  /** \u628A\u6309\u4E0A\u4E0B\u6587\u9009\u597D\u7684\u8BFB\u97F3**\u5199\u8FDB\u6587\u5B57\u91CC**\uFF1A\u54EA\u4E2A\u5B57\u7684\u5B57\u5F62\u88AB rclt \u6362\u4E86\uFF0C\u5C31\u5728\u5B83\u540E\u9762\u8865\u4E00\u4E2A\u53D8\u4F53\u9009\u62E9\u7B26\uFF08cmap 14\uFF1B\u840C\u795E\u7ED9\u6BCF\u4E2A\u8BFB\u97F3\u90FD\u7559\u4E86\u4E00\u4E2A\uFF0CU+E01E0 \u8D77\uFF09\u3002\n   *  \u7ED9\u4E0D\u505A rclt \u7684\u6392\u5B57\u5F15\u64CE\u7528\u2014\u2014\u5B9E\u6D4B Chromium \u7684 canvas \u753B\u5B57\u4E0D\u505A\u4E0A\u4E0B\u6587\u66FF\u6362\uFF0C\u4F46\u8BA4\u53D8\u4F53\u9009\u62E9\u7B26\uFF082026-10-01\uFF0C`tmp/round0930/probe-canvas-rclt.mjs`\uFF09\u3002\n   *  before / after = \u8FD9\u4E00\u884C\u5728\u6BB5\u843D\u91CC\u7684\u524D\u6587 / \u540E\u6587\uFF08\u53EA\u53C2\u4E0E\u9009\u8BFB\u97F3\uFF0C\u4E0D\u51FA\u73B0\u5728\u7ED3\u679C\u91CC\uFF09\u3002\u9009\u62E9\u7B26\u4E0D\u5360\u5BBD\u5EA6\u3002\u6CA1\u6709 rclt \u7684\u5B57\u4F53 \u2192 \u539F\u6837\u8FD4\u56DE\u3002 */\n  annotate(text: string, before?: string, after?: string): string;\n  /** \u8FD9\u6B3E\u5B57\u4F53\u6709\u6CA1\u6709 rclt\uFF08\u6709 = \u9010\u884C\u5355\u72EC\u6392\u4F1A\u4E22\u6389\u8DE8\u884C\u7684\u4E0A\u4E0B\u6587\uFF0C\u8C03\u7528\u65B9\u8981\u628A\u524D\u540E\u6587\u4E00\u8D77\u7ED9\uFF09\u3002 */\n  contextual: boolean;\n  /** rclt \u91CC\u9047\u5230\u7684\u3001\u8FD9\u4E2A\u5F15\u64CE\u4E0D\u8BA4\u8BC6\u7684\u67E5\u627E\u8868\u79CD\u7C7B\uFF08\u7A7A = \u5168\u8BA4\u8BC6\uFF09\u3002\u4E0D\u4E3A\u7A7A = \u4E2A\u522B\u8BFB\u97F3\u53EF\u80FD\u9009\u9519\uFF0C\u8C03\u7528\u65B9\u8BE5\u5982\u5B9E\u8BF4\u3002 */\n  shapeSkipped: string[];\n}\n\nconst u16 = (b: Uint8Array, o: number): number => (b[o]! << 8) | b[o + 1]!;\nconst i16 = (b: Uint8Array, o: number): number => { const v = u16(b, o); return v & 0x8000 ? v - 0x10000 : v; };\nconst u32 = (b: Uint8Array, o: number): number => ((b[o]! << 24) | (b[o + 1]! << 16) | (b[o + 2]! << 8) | b[o + 3]!) >>> 0;\nconst tagAt = (b: Uint8Array, o: number): string => String.fromCharCode(b[o]!, b[o + 1]!, b[o + 2]!, b[o + 3]!);\n\nexport class NotTrueTypeError extends Error { override name = \"NotTrueTypeError\"; }\n\nexport function parseTtf(bytes: Uint8Array): TtfFont {\n  if (bytes.length < 12) throw new NotTrueTypeError(\"font file too short\");\n  const sfnt = u32(bytes, 0);\n  if (tagAt(bytes, 0) === \"OTTO\") throw new NotTrueTypeError(\"CFF-flavoured OpenType (OTTO) is not supported; a glyf-outline TrueType font is required\");\n  if (sfnt !== 0x00010000 && tagAt(bytes, 0) !== \"true\") throw new NotTrueTypeError(`not a TrueType font (sfnt version 0x${sfnt.toString(16)})`);\n  const tables = new Map<string, { off: number; len: number }>();\n  const n = u16(bytes, 4);\n  for (let i = 0; i < n; i++) { const r = 12 + 16 * i; tables.set(tagAt(bytes, r), { off: u32(bytes, r + 8), len: u32(bytes, r + 12) }); }\n  const need = (tag: string) => { const t = tables.get(tag); if (!t) throw new NotTrueTypeError(`missing '${tag}' table`); return t; };\n  const head = need(\"head\"), hhea = need(\"hhea\"), maxp = need(\"maxp\"), hmtx = need(\"hmtx\"), loca = need(\"loca\"), glyf = need(\"glyf\"), cmap = need(\"cmap\");\n  const unitsPerEm = u16(bytes, head.off + 18), longLoca = i16(bytes, head.off + 50) === 1;\n  const bbox: [number, number, number, number] = [i16(bytes, head.off + 36), i16(bytes, head.off + 38), i16(bytes, head.off + 40), i16(bytes, head.off + 42)];\n  const ascender = i16(bytes, hhea.off + 4), descender = i16(bytes, hhea.off + 6), numHMetrics = u16(bytes, hhea.off + 34);\n  const numGlyphs = u16(bytes, maxp.off + 4);\n  const os2 = tables.get(\"OS/2\");\n  const capHeight = os2 && os2.len >= 90 && u16(bytes, os2.off) >= 2 ? i16(bytes, os2.off + 88) : Math.round(ascender * 0.8);\n\n  // \u2500\u2500 name id 6\uFF08PostScript \u540D\uFF09\u2500\u2500\n  let psName = \"Font\";\n  const nameT = tables.get(\"name\");\n  if (nameT) {\n    const cnt = u16(bytes, nameT.off + 2), so = nameT.off + u16(bytes, nameT.off + 4);\n    for (let i = 0; i < cnt; i++) {\n      const r = nameT.off + 6 + 12 * i; if (u16(bytes, r + 6) !== 6) continue;\n      const pid = u16(bytes, r), len = u16(bytes, r + 8), o = so + u16(bytes, r + 10);\n      let s = \"\";\n      if (pid === 3 || pid === 0) for (let k = 0; k + 1 < len; k += 2) s += String.fromCharCode(u16(bytes, o + k));\n      else for (let k = 0; k < len; k++) s += String.fromCharCode(bytes[o + k]!);\n      s = s.replace(/[^A-Za-z0-9\\-]/g, \"\"); if (s) { psName = s; break; }\n    }\n  }\n\n  // \u2500\u2500 cmap\uFF1A\u4F18\u5148 format 12\uFF08\u5168 Unicode\uFF09\uFF0C\u5176\u6B21 format 4\uFF08BMP\uFF09\u2500\u2500\n  let f12 = -1, f4 = -1, f14 = -1;\n  const nSub = u16(bytes, cmap.off + 2);\n  for (let i = 0; i < nSub; i++) {\n    const r = cmap.off + 4 + 8 * i, pid = u16(bytes, r), s = cmap.off + u32(bytes, r + 4), fmt = u16(bytes, s);\n    if (fmt === 12 && (pid === 3 || pid === 0)) f12 = s;\n    else if (fmt === 4 && (pid === 3 || pid === 0) && f4 < 0) f4 = s;\n    else if (fmt === 14) f14 = s;\n  }\n  if (f12 < 0 && f4 < 0) throw new NotTrueTypeError(\"no usable cmap subtable (format 4 or 12)\");\n  const glyphId = (cp: number): number => {\n    if (f12 >= 0) {\n      let lo = 0, hi = u32(bytes, f12 + 12) - 1;\n      while (lo <= hi) { const mid = (lo + hi) >> 1, g = f12 + 16 + 12 * mid, a = u32(bytes, g), e = u32(bytes, g + 4); if (cp < a) hi = mid - 1; else if (cp > e) lo = mid + 1; else { const gid = u32(bytes, g + 8) + (cp - a); return gid < numGlyphs ? gid : 0; } }\n      return 0;\n    }\n    if (cp > 0xffff) return 0;\n    const segX2 = u16(bytes, f4 + 6), ends = f4 + 14, starts = ends + segX2 + 2, deltas = starts + segX2, ranges = deltas + segX2;\n    let lo = 0, hi = segX2 / 2 - 1;\n    while (lo <= hi) {\n      const mid = (lo + hi) >> 1, e = u16(bytes, ends + 2 * mid);\n      if (cp > e) { lo = mid + 1; continue; }\n      const a = u16(bytes, starts + 2 * mid);\n      if (cp < a) { hi = mid - 1; continue; }\n      const ro = u16(bytes, ranges + 2 * mid);\n      if (ro === 0) return (cp + u16(bytes, deltas + 2 * mid)) & 0xffff;\n      const g = u16(bytes, ranges + 2 * mid + ro + 2 * (cp - a));\n      return g === 0 ? 0 : (g + u16(bytes, deltas + 2 * mid)) & 0xffff;\n    }\n    return 0;\n  };\n\n  const advance = (gid: number): number => u16(bytes, hmtx.off + 4 * Math.min(Math.max(gid, 0), numHMetrics - 1));\n  /** \u5B57\u5F62\u5728 glyf \u91CC\u7684 [\u8D77, \u6B62)\uFF08\u76F8\u5BF9 glyf \u8868\u5934\uFF09\u3002 */\n  const span = (gid: number): [number, number] => longLoca\n    ? [u32(bytes, loca.off + 4 * gid), u32(bytes, loca.off + 4 * gid + 4)]\n    : [u16(bytes, loca.off + 2 * gid) * 2, u16(bytes, loca.off + 2 * gid + 2) * 2];\n  const inkOf = (gid: number): [number, number, number, number] | null => {\n    if (gid < 0 || gid >= numGlyphs) return null;\n    const [a, e] = span(gid); if (e <= a) return null;\n    const o = glyf.off + a; return [i16(bytes, o + 2), i16(bytes, o + 4), i16(bytes, o + 6), i16(bytes, o + 8)];\n  };\n\n  function subset(gids: Iterable<number>): Uint8Array {\n    // \u95ED\u5305\uFF1A.notdef + \u7528\u5230\u7684 + \u590D\u5408\u5B57\u5F62\u7684\u90E8\u4EF6\uFF08\u9012\u5F52\uFF09\n    const keep = new Set<number>([0]); const todo: number[] = [];\n    for (const g of gids) if (g > 0 && g < numGlyphs && !keep.has(g)) { keep.add(g); todo.push(g); }\n    todo.push(0);\n    while (todo.length) {\n      const g = todo.pop()!; const [a, e] = span(g); if (e - a < 10) continue;\n      let o = glyf.off + a; if (i16(bytes, o) >= 0) continue;   // \u7B80\u5355\u5B57\u5F62\n      o += 10;\n      for (;;) {\n        const flags = u16(bytes, o), comp = u16(bytes, o + 2); o += 4;\n        if (comp < numGlyphs && !keep.has(comp)) { keep.add(comp); todo.push(comp); }\n        o += flags & 0x0001 ? 4 : 2;                                  // ARG_1_AND_2_ARE_WORDS\n        if (flags & 0x0008) o += 2; else if (flags & 0x0040) o += 4; else if (flags & 0x0080) o += 8;   // \u7F29\u653E / 2\u00D72\n        if (!(flags & 0x0020)) break;                                  // MORE_COMPONENTS\n      }\n    }\n    // \u65B0 glyf + \u957F\u683C\u5F0F loca\uFF08\u6BCF\u4E2A\u5B57\u5F62 4 \u5B57\u8282\u5BF9\u9F50\uFF09\n    let total = 0;\n    for (const g of keep) { const [a, e] = span(g); total += (e - a + 3) & ~3; }\n    const newGlyf = new Uint8Array(total), newLoca = new Uint8Array(4 * (numGlyphs + 1));\n    const dv = new DataView(newLoca.buffer);\n    let pos = 0;\n    for (let g = 0; g < numGlyphs; g++) {\n      dv.setUint32(4 * g, pos);\n      if (keep.has(g)) { const [a, e] = span(g); newGlyf.set(bytes.subarray(glyf.off + a, glyf.off + e), pos); pos += (e - a + 3) & ~3; }\n    }\n    dv.setUint32(4 * numGlyphs, pos);\n    const newHead = bytes.slice(head.off, head.off + head.len);\n    newHead[8] = newHead[9] = newHead[10] = newHead[11] = 0;   // checkSumAdjustment \u5148\u6E05\u96F6\n    newHead[50] = 0; newHead[51] = 1;                           // indexToLocFormat = long\n    const out: [string, Uint8Array][] = [[\"glyf\", newGlyf], [\"head\", newHead], [\"hhea\", bytes.subarray(hhea.off, hhea.off + hhea.len)], [\"hmtx\", bytes.subarray(hmtx.off, hmtx.off + hmtx.len)], [\"loca\", newLoca], [\"maxp\", bytes.subarray(maxp.off, maxp.off + maxp.len)]];\n    for (const t of [\"cvt \", \"fpgm\", \"prep\"]) { const x = tables.get(t); if (x) out.push([t, bytes.subarray(x.off, x.off + x.len)]); }\n    out.sort((p, q) => (p[0] < q[0] ? -1 : 1));\n    return assembleSfnt(out);\n  }\n\n  const rclt = buildRclt(bytes, tables.get(\"GSUB\"));\n  const shape = (text: string): number[] => { const g: number[] = []; for (const ch of text) g.push(glyphId(ch.codePointAt(0)!)); if (rclt) rclt.apply(g); return g; };\n\n  /** cmap 14 \u53CD\u67E5\uFF1A\u7801\u70B9 + \u5B57\u5F62\u53F7 \u2192 \u53D8\u4F53\u9009\u62E9\u7B26\uFF1B\u6CA1\u6709 \u2192 0\u3002\u9009\u62E9\u7B26\u4E00\u5171\u6CA1\u51E0\u4E2A\uFF08\u840C\u795E 9 \u4E2A\uFF09\uFF0C\u9010\u4E2A\u4E8C\u5206\u3002 */\n  const u24 = (o: number): number => (bytes[o]! << 16) | (bytes[o + 1]! << 8) | bytes[o + 2]!;\n  const selectorFor = (cp: number, gid: number): number => {\n    if (f14 < 0) return 0;\n    for (let i = 0, n = u32(bytes, f14 + 6); i < n; i++) {\n      const r = f14 + 10 + 11 * i, nd = u32(bytes, r + 7); if (!nd) continue;\n      const t = f14 + nd; let lo = 0, hi = u32(bytes, t) - 1;\n      while (lo <= hi) { const mid = (lo + hi) >> 1, m = t + 4 + 5 * mid, v = u24(m); if (cp < v) hi = mid - 1; else if (cp > v) lo = mid + 1; else { if (u16(bytes, m + 3) === gid) return u24(r); break; } }\n    }\n    return 0;\n  };\n  const annotate = (text: string, before = \"\", after = \"\"): string => {\n    if (!rclt) return text;\n    const chars = [...text], skipN = [...before].length, g = shape(before + text + after);\n    let out = \"\";\n    chars.forEach((ch, k) => { const cp = ch.codePointAt(0)!, got = g[skipN + k]!; out += ch; if (got !== glyphId(cp)) { const vs = selectorFor(cp, got); if (vs) out += String.fromCodePoint(vs); } });\n    return out;\n  };\n\n  return { unitsPerEm, ascender, descender, capHeight, bbox, numGlyphs, psName, glyphId, advance, inkOf, subset, shape, annotate, contextual: !!rclt, shapeSkipped: rclt ? rclt.skipped : [] };\n}\n\n// \u2500\u2500 GSUB `rclt`\uFF08v2.3.21\uFF1Bcreated 2026-10-01 by Claude Fable 5.1\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//   \u53EA\u4E3A\u6CE8\u97F3\u5B57\u4F53\uFF08\u840C\u795E\uFF09\uFF1A\u6C49\u5B57\u5B57\u5F62\u81EA\u5E26\u62FC\u97F3\uFF0C\u591A\u97F3\u5B57\u7684\u522B\u7684\u8BFB\u97F3\u662F\u53E6\u4E00\u4E2A\u5B57\u5F62\uFF0C\u9760 rclt \u7684\u300C\u94FE\u5F0F\u4E0A\u4E0B\u6587\u66FF\u6362\u300D\u6309\u524D\u540E\u7684\u5B57\u6362\u8FC7\u53BB\u3002\n//   \u8BA4\u7684\u67E5\u627E\u8868\uFF1A1\uFF08\u5355\u66FF\u6362\uFF0C\u683C\u5F0F 1 / 2\uFF09\u30016\uFF08\u94FE\u5F0F\u4E0A\u4E0B\u6587\uFF0C\u683C\u5F0F 2 \u6309\u7C7B / \u683C\u5F0F 3 \u6309\u8986\u76D6\u8868\uFF09\u30017\uFF08\u6269\u5C55\u58F3\uFF09\u3002\u522B\u7684 \u2192 \u8BB0\u8FDB skipped\u3001\u8DF3\u8FC7\u3002\n//   \u8BED\u4E49\u7167 OpenType\uFF1A\u67E5\u627E\u8868\u6309 LookupList \u7684\u5E8F\u53F7\u4F9D\u6B21\u6574\u4E32\u8FC7\u4E00\u904D\uFF1B\u6BCF\u4E2A\u4F4D\u7F6E\u8BD5\u5404\u5B50\u8868\uFF0C\u5934\u4E00\u4E2A\u5339\u914D\u7684\u751F\u6548\uFF1B\u94FE\u5F0F\u5339\u914D\u4E0A\u4E86\u5C31\u8DF3\u8FC7\u6574\u6BB5\u8F93\u5165\u3002\n//   \u4E0D\u7BA1 script / language\uFF08\u628A\u6240\u6709 rclt \u7279\u6027\u7684\u67E5\u627E\u8868\u5E76\u8D77\u6765\uFF09\u3001\u4E0D\u7BA1 lookupFlag \u7684\u5FFD\u7565\u89C4\u5219\uFF08\u8FD9\u7C7B\u5B57\u4F53\u91CC\u6CA1\u6709\u8981\u5FFD\u7565\u7684\u6807\u8BB0\uFF09\u3002\ntype Cov = (gid: number) => number;\nfunction buildRclt(b: Uint8Array, t: { off: number; len: number } | undefined): { apply(g: number[]): void; skipped: string[] } | null {\n  if (!t || t.len < 10) return null;\n  const base = t.off, featureList = base + u16(b, base + 6), lookupList = base + u16(b, base + 8);\n  const wanted = new Set<number>();\n  for (let i = 0, n = u16(b, featureList); i < n; i++) {\n    const r = featureList + 2 + 6 * i; if (tagAt(b, r) !== \"rclt\") continue;\n    const f = featureList + u16(b, r + 4);\n    for (let k = 0, m = u16(b, f + 2); k < m; k++) wanted.add(u16(b, f + 4 + 2 * k));\n  }\n  if (!wanted.size) return null;\n  const skipped: string[] = [];\n  const skip = (what: string): null => { if (!skipped.includes(what)) skipped.push(what); return null; };\n\n  const coverage = (o: number): Cov => {\n    const fmt = u16(b, o), n = u16(b, o + 2);\n    if (fmt === 1) return (g) => { let lo = 0, hi = n - 1; while (lo <= hi) { const mid = (lo + hi) >> 1, v = u16(b, o + 4 + 2 * mid); if (g < v) hi = mid - 1; else if (g > v) lo = mid + 1; else return mid; } return -1; };\n    return (g) => { let lo = 0, hi = n - 1; while (lo <= hi) { const mid = (lo + hi) >> 1, r = o + 4 + 6 * mid, a = u16(b, r), e = u16(b, r + 2); if (g < a) hi = mid - 1; else if (g > e) lo = mid + 1; else return u16(b, r + 4) + (g - a); } return -1; };\n  };\n  const classDef = (o: number | null): ((gid: number) => number) => {\n    if (o == null) return () => 0;\n    const fmt = u16(b, o);\n    if (fmt === 1) { const start = u16(b, o + 2), n = u16(b, o + 4); return (g) => (g >= start && g < start + n ? u16(b, o + 6 + 2 * (g - start)) : 0); }\n    const n = u16(b, o + 2);\n    return (g) => { let lo = 0, hi = n - 1; while (lo <= hi) { const mid = (lo + hi) >> 1, r = o + 4 + 6 * mid, a = u16(b, r), e = u16(b, r + 2); if (g < a) hi = mid - 1; else if (g > e) lo = mid + 1; else return u16(b, r + 4); } return 0; };\n  };\n\n  /** \u4E00\u5F20\u5B50\u8868\uFF1A\u5728 g[i] \u4E0A\u8BD5\u4E00\u6B21\uFF1B\u5339\u914D\u5E76\u6539\u4E86 \u2192 \u5403\u6389\u7684\u8F93\u5165\u957F\u5EA6\uFF08\u2265 1\uFF09\uFF0C\u5426\u5219 0\u3002 */\n  type Sub = (g: number[], i: number) => number;\n  const lookupCache = new Map<number, Sub[]>();\n  const applyAt = (lookup: number, g: number[], i: number): number => { for (const s of subsOf(lookup)) { const n = s(g, i); if (n) return n; } return 0; };\n  const records = (o: number, count: number, g: number[], i: number): void => { for (let k = 0; k < count; k++) { const seq = u16(b, o + 4 * k), lk = u16(b, o + 4 * k + 2); if (i + seq < g.length) applyAt(lk, g, i + seq); } };\n\n  function subsOf(lookup: number): Sub[] {\n    let subs = lookupCache.get(lookup); if (subs) return subs;\n    subs = []; lookupCache.set(lookup, subs);\n    if (lookup >= u16(b, lookupList)) return subs;\n    const lo = lookupList + u16(b, lookupList + 2 + 2 * lookup); let type = u16(b, lo);\n    for (let k = 0, n = u16(b, lo + 4); k < n; k++) {\n      let st = lo + u16(b, lo + 6 + 2 * k), ty = type;\n      if (ty === 7) { ty = u16(b, st + 2); st = st + u32(b, st + 4); }\n      const sub = makeSub(ty, st); if (sub) subs.push(sub);\n    }\n    return subs;\n  }\n  function makeSub(type: number, o: number): Sub | null {\n    const fmt = u16(b, o);\n    if (type === 1) {\n      const cov = coverage(o + u16(b, o + 2));\n      if (fmt === 1) { const delta = u16(b, o + 4); return (g, i) => { if (cov(g[i]!) < 0) return 0; g[i] = (g[i]! + delta) & 0xffff; return 1; }; }\n      if (fmt === 2) return (g, i) => { const c = cov(g[i]!); if (c < 0 || c >= u16(b, o + 4)) return 0; g[i] = u16(b, o + 6 + 2 * c); return 1; };\n      return skip(`single substitution format ${fmt}`);\n    }\n    if (type === 6 && fmt === 2) {\n      const off = (k: number): number | null => { const v = u16(b, o + k); return v ? o + v : null; };\n      const cov = coverage(o + u16(b, o + 2)), back = classDef(off(4)), input = classDef(off(6)), ahead = classDef(off(8)), nSets = u16(b, o + 10);\n      return (g, i) => {\n        if (cov(g[i]!) < 0) return 0;\n        const cls = input(g[i]!); if (cls >= nSets) return 0;\n        const so = u16(b, o + 12 + 2 * cls); if (!so) return 0;\n        const set = o + so;\n        rules: for (let r = 0, nr = u16(b, set); r < nr; r++) {\n          let p = set + u16(b, set + 2 + 2 * r);\n          const nb = u16(b, p); p += 2;\n          if (nb > i) continue;\n          for (let k = 0; k < nb; k++) if (back(g[i - 1 - k]!) !== u16(b, p + 2 * k)) continue rules;\n          p += 2 * nb;\n          const ni = u16(b, p); p += 2;\n          if (i + ni > g.length) continue;\n          for (let k = 1; k < ni; k++) if (input(g[i + k]!) !== u16(b, p + 2 * (k - 1))) continue rules;\n          p += 2 * (ni - 1);\n          const na = u16(b, p); p += 2;\n          if (i + ni + na > g.length) continue;\n          for (let k = 0; k < na; k++) if (ahead(g[i + ni + k]!) !== u16(b, p + 2 * k)) continue rules;\n          p += 2 * na;\n          records(p + 2, u16(b, p), g, i);\n          return Math.max(1, ni);\n        }\n        return 0;\n      };\n    }\n    if (type === 6 && fmt === 3) {\n      let p = o + 2;\n      const list = (): Cov[] => { const n = u16(b, p); p += 2; const out: Cov[] = []; for (let k = 0; k < n; k++) out.push(coverage(o + u16(b, p + 2 * k))); p += 2 * n; return out; };\n      const back = list(), input = list(), ahead = list(); const nRec = u16(b, p), rec = p + 2;\n      if (!input.length) return null;\n      return (g, i) => {\n        if (back.length > i || i + input.length + ahead.length > g.length) return 0;\n        for (let k = 0; k < input.length; k++) if (input[k]!(g[i + k]!) < 0) return 0;\n        for (let k = 0; k < back.length; k++) if (back[k]!(g[i - 1 - k]!) < 0) return 0;\n        for (let k = 0; k < ahead.length; k++) if (ahead[k]!(g[i + input.length + k]!) < 0) return 0;\n        records(rec, nRec, g, i);\n        return input.length;\n      };\n    }\n    return skip(`lookup type ${type} format ${fmt}`);\n  }\n\n  const order = [...wanted].sort((x, y) => x - y);\n  return { skipped, apply(g) { for (const lk of order) { for (let i = 0; i < g.length;) { const n = applyAt(lk, g, i); i += n || 1; } } } };\n}\n\nfunction checksum(b: Uint8Array): number {\n  let sum = 0; const n = b.length & ~3;\n  for (let i = 0; i < n; i += 4) sum = (sum + u32(b, i)) >>> 0;\n  if (b.length & 3) { let last = 0; for (let i = n; i < b.length; i++) last |= b[i]! << (24 - 8 * (i - n)); sum = (sum + (last >>> 0)) >>> 0; }\n  return sum;\n}\n/** \u62FC\u4E00\u4E2A sfnt\uFF1A\u8868\u76EE\u5F55\u6309 tag \u6392\u597D\u3001\u6BCF\u5F20\u8868 4 \u5B57\u8282\u5BF9\u9F50\u3001head.checkSumAdjustment \u56DE\u586B\u3002 */\nfunction assembleSfnt(tables: [string, Uint8Array][]): Uint8Array {\n  const n = tables.length; let e = 0; while ((1 << (e + 1)) <= n) e++;\n  const headerLen = 12 + 16 * n; let total = headerLen;\n  for (const [, d] of tables) total += (d.length + 3) & ~3;\n  const out = new Uint8Array(total), dv = new DataView(out.buffer);\n  dv.setUint32(0, 0x00010000); dv.setUint16(4, n); dv.setUint16(6, (1 << e) * 16); dv.setUint16(8, e); dv.setUint16(10, n * 16 - (1 << e) * 16);\n  let off = headerLen, headOff = -1;\n  tables.forEach(([tag, d], i) => {\n    const r = 12 + 16 * i;\n    for (let k = 0; k < 4; k++) out[r + k] = tag.charCodeAt(k);\n    dv.setUint32(r + 4, checksum(d)); dv.setUint32(r + 8, off); dv.setUint32(r + 12, d.length);\n    out.set(d, off); if (tag === \"head\") headOff = off;\n    off += (d.length + 3) & ~3;\n  });\n  if (headOff >= 0) dv.setUint32(headOff + 8, (0xb1b0afba - checksum(out)) >>> 0);\n  return out;\n}\n", "// diag-ui.ts \u2014\u2014 \u8BBE\u7F6E\u91CC\u300C\u8BCA\u65AD\u65E5\u5FD7\u300D\u7684\u4E09\u4E2A\u52A8\u4F5C\uFF1A\u590D\u5236 / \u5206\u4EAB .txt\uFF08\u6CA1\u6709 share \u7684\u73AF\u5883 = \u4E0B\u8F7D\uFF09/ \u6E05\u7A7A\u3002\u6570\u636E\u6E90 = src/app/report-error.ts \u7684\u9ED1\u5323\u5B50\u3002\n// created 2026-10-08 by Claude Fable 5.1\uFF08\u7167\u6284 WebXiaoHeiWu src/diag-log-ui.ts\uFF1Buser\u300Cdebug consolelog\u2026\u5C31\u662F\u51FA\u9519\u4E86\u53EF\u4EE5\u53D1\u7ED9\u4F60\u7684\u4E1C\u897F\uFF0C\u770B wxhw \u662F\u600E\u4E48\u505A\u7684\u300D\uFF09\u3002\n// \u590D\u5236\uFF1Anavigator.clipboard.writeText\uFF08\u70B9\u51FB\u624B\u52BF\u5185\uFF09\u2192 \u5931\u8D25\u56DE\u9000 textarea + execCommand \u2192 \u518D\u5931\u8D25\u9009\u4E2D <pre> \u8BA9\u7528\u6237\u957F\u6309\u590D\u5236\u3002\n// \u5206\u4EAB\uFF1AcanShare files \u2192 .txt \u6587\u4EF6\uFF08\u5FAE\u4FE1 / QQ \u5403\u4E0D\u4E0B 60 KB \u957F\u6587\u672C\u2014\u2014WeebPaint 2026-09-06 \u6559\u8BAD\uFF09\uFF1B\u4E0B\u8F7D .txt \u4E00\u76F4\u6709\uFF08v0.10.15\uFF09\u3002\u65E0\u7CFB\u7EDF\u5F39\u7A97\uFF08\u5BB6\u89C4\uFF09\uFF1A\u7ED3\u679C\u8D70 notice\u3002\nimport { diagText, diagClear, diagCount, reportError } from \"./report-error.ts\";\n\nfunction copyViaTextarea(text: string): boolean {\n  const ta = document.createElement(\"textarea\");\n  ta.value = text; ta.setAttribute(\"readonly\", \"\"); ta.style.position = \"fixed\"; ta.style.left = \"-9999px\"; ta.style.top = \"0\";\n  document.body.appendChild(ta);\n  ta.focus(); ta.select(); ta.setSelectionRange(0, text.length);\n  let ok = false;\n  try { ok = document.execCommand(\"copy\"); } catch { ok = false; }\n  ta.remove();\n  return ok;\n}\nexport async function copyDiag(pre: HTMLElement | null, status: (text: string) => void): Promise<void> {\n  const text = diagText(), n = diagCount();\n  try {\n    if (!navigator.clipboard?.writeText) throw new Error(\"navigator.clipboard.writeText unavailable\");\n    await navigator.clipboard.writeText(text);\n    status(`\u590D\u5236\u4E86 ${n} \u6761`); return;\n  } catch (e) { reportError(new Error(\"[diag-log] clipboard.writeText failed: \" + String(e)), \"log\"); }\n  if (copyViaTextarea(text)) { status(`\u590D\u5236\u4E86 ${n} \u6761`); return; }\n  try { if (pre) { const range = document.createRange(); range.selectNodeContents(pre); const sel = window.getSelection(); sel?.removeAllRanges(); sel?.addRange(range); } } catch { /* \u9009\u533A\u90FD\u505A\u4E0D\u4E86 */ }\n  reportError(new Error(\"[diag-log] execCommand copy failed too\"), \"log\");\n  status(\"\u590D\u5236\u4E0D\u4E86\uFF08\u6D4F\u89C8\u5668\u4E0D\u7ED9\u526A\u8D34\u677F\uFF09\uFF1A\u5DF2\u9009\u4E2D\uFF0C\u957F\u6309\u590D\u5236\");\n}\nconst logFile = () => new File([diagText()], `moonsinger-diag-${new Date().toISOString().slice(0, 19).replace(/[:T]/g, \"-\")}.txt`, { type: \"text/plain\" });\nexport const canShareDiag = (): boolean => typeof navigator.share === \"function\";\n/** \u4E0B\u8F7D .txt\uFF08\u4E00\u76F4\u6709\uFF1A\u7535\u8111\u4E0A Windows / Edge \u4E5F\u6709\u7CFB\u7EDF\u5206\u4EAB\uFF0C\u5206\u4EAB\u51FA\u53BB\u7684 txt \u4E0D\u597D\u627E\u2014\u2014v0.10.15\uFF0Cuser\u300Cbug report\u7684\u7535\u8111\u4E0A\u9762\u5206\u4EABtxt\u5E94\u8BE5\u662F\u4E0B\u8F7D\uFF0C\u6216\u8005\u52A0\u4E00\u4E2A\u4E0B\u8F7D\uFF1F\u300D\uFF09\u3002\n *  \u4E0D\u9760\u731C\u300C\u662F\u4E0D\u662F\u7535\u8111\u300D\uFF08iPad \u63A5\u4E86\u89E6\u63A7\u677F\u4E5F\u62A5\u7EC6\u6307\u9488\u3001Windows \u4E5F\u6709\u5206\u4EAB\uFF09\uFF0C\u4E24\u4E2A\u94AE\u90FD\u6446\u51FA\u6765\u3002 */\nexport function downloadDiag(status: (text: string) => void): void {\n  const f = logFile(), url = URL.createObjectURL(f);\n  const a = document.createElement(\"a\"); a.href = url; a.download = f.name; a.style.display = \"none\";\n  document.body.appendChild(a); a.click(); a.remove();\n  setTimeout(() => URL.revokeObjectURL(url), 10_000);\n  status(`\u4E0B\u8F7D\u4E86 ${f.name}`);\n}\nexport async function shareDiag(status: (text: string) => void): Promise<void> {\n  const f = logFile();\n  if (!canShareDiag()) { downloadDiag(status); return; }\n  try {\n    const nav = navigator as Navigator & { canShare?: (d: ShareData) => boolean };\n    if (nav.canShare?.({ files: [f] })) await navigator.share({ title: \"MoonSinger \u8BCA\u65AD\u65E5\u5FD7\", files: [f] });\n    else await navigator.share({ title: \"MoonSinger \u8BCA\u65AD\u65E5\u5FD7\", text: diagText() });\n  } catch (e) { if ((e as { name?: string })?.name !== \"AbortError\") { reportError(new Error(\"[diag-log] share failed: \" + String(e)), \"log\"); status(\"\u5206\u4EAB\u6CA1\u6210\"); } }\n}\nexport function clearDiag(pre: HTMLElement | null, status: (text: string) => void): void { diagClear(); if (pre) pre.textContent = \"\uFF08\u7A7A\uFF09\"; status(\"\u6E05\u7A7A\u4E86\"); }\n", "// cover.ts \u2014\u2014 \u4EFB\u4E00\u56FE\u7247\u5B57\u8282 \u2192 \u5C01\u9762 PNG\uFF08`Thumbnails/thumbnail.png` \u7684\u89C4\u683C\uFF0CWXHW ADR-0012 / ORA \u540C\u6B3E\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\n//   \u2264 256\u00B2\u3001\u2264 70 KB\uFF08store getPeek \u5C3E\u7A97 80 KB \u51CF central directory \u4E00\u6B21\u547D\u4E2D\uFF09\u3001\u767D\u5E95\uFF1B\u8170\u5C01\u4E00\u884C\u5199\u8FDB PNG \u7684 iTXt `Description`\n//   \uFF08\u4E00\u6B21\u5C3E\u8BFB\u540C\u65F6\u62FF\u5230\u5C01\u9762\u4E0E\u8170\u5C01\uFF1B\u4EFB\u4F55\u770B\u56FE\u8F6F\u4EF6\u76F4\u63A5\u80FD\u8BFB\uFF09\u3002\u7F29\u56FE / \u538B\u9884\u7B97 = @internal/gallery \u7684\u7EAF\u51FD\u6570\uFF1B\u89E3\u7801 = src/image/codec.ts\uFF08\u552F\u4E00 canvas \u70B9\uFF09\u3002\nimport { makeThumbAdaptive, withPngText, PNG_BLURB_KEYWORD, THUMB_MAX_BYTES } from \"@internal/gallery\";\nimport { decodeToRgba, type RgbaImage } from \"./codec.ts\";\n\n/** \u56FE\u7247\u5B57\u8282\uFF08jpeg / png / webp / gif\u2026\uFF09\u2192 \u5C01\u9762 PNG\uFF1Bblurb = \u8170\u5C01\uFF08null = \u4E0D\u5199\uFF09\u3002 */\n/** \u5C45\u4E2D\u88C1\u6210\u6B63\u65B9\u5F62\uFF08\u5531\u7247\u5C01\u9762\u662F\u65B9\u7684\uFF1B\u957F\u8FB9\u4E24\u5934\u5404\u5207\u6389\u4E00\u622A\uFF0C\u4E0D\u62C9\u4F38\uFF09\u3002\u5DF2\u7ECF\u662F\u65B9\u7684\u539F\u6837\u8FD4\u56DE\u3002 */\nexport function cropSquare(img: RgbaImage): RgbaImage {\n  const { w, h } = img;\n  if (w === h) return img;\n  const n = Math.min(w, h), x0 = (w - n) >> 1, y0 = (h - n) >> 1, out = new Uint8ClampedArray(n * n * 4), src = img.data;\n  for (let y = 0; y < n; y++) out.set(src.subarray(((y0 + y) * w + x0) * 4, ((y0 + y) * w + x0 + n) * 4), y * n * 4);\n  return { w: n, h: n, data: out };\n}\nexport async function makeCoverPng(bytes: Uint8Array, blurb: string | null = null): Promise<Uint8Array> {\n  const rgba = cropSquare(await decodeToRgba(new Blob([bytes as unknown as BlobPart])));\n  // \u540C\u6B65 encodePng\uFF1AmakeThumbAdaptive \u8981\u540C\u6B65\u7F16\u7801\u5668\uFF0CUPNG \u60F0\u6027\u88C5\u597D\u540E\u540C\u6B65\u8C03\uFF08\u5148 await \u4E00\u6B21\u88C5\u6A21\u5757\uFF09\n  const { default: UPNG } = await import(\"../../vendor/upng/upng.esm.js\");\n  const r = makeThumbAdaptive(rgba, { encodePng: (px, w, h, colors) => new Uint8Array(UPNG.encode([new Uint8Array(px).buffer], w, h, colors)), keepAlpha: false, maxBytes: THUMB_MAX_BYTES });\n  return blurb ? withPngText(r.png, PNG_BLURB_KEYWORD, blurb) : r.png;\n}\n\n/** \u5C01\u9762 PNG \u6362\u4E00\u6761\u8170\u5C01\uFF08\u4F5C\u8005\u884C\uFF09\uFF1A\u5148\u5220\u65E7\u7684\u540C\u5173\u952E\u5B57\u5757\u518D\u5199\uFF08withPngText \u7684\u8BED\u4E49\uFF09\uFF0C\u6240\u4EE5\u6BCF\u6B21\u5B58\u90FD\u53EF\u4EE5\u91CD\u5199\u3001\u4E0D\u4F1A\u8D8A\u5199\u8D8A\u591A\u3002null = \u53BB\u6389\u8170\u5C01\u3002 */\nexport const coverWithBlurb = (png: Uint8Array, blurb: string | null): Uint8Array => withPngText(png, PNG_BLURB_KEYWORD, blurb && blurb.trim() ? blurb.trim() : null);\n", "// clipboard.ts \u2014\u2014 \u9009\u533A\u7684\u590D\u5236 / \u526A\u5207 / \u7C98\u8D34 / \u5168\u9009\uFF08\u7EAF\u51FD\u6570\uFF09+ \u7B80\u8C31\u6587\u5B57\uFF08\u7CFB\u7EDF\u526A\u8D34\u677F\u90A3\u4E00\u5C42\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\n// user 2026-10-08\u300C\u526A\u8D34\u677F\u4E24\u5C42 \u540C\u610F\u300D\uFF1Aapp \u5185\u5B58\u4E00\u4EFD\u539F token\uFF08\u8FDE\u6B4C\u8BCD\u3001\u8FDE\u97F3\u3001\u8BB0\u53F7\uFF09\uFF1B\u7CFB\u7EDF\u526A\u8D34\u677F\u653E\u4E00\u884C\u7B80\u8C31\u6587\u5B57\uFF08\u80FD\u8D34\u8FDB\u804A\u5929\uFF0C\u53CD\u8FC7\u6765\u4E5F\u80FD\u628A\u7B80\u8C31\u6587\u5B57\u8D34\u8FDB\u6765\u5F53\u8F93\u5165\uFF09\u3002\n// \u7B80\u8C31\u6587\u5B57\u7684\u8BED\u6CD5\uFF08\u76F8\u5BF9\u300C\u9009\u533A\u5F00\u5934\u751F\u6548\u7684\u8C03\u300D\u5199\uFF0C\u8D34\u7684\u65F6\u5019\u76F8\u5BF9\u5149\u6807\u5904\u7684\u8C03\u8BFB\uFF09\uFF1A\n//   \u97F3 = [\u5347\u964D][\u97F3\u7EA7][\u516B\u5EA6][\u65F6\u503C][/\u6B4C\u8BCD]\uFF1A\u5347\u964D # / b\uFF08\u76F8\u5BF9\u8C03\u5185\u97F3\uFF09\uFF1B\u97F3\u7EA7 1\u20137\uFF1B\u516B\u5EA6 ' \u9AD8\u4E00\u4E2A , \u4F4E\u4E00\u4E2A\uFF08\u53EF\u53E0\uFF09\uFF1B\u53E0\u97F3 = \u51E0\u4E2A\u97F3\u9AD8\u7528 & \u8FDE\uFF081&3&5\uFF09\uFF1B\u65F6\u503C\uFF1A\u4E0D\u5199 = \u56DB\u5206\uFF0C_ \u516B\u5206\uFF0C__ \u5341\u516D\u5206\uFF0C___ \u4E09\u5341\u4E8C\u5206\uFF0C. \u9644\u70B9\uFF1B\n//   \u8FDE\u97F3\u7EBF / \u5EF6\u97F3\uFF1A^ \u524D\u7F00 = \u8FDE\u7740\u524D\u4E00\u4E2A\u97F3\uFF08tie\uFF09\uFF1B0 = \u4F11\u6B62\uFF08\u65F6\u503C\u540C\u97F3\uFF09\uFF1B- = \u524D\u4E00\u4E2A\u97F3 / \u4F11\u6B62\u518D\u52A0\u4E00\u4E2A\u56DB\u5206\uFF08\u7B80\u8C31\u7684\u6A2A\u7EBF\uFF09\uFF1B| = \u5C0F\u8282\u7EBF\uFF1B\u5355\u72EC\u4E00\u4E2A , = \u53E5\uFF08\u6362\u6C14 / \u6362\u884C\uFF09\uFF1B\n//   \u8BB0\u53F7\uFF1A[1=G] \u8C03\u53F7\u3001[3/4] \u62CD\u53F7\u3001[T=90] \u901F\u5EA6\uFF1B\u6B4C\u8BCD\u91CC\u7684\u7A7A\u683C / \u659C\u6760\u4E0D\u8BB8\uFF08\u6B4C\u8BCD\u53EA\u8BA4\u5230\u4E0B\u4E00\u4E2A\u7A7A\u683C\uFF09\u3002\n//   \u5199\u4E0D\u51FA\u7684\u65F6\u503C\uFF08\u8FDE\u97F3 / \u5947\u602A\u7684 tick \u6570\uFF09\u5199\u6210 (tick)\uFF1A1(560)\u3002\nimport { type Dyn, type EditorState, type Token, type NoteTok, type Timed, type Repeat, type NavWhat, NAV_LABEL, tr, withTrack, headLen, keyAt, isMark, TPQ, allPitches, withPitches, materializeLead } from \"./song.ts\";\nimport { type Pitch, STEPS, type Step, stepIndex, diatonicIndex, tonicStepIndex, keyAlter, KEY_LABEL } from \"./pitch.ts\";\n\n/** \u9009\u4E2D\u7684\u90A3\u4E00\u6BB5\uFF08\u6CA1\u9009\u4E2D = null\uFF09\u3002\u539F\u6837\u5207\u7247\uFF0Cid \u539F\u6837\uFF08\u8D34\u7684\u65F6\u5019\u91CD\u7F16\uFF09\u3002 */\nexport function copyTokens(st: EditorState): Token[] | null {\n  if (!st.sel) return null;\n  return tr(st).slice(clipFrom(st), st.sel.to).map((t) => ({ ...t }));\n}\n/** \u9009\u533A\u771F\u6B63\u7684\u8D77\u70B9\uFF1A\u5F80\u524D\u5E26\u4E0A\u7D27\u6328\u7740\u7B2C\u4E00\u4E2A\u97F3\u3001\u6302\u5728\u5B83\u8EAB\u4E0A\u7684\u8BB0\u53F7\uFF08\u529B\u5EA6 / \u6E10\u5F3A\u6E10\u5F31 / \u98CE\u683C\u2014\u2014\u5B83\u4EEC\u8BB0\u5728\u97F3\u7684\u524D\u9762\uFF0Cv0.7.27 \u8D77\u300C\u843D\u5728\u5149\u6807\u524D\u90A3\u4E2A\u97F3\u300D\uFF09\u3002\n *  2026-10-08 \u6DF1\u591C Opus 5.5\uFF0Cuser\u300C\u590D\u5236\u4E00\u6BB5\u6B4C\u7684\u65F6\u5019\u7B2C\u4E00\u4E2A\u97F3\u5934\u4E0A\u7684\u529B\u5EA6\u7B26\u53F7\u6CA1\u88AB\u9009\u8FDB\u6765\u300D\u3002\u5C0F\u8282\u7EBF / \u53E5\u53F7 / \u8C03\u53F7\u62CD\u53F7\u901F\u5EA6\u4E0D\u5E26\u3002 */\nexport function clipFrom(st: EditorState): number {\n  const toks = tr(st), h = headLen(toks);\n  let a = st.sel!.from;\n  while (a > h && (toks[a - 1].kind === \"dyn\" || toks[a - 1].kind === \"hairpin\" || toks[a - 1].kind === \"groove\")) a--;\n  return a;\n}\n/** \u8D34\uFF1A\u6709\u9009\u4E2D = \u66FF\u6362\u9009\u4E2D\uFF1B\u6CA1\u6709 = \u63D2\u5728\u5149\u6807\u5904\u3002id \u4ECE nextId \u91CD\u7F16\uFF1B\u5149\u6807\u843D\u5728\u8D34\u7684\u672B\u5C3E\uFF1B\u672C\u6B21\u8F93\u5165\u8BB0\u5F55\u6E05\u7A7A\u3002 */\nexport function pasteTokens(st: EditorState, toks: Token[]): EditorState {\n  if (!toks.length) return st;\n  if (st.lead) st = materializeLead(st);   // \u5149\u6807\u5728\u540E\u9762\u8865\u9F50\u7684\u6DE1\u8272\u5C0F\u8282\u91CC\uFF1A\u5148\u628A\u524D\u9762\u7A7A\u7740\u7684\u843D\u6210\u4F11\u6B62\uFF0C\u8D34\u5728\u70B9\u7684\u90A3\u4E2A\u5C0F\u8282\uFF08v0.10.32\uFF1Buser\u300C\u590D\u5236\u7684\u65F6\u5019\u6CA1\u6709respect\u5F00\u59CB\u7684ghost\u5C0F\u8282\u6570\u300D\uFF09\n  const tokens = tr(st).slice();\n  let nextId = st.nextId;\n  const fresh = toks.filter((t) => !isMark(t) || true).map((t) => ({ ...t, id: nextId++ }));\n  const from = st.sel ? st.sel.from : st.caret, to = st.sel ? st.sel.to : st.caret;\n  const at = Math.max(headLen(tokens), from);\n  tokens.splice(at, Math.max(0, to - at), ...fresh);\n  return { ...st, song: withTrack(st.song, st.at.paper, st.at.part, tokens), sel: null, caret: at + fresh.length, nextId, log: [] };\n}\n/** \u526A\u5207 = \u590D\u5236 + \u5220\u6389\u9009\u4E2D\uFF08\u5149\u6807\u7559\u5728\u539F\u5904\uFF09\u3002 */\nexport function cutTokens(st: EditorState): { st: EditorState; toks: Token[] } | null {\n  const toks = copyTokens(st); if (!toks || !st.sel) return null;\n  const from = clipFrom(st), tokens = tr(st).slice(); tokens.splice(from, st.sel.to - from);   // \u526A\u5207\u540C\u590D\u5236\uFF1A\u7B2C\u4E00\u4E2A\u97F3\u8EAB\u4E0A\u7684\u8BB0\u53F7\u4E00\u8D77\u8D70\n  return { st: { ...st, song: withTrack(st.song, st.at.paper, st.at.part, tokens), sel: null, caret: from, log: [] }, toks };\n}\n/** \u5168\u9009 = \u8FD9\u6761 track \u8C31\u5934\u4E4B\u540E\u7684\u5168\u90E8\uFF08\u6587\u672C\u6846\u7684\u8303\u56F4\uFF1A\u8FD9\u5F20\u7EB8\u4E0A\u8FD9\u4E2A\u58F0\u90E8\uFF09\u3002 */\nexport function selectAll(st: EditorState): EditorState {\n  const tokens = tr(st), a = headLen(tokens), b = tokens.length;\n  if (b <= a) return st;\n  return { ...st, sel: { from: a, to: b }, caret: b, log: [] };\n}\n\n// \u2500\u2500 \u7B80\u8C31\u6587\u5B57 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u97F3 \u2192 \u76F8\u5BF9 fifths \u8FD9\u4E2A\u8C03\u7684\u7B80\u8C31\uFF1A\u97F3\u7EA7 1\u20137\u3001\u516B\u5EA6\u504F\u79FB\u3001\u76F8\u5BF9\u8C03\u5185\u97F3\u7684\u5347\u964D\u3002 */\nexport function toDegree(p: Pitch, fifths: number): { degree: number; shift: number; acc: number } {\n  const tonicD = 4 * 7 + tonicStepIndex(fifths), d = diatonicIndex(p) - tonicD;\n  return { degree: ((d % 7) + 7) % 7 + 1, shift: Math.floor(d / 7), acc: p.alter - keyAlter(p.step, fifths) };\n}\n/** \u7B80\u8C31 \u2192 \u97F3\uFF08\u76F8\u5BF9 fifths\uFF09\u3002 */\nexport function fromDegree(degree: number, shift: number, acc: number, fifths: number): Pitch {\n  const n = tonicStepIndex(fifths) + degree - 1, s = n % 7, step = STEPS[s] as Step;\n  return { step, alter: keyAlter(step, fifths) + acc, octave: 4 + Math.floor(n / 7) + shift };\n}\nconst DUR_SUFFIX: [number, string][] = [[TPQ * 4, \" - - -\"], [TPQ * 3, \" - -\"], [TPQ * 2, \" -\"], [TPQ * 1.5, \".\"], [TPQ, \"\"], [TPQ * 0.75, \"_.\"], [TPQ / 2, \"_\"], [TPQ / 4, \"__\"], [TPQ / 8, \"___\"]];\nfunction durText(dur: number): string {\n  const hit = DUR_SUFFIX.find(([d]) => d === dur);\n  return hit ? hit[1] : `(${dur})`;\n}\nconst accText = (a: number) => (a > 0 ? \"#\".repeat(a) : \"b\".repeat(-a));\nconst octText = (s: number) => (s > 0 ? \"'\".repeat(s) : \",\".repeat(-s));\n/** \u4E00\u6BB5 token \u2192 \u7B80\u8C31\u6587\u5B57\uFF08\u76F8\u5BF9 fifths\uFF09\u3002 */\nexport function toJianpu(toks: Token[], fifths: number): string {\n  const out: string[] = [];\n  let f = fifths;\n  for (const t of toks) {\n    if (t.kind === \"bar\") { out.push(t.repeat === \"start\" ? \"|:\" : t.repeat === \"end\" ? `:|${t.times && t.times > 2 ? `x${t.times}` : \"\"}` : t.repeat === \"both\" ? `:|:${t.times && t.times > 2 ? `x${t.times}` : \"\"}` : t.style === \"double\" ? \"||\" : t.style === \"final\" ? \"|]\" : \"|\"); continue; }   // \u53CD\u590D\u5C0F\u8282\u7EBF = |: / :| / :|x3 / :|:\uFF1B\u6BB5\u843D\u7EBF = ||\u3001\u7EC8\u6B62\u7EBF = |]\uFF08v0.9.32\uFF09\n    if (t.kind === \"nav\") { out.push(t.what === \"ending\" ? `[${(t.nums ?? [1]).join(\".\")}.]` : `[${NAV_TEXT[t.what]}]`); continue; }   // \u623F\u5B50 = [1.] / [1.2.]\uFF1B\u8DF3\u8F6C = [D.C.] [D.S. al Coda] [Segno]\u2026\n    if (t.kind === \"key\") { f = t.fifths; out.push(`[1=${KEY_LABEL[t.fifths] ?? t.fifths}]`); continue; }\n    if (t.kind === \"time\") { out.push(`[${t.beats}/${t.beatType}]`); continue; }\n    if (t.kind === \"tempo\") { out.push(`[T=${t.bpm}]`); continue; }\n    if (t.kind === \"clef\" || t.kind === \"ottava\") continue;   // \u8C31\u53F7 / \u516B\u5EA6\u7EBF\u53EA\u7BA1\u753B\uFF0C\u4E0D\u8FDB\u7B80\u8C31\u6587\u5B57\uFF08app \u5185\u526A\u8D34\u677F\u5E26\u7740\u539F token\uFF09\n    if (t.kind === \"phrase\") { out.push(\",\"); continue; }   // \u53E5 = \u5355\u72EC\u4E00\u4E2A\u9017\u53F7\uFF08\u6362\u6C14\uFF09\n    if (t.kind === \"dyn\") { out.push(`[${t.value}]`); continue; }   // \u529B\u5EA6 = [mf]\uFF08\u6F14\u594F\u6CD5\u4E0D\u8FDB\u7B80\u8C31\u6587\u5B57\uFF1Bapp \u5185\u526A\u8D34\u677F\u5E26\u7740\u539F token\uFF09\n    if (t.kind === \"hairpin\") { out.push(t.dir === \"cresc\" ? \"[<]\" : \"[>]\"); continue; }   // \u6E10\u5F3A / \u6E10\u5F31 = [<] / [>]\n    if (t.kind === \"groove\") { out.push(`[G=${t.style}${t.amount !== undefined && t.amount !== 1 ? `:${Math.round(t.amount * 100)}` : \"\"}${t.shift ? \"/2-3\" : \"\"}]`); continue; }   // /2-3 = \u9519\u5F00\u4E00\u5C0F\u8282   // \u98CE\u683C\uFF08\u62CD\u5B50\u8F7B\u91CD\uFF09= [G=pop] / [G=pop:150]\n    const suf = durText(t.dur), lead = suf.startsWith(\" -\") ? \"\" : suf, tail = suf.startsWith(\" -\") ? suf : \"\";\n    if (t.kind === \"rest\") { out.push(`0${lead}${tail}`); continue; }\n    const body = t.pitch ? allPitches(t).map((pp) => { const { degree, shift, acc } = toDegree(pp, f); return `${accText(acc)}${degree}${octText(shift)}`; }).join(\"&\") : \"x\";   // \u53E0\u97F3 = 1&3&5\uFF08\u4ECE\u9AD8\u5230\u4F4E\uFF09\n    const ly = t.lyric ? `/${t.lyric.replace(/\\s+/g, \"\")}${t.hyph ? \"-\" : \"\"}` : \"\";\n    out.push(`${t.tie ? \"^\" : \"\"}${body}${lead}${ly}${tail}`);\n  }\n  return out.join(\" \");\n}\n/** \u8DF3\u8F6C\u8BB0\u53F7\u7684\u7B80\u8C31\u6587\u5B57\uFF08\u4E00\u4E2A\u8BCD\u91CC\u4E0D\u80FD\u6709\u7A7A\u683C\uFF1AD.C._al_Fine\uFF09\u3002 */\nconst NAV_TEXT: Record<Exclude<NavWhat, \"ending\">, string> = Object.fromEntries(Object.entries(NAV_LABEL).map(([k, v]) => [k, v.replace(/ /g, \"_\")])) as Record<Exclude<NavWhat, \"ending\">, string>;\nconst NAV_BY_TEXT: Record<string, Exclude<NavWhat, \"ending\">> = Object.fromEntries(Object.entries(NAV_TEXT).map(([k, v]) => [v, k as Exclude<NavWhat, \"ending\">]));\nconst KEY_BY_LABEL: Record<string, number> = Object.fromEntries(Object.entries(KEY_LABEL).map(([k, v]) => [v.replace(\"\u266D\", \"b\").replace(\"\u266F\", \"#\"), Number(k)]));\n/** \u7B80\u8C31\u6587\u5B57 \u2192 token\uFF08\u76F8\u5BF9 fifths\uFF1B\u8BFB\u4E0D\u61C2\u7684\u8BCD = \u6574\u6BB5\u4E0D\u8BA4\uFF0C\u8FD4\u56DE null\u2014\u2014\u522B\u628A\u522B\u4EBA\u804A\u5929\u91CC\u7684\u8BDD\u5F53\u8C31\uFF09\u3002id \u4ECE 0 \u8D77\uFF08\u8D34\u7684\u65F6\u5019\u91CD\u7F16\uFF09\u3002 */\nexport function fromJianpu(text: string, fifths: number): Token[] | null {\n  const words = text.trim().split(/\\s+/).filter(Boolean);\n  if (!words.length) return null;\n  const out: Token[] = []; let f = fifths, id = 0, n = 0;\n  const lastTimed = (): Timed | null => { for (let i = out.length - 1; i >= 0; i--) { const t = out[i]; if (t.kind === \"note\" || t.kind === \"rest\") return t; } return null; };\n  for (const w of words) {\n    if (w === \"|\") { out.push({ kind: \"bar\", id: id++ }); continue; }\n    if (w === \"||\" || w === \"|]\") { out.push({ kind: \"bar\", id: id++, style: w === \"||\" ? \"double\" : \"final\" }); continue; }\n    let r = /^(\\|:|:\\|:|:\\|)(?:x(\\d+))?$/.exec(w);\n    if (r) { const rep: Repeat = r[1] === \"|:\" ? \"start\" : r[1] === \":|\" ? \"end\" : \"both\", tm = r[2] ? Number(r[2]) : 0; if (rep === \"start\" && tm) return null;\n      out.push({ kind: \"bar\", id: id++, repeat: rep, ...(tm > 2 ? { times: tm } : {}) }); continue; }\n    r = /^\\[((?:\\d+\\.)+)\\]$/.exec(w);\n    if (r) { out.push({ kind: \"nav\", id: id++, what: \"ending\", nums: r[1].split(\".\").filter(Boolean).map(Number) }); continue; }\n    const nav = /^\\[(.+)\\]$/.exec(w)?.[1], navWhat = nav ? NAV_BY_TEXT[nav] : undefined;\n    if (navWhat) { out.push({ kind: \"nav\", id: id++, what: navWhat }); continue; }\n    if (w === \"-\") { const t = lastTimed(); if (!t) return null; t.dur += TPQ; continue; }\n    if (w === \",\") { out.push({ kind: \"phrase\", id: id++ }); continue; }\n    let m = /^\\[1=([A-G][b#]?)\\]$/.exec(w);\n    if (m) { const k = KEY_BY_LABEL[m[1]]; if (k === undefined) return null; f = k; out.push({ kind: \"key\", id: id++, fifths: k }); continue; }\n    m = /^\\[(\\d+)\\/(\\d+)\\]$/.exec(w);\n    if (m) { out.push({ kind: \"time\", id: id++, beats: Number(m[1]), beatType: Number(m[2]) }); continue; }\n    m = /^\\[T=(\\d+)\\]$/.exec(w);\n    if (m) { out.push({ kind: \"tempo\", id: id++, bpm: Number(m[1]) }); continue; }\n    m = /^\\[(ppp|pp|p|mp|mf|f|ff|fff)\\]$/.exec(w);\n    if (m) { out.push({ kind: \"dyn\", id: id++, value: m[1] as Dyn }); continue; }\n    if (w === \"[<]\" || w === \"[>]\") { out.push({ kind: \"hairpin\", id: id++, dir: w === \"[<]\" ? \"cresc\" : \"dim\" }); continue; }\n    m = /^\\[G=([a-z][a-z0-9-]*)(?::(\\d+))?(\\/2-3)?\\]$/.exec(w);\n    if (m) { const a = m[2] ? Number(m[2]) / 100 : 1; out.push({ kind: \"groove\", id: id++, style: m[1], ...(a !== 1 ? { amount: a } : {}), ...(m[3] ? { shift: true as const } : {}) }); continue; }\n    m = /^(\\^?)((?:[#b]*[0-7x]['\u2019,]*)(?:&[#b]*[1-7]['\u2019,]*)*)(_{0,3})(\\.?)(?:\\((\\d+)\\))?(?:\\/([^/\\s]+?)(-?))?$/.exec(w);\n    if (!m) return null;\n    const [, tie, body, unders, dot, ticks, lyric, hyph] = m;\n    let dur = ticks ? Number(ticks) : TPQ / 2 ** unders.length;\n    if (dot && !ticks) dur *= 1.5;\n    if (body === \"0\") { out.push({ kind: \"rest\", id: id++, dur }); n++; continue; }\n    const heads = body.split(\"&\").map((h) => { const hm = /^([#b]*)([0-7x])(['\u2019,]*)$/.exec(h)!; const acc = hm[1] ? (hm[1][0] === \"#\" ? hm[1].length : -hm[1].length) : 0; const shift = [...hm[3]].reduce((a, c) => a + (c === \",\" ? -1 : 1), 0); return hm[2] === \"x\" ? null : fromDegree(Number(hm[2]), shift, acc, f); });\n    const t0: NoteTok = { kind: \"note\", id: id++, pitch: null, dur, lyric: lyric ?? null };\n    const t = heads[0] ? withPitches(t0, heads.filter((h): h is NonNullable<typeof h> => !!h)) : t0;\n    if (hyph) t.hyph = true; if (tie) t.tie = true;\n    out.push(t); n++;\n  }\n  return n ? out : null;\n}\n/** \u9009\u533A\u5F00\u5934 / \u5149\u6807\u5904\u751F\u6548\u7684\u8C03\uFF08\u7B80\u8C31\u6587\u5B57\u76F8\u5BF9\u5B83\u5199 / \u8BFB\uFF09\u3002 */\nexport const fifthsAtSel = (st: EditorState): number => keyAt(tr(st), st.sel ? st.sel.from : Math.max(0, st.caret - 1));\nexport { stepIndex };\n", "// document.ts \u2014\u2014 \u6587\u6863 = \u4E00\u9996\u6B4C\u5728\u5185\u5B58\u91CC\u7684\u771F\u76F8\uFF08\u8C31\u7684\u72B6\u6001 st + \u6587\u4EF6\u91CC\u7684\u5176\u4F59\u90E8\u5206 extras\uFF09+ **\u6539\u5B83\u7684\u552F\u4E00\u5165\u53E3**\uFF08commit\uFF09+ \u64A4\u9500\u6808 + \u300C\u6539\u8FC7\u6CA1\u5B58\u300D\u57FA\u7EBF + \u5B9A\u7A3F\u7684\u9501\u3002\n//   created 2026-10-16 by Claude Fable 5.1\uFF08\u8FDC\u666F `ai-docs/20261013-vision-epochs-and-refactor.md` \u00A73 \u2461\u2463\u300C\u7F16\u8F91\u6A21\u578B / \u5168\u6307\u4EE4\u5F0F\u552F\u4E00\u5165\u53E3\u300D\u7B2C\u4E00\u5200\uFF1B\n//   user 2026-10-16\u300C\u8FD9\u4E2A\u505A\u5B8C\u4E4B\u540E\u5F00\u59CB\u5207doc\u8FD9\u4E00\u5200\u300D\u300C\u8FDC\u666F \u00A73 \u2461\u2463\u2026\u505A\u300D\uFF1B\u7B56\u5212 = `ai-docs/20261016-document-single-entry.md`\uFF09\u3002\n//   \u4EE5\u524D\uFF08v0.12.19 \u53CA\u4E4B\u524D\uFF09main.ts \u91CC\u6539\u72B6\u6001\u7684\u53E3\u5B50\u6709\u4E94\u4E2A\uFF08update / updateExtras / updateBoth / restore / loadDoc\uFF09+ \u4E09\u5904\u76F4\u63A5\u5199 `doc.extras =`\uFF0C\u5B9A\u7A3F\u7684\u9501\u5F97\u5728\u56DB\u5904\u5404\u8865\u4E00\u5200\uFF1B\n//   \u73B0\u5728**\u5168\u90E8\u7ECF commit()**\uFF1A\u9501\u4E00\u5904\u5224\u3001undo \u4E00\u5904\u8BB0\u3001\u810F\u4E00\u5904\u7B97\uFF1B\u754C\u9762\u7684\u526F\u4F5C\u7528\uFF08\u91CD\u753B / \u63A8\u8FDB\u5F55\u97F3\u623F / \u6E05\u5355 / \u6807\u9898\uFF09\u7531\u5BBF\u4E3B\u7528 hooks \u63A5\uFF0C\u8FD9\u91CC\u4E0D\u78B0 DOM\u3001\u4E0D\u78B0\u6301\u4E45\u5316\uFF08node \u80FD\u8DD1\uFF09\u3002\n//   \u6307\u4EE4\u5F0F\uFF1Arun(Command) = apply(st, c) \u2192 commit\uFF08`src/score/commands.ts` \u7684\u90A3\u4E9B\u952E\u76D8\u547D\u4EE4\uFF09\uFF1B\u522B\u7684\u6539\u52A8\uFF08\u7EAF\u51FD\u6570\u7B97\u51FA next \u518D commit\uFF09\u4EE5\u540E\u9010\u4E2A\u6536\u7F16\u6210 Command\uFF0C\u5165\u53E3\u4E0D\u7528\u518D\u52A8\u3002\nimport { type EditorState, type Song } from \"../score/song.ts\";\nimport { apply, type Command } from \"../score/commands.ts\";\nimport { emptyHistory, record, undo as undoH, redo as redoH, describeSongChange, type History, type Locus, type Restored } from \"../score/history.ts\";\nimport { isFinal, type Extras, type FinalRecord } from \"../format/project.ts\";\n\n/** \u5BBF\u4E3B\u63A5\u7684\u526F\u4F5C\u7528\uFF08\u5168\u662F\u300C\u4E4B\u540E\u300D\uFF1B\u8FD9\u91CC\u5148\u628A\u771F\u76F8\u6362\u597D\u518D\u53EB\uFF09\u3002 */\nexport interface DocHooks {\n  now(): number;\n  /** \u8C31\u53D8\u4E86\u4E4B\u540E\uFF08commit \u6362\u4E86 st\uFF09\uFF1Amoved = \u5149\u6807\u6362\u4E86\u7EB8 / \u58F0\u90E8\u3002 */\n  onState(prev: EditorState, next: EditorState, moved: boolean): void;\n  /** extras \u53D8\u4E86\u4E4B\u540E\uFF08\u4F11\u606F\u5BA4 / \u5F55\u97F3\u623F / \u5C01\u9762 / \u5B9A\u7A3F\uFF09\u3002 */\n  onExtras(prev: Extras, next: Extras, locus: Locus): void;\n  /** \u88AB\u9501\u62D2\u4E86\uFF08\u5B9A\u7A3F\u7740\uFF09\uFF1Awhat = \u6539\u7684\u662F\u4EC0\u4E48\uFF08\u4EBA\u8BDD\uFF09\u3002 */\n  onRefused(what: string): void;\n  /** \u64A4\u9500 / \u91CD\u505A\u843D\u5730\u4E4B\u540E\uFF08st / extras \u5DF2\u6362\u3001\u6808\u5DF2\u6362\uFF09\uFF1A\u5BBF\u4E3B\u8BA9\u89C6\u56FE\u8DDF\u8FC7\u53BB\u3001\u8BF4\u4E00\u53E5\u3002 */\n  onRestored(r: Restored, verb: \"\u64A4\u9500\" | \"\u91CD\u505A\", prev: { st: EditorState; extras: Extras }): void;\n  /** commit \u4E4B\u524D\u5BF9 song \u53D8\u4E86\u7684 next \u505A\u89C4\u6574\uFF08\u7EB8\u5934\u8865\u529B\u5EA6\u90A3\u7C7B\uFF1B\u540C\u4E00\u6B65\u3001\u80FD\u4E00\u8D77\u64A4\u9500\uFF09\u3002 */\n  normalize?(next: EditorState): EditorState;\n  /** \u6587\u4EF6\u4E4B\u5916\u3001\u4F46\u4E5F\u7B97\u300C\u6539\u8FC7\u6CA1\u5B58\u300D\u7684\u4E1C\u897F\u7684\u7248\u672C\u53F7\uFF08\u53C2\u8003\u7A97\u7684\u5361\uFF09\u3002 */\n  extraDirty?(): number;\n}\nexport interface CommitOpts {\n  /** \u8FD9\u4E00\u6B65\u6539\u4E86\u4EC0\u4E48\uFF08\u4EBA\u8BDD\uFF1Bundo \u65F6 toast\uFF09\u3002\u4E0D\u7ED9 = \u6309\u8C31\u7684\u53D8\u5316\u63A8\uFF08describeSongChange\uFF09\u3002 */\n  locus?: Locus;\n  /** \u8FDE\u7EED\u52A8\u4F5C\u5E76\u6210\u4E00\u6B65\uFF08\u62D6 / \u8FDE\u6253 / \u63A8\u5B50\uFF09\u3002 */\n  gesture?: string;\n  /** false = \u4E0D\u8FDB\u64A4\u9500\u6808\uFF08\u5B9A\u7A3F / \u6539\u7A3F / \u5F00\u6B4C\u65F6\u7684\u89C4\u6574\uFF09\u3002 */\n  undo?: boolean;\n  /** true = \u4E0D\u53EB\u5BBF\u4E3B\u7684 hooks\uFF08\u53EA\u6362\u771F\u76F8\uFF1B\u5F00\u6B4C\u88C5\u89C6\u56FE\u6001\u7528\uFF09\u3002 */\n  silent?: boolean;\n}\nexport type CommitResult = { ok: true; changed: boolean } | { ok: false; why: string };\n/** \u300C\u4E0A\u6B21\u5B58 / \u6253\u5F00\u65F6\u7684\u6837\u5B50\u300D\uFF1A\u5224\u810F\u7528\uFF08\u5F15\u7528\u6BD4\u8F83 + \u4F11\u606F\u5BA4 / \u5F55\u97F3\u623F\u7684 JSON\uFF09\u3002 */\nexport interface SavedMark { song: Song; thumbnail: Uint8Array | null; key: string; refs: number }\n\nexport interface Document {\n  readonly st: EditorState;\n  readonly extras: Extras;\n  readonly history: History;\n  /** \u5B9A\u7A3F\u8BB0\u5F55\uFF08\u6CA1\u5B9A\u7A3F = null\uFF09\uFF1B\u9501 = \u5B83\u5728\u3002 */\n  readonly final: FinalRecord | null;\n  /** \u73B0\u5728\u4E3A\u4EC0\u4E48\u4E0D\u80FD\u6539\uFF08\u5B9A\u7A3F\u7740\uFF09\uFF1Bnull = \u80FD\u3002 */\n  locked(): string | null;\n  /** **\u552F\u4E00\u5165\u53E3**\uFF1A\u6362\u8C31 / \u6362 extras / \u4E24\u4E2A\u4E00\u8D77\u3002\u62D2\u4E86\uFF08\u5B9A\u7A3F\u7740\uFF09= ok:false + onRefused\uFF1B\u6CA1\u53D8 = changed:false\u3002 */\n  commit(next: { st?: EditorState; extras?: Extras }, o?: CommitOpts): CommitResult;\n  /** \u6307\u4EE4\u5F0F\uFF1A\u4E00\u6761\u952E\u76D8\u547D\u4EE4\uFF08src/score/commands.ts\uFF09\u2192 commit\u3002 */\n  run(c: Command, o?: CommitOpts): CommitResult;\n  undo(): boolean;\n  redo(): boolean;\n  /** \u6362\u6B4C\uFF1A\u771F\u76F8\u6574\u4E2A\u6362\u6389\u3001\u6808\u6E05\u7A7A\u3001\u810F\u7684\u57FA\u7EBF = \u73B0\u5728\uFF08\u4E0D\u53EB onState / onExtras\uFF1A\u5BBF\u4E3B\u81EA\u5DF1\u6309\u5F00\u6B4C\u7684\u987A\u5E8F\u91CD\u753B\uFF09\u3002 */\n  load(st: EditorState, extras: Extras): void;\n  /** \u6539\u8FC7\u6CA1\u5B58\uFF1F */\n  dirty(): boolean;\n  /** \u73B0\u5728\u8FD9\u4E00\u523B\u7684\u300C\u5DF2\u5B58\u300D\u57FA\u7EBF\uFF08encode \u90A3\u4E00\u523B\u8BB0\u4E0B\u6765\uFF0C\u843D\u76D8\u6210\u529F\u518D adoptSaved\uFF09\u3002 */\n  savedMark(): SavedMark;\n  adoptSaved(m: SavedMark): void;\n  /** \u521A\u5B58\u597D = \u57FA\u7EBF\u6362\u6210\u73B0\u5728\u3002 */\n  markSaved(): void;\n}\n\nconst LOCK_WHAT: Record<string, string> = { score: \"\u8C31 / \u6B4C\u540D / \u4F5C\u8005\u680F\", paper: \"\u7EB8\", lounge: \"\u6B4C\u624B / \u4E50\u5668\", studio: \"\u6DF7\u97F3\", cover: \"\u5C01\u9762\" };\n/** \u4F11\u606F\u5BA4 + \u5F55\u97F3\u623F + \u5B9A\u7A3F\u7684 JSON \u952E\uFF08\u810F\u6BD4\u8F83\u7528\uFF1B\u5B57\u8282\u5728 extras.sounds \u4E0D\u5728\u8FD9\u91CC\uFF0C\u6BCF\u79D2\u4E00\u6B21 stringify \u65E0\u6240\u8C13\uFF09\u3002 */\nconst extrasKey = (e: Extras): string => JSON.stringify([e.final?.at ?? null, Object.entries(e.lounge).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)), e.studio ?? null]);\n\nexport function createDocument(init: { st: EditorState; extras: Extras }, hooks: DocHooks): Document {\n  let st = init.st, extras = init.extras, history = emptyHistory();\n  const mark = (): SavedMark => ({ song: st.song, thumbnail: extras.thumbnail, key: extrasKey(extras), refs: hooks.extraDirty?.() ?? 0 });\n  let saved: SavedMark = { song: st.song, thumbnail: extras.thumbnail, key: extrasKey(extras), refs: 0 };   // \u51FA\u751F\u90A3\u4E00\u523B\u4E0D\u95EE extraDirty\uFF08\u5BBF\u4E3B\u7684\u53C2\u8003\u7A97\u53EF\u80FD\u8FD8\u6CA1\u5EFA\uFF09\n  const locked = (): string | null => (isFinal(extras) ? `\u5B9A\u7A3F\u4E86\uFF08\u7B2C ${extras.final!.rev} \u7248\uFF09` : null);\n  function commit(next: { st?: EditorState; extras?: Extras }, o: CommitOpts = {}): CommitResult {\n    const nextSt0 = next.st ?? st, nextEx = next.extras ?? extras;\n    const songChanged = nextSt0.song !== st.song, exChanged = nextEx !== extras, stChanged = nextSt0 !== st;\n    if (!stChanged && !exChanged) return { ok: true, changed: false };\n    // \u7B2C \u2461 \u5C42\u62A4\u680F\uFF08\u5B9A\u7A3F\uFF09\uFF1A\u6B4C / \u4F11\u606F\u5BA4 / \u5F55\u97F3\u623F / \u5C01\u9762\u90FD\u4E0D\u52A8\uFF1B\u5149\u6807 / \u9009\u533A / \u8F93\u5165\u6001\u7167\u5E38\uFF1B\u5B9A\u7A3F / \u6539\u7A3F\u81EA\u5DF1\uFF08locus final\uFF09\u653E\u884C\n    if (locked() && (songChanged || exChanged) && o.locus?.kind !== \"final\") {\n      const what = o.locus ? LOCK_WHAT[o.locus.kind] ?? o.locus.label : LOCK_WHAT.score;\n      hooks.onRefused(what);\n      return { ok: false, why: `${locked()}\uFF1A${what}\u6539\u4E0D\u4E86` };\n    }\n    const asked = nextSt0;   // \u64A4\u9500\u63D0\u793A\u6309\u4F60\u505A\u7684\u90A3\u4E00\u4E0B\u8BF4\uFF08\u89C4\u6574\u8865\u7684\u4E0D\u7B97\u300C\u5199\u4E86\u51E0\u4E2A\u300D\uFF09\n    const nextSt = songChanged && hooks.normalize ? hooks.normalize(nextSt0) : nextSt0;\n    if (o.undo !== false && (songChanged || exChanged)) {\n      const locus = o.locus ?? describeSongChange(st, asked.song !== st.song ? asked : nextSt);\n      history = record(history, st, extras, o.gesture ?? null, hooks.now(), locus);\n    }\n    const prevSt = st, prevEx = extras;\n    st = nextSt; extras = nextEx;\n    if (!o.silent) {\n      if (exChanged) hooks.onExtras(prevEx, nextEx, o.locus ?? { kind: \"lounge\", label: \"\" });\n      if (nextSt !== prevSt) hooks.onState(prevSt, nextSt, nextSt.at.paper !== prevSt.at.paper || nextSt.at.part !== prevSt.at.part);\n    }\n    return { ok: true, changed: true };\n  }\n  function restore(r: Restored | null, verb: \"\u64A4\u9500\" | \"\u91CD\u505A\"): boolean {\n    if (!r) return false;\n    const prev = { st, extras };\n    history = r.h; st = r.st; extras = r.extras;\n    hooks.onRestored(r, verb, prev);\n    return true;\n  }\n  return {\n    get st() { return st; }, get extras() { return extras; }, get history() { return history; }, get final() { return extras.final; },\n    locked, commit,\n    run: (c, o) => commit({ st: apply(st, c, hooks.now()) }, o),\n    undo: () => { if (locked()) { hooks.onRefused(\"\u64A4\u9500\"); return false; } return restore(undoH(history, st, extras), \"\u64A4\u9500\"); },\n    redo: () => { if (locked()) { hooks.onRefused(\"\u91CD\u505A\"); return false; } return restore(redoH(history, st, extras), \"\u91CD\u505A\"); },\n    load: (s, e) => { st = s; extras = e; history = emptyHistory(); saved = mark(); },\n    dirty: () => st.song !== saved.song || extras.thumbnail !== saved.thumbnail || extrasKey(extras) !== saved.key || (hooks.extraDirty?.() ?? 0) !== saved.refs,\n    savedMark: mark, adoptSaved: (m) => { saved = m; }, markSaved: () => { saved = mark(); },\n  };\n}\n", "// home.ts \u2014\u2014 \u8FD9\u9996\u6B4C\u7684\u5BB6\uFF1A\u4E09\u79CD\u5BB6\u4E92\u65A5 + \u5B58 / \u6539\u540D / \u79BB\u5F00 / \u5B89\u5BB6\u7684**\u552F\u4E00\u5165\u53E3**\uFF08F-49\u300C\u5BB6\u300D\u6536\u6210 Home \u63A5\u53E3\uFF09\u3002\n//   created 2026-10-21 by Claude Fable 5.1\uFF08doc \u8FD9\u4E00\u5200 ai-docs/20261016-document-single-entry.md \u00A75 \u7559\u7684\u4E0B\u4E00\u5200\uFF1B\u5BB6\u65CF\u5468\u8D26 F-49\uFF0Cuser 10-17\u300C\u5BB6\uFF1A\u8FD9\u4E2A\u7B97\u672C\u5468\u7684\u6B20\u503A\uFF0C\u8BB0\u8D26\uFF0C\u4E0B\u5468fable\u5F04\u300D\uFF1B\n//   \u7B56\u5212 + \u73B0\u72B6 / \u63D0\u6848 .h = ai-docs/20261021-home-interface.md\uFF09\u3002\n//   \u4EE5\u524D\uFF08v0.13.9 \u53CA\u4E4B\u524D\uFF09main.ts \u91CC\u662F\u4E00\u4E2A\u53E3\u888B\u5BF9\u8C61 doc = { stem, named, handle, mtime, identifier, pendingHome }\uFF0C\u4E09\u79CD\u5BB6\u7684 if \u94FE\u6563\u5728 fileSave / smartSave / homeNow /\n//   leaveCurrent / openStoreDoc / newStoreSong / saveIntoGallery / renameActive / afterGalleryClosed / openGallery / signOutFlow \u2026 \u5341\u51E0\u5904\u5404\u5199\u5404\u7684\uFF0C\u6F0F\u4E00\u5904\u5C31\u662F\u4E00\u79CD\u5BB6\u8D70\u9519\u8DEF\u3002\n//   \u73B0\u5728\uFF1A\u5BB6 = \u4E00\u4E2A\u5224\u522B\u8054\u5408\uFF08\u6D88\u8D39\u70B9 switch + assertNever\uFF0C\u52A0\u7B2C\u56DB\u79CD\u5BB6\u65F6 tsc \u9010\u70B9\u62A5\u9519\uFF09\uFF1B\u6539\u5BB6\u53EA\u6709\u8FD9\u91CC\u7684\u52A8\u8BCD\uFF1B\n//   \u300C\u79BB\u5F00\u6B4C\u5E93\u90A3\u6761\u8DEF = \u653E\u4E0B editor-session \u7684\u8EAB\u4EFD\u300D\u5728\u6362\u5BB6\u90A3\u4E00\u5904\u5B88\uFF08\u4EE5\u524D\u4ECE\u6B4C\u5E93\u91CC\u7684\u6B4C\u76F4\u63A5\u5F00\u672C\u673A\u6587\u4EF6\u4E0D\u653E\uFF0Ces \u8FD8\u4E3E\u7740\u65E7\u8EAB\u4EFD\u2014\u2014\u63A8\u8981\u662F\u6CA1\u63A8\u4E0A\uFF0C\u4E0B\u4E00\u6B21 pagehide \u4F1A\u628A\u672C\u673A\u6587\u4EF6\u7684\u5B57\u8282\u5199\u8FDB\u4E0A\u4E00\u9996\uFF09\u3002\n//   \u7EAF\u6A21\u5757\uFF1A\u4E0D\u78B0 DOM\u3001\u4E0D\u78B0\u6301\u4E45\u5316\u3001\u4E0D import store / editor-session\uFF08\u5168\u7ECF ports \u6CE8\u5165\uFF1Bnode \u80FD\u8DD1\uFF0Ctest/home.test.ts \u9489 \u5BB6 \u00D7 \u52A8\u8BCD \u7684\u77E9\u9635\uFF09\u3002\n//   \u540C\u5F62\uFF1AWeebPaint src/doc-home.ts\uFF08gallery / file / transient + \u6301\u6743\u52A8\u8BCD\uFF09\u3002\u5BB6\u65CF\u8BED\u4E49\uFF1A\u4FDD\u5B58 = \u56DE\u5BB6\uFF08\u4E00\u4E2A\u52A8\u4F5C\uFF09\u3001\u5BFC\u51FA = \u5BC4\u660E\u4FE1\u7247\uFF08\u6C38\u4E0D\u6E05 dirty\uFF0C\u4E0D\u7ECF\u8FD9\u91CC\uFF09\u3002\nimport type { FileHandle } from \"./doc-file.ts\";\nimport { fileSafe } from \"./names.ts\";\n\n/** \u4E00\u9996\u6B4C\u4EFB\u4E00\u65F6\u523B\u6070\u597D\u6709\u4E00\u4E2A\u5BB6\u3002 */\nexport type Home =\n  | { kind: \"gallery\"; identifier: string }                      // \u6B4C\u5E93\u91CC\u7684\u4E00\u9996\uFF1Astore \u8EAB\u4EFD\uFF08`\u5939/\u4E3B\u5E72.mxl`\uFF09\uFF1B\u81EA\u52A8\u5B58 + consent \u5236\u63A8\u4E91\uFF08editor-session \u627F\u91CD\uFF09\n  | { kind: \"file\"; handle: FileHandle; mtime: number | null }   // \u672C\u673A\u6587\u4EF6\uFF08\u684C\u9762 Chromium \u7684\u53E5\u67C4\uFF09\uFF1A\u300C\u5B58\u300D= \u5199\u56DE\u53BB\uFF1Bmtime = \u6253\u5F00 / \u4E0A\u6B21\u5199\u56DE\u65F6\u5B83\u7684 lastModified\uFF08\u5199\u524D\u5BF9\u8868\uFF09\n  | { kind: \"none\"; pendingFolder: string | null };              // \u8FD8\u6CA1\u5BB6\u3002pendingFolder \u2260 null = \u6B4C\u5E93\u91CC\u300C\u65B0\u5EFA\u300D\u51FA\u6765\u7684\u7A7A\u8C31\uFF08\u9996\u7B14\u5B89\u5BB6\uFF1A\u7B2C\u4E00\u7B14\u7F16\u8F91\u624D\u94F8\u8EAB\u4EFD\u8FDB\u8FD9\u4E2A\u5939\uFF09\n\n/** \u6D88\u8D39\u70B9 exhaustive \u5B88\u536B\uFF1Aswitch \u843D\u5230\u8FD9\u513F = \u8054\u5408\u7C7B\u578B\u52A0\u4E86\u65B0\u6210\u5458\u800C\u8FD9\u4E2A\u6D88\u8D39\u70B9\u6CA1\u8DDF\u4E0A\u3002 */\nexport function assertNever(x: never): never { throw new Error(\"[home] non-exhaustive switch: \" + JSON.stringify(x)); }\n\nexport type RenameResult = { ok: true; oldKept?: boolean } | { ok: false; where: \"cloud\" | \"local\" };\n\n/** \u5BBF\u4E3B\u6CE8\u5165\u7684\u56DB\u6761\u8DEF\uFF1A\u6B4C\u5E93\uFF08editor-session + store\uFF09/ \u672C\u673A\u6587\u4EF6\uFF08doc-file\uFF09/ \u8EAB\u4EFD\u62FC\u6CD5 / \u95EE\u4EBA\u4E0E\u526F\u4F5C\u7528\u3002\u8FD9\u91CC\u96F6 DOM\u3001\u96F6\u6301\u4E45\u5316\u3002 */\nexport interface HomePorts {\n  gallery: {\n    /** \u300C\u5B58\u300D\u5728\u6B4C\u5E93\u91CC = \u5BBF\u4E3B\u7684 smart save\uFF08forceSaveAndPush + \u767B\u5F55\u63D0\u793A + \u56DE\u8BDD\u90FD\u5F52\u5BBF\u4E3B\uFF09\u3002 */\n    save(): Promise<void>;\n    flushLocal(): Promise<void>;\n    flushAndPush(): Promise<void>;\n    markDirty(): void;\n    adopted(id: string, o: { create: true }): void;\n    release(): void;\n    rename(to: string): Promise<RenameResult>;\n    occupied(id: string): Promise<boolean>;\n  };\n  file: {\n    canPickSave(): boolean;\n    pickSave(suggestedName: string): Promise<FileHandle | null>;\n    writeTo(h: FileHandle, bytes: Uint8Array): Promise<void>;\n    mtime(h: FileHandle): Promise<number | null>;\n    isStale(seen: number | null, now: number | null): boolean;\n  };\n  ids: { join(folder: string, stem: string): string; parse(id: string): { folder: string; stem: string } | null };\n  /** \u6587\u4EF6\u540D\u540E\u7F00\uFF08.mxl\uFF09\uFF1A\u7ED9\u4EBA\u770B\u7684\u540D\u5B57\u7528\u3002 */\n  suffix: string;\n  /** \u8FD9\u9996\u6B4C\u73B0\u5728\u7684 .mxl \u5B57\u8282\u3002 */\n  bytes(): Uint8Array;\n  /** \u6539\u8FC7\u6CA1\u5B58\uFF1F\uFF08\u6587\u6863\u7684\u810F = D.dirty()\uFF09 */\n  dirty(): boolean;\n  /** \u7EB8\u4E0A\u7684\u6B4C\u540D\uFF08\u53EF\u7A7A\uFF1B\u6CA1\u5B58\u8FC7\u65F6\u6587\u4EF6\u540D\u8DDF\u7740\u5B83\uFF09\u3002 */\n  title(): string;\n  /** \u65B0\u7684\u9ED8\u8BA4\u540D `yyyymmdd-hex4`\uFF08\u649E\u540D\u65F6\u62FF\u5B83\u7684 hex4\uFF09\u3002 */\n  freshStem(): string;\n  ask: {\n    /** \u300C\u6539\u8FC7\u8FD8\u6CA1\u5B58\uFF0C<what>\u4F1A\u4E22\u6389\u300D\uFF1Atrue = \u4E22\u6389\u7EE7\u7EED\uFF08\u5BBF\u4E3B\u7684\u9762\u677F\u81EA\u5E26\u300C\u5148\u5B58\u300D\uFF0C\u90A3\u6761\u8DEF\u7531\u5BBF\u4E3B\u81EA\u5DF1\u8D70\uFF09\u3002 */\n    discard(what: string): Promise<boolean>;\n    /** \u672C\u673A\u6587\u4EF6\u5728\u5916\u9762\u88AB\u6539\u8FC7\uFF1Atrue = \u7167\u6837\u8986\u76D6\u3002 */\n    overwriteStale(fileName: string): Promise<boolean>;\n  };\n  /** \u6CA1\u6709\u53E5\u67C4\u8FD9\u56DE\u4E8B\u7684\u8BBE\u5907\uFF08iPad / Safari\uFF09\uFF1A\u9012\u51FA\u4E0B\u8F7D / \u5206\u4EAB\u9762\u677F\uFF1B\u70B9\u4E86\u624D\u7B97\u5B58\u4E86\uFF08onSaved\uFF09\u3002 */\n  offerDownload(bytes: Uint8Array, name: string, onSaved: () => void): void;\n  /** \u843D\u76D8\u6210\u529F = \u57FA\u7EBF\u6362\u6210\u73B0\u5728\uFF08D.markSaved\uFF09\u3002 */\n  markSaved(): void;\n  /** \u79BB\u5F00\u65F6\u63A8\u4E0D\u4E0A / \u5B89\u5BB6\u843D\u76D8\u5931\u8D25\uFF1A\u62A5\u51FA\u53BB\uFF08\u4E0D\u541E\uFF09\u3002 */\n  report(e: unknown, level: \"warning\" | \"error\"): void;\n  /** \u5BB6\u6362\u4E86\uFF08\u5BBF\u4E3B\uFF1A\u544A\u8BC9 store \u8C01\u5F00\u7740\u3001\u4E0A\u6B21\u5F00\u7740\u54EA\u9996\u7684\u6307\u9488\u3001\u91CD\u753B\u9876\u680F\uFF09\u3002 */\n  onHome(prev: Home, next: Home): void;\n  /** \u6587\u4EF6\u540D\u6362\u4E86\uFF08\u5BBF\u4E3B\uFF1A\u91CD\u753B\u9876\u680F\uFF09\u3002 */\n  onName(): void;\n}\n\nexport type SaveOutcome =\n  | { k: \"blank\" }                       // \u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31\uFF1A\u6CA1\u4EC0\u4E48\u53EF\u5B58\uFF08\u5BBF\u4E3B\u8BDA\u5B9E\u56DE\u8BDD\uFF0C\u4E0D\u585E\u7A7A\u58F3\uFF09\n  | { k: \"gallery\" }                     // \u8D70\u4E86\u6B4C\u5E93\u90A3\u6761\uFF08gallery.save \u81EA\u5DF1\u8BF4\u8BDD\uFF09\n  | { k: \"written\"; name: string }       // \u5199\u56DE / \u5B89\u5BB6\u6210\u4E86\n  | { k: \"declined\" }                    // \u6587\u4EF6\u5728\u5916\u9762\u88AB\u6539\u8FC7\u3001\u4EBA\u6CA1\u8BA9\u8986\u76D6\n  | { k: \"cancelled\" }                   // \u4FDD\u5B58\u6846\u53D6\u6D88\u4E86\uFF08AbortError \u2260 \u73AF\u5883\u4E0D\u652F\u6301\uFF0C\u4E0D\u964D\u7EA7\u5F39\u4E0B\u8F7D\uFF09\n  | { k: \"offered\"; name: string };      // \u9012\u51FA\u4E86\u4E0B\u8F7D / \u5206\u4EAB\u9762\u677F\uFF08\u70B9\u4E86\u624D\u7B97\u5B58\u4E86\uFF09\nexport type RenameOutcome =\n  | { k: \"renamed\"; stem: string; oldKept: boolean }\n  | { k: \"same\" }                        // \u7A7A\u540D / \u6CA1\u53D8\n  | { k: \"fileHome\"; name: string }      // \u672C\u673A\u6587\u4EF6\u7684\u540D\u5B57\u6D4F\u89C8\u5668\u6539\u4E0D\u4E86\uFF0C\u5728\u6587\u4EF6\u7BA1\u7406\u5668\u91CC\u6539\n  | { k: \"taken\"; where: \"cloud\" | \"local\" };\nexport type IntoGalleryOutcome =\n  | { k: \"blank\" }                       // \u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31\u8FD8\u6CA1\u6709\u7B14\n  | { k: \"settled\"; identifier: string } // \u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31\u6709\u7B14\u4E86 = \u5B89\u5BB6\n  | { k: \"moved\"; identifier: string; flushed: boolean };   // \u65E0\u5730\u7A3F / \u672C\u673A\u6587\u4EF6\u7684\u7A3F\u653E\u8FDB\u4E86\u6B4C\u5E93\uFF1Bflushed=false = \u843D\u76D8\u62A5\u4E86\u9519\u3001\u8EAB\u4EFD\u7559\u7740\u7B49\u4E0B\u4E00\u8F6E\u81EA\u52A8\u5B58\n\nexport interface HomeKeeper {\n  readonly home: Home;\n  /** \u6587\u4EF6\u540D\u4E3B\u5E72\uFF08\u6B4C\u540D\u5728\u8C31\u91CC\uFF0C\u548C\u6587\u4EF6\u540D\u5206\u5F00\uFF1Buser\u300C\u4E4B\u540E\u5404\u7BA1\u5404\u7684\u540C\u610F\u300D\uFF09\u3002 */\n  readonly stem: string;\n  /** \u6587\u4EF6\u540D\u5B9A\u4E0B\u6765\u4E86\u6CA1\uFF08\u5B58\u8FC7 / \u6253\u5F00\u7684 / \u6539\u8FC7\u540D\u7684 = true\uFF1B\u6CA1\u5B58\u8FC7 = \u8DDF\u7740\u6B4C\u540D\u8D70\uFF09\u3002 */\n  readonly named: boolean;\n  /** \u6B4C\u5E93\u91CC\u7684\u8EAB\u4EFD\uFF1B\u4E0D\u5728\u6B4C\u5E93 = null\u3002 */\n  identifier(): string | null;\n  /** \u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31\uFF1F */\n  pending(): boolean;\n  /** \u663E\u793A / \u5B58\u6863\u7528\u7684\u540D\u5B57\uFF1A\u6CA1\u5B58\u8FC7 = \u5E74\u6708\u65E5-\u6B4C\u540D\uFF08\u6CA1\u6B4C\u540D = \u9ED8\u8BA4\u540D\uFF09\uFF1B\u5B9A\u4E0B\u6765\u7684 = stem\u3002 */\n  name(): string;\n  /** \u5E26\u540E\u7F00\u7684\u6587\u4EF6\u540D\uFF08\u672C\u673A\u6587\u4EF6 = \u53E5\u67C4\u7684\u540D\u5B57\uFF09\u3002 */\n  fileName(): string;\n  /** \u6362\u6B4C\uFF1A\u6574\u4E2A\u5BB6\u6362\u6389\uFF08\u6B4C\u5E93 \u2192 \u522B\u5904 = \u653E\u4E0B es \u7684\u8EAB\u4EFD\uFF09\u3002 */\n  load(home: Home, o: { stem: string; named: boolean }): void;\n  /** \u5B58 = \u56DE\u5BB6\uFF0C\u4E00\u4E2A\u52A8\u4F5C\uFF1A\u6B4C\u5E93 = smart save\uFF1B\u672C\u673A\u6587\u4EF6 = \u5199\u56DE\uFF08\u5199\u524D mtime \u5BF9\u8868\uFF09\uFF1B\u8FD8\u6CA1\u5BB6 = \u5B89\u5BB6\uFF08\u4FDD\u5B58\u6846 / \u4E0B\u8F7D\uFF09\uFF1B\u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31 = \u6709\u7B14\u5148\u5B89\u5BB6\u518D\u8D70\u6B4C\u5E93\u7684\u5B58\u3002 */\n  save(): Promise<SaveOutcome>;\n  /** \u6539\u6587\u4EF6\u540D\uFF1A\u6B4C\u5E93 = store tryMove\uFF08\u649E\u540D\u4E0D\u8986\u76D6\uFF09\uFF1B\u8FD8\u6CA1\u5BB6 = \u53EA\u6539\u4E0B\u6B21\u5B58\u7684\u540D\u5B57\uFF1B\u672C\u673A\u6587\u4EF6 = \u6539\u4E0D\u4E86\u3002 */\n  rename(raw: string): Promise<RenameOutcome>;\n  /** \u79BB\u5F00\u73B0\u5728\u8FD9\u9996\uFF08\u5207\u6B4C / \u65B0\u5EFA / \u6253\u5F00\u522B\u7684 / \u8FDB\u6B4C\u5E93\uFF09\uFF1A\u7B49\u7740\u5B89\u5BB6\u7684\u6709\u7B14\u5148\u5B89\u5BB6\uFF1B\u6B4C\u5E93 = \u5148\u843D\u76D8 + \u63A8\uFF08\u4E0D\u95EE\uFF09\uFF1B\u672C\u673A\u6587\u4EF6 / \u65E0\u5730 = \u6539\u8FC7\u6CA1\u5B58\u5148\u95EE\u3002\n   *  nextIsGallery = \u8981\u5207\u5230\u6B4C\u5E93\u91CC\u53E6\u4E00\u9996\uFF1Aes.open \u81EA\u5DF1\u4F1A\u5148\u5B58\u65E7\u7684\uFF08\u9000\u51FA\u8BED\u4E49\uFF09\uFF0C\u8FD9\u91CC\u4E0D\u91CD\u590D\u63A8\u3002 */\n  leave(what: string, o?: { nextIsGallery?: boolean }): Promise<boolean>;\n  /** \u9996\u7B14\u5B89\u5BB6\uFF1A\u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31\u94F8\u8EAB\u4EFD\uFF08\u6587\u4EF6\u540D = \u6B4C\u540D\u6216\u9ED8\u8BA4\u540D\uFF0C\u649E\u540D\u52A0 -hex4\uFF09\u2192 es \u63A5\u7BA1\uFF08\u9996\u5B58 mode:\"new\"\uFF09\u2192 \u7ACB\u523B\u843D\u672C\u5730\u3002\u5355\u98DE\uFF1B\u9014\u4E2D\u6362\u4E86\u6B4C\u5C31\u4F5C\u7F62\u3002 */\n  settle(): Promise<void>;\n  /** \u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31\u5DF2\u7ECF\u6709\u4E86\u7B2C\u4E00\u7B14 \u2192 \u5148\u5B89\u5BB6\uFF08\u5207\u6B4C / \u5B58 / \u65B0\u5EFA\u4E4B\u524D\uFF1B\u4E0D\u7136\u90A3\u51E0\u7B14\u4F1A\u5F53\u65E0\u5730\u7A3F\u88AB\u95EE\u300C\u4E22\u6389\uFF1F\u300D\uFF09\u3002 */\n  settleIfEdited(): Promise<void>;\n  /** \u628A\u624B\u91CC\u8FD9\u9996\uFF08\u65E0\u5730 / \u672C\u673A\u6587\u4EF6\uFF09\u653E\u8FDB\u6B4C\u5E93\uFF08\u6587\u4EF6\u540D\u6CBF\u7528\uFF1B\u649E\u540D\u52A0 -hex4\uFF09\u3002\u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31 = \u6709\u7B14\u5C31\u5B89\u5BB6\uFF0C\u6CA1\u7B14\u4E0D\u585E\u7A7A\u58F3\u3002 */\n  intoGallery(folder: string): Promise<IntoGalleryOutcome>;\n  /** \u653E\u4E0B\u6B4C\u5E93\u91CC\u7684\u8EAB\u4EFD\uFF08\u8FDB\u6B4C\u5E93 / \u88AB\u632A\u5939 / \u8FDB\u4E86\u56DE\u6536\u7AD9 / \u9000\u51FA\u767B\u5F55\uFF09\u2192 \u8FD8\u6CA1\u5BB6\u3002\u4E0D\u5728\u6B4C\u5E93 = no-op\u3002 */\n  release(): void;\n  /** \u5185\u5BB9\u53D8\u4E86\uFF081 s \u5FC3\u8DF3 + \u6BCF\u6B21 commit\uFF09\uFF1A\u6B4C\u5E93 = \u544A\u8BC9 es\uFF08autosave \u8282\u5F8B\uFF09\uFF1B\u7B49\u7740\u5B89\u5BB6\u7684\u7A7A\u8C31 = \u5B89\u5BB6\u3002 */\n  noteChanged(): void;\n}\n\nexport function createHome(init: { home: Home; stem: string; named: boolean }, ports: HomePorts): HomeKeeper {\n  let home = init.home, stem = init.stem, named = init.named;\n  const same = (a: Home, b: Home): boolean =>\n    a.kind === \"gallery\" ? b.kind === \"gallery\" && a.identifier === b.identifier\n    : a.kind === \"file\" ? b.kind === \"file\" && a.handle === b.handle\n    : b.kind === \"none\" && a.pendingFolder === b.pendingFolder;\n  /** \u6362\u5BB6\u7684\u552F\u4E00\u51FA\u53E3\uFF1A\u6B4C\u5E93 \u2192 \u522B\u5904 = \u653E\u4E0B es \u7684\u8EAB\u4EFD\uFF08autosave \u7EDD\u4E0D\u80FD\u628A\u65B0\u5185\u5BB9\u5199\u8FDB\u4E0A\u4E00\u9996\uFF09\uFF1B\u7136\u540E\u5BBF\u4E3B\u7684\u526F\u4F5C\u7528\u3002 */\n  function setHome(next: Home): void {\n    const prev = home;\n    if (same(prev, next)) { home = next; return; }\n    home = next;\n    if (prev.kind === \"gallery\" && next.kind !== \"gallery\") ports.gallery.release();\n    ports.onHome(prev, next);\n  }\n  function setName(s: string, n: boolean): void { if (s === stem && n === named) return; stem = s; named = n; ports.onName(); }\n  const name = (): string => { const t = fileSafe(ports.title()); return named || !t ? stem : `${stem.slice(0, 8)}-${t}`; };\n  /** \u5B58\u597D\u4E86\uFF1A\u6587\u4EF6\u540D\u4ECE\u6B64\u5B9A\u4E0B\u6765\uFF08\u4E4B\u540E\u548C\u6B4C\u540D\u5404\u7BA1\u5404\u7684\uFF09\u3002 */\n  const fixName = (): void => setName(name(), true);\n  const stemOfFile = (fileName: string): string => fileName.replace(/\\.(mxl|musicxml|xml)$/i, \"\");\n  const stemOfId = (id: string): string => ports.ids.parse(id)?.stem ?? id;\n  const pending = (): boolean => home.kind === \"none\" && home.pendingFolder != null;\n  /** \u94F8\u8EAB\u4EFD\uFF1A\u6587\u4EF6\u540D = \u6B4C\u540D\u6216\u9ED8\u8BA4\u540D\uFF1B\u649E\u540D\u52A0 -hex4\uFF0C\u4E0D\u52A0\u5E8F\u53F7\uFF08WXHW user 2026-09-10\u300C\u6211\u6700\u8BA8\u538C 123 \u8FD9\u79CD\u7684\u5E8F\u53F7\u7126\u8651\u300D\uFF09\u3002 */\n  async function mint(folder: string): Promise<string> {\n    const base = name();\n    let id = ports.ids.join(folder, base);\n    for (let n = 0; n < 50 && (await ports.gallery.occupied(id)); n++) id = ports.ids.join(folder, `${base}-${ports.freshStem().slice(9)}`);\n    return id;\n  }\n  /** \u8EAB\u4EFD\u5230\u624B \u2192 \u5BB6 = \u6B4C\u5E93\u3001\u540D\u5B57\u5B9A\u4E0B\u6765\u3001es \u63A5\u7BA1\uFF08\u9996\u5B58 mode:\"new\" \u649E\u540D\u4E0D\u8986\u76D6\uFF09\u2192 \u7ACB\u523B\u843D\u672C\u5730\uFF08\u6B4C\u5E93\u91CC\u9A6C\u4E0A\u770B\u5F97\u89C1\uFF09\u3002\n   *  \u843D\u76D8\u62A5\u4E86\u9519\uFF1A\u8EAB\u4EFD\u7559\u7740\u3001es \u8FD8\u810F\uFF0C\u4E0B\u4E00\u8F6E autosave \u518D\u8BD5\uFF08\u9996\u7B14\u5B89\u5BB6\u548C\u300C\u5B58\u8FDB\u6B4C\u5E93\u300D\u540C\u4E00\u6761\u653F\u7B56\uFF1B\u4EE5\u524D\u300C\u5B58\u8FDB\u6B4C\u5E93\u300D\u628A\u8EAB\u4EFD\u9000\u56DE\u53BB\u3001es \u5374\u8FD8\u4E3E\u7740\u65B0\u540D\u5B57 = \u534A\u622A\u56DE\u6EDA\uFF09\u3002 */\n  async function adopt(id: string): Promise<boolean> {\n    setHome({ kind: \"gallery\", identifier: id });\n    setName(stemOfId(id), true);\n    ports.gallery.adopted(id, { create: true });\n    try { await ports.gallery.flushLocal(); return true; }\n    catch (e) { ports.report(e, \"error\"); return false; }\n  }\n  let homing: Promise<void> | null = null;\n  function settle(): Promise<void> {\n    if (homing) return homing;\n    const h = home;\n    if (h.kind !== \"none\" || h.pendingFolder == null) return Promise.resolve();\n    homing = (async () => {\n      const id = await mint(h.pendingFolder!);\n      if (home !== h) return;   // \u9014\u4E2D\u6362\u4E86\u6B4C\uFF08\u65B0\u5EFA / \u5F00\u522B\u7684\uFF09= \u4F5C\u7F62\n      await adopt(id);\n    })().finally(() => { homing = null; });\n    return homing;\n  }\n  const settleIfEdited = (): Promise<void> => (pending() && ports.dirty() ? settle() : Promise.resolve());\n\n  async function save(): Promise<SaveOutcome> {\n    if (pending()) { if (!ports.dirty()) return { k: \"blank\" }; await settle(); }   // \u7A7A\u8C31\u8BDA\u5B9E\u56DE\u8BDD\uFF08WeebPaint blankNothingToSave\uFF09\uFF1B\u6709\u7B14\u5148\u5B89\u5BB6\u518D\u8D70\u6B4C\u5E93\u7684\u5B58\n    const h = home;\n    switch (h.kind) {\n      case \"gallery\": await ports.gallery.save(); return { k: \"gallery\" };\n      case \"file\": {\n        // \u5199\u4E4B\u524D\u5BF9\u4E00\u6B21 mtime\uFF0C\u6587\u4EF6\u5728\u5916\u9762\u88AB\u6539\u8FC7\u5C31\u5148\u95EE\uFF080819 spec \u00A77\u300C\u539F\u4F4D\u5199\u56DE\u524D\u67E5 lastModified\u300D\uFF09\n        const now = await ports.file.mtime(h.handle);\n        if (ports.file.isStale(h.mtime, now) && !(await ports.ask.overwriteStale(h.handle.name))) return { k: \"declined\" };\n        await ports.file.writeTo(h.handle, ports.bytes());\n        if (home === h) { home = { kind: \"file\", handle: h.handle, mtime: await ports.file.mtime(h.handle) }; fixName(); ports.markSaved(); }   // \u5199\u7684\u95F4\u9699\u6CA1\u6362\u5BB6\u624D\u8BB0\uFF08\u6362\u4E86\u5BB6 = \u522B\u628A\u522B\u4EBA\u7684\u540D\u5B57\u6807\u6210\u5B58\u597D\u4E86\uFF09\n        return { k: \"written\", name: h.handle.name };\n      }\n      case \"none\": {\n        // \u8FD8\u6CA1\u6709\u5BB6 = \u5B89\u5BB6\uFF1A\u684C\u9762 Chromium \u5148\u5F00\u7CFB\u7EDF\u4FDD\u5B58\u6846\uFF08\u5728\u624B\u52BF\u91CC\uFF1B\u53D6\u6D88 = \u5230\u6B64\u4E3A\u6B62\uFF0C\u4E0D\u964D\u7EA7\u5F39\u4E0B\u8F7D\uFF09\uFF0C\u518D\u7F16\u7801\u3001\u5199\u3001\u8BA4\u9886\u53E5\u67C4\u3002\n        if (ports.file.canPickSave()) {\n          const handle = await ports.file.pickSave(name() + ports.suffix);\n          if (!handle) return { k: \"cancelled\" };\n          await ports.file.writeTo(handle, ports.bytes());\n          setHome({ kind: \"file\", handle, mtime: await ports.file.mtime(handle) });\n          setName(stemOfFile(handle.name) || stem, true);\n          ports.markSaved();\n          return { k: \"written\", name: handle.name };\n        }\n        // iPad / Safari \u6CA1\u6709\u53E5\u67C4\u8FD9\u56DE\u4E8B = \u4E0B\u8F7D\u6216\u5206\u4EAB\u4E00\u4E2A .mxl \u5230\u300C\u6587\u4EF6\u300D\u91CC\uFF0C\u70B9\u4E86\u624D\u7B97\u5B58\u4E86\uFF08\u8FD9\u53F0\u8BBE\u5907\u4E0A\u4E0B\u8F7D\u5C31\u662F\u5B58\u2014\u2014\u6CA1\u6709\u522B\u7684\u5BB6\u53EF\u56DE\uFF09\n        const fileName = name() + ports.suffix;\n        ports.offerDownload(ports.bytes(), fileName, () => { fixName(); ports.markSaved(); });\n        return { k: \"offered\", name: fileName };\n      }\n      default: return assertNever(h);\n    }\n  }\n\n  async function rename(raw: string): Promise<RenameOutcome> {\n    const s = fileSafe(raw), h = home;\n    switch (h.kind) {\n      case \"file\": return { k: \"fileHome\", name: h.handle.name };\n      case \"none\": if (!s || s === name()) return { k: \"same\" }; setName(s, true); return { k: \"renamed\", stem: s, oldKept: false };\n      case \"gallery\": {\n        const p = ports.ids.parse(h.identifier);\n        if (!p || !s || s === p.stem) return { k: \"same\" };\n        const to = ports.ids.join(p.folder, s);\n        const r = await ports.gallery.rename(to);   // tryMove\uFF1A\u649E\u540D\u4E0D\u8986\u76D6\u3001\u65E7\u540D\u8FDB\u56DE\u6536\u7AD9\n        if (!r.ok) return { k: \"taken\", where: r.where };\n        setHome({ kind: \"gallery\", identifier: to });\n        setName(s, true);\n        return { k: \"renamed\", stem: s, oldKept: !!r.oldKept };\n      }\n      default: return assertNever(h);\n    }\n  }\n\n  async function leave(what: string, o: { nextIsGallery?: boolean } = {}): Promise<boolean> {\n    await settleIfEdited();\n    const h = home;\n    switch (h.kind) {\n      case \"gallery\":\n        if (!o.nextIsGallery) { try { await ports.gallery.flushAndPush(); } catch (e) { ports.report(e, \"warning\"); } }   // \u81EA\u52A8\u5B58\u7684\u4E1C\u897F\u6CA1\u4EC0\u4E48\u53EF\u4E22\uFF1A\u843D\u76D8 + \u63A8\uFF0C\u4E0D\u95EE\n        return true;\n      case \"file\": case \"none\": return ports.dirty() ? ports.ask.discard(what) : true;\n      default: return assertNever(h);\n    }\n  }\n\n  async function intoGallery(folder: string): Promise<IntoGalleryOutcome> {\n    if (pending()) {\n      if (!ports.dirty()) return { k: \"blank\" };\n      await settle();\n      return home.kind === \"gallery\" ? { k: \"settled\", identifier: home.identifier } : { k: \"blank\" };\n    }\n    const id = await mint(folder);\n    const flushed = await adopt(id);\n    return { k: \"moved\", identifier: id, flushed };\n  }\n\n  function release(): void { if (home.kind === \"gallery\") setHome({ kind: \"none\", pendingFolder: null }); }\n  function noteChanged(): void {\n    if (home.kind === \"gallery\") { if (ports.dirty()) ports.gallery.markDirty(); }\n    else if (pending() && ports.dirty()) void settle();\n  }\n\n  return {\n    get home() { return home; }, get stem() { return stem; }, get named() { return named; },\n    identifier: () => (home.kind === \"gallery\" ? home.identifier : null),\n    pending, name,\n    fileName: () => (home.kind === \"file\" ? home.handle.name : name() + ports.suffix),\n    load: (h, o) => { setHome(h); setName(o.stem, h.kind === \"none\" ? o.named : true); },\n    save, rename, leave, settle, settleIfEdited, intoGallery, release, noteChanged,\n  };\n}\n", "// encode-client.ts \u2014\u2014 \u4E3B\u7EBF\u7A0B\u8FD9\u8FB9\u7684\u5B58\u6863\u7F16\u7801\u53E3\uFF1A\u6709 worker \u5C31\u53D1\u8FC7\u53BB\uFF08src/format/encode-worker.ts\uFF09\uFF0C\u6CA1\u6709 / \u574F\u4E86\u5C31\u5728\u4E3B\u7EBF\u7A0B saveMxl\uFF08\u884C\u4E3A\u540C v0.13.x\uFF09\u3002\n//   created 2026-10-21 by Claude Fable 5.1\u3002\u4E00\u6B21\u53EA\u5141\u8BB8\u7684\u4E8B\uFF1A\u6BCF\u4E2A job \u4E00\u4E2A seq\uFF0C\u56DE\u6267\u6309 seq \u5BF9\u53F7\uFF1Bworker \u4E2D\u9014\u574F\u4E86 = \u5728\u9014\u7684\u5168\u90E8\u6539\u5728\u4E3B\u7EBF\u7A0B\u7B97\u4E00\u904D\uFF08\u81EA\u52A8\u5B58\u4E0D\u80FD\u56E0\u4E3A worker \u6CA1\u4E86\u5C31\u4E22\uFF09\u3002\nimport { saveMxl, type SaveArgs } from \"./project.ts\";\nimport type { EncodeJob, EncodeReply } from \"./encode-worker.ts\";\nimport { record } from \"../ui/perf-trace.ts\";\n\nexport interface Encoder {\n  /** \u4E00\u4EFD .mxl \u7684\u5B57\u8282\u3002\u4E3B\u7EBF\u7A0B\u4E0A\u82B1\u7684\u53EA\u6709\u7ED3\u6784\u5316\u514B\u9686\uFF08\u6B4C + \u4F11\u606F\u5BA4 + \u53C2\u8003\u7A97\u7684\u6587\u4EF6\uFF09\u3002 */\n  encode(args: SaveArgs): Promise<Uint8Array>;\n  /** \u73B0\u5728\u662F\u5728 worker \u91CC\u7F16\u7801\u5417\uFF08\u8BBE\u7F6E\u9875 / \u8BCA\u65AD\u7528\uFF09\u3002 */\n  offMain(): boolean;\n}\nexport function createEncoder(workerUrl: () => URL | null, onFallback: (why: string) => void): Encoder {\n  let worker: Worker | null | undefined;   // undefined = \u8FD8\u6CA1\u8BD5\uFF1Bnull = \u6CA1\u6709 / \u574F\u4E86\n  let seq = 0;\n  const pending = new Map<number, { args: SaveArgs; resolve: (b: Uint8Array) => void; reject: (e: Error) => void }>();\n  const drop = (why: string): void => {\n    onFallback(why);\n    try { worker?.terminate(); } catch { /* ignore */ }\n    worker = null;\n    for (const [, p] of pending) { try { p.resolve(saveMxl(p.args)); } catch (e) { p.reject(e as Error); } }   // \u5728\u9014\u7684\u6539\u5728\u4E3B\u7EBF\u7A0B\u7B97\n    pending.clear();\n  };\n  const get = (): Worker | null => {\n    if (worker !== undefined) return worker;\n    worker = null;\n    try {\n      const url = workerUrl();\n      if (!url || typeof Worker === \"undefined\") return null;\n      const w = new Worker(url, { type: \"module\" });\n      w.onmessage = (e: MessageEvent<EncodeReply>) => {\n        const p = pending.get(e.data.seq); if (!p) return;\n        pending.delete(e.data.seq);\n        if (\"bytes\" in e.data) { record(\"encode-worker\", e.data.ms); p.resolve(e.data.bytes); } else p.reject(new Error(e.data.error));\n      };\n      w.onerror = (e) => drop(`encode worker error: ${e.message ?? \"?\"}`);\n      worker = w;\n    } catch (e) { drop(`encode worker unavailable: ${(e as Error).message}`); }\n    return worker;\n  };\n  return {\n    encode: (args) => {\n      const w = get();\n      if (!w) return Promise.resolve(saveMxl(args));\n      return new Promise<Uint8Array>((resolve, reject) => {\n        const id = ++seq;\n        pending.set(id, { args, resolve, reject });\n        const t0 = performance.now();\n        try { w.postMessage({ seq: id, args } satisfies EncodeJob); }\n        catch (e) { pending.delete(id); drop(`encode postMessage failed: ${(e as Error).message}`); try { resolve(saveMxl(args)); } catch (err) { reject(err as Error); } return; }\n        record(\"encode-post\", performance.now() - t0);\n      });\n    },\n    offMain: () => worker != null,\n  };\n}\n", "// factory-reset.ts \u2014\u2014 \u300C\u8FD8\u539F\u51FA\u5382\u8BBE\u7F6E\u2026\u300D\uFF1A\u672C app \u5728\u8FD9\u53F0\u8BBE\u5907\u4E0A\u7684\u5168\u90E8\u672C\u5730\u8DB3\u8FF9\u6E05\u6210\u65B0\u88C5\uFF08\u5BB6\u65CF\u89C4\u77E9 2\u00BD\uFF0C\u5BB6\u65CF\u6839 CLAUDE.md\uFF1Buser 2026-10-21\u300C\u5168\u5BB6swipe\u7684\u8BED\u4E49\u7EDF\u4E00\uFF0C\u7136\u540Efull swipe\u5E94\u8BE5\u6709\u4E8C\u6B21\u786E\u5B9A\u62A4\u680F\uFF0C\u800C\u4E14\u662F\u5F00\u53D1\u8005\u83DC\u5355\u91CC\u9762\u300D\uFF09\u3002\n//   created 2026-10-21 by Claude Fable 5.1\u3002\u5F62\u72B6\u6284 WeebPaint src/factory-reset.ts\u3002\n//   \u8303\u56F4 = \u2460 store \u7684\u547D\u540D\u7A7A\u95F4 `moonsinger.*`\uFF08\u5E93\u53E3\u5B50 wipeAppNamespace\uFF1AIDB \u5404\u5206\u533A + \u540C\u524D\u7F00 localStorage\uFF1B\u9010\u5B57\u786E\u8BA4\u5728\u5E93\u5185\u6BD4\u5BF9\uFF09\n//        \u2461 \u81EA\u5BB6\u6D3E\u751F\u7F13\u5B58\u5E93 moonsinger-thumbs / moonsinger-facts / moonsinger-speech\uFF08CLAUDE.md \u6301\u4E45\u5C42\u767D\u540D\u5355\u8868\u91CC\u90A3\u4E09\u4E2A\uFF0C\u5168\u5220\u53EF\u518D\u751F\uFF09\n//        \u2462 \u81EA\u5BB6 GUID \u524D\u7F00\u5E93 `moonsinger-5b1e7c0a92d34f6e.*`\uFF08gallery-registry \u7B49\uFF09+ device-kv \u7684 localStorage \u952E\uFF08deviceKvWipeAll\uFF09\n//        \u2463 \u81EA\u5DF1\u7684\u79BB\u7EBF\u58F3\uFF08\u53EA\u6CE8\u9500\u7BA1\u7740\u672C\u9875\u7684 SW\u3001\u53EA\u5220 `moonsinger-` \u524D\u7F00\u7684 Cache\uFF1Bpwa-shell.clearOwnShell\uFF09\u2192 reload\u3002\n//   \u4E0D\u78B0\uFF1A\u5BB6\u65CF\u5171\u4EAB\u7684 `pwa-models`\uFF08\u5C0F\u6708\u76F8\u6A21\u578B\u5305\uFF09/ `pwa-sounds`\uFF08\u97F3\u6E90\uFF09\uFF1B\u4E91\u7AEF\uFF08OneDrive\uFF09\u4E0A\u7684\u6B4C\uFF1B\u672C\u673A\u6587\u4EF6\u3002\n//   \u62A4\u680F = \u4E24\u6B65\u3001\u4E0D\u786C\u62E6\uFF1A\u2460 \u8BF4\u660E sheet\uFF08\u6709 N \u9996\u8FD8\u6CA1\u4F20\u4E0A\u53BB\u4F1A\u4E00\u8D77\u5220\u6389\u3001\u4E0D\u9020\u9003\u751F\u526F\u672C\uFF1B\u624B\u91CC\u7684\u6B4C\u6CA1\u5B58\u4E5F\u4E22\uFF1B\u53EF\u53D6\u6D88\uFF09\u2461 \u9010\u5B57\u786E\u8BA4\uFF08\u8F93\u5165\u90A3\u4E00\u53E5\uFF0C\u5E93\u5185\u6BD4\u5BF9\uFF0C\u4E0D\u5BF9\u4E0D\u6267\u884C\uFF09\u3002\n//   \u5220\u4E0D\u6389\u7684\u5E93\uFF08\u522B\u7684\u6807\u7B7E\u9875\u5F00\u7740\uFF09= \u62A5\u51FA\u6765\u3001\u4E0D reload\uFF08\u5173\u6389\u518D\u6765\u4E00\u6B21\uFF0C\u5E42\u7B49\uFF09\u3002\nimport { wipeAppNamespace, scanAppNamespace } from \"../app-store.ts\";\nimport { APP_ID, APP_DB_PREFIX } from \"../config.ts\";\nimport { deviceKvWipeAll } from \"../device-kv.ts\";\nimport { openConfirmSheet, openInputSheet } from \"../ui/sheets.ts\";\n\n/** \u9010\u5B57\u786E\u8BA4\u90A3\u4E00\u53E5\uFF08\u548C WeebPaint \u540C\u4E00\u53E5\uFF0C\u5168\u5BB6\u4E00\u4E2A\u53E3\u4EE4\uFF09\u3002 */\nexport const CONSENT_PHRASE = \"\u5220\u9664\u5168\u90E8\u672C\u5730\u6570\u636E\";\n/** \u81EA\u5BB6\u6D3E\u751F\u7F13\u5B58\u5E93\uFF08\u767D\u540D\u5355\u8868\u767B\u8BB0\u7684\u4E09\u4E2A\uFF1Bgallery-host.ts / singer/worker.ts \u91CC\u7684\u5B57\u9762\u91CF\u8981\u548C\u8FD9\u91CC\u4E00\u81F4\u2014\u2014test/factory-reset.test.ts \u5B88\uFF09\u3002 */\nexport const OWN_DBS = [\"moonsinger-thumbs\", \"moonsinger-facts\", \"moonsinger-speech\"] as const;\nconst BLOCKED_TIMEOUT_MS = 2000;\n\nexport interface FactoryResetDeps {\n  /** \u8FDB\u8FC7\u6B4C\u5E93\uFF08store \u5EFA\u7740\uFF09\uFF1F */\n  attached(): boolean;\n  /** \u8FD8\u6CA1\u4F20\u4E0A\u53BB\u7684\u6B4C\u6709\u51E0\u9996\uFF08dirty.count()\uFF1A\u4ECE\u6CA1\u4F20\u8FC7\u7684 + \u4F20\u8FC7\u6539\u4E86\u6CA1\u63A8\u7684\u5408\u8BA1\uFF09\u3002\u6CA1\u5EFA store = 0\u3002 */\n  dirtyCount(): Promise<number>;\n  /** \u624B\u91CC\u8FD9\u9996\u6539\u8FC7\u8FD8\u6CA1\u5B58\uFF1F */\n  openUnsaved(): boolean;\n  /** \u52A8\u624B\u4E4B\u524D\uFF1A\u653E\u4E0B\u624B\u91CC\u7684\u6B4C\u7684\u8EAB\u4EFD\u3001\u505C\u6389\u4E3E\u7740 IDB \u8FDE\u63A5\u7684\u4E1C\u897F\uFF08\u5C0F\u6708\u76F8 worker \u7684\u5FF5\u7F13\u5B58\uFF09\u3001dispose store\uFF08\u4E0D drain\u3001\u4E0D\u9020\u9003\u751F\u526F\u672C\uFF09\u3002 */\n  prepare(): Promise<void>;\n  /** \u53EA\u6E05\u81EA\u5DF1\u7684\u79BB\u7EBF\u58F3\uFF08pwa-shell.clearOwnShell\uFF09\u3002 */\n  clearShell(): Promise<void>;\n  info(s: string): void;\n  report(e: unknown, level: \"warning\" | \"error\" | \"log\"): void;\n}\nexport type FactoryResetOutcome = \"cancelled\" | \"mismatch\" | \"blocked\" | \"done\";\n\nconst isOurDb = (name: string): boolean => (OWN_DBS as readonly string[]).includes(name) || name.startsWith(APP_DB_PREFIX);\n\nfunction deleteDbOrBlocked(name: string): Promise<\"deleted\" | \"blocked\"> {\n  return new Promise((resolve) => {\n    let settled = false;\n    const done = (r: \"deleted\" | \"blocked\") => { if (!settled) { settled = true; resolve(r); } };\n    const timer = setTimeout(() => done(\"blocked\"), BLOCKED_TIMEOUT_MS);\n    try {\n      const req = indexedDB.deleteDatabase(name);\n      req.onsuccess = () => { clearTimeout(timer); done(\"deleted\"); };\n      req.onerror = () => { clearTimeout(timer); done(\"blocked\"); };\n    } catch { clearTimeout(timer); done(\"blocked\"); }\n  });\n}\nasync function listOurDbs(): Promise<string[]> {\n  try {\n    if (typeof indexedDB === \"undefined\" || typeof indexedDB.databases !== \"function\") return [...OWN_DBS];   // \u8001\u5E73\u53F0\u679A\u4E3E\u4E0D\u4E86\uFF1A\u6309\u5DF2\u77E5\u7684\u4E09\u4E2A\u5220\uFF08\u524D\u7F00\u5E93\u6F0F\u6389 = \u8BDA\u5B9E\u7F3A\u53E3\uFF0C\u62A5\u544A\u91CC\u4E0D\u8C0E\u62A5\uFF09\n    return (await indexedDB.databases()).map((d) => d.name ?? \"\").filter(isOurDb);\n  } catch { return [...OWN_DBS]; }\n}\n/** \u81EA\u5BB6\u8DB3\u8FF9\u6DF1\u6E05\uFF08store \u7684\u547D\u540D\u7A7A\u95F4\u7531\u5E93\u53E3\u5B50\u8D1F\u8D23\uFF09\u3002 */\nasync function wipeOwnFootprint(): Promise<{ deleted: string[]; blocked: string[]; lsRemoved: number }> {\n  const r = { deleted: [] as string[], blocked: [] as string[], lsRemoved: 0 };\n  for (const name of new Set([...(await listOurDbs()), ...OWN_DBS])) ((await deleteDbOrBlocked(name)) === \"deleted\" ? r.deleted : r.blocked).push(name);\n  r.lsRemoved = deviceKvWipeAll();\n  return r;\n}\n\n/** \u8FD8\u539F\u51FA\u5382\u4E3B\u6D41\u7A0B\uFF08\u8BBE\u7F6E \u2192 \u5F00\u53D1\u8005 \u2192 \u300C\u8FD8\u539F\u51FA\u5382\u8BBE\u7F6E\u2026\u300D\uFF09\u3002\u5168\u7A0B\u5E94\u7528\u5185 sheet\u3002 */\nexport async function runFactoryReset(d: FactoryResetDeps): Promise<FactoryResetOutcome> {\n  // \u2460 \u8BF4\u660E\uFF08\u4E0D\u786C\u62E6\uFF1A\u6709\u4EC0\u4E48\u4F1A\u4E22\u5C31\u8BF4\u4EC0\u4E48\uFF0C\u4EBA\u770B\u5B8C\u80FD\u53D6\u6D88\uFF09\n  let dirtyN = 0;\n  if (d.attached()) { try { dirtyN = await d.dirtyCount(); } catch (e) { d.report(e, \"log\"); } }\n  const lines = [\"\u5220\u9664\u8FD9\u53F0\u8BBE\u5907\u4E0A MoonSinger \u7684\u5168\u90E8\u672C\u5730\u6570\u636E\uFF1A\u6B4C\u5E93\u91CC\u7684\u6B4C\uFF08\u672C\u673A\u526F\u672C\uFF09\u3001\u5FF5\u7F13\u5B58\u3001\u5C01\u9762\u7F13\u5B58\u3001\u8BBE\u7F6E\u3001\u8BCA\u65AD\u65E5\u5FD7\uFF1B\u79BB\u7EBF\u58F3\u4E5F\u91CD\u88C5\u3002\u4E91\u7AEF\uFF08OneDrive\uFF09\u4E0A\u7684\u6B4C\u548C\u672C\u673A\u6587\u4EF6\u4E0D\u53D7\u5F71\u54CD\u3002\",\n    d.attached() ? (dirtyN > 0 ? `\u6709 ${dirtyN} \u9996\u8FD8\u6CA1\u4F20\u4E0A\u53BB\uFF0C\u4F1A\u4E00\u8D77\u5220\u6389\uFF08\u4E0D\u9020\u9003\u751F\u526F\u672C\uFF09\u3002` : \"\u6B4C\u5E93\u91CC\u7684\u6B4C\u90FD\u4F20\u4E0A\u53BB\u4E86\u3002\") : \"\u8FD9\u53F0\u8BBE\u5907\u6CA1\u8FDB\u8FC7\u6B4C\u5E93\u3002\"];\n  if (d.openUnsaved()) lines.push(\"\u624B\u91CC\u8FD9\u9996\u6539\u8FC7\u8FD8\u6CA1\u5B58\uFF0C\u4E5F\u4F1A\u4E22\u3002\");\n  if (!(await openConfirmSheet(\"\u8FD8\u539F\u51FA\u5382\u8BBE\u7F6E\", lines.join(\"\\n\"), { okLabel: \"\u7EE7\u7EED\", danger: true }))) return \"cancelled\";\n  // \u2461 \u9010\u5B57\u786E\u8BA4\uFF08\u5E93\u5185\u6BD4\u5BF9\uFF1B\u4E0D\u5BF9\u4E0D\u6267\u884C\uFF09\n  const typed = await openInputSheet(\"\u8FD8\u539F\u51FA\u5382\u8BBE\u7F6E\", { placeholder: CONSENT_PHRASE, message: `\u9010\u5B57\u8F93\u5165\u300C${CONSENT_PHRASE}\u300D\u786E\u8BA4\u3002\u8FD9\u4E00\u6B65\u505A\u5B8C app \u4F1A\u91CD\u5F00\u6210\u65B0\u88C5\u7684\u6837\u5B50\u3002`, okLabel: \"\u5220\u9664\" });\n  if (typed == null) return \"cancelled\";\n  if (typed.trim() !== CONSENT_PHRASE) { d.info(\"\u8F93\u5165\u7684\u4E0D\u4E00\u6837\uFF0C\u4EC0\u4E48\u90FD\u6CA1\u52A8\u3002\"); return \"mismatch\"; }   // \u5148\u5728\u8FD9\u513F\u6321\u4E00\u6B21\uFF08\u5E93\u5185\u8FD8\u4F1A\u518D\u6BD4\u4E00\u6B21\uFF09\n  try {\n    await d.prepare();\n    const storeReport = await wipeAppNamespace({ appId: APP_ID, consent: { expected: CONSENT_PHRASE, typed: typed.trim() } });\n    const own = await wipeOwnFootprint();\n    const scan = await scanAppNamespace(APP_ID);\n    const residueOwn = (await listOurDbs()).length;\n    const blocked = storeReport.blockedDatabases.length + own.blocked.length;\n    if (blocked > 0) {\n      await openConfirmSheet(\"\u8FD8\u6CA1\u5220\u5E72\u51C0\", `\u6709 ${blocked} \u4E2A\u5E93\u88AB\u522B\u7684\u6807\u7B7E\u9875\u5360\u7740\uFF0C\u5220\u4E0D\u6389\u3002\u5173\u6389\u5176\u4ED6 MoonSinger \u6807\u7B7E\u9875\uFF08\u6216\u522B\u7684\u7A97\u53E3\uFF09\u518D\u6765\u4E00\u6B21\u2014\u2014\u518D\u505A\u4E00\u904D\u662F\u5B89\u5168\u7684\u3002`, { okLabel: \"\u597D\", cancelLabel: \"\u5173\u95ED\" });\n      return \"blocked\";\n    }\n    const db = storeReport.deletedDatabases.length + own.deleted.length, ls = storeReport.localStorageKeysRemoved + own.lsRemoved;\n    const residue = scan.databases.length + scan.localStorageKeys + residueOwn;\n    await openConfirmSheet(\"\u8FD8\u539F\u51FA\u5382\u8BBE\u7F6E\", residue === 0 ? `\u5220\u4E86 ${db} \u4E2A\u5E93\u3001${ls} \u4E2A\u952E\uFF0C\u8FD9\u53F0\u8BBE\u5907\u4E0A\u6CA1\u6709\u6B8B\u7559\u3002\u70B9\u300C\u597D\u300D\u91CD\u5F00\u3002` : `\u5220\u4E86 ${db} \u4E2A\u5E93\u3001${ls} \u4E2A\u952E\uFF1B\u8FD8\u5269 ${residue} \u5904\u6B8B\u7559\uFF08\u679A\u4E3E\u4E0D\u5230\u7684\u5E73\u53F0 / \u521A\u88AB\u91CD\u5EFA\uFF09\uFF0C\u91CD\u5F00\u540E\u518D\u505A\u4E00\u904D\u5C31\u6CA1\u4E86\u3002\u70B9\u300C\u597D\u300D\u91CD\u5F00\u3002`, { okLabel: \"\u597D\", cancelLabel: \"\u597D\" });\n    try { await d.clearShell(); } catch (e) { d.report(e, \"log\"); }   // \u58F3\u6E05\u5931\u8D25\u4E0D\u6321 reload\uFF1A\u6570\u636E\u5DF2\u5F52\u96F6\n    location.replace(`${location.pathname}?reset=${Date.now()}`);\n    return \"done\";\n  } catch (e) {\n    if ((e as { name?: string })?.name === \"WipeConsentError\") { d.info(\"\u8F93\u5165\u7684\u4E0D\u4E00\u6837\uFF0C\u4EC0\u4E48\u90FD\u6CA1\u52A8\u3002\"); return \"mismatch\"; }\n    d.report(e, \"error\");\n    return \"blocked\";\n  }\n}\n", "// desk.ts \u2014\u2014 \u89C6\u56FE\u6001\uFF08\u7167 WeebPaint \u7684 desk\uFF0Cworkbench-state.ts\uFF1Buser 2026-10-08\u300Cundo \u53EF\u4EE5\u53C2\u8003 weebpaint \u7684\u89C6\u56FE vs \u6587\u4EF6\u3002\u89C6\u56FE\u4F1A\u987A\u624B\u635E\u8FDB\u6587\u4EF6\u300D\uFF09\u3002created 2026-10-08 by Claude Fable 5.1\n// \u4EC0\u4E48\u7B97\u89C6\u56FE\u6001\uFF1A**\u4E0D\u6539\u6B4C\u672C\u8EAB\u3001\u53EA\u6539\u4F60\u600E\u4E48\u770B / \u600E\u4E48\u542C\u8FD9\u6B21**\u2014\u2014\u8303\u56F4\uFF08\u672C\u6BB5 / \u5168\u90E8\uFF09\u3001\u6392\u6CD5\uFF08\u8FDE\u7EED / \u5206\u9875\uFF09\u3001\u73B0\u5728\u5728\u54EA\u5F20\u7EB8\u3001\u6BCF\u4E2A\u58F0\u90E8\u7684 \u9690\u85CF / \u53EA\u770B / \u9759\u97F3 / \u72EC\u594F\u3002\n// \u89C4\u77E9\uFF08\u4E09\u6761\uFF0C\u548C WeebPaint \u4E00\u6837\uFF09\uFF1A\u2460 **\u5B58\u65F6\u987A\u624B\u635E\u8FDB\u6587\u4EF6**\uFF08score.json \u53EF\u9009\u5B57\u6BB5 view\uFF1B\u5951\u7EA6 ViewV1\uFF09\u2014\u2014\u4E0B\u6B21\u6253\u5F00\u56DE\u5230\u539F\u6837\uFF1B\u2461 **\u6539\u4E86\u4E0D\u6807\u810F**\uFF08\u4E0D\u51FA\u300C\u2022\u300D\u3001\u4E0D\u89E6\u53D1\u81EA\u52A8\u5B58\uFF0C\n//   \u300C\u5B58\u300D\u90A3\u4E00\u4E0B\u987A\u624B\u5E26\u8D70\uFF1B\u4EBA\u7C7B 2026-06-10 \u5728 WeebPaint \u9489\u7684\u300C\u5207\u68CB\u76D8\u4E0D\u8BA9\u753B\u53D8\u672A\u4FDD\u5B58\u300D\uFF09\uFF1B\u2462 **\u4E0D\u8FDB undo**\uFF08undo \u53EA\u76D6\u8FDB\u6587\u4EF6\u7684\u5185\u5BB9\uFF1Bhistory.ts\uFF09\u3002\n// \u7F29\u653E\uFF08\u634F\u5408\u3001CSS zoom\uFF09**\u4E0D\u5728\u8FD9\u91CC**\uFF1A\u5B83\u8DDF\u5C4F\u5E55\u5927\u5C0F\u8D70\uFF0C\u662F\u8BBE\u5907\u7684\u4E8B\uFF0C\u4E0D\u968F\u6B4C\u3002\n// pad \u7684\u72B6\u6001\uFF081= / \u8C03\u5F0F / \u65F6\u503C / \u8FDE\u97F3 / \u97F3\u57DF\uFF09**\u5728\u8FD9\u91CC**\uFF082026-10-08 Opus 5.5\uFF1Buser\u300C\u5B66\u4E00\u4E0Bweebpaint\u7684editorstate\uFF0C\u952E\u76D8\u7684\u72B6\u6001\u4E4B\u7C7B\u7684\u4E5F\u5E94\u8BE5\u6301\u4E45\u5316\uFF0C\u6BD4\u59821=\u51E0\uFF0C\u65F6\u503C. shift\u53EF\u4EE5\u4E0D\u7528\u6301\u4E45\u5316\u300D\u2014\u2014\n//   \u540C WeebPaint \u7684\u7B14 / dial \u8DDF\u7740\u753B\u8D70\uFF1B\u6B64\u524D\u8FD9\u91CC\u5199\u7684\u662F\u300Cpad \u662F\u72EC\u7ACB\u8BBE\u5907\uFF0C\u6362\u6B4C\u4E0D\u6362\u5B83\u300D\uFF0C\u6309 user \u8FD9\u53E5\u6539\u4E86\uFF09\u3002\u5347\u964D / \u53E0 / \u51CF\u534A\uFF08Shift \u7C7B\uFF09\u4E0D\u5B58\uFF1Bpad \u7684\u884C / \u5217 / \u9996\u8C03\u7EDD\u5BF9\uFF08\u8DDF\u5C4F\u5E55\u8D70\uFF09\u4E0D\u5728\u8FD9\u91CC\u3002\n// \u8FD9\u4E2A\u6A21\u5757\u53EA\u7BA1\u300C\u4E00\u4E2A\u5BF9\u8C61 \u2194 \u6587\u4EF6\u91CC\u7684 JSON\u300D\uFF1B\u53D8\u91CF\u672C\u8EAB\u4ECD\u4F4F\u5728 main.ts\uFF08viewScope / pageFlow / partView\uFF09\uFF0C\u5B58\u65F6 deskNow() \u805A\u4E00\u4E0B\u3001\u5F00\u65F6 applyDesk() \u6563\u56DE\u53BB\u2014\u2014\u4E0D\u642C\u5BB6\uFF0C\u5C11\u6539\u7EBF\u3002\nimport { SCALES } from \"./scales.ts\";\n/** \u65F6\u503C\u5B58 MusicXML \u7684\u97F3\u7B26\u7C7B\u578B\u540D\uFF08\u4E0D\u5B58 LADDER \u4E0B\u6807\uFF1A\u4E0B\u6807\u54EA\u5929\u53D8\u4E86\u8001\u6587\u4EF6\u5C31\u9519\uFF09\uFF1B\u987A\u5E8F = song.ts LADDER\u3002 */\nexport type PadUnit = \"32nd\" | \"16th\" | \"eighth\" | \"quarter\" | \"half\" | \"whole\";\nexport const PAD_UNITS: readonly PadUnit[] = [\"32nd\", \"16th\", \"eighth\", \"quarter\", \"half\", \"whole\"];\n/** pad \u7684\u72B6\u6001\u3002low = \u97F3\u57DF\u7A97\u53E3\u6700\u4F4E\u90A3\u4E2A\u952E\u7684 MIDI\uFF08\u6362\u4E2A\u884C\u6570 / \u952E\u4F4D\u7684\u8BBE\u5907\u4E5F\u843D\u5728\u5DEE\u4E0D\u591A\u7684\u97F3\u57DF\uFF09\uFF1Bnull = \u9ED8\u8BA4\u90A3\u4E00\u6863\u3002 */\nexport interface PadDesk { fifths: number; scale: string; unit: PadUnit; tuplet: 0 | 3 | 5 | 6 | 7; low: number | null }\nexport const freshPad = (): PadDesk => ({ fifths: 0, scale: \"major\", unit: \"eighth\", tuplet: 0, low: null });   // \u540C song.ts initInput\uFF08\u516B\u5206 = DEFAULT_UNIT\uFF09\nexport interface PartViewState { hidden: boolean; only: boolean; muted: boolean; solo: boolean }\nexport const freshPartView = (): PartViewState => ({ hidden: false, only: false, muted: false, solo: false });\n/** mp3 = \u5BFC\u51FA\u6B4C\u58F0\u7684\u97F3\u8D28\uFF08\u5BFC\u51FA\u9762\u677F\u91CC\u9009\u7684\uFF1B2026-10-08 by Claude Opus 5.5\uFF0Cuser\u300C\u97F3\u8D28\u914D\u7F6E\u5C31\u662F\u5E94\u8BE5\u4E5F\u8DDF\u7740\u5427\u300D\u2014\u2014\u8DDF\u8FD9\u9996\u6B4C\u8D70\u3001\u5B58\u65F6\u987A\u624B\u5E26\u3001\u4E0D\u6807\u810F\u3001\u4E0D\u8FDB undo\uFF09\u3002 */\n/** ref = \u53C2\u8003\u7A97\u7684\u7A97\uFF08\u5F00\u7740\u6CA1\u6709 + \u4F4D\u7F6E / \u5927\u5C0F\uFF0CCSS \u50CF\u7D20\uFF1B2026-10-08 \u6DF1\u591C Opus 5.5\uFF0Cv0.8\uFF1B\u540C WXHW \u7684 refPanel\uFF09\u2014\u2014\u8FD9\u9996\u6B4C\u91CC\u5F00\u8FC7\u7A97\u624D\u6709\uFF1B\u91CC\u9762\u7684\u5361\u4E0D\u5728\u8FD9\u91CC\uFF08\u8FDB\u6587\u4EF6\u3001\u6807\u810F\uFF0C\u89C1 src/app/reference-host.ts\uFF09\u3002 */\nexport interface RefPanelDesk { open: boolean; left: number; top: number; width: number; height: number }\n/** pdf = \u4E50\u8C31 PDF \u7684\u5B57\u4F53\uFF08\u5BFC\u51FA\u9762\u677F\u91CC\u9009\u7684\uFF1B\u540C mp3 \u97F3\u8D28\u8DDF\u7740\u8FD9\u9996\u6B4C\u8D70\u3001\u4E0D\u6807\u810F\uFF1B2026-10-09 Opus 5.5\uFF0Cuser\u300C\u5B57\u4F53\u53EF\u4EE5\u9009\u666E\u901A\u7684\u548C\u90A3\u4E2A\u62FC\u97F3\u53EF\u7231\u7684\u300D\uFF09\u3002 */\n/** scroll = \u6392\u6CD5\u300C\u6A2A\u5377\u300D\uFF08v0.9.35\uFF1B\u4E00\u884C\u65E0\u9650\u5F80\u53F3\uFF1B\u548C pageFlow \u4E92\u65A5\uFF0C\u4E24\u4E2A\u90FD\u5199\u7740 = \u6A2A\u5377\u8BF4\u4E86\u7B97\uFF09\u3002 */\n/** mode = \u6253\u5F00\u65F6\u8FDB\u54EA\u4E2A\u6A21\u5F0F\uFF08v0.10.21\uFF1Buser\u300C\u6253\u5F00\u65F6\u8BB0\u4F4F\u4E0A\u6B21\u7684\u6A21\u5F0F\uFF0C\u6210\u54C1\u66F2\u4E0D\u5E94\u8BE5\u8001\u662F\u8DF3\u5230\u97F3\u7B26\u8F93\u5165\uFF0C\u5BB9\u6613\u8BEF\u89E6\u300D\uFF09\uFF1A\u5B58\u7684\u65F6\u5019\u8BB0\u4E0B\u5F53\u65F6\u7684\u6A21\u5F0F\uFF0C\u9ED8\u8BA4\u300C\u97F3\u300D\u4E0D\u5199\u3002 */\nexport interface Desk { scope: \"all\" | \"segment\"; pageFlow: boolean; scroll: boolean; paper: string | null; parts: Record<string, PartViewState>; mp3: \"standard\" | \"small\"; pad: PadDesk; ref: RefPanelDesk | null; pdf: \"sans\" | \"pinyin\"; mode: \"notes\" | \"lyrics\" | \"symbols\" | \"listen\" }\nexport const freshDesk = (): Desk => ({ scope: \"segment\", pageFlow: false, scroll: false, paper: null, parts: {}, mp3: \"standard\", pad: freshPad(), ref: null, pdf: \"sans\", mode: \"notes\" });\n\n/** \u6587\u4EF6\u91CC\u7684\u5F62\u72B6\uFF08\u53EA\u5199\u975E\u9ED8\u8BA4\u503C\uFF1B\u5168\u9ED8\u8BA4 = \u4E0D\u5199\u8FD9\u4E2A\u5B57\u6BB5\uFF09\u3002 */\nexport interface DeskJson { scope?: \"all\"; pageFlow?: true; scroll?: true; paper?: string; parts?: Record<string, { hidden?: true; only?: true; muted?: true; solo?: true }>; mp3?: \"small\"; pad?: PadJson; ref?: { open?: true; left: number; top: number; width: number; height: number }; pdf?: \"pinyin\"; mode?: \"lyrics\" | \"symbols\" | \"listen\" }\n/** pad \u5728\u6587\u4EF6\u91CC\u7684\u5F62\u72B6\uFF1A\u53EA\u5199\u4E0D\u662F\u9ED8\u8BA4\u7684\uFF1B\u5168\u9ED8\u8BA4 = \u4E0D\u5199\u3002 */\nexport interface PadJson { fifths?: number; scale?: string; unit?: PadUnit; tuplet?: 3 | 5 | 6 | 7; low?: number }\nexport function serializeDesk(d: Desk): DeskJson | null {\n  const out: DeskJson = {};\n  if (d.scope === \"all\") out.scope = \"all\";\n  if (d.mp3 === \"small\") out.mp3 = \"small\";\n  if (d.pdf === \"pinyin\") out.pdf = \"pinyin\";\n  if (d.mode !== \"notes\") out.mode = d.mode;\n  if (d.scroll) out.scroll = true; else if (d.pageFlow) out.pageFlow = true;\n  if (d.paper) out.paper = d.paper;\n  const parts: NonNullable<DeskJson[\"parts\"]> = {};\n  for (const [id, p] of Object.entries(d.parts)) {\n    const v: { hidden?: true; only?: true; muted?: true; solo?: true } = {};\n    if (p.hidden) v.hidden = true; if (p.only) v.only = true; if (p.muted) v.muted = true; if (p.solo) v.solo = true;\n    if (Object.keys(v).length) parts[id] = v;\n  }\n  if (Object.keys(parts).length) out.parts = parts;\n  const pd = d.pad, def = freshPad(), pj: PadJson = {};\n  if (pd.fifths !== def.fifths) pj.fifths = pd.fifths;\n  if (pd.scale !== def.scale) pj.scale = pd.scale;\n  if (pd.unit !== def.unit) pj.unit = pd.unit;\n  if (pd.tuplet) pj.tuplet = pd.tuplet;\n  if (pd.low !== null) pj.low = pd.low;\n  if (Object.keys(pj).length) out.pad = pj;\n  if (d.ref) { const { open, left, top, width, height } = d.ref; out.ref = { ...(open ? { open: true as const } : {}), left, top, width, height }; }\n  return Object.keys(out).length ? out : null;\n}\n/** \u8BFB\u6587\u4EF6\u91CC\u7684\uFF08\u5BBD\u5BB9\uFF1A\u4E0D\u662F\u5BF9\u8C61 / \u5B57\u6BB5\u4E0D\u8BA4\u8BC6 = \u5F53\u9ED8\u8BA4\uFF1B\u522B\u5BB6 / \u66F4\u65B0\u7248\u5199\u7684\u591A\u4F59\u5B57\u6BB5\u4E0D\u7BA1\uFF09\u3002 */\nexport function unserializeDesk(json: unknown): Desk {\n  const d = freshDesk();\n  if (!json || typeof json !== \"object\") return d;\n  const j = json as Record<string, unknown>;\n  if (j.scope === \"all\") d.scope = \"all\";\n  if (j.pageFlow === true) d.pageFlow = true;\n  if (j.scroll === true) { d.scroll = true; d.pageFlow = false; }\n  if (j.mp3 === \"small\") d.mp3 = \"small\";\n  if (j.pdf === \"pinyin\") d.pdf = \"pinyin\";\n  if (j.mode === \"lyrics\" || j.mode === \"symbols\" || j.mode === \"listen\") d.mode = j.mode;\n  if (typeof j.paper === \"string\" && j.paper) d.paper = j.paper;\n  if (j.parts && typeof j.parts === \"object\") {\n    for (const [id, v] of Object.entries(j.parts as Record<string, unknown>)) {\n      if (!v || typeof v !== \"object\") continue;\n      const p = v as Record<string, unknown>;\n      d.parts[id] = { hidden: p.hidden === true, only: p.only === true, muted: p.muted === true, solo: p.solo === true };\n    }\n  }\n  if (j.pad && typeof j.pad === \"object\") {   // \u6BCF\u4E00\u9879\u5404\u81EA\u5BBD\u5BB9\uFF1A\u4E0D\u8BA4\u8BC6 / \u8D8A\u754C = \u90A3\u4E00\u9879\u9ED8\u8BA4\n    const q = j.pad as Record<string, unknown>;\n    if (Number.isInteger(q.fifths) && Math.abs(q.fifths as number) <= 7) d.pad.fifths = q.fifths as number;\n    if (typeof q.scale === \"string\" && SCALES.some((sc) => sc.id === q.scale)) d.pad.scale = q.scale;\n    if (PAD_UNITS.includes(q.unit as PadUnit)) d.pad.unit = q.unit as PadUnit;\n    if (q.tuplet === 3 || q.tuplet === 5 || q.tuplet === 6 || q.tuplet === 7) d.pad.tuplet = q.tuplet;\n    if (Number.isInteger(q.low) && (q.low as number) >= 0 && (q.low as number) <= 127) d.pad.low = q.low as number;\n  }\n  if (j.ref && typeof j.ref === \"object\") {   // \u53C2\u8003\u7A97\u7684\u7A97\uFF1A\u56DB\u4E2A\u6570\u90FD\u5F97\u662F\u6709\u9650\u7684\u6570\uFF0C\u4E0D\u7136\u6574\u4E2A\u5F53\u6CA1\u6709\uFF08\u7A97\u6309\u5E93\u7684\u9ED8\u8BA4\u4F4D\u7F6E\u5F00\uFF09\n    const r = j.ref as Record<string, unknown>, n = (v: unknown) => typeof v === \"number\" && Number.isFinite(v);\n    if (n(r.left) && n(r.top) && n(r.width) && n(r.height)) d.ref = { open: r.open === true, left: r.left as number, top: r.top as number, width: r.width as number, height: r.height as number };\n  }\n  return d;\n}\n", "// sel-bar.ts \u2014\u2014 \u9009\u533A\u6761\uFF1A\u6709\u9009\u533A\u65F6\u6302\u5728\u8D70\u5E26\u80F6\u56CA\u4E0B\u9762\u7684\u4E00\u6761\uFF08\u7167 WeebPaint \u7684\u4E0A\u4E0B\u6587\u6761\uFF09\uFF1A\u5168\u9009 / \u590D\u5236 / \u526A\u5207 / \u7C98\u8D34 / \u64CD\u4F5C\u2026\uFF08\u9009\u533A\u83DC\u5355\uFF1A\u79FB\u8C03 / \u8F6C\u8C03 / \u65F6\u503C\u2026\uFF09/ \u4FEE / \u5220 / \u2715\u3002created 2026-10-08 by Claude Fable 5.1\n//   user 2026-10-08\u300C\u6709\u9009\u533A\u65F6\uFF0C\u80F6\u56CA\u4E0B\u9762\u51FA\u4E00\u6761\u9009\u533A\u6761\u2026\u5BF9\u300D\u300C\u5FEB\u6377\u952E\u5176\u5B9E\u73B0\u5728\u6211\u90FD\u6CA1\u7528\u8FC7\u300D\uFF08\u89E6\u5C4F\u4F18\u5148\uFF1B\u5FEB\u6377\u952E\u53EA\u662F\u987A\u624B\uFF09\u3002\n//   \u6CA1\u9009\u533A\u4F46\u526A\u8D34\u677F\u91CC\u6709\u4E1C\u897F = \u53EA\u9732\u300C\u7C98\u8D34 / \u2715\u300D\uFF08\u8D34\u5728\u5149\u6807\u5904\uFF1B\u2715 = \u5FD8\u6389\u526A\u8D34\u677F\uFF09\u3002\u8BB0\u53F7\uFF08\u8DF3\u97F3 / \u547C\u5438\u2026\uFF09\u4EE5\u540E\u4E5F\u8FDB\u8FD9\u91CC\uFF08user\u300C\u5199\u5B8C\u6539\u7684\u300D\uFF09\u3002\nimport { iconHtml } from \"./icon.ts\";\nimport { ARTS, DYNS, type Art, type Dyn } from \"../score/song.ts\";\n\nexport type SelVerb = \"all\" | \"copy\" | \"cut\" | \"paste\" | \"transpose\" | \"delete\" | \"clear\" | \"forget\"\n  | \"up\" | \"down\" | \"sharp\" | \"flat\" | \"octUp\" | \"octDown\" | \"half\" | \"double\" | \"dot\";   // \u7B2C\u4E8C\u6392 = \u5FAE\u8C03\uFF08v0.10.1\uFF1Buser\u300C\u9009\u533A\u591A\u5FAE\u8C03\u540C\u610F\u300D= \u8BBE\u8BA1\u7A3F\u65B9\u6848 A\uFF09   // \u300C\u4FEE\u300D2026-10-08 \u53BB\u6389\uFF08user\u300C\u4E5F\u8BB8\u4E0D\u8981\u4FEE\u8FD9\u4E2Aui\u5165\u53E3\uFF0C\u7B26\u53F7\u952E\u76D8\u627F\u91CD\u300D\uFF09\uFF1A\u6F14\u594F\u6CD5 / \u8FDE\u7EBF / \u529B\u5EA6\u90FD\u5728 pad \u7B26\u53F7\u5C42\uFF08\u6709\u9009\u533A = \u6574\u7EC4\uFF09\n/** \u300C\u4FEE\u300D\uFF082026-10-08 by Claude Opus 5.5\uFF1Buser \u62CD\u300C\u6302\u5728\u97F3\u4E0A + \u9009\u533A\u6761\u300D\uFF09\uFF1A\u9009\u533A\u6761\u539F\u5730\u6362\u6210\u4E00\u6392\u5F00\u5173\u2014\u2014\u6F14\u594F\u6CD5\uFF08\u9009\u4E2D\u7684\u97F3\u90FD\u6709 = \u4EAE\uFF1B\u6709\u7684\u6709 = \u534A\u4EAE\uFF09+ \u529B\u5EA6\uFF08\u9009\u533A\u5F00\u5934\u90A3\u513F\u5199\u7740\u7684\u4EAE\uFF09\u3002 */\nexport interface FixState { art: Record<Art, \"all\" | \"some\" | \"none\">; slur?: \"all\" | \"some\" | \"none\"; ignores?: readonly string[] }   // ignores = \u53F0\u4E0A\u90A3\u4F4D\u4E0D\u8BA4\u7684\uFF08\u94AE\u4E0A\u6807\u300C\u4E0D\u8BA4\u300D\uFF0C\u7167\u6837\u80FD\u5199\uFF09\uFF1Bslur = \u8FDE\u7EBF\uFF082026-10-08 \u8FDE\u65AD\uFF09\n/** \u6E10\u5F3A / \u6E10\u5F31\u7684\u94AE\u9762\uFF1A< / >\uFF08\u4E24\u6761\u7EBF\uFF09\u3002 */\nexport const CRESC_SVG = `<svg class=\"slur-ico\" viewBox=\"0 0 22 12\" aria-hidden=\"true\"><path d=\"M20,2 L3,6 L20,10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\nexport const DIM_SVG = `<svg class=\"slur-ico\" viewBox=\"0 0 22 12\" aria-hidden=\"true\"><path d=\"M2,2 L19,6 L2,10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n/** \u8FDE\u7EBF\u7684\u94AE\u9762\uFF1A\u4E00\u9053\u5F27\uFF08SMuFL \u6CA1\u6709\u5355\u4E2A\u8FDE\u7EBF\u5B57\u5F62\uFF09\u3002 */\nexport const SLUR_SVG = `<svg class=\"slur-ico\" viewBox=\"0 0 22 12\" aria-hidden=\"true\"><path d=\"M2,9 Q11,1 20,9\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\"/></svg>`;\nconst ART_LABEL: Record<Art, [string, string]> = { swellUp: [\"<\", \"\u97F3\u5185\u6E10\u5F3A\"], swellDown: [\">\", \"\u97F3\u5185\u6E10\u5F31\"], swellBoth: [\"<>\", \"\u97F3\u5185\u9F13\u8D77\"], arpeggio: [\"\\u{EAA9}\", \"\u7436\u97F3\"], staccato: [\"\\u{E4A2}\", \"\u8DF3\u97F3\"], accent: [\"\\u{E4A0}\", \"\u91CD\u97F3\"], marcato: [\"\\u{E4AC}\", \"\u5F3A\u97F3\"], sfz: [\"\\u{E539}\", \"\u7A81\u5F3A\"], fp: [\"\\u{E534}\", \"\u5F3A\u540E\u5F31\"], tenuto: [\"\\u{E4A4}\", \"\u4FDD\u6301\"], breath: [\"\\u{E4CE}\", \"\u547C\u5438\"], stress: [\"\\u{E4B6}\", \"\u6B21\u91CD\u97F3\"], unstress: [\"\\u{E4B8}\", \"\u5F31\u5316\"], ghost: [\"\\u{E0F5}\\u{E0A4}\\u{E0F6}\", \"\u5E7D\u7075\u97F3\"], whisper: [\"\\u{E0A9}\", \"\u6C14\u58F0\"] };\nconst DYN_GLYPH: Record<Dyn, string> = { ppp: \"\\u{E52A}\", pp: \"\\u{E52B}\", p: \"\\u{E520}\", mp: \"\\u{E52C}\", mf: \"\\u{E52D}\", f: \"\\u{E522}\", ff: \"\\u{E52F}\", fff: \"\\u{E530}\" };\nexport interface SelBarHost { verb(v: SelVerb): void }\n\nexport class SelBar {\n  readonly el: HTMLDivElement;\n  constructor(parent: HTMLElement, host: SelBarHost) {\n    this.el = document.createElement(\"div\"); this.el.className = \"sel-bar\"; this.el.hidden = true;\n    parent.append(this.el);\n    this.el.addEventListener(\"pointerdown\", (e) => e.stopPropagation());   // \u522B\u8BA9\u8C31\u9762\u628A\u8FD9\u4E00\u4E0B\u5F53\u70B9\u8C31\n    this.el.addEventListener(\"click\", (e) => { const v = (e.target as HTMLElement).closest<HTMLElement>(\"[data-v]\")?.dataset.v as SelVerb | undefined; if (v) host.verb(v); });\n  }\n  /** \u753B\uFF1Asel = \u6709\u6CA1\u6709\u9009\u533A\uFF08\u51E0\u4E2A token\uFF09\uFF1Bclip = \u526A\u8D34\u677F\u91CC\u6709\u6CA1\u6709\u4E1C\u897F\uFF1Bover = \u522B\u7684\u5168\u5C4F\u89C6\u56FE\u76D6\u7740\uFF08\u85CF\uFF09\uFF1Bfix = \u300C\u4FEE\u300D\u5F00\u7740\uFF08\u90A3\u4E00\u6392\u5F00\u5173\u7684\u72B6\u6001\uFF09\u3002 */\n  update(sel: number, clip: boolean, over: boolean): void {\n    if (over || (!sel && !clip)) { this.el.hidden = true; return; }\n    const b = (v: SelVerb, label: string, icon?: string, cls = \"\") => `<button type=\"button\" class=\"btn ${cls}\" data-v=\"${v}\">${icon ? iconHtml(icon) : \"\"}<span>${label}</span></button>`;\n    // \u7B2C\u4E8C\u6392\uFF1A\u5FAE\u8C03\uFF08\u70B9\u4E86\u4E0D\u6536\u3001\u9009\u533A\u7559\u7740\u3001\u53EF\u4EE5\u8FDE\u7740\u70B9\uFF1B\u6BCF\u4E00\u4E0B\u4E00\u6B65\u64A4\u9500\uFF09\u2014\u2014\u89E6\u5C4F\u4E0A\u4E0D\u62D6\u4E5F\u80FD\u6539\u9AD8\u4F4E\u957F\u77ED\uFF08user\u300C\u65E2\u7136\u62D6\u52A8\u8D85\u7EA7\u5BB9\u6613\u8BEF\u89E6\u2026\u9009\u4E2D\u4E00\u4E2A\u6216\u8005\u51E0\u4E2A\u97F3\u7684\u65F6\u5019\u51FA\u5C0F\u63A7\u4EF6\u300D\u2192\u300C\u9009\u533A\u591A\u5FAE\u8C03\u540C\u610F\u300D\uFF09\n    const t = (v: SelVerb, label: string, title: string) => `<button type=\"button\" class=\"btn sel-tw\" data-v=\"${v}\" title=\"${title}\">${label}</button>`;\n    const tweak = `<div class=\"sel-row sel-tweak\">${t(\"up\", \"\u2191\", \"\u5F80\u4E0A\u4E00\u7EA7\uFF08\u8C03\u5185\uFF09\")}${t(\"down\", \"\u2193\", \"\u5F80\u4E0B\u4E00\u7EA7\uFF08\u8C03\u5185\uFF09\")}${t(\"sharp\", \"\u266F\", \"\u5347\u534A\u97F3\")}${t(\"flat\", \"\u266D\", \"\u964D\u534A\u97F3\")}` +\n      `${t(\"octUp\", \"\u21918\", \"\u9AD8\u516B\u5EA6\")}${t(\"octDown\", \"\u21938\", \"\u4F4E\u516B\u5EA6\")}<span class=\"sel-gap\"></span>${t(\"half\", \"\u00F72\", \"\u65F6\u503C\u51CF\u534A\")}${t(\"double\", \"\u00D72\", \"\u65F6\u503C\u52A0\u500D\")}${t(\"dot\", \"\u9644\u70B9\", \"\u52A0\u9644\u70B9\uFF08\u90FD\u6709\u9644\u70B9 = \u53BB\u6389\uFF09\")}</div>`;\n    this.el.classList.toggle(\"has-tweak\", !!sel);\n    const row1 = `<span class=\"sel-n\">${sel} \u4E2A</span>` + b(\"all\", \"\u5168\u9009\") + b(\"copy\", \"\u590D\u5236\") + b(\"cut\", \"\u526A\u5207\") + (clip ? b(\"paste\", \"\u7C98\u8D34\") : \"\") + b(\"transpose\", \"\u64CD\u4F5C\u2026\") + b(\"delete\", \"\u5220\", \"trash-can\", \"danger\") + b(\"clear\", \"\", \"x\");\n    this.el.innerHTML = sel ? `<div class=\"sel-row\">${row1}</div>${tweak}` : b(\"paste\", \"\u7C98\u8D34\u5230\u5149\u6807\u5904\") + b(\"forget\", \"\", \"x\");\n    this.el.hidden = false;\n  }\n}\n"],
  "mappings": "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",
  "names": ["st", "a", "d", "str", "latin1", "i", "l", "ar", "ai", "w", "n", "c", "r", "_a", "s", "o", "p", "f", "m", "oe", "e", "z", "sc", "su", "no", "b", "x", "eb", "j", "cd", "le", "co", "sv", "nt", "sl", "lm", "dbt", "t", "tl", "lt", "t2", "i0", "i1", "i2", "tr", "cl", "cf", "lf", "li", "_b", "ll", "it", "nl", "ti", "k", "cr", "lv", "fl", "h", "op", "es", "ex", "u", "ce", "y", "l", "d", "p", "n", "s", "i", "ns", "e", "w", "h", "j", "rs", "ts", "ti", "tr", "tg", "tb", "ap", "tl", "y", "s0", "t0", "cj", "to", "x", "al", "decode", "fd", "nz", "text", "crc", "D", "o", "C", "I", "A", "r", "G", "f", "a", "t", "k", "N", "g", "F", "b", "P", "J", "K", "m", "H", "O", "Q", "B", "u", "L", "M", "z", "E", "c", "q", "ri", "ci", "sw", "sh", "cr", "cc", "row", "ii", "sb", "tw", "th", "si", "oa", "er", "ne", "ni", "ce", "err", "S", "nd", "cd", "nc", "encode", "ac", "sl", "nw", "nh", "nx", "ny", "it", "max", "r0", "r1", "cx", "cy", "le", "te", "ln", "rn", "d2", "i0", "i1", "R", "stats", "m2", "iN", "il", "r", "k", "p", "sw", "e", "err", "p", "s", "m", "near", "a", "b", "k", "l", "now", "s", "p", "d", "degree", "base", "cands", "a", "b", "c", "midi", "o", "k", "t", "x", "ev", "i", "a", "b", "k", "e", "p", "n", "w", "to", "np", "c", "s", "at", "plain", "n", "t", "m", "m", "p", "ts", "t", "x", "at", "st", "p", "t", "n", "st", "i", "j", "t", "a", "b", "p", "m", "_a", "q", "nt", "degree", "c", "d", "f", "w", "x", "plain", "n", "id", "l", "at", "o", "k", "tk", "keep", "e", "flush", "h", "near", "mk", "r", "tm", "to", "on", "g", "base", "changed", "u", "nx", "st", "t", "on", "i", "nt", "nx", "st", "w", "t", "on", "u", "a", "toks", "i", "nt", "j", "st", "h", "i", "a", "d", "an", "nt", "k", "at", "id", "g", "j", "t", "p", "b", "q", "n", "st", "i", "t", "nt", "n2", "p", "half", "k", "e", "q", "f", "x", "id", "o", "d", "plain", "timed", "n", "now", "l", "st", "f", "nt", "changed", "i", "t", "d", "p", "k", "q", "j", "to", "a", "b", "n", "r", "c", "iv", "key", "cur", "tk", "id", "h", "u", "_", "x", "y", "m", "at", "c1", "c2", "_a", "mk", "sw", "text", "l", "o", "tt", "np", "on", "s", "T", "bar", "e", "k2", "pad", "text", "p", "i", "ws", "byName", "k", "m", "c", "at", "n", "ns", "a", "id", "s", "t", "m", "n", "g", "L", "w", "tb", "at", "bar", "b", "st", "k", "q", "ws", "p", "c", "i", "e", "row", "a", "on", "half", "cat", "spans", "st", "c", "now", "m", "c", "i", "w", "base", "id", "b", "x", "e", "st", "ch", "a", "b", "p", "h", "s", "id", "e", "m", "changed", "t", "a", "k", "s", "x", "y", "s", "a", "b", "c", "text", "i", "w", "n", "t", "st", "st", "i", "text", "p", "t", "j", "at", "k", "b", "o", "g", "n", "r", "s", "c", "t", "i", "b", "x", "y", "a", "b", "s0", "s1", "n", "k", "t0", "t1", "L", "base", "sw", "D", "a0", "a1", "m", "f", "p", "e", "lo", "o", "i", "j", "tl", "at", "x", "t", "to", "T", "ts", "l", "t", "i", "l", "p", "h", "a", "m", "note", "info", "n", "d", "c", "s", "l", "a", "x", "n", "t", "ao", "i", "p", "o", "d", "lo", "cands", "k", "it", "e", "b", "span", "to", "j", "r", "m", "wantsGrand", "t", "bar", "a", "x", "y", "i", "k", "ns", "n", "g", "d", "m", "st", "s", "j", "keyOf", "p", "e", "b", "id", "on", "h", "g", "i", "half", "k", "_", "r", "row", "rr", "d", "half", "r", "y", "a", "n", "b", "m", "c", "base", "o", "H", "i", "t", "measureLen", "rb", "head", "nt", "j", "chunks", "w", "u", "sp", "P", "k", "TOP", "autoBars", "s", "lines", "l", "ch", "max", "addPaper", "cw", "cx", "cy", "is", "ax", "cs", "rx", "as", "row", "lw", "tw", "h", "num", "nw", "f", "p", "x", "sw", "next", "id", "keyOf", "S", "trackOf", "ao", "q", "sl", "spans", "flush", "nR", "_", "sy", "lo", "ex", "e", "g", "G", "r0", "c0", "L", "r1", "tl", "ny", "ln", "y0", "ta", "rs", "tag", "ui", "seg", "s2", "ry", "ag", "near", "ng", "ly", "lx", "il", "ir", "iu", "rr", "sh", "SIG", "sz", "run", "group", "sx", "lv", "at", "th", "of", "R", "cl", "x2", "s0", "s1", "a0", "acc", "on", "per", "ci", "right", "shiftAt", "si", "T", "cc", "s", "p", "rx", "c", "m", "l", "L", "R", "W", "y", "k", "i", "b", "ctx", "s", "m", "i", "e", "h", "rd", "st", "t", "L", "at", "x", "w", "hint", "k", "next", "text", "s", "r", "nx", "p", "st2", "a", "d", "j", "sp", "t", "s", "m", "f", "n", "w", "x", "o", "r", "s", "c", "esc", "e", "ci", "i", "c", "row", "n", "_", "r", "a", "el", "i", "e", "it", "h", "s", "th", "w", "n", "h", "i", "r2", "c", "f", "_", "i", "e", "b", "a", "t", "st", "sc", "chip", "on", "h", "w", "L", "at", "m", "now", "e", "p", "L", "t", "m", "s", "sound", "s", "t", "w", "x", "n", "ch", "base", "num", "W", "b", "cw", "o", "m", "st", "DOUBLE_TAP_MS", "id", "el", "e", "h", "g", "a", "b", "sr", "z", "d", "p", "sp", "f", "base", "autoBars", "w", "t0", "r", "q", "kids", "k", "L", "clear", "row", "n", "x", "nh", "at", "y", "i", "pad", "pv", "now", "a0", "a1", "c0", "c1", "to", "sx", "m", "t", "s", "ok", "c", "ox", "next", "lt", "tx", "ty", "nl", "nt", "grab", "cx", "cy", "range", "ly", "cands", "view", "ch", "mk", "dy", "dx", "i0", "pr", "t", "el", "e", "n", "s", "id", "e", "a", "d", "n", "S", "M", "TOP", "i", "sx", "W", "cx", "_", "k", "el", "on", "m", "lo", "b", "id", "base", "g", "e", "w", "t", "half", "ak", "c", "ch", "body", "esc", "h", "keep", "sh", "ov", "row", "s", "ev", "q", "stk", "ex", "u", "r", "nr", "sw", "a", "H", "v", "ws", "midi", "b", "now", "s", "t", "id", "group", "h", "x", "id", "s", "sc", "k", "n", "midi", "g", "t", "h", "p", "f", "sc", "at", "k", "r", "a", "st", "x", "i", "cmd", "c", "id", "m", "f", "w", "r", "h", "x", "el", "it", "e", "b", "id", "r", "h", "i", "next", "t", "now", "s", "c", "s", "m", "t", "id", "el", "a", "b", "e", "x", "t", "s", "m", "k", "e", "h", "p", "k", "x", "a", "b", "i", "next", "t", "n", "d", "b", "err", "base", "e", "plain", "plain", "k", "s", "t", "s1", "a", "b", "base", "row", "r", "parse", "d", "e0", "e", "r", "plain", "ok", "e1", "ctx", "e", "x", "s", "r", "encode", "e0", "passBusy", "d", "h", "base", "m", "e", "dirty", "r", "now", "h", "n", "w", "d", "c", "a", "i", "h", "b", "s", "m", "mk", "passBusy", "e", "q", "r", "err", "p", "fileName", "now", "n", "it", "enc", "stamp", "isDirty", "dirty", "a", "b", "i", "e", "base", "f", "passBusy", "e", "encode", "r", "plain", "passBusy", "n", "errMsg", "e", "t", "i", "it", "b", "e", "n", "now", "e", "f", "k", "e", "m", "now", "x", "y", "a", "b", "A", "B", "e", "o", "f", "s", "p", "_", "e", "x", "encode", "decode", "run", "text", "f", "text", "e", "now", "env", "changed", "cb", "m", "id", "b", "cached", "it", "x", "entries", "a", "isDirty", "s", "f", "t", "n", "describe", "d", "cf", "dirty", "m", "k", "ctx", "e", "c", "p", "sf", "e", "q", "n", "ok", "r", "n", "m", "base", "a", "b", "e", "st", "it", "p", "c", "i", "l", "ci", "op", "n", "a", "e", "p", "r", "tx", "run", "e2", "t", "err", "finish", "s", "k", "c", "to", "g", "p", "view", "k", "to", "NO_KINDS", "k", "rev", "r", "n", "p", "now", "ws", "w", "run", "t", "a", "x", "e", "r", "j", "i", "finish", "p", "err", "i", "range", "now", "k", "e", "b", "p", "m", "lm", "s", "x", "a", "n", "t", "cands", "c", "h", "changed", "o", "r", "i0", "i1", "chunks", "_", "to", "next", "ns", "k", "m", "current", "t", "c", "ctx", "k", "ls", "ns", "ts", "s", "i", "cd", "entries", "p", "sm", "interpolate", "s", "m", "k", "base", "op", "ls", "k", "ui", "a", "err", "st", "ns", "enc", "n", "e", "m", "p", "x", "s", "q", "keep", "f", "b", "r", "d", "ev", "cb", "h", "c", "ctx", "e2", "o", "plain", "to", "t", "esc", "entries", "bytes", "cached", "d", "n", "ls", "i", "k", "r", "r", "body", "at", "p", "s", "r", "e", "err", "getToken", "body", "_", "next", "opts", "j", "o", "n", "st", "at", "cached", "it", "ir", "ls", "n", "i", "k", "env", "c", "l", "e", "err", "p", "cb", "st", "_", "s", "r", "cached", "w", "it", "body", "g", "cb", "st", "i", "i", "a", "b", "s", "i", "ts", "d", "b", "base", "p", "basename", "m", "it", "h", "apply", "f", "frame", "REAL_TIMERS", "h", "now", "f", "record", "KEY", "x", "e", "record", "tag", "pad", "n", "w", "t", "d", "g", "entries", "e", "id", "x", "p", "STORE", "run", "tx", "s", "f", "o", "ts", "m", "n", "at", "it", "d", "a", "b", "p", "it", "d", "g", "requireStore", "s", "a", "b", "f", "cb", "st", "e", "d", "stemOf", "nn", "note", "r", "ctx", "f", "a", "b", "base", "n", "dirty", "del", "rn", "tx", "enc", "ok", "m", "k", "n", "db", "e1", "tx", "run", "d", "t", "s", "r", "c", "now", "e", "c", "n", "i", "t", "n", "c", "k", "to", "p", "b", "s", "d", "l", "tk", "text", "body", "o", "sw", "sh", "tw", "th", "r", "g", "b", "a", "p", "av", "o", "w", "h", "k", "i", "f", "c", "now", "e", "c", "n", "d", "s", "n", "err", "c", "i", "row", "im", "ot", "e", "el", "d", "h", "info", "a", "it", "enc", "u", "err", "factsOf", "ab", "u8", "entries", "view", "loading", "f", "nm", "p", "r", "im", "o", "k", "x", "ev", "s", "st", "L", "l", "el", "tp", "e", "_mem", "_ls", "ls", "deviceKvGet", "k", "deviceKvSet", "n", "ls", "_ls", "i", "k", "_mem", "e", "err", "m", "tag", "deviceKvGet", "deviceKvSet", "w", "padEl", "g", "st", "id", "now", "t", "r", "s", "ri", "w", "x", "i", "p", "sp", "n", "a", "at", "c", "nx", "pad", "k", "np", "u", "mk", "on", "range", "i", "tl", "base", "x", "a", "b", "e", "m", "t", "j", "u", "s", "n0", "last", "midi", "k", "TEXT", "c", "s", "s", "h", "i", "n", "l", "p", "m", "w", "ev", "q", "e", "k", "err", "id", "j", "tag", "models", "ok", "op", "x", "progress", "e2", "d", "s", "n", "l", "i", "b", "a", "sr", "ok", "w", "ev", "e", "s", "i", "c", "n", "a", "x", "o", "id", "body", "h", "f", "i", "p", "o", "w", "H", "t", "x", "y", "s0", "s1", "a", "b", "c", "d", "e", "f", "g", "h", "ch", "t1", "t2", "pad", "bits", "lo", "n", "keyOf", "p", "b", "o", "m", "c", "r", "n", "i", "a", "ok", "base", "progress", "f", "x", "h", "s", "st", "b", "x", "m", "c", "r", "k", "n", "b", "o", "info", "id", "p", "k", "s", "i", "n", "at", "u16", "nP", "w", "g", "a", "nS", "j", "r", "m", "ib", "u32", "ns", "d", "pad", "c", "body", "sha256Hex", "b", "x", "o", "e", "base", "rd", "b", "sha256Hex", "err", "g", "x", "k", "g", "p", "k", "n", "KANA", "HAN", "LATIN", "ls", "t", "l", "i", "decode", "s", "m", "e", "esc", "c", "i", "lt", "text", "j", "el", "a", "k", "base", "p", "t", "m", "d", "n", "el", "tn", "w", "h", "k", "sd", "a", "b", "text", "esc", "c", "ct", "s", "cr", "ly", "co", "ty", "id", "F", "oc", "H", "i", "j", "u", "pv", "nx", "x", "num", "ci", "cp", "cx", "P", "sp", "si", "note", "nn", "ar", "e", "sl", "info", "body", "rp", "en", "cl", "cn", "f", "os", "na", "g", "al", "q", "l", "tx", "keep", "next", "K", "x", "n", "H", "W", "o", "i", "s0", "s1", "a", "b", "c", "d", "e", "f", "g", "h", "ch", "t1", "t2", "s", "text", "o", "p", "id", "studio", "r", "i", "cands", "c0", "c", "common", "p", "k", "m", "x", "MIGRATIONS", "SOUNDS", "id", "c", "i", "nextKey", "x", "k", "o", "a", "entries", "studio", "m", "t", "p", "w", "sw", "f", "out", "ns", "s0", "j", "at", "now", "s", "y", "r", "_f", "b", "sound", "withTrack", "sd", "ia", "ib", "g", "n", "keep", "r0", "changed", "d", "num", "dflt", "clamp", "on", "e", "parse", "h", "nr", "cands", "r", "c", "k", "s", "i", "y", "performers", "tsukuyomi", "l", "ex", "p", "m", "s", "i", "n", "_", "b", "lo", "f", "Q", "sr", "w", "cs", "sn", "A", "b2", "a0", "a1", "a2", "s", "x", "n", "i", "y", "p", "g", "k", "d", "on", "q", "b", "c1", "s1", "c2", "s2", "nr", "ni", "id", "L", "R", "T", "K", "t", "env", "a", "max", "D", "rd", "oL", "oR", "c", "rp", "ri", "dbToLin", "x", "i", "a", "s", "f", "g", "p", "id", "l", "r", "c", "on", "lv", "b", "n", "w", "_", "k", "m", "t", "au", "entries", "e", "next", "tl", "o", "at", "t0", "cl", "cr", "L", "R", "u", "sd", "sl", "sr", "tt", "sr2", "ch", "nn", "es", "d", "span", "y", "near", "to", "st", "sp", "T", "i", "s", "o", "c", "ok", "ctx", "ev", "cb", "r", "e", "m", "b", "p", "w", "ws", "h", "id", "t", "tl", "sr", "i16", "k", "at", "ts", "on", "L", "R", "n", "p", "engine", "m", "chip", "sc", "x", "l", "t", "rn", "e", "n", "c", "s", "w", "k", "a", "b", "text", "t", "l", "at", "k", "i", "ls", "t0", "t1", "q", "m", "p", "midi", "n", "f", "chunks", "to", "s", "tl", "info", "x", "te", "e", "segsOf", "span", "near", "cands", "sg", "T", "ctx", "id", "info", "n", "m", "g", "r", "c", "sha256Hex", "b", "x", "base", "k", "e", "cat", "self", "s", "row", "m", "ls", "l", "note", "j", "zh", "nt", "oc", "ch", "q", "n", "a", "put", "id", "f", "i", "tag", "t", "w", "y", "g", "h", "ctx", "id", "info", "n", "x", "y", "engine", "m", "esc", "chip", "dynTable", "sp", "tr", "midi", "L", "k", "lo", "al", "oc", "text", "c", "rn", "on", "d", "next", "ctx", "_a", "_b", "pv", "p", "cat", "s", "g", "e", "m", "lo", "t", "q", "x", "ctx", "b", "engine", "c", "o", "tl", "u", "f", "i", "c", "chunks", "a", "b", "n", "now", "z", "n", "r", "s", "f", "w", "st", "s", "record", "h", "now", "at", "t", "next", "a", "b", "p", "k", "d", "engine", "singer", "view", "progress", "info", "showError", "renderBar", "playBtns", "playIcon", "offerFile", "ensureVowels", "soundMemoryBytes", "creditsOf", "creditsBlock", "x", "c", "st", "pv", "id", "curRole", "docName", "playSong", "curFlat", "s", "songIn", "audibleParts", "micOf", "channelOf", "tl", "pushChannels", "lowestMidiOf", "songBpm", "performerInfo", "t", "p", "k", "e", "i", "refreshIssues", "next", "o", "r", "BUDGET", "keep", "resourceSnapshot", "text", "n", "a", "u", "renderMixForTest", "m", "to", "b", "tickOfCaret", "at", "DOUBLE_TAP_MS", "playPause", "now", "playFromHead", "resumePlay", "stopPlay", "playFromHere", "playSeam", "schedulePrewarm", "setLoop", "on", "TURN_LEADS", "resetLatencyLog", "ak", "schedulePlaybackRefresh", "prepareBank", "g", "exportRights", "f", "Q", "mp3SizeText", "exportSong", "tag", "jumpPlaybackToPaper", "span", "previewTrack", "onSongSwitch", "p", "next", "k", "r", "e", "esc", "s", "c", "m", "e", "on", "o", "cat", "p", "x", "t", "row", "el", "id", "g", "k", "body", "lr", "w", "note", "k", "f", "re", "im", "n", "i", "j", "cr", "ci", "a", "b", "tr", "ti", "x", "sr", "w", "half", "m", "span", "lo", "e", "t", "next", "o", "y", "d", "p", "d", "a", "b", "e", "r1", "x", "c", "t", "k", "lo", "L", "H", "w", "s", "view", "esc", "s", "c", "hint", "t", "e", "now", "r", "q", "L", "R", "n", "lr", "ll", "rr", "i", "l", "r", "m", "s", "x", "y", "k", "f", "d", "esc", "s", "c", "p", "d", "x", "HINT", "Studio", "e", "tg", "f", "t0", "es", "id", "el", "cl", "i", "o", "h", "k", "sr", "b", "L", "R", "g", "n", "lv", "a", "ty", "_", "eq", "t", "now", "text", "next", "bar", "rb", "rv", "w", "to", "sl", "ch", "nx", "view", "m", "base", "fresh", "sd", "note", "clip", "body", "cs", "pad", "H", "ab", "TYPES", "e", "f", "h", "w", "now", "it", "cb", "lq", "p", "CLIENT_ID", "AUTHORITY", "SCOPES", "MSAL_URL", "esc", "s", "c", "note", "a", "esc", "r", "e", "m", "c", "i", "t", "b", "id", "base", "q", "r", "err", "n", "u8", "i", "c", "r", "b", "base", "plain", "iv", "ct", "n", "k", "err", "window", "e", "fileName", "guid", "text", "g", "CLIENT_ID", "SCOPES", "AUTHORITY", "MSAL_URL", "id", "deviceKvGet", "isSignedIn", "g", "plain", "h", "deviceKvSet", "s", "t", "n", "d", "e", "g", "M", "r", "W", "K", "i", "et", "l", "ec", "s", "o", "a", "c", "u", "te", "tr", "td", "t2", "p", "h", "y", "b", "_", "S", "C", "k", "f", "m", "x", "w", "n2", "T", "N", "A", "lc", "r1", "en", "Q", "$", "B", "el", "R", "O", "I", "D", "F", "j", "U", "q", "G", "J", "X", "ee", "Z", "Y", "er", "ei", "ln", "P", "od", "E", "iconHtml", "CJK", "esc", "x", "c", "m", "t", "n", "h", "run", "i", "p", "bar", "f", "a", "s", "d", "to", "e", "t", "setLoop", "on", "n", "tag", "o", "i", "u8", "isPng", "f", "d", "iconHtml", "ok", "id", "e", "isSignedIn", "o", "deviceKvGet", "p", "deviceKvSet", "gallery", "b", "fmtTime", "s", "k", "r", "g", "n", "t", "m", "w", "h", "on", "a", "e", "ok", "r", "n", "c", "s", "ok", "p", "x", "c", "i", "n", "e", "id", "s", "to", "next", "o", "on", "f", "t", "n", "o", "c", "r", "id", "x", "e", "n", "id", "a", "e", "d", "r", "base", "st", "t", "c", "t0", "on", "ev", "x", "text", "w", "h", "o", "l", "setTitle", "b", "it", "i", "s", "ip", "lo", "cw", "ch", "clamp", "to", "m", "content", "ty", "tx", "p", "q", "ro", "next", "g", "sx", "sy", "f", "now", "W", "H", "ctx", "v", "changed", "cs", "o", "k", "m", "e", "base", "STEPS", "x", "it", "tx", "ty", "ok", "n", "stamp", "at", "s", "c", "a", "b", "item", "w", "h", "c", "cx", "UPNG", "t", "f", "ok", "a", "t", "p", "r", "d", "d", "el", "fileInput", "rev", "o", "e", "cd", "text", "n", "r", "q", "k", "it", "x", "p", "b", "enc", "s", "i", "c", "d", "t", "cmd", "cx", "cy", "sx", "sy", "n", "a", "b", "e", "x", "y", "chunks", "body", "em", "H", "o", "p", "g", "ch", "k", "cp", "tm", "sc", "base", "W", "j", "ws", "u", "p2", "ao", "c", "s", "a", "g", "d", "t", "i", "cmd", "cx", "cy", "sx", "sy", "n", "a", "b", "c", "e", "x", "y", "sp", "autoBars", "L", "s", "W", "H", "k", "em", "p", "ox", "st", "ch", "w", "u16", "b", "o", "n", "i", "r", "tag", "t", "so", "s", "k", "cp", "lo", "hi", "g", "a", "e", "ro", "span", "keep", "x", "p", "q", "text", "ch", "nd", "m", "base", "f", "skipped", "lk", "st", "ty", "c", "nr", "nb", "ni", "na", "y", "d", "b", "id", "r", "text", "ta", "ok", "n", "e", "range", "f", "a", "w", "h", "n", "y", "UPNG", "r", "st", "t", "h", "a", "to", "at", "b", "p", "d", "degree", "n", "s", "f", "body", "ly", "k", "text", "id", "i", "w", "r", "tm", "m", "c", "t0", "e", "a", "b", "st", "next", "o", "record", "r", "c", "s", "m", "x", "a", "b", "next", "s", "n", "t", "fileName", "stemOfId", "id", "base", "e", "h", "now", "p", "to", "r", "leave", "o", "p", "e", "w", "id", "t0", "err", "BLOCKED_TIMEOUT_MS", "deleteDbOrBlocked", "r", "d", "e", "ls", "d", "id", "p", "j", "q", "sc", "r", "n", "e", "clip", "b", "iconHtml", "t", "D", "next", "r", "H", "es", "id", "o", "to", "esc", "sizeText", "e", "deviceKvSet", "p", "sp", "a", "t", "n", "s", "now", "i", "$", "q", "av", "keep", "d", "el", "h", "m", "k", "l", "nx", "ch", "channelOf", "pad", "at", "row", "w", "sw", "on", "tk", "g", "c", "ui", "text", "x", "b", "f", "humOpt", "audibleParts", "micOf", "lowestMidiOf", "songBpm", "changed", "y", "chip", "note", "er", "is", "cached", "u", "err", "op", "withTrack", "isSignedIn", "D", "c", "pad", "g", "s", "al", "k", "sk", "id", "r", "p", "cat", "sha256Hex", "e", "sp", "x", "pct", "m", "d", "esc", "j", "n", "a", "to", "sound", "$", "Studio", "micOf", "on", "lowestMidiOf", "songBpm", "withTrack", "t", "b", "next", "ui", "cl", "sr", "ta", "rt", "z", "q", "HUMS", "fl", "i", "chunks", "humOpt", "lm", "ly", "ok", "at", "cands", "w", "h", "y", "f", "lo", "nx", "an", "nameOf", "chip", "now", "tm", "u", "row", "cmd", "err", "L", "rn", "rs", "sizeText", "tr", "note", "l", "nm", "ch", "o", "H", "base", "text", "_", "keep", "audibleParts", "isSignedIn", "is", "es", "deviceKvGet", "deviceKvSet", "t0", "ts"]
}
