1688-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +118 -0
- package/README.md +48 -0
- package/dist/auth/cookies.js +31 -0
- package/dist/auth/cookies.js.map +1 -0
- package/dist/auth/verify.js +25 -0
- package/dist/auth/verify.js.map +1 -0
- package/dist/cli.js +373 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/cart-add.js +199 -0
- package/dist/commands/cart-add.js.map +1 -0
- package/dist/commands/cart-list.js +168 -0
- package/dist/commands/cart-list.js.map +1 -0
- package/dist/commands/cart-remove.js +119 -0
- package/dist/commands/cart-remove.js.map +1 -0
- package/dist/commands/checkout-confirm.js +407 -0
- package/dist/commands/checkout-confirm.js.map +1 -0
- package/dist/commands/checkout-prepare.js +244 -0
- package/dist/commands/checkout-prepare.js.map +1 -0
- package/dist/commands/doctor.js +246 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/image-search.js +210 -0
- package/dist/commands/image-search.js.map +1 -0
- package/dist/commands/login.js +209 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +59 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/offer.js +185 -0
- package/dist/commands/offer.js.map +1 -0
- package/dist/commands/order-get.js +76 -0
- package/dist/commands/order-get.js.map +1 -0
- package/dist/commands/order-list.js +176 -0
- package/dist/commands/order-list.js.map +1 -0
- package/dist/commands/order-logistics.js +152 -0
- package/dist/commands/order-logistics.js.map +1 -0
- package/dist/commands/search.js +250 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/seller-chat.js +213 -0
- package/dist/commands/seller-chat.js.map +1 -0
- package/dist/commands/seller-inquire.js +110 -0
- package/dist/commands/seller-inquire.js.map +1 -0
- package/dist/commands/seller-lookup-ww.js +6 -0
- package/dist/commands/seller-lookup-ww.js.map +1 -0
- package/dist/commands/seller-messages.js +181 -0
- package/dist/commands/seller-messages.js.map +1 -0
- package/dist/commands/whoami.js +53 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/commands/workflows.js +264 -0
- package/dist/commands/workflows.js.map +1 -0
- package/dist/daemon/client.js +75 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/manager.js +128 -0
- package/dist/daemon/manager.js.map +1 -0
- package/dist/daemon/protocol.js +5 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/daemon/server.js +197 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/throttle.js +17 -0
- package/dist/daemon/throttle.js.map +1 -0
- package/dist/io/errors.js +10 -0
- package/dist/io/errors.js.map +1 -0
- package/dist/io/output.js +17 -0
- package/dist/io/output.js.map +1 -0
- package/dist/io/prompt.js +17 -0
- package/dist/io/prompt.js.map +1 -0
- package/dist/session/context.js +91 -0
- package/dist/session/context.js.map +1 -0
- package/dist/session/dispatch.js +50 -0
- package/dist/session/dispatch.js.map +1 -0
- package/dist/session/lock.js +23 -0
- package/dist/session/lock.js.map +1 -0
- package/dist/session/paths.js +31 -0
- package/dist/session/paths.js.map +1 -0
- package/dist/session/shared.js +104 -0
- package/dist/session/shared.js.map +1 -0
- package/dist/session/state.js +27 -0
- package/dist/session/state.js.map +1 -0
- package/dist/util/time.js +17 -0
- package/dist/util/time.js.map +1 -0
- package/package.json +44 -0
- package/scripts/postinstall.mjs +49 -0
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
import readline from 'node:readline/promises';
|
|
2
|
+
import { withSession } from '../session/context.js';
|
|
3
|
+
import { dispatch } from '../session/dispatch.js';
|
|
4
|
+
import { isDaemonReachable } from '../daemon/client.js';
|
|
5
|
+
import { emit, info, isJson } from '../io/output.js';
|
|
6
|
+
import { CliError } from '../io/errors.js';
|
|
7
|
+
import { execute as cartListExecute } from './cart-list.js';
|
|
8
|
+
const CART_URL = 'https://cart.1688.com/';
|
|
9
|
+
/**
|
|
10
|
+
* Daemon-safe execute: navigate, parse preview, click 提交订单, return result.
|
|
11
|
+
* No prompts. Caller is responsible for confirming intent before calling this.
|
|
12
|
+
*/
|
|
13
|
+
export async function execute(ctx, args) {
|
|
14
|
+
if (!Array.isArray(args.cartIds) || args.cartIds.length === 0) {
|
|
15
|
+
throw new CliError(2, 'BAD_INPUT', 'cartIds required.');
|
|
16
|
+
}
|
|
17
|
+
for (const id of args.cartIds) {
|
|
18
|
+
if (!/^\d+$/.test(id)) {
|
|
19
|
+
throw new CliError(2, 'BAD_INPUT', `Invalid cartId: ${id}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
info('Verifying cart items...');
|
|
23
|
+
const cart = await cartListExecute(ctx, {});
|
|
24
|
+
const missing = args.cartIds.filter((id) => !cart.items.some((i) => i.cartId === id));
|
|
25
|
+
if (missing.length > 0) {
|
|
26
|
+
throw new CliError(12, 'CART_ITEM_NOT_FOUND', `cartId(s) not found: ${missing.join(', ')}`);
|
|
27
|
+
}
|
|
28
|
+
const page = await ctx.newPage();
|
|
29
|
+
try {
|
|
30
|
+
await navigateToPreview(page, args.cartIds, cart);
|
|
31
|
+
const preview = await parsePreview(page);
|
|
32
|
+
info('Placing order...');
|
|
33
|
+
const result = await submitOrder(page);
|
|
34
|
+
return { ...result, preview };
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
await page.close().catch(() => { });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export async function run(opts) {
|
|
41
|
+
if (!opts.cartIds || opts.cartIds.length === 0) {
|
|
42
|
+
throw new CliError(2, 'BAD_INPUT', 'At least one cartId is required.');
|
|
43
|
+
}
|
|
44
|
+
// ── Non-interactive paths: --agent or --yes → daemon route, no prompt ──
|
|
45
|
+
// Difference: --yes still requires TTY (real user fast-tracking);
|
|
46
|
+
// --agent skips TTY check (agent who already got user authorization).
|
|
47
|
+
if (opts.agent || opts.yes) {
|
|
48
|
+
if (opts.yes && !opts.agent && (!process.stdin.isTTY || isJson())) {
|
|
49
|
+
throw new CliError(20, 'TTY_REQUIRED', '--yes still requires a real terminal. ' +
|
|
50
|
+
'Use --agent if you are an agent invocation.');
|
|
51
|
+
}
|
|
52
|
+
info(opts.agent
|
|
53
|
+
? '[agent mode] No prompt; user authorization is the caller\'s responsibility.'
|
|
54
|
+
: '[--yes] Skipping prompt.');
|
|
55
|
+
const data = await dispatch('checkout-confirm', { cartIds: opts.cartIds }, { profile: opts.profile });
|
|
56
|
+
emit({
|
|
57
|
+
human: () => printResult(data),
|
|
58
|
+
data,
|
|
59
|
+
});
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// ── Default: TTY + interactive y/N + auto-pause daemon + inline ───────
|
|
63
|
+
if (isJson() || !process.stdin.isTTY || !process.stdout.isTTY) {
|
|
64
|
+
throw new CliError(20, 'TTY_REQUIRED', 'checkout confirm refuses non-interactive invocation. ' +
|
|
65
|
+
'Run from a real terminal, or pass --agent if you are an agent that ' +
|
|
66
|
+
'already obtained user authorization.');
|
|
67
|
+
}
|
|
68
|
+
let daemonWasRunning = false;
|
|
69
|
+
if (await isDaemonReachable()) {
|
|
70
|
+
info('Pausing daemon temporarily (will restart after)...');
|
|
71
|
+
const { stop } = await import('../daemon/manager.js');
|
|
72
|
+
await stop();
|
|
73
|
+
daemonWasRunning = true;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
await withSession({ headless: true, profile: opts.profile }, async (ctx) => {
|
|
77
|
+
// Verify + nav + parse preview, then prompt user, then submit.
|
|
78
|
+
if (!Array.isArray(opts.cartIds) || opts.cartIds.length === 0) {
|
|
79
|
+
throw new CliError(2, 'BAD_INPUT', 'cartIds required.');
|
|
80
|
+
}
|
|
81
|
+
info('Verifying cart items...');
|
|
82
|
+
const cart = await cartListExecute(ctx, {});
|
|
83
|
+
const missing = opts.cartIds.filter((id) => !cart.items.some((i) => i.cartId === id));
|
|
84
|
+
if (missing.length > 0) {
|
|
85
|
+
throw new CliError(12, 'CART_ITEM_NOT_FOUND', `cartId(s) not found: ${missing.join(', ')}`);
|
|
86
|
+
}
|
|
87
|
+
const page = await ctx.newPage();
|
|
88
|
+
try {
|
|
89
|
+
await navigateToPreview(page, opts.cartIds, cart);
|
|
90
|
+
const preview = await parsePreview(page);
|
|
91
|
+
printPreview(preview);
|
|
92
|
+
if (!opts.yes) {
|
|
93
|
+
await yesNoConfirm(`\nPlace this order for ¥${preview.totalAmount.toFixed(2)}? [y/N] `);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
process.stderr.write(`\n(--yes) Placing order for ¥${preview.totalAmount.toFixed(2)}...\n`);
|
|
97
|
+
}
|
|
98
|
+
info('\nPlacing order...');
|
|
99
|
+
const result = await submitOrder(page);
|
|
100
|
+
emit({
|
|
101
|
+
human: () => printResult({ ...result, preview }),
|
|
102
|
+
data: { ...result, preview },
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
await page.close().catch(() => { });
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
if (daemonWasRunning) {
|
|
112
|
+
info('Restarting daemon...');
|
|
113
|
+
try {
|
|
114
|
+
const { start } = await import('../daemon/manager.js');
|
|
115
|
+
await start();
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
process.stderr.write(`WARN: daemon failed to restart: ${e.message}. ` +
|
|
119
|
+
'Run `1688 daemon start` manually.\n');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function navigateToPreview(page, cartIds, cart) {
|
|
125
|
+
await page.goto(CART_URL, {
|
|
126
|
+
waitUntil: 'domcontentloaded',
|
|
127
|
+
timeout: 30000,
|
|
128
|
+
});
|
|
129
|
+
if (/login\.1688\.com|login\.taobao\.com/.test(page.url())) {
|
|
130
|
+
throw new CliError(3, 'NOT_LOGGED_IN', 'Session expired. Run `1688 login`.');
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
await page.waitForSelector('input[type="checkbox"].next-checkbox-input', {
|
|
134
|
+
timeout: 15000,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
throw new CliError(11, 'CART_NOT_LOADED', 'Cart page did not load.');
|
|
139
|
+
}
|
|
140
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
141
|
+
// Uncheck all
|
|
142
|
+
await page.evaluate(() => {
|
|
143
|
+
const wrappers = Array.from(document.querySelectorAll('.next-checkbox-wrapper'));
|
|
144
|
+
for (const w of wrappers) {
|
|
145
|
+
const aria = w.querySelector('[aria-checked]');
|
|
146
|
+
if (aria?.getAttribute('aria-checked') === 'true') {
|
|
147
|
+
w.click();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
152
|
+
// Check each target. Use SKU title (unique per row) to disambiguate
|
|
153
|
+
// siblings — multiple SKUs of the same offer share productTitle, so walking
|
|
154
|
+
// up from productTitle alone hits the group-level checkbox.
|
|
155
|
+
for (const cartId of cartIds) {
|
|
156
|
+
const item = cart.items.find((i) => i.cartId === cartId);
|
|
157
|
+
const titleHint = item.productTitle.slice(0, 12);
|
|
158
|
+
const skuHint = item.skuTitle?.trim() ?? null;
|
|
159
|
+
const res = await page.evaluate(({ titleHint, skuHint }) => {
|
|
160
|
+
// Prefer rows that contain the SKU spec text (unique).
|
|
161
|
+
// If no skuTitle, fall back to productTitle.
|
|
162
|
+
const probe = skuHint && skuHint.length >= 3 ? skuHint : titleHint;
|
|
163
|
+
const all = Array.from(document.querySelectorAll('*'));
|
|
164
|
+
const candidates = all.filter((el) => el.children.length === 0 &&
|
|
165
|
+
el.textContent !== null &&
|
|
166
|
+
el.textContent.includes(probe));
|
|
167
|
+
// For each candidate, walk up to find a scope that contains BOTH the
|
|
168
|
+
// productTitle AND a checkbox. The SMALLEST such scope is the row.
|
|
169
|
+
for (const c of candidates) {
|
|
170
|
+
let row = c;
|
|
171
|
+
for (let d = 0; d < 10 && row; d++) {
|
|
172
|
+
row = row.parentElement;
|
|
173
|
+
if (!row)
|
|
174
|
+
break;
|
|
175
|
+
const txt = row.textContent ?? '';
|
|
176
|
+
if (!txt.includes(titleHint))
|
|
177
|
+
continue;
|
|
178
|
+
const cb = row.querySelector('.next-checkbox-wrapper');
|
|
179
|
+
if (cb) {
|
|
180
|
+
const aria = cb.querySelector('[aria-checked]');
|
|
181
|
+
if (aria?.getAttribute('aria-checked') !== 'true')
|
|
182
|
+
cb.click();
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return false;
|
|
188
|
+
}, { titleHint, skuHint });
|
|
189
|
+
if (!res) {
|
|
190
|
+
throw new CliError(14, 'UI_ELEMENT_NOT_FOUND', `Could not select cartId ${cartId} in cart UI (sku="${item.skuTitle ?? ''}").`);
|
|
191
|
+
}
|
|
192
|
+
await new Promise((r) => setTimeout(r, 600));
|
|
193
|
+
}
|
|
194
|
+
// Wait for at least one aria-checked=true to confirm React state updated
|
|
195
|
+
const checkedReady = await page
|
|
196
|
+
.waitForFunction(() => {
|
|
197
|
+
const wrappers = Array.from(document.querySelectorAll('.next-checkbox-wrapper'));
|
|
198
|
+
return wrappers.some((w) => {
|
|
199
|
+
const aria = w.querySelector('[aria-checked]');
|
|
200
|
+
return aria?.getAttribute('aria-checked') === 'true';
|
|
201
|
+
});
|
|
202
|
+
}, { timeout: 8000 })
|
|
203
|
+
.then(() => true)
|
|
204
|
+
.catch(() => false);
|
|
205
|
+
if (!checkedReady) {
|
|
206
|
+
throw new CliError(14, 'CHECKBOX_NOT_TICKED', 'Target item did not register as selected.');
|
|
207
|
+
}
|
|
208
|
+
// Click 结算; retry up to 3 times
|
|
209
|
+
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
210
|
+
await page
|
|
211
|
+
.locator('button:has-text("结算"):not([disabled])')
|
|
212
|
+
.first()
|
|
213
|
+
.click({ force: true, timeout: 5000 });
|
|
214
|
+
const navigated = await page
|
|
215
|
+
.waitForURL(/smart_make_order|order\.1688\.com\/order/i, {
|
|
216
|
+
timeout: 6000,
|
|
217
|
+
})
|
|
218
|
+
.then(() => true)
|
|
219
|
+
.catch(() => false);
|
|
220
|
+
if (navigated)
|
|
221
|
+
break;
|
|
222
|
+
if (attempt === 3) {
|
|
223
|
+
throw new CliError(18, 'PREVIEW_NAV_FAILED', `Did not reach checkout preview after ${attempt} attempts. URL: ${page.url()}`);
|
|
224
|
+
}
|
|
225
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
226
|
+
}
|
|
227
|
+
await new Promise((r) => setTimeout(r, 2500));
|
|
228
|
+
}
|
|
229
|
+
async function parsePreview(page) {
|
|
230
|
+
const html = await page.content();
|
|
231
|
+
const m = html.match(/data-source="([^"]+sumPayment[^"]+)"/);
|
|
232
|
+
if (!m) {
|
|
233
|
+
throw new CliError(19, 'PREVIEW_NOT_FOUND', 'Could not locate preview data on page.');
|
|
234
|
+
}
|
|
235
|
+
const decoded = m[1]
|
|
236
|
+
.replace(/"/g, '"')
|
|
237
|
+
.replace(/'/g, "'")
|
|
238
|
+
.replace(/&/g, '&')
|
|
239
|
+
.replace(/</g, '<')
|
|
240
|
+
.replace(/>/g, '>');
|
|
241
|
+
const raw = JSON.parse(decoded);
|
|
242
|
+
const orders = raw.orders ?? [];
|
|
243
|
+
if (orders.length === 0) {
|
|
244
|
+
throw new CliError(19, 'PREVIEW_EMPTY', 'No orders in preview.');
|
|
245
|
+
}
|
|
246
|
+
const cents = (n) => n === undefined ? 0 : Math.round(n) / 100;
|
|
247
|
+
let total = 0, product = 0, shipping = 0, tax = 0;
|
|
248
|
+
const out = [];
|
|
249
|
+
let firstAddr;
|
|
250
|
+
for (const o of orders) {
|
|
251
|
+
total += cents(o.sumPayment);
|
|
252
|
+
product += cents(o.sumPaymentNoCarriage);
|
|
253
|
+
shipping += cents(o.sumCarriage);
|
|
254
|
+
tax += cents(o.sumTaxAmount);
|
|
255
|
+
if (!firstAddr)
|
|
256
|
+
firstAddr = o.receiveAddress;
|
|
257
|
+
const items = [];
|
|
258
|
+
for (const cg of o.cargoGroupedByLogistics ?? []) {
|
|
259
|
+
for (const c of cg.cargoList ?? []) {
|
|
260
|
+
for (const oc of c.orderCargos ?? []) {
|
|
261
|
+
items.push({
|
|
262
|
+
cartId: oc.cartId !== undefined ? String(oc.cartId) : '',
|
|
263
|
+
offerId: c.offerId !== undefined ? String(c.offerId) : '',
|
|
264
|
+
productNumber: oc.cargoNumber ?? null,
|
|
265
|
+
skuNumber: oc.cargoSkuNumber ?? null,
|
|
266
|
+
quantity: oc.commonQuantity ?? 0,
|
|
267
|
+
unitPrice: oc.finalUnitPrice ?? 0,
|
|
268
|
+
amount: oc.amount ?? 0,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
out.push({
|
|
274
|
+
seller: {
|
|
275
|
+
memberId: o.simpleSeller?.memberId ?? null,
|
|
276
|
+
loginId: o.simpleSeller?.loginId ?? null,
|
|
277
|
+
companyName: o.simpleSeller?.companyName ?? null,
|
|
278
|
+
},
|
|
279
|
+
totalAmount: cents(o.sumPayment),
|
|
280
|
+
productAmount: cents(o.sumPaymentNoCarriage),
|
|
281
|
+
shippingAmount: cents(o.sumCarriage),
|
|
282
|
+
items,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
return {
|
|
286
|
+
ok: true,
|
|
287
|
+
url: page.url(),
|
|
288
|
+
totalAmount: total,
|
|
289
|
+
productAmount: product,
|
|
290
|
+
shippingAmount: shipping,
|
|
291
|
+
taxAmount: tax,
|
|
292
|
+
receiveAddress: {
|
|
293
|
+
fullName: firstAddr?.fullName ?? null,
|
|
294
|
+
mobile: firstAddr?.mobile ?? null,
|
|
295
|
+
address: firstAddr?.address ?? null,
|
|
296
|
+
region: firstAddr?.addressCodeText ?? null,
|
|
297
|
+
},
|
|
298
|
+
orders: out,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
function printPreview(p) {
|
|
302
|
+
process.stderr.write('\n══ ABOUT TO PLACE ORDER ══\n\n');
|
|
303
|
+
process.stderr.write(` TOTAL: ¥${p.totalAmount.toFixed(2)}\n`);
|
|
304
|
+
process.stderr.write(` items ¥${p.productAmount.toFixed(2)} + shipping ¥${p.shippingAmount.toFixed(2)}` +
|
|
305
|
+
(p.taxAmount > 0 ? ` + tax ¥${p.taxAmount.toFixed(2)}` : '') +
|
|
306
|
+
'\n');
|
|
307
|
+
process.stderr.write(` ship to: ${p.receiveAddress.fullName ?? '?'} ${p.receiveAddress.mobile ?? ''}\n`);
|
|
308
|
+
process.stderr.write(` ${p.receiveAddress.region ?? ''} ${p.receiveAddress.address ?? ''}\n\n`);
|
|
309
|
+
for (const o of p.orders) {
|
|
310
|
+
process.stderr.write(` Seller: ${o.seller.companyName ?? '?'}\n`);
|
|
311
|
+
for (const it of o.items) {
|
|
312
|
+
process.stderr.write(` * cartId=${it.cartId} ${it.quantity}×¥${it.unitPrice.toFixed(2)} = ¥${it.amount.toFixed(2)}\n`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
process.stderr.write('\nThis will PLACE the order. Payment is NOT charged — pay on 1688 app/website.\n');
|
|
316
|
+
}
|
|
317
|
+
async function yesNoConfirm(prompt) {
|
|
318
|
+
const rl = readline.createInterface({
|
|
319
|
+
input: process.stdin,
|
|
320
|
+
output: process.stderr,
|
|
321
|
+
});
|
|
322
|
+
try {
|
|
323
|
+
const answer = await rl.question(prompt);
|
|
324
|
+
if (!/^y(es)?$/i.test(answer.trim())) {
|
|
325
|
+
throw new CliError(130, 'CANCELED', 'Order canceled.');
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
finally {
|
|
329
|
+
rl.close();
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
async function submitOrder(page) {
|
|
333
|
+
const beforeUrl = page.url();
|
|
334
|
+
// 1688 uses a custom web component: <q-button>...提交订单</q-button>
|
|
335
|
+
const submitBtn = page.getByText('提交订单', { exact: true }).first();
|
|
336
|
+
try {
|
|
337
|
+
await submitBtn.waitFor({ state: 'visible', timeout: 15000 });
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
throw new CliError(21, 'SUBMIT_BUTTON_NOT_FOUND', 'Could not find "提交订单" element on preview page.');
|
|
341
|
+
}
|
|
342
|
+
await new Promise((r) => setTimeout(r, 1500));
|
|
343
|
+
await submitBtn.click({ force: true, timeout: 5000 });
|
|
344
|
+
// Wait for nav to cashier/order/pay, or success text in body.
|
|
345
|
+
const deadline = Date.now() + 30000;
|
|
346
|
+
let finalUrl = page.url();
|
|
347
|
+
while (Date.now() < deadline) {
|
|
348
|
+
finalUrl = page.url();
|
|
349
|
+
if (finalUrl !== beforeUrl &&
|
|
350
|
+
/cashier|alipay|pay\.1688|trade\.1688|order|buy_now/i.test(finalUrl)) {
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
const txt = await page
|
|
354
|
+
.evaluate(() => (document.body?.innerText ?? '').slice(0, 800))
|
|
355
|
+
.catch(() => '');
|
|
356
|
+
if (/下单成功|订单提交成功|请在.*分钟内付款|订单号/.test(txt))
|
|
357
|
+
break;
|
|
358
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
359
|
+
}
|
|
360
|
+
// URL may have orderId nested in a URL-encoded returnURL parameter, so
|
|
361
|
+
// decodeURIComponent first.
|
|
362
|
+
const decodedUrl = (() => {
|
|
363
|
+
try {
|
|
364
|
+
return decodeURIComponent(finalUrl);
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
return finalUrl;
|
|
368
|
+
}
|
|
369
|
+
})();
|
|
370
|
+
const orderIdMatch = decodedUrl.match(/[?&]orderId=(\d{12,})/) ??
|
|
371
|
+
decodedUrl.match(/orderIds?=([\d,]+)/);
|
|
372
|
+
let orderId = orderIdMatch ? orderIdMatch[1] : null;
|
|
373
|
+
if (!orderId) {
|
|
374
|
+
const txt = await page
|
|
375
|
+
.evaluate(() => document.body?.innerText ?? '')
|
|
376
|
+
.catch(() => '');
|
|
377
|
+
const idMatch = txt.match(/订单号[::\s]*(\d{12,})/);
|
|
378
|
+
if (idMatch)
|
|
379
|
+
orderId = idMatch[1];
|
|
380
|
+
}
|
|
381
|
+
const placed = finalUrl !== beforeUrl || orderId !== null;
|
|
382
|
+
return {
|
|
383
|
+
ok: true,
|
|
384
|
+
placed,
|
|
385
|
+
finalUrl,
|
|
386
|
+
orderId,
|
|
387
|
+
message: placed
|
|
388
|
+
? `Order placed. Pay on 1688 app/website. Final URL: ${finalUrl}`
|
|
389
|
+
: 'Submit clicked, but no clear success signal observed. Check 1688 directly.',
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
function printResult(r) {
|
|
393
|
+
process.stdout.write('\n');
|
|
394
|
+
if (r.placed) {
|
|
395
|
+
process.stdout.write('✓ Order placed.\n');
|
|
396
|
+
if (r.orderId)
|
|
397
|
+
process.stdout.write(` orderId: ${r.orderId}\n`);
|
|
398
|
+
process.stdout.write(` URL: ${r.finalUrl}\n`);
|
|
399
|
+
process.stdout.write('\nPay on 1688 app or in browser. 1688 does NOT handle payment.\n');
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
process.stdout.write('⚠ Submit clicked but success unconfirmed.\n');
|
|
403
|
+
process.stdout.write(` URL: ${r.finalUrl}\n`);
|
|
404
|
+
process.stdout.write(' Check `1688 order list` to verify whether the order was created.\n');
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=checkout-confirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkout-confirm.js","sourceRoot":"","sources":["../../src/commands/checkout-confirm.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAuB5D,MAAM,QAAQ,GAAG,wBAAwB,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAmB,EACnB,IAAyB;IAEzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAC1D,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACjC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CACjD,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,QAAQ,CAChB,EAAE,EACF,qBAAqB,EACrB,wBAAwB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7C,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAyB;IACjD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,kCAAkC,CAAC,CAAC;IACzE,CAAC;IAED,0EAA0E;IAC1E,qEAAqE;IACrE,yEAAyE;IACzE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,QAAQ,CAChB,EAAE,EACF,cAAc,EACd,wCAAwC;gBACtC,6CAA6C,CAChD,CAAC;QACJ,CAAC;QACD,IAAI,CACF,IAAI,CAAC,KAAK;YACR,CAAC,CAAC,6EAA6E;YAC/E,CAAC,CAAC,0BAA0B,CAC/B,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CACzB,kBAAkB,EAClB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EACzB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC1B,CAAC;QACF,IAAI,CAAC;YACH,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;YAC9B,IAAI;SACL,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,yEAAyE;IACzE,IAAI,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9D,MAAM,IAAI,QAAQ,CAChB,EAAE,EACF,cAAc,EACd,uDAAuD;YACrD,qEAAqE;YACrE,sCAAsC,CACzC,CAAC;IACJ,CAAC;IAED,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,MAAM,iBAAiB,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,oDAAoD,CAAC,CAAC;QAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACtD,MAAM,IAAI,EAAE,CAAC;QACb,gBAAgB,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,CACf,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EACzC,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,+DAA+D;YAC/D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAI,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAChC,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACjC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CACjD,CAAC;YACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,QAAQ,CAChB,EAAE,EACF,qBAAqB,EACrB,wBAAwB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7C,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAClD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;gBACzC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACd,MAAM,YAAY,CAChB,2BAA2B,OAAO,CAAC,WAAW,CAAC,OAAO,CACpD,CAAC,CACF,UAAU,CACZ,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gCAAgC,OAAO,CAAC,WAAW,CAAC,OAAO,CACzD,CAAC,CACF,OAAO,CACT,CAAC;gBACJ,CAAC;gBACD,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBAC3B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;gBACvC,IAAI,CAAC;oBACH,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;oBAChD,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE;iBAC7B,CAAC,CAAC;YACL,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;gBACvD,MAAM,KAAK,EAAE,CAAC;YAChB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mCAAoC,CAAW,CAAC,OAAO,IAAI;oBACzD,qCAAqC,CACxC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAAU,EACV,OAAiB,EACjB,IAAiD;IAEjD,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;QACxB,SAAS,EAAE,kBAAkB;QAC7B,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IACH,IAAI,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,QAAQ,CAAC,CAAC,EAAE,eAAe,EAAE,oCAAoC,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,eAAe,CAAC,4CAA4C,EAAE;YACvE,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC,EAAE,EAAE,iBAAiB,EAAE,yBAAyB,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAE9C,cAAc;IACd,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CACzB,QAAQ,CAAC,gBAAgB,CAAc,wBAAwB,CAAC,CACjE,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;YAC/C,IAAI,IAAI,EAAE,YAAY,CAAC,cAAc,CAAC,KAAK,MAAM,EAAE,CAAC;gBAClD,CAAC,CAAC,KAAK,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAE9C,oEAAoE;IACpE,4EAA4E;IAC5E,4DAA4D;IAC5D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAC7B,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;YACzB,uDAAuD;YACvD,6CAA6C;YAC7C,MAAM,KAAK,GAAG,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YACnE,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAc,GAAG,CAAC,CAAC,CAAC;YACpE,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAC3B,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBACxB,EAAE,CAAC,WAAW,KAAK,IAAI;gBACvB,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CACjC,CAAC;YACF,qEAAqE;YACrE,mEAAmE;YACnE,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,IAAI,GAAG,GAAuB,CAAC,CAAC;gBAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnC,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC;oBACxB,IAAI,CAAC,GAAG;wBAAE,MAAM;oBAChB,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;oBAClC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;wBAAE,SAAS;oBACvC,MAAM,EAAE,GAAG,GAAG,CAAC,aAAa,CAC1B,wBAAwB,CACzB,CAAC;oBACF,IAAI,EAAE,EAAE,CAAC;wBACP,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;wBAChD,IAAI,IAAI,EAAE,YAAY,CAAC,cAAc,CAAC,KAAK,MAAM;4BAAE,EAAE,CAAC,KAAK,EAAE,CAAC;wBAC9D,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,EACD,EAAE,SAAS,EAAE,OAAO,EAAE,CACvB,CAAC;QACF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,QAAQ,CAChB,EAAE,EACF,sBAAsB,EACtB,2BAA2B,MAAM,qBAAqB,IAAI,CAAC,QAAQ,IAAI,EAAE,KAAK,CAC/E,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,yEAAyE;IACzE,MAAM,YAAY,GAAG,MAAM,IAAI;SAC5B,eAAe,CACd,GAAG,EAAE;QACH,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CACzB,QAAQ,CAAC,gBAAgB,CAAc,wBAAwB,CAAC,CACjE,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACzB,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;YAC/C,OAAO,IAAI,EAAE,YAAY,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB;SACA,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACtB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,QAAQ,CAChB,EAAE,EACF,qBAAqB,EACrB,2CAA2C,CAC5C,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI;aACP,OAAO,CAAC,uCAAuC,CAAC;aAChD,KAAK,EAAE;aACP,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,IAAI;aACzB,UAAU,CAAC,2CAA2C,EAAE;YACvD,OAAO,EAAE,IAAI;SACd,CAAC;aACD,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;aAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,SAAS;YAAE,MAAM;QACrB,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,QAAQ,CAChB,EAAE,EACF,oBAAoB,EACpB,wCAAwC,OAAO,mBAAmB,IAAI,CAAC,GAAG,EAAE,EAAE,CAC/E,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAU;IACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IAClC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC7D,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,QAAQ,CAChB,EAAE,EACF,mBAAmB,EACnB,wCAAwC,CACzC,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAE;SAClB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CA+B7B,CAAC;IACF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;IAChC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,QAAQ,CAAC,EAAE,EAAE,eAAe,EAAE,uBAAuB,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,CAAqB,EAAE,EAAE,CACtC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAE5C,IAAI,KAAK,GAAG,CAAC,EACX,OAAO,GAAG,CAAC,EACX,QAAQ,GAAG,CAAC,EACZ,GAAG,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,GAAoC,EAAE,CAAC;IAChD,IAAI,SAAyD,CAAC;IAC9D,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC7B,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACzC,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACjC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS;YAAE,SAAS,GAAG,CAAC,CAAC,cAAc,CAAC;QAC7C,MAAM,KAAK,GAAqD,EAAE,CAAC;QACnE,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,uBAAuB,IAAI,EAAE,EAAE,CAAC;YACjD,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;gBACnC,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;oBACrC,KAAK,CAAC,IAAI,CAAC;wBACT,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;wBACxD,OAAO,EAAE,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;wBACzD,aAAa,EAAE,EAAE,CAAC,WAAW,IAAI,IAAI;wBACrC,SAAS,EAAE,EAAE,CAAC,cAAc,IAAI,IAAI;wBACpC,QAAQ,EAAE,EAAE,CAAC,cAAc,IAAI,CAAC;wBAChC,SAAS,EAAE,EAAE,CAAC,cAAc,IAAI,CAAC;wBACjC,MAAM,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC;qBACvB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,GAAG,CAAC,IAAI,CAAC;YACP,MAAM,EAAE;gBACN,QAAQ,EAAE,CAAC,CAAC,YAAY,EAAE,QAAQ,IAAI,IAAI;gBAC1C,OAAO,EAAE,CAAC,CAAC,YAAY,EAAE,OAAO,IAAI,IAAI;gBACxC,WAAW,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW,IAAI,IAAI;aACjD;YACD,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;YAChC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC;YAC5C,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC;YACpC,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;QACf,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,OAAO;QACtB,cAAc,EAAE,QAAQ;QACxB,SAAS,EAAE,GAAG;QACd,cAAc,EAAE;YACd,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI;YACrC,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,IAAI;YACjC,OAAO,EAAE,SAAS,EAAE,OAAO,IAAI,IAAI;YACnC,MAAM,EAAE,SAAS,EAAE,eAAe,IAAI,IAAI;SAC3C;QACD,MAAM,EAAE,GAAG;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,CAAwB;IAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sBAAsB,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,cAAc,CAAC,OAAO,CACtF,CAAC,CACF,EAAE;QACD,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,IAAI,CACP,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,cAAc,CAAC,CAAC,cAAc,CAAC,QAAQ,IAAI,GAAG,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE,IAAI,CACpF,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,cAAc,CAAC,CAAC,cAAc,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,CAAC,cAAc,CAAC,OAAO,IAAI,EAAE,MAAM,CACpF,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,GAAG,IAAI,CAAC,CAAC;QACnE,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gBAAgB,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,SAAS,CAAC,OAAO,CAChE,CAAC,CACF,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACjC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kFAAkF,CACnF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAc;IACxC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAU;IAOnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,iEAAiE;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAChB,EAAE,EACF,yBAAyB,EACzB,gDAAgD,CACjD,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,MAAM,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtD,8DAA8D;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IACpC,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,IACE,QAAQ,KAAK,SAAS;YACtB,qDAAqD,CAAC,IAAI,CAAC,QAAQ,CAAC,EACpE,CAAC;YACD,MAAM;QACR,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI;aACnB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC9D,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM;QACjD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,uEAAuE;IACvE,4BAA4B;IAC5B,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE;QACvB,IAAI,CAAC;YACH,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,MAAM,YAAY,GAChB,UAAU,CAAC,KAAK,CAAC,uBAAuB,CAAC;QACzC,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACzC,IAAI,OAAO,GAAkB,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,MAAM,IAAI;aACnB,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC;aAC9C,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACjD,IAAI,OAAO;YAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;IACrC,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,CAAC;IAC1D,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM;QACN,QAAQ;QACR,OAAO;QACP,OAAO,EAAE,MAAM;YACb,CAAC,CAAC,qDAAqD,QAAQ,EAAE;YACjE,CAAC,CAAC,4EAA4E;KACjF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,CAAwB;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC,OAAO;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kEAAkE,CACnE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sEAAsE,CACvE,CAAC;IACJ,CAAC;AACH,CAAC"}
|