@stoneforge/quarry 1.12.0 → 1.14.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 (199) hide show
  1. package/README.md +2 -0
  2. package/dist/api/quarry-api.d.ts +9 -1
  3. package/dist/api/quarry-api.d.ts.map +1 -1
  4. package/dist/api/quarry-api.js +21 -2
  5. package/dist/api/quarry-api.js.map +1 -1
  6. package/dist/api/types.d.ts +8 -1
  7. package/dist/api/types.d.ts.map +1 -1
  8. package/dist/api/types.js.map +1 -1
  9. package/dist/cli/commands/auto-link-helper.d.ts +33 -0
  10. package/dist/cli/commands/auto-link-helper.d.ts.map +1 -0
  11. package/dist/cli/commands/auto-link-helper.js +74 -0
  12. package/dist/cli/commands/auto-link-helper.js.map +1 -0
  13. package/dist/cli/commands/crud.d.ts +3 -0
  14. package/dist/cli/commands/crud.d.ts.map +1 -1
  15. package/dist/cli/commands/crud.js +144 -15
  16. package/dist/cli/commands/crud.js.map +1 -1
  17. package/dist/cli/commands/docs.js +2 -2
  18. package/dist/cli/commands/docs.js.map +1 -1
  19. package/dist/cli/commands/document.js +1 -1
  20. package/dist/cli/commands/document.js.map +1 -1
  21. package/dist/cli/commands/entity.js +1 -1
  22. package/dist/cli/commands/entity.js.map +1 -1
  23. package/dist/cli/commands/external-sync.d.ts +18 -0
  24. package/dist/cli/commands/external-sync.d.ts.map +1 -0
  25. package/dist/cli/commands/external-sync.js +2499 -0
  26. package/dist/cli/commands/external-sync.js.map +1 -0
  27. package/dist/cli/commands/library.js +1 -1
  28. package/dist/cli/commands/library.js.map +1 -1
  29. package/dist/cli/commands/message.js +2 -2
  30. package/dist/cli/commands/message.js.map +1 -1
  31. package/dist/cli/commands/serve.d.ts.map +1 -1
  32. package/dist/cli/commands/serve.js +2 -0
  33. package/dist/cli/commands/serve.js.map +1 -1
  34. package/dist/cli/commands/task.d.ts.map +1 -1
  35. package/dist/cli/commands/task.js +7 -4
  36. package/dist/cli/commands/task.js.map +1 -1
  37. package/dist/cli/commands/team.js +1 -1
  38. package/dist/cli/commands/team.js.map +1 -1
  39. package/dist/cli/commands/workflow.js +1 -1
  40. package/dist/cli/commands/workflow.js.map +1 -1
  41. package/dist/cli/runner.d.ts.map +1 -1
  42. package/dist/cli/runner.js +3 -0
  43. package/dist/cli/runner.js.map +1 -1
  44. package/dist/cli/utils/progress.d.ts +30 -0
  45. package/dist/cli/utils/progress.d.ts.map +1 -0
  46. package/dist/cli/utils/progress.js +47 -0
  47. package/dist/cli/utils/progress.js.map +1 -0
  48. package/dist/config/config.d.ts.map +1 -1
  49. package/dist/config/config.js +34 -0
  50. package/dist/config/config.js.map +1 -1
  51. package/dist/config/defaults.d.ts +13 -1
  52. package/dist/config/defaults.d.ts.map +1 -1
  53. package/dist/config/defaults.js +22 -0
  54. package/dist/config/defaults.js.map +1 -1
  55. package/dist/config/file.d.ts.map +1 -1
  56. package/dist/config/file.js +71 -0
  57. package/dist/config/file.js.map +1 -1
  58. package/dist/config/index.d.ts +3 -3
  59. package/dist/config/index.d.ts.map +1 -1
  60. package/dist/config/index.js +2 -2
  61. package/dist/config/index.js.map +1 -1
  62. package/dist/config/merge.d.ts.map +1 -1
  63. package/dist/config/merge.js +52 -1
  64. package/dist/config/merge.js.map +1 -1
  65. package/dist/config/types.d.ts +68 -1
  66. package/dist/config/types.d.ts.map +1 -1
  67. package/dist/config/types.js +33 -0
  68. package/dist/config/types.js.map +1 -1
  69. package/dist/config/validation.d.ts.map +1 -1
  70. package/dist/config/validation.js +64 -1
  71. package/dist/config/validation.js.map +1 -1
  72. package/dist/external-sync/adapters/document-sync-adapter.d.ts +150 -0
  73. package/dist/external-sync/adapters/document-sync-adapter.d.ts.map +1 -0
  74. package/dist/external-sync/adapters/document-sync-adapter.js +325 -0
  75. package/dist/external-sync/adapters/document-sync-adapter.js.map +1 -0
  76. package/dist/external-sync/adapters/task-sync-adapter.d.ts +177 -0
  77. package/dist/external-sync/adapters/task-sync-adapter.d.ts.map +1 -0
  78. package/dist/external-sync/adapters/task-sync-adapter.js +353 -0
  79. package/dist/external-sync/adapters/task-sync-adapter.js.map +1 -0
  80. package/dist/external-sync/auto-link.d.ts +66 -0
  81. package/dist/external-sync/auto-link.d.ts.map +1 -0
  82. package/dist/external-sync/auto-link.js +98 -0
  83. package/dist/external-sync/auto-link.js.map +1 -0
  84. package/dist/external-sync/conflict-resolver.d.ts +170 -0
  85. package/dist/external-sync/conflict-resolver.d.ts.map +1 -0
  86. package/dist/external-sync/conflict-resolver.js +580 -0
  87. package/dist/external-sync/conflict-resolver.js.map +1 -0
  88. package/dist/external-sync/index.d.ts +23 -0
  89. package/dist/external-sync/index.d.ts.map +1 -0
  90. package/dist/external-sync/index.js +24 -0
  91. package/dist/external-sync/index.js.map +1 -0
  92. package/dist/external-sync/provider-registry.d.ts +113 -0
  93. package/dist/external-sync/provider-registry.d.ts.map +1 -0
  94. package/dist/external-sync/provider-registry.js +205 -0
  95. package/dist/external-sync/provider-registry.js.map +1 -0
  96. package/dist/external-sync/providers/folder/folder-document-adapter.d.ts +97 -0
  97. package/dist/external-sync/providers/folder/folder-document-adapter.d.ts.map +1 -0
  98. package/dist/external-sync/providers/folder/folder-document-adapter.js +261 -0
  99. package/dist/external-sync/providers/folder/folder-document-adapter.js.map +1 -0
  100. package/dist/external-sync/providers/folder/folder-fs.d.ts +146 -0
  101. package/dist/external-sync/providers/folder/folder-fs.d.ts.map +1 -0
  102. package/dist/external-sync/providers/folder/folder-fs.js +300 -0
  103. package/dist/external-sync/providers/folder/folder-fs.js.map +1 -0
  104. package/dist/external-sync/providers/folder/folder-provider.d.ts +28 -0
  105. package/dist/external-sync/providers/folder/folder-provider.d.ts.map +1 -0
  106. package/dist/external-sync/providers/folder/folder-provider.js +87 -0
  107. package/dist/external-sync/providers/folder/folder-provider.js.map +1 -0
  108. package/dist/external-sync/providers/folder/index.d.ts +11 -0
  109. package/dist/external-sync/providers/folder/index.d.ts.map +1 -0
  110. package/dist/external-sync/providers/folder/index.js +13 -0
  111. package/dist/external-sync/providers/folder/index.js.map +1 -0
  112. package/dist/external-sync/providers/github/github-api.d.ts +271 -0
  113. package/dist/external-sync/providers/github/github-api.d.ts.map +1 -0
  114. package/dist/external-sync/providers/github/github-api.js +366 -0
  115. package/dist/external-sync/providers/github/github-api.js.map +1 -0
  116. package/dist/external-sync/providers/github/github-field-map.d.ts +76 -0
  117. package/dist/external-sync/providers/github/github-field-map.d.ts.map +1 -0
  118. package/dist/external-sync/providers/github/github-field-map.js +157 -0
  119. package/dist/external-sync/providers/github/github-field-map.js.map +1 -0
  120. package/dist/external-sync/providers/github/github-provider.d.ts +36 -0
  121. package/dist/external-sync/providers/github/github-provider.d.ts.map +1 -0
  122. package/dist/external-sync/providers/github/github-provider.js +212 -0
  123. package/dist/external-sync/providers/github/github-provider.js.map +1 -0
  124. package/dist/external-sync/providers/github/github-task-adapter.d.ts +135 -0
  125. package/dist/external-sync/providers/github/github-task-adapter.d.ts.map +1 -0
  126. package/dist/external-sync/providers/github/github-task-adapter.js +374 -0
  127. package/dist/external-sync/providers/github/github-task-adapter.js.map +1 -0
  128. package/dist/external-sync/providers/github/index.d.ts +12 -0
  129. package/dist/external-sync/providers/github/index.d.ts.map +1 -0
  130. package/dist/external-sync/providers/github/index.js +15 -0
  131. package/dist/external-sync/providers/github/index.js.map +1 -0
  132. package/dist/external-sync/providers/index.d.ts +13 -0
  133. package/dist/external-sync/providers/index.d.ts.map +1 -0
  134. package/dist/external-sync/providers/index.js +15 -0
  135. package/dist/external-sync/providers/index.js.map +1 -0
  136. package/dist/external-sync/providers/linear/index.d.ts +19 -0
  137. package/dist/external-sync/providers/linear/index.d.ts.map +1 -0
  138. package/dist/external-sync/providers/linear/index.js +19 -0
  139. package/dist/external-sync/providers/linear/index.js.map +1 -0
  140. package/dist/external-sync/providers/linear/linear-api.d.ts +252 -0
  141. package/dist/external-sync/providers/linear/linear-api.d.ts.map +1 -0
  142. package/dist/external-sync/providers/linear/linear-api.js +522 -0
  143. package/dist/external-sync/providers/linear/linear-api.js.map +1 -0
  144. package/dist/external-sync/providers/linear/linear-field-map.d.ts +135 -0
  145. package/dist/external-sync/providers/linear/linear-field-map.d.ts.map +1 -0
  146. package/dist/external-sync/providers/linear/linear-field-map.js +338 -0
  147. package/dist/external-sync/providers/linear/linear-field-map.js.map +1 -0
  148. package/dist/external-sync/providers/linear/linear-provider.d.ts +52 -0
  149. package/dist/external-sync/providers/linear/linear-provider.d.ts.map +1 -0
  150. package/dist/external-sync/providers/linear/linear-provider.js +169 -0
  151. package/dist/external-sync/providers/linear/linear-provider.js.map +1 -0
  152. package/dist/external-sync/providers/linear/linear-task-adapter.d.ts +190 -0
  153. package/dist/external-sync/providers/linear/linear-task-adapter.d.ts.map +1 -0
  154. package/dist/external-sync/providers/linear/linear-task-adapter.js +521 -0
  155. package/dist/external-sync/providers/linear/linear-task-adapter.js.map +1 -0
  156. package/dist/external-sync/providers/linear/linear-types.d.ts +114 -0
  157. package/dist/external-sync/providers/linear/linear-types.d.ts.map +1 -0
  158. package/dist/external-sync/providers/linear/linear-types.js +10 -0
  159. package/dist/external-sync/providers/linear/linear-types.js.map +1 -0
  160. package/dist/external-sync/providers/notion/index.d.ts +19 -0
  161. package/dist/external-sync/providers/notion/index.d.ts.map +1 -0
  162. package/dist/external-sync/providers/notion/index.js +20 -0
  163. package/dist/external-sync/providers/notion/index.js.map +1 -0
  164. package/dist/external-sync/providers/notion/notion-api.d.ts +253 -0
  165. package/dist/external-sync/providers/notion/notion-api.d.ts.map +1 -0
  166. package/dist/external-sync/providers/notion/notion-api.js +492 -0
  167. package/dist/external-sync/providers/notion/notion-api.js.map +1 -0
  168. package/dist/external-sync/providers/notion/notion-blocks.d.ts +93 -0
  169. package/dist/external-sync/providers/notion/notion-blocks.d.ts.map +1 -0
  170. package/dist/external-sync/providers/notion/notion-blocks.js +773 -0
  171. package/dist/external-sync/providers/notion/notion-blocks.js.map +1 -0
  172. package/dist/external-sync/providers/notion/notion-document-adapter.d.ts +176 -0
  173. package/dist/external-sync/providers/notion/notion-document-adapter.d.ts.map +1 -0
  174. package/dist/external-sync/providers/notion/notion-document-adapter.js +413 -0
  175. package/dist/external-sync/providers/notion/notion-document-adapter.js.map +1 -0
  176. package/dist/external-sync/providers/notion/notion-provider.d.ts +57 -0
  177. package/dist/external-sync/providers/notion/notion-provider.d.ts.map +1 -0
  178. package/dist/external-sync/providers/notion/notion-provider.js +159 -0
  179. package/dist/external-sync/providers/notion/notion-provider.js.map +1 -0
  180. package/dist/external-sync/providers/notion/notion-types.d.ts +388 -0
  181. package/dist/external-sync/providers/notion/notion-types.d.ts.map +1 -0
  182. package/dist/external-sync/providers/notion/notion-types.js +47 -0
  183. package/dist/external-sync/providers/notion/notion-types.js.map +1 -0
  184. package/dist/external-sync/sync-engine.d.ts +364 -0
  185. package/dist/external-sync/sync-engine.d.ts.map +1 -0
  186. package/dist/external-sync/sync-engine.js +1154 -0
  187. package/dist/external-sync/sync-engine.js.map +1 -0
  188. package/dist/index.d.ts +1 -0
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +2 -0
  191. package/dist/index.js.map +1 -1
  192. package/dist/server/index.js +8 -8
  193. package/dist/server/index.js.map +1 -1
  194. package/dist/services/inbox.js +1 -1
  195. package/dist/sync/hash.d.ts +5 -0
  196. package/dist/sync/hash.d.ts.map +1 -1
  197. package/dist/sync/hash.js +21 -2
  198. package/dist/sync/hash.js.map +1 -1
  199. package/package.json +10 -12
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Conflict Detection and Resolution Module
3
+ *
4
+ * Detects conflicts during external sync (both local and remote changed since
5
+ * last sync) and resolves them using configurable strategies:
6
+ *
7
+ * - last_write_wins: Compare updatedAt timestamps, most recent wins
8
+ * - local_wins: Stoneforge version always wins
9
+ * - remote_wins: External version always wins
10
+ * - manual: Tag element with sync-conflict for human resolution
11
+ *
12
+ * Supports field-level merge: when different fields changed on each side,
13
+ * both changes are applied automatically. Only same-field changes are conflicts.
14
+ *
15
+ * @module conflict-resolver
16
+ */
17
+ import type { Element, Timestamp, ConflictStrategy, ExternalSyncState, ExternalSyncConflict, ExternalTask, TaskFieldMapConfig } from '@stoneforge/core';
18
+ /**
19
+ * Information about a detected conflict between local and remote versions.
20
+ * Includes details about which fields changed on each side.
21
+ */
22
+ export interface ConflictInfo {
23
+ /** Local element ID */
24
+ readonly elementId: string;
25
+ /** External item ID */
26
+ readonly externalId: string;
27
+ /** Provider name */
28
+ readonly provider: string;
29
+ /** Project/repository */
30
+ readonly project: string;
31
+ /** Local element's updatedAt timestamp */
32
+ readonly localUpdatedAt: Timestamp;
33
+ /** Remote item's updatedAt timestamp */
34
+ readonly remoteUpdatedAt: string;
35
+ /** Fields that changed locally (by localField name) */
36
+ readonly localChangedFields: readonly string[];
37
+ /** Fields that changed remotely (by externalField name) */
38
+ readonly remoteChangedFields: readonly string[];
39
+ /** Fields that changed on BOTH sides (true conflict) */
40
+ readonly conflictingFields: readonly string[];
41
+ /** Whether field-level merge can resolve some changes automatically */
42
+ readonly canFieldMerge: boolean;
43
+ }
44
+ /**
45
+ * Result of resolving a conflict. Contains the changes to apply
46
+ * to the local element and/or the external item.
47
+ */
48
+ export interface ResolvedChanges {
49
+ /** The conflict that was resolved */
50
+ readonly conflict: ConflictInfo;
51
+ /** Strategy used for resolution */
52
+ readonly strategy: ConflictStrategy;
53
+ /** Whether the conflict was fully resolved (false if manual) */
54
+ readonly resolved: boolean;
55
+ /** Which side won, if resolved automatically */
56
+ readonly winner?: 'local' | 'remote' | 'merged';
57
+ /** Field values to apply to the local element (from remote or merged) */
58
+ readonly localUpdates?: Record<string, unknown>;
59
+ /** Field values to push to the external system (from local or merged) */
60
+ readonly remoteUpdates?: Record<string, unknown>;
61
+ /** For manual resolution: both versions stored for human review */
62
+ readonly manualConflict?: {
63
+ readonly local: Record<string, unknown>;
64
+ readonly remote: Record<string, unknown>;
65
+ };
66
+ }
67
+ /**
68
+ * Options for conflict detection, allowing callers to provide
69
+ * field-level change context.
70
+ */
71
+ export interface DetectConflictOptions {
72
+ /** Field map config for field-level analysis (optional) */
73
+ readonly fieldMapConfig?: TaskFieldMapConfig;
74
+ /** Snapshot of local element at last push (for field-level diff) */
75
+ readonly localBaseline?: Record<string, unknown>;
76
+ /** Snapshot of remote item at last pull (for field-level diff) */
77
+ readonly remoteBaseline?: Record<string, unknown>;
78
+ }
79
+ /**
80
+ * Detect whether a conflict exists between a local element and a remote item.
81
+ *
82
+ * A conflict exists when BOTH of these are true:
83
+ * - Local changed: current element content hash differs from lastPushedHash
84
+ * - Remote changed: current external item hash differs from lastPulledHash
85
+ *
86
+ * If a fieldMapConfig is provided along with baselines, performs field-level
87
+ * analysis to determine which specific fields conflict.
88
+ *
89
+ * @param localElement - The current local element
90
+ * @param remoteItem - The current external item
91
+ * @param syncState - The element's external sync state (from metadata._externalSync)
92
+ * @param options - Optional field-level detection options
93
+ * @returns ConflictInfo if both sides changed, or null if no conflict
94
+ */
95
+ export declare function detectConflict(localElement: Element, remoteItem: ExternalTask, syncState: ExternalSyncState, options?: DetectConflictOptions): ConflictInfo | null;
96
+ /**
97
+ * Compute a deterministic hash for an external item's content fields.
98
+ * Used for change detection on the remote side.
99
+ *
100
+ * Normalizes the item to a consistent shape for hashing:
101
+ * sorted keys, JSON stringified, SHA256.
102
+ */
103
+ export declare function computeExternalItemHash(item: ExternalTask): string;
104
+ /**
105
+ * Resolve a conflict using the specified strategy.
106
+ *
107
+ * Strategies:
108
+ * - last_write_wins: Compare updatedAt timestamps, most recent wins
109
+ * - local_wins: Stoneforge version always takes precedence
110
+ * - remote_wins: External version always takes precedence
111
+ * - manual: Mark for human resolution
112
+ *
113
+ * When field-level merge is possible (different fields changed on each side),
114
+ * non-conflicting fields are merged automatically regardless of strategy.
115
+ * The strategy only applies to fields that actually conflict (same field
116
+ * changed on both sides).
117
+ *
118
+ * @param conflict - The detected conflict info
119
+ * @param strategy - The resolution strategy to apply
120
+ * @param localElement - Current local element
121
+ * @param remoteItem - Current remote item
122
+ * @param options - Optional field map config for field-level merge
123
+ * @returns ResolvedChanges describing what to apply
124
+ */
125
+ export declare function resolveConflict(conflict: ConflictInfo, strategy: ConflictStrategy, localElement?: Element, remoteItem?: ExternalTask, options?: {
126
+ fieldMapConfig?: TaskFieldMapConfig;
127
+ }): ResolvedChanges;
128
+ /** Tag applied to elements with unresolved sync conflicts */
129
+ export declare const SYNC_CONFLICT_TAG = "sync-conflict";
130
+ /**
131
+ * Apply manual conflict resolution metadata to an element.
132
+ * Tags the element with 'sync-conflict' and stores both versions
133
+ * in metadata._externalSync.conflict.
134
+ *
135
+ * @param element - The element to mark as conflicted
136
+ * @param conflict - The conflict info
137
+ * @param localValues - Local field values at time of conflict
138
+ * @param remoteValues - Remote field values at time of conflict
139
+ * @returns Updated metadata and tags to apply to the element
140
+ */
141
+ export declare function applyManualConflict(element: Element, conflict: ConflictInfo, localValues: Record<string, unknown>, remoteValues: Record<string, unknown>): {
142
+ metadata: Record<string, unknown>;
143
+ tags: string[];
144
+ };
145
+ /**
146
+ * Resolve a manual conflict by choosing a side.
147
+ * Clears the sync-conflict tag and conflict metadata.
148
+ *
149
+ * Returns the updates to apply to the element. The caller is
150
+ * responsible for applying these and pushing/pulling as needed.
151
+ *
152
+ * @param element - The element with the conflict
153
+ * @param keep - Which side to keep: 'local' or 'remote'
154
+ * @returns Updated metadata, tags, and field values from the chosen side
155
+ */
156
+ export declare function resolveManualConflict(element: Element, keep: 'local' | 'remote'): {
157
+ metadata: Record<string, unknown>;
158
+ tags: string[];
159
+ fieldValues: Record<string, unknown>;
160
+ };
161
+ /**
162
+ * Convert a ConflictInfo and ResolvedChanges into an ExternalSyncConflict
163
+ * suitable for inclusion in sync result reports.
164
+ *
165
+ * @param conflict - The detected conflict info
166
+ * @param resolved - The resolution result
167
+ * @returns ExternalSyncConflict for reporting
168
+ */
169
+ export declare function toExternalSyncConflict(conflict: ConflictInfo, resolved: ResolvedChanges): ExternalSyncConflict;
170
+ //# sourceMappingURL=conflict-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-resolver.d.ts","sourceRoot":"","sources":["../../src/external-sync/conflict-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EAEZ,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAO1B;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uBAAuB;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC;IACnC,wCAAwC;IACxC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,uDAAuD;IACvD,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,2DAA2D;IAC3D,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,wDAAwD;IACxD,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,uEAAuE;IACvE,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAChD,yEAAyE;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,yEAAyE;IACzE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,mEAAmE;IACnE,QAAQ,CAAC,cAAc,CAAC,EAAE;QACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC1C,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,QAAQ,CAAC,cAAc,CAAC,EAAE,kBAAkB,CAAC;IAC7C,oEAAoE;IACpE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,kEAAkE;IAClE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnD;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,OAAO,EACrB,UAAU,EAAE,YAAY,EACxB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,YAAY,GAAG,IAAI,CA6BrB;AA+BD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAmBlE;AA6GD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,gBAAgB,EAC1B,YAAY,CAAC,EAAE,OAAO,EACtB,UAAU,CAAC,EAAE,YAAY,EACzB,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,kBAAkB,CAAA;CAAE,GAChD,eAAe,CA6BjB;AAiOD,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAyBvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,GACvB;IACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC,CA2BA;AAMD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,eAAe,GACxB,oBAAoB,CAYtB"}