@eddyskywalker/dsh-chatgpt-subscription 0.46.0 → 0.47.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.
Files changed (91) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +22 -1
  3. package/lib/client.js +2639 -571
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +11993 -3559
  6. package/lib/plan-mode-pipeline.js +419 -0
  7. package/lib/types/client/hub/brand-icons.d.ts +1 -1
  8. package/lib/types/client/hub/brand-icons.d.ts.map +1 -1
  9. package/lib/types/client/hub/brand-svg.d.ts +4 -0
  10. package/lib/types/client/hub/brand-svg.d.ts.map +1 -1
  11. package/lib/types/client/hub/providers.d.ts.map +1 -1
  12. package/lib/types/client/index.d.ts +2 -0
  13. package/lib/types/client/index.d.ts.map +1 -1
  14. package/lib/types/client/locales-ru/index.d.ts.map +1 -1
  15. package/lib/types/client/locales-ru/progress-updates.d.ts.map +1 -1
  16. package/lib/types/client/locales-ru/workbuddy.d.ts +10 -0
  17. package/lib/types/client/locales-ru/workbuddy.d.ts.map +1 -0
  18. package/lib/types/client/progress-updates/locales.d.ts +23 -5
  19. package/lib/types/client/progress-updates/locales.d.ts.map +1 -1
  20. package/lib/types/client/progress-updates/settings-binding.d.ts +13 -1
  21. package/lib/types/client/progress-updates/settings-binding.d.ts.map +1 -1
  22. package/lib/types/client/progress-updates/settings-section.d.ts +1 -1
  23. package/lib/types/client/progress-updates/settings-section.d.ts.map +1 -1
  24. package/lib/types/client/workbuddy/WorkBuddyComposerQuota.d.ts +34 -0
  25. package/lib/types/client/workbuddy/WorkBuddyComposerQuota.d.ts.map +1 -0
  26. package/lib/types/client/workbuddy/WorkBuddySection.d.ts +91 -0
  27. package/lib/types/client/workbuddy/WorkBuddySection.d.ts.map +1 -0
  28. package/lib/types/client/workbuddy/locales.d.ts +768 -0
  29. package/lib/types/client/workbuddy/locales.d.ts.map +1 -0
  30. package/lib/types/client/workbuddy/styles.d.ts +21 -0
  31. package/lib/types/client/workbuddy/styles.d.ts.map +1 -0
  32. package/lib/types/client/workbuddy/useWorkBuddySection.d.ts +149 -0
  33. package/lib/types/client/workbuddy/useWorkBuddySection.d.ts.map +1 -0
  34. package/lib/types/compat.d.ts +1 -1
  35. package/lib/types/entry-plan-mode-pipeline.d.ts +191 -0
  36. package/lib/types/entry-plan-mode-pipeline.d.ts.map +1 -0
  37. package/lib/types/host/agent-preset.d.ts.map +1 -1
  38. package/lib/types/host/cache-warmup/contracts.d.ts +5 -1
  39. package/lib/types/host/cache-warmup/contracts.d.ts.map +1 -1
  40. package/lib/types/host/cache-warmup/install.d.ts.map +1 -1
  41. package/lib/types/host/cache-warmup/projection.d.ts.map +1 -1
  42. package/lib/types/host/cache-warmup/retrieval-intent.d.ts +18 -0
  43. package/lib/types/host/cache-warmup/retrieval-intent.d.ts.map +1 -0
  44. package/lib/types/host/cache-warmup/settings.d.ts +9 -2
  45. package/lib/types/host/cache-warmup/settings.d.ts.map +1 -1
  46. package/lib/types/host/common/capabilities.d.ts.map +1 -1
  47. package/lib/types/host/common/model-request-control.d.ts +1 -1
  48. package/lib/types/host/common/model-request-control.d.ts.map +1 -1
  49. package/lib/types/host/common/request-diagnostics.d.ts +1 -1
  50. package/lib/types/host/common/request-diagnostics.d.ts.map +1 -1
  51. package/lib/types/host/compaction-prompt.d.ts +129 -0
  52. package/lib/types/host/compaction-prompt.d.ts.map +1 -0
  53. package/lib/types/host/preset-sync.d.ts.map +1 -1
  54. package/lib/types/host/responses-client.d.ts.map +1 -1
  55. package/lib/types/host/workbuddy/account-pool.d.ts +389 -0
  56. package/lib/types/host/workbuddy/account-pool.d.ts.map +1 -0
  57. package/lib/types/host/workbuddy/adapter.d.ts +249 -0
  58. package/lib/types/host/workbuddy/adapter.d.ts.map +1 -0
  59. package/lib/types/host/workbuddy/atrest.d.ts +98 -0
  60. package/lib/types/host/workbuddy/atrest.d.ts.map +1 -0
  61. package/lib/types/host/workbuddy/checkin.d.ts +150 -0
  62. package/lib/types/host/workbuddy/checkin.d.ts.map +1 -0
  63. package/lib/types/host/workbuddy/client.d.ts +214 -0
  64. package/lib/types/host/workbuddy/client.d.ts.map +1 -0
  65. package/lib/types/host/workbuddy/dsml.d.ts +55 -0
  66. package/lib/types/host/workbuddy/dsml.d.ts.map +1 -0
  67. package/lib/types/host/workbuddy/guardrails.d.ts +111 -0
  68. package/lib/types/host/workbuddy/guardrails.d.ts.map +1 -0
  69. package/lib/types/host/workbuddy/identity.d.ts +71 -0
  70. package/lib/types/host/workbuddy/identity.d.ts.map +1 -0
  71. package/lib/types/host/workbuddy/mapper.d.ts +238 -0
  72. package/lib/types/host/workbuddy/mapper.d.ts.map +1 -0
  73. package/lib/types/host/workbuddy/model-catalog.d.ts +217 -0
  74. package/lib/types/host/workbuddy/model-catalog.d.ts.map +1 -0
  75. package/lib/types/host/workbuddy/oauth.d.ts +47 -0
  76. package/lib/types/host/workbuddy/oauth.d.ts.map +1 -0
  77. package/lib/types/host/workbuddy/outbound-identity.d.ts +139 -0
  78. package/lib/types/host/workbuddy/outbound-identity.d.ts.map +1 -0
  79. package/lib/types/host/workbuddy/routes.d.ts +56 -0
  80. package/lib/types/host/workbuddy/routes.d.ts.map +1 -0
  81. package/lib/types/host/workbuddy/token-store.d.ts +370 -0
  82. package/lib/types/host/workbuddy/token-store.d.ts.map +1 -0
  83. package/lib/types/host/workbuddy/types.d.ts +179 -0
  84. package/lib/types/host/workbuddy/types.d.ts.map +1 -0
  85. package/lib/types/index.d.ts +35 -0
  86. package/lib/types/index.d.ts.map +1 -1
  87. package/lib/types/shared/workbuddy-contracts.d.ts +531 -0
  88. package/lib/types/shared/workbuddy-contracts.d.ts.map +1 -0
  89. package/package.json +6 -2
  90. package/presets/dispatch/README.md +57 -3
  91. package/presets/dispatch/agent.cordis.yml +42 -13
@@ -1 +1 @@
1
- {"version":3,"file":"settings-section.d.ts","sourceRoot":"","sources":["../../../../src/client/progress-updates/settings-section.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACjF,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,KAAK,EAEV,oBAAoB,EAIrB,MAAM,uBAAuB,CAAA;AAE9B,iCAAiC;AACjC,MAAM,WAAW,+BAA+B;IAC9C,iCAAiC;IACjC,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,oBAAoB,CAAA;CAChC;AAED,6BAA6B;AAC7B,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,6CAA6C;AAC7C,MAAM,MAAM,4BAA4B,GAAG,+BAA+B,GAAG,kBAAkB,GAAG,QAAQ,CAAA;AAE1G,8CAA8C;AAC9C,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,YAAY;AACZ,eAAO,MAAM,mBAAmB,KAAK,CAAA;AACrC,kDAAkD;AAClD,eAAO,MAAM,uBAAuB,IAAI,CAAA;AAyHxC;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,4BAA4B,GAAG,SAAS,CA0L7F"}
1
+ {"version":3,"file":"settings-section.d.ts","sourceRoot":"","sources":["../../../../src/client/progress-updates/settings-section.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACjF,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,KAAK,EAEV,oBAAoB,EAIrB,MAAM,uBAAuB,CAAA;AAE9B,iCAAiC;AACjC,MAAM,WAAW,+BAA+B;IAC9C,iCAAiC;IACjC,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,oBAAoB,CAAA;CAChC;AAED,6BAA6B;AAC7B,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,6CAA6C;AAC7C,MAAM,MAAM,4BAA4B,GAAG,+BAA+B,GAAG,kBAAkB,GAAG,QAAQ,CAAA;AAE1G,8CAA8C;AAC9C,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,YAAY;AACZ,eAAO,MAAM,mBAAmB,KAAK,CAAA;AACrC,kDAAkD;AAClD,eAAO,MAAM,uBAAuB,IAAI,CAAA;AAqJxC;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,4BAA4B,GAAG,SAAS,CA8P7F"}
@@ -0,0 +1,34 @@
1
+ import type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client';
2
+ import type { WorkBuddyWebStatus } from '../../shared/workbuddy-contracts.ts';
3
+ import { type ComposerQuotaFacts } from '../common/ComposerQuotaBadge.tsx';
4
+ import type { SnapshotStore } from '../store.ts';
5
+ export interface WorkBuddyComposerQuotaProps {
6
+ directory: SnapshotStore<ModelDirectoryState>;
7
+ loadModelDirectory(): void;
8
+ }
9
+ /**
10
+ * Pick the most meaningful number for the badge.
11
+ *
12
+ * The three cases are deliberately distinct, because collapsing any two of them
13
+ * states something the card does not know:
14
+ *
15
+ * - a BOUNDED allowance is what a user spends down, so the cycle meter's
16
+ * remaining share wins the text slot when both exist, since that is the one
17
+ * that actually resets; the number is enough here and the shared badge draws
18
+ * no trailing meter, matching every sibling line's compact badge;
19
+ * - a reported share of ZERO is a measurement ("nothing left"), not a missing
20
+ * value: it renders `0%` at danger level and must never be confused with the
21
+ * unavailable case below;
22
+ * - a bare credit balance is a quantity with no percentage, so it is shown as
23
+ * a number and no meter bar is drawn beside it;
24
+ * - nothing reported at all (no status, no quota, no meter, no balance) is
25
+ * UNKNOWN: the badge says so and asks for a click, instead of fabricating a
26
+ * `0` that reads as "you are out of quota".
27
+ *
28
+ * `percent` is deliberately never carried: the WorkBuddy badge is text-only so it
29
+ * matches the other lines' compact badges. A bar filled from a guess would be
30
+ * worse than no bar, and this line has no sibling that draws one.
31
+ */
32
+ export declare function selectBadgeFacts(status: WorkBuddyWebStatus | null, _modelId?: string): ComposerQuotaFacts | null;
33
+ export declare function WorkBuddyComposerQuota({ directory, loadModelDirectory }: WorkBuddyComposerQuotaProps): React.JSX.Element | null;
34
+ //# sourceMappingURL=WorkBuddyComposerQuota.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkBuddyComposerQuota.d.ts","sourceRoot":"","sources":["../../../../src/client/workbuddy/WorkBuddyComposerQuota.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAA;AAC5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AAC7E,OAAO,EAAkC,KAAK,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AAG1G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAKhD,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAA;IAC7C,kBAAkB,IAAI,IAAI,CAAA;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,kBAAkB,GAAG,IAAI,EACjC,QAAQ,CAAC,EAAE,MAAM,GAChB,kBAAkB,GAAG,IAAI,CA2C3B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,2BAA2B,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAc/H"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * The WorkBuddy subscription settings card.
3
+ *
4
+ * Markup only: every piece of state, every effect and every request this card
5
+ * makes lives in 'useWorkBuddySection.ts', which returns one named shape the JSX
6
+ * below reads. The two files are the split of a single 885-line component — the
7
+ * behaviour is unchanged, and this one should stay render-shaped.
8
+ *
9
+ * Three line-private facts are drawn here rather than taught to a shared
10
+ * component, because none of them belongs to any other line:
11
+ *
12
+ * - the whole-pool pause. A pause is a decision about the POOL — nothing is
13
+ * routable — and no per-account field can express it, so it is stated before
14
+ * the account list and never softened into "3 accounts available";
15
+ * - the per-model park. The upstream refuses one MODEL (429) while the account
16
+ * keeps serving the rest, so the row names the model and when it lifts;
17
+ * - the account-scoped restriction, which bars the account itself.
18
+ */
19
+ import React from 'react';
20
+ import type { PoolStorageDto } from '../../shared/contracts.ts';
21
+ import type { WorkBuddyAccountRestrictionDto, WorkBuddyPoolStateDto, WorkBuddyModelCredits, WorkBuddyRegion } from '../../shared/workbuddy-contracts.ts';
22
+ import { type WorkBuddySectionProps } from './useWorkBuddySection.ts';
23
+ import { zh } from './locales.ts';
24
+ /**
25
+ * The consumption rate of one model, as the settings row states it.
26
+ *
27
+ * The gateway publishes one rate per region and the official CodeBuddy picker
28
+ * spells it beside a model as `6.67x`; the row uses the same shape behind the
29
+ * section's own label. Which rates reach the row depends on what the card knows
30
+ * about the account, and the two cases are deliberately different:
31
+ *
32
+ * - A KNOWN region shows that region's rate and nothing else. Borrowing the
33
+ * sibling region's number would state a price this account never pays —
34
+ * measured 2026-10-09, `deepseek-v4.1-flash` is `0.11` on cn against `0.00`
35
+ * on intl, and the backends reject a model asked of the wrong region anyway.
36
+ * - An UNKNOWN region (no account read back yet) shows both rates when the
37
+ * backends disagree, so the row is honest about the range instead of picking
38
+ * one of them. When they agree there is nothing to disambiguate.
39
+ *
40
+ * The two-region form is assembled entirely from the caller's labels: the
41
+ * qualifier comes from `labels.region(value, key)` and the join from
42
+ * `labels.pair(first, second)`, so the dictionary owns the region nouns, the
43
+ * bracket glyphs AND the separator. Nothing about the two-region string is
44
+ * spelled in this file, which is the point — the glyphs differ per language
45
+ * (`倍率 0.11x(国区) / 0.00x(国际区)` in Chinese,
46
+ * `Multiplier 0.11x (China) / 0.00x (International)` in English) and a
47
+ * separator chosen here would be right in at most one of them.
48
+ *
49
+ * `null` means "this row states no rate"; the caller drops it from the hint
50
+ * array rather than rendering a placeholder, because a guessed rate on a spend
51
+ * figure is worse than a missing one. `'0.00'` is a declaration — this model
52
+ * consumes no allowance — so it renders like any other value.
53
+ */
54
+ export declare function creditMultiplierHint(credits: WorkBuddyModelCredits | undefined, region: WorkBuddyRegion | null, labels: {
55
+ multiplier: string;
56
+ region: (value: string, key: WorkBuddyRegion) => string;
57
+ pair: (first: string, second: string) => string;
58
+ }): string | null;
59
+ /** Mask a UIN so the card shows identity without publishing the full number. */
60
+ export declare function maskUin(uin?: string | null): string;
61
+ /** The subset of the card's words a pool-state sentence needs. */
62
+ export type PoolStateLabels = Pick<typeof zh, 'poolState' | 'poolPaused' | 'poolPausedReason' | 'poolPausedUntil' | 'poolPausedManual' | 'poolRestrictedCount' | 'poolStorageLabel' | 'poolStorageEncrypted' | 'poolStoragePlain' | 'poolStorageBackendKeyring' | 'poolStorageBackendCredentials' | 'poolStorageBackendDpapi' | 'poolStorageBackendKeychain' | 'poolStorageUnavailableKeyring' | 'poolStorageUnavailableCredentials' | 'poolStorageUnavailableStore'>;
63
+ /**
64
+ * The store that actually holds the pool document, in the reader's words.
65
+ *
66
+ * One label per BACKEND and not per configured value: `keyring` resolves to DPAPI
67
+ * on Windows, the Keychain on macOS and the Secret Service on Linux, so a reader
68
+ * looking at an unreadable pool needs to know which store answered. Every branch
69
+ * is spelled out, so a new backend cannot reach the card as a raw fallback.
70
+ */
71
+ export declare function poolStorageBackendLabel(storage: PoolStorageDto, t: PoolStateLabels): string;
72
+ /** Why the configured store is not usable here, in the reader's language. */
73
+ export declare function poolStorageUnavailableLabel(storage: PoolStorageDto, t: PoolStateLabels): string | null;
74
+ /** The one-line storage description, or null when the host reports no pool store. */
75
+ export declare function poolStorageLine(storage: PoolStorageDto | undefined, t: PoolStateLabels): string | null;
76
+ /**
77
+ * The sentences the whole-pool banner states, in order of importance.
78
+ *
79
+ * Exported because it is the rule this card exists to get right: a paused pool
80
+ * has to reach the screen as "nothing is routable", never as a healthy account
81
+ * count. `now` is a parameter so one render walks one instant.
82
+ */
83
+ export declare function poolStateLines(pool: WorkBuddyPoolStateDto | undefined, t: PoolStateLabels, now: number): {
84
+ paused: boolean;
85
+ restrictedCount: number;
86
+ lines: string[];
87
+ };
88
+ /** The account-scoped refusal, as one sentence plus when it lifts. */
89
+ export declare function restrictionLines(restriction: WorkBuddyAccountRestrictionDto | undefined, t: Pick<typeof zh, 'restrictedAccount' | 'liftsIn' | 'restrictedAccountMessage'>): string[];
90
+ export declare function WorkBuddySection({ onModelChange, loadModelDirectory }: WorkBuddySectionProps): React.ReactElement;
91
+ //# sourceMappingURL=WorkBuddySection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkBuddySection.d.ts","sourceRoot":"","sources":["../../../../src/client/workbuddy/WorkBuddySection.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAA8B,MAAM,OAAO,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,KAAK,EACV,8BAA8B,EAE9B,qBAAqB,EACrB,qBAAqB,EAIrB,eAAe,EAChB,MAAM,qCAAqC,CAAA;AAS5C,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAC1F,OAAO,EAAgB,EAAE,EAAE,MAAM,cAAc,CAAA;AAkB/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAAG,SAAS,EAC1C,MAAM,EAAE,eAAe,GAAG,IAAI,EAC9B,MAAM,EAAE;IACN,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,KAAK,MAAM,CAAA;IACvD,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;CAChD,GACA,MAAM,GAAG,IAAI,CA4Bf;AAED,gFAAgF;AAChF,wBAAgB,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAInD;AAED,kEAAkE;AAClE,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,OAAO,EAAE,EACP,WAAW,GACX,YAAY,GACZ,kBAAkB,GAClB,iBAAiB,GACjB,kBAAkB,GAClB,qBAAqB,GACrB,kBAAkB,GAClB,sBAAsB,GACtB,kBAAkB,GAClB,2BAA2B,GAC3B,+BAA+B,GAC/B,yBAAyB,GACzB,4BAA4B,GAC5B,+BAA+B,GAC/B,mCAAmC,GACnC,6BAA6B,CAChC,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,GAAG,MAAM,CAO3F;AAED,6EAA6E;AAC7E,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAOtG;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,EAAE,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAItG;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,qBAAqB,GAAG,SAAS,EACvC,CAAC,EAAE,eAAe,EAClB,GAAG,EAAE,MAAM,GACV;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAgB/D;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,8BAA8B,GAAG,SAAS,EACvD,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,mBAAmB,GAAG,SAAS,GAAG,0BAA0B,CAAC,GAC/E,MAAM,EAAE,CASV;AAED,wBAAgB,gBAAgB,CAAC,EAAE,aAAa,EAAE,kBAAkB,EAAE,EAAE,qBAAqB,GAAG,KAAK,CAAC,YAAY,CA0gBjH"}