PageSourceSearch

https://navigatio.earth/tidal/

html navigatio.earth collected 2026-09-26 18:17:43 UTC 1,256,029 bytes, 4,427 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3<head>
4<meta charset="UTF-8">
5<script>
6// --- Shared-link expiry (soft/UX-level only, not real security — see chat notes) ---
7// Edit LINK_EXPIRES below (YYYY-MM-DD) to change when this link stops working.
8(function(){
9  var LINK_EXPIRES = "2026-09-30";
10  var expiry = new Date(LINK_EXPIRES + "T23:59:59");
11  if(new Date() > expiry){
12    document.write(
13      '<div style="min-height:100vh;display:flex;align-items:center;justify-content:center;'+
14      'background:#0a0d13;color:#e9ecf3;font-family:sans-serif;text-align:center;padding:20px;">'+
15      '<div><div style="font-size:20px;font-weight:700;margin-bottom:8px;">This link has expired</div>'+
16      '<div style="color:#8992a8;font-size:14px;">Ask for a fresh link if you still need access.</div></div></div>'
17    );
18    window.stop && window.stop();
19  }
20})();
21</script>
21
22<meta name="viewport" content="width=device-width, initial-scale=1.0">
23<title>Tidal — Match Momentum Visualiser</title>
24<meta name="description" content="A football match visualiser showing attacking momentum as tidal surges on a 3D pitch, synced to match audio. Load your own match data or try the demo.">
25<!-- Social link-preview tags (WhatsApp, Slack, iMessage, etc.) are read by a
26     bot that only fetches the static HTML — it never runs this page's JS —
27     so these can't reflect which specific match a shared link points to
28     (that only exists client-side, after the gist/data fragment is loaded).
29     Keeping this generic and accurate for the app as a whole rather than
30     any one match. A genuinely per-match preview (real team names, live
31     score) would need server-side rendering per share link — a bigger
32     project than a static meta tag, flagged here rather than attempted. -->
33<meta property="og:title" content="Tidal — Match Momentum Visualiser">
34<meta property="og:description" content="Attacking momentum as tidal surges on a 3D pitch, synced to match audio. Load your own match data or try the demo.">
35<meta property="og:image" content="https://navigatio.earth/tidal/tidal-og-thumbnail.png">
36<meta property="og:type" content="website">
37<meta property="og:url" content="https://navigatio.earth/tidal/">
38<meta name="twitter:card" content="summary_large_image">
39<meta name="twitter:title" content="Tidal — Match Momentum Visualiser">
40<meta name="twitter:description" content="Attacking momentum as tidal surges on a 3D pitch, synced to match audio.">
41<meta name="twitter:image" content="https://navigatio.earth/tidal/tidal-og-thumbnail.png">
42<link rel="preconnect" href="https://fonts.googleapis.com">
43<link href="https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@600;700;800&family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
44<style>
45  :root{
46    --bg:#0a0d13;
47    --panel:#11151f;
48    --panel-2:#161b27;
49    --border:#232a3a;
50    --ink:#e9ecf3;
51    --ink-dim:#8992a8;
52    --accent:#12e0a8;
53    --gold:#ffb400;
54    --home:#2451e0;
55    --away:#ffffff;
56    /* Fallback only — kept accurate at runtime by measuring #header's real
57       rendered height, since it varies with wrapped text/buttons on narrow
58       screens. Everything below the header (#scorebug, #ticker, #goalFlash)
59       positions itself relative to this instead of a guessed pixel value,
60       so it can never overlap the header regardless of how tall it gets. */
61    --header-h:64px;
62    /* Fallback only — kept accurate at runtime by measuring #transport's real
63       rendered height (see syncTransportHeight), since it varies with wrapped
64       chip buttons on narrow screens or longer time readouts. #chartPanel
65       positions itself off this instead of a guessed pixel value, so the
66       possession chart can never get clipped by the transport bar sitting
67       taller than expected. */
68    --transport-h:132px;
69    /* Same measured-not-guessed pattern as --header-h/--transport-h — the
70       scorebug's real height varies with whether flags are shown, so the
71       possession bar below it is positioned off this instead of a fixed
72       pixel guess. */
73    --scorebug-h:90px;
74  }
75  *{box-sizing:border-box;}
76  html,body{margin:0;padding:0;width:100%;height:100%;background:var(--bg);overflow:hidden;
77    font-family:'Inter',sans-serif;color:var(--ink);}
78  #canvas-wrap{position:fixed;inset:0;}
79  canvas{display:block;}
80
81  .mono{font-family:'JetBrains Mono',monospace;}
82  .display{font-family:'Barlow Condensed',sans-serif;}
83
84  /* ---------- top header ---------- */
85  #header{
86    position:fixed;top:0;left:0;right:0;
87    display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:10px;
88    padding:14px 16px;pointer-events:none;
89    background:linear-gradient(to bottom, rgba(6,8,13,0.85), rgba(6,8,13,0));
90  }
91  #brand{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 auto;}
92  /* #header uses position:fixed, which per spec always creates its own
93     stacking context regardless of z-index. That traps #venueMapThumb'
93s
94     z-index so it can never out-rank a later sibling like #scorebug, no
95     matter how high it's set. Bumping #header's own context above
96     #scorebug's while the map is open is the actual fix. */
97  #header.mapOpen{z-index:20;}
98  #venueMapThumb{
99    position:relative;pointer-events:auto;cursor:pointer;
100    width:44px;height:44px;border-radius:10px;overflow:hidden;
101    border:1px solid var(--border);flex:none;background:var(--panel);
102    display:flex;align-items:center;justify-content:center;
103    transition:width .28s ease, height .28s ease;z-index:15;
104  }
105  /* Expanded state is pulled out of #brand's flow and pinned as its own
106     floating card, positioned off the (dynamically measured) header height.
107     Previously this grew inline inside the header, which could push the
108     header taller than #scorebug's assumed fixed offset expected, leaving
109     the map (and its collapse button) hidden behind the score card. */
110  #venueMapThumb.expanded{
111    position:fixed;top:calc(var(--header-h) + 8px);left:16px;
112    width:280px;height:200px;border-radius:10px;cursor:default;z-index:16;
113    box-shadow:0 8px 24px rgba(0,0,0,0.4);
114  }
115  #venueMapIcon{font-size:24px;width:44px;height:44px;line-height:44px;text-align:center;filter:drop-shadow(0 0 3px rgba(0,0,0,0.5));}
116  #venueMapThumb.expanded #venueMapIcon{display:none;}
117  #venueMapThumbFrame{width:100%;height:100%;border:none;display:none;}
118  #venueMapThumb.expanded #venueMapThumbFrame{display:block;}
119  #venueMapThumb:hover{border-color:var(--accent);}
120  #venueMapCloseBtn{
121    display:none;position:absolute;top:6px;right:6px;z-index:2;
122    width:24px;height:24px;border-radius:50%;border:none;
123    background:rgba(10,13,19,0.85);color:var(--ink);font-size:13px;line-height:1;
124    cursor:pointer;align-items:center;justify-content:center;
125  }
126  #venueMapThumb.expanded #venueMapCloseBtn{display:flex;}
127  #venueMapCloseBtn:hover{background:var(--accent);color:#0a0d13;}
128  @media (max-width:640px){
129    #venueMapThumb.expanded{width:240px;height:170px;}
130  }
131  #brand .word{font-family:'Barlow Condensed';font-weight:800;font-size:22px;letter-spacing:0.14em;color:var(--accent);}
132  #brand .word .wordmark-arrow{display:inline-block;width:0;height:0;vertical-align:middle;margin-bottom:2px;}
133  #brand .word .wordmark-arrow.left{border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:9px solid var(--accent);}
134  #brand .word .wordmark-arrow.right{border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:9px solid var(--accent);}
135  #versionTag{font-family:'JetBrains Mono';font-size:11px;font-weight:500;letter-spacing:0.02em;color:var(--ink-dim);text-transform:none;vertical-align:middle;margin-left:2px;}
136  #brand .meta{font-size:12px;color:var(--ink-dim);letter-spacing:0.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
137  #dataBtn, #lineupsBtn, #mapBtn, #showDebug{
138    pointer-events:auto;background:var(--panel);border:1px solid var(--border);color:var(--ink);
139    padding:9px 16px;border-radius:8px;font-size:12.5px;font-weight:600;letter-spacing:0.03em;
140    cursor:pointer;display:flex;align-items:center;gap:7px;transition:border-color .15s,color .15s;
141    flex:0 0 auto;white-space:nowrap;
142  }
143  #dataBtn:hover, #lineupsBtn:hover, #mapBtn:hover{border-color:var(--accent);color:var(--accent);}
144  #dataBtn:focus-visible, button:focus-visible, input:focus-visible{outline:2px solid var(--accent);outline-offset:2px;}
145
146  /* ---------- scorebug ---------- */
147  #scorebug{
148    position:fixed;top:calc(var(--header-h) + 8px);left:50%;transform:translateX(-50%);
149    display:flex;align-items:center;gap:22px;
150    background:rgba(11,14,21,0.92);
151    border:1px solid var(--border);border-radius:14px;
152    padding:10px 24px;pointer-events:none;
153  }
154  .team-tag{display:flex;align-items:center;gap:10px;}
155  .swatch{width:10px;height:26px;border-radius:3px;flex:none;}
156  .team-name{font-size:12px;color:var(--ink-dim);text-transform:uppercase;letter-spacing:0.08em;font-weight:600;}
157  .score-num{font-family:'Barlow Condensed';font-weight:800;font-size:38px;line-height:1;min-width:34px;text-align:center;}
158  .team-flag{display:block;width:26px;height:auto;border-radius:3px;margin:4px auto 0;box-shadow:0 0 0 1px rgba(255,255,255,0.15);}
159  #minuteClock{display:flex;flex-direction:column;align-items:center;padding-left:16px;border-left:1px solid var(--border);}
160  #minuteClock .m{font-family:'Barlow Condensed';font-weight:700;font-size:26px;}
161  #minuteClock .half{font-size:10px;color:var(--ink-dim);letter-spacing:0.1em;text-transform:uppercase;}
162
163  /* ---------- goal ticker ---------- */
164  #tickHome, #tickAway{
165    position:fixed;pointer-events:none;z-index:5;
166    display:flex;flex-direction:column;gap:4px;align-items:center;
167  }
168  .tick-col{display:flex;flex-direction:column;gap:4px;align-items:center;}
169  .tick-dot{
170    width:15px;height:15px;border-radius:50%;font-size:8px;display:flex;align-items:center;justify-content:center;
171    color:#0a0d13;font-weight:700;cursor:pointer;pointer-events:auto;opacity:0.35;transition:opacity .2s,transform .2s;
172    border:1.5px solid rgba(255,255,255,0.25);
173  }
174  .tick-dot.reached{opacity:1;}
175  .tick-dot:hover{transform:scale(1.25);}
176  .tick-dot-penalty{border-radius:3px;transform:rotate(45deg);width:12px;height:12px;border-width:2px;}
177  #penCountHome, #penCountAway{
178    position:fixed;font-family:'JetBrains Mono';font-size:16px;font-weight:800;
179    width:34px;height:34px;border-radius:50%;align-items:center;justify-content:center;
180    box-shadow:0 2px 6px rgba(0,0,0,0.4);border:1px solid rgba(255,255,255,0.2);
181    display:none;pointer-events:none;
182  }
183  .tick-dot-penalty:hover{transform:rotate(45deg) scale(1.25);}
184  .tick-dot-penalty.miss{background:transparent!important;}
185  .tick-label{font-size:9.5px;color:var(--ink-dim);font-family:'JetBrains Mono';}
186
187  /* ---------- goal flash ---------- */
188  #goalFlash{
189    position:fixed;top:calc(var(--header-h) + 140px);left:50%;transform:translateX(-50%) translateY(-8px);
190    background:rgba(17,21,31,0.9);border:1px solid var(--gold);border-radius:10px;
191    padding:9px 20px;display:flex;align-items:center;gap:12px;opacity:0;
192    transition:opacity .35s ease, transform .35s ease;pointer-events:none;
193    z-index:10;
194  }
195  #goalFlash.show{opacity:1;transform:translateX(-50%) translateY(0);}
196  #flashPhoto{
197    width:96px;height:96px;border-radius:11px;object-fit:cover;object-position:50% 15%;
198    border:1px solid rgba(255,180,0,0.5);flex:none;
199    transition:width .15s ease;
200  }
201  /* Applied automatically (via JS, based on the loaded image's real aspect ratio)
202     when a goal photo is a wide action shot rather than a portrait headsh
202ot —
203     object-position:50% 15% assumes a face near the top of the frame, which
204     crops badly on a landscape shot, so this widens the box and re-centers. */
205  #flashPhoto.landscape{width:170px;height:96px;object-position:50% 50%;}
206  #goalFlash .lbl{font-family:'Barlow Condensed';font-weight:800;font-size:18px;letter-spacing:0.06em;color:var(--gold);}
207  #goalFlash .sub{font-size:11px;color:var(--ink-dim);font-family:'JetBrains Mono';}
208
209  /* ---------- possession chart ---------- */
210  #chartPanel{
211    position:fixed;left:16px;right:16px;bottom:calc(var(--transport-h) + 16px);height:64px;
212    background:rgba(11,14,21,0.72);border:1px solid var(--border);border-radius:10px;
213    overflow:hidden;z-index:4;
214  }
215  #possessionChart{width:100%;height:100%;display:block;}
216  @media (max-width:640px){
217    #chartPanel{height:42px;left:10px;right:10px;}
218  }
219
220  /* ---------- transport ---------- */
221  #transport{
222    position:fixed;bottom:0;left:0;right:0;padding:16px 22px 20px;
223    background:linear-gradient(to top, rgba(6,8,13,0.92), rgba(6,8,13,0));
224    display:flex;flex-direction:column;gap:10px;
225  }
226  #scrubRow{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;}
227  #transportLeft{display:flex;align-items:center;gap:12px;}
228  #playBtn{
229    width:42px;height:42px;border-radius:50%;background:var(--accent);border:none;
230    color:#04140f;font-size:15px;display:flex;align-items:center;justify-content:center;cursor:pointer;flex:none;
231    transition:transform .12s;
232  }
233  #playBtn:hover{transform:scale(1.06);}
234  #timeReadout{font-size:12px;color:var(--ink-dim);min-width:74px;text-align:right;}
235  #controlsRow{display:flex;align-items:center;gap:8px;justify-content:flex-end;}
236  .chip-btn{
237    background:var(--panel);border:1px solid var(--border);color:var(--ink-dim);
238    padding:6px 11px;border-radius:7px;font-size:11.5px;font-weight:600;cursor:pointer;font-family:'JetBrains Mono';
239    transition:all .15s;
240  }
241  .chip-btn.active,.chip-btn:hover{color:var(--accent);border-color:var(--accent);}
242  #muteBtn{width:32px;height:32px;border-radius:7px;background:var(--panel);border:1px solid var(--border);color:var(--ink-dim);cursor:pointer;font-size:14px;}
243  #muteBtn:hover{color:var(--accent);border-color:var(--accent);}
244
245  /* ---------- data panel ---------- */
246  #overlay{position:fixed;inset:0;background:rgba(4,5,9,0.55);opacity:0;pointer-events:none;transition:opacity .25s;z-index:20;}
247  #overlay.show{opacity:1;pointer-events:auto;}
248  #panel{
249    position:fixed;top:0;right:0;bottom:0;width:380px;max-width:92vw;
250    background:var(--panel);border-left:1px solid var(--border);
251    transform:translateX(100%);transition:transform .3s ease;z-index:21;
252    display:flex;flex-direction:column;
253  }
254  #panel.show{transform:translateX(0);}
255  #panelHead, .panelHead{padding:20px 20px 14px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center;}
256  #panelHead h2, .panelHead h2{font-family:'Barlow Condensed';font-weight:700;font-size:20px;margin:0;letter-spacing:0.02em;}
257  #closePanel, #closeLineups{background:none;border:none;color:var(--ink-dim);font-size:20px;cursor:pointer;line-height:1;}
258  #closePanel:hover, #closeLineups:hover{color:var(--ink);}
259  #panelBody, .panelBody{padding:18px 20px 100px;overflow-y:auto;flex:1;}
260  #lineupsPanel, #mapPanel{
261    position:fixed;top:0;right:0;bottom:0;width:560px;max-width:94vw;
262    background:var(--panel);border-left:1px solid var(--border);
263    transform:translateX(100%);transition:transform .3s ease;z-index:21;
264    display:flex;flex-direction:column;
265  }
266  #lineupsPanel.show, #mapPanel.show{transform:translateX(0);}
267  .lineups-grid{display:flex;gap:18px;}
268  .lineups-col{flex:1;min-width:0;}
269  .lineups-team-head{font-family:'Barlow Condensed';font-weight:700;font-size:17px;margin-bottom:2px;}
270  .lineups-flag{width:22px;height:auto;border-radius:2px;vertical-align:middle;margin-right:7px;box-shadow:0 0 0 1px rgba(255,255,255,0.15);}
271  .lineups-formation{font-size:11px;color:var(--ink-dim);font-family:'JetBrains Mono';margin-bottom:10px;}
272  .lineups-section-label{font-size:10.5px;text-transform:uppercase;letter-spacing:0.07em;color:var(--ink-dim);font-weight:700;margin:14px 0 6px;}
273  .lineup-player{display:flex;gap:8px;align-items:center;font-size:12.5px;padding:4px 0;border-bottom:1px solid rgba(255,255,255,0.05);}
274  .lineup-thumb{width:40px;height:40px;border-radius:50%;object-fit:cover;object-position:50% 15%;flex:none;background:var(--panel-2);cursor:pointer;transition:transform .15s ease;}
275  .lineup-thumb:hover{transform:scale(1.08);}
276  .lineup-thumb-empty{border:1px solid var(--border);}
277  #photoLightbox{
278    display:none;position:fixed;inset:0;z-index:60;background:rgba(6,8,13,0.92);
279    align-items:center;justify-content:center;flex-direction:column;gap:12px;cursor:pointer;
280  }
281  #photoLightbox.show{display:flex;}
282  #photoLightboxImg{max-width:min(80vw,420px);max-height:65vh;border-radius:12px;border:1px solid var(--border);object-fit:cover;object-position:50% 15%;}
283  #photoLightboxCaption{font-family:'Barlow Condensed';font-weight:700;font-size:20px;color:var(--ink);}
284  .lineup-player .num{font-family:'JetBrains Mono';color:var(--accent);min-width:20px;font-size:11px;}
285  .nm-wrap{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;}
286  .lineup-player .nm{white-space:normal;overflow-wrap:break-word;line-height:1.25;}
287  .lineup-player .cl{color:var(--ink-dim);font-size:11px;white-space:normal;overflow-wrap:break-word;}
288  @media (max-width:640px){
289    #lineupsPanel, #mapPanel{width:100vw;}
290    .lineups-grid{flex-direction:column;gap:22px;}
291  }
292  .field-group{margin-bottom:18px;}
293  .field-label{font-size:11px;text-transform:uppercase;letter-spacing:0.08em;color:var(--ink-dim);font-weight:600;margin-bottom:7px;display:block;}
294  .team-row{display:flex;gap:10px;}
295  .team-row input[type=text]{flex:1;}
296  input[type=text]{
297    background:var(--panel-2);border:1px solid var(--border);color:var(--ink);border-radius:7px;
298    padding:8px 10px;font-size:13px;font-family:'Inter';width:100%;
299  }
300  input[type=color]{width:38px;height:36px;padding:2px;border-radius:7px;border:1px solid var(--border);background:var(--panel-2);cursor:pointer;}
301  textarea{
302    width:100%;min-height:230px;background:var(--panel-2);border:1px solid var(--border);color:var(--ink);
303    border-radius:8px;padding:12px;font-family:'JetBrains Mono';font-size:11.5px;line-height:1.55;resize:vertical;
304  }
305  .hint{font-size:11px;color:var(--ink-dim);margin-top:6px;line-height:1.5;}
306  .hint-details{margin-top:6px;}
307  .hint-details summary{font-size:11px;color:var(--accent);cursor:pointer;user-select:none;list-style:none;}
308  .hint-details summary::-webkit-details-marker{display:none;}
309  .hint-details summary::before{content:'▸ ';display:inline-block;transition:transform .15s;}
310  .hint-details[open] summary::before{transform:rotate(90deg);}
311  .hint-details .hint{margin-top:6px;}
312  .panel-section-divider{display:flex;align-items:center;gap:10px;margin:22px 0 14px;}
313  .panel-section-divider::before,.panel-section-divider::after{content:'';flex:1;height:1px;background:var(--border);}
314  .panel-section-divider span{font-size:11px;font-weight:700;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-dim);white-space:nowrap;}
315  #panelActions{display:flex;gap:9px;margin-top:6px;}
316  .btn-primary{
317    flex:1;background:var(--accent);border:none;color:#04140f;font-weight:700;font-size:12.5px;
318    padding:10px 12px;border-radius:8px;
318cursor:pointer;letter-spacing:0.02em;
319  }
320  .btn-secondary{
321    background:transparent;border:1px solid var(--border);color:var(--ink-dim);font-size:12.5px;
322    padding:10px 12px;border-radius:8px;cursor:pointer;
323  }
324  .btn-secondary:hover{color:var(--ink);border-color:var(--ink-dim);}
325  .file-btn{
326    background:var(--panel-2);border:1px solid var(--border);color:var(--ink-dim);
327    font-size:10.5px;font-weight:600;padding:4px 9px;border-radius:6px;cursor:pointer;
328    font-family:'JetBrains Mono';white-space:nowrap;transition:all .15s;
329  }
330  .file-btn:hover{color:var(--accent);border-color:var(--accent);}
331  #errBox{color:#ff6b6b;font-size:11.5px;margin-top:8px;font-family:'JetBrains Mono';white-space:pre-wrap;display:none;}
332
333  @media (max-width:640px){
334    #scorebug{gap:12px;padding:8px 14px;}
335    .score-num{font-size:28px;}
336    #ticker{display:none;}
337    #brand .word{font-size:17px;}
338    /* Was a single truncated line (nowrap+ellipsis) that regularly cut the
339       venue name off mid-word on phones. Wrapping to 2 lines instead, on a
340       much wider box, keeps it readable — the header's real height is
341       re-measured after this changes, so nothing downstream overlaps it. */
342    #brand .meta{font-size:10.5px;max-width:78vw;white-space:normal;overflow:visible;text-overflow:clip;line-height:1.4;}
343    #dataBtn, #lineupsBtn, #mapBtn{padding:8px 12px;font-size:11.5px;}
344    #panel{width:100vw;}
345  }
346
347  @media (prefers-reduced-motion: reduce){
348    *{transition-duration:0.01ms !important;}
349  }
350
351  /* ---------- dominant-team indicator: one dynamic label (avoids the old
352     fixed left/right labels clashing with the header's team order) ---------- */
353  #dominantLabel{
354    position:fixed;left:0;right:0;bottom:250px;text-align:center;
355    font-family:'Barlow Condensed';font-weight:700;font-size:17px;letter-spacing:0.08em;
356    text-transform:uppercase;pointer-events:none;z-index:5;transition:color .3s ease;
357  }
358  @media (max-width:640px){
359    #dominantLabel{bottom:210px;font-size:13px;}
360  }
361  #shareBar{
362    position:fixed;bottom:202px;left:50%;transform:translateX(-50%);
363    display:flex;flex-direction:column;align-items:center;gap:4px;
364    pointer-events:none;z-index:5;width:280px;max-width:70vw;
365  }
366  #shareTrack{
367    width:100%;height:8px;border-radius:4px;overflow:hidden;
368    display:flex;background:var(--panel-2);border:1px solid var(--border);
369  }
370  #shareHomeFill{background:var(--home);height:100%;transition:width .3s ease;}
371  #shareAwayFill{background:var(--away);height:100%;transition:width .3s ease;}
372  #shareLabels{
373    display:flex;justify-content:space-between;width:100%;
374    font-family:'JetBrains Mono';font-size:10px;color:var(--ink-dim);
375  }
376  @media (max-width:640px){
377    #shareBar{bottom:168px;width:220px;}
378  }
379  #shareLoadError{
380    display:none;position:fixed;top:calc(var(--header-h) + 12px);left:50%;transform:translateX(-50%);
381    z-index:50;max-width:min(90vw,560px);background:rgba(30,10,10,0.95);border:1px solid #ff6b6b;
382    border-radius:10px;padding:14px 18px;color:#ff9b9b;font-size:12.5px;line-height:1.5;
383    font-family:'JetBrains Mono';box-shadow:0 8px 24px rgba(0,0,0,0.4);
384  }
385  #shareLoadErrorRow{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;}
386  #shareLoadErrorText{white-space:pre-wrap;}
387  #shareLoadErrorClose{background:none;border:none;color:#ff9b9b;font-size:16px;cursor:pointer;line-height:1;flex:none;}
388  #mainPossessionBar{
389    display:none;position:fixed;top:calc(var(--header-h) + var(--scorebug-h) + 14px);left:50%;transform:translateX(-50%);
390    width:220px;pointer-events:none;z-index:5;
391  }
392  #mainPossessionLabel{font-family:'JetBrains Mono';font-size:10px;letter-spacing:0.06em;color:var(--ink-dim);text-align:center;margin-bottom:5px;}
393  #mainPossessionTrack{height:8px;border-radius:4px;overflow:hidden;background:var(--panel-2);border:1px solid var(--border);display:flex;}
394  #mainPossessionHomeFill{height:100%;}
395  #mainPossessionAwayFill{height:100%;}
396  #mainPossessionLabels{display:flex;justify-content:space-between;width:100%;font-family:'JetBrains Mono';font-size:10px;color:var(--ink-dim);margin-top:4px;}
397  #debugPanel{
398    position:fixed;left:10px;right:10px;bottom:212px;max-height:26vh;
399    background:rgba(6,8,13,0.95);border:1px solid #ff6b6b;border-radius:10px;
400    z-index:999;display:flex;flex-direction:column;overflow:hidden;
401    font-family:'JetBrains Mono',monospace;font-size:10.5px;
402  }
403  #debugHead{
404    display:flex;justify-content:space-between;align-items:center;
405    padding:8px 10px;border-bottom:1px solid #333;color:#ff6b6b;font-weight:600;letter-spacing:0.04em;
406  }
407  #debugHead button{
408    background:#1a1e29;border:1px solid #333;color:#e9ecf3;border-radius:5px;
409    font-size:10px;padding:4px 8px;cursor:pointer;
410  }
411  #debugBody{padding:8px 10px;overflow-y:auto;color:#9fe6c7;line-height:1.6;white-space:pre-wrap;word-break:break-word;}
412  #showDebug{
413    background:var(--panel);border:1px solid var(--border);color:var(--ink-dim);
414    padding:9px 12px;border-radius:8px;font-size:13px;
414cursor:pointer;flex:0 0 auto;
415  }
416  #showDebug:hover{border-color:#ff6b6b;color:#ff6b6b;}
417</style>
418</head>
419<body>
420
421<div id="canvas-wrap"></div>
422<div id="shareLoadError">
423  <div id="shareLoadErrorRow">
424    <div id="shareLoadErrorText"></div>
425    <button id="shareLoadErrorClose">&times;</button>
426  </div>
427</div>
428
429<div id="header">
430  <div id="brand">
431    <div class="word"><span class="wordmark-arrow left"></span> Tidal <span class="wordmark-arrow right"></span> <span id="versionTag">v120</span></div>
432    <div class="meta mono" id="metaLine">FIFA World Cup 2026 · 18 July 2026</div>
433  </div>
434  <div style="display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;align-items:center;">
435    <div id="venueMapThumb" style="display:none;" title="Tap to expand the venue map">
436      <div id="venueMapIcon">🌍</div>
437      <iframe id="venueMapThumbFrame" loading="lazy" scrolling="no"></iframe>
438      <button id="venueMapCloseBtn" title="Collapse map">✕</button>
439    </div>
440    <button id="dataBtn">⚙ Data</button>
441    <button id="lineupsBtn">👥 Lineups</button>
442    <button id="showDebug" title="Diagnostics">🛠</button>
443  </div>
444</div>
445
446<div id="scorebug">
447  <div class="team-tag"><div class="swatch" id="swatchHome"></div>
448    <div><div class="team-name" id="nameHome">FRA</div><div class="score-num" id="scoreHome">0</div><img id="flagHome" class="team-flag" style="display:none;"></div>
449  </div>
450  <div id="minuteClock"><div class="m mono" id="minuteNum">0'</div><div class="half" id="halfLbl">1ST HALF</div></div>
451  <div class="team-tag"><div><div class="team-name" id="nameAway" style="text-align:right;">ENG</div><div class="score-num" id="scoreAway">0</div><img id="flagAway" class="team-flag" style="display:none;margin-left:auto;"></div>
452    <div class="swatch" id="swatchAway"></div>
453  </div>
454</div>
455
456<div id="mainPossessionBar">
457  <div id="mainPossessionLabel">OVERALL POSSESSION</div>
458  <div id="mainPossessionTrack"><div id="mainPossessionHomeFill"></div><div id="mainPossessionAwayFill"></div></div>
459  <div id="mainPossessionLabels"><span id="mainPossessionHomePct"></span><span id="mainPossessionAwayPct"></span></div>
460</div>
461
462<div id="penCountHome" style="display:none;"></div>
463<div class="tick-col" id="tickHome"></div>
464<div id="penCountAway" style="display:none;"></div>
465<div class="tick-col" id="tickAway"></div>
466
467<div id="shareBar">
468  <div id="shareTrack"><div id="shareHomeFill"></div><div id="shareAwayFill"></div></div>
469  <div id="shareLabels"><span id="shareHomePct">50%</span><span id="shareAwayPct">50%</span></div>
470</div>
471
472<div id="dominantLabel"></div>
473
474<div id="goalFlash"><img id="flashPhoto" style="display:none;"><div><span class="lbl" id="flashLbl">GOAL</span><span class="sub" id="flashSub"></span></div></div>
475
476<div id="chartPanel"><canvas id="possessionChart"></canvas></div>
477
478<div id="transport">
479  <div id="scrubRow">
480    <div id="transportLeft">
481      <button id="playBtn">▶</button>
482      <span id="timeReadout" class="mono">0' / 98'</span>
483    </div>
484    <div id="controlsRow">
485      <button class="chip-btn" data-speed="0.5">0.5×</button>
486      <button class="chip-btn active" data-speed="1">1×</button>
487      <button class="chip-btn" data-speed="2">2×</button>
488      <button class="chip-btn" data-speed="4">4×</button>
489      <button id="muteBtn">🔊</button>
490    </div>
491  </div>
492</div>
493
494<div id="overlay"></div>
495<div id="panel">
496  <div id="panelHead"><h2>Data</h2><button id="closePanel">✕</button></div>
497  <div id="panelBody">
498    <div class="field-group">
499      <div style="display:flex;gap:10px;">
500        <div style="flex:1;min-width:0;">
501          <span class="field-label">Home team</span>
502          <div class="team-row">
503            <input type="text" id="inHomeName" value="France">
504            <input type="color" id="inHomeColor" value="#2451e0">
505          </div>
506        </div>
507        <div style="flex:1;min-width:0;">
508          <span class="field-label">Away team</span>
509          <div class="team-row">
510            <input type="text" id="inAwayName" value="England">
511            <input type="color" id="inAwayColor" value="#ffffff">
512          </div>
513        </div>
514      </div>
515    </div>
516    <div class="field-group">
517      <span class="field-label">Competition / date</span>
518      <div class="team-row">
519        <input type="text" id="inComp" value="FIFA World Cup 2026">
520        <input type="text" id="inDate" value="18 July 2026" style="max-width:120px;">
521      </div>
522    </div>
523    <div class="field-group">
524      <span class="field-label">Venue</span>
525      <input type="text" id="inVenue" value="">
526    </div>
527    <div class="field-group">
528      <span class="field-label">Flags or crests</span>
529      <div class="team-row">
530        <input type="text" id="inHomeFlag" list="fifaNationsList" placeholder="Search home nation, or paste a crest URL…" autocomplete="off">
531        <input type="text" id="inAwayFlag" list="fifaNationsList" placeholder="Search away nation, or paste a crest URL…" autocomplete="off">
532      </div>
533      <datalist id="fifaNationsList"></datalist>
534      <details class="hint-details">
535        <summary>Club match, not international?</summary>
536        <div class="hint">For a club instead of a nation, in the CSV for this match (e.g. downloaded from Tidal) paste a direct image URL to the club's crest — a Wikipedia club page is usually the easiest source: open the page, right-click the crest image in the infobox, and copy its image address. For example, Norwich City's crest: <code>https://upload.wikimedia.org/wikipedia/en/thumb/1/17/Norwich_City_FC_logo.svg/250px-Norwich_City_FC_logo.svg.png</code>. Typing a nation name still searches the list as normal; typing a raw ISO code (e.g. "fr", "gb-eng") also works.</div>
537      </details>
538    </div>
539    <div class="field-group">
540      <span class="field-label">Data format (upload and download)</span>
541      <div id="formatToggle" style="display:flex;gap:8px;">
542        <button class="chip-btn active" data-mode="csv" style="flex:1;">CSV</button>
543        <button class="chip-btn" data-mode="json" style="flex:1;">JSON</button>
544        <button class="chip-btn" data-mode="fotmob" style="flex:1;">Import</button>
545      </div>
546    </div>
547
548    <div id="fotmobFields" style="display:none;">
549      <div class="field-group">
550        <span class="field-label">Match stats API response (paste full JSON)</span>
551        <textarea id="fotmobJson" spellcheck="false" style="min-height:180px;" placeholder='Paste the WHOLE match-detail response from your stats provider (DevTools: right-click the request → Copy → Copy response). The app will pull out the timeline, team names, and goal events from it. Pasting just the momentum/timeline section still works too.'></textarea>
552        <details class="hint-details">
553          <summary>How do I get this?</summary>
554          <div class="hint">
555            From a match-stats website: open a match → DevTools (F12) → Network tab → reload → find the request that returns the match's full detail (timeline/momentum, events, lineups) → right-click it → Copy → <b>Copy response</b> (this avoids partial/truncated copies) → paste the whole thing here.<br><br>
556            <b>Timeline</b> (the momentum curve) is reliably extracted — confirmed against real match data. <b>Events (goals) and team colours are best-effort</b> — field names vary by provider and aren't all confirmed, so check the preview against what you know actually happened before using the result. Team names are used if found; colours are left alone if not found, rather than guessed.
557          </div>
558        </details>
559        <label style="display:flex;align-items:center;gap:8px;margin-top:10px;font-size:12px;color:var(--ink-dim);">
560          <input type="checkbox" id="fotmobFlipSign"> Flip sign (tick if the result looks like home/away are swapped)
561        </label>
562      </div>
563      <div id="fotmobPreview" class="hint" style="display:none;"></div>
564      <div id="panelActionsFotmob" style="display:flex;gap:9px;margin-top:6px;">
565        <button class="btn-primary" id="convertFotmobBtn">Convert</button>
566      </div>
567    </div>
568
569
570    <div id="csvFields">
571      <div class="field-group">
572        <span class="field-label">Match CSV</span>
573        <div style="display:flex;justify-content:flex-end;
573gap:6px;flex-wrap:wrap;">
574          <button class="file-btn" id="downloadCombinedBtn" title="Download everything (match info + timeline + events + lineups) as one CSV">Download</button>
575          <button class="file-btn" id="uploadCsvBtn" title="Upload a CSV — auto-detects match info / timeline / events / combined by its header row">Upload</button>
576          <input type="file" id="uploadCsvInput" accept=".csv,text/csv" style="display:none;">
577        </div>
578        <div class="hint">Team names/colours, competition, date, venue, timeline, goals, and lineups all live in one spreadsheet-friendly CSV file — see the Local match demo (linked from the home screen) for the expected format. Build a new match by editing a copy of that file directly, then upload it here.</div>
579        <div class="hint">⚠ Anything changed in this app — fetched photos, attached audio, edits made here — only exists in this browser tab. Download the CSV (or create a Share link) to keep it; reloading this page or coming back to the original file later won't remember it.</div>
580      </div>
581      <div id="csvUploadStatus" class="hint" style="display:none;"></div>
582
583      <div class="field-group">
584        <span class="field-label">Player photos (optional)</span>
585        <button class="file-btn" id="fetchWikiBtn" style="width:100%;text-align:left;" title="Fill in blank photo fields (goal scorers + lineup players + penalty takers) from Wikipedia, where a page/photo exists">🖼 Fetch Wikipedia photos</button>
586        <details class="hint-details">
587          <summary>What does this do?</summary>
588          <div class="hint">Use image URLs for players if they exist. It may be possible to batch-source well-known player images from Wikipedia — this looks up each blank photo field by name and fills in a page image where one's found; anyone not on Wikipedia (e.g. amateur/local players) is left blank for a manual URL instead.</div>
589        </details>
590      </div>
591      <div id="wikiFetchStatus" class="hint" style="display:none;"></div>
592
593      <div class="field-group">
594        <label style="display:flex;align-items:center;gap:8px;font-size:12px;color:var(--ink-dim);">
595          <input type="checkbox" id="inHasExtraTime"> Match went to extra time
596        </label>
597        <details class="hint-details">
598          <summary>What does this control?</summary>
599          <div class="hint">Controls period labelling and the halftime→ET audio cue. Leave unticked for a normal match — the second half (including any stoppage time) will always be labelled "2ND HALF" regardless of how many added minutes it runs to.</div>
600          <div class="hint">Match duration is worked out automatically from whichever data goes latest — the momentum timeline, a stoppage-time goal, or an ambient audio window. If none of those reflect genuine injury time with no goal in it (e.g. a scoreless stoppage period), add a <code>max_minute</code> row to the Meta CSV with the true final minute to override it directly.</div>
601        </details>
602      </div>
603
604      <div class="field-group">
605        <span class="field-label">Commentary audio (optional)</span>
606        <div style="display:flex;gap:6px;align-items:center;flex-wrap:wrap;">
607          <select id="audioEventPicker" style="flex:1;min-width:120px;background:var(--panel-2);border:1px solid var(--border);color:var(--ink);border-radius:7px;padding:6px 8px;font-size:11.5px;"></select>
608          <button class="file-btn" id="attachAudioBtn">🔊 Attach commentary clip</button>
609          <input type="file" id="attachAudioInput" accept="audio/*" style="display:none;">
610        </div>
611        <details class="hint-details">
612          <summary>What does this do?</summary>
613          <div class="hint">Attaches a short clip (e.g. commentary) that plays instead of the crowd roar for that specific event or penalty kick, with the match automatically slowing down for the audio clip's full length (capped at 25 seconds — the clip still finishes playing in full, but the match won't stay frozen indefinitely if an unusually long file is attached). Clips are stored as embedded data, so they're attached here rather than edited directly in the CSV.</div>
614          <div class="hint">The clip is embedded directly as data — not a link — so it's included automatically if you download the match as a CSV, and stays with the match wherever it's shared or reloaded from.</div>
615          <div class="hint"><b>Keep clips short and compressed</b>
615 — a few seconds is usually enough, and every clip adds to the total file size shared or saved. MP3 or M4A/AAC work everywhere the app runs; WAV is uncompressed and gets large fast once embedded (worse again after the ~33% size increase from encoding it as text); OGG isn't supported in Safari/iOS. Mono, modest quality (e.g. ~64–96kbps) is plenty for spoken commentary. There's no hard limit on how many clips a match can have, but a handful of short, compressed clips stays comfortably safe; many long or uncompressed ones risk hitting size limits when sharing.</div>
616        </details>
617        <div id="attachAudioStatus" class="hint" style="display:none;"></div>
618      </div>
619
620      <!-- The four boxes below are the pre-combined-CSV per-section format from
621           the app's early build. The combined CSV above supersedes them for
622           normal use, so they're hidden from the panel, but left in place
623           (not removed) since Apply Data / Wiki Fetch / Reset to sample all
624           still read and write these specific elements directly — hiding
625           them here is purely cosmetic simplification, not a data-model
626           change, so nothing about how a match actually loads has changed. -->
627      <div style="display:none;">
628        <div class="field-group">
629          <div style="display:flex;justify-content:space-between;align-items:center;">
630            <span class="field-label">Match info CSV — key, value</span>
631            <button class="file-btn" id="downloadMetaBtn" title="Download match-info.csv">Download</button>
632          </div>
633          <textarea id="metaCsv" spellcheck="false" style="min-height:150px;"></textarea>
634        </div>
635        <div class="field-group">
636          <div style="display:flex;justify-content:space-between;align-items:center;">
637            <span class="field-label">Timeline CSV — minute, value (−1 to 1)</span>
638            <button class="file-btn" id="downloadTimelineBtn" title="Download timeline.csv">Download</button>
639          </div>
640          <textarea id="timelineCsv" spellcheck="false" style="min-height:150px;"></textarea>
641        </div>
642        <div class="field-group">
643          <div style="display:flex;justify-content:space-between;align-items:center;">
644            <span class="field-label">Events CSV — minute, team (home/away), label, photo, audio (optional)</span>
645            <button class="file-btn" id="downloadEventsBtn" title="Download events.csv">Download</button>
646          </div>
647          <textarea id="eventsCsv" spellcheck="false" style="min-height:120px;"></textarea>
648        </div>
649        <div class="field-group">
650          <div style="display:flex;justify-content:space-between;align-items:center;">
651            <span class="field-label">Lineups CSV — team, role (starter/sub), number, name, club, age</span>
652            <button class="file-btn" id="downloadLineupsBtn" title="Download lineups.csv">Download</button>
653          </div>
654          <textarea id="lineupsCsv" spellcheck="false" style="min-height:120px;"></textarea>
655        </div>
656        <div class="field-group">
657          <div style="display:flex;justify-content:space-between;align-items:center;">
658            <span class="field-label">Penalties CSV — team, taker, outcome (score/miss)</span>
659            <button class="file-btn" id="downloadPenaltiesBtn" title="Download penalties.csv">Download</button>
660          </div>
661          <textarea id="penaltiesCsv" spellcheck="false" style="min-height:100px;"></textarea>
662        </div>
663      </div>
664    </div>
665
666    <div id="jsonFields" style="display:none;">
667      <div class="field-group">
668        <div style="display:flex;justify-content:space-between;align-items:center;">
669          <span class="field-label">Match data (JSON)</span>
670          <div style="display:flex;gap:6px;">
671            <button class="file-btn" id="uploadJsonBtn" title="Upload match.json">Upload</button>
672            <button class="file-btn" id="downloadJsonBtn" title="Download match.json">Download</button>
673          </div>
674        </div>
675        <textarea id="dataJson" spellcheck="false"></textarea>
676        <input type="file" id="uploadJsonInput" accept=".json,application/json" style="display:none;">
677        <div class="hint">timeline: [minute, value] pairs, value from −1 (away threatening) to 1 (home threatening). events: goals with minute + team ('home'/'away') + optional label + optional photo (image URL).</div>
678      </div>
679    </div>
680
681    <div class="panel-section-divider"><span>Share link</span></div>
682    <div id="shareFields">
683      <div class="field-group">
684        <span class="field-label">Link type</span>
685        <div id="shareModeToggle" style="display:flex;gap:8px;flex-wrap:nowrap;">
686          <div style="flex:1;min-width:0;">
687            <button class="chip-btn active" data-sharemode="view" style="width:100%;">View only</button>
688            <div class="hint">View only opens straight into playback with no access to the Data &amp; teams panel (default).</div>
689          </div>
690          <div style="flex:1;min-width:0;">
691            <button class="chip-btn" data-sharemode="edit" style="width:100%;">Fully configurable</button>
692            <div class="hint">Fully configurable opens fully editable app with current match already loaded.</div>
693          </div>
694        </div>
695      </div>
696      <div id="shareLineupWarning" class="hint" style="display:none;color:var(--gold);"></div>
697      <div class="field-group">
698        <span class="field-label">Share link</span>
699        <div style="display:flex;gap:6px;">
700          <button class="btn-primary" id="shareCreateBtn">Create share link</button>
701          <input type="text" id="shareUrlOutput" readonly spellcheck="false" style="flex:1;">
702          <button class="file-btn" id="shareCopyBtn">Copy</button>
703        </div>
704        <button class="file-btn" id="shareNewLinkBtn" style="margin-top:6px;">Start a new link (instead of updating the last one)</button>
705        <div id="shareStatus" class="hint" style="display:none;"></div>
706        <div class="hint">Creating a link updates the same URL each time by default, so anyone you've already sent it to always sees the latest version. Use "Start a new link" only when you actually want a separate, different URL — the old one keeps working on its own after that.</div>
707      </div>
708      <div class="field-group">
709        <span class="field-label">Load a share link</span>
710        <div style="display:flex;gap:6px;">
711          <input type="text" id="loadShareUrl" placeholder="Paste a share link here" spellcheck="false" style="flex:1;">
712          <button class="file-btn" id="loadShareBtn">Load</button>
713        </div>
714        <div class="hint">Opening a share link directly in the browser loads it automatically — this box is only for pasting one in manually.</div>
715      </div>
716    </div>
717
718    <div id="errBox"></div>
719    <div id="panelActions">
720      <button class="btn-secondary" id="resetSample">Reset to sample</button>
721      <button class="btn-primary" id="applyData">Apply data</button>
722    </div>
723  </div>
724</div>
725
726<div id="photoLightbox" onclick="closePhotoLightbox()">
727  <img id="photoLightboxImg" src="">
728  <div id="photoLightboxCaption"></div>
729</div>
730
731<div id="lineupsPanel">
732  <div class="panelHead"><h2>Lineups</h2><button id="closeLineups">✕</button></div>
733  <div class="panelBody">
734    <div id="lineupsEmpty" class="hint">No lineup data loaded for this match yet — import it via the Import tab in Data &amp; teams, or add lineup rows to the Match CSV there.</div>
735    <div id="lineupsPossession" style="display:none;padding:14px 20px 0;"></div>
736    <div id="lineupsContent" style="display:none;">
737      <div class="lineups-grid">
738        <div class="lineups-col">
739          <div class="lineups-team-head" id="lineupsHomeHead"></div>
740          <div class="lineups-section-label">Starting XI</div>
741          <div id="lineupsHomeStarters"></div>
742          <div class="lineups-section-label">Substitutes</div>
743          <div id="lineupsHomeSubs"></div>
744        </div>
745        <div class="lineups-col">
746          <div class="lineups-team-head" id="lineupsAwayHead"></div>
747          <div class="lineups-section-label">Starting XI</div>
748          <div id="lineupsAwayStarters"></div>
749          <div class="lineups-section-label">Substitutes</div>
750          <div id="lineupsAwaySubs"></div>
751        </div>
752      </div>
753    </div>
754  </div>
755</div>
756
757<div id="mapPanel">
758  <div class="panelHead"><h2>Venue</h2><button id="closeMap">✕</button></div>
759  <div class="panelBody">
760    <div id="mapEmpty" class="hint">No venue coordinates set for this match — add "venue_lat" and "venue_long" rows to the Match CSV, or import a match via the Import tab (which fills these in automatically when available).</div>
761    <div id="mapContent" style="display:none;">
762      <div id="mapVenueName" style="font-family:'Barlow Condensed';font-weight:700;font-size:17px;margin-bottom:10px;"></div>
763      <iframe id="mapFrame" style="width:100%;height:280px;border:1px solid var(--border);border-radius:10px;" loading="lazy"></iframe>
764      <div class="hint" style="margin-top:8px;">Map data © <a href="https://www.openstreetmap.org/copyright" target="_blank" rel="noopener" style="color:var(--accent);">OpenStreetMap</a> contributors.</div>
765    </div>
766  </div>
767</div>
768
769<div id="debugPanel" style="display:none;">
770  <div id="debugHead">
771    <span>Diagnostics</span>
772    <div style="display:flex;gap:8px;">
773      <button id="copyLog">Copy</button>
774      <button id="hideDebug">Hide</button>
775    </div>
776  </div>
777  <div id="debugBody"></div>
778</div>
779
780<script>
781  window.__tlogs = [];
782  function tlog(msg){
783    const t = new Date().toISOString().split('T')[1].replace('Z','');
784    const line = t+'  '+msg;
785    window.__tlogs.push(line);
786    const body = document.getElementById('debugBody');
787    if(body){
788      const p = document.createElement('div');
789      p.textContent = line;
790      body.appendChild(p);
791      body.scrollTop = body.scrollHeight;
792    }
793  }
794  window.onerror = function(msg, url, line, col, error){
795    tlog('JS ERROR: '+msg+' ('+(url?url.split('/').pop():'?')+':'+line+':'+col+')');
796    return false;
797  };
798  window.addEventListener('unhandledrejection', function(e){
799    tlog('UNHANDLED PROMISE REJECTION: '+(e.reason && e.reason.message ? e.reason.message : e.reason));
800  });
801  tlog('Page script started.');
802  tlog('User agent: '+navigator.userAgent);
803  (function(){
804    try{
805      const c = document.createElement('canvas');
806      const gl = c.getContext('webgl') || c.getContext('experimental-webgl');
807      tlog('WebGL available: '+(gl ? 'YES' : 'NO'));
808      if(gl){
809        const dbg = gl.getExtension('WEBGL_debug_renderer_info');
810        if(dbg) tlog('GPU renderer: '+gl.getParameter(dbg.UNMASKED_RENDERER_WEBGL));
811      }
812    }catch(err){ tlog('WebGL check threw: '+err.message); }
813    tlog('Device pixel ratio: '+window.devicePixelRatio+' | viewport: '+window.innerWidth+'x'+window.innerHeight);
814  })();
815</script>
vendor: 1 bytes, line 815
815
vendor: 31,990 bytes, lines 816-824
816<script>
817/* three.js r128 — bundled inline to avoid any dependency on an external CDN,
818   since some mobile browsers/networks block cdnjs.cloudflare.com. */
819/**
820 * @license
821 * Copyright 2010-2021 Three.js Authors
822 * SPDX-License-Identifier: MIT
823 */
824!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).THREE={})}(this,(function(t){"use strict";const e="128",n=100,i=300,r=301,s=302,a=303,o=304,l=306,c=307,h=1e3,u=1001,d=1002,p=1003,m=1004,f=1005,g=1006,v=1007,y=1008,x=1009,_=1012,w=1014,b=1015,M=1016,S=1020,T=1022,E=1023,A=1026,L=1027,R=33776,C=33777,P=33778,D=33779,I=35840,N=35841,B=35842,z=35843,F=37492,O=37496,H=2300,G=2301,U=2302,k=2400,V=2401,W=2402,j=2500,q=2501,X=3e3,Y=3001,Z=3007,J=3002,Q=3004,K=3005,$=3006,tt=7680,et=35044,nt=35048,it="300 es";class rt{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const n=this._listeners;void 0===n[t]&&(n[t]=[]),-1===n[t].indexOf(e)&&n[t].push(e)}hasEventListener(t,e){if(void 0===this._listeners)return!1;const n=this._listeners;return void 0!==n[t]&&-1!==n[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const n=this._listeners[t];if(void 0!==n){const t=n.indexOf(e);-1!==t&&n.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const n=e.slice(0);for(let e=0,i=n.length;e<i;e++)n[e].call(this,t);t.target=null}}}const st=[];for(let t=0;t<256;t++)st[t]=(t<16?"0":"")+t.toString(16);let at=1234567;const ot=Math.PI/180,lt=180/Math.PI;function ct(){const t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,n=4294967295*Math.random()|0,i=4294967295*Math.random()|0;return(st[255&t]+st[t>>8&255]+st[t>>16&255]+st[t>>24&255]+"-"+st[255&e]+st[e>>8&255]+"-"+st[e>>16&15|64]+st[e>>24&255]+"-"+st[63&n|128]+st[n>>8&255]+"-"+st[n>>16&255]+st[n>>24&255]+st[255&i]+st[i>>8&255]+st[i>>16&255]+st[i>>24&255]).toUpperCase()}function ht(t,e,n){return Math.max(e,Math.min(n,t))}function ut(t,e){return(t%e+e)%e}function dt(t,e,n){return(1-n)*t+n*e}function pt(t){return 0==(t&t-1)&&0!==t}function mt(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function ft(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}var gt=Object.freeze({__proto__:null,DEG2RAD:ot,RAD2DEG:lt,generateUUID:ct,clamp:ht,euclideanModulo:ut,mapLinear:function(t,e,n,i,r){return i+(t-e)*(r-i)/(n-e)},inverseLerp:function(t,e,n){return t!==e?(n-t)/(e-t):0},lerp:dt,damp:function(t,e,n,i){return dt(t,e,1-Math.exp(-n*i))},pingpong:function(t,e=1){return e-Math.abs(ut(t,2*e)-e)},smoothstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*(3-2*t)},smootherstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){return void 0!==t&&(at=t%2147483647),at=16807*at%2147483647,(at-1)/2147483646},degToRad:function(t){return t*ot},radToDeg:function(t){return t*lt},isPowerOfTwo:pt,ceilPowerOfTwo:mt,floorPowerOfTwo:ft,setQuaternionFromProperEuler:function(t,e,n,i,r){const s=Math.cos,a=Math.sin,o=s(n/2),l=a(n/2),c=s((e+i)/2),h=a((e+i)/2),u=s((e-i)/2),d=a((e-i)/2),p=s((i-e)/2),m=a((i-e)/2);switch(r){case"XYX":t.set(o*h,l*u,l*d,o*c);break;case"YZY":t.set(l*d,o*h,l*u,o*c);break;case"ZXZ":t.set(l*u,l*d,o*h,o*c);break;case"XZX":t.set(o*h,l*m,l*p,o*c);break;case"YXY":t.set(l*p,o*h,l*m,o*c);break;case"ZYZ":t.set(l*m,l*p,o*h,o*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}}});class vt{constructor(t=0,e=0){this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this)}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this)}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,n=this.y,i=t.elements;return this.x=i[0]*e+i[3]*n+i[6],this.y=i[1]*e+i[4]*n+i[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y;return e*e+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e,n){return void 0!==n&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const n=Math.cos(e),i=Math.sin(e),r=this.x-t.x,s=this.y-t.y;return this.x=r*n-s*i+t.x,this.y=r*i+s*n+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}}vt.prototype.isVector2=!0;class yt{constructor(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}set(t,e,n,i,r,s,a,o,l){const c=this.elements;return c[0]=t,c[1]=i,c[2]=a,c[3]=e,c[4]=r,c[5]=o,c[6]=n,c[7]=s,c[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this}extractBasis(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,i=e.elements,r=this.elements,s=n[0],a=n[3],o=n[6],l=n[1],c=n[4],h=n[7],u=n[2],d=n[5],p=n[8],m=i[0],f=i[3],g=i[6],v=i[1],y=i[4],x=i[7],_=i[2],w=i[5],b=i[8];return r[0]=s*m+a*v+o*_,r[3]=s*f+a*y+o*w,r[6]=s*g+a*x+o*b,r[1]=l*m+c*v+h*_,r[4]=l*f+c*y+h*w,r[7]=l*g+c*x+h*b,r[2]=u*m+d*v+p*_,r[5]=u*f+d*y+p*w,r[8]=u*g+d*x+p*b,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8];return e*s*c-e*a*l-n*r*c+n*a*o+i*r*l-i*s*o}invert(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=c*s-a*l,u=a*o-c*r,d=l*r-s*o,p=e*h+n*u+i*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=h*m,t[1]=(i*l-c*n)*m,t[2]=(a*n-i*s)*m,t[3]=u*m,t[4]=(c*e-i*o)*m,t[5]=(i*r-a*e)*m,t[6]=d*m,t[7]=(n*o-l*e)*m,t[8]=(s*e-n*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,n,i,r,s,a){const o=Math.cos(r),l=Math.sin(r);return this.set(n*o,n*l,-n*(o*s+l*a)+s+t,-i*l,i*o,-i*(-l*s+o*a)+a+e,0,0,1),this}scale(t,e){const n=this.elements;return n[0]*=t,n[3]*=t,n[6]*=t,n[1]*=e,n[4]*=e,n[7]*=e,this}rotate(t){const e=Math.cos(t),n=Math.sin(t),i=this.elements,r=i[0],s=i[3],a=i[6],o=i[1],l=i[4],c=i[7];return i[0]=e*r+n*o,i[3]=e*s+n*l,i[6]=e*a+n*c,i[1]=-n*r+e*o,i[4]=-n*s+e*l,i[7]=-n*a+e*c,this}translate(t,e){const n=this.elements;return n[0]+=t*n[2],n[3]+=t*n[5],n[6]+=t*n[8],n[1]+=e*n[2],n[4]+=e*n[5],n[7]+=e*n[8],this}equals(t){const e=this.elements,n=t.elements;for(let t=0;t<9;t++)if(e[t]!==n[t])return!1;return!0}fromArray(t,e=0){for(let n=0;n<9;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}let xt;yt.prototype.isMatrix3=!0;class _t{static getDataURL(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===xt&&(xt=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),xt.width=t.width,xt.height=t.height;const n=xt.getContext("2d");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=xt}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}}let wt=0;class bt extends rt{constructor(t=bt.DEFAULT_IMAGE,e=bt.DEFAULT_MAPPING,n=1001,i=1001,r=1006,s=1008,a=1023,o=1009,l=1,c=3e3){super(),Object.defineProperty(this,"id",{value:wt++}),this.uuid=ct(),this.name="",this.image=t,this.mipmaps=[],this.mapping=e,this.wrapS=n,this.wrapT=i,this.magFilter=r,this.minFilter=s,this.anisotropy=l,this.format=a,this.internalFormat=null,this.type=o,this.offset=new vt(0,0),this.repeat=new vt(1,1),this.center=new vt(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new yt,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=c,this.version=0,this.onUpdate=null}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.image=t.image,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.encoding=t.encoding,this}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const n={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){const i=this.image;if(void 0===i.uuid&&(i.uuid=ct()),!e&&void 0===t.images[i.uuid]){let e;if(Array.isArray(i)){e=[];for(let t=0,n=i.length;t<n;t++)i[t].isDataTexture?e.push(Mt(i[t].image)):e.push(Mt(i[t]))}else e=Mt(i);t.images[i.uuid]={uuid:i.uuid,url:e}}n.image=i.uuid}return e||(t.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==i)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case h:t.x=t.x-Math.floor(t.x);break;case u:t.x=t.x<0?0:1;break;case d:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case h:t.y=t.y-Math.floor(t.y);break;case u:t.y=t.y<0?0:1;break;case d:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&this.version++}}function Mt(t){return"undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap?_t.getDataURL(t):t.data?{data:Array.prototype.slice.call(t.data),width:t.width,height:t.height,type:t.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}bt.DEFAULT_IMAGE=void 0,bt.DEFAULT_MAPPING=i,bt.prototype.isTexture=!0;class St{constructor(t=0,e=0,n=0,i=1){this.x=t,this.y=e,this.z=n,this.w=i}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,n,i){return this.x=t,this.y=e,this.z=n,this.w=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,n=this.y,i=this.z,r=this.w,s=t.elements;return this.x=s[0]*e+s[4]*n+s[8]*i+s[12]*r,this.y=s[1]*e+s[5]*n+s[9]*i+s[13]*r,this.z=s[2]*e+s[6]*n+s[10]*i+s[14]*r,this.w=s[3]*e+s[7]*n+s[11]*i+s[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,n,i,r;const s=.01,a=.1,o=t.elements,l=o[0],c=o[4],h=o[8],u=o[1],d=o[5],p=o[9],m=o[2],f=o[6],g=o[10];if(Math.abs(c-u)<s&&Math.abs(h-m)<s&&Math.abs(p-f)<s){if(Math.abs(c+u)<a&&Math.abs(h+m)<a&&Math.abs(p+f)<a&&Math.abs(l+d+g-3)<a)return this.set(1,0,0,0),this;e=Math.PI;const t=(l+1)/2,o=(d+1)/2,v=(g+1)/2,y=(c+u)/4,x=(h+m)/4,_=(p+f)/4;return t>o&&t>v?t<s?(n=0,i=.707106781,r=.707106781):(n=Math.sqrt(t),i=y/n,r=x/n):o>v?o<s?(n=.707106781,i=0,r=.707106781):(i=Math.sqrt(o),n=y/i,r=_/i):v<s?(n=.707106781,i=.707106781,r=0):(r=Math.sqrt(v),n=x/r,i=_/r),this.set(n,i,r,e),this}let v=Math.sqrt((f-p)*(f-p)+(h-m)*(h-m)+(u-c)*(u-c));return Math.abs(v)<.001&&(v=1),this.x=(f-p)/v,this.y=(h-m)/v,this.z=(u-c)/v,this.w=Math.acos((l+d+g-1)/2),this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this.w=Math.max(t.w,Math.min(e.w,this.w)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this.w=Math.max(t,Math.min(e,this.w)),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this.w=t.w+(e.w-t.w)*n,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}fromBufferAttribute(t,e,n){return void 0!==n&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}}St.prototype.isVector4=!0;class Tt extends rt{constructor(t,e,n){super(),this.width=t,this.height=e,this.depth=1,this.scissor=new St(0,0,t,e),this.scissorTest=!1,this.viewport=new St(0,0,t,e),n=n||{},this.texture=new bt(void 0,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.encoding),this.texture.image={},this.texture.image.width=t,this.texture.image.height=e,this.texture.image.depth=1,this.texture.generateMipmaps=void 0!==n.generateMipmaps&&n.generateMipmaps,this.texture.minFilter=void 0!==n.minFilter?n.minFilter:g,this.depthBuffer=void 0===n.depthBuffer||n.depthBuffer,this.stencilBuffer=void 0!==n.stencilBuffer&&n.stencilBuffer,this.depthTexture=void 0!==n.depthTexture?n.depthTexture:null}setTexture(t){t.image={width:this.width,height:this.height,depth:this.depth},this.texture=t}setSize(t,e,n=1){this.width===t&&this.height===e&&this.depth===n||(this.width=t,this.height=e,this.depth=n,this.texture.image.width=t,this.texture.image.height=e,this.texture.image.depth=n,this.dispose()),this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)}clone(){return(new this.constructor).copy(this)}copy(t){return this.width=t.width,this.height=t.height,this.depth=t.depth,this.viewport.copy(t.viewport),this.texture=t.texture.clone(),this.depthBuffer=t.depthBuffer,this.stencilBuffer=t.stencilBuffer,this.depthTexture=t.depthTexture,this}dispose(){this.dispatchEvent({type:"dispose"})}}Tt.prototype.isWebGLRenderTarget=!0;class Et extends Tt{constructor(t,e,n){super(t,e,n),this.samples=4}copy(t){return super.copy.call(this,t),this.samples=t.samples,this}}Et.prototype.isWebGLMultisampleRenderTarget=!0;class At{constructor(t=0,e=0,n=0,i=1){this._x=t,this._y=e,this._z=n,this._w=i}static slerp(t,e,n,i){return console.warn("THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead."),n.slerpQuaternions(t,e,i)}static slerpFlat(t,e,n,i,r,s,a){let o=n[i+0],l=n[i+1],c=n[i+2],h=n[i+3];const u=r[s+0],d=r[s+1],p=r[s+2],m=r[s+3];if(0===a)return t[e+0]=o,t[e+1]=l,t[e+2]=c,void(t[e+3]=h);if(1===a)return t[e+0]=u,t[e+1]=d,t[e+2]=p,void(t[e+3]=m);if(h!==m||o!==u||l!==d||c!==p){let t=1-a;const e=o*u+l*d+c*p+h*m,n=e>=0?1:-1,i=1-e*e;if(i>Number.EPSILON){const r=Math.sqrt(i),s=Math.atan2(r,e*n);t=Math.sin(t*s)/r,a=Math.sin(a*s)/r}const r=a*n;if(o=o*t+u*r,l=l*t+d*r,c=c*t+p*r,h=h*t+m*r,t===1-a){const t=1/Math.sqrt(o*o+l*l+c*c+h*h);o*=t,l*=t,c*=t,h*=t}}t[e]=o,t[e+1]=l,t[e+2]=c,t[e+3]=h}static multiplyQuaternionsFlat(t,e,n,i,r,s){const a=n[i],o=n[i+1],l=n[i+2],c=n[i+3],h=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return t[e]=a*p+c*h+o*d-l*u,t[e+1]=o*p+c*u+l*h-a*d,t[e+2]=l*p+c*d+a*u-o*h,t[e+3]=c*p-a*h-o*u-l*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,n,i){return this._x=t,this._y=e,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e){if(!t||!t.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");const n=t._x,i=t._y,r=t._z,s=t._order,a=Math.cos,o=Math.sin,l=a(n/2),c=a(i/2),h=a(r/2),u=o(n/2),d=o(i/2),p=o(r/2);switch(s){case"XYZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"YXZ":this._x=u*c*h+l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"ZXY":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h-u*d*p;break;case"ZYX":this._x=u*c*h-l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h+u*d*p;break;case"YZX":this._x=u*c*h+l*d*p,this._y=l*d*h+u*c*p,this._z=l*c*p-u*d*h,this._w=l*c*h-u*d*p;break;case"XZY":this._x=u*c*h-l*d*p,this._y=l*d*h-u*c*p,this._z=l*c*p+u*d*h,this._w=l*c*h+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const n=e/2,i=Math.sin(n);return this._x=t.x*i,this._y=t.y*i,this._z=t.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,n=e[0],i=e[4],r=e[8],s=e[1],a=e[5],o=e[9],l=e[2],c=e[6],h=e[10],u=n+a+h;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(c-o)*t,this._y=(r-l)*t,this._z=(s-i)*t}else if(n>a&&n>h){const t=2*Math.sqrt(1+n-a-h);this._w=(c-o)/t,this._x=.25*t,this._y=(i+s)/t,this._z=(r+l)/t}else if(a>h){const t=2*Math.sqrt(1+a-n-h);this._w=(r-l)/t,this._x=(i+s)/t,this._y=.25*t,this._z=(o+c)/t}else{const t=2*Math.sqrt(1+h-n-a);this._w=(s-i)/t,this._x=(r+l)/t,this._y=(o+c)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let n=t.dot(e)+1;return n<Number.EPSILON?(n=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(ht(this.dot(t),-1,1)))}rotateTowards(t,e){const n=this.angleTo(t);if(0===n)return this;const i=Math.min(1,e/n);return this.slerp(t,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t,e){return void 0!==e?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(t,e)):this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const n=t._x,i=t._y,r=t._z,s=t._w,a=e._x,o=e._y,l=e._z,c=e._w;return this._x=n*c+s*a+i*l-r*o,this._y=i*c+s*o+r*a-n*l,this._z=r*c+s*l+n*o-i*a,this._w=s*c-n*a-i*o-r*l,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const n=this._x,i=this._y,r=this._z,s=this._w;let a=s*t._w+n*t._x+i*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=s,this._x=n,this._y=i,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const t=1-e;return this._w=t*s+e*this._w,this._x=t*n+e*this._x,this._y=t*i+e*this._y,this._z=t*r+e*this._z,this.normalize(),this._onChangeCallback(),this}const l=Math.sqrt(o),c=Math.atan2(l,a),h=Math.sin((1-e)*c)/l,u=Math.sin(e*c)/l;return this._w=s*h+this._w*u,this._x=n*h+this._x*u,this._y=i*h+this._y*u,this._z=r*h+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,n){this.copy(t).slerp(e,n)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}At.prototype.isQuaternion=!0;class Lt{constructor(t=0,e=0,n=0){this.x=t,this.y=e,this.z=n}set(t,e,n){return void 0===n&&(n=this.z),this.x=t,this.y=e,this.z=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t,e){return void 0!==e?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(t,e)):(this.x+=t.x,this.y+=t.y,this.z+=t.z,this)}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t,e){return void 0!==e?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(t,e)):(this.x-=t.x,this.y-=t.y,this.z-=t.z,this)}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(t,e)):(this.x*=t.x,this.y*=t.y,this.z*=t.z,this)}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return t&&t.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(Ct.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(Ct.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,n=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6]*i,this.y=r[1]*e+r[4]*n+r[7]*i,this.z=r[2]*e+r[5]*n+r[8]*i,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,n=this.y,i=this.z,r=t.elements,s=1/(r[3]*e+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*e+r[4]*n+r[8]*i+r[12])*s,this.y=(r[1]*e+r[5]*n+r[9]*i+r[13])*s,this.z=(r[2]*e+r[6]*n+r[10]*i+r[14])*s,this}applyQuaternion(t){const e=this.x,n=this.y,i=this.z,r=t.x,s=t.y,a=t.z,o=t.w,l=o*e+s*i-a*n,c=o*n+a*e-r*i,h=o*i+r*n-s*e,u=-r*e-s*n-a*i;return this.x=l*o+u*-r+c*-a-h*-s,this.y=c*o+u*-s+h*-r-l*-a,this.z=h*o+u*-a+l*-s-c*-r,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,n=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[4]*n+r[8]*i,this.y=r[1]*e+r[5]*n+r[9]*i,this.z=r[2]*e+r[6]*n+r[10]*i,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}
vendor: 7,246 bytes, line 824
824round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this}cross(t,e){return void 0!==e?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(t,e)):this.crossVectors(this,t)}crossVectors(t,e){const n=t.x,i=t.y,r=t.z,s=e.x,a=e.y,o=e.z;return this.x=i*o-r*a,this.y=r*s-n*o,this.z=n*a-i*s,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)}projectOnPlane(t){return Rt.copy(this).projectOnVector(t),this.sub(Rt)}reflect(t){return this.sub(Rt.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(ht(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y,i=this.z-t.z;return e*e+n*n+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,n){const i=Math.sin(e)*t;return this.x=i*Math.sin(n),this.y=Math.cos(e)*t,this.z=i*Math.cos(n),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),i=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=i,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e,n){return void 0!==n&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}}Lt.prototype.isVector3=!0;const Rt=new Lt,Ct=new At;class Pt{constructor(t=new Lt(1/0,1/0,1/0),e=new Lt(-1/0,-1/0,-1/0)){this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){let e=1/0,n=1/0,i=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.length;o<l;o+=3){const l=t[o],c=t[o+1],h=t[o+2];l<e&&(e=l),c<n&&(n=c),h<i&&(i=h),l>r&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,n,i),this.max.set(r,s,a),this}setFromBufferAttribute(t){let e=1/0,n=1/0,i=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,l=t.count;o<l;o++){const l=t.getX(o),c=t.getY(o),h=t.getZ(o);l<e&&(e=l),c<n&&(n=c),h<i&&(i=h),l>r&&(r=l),c>s&&(s=c),h>a&&(a=h)}return this.min.set(e,n,i),this.max.set(r,s,a),this}setFromPoints(t){this.makeEmpty();for(let e=0,n=t.length;e<n;e++)this.expandByPoint(t[e]);return this}setFromCenterAndSize(t,e){const n=It.copy(e).multiplyScalar(.5);return this.min.copy(t).sub(n),this.max.copy(t).add(n),this}setFromObject(t){return this.makeEmpty(),this.expandByObject(t)}clone(){return(new this.constructor).copy(this)}copy(t){return this.min.copy(t.min),this.max.copy(t.max),this}makeEmpty(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z}getCenter(t){return void 0===t&&(console.warn("THREE.Box3: .getCenter() target is now required"),t=new Lt),this.isEmpty()?t.set(0,0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(t){return void 0===t&&(console.warn("THREE.Box3: .getSize() target is now required"),t=new Lt),this.isEmpty()?t.set(0,0,0):t.subVectors(this.max,this.min)}expandByPoint(t){return this.min.min(t),this.max.max(t),this}expandByVector(t){return this.min.sub(t),this.max.add(t),this}expandByScalar(t){return this.min.addScalar(-t),this.max.addScalar(t),this}expandByObject(t){t.updateWorldMatrix(!1,!1);const e=t.geometry;void 0!==e&&(null===e.boundingBox&&e.computeBoundingBox(),Nt.copy(e.boundingBox),Nt.applyMatrix4(t.matrixWorld),this.union(Nt));const n=t.children;for(let t=0,e=n.length;t<e;t++)this.expandByObject(n[t]);return this}containsPoint(t){return!(t.x<this.min.x||t.x>this.max.x||t.y<this.min.y||t.y>this.max.y||t.z<this.min.z||t.z>this.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return void 0===e&&(console.warn("THREE.Box3: .getParameter() target is now required"),e=new Lt),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.x<this.min.x||t.min.x>this.max.x||t.max.y<this.min.y||t.min.y>this.max.y||t.max.z<this.min.z||t.min.z>this.max.z)}intersectsSphere(t){return this.clampPoint(t.center,It),It.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(Ut),kt.subVectors(this.max,Ut),Bt.subVectors(t.a,Ut),zt.subVectors(t.b,Ut),Ft.subVectors(t.c,Ut),Ot.subVectors(zt,Bt),Ht.subVectors(Ft,zt),Gt.subVectors(Bt,Ft);let e=[0,-Ot.z,Ot.y,0,-Ht.z,Ht.y,0,-Gt.z,Gt.y,Ot.z,0,-Ot.x,Ht.z,0,-Ht.x,Gt.z,0,-Gt.x,-Ot.y,Ot.x,0,-Ht.y,Ht.x,0,-Gt.y,Gt.x,0];return!!jt(e,Bt,zt,Ft,kt)&&(e=[1,0,0,0,1,0,0,0,1],!!jt(e,Bt,zt,Ft,kt)&&(Vt.crossVectors(Ot,Ht),e=[Vt.x,Vt.y,Vt.z],jt(e,Bt,zt,Ft,kt)))}clampPoint(t,e){return void 0===e&&(console.warn("THREE.Box3: .clampPoint() target is now required"),e=new Lt),e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return It.copy(t).clamp(this.min,this.max).sub(t).length()}getBoundingSphere(t){return void 0===t&&console.error("THREE.Box3: .getBoundingSphere() target is now required"),this.getCenter(t.center),t.radiu
vendor: 15,121 bytes, line 824
824s=.5*this.getSize(It).length(),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Dt[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Dt[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Dt[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Dt[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Dt[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Dt[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Dt[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Dt[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Dt)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}Pt.prototype.isBox3=!0;const Dt=[new Lt,new Lt,new Lt,new Lt,new Lt,new Lt,new Lt,new Lt],It=new Lt,Nt=new Pt,Bt=new Lt,zt=new Lt,Ft=new Lt,Ot=new Lt,Ht=new Lt,Gt=new Lt,Ut=new Lt,kt=new Lt,Vt=new Lt,Wt=new Lt;function jt(t,e,n,i,r){for(let s=0,a=t.length-3;s<=a;s+=3){Wt.fromArray(t,s);const a=r.x*Math.abs(Wt.x)+r.y*Math.abs(Wt.y)+r.z*Math.abs(Wt.z),o=e.dot(Wt),l=n.dot(Wt),c=i.dot(Wt);if(Math.max(-Math.max(o,l,c),Math.min(o,l,c))>a)return!1}return!0}const qt=new Pt,Xt=new Lt,Yt=new Lt,Zt=new Lt;class Jt{constructor(t=new Lt,e=-1){this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const n=this.center;void 0!==e?n.copy(e):qt.setFromPoints(t).getCenter(n);let i=0;for(let e=0,r=t.length;e<r;e++)i=Math.max(i,n.distanceToSquared(t[e]));return this.radius=Math.sqrt(i),this}copy(t){return this.center.copy(t.center),this.radius=t.radius,this}isEmpty(){return this.radius<0}makeEmpty(){return this.center.set(0,0,0),this.radius=-1,this}containsPoint(t){return t.distanceToSquared(this.center)<=this.radius*this.radius}distanceToPoint(t){return t.distanceTo(this.center)-this.radius}intersectsSphere(t){const e=this.radius+t.radius;return t.center.distanceToSquared(this.center)<=e*e}intersectsBox(t){return t.intersectsSphere(this)}intersectsPlane(t){return Math.abs(t.distanceToPoint(this.center))<=this.radius}clampPoint(t,e){const n=this.center.distanceToSquared(t);return void 0===e&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),e=new Lt),e.copy(t),n>this.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return void 0===t&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),t=new Pt),this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){Zt.subVectors(t,this.center);const e=Zt.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),n=.5*(t-this.radius);this.center.add(Zt.multiplyScalar(n/t)),this.radius+=n}return this}union(t){return Yt.subVectors(t.center,this.center).normalize().multiplyScalar(t.radius),this.expandByPoint(Xt.copy(t.center).add(Yt)),this.expandByPoint(Xt.copy(t.center).sub(Yt)),this}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const Qt=new Lt,Kt=new Lt,$t=new Lt,te=new Lt,ee=new Lt,ne=new Lt,ie=new Lt;class re{constructor(t=new Lt,e=new Lt(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return void 0===e&&(console.warn("THREE.Ray: .at() target is now required"),e=new Lt),e.copy(this.direction).multiplyScalar(t).add(this.origin)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,Qt)),this}closestPointToPoint(t,e){void 0===e&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),e=new Lt),e.subVectors(t,this.origin);const n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.direction).multiplyScalar(n).add(this.origin)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=Qt.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(Qt.copy(this.direction).multiplyScalar(e).add(this.origin),Qt.distanceToSquared(t))}distanceSqToSegment(t,e,n,i){Kt.copy(t).add(e).multiplyScalar(.5),$t.copy(e).sub(t).normalize(),te.copy(this.origin).sub(Kt);const r=.5*t.distanceTo(e),s=-this.direction.dot($t),a=te.dot(this.direction),o=-te.dot($t),l=te.lengthSq(),c=Math.abs(1-s*s);let h,u,d,p;if(c>0)if(h=s*o-a,u=s*a-o,p=r*c,h>=0)if(u>=-p)if(u<=p){const t=1/c;h*=t,u*=t,d=h*(h+s*u+2*a)+u*(s*h+u+2*o)+l}else u=r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u=-r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;else u<=-p?(h=Math.max(0,-(-s*r+a)),u=h>0?-r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l):u<=p?(h=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+l):(h=Math.max(0,-(s*r+a)),u=h>0?r:Math.min(Math.max(-r,-o),r),d=-h*h+u*(u+2*o)+l);else u=s>0?-r:r,h=Math.max(0,-(s*u+a)),d=-h*h+u*(u+2*o)+l;return n&&n.copy(this.direction).multiplyScalar(h).add(this.origin),i&&i.copy($t).multiplyScalar(u).add(Kt),d}intersectSphere(t,e){Qt.subVectors(t.center,this.origin);const n=Qt.dot(this.direction),i=Qt.dot(Qt)-n*n,r=t.radius*t.radius;if(i>r)return null;const s=Math.sqrt(r-i),a=n-s,o=n+s;return a<0&&o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null}intersectPlane(t,e){const n=this.distanceToPlane(t);return null===n?null:this.at(n,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let n,i,r,s,a,o;const l=1/this.direction.x,c=1/this.direction.y,h=1/this.direction.z,u=this.origin;return l>=0?(n=(t.min.x-u.x)*l,i=(t.max.x-u.x)*l):(n=(t.max.x-u.x)*l,i=(t.min.x-u.x)*l),c>=0?(r=(t.min.y-u.y)*c,s=(t.max.y-u.y)*c):(r=(t.max.y-u.y)*c,s=(t.min.y-u.y)*c),n>s||r>i?null:((r>n||n!=n)&&(n=r),(s<i||i!=i)&&(i=s),h>=0?(a=(t.min.z-u.z)*h,o=(t.max.z-u.z)*h):(a=(t.max.z-u.z)*h,o=(t.min.z-u.z)*h),n>o||a>i?null:((a>n||n!=n)&&(n=a),(o<i||i!=i)&&(i=o),i<0?null:this.at(n>=0?n:i,e)))}intersectsBox(t){return null!==this.intersectBox(t,Qt)}intersectTriangle(t,e,n,i,r){ee.subVectors(e,t),ne.subVectors(n,t),ie.crossVectors(ee,ne);let s,a=this.direction.dot(ie);if(a>0){if(i)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}te.subVectors(this.origin,t);const o=s*this.direction.dot(ne.crossVectors(te,ne));if(o<0)return null;const l=s*this.direction.dot(ee.cross(te));if(l<0)return null;if(o+l>a)return null;const c=-s*te.dot(ie);return c<0?null:this.at(c/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class se{constructor(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}set(t,e,n,i,r,s,a,o,l,c,h,u,d,p,m,f){const g=this.elements;return g[0]=t,g[4]=e,g[8]=n,g[12]=i,g[1]=r,g[5]=s,g[9]=a,g[13]=o,g[2]=l,g[6]=c,g[10]=h,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=f,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new se).fromArray(this.elements)}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this}copyPosition(t){const e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,n=t.elements,i=1/ae.setFromMatrixColumn(t,0).length(),r=1/ae.setFromMatrixColumn(t,1).length(),s=1/ae.setFromMatrixColumn(t,2).length();return e[0]=n[0]*i,e[1]=n[1]*i,e[2]=n[2]*i,e[3]=0,e[4]=n[4]*r,e[5]=n[5]*r,e[6]=n[6]*r,e[7]=0,e[8]=n[8]*s,e[9]=n[9]*s,e[10]=n[10]*s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){t&&t.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");const e=this.elements,n=t.x,i=t.y,r=t.z,s=Math.cos(n),a=Math.sin(n),o=Math.cos(i),l=Math.sin(i),c=Math.cos(r),h=Math.sin(r);if("XYZ"===t.order){const t=s*c,n=s*h,i=a*c,r=a*h;e[0]=o*c,e[4]=-o*h,e[8]=l,e[1]=n+i*l,e[5]=t-r*l,e[9]=-a*o,e[2]=r-t*l,e[6]=i+n*l,e[10]=s*o}else if("YXZ"===t.order){const t=o*c,n=o*h,i=l*c,r=l*h;e[0]=t+r*a,e[4]=i*a-n,e[8]=s*l,e[1]=s*h,e[5]=s*c,e[9]=-a,e[2]=n*a-i,e[6]=r+t*a,e[10]=s*o}else if("ZXY"===t.order){const t=o*c,n=o*h,i=l*c,r=l*h;e[0]=t-r*a,e[4]=-s*h,e[8]=i+n*a,e[1]=n+i*a,e[5]=s*c,e[9]=r-t*a,e[2]=-s*l,e[6]=a,e[10]=s*o}else if("ZYX"===t.order){const t=s*c,n=s*h,i=a*c,r=a*h;e[0]=o*c,e[4]=i*l-n,e[8]=t*l+r,e[1]=o*h,e[5]=r*l+t,e[9]=n*l-i,e[2]=-l,e[6]=a*o,e[10]=s*o}else if("YZX"===t.order){const t=s*o,n=s*l,i=a*o,r=a*l;e[0]=o*c,e[4]=r-t*h,e[8]=i*h+n,e[1]=h,e[5]=s*c,e[9]=-a*c,e[2]=-l*c,e[6]=n*h+i,e[10]=t-r*h}else if("XZY"===t.order){const t=s*o,n=s*l,i=a*o,r=a*l;e[0]=o*c,e[4]=-h,e[8]=l*c,e[1]=t*h+r,e[5]=s*c,e[9]=n*h-i,e[2]=i*h-n,e[6]=a*c,e[10]=r*h+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(le,t,ce)}lookAt(t,e,n){const i=this.elements;return de.subVectors(t,e),0===de.lengthSq()&&(de.z=1),de.normalize(),he.crossVectors(n,de),0===he.lengthSq()&&(1===Math.abs(n.z)?de.x+=1e-4:de.z+=1e-4,de.normalize(),he.crossVectors(n,de)),he.normalize(),ue.crossVectors(de,he),i[0]=he.x,i[4]=ue.x,i[8]=de.x,i[1]=he.y,i[5]=ue.y,i[9]=de.y,i[2]=he.z,i[6]=ue.z,i[10]=de.z,this}multiply(t,e){return void 0!==e?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(t,e)):this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,i=e.elements,r=this.elements,s=n[0],a=n[4],o=n[8],l=n[12],c=n[1],h=n[5],u=n[9],d=n[13],p=n[2],m=n[6],f=n[10],g=n[14],v=n[3],y=n[7],x=n[11],_=n[15],w=i[0],b=i[4],M=i[8],S=i[12],T=i[1],E=i[5],A=i[9],L=i[13],R=i[2],C=i[6],P=i[10],D=i[14],I=i[3],N=i[7],B=i[11],z=i[15];return r[0]=s*w+a*T+o*R+l*I,r[4]=s*b+a*E+o*C+l*N,r[8]=s*M+a*A+o*P+l*B,r[12]=s*S+a*L+o*D+l*z,r[1]=c*w+h*T+u*R+d*I,r[5]=c*b+h*E+u*C+d*N,r[9]=c*M+h*A+u*P+d*B,r[13]=c*S+h*L+u*D+d*z,r[2]=p*w+m*T+f*R+g*I,r[6]=p*b+m*E+f*C+g*N,r[10]=p*M+m*A+f*P+g*B,r[14]=p*S+m*L+f*D+g*z,r[3]=v*w+y*T+x*R+_*I,r[7]=v*b+y*E+x*C+_*N,r[11]=v*M+y*A+x*P+_*B,r[15]=v*S+y*L+x*D+_*z,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[4],i=t[8],r=t[12],s=t[1],a=t[5],o=t[9],l=t[13],c=t[2],h=t[6],u=t[10],d=t[14];return t[3]*(+r*o*h-i*l*h-r*a*u+n*l*u+i*a*d-n*o*d)+t[7]*(+e*o*d-e*l*u+r*s*u-i*s*d+i*l*c-r*o*c)+t[11]*(+e*l*h-e*a*d-r*s*h+n*s*d+r*a*c-n*l*c)+t[15]*(-i*a*c-e*o*h+e*a*u+i*s*h-n*s*u+n*o*c)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,n){const i=this.elements;return t.isVector3?(i[12]=t.x,i[13]=t.y,i[14]=t.z):(i[12]=t,i[13]=e,i[14]=n),this}invert(){const t=this.elements,e=t[0],n=t[1],i=t[2],r=t[3],s=t[4],a=t[5],o=t[6],l=t[7],c=t[8],h=t[9],u=t[10],d=t[11],p=t[12],m=t[13],f=t[14],g=t[15],v=h*f*l-m*u*l+m*o*d-a*f*d-h*o*g+a*u*g,y=p*u*l-c*f*l-p*o*d+s*f*d+c*o*g-s*u*g,x=c*m*l-p*h*l+p*a*d-s*m*d-c*a*g+s*h*g,_=p*h*o-c*m*o-p*a*u+s*m*u+c*a*f-s*h*f,w=e*v+n*y+i*x+r*_;if(0===w)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const b=1/w;return t[0]=v*b,t[1]=(m*u*r-h*f*r-m*i*d+n*f*d+h*i*g-n*u*g)*b,t[2]=(a*f*r-m*o*r+m*i*l-n*f*l-a*i*g+n*o*g)*b,t[3]=(h*o*r-a*u*r-h*i*l+n*u*l+a*i*d-n*o*d)*b,t[4]=y*b,t[5]=(c*f*r-p*u*r+p*i*d-e*f*d-c*i*g+e*u*g)*b,t[6]=(p*o*r-s*f*r-p*i*l+e*f*l+s*i*g-e*o*g)*b,t[7]=(s*u*r-c*o*r+c*i*l-e*u*l-s*i*d+e*o*d)*b,t[8]=x*b,t[9]=(p*h*r-c*m*r-p*n*d+e*m*d+c*n*g-e*h*g)*b,t[10]=(s*m*r-p*a*r+p*n*l-e*m*l-s*n*g+e*a*g)*b,t[11]=(c*a*r-s*h*r-c*n*l+e*h*l+s*n*d-e*a*d)*b,t[12]=_*b,t[13]=(c*m*i-p*h*i+p*n*u-e*m*u-c*n*f+e*h*f)*b,t[14]=(p*a*i-s*m*i-p*n*o+e*m*o+s*n*f-e*a*f)*b,t[15]=(s*h*i-c*a*i+c*n*o-e*h*o-s*n*u+e*a*u)*b,this}scale(t){const e=this.elements,n=t.x,i=t.y,r=t.z;return e[0]*=n,e[4]*=i,e[8]*=r,e[1]*=n,e[5]*=i,e[9]*=r,e[2]*=n,e[6]*=i,e[10]*=r,e[3]*=n,e[7]*=i,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],i=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,i))}makeTranslation(t,e,n){return this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const n=Math.cos(e),i=Math.sin(e),r=1-n,s=t.x,a=t.y,o=t.z,l=r*s,c=r*a;return this.set(l*s+n,l*a-i*o,l*o+i*a,0,l*a+i*o,c*a+n,c*o-i*s,0,l*o-i*a,c*o+i*s,r*o*o+n,0,0,0,0,1),this}makeScale(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this}makeShear(t,e,n){return this.set(1,e,n,0,t,1,n,0,t,e,1,0,0,0,0,1),this}compose(t,e,n){const i=this.elements,r=e._x,s=e._y,a=e._z,o=e._w,l=r+r,c=s+s,h=a+a,u=r*l,d=r*c,p=r*h,m=s*c,f=s*h,g=a*h,v=o*l,y=o*c,x=o*h,_=n.x,w=n.y,b=n.z;return i[0]=(1-(m+g))*_,i[1]=(d+x)*_,i[2]=(p-y)*_,i[3]=0,i[4]=(d-x)*w,i[5]=(1-(u+g))*w,i[6]=(f+v)*w,i[7]=0,i[8]=(p+y)*b,i[9]=(f-v)*b,i[10]=(1-(u+m))*b,i[11]=0,i[12]=t.x,i[13]=t.y,i[14]=t.z,i[15]=1,this}decompose(t,e,n){const i=this.elements;let r=ae.set(i[0],i[1],i[2]).length();const s=ae.set(i[4],i[5],i[6]).length(),a=ae.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),t.x=i[12],t.y=i[13],t.z=i[14],oe.copy(this);const o=1/r,l=1/s,c=1/a;return oe.elements[0]*=o,oe.elements[1]*=o,oe.elements[2]*=o,oe.elements[4]*=l,oe.elements[5]*=l,oe.elements[6]*=l,oe.elements[8]*=c,oe.elements[9]*=c,oe.elements[10]*=c,e.setFromRotationMatrix(oe),n.x=r,n.y=s,n.z=a,this}makePerspective(t,e,n,i,r,s){void 0===s&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a 
824new signature. Please check the docs.");const a=this.elements,o=2*r/(e-t),l=2*r/(n-i),c=(e+t)/(e-t),h=(n+i)/(n-i),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return a[0]=o,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=l,a[9]=h,a[13]=0,a[2]=0,a[6]=0,a[10]=u,a[14]=d,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,n,i,r,s){const a=this.elements,o=1/(e-t),l=1/(n-i),c=1/(s-r),h=(e+t)*o,u=(n+i)*l,d=(s+r)*c;return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-h,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-u,a[2]=0,a[6]=0,a[10]=-2*c,a[14]=-d,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,n=t.elements;for(let t=0;t<16;t++)if(e[t]!==n[t])return!1;return!0}fromArray(t,e=0){for(let n=0;n<16;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t}}se.prototype.isMatrix4=!0;const ae=new Lt,oe=new se,le=new Lt(0,0,0),ce=new Lt(1,1,1),he=new Lt,ue=new Lt,de=new Lt,pe=new se,me=new At;class fe{constructor(t=0,e=0,n=0,i=fe.DefaultOrder){this._x=t,this._y=e,this._z=n,this._order=i}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,n,i){return this._x=t,this._y=e,this._z=n,this._order=i||this._order,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e,n){const i=t.elements,r=i[0],s=i[4],a=i[8],o=i[1],l=i[5],c=i[9],h=i[2],u=i[6],d=i[10];switch(e=e||this._order){case"XYZ":this._y=Math.asin(ht(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-ht(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,l)):(this._y=Math.atan2(-h,r),this._z=0);break;case"ZXY":this._x=Math.asin(ht(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-h,d),this._z=Math.atan2(-s,l)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-ht(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-s,l));break;case"YZX":this._z=Math.asin(ht(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,l),this._y=Math.atan2(-h,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-ht(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!1!==n&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return pe.makeRotationFromQuaternion(t),this.setFromRotationMatrix(pe,e,n)}setFromVector3(t,e){return this.set(t.x,t.y,t.z,e||this._order)}reorder(t){return me.setFromEuler(this),this.setFromQuaternion(me,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}toVector3(t){return t?t.set(this._x,this._y,this._z):new Lt(this._x,this._y,this._z)}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}}fe.prototype.isEuler=!0,fe.DefaultOrder="XYZ",fe.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class ge{constructor(){this.mask=1}set(t){this.mask=1<<t|0}enable(t){this.mask|=1<<t|0}enableAll(){this.mask=-1}toggle(t){this.mask^=1<<t|0}disable(t){this.mask&=~(1<<t|0)}disableAll(){this.mask=0}test(t){return 0!=(this.mask&t.mask)}}let ve=0;const ye=new Lt,xe=new At,_e=new se,we=new Lt,be=new Lt,Me=new Lt,Se=new At,Te=new Lt(1,0,0),Ee=new Lt(0,1,0),Ae=new Lt(0,0,1),Le={type:"added"},Re={type:"removed"};class Ce extends rt{constructor(){super(),Object.defineProperty(this,"id",{value:ve++}),this.uuid=ct(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=Ce.DefaultUp.clone();const t=new Lt,e=new fe,n=new At,i=new Lt(1,1,1);e._onChange((function(){n.setFromEuler(e,!1)})),n._onChange((function(){e.setFromQuaternion(n,void 0,!1)})),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:t},rotation:{configurable:!0,enumerable:!0,value:e},quaternion:{configurable:!0,enumerable:!0,value:n},scale:{configurable:!0,enumerable:!0,value:i},modelViewMatrix:{value:new se},normalMatrix:{value:new yt}}),this.matrix=new se,this.matrixWorld=new se,this.matrixAutoUpdate=Ce.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.layers=new ge,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.animations=[],this.userData={}}onBeforeRender(){}onAfterRender(){}applyMatrix4(t){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(t),this.matrix.decompose(this.position,this.quaternion,this.scale)}applyQuaternion(t){return this.quaternion.premultiply(t),this}setRotationFromAxisAngle(t,e){this.quaternion.setFromAxisAngle(t,e)}setRotationFromEuler(t){this.quaternion.setFromEuler(t,!0)}
vendor: 8,767 bytes, line 824
824setRotationFromMatrix(t){this.quaternion.setFromRotationMatrix(t)}setRotationFromQuaternion(t){this.quaternion.copy(t)}rotateOnAxis(t,e){return xe.setFromAxisAngle(t,e),this.quaternion.multiply(xe),this}rotateOnWorldAxis(t,e){return xe.setFromAxisAngle(t,e),this.quaternion.premultiply(xe),this}rotateX(t){return this.rotateOnAxis(Te,t)}rotateY(t){return this.rotateOnAxis(Ee,t)}rotateZ(t){return this.rotateOnAxis(Ae,t)}translateOnAxis(t,e){return ye.copy(t).applyQuaternion(this.quaternion),this.position.add(ye.multiplyScalar(e)),this}translateX(t){return this.translateOnAxis(Te,t)}translateY(t){return this.translateOnAxis(Ee,t)}translateZ(t){return this.translateOnAxis(Ae,t)}localToWorld(t){return t.applyMatrix4(this.matrixWorld)}worldToLocal(t){return t.applyMatrix4(_e.copy(this.matrixWorld).invert())}lookAt(t,e,n){t.isVector3?we.copy(t):we.set(t,e,n);const i=this.parent;this.updateWorldMatrix(!0,!1),be.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?_e.lookAt(be,we,this.up):_e.lookAt(we,be,this.up),this.quaternion.setFromRotationMatrix(_e),i&&(_e.extractRotation(i.matrixWorld),xe.setFromRotationMatrix(_e),this.quaternion.premultiply(xe.invert()))}add(t){if(arguments.length>1){for(let t=0;t<arguments.length;t++)this.add(arguments[t]);return this}return t===this?(console.error("THREE.Object3D.add: object can't be added as a child of itself.",t),this):(t&&t.isObject3D?(null!==t.parent&&t.parent.remove(t),t.parent=this,this.children.push(t),t.dispatchEvent(Le)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",t),this)}remove(t){if(arguments.length>1){for(let t=0;t<arguments.length;t++)this.remove(arguments[t]);return this}const e=this.children.indexOf(t);return-1!==e&&(t.parent=null,this.children.splice(e,1),t.dispatchEvent(Re)),this}clear(){for(let t=0;t<this.children.length;t++){const e=this.children[t];e.parent=null,e.dispatchEvent(Re)}return this.children.length=0,this}attach(t){return this.updateWorldMatrix(!0,!1),_e.copy(this.matrixWorld).invert(),null!==t.parent&&(t.parent.updateWorldMatrix(!0,!1),_e.multiply(t.parent.matrixWorld)),t.applyMatrix4(_e),this.add(t),t.updateWorldMatrix(!1,!0),this}getObjectById(t){return this.getObjectByProperty("id",t)}getObjectByName(t){return this.getObjectByProperty("name",t)}getObjectByProperty(t,e){if(this[t]===e)return this;for(let n=0,i=this.children.length;n<i;n++){const i=this.children[n].getObjectByProperty(t,e);if(void 0!==i)return i}}getWorldPosition(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldPosition() target is now required"),t=new Lt),this.updateWorldMatrix(!0,!1),t.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"),t=new At),this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(be,t,Me),t}getWorldScale(t){return void 0===t&&(console.warn("THREE.Object3D: .getWorldScale() target is now required"),t=new Lt),this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(be,Se,t),t}getWorldDirection(t){void 0===t&&(console.warn("THREE.Object3D: .getWorldDirection() target is now required"),t=new Lt),this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(e[8],e[9],e[10]).normalize()}raycast(){}traverse(t){t(this);const e=this.children;for(let n=0,i=e.length;n<i;n++)e[n].traverse(t)}traverseVisible(t){if(!1===this.visible)return;t(this);const e=this.children;for(let n=0,i=e.length;n<i;n++)e[n].traverseVisible(t)}traverseAncestors(t){const e=this.parent;null!==e&&(t(e),e.traverseAncestors(t))}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0}updateMatrixWorld(t){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||t)&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,t=!0);const e=this.children;for(let n=0,i=e.length;n<i;n++)e[n].updateMatrixWorld(t)}updateWorldMatrix(t,e){const n=this.parent;if(!0===t&&null!==n&&n.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),!0===e){const t=this.children;for(let e=0,n=t.length;e<n;e++)t[e].updateWorldMatrix(!1,!0)}}toJSON(t){const e=void 0===t||"string"==typeof t,n={};e&&(t={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{}},n.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});const i={};function r(e,n){return void 0===e[n.uuid]&&(e[n.uuid]=n.toJSON(t)),n.uuid}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),!0===this.castShadow&&(i.castShadow=!0),!0===this.receiveShadow&&(i.receiveShadow=!0),!1===this.visible&&(i.visible=!1),!1===this.frustumCulled&&(i.frustumCulled=!1),0!==this.renderOrder&&(i.renderOrder=this.renderOrder),"{}"!==JSON.stringify(this.userData)&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),!1===this.matrixAutoUpdate&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(i.instanceColor=this.instanceColor.toJSON())),this.isMesh||this.isLine||this.isPoints){i.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const n=e.shapes;if(Array.isArray(n))for(let e=0,i=n.length;e<i;e++){const i=n[e];r(t.shapes,i)}else r(t.shapes,n)}}if(this.isSkinnedMesh&&(i.bindMode=this.bindMode,i.bindMatrix=this.bindMatrix.toArray(),void 0!==this.skeleton&&(r(t.skeletons,this.skeleton),i.skeleton=this.skeleton.uuid)),void 0!==this.material)if(Array.isArray(this.material)){const e=[];for(let n=0,i=this.material.length;n<i;n++)e.push(r(t.materials,this.material[n]));i.material=e}else i.material=r(t.materials,this.material);if(this.children.length>0){i.children=[];for(let e=0;e<this.children.length;e++)i.children.push(this.children[e].toJSON(t).object)}if(this.animations.length>0){i.animations=[];for(let e=0;e<this.animations.length;e++){const n=this.animations[e];i.animations.push(r(t.animations,n))}}if(e){const e=s(t.geometries),i=s(t.materials),r=s(t.textures),a=s(t.images),o=s(t.shapes),l=s(t.skeletons),c=s(t.animations);e.length>0&&(n.geometries=e),i.length>0&&(n.materials=i),r.length>0&&(n.textures=r),a.length>0&&(n.images=a),o.length>0&&(n.shapes=o),l.length>0&&(n.skeletons=l),c.length>0&&(n.animations=c)}return n.object=i,n;function s(t){const e=[];for(const n in t){const i=t[n];delete i.metadata,e.push(i)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e<t.children.length;e++){const n=t.children[e];this.add(n.clone())}return this}}Ce.DefaultUp=new Lt(0,1,0),Ce.DefaultMatrixAutoUpdate=!0,Ce.prototype.isObject3D=!0;const Pe=new Lt,De=new Lt,Ie=new yt;class Ne{constructor(t=new Lt(1,0,0),e=0){this.normal=t,this.constant=e}set(t,e){return this.normal.copy(t),this.constant=e,this}setComponents(t,e,n,i){return this.normal.set(t,e,n),this.constant=i,this}setFromNormalAndCoplanarPoint(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this}setFromCoplanarPoints(t,e,n){const i=Pe.subVectors(n,e).cross(De.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(i,t),this}copy(t){return this.normal.copy(t.normal),this.constant=t.constant,this}normalize(){const t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}distanceToSphere(t){return this.distanceToPoint(t.center)-t.radius}projectPoint(t,e){return void 0===e&&(console.warn("THREE.Plane: .projectPoint() target is now required"),e=new Lt),e.copy(this.normal).multiplyScalar(-this.distanceToPoint(t)).add(t)}intersectLine(t,e){void 0===e&&(console.warn("THREE.Plane: .intersectLine() target is now required"),e=new Lt);const n=t.delta(Pe),i=this.normal.dot(n);if(0===i)return 0===this.distanceToPoint(t.start)?e.copy(t.start):null;
vendor: 5,889 bytes, line 824
824const r=-(t.start.dot(this.normal)+this.constant)/i;return r<0||r>1?null:e.copy(n).multiplyScalar(r).add(t.start)}intersectsLine(t){const e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return void 0===t&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),t=new Lt),t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const n=e||Ie.getNormalMatrix(t),i=this.coplanarPoint(Pe).applyMatrix4(t),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}Ne.prototype.isPlane=!0;const Be=new Lt,ze=new Lt,Fe=new Lt,Oe=new Lt,He=new Lt,Ge=new Lt,Ue=new Lt,ke=new Lt,Ve=new Lt,We=new Lt;class je{constructor(t=new Lt,e=new Lt,n=new Lt){this.a=t,this.b=e,this.c=n}static getNormal(t,e,n,i){void 0===i&&(console.warn("THREE.Triangle: .getNormal() target is now required"),i=new Lt),i.subVectors(n,e),Be.subVectors(t,e),i.cross(Be);const r=i.lengthSq();return r>0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(t,e,n,i,r){Be.subVectors(i,e),ze.subVectors(n,e),Fe.subVectors(t,e);const s=Be.dot(Be),a=Be.dot(ze),o=Be.dot(Fe),l=ze.dot(ze),c=ze.dot(Fe),h=s*l-a*a;if(void 0===r&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),r=new Lt),0===h)return r.set(-2,-1,-1);const u=1/h,d=(l*o-a*c)*u,p=(s*c-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,n,i){return this.getBarycoord(t,e,n,i,Oe),Oe.x>=0&&Oe.y>=0&&Oe.x+Oe.y<=1}static getUV(t,e,n,i,r,s,a,o){return this.getBarycoord(t,e,n,i,Oe),o.set(0,0),o.addScaledVector(r,Oe.x),o.addScaledVector(s,Oe.y),o.addScaledVector(a,Oe.z),o}static isFrontFacing(t,e,n,i){return Be.subVectors(n,e),ze.subVectors(t,e),Be.cross(ze).dot(i)<0}set(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this}setFromPointsAndIndices(t,e,n,i){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[i]),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Be.subVectors(this.c,this.b),ze.subVectors(this.a,this.b),.5*Be.cross(ze).length()}getMidpoint(t){return void 0===t&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),t=new Lt),t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return je.getNormal(this.a,this.b,this.c,t)}getPlane(t){return void 0===t&&(console.warn("THREE.Triangle: .getPlane() target is now required"),t=new Ne),t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return je.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,n,i,r){return je.getUV(t,this.a,this.b,this.c,e,n,i,r)}containsPoint(t){return je.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return je.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){void 0===e&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),e=new Lt);const n=this.a,i=this.b,r=this.c;let s,a;He.subVectors(i,n),Ge.subVectors(r,n),ke.subVectors(t,n);const o=He.dot(ke),l=Ge.dot(ke);if(o<=0&&l<=0)return e.copy(n);Ve.subVectors(t,i);const c=He.dot(Ve),h=Ge.dot(Ve);if(c>=0&&h<=c)return e.copy(i);const u=o*h-c*l;if(u<=0&&o>=0&&c<=0)return s=o/(o-c),e.copy(n).addScaledVector(He,s);We.subVectors(t,r);const d=He.dot(We),p=Ge.dot(We);if(p>=0&&d<=p)return e.copy(r);const m=d*l-o*p;if(m<=0&&l>=0&&p<=0)return a=l/(l-p),e.copy(n).addScaledVector(Ge,a);const f=c*p-d*h;if(f<=0&&h-c>=0&&d-p>=0)return Ue.subVectors(r,i),a=(h-c)/(h-c+(d-p)),e.copy(i).addScaledVector(Ue,a);const g=1/(f+m+u);return s=m*g,a=u*g,e.copy(n).addScaledVector(He,s).addScaledVector(Ge,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}let qe=0;function Xe(){Object.defineProperty(this,"id",{value:qe++}),this.uuid=ct(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=n,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=tt,this.stencilZFail=tt,this.stencilZPass=tt,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaTest=0,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0}Xe.prototype=Object.assign(Object.create(rt.prototype),{constructor:Xe,isMaterial:!0,onBuild:function(){},onBeforeCompile:function(){},customProgramCacheKey:function(){return this.onBeforeCompile.toString()},setValues:function(t){if(void 0!==t)for(const e in t){const n=t[e];if(void 0===n){console.warn("THREE.Material: '"+e+"' parameter is undefined.");continue}if("shading"===e){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===n;continue}const i=this[e];void 0!==i?i&&i.isColor?i.set(n):i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[e]=n:console.warn("THREE."+this.type+": '"+e+"' is not a property of this material.")}},toJSON:function(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const n={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function i(t){const e=[];for(const n in t){const i=t[n];delete i.metadata,e.push(i)}return e}
vendor: 4,678 bytes, line 824
824if(n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),void 0!==this.roughness&&(n.roughness=this.roughness),void 0!==this.metalness&&(n.metalness=this.metalness),this.sheen&&this.sheen.isColor&&(n.sheen=this.sheen.getHex()),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),void 0!==this.shininess&&(n.shininess=this.shininess),void 0!==this.clearcoat&&(n.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(n.combine=this.combine)),void 0!==this.envMapIntensity&&(n.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(n.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.size&&(n.size=this.size),null!==this.shadowSide&&(n.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(n.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(n.blending=this.blending),0!==this.side&&(n.side=this.side),this.vertexColors&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),!0===this.transparent&&(n.transparent=this.transparent),n.depthFunc=this.depthFunc,n.depthTest=this.depthTest,n.depthWrite=this.depthWrite,n.colorWrite=this.colorWrite,n.stencilWrite=this.stencilWrite,n.stencilWriteMask=this.stencilWriteMask,n.stencilFunc=this.stencilFunc,n.stencilRef=this.stencilRef,n.stencilFuncMask=this.stencilFuncMask,n.stencilFail=this.stencilFail,n.stencilZFail=this.stencilZFail,n.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(n.rotation=this.rotation),!0===this.polygonOffset&&(n.polygonOffset=!0),0!==this.polygonOffsetFactor&&(n.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(n.linewidth=this.linewidth),void 0!==this.dashSize&&(n.dashSize=this.dashSize),void 0!==this.gapSize&&(n.gapSize=this.gapSize),void 0!==this.scale&&(n.scale=this.scale),!0===this.dithering&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),!0===this.alphaToCoverage&&(n.alphaToCoverage=this.alphaToCoverage),!0===this.premultipliedAlpha&&(n.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(n.wireframe=this.wireframe),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(n.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(n.wireframeLinejoin=this.wireframeLinejoin),!0===this.morphTargets&&(n.morphTargets=!0),!0===this.morphNormals&&
vendor: 4,816 bytes, line 824
824(n.morphNormals=!0),!0===this.skinning&&(n.skinning=!0),!0===this.flatShading&&(n.flatShading=this.flatShading),!1===this.visible&&(n.visible=!1),!1===this.toneMapped&&(n.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),e){const e=i(t.textures),r=i(t.images);e.length>0&&(n.textures=e),r.length>0&&(n.images=r)}return n},clone:function(){return(new this.constructor).copy(this)},copy:function(t){this.name=t.name,this.fog=t.fog,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let n=null;if(null!==e){const t=e.length;n=new Array(t);for(let i=0;i!==t;++i)n[i]=e[i].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this},dispose:function(){this.dispatchEvent({type:"dispose"})}}),Object.defineProperty(Xe.prototype,"needsUpdate",{set:function(t){!0===t&&this.version++}});const Ye={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Ze={h:0,s:0,l:0},Je={h:0,s:0,l:0};function Qe(t,e,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?t+6*(e-t)*n:n<.5?e:n<2/3?t+6*(e-t)*(2/3-n):t}
vendor: 13,180 bytes, line 824
824function Ke(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function $e(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}class tn{constructor(t,e,n){return void 0===e&&void 0===n?this.set(t):this.setRGB(t,e,n)}set(t){return t&&t.isColor?this.copy(t):"number"==typeof t?this.setHex(t):"string"==typeof t&&this.setStyle(t),this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,this}setRGB(t,e,n){return this.r=t,this.g=e,this.b=n,this}setHSL(t,e,n){if(t=ut(t,1),e=ht(e,0,1),n=ht(n,0,1),0===e)this.r=this.g=this.b=n;else{const i=n<=.5?n*(1+e):n+e-n*e,r=2*n-i;this.r=Qe(r,i,t+1/3),this.g=Qe(r,i,t),this.b=Qe(r,i,t-1/3)}return this}setStyle(t){function e(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let n;if(n=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(t)){let t;const i=n[1],r=n[2];switch(i){case"rgb":case"rgba":if(t=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(255,parseInt(t[1],10))/255,this.g=Math.min(255,parseInt(t[2],10))/255,this.b=Math.min(255,parseInt(t[3],10))/255,e(t[4]),this;if(t=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(100,parseInt(t[1],10))/100,this.g=Math.min(100,parseInt(t[2],10))/100,this.b=Math.min(100,parseInt(t[3],10))/100,e(t[4]),this;break;case"hsl":case"hsla":if(t=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r)){const n=parseFloat(t[1])/360,i=parseInt(t[2],10)/100,r=parseInt(t[3],10)/100;return e(t[4]),this.setHSL(n,i,r)}}}else if(n=/^\#([A-Fa-f\d]+)$/.exec(t)){const t=n[1],e=t.length;if(3===e)return this.r=parseInt(t.charAt(0)+t.charAt(0),16)/255,this.g=parseInt(t.charAt(1)+t.charAt(1),16)/255,this.b=parseInt(t.charAt(2)+t.charAt(2),16)/255,this;if(6===e)return this.r=parseInt(t.charAt(0)+t.charAt(1),16)/255,this.g=parseInt(t.charAt(2)+t.charAt(3),16)/255,this.b=parseInt(t.charAt(4)+t.charAt(5),16)/255,this}return t&&t.length>0?this.setColorName(t):this}setColorName(t){const e=Ye[t.toLowerCase()];return void 0!==e?this.setHex(e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copyGammaToLinear(t,e=2){return this.r=Math.pow(t.r,e),this.g=Math.pow(t.g,e),this.b=Math.pow(t.b,e),this}copyLinearToGamma(t,e=2){const n=e>0?1/e:1;return this.r=Math.pow(t.r,n),this.g=Math.pow(t.g,n),this.b=Math.pow(t.b,n),this}convertGammaToLinear(t){return this.copyGammaToLinear(this,t),this}convertLinearToGamma(t){return this.copyLinearToGamma(this,t),this}copySRGBToLinear(t){return this.r=Ke(t.r),this.g=Ke(t.g),this.b=Ke(t.b),this}copyLinearToSRGB(t){return this.r=$e(t.r),this.g=$e(t.g),this.b=$e(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0}getHexString(){return("000000"+this.getHex().toString(16)).slice(-6)}getHSL(t){void 0===t&&(console.warn("THREE.Color: .getHSL() target is now required"),t={h:0,s:0,l:0});const e=this.r,n=this.g,i=this.b,r=Math.max(e,n,i),s=Math.min(e,n,i);let a,o;const l=(s+r)/2;if(s===r)a=0,o=0;else{const t=r-s;switch(o=l<=.5?t/(r+s):t/(2-r-s),r){case e:a=(n-i)/t+(n<i?6:0);break;case n:a=(i-e)/t+2;break;case i:a=(e-n)/t+4}a/=6}return t.h=a,t.s=o,t.l=l,t}getStyle(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"}offsetHSL(t,e,n){return this.getHSL(Ze),Ze.h+=t,Ze.s+=e,Ze.l+=n,this.setHSL(Ze.h,Ze.s,Ze.l),this}add(t){return this.r+=t.r,this.g+=t.g,this.b+=t.b,this}addColors(t,e){return this.r=t.r+e.r,this.g=t.g+e.g,this.b=t.b+e.b,this}addScalar(t){return this.r+=t,this.g+=t,this.b+=t,this}sub(t){return this.r=Math.max(0,this.r-t.r),this.g=Math.max(0,this.g-t.g),this.b=Math.max(0,this.b-t.b),this}multiply(t){return this.r*=t.r,this.g*=t.g,this.b*=t.b,this}multiplyScalar(t){return this.r*=t,this.g*=t,this.b*=t,this}lerp(t,e){return this.r+=(t.r-this.r)*e,this.g+=(t.g-this.g)*e,this.b+=(t.b-this.b)*e,this}lerpColors(t,e,n){return this.r=t.r+(e.r-t.r)*n,this.g=t.g+(e.g-t.g)*n,this.b=t.b+(e.b-t.b)*n,this}lerpHSL(t,e){this.getHSL(Ze),t.getHSL(Je);const n=dt(Ze.h,Je.h,e),i=dt(Ze.s,Je.s,e),r=dt(Ze.l,Je.l,e);return this.setHSL(n,i,r),this}equals(t){return t.r===this.r&&t.g===this.g&&t.b===this.b}fromArray(t,e=0){return this.r=t[e],this.g=t[e+1],this.b=t[e+2],this}toArray(t=[],e=0){return t[e]=this.r,t[e+1]=this.g,t[e+2]=this.b,t}fromBufferAttribute(t,e){return this.r=t.getX(e),this.g=t.getY(e),this.b=t.getZ(e),!0===t.normalized&&(this.r/=255,this.g/=255,this.b/=255),this}toJSON(){return this.getHex()}}tn.NAMES=Ye,tn.prototype.isColor=!0,tn.prototype.r=1,tn.prototype.g=1,tn.prototype.b=1;class en extends Xe{constructor(t){super(),this.type="MeshBasicMaterial",this.color=new tn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this}}en.prototype.isMeshBasicMaterial=!0;const nn=new Lt,rn=new vt;class sn{constructor(t,e,n){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=!0===n,this.usage=et,this.updateRange={offset:0,count:-1},this.version=0,this.onUploadCallback=function(){}}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this}copyAt(t,e,n){t*=this.itemSize,n*=e.itemSize;for(let i=0,r=this.itemSize;i<r;i++)this.array[t+i]=e.array[n+i];return this}copyArray(t){return this.array.set(t),this}copyColorsArray(t){const e=this.array;let n=0;for(let i=0,r=t.length;i<r;i++){let r=t[i];void 0===r&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",i),r=new tn),e[n++]=r.r,e[n++]=r.g,e[n++]=r.b}return this}copyVector2sArray(t){const e=this.array;let n=0;for(let i=0,r=t.length;i<r;i++){let r=t[i];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",i),r=new vt),e[n++]=r.x,e[n++]=r.y}return this}copyVector3sArray(t){const e=this.array;let n=0;for(let i=0,r=t.length;i<r;i++){let r=t[i];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",i),r=new Lt),e[n++]=r.x,e[n++]=r.y,e[n++]=r.z}return this}copyVector4sArray(t){const e=this.array;let n=0;for(let i=0,r=t.length;i<r;i++){let r=t[i];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",i),r=new St),e[n++]=r.x,e[n++]=r.y,e[n++]=r.z,e[n++]=r.w}return this}applyMatrix3(t){if(2===this.itemSize)for(let e=0,n=this.count;e<n;e++)rn.fromBufferAttribute(this,e),rn.applyMatrix3(t),this.setXY(e,rn.x,rn.y);else if(3===this.itemSize)for(let e=0,n=this.count;e<n;e++)nn.fromBufferAttribute(this,e),nn.applyMatrix3(t),this.setXYZ(e,nn.x,nn.y,nn.z);return this}applyMatrix4(t){for(let e=0,n=this.count;e<n;e++)nn.x=this.getX(e),nn.y=this.getY(e),nn.z=this.getZ(e),nn.applyMatrix4(t),this.setXYZ(e,nn.x,nn.y,nn.z);return this}applyNormalMatrix(t){for(let e=0,n=this.count;e<n;e++)nn.x=this.getX(e),nn.y=this.getY(e),nn.z=this.getZ(e),nn.applyNormalMatrix(t),this.setXYZ(e,nn.x,nn.y,nn.z);return this}transformDirection(t){for(let e=0,n=this.count;e<n;e++)nn.x=this.getX(e),nn.y=this.getY(e),nn.z=this.getZ(e),nn.transformDirection(t),this.setXYZ(e,nn.x,nn.y,nn.z);return this}set(t,e=0){return this.array.set(t,e),this}getX(t){return this.array[t*this.itemSize]}setX(t,e){return this.array[t*this.itemSize]=e,this}getY(t){return this.array[t*this.itemSize+1]}setY(t,e){return this.array[t*this.itemSize+1]=e,this}getZ(t){return this.array[t*this.itemSize+2]}setZ(t,e){return this.array[t*this.itemSize+2]=e,this}getW(t){return this.array[t*this.itemSize+3]}setW(t,e){return this.array[t*this.itemSize+3]=e,this}setXY(t,e,n){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=n,this}setXYZ(t,e,n,i){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=n,this.array[t+2]=i,this}setXYZW(t,e,n,i,r){return t*=this.itemSize,this.array[t+0]=e,this.array[t+1]=n,this.array[t+2]=i,this.array[t+3]=r,this}onUpload(t){return this.onUploadCallback=t,this}clone(){return new this.constructor(this.array,this.itemSize).copy(this)}toJSON(){const t={itemSize:this.itemSize,type:this.array.constructor.name,array:Array.prototype.slice.call(this.array),normalized:this.normalized};return""!==this.name&&(t.name=this.name),this.usage!==et&&(t.usage=this.usage),0===this.updateRange.offset&&-1===this.updateRange.count||(t.updateRange=this.updateRange),t}}sn.prototype.isBufferAttribute=!0;class an extends sn{constructor(t,e,n){super(new Int8Array(t),e,n)}}class on extends sn{constructor(t,e,n){super(new Uint8Array(t),e,n)}}class ln extends sn{constructor(t,e,n){super(new Uint8ClampedArray(t),e,n)}}class cn extends sn{constructor(t,e,n){super(new Int16Array(t),e,n)}}class hn extends sn{constructor(t,e,n){super(new Uint16Array(t),e,n)}}class un extends sn{constructor(t,e,n){super(new Int32Array(t),e,n)}}class dn extends sn{constructor(t,e,n){super(new Uint32Array(t),e,n)}}class pn extends sn{constructor(t,e,n){super(new Uint16Array(t),e,n)}}pn.prototype.isFloat16BufferAttribute=!0;class mn extends sn{constructor(t,e,n){super(new Float32Array(t),e,n)}}class fn extends sn{constructor(t,e,n){super(new Float64Array(t),e,n)}}function gn(t){if(0===t.length)return-1/0;let e=t[0];for(let n=1,i=t.length;n<i;++n)t[n]>e&&(e=t[n]);return e}const vn={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function yn(t,e){return new vn[t](e)}let xn=0;const _n=new se,wn=new Ce,bn=new Lt,Mn=new Pt,Sn=new Pt,Tn=new Lt;class En extends rt{constructor(){super(),Object.defineProperty(this,"id",{value:xn++}),this.uuid=ct(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(t){return Array.isArray(t)?this.index=new(gn(t)>65535?dn:hn)(t,1):this.index=t,this}getAttribute(t){return this.attributes[t]}setAttribute(t,e){return this.attributes[t]=e,this}deleteAttribute(t){return delete this.attributes[t],this}hasAttribute(t){return void 0!==this.attributes[t]}addGroup(t,e,n=0){this.groups.push({start:t,count:e,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(t,e){this.drawRange.start=t,this.drawRange.count=e}applyMatrix4(t){const e=this.attributes.position;void 0!==e&&(e.applyMatrix4(t),e.needsUpdate=!0);const n=this.attributes.normal;if(void 0!==n){const e=(new yt).getNormalMatrix(t);n.applyNormalMatrix(e),n.needsUpdate=!0}const i=this.attributes.tangent;return void 0!==i&&(i.transformDirection(t),i.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}rotateX(t){return _n.makeRotationX(t),this.applyMatrix4(_n),this}rotateY(t){return _n.makeRotationY(t),this.applyMatrix4(_n),this}rotateZ(t){return _n.makeRotationZ(t),this.applyMatrix4(_n),this}translate(t,e,n){return _n.makeTranslation(t,e,n),this.applyMatrix4(_n),this}scale(t,e,n){return _n.makeScale(t,e,n),this.applyMatrix4(_n),this}lookAt(t){return wn.lookAt(t),wn.updateMatrix(),this.applyMatrix4(wn.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(bn).negate(),this.translate(bn.x,bn.y,bn.z),this}setFromPoints(t){const e=[];for(let n=0,i=t.length;n<i;n++){const i=t[n];e.push(i.x,i.y,i.z||0)}return this.setAttribute("position",new mn(e,3)),this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Pt);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error('THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set "mesh.frustumCulled" to "fal
824se".',this),void this.boundingBox.set(new Lt(-1/0,-1/0,-1/0),new Lt(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,n=e.length;t<n;t++){const n=e[t];Mn.setFromBufferAttribute(n),this.morphTargetsRelative?(Tn.addVectors(this.boundingBox.min,Mn.min),this.boundingBox.expandByPoint(Tn),Tn.addVectors(this.boundingBox.max,Mn.max),this.boundingBox.expandByPoint(Tn)):(this.boundingBox.expandByPoint(Mn.min),this.boundingBox.expandByPoint(Mn.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)}computeBoundingSphere(){null===this.boundingSphere&&(this.boundingSphere=new Jt);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error('THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set "mesh.frustumCulled" to "fal
824se".',this),void this.boundingSphere.set(new Lt,1/0);if(t){const n=this.boundingSphere.center;if(Mn.setFromBufferAttribute(t),e)for(let t=0,n=e.length;t<n;t++){const n=e[t];Sn.setFromBufferAttribute(n),this.morphTargetsRelative?(Tn.addVectors(Mn.min,Sn.min),Mn.expandByPoint(Tn),Tn.addVectors(Mn.max,Sn.max),Mn.expandByPoint(Tn)):(Mn.expandByPoint(Sn.min),Mn.expandByPoint(Sn.max))}Mn.getCenter(n);let i=0;for(let e=0,r=t.count;e<r;e++)Tn.fromBufferAttribute(t,e),i=Math.max(i,n.distanceToSquared(Tn));if(e)for(let r=0,s=e.length;r<s;r++){const s=e[r],a=this.morphTargetsRelative;for(let e=0,r=s.count;e<r;e++)Tn.fromBufferAttribute(s,e),a&&(bn.fromBufferAttribute(t,e),Tn.add(bn)),i=Math.max(i,n.distanceToSquared(Tn))}this.boundingSphere.radius=Math.sqrt(i),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}}computeFaceNormals(){}computeTangents(){const t=this.index,e=this.attributes;if(null===t||void 0===e.position||void 0===e.normal||void 0===e.uv)return void console.error("THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)");const n=t.array,i=e.position.array,r=e.normal.array,s=e.uv.array,a=i.length/3;void 0===e.tangent&&this.setAttribute("tangent",new sn(new Float32Array(4*a),4));const o=e.tangent.array,l=[],c=[];for(let t=0;t<a;t++)l[t]=new Lt,c[t]=new Lt;const h=new Lt,u=new Lt,d=new Lt,p=new vt,m=new vt,f=new vt,g=new Lt,v=new Lt;function y(t,e,n){h.fromArray(i,3*t),u.fromArray(i,3*e),d.fromArray(i,3*n),p.fromArray(s,2*t),m.fromArray(s,2*e),f.fromArray(s,2*n),u.sub(h),d.sub(h),m.sub(p),f.sub(p);const r=1/(m.x*f.y-f.x*m.y);isFinite(r)&&(g.copy(u).multiplyScalar(f.y).addScaledVector(d,-m.y).multiplyScalar(r),v.copy(d).multiplyScalar(m.x).addScaledVector(u,-f.x).multiplyScalar(r),l[t].add(g),l[e].add(g),l[n].add(g),c[t].add(v),c[e].add(v),c[n].add(v))}let x=this.groups;0===x.length&&(x=[{start:0,count:n.length}]);for(let t=0,e=x.length;t<e;++t){const e=x[t],i=e.start;for(let t=i,r=i+e.count;t<r;t+=3)y(n[t+0],n[t+1],n[t+2])}const _=new Lt,w=new Lt,b=new Lt,M=new Lt;function S(t){b.fromArray(r,3*t),M.copy(b);const e=l[t];_.copy(e),_.sub(b.multiplyScalar(b.dot(e))).normalize(),w.crossVectors(M,e);const n=w.dot(c[t])<0?-1:1;o[4*t]=_.x,o[4*t+1]=_.y,o[4*t+2]=_.z,o[4*t+3]=n}for(let t=0,e=x.length;t<e;++t){const e=x[t],i=e.start;for(let t=i,r=i+e.count;t<r;t+=3)S(n[t+0]),S(n[t+1]),S(n[t+2])}}computeVertexNormals(){const t=this.index,e=this.getAttribute("position");if(void 0!==e){let n=this.getAttribute("normal");if(void 0===n)n=new sn(new Float32Array(3*e.count),3),this.setAttribute("normal",n);else for(let t=0,e=n.count;t<e;t++)n.setXYZ(t,0,0,0);const i=new Lt,r=new Lt,s=new Lt,a=new Lt,o=new Lt,l=new Lt,c=new Lt,h=new Lt;if(t)for(let u=0,d=t.count;u<d;u+=3){const d=t.getX(u+0),p=t.getX(u+1),m=t.getX(u+2);i.fromBufferAttribute(e,d),r.fromBufferAttribute(e,p),s.fromBufferAttribute(e,m),c.subVectors(s,r),h.subVectors(i,r),c.cross(h),a.fromBufferAttribute(n,d),o.fromBufferAttribute(n,p),l.fromBufferAttribute(n,m),a.add(c),o.add(c),l.add(c),n.setXYZ(d,a.x,a.y,a.z),n.setXYZ(p,o.x,o.y,o.z),n.setXYZ(m,l.x,l.y,l.z)}else for(let t=0,a=e.count;t<a;t+=3)i.fromBufferAttribute(e,t+0),r.fromBufferAttribute(e,t+1),s.fromBufferAttribute(e,t+2),c.subVectors(s,r),h.subVectors(i,r),c.cross(h),n.setXYZ(t+0,c.x,c.y,c.z),n.setXYZ(t+1,c.x,c.y,c.z),n.setXYZ(t+2,c.x,c.y,c.z);this.normalizeNormals(),n.needsUpdate=!0}}merge(t,e){if(!t||!t.isBufferGeometry)return void console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",t);void 0===e&&(e=0,console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));const n=this.attributes;for(const i in n){if(void 0===t.attributes[i])continue;const r=n[i].array,s=t.attributes[i],a=s.array,o=s.itemSize*e,l=Math.min(a.length,r.length-o);for(let t=0,e=o;t<l;t++,e++)r[e]=a[t]}return this}normalizeNormals(){const t=this.attributes.normal;for(let e=0,n=t.count;e<n;e++)Tn.fromBufferAttribute(t,e),Tn.normalize(),t.setXYZ(e,Tn.x,Tn.y,Tn.z)}toNonIndexed(){function t(t,e){const n=t.array,i=t.itemSize,r=t.normalized,s=new n.constructor(e.length*i);let a=0,o=0;for(let t=0,r=e.length;t<r;t++){a=e[t]*i;for(let t=0;t<i;t++)s[o++]=n[a++]}return new sn(s,i,r)}if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."),this;const e=new En,n=this.index.array,i=this.attributes;for(const r in i){const s=t(i[r],n);e.setAttribute(r,s)}const r=this.morphAttributes;for(const i in r){const s=[],a=r[i];for(let e=0,i=a.length;e<i;e++){const i=t(a[e],n);s.push(i)}e.morphAttributes[i]=s}e.morphTargetsRelative=this.morphTargetsRelative;const s=this.groups;for(let t=0,n=s.length;t<n;t++){const n=s[t];e.addGroup(n.start,n.count,n.materialIndex)}return e}toJSON(){const t={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};
vendor: 20,458 bytes, line 824
824if(t.uuid=this.uuid,t.type=this.type,""!==this.name&&(t.name=this.name),Object.keys(this.userData).length>0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const n in e)void 0!==e[n]&&(t[n]=e[n]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const n=this.attributes;for(const e in n){const i=n[e];t.data.attributes[e]=i.toJSON(t.data)}const i={};let r=!1;for(const e in this.morphAttributes){const n=this.morphAttributes[e],s=[];for(let e=0,i=n.length;e<i;e++){const i=n[e];s.push(i.toJSON(t.data))}s.length>0&&(i[e]=s,r=!0)}r&&(t.data.morphAttributes=i,t.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(t.data.groups=JSON.parse(JSON.stringify(s)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return(new En).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const n=t.index;null!==n&&this.setIndex(n.clone(e));const i=t.attributes;for(const t in i){const n=i[t];this.setAttribute(t,n.clone(e))}const r=t.morphAttributes;for(const t in r){const n=[],i=r[t];for(let t=0,r=i.length;t<r;t++)n.push(i[t].clone(e));this.morphAttributes[t]=n}this.morphTargetsRelative=t.morphTargetsRelative;const s=t.groups;for(let t=0,e=s.length;t<e;t++){const e=s[t];this.addGroup(e.start,e.count,e.materialIndex)}const a=t.boundingBox;null!==a&&(this.boundingBox=a.clone());const o=t.boundingSphere;return null!==o&&(this.boundingSphere=o.clone()),this.drawRange.start=t.drawRange.start,this.drawRange.count=t.drawRange.count,this.userData=t.userData,this}dispose(){this.dispatchEvent({type:"dispose"})}}En.prototype.isBufferGeometry=!0;const An=new se,Ln=new re,Rn=new Jt,Cn=new Lt,Pn=new Lt,Dn=new Lt,In=new Lt,Nn=new Lt,Bn=new Lt,zn=new Lt,Fn=new Lt,On=new Lt,Hn=new vt,Gn=new vt,Un=new vt,kn=new Lt,Vn=new Lt;class Wn extends Ce{constructor(t=new En,e=new en){super(),this.type="Mesh",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t){return super.copy(t),void 0!==t.morphTargetInfluences&&(this.morphTargetInfluences=t.morphTargetInfluences.slice()),void 0!==t.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},t.morphTargetDictionary)),this.material=t.material,this.geometry=t.geometry,this}updateMorphTargets(){const t=this.geometry;if(t.isBufferGeometry){const e=t.morphAttributes,n=Object.keys(e);if(n.length>0){const t=e[n[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,n=t.length;e<n;e++){const n=t[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[n]=e}}}}else{const e=t.morphTargets;void 0!==e&&e.length>0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}raycast(t,e){const n=this.geometry,i=this.material,r=this.matrixWorld;if(void 0===i)return;if(null===n.boundingSphere&&n.computeBoundingSphere(),Rn.copy(n.boundingSphere),Rn.applyMatrix4(r),!1===t.ray.intersectsSphere(Rn))return;if(An.copy(r).invert(),Ln.copy(t.ray).applyMatrix4(An),null!==n.boundingBox&&!1===Ln.intersectsBox(n.boundingBox))return;let s;if(n.isBufferGeometry){const r=n.index,a=n.attributes.position,o=n.morphAttributes.position,l=n.morphTargetsRelative,c=n.attributes.uv,h=n.attributes.uv2,u=n.groups,d=n.drawRange;if(null!==r)if(Array.isArray(i))for(let n=0,p=u.length;n<p;n++){const p=u[n],m=i[p.materialIndex];for(let n=Math.max(p.start,d.start),i=Math.min(p.start+p.count,d.start+d.count);n<i;n+=3){const i=r.getX(n),u=r.getX(n+1),d=r.getX(n+2);s=jn(this,m,t,Ln,a,o,l,c,h,i,u,d),s&&(s.faceIndex=Math.floor(n/3),s.face.materialIndex=p.materialIndex,e.push(s))}}else{for(let n=Math.max(0,d.start),u=Math.min(r.count,d.start+d.count);n<u;n+=3){const u=r.getX(n),d=r.getX(n+1),p=r.getX(n+2);s=jn(this,i,t,Ln,a,o,l,c,h,u,d,p),s&&(s.faceIndex=Math.floor(n/3),e.push(s))}}else if(void 0!==a)if(Array.isArray(i))for(let n=0,r=u.length;n<r;n++){const r=u[n],p=i[r.materialIndex];for(let n=Math.max(r.start,d.start),i=Math.min(r.start+r.count,d.start+d.count);n<i;n+=3){s=jn(this,p,t,Ln,a,o,l,c,h,n,n+1,n+2),s&&(s.faceIndex=Math.floor(n/3),s.face.materialIndex=r.materialIndex,e.push(s))}}else{for(let n=Math.max(0,d.start),r=Math.min(a.count,d.start+d.count);n<r;n+=3){s=jn(this,i,t,Ln,a,o,l,c,h,n,n+1,n+2),s&&(s.faceIndex=Math.floor(n/3),e.push(s))}}}else n.isGeometry&&console.error("THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}function jn(t,e,n,i,r,s,a,o,l,c,h,u){Cn.fromBufferAttribute(r,c),Pn.fromBufferAttribute(r,h),Dn.fromBufferAttribute(r,u);const d=t.morphTargetInfluences;if(e.morphTargets&&s&&d){zn.set(0,0,0),Fn.set(0,0,0),On.set(0,0,0);for(let t=0,e=s.length;t<e;t++){const e=d[t],n=s[t];0!==e&&(In.fromBufferAttribute(n,c),Nn.fromBufferAttribute(n,h),Bn.fromBufferAttribute(n,u),a?(zn.addScaledVector(In,e),Fn.addScaledVector(Nn,e),On.addScaledVector(Bn,e)):(zn.addScaledVector(In.sub(Cn),e),Fn.addScaledVector(Nn.sub(Pn),e),On.addScaledVector(Bn.sub(Dn),e)))}Cn.add(zn),Pn.add(Fn),Dn.add(On)}t.isSkinnedMesh&&e.skinning&&(t.boneTransform(c,Cn),t.boneTransform(h,Pn),t.boneTransform(u,Dn));const p=function(t,e,n,i,r,s,a,o){let l;if(l=1===e.side?i.intersectTriangle(a,s,r,!0,o):i.intersectTriangle(r,s,a,2!==e.side,o),null===l)return null;Vn.copy(o),Vn.applyMatrix4(t.matrixWorld);const c=n.ray.origin.distanceTo(Vn);return c<n.near||c>n.far?null:{distance:c,point:Vn.clone(),object:t}}(t,e,n,i,Cn,Pn,Dn,kn);if(p){o&&(Hn.fromBufferAttribute(o,c),Gn.fromBufferAttribute(o,h),Un.fromBufferAttribute(o,u),p.uv=je.getUV(kn,Cn,Pn,Dn,Hn,Gn,Un,new vt)),l&&(Hn.fromBufferAttribute(l,c),Gn.fromBufferAttribute(l,h),Un.fromBufferAttribute(l,u),p.uv2=je.getUV(kn,Cn,Pn,Dn,Hn,Gn,Un,new vt));const t={a:c,b:h,c:u,normal:new Lt,materialIndex:0};je.getNormal(Cn,Pn,Dn,t.normal),p.face=t}return p}Wn.prototype.isMesh=!0;class qn extends En{constructor(t=1,e=1,n=1,i=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:n,widthSegments:i,heightSegments:r,depthSegments:s};const a=this;i=Math.floor(i),r=Math.floor(r),s=Math.floor(s);const o=[],l=[],c=[],h=[];let u=0,d=0;function p(t,e,n,i,r,s,p,m,f,g,v){const y=s/f,x=p/g,_=s/2,w=p/2,b=m/2,M=f+1,S=g+1;let T=0,E=0;const A=new Lt;for(let s=0;s<S;s++){const a=s*x-w;for(let o=0;o<M;o++){const u=o*y-_;A[t]=u*i,A[e]=a*r,A[n]=b,l.push(A.x,A.y,A.z),A[t]=0,A[e]=0,A[n]=m>0?1:-1,c.push(A.x,A.y,A.z),h.push(o/f),h.push(1-s/g),T+=1}}for(let t=0;t<g;t++)for(let e=0;e<f;e++){const n=u+e+M*t,i=u+e+M*(t+1),r=u+(e+1)+M*(t+1),s=u+(e+1)+M*t;o.push(n,i,s),o.push(i,r,s),E+=6}a.addGroup(d,E,v),d+=E,u+=T}p("z","y","x",-1,-1,n,e,t,s,r,0),p("z","y","x",1,-1,n,e,-t,s,r,1),p("x","z","y",1,1,t,n,e,i,s,2),p("x","z","y",1,-1,t,n,-e,i,s,3),p("x","y","z",1,-1,t,e,n,i,r,4),p("x","y","z",-1,-1,t,e,-n,i,r,5),this.setIndex(o),this.setAttribute("position",new mn(l,3)),this.setAttribute("normal",new mn(c,3)),this.setAttribute("uv",new mn(h,2))}}function Xn(t){const e={};for(const n in t){e[n]={};for(const i in t[n]){const r=t[n][i];r&&(r.isColor||r.isMatrix3||r.isMatrix4||r.isVector2||r.isVector3||r.isVector4||r.isTexture||r.isQuaternion)?e[n][i]=r.clone():Array.isArray(r)?e[n][i]=r.slice():e[n][i]=r}}return e}function Yn(t){const e={};for(let n=0;n<t.length;n++){const i=Xn(t[n]);for(const t in i)e[t]=i[t]}return e}const Zn={clone:Xn,merge:Yn};class Jn extends Xe{constructor(t){super(),this.type="ShaderMaterial",this.defines={},this.uniforms={},this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}",this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,void 0!==t&&(void 0!==t.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(t))}copy(t){return super.copy(t),this.fragmentShader=t.fragmentShader,this.vertexShader=t.vertexShader,this.uniforms=Xn(t.uniforms),this.defines=Object.assign({},t.defines),this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.lights=t.lights,this.clipping=t.clipping,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.extensions=Object.assign({},t.extensions),this.glslVersion=t.glslVersion,this}toJSON(t){const e=super.toJSON(t);e.glslVersion=this.glslVersion,e.uniforms={};for(const n in this.uniforms){const i=this.uniforms[n].value;i&&i.isTexture?e.uniforms[n]={type:"t",value:i.toJSON(t).uuid}:i&&i.isColor?e.uniforms[n]={type:"c",value:i.getHex()}:i&&i.isVector2?e.uniforms[n]={type:"v2",value:i.toArray()}:i&&i.isVector3?e.uniforms[n]={type:"v3",value:i.toArray()}:i&&i.isVector4?e.uniforms[n]={type:"v4",value:i.toArray()}:i&&i.isMatrix3?e.uniforms[n]={type:"m3",value:i.toArray()}:i&&i.isMatrix4?e.uniforms[n]={type:"m4",value:i.toArray()}:e.uniforms[n]={value:i}}Object.keys(this.defines).length>0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader;const n={};for(const t in this.extensions)!0===this.extensions[t]&&(n[t]=!0);return Object.keys(n).length>0&&(e.extensions=n),e}}Jn.prototype.isShaderMaterial=!0;class Qn extends Ce{constructor(){super(),this.type="Camera",this.matrixWorldInverse=new se,this.projectionMatrix=new se,this.projectionMatrixInverse=new se}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this}getWorldDirection(t){void 0===t&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),t=new Lt),this.updateWorldMatrix(!0,!1);const e=this.matrixWorld.elements;return t.set(-e[8],-e[9],-e[10]).normalize()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}Qn.prototype.isCamera=!0;class Kn extends Qn{constructor(t=50,e=1,n=.1,i=2e3){super(),this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=n,this.far=i,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*lt*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*ot*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*lt*Math.atan(Math.tan(.5*ot*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(t,e,n,i,r,s){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*ot*this.fov)/this.zoom,n=2*e,i=this.aspect*n,r=-.5*i;const s=this.view;if(null!==this.view&&this.view.enabled){const t=s.fullWidth,a=s.fullHeight;r+=s.offsetX*i/t,e-=s.offsetY*n/a,i*=s.width/t,n*=s.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,e,e-n,t,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}Kn.prototype.isPerspectiveCamera=!0;const $n=90;class ti extends Ce{constructor(t,e,n){if(super(),this.type="CubeCamera",!0!==n.isWebGLCubeRenderTarget)return void console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");this.renderTarget=n;const i=new Kn($n,1,t,e);i.layers=this.layers,i.up.set(0,-1,0),i.lookAt(new Lt(1,0,0)),this.add(i);const r=new Kn($n,1,t,e);r.layers=this.layers,r.up.set(0,-1,0),r.lookAt(new Lt(-1,0,0)),this.add(r);const s=new Kn($n,1,t,e);s.layers=this.layers,s.up.set(0,0,1),s.lookAt(new Lt(0,1,0)),this.add(s);const a=new Kn($n,1,t,e);a.layers=this.layers,a.up.set(0,0,-1),a.lookAt(new Lt(0,-1,0)),this.add(a);const o=new Kn($n,1,t,e);o.layers=this.layers,o.up.set(0,-1,0),o.lookAt(new Lt(0,0,1)),this.add(o);const l=new Kn($n,1,t,e);l.layers=this.layers,l.up.set(0,-1,0),l.lookAt(new Lt(0,0,-1)),this.add(l)}update(t,e){null===this.parent&&this.updateMatrixWorld();const n=this.renderTarget,[i,r,s,a,o,l]=this.children,c=t.xr.enabled,h=t.getRenderTarget();t.xr.enabled=!1;const u=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0),t.render(e,i),t.setRenderTarget(n,1),t.render(e,r),t.setRenderTarget(n,2),t.render(e,s),t.setRenderTarget(n,3),t.render(e,a),t.setRenderTarget(n,4),t.render(e,o),n.texture.generateMipmaps=u,t.setRenderTarget(n,5),t.render(e,l),t.setRenderTarget(h),t.xr.enabled=c}}class ei extends bt{constructor(t,e,n,i,s,a,o,l,c,h){super(t=void 0!==t?t:[],e=void 0!==e?e:r,n,i,s,a,o=void 0!==o?o:T,l,c,h),this._needsFlipEnvMap=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}ei.prototype.isCubeTexture=!0;class ni extends Tt{constructor(t,e,n){Number.isInteger(e)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),e=n),super(t,t,e),e=e||{},this.texture=new ei(void 0,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.encoding),this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:g,this.texture._needsFlipEnvMap=!1}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.format=E,this.texture.encoding=e.encoding,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},i=new qn(5,5,5),r=new Jn({name:"CubemapFromEquirect",uniforms:Xn(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const s=new Wn(i,r),a=e.minFilter;e.minFilter===y&&(e.minFilter=g);return new ti(1,10,this).update(t,s),e.minFilter=a,s.geometry.dispose(),s.material.dispose(),this}clear(t,e,n,i){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,n,i);t.setRenderTarget(r)}}ni.prototype.isWebGLCubeRenderTarget=!0;class ii extends bt{constructor(t,e,n,i,r,s,a,o,l,c,h,u){super(null,s,a,o,l,c,i,r,h,u),this.image={data:t||null,width:e||1,height:n||1},this.magFilter=void 0!==l?l:p,this.minFilter=void 0!==c?c:p,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}}ii.prototype.isDataTexture=!0;const ri=new Jt,si=new Lt;class ai{constructor(t=new Ne,e=new Ne,n=new Ne,i=new Ne,r=new Ne,s=new Ne){this.planes=[t,e,n,i,r,s]}set(t,e,n,i,r,s){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(n),a[3].copy(i),a[4].copy(r),a[5].copy(s),this}copy(t){const e=this.planes;for(let n=0;n<6;n++)e[n].copy(t.planes[n]);return this}setFromProjectionMatrix(t){const e=this.planes,n=t.elements,i=n[0],r=n[1],s=n[2],a=n[3],o=n[4],l=n[5],c=n[6],h=n[7],u=n[8],d=n[9],p=n[10],m=n[11],f=n[12],g=n[13],v=n[14],y=n[15];return e[0].setComponents(a-i,h-o,m-u,y-f).normalize(),e[1].setComponents(a+i,h+o,m+u,y+f).normalize(),e[2].setComponents(a+r,h+l,m+d,y+g).normalize(),e[3].setComponents(a-r,h-l,m-d,y-g).normalize(),e[4].setComponents(a-s,h-c,m-p,y-v).normalize(),e[5].setComponents(a+s,h+c,m+p,y+v).normalize(),this}intersectsObject(t){const e=t.geometry;return null===e.boundingSphere&&e.computeBoundingSphere(),ri.copy(e.boundingSphere).applyMatrix4(t.matrixWorld),this.intersectsSphere(ri)}intersectsSprite(t){return ri.center.set(0,0,0),ri.radius=.7071067811865476,ri.applyMatrix4(t.matrixWorld),this.intersectsSphere(ri)}intersectsSphere(t){const e=this.planes,n=t.center,i=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(n)<i)return!1}return!0}intersectsBox(t){const e=this.planes;for(let n=0;n<6;n++){const i=e[n];if(si.x=i.normal.x>0?t.max.x:t.min.x,si.y=i.normal.y>0?t.max.y:t.min.y,si.z=i.normal.z>0?t.max.z:t.min.z,i.distanceToPoint(si)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function oi(){let t=null,e=!1,n=null,i=null;function r(e,s){n(e,s),i=t.requestAnimationFrame(r)}return{start:function(){!0!==e&&null!==n&&(i=t.requestAnimationFrame(r),e=!0)},stop:function(){t.cancelAnimationFrame(i),e=!1},setAnimationLoop:function(t){n=t},setContext:function(e){t=e}}}function li(t,e){const n=e.isWebGL2,i=new WeakMap;return{get:function(t){return t.isInterleavedBufferAttribute&&(t=t.data),i.get(t)},remove:function(e){e.isInterleavedBufferAttribute&&(e=e.data);const n=i.get(e);n&&(t.deleteBuffer(n.buffer),i.delete(e))},update:function(e,r){if(e.isGLBufferAttribute){const t=i.get(e);return void((!t||t.version<e.version)&&i.set(e,{buffer:e.buffer,type:e.type,bytesPerElement:e.elementSize,version:e.version}))}e.isInterleavedBufferAttribute&&(e=e.data);const s=i.get(e);void 0===s?i.set(e,function(e,i){const r=e.array,s=e.usage,a=t.createBuffer();t.bindBuffer(i,a),t.bufferData(i,r,s),e.onUploadCallback();let o=5126;return r instanceof Float32Array?o=5126:r instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):r instanceof Uint16Array?e.isFloat16BufferAttribute?n?o=5131:console.warn("THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2."):o=5123:r instanceof Int16Array?o=5122:r instanceof Uint32Array?o=5125:r instanceof Int32Array?o=5124:r instanceof Int8Array?o=5120:r instanceof Uint8Array&&(o=5121),{buffer:a,type:o,bytesPerElement:r.BYTES_PER_ELEMENT,version:e.version}}(e,r)):s.version<e.version&&(!function(e,i,r){const s=i.array,a=i.updateRange;t.bindBuffer(r,e),-1===a.count?t.bufferSubData(r,0,s):(n?t.bufferSubData(r,a.offset*s.BYTES_PER_ELEMENT,s,a.offset,a.count):t.bufferSubData(r,a.offset*s.BYTES_PER_ELEMENT,s.subarray(a.offset,a.offset+a.count)),a.count=-1)}(s.buffer,e,r),s.version=e.version)}}}class ci extends En{constructor(t=1,e=1,n=1,i=1){super(),this.type="PlaneGeometry",this.parameters={width:t,height:e,widthSegments:n,heightSegments:i};const r=t/2,s=e/2,a=Math.floor(n),o=Math.floor(i),l=a+1,c=o+1,h=t/a,u=e/o,d=[],p=[],m=[],f=[];for(let t=0;t<c;t++){const e=t*u-s;for(let n=0;n<l;n++){const i=n*h-r;
vendor: 1,334 bytes, line 824
824p.push(i,-e,0),m.push(0,0,1),f.push(n/a),f.push(1-t/o)}}for(let t=0;t<o;t++)for(let e=0;e<a;e++){const n=e+l*t,i=e+l*(t+1),r=e+1+l*(t+1),s=e+1+l*t;d.push(n,i,s),d.push(i,r,s)}this.setIndex(d),this.setAttribute("position",new mn(p,3)),this.setAttribute("normal",new mn(m,3)),this.setAttribute("uv",new mn(f,2))}}const hi={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"vec3 transformed = vec3( position );",beginnormal_vertex:"vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",bsdfs:
vendor: 7,835 bytes, line 824
824"vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n#else\n\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t}\n\treturn 1.0;\n#endif\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\n\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\n\treturn Fr * fresnel + F0;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\n\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\treturn specularColor * brdf.x + brdf.y;\n}\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\n\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\n\tvec3 FssEss = F * brdf.x + brdf.y;\n\tfloat Ess = brdf.x + brdf.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie(float roughness, float NoH) {\n\tfloat invAlpha = 1.0 / roughness;\n\tfloat cos2h = NoH * NoH;\n\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\n}\nfloat V_Neubelt(float NoV, float NoL) {\n\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\n}\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 H = normalize( V + L );\n\tfloat dotNH = saturate( dot( N, H ) );\n\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\n}\n#endif"
824,bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color
vendor: 30,775 bytes, line 824
824;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifndef ENVMAP_TYPE_CUBE_UV\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -viewDir, normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tfogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float fogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\n\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\n#ifdef REFLECTIVITY\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#endif\n#ifdef CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheen;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat specularRoughness;\n\tvec3 specularColor;\n#ifdef CLEARCOAT\n\tfloat clearcoat;\n\tfloat clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tvec3 sheenColor;\n#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(
824\t\t0, 1,\t\t0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = ccDotNL * directLight.color;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tccIrradiance *= PI;\n\t\t#endif\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\n\t\t\tmaterial.specularRoughness,\n\t\t\tdirectLight.direction,\n\t\t\tgeometry,\n\t\t\tmaterial.sheenColor\n\t\t);\n\t#else\n\t\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\n\t#endif\n\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef CLEARCOAT\n\t\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\n\t\tfloat ccDotNL = ccDotNV;\n\t\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\n\t#else\n\t\tfloat clearcoatDHR = 0.0;\n\t#endif\n\tfloat clearcoatInv = 1.0 - clearcoatDHR;\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}
824\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\n\t#ifdef CLEARCOAT\n\t\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifndef USE_MORPHNORMALS\n\t\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\t\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );
824\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (
vendor: 10,877 bytes, line 824
824( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t\tf.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];
vendor: 7,258 bytes, line 824
824\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(
824\t1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,\t1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,\t
vendor: 33,369 bytes, line 824
8241.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmissionmap_fragment:"#ifdef USE_TRANSMISSIONMAP\n\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\n#endif",transmissionmap_pars_fragment:"#ifdef USE_TRANSMISSIONMAP\n\tuniform sampler2D transmissionMap;\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",cube_frag:"#include <envmap_common_pars_fragment>\nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include <envmap_fragment>\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",cube_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#ifndef FLAT_SHADED\n\t\tvNormal = normalize( transformedNormal );\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define REFLECTIVITY\n\t#define CLEARCOAT\n\t#define TRANSMISSION\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef TRANSMISSION\n\tuniform float transmission;\n#endif\n#ifdef REFLECTIVITY\n\tuniform float reflectivity;\n#endif\n#ifdef CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheen;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <transmissionmap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#ifdef TRANSMISSION\n\t\tfloat totalTransmission = transmission;\n\t#endif\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <transmissionmap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#ifdef TRANSMISSION\n\t\tdiffuseColor.a *= mix( saturate( 1. - totalTransmission + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) ), 1.0, metalness );\n\t#endif\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",shadow_vert:"#include <common>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}"},
vendor: 590 bytes, line 824
824ui={common:{diffuse:{value:new tn(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new yt},uv2Transform:{value:new yt},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new vt(1,1)}}
vendor: 5,158 bytes, line 824
824,displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new tn(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new tn(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},uvTransform:{value:new yt}},sprite:{diffuse:{value:new tn(15658734)},opacity:{value:1},center:{value:new vt(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},uvTransform:{value:new yt}}},di={basic:{uniforms:Yn([ui.common,ui.specularmap,ui.envmap,ui.aomap,ui.lightmap,ui.fog]),vertexShader:hi.meshbasic_vert,fragmentShader:hi.meshbasic_frag},lambert:{uniforms:Yn([ui.common,ui.specularmap,ui.envmap,ui.aomap,ui.lightmap,ui.emissivemap,ui.fog,ui.lights,{emissive:{value:new tn(0)}}]),vertexShader:hi.meshlambert_vert,fragmentShader:hi.meshlambert_frag},phong:{uniforms:Yn([ui.common,ui.specularmap,ui.envmap,ui.aomap,ui.lightmap,ui.emissivemap,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.fog,ui.lights,{emissive:{value:new tn(0)},specular:{value:new tn(1118481)},shininess:{value:30}}]),vertexShader:hi.meshphong_vert,fragmentShader:hi.meshphong_frag},standard:{uniforms:Yn([ui.common,ui.envmap,ui.aomap,ui.lightmap,ui.emissivemap,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.roughnessmap,ui.metalnessmap,ui.fog,ui.lights,{emissive:{value:new tn(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:hi.meshphysical_vert,fragmentShader:hi.meshphysical_frag},toon:{uniforms:Yn([ui.common,ui.aomap,ui.lightmap,ui.emissivemap,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.gradientmap,ui.fog,ui.lights,{emissive:{value:new tn(0)}}]),vertexShader:hi.meshtoon_vert,fragmentShader:hi.meshtoon_frag},matcap:{uniforms:Yn([ui.common,ui.bumpmap,ui.normalmap,ui.displacementmap,ui.fog,{matcap:{value:null}}]),vertexShader:hi.meshmatcap_vert,fragmentShader:hi.meshmatcap_frag},points:{uniforms:Yn([ui.points,ui.fog]),vertexShader:hi.points_vert,fragmentShader:hi.points_frag},dashed:{uniforms:Yn([ui.common,ui.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:hi.linedashed_vert,fragmentShader:hi.linedashed_frag},depth:{uniforms:Yn([ui.common,ui.displacementmap]),vertexShader:hi.depth_vert,fragmentShader:hi.depth_frag},normal:{uniforms:Yn([ui.common,ui.bumpmap,ui.normalmap,ui.displacementmap,{opacity:{value:1}}]),vertexShader:hi.normal_vert,fragmentShader:hi.normal_frag},sprite:{uniforms:Yn([ui.sprite,ui.fog]),vertexShader:hi.sprite_vert,fragmentShader:hi.sprite_frag},background:{uniforms:{uvTransform:{value:new yt},t2D:{value:null}},vertexShader:hi.background_vert,fragmentShader:hi.background_frag},cube:{uniforms:Yn([ui.envmap,{opacity:{value:1}}]),vertexShader:hi.cube_vert,fragmentShader:hi.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:hi.equirect_vert,fragmentShader:hi.equirect_frag},distanceRGBA:{uniforms:Yn([ui.common,ui.displacementmap,{referencePosition:{value:new Lt},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:hi.distanceRGBA_vert,fragmentShader:hi.distanceRGBA_frag},shadow:{uniforms:Yn([ui.lights,ui.fog,{color:{value:new tn(0)},opacity:{value:1}}]),vertexShader:hi.shadow_vert,fragmentShader:hi.shadow_frag}};function pi(t,e,n,i,r){const s=new tn(0);let a,o,c=0,h=null,u=0,d=null;function p(t,e){n.buffers.color.setClear(t.r,t.g,t.b,e,r)}return{getClearColor:function(){return s},setClearColor:function(t,e=1){s.set(t),c=e,p(s,c)},getClearAlpha:function(){return c},setClearAlpha:function(t){c=t,p(s,c)},render:function(n,r,m,f){let g=!0===r.isScene?r.background:null;g&&g.isTexture&&(g=e.get(g));const v=t.xr,y=v.getSession&&v.getSession();y&&"additive"===y.environmentBlendMode&&(g=null),null===g?p(s,c):g&&g.isColor&&(p(g,1),f=!0),(t.autoClear||f)&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),g&&(g.isCubeTexture||g.mapping===l)?(void 0===o&&(o=new Wn(new qn(1,1,1),new Jn({name:"Backgroun
824dCubeMaterial",uniforms:Xn(di.cube.uniforms),vertexShader:di.cube.vertexShader,fragmentShader:di.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),o.geometry.deleteAttribute("normal"),o.geometry.deleteAttribute("uv"),o.onBeforeRender=function(t,e,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(o.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),i.update(o)),o.material.uniforms.envMap.value=g,o.material.uniforms.flipEnvMap.value=g.isCubeTexture&&g._needsFlipEnvMap?-1:1,h===g&&u===g.version&&d===t.toneMapping||(o.material.needsUpdate=!0,h=g,u=g.version,d=t.toneMapping),n.unshift(o,o.geometry,o.material,0,0,null)):g&&g.isTexture&&(void 0===a&&(a=new Wn(new ci(2,2),new Jn({name:"BackgroundMaterial",uniforms:Xn(di.background.uniforms),vertexShader:di.background.vertexShader,fragmentShader:di.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),a.geometry.deleteAttribute("normal"),Object.defineProperty(a.material,"map",{get:function(){return this.uniforms.t2D.value}}),i.update(a)),a.material.uniforms.t2D.value=g,!0===g.matrixAutoUpdate&&g.updateMatrix(),a.material.uniforms.uvTransform.value.copy(g.matrix),h===g&&u===g.version&&d===t.toneMapping||(a.material.needsUpdate=!0,h=g,u=g.version,d=t.toneMapping),n.unshift(a,a.geometry,a.material,0,0,null))}}}function mi(t,e,n,i){const r=t.getParameter(34921),s=i.isWebGL2?null:e.get("OES_vertex_array_object"),a=i.isWebGL2||null!==s,o={},l=d(null);let c=l;function h(e){return i.isWebGL2?t.bindVertexArray(e):s.bindVertexArrayOES(e)}function u(e){return i.isWebGL2?t.deleteVertexArray(e):s.deleteVertexArrayOES(e)}function d(t){const e=[],n=[],i=[];for(let t=0;t<r;t++)e[t]=0,n[t]=0,i[t]=0;return{geometry:null,program:null,wireframe:!1,newAttributes:e,enabledAttributes:n,attributeDivisors:i,object:t,attributes:{},index:null}}function p(){const t=c.newAttributes;for(let e=0,n=t.length;e<n;e++)t[e]=0}function m(t){f(t,0)}function f(n,r){const s=c.newAttributes,a=c.enabledAttributes,o=c.attributeDivisors;if(s[n]=1,0===a[n]&&(t.enableVertexAttribArray(n),a[n]=1),o[n]!==r){(i.isWebGL2?t:e.get("ANGLE_instanced_arrays"))[i.isWebGL2?"vertexAttribDivisor":"vertexAttribDivisorANGLE"](n,r),o[n]=r}}function g(){const e=c.newAttributes,n=c.enabledAttributes;for(let i=0,r=n.length;i<r;i++)n[i]!==e[i]&&(t.disableVertexAttribArray(i),n[i]=0)}function v(e,n,r,s,a,o){!0!==i.isWebGL2||5124!==r&&5125!==r?t.vertexAttribPointer(e,n,r,s,a,o):t.vertexAttribIPointer(e,n,r,a,o)}function y(){x(),c!==l&&(c=l,h(c.object))}function x(){l.geometry=null,l.program=null,l.wireframe=!1}return{setup:function(r,l,u,y,x){let _=!1;if(a){const e=function(e,n,r){const a=!0===r.wireframe;let l=o[e.id];void 0===l&&(l={},o[e.id]=l);let c=l[n.id];void 0===c&&(c={},l[n.id]=c);let h=c[a];void 0===h&&(h=d(i.isWebGL2?t.createVertexArray():s.createVertexArrayOES()),c[a]=h);return h}(y,u,l);c!==e&&(c=e,h(c.object)),_=function(t,e){const n=c.attributes,i=t.attributes;let r=0;for(const t in i){const e=n[t],s=i[t];if(void 0===e)return!0;if(e.attribute!==s)return!0;if(e.data!==s.data)return!0;r++}return c.attributesNum!==r||c.index!==e}(y,x),_&&function(t,e){const n={},i=t.attributes;let r=0;for(const t in i){const e=i[t],s={};s.attribute=e,e.data&&(s.data=e.data),n[t]=s,r++}c.attributes=n,c.attributesNum=r,c.index=e}(y,x)}else{const t=!0===l.wireframe;c.geometry===y.id&&c.program===u.id&&c.wireframe===t||(c.geometry=y.id,c.program=u.id,c.wireframe=t,_=!0)}!0===r.isInstancedMesh&&(_=!0),null!==x&&n.update(x,34963),_&&(!function(r,s,a,o){if(!1===i.isWebGL2&&(r.isInstancedMesh||o.isInstancedBufferGeometry)&&null===e.get("ANGLE_instanced_arrays"))return;p();const l=o.attributes,c=a.getAttributes(),h=s.defaultAttributeValues;for(const e in c){const i=c[e];if(i>=0){const s=l[e];if(void 0!==s){const e=s.normalized,r=s.itemSize,a=n.get(s);if(void 0===a)continue;const l=a.buffer,c=a.type,h=a.bytesPerElement;if(s.isInterleavedBufferAttribute){const n=s.data,a=n.stride,u=s.offset;n&&n.isInstancedInterleavedBuffer?(f(i,n.meshPerAttribute),void 0===o._maxInstanceCount&&(o._maxInstanceCount=n.meshPerAttribute*n.count)):m(i),t.bindBuffer(34962,l),v(i,r,c,e,a*h,u*h)}else s.isInstancedBufferAttribute?(f(i,s.meshPerAttribute),void 0===o._maxInstanceCount&&(o._maxInstanceCount=s.meshPerAttribute*s.count)):m(i),t.bindBuffer(34962,l),v(i,r,c,e,0,0
vendor: 1,372 bytes, line 824
824)}else if("instanceMatrix"===e){const e=n.get(r.instanceMatrix);if(void 0===e)continue;const s=e.buffer,a=e.type;f(i+0,1),f(i+1,1),f(i+2,1),f(i+3,1),t.bindBuffer(34962,s),t.vertexAttribPointer(i+0,4,a,!1,64,0),t.vertexAttribPointer(i+1,4,a,!1,64,16),t.vertexAttribPointer(i+2,4,a,!1,64,32),t.vertexAttribPointer(i+3,4,a,!1,64,48)}else if("instanceColor"===e){const e=n.get(r.instanceColor);if(void 0===e)continue;const s=e.buffer,a=e.type;f(i,1),t.bindBuffer(34962,s),t.vertexAttribPointer(i,3,a,!1,12,0)}else if(void 0!==h){const n=h[e];if(void 0!==n)switch(n.length){case 2:t.vertexAttrib2fv(i,n);break;case 3:t.vertexAttrib3fv(i,n);break;case 4:t.vertexAttrib4fv(i,n);break;default:t.vertexAttrib1fv(i,n)}}}}g()}(r,l,u,y),null!==x&&t.bindBuffer(34963,n.get(x).buffer))},reset:y,resetDefaultState:x,dispose:function(){y();for(const t in o){const e=o[t];for(const t in e){const n=e[t];for(const t in n)u(n[t].object),delete n[t];delete e[t]}delete o[t]}},releaseStatesOfGeometry:function(t){if(void 0===o[t.id])return;const e=o[t.id];for(const t in e){const n=e[t];for(const t in n)u(n[t].object),delete n[t];delete e[t]}delete o[t.id]},releaseStatesOfProgram:function(t){for(const e in o){const n=o[e];if(void 0===n[t.id])continue;const i=n[t.id];for(const t in i)u(i[t].object),delete i[t];delete n[t.id]}},initAttributes:p,enableAttribute:m,disableUnusedAttributes:g}}
vendor: 20,760 bytes, line 824
824function fi(t,e,n,i){const r=i.isWebGL2;let s;this.setMode=function(t){s=t},this.render=function(e,i){t.drawArrays(s,e,i),n.update(i,s,1)},this.renderInstances=function(i,a,o){if(0===o)return;let l,c;if(r)l=t,c="drawArraysInstanced";else if(l=e.get("ANGLE_instanced_arrays"),c="drawArraysInstancedANGLE",null===l)return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");l[c](s,i,a,o),n.update(a,s,o)}}function gi(t,e,n){let i;function r(e){if("highp"===e){if(t.getShaderPrecisionFormat(35633,36338).precision>0&&t.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";e="mediump"}return"mediump"===e&&t.getShaderPrecisionFormat(35633,36337).precision>0&&t.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&t instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&t instanceof WebGL2ComputeRenderingContext;let a=void 0!==n.precision?n.precision:"highp";const o=r(a);o!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",o,"instead."),a=o);const l=!0===n.logarithmicDepthBuffer,c=t.getParameter(34930),h=t.getParameter(35660),u=t.getParameter(3379),d=t.getParameter(34076),p=t.getParameter(34921),m=t.getParameter(36347),f=t.getParameter(36348),g=t.getParameter(36349),v=h>0,y=s||e.has("OES_texture_float");return{isWebGL2:s,getMaxAnisotropy:function(){if(void 0!==i)return i;if(!0===e.has("EXT_texture_filter_anisotropic")){const n=e.get("EXT_texture_filter_anisotropic");i=t.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else i=0;return i},getMaxPrecision:r,precision:a,logarithmicDepthBuffer:l,maxTextures:c,maxVertexTextures:h,maxTextureSize:u,maxCubemapSize:d,maxAttributes:p,maxVertexUniforms:m,maxVaryings:f,maxFragmentUniforms:g,vertexTextures:v,floatFragmentTextures:y,floatVertexTextures:v&&y,maxSamples:s?t.getParameter(36183):0}}function vi(t){const e=this;let n=null,i=0,r=!1,s=!1;const a=new Ne,o=new yt,l={value:null,needsUpdate:!1};function c(){l.value!==n&&(l.value=n,l.needsUpdate=i>0),e.numPlanes=i,e.numIntersection=0}function h(t,n,i,r){const s=null!==t?t.length:0;let c=null;if(0!==s){if(c=l.value,!0!==r||null===c){const e=i+4*s,r=n.matrixWorldInverse;o.getNormalMatrix(r),(null===c||c.length<e)&&(c=new Float32Array(e));for(let e=0,n=i;e!==s;++e,n+=4)a.copy(t[e]).applyMatrix4(r,o),a.normal.toArray(c,n),c[n+3]=a.constant}l.value=c,l.needsUpdate=!0}return e.numPlanes=s,e.numIntersection=0,c}this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(t,e,s){const a=0!==t.length||e||0!==i||r;return r=e,n=h(t,s,0),i=t.length,a},this.beginShadows=function(){s=!0,h(null)},this.endShadows=function(){s=!1,c()},this.setState=function(e,a,o){const u=e.clippingPlanes,d=e.clipIntersection,p=e.clipShadows,m=t.get(e);if(!r||null===u||0===u.length||s&&!p)s?h(null):c();else{const t=s?0:i,e=4*t;let r=m.clippingState||null;l.value=r,r=h(u,a,e,o);for(let t=0;t!==e;++t)r[t]=n[t];m.clippingState=r,this.numIntersection=d?this.numPlanes:0,this.numPlanes+=t}}}function yi(t){let e=new WeakMap;function n(t,e){return e===a?t.mapping=r:e===o&&(t.mapping=s),t}function i(t){const n=t.target;n.removeEventListener("dispose",i);const r=e.get(n);void 0!==r&&(e.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const s=r.mapping;if(s===a||s===o){if(e.has(r)){return n(e.get(r).texture,r.mapping)}{const s=r.image;if(s&&s.height>0){const a=t.getRenderTarget(),o=new ni(s.height/2);return o.fromEquirectangularTexture(t,r),e.set(r,o),t.setRenderTarget(a),r.addEventListener("dispose",i),n(o.texture,r.mapping)}return null}}}return r},dispose:function(){e=new WeakMap}}}function xi(t){const e={};function n(n){if(void 0!==e[n])return e[n];let i;switch(n){case"WEBGL_depth_texture":i=t.getExtension("WEBGL_depth_texture")||t.getExtension("MOZ_WEBGL_depth_texture")||t.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":i=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":i=t.getExtension("WEBGL_compressed_texture_s3tc")||t.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":i=t.getExtension("WEBGL_compressed_texture_pvrtc")||t.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:i=t.getExtension(n)}return e[n]=i,i}return{has:function(t){return null!==n(t)},init:function(t){t.isWebGL2?n("EXT_color_buffer_float"):(n("WEBGL_depth_texture"),n("OES_texture_float"),n("OES_texture_half_float"),n("OES_texture_half_float_linear"),n("OES_standard_derivatives"),n("OES_element_index_uint"),n("OES_vertex_array_object"),n("ANGLE_instanced_arrays")),n("OES_texture_float_linear"),n("EXT_color_buffer_half_float")},get:function(t){const e=n(t);return null===e&&console.warn("THREE.WebGLRenderer: "+t+" extension not supported."),e}}}function _i(t,e,n,i){const r={},s=new WeakMap;function a(t){const o=t.target;null!==o.index&&e.remove(o.index);for(const t in o.attributes)e.remove(o.attributes[t]);o.removeEventListener("dispose",a),delete r[o.id];const l=s.get(o);l&&(e.remove(l),s.delete(o)),i.releaseStatesOfGeometry(o),!0===o.isInstancedBufferGeometry&&delete o._maxInstanceCount,n.memory.geometries--}function o(t){const n=[],i=t.index,r=t.attributes.position;let a=0;if(null!==i){const t=i.array;a=i.version;for(let e=0,i=t.length;e<i;e+=3){const i=t[e+0],r=t[e+1],s=t[e+2];n.push(i,r,r,s,s,i)}}else{const t=r.array;a=r.version;for(let e=0,i=t.length/3-1;e<i;e+=3){const t=e+0,i=e+1,r=e+2;n.push(t,i,i,r,r,t)}}const o=new(gn(n)>65535?dn:hn)(n,1);o.version=a;const l=s.get(t);l&&e.remove(l),s.set(t,o)}return{get:function(t,e){return!0===r[e.id]||(e.addEventListener("dispose",a),r[e.id]=!0,n.memory.geometries++),e},update:function(t){const n=t.attributes;for(const t in n)e.update(n[t],34962);const i=t.morphAttributes;for(const t in i){const n=i[t];for(let t=0,i=n.length;t<i;t++)e.update(n[t],34962)}},getWireframeAttribute:function(t){const e=s.get(t);if(e){const n=t.index;null!==n&&e.version<n.version&&o(t)}else o(t);return s.get(t)}}}function wi(t,e,n,i){const r=i.isWebGL2;let s,a,o;this.setMode=function(t){s=t},this.setIndex=function(t){a=t.type,o=t.bytesPerElement},this.render=function(e,i){t.drawElements(s,i,a,e*o),n.update(i,s,1)},this.renderInstances=function(i,l,c){if(0===c)return;let h,u;if(r)h=t,u="drawElementsInstanced";else if(h=e.get("ANGLE_instanced_arrays"),u="drawElementsInstancedANGLE",null===h)return void console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");h[u](s,l,a,i*o,c),n.update(l,s,c)}}function bi(t){const e={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:e,programs:null,autoReset:!0,reset:function(){e.frame++,e.calls=0,e.triangles=0,e.points=0,e.lines=0},update:function(t,n,i){switch(e.calls++,n){case 4:e.triangles+=i*(t/3);break;case 1:e.lines+=i*(t/2);break;case 3:e.lines+=i*(t-1);break;case 2:e.lines+=i*t;break;case 0:e.points+=i*t;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",n)}}}}function Mi(t,e){return t[0]-e[0]}function Si(t,e){return Math.abs(e[1])-Math.abs(t[1])}function Ti(t){const e={},n=new Float32Array(8),i=[];for(let t=0;t<8;t++)i[t]=[t,0];return{update:function(r,s,a,o){const l=r.morphTargetInfluences,c=void 0===l?0:l.length;let h=e[s.id];if(void 0===h){h=[];for(let t=0;t<c;t++)h[t]=[t,0];e[s.id]=h}for(let t=0;t<c;t++){const e=h[t];e[0]=t,e[1]=l[t]}h.sort(Si);for(let t=0;t<8;t++)t<c&&h[t][1]?(i[t][0]=h[t][0],i[t][1]=h[t][1]):(i[t][0]=Number.MAX_SAFE_INTEGER,i[t][1]=0);i.sort(Mi);const u=a.morphTargets&&s.morphAttributes.position,d=a.morphNormals&&s.morphAttributes.normal;let p=0;for(let t=0;t<8;t++){const e=i[t],r=e[0],a=e[1];r!==Number.MAX_SAFE_INTEGER&&a?(u&&s.getAttribute("morphTarget"+t)!==u[r]&&s.setAttribute("morphTarget"+t,u[r]),d&&s.getAttribute("morphNormal"+t)!==d[r]&&s.setAttribute("morphNormal"+t,d[r]),n[t]=a,p+=a):(u&&!0===s.hasAttribute("morphTarget"+t)&&s.deleteAttribute("morphTarget"+t),d&&!0===s.hasAttribute("morphNormal"+t)&&s.deleteAttribute("morphNormal"+t),n[t]=0)}const m=s.morphTargetsRelative?1:1-p;o.getUniforms().setValue(t,"morphTargetBaseInfluence",m),o.getUniforms().setValue(t,"morphTargetInfluences",n)}}}function Ei(t,e,n,i){let r=new WeakMap;function s(t){const e=t.target;e.removeEventListener("dispose",s),n.remove(e.instanceMatrix),null!==e.instanceColor&&n.remove(e.instanceColor)}return{update:function(t){const a=i.render.frame,o=t.geometry,l=e.get(t,o);return r.get(l)!==a&&(e.update(l),r.set(l,a)),t.isInstancedMesh&&(!1===t.hasEventListener("dispose",s)&&t.addEventListener("dispose",s),n.update(t.instanceMatrix,34962),null!==t.instanceColor&&n.update(t.instanceColor,34962)),l},dispose:function(){r=new WeakMap}}}di.physical={uniforms:Yn([di.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new vt(1,1)},clearcoatNormalMap:{value:null},sheen:{value:new tn(0)},transmission:{value:0},transmissionMap:{value:null}}]),vertexShader:hi.meshphysical_vert,fragmentShader:hi.meshphysical_frag};class Ai extends bt{constructor(t=null,e=1,n=1,i=1){super(null),this.image={data:t,width:e,height:n,depth:i},this.magFilter=p,this.minFilter=p,this.wrapR=u,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}}Ai.prototype.isDataTexture2DArray=!0;class Li extends bt{constructor(t=null,e=1,n=1,i=1){super(null),this.image={data:t,width:e,height:n,depth:i},this.magFilter=p,this.minFilter=p,this.wrapR=u,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}}Li.prototype.isDataTexture3D=!0;const Ri=new bt,Ci=new Ai,Pi=new Li,Di=new ei,Ii=[],Ni=[],Bi=new Float32Array(16),zi=new Float32Array(9),Fi=new Float32Array(4);function Oi(t,e,n){const i=t[0];if(i<=0||i>0)return t;const r=e*n;let s=Ii[r];if(void 0===s&&(s=new Float32Array(r),Ii[r]=s),0!==e){i.toArray(s,0);for(let i=1,r=0;i!==e;++i)r+=n,t[i].toArray(s,r)}return s}function Hi(t,e){if(t.length!==e.length)return!1;for(let n=0,i=t.length;n<i;n++)if(t[n]!==e[n])return!1;return!0}function Gi(t,e){for(let n=0,i=e.length;n<i;n++)t[n]=e[n]}function Ui(t,e){let n=Ni[e];void 0===n&&(n=new Int32Array(e),Ni[e]=n);for(let i=0;i!==e;++i)n[i]=t.allocateTextureUnit();return n}function ki(t,e){const n=this.cache;n[0]!==e&&(t.uniform1f(this.addr,e),n[0]=e)}function Vi(t,e){const n=this.cache;if(void 0!==e.x)n[0]===e.x&&n[1]===e.y||(t.uniform2f(this.addr,e.x,e.y),n[0]=e.x,n[1]=e.y);else{if(Hi(n,e))return;t.uniform2fv(this.addr,e),Gi(n,e)}}function Wi(t,e){const n=this.cache;if(void 0!==e.x)n[0]===e.x&&n[1]===e.y&&n[2]===e.z||(t.uniform3f(this.addr,e.x,e.y,e.z),n[0]=e.x,n[1]=e.y,n[2]=e.z);else if(void 0!==e.r)n[0]===e.r&&n[1]===e.g&&n[2]===e.b||(t.uniform3f(this.addr,e.r,e.g,e.b),n[0]=e.r,n[1]=e.g,n[2]=e.b);else{if(Hi(n,e))return;t.uniform3fv(this.addr,e),Gi(n,e)}}function ji(t,e){const n=this.cache;if(void 0!==e.x)n[0]===e.x&&n[1]===e.y&&n[2]===e.z&&n[3]===e.w||(t.uniform4f(this.addr,e.x,e.y,e.z,e.w),n[0]=e.x,n[1]=e.y,n[2]=e.z,n[3]=e.w);else{if(Hi(n,e))return;t.uniform4fv(this.addr,e),Gi(n,e)}}function qi(t,e){const n=this.cache,i=e.elements;if(void 0===i){if(Hi(n,e))return;t.uniformMatrix2fv(this.addr,!1,e),Gi(n,e)}else{if(Hi(n,i))return;Fi.set(i),t.uniformMatrix2fv(this.addr,!1,Fi),Gi(n,i)}}function Xi(t,e){const n=this.cache,i=e.elements;if(void 0===i){if(Hi(n,e))return;t.uniformMatrix3fv(this.addr,!1,e),Gi(n,e)}else{if(Hi(n,i))return;zi.set(i),t.uniformMatrix3fv(this.addr,!1,zi),Gi(n,i)}}function Yi(t,e){const n=this.cache,i=e.elements;if(void 0===i){if(Hi(n,e))return;t.uniformMatrix4fv(this.addr,!1,e),Gi(n,e)}else{if(Hi(n,i))return;Bi.set(i),t.uniformMatrix4fv(this.addr,!1,Bi),Gi(n,i)}}function Zi(t,e){const n=this.cache;n[0]!==e&&(t.uniform1i(this.addr,e),n[0]=e)}function Ji(t,e){const n=this.cache;Hi(n,e)||(t.uniform2iv(this.addr,e),Gi(n,e))}function Qi(t,e){const n=this.cache;Hi(n,e)||(t.uniform3iv(this.addr,e),Gi(n,e))}function Ki(t,e){const n=this.cache;Hi(n,e)||(t.uniform4iv(this.addr,e),Gi(n,e))}function $i(t,e){const n=this.cache;n[0]!==e&&(t.uniform1ui(this.addr,e),n[0]=e)}function tr(t,e){const n=this.cache;Hi(n,e)||(t.uniform2uiv(this.addr,e),Gi(n,e))}function er(t,e){const n=this.cache;Hi(n,e)||(t.uniform3uiv(this.addr,e),Gi(n,e))}function nr(t,e){const n=this.cache;Hi(n,e)||(t.uniform4uiv(this.addr,e),Gi(n,e))}function ir(t,e,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(t.uniform1i(this.addr,r),i[0]=r),n.safeSetTexture2D(e||Ri,r)}function rr(t,e,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(t.uniform1i(this.addr,r),i[0]=r),n.setTexture3D(e||Pi,r)}function sr(t,e,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(t.uniform1i(this.addr,r),i[0]=r),n.safeSetTextureCube(e||Di,r)}function ar(t,e,n){const i=this.cache,r=n.allocateTextureUnit();i[0]!==r&&(t.uniform1i(this.addr,r),i[0]=r),n.setTexture2DArray(e||Ci,r)}function or(t,e){t.uniform1fv(this.addr,e)}function lr(t,e){const n=Oi(e,this.size,2);t.uniform2fv(this.addr,n)}function cr(t,e){const n=Oi(e,this.size,3);t.uniform3fv(this.addr,n)}function hr(t,e){const n=Oi(e,this.size,4);t.uniform4fv(this.addr,n)}function ur(t,e){const n=Oi(e,this.size,4);t.uniformMatrix2fv(this.addr,!1,n)}function dr(t,e){const n=Oi(e,this.size,9);t.uniformMatrix3fv(this.addr,!1,n)}function pr(t,e){const n=Oi(e,this.size,16);t.uniformMatrix4fv(this.addr,!1,n)}function mr(t,e){t.uniform1iv(this.addr,e)}function fr(t,e){t.uniform2iv(this.addr,e)}function gr(t,e){t.uniform3iv(this.addr,e)}function vr(t,e){t.uniform4iv(this.addr,e)}function yr(t,e){t.uniform1uiv(this.addr,e)}function xr(t,e){t.uniform2uiv(this.addr,e)}function _r(t,e){t.uniform3uiv(this.addr,e)}function wr(t,e){t.uniform4uiv(this.addr,e)}function br(t,e,n){const i=e.length,r=Ui(n,i);t.uniform1iv(this.addr,r);for(let t=0;t!==i;++t)n.safeSetTexture2D(e[t]||Ri,r[t])}function Mr(t,e,n){const i=e.length,r=Ui(n,i);t.uniform1iv(this.addr,r);for(let t=0;t!==i;++t)n.safeSetTextureCube(e[t]||Di,r[t])}function Sr(t,e,n){this.id=t,this.addr=n,this.cache=[],this.setValue=function(t){switch(t){case 5126:return ki;case 35664:return Vi;case 35665:return Wi;case 35666:return ji;case 35674:return qi;case 35675:return Xi;case 35676:return Yi;case 5124:case 35670:return Zi;case 35667:case 35671:return Ji;case 35668:case 35672:return Qi;case 35669:case 35673:return Ki;case 5125:return $i;case 36294:return tr;case 36295:return er;case 36296:return nr;case 35678:case 36198:case 36298:case 36306:case 35682:return ir;case 35679:case 36299:case 36307:return rr;case 35680:case 36300:case 36308:case 36293:return sr;case 36289:case 36303:case 36311:case 36292:return ar}}(e.type)}function Tr(t,e,n){this.id=t,this.addr=n,this.cache=[],this.size=e.size,this.setValue=function(t){switch(t){case 5126:return or;case 35664:return lr;case 35665:return cr;case 35666:return hr;case 35674:return ur;case 35675:return dr;case 35676:return pr;case 5124:case 35670:return mr;case 35667:case 35671:return fr;case 35668:case 35672:return gr;case 35669:case 35673:return vr;case 5125:return yr;case 36294:return xr;case 36295:return _r;case 36296:return wr;case 35678:case 36198:case 36298:case 36306:case 35682:return br;case 35680:case 36300:case 36308:case 36293:return Mr}}(e.type)}function Er(t){this.id=t,this.seq=[],this.map={}}Tr.prototype.updateCache=function(t){const e=this.cache;t instanceof Float32Array&&e.length!==t.length&&(this.cache=new Float32Array(t.length)),Gi(e,t)},Er.prototype.setValue=function(t,e,n){const i=this.seq;for(let r=0,s=i.length;r!==s;++r){const s=i[r];s.setValue(t,e[s.id],n)}};const Ar=/(\w+)(\])?(\[|\.)?/g;function Lr(t,e){t.seq.push(e),t.map[e.id]=e}function Rr(t,e,n){const i=t.name,r=i.length;for(Ar.lastIndex=0;;){const s=Ar.exec(i),a=Ar.lastIndex;let o=s[1];const l="]"===s[2],c=s[3];if(l&&(o|=0),void 0===c||"["===c&&a+2===r){Lr(n,void 0===c?new Sr(o,t,e):new Tr(o,t,e));break}{let t=n.map[o];void 0===t&&(t=new Er(o),Lr(n,t)),n=t}}}function Cr(t,e){this.seq=[],this.map={};const n=t.getProgramParameter(e,35718);for(let i=0;i<n;++i){const n=t.getActiveUniform(e,i);Rr(n,t.getUniformLocation(e,n.name),this)}}function Pr(t,e,n){const i=t.createShader(e);return t.shaderSource(i,n),t.compileShader(i),i}Cr.prototype.setValue=function(t,e,n,i){const r=this.map[e];void 0!==r&&r.setValue(t,n,i)},Cr.prototype.setOptional=function(t,e,n){const i=e[n];void 0!==i&&this.setValue(t,n,i)},Cr.upload=function(t,e,n,i){for(let r=0,s=e.length;r!==s;++r){const s=e[r],a=n[s.id];!1!==a.needsUpdate&&s.setValue(t,a.value,i)}},Cr.seqWithValue=function(t,e){const n=[];for(let i=0,r=t.length;i!==r;++i){const r=t[i];r.id in e&&n.push(r)}return n};let Dr=0;function Ir(t){switch(t){case X:return["Linear","( value )"];case Y:return["sRGB","( value )"];case J:return["RGBE","( value )"];case Q:return["RGBM","( value, 7.0 )"];case K:return["RGBM","( value, 16.0 )"];case $:return["RGBD","( value, 256.0 )"];case Z:return["Gamma","( value, float( GAMMA_FACTOR ) )"];case 3003:return["LogLuv","( value )"];default:return console.warn("THREE.WebGLProgram: Unsupported encoding:",t),["Linear","( value )"]}}function Nr(t,e,n){const i=t.getShaderParameter(e,35713),r=t.getShaderInfoLog(e).trim();if(i&&""===r)return"";return"THREE.WebGLShader: gl.getShaderInfoLog() "+n+"\n"+r+function(t){const e=t.split("\n");for(let t=0;t<e.length;t++)e[t]=t+1+": "+e[t];return e.join("\n")}(t.getShaderSource(e))}function Br(t,e){const n=Ir(e);return"vec4 "+t+"( vec4 value ) { return "+n[0]+"ToLinear"+n[1]+"; }"}function zr(t,e){const n=Ir(e);return"vec4 "+t+"( vec4 value ) { return LinearTo"+n[0]+n[1]+"; }"}function Fr(t,e){let n;switch(e){case 1:n="Linear";break;case 2:n="Reinhard";break;case 3:n="OptimizedCineon";break;case 4:n="ACESFilmic";break;case 5:n="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",e),n="Linear"}return"vec3 "+t+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}function Or(t){return""!==t}function Hr(t,e){return t.replace(/NUM_DIR_LIGHTS/g,e.numDirLights).replace(/NUM_SPOT_LIGHTS/g,e.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,e.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,e.numPointLights).replace(/NUM_HEMI_LIGHTS/g,e.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,e.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS/g,e.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,e.numPointLightShadows)}function Gr(t,e){return t.replace(/NUM_CLIPPING_PLANES/g,e.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,e.numClippingPlanes-e.numClipIntersection)}const Ur=/^[ \t]*#include +<([\w\d./]+)>/gm;function kr(t){return t.replace(Ur,Vr)}function Vr(t,e){const n=hi[e];if(void 0===n)throw new Error("Can not resolve #include <"+e+">");return kr(n)}const Wr=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,jr=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function qr(t){return t.replace(jr,Yr).replace(Wr,Xr)}function Xr(t,e,n,i){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),Yr(t,e,n,i)}function Yr(t,e,n,i){let r="";for(let t=parseInt(e);t<parseInt(n);t++)r+=i.replace(/\[\s*i\s*\]/g,"[ "+t+" ]").replace(/UNROLLED_LOOP_INDEX/g,t);return r}function Zr(t){let e="precision "+t.precision+" float;\nprecision "+t.precision+" int;";return"highp"===t.precision?e+="\n#define HIGH_PRECISION":"mediump"===t.precision?e+="\n#define MEDIUM_PRECISION":"lowp"===t.precision&&(e+="\n#define LOW_PRECISION"),e}function Jr(t,e,n,i){const a=t.getContext(),o=n.defines;let h=n.vertexShader,u=n.fragmentShader;const d=function(t){let e="SHADOWMAP_TYPE_BASIC";return 1===t.shadowMapType?e="SHADOWMAP_TYPE_PCF":2===t.shadowMapType?e="SHADOWMAP_TYPE_PCF_SOFT":3===t.shadowMapType&&(e="SHADOWMAP_TYPE_VSM"),e}(n),p=function(t){let e="ENVMAP_TYPE_CUBE";if(t.envMap)switch(t.envMapMode){case r:case s:e="ENVMAP_TYPE_CUBE";break;case l:case c:e="ENVMAP_TYPE_CUBE_UV"}return e}(n),m=function(t){let e="ENVMAP_MODE_REFLECTION";if(t.envMap)switch(t.envMapMode){case s:case c:e="ENVMAP_MODE_REFRACTION"}return e}(n),f=function(t){let e="ENVMAP_BLENDING_NONE";if(t.envMap)switch(t.combine){case 0:e="ENVMAP_BLENDING_MULTIPLY";break;case 1:e="ENVMAP_BLENDING_MIX";break;case 2:e="ENVMAP_BLENDING_ADD"}return e}(n),g=t.gammaFactor>
vendor: 12,022 bytes, line 824
8240?t.gammaFactor:1,v=n.isWebGL2?"":function(t){return[t.extensionDerivatives||t.envMapCubeUV||t.bumpMap||t.tangentSpaceNormalMap||t.clearcoatNormalMap||t.flatShading||"physical"===t.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(t.extensionFragDepth||t.logarithmicDepthBuffer)&&t.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",t.extensionDrawBuffers&&t.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(t.extensionShaderTextureLOD||t.envMap)&&t.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Or).join("\n")}(n),y=function(t){const e=[];for(const n in t){const i=t[n];!1!==i&&e.push("#define "+n+" "+i)}return e.join("\n")}(o),x=a.createProgram();let _,w,b=n.glslVersion?"#version "+n.glslVersion+"\n":"";n.isRawShaderMaterial?(_=[y].filter(Or).join("\n"),_.length>0&&(_+="\n"),w=[v,y].filter(Or).join("\n"),w.length>0&&(w+="\n")):(_=[Zr(n),"#define SHADER_NAME "+n.shaderName,y,n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+g,"#define MAX_BONES "+n.maxBones,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+m:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.displacementMap&&n.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.useVertexTexture?"#define BONE_TEXTURE":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+d:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Or).join("\n"),w=[v,Zr(n),"#define SHADER_NAME "+n.shaderName,y,n.alphaTest?"#define ALPHATEST "+n.alphaTest+(n.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+g,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+p:"",n.envMap?"#define "+m:"",n.envMap?"#define "+f:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMap&&n.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",n.normalMap&&n.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.sheen?"#define USE_SHEEN":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.vertexTangents?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUvs?"#define USE_UV":"",n.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+d:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.logarithmicDepthBuffer&&n.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(n.extensionShaderTextureLOD||n.envMap)&&n.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==n.toneMapping?"#define TONE_MAPPING":"",0!==n.toneMapping?hi.tonemapping_pars_fragment:"",0!==n.toneMapping?Fr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",hi.encodings_pars_fragment,n.map?Br("mapTexelToLinear",n.mapEncoding):"",n.matcap?Br("matcapTexelToLinear",n.matcapEncoding):"",n.envMap?Br("envMapTexelToLinear",n.envMapEncoding):"",n.emissiveMap?Br("emissiveMapTexelToLinear",n.emissiveMapEncoding):"",n.lightMap?Br("lightMapTexelToLinear",n.lightMapEncoding):"",zr("linearToOutputTexel",n.outputEncoding),n.depthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Or).join("\n")),h=kr(h),h=Hr(h,n),h=Gr(h,n),u=kr(u),u=Hr(u,n),u=Gr(u,n),h=qr(h),u=qr(u),n.isWebGL2&&!0!==n.isRawShaderMaterial&&(b="#version 300 es\n",_=["#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,w=["#define varying in",n.glslVersion===it?"":"out highp vec4 pc_fragColor;",n.glslVersion===it?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+w);const M=b+w+u,S=Pr(a,35633,b+_+h),T=Pr(a,35632,M);if(a.attachShader(x,S),a.attachShader(x,T),void 0!==n.index0AttributeName?a.bindAttribLocation(x,0,n.index0AttributeName):!0===n.morphTargets&&a.bindAttribLocation(x,0,"position"),a.linkProgram(x),t.debug.checkShaderErrors){const t=a.getProgramInfoLog(x).trim(),e=a.getShaderInfoLog(S).trim(),n=a.getShaderInfoLog(T).trim();let i=!0,r=!0;if(!1===a.getProgramParameter(x,35714)){i=!1;const e=Nr(a,S,"vertex"),n=Nr(a,T,"fragment");console.error("THREE.WebGLProgram: shader error: ",a.getError(),"35715",a.getProgramParameter(x,35715),"gl.getProgramInfoLog",t,e,n)}else""!==t?console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",t):""!==e&&""!==n||(r=!1);r&&(this.diagnostics={runnable:i,programLog:t,vertexShader:{log:e,prefix:_},fragmentShader:{log:n,prefix:w}})}let E,A;return a.deleteShader(S),a.deleteShader(T),this.getUniforms=function(){return void 0===E&&(E=new Cr(a,x)),E},this.getAttributes=function(){return void 0===A&&(A=function(t,e){const n={},i=t.getProgramParameter(e,35721);for(let r=0;r<i;r++){const i=t.getActiveAttrib(e,r).name;n[i]=t.getAttribLocation(e,i)}return n}(a,x)),A},this.destroy=function(){i.releaseStatesOfProgram(this),a.deleteProgram(x),this.program=void 0},this.name=n.shaderName,this.id=Dr++,this.cacheKey=e,this.usedTimes=1,this.program=x,this.vertexShader=S,this.fragmentShader=T,this}function Qr(t,e,n,i,r,s){const a=[],o=i.isWebGL2,h=i.logarithmicDepthBuffer,u=i.floatVertexTextures,d=i.maxVertexUniforms,p=i.vertexTextures;let m=i.precision;const f={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},g=["precision","isWebGL2","supportsVertexTextures","outputEncoding","instancing","instancingColor","map","mapEncoding","matcap","matcapEncoding","envMap","envMapMode","envMapEncoding","envMapCubeUV","lightMap","lightMapEncoding","aoMap","emissiveMap","emissiveMapEncoding","bumpMap","normalMap","objectSpaceNormalMap","tangentSpaceNormalMap","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","displacementMap","specularMap","roughnessMap","metalnessMap","gradientMap","alphaMap","combine","vertexColors","vertexAlphas","vertexTangents","vertexUvs","uvsVertexOnly","fog","useFog","fogExp2","flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning","maxBones","useVertexTexture","morphTargets","morphNormals","premultipliedAlpha","numDirLights","numPointLights","numSpotLights","numHemiLights","numRectAreaLights","numDirLightShadows","numPointLightShadows","numSpotLightShadows","shadowMapEnabled","shadowMapType","toneMapping","physicallyCorrectLights","alphaTest","doubleSided","flipSided","numClippingPlanes","numClipIntersection","depthPacking","dithering","sheen","transmissionMap"];function v(t){let e;return t&&t.isTexture?e=t.encoding:t&&t.isWebGLRenderTarget?(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),e=t.texture.encoding):e=X,e}return{getParameters:function(r,a,g,y,x){const _=y.fog,w=r.isMeshStandardMaterial?y.environment:null,b=e.get(r.envMap||w),M=f[r.type],S=x.isSkinnedMesh?function(t){const e=t.skeleton.bones;if(u)return 1024;{const t=d,n=Math.floor((t-20)/4),i=Math.min(n,e.length);return i<e.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+e.length+" bones. This GPU supports "+i+"."),0):i}}(x):0;let T,E;if(null!==r.precision&&(m=i.getMaxPrecision(r.precision),m!==r.precision&&console.warn("THREE.WebGLProgram.getParameters:",r.precision,"not supported, using",m,"instead.")),M){const t=di[M];T=t.vertexShader,E=t.fragmentShader}else T=r.vertexShader,E=r.fragmentShader;const A=t.getRenderTarget();return{isWebGL2:o,shaderID:M,shaderName:r.type,vertexShader:T,fragmentShader:E,defines:r.defines,isRawShaderMaterial:!0===r.isRawShaderMaterial,glslVersion:r.glslVersion,precision:m,instancing:!0===x.isInstancedMesh,instancingColor:!0===x.isInstancedMesh&&null!==x.instanceColor,supportsVertexTextures:p,outputEncoding:null!==A?v(A.texture):t.outputEncoding,map:!!r.map,mapEncoding:v(r.map),matcap:!!r.matcap,matc
vendor: 4,768 bytes, line 824
824apEncoding:v(r.matcap),envMap:!!b,envMapMode:b&&b.mapping,envMapEncoding:v(b),envMapCubeUV:!!b&&(b.mapping===l||b.mapping===c),lightMap:!!r.lightMap,lightMapEncoding:v(r.lightMap),aoMap:!!r.aoMap,emissiveMap:!!r.emissiveMap,emissiveMapEncoding:v(r.emissiveMap),bumpMap:!!r.bumpMap,normalMap:!!r.normalMap,objectSpaceNormalMap:1===r.normalMapType,tangentSpaceNormalMap:0===r.normalMapType,clearcoatMap:!!r.clearcoatMap,clearcoatRoughnessMap:!!r.clearcoatRoughnessMap,clearcoatNormalMap:!!r.clearcoatNormalMap,displacementMap:!!r.displacementMap,roughnessMap:!!r.roughnessMap,metalnessMap:!!r.metalnessMap,specularMap:!!r.specularMap,alphaMap:!!r.alphaMap,gradientMap:!!r.gradientMap,sheen:!!r.sheen,transmissionMap:!!r.transmissionMap,combine:r.combine,vertexTangents:r.normalMap&&r.vertexTangents,vertexColors:r.vertexColors,vertexAlphas:!0===r.vertexColors&&x.geometry&&x.geometry.attributes.color&&4===x.geometry.attributes.color.itemSize,vertexUvs:!!(r.map||r.bumpMap||r.normalMap||r.specularMap||r.alphaMap||r.emissiveMap||r.roughnessMap||r.metalnessMap||r.clearcoatMap||r.clearcoatRoughnessMap||r.clearcoatNormalMap||r.displacementMap||r.transmissionMap),uvsVertexOnly:!(r.map||r.bumpMap||r.normalMap||r.specularMap||r.alphaMap||r.emissiveMap||r.roughnessMap||r.metalnessMap||r.clearcoatNormalMap||r.transmissionMap||!r.displacementMap),fog:!!_,useFog:r.fog,fogExp2:_&&_.isFogExp2,flatShading:!!r.flatShading,sizeAttenuation:r.sizeAttenuation,logarithmicDepthBuffer:h,skinning:r.skinning&&S>0,maxBones:S,useVertexTexture:u,morphTargets:r.morphTargets,morphNormals:r.morphNormals,numDirLights:a.directional.length,numPointLights:a.point.length,numSpotLights:a.spot.length,numRectAreaLights:a.rectArea.length,numHemiLights:a.hemi.length,numDirLightShadows:a.directionalShadowMap.length,numPointLightShadows:a.pointShadowMap.length,numSpotLightShadows:a.spotShadowMap.length,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:r.dithering,shadowMapEnabled:t.shadowMap.enabled&&g.length>0,shadowMapType:t.shadowMap.type,toneMapping:r.toneMapped?t.toneMapping:0,physicallyCorrectLights:t.physicallyCorrectLights,premultipliedAlpha:r.premultipliedAlpha,alphaTest:r.alphaTest,doubleSided:2===r.side,flipSided:1===r.side,depthPacking:void 0!==r.depthPacking&&r.depthPacking,index0AttributeName:r.index0AttributeName,extensionDerivatives:r.extensions&&r.extensions.derivatives,extensionFragDepth:r.extensions&&r.extensions.fragDepth,extensionDrawBuffers:r.extensions&&r.extensions.drawBuffers,extensionShaderTextureLOD:r.extensions&&r.extensions.shaderTextureLOD,rendererExtensionFragDepth:o||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:o||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:o||n.has("EXT_shader_texture_lod"),customProgramCacheKey:r.customProgramCacheKey()}},getProgramCacheKey:function(e){const n=[];if(e.shaderID?n.push(e.shaderID):(n.push(e.fragmentShader),n.push(e.vertexShader)),void 0!==e.defines)for(const t in e.defines)n.push(t),n.push(e.defines[t]);if(!1===e.isRawShaderMaterial){for(let t=0;t<g.length;t++)n.push(e[g[t]]);n.push(t.outputEncoding),n.push(t.gammaFactor)}return n.push(e.customProgramCacheKey),n.join()},getUniforms:function(t){const e=f[t.type];let n;if(e){const t=di[e];n=Zn.clone(t.uniforms)}else n=t.uniforms;return n},acquireProgram:function(e,n){let i;for(let t=0,e=a.length;t<e;t++){const e=a[t];if(e.cacheKey===n){i=e,++i.usedTimes;break}}return void 0===i&&(i=new Jr(t,n,e,r),a.push(i)),i},releaseProgram:function(t){if(0==--t.usedTimes){const e=a.indexOf(t);a[e]=a[a.length-1],a.pop(),t.destroy()}},programs:a}}function Kr(){let t=new WeakMap;return{get:function(e){let n=t.get(e);return void 0===n&&(n={},t.set(e,n)),n},remove:function(e){t.delete(e)},update:function(e,n,i){t.get(e)[n]=i},dispose:function(){t=new WeakMap}}}function $r(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.program!==e.program?t.program.id-e.program.id:t.material.id!==e.material.id?t.material.id-e.material.id:t.z!==e.z?t.z-e.z:t.id-e.id}function ts(t,e){return t.groupOrder!==e.groupOrder?t.groupOrder-e.groupOrder:t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.z!==e.z?e.z-t.z:t.id-e.id}function es(t){const e=[];let n=0;const i=[],r=[],s={id:-1};function a(i,r,a,o,l,c){let h=e[n];const u=t.get(a);return void 0===h?(h={id:i.id,object:i,geometry:r,material:a,program:u.program||s,groupOrder:o,renderOrder:i.renderOrder,z:l,group:c},e[n]=h):(h.id=i.id,h.object=i,h.geometry=r,h.material=a,h.program=u.program||s,h.groupOrder=o,h.renderOrder=i.renderOrder,h.z=l,h.group=c),n++,h}return{opaque:i,transparent:r,init:function(){n=0,i.length=0,r.length=0},push:function(t,e,n,s,o,l){const c=a(t,e,n,s,o,l);
vendor: 8,965 bytes, line 824
824(!0===n.transparent?r:i).push(c)},unshift:function(t,e,n,s,o,l){const c=a(t,e,n,s,o,l);(!0===n.transparent?r:i).unshift(c)},finish:function(){for(let t=n,i=e.length;t<i;t++){const n=e[t];if(null===n.id)break;n.id=null,n.object=null,n.geometry=null,n.material=null,n.program=null,n.group=null}},sort:function(t,e){i.length>1&&i.sort(t||$r),r.length>1&&r.sort(e||ts)}}}function ns(t){let e=new WeakMap;return{get:function(n,i){let r;return!1===e.has(n)?(r=new es(t),e.set(n,[r])):i>=e.get(n).length?(r=new es(t),e.get(n).push(r)):r=e.get(n)[i],r},dispose:function(){e=new WeakMap}}}function is(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let n;switch(e.type){case"DirectionalLight":n={direction:new Lt,color:new tn};break;case"SpotLight":n={position:new Lt,direction:new Lt,color:new tn,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":n={position:new Lt,color:new tn,distance:0,decay:0};break;case"HemisphereLight":n={direction:new Lt,skyColor:new tn,groundColor:new tn};break;case"RectAreaLight":n={color:new tn,position:new Lt,halfWidth:new Lt,halfHeight:new Lt}}return t[e.id]=n,n}}}let rs=0;function ss(t,e){return(e.castShadow?1:0)-(t.castShadow?1:0)}function as(t,e){const n=new is,i=function(){const t={};return{get:function(e){if(void 0!==t[e.id])return t[e.id];let n;switch(e.type){case"DirectionalLight":case"SpotLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt};break;case"PointLight":n={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt,shadowCameraNear:1,shadowCameraFar:1e3}}return t[e.id]=n,n}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};for(let t=0;t<9;t++)r.probe.push(new Lt);const s=new Lt,a=new se,o=new se;return{setup:function(s){let a=0,o=0,l=0;for(let t=0;t<9;t++)r.probe[t].set(0,0,0);let c=0,h=0,u=0,d=0,p=0,m=0,f=0,g=0;s.sort(ss);for(let t=0,e=s.length;t<e;t++){const e=s[t],v=e.color,y=e.intensity,x=e.distance,_=e.shadow&&e.shadow.map?e.shadow.map.texture:null;if(e.isAmbientLight)a+=v.r*y,o+=v.g*y,l+=v.b*y;else if(e.isLightProbe)for(let t=0;t<9;t++)r.probe[t].addScaledVector(e.sh.coefficients[t],y);else if(e.isDirectionalLight){const t=n.get(e);if(t.color.copy(e.color).multiplyScalar(e.intensity),e.castShadow){const t=e.shadow,n=i.get(e);n.shadowBias=t.bias,n.shadowNormalBias=t.normalBias,n.shadowRadius=t.radius,n.shadowMapSize=t.mapSize,r.directionalShadow[c]=n,r.directionalShadowMap[c]=_,r.directionalShadowMatrix[c]=e.shadow.matrix,m++}r.directional[c]=t,c++}else if(e.isSpotLight){const t=n.get(e);if(t.position.setFromMatrixPosition(e.matrixWorld),t.color.copy(v).multiplyScalar(y),t.distance=x,t.coneCos=Math.cos(e.angle),t.penumbraCos=Math.cos(e.angle*(1-e.penumbra)),t.decay=e.decay,e.castShadow){const t=e.shadow,n=i.get(e);n.shadowBias=t.bias,n.shadowNormalBias=t.normalBias,n.shadowRadius=t.radius,n.shadowMapSize=t.mapSize,r.spotShadow[u]=n,r.spotShadowMap[u]=_,r.spotShadowMatrix[u]=e.shadow.matrix,g++}r.spot[u]=t,u++}else if(e.isRectAreaLight){const t=n.get(e);t.color.copy(v).multiplyScalar(y),t.halfWidth.set(.5*e.width,0,0),t.halfHeight.set(0,.5*e.height,0),r.rectArea[d]=t,d++}else if(e.isPointLight){const t=n.get(e);if(t.color.copy(e.color).multiplyScalar(e.intensity),t.distance=e.distance,t.decay=e.decay,e.castShadow){const t=e.shadow,n=i.get(e);n.shadowBias=t.bias,n.shadowNormalBias=t.normalBias,n.shadowRadius=t.radius,n.shadowMapSize=t.mapSize,n.shadowCameraNear=t.camera.near,n.shadowCameraFar=t.camera.far,r.pointShadow[h]=n,r.pointShadowMap[h]=_,r.pointShadowMatrix[h]=e.shadow.matrix,f++}r.point[h]=t,h++}else if(e.isHemisphereLight){const t=n.get(e);t.skyColor.copy(e.color).multiplyScalar(y),t.groundColor.copy(e.groundColor).multiplyScalar(y),r.hemi[p]=t,p++}}d>0&&(e.isWebGL2||!0===t.has("OES_texture_float_linear")?(r.rectAreaLTC1=ui.LTC_FLOAT_1,r.rectAreaLTC2=ui.LTC_FLOAT_2):!0===t.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=ui.LTC_HALF_1,r.rectAreaLTC2=ui.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=a,r.ambient[1]=o,r.ambient[2]=l;const v=r.hash;v.directionalLength===c&&v.pointLength===h&&v.spotLength===u&&v.rectAreaLength===d&&v.hemiLength===p&&v.numDirectionalShadows===m&&v.numPointShadows===f&&v.numSpotShadows===g||(r.directional.length=c,r.spot.length=u,r.rectArea.length=d,r.point.length=h,r.hemi.length=p,r.directionalShadow.length=m,r.directionalShadowMap.length=m,r.pointShadow.length=f,r.pointShadowMap.length=f,r.spotShadow.length=g,r.spotShadowMap.length=g,r.directionalShadowMatrix.length=m,r.pointShadowMatrix.length=f,r.spotShadowMatrix.length=g,v.directionalLength=c,v.pointLength=h,v.spotLength=u,v.rectAreaLength=d,v.hemiLength=p,v.numDirectionalShadows=m,v.numPointShadows=f,v.numSpotShadows=g,r.version=rs++)},setupView:function(t,e){let n=0,i=0,l=0,c=0,h=0;const u=e.matrixWorldInverse;for(let e=0,d=t.length;e<d;e++){const d=t[e];if(d.isDirectionalLight){const t=r.directional[n];t.direction.setFromMatrixPosition(d.matrixWorld),s.setFromMatrixPosition(d.target.matrixWorld),t.direction.sub(s),t.direction.transformDirection(u),n++}else if(d.isSpotLight){const t=r.spot[l];t.position.setFromMatrixPosition(d.matrixWorld),t.position.applyMatrix4(u),t.direction.setFromMatrixPosition(d.matrixWorld),s.setFromMatrixPosition(d.target.matrixWorld),t.direction.sub(s),t.direction.transformDirection(u),l++}else if(d.isRectAreaLight){const t=r.rectArea[c];t.position.setFromMatrixPosition(d.matrixWorld),t.position.applyMatrix4(u),o.identity(),a.copy(d.matrixWorld),a.premultiply(u),o.extractRotation(a),t.halfWidth.set(.5*d.width,0,0),t.halfHeight.set(0,.5*d.height,0),t.halfWidth.applyMatrix4(o),t.halfHeight.applyMatrix4(o),c++}else if(d.isPointLight){const t=r.point[i];t.position.setFromMatrixPosition(d.matrixWorld),t.position.applyMatrix4(u),i++}else if(d.isHemisphereLight){const t=r.hemi[h];t.direction.setFromMatrixPosition(d.matrixWorld),t.direction.transformDirection(u),t.direction.normalize(),h++}}},state:r}}function os(t,e){const n=new as(t,e),i=[],r=[];return{init:function(){i.length=0,r.length=0},state:{lightsArray:i,shadowsArray:r,lights:n},setupLights:function(){n.setup(i)},setupLightsView:function(t){n.setupView(i,t)},pushLight:function(t){i.push(t)},pushShadow:function(t){r.push(t)}}}function ls(t,e){let n=new WeakMap;return{get:function(i,r=0){let s;return!1===n.has(i)?(s=new os(t,e),n.set(i,[s])):r>=n.get(i).length?(s=new os(t,e),n.get(i).push(s)):s=n.get(i)[r],s},dispose:function(){n=new WeakMap}}}class cs extends Xe{constructor(t){super(),this.type="MeshDepthMaterial",this.depthPacking=3200,this.skinning=!1,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}cs.prototype.isMeshDepthMaterial=!0;class hs extends Xe{constructor(t){super(),this.type="MeshDistanceMaterial",this.referencePosition=new Lt,this.nearDistance=1,this.farDistance=1e3,this.skinning=!1,this.morphTargets=!1,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.setValues(t)}copy(t){return super.copy(t),this.referencePosition.copy(t.referencePosition),this.nearDistance=t.nearDistance,this.farDistance=t.farDistance,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}hs.prototype.isMeshDistanceMaterial=!0;function us(t,e,n){let i=new ai;const r=new vt,s=new vt,a=new St,o=[],l=[],c={},h=n.maxTextureSize,u={0:1,1:0,2:2},d=new Jn({defines:{SAMPLE_RATE:2/8,HALF_SAMPLE_RATE:1/8},uniforms:{shadow_pass:{value:null},resolution:{value:new vt},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );
824\n\tfor ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean * HALF_SAMPLE_RATE;\n\tsquared_mean = squared_mean * HALF_SAMPLE_RATE;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),m=d.clone();m.defines.HORIZONTAL_PASS=1;const f=new En;f.setAttribute("position",new sn(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const v=new Wn(f,d),y=this;function x(n,i){const r=e.update(v);d.uniforms.shadow_pass.value=n.map.texture,d.uniforms.resolution.value=n.mapSize,d.uniforms.radius.value=n.radius,t.setRenderTarget(n.mapPass),t.clear(),t.renderBufferDirect(i,null,r,d,v,null),m.uniforms.shadow_pass.value=n.mapPass.texture,m.uniforms.resolution.value=n.mapSize,m.uniforms.radius.value=n.radius,t.setRenderTarget(n.map),t.clear(),t.renderBufferDirect(i,null,r,m,v,null)}function _(t,e,n){const i=t<<0|e<<1|n<<2;let r=o[i];return void 0===r&&(r=new cs({depthPacking:3201,morphTargets:t,skinning:e}),o[i]=r),r}function w(t,e,n){const i=t<<0|e<<1|n<<2;let r=l[i];return void 0===r&&(r=new hs({morphTargets:t,skinning:e}),l[i]=r),r}function b(e,n,i,r,s,a,o){let l=null,h=_,d=e.customDepthMaterial;if(!0===r.isPointLight&&(h=w,d=e.customDistanceMaterial),void 0===d){let t=!1;!0===i.morphTargets&&(t=n.morphAttributes&&n.morphAttributes.position&&n.morphAttributes.position.length>0);let r=!1;!0===e.isSkinnedMesh&&(!0===i.skinning?r=!0:console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",e));l=h(t,r,!0===e.isInstancedMesh)}else l=d;if(t.localClippingEnabled&&!0===i.clipShadows&&0!==i.clippingPlanes.length){const t=l.uuid,e=i.uuid;let n=c[t];void 0===n&&(n={},c[t]=n);let r=n[e];void 0===r&&(r=l.clone(),n[e]=r),l=r}return l.visible=i.visible,l.wireframe=i.wireframe,l.side=3===o?null!==i.shadowSide?i.shadowSide:i.side:null!==i.shadowSide?i.shadowSide:u[i.side],l.clipShadows=i.clipShadows,l.clippingPlanes=i.clippingPlanes,l.clipIntersection=i.clipIntersection,l.wireframeLinewidth=i.wireframeLinewidth,l.linewidth=i.linewidth,!0===r.isPointLight&&!0===l.isMeshDistanceMaterial&&(l.referencePosition.setFromMatrixPosition(r.matrixWorld),l.nearDistance=s,l.farDistance=a),l}function M(n,r,s,a,o){if(!1===n.visible)return;if(n.layers.test(r.layers)&&(n.isMesh||n.isLine||n.isPoints)&&(n.castShadow||n.receiveShadow&&3===o)&&(!n.frustumCulled||i.intersectsObject(n))){n.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,n.matrixWorld);const i=e.update(n),r=n.material;if(Array.isArray(r)){const e=i.groups;for(let l=0,c=e.length;l<c;l++){const c=e[l],h=r[c.materialIndex];if(h&&h.visible){const e=b(n,i,h,a,s.near,s.far,o);t.renderBufferDirect(s,null,i,e,n,c)}}}else if(r.visible){const e=b(n,i,r,a,s.near,s.far,o);t.renderBufferDirect(s,null,i,e,n,null)}}const l=n.children;for(let t=0,e=l.length;t<e;t++)M(l[t],r,s,a,o)}this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=1,this.render=function(e,n,o){if(!1===y.enabled)return;if(!1===y.autoUpdate&&!1===y.needsUpdate)return;if(0===e.length)return;const l=t.getRenderTarget(),c=t.getActiveCubeFace(),u=t.getActiveMipmapLevel(),d=t.state;d.setBlending(0),d.buffers.color.setClear(1,1,1,1),d.buffers.depth.setTest(!0),d.setScissorTest(!1);for(let l=0,c=e.length;l<c;l++){const c=e[l],u=c.shadow;if(void 0===u){console.warn("THREE.WebGLShadowMap:",c,"has no shadow.");continue}if(!1===u.autoUpdate&&!1===u.needsUpdate)continue;r.copy(u.mapSize);const m=u.getFrameExtents();if(r.multiply(m),s.copy(u.mapSize),(r.x>h||r.y>h)&&(r.x>h&&(s.x=Math.floor(h/m.x),r.x=s.x*m.x,u.mapSize.x=s.x),r.y>h&&(s.y=Math.floor(h/m.y),r.y=s.y*m.y,u.mapSize.y=s.y)),null===u.map&&!u.isPointLightShadow&&3===this.type){const t={minFilter:g,magFilter:g,format:E};u.map=new Tt(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.mapPass=new Tt(r.x,r.y,t),u.camera.updateProjectionMatrix()}if(null===u.map){const t={minFilter:p,magFilter:p,format:E};u.map=new Tt(r.x,r.y,t),u.map.texture.name=c.name+".shadowMap",u.camera.updateProjectionMatrix()}
vendor: 28,698 bytes, line 824
824t.setRenderTarget(u.map),t.clear();const f=u.getViewportCount();for(let t=0;t<f;t++){const e=u.getViewport(t);a.set(s.x*e.x,s.y*e.y,s.x*e.z,s.y*e.w),d.viewport(a),u.updateMatrices(c,t),i=u.getFrustum(),M(n,o,u.camera,c,this.type)}u.isPointLightShadow||3!==this.type||x(u,o),u.needsUpdate=!1}y.needsUpdate=!1,t.setRenderTarget(l,c,u)}}function ds(t,e,i){const r=i.isWebGL2;const s=new function(){let e=!1;const n=new St;let i=null;const r=new St(0,0,0,0);return{setMask:function(n){i===n||e||(t.colorMask(n,n,n,n),i=n)},setLocked:function(t){e=t},setClear:function(e,i,s,a,o){!0===o&&(e*=a,i*=a,s*=a),n.set(e,i,s,a),!1===r.equals(n)&&(t.clearColor(e,i,s,a),r.copy(n))},reset:function(){e=!1,i=null,r.set(-1,0,0,0)}}},a=new function(){let e=!1,n=null,i=null,r=null;return{setTest:function(t){t?z(2929):F(2929)},setMask:function(i){n===i||e||(t.depthMask(i),n=i)},setFunc:function(e){if(i!==e){if(e)switch(e){case 0:t.depthFunc(512);break;case 1:t.depthFunc(519);break;case 2:t.depthFunc(513);break;case 3:t.depthFunc(515);break;case 4:t.depthFunc(514);break;case 5:t.depthFunc(518);break;case 6:t.depthFunc(516);break;case 7:t.depthFunc(517);break;default:t.depthFunc(515)}else t.depthFunc(515);i=e}},setLocked:function(t){e=t},setClear:function(e){r!==e&&(t.clearDepth(e),r=e)},reset:function(){e=!1,n=null,i=null,r=null}}},o=new function(){let e=!1,n=null,i=null,r=null,s=null,a=null,o=null,l=null,c=null;return{setTest:function(t){e||(t?z(2960):F(2960))},setMask:function(i){n===i||e||(t.stencilMask(i),n=i)},setFunc:function(e,n,a){i===e&&r===n&&s===a||(t.stencilFunc(e,n,a),i=e,r=n,s=a)},setOp:function(e,n,i){a===e&&o===n&&l===i||(t.stencilOp(e,n,i),a=e,o=n,l=i)},setLocked:function(t){e=t},setClear:function(e){c!==e&&(t.clearStencil(e),c=e)},reset:function(){e=!1,n=null,i=null,r=null,s=null,a=null,o=null,l=null,c=null}}};let l={},c=null,h={},u=null,d=!1,p=null,m=null,f=null,g=null,v=null,y=null,x=null,_=!1,w=null,b=null,M=null,S=null,T=null;const E=t.getParameter(35661);let A=!1,L=0;const R=t.getParameter(7938);-1!==R.indexOf("WebGL")?(L=parseFloat(/^WebGL (\d)/.exec(R)[1]),A=L>=1):-1!==R.indexOf("OpenGL ES")&&(L=parseFloat(/^OpenGL ES (\d)/.exec(R)[1]),A=L>=2);let C=null,P={};const D=new St(0,0,t.canvas.width,t.canvas.height),I=new St(0,0,t.canvas.width,t.canvas.height);function N(e,n,i){const r=new Uint8Array(4),s=t.createTexture();t.bindTexture(e,s),t.texParameteri(e,10241,9728),t.texParameteri(e,10240,9728);for(let e=0;e<i;e++)t.texImage2D(n+e,0,6408,1,1,0,6408,5121,r);return s}const B={};function z(e){!0!==l[e]&&(t.enable(e),l[e]=!0)}function F(e){!1!==l[e]&&(t.disable(e),l[e]=!1)}B[3553]=N(3553,3553,1),B[34067]=N(34067,34069,6),s.setClear(0,0,0,1),a.setClear(1),o.setClear(0),z(2929),a.setFunc(3),U(!1),k(1),z(2884),G(0);const O={[n]:32774,101:32778,102:32779};if(r)O[103]=32775,O[104]=32776;else{const t=e.get("EXT_blend_minmax");null!==t&&(O[103]=t.MIN_EXT,O[104]=t.MAX_EXT)}const H={200:0,201:1,202:768,204:770,210:776,208:774,206:772,203:769,205:771,209:775,207:773};function G(e,i,r,s,a,o,l,c){if(0!==e){if(!1===d&&(z(3042),d=!0),5===e)a=a||i,o=o||r,l=l||s,i===m&&a===v||(t.blendEquationSeparate(O[i],O[a]),m=i,v=a),r===f&&s===g&&o===y&&l===x||(t.blendFuncSeparate(H[r],H[s],H[o],H[l]),f=r,g=s,y=o,x=l),p=e,_=null;else if(e!==p||c!==_){if(m===n&&v===n||(t.blendEquation(32774),m=n,v=n),c)switch(e){case 1:t.blendFuncSeparate(1,771,1,771);break;case 2:t.blendFunc(1,1);break;case 3:t.blendFuncSeparate(0,0,769,771);break;case 4:t.blendFuncSeparate(0,768,0,770);break;default:console.error("THREE.WebGLState: Invalid blending: ",e)}else switch(e){case 1:t.blendFuncSeparate(770,771,1,771);break;case 2:t.blendFunc(770,1);break;case 3:t.blendFunc(0,769);break;case 4:t.blendFunc(0,768);break;default:console.error("THREE.WebGLState: Invalid blending: ",e)}f=null,g=null,y=null,x=null,p=e,_=c}}else!0===d&&(F(3042),d=!1)}function U(e){w!==e&&(e?t.frontFace(2304):t.frontFace(2305),w=e)}function k(e){0!==e?(z(2884),e!==b&&(1===e?t.cullFace(1029):2===e?t.cullFace(1028):t.cullFace(1032))):F(2884),b=e}function V(e,n,i){e?(z(32823),S===n&&T===i||(t.polygonOffset(n,i),S=n,T=i)):F(32823)}function W(e){void 0===e&&(e=33984+E-1),C!==e&&(t.activeTexture(e),C=e)}return{buffers:{color:s,depth:a,stencil:o},enable:z,disable:F,bindFramebuffer:function(e,n){null===n&&null!==c&&(n=c),h[e]!==n&&(t.bindFramebuffer(e,n),h[e]=n,r&&(36009===e&&(h[36160]=n),36160===e&&(h[36009]=n)))},bindXRFramebuffer:function(e){e!==c&&(t.bindFramebuffer(36160,e),c=e)},useProgram:function(e){return u!==e&&(t.useProgram(e),u=e,!0)},setBlending:G,setMaterial:function(t,e){2===t.side?F(2884):z(2884);let n=1===t.side;e&&(n=!n),U(n),1===t.blending&&!1===t.transparent?G(0):G(t.blending,t.blendEquation,t.blendSrc,t.blendDst,t.blendEquationAlpha,t.blendSrcAlpha,t.blendDstAlpha,t.premultipliedAlpha),a.setFunc(t.depthFunc),a.setTest(t.depthTest),a.setMask(t.depthWrite),s.setMask(t.colorWrite);const i=t.stencilWrite;o.setTest(i),i&&(o.setMask(t.stencilWriteMask),o.setFunc(t.stencilFunc,t.stencilRef,t.stencilFuncMask),o.setOp(t.stencilFail,t.stencilZFail,t.stencilZPass)),V(t.polygonOffset,t.polygonOffsetFactor,t.polygonOffsetUnits),!0===t.alphaToCoverage?z(32926):F(32926)},setFlipSided:U,setCullFace:k,setLineWidth:function(e){e!==M&&(A&&t.lineWidth(e),M=e)},setPolygonOffset:V,setScissorTest:function(t){t?z(3089):F(3089)},activeTexture:W,bindTexture:function(e,n){null===C&&W();let i=P[C];void 0===i&&(i={type:void 0,texture:void 0},P[C]=i),i.type===e&&i.texture===n||(t.bindTexture(e,n||B[e]),i.type=e,i.texture=n)},unbindTexture:function(){const e=P[C];void 0!==e&&void 0!==e.type&&(t.bindTexture(e.type,null),e.type=void 0,e.texture=void 0)},compressedTexImage2D:function(){try{t.compressedTexImage2D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texImage2D:function(){try{t.texImage2D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},texImage3D:function(){try{t.texImage3D.apply(t,arguments)}catch(t){console.error("THREE.WebGLState:",t)}},scissor:function(e){!1===D.equals(e)&&(t.scissor(e.x,e.y,e.z,e.w),D.copy(e))},viewport:function(e){!1===I.equals(e)&&(t.viewport(e.x,e.y,e.z,e.w),I.copy(e))},reset:function(){t.disable(3042),t.disable(2884),t.disable(2929),t.disable(32823),t.disable(3089),t.disable(2960),t.disable(32926),t.blendEquation(32774),t.blendFunc(1,0),t.blendFuncSeparate(1,0,1,0),t.colorMask(!0,!0,!0,!0),t.clearColor(0,0,0,0),t.depthMask(!0),t.depthFunc(513),t.clearDepth(1),t.stencilMask(4294967295),t.stencilFunc(519,0,4294967295),t.stencilOp(7680,7680,7680),t.clearStencil(0),t.cullFace(1029),t.frontFace(2305),t.polygonOffset(0,0),t.activeTexture(33984),t.bindFramebuffer(36160,null),!0===r&&(t.bindFramebuffer(36009,null),t.bindFramebuffer(36008,null)),t.useProgram(null),t.lineWidth(1),t.scissor(0,0,t.canvas.width,t.canvas.height),t.viewport(0,0,t.canvas.width,t.canvas.height),l={},C=null,P={},c=null,h={},u=null,d=!1,p=null,m=null,f=null,g=null,v=null,y=null,x=null,_=!1,w=null,b=null,M=null,S=null,T=null,D.set(0,0,t.canvas.width,t.canvas.height),I.set(0,0,t.canvas.width,t.canvas.height),s.reset(),a.reset(),o.reset()}}}function ps(t,e,n,i,r,s,a){const o=r.isWebGL2,l=r.maxTextures,c=r.maxCubemapSize,x=r.maxTextureSize,R=r.maxSamples,C=new WeakMap;let P,D=!1;try{D="undefined"!=typeof OffscreenCanvas&&null!==new OffscreenCanvas(1,1).getContext("2d")}catch(t){}function I(t,e){return D?new OffscreenCanvas(t,e):document.createElementNS("http://www.w3.org/1999/xhtml","canvas")}function N(t,e,n,i){let r=1;if((t.width>i||t.height>i)&&(r=i/Math.max(t.width,t.height)),r<1||!0===e){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const i=e?ft:Math.floor,s=i(r*t.width),a=i(r*t.height);void 0===P&&(P=I(s,a));const o=n?I(s,a):P;o.width=s,o.height=a;return o.getContext("2d").drawImage(t,0,0,s,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+t.width+"x"+t.height+") to ("+s+"x"+a+")."),o}return"data"in t&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+t.width+"x"+t.height+")."),t}return t}function B(t){return pt(t.width)&&pt(t.height)}function z(t,e){return t.generateMipmaps&&e&&t.minFilter!==p&&t.minFilter!==g}function F(e,n,r,s){t.generateMipmap(e);i.get(n).__maxMipLevel=Math.log2(Math.max(r,s))}function O(n,i,r){if(!1===o)return i;if(null!==n){if(void 0!==t[n])return t[n];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+n+"'")}let s=i;return 6403===i&&(5126===r&&(s=33326),5131===r&&(s=33325),5121===r&&(s=33321)),6407===i&&(5126===r&&(s=34837),5131===r&&(s=34843),5121===r&&(s=32849)),6408===i&&(5126===r&&(s=34836),5131===r&&(s=34842),5121===r&&(s=32856)),33325!==s&&33326!==s&&34842!==s&&34836!==s||e.get("EXT_color_buffer_float"),s}function H(t){return t===p||t===m||t===f?9728:9729}function G(e){const n=e.target;n.removeEventListener("dispose",G),function(e){const n=i.get(e);if(void 0===n.__webglInit)return;t.deleteTexture(n.__webglTexture),i.remove(e)}(n),n.isVideoTexture&&C.delete(n),a.memory.textures--}function U(e){const n=e.target;n.removeEventListener("dispose",U),function(e){const n=e.texture,r=i.get(e),s=i.get(n);if(!e)return;void 0!==s.__webglTexture&&t.deleteTexture(s.__webglTexture);e.depthTexture&&e.depthTexture.dispose();if(e.isWebGLCubeRenderTarget)for(let e=0;e<6;e++)t.deleteFramebuffer(r.__webglFramebuffer[e]),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer[e]);else t.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&t.deleteRenderbuffer(r.__webglDepthbuffer),r.__webglMultisampledFramebuffer&&t.deleteFramebuffer(r.__webglMultisampledFramebuffer),r.__webglColorRenderbuffer&&t.deleteRenderbuffer(r.__webglColorRenderbuffer),r.__webglDepthRenderbuffer&&t.deleteRenderbuffer(r.__webglDepthRenderbuffer);i.remove(n),i.remove(e)}(n),a.memory.textures--}let k=0;function V(t,e){const r=i.get(t);if(t.isVideoTexture&&function(t){const e=a.render.frame;C.get(t)!==e&&(C.set(t,e),t.update())}(t),t.version>0&&r.__version!==t.version){const n=t.image;if(void 0===n)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==n.complete)return void Z(r,t,e);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}n.activeTexture(33984+e),n.bindTexture(3553,r.__webglTexture)}function W(e,r){const a=i.get(e);e.version>0&&a.__version!==e.version?function(e,i,r){if(6!==i.image.length)return;Y(e,i),n.activeTexture(33984+r),n.bindTexture(34067,e.__webglTexture),t.pixelStorei(37440,i.flipY),t.pixelStorei(37441,i.premultiplyAlpha),t.pixelStorei(3317,i.unpackAlignment),t.pixelStorei(37443,0);const a=i&&(i.isCompressedTexture||i.image[0].isCompressedTexture),l=i.image[0]&&i.image[0].isDataTexture,h=[];for(let t=0;t<6;t++)h[t]=a||l?l?i.image[t].image:i.image[t]:N(i.image[t],!1,!0,c);const u=h[0],d=B(u)||o,p=s.convert(i.format),m=s.convert(i.type),f=O(i.internalFormat,p,m);let g;if(X(34067,i,d),a){for(let t=0;t<6;t++){g=h[t].mipmaps;for(let e=0;e<g.length;e++){const r=g[e];i.format!==E&&i.format!==T?null!==p?n.compressedTexImage2D(34069+t,e,f,r.width,r.height,0,r.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):n.texImage2D(34069+t,e,f,r.width,r.height,0,p,m,r.data)}}e.__maxMipLevel=g.length-1}else{g=i.mipmaps;for(let t=0;t<6;t++)if(l){n.texImage2D(34069+t,0,f,h[t].width,h[t].height,0,p,m,h[t].data);for(let e=0;e<g.length;e++){const i=g[e].image[t].image;n.texImage2D(34069+t,e+1,f,i.width,i.height,0,p,m,i.data)}}else{n.texImage2D(34069+t,0,f,p,m,h[t]);for(let e=0;e<g.length;e++){const i=g[e];n.texImage2D(34069+t,e+1,f,p,m,i.image[t])}}e.__maxMipLevel=g.length}z(i,d)&&F(34067,i,u.width,u.height);e.__version=i.version,i.onUpdate&&i.onUpdate(i)}(a,e,r):(n.activeTexture(33984+r),n.bindTexture(34067,a.__webglTexture))}const j={[h]:10497,[u]:33071,[d]:33648},q={[p]:9728,[m]:9984,[f]:9986,[g]:9729,[v]:9985,[y]:9987};function X(n,s,a){if(a?(t.texParameteri(n,10242,j[s.wrapS]),t.texParameteri(n,10243,j[s.wrapT]),32879!==n&&35866!==n||t.texParameteri(n,32882,j[s.wrapR]),t.texParameteri(n,10240,q[s.magFilter]),t.texParameteri(n,10241,q[s.minFilter])):(t.texParameteri(n,10242,33071),t.texParameteri(n,10243,33071),32879!==n&&35866!==n||t.texParameteri(n,32882,33071),s.wrapS===u&&s.wrapT===u||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),t.texParameteri(n,10240,H(s.magFilter)),t.texParameteri(n,10241,H(s.minFilter)),s.minFilter!==p&&s.minFilter!==g&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),!0===e.has("EXT_texture_filter_anisotropic")){const a=e.get("EXT_texture_filter_anisotropic");if(s.type===b&&!1===e.has("OES_texture_float_linear"))return;if(!1===o&&s.type===M&&!1===e.has("OES_texture_half_float_linear"))return;(s.anisotropy>1||i.get(s).__currentAnisotropy)&&(t.texParameterf(n,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),i.get(s).__currentAnisotropy=s.anisotropy)}}function Y(e,n){void 0===e.__webglInit&&(e.__webglInit=!0,n.addEventListener("dispose",G),e.__webglTexture=t.createTexture(),a.memory.textures++)}function Z(e,i,r){let a=3553;i.isDataTexture2DArray&&(a=35866),i.isDataTexture3D&&(a=32879),Y(e,i),n.activeTexture(33984+r),n.bindTexture(a,e.__webglTexture),t.pixelStorei(37440,i.flipY),t.pixelStorei(37441,i.premultiplyAlpha),t.pixelStorei(3317,i.unpackAlignment),t.pixelStorei(37443,0);const l=function(t){return!o&&(t.wrapS!==u||t.wrapT!==u||t.minFilter!==p&&t.minFilter!==g)}(i)&&!1===B(i.image),c=N(i.image,l,!1,x),h=B(c)||o,d=s.convert(i.format);let m,f=s.convert(i.type),v=O(i.internalFormat,d,f);X(a,i,h);const y=i.mipmaps;if(i.isDepthTexture)v=6402,o?v=i.type===b?36012:i.type===w?33190:i.type===S?35056:33189:i.type===b&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),i.format===A&&6402===v&&i.type!==_&&i.type!==w&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),i.type=_,f=s.convert(i.type)),i.format===L&&6402===v&&(v=34041,i.type!==S&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),i.type=S,f=s.convert(i.type))),n.texImage2D(3553,0,v,c.width,c.height,0,d,f,null);else if(i.isDataTexture)if(y.length>0&&h){for(let t=0,e=y.length;t<e;t++)m=y[t],n.texImage2D(3553,t,v,m.width,m.height,0,d,f,m.data);i.generateMipmaps=!1,e.__maxMipLevel=y.length-1}else n.texImage2D(3553,0,v,c.width,c.height,0,d,f,c.data),e.__maxMipLevel=0;else if(i.isCompressedTexture){for(let t=0,e=y.length;t<e;t++)m=y[t],i.format!==E&&i.format!==T?null!==d?n.compressedTexImage2D(3553,t,v,m.width,m.height,0,m.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):n.texImage2D(3553,t,v,m.width,m.height,0,d,f,m.data);e.__maxMipLevel=y.length-1}else if(i.isDataTexture2DArray)n.texImage3D(35866,0,v,c.width,c.height,c.depth,0,d,f,c.data),e.__maxMipLevel=0;else if(i.isDataTexture3D)n.texImage3D(32879,0,v,c.width,c.height,c.depth,0,d,f,c.data),e.__maxMipLevel=0;else if(y.length>0&&h){for(let t=0,e=y.length;t<e;t++)m=y[t],n.texImage2D(3553,t,v,d,f,m);i.generateMipmaps=!1,e.__maxMipLevel=y.length-1}else n.texImage2D(3553,0,v,d,f,c),e.__maxMipLevel=0;z(i,h)&&F(a,i,c.width,c.height),e.__version=i.version,i.onUpdate&&i.onUpdate(i)}function J(e,r,a,o){const l=r.texture,c=s.convert(l.format),h=s.convert(l.type),u=O(l.internalFormat,c,h);32879===o||35866===o?n.texImage3D(o,0,u,r.width,r.height,r.depth,0,c,h,null):n.texImage2D(o,0,u,r.width,r.height,0,c,h,null),n.bindFramebuffer(36160,e),t.framebufferTexture2D(36160,a,o,i.get(l).__webglTexture,0),n.bindFramebuffer(36160,null)}function Q(e,n,i){if(t.bindRenderbuffer(36161,e),n.depthBuffer&&!n.stencilBuffer){let r=33189;if(i){const e=n.depthTexture;e&&e.isDepthTexture&&(e.type===b?r=36012:e.type===w&&(r=33190));const i=$(n);t.renderbufferStorageMultisample(36161,i,r,n.width,n.height)}else t.renderbufferStorage(36161,r,n.width,n.height);t.framebufferRenderbuffer(36160,36096,36161,e)}else if(n.depthBuffer&&n.stencilBuffer){if(i){const e=$(n);t.renderbufferStorageMultisample(36161,e,35056,n.width,n.height)}else t.renderbufferStorage(36161,34041,n.width,n.height);t.framebufferRenderbuffer(36160,33306,36161,e)}else{const e=n.texture,r=s.convert(e.format),a=s.convert(e.type),o=O(e.internalFormat,r,a);if(i){const e=$(n);t.renderbufferStorageMultisample(36161,e,o,n.width,n.height)}else t.renderbufferStorage(36161,o,n.width,n.height)}t.bindRenderbuffer(36161,null)}function K(e){const r=i.get(e),s=!0===e.isWebGLCubeRenderTarget;if(e.depthTexture){if(s)throw new Error("target.depthTexture not supported in Cube render targets");!function(e,r){if(r&&r.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(n.bindFramebuffer(36160,e),!r.depthTexture||!r.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");i.get(r.depthTexture).__webglTexture&&r.depthTexture.image.width===r.width&&r.depthTexture.image.height===r.height||(r.depthTexture.image.width=r.width,r.depthTexture.image.height=r.height,r.depthTexture.needsUpdate=!0),V(r.depthTexture,0);const s=i.get(r.depthTexture).__webglTexture;if(r.depthTexture.format===A)t.framebufferTexture2D(36160,36096,3553,s,0);else{if(r.depthTexture.format!==L)throw new Error("Unknown depthTexture format");t.framebufferTexture2D(36160,33306,3553,s,0)}}(r.__webglFramebuffer,e)}else if(s){r.__webglDepthbuffer=[];for(let i=0;i<6;i++)n.bindFramebuffer(36160,r.__webglFramebuffer[i]),r.__webglDepthbuffer[i]=t.createRenderbuffer(),Q(r.__webglDepthbuffer[i],e,!1)}else n.bindFramebuffer(36160,r.__webglFramebuffer),r.__webglDepthbuffer=t.createRenderbuffer(),Q(r.__webglDepthbuffer,e,!1);n.bindFramebuffer(36160,null)}function $(t){return o&&t.isWebGLMultisampleRenderTarget?Math.min(R,t.samples):0}let tt=!1,et=!1;this.allocateTextureUnit=function(){const t=k;return t>=l&&console.warn("THREE.WebGLTextures: Trying to use "+t+" texture units while this GPU supports only "+l),k+=1,t},this.resetTextureUnits=function(){k=0},this.setTexture2D=V,this.setTexture2DArray=function(t,e){const r=i.get(t);t.version>0&&r.__version!==t.version?Z(r,t,e):(n.activeTexture(33984+e),n.bindTexture(35866,r.__webglTexture))},this.setTexture3D=function(t,e){const r=i.get(t);t.version>0&&r.__version!==t.version?Z(r,t,e):(n.activeTexture(33984+e),n.bindTexture(32879,r.__webglTexture))},this.setTextureCube=W,this.setupRenderTarget=function(e){const r=e.texture,l=i.get(e),c=i.get(r);e.addEventListener("dispose",U),c.__webglTexture=t.createTexture(),c.__version=r.version,a.memory.textures++;const h=!0===e.isWebGLCubeRenderTarget,u=!0===e.isWebGLMultisampleRenderTarget,d=r.isDataTexture3D||r.isDataTexture2DArray,p=B(e)||o;if(!o||r.format!==T||r.type!==b&&r.type!==M||(r.format=E,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),h){l.__webglFramebuffer=[];for(let e=0;e<6;e++)l.__webglFramebuffer[e]=t.createFramebuffer()}else if(l.__webglFramebuffer=t.createFramebuffer(),u)if(o){l.__webglMultisampledFramebuffer=t.createFramebuffer(),l.__webglColorRenderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,l.__webglColorRenderbuffer);const i=s.convert(r.format),a=s.convert(r.type),o=O(r.internalFormat,i,a),c=$(e);t.renderbufferStorageMultisample(36161,c,o,e.width,e.height),n.bindFramebuffer(36160,l.__webglMultisampledFramebuffer),t.framebufferRenderbuffer(36160,36064,36161,l.__webglColorRenderbuffer),t.bindRenderbuffer(36161,null),e.depthBuffer&&(l.__webglDepthRenderbuffer=t.createRenderbuffer(),Q(l.__webglDepthRenderbuffer,e,!0)),n.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");if(h){n.bindTexture(34067,c.__webglTexture),X(34067,r,p);for(let t=0;t<6;t++)J(l.__webglFramebuffer[t],e,36064,34069+t);z(r,p)&&F(34067,r,e.width,e.height),n.bindTexture(34067,null)}else{let t=3553;if(d)if(o){t=r.isDataTexture3D?32879:35866}else console.warn("THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.");n.bindTexture(t,c.__webglTexture),X(t,r,p),J(l.__webglFramebuffer,e,36064,t),z(r,p)&&F(3553,r,e.width,e.height),n.bindTexture(3553,null)}e.depthBuffer&&K(e)},this.updateRenderTargetMipmap=function(t){const e=t.texture;if(z(e,B(t)||o)){const r=t.isWebGLCubeRenderTarget?34067:3553,s=i.get(e).__webglTexture;n.bindTexture(r,s),F(r,e,t.width,t.height),n.bindTexture(r,null)}},this.updateMultisampleRenderTarget=function(e){if(e.isWebGLMultisampleRenderTarget)if(o){const r=e.width,s=e.height;let a=16384;e.depthBuffer&&(a|=256),e.stencilBuffer&&(a|=1024);const o=i.get(e);n.bindFramebuffer(36008,o.__webglMultisampledFramebuffer),n.bindFramebuffer(36009,o.__webglFramebuffer),t.blitFramebuffer(0,0,r,s,0,0,r,s,a,9728),n.bindFramebuffer(36008,null),n.bindFramebuffer(36009,o.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")},this.safeSetTexture2D=function(t,e){t&&t.isWebGLRenderTarget&&(!1===tt&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),tt=!0),t=t.texture),V(t,e)},this.safeSetTextureCube=function(t,e){t&&t.isWebGLCubeRenderTarget&&(!1===et&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),et=!0),t=t.texture),W(t,e)}}function ms(t,e,n){const i=n.isWebGL2;return{convert:function(t){let n;if(t===x)return 5121;if(1017===t)return 32819;if(1018===t)return 32820;if(1019===t)return 33635;if(1010===t)return 5120;if(1011===t)return 5122;if(t===_)return 5123;if(1013===t)return 5124;if(t===w)return 5125;if(t===b)return 5126;if(t===M)return i?5131:(n=e.get("OES_texture_half_float"),null!==n?n.HALF_FLOAT_OES:null);if(1021===t)return 6406;if(t===T)return 6407;if(t===E)return 6408;if(1024===t)return 6409;if(1025===t)return 6410;if(t===A)return 6402;if(t===L)return 34041;if(1028===t)return 6403;if(1029===t)return 36244;if(1030===t)return 33319;if(1031===t)return 33320;if(1032===t)return 36248;if(1033===t)return 36249;if(t===R||t===C||t===P||t===D){if(n=e.get("WEBGL_compressed_texture_s3tc"),null===n)return null;if(t===R)return n.COMPRESSED_RGB_S3TC_DXT1_EXT;if(t===C)return n.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(t===P)return n.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(t===D)return n.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(t===I||t===N||t===B||t===z){if(n=e.get("WEBGL_compressed_texture_pvrtc"),null===n)return null;if(t===I)return n.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(t===N)return n.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(t===B)return n.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(t===z)return n.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===t)return n=e.get("WEBGL_compressed_texture_etc1"),null!==n?n.COMPRESSED_RGB_ETC1_WEBGL:null;if((t===F||t===O)&&(n=e.get("WEBGL_compressed_texture_etc"),null!==n)){if(t===F)return n.COMPRESSED_RGB8_ETC2;if(t===O)return n.COMPRESSED_RGBA8_ETC2_EAC}return 37808===t||37809===t||37810===t||37811===t||37812===t||37813===t||37814===t||37815===t||37816===t||37817===t||37818===t||37819===t||37820===t||37821===t||37840===t||37841===t||37842===t||37843===t||37844===t||37845===t||37846===t||37847===t||37848===t||37849===t||37850===t||37851===t||37852===t||37853===t?(n=e.get("WEBGL_compressed_texture_astc"),null!==n?t:null):36492===t?(n=e.get("EXT_texture_compression_bptc"),null!==n?t:null):t===S?i?34042:(n=e.get("WEBGL_depth_texture"),null!==n?n.UNSIGNED_INT_24_8_WEBGL:null):void 0}}}class fs extends Kn{constructor(t=[]){super(),this.cameras=t}}fs.prototype.isArrayCamera=!0;class gs extends Ce{constructor(){super(),this.type="Group"}}gs.prototype.isGroup=!0;const vs={type:"move"};class ys{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new gs,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new gs,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Lt,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Lt),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new gs,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Lt,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Lt),this._grip}dispatchEvent(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(t,e,n){let i=null,r=null,s=null;const a=this._targetRay,o=this._grip,l=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState)if(null!==a&&(i=e.getPose(t.targetRaySpace,n),null!==i&&(a.matrix.fromArray(i.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),i.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(i.linearVelocity)):a.hasLinearVelocity=!1,i.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(i.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(vs))),l&&t.hand){s=!0;for(const i of t.hand.values()){const t=e.getJointPose(i,n);if(void 0===l.joints[i.jointName]){const t=new gs;t.matrixAutoUpdate=!1,t.visible=!1,l.joints[i.jointName]=t,l.add(t)}const r=l.joints[i.jointName];null!==t&&(r.matrix.fromArray(t.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.jointRadius=t.radius),r.visible=null!==t}const i=l.joints["index-finger-tip"],r=l.joints["thumb-tip"],a=i.position.distanceTo(r.position),o=.02,c=.005;l.inputState.pinching&&a>o+c?(l.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!l.inputState.pinching&&a<=o-c&&(l.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,n),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));return null!==a&&(a.visible=null!==i),null!==o&&(o.visible=null!==r),null!==l&&(l.visible=null!==s),this}}class xs extends rt{constructor(t,e){super();const n=this,i=t.state;let r=null,s=1,a=null,o="local-floor",l=null;const c=[],h=new Map,u=new Kn;u.layers.enable(1),u.viewport=new St;const d=new Kn;d.layers.enable(2),d.viewport=new St;const p=[u,d],m=new fs;m.layers.enable(1),m.layers.enable(2);let f=null,g=null;function v(t){const e=h.get(t.inputSource);e&&e.dispatchEvent({type:t.type,data:t.inputSource})}function y(){h.forEach((function(t,e){t.disconnect(e)})),h.clear(),f=null,g=null,i.bindXRFramebuffer(null),t.setRenderTarget(t.getRenderTarget()),S.stop(),n.isPresenting=!1,n.dispatchEvent({type:"sessionend"})}function x(t){const e=r.inputSources;for(let t=0;t<c.length;t++)h.set(e[t],c[t]);for(let e=0;e<t.removed.length;e++){const n=t.removed[e],i=h.get(n);i&&(i.dispatchEvent({type:"disconnected",data:n}),h.delete(n))}for(let e=0;e<t.added.length;e++){const n=t.added[e],i=h.get(n);i&&i.dispatchEvent({type:"connected",data:n})}}this.enabled=!1,this.isPresenting=!1,this.getController=function(t){let e=c[t];return void 0===e&&(e=new ys,c[t]=e),e.getTargetRaySpace()},this.getControllerGrip=function(t){let e=c[t];return void 0===e&&(e=new ys,c[t]=e),e.getGripSpace()},this.getHand=function(t){let e=c[t];return void 0===e&&(e=new ys,c[t]=e),e.getHandSpace()},this.setFramebufferScaleFactor=function(t){s=t,!0===n.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(t){o=t,!0===n.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return a}
vendor: 11,556 bytes, line 824
824,this.getSession=function(){return r},this.setSession=async function(t){if(r=t,null!==r){r.addEventListener("select",v),r.addEventListener("selectstart",v),r.addEventListener("selectend",v),r.addEventListener("squeeze",v),r.addEventListener("squeezestart",v),r.addEventListener("squeezeend",v),r.addEventListener("end",y),r.addEventListener("inputsourceschange",x);const t=e.getContextAttributes();!0!==t.xrCompatible&&await e.makeXRCompatible();const i={antialias:t.antialias,alpha:t.alpha,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:s},l=new XRWebGLLayer(r,e,i);r.updateRenderState({baseLayer:l}),a=await r.requestReferenceSpace(o),S.setContext(r),S.start(),n.isPresenting=!0,n.dispatchEvent({type:"sessionstart"})}};const _=new Lt,w=new Lt;function b(t,e){null===e?t.matrixWorld.copy(t.matrix):t.matrixWorld.multiplyMatrices(e.matrixWorld,t.matrix),t.matrixWorldInverse.copy(t.matrixWorld).invert()}this.getCamera=function(t){m.near=d.near=u.near=t.near,m.far=d.far=u.far=t.far,f===m.near&&g===m.far||(r.updateRenderState({depthNear:m.near,depthFar:m.far}),f=m.near,g=m.far);const e=t.parent,n=m.cameras;b(m,e);for(let t=0;t<n.length;t++)b(n[t],e);t.matrixWorld.copy(m.matrixWorld),t.matrix.copy(m.matrix),t.matrix.decompose(t.position,t.quaternion,t.scale);const i=t.children;for(let t=0,e=i.length;t<e;t++)i[t].updateMatrixWorld(!0);return 2===n.length?function(t,e,n){_.setFromMatrixPosition(e.matrixWorld),w.setFromMatrixPosition(n.matrixWorld);const i=_.distanceTo(w),r=e.projectionMatrix.elements,s=n.projectionMatrix.elements,a=r[14]/(r[10]-1),o=r[14]/(r[10]+1),l=(r[9]+1)/r[5],c=(r[9]-1)/r[5],h=(r[8]-1)/r[0],u=(s[8]+1)/s[0],d=a*h,p=a*u,m=i/(-h+u),f=m*-h;e.matrixWorld.decompose(t.position,t.quaternion,t.scale),t.translateX(f),t.translateZ(m),t.matrixWorld.compose(t.position,t.quaternion,t.scale),t.matrixWorldInverse.copy(t.matrixWorld).invert();const g=a+m,v=o+m,y=d-f,x=p+(i-f),b=l*o/v*g,M=c*o/v*g;t.projectionMatrix.makePerspective(y,x,b,M,g,v)}(m,u,d):m.projectionMatrix.copy(u.projectionMatrix),m};let M=null;const S=new oi;S.setAnimationLoop((function(t,e){if(l=e.getViewerPose(a),null!==l){const t=l.views,e=r.renderState.baseLayer;i.bindXRFramebuffer(e.framebuffer);let n=!1;t.length!==m.cameras.length&&(m.cameras.length=0,n=!0);for(let i=0;i<t.length;i++){const r=t[i],s=e.getViewport(r),a=p[i];a.matrix.fromArray(r.transform.matrix),a.projectionMatrix.fromArray(r.projectionMatrix),a.viewport.set(s.x,s.y,s.width,s.height),0===i&&m.matrix.copy(a.matrix),!0===n&&m.cameras.push(a)}}const n=r.inputSources;for(let t=0;t<c.length;t++){const i=c[t],r=n[t];i.update(r,e,a)}M&&M(t,e)})),this.setAnimationLoop=function(t){M=t},this.dispose=function(){}}}function _s(t){function e(e,n){e.opacity.value=n.opacity,n.color&&e.diffuse.value.copy(n.color),n.emissive&&e.emissive.value.copy(n.emissive).multiplyScalar(n.emissiveIntensity),n.map&&(e.map.value=n.map),n.alphaMap&&(e.alphaMap.value=n.alphaMap),n.specularMap&&(e.specularMap.value=n.specularMap);const i=t.get(n).envMap;if(i){e.envMap.value=i,e.flipEnvMap.value=i.isCubeTexture&&i._needsFlipEnvMap?-1:1,e.reflectivity.value=n.reflectivity,e.refractionRatio.value=n.refractionRatio;const r=t.get(i).__maxMipLevel;void 0!==r&&(e.maxMipLevel.value=r)}let r,s;n.lightMap&&(e.lightMap.value=n.lightMap,e.lightMapIntensity.value=n.lightMapIntensity),n.aoMap&&(e.aoMap.value=n.aoMap,e.aoMapIntensity.value=n.aoMapIntensity),n.map?r=n.map:n.specularMap?r=n.specularMap:n.displacementMap?r=n.displacementMap:n.normalMap?r=n.normalMap:n.bumpMap?r=n.bumpMap:n.roughnessMap?r=n.roughnessMap:n.metalnessMap?r=n.metalnessMap:n.alphaMap?r=n.alphaMap:n.emissiveMap?r=n.emissiveMap:n.clearcoatMap?r=n.clearcoatMap:n.clearcoatNormalMap?r=n.clearcoatNormalMap:n.clearcoatRoughnessMap&&(r=n.clearcoatRoughnessMap),void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),!0===r.matrixAutoUpdate&&r.updateMatrix(),e.uvTransform.value.copy(r.matrix)),n.aoMap?s=n.aoMap:n.lightMap&&(s=n.lightMap),void 0!==s&&(s.isWebGLRenderTarget&&(s=s.texture),!0===s.matrixAutoUpdate&&s.updateMatrix(),e.uv2Transform.value.copy(s.matrix))}function n(e,n){e.roughness.value=n.roughness,e.metalness.value=n.metalness,n.roughnessMap&&(e.roughnessMap.value=n.roughnessMap),n.metalnessMap&&(e.metalnessMap.value=n.metalnessMap),n.emissiveMap&&(e.emissiveMap.value=n.emissiveMap),n.bumpMap&&(e.bumpMap.value=n.bumpMap,e.bumpScale.value=n.bumpScale,1===n.side&&(e.bumpScale.value*=-1)),n.normalMap&&(e.normalMap.value=n.normalMap,e.normalScale.value.copy(n.normalScale),1===n.side&&e.normalScale.value.negate()),n.displacementMap&&(e.displacementMap.value=n.displacementMap,e.displacementScale.value=n.displacementScale,e.displacementBias.value=n.displacementBias);t.get(n).envMap&&(e.envMapIntensity.value=n.envMapIntensity)}return{refreshFogUniforms:function(t,e){t.fogColor.value.copy(e.color),e.isFog?(t.fogNear.value=e.near,t.fogFar.value=e.far):e.isFogExp2&&(t.fogDensity.value=e.density)},refreshMaterialUniforms:function(t,i,r,s){i.isMeshBasicMaterial?e(t,i):i.isMeshLambertMaterial?(e(t,i),function(t,e){e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap)}(t,i)):i.isMeshToonMaterial?(e(t,i),function(t,e){e.gradientMap&&(t.gradientMap.value=e.gradientMap);e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isMeshPhongMaterial?(e(t,i),function(t,e){t.specular.value.copy(e.specular),t.shininess.value=Math.max(e.shininess,1e-4),e.emissiveMap&&(t.emissiveMap.value=e.emissiveMap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isMeshStandardMaterial?(e(t,i),i.isMeshPhysicalMaterial?function(t,e){n(t,e),t.reflectivity.value=e.reflectivity,t.clearcoat.value=e.clearcoat,t.clearcoatRoughness.value=e.clearcoatRoughness,e.sheen&&t.sheen.value.copy(e.sheen);e.clearcoatMap&&(t.clearcoatMap.value=e.clearcoatMap);e.clearcoatRoughnessMap&&(t.clearcoatRoughnessMap.value=e.clearcoatRoughnessMap);e.clearcoatNormalMap&&(t.clearcoatNormalScale.value.copy(e.clearcoatNormalScale),t.clearcoatNormalMap.value=e.clearcoatNormalMap,1===e.side&&t.clearcoatNormalScale.value.negate());t.transmission.value=e.transmission,e.transmissionMap&&(t.transmissionMap.value=e.transmissionMap)}(t,i):n(t,i)):i.isMeshMatcapMaterial?(e(t,i),function(t,e){e.matcap&&(t.matcap.value=e.matcap);e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isMeshDepthMaterial?(e(t,i),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isMeshDistanceMaterial?(e(t,i),function(t,e){e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias);t.referencePosition.value.copy(e.referencePosition),t.nearDistance.value=e.nearDistance,t.farDistance.value=e.farDistance}(t,i)):i.isMeshNormalMaterial?(e(t,i),function(t,e){e.bumpMap&&(t.bumpMap.value=e.bumpMap,t.bumpScale.value=e.bumpScale,1===e.side&&(t.bumpScale.value*=-1));e.normalMap&&(t.normalMap.value=e.normalMap,t.normalScale.value.copy(e.normalScale),1===e.side&&t.normalScale.value.negate());e.displacementMap&&(t.displacementMap.value=e.displacementMap,t.displacementScale.value=e.displacementScale,t.displacementBias.value=e.displacementBias)}(t,i)):i.isLineBasicMaterial?(function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity}(t,i),i.isLineDashedMaterial&&function(t,e){t.dashSize.value=e.dashSize,t.totalSize.value=e.dashSize+e.gapSize,t.scale.value=e.scale}(t,i)):i.isPointsMaterial?function(t,e,n,i){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.size.value=e.size*n,t.scale.value=.5*i,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);let r;e.map?r=e.map:e.alphaMap&&(r=e.alphaMap);void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix))}(t,i,r,s):i.isSpriteMaterial?function(t,e){t.diffuse.value.copy(e.color),t.opacity.value=e.opacity,t.rotation.value=e.rotation,e.map&&(t.map.value=e.map);e.alphaMap&&(t.alphaMap.value=e.alphaMap);let n;e.map?n=e.map:e.alphaMap&&(n=e.alphaMap);void 0!==n&&(!0===n.matrixAutoUpdate&&n.updateMatrix(),t.uvTransform.value.copy(n.matrix))}(t,i):i.isShadowMaterial?(t.color.value.copy(i.color),t.opacity.value=i.opacity):i.isShaderMaterial&&(i.uniformsNeedUpdate=!1)}}}function ws(t){const e=void 0!==(t=t||{}).canvas?t.canvas:function(){const t=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");return t.style.display="block",t}(),n=void 0!==t.context?t.context:null,i=void 0!==t.alpha&&t.alpha,r=void 0===t.depth||t.depth,s=void 0===t.stencil||t.stencil,a=void 0!==t.antialias&&t.antialias,o=void 0===t.premultipliedAlpha||t.premultipliedAlpha,l=void 0!==t.preserveDrawingBuffer&&t.preserveDrawingBuffer,c=void 0!==t.powerPreference?t.powerPreference:"default",h=void 0!==t.failIfMajorPerformanceCaveat&&t.failIfMajorPerformanceCaveat;let u=null,d=null;const p=[],m=[];this.domElement=e,this.debug={checkShaderErrors:!0},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.gammaFactor=2,this.outputEncoding=X,this.physicallyCorrectLights=!1,this.toneMapping=0,this.toneMappingExposure=1;const f=this;let g=!1,v=0,y=0,_=null,w=-1,S=null;const T=new St,A=new St;let L=null,R=e.width,C=e.height,P=1,D=null,I=null;const N=new St(0,0,R,C),B=new St(0,0,R,C);let z=!1;const F=new ai;let O=!1,H=!1;const G=new se,U=new Lt,k={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function V(){return null===_?P:1}let W,j,q,Y,Z,J,Q,K,$,tt,et,nt,it,rt,st,at,ot,lt,ct,ht,ut,dt,pt=n;function ft(t,n){for(let i=0;i<t.length;i++){const r=t[i],s=e.getContext(r,n);if(null!==s)return s}return null}try{const t={alpha:i,depth:r,stencil:s,antialias:a,premultipliedAlpha:o,preserveDrawingBuffer:l,powerPreference:c,failIfMajorPerformanceCaveat:h};if(e.addEventListener("webglcontextlost",xt,!1),e.addEventListener("webglcontextrestored",_t,!1),null===pt){const e=["webgl2","webgl","experimental-webgl"];if(!0===f.isWebGL1Renderer&&e.shift(),pt=ft(e,t),null===pt)throw ft(e)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}void 0===pt.getShaderPrecisionFormat&&(pt.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(t){throw console.error("THREE.WebGLRenderer: "+t.message),t}function gt(){W=new xi(pt),j=new gi(pt,W,t),W.init(j),ut=new ms(pt,W,j
824),q=new ds(pt,W,j),Y=new bi(pt),Z=new Kr,J=new ps(pt,W,q,Z,j,ut,Y),Q=new yi(f),K=new li(pt,j),dt=new mi(pt,W,K,j),$=new _i(pt,K,Y,dt),tt=new Ei(pt,$,K,Y),lt=new Ti(pt),st=new vi(Z),et=new Qr(f,Q,W,j,dt,st),nt=new _s(Z),it=new ns(Z),rt=new ls(W,j),ot=new pi(f,Q,q,tt,o),at=new us(f,tt,j),ct=new fi(pt,W,Y,j),ht=new wi(pt,W,Y,j),Y.programs=et.programs,f.capabilities=j,f.extensions=W,f.properties=Z,f.renderLists=it,f.shadowMap=at,f.state=q,f.info=Y}gt();const yt=new xs(f,pt);function xt(t){t.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),g=!0}function _t(){console.log("THREE.WebGLRenderer: Context Restored."),g=!1;const t=Y.autoReset,e=at.enabled,n=at.autoUpdate,i=at.needsUpdate,r=at.type;gt(),Y.autoReset=t,at.enabled=e,at.autoUpdate=n,at.needsUpdate=i,at.type=r}function wt(t){const e=t.target;e.removeEventListener("dispose",wt),function(t){(function(t){const e=Z.get(t).programs;void 0!==e&&e.forEach((function(t){et.releaseProgram(t)}))})(t),Z.remove(t)}(e)}this.xr=yt,this.getContext=function(){return pt},this.getContextAttributes=function(){return pt.getContextAttributes()},this.forceContextLoss=function(){const t=W.get("WEBGL_lose_context");t&&t.loseContext()},this.forceContextRestore=function(){const t=W.get("WEBGL_lose_context");t&&t.restoreContext()},this.getPixelRatio=function(){return P},this.setPixelRatio=function(t){void 0!==t&&(P=t,this.setSize(R,C,!1))},this.getSize=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getsize() now requires a Vector2 as an argument"),t=new vt),t.set(R,C)},this.setSize=function(t,n,i){yt.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(R=t,C=n,e.width=Math.floor(t*P),e.height=Math.floor(n*P),!1!==i&&(e.style.width=t+"px",e.style.height=n+"px"),this.setViewport(0,0,t,n))},this.getDrawingBufferSize=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument"),t=new vt),t.set(R*P,C*P).floor()},this.setDrawingBufferSize=function(t,n,i){R=t,C=n,P=i,e.width=Math.floor(t*i),e.height=Math.floor(n*i),this.setViewport(0,0,t,n)},this.getCurrentViewport=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument"),t=new St),t.copy(T)},this.getViewport=function(t){return t.copy(N)},this.setViewport=function(t,e,n,i){t.isVector4?N.set(t.x,t.y,t.z,t.w):N.set(t,e,n,i),q.viewport(T.copy(N).multiplyScalar(P).floor())},this.getScissor=function(t){return t.copy(B)},this.setScissor=function(t,e,n,i){t.isVector4?B.set(t.x,t.y,t.z,t.w):B.set(t,e,n,i),q.scissor(A.copy(B).multiplyScalar(P).floor())},this.getScissorTest=function(){return z},this.setScissorTest=function(t){q.setScissorTest(z=t)},this.setOpaqueSort=function(t){D=t},this.setTransparentSort=function(t){I=t},this.getClearColor=function(t){return void 0===t&&(console.warn("WebGLRenderer: .getClearColor() now requires a Color as an argument"),t=new tn),t.copy(ot.getClearColor())},this.setClearColor=function(){ot.setClearColor.apply(ot,arguments)},this.getClearAlpha=function(){return ot.getClearAlpha()},this.setClearAlpha=function(){ot.setClearAlpha.apply(ot,arguments)},this.clear=function(t,e,n){let i=0;(void 0===t||t)&&(i|=16384),(void 0===e||e)&&(i|=256),(void 0===n||n)&&(i|=1024),pt.clear(i)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){e.removeEventListener("webglcontextlost",xt,!1),e.removeEventListener("webglcontextrestored",_t,!1),it.dispose(),rt.dispose(),Z.dispose(),Q.dispose(),tt.dispose(),dt.dispose(),yt.dispose(),yt.removeEventListener("sessionstart",Mt),yt.removeEventListener("sessionend",Tt),Et.stop()},this.renderBufferImmediate=function(t,e){dt.initAttributes();const n=Z.get(t);t.hasPositions&&!n.position&&(n.position=pt.createBuffer()),t.hasNormals&&!n.normal&&(n.normal=pt.createBuffer()),t.hasUvs&&!n.uv&&(n.uv=pt.createBuffer()),t.hasColors&&!n.color&&(n.color=pt.createBuffer());const i=e.getAttributes();t.hasPositions&&(pt.bindBuffer(34962,n.position),pt.bufferData(34962,t.positionArray,35048),dt.enableAttribute(i.position),pt.vertexAttribPointer(i.position,3,5126,!1,0,0)),t.hasNormals&&
824(pt.bindBuffer(34962,n.normal),pt.bufferData(34962,t.normalArray,35048),dt.enableAttribute(i.normal),pt.vertexAttribPointer(i.normal,3,5126,!1,0,0)),t.hasUvs&&(pt.bindBuffer(34962,n.uv),pt.bufferData(34962,t.uvArray,35048),dt.enableAttribute(i.uv),pt.vertexAttribPointer(i.uv,2,5126,!1,0,0)),t.hasColors&&(pt.bindBuffer(34962,n.color),pt.bufferData(34962,t.colorArray,35048),dt.enableAttribute(i.color),pt.vertexAttribPointer(i.color,3,5126,!1,0,0)),dt.disableUnusedAttributes(),pt.drawArrays(4,0,t.count),t.count=0},this.renderBufferDirect=function(t,e,n,i,r,s){null===e&&(e=k);const a=r.isMesh&&r.matrixWorld.determinant()<0,o=It(t,e,i,r);q.setMaterial(i,a);let l=n.index;const c=n.attributes.position;if(null===l){if(void 0===c||0===c.count)return}else if(0===l.count)return;let h,u=1;!0===i.wireframe&&(l=$.getWireframeAttribute(n),u=2),(i.morphTargets||i.morphNormals)&&lt.update(r,n,i,o),dt.setup(r,i,o,n,l);let d=ct;null!==l&&(h=K.get(l),d=ht,d.setIndex(h));const p=null!==l?l.count:c.count,m=n.drawRange.start*u,f=n.drawRange.count*u,g=null!==s?s.start*u:0,v=null!==s?s.count*u:1/0,y=Math.max(m,g),x=Math.min(p,m+f,g+v)-1,_=Math.max(0,x-y+1);if(0!==_){if(r.isMesh)!0===i.wireframe?(q.setLineWidth(i.wireframeLinewidth*V()),d.setMode(1)):d.setMode(4);else if(r.isLine){let t=i.linewidth;void 0===t&&(t=1),q.setLineWidth(t*V()),r.isLineSegments?d.setMode(1):r.isLineLoop?d.setMode(2):d.setMode(3)}else r.isPoints?d.setMode(0):r.isSprite&&d.setMode(4);if(r.isInstancedMesh)d.renderInstances(y,_,r.count);else if(n.isInstancedBufferGeometry){const t=Math.min(n.instanceCount,n._maxInstanceCount);d.renderInstances(y,_,t)}else d.render(y,_)}},this.compile=function(t,e){d=rt.get(t),d.init(),t.traverseVisible((function(t){t.isLight&&t.layers.test(e.layers)&&(d.pushLight(t),t.castShadow&&d.pushShadow(t))})),d.setupLights(),t.traverse((function(e){const n=e.material;if(n)if(Array.isArray(n))for(let i=0;i<n.length;i++){Pt(n[i],t,e)}else Pt(n,t,e)}))};let bt=null;function Mt(){Et.stop()}function Tt(){Et.start()}const Et=new oi;function At(t,e,n,i){if(!1===t.visible)return;if(t.layers.test(e.layers))if(t.isGroup)n=t.renderOrder;else if(t.isLOD)!0===t.autoUpdate&&t.update(e);else if(t.isLight)d.pushLight(t),t.castShadow&&d.pushShadow(t);else if(t.isSprite){if(!t.frustumCulled||F.intersectsSprite(t)){i&&U.setFromMatrixPosition(t.matrixWorld).applyMatrix4(G);const e=tt.update(t),r=t.material;r.visible&&u.push(t,e,r,n,U.z,null)}}else if(t.isImmediateRenderObject)i&&U.setFromMatrixPosition(t.matrixWorld).applyMatrix4(G),u.push(t,null,t.material,n,U.z,null);else if((t.isMesh||t.isLine||t.isPoints)&&(t.isSkinnedMesh&&t.skeleton.frame!==Y.render.frame&&(t.skeleton.update(),t.skeleton.frame=Y.render.frame),!t.frustumCulled||F.intersectsObject(t))){i&&U.setFromMatrixPosition(t.matrixWorld).applyMatrix4(G);const e=tt.update(t),r=t.material;if(Array.isArray(r)){const i=e.groups;for(let s=0,a=i.length;s<a;s++){const a=i[s],o=r[a.materialIndex];o&&o.visible&&u.push(t,e,o,n,U.z,a)}}else r.visible&&u.push(t,e,r,n,U.z,null)}const r=t.children;for(let t=0,s=r.length;t<s;t++)At(r[t],e,n,i)}function Rt(t,e,n){const i=!0===e.isScene?e.overrideMaterial:null;for(let r=0,s=t.length;r<s;r++){const s=t[r],a=s.object,o=s.geometry,l=null===i?s.material:i,c=s.group;if(n.isArrayCamera){const t=n.cameras;for(let n=0,i=t.length;n<i;n++){const i=t[n];a.layers.test(i.layers)&&(q.viewport(T.copy(i.viewport)),d.setupLightsView(i),Ct(a,e,i,o,l,c))}}else Ct(a,e,n,o,l,c)}}function Ct(t,e,n,i,r,s){if(t.onBeforeRender(f,e,n,i,r,s),t.modelViewMatrix.multiplyMatrices(n.matrixWorldInverse,t.matrixWorld),t.normalMatrix.getNormalMatrix(t.modelViewMatrix),t.isImmediateRenderObject){const i=It(n,e,r,t);q.setMaterial(r),dt.reset(),function(t,e){t.render((function(t){f.renderBufferImmediate(t,e)}))}(t,i)}else f.renderBufferDirect(n,e,i,r,t,s);t.onAfterRender(f,e,n,i,r,s)}function Pt(t,e,n){!0!==e.isScene&&(e=k);const i=Z.get(t),r=d.state.lights,s=d.state.shadowsArray,a=r.state.version,o=et.getParameters(t,r.state,s,e,n),l=et.getProgramCacheKey(o);let c=i.programs;i.environment=t.isMeshStandardMaterial?e.environment:null,i.fog=e.fog,i.envMap=Q.get(t.envMap||i.environment),void 0===c&&(t.addEventListener("dispose",wt),c=new Map,i.programs=c);let h=c.get(l);if(void 0!==h){if(i.currentProgram===h&&i.lightsStateVersion===a)return Dt(t,o),h}else o.uniforms=et.getUniforms(t),t.onBuild(o,f),t.onBeforeCompile(o,f),h=et.acquireProgram(o,l),c.set(l,h),i.uniforms=o.uniforms;const u=i.uniforms;(t.isShaderMaterial||t.isRawShaderMaterial)&&!0!==t.clipping||(u.clippingPlanes=st.uniform),Dt(t,o),i.needsLights=function(t){return t.isMeshLambertMaterial||t.isMeshToonMaterial||t.isMeshPhongMaterial||t.isMeshStandardMaterial||t.isShadowMaterial||t.isShaderMaterial&&!0===t.lights}(t),i.lightsStateVersion=a,i.needsLights&&(u.ambientLightColor.value=r.state.ambient,u.lightProbe.value=r.state.probe,u.directionalLights.value=r.state.directional,u.directionalLightShadows.value=r.state.directionalShadow,u.spotLights.value=r.state.spot,u.spotLightShadows.value=r.state.spotShadow,u.rectAreaLights.value=r.state.rectArea,u.ltc_1.value=r.state.rectAreaLTC1,u.ltc_2.value=r.state.rectAreaLTC2,u.pointLights.value=r.state.point,u.pointLightShadows.value=r.state.pointShadow,u.hemisphereLights.value=r.state.hemi,u.directionalShadowMap.value=r.state.directionalShadowMap,u.directionalShadowMatrix.value=r.state.directionalShadowMatrix,u.spotShadowMap.value=r.state.spotShadowMap,u.spotShadowMatrix.value=r.state.spotShadowMatrix,u.pointShadowMap.value=r.state.pointShadowMap,u.pointShadowMatrix.value=r.state.pointShadowMatrix);const p=h.getUniforms(),m=Cr.seqWithValue(p.seq,u);return i.currentProgram=h,i.uniformsList=m,h}function Dt(t,e){const n=Z.get(t);n.outputEncoding=e.outputEncoding,n.instancing=e.instancing,n.numClippingPlanes=e.numClippingPlanes,n.numIntersection=e.numClipIntersection,n.vertexAlphas=e.vertexAlphas}
824function It(t,e,n,i){!0!==e.isScene&&(e=k),J.resetTextureUnits();const r=e.fog,s=n.isMeshStandardMaterial?e.environment:null,a=null===_?f.outputEncoding:_.texture.encoding,o=Q.get(n.envMap||s),l=!0===n.vertexColors&&i.geometry&&i.geometry.attributes.color&&4===i.geometry.attributes.color.itemSize,c=Z.get(n),h=d.state.lights;if(!0===O&&(!0===H||t!==S)){const e=t===S&&n.id===w;st.setState(n,t,e)}let u=!1;n.version===c.__version?c.needsLights&&c.lightsStateVersion!==h.state.version||c.outputEncoding!==a||i.isInstancedMesh&&!1===c.instancing?u=!0:i.isInstancedMesh||!0!==c.instancing?c.envMap!==o||n.fog&&c.fog!==r?u=!0:void 0===c.numClippingPlanes||c.numClippingPlanes===st.numPlanes&&c.numIntersection===st.numIntersection?c.vertexAlphas!==l&&(u=!0):u=!0:u=!0:(u=!0,c.__version=n.version);let p=c.currentProgram;!0===u&&(p=Pt(n,e,i));let m=!1,g=!1,v=!1;const y=p.getUniforms(),x=c.uniforms;if(q.useProgram(p.program)&&(m=!0,g=!0,v=!0),n.id!==w&&(w=n.id,g=!0),m||S!==t){if(y.setValue(pt,"projectionMatrix",t.projectionMatrix),j.logarithmicDepthBuffer&&y.setValue(pt,"logDepthBufFC",2/(Math.log(t.far+1)/Math.LN2)),S!==t&&(S=t,g=!0,v=!0),n.isShaderMaterial||n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshStandardMaterial||n.envMap){const e=y.map.cameraPosition;void 0!==e&&e.setValue(pt,U.setFromMatrixPosition(t.matrixWorld))}(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial)&&y.setValue(pt,"isOrthographic",!0===t.isOrthographicCamera),(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial||n.isShadowMaterial||n.skinning)&&y.setValue(pt,"viewMatrix",t.matrixWorldInverse)}if(n.skinning){y.setOptional(pt,i,"bindMatrix"),y.setOptional(pt,i,"bindMatrixInverse");const t=i.skeleton;if(t){const e=t.bones;if(j.floatVertexTextures){if(null===t.boneTexture){let n=Math.sqrt(4*e.length);n=mt(n),n=Math.max(n,4);const i=new Float32Array(n*n*4);i.set(t.boneMatrices);const r=new ii(i,n,n,E,b);t.boneMatrices=i,t.boneTexture=r,t.boneTextureSize=n}y.setValue(pt,"boneTexture",t.boneTexture,J),y.setValue(pt,"boneTextureSize",t.boneTextureSize)}else y.setOptional(pt,t,"boneMatrices")}}var M,T;return(g||c.receiveShadow!==i.receiveShadow)&&(c.receiveShadow=i.receiveShadow,y.setValue(pt,"receiveShadow",i.receiveShadow)),g&&(y.setValue(pt,"toneMappingExposure",f.toneMappingExposure),c.needsLights&&(T=v,(M=x).ambientLightColor.needsUpdate=T,M.lightProbe.needsUpdate=T,M.directionalLights.needsUpdate=T,M.directionalLightShadows.needsUpdate=T,M.pointLights.needsUpdate=T,M.pointLightShadows.needsUpdate=T,M.spotLights.needsUpdate=T,M.spotLightShadows.needsUpdate=T,M.rectAreaLights.needsUpdate=T,M.hemisphereLights.needsUpdate=T),r&&n.fog&&nt.refreshFogUniforms(x,r),nt.refreshMaterialUniforms(x,n,P,C),Cr.upload(pt,c.uniformsList,x,J)),n.isShaderMaterial&&!0===n.uniformsNeedUpdate&&(Cr.upload(pt,c.uniformsList,x,J),n.uniformsNeedUpdate=!1),n.isSpriteMaterial&&y.setValue(pt,"center",i.center),y.setValue(pt,"modelViewMatrix",i.modelViewMatrix),y.setValue(pt,"normalMatrix",i.normalMatrix),y.setValue(pt,"modelMatrix",i.matrixWorld),p}Et.setAnimationLoop((function(t){bt&&bt(t)})),"undefined"!=typeof window&&Et.setContext(window),this.setAnimationLoop=function(t){bt=t,yt.setAnimationLoop(t),null===t?Et.stop():Et.start()},yt.addEventListener("sessionstart",Mt),yt.addEventListener("sessionend",Tt),this.render=function(t,e){let n,i;if(void 0!==arguments[2]&&(console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead."),n=arguments[2]),void 0!==arguments[3]&&(console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead."),i=arguments[3]),void 0!==e&&!0!==e.isCamera)return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");if(!0===g)return;!0===t.autoUpdate&&t.updateMatrixWorld(),null===e.parent&&e.updateMatrixWorld(),!0===yt.enabled&&!0===yt.isPresenting&&(e=yt.getCamera(e)),!0===t.isScene&&t.onBeforeRender(f,t,e,n||_),d=rt.get(t,m.length),d.init(),m.push(d),G.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),F.setFromProjectionMatrix(G),H=this.localClippingEnabled,O=st.init(this.clippingPlanes,H,e),u=it.get(t,p.length),u.init(
824),p.push(u),At(t,e,0,f.sortObjects),u.finish(),!0===f.sortObjects&&u.sort(D,I),!0===O&&st.beginShadows();const r=d.state.shadowsArray;at.render(r,t,e),d.setupLights(),d.setupLightsView(e),!0===O&&st.endShadows(),!0===this.info.autoReset&&this.info.reset(),void 0!==n&&this.setRenderTarget(n),ot.render(u,t,e,i);const s=u.opaque,a=u.transparent;s.length>0&&Rt(s,t,e),a.length>0&&Rt(a,t,e),null!==_&&(J.updateRenderTargetMipmap(_),J.updateMultisampleRenderTarget(_)),!0===t.isScene&&t.onAfterRender(f,t,e),q.buffers.depth.setTest(!0),q.buffers.depth.setMask(!0),q.buffers.color.setMask(!0),q.setPolygonOffset(!1),dt.resetDefaultState(),w=-1,S=null,m.pop(),d=m.length>0?m[m.length-1]:null,p.pop(),u=p.length>0?p[p.length-1]:null},this.getActiveCubeFace=function(){return v},this.getActiveMipmapLevel=function(){return y},this.getRenderTarget=function(){return _},this.setRenderTarget=function(t,e=0,n=0){_=t,v=e,y=n,t&&void 0===Z.get(t).__webglFramebuffer&&J.setupRenderTarget(t);let i=null,r=!1,s=!1;if(t){const n=t.texture;(n.isDataTexture3D||n.isDataTexture2DArray)&&(s=!0);const a=Z.get(t).__webglFramebuffer;t.isWebGLCubeRenderTarget?(i=a[e],r=!0):i=t.isWebGLMultisampleRenderTarget?Z.get(t).__webglMultisampledFramebuffer:a,T.copy(t.viewport),A.copy(t.scissor),L=t.scissorTest}else T.copy(N).multiplyScalar(P).floor(),A.copy(B).multiplyScalar(P).floor(),L=z;if(q.bindFramebuffer(36160,i),q.viewport(T),q.scissor(A),q.setScissorTest(L),r){const i=Z.get(t.texture);pt.framebufferTexture2D(36160,36064,34069+e,i.__webglTexture,n)}else if(s){const i=Z.get(t.texture),r=e||0;pt.framebufferTextureLayer(36160,36064,i.__webglTexture,n||0,r)}},this.readRenderTargetPixels=function(t,e,n,i,r,s,a){if(!t||!t.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let o=Z.get(t).__webglFramebuffer;if(t.isWebGLCubeRenderTarget&&void 0!==a&&(o=o[a]),o){q.bindFramebuffer(36160,o);try{const a=t.texture,o=a.format,l=a.type;if(o!==E&&ut.convert(o)!==pt.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");const c=l===M&&(W.has("EXT_color_buffer_half_float")||j.isWebGL2&&W.has("EXT_color_buffer_float"));if(!(l===x||ut.convert(l)===pt.getParameter(35738)||l===b&&(j.isWebG
vendor: 18,525 bytes, line 824
824L2||W.has("OES_texture_float")||W.has("WEBGL_color_buffer_float"))||c))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");36053===pt.checkFramebufferStatus(36160)?e>=0&&e<=t.width-i&&n>=0&&n<=t.height-r&&pt.readPixels(e,n,i,r,ut.convert(o),ut.convert(l),s):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{const t=null!==_?Z.get(_).__webglFramebuffer:null;q.bindFramebuffer(36160,t)}}},this.copyFramebufferToTexture=function(t,e,n=0){const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),s=Math.floor(e.image.height*i),a=ut.convert(e.format);J.setTexture2D(e,0),pt.copyTexImage2D(3553,n,a,t.x,t.y,r,s,0),q.unbindTexture()},this.copyTextureToTexture=function(t,e,n,i=0){const r=e.image.width,s=e.image.height,a=ut.convert(n.format),o=ut.convert(n.type);J.setTexture2D(n,0),pt.pixelStorei(37440,n.flipY),pt.pixelStorei(37441,n.premultiplyAlpha),pt.pixelStorei(3317,n.unpackAlignment),e.isDataTexture?pt.texSubImage2D(3553,i,t.x,t.y,r,s,a,o,e.image.data):e.isCompressedTexture?pt.compressedTexSubImage2D(3553,i,t.x,t.y,e.mipmaps[0].width,e.mipmaps[0].height,a,e.mipmaps[0].data):pt.texSubImage2D(3553,i,t.x,t.y,a,o,e.image),0===i&&n.generateMipmaps&&pt.generateMipmap(3553),q.unbindTexture()},this.copyTextureToTexture3D=function(t,e,n,i,r=0){if(f.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const{width:s,height:a,data:o}=n.image,l=ut.convert(i.format),c=ut.convert(i.type);let h;if(i.isDataTexture3D)J.setTexture3D(i,0),h=32879;else{if(!i.isDataTexture2DArray)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");J.setTexture2DArray(i,0),h=35866}pt.pixelStorei(37440,i.flipY),pt.pixelStorei(37441,i.premultiplyAlpha),pt.pixelStorei(3317,i.unpackAlignment);const u=pt.getParameter(3314),d=pt.getParameter(32878),p=pt.getParameter(3316),m=pt.getParameter(3315),g=pt.getParameter(32877);pt.pixelStorei(3314,s),pt.pixelStorei(32878,a),pt.pixelStorei(3316,t.min.x),pt.pixelStorei(3315,t.min.y),pt.pixelStorei(32877,t.min.z),pt.texSubImage3D(h,r,e.x,e.y,e.z,t.max.x-t.min.x+1,t.max.y-t.min.y+1,t.max.z-t.min.z+1,l,c,o),pt.pixelStorei(3314,u),pt.pixelStorei(32878,d),pt.pixelStorei(3316,p),pt.pixelStorei(3315,m),pt.pixelStorei(32877,g),0===r&&i.generateMipmaps&&pt.generateMipmap(h),q.unbindTexture()},this.initTexture=function(t){J.setTexture2D(t,0),q.unbindTexture()},this.resetState=function(){v=0,y=0,_=null,q.reset(),dt.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}class bs extends ws{}bs.prototype.isWebGL1Renderer=!0;class Ms{constructor(t,e=25e-5){this.name="",this.color=new tn(t),this.density=e}clone(){return new Ms(this.color,this.density)}toJSON(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}}Ms.prototype.isFogExp2=!0;class Ss{constructor(t,e=1,n=1e3){this.name="",this.color=new tn(t),this.near=e,this.far=n}clone(){return new Ss(this.color,this.near,this.far)}toJSON(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}}Ss.prototype.isFog=!0;class Ts extends Ce{constructor(){super(),this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.autoUpdate=t.autoUpdate,this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.background&&(e.object.background=this.background.toJSON(t)),null!==this.environment&&(e.object.environment=this.environment.toJSON(t)),null!==this.fog&&(e.object.fog=this.fog.toJSON()),e}}Ts.prototype.isScene=!0;class Es{constructor(t,e){this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=et,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=ct(),this.onUploadCallback=function(){}}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,n){t*=this.stride,n*=e.stride;for(let i=0,r=this.stride;i<r;i++)this.array[t+i]=e.array[n+i];return this}set(t,e=0){return this.array.set(t,e),this}clone(t){void 0===t.arrayBuffers&&(t.arrayBuffers={}),void 0===this.array.buffer._uuid&&(this.array.buffer._uuid=ct()),void 0===t.arrayBuffers[this.array.buffer._uuid]&&(t.arrayBuffers[this.array.buffer._uuid]=this.array.slice(0).buffer);const e=new this.array.constructor(t.arrayBuffers[this.array.buffer._uuid]),n=new Es(e,this.stride);return n.setUsage(this.usage),n}onUpload(t){return this.onUploadCallback=t,this}toJSON(t){return void 0===t.arrayBuffers&&(t.arrayBuffers={}),void 0===this.array.buffer._uuid&&(this.array.buffer._uuid=ct()),void 0===t.arrayBuffers[this.array.buffer._uuid]&&(t.arrayBuffers[this.array.buffer._uuid]=Array.prototype.slice.call(new Uint32Array(this.array.buffer))),{uuid:this.uuid,buffer:this.array.buffer._uuid,type:this.array.constructor.name,stride:this.stride}}}Es.prototype.isInterleavedBuffer=!0;const As=new Lt;class Ls{constructor(t,e,n,i){this.name="",this.data=t,this.itemSize=e,this.offset=n,this.normalized=!0===i}get count(){return this.data.count}get array(){return this.data.array}set needsUpdate(t){this.data.needsUpdate=t}applyMatrix4(t){for(let e=0,n=this.data.count;e<n;e++)As.x=this.getX(e),As.y=this.getY(e),As.z=this.getZ(e),As.applyMatrix4(t),this.setXYZ(e,As.x,As.y,As.z);return this}applyNormalMatrix(t){for(let e=0,n=this.count;e<n;e++)As.x=this.getX(e),As.y=this.getY(e),As.z=this.getZ(e),As.applyNormalMatrix(t),this.setXYZ(e,As.x,As.y,As.z);return this}transformDirection(t){for(let e=0,n=this.count;e<n;e++)As.x=this.getX(e),As.y=this.getY(e),As.z=this.getZ(e),As.transformDirection(t),this.setXYZ(e,As.x,As.y,As.z);return this}setX(t,e){return this.data.array[t*this.data.stride+this.offset]=e,this}setY(t,e){return this.data.array[t*this.data.stride+this.offset+1]=e,this}setZ(t,e){return this.data.array[t*this.data.stride+this.offset+2]=e,this}setW(t,e){return this.data.array[t*this.data.stride+this.offset+3]=e,this}getX(t){return this.data.array[t*this.data.stride+this.offset]}getY(t){return this.data.array[t*this.data.stride+this.offset+1]}getZ(t){return this.data.array[t*this.data.stride+this.offset+2]}getW(t){return this.data.array[t*this.data.stride+this.offset+3]}setXY(t,e,n){return t=t*this.data.stride+this.offset,this.data.array[t+0]=e,this.data.array[t+1]=n,this}setXYZ(t,e,n,i){return t=t*this.data.stride+this.offset,this.data.array[t+0]=e,this.data.array[t+1]=n,this.data.array[t+2]=i,this}setXYZW(t,e,n,i,r){return t=t*this.data.stride+this.offset,this.data.array[t+0]=e,this.data.array[t+1]=n,this.data.array[t+2]=i,this.data.array[t+3]=r,this}clone(t){if(void 0===t){console.log("THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.");const t=[];for(let e=0;e<this.count;e++){const n=e*this.data.stride+this.offset;for(let e=0;e<this.itemSize;e++)t.push(this.data.array[n+e])}return new sn(new this.array.constructor(t),this.itemSize,this.normalized)}return void 0===t.interleavedBuffers&&(t.interleavedBuffers={}),void 0===t.interleavedBuffers[this.data.uuid]&&(t.interleavedBuffers[this.data.uuid]=this.data.clone(t)),new Ls(t.interleavedBuffers[this.data.uuid],this.itemSize,this.offset,this.normalized)}toJSON(t){if(void 0===t){console.log("THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.");const t=[];for(let e=0;e<this.count;e++){const n=e*this.data.stride+this.offset;for(let e=0;e<this.itemSize;e++)t.push(this.data.array[n+e])}return{itemSize:this.itemSize,type:this.array.constructor.name,array:t,normalized:this.normalized}}return void 0===t.interleavedBuffers&&(t.interleavedBuffers={}),void 0===t.interleavedBuffers[this.data.uuid]&&(t.interleavedBuffers[this.data.uuid]=this.data.toJSON(t)),{isInterleavedBufferAttribute:!0,itemSize:this.itemSize,data:this.data.uuid,offset:this.offset,normalized:this.normalized}}}Ls.prototype.isInterleavedBufferAttribute=!0;class Rs extends Xe{constructor(t){super(),this.type="SpriteMaterial",this.color=new tn(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.rotation=t.rotation,this.sizeAttenuation=t.sizeAttenuation,this}}let Cs;Rs.prototype.isSpriteMaterial=!0;const Ps=new Lt,Ds=new Lt,Is=new Lt,Ns=new vt,Bs=new vt,zs=new se,Fs=new Lt,Os=new Lt,Hs=new Lt,Gs=new vt,Us=new vt,ks=new vt;class Vs extends Ce{constructor(t){if(super(),this.type="Sprite",void 0===Cs){Cs=new En;const t=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),e=new Es(t,5);Cs.setIndex([0,1,2,0,2,3]),Cs.setAttribute("position",new Ls(e,3,0,!1)),Cs.setAttribute("uv",new Ls(e,2,3,!1))}this.geometry=Cs,this.material=void 0!==t?t:new Rs,this.center=new vt(.5,.5)}raycast(t,e){null===t.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'),Ds.setFromMatrixScale(this.matrixWorld),zs.copy(t.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(t.camera.matrixWorldInverse,this.matrixWorld),Is.setFromMatrixPosition(this.modelViewMatrix),t.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&Ds.multiplyScalar(-Is.z);const n=this.material.rotation;let i,r;0!==n&&(r=Math.cos(n),i=Math.sin(n));const s=this.center;Ws(Fs.set(-.5,-.5,0),Is,s,Ds,i,r),Ws(Os.set(.5,-.5,0),Is,s,Ds,i,r),Ws(Hs.set(.5,.5,0),Is,s,Ds,i,r),Gs.set(0,0),Us.set(1,0),ks.set(1,1);let a=t.ray.intersectTriangle(Fs,Os,Hs,!1,Ps);if(null===a&&(Ws(Os.set(-.5,.5,0),Is,s,Ds,i,r),Us.set(0,1),a=t.ray.intersectTriangle(Fs,Hs,Os,!1,Ps),null===a))return;const o=t.ray.origin.distanceTo(Ps);o<t.near||o>t.far||e.push({distance:o,point:Ps.clone(),uv:je.getUV(Ps,Fs,Os,Hs,Gs,Us,ks,new vt),face:null,object:this})}copy(t){return super.copy(t),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function Ws(t,e,n,i,r,s){Ns.subVectors(t,n).addScalar(.5).multiply(i),void 0!==r?(Bs.x=s*Ns.x-r*Ns.y,Bs.y=r*Ns.x+s*Ns.y):Bs.copy(Ns),t.copy(e),t.x+=Bs.x,t.y+=Bs.y,t.applyMatrix4(zs)}Vs.prototype.isSprite=!0;const js=new Lt,qs=new Lt;class Xs extends Ce{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,n=e.length;t<n;t++){const n=e[t];this.addLevel(n.object.clone(),n.distance)}return this.autoUpdate=t.autoUpdate,this}addLevel(t,e=0){e=Math.abs(e);const n=this.levels;let i;for(i=0;i<n.length&&!(e<n[i].distance);i++);return n.splice(i,0,{distance:e,object:t}),this.add(t),this}getCurrentLevel(){return this._currentLevel}getObjectForDistance(t){const e=this.levels;if(e.length>0){let n,i;for(n=1,i=e.length;n<i&&!(t<e[n].distance);n++);return e[n-1].object}return null}raycast(t,e){if(this.levels.length>0){js.setFromMatrixPosition(this.matrixWorld);const n=t.ray.origin.distanceTo(js);this.getObjectForDistance(n).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){js.setFromMatrixPosition(t.matrixWorld),qs.setFromMatrixPosition(this.matrixWorld);const n=js.distanceTo(qs)/t.zoom;let i,r;for(e[0].object.visible=!0,i=1,r=e.length;i<r&&n>=e[i].distance;i++)e[i-1].object.visible=!1,e[i].object.visible=!0;for(this._currentLevel=i-1;i<r;i++)e[i].object.visible=!1}}toJSON(t){const e=super.toJSON(t);!1===this.autoUpdate&&(e.object.autoUpdate=!1),e.object.levels=[];const n=this.levels;for(let t=0,i=n.length;t<i;t++){const i=n[t];e.object.levels.push({object:i.object.uuid,distance:i.distance})}return e}}const Ys=new Lt,Zs=new St,Js=new St,Qs=new Lt,Ks=new se;class $s extends Wn{constructor(t,e){super(t,e),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new se,this.bindMatrixInverse=new se}copy(t){return super.copy(t),this.bindMode=t.bindMode,this.bindMatrix.copy(t.bindMatrix),this.bindMatrixInverse.copy(t.bindMatrixInverse),this.skeleton=t.skeleton,this}bind(t,e){this.skeleton=t,void 0===e&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),e=this.matrixWorld),this.bindMatrix.copy(e),this.bindMatrixInverse.copy(e).invert()}pose(){this.skeleton.pose()}normalizeSkinWeights(){const t=new St,e=this.geometry.attributes.skinWeight;for(let n=0,i=e.count;n<i;n++){t.x=e.getX(n),t.y=e.getY(n),t.z=e.getZ(n),t.w=e.getW(n);const i=1/t.manhattanLength();i!==1/0?t.multiplyScalar(i):t.set(1,0,0,0),e.setXYZW(n,t.x,t.y,t.z,t.w)}}updateMatrixWorld(t){super.updateMatrixWorld(t),"attached"===this.bindMode?this.bindMatrixInverse.copy(this.matrixWorld).invert():"detached"===this.bindMode?this.bindMatrixInverse.copy(this.bindMatrix).invert():console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)}boneTransform(t,e){const n=this.skeleton,i=this.geometry;Zs.fromBufferAttribute(i.attributes.skinIndex,t),Js.fromBufferAttribute(i.attributes.skinWeight,t),Ys.fromBufferAttribute(i.attributes.position,t).applyMatrix4(this.bindMatrix),e.set(0,0,0);for(let t=0;t<4;t++){const i=Js.getComponent(t);if(0!==i){const r=Zs.getComponent(t);Ks.multiplyMatrices(n.bones[r].matrixWorld,n.boneInverses[r]),e.addScaledVector(Qs.copy(Ys).applyMatrix4(Ks),i)}}return e.applyMatrix4(this.bindMatrixInverse)}}$s.prototype.isSkinnedMesh=!0;class ta extends Ce{constructor(){super(),this.type="Bone"}}ta.prototype.isBone=!0;const ea=new se,na=new se;class ia{constructor(t=[],e=[]){this.uuid=ct(),this.bones=t.slice(0),this.boneInverses=e,this.boneMatrices=null,this.boneTexture=null,this.boneTextureSize=0,this.frame=-1,this.init()}init(){const t=this.bones,e=this.boneInverses;if(this.boneMatrices=new Float32Array(16*t.length),0===e.length)this.calculateInverses();else if(t.length!==e.length){console.warn("THREE.Skeleton: Number of inverse bone matrices does not match amount of bones."),this.boneInverses=[];for(let t=0,e=this.bones.length;t<e;t++)this.boneInverses.push(new se)}}calculateInverses(){this.boneInverses.length=0;for(let t=0,e=this.bones.length;t<e;t++){const e=new se;this.bones[t]&&e.copy(this.bones[t].matrixWorld).invert(),this.boneInverses.push(e)}}pose(){for(let t=0,e=this.bones.length;t<e;t++){const e=this.bones[t];e&&e.matrixWorld.copy(this.boneInverses[t]).invert()}for(let t=0,e=this.bones.length;t<e;t++){const e=this.bones[t];e&&(e.parent&&e.parent.isBone?(e.matrix.copy(e.parent.matrixWorld).invert(),e.matrix.multiply(e.matrixWorld)):e.matrix.copy(e.matrixWorld),e.matrix.decompose(e.position,e.quaternion,e.scale))}}update(){const t=this.bones,e=this.boneInverses,n=this.boneMatrices,i=this.boneTexture;for(let i=0,r=t.length;i<r;i++){const r=t[i]?t[i].matrixWorld:na;ea.multiplyMatrices(r,e[i]),ea.toArray(n,16*i)}null!==i&&(i.needsUpdate=!0)}clone(){return new ia(this.bones,this.boneInverses)}getBoneByName(t){for(let e=0,n=this.bones.length;e<n;e++){const n=this.bones[e];if(n.name===t)return n}}dispose(){null!==this.boneTexture&&(this.boneTexture.dispose(),this.boneTexture=null)}fromJSON(t,e){this.uuid=t.uuid;for(let n=0,i=t.bones.length;n<i;n++){const i=t.bones[n];let r=e[i];void 0===r&&(console.warn("THREE.Skeleton: No bone found with UUID:",i),r=new ta),this.bones.push(r),this.boneInverses.push((new se).fromArray(t.boneInverses[n]))}return this.init(),this}toJSON(){const t={metadata:{version:4.5,type:"Skeleton",generator:"Skeleton.toJSON"},bones:[],boneInverses:[]};t.uuid=this.uuid;const e=this.bones,n=this.boneInverses;for(let i=0,r=e.length;i<r;i++){const r=e[i];t.bones.push(r.uuid);const s=n[i];t.boneInverses.push(s.toArray())}return t}}const ra=new se,sa=new se,aa=[],oa=new Wn;class la extends Wn{constructor(t,e,n){super(t,e),this.instanceMatrix=new sn(new Float32Array(16*n),16),this.instanceColor=null,this.count=n,this.frustumCulled=!1}copy(t){return super.copy(t),this.instanceMatrix.copy(t.instanceMatrix),null!==t.instanceColor&&(this.instanceColor=t.instanceColor.clone()),this.count=t.count,this}getColorAt(t,e){e.fromArray(this.instanceColor.array,3*t)}getMatrixAt(t,e){e.fromArray(this.instanceMatrix.array,16*t)}raycast(t,e){const n=this.matrixWorld,i=this.count;if(oa.geometry=this.geometry,oa.material=this.material,void 0!==oa.material)for(let r=0;r<i;r++){this.getMatrixAt(r,ra),sa.multiplyMatrices(n,ra),oa.matrixWorld=sa,oa.raycast(t,aa);for(let t=0,n=aa.length;t<n;t++){const n=aa[t];n.instanceId=r,n.object=this,e.push(n)}aa.length=0}}setColorAt(t,e){null===this.instanceColor&&(this.instanceColor=new sn(new Float32Array(3*this.count),3)),e.toArray(this.instanceColor.array,3*t)}setMatrixAt(t,e){e.toArray(this.instanceMatrix.array,16*t)}updateMorphTargets(){}dispose(){this.dispatchEvent({type:"dispose"})}}la.prototype.isInstancedMesh=!0;class ca extends Xe{constructor(t){super(),this.type="LineBasicMaterial",this.color=new tn(16777215),this.linewidth=1,this.linecap="round",this.linejoin="round",this.morphTargets=!1,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.linewidth=t.linewidth,this.linecap=t.linecap,this.linejoin=t.linejoin,this.morphTargets=t.morphTargets,this}}ca.prototype.isLineBasicMaterial=!0;const ha=new Lt,ua=new Lt,da=new se,pa=new re,ma=new Jt;class fa extends Ce{constructor(t=new En,e=new ca){super(),this.type="Line",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t){return super.copy(t),this.material=t.material,this.geometry=t.geometry,this}computeLineDistances(){const t=this.geometry;if(t.isBufferGeometry)if(null===t.index){const e=t.attributes.position,n=[0];for(let t=1,i=e.count;t<i;t++)ha.fromBufferAttribute(e,t-1),ua.fromBufferAttribute(e,t),n[t]=n[t-1],n[t]+=ha.distanceTo(ua);t.setAttribute("lineDistance",new mn(n,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else t.isGeometry&&console.error("THREE.Line.computeLineDistances() n
824o longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");return this}raycast(t,e){const n=this.geometry,i=this.matrixWorld,r=t.params.Line.threshold,s=n.drawRange;if(null===n.boundingSphere&&n.computeBoundingSphere(),ma.copy(n.boundingSphere),ma.applyMatrix4(i),ma.radius+=r,!1===t.ray.intersectsSphere(ma))return;da.copy(i).invert(),pa.copy(t.ray).applyMatrix4(da);const a=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a,l=new Lt,c=new Lt,h=new Lt,u=new Lt,d=this.isLineSegments?2:1;if(n.isBufferGeometry){const i=n.index,r=n.attributes.position;if(null!==i){for(let n=Math.max(0,s.start),a=Math.min(i.count,s.start+s.count)-1;n<a;n+=d){const s=i.getX(n),a=i.getX(n+1);l.fromBufferAttribute(r,s),c.fromBufferAttribute(r,a);if(pa.distanceSqToSegment(l,c,u,h)>o)continue;u.applyMatrix4(this.matrixWorld);const d=t.ray.origin.distanceTo(u);d<t.near||d>t.far||e.push({distance:d,point:h.clone().applyMatrix4(this.matrixWorld),index:n,face:null,faceIndex:null,object:this})}}else{for(let n=Math.max(0,s.start),i=Math.min(r.count,s.start+s.count)-1;n<i;n+=d){l.fromBufferAttribute(r,n),c.fromBufferAttribute(r,n+1);if(pa.distanceSqToSegment(l,c,u,h)>o)continue;u.applyMatrix4(this.matrixWorld);const i=t.ray.origin.distanceTo(u);i<t.near||i>t.far||e.push({distance:i,point:h.clone().applyMatrix4(this.matrixWorld),index:n,face:null,faceIndex:null,object:this})}}}else n.isGeometry&&console.error("THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}updateMorphTargets(){const t=this.geometry;if(t.isBufferGeometry){const e=t.morphAttributes,n=Object.keys(e);if(n.length>0){const t=e[n[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,n=t.length;e<n;e++){const n=t[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[n]=e}}}}else{const e=t.morphTargets;void 0!==e&&e.length>0&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}fa.prototype.isLine=!0;const ga=new Lt,va=new Lt;class ya extends fa{constructor(t,e){super(t,e),this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(t.isBufferGeometry)if(null===t.index){const e=t.attributes.position,n=[];for(let t=0,i=e.count;t<i;t+=2)ga.fromBufferAttribute(e,t),va.fromBufferAttribute(e,t+1),n[t]=0===t?0:n[t-1],n[t+1]=n[t]+ga.distanceTo(va);t.setAttribute("lineDistance",new mn(n,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else t.isGeometry&&console.error("THREE.LineSegments.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");return this}}ya.prototype.isLineSegments=!0;class xa extends fa{constructor(t,e){super(t,e),this.type="LineLoop"}}xa.prototype.isLineLoop=!0;class _a extends Xe{constructor(t){super(),this.type="PointsMaterial",this.color=new tn(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.morphTargets=!1,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.size=t.size,this.sizeAttenuation=t.sizeAttenuation,this.morphTargets=t.morphTargets,this}}_a.prototype.isPointsMaterial=!0;const wa=new se,ba=new re,Ma=new Jt,Sa=new Lt;class Ta extends Ce{constructor(t=new En,e=new _a){super(),this.type="Points",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t){return super.copy(t),this.material=t.material,this.geometry=t.geometry,this}raycast(t,e){const n=this.geometry,i=this.matrixWorld,r=t.params.Points.threshold,s=n.drawRange;if(null===n.boundingSphere&&n.computeBoundingSphere(),Ma.copy(n.boundingSphere),Ma.applyMatrix4(i),Ma.radius+=r,!1===t.ray.intersectsSphere(Ma))return;wa.copy(i).invert(),ba.copy(t.ray).applyMatrix4(wa);const a=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a;if(n.isBufferGeometry){const r=n.index,a=n.attributes.position;if(null!==r){for(let n=Math.max(0,s.start),l=Math.min(r.count,s.start+s.count);n<l;n++){const s=r.getX(n);Sa.fromBufferAttribute(a,s),Ea(Sa,s,o,i,t,e,this)}}else{for(let n=Math.max(0,s.start),r=Math.min(a.count,s.start+s.count);n<r;n++)Sa.fromBufferAttribute(a,n),Ea(Sa,n,o,i,t,e,this)}}else console.error("THREE.Points.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}updateMorphTargets(){const t=this.geometry;if(t.isBufferGeometry){const e=t.morphAttributes,n=Object.keys(e);if(n.length>
vendor: 4,123 bytes, line 824
8240){const t=e[n[0]];if(void 0!==t){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let e=0,n=t.length;e<n;e++){const n=t[e].name||String(e);this.morphTargetInfluences.push(0),this.morphTargetDictionary[n]=e}}}}else{const e=t.morphTargets;void 0!==e&&e.length>0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}function Ea(t,e,n,i,r,s,a){const o=ba.distanceSqToPoint(t);if(o<n){const n=new Lt;ba.closestPointToPoint(t,n),n.applyMatrix4(i);const l=r.ray.origin.distanceTo(n);if(l<r.near||l>r.far)return;s.push({distance:l,distanceToRay:Math.sqrt(o),point:n,index:e,face:null,object:a})}}Ta.prototype.isPoints=!0;class Aa extends bt{constructor(t,e,n,i,r,s,a,o,l){super(t,e,n,i,r,s,a,o,l),this.format=void 0!==a?a:T,this.minFilter=void 0!==s?s:g,this.magFilter=void 0!==r?r:g,this.generateMipmaps=!1;const c=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){c.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}Aa.prototype.isVideoTexture=!0;class La extends bt{constructor(t,e,n,i,r,s,a,o,l,c,h,u){super(null,s,a,o,l,c,i,r,h,u),this.image={width:e,height:n},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}La.prototype.isCompressedTexture=!0;class Ra extends bt{constructor(t,e,n,i,r,s,a,o,l){super(t,e,n,i,r,s,a,o,l),this.needsUpdate=!0}}Ra.prototype.isCanvasTexture=!0;class Ca extends bt{constructor(t,e,n,i,r,s,a,o,l,c){if((c=void 0!==c?c:A)!==A&&c!==L)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===n&&c===A&&(n=_),void 0===n&&c===L&&(n=S),super(null,i,r,s,a,o,c,n,l),this.image={width:t,height:e},this.magFilter=void 0!==a?a:p,this.minFilter=void 0!==o?o:p,this.flipY=!1,this.generateMipmaps=!1}}Ca.prototype.isDepthTexture=!0;class Pa extends En{constructor(t=1,e=8,n=0,i=2*Math.PI){super(),this.type="CircleGeometry",this.parameters={radius:t,segments:e,thetaStart:n,thetaLength:i},e=Math.max(3,e);const r=[],s=[],a=[],o=[],l=new Lt,c=new vt;s.push(0,0,0),a.push(0,0,1),o.push(.5,.5);for(let r=0,h=3;r<=e;r++,h+=3){const u=n+r/e*i;l.x=t*Math.cos(u),l.y=t*Math.sin(u),s.push(l.x,l.y,l.z),a.push(0,0,1),c.x=(s[h]/t+1)/2,c.y=(s[h+1]/t+1)/2,o.push(c.x,c.y)}for(let t=1;t<=e;t++)r.push(t,t+1,0);this.setIndex(r),this.setAttribute("position",new mn(s,3)),this.setAttribute("normal",new mn(a,3)),this.setAttribute("uv",new mn(o,2))}}class Da extends En{constructor(t=1,e=1,n=1,i=8,r=1,s=!1,a=0,o=2*Math.PI){super(),this.type="CylinderGeometry",this.parameters={radiusTop:t,radiusBottom:e,height:n,radialSegments:i,heightSegments:r,openEnded:s,thetaStart:a,thetaLength:o};const l=this;i=Math.floor(i),r=Math.floor(r);const c=[],h=[],u=[],d=[];let p=0;const m=[],f=n/2;let g=0;function v(n){const r=p,s=new vt,m=new Lt;let v=0;const y=!0===n?t:e,x=!0===n?1:-1;for(let t=1;t<=i;t++)h.push(0,f*x,0),u.push(0,x,0),d.push(.5,.5),p++;const _=p;for(let t=0;t<=i;t++){const e=t/i*o+a,n=Math.cos(e),r=Math.sin(e);m.x=y*r,m.y=f*x,m.z=y*n,h.push(m.x,m.y,m.z),u.push(0,x,0),s.x=.5*n+.5,s.y=.5*r*x+.5,d.push(s.x,s.y),p++}for(let t=0;t<i;t++){const e=r+t,i=_+t;!0===n?c.push(i,i+1,e):c.push(i+1,i,e),v+=3}l.addGroup(g,v,!0===n?1:2),g+=v}!function(){const s=new Lt,v=new Lt;let y=0;const x=(e-t)/n;for(let l=0;l<=r;l++){const c=[],g=l/r,y=g*(e-t)+t;for(let t=0;t<=i;t++){const e=t/i,r=e*o+a,l=Math.sin(r),m=Math.cos(r);v.x=y*l,v.y=-g*n+f,v.z=y*m,h.push(v.x,v.y,v.z),s.set(l,x,m).normalize(),u.push(s.x,s.y,s.z),d.push(e,1-g),c.push(p++)}m.push(c)}for(let t=0;t<i;t++)for(let e=0;e<r;e++){const n=m[e][t],i=m[e+1][t],r=m[e+1][t+1],s=m[e][t+1];c.push(n,i,s),c.push(i,r,s),y+=6}l.addGroup(g,y,0),g+=y}(),!1===s&&(t>0&&v(!0),e>0&&v(!1)),this.setIndex(c),this.setAttribute("position",new mn(h,3)),this.setAttribute("normal",new mn(u,3)),this.setAttribute("uv",new mn(d,2))}}class Ia extends Da{constructor(t=1,e=1,n=8,i=1,r=!1,s=0,a=2*Math.PI){super(0,t,e,n,i,r,s,a),this.type="C
824oneGeometry",this.parameters={radius:t,height:e,radialSegments:n,heightSegments:i,openEnded:r,thetaStart:s,thetaLength:a}}}class Na extends En{constructor(t,e,n=1,i=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:n,detail:i};const r=[],s=[];function a(t,e,n,i){const r=i+1,s=[];for(let i=0;i<=r;i++){s[i]=[];const a=t.clone().lerp(n,i/r),o=e.clone().lerp(n,i/r),l=r-i;for(let t=0;t<=l;t++)s[i][t]=0===t&&i===r?a:a.clone().lerp(o,t/l)}for(let t=0;t<r;t++)for(let e=0;e<2*(r-t)-1;e++){const n=Math.floor(e/2);e%2==0?(o(s[t][n+1]),o(s[t+1][n]),o(s[t][n])):(o(s[t][n+1]),o(s[t+1][n+1]),o(s[t+1][n]))}}function o(t){r.push(t.x,t.y,t.z)}function l(e,n){const i=3*e;n.x=t[i+0],n.y=t[i+1],n.z=t[i+2]}function c(t,e,n,i){i<0&&1===t.x&&(s[e]=t.x-1),0===n.x&&0===n.z&&(s[e]=i/2/Math.PI+.5)}function h(t){return Math.atan2(t.z,-t.x)}!function(t){const n=new Lt,i=new Lt,r=new Lt;for(let s=0;s<e.length;s+=3)l(e[s+0],n),l(e[s+1],i),l(e[s+2],r),a(n,i,r,t)}(i),function(t){const e=new Lt;for(let n=0;n<r.length;n+=3)e.x=r[n+0],e.y=r[n+1],e.z=r[n+2],e.normalize().multiplyScalar(t),r[n+0]=e.x,r[n+1]=e.y,r[n+2]=e.z}(n),function(){const t=new Lt;for(let n=0;n<r.length;n+=3){t.x=r[n+0],t.y=r[n+1],t.z=r[n+2];const i=h(t)/2/Math.PI+.5,a=(e=t,Math.atan2(-e.y,Math.sqrt(e.x*e.x+e.z*e.z))/Math.PI+.5);s.push(i,1-a)}var e;(function(){const t=new Lt,e=new Lt,n=new Lt,i=new Lt,a=new vt,o=new vt,l=new vt;for(let u=0,d=0;u<r.length;u+=9,d+=6){t.set(r[u+0],r[u+1],r[u+2]),e.set(r[u+3],r[u+4],r[u+5]),n.set(r[u+6],r[u+7],r[u+8]),a.set(s[d+0],s[d+1]),o.set(s[d+2],s[d+3]),l.set(s[d+4],s[d+5]),i.copy(t).add(e).add(n).divideScalar(3);const p=h(i);c(a,d+0,t,p),c(o,d+2,e,p),c(l,d+4,n,p)}})(),function(){for(let t=0;t<s.length;t+=6){const e=s[t+0],n=s[t+2],i=s[t+4],r=Math.max(e,n,i),a=Math.min(e,n,i);r>.9&&a<.1&&(e<.2&&(s[t+0]+=1),n<.2&&(s[t+2]+=1),i<.2&&(s[t+4]+=1))}}()}(),this.setAttribute("position",new mn(r,3)),this.setAttribute("normal",new mn(r.slice(),3)),this.setAttribute("uv",new mn(s,2)),0===i?this.computeVertexNormals():this.normalizeNormals()}}class Ba extends Na{constructor(t=1,e=0){const n=(1+Math.sqrt(5))/2,i=1/n;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-i,-n,0,-i,n,0,i,-n,0,i,n,-i,-n,0,-i,n,0,i,-n,0,i,n,0,-n,0,-i,n,0,-i,-n,0,i,n,0,i],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,
vendor: 14,718 bytes, line 824
82419,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}}const za=new Lt,Fa=new Lt,Oa=new Lt,Ha=new je;class Ga extends En{constructor(t,e){if(super(),this.type="EdgesGeometry",this.parameters={thresholdAngle:e},e=void 0!==e?e:1,!0===t.isGeometry)return void console.error("THREE.EdgesGeometry no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");const n=Math.pow(10,4),i=Math.cos(ot*e),r=t.getIndex(),s=t.getAttribute("position"),a=r?r.count:s.count,o=[0,0,0],l=["a","b","c"],c=new Array(3),h={},u=[];for(let t=0;t<a;t+=3){r?(o[0]=r.getX(t),o[1]=r.getX(t+1),o[2]=r.getX(t+2)):(o[0]=t,o[1]=t+1,o[2]=t+2);const{a:e,b:a,c:d}=Ha;if(e.fromBufferAttribute(s,o[0]),a.fromBufferAttribute(s,o[1]),d.fromBufferAttribute(s,o[2]),Ha.getNormal(Oa),c[0]=`${Math.round(e.x*n)},${Math.round(e.y*n)},${Math.round(e.z*n)}`,c[1]=`${Math.round(a.x*n)},${Math.round(a.y*n)},${Math.round(a.z*n)}`,c[2]=`${Math.round(d.x*n)},${Math.round(d.y*n)},${Math.round(d.z*n)}`,c[0]!==c[1]&&c[1]!==c[2]&&c[2]!==c[0])for(let t=0;t<3;t++){const e=(t+1)%3,n=c[t],r=c[e],s=Ha[l[t]],a=Ha[l[e]],d=`${n}_${r}`,p=`${r}_${n}`;p in h&&h[p]?(Oa.dot(h[p].normal)<=i&&(u.push(s.x,s.y,s.z),u.push(a.x,a.y,a.z)),h[p]=null):d in h||(h[d]={index0:o[t],index1:o[e],normal:Oa.clone()})}}for(const t in h)if(h[t]){const{index0:e,index1:n}=h[t];za.fromBufferAttribute(s,e),Fa.fromBufferAttribute(s,n),u.push(za.x,za.y,za.z),u.push(Fa.x,Fa.y,Fa.z)}this.setAttribute("position",new mn(u,3))}}const Ua=function(t,e,n){n=n||2;const i=e&&e.length,r=i?e[0]*n:t.length;let s=ka(t,0,r,n,!0);const a=[];if(!s||s.next===s.prev)return a;let o,l,c,h,u,d,p;if(i&&(s=function(t,e,n,i){const r=[];let s,a,o,l,c;for(s=0,a=e.length;s<a;s++)o=e[s]*i,l=s<a-1?e[s+1]*i:t.length,c=ka(t,o,l,i,!1),c===c.next&&(c.steiner=!0),r.push($a(c));for(r.sort(Za),s=0;s<r.length;s++)Ja(r[s],n),n=Va(n,n.next);return n}(t,e,s,n)),t.length>80*n){o=c=t[0],l=h=t[1];for(let e=n;e<r;e+=n)u=t[e],d=t[e+1],u<o&&(o=u),d<l&&(l=d),u>c&&(c=u),d>h&&(h=d);p=Math.max(c-o,h-l),p=0!==p?1/p:0}return Wa(s,a,n,o,l,p),a};function ka(t,e,n,i,r){let s,a;if(r===function(t,e,n,i){let r=0;for(let s=e,a=n-i;s<n;s+=i)r+=(t[a]-t[s])*(t[s+1]+t[a+1]),a=s;return r}(t,e,n,i)>0)for(s=e;s<n;s+=i)a=co(s,t[s],t[s+1],a);else for(s=n-i;s>=e;s-=i)a=co(s,t[s],t[s+1],a);return a&&io(a,a.next)&&(ho(a),a=a.next),a}function Va(t,e){if(!t)return t;e||(e=t);let n,i=t;do{if(n=!1,i.steiner||!io(i,i.next)&&0!==no(i.prev,i,i.next))i=i.next;else{if(ho(i),i=e=i.prev,i===i.next)break;n=!0}}while(n||i!==e);return e}function Wa(t,e,n,i,r,s,a){if(!t)return;!a&&s&&function(t,e,n,i){let r=t;do{null===r.z&&(r.z=Ka(r.x,r.y,e,n,i)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,n,i,r,s,a,o,l,c=1;do{for(n=t,t=null,s=null,a=0;n;){for(a++,i=n,o=0,e=0;e<c&&(o++,i=i.nextZ,i);e++);for(l=c;o>0||l>0&&i;)0!==o&&(0===l||!i||n.z<=i.z)?(r=n,n=n.nextZ,o--):(r=i,i=i.nextZ,l--),s?s.nextZ=r:t=r,r.prevZ=s,s=r;n=i}s.nextZ=null,c*=2}while(a>1)}(r)}(t,i,r,s);let o,l,c=t;for(;t.prev!==t.next;)if(o=t.prev,l=t.next,s?qa(t,i,r,s):ja(t))e.push(o.i/n),e.push(t.i/n),e.push(l.i/n),ho(t),t=l.next,c=l.next;else if((t=l)===c){a?1===a?Wa(t=Xa(Va(t),e,n),e,n,i,r,s,2):2===a&&Ya(t,e,n,i,r,s):Wa(Va(t),e,n,i,r,s,1);break}}function ja(t){const e=t.prev,n=t,i=t.next;if(no(e,n,i)>=0)return!1;let r=t.next.next;for(;r!==t.prev;){if(to(e.x,e.y,n.x,n.y,i.x,i.y,r.x,r.y)&&no(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function qa(t,e,n,i){const r=t.prev,s=t,a=t.next;if(no(r,s,a)>=0)return!1;const o=r.x<s.x?r.x<a.x?r.x:a.x:s.x<a.x?s.x:a.x,l=r.y<s.y?r.y<a.y?r.y:a.y:s.y<a.y?s.y:a.y,c=r.x>s.x?r.x>a.x?r.x:a.x:s.x>a.x?s.x:a.x,h=r.y>s.y?r.y>a.y?r.y:a.y:s.y>a.y?s.y:a.y,u=Ka(o,l,e,n,i),d=Ka(c,h,e,n,i);let p=t.prevZ,m=t.nextZ;for(;p&&p.z>=u&&m&&m.z<=d;){if(p!==t.prev&&p!==t.next&&to(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&no(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,m!==t.prev&&m!==t.next&&to(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&no(m.prev,m,m.next)>=0)return!1;m=m.nextZ}for(;p&&p.z>=u;){if(p!==t.prev&&p!==t.next&&to(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&no(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;m&&m.z<=d;){if(m!==t.prev&&m!==t.next&&to(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&no(m.prev,m,m.next)>=0)return!1;m=m.nextZ}return!0}function Xa(t,e,n){let i=t;do{const r=i.prev,s=i.next.next;!io(r,s)&&ro(r,i,i.next,s)&&oo(r,s)&&oo(s,r)&&(e.push(r.i/n),e.push(i.i/n),e.push(s.i/n),ho(i),ho(i.next),i=t=s),i=i.next}while(i!==t);return Va(i)}function Ya(t,e,n,i,r,s){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&eo(a,t)){let o=lo(a,t);return a=Va(a,a.next),o=Va(o,o.next),Wa(a,e,n,i,r,s),void Wa(o,e,n,i,r,s)}t=t.next}a=a.next}while(a!==t)}function Za(t,e){return t.x-e.x}function Ja(t,e){if(e=function(t,e){let n=e;const i=t.x,r=t.y;let s,a=-1/0;do{if(r<=n.y&&r>=n.next.y&&n.next.y!==n.y){const t=n.x+(r-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(t<=i&&t>a){if(a=t,t===i){if(r===n.y)return n;if(r===n.next.y)return n.next}s=n.x<n.next.x?n:n.next}}n=n.next}while(n!==e);if(!s)return null;if(i===a)return s;const o=s,l=s.x,c=s.y;let h,u=1/0;n=s;do{i>=n.x&&n.x>=l&&i!==n.x&&to(r<c?i:a,r,l,c,r<c?a:i,r,n.x,n.y)&&(h=Math.abs(r-n.y)/(i-n.x),oo(n,t)&&(h<u||h===u&&(n.x>s.x||n.x===s.x&&Qa(s,n)))&&(s=n,u=h)),n=n.next}while(n!==o);return s}(t,e)){const n=lo(e,t);Va(e,e.next),Va(n,n.next)}}function Qa(t,e){return no(t.prev,t,e.prev)<0&&no(e.next,t,t.next)<0}function Ka(t,e,n,i,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*r)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-i)*r)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function $a(t){let e=t,n=t;do{(e.x<n.x||e.x===n.x&&e.y<n.y)&&(n=e),e=e.next}while(e!==t);return n}function to(t,e,n,i,r,s,a,o){return(r-a)*(e-o)-(t-a)*(s-o)>=0&&(t-a)*(i-o)-(n-a)*(e-o)>=0&&(n-a)*(s-o)-(r-a)*(i-o)>=0}function eo(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&ro(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}(t,e)&&(oo(t,e)&&oo(e,t)&&function(t,e){let n=t,i=!1;const r=(t.x+e.x)/2,s=(t.y+e.y)/2;do{n.y>s!=n.next.y>s&&n.next.y!==n.y&&r<(n.next.x-n.x)*(s-n.y)/(n.next.y-n.y)+n.x&&(i=!i),n=n.next}while(n!==t);return i}(t,e)&&(no(t.prev,t,e.prev)||no(t,e.prev,e))||io(t,e)&&no(t.prev,t,t.next)>0&&no(e.prev,e,e.next)>0)}function no(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function io(t,e){return t.x===e.x&&t.y===e.y}function ro(t,e,n,i){const r=ao(no(t,e,n)),s=ao(no(t,e,i)),a=ao(no(n,i,t)),o=ao(no(n,i,e));return r!==s&&a!==o||(!(0!==r||!so(t,n,e))||(!(0!==s||!so(t,i,e))||(!(0!==a||!so(n,t,i))||!(0!==o||!so(n,e,i)))))}function so(t,e,n){return e.x<=Math.max(t.x,n.x)&&e.x>=Math.min(t.x,n.x)&&e.y<=Math.max(t.y,n.y)&&e.y>=Math.min(t.y,n.y)}function ao(t){return t>0?1:t<0?-1:0}function oo(t,e){return no(t.prev,t,t.next)<0?no(t,e,t.next)>=0&&no(t,t.prev,e)>=0:no(t,e,t.prev)<0||no(t,t.next,e)<0}function lo(t,e){const n=new uo(t.i,t.x,t.y),i=new uo(e.i,e.x,e.y),r=t.next,s=e.prev;return t.next=e,e.prev=t,n.next=r,r.prev=n,i.next=n,n.prev=i,s.next=i,i.prev=s,i}function co(t,e,n,i){const r=new uo(t,e,n);return i?(r.next=i.next,r.prev=i,i.next.prev=r,i.next=r):(r.prev=r,r.next=r),r}function ho(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function uo(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}class po{static area(t){const e=t.length;let n=0;for(let i=e-1,r=0;r<e;i=r++)n+=t[i].x*t[r].y-t[r].x*t[i].y;return.5*n}static isClockWise(t){return po.area(t)<0}static triangulateShape(t,e){const n=[],i=[],r=[];mo(t),fo(n,t);let s=t.length;e.forEach(mo);for(let t=0;t<e.length;t++)i.push(s),s+=e[t].length,fo(n,e[t]);const a=Ua(n,i);for(let t=0;t<a.length;t+=3)r.push(a.slice(t,t+3));return r}}function mo(t){const e=t.length;e>2&&t[e-1].equals(t[0])&&t.pop()}function fo(t,e){for(let n=0;n<e.length;n++)t.push(e[n].x),t.push(e[n].y)}class go extends En{constructor(t,e){super(),this.type="ExtrudeGeometry",this.parameters={shapes:t,options:e},t=Array.isArray(t)?t:[t];const n=this,i=[],r=[];for(let e=0,n=t.length;e<n;e++){s(t[e])}function s(t){const s=[],a=void 0!==e.curveSegments?e.curveSegments:12,o=void 0!==e.steps?e.steps:1;let l=void 0!==e.depth?e.depth:100,c=void 0===e.bevelEnabled||e.bevelEnabled,h=void 0!==e.bevelThickness?e.bevelThickness:6,u=void 0!==e.bevelSize?e.bevelSize:h-2,d=void 0!==e.bevelOffset?e.bevelOffset:0,p=void 0!==e.bevelSegments?e.bevelSegments:3;const m=e.extrudePath,f=void 0!==e.UVGenerator?e.UVGenerator:vo;void 0!==e.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),l=e.amount);let g,v,y,x,_,w=!1;m&&(g=m.getSpacedPoints(o),w=!0,c=!1,v=m.computeFrenetFrames(o,!1),y=new Lt,x=new Lt,_=new Lt),c||(p=0,h=0,u=0,d=0);const b=t.extractPoints(a);let M=b.shape;const S=b.holes;if(!po.isClockWise(M)){M=M.reverse();for(let t=0,e=S.length;t<e;t++){const e=S[t];po.isClockWise(e)&&(S[t]=e.reverse())}}const T=po.triangulateShape(M,S),E=M;for(let t=0,e=S.length;t<e;t++){const e=S[t];M=M.concat(e)}function A(t,e,n){return e||console.error("THREE.ExtrudeGeometry: vec does not exist"),e.clone().multiplyScalar(n).add(t)}const L=M.length,R=T.length;function C(t,e,n){let i,r,s;const a=t.x-e.x,o=t.y-e.y,l=n.x-t.x,c=n.y-t.y,h=a*a+o*o,u=a*c-o*l;if(Math.abs(u)>Number.EPSILON){const u=Math.sqrt(h),d=Math.sqrt(l*l+c*c),p=e.x-o/u,m=e.y+a/u,f=((n.x-c/d-p)*c-(n.y+l/d-m)*l)/(a*c-o*l);i=p+a*f-t.x,r=m+o*f-t.y;const g=i*i+r*r;if(g<=2)return new vt(i,r);s=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?l>Number.EPSILON&&(t=!0):a<-Number.EPSILON?l<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(c)&&(t=!0),t?(i=-o,r=a,s=Math.sqrt(h)):(i=a,r=o,s=Math.sqrt(h/2))}return new vt(i/s,r/s)}const P=[];for(let t=0,e=E.length,n=e-1,i=t+1;t<e;t++,n++,i++)n===e&&(n=0),i===e&&(i=0),P[t]=C(E[t],E[n],E[i]);const D=[];let I,N=P.concat();for(let t=0,e=S.length;t<e;t++){const e=S[t];I=[];for(let t=0,n=e.length,i=n-1,r=t+1;t<n;t++,i++,r++)i===n&&(i=0),r===n&&(r=0),I[t]=C(e[t],e[i],e[r]);D.push(I),N=N.concat(I)}for(let t=0;t<p;t++){const e=t/p,n=h*Math.cos(e*Math.PI/2),i=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=E.length;t<e;t++){const e=A(E[t],P[t],i);F(e.x,e.y,-n)}for(let t=0,e=S.length;t<e;t++){const e=S[t];I=D[t];for(let t=0,r=e.length;t<r;t++){const r=A(e[t],I[t],i);F(r.x,r.y,-n)}}}const B=u+d;for(let t=0;t<L;t++){const e=c?A(M[t],N[t],B):M[t];w?(x.copy(v.normals[0]).multiplyScalar(e.x),y.copy(v.binormals[0]).multiplyScalar(e.y),_.copy(g[0]).add(x).add(y),F(_.x,_.y,_.z)):F(e.x,e.y,0)}for(let t=1;t<=o;t++)for(let e=0;e<L;e++){const n=c?A(M[e],N[e],B):M[e];w?(x.copy(v.normals[t]).multiplyScalar(n.x),y.copy(v.binormals[t]).multiplyScalar(n.y),_.copy(g[t]).add(x).add(y),F(_.x,_.y,_.z)):F(n.x,n.y,l/o*t)}for(let t=p-1;t>=0;t--){const e=t/p,n=h*Math.cos(e*Math.PI/2),i=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=E.length;t<e;t++){const e=A(E[t],P[t],i);F(e.x,e.y,l+n)}for(let t=0,e=S.length;t<e;t++){const e=S[t];I=D[t];for(let t=0,r=e.length;t<r;t++){const r=A(e[t],I[t],i);w?F(r.x,r.y+g[o-1].y,g[o-1].x+n):F(r.x,r.y,l+n)}}}function z(t,e){let n=t.length;for(;--n>=0;){const i=n;let r=n-1;r<0&&(r=t.length-1);for(let t=0,n=o+2*p;t<n;t++){const n=L*t,s=L*(t+1);H(e+i+n,e+r+n,e+r+s,e+i+s)}}}function F(t,e,n){s.push(t),s.push(e),s.push(n)}function O(t,e,r){G(t),G(e),G(r);const s=i.length/3,a=f.generateTopUV(n,i,s-3,s-2,s-1);U(a[0]),U(a[1]),U(a[2])}function H(t,e,r,s){G(t),G(e),G(s),G(e),G(r),G(s);const a=i.length/3,o=f.generateSideWallUV(n,i,a-6,a-3,a-2,a-1);U(o[0]),U(o[1]),U(o[3]),U(o[1]),U(o[2]),U(o[3])}function G(t){i.push(s[3*t+0]),i.push(s[3*t+1]),i.push(s[3*t+2])}function U(t){r.push(t.x),r.push(t.y)}!function(){const t=i.length/3;if(c){let t=0,e=L*t;for(let t=0;t<R;t++){const n=T[t];O(n[2]+e,n[1]+e,n[0]+e)}t=o+2*p,e=L*t;for(let t=0;t<R;t++){const n=T[t];O(n[0]+e,n[1]+e,n[2]+e)}}else{for(let t=0;t<R;t++){const e=T[t];O(e[2],e[1],e[0])}for(let t=0;t<R;t++){const e=T[t];O(e[0]+L*o,e[1]+L*o,e[2]+L*o)}}n.addGroup(t,i.length/3-t,0)}(),function(){const t=i.length/3;let e=0;z(E,e),e+=E.length;for(let t=0,n=S.length;t<n;t++){const n=S[t];z(n,e),e+=n.length}n.addGroup(t,i.length/3-t,1)}()}this.setAttribute("position",new mn(i,3)),this.setAttribute("uv",new mn(r,2)),this.computeVertexNormals()}toJSON(){const t=En.prototype.toJSON.call(this);return function(t,e,n){if(n.shapes=[],Array.isArray(t))for(let e=0,i=t.length;e<i;e++){const i=t[e];n.shapes.push(i.uuid)}else n.shapes.push(t.uuid);void 0!==e.extrudePath&&(n.options.extrudePath=e.extrudePath.toJSON());return n}(this.parameters.shapes,this.parameters.options,t)}}const vo={generateTopUV:function(t,e,n,i,r){const s=e[3*n],a=e[3*n+1],o=e[3*i],l=e[3*i+1],c=e[3*r],h=e[3*r+1];return[new vt(s,a),new vt(o,l),new vt(c,h)]},generateSideWallUV:function(t,e,n,i,r,s){const a=e[3*n],o=e[3*n+1],l=e[3*n+2],c=e[3*i],h=e[3*i+1],u=e[3*i+2],d=e[3*r],p=e[3*r+1],m=e[3*r+2],f=e[3*s],g=e[3*s+1],v=e[3*s+2];return Math.abs(o-h)<.01?[new vt(a,1-l),new vt(c,1-u),new vt(d,1-m),new vt(f,1-v)]:[new vt(o,1-l),new vt(h,1-u),new vt(p,1-m),new vt(g,1-v)]}};class yo extends Na{constructor(t=1,e=0){const n=(1+Math.sqrt(5))/2;super([-1,n,0,1,n,0,-1,-n,0,1,-n,0,0,-1,n,0,1,n,0,-1,-n,0,1,-n,n,0,-1,n,0,1,-n,0,-1,-n,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],t,e),this.type="IcosahedronGeometry",this.parameters={radius:t,detail:e}}}class xo extends En{constructor(t,e=12,n=0,i=2*Math.PI){super(),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:n,phiLength:i},e=Math.floor(e),i=ht(i,0,2*Math.PI);const r=[],s=[],a=[],o=1/e,l=new Lt,c=new vt;for(let r=0;r<=e;r++){const h=n+r*o*i,u=Math.sin(h),d=Math.cos(h);for(let n=0;n<=t.length-1;n++)l.x=t[n].x*u,l.y=t[n].y,l.z=t[n].x*d,s.push(l.x,l.y,l.z),c.x=r/e,c.y=n/(t.length-1),a.push(c.x,c.y)}for(let n=0;n<e;n++)for(let e=0;e<t.length-1;e++){const i=e+n*t.length,s=i,a=i+t.length,o=i+t.length+1,l=i+1;r.push(s,a,l),r.push(a,o,l)}if(this.setIndex(r),this.setAttribute("position",new mn(s,3)),this.setAttribute("uv",new mn(a,2)),this.computeVertexNormals(),i===2*Math.PI){const n=this.attributes.normal.array,i=new Lt,r=new Lt,s=new Lt,a=e*t.length*3;for(let e=0,o=0;e<t.length;e++,o+=3)i.x=n[o+0],i.y=n[o+1],i.z=n[o+2],r.x=n[a+o+0],r.y=n[a+o+1],r.z=n[a+o+2],s.addVectors(i,r).normalize(),n[o+0]=n[a+o+0]=s.x,n[o+1]=n[a+o+1]=s.y,n[o+2]=n[a+o+2]=s.z}}}class _o extends Na{constructor(t=1,e=0){super([1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],t,e),this.type="OctahedronGeometry",this.parameters={radiu
824s:t,detail:e}}}class wo extends En{constructor(t,e,n){super(),this.type="ParametricGeometry",this.parameters={func:t,slices:e,stacks:n};const i=[],r=[],s=[],a=[],o=1e-5,l=new Lt,c=new Lt,h=new Lt,u=new Lt,d=new Lt;t.length<3&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.");const p=e+1;for(let i=0;i<=n;i++){const p=i/n;for(let n=0;n<=e;n++){const i=n/e;t(i,p,c),r.push(c.x,c.y,c.z),i-o>=0?(t(i-o,p,h),u.subVectors(c,h)):(t(i+o,p,h),u.subVectors(h,c)),p-o>=0?(t(i,p-o,h),d.subVectors(c,h)):(t(i,p+o,h),d.subVectors(h,c)),l.crossVectors(u,d).normalize(),s.push(l.x,l.y,l.z),a.push(i,p)}}for(let t=0;t<n;t++)for(let n=0;n<e;n++){const e=t*p+n,r=t*p+n+1,s=(t+1)*p+n+1,a=(t+1)*p+n;i.push(e,r,a),i.push(r,s,a)}this.setIndex(i),this.setAttribute("position",new mn(r,3)),this.setAttribute("normal",new mn(s,3)),this.setAttribute("uv",new mn(a,2))}}class bo extends En{constructor(t=.5,e=1,n=8,i=1,r=0,s=2*Math.PI){super(),this.type="RingGeometry",this.parameters={innerRadius:t,outerRadius:e,thetaSegments:n,phiSegments:i,thetaStart:r,thetaLength:s},n=Math.max(3,n);const a=[],o=[],l=[],c=[];let h=t;const u=(e-t)/(i=Math.max(1,i)),d=new Lt,p=new vt;for(let t=0;t<=i;t++){for(let t=0;t<=n;t++){const i=r+t/n*s;d.x=h*Math.cos(i),d.y=h*Math.sin(i),o.push(d.x,d.y,d.z),l.push(0,0,1),p.x=(d.x/e+1)/2,p.y=(d.y/e+1)/2,c.push(p.x,p.y)}h+=u}for(let t=0;t<i;t++){const e=t*(n+1);for(let t=0;t<n;t++){const i=t+e,r=i,s=i+n+1,o=i+n+2,l=i+1;a.push(r,s,l),a.push(s,o,l)}}this.setIndex(a),this.setAttribute("position",new mn(o,3)),this.setAttribute("normal",new mn(l,3)),this.setAttribute("uv",new mn(c,2))}}class Mo extends En{constructor(t,e=12){super(),this.type="ShapeGeometry",this.parameters={shapes:t,curveSegments:e};const n=[],i=[],r=[],s=[];let a=0,o=0;if(!1===Array.isArray(t))l(t);else for(let e=0;e<t.length;e++)l(t[e]),this.addGroup(a,o,e),a+=o,o=0;function l(t){const a=i.length/3,l=t.extractPoints(e);let c=l.shape;const h=l.holes;!1===po.isClockWise(c)&&(c=c.reverse());for(let t=0,e=h.length;t<e;t++){const e=h[t];!0===po.isClockWise(e)&&(h[t]=e.reverse())}const u=po.triangulateShape(c,h);for(let t=0,e=h.length;t<e;t++){const e=h[t];c=c.concat(e)}for(let t=0,e=c.length;t<e;t++){const e=c[t];i.push(e.x,e.y,0),r.push(0,0,1),s.push(e.x,e.y)}for(let t=0,e=u.length;t<e;t++){const e=u[t],i=e[0]+a,r=e[1]+a,s=e[2]+a;n.push(i,r,s),o+=3}}this.setIndex(n),this.setAttribute("position",new mn(i,3)),this.setAttribute("normal",new mn(r,3)),this.setAttribute("uv",new mn(s,2))}toJSON(){const t=En.prototype.toJSON.call(this);return function(t,e){if(e.shapes=[],Array.isArray(t))for(let n=0,i=t.length;n<i;n++){const i=t[n];e.shapes.push(i.uuid)}else e.shapes.push(t.uuid);return e}(this.parameters.shapes,t)}}class So extends En{constructor(t=1,e=8,n=6,i=0,r=2*Math.PI,s=0,a=Math.PI){super(),this.type="SphereGeometry",this.parameters={radius:t,widthSegments:e,heightSegments:n,phiStart:i,phiLength:r,thetaStart:s,thetaLength:a},e=Math.max(3,Math.floor(e)),n=Math.max(2,Math.floor(n));const o=Math.min(s+a,Math.PI);let l=0;const c=[],h=new Lt,u=new Lt,d=[],p=[],m=[],f=[];for(let d=0;d<=n;d++){const g=[],v=d/n;let y=0;0==d&&0==s?y=.5/e:d==n&&o==Math.PI&&(y=-.5/e);for(let n=0;n<=e;n++){const o=n/e;h.x=-t*Math.cos(i+o*r)*Math.sin(s+v*a),h.y=t*Math.cos(s+v*a),h.z=t*Math.sin(i+o*r)*Math.sin(s+v*a),p.push(h.x,h.y,h.z),u.copy(h).normalize(),m.push(u.x,u.y,u.z),f.push(o+y,1-v),g.push(l++)}c.push(g)}for(let t=0;t<n;t++)for(let i=0;i<e;i++){const e=c[t][i+1],r=c[t][i],a=c[t+1][i],l=c[t+1][i+1];(0!==t||s>0)&&d.push(e,r,l),(t!==n-1||o<Math.PI)&&d.push(r,a,l)}this.setIndex(d),this.setAttribute("position",new mn(p,3)),this.setAttribute("normal",new mn(m,3)),this.setAttribute("uv",new mn(f,2))}}class To extends Na{constructor(t=1,e=0){super([1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],t,e),this.type="TetrahedronGeometry",this.parameters={radius:t,detail:e}}}class Eo extends go{constructor(t,e={}){const n=e.font;if(!n||!n.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new En;const i=n.generateShapes(t,e.size);e.depth=void 0!==e.height?e.height:50,void 0===e.bevelThickness&&(e.bevelThickness=10),void 0===e.bevelSize&&(e.bevelSize=8),void 0===e.bevelEnabled&&(e.bevelEnabled=!1),super(i,e),this.type="TextGeometry"}}
vendor: 29,647 bytes, line 824
824class Ao extends En{constructor(t=1,e=.4,n=8,i=6,r=2*Math.PI){super(),this.type="TorusGeometry",this.parameters={radius:t,tube:e,radialSegments:n,tubularSegments:i,arc:r},n=Math.floor(n),i=Math.floor(i);const s=[],a=[],o=[],l=[],c=new Lt,h=new Lt,u=new Lt;for(let s=0;s<=n;s++)for(let d=0;d<=i;d++){const p=d/i*r,m=s/n*Math.PI*2;h.x=(t+e*Math.cos(m))*Math.cos(p),h.y=(t+e*Math.cos(m))*Math.sin(p),h.z=e*Math.sin(m),a.push(h.x,h.y,h.z),c.x=t*Math.cos(p),c.y=t*Math.sin(p),u.subVectors(h,c).normalize(),o.push(u.x,u.y,u.z),l.push(d/i),l.push(s/n)}for(let t=1;t<=n;t++)for(let e=1;e<=i;e++){const n=(i+1)*t+e-1,r=(i+1)*(t-1)+e-1,a=(i+1)*(t-1)+e,o=(i+1)*t+e;s.push(n,r,o),s.push(r,a,o)}this.setIndex(s),this.setAttribute("position",new mn(a,3)),this.setAttribute("normal",new mn(o,3)),this.setAttribute("uv",new mn(l,2))}}class Lo extends En{constructor(t=1,e=.4,n=64,i=8,r=2,s=3){super(),this.type="TorusKnotGeometry",this.parameters={radius:t,tube:e,tubularSegments:n,radialSegments:i,p:r,q:s},n=Math.floor(n),i=Math.floor(i);const a=[],o=[],l=[],c=[],h=new Lt,u=new Lt,d=new Lt,p=new Lt,m=new Lt,f=new Lt,g=new Lt;for(let a=0;a<=n;++a){const y=a/n*r*Math.PI*2;v(y,r,s,t,d),v(y+.01,r,s,t,p),f.subVectors(p,d),g.addVectors(p,d),m.crossVectors(f,g),g.crossVectors(m,f),m.normalize(),g.normalize();for(let t=0;t<=i;++t){const r=t/i*Math.PI*2,s=-e*Math.cos(r),p=e*Math.sin(r);h.x=d.x+(s*g.x+p*m.x),h.y=d.y+(s*g.y+p*m.y),h.z=d.z+(s*g.z+p*m.z),o.push(h.x,h.y,h.z),u.subVectors(h,d).normalize(),l.push(u.x,u.y,u.z),c.push(a/n),c.push(t/i)}}for(let t=1;t<=n;t++)for(let e=1;e<=i;e++){const n=(i+1)*(t-1)+(e-1),r=(i+1)*t+(e-1),s=(i+1)*t+e,o=(i+1)*(t-1)+e;a.push(n,r,o),a.push(r,s,o)}function v(t,e,n,i,r){const s=Math.cos(t),a=Math.sin(t),o=n/e*t,l=Math.cos(o);r.x=i*(2+l)*.5*s,r.y=i*(2+l)*a*.5,r.z=i*Math.sin(o)*.5}this.setIndex(a),this.setAttribute("position",new mn(o,3)),this.setAttribute("normal",new mn(l,3)),this.setAttribute("uv",new mn(c,2))}}class Ro extends En{constructor(t,e=64,n=1,i=8,r=!1){super(),this.type="TubeGeometry",this.parameters={path:t,tubularSegments:e,radius:n,radialSegments:i,closed:r};const s=t.computeFrenetFrames(e,r);this.tangents=s.tangents,this.normals=s.normals,this.binormals=s.binormals;const a=new Lt,o=new Lt,l=new vt;let c=new Lt;const h=[],u=[],d=[],p=[];function m(r){c=t.getPointAt(r/e,c);const l=s.normals[r],d=s.binormals[r];for(let t=0;t<=i;t++){const e=t/i*Math.PI*2,r=Math.sin(e),s=-Math.cos(e);o.x=s*l.x+r*d.x,o.y=s*l.y+r*d.y,o.z=s*l.z+r*d.z,o.normalize(),u.push(o.x,o.y,o.z),a.x=c.x+n*o.x,a.y=c.y+n*o.y,a.z=c.z+n*o.z,h.push(a.x,a.y,a.z)}}!function(){for(let t=0;t<e;t++)m(t);m(!1===r?e:0),function(){for(let t=0;t<=e;t++)for(let n=0;n<=i;n++)l.x=t/e,l.y=n/i,d.push(l.x,l.y)}(),function(){for(let t=1;t<=e;t++)for(let e=1;e<=i;e++){const n=(i+1)*(t-1)+(e-1),r=(i+1)*t+(e-1),s=(i+1)*t+e,a=(i+1)*(t-1)+e;p.push(n,r,a),p.push(r,s,a)}}()}(),this.setIndex(p),this.setAttribute("position",new mn(h,3)),this.setAttribute("normal",new mn(u,3)),this.setAttribute("uv",new mn(d,2))}toJSON(){const t=En.prototype.toJSON.call(this);return t.path=this.parameters.path.toJSON(),t}}class Co extends En{constructor(t){if(super(),this.type="WireframeGeometry",!0===t.isGeometry)return void console.error("THREE.WireframeGeometry no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");const e=[],n=[0,0],i={},r=new Lt;if(null!==t.index){const s=t.attributes.position,a=t.index;let o=t.groups;0===o.length&&(o=[{start:0,count:a.count,materialIndex:0}]);for(let t=0,e=o.length;t<e;++t){const e=o[t],r=e.start;for(let t=r,s=r+e.count;t<s;t+=3)for(let e=0;e<3;e++){const r=a.getX(t+e),s=a.getX(t+(e+1)%3);n[0]=Math.min(r,s),n[1]=Math.max(r,s);const o=n[0]+","+n[1];void 0===i[o]&&(i[o]={index1:n[0],index2:n[1]})}}for(const t in i){const n=i[t];r.fromBufferAttribute(s,n.index1),e.push(r.x,r.y,r.z),r.fromBufferAttribute(s,n.index2),e.push(r.x,r.y,r.z)}}else{const n=t.attributes.position;for(let t=0,i=n.count/3;t<i;t++)for(let i=0;i<3;i++){const s=3*t+i;r.fromBufferAttribute(n,s),e.push(r.x,r.y,r.z);const a=3*t+(i+1)%3;r.fromBufferAttribute(n,a),e.push(r.x,r.y,r.z)}}this.setAttribute("position",new mn(e,3))}}var Po=Object.freeze({__proto__:null,BoxGeometry:qn,BoxBufferGeometry:qn,CircleGeometry:Pa,CircleBufferGeometry:Pa,ConeGeometry:Ia,ConeBufferGeometry:Ia,CylinderGeometry:Da,CylinderBufferGeometry:Da,DodecahedronGeometry:Ba,DodecahedronBufferGeometry:Ba,EdgesGeometry:Ga,ExtrudeGeometry:go,ExtrudeBufferGeometry:go,IcosahedronGeometry:yo,IcosahedronBufferGeometry:yo,LatheGeometry:xo,LatheBufferGeometry:xo,OctahedronGeometry:_o,OctahedronBufferGeometry:_o,ParametricGeometry:wo,ParametricBufferGeometry:wo,PlaneGeometry:ci,PlaneBufferGeometry:ci,PolyhedronGeometry:Na,PolyhedronBufferGeometry:Na,RingGeometry:bo,RingBufferGeometry:bo,ShapeGeometry:Mo,ShapeBufferGeometry:Mo,SphereGeometry:So,SphereBufferGeometry:So,TetrahedronGeometry:To,TetrahedronBufferGeometry:To,TextGeometry:Eo,TextBufferGeometry:Eo,TorusGeometry:Ao,TorusBufferGeometry:Ao,TorusKnotGeometry:Lo,TorusKnotBufferGeometry:Lo,TubeGeometry:Ro,TubeBufferGeometry:Ro,WireframeGeometry:Co});class Do extends Xe{constructor(t){super(),this.type="ShadowMaterial",this.color=new tn(0),this.transparent=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this}}Do.prototype.isShadowMaterial=!0;class Io extends Jn{constructor(t){super(t),this.type="RawShaderMaterial"}}Io.prototype.isRawShaderMaterial=!0;class No extends Xe{constructor(t){super(),this.defines={STANDARD:""},this.type="MeshStandardMaterial",this.color=new tn(16777215),this.roughness=1,this.metalness=0,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.flatShading=!1,this.vertexTangents=!1,this.setValues(t)}copy(t){return super.copy(t),this.defines={STANDARD:""},this.color.copy(t.color),this.roughness=t.roughness,this.metalness=t.metalness,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.roughnessMap=t.roughnessMap,this.metalnessMap=t.metalnessMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapIntensity=t.envMapIntensity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.flatShading=t.flatShading,this.vertexTangents=t.vertexTangents,this}}No.prototype.isMeshStandardMaterial=!0;class Bo extends No{constructor(t){super(),this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.clearcoat=0,this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new vt(1,1),this.clearcoatNormalMap=null,this.reflectivity=.5,Object.defineProperty(this,"ior",{get:function(){return(1+.4*this.reflectivity)/(1-.4*this.reflectivity)},set:function(t){this.reflectivity=ht(2.5*(t-1)/(t+1),0,1)}}),this.sheen=null,this.transmission=0,this.transmissionMap=null,this.setValues(t)}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.reflectivity=t.reflectivity,t.sheen?this.sheen=(this.sheen||new tn).copy(t.sheen):this.sheen=null,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this}}Bo.prototype.isMeshPhysicalMaterial=!0;class zo extends Xe{constructor(t){super(),this.type="MeshPhongMaterial",this.color=new tn(16777215),this.specular=new tn(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.flatShading=t.flatShading,this}}zo.prototype.isMeshPhongMaterial=!0;class Fo extends Xe{constructor(t){super(),this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new tn(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this}}Fo.prototype.isMeshToonMaterial=!0;class Oo extends Xe{constructor(t){super(),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.flatShading=t.flatShading,this}}Oo.prototype.isMeshNormalMaterial=!0;class Ho extends Xe{constructor(t){super(),this.type="MeshLambertMaterial",this.color=new tn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new tn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this}}Ho.prototype.isMeshLambertMaterial=!0;class Go extends Xe{constructor(t){super(),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new tn(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new vt(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.skinning=!1,this.morphTargets=!1,this.morphNormals=!1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.skinning=t.skinning,this.morphTargets=t.morphTargets,this.morphNormals=t.morphNormals,this.flatShading=t.flatShading,this}}Go.prototype.isMeshMatcapMaterial=!0;class Uo extends ca{constructor(t){super(),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}Uo.prototype.isLineDashedMaterial=!0;var ko=Object.freeze({__proto__:null,ShadowMaterial:Do,SpriteMaterial:Rs,RawShaderMaterial:Io,ShaderMaterial:Jn,PointsMaterial:_a,MeshPhysicalMaterial:Bo,MeshStandardMaterial:No,MeshPhongMaterial:zo,MeshToonMaterial:Fo,MeshNormalMaterial:Oo,MeshLambertMaterial:Ho,MeshDepthMaterial:cs,MeshDistanceMaterial:hs,MeshBasicMaterial:en,MeshMatcapMaterial:Go,LineDashedMaterial:Uo,LineBasicMaterial:ca,Material:Xe});const Vo={arraySlice:function(t,e,n){return Vo.isTypedArray(t)?new t.constructor(t.subarray(e,void 0!==n?n:t.length)):t.slice(e,n)},convertArray:function(t,e,n){return!t||!n&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)},isTypedArray:function(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)},getKeyframeOrder:function(t){const e=t.length,n=new Array(e);for(let t=0;t!==e;++t)n[t]=t;return n.sort((function(e,n){return t[e]-t[n]})),n},sortedArray:function(t,e,n){const i=t.length,r=new t.constructor(i);for(let s=0,a=0;a!==i;++s){const i=n[s]*e;for(let n=0;n!==e;++n)r[a++]=t[i+n]}return r},flattenJSON:function(t,e,n,i){let r=1,s=t[0];for(;void 0!==s&&void 0===s[i];)s=t[r++];if(void 0===s)return;let a=s[i];if(void 0!==a)if(Array.isArray(a))do{a=s[i],void 0!==a&&(e.push(s.time),n.push.apply(n,a)),s=t[r++]}while(void 0!==s);else if(void 0!==a.toArray)do{a=s[i],void 0!==a&&(e.push(s.time),a.toArray(n,n.length)),s=t[r++]}while(void 0!==s);else do{a=s[i],void 0!==a&&(e.push(s.time),n.push(a)),s=t[r++]}while(void 0!==s)},subclip:function(t,e,n,i,r=30){const s=t.clone();s.name=e;const a=[];for(let t=0;t<s.tracks.length;++t){const e=s.tracks[t],o=e.getValueSize(),l=[],c=[];for(let t=0;t<e.times.length;++t){const s=e.times[t]*r;if(!(s<n||s>=i)){l.push(e.times[t]);for(let n=0;n<o;++n)c.push(e.values[t*o+n])}}0!==l.length&&(e.times=Vo.convertArray(l,e.times.constructor),e.values=Vo.convertArray(c,e.values.constructor),a.push(e))}s.tracks=a;let o=1/0;for(let t=0;t<s.tracks.length;++t)o>s.tracks[t].times[0]&&(o=s.tracks[t].times[0]);for(let t=0;t<s.tracks.length;++t)s.tracks[t].shift(-1*o);return s.resetDuration(),s},makeClipAdditive:function(t,e=0,n=t,i=30){i<=0&&(i=30);const r=n.tracks.length,s=e/i;for(let e=0;e<r;++e){const i=n.tracks[e],r=i.ValueTypeName;if("bool"===r||"string"===r)continue;const a=t.tracks.find((function(t){return t.name===i.name&&t.ValueTypeName===r}));if(void 0===a)continue;let o=0;const l=i.getValueSize();i.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline&&(o=l/3);let c=0;const h=a.getValueSize();a.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline&&(c=h/3);const u=i.times.length-1;let d;if(s<=i.times[0]){const t=o,e=l-o;d=Vo.arraySlice(i.values,t,e)}else if(s>=i.times[u]){const t=u*l+o,e=t+l-o;d=Vo.arraySlice(i.values,t,e)}else{const t=i.createInterpolant(),e=o,n=l-o;t.evaluate(s),d=Vo.arraySlice(t.resultBuffer,e,n)}if("quaternion"===r){(new At).fromArray(d).normalize().conjugate().toArray(d)}const p=a.times.length;for(let t=0;t<p;++t){const e=t*h+c;if("quaternion"===r)At.multiplyQuaternionsFlat(a.values,e,d,0,a.values,e);else{const t=h-2*c;for(let n=0;n<t;++n)a.values[e+n]-=d[n]}}}return t.blendMode=q,t}};class Wo{constructor(t,e,n,i){this.parameterPositions=t,this._cachedIndex=0,this.resultBuffer=void 0!==i?i:new e.constructor(n),this.sampleValues=e,this.valueSize=n,this.settings=null,this.DefaultSettings_={}}evaluate(t){const e=this.parameterPositions;let n=this._cachedIndex,i=e[n],r=e[n-1];t:{e:{let s;n:{i:if(!(t<i)){for(let s=n+2;;){if(void 0===i){if(t<r)break i;return n=e.length,this._cachedIndex=n,this.afterEnd_(n-1,t,r)}if(n===s)break;if(r=i,i=e[++n],t<i)break e}s=e.length;break n}if(t>=r)break t;{const a=e[1];t<a&&(n=2,r=a);for(let s=n-2;;){if(void 0===r)return this._cachedIndex=0,this.beforeStart_(0,t,i);if(n===s)break;if(i=r,r=e[--n-1],t>=r)break e}s=n,n=0}}for(;n<s;){const i=n+s>>>1;t<e[i]?s=i:n=i+1}if(i=e[n],r=e[n-1],void 0===r)return this._cachedIndex=0,this.beforeStart_(0,t,i);if(void 0===i)return n=e.length,this._cachedIndex=n,this.afterEnd_(n-1,r,t)}this._cachedIndex=n,this.intervalChanged_(n,r,i)}return this.interpolate_(n,r,t,i)}getSettings_(){return this.settings||this.DefaultSettings_}copySampleValue_(t){const e=this.resultBuffer,n=this.sampleValues,i=this.valueSize,r=t*i;for(let t=0;t!==i;++t)e[t]=n[r+t];return e}interpolate_(){throw new Error("call to abstract method")}intervalChanged_(){}}Wo.prototype.beforeStart_=Wo.prototype.copySampleValue_,Wo.prototype.afterEnd_=Wo.prototype.copySampleValue_;class jo extends Wo{constructor(t,e,n,i){super(t,e,n,i),this._weightPrev=-0,this._offsetPrev=-0,this._weightNext=-0,this._offsetNext=-0,this.DefaultSettings_={endingStart:k,endingEnd:k}}intervalChanged_(t,e,n){const i=this.parameterPositions;let r=t-2,s=t+1,a=i[r],o=i[s];if(void 0===a)switch(this.getSettings_().endingStart){case V:r=t,a=2*e-n;break;case W:r=i.length-2,a=e+i[r]-i[r+1];break;default:r=t,a=n}if(void 0===o)switch(this.getSettings_().endingEnd){case V:s=t,o=2*n-e;break;case W:s=1,o=n+i[1]-i[0];break;default:s=t-1,o=e}const l=.5*(n-e),c=this.valueSize;this._weightPrev=l/(e-a),this._weightNext=l/(o-n),this._offsetPrev=r*c,this._offsetNext=s*c}interpolate_(t,e,n,i){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=t*a,l=o-a,c=this._offsetPrev,h=this._offsetNext,u=this._weightPrev,d=this._weightNext,p=(n-e)/(i-e),m=p*p,f=m*p,g=-u*f+2*u*m-u*p,v=(1+u)*f+(-1.5-2*u)*m+(-.5+u)*p+1,y=(-1-d)*f+(1.5+d)*m+.5*p,x=d*f-d*m;for(let t=0;t!==a;++t)r[t]=g*s[c+t]+v*s[l+t]+y*s[o+t]+x*s[h+t];return r}}class qo extends Wo{constructor(t,e,n,i){super(t,e,n,i)}interpolate_(t,e,n,i){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=t*a,l=o-a,c=(n-e)/(i-e),h=1-c;for(let t=0;t!==a;++t)r[t]=s[l+t]*h+s[o+t]*c;return r}}class Xo extends Wo{constructor(t,e,n,i){super(t,e,n,i)}interpolate_(t){return this.copySampleValue_(t-1)}}class Yo{constructor(t,e,n,i){if(void 0===t)throw new Error("THREE.KeyframeTrack: track name is undefined");if(void 0===e||0===e.length)throw new Error("THREE.KeyframeTrack: no keyframes in track named "+t);this.name=t,this.times=Vo.convertArray(e,this.TimeBufferType),this.values=Vo.convertArray(n,this.ValueBufferType),this.setInterpolation(i||this.DefaultInterpolation)}static toJSON(t){const e=t.constructor;let n;if(e.toJSON!==this.toJSON)n=e.toJSON(t);else{n={name:t.name,times:Vo.convertArray(t.times,Array),values:Vo.convertArray(t.values,Array)};const e=t.getInterpolation();e!==t.DefaultInterpolation&&(n.interpolation=e)}return n.type=t.ValueTypeName,n}InterpolantFactoryMethodDiscrete(t){return new Xo(this.times,this.values,this.getValueSize(),t)}InterpolantFactoryMethodLinear(t){return new qo(this.times,this.values,this.getValueSize(),t)}InterpolantFactoryMethodSmooth(t){return new jo(this.times,this.values,this.getValueSize(),t)}setInterpolation(t){let e;switch(t){case H:e=this.InterpolantFactoryMethodDiscrete;break;case G:e=this.InterpolantFactoryMethodLinear;break;case U:e=this.InterpolantFactoryMethodSmooth}if(void 0===e){const e="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant){if(t===this.DefaultInterpolation)throw new Error(e);this.setInterpolation(this.DefaultInterpolation)}return console.warn("THREE.KeyframeTrack:",e),this}return this.createInterpolant=e,this}getInterpolation(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return H;case this.InterpolantFactoryMethodLinear:return G;case this.InterpolantFactoryMethodSmooth:return U}}getValueSize(){return this.values.length/this.times.length}shift(t){if(0!==t){const e=this.times;for(let n=0,i=e.length;n!==i;++n)e[n]+=t}return this}scale(t){if(1!==t){const e=this.times;for(let n=0,i=e.length;n!==i;++n)e[n]*=t}return this}trim(t,e){const n=this.times,i=n.length;let r=0,s=i-1;for(;r!==i&&n[r]<t;)++r;for(;-1!==s&&n[s]>e;)--s;if(++s,0!==r||s!==i){r>=s&&(s=Math.max(s,1),r=s-1);const t=this.getValueSize();this.times=Vo.arraySlice(n,r,s),this.values=Vo.arraySlice(this.values,r*t,s*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const n=this.times,i=this.values,r=n.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let s=null;for(let e=0;e!==r;e++){const i=n[e];if("number"==typeof i&&isNaN(i)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,i),t=!1;break}if(null!==s&&s>i){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,i,s),t=!1;break}s=i}if(void 0!==i&&Vo.isTypedArray(i))for(let e=0,n=i.length;e!==n;++e){const n=i[e];if(isNaN(n)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,n),t=!1;break}}return t}optimize(){const t=Vo.arraySlice(this.times),e=Vo.arraySlice(this.values),n=this.getValueSize(),i=this.getInterpolation()===U,r=t.length-1;let s=1;for(let a=1;a<r;++a){let r=!1;const o=t[a];if(o!==t[a+1]&&(1!==a||o!==t[0]))if(i)r=!0;else{const t=a*n,i=t-n,s=t+n;for(let a=0;a!==n;++a){const n=e[t+a];if(n!==e[i+a]||n!==e[s+a]){r=!0;break}}}if(r){if(a!==s){t[s]=t[a];const i=a*n,r=s*n;for(let t=0;t!==n;++t)e[r+t]=e[i+t]}++s}}if(r>0){t[s]=t[r];for(let t=r*n,i=s*n,a=0;a!==n;++a)e[i+a]=e[t+a];++s}return s!==t.length?(this.times=Vo.arraySlice(t,0,s),this.values=Vo.arraySlice(e,0,s*n)):(this.times=t,this.values=e),this}clone(){const t=Vo.arraySlice(this.times,0),e=Vo.arraySlice(this.values,0),n=new(0,this.constructor)(this.name,t,e);return n.createInterpolant=this.createInterpolant,n}}Yo.prototype.TimeBufferType=Float32Array,Yo.prototype.ValueBufferType=Float32Array,Yo.prototype.DefaultInterpolation=G;class Zo extends Yo{}Zo.prototype.ValueTypeName="bool",Zo.prototype.ValueBufferType=Array,Zo.prototype.DefaultInterpolation=H,Zo.prototype.InterpolantFactoryMethodLinear=void 0,Zo.prototype.InterpolantFactoryMethodSmooth=void 0;class Jo extends Yo{}Jo.prototype.ValueTypeName="color";class Qo extends Yo{}Qo.prototype.ValueTypeName="number";class Ko extends Wo{constructor(t,e,n,i){super(t,e,n,i)}interpolate_(t,e,n,i){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=(n-e)/(i-e);let l=t*a;for(let t=l+a;l!==t;l+=4)At.slerpFlat(r,0,s,l-a,s,l,o);return r}}class $o extends Yo{InterpolantFactoryMethodLinear(t){return new Ko(this.times,this.values,this.getValueSize(),t)}}$o.prototype.ValueTypeName="quaternion",$o.prototype.DefaultInterpolation=G,$o.prototype.InterpolantFactoryMethodSmooth=void 0;class tl extends Yo{}tl.prototype.ValueTypeName="string",tl.prototype.ValueBufferType=Array,tl.prototype.DefaultInterpolation=H,tl.prototype.InterpolantFactoryMethodLinear=void 0,tl.prototype.InterpolantFactoryMethodSmooth=void 0;class el extends Yo{}el.prototype.ValueTypeName="vector";class nl{constructor(t,e=-1,n,i=2500){this.name=t,this.tracks=n,this.duration=e,this.blendMode=i,this.uuid=ct(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],n=t.tracks,i=1/(t.fps||1);for(let t=0,r=n.length;t!==r;++t)e.push(il(n[t]).scale(i));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],n=t.tracks,i={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,i=n.length;t!==i;++t)e.push(Yo.toJSON(n[t]));return i}static CreateFromMorphTargetSequence(t,e,n,i){const r=e.length,s=[];for(let t=0;t<r;t++){let a=[],o=[];a.push((t+r-1)%r,t,(t+1)%r),o.push(0,1,0);const l=Vo.getKeyframeOrder(a);a=Vo.sortedArray(a,1,l),o=Vo.sortedArray(o,1,l),i||0!==a[0]||(a.push(r),o.push(o[0])),s.push(new Qo(".morphTargetInfluences["+e[t].name+"]",a,o).scale(1/n))}return new this(t,-1,s)}static findByName(t,e){let n=t;if(!Array.isArray(t)){const e=t;n=e.geometry&&e.geometry.animations||e.animations}for(let t=0;t<n.length;t++)if(n[t].name===e)return n[t];return null}static CreateClipsFromMorphTargetSequences(t,e,n){const i={},r=/^([\w-]*?)([\d]+)$/;for(let e=0,n=t.length;e<n;e++){const n=t[e],s=n.name.match(r);if(s&&s.length>1){const t=s[1];let e=i[t];e||(i[t]=e=[]),e.push(n)}}const s=[];for(const t in i)s.push(this.CreateFromMorphTargetSequence(t,i[t],e,n));return s}static parseAnimation(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const n=function(t,e,n,i,r){if(0!==n.length){const s=[],a=[];Vo.flattenJSON(n,s,a,i),0!==s.length&&r.push(new t(e,s,a))}},i=[],r=t.name||"default",s=t.fps||30,a=t.blendMode;let o=t.length||-1;const l=t.hierarchy||[];for(let t=0;t<l.length;t++){const r=l[t].keys;if(r&&0!==r.length)if(r[0].morphTargets){const t={};let e;for(e=0;e<r.length;e++)if(r[e].morphTargets)for(let n=0;n<r[e].morphTargets.length;n++)t[r[e].morphTargets[n]]=-1;for(const n in t){const t=[],s=[];for(let i=0;i!==r[e].morphTargets.length;++i){const i=r[e];t.push(i.time),s.push(i.morphTarget===n?1:0)}i.push(new Qo(".morphTargetInfluence["+n+"]",t,s))}o=t.length*(s||1)}else{const s=".bones["+e[t].name+"]";n(el,s+".position",r,"pos",i),n($o,s+".quaternion",r,"rot",i),n(el,s+".scale",r,"scl",i)}}if(0===i.length)return null;return new this(r,o,i,a)}resetDuration(){let t=0;for(let e=0,n=this.tracks.length;e!==n;++e){const n=this.tracks[e];t=Math.max(t,n.times[n.times.length-1])}return this.duration=t,this}trim(){for(let t=0;t<this.tracks.length;t++)this.tracks[t].trim(0,this.duration);return this}validate(){let t=!0;for(let e=0;e<this.tracks.length;e++)t=t&&this.tracks[e].validate();return t}optimize(){for(let t=0;t<this.tracks.length;t++)this.tracks[t].optimize();return this}clone(){const t=[];for(let e=0;e<this.tracks.length;e++)t.push(this.tracks[e].clone());return new this.constructor(this.name,this.duration,t,this.blendMode)}toJSON(){return this.constructor.toJSON(this)}}function il(t){if(void 0===t.type)throw new Error("THREE.KeyframeTrack: track type undefined, can not parse");const e=function(t){switch(t.toLowerCase()){case"scalar":case"double":case"float":case"number":case"integer":return Qo;
vendor: 6,236 bytes, line 824
824case"vector":case"vector2":case"vector3":case"vector4":return el;case"color":return Jo;case"quaternion":return $o;case"bool":case"boolean":return Zo;case"string":return tl}throw new Error("THREE.KeyframeTrack: Unsupported typeName: "+t)}(t.type);if(void 0===t.times){const e=[],n=[];Vo.flattenJSON(t.keys,e,n,"value"),t.times=e,t.values=n}return void 0!==e.parse?e.parse(t):new e(t.name,t.times,t.values,t.interpolation)}const rl={enabled:!1,files:{},add:function(t,e){!1!==this.enabled&&(this.files[t]=e)},get:function(t){if(!1!==this.enabled)return this.files[t]},remove:function(t){delete this.files[t]},clear:function(){this.files={}}};class sl{constructor(t,e,n){const i=this;let r,s=!1,a=0,o=0;const l=[];this.onStart=void 0,this.onLoad=t,this.onProgress=e,this.onError=n,this.itemStart=function(t){o++,!1===s&&void 0!==i.onStart&&i.onStart(t,a,o),s=!0},this.itemEnd=function(t){a++,void 0!==i.onProgress&&i.onProgress(t,a,o),a===o&&(s=!1,void 0!==i.onLoad&&i.onLoad())},this.itemError=function(t){void 0!==i.onError&&i.onError(t)},this.resolveURL=function(t){return r?r(t):t},this.setURLModifier=function(t){return r=t,this},this.addHandler=function(t,e){return l.push(t,e),this},this.removeHandler=function(t){const e=l.indexOf(t);return-1!==e&&l.splice(e,2),this},this.getHandler=function(t){for(let e=0,n=l.length;e<n;e+=2){const n=l[e],i=l[e+1];if(n.global&&(n.lastIndex=0),n.test(t))return i}return null}}}const al=new sl;class ol{constructor(t){this.manager=void 0!==t?t:al,this.crossOrigin="anonymous",this.withCredentials=!1,this.path="",this.resourcePath="",this.requestHeader={}}load(){}loadAsync(t,e){const n=this;return new Promise((function(i,r){n.load(t,i,e,r)}))}parse(){}setCrossOrigin(t){return this.crossOrigin=t,this}setWithCredentials(t){return this.withCredentials=t,this}setPath(t){return this.path=t,this}setResourcePath(t){return this.resourcePath=t,this}setRequestHeader(t){return this.requestHeader=t,this}}const ll={};class cl extends ol{constructor(t){super(t)}load(t,e,n,i){void 0===t&&(t=""),void 0!==this.path&&(t=this.path+t),t=this.manager.resolveURL(t);const r=this,s=rl.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;if(void 0!==ll[t])return void ll[t].push({onLoad:e,onProgress:n,onError:i});const a=t.match(/^data:(.*?)(;base64)?,(.*)$/);let o;if(a){const n=a[1],s=!!a[2];let o=a[3];o=decodeURIComponent(o),s&&(o=atob(o));try{let i;const s=(this.responseType||"").toLowerCase();switch(s){case"arraybuffer":case"blob":const t=new Uint8Array(o.length);for(let e=0;e<o.length;e++)t[e]=o.charCodeAt(e);i="blob"===s?new Blob([t.buffer],{type:n}):t.buffer;break;case"document":const e=new DOMParser;i=e.parseFromString(o,n);break;case"json":i=JSON.parse(o);break;default:i=o}setTimeout((function(){e&&e(i),r.manager.itemEnd(t)}),0)}catch(e){setTimeout((function(){i&&i(e),r.manager.itemError(t),r.manager.itemEnd(t)}),0)}}else{ll[t]=[],ll[t].push({onLoad:e,onProgress:n,onError:i}),o=new XMLHttpRequest,o.open("GET",t,!0),o.addEventListener("load",(function(e){const n=this.response,i=ll[t];if(delete ll[t],200===this.status||0===this.status){0===this.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),rl.add(t,n);for(let t=0,e=i.length;t<e;t++){const e=i[t];e.onLoad&&e.onLoad(n)}r.manager.itemEnd(t)}else{for(let t=0,n=i.length;t<n;t++){const n=i[t];n.onError&&n.onError(e)}r.manager.itemError(t),r.manager.itemEnd(t)}}),!1),o.addEventListener("progress",(function(e){const n=ll[t];for(let t=0,i=n.length;t<i;t++){const i=n[t];i.onProgress&&i.onProgress(e)}}),!1),o.addEventListener("error",(function(e){const n=ll[t];delete ll[t];for(let t=0,i=n.length;t<i;t++){const i=n[t];i.onError&&i.onError(e)}r.manager.itemError(t),r.manager.itemEnd(t)}),!1),o.addEventListener("abort",(function(e){const n=ll[t];delete ll[t];for(let t=0,i=n.length;t<i;t++){const i=n[t];i.onError&&i.onError(e)}r.manager.itemError(t),r.manager.itemEnd(t)}),!1),void 0!==this.responseType&&(o.responseType=this.responseType),void 0!==this.withCredentials&&(o.withCredentials=this.withCredentials),o.overrideMimeType&&o.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(const t in this.requestHeader)o.setRequestHeader(t,this.requestHeader[t]);o.send(null)}return r.manager.itemStart(t),o}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}}class hl extends ol{constructor(t){super(t)}load(t,e,n,i){void 0!==this.path&&(t=this.path+t),t=this.manager.resolveURL(t);const r=this,s=rl.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;const a=document.createElementNS("http://www.w3.org/1999/xhtml","img");function o(){a.removeEventListener("load",o,!1),a.removeEventListener("error",l,!1),rl.add(t,this),e&&e(this),r.manager.itemEnd(t)}function l(e){a.removeEventListener("load",o,!1),a.removeEventListener("error",l,!1),i&&i(e),r.manager.itemError(t),r.manager.itemEnd(t)}return a.addEventListener("load",o,!1),a.addEventListener("error",l,!1),"data:"!==t.substr(0,5)&&void 0!==this.crossOrigin&&(a.crossOrigin=this.crossOrigin),r.manager.itemStart(t),a.src=t,a}}class ul extends ol{constructor(t){super(t)}load(t,e,n,i){const r=new ei,s=new hl(this.manager);s.setCrossOrigin(this.crossOrigin),s.setPath(this.path);let a=0;function o(n){s.load(t[n],(function(t){r.images[n]=t,a++,6===a&&(r.needsUpdate=!0,e&&e(r))}),void 0,i)}for(let e=0;e<t.length;++e)o(e);return r}}class dl extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new ii,a=new cl(this.manager);return a.setResponseType("arraybuffer"),a.setRequestHeader(this.requestHeader),a.setPath(this.path),a.setWithCredentials(r.withCredentials),a.load(t,(function(t){const n=r.parse(t);n&&(void 0!==n.image?s.image=n.image:void 0!==n.data&&(s.image.width=n.width,s.image.height=n.height,s.image.data=n.data),s.wrapS=void 0!==n.wrapS?n.wrapS:u,s.wrapT=void 0!==n.wrapT?n.wrapT:u,s.magFilter=void 0!==n.magFilter?n.magFilter:g,s.minFilter=void 0!==n.minFilter?n.minFilter:g,s.anisotropy=void 0!==n.anisotropy?n.anisotropy:1,void 0!==n.encoding&&(s.encoding=n.encoding),void 0!==n.flipY&&(s.flipY=n.flipY),void 0!==n.format&&(s.format=n.format),void 0!==n.t
vendor: 21,253 bytes, line 824
824ype&&(s.type=n.type),void 0!==n.mipmaps&&(s.mipmaps=n.mipmaps,s.minFilter=y),1===n.mipmapCount&&(s.minFilter=g),void 0!==n.generateMipmaps&&(s.generateMipmaps=n.generateMipmaps),s.needsUpdate=!0,e&&e(s,n))}),n,i),s}}class pl extends ol{constructor(t){super(t)}load(t,e,n,i){const r=new bt,s=new hl(this.manager);return s.setCrossOrigin(this.crossOrigin),s.setPath(this.path),s.load(t,(function(n){r.image=n;const i=t.search(/\.jpe?g($|\?)/i)>0||0===t.search(/^data\:image\/jpeg/);r.format=i?T:E,r.needsUpdate=!0,void 0!==e&&e(r)}),n,i),r}}class ml{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const n=this.getUtoTmapping(t);return this.getPoint(n,e)}getPoints(t=5){const e=[];for(let n=0;n<=t;n++)e.push(this.getPoint(n/t));return e}getSpacedPoints(t=5){const e=[];for(let n=0;n<=t;n++)e.push(this.getPointAt(n/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let n,i=this.getPoint(0),r=0;e.push(0);for(let s=1;s<=t;s++)n=this.getPoint(s/t),r+=n.distanceTo(i),e.push(r),i=n;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const n=this.getLengths();let i=0;const r=n.length;let s;s=e||t*n[r-1];let a,o=0,l=r-1;for(;o<=l;)if(i=Math.floor(o+(l-o)/2),a=n[i]-s,a<0)o=i+1;else{if(!(a>0)){l=i;break}l=i-1}if(i=l,n[i]===s)return i/(r-1);const c=n[i];return(i+(s-c)/(n[i+1]-c))/(r-1)}getTangent(t,e){const n=1e-4;let i=t-n,r=t+n;i<0&&(i=0),r>1&&(r=1);const s=this.getPoint(i),a=this.getPoint(r),o=e||(s.isVector2?new vt:new Lt);return o.copy(a).sub(s).normalize(),o}getTangentAt(t,e){const n=this.getUtoTmapping(t);return this.getTangent(n,e)}computeFrenetFrames(t,e){const n=new Lt,i=[],r=[],s=[],a=new Lt,o=new se;for(let e=0;e<=t;e++){const n=e/t;i[e]=this.getTangentAt(n,new Lt),i[e].normalize()}r[0]=new Lt,s[0]=new Lt;let l=Number.MAX_VALUE;const c=Math.abs(i[0].x),h=Math.abs(i[0].y),u=Math.abs(i[0].z);c<=l&&(l=c,n.set(1,0,0)),h<=l&&(l=h,n.set(0,1,0)),u<=l&&n.set(0,0,1),a.crossVectors(i[0],n).normalize(),r[0].crossVectors(i[0],a),s[0].crossVectors(i[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),s[e]=s[e-1].clone(),a.crossVectors(i[e-1],i[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(ht(i[e-1].dot(i[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}s[e].crossVectors(i[e],r[e])}if(!0===e){let e=Math.acos(ht(r[0].dot(r[t]),-1,1));e/=t,i[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let n=1;n<=t;n++)r[n].applyMatrix4(o.makeRotationAxis(i[n],e*n)),s[n].crossVectors(i[n],r[n])}return{tangents:i,normals:r,binormals:s}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class fl extends ml{constructor(t=0,e=0,n=1,i=1,r=0,s=2*Math.PI,a=!1,o=0){super(),this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=n,this.yRadius=i,this.aStartAngle=r,this.aEndAngle=s,this.aClockwise=a,this.aRotation=o}getPoint(t,e){const n=e||new vt,i=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const s=Math.abs(r)<Number.EPSILON;for(;r<0;)r+=i;for(;r>i;)r-=i;r<Number.EPSILON&&(r=s?0:i),!0!==this.aClockwise||s||(r===i?r=-i:r-=i);const a=this.aStartAngle+t*r;let o=this.aX+this.xRadius*Math.cos(a),l=this.aY+this.yRadius*Math.sin(a);if(0!==this.aRotation){const t=Math.cos(this.aRotation),e=Math.sin(this.aRotation),n=o-this.aX,i=l-this.aY;o=n*t-i*e+this.aX,l=n*e+i*t+this.aY}return n.set(o,l)}copy(t){return super.copy(t),this.aX=t.aX,this.aY=t.aY,this.xRadius=t.xRadius,this.yRadius=t.yRadius,this.aStartAngle=t.aStartAngle,this.aEndAngle=t.aEndAngle,this.aClockwise=t.aClockwise,this.aRotation=t.aRotation,this}toJSON(){const t=super.toJSON();return t.aX=this.aX,t.aY=this.aY,t.xRadius=this.xRadius,t.yRadius=this.yRadius,t.aStartAngle=this.aStartAngle,t.aEndAngle=this.aEndAngle,t.aClockwise=this.aClockwise,t.aRotation=this.aRotation,t}fromJSON(t){return super.fromJSON(t),this.aX=t.aX,this.aY=t.aY,this.xRadius=t.xRadius,this.yRadius=t.yRadius,this.aStartAngle=t.aStartAngle,this.aEndAngle=t.aEndAngle,this.aClockwise=t.aClockwise,this.aRotation=t.aRotation,this}}fl.prototype.isEllipseCurve=!0;class gl extends fl{constructor(t,e,n,i,r,s){super(t,e,n,n,i,r,s),this.type="ArcCurve"}}function vl(){let t=0,e=0,n=0,i=0;function r(r,s,a,o){t=r,e=a,n=-3*r+3*s-2*a-o,i=2*r-2*s+a+o}return{initCatmullRom:function(t,e,n,i,s){r(e,n,s*(n-t),s*(i-e))},initNonuniformCatmullRom:function(t,e,n,i,s,a,o){let l=(e-t)/s-(n-t)/(s+a)+(n-e)/a,c=(n-e)/a-(i-e)/(a+o)+(i-n)/o;l*=a,c*=a,r(e,n,l,c)},calc:function(r){const s=r*r;return t+e*r+n*s+i*(s*r)}}}gl.prototype.isArcCurve=!0;const yl=new Lt,xl=new vl,_l=new vl,wl=new vl;class bl extends ml{constructor(t=[],e=!1,n="centripetal",i=.5){super(),this.type="CatmullRomCurve3",this.points=t,this.closed=e,this.curveType=n,this.tension=i}getPoint(t,e=new Lt){const n=e,i=this.points,r=i.length,s=(r-(this.closed?0:1))*t;let a,o,l=Math.floor(s),c=s-l;this.closed?l+=l>0?0:(Math.floor(Math.abs(l)/r)+1)*r:0===c&&l===r-1&&(l=r-2,c=1),this.closed||l>0?a=i[(l-1)%r]:(yl.subVectors(i[0],i[1]).add(i[0]),a=yl);const h=i[l%r],u=i[(l+1)%r];if(this.closed||l+2<r?o=i[(l+2)%r]:(yl.subVectors(i[r-1],i[r-2]).add(i[r-1]),o=yl),"centripetal"===this.curveType||"chordal"===this.curveType){const t="chordal"===this.curveType?.5:.25;let e=Math.pow(a.distanceToSquared(h),t),n=Math.pow(h.distanceToSquared(u),t),i=Math.pow(u.distanceToSquared(o),t);n<1e-4&&(n=1),e<1e-4&&(e=n),i<1e-4&&(i=n),xl.initNonuniformCatmullRom(a.x,h.x,u.x,o.x,e,n,i),_l.initNonuniformCatmullRom(a.y,h.y,u.y,o.y,e,n,i),wl.initNonuniformCatmullRom(a.z,h.z,u.z,o.z,e,n,i)}else"catmullrom"===this.curveType&&(xl.initCatmullRom(a.x,h.x,u.x,o.x,this.tension),_l.initCatmullRom(a.y,h.y,u.y,o.y,this.tension),wl.initCatmullRom(a.z,h.z,u.z,o.z,this.tension));return n.set(xl.calc(c),_l.calc(c),wl.calc(c)),n}copy(t){super.copy(t),this.points=[];for(let e=0,n=t.points.length;e<n;e++){const n=t.points[e];this.points.push(n.clone())}return this.closed=t.closed,this.curveType=t.curveType,this.tension=t.tension,this}toJSON(){const t=super.toJSON();t.points=[];for(let e=0,n=this.points.length;e<n;e++){const n=this.points[e];t.points.push(n.toArray())}return t.closed=this.closed,t.curveType=this.curveType,t.tension=this.tension,t}fromJSON(t){super.fromJSON(t),this.points=[];for(let e=0,n=t.points.length;e<n;e++){const n=t.points[e];this.points.push((new Lt).fromArray(n))}return this.closed=t.closed,this.curveType=t.curveType,this.tension=t.tension,this}}function Ml(t,e,n,i,r){const s=.5*(i-e),a=.5*(r-n),o=t*t;return(2*n-2*i+s+a)*(t*o)+(-3*n+3*i-2*s-a)*o+s*t+n}function Sl(t,e,n,i){return function(t,e){const n=1-t;return n*n*e}(t,e)+function(t,e){return 2*(1-t)*t*e}(t,n)+function(t,e){return t*t*e}(t,i)}function Tl(t,e,n,i,r){return function(t,e){const n=1-t;return n*n*n*e}(t,e)+function(t,e){const n=1-t;return 3*n*n*t*e}(t,n)+function(t,e){return 3*(1-t)*t*t*e}(t,i)+function(t,e){return t*t*t*e}(t,r)}bl.prototype.isCatmullRomCurve3=!0;class El extends ml{constructor(t=new vt,e=new vt,n=new vt,i=new vt){super(),this.type="CubicBezierCurve",this.v0=t,this.v1=e,this.v2=n,this.v3=i}getPoint(t,e=new vt){const n=e,i=this.v0,r=this.v1,s=this.v2,a=this.v3;return n.set(Tl(t,i.x,r.x,s.x,a.x),Tl(t,i.y,r.y,s.y,a.y)),n}copy(t){return super.copy(t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this.v3.copy(t.v3),this}toJSON(){const t=super.toJSON();return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t.v3=this.v3.toArray(),t}fromJSON(t){return super.fromJSON(t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this.v3.fromArray(t.v3),this}}El.prototype.isCubicBezierCurve=!0;class Al extends ml{constructor(t=new Lt,e=new Lt,n=new Lt,i=new Lt){super(),this.type="CubicBezierCurve3",this.v0=t,this.v1=e,this.v2=n,this.v3=i}getPoint(t,e=new Lt){const n=e,i=this.v0,r=this.v1,s=this.v2,a=this.v3;return n.set(Tl(t,i.x,r.x,s.x,a.x),Tl(t,i.y,r.y,s.y,a.y),Tl(t,i.z,r.z,s.z,a.z)),n}copy(t){return super.copy(t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this.v3.copy(t.v3),this}toJSON(){const t=super.toJSON();return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t.v3=this.v3.toArray(),t}fromJSON(t){return super.fromJSON(t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this.v3.fromArray(t.v3),this}}Al.prototype.isCubicBezierCurve3=!0;class Ll extends ml{constructor(t=new vt,e=new vt){super(),this.type="LineCurve",this.v1=t,this.v2=e}getPoint(t,e=new vt){const n=e;return 1===t?n.copy(this.v2):(n.copy(this.v2).sub(this.v1),n.multiplyScalar(t).add(this.v1)),n}getPointAt(t,e){return this.getPoint(t,e)}getTangent(t,e){const n=e||new vt;return n.copy(this.v2).sub(this.v1).normalize(),n}copy(t){return super.copy(t),this.v1.copy(t.v1),this.v2.copy(t.v2),this}toJSON(){const t=super.toJSON();return t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t}fromJSON(t){return super.fromJSON(t),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this}}Ll.prototype.isLineCurve=!0;class Rl extends ml{constructor(t=new Lt,e=new Lt){super(),this.type="LineCurve3",this.isLineCurve3=!0,this.v1=t,this.v2=e}getPoint(t,e=new Lt){const n=e;return 1===t?n.copy(this.v2):(n.copy(this.v2).sub(this.v1),n.multiplyScalar(t).add(this.v1)),n}getPointAt(t,e){return this.getPoint(t,e)}copy(t){return super.copy(t),this.v1.copy(t.v1),this.v2.copy(t.v2),this}toJSON(){const t=super.toJSON();return t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t}fromJSON(t){return super.fromJSON(t),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this}}class Cl extends ml{constructor(t=new vt,e=new vt,n=new vt){super(),this.type="QuadraticBezierCurve",this.v0=t,this.v1=e,this.v2=n}getPoint(t,e=new vt){const n=e,i=this.v0,r=this.v1,s=this.v2;return n.set(Sl(t,i.x,r.x,s.x),Sl(t,i.y,r.y,s.y)),n}copy(t){return super.copy(t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this}toJSON(){const t=super.toJSON();return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t}fromJSON(t){return super.fromJSON(t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this}}Cl.prototype.isQuadraticBezierCurve=!0;class Pl extends ml{constructor(t=new Lt,e=new Lt,n=new Lt){super(),this.type="QuadraticBezierCurve3",this.v0=t,this.v1=e,this.v2=n}getPoint(t,e=new Lt){const n=e,i=this.v0,r=this.v1,s=this.v2;return n.set(Sl(t,i.x,r.x,s.x),Sl(t,i.y,r.y,s.y),Sl(t,i.z,r.z,s.z)),n}copy(t){return super.copy(t),this.v0.copy(t.v0),this.v1.copy(t.v1),this.v2.copy(t.v2),this}toJSON(){const t=super.toJSON();return t.v0=this.v0.toArray(),t.v1=this.v1.toArray(),t.v2=this.v2.toArray(),t}fromJSON(t){return super.fromJSON(t),this.v0.fromArray(t.v0),this.v1.fromArray(t.v1),this.v2.fromArray(t.v2),this}}Pl.prototype.isQuadraticBezierCurve3=!0;class Dl extends ml{constructor(t=[]){super(),this.type="SplineCurve",this.points=t}getPoint(t,e=new vt){const n=e,i=this.points,r=(i.length-1)*t,s=Math.floor(r),a=r-s,o=i[0===s?s:s-1],l=i[s],c=i[s>i.length-2?i.length-1:s+1],h=i[s>i.length-3?i.length-1:s+2];return n.set(Ml(a,o.x,l.x,c.x,h.x),Ml(a,o.y,l.y,c.y,h.y)),n}copy(t){super.copy(t),this.points=[];for(let e=0,n=t.points.length;e<n;e++){const n=t.points[e];this.points.push(n.clone())}return this}toJSON(){const t=super.toJSON();t.points=[];for(let e=0,n=this.points.length;e<n;e++){const n=this.points[e];t.points.push(n.toArray())}return t}fromJSON(t){super.fromJSON(t),this.points=[];for(let e=0,n=t.points.length;e<n;e++){const n=t.points[e];this.points.push((new vt).fromArray(n))}return this}}Dl.prototype.isSplineCurve=!0;var Il=Object.freeze({__proto__:null,ArcCurve:gl,CatmullRomCurve3:bl,CubicBezierCurve:El,CubicBezierCurve3:Al,EllipseCurve:fl,LineCurve:Ll,LineCurve3:Rl,QuadraticBezierCurve:Cl,QuadraticBezierCurve3:Pl,SplineCurve:Dl});class Nl extends ml{constructor(){super(),this.type="CurvePath",this.curves=[],this.autoClose=!1}add(t){this.curves.push(t)}closePath(){const t=this.curves[0].getPoint(0),e=this.curves[this.curves.length-1].getPoint(1);t.equals(e)||this.curves.push(new Ll(e,t))}getPoint(t){const e=t*this.getLength(),n=this.getCurveLengths();let i=0;for(;i<n.length;){if(n[i]>=e){const t=n[i]-e,r=this.curves[i],s=r.getLength(),a=0===s?0:1-t/s;return r.getPointAt(a)}i++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let n=0,i=this.curves.length;n<i;n++)e+=this.curves[n].getLength(),t.push(e);return this.cacheLengths=t,t}getSpacedPoints(t=40){const e=[];for(let n=0;n<=t;n++)e.push(this.getPoint(n/t));return this.autoClose&&e.push(e[0]),e}getPoints(t=12){const e=[];let n;for(let i=0,r=this.curves;i<r.length;i++){const s=r[i],a=s&&s.isEllipseCurve?2*t:s&&(s.isLineCurve||s.isLineCurve3)?1:s&&s.isSplineCurve?t*s.points.length:t,o=s.getPoints(a);for(let t=0;t<o.length;t++){const i=o[t];n&&n.equals(i)||(e.push(i),n=i)}}return this.autoClose&&e.length>1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,n=t.curves.length;e<n;e++){const n=t.curves[e];this.curves.push(n.clone())}return this.autoClose=t.autoClose,this}toJSON(){const t=super.toJSON();t.autoClose=this.autoClose,t.curves=[];for(let e=0,n=this.curves.length;e<n;e++){const n=this.curves[e];t.curves.push(n.toJSON())}return t}fromJSON(t){super.fromJSON(t),this.autoClose=t.autoClose,this.curves=[];for(let e=0,n=t.curves.length;e<n;e++){const n=t.curves[e];this.curves.push((new Il[n.type]).fromJSON(n))}return this}}class Bl extends Nl{constructor(t){super(),this.type="Path",this.currentPoint=new vt,t&&this.setFromPoints(t)}setFromPoints(t){this.moveTo(t[0].x,t[0].y);for(let e=1,n=t.length;e<n;e++)this.lineTo(t[e].x,t[e].y);return this}moveTo(t,e){return this.currentPoint.set(t,e),this}lineTo(t,e){const n=new Ll(this.currentPoint.clone(),new vt(t,e));return this.curves.push(n),this.currentPoint.set(t,e),this}quadraticCurveTo(t,e,n,i){const r=new Cl(this.currentPoint.clone(),new vt(t,e),new vt(n,i));return this.curves.push(r),this.currentPoint.set(n,i),this}bezierCurveTo(t,e,n,i,r,s){const a=new El(this.currentPoint.clone(),new vt(t,e),new vt(n,i),new vt(r,s));return this.curves.push(a),this.currentPoint.set(r,s),this}splineThru(t){const e=[this.currentPoint.clone()].concat(t),n=new Dl(e);return this.curves.push(n),this.currentPoint.copy(t[t.length-1]),this}arc(t,e,n,i,r,s){const a=this.currentPoint.x,o=this.currentPoint.y;return this.absarc(t+a,e+o,n,i,r,s),this}absarc(t,e,n,i,r,s){return this.absellipse(t,e,n,n,i,r,s),this}ellipse(t,e,n,i,r,s,a,o){const l=this.currentPoint.x,c=this.currentPoint.y;return this.absellipse(t+l,e+c,n,i,r,s,a,o),this}absellipse(t,e,n,i,r,s,a,o){const l=new fl(t,e,n,i,r,s,a,o);if(this.curves.length>0){const t=l.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(l);const c=l.getPoint(1);return this.currentPoint.copy(c),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class zl extends Bl{constructor(t){super(t),this.uuid=ct(),this.type="Shape",this.holes=[]}getPointsHoles(t){const e=[];for(let n=0,i=this.holes.length;n<i;n++)e[n]=this.holes[n].getPoints(t);return e}extractPoints(t){return{shape:this.getPoints(t),holes:this.getPointsHoles(t)}}copy(t){super.copy(t),this.holes=[];for(let e=0,n=t.holes.length;e<n;e++){const n=t.holes[e];this.holes.push(n.clone())}return this}toJSON(){const t=super.toJSON();t.uuid=this.uuid,t.holes=[];for(let e=0,n=this.holes.length;e<n;e++){const n=this.holes[e];t.holes.push(n.toJSON())}return t}fromJSON(t){super.fromJSON(t),this.uuid=t.uuid,this.holes=[];for(let e=0,n=t.holes.length;e<n;e++){const n=t.holes[e];this.holes.push((new Bl).fromJSON(n))}return this}}class Fl extends Ce{constructor(t,e=1){super(),this.type="Light",this.color=new tn(t),this.intensity=e}dispose(){}copy(t){return super.copy(t),this.color.copy(t.color),this.intensity=t.intensity,this}toJSON(t){const e=super.toJSON(t);return e.object.color=this.color.getHex(),e.object.intensity=this.intensity,void 0!==this.groundColor&&(e.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(e.object.distance=this.distance),void 0!==this.angle&&(e.object.angle=this.angle),void 0!==this.decay&&(e.object.decay=this.decay),void 0!==this.penumbra&&(e.object.penumbra=this.penumbra),void 0!==this.shadow&&(e.object.shadow=this.shadow.toJSON()),e}}Fl.prototype.isLight=!0;class Ol extends Fl{constructor(t,e,n){super(t,n),this.type="HemisphereLight",this.position.copy(Ce.DefaultUp),this.updateMatrix(),this.groundColor=new tn(e)}copy(t){return Fl.prototype.copy.call(this,t),this.groundColor.copy(t.groundColor),this}}Ol.prototype.isHemisphereLight=!0;const Hl=new se,Gl=new Lt,Ul=new Lt;class kl{constructor(t){this.camera=t,this.bias=0,this.normalBias=0,this.radius=1,this.mapSize=new vt(512,512),this.map=null,this.mapPass=null,this.matrix=new se,this.autoUpdate=!0,this.needsUpdate=!1,this._frustum=new ai,this._frameExtents=new vt(1,1),this._viewportCount=1,this._viewports=[new St(0,0,1,1)]}getViewportCount(){return this._viewportCount}getFrustum(){return this._frustum}updateMatrices(t){const e=this.camera,n=this.matrix;Gl.setFromMatrixPosition(t.matrixWorld),e.position.copy(Gl),Ul.setFromMatrixPosition(t.target.matrixWorld),e.lookAt(Ul),e.updateMatrixWorld(),Hl.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Hl),n.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),n.multiply(e.projectionMatrix),n.multiply(e.matrixWorldInverse)}getViewport(t){return this._viewports[t]}getFrameExtents(){return this._frameExtents}dispose(){this.map&&this.map.dispose(),this.mapPass&&this.mapPass.dispose()}copy(t){return this.camera=t.camera.clone(),this.bias=t.bias,this.radius=t.radius,this.mapSize.copy(t.mapSize),this}clone(){return(new this.constructor).copy(this)}toJSON(){const t={};return 0!==this.bias&&(t.bias=this.bias),0!==this.normalBias&&(t.normalBias=this.normalBias),1!==this.radius&&(t.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(t.mapSize=this.mapSize.toArray()),t.camera=this.camera.toJSON(!1).object,delete t.camera.matrix,t}}class Vl extends kl{constructor(){super(new Kn(50,1,.5,500)),this.focus=1}updateMatrices(t){const e=this.camera,n=2*lt*t.angle*this.focus,i=this.mapSize.width/this.mapSize.height,r=t.distance||e.far;n===e.fov&&i===e.aspect&&r===e.far||(e.fov=n,e.aspect=i,e.far=r,e.updateProjectionMatrix()),super.updateMatrices(t)}copy(t){return super.copy(t),this.focus=t.focus,this}}Vl.prototype.isSpotLightShadow=!0;class Wl extends Fl{constructor(t,e,n=0,i=Math.PI/3,r=0,s=1){super(t,e),this.type="SpotLight",this.position.copy(Ce.DefaultUp),this.updateMatrix(),this.target=new Ce,this.distance=n,this.angle=i,this.penumbra=r,this.decay=s,this.shadow=new Vl}get power(){return this.intensity*Math.PI}set power(t){this.intensity=t/Math.PI}dispose(){this.shadow.dispose()}copy(t){return super.copy(t),this.distance=t.distance,this.angle=t.angle,this.penumbra=t.penumbra,this.decay=t.decay,this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}Wl.prototype.isSpotLight=!0;const jl=new se,ql=new Lt,Xl=new Lt;class Yl extends kl{constructor(){super(new Kn(90,1,.5,500)),this._frameExtents=new vt(4,2),this._viewportCount=6,this._viewports=[new St(2,1,1,1),new St(0,1,1,1),new St(3,1,1,1),new St(1,1,1,1),new St(3,0,1,1),new St(1,0,1,1)],this._cubeDirections=[new Lt(1,0,0),new Lt(-1,0,0),new Lt(0,0,1),new Lt(0,0,-1),new Lt(0,1,0),new Lt(0,-1,0)],this._cubeUps=[new Lt(0,1,0),new Lt(0,1,0),new Lt(0,1,0),new Lt(0,1,0),new Lt(0,0,1),new Lt(0,0,-1)]}updateMatrices(t,e=0){const n=this.camera,i=this.matrix,r=t.distance||n.far;r!==n.far&&(n.far=r,n.updateProjectionMatrix()),ql.setFromMatrixPosition(t.matrixWorld),n.position.copy(ql),Xl.copy(n.position),Xl.add(this._cubeDirections[e]),n.up.copy(this._cubeUps[e]),n.lookAt(Xl),n.updateMatrixWorld(),i.makeTranslation(-ql.x,-ql.y,-ql.z),jl.multiplyMatrices(n.projectionMatrix,n.matrixWorldInverse),this._frustum.setFromProjectionMatrix(jl)}}Yl.prototype.isPointLightShadow=!0;class Zl extends Fl{constructor(t,e,n=0,i=1){super(t,e),this.type="PointLight",this.distance=n,this.decay=i,this.shadow=new Yl}get power(){return 4*this.intensity*Math.PI}set power(t){this.intensity=t/(4*Math.PI)}dispose(){this.shadow.dispose()}copy(t){return super.copy(t),this.distance=t.distance,this.decay=t.decay,this.shadow=t.shadow.clone(),this}}Zl.prototype.isPointLight=!0;class Jl extends Qn{constructor(t=-1,e=1,n=1,i=-1,r=.1,s=2e3){super(),this.type="Orthogra
824phicCamera",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=n,this.bottom=i,this.near=r,this.far=s,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=null===t.view?null:Object.assign({},t.view),this}setViewOffset(t,e,n,i,r,s){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),n=(this.right+this.left)/2,i=(this.top+this.bottom)/2;let r=n-t,s=n+t,a=i+e,o=i-e;if(null!==this.view&&this.view.enabled){const t=(this.right-this.left)/this.view.fullWidth/this.zoom,e=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=t*this.view.offsetX,s=r+t*this.view.width,a-=e*this.view.offsetY,o=a-e*this.view.height}this.projectionMatrix.makeOrthographic(r,s,a,o,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,null!==this.view&&(e.object.view=Object.assign({},this.view)),e}}Jl.prototype.isOrthographicCamera=!0;class Ql extends kl{constructor(){super(new Jl(-5,5,5,-5,.5,500))}}Ql.prototype.isDirectionalLightShadow=!0;class Kl extends Fl{constructor(t,e){super(t,e),this.type="DirectionalLight",this.position.copy(Ce.DefaultUp),this.updateMatrix(),this.target=new Ce,this.shadow=new Ql}dispose(){this.shadow.dispose()}copy(t){return super.copy(t),this.target=t.target.clone(),this.shadow=t.shadow.clone(),this}}Kl.prototype.isDirectionalLight=!0;class $l extends Fl{constructor(t,e){super(t,e),this.type="AmbientLight"}}$l.prototype.isAmbientLight=!0;class tc extends Fl{constructor(t,e,n=10,i=10){super(t,e),this.type="RectAreaLight",this.width=n,this.height=i}copy(t){return super.copy(t),this.width=t.width,this.height=t.height,this}toJSON(t){const e=super.toJSON(t);return e.object.width=this.width,e.object.height=this.height,e}}tc.prototype.isRectAreaLight=!0;class ec{constructor(){this.coefficients=[];for(let t=0;t<9;t++)this.coefficients.push(new Lt)}set(t){for(let e=0;e<9;e++)this.coefficients[e].copy(t[e]);return this}zero(){for(let t=0;t<9;t++)this.coefficients[t].set(0,0,0);return this}getAt(t,e){const n=t.x,i=t.y,r=t.z,s=this.coefficients;return e.copy(s[0]).multiplyScalar(.282095),e.addScaledVector(s[1],.488603*i),e.addScaledVector(s[2],.488603*r),e.addScaledVector(s[3],.488603*n),e.addScaledVector(s[4],n*i*1.092548),e.addScaledVector(s[5],i*r*1.092548),e.addScaledVector(s[6],.315392*(3*r*r-1)),e.addScaledVector(s[7],n*r*1.092548),e.addScaledVector(s[8],.546274*(n*n-i*i)),e}getIrradianceAt(t,e){const n=t.x,i=t.y,r=t.z,s=this.coefficients;return e.copy(s[0]).multiplyScalar(.886227),e.addScaledVector(s[1],1.023328*i),e.addScaledVector(s[2],1.023328*r),e.addScaledVector(s[3],1.023328*n),e.addScaledVector(s[4],.858086*n*i),e.addScaledVector(s[5],.858086*i*r),e.addScaledVector(s[6],.743125*r*r-.247708),e.addScaledVector(s[7],.858086*n*r),e.addScaledVector(s[8],.429043*(n*n-i*i)),e}add(t){for(let e=0;e<9;e++)this.coefficients[e].add(t.coefficients[e]);return this}addScaledSH(t,e){for(let n=0;n<9;n++)this.coefficients[n].addScaledVector(t.coefficients[n],e);return this}scale(t){for(let e=0;e<9;e++)this.coefficients[e].multiplyScalar(t);return this}lerp(t,e){for(let n=0;n<9;n++)this.coefficients[n].lerp(t.coefficients[n],e);return this}equals(t){for(let e=0;e<9;e++)if(!this.coefficients[e].equals(t.coefficients[e]))return!1;return!0}copy(t){return this.set(t.coefficients)}clone(){return(new this.constructor).copy(this)}fromArray(t,e=0){const n=this.coefficients;for(let i=0;i<9;i++)n[i].fromArray(t,e+3*i);return this}toArray(t=[],e=0){const n=this.coefficients;for(let i=0;i<9;i++)n[i].toArray(t,e+3*i);return t}static getBasisAt(t,e){const n=t.x,i=t.y,r=t.z;e[0]=.282095,e[1]=.488603*i,e[2]=.488603*r,e[3]=.488603*n,e[4]=1.092548*n*i,e[5]=1.092548*i*r,e[6]=.315392*(3*r*r-1),e[7]=1.092548*n*r,e[8]=.546274*(n*n-i*i)}}ec.prototype.isSphericalHarmonics3=!0;class nc extends Fl{constructor(t=new ec,e=1){super(void 0,e),this.sh=t}copy(t){return super.copy(t),this.sh.copy(t.sh),this}fromJSON(t){return this.intensity=t.intensity,this.sh.fromArray(t.sh),this}toJSON(t){const e=super.toJSON(t);return e.object.sh=this.sh.toArray(),e}}nc.prototype.isLightProbe=!0;class ic extends ol{constructor(t){super(t),this.textures={}}load(t,e,n,i){const r=this,s=new cl(r.manager);s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(n){try{e(r.parse(JSON.parse(n)))}catch(e){i?i(e):console.error(e),r.manager.itemError(t)}}),n,i)}parse(t){const e=this.textures;function n(t){return void 0===e[t]&&console.warn("THREE.MaterialLoader: Undefined texture",t),e[t]}const i=new ko[t.type];if(void 0!==t.uuid&&(i.uuid=t.uuid),void 0!==t.name&&(i.name=t.name),void 0!==t.color&&void 0!==i.color&&i.color.setHex(t.color),void 0!==t.roughness&&(i.roughness=t.roughness),void 0!==t.metalness&&(i.metalness=t.metalness),void 0!==t.sheen&&(i.sheen=(new tn).setHex(t.sheen)),void 0!==t.emissive&&void 0!==i.emissive&&i.emissive.setHex(t.emissive),void 0!==t.specular&&void 0!==i.specular&&i.specular.setHex(t.specular),void 0!==t.shininess&&(i.shininess=t.shininess),void 0!==t.clearcoat&&(i.clearcoat=t.clearcoat),void 0!==t.clearcoatRoughness&&(i.clearcoatRoughness=t.clearcoatRoughness),void 0!==t.fog&&(i.fog=t.fog),void 0!==t.flatShading&&(i.flatShading=t.flatShading),void 0!==t.blending&&(i.blending=t.blending),void 0!==t.combine&&(i.combine=t.combine),void 0!==t.side&&(i.side=t.side),void 0!==t.shadowSide&&(i.shadowSide=t.shadowSide),void 0!==t.opacity&&(i.opacity=t.opacity),void 0!==t.transparent&&(i.transparent=t.transparent),void 0!==t.alphaTest&&(i.alphaTest=t.alphaTest),void 0!==t.depthTest&&(i.depthTest=t.depthTest),void 0!==t.depthWrite&&(i.depthWrite=t.depthWrite),void 0!==t.colorWrite&&(i.colorWrite=t.colorWrite),void 0!==t.stencilWrite&&(i.stencilWrite=t.stencilWrite),void 0!==t.stencilWriteMask&&(i.stencilWriteMask=t.stencilWriteMask),void 0!==t.stencilFunc&&(i.stencilFunc=t.stencilFunc),void 0!==t.stencilRef&&(i.stencilRef=t.stencilRef),void 0!==t.stencilFuncMask&&(i.stencilFuncMask=t.stencilFuncMask),void 0!==t.stencilFail&&(i.stencilFail=t.stencilFail),void 0!==t.stencilZFail&&(i.stencilZFail=t.stencilZFail),void 0!==t.stencilZPass&&(i.stencilZPass=t.stencilZPass),void 0!==t.wireframe&&(i.wireframe=t.wireframe),void 0!==t.wireframeLinewidth&&(i.wireframeLinewidth=t.wireframeLinewidth),void 0!==t.wireframeLinecap&&(i.wireframeLinecap=t.wireframeLinecap),void 0!==t.wireframeLinejoin&&(i.wireframeLinejoin=t.wireframeLinejoin),void 0!==t.rotation&&(i.rotation=t.rotation),1!==t.linewidth&&(i.linewidth=t.linewidth),void 0!==t.dashSize&&(i.dashSize=t.dashSize),void 0!==t.gapSize&&(i.gapSize=t.gapSize),void 0!==t.scale&&(i.scale=t.scale),void 0!==t.polygonOffset&&(i.polygonOffset=t.polygonOffset),void 0!==t.polygonOffsetFactor&&(i.polygonOffsetFactor=t.polygonOffsetFactor),void 0!==t.polygonOffsetUnits&&(i.polygonOffsetUnits=t.polygonOffsetUnits),void 0!==t.skinning&&(i.skinning=t.skinning),void 0!==t.morphTargets&&(i.morphTargets=t.morphTargets),void 0!==t.morphNormals&&
vendor: 5,541 bytes, line 824
824(i.morphNormals=t.morphNormals),void 0!==t.dithering&&(i.dithering=t.dithering),void 0!==t.alphaToCoverage&&(i.alphaToCoverage=t.alphaToCoverage),void 0!==t.premultipliedAlpha&&(i.premultipliedAlpha=t.premultipliedAlpha),void 0!==t.vertexTangents&&(i.vertexTangents=t.vertexTangents),void 0!==t.visible&&(i.visible=t.visible),void 0!==t.toneMapped&&(i.toneMapped=t.toneMapped),void 0!==t.userData&&(i.userData=t.userData),void 0!==t.vertexColors&&("number"==typeof t.vertexColors?i.vertexColors=t.vertexColors>0:i.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(i.uniforms[e]={},r.type){case"t":i.uniforms[e].value=n(r.value);break;case"c":i.uniforms[e].value=(new tn).setHex(r.value);break;case"v2":i.uniforms[e].value=(new vt).fromArray(r.value);break;case"v3":i.uniforms[e].value=(new Lt).fromArray(r.value);break;case"v4":i.uniforms[e].value=(new St).fromArray(r.value);break;case"m3":i.uniforms[e].value=(new yt).fromArray(r.value);break;case"m4":i.uniforms[e].value=(new se).fromArray(r.value);break;default:i.uniforms[e].value=r.value}}if(void 0!==t.defines&&(i.defines=t.defines),void 0!==t.vertexShader&&(i.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(i.fragmentShader=t.fragmentShader),void 0!==t.extensions)for(const e in t.extensions)i.extensions[e]=t.extensions[e];if(void 0!==t.shading&&(i.flatShading=1===t.shading),void 0!==t.size&&(i.size=t.size),void 0!==t.sizeAttenuation&&(i.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(i.map=n(t.map)),void 0!==t.matcap&&(i.matcap=n(t.matcap)),void 0!==t.alphaMap&&(i.alphaMap=n(t.alphaMap)),void 0!==t.bumpMap&&(i.bumpMap=n(t.bumpMap)),void 0!==t.bumpScale&&(i.bumpScale=t.bumpScale),void 0!==t.normalMap&&(i.normalMap=n(t.normalMap)),void 0!==t.normalMapType&&(i.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),i.normalScale=(new vt).fromArray(e)}return void 0!==t.displacementMap&&(i.displacementMap=n(t.displacementMap)),void 0!==t.displacementScale&&(i.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(i.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(i.roughnessMap=n(t.roughnessMap)),void 0!==t.metalnessMap&&(i.metalnessMap=n(t.metalnessMap)),void 0!==t.emissiveMap&&(i.emissiveMap=n(t.emissiveMap)),void 0!==t.emissiveIntensity&&(i.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(i.specularMap=n(t.specularMap)),void 0!==t.envMap&&(i.envMap=n(t.envMap)),void 0!==t.envMapIntensity&&(i.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(i.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(i.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(i.lightMap=n(t.lightMap)),void 0!==t.lightMapIntensity&&(i.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(i.aoMap=n(t.aoMap)),void 0!==t.aoMapIntensity&&(i.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(i.gradientMap=n(t.gradientMap)),void 0!==t.clearcoatMap&&(i.clearcoatMap=n(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(i.clearcoatRoughnessMap=n(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(i.clearcoatNormalMap=n(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(i.clearcoatNormalScale=(new vt).fromArray(t.clearcoatNormalScale)),void 0!==t.transmission&&(i.transmission=t.transmission),void 0!==t.transmissionMap&&(i.transmissionMap=n(t.transmissionMap)),i}setTextures(t){return this.textures=t,this}}class rc{static decodeText(t){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(t);let e="";for(let n=0,i=t.length;n<i;n++)e+=String.fromCharCode(t[n]);try{return decodeURIComponent(escape(e))}catch(t){return e}}static extractUrlBase(t){const e=t.lastIndexOf("/");return-1===e?"./":t.substr(0,e+1)}}class sc extends En{constructor(){super(),this.type="InstancedBufferGeometry",this.instanceCount=1/0}copy(t){return super.copy(t),this.instanceCount=t.instanceCount,this}clone(){return(new this.constructor).copy(this)}toJSON(){const t=super.toJSON(this);return t.instanceCount=this.instanceCount,t.isInstancedBufferGeometry=!0,t}}sc.prototype.isInstancedBufferGeometry=!0;class ac extends sn{constructor(t,e,n,i){"number"==typeof n&&(i=n,n=!1,console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.")),super(t,e,n),this.meshPerAttribute=i||1}copy(t){return super.copy(t),this.meshPerAttribute=t.meshPerAttribute,this}toJSON(){const t=super.toJSON();return t.meshPerAttribute=this.meshPerAttribute,t.isInstancedBufferAttribute=!0,t}}ac.prototype.isInstancedBufferAttribute=!0;class oc extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new cl(r.manager);s.setPath(r.path),s.setRequestHeader(r.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(n){try{e(r.parse(JSON.parse(n)))}catch(e){i?i(e):console.error(e),r.manager.itemError(t)}}),n,i)}parse(t){const e={},n={};function i(t,i){if(void 0!==e[i])return e[i];const r=t.interleavedBuffers[i],s=function(t,e){if(void 0!==n[e])return n[e];const i=t.arrayBuffers[e],r=new Uint32Array(i).buffer;return n[e]=r,r}(t,r.buffer),a=yn(r.type,s),o=new Es(a,r.stride);return o.uuid=r.uuid,e[i]=o,o}const r=t.isInstancedBufferGeometry?new sc:new En,s=t.data.index;if(void 0!==s){const t=yn(s.type,s.array);r.setIndex(new sn(t,1))}const a=t.data.attributes;for(const e in a){const n=a[e];let s;if(n.isInterleavedBufferAttribute){const e=i(t.data,n.data);s=new Ls(e,n.itemSize,n.offset,n.normalized)}else{const t=yn(n.type,n.array);
824s=new(n.isInstancedBufferAttribute?ac:sn)(t,n.itemSize,n.normalized)}void 0!==n.name&&(s.name=n.name),void 0!==n.usage&&s.setUsage(n.usage),void 0!==n.updateRange&&(s.updateRange.offset=n.updateRange.offset,s.updateRange.count=n.updateRange.count),r.setAttribute(e,s)}const o=t.data.morphAttributes;if(o)for(const e in o){const n=o[e],s=[];for(let e=0,r=n.length;e<r;e++){const r=n[e];let a;if(r.isInterleavedBufferAttribute){const e=i(t.data,r.data);a=new Ls(e,r.itemSize,r.offset,r.normalized)}else{const t=yn(r.type,r.array);a=new sn(t,r.itemSize,r.normalized)}void 0!==r.name&&(a.name=r.name),s.push(a)}r.morphAttributes[e]=s}t.data.morphTargetsRelative&&(r.morphTargetsRelative=!0);const l=t.data.groups||t.data.drawcalls||t.data.offsets;if(void 0!==l)for(let t=0,e=l.length;t!==e;++t){const e=l[t];r.addGroup(e.start,e.count,e.materialIndex)}const c=t.data.boundingSphere;if(void 0!==c){const t=new Lt;void 0!==c.center&&t.fromArray(c.center),r.boundingSphere=new Jt(t,c.radius)}return t.name&&(r.name=t.name),t.userData&&(r.userData=t.userData),r}}const lc={UVMapping:i,CubeReflectionMapping:r,CubeRefractionMapping:s,EquirectangularReflectionMapping:a,EquirectangularRefractionMapping:o,CubeUVReflectionMapping:l,CubeUVRefractionMapping:c},cc={RepeatWrapping:h,ClampToEdgeWrapping:u,MirroredRepeatWrapping:d},hc={NearestFilter:p,NearestMipmapNearestFilter:m,NearestMipmapLinearFilter:f,LinearFilter:g,LinearMipmapNearestFilter:v,LinearMipmapLinearFilter:y};class uc extends ol{constructor(t){super(t),"undefined"==typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."),"undefined"==typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported."),this.options={premultiplyAlpha:"none"}}setOptions(t){return this.options=t,this}load(t,e,n,i){void 0===t&&(t=""),void 0!==this.path&&(t=this.path+t),t=this.manager.resolveURL(t);const r=this,s=rl.get(t);if(void 0!==s)return r.manager.itemStart(t),setTimeout((function(){e&&e(s),r.manager.itemEnd(t)}),0),s;const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader,fetch(t,a).then((function(t){return t.blob()})).then((function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))})).then((function(n){rl.add(t,n),e&&e(n),r.manager.itemEnd(t)})).catch((function(e){i&&i(e),r.manager.itemError(t),r.manager.itemEnd(t)})),r.manager.itemStart(t)}}uc.prototype.isImageBitmapLoader=!0;class dc{constructor(){this.type="ShapePath",this.color=new tn,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new Bl,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,n,i){return this.currentPath.quadraticCurveTo(t,e,n,i),this}bezierCurveTo(t,e,n,i,r,s){return this.currentPath.bezierCurveTo(t,e,n,i,r,s),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t,e){function n(t){const e=[];for(let n=0,i=t.length;n<i;n++){const i=t[n],r=new zl;r.curves=i.curves,e.push(r)}return e}function i(t,e){const n=e.length;let i=!1;for(let r=n-1,s=0;s<n;r=s++){let n=e[r],a=e[s],o=a.x-n.x,l=a.y-n.y;if(Math.abs(l)>Number.EPSILON){if(l<0&&(n=e[s],o=-o,a=e[r],l=-l),t.y<n.y||t.y>a.y)continue;if(t.y===n.y){if(t.x===n.x)return!0}else{const e=l*(t.x-n.x)-o*(t.y-n.y);if(0===e)return!0;if(e<0)continue;i=!i}}else{if(t.y!==n.y)continue;if(a.x<=t.x&&t.x<=n.x||n.x<=t.x&&t.x<=a.x)return!0}}return i}const r=po.isClockWise,s=this.subPaths;if(0===s.length)return[];if(!0===e)return n(s);let a,o,l;const c=[];if(1===s.length)return o=s[0],l=new zl,l.curves=o.curves,c.push(l),c;let h=!r(s[0].getPoints());h=t?!h:h;const u=[],d=[];let p,m,f=[],g=0;d[g]=void 0,f[g]=[];for(let e=0,n=s.length;e<n;e++)o=s[e],p=o.getPoints(),a=r(p),a=t?!a:a,a?(!h&&d[g]&&g++,d[g]={s:new zl,p:p},d[g].s.curves=o.curves,h&&g++,f[g]=[]):f[g].push({h:o,p:p[0]});if(!d[0])return n(s);if(d.length>1){let t=!1;const e=[];for(let t=0,e=d.length;t<e;t++)u[t]=[];for(let n=0,r=d.length;n<r;n++){const r=f[n];for(let s=0;s<r.length;s++){const a=r[s];let o=!0;for(let r=0;r<d.length;r++)i(a.p,d[r].p)&&(n!==r&&e.push({froms:n,tos:r,hole:s}),o?(o=!1,u[r].push(a)):t=!0);o&&u[n].push(a)}}e.length>0&&(t||(f=u))}for(let t=0,e=d.length;t<e;t++){l=d[t].s,c.push(l),m=f[t];for(let t=0,e=m.length;t<e;t++)l.holes.push(m[t].h)}return c}}class pc{constructor(t){this.type="Font",this.data=t}generateShapes(t,e=100){const n=[],i=function(t,e,n){const i=Array.from(t),r=e/n.resolution,s=(n.boundingBox.yMax-n.boundingBox.yMin+n.underlineThickness)*r,a=[];let o=0,l=0;for(let t=0;t<i.length;t++){const e=i[t];if("\n"===e)o=0,l-=s;else{const t=mc(e,r,o,l,n);o+=t.offsetX,a.push(t.path)}}return a}(t,e,this.data);for(let t=0,e=i.length;t<e;t++)Array.prototype.push.apply(n,i[t].toShapes());return n}}function mc(t,e,n,i,r){const s=r.glyphs[t]||r.glyphs["?"];if(!s)return void console.error('THREE.Font: character "'+t+'" does not exists in font family '+r.familyName+".");const a=new dc;let o,l,c,h,u,d,p,m;if(s.o){const t=s._cachedOutline||(s._cachedOutline=s.o.split(" "));for(let r=0,s=t.length;r<s;){switch(t[r++]){case"m":o=t[r++]*e+n,l=t[r++]*e+i,a.moveTo(o,l);break;case"l":o=t[r++]*e+n,l=t[r++]*e+i,a.lineTo(o,l);break;case"q":c=t[r++]*e+n,h=t[r++]*e+i,u=t[r++]*e+n,d=t[r++]*e+i,a.quadraticCurveTo(u,d,c,h);break;case"b":c=t[r++]*e+n,h=t[r++]*e+i,u=t[r++]*e+n,d=t[r++]*e+i,p=t[r++]*e+n,m=t[r++]*e+i,a.bezierCurveTo(u,d,p,m,c,h)}}}return{offsetX:s.ha*e,path:a}}pc.prototype.isFont=!0;let fc;const gc={getContext:function(){return void 0===fc&&(fc=new(window.AudioContext||window.webkitAudioContext)),fc},setContext:function(t){fc=t}};class vc extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new cl(this.manager);s.setResponseType("arraybuffer"),s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(t,(function(n){try{const t=n.slice(0);gc.getContext().decodeAudioData(t,(function(t){e(t)}))}catch(e){i?i(e):console.error(e),r.manager.itemError(t)}}),n,i)}}class yc extends nc{constructor(t,e,n=1){super(void 0,n);const i=(new tn).set(t),r=(new tn).set(e),s=new Lt(i.r,i.g,i.b),a=new Lt(r.r,r.g,r.b),o=Math.sqrt(Math.PI),l=o*Math.sqrt(.75);this.sh.coefficients[0].copy(s).add(a).multiplyScalar(o),this.sh.coefficients[1].copy(s).sub(a).multiplyScalar(l)}}yc.prototype.isHemisphereLightProbe=!0;class xc extends nc{constructor(t,e=1){super(void 0,e);const n=(new tn).set(t);this.sh.coefficients[0].set(n.r,n.g,n.b).multiplyScalar(2*Math.sqrt(Math.PI))}}xc.prototype.isAmbientLightProbe=!0;const _c=new se,wc=new se;class bc{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=Mc(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const e=Mc();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}function Mc(){return("undefined"==typeof performance?Date:performance).now()}const Sc=new Lt,Tc=new At,Ec=new Lt,Ac=new Lt;class Lc extends Ce{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getIn
vendor: 10,945 bytes, line 824
824put()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void console.warn("THREE.Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void console.warn("THREE.Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")}stop(){if(!1!==this.hasPlaybackControl)return this._progress=0,this.source.stop(),this.source.onended=null,this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t<e;t++)this.filters[t-1].connect(this.filters[t]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this._connected=!0,this}disconnect(){if(this.filters.length>0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t<e;t++)this.filters[t-1].disconnect(this.filters[t]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this._connected=!1,this}getFilters(){return this.filters}setFilters(t){return t||(t=[]),!0===this._connected?(this.disconnect(),this.filters=t.slice(),this.connect()):this.filters=t.slice(),this}setDetune(t){if(this.detune=t,void 0!==this.source.detune)return!0===this.isPlaying&&this.source.detune.setTargetAtTime(this.detune,this.context.currentTime,.01),this}getDetune(){return this.detune}getFilter(){return this.getFilters()[0]}setFilter(t){return this.setFilters(t?[t]:[])}setPlaybackRate(t){if(!1!==this.hasPlaybackControl)return this.playbackRate=t,!0===this.isPlaying&&this.source.playbackRate.setTargetAtTime(this.playbackRate,this.context.currentTime,.01),this;console.warn("THREE.Audio: this Audio has no playback control.")}getPlaybackRate(){return this.playbackRate}onEnded(){this.isPlaying=!1}getLoop(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop}setLoop(t){if(!1!==this.hasPlaybackControl)return this.loop=t,!0===this.isPlaying&&(this.source.loop=this.loop),this;console.warn("THREE.Audio: this Audio has no playback control.")}setLoopStart(t){return this.loopStart=t,this}setLoopEnd(t){return this.loopEnd=t,this}getVolume(){return this.gain.gain.value}setVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}}const Rc=new Lt,Cc=new At,Pc=new Lt,Dc=new Lt;class Ic{constructor(t,e=2048){this.analyser=t.context.createAnalyser(),this.analyser.fftSize=e,this.data=new Uint8Array(this.analyser.frequencyBinCount),t.getOutput().connect(this.analyser)}getFrequencyData(){return this.analyser.getByteFrequencyData(this.data),this.data}getAverageFrequency(){let t=0;const e=this.getFrequencyData();for(let n=0;n<e.length;n++)t+=e[n];return t/e.length}}class Nc{constructor(t,e,n){let i,r,s;switch(this.binding=t,this.valueSize=n,e){case"quaternion":i=this._slerp,r=this._slerpAdditive,s=this._setAdditiveIdentityQuaternion,this.buffer=new Float64Array(6*n),this._workIndex=5;break;case"string":case"bool":i=this._select,r=this._select,s=this._setAdditiveIdentityOther,this.buffer=new Array(5*n);break;default:i=this._lerp,r=this._lerpAdditive,s=this._setAdditiveIdentityNumeric,this.buffer=new Float64Array(5*n)}this._mixBufferRegion=i,this._mixBufferRegionAdditive=r,this._setIdentity=s,this._origIndex=3,this._addIndex=4,this.cumulativeWeight=0,this.cumulativeWeightAdditive=0,this.useCount=0,this.referenceCount=0}accumulate(t,e){const n=this.buffer,i=this.valueSize,r=t*i+i;let s=this.cumulativeWeight;if(0===s){for(let t=0;t!==i;++t)n[r+t]=n[t];s=e}else{s+=e;const t=e/s;this._mixBufferRegion(n,r,0,t,i)}this.cumulativeWeight=s}accumulateAdditive(t){const e=this.buffer,n=this.valueSize,i=n*this._addIndex;0===this.cumulativeWeightAdditive&&this._setIdentity(),this._mixBufferRegionAdditive(e,i,0,t,n),this.cumulativeWeightAdditive+=t}apply(t){const e=this.valueSize,n=this.buffer,i=t*e+e,r=this.cumulativeWeight,s=this.cumulativeWeightAdditive,a=this.binding;if(this.cumulativeWeight=0,this.cumulativeWeightAdditive=0,r<1){const t=e*this._origIndex;this._mixBufferRegion(n,i,t,1-r,e)}s>0&&this._mixBufferRegionAdditive(n,i,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(n[t]!==n[t+e]){a.setValue(n,i);break}}saveOriginalState(){const t=this.binding,e=this.buffer,n=this.valueSize,i=n*this._origIndex;t.getValue(e,i);for(let t=n,r=i;t!==r;++t)e[t]=e[i+t%n];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let n=t;n<e;n++)this.buffer[n]=0}_setAdditiveIdentityQuaternion(){this._setAdditiveIdentityNumeric(),this.buffer[this._addIndex*this.valueSize+3]=1}_setAdditiveIdentityOther(){const t=this._origIndex*this.valueSize,e=this._addIndex*this.valueSize;for(let n=0;n<this.valueSize;n++)this.buffer[e+n]=this.buffer[t+n]}_select(t,e,n,i,r){if(i>=.5)for(let i=0;i!==r;++i)t[e+i]=t[n+i]}_slerp(t,e,n,i){At.slerpFlat(t,e,t,e,t,n,i)}_slerpAdditive(t,e,n,i,r){const s=this._workIndex*r;At.multiplyQuaternionsFlat(t,s,t,e,t,n),At.slerpFlat(t,e,t,e,t,s,i)}_lerp(t,e,n,i,r){const s=1-i;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*s+t[n+a]*i}}_lerpAdditive(t,e,n,i,r){for(let s=0;s!==r;++s){const r=e+s;t[r]=t[r]+t[n+s]*i}}}const Bc="\\[\\]\\.:\\/",zc=new RegExp("[\\[\\]\\.:\\/]","g"),Fc="[^\\[\\]\\.:\\/]",Oc="[^"+Bc.replace("\\.","")+"]",Hc=/((?:WC+[\/:])*)/.source.replace("WC",Fc),Gc=/(WCOD+)?/.source.replace("WCOD",Oc),Uc=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Fc),kc=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Fc),Vc=new RegExp("^"+Hc+Gc+Uc+kc+"$"),Wc=["material","materials","bones"];class jc{constructor(t,e,n){this.path=e,this.parsedPath=n||jc.parseTrackName(e),this.node=jc.findNode(t,this.parsedPath.nodeName)||t,this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,n){return t&&t.isAnimationObjectGroup?new jc.Composite(t,e,n):new jc(t,e,n)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(zc,"")}static parseTrackName(t){const e=Vc.exec(t);if(!e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const n={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},i=n.nodeName&&n.nodeName.lastIndexOf(".");if(void 0!==i&&-1!==i){const t=n.nodeName.substring(i+1);-1!==Wc.indexOf(t)&&(n.nodeName=n.nodeName.substring(0,i),n.objectName=t)}if(null===n.propertyName||0===n.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return n}static findNode(t,e){if(!e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const n=t.skeleton.getBoneByName(e);if(void 0!==n)return n}if(t.children){const n=function(t){for(let i=0;i<t.length;i++){const r=t[i];if(r.name===e||r.uuid===e)return r;const s=n(r.children);if(s)return s}return null},i=n(t.children);if(i)return i}return null}_getValue_unavailable(){}_setValue_unavailable(){}_getValue_direct(t,e){t[e]=this.node[this.propertyName]}_getValue_array(t,e){const n=this.resolvedProperty;for(let i=0,r=n.length;i!==r;++i)t[e++]=n[i]}_getValue_arrayElement(t,e){t[e]=this.resolvedProperty[this.propertyIndex]}_getValue_toArray(t,e){this.resolvedProperty.toArray(t,e)}_setValue_direct(t,e){this.targetObject[this.propertyName]=t[e]}_setValue_direct_setNeedsUpdate(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.needsUpdate=!0}_setValue_direct_setMatrixWorldNeedsUpdate(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_array(t,e){const n=this.resolvedProperty;for(let i=0,r=n.length;i!==r;++i)n[i]=t[e++]}_setValue_array_setNeedsUpdate(t,e){const n=this.resolvedProperty;for(let i=0,r=n.length;i!==r;++i)n[i]=t[e++];this.targetObject.needsUpdate=!0}_setValue_array_setMatrixWorldNeedsUpdate(t,e){const n=this.resolvedProperty;for(let i=0,r=n.length;i!==r;++i)n[i]=t[e++];this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_arrayElement(t,e){this.resolvedProperty[this.propertyIndex]=t[e]}_setValue_arrayElement_setNeedsUpdate(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.needsUpdate=!0}_setValue_arrayElement_setMatrixWorldNeedsUpdate(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_fromArray(t,e){this.resolvedProperty.fromArray(t,e)}_setValue_fromArray_setNeedsUpdate(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.needsUpdate=!0}_setValue_fromArray_setMatrixWorldNeedsUpdate(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.matrixWorldNeedsUpdate=!0}_getValue_unbound(t,e){this.bind(),this.getValue(t,e)}_setValue_unbound(t,e){this.bind(),this.setValue(t,e)}bind(){let t=this.node;const e=this.parsedPath,n=e.objectName,i=e.propertyName;let r=e.propertyIndex;if(t||(t=jc.findNode(this.rootNode,e.nodeName)||this.rootNode,this.node=t),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,!t)return void console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.");if(n){let i=e.objectIndex;switch(n){case"materials":if(!t.material)return void console.error("THREE.PropertyBinding: Can not bind to material as no
824de does not have a material.",this);if(!t.material.materials)return void console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);t=t.material.materials;break;case"bones":if(!t.skeleton)return void console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);t=t.skeleton.bones;for(let e=0;e<t.length;e++)if(t[e].name===i){i=e;break}break;default:if(void 0===t[n])return void console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);t=t[n]}if(void 0!==i){if(void 0===t[i])return void console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,t);t=t[i]}}const s=t[i];if(void 0===s){const n=e.nodeName;return void console.error("THREE.PropertyBinding: Trying to update property for track: "+n+"."+i+" but it wasn't found.",t)}let a=this.Versioning.None;this.targetObject=t,void 0!==t.needsUpdate?a=this.Versioning.NeedsUpdate:void 0!==t.matrixWorldNeedsUpdate&&(a=this.Versioning.MatrixWorldNeedsUpdate);let o=this.BindingType.Direct;if(void 0!==r){if("morphTargetInfluences"===i){if(!t.geometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",this);if(!t.geometry.isBufferGeometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.",this);if(!t.geometry.morphAttributes)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);void 0!==t.morphTargetDictionary[r]&&(r=t.morphTargetDictionary[r])}o=this.BindingType.ArrayElement,this.resolvedProperty=s,this.propertyIndex=r}else void 0!==s.fromArray&&void 0!==s.toArray?(o=this.BindingType.HasFromToArray,this.resolvedProperty=s):Array.isArray(s)?(o=this.BindingType.EntireArray,this.resolvedProperty=s):this.propertyName=i;this.getValue=this.GetterByBindingType[o],this.setValue=this.SetterByBindingTypeAndVersioning[o][a]}unbind(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}}jc.Composite=class{constructor(t,e,n){const i=n||jc.parseTrackName(e);this._targetGroup=t,this._bindings=t.subscribe_(e,i)}getValue(t,e){this.bind();const n=this._targetGroup.nCachedObjects_,i=this._bindings[n];void 0!==i&&i.getValue(t,e)}setValue(t,e){const n=this._bindings;for(let i=this._targetGroup.nCachedObjects_,r=n.length;i!==r;++i)n[i].setValue(t,e)}bind(){const t=this._bindings;for(let e=this._targetGroup.nCachedObjects_,n=t.length;e!==n;++e)t[e].bind()}unbind(){const t=this._bindings;for(let e=this._targetGroup.nCachedObjects_,n=t.length;e!==n;++e)t[e].unbind()}},jc.prototype.BindingType={Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},jc.prototype.Versioning={None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},jc.prototype.GetterByBindingType=[jc.prototype._getValue_direct,jc.prototype._getValue_array,jc.prototype._getValue_arrayElement,jc.prototype._getValue_toArray],jc.prototype.SetterByBindingTypeAndVersioning=[[jc.prototype._setValue_direct,jc.prototype._setValue_direct_setNeedsUpdate,jc.prototype._setValue_direct_setMatrixWorldNeedsUpdate],[jc.prototype._setValue_array,jc.prototype._setValue_array_setNeedsUpdate,jc.prototype._setValue_array_setMatrixWorldNeedsUpdate],[jc.prototype._setValue_arrayElement,jc.prototype._setValue_arrayElement_setNeedsUpdate,jc.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate],[jc.prototype._setValue_fromArray,jc.prototype._setValue_fromArray_setNeedsUpdate,jc.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate]];class qc{constructor(){this.uuid=ct(),this._objects=Array.prototype.slice.call(arguments),this.nCachedObjects_=0;const t={};this._indicesByUUID=t;for(let e=0,n=arguments.length;e!==n;++e)t[arguments[e].uuid]=e;this._paths=[],this._parsedPaths=[],this._bindings=[],this._bindingsIndicesByPath={};const e=this;this.stats={objects:{get total(){return e._objects.length},get inUse(){return this.total-e.nCachedObjects_}},get bindingsPerObject(){return e._bindings.length}}}add(){const t=this._objects,e=this._indicesByUUID,n=this._paths,i=this._parsedPaths,r=this._bindings,s=r.length;let a,o=t.length,l=this.nCachedObjects_;for(let c=0,h=arguments.length;c!==h;++c){const h=arguments[c],u=h.uuid;let d=e[u];if(void 0===d){d=o++,e[u]=d,t.push(h);for(let t=0,e=s;t!==e;++t)r[t].push(new jc(h,n[t],i[t]))}else if(d<l){a=t[d];const o=--l,c=t[o];e[c.uuid]=d,t[d]=c,e[u]=o,t[o]=h;for(let t=0,e=s;t!==e;++t){const e=r[t],s=e[o];let a=e[d];e[d]=s,void 0===a&&(a=new jc(h,n[t],i[t])),e[o]=a}}else t[d]!==a&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastru
824cture when reloading scenes.")}this.nCachedObjects_=l}remove(){const t=this._objects,e=this._indicesByUUID,n=this._bindings,i=n.length;let r=this.nCachedObjects_;for(let s=0,a=arguments.length;s!==a;++s){const a=arguments[s],o=a.uuid,l=e[o];if(void 0!==l&&l>=r){const s=r++,c=t[s];e[c.uuid]=l,t[l]=c,e[o]=s,t[s]=a;for(let t=0,e=i;t!==e;++t){const e=n[t],i=e[s],r=e[l];e[l]=i,e[s]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,n=this._bindings,i=n.length;let r=this.nCachedObjects_,s=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,l=e[o];if(void 0!==l)if(delete e[o],l<r){const a=--r,o=t[a],c=--s,h=t[c];e[o.uuid]=l,t[l]=o,e[h.uuid]=a,t[a]=h,t.pop();for(let t=0,e=i;t!==e;++t){const e=n[t],i=e[a],r=e[c];e[l]=i,e[a]=r,e.pop()}}else{const r=--s,a=t[r];r>0&&(e[a.uuid]=l),t[l]=a,t.pop();for(let t=0,e=i;t!==e;++t){const e=n[t];e[l]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const n=this._bindingsIndicesByPath;let i=n[t];const r=this._bindings;if(void 0!==i)return r[i];const s=this._paths,a=this._parsedPaths,o=this._objects,l=o.length,c=this.nCachedObjects_,h=new Array(l);i=r.length,n[t]=i,s.push(t),a.push(e),r.push(h);for(let n=c,i=o.length;n!==i;++n){const i=o[n];h[n]=new jc(i,t,e)}return h}unsubscribe_(t){const e=this._bindingsIndicesByPath,n=e[t];if(void 0!==n){const i=this._paths,r=this._parsedPaths,s=this._bindings,a=s.length-1,o=s[a];e[t[a]]=n,s[n]=o,s.pop(),r[n]=r[a],r.pop(),i[n]=i[a],i.pop()}}}qc.prototype.isAnimationObjectGroup=!0;class Xc{constructor(t,e,n=null,i=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=n,this.blendMode=i;const r=e.tracks,s=r.length,a=new Array(s),o={endingStart:k,endingEnd:k};for(let t=0;t!==s;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(s),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,n){if(t.fadeOut(e),this.fadeIn(e),n){const n=this._clip.duration,i=t._clip.duration,r=i/n,s=n/i;t.warp(1,r,e),this.warp(s,1,e)}return this}crossFadeTo(t,e,n){return t.crossFadeFrom(this,e,n)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,n){const i=this._mixer,r=i.time,s=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=i._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,l=a.sampleValues;return o[0]=r,o[1]=r+n,l[0]=t/s,l[1]=e/s,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,n,i){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const i=(t-r)*n;if(i<0||0===n)return;this._startTime=null,e=n*i}e*=this._updateTimeScale(t);const s=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;switch(this.blendMode){case q:for(let n=0,i=t.length;n!==i;++n)t[n].evaluate(s),e[n].accumulateAdditive(a);break;case j:default:for(let n=0,r=t.length;n!==r;++n)t[n].evaluate(s),e[n].accumulate(i,a)}}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const n=this._weightInterpolant;if(null!==n){const i=n.evaluate(t)[0];e*=i,t>n.parameterPositions[1]&&(this.stopFading(),0===i&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const n=this._timeScaleInterpolant;if(null!==n){e*=n.evaluate(t)[0],t>n.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,n=this.loop;let i=this.time+t,r=this._loopCount;const s=2202===n;if(0===t)return-1===r?i:s&&1==(1&r)?e-i:i;if(2200===n){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(i>=e)i=e;else{if(!(i<0)){this.time=i;break t}i=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),i>=e||i<0){const n=Math.floor(i/e);i-=e*n,r+=Math.abs(n);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,i=t>0?e:0,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,s)}else this._setEndings(!1,!1,s);this._loopCount=r,this.time=i,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:n})}}else this.time=i;if(s&&1==(1&r))return e-i}return i}_setEndings(t,e,n){const i=this._interpolantSettings;n?(i.endingStart=V,i.endingEnd=V):(i.endingStart=t?this.zeroSlopeAtStart?V:k:W,i.endingEnd=e?this.zeroSlopeAtEnd?V:k:W)}_scheduleFading(t,e,n){const i=this._mixer,r=i.time;let s=this._weightInterpolant;null===s&&(s=i._lendControlInterpolant(),this._weightInterpolant=s);const a=s.parameterPositions,o=s.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=n,this}}class Yc extends rt{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(t,e){const n=t._localRoot||this._root,i=t._clip.tracks,r=i.length,s=t._propertyBindings,a=t._interpolants,o=n.uuid,l=this._bindingsByRootAndName;let c=l[o];void 0===c&&(c={},l[o]=c);for(let t=0;t!==r;++t){const r=i[t],l=r.name;let h=c[l];if(void 0!==h)s[t]=h;
vendor: 5,935 bytes, line 824
824else{if(h=s[t],void 0!==h){null===h._cacheIndex&&(++h.referenceCount,this._addInactiveBinding(h,o,l));continue}const i=e&&e._propertyBindings[t].binding.parsedPath;h=new Nc(jc.create(n,l,i),r.ValueTypeName,r.getValueSize()),++h.referenceCount,this._addInactiveBinding(h,o,l),s[t]=h}a[t].resultBuffer=h.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,n=t._clip.uuid,i=this._actionsByClip[n];this._bindAction(t,i&&i.knownActions[0]),this._addInactiveAction(t,n,e)}const e=t._propertyBindings;for(let t=0,n=e.length;t!==n;++t){const n=e[t];0==n.useCount++&&(this._lendBinding(n),n.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,n=e.length;t!==n;++t){const n=e[t];0==--n.useCount&&(n.restoreOriginalState(),this._takeBackBinding(n))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e<this._nActiveActions}_addInactiveAction(t,e,n){const i=this._actions,r=this._actionsByClip;let s=r[e];if(void 0===s)s={knownActions:[t],actionByRoot:{}},t._byClipCacheIndex=0,r[e]=s;else{const e=s.knownActions;t._byClipCacheIndex=e.length,e.push(t)}t._cacheIndex=i.length,i.push(t),s.actionByRoot[n]=t}_removeInactiveAction(t){const e=this._actions,n=e[e.length-1],i=t._cacheIndex;n._cacheIndex=i,e[i]=n,e.pop(),t._cacheIndex=null;const r=t._clip.uuid,s=this._actionsByClip,a=s[r],o=a.knownActions,l=o[o.length-1],c=t._byClipCacheIndex;l._byClipCacheIndex=c,o[c]=l,o.pop(),t._byClipCacheIndex=null;delete a.actionByRoot[(t._localRoot||this._root).uuid],0===o.length&&delete s[r],this._removeInactiveBindingsForAction(t)}_removeInactiveBindingsForAction(t){const e=t._propertyBindings;for(let t=0,n=e.length;t!==n;++t){const n=e[t];0==--n.referenceCount&&this._removeInactiveBinding(n)}}_lendAction(t){const e=this._actions,n=t._cacheIndex,i=this._nActiveActions++,r=e[i];t._cacheIndex=i,e[i]=t,r._cacheIndex=n,e[n]=r}_takeBackAction(t){const e=this._actions,n=t._cacheIndex,i=--this._nActiveActions,r=e[i];t._cacheIndex=i,e[i]=t,r._cacheIndex=n,e[n]=r}_addInactiveBinding(t,e,n){const i=this._bindingsByRootAndName,r=this._bindings;let s=i[e];void 0===s&&(s={},i[e]=s),s[n]=t,t._cacheIndex=r.length,r.push(t)}_removeInactiveBinding(t){const e=this._bindings,n=t.binding,i=n.rootNode.uuid,r=n.path,s=this._bindingsByRootAndName,a=s[i],o=e[e.length-1],l=t._cacheIndex;o._cacheIndex=l,e[l]=o,e.pop(),delete a[r],0===Object.keys(a).length&&delete s[i]}_lendBinding(t){const e=this._bindings,n=t._cacheIndex,i=this._nActiveBindings++,r=e[i];t._cacheIndex=i,e[i]=t,r._cacheIndex=n,e[n]=r}_takeBackBinding(t){const e=this._bindings,n=t._cacheIndex,i=--this._nActiveBindings,r=e[i];t._cacheIndex=i,e[i]=t,r._cacheIndex=n,e[n]=r}_lendControlInterpolant(){const t=this._controlInterpolants,e=this._nActiveControlInterpolants++;let n=t[e];return void 0===n&&(n=new qo(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),n.__cacheIndex=e,t[e]=n),n}_takeBackControlInterpolant(t){const e=this._controlInterpolants,n=t.__cacheIndex,i=--this._nActiveControlInterpolants,r=e[i];t.__cacheIndex=i,e[i]=t,r.__cacheIndex=n,e[n]=r}clipAction(t,e,n){const i=e||this._root,r=i.uuid;let s="string"==typeof t?nl.findByName(i,t):t;const a=null!==s?s.uuid:t,o=this._actionsByClip[a];let l=null;if(void 0===n&&(n=null!==s?s.blendMode:j),void 0!==o){const t=o.actionByRoot[r];if(void 0!==t&&t.blendMode===n)return t;l=o.knownActions[0],null===s&&(s=l._clip)}if(null===s)return null;const c=new Xc(this,s,e,n);return this._bindAction(c,l),this._addInactiveAction(c,a,r),c}existingAction(t,e){const n=e||this._root,i=n.uuid,r="string"==typeof t?nl.findByName(n,t):t,s=r?r.uuid:t,a=this._actionsByClip[s];return void 0!==a&&a.actionByRoot[i]||null}stopAllAction(){const t=this._actions;for(let e=this._nActiveActions-1;e>=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,n=this._nActiveActions,i=this.time+=t,r=Math.sign(t),s=this._accuIndex^=1;for(let a=0;a!==n;++a){e[a]._update(i,t,r,s)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(s);return this}setTime(t){this.time=0;for(let t=0;t<this._actions.length;t++)this._actions[t].time=0;return this.update(t)}getRoot(){return this._root}uncacheClip(t){const e=this._actions,n=t.uuid,i=this._actionsByClip,r=i[n];if(void 0!==r){const t=r.knownActions;for(let n=0,i=t.length;n!==i;++n){const i=t[n];this._deactivateAction(i);const r=i._cacheIndex,s=e[e.length-1];i._cacheIndex=null,i._byClipCacheIndex=null,s._cacheIndex=r,e[r]=s,e.pop(),this._removeInactiveBindingsForAction(i)}delete i[n]}}uncacheRoot(t){const e=t.uuid,n=this._actionsByClip;for(const t in n){const i=n[t].actionByRoot[e];void 0!==i&&(this._deactivateAction(i),this._removeInactiveAction(i))}const i=this._bindingsByRootAndName[e];if(void 0!==i)for(const t in i){const e=i[t];e.restoreOriginalState(),this._removeInactiveBinding(e)}}uncacheAction(t,e){const n=this.existingAction(t,e);null!==n&&(this._deactivateAction(n),this._removeInactiveAction(n))}}Yc.prototype._controlInterpolantsResultBuffer=new Float32Array(1);class Zc{constructor(t){"string"==typeof t&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),t=arguments[1]),this.value=t}clone(){return new Zc(void 0===this.value.clone?this.value:this.value.clone())}}
824class Jc extends Es{constructor(t,e,n=1){super(t,e),this.meshPerAttribute=n||1}copy(t){return super.copy(t),this.meshPerAttribute=t.meshPerAttribute,this}clone(t){const e=super.clone(t);return e.meshPerAttribute=this.meshPerAttribute,e}toJSON(t){const e=super.toJSON(t);return e.isInstancedInterleavedBuffer=!0,e.meshPerAttribute=this.meshPerAttribute,e}}Jc.prototype.isInstancedInterleavedBuffer=!0;class Qc{constructor(t,e,n,i,r){this.buffer=t,this.type=e,this.itemSize=n,this.elementSize=i,this.count=r,this.version=0}set needsUpdate(t){!0===t&&this.version++}setBuffer(t){return this.buffer=t,this}setType(t,e){return this.type=t,this.elementSize=e,this}setItemSize(t){return this.itemSize=t,this}setCount(t){return this.count=t,this}}Qc.prototype.isGLBufferAttribute=!0;function Kc(t,e){return t.distance-e.distance}function $c(t,e,n,i){if(t.layers.test(e.layers)&&t.raycast(e,n),!0===i){const i=t.children;for(let t=0,r=i.length;t<r;t++)$c(i[t],e,n,!0)}}const th=new vt;class eh{constructor(t=new vt(1/0,1/0),e=new vt(-1/0,-1/0)){this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromPoints(t){this.makeEmpty();for(let e=0,n=t.length;e<n;e++)this.expandByPoint(t[e]);return this}setFromCenterAndSize(t,e){const n=th.copy(e).multiplyScalar(.5);return this.min.copy(t).sub(n),this.max.copy(t).add(n),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.min.copy(t.min),this.max.copy(t.max),this}makeEmpty(){return this.min.x=this.min.y=1/0,this.max.x=this.max.y=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y}getCenter(t){return void 0===t&&(console.warn("THREE.Box2: .getCenter() target is now required"),t=new vt),this.isEmpty()?t.set(0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(t){return void 0===t&&(console.warn("THREE.Box2: .getSize() target is now required"),t=new vt),this.isEmpty()?t.set(0,0):t.subVectors(this.max,this.min)}expandByPoint(t){return this.min.min(t),this.max.max(t),this}expandByVector(t){return this.min.sub(t),this.max.add(t),this}expandByScalar(t){return this.min.addScalar(-t),this.max.addScalar(t),this}containsPoint(t){return!(t.x<this.min.x||t.x>this.max.x||t.y<this.min.y||t.y>this.max.y)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return void 0===e&&(console.warn("THREE.Box2: .getParameter() target is now required"),e=new vt),e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return!(t.max.x<this.min.x||t.min.x>this.max.x||t.max.y<this.min.y||t.min.y>this.max.y)}clampPoint(t,e){return void 0===e&&(console.warn("THREE.Box2: .clampPoint() target is now required"),e=new vt),e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return th.copy(t).clamp(this.min,this.max).sub(t).length()}intersect(t){return this.min.max(t.min),this.max.min(t.max),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}eh.prototype.isBox2=!0;const nh=new Lt,ih=new Lt;class rh{constructor(t=new Lt,e=new Lt){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return void 0===t&&(console.warn("THREE.Line3: .getCenter() target is now required"),t=new Lt),t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return void 0===t&&(console.warn("THREE.Line3: .delta() target is now required"),t=new Lt),t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return void 0===e&&(console.warn("THREE.Line3: .at() target is now required"),e=new Lt),this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){nh.subVectors(t,this.start),ih.subVectors(this.end,this.start);const n=ih.dot(ih);let i=ih.dot(nh)/n;return e&&(i=ht(i,0,1)),i}closestPointToPoint(t,e,n){const i=this.closestPointToPointParameter(t,e);return void 0===n&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),n=new Lt),this.delta(n).multiplyScalar(i).add(this.start)}
vendor: 10,703 bytes, line 824
824applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}class sh extends Ce{constructor(t){super(),this.material=t,this.render=function(){},this.hasPositions=!1,this.hasNormals=!1,this.hasColors=!1,this.hasUvs=!1,this.positionArray=null,this.normalArray=null,this.colorArray=null,this.uvArray=null,this.count=0}}sh.prototype.isImmediateRenderObject=!0;const ah=new Lt;const oh=new Lt,lh=new se,ch=new se;class hh extends ya{constructor(t){const e=uh(t),n=new En,i=[],r=[],s=new tn(0,0,1),a=new tn(0,1,0);for(let t=0;t<e.length;t++){const n=e[t];n.parent&&n.parent.isBone&&(i.push(0,0,0),i.push(0,0,0),r.push(s.r,s.g,s.b),r.push(a.r,a.g,a.b))}n.setAttribute("position",new mn(i,3)),n.setAttribute("color",new mn(r,3));super(n,new ca({vertexColors:!0,depthTest:!1,depthWrite:!1,toneMapped:!1,transparent:!0})),this.type="SkeletonHelper",this.isSkeletonHelper=!0,this.root=t,this.bones=e,this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1}updateMatrixWorld(t){const e=this.bones,n=this.geometry,i=n.getAttribute("position");ch.copy(this.root.matrixWorld).invert();for(let t=0,n=0;t<e.length;t++){const r=e[t];r.parent&&r.parent.isBone&&(lh.multiplyMatrices(ch,r.matrixWorld),oh.setFromMatrixPosition(lh),i.setXYZ(n,oh.x,oh.y,oh.z),lh.multiplyMatrices(ch,r.parent.matrixWorld),oh.setFromMatrixPosition(lh),i.setXYZ(n+1,oh.x,oh.y,oh.z),n+=2)}n.getAttribute("position").needsUpdate=!0,super.updateMatrixWorld(t)}}function uh(t){const e=[];t&&t.isBone&&e.push(t);for(let n=0;n<t.children.length;n++)e.push.apply(e,uh(t.children[n]));return e}const dh=new Lt,ph=new tn,mh=new tn;class fh extends ya{constructor(t=10,e=10,n=4473924,i=8947848){n=new tn(n),i=new tn(i);const r=e/2,s=t/e,a=t/2,o=[],l=[];for(let t=0,c=0,h=-a;t<=e;t++,h+=s){o.push(-a,0,h,a,0,h),o.push(h,0,-a,h,0,a);const e=t===r?n:i;e.toArray(l,c),c+=3,e.toArray(l,c),c+=3,e.toArray(l,c),c+=3,e.toArray(l,c),c+=3}const c=new En;c.setAttribute("position",new mn(o,3)),c.setAttribute("color",new mn(l,3));super(c,new ca({vertexColors:!0,toneMapped:!1})),this.type="GridHelper"}}const gh=new Lt,vh=new Lt,yh=new Lt;const xh=new Lt,_h=new Qn;function wh(t,e,n,i,r,s,a){xh.set(r,s,a).unproject(i);const o=e[t];if(void 0!==o){const t=n.getAttribute("position");for(let e=0,n=o.length;e<n;e++)t.setXYZ(o[e],xh.x,xh.y,xh.z)}}const bh=new Pt;class Mh extends ya{constructor(t,e=16776960){const n=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),i=new Float32Array(24),r=new En;r.setIndex(new sn(n,1)),r.setAttribute("position",new sn(i,3)),super(r,new ca({color:e,toneMapped:!1})),this.object=t,this.type="BoxHelper",this.matrixAutoUpdate=!1,this.update()}update(t){if(void 0!==t&&console.warn("THREE.BoxHelper: .update() has no longer arguments."),void 0!==this.object&&bh.setFromObject(this.object),bh.isEmpty())return;const e=bh.min,n=bh.max,i=this.geometry.attributes.position,r=i.array;r[0]=n.x,r[1]=n.y,r[2]=n.z,r[3]=e.x,r[4]=n.y,r[5]=n.z,r[6]=e.x,r[7]=e.y,r[8]=n.z,r[9]=n.x,r[10]=e.y,r[11]=n.z,r[12]=n.x,r[13]=n.y,r[14]=e.z,r[15]=e.x,r[16]=n.y,r[17]=e.z,r[18]=e.x,r[19]=e.y,r[20]=e.z,r[21]=n.x,r[22]=e.y,r[23]=e.z,i.needsUpdate=!0,this.geometry.computeBoundingSphere()}setFromObject(t){return this.object=t,this.update(),this}copy(t){return ya.prototype.copy.call(this,t),this.object=t.object,this}}const Sh=new Lt;let Th,Eh;class Ah extends ya{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],n=new En;n.setAttribute("position",new mn(e,3)),n.setAttribute("color",new mn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(n,new ca({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}dispose(){this.geometry.dispose(),this.material.dispose()}}const Lh=new Float32Array(1),Rh=new Int32Array(Lh.buffer);const Ch=Math.pow(2,8),Ph=[.125,.215,.35,.446,.526,.582],Dh=5+Ph.length,Ih=20,Nh={[X]:0,[Y]:1,[J]:2,[Q]:3,[K]:4,[$]:5,[Z]:6},Bh=new en({side:1,depthWrite:!1,depthTest:!1}),zh=new Wn(new qn,Bh),Fh=new Jl,{_lodPlanes:Oh,_sizeLods:Hh,_sigmas:Gh}=Yh(),Uh=new tn;let kh=null;const Vh=(1+Math.sqrt(5))/2,Wh=1/Vh,jh=[new Lt(1,1,1),new Lt(-1,1,1),new Lt(1,1,-1),new Lt(-1,1,-1),new Lt(0,Vh,Wh),new Lt(0,Vh,-Wh),new Lt(Wh,0,Vh),new Lt(-Wh,0,Vh),new Lt(Vh,Wh,0),new Lt(-Vh,Wh,0)];function qh(t){const e=Math.max(t.r,t.g,t.b),n=Math.min(Math.max(Math.ceil(Math.log2(e)),-128),127);t.multiplyScalar(Math.pow(2,-n));return(n+128)/255}function Xh(t){return void 0!==t&&t.type===x&&(t.encoding===X||t.encoding===Y||t.encoding===Z)}function Yh(){const t=[],e=[],n=[];let i=8;for(let r=0;r<Dh;r++){const s=Math.pow(2,i);e.push(s);let a=1/s;r>4?a=Ph[r-8+4-1]:0==r&&(a=0),n.push(a);const o=1/(s-1),l=-o/2,c=1+o/2,h=[l,l,c,l,c,c,l,l,c,c,l,c],u=6,d=6,p=3,m=2,f=1,g=new Float32Array(p*d*u),v=new Float32Array(m*d*u),y=new Float32Array(f*d*u);for(let t=0;t<u;t++){const e=t%3*2/3-1,n=t>2?0:-1,i=[e,n,0,e+2/3,n,0,e+2/3,n+1,0,e,n,0,e+2/3,n+1,0,e,n+1,0];g.set(i,p*d*t),v.set(h,m*d*t);const r=[t,t,t,t,t,t];y.set(r,f*d*t)}const x=new En;x.setAttribute("position",new sn(g,p)),x.setAttribute("uv",new sn(v,m)),x.setAttribute("faceIndex",new sn(y,f)),t.push(x),i>4&&i--}return{_lodPlanes:t,_sizeLods:e,_sigmas:n}}function Zh(t){const e=new Tt(3*Ch,3*Ch,t);return e.texture.mapping=l,e.texture.name="PMREM.cubeUv",e.scissorTest=!0,e}function Jh(t,e,n,i,r){t.viewport.set(e,n,i,r),t.scissor.set(e,n,i,r)}function Qh(){const t=new vt(1,1);return new Io({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null},texelSize:{value:t},inputEncoding:{value:Nh[3e3]},outputEncoding:{value:Nh[3e3]}},vertexShader:$h(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t${tu()}\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}function Kh(){return new Io({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},inputEncoding:{value:Nh[3e3]},outputEncoding:{value:Nh[3e3]}},vertexShader:$h(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t${tu()}\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}function $h(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function tu(){return"\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include <encodings_pars_fragment>\n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t"}ml.create=function(t,e){return console.log("THREE.Curve.create() has been deprecated"),t.prototype=Object.create(ml.prototype),t.prototype.constructor=t,t.prototype.getPoint=e,t},Bl.prototype.fromPoints=function(t){return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(t)},fh.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")},hh.prototype.update=function(){console.error("THREE.SkeletonHelper: update(
824) no longer needs to be called.")},ol.prototype.extractUrlBase=function(t){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),rc.extractUrlBase(t)},ol.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}},eh.prototype.center=function(t){return console.warn("THREE.Box2: .center() has been renamed to .getCenter()."),this.getCenter(t)},eh.prototype.empty=function(){return console.warn("THREE.Box2: .empty() has been renamed to .isEmpty()."),this.isEmpty()},eh.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},eh.prototype.size=function(t){return console.warn("THREE.Box2: .size() has been renamed to .getSize()."),this.getSize(t)},Pt.prototype.center=function(t){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(t)},Pt.prototype.empty=function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},Pt.prototype.isIntersectionBox=function(t){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},Pt.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},Pt.prototype.size=function(t){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(t)},Jt.prototype.empty=function(){return console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty()."),this.isEmpty()},ai.prototype.setFromMatrix=function(t){return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."),this.setFromProjectionMatrix(t)},rh.prototype.center=function(t){return console.warn("THREE.Line3: .center() has been renamed to .getCenter()."),this.getCenter(t)},yt.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},yt.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix3: .multiplyVector3(
824) has been removed. Use vector.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},yt.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},yt.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."),t.applyMatrix3(this)},yt.prototype.applyToVector3Array=function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")},yt.prototype.getInverse=function(t){return console.warn("THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()},se.prototype.extractPosition=function(t){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(t)},se.prototype.flattenToArrayOffset=function(t,e){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(t,e)},se.prototype.getPosition=function(){return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),(new Lt).setFromMatrixColumn(this,3)},se.prototype.setRotationFromQuaternion=function(t){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(t)},se.prototype.multiplyToArray=function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},se.prototype.multiplyVector3=function(t){return console.warn("THREE.Matrix4: .multiplyVector3(
824) has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},se.prototype.multiplyVector4=function(t){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},se.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},se.prototype.rotateAxis=function(t){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),t.transformDirection(this)},se.prototype.crossVector=function(t){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},se.prototype.translate=function(){console.error("THREE.Matrix4: .translate() has been removed.")},se.prototype.rotateX=function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},se.prototype.rotateY=function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},se.prototype.rotateZ=function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},se.prototype.rotateByAxis=function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},se.prototype.applyToBufferAttribute=function(t){return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."),t.applyMatrix4(this)},se.prototype.applyToVector3Array=function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},se.prototype.makeFrustum=function(t,e,n,i,r,s){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(t,e,i,n,r,s)},se.prototype.getInverse=function(t){return console.warn("THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(t).invert()},Ne.prototype.isIntersectionLine=function(t){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(t)},At.prototype.multiplyVector3=function(t){return console.warn("THREE.Quaternion: .multiplyVector3(
824) has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),t.applyQuaternion(this)},At.prototype.inverse=function(){return console.warn("THREE.Quaternion: .inverse() has been renamed to invert()."),this.invert()},re.prototype.isIntersectionBox=function(t){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(t)},re.prototype.isIntersectionPlane=function(t){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(t)},re.prototype.isIntersectionSphere=function(t){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(t)},je.prototype.area=function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()},je.prototype.barycoordFromPoint=function(t,e){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(t,e)},je.prototype.midpoint=function(t){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(t)},je.prototypenormal=function(t){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(t)},je.prototype.plane=function(t){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(t)},je.barycoordFromPoint=function(t,e,n,i,r){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),je.getBarycoord(t,e,n,i,r)},je.normal=function(t,e,n,i){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),je.getNormal(t,e,n,i)},zl.prototype.extractAllPoints=function(t){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(t)},zl.prototype.extrude=function(t){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new go(this,t)},zl.prototype.makeGeometry=function(t){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new Mo(this,t)},vt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},vt.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},vt.prototype.lengthManhattan=function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Lt.prototype.setEulerFromRotationMatrix=function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},Lt.prototype.setEulerFromQuaternion=function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},Lt.prototype.getPositionFromMatrix=function(t){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(t)},Lt.prototype.getScaleFromMatrix=function(t){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(t)},Lt.prototype.getColumnFromMatrix=function(t,e){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(e,t)},Lt.prototype.applyProjection=function(t){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(t)},Lt.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},Lt.prototype.distanceToManhattan=function(t){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(t)},Lt.prototype.lengthManhattan=function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},St.prototype.fromAttribute=function(t,e,n){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(t,e,n)},St.prototype.lengthManhattan=function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Ce.prototype.getChildByName=function(t){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(t)},Ce.prototype.renderDepth=function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},Ce.prototype.translate=function(t,e){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(e,t)},Ce.prototype.getWorldRotation=function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")}
vendor: 11,723 bytes, line 824
824,Ce.prototype.applyMatrix=function(t){return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)},Object.defineProperties(Ce.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(t){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=t}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}),Wn.prototype.setDrawMode=function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")},Object.defineProperties(Wn.prototype,{drawMode:{get:function(){return console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode."),0},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}}),$s.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")},Kn.prototype.setLens=function(t,e){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),void 0!==e&&(this.filmGauge=e),this.setFocalLength(t)},Object.defineProperties(Fl.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(t){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=t}},shadowCameraLeft:{set:function(t){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=t}},shadowCameraRight:{set:function(t){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=t}},shadowCameraTop:{set:function(t){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=t}},shadowCameraBottom:{set:function(t){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=t}},shadowCameraNear:{set:function(t){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=t}},shadowCameraFar:{set:function(t){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=t}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(t){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=t}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(t){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=t}},shadowMapHeight:{set:function(t){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=t}}}),Object.defineProperties(sn.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}},dynamic:{get:function(){return console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.usage===nt},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.setUsage(nt)}}}),sn.prototype.setDynamic=function(t){return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?nt:et),this},sn.prototype.copyIndicesArray=function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},sn.prototype.setArray=function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},En.prototype.addIndex=function(t){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(t)},En.prototype.addAttribute=function(t,e){return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."),e&&e.isBufferAttribute||e&&e.isInterleavedBufferAttribute?"index"===t?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(e),this):this.setAttribute(t,e):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(t,new sn(arguments[1],arguments[2])))},En.prototype.addDrawCall=function(t,e,n){void 0!==n&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(t,e)},En.prototype.clearDrawCalls=function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},En.prototype.computeOffsets=function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},En.prototype.removeAttribute=function(t){return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."),this.deleteAttribute(t)},En.prototype.applyMatrix=function(t){return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(t)},Object.defineProperties(En.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}}),Es.prototype.setDynamic=function(t){return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===t?nt:et),this},Es.prototype.setArray=function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},go.prototype.getArrays=function(){console.error("THREE.ExtrudeGeometry: .getArrays() has been removed.")},go.prototype.addShapeList=function(){console.error("THREE.ExtrudeGeometry: .addShapeList() has been removed.")},go.prototype.addShape=function(){console.error("THREE.ExtrudeGeometry: .addShape() has been removed.")},Ts.prototype.dispose=function(){console.error("THREE.Scene: .dispose() has been removed.")},Zc.prototype.onUpdate=function(){return console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."),this},Object.defineProperties(Xe.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new tn}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(t){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===t}},stencilMask:{get:function(){return console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask},set:function(t){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask=t}}}),Object.defineProperties(Jn.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(t){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=t}}}),ws.prototype.clearTarget=function(t,e,n,i){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."),this.setRenderTarget(t),this.clear(e,n,i)},ws.prototype.animate=function(t){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(t)},ws.prototype.getCurrentRenderTarget=function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},ws.prototype.getMaxAnisotropy=function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()},ws.prototype.getPrecision=function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision},ws.prototype.resetGLState=function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()},ws.prototype.supportsFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},ws.prototype.supportsHalfFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},ws.prototype.supportsStandardDerivatives=function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},ws.prototype.supportsCompressedTextureS3TC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},ws.prototype.supportsCompressedTexturePVRTC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},ws.prototype.supportsBlendMinMax=function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},ws.prototype.supportsVertexTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},ws.prototype.supportsInstancedArrays=function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},ws.prototype.enableScissorTest=function(t){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(t)},ws.prototype.initMaterial=function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},ws.prototype.addPrePlugin=function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},ws.prototype.addPostPlugin=function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},ws.prototype.updateShadowMap=function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},ws.prototype.setFaceCulling=function(){console.warn("THREE.WebGLRenderer: .setFaceCulling(
824) has been removed.")},ws.prototype.allocTextureUnit=function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},ws.prototype.setTexture=function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},ws.prototype.setTexture2D=function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},ws.prototype.setTextureCube=function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},ws.prototype.getActiveMipMapLevel=function(){return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."),this.getActiveMipmapLevel()},Object.defineProperties(ws.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=t}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(t){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=t}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){return console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead."),this.getContext()}},vr:{get:function(){return console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr"),this.xr}},gammaInput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead."),!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),!1},set:function(t){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),this.outputEncoding=!0===t?Y:X}},toneMappingWhitePoint:{get:function(){return console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed."),1},set:function(){console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.")}}}),Object.defineProperties(us.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}}),Object.defineProperties(Tt.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=t}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(t){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=t}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=t}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(t){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=t}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy 
824is now .texture.anisotropy."),this.texture.anisotropy},set:function(t){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=t}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(t){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=t}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(t){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=t}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(t){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=t}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(t){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=t}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(t){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=t}}}),Lc.prototype.load=function(t){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");const e=this;return(new vc).load(t,(function(t){e.setBuffer(t)})),this},Ic.prototype.getData=function(){return console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData()."),this.getFrequencyData()},ti.prototype.updateCubeMap=function(t,e){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update(
824)."),this.update(t,e)},ti.prototype.clear=function(t,e,n,i){return console.warn("THREE.CubeCamera: .clear() is now .renderTarget.clear()."),this.renderTarget.clear(t,e,n,i)},_t.crossOrigin=void 0,_t.loadTexture=function(t,e,n,i){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");const r=new pl;r.setCrossOrigin(this.crossOrigin);const s=r.load(t,n,void 0,i);return e&&(s.mapping=e),s},_t.loadTextureCube=function(t,e,n,i){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");const r=new ul;r.setCrossOrigin(this.crossOrigin);const s=r.load(t,n,void 0,i);return e&&(s.mapping=e),s},_t.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},_t.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};const eu={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js")}};"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:e}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=e),t.ACESFilmicToneMapping=4,t.AddEquation=n,t.AddOperation=2,t.AdditiveAnimationBlendMode=q,t.AdditiveBlending=2,t.AlphaFormat=1021,t.AlwaysDepth=1,t.AlwaysStencilFunc=519,t.AmbientLight=$l,t.AmbientLightProbe=xc,t.AnimationClip=nl,t.AnimationLoader=class extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new cl(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(t,(function(n){try{e(r.parse(JSON.parse(n)))}catch(e){i?i(e):console.error(e),r.manager.itemError(t)}}),n,i)}parse(t){const e=[];for(let n=0;n<t.length;n++){const i=nl.parse(t[n]);e.push(i)}return e}},t.AnimationMixer=Yc,t.AnimationObjectGroup=qc,t.AnimationUtils=Vo,t.ArcCurve=gl,t.ArrayCamera=fs,t.ArrowHelper=class extends Ce{constructor(t=new Lt(0,0,1),e=new Lt(0,0,0),n=1,i=16776960,r=.2*n,s=.2*r){super(),this.type="ArrowHelper",void 0===Th&&(Th=new En,Th.setAttribute("position",new mn([0,0,0,0,1,0],3)),Eh=new Da(0,.5,1,5,1),Eh.translate(0,-.5,0)),this.position.copy(e),this.line=new fa(Th,new ca({color:i,toneMapped:!1})),this.line.matrixAutoUpdate=!1,this.add(this.line),this.cone=new Wn(Eh,new en({color:i,toneMapped:!1})),this.cone.matrixAutoUpdate=!1,this.add(this.cone),this.setDirection(t),this.setLength(n,r,s)}setDirection(t){if(t.y>.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{Sh.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(Sh,e)}}setLength(t,e=.2*t,n=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(n,e,n),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}},t.Audio=Lc,t.AudioAnalyser=Ic,t.AudioContext=gc,t.AudioListener=class extends Ce{constructor(){super(),this.type="AudioListener",this.context=gc.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new bc}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener,n=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(Sc,Tc,Ec),Ac.set(0,0,-1).applyQuaternion(Tc),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(Sc.x,t),e.positionY.linearRampToValueAtTime(Sc.y,t),e.positionZ.linearRampToValueAtTime(Sc.z,t),e.forwardX.linearRampToValueAtTime(Ac.x,t),e.forwardY.linearRampToValueAtTime(Ac.y,t),e.forwardZ.linearRampToValueAtTime(Ac.z,t),e.upX.linearRampToValueAtTime(n.x,t),e.upY.linearRampToValueAtTime(n.y,t),e.upZ.linearRampToValueAtTime(n.z,t)}else e.setPosition(Sc.x,Sc.y,Sc.z),e.setOrientation(Ac.x,Ac.y,Ac.z,n.x,n.y,n.z)}},t.AudioLoader=vc,t.AxesHelper=Ah,t.AxisHelper=function(t){return console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper."),new Ah(t)},t.BackSide=1,t.BasicDepthPacking=3200,t.BasicShadowMap=0,t.BinaryTextureLoader=function(t){return console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader."),new dl(t)},t.Bone=ta,t.BooleanKeyframeTrack=Zo,t.BoundingBoxHelper=function(t,e){return console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead."),new Mh(t,e)},t.Box2=eh,t.Box3=Pt,t.Box3Helper=class extends ya{constructor(t,e=16776960){const n=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]),i=new En;i.setIndex(new sn(n,1)),i.setAttribute("position",new mn([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3)),super(i,new ca({color:e,toneMapped:!1})),this.box=t,this.type="Box3Helper",this.geometry.computeBoundingSphere()}updateMatrixWorld(t){const e=this.box;e.isEmpty()||(e.getCenter(this.position),e.getSize(this.scale),this.scale.multiplyScalar(.5),super.updateMatrixWorld(t))}},t.BoxBufferGeometry=qn,t.BoxGeometry=qn,t.BoxHelper=Mh,t.BufferAttribute=sn,t.BufferGeometry=En,t.BufferGeometryLoader=oc,t.ByteType=1010,t.Cache=rl,t.Camera=Qn,t.CameraHelper=class extends ya{constructor(t){const e=new En,n=new ca({color:16777215,vertexColors:!0,toneMapped:!1}),i=[],r=[],s={},a=new tn(16755200),o=new tn(16711680),l=new tn(43775),c=new tn(16777215),h=new tn(3355443);function u(t,e,n){d(t,n),d(e,n)}function d(t,e){i.push(0,0,0),r.push(e.r,e.g,e.b),void 0===s[t]&&(s[t]=[]),s[t].push(i.length/3-1)}u("n1","n2",a),u("n2","n4",a),u("n4","n3",a),u("n3","n1",a),u("f1","f2",a),u("f2","f4",a),u("f4","f3",a),u("f3","f1",a),u("n1","f1",a),u("n2","f2",a),u("n3","f3",a),u("n4","f4",a),u("p","n1",o),u("p","n2",o),u("p","n3",o),u("p","n4",o),u("u1","u2",l),u("u2","u3",l),u("u3","u1",l),u("c","t",c),u("p","c",h),u("cn1","cn2",h),u("cn3","cn4",h),u("cf1","cf2",h),u("cf3","cf4",h),e.setAttribute("position",new mn(i,3)),e.setAttribute("color",new mn(r,3)),super(e,n),this.type="CameraHelper",this.camera=t,this.camera.updateProjectionMatrix&&this.camera.updateProjectionMatrix(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.pointMap=s,this.update()}update(){const t=this.geometry,e=this.pointMap;_h.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse),wh("c",e,t,_h,0,0,-1),wh("t",e,t,_h,0,0,1),wh("n1",e,t,_h,-1,-1,-1),wh("n2",e,t,_h,1,-1,-1),wh("n3",e,t,_h,-1,1,-1),wh("n4",e,t,_h,1,1,-1),wh("f1",e,t,_h,-1,-1,1),wh("f2",e,t,_h,1,-1,1),wh("f3",e,t,_h,-1,1,1),wh("f4",e,t,_h,1,1,1),wh("u1",e,t,_h,.7,1.1,-1),wh("u2",e,t,_h,-.7,1.1,-1),wh("u3",e,t,_h,0,2,-1),wh("cf1",e,t,_h,-1,0,1),wh("cf2",e,t,_h,1,0,1),wh("cf3",e,t,_h,0,-1,1),wh("cf4",e,t,_h,0,1,1),wh("cn1",e,t,_h,-1,0,-1),wh("cn2",e,t,_h,1,0,-1),wh("cn3",e,t,_h,0,-1,-1),wh("cn4",e,t,_h,0,1,-1),t.getAttribute("position").needsUpdate=!0}dispose(){this.geometry.dispose(),this.material.dispose()}},t.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been removed")},t.CanvasTexture=Ra,t.CatmullRomCurve3=bl,t.CineonToneMapping=3,t.CircleBufferGeometry=Pa,t.CircleGeometry=Pa,t.ClampToEdgeWrapping=u,t.Clock=bc,t.Color=tn,t.ColorKeyframeTrack=Jo,t.CompressedTexture=La,t.CompressedTextureLoader=class extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=[],a=new La,o=new cl(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setWithCredentials(r.withCredentials);let l=0;function c(c){o.load(t[c],(function(t){const n=r.parse(t,!0);s[c]={width:n.width,height:n.height,format:n.format,mipmaps:n.mipmaps},l+=1,6===l&&(1===n.mipmapCount&&(a.minFilter=g),a.image=s,a.format=n.format,a.needsUpdate=!0,e&&e(a))}),n,i)}if(Array.isArray(t))for(let e=0,n=t.length;e<n;++e)c(e);else o.load(t,(function(t){const n=r.parse(t,!0);if(n.isCubemap){const t=n.mipmaps.length/n.mipmapCount;for(let e=0;e<t;e++){s[e]={mipmaps:[]};for(let t=0;t<n.mipmapCount;t++)s[e].mipmaps.push(n.mipmaps[e*n.mipmapCount+t]),s[e].format=n.format,s[e].width=n.width,s[e].height=n.height}a.image=s}else a.image.width=n.width,a.image.height=n.height,a.mipmaps=n.mipmaps;1===n.mipmapCount&&(a.minFilter=g),a.format=n.format,a.needsUpdate=!0,e&&e(a)}),n,i);return a}},t.ConeBufferGeometry=Ia,t.ConeGeometry=Ia,t.CubeCamera=ti,t.CubeReflectionMapping=r,t.CubeRefractionMapping=s,t.CubeTexture=ei,t.CubeTextureLoader=ul,t.CubeUVReflectionMapping=l,t.CubeUVRefractionMapping=c,t.CubicBezierCurve=El,t.CubicBezierCurve3=Al,t.CubicInterpolant=jo,t.CullFaceBack=1,t.CullFaceFront=2,t.CullFaceFrontBack=3,t.CullFaceNone=0,t.Curve=ml,t.CurvePath=Nl,t.CustomBlending=5,t.CustomToneMapping=5,t.CylinderBufferGeometry=Da,t.CylinderGeometry=Da,t.Cylindrical=class{constructor(t=1,e=0,n=0){return this.radius=t,this.theta=e,this.y=n,this}set(t,e,n){return this.radius=t,this.theta=e,this.y=n,this}copy(t){return this.radius=t.radius,this.theta=t.theta,this.y=t.y,this}setFromVector3(t){return this.setFromCartesianCoords(t.x,t.y,t.z)}setFromCartesianCoords(t,e,n){return this.radius=Math.sqrt(t*t+n*n),this.theta=Math.atan2(t,n),this.y=e,this}clone(){return(new this.constructor).copy(this)}},t.DataTexture=ii,t.DataTexture2DArray=Ai,t.DataTexture3D=Li,t.DataTextureLoader=dl,t.DataUtils=class{static toHalfFloat(t){Lh[0]=t;const e=Rh[0];let n=e>>16&32768,i=e>>12&2047;const r=e>>23&255;return r<103?n:r>142?(n|=31744,n|=(255==r?0:1)&&8388607&e,n):r<113?(i|=2048,n|=(i>>114-r)+(i>>113-r&1),n):(n|=r-112<<10|i>>1,n+=1&i,n)}},t.DecrementStencilOp=7683,t.DecrementWrapStencilOp=34056,t.DefaultLoadingManager=al,t.DepthFormat=A,t.DepthStencilFormat=L,t.DepthTexture=Ca,t.DirectionalLight=Kl,t.DirectionalLightHelper=class extends Ce{constructor(t,e,n){super(),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=n,void 0===e&&(e=1);let i=new En;i.setAttribute("position",new mn([-e,e,0,e,e,0,e,-e,0,-e,-e,0,-e,e,0],3));const r=new ca({fog:!1,toneMapped:!1});this.lightPlane=new fa(i,r),this.add(this.lightPlane),i=new En,i.setAttribute("position",new mn([0,0,0,0,0,1],3)),this.targetLine=new fa(i,r),this.add(this.targetLine),this.update()}dispose(){this.lightPlane.geometry.dispose(),this.lightPlane.material.dispose(),this.targetLine.geometry.dispose(),this.targetLine.material.dispose()}update(){gh.setFromMatrixPosition(this.light.matrixWorld),vh.setFromMatrixPosition(this.light.target.matrixWorld),yh.subVectors(vh,gh),this.lightPlane.lookAt(vh),void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color)),this.targetLine.lookAt(vh),this.targetLine.scale.z
vendor: 6,082 bytes, line 824
824=yh.length()}},t.DiscreteInterpolant=Xo,t.DodecahedronBufferGeometry=Ba,t.DodecahedronGeometry=Ba,t.DoubleSide=2,t.DstAlphaFactor=206,t.DstColorFactor=208,t.DynamicBufferAttribute=function(t,e){return console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead."),new sn(t,e).setUsage(nt)},t.DynamicCopyUsage=35050,t.DynamicDrawUsage=nt,t.DynamicReadUsage=35049,t.EdgesGeometry=Ga,t.EdgesHelper=function(t,e){return console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead."),new ya(new Ga(t.geometry),new ca({color:void 0!==e?e:16777215}))},t.EllipseCurve=fl,t.EqualDepth=4,t.EqualStencilFunc=514,t.EquirectangularReflectionMapping=a,t.EquirectangularRefractionMapping=o,t.Euler=fe,t.EventDispatcher=rt,t.ExtrudeBufferGeometry=go,t.ExtrudeGeometry=go,t.FaceColors=1,t.FileLoader=cl,t.FlatShading=1,t.Float16BufferAttribute=pn,t.Float32Attribute=function(t,e){return console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead."),new mn(t,e)},t.Float32BufferAttribute=mn,t.Float64Attribute=function(t,e){return console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead."),new fn(t,e)},t.Float64BufferAttribute=fn,t.FloatType=b,t.Fog=Ss,t.FogExp2=Ms,t.Font=pc,t.FontLoader=class extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=new cl(this.manager);s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(r.withCredentials),s.load(t,(function(t){let n;try{n=JSON.parse(t)}catch(e){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),n=JSON.parse(t.substring(65,t.length-2))}const i=r.parse(n);e&&e(i)}),n,i)}parse(t){return new pc(t)}},t.FrontSide=0,t.Frustum=ai,t.GLBufferAttribute=Qc,t.GLSL1="100",t.GLSL3=it,t.GammaEncoding=Z,t.GreaterDepth=6,t.GreaterEqualDepth=5,t.GreaterEqualStencilFunc=518,t.GreaterStencilFunc=516,t.GridHelper=fh,t.Group=gs,t.HalfFloatType=M,t.HemisphereLight=Ol,t.HemisphereLightHelper=class extends Ce{constructor(t,e,n){super(),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=n;const i=new _o(e);i.rotateY(.5*Math.PI),this.material=new en({wireframe:!0,fog:!1,toneMapped:!1}),void 0===this.color&&(this.material.vertexColors=!0);const r=i.getAttribute("position"),s=new Float32Array(3*r.count);i.setAttribute("color",new sn(s,3)),this.add(new Wn(i,this.material)),this.update()}dispose(){this.children[0].geometry.dispose(),this.children[0].material.dispose()}update(){const t=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{const e=t.geometry.getAttribute("color");ph.copy(this.light.color),mh.copy(this.light.groundColor);for(let t=0,n=e.count;t<n;t++){const i=t<n/2?ph:mh;e.setXYZ(t,i.r,i.g,i.b)}e.needsUpdate=!0}t.lookAt(dh.setFromMatrixPosition(this.light.matrixWorld).negate())}},t.HemisphereLightProbe=yc,t.IcosahedronBufferGeometry=yo,t.IcosahedronGeometry=yo,t.ImageBitmapLoader=uc,t.ImageLoader=hl,t.ImageUtils=_t,t.ImmediateRenderObject=sh,t.IncrementStencilOp=7682,t.IncrementWrapStencilOp=34055,t.InstancedBufferAttribute=ac,t.InstancedBufferGeometry=sc,t.InstancedInterleavedBuffer=Jc,t.InstancedMesh=la,t.Int16Attribute=function(t,e){return console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead."),new cn(t,e)},t.Int16BufferAttribute=cn,t.Int32Attribute=function(t,e){return console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead."),new un(t,e)},t.Int32BufferAttribute=un,t.Int8Attribute=function(t,e){return console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead."),new an(t,e)},t.Int8BufferAttribute=an,t.IntType=1013,t.InterleavedBuffer=Es,t.InterleavedBufferAttribute=Ls,t.Interpolant=Wo,t.InterpolateDiscrete=H,t.InterpolateLinear=G,t.InterpolateSmooth=U,t.InvertStencilOp=5386,t.JSONLoader=function(){console.error("THREE.JSONLoader has been removed.")},t.KeepStencilOp=tt,t.KeyframeTrack=Yo,t.LOD=Xs,t.LatheBufferGeometry=xo,t.LatheGeometry=xo,t.Layers=ge,t.LensFlare=function(){console.error("THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js")},t.LessDepth=2,t.LessEqualDepth=3,t.LessEqualStencilFunc=515,t.LessStencilFunc=513,t.Light=Fl,t.LightProbe=nc,t.Line=fa,t.Line3=rh,t.LineBasicMaterial=ca,t.LineCurve=Ll,t.LineCurve3=Rl,t.LineDashedMaterial=Uo,t.LineLoop=xa,t.LinePieces=1,t.LineSegments=ya,t.LineStrip=0,t.LinearEncoding=X,t.LinearFilter=g,t.LinearInterpolant=qo,t.LinearMipMapLinearFilter=1008,t.LinearMipMapNearestFilter=1007,t.LinearMipmapLinearFilter=y,t.LinearMipmapNearestFilter=v,t.LinearToneMapping=1,t.Loader=ol,t.LoaderUtils=rc,t.LoadingManager=sl,t.LogLuvEncoding=3003,t.LoopOnce=2200,t.LoopPingPong=2202,t.LoopRepeat=2201,t.LuminanceAlphaFormat=1025,t.LuminanceFormat=1024,t.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},t.Material=Xe,t.MaterialLoader=ic,t.Math=gt,t.MathUtils=gt,t.Matrix3=yt,t.Matrix4=se,t.MaxEquation=104,t.Mesh=Wn,t.MeshBasicMaterial=en,t.MeshDepthMaterial=cs,t.MeshDistanceMaterial=hs,t.MeshFaceMaterial=function(t){return console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead."),t},t.MeshLambertMaterial=Ho,t.MeshMatcapMaterial=Go,t.MeshNormalMaterial=Oo,t.MeshPhongMaterial=zo,t.MeshPhysicalMaterial=Bo,t.MeshStandardMaterial=No,t.MeshToonMaterial=Fo,t.MinEquation=103,t.MirroredRepeatWrapping=d,t.MixOperation=1,t.MultiMaterial=function(t=[]){return console.warn("THREE.MultiMaterial has been removed. Use an Array instead."),t.isMultiMaterial=!0,t.materials=t,t.clone=function(){return t.slice()},t},t.MultiplyBlending=4,t.MultiplyOperation=0,t.NearestFilter=p,t.NearestMipMapLinearFilter=1005,t.NearestMipMapNearestFilter=1004,t.NearestMipmapLinearFilter=f,t.NearestMipmapNearestFilter=m,t.NeverDepth=0,t.NeverStencilFunc=512,t.NoBlending=0,t.NoColors=0,t.NoToneMapping=0,t.NormalAnimationBlendMode=j,t.NormalBlending=1,t.NotEqualDepth=
8247,t.NotEqualStencilFunc=517,t.NumberKeyframeTrack=Qo,t.Object3D=Ce,t.ObjectLoader=class extends ol{constructor(t){super(t)}load(t,e,n,i){const r=this,s=""===this.path?rc.extractUrlBase(t):this.path;this.resourcePath=this.resourcePath||s;const a=new cl(this.manager);a.setPath(this.path),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(t,(function(n){let s=null;try{s=JSON.parse(n)}catch(e){return void 0!==i&&i(e),void console.error("THREE:ObjectLoader: Can't parse "+t+".",e.message)}const a=s.metadata;void 0!==a&&void 0!==a.type&&"geometry"!==a.type.toLowerCase()?r.parse(s,e):console.error("THREE.ObjectLoader: Can't load "+t)}),n,i)}parse(t,e){const n=this.parseAnimations(t.animations),i=this.parseShapes(t.shapes),r=this.parseGeometries(t.geometries,i),s=this.parseImages(t.images,(function(){void 0!==e&&e(l)})),a=this.parseTextures(t.textures,s),o=this.parseMaterials(t.materials,a),l=this.parseObject(t.object,r,o,n),c=this.parseSkeletons(t.skeletons,l);if(this.bindSkeletons(l,c),void 0!==e){let t=!1;for(const e in s)if(s[e]instanceof HTMLImageElement){t=!0;break}!1===t&&e(l)}return l}parseShapes(t){const e={};if(void 0!==t)for(let n=0,i=t.length;n<i;n++){const i=(new zl).fromJSON(t[n]);e[i.uuid]=i}return e}parseSkeletons(t,e){const n={},i={};if(e.traverse((function(t){t.isBone&&(i[t.uuid]=t)})),void 0!==t)for(let e=0,r=t.length;e<r;e++){const r=(new ia).fromJSON(t[e],i);n[r.uuid]=r}return n}parseGeometries(t,e){const n={};let i;if(void 0!==t){const r=new oc;for(let s=0,a=t.length;s<a;s++){let a;const o=t[s];switch(o.type){case"PlaneGeometry":case"PlaneBufferGeometry":a=new Po[o.type](o.width,o.height,o.widthSegments,o.heightSegments);break;case"BoxGeometry":case"BoxBufferGeometry":a=new Po[o.type](o.width,o.height,o.depth,o.widthSegments,o.heightSegments,o.depthSegments);break;case"CircleGeometry":case"CircleBufferGeometry":a=new Po[o.type](o.radius,o.segments,o.thetaStart,o.thetaLength);break;case"CylinderGeometry":case"CylinderBufferGeometry":a=new Po[o.type](o.radiusTop,o.radiusBottom,o.height,o.radialSegments,o.heightSegments,o.openEnded,o.thetaStart,o.thetaLength);break;case"ConeGeometry":case"ConeBufferGeometry":a=new Po[o.type](o.radius,o.height,o.radialSegments,o.heightSegments,o.openEnded,o.thetaStart,o.thetaLength);break;case"SphereGeometry":case"SphereBufferGeometry":a=new Po[o.type](o.radius,o.widthSegments,o.heightSegments,o.phiStart,o.phiLength,o.thetaStart,o.thetaLength);break;case"DodecahedronGeometry":case"DodecahedronBufferGeometry":case"IcosahedronGeometry":case"IcosahedronBufferGeometry":case"OctahedronGeometry":case"OctahedronBufferGeometry":case"TetrahedronGeometry":case"TetrahedronBufferGeometry":a=new Po[o.type](o.radius,o.detail);break;case"RingGeometry":case"RingBufferGeometry":a=new Po[o.type](o.innerRadius,o.outerRadius,o.thetaSegments,o.phiSegments,o.thetaStart,o.thetaLength);break;case"TorusGeometry":case"TorusBufferGeometry":a=new Po[o.type](o.radius,o.tube,o.radialSegments,o.tubularSegments,o.arc);break;case"TorusKnotGeometry":case"TorusKnotBufferGeometry":a=new Po[o.type](o.radius,o.tube,o.tubularSegments,o.radialSegments,o.p,o.q);break;case"TubeGeometry":case"TubeBufferGeometry":a=new Po[o.type]((new Il[o.path.type]).fromJSON(o.path),o.tubularSegments,o.radius,o.radialSegments,o.closed);break;case"LatheGeometry":case"LatheBufferGeometry":a=new Po[o.type](o.points,o.segments,o.phiStart,o.phiLength);break;case"PolyhedronGeometry":case"PolyhedronBufferGeometry":a=new Po[o.type](o.vertices,o.indices,o.radius,o.details);break;case"ShapeGeometry":case"ShapeBufferGeometry":i=[];for(let t=0,n=o.shapes.length;t<n;t++){const n=e[o.shapes[t]];i.push(n)}a=new Po[o.type](i,o.curveSegments);break;case"ExtrudeGeometry":case"ExtrudeBufferGeometry":i=[];for(let t=0,n=o.shapes.length;t<n;t++){const n=e[o.shapes[t]];i.push(n)}const t=o.options.extrudePath;void 0!==t&&(o.options.extrudePath=(new Il[t.type]).fromJSON(t)),a=new Po[o.type](i,o.options);break;case"BufferGeometry":case"InstancedBufferGeometry":a=r.parse(o);break;case"Geometry":console.error('THREE.ObjectLoader: Loading "Geometry" is not supported anymore.');break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+o.type+'"');continue}a.uuid=o.uuid,void 0!==o.name&&(a.name=o.name),!0===a.isBufferGeometry&&void 0!==o.userData&&(a.userData=o.userData),n[o.uuid]=a}}return n}parseMaterials(t,e){const n={},i={};if(void 0!==t){const r=new ic;r.setTextures(e);for(let e=0,s=t.length;e<s;e++){const s=t[e];if("MultiMaterial"===s.type){const t=[];for(let e=0;e<s.materials.length;e++){const i=s.materials[e];void 0===n[i.uuid]&&(n[i.uuid]=r.parse(i)),t.push(n[i.uuid])}i[s.uuid]=t}else void 0===n[s.uuid]&&(n[s.uuid]=r.parse(s)),i[s.uuid]=n[s.uuid]}}return i}parseAnimations(t){const e={};if(void 0!==t)for(let n=0;n<t.length;n++){const i=t[n],r=nl.parse(i);e[r.uuid]=r}return e}parseImages(t,e){const n=this,i={};let r;function s(t){if("string"==typeof t){const e=t;return function(t){return n.manager.itemStart(t),r.load(t,(function(){n.manager.itemEnd(t)}),void 0,(function(){n.manager.itemError(t),n.manager.itemEnd(t)}))}(/^(\/\/)|([a-z]+:(\/\/)?)/i.test(e)?e:n.resourcePath+e)}return t.data?{data:yn(t.type,t.data),width:t.width,height:t.height}:null}if(void 0!==t&&t.length>0){const n=new sl(e);r=new hl(n),r.setCrossOrigin(this.crossOrigin);for(let e=0,n=t.length;e<n;e++){const n=t[e],r=n.url;if(Array.isArray(r)){i[n.uuid]=[];for(let t=0,e=r.length;t<e;t++){const e=s(r[t]);null!==e&&(e instanceof HTMLImageElement?i[n.uuid].push(e):i[n.uuid].push(new ii(e.data,e.width,e.height)))}}else{const t=s(n.url);null!==t&&(i[n.uuid]=t)}}}return i}parseTextures(t,e){function n(t,e){return"number"==typeof t?t:(console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",t),e[t])}const i={};if(void 0!==t)for(let r=0,s=t.length;r<s;r++){const s=t[r];let a;void 0===s.image&&console.warn('THREE.ObjectLoader: No "image" specified for',s.uuid),void 0===e[s.image]&&console.warn("THREE.ObjectLoader: Undefined image",s.image);const o=e[s.image];Array.isArray(o)?(a=new ei(o),6===o.length&&(a.needsUpdate=!0)):(a=o&&o.data?new ii(o.data,o.width,o.height):new bt(o
vendor: 24,671 bytes, lines 824-827
824),o&&(a.needsUpdate=!0)),a.uuid=s.uuid,void 0!==s.name&&(a.name=s.name),void 0!==s.mapping&&(a.mapping=n(s.mapping,lc)),void 0!==s.offset&&a.offset.fromArray(s.offset),void 0!==s.repeat&&a.repeat.fromArray(s.repeat),void 0!==s.center&&a.center.fromArray(s.center),void 0!==s.rotation&&(a.rotation=s.rotation),void 0!==s.wrap&&(a.wrapS=n(s.wrap[0],cc),a.wrapT=n(s.wrap[1],cc)),void 0!==s.format&&(a.format=s.format),void 0!==s.type&&(a.type=s.type),void 0!==s.encoding&&(a.encoding=s.encoding),void 0!==s.minFilter&&(a.minFilter=n(s.minFilter,hc)),void 0!==s.magFilter&&(a.magFilter=n(s.magFilter,hc)),void 0!==s.anisotropy&&(a.anisotropy=s.anisotropy),void 0!==s.flipY&&(a.flipY=s.flipY),void 0!==s.premultiplyAlpha&&(a.premultiplyAlpha=s.premultiplyAlpha),void 0!==s.unpackAlignment&&(a.unpackAlignment=s.unpackAlignment),i[s.uuid]=a}return i}parseObject(t,e,n,i){let r,s,a;function o(t){return void 0===e[t]&&console.warn("THREE.ObjectLoader: Undefined geometry",t),e[t]}function l(t){if(void 0!==t){if(Array.isArray(t)){const e=[];for(let i=0,r=t.length;i<r;i++){const r=t[i];void 0===n[r]&&console.warn("THREE.ObjectLoader: Undefined material",r),e.push(n[r])}return e}return void 0===n[t]&&console.warn("THREE.ObjectLoader: Undefined material",t),n[t]}}switch(t.type){case"Scene":r=new Ts,void 0!==t.background&&Number.isInteger(t.background)&&(r.background=new tn(t.background)),void 0!==t.fog&&("Fog"===t.fog.type?r.fog=new Ss(t.fog.color,t.fog.near,t.fog.far):"FogExp2"===t.fog.type&&(r.fog=new Ms(t.fog.color,t.fog.density)));break;case"PerspectiveCamera":r=new Kn(t.fov,t.aspect,t.near,t.far),void 0!==t.focus&&(r.focus=t.focus),void 0!==t.zoom&&(r.zoom=t.zoom),void 0!==t.filmGauge&&(r.filmGauge=t.filmGauge),void 0!==t.filmOffset&&(r.filmOffset=t.filmOffset),void 0!==t.view&&(r.view=Object.assign({},t.view));break;case"OrthographicCamera":r=new Jl(t.left,t.right,t.top,t.bottom,t.near,t.far),void 0!==t.zoom&&(r.zoom=t.zoom),void 0!==t.view&&(r.view=Object.assign({},t.view));break;case"AmbientLight":r=new $l(t.color,t.intensity);break;case"DirectionalLight":r=new Kl(t.color,t.intensity);break;case"PointLight":r=new Zl(t.color,t.intensity,t.distance,t.decay);break;case"RectAreaLight":r=new tc(t.color,t.intensity,t.width,t.height);break;case"SpotLight":r=new Wl(t.color,t.intensity,t.distance,t.angle,t.penumbra,t.decay);break;case"HemisphereLight":r=new Ol(t.color,t.groundColor,t.intensity);break;case"LightProbe":r=(new nc).fromJSON(t);break;case"SkinnedMesh":s=o(t.geometry),a=l(t.material),r=new $s(s,a),void 0!==t.bindMode&&(r.bindMode=t.bindMode),void 0!==t.bindMatrix&&r.bindMatrix.fromArray(t.bindMatrix),void 0!==t.skeleton&&(r.skeleton=t.skeleton);break;case"Mesh":s=o(t.geometry),a=l(t.material),r=new Wn(s,a);break;case"InstancedMesh":s=o(t.geometry),a=l(t.material);const e=t.count,n=t.instanceMatrix,i=t.instanceColor;r=new la(s,a,e),r.instanceMatrix=new sn(new Float32Array(n.array),16),void 0!==i&&(r.instanceColor=new sn(new Float32Array(i.array),i.itemSize));break;case"LOD":r=new Xs;break;case"Line":r=new fa(o(t.geometry),l(t.material));break;case"LineLoop":r=new xa(o(t.geometry),l(t.material));break;case"LineSegments":r=new ya(o(t.geometry),l(t.material));break;case"PointCloud":case"Points":r=new Ta(o(t.geometry),l(t.material));break;case"Sprite":r=new Vs(l(t.material));break;case"Group":r=new gs;break;case"Bone":r=new ta;break;default:r=new Ce}if(r.uuid=t.uuid,void 0!==t.name&&(r.name=t.name),void 0!==t.matrix?(r.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(r.matrixAutoUpdate=t.matrixAutoUpdate),r.matrixAutoUpdate&&r.matrix.decompose(r.position,r.quaternion,r.scale)):(void 0!==t.position&&r.position.fromArray(t.position),void 0!==t.rotation&&r.rotation.fromArray(t.rotation),void 0!==t.quaternion&&r.quaternion.fromArray(t.quaternion),void 0!==t.scale&&r.scale.fromArray(t.scale)),void 0!==t.castShadow&&(r.castShadow=t.castShadow),void 0!==t.receiveShadow&&(r.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.bias&&(r.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(r.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(r.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&r.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(r.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(r.visible=t.visible),void 0!==t.frustumCulled&&(r.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(r.renderOrder=t.renderOrder),void 0!==t.userData&&(r.userData=t.userData),void 0!==t.layers&&(r.layers.mask=t.layers),void 0!==t.children){const s=t.children;for(let t=0;t<s.length;t++)r.add(this.parseObject(s[t],e,n,i))}if(void 0!==t.animations){const e=t.animations;for(let t=0;t<e.length;t++){const n=e[t];r.animations.push(i[n])}}if("LOD"===t.type){void 0!==t.autoUpdate&&(r.autoUpdate=t.autoUpdate);const e=t.levels;for(let t=0;t<e.length;t++){const n=e[t],i=r.getObjectByProperty("uuid",n.object);void 0!==i&&r.addLevel(i,n.distance)}}return r}bindSkeletons(t,e){0!==Object.keys(e).length&&t.traverse((function(t){if(!0===t.isSkinnedMesh&&void 0!==t.skeleton){const n=e[t.skeleton];void 0===n?console.warn("THREE.ObjectLoader: No skeleton found with UUID:",t.skeleton):t.bind(n,t.bindMatrix)}}))}setTexturePath(t){return console.warn("THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath()."),this.setResourcePath(t)}},t.ObjectSpaceNormalMap=1,t.OctahedronBufferGeometry=_o,t.OctahedronGeometry=_o,t.OneFactor=201,t.OneMinusDstAlphaFactor=207,t.OneMinusDstColorFactor=209,t.OneMinusSrcAlphaFactor=205,t.OneMinusSrcColorFactor=203,t.OrthographicCamera=Jl,t.PCFShadowMap=1,t.PCFSoftShadowMap=2,t.PMREMGenerator=class{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._blurMaterial=function(t){const e=new Float32Array(t),n=new Lt(0,1,0);return new Io({name:"SphericalGaussianBlur",defines:{n:t},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:e},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:n},inputEncoding:{value:Nh[3e3]},outputEncoding:{value:Nh[3e3]}},vertexShader:$h(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t${tu()}\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}(Ih),this._equirectShader=null,this._cubemapShader=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,n=.1,i=100){kh=this._renderer.getRenderTarget();const r=this._allocateTargets();return this._sceneToCubeUV(t,n,i,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t){return this._fromTexture(t)}fromCubemap(t){return this._fromTexture(t)}compileCubemapShader(){null===this._cubemapShader&&(this._cubemapShader=Kh(),this._compileMaterial(this._cubemapShader))}compileEquirectangularShader(){null===this._equirectShader&&(this._equirectShader=Qh(),this._compileMaterial(this._equirectShader))}dispose(){this._blurMaterial.dispose(),null!==this._cubemapShader&&this._cubemapShader.dispose(),null!==this._equirectShader&&this._equirectShader.dispose();for(let t=0;t<Oh.length;t++)Oh[t].dispose()}_cleanup(t){this._pingPongRenderTarget.dispose(),this._renderer.setRenderTarget(kh),t.scissorTest=!1,Jh(t,0,0,t.width,t.height)}_fromTexture(t){kh=this._renderer.getRenderTarget();const e=this._allocateTargets(t);return this._textureToCubeUV(t,e),this._applyPMREM(e),this._cleanup(e),e}_allocateTargets(t){const e={magFilter:p,minFilter:p,generateMipmaps:!1,type:x,format:1023,encoding:Xh(t)?t.encoding:J,depthBuffer:!1},n=Zh(e);return n.depthBuffer=!t,this._pingPongRenderTarget=Zh(e),n}_compileMaterial(t){const e=new Wn(Oh[0],t);this._renderer.compile(e,Fh)}_sceneToCubeUV(t,e,n,i){const r=new Kn(90,1,e,n),s=[1,-1,1,1,1,1],a=[1,1,1,-1,-1,-1],o=this._renderer,l=o.autoClear,c=o.outputEncoding,h=o.toneMapping;o.getClearColor(Uh),o.toneMapping=0,o.outputEncoding=X,o.autoClear=!1;let u=!1;const d=t.background;if(d){if(d.isColor){Bh.color.copy(d).convertSRGBToLinear(),t.background=null;const e=qh(Bh.color);Bh.opacity=e,u=!0}}else{Bh.color.copy(Uh).convertSRGBToLinear();const t=qh(Bh.color);Bh.opacity=t,u=!0}for(let e=0;e<6;e++){const n=e%3;0==n?(r.up.set(0,s[e],0),r.lookAt(a[e],0,0)):1==n?(r.up.set(0,0,s[e]),r.lookAt(0,a[e],0)):(r.up.set(0,s[e],0),r.lookAt(0,0,a[e])),Jh(i,n*Ch,e>2?Ch:0,Ch,Ch),o.setRenderTarget(i),u&&o.render(zh,r),o.render(t,r)}o.toneMapping=h,o.outputEncoding=c,o.autoClear=l}_textureToCubeUV(t,e){const n=this._renderer;t.isCubeTexture?null==this._cubemapShader&&(this._cubemapShader=Kh()):null==this._equirectShader&&(this._equirectShader=Qh());const i=t.isCubeTexture?this._cubemapShader:this._equirectShader,r=new Wn(Oh[0],i),s=i.uniforms;s.envMap.value=t,t.isCubeTexture||s.texelSize.value.set(1/t.image.width,1/t.image.height),s.inputEncoding.value=Nh[t.encoding],s.outputEncoding.value=Nh[e.texture.encoding],Jh(e,0,0,3*Ch,2*Ch),n.setRenderTarget(e),n.render(r,Fh)}_applyPMREM(t){const e=this._renderer,n=e.autoClear;e.autoClear=!1;for(let e=1;e<Dh;e++){const n=Math.sqrt(Gh[e]*Gh[e]-Gh[e-1]*Gh[e-1]),i=jh[(e-1)%jh.length];this._blur(t,e-1,e,n,i)}e.autoClear=n}_blur(t,e,n,i,r){const s=this._pingPongRenderTarget;this._halfBlur(t,s,e,n,i,"latitudinal",r),this._halfBlur(s,t,n,n,i,"longitudinal",r)}_halfBlur(t,e,n,i,r,s,a){const o=this._renderer,l=this._blurMaterial;"latitudinal"!==s&&"longitudinal"!==s&&console.error("blur direction must be either latitudinal or longitudinal!");const c=new Wn(Oh[i],l),h=l.uniforms,u=Hh[n]-1,d=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/d,m=isFinite(r)?1+Math.floor(3*p):Ih;m>Ih&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const f=[];let g=0;for(let t=0;t<Ih;++t){const e=t/p,n=Math.exp(-e*e/2);f.push(n),0==t?g+=n:t<m&&(g+=2*n)}for(let t=0;t<f.length;t++)f[t]=f[t]/g;h.envMap.value=t.texture,h.samples.value=m,h.weights.value=f,h.latitudinal.value="latitudinal"===s,a&&(h.poleAxis.value=a),h.dTheta.value=d,h.mipInt.value=8-n,h.inputEncoding.value=Nh[t.texture.encoding],h.outputEncoding.value=Nh[t.texture.encoding];const v=Hh[i];Jh(e,3*Math.max(0,Ch-2*v),(0===i?0:2*Ch)+2*v*(i>4?i-8+4:0),3*v,2*v),o.setRenderTarget(e),o.render(c,Fh)}},t.ParametricBufferGeometry=wo,t.ParametricGeometry=wo,t.Particle=function(t){return console.warn("THREE.Particle has been renamed to THREE.Sprite."),new Vs(t)},t.ParticleBasicMaterial=function(t){return console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial."),new _a(t)},t.ParticleSystem=function(t,e){return console.warn("THREE.ParticleSystem has been renamed to THREE.Points."),new Ta(t,e)},t.ParticleSystemMaterial=function(t){return console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial."),new _a(t)},t.Path=Bl,t.PerspectiveCamera=Kn,t.Plane=Ne,t.PlaneBufferGeometry=ci,t.PlaneGeometry=ci,t.PlaneHelper=class extends fa{constructor(t,e=1,n=16776960){const i=n,r=new En;r.setAttribute("position",new mn([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3)),r.computeBoundingSphere(),super(r,new ca({color:i,toneMapped:!1})),this.type="PlaneHelper",this.plane=t,this.size=e;const s=new En;s.setAttribute("position",new mn([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3)),s.computeBoundingSphere(),this.add(new Wn(s,new en({color:i,opacity:.2,transparent:!0,depthWrite:!1,toneMapped:!1})))}updateMatrixWorld(t){let e=-this.plane.constant;Math.abs(e)<1e-8&&(e=1e-8),this.scale.set(.5*this.size,.5*this.size,e),this.children[0].material.side=e<0?1:0,this.lookAt(this.plane.normal),super.updateMatrixWorld(t)}},t.PointCloud=function(t,e){return console.warn("THREE.PointCloud has been renamed to THREE.Points."),new Ta(t,e)},t.PointCloudMaterial=function(t){return console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial."),new _a(t)},t.PointLight=Zl,t.PointLightHelper=class extends Wn{constructor(t,e,n){super(new So(e,4,2),new en({wireframe:!0,fog:!1,toneMapped:!1})),this.light=t,this.light.updateMatrixWorld(),this.color=n,this.type="PointLightHelper",this.matrix=this.light.matrixWorld,this.matrixAutoUpdate=!1,this.update()}dispose(){this.geometry.dispose(),this.material.dispose()}update(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)}},t.Points=Ta,t.PointsMaterial=_a,t.PolarGridHelper=class extends ya{constructor(t=10,e=16,n=8,i=64,r=4473924,s=8947848){r=new tn(r),s=new tn(s);const a=[],o=[];for(let n=0;n<=e;n++){const i=n/e*(2*Math.PI),l=Math.sin(i)*t,c=Math.cos(i)*t;a.push(0,0,0),a.push(l,0,c);const h=1&n?r:s;o.push(h.r,h.g,h.b),o.push(h.r,h.g,h.b)}for(let e=0;e<=n;e++){const l=1&e?r:s,c=t-t/n*e;for(let t=0;t<i;t++){let e=t/i*(2*Math.PI),n=Math.sin(e)*c,r=Math.cos(e)*c;a.push(n,0,r),o.push(l.r,l.g,l.b),e=(t+1)/i*(2*Math.PI),n=Math.sin(e)*c,r=Math.cos(e)*c,a.push(n,0,r),o.push(l.r,l.g,l.b)}}const l=new En;l.setAttribute("position",new mn(a,3)),l.setAttribute("color",new mn(o,3));super(l,new ca({vertexColors:!0,toneMapped:!1})),this.type="PolarGridHelper"}},t.PolyhedronBufferGeometry=Na,t.PolyhedronGeometry=Na,t.PositionalAudio=class extends Lc{constructor(t){super(t),this.panner=this.context.createPanner(),this.panner.panningModel="HRTF",this.panner.connect(this.gain)}getOutput(){return this.panner}getRefDistance(){return this.panner.refDistance}setRefDistance(t){return this.panner.refDistance=t,this}getRolloffFactor(){return this.panner.rolloffFactor}setRolloffFactor(t){return this.panner.rolloffFactor=t,this}getDistanceModel(){return this.panner.distanceModel}setDistanceModel(t){return this.panner.distanceModel=t,this}getMaxDistance(){return this.panner.maxDistance}setMaxDistance(t){return this.panner.maxDistance=t,this}setDirectionalCone(t,e,n){return this.panner.coneInnerAngle=t,this.panner.coneOuterAngle=e,this.panner.coneOuterGain=n,this}updateMatrixWorld(t){if(super.updateMatrixWorld(t),!0===this.hasPlaybackControl&&!1===this.isPlaying)return;this.matrixWorld.decompose(Rc,Cc,Pc),Dc.set(0,0,1).applyQuaternion(Cc);const e=this.panner;if(e.positionX){const t=this.context.currentTime+this.listener.timeDelta;e.positionX.linearRampToValueAtTime(Rc.x,t),e.positionY.linearRampToValueAtTime(Rc.y,t),e.positionZ.linearRampToValueAtTime(Rc.z,t),e.orientationX.linearRampToValueAtTime(Dc.x,t),e.orientationY.linearRampToValueAtTime(Dc.y,t),e.orientationZ.linearRampToValueAtTime(Dc.z,t)}else e.setPosition(Rc.x,Rc.y,Rc.z),e.setOrientation(Dc.x,Dc.y,Dc.z)}},t.PropertyBinding=jc,t.PropertyMixer=Nc,t.QuadraticBezierCurve=Cl,t.QuadraticBezierCurve3=Pl,t.Quaternion=At,t.QuaternionKeyframeTrack=$o,t.QuaternionLinearInterpolant=Ko,t.REVISION=e,t.RGBADepthPacking=3201,t.RGBAFormat=E,t.RGBAIntegerFormat=1033,t.RGBA_ASTC_10x10_Format=37819,t.RGBA_ASTC_10x5_Format=37816,t.RGBA_ASTC_10x6_Format=37817,t.RGBA_ASTC_10x8_Format=37818,t.RGBA_ASTC_12x10_Format=37820,t.RGBA_ASTC_12x12_Format=37821,t.RGBA_ASTC_4x4_Format=37808,t.RGBA_ASTC_5x4_Format=37809,t.RGBA_ASTC_5x5_Format=37810,t.RGBA_ASTC_6x5_Format=37811,t.RGBA_ASTC_6x6_Format=37812,t.RGBA_ASTC_8x5_Format=37813,t.RGBA_ASTC_8x6_Format=37814,t.RGBA_ASTC_8x8_Format=37815,t.RGBA_BPTC_Format=36492,t.RGBA_ETC2_EAC_Format=O,t.RGBA_PVRTC_2BPPV1_Format=z,t.RGBA_PVRTC_4BPPV1_Format=B,t.RGBA_S3TC_DXT1_Format=C,t.RGBA_S3TC_DXT3_Format=P,t.RGBA_S3TC_DXT5_Format=D,t.RGBDEncoding=$,t.RGBEEncoding=J,t.RGBEFormat=1023,t.RGBFormat=T,t.RGBIntegerFormat=1032,t.RGBM16Encoding=K,t.RGBM7Encoding=Q,t.RGB_ETC1_Format=36196,t.RGB_ETC2_Format=F,t.RGB_PVRTC_2BPPV1_Format=N,t.RGB_PVRTC_4BPPV1_Format=I,t.RGB_S3TC_DXT1_Format=R,t.RGFormat=1030,t.RGIntegerFormat=1031,t.RawShaderMaterial=Io,t.Ray=re,t.Raycaster=class{constructor(t,e,n=0,i=1/0){this.ray=new re(t,e),this.near=n,this.far=i,this.camera=null,this.layers=new ge,this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}}}set(t,e){this.ray.set(t,e)}setFromCamera(t,e){e&&e.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(e.matrixWorld),this.ray.direction.set(t.x,t.y,.5).unproject(e).sub(this.ray.origin).normalize(),this.camera=e):e&&e.isOrthographicCamera?(this.ray.origin.set(t.x,t.y,(e.near+e.far)/(e.near-e.far)).unproject(e),this.ray.direction.set(0,0,-1).transformDirection(e.matrixWorld),this.camera=e):console.error("THREE.Raycaster: Unsupported camera type: "+e.type)}intersectObject(t,e=!1,n=[]){return $c(t,this,n,e),n.sort(Kc),n}intersectObjects(t,e=!1,n=[]){for(let i=0,r=t.length;i<r;i++)$c(t[i],this,n,e);return n.sort(Kc),n}},t.RectAreaLight=tc,t.RedFormat=1028,t.RedIntegerFormat=1029,t.ReinhardToneMapping=2,t.RepeatWrapping=h,t.ReplaceStencilOp=7681,t.ReverseSubtractEquation=102,t.RingBufferGeometry=bo,t.RingGeometry=bo,t.SRGB8_ALPHA8_ASTC_10x10_Format=37851,t.SRGB8_ALPHA8_ASTC_10x5_Format=37848,t.SRGB8_ALPHA8_ASTC_10x6_Format=37849,t.SRGB8_ALPHA8_ASTC_10x8_Format=37850,t.SRGB8_ALPHA8_ASTC_12x10_Format=37852,t.SRGB8_ALPHA8_ASTC_12x12_Format=37853,t.SRGB8_ALPHA8_ASTC_4x4_Format=37840,t.SRGB8_ALPHA8_ASTC_5x4_Format=37841,t.SRGB8_ALPHA8_ASTC_5x5_Format=37842,t.SRGB8_ALPHA8_ASTC_6x5_Format=37843,t.SRGB8_ALPHA8_ASTC_6x6_Format=37844,t.SRGB8_ALPHA8_ASTC_8x5_Format=37845,t.SRGB8_ALPHA8_ASTC_8x6_Format=37846,t.SRGB8_ALPHA8_ASTC_8x8_Format=37847,t.Scene=Ts,t.SceneUtils=eu,t.ShaderChunk=hi,t.ShaderLib=di,t.ShaderMaterial=Jn,t.ShadowMaterial=Do,t.Shape=zl,t.ShapeBufferGeometry=Mo,t.ShapeGeometry=Mo,t.ShapePath=dc,t.ShapeUtils=po,t.ShortType=1011,t.Skeleton=ia,t.SkeletonHelper=hh,t.SkinnedMesh=$s,t.SmoothShading=2,t.Sphere=Jt,t.SphereBufferGeometry=So,t.SphereGeometry=So,t.Spherical=class{constructor(t=1,e=0,n=0){return this.radius=t,this.phi=e,this.theta=n,this}set(t,e,n){return this.radius=t,this.phi=e,this.theta=n,this}copy(t){return this.radius=t.radius,this.phi=t.phi,this.theta=t.theta,this}makeSafe(){const t=1e-6;return this.phi=Math.max(t,Math.min(Math.PI-t,this.phi)),this}setFromVector3(t){return this.setFromCartesianCoords(t.x,t.y,t.z)}setFromCartesianCoords(t,e,n){return this.radius=Math.sqrt(t*t+e*e+n*n),0===this.radius?(this.theta=0,this.phi=0):(this.theta=Math.atan2(t,n),this.phi=Math.acos(ht(e/this.radius,-1,1))),this}clone(){return(new this.constructor).copy(this)}},t.SphericalHarmonics3=ec,t.SplineCurve=Dl,t.SpotLight=Wl,t.SpotLightHelper=class extends Ce{constructor(t,e){super(),this.light=t,this.light.updateMatrixWorld(),this.matrix=t.matrixWorld,this.matrixAutoUpdate=!1,this.color=e;const n=new En,i=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,n=32;t<n;t++,e++){const r=t/n*Math.PI*2,s=e/n*Math.PI*2;i.push(Math.cos(r),Math.sin(r),1,Math.cos(s),Math.sin(s),1)}n.setAttribute("position",new mn(i,3));const r=new ca({fog:!1,toneMapped:!1});this.cone=new ya(n,r),this.add(this.cone),this.update()}dispose(){this.cone.geometry.dispose(),this.cone.material.dispose()}update(){this.light.updateMatrixWorld();const t=this.light.distance?this.light.distance:1e3,e=t*Math.tan(this.light.angle);this.cone.scale.set(e,e,t),ah.setFromMatrixPosition(this.light.target.matrixWorld),this.cone.lookAt(ah),void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)}},t.Sprite=Vs,t.SpriteMaterial=Rs,t.SrcAlphaFactor=204,t.SrcAlphaSaturateFactor=210,t.SrcColorFactor=202,t.StaticCopyUsage=35046,t.StaticDrawUsage=et,t.StaticReadUsage=35045,t.StereoCamera=class{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new Kn,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new Kn,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep;const n=t.projectionMatrix.clone(),i=e.eyeSep/2,r=i*e.near/e.focus,s=e.near*Math.tan(ot*e.fov*.5)/e.zoom;let a,o;wc.elements[12]=-i,_c.elements[12]=i,a=-s*e.aspect+r,o=s*e.aspect+r,n.elements[0]=2*e.near/(o-a),n.elements[8]=(o+a)/(o-a),this.cameraL.projectionMatrix.copy(n),a=-s*e.aspect-r,o=s*e.aspect-r,n.elements[0]=2*e.near/(o-a),n.elements[8]=(o+a)/(o-a),this.cameraR.projectionMatrix.copy(n)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(wc),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(_c)}},t.StreamCopyUsage=35042,t.StreamDrawUsage=35040,t.StreamReadUsage=35041,t.StringKeyframeTrack=tl,t.SubtractEquation=101,t.SubtractiveBlending=3,t.TOUCH={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},t.TangentSpaceNormalMap=0,t.TetrahedronBufferGeometry=To,t.TetrahedronGeometry=To,t.TextBufferGeometry=Eo,t.TextGeometry=Eo,t.Texture=bt,t.TextureLoader=pl,t.TorusBufferGeometry=Ao,t.TorusGeometry=Ao,t.TorusKnotBufferGeometry=Lo,t.TorusKnotGeometry=Lo,t.Triangle=je,t.TriangleFanDrawMode=2,t.TriangleStripDrawMode=1,t.TrianglesDrawMode=0,t.TubeBufferGeometry=Ro,t.TubeGeometry=Ro,t.UVMapping=i,t.Uint16Attribute=function(t,e){return console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead."),new hn(t,e)},t.Uint16BufferAttribute=hn,t.Uint32Attribute=function(t,e){return console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead."),new dn(t,e)},t.Uint32BufferAttribute=dn,t.Uint8Attribute=function(t,e){return console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead."),new on(t,e)},t.Uint8BufferAttribute=on,t.Uint8ClampedAttribute=function(t,e){return console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead."),new ln(t,e)},t.Uint8ClampedBufferAttribute=ln,t.Uniform=Zc,t.UniformsLib=ui,t.UniformsUtils=Zn,t.UnsignedByteType=x,t.UnsignedInt248Type=S,t.UnsignedIntType=w,t.UnsignedShort4444Type=1017,t.UnsignedShort5551Type=1018,t.UnsignedShort565Type=1019,t.UnsignedShortType=_,t.VSMShadowMap=3,t.Vector2=vt,t.Vector3=Lt,t.Vector4=St,t.VectorKeyframeTrack=el,t.Vertex=function(t,e,n){return console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead."),new Lt(t,e,n)},t.VertexColors=2,t.VideoTexture=Aa,t.WebGL1Renderer=bs,t.WebGLCubeRenderTarget=ni,t.WebGLMultisampleRenderTarget=Et,t.WebGLRenderTarget=Tt,t.WebGLRenderTargetCube=function(t,e,n){return console.warn("THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options )."),new ni(t,n)},t.WebGLRenderer=ws,t.WebGLUtils=ms,t.WireframeGeometry=Co,t.WireframeHelper=function(t,e){return console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead."),new ya(new Co(t.geometry),new ca({color:void 0!==e?e:16777215}))},t.WrapAroundEnding=W,t.XHRLoader=function(t){return console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader."),new cl(t)},t.ZeroCurvatureEnding=k,t.ZeroFactor=200,t.ZeroSlopeEnding=V,t.ZeroStencilOp=0,t.sRGBEncoding=Y,Object.defineProperty(t,"__esModule",{value:!0})}));
825
826tlog('Three.js loaded from inline bundle. typeof THREE = '+typeof THREE);
827</script>
vendor: 1 bytes, line 827
827
vendor: 4,729 bytes, lines 828-832
828<script>
829/* lz-string v1.5.0 — bundled inline (same reasoning as the Three.js bundle above:
830   no dependency on an external CDN). Source: pieroxy/lz-string, tag 1.5.0,
831   libs/lz-string.min.js, unmodified. Used only for the compressed-URL share path. */
832var LZString=function(){var r=String.fromCharCode,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",e={};function t(r,o){if(!e[r]){e[r]={};for(var n=0;n<r.length;n++)e[r][r.charAt(n)]=n}return e[r][o]}var i={compressToBase64:function(r){if(null==r)return"";var n=i._compress(r,6,function(r){return o.charAt(r)});switch(n.length%4){default:case 0:return n;case 1:return n+"===";case 2:return n+"==";case 3:return n+"="}},decompressFromBase64:function(r){return null==r?"":""==r?null:i._decompress(r.length,32,function(n){return t(o,r.charAt(n))})},compressToUTF16:function(o){return null==o?"":i._compress(o,15,function(o){return r(o+32)})+" "},decompressFromUTF16:function(r){return null==r?"":""==r?null:i._decompress(r.length,16384,function(o){return r.charCodeAt(o)-32})},compressToUint8Array:function(r){for(var o=i.compress(r),n=new Uint8Array(2*o.length),e=0,t=o.length;e<t;e++){var s=o.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null==o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;e<t;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(""))},compressToEncodedURIComponent:function(r){return null==r?"":i._compress(r,6,function(r){return n.charAt(r)})},decompressFromEncodedURIComponent:function(r){return null==r?"":""==r?null:(r=r.replace(/ /g,"+"),i._decompress(r.length,32,function(o){return t(n,r.charAt(o))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(r,o,n){if(null==r)return"";var e,t,i,s={},u={},a="",p="",c="",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;i<r.length;i+=1)if(a=r.charAt(i),Object.prototype.hasOwnProperty.call(s,a)||(s[a]=f++,u[a]=!0),p=c+a,Object.prototype.hasOwnProperty.call(s,p))c=p;else{if(Object.prototype.hasOwnProperty.call(u,c)){if(c.charCodeAt(0)<256){for(e=0;e<h;e++)m<<=1,v==o-1?(v=0,d.push(n(m)),m=0):v++;for(t=c.charCodeAt(0),e=0;e<8;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;e<h;e++)m=m<<1|t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=c.charCodeAt(0),e=0;e<16;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}0==--l&&(l=Math.pow(2,h),h++),delete u[c]}else for(t=s[c],e=0;e<h;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;0==--l&&(l=Math.pow(2,h),h++),s[p]=f++,c=String(a)}if(""!==c){if(Object.prototype.hasOwnProperty.call(u,c)){if(c.charCodeAt(0)<256){for(e=0;e<h;e++)m<<=1,v==o-1?(v=0,d.push(n(m)),m=0):v++;for(t=c.charCodeAt(0),e=0;e<8;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;e<h;e++)m=m<<1|t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=c.charCodeAt(0),e=0;e<16;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}0==--l&&(l=Math.pow(2,h),h++),delete u[c]}else for(t=s[c],e=0;e<h;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;0==--l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;e<h;e++)m=m<<1|1&t,v==o-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==o-1){d.push(n(m));break}v++}return d.join("")},decompress:function(r){return null==r?"":""==r?null:i._decompress(r.length,32768,function(o){return r.charCodeAt(o)})},_decompress:function(o,n,e){var t,i,s,u,a,p,c,l=[],f=4,h=4,d=3,m="",v=[],g={val:e(0),position:n,index:1};for(t=0;t<3;t+=1)l[t]=t;for(s=0,a=Math.pow(2,2),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;switch(s){case 0:for(s=0,a=Math.pow(2,8),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;c=r(s);break;case 1:for(s=0,a=Math.pow(2,16),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;c=r(s);break;case 2:return""}for(l[3]=c,i=c,v.push(c);;){if(g.index>o)return"";for(s=0,a=Math.pow(2,d),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;switch(c=s){case 0:for(s=0,a=Math.pow(2,8),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;l[h++]=r(s),c=h-1,f--;break;case 1:for(s=0,a=Math.pow(2,16),p=1;p!=a;)u=g.val&g.position,g.position>>=1,0==g.position&&(g.position=n,g.val=e(g.index++)),s|=(u>0?1:0)*p,p<<=1;l[h++]=r(s),c=h-1,f--;break;case 2:return v.join("")}if(0==f&&(f=Math.pow(2,d),d++),l[c])m=l[c];else{if(c!==h)return null;m=i+i.charAt(0)}
832v.push(m),l[h++]=i+m.charAt(0),i=m,0==--f&&(f=Math.pow(2,d),d++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
833tlog('LZString loaded from inline bundle. typeof LZString = '+typeof LZString);
834</script>
vendor: 1 bytes, line 834
834
835<script>
836(function(){
837
838tlog('Main script starting. typeof THREE = '+typeof THREE);
839if(typeof THREE === 'undefined'){
840  tlog('ABORTING: THREE is undefined, cannot build 3D scene.');
841  document.getElementById('canvas-wrap').innerHTML =
842    '<div style="color:#e9ecf3;font-family:sans-serif;padding:40px;text-align:center;">'+
843    'The 3D library failed to load, likely blocked by your network or an ad-blocker.<br>'+
844    'Check the Diagnostics panel below for details.</div>';
845  return;
846}
847
848/* ============================================================
849   SAMPLE DATA  (approximate reconstruction of France 4-6 England,
850   World Cup 2026 3rd place play-off, attacking-threat sequence)
851   ============================================================ */
852const SAMPLE = {
853  home:{name:"Red Lion", color:"#FF0000"},
854  away:{name:"White Lion", color:"#FFFFFF"},
855  competition:"St Stephen's Trophy",
856  date:"26th December 2025",
857  venue:"Coram's Fields",
858  venueLat:51.5247,
859  venueLong:-0.1197,
860  homeFormation:"4-2-3-1",
861  awayFormation:"4-1-4-1",
862  maxMinute:95,
863  timeline:[
864    [0,0.0],[1,-0.09],[2,-0.26],[3,-0.69],[4,0.0],[5,0.43],[6,0.33],
865    [7,-0.19],[8,-0.81],[9,-0.85],[10,-0.3],[11,0.43],[12,0.98],[13,1.0],
866    [14,0.87],[15,0.43],[16,0.27],[17,-0.4],[18,-0.7],[19,-0.6],[20,-0.45],
867    [21,0.05],[22,0.24],[23,0.24],[24,0.19],[25,0.0],[26,-0.11],[27,-0.16],
868    [28,-0.16],[29,0.6],[30,0.81],[31,0.5],[32,0.16],[33,-0.11],[34,-0.22],
869    [35,0.14],[36,0.41],[37,0.35],[38,0.16],[39,-0.27],[40,-0.27],[41,-0.54],
870    [42,-0.33],[43,-0.41],[44,-0.03],[45,-0.03],[46,-0.22],[47,-0.22],[48,0.27],
871    [49,0.44],[50,0.89],[51,0.39],[52,-0.03],[53,-0.11],[54,0.33],[55,0.43],
872    [56,0.43],[57,0.0],[58,0.05],[59,-0.54],[60,-0.54],[61,-0.33],[62,0.0],
873    [63,-0.8],[64,-0.9],[65,-1.0],[66,0.7],[67,0.62],[68,0.98],[69,0.46],
874    [70,0.46],[71,1.0],[72,0.6],[73,-0.16],[74,-0.22],[75,0.46],[76,0.84],
875    [77,1.0],[78,0.76],[79,0.65],[80,-1.0],[81,0.33],[82,0.22],[83,1.0],
876    [84,0.22],[85,0.03],[86,0.4],[87,0.9],[88,-0.2],[89,-0.05],[90,-0.05],
877    [91,0.9],[92,0.85],[93,-0.35],[94,-0.5],[95,0.0]
878  ],
879  events:[
880    {minute:3, team:"away", label:"Owen Ellis · 3'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
881    {minute:9, team:"away", label:"Dean Mitchell  · 9'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
882    {minute:13, team:"home", label:"Andy \"Erling\" Price ·13'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
883    {minute:18, team:"away", label:"Harry \"Kylian\" Walsh ·18'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
884    {minute:30, team:"home", label:"Jack Doyle · 30'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
885    {minute:50, team:"home", label:"Gary Wilkes · 50'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
886    {minute:65, team:"away", label:"Luke Bailey · 65'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
887    {minute:71, team:"home", label:"Mick Turner · 71'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
888    {minute:80, team:"away", label:"Harry \"Kylian\" Walsh ·80'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
889    {minute:87, team:"home", label:"Andy \"Erling\" Price · 87'", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"}
890  ],
891  lineup:[
892    {team:"home", role:"starter", number:"1", name:"Dave \"Safe Hands\" Carter (GK)", club:"Norwich City", age:"49", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
893    {team:"home", role:"starter", number:"2", name:"Liam Briggs (RB)", club:"Arsenal", age:"33", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
894    {team:"home", role:"starter", number:"3", name:"Ben Foster (LB)", club:"Milan", age:"27", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
895    {team:"home", role:"starter", number:"4", name:"Mick Turner (CB)", club:"Chelsea", age:"52", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
896    {team:"home", role:"starter", number:"5", name:"Steve Collins (CB)", club:"Brentford", age:"25", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
897    {team:"home", role:"starter", number:"6", name:"Gary Wilkes (DM)", club:"Manchester United", age:"20", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
898    {team:"home", role:"starter", number:"7", name:"Tom Henson (RM)", club:"Manchester City", age:"24", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
899    {team:"home", role:"starter", number:"8", name:"Jack Doyle (CM)", club:"Real Madrid", age:"22", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
900    {team:"home", role:"starter", number:"9", name:"Ryan Cooper (LM)", club:"Atletico Madrid", age:"21", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
901    {team:"home", role:"starter", number:"10", name:"Chris Mason (ST)", club:"Brighton & Hove Albion", age:"39", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
902    {team:"home", role:"starter", number:"11", name:"Andy \"Erling\" Price (ST)", club:"Bayern München", age:"27", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
903    {team:"home", role:"sub", number:"12", name:"Joe Parker (GK)", club:"Aston Villa", age:"32", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
904    {team:"home", role:"sub", number:"13", name:"Matt Harris", club:"Rennes", age:"23", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
905    {team:"home", role:"sub", number:"14", name:"Lewis Grant", club:"West Ham United", age:"29", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
906    {team:"home", role:"sub", number:"15", name:"Dan Collins", club:"Lens", age:"27", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
907    {team:"home", role:"sub", number:"16", name:"Sam Evans", club:"Leice
907ster City", age:"35", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/c280da709f9b46fea94d4798b5aba89e/data"},
908    {team:"away", role:"starter", number:"1", name:"Pete \"The Cat\" Morgan (GK)", club:"Crystal Palace", age:"46", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
909    {team:"away", role:"starter", number:"2", name:"Nathan Reed (RB)", club:"Paris Saint-Germain", age:"30", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
910    {team:"away", role:"starter", number:"3", name:"Alex Brooks (LB)", club:"Barcelona", age:"23", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
911    {team:"away", role:"starter", number:"4", name:"Rob Bennett (CB)", club:"Everton", age:"23", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
912    {team:"away", role:"starter", number:"5", name:"Jamie Scott (CB)", club:"Liverpool", age:"26", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
913    {team:"away", role:"starter", number:"6", name:"Carl Hughes (CM)", club:"Sunderland", age:"27", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
914    {team:"away", role:"starter", number:"7", name:"Luke Bailey (RW)", club:"Newcastle", age:"23", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
915    {team:"away", role:"starter", number:"8", name:"Connor Shaw (CM)", club:"Leeds", age:"32", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
916    {team:"away", role:"starter", number:"9", name:"Owen Ellis (LW)", club:"Tottenham Hotspur", age:"34", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
917    {team:"away", role:"starter", number:"10", name:"Dean Mitchell (ST)", club:"Dortmund", age:"36", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
918    {team:"away", role:"starter", number:"11", name:"Harry \"Kylian\" Walsh (ST)", club:"Real Madrid", age:"25", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
919    {team:"away", role:"sub", number:"12", name:"Callum White (GK)", club:"Roma", age:"39", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
920    {team:"away", role:"sub", number:"13", name:"Josh King", club:"Benfica", age:"64", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
921    {team:"away", role:"sub", number:"14", name:"Ethan Moore", club:"Marseille", age:"45", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
922    {team:"away", role:"sub", number:"15", name:"Ben Sutton", club:"Fenerbahçe", age:"42", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"},
923    {team:"away", role:"sub", number:"16", name:"Kyle Robinson", club:"Brondby", age:"53", photo:"https://notredamecobham.maps.arcgis.com/sharing/rest/content/items/9d1c5f3de452442aa435ee131b73735a/data"}
924  ]
925};
926
927let match = JSON.parse(JSON.stringify(SAMPLE));
928
929/* ============================================================
930   SPLINE — Catmull-Rom over sparse (minute,value) control points
931   ============================================================ */
932function makeSampler(points){
933  const pts = points.slice().sort((a,b)=>a[0]-b[0]);
934  return function(m){
935    if(m<=pts[0][0]) return pts[0][1];
936    if(m>=pts[pts.length-1][0]) return pts[pts.length-1][1];
937    let i=0;
938    while(i<pts.length-2 && pts[i+1][0]<m) i++;
939    const p0=pts[Math.max(0,i-1)], p1=pts[i], p2=pts[i+1], p3=pts[Math.min(pts.length-1,i+2)];
940    const t=(m-p1[0])/(p2[0]-p1[0]);
941    const t2=t*t, t3=t2*t;
942    const v = 0.5*((2*p1[1]) + (-p0[1]+p2[1])*t +
943      (2*p0[1]-5*p1[1]+4*p2[1]-p3[1])*t2 +
944      (-p0[1]+3*p1[1]-3*p2[1]+p3[1])*t3);
945    return Math.max(-1.05, Math.min(1.05, v));
946  };
947}
948// --- Penalty shootout: extends the timeline past normal/extra time rather
949// than being a separate screen, per how this was asked for. Each kick
950// occupies exactly one extra "minute" beyond wherever normal/extra time
951// ended. The wave doesn't track real momentum here (there isn't any — it's
952// a shootout) — every kick shifts a running psychological tally: a team
953// scoring swings it toward them, but a team MISSING swings it toward their
954// opponent too (a miss is good news for the other side, not a non-event) —
955// so the wave genuinely swings back and forth kick by kick, never settling
956// until the outcome is actually sealed. The deciding kick — trusted to be
957// whichever one is last in the list, since real data simply stops once a
958// shootout is over — snaps straight to 100/0 regardless of the exact
959// tally at that point, based on who actually has more scored kicks (the
960// tally is a "momentum" read, not the real decider). This segment is
961// sampled with plain linear interpolation (see makeLinearSampler) rather
962// than the same Catmull-Rom spline used for real momentum, which produced
963// a visible dip/wobble around runs of unchanged values.
964function computePenaltyTimelinePoints(m){
965  if(!m.penalties || !m.penalties.length) return [];
966  const startMinute = m.maxMinute;
967  const points = [[startMinute, 0]]; // anchors exactly at the 50/50 baseline when the shootout starts
968  let homeMakes = 0, awayMakes = 0, tally = 0;
969  m.penalties.forEach((kick, i)=>{
970    const scored = kick.outcome === 'score';
971    if(scored){ if(kick.team==='home') homeMakes++; else awayMakes++; }
972    // Every kick moves the tally — scoring swings it toward you, missing
973    // swings it toward your opponent.
974    if(kick.team==='home') tally += scored ? 1 : -1;
975    else tally += scored ? -1 : 1;
976    const isLastKick = i === m.penalties.length-1;
977    // Non-final kicks are capped strictly below full certainty (0.9, not 1.0)
978    // — only the actual deciding kick should ever read as "total"/100%. With
979    // no cap, a lopsided run of kicks before the real decider (e.g. a long
980    // shootout) could otherwise hit the full ±1 early, making it look like
981    // the match was over when it wasn't yet.
982    const lead = homeMakes - awayMakes; // this is what actually decides the shootout, not the tally
983    const value = isLastKick ? (lead>0?1:(lead<0?-1:0)) : Math.max(-0.9, Math.min(0.9, tally*0.2));
984    points.push([startMinute + i + 1, value]);
985  });
986  return points;
987}
988function makeLinearSampler(points){
989  const pts = points.slice().sort((a,b)=>a[0]-b[0]);
990  return function(m){
991    if(pts.length===0) return 0;
992    if(m<=pts[0][0]) return pts[0][1];
993    if(m>=pts[pts.length-1][0]) return pts[pts.length-1][1];
994    let i=0;
995    while(i<pts.length-1 && pts[i+1][0]<m) i++;
996    const p0=pts[i], p1=pts[i+1];
997    const t=(m-p0[0])/(p1[0]-p0[0]);
998    return p0[1] + (p1[1]-p0[1])*t;
999  };
1000}
1001function getEffectiveMaxMinute(m){
1002  return m.maxMinute + (m.penalties ? m.penalties.length : 0);
1003}
1004// Real match momentum uses the smooth spline as before; anything past
1005// match.maxMinute (i.e. the shootout, if there is one) uses the linear
1006// sampler instead — two different kinds of data, two appropriately
1007// different interpolation styles, joined seamlessly at the boundary since
1008// computePenaltyTimelinePoints anchors its first point there.
1009function makeCombinedSampler(m){
1010  const mainSampler = makeSampler(m.timeline);
1011  const penaltyPoints = computePenaltyTimelinePoints(m);
1012  if(!penaltyPoints.length) return mainSampler;
1013  const penaltySampler = makeLinearSampler(penaltyPoints);
1014  return function(minute){
1015    return minute <= m.maxMinute ? mainSampler(minute) : penaltySampler(minute);
1016  };
1017}
1018let sampleValue = makeCombinedSampler(match);
1019
1020/* ============================================================
1021   THREE.JS SCENE
1022   ============================================================ */
1023const wrap = document.getElementById('canvas-wrap');
1024const scene = new THREE.Scene();
1025scene.background = new THREE.Color(0x0a0d13);
1026tlog('Scene created.');
1027
1028const camera = new THREE.PerspectiveCamera(26, window.innerWidth/window.innerHeight, 5, 1000);
1029const BASE_CAM_POS = {x:0, y:140, z:290};
1030const CAM_LOOKAT = {x:0, y:2, z:10};
1031function positionCamera(){
1032  const aspect = window.innerWidth/window.innerHeight;
1033  // on narrow/portrait screens the horizontal FOV shrinks a lot relative to vertical,
1034  // cropping the pitch's sides — pull the camera back further to compensate
1035  const scale = aspect < 1 ? Math.min(2.4, 1/aspect) : 1;
1036  camera.position.set(BASE_CAM_POS.x*scale, BASE_CAM_POS.y*scale, BASE_CAM_POS.z*scale);
1037  camera.lookAt(CAM_LOOKAT.x, CAM_LOOKAT.y, CAM_LOOKAT.z);
1038}
1039positionCamera();
1040
1041const renderer = new THREE.WebGLRenderer({antialias:true, powerPreference:'high-performance'});
1042const isSmallScreen = Math.min(window.innerWidth, window.innerHeight) < 700;
1043renderer.setPixelRatio(Math.min(window.devicePixelRatio, isSmallScreen ? 1.5 : 2));
1044renderer.setSize(window.innerWidth, window.innerHeight);
1045wrap.appendChild(renderer.domElement);
1046tlog('Renderer created and canvas appended. Context: '+(renderer.getContext()?'OK':'MISSING'));
1047
1048// strong neutral ambient + a soft, uncoloured key light — keeps the vertex colours (the actual
1049// data signal) true instead of washing them toward grey/green
1050scene.add(new THREE.AmbientLight(0xffffff, 2.3));
1051const keyLight = new THREE.DirectionalLight(0xffffff, 0.35);
1052keyLight.position.set(-25, 45, 25);
1053scene.add(keyLight);
1054
1055/* ---- pitch group, sized to real FIFA proportions (105m x 68m), rotated at an angle ---- */
1056const PITCH_LEN = 105, PITCH_WID = 68; // real-world metres: length (goal-to-goal), width (touchline-to-touchline)
1057const pitchGroup = new THREE.Group();
1058pitchGroup.rotation.y = THREE.MathUtils.degToRad(-52); // clockwise, more oblique
1059scene.add(pitchGroup);
1060
1061function makePitchTexture(){
1062  const pxPerM = 9;
1063  const c = document.createElement('canvas');
1064  c.width = PITCH_WID*pxPerM; c.height = PITCH_LEN*pxPerM;
1065  const ctx = c.getContext('2d');
1066  ctx.fillStyle = "#0f1826"; ctx.fillRect(0,0,c.width,c.height);
1067  ctx.strokeStyle = "rgba(255,255,255,0.32)"; ctx.lineWidth = 2.5;
1068  const m = v => v*pxPerM;
1069  ctx.strokeRect(m(1),m(1),c.width-m(2),c.height-m(2));
1070  ctx.beginPath(); ctx.moveTo(m(1),c.height/2); ctx.lineTo(c.width-m(1),c.height/2); ctx.stroke();
1071  ctx.beginPath(); ctx.arc(c.width/2,c.height/2,m(9.15),0,Math.PI*2); ctx.stroke();
1072  // penalty areas (40.3m x 16.5m) + 6-yard boxes (18.32m x 5.5m) at each end
1073  [0, c.height-m(16.5)].forEach(y=>{
1074    ctx.strokeRect(c.width/2-m(20.15), y, m(40.3), m(16.5));
1075  });
1076  [0, c.height-m(5.5)].forEach(y=>{
1077    ctx.strokeRect(c.width/2-m(9.16), y, m(18.32), m(5.5));
1078  });
1079  return new THREE.CanvasTexture(c);
1080}
1081// same markings, but on a transparent background — drawn ON TOP of the opaque possession
1082// shading so the lines stay crisp and visible instead of getting washed out underneath it
1083function makeMarkingsTexture(){
1084  const pxPerM = 9;
1085  const c = document.createElement('canvas');
1086  c.width = PITCH_WID*pxPerM; c.height = PITCH_LEN*pxPerM;
1087  const ctx = c.getContext('2d');
1088  ctx.strokeStyle = "rgba(255,255,255,0.85)"; ctx.lineWidth = 2.5;
1089  const m = v => v*pxPerM;
1090  ctx.strokeRect(m(1),m(1),c.width-m(2),c.height-m(2));
1091  ctx.beginPath(); ctx.moveTo(m(1),c.height/2); ctx.lineTo(c.width-m(1),c.height/2); ctx.stroke();
1092  ctx.beginPath(); ctx.arc(c.width/2,c.height/2,m(9.15),0,Math.PI*2); ctx.stroke();
1093  [0, c.height-m(16.5)].forEach(y=>{
1094    ctx.strokeRect(c.width/2-m(20.15), y, m(40.3), m(16.5));
1095  });
1096  [0, c.height-m(5.5)].forEach(y=>{
1097    ctx.strokeRect(c.width/2-m(9.16), y, m(18.32), m(5.5));
1098  });
1099  return new THREE.CanvasTexture(c);
1100}
1101const pitch = new THREE.Mesh(
1102  new THREE.PlaneGeometry(PITCH_WID+4, PITCH_LEN+4),
1103  new THREE.MeshBasicMaterial({map:makePitchTexture(), transparent:true, opacity:0.85, fog:false, depthWrite:false})
1104);
1105pitch.rotation.x = -Math.PI/2;
1106pitch.position.y = -0.4;
1107pitch.renderOrder = 0;
1108pitchGroup.add(pitch);
1109
1110/* ---- halfway line: the true 50:50 reference — the possession line sits on it
1111   exactly when the match is even, and slides toward a goal end otherwise ---- */
1112/* ---- possession shading: the ground either side of the line is fully shaded
1113   in that team's colour, hard-edged right at the line's position ---- */
1114const SHADE_LEN_SEG = 70, SHADE_WID_SEG = 18;
1115const shadeGeo = new THREE.BufferGeometry();
1116const shadeVertCount = (SHADE_LEN_SEG+1)*(SHADE_WID_SEG+1);
1117const shadePositions = new Float32Array(shadeVertCount*3);
1118const shadeColors = new Float32Array(shadeVertCount*3);
1119const shadeBaseZ = new Float32Array(shadeVertCount);
1120let sIdx=0;
1121for(let i=0;i<=SHADE_LEN_SEG;i++){
1122  const z = PITCH_LEN/2 - (i/SHADE_LEN_SEG)*PITCH_LEN;
1123  for(let j=0;j<=SHADE_WID_SEG;j++){
1124    const x = -PITCH_WID/2 + (j/SHADE_WID_SEG)*PITCH_WID;
1125    shadeBaseZ[sIdx]=z;
1126    shadePositions[sIdx*3]=x; shadePositions[sIdx*3+1]=-0.15; shadePositions[sIdx*3+2]=z;
1127    shadeColors[sIdx*3]=1; shadeColors[sIdx*3+1]=1; shadeColors[sIdx*3+2]=1;
1128    sIdx++;
1129  }
1130}
1131const shadeIndices=[];
1132for(let i=0;i<SHADE_LEN_SEG;i++){
1133  for(let j=0;j<SHADE_WID_SEG;j++){
1134    const a=i*(SHADE_WID_SEG+1)+j, b=(i+1)*(SHADE_WID_SEG+1)+j, c=(i+1)*(SHADE_WID_SEG+1)+(j+1), d=i*(SHADE_WID_SEG+1)+(j+1);
1135    shadeIndices.push(a,b,d, b,c,d);
1136  }
1137}
1138shadeGeo.setIndex(shadeIndices);
1139shadeGeo.setAttribute('position', new THREE.BufferAttribute(shadePositions,3));
1140shadeGeo.setAttribute('color', new THREE.BufferAttribute(shadeColors,3));
1141const shadeMat = new THREE.MeshBasicMaterial({vertexColors:true, fog:false, side:THREE.DoubleSide});
1142const possessionShade = new THREE.Mesh(shadeGeo, shadeMat);
1143possessionShade.renderOrder = 1;
1144pitchGroup.add(possessionShade);
1145
1146const pitchMarkings = new THREE.Mesh(
1147  new THREE.PlaneGeometry(PITCH_WID+4, PITCH_LEN+4),
1148  new THREE.MeshBasicMaterial({map:makeMarkingsTexture(), transparent:true, depthWrite:false, fog:false})
1149);
1150pitchMarkings.rotation.x = -Math.PI/2;
1151pitchMarkings.position.y = 0.0;
1152pitchMarkings.renderOrder = 2;
1153pitchGroup.add(pitchMarkings);
1154
1155const halfwayLine = new THREE.Mesh(
1156  new THREE.PlaneGeometry(PITCH_WID+4, 0.12),
1157  new THREE.MeshBasicMaterial({color:0xffffff, transparent:true, opacity:0.55, side:THREE.DoubleSide, fog:false, depthWrite:false})
1158);
1159halfwayLine.rotation.x = -Math.PI/2;
1160halfwayLine.position.set(0, 0.02, 0);
1161halfwayLine.renderOrder = 3;
1162pitchGroup.add(halfwayLine);
1163
1164/* ---- the possession line: ONE continuous curved line is the entire signal.
1165   Its position along the goal-to-goal axis is directly proportional to the
1166   current possession value — home's goal end at +1, away's goal end at -1,
1167   the halfway line only at exactly 0. Nothing else on the pitch carries data,
1168   so there's no ambiguity about what's animating. ---- */
1169const LINE_SEG = 90;
1170const lineGeo = new THREE.BufferGeometry();
1171const linePositions = new Float32Array((LINE_SEG+1)*3);
1172const lineColors = new Float32Array((LINE_SEG+1)*3);
1173lineGeo.setAttribute('position', new THREE.BufferAttribute(linePositions,3));
1174lineGeo.setAttribute('color', new THREE.BufferAttribute(lineColors,3));
1175const lineMat = new THREE.LineBasicMaterial({vertexColors:true, linewidth:3, fog:false});
1176const possessionLine = new THREE.Line(lineGeo, lineMat);
1177possessionLine.renderOrder = 4;
1178pitchGroup.add(possessionLine);
1179
1180// a flat ribbon gives the line visible surface area/thickness (a plain THREE.Line
1181// renders as a near-invisible 1px hairline in most browsers)
1182const RIBBON_N = LINE_SEG+1;
1183const ribbonGeo = new THREE.BufferGeometry();
1184const ribbonPositions = new Float32Array(RIBBON_N*2*3);
1185const ribbonColors = new Float32Array(RIBBON_N*2*3);
1186const ribbonIndices = [];
1187for(let i=0;i<LINE_SEG;i++){
1188  const a=i*2, b=i*2+1, c=(i+1)*2+1, d=(i+1)*2;
1189  ribbonIndices.push(a,b,d, b,c,d);
1190}
1191ribbonGeo.setIndex(ribbonIndices);
1192ribbonGeo.setAttribute('position', new THREE.BufferAttribute(ribbonPositions,3));
1193ribbonGeo.setAttribute('color', new THREE.BufferAttribute(ribbonColors,3));
1194const ribbonMat = new THREE.MeshStandardMaterial({vertexColors:true, roughness:0.4, metalness:0.05, side:THREE.DoubleSide, fog:false, emissive:0x0a0a0a});
1195const possessionRibbon = new THREE.Mesh(ribbonGeo, ribbonMat);
1196possessionRibbon.renderOrder = 5;
1197pitchGroup.add(possessionRibbon);
1198
1199/* ---- helpers for colors ---- */
1200function hexToRgb01(hex){
1201  const h = hex.replace('#','');
1202  return [parseInt(h.substr(0,2),16)/255, parseInt(h.substr(2,2),16)/255, parseInt(h.substr(4,2),16)/255];
1203}
1204let homeRgb = hexToRgb01(match.home.color);
1205let awayRgb = hexToRgb01(match.away.color);
1206
1207let displayedValue = 0; // eased possession value, so the line flows rather than jumps
1208const RIBBON_DEPTH = 1.6; // how thick (front-to-back) the painted line looks
1209const CURVE_AMP = 2.2; // gentle wave along the line's own length, purely cosmetic
1210let surgeUntil = 0, surgeSign = 0, surgeFlat = false;
1211let clockSlowUntil = 0; // briefly slows match-time advancement so a goal isn't over in a blink
1212let clockSlowLocked = false; // when true, never let the pause/surge lapse (the match-winning goal)
1213// Ceiling on how long any single custom audio clip (goal commentary or a
1214// penalty clip) can hold the match visually paused for — the clip itself
1215// still plays out in full in the background regardless, this only stops an
1216// unusually long attached file from freezing the match for an unreasonable
1217// stretch (raised after earlier glitchiness concerns with long pauses).
1218const MAX_CLIP_PAUSE_S = 25;
1219function extendPauseUntil(t){
1220  clockSlowUntil = Math.max(clockSlowUntil, t);
1221  surgeUntil = Math.max(surgeUntil, t);
1222}
1223/* flat=true skips forcing the tide to full dominance during this goal's pause —
1224   for a goal immediately followed by a whistle (e.g. an equaliser right before
1225   full time) rather than a spell of sustained pressure, the tide should keep
1226   following the timeline's own (already-tapering) values instead of snapping
1227   to the extreme and holding there for the pause's duration. */
1228function triggerPossessionSurge(sign, slowBuild, flat){
1229  surgeSign = sign;
1230  surgeFlat = !!flat;
1231  surgeEaseRate = slowBuild ? 0.008 : 0.08; // ~6.5s to peak vs ~0.6s to peak
1232  extendPauseUntil(performance.now() + 3200);
1233}
1234
1235let surgeEaseRate = 0.08;
1236function computeAnticipationCap(minute, spd){
1237  let cap = 1; // no cap by default
1238  match.events.forEach(e=>{
1239    const key = e.minute+"_"+e.team;
1240    if(seenEvents.has(key) || e.minute<=minute) return; // already fired or already past
1241    const minutesAway = e.minute-minute;
1242    const realSecondsAway = minutesAway/(Math.max(0.25,spd)*3.2);
1243    if(realSecondsAway < 7){
1244      // held at a fixed, moderate cap for the WHOLE anticipation window — only
1245      // released via the surge once the goal actually fires. Letting this ease
1246      // toward 1.0 as the goal approached (the previous version) was self-defeating:
1247      // it released the cap right when it mattered most.
1248      cap = Math.min(cap, 0.6);
1249    }
1250  });
1251  return cap;
1252}
1253/* Fires the final-highlight clip (a short, self-contained cheer-and-fade-out
1254   recording) a fixed number of REAL seconds — not match-minutes — before
1255   whichever goal it's attached to, so it lands the same way regardless of
1256   playback speed. Reuses the same real-seconds-away math as the anticipation
1257   cap above. Any event can carry its own highlightAudio clip (e.g. the 101'
1258   and 120' goals each have one), not just a single hardcoded goal. */
1259const HIGHLIGHT_LEAD_SECONDS = 6.5;
1260const playedHighlights = new Set();
1261function checkHighlightCues(minute, spd){
1262  match.events.forEach(e=>{
1263    if(!e.highlightAudio) return;
1264    const key = e.minute+"_"+e.team;
1265    if(playedHighlights.has(key)) return;
1266    if(minute >= e.minute){ playedHighlights.add(key); return; } // already past — don't fire late
1267    const minutesAway = e.minute - minute;
1268    const realSecondsAway = minutesAway/(Math.max(0.25,spd)*3.2);
1269    if(realSecondsAway <= HIGHLIGHT_LEAD_SECONDS){
1270      playedHighlights.add(key);
1271      try{
1272        const el = trackAudio(getCachedAudio(e.highlightAudio));
1273        el.loop = false; // one-shot — it already has its own built-in cheer and fade-out
1274        el.volume = 0.7;
1275        el.play().catch(()=>{});
1276        tlog('Highlight clip started for '+e.minute+"' goal ("+realSecondsAway.toFixed(1)+'s lead-in).');
1277      }catch(err){}
1278    }
1279  });
1280}
1281function updateCloth(currentMinute, t, recomputeNormals){
1282  let targetValue = sampleValue(currentMinute); // -1 (away has it all) .. +1 (home has it all)
1283  const surging = clockSlowLocked || performance.now() < surgeUntil;
1284  if(surging){
1285    targetValue = surgeFlat ? sampleValue(currentMinute) : surgeSign;
1286  }else{
1287    const cap = computeAnticipationCap(currentMinute, speed);
1288    targetValue = Math.max(-cap, Math.min(cap, targetValue));
1289  }
1290  displayedValue += (targetValue - displayedValue) * (surging ? surgeEaseRate : 0.2);
1291
1292  // direct, unambiguous mapping: total dominance pushes the line all the way to the
1293  // OPPONENT's goal line (a goal reaches it exactly), sitting on the halfway line at 0
1294  const centerZ = -displayedValue * (PITCH_LEN/2 - 0.4);
1295  const mag = Math.min(1, Math.abs(displayedValue));
1296  const colorMix = (displayedValue+1)/2; // 0 = full away colour, 1 = full home colour
1297  const r = awayRgb[0]*(1-colorMix) + homeRgb[0]*colorMix;
1298  const g = awayRgb[1]*(1-colorMix) + homeRgb[1]*colorMix;
1299  const b = awayRgb[2]*(1-colorMix) + homeRgb[2]*colorMix;
1300  const lineHeight = 0.25 + mag*0.7;
1301
1302  // shade every point on the pitch fully in whichever team's colour it currently falls on
1303  const shadeCol = shadeGeo.attributes.color.array;
1304  for(let i=0;i<shadeVertCount;i++){
1305    const isHome = shadeBaseZ[i] > centerZ; // home occupies from their own goal end up to the line
1306    const c = isHome ? homeRgb : awayRgb;
1307    shadeCol[i*3]=c[0]; shadeCol[i*3+1]=c[1]; shadeCol[i*3+2]=c[2];
1308  }
1309  shadeGeo.attributes.color.needsUpdate = true;
1310
1311  const linePos = lineGeo.attributes.position.array;
1312  const lineCol = lineGeo.attributes.color.array;
1313  const ribPos = ribbonGeo.attributes.position.array;
1314  const ribCol = ribbonGeo.attributes.color.array;
1315
1316  for(let i=0;i<=LINE_SEG;i++){
1317    const u = i/LINE_SEG;
1318    const x = -PITCH_WID/2 + u*PITCH_WID;
1319    const wave = CURVE_AMP*Math.sin(u*Math.PI*2 + t*0.6) * (0.4+0.6*mag);
1320    const z = centerZ + wave;
1321
1322    linePos[i*3]=x; linePos[i*3+1]=lineHeight+0.05; linePos[i*3+2]=z;
1323    lineCol[i*3]=Math.min(1,r+0.25); lineCol[i*3+1]=Math.min(1,g+0.25); lineCol[i*3+2]=Math.min(1,b+0.25);
1324
1325    const zNear = z - RIBBON_DEPTH/2, zFar = z + RIBBON_DEPTH/2;
1326    const p0 = i*2, p1 = i*2+1;
1327    ribPos[p0*3]=x; ribPos[p0*3+1]=lineHeight; ribPos[p0*3+2]=zNear;
1328    ribPos[p1*3]=x; ribPos[p1*3+1]=lineHeight; ribPos[p1*3+2]=zFar;
1329    ribCol[p0*3]=r; ribCol[p0*3+1]=g; ribCol[p0*3+2]=b;
1330    ribCol[p1*3]=r; ribCol[p1*3+1]=g; ribCol[p1*3+2]=b;
1331  }
1332  lineGeo.attributes.position.needsUpdate=true;
1333  lineGeo.attributes.color.needsUpdate=true;
1334  ribbonGeo.attributes.position.needsUpdate=true;
1335  ribbonGeo.attributes.color.needsUpdate=true;
1336  if(recomputeNormals) ribbonGeo.computeVertexNormals();
1337}
1338
1339window.addEventListener('resize', ()=>{
1340  camera.aspect = window.innerWidth/window.innerHeight;
1341  positionCamera();
1342  camera.updateProjectionMatrix();
1343  renderer.setSize(window.innerWidth, window.innerHeight);
1344});
1345
1346/* ============================================================
1347   AUDIO — synthesised stadium crowd. Key difference from surf/wind:
1348   surf is smooth, slow, and regular (periodic swells); a crowd is
1349   granular and irregular (many overlapping voices). So modulation
1350   here is driven by filtered NOISE, not a smooth sine LFO.
1351   ============================================================ */
1352const GOAL_SAMPLE_B64 = "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UGpmYBchrBlCvWzYoIMIfHL8DDNYsQlv7CNlBczgK26v/qnis5gBJEIwnVa0yv/Xv2//8I2Ptz7aBMXJQpnux46q6BJgo1WYyKrnuTq//GjPen9v8N/p9P/V//3L8RAAAAABLmFC01wXBqN2jbWoERtIjMhN1lUKeUbUMkWkPgYBBTNMQ4TKa1a1kKQholVSk88iqUz/y+byvpZvK/nDPpreqVBLSi1MVqWDBRrZLi7PBoN8rcpS5P2UB5OKLhP7/remUirf8v7yw1EjJhbpfu/OH00xUl3uOH+7jcGMvRZb///////0dCgAAAAAApgOwyxIUNQw0S9GUeh2h1Czq3/+3JkDIbjRiHRaew0ICFhaecEqTYNEHE7Q2HhCHsIpsgTCOA8i8F/Tg7jAYAZ4lWyOAAC5DMgbnYEQ9HUxSj4iBowKzrItgYCWwT+lm8kXHL+lLUT3tjyziJNMcgm4SNnY60q1aBxVnEgfKGAVFmp6XINLgAAAAVAcsSrBQqx0rHRg2aaZsBtmc53y3+76vr//u+7y9wBTo0EYkzmEMAXM4yExaIOYyNCglaTBkFOTVGCFgtA5gXyJTE6NRyWWiAqY1CyOJCGRSIxWozfVrqWaV7L/R73SNGizRXF+x1jXXajS2FDimc88Dxu59fvnNWff8Xex+d/dx38oFal4GGszRfJ5yBxYEH5RNET43QcG68/VN6f3/9v/d/1fQoRIAAAAAAuQbsexMVyT4/SQAqkmBhFvAgiEiEgTv/7cGQOgvNuM01p5h2gJMTJQAklPAu4hR7sMRJAkgjiwAGkEJNVpPNQKcuITKmnL7AYGt4hyqmWzxXTImwMPI0DJloonEpgwBECYTTouokVV5Tilrp3i6NnSiw8+5DigTHTRENsWWSSklvYGgkTYlFw2yzXo6QtXY0MIiYiAMi3rgp255PWtslIPDj4SBv+NFfiT///iLv2/pMgkZqtmad6DWcvzmtFYYtkzdguq0dd2W4MOSdATVsIAlBmJASBqIsT33CUfSU4csXG0ybyq0IQCxu1rKxcB0POgrLEg6SIHolAWRCQuIpYOlTpZ50S//+10serO+SpQU0IkIVPItjGpWFTJE2zlilq41sYIh4ZOg0/EQ8Nlv9RU75GAABqEUACwhGCMkPkpEQiERCEaGxARkhtHHSTolL/+3JkDo/yRx2pyS8bsh/CBKANKXBAAAGkAAAAIAAANIAAAAQZwYoUgQsIQH0KaJ0NMcg+y2GmaCsf5ZZKysFBAwQYGCBoGLK1VVV00001VLKhkyxrHQ1DAIpEQhGg+MCMQCMuUTUXAwO//9dNNNNVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==";
1353let goalSampleBuffer = null;
1354function loadGoalSample(){
1355  if(goalSampleBuffer || !actx) return;
1356  try{
1357    const binary = atob(GOAL_SAMPLE_B64);
1358    const bytes = new Uint8Array(binary.length);
1359    for(let i=0;i<binary.length;i++) bytes[i] = binary.charCodeAt(i);
1360    actx.decodeAudioData(bytes.buffer.slice(0), function(buf){ goalSampleBuffer = buf; tlog('Goal sample decoded, duration '+buf.duration.toFixed(2)+'s'); }, function(err){ tlog('Goal sample decode failed: '+err); });
1361  }catch(err){ tlog('Goal sample load error: '+err.message); }
1362}
1363const AMBIENT_LOOP_B64 = "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";
1364let actx=null, crowdGain=null, muted=false;
1365// Every distinct clip gets exactly ONE persistent Audio element, reused for
1366// its whole lifetime rather than a fresh `new Audio()` each time it plays.
1367// This matters for iOS: the "unlock" grant from playing a decoy element in
1368// a user gesture does not reliably transfer to unrelated elements created
1369// later from async code — but replaying the SAME element that was already
1370// played once from the gesture is allowed. See primeAllMatchAudio() below.
1371const audioElementCache = new Map();
1372function getCachedAudio(url){
1373  if(!url) return null;
1374  let el = audioElementCache.get(url);
1375  if(!el){ el = new Audio(url); audioElementCache.set(url, el); }
1376  return el;
1377}
1378// Web Audio (actx) and plain `new Audio()` elements are two SEPARATE media
1379// pipelines on iOS Safari, each needing its own permission from a direct
1380// user gesture. actx.resume() below unlocks the first; this flag tracks
1381// whether the second has been unlocked yet, since every custom clip in
1382// this app (goals, commentary, stingers) uses new Audio() and is created
1383// later from inside the animation loop — not from a direct tap — so
1384// without this, iOS silently blocks all of them.
1385let audioElementsUnlocked = false;
1386let ambientGain = null;
1387function initAudio(){
1388  if(actx) return;
1389  actx = new (window.AudioContext||window.webkitAudioContext)();
1390  actx.addEventListener('statechange', ()=>tlog('AudioContext statechange event: state is now '+actx.state));
1391  crowdGain = actx.createGain(); crowdGain.gain.value=0.5;
1392  crowdGain.connect(actx.destination);
1393  loadGoalSample();
1394
1395  // general ambient crowd noise — a real recorded loop rather than synthesised noise.
1396  // A per-match custom recording (match.ambientAudio) takes priority when set,
1397  // falling back to the app's built-in default loop otherwise.
1398  ambientGain = actx.createGain(); ambientGain.gain.value=0.58;
1399  ambientGain.connect(crowdGain);
1400
1401  function startAmbientBuffer(buf){
1402    const src = actx.createBufferSource();
1403    src.buffer = buf; src.loop = true;
1404    src.connect(ambientGain);
1405    src.start();
1406    tlog('Ambient loop decoded and started, duration '+buf.duration.toFixed(2)+'s');
1407  }
1408  function loadDefaultAmbient(){
1409    try{
1410      const binary = atob(AMBIENT_LOOP_B64);
1411      const bytes = new Uint8Array(binary.length);
1412      for(let i=0;i<binary.length;i++) bytes[i] = binary.charCodeAt(i);
1413      actx.decodeAudioData(bytes.buffer.slice(0), startAmbientBuffer, function(err){ tlog('Ambient loop decode failed: '+err); });
1414    }catch(err){ tlog('Ambient loop load error: '+err.message); }
1415  }
1416
1417  if(match.ambientAudio){
1418    fetch(match.ambientAudio)
1419      .then(r=>r.arrayBuffer())
1420      .then(buf=>actx.decodeAudioData(buf, startAmbientBuffer, err=>{
1421        tlog('Custom ambient audio decode failed, falling back to default: '+err);
1422        loadDefaultAmbient();
1423      }))
1424      .catch(err=>{ tlog('Custom ambient audio fetch failed, falling back to default: '+err.message); loadDefaultAmbient(); });
1425  }else{
1426    loadDefaultAmbient();
1427  }
1428}
1429// fades ambient crowd noise in around kickoff and out around full-time, so it's silent
1430// before the match starts and after it ends, rather than audible the instant Play is pressed
1431function crowdEnvelope(m){
1432  // window is defined in match-minutes, but match-minutes pass at speed*3.2 per real second —
1433  // so scale the window by that rate to keep the fade at a constant ~2.5 REAL seconds
1434  // regardless of playback speed, rather than a fixed (and too-fast) minute count
1435  const windowMin = 2.5 * Math.max(0.5, speed) * 3.2;
1436  const fadeIn = Math.min(1, Math.max(0, m/windowMin));
1437  const fadeOut = Math.min(1, Math.max(0, (match.maxMinute-m)/windowMin));
1438  return Math.max(0, Math.min(fadeIn, fadeOut));
1439}
1440function setCrowdLevel(intensity){
1441  if(!actx||muted||!ambientGain) return;
1442  const mag = Math.min(1, Math.abs(intensity));
1443  const envelope = crowdEnvelope(currentMinute);
1444  ambientGain.gain.setTargetAtTime((0.58 + mag*0.22)*envelope, actx.currentTime, 0.6);
1445}
1446let activeRoarGain = null;
1447function playGoalCelebrationTail(){
1448  try{
1449    const cel = trackAudio(getCachedAudio(match.goalCelebrationAudio));
1450    cel._ivs = [];
1451    cel.volume = 1.0;
1452    cel.addEventListener('loadedmetadata', ()=>{
1453      const dur = isFinite(cel.duration) && cel.duration>0 ? cel.duration : 8;
1454      // keep the match slowed/paused through the celebration too, not just the commentary
1455      const celEnd = performance.now() + (dur+0.5)*1000;
1456      extendPauseUntil(celEnd);
1457      // fade the celebration's own volume out over its last ~3s (or half its length if shorter)
1458      const fadeSeconds = Math.min(3.5, dur*0.5);
1459      const fadeStartMs = Math.max(0, (dur-fadeSeconds))*1000;
1460      setTimeout(()=>{
1461        const steps = 24;
1462        let i=0;
1463        const iv = setInterval(()=>{
1464          i++;
1465          cel.volume = Math.max(0, 1-(i/steps));
1466          if(i>=steps) clearInterval(iv);
1467        }, (fadeSeconds*1000)/steps);
1468        cel._ivs.push(iv);
1469      }
1469, fadeStartMs);
1470    });
1471    cel.addEventListener('ended', ()=>{
1472      if(ambientGain && actx) ambientGain.gain.setTargetAtTime(
1473        (0.58 + Math.min(1,Math.abs(sampleValue(currentMinute)))*0.22) * crowdEnvelope(currentMinute),
1474        actx.currentTime, 1.8
1475      );
1476    });
1477    cel.play().catch(()=>{ if(ambientGain && actx) setCrowdLevel(sampleValue(currentMinute)); });
1478  }catch(err){ if(ambientGain && actx) setCrowdLevel(sampleValue(currentMinute)); }
1479}
1480let ambientVarietyPlayer = null;
1481let ambientVarietyCooldownUntil = 0;
1482let dominantSince = null;
1483let lastDominantSign = 0;
1484let homeDominanceAccum = 0, awayDominanceAccum = 0;
1485function maybeTriggerAmbientVariety(dt){
1486  if(!actx) return;
1487  if(!playing || muted || ambientVarietyPlayer){
1488    // still decay gently even when not actively accumulating, so it doesn't feel stuck
1489    homeDominanceAccum = Math.max(0, homeDominanceAccum-dt*0.4);
1490    awayDominanceAccum = Math.max(0, awayDominanceAccum-dt*0.4);
1491    return;
1492  }
1493  const v = displayedValue; // the same eased value driving the 3D line — smoother than raw sampleValue
1494  if(v>0.28){ homeDominanceAccum = Math.min(9, homeDominanceAccum+dt); awayDominanceAccum = Math.max(0, awayDominanceAccum-dt*1.5); }
1495  else if(v<-0.28){ awayDominanceAccum = Math.min(9, awayDominanceAccum+dt); homeDominanceAccum = Math.max(0, homeDominanceAccum-dt*1.5); }
1496  else { homeDominanceAccum = Math.max(0, homeDominanceAccum-dt*0.4); awayDominanceAccum = Math.max(0, awayDominanceAccum-dt*0.4); }
1497
1498  const now = performance.now();
1499  if(now<ambientVarietyCooldownUntil) return;
1500  let pool = null;
1501  if(homeDominanceAccum>=6 && match.homeVarietyAudio && match.homeVarietyAudio.length){ pool = match.homeVarietyAudio; homeDominanceAccum = 0; }
1502  else if(awayDominanceAccum>=6 && match.awayVarietyAudio && match.awayVarietyAudio.length){ pool = match.awayVarietyAudio; awayDominanceAccum = 0; }
1503  if(!pool) return;
1504  const clip = pool[Math.floor(Math.random()*pool.length)];
1505  ambientVarietyCooldownUntil = now + 14000 + Math.random()*6000;
1506  try{
1507    const el = trackAudio(getCachedAudio(clip));
1508    ambientVarietyPlayer = el;
1509    if(ambientGain) ambientGain.gain.setTargetAtTime(0.22, actx.currentTime, 1.2);
1510    el.addEventListener('ended', ()=>{
1511      ambientVarietyPlayer = null;
1512      if(ambientGain) ambientGain.gain.setTargetAtTime(
1513        (0.58 + Math.min(1,Math.abs(sampleValue(currentMinute)))*0.22) * crowdEnvelope(currentMinute),
1514        actx.currentTime, 1.5
1515      );
1516    }, {once:true});
1517    el.addEventListener('error', ()=>{ ambientVarietyPlayer=null; }, {once:true});
1518    el.play().catch(()=>{ ambientVarietyPlayer=null; });
1519  }catch(err){ ambientVarietyPlayer=null; }
1520}
1521function playRoar(volumeScale){
1522  if(!actx||muted) return;
1523  const vol = volumeScale===undefined ? 1 : volumeScale;
1524  // if the previous goal's roar is still ringing out (quick succession of goals),
1525  // duck it fast rather than letting the two overlap into a mush
1526  if(activeRoarGain){
1527    try{
1528      activeRoarGain.gain.cancelScheduledValues(actx.currentTime);
1529      activeRoarGain.gain.setValueAtTime(activeRoarGain.gain.value, actx.currentTime);
1530      activeRoarGain.gain.linearRampToValueAtTime(0.0001, actx.currentTime+0.25);
1531    }catch(err){}
1532  }
1533  if(goalSampleBuffer){
1534    const src = actx.createBufferSource();
1535    src.buffer = goalSampleBuffer;
1536    const g = actx.createGain();
1537    const dur = goalSampleBuffer.duration;
1538    g.gain.setValueAtTime(0.0001, actx.currentTime);
1539    g.gain.exponentialRampToValueAtTime(0.85*vol, actx.currentTime+0.35); // fade up
1540    g.gain.setValueAtTime(0.85*vol, actx.currentTime+Math.max(0.35, dur-1.2));
1541    g.gain.exponentialRampToValueAtTime(0.0001, actx.currentTime+dur-0.05); // fade down
1542    src.connect(g); g.connect(crowdGain);
1543    src.start();
1544    activeRoarGain = g;
1545    return;
1546  }
1547  // fallback if the sample hasn't decoded yet (e.g. audio context just started)
1548  const bufferSize = actx.sampleRate*2.2;
1549  const buffer = actx.createBuffer(1, bufferSize, actx.sampleRate);
1550  const data = buffer.getChannelData(0);
1551  let lastOut=0;
1552  for(let i=0;i<bufferSize;i++){ const w=Math.random()*2-1; lastOut=(lastOut+0.02*w)/1.02; data[i]=lastOut*5; }
1553  const src = actx.createBufferSource(); src.buffer=buffer;
1554  const filter = actx.createBiquadFilter(); filter.type='bandpass'; filter.Q.value=0.5;
1555  filter.frequency.setValueAtTime(600, actx.currentTime);
1556  filter.frequency.linearRampToValueAtTime(1900, actx.currentTime+1.
15560);
1557  const g = actx.createGain(); g.gain.setValueAtTime(0.05*vol, actx.currentTime);
1558  g.gain.linearRampToValueAtTime(0.55*vol, actx.currentTime+0.12);
1559  g.gain.linearRampToValueAtTime(0.0, actx.currentTime+2.1);
1560  src.connect(filter); filter.connect(g); g.connect(crowdGain);
1561  src.start(); src.stop(actx.currentTime+2.2);
1562}
1563
1564/* ============================================================
1565   PLAYBACK STATE
1566   ============================================================ */
1567let currentMinute = 0;
1568let playing = false;
1569let speed = 1;
1570let lastTs = null;
1571let clockT = 0;
1572const seenEvents = new Set();
1573const seenPenalties = new Set();
1574let playedShootoutIntro = false;
1575
1576function computeScores(uptoMinute){
1577  let h=0,a=0;
1578  match.events.forEach(e=>{ if(e.minute<=uptoMinute){ if(e.team==='home') h++; else a++; } });
1579  return {h,a};
1580}
1581
1582function halfLabel(m){
1583  if(match.penalties && match.penalties.length && m > match.maxMinute + 0.001) return "PENALTIES";
1584  if(m<=45.9) return "1ST HALF";
1585  if(!match.hasExtraTime) return "2ND HALF";
1586  if(m<=90.9) return "2ND HALF";
1587  if(m<=105.9) return "ET 1ST HALF";
1588  return "ET 2ND HALF";
1589}
1590
1591function refreshUI(){
1592  const s = computeScores(currentMinute);
1593  document.getElementById('scoreHome').textContent = s.h;
1594  document.getElementById('scoreAway').textContent = s.a;
1595  document.getElementById('minuteNum').textContent = Math.floor(currentMinute)+"'";
1596  document.getElementById('halfLbl').textContent = halfLabel(currentMinute);
1597  document.getElementById('timeReadout').textContent = Math.floor(currentMinute)+"' / "+getEffectiveMaxMinute(match)+"'";
1598
1599  const v = Math.max(-1, Math.min(1, sampleValue(currentMinute)));
1600  const homePct = Math.round(((v+1)/2)*100);
1601  const awayPct = 100 - homePct;
1602  document.getElementById('shareHomeFill').style.width = homePct+'%';
1603  document.getElementById('shareAwayFill').style.width = awayPct+'%';
1604  document.getElementById('shareHomePct').textContent = homePct+'%';
1605  document.getElementById('shareAwayPct').textContent = awayPct+'%';
1606
1607  const domEl = document.getElementById('dominantLabel');
1608  const dv = displayedValue;
1609  if(Math.abs(dv) < 0.06){
1610    domEl.textContent = 'Balanced';
1611    domEl.style.color = 'var(--ink-dim)';
1612  }else if(dv > 0){
1613    domEl.textContent = (match.home.name||'Home')+' ▶';
1614    domEl.style.color = match.home.color;
1615  }else{
1616    domEl.textContent = '◀ '+(match.away.name||'Away');
1617    domEl.style.color = match.away.color;
1618  }
1619
1620  drawPossessionChart();
1621}
1622
1623const chartCanvas = document.getElementById('possessionChart');
1624const chartCtx = chartCanvas.getContext('2d');
1625let chartCachedWidth = 0, chartCachedHeight = 0;
1626function drawPossessionChart(){
1627  const rect = chartCanvas.getBoundingClientRect();
1628  const dpr = Math.min(window.devicePixelRatio||1, 2);
1629  const w = Math.max(1,Math.round(rect.width*dpr)), h = Math.max(1,Math.round(rect.height*dpr));
1630  if(w!==chartCachedWidth || h!==chartCachedHeight){
1631    chartCanvas.width = w; chartCanvas.height = h;
1632    chartCachedWidth = w; chartCachedHeight = h;
1633  }
1634  chartCtx.clearRect(0,0,w,h);
1635  const midY = h/2;
1636  const maxM = getEffectiveMaxMinute(match);
1637  // padding so goals right at the very start/end (e.g. a stoppage-time winner) aren't
1638  // squashed against the edge and easy to miss
1639  const padX = Math.max(28, w*0.06);
1640  const plotW = w - padX*2;
1641  chartXOfCache = {padX, plotW, maxM};
1642  const xOf = m => padX + (m/maxM)*plotW;
1643
1644  // sample the timeline at a fine, even resolution for a smooth curve
1645  const N = Math.max(40, Math.round(plotW/3));
1646  const pts = [];
1647  for(let i=0;i<=N;i++){
1648    const m = (i/N)*maxM;
1649    pts.push([ xOf(m), sampleValue(m) ]);
1650  }
1651
1652  // filled area: above midline in home colour, below in away colour
1653  function fillSide(homeSide){
1654    chartCtx.beginPath();
1655    chartCtx.moveTo(padX, midY);
1656    for(const [x,v] of pts){
1657      const y = midY - v*(h*0.46);
1658      const clipped = homeSide ? Math.min(y, midY) : Math.max(y, midY);
1659      chartCtx.lineTo(x, clipped);
1660    }
1661    chartCtx.lineTo(padX+plotW, midY);
1662    chartCtx.closePath();
1663    chartCtx.fillStyle = homeSide ? match.home.color : match.away.color;
1664    chartCtx.globalAlpha = 0.55;
1665    chartCtx.fill();
1666    chartCtx.globalAlpha = 1;
1667  }
1668  fillSide(true);
1669  fillSide(false);
1670
1671  // the curve itself
1672  chartCtx.beginPath();
1673  pts.forEach(([x,v],i)=>{
1674    const y = midY - v*(h*0.46);
1675    if(i===0) chartCtx.moveTo(x,y); else chartCtx.lineTo(x,y);
1676  });
1677  chartCtx.strokeStyle = 'rgba(255,255,255,0.55)';
1678  chartCtx.lineWidth = Math.max(1, 1.2*dpr);
1679  chartCtx.stroke();
1680
1681  // midline
1682  chartCtx.strokeStyle = 'rgba(255,255,255,0.25)';
1683  chartCtx.lineWidth = 1*dpr;
1684  chartCtx.beginPath(); chartCtx.moveTo(padX,midY); chartCtx.lineTo(padX+plotW,midY); chartCtx.stroke();
1685
1686  // goal markers — anchored exactly to the event's real minute, independent of
1687  // where the (smoothed) curve happens to peak, so goals are never ambiguous
1688  match.events.forEach(e=>{
1689    const ex = xOf(e.minute);
1690    const ey = midY - sampleValue(e.minute)*(h*0.46);
1691    const col = e.team==='home' ? match.home.color : match.away.color;
1692    chartCtx.beginPath();
1693    chartCtx.arc(ex, ey, Math.max(2.5,3*dpr), 0, Math.PI*2);
1694    chartCtx.fillStyle = col;
1695    chartCtx.strokeStyle = '#0a0d13';
1696    chartCtx.lineWidth = 1*dpr;
1697    chartCtx.fill(); chartCtx.stroke();
1698  });
1699
1700  // penalty kick markers — same idea as goal markers above, but diamond-shaped
1701  // and hollow for a miss, matching the ticker dot convention next to the
1702  // scorebug. Only drawn for kicks the playhead has actually reached — same
1703  // spoiler principle as everything else penalty-related.
1704  if(match.penalties && match.penalties.length){
1705    const penStartMinute = match.maxMinute;
1706    match.penalties.forEach((kick, i)=>{
1707      const kickMinute = penStartMinute + i + 1;
1708      if(kickMinute > currentMinute) return;
1709      const ex = xOf(kickMinute);
1710      const ey = midY - sampleValue(kickMinute)*(h*0.46);
1711      const col = kick.team==='home' ? match.home.color : match.away.color;
1712      const r = Math.max(3,3.6*dpr);
1713      chartCtx.save();
1714      chartCtx.translate(ex, ey);
1715      chartCtx.rotate(Math.PI/4);
1716      chartCtx.beginPath();
1717      chartCtx.rect(-r, -r, r*2, r*2);
1718      if(kick.outcome==='miss'){
1719        chartCtx.strokeStyle = col;
1720        chartCtx.lineWidth = Math.max(1.5, 1.8*dpr);
1721        chartCtx.stroke();
1722      }else{
1723        chartCtx.fillStyle = col;
1724        chartCtx.strokeStyle = '#0a0d13';
1725        chartCtx.lineWidth = 1*dpr;
1726        chartCtx.fill(); chartCtx.stroke();
1727      }
1728      chartCtx.restore();
1729    });
1730  }
1731
1732  // auto pop-up label for whichever goal the playhead has just reached — mirrors the
1733  // "goal card" look from the reference clip, anchored right on the chart
1734  const RECENT_WINDOW = 2.2;
1735  let recent = null;
1736  match.events.forEach(e=>{
1737    const dt = currentMinute - e.minute;
1738    if(dt>=0 && dt<=RECENT_WINDOW) recent = e;
1739  });
1740  if(recent){
1741    const ex = xOf(recent.minute);
1742    const ey = midY - sampleValue(recent.minute)*(h*0.46);
1743    const label = (recent.team==='home'?match.home.name:match.away.name)+' · '+(recent.label||Math.floor(recent.minute)+"'");
1744    chartCtx.font = (11*dpr)+'px JetBrains Mono, monospace';
1745    const textW = chartCtx.measureText(label).width;
1746    const boxW = textW + 14*dpr, boxH = 20*dpr;
1747    // flip the callout to whichever side keeps it fully on-canvas near the edges
1748    let bx = ex - boxW/2;
1749    bx = Math.max(padX*0.2, Math.min(w-boxW-padX*0.2, bx));
1750    const by = ey<h/2 ? Math.min(ey+10*dpr, h-boxH-2) : Math.max(ey-boxH-10*dpr, 2);
1751    chartCtx.fillStyle = 'rgba(11,14,21,0.92)';
1752    chartCtx.strokeStyle = '#ffb400';
1753    chartCtx.lineWidth = 1*dpr;
1754    chartCtx.beginPath();
1755    chartCtx.roundRect(bx, by, boxW, boxH, 5*dpr);
1756    chartCtx.fill(); chartCtx.stroke();
1757    chartCtx.fillStyle = '#ffb400';
1758    chartCtx.textBaseline = 'middle';
1759    chartCtx.fillText(label, bx+7*dpr, by+boxH/2);
1760  }
1761
1762  // playhead
1763  const playX = xOf(Math.min(currentMinute,maxM));
1764  chartCtx.strokeStyle = 'rgba(18,224,168,0.9)';
1765  chartCtx.lineWidth = Math.max(1.5, 2*dpr);
1766  chartCtx.beginPath(); chartCtx.moveTo(playX,0);
1766 chartCtx.lineTo(playX,h-8*dpr); chartCtx.stroke();
1767  // draggable handle dot at the base — this + the click/drag handlers below let the
1768  // chart itself act as the scrubber, so a separate slider isn't needed
1769  chartCtx.beginPath();
1770  chartCtx.arc(playX, h-8*dpr, 7*dpr, 0, Math.PI*2);
1771  chartCtx.fillStyle = '#12e0a8';
1772  chartCtx.fill();
1773  chartCtx.strokeStyle = '#0a0d13'; chartCtx.lineWidth = 1.5*dpr; chartCtx.stroke();
1774}
1775let chartXOfCache = {padX:0, plotW:1, maxM:1};
1776function chartMinuteFromEvent(evt){
1777  const rect = chartCanvas.getBoundingClientRect();
1778  const clientX = (evt.touches && evt.touches[0] ? evt.touches[0].clientX : evt.clientX);
1779  const xCss = clientX - rect.left;
1780  const padXCss = chartXOfCache.padX / (chartCachedWidth/rect.width || 1);
1781  const plotWCss = chartXOfCache.plotW / (chartCachedWidth/rect.width || 1);
1782  const frac = (xCss - padXCss) / plotWCss;
1783  return Math.max(0, Math.min(chartXOfCache.maxM, frac*chartXOfCache.maxM));
1784}
1785let chartDragging = false;
1786function resyncSeenPenalties(){
1787  seenPenalties.clear();
1788  if(!match.penalties || !match.penalties.length) return;
1789  const startMinute = match.maxMinute;
1790  match.penalties.forEach((kick,i)=>{
1791    if(startMinute+i+1 <= currentMinute) seenPenalties.add('pen_'+i);
1792  });
1793  playedShootoutIntro = currentMinute >= startMinute;
1794  // Same "no rollback" treatment as a match-winning goal — only sets the lock
1795  // on, never off, since resyncSeenEvents (which calls this) has already
1796  // reset it to false based on the goal condition just before this runs.
1797  const decidingKickMinute = startMinute + match.penalties.length;
1798  if(currentMinute >= decidingKickMinute - 0.6){
1799    clockSlowLocked = true;
1800    triggerPossessionSurge(0, false, true); // same fix as checkPenalties — without this, scrubbing past the decider locks the wave at halfway too
1801  }
1802}
1803function resyncSeenEvents(){
1804  seenEvents.clear();
1805  match.events.forEach(e=>{
1806    if(e.minute <= currentMinute) seenEvents.add(e.minute+"_"+e.team);
1807  });
1808  playedKickoffStinger = currentMinute > 0.05;
1809  playedExtraTimeStinger = currentMinute >= 90;
1810  // the match-winning goal's permanent "no rollback" lock must release if we've
1811  // scrubbed back to before it — otherwise the match stays frozen forever, even
1812  // after scrubbing away and pressing Play again
1813  clockSlowLocked = (match.goalCelebrationMinute!==undefined && currentMinute >= match.goalCelebrationMinute - 0.6);
1814  playedHighlights.clear();
1815  match.events.forEach(e=>{
1816    if(e.highlightAudio && e.minute <= currentMinute) playedHighlights.add(e.minute+"_"+e.team);
1817  });
1818  resyncSeenPenalties();
1819  rebuildTicker();
1820}
1821function chartSeekTo(evt, isDragStart){
1822  if(isDragStart) pause();
1823  currentMinute = chartMinuteFromEvent(evt);
1824  if(isDragStart) resyncSeenEvents();
1825  syncAll();
1826}
1827chartCanvas.addEventListener('pointerdown', (e)=>{ chartDragging = true; chartCanvas.setPointerCapture(e.pointerId); chartSeekTo(e, true); });
1828chartCanvas.addEventListener('pointermove', (e)=>{ if(chartDragging) chartSeekTo(e, false); });
1829chartCanvas.addEventListener('pointerup', ()=>{ chartDragging = false; resyncSeenEvents(); });
1830chartCanvas.addEventListener('pointercancel', ()=>{ chartDragging = false; });
1831chartCanvas.style.cursor = 'pointer';
1832chartCanvas.style.touchAction = 'none';
1833
1834function computePreGoalEase(minute, spd){
1835  let ease = 1;
1836  match.events.forEach(e=>{
1837    const key = e.minute+"_"+e.team;
1838    if(seenEvents.has(key) || e.minute<=minute) return; // already fired or already past
1839    const minutesAway = e.minute-minute;
1840    const realSecondsAway = minutesAway/(Math.max(0.25,spd)*3.2);
1841    if(realSecondsAway < 4){
1842      // eased down to ~30% speed over the last 4 real seconds — the previous 7s/8%
1843      // version made the app linger too long on quieter, lower-magnitude parts of
1844      // the timeline before the real build-up, reading as an unnaturally hushed lull
1845      ease = Math.min(ease, Math.max(0.3, realSecondsAway/4));
1846    }
1847  });
1848  return ease;
1849}
1850function checkEvents(prevMinute){
1851  match.events.forEach(e=>{
1852    const key = e.minute+"_"+e.team;
1853    if(e.minute>prevMinute && e.minute<=currentMinute && !seenEvents.has(key)){
1854      seenEvents.add(key);
1855      rebuildTicker(); // reveal this goal's dot now that it's actually happened, not before
1856      flashGoal(e);
1857      triggerPossessionSurge(e.team==='home' ? 1 : -1, e.skipCrescendo, e.flatTide);
1858      if(match.goalCelebrationMinute!==undefined && Math.abs(e.minute-match.goalCelebrationMinute)<0.6){
1859        clockSlowLocked = true; // the match-defining goal — no rollback at all from here on
1860      }
1861      playGoalWithCrescendo(e);
1862    }
1863  });
1864  if(match.hasExtraTime && prevMinute<90 && currentMinute>=90 && !playedExtraTimeStinger){
1865    playedExtraTimeStinger = true;
1866    playHalfTimeToExtraTimeSequence();
1867  }
1868}
1869// Penalty shootout: each kick sits at match.maxMinute + kick-index-plus-one on
1870// the (extended) clock — see computePenaltyTimelinePoints for why. Kept
1871// entirely separate from checkEvents/seenEvents since a shootout kick isn't a
1872// goal — it doesn't touch the actual score, ticker, or goal tally.
1873// Persistent penalty-count labels above the tick columns — unlike the
1874// ephemeral flash popup, these stay up permanently once the shootout starts,
1875// including after it's over. Spoiler-safe: only counts kicks the playhead
1876// has actually reached.
1877// Picks readable text colour (black or white) against an arbitrary
1878// background colour, using the standard perceived-brightness formula — this
1879// matters directly for team colours that are very dark or black, where
1880// white text is needed instead of the usual dark text used elsewhere in the
1881// app's own UI.
1882function getContrastTextColor(hex){
1883  if(!hex) return '#fff';
1884  const h = hex.replace('#','');
1885  const full = h.length===3 ? h.split('').map(c=>c+c).join('') : h;
1886  const r = parseInt(full.substr(0,2),16), g = parseInt(full.substr(2,2),16), b = parseInt(full.substr(4,2),16);
1887  if(isNaN(r)||isNaN(g)||isNaN(b)) return '#fff';
1888  const brightness = (r*299 + g*587 + b*114) / 1000;
1889  return brightness > 140 ? '#0a0d13' : '#fff';
1890}
1891function updatePenaltyCountLabels(){
1892  const homeEl = document.getElementById('penCountHome');
1893  const awayEl = document.getElementById('penCountAway');
1894  if(!homeEl || !awayEl) return;
1895  const wasShowing = homeEl.style.display === 'flex';
1896  if(!match.penalties || !match.penalties.length){
1897    homeEl.style.display = 'none';
1898    awayEl.style.display = 'none';
1899    if(wasShowing) syncScorebugHeight(); // pull the dots back in now the badges are gone
1900    return;
1901  }
1902  const startMinute = match.maxMinute;
1903  let homeMakes=0, awayMakes=0, anyRevealed=false;
1904  match.penalties.forEach((kick,i)=>{
1905    if(startMinute+i+1 <= currentMinute){
1906      anyRevealed = true;
1907      if(kick.outcome==='score'){ if(kick.team==='home') homeMakes++; else awayMakes++; }
1908    }
1909  });
1910  if(!anyRevealed){
1911    homeEl.style.display = 'none';
1912    awayEl.style.display = 'none';
1913    if(wasShowing) syncScorebugHeight();
1914    return;
1915  }
1916  homeEl.style.background = match.home.color || '#2451e0';
1917  homeEl.style.color = getContrastTextColor(match.home.color);
1918  awayEl.style.background = match.away.color || '#ffffff';
1919  awayEl.style.color = getContrastTextColor(match.away.color);
1920  homeEl.textContent = homeMakes;
1921  awayEl.textContent = awayMakes;
1922  const firstReveal = !wasShowing;
1923  homeEl.style.display = 'flex';
1924  awayEl.style.display = 'flex';
1925  if(firstReveal) syncScorebugHeight(); // push the dots further out now the badges have appeared
1926}
1927// One-off intro when play crosses from normal/extra time into the shootout —
1928// explains why a shootout is happening at all (level after extra time)
1929// rather than just cutting straight into the first kick with no context.
1930function checkShootoutIntro(prevMinute){
1931  if(!match.penalties || !match.penalties.length || playedShootoutIntro) return;
1932  if(prevMinute < match.maxMinute && currentMinute >= match.maxMinute){
1933    playedShootoutIntro = true;
1934    flashShootoutIntro();
1935    extendPauseUntil(performance.now() + 3500);
1936  }
1937}
1938function flashShootoutIntro(){
1939  const el = document.getElementById('goalFlash');
1940  document.getElementById('flashLbl').textContent = 'PENALTY SHOOTOUT';
1941  document.getElementById('flashSub').textContent = 'Level after extra time — going to penalties';
1942  document.getElementById('flashPhoto').style.display = 'none';
1943  el.style.left = '50%';
1944  el.style.top = '50%';
1945  el.style.transform = 'translate(-50%, -50%)';
1946  el.classList.add('show');
1947  clearTimeout(el._t);
1948  clearInterval(el._checkIv);
1949  el._checkIv = setInterval(()=>{
1950    if(performance.now() >= clockSlowUntil){
1951      clearInterval(el._checkIv);
1952      el.classList.remove('show');
1953      el.style.top = ''; el.style.transform = '';
1954    }
1955  }, 300);
1956}
1957function checkPenalties(prevMinute){
1958  if(!match.penalties || !match.penalties.length) return;
1959  const startMinute = match.maxMinute;
1960  match.penalties.forEach((kick, i)=>{
1961    const kickMinute = startMinute + i + 1;
1962    const key = 'pen_'+i;
1963    if(kickMinute>prevMinute && kickMinute<=currentMinute && !seenPenalties.has(key)){
1964      seenPenalties.add(key);
1965      rebuildTicker(); // reveal this kick's own dot too, same as a goal
1966      updatePenaltyCountLabels();
1967      flashPenalty(kick, i+1);
1968      playPenaltySound(kick);
1969      const isLastKick = i === match.penalties.length-1;
1970      // The decider gets a couple of seconds longer to let the celebration
1971      // breathe, rather than the same brisk pause as every other kick.
1972      extendPauseUntil(performance.now() + (isLastKick ? 6000 : 4000));
1973      // extendPauseUntil (just above, and again inside playPenaltySound for a
1974      // real clip) also extends surgeUntil, which makes updateCloth treat
1975      // this whole pause window as "surging" — without configuring an actual
1976      // surge, that falls back to the stale default surgeSign/flat, locking
1977      // the wave at whatever they last were (usually 0) for the entire
1978      // pause. flat:true here means every kick's pause window correctly
1979      // shows this kick's real computed value throughout, not just for a
1980      // brief instant right at the end once the pause window happens to
1981      // expire before the next kick's begins.
1982      triggerPossessionSurge(0, false, true);
1983      if(isLastKick){
1984        clockSlowLocked = true; // the deciding kick — the match-defining moment here, same treatment as a match-winning goal
1985      }
1986    }
1987  });
1988}
1989function flashPenalty(kick, kickNumber){
1990  const teamName = kick.team==='home' ? match.home.name : match.away.name;
1991  const el = document.getElementById('goalFlash');
1992  document.getElementById('flashLbl').textContent = kick.outcome==='score' ? 'PENALTY SCORED' : 'PENALTY MISSED';
1993  // Running shootout score folded into the popup itself, rather than a
1994  // separate persistent indicator — that indicator was overlapping the main
1995  // scoreline, and since it's the only thing conveying shootout state, it's
1996  // simpler and safer to fold it into this pop-up, which already exists.
1997  const startMinute = match.maxMinute;
1998  let homeMakes=0, awayMakes=0;
1999  (match.penalties||[]).forEach((k,i)=>{
2000    if(startMinute+i+1 <= currentMinute && k.outcome==='score'){
2001      if(k.team==='home') homeMakes++; else awayMakes++;
2002    }
2003  });
2004  document.getElementById('flashSub').textContent = teamName+' · '+kick.taker+' · kick '+kickNumber+' · PENS '+homeMakes+'-'+awayMakes;
2005  const photoEl = document.getElementById('flashPhoto');
2006  if(kick.photo){
2007    photoEl.classList.remove('landscape');
2008    photoEl.src = kick.photo;
2009    photoEl.style.display = 'block';
2010    photoEl.style.cursor = 'pointer';
2011    photoEl.onclick = ()=>openPhotoLightbox(kick.photo, teamName+' · '+kick.taker);
2012    photoEl.onerror = ()=>{ photoEl.style.display='none'; tlog('Penalty photo failed to load for '+kick.taker+': '+kick.photo); };
2013    photoEl.onload = ()=>{
2014      tlog('Penalty photo loaded OK for '+kick.taker+'.');
2015      if(photoEl.naturalWidth && photoEl.naturalHeight && (photoEl.naturalWidth/photoEl.naturalHeight) > 1.3){
2016        photoEl.classList.add('landscape');
2017      }
2018    };
2019  }else{
2020    tlog('No photo field set for penalty taker '+kick.taker+' — Wikipedia fetch likely found nothing for this name.');
2021    photoEl.style.display = 'none';
2022  }
2023  // Centred on the pitch rather than the top-anchored goal spot: by this
2024  // point normal play is over, so the shootout is the only thing happening,
2025  // and the pitch is the natural focal point rather than the (now largely
2026  // irrelevant) scorebug area goals anchor to.
2027  el.style.left = '50%';
2028  el.style.top = '50%';
2029  el.style.transform = 'translate(-50%, -50%)';
2030  el.classList.add('show');
2031  clearTimeout(el._t);
2032  clearInterval(el._checkIv);
2033  el._checkIv = setInterval(()=>{
2034    if(performance.now() >= clockSlowUntil){
2035      clearInterval(el._checkIv);
2036      el.classList.remove('show');
2037      el.style.top = ''; el.style.transform = ''; // restore goal-flash defaults for next time
2038    }
2039  }, 300);
2040}
2041// Falls back sensibly if a specific clip isn't attached: a scored penalty
2042// reuses the generic crowd roar (a decent default — a goal is a goal for
2043// crowd-noise purposes); a miss has no equivalent generic sound in the app,
2044// so it just pauses briefly in silence rather than playing something wrong.
2045function playPenaltySound(kick){
2046  const clipUrl = kick.audio || (kick.outcome==='score' ? match.penaltyScoredAudio : match.penaltyMissedAudio);
2047  if(!clipUrl){
2048    // Built-in default either way — a scored kick gets the same full-volume
2049    // roar as any other goal; a miss still gets a cheer (the other side's
2050    // relief/celebration that their opponent didn't score), just quieter,
2051    // rather than nothing at all.
2052    playRoar(kick.outcome==='score' ? 1 : 0.45);
2053    return;
2054  }
2055  if(muted) return;
2056  try{
2057    const clip = trackAudio(getCachedAudio(clipUrl));
2058    clip.addEventListener('loadedmetadata', ()=>{
2059      const dur = isFinite(clip.duration) && clip.duration>0 ? clip.duration : 3;
2060      // Capped well short of the clip's own length if it's unusually long —
2061      // the clip still plays out in full in the background, but the match
2062      // itself won't stay visually frozen for an unreasonable stretch (this
2063      // is the same cap used for goal commentary clips, for consistency).
2064      extendPauseUntil(performance.now() + Math.min(dur+0.8, MAX_CLIP_PAUSE_S)*1000);
2065    });
2066    clip.addEventListener('error', ()=>{ tlog('Penalty clip failed to play — continuing silently.'); });
2067    clip.play().catch(()=>{});
2068  }catch(err){}
2069}
2070// Spoiler-safe running shootout scoreline (e.g. "PENS 3-2") — only counts
2071// kicks already reached by the clock, same principle as the goal ticker dots.
2072function playHalfTimeToExtraTimeSequence(){
2073  if(muted) return;
2074  extendPauseUntil(performance.now() + 2000); // conservative initial hold, extended below once real durations are known
2075  function playClip2(){
2076    if(!match.extraTimeAudio) return;
2077    try{
2078      const el2 = trackAudio(getCachedAudio(match.extraTimeAudio));
2079      el2.addEventListener('loadedmetadata', ()=>{
2080        const dur2 = isFinite(el2.duration) && el2.duration>0 ? el2.duration : 6;
2081        extendPauseUntil(performance.now() + (dur2+0.6)*1000);
2082      });
2083      el2.play().catch(()=>{});
2084    }catch(err){}
2085  }
2086  if(!match.endOfNormalTimeAudio){ playClip2(); return; }
2087  try{
2088    const el1 = trackAudio(getCachedAudio(match.endOfNormalTimeAudio));
2089    el1.addEventListener('loadedmetadata', ()=>{
2090      const dur1 = isFinite(el1.duration) && el1.duration>0 ? el1.duration : 8;
2091      extendPauseUntil(performance.now() + (dur1+1.5)*1000); // covers clip1 plus the gap before clip2
2092    });
2093    el1.addEventListener('ended', ()=>{ setTimeout(playClip2, 1200); }); // a breather between the two stingers
2094    el1.play().catch(()=>{ playClip2(); });
2095  }catch(err){ playClip2(); }
2096}
2097function playGoalWithCrescendo(e){
2098  if(muted || e.skipCrescendo){ playGoalSound(e); return; }
2098 // some clips already have natural crowd roar baked in
2099  // the same celebration clip works as the crescendo lead-in for goals by either team
2100  const swellClip = match.goalCelebrationAudio || null;
2101  if(!swellClip){ playGoalSound(e); return; } // nothing to swell with — just do the plain commentary/roar
2102  try{
2103    const swell = trackAudio(getCachedAudio(swellClip));
2104    swell._ivs = [];
2105    swell.volume = 0.15;
2106    // keep the match paused/slowed at least through the lead-in; playGoalSound's own
2107    // metadata handler extends this further once the commentary's real duration is known
2108    const leadInEnd = performance.now() + 2300;
2109    extendPauseUntil(leadInEnd);
2110    if(ambientGain && actx) ambientGain.gain.setTargetAtTime(0.42, actx.currentTime, 0.35);
2111    swell.play().catch(()=>{});
2112    // the crescendo: ramp the swell's own volume up fast, like a sudden roar —
2113    // completes well before the fade-out starts below, so it actually reaches peak
2114    const rampSteps = 9, rampMs = 450;
2115    let ri = 0;
2116    const rampIv = setInterval(()=>{
2117      ri++;
2118      swell.volume = Math.min(1, 0.15 + (ri/rampSteps)*0.85);
2119      if(ri>=rampSteps) clearInterval(rampIv);
2120    }, rampMs/rampSteps);
2121    swell._ivs.push(rampIv);
2122    // hold at peak for a good while (450ms ramp + ~1.7s hold), THEN start the commentary
2123    // while fading the roar out — the previous ~350ms hold was evidently too brief to
2124    // register as a real roar rather than a blip
2125    const LEAD_IN_MS = 2200;
2126    setTimeout(()=>{
2127      const fadeSteps = 9, fadeMs = 600;
2128      let fi = 0;
2129      const fadeIv = setInterval(()=>{
2130        fi++;
2131        swell.volume = Math.max(0, 1-(fi/fadeSteps));
2132        if(fi>=fadeSteps){ clearInterval(fadeIv); swell.pause(); }
2133      }, fadeMs/fadeSteps);
2134      swell._ivs.push(fadeIv);
2135      playGoalSound(e);
2136    }, LEAD_IN_MS);
2137  }catch(err){ playGoalSound(e); }
2138}
2139function playGoalSound(e){
2140  if(!e.audio){ playRoar(); return; }
2141  if(muted) return;
2142  try{
2143    const clip = trackAudio(getCachedAudio(e.audio));
2144    clip.addEventListener('loadedmetadata', ()=>{
2145      // slow the match down for the clip's full length (plus a little breathing room),
2146      // rather than the fixed ~3s window used for the generic goal roar
2147      const dur = isFinite(clip.duration) && clip.duration>0 ? clip.duration : 5;
2148      // Capped the same way as penalty clips — plays out in full regardless,
2149      // but the match won't stay visually frozen for an unreasonable stretch
2150      // if an unusually long clip gets attached.
2151      const commentaryEnd = performance.now() + Math.min(dur+1.0, MAX_CLIP_PAUSE_S)*1000;
2152      extendPauseUntil(commentaryEnd);
2153      // duck the ambient crowd noise so the commentary is actually audible —
2154      // a slower time constant here so the dip itself feels like a fade, not a cut
2155      if(ambientGain && actx) ambientGain.gain.setTargetAtTime(0.18, actx.currentTime, 1.1);
2156    });
2157    clip.addEventListener('ended', ()=>{
2158      const isCelebrationGoal = match.goalCelebrationAudio && match.goalCelebrationMinute!==undefined &&
2159        Math.abs(e.minute - match.goalCelebrationMinute) < 0.6;
2160      if(isCelebrationGoal){
2161        playGoalCelebrationTail();
2162      }else{
2163        // restore smoothly too — ramp back up over a couple of seconds rather than
2164        // snapping straight back to the normal level the instant the clip ends
2165        if(ambientGain && actx) ambientGain.gain.setTargetAtTime(
2166          (0.58 + Math.min(1,Math.abs(sampleValue(currentMinute)))*0.22) * crowdEnvelope(currentMinute),
2167          actx.currentTime, 1.8
2168        );
2169      }
2170    });
2171    clip.addEventListener('error', ()=>{ tlog('Commentary clip failed to play for '+(e.label||e.minute+"'")+' — falling back to roar.'); playRoar(); });
2172    clip.play().catch(()=>{ playRoar(); });
2173  }catch(err){ playRoar(); }
2174}
2175function projectGoalEndToScreen(team){
2176  try{
2177    // the goal being scored INTO is the opponent's end — same convention the
2178    // possession line itself uses (it reaches this same point on a goal)
2179    const localZ = (team==='home') ? -PITCH_LEN/2 : PITCH_LEN/2;
2180    const vec = new THREE.Vector3(0, 3, localZ);
2181    pitchGroup.localToWorld(vec);
2182    vec.project(camera);
2183    if(!isFinite(vec.x) || !isFinite(vec.y)) return null;
2184    const x = (vec.x*0.5+0.5) * window.innerWidth;
2185    const y = (1-(vec.y*0.5+0.5)) * window.innerHeight;
2186    return {x, y};
2187  }catch(err){ return null; }
2188}
2189function flashGoal(e){
2190  const teamName = e.team==='home' ? match.home.name : match.away.name;
2191  const el = document.getElementById('goalFlash');
2192  document.getElementById('flashLbl').textContent = e.penalty ? "GOAL (PEN)" : "GOAL";
2193  document.getElementById('flashSub').textContent = teamName+" · "+(e.label||Math.floor(e.minute)+"'");
2194  const photoEl = document.getElementById('flashPhoto');
2195  if(e.photo){
2196    photoEl.classList.remove('landscape'); // reset before the new image's real dimensions are known
2197    photoEl.src = e.photo;
2198    photoEl.style.display = 'block';
2199    photoEl.style.cursor = 'pointer';
2200    photoEl.onclick = ()=>openPhotoLightbox(e.photo, teamName+' · '+(e.label||''));
2201    photoEl.onerror = ()=>{ photoEl.style.display='none'; }; // silently hide if the URL is bad/blocked
2202    photoEl.onload = ()=>{
2203      // a wide action shot (e.g. the goal itself) needs a wider box and a
2204      // centered crop;
2204 a portrait headshot needs the narrower, top-biased one
2205      if(photoEl.naturalWidth && photoEl.naturalHeight && (photoEl.naturalWidth/photoEl.naturalHeight) > 1.3){
2206        photoEl.classList.add('landscape');
2207      }
2208    };
2209  }else{
2210    photoEl.style.display = 'none';
2211  }
2212  const pos = projectGoalEndToScreen(e.team);
2213  if(pos){
2214    const clampedX = Math.max(110, Math.min(window.innerWidth-110, pos.x));
2215    const clampedY = Math.max(70, Math.min(window.innerHeight-170, pos.y-46)); // "above" that point on the pitch
2216    el.style.left = clampedX+'px';
2217    el.style.top = clampedY+'px';
2218  }else{
2219    el.style.left = '50%';
2220    el.style.top = '148px';
2221  }
2222  el.classList.add('show');
2223  clearTimeout(el._t);
2224  clearInterval(el._checkIv);
2225  const flashStartTime = performance.now();
2226  el._checkIv = setInterval(()=>{
2227    const stillActive = clockSlowLocked ? (performance.now()-flashStartTime < 15000) : performance.now() < clockSlowUntil;
2228    if(!stillActive){
2229      clearInterval(el._checkIv);
2230      el.classList.remove('show');
2231    }
2232  }, 300);
2233}
2234
2235function rebuildTicker(){
2236  ['tickHome','tickAway'].forEach(id=>document.getElementById(id).innerHTML='');
2237  match.events.slice().sort((a,b)=>a.minute-b.minute).forEach(e=>{
2238    if(e.minute > currentMinute) return; // don't reveal a goal (or the final tally) before it's actually happened — spoilers
2239    const col = document.getElementById(e.team==='home'?'tickHome':'tickAway');
2240    const dot = document.createElement('div');
2241    dot.className='tick-dot reached'; dot.dataset.minute=e.minute;
2242    dot.style.background = e.team==='home'?match.home.color:match.away.color;
2243    dot.title = e.label||Math.floor(e.minute)+"'";
2244    dot.addEventListener('click', ()=>{ pause(); currentMinute=e.minute; syncAll(); });
2245    col.appendChild(dot);
2246  });
2247  // Penalty kicks get their own dots too — same navigation, same spoiler-safe
2248  // reveal, but diamond-shaped (and hollow for a miss) so they read as
2249  // distinctly different moments from run-of-play goals at a glance.
2250  if(match.penalties && match.penalties.length){
2251    const startMinute = match.maxMinute;
2252    match.penalties.forEach((kick, i)=>{
2253      const kickMinute = startMinute + i + 1;
2254      if(kickMinute > currentMinute) return;
2255      const col = document.getElementById(kick.team==='home'?'tickHome':'tickAway');
2256      const dot = document.createElement('div');
2257      dot.className = 'tick-dot reached tick-dot-penalty' + (kick.outcome==='miss' ? ' miss' : '');
2258      dot.dataset.minute = kickMinute;
2259      const teamColor = kick.team==='home'?match.home.color:match.away.color;
2260      if(kick.outcome==='miss'){ dot.style.borderColor = teamColor; }
2261      else{ dot.style.background = teamColor; }
2262      dot.title = kick.taker+' · kick '+(i+1)+' · '+(kick.outcome==='score'?'scored':'missed');
2263      dot.addEventListener('click', ()=>{ pause(); currentMinute=kickMinute; syncAll(); });
2264      col.appendChild(dot);
2265    });
2266  }
2267}
2268function updateTickerReached(){
2269  document.querySelectorAll('.tick-dot').forEach(d=>{
2270    d.classList.toggle('reached', parseFloat(d.dataset.minute)<=currentMinute);
2271  });
2272}
2273
2274function syncAll(){
2275  updateCloth(currentMinute, clockT, true);
2276  refreshUI();
2277  updateTickerReached();
2278  setCrowdLevel(sampleValue(currentMinute));
2279  updatePenaltyCountLabels();
2280}
2281
2282let frameCount = 0;
2283let firstFrameLogged = false;
2284function animate(ts){
2285  requestAnimationFrame(animate);
2286  try{
2287    if(lastTs===null) lastTs=ts;
2288    const dt = Math.min(0.25,(ts-lastTs)/1000); lastTs=ts;
2289    clockT += dt;
2290    if(activeExtraAudio.size > 8) stopAllExtraAudio(); // safety net against any accumulation path
2291    maybeTriggerAmbientVariety(dt);
2292    updateAmbientWindows();
2293    if(playing){
2294      const prev = currentMinute;
2295      const goalSlow = (clockSlowLocked || performance.now() < clockSlowUntil) ? 0 : 1;
2296      const preGoalEase = computePreGoalEase(currentMinute, speed);
2297      currentMinute = Math.min(getEffectiveMaxMinute(match), currentMinute + dt*speed*3.2*goalSlow*preGoalEase);
2298      checkEvents(prev);
2299      checkShootoutIntro(prev);
2300      checkPenalties(prev);
2301      checkHighlightCues(currentMinute, speed);
2302      // Wait for any active pause/celebration window (extendPauseUntil, set by
2303      // a goal or penalty kick) to actually finish before auto-stopping —
2304      // otherwise a moment that lands exactly on the effective max minute
2305      // (which a deciding penalty kick always does, and a last-second regular
2306      // goal occasionally does) gets its own audio killed instantly: pause()
2307      // calls stopAllExtraAudio(), which stops every tracked clip, including
2308      // the one that had just started playing a moment earlier in the same
2309      // frame. This is exactly why Chloe Kelly's winning kick played nothing.
2310      if(currentMinute>=getEffectiveMaxMinute(match) && performance.now()>=clockSlowUntil) pause();
2311    }
2312    frameCount++;
2313    updateCloth(currentMinute, clockT, frameCount % 3 === 0);
2314    refreshUI();
2315    updateTickerReached();
2316    setCrowdLevel(sampleValue(currentMinute));
2317    renderer.render(scene, camera);
2318    if(!firstFrameLogged){ firstFrameLogged=true; tlog('First frame rendered successfully.'); }
2319  }catch(err){
2320    console.error('render loop error:', err);
2321    tlog('RENDER LOOP ERROR: '+err.message);
2322  }
2323}
2324requestAnimationFrame(animate);
2325tlog('Render loop scheduled.');
2326
2327/* ============================================================
2328   UI WIRING
2329   ============================================================ */
2330const playBtn = document.getElementById('playBtn');
2331tlog('Wiring up Play button listener.');
2332let activeAmbientWindow = null;
2333let activeAmbientWindowPlayer = null;
2334let activeAmbientWindowPlayer2 = null; // optional second clip, mixed in alongside the first (w.audio2)
2335const AMBIENT_WINDOW_BASE_VOL = 0.35; // volume the moment the attack finishes
2336const AMBIENT_WINDOW_PEAK_VOL = 0.85; // volume reached right at the window's end minute — the
2337                                      // "build toward the goal" swell, rather than a flat level
2338const AMBIENT_WINDOW2_PEAK_VOL = 0.6; // the blended second clip sits a bit lower by default so
2339                                      // it reads as texture under the first, not a competing layer
2340/* Attack/release are real-time envelopes, not tied to match-minutes: several
2341   windows only span 5-6 match-minutes, which at normal playback speed is
2342   under 2 real seconds — the previous ~1.4s setInterval fade-in often hadn't
2343   finished (and so never got audible) before the window was already over and
2344   fading back out again, making it sound like nothing played at all. 350ms
2345   is fast enough to be clearly audible even in the shortest windows, while
2346   still avoiding a click. */
2347const AMBIENT_ENVELOPE_MS = 350;
2348/* Cache one Audio element per window object rather than constructing a new
2349   one (which means re-decoding its whole base64 payload) every time a window
2350   is re-entered. Scrubbing back and forth across window boundaries was
2351   creating a fresh multi-hundred-KB Audio element on every crossing, which is
2352   exactly the kind of main-thread work that shows up as "play/pause become
2353   unresponsive" during scrubbing. Keyed by window object identity + which
2354   audio slot, since match.ambientWindows is rebuilt fresh on each data load. */
2355const ambientClipCache = new Map();
2356function getOrCreateAmbientClip(w, slot){
2357  const src = slot===2 ? w.audio2 : w.audio;
2358  if(!src) return null;
2359  const key = w; // window objects are stable for the lifetime of a loaded match
2360  let bySlot = ambientClipCache.get(key);
2361  if(!bySlot){ bySlot = {}; ambientClipCache.set(key, bySlot); }
2362  if(!bySlot[slot]){
2363    const el = trackAudio(new Audio(src));
2364    el.loop = true;
2365    el.volume = 0;
2366    bySlot[slot] = el;
2367  }
2368  return bySlot[slot];
2369}
2370/* How far through its window the match-clock currently is (0 at w.start, 1 at
2371   w.end), used to swell the volume up toward the goal instead of holding flat. */
2372function ambientWindowProgress(w){
2373  if(!w || w.end<=w.start) return 1;
2374  const raw = (currentMinute - w.start) / (w.end - w.start);
2375  // Reach full peak at 70% of the way through the window and hold there for
2376  // the rest. The previous version only reached peak exactly at w.end, so
2377  // it was still climbing right up to the goal itself — audible as "quiet"
2378  // because it never got to actually sustain full loudness before the climax.
2379  return Math.max(0, Math.min(1, raw / 0.7));
2380}
2381function updateAmbientWindows(){
2382  if(!actx || muted || !match.ambientWindows || !match.ambientWindows.length) return;
2383  const w = match.ambientWindows.find(w=>currentMinute>=w.start && currentMinute<=w.end) || null;
2384  const now0 = performance.now();
2385  if(w!==activeAmbientWindow){
2386    // start releasing whatever was playing for the previous window — release
2387    // begins from whatever volume it actually was (not a fixed assumption),
2388    // and is time-based so it always completes in AMBIENT_ENVELOPE_MS
2389    // regardless of how often windows change while scrubbing
2390    [activeAmbientWindowPlayer, activeAmbientWindowPlayer2].forEach(old=>{
2391      if(!old) return;
2392      old._releaseStartedAt = now0;
2393      old._releaseFromVol = old.volume;
2394      old._releasing = true;
2395      old._attacking = false;
2396    });
2397    activeAmbientWindow = w;
2398    activeAmbientWindowPlayer = w ? getOrCreateAmbientClip(w, 1) : null;
2399    activeAmbientWindowPlayer2 = w ? getOrCreateAmbientClip(w, 2) : null;
2400    // Only actually (re)start playback if the match is currently playing.
2401    // Without this, pausing (which calls stopAllExtraAudio and so wipes
2402    // activeAmbientWindow to null) or the safety net below tripping mid-window
2403    // would both look identical to "we just entered a new window" on the very
2404    // next frame — since currentMinute hasn't moved, w is unchanged — and this
2405    // function would immediately restart the clip from scratch. That produced
2406    // exactly the symptom reported: audio that won't stay stopped, replaying
2407    // in short bursts, because it was being restarted every single frame.
2408    if(playing){
2409      [activeAmbientWindowPlayer, activeAmbientWindowPlayer2].forEach(el=>{
2410        if(!el) return;
2411        el._releasing = false;
2412        el._attacking = true;
2413        el._attackStartedAt = now0;
2414        el._attackFromVol = el.volume; // may already be mid-release if re-entered quickly
2415        activeExtraAudio.add(el); // re-track: loop=true media never fires 'ended', so a
2416                                  // previous release cycle explicitly untracks it (see below)
2417        if(el.paused){ try{ el.currentTime = 0; }catch(e){} el.play().catch(()=>{}); }
2418      });
2419    }
2420  }
2421  if(!playing) return; // don't run the envelope (which would call .play()) while paused/stopped
2422  // continuous per-frame envelope for whatever's currently assigned, whether
2423  // attacking, releasing, or holding — replaces the old setInterval fades,
2424  // which could be left stale/still-running if a window changed again mid-fade
2425  function applyEnvelope(el, peak){
2426    if(!el) return;
2427    if(el._releasing){
2428      const t = Math.min(1, (now0-el._releaseStartedAt)/AMBIENT_ENVELOPE_MS);
2429      el.volume = el._releaseFromVol*(1-t);
2430      if(t>=1){
2431        el._releasing = false;
2432        try{ el.pause(); }catch(e){}
2433        // loop=true elements never fire 'ended', so this is the only place
2434        // they get removed from activeExtraAudio once actually idle — without
2435        // this, every ambient window ever played stays "active" forever,
2436        // eventually tripping the >8 safety net and nuking whatever else
2437        // (e.g. a goal's own commentary) happened to be playing at that moment
2438        activeExtraAudio.delete(el);
2439      }
2440      return;
2441    }
2442    const swell = AMBIENT_WINDOW_BASE_VOL + (peak-AMBIENT_WINDOW_BASE_VOL)*ambientWindowProgress(w);
2443    if(el._attacking){
2444      const t = Math.min(1, (now0-el._attackStartedAt)/AMBIENT_ENVELOPE_MS);
2445      el.volume = el._attackFromVol + (swell-el._attackFromVol)*t;
2446      if(t>=1) el._attacking = false;
2447    }else{
2448      el.volume = swell;
2449    }
2450  }
2451  applyEnvelope(activeAmbientWindowPlayer, (w && w.peakVolume) || AMBIENT_WINDOW_PEAK_VOL);
2452  applyEnvelope(activeAmbientWindowPlayer2, (w && w.peakVolume2) || AMBIENT_WINDOW2_PEAK_VOL);
2453}
2454let pendingAmbientWindows = [];
2455let pendingMaxMinuteOverride = undefined;
2456let pendingPossessionOverride = undefined;
2457let playedKickoffStinger = false;
2458let playedExtraTimeStinger = false;
2459// Every "extra" Audio element (goal roar/commentary/crescendo, ambient windows,
2460// ambient variety, stingers) plays outside the main Web Audio graph, so Pause
2461// (which only ducks crowdGain) had no effect on them, and interrupted fade
2462// intervals could run forever. This registry lets us stop everything cleanly.
2463const activeExtraAudio = new Set();
2464function trackAudio(el){
2465  activeExtraAudio.add(el);
2466  el.addEventListener('ended', ()=>{ clearAudioIntervals(el); activeExtraAudio.delete(el); }, {once:true});
2467  return el;
2468}
2469function clearAudioIntervals(el){
2470  if(el._ivs) el._ivs.forEach(id=>clearInterval(id));
2471  el._ivs = [];
2472}
2473function stopAllExtraAudio(){
2474  activeExtraAudio.forEach(el=>{
2475    try{ clearAudioIntervals(el); el.pause(); }catch(err){}
2476  });
2477  activeExtraAudio.clear();
2478  activeAmbientWindow = null;
2479  activeAmbientWindowPlayer = null;
2480  activeAmbientWindowPlayer2 = null;
2481  ambientVarietyPlayer = null;
2482}
2483function playOneShotStinger(dataUri, vol){
2484  if(!dataUri || muted) return;
2485  try{
2486    const el = trackAudio(getCachedAudio(dataUri));
2487    el.volume = vol!==undefined ? vol : 0.9;
2488    el.addEventListener('loadedmetadata', ()=>{
2489      const dur = isFinite(el.duration) && el.duration>0 ? el.duration : 6;
2490      extendPauseUntil(performance.now() + (dur+0.3)*1000);
2491    });
2492    el.play().catch(()=>{});
2493  }catch(err){}
2494}
2495// One throwaway play()+pause() on a plain Audio element, done synchronously
2496// inside the tap that starts playback, "primes" iOS Safari's autoplay
2497// permission for the whole page — every custom clip created later (from
2498// async code, not a direct gesture) can then play normally. Without this,
2499// every new Audio() created afterward gets silently blocked on iOS.
2500//
2501// v115 note: this alone was NOT enough — iOS Safari's autoplay grant from
2502// playing one decoy element does not reliably extend to unrelated <audio>
2503// elements created later from async code (the animation loop, timers,
2504// etc). The grant is much more reliably honoured when it's the SAME
2505// element being replayed. So on top of the decoy, primeAllMatchAudio()
2506// below walks every real clip in the loaded match, creates its (cached,
2507// reused-for-life) Audio element right now, and plays+pauses each one
2508// synchronously inside this same tap gesture. Every later playback then
2509// just replays one of these already-gesture-unlocked elements instead of
2510// constructing a brand new one.
2511function primeAllMatchAudio(){
2512  const urls = new Set();
2513  if(match.goalCelebrationAudio) urls.add(match.goalCelebrationAudio);
2514  if(match.kickoffAudio) urls.add(match.kickoffAudio);
2515  if(match.extraTimeAudio) urls.add(match.extraTimeAudio);
2516  if(match.endOfNormalTimeAudio) urls.add(match.endOfNormalTimeAudio);
2517  if(match.penaltyScoredAudio) urls.add(match.penaltyScoredAudio);
2518  if(match.penaltyMissedAudio) urls.add(match.penaltyMissedAudio);
2519  (match.homeVarietyAudio||[]).forEach(u=>{ if(u) urls.add(u); });
2520  (match.awayVarietyAudio||[]).forEach(u=>{ if(u) urls.add(u); });
2521  (match.events||[]).forEach(e=>{
2522    if(e.audio) urls.add(e.audio);
2523    if(e.highlightAudio) urls.add(e.highlightAudio);
2524  });
2525  (match.penalties||[]).forEach(kick=>{ if(kick.audio) urls.add(kick.audio); });
2526  (match.ambientWindows||[]).forEach(w=>{
2527    try{
2528      if(w.audio){ const el = getOrCreateAmbientClip(w,1); const p = el.play(); if(p&&p.catch) p.catch(()=>{}); el.pause(); el.currentTime=0; }
2529      if(w.audio2){ const el2 = getOrCreateAmbientClip(w,2); const p2 = el2.play(); if(p2&&p2.catch) p2.catch(()=>{}); el2.pause(); el2.currentTime=0; }
2530    }catch(err){}
2531  });
2532  let primed = 0;
2533  urls.forEach(u=>{
2534    try{
2535      const el = getCachedAudio(u);
2536      const p = el.play();
2537      if(p && p.catch) p.catch(()=>{});
2538      el.pause();
2539      el.currentTime = 0;
2540      primed++;
2541    }catch(err){}
2542  });
2543  tlog('Primed '+primed+' match audio clip(s) inside the tap gesture.');
2544}
2545function unlockAudioElements(){
2546  if(audioElementsUnlocked) return;
2547  audioElementsUnlocked = true;
2548  try{
2549    // shortest valid silent WAV (44-byte header, zero samples)
2550    const silence = new Audio('data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQAAAAA=');
2551    const p = silence.play();
2552    if(p && p.catch) p.catch(()=>{});
2553    silence.pause();
2554  }catch(err){ tlog('Audio element unlock failed (continuing): '+err.message); }
2555  try{ primeAllMatchAudio(); }catch(err){ tlog('primeAllMatchAudio failed (continuing): '+err.message); }
2556}
2557function play(){
2558  unlockAudioElements();
2559  tlog('play() called. Was playing='+playing);
2560  if(currentMinute >= getEffectiveMaxMinute(match) - 0.001){
2561    currentMinute = 0;
2562    seenEvents.clear();
2563    seenPenalties.clear();
2564    displayedValue = 0;
2565    playedKickoffStinger = false;
2566    playedExtraTimeStinger = false;
2567    playedShootoutIntro = false;
2568    playedHighlights.clear();
2569    tlog('Reached full-time — restarting from kickoff.');
2570  }
2571  try{
2572    initAudio();
2573    if(actx && actx.state==='suspended'){
2574      tlog('AudioContext state suspended before resume() — attempting resume.');
2575      actx.resume().then(()=>tlog('AudioContext.resume() resolved. state='+actx.state))
2576                    .catch(err=>tlog('AudioContext.resume() rejected: '+err.message));
2577    }
2578    tlog('AudioContext state right after resume() call: '+(actx?actx.state:'no actx'));
2579    if(crowdGain && !muted) crowdGain.gain.setTargetAtTime(0.5, actx.currentTime, 0.3);
2580    setCrowdLevel(sampleValue(currentMinute));
2581  }
2582  catch(err){ tlog('Audio init failed (continuing without sound): '+err.message); }
2583  if(currentMinute<=0.05 && !playedKickoffStinger && match.kickoffAudio){
2584    playedKickoffStinger = true;
2585    extendPauseUntil(performance.now() + 2000); // conservative initial hold; extended once real duration is known
2586    playOneShotStinger(match.kickoffAudio);
2587  }
2588  playing=true; playBtn.textContent='⏸';
2589}
2590function pause(){
2591  playing=false; playBtn.textContent='▶';
2592  try{ if(crowdGain && actx) crowdGain.gain.setTargetAtTime(0.0001, actx.currentTime, 0.25); }catch(err){}
2593  stopAllExtraAudio();
2594}
2595playBtn.addEventListener('pointerdown', function(){ tlog('pointerdown on Play button.'); });
2596playBtn.addEventListener('click', (e)=>{ e.preventDefault(); tlog('click event on Play button fired.'); playing ? pause() : play(); });
2597tlog('Play button listener attached.');
2598
2599document.querySelectorAll('[data-speed]').forEach(btn=>{
2600  btn.addEventListener('click', ()=>{
2601    document.querySelectorAll('[data-speed]').forEach(b=>b.classList.remove('active'));
2602    btn.classList.add('active');
2603    speed = parseFloat(btn.dataset.speed);
2604  });
2605});
2606
2607const muteBtn = document.getElementById('muteBtn');
2608muteBtn.addEventListener('click', ()=>{
2609  muted = !muted;
2610  muteBtn.textContent = muted ? '🔇' : '🔊';
2611  if(muted && crowdGain) crowdGain.gain.setTargetAtTime(0, actx.currentTime, 0.1);
2612});
2613
2614/* ---- CSV <-> match data helpers ---- */
2615function splitCSVLine(line){
2616  const result=[]; let cur=''; let inQuotes=false;
2617  for(let i=0;i<line.length;i++){
2618    const ch=line[i];
2619    if(ch==='"'){ if(inQuotes && line[i+1]==='"'){ cur+='"'; i++; } else inQuotes=!inQuotes; }
2620    else if(ch===',' && !inQuotes){ result.push(cur); cur=''; }
2621    else cur+=ch;
2622  }
2623  result.push(cur);
2624  return result.map(s=>s.trim());
2625}
2626function parseCSVRows(text){
2627  const lines = text.split(/\r?\n/).map(l=>l.trim()).filter(l=>l.length);
2628  if(lines.length<2) return [];
2629  return lines.slice(1).map(splitCSVLine);
2630}
2631function timelineToCSV(timeline){
2632  let out='minute,value\n';
2633  timeline.forEach(p=>{ out += p[0]+','+p[1]+'\n'; });
2634  return out;
2635}
2636function eventsToCSV(events){
2637  let out='minute,team,label,photo,audio,skip_crescendo,flat_tide\n';
2638  events.forEach(e=>{
2639    let label = e.label!==undefined ? e.label : '';
2640    if(label.indexOf(',')>-1 || label.indexOf('"')>-1) label = '"'+label.replace(/"/g,'""')+'"';
2641    let photo = e.photo!==undefined ? e.photo : '';
2642    if(photo.indexOf(',')>-1 || photo.indexOf('"')>-1) photo = '"'+photo.replace(/"/g,'""')+'"';
2643    // data: URIs contain a comma as part of their own syntax (data:<type>;base64,<payload>),
2644    // so this needs quoting just like any other field with a comma in it
2645    let audio = e.audio!==undefined ? e.audio : '';
2646    if(audio.indexOf(',')>-1 || audio.indexOf('"')>-1) audio = '"'+audio.replace(/"/g,'""')+'"';
2647    const skip = e.skipCrescendo ? 'true' : '';
2648    const flat = e.flatTide ? 'true' : '';
2649    out += e.minute+','+e.team+','+label+','+photo+','+audio+','+skip+','+flat+'\n';
2650  });
2651  return out;
2652}
2653function csvToTimeline(text){
2654  return parseCSVRows(text)
2655    .map(r=>[parseFloat(r[0]), parseFloat(r[1])])
2656    .filter(p=>!isNaN(p[0]) && !isNaN(p[1]));
2657}
2658function csvToEvents(text){
2659  return parseCSVRows(text)
2660    .map(r=>({minute:parseFloat(r[0]), team:(r[1]||'').trim(), label:r[2]||'', photo:r[3]||'', audio:r[4]||'', skipCrescendo:/^(true|yes|1)$/i.test((r[5]||'').trim()), flatTide:/^(true|yes|1)$/i.test((r[6]||'').trim())}))
2661    .filter(e=>!isNaN(e.minute) && (e.team==='home' || e.team==='away'));
2662}
2663// Penalty shootout kicks, in the order taken. Not part of the events/goals
2664// array — a shootout doesn't change the actual match score, it decides who
2665// advances, so keeping this as its own list avoids corrupting the goal
2666// tally, ticker dots, or anything else that reads match.events.
2667function penaltiesToCSV(penalties){
2668  let out = 'team,taker,outcome,photo,audio\n';
2669  (penalties||[]).forEach(p=>{
2670    out += p.team+','+csvField(p.taker)+','+p.outcome+','+csvField(p.photo)+','+csvField(p.audio)+'\n';
2671  });
2672  return out;
2673}
2674function csvToPenalties(text){
2675  return parseCSVRows(text)
2676    .map(r=>({team:(r[0]||'').trim(), taker:r[1]||'', outcome:(r[2]||'').trim().toLowerCase(), photo:r[3]||'', audio:r[4]||''}))
2677    .filter(p=>(p.team==='home'||p.team==='away') && (p.outcome==='score'||p.outcome==='miss') && p.taker);
2678}
2679async function fetchWikipediaThumbnail(name){
2680  // first try an exact title match (fast)
2681  try{
2682    const url = 'https://en.wikipedia.org/w/api.php?action=query&titles='+encodeURIComponent(name)+
2683      '&prop=pageimages&format=json&pithumbsize=300&redirects=1&origin=*';
2684    const resp = await fetch(url);
2685    if(resp.ok){
2686      const data = await resp.json();
2687      const pages = data.query && data.query.pages;
2688      if(pages){
2689        const page = Object.values(pages)[0];
2690        if(page && page.pageid && page.thumbnail && page.thumbnail.source) return page.thumbnail.source;
2691      }
2692    }
2693  }catch(err){}
2694  // fall back to a fuzzy full-text search — catches cases where the source data has
2695  // inconsistent/missing diacritics (e.g. "Raul Jimenez" vs the actual title "Raúl Jiménez"),
2696  // which an exact title match won't find even with redirects
2697  try{
2698    const url2 = 'https://en.wikipedia.org/w/api.php?action=query&generator=search&gsrsearch='+
2699      encodeURIComponent(name)+'&gsrlimit=1&prop=pageimages&format=json&pithumbsize=300&origin=*';
2700    const resp2 = await fetch(url2);
2701    if(!resp2.ok) return null;
2702    const data2 = await resp2.json();
2703    const pages2 = data2.query && data2.query.pages;
2704    if(!pages2) return null;
2705    const page2 = Object.values(pages2)[0];
2706    if(page2 && page2.thumbnail && page2.thumbnail.source) return page2.thumbnail.source;
2707    return null;
2708  }catch(err){ return null; }
2709}
2710function csvField(v){
2711  v = v!==undefined && v!==null ? String(v) : '';
2712  if(v.indexOf(',')>-1 || v.indexOf('"')>-1) v = '"'+v.replace(/"/g,'""')+'"';
2713  return v;
2714}
2715// Excel/Google Sheets aggressively reinterpret values that look like dates —
2716// "4-3-3" becomes an actual date. Prefixing with an apostrophe is the standard
2717// spreadsheet convention to force literal text; we strip it back out on import
2718// so it's invisible everywhere except inside an actual spreadsheet app.
2719function csvFieldProtected(v){
2720  return csvField("'"+(v!==undefined && v!==null ? String(v) : ''));
2721}
2722function stripSpreadsheetGuard(v){
2723  return (typeof v==='string' && v.charAt(0)==="'") ? v.slice(1) : v;
2724}
2725function metaToCSV(m){
2726  let out='key,value\n';
2727  const knownOrder = ['home_name','home_color','away_name','away_color','competition','date','venue','venue_lat','venue_long','home_formation','away_formation','home_flag','away_flag','ambient_audio','kickoff_audio','end_of_normal_time_audio','extra_time_audio','has_extra_time','max_minute','possession_home','possession_away','goal_celebration_audio','goal_celebration_minute','penalty_scored_audio','penalty_missed_audio','referee','linesman','attendance'];
2728  const protectedKeys = ['home_formation','away_formation'];
2729  const seen = {};
2730  function writeRow(k){
2731    if(seen[k] || m[k]===undefined) return;
2732    seen[k] = true;
2733    const val = protectedKeys.indexOf(k)>-1 ? csvFieldProtected(m[k]) : csvField(m[k]);
2734    out += k+','+val+'\n';
2735  }
2736  knownOrder.forEach(writeRow);
2737  // any other keys present that aren't in the list above — e.g. home_variety_audio_1,
2738  // home_variety_audio_2, away_variety_audio_1... — so nothing is ever silently dropped
2739  // just because this list didn't get updated when a new field was added elsewhere
2740  Object.keys(m).forEach(writeRow);
2741  return out;
2742}
2743function csvToMeta(text){
2744  const rows = parseCSVRows(text);
2745  const m = {};
2746  rows.forEach(r=>{ if(r[0]) m[r[0].trim()] = stripSpreadsheetGuard(r[1]||''); });
2747  return m;
2748}
2749function lineupsToCSV(lineup){
2750  let out = 'team,role,number,name,club,age,photo\n';
2751  (lineup||[]).forEach(p=>{
2752    out += p.team+','+p.role+','+csvField(p.number)+','+csvField(p.name)+','+csvField(p.club)+','+csvField(p.age)+','+csvField(p.p
2752hoto)+'\n';
2753  });
2754  return out;
2755}
2756function csvToLineups(text){
2757  return parseCSVRows(text)
2758    .map(r=>({team:(r[0]||'').trim(), role:(r[1]||'').trim(), number:r[2]||'', name:r[3]||'', club:r[4]||'', age:r[5]||'', photo:r[6]||''}))
2759    .filter(p=>(p.team==='home'||p.team==='away') && (p.role==='starter'||p.role==='sub') && p.name);
2760}
2761function currentMetaFromInputs(){
2762  return {
2763    home_name: document.getElementById('inHomeName').value,
2764    home_color: document.getElementById('inHomeColor').value,
2765    away_name: document.getElementById('inAwayName').value,
2766    away_color: document.getElementById('inAwayColor').value,
2767    competition: document.getElementById('inComp').value,
2768    date: document.getElementById('inDate').value,
2769    venue: document.getElementById('inVenue').value,
2770    venue_lat: match.venueLat!==undefined ? match.venueLat : '',
2771    venue_long: match.venueLong!==undefined ? match.venueLong : ''
2772  };
2773}
2774function metaFromMatch(m){
2775  const out = {
2776    home_name: m.home && m.home.name, home_color: m.home && m.home.color,
2777    away_name: m.away && m.away.name, away_color: m.away && m.away.color,
2778    competition: m.competition, date: m.date, venue: m.venue,
2779    venue_lat: m.venueLat, venue_long: m.venueLong,
2780    home_formation: m.homeFormation, away_formation: m.awayFormation,
2781    home_flag: m.homeFlag, away_flag: m.awayFlag, ambient_audio: m.ambientAudio,
2782    kickoff_audio: m.kickoffAudio, end_of_normal_time_audio: m.endOfNormalTimeAudio, extra_time_audio: m.extraTimeAudio,
2783    has_extra_time: m.hasExtraTime ? '1' : '', max_minute: m.maxMinute!==undefined ? m.maxMinute : '',
2784    possession_home: m.possession ? m.possession.home : '', possession_away: m.possession ? m.possession.away : '',
2785    goal_celebration_audio: m.goalCelebrationAudio, goal_celebration_minute: m.goalCelebrationMinute,
2786    penalty_scored_audio: m.penaltyScoredAudio, penalty_missed_audio: m.penaltyMissedAudio
2787  };
2788  (m.homeVarietyAudio||[]).forEach((a,i)=>{ out['home_variety_audio_'+(i+1)] = a; });
2789  (m.awayVarietyAudio||[]).forEach((a,i)=>{ out['away_variety_audio_'+(i+1)] = a; });
2790  return out;
2791}
2792// combined single-file format: one CSV holding all three tables, distinguished by a
2793// leading "section" column (meta / timeline / event), since they have different shapes.
2794// This is an alternate export/import — the three separate CSVs above remain the
2795// primary editing surface, since a flat combined file is less friendly to hand-edit.
2796function combinedToCSV(meta, timeline, events, lineup, ambientWindows, penalties){
2797  let out = 'section,minute,value,team,label,photo,key,keyvalue,role,number,club,age,audio\n';
2798  const metaKeys = ['home_name','home_color','away_name','away_color','competition','date','venue','venue_lat','venue_long','home_formation','away_formation','home_flag','away_flag','referee','linesman','attendance','ambient_audio','kickoff_audio','end_of_normal_time_audio','extra_time_audio','has_extra_time','max_minute','possession_home','possession_away','goal_celebration_audio','goal_celebration_minute','penalty_scored_audio','penalty_missed_audio'];
2799  const protectedKeys = ['home_formation','away_formation'];
2800  const seen = {};
2801  function writeMetaRow(k){
2802    if(seen[k] || meta[k]===undefined) return;
2803    seen[k] = true;
2804    const val = protectedKeys.indexOf(k)>-1 ? csvFieldProtected(meta[k]) : csvField(meta[k]);
2805    out += 'meta,,,,,,'+k+','+val+',,,,,\n';
2806  }
2807  metaKeys.forEach(writeMetaRow);
2808  // any additional keys not in the known list above (e.g. home_variety_audio_1,
2809  // home_variety_audio_2, away_variety_audio_1... — a variable number of ambient
2810  // variety clips per team, so this isn't a fixed count)
2811  Object.keys(meta).forEach(writeMetaRow);
2812  timeline.forEach(p=>{
2813    out += 'timeline,'+p[0]+','+p[1]+',,,,,,,,,,\n';
2814  });
2815  events.forEach(e=>{
2816    out += 'event,'+e.minute+','+(e.skipCrescendo?'1':'')+','+e.team+','+csvField(e.label)+','+csvField(e.photo)+','+(e.flatTide?'1':'')+','+csvField(e.highlightAudio||'')+',,,,,'+csvField(e.audio)+'\n';
2817  });
2818  (lineup||[]).forEach(p=>{
2819    out += 'lineup,,,'+p.team+','+csvField(p.name)+','+csvField(p.photo)+',,,'+p.role+','+csvField(p.number)+','+csvField(p.club)+','+csvField(p.age)+',\n';
2820  });
2821  (ambientWindows||[]).forEach(w=>{
2822    out += 'ambient_window,'+w.start+','+w.end+','+(w.peakVolume!==undefined?w.peakVolume:'')+','+(w.peakVolume2!==undefined?w.peakVolume2:'')+','+csvField(w.audio2||'')+',,,,,,,'+csvField(w.audio)+'\n';
2823  });
2824  // Penalty shootout kicks, in order taken (kick order also stored explicitly
2825  // in the "number" column so it survives even if rows get reordered).
2826  (penalties||[]).forEach((p,i)=>{
2827    out += 'penalty,,'+p.outcome+','+p.team+','+csvField(p.taker)+','+csvField(p.photo)+',,,,'+(i+1)+',,,'+csvField(p.audio)+'\n';
2828  });
2829  return out;
2830}
2831function csvToCombined(text){
2832  const rows = parseCSVRows(text); // [section,minute,value,team,label,photo,key,keyvalue,role,number,club,age,audio]
2833  const meta = {}, timeline = [], events = [], lineup = [], ambientWindows = [], penalties = [];
2834  rows.forEach(r=>{
2835    const section = (r[0]||'').trim().toLowerCase();
2836    if(section==='meta'){
2837      if(r[6]) meta[r[6].trim()] = stripSpreadsheetGuard(r[7]||'');
2838    }else if(section==='ambient_window'){
2839      const start = parseFloat(r[1]), end = parseFloat(r[2]);
2840      const peakVolume = parseFloat(r[3]);
2841      const peakVolume2 = parseFloat(r[4]);
2842      if(!isNaN(start) && !isNaN(end) && r[12]) ambientWindows.push({
2843        start, end, audio:r[12],
2844        peakVolume: isNaN(peakVolume)?undefined:peakVolume,
2845        audio2: r[5]||undefined,
2846        peakVolume2: isNaN(peakVolume2)?undefined:peakVolume2
2847      });
2848    }else if(section==='timeline'){
2849      const m = parseFloat(r[1]), v = parseFloat(r[2]);
2850      if(!isNaN(m) && !isNaN(v)) timeline.push([m,v]);
2851    }else if(section==='event'){
2852      const m = parseFloat(r[1]), team = (r[3]||'').trim();
2853      if(!isNaN(m) && (team==='home'||team==='away')) events.push({minute:m, team, label:r[4]||'', photo:r[5]||'', audio:r[12]||'', skipCrescendo: r[2]==='1', flatTide: r[6]==='1', highlightAudio: r[7]||undefined});
2854    }else if(section==='lineup'){
2855      const team = (r[3]||'').trim(), role = (r[8]||'').trim();
2856      if((team==='home'||team==='away') && (role==='starter'||role==='sub') && r[4]){
2857        lineup.push({team, role, number:r[9]||'', name:r[4]||'', club:r[10]||'', age:r[11]||'', photo:r[5]||''});
2858      }
2859    }else if(section==='penalty'){
2860      const team = (r[3]||'').trim(), outcome = (r[2]||'').trim().toLowerCase();
2861      const order = parseInt(r[9], 10);
2862      if((team==='home'||team==='away') && (outcome==='score'||outcome==='miss') && r[4]){
2863        penalties.push({team, taker:r[4]||'', outcome, photo:r[5]||'', audio:r[12]||'', _order: isNaN(order)?penalties.length:order});
2864      }
2865    }
2866  });
2867  penalties.sort((a,b)=>a._order-b._order);
2868  penalties.forEach(p=>delete p._order);
2869  return {meta, timeline, events, lineup, ambientWindows, penalties};
2870}
2871
2872/* ---- commentary audio attach ---- */
2873function refreshAudioPicker(){
2874  const picker = document.getElementById('audioEventPicker');
2875  const events = csvToEvents(document.getElementById('eventsCsv').value);
2876  const penalties = csvToPenalties(document.getElementById('penaltiesCsv').value);
2877  picker.innerHTML = '';
2878  events.forEach((e,i)=>{
2879    const opt = document.createElement('option');
2880    opt.value = 'event:'+i;
2881    opt.textContent = (e.label||('Minute '+e.minute))+(e.audio ? ' 🔊' : '');
2882    picker.appendChild(opt);
2883  });
2884  penalties.forEach((p,i)=>{
2885    const opt = document.createElement('option');
2886    opt.value = 'penalty:'+i;
2887    opt.textContent = 'Penalty '+(i+1)+' — '+p.taker+' ('+p.outcome+')'+(p.audio ? ' 🔊' : '');
2888    picker.appendChild(opt);
2889  });
2890}
2891document.getElementById('attachAudioBtn').addEventListener('click', ()=>{
2892  document.getElementById('attachAudioInput').click();
2893});
2894document.getElementById('attachAudioInput').addEventListener('change', ()=>{
2895  const input = document.getElementById('attachAudioInput');
2896  const status = document.getElementById('attachAudioStatus');
2897  const picker = document.getElementById('audioEventPicker');
2898  const file = input.files[0];
2899  if(!file) return;
2900  const [kind, idxStr] = (picker.value||'').split(':');
2901  const idx = parseInt(idxStr, 10);
2902  if(!kind || isNaN(idx)){
2903    status.textContent = 'Nothing selected — add at least one row to Events CSV or Penalties CSV first.';
2904    status.style.display = 'block';
2905    return;
2906  }
2907  const reader = new FileReader();
2908  reader.onload = ()=>{
2909    if(kind==='event'){
2910      const events = csvToEvents(document.getElementById('eventsCsv').value);
2911      if(!events[idx]) return;
2912      events[idx].audio = reader.result; // base64 data URI
2913      document.getElementById('eventsCsv').value = eventsToCSV(events);
2914      refreshAudioPicker();
2915      picker.value = 'event:'+idx;
2916      status.textContent = 'Attached "'+file.name+'" ('+Math.round(file.size/1024)+' KB) to "'+(events[idx].label||events[idx].minute+"'")+'".';
2917    }else{
2918      const penalties = csvToPenalties(document.getElementById('penaltiesCsv').value);
2919      if(!penalties[idx]) return;
2920      penalties[idx].audio = reader.result;
2921      document.getElementById('penaltiesCsv').value = penaltiesToCSV(penalties);
2922      refreshAudioPicker();
2923      picker.value = 'penalty:'+idx;
2924      status.textContent = 'Attached "'+file.name+'" ('+Math.round(file.size/1024)+' KB) to penalty '+(idx+1)+' — '+penalties[idx].taker+'. This replaces the default cheer for this kick and plays out in full (capped at a sensible maximum — see the hint above).';
2925    }
2926    status.style.display = 'block';
2927  };
2928  reader.onerror = ()=>{
2929    status.textContent = "Couldn't read that audio file — "+reader.error;
2930    status.style.display = 'block';
2931  };
2932  reader.readAsDataURL(file);
2933  input.value = '';
2934});
2935
2936/* ---- data panel ---- */
2937let panelMode = 'csv';
2938document.querySelectorAll('#formatToggle [data-mode]').forEach(btn=>{
2939  btn.addEventListener('click', ()=>{
2940    document.querySelectorAll('#formatToggle [data-mode]').forEach(b=>b.classList.remove('active'));
2941    btn.classList.add('active');
2942    panelMode = btn.dataset.mode;
2943    document.getElementById('csvFields').style.display = panelMode==='csv' ? 'block' : 'none';
2944    document.getElementById('jsonFields').style.display = panelMode==='json' ? 'block' : 'none';
2945    document.getElementById('fotmobFields').style.display = panelMode==='fotmob' ? 'block' : 'none';
2946    if(panelMode==='json') document.getElementById('dataJson').value = JSON.stringify(match,null,2);
2947    else if(panelMode==='csv'){
2948      document.getElementById('metaCsv').value = metaToCSV(metaFromMatch(match));
2949      document.getElementById('timelineCsv').value = timelineToCSV(match.timeline);
2950      document.getElementById('eventsCsv').value = eventsToCSV(match.events);
2951      document.getElementById('lineupsCsv').value = lineupsToCSV(match.lineup||[]);
2952      document.getElementById('penaltiesCsv').value = penaltiesToCSV(match.penalties||[]);
2953      refreshAudioPicker();
2954    }
2955  });
2956});
2957
2958/* ---- FotMob import: confirmed field structure (from a real matchDetails response) ----
2959   general.homeTeam.name / general.awayTeam.name       — team names
2960   general.teamColors.darkMode.{home,away}             — hex colours
2961   header.events.{homeTeamGoals,awayTeamGoals}          — goals, keyed by player surname,
2962     each entry: {time, overloadTime, isHome, ownGoal, goalDescription, player:{name}}
2963   content.matchFacts.momentum.main.data (or content.momentum.main.data) — the timeline
2964   Searched recursively (not by a fixed path) so it's resilient to paths shifting slightly
2965   between matches/competitions — but this is still one real confirmed sample, not a
2966   guarantee every match/sport is laid out identically. */
2967function deepFindByKey(obj, key, maxDepth, seen){
2968  maxDepth = maxDepth===undefined ? 14 : maxDepth;
2969  seen = seen || new Set();
2970  if(maxDepth<0 || obj===null || typeof obj!=='object' || seen.has(obj)) return undefined;
2971  seen.add(obj);
2972  if(!Array.isArray(obj) && Object.prototype.hasOwnProperty.call(obj,key)) return obj[key];
2973  const children = Array.isArray(obj) ? obj : Object.values(obj);
2974  for(let i=0;i<children.length;i++){
2975    const found = deepFindByKey(children[i], key, maxDepth-1, seen);
2976    if(found!==undefined) return found;
2977  }
2978  return undefined;
2979}
2980function findFotMobData(parsed){
2981  // tolerant to several paste shapes: the raw array itself, {"data":[...]},
2982  // {"main":{"data":[...]}}, or {"momentum":{"main":{"data":[...]}}} — anywhere in the tree
2983  if(Array.isArray(parsed)) return parsed;
2984  if(parsed && Array.isArray(parsed.data)) return parsed.data;
2985  if(parsed && parsed.main && Array.isArray(parsed.main.data)) return parsed.main.data;
2986  if(parsed && parsed.momentum && parsed.momentum.main && Array.isArray(parsed.momentum.main.data)) return parsed.momentum.main.data;
2987  const momentum = deepFindByKey(parsed, 'momentum');
2988  if(momentum){
2989    if(momentum.main && Array.isArray(momentum.main.data)) return momentum.main.data;
2990    if(Array.isArray(momentum.data)) return momentum.data;
2991  }
2992  return null;
2993}
2994// fallback for malformed/truncated JSON (e.g. a copy that got cut off before the closing
2995// brackets) — pattern-matches {"minute":X,"value":Y} pairs directly, which works even
2996// when the surrounding structure is broken, as long as the individual entries are intact
2997function extractFotMobPairsByRegex(text){
2998  const re = /"minute"\s*:\s*(-?\d+(?:\.\d+)?)\s*,\s*"value"\s*:\s*(-?\d+(?:\.\d+)?)/g;
2999  const out = [];
3000  let m;
3001  while((m = re.exec(text)) !== null){
3002    out.push({minute: parseFloat(m[1]), value: parseFloat(m[2])});
3003  }
3004  return out;
3005}
3006function extractFotMobLineups(parsed){
3007  const lineupRoot = deepFindByKey(parsed, 'lineup');
3008  if(!lineupRoot || (!lineupRoot.homeTeam && !lineupRoot.awayTeam)) return null;
3009  const out = {players:[], homeFormation:'', awayFormation:''};
3010  function collect(teamObj, side){
3011    if(!teamObj) return;
3012    if(teamObj.formation){ if(side==='home') out.homeFormation = teamObj.formation; else out.awayFormation = teamObj.formation; }
3013    (teamObj.starters||[]).forEach(p=>{
3014      out.players.push({team:side, role:'starter', number:p.shirtNumber||'', name:p.name||'', club:p.primaryTeamName||'', age:(typeof p.age==='number')?p.age:'', photo:''});
3015    });
3016    (teamObj.subs||[]).forEach(p=>{
3017      out.players.push({team:side, role:'sub', number:p.shirtNumber||'', name:p.name||'', club:p.primaryTeamName||'', age:(typeof p.age==='number')?p.age:'', photo:''});
3018    });
3019  }
3020  collect(lineupRoot.homeTeam, 'home');
3021  collect(lineupRoot.awayTeam, 'away');
3022  return out.players.length ? out : null;
3023}
3024function normalizeForMatch(s){
3025  return s.normalize('NFD').replace(/[\u0300-\u036f]/g,'').toLowerCase().replace(/[^a-z]/g,'');
3026}
3027// finds real editorial photo URLs anywhere in the response (match-report thumbnails etc).
3028// Note: these are NOT a systematic per-player photo directory — just whichever
3029// players happen to be the subject of news articles about this match, so most
3030// goals won't have a photo available this way.
3031function findFotMobArticleImageUrls(parsed){
3032  const out = [];
3033  const seen = new Set();
3034  function walk(obj, depth){
3035    if(depth>12 || obj===null || typeof obj!=='object' || seen.has(obj)) return;
3036    seen.add(obj);
3037    if(!Array.isArray(obj)){
3038      if(typeof obj.image==='string' && /\.(jpg|jpeg|png)/i.test(obj.image)) out.push(obj.image);
3039      Object.values(obj).forEach(v=>walk(v, depth+1));
3040    }else{
3041      obj.forEach(v=>walk(v, depth+1));
3042    }
3043  }
3044  walk(parsed, 0);
3045  return Array.from(new Set(out));
3046}
3047// matches by the image URL's filename slug (e.g. "bukayo-saka_xyz.jpg"), not the
3048// article title — titles often mention multiple players together (e.g. comparing
3049// two goalscorers), which caused wrong matches when tested; the image filename
3050// reliably names only the actual subject of that specific photo.
3051function autoMatchGoalPhotos(events, imageUrls){
3052  let matched = 0;
3053  events.forEach(e=>{
3054    if(e.photo) return; // never override a photo that's already set
3055    const namePart = (e.label||'').split('·')[0].trim();
3056    if(!namePart) return;
3057    const surname = normalizeForMatch(namePart.split(' ').pop());
3058    if(!surname || surname.length<3) return;
3059    const hit = imageUrls.find(url=>normalizeForMatch(url).includes(surname));
3060    if(hit){ e.photo = hit; matched++; }
3061  });
3062  return matched;
3063}
3064// FotMob's momentum widget commonly stops around minute 90(-ish) even when the
3065// match ran well past that in real added time — confirmed against a real
3066// response where the momentum array ended at 90.75 despite ~12 real minutes
3067// of second-half stoppage (no goal in that window either, so there's no event
3068// to infer it from). header.status.halfs gives genuine wall-clock start/end
3069// timestamps for each half, which is the one reliable source for the true
3070// final minute — this reads those directly instead of trusting the momentum
3071// array's own range or requiring a goal to have happened late.
3072function parseFotMobHalfTimestamp(s){
3073  if(!s) return null;
3074  const m = /^(\d{2})\.(\d{2})\.(\d{4})\s+(\d{2}):(\d{2}):(\d{2})$/.exec(s.trim());
3075  if(!m) return null;
3076  return new Date(+m[3], +m[2]-1, +m[1], +m[4], +m[5], +m[6]).getTime();
3077}
3078function extractFotMobMatchDuration(parsed){
3079  const halfs = deepFindByKey(parsed, 'halfs');
3080  if(!halfs) return null;
3081  const gameEnded = parseFotMobHalfTimestamp(halfs.gameEnded);
3082  const hasExtraTime = !!(halfs.firstExtraHalfStarted && halfs.firstExtraHalfStarted.trim());
3083  const finalPeriodStart = parseFotMobHalfTimestamp(hasExtraTime ? halfs.secondExtraHalfStarted : halfs.secondHalfStarted);
3084  if(gameEnded==null || finalPeriodStart==null || gameEnded<=finalPeriodStart) return null;
3085  const finalPeriodDurationMin = (gameEnded - finalPeriodStart) / 60000;
3086  // nominal kickoff minute of whichever period actually finishes the match —
3087  // 45' for a normal 2nd half, 105' for a 2nd extra-time half — plus however
3088  // long that period really ran gives the true final displayed minute,
3089  // regardless of what the momentum widget itself covers.
3090  const nominalStart = hasExtraTime ? 105 : 45;
3091  const maxMinute = Math.round((nominalStart + finalPeriodDurationMin) * 10) / 10;
3092  return { maxMinute, hasExtraTime, finalPeriodDurationMin: Math.round(finalPeriodDurationMin*10)/10 };
3093}
3094// FotMob's Top stats live at content.stats.Periods.All.stats, a list of stat
3095// groups; the group with key 'top_stats' has individual rows like Ball
3096// possession (FotMob's own key spelling: 'BallPossesion', not a typo here),
3097// each with a [home, away] pair. Only possession is pulled out for display —
3098// everything else in that group (xG, shots, etc.) is left alone for now.
3099function extractFotMobPossession(parsed){
3100  const statsRoot = deepFindByKey(parsed, 'stats');
3101  if(!statsRoot || !statsRoot.Periods || !statsRoot.Periods.All || !Array.isArray(statsRoot.Periods.All.stats)) return null;
3102  const topStatsGroup = statsRoot.Periods.All.stats.find(g=>g && g.key==='top_stats' && Array.isArray(g.stats));
3103  if(!topStatsGroup) return null;
3104  const row = topStatsGroup.stats.find(s=>s && s.key==='BallPossesion' && Array.isArray(s.stats) && s.stats.length===2);
3105  if(!row) return null;
3106  const home = parseFloat(row.stats[0]), away = parseFloat(row.stats[1]);
3107  if(isNaN(home) || isNaN(away)) return null;
3108  return { home, away };
3109}
3110function extractFotMobGoals(parsed){
3111  let goalsContainer = null;
3112  const eventsObj = deepFindByKey(parsed, 'events');
3113  if(eventsObj && (eventsObj.homeTeamGoals || eventsObj.awayTeamGoals)) goalsContainer = eventsObj;
3114  if(!goalsContainer && parsed.header && parsed.header.events) goalsContainer = parsed.header.events;
3115  if(!goalsContainer) return null;
3116  const out = [];
3117  function collect(goalsByPlayer, side){
3118    if(!goalsByPlayer) return;
3119    Object.values(goalsByPlayer).forEach(arr=>{
3120      if(!Array.isArray(arr)) return;
3121      arr.forEach(g=>{
3122        const base = typeof g.time==='number' ? g.time : parseFloat(g.time);
3123        if(isNaN(base)) return;
3124        const added = typeof g.overloadTime==='number' ? g.overloadTime : 0;
3125        const minute = base+added;
3126        const team = (typeof g.isHome==='boolean') ? (g.isHome?'home':'away') : side;
3127        const playerName = (g.player && g.player.name) ? g.player.name : (g.nameStr||'Unknown');
3128        let label = playerName+' · '+base+(added>0?('+'+added):'')+"'";
3129        if(g.goalDescription==='Penalty') label += ' (Pen)';
3130        if(g.ownGoal) label += ' (OG)';
3131        out.push({minute, team, label, photo:''});
3132      });
3133    });
3134  }
3135  collect(goalsContainer.homeTeamGoals, 'home');
3136  collect(goalsContainer.awayTeamGoals, 'away');
3137  out.sort((a,b)=>a.minute-b.minute);
3138  return out.length ? out : null;
3139}
3140function extractFotMobTeamInfo(parsed){
3141  const general = deepFindByKey(parsed, 'general') || parsed.general;
3142  const info = {homeName:null, awayName:null, homeColor:null, awayColor:null, competition:null, date:null, venue:null, venueLat:null, venueLong:null};
3143  if(general){
3144    if(general.homeTeam && general.homeTeam.name) info.homeName = general.homeTeam.name;
3145    if(general.awayTeam && general.awayTeam.name) info.awayName = general.awayTeam.name;
3146    if(general.teamColors){
3147      const tc = general.teamColors.darkMode || general.teamColors.lightMode;
3148      if(tc && tc.home) info.homeColor = tc.home;
3149      if(tc && tc.away) info.awayColor = tc.away;
3150    }
3151    if(general.leagueName) info.competition = general.leagueName;
3152    if(general.matchTimeUTC){
3153      // "Mon, Jul 6, 2026, 01:00 UTC" -> "Jul 6, 2026" (strip weekday prefix and time/UTC suffix)
3154      info.date = general.matchTimeUTC.replace(/^\w+,\s*/, '').replace(/,?\s*\d{1,2}:\d{2}\s*UTC$/, '').trim();
3155    }
3156  }
3157  const stadium = deepFindByKey(parsed, 'Stadium');
3158  if(stadium && stadium.name){
3159    info.venue = stadium.name + (stadium.city ? ', '+stadium.city : '');
3160    if(typeof stadium.lat==='number') info.venueLat = stadium.lat;
3161    if(typeof stadium.long==='number') info.venueLong = stadium.long;
3162  }
3163  return info;
3164}
3165document.getElementById('convertFotmobBtn').addEventListener('click', ()=>{
3166  const errBox = document.getElementById('errBox');
3167  const preview = document.getElementById('fotmobPreview');
3168  errBox.style.display='none'; preview.style.display='none';
3169  try{
3170    let raw = document.getElementById('fotmobJson').value.trim();
3171    if(!raw) throw new Error("Paste a match stats API response (or at least the momentum/timeline section) first.");
3172    let parsed = null;
3173    let arr = null;
3174    let usedFallback = false;
3175    try{
3176      let toParse = raw;
3177      if(!toParse.startsWith('[') && !toParse.startsWith('{')) toParse = '{'+toParse+'}';
3178      parsed = JSON.parse(toParse);
3179      arr = findFotMobData(parsed);
3180    }catch(parseErr){
3181      // JSON was malformed (very often a truncated copy missing closing brackets) —
3182      // fall back to pulling out whatever complete {minute,value} pairs exist.
3183      // Events/team-info extraction need valid JSON structure, so those are skipped
3184      // in this path — only the timeline can be recovered from broken JSON.
3185      arr = extractFotMobPairsByRegex(raw);
3186      usedFallback = true;
3187    }
3188    if(!arr || arr.length===0){ arr = extractFotMobPairsByRegex(raw); usedFallback = arr.length>0; }
3189    if(!arr || arr.length===0) throw new Error("Couldn't find any minute/value pairs in that text — check you've pasted the momentum section (or the full matchDetails response containing it).");
3190
3191    const flip = document.getElementById('fotmobFlipSign').checked ? -1 : 1;
3192    const timeline = arr
3193      .filter(d=>d && typeof d.minute==='number' && typeof d.value==='number' && !isNaN(d.minute) && !isNaN(d.value))
3194      .map(d=>[d.minute, Math.max(-1, Math.min(1, (d.value/100)*flip))]);
3195    if(timeline.length<2) throw new Error("Found the data but couldn't read at least 2 valid {minute,value} entries from it.");
3196    document.getElementById('timelineCsv').value = timelineToCSV(timeline);
3197
3198    const previewLines = [];
3199    previewLines.push((usedFallback ? '⚠ JSON was malformed (likely a truncated copy) — recovered ' : 'Timeline: converted ')
3200      +timeline.length+' points (minute '+timeline[0][0]+' to '+timeline[timeline.length-1][0]+')'
3201      +(usedFallback ? ' by pattern-matching directly.' : '.'));
3202
3203    if(parsed && !usedFallback){
3204      const goals = extractFotMobGoals(parsed);
3205      if(goals){
3206        const articleImages = findFotMobArticleImageUrls(parsed);
3207        const photoMatches = autoMatchGoalPhotos(goals, articleImages);
3208        document.getElementById('eventsCsv').value = eventsToCSV(goals);
3209        refreshAudioPicker();
3210        previewLines.push('Events: found '+goals.length+' goal(s) — team/minute/scorer extracted, photo left blank for you to add. Please check these against the actual match before relying on them.');
3211        if(photoMatches>0){
3212          previewLines.push('Photos: auto-matched '+photoMatches+' of '+goals.length+' goals to a real photo found in this data (matched by image filename, not just name mentions in text — reduces false matches, but still worth a quick visual check). The rest are blank, since this data only contains incidental match-report images, not a full player photo directory — add those manually (e.g. Wikimedia Commons) as before.');
3213        }
3214      }else{
3215        previewLines.push('Events: none found in this paste — add manually if needed.');
3216      }
3217      const info = extractFotMobTeamInfo(parsed);
3218      if(info.homeName) document.getElementById('inHomeName').value = info.homeName;
3219      if(info.awayName) document.getElementById('inAwayName').value = info.awayName;
3220      if(info.homeColor) document.getElementById('inHomeColor').value = info.homeColor;
3221      if(info.awayColor) document.getElementById('inAwayColor').value = info.awayColor;
3222      if(info.competition) document.getElementById('inComp').value = info.competition;
3223      if(info.date) document.getElementById('inDate').value = info.date;
3224      if(info.homeName || info.awayName || info.homeColor || info.awayColor){
3225        previewLines.push('Teams: '+(info.homeName||'?')+' (home'+(info.homeColor?', '+info.homeColor:'')+') vs '+(info.awayName||'?')+' (away'+(info.awayColor?', '+info.awayColor:'')+') — filled 
3225in above, click Apply data to use them.');
3226      }
3227      const duration = extractFotMobMatchDuration(parsed);
3228      if(duration){
3229        pendingMaxMinuteOverride = duration.maxMinute;
3230        document.getElementById('inHasExtraTime').checked = duration.hasExtraTime;
3231        const momentumMax = timeline.length ? timeline[timeline.length-1][0] : 0;
3232        previewLines.push('Duration: real half timestamps show the match ran to '+duration.maxMinute+"' ("
3233          +(duration.hasExtraTime ? 'extra time, 2nd ET half' : '2nd half')+' lasted '+duration.finalPeriodDurationMin+' real minutes) — set as the match duration for Apply Data.'
3234          +(momentumMax < duration.maxMinute - 0.5 ? ' Note the momentum widget itself only covers up to '+momentumMax+"', so the timeline will hold flat for the remaining stoppage time rather than showing more possession swings — that's a genuine gap in FotMob's momentum data, not something this app can recover." : ''));
3235      }
3236      const possession = extractFotMobPossession(parsed);
3237      if(possession){
3238        pendingPossessionOverride = possession;
3239        previewLines.push('Possession: '+possession.home+'% / '+possession.away+'% — will show in the Lineups panel after Apply Data.');
3240      }
3241      if(info.venue) document.getElementById('inVenue').value = info.venue;
3242      if(info.competition || info.date || info.venue){
3243        previewLines.push('Match: '+(info.competition||'?')+' · '+(info.date||'?')+(info.venue?' · '+info.venue:'')+' — filled in above too.');
3244      }
3245      const lineupData = extractFotMobLineups(parsed);
3246      document.getElementById('metaCsv').value = metaToCSV({
3247        home_name: document.getElementById('inHomeName').value,
3248        home_color: document.getElementById('inHomeColor').value,
3249        away_name: document.getElementById('inAwayName').value,
3250        away_color: document.getElementById('inAwayColor').value,
3251        competition: document.getElementById('inComp').value,
3252        date: document.getElementById('inDate').value,
3253        venue: document.getElementById('inVenue').value,
3254        venue_lat: info.venueLat!==null ? info.venueLat : '',
3255        venue_long: info.venueLong!==null ? info.venueLong : '',
3256        home_formation: lineupData ? lineupData.homeFormation : '',
3257        away_formation: lineupData ? lineupData.awayFormation : ''
3258      });
3259      if(lineupData){
3260        document.getElementById('lineupsCsv').value = lineupsToCSV(lineupData.players);
3261        previewLines.push('Lineups: found '+lineupData.players.length+' players ('+lineupData.homeFormation+' vs '+lineupData.awayFormation+').');
3262      }else{
3263        previewLines.push('Lineups: none found in this paste.');
3264      }
3265    }
3266    previewLines.push('Switched to the CSV tab — review below, then Apply or Download.');
3267    preview.innerHTML = previewLines.join('<br>');
3268    preview.style.display = 'block';
3269
3270    // switch to the CSV tab so they land straight on the editable/downloadable result
3271    // (done manually, not via .click(), so it doesn't re-populate over our converted data)
3272    document.querySelectorAll('#formatToggle [data-mode]').forEach(b=>b.classList.remove('active'));
3273    const csvTabBtn = document.querySelector('#formatToggle [data-mode="csv"]');
3274    if(csvTabBtn) csvTabBtn.classList.add('active');
3275    panelMode = 'csv';
3276    document.getElementById('csvFields').style.display = 'block';
3277    document.getElementById('jsonFields').style.display = 'none';
3278    document.getElementById('fotmobFields').style.display = 'none';
3279  }catch(err){
3280    errBox.textContent = "Couldn't convert — "+err.message;
3281    errBox.style.display='block';
3282  }
3283});
3284
3285function openPanel(){
3286  document.getElementById('dataJson').value = JSON.stringify(match,null,2);
3287  document.getElementById('metaCsv').value = metaToCSV(metaFromMatch(match));
3288  document.getElementById('timelineCsv').value = timelineToCSV(match.timeline);
3289  document.getElementById('eventsCsv').value = eventsToCSV(match.events);
3290  document.getElementById('lineupsCsv').value = lineupsToCSV(match.lineup||[]);
3291  document.getElementById('penaltiesCsv').value = penaltiesToCSV(match.penalties||[]);
3292  refreshAudioPicker();
3293  updateShareLineupWarning();
3294  overlay.classList.add('show'); panel.classList.add('show');
3295}
3296function closePanelFn(){
3297  overlay.classList.remove('show');
3298  panel.classList.remove('show');
3299  lineupsPanel.classList.remove('show');
3300  mapPanel.classList.remove('show');
3301}
3302
3303/* ---- lineups panel ---- */
3304const lineupsPanel = document.getElementById('lineupsPanel');
3305function escapeHtml(s){ return String(s).replace(/[&<>"']/g, c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c])); }
3306function openPhotoLightbox(src, name){
3307  document.getElementById('photoLightboxImg').src = src;
3308  document.getElementById('photoLightboxCaption').textContent = name || '';
3309  document.getElementById('photoLightbox').classList.add('show');
3310}
3311function closePhotoLightbox(){
3312  document.getElementById('photoLightbox').classList.remove('show');
3313}
3314function renderPlayerRow(p){
3315  const photoHtml = p.photo
3316    ? '<img class="lineup-thumb" src="'+escapeHtml(p.photo)+'" onerror="this.style.display=\'none\'" onclick="openPhotoLightbox(this.src, \''+escapeHtml((p.name||'').replace(/'/g,"\\'"))+'\')">'
3317    : '<span class="lineup-thumb lineup-thumb-empty"></span>';
3318  return '<div class="lineup-player">'+photoHtml+'<span class="num">'+escapeHtml(p.number||'')+'</span>'+
3319    '<div class="nm-wrap"><span class="nm">'+escapeHtml(p.name||'')+'</span>'+
3320    '<span class="cl">'+escapeHtml(p.club||'')+(p.age?' · '+escapeHtml(p.age):'')+'</span></div></div>';
3321}
3322// Fallback for matches with no real possession stat (hand-entered historical
3323// matches like 1966, or any non-FotMob source): every match already has a
3324// momentum/threat timeline, so a rough estimate can be derived by time-
3325// weighting it across the match. This is NOT the same signal as actual
3326// time-of-possession — a team can dominate the ball while creating little
3327// threat (e.g. defensive possession) — so it's deliberately labelled as an
3328// estimate rather than presented as if it were a real sourced stat.
3329function estimatePossessionFromMomentum(timeline){
3330  if(!timeline || timeline.length<2) return null;
3331  const pts = timeline.slice().sort((a,b)=>a[0]-b[0]);
3332  let weightedSum = 0, totalDuration = 0;
3333  for(let i=0;i<pts.length-1;i++){
3334    const dt = pts[i+1][0]-pts[i][0];
3335    if(dt<=0) continue;
3336    const avgVal = (pts[i][1]+pts[i+1][1])/2; // trapezoidal — avoids biasing toward densely-sampled stretches
3337    weightedSum += avgVal*dt;
3338    totalDuration += dt;
3339  }
3340  if(totalDuration<=0) return null;
3341  const avg = Math.max(-1, Math.min(1, weightedSum/totalDuration));
3342  const home = Math.round(((avg+1)/2)*100);
3343  return { home, away: 100-home, estimated: true };
3344}
3345function updatePossessionDisplays(){
3346  const sourced = match.possession && typeof match.possession.home==='number' && typeof match.possession.away==='number';
3347  const poss = sourced ? { home: match.possession.home, away: match.possession.away, estimated: false }
3348                       : estimatePossessionFromMomentum(match.timeline);
3349  const lineupsEl = document.getElementById('lineupsPossession');
3350  const mainEl = document.getElementById('mainPossessionBar');
3351  if(!poss){
3352    lineupsEl.style.display = 'none';
3353    mainEl.style.display = 'none';
3354    return;
3355  }
3356  const h = poss.home, a = poss.away;
3357  const label = poss.estimated ? 'OVERALL POSSESSION (EST. FROM MOMENTUM)' : 'OVERALL POSSESSION';
3358  lineupsEl.style.display = 'block';
3359  lineupsEl.innerHTML =
3360    '<div style="font-size:11px;letter-spacing:0.04em;color:var(--ink-dim);margin-bottom:8px;">'+label+'</div>'+
3361    '<div style="display:flex;justify-content:space-between;font-size:14px;font-weight:700;margin-bottom:6px;">'+
3362      '<span>'+h+'%</span><span>'+a+'%</span></div>'+
3363    '<div style="height:8px;border-radius:4px;overflow:hidden;background:var(--panel-2);border:1px solid var(--border);display:flex;">'+
3364      '<div style="width:'+h+'%;background:'+(match.home.color||'#2451e0')+';"></div>'+
3365      '<div style="width:'+a+'%;background:'+(match.away.color||'#ffffff')+';"></div>'+
3366    '</div>'+
3367    (poss.estimated ? '<div class="hint" style="margin-top:6px;">Estimated from the attacking-threat timeline, not a real recorded stat — a team can hold the ball without creating threat, so treat this as a rough indicator rather than an official possession figure. Add possession_home/possession_away to the Meta CSV (or use the Import tab) to show a real sourced value instead.</div>' : '');
3368  mainEl.style.display = 'block';
3369  document.getElementById('mainPossessionLabel').textContent = poss.estimated ? 'OVERALL POSSESSION (EST.)' : 'OVERALL POSSESSION';
3370  document.getElementById('mainPossessionHomeFill').style.cssText = 'width:'+h+'%;background:'+(match.home.color||'#2451e0')+';'+(poss.estimated?'opacity:0.75;':'');
3371  document.getElementById('mainPossessionAwayFill').style.cssText = 'width:'+a+'%;background:'+(match.away.color||'#ffffff')+';'+(poss.estimated?'opacity:0.75;':'');
3372  document.getElementById('mainPossessionHomePct').textContent = h+'%'+(poss.estimated?'*':'');
3373  document.getElementById('mainPossessionAwayPct').textContent = a+'%'+(poss.estimated?'*':'');
3374}
3375function renderLineups(){
3376  updatePossessionDisplays();
3377  const lineup = match.lineup || [];
3378  const empty = document.getElementById('lineupsEmpty');
3379  const content = document.getElementById('lineupsContent');
3380  if(!lineup.length){
3381    empty.style.display = 'block'; content.style.display = 'none';
3382    return;
3383  }
3384  empty.style.display = 'none'; content.style.display = 'block';
3385  const homeFlagImg = match.homeFlag ? '<img class="lineups-flag" src="'+flagUrl(match.homeFlag)+'" onerror="this.style.display=\'none\'">' : '';
3386  const awayFlagImg = match.awayFlag ? '<img class="lineups-flag" src="'+flagUrl(match.awayFlag)+'" onerror="this.style.display=\'none\'">' : '';
3387  document.getElementById('lineupsHomeHead').innerHTML = homeFlagImg+escapeHtml(match.home.name)+(match.homeFormation?'<div class="lineups-formation">'+escapeHtml(match.homeFormation)+'</div>':'');
3388  document.getElementById('lineupsAwayHead').innerHTML = awayFlagImg+escapeHtml(match.away.name)+(match.awayFormation?'<div class="lineups-formation">'+escapeHtml(match.awayFormation)+'</div>':'');
3389  const by = (team,role) => lineup.filter(p=>p.team===team && p.role===role);
3390  document.getElementById('lineupsHomeStarters').innerHTML = by('home','starter').map(renderPlayerRow).join('') || '<div class="hint">None listed.</div>';
3391  document.getElementById('lineupsHomeSubs').innerHTML = by('home','sub').map(renderPlayerRow).join('') || '<div class="hint">None listed.</div>';
3392  document.getElementById('lineupsAwayStarters').innerHTML = by('away','starter').map(renderPlayerRow).join('') || '<div class="hint">None listed.</div>';
3393  document.getElementById('lineupsAwaySubs').innerHTML = by('away','sub').map(renderPlayerRow).join('') || '<div class="hint">None listed.</div>';
3394}
3395document.getElementById('lineupsBtn').addEventListener('click', ()=>{
3396  renderLineups();
3397  overlay.classList.add('show');
3398  lineupsPanel.classList.add('show');
3399});
3400document.getElementById('closeLineups').addEventListener('click', ()=>{
3401  overlay.classList.remove('show');
3402  lineupsPanel.classList.remove('show');
3403});
3404
3405/* ---- venue map panel ---- */
3406const mapPanel = document.getElementById('mapPanel');
3407function renderMap(){
3408  const empty = document.getElementById('mapEmpty');
3409  const content = document.getElementById('mapContent');
3410  const lat = parseFloat(match.venueLat), lon = parseFloat(match.venueLong);
3411  if(isNaN(lat) || isNaN(lon)){
3412    empty.style.display = 'block'; content.style.display = 'none';
3413    document.getElementById('venueMapThumb').style.display = 'none';
3414    return;
3415  }
3416  empty.style.display = 'none'; content.style.display = 'block';
3417  document.getElementById('mapVenueName').textContent = match.venue || '';
3418  const d = 0.01; // small bounding box around the point
3419  const bbox = (lon-d)+','+(lat-d)+','+(lon+d)+','+(lat+d);
3420  const mapUrl = 'https://www.openstreetmap.org/export/embed.html?bbox='+bbox+'&layer=mapnik&marker='+lat+','+lon;
3421  document.getElementById('mapFrame').src = mapUrl;
3422  document.getElementById('venueMapThumbFrame').src = mapUrl;
3423  document.getElementById('venueMapThumb').style.display = 'block';
3424}
3425/* Keeps --header-h (used by #scorebug/#ticker/#goalFlash/the expanded venue
3426   map to position themselves) matched to the header's real rendered height,
3427   which varies with wrapped venue text, wrapped buttons, and font loading —
3428   a hardcoded pixel offset previously caused these to overlap the header on
3429   narrow screens or long venue names. */
3430function syncHeaderHeight(){
3431  const header = document.getElementById('header');
3432  if(!header) return;
3433  document.documentElement.style.setProperty('--header-h', header.getBoundingClientRect().height+'px');
3434}
3435if('ResizeObserver' in window){
3436  new ResizeObserver(syncHeaderHeight).observe(document.getElementById('header'));
3437}
3438window.addEventListener('resize', syncHeaderHeight);
3439if(document.fonts && document.fonts.ready) document.fonts.ready.then(syncHeaderHeight);
3440syncHeaderHeight();
3441
3442/* Same pattern as syncHeaderHeight, but for the transport bar at the bottom —
3443   #chartPanel sits above it via --transport-h so wrapped chip buttons or a
3444   wider time readout can never push the transport tall enough to clip the
3445   possession chart. */
3446function syncTransportHeight(){
3447  const transport = document.getElementById('transport');
3448  if(!transport) return;
3449  document.documentElement.style.setProperty('--transport-h', transport.getBoundingClientRect().height+'px');
3450}
3451if('ResizeObserver' in window){
3452  new ResizeObserver(syncTransportHeight).observe(document.getElementById('transport'));
3453}
3454window.addEventListener('resize', syncTransportHeight);
3455if(document.fonts && document.fonts.ready) document.fonts.ready.then(syncTransportHeight);
3456syncTransportHeight();
3457
3458/* Same pattern again for the scorebug — the possession bar sits just below
3459   it via --scorebug-h so a taller scorebug (flags shown, wrapped text) can't
3460   overlap the bar. */
3461function syncScorebugHeight(){
3462  const scorebug = document.getElementById('scorebug');
3463  if(!scorebug) return;
3464  const rect = scorebug.getBoundingClientRect();
3465  document.documentElement.style.setProperty('--scorebug-h', rect.height+'px');
3466  // The goal/penalty flash popup used to sit at a fixed guessed offset below
3467  // the header, which broke on mobile once the scorebug wraps team names to
3468  // two lines (making the whole header area taller than the guess assumed) —
3469  // it ended up overlapping the possession bar instead of sitting below it.
3470  // Measuring the possession bar's own real position (or falling back to
3471  // just below the scorebug if it isn't showing) fixes this the same way
3472  // --header-h/--transport-h/--scorebug-h already do for other elements.
3473  const goalFlash = document.getElementById('goalFlash');
3474  if(goalFlash){
3475    const possessionBar = document.getElementById('mainPossessionBar');
3476    let flashTop;
3477    if(possessionBar && possessionBar.style.display !== 'none'){
3478      const pRect = possessionBar.getBoundingClientRect();
3479      flashTop = pRect.bottom + 14;
3480    }else{
3481      flashTop = rect.bottom + 14;
3482    }
3483    goalFlash.style.top = flashTop+'px';
3484  }
3485  const midY = rect.top + rect.height/2;
3486  const BADGE_SIZE = 34, BADGE_GAP = 10, DOT_GAP = 14;
3487  // Penalty-count badges sit immediately beside the scorebug (same vertical
3488  // centre as the score numbers) — the dots then sit further out beyond
3489  // them, since the badge is the "headline" number and the dots are the
3490  // finer detail.
3491  const penCountHome = document.getElementById('penCountHome');
3492  const penCountAway = document.getElementById('penCountAway');
3493  if(penCountHome && penCountAway){
3494    penCountHome.style.top = midY+'px';
3495    penCountHome.style.transform = 'translateY(-50%)';
3496    penCountHome.style.right = (window.innerWidth - rect.left + BADGE_GAP)+'px';
3497    penCountAway.style.top = midY+'px';
3498    penCountAway.style.transform = 'translateY(-50%)';
3499    penCountAway.style.left = (rect.right + BADGE_GAP)+'px';
3500  }
3501  // Goal-tick dots sit beside the scorebug rather than stacked underneath it
3502  // (which used to collide with the possession bar) — positioned off the
3503  // scorebug's real measured edges rather than a guessed offset, same reason
3504  // as --header-h/--transport-h/--scorebug-h itself. Pushed out further when
3505  // the penalty badges are showing, so they never overlap.
3506  const tickHome = document.getElementById('tickHome');
3507  const tickAway = document.getElementById('tickAway');
3508  const badgesShowing = penCountHome && penCountHome.style.display === 'flex';
3509  const dotOffset = DOT_GAP + (badgesShowing ? BADGE_SIZE + BADGE_GAP : 0);
3510  if(tickHome && tickAway){
3511    tickHome.style.top = midY+'px';
3512    tickHome.style.transform = 'translateY(-50%)';
3513    tickHome.style.right = (window.innerWidth - rect.left + dotOffset)+'px';
3514    tickAway.style.top = midY+'px';
3515    tickAway.style.transform = 'translateY(-50%)';
3516    tickAway.style.left = (rect.right + dotOffset)+'px';
3517  }
3518}
3519if('ResizeObserver' in window){
3520  new ResizeObserver(syncScorebugHeight).observe(document.getElementById('scorebug'));
3521}
3522window.addEventListener('resize', syncScorebugHeight);
3523if(document.fonts && document.fonts.ready) document.fonts.ready.then(syncScorebugHeight);
3524syncScorebugHeight();
3525
3526let venueMapAutoCloseTimer = null;
3527function openVenueMap(){
3528  document.getElementById('header').classList.add('mapOpen');
3529  document.getElementById('venueMapThumb').classList.add('expanded');
3530  clearTimeout(venueMapAutoCloseTimer);
3531  venueMapAutoCloseTimer = setTimeout(closeVenueMap, 15000);
3532}
3533function closeVenueMap(){
3534  document.getElementById('header').classList.remove('mapOpen');
3535  document.getElementById('venueMapThumb').classList.remove('expanded');
3536  clearTimeout(venueMapAutoCloseTimer);
3537  venueMapAutoCloseTimer = null;
3538}
3539document.getElementById('venueMapIcon').addEventListener('click', openVenueMap);
3540document.getElementById('venueMapCloseBtn').addEventListener('click', (ev)=>{
3541  ev.stopPropagation();
3542  closeVenueMap();
3543});
3544document.addEventListener('pointerdown', (ev)=>{
3545  const thumb = document.getElementById('venueMapThumb');
3546  if(thumb.classList.contains('expanded') && !thumb.contains(ev.target)) closeVenueMap();
3547});
3548document.getElementById('closeMap').addEventListener('click', ()=>{
3549  overlay.classList.remove('show');
3550  mapPanel.classList.remove('show');
3551});
3552document.getElementById('dataBtn').addEventListener('click', openPanel);
3553document.getElementById('closePanel').addEventListener('click', closePanelFn);
3554overlay.addEventListener('click', closePanelFn);
3555
3556/* ---- upload / download for CSV & JSON fields ---- */
3557function downloadTextFile(filename, mimeType, text){
3558  // Excel doesn't reliably honour the charset in a Blob's MIME type — without a UTF-8
3559  // byte-order-mark at the start of the file, it guesses Windows-1252 and mangles
3560  // accented characters (é → é, · → ·, etc). The BOM fixes that for CSV specifically;
3561  // JSON viewers don't have this problem so it's only added for .csv files.
3562  const isCSV = /\.csv$/i.test(filename) || mimeType.indexOf('csv')>-1;
3563  const content = isCSV ? '\uFEFF'+text : text;
3564  const blob = new Blob([content], {type: mimeType+';charset=utf-8'});
3565  const url = URL.createObjectURL(blob);
3566  const a = document.createElement('a');
3567  a.href = url; a.download = filename;
3568  document.body.appendChild(a); a.click(); document.body.removeChild(a);
3569  setTimeout(()=>URL.revokeObjectURL(url), 1000);
3570}
3571function wireUpload(buttonId, inputId, textareaId){
3572  const btn = document.getElementById(buttonId);
3573  const input = document.getElementById(inputId);
3574  btn.addEventListener('click', ()=> input.click());
3575  input.addEventListener('change', ()=>{
3576    const file = input.files[0];
3577    if(!file) return;
3578    const reader = new FileReader();
3579    reader.onload = ()=>{ document.getElementById(textareaId).value = reader.result; };
3580    reader.onerror = ()=>{
3581      document.getElementById('errBox').textContent = "Couldn't read that file — "+reader.error;
3582      document.getElementById('errBox').style.display='block';
3583    };
3584    reader.readAsText(file);
3585    input.value = ''; // allow re-uploading the same filename later
3586  });
3587}
3588wireUpload('uploadJsonBtn','uploadJsonInput','dataJson');
3589
3590// single CSV upload — detects timeline vs events from the header row rather than
3591// making the user pick the right one of two separate upload buttons
3592document.getElementById('uploadCsvBtn').addEventListener('click', ()=> document.getElementById('uploadCsvInput').click());
3593document.getElementById('uploadCsvInput').addEventListener('change', ()=>{
3594  const input = document.getElementById('uploadCsvInput');
3595  const status = document.getElementById('csvUploadStatus');
3596  const errBox = document.getElementById('errBox');
3597  const file = input.files[0];
3598  if(!file) return;
3599  const reader = new FileReader();
3600  reader.onload = ()=>{
3601    const text = reader.result;
3602    const firstLine = text.split(/\r?\n/)[0].toLowerCase();
3603    errBox.style.display='none'; status.style.display='none';
3604    if(firstLine.startsWith('section,minute,value,team,label,photo,key,keyvalue')){
3605      const parts = csvToCombined(text);
3606      document.getElementById('metaCsv').value = metaToCSV(parts.meta);
3607      document.getElementById('timelineCsv').value = timelineToCSV(parts.timeline);
3608      document.getElementById('eventsCsv').value = eventsToCSV(parts.events);
3609      document.getElementById('lineupsCsv').value = lineupsToCSV(parts.lineup);
3610      document.getElementById('penaltiesCsv').value = penaltiesToCSV(parts.penalties);
3611      pendingAmbientWindows = parts.ambientWindows || [];
3612      refreshAudioPicker();
3613      // A combined CSV is a complete match, meant to fully replace whatever's
3614      // currently loaded — so this applies immediately rather than requiring
3615      // a separate Apply Data click, which was silently leaving the upload
3616      // sitting unapplied (this is exactly what happened: the status message
3617      // confirmed 125 timeline points etc. loaded, but nothing on screen
3618      // actually changed until Apply Data was clicked separately).
3619      document.getElementById('applyData').click();
3620      status.textContent = '"'+file.name+'" loaded and applied — match info, '+parts.timeline.length+' timeline points, '+parts.events.length+' event(s), '+parts.lineup.length+' lineup player(s), '+pendingAmbientWindows.length+' ambient window(s)'+(parts.penalties.length?', and '+parts.penalties.length+' penalty kick(s)':'')+'.';
3621      status.style.display='block';
3622    }else if(firstLine.startsWith('key,value')){
3623      document.getElementById('metaCsv').value = text;
3624      status.textContent = '"'+file.name+'" detected as a Match Info CSV (header: key,value) and loaded above.';
3625      status.style.display='block';
3626    }else if(firstLine.startsWith('team,role,number')){
3627      document.getElementById('lineupsCsv').value = text;
3628      status.textContent = '"'+file.name+'" detected as a Lineups CSV and loaded above.';
3629      status.style.display='block';
3630    }else if(firstLine.startsWith('minute,value')){
3631      document.getElementById('timelineCsv').value = text;
3632      status.textContent = '"'+file.name+'" detected as a Timeline CSV (header: minute,value) and loaded above.';
3633      status.style.display='block';
3634    }else if(firstLine.startsWith('minute,team')){
3635      document.getElementById('eventsCsv').value = text;
3636      status.textContent = '"'+file.name+'" detected as an Events CSV (header: minute,team,...) and loaded above.';
3637      status.style.display='block';
3638    }else{
3639      errBox.textContent = "Couldn't tell what kind of CSV \""+file.name+"\" is — its first line should start with \"section,minute,...\" (combined), \"key,value\", \"team,role,number\" (lineups), \"minute,value\", or \"minute,team\".";
3640      errBox.style.display='block';
3641    }
3642  };
3643  reader.onerror = ()=>{
3644    errBox.textContent = "Couldn't read that file — "+reader.error;
3645    errBox.style.display='block';
3646  };
3647  reader.readAsText(file);
3648  input.value = '';
3649});
3650
3651document.getElementById('downloadLineupsBtn').addEventListener('click', ()=>{
3652  downloadTextFile('lineups.csv', 'text/csv', document.getElementById('lineupsCsv').value);
3653});
3654document.getElementById('fetchWikiBtn').addEventListener('click', async ()=>{
3655  const btn = document.getElementById('fetchWikiBtn');
3656  const status = document.getElementById('wikiFetchStatus');
3657  const errBox = document.getElementById('errBox');
3658  errBox.style.display = 'none';
3659  const events = csvToEvents(document.getElementById('eventsCsv').value);
3660  const lineup = csvToLineups(document.getElementById('lineupsCsv').value);
3661  const penalties = csvToPenalties(document.getElementById('penaltiesCsv').value);
3662
3663  // collect unique names that still need a photo
3664  const namesNeeded = new Set();
3665  events.forEach(e=>{ if(!e.photo){ const n=(e.label||'').split('·')[0].trim(); if(n) namesNeeded.add(n); } });
3666  lineup.forEach(p=>{ if(!p.photo && p.name) namesNeeded.add(p.name); });
3667  penalties.forEach(p=>{ if(!p.photo && p.taker) namesNeeded.add(p.taker); });
3668
3669  const names = Array.from(namesNeeded);
3670  if(names.length===0){
3671    status.textContent = 'Every row already has a photo (or there are no events/lineup rows loaded yet), and both flag/crest fields already have something in them.';
3672    status.style.display = 'block';
3673    return;
3674  }
3675
3676  btn.disabled = true; btn.textContent = '🖼 Fetching 0/'+names.length+'...';
3677  const found = {}; // name -> url or null
3678  let done = 0;
3679  const BATCH = 5;
3680  for(let i=0;i<names.length;i+=BATCH){
3681    const batch = names.slice(i, i+BATCH);
3682    const results = await Promise.all(batch.map(n=>fetchWikipediaThumbnail(n)));
3683    batch.forEach((n,idx)=>{ found[n]=results[idx]; });
3684    done += batch.length;
3685    btn.textContent = '🖼 Fetching '+Math.min(done,names.length)+'/'+names.length+'...';
3686  }
3687
3688  let filled = 0;
3689  events.forEach(e=>{
3690    if(!e.photo){
3691      const n = (e.label||'').split('·')[0].trim();
3692      if(n && found[n]){ e.photo = found[n]; filled++; }
3693    }
3694  });
3695  let filledLineup = 0;
3696  lineup.forEach(p=>{
3697    if(!p.photo && p.name && found[p.name]){ p.photo = found[p.name]; filledLineup++; }
3698  });
3699  let filledPenalties = 0;
3700  penalties.forEach(p=>{
3701    if(!p.photo && p.taker && found[p.taker]){ p.photo = found[p.taker]; filledPenalties++; }
3702  });
3703
3704  document.getElementById('eventsCsv').value = eventsToCSV(events);
3705  document.getElementById('lineupsCsv').value = lineupsToCSV(lineup);
3706  document.getElementById('penaltiesCsv').value = penaltiesToCSV(penalties);
3707  refreshAudioPicker();
3708
3709  // Without this, the fetched photos (and anything else edited in the CSV
3710  // fields above — venue, competition, formations, etc.) only exist in the
3711  // textareas — the live match object (which is what the 3D lineups panel,
3712  // downloads, and share links all actually read from) never sees them until
3713  // something commits the textareas. A full Apply Data click closes that gap
3714  // but is far too disruptive for what's really just "commit the current CSV
3715  // state" — it resets the playback clock and, critically, closes the entire
3716  // panel (closePanelFn runs unconditionally at the end of Apply Data), which
3717  // meant the results status below was set on an already-hidden panel and
3718  // never seen, and any other pending edits (e.g. venue) got committed here
3719  // too but then silently lost if a narrower fix only touched events/lineup.
3720  // buildParsedMatchFromCsvInputs() is the exact same parsing Apply Data uses,
3721  // so nothing edited in this tab is left behind — just without resetting the
3722  // clock or closing the panel.
3723  try{
3724    match = buildParsedMatchFromCsvInputs();
3725    sampleValue = makeCombinedSampler(match);
3726    homeRgb = hexToRgb01(match.home.color);
3727    awayRgb = hexToRgb01(match.away.color);
3728    document.getElementById('metaLine').textContent = (match.competition||"")+" · "+(match.date||"")+(match.venue?" · "+match.venue:"");
3729    document.getElementById('swatchHome').style.background = match.home.color;
3730    document.getElementById('swatchAway').style.background = match.away.color;
3731    updateFlags();
3732    renderMap();
3733    document.getElementById('nameHome').textContent = (match.home.name||"HOME").toUpperCase();
3734    document.getElementById('nameAway').textContent = (match.away.name||"AWAY").toUpperCase();
3735    document.getElementById('shareHomeFill').style.background = match.home.color;
3736    document.getElementById('shareAwayFill').style.background = match.away.color;
3737    rebuildTicker();
3738    updatePossessionDisplays();
3739    syncAll();
3740  }catch(commitErr){
3741    errBox.textContent = "Photos were fetched into the CSV boxes above, but couldn't commit to the live match: "+commitErr.message+" — fix that and click Apply Data manually.";
3742    errBox.style.display = 'block';
3743  }
3744
3745  btn.disabled = false; btn.textContent = '🖼 Wikipedia photos';
3746  const notFound = names.length - Object.values(found).filter(Boolean).length;
3747  status.textContent = 'Found '+Object.values(found).filter(Boolean).length+' of '+names.length+' names on Wikipedia ('+filled+' event photo(s), '+filledLineup+' lineup photo(s), '+filledPenalties+' penalty photo(s) filled in). '+
3748    (notFound>0 ? notFound+' had no matching page/photo and are still blank — add those manually if needed.' : '')+
3749    ' ⚠ These photos only exist in this browser tab for now — Download or create a Share link below to keep them, or they will be gone if you reload this page or come back to the original file later.';
3750  status.style.display = 'block';
3751});
3752document.getElementById('downloadCombinedBtn').addEventListener('click', ()=>{
3753  const meta = csvToMeta(document.getElementById('metaCsv').value);
3754  const timeline = csvToTimeline(document.getElementById('timelineCsv').value);
3755  const events = csvToEvents(document.getElementById('eventsCsv').value);
3756  const lineup = csvToLineups(document.getElementById('lineupsCsv').value);
3757  const penalties = csvToPenalties(document.getElementById('penaltiesCsv').value);
3758  downloadTextFile('match-combined.csv', 'text/csv', combinedToCSV(meta, timeline, events, lineup, pendingAmbientWindows, penalties));
3759});
3760document.getElementById('downloadPenaltiesBtn').addEventListener('click', ()=>{
3761  downloadTextFile('penalties.csv', 'text/csv', document.getElementById('penaltiesCsv').value);
3762});
3763document.getElementById('downloadMetaBtn').addEventListener('click', ()=>{
3764  downloadTextFile('match-info.csv', 'text/csv', document.getElementById('metaCsv').value);
3765});
3766document.getElementById('downloadTimelineBtn').addEventListener('click', ()=>{
3767  downloadTextFile('timeline.csv', 'text/csv', document.getElementById('timelineCsv').value);
3768});
3769document.getElementById('downloadEventsBtn').addEventListener('click', ()=>{
3770  downloadTextFile('events.csv', 'text/csv', document.getElementById('eventsCsv').value);
3771});
3772document.getElementById('downloadJsonBtn').addEventListener('click', ()=>{
3773  downloadTextFile('match.json', 'application/json', document.getElementById('dataJson').value);
3774});
3775
3776document.getElementById('resetSample').addEventListener('click', ()=>{
3777  document.getElementById('dataJson').value = JSON.stringify(SAMPLE,null,2);
3778  document.getElementById('metaCsv').value = metaToCSV(metaFromMatch(SAMPLE));
3779  document.getElementById('timelineCsv').value = timelineToCSV(SAMPLE.timeline);
3780  document.getElementById('eventsCsv').value = eventsToCSV(SAMPLE.events);
3781  document.getElementById('lineupsCsv').value = lineupsToCSV(SAMPLE.lineup||[]);
3782  document.getElementById('penaltiesCsv').value = penaltiesToCSV(SAMPLE.penalties||[]);
3783  refreshAudioPicker();
3784});
3785
3786function buildParsedMatchFromCsvInputs(){
3787  const timeline = csvToTimeline(document.getElementById('timelineCsv').value);
3788  const events = csvToEvents(document.getElementById('eventsCsv').value);
3789  if(timeline.length<2) throw new Error("Timeline CSV needs a header row plus at least 2 data rows (minute,value).");
3790  if(events.length<1) throw new Error("Events CSV needs a header row plus at least 1 goal (minute,team,label), team must be 'home' or 'away'.");
3791
3792  // meta CSV is the primary source of match info in CSV mode; fields left blank in it
3793  // fall back to whatever's currently in the name/colour/date inputs above
3794  const meta = csvToMeta(document.getElementById('metaCsv').value);
3795  const pick = (k, fallback) => (meta[k]!==undefined && meta[k]!=='') ? meta[k] : fallback;
3796  const homeName = pick('home_name', document.getElementById('inHomeName').value || "Home");
3797  const homeColor = pick('home_color', document.getElementById('inHomeColor').value);
3798  const awayName = pick('away_name', document.getElementById('inAwayName').value || "Away");
3799  const awayColor = pick('away_color', document.getElementById('inAwayColor').value);
3800  const competition = pick('competition', document.getElementById('inComp').value);
3801  const date = pick('date', document.getElementById('inDate').value);
3802  const venue = pick('venue', document.getElementById('inVenue').value);
3803  const venueLatRaw = pick('venue_lat', match.venueLat!==undefined ? match.venueLat : '');
3804  const venueLongRaw = pick('venue_long', match.venueLong!==undefined ? match.venueLong : '');
3805  const venueLat = venueLatRaw!=='' && !isNaN(parseFloat(venueLatRaw)) ? parseFloat(venueLatRaw) : undefined;
3806  const venueLong = venueLongRaw!=='' && !isNaN(parseFloat(venueLongRaw)) ? parseFloat(venueLongRaw) : undefined;
3807  const homeFormation = pick('home_formation', match.homeFormation||'');
3808  const awayFormation = pick('away_formation', match.awayFormation||'');
3809  const homeFlag = pick('home_flag', resolveFlagCode(document.getElementById('inHomeFlag').value));
3810  const awayFlag = pick('away_flag', resolveFlagCode(document.getElementById('inAwayFlag').value));
3811  const ambientAudio = pick('ambient_audio', match.ambientAudio||'');
3812  const kickoffAudio = pick('kickoff_audio', match.kickoffAudio||'');
3813  const endOfNormalTimeAudio = pick('end_of_normal_time_audio', match.endOfNormalTimeAudio||'');
3814  const extraTimeAudio = pick('extra_time_audio', match.extraTimeAudio||'');
3815  const hasExtraTime = pick('has_extra_time', document.getElementById('inHasExtraTime').checked ? '1' : '') === '1';
3816  const maxMinuteRaw = pick('max_minute', pendingMaxMinuteOverride!==undefined ? String(pendingMaxMinuteOverride) : '');
3817  const maxMinuteOverride = maxMinuteRaw!=='' && !isNaN(parseFloat(maxMinuteRaw)) ? parseFloat(maxMinuteRaw) : undefined;
3818  const goalCelebrationAudio = pick('goal_celebration_audio', match.goalCelebrationAudio||'');
3819  const goalCelebrationMinuteRaw = pick('goal_celebration_minute', match.goalCelebrationMinute!==undefined ? match.goalCelebrationMinute : '');
3820  const goalCelebrationMinute = goalCelebrationMinuteRaw!=='' && !isNaN(parseFloat(goalCelebrationMinuteRaw)) ? parseFloat(goalCelebrationMinuteRaw) : undefined;
3821  const possessionHomeRaw = pick('possession_home', pendingPossessionOverride!==undefined ? String(pendingPossessionOverride.home) : (match.possession ? String(match.possession.home) : ''));
3822  const possessionAwayRaw = pick('possession_away', pendingPossessionOverride!==undefined ? String(pendingPossessionOverride.away) : (match.possession ? String(match.possession.away) : ''));
3823  const possession = (possessionHomeRaw!=='' && possessionAwayRaw!=='' && !isNaN(parseFloat(possessionHomeRaw)) && !isNaN(parseFloat(possessionAwayRaw)))
3824    ? { home: parseFloat(possessionHomeRaw), away: parseFloat(possessionAwayRaw) } : undefined;
3825  // variable-count ambient variety clips: any meta key matching home_variety_audio_N / away_variety_audio_N
3826  const homeVarietyAudio = [], awayVarietyAudio = [];
3827  Object.keys(meta).forEach(k=>{
3828    if(/^home_variety_audio_\d+$/.test(k) && meta[k]) homeVarietyAudio.push(meta[k]);
3829    if(/^away_variety_audio_\d+$/.test(k) && meta[k]) awayVarietyAudio.push(meta[k]);
3830  });
3831  const lineup = csvToLineups(document.getElementById('lineupsCsv').value);
3832  const penalties = csvToPenalties(document.getElementById('penaltiesCsv').value);
3833  const penaltyScoredAudio = pick('penalty_scored_audio', match.penaltyScoredAudio||'');
3834  const penaltyMissedAudio = pick('penalty_missed_audio', match.penaltyMissedAudio||'');
3835  // keep the individual fields in sync with whatever the meta CSV specified
3836  document.getElementById('inHomeName').value = homeName;
3837  document.getElementById('inHomeColor').value = homeColor;
3838  document.getElementById('inAwayName').value = awayName;
3839  document.getElementById('inAwayColor').value = awayColor;
3840  document.getElementById('inComp').value = competition;
3841  document.getElementById('inDate').value = date;
3842  document.getElementById('inVenue').value = venue;
3843  document.getElementById('inHomeFlag').value = flagCodeToDisplayName(homeFlag);
3844  document.getElementById('inAwayFlag').value = flagCodeToDisplayName(awayFlag);
3845  document.getElementById('inHasExtraTime').checked = hasExtraTime;
3846
3847  const parsed = {
3848    home:{ name: homeName, color: homeColor },
3849    away:{ name: awayName, color: awayColor },
3850    competition, date, venue, venueLat, venueLong,
3851    homeFormation, awayFormation, homeFlag, awayFlag, ambientAudio,
3852    kickoffAudio, endOfNormalTimeAudio, extraTimeAudio, hasExtraTime, goalCelebrationAudio, goalCelebrationMinute,
3853    penaltyScoredAudio, penaltyMissedAudio,
3854    maxMinute: maxMinuteOverride,
3855    possession,
3856    ambientWindows: pendingAmbientWindows,
3857    homeVarietyAudio, awayVarietyAudio, lineup, penalties,
3858    timeline, events
3859  };
3860  pendingMaxMinuteOverride = undefined;
3861  pendingPossessionOverride = undefined;
3862  return parsed;
3863}
3864document.getElementById('applyData').addEventListener('click', ()=>{
3865  const errBox = document.getElementById('errBox');
3866  errBox.style.display='none';
3867  try{
3868    let parsed;
3869    if(panelMode==='csv'){
3870      parsed = buildParsedMatchFromCsvInputs();
3871    }else{
3872      parsed = JSON.parse(document.getElementById('dataJson').value);
3873      if(!parsed.timeline || !Array.isArray(parsed.timeline)) throw new Error("Missing 'timeline' array of [minute, value] pairs.");
3874      if(!parsed.events || !Array.isArray(parsed.events)) throw new Error("Missing 'events' array.");
3875    }
3876    if(!parsed.maxMinute){
3877      const timelineMax = parsed.timeline.length ? Math.max(...parsed.timeline.map(p=>p[0])) : 0;
3878      const eventsMax = (parsed.events && parsed.events.length) ? Math.max(...parsed.events.map(e=>e.minute)) : 0;
3879      const ambientMax = (parsed.ambientWindows && parsed.ambientWindows.length) ? Math.max(...parsed.ambientWindows.map(w=>w.end)) : 0;
3880      // Whichever source reflects the latest minute wins — a stoppage-time goal
3881      // (FotMob's overloadTime is already folded into event.minute) or a longer
3882      // ambient window can extend past what the momentum timeline itself covers,
3883      // and the match's true duration should never be clipped to just one of these.
3884      parsed.maxMinute = Math.max(timelineMax, eventsMax, ambientMax);
3885    }
3886    parsed.home = parsed.home || {name:"Home", color:"#2451e0"};
3887    parsed.away = parsed.away || {name:"Away", color:"#ffffff"};
3888
3889    match = parsed;
3890    sampleValue = makeCombinedSampler(match);
3891    homeRgb = hexToRgb01(match.home.color);
3892    awayRgb = hexToRgb01(match.away.color);
3893    seenEvents.clear();
3894    seenPenalties.clear();
3895    currentMinute = 0; clockT = 0; pause();
3896    playedKickoffStinger = false;
3897    playedExtraTimeStinger = false;
3898    playedShootoutIntro = false;
3899    playedHighlights.clear();
3900    clockSlowLocked = false;
3901    homeDominanceAccum = 0; awayDominanceAccum = 0; ambientVarietyCooldownUntil = 0;
3902    activeAmbientWindow = null; activeAmbientWindowPlayer = null; activeAmbientWindowPlayer2 = null;
3903    ambientClipCache.forEach(bySlot=>{ Object.values(bySlot).forEach(el=>{ try{ el.pause(); }catch(e){} }); });
3904    ambientClipCache.clear();
3905
3906    document.getElementById('metaLine').textContent = (match.competition||"")+" · "+(match.date||"")+(match.venue?" · "+match.venue:"");
3907    document.getElementById('swatchHome').style.background = match.home.color;
3908    document.getElementById('swatchAway').style.background = match.away.color;
3909    updateFlags();
3910    renderMap();
3911    document.getElementById('nameHome').textContent = (match.home.name||"HOME").toUpperCase();
3912    document.getElementById('nameAway').textContent = (match.away.name||"AWAY").toUpperCase();
3913    document.getElementById('shareHomeFill').style.background = match.home.color;
3914    document.getElementById('shareAwayFill').style.background = match.away.color;
3915    // Previously only the CSV apply path synced these — meaning any JSON-path
3916    // apply (which is every shared-link load, since loadParsedMatchViaJsonPath
3917    // always goes through JSON) left the individual fields showing whatever
3918    // match was loaded *before*, even though match itself, the JSON textarea,
3919    // and the actual visualisation were all already correctly updated.
3920    document.getElementById('inHomeName').value = match.home.name || '';
3921    document.getElementById('inHomeColor').value = match.home.color || '';
3922    document.getElementById('inAwayName').value = match.away.name || '';
3923    document.getElementById('inAwayColor').value = match.away.color || '';
3924    document.getElementById('inComp').value = match.competition || '';
3925    document.getElementById('inDate').value = match.date || '';
3926    document.getElementById('inVenue').value = match.venue || '';
3927    document.getElementById('inHomeFlag').value = flagCodeToDisplayName(match.homeFlag || '');
3928    document.getElementById('inAwayFlag').value = flagCodeToDisplayName(match.awayFlag || '');
3929    document.getElementById('inHasExtraTime').checked = !!match.hasExtraTime;
3930
3931    rebuildTicker();
3932    updatePossessionDisplays();
3933    syncAll();
3934    closePanelFn();
3935  }catch(err){
3936    errBox.textContent = "Couldn't load data — "+err.message;
3937    errBox.style.display='block';
3938  }
3939});
3940
3941/* keep the simple name/color inputs in sync with JSON for convenience */
3942['inHomeName','inHomeColor','inAwayName','inAwayColor','inComp','inDate','inVenue','inHomeFlag','inAwayFlag'].forEach(id=>{
3943  document.getElementById(id).addEventListener('change', ()=>{
3944    try{
3945      const parsed = JSON.parse(document.getElementById('dataJson').value);
3946      parsed.home = parsed.home||{}; parsed.away = parsed.away||{};
3947      parsed.home.name = document.getElementById('inHomeName').value;
3948      parsed.home.color = document.getElementById('inHomeColor').value;
3949      parsed.away.name = document.getElementById('inAwayName').value;
3950      parsed.away.color = document.getElementById('inAwayColor').value;
3951      parsed.competition = document.getElementById('inComp').value;
3952      parsed.date = document.getElementById('inDate').value;
3953      parsed.venue = document.getElementById('inVenue').value;
3954      parsed.homeFlag = resolveFlagCode(document.getElementById('inHomeFlag').value);
3955      parsed.awayFlag = resolveFlagCode(document.getElementById('inAwayFlag').value);
3956      document.getElementById('dataJson').value = JSON.stringify(parsed,null,2);
3957    }catch(e){}
3958    // This used to only update the JSON preview above — meta CSV (which
3959    // Apply Data's CSV path actually reads from, prioritised over this field)
3960    // never got the fresh value, so if metaCsv already had *any* value for
3961    // this key from a previous load, typing a new one here was silently
3962    // discarded the moment Apply Data ran. Keeping both representations in
3963    // sync means it no longer matters which one was most recently edited.
3964    try{
3965      const metaBox = document.getElementById('metaCsv');
3966      const meta = csvToMeta(metaBox.value);
3967      meta.home_name = document.getElementById('inHomeName').value;
3968      meta.home_color = document.getElementById('inHomeColor').value;
3969      meta.away_name = document.getElementById('inAwayName').value;
3970      meta.away_color = document.getElementById('inAwayColor').value;
3971      meta.competition = document.getElementById('inComp').value;
3972      meta.date = document.getElementById('inDate').value;
3973      meta.venue = document.getElementById('inVenue').value;
3974      meta.home_flag = resolveFlagCode(document.getElementById('inHomeFlag').value);
3975      meta.away_flag = resolveFlagCode(document.getElementById('inAwayFlag').value);
3976      metaBox.value = metaToCSV(meta);
3977    }catch(e){}
3978  });
3979});
3980
3981/* ---- init ---- */
3982// Country list for the searchable flag inputs — ISO 3166-1 alpha-2 codes
3983// (lowercase, matching flagcdn.com's URL scheme) using names as commonly
3984// used in football commentary, plus the four UK home nations, which compete
3985// as separate FIFA members despite not being ISO 3166-1 countries in their
3986// own right (flagcdn supports these specific gb-xxx subdivision codes).
3987const FIFA_NATIONS = [
3988  {name:"Afghanistan",code:"af"},{name:"Albania",code:"al"},{name:"Algeria",code:"dz"},{name:"American Samoa",code:"as"},
3989  {name:"Andorra",code:"ad"},{name:"Angola",code:"ao"},{name:"Anguilla",code:"ai"},{name:"Antigua and Barbuda",code:"ag"},
3990  {name:"Argentina",code:"ar"},{name:"Armenia",code:"am"},{name:"Aruba",code:"aw"},{name:"Australia",code:"au"},
3991  {name:"Austria",code:"at"},{name:"Azerbaijan",code:"az"},{name:"Bahamas",code:"bs"},{name:"Bahrain",code:"bh"},
3992  {name:"Bangladesh",code:"bd"},{name:"Barbados",code:"bb"},{name:"Belarus",code:"by"},{name:"Belgium",code:"be"},
3993  {name:"Belize",code:"bz"},{name:"Benin",code:"bj"},{name:"Bermuda",code:"bm"},{name:"Bhutan",code:"bt"},
3994  {name:"Bolivia",code:"bo"},{name:"Bosnia and Herzegovina",code:"ba"},{name:"Botswana",code:"bw"},{name:"Brazil",code:"br"},
3995  {name:"British Virgin Islands",code:"vg"},{name:"Brunei",code:"bn"},{name:"Bulgaria",code:"bg"},{name:"Burkina Faso",code:"bf"},
3996  {name:"Burundi",code:"bi"},{name:"Cambodia",code:"kh"},{name:"Cameroon",code:"cm"},{name:"Canada",code:"ca"},
3997  {name:"Cape Verde",code:"cv"},{name:"Cayman Islands",code:"ky"},{name:"Central African Republic",code:"cf"},{name:"Chad",code:"td"},
3998  {name:"Chile",code:"cl"},{name:"China",code:"cn"},{name:"Chinese Taipei",code:"tw"},{name:"Colombia",code:"co"},
3999  {name:"Comoros",code:"km"},{name:"Congo",code:"cg"},{name:"Cook Islands",code:"ck"},{name:"Costa Rica",code:"cr"},
4000  {name:"Croatia",code:"hr"},{name:"Cuba",code:"cu"},{name:"Curaçao",code:"cw"},{name:"Cyprus",code:"cy"},
4001  {name:"Czech Republic",code:"cz"},{name:"DR Congo",code:"cd"},{name:"Denmark",code:"dk"},{name:"Djibouti",code:"dj"},
4002  {name:"Dominica",code:"dm"},{name:"Dominican Republic",code:"do"},{name:"Ecuador",code:"ec"},{name:"Egypt",code:"eg"},
4003  {name:"El Salvador",code:"sv"},{name:"England",code:"gb-eng"},{name:"Equatorial Guinea",code:"gq"},{name:"Eritrea",code:"er"},
4004  {name:"Estonia",code:"ee"},{name:"Eswatini",code:"sz"},{name:"Ethiopia",code:"et"},{name:"Faroe Islands",code:"fo"},
4005  {name:"Fiji",code:"fj"},{name:"Finland",code:"fi"},{name:"France",code:"fr"},{name:"Gabon",code:"ga"},
4006  {name:"Gambia",code:"gm"},{name:"Georgia",code:"ge"},{name:"Germany",code:"de"},{name:"Ghana",code:"gh"},
4007  {name:"Gibraltar",code:"gi"},{name:"Greece",code:"gr"},{name:"Grenada",code:"gd"},{name:"Guam",code:"gu"},
4008  {name:"Guatemala",code:"gt"},{name:"Guinea",code:"gn"},{name:"Guinea-Bissau",code:"gw"},{name:"Guyana",code:"gy"},
4009  {name:"Haiti",code:"ht"},{name:"Honduras",code:"hn"},{name:"Hong Kong",code:"hk"},{name:"Hungary",code:"hu"},
4010  {name:"Iceland",code:"is"},{name:"India",code:"in"},{name:"Indonesia",code:"id"},{name:"Iran",code:"ir"},
4011  {name:"Iraq",code:"iq"},{name:"Ireland",code:"ie"},{name:"Israel",code:"il"},{name:"Italy",code:"it"},
4012  {name:"Ivory Coast",code:"ci"},{name:"Jamaica",code:"jm"},{name:"Japan",code:"jp"},{name:"Jordan",code:"jo"},
4013  {name:"Kazakhstan",code:"kz"},{name:"Kenya",code:"ke"},{name:"Kosovo",code:"xk"},{name:"Kuwait",code:"kw"},
4014  {name:"Kyrgyzstan",code:"kg"},{name:"Laos",code:"la"},{name:"Latvia",code:"lv"},{name:"Lebanon",code:"lb"},
4015  {name:"Lesotho",code:"ls"},{name:"Liberia",code:"lr"},{name:"Libya",code:"ly"},{name:"Liechtenstein",code:"li"},
4016  {name:"Lithuania",code:"lt"},{name:"Luxembourg",code:"lu"},{name:"Macau",code:"mo"},{name:"Madagascar",code:"mg"},
4017  {name:"Malawi",code:"mw"},{name:"Malaysia",code:"my"},{name:"Maldives",code:"mv"},{name:"Mali",code:"ml"},
4018  {name:"Malta",code:"mt"},{name:"Mauritania",code:"mr"},{name:"Mauritius",code:"mu"},{name:"Mexico",code:"mx"},
4019  {name:"Moldova",code:"md"},{name:"Mongolia",code:"mn"},{name:"Montenegro",code:"me"},{name:"Montserrat",code:"ms"},
4020  {name:"Morocco",code:"ma"},{name:"Mozambique",code:"mz"},{name:"Myanmar",code:"mm"},{name:"Namibia",code:"na"},
4021  {name:"Nepal",code:"np"},{name:"Netherlands",code:"nl"},{name:"New Caledonia",code:"nc"},{name:"New Zealand",code:"nz"},
4022  {name:"Nicaragua",code:"ni"},{name:"Niger",code:"ne"},{name:"Nigeria",code:"ng"},{name:"North Korea",code:"kp"},
4023  {name:"North Macedonia",code:"mk"},{name:"Northern Ireland",code:"gb-nir"},{name:"Norway",code:"no"},{name:"Oman",code:"om"},
4024  {name:"Pakistan",code:"pk"},{name:"Palestine",code:"ps"},{name:"Panama",code:"pa"},{name:"Papua New Guinea",code:"pg"},
4025  {name:"Paraguay",code:"py"},{name:"Peru",code:"pe"},{name:"Philippines",code:"ph"},{name:"Poland",code:"pl"},
4026  {name:"Portugal",code:"pt"},{name:"Puerto Rico",code:"pr"},{name:"Qatar",code:"qa"},{name:"Romania",code:"ro"},
4027  {name:"Russia",code:"ru"},{name:"Rwanda",code:"rw"},{name:"Samoa",code:"ws"},{name:"San Marino",code:"sm"},
4028  {name:"Sao Tome and Principe",code:"st"},{name:"Saudi Arabia",code:"sa"},{name:"Scotland",code:"gb-sct"},{name:"Senegal",code:"sn"},
4029  {name:"Serbia",code:"rs"},{name:"Seychelles",code:"sc"},{name:"Sierra Leone",code:"sl"},{name:"Singapore",code:"sg"},
4030  {name:"Slovakia",code:"sk"},{name:"Slovenia",code:"si"},{name:"Solomon Islands",code:"sb"},{name:"Somalia",code:"so"},
4031  {name:"South Africa",code:"za"},{name:"South Korea",code:"kr"},{name:"South Sudan",code:"ss"},{name:"Spain",code:"es"},
4032  {name:"Sri Lanka",code:"lk"},{name:"St Kitts and Nevis",code:"kn"},{name:"St Lucia",code:"lc"},{name:"St Vincent and the Grenadines",code:"vc"},
4033  {name:"Sudan",code:"sd"},{name:"Suriname",code:"sr"},{name:"Sweden",code:"se"},{name:"Switzerland",code:"ch"},
4034  {name:"Syria",code:"sy"},{name:"Tahiti",code:"pf"},{name:"Tajikistan",code:"tj"},{name:"Tanzania",code:"tz"},
4035  {name:"Thailand",code:"th"},{name:"Timor-Leste",code:"tl"},{name:"Togo",code:"tg"},{name:"Tonga",code:"to"},
4036  {name:"Trinidad and Tobago",code:"tt"},{name:"Tunisia",code:"tn"},{name:"Turkey",code:"tr"},{name:"Turkmenistan",code:"tm"},
4037  {name:"Turks and Caicos Islands",code:"tc"},{name:"Uganda",code:"ug"},{name:"Ukraine",code:"ua"},{name:"United Arab Emirates",code:"ae"},
4038  {name:"United States",code:"us"},{name:"Uruguay",code:"uy"},{name:"Uzbekistan",code:"uz"},{name:"Vanuatu",code:"vu"},
4039  {name:"Venezuela",code:"ve"},{name:"Vietnam",code:"vn"},{name:"Wales",code:"gb-wls"},{name:"Yemen",code:"ye"},
4040  {name:"Zambia",code:"zm"},{name:"Zimbabwe",code:"zw"}
4041];
4042const FIFA_NATIONS_BY_NAME = {}; FIFA_NATIONS.forEach(n=>FIFA_NATIONS_BY_NAME[n.name.toLowerCase()]=n.code);
4043const FIFA_NATIONS_BY_CODE = {}; FIFA_NATIONS.forEach(n=>FIFA_NATIONS_BY_CODE[n.code.toLowerCase()]=n.name);
4044// Typed value can be a nation name (from the search list) or a raw code
4045// (for anything not in the list, or for anyone who prefers typing it
4046// directly) — this resolves either into the actual code the app stores.
4047function resolveFlagCode(raw){
4048  if(!raw) return '';
4049  const t = raw.trim();
4050  if(/^https?:\/\//i.test(t)) return t; // a full image URL (e.g. a club crest) — keep exactly as pasted, case intact
4051  const byName = FIFA_NATIONS_BY_NAME[t.toLowerCase()];
4052  if(byName) return byName;
4053  return t.toLowerCase();
4054}
4055// Reverse direction: showing a friendly name in the input when a match is
4056// loaded with a known code, falling back to the raw code for anything not
4057// in the list (a custom subdivision code someone typed directly, etc).
4058function flagCodeToDisplayName(code){
4059  if(!code) return '';
4060  return FIFA_NATIONS_BY_CODE[code.trim().toLowerCase()] || code;
4061}
4062function populateFifaNationsDatalist(){
4063  const dl = document.getElementById('fifaNationsList');
4064  if(!dl || dl.childElementCount) return;
4065  FIFA_NATIONS.slice().sort((a,b)=>
4065a.name.localeCompare(b.name)).forEach(n=>{
4066    const opt = document.createElement('option');
4067    opt.value = n.name;
4068    dl.appendChild(opt);
4069  });
4070}
4071populateFifaNationsDatalist();
4072function flagUrl(code){
4073  if(!code) return '';
4074  const c = code.trim();
4075  if(/^https?:\/\//i.test(c)) return c; // already a direct image URL (e.g. a club crest) — use as-is
4076  return 'https://flagcdn.com/48x36/'+c.toLowerCase()+'.png';
4077}
4078function updateFlags(){
4079  const homeImg = document.getElementById('flagHome');
4080  const awayImg = document.getElementById('flagAway');
4081  if(match.homeFlag){ homeImg.src = flagUrl(match.homeFlag); homeImg.style.display='block'; homeImg.onerror=()=>{homeImg.style.display='none';}; }
4082  else homeImg.style.display = 'none';
4083  if(match.awayFlag){ awayImg.src = flagUrl(match.awayFlag); awayImg.style.display='block'; awayImg.onerror=()=>{awayImg.style.display='none';}; }
4084  else awayImg.style.display = 'none';
4085}
4086document.getElementById('swatchHome').style.background = match.home.color;
4087document.getElementById('swatchAway').style.background = match.away.color;
4088updateFlags();
4089renderMap();
4090document.getElementById('nameHome').textContent = match.home.name.toUpperCase();
4091document.getElementById('nameAway').textContent = match.away.name.toUpperCase();
4092document.getElementById('shareHomeFill').style.background = match.home.color;
4093document.getElementById('shareAwayFill').style.background = match.away.color;
4094document.getElementById('metaLine').textContent = match.competition+" · "+match.date+(match.venue?" · "+match.venue:"");
4095document.getElementById('inHomeName').value = match.home.name;
4096document.getElementById('inHomeColor').value = match.home.color;
4097document.getElementById('inAwayName').value = match.away.name;
4098document.getElementById('inAwayColor').value = match.away.color;
4099document.getElementById('inComp').value = match.competition;
4100document.getElementById('inDate').value = match.date;
4101document.getElementById('inVenue').value = match.venue || '';
4102document.getElementById('inHomeFlag').value = flagCodeToDisplayName(match.homeFlag || '');
4103document.getElementById('inAwayFlag').value = flagCodeToDisplayName(match.awayFlag || '');
4104document.getElementById('inHasExtraTime').checked = !!match.hasExtraTime;
4105rebuildTicker();
4106updatePossessionDisplays();
4107syncAll();
4108tlog('Initialisation complete. App should be interactive now.');
4109
4110
4111/* ---- sharing: view-only and fully-configurable links, Gist-backed (short URL,
4112   updatable in place) with an automatic compressed-URL fallback ---- */
4113const GIST_PROXY_BASE = 'https://geo-mapper-gist-proxy.bconway.workers.dev';
4114const GIST_SHARE_FILENAME = 'tidal-match.json';
4115
4116function copyToClipboard(text){
4117  if(navigator.clipboard && navigator.clipboard.writeText) return navigator.clipboard.writeText(text);
4118  return Promise.reject(new Error('Clipboard API unavailable'));
4119}
4120
4121/* Loads a parsed match object by piggybacking on the existing, already-tested
4122   JSON-mode apply path, instead of duplicating its validation/setup logic. */
4123function loadParsedMatchViaJsonPath(parsed){
4124  // IMPORTANT ordering: clicking the JSON tab button runs its own handler,
4125  // which populates the textarea FROM THE CURRENT match (a convenience for
4126  // normal editing) — if the incoming shared data is written before that
4127  // click, this immediately overwrites it with the stale old match, and
4128  // Apply Data then successfully (and silently) reapplies the WRONG match
4129  // with no error at all, since the stale JSON is perfectly valid. This is
4130  // exactly what was happening. Setting the real data AFTER the tab click
4131  // means it's the last thing to touch the textarea before Apply runs.
4132  const jsonTabBtn = document.querySelector('#formatToggle [data-mode="json"]');
4133  if(jsonTabBtn) jsonTabBtn.click();
4134  document.getElementById('dataJson').value = JSON.stringify(parsed);
4135  document.getElementById('applyData').click();
4136}
4137
4138/* View-only mode: no further configuration possible, per spec — hide the
4139   Data & teams button so the panel (and therefore Share tab, edit fields,
4140   upload/download, everything) is unreachable. Playback controls are untouched. */
4141function enterViewOnlyMode(){
4142  const btn = document.getElementById('dataBtn');
4143  if(btn) btn.style.display = 'none';
4144}
4145
4146/* Share links serialize whatever's currently in `match` — NOT whatever's
4147   sitting unsaved in the CSV/JSON textareas. If someone fills in the Lineups
4148   CSV and switches straight to this tab without clicking Apply Data first,
4149   the link goes out with no lineup data and nothing visibly warns them.
4150   This surfaces that gap directly, comparing match.lineup against whatever
4151   the Lineups CSV textarea currently parses to. */
4152function updateShareLineupWarning(){
4153  const warnEl = document.getElementById('shareLineupWarning');
4154  if(!warnEl) return;
4155  const loadedCount = (match.lineup || []).length;
4156  let csvCount = 0;
4157  try{ csvCount = csvToLineups(document.getElementById('lineupsCsv').value).length; }catch(e){}
4158  if(loadedCount === 0 && csvCount === 0){
4159    warnEl.style.display = 'none';
4160    return;
4161  }
4162  if(csvCount !== loadedCount){
4163    warnEl.style.display = 'block';
4164    warnEl.textContent = 'The Lineups CSV has '+csvCount+' player row(s) not yet applied to this match ('+loadedCount+' currently loaded) — click Apply Data on the CSV tab first, or the share link will not include them.';
4165  }else if(loadedCount === 0){
4166    warnEl.style.display = 'block';
4167    warnEl.textContent = 'No lineup data is currently loaded on this match — the share link will not include a Lineups panel until you fill in the Lineups CSV and click Apply Data.';
4168  }else{
4169    warnEl.style.display = 'none';
4170  }
4171}
4172
4173let currentShareMode = 'view';
4174/* Tracked per-session (not persisted across reloads) so repeat "Create share
4175   link" clicks in the SAME editing session update the SAME Gist in place —
4176   the URL the creator already sent out keeps working and just shows the
4177   latest data. A fresh browser session (or "start a new link") makes a new one. */
4178let shareGistId = { view: null, edit: null };
4179
4180function setShareMode(mode){
4181  currentShareMode = mode;
4182  document.querySelectorAll('#shareModeToggle [data-sharemode]').forEach(b=>b.classList.toggle('active', b.dataset.sharemode===mode));
4183  updateShareButtonLabel();
4184}
4185function updateShareButtonLabel(){
4186  document.getElementById('shareCreateBtn').textContent = shareGistId[currentShareMode] ? 'Update share link' : 'Create share link';
4187}
4188document.querySelectorAll('#shareModeToggle [data-sharemode]').forEach(btn=>{
4189  btn.addEventListener('click', ()=> setShareMode(btn.dataset.sharemode));
4190});
4191document.getElementById('shareNewLinkBtn').addEventListener('click', ()=>{
4192  shareGistId[currentShareMode] = null;
4193  updateShareButtonLabel();
4194  const statusEl = document.getElementById('shareStatus');
4195  statusEl.style.display = 'block';
4196  statusEl.textContent = 'Next click will create a brand-new link instead of updating the previous one.';
4197});
4198
4199/* Mirrors Geo Mapper's own createGist()/loadGist(): POST to create, PATCH
4200   (with the id as a query param) to update in place, falling back to a fresh
4201   POST if the PATCH fails outright (network/CORS) or comes back non-ok (e.g.
4202   the gist was deleted). The one difference from Geo Mapper: this calls the
4203   Worker at its full workers.dev URL rather than a same-origin relative path,
4204   since Tidal isn't served behind that Worker's path-based proxy route —
4205   that part is a reasonable extrapolation of Geo Mapper's own working code,
4206   not yet confirmed against the live Worker end-to-end. */
4207async function createGistForShare(mode){
4208  const timestamp = new Date().toISOString();
4209  const homeName = (match.home && match.home.name) || 'Home';
4210  const awayName = (match.away && match.away.name) || 'Away';
4211  const competition = match.competition || '';
4212  const content = LZString.compressToEncodedURIComponent(JSON.stringify(match));
4213  const gistData = {
4214    description: 'Tidal match share ('+mode+'): '+homeName+' vs '+awayName+(competition?' — '+competition:'')+' ('+timestamp+')',
4215    files: { [GIST_SHARE_FILENAME]: { content } }
4216  };
4217  const existingId = shareGistId[mode];
4218  if(!existingId) gistData.public = false;
4219  const url = existingId ? (GIST_PROXY_BASE+'/gist?id='+existingId) : (GIST_PROXY_BASE+'/gist');
4220  const method = existingId ? 'PATCH' : 'POST';
4221  let response;
4222  try{
4223    response = await fetch(url, {
4224      method,
4225      headers: { 'Content-Type':'application/json', 'Accept':'application/vnd.github.v3+json' },
4226      body: JSON.stringify(gistData)
4227    });
4228  }catch(networkError){
4229    if(existingId){
4230      tlog('Gist PATCH network error (possible CORS/Worker restriction) — retrying as a new Gist: '+networkError.message);
4231      shareGistId[mode] = null;
4232      return createGistForShare(mode);
4233    }
4234    throw networkError;
4235  }
4236  if(!response.ok){
4237    if(existingId){
4238      tlog('Gist PATCH failed (HTTP '+response.status+') — retrying as a new Gist.');
4239      shareGistId[mode] = null;
4240      return createGistForShare(mode);
4241    }
4242    let msg = response.statusText;
4243    try{ const errBody = await response.json(); if(errBody && errBody.message) msg = errBody.message; }catch(e){}
4244    throw new Error('HTTP '+response.status+' '+msg);
4245  }
4246  const gist = await response.json();
4247  shareGistId[mode] = gist.id;
4248  return gist.id;
4249}
4250
4251document.getElementById('shareCreateBtn').addEventListener('click', async ()=>{
4252  updateShareLineupWarning();
4253  const statusEl = document.getElementById('shareStatus');
4254  const matchLabel = (match.home && match.home.name || '?')+' vs '+(match.away && match.away.name || '?');
4255  statusEl.style.display = 'block';
4256  statusEl.textContent = (shareGistId[currentShareMode] ? 'Updating gist for ' : 'Creating gist for ')+matchLabel+'...';
4257  try{
4258    const gistId = await createGistForShare(currentShareMode);
4259    // Query string, not a #fragment: fragments are never sent to any server,
4260    // so a link-preview crawler (WhatsApp, Slack, etc.) can only ever see a
4261    // static, generic preview if the match info lives after a #. A short
4262    // gist id in the query string is small enough that this is safe.
4263    const url = window.location.origin + window.location.pathname + '?mode='+currentShareMode+'&gist='+gistId;
4264    document.getElementById('shareUrlOutput').value = url;
4265    statusEl.textContent = 'Short link ready for '+matchLabel+' — this same link will pick up future updates too.';
4266    updateShareButtonLabel();
4267    tlog('Gist share link ready ('+currentShareMode+', '+matchLabel+'): '+url);
4268  }catch(err){
4269    try{
4270      const compressed = LZString.compressToEncodedURIComponent(JSON.stringify(match));
4271      const url = window.location.origin + window.location.pathname + '#mode='+currentShareMode+'&data='+compressed;
4272      document.getElementById('shareUrlOutput').value = url;
4273      statusEl.textContent = "Couldn't create a Gist link ("+err.message+") — using a compressed link instead. This one can't be updated in place; changing the match later means generating and re-sending a new link.";
4274      tlog('Gist creation failed ('+err.message+'), fell back to compressed URL, length='+url.length);
4275    }catch(err2){
4276      statusEl.textContent = 'Failed to create any share link: '+err2.message;
4277      tlog('Share link generation failed entirely: '+err2.message);
4278    }
4279  }
4280});
4281document.getElementById('shareCopyBtn').addEventListener('click', ()=>{
4282  const val = document.getElementById('shareUrlOutput').value;
4283  if(!val) return;
4284  copyToClipboard(val).then(()=>tlog('Share URL copied.')).catch(()=>tlog('Copy failed — select the text manually.'));
4285});
4286
4287function parseHashParams(hashOrUrl){
4288  const hashIdx = hashOrUrl.indexOf('#');
4289  const searchIdx = hashOrUrl.indexOf('?');
4290  const cutIdx = hashIdx>=0 ? hashIdx : searchIdx;
4291  const hash = cutIdx>=0 ? hashOrUrl.slice(cutIdx+1) : hashOrUrl;
4292  const params = {};
4293  hash.split('&').forEach(pair=>{
4294    if(!pair) return;
4295    const idx = pair.indexOf('=');
4296    if(idx<0) return;
4297    params[decodeURIComponent(pair.slice(0,idx))] = pair.slice(idx+1);
4298  });
4299  return params;
4300}
4301
4302async function loadShareLink(hashOrUrl){
4303  const params = parseHashParams(hashOrUrl);
4304  const errBox = document.getElementById('errBox');
4305  errBox.style.display = 'none';
4306  /* default to view-only for any link we don't recognise the mode of — the
4307     safer default for something someone sent you is "just watch it". */
4308  const mode = params.mode==='edit' ? 'edit' : 'view';
4309  try{
4310    let parsed;
4311    if(params.gist){
4312      const response = await fetch(GIST_PROXY_BASE+'/gist?id='+encodeURIComponent(params.gist)+'&_='+Date.now(), {
4313        cache: 'no-store',
4314        headers: { 'Accept':'application/vnd.github.v3+json' }
4315      });
4316      if(!response.ok) throw new Error('Failed to load gist: '+response.statusText);
4317      const gist = await response.json();
4318      const file = gist.files && gist.files[GIST_SHARE_FILENAME];
4319      if(!file) throw new Error('Gist did not contain a '+GIST_SHARE_FILENAME+' file.');
4320      // GitHub's Gist API truncates file content over its size threshold in
4321      // this response and sets truncated:true, expecting a follow-up fetch
4322      // of raw_url for the full text. A match with several ambient windows
4323      // and goal clips easily runs to multiple MB once compressed, which is
4324      // well past that threshold — without this check we were silently
4325      // trying to decompress a partial string, which is exactly why this
4326      // failed with "Decompression returned nothing" for audio-heavy matches
4327      // while smaller ones (like the local demo) worked fine.
4328      let rawContent = file.content;
4329      if(file.truncated && file.raw_url){
4330        const rawResponse = await fetch(file.raw_url+'?_='+Date.now(), { cache: 'no-store' });
4331        if(!rawResponse.ok) throw new Error('Gist content was truncated and the raw_url fetch failed: '+rawResponse.statusText);
4332        rawContent = await rawResponse.text();
4333      }
4334      const decompressed = LZString.decompressFromEncodedURIComponent(rawContent);
4335      if(!decompressed) throw new Error('Decompression returned nothing.');
4336      parsed = JSON.parse(decompressed);
4337      shareGistId[mode] = params.gist;
4337 // lets this session update the same link later
4338    }else if(params.data){
4339      const decompressed = LZString.decompressFromEncodedURIComponent(params.data);
4340      if(!decompressed) throw new Error('Decompression returned nothing — link may be truncated or corrupted.');
4341      parsed = JSON.parse(decompressed);
4342    }else{
4343      throw new Error("Link doesn't contain a recognised gist= or data= fragment.");
4344    }
4345    loadParsedMatchViaJsonPath(parsed);
4346    // Apply Data's own try/catch swallows errors into #errBox, which lives
4347    // inside the (closed, and in view mode permanently hidden) Data & teams
4348    // panel — invisible during an automatic load-on-page-open. Verifying
4349    // match actually picked up the new team names is a cheap, reliable way
4350    // to detect a silent failure and surface the real reason instead of just
4351    // showing whatever match was loaded before (the embedded sample) with no
4352    // explanation at all.
4353    const appliedOk = match.home && match.away && parsed.home && parsed.away
4354      && match.home.name === parsed.home.name && match.away.name === parsed.away.name;
4355    if(!appliedOk){
4356      const innerErr = errBox.textContent || 'Unknown error (Apply Data did not report one).';
4357      const banner = document.getElementById('shareLoadError');
4358      document.getElementById('shareLoadErrorText').textContent =
4359        "Couldn't load the shared match — showing the default match instead. Reason: "+innerErr;
4360      banner.style.display = 'block';
4361      tlog('Shared match FAILED to apply (showing fallback match). Gist/link contained: '
4362        +(parsed.home && parsed.home.name || '?')+' vs '+(parsed.away && parsed.away.name || '?')
4363        +'. Reason: '+innerErr);
4364    }else{
4365      if(mode==='view') enterViewOnlyMode();
4366      tlog('Loaded shared match ('+mode+' mode): '+match.home.name+' vs '+match.away.name);
4367    }
4368  }catch(err){
4369    errBox.textContent = "Couldn't load that link — "+err.message;
4370    errBox.style.display = 'block';
4371    // Same reasoning as the appliedOk branch above: errBox lives inside the
4372    // closed (and in view mode, permanently hidden) panel, so on an automatic
4373    // page-load share this would otherwise fail in complete silence — no
4374    // banner, no log line, just quietly falling back to whatever match was
4375    // already loaded (the embedded default). This covers everything that can
4376    // go wrong before Apply Data is even reached: fetch failures, a missing
4377    // gist file, decompression failures, malformed JSON.
4378    const banner = document.getElementById('shareLoadError');
4379    document.getElementById('shareLoadErrorText').textContent =
4380      "Couldn't load the shared match — showing the default match instead. Reason: "+err.message;
4381    banner.style.display = 'block';
4382    tlog('Shared match FAILED to load (showing fallback match). Reason: '+err.message);
4383  }
4384}
4385document.getElementById('loadShareBtn').addEventListener('click', ()=>{
4386  const val = document.getElementById('loadShareUrl').value.trim();
4387  if(val) loadShareLink(val);
4388});
4389document.getElementById('shareLoadErrorClose').addEventListener('click', ()=>{
4390  document.getElementById('shareLoadError').style.display = 'none';
4391});
4392
4393setShareMode('view');
4394
4395/* auto-load if the page itself was opened with a share link. New links use
4396   a ?query string (visible to servers/crawlers, see createGistForShare);
4397   older shared links used a #fragment, so that's still checked as a
4398   fallback for anyone who saved/sent one before this change. */
4399(function(){
4400  const searchParams = parseHashParams(window.location.search);
4401  const source = (searchParams.gist || searchParams.data) ? window.location.search : window.location.hash;
4402  const initialParams = parseHashParams(source);
4403  if(initialParams.gist || initialParams.data) loadShareLink(source);
4404})();
4405
4406})();
4407
4408document.getElementById('hideDebug').addEventListener('click', function(){
4409  document.getElementById('debugPanel').style.display='none';
4410  document.getElementById('showDebug').style.display='block';
4411});
4412document.getElementById('showDebug').addEventListener('click', function(){
4413  document.getElementById('debugPanel').style.display='flex';
4414  document.getElementById('showDebug').style.display='none';
4415});
4416document.getElementById('copyLog').addEventListener('click', function(){
4417  const text = window.__tlogs.join('\n');
4418  if(navigator.clipboard && navigator.clipboard.writeText){
4419    navigator.clipboard.writeText(text).then(()=>tlog('Log copied to clipboard.')).catch(()=>tlog('Clipboard copy failed — select text manually.'));
4420  }else{
4421    tlog('Clipboard API unavailable. Log:\n'+text);
4422  }
4423});
4424</script>
vendor: 1 bytes, line 4424
4424
4425<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"b895899cd9c6482287eaedb82a97db95","r":1,"spa":2}' crossorigin="anonymous"></script>
4425
4426</body>
4427</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.