@meframe/core 0.0.3 → 0.0.4
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/Meframe.d.ts.map +1 -1
- package/dist/Meframe.js +5 -4
- package/dist/Meframe.js.map +1 -1
- package/dist/cache/CacheManager.d.ts +2 -2
- package/dist/cache/CacheManager.d.ts.map +1 -1
- package/dist/cache/CacheManager.js +4 -3
- package/dist/cache/CacheManager.js.map +1 -1
- package/dist/cache/l1/VideoL1Cache.d.ts +2 -2
- package/dist/cache/l1/VideoL1Cache.d.ts.map +1 -1
- package/dist/cache/l1/VideoL1Cache.js +13 -8
- package/dist/cache/l1/VideoL1Cache.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +2 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/types.d.ts +3 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/controllers/PlaybackController.d.ts +7 -8
- package/dist/controllers/PlaybackController.d.ts.map +1 -1
- package/dist/controllers/PlaybackController.js +56 -76
- package/dist/controllers/PlaybackController.js.map +1 -1
- package/dist/controllers/types.d.ts +2 -3
- package/dist/controllers/types.d.ts.map +1 -1
- package/dist/event/events.d.ts +1 -4
- package/dist/event/events.d.ts.map +1 -1
- package/dist/event/events.js.map +1 -1
- package/dist/model/CompositionModel.d.ts +1 -0
- package/dist/model/CompositionModel.d.ts.map +1 -1
- package/dist/model/CompositionModel.js +2 -0
- package/dist/model/CompositionModel.js.map +1 -1
- package/dist/model/patch.d.ts +6 -2
- package/dist/model/patch.d.ts.map +1 -1
- package/dist/model/patch.js +76 -2
- package/dist/model/patch.js.map +1 -1
- package/dist/model/types.d.ts +1 -0
- package/dist/model/types.d.ts.map +1 -1
- package/dist/orchestrator/CompositionPlanner.d.ts +8 -7
- package/dist/orchestrator/CompositionPlanner.d.ts.map +1 -1
- package/dist/orchestrator/CompositionPlanner.js +33 -56
- package/dist/orchestrator/CompositionPlanner.js.map +1 -1
- package/dist/orchestrator/Orchestrator.d.ts +0 -1
- package/dist/orchestrator/Orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/Orchestrator.js +39 -19
- package/dist/orchestrator/Orchestrator.js.map +1 -1
- package/dist/orchestrator/VideoClipSession.d.ts +3 -5
- package/dist/orchestrator/VideoClipSession.d.ts.map +1 -1
- package/dist/orchestrator/VideoClipSession.js +66 -69
- package/dist/orchestrator/VideoClipSession.js.map +1 -1
- package/dist/orchestrator/types.d.ts +1 -0
- package/dist/orchestrator/types.d.ts.map +1 -1
- package/dist/stages/compose/GlobalAudioSession.d.ts +6 -0
- package/dist/stages/compose/GlobalAudioSession.d.ts.map +1 -1
- package/dist/stages/compose/GlobalAudioSession.js +17 -1
- package/dist/stages/compose/GlobalAudioSession.js.map +1 -1
- package/dist/stages/load/ResourceLoader.d.ts +22 -1
- package/dist/stages/load/ResourceLoader.d.ts.map +1 -1
- package/dist/stages/load/ResourceLoader.js +71 -25
- package/dist/stages/load/ResourceLoader.js.map +1 -1
- package/dist/stages/load/TaskManager.d.ts +1 -1
- package/dist/stages/load/TaskManager.d.ts.map +1 -1
- package/dist/stages/load/TaskManager.js +3 -2
- package/dist/stages/load/TaskManager.js.map +1 -1
- package/dist/stages/load/types.d.ts +2 -0
- package/dist/stages/load/types.d.ts.map +1 -1
- package/dist/worker/WorkerPool.d.ts +2 -0
- package/dist/worker/WorkerPool.d.ts.map +1 -1
- package/dist/worker/WorkerPool.js +4 -1
- package/dist/worker/WorkerPool.js.map +1 -1
- package/dist/workers/stages/compose/video-compose.worker.js +113 -81
- package/dist/workers/stages/compose/video-compose.worker.js.map +1 -1
- package/package.json +1 -1
- package/dist/controllers/PreviewHandle.d.ts +0 -25
- package/dist/controllers/PreviewHandle.d.ts.map +0 -1
- package/dist/controllers/PreviewHandle.js +0 -45
- package/dist/controllers/PreviewHandle.js.map +0 -1
- package/dist/model/dirty-range.js +0 -220
- package/dist/model/dirty-range.js.map +0 -1
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
function resolveDirtyRanges(patch, model) {
|
|
2
|
-
const affectedClips = /* @__PURE__ */ new Set();
|
|
3
|
-
const affectedTracks = /* @__PURE__ */ new Set();
|
|
4
|
-
const affectedResources = /* @__PURE__ */ new Set();
|
|
5
|
-
for (const op of patch.operations) {
|
|
6
|
-
collectAffectedElements(op, model, affectedClips, affectedTracks, affectedResources);
|
|
7
|
-
}
|
|
8
|
-
return calculateTimeRanges(affectedClips, affectedTracks, affectedResources, model);
|
|
9
|
-
}
|
|
10
|
-
function collectAffectedElements(op, model, affectedClips, affectedTracks, affectedResources) {
|
|
11
|
-
switch (op.type) {
|
|
12
|
-
case "addTrack":
|
|
13
|
-
case "removeTrack":
|
|
14
|
-
case "updateTrack": {
|
|
15
|
-
const trackOp = op;
|
|
16
|
-
if (trackOp.trackId) {
|
|
17
|
-
affectedTracks.add(trackOp.trackId);
|
|
18
|
-
const track = model.findTrack(trackOp.trackId);
|
|
19
|
-
if (track) {
|
|
20
|
-
track.clips.forEach((clip) => affectedClips.add(clip.id));
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
break;
|
|
24
|
-
}
|
|
25
|
-
case "addClip":
|
|
26
|
-
case "removeClip":
|
|
27
|
-
case "updateClip":
|
|
28
|
-
case "moveClip": {
|
|
29
|
-
const clipOp = op;
|
|
30
|
-
if (clipOp.clipId) {
|
|
31
|
-
affectedClips.add(clipOp.clipId);
|
|
32
|
-
}
|
|
33
|
-
if (clipOp.trackId) {
|
|
34
|
-
affectedTracks.add(clipOp.trackId);
|
|
35
|
-
}
|
|
36
|
-
if (clipOp.targetTrackId) {
|
|
37
|
-
affectedTracks.add(clipOp.targetTrackId);
|
|
38
|
-
}
|
|
39
|
-
if (clipOp.clip) {
|
|
40
|
-
collectOverlappingClips(
|
|
41
|
-
model,
|
|
42
|
-
clipOp.trackId,
|
|
43
|
-
clipOp.clip.startUs || 0,
|
|
44
|
-
(clipOp.clip.startUs || 0) + (clipOp.clip.durationUs || 0),
|
|
45
|
-
affectedClips
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
break;
|
|
49
|
-
}
|
|
50
|
-
case "addResource":
|
|
51
|
-
case "updateResource":
|
|
52
|
-
case "removeResource": {
|
|
53
|
-
const resourceOp = op;
|
|
54
|
-
affectedResources.add(resourceOp.resourceId);
|
|
55
|
-
for (const track of model.tracks) {
|
|
56
|
-
for (const clip of track.clips) {
|
|
57
|
-
if (clip.resourceId === resourceOp.resourceId) {
|
|
58
|
-
affectedClips.add(clip.id);
|
|
59
|
-
affectedTracks.add(track.id);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
case "addAttachment":
|
|
66
|
-
case "updateAttachment":
|
|
67
|
-
case "removeAttachment": {
|
|
68
|
-
const attachmentOp = op;
|
|
69
|
-
if (attachmentOp.clipId) {
|
|
70
|
-
affectedClips.add(attachmentOp.clipId);
|
|
71
|
-
}
|
|
72
|
-
if (attachmentOp.trackId) {
|
|
73
|
-
affectedTracks.add(attachmentOp.trackId);
|
|
74
|
-
}
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
case "addTransition":
|
|
78
|
-
case "updateTransition":
|
|
79
|
-
case "removeTransition": {
|
|
80
|
-
const transitionOp = op;
|
|
81
|
-
if (transitionOp.clipId) {
|
|
82
|
-
affectedClips.add(transitionOp.clipId);
|
|
83
|
-
collectAdjacentClips(model, transitionOp.trackId, transitionOp.clipId, affectedClips);
|
|
84
|
-
}
|
|
85
|
-
if (transitionOp.trackId) {
|
|
86
|
-
affectedTracks.add(transitionOp.trackId);
|
|
87
|
-
}
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
case "addEffect":
|
|
91
|
-
case "updateEffect":
|
|
92
|
-
case "removeEffect": {
|
|
93
|
-
const effectOp = op;
|
|
94
|
-
if (effectOp.targetType === "track") {
|
|
95
|
-
affectedTracks.add(effectOp.targetId);
|
|
96
|
-
const track = model.findTrack(effectOp.targetId);
|
|
97
|
-
if (track) {
|
|
98
|
-
track.clips.forEach((clip) => affectedClips.add(clip.id));
|
|
99
|
-
}
|
|
100
|
-
} else if (effectOp.targetType === "clip") {
|
|
101
|
-
affectedClips.add(effectOp.targetId);
|
|
102
|
-
}
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
function collectOverlappingClips(model, trackId, startUs, endUs, affectedClips) {
|
|
108
|
-
const track = model.findTrack(trackId);
|
|
109
|
-
if (!track) return;
|
|
110
|
-
const overlapping = model.getActiveClips(startUs, endUs);
|
|
111
|
-
overlapping.forEach((clip) => affectedClips.add(clip.id));
|
|
112
|
-
}
|
|
113
|
-
function collectAdjacentClips(model, trackId, clipId, affectedClips) {
|
|
114
|
-
const track = model.findTrack(trackId);
|
|
115
|
-
if (!track) return;
|
|
116
|
-
const clipIndex = track.clips.findIndex((c) => c.id === clipId);
|
|
117
|
-
if (clipIndex === -1) return;
|
|
118
|
-
const prevClip = track.clips[clipIndex - 1];
|
|
119
|
-
if (clipIndex > 0 && prevClip) {
|
|
120
|
-
affectedClips.add(prevClip.id);
|
|
121
|
-
}
|
|
122
|
-
const nextClip = track.clips[clipIndex + 1];
|
|
123
|
-
if (clipIndex < track.clips.length - 1 && nextClip) {
|
|
124
|
-
affectedClips.add(nextClip.id);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
function calculateTimeRanges(affectedClips, affectedTracks, _affectedResources, model) {
|
|
128
|
-
const ranges = [];
|
|
129
|
-
const processedTracks = /* @__PURE__ */ new Set();
|
|
130
|
-
for (const clipId of affectedClips) {
|
|
131
|
-
const clip = model.findClip(clipId);
|
|
132
|
-
if (!clip) continue;
|
|
133
|
-
for (const track of model.tracks) {
|
|
134
|
-
if (track.clips.some((c) => c.id === clipId)) {
|
|
135
|
-
if (!processedTracks.has(track.id)) {
|
|
136
|
-
const range = calculateTrackDirtyRange(track.id, affectedClips, model);
|
|
137
|
-
if (range) {
|
|
138
|
-
ranges.push(range);
|
|
139
|
-
processedTracks.add(track.id);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
break;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
for (const trackId of affectedTracks) {
|
|
147
|
-
if (!processedTracks.has(trackId)) {
|
|
148
|
-
const track = model.findTrack(trackId);
|
|
149
|
-
if (track) {
|
|
150
|
-
ranges.push({
|
|
151
|
-
trackId,
|
|
152
|
-
startUs: 0,
|
|
153
|
-
endUs: model.getTrackDuration(trackId),
|
|
154
|
-
reason: "track_operation"
|
|
155
|
-
});
|
|
156
|
-
processedTracks.add(trackId);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return mergeRanges(ranges);
|
|
161
|
-
}
|
|
162
|
-
function calculateTrackDirtyRange(trackId, affectedClips, model) {
|
|
163
|
-
const track = model.findTrack(trackId);
|
|
164
|
-
if (!track) return null;
|
|
165
|
-
let minStartUs = Infinity;
|
|
166
|
-
let maxEndUs = 0;
|
|
167
|
-
let hasAffectedClips = false;
|
|
168
|
-
for (const clip of track.clips) {
|
|
169
|
-
if (affectedClips.has(clip.id)) {
|
|
170
|
-
hasAffectedClips = true;
|
|
171
|
-
minStartUs = Math.min(minStartUs, clip.startUs);
|
|
172
|
-
maxEndUs = Math.max(maxEndUs, clip.startUs + clip.durationUs);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
if (!hasAffectedClips) return null;
|
|
176
|
-
return {
|
|
177
|
-
trackId,
|
|
178
|
-
startUs: minStartUs,
|
|
179
|
-
endUs: maxEndUs,
|
|
180
|
-
reason: "clips_affected"
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
function mergeRanges(ranges) {
|
|
184
|
-
if (ranges.length <= 1) return ranges;
|
|
185
|
-
const trackGroups = /* @__PURE__ */ new Map();
|
|
186
|
-
for (const range of ranges) {
|
|
187
|
-
const group = trackGroups.get(range.trackId) || [];
|
|
188
|
-
group.push(range);
|
|
189
|
-
trackGroups.set(range.trackId, group);
|
|
190
|
-
}
|
|
191
|
-
const merged = [];
|
|
192
|
-
for (const [trackId, trackRanges] of trackGroups) {
|
|
193
|
-
trackRanges.sort((a, b) => a.startUs - b.startUs);
|
|
194
|
-
let current = trackRanges[0];
|
|
195
|
-
for (let i = 1; i < trackRanges.length; i++) {
|
|
196
|
-
const next = trackRanges[i];
|
|
197
|
-
if (next && current && next.startUs <= current.endUs + 1e3) {
|
|
198
|
-
current = {
|
|
199
|
-
trackId,
|
|
200
|
-
startUs: current.startUs,
|
|
201
|
-
endUs: Math.max(current.endUs, next.endUs),
|
|
202
|
-
reason: `${current.reason},${next.reason}`
|
|
203
|
-
};
|
|
204
|
-
} else {
|
|
205
|
-
if (current) {
|
|
206
|
-
merged.push(current);
|
|
207
|
-
}
|
|
208
|
-
current = next;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
if (current) {
|
|
212
|
-
merged.push(current);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
return merged;
|
|
216
|
-
}
|
|
217
|
-
export {
|
|
218
|
-
resolveDirtyRanges
|
|
219
|
-
};
|
|
220
|
-
//# sourceMappingURL=dirty-range.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dirty-range.js","sources":["../../src/model/dirty-range.ts"],"sourcesContent":["import { CompositionModel } from './CompositionModel';\nimport { CompositionPatch, PatchOperation, DirtyRange, TimeUs } from './types';\n\nexport function resolveDirtyRanges(patch: CompositionPatch, model: CompositionModel): DirtyRange[] {\n const affectedClips = new Set<string>();\n const affectedTracks = new Set<string>();\n const affectedResources = new Set<string>();\n\n // Collect affected elements\n for (const op of patch.operations) {\n collectAffectedElements(op, model, affectedClips, affectedTracks, affectedResources);\n }\n\n // Calculate time ranges per track\n return calculateTimeRanges(affectedClips, affectedTracks, affectedResources, model);\n}\n\nfunction collectAffectedElements(\n op: PatchOperation,\n model: CompositionModel,\n affectedClips: Set<string>,\n affectedTracks: Set<string>,\n affectedResources: Set<string>\n): void {\n switch (op.type) {\n // Track-level operations affect all clips in the track\n case 'addTrack':\n case 'removeTrack':\n case 'updateTrack': {\n const trackOp = op as any;\n if (trackOp.trackId) {\n affectedTracks.add(trackOp.trackId);\n // Collect all clips in this track\n const track = model.findTrack(trackOp.trackId);\n if (track) {\n track.clips.forEach((clip) => affectedClips.add(clip.id));\n }\n }\n break;\n }\n\n // Clip-level operations\n case 'addClip':\n case 'removeClip':\n case 'updateClip':\n case 'moveClip': {\n const clipOp = op as any;\n if (clipOp.clipId) {\n affectedClips.add(clipOp.clipId);\n }\n if (clipOp.trackId) {\n affectedTracks.add(clipOp.trackId);\n }\n if (clipOp.targetTrackId) {\n affectedTracks.add(clipOp.targetTrackId);\n }\n // Check for overlapping clips\n if (clipOp.clip) {\n collectOverlappingClips(\n model,\n clipOp.trackId,\n clipOp.clip.startUs || 0,\n (clipOp.clip.startUs || 0) + (clipOp.clip.durationUs || 0),\n affectedClips\n );\n }\n break;\n }\n\n // Resource changes affect all clips using that resource\n case 'addResource':\n case 'updateResource':\n case 'removeResource': {\n const resourceOp = op as any;\n affectedResources.add(resourceOp.resourceId);\n // Find all clips using this resource\n for (const track of model.tracks) {\n for (const clip of track.clips) {\n if (clip.resourceId === resourceOp.resourceId) {\n affectedClips.add(clip.id);\n affectedTracks.add(track.id);\n }\n }\n }\n break;\n }\n\n // Attachment operations\n case 'addAttachment':\n case 'updateAttachment':\n case 'removeAttachment': {\n const attachmentOp = op as any;\n if (attachmentOp.clipId) {\n affectedClips.add(attachmentOp.clipId);\n }\n if (attachmentOp.trackId) {\n affectedTracks.add(attachmentOp.trackId);\n }\n break;\n }\n\n // Transition operations\n case 'addTransition':\n case 'updateTransition':\n case 'removeTransition': {\n const transitionOp = op as any;\n if (transitionOp.clipId) {\n affectedClips.add(transitionOp.clipId);\n // Transitions might affect adjacent clips\n collectAdjacentClips(model, transitionOp.trackId, transitionOp.clipId, affectedClips);\n }\n if (transitionOp.trackId) {\n affectedTracks.add(transitionOp.trackId);\n }\n break;\n }\n\n // Effect operations\n case 'addEffect':\n case 'updateEffect':\n case 'removeEffect': {\n const effectOp = op as any;\n if (effectOp.targetType === 'track') {\n affectedTracks.add(effectOp.targetId);\n // Track effects affect all clips in the track\n const track = model.findTrack(effectOp.targetId);\n if (track) {\n track.clips.forEach((clip) => affectedClips.add(clip.id));\n }\n } else if (effectOp.targetType === 'clip') {\n affectedClips.add(effectOp.targetId);\n }\n break;\n }\n }\n}\n\nfunction collectOverlappingClips(\n model: CompositionModel,\n trackId: string,\n startUs: TimeUs,\n endUs: TimeUs,\n affectedClips: Set<string>\n): void {\n const track = model.findTrack(trackId);\n if (!track) return;\n\n // Use binary search to find overlapping clips efficiently\n const overlapping = model.getActiveClips(startUs, endUs);\n overlapping.forEach((clip) => affectedClips.add(clip.id));\n}\n\nfunction collectAdjacentClips(\n model: CompositionModel,\n trackId: string,\n clipId: string,\n affectedClips: Set<string>\n): void {\n const track = model.findTrack(trackId);\n if (!track) return;\n\n const clipIndex = track.clips.findIndex((c) => c.id === clipId);\n if (clipIndex === -1) return;\n\n // Add previous clip if exists\n const prevClip = track.clips[clipIndex - 1];\n if (clipIndex > 0 && prevClip) {\n affectedClips.add(prevClip.id);\n }\n\n // Add next clip if exists\n const nextClip = track.clips[clipIndex + 1];\n if (clipIndex < track.clips.length - 1 && nextClip) {\n affectedClips.add(nextClip.id);\n }\n}\n\nfunction calculateTimeRanges(\n affectedClips: Set<string>,\n affectedTracks: Set<string>,\n _affectedResources: Set<string>,\n model: CompositionModel\n): DirtyRange[] {\n const ranges: DirtyRange[] = [];\n const processedTracks = new Set<string>();\n\n // Process affected clips\n for (const clipId of affectedClips) {\n const clip = model.findClip(clipId);\n if (!clip) continue;\n\n // Find the track containing this clip\n for (const track of model.tracks) {\n if (track.clips.some((c) => c.id === clipId)) {\n if (!processedTracks.has(track.id)) {\n const range = calculateTrackDirtyRange(track.id, affectedClips, model);\n if (range) {\n ranges.push(range);\n processedTracks.add(track.id);\n }\n }\n break;\n }\n }\n }\n\n // Process tracks that were directly affected but haven't been processed yet\n for (const trackId of affectedTracks) {\n if (!processedTracks.has(trackId)) {\n const track = model.findTrack(trackId);\n if (track) {\n ranges.push({\n trackId,\n startUs: 0,\n endUs: model.getTrackDuration(trackId),\n reason: 'track_operation',\n });\n processedTracks.add(trackId);\n }\n }\n }\n\n return mergeRanges(ranges);\n}\n\nfunction calculateTrackDirtyRange(\n trackId: string,\n affectedClips: Set<string>,\n model: CompositionModel\n): DirtyRange | null {\n const track = model.findTrack(trackId);\n if (!track) return null;\n\n let minStartUs = Infinity;\n let maxEndUs = 0;\n let hasAffectedClips = false;\n\n for (const clip of track.clips) {\n if (affectedClips.has(clip.id)) {\n hasAffectedClips = true;\n minStartUs = Math.min(minStartUs, clip.startUs);\n maxEndUs = Math.max(maxEndUs, clip.startUs + clip.durationUs);\n }\n }\n\n if (!hasAffectedClips) return null;\n\n return {\n trackId,\n startUs: minStartUs,\n endUs: maxEndUs,\n reason: 'clips_affected',\n };\n}\n\nfunction mergeRanges(ranges: DirtyRange[]): DirtyRange[] {\n if (ranges.length <= 1) return ranges;\n\n // Group by trackId\n const trackGroups = new Map<string, DirtyRange[]>();\n for (const range of ranges) {\n const group = trackGroups.get(range.trackId) || [];\n group.push(range);\n trackGroups.set(range.trackId, group);\n }\n\n // Merge overlapping ranges within each track\n const merged: DirtyRange[] = [];\n for (const [trackId, trackRanges] of trackGroups) {\n trackRanges.sort((a, b) => a.startUs - b.startUs);\n\n let current = trackRanges[0];\n for (let i = 1; i < trackRanges.length; i++) {\n const next = trackRanges[i];\n // Merge if overlapping or adjacent (within 1ms)\n if (next && current && next.startUs <= current.endUs + 1000) {\n current = {\n trackId,\n startUs: current.startUs,\n endUs: Math.max(current.endUs, next.endUs),\n reason: `${current.reason},${next.reason}`,\n };\n } else {\n if (current) {\n merged.push(current);\n }\n current = next;\n }\n }\n if (current) {\n merged.push(current);\n }\n }\n\n return merged;\n}\n"],"names":[],"mappings":"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"}
|