@konfeature/ap-email-guessr 0.1.4 → 0.1.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@konfeature/ap-email-guessr",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Activepieces piece that finds a person's email from their name and company domain — free Microsoft 365 account checks plus no2bounce verification, with early-stop to minimize credits.",
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
@@ -1 +1 @@
1
- {"version":3,"file":"find-email.d.ts","sourceRoot":"","sources":["../../../../src/lib/actions/find-email.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe;;;;;;;;EAqG1B,CAAC"}
1
+ {"version":3,"file":"find-email.d.ts","sourceRoot":"","sources":["../../../../src/lib/actions/find-email.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe;;;;;;;;EAmG1B,CAAC"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findEmailAction = void 0;
4
4
  const pieces_framework_1 = require("@activepieces/pieces-framework");
5
+ const auth_1 = require("../common/auth");
5
6
  const find_person_1 = require("../common/find-person");
6
7
  const no2bounce_verifier_1 = require("../common/verifiers/no2bounce-verifier");
7
8
  exports.findEmailAction = (0, pieces_framework_1.createAction)({
@@ -58,8 +59,7 @@ exports.findEmailAction = (0, pieces_framework_1.createAction)({
58
59
  const { firstName, lastName, domain, patternSet, maxChecks, useO365 } = context.propsValue;
59
60
  const timeoutSeconds = context.propsValue.timeout ?? 15;
60
61
  const timeoutMs = Math.min(Math.max(Number(timeoutSeconds) || 15, 1), 120) * 1000;
61
- const token = (context.auth ?? "").trim() ||
62
- undefined;
62
+ const token = (0, auth_1.readSecretText)(context.auth);
63
63
  const result = await (0, find_person_1.findPersonEmail)(firstName, lastName, domain, {
64
64
  patternSet: patternSet ?? "common",
65
65
  maxChecks: maxChecks != null ? Math.max(1, Number(maxChecks)) : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"find-email.js","sourceRoot":"","sources":["../../../../src/lib/actions/find-email.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"find-email.js","sourceRoot":"","sources":["../../../../src/lib/actions/find-email.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Read an Activepieces SecretText auth value into a clean token string.
3
+ *
4
+ * The engine hands `context.auth` to an action differently across context
5
+ * versions: the bare secret string (legacy V0) or the connection object
6
+ * `{ secret_text }` (V1+, current). Handle both, trim surrounding whitespace,
7
+ * and treat blank as absent so an empty connection reads as "no token".
8
+ */
9
+ export declare function readSecretText(auth: unknown): string | undefined;
10
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/lib/common/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAShE"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /**
3
+ * Read an Activepieces SecretText auth value into a clean token string.
4
+ *
5
+ * The engine hands `context.auth` to an action differently across context
6
+ * versions: the bare secret string (legacy V0) or the connection object
7
+ * `{ secret_text }` (V1+, current). Handle both, trim surrounding whitespace,
8
+ * and treat blank as absent so an empty connection reads as "no token".
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.readSecretText = readSecretText;
12
+ function hasSecretText(value) {
13
+ return (typeof value === "object" &&
14
+ value !== null &&
15
+ typeof value.secret_text === "string");
16
+ }
17
+ function readSecretText(auth) {
18
+ const raw = typeof auth === "string"
19
+ ? auth
20
+ : hasSecretText(auth)
21
+ ? auth.secret_text
22
+ : "";
23
+ const trimmed = raw.trim();
24
+ return trimmed.length > 0 ? trimmed : undefined;
25
+ }
26
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/lib/common/auth.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAcH,wCASC;AAjBD,SAAS,aAAa,CAAC,KAAc;IACjC,OAAO,CACH,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAAiC,CAAC,WAAW,KAAK,QAAQ,CACrE,CAAC;AACN,CAAC;AAED,SAAgB,cAAc,CAAC,IAAa;IACxC,MAAM,GAAG,GACL,OAAO,IAAI,KAAK,QAAQ;QACpB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,WAAW;YAClB,CAAC,CAAC,EAAE,CAAC;IACf,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC"}
@@ -1,21 +1,24 @@
1
1
  /**
2
2
  * Credit-minimizing email search (layers 1 + 2).
3
3
  *
4
- * Candidates arrive pre-ordered by likelihood and are verified top-down in
5
- * rounds of `batchSize` (1 = strictly sequential). A round is one bulk provider
6
- * call when the verifier exposes `verifyBatch` (no2bounce), otherwise concurrent
7
- * `verify` calls; either way the round is read back in candidate order, so the
8
- * verdict is identical to checking one at a time:
4
+ * Candidates arrive pre-ordered by likelihood. The single most-likely address is
5
+ * probed on its own first, then the remainder is swept in rounds of `batchSize`
6
+ * (1 = strictly sequential). A round is one bulk provider call when the verifier
7
+ * exposes `verifyBatch` (no2bounce), otherwise concurrent `verify` calls; either
8
+ * way the round is read back in candidate order, so the verdict is identical to
9
+ * checking one at a time:
9
10
  * - stop at the first `valid` hit (layer 2: early-stop), and
10
- * - stop immediately on a `catch_all` verdict, since a catch-all domain the
11
- * verifier can't score further can't disambiguate individual mailboxes —
12
- * continuing would just burn credits for no extra signal (layer 1).
11
+ * - stop as soon as a result proves the domain is accept-all (`catchAll` with a
12
+ * non-`valid` verdict), since a catch-all domain can't disambiguate individual
13
+ * mailboxes every candidate then gets the same catch-all verdict and we stop
14
+ * paying for more rounds (layer 1). The lone first probe means an accept-all
15
+ * domain is caught for one credit instead of a whole round.
13
16
  *
14
17
  * no2bounce bills per email with no refund, so a round is paid for the moment it
15
- * is submitted: `creditsUsed` counts every email in the rounds we started, even
16
- * when an early candidate in the final round is the hit. A larger `batchSize` is
17
- * thus faster (fewer submit/poll cycles) but coarser on credits. `maxChecks` is a
18
- * hard ceiling; a `valid` hit on an accept-all domain is reported with reduced
18
+ * is submitted: `creditsUsed` counts every email actually queried, even when an
19
+ * early candidate in the final round is the hit. A larger `batchSize` is thus
20
+ * faster (fewer submit/poll cycles) but coarser on credits. `maxChecks` is a hard
21
+ * ceiling; a `valid` hit on an accept-all domain is reported with reduced
19
22
  * confidence and `catchAll: true`.
20
23
  */
21
24
  import type { Verifier, VerifyOutcome, VerifyVerdict } from "./verifier";
@@ -1 +1 @@
1
- {"version":3,"file":"find-email.d.ts","sourceRoot":"","sources":["../../../../src/lib/common/find-email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC7B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC7B;AAgCD,wBAAsB,SAAS,CAC3B,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,gBAAqB,GAC/B,OAAO,CAAC,eAAe,CAAC,CAmE1B"}
1
+ {"version":3,"file":"find-email.d.ts","sourceRoot":"","sources":["../../../../src/lib/common/find-email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC7B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC7B;AAyDD,wBAAsB,SAAS,CAC3B,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,gBAAqB,GAC/B,OAAO,CAAC,eAAe,CAAC,CA4E1B"}
@@ -2,21 +2,24 @@
2
2
  /**
3
3
  * Credit-minimizing email search (layers 1 + 2).
4
4
  *
5
- * Candidates arrive pre-ordered by likelihood and are verified top-down in
6
- * rounds of `batchSize` (1 = strictly sequential). A round is one bulk provider
7
- * call when the verifier exposes `verifyBatch` (no2bounce), otherwise concurrent
8
- * `verify` calls; either way the round is read back in candidate order, so the
9
- * verdict is identical to checking one at a time:
5
+ * Candidates arrive pre-ordered by likelihood. The single most-likely address is
6
+ * probed on its own first, then the remainder is swept in rounds of `batchSize`
7
+ * (1 = strictly sequential). A round is one bulk provider call when the verifier
8
+ * exposes `verifyBatch` (no2bounce), otherwise concurrent `verify` calls; either
9
+ * way the round is read back in candidate order, so the verdict is identical to
10
+ * checking one at a time:
10
11
  * - stop at the first `valid` hit (layer 2: early-stop), and
11
- * - stop immediately on a `catch_all` verdict, since a catch-all domain the
12
- * verifier can't score further can't disambiguate individual mailboxes —
13
- * continuing would just burn credits for no extra signal (layer 1).
12
+ * - stop as soon as a result proves the domain is accept-all (`catchAll` with a
13
+ * non-`valid` verdict), since a catch-all domain can't disambiguate individual
14
+ * mailboxes every candidate then gets the same catch-all verdict and we stop
15
+ * paying for more rounds (layer 1). The lone first probe means an accept-all
16
+ * domain is caught for one credit instead of a whole round.
14
17
  *
15
18
  * no2bounce bills per email with no refund, so a round is paid for the moment it
16
- * is submitted: `creditsUsed` counts every email in the rounds we started, even
17
- * when an early candidate in the final round is the hit. A larger `batchSize` is
18
- * thus faster (fewer submit/poll cycles) but coarser on credits. `maxChecks` is a
19
- * hard ceiling; a `valid` hit on an accept-all domain is reported with reduced
19
+ * is submitted: `creditsUsed` counts every email actually queried, even when an
20
+ * early candidate in the final round is the hit. A larger `batchSize` is thus
21
+ * faster (fewer submit/poll cycles) but coarser on credits. `maxChecks` is a hard
22
+ * ceiling; a `valid` hit on an accept-all domain is reported with reduced
20
23
  * confidence and `catchAll: true`.
21
24
  */
22
25
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -41,6 +44,24 @@ function result(found, email, verdict, catchAll, attempts, creditsUsed) {
41
44
  attempts,
42
45
  };
43
46
  }
47
+ // Accept-all is a domain property, so every candidate gets the same catch-all
48
+ // verdict — but only the addresses actually queried were billed (zero-cost rows
49
+ // for the rest keep `creditsUsed` honest while `candidatesChecked` covers all).
50
+ function catchAllForAll(candidates, limit, detected, queried, creditsUsed) {
51
+ const billed = new Map(queried.map((o) => [o.email, o]));
52
+ const attempts = candidates.slice(0, limit).map((email) => {
53
+ const prior = billed.get(email);
54
+ return {
55
+ email,
56
+ verdict: "catch_all",
57
+ catchAll: true,
58
+ creditsUsed: prior?.creditsUsed ?? 0,
59
+ reason: detected.reason,
60
+ raw: prior?.raw,
61
+ };
62
+ });
63
+ return result(false, null, "catch_all", true, attempts, creditsUsed);
64
+ }
44
65
  async function findEmail(candidates, verifier, options = {}) {
45
66
  const stopOnFirstHit = options.stopOnFirstHit ?? true;
46
67
  const batchSize = Math.max(1, options.batchSize ?? 1);
@@ -48,8 +69,12 @@ async function findEmail(candidates, verifier, options = {}) {
48
69
  const attempts = [];
49
70
  let creditsUsed = 0;
50
71
  let firstValid = null;
51
- for (let start = 0; start < limit; start += batchSize) {
52
- const round = candidates.slice(start, Math.min(start + batchSize, limit));
72
+ // Probe the single most-likely candidate first (one credit), then sweep the
73
+ // rest in rounds of `batchSize`.
74
+ let start = 0;
75
+ while (start < limit) {
76
+ const end = Math.min(start + (start === 0 ? 1 : batchSize), limit);
77
+ const round = candidates.slice(start, end);
53
78
  const outcomes = verifier.verifyBatch
54
79
  ? await verifier.verifyBatch(round)
55
80
  : await Promise.all(round.map((email) => verifier.verify(email)));
@@ -60,8 +85,11 @@ async function findEmail(candidates, verifier, options = {}) {
60
85
  creditsUsed += outcome.creditsUsed;
61
86
  }
62
87
  for (const outcome of outcomes) {
63
- if (outcome.verdict === "catch_all") {
64
- return result(false, null, "catch_all", true, attempts, creditsUsed);
88
+ // Accept-all (a catch-all, or an address scored undeliverable *on* an
89
+ // accept-all domain): no single mailbox can be confirmed, so stop and
90
+ // give every candidate the same catch-all verdict.
91
+ if (outcome.catchAll === true && outcome.verdict !== "valid") {
92
+ return catchAllForAll(candidates, limit, outcome, attempts, creditsUsed);
65
93
  }
66
94
  if (outcome.verdict === "valid") {
67
95
  if (!firstValid) {
@@ -72,6 +100,7 @@ async function findEmail(candidates, verifier, options = {}) {
72
100
  }
73
101
  }
74
102
  }
103
+ start = end;
75
104
  }
76
105
  if (firstValid) {
77
106
  return result(true, firstValid.email, "valid", firstValid.catchAll ?? false, attempts, creditsUsed);
@@ -1 +1 @@
1
- {"version":3,"file":"find-email.js","sourceRoot":"","sources":["../../../../src/lib/common/find-email.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"find-email.js","sourceRoot":"","sources":["../../../../src/lib/common/find-email.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;AA+EH,8BAgFC;AAvID,MAAM,UAAU,GAAkC;IAC9C,KAAK,EAAE,GAAG;IACV,SAAS,EAAE,GAAG;IACd,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,GAAG;CACf,CAAC;AAEF,SAAS,MAAM,CACX,KAAc,EACd,KAAoB,EACpB,OAAsB,EACtB,QAAiB,EACjB,QAAyB,EACzB,WAAmB;IAEnB,2EAA2E;IAC3E,MAAM,UAAU,GACZ,OAAO,KAAK,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAChE,OAAO;QACH,KAAK;QACL,KAAK;QACL,OAAO;QACP,UAAU;QACV,QAAQ;QACR,iBAAiB,EAAE,QAAQ,CAAC,MAAM;QAClC,WAAW;QACX,QAAQ;KACX,CAAC;AACN,CAAC;AAED,8EAA8E;AAC9E,gFAAgF;AAChF,gFAAgF;AAChF,SAAS,cAAc,CACnB,UAAoB,EACpB,KAAa,EACb,QAAuB,EACvB,OAAwB,EACxB,WAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAU,CAAC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAiB,EAAE;QACrE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO;YACH,KAAK;YACL,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,KAAK,EAAE,WAAW,IAAI,CAAC;YACpC,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,GAAG,EAAE,KAAK,EAAE,GAAG;SAClB,CAAC;IACN,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AACzE,CAAC;AAEM,KAAK,UAAU,SAAS,CAC3B,UAAoB,EACpB,QAAkB,EAClB,UAA4B,EAAE;IAE9B,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAClB,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,MAAM,EACtC,UAAU,CAAC,MAAM,CACpB,CAAC;IAEF,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,UAAU,GAAyB,IAAI,CAAC;IAE5C,4EAA4E;IAC5E,iCAAiC;IACjC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW;YACjC,CAAC,CAAC,MAAM,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC;YACnC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtE,wEAAwE;QACxE,iEAAiE;QACjE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;QACvC,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,sEAAsE;YACtE,sEAAsE;YACtE,mDAAmD;YACnD,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC3D,OAAO,cAAc,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC7E,CAAC;YACD,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;oBACd,UAAU,GAAG,OAAO,CAAC;gBACzB,CAAC;gBACD,IAAI,cAAc,EAAE,CAAC;oBACjB,OAAO,MAAM,CACT,IAAI,EACJ,OAAO,CAAC,KAAK,EACb,OAAO,EACP,OAAO,CAAC,QAAQ,IAAI,KAAK,EACzB,QAAQ,EACR,WAAW,CACd,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QAED,KAAK,GAAG,GAAG,CAAC;IAChB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACb,OAAO,MAAM,CACT,IAAI,EACJ,UAAU,CAAC,KAAK,EAChB,OAAO,EACP,UAAU,CAAC,QAAQ,IAAI,KAAK,EAC5B,QAAQ,EACR,WAAW,CACd,CAAC;IACN,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;IACjE,OAAO,MAAM,CACT,KAAK,EACL,IAAI,EACJ,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAClC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,EACzC,QAAQ,EACR,WAAW,CACd,CAAC;AACN,CAAC"}