@bgord/bun 0.18.26 → 0.19.1
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/dist/captcha-shield-hcaptcha-local.adapter.d.ts +1 -1
- package/dist/captcha-shield-hcaptcha-local.adapter.d.ts.map +1 -1
- package/dist/captcha-shield-hcaptcha-local.adapter.js +1 -1
- package/dist/captcha-shield-hcaptcha-local.adapter.js.map +1 -1
- package/dist/captcha-shield-hcaptcha.adapter.d.ts +1 -1
- package/dist/captcha-shield-hcaptcha.adapter.d.ts.map +1 -1
- package/dist/captcha-shield-hcaptcha.adapter.js +1 -1
- package/dist/captcha-shield-hcaptcha.adapter.js.map +1 -1
- package/dist/captcha-shield-noop.adapter.d.ts +1 -1
- package/dist/captcha-shield-noop.adapter.d.ts.map +1 -1
- package/dist/captcha-shield-noop.adapter.js +1 -1
- package/dist/captcha-shield-noop.adapter.js.map +1 -1
- package/dist/{recaptcha-shield.middleware.d.ts → captcha-shield-recaptcha.adapter.d.ts} +4 -3
- package/dist/captcha-shield-recaptcha.adapter.d.ts.map +1 -0
- package/dist/{recaptcha-shield.middleware.js → captcha-shield-recaptcha.adapter.js} +3 -3
- package/dist/captcha-shield-recaptcha.adapter.js.map +1 -0
- package/dist/captcha-shield.port.d.ts +1 -1
- package/dist/captcha-shield.port.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/visitor-id-hash-hono.adapter.d.ts +10 -0
- package/dist/visitor-id-hash-hono.adapter.d.ts.map +1 -0
- package/dist/visitor-id-hash-hono.adapter.js +21 -0
- package/dist/visitor-id-hash-hono.adapter.js.map +1 -0
- package/dist/visitor-id-hash.adapter.d.ts +8 -0
- package/dist/visitor-id-hash.adapter.d.ts.map +1 -0
- package/dist/visitor-id-hash.adapter.js +17 -0
- package/dist/visitor-id-hash.adapter.js.map +1 -0
- package/dist/visitor-id.port.d.ts +5 -0
- package/dist/visitor-id.port.d.ts.map +1 -0
- package/dist/visitor-id.port.js +2 -0
- package/dist/visitor-id.port.js.map +1 -0
- package/package.json +1 -1
- package/readme.md +4 -1
- package/src/captcha-shield-hcaptcha-local.adapter.ts +1 -1
- package/src/captcha-shield-hcaptcha.adapter.ts +1 -1
- package/src/captcha-shield-noop.adapter.ts +1 -1
- package/src/{recaptcha-shield.middleware.ts → captcha-shield-recaptcha.adapter.ts} +3 -2
- package/src/captcha-shield.port.ts +1 -1
- package/src/index.ts +4 -1
- package/src/visitor-id-hash-hono.adapter.ts +29 -0
- package/src/visitor-id-hash.adapter.ts +18 -0
- package/src/visitor-id.port.ts +5 -0
- package/dist/recaptcha-shield.middleware.d.ts.map +0 -1
- package/dist/recaptcha-shield.middleware.js.map +0 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Context } from "hono";
|
|
2
|
+
import type { VisitorIdPort } from "./visitor-id.port";
|
|
3
|
+
export declare class VisitorIdHashHono implements VisitorIdPort {
|
|
4
|
+
private readonly delegate;
|
|
5
|
+
constructor(context: Context);
|
|
6
|
+
get(): Promise<string>;
|
|
7
|
+
private extractIpFrom;
|
|
8
|
+
private extractUaFrom;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=visitor-id-hash-hono.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visitor-id-hash-hono.adapter.d.ts","sourceRoot":"","sources":["../src/visitor-id-hash-hono.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,qBAAa,iBAAkB,YAAW,aAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;gBAE7B,OAAO,EAAE,OAAO;IAOtB,GAAG;IAIT,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,aAAa;CAGtB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { getConnInfo } from "hono/bun";
|
|
2
|
+
import { VisitorIdHash } from "./visitor-id-hash.adapter";
|
|
3
|
+
export class VisitorIdHashHono {
|
|
4
|
+
delegate;
|
|
5
|
+
constructor(context) {
|
|
6
|
+
const ip = this.extractIpFrom(context);
|
|
7
|
+
const ua = this.extractUaFrom(context);
|
|
8
|
+
this.delegate = new VisitorIdHash(ip, ua);
|
|
9
|
+
}
|
|
10
|
+
async get() {
|
|
11
|
+
return this.delegate.get();
|
|
12
|
+
}
|
|
13
|
+
extractIpFrom(c) {
|
|
14
|
+
const info = getConnInfo(c);
|
|
15
|
+
return (c.req.header("x-real-ip") || c.req.header("x-forwarded-for") || info.remote.address) ?? "anon";
|
|
16
|
+
}
|
|
17
|
+
extractUaFrom(c) {
|
|
18
|
+
return c.req.header("user-agent") ?? "anon";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=visitor-id-hash-hono.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visitor-id-hash-hono.adapter.js","sourceRoot":"","sources":["../src/visitor-id-hash-hono.adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,OAAO,iBAAiB;IACX,QAAQ,CAAgB;IAEzC,YAAY,OAAgB;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAEvC,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,GAAG;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC7B,CAAC;IAEO,aAAa,CAAC,CAAU;QAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAE5B,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC;IACzG,CAAC;IAEO,aAAa,CAAC,CAAU;QAC9B,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC;IAC9C,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { VisitorIdPort } from "./visitor-id.port";
|
|
2
|
+
export declare class VisitorIdHash implements VisitorIdPort {
|
|
3
|
+
private readonly ip;
|
|
4
|
+
private readonly ua;
|
|
5
|
+
constructor(ip: string, ua: string);
|
|
6
|
+
get(): Promise<string>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=visitor-id-hash.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visitor-id-hash.adapter.d.ts","sourceRoot":"","sources":["../src/visitor-id-hash.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,qBAAa,aAAc,YAAW,aAAa;IAE/C,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBADF,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM;IAGvB,GAAG;CASV"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class VisitorIdHash {
|
|
2
|
+
ip;
|
|
3
|
+
ua;
|
|
4
|
+
constructor(ip, ua) {
|
|
5
|
+
this.ip = ip;
|
|
6
|
+
this.ua = ua;
|
|
7
|
+
}
|
|
8
|
+
async get() {
|
|
9
|
+
const prepared = `${this.ip}|${this.ua}`;
|
|
10
|
+
const buffer = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(prepared));
|
|
11
|
+
return Array.from(new Uint8Array(buffer))
|
|
12
|
+
.slice(0, 8)
|
|
13
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
14
|
+
.join("");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=visitor-id-hash.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visitor-id-hash.adapter.js","sourceRoot":"","sources":["../src/visitor-id-hash.adapter.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IAEL;IACA;IAFnB,YACmB,EAAU,EACV,EAAU;QADV,OAAE,GAAF,EAAE,CAAQ;QACV,OAAE,GAAF,EAAE,CAAQ;IAC1B,CAAC;IAEJ,KAAK,CAAC,GAAG;QACP,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEzF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;aACtC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visitor-id.port.d.ts","sourceRoot":"","sources":["../src/visitor-id.port.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC;AAEnC,MAAM,WAAW,aAAa;IAC5B,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visitor-id.port.js","sourceRoot":"","sources":["../src/visitor-id.port.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -37,6 +37,7 @@ src/
|
|
|
37
37
|
├── captcha-shield-hcaptcha-local.adapter.ts
|
|
38
38
|
├── captcha-shield-hcaptcha.adapter.ts
|
|
39
39
|
├── captcha-shield-noop.adapter.ts
|
|
40
|
+
├── captcha-shield-recaptcha.adapter.ts
|
|
40
41
|
├── captcha-shield.port.ts
|
|
41
42
|
├── command-logger.service.ts
|
|
42
43
|
├── command.types.ts
|
|
@@ -118,7 +119,6 @@ src/
|
|
|
118
119
|
├── prerequisites.service.ts
|
|
119
120
|
├── rate-limit-shield.middleware.ts
|
|
120
121
|
├── rate-limit-store.port.ts
|
|
121
|
-
├── recaptcha-shield.middleware.ts
|
|
122
122
|
├── safe-parse-body.service.ts
|
|
123
123
|
├── setup.service.ts
|
|
124
124
|
├── simulated-error.middleware.ts
|
|
@@ -130,6 +130,9 @@ src/
|
|
|
130
130
|
├── uptime.service.ts
|
|
131
131
|
├── url-wo-trailing-slash.vo.ts
|
|
132
132
|
├── uuid.vo.ts
|
|
133
|
+
├── visitor-id-hash-hono.adapter.ts
|
|
134
|
+
├── visitor-id-hash.adapter.ts
|
|
135
|
+
├── visitor-id.port.ts
|
|
133
136
|
├── weak-etag-extractor.middleware.ts
|
|
134
137
|
└── zip-draft.service.ts
|
|
135
138
|
```
|
|
@@ -11,7 +11,7 @@ export const AccessDeniedHcaptchaLocalError = new HTTPException(403, {
|
|
|
11
11
|
export class CaptchaShieldHcaptchaLocal implements CaptchaShieldPort {
|
|
12
12
|
constructor(private readonly secretKey: HCaptchaSecretKeyType) {}
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
verify = createMiddleware(async (_c, next) => {
|
|
15
15
|
try {
|
|
16
16
|
const result = await hcaptcha.verify(this.secretKey, "10000000-aaaa-bbbb-cccc-000000000001");
|
|
17
17
|
|
|
@@ -21,7 +21,7 @@ export const AccessDeniedHcaptchaError = new HTTPException(403, {
|
|
|
21
21
|
export class CaptchaShieldHcaptcha implements CaptchaShieldPort {
|
|
22
22
|
constructor(private readonly secretKey: HCaptchaSecretKeyType) {}
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
verify = createMiddleware(async (c, next) => {
|
|
25
25
|
try {
|
|
26
26
|
const form = await c.req.formData();
|
|
27
27
|
|
|
@@ -2,5 +2,5 @@ import { createMiddleware } from "hono/factory";
|
|
|
2
2
|
import type { CaptchaShieldPort } from "./captcha-shield.port";
|
|
3
3
|
|
|
4
4
|
export class CaptchaShieldNoop implements CaptchaShieldPort {
|
|
5
|
-
|
|
5
|
+
verify = createMiddleware(async (_c, next) => next());
|
|
6
6
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createMiddleware } from "hono/factory";
|
|
2
2
|
import { HTTPException } from "hono/http-exception";
|
|
3
3
|
import { z } from "zod/v4";
|
|
4
|
+
import type { CaptchaShieldPort } from "./captcha-shield.port";
|
|
4
5
|
|
|
5
6
|
export const RecaptchaSiteKey = z.string().trim().length(40);
|
|
6
7
|
|
|
@@ -23,14 +24,14 @@ export const AccessDeniedRecaptchaError = new HTTPException(403, {
|
|
|
23
24
|
message: "access_denied_recaptcha",
|
|
24
25
|
});
|
|
25
26
|
|
|
26
|
-
export class
|
|
27
|
+
export class CaptchaShieldRecaptcha implements CaptchaShieldPort {
|
|
27
28
|
private readonly secretKey: RecaptchaVerifierConfigType["secretKey"];
|
|
28
29
|
|
|
29
30
|
constructor(config: RecaptchaVerifierConfigType) {
|
|
30
31
|
this.secretKey = config.secretKey;
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
verify = createMiddleware(async (c, next) => {
|
|
34
35
|
try {
|
|
35
36
|
const recaptchaTokenHeader = c.req.header("x-recaptcha-token");
|
|
36
37
|
const recaptchaTokenQuery = c.req.query("recaptchaToken");
|
package/src/index.ts
CHANGED
|
@@ -12,6 +12,7 @@ export * from "./captcha-shield.port";
|
|
|
12
12
|
export * from "./captcha-shield-hcaptcha.adapter";
|
|
13
13
|
export * from "./captcha-shield-hcaptcha-local.adapter";
|
|
14
14
|
export * from "./captcha-shield-noop.adapter";
|
|
15
|
+
export * from "./captcha-shield-recaptcha.adapter";
|
|
15
16
|
export * from "./command.types";
|
|
16
17
|
export * from "./command-logger.service";
|
|
17
18
|
export * from "./context.middleware";
|
|
@@ -55,7 +56,6 @@ export * from "./port.vo";
|
|
|
55
56
|
export * from "./prerequisites/index";
|
|
56
57
|
export * from "./prerequisites.service";
|
|
57
58
|
export * from "./rate-limit-shield.middleware";
|
|
58
|
-
export * from "./recaptcha-shield.middleware";
|
|
59
59
|
export * from "./safe-parse-body.service";
|
|
60
60
|
export * from "./setup.service";
|
|
61
61
|
export * from "./simulated-error.middleware";
|
|
@@ -67,5 +67,8 @@ export * from "./translations.service";
|
|
|
67
67
|
export * from "./uptime.service";
|
|
68
68
|
export * from "./url-wo-trailing-slash.vo";
|
|
69
69
|
export * from "./uuid.vo";
|
|
70
|
+
export * from "./visitor-id.port";
|
|
71
|
+
export * from "./visitor-id-hash.adapter";
|
|
72
|
+
export * from "./visitor-id-hash-hono.adapter";
|
|
70
73
|
export * from "./weak-etag-extractor.middleware";
|
|
71
74
|
export * from "./zip-draft.service";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Context } from "hono";
|
|
2
|
+
import { getConnInfo } from "hono/bun";
|
|
3
|
+
import type { VisitorIdPort } from "./visitor-id.port";
|
|
4
|
+
import { VisitorIdHash } from "./visitor-id-hash.adapter";
|
|
5
|
+
|
|
6
|
+
export class VisitorIdHashHono implements VisitorIdPort {
|
|
7
|
+
private readonly delegate: VisitorIdHash;
|
|
8
|
+
|
|
9
|
+
constructor(context: Context) {
|
|
10
|
+
const ip = this.extractIpFrom(context);
|
|
11
|
+
const ua = this.extractUaFrom(context);
|
|
12
|
+
|
|
13
|
+
this.delegate = new VisitorIdHash(ip, ua);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async get() {
|
|
17
|
+
return this.delegate.get();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
private extractIpFrom(c: Context): string {
|
|
21
|
+
const info = getConnInfo(c);
|
|
22
|
+
|
|
23
|
+
return (c.req.header("x-real-ip") || c.req.header("x-forwarded-for") || info.remote.address) ?? "anon";
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
private extractUaFrom(c: Context): string {
|
|
27
|
+
return c.req.header("user-agent") ?? "anon";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { VisitorIdPort } from "./visitor-id.port";
|
|
2
|
+
|
|
3
|
+
export class VisitorIdHash implements VisitorIdPort {
|
|
4
|
+
constructor(
|
|
5
|
+
private readonly ip: string,
|
|
6
|
+
private readonly ua: string,
|
|
7
|
+
) {}
|
|
8
|
+
|
|
9
|
+
async get() {
|
|
10
|
+
const prepared = `${this.ip}|${this.ua}`;
|
|
11
|
+
const buffer = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(prepared));
|
|
12
|
+
|
|
13
|
+
return Array.from(new Uint8Array(buffer))
|
|
14
|
+
.slice(0, 8)
|
|
15
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
16
|
+
.join("");
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recaptcha-shield.middleware.d.ts","sourceRoot":"","sources":["../src/recaptcha-shield.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,eAAO,MAAM,gBAAgB,aAA+B,CAAC;AAE7D,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEpE,eAAO,MAAM,kBAAkB,uDAA2D,CAAC;AAE3F,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAExE,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,EAAE,sBAAsB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,0BAA0B,eAErC,CAAC;AAEH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;gBAEzD,MAAM,EAAE,2BAA2B;IAI/C,KAAK,oDA0CF;CACJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recaptcha-shield.middleware.js","sourceRoot":"","sources":["../src/recaptcha-shield.middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAI7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAa3F,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE;IAC/D,OAAO,EAAE,yBAAyB;CACnC,CAAC,CAAC;AAEH,MAAM,OAAO,eAAe;IACT,SAAS,CAA2C;IAErE,YAAY,MAAmC;QAC7C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,KAAK,GAAG,gBAAgB,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC/D,MAAM,mBAAmB,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAE1D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,sBAAsB,GAAG,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,QAAQ,EAAE,CAAC;YAE5E,MAAM,mBAAmB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC5D,yBAAyB;YACzB,MAAM,QAAQ,GAAG,mBAAmB,IAAI,EAAE,CAAC;YAE3C,MAAM,KAAK,GAAG,oBAAoB,IAAI,mBAAmB,IAAI,sBAAsB,CAAC;YAEpF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,0BAA0B,CAAC;YACnC,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;gBACjC,MAAM,EAAE,IAAI,CAAC,SAAS;gBACtB,QAAQ,EAAE,KAAK;gBACf,QAAQ;aACT,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iDAAiD,EAAE;gBAC9E,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,mCAAmC;iBACpD;gBACD,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;YAE9D,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;gBAC1C,MAAM,0BAA0B,CAAC;YACnC,CAAC;YAED,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,MAAM,0BAA0B,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;CACJ"}
|