@things-factory/erp-systemever 10.1.117

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 @@
1
+ export * from './systemever-adapter.js';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./systemever-adapter.js"), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;AAAA,kEAAuC","sourcesContent":["export * from './systemever-adapter.js'\n"]}
@@ -0,0 +1,51 @@
1
+ import { type ErpAdapter, type ErpConfig, type ErpExport, type ErpOutcome, type ProductionPerformanceEntry } from '@operato/ops-contract';
2
+ /**
3
+ * The columns of one pasted work report row, in order.
4
+ *
5
+ * Every name except `Remark` was seen in the 작업실적조회 response (svc 501295 / pgm 501504). `WorkReportSeq`
6
+ * is left out — the ERP numbers its own rows. Columns we have no value for stay empty: we do not invent
7
+ * a work centre, an item, a process or a lot the entry does not carry (SystemEver may fill them from the
8
+ * work order; the trial registration tells).
9
+ *
10
+ * `Remark` carries our `performanceKey`. Whether the ERP keeps it is confirmed at the trial registration;
11
+ * until then the read-back leaves `carriedKey` empty and pairing falls back to its named rule.
12
+ */
13
+ export declare const SYSTEMEVER_WORK_REPORT_LAYOUT: readonly ["WorkDate", "WorkCenterName", "WorkOrderNo", "GoodItemNo", "ProcName", "ProdQty", "OKQty", "BadQty", "WorkHour", "WorkerQty", "RealLotNo", "SerialNoFrom", "SerialNoTo", "IsMatInput", "IsGoodIn", "Remark"];
14
+ export type SystemEverWorkReportColumn = (typeof SYSTEMEVER_WORK_REPORT_LAYOUT)[number];
15
+ /** Settings this adapter reads. No secrets: it never connects. */
16
+ export interface SystemEverConfig extends ErpConfig {
17
+ /**
18
+ * The plant's time zone (IANA, e.g. `Asia/Seoul`). The work date is a local calendar day; taking it from
19
+ * UTC would put a morning shift on the previous day. Required — we do not guess where the plant is.
20
+ */
21
+ timeZone?: string;
22
+ }
23
+ /** A local calendar day `YYYY-MM-DD` in `timeZone`. Throws on an unknown zone. */
24
+ export declare function localWorkDate(iso: string, timeZone: string): string;
25
+ /**
26
+ * One row for one entry.
27
+ *
28
+ * The work date is the day the span *starts* in the plant's zone: a night shift from 22:00 to 06:00
29
+ * belongs to the day it began, which is how a shift is booked.
30
+ */
31
+ export declare function workReportRow(entry: ProductionPerformanceEntry, key: string, timeZone: string): Record<SystemEverWorkReportColumn, string>;
32
+ /**
33
+ * Why this batch cannot be exported — every reason at once.
34
+ *
35
+ * Any reason refuses the whole batch (`stop`): a half-exported file is a file someone pastes.
36
+ */
37
+ export declare function exportProblems(cfg: SystemEverConfig, entries: {
38
+ entry: ProductionPerformanceEntry;
39
+ key: string;
40
+ }[], nowMs: number): string[];
41
+ /**
42
+ * Build the paste batch: tab-separated data lines, no header line, one line per entry in the order given.
43
+ * `keys` follow the same order.
44
+ */
45
+ export declare function exportWorkReports(cfg: SystemEverConfig, entries: {
46
+ entry: ProductionPerformanceEntry;
47
+ key: string;
48
+ }[], nowMs?: number): ErpOutcome<ErpExport>;
49
+ /** The adapter. It holds no state and opens no connection. */
50
+ export declare function createSystemEverAdapter(): ErpAdapter;
51
+ export declare const systemEverAdapter: ErpAdapter;
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.systemEverAdapter = exports.SYSTEMEVER_WORK_REPORT_LAYOUT = void 0;
4
+ exports.localWorkDate = localWorkDate;
5
+ exports.workReportRow = workReportRow;
6
+ exports.exportProblems = exportProblems;
7
+ exports.exportWorkReports = exportWorkReports;
8
+ exports.createSystemEverAdapter = createSystemEverAdapter;
9
+ /*
10
+ * **Younglimwon SystemEver adapter** — one implementation of the contract port (`ErpAdapter`).
11
+ *
12
+ * ── What kind of ERP this is (ADR-0110 decision 1) ───────────────────────
13
+ * SystemEver has no official API and its work report screen (작업실적입력) has no file upload. A person
14
+ * pastes rows into the sheet and saves. So this adapter is `posting: 'manual-export'`: it builds the rows,
15
+ * it never lands anything. Lines it exports are "exported, awaiting confirmation" until a read-back pairs
16
+ * them (plant's pairing function).
17
+ *
18
+ * Saving a work report issues the materials by BOM (every item is set to "issue on material input"), so
19
+ * `materialWithPerformance: true` and there is no material door — a second door would issue twice.
20
+ *
21
+ * ── What it does not do (ADR-0110 addition 1) ────────────────────────────
22
+ * It does not read. Read-back, orders and stock come from an integration scenario (headless login →
23
+ * `/api/WebApi` query → jsonata → a plant task) in the contract's record shapes. The adapter holds the
24
+ * declaration and `exportPerformance`, nothing else.
25
+ *
26
+ * ── What is not confirmed yet ────────────────────────────────────────────
27
+ * The paste layout. Nobody has pasted into the sheet; the column order, the date format and whether the
28
+ * remark column survives are confirmed at Miratek's trial registration (proposal 7.4). Until then
29
+ * `grounding` stays `mock` and the layout below is the work report *query* columns (작업실적조회, read
30
+ * 2026-10-01) in their order, which is the closest thing we have seen. The marker lives here, in the
31
+ * grounding and on the export screen — never inside `body`, because a person pastes every line of it.
32
+ */
33
+ const ops_contract_1 = require("@operato/ops-contract");
34
+ /**
35
+ * The columns of one pasted work report row, in order.
36
+ *
37
+ * Every name except `Remark` was seen in the 작업실적조회 response (svc 501295 / pgm 501504). `WorkReportSeq`
38
+ * is left out — the ERP numbers its own rows. Columns we have no value for stay empty: we do not invent
39
+ * a work centre, an item, a process or a lot the entry does not carry (SystemEver may fill them from the
40
+ * work order; the trial registration tells).
41
+ *
42
+ * `Remark` carries our `performanceKey`. Whether the ERP keeps it is confirmed at the trial registration;
43
+ * until then the read-back leaves `carriedKey` empty and pairing falls back to its named rule.
44
+ */
45
+ exports.SYSTEMEVER_WORK_REPORT_LAYOUT = [
46
+ 'WorkDate',
47
+ 'WorkCenterName',
48
+ 'WorkOrderNo',
49
+ 'GoodItemNo',
50
+ 'ProcName',
51
+ 'ProdQty',
52
+ 'OKQty',
53
+ 'BadQty',
54
+ 'WorkHour',
55
+ 'WorkerQty',
56
+ 'RealLotNo',
57
+ 'SerialNoFrom',
58
+ 'SerialNoTo',
59
+ 'IsMatInput',
60
+ 'IsGoodIn',
61
+ 'Remark'
62
+ ];
63
+ /** A local calendar day `YYYY-MM-DD` in `timeZone`. Throws on an unknown zone. */
64
+ function localWorkDate(iso, timeZone) {
65
+ const parts = new Intl.DateTimeFormat('en-CA', { timeZone, year: 'numeric', month: '2-digit', day: '2-digit' }).formatToParts(new Date(iso));
66
+ const part = (type) => parts.find(p => p.type === type)?.value;
67
+ return `${part('year')}-${part('month')}-${part('day')}`;
68
+ }
69
+ /**
70
+ * One row for one entry.
71
+ *
72
+ * The work date is the day the span *starts* in the plant's zone: a night shift from 22:00 to 06:00
73
+ * belongs to the day it began, which is how a shift is booked.
74
+ */
75
+ function workReportRow(entry, key, timeZone) {
76
+ const row = Object.fromEntries(exports.SYSTEMEVER_WORK_REPORT_LAYOUT.map(c => [c, '']));
77
+ row.WorkDate = localWorkDate(entry.from, timeZone);
78
+ row.WorkOrderNo = entry.orderId;
79
+ row.ProdQty = String(entry.goodQuantity + entry.scrapQuantity);
80
+ row.OKQty = String(entry.goodQuantity);
81
+ row.BadQty = String(entry.scrapQuantity);
82
+ row.Remark = key;
83
+ return row;
84
+ }
85
+ /**
86
+ * Why this batch cannot be exported — every reason at once.
87
+ *
88
+ * Any reason refuses the whole batch (`stop`): a half-exported file is a file someone pastes.
89
+ */
90
+ function exportProblems(cfg, entries, nowMs) {
91
+ const problems = [];
92
+ if (!entries?.length)
93
+ problems.push('nothing to export');
94
+ const timeZone = String(cfg?.timeZone ?? '').trim();
95
+ if (!timeZone)
96
+ problems.push('timeZone is not set — the work date is a local day and we do not guess the plant zone');
97
+ else {
98
+ try {
99
+ new Intl.DateTimeFormat('en-CA', { timeZone });
100
+ }
101
+ catch {
102
+ problems.push(`timeZone ${timeZone} is not a known zone`);
103
+ }
104
+ }
105
+ const seen = new Set();
106
+ /* order → the operations its lines name; `-` stands for "no operation". */
107
+ const operations = new Map();
108
+ for (const { entry, key } of entries ?? []) {
109
+ const label = entry?.orderId || '(no order)';
110
+ for (const error of (0, ops_contract_1.validatePerformance)(entry, nowMs))
111
+ problems.push(`${label}: ${error}`);
112
+ let expected;
113
+ try {
114
+ expected = (0, ops_contract_1.performanceKey)(entry);
115
+ }
116
+ catch (e) {
117
+ /* validatePerformance already named what is missing. */
118
+ }
119
+ if (!String(key ?? '').trim())
120
+ problems.push(`${label}: no key — the line cannot be paired back`);
121
+ else if (expected !== undefined && key !== expected) {
122
+ /* The key travels in the remark and comes back to pairing; a different spelling never pairs. */
123
+ problems.push(`${label}: key ${key} is not this entry's performanceKey ${expected}`);
124
+ }
125
+ if (key && seen.has(key))
126
+ problems.push(`${label}: key ${key} appears twice — the same performance would be pasted twice`);
127
+ if (key)
128
+ seen.add(key);
129
+ if (entry?.orderId) {
130
+ const ops = operations.get(entry.orderId) ?? new Set();
131
+ ops.add(entry.operationId ?? '-');
132
+ operations.set(entry.orderId, ops);
133
+ }
134
+ for (const value of [entry?.orderId, key]) {
135
+ if (typeof value === 'string' && /[\t\r\n]/.test(value)) {
136
+ problems.push(`${label}: a tab or line break in ${JSON.stringify(value)} would split the pasted row`);
137
+ }
138
+ }
139
+ }
140
+ /*
141
+ * A SystemEver work order is one process, so performance is booked per order. Lines of one order from
142
+ * one operation are fine — the operation is dropped. Lines of one order from two operations would each
143
+ * book their output and each issue the BOM: quantity and material multiplied by the operation count.
144
+ */
145
+ for (const [orderId, ops] of operations) {
146
+ if (ops.size > 1) {
147
+ problems.push(`${orderId}: lines from ${ops.size} operations (${[...ops].join(', ')}) — SystemEver books per work order, so they would be counted ${ops.size} times`);
148
+ }
149
+ }
150
+ return problems;
151
+ }
152
+ function fileNameOf(dates) {
153
+ const sorted = [...dates].sort();
154
+ const first = sorted[0];
155
+ const last = sorted[sorted.length - 1];
156
+ return `systemever-work-report-${first}${last !== first ? `_${last}` : ''}.tsv`;
157
+ }
158
+ /**
159
+ * Build the paste batch: tab-separated data lines, no header line, one line per entry in the order given.
160
+ * `keys` follow the same order.
161
+ */
162
+ function exportWorkReports(cfg, entries, nowMs = Date.now()) {
163
+ const problems = exportProblems(cfg, entries, nowMs);
164
+ if (problems.length)
165
+ return { ok: false, action: 'stop', error: problems.join('; ') };
166
+ const timeZone = String(cfg.timeZone).trim();
167
+ const rows = entries.map(({ entry, key }) => workReportRow(entry, key, timeZone));
168
+ return {
169
+ ok: true,
170
+ value: {
171
+ fileName: fileNameOf(rows.map(r => r.WorkDate)),
172
+ mediaType: 'text/tab-separated-values; charset=utf-8',
173
+ body: rows.map(r => exports.SYSTEMEVER_WORK_REPORT_LAYOUT.map(c => r[c]).join('\t')).join('\r\n') + '\r\n',
174
+ keys: entries.map(({ key }) => key)
175
+ }
176
+ };
177
+ }
178
+ /** The adapter. It holds no state and opens no connection. */
179
+ function createSystemEverAdapter() {
180
+ return {
181
+ type: 'systemever',
182
+ label: 'Younglimwon SystemEver (manual export)',
183
+ /* The paste layout is not confirmed until the trial registration (see the file head). */
184
+ grounding: 'mock',
185
+ capabilities: ['performance'],
186
+ traits: {
187
+ /* A work order is one process (its ProcName); performance is booked per order. */
188
+ performanceGranularity: 'order',
189
+ /* Saving a work report issues the BOM. */
190
+ materialWithPerformance: true,
191
+ /* A wrong line is deleted by a person on the ERP screen. */
192
+ reversal: 'manual',
193
+ posting: 'manual-export'
194
+ },
195
+ async probe(_cfg) {
196
+ /* Nothing to reach: the adapter only builds files. Reading SystemEver is the integration scenario. */
197
+ return { ok: true, value: { detail: 'manual export — this adapter does not connect to SystemEver' } };
198
+ },
199
+ async exportPerformance(cfg, entries) {
200
+ return exportWorkReports(cfg, entries);
201
+ }
202
+ };
203
+ }
204
+ exports.systemEverAdapter = createSystemEverAdapter();
205
+ //# sourceMappingURL=systemever-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemever-adapter.js","sourceRoot":"","sources":["../server/systemever-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * **Younglimwon SystemEver adapter** — one implementation of the contract port (`ErpAdapter`).\n *\n * ── What kind of ERP this is (ADR-0110 decision 1) ───────────────────────\n * SystemEver has no official API and its work report screen (작업실적입력) has no file upload. A person\n * pastes rows into the sheet and saves. So this adapter is `posting: 'manual-export'`: it builds the rows,\n * it never lands anything. Lines it exports are \"exported, awaiting confirmation\" until a read-back pairs\n * them (plant's pairing function).\n *\n * Saving a work report issues the materials by BOM (every item is set to \"issue on material input\"), so\n * `materialWithPerformance: true` and there is no material door — a second door would issue twice.\n *\n * ── What it does not do (ADR-0110 addition 1) ────────────────────────────\n * It does not read. Read-back, orders and stock come from an integration scenario (headless login →\n * `/api/WebApi` query → jsonata → a plant task) in the contract's record shapes. The adapter holds the\n * declaration and `exportPerformance`, nothing else.\n *\n * ── What is not confirmed yet ────────────────────────────────────────────\n * The paste layout. Nobody has pasted into the sheet; the column order, the date format and whether the\n * remark column survives are confirmed at Miratek's trial registration (proposal 7.4). Until then\n * `grounding` stays `mock` and the layout below is the work report *query* columns (작업실적조회, read\n * 2026-10-01) in their order, which is the closest thing we have seen. The marker lives here, in the\n * grounding and on the export screen — never inside `body`, because a person pastes every line of it.\n */\nimport {\n performanceKey,\n validatePerformance,\n type ErpAdapter,\n type ErpConfig,\n type ErpExport,\n type ErpOutcome,\n type ProductionPerformanceEntry\n} from '@operato/ops-contract'\n\n/**\n * The columns of one pasted work report row, in order.\n *\n * Every name except `Remark` was seen in the 작업실적조회 response (svc 501295 / pgm 501504). `WorkReportSeq`\n * is left out — the ERP numbers its own rows. Columns we have no value for stay empty: we do not invent\n * a work centre, an item, a process or a lot the entry does not carry (SystemEver may fill them from the\n * work order; the trial registration tells).\n *\n * `Remark` carries our `performanceKey`. Whether the ERP keeps it is confirmed at the trial registration;\n * until then the read-back leaves `carriedKey` empty and pairing falls back to its named rule.\n */\nexport const SYSTEMEVER_WORK_REPORT_LAYOUT = [\n 'WorkDate',\n 'WorkCenterName',\n 'WorkOrderNo',\n 'GoodItemNo',\n 'ProcName',\n 'ProdQty',\n 'OKQty',\n 'BadQty',\n 'WorkHour',\n 'WorkerQty',\n 'RealLotNo',\n 'SerialNoFrom',\n 'SerialNoTo',\n 'IsMatInput',\n 'IsGoodIn',\n 'Remark'\n] as const\n\nexport type SystemEverWorkReportColumn = (typeof SYSTEMEVER_WORK_REPORT_LAYOUT)[number]\n\n/** Settings this adapter reads. No secrets: it never connects. */\nexport interface SystemEverConfig extends ErpConfig {\n /**\n * The plant's time zone (IANA, e.g. `Asia/Seoul`). The work date is a local calendar day; taking it from\n * UTC would put a morning shift on the previous day. Required — we do not guess where the plant is.\n */\n timeZone?: string\n}\n\n/** A local calendar day `YYYY-MM-DD` in `timeZone`. Throws on an unknown zone. */\nexport function localWorkDate(iso: string, timeZone: string): string {\n const parts = new Intl.DateTimeFormat('en-CA', { timeZone, year: 'numeric', month: '2-digit', day: '2-digit' }).formatToParts(\n new Date(iso)\n )\n const part = (type: string) => parts.find(p => p.type === type)?.value\n return `${part('year')}-${part('month')}-${part('day')}`\n}\n\n/**\n * One row for one entry.\n *\n * The work date is the day the span *starts* in the plant's zone: a night shift from 22:00 to 06:00\n * belongs to the day it began, which is how a shift is booked.\n */\nexport function workReportRow(\n entry: ProductionPerformanceEntry,\n key: string,\n timeZone: string\n): Record<SystemEverWorkReportColumn, string> {\n const row = Object.fromEntries(SYSTEMEVER_WORK_REPORT_LAYOUT.map(c => [c, ''])) as Record<SystemEverWorkReportColumn, string>\n row.WorkDate = localWorkDate(entry.from, timeZone)\n row.WorkOrderNo = entry.orderId\n row.ProdQty = String(entry.goodQuantity + entry.scrapQuantity)\n row.OKQty = String(entry.goodQuantity)\n row.BadQty = String(entry.scrapQuantity)\n row.Remark = key\n return row\n}\n\n/**\n * Why this batch cannot be exported — every reason at once.\n *\n * Any reason refuses the whole batch (`stop`): a half-exported file is a file someone pastes.\n */\nexport function exportProblems(\n cfg: SystemEverConfig,\n entries: { entry: ProductionPerformanceEntry; key: string }[],\n nowMs: number\n): string[] {\n const problems: string[] = []\n\n if (!entries?.length) problems.push('nothing to export')\n\n const timeZone = String(cfg?.timeZone ?? '').trim()\n if (!timeZone) problems.push('timeZone is not set — the work date is a local day and we do not guess the plant zone')\n else {\n try {\n new Intl.DateTimeFormat('en-CA', { timeZone })\n } catch {\n problems.push(`timeZone ${timeZone} is not a known zone`)\n }\n }\n\n const seen = new Set<string>()\n /* order → the operations its lines name; `-` stands for \"no operation\". */\n const operations = new Map<string, Set<string>>()\n\n for (const { entry, key } of entries ?? []) {\n const label = entry?.orderId || '(no order)'\n\n for (const error of validatePerformance(entry, nowMs)) problems.push(`${label}: ${error}`)\n\n let expected: string | undefined\n try {\n expected = performanceKey(entry)\n } catch (e) {\n /* validatePerformance already named what is missing. */\n }\n if (!String(key ?? '').trim()) problems.push(`${label}: no key — the line cannot be paired back`)\n else if (expected !== undefined && key !== expected) {\n /* The key travels in the remark and comes back to pairing; a different spelling never pairs. */\n problems.push(`${label}: key ${key} is not this entry's performanceKey ${expected}`)\n }\n if (key && seen.has(key)) problems.push(`${label}: key ${key} appears twice — the same performance would be pasted twice`)\n if (key) seen.add(key)\n\n if (entry?.orderId) {\n const ops = operations.get(entry.orderId) ?? new Set<string>()\n ops.add(entry.operationId ?? '-')\n operations.set(entry.orderId, ops)\n }\n\n for (const value of [entry?.orderId, key]) {\n if (typeof value === 'string' && /[\\t\\r\\n]/.test(value)) {\n problems.push(`${label}: a tab or line break in ${JSON.stringify(value)} would split the pasted row`)\n }\n }\n }\n\n /*\n * A SystemEver work order is one process, so performance is booked per order. Lines of one order from\n * one operation are fine — the operation is dropped. Lines of one order from two operations would each\n * book their output and each issue the BOM: quantity and material multiplied by the operation count.\n */\n for (const [orderId, ops] of operations) {\n if (ops.size > 1) {\n problems.push(\n `${orderId}: lines from ${ops.size} operations (${[...ops].join(', ')}) — SystemEver books per work order, so they would be counted ${ops.size} times`\n )\n }\n }\n\n return problems\n}\n\nfunction fileNameOf(dates: string[]): string {\n const sorted = [...dates].sort()\n const first = sorted[0]\n const last = sorted[sorted.length - 1]\n return `systemever-work-report-${first}${last !== first ? `_${last}` : ''}.tsv`\n}\n\n/**\n * Build the paste batch: tab-separated data lines, no header line, one line per entry in the order given.\n * `keys` follow the same order.\n */\nexport function exportWorkReports(\n cfg: SystemEverConfig,\n entries: { entry: ProductionPerformanceEntry; key: string }[],\n nowMs = Date.now()\n): ErpOutcome<ErpExport> {\n const problems = exportProblems(cfg, entries, nowMs)\n if (problems.length) return { ok: false, action: 'stop', error: problems.join('; ') }\n\n const timeZone = String(cfg.timeZone).trim()\n const rows = entries.map(({ entry, key }) => workReportRow(entry, key, timeZone))\n\n return {\n ok: true,\n value: {\n fileName: fileNameOf(rows.map(r => r.WorkDate)),\n mediaType: 'text/tab-separated-values; charset=utf-8',\n body: rows.map(r => SYSTEMEVER_WORK_REPORT_LAYOUT.map(c => r[c]).join('\\t')).join('\\r\\n') + '\\r\\n',\n keys: entries.map(({ key }) => key)\n }\n }\n}\n\n/** The adapter. It holds no state and opens no connection. */\nexport function createSystemEverAdapter(): ErpAdapter {\n return {\n type: 'systemever',\n label: 'Younglimwon SystemEver (manual export)',\n /* The paste layout is not confirmed until the trial registration (see the file head). */\n grounding: 'mock',\n capabilities: ['performance'],\n traits: {\n /* A work order is one process (its ProcName); performance is booked per order. */\n performanceGranularity: 'order',\n /* Saving a work report issues the BOM. */\n materialWithPerformance: true,\n /* A wrong line is deleted by a person on the ERP screen. */\n reversal: 'manual',\n posting: 'manual-export'\n },\n\n async probe(_cfg: ErpConfig) {\n /* Nothing to reach: the adapter only builds files. Reading SystemEver is the integration scenario. */\n return { ok: true, value: { detail: 'manual export — this adapter does not connect to SystemEver' } }\n },\n\n async exportPerformance(cfg: ErpConfig, entries: { entry: ProductionPerformanceEntry; key: string }[]) {\n return exportWorkReports(cfg as SystemEverConfig, entries)\n }\n }\n}\n\nexport const systemEverAdapter: ErpAdapter = createSystemEverAdapter()\n"]}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@things-factory/erp-systemever",
3
+ "version": "10.1.117",
4
+ "main": "dist-server/index.js",
5
+ "type": "module",
6
+ "description": "Younglimwon SystemEver adapter for the ERP (Level 4) ↔ MES (Level 3) boundary — a manual-export ERP: work report lines a person pastes into the work report sheet.",
7
+ "author": "heartyoh <heartyoh@hatiolab.com>",
8
+ "license": "MIT",
9
+ "publishConfig": {
10
+ "access": "public",
11
+ "@things-factory:registry": "https://registry.npmjs.org"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/hatiolab/things-factory.git",
16
+ "directory": "packages/erp-systemever"
17
+ },
18
+ "scripts": {
19
+ "build": "npm run build:server",
20
+ "build:server": "npm run clean:server && tsc -p tsconfig.json",
21
+ "clean:server": "rm -rf dist-server",
22
+ "test": "node --import ./test/resolve-ts-siblings.mjs --test test/*.test.ts"
23
+ },
24
+ "dependencies": {
25
+ "@operato/ops-contract": "^0.9.41"
26
+ },
27
+ "gitHead": "cab2426c1c6e63b53a0a2087eef28c9c55df71dd"
28
+ }
@@ -0,0 +1 @@
1
+ export * from './systemever-adapter.js'
@@ -0,0 +1,244 @@
1
+ /*
2
+ * **Younglimwon SystemEver adapter** — one implementation of the contract port (`ErpAdapter`).
3
+ *
4
+ * ── What kind of ERP this is (ADR-0110 decision 1) ───────────────────────
5
+ * SystemEver has no official API and its work report screen (작업실적입력) has no file upload. A person
6
+ * pastes rows into the sheet and saves. So this adapter is `posting: 'manual-export'`: it builds the rows,
7
+ * it never lands anything. Lines it exports are "exported, awaiting confirmation" until a read-back pairs
8
+ * them (plant's pairing function).
9
+ *
10
+ * Saving a work report issues the materials by BOM (every item is set to "issue on material input"), so
11
+ * `materialWithPerformance: true` and there is no material door — a second door would issue twice.
12
+ *
13
+ * ── What it does not do (ADR-0110 addition 1) ────────────────────────────
14
+ * It does not read. Read-back, orders and stock come from an integration scenario (headless login →
15
+ * `/api/WebApi` query → jsonata → a plant task) in the contract's record shapes. The adapter holds the
16
+ * declaration and `exportPerformance`, nothing else.
17
+ *
18
+ * ── What is not confirmed yet ────────────────────────────────────────────
19
+ * The paste layout. Nobody has pasted into the sheet; the column order, the date format and whether the
20
+ * remark column survives are confirmed at Miratek's trial registration (proposal 7.4). Until then
21
+ * `grounding` stays `mock` and the layout below is the work report *query* columns (작업실적조회, read
22
+ * 2026-10-01) in their order, which is the closest thing we have seen. The marker lives here, in the
23
+ * grounding and on the export screen — never inside `body`, because a person pastes every line of it.
24
+ */
25
+ import {
26
+ performanceKey,
27
+ validatePerformance,
28
+ type ErpAdapter,
29
+ type ErpConfig,
30
+ type ErpExport,
31
+ type ErpOutcome,
32
+ type ProductionPerformanceEntry
33
+ } from '@operato/ops-contract'
34
+
35
+ /**
36
+ * The columns of one pasted work report row, in order.
37
+ *
38
+ * Every name except `Remark` was seen in the 작업실적조회 response (svc 501295 / pgm 501504). `WorkReportSeq`
39
+ * is left out — the ERP numbers its own rows. Columns we have no value for stay empty: we do not invent
40
+ * a work centre, an item, a process or a lot the entry does not carry (SystemEver may fill them from the
41
+ * work order; the trial registration tells).
42
+ *
43
+ * `Remark` carries our `performanceKey`. Whether the ERP keeps it is confirmed at the trial registration;
44
+ * until then the read-back leaves `carriedKey` empty and pairing falls back to its named rule.
45
+ */
46
+ export const SYSTEMEVER_WORK_REPORT_LAYOUT = [
47
+ 'WorkDate',
48
+ 'WorkCenterName',
49
+ 'WorkOrderNo',
50
+ 'GoodItemNo',
51
+ 'ProcName',
52
+ 'ProdQty',
53
+ 'OKQty',
54
+ 'BadQty',
55
+ 'WorkHour',
56
+ 'WorkerQty',
57
+ 'RealLotNo',
58
+ 'SerialNoFrom',
59
+ 'SerialNoTo',
60
+ 'IsMatInput',
61
+ 'IsGoodIn',
62
+ 'Remark'
63
+ ] as const
64
+
65
+ export type SystemEverWorkReportColumn = (typeof SYSTEMEVER_WORK_REPORT_LAYOUT)[number]
66
+
67
+ /** Settings this adapter reads. No secrets: it never connects. */
68
+ export interface SystemEverConfig extends ErpConfig {
69
+ /**
70
+ * The plant's time zone (IANA, e.g. `Asia/Seoul`). The work date is a local calendar day; taking it from
71
+ * UTC would put a morning shift on the previous day. Required — we do not guess where the plant is.
72
+ */
73
+ timeZone?: string
74
+ }
75
+
76
+ /** A local calendar day `YYYY-MM-DD` in `timeZone`. Throws on an unknown zone. */
77
+ export function localWorkDate(iso: string, timeZone: string): string {
78
+ const parts = new Intl.DateTimeFormat('en-CA', { timeZone, year: 'numeric', month: '2-digit', day: '2-digit' }).formatToParts(
79
+ new Date(iso)
80
+ )
81
+ const part = (type: string) => parts.find(p => p.type === type)?.value
82
+ return `${part('year')}-${part('month')}-${part('day')}`
83
+ }
84
+
85
+ /**
86
+ * One row for one entry.
87
+ *
88
+ * The work date is the day the span *starts* in the plant's zone: a night shift from 22:00 to 06:00
89
+ * belongs to the day it began, which is how a shift is booked.
90
+ */
91
+ export function workReportRow(
92
+ entry: ProductionPerformanceEntry,
93
+ key: string,
94
+ timeZone: string
95
+ ): Record<SystemEverWorkReportColumn, string> {
96
+ const row = Object.fromEntries(SYSTEMEVER_WORK_REPORT_LAYOUT.map(c => [c, ''])) as Record<SystemEverWorkReportColumn, string>
97
+ row.WorkDate = localWorkDate(entry.from, timeZone)
98
+ row.WorkOrderNo = entry.orderId
99
+ row.ProdQty = String(entry.goodQuantity + entry.scrapQuantity)
100
+ row.OKQty = String(entry.goodQuantity)
101
+ row.BadQty = String(entry.scrapQuantity)
102
+ row.Remark = key
103
+ return row
104
+ }
105
+
106
+ /**
107
+ * Why this batch cannot be exported — every reason at once.
108
+ *
109
+ * Any reason refuses the whole batch (`stop`): a half-exported file is a file someone pastes.
110
+ */
111
+ export function exportProblems(
112
+ cfg: SystemEverConfig,
113
+ entries: { entry: ProductionPerformanceEntry; key: string }[],
114
+ nowMs: number
115
+ ): string[] {
116
+ const problems: string[] = []
117
+
118
+ if (!entries?.length) problems.push('nothing to export')
119
+
120
+ const timeZone = String(cfg?.timeZone ?? '').trim()
121
+ if (!timeZone) problems.push('timeZone is not set — the work date is a local day and we do not guess the plant zone')
122
+ else {
123
+ try {
124
+ new Intl.DateTimeFormat('en-CA', { timeZone })
125
+ } catch {
126
+ problems.push(`timeZone ${timeZone} is not a known zone`)
127
+ }
128
+ }
129
+
130
+ const seen = new Set<string>()
131
+ /* order → the operations its lines name; `-` stands for "no operation". */
132
+ const operations = new Map<string, Set<string>>()
133
+
134
+ for (const { entry, key } of entries ?? []) {
135
+ const label = entry?.orderId || '(no order)'
136
+
137
+ for (const error of validatePerformance(entry, nowMs)) problems.push(`${label}: ${error}`)
138
+
139
+ let expected: string | undefined
140
+ try {
141
+ expected = performanceKey(entry)
142
+ } catch (e) {
143
+ /* validatePerformance already named what is missing. */
144
+ }
145
+ if (!String(key ?? '').trim()) problems.push(`${label}: no key — the line cannot be paired back`)
146
+ else if (expected !== undefined && key !== expected) {
147
+ /* The key travels in the remark and comes back to pairing; a different spelling never pairs. */
148
+ problems.push(`${label}: key ${key} is not this entry's performanceKey ${expected}`)
149
+ }
150
+ if (key && seen.has(key)) problems.push(`${label}: key ${key} appears twice — the same performance would be pasted twice`)
151
+ if (key) seen.add(key)
152
+
153
+ if (entry?.orderId) {
154
+ const ops = operations.get(entry.orderId) ?? new Set<string>()
155
+ ops.add(entry.operationId ?? '-')
156
+ operations.set(entry.orderId, ops)
157
+ }
158
+
159
+ for (const value of [entry?.orderId, key]) {
160
+ if (typeof value === 'string' && /[\t\r\n]/.test(value)) {
161
+ problems.push(`${label}: a tab or line break in ${JSON.stringify(value)} would split the pasted row`)
162
+ }
163
+ }
164
+ }
165
+
166
+ /*
167
+ * A SystemEver work order is one process, so performance is booked per order. Lines of one order from
168
+ * one operation are fine — the operation is dropped. Lines of one order from two operations would each
169
+ * book their output and each issue the BOM: quantity and material multiplied by the operation count.
170
+ */
171
+ for (const [orderId, ops] of operations) {
172
+ if (ops.size > 1) {
173
+ problems.push(
174
+ `${orderId}: lines from ${ops.size} operations (${[...ops].join(', ')}) — SystemEver books per work order, so they would be counted ${ops.size} times`
175
+ )
176
+ }
177
+ }
178
+
179
+ return problems
180
+ }
181
+
182
+ function fileNameOf(dates: string[]): string {
183
+ const sorted = [...dates].sort()
184
+ const first = sorted[0]
185
+ const last = sorted[sorted.length - 1]
186
+ return `systemever-work-report-${first}${last !== first ? `_${last}` : ''}.tsv`
187
+ }
188
+
189
+ /**
190
+ * Build the paste batch: tab-separated data lines, no header line, one line per entry in the order given.
191
+ * `keys` follow the same order.
192
+ */
193
+ export function exportWorkReports(
194
+ cfg: SystemEverConfig,
195
+ entries: { entry: ProductionPerformanceEntry; key: string }[],
196
+ nowMs = Date.now()
197
+ ): ErpOutcome<ErpExport> {
198
+ const problems = exportProblems(cfg, entries, nowMs)
199
+ if (problems.length) return { ok: false, action: 'stop', error: problems.join('; ') }
200
+
201
+ const timeZone = String(cfg.timeZone).trim()
202
+ const rows = entries.map(({ entry, key }) => workReportRow(entry, key, timeZone))
203
+
204
+ return {
205
+ ok: true,
206
+ value: {
207
+ fileName: fileNameOf(rows.map(r => r.WorkDate)),
208
+ mediaType: 'text/tab-separated-values; charset=utf-8',
209
+ body: rows.map(r => SYSTEMEVER_WORK_REPORT_LAYOUT.map(c => r[c]).join('\t')).join('\r\n') + '\r\n',
210
+ keys: entries.map(({ key }) => key)
211
+ }
212
+ }
213
+ }
214
+
215
+ /** The adapter. It holds no state and opens no connection. */
216
+ export function createSystemEverAdapter(): ErpAdapter {
217
+ return {
218
+ type: 'systemever',
219
+ label: 'Younglimwon SystemEver (manual export)',
220
+ /* The paste layout is not confirmed until the trial registration (see the file head). */
221
+ grounding: 'mock',
222
+ capabilities: ['performance'],
223
+ traits: {
224
+ /* A work order is one process (its ProcName); performance is booked per order. */
225
+ performanceGranularity: 'order',
226
+ /* Saving a work report issues the BOM. */
227
+ materialWithPerformance: true,
228
+ /* A wrong line is deleted by a person on the ERP screen. */
229
+ reversal: 'manual',
230
+ posting: 'manual-export'
231
+ },
232
+
233
+ async probe(_cfg: ErpConfig) {
234
+ /* Nothing to reach: the adapter only builds files. Reading SystemEver is the integration scenario. */
235
+ return { ok: true, value: { detail: 'manual export — this adapter does not connect to SystemEver' } }
236
+ },
237
+
238
+ async exportPerformance(cfg: ErpConfig, entries: { entry: ProductionPerformanceEntry; key: string }[]) {
239
+ return exportWorkReports(cfg as SystemEverConfig, entries)
240
+ }
241
+ }
242
+ }
243
+
244
+ export const systemEverAdapter: ErpAdapter = createSystemEverAdapter()
@@ -0,0 +1,52 @@
1
+ /*
2
+ * ★ 소스 시험이 형제 모듈을 부를 수 있게 한다 — **`operato-twin` 의 같은 규칙을 이 패키지에도 둔다** — **`.js` 로 적힌 상대 경로를 `.ts` 로 되짚는다.**
3
+ *
4
+ * ── 무엇이 서고 있었나 (2026-08-22) ─────────────────────────────────────────
5
+ * 이 패키지의 `npm test` 는 `node --test test/*.test.ts` 로 **소스를 그대로 실행**한다. 그런데 서버
6
+ * 소스는 tsc 로 빌드되는 코드이므로 상대 import 를 `'./x.js'` 로 적는다(그것이 빌드 산출물에서 맞는
7
+ * 경로다). 타입만 지우는 실행은 그 `.js` 를 `.ts` 로 바꿔 주지 않는다.
8
+ *
9
+ * 그래서 **소스 모듈이 형제 모듈을 값으로 참조하는 순간** 그 모듈 그래프를 부르는 시험이 전부 선다.
10
+ * 실측으로 하루에 네 종류가 이 벽에 걸렸다: `identity/namespace.js`(정체성 이름공간) ·
11
+ * `engine/log.js`(로그 문) · `isa95-coverage.js`(적합성 판정) · `journal-count.js`(저널 세기). 늘 같은 오류다.
12
+ *
13
+ * Cannot find module '…/server/identity/namespace.js' imported from '…/templates/wms-unit-load.ts'
14
+ *
15
+ * ── 왜 이 방식인가 ──────────────────────────────────────────────────────────
16
+ * 고르던 길이 둘 있었다.
17
+ *
18
+ * ① 그 시험들을 **빌드 산출물**(`dist-server`)로 돌린다 — 이 패키지에 전례가 있다. 그러나 시험마다
19
+ * 그 배선을 적어야 하고, 걸리는 시험이 늘 때마다 같은 일을 다시 한다. 그리고 산출물이 낡으면
20
+ * **고친 코드가 아닌 것이 돌면서 초록으로 보인다.**
21
+ * ② 상수를 쓰는 파일 안으로 옮긴다 — 값 참조가 사라지지만 **정본이 흩어진다.** 그것이 이 상수를 한
22
+ * 자리에 모은 이유와 정면으로 어긋난다.
23
+ *
24
+ * 둘 다 증상을 피하는 것이고, 원인은 **해석 규칙 하나**다. 그래서 규칙을 고친다: 상대 경로 `.js` 가
25
+ * 없고 같은 이름의 `.ts` 가 있으면 그것을 쓴다. 한 자리에 두므로 걸리는 시험이 늘어도 할 일이 없다.
26
+ *
27
+ * ── 무엇을 하지 않는가 ─────────────────────────────────────────────────────
28
+ * **패키지 이름(`@things-factory/…`)은 손대지 않는다.** 그것은 의존 패키지의 산출물을 가리키는
29
+ * 것이고 실제로 `.js` 가 있다. 되짚는 것은 **상대 경로**뿐이고, 그것도 `.ts` 가 실제로 있을 때만이다 —
30
+ * 없으면 원래 오류가 그대로 난다(없는 것을 지어내지 않는다).
31
+ */
32
+ import { registerHooks } from 'node:module'
33
+ import { existsSync } from 'node:fs'
34
+ import { fileURLToPath, pathToFileURL } from 'node:url'
35
+
36
+ registerHooks({
37
+ resolve(specifier, context, nextResolve) {
38
+ /* 상대 경로의 `.js` 만 본다 — 패키지 이름과 그 밖의 확장자는 그대로 둔다. */
39
+ if (!specifier.startsWith('.') || !specifier.endsWith('.js')) return nextResolve(specifier, context)
40
+
41
+ try {
42
+ return nextResolve(specifier, context)
43
+ } catch (err) {
44
+ /* 해석이 실패한 그때만 `.ts` 를 본다 — 성공하는 경로의 뜻을 바꾸지 않는다. */
45
+ const parent = context?.parentURL
46
+ if (!parent) throw err
47
+ const asTs = new URL(specifier.slice(0, -3) + '.ts', parent)
48
+ if (!existsSync(fileURLToPath(asTs))) throw err
49
+ return { url: pathToFileURL(fileURLToPath(asTs)).href, shortCircuit: true, format: 'module-typescript' }
50
+ }
51
+ }
52
+ })
@@ -0,0 +1,217 @@
1
+ /*
2
+ * **SystemEver adapter** — a manual-export ERP (ADR-0110 decision 1).
3
+ *
4
+ * What is checked here is what can go wrong without anyone noticing: a declaration the contract refuses,
5
+ * a door that lands nothing, a pasted file that books an order twice or on the wrong day, and a key that
6
+ * comes back spelled differently from the one pairing looks for.
7
+ */
8
+ import { test } from 'node:test'
9
+ import assert from 'node:assert/strict'
10
+
11
+ import { erpCapabilityGaps, performanceKey, type ErpExport, type ProductionPerformanceEntry } from '@operato/ops-contract'
12
+
13
+ import {
14
+ SYSTEMEVER_WORK_REPORT_LAYOUT,
15
+ createSystemEverAdapter,
16
+ exportWorkReports,
17
+ localWorkDate
18
+ } from '../server/systemever-adapter.ts'
19
+
20
+ const CFG = { baseUrl: 'https://mfg.systemevererp.com', timeZone: 'Asia/Seoul' }
21
+ const NOW = Date.parse('2026-10-04T12:00:00.000Z')
22
+
23
+ const perf = (over: Partial<ProductionPerformanceEntry> = {}): ProductionPerformanceEntry => ({
24
+ orderId: 'WO-2026100100001',
25
+ goodQuantity: 95,
26
+ scrapQuantity: 5,
27
+ uom: 'EA',
28
+ /* 08:00 – 17:00 in Seoul */
29
+ from: '2026-10-01T23:00:00.000Z',
30
+ to: '2026-10-02T08:00:00.000Z',
31
+ ...over
32
+ })
33
+ const line = (entry: ProductionPerformanceEntry) => ({ entry, key: performanceKey(entry) })
34
+
35
+ function exported(outcome: ReturnType<typeof exportWorkReports>): ErpExport {
36
+ assert.equal(outcome.ok, true, outcome.ok ? '' : (outcome as any).error)
37
+ return (outcome as { ok: true; value: ErpExport }).value
38
+ }
39
+ function refused(outcome: ReturnType<typeof exportWorkReports>): string {
40
+ assert.equal(outcome.ok, false, 'should have refused')
41
+ const failure = outcome as { ok: false; action: string; error: string }
42
+ assert.equal(failure.action, 'stop', 'sending the same batch again gives the same answer — a person must fix it')
43
+ return failure.error
44
+ }
45
+ const cells = (body: string) => body.trimEnd().split('\r\n').map(l => l.split('\t'))
46
+ const col = (name: (typeof SYSTEMEVER_WORK_REPORT_LAYOUT)[number]) => SYSTEMEVER_WORK_REPORT_LAYOUT.indexOf(name)
47
+
48
+ /* ── declaration ─────────────────────────────────────────────────────────── */
49
+
50
+ test('the contract finds nothing wrong with the declaration — plant registration would throw otherwise', () => {
51
+ assert.deepEqual(erpCapabilityGaps(createSystemEverAdapter()), [])
52
+ })
53
+
54
+ test('it is a manual-export ERP with no door that lands anything', () => {
55
+ const a = createSystemEverAdapter()
56
+ assert.equal(a.traits.posting, 'manual-export')
57
+ assert.equal(a.traits.materialWithPerformance, true)
58
+ assert.equal(a.traits.reversal, 'manual')
59
+ assert.equal(a.traits.performanceGranularity, 'order')
60
+ assert.equal(a.postPerformance, undefined)
61
+ assert.equal(a.postMaterialMovement, undefined)
62
+ assert.equal(a.reversePerformance, undefined)
63
+ assert.equal(typeof a.exportPerformance, 'function')
64
+ })
65
+
66
+ test('it does not read — reading SystemEver is the integration scenario (ADR-0110 addition 1)', () => {
67
+ const a = createSystemEverAdapter()
68
+ assert.deepEqual([...a.capabilities], ['performance'])
69
+ for (const reader of ['readSchedules', 'readMaster', 'readPerformance', 'readInventory'] as const) {
70
+ assert.equal(a[reader], undefined, reader)
71
+ }
72
+ })
73
+
74
+ test('grounding does not claim the paste layout was confirmed', () => {
75
+ assert.equal(createSystemEverAdapter().grounding, 'mock')
76
+ })
77
+
78
+ test('a contract planted with a post door refuses it — the declaration is what keeps the pump honest', () => {
79
+ const a = { ...createSystemEverAdapter(), postPerformance: async () => ({ ok: true as const, value: { ref: 'x' } }) }
80
+ assert.ok(erpCapabilityGaps(a).some(g => g.includes('postPerformance')))
81
+ })
82
+
83
+ /* ── the pasted rows ──────────────────────────────────────────────────────── */
84
+
85
+ test('one data line per entry, columns in the layout order, no header line', async () => {
86
+ const a = line(perf())
87
+ const b = line(perf({ orderId: 'WO-2026100100002', goodQuantity: 10, scrapQuantity: 0 }))
88
+ const out = (await createSystemEverAdapter().exportPerformance!(CFG, [a, b])) as any
89
+ const value: ErpExport = exported(out)
90
+ const rows = cells(value.body)
91
+
92
+ assert.equal(rows.length, 2, 'a header or marker line would be pasted into the sheet too')
93
+ for (const row of rows) assert.equal(row.length, SYSTEMEVER_WORK_REPORT_LAYOUT.length)
94
+
95
+ assert.equal(rows[0][col('WorkOrderNo')], 'WO-2026100100001')
96
+ assert.equal(rows[0][col('ProdQty')], '100')
97
+ assert.equal(rows[0][col('OKQty')], '95')
98
+ assert.equal(rows[0][col('BadQty')], '5')
99
+ assert.equal(rows[1][col('WorkOrderNo')], 'WO-2026100100002')
100
+ assert.equal(rows[1][col('ProdQty')], '10')
101
+ assert.equal(value.mediaType.startsWith('text/tab-separated-values'), true)
102
+ })
103
+
104
+ test('keys come back in line order and each line carries its own key in the remark', () => {
105
+ const entries = [line(perf({ orderId: 'B' })), line(perf({ orderId: 'A' })), line(perf({ orderId: 'C' }))]
106
+ const value = exported(exportWorkReports(CFG, entries, NOW))
107
+ const rows = cells(value.body)
108
+
109
+ assert.deepEqual(value.keys, entries.map(e => e.key))
110
+ rows.forEach((row, i) => {
111
+ assert.equal(row[col('Remark')], value.keys[i])
112
+ assert.equal(row[col('WorkOrderNo')], entries[i].entry.orderId)
113
+ })
114
+ })
115
+
116
+ test('columns the entry does not carry stay empty — no work centre, item, process or lot is invented', () => {
117
+ const value = exported(exportWorkReports(CFG, [line(perf({ operationId: '0010', personId: 'E-17' }))], NOW))
118
+ const [row] = cells(value.body)
119
+ for (const name of ['WorkCenterName', 'GoodItemNo', 'ProcName', 'WorkHour', 'WorkerQty', 'RealLotNo', 'SerialNoFrom', 'SerialNoTo', 'IsMatInput', 'IsGoodIn'] as const) {
120
+ assert.equal(row[col(name)], '', name)
121
+ }
122
+ })
123
+
124
+ test('the work date is the plant’s local day, not the UTC day', () => {
125
+ /* 08:00 Seoul on 10-02 is 23:00 UTC on 10-01. */
126
+ const [row] = cells(exported(exportWorkReports(CFG, [line(perf())], NOW)).body)
127
+ assert.equal(row[col('WorkDate')], '2026-10-02')
128
+ })
129
+
130
+ test('a night shift is booked on the day it started', () => {
131
+ /* 22:00 Seoul 10-02 → 06:00 Seoul 10-03 */
132
+ const night = perf({ from: '2026-10-02T13:00:00.000Z', to: '2026-10-02T21:00:00.000Z' })
133
+ const [row] = cells(exported(exportWorkReports(CFG, [line(night)], NOW)).body)
134
+ assert.equal(row[col('WorkDate')], '2026-10-02')
135
+ })
136
+
137
+ test('localWorkDate follows the zone it is given', () => {
138
+ assert.equal(localWorkDate('2026-10-01T23:00:00.000Z', 'Asia/Seoul'), '2026-10-02')
139
+ assert.equal(localWorkDate('2026-10-01T23:00:00.000Z', 'UTC'), '2026-10-01')
140
+ })
141
+
142
+ test('the file name names the days it covers', () => {
143
+ const one = exported(exportWorkReports(CFG, [line(perf())], NOW))
144
+ assert.equal(one.fileName, 'systemever-work-report-2026-10-02.tsv')
145
+
146
+ const later = perf({ orderId: 'X', from: '2026-10-03T23:00:00.000Z', to: '2026-10-04T02:00:00.000Z' })
147
+ const two = exported(exportWorkReports(CFG, [line(later), line(perf())], NOW))
148
+ assert.equal(two.fileName, 'systemever-work-report-2026-10-02_2026-10-04.tsv')
149
+ })
150
+
151
+ /* ── one work order, one process ──────────────────────────────────────────── */
152
+
153
+ test('lines of one order from one operation are booked — the operation is dropped, not refused', () => {
154
+ const morning = perf({ operationId: '0030' })
155
+ const afternoon = perf({ operationId: '0030', from: '2026-10-02T08:00:00.000Z', to: '2026-10-02T10:00:00.000Z' })
156
+ const value = exported(exportWorkReports(CFG, [line(morning), line(afternoon)], NOW))
157
+ assert.equal(cells(value.body).length, 2)
158
+ })
159
+
160
+ test('lines of one order from two operations are refused — each would book output and issue the BOM', () => {
161
+ const assembly = perf({ operationId: '0010' })
162
+ const test = perf({ operationId: '0020' })
163
+ const error = refused(exportWorkReports(CFG, [line(assembly), line(test)], NOW))
164
+ assert.match(error, /WO-2026100100001: lines from 2 operations/)
165
+ })
166
+
167
+ test('a line with an operation and a line without one on the same order are two operations too', () => {
168
+ const error = refused(exportWorkReports(CFG, [line(perf({ operationId: '0010' })), line(perf({ from: '2026-10-02T08:00:00.000Z', to: '2026-10-02T09:00:00.000Z' }))], NOW))
169
+ assert.match(error, /lines from 2 operations/)
170
+ })
171
+
172
+ test('different orders may come from different operations', () => {
173
+ const value = exported(exportWorkReports(CFG, [line(perf({ operationId: '0010' })), line(perf({ orderId: 'WO-2', operationId: '0020' }))], NOW))
174
+ assert.equal(cells(value.body).length, 2)
175
+ })
176
+
177
+ /* ── refusals ─────────────────────────────────────────────────────────────── */
178
+
179
+ test('no time zone, no file — the plant zone is not guessed', () => {
180
+ assert.match(refused(exportWorkReports({ baseUrl: 'x' }, [line(perf())], NOW)), /timeZone is not set/)
181
+ assert.match(refused(exportWorkReports({ ...CFG, timeZone: 'Mars/Olympus' }, [line(perf())], NOW)), /not a known zone/)
182
+ })
183
+
184
+ test('an empty batch is refused rather than handed out as an empty file', () => {
185
+ assert.match(refused(exportWorkReports(CFG, [], NOW)), /nothing to export/)
186
+ })
187
+
188
+ test('the same key twice in one batch is refused — it would be pasted twice', () => {
189
+ const a = line(perf())
190
+ assert.match(refused(exportWorkReports(CFG, [a, a], NOW)), /appears twice/)
191
+ })
192
+
193
+ test('a key that is not the entry’s performanceKey is refused — it would never pair back', () => {
194
+ const entry = perf()
195
+ assert.match(refused(exportWorkReports(CFG, [{ entry, key: 'something-else' }], NOW)), /is not this entry's performanceKey/)
196
+ assert.match(refused(exportWorkReports(CFG, [{ entry, key: '' }], NOW)), /no key/)
197
+ })
198
+
199
+ test('an entry the contract finds wrong is refused with every reason', () => {
200
+ const error = refused(exportWorkReports(CFG, [line(perf({ goodQuantity: -1, uom: '' }))], NOW))
201
+ assert.match(error, /goodQuantity/)
202
+ assert.match(error, /uom/)
203
+ })
204
+
205
+ test('a span not yet over is refused', () => {
206
+ assert.match(refused(exportWorkReports(CFG, [line(perf())], Date.parse('2026-10-02T07:00:00.000Z'))), /아직 오지 않은/)
207
+ })
208
+
209
+ test('a tab inside a value is refused — it would shift every column after it', () => {
210
+ const entry = perf({ orderId: 'WO\t1' })
211
+ assert.match(refused(exportWorkReports(CFG, [line(entry)], NOW)), /tab or line break/)
212
+ })
213
+
214
+ test('one bad line refuses the whole batch — a half file is still a file someone pastes', () => {
215
+ const error = refused(exportWorkReports(CFG, [line(perf()), line(perf({ orderId: 'WO-2', goodQuantity: 0, scrapQuantity: 0 }))], NOW))
216
+ assert.match(error, /WO-2/)
217
+ })
package/tsconfig.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../tsconfig-base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist-server",
5
+ "rootDir": "server"
6
+ },
7
+ "include": ["server/**/*.ts"]
8
+ }
@@ -0,0 +1 @@
1
+ {"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/tslib/tslib.d.ts","../../node_modules/@operato/ops-contract/dist/capability.d.ts","../../node_modules/@operato/ops-contract/dist/rated-usage.d.ts","../../node_modules/@operato/ops-contract/dist/order-fold.d.ts","../../node_modules/@operato/ops-contract/dist/referenced-location.d.ts","../../node_modules/@operato/ops-contract/dist/work-shift-basis.d.ts","../../node_modules/@operato/ops-contract/dist/domain-definition.d.ts","../../node_modules/@operato/ops-contract/dist/contract.d.ts","../../node_modules/@operato/ops-contract/dist/capacity.d.ts","../../node_modules/@operato/ops-contract/dist/domain-catalog.d.ts","../../node_modules/@operato/ops-contract/dist/ems-profile.d.ts","../../node_modules/@operato/ops-contract/dist/energy-ingest.d.ts","../../node_modules/@operato/ops-contract/dist/epcis.d.ts","../../node_modules/@operato/ops-contract/dist/face2-adapter.d.ts","../../node_modules/@operato/ops-contract/dist/iso-duration.d.ts","../../node_modules/@operato/ops-contract/dist/master-data.d.ts","../../node_modules/@operato/ops-contract/dist/actuation.d.ts","../../node_modules/@operato/ops-contract/dist/mes-profile.d.ts","../../node_modules/@operato/ops-contract/dist/operational-ingest.d.ts","../../node_modules/@operato/ops-contract/dist/operations-capability.d.ts","../../node_modules/@operato/ops-contract/dist/scenario-validate.d.ts","../../node_modules/@operato/ops-contract/dist/vocabulary.d.ts","../../node_modules/@operato/ops-contract/dist/wms-profile.d.ts","../../node_modules/@operato/ops-contract/dist/yms-profile.d.ts","../../node_modules/@operato/ops-contract/dist/canonical-record.d.ts","../../node_modules/@operato/ops-contract/dist/command-verdict.d.ts","../../node_modules/@operato/ops-contract/dist/webhook-delivery.d.ts","../../node_modules/@operato/ops-contract/dist/webhook.d.ts","../../node_modules/@operato/ops-contract/dist/webhook-secret.d.ts","../../node_modules/@operato/ops-contract/dist/oee.d.ts","../../node_modules/@operato/ops-contract/dist/yield.d.ts","../../node_modules/@operato/ops-contract/dist/reliability.d.ts","../../node_modules/@operato/ops-contract/dist/erp.d.ts","../../node_modules/@operato/ops-contract/dist/operational-attention.d.ts","../../node_modules/@operato/ops-contract/dist/index.d.ts","./server/systemever-adapter.ts","./server/index.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/blob.d.ts","../../node_modules/@types/node/web-globals/console.d.ts","../../node_modules/@types/node/web-globals/crypto.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/encoding.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/utility.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client-stats.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/round-robin-pool.d.ts","../../node_modules/undici-types/h2c-client.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/dispatcher1-wrapper.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-call-history.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/snapshot-agent.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/socks5-proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/importmeta.d.ts","../../node_modules/@types/node/web-globals/messaging.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/performance.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/web-globals/streams.d.ts","../../node_modules/@types/node/web-globals/timers.d.ts","../../node_modules/@types/node/web-globals/url.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/ffi.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/inspector/promises.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/path/posix.d.ts","../../node_modules/@types/node/path/win32.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/quic.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/iter.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/test/reporters.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/util/types.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vfs.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/zlib/iter.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@jest/expect-utils/build/index.d.ts","../../node_modules/chalk/index.d.ts","../../node_modules/@sinclair/typebox/typebox.d.ts","../../node_modules/@jest/schemas/build/index.d.ts","../../node_modules/pretty-format/build/index.d.ts","../../node_modules/jest-diff/build/index.d.ts","../../node_modules/jest-matcher-utils/build/index.d.ts","../../node_modules/expect/build/index.d.ts","../../node_modules/@types/jest/index.d.ts"],"fileIdsList":[[100,165,173,178,181,183,184,185,198],[100,165,173,178,181,183,184,185,198,229],[69,100,165,173,178,181,183,184,185,198],[74,100,165,173,178,181,183,184,185,198],[68,69,100,165,173,178,181,183,184,185,198],[64,65,66,67,68,100,165,173,178,181,183,184,185,198],[63,68,69,100,165,173,178,181,183,184,185,198],[71,100,165,173,178,181,183,184,185,198],[69,74,100,165,173,178,181,183,184,185,198],[63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,100,165,173,178,181,183,184,185,198],[71,78,100,165,173,178,181,183,184,185,198],[75,100,165,173,178,181,183,184,185,198],[69,70,100,165,173,178,181,183,184,185,198],[100,165,173,178,181,183,184,185,198,231,234],[100,162,163,165,173,178,181,183,184,185,198],[100,164,165,173,178,181,183,184,185,198],[165,173,178,181,183,184,185,198],[100,165,173,178,181,183,184,185,198,207],[100,165,166,171,173,176,178,181,183,184,185,187,198,203,216],[100,165,166,167,173,176,178,181,183,184,185,198],[100,165,168,173,178,181,183,184,185,198,217],[100,165,169,170,173,178,181,183,184,185,189,198],[100,165,170,173,178,181,183,184,185,198,203,213],[100,165,171,173,176,178,181,183,184,185,187,198],[100,164,165,172,173,178,181,183,184,185,198],[100,165,173,174,178,181,183,184,185,198],[100,165,173,175,176,178,181,183,184,185,198],[100,164,165,173,176,178,181,183,184,185,198],[100,165,173,176,178,179,181,183,184,185,198,203,216],[100,165,173,176,178,179,181,183,184,185,198,205,207],[100,152,165,173,176,178,180,181,183,184,185,187,198,203,216],[100,165,173,176,178,180,181,183,184,185,187,198,203,213,216],[100,165,173,178,180,181,182,183,184,185,198,203,213,216],[99,100,101,102,103,104,105,106,107,108,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225],[100,165,173,176,178,181,183,184,185,198],[100,165,173,178,181,183,185,198],[100,165,173,178,181,183,184,185,186,198,216],[100,165,173,176,178,181,183,184,185,187,198,203],[100,165,173,178,181,183,184,185,189,198],[100,165,173,178,181,183,184,185,190,198],[100,165,173,176,178,181,183,184,185,193,198],[100,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224],[100,165,173,178,181,183,184,185,195,198],[100,165,173,178,181,183,184,185,196,198],[100,165,170,173,178,179,181,183,184,185,187,198,205,213],[100,165,173,176,178,181,183,184,185,198,199],[100,165,173,178,181,183,184,185,198,200,217,221],[100,165,173,176,178,181,183,184,185,198,203,205,206,207],[100,165,173,178,181,183,184,185,198,204,207],[100,165,173,176,178,181,183,184,185,198,203,205],[100,165,173,176,178,181,183,184,185,198,203,206,207],[100,165,173,178,181,183,184,185,198,207,217],[100,165,173,178,181,183,184,185,198,208],[100,162,165,173,178,181,183,184,185,198,203,210,216],[100,165,173,178,181,183,184,185,198,203,209],[100,165,173,176,178,181,183,184,185,198,211,212],[100,165,173,178,181,183,184,185,198,211,212],[100,165,170,173,178,181,183,184,185,187,198,203,213],[100,165,173,178,181,183,184,185,198,214],[100,165,173,178,181,183,184,185,187,198,215],[100,165,173,178,180,181,183,184,185,196,198,216],[100,165,173,178,181,183,184,185,198,217,218],[100,165,170,173,178,181,183,184,185,198,218],[100,165,173,178,181,183,184,185,198,203,219],[100,165,173,178,179,181,183,184,185,198],[100,165,173,178,181,183,184,185,186,198,221],[100,165,173,178,181,183,184,185,198,222],[100,165,168,173,178,181,183,184,185,198],[100,165,170,173,178,181,183,184,185,198],[100,165,173,178,181,183,184,185,198,217],[100,152,165,173,178,181,183,184,185,198],[100,165,173,178,181,183,184,185,198,216],[100,165,173,178,181,183,184,185,198,223],[100,165,173,178,181,183,184,185,193,198],[100,165,173,178,181,183,184,185,198,212],[100,152,165,173,176,178,179,181,183,184,185,187,193,198,203,207,216,219,221,223],[100,165,173,178,181,183,184,185,198,203,224],[100,165,173,178,181,183,184,185,198,205,225],[100,165,173,178,181,183,184,185,198,227,233],[100,165,173,178,181,183,184,185,198,231],[100,165,173,178,181,183,184,185,198,228,232],[100,165,173,178,181,183,184,185,198,230],[100,115,118,121,122,165,173,178,181,183,184,185,198,216],[100,118,165,173,178,181,183,184,185,198,203,216],[100,118,122,165,173,178,181,183,184,185,198,216],[100,165,173,178,181,183,184,185,198,203],[100,112,165,173,178,181,183,184,185,198],[100,116,165,173,178,181,183,184,185,198],[100,114,115,118,165,173,178,181,183,184,185,198,216],[100,165,173,178,181,183,184,185,187,198,213],[100,165,173,178,181,183,184,185,198,226],[100,112,165,173,178,181,183,184,185,198,226],[100,114,118,165,173,178,181,183,184,185,187,198,216],[100,109,110,111,113,117,165,173,176,178,181,183,184,185,198,203,216],[100,118,165,173,178,181,183,184,185,198],[100,118,127,136,165,173,178,181,183,184,185,198],[100,110,116,165,173,178,181,183,184,185,198],[100,118,146,147,165,173,178,181,183,184,185,198],[100,110,113,118,165,173,178,181,183,184,185,198,207,216,226],[100,114,118,165,173,178,181,183,184,185,198,216],[100,109,165,173,178,181,183,184,185,198],[100,112,113,114,116,117,118,119,120,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,147,148,149,150,151,165,173,178,181,183,184,185,198],[100,118,139,142,165,173,178,181,183,184,185,198],[100,118,127,129,130,165,173,178,181,183,184,185,198],[100,116,118,129,131,165,173,178,181,183,184,185,198],[100,117,165,173,178,181,183,184,185,198],[100,110,112,118,165,173,178,181,183,184,185,198],[100,118,122,129,131,165,173,178,181,183,184,185,198],[100,122,165,173,178,181,183,184,185,198],[100,116,118,121,165,173,178,181,183,184,185,198,216],[100,110,114,118,127,165,173,178,181,183,184,185,198],[100,118,139,165,173,178,181,183,184,185,198],[100,131,165,173,178,181,183,184,185,198],[100,110,114,118,122,165,173,178,181,183,184,185,198],[100,112,118,146,165,173,178,181,183,184,185,198,207,223,226],[62,97,100,165,173,178,181,183,184,185,198],[62,96,100,165,173,178,181,183,184,185,198]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"1807e82977df1bade3127cfc2f4208cbba3f91e8feb6e46b5da5f30f1abd07ca","impliedFormat":99},{"version":"84d7e41b22d89cf14659b170253221eca7842ec243370aa3df3de0032be9f267","impliedFormat":99},{"version":"e5c5dd7751f65b9ebec07c5fad490291b77916de7b89286cf19824a10275772c","impliedFormat":99},{"version":"874a0a64e5aa778abd22527a7821f7254b4877bdb0752f6934a0ff3e28fd16e0","impliedFormat":99},{"version":"88bfff8eb701cdb25868558bebb6f0ca09a79b470259744f2a05fd045f70ce2a","impliedFormat":99},{"version":"e1a5575d25f6b8f5cf4edcb0da8ba1479f6567104e67d13eb29d31343dff63e8","impliedFormat":99},{"version":"8b12ba2a2a06e120ede14f099baa6a2c2e154d19062449241abfda6058e98939","impliedFormat":99},{"version":"8b19b1efe7358d80069542f71165cfc1da1f73b9fb1bd17c00ab9ead10cac12b","impliedFormat":99},{"version":"7fe4d690c619acbda2d293a90e991904865cefaae9e86f90dac47c85f1b2880e","impliedFormat":99},{"version":"01e1752932f098466d8db5e0ee746fe67bc31198797aed848b299a33a0ed129a","impliedFormat":99},{"version":"248c6ab1747c21d44a7ec1d4962016c9a847779a6b9a795c63a09f652e856979","impliedFormat":99},{"version":"8501321240ce182d68163d9c2e4e3942bb64ff40021389a23ab0a357d9f70a40","impliedFormat":99},{"version":"1708ae46c4a43b3ae7ca05f7e85c316d045af09c7c4cee2232b5cab6e54d5125","impliedFormat":99},{"version":"3440f622fe0a59847c21a6342b5759905fdd44e8291e86d764c620288d902be1","impliedFormat":99},{"version":"d4fc49f5a324fdc0fe43d4f691a13311151a557564a22e5f6b2372fc9a97fce4","impliedFormat":99},{"version":"04f2f38030a60e6504131ddb97f6e20fa4c61427c052f582b74510670978ce65","impliedFormat":99},{"version":"277df687ad53997f521318338b568634c675da8776b47822440865e810b41798","impliedFormat":99},{"version":"c0d83d083f26a0d94d5ffe088564fee9aff16bd7b3d24359b961308fca8811d2","impliedFormat":99},{"version":"0ecf8c4c32edc658eb9e3881c455e561b8898038af0b71f2e426aa82cb5f456e","impliedFormat":99},{"version":"9cee6b71026f202d8b4ff832f96ffcfe247357a41bd00918d2bd8dd837302ac9","impliedFormat":99},{"version":"2a907e69fd7853f665c0164fc2dcdbf060ce8eb82e923e96f1bdc90b9aef6d4d","impliedFormat":99},{"version":"610669d979c76ce1c93f66610cca6cf373b53fb62b8666c4a970106e384520ab","impliedFormat":99},{"version":"afef216a9921063ccbdf974ed2392f1534ad87e13cc6ebe6eb83681f647a9f98","impliedFormat":99},{"version":"f171d697be1231bad9c101c4b554a733830afb2928893830cbbf53259c7131ee","impliedFormat":99},{"version":"7cbe7ebe0a369e4aceb106d9bb6aca7c1c28f147095b9a31d80190370d3e8a77","impliedFormat":99},{"version":"15539c79db06d01d1aec1c653504a48b7dfa18591f8951dafcd82feea3a956ba","impliedFormat":99},{"version":"7e81f87aefc199cebc533bbf83aeea003026384eda8592254e817e97708a19bb","impliedFormat":99},{"version":"534b55dd9134aa880378fee94bf019479debe1c5f35b60fd66a941e12ecf9a38","impliedFormat":99},{"version":"750b03db9ee6283aec4fd2c4268b8e473cafb6799392c81d951ad4d0b5fcc171","impliedFormat":99},{"version":"57b8fcbad5a4b5134082aedce32c2cf79b789e4a44df3edefe340bd505bdfd23","impliedFormat":99},{"version":"d78d674bb95dfd30799df204916699be0d839aafc273d4833427c68ca4476527","impliedFormat":99},{"version":"7e6679130783b54195a91f7ee0814b935f1f2acec8c5d0cd90e190372a067c2f","impliedFormat":99},{"version":"30d975add0746fd96f914d2e26a54ef6f9b87589b7a554c97f4164eff6947009","impliedFormat":99},{"version":"c76ddb87be2c859de6994485321a165a0addd17684795ef46f6a44137bbc3b46","impliedFormat":99},{"version":"1e97ff708da26969a24e3a497b0107e5b772155bff1a329a4b829d18b403fb1f","signature":"98b0c3ca805c03125619f2a9fb1f95df3e9eb9cb95e9193860bf03f5721bac53"},{"version":"a1f3ac5dbc27c6297ab46788589bd6bb36aff1010f630c11a1f7c760a498662e","signature":"f515652477ef92f31cb4e1c88d186d04b297f5af43d849bbdf79eb4f0ce55dd1"},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9b68a1c3f8f45b4c199fa5b3ac09497230cb8f2f0cdcfebe5817b30b836a64a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f53a7652392cf26ebbe4e29fd0672aa87c93bd6d0241289c13fab87b9ac35c8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"b00a630557d1622ad312633bdbfbdb9c6b7220d948dca9f899db30679f160074","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"88809d6c1b9c78d04a133646a6feb926def05a8774c308c7c93bc32ee163d271","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"21d7fab00c101ddf754b392e11534e6b20c6bda269b2ccbcdf3453cbe21d8a39","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"d3c85d4dde1a4918009e37426ee4a940cbbd4100e2e74d03e2de0d50a77bb488","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"60e3ba4b2d24548107060e5d13bffafbbbaa53d001c07bbe40386deda569b5e8","impliedFormat":1},{"version":"a712be2c8cbe0154bd17d1d7bff503d7c04331e0745eb9eea3d303e0e5d9401e","impliedFormat":1},{"version":"25bd6ae1b97ea991433337310fc406cc7c9f271b67b7c79dd24eee384759f3d4","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"38004e6801340cb890afb8cb5a9fc8972297e7f88ab94026e4b0b3c61fb32f8a","impliedFormat":1},{"version":"4ca7fb8f6018ea836b1ad24f67d5e7c2cf7410af7462e0ccc90b012944f5d7ae","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"149f9a9e7f04e67afa0e2a49fc0ff421035c01d6b793cfcae7d2e9f6819431e2","impliedFormat":1},{"version":"e8a9dfa4c75ef6d25df8b40eaa9c31e0a69452aaf2ced4a3f4215dbdbaa876f4","impliedFormat":1},{"version":"a70af845a2eb9dd6e2723e319e14ea7fb28b129ec1361c21509b49305448c323","impliedFormat":1},{"version":"b53dc572d4f187904207ae1166652de47aab8eeb00c254d009cb226863076b56","impliedFormat":1},{"version":"57354d2f022ed64ede57b2e052306dd076a138b551abc7d30ef5e6718ce2f76a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"f501234c5aeeeb5d7659412335227466aaacf30b952372d60afeb21c02c96348","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"358f74dc35927dc88ea86dd201a2b98e701c281615e6b30a4c153eb0bb90ef71","impliedFormat":1},{"version":"8b91ff5bb912be3ea213cbcf0075aace1f5d4ff249a0d227ed673868cb7bfabc","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"98498b101803bb3dde9f76a56e65c14b75db1cc8bec5f4db72be541570f74fc5","impliedFormat":1},{"version":"706abfbafe0ed5f685357375e89bbf48879549ea1772185d77d15f587c5c9400","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"013ff793053d33a15be4614efdd6c50247bbf0b26d6bc58ba338622a7441b543","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"436d7b4543b340b0f3eef4310d524242e41369b9652aa9c70428767c4dcac455","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"e99963ae1e3a48ca7a7958c02f3e88bb963eb7978c28b68ae6b8c9f03309d83c","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"279d0cc1a72879918854265c3405369aa2d4d23509b8694ea102995b298cc5e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"594ae90cacd813fa392ff80d2e0a8eff4e41f4a136329a940e321399dd8895b4","impliedFormat":1},{"version":"d1f333ade8ff35a409b4984e1f11956fe11c61855b0c7e9b59f0313e48b40c4a","impliedFormat":1},{"version":"0224aa4b3464895d69c413a640a19ac2166778a74eb5eb3b36b021c72d42b274","impliedFormat":1},{"version":"575aa163c4c32e5b82e0e99b1f9f80806e1d78bfa259706e05139251c022277b","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fb21326854faaa31ef02c9d51629fb6acedacb9396e74bf22ff8409441ea9ae","impliedFormat":1},{"version":"2fbf504c4791f9d32cd766cfe6b605bcda63289b925401953a7900db9af85348","impliedFormat":1},{"version":"ed0fb633cae35948d9e144004299a4bdf1ab912667c787b7fbffcd6d8c7b92a2","impliedFormat":1},{"version":"1678b04557dca52feab73cc67610918a7f5e25bfdba3e7fa081acd625d93106d","impliedFormat":1},{"version":"9019e48ace02a7f39315d84261f4a3dd23b7a3b1f6584e694001ac93971791b7","impliedFormat":1},{"version":"2f78692a85ada51c8f0988184d34d28436c1040e8ccf0758ba70d4b32b9776ad","impliedFormat":1},{"version":"97581dc7099ef3d844c83706d53a7ecf895c0e867fbf6b9dc035bb3080f677bd","impliedFormat":1},{"version":"e494b286c8e27c52f8c7f945aa80ff223f2a3cd4f7a2619fa8991f1459e26f07","impliedFormat":1},{"version":"f54f5f9e10bbceba7515dfad0ffc89dffdb8d749d0604594c57a725cf6d79c20","impliedFormat":1},{"version":"41d17e1ad9a002feb11c8cdd2777e5bbc0cdb1e3f595d237e4dded0b6949983b","impliedFormat":1},{"version":"8c7e618c2a91ea7f6b5cca272a295864e92c16413be8fc56a943e8c7d5320011","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f487e411f9657df0e76572e500c1209b8fe95ee3b4cc6e6e7913c15f56207d","impliedFormat":1},{"version":"9d37b8a9678efbcdf38238b59ce8e6f7db70aba1a516f3a4a671a301dbacfb3d","impliedFormat":1},{"version":"a47a792b8cff71443be8dfb199f2b77e102a7bf9d4f90c18059f05d9af2d7413","impliedFormat":1},{"version":"ad50512520720d10294c629cb4e2df23891c3fcbeaca00fbfb9e6bbea65f3dd6","impliedFormat":1},{"version":"189769511b45c93b23ba76069f7701d3b631cfbedc1eb94c7753486c78736f78","impliedFormat":1},{"version":"2c2bdaa1d8ead9f68628d6d9d250e46ee8e81aa4898b4769a36956ae15e060fe","impliedFormat":1},{"version":"ba389fd3d7fba6670e97bc82eb12469dcb371d22f24e63859c1df5a083c823ed","impliedFormat":1},{"version":"5ff4433a2deae4f85ab1377e90a7554ce6b47ae51c69a84ca30a6e22fae85834","impliedFormat":1},{"version":"82b91e4e42e6c41bc7fc1b6c2dc5eba6a2ba98375eb1f210e6ff6bba2d54177e","impliedFormat":1},{"version":"97234c5303866576f913d0ccae7d58d6322d9e803c7bf1228a3fda46ab8087b2","affectsGlobalScope":true,"impliedFormat":1},{"version":"961dec547748827cb6b45f6fdc66273f7bacd9c73103c6779f070f2fd07f23f9","impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"73eeb740dacc45adc607a4f59f90fa9dbe2717d93d82f115f45f34e18f8d644a","impliedFormat":1},{"version":"ec501101c2a96133a6c695f934c8f6642149cc728571b29cbb7b770984c1088e","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"d251cda16f3f6a3e07f07c9e6e823ef6c583c63f653eb8777dafa749a78298e3","impliedFormat":1},{"version":"361939136b496a38b3e6b7be750bbb6998ef289bb8dd304c673138542ca16137","affectsGlobalScope":true,"impliedFormat":1},{"version":"230763250f20449fa7b3c9273e1967adb0023dc890d4be1553faca658ee65971","impliedFormat":1},{"version":"c3e9078b60cb329d1221f5878e88cecfa3e74460550e605a58fcfb41a66029ff","impliedFormat":1},{"version":"89e2568ebc2ec1e4149384b105e80e8bbf41eb4d711547f1121f4f628028de96","impliedFormat":1},{"version":"441b9bb09013654aa3d050e68b06464d8959b473e85868249d9d18f692acd35b","impliedFormat":1},{"version":"bc18a1991ba681f03e13285fa1d7b99b03b67ee671b7bc936254467177543890","impliedFormat":1},{"version":"55246f15e33ff1e2e9e679b25fa9790a48db55dc63d567fe25fac8b6a0efe911","impliedFormat":1},{"version":"fa94bbf532b7af8f394b95fa310980d6e20bd2d4c871c6a6cb9f70f03750a44b","impliedFormat":1},{"version":"925734f303b7f0cc111d42aeb21781d38a79e6d5ac05b2b1400cd1861a75d27b","impliedFormat":1},{"version":"5b26c4dd672d88336bb929787c9bfb55119e80ba89ec6dc923da1c063892843e","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fa2214bb0d64701bc6f9ce8cde2fd2ff8c571e0b23065fa04a8a5a6beb91511","impliedFormat":1},{"version":"7286e4e5f80c0b1ab16addbdbbc9dd47fbae1c42034189261177b84d745cde3b","impliedFormat":1},{"version":"f12624a4a8d042b68914eac1b0a16571fc1c523173fcdf2517c65d191bd5a86c","impliedFormat":1},{"version":"cd2a656ba1d250c2002190b683e3826bf4362b6919450bc0f9bbf5612ebad837","impliedFormat":1},{"version":"841983e39bd4cbb463be385e92fda11057cab368bf27100a801c492f1d86cbaa","impliedFormat":1},{"version":"3e221ff0522e6ff95aa74a5211126aaf4d7e85ed8c8ff19290d591ad4bef988f","impliedFormat":1},{"version":"7da83f6429c6298ebf2be43d296b56ecfc94c9c28f5471b2f23b87545b914cea","impliedFormat":1},{"version":"e4156ddb25aa0e3b5303d372f26957b36778f0f6bbd4326359269873295e3058","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc1b433a84cae05ddc5672d4823170af78606ad21ecef60dbc4570190cbf1357","impliedFormat":1},{"version":"751048d4aa67e20e5ecd2692340ea0d19bae42a20cc651d6f56d095e411ce3ac","impliedFormat":1},{"version":"7f78cfb2b343838612c192cb251746e3a7c62ac7675726a47e130d9b213f6580","impliedFormat":1},{"version":"aed8f3e5c7e53462565eedf34a9bcb700393cb2c1ab0c768602b929c3ed3145d","impliedFormat":1},{"version":"8e2577e7262051fd3c5bd6ca2b2056d358ff8853565720f92455860824c25188","impliedFormat":1},{"version":"7ec8d7d483f7394f9da611b10d3a0e402f76ff5c991261e6ce43a15f81ca4258","impliedFormat":1},{"version":"bb9dbb4b2ad81e3e71ec5ba4314973718555b9d04ba2a17dfbf875efecb8e2c0","impliedFormat":1},{"version":"9021dc5be8f3a87af5cede29221188a6497e2092b6889e0be212ef6b6b7153e9","impliedFormat":1},{"version":"4a8c8fd951d9fd9e0775f0aae8ed1f8b528204e24a2600bea3a1228ea83de52c","impliedFormat":1},{"version":"5b9cc0c724a8ebc7a873ab8e73c20b2416cef04b9e9d7f95ef1fa0fdcd4e0ec8","impliedFormat":1},{"version":"99ab6d0d660ce4d21efb52288a39fd35bb3f556980ec5463b1ae8f304a3bbc85","impliedFormat":1},{"version":"80a4b7023a2cc9f14d3f2e4635d6615ab3eff4b5b3630f62a8e73992fdd8cdb9","impliedFormat":1},{"version":"ec62d16f95636123624a69191a35b5df44b4b0a6428977e856c5739c0a787471","impliedFormat":1},{"version":"afa1c49f8e559e413d57343339db857d2a8159435cf9cf7d4deb41718fff1b88","impliedFormat":1},{"version":"c46f111af647c4134ae869653130610d62da321f90ebf19e186a3ea4bed79350","impliedFormat":1},{"version":"cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","impliedFormat":1},{"version":"0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","impliedFormat":1},{"version":"e1028394c1cf96d5d057ecc647e31e457b919092f882ed0c7092152b077fed9d","impliedFormat":1},{"version":"f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","impliedFormat":1},{"version":"5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","impliedFormat":1},{"version":"3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","impliedFormat":1},{"version":"ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","impliedFormat":1},{"version":"d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec","impliedFormat":1},{"version":"f8db4fea512ab759b2223b90ecbbe7dae919c02f8ce95ec03f7fb1cf757cfbeb","affectsGlobalScope":true,"impliedFormat":1}],"root":[97,98],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"declaration":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"inlineSources":true,"module":1,"noEmitOnError":true,"noImplicitAny":false,"outDir":"./dist-server","rootDir":"./server","skipLibCheck":true,"sourceMap":true,"strict":false,"target":9,"useDefineForClassFields":false},"referencedMap":[[227,1],[230,2],[78,3],[86,4],[63,1],[70,5],[87,3],[69,6],[71,7],[68,3],[72,8],[73,3],[74,1],[94,3],[75,9],[96,10],[76,1],[77,1],[79,11],[91,3],[95,3],[80,12],[81,13],[65,1],[64,1],[66,1],[93,3],[82,3],[83,1],[88,3],[90,1],[89,1],[84,8],[67,1],[92,3],[85,8],[229,1],[235,14],[162,15],[163,15],[164,16],[100,17],[165,18],[166,19],[167,20],[168,21],[169,22],[170,23],[171,24],[172,25],[173,26],[174,26],[175,27],[176,28],[177,1],[178,29],[179,30],[101,1],[99,1],[180,31],[181,32],[182,33],[226,34],[183,35],[184,36],[185,35],[186,37],[187,38],[189,39],[190,40],[191,40],[192,40],[193,41],[194,42],[195,43],[196,44],[197,45],[198,46],[199,46],[200,47],[201,1],[202,1],[203,48],[204,49],[205,50],[206,51],[207,52],[208,53],[209,54],[210,55],[211,56],[212,57],[213,58],[214,59],[215,60],[216,61],[217,62],[218,63],[219,64],[220,65],[221,66],[222,67],[102,35],[103,1],[104,68],[105,69],[106,1],[107,70],[108,1],[153,71],[154,72],[155,73],[156,73],[157,74],[158,1],[159,18],[160,75],[161,72],[223,76],[224,77],[225,78],[188,1],[228,1],[234,79],[232,80],[233,81],[231,82],[62,1],[60,1],[61,1],[10,1],[11,1],[13,1],[12,1],[2,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[3,1],[22,1],[23,1],[4,1],[24,1],[28,1],[25,1],[26,1],[27,1],[29,1],[30,1],[31,1],[5,1],[32,1],[33,1],[34,1],[35,1],[6,1],[39,1],[36,1],[37,1],[38,1],[40,1],[7,1],[41,1],[46,1],[47,1],[42,1],[43,1],[44,1],[45,1],[8,1],[51,1],[48,1],[49,1],[50,1],[52,1],[9,1],[53,1],[54,1],[55,1],[57,1],[56,1],[1,1],[58,1],[59,1],[127,83],[141,84],[124,85],[142,86],[151,87],[115,88],[116,89],[114,90],[150,91],[145,92],[149,93],[118,94],[128,95],[138,96],[117,97],[148,98],[112,99],[113,92],[119,95],[120,1],[126,100],[123,95],[110,101],[152,102],[143,103],[131,104],[130,95],[132,105],[135,106],[129,107],[133,108],[146,91],[121,109],[122,110],[136,111],[111,86],[140,112],[139,95],[125,110],[134,113],[137,114],[144,1],[109,1],[147,115],[98,116],[97,117]],"version":"5.9.3"}