uni-answer-sheet 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2260 @@
1
+ var Ft = Object.defineProperty;
2
+ var Kt = (t, e, r) => e in t ? Ft(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r;
3
+ var Tt = (t, e, r) => Kt(t, typeof e != "symbol" ? e + "" : e, r);
4
+ const vt = ["pagination", "content-identity", "choice-fill", "answer-regions", "html-codec", "status"];
5
+ function zt(t) {
6
+ const e = t.filter((n) => n?.kind === "answer-sheet-editor");
7
+ if (e.length !== 1) throw new Error("请显式注册一个富文本插件:plugins: [createEditorPlugin()]");
8
+ const r = e[0];
9
+ if (r.apiVersion !== 1 || r.documentVersion !== 1 || vt.some((n) => !r.capabilities?.includes(n)) || typeof r.prepare != "function" || typeof r.create != "function" || typeof r.validateDocument != "function" || typeof r.html?.parse != "function" || typeof r.html?.serialize != "function") throw new Error("富文本插件协议不兼容,需要支持制卡协议 v1 的 uni-editor/plugin");
10
+ return r;
11
+ }
12
+ function $t(t) {
13
+ const e = [], r = (n) => {
14
+ if (n.type === "choiceGroup") {
15
+ typeof n.attrs?.id == "string" && e.push({
16
+ id: n.attrs.id,
17
+ label: n.attrs.label || String(e.length + 1),
18
+ options: (n.content || []).map((o, s) => ({ id: o.attrs?.id, label: String.fromCharCode(65 + s) })).filter((o) => typeof o.id == "string")
19
+ });
20
+ return;
21
+ }
22
+ n.content?.forEach(r);
23
+ };
24
+ return r(t.content), e;
25
+ }
26
+ class Ct extends Error {
27
+ constructor(e, r) {
28
+ super(r), this.path = e;
29
+ }
30
+ }
31
+ const B = (t, e) => {
32
+ throw new Ct(t, e);
33
+ }, ot = {
34
+ 语文: "CHINESE",
35
+ 数学: "MATHS",
36
+ 英语: "ENGLISH",
37
+ 科学: "SCIENCE",
38
+ 物理: "PHYSICAL",
39
+ 化学: "CHEMICAL",
40
+ 生物: "BIOLOGICAL",
41
+ 地理: "GEOGRAPHIC",
42
+ 历史: "HISTORY",
43
+ 政治: "POLITICAL",
44
+ 思想政治: "POLITICAL",
45
+ 道德与法治: "POLITICAL",
46
+ 信息科技: "IT",
47
+ 信息技术: "IT",
48
+ 日语: "JAPANESE"
49
+ }, Wt = {
50
+ P: ["语文", "数学", "英语", "科学", "道德与法治"],
51
+ J: ["语文", "数学", "英语", "物理", "化学", "生物", "地理", "历史", "道德与法治", "信息科技"],
52
+ S: ["语文", "数学", "英语", "物理", "化学", "生物", "政治", "历史", "地理", "信息技术", "日语"]
53
+ }, Vt = ["一年级", "二年级", "三年级", "四年级", "五年级", "六年级", "初一", "初二", "初三", "高一", "高二", "高三"], Qt = Vt.map((t, e) => {
54
+ const r = e < 6 ? "P" : e < 9 ? "J" : "S";
55
+ return { label: t, value: `${r}0${e < 6 ? e + 1 : (e - 6) % 3 + 1}`, classify: r };
56
+ }), z = (t, e) => typeof t == "string" && t.trim() ? t.trim() : B(e, "字典编码和名称必须是非空字符串"), tt = (t, e) => t && typeof t == "object" && !Array.isArray(t) ? t : B(e, "字典必须是对象"), Lt = (t) => t.classify || (/^[PJS]/.test(t.value) ? t.value[0] : void 0);
57
+ function _t(t = {}) {
58
+ const e = tt(t, "dictionaries"), r = (l, u) => {
59
+ if (!Array.isArray(l)) return B(u, "字典选项必须是数组");
60
+ const g = /* @__PURE__ */ new Set();
61
+ return l.map((A, C) => {
62
+ const x = tt(A, `${u}.${C}`), M = z(x.value, `${u}.${C}.value`), T = z(x.label, `${u}.${C}.label`);
63
+ return g.has(M) && B(`${u}.${C}.value`, "字典编码重复"), g.add(M), { ...x, value: M, label: T };
64
+ });
65
+ }, n = r(e.grades === void 0 ? Qt : e.grades, "dictionaries.grades").map((l, u) => (l.classify !== void 0 && !["P", "J", "S"].includes(String(l.classify)) && B(`dictionaries.grades.${u}.classify`, "学段为 P、J 或 S"), { value: l.value, label: l.label, classify: l.classify })), o = e.gradeCourseMap === void 0 ? void 0 : tt(e.gradeCourseMap, "dictionaries.gradeCourseMap"), s = e.courseCodeToSubjectCode === void 0 ? {} : tt(e.courseCodeToSubjectCode, "dictionaries.courseCodeToSubjectCode");
66
+ for (const [l, u] of Object.entries(s)) z(u, `dictionaries.courseCodeToSubjectCode.${l}`);
67
+ const c = /* @__PURE__ */ new Map(), i = Object.fromEntries(n.map((l) => {
68
+ const u = Lt(l), g = (u ? Wt[u] : []).map((x) => ({ value: ot[x], label: x, subjectCode: ot[x] })), A = `dictionaries.gradeCourseMap.${l.value}`, C = r(o ? o[l.value] ?? [] : g, A).map((x, M) => {
69
+ const T = s[x.value];
70
+ x.subjectCode !== void 0 && T !== void 0 && x.subjectCode !== T && B(`${A}.${M}.subjectCode`, "课程对应的学科编码冲突");
71
+ const O = z(x.subjectCode ?? T ?? (Object.values(ot).includes(x.value) ? x.value : void 0), `${A}.${M}.subjectCode`);
72
+ return c.has(x.value) && c.get(x.value) !== O && B(`${A}.${M}.subjectCode`, "同一课程不能对应不同学科"), c.set(x.value, O), x.custom !== void 0 && typeof x.custom != "boolean" && B(`${A}.${M}.custom`, "custom 必须是布尔值"), { value: x.value, label: x.label, subjectCode: O, ...x.custom === void 0 ? {} : { custom: x.custom } };
73
+ });
74
+ return [l.value, C];
75
+ })), a = n.filter((l) => i[l.value].length), y = e.defaultGradeCode === void 0 ? void 0 : z(e.defaultGradeCode, "dictionaries.defaultGradeCode"), b = a.find((l) => l.value === y)?.value || a[0]?.value || "", m = e.defaultCourseCode === void 0 ? void 0 : z(e.defaultCourseCode, "dictionaries.defaultCourseCode"), f = i[b] || [], p = f.find((l) => l.value === m)?.value || f[0]?.value || "";
76
+ return { grades: a, gradeCourseMap: i, defaultGradeCode: b, defaultCourseCode: p };
77
+ }
78
+ function ht(t, e, r) {
79
+ const n = t.grades.find((s) => s.value === e);
80
+ if (!n) return B("initialization.gradeCode", "年级不在可用字典中");
81
+ const o = t.gradeCourseMap[e]?.find((s) => s.value === r);
82
+ return o ? { grade: n.label, subject: o.label, gradeCode: e, courseCode: r, subjectCode: o.subjectCode, phaseCode: Lt(n) } : B("initialization.courseCode", "当前年级没有此课程");
83
+ }
84
+ function Be(t, e = {}) {
85
+ const n = t.grades.find((c) => c.value === e.gradeCode || !e.gradeCode && c.label === e.grade)?.value || t.defaultGradeCode, o = t.gradeCourseMap[n] || [], s = o.find((c) => c.value === e.courseCode || !e.courseCode && c.label === e.subject)?.value || (n === t.defaultGradeCode ? t.defaultCourseCode : o[0]?.value) || "";
86
+ return n && s ? ht(t, n, s) : { grade: "", subject: "", gradeCode: "", courseCode: "" };
87
+ }
88
+ function Dt(t) {
89
+ return t?.subjectCode || ot[t?.subject || ""];
90
+ }
91
+ const W = { questions: 200, options: 12, score: 15 }, je = (t) => t.multiple ? t.indefinite ? "indefinite" : "multiple" : "single", v = (t) => Number.isFinite(t) && Number.isInteger(t * 2), pt = (t) => !!(Dt(t) === "MATHS" && (t?.phaseCode ? t.phaseCode === "S" : t?.gradeCode ? t.gradeCode.startsWith("S") : /^高[一二三]/.test(t?.grade || "")));
92
+ function Jt(t) {
93
+ const e = typeof t.score == "number" && v(t.score) && t.score >= 0.5 && t.score <= W.score ? t.score : null, r = [...new Set(t.correctIds)].filter((n) => t.options.some((o) => o.id === n));
94
+ return {
95
+ ...t,
96
+ indefinite: !!(t.multiple && t.indefinite),
97
+ score: e,
98
+ scoreType: t.multiple && t.scoreType === "ITEM_SCORE" ? "ITEM_SCORE" : "LESS_SCORE",
99
+ lessScore: t.multiple && e !== null && v(t.lessScore ?? 0) ? Math.max(0, Math.min(e, t.lessScore ?? 0)) : 0,
100
+ correctIds: t.multiple ? r : r.slice(0, 1)
101
+ };
102
+ }
103
+ function St(t, e, r) {
104
+ let n = { ...t };
105
+ if (e.kind !== void 0) {
106
+ const o = e.kind !== "single";
107
+ o && !t.multiple && (n.scoreType = pt(r) ? "ITEM_SCORE" : "LESS_SCORE", typeof n.score != "number" && pt(r) && (n.score = 6)), n.multiple = o, n.indefinite = e.kind === "indefinite";
108
+ }
109
+ if (e.optionCount !== void 0) {
110
+ const o = Math.max(2, Math.min(W.options, Math.round(e.optionCount)));
111
+ n.options = Array.from({ length: o }, (s, c) => t.options[c] || { id: crypto.randomUUID(), label: String.fromCharCode(65 + c) });
112
+ }
113
+ return e.score !== void 0 && (n.score = e.score), e.scoreType !== void 0 && (n.scoreType = e.scoreType), e.lessScore !== void 0 && (n.lessScore = e.lessScore), Jt(n);
114
+ }
115
+ function kt(t) {
116
+ return typeof t.score == "number" && (!v(t.score) || t.score < 0.5 || t.score > W.score) ? "每题分值须为 0.5–15 分,按 0.5 分递增" : t.multiple && t.scoreType === "LESS_SCORE" && typeof t.score == "number" && (!v(t.lessScore ?? 0) || (t.lessScore ?? 0) < 0 || (t.lessScore ?? 0) > t.score) ? "少选得分须为 0.5 的倍数,且不能超过本题分值" : t.multiple && t.scoreType === "ITEM_SCORE" && typeof t.score == "number" && t.correctIds.length && !v(t.score / t.correctIds.length) ? "答案个数与分值不匹配,每个正确选项的得分须为 0.5 的倍数" : null;
117
+ }
118
+ function Ge(t) {
119
+ return t.multiple && t.scoreType === "ITEM_SCORE" && typeof t.score == "number" && t.correctIds.length && !kt(t) ? t.score / t.correctIds.length : null;
120
+ }
121
+ function Ue(t) {
122
+ const e = t.map((o) => Number(o.label)).filter((o) => Number.isSafeInteger(o) && o > 0 && o < 1e5);
123
+ let r = String(Math.max(0, ...e) + 1);
124
+ const n = new Set(t.map((o) => o.label));
125
+ for (; n.has(r); ) r = String(Number(r) + 1);
126
+ return r;
127
+ }
128
+ function Fe(t, e) {
129
+ const r = new Map(t.options.map((n) => [n.id, crypto.randomUUID()]));
130
+ return {
131
+ ...t,
132
+ id: crypto.randomUUID(),
133
+ label: e,
134
+ breakBefore: !1,
135
+ contentTarget: null,
136
+ options: t.options.map((n) => ({ ...n, id: r.get(n.id) })),
137
+ correctIds: t.correctIds.map((n) => r.get(n)).filter(Boolean)
138
+ };
139
+ }
140
+ function Xt(t, e, r) {
141
+ return r.trim() ? t.some((n) => n.id !== e && n.label.trim() === r.trim()) ? "题组内题号不能重复" : null : "题号不能为空";
142
+ }
143
+ function Ke(t, e, r, n) {
144
+ const o = t.questions.filter((a) => e.includes(a.id));
145
+ if (!o.length) return { error: "请选择要修改的题目" };
146
+ let s;
147
+ if (r.type === "settings") {
148
+ if (!Object.keys(r.patch).length) return { error: "请设置需要修改的属性" };
149
+ const { optionCount: a, score: y, lessScore: b } = r.patch;
150
+ if (a !== void 0 && (!Number.isInteger(a) || a < 2 || a > W.options)) return { error: "选项个数须为 2–12 的整数" };
151
+ if (typeof y == "number" && (!v(y) || y < 0.5 || y > W.score)) return { error: "每题分值须为 0.5–15 分,按 0.5 分递增" };
152
+ if (b !== void 0 && (!v(b) || b < 0)) return { error: "少选得分须为非负的 0.5 倍数" };
153
+ if (s = o.map((m) => St(m, r.patch, n)), b !== void 0 && s.some((m) => m.multiple && m.scoreType !== "ITEM_SCORE" && b > (m.score ?? 0))) return { error: "少选得分不能超过所选题目的分值" };
154
+ } else if (r.type === "numbering") {
155
+ if (!Number.isInteger(r.start) || r.start < 1 || r.start + o.length - 1 > 1e3) return { error: "连续题号须在 1–1000 内" };
156
+ s = o.map((a, y) => ({ ...a, label: String(r.start + y) }));
157
+ } else if (r.type === "average") {
158
+ const a = r.total / o.length;
159
+ if (!v(a) || a < 0.5 || a > W.score) return { error: "总分无法平均分配,每题须为 0.5–15 分且为 0.5 的倍数" };
160
+ s = o.map((y) => St(y, { score: a }));
161
+ } else {
162
+ const a = r.text.toUpperCase().trim().split(/[\s,,;;]+/).filter(Boolean);
163
+ if (a.length !== o.length) return { error: `需要 ${o.length} 组答案,当前为 ${a.length} 组` };
164
+ s = [];
165
+ for (let y = 0; y < o.length; y++) {
166
+ const b = o[y], m = a[y];
167
+ if (m !== "-" && (!/^[A-T]+$/.test(m) || new Set(m).size !== m.length || [...m].some((p) => !b.options.some((l) => l.label === p)))) return { error: `第 ${b.label} 题包含无效或重复选项` };
168
+ const f = m === "-" ? [] : [...m].map((p) => b.options.find((l) => l.label === p).id);
169
+ if (!b.multiple && f.length > 1) return { error: `第 ${b.label} 题为单选,只能设置一个答案` };
170
+ s.push({ ...b, correctIds: f });
171
+ }
172
+ }
173
+ const c = new Map(s.map((a) => [a.id, a])), i = t.questions.map((a) => c.get(a.id) || a);
174
+ for (const a of s) {
175
+ const y = Xt(i, a.id, a.label) || kt(a);
176
+ if (y) return { error: `第 ${a.label} 题:${y}` };
177
+ }
178
+ return { value: { ...t, questions: i } };
179
+ }
180
+ const Yt = { layout: "natural", columns: 2, indent: !1, rowGap: 0, columnGap: 32, marker: "letter" }, At = (t) => `question:${t}`, Zt = (t) => t.presentation === "stem" ? "stem" : ["option", "distributed"].includes(t.presentation) ? "option" : "concentrated";
181
+ function ve(t, e, r) {
182
+ const n = $t(e), o = /* @__PURE__ */ new Map(), s = (i, a) => {
183
+ const y = i.attrs?.contentId || a;
184
+ i.type === "choiceGroup" && y && o.set(i.attrs.id, y), i.content?.forEach((b) => s(b, y));
185
+ };
186
+ s(e.content);
187
+ const c = new Set(t.questions.map((i) => i.contentTarget?.groupId));
188
+ return { ...t, presentation: r, questions: t.questions.map((i, a) => {
189
+ const y = n.find((b) => o.get(b.id) === i.id) || (o.size ? void 0 : n[a]);
190
+ return r === "concentrated" || i.contentTarget !== void 0 || !y || c.has(y.id) ? i : (c.add(y.id), { ...i, contentTarget: { groupId: y.id, optionIds: y.options.map((b) => b.id) } });
191
+ }) };
192
+ }
193
+ function qt(t, e, r) {
194
+ const n = Zt(t), o = new Map($t(e).map((f) => [f.id, f])), s = /* @__PURE__ */ new Set(), c = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), a = (f, p) => {
195
+ const l = f.attrs?.contentId || p;
196
+ f.type === "choiceGroup" && l && (c.set(l, [...c.get(l) || [], f.attrs.id]), i.set(f.attrs.id, l)), f.type === "choiceStemAnchor" && typeof f.attrs?.groupId == "string" && s.add(f.attrs.groupId), f.content?.forEach((u) => a(u, l));
197
+ };
198
+ a(e.content);
199
+ const y = [], b = /* @__PURE__ */ new Set(), m = t.questions.filter((f) => {
200
+ if (!r || n === "concentrated") return !0;
201
+ if (n === "stem" && s.has(At(f.id)))
202
+ return y.push({ groupId: At(f.id), questionId: f.id, options: f.options.map((C) => ({ ...C, contentOptionId: C.id })) }), !1;
203
+ const p = c.get(f.id), l = p?.length === 1 ? o.get(p[0]) : void 0, u = l ? { groupId: l.id, optionIds: l.options.map((C) => C.id) } : f.contentTarget, g = u && o.get(u.groupId);
204
+ if (!u || !g || b.has(g.id) || n === "stem" && !s.has(g.id) || i.has(g.id) && i.get(g.id) !== f.id) return !0;
205
+ const A = u.optionIds.slice(0, f.options.length);
206
+ return A.length !== f.options.length || new Set(A).size !== A.length || A.some((C) => !g.options.some((x) => x.id === C)) ? !0 : (b.add(g.id), y.push({ groupId: g.id, questionId: f.id, options: f.options.map((C, x) => ({ ...C, contentOptionId: A[x] })) }), !1);
207
+ });
208
+ return { position: n === "concentrated" ? void 0 : n, bindings: y, concentrated: { ...t, questions: m } };
209
+ }
210
+ function at(t, e = 4) {
211
+ return {
212
+ id: crypto.randomUUID(),
213
+ label: String(t + 1),
214
+ multiple: !1,
215
+ indefinite: !1,
216
+ score: null,
217
+ scoreType: "LESS_SCORE",
218
+ lessScore: 0,
219
+ correctIds: [],
220
+ breakBefore: !1,
221
+ options: Array.from({ length: e }, (r, n) => ({ id: crypto.randomUUID(), label: String.fromCharCode(65 + n) }))
222
+ };
223
+ }
224
+ function te(t = 8) {
225
+ return {
226
+ source: "manual",
227
+ presentation: "concentrated",
228
+ direction: "row",
229
+ rowsPerColumn: 5,
230
+ marker: "box",
231
+ rowGap: 0,
232
+ columnGap: 0,
233
+ questions: Array.from({ length: t }, (e, r) => at(r))
234
+ };
235
+ }
236
+ function ze(t) {
237
+ return new Set(t.questions.map((e) => e.options.length)).size > 1 ? "column" : t.direction;
238
+ }
239
+ function ee(t) {
240
+ const e = [];
241
+ for (const r of t.questions) {
242
+ const n = e.at(-1);
243
+ (!n || n.length >= t.rowsPerColumn || r.breakBefore || n[0].options.length !== r.options.length) && e.push([]), e[e.length - 1].push(r);
244
+ }
245
+ return e;
246
+ }
247
+ function We(t) {
248
+ const e = [];
249
+ for (const r of ee(t))
250
+ (!e.length || r[0].breakBefore) && e.push([]), e[e.length - 1].push(r);
251
+ return e;
252
+ }
253
+ const ne = {
254
+ judge: "判断题",
255
+ fill: "填空题",
256
+ answer: "解答题",
257
+ calculation: "计算/证明",
258
+ matching: "信息匹配/连线",
259
+ ordering: "排序/分类",
260
+ correction: "改错题",
261
+ drawing: "作图题",
262
+ table: "表格填答",
263
+ writing: "语文作文",
264
+ english: "外语写作",
265
+ reading: "阅读理解",
266
+ cloze: "完形填空",
267
+ completion: "语法填空",
268
+ chunk: "断句题",
269
+ composite: "材料/复合题",
270
+ optional: "选做题组",
271
+ practice: "实践评价"
272
+ }, Ve = { choice: "选择", judge: "判断", fill: "填空", answer: "简答", calculation: "计算/证明", correction: "改错", drawing: "作图", table: "表格", writing: "作文", english: "外语写作" }, Qe = ["reading", "cloze", "completion", "composite", "optional"], j = () => ({ version: 1, content: { type: "doc", content: [{ type: "paragraph" }] } }), Je = { symbols: ["√", "×"], letters: ["T", "F"], words: ["正确", "错误"] }, oe = (t) => ["writing", "english"].includes(t) ? 70 : ["answer", "calculation", "drawing", "table", "correction"].includes(t) ? 60 : 15, Xe = (t) => t === "judge" ? 200 : t === "fill" ? 50 : ["reading", "cloze", "completion"].includes(t) ? 20 : t === "matching" ? 9 : 100;
273
+ function re(t = 0) {
274
+ return { id: crypto.randomUUID(), label: String(t + 1), width: 50, style: "line", characters: 6, score: null, answers: [], prefix: "", suffix: "", breakAfter: !1 };
275
+ }
276
+ function ie(t, e = "1") {
277
+ const r = crypto.randomUUID();
278
+ return {
279
+ id: r,
280
+ label: e,
281
+ kind: t,
282
+ document: j(),
283
+ reference: j(),
284
+ explanation: j(),
285
+ score: null,
286
+ choice: { ...at(0, t === "judge" ? 2 : 4), id: r, label: e },
287
+ presentation: "concentrated",
288
+ blanks: [re()],
289
+ steps: [],
290
+ needsReason: !1,
291
+ judgment: null,
292
+ targets: [],
293
+ area: { style: t === "writing" ? "characters" : t === "english" ? "lines" : t === "drawing" ? "grid" : "blank", rows: t === "writing" ? 20 : 6, columns: 20, rowHeight: t === "writing" ? 40 : 28, wordMark: 100, title: !1, backgroundUrl: "" }
294
+ };
295
+ }
296
+ function se(t) {
297
+ return ["reading", "cloze", "chunk"].includes(t) ? "choice" : ["matching", "completion"].includes(t) ? "fill" : ["ordering", "composite", "optional", "practice"].includes(t) ? "answer" : t;
298
+ }
299
+ function Ye(t) {
300
+ return {
301
+ items: [ie(se(t))],
302
+ judgeLabels: "symbols",
303
+ fillNewLine: !0,
304
+ pool: [],
305
+ relation: "one",
306
+ reuseOptions: !0,
307
+ matchingDisplay: "letters",
308
+ ordering: "sequence",
309
+ sequence: [],
310
+ categories: [],
311
+ assignments: {},
312
+ chooseCount: 1,
313
+ groupScore: null,
314
+ chunkText: "",
315
+ chunkPoints: [],
316
+ chunkCorrect: [],
317
+ chunkMax: 3,
318
+ chunkScore: null,
319
+ attachmentUrl: ""
320
+ };
321
+ }
322
+ function Ze(t) {
323
+ return String(Math.max(0, ...t.map((e) => /^\d+$/.test(e.label) ? Number(e.label) : 0)) + 1);
324
+ }
325
+ function Pt(t) {
326
+ const e = structuredClone(t), r = /* @__PURE__ */ new Map(), n = (s) => {
327
+ !s || typeof s != "object" || Object.entries(s).forEach(([c, i]) => {
328
+ ["id", "answerId"].includes(c) && typeof i == "string" ? r.set(i, crypto.randomUUID()) : n(i);
329
+ });
330
+ };
331
+ n(e);
332
+ const o = (s) => typeof s == "string" ? r.get(s) || s : Array.isArray(s) ? s.map(o) : s && typeof s == "object" ? Object.fromEntries(Object.entries(s).map(([c, i]) => [r.get(c) || c, o(i)])) : s;
333
+ return o(e);
334
+ }
335
+ function qe(t, e) {
336
+ const r = Pt(t);
337
+ return { ...r, label: e, choice: { ...r.choice, label: e } };
338
+ }
339
+ function tn(t, e, r) {
340
+ const n = t.findIndex((c) => c.id === e), o = n + r;
341
+ if (n < 0 || o < 0 || o >= t.length) return t;
342
+ const s = [...t];
343
+ return s.splice(o, 0, ...s.splice(n, 1)), s;
344
+ }
345
+ function en(t, e) {
346
+ return { ...t, pool: t.pool.filter((r) => r.id !== e), sequence: t.sequence.filter((r) => r !== e), assignments: Object.fromEntries(Object.entries(t.assignments).filter(([r]) => r !== e)), items: t.items.map((r) => ({ ...r, targets: r.targets.filter((n) => n !== e) })) };
347
+ }
348
+ function nn(t, e, r) {
349
+ const n = [...new Set(r)].filter((s) => t.pool.some((c) => c.id === s)), o = t.relation === "one" ? n.slice(-1) : n;
350
+ return { ...t, items: t.items.map((s) => s.id === e ? { ...s, targets: o } : t.reuseOptions ? s : { ...s, targets: s.targets.filter((c) => !o.includes(c)) }) };
351
+ }
352
+ function on(t, e) {
353
+ let r = 0;
354
+ for (; r < e.length && r < t.chunkText.length && e[r] === t.chunkText[r]; ) r++;
355
+ let n = 0;
356
+ for (; n < e.length - r && n < t.chunkText.length - r && e[e.length - 1 - n] === t.chunkText[t.chunkText.length - 1 - n]; ) n++;
357
+ const o = t.chunkText.length - n, s = /* @__PURE__ */ new Set(), c = t.chunkPoints.filter((i) => i.offset <= r || i.offset >= o).map((i) => ({ ...i, offset: i.offset <= r ? i.offset : i.offset + e.length - t.chunkText.length })).filter((i) => i.offset <= 0 || i.offset >= e.length || s.has(i.offset) ? !1 : (s.add(i.offset), !0));
358
+ return { ...t, chunkText: e, chunkPoints: c, chunkCorrect: t.chunkCorrect.filter((i) => c.some((a) => a.id === i)) };
359
+ }
360
+ function rn(t, e) {
361
+ const r = [], n = t.items.map((o) => o.label.trim());
362
+ (n.some((o) => !o) || new Set(n).size !== n.length) && r.push("题号不能为空或重复");
363
+ for (const o of t.items) {
364
+ o.score !== null && (!Number.isFinite(o.score) || o.score < 0.5 || o.score > oe(o.kind) || !Number.isInteger(o.score * 2)) && r.push(`${o.label} 题分值超出范围或不是 0.5 的倍数`);
365
+ const c = (o.kind === "fill" ? o.blanks : o.steps).map((i) => i.score);
366
+ c.length && o.score !== null && c.every((i) => i !== null) && c.reduce((i, a) => i + (a || 0), 0) !== o.score && r.push(`${o.label} 题分项分值之和与题分不一致`);
367
+ }
368
+ if (["matching", "ordering"].includes(e)) {
369
+ const o = t.pool.map((s) => s.label.trim());
370
+ (o.some((s) => !s) || new Set(o).size !== o.length) && r.push("共享选项编号不能为空或重复");
371
+ }
372
+ return e === "optional" && t.chooseCount > t.items.length && r.push("选做数量不能超过题目数量"), e === "chunk" && t.chunkCorrect.length > t.chunkMax && r.push("正确断点数不能超过最多选择数"), r;
373
+ }
374
+ function sn(t = 3, e = 3) {
375
+ return { version: 1, content: { type: "doc", content: [{ type: "table", content: Array.from({ length: t }, () => ({ type: "tableRow", content: Array.from({ length: e }, () => ({ type: "tableCell", content: [{ type: "paragraph" }] })) })) }] } };
376
+ }
377
+ function J(t) {
378
+ const e = (r) => !!(r.text || r.type && !["doc", "paragraph", "choiceStemAnchor"].includes(r.type) || r.content?.some(e));
379
+ return !e(t.content);
380
+ }
381
+ const cn = { choice: "选择题", area: "空白区域", ...ne };
382
+ function an(t) {
383
+ return {
384
+ id: crypto.randomUUID(),
385
+ kind: "area",
386
+ areaType: t,
387
+ title: t === "forbiden" ? "禁止答题区" : "空白答题区",
388
+ answerHeight: t === "forbiden" ? 100 : 200,
389
+ document: { version: 1, content: { type: "doc", content: t === "forbiden" ? ["请勿在此区域作答", "或者做任何标记"].map((e) => ({ type: "paragraph", attrs: { textAlign: "center", lineSpacing: 0 }, content: [{ type: "text", text: e }] })) : [{ type: "paragraph" }] } }
390
+ };
391
+ }
392
+ function ce() {
393
+ return { version: 1, title: "", questionCard: !1, preset: "a3-two", margin: 15, gap: 10, blocks: [] };
394
+ }
395
+ function ae(t = "") {
396
+ return {
397
+ // 22px title + the configured 9mm line spacing + 10px bottom inset.
398
+ id: crypto.randomUUID(),
399
+ height: 70,
400
+ document: { version: 1, content: { type: "doc", content: [{
401
+ type: "paragraph",
402
+ attrs: { textAlign: "center", lineSpacing: 9 },
403
+ ...t ? { content: [{ type: "text", text: t, marks: [{ type: "textStyle", attrs: { fontFamily: "SimSun, 宋体, serif", fontSize: "22px" } }] }] } : {}
404
+ }] } }
405
+ };
406
+ }
407
+ function le(t) {
408
+ return {
409
+ ...ce(),
410
+ title: t.name,
411
+ creation: t,
412
+ paperTitle: ae(t.name),
413
+ header: { focusText: !0, writeKaohao: !1, missExam: !1, mifeng: !1, kaohao: "school", weishu: 8 }
414
+ };
415
+ }
416
+ function Q(t, e = 96) {
417
+ return t * e / 25.4;
418
+ }
419
+ const ue = {
420
+ a4: { label: "A4 单栏", width: 210, height: 297, columns: 1 },
421
+ "a3-two": { label: "A3 双栏", width: 420, height: 297, columns: 2 },
422
+ "a3-three": { label: "A3 三栏", width: 420, height: 297, columns: 3 }
423
+ }, et = 44, it = 16, dt = 1;
424
+ function It(t, e) {
425
+ const r = ue[t.preset], n = Q(r.width), o = Q(r.height), s = Q(t.margin), c = Q(t.gap), i = t.usage !== "homework" && t.header?.mifeng ? Q(t.header.kaohao === "code" ? 26 : 14) : 0, a = n - s * 2 - i, y = (a - c * (r.columns - 1)) / r.columns, b = Math.max(s, t.header ? t.recognition?.examQrCode ? 64 : 39 : 0), m = Math.max(s, t.header ? 56 : 0), f = o - b - m, p = f - it, l = t.header ? y : a, u = e && e.id === t.paperTitle?.id && Math.abs(e.width - l) < 1 ? e : void 0, g = t.paperTitle ? Math.min(f, u?.height ?? t.paperTitle.height + (t.header ? 260 : it)) : 0, A = (T, O = 0) => !!t.paperTitle && (t.header ? T % 2 === 0 && O === 0 : T === 0), C = (T, O = 0) => A(T, O) ? g : 0;
426
+ return { ...r, width: n, height: o, margin: s, topInset: b, bottomInset: m, gap: c, sealWidth: i, contentWidth: a, contentHeight: f, columnWidth: y, columnX: (T, O) => s + (T % 2 === 0 ? i : 0) + O * (y + c), titleWidth: l, titleMaxHeight: p, hasHeader: A, headerHeight: C, capacity: (T, O = 0) => f - C(T, O) };
427
+ }
428
+ function ln(t, e, r) {
429
+ const n = It(t, r);
430
+ let o = 0, s = 0, c = 0;
431
+ const i = () => {
432
+ s++, s === n.columns && (s = 0, o++), c = 0;
433
+ }, a = t.blocks.map((b) => {
434
+ const m = e[b.id], f = m && Math.abs(m.width - n.columnWidth) < 1 ? m.height : 100 + b.answerHeight, p = m && Math.abs(m.width - n.columnWidth) < 1 ? [...new Set([...m.breaks || [], f].filter((M) => Number.isFinite(M) && M > 0 && M <= f))].sort((M, T) => M - T) : [], l = b.reference?.type === "CCOMPOSITION", u = (M) => l && M > 0 ? Math.max(0, 6 - Math.max(0, (m?.compositionStart || 0) - M)) : 0;
435
+ if (p.length > 1 && p.every((M, T) => {
436
+ const O = p[T - 1] || 0;
437
+ return M - O + u(O) <= n.capacity(1) + 0.5;
438
+ })) {
439
+ const M = [];
440
+ let T = 0;
441
+ for (; T < f - 0.5; ) {
442
+ const h = n.capacity(o, s) - c, I = T, d = u(T), E = (N) => m?.markingFrames?.some((L) => L.from >= I - 0.5 && L.from < N - 0.5 && L.to > N + 0.5) ? 22 : 0, w = p.filter((N) => N > I + 0.5 && N + E(N) <= I + h - d + 0.5).at(-1);
443
+ if (w === void 0) {
444
+ i();
445
+ continue;
446
+ }
447
+ const S = l && w < f - 0.5 ? Math.max(E(w), h - d - (w - T)) : E(w);
448
+ M.push({ page: o, column: s, x: n.columnX(o, s), y: o * (n.height + et) + n.topInset + n.headerHeight(o, s) + c, from: T, to: w, ...d ? { topPadding: d } : {}, ...S ? { bottomPadding: S } : {} }), c += w - T + d, T = w, T < f - 0.5 && i();
449
+ }
450
+ c += it;
451
+ const O = M[0];
452
+ return { id: b.id, ...O, height: f, available: n.capacity(O.page, O.column), overflowing: !1, fragments: M };
453
+ }
454
+ for (; c + f > n.capacity(o, s) + 0.5 && (c > 0 || n.headerHeight(o, s) > 0); ) i();
455
+ const A = n.capacity(o, s), C = f > A + 0.5, x = {
456
+ id: b.id,
457
+ page: o,
458
+ column: s,
459
+ x: n.columnX(o, s),
460
+ y: o * (n.height + et) + n.topInset + n.headerHeight(o, s) + c,
461
+ height: f,
462
+ available: A,
463
+ overflowing: C,
464
+ fragments: [{ page: o, column: s, x: n.columnX(o, s), y: o * (n.height + et) + n.topInset + n.headerHeight(o, s) + c, from: 0, to: Math.min(f, A) }]
465
+ };
466
+ return c += Math.min(f, A) + it, x;
467
+ }), y = /* @__PURE__ */ new Map();
468
+ a.forEach((b, m) => b.fragments.forEach((f) => {
469
+ const p = `${f.page}/${f.column}`, l = y.get(p) || [];
470
+ l.push({ fragment: f, placement: b, blockIndex: m }), y.set(p, l);
471
+ })), y.forEach((b) => {
472
+ const m = b.filter((u) => ["answer", "writing", "english", "composite", "area"].includes(t.blocks[u.blockIndex].kind)).at(-1);
473
+ if (!m || t.blocks[m.blockIndex].reference?.type !== "CCOMPOSITION" && t.blocks[m.blockIndex].kind !== "area") return;
474
+ const f = b.at(-1).fragment, l = f.page * (n.height + et) + n.height - n.bottomInset - f.y - (f.to - f.from) - (f.topPadding || 0) - (f.bottomPadding || 0);
475
+ l <= 0 || l > 30 || (m.fragment.bottomPadding = (m.fragment.bottomPadding || 0) + l, b.slice(b.indexOf(m) + 1).forEach(({ fragment: u, placement: g }) => {
476
+ u.y += l, g.fragments[0] === u && (g.y = u.y);
477
+ }));
478
+ });
479
+ for (const b of a)
480
+ (b.overflowing || b.fragments.some((m) => m.page >= dt)) && (b.overflowFrom = b.fragments.filter((m) => m.page < dt).at(-1)?.to || 0);
481
+ return { geometry: n, placements: a, pageCount: dt, requiredPageCount: o + 1 };
482
+ }
483
+ function gt(t, e) {
484
+ return { version: 1, content: { type: "doc", content: [{ type: "paragraph", content: [
485
+ { type: "text", text: `${t}.`, marks: [{ type: "documentLabel", attrs: { kind: "number" } }] },
486
+ ...e ? [{ type: "text", text: `(${e}分)`, marks: [{ type: "documentLabel", attrs: { kind: "score" } }] }] : []
487
+ ] }] } };
488
+ }
489
+ function st(t, e, r) {
490
+ const n = (o) => {
491
+ if (!o.content) return o;
492
+ let s;
493
+ const c = o.content.flatMap((a) => {
494
+ const y = a.type === "text" && a.marks?.find((f) => f.type === "documentLabel")?.attrs?.kind, b = y && y === s;
495
+ if (s = y, b) return [];
496
+ if (!y) return [n(a)];
497
+ const m = y === "number" ? `${e}.` : r ? `(${r}分)` : "";
498
+ return m ? [{ ...a, text: m }] : [];
499
+ }), i = c.findIndex((a) => a.marks?.some((y) => y.type === "documentLabel" && y.attrs?.kind === "number"));
500
+ return r && i >= 0 && !c.some((a) => a.marks?.some((y) => y.type === "documentLabel" && y.attrs?.kind === "score")) && c.splice(i + 1, 0, { type: "text", text: `(${r}分)`, marks: [{ type: "documentLabel", attrs: { kind: "score" } }] }), { ...o, content: c };
501
+ };
502
+ return { ...t, content: n(t.content) };
503
+ }
504
+ const yt = {
505
+ SCHOICE: "单选题",
506
+ MCHOICE: "多选题",
507
+ JUDGE: "判断题",
508
+ FILLBLANK: "填空题",
509
+ SHORTANSWER: "解答题",
510
+ MIXED: "复合题",
511
+ CLOZE: "完形填空",
512
+ READTHENANSWER: "阅读理解",
513
+ INFO_MATCHING: "信息匹配",
514
+ TEXT_COMPLETION: "语法填空",
515
+ ECOMPOSITION: "英语作文",
516
+ CCOMPOSITION: "语文作文",
517
+ CHUNK_CHOICE: "断句题"
518
+ }, Ot = ["SCHOICE", "MCHOICE", "JUDGE", "FILLBLANK", "SHORTANSWER", "MIXED"];
519
+ function un(t, e = !1) {
520
+ const r = Dt(t), n = e ? Ot.filter((o) => o !== "MIXED") : Ot;
521
+ return e ? ["CHINESE", "JAPANESE"].includes(r || "") ? [...n, "CHUNK_CHOICE"] : n : r === "CHINESE" ? [...n, "CCOMPOSITION", "CHUNK_CHOICE"] : r === "ENGLISH" ? [...n, "CLOZE", "READTHENANSWER", "INFO_MATCHING", "TEXT_COMPLETION", "ECOMPOSITION"] : r === "JAPANESE" ? Object.keys(yt) : ["POLITICAL", "HISTORY"].includes(r || "") ? [...n, "CCOMPOSITION"] : n;
522
+ }
523
+ const fe = (t) => ["CLOZE", "READTHENANSWER", "INFO_MATCHING", "TEXT_COMPLETION"].includes(t), de = (t) => ["SCHOICE", "MCHOICE", "CLOZE", "READTHENANSWER", "INFO_MATCHING", "JUDGE"].includes(t), Z = (t) => ({ version: 1, content: { type: "doc", content: t.length ? t : [{ type: "paragraph" }] } });
524
+ function Rt(t, e, r = !1) {
525
+ return {
526
+ content: j(),
527
+ numbered: !r,
528
+ groupId: `options:${e.id}`,
529
+ layout: { ...Yt, columns: t === "CLOZE" ? 4 : 2, ...t === "READTHENANSWER" ? { layout: "fixed", columnGap: 0 } : {} },
530
+ itemsContent: !r && de(t) ? e.options.map((n) => ({ id: n.id, key: n.label, content: j() })) : []
531
+ };
532
+ }
533
+ const ct = (t) => {
534
+ if (t.type === "choiceStemAnchor" || t.type === "text" && t.marks?.some((n) => n.type === "documentLabel" && n.attrs?.kind === "number")) return null;
535
+ const { contentId: e, ...r } = t.attrs || {};
536
+ return { ...t, ...t.attrs ? { attrs: r } : {}, ...t.content ? { content: t.content.map(ct).filter((n) => n !== null) } : {} };
537
+ };
538
+ function Nt(t, e, r) {
539
+ const o = (t.content.content.content || [{ type: "paragraph" }]).map((s) => ({ ...s, attrs: { ...s.attrs, contentId: e } }));
540
+ if (t.numbered) {
541
+ const s = { type: "text", text: `${r}.`, marks: [{ type: "documentLabel", attrs: { kind: "number" } }] };
542
+ ["paragraph", "heading"].includes(o[0]?.type || "") || o.unshift({ type: "paragraph", attrs: { contentId: e }, content: [] }), o[0] = { ...o[0], content: [s, ...o[0].content || []] };
543
+ }
544
+ return t.itemsContent.length && o.push({ type: "choiceGroup", attrs: { id: t.groupId, contentId: e, ...t.layout }, content: t.itemsContent.map((s) => ({
545
+ type: "choiceOption",
546
+ attrs: { id: s.id, label: s.key, sourceKey: s.key, marker: "letter" },
547
+ content: s.content.content.content || [{ type: "paragraph" }]
548
+ })) }), o;
549
+ }
550
+ function he(t, e) {
551
+ const r = e.filter((i) => i.type === "choiceGroup"), n = r.find((i) => i.attrs?.id === t.groupId) || (r.length === 1 ? r[0] : void 0), o = e.filter((i) => i !== n);
552
+ let s = !1;
553
+ const c = (i) => {
554
+ i.marks?.some((a) => a.type === "documentLabel" && a.attrs?.kind === "number") && (s = !0), i.content?.forEach(c);
555
+ };
556
+ return o.forEach(c), {
557
+ ...t,
558
+ numbered: s,
559
+ content: Z(o.map(ct).filter((i) => i !== null)),
560
+ groupId: n?.attrs?.id || t.groupId,
561
+ layout: n ? Object.fromEntries(Object.entries(t.layout).map(([i, a]) => [i, n.attrs?.[i] ?? a])) : t.layout,
562
+ itemsContent: (n?.content || []).map((i, a) => ({ id: i.attrs?.id || t.itemsContent[a]?.id || crypto.randomUUID(), key: i.attrs?.label || String.fromCharCode(65 + a), content: Z((i.content || []).map(ct).filter((y) => y !== null)) }))
563
+ };
564
+ }
565
+ function pe(t, e, r, n) {
566
+ const o = /* @__PURE__ */ new Map();
567
+ e.content.content?.forEach((i) => {
568
+ i.attrs?.contentId && o.set(i.attrs.contentId, [...o.get(i.attrs.contentId) || [], i]);
569
+ });
570
+ const s = new Set(n?.content.content?.map((i) => i.attrs?.contentId).filter(Boolean)), c = (i, a) => a && (o.has(i) || s.has(i)) ? he(a, o.get(i) || []) : a;
571
+ return {
572
+ ...t,
573
+ ...o.has(r) ? { material: Z(o.get(r).map((i) => ct(i))) } : {},
574
+ questions: t.questions.map((i) => ({ ...i, text: c(i.id, i.text), parts: i.parts.map((a) => ({ ...a, text: c(a.id, a.text) })) }))
575
+ };
576
+ }
577
+ function ge(t) {
578
+ const e = t.reference, r = [];
579
+ e.type === "MIXED" && r.push(...(e.material || j()).content.content.map((o) => ({ ...o, attrs: { ...o.attrs, contentId: t.id } }))), e.questions.forEach((o) => {
580
+ o.text && r.push(...Nt(o.text, o.id, o.label)), fe(o.type) && o.parts.forEach((s) => {
581
+ s.text && r.push(...Nt(s.text, s.id, s.label));
582
+ });
583
+ });
584
+ const n = (t.document.content.content || []).filter((o) => !o.attrs?.contentId);
585
+ return J(Z(n)) || r.push(...n), Z(r);
586
+ }
587
+ function me(t, e) {
588
+ const r = (n, o, s) => !n || !s || o.options.map((c) => c.id).join() === s.options.map((c) => c.id).join() ? n : { ...n, itemsContent: o.options.map((c) => ({ ...n.itemsContent.find((i) => i.id === c.id), id: c.id, key: c.label, content: n.itemsContent.find((i) => i.id === c.id)?.content || j() })) };
589
+ return { ...t, questions: t.questions.map((n) => {
590
+ const o = e.questions.find((s) => s.id === n.id);
591
+ return { ...n, text: r(n.text, n.choice, o?.choice), parts: n.parts.map((s) => ({ ...s, text: r(s.text, s.choice, o?.parts.find((c) => c.id === s.id)?.choice) })) };
592
+ }) };
593
+ }
594
+ function fn(t, e, r) {
595
+ if (t.reference?.textVersion !== 1) return t;
596
+ let n = t.reference;
597
+ if (!e && !J(t.document) && !t.document.content.content?.some((s) => s.attrs?.contentId)) return { ...t, reference: { ...n, textVersion: void 0 } };
598
+ if (e?.reference === n && e.document === t.document && !J(t.document)) return t;
599
+ if (t.document !== e?.document && (!J(t.document) || e) && (n = pe(n, t.document, t.id, e?.document), e && t.reference === e.reference))
600
+ return { ...t, reference: n };
601
+ e?.reference && t.reference !== e.reference && (n = me(n, e.reference));
602
+ const o = { ...t, reference: n };
603
+ return r || !J(t.document) ? { ...o, document: ge(o) } : o;
604
+ }
605
+ const lt = {
606
+ SCHOICE: { count: 200, options: [2, 12], parts: 1, score: 15 },
607
+ MCHOICE: { count: 200, options: [2, 12], parts: 1, score: 15 },
608
+ JUDGE: { count: 200, options: [2, 2], parts: 1, score: 15 },
609
+ CHUNK_CHOICE: { count: 100, options: [2, 26], parts: 1, score: 10 },
610
+ FILLBLANK: { count: 50, options: [0, 0], parts: 20, score: 15 },
611
+ SHORTANSWER: { count: 100, options: [0, 0], parts: 10, score: 60 },
612
+ CLOZE: { count: 20, options: [4, 4], parts: 20, score: 15 },
613
+ READTHENANSWER: { count: 20, options: [2, 12], parts: 20, score: 15 },
614
+ INFO_MATCHING: { count: 20, options: [1, 9], parts: 9, score: 15 },
615
+ TEXT_COMPLETION: { count: 20, options: [0, 0], parts: 20, score: 15 },
616
+ CCOMPOSITION: { count: 1, options: [0, 0], parts: 1, score: 70 },
617
+ ECOMPOSITION: { count: 1, options: [0, 0], parts: 1, score: 70 }
618
+ }, Y = (t) => ["SCHOICE", "MCHOICE", "JUDGE", "CHUNK_CHOICE", "CLOZE", "READTHENANSWER", "INFO_MATCHING"].includes(t), R = (t) => ["CLOZE", "READTHENANSWER", "INFO_MATCHING", "TEXT_COMPLETION"].includes(t), dn = (t) => t === "FILLBLANK" || t === "TEXT_COMPLETION", Ht = (t) => t === "CCOMPOSITION" || t === "ECOMPOSITION", Ce = { SCHOICE: "choice", MCHOICE: "choice", JUDGE: "judge", FILLBLANK: "fill", SHORTANSWER: "answer", MIXED: "composite", CLOZE: "cloze", READTHENANSWER: "reading", INFO_MATCHING: "matching", TEXT_COMPLETION: "completion", ECOMPOSITION: "english", CCOMPOSITION: "writing", CHUNK_CHOICE: "chunk" };
619
+ function Ie(t) {
620
+ return { type: t, textVersion: 1, questions: [], layout: te(0), fillNewLine: !1, optional: !1, choose: 1, optionalHeight: 200, scoreType: "LESS_SCORE" };
621
+ }
622
+ function hn(t) {
623
+ return { id: crypto.randomUUID(), kind: Ce[t], title: yt[t], answerHeight: 0, document: j(), reference: Ie(t) };
624
+ }
625
+ function pn(t, e = 1, r) {
626
+ const n = t === "MCHOICE" && pt(r);
627
+ return {
628
+ type: t,
629
+ start: e,
630
+ end: e,
631
+ optionCount: t === "INFO_MATCHING" ? null : t === "CHUNK_CHOICE" ? 12 : t === "JUDGE" ? 2 : 4,
632
+ partCount: R(t) ? null : 1,
633
+ score: n ? 6 : null,
634
+ scoreType: n ? "ITEM_SCORE" : "LESS_SCORE",
635
+ lessScore: 0,
636
+ characters: 1e3,
637
+ lines: 10,
638
+ rightAnswers: null,
639
+ singleScore: 1
640
+ };
641
+ }
642
+ function Bt(t, e, r) {
643
+ const n = Array.from({ length: r }, (o, s) => ({ ...t.options[s] || { id: crypto.randomUUID() }, label: e === "JUDGE" ? ["T", "F"][s] : String.fromCharCode(65 + s) }));
644
+ return { ...t, options: n, multiple: e === "MCHOICE" || e === "CHUNK_CHOICE", indefinite: !1, correctIds: t.correctIds.filter((o) => n.some((s) => s.id === o)).slice(0, e === "MCHOICE" || e === "CHUNK_CHOICE" ? r : 1) };
645
+ }
646
+ function ye(t, e, r, n = 4) {
647
+ const o = crypto.randomUUID(), s = { ...Bt(at(0), r, n), id: o, label: t, score: e };
648
+ return {
649
+ id: o,
650
+ label: t,
651
+ score: e,
652
+ width: 25,
653
+ breakAfter: !1,
654
+ height: 100,
655
+ document: r === "SHORTANSWER" ? gt(t, e) : j(),
656
+ choice: s,
657
+ ...R(r) && r !== "TEXT_COMPLETION" ? { text: Rt(r, s) } : {}
658
+ };
659
+ }
660
+ function be(t, e) {
661
+ const r = crypto.randomUUID(), { type: n, score: o } = t, s = String(e), c = t.partCount || 1, i = Array.from({ length: R(n) || ["FILLBLANK", "SHORTANSWER"].includes(n) ? c : 0 }, (y, b) => ye(R(n) ? String(e + b) : c === 1 ? s : `${s}.${b + 1}`, o, n, t.optionCount || 4)), a = { ...Bt(at(0), n, t.optionCount || 4), id: r, label: s, score: o, scoreType: t.scoreType, lessScore: t.lessScore };
662
+ return {
663
+ id: r,
664
+ type: n,
665
+ label: s,
666
+ score: i.length ? jt(i) : o,
667
+ choice: a,
668
+ text: Rt(n, a, R(n)),
669
+ parts: i,
670
+ document: n === "ECOMPOSITION" ? { version: 1, content: { type: "doc", content: [...gt(s, o).content.content, ...Ee(t.lines, t.paperWidth || 600).content.content] } } : n === "CCOMPOSITION" ? gt(s, o) : j(),
671
+ height: n === "ECOMPOSITION" ? 50 * t.lines + 40 : 100,
672
+ contentHeight: 38,
673
+ characters: t.characters,
674
+ lines: t.lines,
675
+ halfPoint: !1,
676
+ rightAnswers: t.rightAnswers,
677
+ singleScore: t.singleScore
678
+ };
679
+ }
680
+ const jt = (t) => t.some((e) => e.score === null) ? null : t.reduce((e, r) => e + (r.score || 0), 0);
681
+ function bt(t) {
682
+ return t.questions.flatMap((e) => R(e.type) ? e.parts.map((r) => r.label) : [e.label]);
683
+ }
684
+ function gn(t) {
685
+ return Math.max(0, ...bt(t).map(Number).filter(Number.isFinite)) + 1;
686
+ }
687
+ function mn(t, e, r = !1, n = !1) {
688
+ const o = lt[e.type], s = Ht(e.type) ? 1 : e.end - e.start + 1;
689
+ if (!Number.isInteger(e.start) || e.start < 1 || e.end > 1e3 || !Number.isInteger(s) || s < 1 || s > o.count) return `题号须为 1–1000,单次题数为 1–${o.count}`;
690
+ if (t.type === "CCOMPOSITION" && t.questions.length) return "语文作文每组只能有一道题";
691
+ if (t.optional) return "选做题组不能追加题目";
692
+ const c = bt(t);
693
+ if (Array.from({ length: s }, (i, a) => String(e.start + a)).some((i) => c.includes(i))) return "同一分组内,题号不能重复";
694
+ if (Y(e.type) && (e.optionCount === null || !Number.isInteger(e.optionCount) || e.optionCount < o.options[0] || e.optionCount > o.options[1])) return `选项个数须为 ${o.options[0]}–${o.options[1]}`;
695
+ if ((R(e.type) || ["FILLBLANK", "SHORTANSWER"].includes(e.type)) && (!e.partCount || !Number.isInteger(e.partCount) || e.partCount < 1 || e.partCount > o.parts)) return `子题/空数须为 1–${o.parts}`;
696
+ if (R(e.type) && s % e.partCount !== 0) return "题目数量无法按子题数量均分,请重新设置";
697
+ if (e.type === "INFO_MATCHING" && e.partCount > e.optionCount) return "选项个数需大于等于子题数量";
698
+ if (e.type === "SHORTANSWER" && (r || t.optional) && e.partCount !== 1) return "网阅或选做题不支持小题";
699
+ if (e.score !== null && (!Number.isFinite(e.score) || e.score < (n ? 0 : 0.5) || e.score > o.score || !Number.isInteger(e.score * 2))) return `分值须为 ${n ? 0 : 0.5}–${o.score} 分,按 0.5 分递增`;
700
+ if (e.type === "MCHOICE" && (e.lessScore < 0 || !Number.isInteger(e.lessScore * 2) || e.lessScore > (e.score || 0))) return "少选得分不能超过本题分值";
701
+ if (e.type === "CHUNK_CHOICE") {
702
+ if (!e.rightAnswers || !Number.isInteger(e.rightAnswers) || e.rightAnswers >= e.optionCount) return "正确答案个数需小于选项个数";
703
+ if (e.singleScore === null || e.singleScore < 0.5 || !Number.isInteger(e.singleScore * 2) || e.score !== null && e.score !== 0 && e.singleScore * e.rightAnswers > e.score) return "每处得分乘以正确答案个数不可大于每题分数";
704
+ }
705
+ return e.type === "CCOMPOSITION" && (!Number.isInteger(e.characters) || e.characters < 1 || e.characters > 1200) ? "作文格数须为 1–1200" : e.type === "ECOMPOSITION" && (!Number.isInteger(e.lines) || e.lines < 1 || e.lines > 100) ? "作文行数须为 1–100" : e.score === null ? "请输入分值" : null;
706
+ }
707
+ function Cn(t, e, r) {
708
+ const n = R(e.type) ? e.partCount : 1, o = [];
709
+ for (let i = e.start; i <= (Ht(e.type) ? e.start : e.end); i += n) o.push(be(e, i));
710
+ const s = [...t.questions], c = s.findIndex((i) => i.id === r || i.parts.some((a) => a.id === r));
711
+ return s.splice(c < 0 ? s.length : c + 1, 0, ...o), { ...t, questions: s };
712
+ }
713
+ function In(t) {
714
+ return t.questions.flatMap((e) => [e, ...e.parts]);
715
+ }
716
+ function yn(t) {
717
+ return t.questions.filter((e) => Y(e.type)).flatMap((e) => R(e.type) ? e.parts.map((r) => ({ ...r.choice, label: r.label, score: r.score })) : [{ ...e.choice, label: e.label, score: e.score }]);
718
+ }
719
+ function bn(t, e) {
720
+ const r = Pt(t);
721
+ return r.referenceData && (r.referenceData = { ...r.referenceData, questionId: r.id }), r.text && (r.text.groupId = `options:${r.id}`), r.label = String(e), r.choice.label = r.label, r.choice.contentTarget = null, r.choice.breakBefore = !1, r.parts.forEach((n, o) => {
722
+ n.label = R(r.type) ? String(e + o) : r.parts.length === 1 ? r.label : `${e}.${o + 1}`, n.choice.label = n.label, n.choice.contentTarget = null, n.choice.breakBefore = !1;
723
+ }), r.parts.forEach((n) => {
724
+ n.text && (n.text.groupId = `options:${n.id}`), n.referenceData && (n.referenceData = { ...n.referenceData, questionId: n.id, questionPid: r.id });
725
+ }), r.document = st(r.document, r.label, r.score), r.parts = r.parts.map((n) => ({ ...n, document: st(n.document, n.label, n.score) })), r;
726
+ }
727
+ function En(t) {
728
+ return Math.max(1, Math.floor((t - 6) / 31));
729
+ }
730
+ function Ee(t, e) {
731
+ return { version: 1, content: { type: "doc", content: Array.from({ length: t }, () => ({ type: "paragraph", attrs: { fixedLineHeight: 1152 / 25.4 }, content: [{ type: "text", text: " ".repeat(Math.max(1, Math.floor((e - 24) / 3))), marks: [{ type: "underline" }, { type: "textStyle", attrs: { fontFamily: "Times New Roman, serif", fontSize: "12px" } }] }] })) } };
732
+ }
733
+ function wn(t, e, r = !1) {
734
+ const n = t.questions.reduce((s, c) => s + (c.parts.length || 1), 0), o = e / n;
735
+ return !n || !Number.isFinite(o) || o < (r ? 0 : 0.5) || !Number.isInteger(o * 2) || t.questions.some((s) => o > lt[s.type].score || o !== 0 && s.type === "CHUNK_CHOICE" && (s.rightAnswers || 0) * (s.singleScore || 0) > o) ? null : { ...t, questions: t.questions.map((s) => ({ ...s, score: o * (s.parts.length || 1), document: st(s.document, s.label, o * (s.parts.length || 1)), choice: { ...s.choice, score: o, lessScore: Math.min(s.choice.lessScore || 0, o) }, parts: s.parts.map((c) => ({ ...c, score: o, document: st(c.document, c.label, o), choice: { ...c.choice, score: o } })) })) };
736
+ }
737
+ function Tn(t, e) {
738
+ return [...t <= 17 ? Array.from({ length: 18 }, (r, n) => 17 - n <= t ? String(17 - n) : "") : [...Array.from({ length: 7 }, (r, n) => 7 - n <= Math.floor(t / 10) ? `${7 - n}0` : ""), "", ...Array.from({ length: 10 }, (r, n) => String(9 - n))], e ? "0.5" : ""];
739
+ }
740
+ const we = ["000", "100", "110", "111", "101", "010", "011", "001"], Sn = (t) => we[t - 1], Gt = {
741
+ CHINESE: [1],
742
+ MATHS: [2],
743
+ ENGLISH: [3],
744
+ PHYSICAL: [4],
745
+ CHEMICAL: [1, 2],
746
+ POLITICAL: [1, 3],
747
+ BIOLOGICAL: [1, 4],
748
+ GEOGRAPHIC: [2, 3],
749
+ JAPANESE: [2, 4],
750
+ IT: [3, 4],
751
+ GYM: [1, 2, 3],
752
+ MUSIC: [1, 2, 4],
753
+ ART: [1, 3, 4],
754
+ SCIENCE: [2, 3, 4],
755
+ HISTORY: [1, 2, 3, 4]
756
+ }, Te = {
757
+ 语文: "CHINESE",
758
+ 数学: "MATHS",
759
+ 英语: "ENGLISH",
760
+ 物理: "PHYSICAL",
761
+ 化学: "CHEMICAL",
762
+ 政治: "POLITICAL",
763
+ 思想政治: "POLITICAL",
764
+ 道德与法治: "POLITICAL",
765
+ 生物: "BIOLOGICAL",
766
+ 地理: "GEOGRAPHIC",
767
+ 日语: "JAPANESE",
768
+ 信息科技: "IT",
769
+ 信息技术: "IT",
770
+ 体育: "GYM",
771
+ 音乐: "MUSIC",
772
+ 美术: "ART",
773
+ 科学: "SCIENCE",
774
+ 历史: "HISTORY"
775
+ };
776
+ function Se(t) {
777
+ return t?.subjectCode || (t?.courseCode && Gt[t.courseCode] ? t.courseCode : Te[t?.subject || ""]);
778
+ }
779
+ const nt = (t) => Math.round(t * 1e3) / 1e3, An = (t) => ({ x: nt(t.x), y: nt(t.y), width: nt(t.width), height: nt(t.height) });
780
+ function On(t, e) {
781
+ const r = Math.max(t.x, e.x), n = Math.max(t.y, e.y), o = Math.min(t.x + t.width, e.x + e.width) - r, s = Math.min(t.y + t.height, e.y + e.height) - n;
782
+ return o > 0.01 && s > 0.01 ? { x: r, y: n, width: o, height: s } : void 0;
783
+ }
784
+ const V = function(t, e) {
785
+ let o = t;
786
+ const s = X[e];
787
+ let c = null, i = 0, a = null;
788
+ const y = [], b = {}, m = function(h, I) {
789
+ i = o * 4 + 17, c = (function(d) {
790
+ const E = new Array(d);
791
+ for (let w = 0; w < d; w += 1) {
792
+ E[w] = new Array(d);
793
+ for (let S = 0; S < d; S += 1)
794
+ E[w][S] = null;
795
+ }
796
+ return E;
797
+ })(i), f(0, 0), f(i - 7, 0), f(0, i - 7), u(), l(), A(h, I), o >= 7 && g(h), a == null && (a = M(o, s, y)), C(a, I);
798
+ }, f = function(h, I) {
799
+ for (let d = -1; d <= 7; d += 1)
800
+ if (!(h + d <= -1 || i <= h + d))
801
+ for (let E = -1; E <= 7; E += 1)
802
+ I + E <= -1 || i <= I + E || (0 <= d && d <= 6 && (E == 0 || E == 6) || 0 <= E && E <= 6 && (d == 0 || d == 6) || 2 <= d && d <= 4 && 2 <= E && E <= 4 ? c[h + d][I + E] = !0 : c[h + d][I + E] = !1);
803
+ }, p = function() {
804
+ let h = 0, I = 0;
805
+ for (let d = 0; d < 8; d += 1) {
806
+ m(!0, d);
807
+ const E = F.getLostPoint(b);
808
+ (d == 0 || h > E) && (h = E, I = d);
809
+ }
810
+ return I;
811
+ }, l = function() {
812
+ for (let h = 8; h < i - 8; h += 1)
813
+ c[h][6] == null && (c[h][6] = h % 2 == 0);
814
+ for (let h = 8; h < i - 8; h += 1)
815
+ c[6][h] == null && (c[6][h] = h % 2 == 0);
816
+ }, u = function() {
817
+ const h = F.getPatternPosition(o);
818
+ for (let I = 0; I < h.length; I += 1)
819
+ for (let d = 0; d < h.length; d += 1) {
820
+ const E = h[I], w = h[d];
821
+ if (c[E][w] == null)
822
+ for (let S = -2; S <= 2; S += 1)
823
+ for (let N = -2; N <= 2; N += 1)
824
+ S == -2 || S == 2 || N == -2 || N == 2 || S == 0 && N == 0 ? c[E + S][w + N] = !0 : c[E + S][w + N] = !1;
825
+ }
826
+ }, g = function(h) {
827
+ const I = F.getBCHTypeNumber(o);
828
+ for (let d = 0; d < 18; d += 1) {
829
+ const E = !h && (I >> d & 1) == 1;
830
+ c[Math.floor(d / 3)][d % 3 + i - 8 - 3] = E;
831
+ }
832
+ for (let d = 0; d < 18; d += 1) {
833
+ const E = !h && (I >> d & 1) == 1;
834
+ c[d % 3 + i - 8 - 3][Math.floor(d / 3)] = E;
835
+ }
836
+ }, A = function(h, I) {
837
+ const d = s << 3 | I, E = F.getBCHTypeInfo(d);
838
+ for (let w = 0; w < 15; w += 1) {
839
+ const S = !h && (E >> w & 1) == 1;
840
+ w < 6 ? c[w][8] = S : w < 8 ? c[w + 1][8] = S : c[i - 15 + w][8] = S;
841
+ }
842
+ for (let w = 0; w < 15; w += 1) {
843
+ const S = !h && (E >> w & 1) == 1;
844
+ w < 8 ? c[8][i - w - 1] = S : w < 9 ? c[8][15 - w - 1 + 1] = S : c[8][15 - w - 1] = S;
845
+ }
846
+ c[i - 8][8] = !h;
847
+ }, C = function(h, I) {
848
+ let d = -1, E = i - 1, w = 7, S = 0;
849
+ const N = F.getMaskFunction(I);
850
+ for (let L = i - 1; L > 0; L -= 2)
851
+ for (L == 6 && (L -= 1); ; ) {
852
+ for (let _ = 0; _ < 2; _ += 1)
853
+ if (c[E][L - _] == null) {
854
+ let k = !1;
855
+ S < h.length && (k = (h[S] >>> w & 1) == 1), N(E, L - _) && (k = !k), c[E][L - _] = k, w -= 1, w == -1 && (S += 1, w = 7);
856
+ }
857
+ if (E += d, E < 0 || i <= E) {
858
+ E -= d, d = -d;
859
+ break;
860
+ }
861
+ }
862
+ }, x = function(h, I) {
863
+ let d = 0, E = 0, w = 0;
864
+ const S = new Array(I.length), N = new Array(I.length);
865
+ for (let $ = 0; $ < I.length; $ += 1) {
866
+ const D = I[$].dataCount, H = I[$].totalCount - D;
867
+ E = Math.max(E, D), w = Math.max(w, H), S[$] = new Array(D);
868
+ for (let G = 0; G < S[$].length; G += 1)
869
+ S[$][G] = 255 & h.getBuffer()[G + d];
870
+ d += D;
871
+ const ft = F.getErrorCorrectPolynomial(H), Et = q(S[$], ft.getLength() - 1).mod(ft);
872
+ N[$] = new Array(ft.getLength() - 1);
873
+ for (let G = 0; G < N[$].length; G += 1) {
874
+ const wt = G + Et.getLength() - N[$].length;
875
+ N[$][G] = wt >= 0 ? Et.getAt(wt) : 0;
876
+ }
877
+ }
878
+ let L = 0;
879
+ for (let $ = 0; $ < I.length; $ += 1)
880
+ L += I[$].totalCount;
881
+ const _ = new Array(L);
882
+ let k = 0;
883
+ for (let $ = 0; $ < E; $ += 1)
884
+ for (let D = 0; D < I.length; D += 1)
885
+ $ < S[D].length && (_[k] = S[D][$], k += 1);
886
+ for (let $ = 0; $ < w; $ += 1)
887
+ for (let D = 0; D < I.length; D += 1)
888
+ $ < N[D].length && (_[k] = N[D][$], k += 1);
889
+ return _;
890
+ }, M = function(h, I, d) {
891
+ const E = Mt.getRSBlocks(h, I), w = xt();
892
+ for (let N = 0; N < d.length; N += 1) {
893
+ const L = d[N];
894
+ w.put(L.getMode(), 4), w.put(L.getLength(), F.getLengthInBits(L.getMode(), h)), L.write(w);
895
+ }
896
+ let S = 0;
897
+ for (let N = 0; N < E.length; N += 1)
898
+ S += E[N].dataCount;
899
+ if (w.getLengthInBits() > S * 8)
900
+ throw "code length overflow. (" + w.getLengthInBits() + ">" + S * 8 + ")";
901
+ for (w.getLengthInBits() + 4 <= S * 8 && w.put(0, 4); w.getLengthInBits() % 8 != 0; )
902
+ w.putBit(!1);
903
+ for (; !(w.getLengthInBits() >= S * 8 || (w.put(236, 8), w.getLengthInBits() >= S * 8)); )
904
+ w.put(17, 8);
905
+ return x(w, E);
906
+ };
907
+ b.addData = function(h, I) {
908
+ I = I || "Byte";
909
+ let d = null;
910
+ switch (I) {
911
+ case "Numeric":
912
+ d = Ae(h);
913
+ break;
914
+ case "Alphanumeric":
915
+ d = Oe(h);
916
+ break;
917
+ case "Byte":
918
+ d = Ne(h);
919
+ break;
920
+ case "Kanji":
921
+ d = Me(h);
922
+ break;
923
+ default:
924
+ throw "mode:" + I;
925
+ }
926
+ y.push(d), a = null;
927
+ }, b.isDark = function(h, I) {
928
+ if (h < 0 || i <= h || I < 0 || i <= I)
929
+ throw h + "," + I;
930
+ return c[h][I];
931
+ }, b.getModuleCount = function() {
932
+ return i;
933
+ }, b.make = function() {
934
+ if (o < 1) {
935
+ let h = 1;
936
+ for (; h < 40; h++) {
937
+ const I = Mt.getRSBlocks(h, s), d = xt();
938
+ for (let w = 0; w < y.length; w++) {
939
+ const S = y[w];
940
+ d.put(S.getMode(), 4), d.put(S.getLength(), F.getLengthInBits(S.getMode(), h)), S.write(d);
941
+ }
942
+ let E = 0;
943
+ for (let w = 0; w < I.length; w++)
944
+ E += I[w].dataCount;
945
+ if (d.getLengthInBits() <= E * 8)
946
+ break;
947
+ }
948
+ o = h;
949
+ }
950
+ m(!1, p());
951
+ }, b.createTableTag = function(h, I) {
952
+ h = h || 2, I = typeof I > "u" ? h * 4 : I;
953
+ let d = "";
954
+ d += '<table style="', d += " border-width: 0px; border-style: none;", d += " border-collapse: collapse;", d += " padding: 0px; margin: " + I + "px;", d += '">', d += "<tbody>";
955
+ for (let E = 0; E < b.getModuleCount(); E += 1) {
956
+ d += "<tr>";
957
+ for (let w = 0; w < b.getModuleCount(); w += 1)
958
+ d += '<td style="', d += " border-width: 0px; border-style: none;", d += " border-collapse: collapse;", d += " padding: 0px; margin: 0px;", d += " width: " + h + "px;", d += " height: " + h + "px;", d += " background-color: ", d += b.isDark(E, w) ? "#000000" : "#ffffff", d += ";", d += '"/>';
959
+ d += "</tr>";
960
+ }
961
+ return d += "</tbody>", d += "</table>", d;
962
+ }, b.createSvgTag = function(h, I, d, E) {
963
+ let w = {};
964
+ typeof arguments[0] == "object" && (w = arguments[0], h = w.cellSize, I = w.margin, d = w.alt, E = w.title), h = h || 2, I = typeof I > "u" ? h * 4 : I, d = typeof d == "string" ? { text: d } : d || {}, d.text = d.text || null, d.id = d.text ? d.id || "qrcode-description" : null, E = typeof E == "string" ? { text: E } : E || {}, E.text = E.text || null, E.id = E.text ? E.id || "qrcode-title" : null;
965
+ const S = b.getModuleCount() * h + I * 2;
966
+ let N, L, _, k, $ = "", D;
967
+ for (D = "l" + h + ",0 0," + h + " -" + h + ",0 0,-" + h + "z ", $ += '<svg version="1.1" xmlns="http://www.w3.org/2000/svg"', $ += w.scalable ? "" : ' width="' + S + 'px" height="' + S + 'px"', $ += ' viewBox="0 0 ' + S + " " + S + '" ', $ += ' preserveAspectRatio="xMinYMin meet"', $ += E.text || d.text ? ' role="img" aria-labelledby="' + T([E.id, d.id].join(" ").trim()) + '"' : "", $ += ">", $ += E.text ? '<title id="' + T(E.id) + '">' + T(E.text) + "</title>" : "", $ += d.text ? '<description id="' + T(d.id) + '">' + T(d.text) + "</description>" : "", $ += '<rect width="100%" height="100%" fill="white" cx="0" cy="0"/>', $ += '<path d="', _ = 0; _ < b.getModuleCount(); _ += 1)
968
+ for (k = _ * h + I, N = 0; N < b.getModuleCount(); N += 1)
969
+ b.isDark(_, N) && (L = N * h + I, $ += "M" + L + "," + k + D);
970
+ return $ += '" stroke="transparent" fill="black"/>', $ += "</svg>", $;
971
+ }, b.createDataURL = function(h, I) {
972
+ h = h || 2, I = typeof I > "u" ? h * 4 : I;
973
+ const d = b.getModuleCount() * h + I * 2, E = I, w = d - I;
974
+ return _e(d, d, function(S, N) {
975
+ if (E <= S && S < w && E <= N && N < w) {
976
+ const L = Math.floor((S - E) / h), _ = Math.floor((N - E) / h);
977
+ return b.isDark(_, L) ? 0 : 1;
978
+ } else
979
+ return 1;
980
+ });
981
+ }, b.createImgTag = function(h, I, d) {
982
+ h = h || 2, I = typeof I > "u" ? h * 4 : I;
983
+ const E = b.getModuleCount() * h + I * 2;
984
+ let w = "";
985
+ return w += "<img", w += ' src="', w += b.createDataURL(h, I), w += '"', w += ' width="', w += E, w += '"', w += ' height="', w += E, w += '"', d && (w += ' alt="', w += T(d), w += '"'), w += "/>", w;
986
+ };
987
+ const T = function(h) {
988
+ let I = "";
989
+ for (let d = 0; d < h.length; d += 1) {
990
+ const E = h.charAt(d);
991
+ switch (E) {
992
+ case "<":
993
+ I += "&lt;";
994
+ break;
995
+ case ">":
996
+ I += "&gt;";
997
+ break;
998
+ case "&":
999
+ I += "&amp;";
1000
+ break;
1001
+ case '"':
1002
+ I += "&quot;";
1003
+ break;
1004
+ default:
1005
+ I += E;
1006
+ break;
1007
+ }
1008
+ }
1009
+ return I;
1010
+ }, O = function(h) {
1011
+ h = typeof h > "u" ? 2 : h;
1012
+ const d = b.getModuleCount() * 1 + h * 2, E = h, w = d - h;
1013
+ let S, N, L, _, k;
1014
+ const $ = {
1015
+ "██": "█",
1016
+ "█ ": "▀",
1017
+ " █": "▄",
1018
+ " ": " "
1019
+ }, D = {
1020
+ "██": "▀",
1021
+ "█ ": "▀",
1022
+ " █": " ",
1023
+ " ": " "
1024
+ };
1025
+ let H = "";
1026
+ for (S = 0; S < d; S += 2) {
1027
+ for (L = Math.floor((S - E) / 1), _ = Math.floor((S + 1 - E) / 1), N = 0; N < d; N += 1)
1028
+ k = "█", E <= N && N < w && E <= S && S < w && b.isDark(L, Math.floor((N - E) / 1)) && (k = " "), E <= N && N < w && E <= S + 1 && S + 1 < w && b.isDark(_, Math.floor((N - E) / 1)) ? k += " " : k += "█", H += h < 1 && S + 1 >= w ? D[k] : $[k];
1029
+ H += `
1030
+ `;
1031
+ }
1032
+ return d % 2 && h > 0 ? H.substring(0, H.length - d - 1) + Array(d + 1).join("▀") : H.substring(0, H.length - 1);
1033
+ };
1034
+ return b.createASCII = function(h, I) {
1035
+ if (h = h || 1, h < 2)
1036
+ return O(I);
1037
+ h -= 1, I = typeof I > "u" ? h * 2 : I;
1038
+ const d = b.getModuleCount() * h + I * 2, E = I, w = d - I;
1039
+ let S, N, L, _;
1040
+ const k = Array(h + 1).join("██"), $ = Array(h + 1).join(" ");
1041
+ let D = "", H = "";
1042
+ for (S = 0; S < d; S += 1) {
1043
+ for (L = Math.floor((S - E) / h), H = "", N = 0; N < d; N += 1)
1044
+ _ = 1, E <= N && N < w && E <= S && S < w && b.isDark(L, Math.floor((N - E) / h)) && (_ = 0), H += _ ? k : $;
1045
+ for (L = 0; L < h; L += 1)
1046
+ D += H + `
1047
+ `;
1048
+ }
1049
+ return D.substring(0, D.length - 1);
1050
+ }, b.renderTo2dContext = function(h, I) {
1051
+ I = I || 2;
1052
+ const d = b.getModuleCount();
1053
+ for (let E = 0; E < d; E++)
1054
+ for (let w = 0; w < d; w++)
1055
+ h.fillStyle = b.isDark(E, w) ? "black" : "white", h.fillRect(w * I, E * I, I, I);
1056
+ }, b;
1057
+ };
1058
+ V.stringToBytes = function(t) {
1059
+ const e = [];
1060
+ for (let r = 0; r < t.length; r += 1) {
1061
+ const n = t.charCodeAt(r);
1062
+ e.push(n & 255);
1063
+ }
1064
+ return e;
1065
+ };
1066
+ V.createStringToBytes = function(t, e) {
1067
+ const r = (function() {
1068
+ const o = $e(t), s = function() {
1069
+ const a = o.read();
1070
+ if (a == -1) throw "eof";
1071
+ return a;
1072
+ };
1073
+ let c = 0;
1074
+ const i = {};
1075
+ for (; ; ) {
1076
+ const a = o.read();
1077
+ if (a == -1) break;
1078
+ const y = s(), b = s(), m = s(), f = String.fromCharCode(a << 8 | y), p = b << 8 | m;
1079
+ i[f] = p, c += 1;
1080
+ }
1081
+ if (c != e)
1082
+ throw c + " != " + e;
1083
+ return i;
1084
+ })(), n = 63;
1085
+ return function(o) {
1086
+ const s = [];
1087
+ for (let c = 0; c < o.length; c += 1) {
1088
+ const i = o.charCodeAt(c);
1089
+ if (i < 128)
1090
+ s.push(i);
1091
+ else {
1092
+ const a = r[o.charAt(c)];
1093
+ typeof a == "number" ? (a & 255) == a ? s.push(a) : (s.push(a >>> 8), s.push(a & 255)) : s.push(n);
1094
+ }
1095
+ }
1096
+ return s;
1097
+ };
1098
+ };
1099
+ const P = {
1100
+ MODE_NUMBER: 1,
1101
+ MODE_ALPHA_NUM: 2,
1102
+ MODE_8BIT_BYTE: 4,
1103
+ MODE_KANJI: 8
1104
+ }, X = {
1105
+ L: 1,
1106
+ M: 0,
1107
+ Q: 3,
1108
+ H: 2
1109
+ }, U = {
1110
+ PATTERN000: 0,
1111
+ PATTERN001: 1,
1112
+ PATTERN010: 2,
1113
+ PATTERN011: 3,
1114
+ PATTERN100: 4,
1115
+ PATTERN101: 5,
1116
+ PATTERN110: 6,
1117
+ PATTERN111: 7
1118
+ }, F = (function() {
1119
+ const t = [
1120
+ [],
1121
+ [6, 18],
1122
+ [6, 22],
1123
+ [6, 26],
1124
+ [6, 30],
1125
+ [6, 34],
1126
+ [6, 22, 38],
1127
+ [6, 24, 42],
1128
+ [6, 26, 46],
1129
+ [6, 28, 50],
1130
+ [6, 30, 54],
1131
+ [6, 32, 58],
1132
+ [6, 34, 62],
1133
+ [6, 26, 46, 66],
1134
+ [6, 26, 48, 70],
1135
+ [6, 26, 50, 74],
1136
+ [6, 30, 54, 78],
1137
+ [6, 30, 56, 82],
1138
+ [6, 30, 58, 86],
1139
+ [6, 34, 62, 90],
1140
+ [6, 28, 50, 72, 94],
1141
+ [6, 26, 50, 74, 98],
1142
+ [6, 30, 54, 78, 102],
1143
+ [6, 28, 54, 80, 106],
1144
+ [6, 32, 58, 84, 110],
1145
+ [6, 30, 58, 86, 114],
1146
+ [6, 34, 62, 90, 118],
1147
+ [6, 26, 50, 74, 98, 122],
1148
+ [6, 30, 54, 78, 102, 126],
1149
+ [6, 26, 52, 78, 104, 130],
1150
+ [6, 30, 56, 82, 108, 134],
1151
+ [6, 34, 60, 86, 112, 138],
1152
+ [6, 30, 58, 86, 114, 142],
1153
+ [6, 34, 62, 90, 118, 146],
1154
+ [6, 30, 54, 78, 102, 126, 150],
1155
+ [6, 24, 50, 76, 102, 128, 154],
1156
+ [6, 28, 54, 80, 106, 132, 158],
1157
+ [6, 32, 58, 84, 110, 136, 162],
1158
+ [6, 26, 54, 82, 110, 138, 166],
1159
+ [6, 30, 58, 86, 114, 142, 170]
1160
+ ], e = 1335, r = 7973, n = 21522, o = {}, s = function(c) {
1161
+ let i = 0;
1162
+ for (; c != 0; )
1163
+ i += 1, c >>>= 1;
1164
+ return i;
1165
+ };
1166
+ return o.getBCHTypeInfo = function(c) {
1167
+ let i = c << 10;
1168
+ for (; s(i) - s(e) >= 0; )
1169
+ i ^= e << s(i) - s(e);
1170
+ return (c << 10 | i) ^ n;
1171
+ }, o.getBCHTypeNumber = function(c) {
1172
+ let i = c << 12;
1173
+ for (; s(i) - s(r) >= 0; )
1174
+ i ^= r << s(i) - s(r);
1175
+ return c << 12 | i;
1176
+ }, o.getPatternPosition = function(c) {
1177
+ return t[c - 1];
1178
+ }, o.getMaskFunction = function(c) {
1179
+ switch (c) {
1180
+ case U.PATTERN000:
1181
+ return function(i, a) {
1182
+ return (i + a) % 2 == 0;
1183
+ };
1184
+ case U.PATTERN001:
1185
+ return function(i, a) {
1186
+ return i % 2 == 0;
1187
+ };
1188
+ case U.PATTERN010:
1189
+ return function(i, a) {
1190
+ return a % 3 == 0;
1191
+ };
1192
+ case U.PATTERN011:
1193
+ return function(i, a) {
1194
+ return (i + a) % 3 == 0;
1195
+ };
1196
+ case U.PATTERN100:
1197
+ return function(i, a) {
1198
+ return (Math.floor(i / 2) + Math.floor(a / 3)) % 2 == 0;
1199
+ };
1200
+ case U.PATTERN101:
1201
+ return function(i, a) {
1202
+ return i * a % 2 + i * a % 3 == 0;
1203
+ };
1204
+ case U.PATTERN110:
1205
+ return function(i, a) {
1206
+ return (i * a % 2 + i * a % 3) % 2 == 0;
1207
+ };
1208
+ case U.PATTERN111:
1209
+ return function(i, a) {
1210
+ return (i * a % 3 + (i + a) % 2) % 2 == 0;
1211
+ };
1212
+ default:
1213
+ throw "bad maskPattern:" + c;
1214
+ }
1215
+ }, o.getErrorCorrectPolynomial = function(c) {
1216
+ let i = q([1], 0);
1217
+ for (let a = 0; a < c; a += 1)
1218
+ i = i.multiply(q([1, K.gexp(a)], 0));
1219
+ return i;
1220
+ }, o.getLengthInBits = function(c, i) {
1221
+ if (1 <= i && i < 10)
1222
+ switch (c) {
1223
+ case P.MODE_NUMBER:
1224
+ return 10;
1225
+ case P.MODE_ALPHA_NUM:
1226
+ return 9;
1227
+ case P.MODE_8BIT_BYTE:
1228
+ return 8;
1229
+ case P.MODE_KANJI:
1230
+ return 8;
1231
+ default:
1232
+ throw "mode:" + c;
1233
+ }
1234
+ else if (i < 27)
1235
+ switch (c) {
1236
+ case P.MODE_NUMBER:
1237
+ return 12;
1238
+ case P.MODE_ALPHA_NUM:
1239
+ return 11;
1240
+ case P.MODE_8BIT_BYTE:
1241
+ return 16;
1242
+ case P.MODE_KANJI:
1243
+ return 10;
1244
+ default:
1245
+ throw "mode:" + c;
1246
+ }
1247
+ else if (i < 41)
1248
+ switch (c) {
1249
+ case P.MODE_NUMBER:
1250
+ return 14;
1251
+ case P.MODE_ALPHA_NUM:
1252
+ return 13;
1253
+ case P.MODE_8BIT_BYTE:
1254
+ return 16;
1255
+ case P.MODE_KANJI:
1256
+ return 12;
1257
+ default:
1258
+ throw "mode:" + c;
1259
+ }
1260
+ else
1261
+ throw "type:" + i;
1262
+ }, o.getLostPoint = function(c) {
1263
+ const i = c.getModuleCount();
1264
+ let a = 0;
1265
+ for (let m = 0; m < i; m += 1)
1266
+ for (let f = 0; f < i; f += 1) {
1267
+ let p = 0;
1268
+ const l = c.isDark(m, f);
1269
+ for (let u = -1; u <= 1; u += 1)
1270
+ if (!(m + u < 0 || i <= m + u))
1271
+ for (let g = -1; g <= 1; g += 1)
1272
+ f + g < 0 || i <= f + g || u == 0 && g == 0 || l == c.isDark(m + u, f + g) && (p += 1);
1273
+ p > 5 && (a += 3 + p - 5);
1274
+ }
1275
+ for (let m = 0; m < i - 1; m += 1)
1276
+ for (let f = 0; f < i - 1; f += 1) {
1277
+ let p = 0;
1278
+ c.isDark(m, f) && (p += 1), c.isDark(m + 1, f) && (p += 1), c.isDark(m, f + 1) && (p += 1), c.isDark(m + 1, f + 1) && (p += 1), (p == 0 || p == 4) && (a += 3);
1279
+ }
1280
+ for (let m = 0; m < i; m += 1)
1281
+ for (let f = 0; f < i - 6; f += 1)
1282
+ c.isDark(m, f) && !c.isDark(m, f + 1) && c.isDark(m, f + 2) && c.isDark(m, f + 3) && c.isDark(m, f + 4) && !c.isDark(m, f + 5) && c.isDark(m, f + 6) && (a += 40);
1283
+ for (let m = 0; m < i; m += 1)
1284
+ for (let f = 0; f < i - 6; f += 1)
1285
+ c.isDark(f, m) && !c.isDark(f + 1, m) && c.isDark(f + 2, m) && c.isDark(f + 3, m) && c.isDark(f + 4, m) && !c.isDark(f + 5, m) && c.isDark(f + 6, m) && (a += 40);
1286
+ let y = 0;
1287
+ for (let m = 0; m < i; m += 1)
1288
+ for (let f = 0; f < i; f += 1)
1289
+ c.isDark(f, m) && (y += 1);
1290
+ const b = Math.abs(100 * y / i / i - 50) / 5;
1291
+ return a += b * 10, a;
1292
+ }, o;
1293
+ })(), K = (function() {
1294
+ const t = new Array(256), e = new Array(256);
1295
+ for (let n = 0; n < 8; n += 1)
1296
+ t[n] = 1 << n;
1297
+ for (let n = 8; n < 256; n += 1)
1298
+ t[n] = t[n - 4] ^ t[n - 5] ^ t[n - 6] ^ t[n - 8];
1299
+ for (let n = 0; n < 255; n += 1)
1300
+ e[t[n]] = n;
1301
+ const r = {};
1302
+ return r.glog = function(n) {
1303
+ if (n < 1)
1304
+ throw "glog(" + n + ")";
1305
+ return e[n];
1306
+ }, r.gexp = function(n) {
1307
+ for (; n < 0; )
1308
+ n += 255;
1309
+ for (; n >= 256; )
1310
+ n -= 255;
1311
+ return t[n];
1312
+ }, r;
1313
+ })(), q = function(t, e) {
1314
+ if (typeof t.length > "u")
1315
+ throw t.length + "/" + e;
1316
+ const r = (function() {
1317
+ let o = 0;
1318
+ for (; o < t.length && t[o] == 0; )
1319
+ o += 1;
1320
+ const s = new Array(t.length - o + e);
1321
+ for (let c = 0; c < t.length - o; c += 1)
1322
+ s[c] = t[c + o];
1323
+ return s;
1324
+ })(), n = {};
1325
+ return n.getAt = function(o) {
1326
+ return r[o];
1327
+ }, n.getLength = function() {
1328
+ return r.length;
1329
+ }, n.multiply = function(o) {
1330
+ const s = new Array(n.getLength() + o.getLength() - 1);
1331
+ for (let c = 0; c < n.getLength(); c += 1)
1332
+ for (let i = 0; i < o.getLength(); i += 1)
1333
+ s[c + i] ^= K.gexp(K.glog(n.getAt(c)) + K.glog(o.getAt(i)));
1334
+ return q(s, 0);
1335
+ }, n.mod = function(o) {
1336
+ if (n.getLength() - o.getLength() < 0)
1337
+ return n;
1338
+ const s = K.glog(n.getAt(0)) - K.glog(o.getAt(0)), c = new Array(n.getLength());
1339
+ for (let i = 0; i < n.getLength(); i += 1)
1340
+ c[i] = n.getAt(i);
1341
+ for (let i = 0; i < o.getLength(); i += 1)
1342
+ c[i] ^= K.gexp(K.glog(o.getAt(i)) + s);
1343
+ return q(c, 0).mod(o);
1344
+ }, n;
1345
+ }, Mt = (function() {
1346
+ const t = [
1347
+ // L
1348
+ // M
1349
+ // Q
1350
+ // H
1351
+ // 1
1352
+ [1, 26, 19],
1353
+ [1, 26, 16],
1354
+ [1, 26, 13],
1355
+ [1, 26, 9],
1356
+ // 2
1357
+ [1, 44, 34],
1358
+ [1, 44, 28],
1359
+ [1, 44, 22],
1360
+ [1, 44, 16],
1361
+ // 3
1362
+ [1, 70, 55],
1363
+ [1, 70, 44],
1364
+ [2, 35, 17],
1365
+ [2, 35, 13],
1366
+ // 4
1367
+ [1, 100, 80],
1368
+ [2, 50, 32],
1369
+ [2, 50, 24],
1370
+ [4, 25, 9],
1371
+ // 5
1372
+ [1, 134, 108],
1373
+ [2, 67, 43],
1374
+ [2, 33, 15, 2, 34, 16],
1375
+ [2, 33, 11, 2, 34, 12],
1376
+ // 6
1377
+ [2, 86, 68],
1378
+ [4, 43, 27],
1379
+ [4, 43, 19],
1380
+ [4, 43, 15],
1381
+ // 7
1382
+ [2, 98, 78],
1383
+ [4, 49, 31],
1384
+ [2, 32, 14, 4, 33, 15],
1385
+ [4, 39, 13, 1, 40, 14],
1386
+ // 8
1387
+ [2, 121, 97],
1388
+ [2, 60, 38, 2, 61, 39],
1389
+ [4, 40, 18, 2, 41, 19],
1390
+ [4, 40, 14, 2, 41, 15],
1391
+ // 9
1392
+ [2, 146, 116],
1393
+ [3, 58, 36, 2, 59, 37],
1394
+ [4, 36, 16, 4, 37, 17],
1395
+ [4, 36, 12, 4, 37, 13],
1396
+ // 10
1397
+ [2, 86, 68, 2, 87, 69],
1398
+ [4, 69, 43, 1, 70, 44],
1399
+ [6, 43, 19, 2, 44, 20],
1400
+ [6, 43, 15, 2, 44, 16],
1401
+ // 11
1402
+ [4, 101, 81],
1403
+ [1, 80, 50, 4, 81, 51],
1404
+ [4, 50, 22, 4, 51, 23],
1405
+ [3, 36, 12, 8, 37, 13],
1406
+ // 12
1407
+ [2, 116, 92, 2, 117, 93],
1408
+ [6, 58, 36, 2, 59, 37],
1409
+ [4, 46, 20, 6, 47, 21],
1410
+ [7, 42, 14, 4, 43, 15],
1411
+ // 13
1412
+ [4, 133, 107],
1413
+ [8, 59, 37, 1, 60, 38],
1414
+ [8, 44, 20, 4, 45, 21],
1415
+ [12, 33, 11, 4, 34, 12],
1416
+ // 14
1417
+ [3, 145, 115, 1, 146, 116],
1418
+ [4, 64, 40, 5, 65, 41],
1419
+ [11, 36, 16, 5, 37, 17],
1420
+ [11, 36, 12, 5, 37, 13],
1421
+ // 15
1422
+ [5, 109, 87, 1, 110, 88],
1423
+ [5, 65, 41, 5, 66, 42],
1424
+ [5, 54, 24, 7, 55, 25],
1425
+ [11, 36, 12, 7, 37, 13],
1426
+ // 16
1427
+ [5, 122, 98, 1, 123, 99],
1428
+ [7, 73, 45, 3, 74, 46],
1429
+ [15, 43, 19, 2, 44, 20],
1430
+ [3, 45, 15, 13, 46, 16],
1431
+ // 17
1432
+ [1, 135, 107, 5, 136, 108],
1433
+ [10, 74, 46, 1, 75, 47],
1434
+ [1, 50, 22, 15, 51, 23],
1435
+ [2, 42, 14, 17, 43, 15],
1436
+ // 18
1437
+ [5, 150, 120, 1, 151, 121],
1438
+ [9, 69, 43, 4, 70, 44],
1439
+ [17, 50, 22, 1, 51, 23],
1440
+ [2, 42, 14, 19, 43, 15],
1441
+ // 19
1442
+ [3, 141, 113, 4, 142, 114],
1443
+ [3, 70, 44, 11, 71, 45],
1444
+ [17, 47, 21, 4, 48, 22],
1445
+ [9, 39, 13, 16, 40, 14],
1446
+ // 20
1447
+ [3, 135, 107, 5, 136, 108],
1448
+ [3, 67, 41, 13, 68, 42],
1449
+ [15, 54, 24, 5, 55, 25],
1450
+ [15, 43, 15, 10, 44, 16],
1451
+ // 21
1452
+ [4, 144, 116, 4, 145, 117],
1453
+ [17, 68, 42],
1454
+ [17, 50, 22, 6, 51, 23],
1455
+ [19, 46, 16, 6, 47, 17],
1456
+ // 22
1457
+ [2, 139, 111, 7, 140, 112],
1458
+ [17, 74, 46],
1459
+ [7, 54, 24, 16, 55, 25],
1460
+ [34, 37, 13],
1461
+ // 23
1462
+ [4, 151, 121, 5, 152, 122],
1463
+ [4, 75, 47, 14, 76, 48],
1464
+ [11, 54, 24, 14, 55, 25],
1465
+ [16, 45, 15, 14, 46, 16],
1466
+ // 24
1467
+ [6, 147, 117, 4, 148, 118],
1468
+ [6, 73, 45, 14, 74, 46],
1469
+ [11, 54, 24, 16, 55, 25],
1470
+ [30, 46, 16, 2, 47, 17],
1471
+ // 25
1472
+ [8, 132, 106, 4, 133, 107],
1473
+ [8, 75, 47, 13, 76, 48],
1474
+ [7, 54, 24, 22, 55, 25],
1475
+ [22, 45, 15, 13, 46, 16],
1476
+ // 26
1477
+ [10, 142, 114, 2, 143, 115],
1478
+ [19, 74, 46, 4, 75, 47],
1479
+ [28, 50, 22, 6, 51, 23],
1480
+ [33, 46, 16, 4, 47, 17],
1481
+ // 27
1482
+ [8, 152, 122, 4, 153, 123],
1483
+ [22, 73, 45, 3, 74, 46],
1484
+ [8, 53, 23, 26, 54, 24],
1485
+ [12, 45, 15, 28, 46, 16],
1486
+ // 28
1487
+ [3, 147, 117, 10, 148, 118],
1488
+ [3, 73, 45, 23, 74, 46],
1489
+ [4, 54, 24, 31, 55, 25],
1490
+ [11, 45, 15, 31, 46, 16],
1491
+ // 29
1492
+ [7, 146, 116, 7, 147, 117],
1493
+ [21, 73, 45, 7, 74, 46],
1494
+ [1, 53, 23, 37, 54, 24],
1495
+ [19, 45, 15, 26, 46, 16],
1496
+ // 30
1497
+ [5, 145, 115, 10, 146, 116],
1498
+ [19, 75, 47, 10, 76, 48],
1499
+ [15, 54, 24, 25, 55, 25],
1500
+ [23, 45, 15, 25, 46, 16],
1501
+ // 31
1502
+ [13, 145, 115, 3, 146, 116],
1503
+ [2, 74, 46, 29, 75, 47],
1504
+ [42, 54, 24, 1, 55, 25],
1505
+ [23, 45, 15, 28, 46, 16],
1506
+ // 32
1507
+ [17, 145, 115],
1508
+ [10, 74, 46, 23, 75, 47],
1509
+ [10, 54, 24, 35, 55, 25],
1510
+ [19, 45, 15, 35, 46, 16],
1511
+ // 33
1512
+ [17, 145, 115, 1, 146, 116],
1513
+ [14, 74, 46, 21, 75, 47],
1514
+ [29, 54, 24, 19, 55, 25],
1515
+ [11, 45, 15, 46, 46, 16],
1516
+ // 34
1517
+ [13, 145, 115, 6, 146, 116],
1518
+ [14, 74, 46, 23, 75, 47],
1519
+ [44, 54, 24, 7, 55, 25],
1520
+ [59, 46, 16, 1, 47, 17],
1521
+ // 35
1522
+ [12, 151, 121, 7, 152, 122],
1523
+ [12, 75, 47, 26, 76, 48],
1524
+ [39, 54, 24, 14, 55, 25],
1525
+ [22, 45, 15, 41, 46, 16],
1526
+ // 36
1527
+ [6, 151, 121, 14, 152, 122],
1528
+ [6, 75, 47, 34, 76, 48],
1529
+ [46, 54, 24, 10, 55, 25],
1530
+ [2, 45, 15, 64, 46, 16],
1531
+ // 37
1532
+ [17, 152, 122, 4, 153, 123],
1533
+ [29, 74, 46, 14, 75, 47],
1534
+ [49, 54, 24, 10, 55, 25],
1535
+ [24, 45, 15, 46, 46, 16],
1536
+ // 38
1537
+ [4, 152, 122, 18, 153, 123],
1538
+ [13, 74, 46, 32, 75, 47],
1539
+ [48, 54, 24, 14, 55, 25],
1540
+ [42, 45, 15, 32, 46, 16],
1541
+ // 39
1542
+ [20, 147, 117, 4, 148, 118],
1543
+ [40, 75, 47, 7, 76, 48],
1544
+ [43, 54, 24, 22, 55, 25],
1545
+ [10, 45, 15, 67, 46, 16],
1546
+ // 40
1547
+ [19, 148, 118, 6, 149, 119],
1548
+ [18, 75, 47, 31, 76, 48],
1549
+ [34, 54, 24, 34, 55, 25],
1550
+ [20, 45, 15, 61, 46, 16]
1551
+ ], e = function(o, s) {
1552
+ const c = {};
1553
+ return c.totalCount = o, c.dataCount = s, c;
1554
+ }, r = {}, n = function(o, s) {
1555
+ switch (s) {
1556
+ case X.L:
1557
+ return t[(o - 1) * 4 + 0];
1558
+ case X.M:
1559
+ return t[(o - 1) * 4 + 1];
1560
+ case X.Q:
1561
+ return t[(o - 1) * 4 + 2];
1562
+ case X.H:
1563
+ return t[(o - 1) * 4 + 3];
1564
+ default:
1565
+ return;
1566
+ }
1567
+ };
1568
+ return r.getRSBlocks = function(o, s) {
1569
+ const c = n(o, s);
1570
+ if (typeof c > "u")
1571
+ throw "bad rs block @ typeNumber:" + o + "/errorCorrectionLevel:" + s;
1572
+ const i = c.length / 3, a = [];
1573
+ for (let y = 0; y < i; y += 1) {
1574
+ const b = c[y * 3 + 0], m = c[y * 3 + 1], f = c[y * 3 + 2];
1575
+ for (let p = 0; p < b; p += 1)
1576
+ a.push(e(m, f));
1577
+ }
1578
+ return a;
1579
+ }, r;
1580
+ })(), xt = function() {
1581
+ const t = [];
1582
+ let e = 0;
1583
+ const r = {};
1584
+ return r.getBuffer = function() {
1585
+ return t;
1586
+ }, r.getAt = function(n) {
1587
+ const o = Math.floor(n / 8);
1588
+ return (t[o] >>> 7 - n % 8 & 1) == 1;
1589
+ }, r.put = function(n, o) {
1590
+ for (let s = 0; s < o; s += 1)
1591
+ r.putBit((n >>> o - s - 1 & 1) == 1);
1592
+ }, r.getLengthInBits = function() {
1593
+ return e;
1594
+ }, r.putBit = function(n) {
1595
+ const o = Math.floor(e / 8);
1596
+ t.length <= o && t.push(0), n && (t[o] |= 128 >>> e % 8), e += 1;
1597
+ }, r;
1598
+ }, Ae = function(t) {
1599
+ const e = P.MODE_NUMBER, r = t, n = {};
1600
+ n.getMode = function() {
1601
+ return e;
1602
+ }, n.getLength = function(c) {
1603
+ return r.length;
1604
+ }, n.write = function(c) {
1605
+ const i = r;
1606
+ let a = 0;
1607
+ for (; a + 2 < i.length; )
1608
+ c.put(o(i.substring(a, a + 3)), 10), a += 3;
1609
+ a < i.length && (i.length - a == 1 ? c.put(o(i.substring(a, a + 1)), 4) : i.length - a == 2 && c.put(o(i.substring(a, a + 2)), 7));
1610
+ };
1611
+ const o = function(c) {
1612
+ let i = 0;
1613
+ for (let a = 0; a < c.length; a += 1)
1614
+ i = i * 10 + s(c.charAt(a));
1615
+ return i;
1616
+ }, s = function(c) {
1617
+ if ("0" <= c && c <= "9")
1618
+ return c.charCodeAt(0) - 48;
1619
+ throw "illegal char :" + c;
1620
+ };
1621
+ return n;
1622
+ }, Oe = function(t) {
1623
+ const e = P.MODE_ALPHA_NUM, r = t, n = {};
1624
+ n.getMode = function() {
1625
+ return e;
1626
+ }, n.getLength = function(s) {
1627
+ return r.length;
1628
+ }, n.write = function(s) {
1629
+ const c = r;
1630
+ let i = 0;
1631
+ for (; i + 1 < c.length; )
1632
+ s.put(
1633
+ o(c.charAt(i)) * 45 + o(c.charAt(i + 1)),
1634
+ 11
1635
+ ), i += 2;
1636
+ i < c.length && s.put(o(c.charAt(i)), 6);
1637
+ };
1638
+ const o = function(s) {
1639
+ if ("0" <= s && s <= "9")
1640
+ return s.charCodeAt(0) - 48;
1641
+ if ("A" <= s && s <= "Z")
1642
+ return s.charCodeAt(0) - 65 + 10;
1643
+ switch (s) {
1644
+ case " ":
1645
+ return 36;
1646
+ case "$":
1647
+ return 37;
1648
+ case "%":
1649
+ return 38;
1650
+ case "*":
1651
+ return 39;
1652
+ case "+":
1653
+ return 40;
1654
+ case "-":
1655
+ return 41;
1656
+ case ".":
1657
+ return 42;
1658
+ case "/":
1659
+ return 43;
1660
+ case ":":
1661
+ return 44;
1662
+ default:
1663
+ throw "illegal char :" + s;
1664
+ }
1665
+ };
1666
+ return n;
1667
+ }, Ne = function(t) {
1668
+ const e = P.MODE_8BIT_BYTE, r = V.stringToBytes(t), n = {};
1669
+ return n.getMode = function() {
1670
+ return e;
1671
+ }, n.getLength = function(o) {
1672
+ return r.length;
1673
+ }, n.write = function(o) {
1674
+ for (let s = 0; s < r.length; s += 1)
1675
+ o.put(r[s], 8);
1676
+ }, n;
1677
+ }, Me = function(t) {
1678
+ const e = P.MODE_KANJI, r = V.stringToBytes;
1679
+ (function(s, c) {
1680
+ const i = r(s);
1681
+ if (i.length != 2 || (i[0] << 8 | i[1]) != c)
1682
+ throw "sjis not supported.";
1683
+ })("友", 38726);
1684
+ const n = r(t), o = {};
1685
+ return o.getMode = function() {
1686
+ return e;
1687
+ }, o.getLength = function(s) {
1688
+ return ~~(n.length / 2);
1689
+ }, o.write = function(s) {
1690
+ const c = n;
1691
+ let i = 0;
1692
+ for (; i + 1 < c.length; ) {
1693
+ let a = (255 & c[i]) << 8 | 255 & c[i + 1];
1694
+ if (33088 <= a && a <= 40956)
1695
+ a -= 33088;
1696
+ else if (57408 <= a && a <= 60351)
1697
+ a -= 49472;
1698
+ else
1699
+ throw "illegal char at " + (i + 1) + "/" + a;
1700
+ a = (a >>> 8 & 255) * 192 + (a & 255), s.put(a, 13), i += 2;
1701
+ }
1702
+ if (i < c.length)
1703
+ throw "illegal char at " + (i + 1);
1704
+ }, o;
1705
+ }, Ut = function() {
1706
+ const t = [], e = {};
1707
+ return e.writeByte = function(r) {
1708
+ t.push(r & 255);
1709
+ }, e.writeShort = function(r) {
1710
+ e.writeByte(r), e.writeByte(r >>> 8);
1711
+ }, e.writeBytes = function(r, n, o) {
1712
+ n = n || 0, o = o || r.length;
1713
+ for (let s = 0; s < o; s += 1)
1714
+ e.writeByte(r[s + n]);
1715
+ }, e.writeString = function(r) {
1716
+ for (let n = 0; n < r.length; n += 1)
1717
+ e.writeByte(r.charCodeAt(n));
1718
+ }, e.toByteArray = function() {
1719
+ return t;
1720
+ }, e.toString = function() {
1721
+ let r = "";
1722
+ r += "[";
1723
+ for (let n = 0; n < t.length; n += 1)
1724
+ n > 0 && (r += ","), r += t[n];
1725
+ return r += "]", r;
1726
+ }, e;
1727
+ }, xe = function() {
1728
+ let t = 0, e = 0, r = 0, n = "";
1729
+ const o = {}, s = function(i) {
1730
+ n += String.fromCharCode(c(i & 63));
1731
+ }, c = function(i) {
1732
+ if (i < 0)
1733
+ throw "n:" + i;
1734
+ if (i < 26)
1735
+ return 65 + i;
1736
+ if (i < 52)
1737
+ return 97 + (i - 26);
1738
+ if (i < 62)
1739
+ return 48 + (i - 52);
1740
+ if (i == 62)
1741
+ return 43;
1742
+ if (i == 63)
1743
+ return 47;
1744
+ throw "n:" + i;
1745
+ };
1746
+ return o.writeByte = function(i) {
1747
+ for (t = t << 8 | i & 255, e += 8, r += 1; e >= 6; )
1748
+ s(t >>> e - 6), e -= 6;
1749
+ }, o.flush = function() {
1750
+ if (e > 0 && (s(t << 6 - e), t = 0, e = 0), r % 3 != 0) {
1751
+ const i = 3 - r % 3;
1752
+ for (let a = 0; a < i; a += 1)
1753
+ n += "=";
1754
+ }
1755
+ }, o.toString = function() {
1756
+ return n;
1757
+ }, o;
1758
+ }, $e = function(t) {
1759
+ const e = t;
1760
+ let r = 0, n = 0, o = 0;
1761
+ const s = {};
1762
+ s.read = function() {
1763
+ for (; o < 8; ) {
1764
+ if (r >= e.length) {
1765
+ if (o == 0)
1766
+ return -1;
1767
+ throw "unexpected end of file./" + o;
1768
+ }
1769
+ const a = e.charAt(r);
1770
+ if (r += 1, a == "=")
1771
+ return o = 0, -1;
1772
+ if (a.match(/^\s$/))
1773
+ continue;
1774
+ n = n << 6 | c(a.charCodeAt(0)), o += 6;
1775
+ }
1776
+ const i = n >>> o - 8 & 255;
1777
+ return o -= 8, i;
1778
+ };
1779
+ const c = function(i) {
1780
+ if (65 <= i && i <= 90)
1781
+ return i - 65;
1782
+ if (97 <= i && i <= 122)
1783
+ return i - 97 + 26;
1784
+ if (48 <= i && i <= 57)
1785
+ return i - 48 + 52;
1786
+ if (i == 43)
1787
+ return 62;
1788
+ if (i == 47)
1789
+ return 63;
1790
+ throw "c:" + i;
1791
+ };
1792
+ return s;
1793
+ }, Le = function(t, e) {
1794
+ const r = t, n = e, o = new Array(t * e), s = {};
1795
+ s.setPixel = function(y, b, m) {
1796
+ o[b * r + y] = m;
1797
+ }, s.write = function(y) {
1798
+ y.writeString("GIF87a"), y.writeShort(r), y.writeShort(n), y.writeByte(128), y.writeByte(0), y.writeByte(0), y.writeByte(0), y.writeByte(0), y.writeByte(0), y.writeByte(255), y.writeByte(255), y.writeByte(255), y.writeString(","), y.writeShort(0), y.writeShort(0), y.writeShort(r), y.writeShort(n), y.writeByte(0);
1799
+ const b = 2, m = i(b);
1800
+ y.writeByte(b);
1801
+ let f = 0;
1802
+ for (; m.length - f > 255; )
1803
+ y.writeByte(255), y.writeBytes(m, f, 255), f += 255;
1804
+ y.writeByte(m.length - f), y.writeBytes(m, f, m.length - f), y.writeByte(0), y.writeString(";");
1805
+ };
1806
+ const c = function(y) {
1807
+ const b = y;
1808
+ let m = 0, f = 0;
1809
+ const p = {};
1810
+ return p.write = function(l, u) {
1811
+ if (l >>> u)
1812
+ throw "length over";
1813
+ for (; m + u >= 8; )
1814
+ b.writeByte(255 & (l << m | f)), u -= 8 - m, l >>>= 8 - m, f = 0, m = 0;
1815
+ f = l << m | f, m = m + u;
1816
+ }, p.flush = function() {
1817
+ m > 0 && b.writeByte(f);
1818
+ }, p;
1819
+ }, i = function(y) {
1820
+ const b = 1 << y, m = (1 << y) + 1;
1821
+ let f = y + 1;
1822
+ const p = a();
1823
+ for (let C = 0; C < b; C += 1)
1824
+ p.add(String.fromCharCode(C));
1825
+ p.add(String.fromCharCode(b)), p.add(String.fromCharCode(m));
1826
+ const l = Ut(), u = c(l);
1827
+ u.write(b, f);
1828
+ let g = 0, A = String.fromCharCode(o[g]);
1829
+ for (g += 1; g < o.length; ) {
1830
+ const C = String.fromCharCode(o[g]);
1831
+ g += 1, p.contains(A + C) ? A = A + C : (u.write(p.indexOf(A), f), p.size() < 4095 && (p.size() == 1 << f && (f += 1), p.add(A + C)), A = C);
1832
+ }
1833
+ return u.write(p.indexOf(A), f), u.write(m, f), u.flush(), l.toByteArray();
1834
+ }, a = function() {
1835
+ const y = {};
1836
+ let b = 0;
1837
+ const m = {};
1838
+ return m.add = function(f) {
1839
+ if (m.contains(f))
1840
+ throw "dup key:" + f;
1841
+ y[f] = b, b += 1;
1842
+ }, m.size = function() {
1843
+ return b;
1844
+ }, m.indexOf = function(f) {
1845
+ return y[f];
1846
+ }, m.contains = function(f) {
1847
+ return typeof y[f] < "u";
1848
+ }, m;
1849
+ };
1850
+ return s;
1851
+ }, _e = function(t, e, r) {
1852
+ const n = Le(t, e);
1853
+ for (let i = 0; i < e; i += 1)
1854
+ for (let a = 0; a < t; a += 1)
1855
+ n.setPixel(a, i, r(a, i));
1856
+ const o = Ut();
1857
+ n.write(o);
1858
+ const s = xe(), c = o.toByteArray();
1859
+ for (let i = 0; i < c.length; i += 1)
1860
+ s.writeByte(c[i]);
1861
+ return s.flush(), "data:image/gif;base64," + s;
1862
+ };
1863
+ V.stringToBytes;
1864
+ function De(t) {
1865
+ const e = V(0, "M"), r = Array.from(new TextEncoder().encode(t), (s) => String.fromCharCode(s)).join("");
1866
+ e.addData(r, /^\d+$/.test(t) ? "Numeric" : "Byte"), e.make();
1867
+ const n = e.getModuleCount();
1868
+ let o = "";
1869
+ for (let s = 0; s < n; s++) for (let c = 0; c < n; c++) e.isDark(s, c) && (o += `M${c} ${s}h1v1h-1z`);
1870
+ return { count: n, path: o };
1871
+ }
1872
+ class ut extends Error {
1873
+ constructor(r) {
1874
+ super(r[0]?.message || "题卡数据无效");
1875
+ Tt(this, "issues");
1876
+ this.name = "AnswerSheetDataError", this.issues = r;
1877
+ }
1878
+ }
1879
+ function ke(t, e) {
1880
+ const r = (l, u = "题卡数据结构无效") => {
1881
+ throw new ut([{ code: "INVALID_DATA", path: l, message: u }]);
1882
+ }, n = (l, u) => !l || typeof l != "object" || Array.isArray(l) ? r(u) : l, o = (l, u) => Array.isArray(l) ? l : r(u), s = (l, u) => {
1883
+ typeof l != "string" && r(u);
1884
+ }, c = (l, u, g = 0, A = 1e5) => {
1885
+ (typeof l != "number" || !Number.isFinite(l) || l < g || l > A) && r(u);
1886
+ }, i = (l, u) => {
1887
+ n(l, u);
1888
+ const g = e.validateDocument(l);
1889
+ g.length && r(u, g[0]);
1890
+ }, a = (l, u) => {
1891
+ const g = n(l, u);
1892
+ if (s(g.id, `${u}.id`), s(g.label, `${u}.label`), (typeof g.multiple != "boolean" || typeof g.breakBefore != "boolean") && r(u), g.contentTarget !== void 0 && g.contentTarget !== null) {
1893
+ const A = n(g.contentTarget, `${u}.contentTarget`);
1894
+ s(A.groupId, `${u}.contentTarget.groupId`), o(A.optionIds, `${u}.contentTarget.optionIds`).forEach((C, x) => s(C, `${u}.contentTarget.optionIds.${x}`));
1895
+ }
1896
+ o(g.options, `${u}.options`).forEach((A, C) => {
1897
+ const x = n(A, `${u}.options.${C}`);
1898
+ s(x.id, `${u}.options.${C}.id`), s(x.label, `${u}.options.${C}.label`);
1899
+ }), o(g.correctIds, `${u}.correctIds`).forEach((A, C) => s(A, `${u}.correctIds.${C}`));
1900
+ }, y = (l, u) => {
1901
+ const g = n(l, u);
1902
+ (!["row", "column"].includes(String(g.direction)) || !["concentrated", "distributed", "stem", "option"].includes(String(g.presentation)) || !["box", "check", "bubble"].includes(String(g.marker))) && r(u), c(g.rowsPerColumn, `${u}.rowsPerColumn`, 1, 5), c(g.rowGap, `${u}.rowGap`, 0, 64), c(g.columnGap, `${u}.columnGap`, 0, 64), o(g.questions, `${u}.questions`).forEach((A, C) => a(A, `${u}.questions.${C}`));
1903
+ }, b = /* @__PURE__ */ new WeakSet(), m = (l, u) => {
1904
+ if (!(!l || typeof l != "object")) {
1905
+ if (b.has(l)) return r(u, "题卡必须是无循环引用的 JSON 数据");
1906
+ b.add(l), Object.entries(l).forEach(([g, A]) => m(A, `${u}.${g}`)), b.delete(l);
1907
+ }
1908
+ }, f = n(t, "");
1909
+ if (f.version !== 1 && r("version", "不支持的题卡数据版本"), s(f.title, "title"), f.usage !== void 0 && !["exam", "homework"].includes(String(f.usage)) && r("usage"), ["questionCard", "scanMarking", "halfPoint", "mergeObjective"].forEach((l) => {
1910
+ f[l] !== void 0 && typeof f[l] != "boolean" && r(l);
1911
+ }), ["a4", "a3-two", "a3-three"].includes(String(f.preset)) || r("preset"), c(f.margin, "margin", 0, 100), c(f.gap, "gap", 0, 100), f.creation) {
1912
+ const l = n(f.creation, "creation");
1913
+ ["template", "exam"].includes(String(l.mode)) || r("creation.mode"), ["name", "grade", "subject"].forEach((u) => s(l[u], `creation.${u}`));
1914
+ for (const u of ["gradeCode", "courseCode", "subjectCode"]) l[u] !== void 0 && (typeof l[u] != "string" || !l[u].trim()) && r(`creation.${u}`);
1915
+ l.phaseCode !== void 0 && !["P", "J", "S"].includes(String(l.phaseCode)) && r("creation.phaseCode"), l.createMode !== void 0 && !["MANUALLY", "IMPORTED", "THIRD"].includes(String(l.createMode)) && r("creation.createMode");
1916
+ for (const u of ["id", "exampaperId"]) if (l[u] !== void 0) {
1917
+ const g = l[u];
1918
+ typeof g == "string" && g.trim() || typeof g == "number" && Number.isSafeInteger(g) && g >= 0 || r(`creation.${u}`);
1919
+ }
1920
+ }
1921
+ if (f.paperTitle) {
1922
+ const l = n(f.paperTitle, "paperTitle");
1923
+ s(l.id, "paperTitle.id"), c(l.height, "paperTitle.height", 1, 1e3), i(l.document, "paperTitle.document");
1924
+ }
1925
+ if (f.header) {
1926
+ const l = n(f.header, "header");
1927
+ ["code", "school"].includes(String(l.kaohao)) || r("header.kaohao"), c(l.weishu, "header.weishu", 1, 20), l.tiaomaStyle !== void 0 && ![1, 2].includes(l.tiaomaStyle) && r("header.tiaomaStyle"), l.classText !== void 0 && typeof l.classText != "boolean" && r("header.classText");
1928
+ }
1929
+ if (f.recognition !== void 0) {
1930
+ const l = n(f.recognition, "recognition");
1931
+ for (const u of ["examQrCode", "subjectMarkers", "pointBlack"]) l[u] !== void 0 && typeof l[u] != "boolean" && r(`recognition.${u}`);
1932
+ }
1933
+ o(f.blocks, "blocks").forEach((l, u) => {
1934
+ const g = `blocks.${u}`, A = n(l, g);
1935
+ if (s(A.id, `${g}.id`), s(A.title, `${g}.title`), c(A.answerHeight, `${g}.answerHeight`), i(A.document, `${g}.document`), A.kind === "area") {
1936
+ (!["forbiden", "editArea"].includes(String(A.areaType)) || A.reference || A.choices || A.exercise) && r(`${g}.areaType`), c(A.answerHeight, `${g}.answerHeight`, 100, 4e3);
1937
+ return;
1938
+ }
1939
+ if (!A.reference) {
1940
+ if (A.choices) {
1941
+ y(A.choices, `${g}.choices`);
1942
+ return;
1943
+ }
1944
+ r(`${g}.reference`, "请使用包含 reference 题目结构的制卡数据");
1945
+ }
1946
+ const C = n(A.reference, `${g}.reference`);
1947
+ C.material !== void 0 && i(C.material, `${g}.reference.material`), C.textVersion !== void 0 && C.textVersion !== 1 && r(`${g}.reference.textVersion`), Object.hasOwn(yt, String(C.type)) || r(`${g}.reference.type`), y(C.layout, `${g}.reference.layout`), c(C.optionalHeight, `${g}.reference.optionalHeight`), o(C.questions, `${g}.reference.questions`).forEach((x, M) => {
1948
+ const T = `${g}.reference.questions.${M}`, O = n(x, T);
1949
+ Object.hasOwn(lt, String(O.type)) || r(`${T}.type`), s(O.id, `${T}.id`), s(O.label, `${T}.label`), a(O.choice, `${T}.choice`), ["height", "contentHeight", "characters", "lines"].forEach((I) => c(O[I], `${T}.${I}`)), i(O.document, `${T}.document`);
1950
+ const h = (I, d) => {
1951
+ if (!I) return;
1952
+ const E = n(I, d);
1953
+ i(E.content, `${d}.content`), n(E.layout, `${d}.layout`), s(E.groupId, `${d}.groupId`), o(E.itemsContent, `${d}.itemsContent`).forEach((w, S) => {
1954
+ const N = n(w, `${d}.itemsContent.${S}`);
1955
+ s(N.id, `${d}.itemsContent.${S}.id`), s(N.key, `${d}.itemsContent.${S}.key`), i(N.content, `${d}.itemsContent.${S}.content`);
1956
+ });
1957
+ };
1958
+ h(O.text, `${T}.text`), o(O.parts, `${T}.parts`).forEach((I, d) => {
1959
+ const E = `${T}.parts.${d}`, w = n(I, E);
1960
+ s(w.id, `${E}.id`), s(w.label, `${E}.label`), c(w.width, `${E}.width`), c(w.height, `${E}.height`), i(w.document, `${E}.document`), a(w.choice, `${E}.choice`), h(w.text, `${E}.text`);
1961
+ });
1962
+ });
1963
+ }), m(t, "");
1964
+ const p = It(t);
1965
+ (p.columnWidth < 100 || p.contentHeight < 100) && r("margin", "边距或栏间距过大,纸张没有足够的作答区域");
1966
+ }
1967
+ function rt(t) {
1968
+ return !t || t.marks?.some((e) => e.type === "documentLabel") ? !1 : t.type === "text" ? !!t.text?.trim() : t.type === "image" ? !!t.attrs?.src : t.type === "formula" || t.type === "blockFormula" ? !!t.attrs?.latex?.trim() : !!t.content?.some(rt);
1969
+ }
1970
+ function Nn(t, e) {
1971
+ try {
1972
+ ke(t, e);
1973
+ } catch (p) {
1974
+ return { valid: !1, issues: p instanceof ut ? p.issues : [{ code: "INVALID_DATA", path: "", message: "题卡数据无法读取" }] };
1975
+ }
1976
+ const r = [];
1977
+ let n = {};
1978
+ const o = (p, l, u) => r.push({ code: p, path: l, message: u, ...n }), s = /* @__PURE__ */ new Set(), c = (p, l) => {
1979
+ (!p.trim() || s.has(p)) && o("DUPLICATE_ID", l, "题块、题目和选项 ID 必须非空且唯一"), s.add(p);
1980
+ }, i = (p, l, u) => {
1981
+ (p === null || !Number.isFinite(p) || p < (t.usage === "homework" ? 0 : 0.5) || p > l || !Number.isInteger(p * 2)) && o("INVALID_SCORE", u, `分值须为 ${t.usage === "homework" ? 0 : 0.5}–${l} 分,按 0.5 分递增`);
1982
+ }, a = (p, l, u) => {
1983
+ (p.options.length < l[0] || p.options.length > l[1]) && o("INVALID_OPTIONS", `${u}.options`, `选项个数须为 ${l[0]}–${l[1]}`), p.options.forEach((g, A) => c(g.id, `${u}.options.${A}.id`)), (new Set(p.correctIds).size !== p.correctIds.length || p.correctIds.some((g) => !p.options.some((A) => A.id === g))) && o("INVALID_ANSWER_REFERENCE", `${u}.correctIds`, "答案引用了不存在或重复的选项");
1984
+ }, y = (p, l, u, g = 0, A = !0) => {
1985
+ A && !rt(p?.content.content) && o("MISSING_CONTENT", `${l}.content`, "请填写题干或材料"), u && (p?.itemsContent.length !== g || p.itemsContent.some((C) => !rt(C.content.content))) && o("MISSING_OPTION_CONTENT", `${l}.itemsContent`, "请补全每个选项的内容");
1986
+ };
1987
+ if (t.title.trim() || o("MISSING_TITLE", "title", "请填写题卡名称"), t.recognition?.examQrCode) {
1988
+ const p = String(t.creation?.exampaperId ?? "").trim();
1989
+ if (!p) o("MISSING_EXAM_ID", "creation.exampaperId", "显示试卷二维码需要填写试卷 ID");
1990
+ else
1991
+ try {
1992
+ De(p);
1993
+ } catch {
1994
+ o("INVALID_QR_PAYLOAD", "creation.exampaperId", "试卷 ID 太长,无法生成二维码");
1995
+ }
1996
+ }
1997
+ t.header && t.recognition?.subjectMarkers !== !1 && !Gt[Se(t.creation) || ""] && o("UNKNOWN_SUBJECT_MARK", "creation.subjectCode", "当前学科没有参考识别编码,请配置标准学科或关闭学科标记"), (!t.creation?.grade.trim() || !t.creation.subject.trim()) && o("MISSING_CREATION", "creation", "请选择年级和学科"), (!t.paperTitle || !rt(t.paperTitle.document.content)) && o("MISSING_PAPER_TITLE", "paperTitle", "请填写纸面标题"), t.blocks.some((p) => p.kind !== "area") || o("EMPTY_CARD", "blocks", "请至少添加一个题块和一道题目"), t.paperTitle && c(t.paperTitle.id, "paperTitle.id"), t.blocks.forEach((p, l) => {
1998
+ n = { blockId: p.id };
1999
+ const u = `blocks.${l}`;
2000
+ if (c(p.id, `${u}.id`), p.kind === "area") {
2001
+ p.areaType === (t.questionCard ? "forbiden" : "editArea") && o("INVALID_AREA_MODE", `${u}.areaType`, "题卡合一使用空白答题区,独立答题卡使用禁止答题区");
2002
+ return;
2003
+ }
2004
+ p.title.trim() || o("MISSING_BLOCK_TITLE", `${u}.title`, "请填写题块标题"), p.id === "reference-merged-objective" && o("RESERVED_ID", `${u}.id`, "题块使用了系统保留 ID");
2005
+ const g = p.reference;
2006
+ if (!g) {
2007
+ p.choices?.questions.length || o("EMPTY_BLOCK", u, "题块中没有题目"), p.choices?.questions.forEach((C, x) => {
2008
+ n = { blockId: p.id, questionId: C.id }, c(C.id, `${u}.choices.questions.${x}.id`), a(C, [2, 12], `${u}.choices.questions.${x}`), i(C.score ?? null, 15, `${u}.choices.questions.${x}.score`);
2009
+ });
2010
+ return;
2011
+ }
2012
+ g.questions.length || o("EMPTY_BLOCK", `${u}.reference.questions`, "题块中没有题目");
2013
+ const A = bt(g);
2014
+ if ((A.some((C) => !C.trim()) || new Set(A).size !== A.length) && o("INVALID_QUESTION_NUMBER", `${u}.reference.questions`, "同一题块内的题号须非空且不能重复"), g.optional && (g.type !== "SHORTANSWER" || !Number.isInteger(g.choose) || g.choose < 1 || g.choose >= g.questions.length) && o("INVALID_OPTIONAL", `${u}.reference.choose`, "选做题须为解答题,且选做数量小于总题数"), g.type === "CCOMPOSITION" && g.questions.length > 1 && o("INVALID_COUNT", `${u}.reference.questions`, "语文作文每组只能有一道题"), g.questions.forEach((C, x) => {
2015
+ n = { blockId: p.id, questionId: C.id };
2016
+ const M = `${u}.reference.questions.${x}`, T = lt[C.type];
2017
+ c(C.id, `${M}.id`), g.type !== "MIXED" && g.type !== C.type && o("TYPE_MISMATCH", `${M}.type`, "题目类型与题块不一致"), C.choice.id !== C.id && o("INVALID_BINDING", `${M}.choice.id`, "题目与填涂项 ID 不一致");
2018
+ const O = R(C.type) || ["FILLBLANK", "SHORTANSWER"].includes(C.type);
2019
+ (O && (C.parts.length < 1 || C.parts.length > T.parts) || !O && C.parts.length) && o("INVALID_PARTS", `${M}.parts`, `子题/空数须为 ${O ? `1–${T.parts}` : "0"}`), C.parts.length ? C.score !== jt(C.parts) && o("SCORE_MISMATCH", `${M}.score`, "总分与子题分值之和不一致") : i(C.score, T.score, `${M}.score`), Y(C.type) && !R(C.type) && a(C.choice, T.options, `${M}.choice`), C.type === "INFO_MATCHING" && (a(C.choice, T.options, `${M}.choice`), C.parts.length > C.choice.options.length && o("INVALID_OPTIONS", `${M}.choice.options`, "信息匹配的选项数不能少于子题数")), C.type === "MCHOICE" && (!Number.isFinite(C.choice.lessScore) || C.choice.lessScore < 0 || C.choice.lessScore > (C.score || 0) || !Number.isInteger(C.choice.lessScore * 2)) && o("INVALID_LESS_SCORE", `${M}.choice.lessScore`, "少选得分须按 0.5 分递增且不能超过本题分值"), C.type === "CHUNK_CHOICE" && (!C.rightAnswers || !Number.isInteger(C.rightAnswers) || C.rightAnswers >= C.choice.options.length || !C.singleScore || C.singleScore < 0.5 || !Number.isInteger(C.singleScore * 2) || C.score !== 0 && C.singleScore * C.rightAnswers > (C.score || 0)) && o("INVALID_CHUNK_SCORE", M, "请检查正确答案个数及每处得分"), C.type === "CCOMPOSITION" && (!Number.isInteger(C.characters) || C.characters < 1 || C.characters > 1200) && o("INVALID_GRID_COUNT", `${M}.characters`, "作文格数须为 1–1200"), C.type === "ECOMPOSITION" && (!Number.isInteger(C.lines) || C.lines < 1 || C.lines > 100) && o("INVALID_LINE_COUNT", `${M}.lines`, "作文行数须为 1–100"), t.questionCard && y(C.text, `${M}.text`, ["SCHOICE", "MCHOICE"].includes(C.type), C.choice.options.length), C.parts.forEach((h, I) => {
2020
+ const d = `${M}.parts.${I}`;
2021
+ n = { blockId: p.id, questionId: h.id }, c(h.id, `${d}.id`), i(h.score, T.score, `${d}.score`), R(C.type) && Y(C.type) && (a(h.choice, T.options, `${d}.choice`), h.choice.id !== h.id && o("INVALID_BINDING", `${d}.choice.id`, "子题与填涂项 ID 不一致")), t.questionCard && ["CLOZE", "READTHENANSWER"].includes(C.type) && y(h.text, `${d}.text`, !0, h.choice.options.length, C.type === "READTHENANSWER");
2022
+ });
2023
+ }), n = { blockId: p.id }, t.questionCard && g.layout.presentation !== "concentrated") {
2024
+ const C = g.questions.filter((M) => Y(M.type)).flatMap((M) => R(M.type) ? M.parts.map((T) => T.choice) : [M.choice]);
2025
+ qt({ ...g.layout, questions: C }, p.document, !0).concentrated.questions.length && o("MISSING_FILL_TARGET", `${u}.reference.layout.presentation`, "部分填涂框没有对应的题干或选项位置");
2026
+ }
2027
+ }), n = {};
2028
+ const b = (p, l) => {
2029
+ p.type === "image" && (!p.attrs?.src || /^blob:/i.test(p.attrs.src)) && o("INVALID_IMAGE_URL", l, "图片缺少可保存的地址,请上传后使用持久 URL 或内嵌图片"), ["formula", "blockFormula"].includes(p.type || "") && !String(p.attrs?.latex || "").trim() && o("EMPTY_FORMULA", l, "请填写公式或删除空公式"), p.content?.forEach((u, g) => b(u, `${l}.content.${g}`));
2030
+ }, m = (p, l) => {
2031
+ p && b(p.content, `${l}.content`);
2032
+ }, f = (p, l) => {
2033
+ m(p?.content, `${l}.content`), p?.itemsContent.forEach((u, g) => m(u.content, `${l}.itemsContent.${g}.content`));
2034
+ };
2035
+ return m(t.paperTitle?.document, "paperTitle.document"), t.blocks.forEach((p, l) => {
2036
+ n = { blockId: p.id };
2037
+ const u = `blocks.${l}`;
2038
+ m(p.document, `${u}.document`), m(p.reference?.material, `${u}.reference.material`), p.reference?.questions.forEach((g, A) => {
2039
+ n = { blockId: p.id, questionId: g.id };
2040
+ const C = `blocks.${l}.reference.questions.${A}`;
2041
+ m(g.document, `${C}.document`), f(g.text, `${C}.text`), g.parts.forEach((x, M) => {
2042
+ n = { blockId: p.id, questionId: x.id }, m(x.document, `${C}.parts.${M}.document`), f(x.text, `${C}.parts.${M}.text`);
2043
+ });
2044
+ });
2045
+ }), { valid: r.length === 0, issues: r };
2046
+ }
2047
+ function mt(t) {
2048
+ if (t !== void 0)
2049
+ try {
2050
+ const e = _t(t);
2051
+ return { grades: e.grades, gradeCourseMap: e.gradeCourseMap, defaultGradeCode: e.defaultGradeCode || void 0, defaultCourseCode: e.defaultCourseCode || void 0 };
2052
+ } catch (e) {
2053
+ throw e instanceof Ct ? new ut([{ code: "INVALID_DICTIONARIES", path: e.path, message: e.message }]) : e;
2054
+ }
2055
+ }
2056
+ function Pe(t, e) {
2057
+ const r = (T, O) => {
2058
+ throw new ut([{ code: "INVALID_INITIALIZATION", path: T, message: O }]);
2059
+ }, n = (T, O, h) => {
2060
+ if (!T || typeof T != "object" || Array.isArray(T)) return r(O, "初始化配置必须是对象");
2061
+ const I = Object.entries(T);
2062
+ for (const [d] of I) h.includes(d) || r(`${O}.${d}`, "不支持的初始化字段");
2063
+ return Object.fromEntries(I.filter(([, d]) => d !== void 0));
2064
+ }, o = (T, O) => typeof T != "string" || !T.trim() ? r(O, "请提供非空的试卷名称、年级和学科") : T.trim(), s = (T, O, h) => {
2065
+ T !== void 0 && !h.includes(T) && r(O, `可选值为 ${h.join("、")}`);
2066
+ }, c = (T, O) => {
2067
+ T !== void 0 && typeof T != "boolean" && r(O, "请使用布尔值");
2068
+ }, i = (T, O, h, I) => {
2069
+ T !== void 0 && (typeof T != "number" || !Number.isFinite(T) || T < h || T > I) && r(O, `数值必须在 ${h}–${I} 之间`);
2070
+ }, a = n(t, "initialization", ["name", "grade", "subject", "gradeCode", "courseCode", "subjectCode", "mode", "id", "exampaperId", "createMode", "layout", "header", "recognition"]), y = o(a.name, "initialization.name");
2071
+ y.length > 30 && r("initialization.name", "试卷名称最多 30 个字符");
2072
+ const b = _t(mt(e)), m = a.gradeCode !== void 0 || a.courseCode !== void 0 || a.subjectCode !== void 0;
2073
+ let f;
2074
+ if (m) {
2075
+ try {
2076
+ f = ht(b, o(a.gradeCode, "initialization.gradeCode"), o(a.courseCode, "initialization.courseCode"));
2077
+ } catch (T) {
2078
+ if (T instanceof Ct) return r(T.path, T.message);
2079
+ throw T;
2080
+ }
2081
+ for (const T of ["grade", "subject", "subjectCode"]) a[T] !== void 0 && o(a[T], `initialization.${T}`) !== f[T] && r(`initialization.${T}`, "名称或学科编码与课程字典不一致");
2082
+ } else {
2083
+ const T = o(a.grade, "initialization.grade"), O = o(a.subject, "initialization.subject"), h = b.grades.filter((E) => E.label === T);
2084
+ h.length > 1 && r("initialization.grade", "同名年级不唯一,请使用 gradeCode");
2085
+ const I = h[0], d = I ? b.gradeCourseMap[I.value].filter((E) => E.label === O) : [];
2086
+ d.length > 1 && r("initialization.subject", "同名课程不唯一,请使用 courseCode"), e && (!I || !d.length) && r(I ? "initialization.subject" : "initialization.grade", "名称不在可用字典中,请使用年级和课程编码"), f = I && d.length ? ht(b, I.value, d[0].value) : { grade: T, subject: O };
2087
+ }
2088
+ s(a.mode, "initialization.mode", ["template", "exam"]), s(a.createMode, "initialization.createMode", ["MANUALLY", "IMPORTED", "THIRD"]);
2089
+ const p = {};
2090
+ for (const T of ["id", "exampaperId"]) if (a[T] !== void 0) {
2091
+ const O = a[T];
2092
+ typeof O == "string" ? p[T] = o(O, `initialization.${T}`) : typeof O == "number" && Number.isSafeInteger(O) && O >= 0 ? p[T] = O : r(`initialization.${T}`, "ID 必须是非空字符串或非负安全整数");
2093
+ }
2094
+ a.createMode !== void 0 && (p.createMode = a.createMode);
2095
+ const l = a.layout === void 0 ? {} : n(a.layout, "initialization.layout", ["usage", "preset", "margin", "gap", "questionCard", "scanMarking", "halfPoint", "choiceDirection", "mergeObjective", "pageNum", "quesCard", "scoreType", "choiceType", "mixOb"]), u = (T, O, h) => {
2096
+ l[T] !== void 0 && (l[O] !== void 0 && l[O] !== h && r(`initialization.layout.${T}`, `与 ${O} 设置冲突`), l[O] = h, delete l[T]);
2097
+ };
2098
+ l.pageNum !== void 0 && ![1, 2, 3].includes(l.pageNum) && r("initialization.layout.pageNum", "分栏数为 1、2 或 3"), u("pageNum", "preset", { 1: "a4", 2: "a3-two", 3: "a3-three" }[l.pageNum]);
2099
+ for (const [T, O] of [["quesCard", "questionCard"], ["scoreType", "halfPoint"], ["mixOb", "mergeObjective"], ["choiceType", "choiceDirection"]])
2100
+ c(l[T], `initialization.layout.${T}`), u(T, O, T === "choiceType" ? l[T] ? "column" : "row" : l[T]);
2101
+ s(l.preset, "initialization.layout.preset", ["a4", "a3-two", "a3-three"]), s(l.usage, "initialization.layout.usage", ["exam", "homework"]), s(l.choiceDirection, "initialization.layout.choiceDirection", ["row", "column"]), i(l.margin, "initialization.layout.margin", 0, 100), i(l.gap, "initialization.layout.gap", 0, 100);
2102
+ for (const T of ["questionCard", "scanMarking", "halfPoint", "mergeObjective"]) c(l[T], `initialization.layout.${T}`);
2103
+ const g = a.header === void 0 ? {} : n(a.header, "initialization.header", ["focusText", "writeKaohao", "missExam", "mifeng", "kaohao", "weishu", "tiaomaStyle", "classText"]);
2104
+ for (const T of ["focusText", "writeKaohao", "missExam", "mifeng", "classText"]) c(g[T], `initialization.header.${T}`);
2105
+ g.tiaomaStyle !== void 0 && ![1, 2].includes(g.tiaomaStyle) && r("initialization.header.tiaomaStyle", "考号版式为 1(填涂)或 2(条形码)"), s(g.kaohao, "initialization.header.kaohao", ["school", "code"]), i(g.weishu, "initialization.header.weishu", 4, 12), g.weishu !== void 0 && !Number.isInteger(g.weishu) && r("initialization.header.weishu", "考号位数必须是整数");
2106
+ const A = le({ name: y, ...f, ...p, mode: a.mode ?? "template" }), C = a.recognition === void 0 ? void 0 : n(a.recognition, "initialization.recognition", ["examQrCode", "subjectMarkers", "pointBlack"]);
2107
+ if (C) for (const T of ["examQrCode", "subjectMarkers", "pointBlack"]) c(C[T], `initialization.recognition.${T}`);
2108
+ const x = { ...A, ...l, header: { ...A.header, ...g }, ...C ? { recognition: C } : {} }, M = It(x);
2109
+ return (M.columnWidth < 100 || M.contentHeight < 100) && r("initialization.layout", "边距或栏间距过大,纸张没有足够的作答区域"), x;
2110
+ }
2111
+ function Mn(t, e) {
2112
+ if (typeof document > "u") throw new Error("请在浏览器挂载后创建制卡实例");
2113
+ const r = zt(e?.plugins || []), n = mt(e.dictionaries), o = typeof t == "string" ? document.querySelector(t) : t;
2114
+ if (!(o instanceof HTMLElement) || o.ownerDocument !== document || /^(INPUT|TEXTAREA|SELECT|BUTTON|IMG|CANVAS|IFRAME)$/.test(o.tagName)) throw new Error("制卡需要一个空的 HTML 容器,例如 div");
2115
+ if (document.querySelector("[data-uni-answer-sheet-mount], #uni-answer-sheet")) throw new Error("当前文档已挂载制卡工作区;切换容器前请先 destroy()");
2116
+ if (o.textContent?.trim() || o.children.length) throw new Error("请提供空容器,已有题卡请通过 initialValue 传入");
2117
+ const s = document.createElement("div");
2118
+ s.className = "uni-answer-sheet-host", s.dataset.uniAnswerSheetMount = "", s.style.height = "100%", o.append(s);
2119
+ let c = !1, i = { ...e, dictionaries: n }, a, y, b;
2120
+ const m = new Promise((u, g) => {
2121
+ y = u, b = g;
2122
+ });
2123
+ m.catch(() => {
2124
+ });
2125
+ const f = () => {
2126
+ if (c) throw new Error("制卡实例已销毁");
2127
+ if (!a?.isReady()) throw new Error("请先等待 sheet.ready");
2128
+ return a;
2129
+ }, p = async () => (await m, f()), l = {
2130
+ ready: m,
2131
+ async initialize(u) {
2132
+ if (c) throw new Error("制卡实例已销毁");
2133
+ const g = Pe(u, i.dictionaries);
2134
+ a || (i = { ...i, initialValue: g }), await (await p()).setDocument(g);
2135
+ },
2136
+ getDocument: () => f().getDocument(),
2137
+ load: async (u) => (await p()).setDocument(u),
2138
+ setDocument: async (u) => (await p()).setDocument(u),
2139
+ newDocument: async (u) => (await p()).newDocument(u),
2140
+ getReferenceData: () => f().getReferenceData(),
2141
+ setReferenceData: async (u) => (await p()).setReferenceData(u),
2142
+ validate: async () => (await p()).validate(),
2143
+ save: async () => (await p()).save(),
2144
+ getRecognitionData: async () => (await p()).getRecognitionData(),
2145
+ focusIssue: (u) => f().focusIssue(u),
2146
+ setOptions(u) {
2147
+ if (c) throw new Error("制卡实例已销毁");
2148
+ const g = Object.hasOwn(u, "dictionaries") ? mt(u.dictionaries) : i.dictionaries;
2149
+ i = { ...i, ...u, dictionaries: g }, a?.update(i);
2150
+ },
2151
+ destroy() {
2152
+ c || (c = !0, a?.destroy(), s.remove(), b(new DOMException("制卡实例已销毁", "AbortError")));
2153
+ }
2154
+ };
2155
+ return Promise.all([r.prepare(), import("./runtime-QFMZtUfH.js")]).then(([, { mountAnswerSheet: u }]) => {
2156
+ c || (a = u(s, r, i, y, (g) => {
2157
+ b(g), l.destroy(), i.onError?.(g instanceof Error ? g : new Error(String(g)));
2158
+ }));
2159
+ }).catch((u) => {
2160
+ b(u), l.destroy(), i.onError?.(u instanceof Error ? u : new Error(String(u)));
2161
+ }), l;
2162
+ }
2163
+ export {
2164
+ Ze as $,
2165
+ On as A,
2166
+ dt as B,
2167
+ An as C,
2168
+ _t as D,
2169
+ ce as E,
2170
+ fn as F,
2171
+ ln as G,
2172
+ et as H,
2173
+ In as I,
2174
+ le as J,
2175
+ un as K,
2176
+ v as L,
2177
+ W as M,
2178
+ Ke as N,
2179
+ ze as O,
2180
+ Zt as P,
2181
+ $t as Q,
2182
+ Xt as R,
2183
+ kt as S,
2184
+ ve as T,
2185
+ Ue as U,
2186
+ at as V,
2187
+ je as W,
2188
+ Ge as X,
2189
+ St as Y,
2190
+ Fe as Z,
2191
+ tn as _,
2192
+ be as a,
2193
+ re as a0,
2194
+ on as a1,
2195
+ en as a2,
2196
+ nn as a3,
2197
+ rn as a4,
2198
+ Xe as a5,
2199
+ oe as a6,
2200
+ ie as a7,
2201
+ se as a8,
2202
+ Ve as a9,
2203
+ Sn as aA,
2204
+ De as aB,
2205
+ ke as aC,
2206
+ ut as aD,
2207
+ Nn as aE,
2208
+ Mn as aF,
2209
+ Je as aa,
2210
+ te as ab,
2211
+ sn as ac,
2212
+ qe as ad,
2213
+ Qe as ae,
2214
+ lt as af,
2215
+ Ht as ag,
2216
+ mn as ah,
2217
+ bn as ai,
2218
+ gn as aj,
2219
+ Cn as ak,
2220
+ wn as al,
2221
+ pt as am,
2222
+ cn as an,
2223
+ Ye as ao,
2224
+ Be as ap,
2225
+ ht as aq,
2226
+ ue as ar,
2227
+ We as as,
2228
+ he as at,
2229
+ En as au,
2230
+ Tn as av,
2231
+ an as aw,
2232
+ it as ax,
2233
+ Se as ay,
2234
+ Gt as az,
2235
+ pn as b,
2236
+ Ie as c,
2237
+ Bt as d,
2238
+ ye as e,
2239
+ gt as f,
2240
+ Y as g,
2241
+ yn as h,
2242
+ R as i,
2243
+ j,
2244
+ dn as k,
2245
+ Pt as l,
2246
+ Q as m,
2247
+ At as n,
2248
+ hn as o,
2249
+ ge as p,
2250
+ yt as q,
2251
+ qt as r,
2252
+ jt as s,
2253
+ J as t,
2254
+ st as u,
2255
+ Rt as v,
2256
+ pe as w,
2257
+ Nt as x,
2258
+ Z as y,
2259
+ nt as z
2260
+ };