@owlmeans/consent 0.1.18-rc.9 → 0.1.18
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/README.md +229 -0
- package/build/consts.d.ts +78 -3
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +104 -0
- package/build/consts.js.map +1 -1
- package/build/consts.local.d.ts +12 -0
- package/build/consts.local.d.ts.map +1 -0
- package/build/consts.local.js +12 -0
- package/build/consts.local.js.map +1 -0
- package/build/geo/types.d.ts +47 -0
- package/build/geo/types.d.ts.map +1 -0
- package/build/geo/types.js +2 -0
- package/build/geo/types.js.map +1 -0
- package/build/geo.d.ts +4 -0
- package/build/geo.d.ts.map +1 -0
- package/build/geo.js +96 -0
- package/build/geo.js.map +1 -0
- package/build/gtobserver/types.d.ts +75 -0
- package/build/gtobserver/types.d.ts.map +1 -0
- package/build/gtobserver/types.js +2 -0
- package/build/gtobserver/types.js.map +1 -0
- package/build/gtobserver.d.ts +7 -0
- package/build/gtobserver.d.ts.map +1 -0
- package/build/gtobserver.js +142 -0
- package/build/gtobserver.js.map +1 -0
- package/build/i18n/be.json +8 -1
- package/build/i18n/de.json +8 -1
- package/build/i18n/en.json +8 -1
- package/build/i18n/es.json +8 -1
- package/build/i18n/fr.json +8 -1
- package/build/i18n/pl.json +8 -1
- package/build/i18n/ru.json +8 -1
- package/build/i18n/types.d.ts +11 -0
- package/build/i18n/types.d.ts.map +1 -0
- package/build/i18n/types.js +2 -0
- package/build/i18n/types.js.map +1 -0
- package/build/i18n/uk.json +8 -1
- package/build/i18n.d.ts +4 -14
- package/build/i18n.d.ts.map +1 -1
- package/build/i18n.js +12 -27
- package/build/i18n.js.map +1 -1
- package/build/index.d.ts +13 -5
- package/build/index.d.ts.map +1 -1
- package/build/index.js +5 -3
- package/build/index.js.map +1 -1
- package/build/linker/types.d.ts +59 -0
- package/build/linker/types.d.ts.map +1 -0
- package/build/linker/types.js +2 -0
- package/build/linker/types.js.map +1 -0
- package/build/linker.d.ts +5 -74
- package/build/linker.d.ts.map +1 -1
- package/build/linker.js +290 -324
- package/build/linker.js.map +1 -1
- package/build/plugins/types.d.ts +42 -0
- package/build/plugins/types.d.ts.map +1 -0
- package/build/plugins/types.js +2 -0
- package/build/plugins/types.js.map +1 -0
- package/build/plugins.d.ts +4 -68
- package/build/plugins.d.ts.map +1 -1
- package/build/plugins.js +73 -61
- package/build/plugins.js.map +1 -1
- package/build/storage/types.d.ts +31 -0
- package/build/storage/types.d.ts.map +1 -0
- package/build/storage/types.js +2 -0
- package/build/storage/types.js.map +1 -0
- package/build/storage.d.ts +6 -22
- package/build/storage.d.ts.map +1 -1
- package/build/storage.js +72 -81
- package/build/storage.js.map +1 -1
- package/build/store.d.ts +2 -2
- package/build/store.d.ts.map +1 -1
- package/build/store.js +115 -31
- package/build/store.js.map +1 -1
- package/build/types.d.ts +141 -5
- package/build/types.d.ts.map +1 -1
- package/build/types.local.d.ts +9 -0
- package/build/types.local.d.ts.map +1 -0
- package/build/types.local.js +2 -0
- package/build/types.local.js.map +1 -0
- package/package.json +3 -3
- package/src/consts.local.ts +16 -0
- package/src/consts.ts +120 -3
- package/src/geo/types.ts +49 -0
- package/src/geo.ts +122 -0
- package/src/gtobserver/types.ts +73 -0
- package/src/gtobserver.ts +182 -0
- package/src/i18n/be.json +8 -1
- package/src/i18n/de.json +8 -1
- package/src/i18n/en.json +8 -1
- package/src/i18n/es.json +8 -1
- package/src/i18n/fr.json +8 -1
- package/src/i18n/pl.json +8 -1
- package/src/i18n/ru.json +8 -1
- package/src/i18n/types.ts +11 -0
- package/src/i18n/uk.json +8 -1
- package/src/i18n.ts +20 -32
- package/src/index.ts +13 -12
- package/src/linker/types.ts +59 -0
- package/src/linker.ts +301 -349
- package/src/plugins/types.ts +42 -0
- package/src/plugins.ts +82 -105
- package/src/storage/types.ts +31 -0
- package/src/storage.ts +75 -77
- package/src/store.ts +125 -31
- package/src/types.local.ts +9 -0
- package/src/types.ts +148 -5
- package/tests/consent.spec.ts +26 -28
- package/tests/geo.spec.ts +474 -0
- package/tests/linker.spec.ts +68 -74
- package/tests/tracking.spec.ts +14 -14
- package/build/gtm.d.ts +0 -72
- package/build/gtm.d.ts.map +0 -1
- package/build/gtm.js +0 -182
- package/build/gtm.js.map +0 -1
- package/src/gtm.ts +0 -220
package/build/index.d.ts
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
export type * from './types.js';
|
|
2
|
+
export type * from './gtobserver/types.js';
|
|
3
|
+
export type * from './i18n/types.js';
|
|
4
|
+
export type * from './linker/types.js';
|
|
5
|
+
export type * from './plugins/types.js';
|
|
6
|
+
export type * from './storage/types.js';
|
|
7
|
+
export type * from './geo/types.js';
|
|
2
8
|
export * from './consts.js';
|
|
3
9
|
export * from './storage.js';
|
|
4
|
-
export * from './
|
|
10
|
+
export * from './gtobserver.js';
|
|
5
11
|
export * from './store.js';
|
|
6
12
|
export * from './i18n.js';
|
|
7
|
-
export
|
|
8
|
-
export {
|
|
9
|
-
export
|
|
10
|
-
export {
|
|
13
|
+
export * from './geo.js';
|
|
14
|
+
export type { ConsentPlugin } from './types.js';
|
|
15
|
+
export { createConsentPluginHelper, consentPluginHelper, decorateConsentUrl } from './plugins.js';
|
|
16
|
+
export type { ConsentLinkPayload } from './types.js';
|
|
17
|
+
export { createConsentLinkHelper, consentLinkHelper, encodeConsentLink, consentLinkerScript } from './linker.js';
|
|
18
|
+
export { CONSENT_LINK_PARAM, CONSENT_LINK_MAX_AGE, CONSENT_LINK_SKEW } from './consts.js';
|
|
11
19
|
//# sourceMappingURL=index.d.ts.map
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAA;AAC/B,mBAAmB,uBAAuB,CAAA;AAC1C,mBAAmB,iBAAiB,CAAA;AACpC,mBAAmB,mBAAmB,CAAA;AACtC,mBAAmB,oBAAoB,CAAA;AACvC,mBAAmB,oBAAoB,CAAA;AACvC,mBAAmB,gBAAgB,CAAA;AACnC,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjG,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAChH,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA"}
|
package/build/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export * from './consts.js';
|
|
2
2
|
export * from './storage.js';
|
|
3
|
-
export * from './
|
|
3
|
+
export * from './gtobserver.js';
|
|
4
4
|
export * from './store.js';
|
|
5
5
|
export * from './i18n.js';
|
|
6
|
-
export
|
|
7
|
-
export {
|
|
6
|
+
export * from './geo.js';
|
|
7
|
+
export { createConsentPluginHelper, consentPluginHelper, decorateConsentUrl } from './plugins.js';
|
|
8
|
+
export { createConsentLinkHelper, consentLinkHelper, encodeConsentLink, consentLinkerScript } from './linker.js';
|
|
9
|
+
export { CONSENT_LINK_PARAM, CONSENT_LINK_MAX_AGE, CONSENT_LINK_SKEW } from './consts.js';
|
|
8
10
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AAExB,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjG,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAChH,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { ConsentLinkPayload, ConsentOptions, ConsentPlugin, ConsentRecord } from '../types.js';
|
|
2
|
+
/** Cross-domain consent: the decorated-link parameter, the linker plugin and its inline twin. */
|
|
3
|
+
export interface ConsentLinkHelper {
|
|
4
|
+
/**
|
|
5
|
+
* The link parameter's value: the current document's decision as `c` (one `0`/`1` per optional
|
|
6
|
+
* category — empty while `record` is `null`, i.e. before the visitor has decided, and for an
|
|
7
|
+
* automatic decision, which is not the visitor's to carry) and, when
|
|
8
|
+
* `opts.linker.language` is set, the page's language as `l`.
|
|
9
|
+
*/
|
|
10
|
+
encodeConsentLink: (record: ConsentRecord | null, opts?: ConsentOptions) => string;
|
|
11
|
+
/** Parse-only — no trust decision here, that is `consentLinker(opts).adopt`'s job. Never throws. */
|
|
12
|
+
decodeConsentLink: (value: string) => ConsentLinkPayload | null;
|
|
13
|
+
/**
|
|
14
|
+
* Persist an adopted language where the application's i18n layer reads its explicit choice from —
|
|
15
|
+
* `linker.language.storageKey`, `owlmeans-lng` by default. Unconditional: the interface language is
|
|
16
|
+
* strictly necessary storage (the visitor picked it, and the site cannot speak to them without it),
|
|
17
|
+
* so no cookie decision — none yet, a refusal, an old record — stands between it and the device.
|
|
18
|
+
*
|
|
19
|
+
* It overwrites what is there on purpose: the carried language is the one the visitor was reading a
|
|
20
|
+
* moment ago, which outranks a choice they made on this domain some other day. Storage that refuses
|
|
21
|
+
* the write is not an error. Returns whether the language was written.
|
|
22
|
+
*/
|
|
23
|
+
writeConsentLanguage: (language: string, opts?: ConsentOptions) => boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Cross-domain consent: share this decision, and adopt one, between the domains named in
|
|
26
|
+
* `opts.linker.domains`.
|
|
27
|
+
*
|
|
28
|
+
* `start` decorates outgoing first-party links; `adopt` reads and validates an incoming one;
|
|
29
|
+
* `domains` discloses the list a dialog or policy page names. `decorate` is generic (a bare `URL`,
|
|
30
|
+
* no DOM) so the same trust rule serves a real anchor click and a programmatic navigation
|
|
31
|
+
* (`decorateConsentUrl`) alike — the `rel="noreferrer"` exemption is a DOM-only concept and is
|
|
32
|
+
* therefore checked by `start`'s click handler, never here.
|
|
33
|
+
*/
|
|
34
|
+
consentLinker: () => ConsentPlugin;
|
|
35
|
+
/**
|
|
36
|
+
* Remove the link parameter from the visible URL, keeping every other parameter and the hash — the
|
|
37
|
+
* real-TS equivalent of what {@link consentLinkerScript}'s embedded fragment already did inline.
|
|
38
|
+
* Idempotent: a page with no head script calls this from `consentStore.init` and it strips once; a
|
|
39
|
+
* page that ALSO carried the head script finds the parameter already gone and does nothing.
|
|
40
|
+
*/
|
|
41
|
+
stripConsentLinkParam: (opts: ConsentOptions) => void;
|
|
42
|
+
/**
|
|
43
|
+
* The inline `<head>` fragment that adopts a decorated link's decision and strips the parameter —
|
|
44
|
+
* standalone, so a page can stamp it even where nothing else here runs (a legal page with no tag
|
|
45
|
+
* script). `@owlmeans/web-gtm`'s `consentBootstrapScript` embeds this SAME fragment right after
|
|
46
|
+
* pushing Consent Mode's defaults, so a page that has both never runs it twice with different
|
|
47
|
+
* effect — the second attempt finds the parameter already gone and does nothing.
|
|
48
|
+
*
|
|
49
|
+
* Mirrors `consentLinker().adopt` exactly (v2, referrer + freshness/skew + full optional coverage +
|
|
50
|
+
* no existing record — or only an automatic one, which the visitor's own choice replaces), but as hand-rolled JS text rather than a call into this module — the same
|
|
51
|
+
* discipline `consentBootstrapScript`/`consentGateScript` already follow, because this has to run
|
|
52
|
+
* before any bundle (this module included) has loaded. The parameter is ALWAYS stripped via
|
|
53
|
+
* `history.replaceState`, whether or not the trust rule accepts it: a stale or foreign `owlcc` is
|
|
54
|
+
* exactly as much noise as an adopted one, and neither belongs in the visible URL or in what a page
|
|
55
|
+
* reload, a shared link or a browser history entry carries forward.
|
|
56
|
+
*/
|
|
57
|
+
consentLinkerScript: (opts: ConsentOptions) => string;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/linker/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEnG,iGAAiG;AACjG,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,iBAAiB,EAAE,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,MAAM,CAAA;IAClF,oGAAoG;IACpG,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,kBAAkB,GAAG,IAAI,CAAA;IAC/D;;;;;;;;;OASG;IACH,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,OAAO,CAAA;IAC1E;;;;;;;;;OASG;IACH,aAAa,EAAE,MAAM,aAAa,CAAA;IAClC;;;;;OAKG;IACH,qBAAqB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAA;IACrD;;;;;;;;;;;;;;OAcG;IACH,mBAAmB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,MAAM,CAAA;CACtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/linker/types.ts"],"names":[],"mappings":""}
|
package/build/linker.d.ts
CHANGED
|
@@ -1,78 +1,9 @@
|
|
|
1
|
-
import type { ConsentPlugin } from './plugins.js';
|
|
2
1
|
import type { ConsentOptions, ConsentRecord } from './types.js';
|
|
3
|
-
|
|
4
|
-
export declare const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
/** Clock skew allowed the OTHER way — a timestamp up to this far in the future is still trusted. */
|
|
8
|
-
export declare const CONSENT_LINK_SKEW = 60;
|
|
9
|
-
declare const CONSENT_LINK_VERSION = 2;
|
|
10
|
-
/** The decoded, not-yet-validated payload a decorated link's parameter carries. */
|
|
11
|
-
export interface ConsentLinkPayload {
|
|
12
|
-
v: typeof CONSENT_LINK_VERSION;
|
|
13
|
-
/** One entry per OPTIONAL category this site knows, `1` granted / `0` denied. */
|
|
14
|
-
c: Record<string, 0 | 1>;
|
|
15
|
-
/** Unix seconds the link was decorated at. */
|
|
16
|
-
t: number;
|
|
17
|
-
/**
|
|
18
|
-
* The interface language of the page the link was on (a BCP 47 tag, lower-cased) — present only
|
|
19
|
-
* when the sender has `linker.language` set and its `<html lang>` names one. Optional on the
|
|
20
|
-
* wire, so a receiver that predates it reads the same `v: 2` payload and ignores the field.
|
|
21
|
-
*/
|
|
22
|
-
l?: string;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* The link parameter's value: the current document's decision as `c` (one `0`/`1` per optional
|
|
26
|
-
* category — empty while `record` is `null`, i.e. before the visitor has decided) and, when
|
|
27
|
-
* `opts.linker.language` is set, the page's language as `l`.
|
|
28
|
-
*/
|
|
2
|
+
import type { ConsentLinkHelper } from './linker/types.js';
|
|
3
|
+
export declare const createConsentLinkHelper: () => ConsentLinkHelper;
|
|
4
|
+
export declare const consentLinkHelper: ConsentLinkHelper;
|
|
5
|
+
/** @deprecated compat:factory-refactor — use `consentLinkHelper.encodeConsentLink(…)` */
|
|
29
6
|
export declare const encodeConsentLink: (record: ConsentRecord | null, opts?: ConsentOptions) => string;
|
|
30
|
-
/**
|
|
31
|
-
export declare const decodeConsentLink: (value: string) => ConsentLinkPayload | null;
|
|
32
|
-
/**
|
|
33
|
-
* Persist an adopted language where the application's i18n layer reads its explicit choice from —
|
|
34
|
-
* `linker.language.storageKey`, `owlmeans-lng` by default. Unconditional: the interface language is
|
|
35
|
-
* strictly necessary storage (the visitor picked it, and the site cannot speak to them without it),
|
|
36
|
-
* so no cookie decision — none yet, a refusal, an old record — stands between it and the device.
|
|
37
|
-
*
|
|
38
|
-
* It overwrites what is there on purpose: the carried language is the one the visitor was reading a
|
|
39
|
-
* moment ago, which outranks a choice they made on this domain some other day. Storage that refuses
|
|
40
|
-
* the write is not an error. Returns whether the language was written.
|
|
41
|
-
*/
|
|
42
|
-
export declare const writeConsentLanguage: (language: string, opts?: ConsentOptions) => boolean;
|
|
43
|
-
/**
|
|
44
|
-
* Cross-domain consent: share this decision, and adopt one, between the domains named in
|
|
45
|
-
* `opts.linker.domains`.
|
|
46
|
-
*
|
|
47
|
-
* `start` decorates outgoing first-party links; `adopt` reads and validates an incoming one;
|
|
48
|
-
* `domains` discloses the list a dialog or policy page names. `decorate` is generic (a bare `URL`,
|
|
49
|
-
* no DOM) so the same trust rule serves a real anchor click and a programmatic navigation
|
|
50
|
-
* (`decorateConsentUrl`) alike — the `rel="noreferrer"` exemption is a DOM-only concept and is
|
|
51
|
-
* therefore checked by `start`'s click handler, never here.
|
|
52
|
-
*/
|
|
53
|
-
export declare const consentLinker: () => ConsentPlugin;
|
|
54
|
-
/**
|
|
55
|
-
* Remove the link parameter from the visible URL, keeping every other parameter and the hash — the
|
|
56
|
-
* real-TS equivalent of what {@link consentLinkerScript}'s embedded fragment already did inline.
|
|
57
|
-
* Idempotent: a page with no head script calls this from `consentStore.init` and it strips once; a
|
|
58
|
-
* page that ALSO carried the head script finds the parameter already gone and does nothing.
|
|
59
|
-
*/
|
|
60
|
-
export declare const stripConsentLinkParam: (opts: ConsentOptions) => void;
|
|
61
|
-
/**
|
|
62
|
-
* The inline `<head>` fragment that adopts a decorated link's decision and strips the parameter —
|
|
63
|
-
* standalone, so a page can stamp it even where nothing else here runs (a legal page with no tag
|
|
64
|
-
* script). `@owlmeans/web-gtm`'s `consentBootstrapScript` embeds this SAME fragment right after
|
|
65
|
-
* pushing Consent Mode's defaults, so a page that has both never runs it twice with different
|
|
66
|
-
* effect — the second attempt finds the parameter already gone and does nothing.
|
|
67
|
-
*
|
|
68
|
-
* Mirrors `consentLinker().adopt` exactly (v2, referrer + freshness/skew + full optional coverage +
|
|
69
|
-
* no existing record), but as hand-rolled JS text rather than a call into this module — the same
|
|
70
|
-
* discipline `consentBootstrapScript`/`consentGateScript` already follow, because this has to run
|
|
71
|
-
* before any bundle (this module included) has loaded. The parameter is ALWAYS stripped via
|
|
72
|
-
* `history.replaceState`, whether or not the trust rule accepts it: a stale or foreign `owlcc` is
|
|
73
|
-
* exactly as much noise as an adopted one, and neither belongs in the visible URL or in what a page
|
|
74
|
-
* reload, a shared link or a browser history entry carries forward.
|
|
75
|
-
*/
|
|
7
|
+
/** @deprecated compat:factory-refactor — use `consentLinkHelper.consentLinkerScript(…)` */
|
|
76
8
|
export declare const consentLinkerScript: (opts: ConsentOptions) => string;
|
|
77
|
-
export {};
|
|
78
9
|
//# sourceMappingURL=linker.d.ts.map
|
package/build/linker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linker.d.ts","sourceRoot":"","sources":["../src/linker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"linker.d.ts","sourceRoot":"","sources":["../src/linker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkC,cAAc,EAAE,aAAa,EAAsB,MAAM,YAAY,CAAA;AAInH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE1D,eAAO,MAAM,uBAAuB,QAAO,iBA6U1C,CAAA;AAED,eAAO,MAAM,iBAAiB,mBAA4B,CAAA;AAE1D,yFAAyF;AACzF,eAAO,MAAM,iBAAiB,WAAY,aAAa,GAAG,IAAI,SAAS,cAAc,KAAG,MACrC,CAAA;AAEnD,2FAA2F;AAC3F,eAAO,MAAM,mBAAmB,SAAU,cAAc,KAAG,MAAqD,CAAA"}
|