@oyna360/lobby-sdk 0.1.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.
- package/LICENSE +21 -0
- package/README.md +123 -0
- package/dist/avatar-accessories.d.ts +16 -0
- package/dist/avatar-accessories.d.ts.map +1 -0
- package/dist/avatar-accessories.js +214 -0
- package/dist/avatar-accessories.js.map +1 -0
- package/dist/avatar-asset-manager.d.ts +54 -0
- package/dist/avatar-asset-manager.d.ts.map +1 -0
- package/dist/avatar-asset-manager.js +215 -0
- package/dist/avatar-asset-manager.js.map +1 -0
- package/dist/avatar-clips.d.ts +17 -0
- package/dist/avatar-clips.d.ts.map +1 -0
- package/dist/avatar-clips.js +47 -0
- package/dist/avatar-clips.js.map +1 -0
- package/dist/avatar-config.d.ts +4 -0
- package/dist/avatar-config.d.ts.map +1 -0
- package/dist/avatar-config.js +9 -0
- package/dist/avatar-config.js.map +1 -0
- package/dist/avatar-factory.d.ts +64 -0
- package/dist/avatar-factory.d.ts.map +1 -0
- package/dist/avatar-factory.js +464 -0
- package/dist/avatar-factory.js.map +1 -0
- package/dist/avatar-instance.d.ts +31 -0
- package/dist/avatar-instance.d.ts.map +1 -0
- package/dist/avatar-instance.js +56 -0
- package/dist/avatar-instance.js.map +1 -0
- package/dist/avatar-material-pipeline.d.ts +34 -0
- package/dist/avatar-material-pipeline.d.ts.map +1 -0
- package/dist/avatar-material-pipeline.js +580 -0
- package/dist/avatar-material-pipeline.js.map +1 -0
- package/dist/avatar-rig-builder.d.ts +74 -0
- package/dist/avatar-rig-builder.d.ts.map +1 -0
- package/dist/avatar-rig-builder.js +347 -0
- package/dist/avatar-rig-builder.js.map +1 -0
- package/dist/draco.d.ts +7 -0
- package/dist/draco.d.ts.map +1 -0
- package/dist/draco.js +82 -0
- package/dist/draco.js.map +1 -0
- package/dist/humanoid-animator.d.ts +35 -0
- package/dist/humanoid-animator.d.ts.map +1 -0
- package/dist/humanoid-animator.js +191 -0
- package/dist/humanoid-animator.js.map +1 -0
- package/dist/humanoid-bone-names.d.ts +35 -0
- package/dist/humanoid-bone-names.d.ts.map +1 -0
- package/dist/humanoid-bone-names.js +126 -0
- package/dist/humanoid-bone-names.js.map +1 -0
- package/dist/humanoid-locomotion.d.ts +101 -0
- package/dist/humanoid-locomotion.d.ts.map +1 -0
- package/dist/humanoid-locomotion.js +300 -0
- package/dist/humanoid-locomotion.js.map +1 -0
- package/dist/humanoid-rig.d.ts +51 -0
- package/dist/humanoid-rig.d.ts.map +1 -0
- package/dist/humanoid-rig.js +304 -0
- package/dist/humanoid-rig.js.map +1 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/lobby-chat-ui.d.ts +3 -0
- package/dist/lobby-chat-ui.d.ts.map +1 -0
- package/dist/lobby-chat-ui.js +258 -0
- package/dist/lobby-chat-ui.js.map +1 -0
- package/dist/lobby-colliders.d.ts +10 -0
- package/dist/lobby-colliders.d.ts.map +1 -0
- package/dist/lobby-colliders.js +225 -0
- package/dist/lobby-colliders.js.map +1 -0
- package/dist/lobby-connection-ui.d.ts +8 -0
- package/dist/lobby-connection-ui.d.ts.map +1 -0
- package/dist/lobby-connection-ui.js +68 -0
- package/dist/lobby-connection-ui.js.map +1 -0
- package/dist/lobby-debug.d.ts +50 -0
- package/dist/lobby-debug.d.ts.map +1 -0
- package/dist/lobby-debug.js +132 -0
- package/dist/lobby-debug.js.map +1 -0
- package/dist/lobby-font.d.ts +5 -0
- package/dist/lobby-font.d.ts.map +1 -0
- package/dist/lobby-font.js +35 -0
- package/dist/lobby-font.js.map +1 -0
- package/dist/lobby-music.d.ts +40 -0
- package/dist/lobby-music.d.ts.map +1 -0
- package/dist/lobby-music.js +250 -0
- package/dist/lobby-music.js.map +1 -0
- package/dist/lobby-orientation-ui.d.ts +10 -0
- package/dist/lobby-orientation-ui.d.ts.map +1 -0
- package/dist/lobby-orientation-ui.js +64 -0
- package/dist/lobby-orientation-ui.js.map +1 -0
- package/dist/lobby-perf-diag.d.ts +254 -0
- package/dist/lobby-perf-diag.d.ts.map +1 -0
- package/dist/lobby-perf-diag.js +775 -0
- package/dist/lobby-perf-diag.js.map +1 -0
- package/dist/lobby-plaza-diag.d.ts +103 -0
- package/dist/lobby-plaza-diag.d.ts.map +1 -0
- package/dist/lobby-plaza-diag.js +534 -0
- package/dist/lobby-plaza-diag.js.map +1 -0
- package/dist/lobby-presence-ui.d.ts +4 -0
- package/dist/lobby-presence-ui.d.ts.map +1 -0
- package/dist/lobby-presence-ui.js +89 -0
- package/dist/lobby-presence-ui.js.map +1 -0
- package/dist/lobby-real-device-diag.d.ts +119 -0
- package/dist/lobby-real-device-diag.d.ts.map +1 -0
- package/dist/lobby-real-device-diag.js +468 -0
- package/dist/lobby-real-device-diag.js.map +1 -0
- package/dist/lobby-spawn.d.ts +15 -0
- package/dist/lobby-spawn.d.ts.map +1 -0
- package/dist/lobby-spawn.js +18 -0
- package/dist/lobby-spawn.js.map +1 -0
- package/dist/lobby-ui-i18n.d.ts +11 -0
- package/dist/lobby-ui-i18n.d.ts.map +1 -0
- package/dist/lobby-ui-i18n.js +21 -0
- package/dist/lobby-ui-i18n.js.map +1 -0
- package/dist/lobby-voice-ui.d.ts +3 -0
- package/dist/lobby-voice-ui.d.ts.map +1 -0
- package/dist/lobby-voice-ui.js +105 -0
- package/dist/lobby-voice-ui.js.map +1 -0
- package/dist/local-player-controller.d.ts +80 -0
- package/dist/local-player-controller.d.ts.map +1 -0
- package/dist/local-player-controller.js +422 -0
- package/dist/local-player-controller.js.map +1 -0
- package/dist/name-tag.d.ts +3 -0
- package/dist/name-tag.d.ts.map +1 -0
- package/dist/name-tag.js +59 -0
- package/dist/name-tag.js.map +1 -0
- package/dist/network-client.d.ts +87 -0
- package/dist/network-client.d.ts.map +1 -0
- package/dist/network-client.js +182 -0
- package/dist/network-client.js.map +1 -0
- package/dist/platform-bridge.d.ts +17 -0
- package/dist/platform-bridge.d.ts.map +1 -0
- package/dist/platform-bridge.js +90 -0
- package/dist/platform-bridge.js.map +1 -0
- package/dist/platform-lobby.d.ts +176 -0
- package/dist/platform-lobby.d.ts.map +1 -0
- package/dist/platform-lobby.js +679 -0
- package/dist/platform-lobby.js.map +1 -0
- package/dist/platform-types.d.ts +56 -0
- package/dist/platform-types.d.ts.map +1 -0
- package/dist/platform-types.js +3 -0
- package/dist/platform-types.js.map +1 -0
- package/dist/player-label.d.ts +9 -0
- package/dist/player-label.d.ts.map +1 -0
- package/dist/player-label.js +14 -0
- package/dist/player-label.js.map +1 -0
- package/dist/playground/playground-layout.d.ts +14 -0
- package/dist/playground/playground-layout.d.ts.map +1 -0
- package/dist/playground/playground-layout.js +320 -0
- package/dist/playground/playground-layout.js.map +1 -0
- package/dist/playground/playground-system.d.ts +30 -0
- package/dist/playground/playground-system.d.ts.map +1 -0
- package/dist/playground/playground-system.js +202 -0
- package/dist/playground/playground-system.js.map +1 -0
- package/dist/plaza-layout.d.ts +30 -0
- package/dist/plaza-layout.d.ts.map +1 -0
- package/dist/plaza-layout.js +527 -0
- package/dist/plaza-layout.js.map +1 -0
- package/dist/plugins.d.ts +5 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +26 -0
- package/dist/plugins.js.map +1 -0
- package/dist/protocol.d.ts +276 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +107 -0
- package/dist/protocol.js.map +1 -0
- package/dist/quality.d.ts +39 -0
- package/dist/quality.d.ts.map +1 -0
- package/dist/quality.js +95 -0
- package/dist/quality.js.map +1 -0
- package/dist/remote-player-manager.d.ts +48 -0
- package/dist/remote-player-manager.d.ts.map +1 -0
- package/dist/remote-player-manager.js +339 -0
- package/dist/remote-player-manager.js.map +1 -0
- package/dist/scene-manager.d.ts +26 -0
- package/dist/scene-manager.d.ts.map +1 -0
- package/dist/scene-manager.js +169 -0
- package/dist/scene-manager.js.map +1 -0
- package/dist/spawn-utils.d.ts +8 -0
- package/dist/spawn-utils.d.ts.map +1 -0
- package/dist/spawn-utils.js +29 -0
- package/dist/spawn-utils.js.map +1 -0
- package/dist/starter-layout.d.ts +17 -0
- package/dist/starter-layout.d.ts.map +1 -0
- package/dist/starter-layout.js +102 -0
- package/dist/starter-layout.js.map +1 -0
- package/dist/third-person-camera.d.ts +35 -0
- package/dist/third-person-camera.d.ts.map +1 -0
- package/dist/third-person-camera.js +181 -0
- package/dist/third-person-camera.js.map +1 -0
- package/dist/types.d.ts +164 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/voice-chat.d.ts +78 -0
- package/dist/voice-chat.d.ts.map +1 -0
- package/dist/voice-chat.js +321 -0
- package/dist/voice-chat.js.map +1 -0
- package/dist/yield-to-render.d.ts +3 -0
- package/dist/yield-to-render.d.ts.map +1 -0
- package/dist/yield-to-render.js +11 -0
- package/dist/yield-to-render.js.map +1 -0
- package/dist/zones.d.ts +36 -0
- package/dist/zones.d.ts.map +1 -0
- package/dist/zones.js +68 -0
- package/dist/zones.js.map +1 -0
- package/docs/00-overview.md +47 -0
- package/docs/01-connect.md +85 -0
- package/docs/02-github.md +43 -0
- package/docs/03-modes.md +70 -0
- package/docs/04-api.md +106 -0
- package/docs/05-features.md +55 -0
- package/docs/06-controls.md +34 -0
- package/docs/07-troubleshooting.md +39 -0
- package/package.json +65 -0
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
import { Color3, Material, Mesh, Texture, } from '@babylonjs/core';
|
|
2
|
+
import { isTouchDevice, shouldTrimAvatarDetailMaps, } from './quality';
|
|
3
|
+
import { assetCacheKey } from './avatar-asset-manager';
|
|
4
|
+
export function readTintFromConfig(config) {
|
|
5
|
+
if (!config)
|
|
6
|
+
return undefined;
|
|
7
|
+
for (const key of ['tintColor', 'bodyColor', 'skinColor']) {
|
|
8
|
+
const v = config[key];
|
|
9
|
+
if (typeof v === 'string' && /^#[0-9a-fA-F]{6}$/.test(v))
|
|
10
|
+
return v;
|
|
11
|
+
}
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
/** Recolor avatar body meshes only — never the nametag billboard. */
|
|
15
|
+
export function applyAvatarTint(root, hex) {
|
|
16
|
+
if (!root)
|
|
17
|
+
return;
|
|
18
|
+
let tint = null;
|
|
19
|
+
if (hex && /^#[0-9a-fA-F]{6}$/.test(hex)) {
|
|
20
|
+
try {
|
|
21
|
+
tint = Color3.FromHexString(hex);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
tint = null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const preferred = root.metadata?.tintMeshes?.filter(Boolean);
|
|
28
|
+
let meshes = preferred?.length
|
|
29
|
+
? preferred
|
|
30
|
+
: (() => {
|
|
31
|
+
try {
|
|
32
|
+
return root.getChildMeshes?.(true) ?? [];
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
})();
|
|
38
|
+
meshes = meshes.filter((mesh) => {
|
|
39
|
+
if (!mesh || mesh.name?.includes('nametag'))
|
|
40
|
+
return false;
|
|
41
|
+
const meta = mesh.metadata;
|
|
42
|
+
if (meta?.isNameTag)
|
|
43
|
+
return false;
|
|
44
|
+
const matMeta = mesh.material?.metadata;
|
|
45
|
+
if (matMeta?.isNameTag)
|
|
46
|
+
return false;
|
|
47
|
+
// Nametag uses unlit dynamic texture — skip any unlit billboard text planes.
|
|
48
|
+
const mat = mesh.material;
|
|
49
|
+
if (mat?.disableLighting && mat?.diffuseTexture?.name?.includes('nametag'))
|
|
50
|
+
return false;
|
|
51
|
+
return true;
|
|
52
|
+
});
|
|
53
|
+
const visitMaterial = (mat) => {
|
|
54
|
+
if (!mat)
|
|
55
|
+
return;
|
|
56
|
+
try {
|
|
57
|
+
const anyMat = mat;
|
|
58
|
+
if (anyMat.metadata?.isNameTag)
|
|
59
|
+
return;
|
|
60
|
+
if (anyMat.disableLighting && anyMat.diffuseTexture?.name?.includes('nametag'))
|
|
61
|
+
return;
|
|
62
|
+
if (Array.isArray(anyMat.subMaterials)) {
|
|
63
|
+
for (const sub of anyMat.subMaterials)
|
|
64
|
+
visitMaterial(sub);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const meta = (anyMat.metadata ?? {});
|
|
68
|
+
if (anyMat.albedoColor && !meta.baseAlbedo)
|
|
69
|
+
meta.baseAlbedo = anyMat.albedoColor.clone();
|
|
70
|
+
if (anyMat.diffuseColor && !meta.baseDiffuse)
|
|
71
|
+
meta.baseDiffuse = anyMat.diffuseColor.clone();
|
|
72
|
+
if (anyMat.emissiveColor && !meta.baseEmissive)
|
|
73
|
+
meta.baseEmissive = anyMat.emissiveColor.clone();
|
|
74
|
+
if (typeof anyMat.emissiveIntensity === 'number' && meta.baseEmissiveIntensity === undefined) {
|
|
75
|
+
meta.baseEmissiveIntensity = anyMat.emissiveIntensity;
|
|
76
|
+
}
|
|
77
|
+
anyMat.metadata = meta;
|
|
78
|
+
if (tint) {
|
|
79
|
+
// albedoColor multiplies albedoTexture on PBR — this is the real body recolor.
|
|
80
|
+
if (anyMat.albedoColor)
|
|
81
|
+
anyMat.albedoColor.copyFrom(tint);
|
|
82
|
+
else if (anyMat.diffuseColor)
|
|
83
|
+
anyMat.diffuseColor.copyFrom(tint);
|
|
84
|
+
if (anyMat.emissiveColor && !anyMat.disableLighting) {
|
|
85
|
+
anyMat.emissiveColor.copyFrom(tint.scale(0.2));
|
|
86
|
+
if (typeof anyMat.emissiveIntensity === 'number')
|
|
87
|
+
anyMat.emissiveIntensity = 0.25;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
if (anyMat.albedoColor && meta.baseAlbedo)
|
|
92
|
+
anyMat.albedoColor.copyFrom(meta.baseAlbedo);
|
|
93
|
+
if (anyMat.diffuseColor && meta.baseDiffuse)
|
|
94
|
+
anyMat.diffuseColor.copyFrom(meta.baseDiffuse);
|
|
95
|
+
if (anyMat.emissiveColor && meta.baseEmissive)
|
|
96
|
+
anyMat.emissiveColor.copyFrom(meta.baseEmissive);
|
|
97
|
+
if (typeof anyMat.emissiveIntensity === 'number' && meta.baseEmissiveIntensity !== undefined) {
|
|
98
|
+
anyMat.emissiveIntensity = meta.baseEmissiveIntensity;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
anyMat.markAsDirty?.();
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// skip broken materials
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
for (const mesh of meshes) {
|
|
108
|
+
visitMaterial(mesh.material);
|
|
109
|
+
}
|
|
110
|
+
root.metadata = { ...(root.metadata ?? {}), tintColor: hex ?? null };
|
|
111
|
+
}
|
|
112
|
+
/** Same file on :3000/uploads vs :3001/uploads must share one GPU copy. */
|
|
113
|
+
// assetCacheKey lives in AvatarAssetManager (shared with GLB container cache).
|
|
114
|
+
function absoluteAssetUrl(url) {
|
|
115
|
+
if (typeof window === 'undefined')
|
|
116
|
+
return url;
|
|
117
|
+
if (!url.startsWith('/'))
|
|
118
|
+
return url;
|
|
119
|
+
// Prefer platform origin when lobby runs inside a game iframe on another host.
|
|
120
|
+
try {
|
|
121
|
+
const ref = document.referrer ? new URL(document.referrer).origin : '';
|
|
122
|
+
if (ref && ref !== window.location.origin) {
|
|
123
|
+
return `${ref}${url}`;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// ignore
|
|
128
|
+
}
|
|
129
|
+
return `${window.location.origin}${url}`;
|
|
130
|
+
}
|
|
131
|
+
function readColorVariantTexture(customConfig) {
|
|
132
|
+
if (!customConfig)
|
|
133
|
+
return null;
|
|
134
|
+
const variants = customConfig.colorVariants;
|
|
135
|
+
if (!Array.isArray(variants) || variants.length === 0)
|
|
136
|
+
return null;
|
|
137
|
+
const selectedKey = typeof customConfig.colorVariantKey === 'string' && customConfig.colorVariantKey.trim()
|
|
138
|
+
? customConfig.colorVariantKey.trim()
|
|
139
|
+
: typeof customConfig.defaultColorVariantKey === 'string' &&
|
|
140
|
+
customConfig.defaultColorVariantKey.trim()
|
|
141
|
+
? customConfig.defaultColorVariantKey.trim()
|
|
142
|
+
: null;
|
|
143
|
+
let hit = null;
|
|
144
|
+
if (selectedKey) {
|
|
145
|
+
for (const entry of variants) {
|
|
146
|
+
if (!entry || typeof entry !== 'object')
|
|
147
|
+
continue;
|
|
148
|
+
const src = entry;
|
|
149
|
+
if (src.key === selectedKey) {
|
|
150
|
+
hit = src;
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (!hit) {
|
|
156
|
+
const first = variants[0];
|
|
157
|
+
if (first && typeof first === 'object')
|
|
158
|
+
hit = first;
|
|
159
|
+
}
|
|
160
|
+
if (!hit)
|
|
161
|
+
return null;
|
|
162
|
+
if (hit.appliesToBase === false)
|
|
163
|
+
return null;
|
|
164
|
+
if (typeof hit.textureUrl === 'string' && hit.textureUrl.trim()) {
|
|
165
|
+
return hit.textureUrl.trim();
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
/** Read base-body albedo: preset colorVariants first, then accessory appliesToBase. */
|
|
170
|
+
export function readBaseAlbedoUrlFromConfig(customConfig) {
|
|
171
|
+
const fromPalette = readColorVariantTexture(customConfig);
|
|
172
|
+
if (fromPalette)
|
|
173
|
+
return fromPalette;
|
|
174
|
+
const raw = customConfig?.accessories;
|
|
175
|
+
if (!Array.isArray(raw))
|
|
176
|
+
return null;
|
|
177
|
+
for (const entry of raw) {
|
|
178
|
+
if (!entry || typeof entry !== 'object')
|
|
179
|
+
continue;
|
|
180
|
+
const src = entry;
|
|
181
|
+
if (src.appliesToBase !== true)
|
|
182
|
+
continue;
|
|
183
|
+
if (typeof src.textureUrl === 'string' && src.textureUrl.trim()) {
|
|
184
|
+
return src.textureUrl.trim();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* One GPU texture per URL per scene. A 1K albedo costs ~5MB of VRAM, so a lobby
|
|
191
|
+
* of players wearing the same colour used to pay that cost once per avatar.
|
|
192
|
+
*/
|
|
193
|
+
const albedoTextureCache = new WeakMap();
|
|
194
|
+
function sharedAlbedoTexture(scene, url, invertY, like) {
|
|
195
|
+
let byUrl = albedoTextureCache.get(scene);
|
|
196
|
+
if (!byUrl) {
|
|
197
|
+
byUrl = new Map();
|
|
198
|
+
albedoTextureCache.set(scene, byUrl);
|
|
199
|
+
scene.onDisposeObservable.addOnce(() => albedoTextureCache.delete(scene));
|
|
200
|
+
}
|
|
201
|
+
// UV transform is part of the identity: two materials that sample the same
|
|
202
|
+
// file differently must not share one instance.
|
|
203
|
+
const uv = like
|
|
204
|
+
? [like.wrapU, like.wrapV, like.uScale, like.vScale, like.uOffset, like.vOffset].join(',')
|
|
205
|
+
: 'default';
|
|
206
|
+
const key = `${assetCacheKey(url)}|${invertY ? 1 : 0}|${uv}`;
|
|
207
|
+
// Disposal removes its own entry below, so anything still cached is alive.
|
|
208
|
+
const cached = byUrl.get(key);
|
|
209
|
+
if (cached)
|
|
210
|
+
return cached;
|
|
211
|
+
const texture = new Texture(url, scene, false, invertY, Texture.TRILINEAR_SAMPLINGMODE);
|
|
212
|
+
texture.name = `avatar-albedo-${url.slice(-48)}`;
|
|
213
|
+
// Match glTF albedo sampling (linear UV, gamma color).
|
|
214
|
+
texture.gammaSpace = true;
|
|
215
|
+
texture.metadata = { ...(texture.metadata ?? {}), sharedAvatarAlbedo: true };
|
|
216
|
+
forceOpaqueTexture(texture);
|
|
217
|
+
if (like) {
|
|
218
|
+
texture.wrapU = like.wrapU;
|
|
219
|
+
texture.wrapV = like.wrapV;
|
|
220
|
+
texture.uScale = like.uScale;
|
|
221
|
+
texture.vScale = like.vScale;
|
|
222
|
+
texture.uOffset = like.uOffset;
|
|
223
|
+
texture.vOffset = like.vOffset;
|
|
224
|
+
}
|
|
225
|
+
// Shared across avatars: disposing one avatar must not blank the others.
|
|
226
|
+
texture.onDisposeObservable.add(() => byUrl?.delete(key));
|
|
227
|
+
byUrl.set(key, texture);
|
|
228
|
+
return texture;
|
|
229
|
+
}
|
|
230
|
+
function collectAlbedoMaterials(rootMat) {
|
|
231
|
+
if (!rootMat)
|
|
232
|
+
return [];
|
|
233
|
+
const out = [];
|
|
234
|
+
const visit = (mat) => {
|
|
235
|
+
if (!mat)
|
|
236
|
+
return;
|
|
237
|
+
const anyMat = mat;
|
|
238
|
+
if (anyMat.metadata?.isNameTag)
|
|
239
|
+
return;
|
|
240
|
+
if (Array.isArray(anyMat.subMaterials) && anyMat.subMaterials.length) {
|
|
241
|
+
for (const sub of anyMat.subMaterials)
|
|
242
|
+
visit(sub);
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
out.push(anyMat);
|
|
246
|
+
};
|
|
247
|
+
visit(rootMat);
|
|
248
|
+
return out;
|
|
249
|
+
}
|
|
250
|
+
export function applyAvatarBaseAlbedo(root, textureUrl) {
|
|
251
|
+
if (!root)
|
|
252
|
+
return;
|
|
253
|
+
const preferred = root.metadata?.tintMeshes?.filter(Boolean);
|
|
254
|
+
let meshes = preferred?.length
|
|
255
|
+
? preferred
|
|
256
|
+
: (() => {
|
|
257
|
+
try {
|
|
258
|
+
return root.getChildMeshes?.(true) ?? [];
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return [];
|
|
262
|
+
}
|
|
263
|
+
})();
|
|
264
|
+
meshes = meshes.filter((mesh) => {
|
|
265
|
+
if (!mesh || mesh.name?.includes('nametag'))
|
|
266
|
+
return false;
|
|
267
|
+
const meta = mesh.metadata;
|
|
268
|
+
if (meta?.isNameTag)
|
|
269
|
+
return false;
|
|
270
|
+
return true;
|
|
271
|
+
});
|
|
272
|
+
const absolute = textureUrl ? absoluteAssetUrl(textureUrl) : null;
|
|
273
|
+
const scene = root.getScene?.();
|
|
274
|
+
let swapped = 0;
|
|
275
|
+
for (const mesh of meshes) {
|
|
276
|
+
for (const mat of collectAlbedoMaterials(mesh.material)) {
|
|
277
|
+
const hasMap = !!(mat.albedoTexture || mat.diffuseTexture);
|
|
278
|
+
// Only swap materials that already carry an albedo map (clothing), not flat skin mats.
|
|
279
|
+
if (!hasMap && absolute)
|
|
280
|
+
continue;
|
|
281
|
+
const meta = (mat.metadata ?? {});
|
|
282
|
+
if (mat.albedoTexture && meta.baseAlbedoTexture === undefined) {
|
|
283
|
+
meta.baseAlbedoTexture = mat.albedoTexture;
|
|
284
|
+
}
|
|
285
|
+
if (mat.diffuseTexture && meta.baseDiffuseTexture === undefined) {
|
|
286
|
+
meta.baseDiffuseTexture = mat.diffuseTexture;
|
|
287
|
+
}
|
|
288
|
+
mat.metadata = meta;
|
|
289
|
+
if (absolute && scene) {
|
|
290
|
+
const prev = (mat.albedoTexture ?? mat.diffuseTexture);
|
|
291
|
+
const invertY = prev && typeof prev.invertY === 'boolean' ? prev.invertY : false;
|
|
292
|
+
const next = sharedAlbedoTexture(scene, absolute, invertY, prev);
|
|
293
|
+
if ('albedoTexture' in mat)
|
|
294
|
+
mat.albedoTexture = next;
|
|
295
|
+
else if ('diffuseTexture' in mat)
|
|
296
|
+
mat.diffuseTexture = next;
|
|
297
|
+
forceOpaqueTexture(next, mat);
|
|
298
|
+
mat.alpha = 1;
|
|
299
|
+
mat.transparencyMode = Material.MATERIAL_OPAQUE;
|
|
300
|
+
mat.alphaMode = 0;
|
|
301
|
+
if ('useAlphaFromAlbedoTexture' in mat) {
|
|
302
|
+
mat.useAlphaFromAlbedoTexture =
|
|
303
|
+
false;
|
|
304
|
+
}
|
|
305
|
+
if ('useAlphaFromDiffuseTexture' in mat) {
|
|
306
|
+
mat.useAlphaFromDiffuseTexture =
|
|
307
|
+
false;
|
|
308
|
+
}
|
|
309
|
+
// Texture variants must not be multiplied by leftover whole-avatar tint.
|
|
310
|
+
if (mat.albedoColor)
|
|
311
|
+
mat.albedoColor.set(1, 1, 1);
|
|
312
|
+
if (mat.diffuseColor)
|
|
313
|
+
mat.diffuseColor.set(1, 1, 1);
|
|
314
|
+
if (mat.emissiveColor)
|
|
315
|
+
mat.emissiveColor.set(0, 0, 0);
|
|
316
|
+
if (typeof mat.emissiveIntensity === 'number')
|
|
317
|
+
mat.emissiveIntensity = 0;
|
|
318
|
+
swapped += 1;
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
if ('albedoTexture' in mat && meta.baseAlbedoTexture !== undefined) {
|
|
322
|
+
mat.albedoTexture = meta.baseAlbedoTexture;
|
|
323
|
+
}
|
|
324
|
+
if ('diffuseTexture' in mat && meta.baseDiffuseTexture !== undefined) {
|
|
325
|
+
mat.diffuseTexture = meta.baseDiffuseTexture;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
mat.markAsDirty?.();
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (absolute && swapped === 0) {
|
|
332
|
+
console.warn('[lobby-sdk] base albedo: no textured materials found to swap', absolute);
|
|
333
|
+
}
|
|
334
|
+
else if (absolute) {
|
|
335
|
+
console.info('[lobby-sdk] base albedo applied', { url: absolute, materials: swapped });
|
|
336
|
+
}
|
|
337
|
+
root.metadata = { ...(root.metadata ?? {}), baseAlbedoUrl: absolute, tintColor: null };
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Keep albedo on the opaque path. glTF/PNG often sets hasAlpha=true after the
|
|
341
|
+
* async decode finishes — that re-enters alpha blending and the body looks
|
|
342
|
+
* see-through in front of plaza buildings.
|
|
343
|
+
*/
|
|
344
|
+
function forceOpaqueTexture(tex, mat) {
|
|
345
|
+
if (!tex)
|
|
346
|
+
return;
|
|
347
|
+
const lock = () => {
|
|
348
|
+
tex.hasAlpha = false;
|
|
349
|
+
tex.getAlphaFromRGB = false;
|
|
350
|
+
if (mat) {
|
|
351
|
+
mat.alpha = 1;
|
|
352
|
+
mat.transparencyMode = Material.MATERIAL_OPAQUE;
|
|
353
|
+
mat.alphaMode = 0;
|
|
354
|
+
mat.disableDepthWrite = false;
|
|
355
|
+
mat.useAlphaFromAlbedoTexture = false;
|
|
356
|
+
mat.useAlphaFromDiffuseTexture = false;
|
|
357
|
+
mat.markAsDirty(Material.AllDirtyFlag);
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
lock();
|
|
361
|
+
const meta = (tex.metadata ?? {});
|
|
362
|
+
if (meta.lobbyForceOpaque)
|
|
363
|
+
return;
|
|
364
|
+
tex.metadata = { ...meta, lobbyForceOpaque: true };
|
|
365
|
+
const obs = tex
|
|
366
|
+
.onLoadObservable;
|
|
367
|
+
obs?.add(lock);
|
|
368
|
+
}
|
|
369
|
+
export function lobbyQualityOf(scene) {
|
|
370
|
+
const value = scene.metadata?.lobbyQuality;
|
|
371
|
+
return value === 'low' || value === 'high' ? value : 'medium';
|
|
372
|
+
}
|
|
373
|
+
function countLobbyAvatars(scene) {
|
|
374
|
+
const tagged = scene.metadata?.lobbyAvatarCount;
|
|
375
|
+
if (typeof tagged === 'number' && tagged > 0)
|
|
376
|
+
return tagged;
|
|
377
|
+
let count = 0;
|
|
378
|
+
for (const node of scene.transformNodes) {
|
|
379
|
+
if (node.metadata?.isLobbyAvatarRoot)
|
|
380
|
+
count++;
|
|
381
|
+
}
|
|
382
|
+
return count;
|
|
383
|
+
}
|
|
384
|
+
function stripCloneSuffix(name) {
|
|
385
|
+
return (name ?? '').replace(/__a\d+$/, '');
|
|
386
|
+
}
|
|
387
|
+
function isImportRootName(name) {
|
|
388
|
+
const base = stripCloneSuffix(name).toLowerCase();
|
|
389
|
+
return base === '__root__' || base === 'world';
|
|
390
|
+
}
|
|
391
|
+
export function trimDetailMapsOnMaterials(meshes) {
|
|
392
|
+
for (const mesh of meshes) {
|
|
393
|
+
if (isImportRootName(mesh.name))
|
|
394
|
+
continue;
|
|
395
|
+
const rootMat = mesh?.material;
|
|
396
|
+
if (!rootMat)
|
|
397
|
+
continue;
|
|
398
|
+
const subs = rootMat.subMaterials;
|
|
399
|
+
const materials = Array.isArray(subs) && subs.length ? subs : [rootMat];
|
|
400
|
+
for (const mat of materials) {
|
|
401
|
+
if (!mat)
|
|
402
|
+
continue;
|
|
403
|
+
const anyMat = mat;
|
|
404
|
+
for (const slot of ['bumpTexture', 'metallicTexture', 'ambientTexture', 'reflectivityTexture']) {
|
|
405
|
+
if (anyMat[slot])
|
|
406
|
+
anyMat[slot] = null;
|
|
407
|
+
}
|
|
408
|
+
anyMat.markAsDirty?.();
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Normal and metallic-roughness maps double an avatar's texture memory for
|
|
414
|
+
* detail nobody can see on a phone-sized character. Low-tier devices ran out of
|
|
415
|
+
* GPU memory and lost the WebGL context (a white screen) because of them.
|
|
416
|
+
*/
|
|
417
|
+
export function trimAvatarMapsForLowEndDevices(scene, meshes) {
|
|
418
|
+
if (!shouldTrimAvatarDetailMaps({
|
|
419
|
+
quality: lobbyQualityOf(scene),
|
|
420
|
+
touch: isTouchDevice(),
|
|
421
|
+
avatarCount: countLobbyAvatars(scene) + 1,
|
|
422
|
+
})) {
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
trimDetailMapsOnMaterials(meshes);
|
|
426
|
+
}
|
|
427
|
+
function excludeAvatarFromGlow(scene, meshes) {
|
|
428
|
+
const glow = scene.metadata
|
|
429
|
+
?.plazaGlow;
|
|
430
|
+
if (!glow)
|
|
431
|
+
return;
|
|
432
|
+
for (const mesh of meshes) {
|
|
433
|
+
if (mesh instanceof Mesh)
|
|
434
|
+
glow.addExcludedMesh(mesh);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Strip Meshy/glTF PBR extras that inflate the vertex shader UBO count.
|
|
439
|
+
* WebGL2 guarantees only 12 vertex uniform blocks; plaza PointLights + skinning
|
|
440
|
+
* + clearcoat pushes past that and the mesh silently disappears (nametag only).
|
|
441
|
+
* Same-GLB remotes share one compiled Effect so they "work"; a second unique
|
|
442
|
+
* material recompiles and dies — that was the different-avatar invisibility bug.
|
|
443
|
+
*/
|
|
444
|
+
function stripHeavyPbrFeatures(mat) {
|
|
445
|
+
const anyMat = mat;
|
|
446
|
+
// Hemi + directional are enough for lobby bodies; plaza lamps stay on scenery.
|
|
447
|
+
anyMat.maxSimultaneousLights = 2;
|
|
448
|
+
anyMat._maxSimultaneousLights = 2;
|
|
449
|
+
if (anyMat.clearCoat)
|
|
450
|
+
anyMat.clearCoat.isEnabled = false;
|
|
451
|
+
if (anyMat.sheen)
|
|
452
|
+
anyMat.sheen.isEnabled = false;
|
|
453
|
+
if (anyMat.anisotropy)
|
|
454
|
+
anyMat.anisotropy.isEnabled = false;
|
|
455
|
+
if (anyMat.iridescence)
|
|
456
|
+
anyMat.iridescence.isEnabled = false;
|
|
457
|
+
if (anyMat.subSurface) {
|
|
458
|
+
anyMat.subSurface.isScatteringEnabled = false;
|
|
459
|
+
anyMat.subSurface.isRefractionEnabled = false;
|
|
460
|
+
anyMat.subSurface.isTranslucencyEnabled = false;
|
|
461
|
+
}
|
|
462
|
+
// No per-avatar reflections — scene pipeline owns bloom; mirrors look translucent.
|
|
463
|
+
const pbr = anyMat;
|
|
464
|
+
if (pbr.reflectionTexture)
|
|
465
|
+
pbr.reflectionTexture = null;
|
|
466
|
+
if (typeof pbr.environmentIntensity === 'number')
|
|
467
|
+
pbr.environmentIntensity = 0;
|
|
468
|
+
anyMat._markAllSubMeshesAsLightsDirty?.();
|
|
469
|
+
anyMat._markAllSubMeshesAsTexturesDirty?.();
|
|
470
|
+
}
|
|
471
|
+
function excludeAvatarFromPrePass(scene, meshes) {
|
|
472
|
+
try {
|
|
473
|
+
const prepass = scene.prePassRenderer;
|
|
474
|
+
if (!prepass?.excludedSkinnedMesh)
|
|
475
|
+
return;
|
|
476
|
+
for (const mesh of meshes) {
|
|
477
|
+
if (!(mesh instanceof Mesh) || !mesh.skeleton)
|
|
478
|
+
continue;
|
|
479
|
+
if (prepass.excludedSkinnedMesh.indexOf(mesh) === -1) {
|
|
480
|
+
prepass.excludedSkinnedMesh.push(mesh);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
catch {
|
|
485
|
+
// ignore
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Meshy/glTF looks hollow because albedo PNG alpha + __root__ Z-flip + culling.
|
|
490
|
+
* Force opaque + double-sided. Do not flipFaces, do not replace PBR.
|
|
491
|
+
* Do not forceDepthWrite — that punches holes in the plaza when two avatars overlap.
|
|
492
|
+
*/
|
|
493
|
+
export function hardenAvatarMaterials(meshes) {
|
|
494
|
+
const scene = meshes[0]?.getScene?.();
|
|
495
|
+
if (scene) {
|
|
496
|
+
excludeAvatarFromGlow(scene, meshes);
|
|
497
|
+
excludeAvatarFromPrePass(scene, meshes);
|
|
498
|
+
}
|
|
499
|
+
for (const mesh of meshes) {
|
|
500
|
+
if (!mesh || isImportRootName(mesh.name))
|
|
501
|
+
continue;
|
|
502
|
+
mesh.visibility = 1;
|
|
503
|
+
mesh.metadata = { ...(mesh.metadata ?? {}), isLobbyAvatar: true };
|
|
504
|
+
// Skinned AABBs are unreliable; remotes without this get frustum-culled.
|
|
505
|
+
mesh.alwaysSelectAsActiveMesh = true;
|
|
506
|
+
mesh.renderingGroupId = 0;
|
|
507
|
+
mesh.receiveShadows = false;
|
|
508
|
+
if (mesh instanceof Mesh) {
|
|
509
|
+
mesh.sideOrientation = Mesh.DOUBLESIDE;
|
|
510
|
+
mesh.overrideMaterialSideOrientation = Mesh.DOUBLESIDE;
|
|
511
|
+
}
|
|
512
|
+
const rootMat = mesh.material;
|
|
513
|
+
if (!rootMat)
|
|
514
|
+
continue;
|
|
515
|
+
const materials = [rootMat];
|
|
516
|
+
const subs = rootMat.subMaterials;
|
|
517
|
+
if (Array.isArray(subs)) {
|
|
518
|
+
for (const sub of subs)
|
|
519
|
+
if (sub)
|
|
520
|
+
materials.push(sub);
|
|
521
|
+
}
|
|
522
|
+
for (const mat of materials) {
|
|
523
|
+
mat.backFaceCulling = false;
|
|
524
|
+
mat.alpha = 1;
|
|
525
|
+
mat.transparencyMode = Material.MATERIAL_OPAQUE;
|
|
526
|
+
mat.alphaMode = 0;
|
|
527
|
+
mat.separateCullingPass = false;
|
|
528
|
+
// Opaque path already depth-writes; forceDepthWrite punches plaza holes on overlap.
|
|
529
|
+
mat.forceDepthWrite = false;
|
|
530
|
+
mat.disableDepthWrite = false;
|
|
531
|
+
mat.needDepthPrePass = false;
|
|
532
|
+
stripHeavyPbrFeatures(mat);
|
|
533
|
+
const anyMat = mat;
|
|
534
|
+
if ('useAlphaFromAlbedoTexture' in anyMat)
|
|
535
|
+
anyMat.useAlphaFromAlbedoTexture = false;
|
|
536
|
+
if ('useAlphaFromDiffuseTexture' in anyMat)
|
|
537
|
+
anyMat.useAlphaFromDiffuseTexture = false;
|
|
538
|
+
if ('twoSidedLighting' in anyMat)
|
|
539
|
+
anyMat.twoSidedLighting = true;
|
|
540
|
+
// KHR_materials_specular specularFactor:0 lands here and makes the body a hole.
|
|
541
|
+
if (typeof anyMat.metallicF0Factor === 'number' && anyMat.metallicF0Factor < 0.5) {
|
|
542
|
+
anyMat.metallicF0Factor = 1;
|
|
543
|
+
}
|
|
544
|
+
forceOpaqueTexture(anyMat.albedoTexture, mat);
|
|
545
|
+
forceOpaqueTexture(anyMat.diffuseTexture, mat);
|
|
546
|
+
if (anyMat.opacityTexture)
|
|
547
|
+
anyMat.opacityTexture = null;
|
|
548
|
+
if (anyMat.reflectionTexture)
|
|
549
|
+
anyMat.reflectionTexture = null;
|
|
550
|
+
if (typeof anyMat.environmentIntensity === 'number')
|
|
551
|
+
anyMat.environmentIntensity = 0;
|
|
552
|
+
anyMat.markAsDirty?.();
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
/** Facade over avatar material / texture helpers. */
|
|
557
|
+
export class AvatarMaterialPipeline {
|
|
558
|
+
static harden(meshes) {
|
|
559
|
+
hardenAvatarMaterials(meshes);
|
|
560
|
+
}
|
|
561
|
+
static applyTint(root, hex) {
|
|
562
|
+
applyAvatarTint(root, hex);
|
|
563
|
+
}
|
|
564
|
+
static applyBaseAlbedo(root, textureUrl) {
|
|
565
|
+
applyAvatarBaseAlbedo(root, textureUrl);
|
|
566
|
+
}
|
|
567
|
+
static trimForLowEnd(scene, meshes) {
|
|
568
|
+
trimAvatarMapsForLowEndDevices(scene, meshes);
|
|
569
|
+
}
|
|
570
|
+
static trimDetailMapsOnMaterials(meshes) {
|
|
571
|
+
trimDetailMapsOnMaterials(meshes);
|
|
572
|
+
}
|
|
573
|
+
static readTintFromConfig(config) {
|
|
574
|
+
return readTintFromConfig(config);
|
|
575
|
+
}
|
|
576
|
+
static readBaseAlbedoUrlFromConfig(customConfig) {
|
|
577
|
+
return readBaseAlbedoUrlFromConfig(customConfig);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=avatar-material-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar-material-pipeline.js","sourceRoot":"","sources":["../src/avatar-material-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,QAAQ,EACR,IAAI,EAEJ,OAAO,GAER,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,EACb,0BAA0B,GAE3B,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,UAAU,kBAAkB,CAAC,MAA2C;IAC5E,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAU,EAAE,CAAC;QACnE,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAAC,IAAmB,EAAE,GAA8B;IACjF,IAAI,CAAC,IAAI;QAAE,OAAO;IAElB,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAI,IAAI,CAAC,QAAQ,EAAE,UAAyC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7F,IAAI,MAAM,GAAmB,SAAS,EAAE,MAAM;QAC5C,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,GAAG,EAAE;YACJ,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,QAA+C,CAAC;QAClE,IAAI,IAAI,EAAE,SAAS;YAAE,OAAO,KAAK,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,QAA+C,CAAC;QAC/E,IAAI,OAAO,EAAE,SAAS;YAAE,OAAO,KAAK,CAAC;QACrC,6EAA6E;QAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,QAAoF,CAAC;QACtG,IAAI,GAAG,EAAE,eAAe,IAAI,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QACzF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,CAAC,GAAoB,EAAE,EAAE;QAC7C,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,GAiBd,CAAC;YAEF,IAAI,MAAM,CAAC,QAAQ,EAAE,SAAS;gBAAE,OAAO;YACvC,IAAI,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC;gBAAE,OAAO;YAEvF,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBACvC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY;oBAAE,aAAa,CAAC,GAAG,CAAC,CAAC;gBAC1D,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAwC,CAAC;YAC5E,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzF,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YAC7F,IAAI,MAAM,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YACjG,IAAI,OAAO,MAAM,CAAC,iBAAiB,KAAK,QAAQ,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;gBAC7F,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,iBAAiB,CAAC;YACxD,CAAC;YACD,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;YAEvB,IAAI,IAAI,EAAE,CAAC;gBACT,+EAA+E;gBAC/E,IAAI,MAAM,CAAC,WAAW;oBAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;qBACrD,IAAI,MAAM,CAAC,YAAY;oBAAE,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACjE,IAAI,MAAM,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;oBACpD,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC/C,IAAI,OAAO,MAAM,CAAC,iBAAiB,KAAK,QAAQ;wBAAE,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBACpF,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU;oBAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxF,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW;oBAAE,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC5F,IAAI,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY;oBAAE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAChG,IAAI,OAAO,MAAM,CAAC,iBAAiB,KAAK,QAAQ,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;oBAC7F,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC;gBACxD,CAAC;YACH,CAAC;YACD,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;AACvE,CAAC;AAED,2EAA2E;AAC3E,+EAA+E;AAE/E,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,GAAG,CAAC;IAC9C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACrC,+EAA+E;IAC/E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,GAAG,IAAI,GAAG,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC1C,OAAO,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,uBAAuB,CAC9B,YAAwD;IAExD,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnE,MAAM,WAAW,GACf,OAAO,YAAY,CAAC,eAAe,KAAK,QAAQ,IAAI,YAAY,CAAC,eAAe,CAAC,IAAI,EAAE;QACrF,CAAC,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,EAAE;QACrC,CAAC,CAAC,OAAO,YAAY,CAAC,sBAAsB,KAAK,QAAQ;YACrD,YAAY,CAAC,sBAAsB,CAAC,IAAI,EAAE;YAC5C,CAAC,CAAC,YAAY,CAAC,sBAAsB,CAAC,IAAI,EAAE;YAC5C,CAAC,CAAC,IAAI,CAAC;IAEb,IAAI,GAAG,GAAmC,IAAI,CAAC;IAC/C,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YAClD,MAAM,GAAG,GAAG,KAAgC,CAAC;YAC7C,IAAI,GAAG,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;gBAC5B,GAAG,GAAG,GAAG,CAAC;gBACV,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,GAAG,GAAG,KAAgC,CAAC;IACjF,CAAC;IACD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,GAAG,CAAC,aAAa,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QAChE,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,2BAA2B,CACzC,YAAwD;IAExD,MAAM,WAAW,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAC1D,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,MAAM,GAAG,GAAG,YAAY,EAAE,WAAW,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,GAAG,GAAG,KAGX,CAAC;QACF,IAAI,GAAG,CAAC,aAAa,KAAK,IAAI;YAAE,SAAS;QACzC,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YAChE,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAsBD;;;GAGG;AACH,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAA+B,CAAC;AAEtE,SAAS,mBAAmB,CAC1B,KAAY,EACZ,GAAW,EACX,OAAgB,EAChB,IAAgC;IAEhC,IAAI,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QAClB,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrC,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,2EAA2E;IAC3E,gDAAgD;IAChD,MAAM,EAAE,GAAG,IAAI;QACb,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1F,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,GAAG,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IAC7D,2EAA2E;IAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACxF,OAAO,CAAC,IAAI,GAAG,iBAAiB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACjD,uDAAuD;IACvD,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,QAAQ,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC7E,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC/B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IACjC,CAAC;IACD,yEAAyE;IACzE,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAwB;IACtD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,CAAC,GAAoB,EAAE,EAAE;QACrC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,MAAM,GAAG,GAAyB,CAAC;QACzC,IAAI,MAAM,CAAC,QAAQ,EAAE,SAAS;YAAE,OAAO;QACvC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACrE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAmB,EAAE,UAAqC;IAC9F,IAAI,CAAC,IAAI;QAAE,OAAO;IAElB,MAAM,SAAS,GAAI,IAAI,CAAC,QAAQ,EAAE,UAAyC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7F,IAAI,MAAM,GAAmB,SAAS,EAAE,MAAM;QAC5C,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,GAAG,EAAE;YACJ,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC9B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,QAA+C,CAAC;QAClE,IAAI,IAAI,EAAE,SAAS;YAAE,OAAO,KAAK,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;IAChC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;YAC3D,uFAAuF;YACvF,IAAI,CAAC,MAAM,IAAI,QAAQ;gBAAE,SAAS;YAElC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAqC,CAAC;YACtE,IAAI,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBAC9D,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,aAAa,CAAC;YAC7C,CAAC;YACD,IAAI,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBAChE,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,cAAc,CAAC;YAC/C,CAAC;YACD,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;YAEpB,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,cAAc,CAA+B,CAAC;gBACrF,MAAM,OAAO,GACX,IAAI,IAAI,OAAQ,IAAgB,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAE,IAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC7F,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBACjE,IAAI,eAAe,IAAI,GAAG;oBAAE,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;qBAChD,IAAI,gBAAgB,IAAI,GAAG;oBAAE,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC5D,kBAAkB,CAAC,IAAI,EAAE,GAAe,CAAC,CAAC;gBACzC,GAAgB,CAAC,KAAK,GAAG,CAAC,CAAC;gBAC3B,GAAgB,CAAC,gBAAgB,GAAG,QAAQ,CAAC,eAAe,CAAC;gBAC7D,GAAgB,CAAC,SAAS,GAAG,CAAC,CAAC;gBAChC,IAAI,2BAA2B,IAAI,GAAG,EAAE,CAAC;oBACtC,GAAoE,CAAC,yBAAyB;wBAC7F,KAAK,CAAC;gBACV,CAAC;gBACD,IAAI,4BAA4B,IAAI,GAAG,EAAE,CAAC;oBACvC,GAAqE,CAAC,0BAA0B;wBAC/F,KAAK,CAAC;gBACV,CAAC;gBAED,yEAAyE;gBACzE,IAAI,GAAG,CAAC,WAAW;oBAAE,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClD,IAAI,GAAG,CAAC,YAAY;oBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpD,IAAI,GAAG,CAAC,aAAa;oBAAE,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtD,IAAI,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ;oBAAE,GAAG,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBACzE,OAAO,IAAI,CAAC,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,IAAI,eAAe,IAAI,GAAG,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;oBACnE,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC;gBAC7C,CAAC;gBACD,IAAI,gBAAgB,IAAI,GAAG,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;oBACrE,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC;gBAC/C,CAAC;YACH,CAAC;YACD,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,8DAA8D,EAAE,QAAQ,CAAC,CAAC;IACzF,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACzF,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,GAAmC,EAAE,GAAc;IAC7E,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;QACrB,GAAG,CAAC,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YACd,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,eAAe,CAAC;YAChD,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;YAClB,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC7B,GAA0D,CAAC,yBAAyB,GAAG,KAAK,CAAC;YAC7F,GAA2D,CAAC,0BAA0B,GAAG,KAAK,CAAC;YAChG,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC;IACF,IAAI,EAAE,CAAC;IACP,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAmC,CAAC;IACpE,IAAI,IAAI,CAAC,gBAAgB;QAAE,OAAO;IAClC,GAAG,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IACnD,MAAM,GAAG,GAAI,GAA8E;SACxF,gBAAgB,CAAC;IACpB,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAY;IACzC,MAAM,KAAK,GAAI,KAAK,CAAC,QAA6D,EAAE,YAAY,CAAC;IACjG,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAChE,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAY;IACrC,MAAM,MAAM,GAAI,KAAK,CAAC,QAAsD,EAAE,gBAAgB,CAAC;IAC/F,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,QAAQ,EAAE,iBAAiB;YAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAwB;IAChD,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAwB;IAChD,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAClD,OAAO,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,OAAO,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAsB;IAC9D,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC1C,MAAM,OAAO,GAAG,IAAI,EAAE,QAAQ,CAAC;QAC/B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,IAAI,GAAI,OAAqD,CAAC,YAAY,CAAC;QACjF,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACxE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,MAAM,MAAM,GAAG,GAMd,CAAC;YACF,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,qBAAqB,CAAU,EAAE,CAAC;gBACxG,IAAI,MAAM,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACxC,CAAC;YACD,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,8BAA8B,CAAC,KAAY,EAAE,MAAsB;IACjF,IACE,CAAC,0BAA0B,CAAC;QAC1B,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC;QAC9B,KAAK,EAAE,aAAa,EAAE;QACtB,WAAW,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC;KAC1C,CAAC,EACF,CAAC;QACD,OAAO;IACT,CAAC;IACD,yBAAyB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAY,EAAE,MAAsB;IACjE,MAAM,IAAI,GAAI,KAAK,CAAC,QAAkF;QACpG,EAAE,SAAS,CAAC;IACd,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,IAAI,YAAY,IAAI;YAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB,CAAC,GAAa;IAC1C,MAAM,MAAM,GAAG,GAed,CAAC;IAEF,+EAA+E;IAC/E,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAC;IACjC,MAAM,CAAC,sBAAsB,GAAG,CAAC,CAAC;IAElC,IAAI,MAAM,CAAC,SAAS;QAAE,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,KAAK,CAAC;IACzD,IAAI,MAAM,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;IACjD,IAAI,MAAM,CAAC,UAAU;QAAE,MAAM,CAAC,UAAU,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3D,IAAI,MAAM,CAAC,WAAW;QAAE,MAAM,CAAC,WAAW,CAAC,SAAS,GAAG,KAAK,CAAC;IAC7D,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,CAAC,UAAU,CAAC,mBAAmB,GAAG,KAAK,CAAC;QAC9C,MAAM,CAAC,UAAU,CAAC,mBAAmB,GAAG,KAAK,CAAC;QAC9C,MAAM,CAAC,UAAU,CAAC,qBAAqB,GAAG,KAAK,CAAC;IAClD,CAAC;IACD,mFAAmF;IACnF,MAAM,GAAG,GAAG,MAGX,CAAC;IACF,IAAI,GAAG,CAAC,iBAAiB;QAAE,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC;IACxD,IAAI,OAAO,GAAG,CAAC,oBAAoB,KAAK,QAAQ;QAAE,GAAG,CAAC,oBAAoB,GAAG,CAAC,CAAC;IAC/E,MAAM,CAAC,8BAA8B,EAAE,EAAE,CAAC;IAC1C,MAAM,CAAC,gCAAgC,EAAE,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAY,EAAE,MAAsB;IACpE,IAAI,CAAC;QACH,MAAM,OAAO,GAAI,KAAuE,CAAC,eAAe,CAAC;QACzG,IAAI,CAAC,OAAO,EAAE,mBAAmB;YAAE,OAAO;QAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxD,IAAI,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACrD,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAsB;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC;IACtC,IAAI,KAAK,EAAE,CAAC;QACV,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrC,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACnD,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QAClE,yEAAyE;QACzE,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACrC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC;YACvC,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC,UAAU,CAAC;QACzD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,SAAS,GAAe,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,IAAI,GAAI,OAAqD,CAAC,YAAY,CAAC;QACjF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,IAAI,GAAG;oBAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,GAAG,CAAC,eAAe,GAAG,KAAK,CAAC;YAC5B,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YACd,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,eAAe,CAAC;YAChD,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;YAClB,GAAG,CAAC,mBAAmB,GAAG,KAAK,CAAC;YAChC,oFAAoF;YACpF,GAAG,CAAC,eAAe,GAAG,KAAK,CAAC;YAC5B,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC9B,GAAG,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAE7B,qBAAqB,CAAC,GAAG,CAAC,CAAC;YAE3B,MAAM,MAAM,GAAG,GAWd,CAAC;YACF,IAAI,2BAA2B,IAAI,MAAM;gBAAE,MAAM,CAAC,yBAAyB,GAAG,KAAK,CAAC;YACpF,IAAI,4BAA4B,IAAI,MAAM;gBAAE,MAAM,CAAC,0BAA0B,GAAG,KAAK,CAAC;YACtF,IAAI,kBAAkB,IAAI,MAAM;gBAAE,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC;YACjE,gFAAgF;YAChF,IAAI,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ,IAAI,MAAM,CAAC,gBAAgB,GAAG,GAAG,EAAE,CAAC;gBACjF,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAC9B,CAAC;YACD,kBAAkB,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAC9C,kBAAkB,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YAC/C,IAAI,MAAM,CAAC,cAAc;gBAAE,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;YACxD,IAAI,MAAM,CAAC,iBAAiB;gBAAE,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9D,IAAI,OAAO,MAAM,CAAC,oBAAoB,KAAK,QAAQ;gBAAE,MAAM,CAAC,oBAAoB,GAAG,CAAC,CAAC;YACrF,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,MAAM,OAAO,sBAAsB;IACjC,MAAM,CAAC,MAAM,CAAC,MAAsB;QAClC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,IAAmB,EAAE,GAA8B;QAClE,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,IAAmB,EAAE,UAAqC;QAC/E,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,KAAY,EAAE,MAAsB;QACvD,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,yBAAyB,CAAC,MAAsB;QACrD,yBAAyB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,MAA2C;QACnE,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,2BAA2B,CAChC,YAAwD;QAExD,OAAO,2BAA2B,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC;CACF"}
|