@pixi-ui-editor/schema 0.20.0 → 0.22.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.
@@ -1 +1 @@
1
- {"version":3,"file":"prefabs.d.ts","sourceRoot":"","sources":["../src/prefabs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prefabs.d.ts","sourceRoot":"","sources":["../src/prefabs.ts"],"names":[],"mappings":"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"}
package/dist/prefabs.js CHANGED
@@ -293,24 +293,58 @@ export function applyPrefabInstanceConfiguration(document, instance) {
293
293
  if (prefab === undefined)
294
294
  return false;
295
295
  const definitionNodes = new Map(prefab.nodes.map((node) => [node.id, node]));
296
+ const baseNodes = resolvePrefabInstanceBaseNodes(document, instance);
297
+ const localNodes = instance.locallyAddedNodes ?? [];
298
+ const localsById = new Map(localNodes.map((node) => [node.id, node]));
299
+ /**
300
+ * Inspector edits semantic references in the materialized scene address space. Applying an
301
+ * instance moves those values back into a reusable definition, where the outer instance segment
302
+ * no longer exists. Keep local stable IDs, but turn
303
+ * `sceneInstance::prefab-node::definitionNode` back into `definitionNode` (or into an address
304
+ * relative to the nested persisted instance which receives the value). A scene-only target has no
305
+ * meaning in the definition and is dropped instead of making the whole document invalid.
306
+ */
307
+ const rewriteAppliedAddress = (address, destinationPrefix = "") => {
308
+ if (localsById.has(address))
309
+ return address;
310
+ const parsed = parseMaterializedPrefabNodeId(address);
311
+ if (parsed !== undefined && parsed.instanceId !== instance.id) {
312
+ // A locally added prefab instance keeps owning its own materialized address space after Apply.
313
+ return localsById.has(parsed.instanceId) ? address : undefined;
314
+ }
315
+ let relative = parsed?.nodePath ?? address;
316
+ if (destinationPrefix !== "") {
317
+ const prefix = `${destinationPrefix}${PREFAB_NODE_PATH_SEPARATOR}`;
318
+ if (!relative.startsWith(prefix))
319
+ return undefined;
320
+ relative = relative.slice(prefix.length);
321
+ }
322
+ const sourceAddress = composePrefabNodePath(destinationPrefix, relative);
323
+ return baseNodes.has(sourceAddress) ? relative : undefined;
324
+ };
325
+ const rewritePatch = (override, destinationPrefix) => {
326
+ const copy = structuredClone(override);
327
+ const holder = { propertyOverrides: [copy] };
328
+ rewritePrefabInstanceReferencePatches(holder, (address) => rewriteAppliedAddress(address, destinationPrefix));
329
+ return copy;
330
+ };
296
331
  for (const override of instance.propertyOverrides ?? []) {
297
332
  const [definitionNodeId, ...nestedPath] = splitNodePath(override.nodeId);
298
333
  const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);
299
334
  if (definitionNode === undefined)
300
335
  return false;
336
+ const appliedOverride = rewritePatch(override, nestedPath.length === 0 ? "" : definitionNodeId);
301
337
  if (nestedPath.length === 0) {
302
- const patched = applyPrefabNodePatch(definitionNode, override.patch);
338
+ const patched = applyPrefabNodePatch(definitionNode, appliedOverride.patch);
303
339
  const mutableDefinitionNode = definitionNode;
304
340
  for (const key of Object.keys(mutableDefinitionNode))
305
341
  delete mutableDefinitionNode[key];
306
342
  Object.assign(mutableDefinitionNode, patched);
307
343
  continue;
308
344
  }
309
- if (definitionNode.type !== "prefab-instance" || !storeNestedOverride(document, definitionNode, nestedPath.join(PREFAB_NODE_PATH_SEPARATOR), override.patch))
345
+ if (definitionNode.type !== "prefab-instance" || !storeNestedOverride(document, definitionNode, nestedPath.join(PREFAB_NODE_PATH_SEPARATOR), appliedOverride.patch))
310
346
  return false;
311
347
  }
312
- const localNodes = instance.locallyAddedNodes ?? [];
313
- const localsById = new Map(localNodes.map((node) => [node.id, node]));
314
348
  const destinations = new Map();
315
349
  const destinationOf = (node) => {
316
350
  const cached = destinations.get(node.id);
@@ -329,7 +363,7 @@ export function applyPrefabInstanceConfiguration(document, instance) {
329
363
  if (definitionNode === undefined)
330
364
  return undefined;
331
365
  if (definitionNode.type === "prefab-instance") {
332
- const destination = { instance: definitionNode, prefix: nestedPath.join(PREFAB_NODE_PATH_SEPARATOR) };
366
+ const destination = { instance: definitionNode, prefix: nestedPath.join(PREFAB_NODE_PATH_SEPARATOR), ownerPrefix: definitionNodeId };
333
367
  destinations.set(node.id, destination);
334
368
  return destination;
335
369
  }
@@ -343,6 +377,11 @@ export function applyPrefabInstanceConfiguration(document, instance) {
343
377
  if (destination === undefined)
344
378
  return false;
345
379
  const copy = structuredClone(local);
380
+ const destinationPrefix = "instance" in destination ? destination.ownerPrefix : "";
381
+ rewriteNodeReferences(copy, (address) => rewriteAppliedAddress(address, destinationPrefix));
382
+ if (copy.type === "prefab-instance") {
383
+ rewritePrefabInstanceReferencePatches(copy, (address) => rewriteAppliedAddress(address, destinationPrefix));
384
+ }
346
385
  const parentIsLocal = copy.parentId !== null && localsById.has(copy.parentId);
347
386
  if ("instance" in destination) {
348
387
  if (!parentIsLocal)
@@ -1 +1 @@
1
- {"version":3,"file":"prefabs.js","sourceRoot":"","sources":["../src/prefabs.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PrefabDefinition, PrefabNodeOverride, ProjectDocument, UINode } from \"./index.js\";\nimport { collectBindingKeys, collectBindingKeyScopes } from \"./bindingKeys.js\";\nimport { rewriteNodeReferences, rewritePrefabInstanceReferencePatches } from \"./nodeReferences.js\";\n\r\nconst STRUCTURAL_OVERRIDE_KEYS = new Set([\"id\", \"type\", \"parentId\", \"children\", \"editorOnly\", \"locked\", \"prefabId\", \"propertyOverrides\", \"locallyAddedNodes\"]);\r\n\r\n/**\r\n * Разделитель сегментов адреса внутри инстанса пресета.\r\n *\r\n * Адрес — это путь по вложенным пресетам: `defA` — узел определения самого инстанса,\r\n * `defA::prefab-node::defB` — узел `defB` внутри инстанса `defA`, вложенного в определение. Документ\r\n * до вложенных пресетов хранил ровно один сегмент, поэтому старые адреса остаются валидными путями.\r\n */\r\nexport const PREFAB_NODE_PATH_SEPARATOR = \"::prefab-node::\";\r\n\r\nexport type PrefabInstanceNode = Extract<UINode, { type: \"prefab-instance\" }>;\r\n\r\n/**\r\n * Откуда взялся узел развёрнутого инстанса.\r\n *\r\n * `instanceId` всегда указывает на **персистентный** узел-инстанс: сцену/пресет-владельца или\r\n * локально добавленный инстанс. Именно в нём хранятся `propertyOverrides` и `locallyAddedNodes` для\r\n * этого узла. `inherited` — часть структуры пресета: её можно переопределить по свойствам (patch\r\n * адресуется `nodePath`), но нельзя удалить или перенести. `local` — обычный редактируемый узел.\r\n */\r\nexport type MaterializedPrefabNodeOrigin =\r\n | { kind: \"inherited\"; instanceId: string; nodePath: string }\r\n | { kind: \"local\"; instanceId: string; localNodeId: string };\r\n\r\nexport type MaterializedPrefab = {\r\n rootNodeIds: string[];\r\n nodes: UINode[];\r\n origins: Map<string, MaterializedPrefabNodeOrigin>;\r\n};\r\n\r\nexport function materializedPrefabNodeId(instanceId: string, nodePath: string): string {\r\n return `${instanceId}${PREFAB_NODE_PATH_SEPARATOR}${nodePath}`;\r\n}\r\n\r\n/** Первый разделитель отделяет персистентный инстанс от адреса узла внутри него. */\r\nexport function parseMaterializedPrefabNodeId(id: string): { instanceId: string; nodePath: string } | undefined {\r\n const separator = id.indexOf(PREFAB_NODE_PATH_SEPARATOR);\r\n if (separator < 0) return undefined;\r\n return { instanceId: id.slice(0, separator), nodePath: id.slice(separator + PREFAB_NODE_PATH_SEPARATOR.length) };\r\n}\r\n\r\n/** Склеивает адрес узла с адресом инстанса, внутри которого он объявлен. */\r\nexport function composePrefabNodePath(prefix: string, address: string): string {\r\n return prefix === \"\" ? address : `${prefix}${PREFAB_NODE_PATH_SEPARATOR}${address}`;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\n/** Applies a persisted sparse patch without allowing prefab hierarchy identity to change. */\r\nexport function applyPrefabNodePatch(base: UINode, patch: Readonly<Record<string, unknown>>): UINode {\r\n const merge = (current: unknown, next: unknown, root = false): unknown => {\r\n if (!isRecord(next)) return structuredClone(next);\r\n const result: Record<string, unknown> = isRecord(current) ? structuredClone(current) : {};\r\n for (const [key, value] of Object.entries(next)) {\r\n if (root && STRUCTURAL_OVERRIDE_KEYS.has(key)) continue;\r\n if (value === null) delete result[key];\r\n else result[key] = isRecord(value) ? merge(result[key], value) : structuredClone(value);\r\n }\r\n return result;\r\n };\r\n return merge(base, patch, true) as UINode;\r\n}\r\n\r\n/** Produces the smallest deterministic merge patch used by instance property overrides. */\r\nexport function createPrefabNodePatch(base: UINode, effective: UINode): Record<string, unknown> {\r\n const diff = (before: unknown, after: unknown, root = false): unknown => {\r\n if (Object.is(before, after)) return undefined;\r\n if (!isRecord(before) || !isRecord(after)) return structuredClone(after);\r\n const patch: Record<string, unknown> = {};\r\n const keys = new Set([...Object.keys(before), ...Object.keys(after)]);\r\n for (const key of [...keys].sort()) {\r\n if (root && STRUCTURAL_OVERRIDE_KEYS.has(key)) continue;\r\n if (!Object.hasOwn(after, key)) patch[key] = null;\r\n else {\r\n const value = diff(before[key], after[key]);\r\n if (value !== undefined) patch[key] = value;\r\n }\r\n }\r\n return Object.keys(patch).length === 0 ? undefined : patch;\r\n };\r\n return (diff(base, effective, true) as Record<string, unknown> | undefined) ?? {};\r\n}\r\n\r\n/** Один слой property overrides, адресованный в пространстве адресов персистентного инстанса. */\r\ntype PatchLayer = ReadonlyMap<string, Readonly<Record<string, unknown>>>;\r\n\r\n/**\r\n * Разворачивает один персистентный инстанс во все его узлы, включая вложенные пресеты.\r\n *\r\n * Приоритет патчей — как у Unity: чем ближе инстанс к сцене, тем он старше. Слои идут от владельца\r\n * (индекс 0) к самым глубоким определениям, поэтому применяются в обратном порядке.\r\n */\r\nfunction materializeInstance(\r\n document: ProjectDocument,\r\n instance: PrefabInstanceNode,\r\n expandingPrefabIds: ReadonlySet<string>,\r\n applyInstanceOverrides: boolean,\r\n): MaterializedPrefab | undefined {\r\n const rootPrefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (rootPrefab === undefined) return undefined;\r\n\r\n const ownerId = instance.id;\r\n const localNodes = instance.locallyAddedNodes ?? [];\r\n const editableLocalIds = new Set(localNodes.map((node) => node.id));\r\n // Локальный узел персистентен сам по себе, поэтому сохраняет собственный stable ID; всё\r\n // унаследованное получает ID, привязанный к инстансу, чтобы два инстанса не конфликтовали.\r\n const idOf = (address: string): string => (editableLocalIds.has(address) ? address : materializedPrefabNodeId(ownerId, address));\r\n\r\n const nodes: UINode[] = [];\r\n const nodesById = new Map<string, UINode>();\r\n const origins = new Map<string, MaterializedPrefabNodeOrigin>();\r\n\r\n const emit = (source: UINode, effective: UINode, prefix: string, address: string, origin: MaterializedPrefabNodeOrigin): void => {\r\n const id = idOf(address);\r\n const node = {\r\n ...structuredClone(effective),\r\n id,\r\n parentId: source.parentId === null\r\n ? (prefix === \"\" ? null : idOf(prefix))\r\n : idOf(composePrefabNodePath(prefix, source.parentId)),\r\n children: source.children.map((childId) => idOf(composePrefabNodePath(prefix, childId))),\r\n } as UINode;\r\n nodes.push(node);\r\n nodesById.set(id, node);\r\n origins.set(id, origin);\r\n };\r\n\r\n const patched = (base: UINode, address: string, layers: readonly PatchLayer[]): UINode => {\r\n let effective = base;\r\n for (let index = layers.length - 1; index >= 0; index -= 1) {\r\n const patch = layers[index]!.get(address);\r\n if (patch !== undefined) effective = applyPrefabNodePatch(effective, patch);\r\n }\r\n return effective;\r\n };\r\n\r\n const layerOf = (node: PrefabInstanceNode, prefix: string): PatchLayer =>\r\n new Map((node.propertyOverrides ?? []).map((override) => [composePrefabNodePath(prefix, override.nodeId), override.patch] as const));\r\n\r\n /**\r\n * Разворачивает локально добавленный инстанс: он персистентен и владеет собственной конфигурацией.\r\n *\r\n * Развёртка начинается с чистого набора: бесконечной иерархия становится только если определение\r\n * пресета содержит само себя, а локальное добавление — конечные данные документа. Инстанс пресета\r\n * внутри развёртки того же пресета поэтому допустим, как и в Unity.\r\n */\r\n const mergeOwnedInstance = (local: PrefabInstanceNode): void => {\r\n const sub = materializeInstance(document, local, new Set(), true);\r\n if (sub === undefined) return;\r\n const host = nodesById.get(local.id);\r\n for (const subNode of sub.nodes) {\r\n if (subNode.parentId === null) subNode.parentId = local.id;\r\n nodes.push(subNode);\r\n nodesById.set(subNode.id, subNode);\r\n }\r\n sub.origins.forEach((origin, id) => origins.set(id, origin));\r\n if (host === undefined) return;\r\n for (const rootId of sub.rootNodeIds) if (!host.children.includes(rootId)) host.children.push(rootId);\r\n };\r\n\r\n const expandContent = (host: PrefabInstanceNode, prefix: string, layers: readonly PatchLayer[], expanding: ReadonlySet<string>): void => {\r\n const prefab = document.prefabs.find((candidate) => candidate.id === host.prefabId);\r\n const expandable = prefab !== undefined && !expanding.has(prefab.id);\r\n const nextExpanding = prefab === undefined ? expanding : new Set([...expanding, prefab.id]);\r\n const nested: { node: PrefabInstanceNode; address: string }[] = [];\r\n\r\n if (expandable) {\r\n for (const definitionNode of prefab.nodes) {\r\n const address = composePrefabNodePath(prefix, definitionNode.id);\r\n emit(definitionNode, patched(definitionNode, address, layers), prefix, address, { kind: \"inherited\", instanceId: ownerId, nodePath: address });\r\n if (definitionNode.type === \"prefab-instance\") nested.push({ node: definitionNode, address });\r\n }\r\n // Корни определения становятся детьми самого узла-инстанса; на верхнем уровне их забирает владелец.\r\n const hostNode = prefix === \"\" ? undefined : nodesById.get(idOf(prefix));\r\n if (hostNode !== undefined) {\r\n for (const rootId of prefab.rootNodeIds) {\r\n const childId = idOf(composePrefabNodePath(prefix, rootId));\r\n if (nodesById.has(childId) && !hostNode.children.includes(childId)) hostNode.children.push(childId);\r\n }\r\n }\r\n for (const item of nested) expandContent(item.node, item.address, [...layers, layerOf(item.node, item.address)], nextExpanding);\r\n nested.length = 0;\r\n }\r\n\r\n // Локальные добавления владельца редактируемы; те, что пришли из определения, унаследованы.\r\n const editable = prefix === \"\";\r\n for (const local of host.locallyAddedNodes ?? []) {\r\n const address = composePrefabNodePath(prefix, local.id);\r\n emit(local, editable ? local : patched(local, address, layers), prefix, address, editable\r\n ? { kind: \"local\", instanceId: ownerId, localNodeId: local.id }\r\n : { kind: \"inherited\", instanceId: ownerId, nodePath: address });\r\n if (local.type !== \"prefab-instance\") continue;\r\n if (editable) mergeOwnedInstance(local);\r\n else nested.push({ node: local, address });\r\n }\r\n for (const item of nested) expandContent(item.node, item.address, [...layers, layerOf(item.node, item.address)], nextExpanding);\r\n };\r\n\r\n expandContent(instance, \"\", [applyInstanceOverrides ? layerOf(instance, \"\") : new Map()], expandingPrefabIds);\r\n\r\n // Единая до-привязка: локальные узлы и корни вложенных развёрток попадают в children родителя,\r\n // если тот их ещё не перечисляет. Порядок повторяет порядок выпуска узлов: сначала структура\r\n // определения, затем локальные добавления от самого глубокого пресета к сцене.\r\n for (const node of nodes) {\n if (node.parentId === null) continue;\n const parent = nodesById.get(node.parentId);\n if (parent !== undefined && !parent.children.includes(node.id)) parent.children.push(node.id);\n }\n\n // Semantic references authored inside a reusable definition are relative to that definition.\n // Materialization gives all their targets the same instance-scoped IDs as the hierarchy itself.\n const idByAddress = new Map<string, string>();\n origins.forEach((origin, id) => {\n if (origin.kind === \"inherited\" && origin.instanceId === ownerId) idByAddress.set(origin.nodePath, id);\n });\n for (const node of nodes) {\n const origin = origins.get(node.id);\n const ownPath = origin?.kind === \"inherited\" ? origin.nodePath : \"\";\n const ownSegments = ownPath === \"\" ? [] : splitNodePath(ownPath);\n const prefix = ownSegments.slice(0, -1).join(PREFAB_NODE_PATH_SEPARATOR);\n rewriteNodeReferences(node, (targetNodeId) => nodesById.has(targetNodeId)\n ? targetNodeId\n : idByAddress.get(composePrefabNodePath(prefix, targetNodeId)) ?? idByAddress.get(targetNodeId) ?? targetNodeId);\n }\n\r\n return {\r\n rootNodeIds: [\r\n ...rootPrefab.rootNodeIds.map((id) => idOf(id)).filter((id) => nodesById.has(id)),\r\n ...localNodes.filter((node) => node.parentId === null).map((node) => node.id),\r\n ],\r\n nodes,\r\n origins,\r\n };\r\n}\r\n\r\nexport function materializePrefabInstance(document: ProjectDocument, instance: PrefabInstanceNode): MaterializedPrefab | undefined {\r\n return materializeInstance(document, instance, new Set(), true);\r\n}\r\n\r\n/**\r\n * Узлы инстанса до применения его собственных property overrides, по адресам.\r\n *\r\n * Это «база» для нормализации и валидации: она уже включает конфигурацию вложенных инстансов,\r\n * записанную в определениях пресетов, поэтому override, повторяющий её значение, схлопывается.\r\n */\r\nexport function resolvePrefabInstanceBaseNodes(document: ProjectDocument, instance: PrefabInstanceNode): Map<string, UINode> {\r\n const base = new Map<string, UINode>();\r\n const materialized = materializeInstance(document, instance, new Set(), false);\r\n if (materialized === undefined) return base;\r\n for (const node of materialized.nodes) {\r\n const origin = materialized.origins.get(node.id);\r\n if (origin?.kind === \"inherited\" && origin.instanceId === instance.id) base.set(origin.nodePath, node);\r\n }\r\n return base;\r\n}\r\n\r\nexport function normalizePrefabNodeOverrides(document: ProjectDocument, instance: PrefabInstanceNode): void {\r\n const base = resolvePrefabInstanceBaseNodes(document, instance);\r\n const normalized: PrefabNodeOverride[] = [];\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const baseNode = base.get(override.nodeId);\r\n if (baseNode === undefined) {\r\n normalized.push(override);\r\n continue;\r\n }\r\n const patch = createPrefabNodePatch(baseNode, applyPrefabNodePatch(baseNode, override.patch));\r\n if (Object.keys(patch).length > 0) normalized.push({ nodeId: override.nodeId, patch });\r\n }\r\n if (normalized.length === 0) delete instance.propertyOverrides;\r\n else instance.propertyOverrides = normalized;\r\n if (instance.locallyAddedNodes?.length === 0) delete instance.locallyAddedNodes;\r\n}\r\n\r\nfunction splitNodePath(path: string): string[] {\r\n return path.split(PREFAB_NODE_PATH_SEPARATOR);\r\n}\r\n\r\nfunction storeNestedOverride(document: ProjectDocument, instance: PrefabInstanceNode, nodePath: string, patch: Readonly<Record<string, unknown>>): boolean {\r\n const base = resolvePrefabInstanceBaseNodes(document, instance).get(nodePath);\r\n if (base === undefined) return false;\r\n const overrides = instance.propertyOverrides ??= [];\r\n const existing = overrides.find((candidate) => candidate.nodeId === nodePath);\r\n const effective = applyPrefabNodePatch(existing === undefined ? base : applyPrefabNodePatch(base, existing.patch), patch);\r\n const mergedPatch = createPrefabNodePatch(base, effective);\r\n if (Object.keys(mergedPatch).length === 0) {\r\n if (existing !== undefined) overrides.splice(overrides.indexOf(existing), 1);\r\n } else if (existing === undefined) overrides.push({ nodeId: nodePath, patch: mergedPatch });\r\n else existing.patch = mergedPatch;\r\n if (overrides.length === 0) delete instance.propertyOverrides;\r\n return true;\r\n}\r\n\r\ntype LocalDestination = { prefab: PrefabDefinition } | { instance: PrefabInstanceNode; prefix: string };\r\n\r\n/**\r\n * Переносит конфигурацию инстанса (overrides и локально добавленные узлы) в его определение.\r\n *\r\n * Прямые overrides переписывают узлы определения, вложенные — становятся конфигурацией того\r\n * persisted-инстанса, к которому относятся, а локальные поддеревья переезжают целиком, сохраняя\r\n * stable ID. Сам инстанс после успешного переноса теряет конфигурацию: она уже в определении.\r\n *\r\n * Это же преобразование лежит в основе распаковки инстанса (`unpackPrefabInstances`): там оно\r\n * применяется к одноразовой копии определения, которая потом встраивается в сцену как обычные узлы.\r\n */\r\nexport function applyPrefabInstanceConfiguration(document: ProjectDocument, instance: PrefabInstanceNode): boolean {\r\n const prefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (prefab === undefined) return false;\r\n const definitionNodes = new Map(prefab.nodes.map((node) => [node.id, node]));\r\n\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const [definitionNodeId, ...nestedPath] = splitNodePath(override.nodeId);\r\n const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);\r\n if (definitionNode === undefined) return false;\r\n if (nestedPath.length === 0) {\r\n const patched = applyPrefabNodePatch(definitionNode, override.patch);\r\n const mutableDefinitionNode = definitionNode as unknown as Record<string, unknown>;\r\n for (const key of Object.keys(mutableDefinitionNode)) delete mutableDefinitionNode[key];\r\n Object.assign(mutableDefinitionNode, patched);\r\n continue;\r\n }\r\n if (definitionNode.type !== \"prefab-instance\" || !storeNestedOverride(document, definitionNode, nestedPath.join(PREFAB_NODE_PATH_SEPARATOR), override.patch)) return false;\r\n }\r\n\r\n const localNodes = instance.locallyAddedNodes ?? [];\r\n const localsById = new Map(localNodes.map((node) => [node.id, node]));\r\n const destinations = new Map<string, LocalDestination>();\r\n const destinationOf = (node: UINode): LocalDestination | undefined => {\r\n const cached = destinations.get(node.id);\r\n if (cached !== undefined) return cached;\r\n const localParent = node.parentId === null ? undefined : localsById.get(node.parentId);\r\n if (localParent !== undefined) {\r\n const destination = destinationOf(localParent);\r\n if (destination !== undefined) destinations.set(node.id, destination);\r\n return destination;\r\n }\r\n if (node.parentId !== null) {\r\n const [definitionNodeId, ...nestedPath] = splitNodePath(node.parentId);\r\n const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);\r\n if (definitionNode === undefined) return undefined;\r\n if (definitionNode.type === \"prefab-instance\") {\r\n const destination = { instance: definitionNode, prefix: nestedPath.join(PREFAB_NODE_PATH_SEPARATOR) };\r\n destinations.set(node.id, destination);\r\n return destination;\r\n }\r\n }\r\n const destination = { prefab };\r\n destinations.set(node.id, destination);\r\n return destination;\r\n };\r\n\r\n for (const local of localNodes) {\r\n const destination = destinationOf(local);\r\n if (destination === undefined) return false;\r\n const copy = structuredClone(local);\r\n const parentIsLocal = copy.parentId !== null && localsById.has(copy.parentId);\r\n if (\"instance\" in destination) {\r\n if (!parentIsLocal) copy.parentId = destination.prefix === \"\" ? null : destination.prefix;\r\n (destination.instance.locallyAddedNodes ??= []).push(copy);\r\n continue;\r\n }\r\n destination.prefab.nodes.push(copy);\r\n definitionNodes.set(copy.id, copy);\r\n if (parentIsLocal) continue;\r\n if (copy.parentId === null) destination.prefab.rootNodeIds.push(copy.id);\r\n else {\r\n const parent = definitionNodes.get(copy.parentId);\r\n if (parent === undefined) return false;\r\n if (!parent.children.includes(copy.id)) parent.children.push(copy.id);\r\n }\r\n }\r\n\r\n delete instance.propertyOverrides;\r\n delete instance.locallyAddedNodes;\r\n return true;\r\n}\r\n\r\n/** Обходит все персистентные инстансы владельца, включая локально добавленные. */\r\nexport function forEachPrefabInstanceInOwner(owner: { readonly nodes: readonly UINode[] }, visit: (instance: PrefabInstanceNode) => void): void {\r\n const walk = (nodes: readonly UINode[]): void => {\r\n for (const node of nodes) {\r\n if (node.type !== \"prefab-instance\") continue;\r\n visit(node);\r\n walk(node.locallyAddedNodes ?? []);\r\n }\r\n };\r\n walk(owner.nodes);\r\n}\r\n\r\nexport function forEachPrefabInstance(document: ProjectDocument, visit: (instance: PrefabInstanceNode) => void): void {\r\n for (const owner of [...document.scenes, ...document.prefabs]) forEachPrefabInstanceInOwner(owner, visit);\r\n}\r\n\r\nexport function findPrefabInstanceInOwner(owner: { readonly nodes: readonly UINode[] }, instanceId: string): PrefabInstanceNode | undefined {\r\n let found: PrefabInstanceNode | undefined;\r\n forEachPrefabInstanceInOwner(owner, (instance) => {\r\n if (found === undefined && instance.id === instanceId) found = instance;\r\n });\r\n return found;\r\n}\r\n\r\nexport function findPrefabInstance(document: ProjectDocument, instanceId: string): PrefabInstanceNode | undefined {\r\n for (const owner of [...document.scenes, ...document.prefabs]) {\r\n const instance = findPrefabInstanceInOwner(owner, instanceId);\r\n if (instance !== undefined) return instance;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Ссылается ли пресет на другой — сам собой или через любую цепочку вложенных инстансов.\r\n *\r\n * Так проверяется рекурсия: вставлять инстанс пресета туда, где он уже раскрывается, нельзя, иначе\r\n * иерархия стала бы бесконечной.\r\n */\r\nexport function prefabReferencesPrefab(document: ProjectDocument, prefabId: string, searchedPrefabId: string): boolean {\r\n const visited = new Set<string>();\r\n const visit = (id: string): boolean => {\r\n if (id === searchedPrefabId) return true;\r\n if (visited.has(id)) return false;\r\n visited.add(id);\r\n const prefab = document.prefabs.find((candidate) => candidate.id === id);\r\n if (prefab === undefined) return false;\r\n let found = false;\r\n forEachPrefabInstanceInOwner(prefab, (instance) => { found ||= visit(instance.prefabId); });\r\n return found;\r\n };\r\n return visit(prefabId);\r\n}\r\n\r\n/** Сколько раз пресет используется в документе, включая вложенные и локально добавленные инстансы. */\r\nexport function countPrefabInstances(document: ProjectDocument, prefabId: string): number {\r\n let count = 0;\r\n forEachPrefabInstance(document, (instance) => {\r\n if (instance.prefabId === prefabId) count += 1;\r\n });\r\n return count;\r\n}\r\n\r\n/**\r\n * Плоский граф авторинга владельца: его собственные узлы плюс развёрнутые поддеревья всех инстансов.\r\n *\r\n * Единственный резолвер иерархии: им пользуются и редактор (иерархия, selection, gizmos), и runtime\r\n * (сборка Pixi-дерева, сбор ассетов), поэтому расхождений между ними быть не может.\r\n */\r\ntype InstanceLocation = { nodes: UINode[]; instance: PrefabInstanceNode };\r\n\r\n/** Все персистентные инстансы пресета вместе с массивом узлов, в котором каждый из них лежит. */\r\nfunction locatePrefabInstances(document: ProjectDocument, prefabId: string): InstanceLocation[] {\r\n const found: InstanceLocation[] = [];\r\n const walk = (nodes: UINode[]): void => {\r\n for (const node of nodes) {\r\n if (node.type !== \"prefab-instance\") continue;\r\n if (node.prefabId === prefabId) found.push({ nodes, instance: node });\r\n walk(node.locallyAddedNodes ?? []);\r\n }\r\n };\r\n for (const owner of [...document.scenes, ...document.prefabs]) walk(owner.nodes);\r\n return found;\r\n}\r\n\r\n/**\r\n * Заменяет один инстанс обычным контейнером с тем же id, transform и содержимым.\r\n *\r\n * Развёртка идёт через одноразовую копию определения: конфигурация инстанса переносится в неё тем же\r\n * `applyPrefabInstanceConfiguration`, что и «Apply to preset», после чего узлы копии получают свежие\r\n * stable ID и встают на место инстанса. Вложенные инстансы других пресетов остаются инстансами и\r\n * сохраняют свою конфигурацию — распаковывается ровно один слой.\r\n *\r\n * Возвращает соответствие «адрес узла внутри инстанса → новый id узла»: по нему переписываются\r\n * адреса, которыми на это содержимое ссылались инстансы пресета-владельца.\r\n */\r\nfunction unpackInstance(document: ProjectDocument, location: InstanceLocation, createId: () => string): { idByAddress: Map<string, string>; inserted: UINode[] } | undefined {\r\n const { nodes, instance } = location;\r\n const prefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (prefab === undefined) return undefined;\r\n\r\n const draftPrefab: PrefabDefinition = { ...structuredClone(prefab), id: createId() };\r\n const draftInstance = structuredClone(instance);\r\n draftInstance.prefabId = draftPrefab.id;\r\n document.prefabs.push(draftPrefab);\r\n const applied = applyPrefabInstanceConfiguration(document, draftInstance);\r\n document.prefabs.splice(document.prefabs.indexOf(draftPrefab), 1);\r\n if (!applied) return undefined;\r\n\r\n const idByAddress = new Map(draftPrefab.nodes.map((node) => [node.id, createId()] as const));\r\n const remap = (address: string): string => idByAddress.get(address) ?? address;\r\n for (const node of draftPrefab.nodes) {\n node.id = remap(node.id);\n node.children = node.children.map(remap);\n node.parentId = node.parentId === null ? instance.id : remap(node.parentId);\n rewriteNodeReferences(node, remap);\n }\n\r\n const { prefabId: _prefabId, propertyOverrides: _overrides, locallyAddedNodes: _locals, ...base } = instance;\r\n const container = { ...structuredClone(base), type: \"container\", children: draftPrefab.rootNodeIds.map(remap) } as UINode;\r\n nodes.splice(nodes.indexOf(instance), 1, container, ...draftPrefab.nodes);\r\n return { idByAddress, inserted: draftPrefab.nodes };\r\n}\r\n\r\n/**\r\n * Переписывает адреса, которые вели внутрь распакованного инстанса.\r\n *\r\n * Инстанс мог лежать в определении пресета, и тогда его содержимое было адресуемо снаружи как\r\n * `…::instanceId::prefab-node::address`. После распаковки этот узел — обычная нода владельца, поэтому\r\n * оба сегмента схлопываются в её новый id. Адрес самого инстанса не меняется: контейнер сохранил id.\r\n */\r\nfunction rewriteUnpackedAddresses(document: ProjectDocument, instanceId: string, idByAddress: ReadonlyMap<string, string>): void {\n const rewrite = (path: string): string => {\r\n const segments = splitNodePath(path);\r\n const index = segments.indexOf(instanceId);\r\n const inner = index < 0 ? undefined : segments[index + 1];\r\n const mapped = inner === undefined ? undefined : idByAddress.get(inner);\r\n if (mapped === undefined) return path;\r\n return [...segments.slice(0, index), mapped, ...segments.slice(index + 2)].join(PREFAB_NODE_PATH_SEPARATOR);\r\n };\n forEachPrefabInstance(document, (instance) => {\n for (const override of instance.propertyOverrides ?? []) override.nodeId = rewrite(override.nodeId);\n rewritePrefabInstanceReferencePatches(instance, rewrite);\n for (const local of instance.locallyAddedNodes ?? []) if (local.parentId !== null) local.parentId = rewrite(local.parentId);\n for (const local of instance.locallyAddedNodes ?? []) rewriteNodeReferences(local, rewrite);\n });\n}\r\n\r\n/**\r\n * Снимает binding-ключи, которые распаковка размножила в одной области разрешения.\r\n *\r\n * Внутри инстанса ключ принадлежал области этого инстанса, поэтому один и тот же пресет мог стоять на\r\n * сцене сколько угодно раз. Распакованные узлы попадают в область владельца, где ключ обязан быть\r\n * уникальным, поэтому конфликт разрешается в пользу узла, который существовал до распаковки, а среди\r\n * одних только новых узлов — в пользу первого.\r\n */\r\nfunction dropDuplicateBindingKeys(document: ProjectDocument, unpackedNodes: ReadonlyMap<string, UINode>): string[] {\r\n const dropped: string[] = [];\r\n for (const owner of [...document.scenes, ...document.prefabs]) {\r\n const graph = resolveOwnerNodeGraph(document, owner);\r\n for (const scopeNodes of collectBindingKeyScopes(graph).values()) {\r\n for (const [key, nodeIds] of collectBindingKeys(scopeNodes)) {\r\n if (key === \"\" || nodeIds.length <= 1) continue;\r\n const unpacked = nodeIds.filter((id) => unpackedNodes.has(id));\r\n const victims = unpacked.length === nodeIds.length ? unpacked.slice(1) : unpacked;\r\n for (const id of victims) {\r\n delete unpackedNodes.get(id)!.bindingKey;\r\n if (!dropped.includes(key)) dropped.push(key);\r\n }\r\n }\r\n }\r\n }\r\n return dropped;\r\n}\r\n\r\nexport type PrefabUnpackResult = { instances: number; droppedBindingKeys: string[] };\r\n\r\n/**\r\n * Разворачивает все инстансы пресета обратно в обычные узлы своих владельцев.\r\n *\r\n * Так удаление пресета перестаёт зависеть от того, используется он или нет: сцена сохраняет ровно то\r\n * же изображение, но её узлы больше не ссылаются на определение. Операция идёт по документу целиком —\r\n * сцены, определения других пресетов и локально добавленные поддеревья внутри инстансов.\r\n *\r\n * `undefined` означает, что конфигурация одного из инстансов не разложилась на узлы; вызывающий\r\n * должен отбросить весь кандидат-документ, а не применять его частично.\r\n */\r\nexport function unpackPrefabInstances(document: ProjectDocument, prefabId: string, createId: () => string): PrefabUnpackResult | undefined {\r\n const unpackedNodes = new Map<string, UINode>();\r\n let instances = 0;\r\n // Локация ищется заново на каждом шаге: распаковка внешнего инстанса переносит вложенные в новые\r\n // массивы узлов, поэтому собранные заранее ссылки протухли бы.\r\n for (let location = locatePrefabInstances(document, prefabId)[0]; location !== undefined; location = locatePrefabInstances(document, prefabId)[0]) {\r\n const instanceId = location.instance.id;\r\n const unpacked = unpackInstance(document, location, createId);\r\n if (unpacked === undefined) return undefined;\r\n rewriteUnpackedAddresses(document, instanceId, unpacked.idByAddress);\r\n for (const node of unpacked.inserted) unpackedNodes.set(node.id, node);\r\n instances += 1;\r\n }\r\n return { instances, droppedBindingKeys: dropDuplicateBindingKeys(document, unpackedNodes) };\r\n}\r\n\r\nexport function resolveOwnerNodeGraph(\r\n document: ProjectDocument,\r\n owner: { readonly rootNodeIds: readonly string[]; readonly nodes: readonly UINode[] },\r\n): { rootNodeIds: string[]; nodes: UINode[]; origins: Map<string, MaterializedPrefabNodeOrigin> } {\r\n const nodes = structuredClone(owner.nodes) as UINode[];\r\n const nodesById = new Map(nodes.map((node) => [node.id, node]));\r\n const origins = new Map<string, MaterializedPrefabNodeOrigin>();\r\n\r\n for (const ownerNode of owner.nodes) {\r\n if (ownerNode.type !== \"prefab-instance\") continue;\r\n const instanceCopy = nodesById.get(ownerNode.id);\r\n const materialized = materializePrefabInstance(document, ownerNode);\r\n if (materialized === undefined || instanceCopy === undefined) continue;\r\n instanceCopy.children = [...materialized.rootNodeIds];\r\n for (const materializedNode of materialized.nodes) {\r\n if (materializedNode.parentId === null) materializedNode.parentId = ownerNode.id;\r\n nodes.push(materializedNode);\r\n nodesById.set(materializedNode.id, materializedNode);\r\n }\r\n materialized.origins.forEach((origin, id) => origins.set(id, origin));\r\n }\r\n\r\n return { rootNodeIds: [...owner.rootNodeIds], nodes, origins };\r\n}\r\n"]}
1
+ {"version":3,"file":"prefabs.js","sourceRoot":"","sources":["../src/prefabs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,qCAAqC,EAAE,MAAM,qBAAqB,CAAC;AAEnG,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAE/J;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,iBAAiB,CAAC;AAsB5D,MAAM,UAAU,wBAAwB,CAAC,UAAkB,EAAE,QAAgB;IAC3E,OAAO,GAAG,UAAU,GAAG,0BAA0B,GAAG,QAAQ,EAAE,CAAC;AACjE,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,6BAA6B,CAAC,EAAU;IACtD,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACzD,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACpC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,0BAA0B,CAAC,MAAM,CAAC,EAAE,CAAC;AACnH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,OAAe;IACnE,OAAO,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,0BAA0B,GAAG,OAAO,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,KAAwC;IACzF,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAE,IAAa,EAAE,IAAI,GAAG,KAAK,EAAW,EAAE;QACvE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAA4B,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,IAAI,IAAI,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YACxD,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;;gBAClC,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAW,CAAC;AAC5C,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,SAAiB;IACnE,MAAM,IAAI,GAAG,CAAC,MAAe,EAAE,KAAc,EAAE,IAAI,GAAG,KAAK,EAAW,EAAE;QACtE,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtE,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,IAAI,IAAI,IAAI,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YACxD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;iBAC7C,CAAC;gBACJ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC5C,IAAI,KAAK,KAAK,SAAS;oBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,CAAC,CAAC;IACF,OAAQ,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAyC,IAAI,EAAE,CAAC;AACpF,CAAC;AAKD;;;;;GAKG;AACH,SAAS,mBAAmB,CAC1B,QAAyB,EACzB,QAA4B,EAC5B,kBAAuC,EACvC,sBAA+B;IAE/B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5F,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE/C,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACpE,wFAAwF;IACxF,2FAA2F;IAC3F,MAAM,IAAI,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjI,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwC,CAAC;IAEhE,MAAM,IAAI,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,MAAc,EAAE,OAAe,EAAE,MAAoC,EAAQ,EAAE;QAC9H,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG;YACX,GAAG,eAAe,CAAC,SAAS,CAAC;YAC7B,EAAE;YACF,QAAQ,EAAE,MAAM,CAAC,QAAQ,KAAK,IAAI;gBAChC,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACxD,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;SAC/E,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,MAA6B,EAAU,EAAE;QACvF,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS,GAAG,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,IAAwB,EAAE,MAAc,EAAc,EAAE,CACvE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAU,CAAC,CAAC,CAAC;IAEvI;;;;;;OAMG;IACH,MAAM,kBAAkB,GAAG,CAAC,KAAyB,EAAQ,EAAE;QAC7D,MAAM,GAAG,GAAG,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QAClE,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO;QAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrC,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI;gBAAE,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO;QAC/B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,WAAW;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxG,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,IAAwB,EAAE,MAAc,EAAE,MAA6B,EAAE,SAA8B,EAAQ,EAAE;QACtI,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpF,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrE,MAAM,aAAa,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAoD,EAAE,CAAC;QAEnE,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC1C,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;gBACjE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/I,IAAI,cAAc,CAAC,IAAI,KAAK,iBAAiB;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;YAChG,CAAC;YACD,oGAAoG;YACpG,MAAM,QAAQ,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACzE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACxC,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;oBAC5D,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtG,CAAC;YACH,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,MAAM;gBAAE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;YAChI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACpB,CAAC;QAED,4FAA4F;QAC5F,MAAM,QAAQ,GAAG,MAAM,KAAK,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ;gBACvF,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,EAAE;gBAC/D,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YACnE,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;gBAAE,SAAS;YAC/C,IAAI,QAAQ;gBAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;;gBACnC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM;YAAE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAClI,CAAC,CAAC;IAEF,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAE9G,+FAA+F;IAC/F,6FAA6F;IAC7F,+EAA+E;IAC/E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,SAAS;QACrC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,6FAA6F;IAC7F,gGAAgG;IAChG,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;QAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,KAAK,OAAO;YAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzG,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,WAAW,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzE,qBAAqB,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;YACvE,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,qBAAqB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,CAAC;IACrH,CAAC;IAED,OAAO;QACL,WAAW,EAAE;YACX,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjF,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;SAC9E;QACD,KAAK;QACL,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAyB,EAAE,QAA4B;IAC/F,OAAO,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,8BAA8B,CAAC,QAAyB,EAAE,QAA4B;IACpG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAC/E,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,MAAM,EAAE,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,EAAE;YAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,QAAyB,EAAE,QAA4B;IAClG,MAAM,IAAI,GAAG,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChE,MAAM,UAAU,GAAyB,EAAE,CAAC;IAC5C,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,qBAAqB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9F,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC,iBAAiB,CAAC;;QAC1D,QAAQ,CAAC,iBAAiB,GAAG,UAAU,CAAC;IAC7C,IAAI,QAAQ,CAAC,iBAAiB,EAAE,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC,iBAAiB,CAAC;AAClF,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAyB,EAAE,QAA4B,EAAE,QAAgB,EAAE,KAAwC;IAC9I,MAAM,IAAI,GAAG,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9E,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,iBAAiB,KAAK,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1H,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,IAAI,QAAQ,KAAK,SAAS;YAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,IAAI,QAAQ,KAAK,SAAS;QAAE,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;;QACvF,QAAQ,CAAC,KAAK,GAAG,WAAW,CAAC;IAClC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC,iBAAiB,CAAC;IAC9D,OAAO,IAAI,CAAC;AACd,CAAC;AAID;;;;;;;;;GASG;AACH,MAAM,UAAU,gCAAgC,CAAC,QAAyB,EAAE,QAA4B;IACtG,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxF,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,8BAA8B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAEtE;;;;;;;OAOG;IACH,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAE,iBAAiB,GAAG,EAAE,EAAsB,EAAE;QAC5F,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC;QAC5C,MAAM,MAAM,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,EAAE,EAAE,CAAC;YAC9D,+FAA+F;YAC/F,OAAO,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACjE,CAAC;QACD,IAAI,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,OAAO,CAAC;QAC3C,IAAI,iBAAiB,KAAK,EAAE,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,GAAG,iBAAiB,GAAG,0BAA0B,EAAE,CAAC;YACnE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,OAAO,SAAS,CAAC;YACnD,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,aAAa,GAAG,qBAAqB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QACzE,OAAO,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,QAA4B,EAAE,iBAAyB,EAAsB,EAAE;QACnG,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,EAAE,iBAAiB,EAAE,CAAC,IAAI,CAAC,EAAmC,CAAC;QAC9E,qCAAqC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC9G,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;QACxD,MAAM,CAAC,gBAAgB,EAAE,GAAG,UAAU,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,cAAc,GAAG,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC1G,IAAI,cAAc,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC/C,MAAM,eAAe,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAChG,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,oBAAoB,CAAC,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,qBAAqB,GAAG,cAAoD,CAAC;YACnF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC;gBAAE,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;YACxF,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QACD,IAAI,cAAc,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC,IAAI,CAAC,0BAA0B,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IACpL,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAA4B,CAAC;IACzD,MAAM,aAAa,GAAG,CAAC,IAAY,EAAgC,EAAE;QACnE,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvF,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;YAC/C,IAAI,WAAW,KAAK,SAAS;gBAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YACtE,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,CAAC,gBAAgB,EAAE,GAAG,UAAU,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvE,MAAM,cAAc,GAAG,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC1G,IAAI,cAAc,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YACnD,IAAI,cAAc,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC9C,MAAM,WAAW,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,0BAA0B,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;gBACrI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBACvC,OAAO,WAAW,CAAC;YACrB,CAAC;QACH,CAAC;QACD,MAAM,WAAW,GAAG,EAAE,MAAM,EAAE,CAAC;QAC/B,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACvC,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC5C,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,iBAAiB,GAAG,UAAU,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,qBAAqB,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACpC,qCAAqC,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC9G,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9E,IAAI,UAAU,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC,aAAa;gBAAE,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;YAC1F,CAAC,WAAW,CAAC,QAAQ,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QACD,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,aAAa;YAAE,SAAS;QAC5B,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACpE,CAAC;YACJ,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,iBAAiB,CAAC;IAClC,OAAO,QAAQ,CAAC,iBAAiB,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,4BAA4B,CAAC,KAA4C,EAAE,KAA6C;IACtI,MAAM,IAAI,GAAG,CAAC,KAAwB,EAAQ,EAAE;QAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;gBAAE,SAAS;YAC9C,KAAK,CAAC,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAyB,EAAE,KAA6C;IAC5G,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC;QAAE,4BAA4B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC5G,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAA4C,EAAE,UAAkB;IACxG,IAAI,KAAqC,CAAC;IAC1C,4BAA4B,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE;QAC/C,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,EAAE,KAAK,UAAU;YAAE,KAAK,GAAG,QAAQ,CAAC;IAC1E,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAyB,EAAE,UAAkB;IAC9E,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,yBAAyB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC9D,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;IAC9C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAyB,EAAE,QAAgB,EAAE,gBAAwB;IAC1G,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAW,EAAE;QACpC,IAAI,EAAE,KAAK,gBAAgB;YAAE,OAAO,IAAI,CAAC;QACzC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACvC,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,4BAA4B,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,KAAK,KAAK,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,oBAAoB,CAAC,QAAyB,EAAE,QAAgB;IAC9E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,qBAAqB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;QAC3C,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ;YAAE,KAAK,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAUD,iGAAiG;AACjG,SAAS,qBAAqB,CAAC,QAAyB,EAAE,QAAgB;IACxE,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,CAAC,KAAe,EAAQ,EAAE;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;gBAAE,SAAS;YAC9C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC;QAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,cAAc,CAAC,QAAyB,EAAE,QAA0B,EAAE,QAAsB;IACnG,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;IACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxF,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE3C,MAAM,WAAW,GAAqB,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;IACrF,MAAM,aAAa,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAChD,aAAa,CAAC,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,gCAAgC,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC1E,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAU,CAAC,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;IAC/E,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5E,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IAC7G,MAAM,SAAS,GAAG,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAY,CAAC;IAC1H,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1E,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;AACtD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,wBAAwB,CAAC,QAAyB,EAAE,UAAkB,EAAE,WAAwC;IACvH,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE;QACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxE,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACtC,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC9G,CAAC,CAAC;IACF,qBAAqB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;QAC3C,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,iBAAiB,IAAI,EAAE;YAAE,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpG,qCAAqC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,iBAAiB,IAAI,EAAE;YAAE,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;gBAAE,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5H,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,iBAAiB,IAAI,EAAE;YAAE,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,wBAAwB,CAAC,QAAyB,EAAE,aAA0C;IACrG,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrD,KAAK,MAAM,UAAU,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACjE,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5D,IAAI,GAAG,KAAK,EAAE,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;oBAAE,SAAS;gBAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAClF,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;oBACzB,OAAO,aAAa,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,UAAU,CAAC;oBACzC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;wBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAID;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAyB,EAAE,QAAgB,EAAE,QAAsB;IACvG,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,iGAAiG;IACjG,+DAA+D;IAC/D,KAAK,IAAI,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,SAAS,EAAE,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClJ,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC9D,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC7C,wBAAwB,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrE,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ;YAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACvE,SAAS,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,wBAAwB,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAAyB,EACzB,KAAqF;IAErF,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAa,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwC,CAAC;IAEhE,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,SAAS,CAAC,IAAI,KAAK,iBAAiB;YAAE,SAAS;QACnD,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,yBAAyB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACpE,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS;YAAE,SAAS;QACvE,YAAY,CAAC,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QACtD,KAAK,MAAM,gBAAgB,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;YAClD,IAAI,gBAAgB,CAAC,QAAQ,KAAK,IAAI;gBAAE,gBAAgB,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC;YACjF,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC7B,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACvD,CAAC;QACD,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACjE,CAAC","sourcesContent":["import type { PrefabDefinition, PrefabNodeOverride, ProjectDocument, UINode } from \"./index.js\";\r\nimport { collectBindingKeys, collectBindingKeyScopes } from \"./bindingKeys.js\";\r\nimport { rewriteNodeReferences, rewritePrefabInstanceReferencePatches } from \"./nodeReferences.js\";\r\n\r\nconst STRUCTURAL_OVERRIDE_KEYS = new Set([\"id\", \"type\", \"parentId\", \"children\", \"editorOnly\", \"locked\", \"prefabId\", \"propertyOverrides\", \"locallyAddedNodes\"]);\r\n\r\n/**\r\n * Разделитель сегментов адреса внутри инстанса пресета.\r\n *\r\n * Адрес — это путь по вложенным пресетам: `defA` — узел определения самого инстанса,\r\n * `defA::prefab-node::defB` — узел `defB` внутри инстанса `defA`, вложенного в определение. Документ\r\n * до вложенных пресетов хранил ровно один сегмент, поэтому старые адреса остаются валидными путями.\r\n */\r\nexport const PREFAB_NODE_PATH_SEPARATOR = \"::prefab-node::\";\r\n\r\nexport type PrefabInstanceNode = Extract<UINode, { type: \"prefab-instance\" }>;\r\n\r\n/**\r\n * Откуда взялся узел развёрнутого инстанса.\r\n *\r\n * `instanceId` всегда указывает на **персистентный** узел-инстанс: сцену/пресет-владельца или\r\n * локально добавленный инстанс. Именно в нём хранятся `propertyOverrides` и `locallyAddedNodes` для\r\n * этого узла. `inherited` — часть структуры пресета: её можно переопределить по свойствам (patch\r\n * адресуется `nodePath`), но нельзя удалить или перенести. `local` — обычный редактируемый узел.\r\n */\r\nexport type MaterializedPrefabNodeOrigin =\r\n | { kind: \"inherited\"; instanceId: string; nodePath: string }\r\n | { kind: \"local\"; instanceId: string; localNodeId: string };\r\n\r\nexport type MaterializedPrefab = {\r\n rootNodeIds: string[];\r\n nodes: UINode[];\r\n origins: Map<string, MaterializedPrefabNodeOrigin>;\r\n};\r\n\r\nexport function materializedPrefabNodeId(instanceId: string, nodePath: string): string {\r\n return `${instanceId}${PREFAB_NODE_PATH_SEPARATOR}${nodePath}`;\r\n}\r\n\r\n/** Первый разделитель отделяет персистентный инстанс от адреса узла внутри него. */\r\nexport function parseMaterializedPrefabNodeId(id: string): { instanceId: string; nodePath: string } | undefined {\r\n const separator = id.indexOf(PREFAB_NODE_PATH_SEPARATOR);\r\n if (separator < 0) return undefined;\r\n return { instanceId: id.slice(0, separator), nodePath: id.slice(separator + PREFAB_NODE_PATH_SEPARATOR.length) };\r\n}\r\n\r\n/** Склеивает адрес узла с адресом инстанса, внутри которого он объявлен. */\r\nexport function composePrefabNodePath(prefix: string, address: string): string {\r\n return prefix === \"\" ? address : `${prefix}${PREFAB_NODE_PATH_SEPARATOR}${address}`;\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\n/** Applies a persisted sparse patch without allowing prefab hierarchy identity to change. */\r\nexport function applyPrefabNodePatch(base: UINode, patch: Readonly<Record<string, unknown>>): UINode {\r\n const merge = (current: unknown, next: unknown, root = false): unknown => {\r\n if (!isRecord(next)) return structuredClone(next);\r\n const result: Record<string, unknown> = isRecord(current) ? structuredClone(current) : {};\r\n for (const [key, value] of Object.entries(next)) {\r\n if (root && STRUCTURAL_OVERRIDE_KEYS.has(key)) continue;\r\n if (value === null) delete result[key];\r\n else result[key] = isRecord(value) ? merge(result[key], value) : structuredClone(value);\r\n }\r\n return result;\r\n };\r\n return merge(base, patch, true) as UINode;\r\n}\r\n\r\n/** Produces the smallest deterministic merge patch used by instance property overrides. */\r\nexport function createPrefabNodePatch(base: UINode, effective: UINode): Record<string, unknown> {\r\n const diff = (before: unknown, after: unknown, root = false): unknown => {\r\n if (Object.is(before, after)) return undefined;\r\n if (!isRecord(before) || !isRecord(after)) return structuredClone(after);\r\n const patch: Record<string, unknown> = {};\r\n const keys = new Set([...Object.keys(before), ...Object.keys(after)]);\r\n for (const key of [...keys].sort()) {\r\n if (root && STRUCTURAL_OVERRIDE_KEYS.has(key)) continue;\r\n if (!Object.hasOwn(after, key)) patch[key] = null;\r\n else {\r\n const value = diff(before[key], after[key]);\r\n if (value !== undefined) patch[key] = value;\r\n }\r\n }\r\n return Object.keys(patch).length === 0 ? undefined : patch;\r\n };\r\n return (diff(base, effective, true) as Record<string, unknown> | undefined) ?? {};\r\n}\r\n\r\n/** Один слой property overrides, адресованный в пространстве адресов персистентного инстанса. */\r\ntype PatchLayer = ReadonlyMap<string, Readonly<Record<string, unknown>>>;\r\n\r\n/**\r\n * Разворачивает один персистентный инстанс во все его узлы, включая вложенные пресеты.\r\n *\r\n * Приоритет патчей — как у Unity: чем ближе инстанс к сцене, тем он старше. Слои идут от владельца\r\n * (индекс 0) к самым глубоким определениям, поэтому применяются в обратном порядке.\r\n */\r\nfunction materializeInstance(\r\n document: ProjectDocument,\r\n instance: PrefabInstanceNode,\r\n expandingPrefabIds: ReadonlySet<string>,\r\n applyInstanceOverrides: boolean,\r\n): MaterializedPrefab | undefined {\r\n const rootPrefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (rootPrefab === undefined) return undefined;\r\n\r\n const ownerId = instance.id;\r\n const localNodes = instance.locallyAddedNodes ?? [];\r\n const editableLocalIds = new Set(localNodes.map((node) => node.id));\r\n // Локальный узел персистентен сам по себе, поэтому сохраняет собственный stable ID; всё\r\n // унаследованное получает ID, привязанный к инстансу, чтобы два инстанса не конфликтовали.\r\n const idOf = (address: string): string => (editableLocalIds.has(address) ? address : materializedPrefabNodeId(ownerId, address));\r\n\r\n const nodes: UINode[] = [];\r\n const nodesById = new Map<string, UINode>();\r\n const origins = new Map<string, MaterializedPrefabNodeOrigin>();\r\n\r\n const emit = (source: UINode, effective: UINode, prefix: string, address: string, origin: MaterializedPrefabNodeOrigin): void => {\r\n const id = idOf(address);\r\n const node = {\r\n ...structuredClone(effective),\r\n id,\r\n parentId: source.parentId === null\r\n ? (prefix === \"\" ? null : idOf(prefix))\r\n : idOf(composePrefabNodePath(prefix, source.parentId)),\r\n children: source.children.map((childId) => idOf(composePrefabNodePath(prefix, childId))),\r\n } as UINode;\r\n nodes.push(node);\r\n nodesById.set(id, node);\r\n origins.set(id, origin);\r\n };\r\n\r\n const patched = (base: UINode, address: string, layers: readonly PatchLayer[]): UINode => {\r\n let effective = base;\r\n for (let index = layers.length - 1; index >= 0; index -= 1) {\r\n const patch = layers[index]!.get(address);\r\n if (patch !== undefined) effective = applyPrefabNodePatch(effective, patch);\r\n }\r\n return effective;\r\n };\r\n\r\n const layerOf = (node: PrefabInstanceNode, prefix: string): PatchLayer =>\r\n new Map((node.propertyOverrides ?? []).map((override) => [composePrefabNodePath(prefix, override.nodeId), override.patch] as const));\r\n\r\n /**\r\n * Разворачивает локально добавленный инстанс: он персистентен и владеет собственной конфигурацией.\r\n *\r\n * Развёртка начинается с чистого набора: бесконечной иерархия становится только если определение\r\n * пресета содержит само себя, а локальное добавление — конечные данные документа. Инстанс пресета\r\n * внутри развёртки того же пресета поэтому допустим, как и в Unity.\r\n */\r\n const mergeOwnedInstance = (local: PrefabInstanceNode): void => {\r\n const sub = materializeInstance(document, local, new Set(), true);\r\n if (sub === undefined) return;\r\n const host = nodesById.get(local.id);\r\n for (const subNode of sub.nodes) {\r\n if (subNode.parentId === null) subNode.parentId = local.id;\r\n nodes.push(subNode);\r\n nodesById.set(subNode.id, subNode);\r\n }\r\n sub.origins.forEach((origin, id) => origins.set(id, origin));\r\n if (host === undefined) return;\r\n for (const rootId of sub.rootNodeIds) if (!host.children.includes(rootId)) host.children.push(rootId);\r\n };\r\n\r\n const expandContent = (host: PrefabInstanceNode, prefix: string, layers: readonly PatchLayer[], expanding: ReadonlySet<string>): void => {\r\n const prefab = document.prefabs.find((candidate) => candidate.id === host.prefabId);\r\n const expandable = prefab !== undefined && !expanding.has(prefab.id);\r\n const nextExpanding = prefab === undefined ? expanding : new Set([...expanding, prefab.id]);\r\n const nested: { node: PrefabInstanceNode; address: string }[] = [];\r\n\r\n if (expandable) {\r\n for (const definitionNode of prefab.nodes) {\r\n const address = composePrefabNodePath(prefix, definitionNode.id);\r\n emit(definitionNode, patched(definitionNode, address, layers), prefix, address, { kind: \"inherited\", instanceId: ownerId, nodePath: address });\r\n if (definitionNode.type === \"prefab-instance\") nested.push({ node: definitionNode, address });\r\n }\r\n // Корни определения становятся детьми самого узла-инстанса; на верхнем уровне их забирает владелец.\r\n const hostNode = prefix === \"\" ? undefined : nodesById.get(idOf(prefix));\r\n if (hostNode !== undefined) {\r\n for (const rootId of prefab.rootNodeIds) {\r\n const childId = idOf(composePrefabNodePath(prefix, rootId));\r\n if (nodesById.has(childId) && !hostNode.children.includes(childId)) hostNode.children.push(childId);\r\n }\r\n }\r\n for (const item of nested) expandContent(item.node, item.address, [...layers, layerOf(item.node, item.address)], nextExpanding);\r\n nested.length = 0;\r\n }\r\n\r\n // Локальные добавления владельца редактируемы; те, что пришли из определения, унаследованы.\r\n const editable = prefix === \"\";\r\n for (const local of host.locallyAddedNodes ?? []) {\r\n const address = composePrefabNodePath(prefix, local.id);\r\n emit(local, editable ? local : patched(local, address, layers), prefix, address, editable\r\n ? { kind: \"local\", instanceId: ownerId, localNodeId: local.id }\r\n : { kind: \"inherited\", instanceId: ownerId, nodePath: address });\r\n if (local.type !== \"prefab-instance\") continue;\r\n if (editable) mergeOwnedInstance(local);\r\n else nested.push({ node: local, address });\r\n }\r\n for (const item of nested) expandContent(item.node, item.address, [...layers, layerOf(item.node, item.address)], nextExpanding);\r\n };\r\n\r\n expandContent(instance, \"\", [applyInstanceOverrides ? layerOf(instance, \"\") : new Map()], expandingPrefabIds);\r\n\r\n // Единая до-привязка: локальные узлы и корни вложенных развёрток попадают в children родителя,\r\n // если тот их ещё не перечисляет. Порядок повторяет порядок выпуска узлов: сначала структура\r\n // определения, затем локальные добавления от самого глубокого пресета к сцене.\r\n for (const node of nodes) {\r\n if (node.parentId === null) continue;\r\n const parent = nodesById.get(node.parentId);\r\n if (parent !== undefined && !parent.children.includes(node.id)) parent.children.push(node.id);\r\n }\r\n\r\n // Semantic references authored inside a reusable definition are relative to that definition.\r\n // Materialization gives all their targets the same instance-scoped IDs as the hierarchy itself.\r\n const idByAddress = new Map<string, string>();\r\n origins.forEach((origin, id) => {\r\n if (origin.kind === \"inherited\" && origin.instanceId === ownerId) idByAddress.set(origin.nodePath, id);\r\n });\r\n for (const node of nodes) {\r\n const origin = origins.get(node.id);\r\n const ownPath = origin?.kind === \"inherited\" ? origin.nodePath : \"\";\r\n const ownSegments = ownPath === \"\" ? [] : splitNodePath(ownPath);\r\n const prefix = ownSegments.slice(0, -1).join(PREFAB_NODE_PATH_SEPARATOR);\r\n rewriteNodeReferences(node, (targetNodeId) => nodesById.has(targetNodeId)\r\n ? targetNodeId\r\n : idByAddress.get(composePrefabNodePath(prefix, targetNodeId)) ?? idByAddress.get(targetNodeId) ?? targetNodeId);\r\n }\r\n\r\n return {\r\n rootNodeIds: [\r\n ...rootPrefab.rootNodeIds.map((id) => idOf(id)).filter((id) => nodesById.has(id)),\r\n ...localNodes.filter((node) => node.parentId === null).map((node) => node.id),\r\n ],\r\n nodes,\r\n origins,\r\n };\r\n}\r\n\r\nexport function materializePrefabInstance(document: ProjectDocument, instance: PrefabInstanceNode): MaterializedPrefab | undefined {\r\n return materializeInstance(document, instance, new Set(), true);\r\n}\r\n\r\n/**\r\n * Узлы инстанса до применения его собственных property overrides, по адресам.\r\n *\r\n * Это «база» для нормализации и валидации: она уже включает конфигурацию вложенных инстансов,\r\n * записанную в определениях пресетов, поэтому override, повторяющий её значение, схлопывается.\r\n */\r\nexport function resolvePrefabInstanceBaseNodes(document: ProjectDocument, instance: PrefabInstanceNode): Map<string, UINode> {\r\n const base = new Map<string, UINode>();\r\n const materialized = materializeInstance(document, instance, new Set(), false);\r\n if (materialized === undefined) return base;\r\n for (const node of materialized.nodes) {\r\n const origin = materialized.origins.get(node.id);\r\n if (origin?.kind === \"inherited\" && origin.instanceId === instance.id) base.set(origin.nodePath, node);\r\n }\r\n return base;\r\n}\r\n\r\nexport function normalizePrefabNodeOverrides(document: ProjectDocument, instance: PrefabInstanceNode): void {\r\n const base = resolvePrefabInstanceBaseNodes(document, instance);\r\n const normalized: PrefabNodeOverride[] = [];\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const baseNode = base.get(override.nodeId);\r\n if (baseNode === undefined) {\r\n normalized.push(override);\r\n continue;\r\n }\r\n const patch = createPrefabNodePatch(baseNode, applyPrefabNodePatch(baseNode, override.patch));\r\n if (Object.keys(patch).length > 0) normalized.push({ nodeId: override.nodeId, patch });\r\n }\r\n if (normalized.length === 0) delete instance.propertyOverrides;\r\n else instance.propertyOverrides = normalized;\r\n if (instance.locallyAddedNodes?.length === 0) delete instance.locallyAddedNodes;\r\n}\r\n\r\nfunction splitNodePath(path: string): string[] {\r\n return path.split(PREFAB_NODE_PATH_SEPARATOR);\r\n}\r\n\r\nfunction storeNestedOverride(document: ProjectDocument, instance: PrefabInstanceNode, nodePath: string, patch: Readonly<Record<string, unknown>>): boolean {\r\n const base = resolvePrefabInstanceBaseNodes(document, instance).get(nodePath);\r\n if (base === undefined) return false;\r\n const overrides = instance.propertyOverrides ??= [];\r\n const existing = overrides.find((candidate) => candidate.nodeId === nodePath);\r\n const effective = applyPrefabNodePatch(existing === undefined ? base : applyPrefabNodePatch(base, existing.patch), patch);\r\n const mergedPatch = createPrefabNodePatch(base, effective);\r\n if (Object.keys(mergedPatch).length === 0) {\r\n if (existing !== undefined) overrides.splice(overrides.indexOf(existing), 1);\r\n } else if (existing === undefined) overrides.push({ nodeId: nodePath, patch: mergedPatch });\r\n else existing.patch = mergedPatch;\r\n if (overrides.length === 0) delete instance.propertyOverrides;\r\n return true;\r\n}\r\n\r\ntype LocalDestination = { prefab: PrefabDefinition } | { instance: PrefabInstanceNode; prefix: string; ownerPrefix: string };\r\n\r\n/**\r\n * Переносит конфигурацию инстанса (overrides и локально добавленные узлы) в его определение.\r\n *\r\n * Прямые overrides переписывают узлы определения, вложенные — становятся конфигурацией того\r\n * persisted-инстанса, к которому относятся, а локальные поддеревья переезжают целиком, сохраняя\r\n * stable ID. Сам инстанс после успешного переноса теряет конфигурацию: она уже в определении.\r\n *\r\n * Это же преобразование лежит в основе распаковки инстанса (`unpackPrefabInstances`): там оно\r\n * применяется к одноразовой копии определения, которая потом встраивается в сцену как обычные узлы.\r\n */\r\nexport function applyPrefabInstanceConfiguration(document: ProjectDocument, instance: PrefabInstanceNode): boolean {\r\n const prefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (prefab === undefined) return false;\r\n const definitionNodes = new Map(prefab.nodes.map((node) => [node.id, node]));\r\n const baseNodes = resolvePrefabInstanceBaseNodes(document, instance);\r\n const localNodes = instance.locallyAddedNodes ?? [];\r\n const localsById = new Map(localNodes.map((node) => [node.id, node]));\r\n\r\n /**\r\n * Inspector edits semantic references in the materialized scene address space. Applying an\r\n * instance moves those values back into a reusable definition, where the outer instance segment\r\n * no longer exists. Keep local stable IDs, but turn\r\n * `sceneInstance::prefab-node::definitionNode` back into `definitionNode` (or into an address\r\n * relative to the nested persisted instance which receives the value). A scene-only target has no\r\n * meaning in the definition and is dropped instead of making the whole document invalid.\r\n */\r\n const rewriteAppliedAddress = (address: string, destinationPrefix = \"\"): string | undefined => {\r\n if (localsById.has(address)) return address;\r\n const parsed = parseMaterializedPrefabNodeId(address);\r\n if (parsed !== undefined && parsed.instanceId !== instance.id) {\r\n // A locally added prefab instance keeps owning its own materialized address space after Apply.\r\n return localsById.has(parsed.instanceId) ? address : undefined;\r\n }\r\n let relative = parsed?.nodePath ?? address;\r\n if (destinationPrefix !== \"\") {\r\n const prefix = `${destinationPrefix}${PREFAB_NODE_PATH_SEPARATOR}`;\r\n if (!relative.startsWith(prefix)) return undefined;\r\n relative = relative.slice(prefix.length);\r\n }\r\n const sourceAddress = composePrefabNodePath(destinationPrefix, relative);\r\n return baseNodes.has(sourceAddress) ? relative : undefined;\r\n };\r\n\r\n const rewritePatch = (override: PrefabNodeOverride, destinationPrefix: string): PrefabNodeOverride => {\r\n const copy = structuredClone(override);\r\n const holder = { propertyOverrides: [copy] } as unknown as PrefabInstanceNode;\r\n rewritePrefabInstanceReferencePatches(holder, (address) => rewriteAppliedAddress(address, destinationPrefix));\r\n return copy;\r\n };\r\n\r\n for (const override of instance.propertyOverrides ?? []) {\r\n const [definitionNodeId, ...nestedPath] = splitNodePath(override.nodeId);\r\n const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);\r\n if (definitionNode === undefined) return false;\r\n const appliedOverride = rewritePatch(override, nestedPath.length === 0 ? \"\" : definitionNodeId);\r\n if (nestedPath.length === 0) {\r\n const patched = applyPrefabNodePatch(definitionNode, appliedOverride.patch);\r\n const mutableDefinitionNode = definitionNode as unknown as Record<string, unknown>;\r\n for (const key of Object.keys(mutableDefinitionNode)) delete mutableDefinitionNode[key];\r\n Object.assign(mutableDefinitionNode, patched);\r\n continue;\r\n }\r\n if (definitionNode.type !== \"prefab-instance\" || !storeNestedOverride(document, definitionNode, nestedPath.join(PREFAB_NODE_PATH_SEPARATOR), appliedOverride.patch)) return false;\r\n }\r\n\r\n const destinations = new Map<string, LocalDestination>();\r\n const destinationOf = (node: UINode): LocalDestination | undefined => {\r\n const cached = destinations.get(node.id);\r\n if (cached !== undefined) return cached;\r\n const localParent = node.parentId === null ? undefined : localsById.get(node.parentId);\r\n if (localParent !== undefined) {\r\n const destination = destinationOf(localParent);\r\n if (destination !== undefined) destinations.set(node.id, destination);\r\n return destination;\r\n }\r\n if (node.parentId !== null) {\r\n const [definitionNodeId, ...nestedPath] = splitNodePath(node.parentId);\r\n const definitionNode = definitionNodeId === undefined ? undefined : definitionNodes.get(definitionNodeId);\r\n if (definitionNode === undefined) return undefined;\r\n if (definitionNode.type === \"prefab-instance\") {\r\n const destination = { instance: definitionNode, prefix: nestedPath.join(PREFAB_NODE_PATH_SEPARATOR), ownerPrefix: definitionNodeId };\r\n destinations.set(node.id, destination);\r\n return destination;\r\n }\r\n }\r\n const destination = { prefab };\r\n destinations.set(node.id, destination);\r\n return destination;\r\n };\r\n\r\n for (const local of localNodes) {\r\n const destination = destinationOf(local);\r\n if (destination === undefined) return false;\r\n const copy = structuredClone(local);\r\n const destinationPrefix = \"instance\" in destination ? destination.ownerPrefix : \"\";\r\n rewriteNodeReferences(copy, (address) => rewriteAppliedAddress(address, destinationPrefix));\r\n if (copy.type === \"prefab-instance\") {\r\n rewritePrefabInstanceReferencePatches(copy, (address) => rewriteAppliedAddress(address, destinationPrefix));\r\n }\r\n const parentIsLocal = copy.parentId !== null && localsById.has(copy.parentId);\r\n if (\"instance\" in destination) {\r\n if (!parentIsLocal) copy.parentId = destination.prefix === \"\" ? null : destination.prefix;\r\n (destination.instance.locallyAddedNodes ??= []).push(copy);\r\n continue;\r\n }\r\n destination.prefab.nodes.push(copy);\r\n definitionNodes.set(copy.id, copy);\r\n if (parentIsLocal) continue;\r\n if (copy.parentId === null) destination.prefab.rootNodeIds.push(copy.id);\r\n else {\r\n const parent = definitionNodes.get(copy.parentId);\r\n if (parent === undefined) return false;\r\n if (!parent.children.includes(copy.id)) parent.children.push(copy.id);\r\n }\r\n }\r\n\r\n delete instance.propertyOverrides;\r\n delete instance.locallyAddedNodes;\r\n return true;\r\n}\r\n\r\n/** Обходит все персистентные инстансы владельца, включая локально добавленные. */\r\nexport function forEachPrefabInstanceInOwner(owner: { readonly nodes: readonly UINode[] }, visit: (instance: PrefabInstanceNode) => void): void {\r\n const walk = (nodes: readonly UINode[]): void => {\r\n for (const node of nodes) {\r\n if (node.type !== \"prefab-instance\") continue;\r\n visit(node);\r\n walk(node.locallyAddedNodes ?? []);\r\n }\r\n };\r\n walk(owner.nodes);\r\n}\r\n\r\nexport function forEachPrefabInstance(document: ProjectDocument, visit: (instance: PrefabInstanceNode) => void): void {\r\n for (const owner of [...document.scenes, ...document.prefabs]) forEachPrefabInstanceInOwner(owner, visit);\r\n}\r\n\r\nexport function findPrefabInstanceInOwner(owner: { readonly nodes: readonly UINode[] }, instanceId: string): PrefabInstanceNode | undefined {\r\n let found: PrefabInstanceNode | undefined;\r\n forEachPrefabInstanceInOwner(owner, (instance) => {\r\n if (found === undefined && instance.id === instanceId) found = instance;\r\n });\r\n return found;\r\n}\r\n\r\nexport function findPrefabInstance(document: ProjectDocument, instanceId: string): PrefabInstanceNode | undefined {\r\n for (const owner of [...document.scenes, ...document.prefabs]) {\r\n const instance = findPrefabInstanceInOwner(owner, instanceId);\r\n if (instance !== undefined) return instance;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Ссылается ли пресет на другой — сам собой или через любую цепочку вложенных инстансов.\r\n *\r\n * Так проверяется рекурсия: вставлять инстанс пресета туда, где он уже раскрывается, нельзя, иначе\r\n * иерархия стала бы бесконечной.\r\n */\r\nexport function prefabReferencesPrefab(document: ProjectDocument, prefabId: string, searchedPrefabId: string): boolean {\r\n const visited = new Set<string>();\r\n const visit = (id: string): boolean => {\r\n if (id === searchedPrefabId) return true;\r\n if (visited.has(id)) return false;\r\n visited.add(id);\r\n const prefab = document.prefabs.find((candidate) => candidate.id === id);\r\n if (prefab === undefined) return false;\r\n let found = false;\r\n forEachPrefabInstanceInOwner(prefab, (instance) => { found ||= visit(instance.prefabId); });\r\n return found;\r\n };\r\n return visit(prefabId);\r\n}\r\n\r\n/** Сколько раз пресет используется в документе, включая вложенные и локально добавленные инстансы. */\r\nexport function countPrefabInstances(document: ProjectDocument, prefabId: string): number {\r\n let count = 0;\r\n forEachPrefabInstance(document, (instance) => {\r\n if (instance.prefabId === prefabId) count += 1;\r\n });\r\n return count;\r\n}\r\n\r\n/**\r\n * Плоский граф авторинга владельца: его собственные узлы плюс развёрнутые поддеревья всех инстансов.\r\n *\r\n * Единственный резолвер иерархии: им пользуются и редактор (иерархия, selection, gizmos), и runtime\r\n * (сборка Pixi-дерева, сбор ассетов), поэтому расхождений между ними быть не может.\r\n */\r\ntype InstanceLocation = { nodes: UINode[]; instance: PrefabInstanceNode };\r\n\r\n/** Все персистентные инстансы пресета вместе с массивом узлов, в котором каждый из них лежит. */\r\nfunction locatePrefabInstances(document: ProjectDocument, prefabId: string): InstanceLocation[] {\r\n const found: InstanceLocation[] = [];\r\n const walk = (nodes: UINode[]): void => {\r\n for (const node of nodes) {\r\n if (node.type !== \"prefab-instance\") continue;\r\n if (node.prefabId === prefabId) found.push({ nodes, instance: node });\r\n walk(node.locallyAddedNodes ?? []);\r\n }\r\n };\r\n for (const owner of [...document.scenes, ...document.prefabs]) walk(owner.nodes);\r\n return found;\r\n}\r\n\r\n/**\r\n * Заменяет один инстанс обычным контейнером с тем же id, transform и содержимым.\r\n *\r\n * Развёртка идёт через одноразовую копию определения: конфигурация инстанса переносится в неё тем же\r\n * `applyPrefabInstanceConfiguration`, что и «Apply to preset», после чего узлы копии получают свежие\r\n * stable ID и встают на место инстанса. Вложенные инстансы других пресетов остаются инстансами и\r\n * сохраняют свою конфигурацию — распаковывается ровно один слой.\r\n *\r\n * Возвращает соответствие «адрес узла внутри инстанса → новый id узла»: по нему переписываются\r\n * адреса, которыми на это содержимое ссылались инстансы пресета-владельца.\r\n */\r\nfunction unpackInstance(document: ProjectDocument, location: InstanceLocation, createId: () => string): { idByAddress: Map<string, string>; inserted: UINode[] } | undefined {\r\n const { nodes, instance } = location;\r\n const prefab = document.prefabs.find((candidate) => candidate.id === instance.prefabId);\r\n if (prefab === undefined) return undefined;\r\n\r\n const draftPrefab: PrefabDefinition = { ...structuredClone(prefab), id: createId() };\r\n const draftInstance = structuredClone(instance);\r\n draftInstance.prefabId = draftPrefab.id;\r\n document.prefabs.push(draftPrefab);\r\n const applied = applyPrefabInstanceConfiguration(document, draftInstance);\r\n document.prefabs.splice(document.prefabs.indexOf(draftPrefab), 1);\r\n if (!applied) return undefined;\r\n\r\n const idByAddress = new Map(draftPrefab.nodes.map((node) => [node.id, createId()] as const));\r\n const remap = (address: string): string => idByAddress.get(address) ?? address;\r\n for (const node of draftPrefab.nodes) {\r\n node.id = remap(node.id);\r\n node.children = node.children.map(remap);\r\n node.parentId = node.parentId === null ? instance.id : remap(node.parentId);\r\n rewriteNodeReferences(node, remap);\r\n }\r\n\r\n const { prefabId: _prefabId, propertyOverrides: _overrides, locallyAddedNodes: _locals, ...base } = instance;\r\n const container = { ...structuredClone(base), type: \"container\", children: draftPrefab.rootNodeIds.map(remap) } as UINode;\r\n nodes.splice(nodes.indexOf(instance), 1, container, ...draftPrefab.nodes);\r\n return { idByAddress, inserted: draftPrefab.nodes };\r\n}\r\n\r\n/**\r\n * Переписывает адреса, которые вели внутрь распакованного инстанса.\r\n *\r\n * Инстанс мог лежать в определении пресета, и тогда его содержимое было адресуемо снаружи как\r\n * `…::instanceId::prefab-node::address`. После распаковки этот узел — обычная нода владельца, поэтому\r\n * оба сегмента схлопываются в её новый id. Адрес самого инстанса не меняется: контейнер сохранил id.\r\n */\r\nfunction rewriteUnpackedAddresses(document: ProjectDocument, instanceId: string, idByAddress: ReadonlyMap<string, string>): void {\r\n const rewrite = (path: string): string => {\r\n const segments = splitNodePath(path);\r\n const index = segments.indexOf(instanceId);\r\n const inner = index < 0 ? undefined : segments[index + 1];\r\n const mapped = inner === undefined ? undefined : idByAddress.get(inner);\r\n if (mapped === undefined) return path;\r\n return [...segments.slice(0, index), mapped, ...segments.slice(index + 2)].join(PREFAB_NODE_PATH_SEPARATOR);\r\n };\r\n forEachPrefabInstance(document, (instance) => {\r\n for (const override of instance.propertyOverrides ?? []) override.nodeId = rewrite(override.nodeId);\r\n rewritePrefabInstanceReferencePatches(instance, rewrite);\r\n for (const local of instance.locallyAddedNodes ?? []) if (local.parentId !== null) local.parentId = rewrite(local.parentId);\r\n for (const local of instance.locallyAddedNodes ?? []) rewriteNodeReferences(local, rewrite);\r\n });\r\n}\r\n\r\n/**\r\n * Снимает binding-ключи, которые распаковка размножила в одной области разрешения.\r\n *\r\n * Внутри инстанса ключ принадлежал области этого инстанса, поэтому один и тот же пресет мог стоять на\r\n * сцене сколько угодно раз. Распакованные узлы попадают в область владельца, где ключ обязан быть\r\n * уникальным, поэтому конфликт разрешается в пользу узла, который существовал до распаковки, а среди\r\n * одних только новых узлов — в пользу первого.\r\n */\r\nfunction dropDuplicateBindingKeys(document: ProjectDocument, unpackedNodes: ReadonlyMap<string, UINode>): string[] {\r\n const dropped: string[] = [];\r\n for (const owner of [...document.scenes, ...document.prefabs]) {\r\n const graph = resolveOwnerNodeGraph(document, owner);\r\n for (const scopeNodes of collectBindingKeyScopes(graph).values()) {\r\n for (const [key, nodeIds] of collectBindingKeys(scopeNodes)) {\r\n if (key === \"\" || nodeIds.length <= 1) continue;\r\n const unpacked = nodeIds.filter((id) => unpackedNodes.has(id));\r\n const victims = unpacked.length === nodeIds.length ? unpacked.slice(1) : unpacked;\r\n for (const id of victims) {\r\n delete unpackedNodes.get(id)!.bindingKey;\r\n if (!dropped.includes(key)) dropped.push(key);\r\n }\r\n }\r\n }\r\n }\r\n return dropped;\r\n}\r\n\r\nexport type PrefabUnpackResult = { instances: number; droppedBindingKeys: string[] };\r\n\r\n/**\r\n * Разворачивает все инстансы пресета обратно в обычные узлы своих владельцев.\r\n *\r\n * Так удаление пресета перестаёт зависеть от того, используется он или нет: сцена сохраняет ровно то\r\n * же изображение, но её узлы больше не ссылаются на определение. Операция идёт по документу целиком —\r\n * сцены, определения других пресетов и локально добавленные поддеревья внутри инстансов.\r\n *\r\n * `undefined` означает, что конфигурация одного из инстансов не разложилась на узлы; вызывающий\r\n * должен отбросить весь кандидат-документ, а не применять его частично.\r\n */\r\nexport function unpackPrefabInstances(document: ProjectDocument, prefabId: string, createId: () => string): PrefabUnpackResult | undefined {\r\n const unpackedNodes = new Map<string, UINode>();\r\n let instances = 0;\r\n // Локация ищется заново на каждом шаге: распаковка внешнего инстанса переносит вложенные в новые\r\n // массивы узлов, поэтому собранные заранее ссылки протухли бы.\r\n for (let location = locatePrefabInstances(document, prefabId)[0]; location !== undefined; location = locatePrefabInstances(document, prefabId)[0]) {\r\n const instanceId = location.instance.id;\r\n const unpacked = unpackInstance(document, location, createId);\r\n if (unpacked === undefined) return undefined;\r\n rewriteUnpackedAddresses(document, instanceId, unpacked.idByAddress);\r\n for (const node of unpacked.inserted) unpackedNodes.set(node.id, node);\r\n instances += 1;\r\n }\r\n return { instances, droppedBindingKeys: dropDuplicateBindingKeys(document, unpackedNodes) };\r\n}\r\n\r\nexport function resolveOwnerNodeGraph(\r\n document: ProjectDocument,\r\n owner: { readonly rootNodeIds: readonly string[]; readonly nodes: readonly UINode[] },\r\n): { rootNodeIds: string[]; nodes: UINode[]; origins: Map<string, MaterializedPrefabNodeOrigin> } {\r\n const nodes = structuredClone(owner.nodes) as UINode[];\r\n const nodesById = new Map(nodes.map((node) => [node.id, node]));\r\n const origins = new Map<string, MaterializedPrefabNodeOrigin>();\r\n\r\n for (const ownerNode of owner.nodes) {\r\n if (ownerNode.type !== \"prefab-instance\") continue;\r\n const instanceCopy = nodesById.get(ownerNode.id);\r\n const materialized = materializePrefabInstance(document, ownerNode);\r\n if (materialized === undefined || instanceCopy === undefined) continue;\r\n instanceCopy.children = [...materialized.rootNodeIds];\r\n for (const materializedNode of materialized.nodes) {\r\n if (materializedNode.parentId === null) materializedNode.parentId = ownerNode.id;\r\n nodes.push(materializedNode);\r\n nodesById.set(materializedNode.id, materializedNode);\r\n }\r\n materialized.origins.forEach((origin, id) => origins.set(id, origin));\r\n }\r\n\r\n return { rootNodeIds: [...owner.rootNodeIds], nodes, origins };\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixi-ui-editor/schema",
3
- "version": "0.20.0",
3
+ "version": "0.22.0",
4
4
  "description": "Versioned document schema, validation and project-manifest format for Pixi UI Editor projects.",
5
5
  "type": "module",
6
6
  "repository": {