@jayf0x/fluidity-js 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,956 @@
1
+ var Dg = Object.defineProperty;
2
+ var Jg = (i, g, C) => g in i ? Dg(i, g, { enumerable: !0, configurable: !0, writable: !0, value: C }) : i[g] = C;
3
+ var mg = (i, g, C) => (Jg(i, typeof g != "symbol" ? g + "" : g, C), C), bg = (i, g, C) => {
4
+ if (!g.has(i))
5
+ throw TypeError("Cannot " + C);
6
+ };
7
+ var I = (i, g, C) => (bg(i, g, "read from private field"), C ? C.call(i) : g.get(i)), a = (i, g, C) => {
8
+ if (g.has(i))
9
+ throw TypeError("Cannot add the same private member more than once");
10
+ g instanceof WeakSet ? g.add(i) : g.set(i, C);
11
+ }, t = (i, g, C, e) => (bg(i, g, "write to private field"), e ? e.call(i, C) : g.set(i, C), C);
12
+ var y = (i, g, C) => (bg(i, g, "access private method"), C);
13
+ import { jsx as kg } from "react/jsx-runtime";
14
+ import { useRef as ng, useEffect as N, forwardRef as Yg, useImperativeHandle as Fg } from "react";
15
+ const Xg = {
16
+ densityDissipation: 0.992,
17
+ velocityDissipation: 0.93,
18
+ pressureIterations: 1,
19
+ curl: 1e-4,
20
+ splatRadius: 4e-3,
21
+ splatForce: 0.91,
22
+ refraction: 0.25,
23
+ specularExp: 1.01,
24
+ shine: 0.01,
25
+ waterColor: [0, 0, 0],
26
+ glowColor: [0.7, 0.85, 1],
27
+ algorithm: "standard",
28
+ warpStrength: 0.015
29
+ }, Eg = {
30
+ calm: {
31
+ densityDissipation: 0.999,
32
+ velocityDissipation: 0.98,
33
+ curl: 1e-4,
34
+ splatRadius: 3e-3,
35
+ splatForce: 0.5,
36
+ refraction: 0.15,
37
+ shine: 5e-3,
38
+ glowColor: [0.6, 0.85, 1],
39
+ waterColor: [0, 0.02, 0.05]
40
+ },
41
+ storm: {
42
+ densityDissipation: 0.97,
43
+ velocityDissipation: 0.88,
44
+ curl: 0.45,
45
+ splatRadius: 0.012,
46
+ splatForce: 3,
47
+ refraction: 0.6,
48
+ shine: 0.08,
49
+ glowColor: [0.2, 0.3, 0.8],
50
+ waterColor: [0, 0, 0.1],
51
+ pressureIterations: 150
52
+ },
53
+ wave: {
54
+ densityDissipation: 0.994,
55
+ velocityDissipation: 0.92,
56
+ curl: 0.2,
57
+ splatRadius: 5e-3,
58
+ splatForce: 1.2,
59
+ refraction: 0.35,
60
+ shine: 0.03,
61
+ pressureIterations: 5,
62
+ glowColor: [0.5, 0.8, 1],
63
+ waterColor: [0, 0.01, 0.03]
64
+ },
65
+ neon: {
66
+ densityDissipation: 0.985,
67
+ velocityDissipation: 0.93,
68
+ curl: 0.05,
69
+ splatRadius: 8e-3,
70
+ splatForce: 1.5,
71
+ refraction: 0.25,
72
+ specularExp: 0.5,
73
+ shine: 0.14,
74
+ glowColor: [1, 0.2, 0.8],
75
+ waterColor: [0.05, 0, 0.08]
76
+ },
77
+ smoke: {
78
+ densityDissipation: 0.996,
79
+ velocityDissipation: 0.97,
80
+ curl: 0.04,
81
+ splatRadius: 9e-3,
82
+ splatForce: 0.8,
83
+ refraction: 0.08,
84
+ shine: 0,
85
+ glowColor: [0.5, 0.5, 0.5],
86
+ waterColor: [0.06, 0.06, 0.06]
87
+ }
88
+ };
89
+ function Kg(i = {}, g) {
90
+ return { ...g ? { ...Xg, ...Eg[g] } : Xg, ...i };
91
+ }
92
+ const O = (
93
+ /* glsl */
94
+ `
95
+ precision highp float;
96
+ attribute vec2 aPosition;
97
+ varying vec2 vUv;
98
+ varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB;
99
+ uniform vec2 texelSize;
100
+ void main () {
101
+ vUv = aPosition * 0.5 + 0.5;
102
+ vL = vUv - vec2(texelSize.x, 0.0);
103
+ vR = vUv + vec2(texelSize.x, 0.0);
104
+ vT = vUv + vec2(0.0, texelSize.y);
105
+ vB = vUv - vec2(0.0, texelSize.y);
106
+ gl_Position = vec4(aPosition, 0.0, 1.0);
107
+ }
108
+ `
109
+ ), Ng = (
110
+ /* glsl */
111
+ `
112
+ precision highp float;
113
+ varying vec2 vUv;
114
+ uniform sampler2D uVelocity;
115
+ uniform sampler2D uSource;
116
+ uniform sampler2D uObstacle;
117
+ uniform vec2 texelSize;
118
+ uniform float dt;
119
+ uniform float dissipation;
120
+ void main () {
121
+ if (texture2D(uObstacle, vUv).r > 0.5) { gl_FragColor = vec4(0.0); return; }
122
+ vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;
123
+ gl_FragColor = dissipation * texture2D(uSource, coord);
124
+ }
125
+ `
126
+ ), zg = (
127
+ /* glsl */
128
+ `
129
+ precision highp float;
130
+ varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB;
131
+ uniform sampler2D uVelocity;
132
+ uniform sampler2D uObstacle;
133
+ void main () {
134
+ float L = texture2D(uObstacle, vL).r > 0.5 ? 0.0 : texture2D(uVelocity, vL).x;
135
+ float R = texture2D(uObstacle, vR).r > 0.5 ? 0.0 : texture2D(uVelocity, vR).x;
136
+ float T = texture2D(uObstacle, vT).r > 0.5 ? 0.0 : texture2D(uVelocity, vT).y;
137
+ float B = texture2D(uObstacle, vB).r > 0.5 ? 0.0 : texture2D(uVelocity, vB).y;
138
+ gl_FragColor = vec4(0.5 * (R - L + T - B), 0.0, 0.0, 1.0);
139
+ }
140
+ `
141
+ ), Og = (
142
+ /* glsl */
143
+ `
144
+ precision highp float;
145
+ varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB;
146
+ uniform sampler2D uPressure;
147
+ uniform sampler2D uDivergence;
148
+ uniform sampler2D uObstacle;
149
+ void main () {
150
+ float C = texture2D(uPressure, vUv).x;
151
+ float L = texture2D(uObstacle, vL).r > 0.5 ? C : texture2D(uPressure, vL).x;
152
+ float R = texture2D(uObstacle, vR).r > 0.5 ? C : texture2D(uPressure, vR).x;
153
+ float T = texture2D(uObstacle, vT).r > 0.5 ? C : texture2D(uPressure, vT).x;
154
+ float B = texture2D(uObstacle, vB).r > 0.5 ? C : texture2D(uPressure, vB).x;
155
+ float div = texture2D(uDivergence, vUv).x;
156
+ gl_FragColor = vec4((L + R + B + T - div) * 0.25, 0.0, 0.0, 1.0);
157
+ }
158
+ `
159
+ ), Qg = (
160
+ /* glsl */
161
+ `
162
+ precision highp float;
163
+ varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB;
164
+ uniform sampler2D uPressure;
165
+ uniform sampler2D uVelocity;
166
+ uniform sampler2D uObstacle;
167
+ void main () {
168
+ if (texture2D(uObstacle, vUv).r > 0.5) { gl_FragColor = vec4(0.0); return; }
169
+ float L = texture2D(uPressure, vL).x;
170
+ float R = texture2D(uPressure, vR).x;
171
+ float T = texture2D(uPressure, vT).x;
172
+ float B = texture2D(uPressure, vB).x;
173
+ vec2 vel = texture2D(uVelocity, vUv).xy - vec2(R - L, T - B);
174
+ gl_FragColor = vec4(vel, 0.0, 1.0);
175
+ }
176
+ `
177
+ ), jg = (
178
+ /* glsl */
179
+ `
180
+ precision highp float;
181
+ varying vec2 vUv;
182
+ uniform sampler2D uTarget;
183
+ uniform float aspectRatio;
184
+ uniform vec3 color;
185
+ uniform vec2 point;
186
+ uniform float radius;
187
+ void main () {
188
+ vec2 p = vUv - point.xy;
189
+ p.x *= aspectRatio;
190
+ vec3 splat = exp(-dot(p, p) / radius) * color;
191
+ gl_FragColor = vec4(texture2D(uTarget, vUv).xyz + splat, 1.0);
192
+ }
193
+ `
194
+ ), Pg = (
195
+ /* glsl */
196
+ `
197
+ precision highp float;
198
+ varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB;
199
+ uniform sampler2D uVelocity;
200
+ void main () {
201
+ float L = texture2D(uVelocity, vL).y;
202
+ float R = texture2D(uVelocity, vR).y;
203
+ float T = texture2D(uVelocity, vT).x;
204
+ float B = texture2D(uVelocity, vB).x;
205
+ gl_FragColor = vec4(0.5 * (R - L - T + B), 0.0, 0.0, 1.0);
206
+ }
207
+ `
208
+ ), _g = (
209
+ /* glsl */
210
+ `
211
+ precision highp float;
212
+ varying vec2 vUv; varying vec2 vL; varying vec2 vR; varying vec2 vT; varying vec2 vB;
213
+ uniform sampler2D uVelocity;
214
+ uniform sampler2D uCurl;
215
+ uniform float curl;
216
+ uniform float dt;
217
+ void main () {
218
+ float L = texture2D(uCurl, vL).x;
219
+ float R = texture2D(uCurl, vR).x;
220
+ float T = texture2D(uCurl, vT).x;
221
+ float B = texture2D(uCurl, vB).x;
222
+ float C = texture2D(uCurl, vUv).x;
223
+ vec2 force = 0.5 * vec2(abs(T) - abs(B), abs(R) - abs(L));
224
+ force /= length(force) + 0.0001;
225
+ force *= curl * 30.0 * C;
226
+ gl_FragColor = vec4(texture2D(uVelocity, vUv).xy + force * dt, 0.0, 1.0);
227
+ }
228
+ `
229
+ ), qg = (
230
+ /* glsl */
231
+ `
232
+ precision highp float;
233
+ varying vec2 vUv;
234
+
235
+ uniform sampler2D uTexture;
236
+ uniform sampler2D uObstacle;
237
+ uniform sampler2D uBackground;
238
+ uniform sampler2D uCoverage;
239
+ uniform sampler2D uVelocity;
240
+
241
+ uniform vec2 texelSize;
242
+ uniform vec3 uWaterColor;
243
+ uniform vec3 uGlowColor;
244
+ uniform float uRefraction;
245
+ uniform float uSpecularExp;
246
+ uniform float uShine;
247
+ uniform float uWarpStrength;
248
+ uniform int uAlgorithm;
249
+
250
+ void main () {
251
+ float density = max(texture2D(uTexture, vUv).r, 0.0);
252
+ float obs = texture2D(uObstacle, vUv).r;
253
+ float coverage = texture2D(uCoverage, vUv).r;
254
+
255
+ float dL = max(texture2D(uTexture, vUv - vec2(texelSize.x * 2.0, 0.0)).r, 0.0);
256
+ float dR = max(texture2D(uTexture, vUv + vec2(texelSize.x * 2.0, 0.0)).r, 0.0);
257
+ float dT = max(texture2D(uTexture, vUv + vec2(0.0, texelSize.y * 2.0)).r, 0.0);
258
+ float dB = max(texture2D(uTexture, vUv - vec2(0.0, texelSize.y * 2.0)).r, 0.0);
259
+
260
+ vec3 normal = normalize(vec3(dL - dR, dB - dT, 0.2));
261
+ vec3 lightDir = normalize(vec3(0.5, 1.0, 0.5));
262
+ vec3 halfV = normalize(lightDir + vec3(0.0, 0.0, 1.0));
263
+ float spec = pow(max(dot(normal, halfV), 0.0), uSpecularExp) * uShine * density;
264
+
265
+ vec3 bg = texture2D(uBackground, vUv).rgb;
266
+ vec3 color = bg;
267
+
268
+ if (uAlgorithm == 1) {
269
+ // ── glass ──────────────────────────────────────────────────────────────
270
+ // Strong UV distortion only. Image bends but no colour overlay.
271
+ vec2 refrUv = clamp(vUv + normal.xy * uRefraction * density * 3.0, 0.0, 1.0);
272
+ vec3 refrBg = texture2D(uBackground, mix(vUv, refrUv, 1.0 - obs)).rgb;
273
+ color = refrBg + spec * uGlowColor * 2.5;
274
+ color = mix(color, bg * 0.6, obs * 0.3);
275
+
276
+ } else if (uAlgorithm == 2) {
277
+ // ── ink ────────────────────────────────────────────────────────────────
278
+ // Dense opaque pigment that stains. Subtle refraction underneath.
279
+ float inkD = min(density * 4.0, 1.0);
280
+ vec2 refrUv = clamp(vUv + normal.xy * uRefraction * density * 0.4, 0.0, 1.0);
281
+ vec3 refrBg = texture2D(uBackground, mix(vUv, refrUv, 1.0 - obs)).rgb;
282
+ color = mix(refrBg, uWaterColor + spec * uGlowColor, inkD);
283
+ color = mix(color, bg * 0.5, obs * 0.15);
284
+
285
+ } else if (uAlgorithm == 3) {
286
+ // ── aurora ─────────────────────────────────────────────────────────────
287
+ // Velocity field warps background UVs — liquid metal / lava-lamp feel.
288
+ vec2 vel = texture2D(uVelocity, vUv).xy;
289
+ float velMag = clamp(length(vel) * 20.0, 0.0, 1.0);
290
+ vec2 warpUv = clamp(vUv + vel * uWarpStrength, 0.0, 1.0);
291
+ vec3 warpBg = texture2D(uBackground, warpUv).rgb;
292
+ color = mix(bg, warpBg, velMag * (1.0 - obs));
293
+ color += spec * uGlowColor * velMag * 1.5;
294
+ color += uWaterColor * density * 0.3;
295
+ color = mix(color, bg * 0.5, obs * 0.2);
296
+
297
+ } else if (uAlgorithm == 4) {
298
+ // ── ripple ─────────────────────────────────────────────────────────────
299
+ // Exaggerated normal perturbation + Fresnel rim — calm water surface.
300
+ vec2 rippleUv = clamp(vUv + normal.xy * uRefraction * density * 6.0, 0.0, 1.0);
301
+ vec3 refrBg = texture2D(uBackground, mix(vUv, rippleUv, 1.0 - obs)).rgb;
302
+ float fresnel = pow(clamp(1.0 - dot(normal, vec3(0.0, 0.0, 1.0)), 0.0, 1.0), 3.0) * density;
303
+ color = refrBg;
304
+ color += fresnel * uGlowColor * 2.0;
305
+ color += spec * uGlowColor * density * 2.0;
306
+ color = mix(color, bg * 0.5, obs * 0.2);
307
+
308
+ } else {
309
+ // ── standard (0) ───────────────────────────────────────────────────────
310
+ // Original: colour overlay blended over refracted background.
311
+ vec2 refrUv = vUv + normal.xy * uRefraction * density;
312
+ vec3 refrBg = texture2D(uBackground, mix(vUv, refrUv, 1.0 - obs)).rgb;
313
+ color = mix(refrBg, uWaterColor, min(density * 1.5, 0.8));
314
+ color += spec * uGlowColor;
315
+ color = mix(color, bg * 0.5, obs * 0.2);
316
+ }
317
+
318
+ // Premultiplied alpha — transparent where there is neither content nor fluid,
319
+ // letting the CSS backgroundColor on the container div show through.
320
+ float alpha = clamp(max(density * 1.5, coverage), 0.0, 1.0);
321
+ gl_FragColor = vec4(color * alpha, alpha);
322
+ }
323
+ `
324
+ );
325
+ function $g(i) {
326
+ const g = { alpha: !0, depth: !1, stencil: !1, antialias: !0, preserveDrawingBuffer: !1 };
327
+ let C = i.getContext("webgl2", g);
328
+ const e = !!C;
329
+ e || (C = i.getContext("webgl", g) || i.getContext("experimental-webgl", g), C.getExtension("EXT_color_buffer_half_float"));
330
+ const s = e ? null : C.getExtension("OES_texture_half_float"), o = e ? C.HALF_FLOAT : s.HALF_FLOAT_OES;
331
+ return C.getExtension("EXT_color_buffer_float"), C.getExtension("OES_texture_half_float_linear"), {
332
+ gl: C,
333
+ isWebGL2: e,
334
+ ext: {
335
+ internalFormat: e ? C.RGBA16F : C.RGBA,
336
+ format: C.RGBA,
337
+ type: o
338
+ }
339
+ };
340
+ }
341
+ class Q {
342
+ constructor(g, C, e) {
343
+ mg(this, "program");
344
+ mg(this, "uniforms", {});
345
+ mg(this, "_gl");
346
+ this._gl = g, this.program = g.createProgram(), g.attachShader(this.program, this._compile(g.VERTEX_SHADER, C)), g.attachShader(this.program, this._compile(g.FRAGMENT_SHADER, e)), g.linkProgram(this.program);
347
+ const s = g.getProgramParameter(this.program, g.ACTIVE_UNIFORMS);
348
+ for (let o = 0; o < s; o++) {
349
+ const l = g.getActiveUniform(this.program, o).name;
350
+ this.uniforms[l] = g.getUniformLocation(this.program, l);
351
+ }
352
+ }
353
+ _compile(g, C) {
354
+ const e = this._gl, s = e.createShader(g);
355
+ return e.shaderSource(s, C), e.compileShader(s), s;
356
+ }
357
+ bind() {
358
+ this._gl.useProgram(this.program);
359
+ }
360
+ dispose() {
361
+ this._gl.deleteProgram(this.program);
362
+ }
363
+ }
364
+ function gI(i) {
365
+ return {
366
+ advection: new Q(i, O, Ng),
367
+ divergence: new Q(i, O, zg),
368
+ pressure: new Q(i, O, Og),
369
+ gradientSubtract: new Q(i, O, Qg),
370
+ splat: new Q(i, O, jg),
371
+ curl: new Q(i, O, Pg),
372
+ vorticity: new Q(i, O, _g),
373
+ display: new Q(i, O, qg)
374
+ };
375
+ }
376
+ function Zg(i, g, C, e) {
377
+ i.activeTexture(i.TEXTURE0);
378
+ const s = i.createTexture();
379
+ i.bindTexture(i.TEXTURE_2D, s), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_MIN_FILTER, i.LINEAR), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_MAG_FILTER, i.LINEAR), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_WRAP_S, i.CLAMP_TO_EDGE), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_WRAP_T, i.CLAMP_TO_EDGE), i.texImage2D(i.TEXTURE_2D, 0, g.internalFormat, C, e, 0, g.format, g.type, null);
380
+ const o = i.createFramebuffer();
381
+ return i.bindFramebuffer(i.FRAMEBUFFER, o), i.framebufferTexture2D(i.FRAMEBUFFER, i.COLOR_ATTACHMENT0, i.TEXTURE_2D, s, 0), { tex: s, fbo: o, width: C, height: e };
382
+ }
383
+ function pg(i, g, C, e) {
384
+ let s = Zg(i, g, C, e), o = Zg(i, g, C, e);
385
+ return {
386
+ get read() {
387
+ return s;
388
+ },
389
+ get write() {
390
+ return o;
391
+ },
392
+ swap() {
393
+ [s, o] = [o, s];
394
+ },
395
+ dispose() {
396
+ i.deleteTexture(s.tex), i.deleteFramebuffer(s.fbo), i.deleteTexture(o.tex), i.deleteFramebuffer(o.fbo);
397
+ }
398
+ };
399
+ }
400
+ function II(i) {
401
+ const g = i.createBuffer();
402
+ return i.bindBuffer(i.ARRAY_BUFFER, g), i.bufferData(
403
+ i.ARRAY_BUFFER,
404
+ new Float32Array([-1, -1, -1, 1, 1, 1, 1, -1]),
405
+ i.STATIC_DRAW
406
+ ), i.vertexAttribPointer(0, 2, i.FLOAT, !1, 0, 0), i.enableVertexAttribArray(0), function(e) {
407
+ i.bindFramebuffer(i.FRAMEBUFFER, e), i.drawArrays(i.TRIANGLE_FAN, 0, 4);
408
+ };
409
+ }
410
+ function hg(i, g, C, e, s = "cover") {
411
+ let o;
412
+ s === "cover" ? o = Math.max(C / i, e / g) : s === "contain" ? o = Math.min(C / i, e / g) : typeof s == "string" && s.endsWith("%") ? o = Math.min(C / i, e / g) * (parseFloat(s) / 100) : typeof s == "string" && s.endsWith("px") ? o = parseFloat(s) / Math.max(i, g) : typeof s == "number" ? o = s : o = Math.max(C / i, e / g);
413
+ const l = i * o, G = g * o;
414
+ return { x: (C - l) / 2, y: (e - G) / 2, drawW: l, drawH: G };
415
+ }
416
+ function CI(i, g, C, e, s = null, o = "cover") {
417
+ const { text: l, fontSize: G, color: n, fontFamily: d = "sans-serif", fontWeight: u = 900 } = e, b = new OffscreenCanvas(g, C), c = b.getContext("2d");
418
+ ((K, m = 0) => {
419
+ if (s) {
420
+ c.clearRect(0, 0, g, C), c.fillStyle = "black", c.fillRect(0, 0, g, C);
421
+ const { x: Z, y: A, drawW: r, drawH: L } = hg(
422
+ s.width,
423
+ s.height,
424
+ g,
425
+ C,
426
+ o
427
+ );
428
+ c.drawImage(s, Z, A, r, L);
429
+ } else
430
+ c.fillStyle = "black", c.fillRect(0, 0, g, C);
431
+ c.shadowColor = K, c.fillStyle = K, c.font = `${u} ${G}px ${d}`, c.textAlign = "center", c.textBaseline = "middle", c.fillText(l, g / 2, C / 2);
432
+ })(n);
433
+ const k = cg(i, b);
434
+ c.fillStyle = "black", c.fillRect(0, 0, g, C), c.fillStyle = "white", c.font = `${u} ${G}px ${d}`, c.textAlign = "center", c.textBaseline = "middle", c.fillText(l, g / 2, C / 2);
435
+ const Y = cg(i, b);
436
+ return { backgroundTex: k, obstacleTex: Y, coverageTex: Y };
437
+ }
438
+ function iI(i, g, C, e, s = 0, o = "cover", l = null, G = "cover") {
439
+ const n = new OffscreenCanvas(C, e), d = n.getContext("2d"), { x: u, y: b, drawW: c, drawH: p } = hg(g.width, g.height, C, e, o);
440
+ if (d.clearRect(0, 0, C, e), d.fillStyle = "black", d.fillRect(0, 0, C, e), l) {
441
+ const {
442
+ x: m,
443
+ y: Z,
444
+ drawW: A,
445
+ drawH: r
446
+ } = hg(l.width, l.height, C, e, G);
447
+ d.filter = `brightness(${s}) blur(8px)`, d.drawImage(l, m, Z, A, r), d.filter = "none";
448
+ }
449
+ d.drawImage(g, u, b, c, p);
450
+ const k = cg(i, n);
451
+ d.clearRect(0, 0, C, e), d.fillStyle = "black", d.fillRect(0, 0, C, e), d.filter = `brightness(${s}) blur(8px)`, d.drawImage(g, u, b, c, p), d.filter = "none";
452
+ const Y = cg(i, n);
453
+ d.clearRect(0, 0, C, e), d.fillStyle = "black", d.fillRect(0, 0, C, e), d.fillStyle = "white", d.fillRect(
454
+ Math.max(0, u),
455
+ Math.max(0, b),
456
+ Math.min(c, C - Math.max(0, u)),
457
+ Math.min(p, e - Math.max(0, b))
458
+ );
459
+ const K = cg(i, n);
460
+ return { backgroundTex: k, obstacleTex: Y, coverageTex: K };
461
+ }
462
+ function cg(i, g) {
463
+ const C = i.createTexture();
464
+ return i.bindTexture(i.TEXTURE_2D, C), i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL, !0), i.texImage2D(i.TEXTURE_2D, 0, i.RGB, i.RGB, i.UNSIGNED_BYTE, g), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_MIN_FILTER, i.LINEAR), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_MAG_FILTER, i.LINEAR), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_WRAP_S, i.CLAMP_TO_EDGE), i.texParameteri(i.TEXTURE_2D, i.TEXTURE_WRAP_T, i.CLAMP_TO_EDGE), C;
465
+ }
466
+ async function wg(i) {
467
+ const g = await fetch(i);
468
+ if (!g.ok)
469
+ throw new Error(`Failed to fetch image: ${i} (${g.status})`);
470
+ const C = await g.blob();
471
+ return createImageBitmap(C);
472
+ }
473
+ const Ug = typeof requestAnimationFrame < "u" ? requestAnimationFrame.bind(globalThis) : (i) => setTimeout(i, 1e3 / 60), eI = typeof cancelAnimationFrame < "u" ? cancelAnimationFrame.bind(globalThis) : clearTimeout, Hg = 0.016, sI = { standard: 0, glass: 1, ink: 2, aurora: 3, ripple: 4 };
474
+ var q, R, Ag, $, eg, w, U, j, P, X, S, T, x, M, E, H, D, F, sg, gg, V, v, J, Ig, Cg, lg, dg, Vg, _, ig, og, rg, ag, Lg, ug, yg, Gg, fg;
475
+ class vg {
476
+ constructor(g, C = {}) {
477
+ // ---------------------------------------------------------------------------
478
+ // Private helpers
479
+ // ---------------------------------------------------------------------------
480
+ a(this, Cg);
481
+ a(this, dg);
482
+ a(this, _);
483
+ a(this, og);
484
+ a(this, ag);
485
+ a(this, ug);
486
+ a(this, Gg);
487
+ a(this, q, void 0);
488
+ a(this, R, void 0);
489
+ a(this, Ag, void 0);
490
+ a(this, $, void 0);
491
+ a(this, eg, void 0);
492
+ a(this, w, 0);
493
+ a(this, U, 0);
494
+ a(this, j, 0);
495
+ a(this, P, 0);
496
+ a(this, X, null);
497
+ a(this, S, null);
498
+ a(this, T, null);
499
+ a(this, x, null);
500
+ a(this, M, null);
501
+ a(this, E, null);
502
+ a(this, H, null);
503
+ a(this, D, null);
504
+ // binary content mask for transparent canvas support
505
+ a(this, F, null);
506
+ // optional background image (from backgroundSrc prop)
507
+ a(this, sg, "cover");
508
+ a(this, gg, void 0);
509
+ a(this, V, { x: 0, y: 0, dx: 0, dy: 0, targetX: 0, targetY: 0, moved: !1 });
510
+ // Stores source so textures can be rebuilt on resize
511
+ a(this, v, null);
512
+ a(this, J, null);
513
+ a(this, Ig, !1);
514
+ t(this, q, g), t(this, gg, Kg(C));
515
+ const { gl: e, ext: s } = $g(g);
516
+ t(this, R, e), t(this, Ag, s), t(this, $, gI(e)), t(this, eg, II(e)), e.clearColor(0, 0, 0, 0);
517
+ }
518
+ // ---------------------------------------------------------------------------
519
+ // Public API
520
+ // ---------------------------------------------------------------------------
521
+ setTextSource(g) {
522
+ t(this, v, { type: "text", opts: g }), y(this, Cg, lg).call(this), y(this, _, ig).call(this), y(this, og, rg).call(this);
523
+ }
524
+ async setImageSource(g, C = 0, e = "cover") {
525
+ const s = await wg(g);
526
+ t(this, v, { type: "image", bitmap: s, effect: C, size: e }), y(this, Cg, lg).call(this), y(this, _, ig).call(this), y(this, og, rg).call(this);
527
+ }
528
+ setImageBitmap(g, C = 0, e = "cover") {
529
+ t(this, v, { type: "image", bitmap: g, effect: C, size: e }), y(this, Cg, lg).call(this), y(this, _, ig).call(this), y(this, og, rg).call(this);
530
+ }
531
+ setBackground(g, C = "cover") {
532
+ I(this, F) && I(this, F) !== g && I(this, F).close(), t(this, F, g), t(this, sg, C ?? "cover"), I(this, v) && I(this, w) > 0 && y(this, _, ig).call(this);
533
+ }
534
+ handleMove(g, C, e = 1) {
535
+ I(this, V).moved = !0, I(this, V).dx = (g - I(this, V).targetX) * e, I(this, V).dy = (C - I(this, V).targetY) * e, I(this, V).targetX = g, I(this, V).targetY = C;
536
+ }
537
+ /**
538
+ * Immediately applies one fluid splat at (x, y) with explicit velocity (vx, vy).
539
+ * Safe to call multiple times per frame — each call writes directly to the FBOs.
540
+ * Designed for programmatic use cases (e.g. particle systems, attractor paths)
541
+ * where you want N independent injection points per frame without flooding the
542
+ * mouse-state machine or the worker message queue.
543
+ */
544
+ splat(g, C, e, s, o = 1) {
545
+ if (!I(this, Ig) || I(this, w) === 0)
546
+ return;
547
+ const l = I(this, R), G = I(this, gg), { splat: n } = I(this, $), d = I(this, eg);
548
+ l.viewport(0, 0, I(this, j), I(this, P)), n.bind(), l.uniform1f(n.uniforms.aspectRatio, I(this, w) / I(this, U)), l.uniform2f(n.uniforms.point, g / I(this, w), 1 - C / I(this, U)), l.uniform1f(n.uniforms.radius, G.splatRadius), l.uniform1i(n.uniforms.uTarget, 0), l.activeTexture(l.TEXTURE0), l.bindTexture(l.TEXTURE_2D, I(this, S).read.tex), l.uniform3f(n.uniforms.color, e * G.splatForce * o, -s * G.splatForce * o, 0), d(I(this, S).write.fbo), I(this, S).swap(), l.activeTexture(l.TEXTURE0), l.bindTexture(l.TEXTURE_2D, I(this, X).read.tex), l.uniform3f(n.uniforms.color, o, o, o), d(I(this, X).write.fbo), I(this, X).swap();
549
+ }
550
+ resize(g, C) {
551
+ g !== void 0 && g > 0 ? (t(this, w, I(this, q).width = g), t(this, U, I(this, q).height = C), t(this, j, g >> 1), t(this, P, C >> 1), y(this, dg, Vg).call(this)) : y(this, Cg, lg).call(this), I(this, v) && y(this, _, ig).call(this);
552
+ }
553
+ updateConfig(g) {
554
+ Object.assign(I(this, gg), g);
555
+ }
556
+ destroy() {
557
+ this.stop();
558
+ const g = I(this, R);
559
+ y(this, ag, Lg).call(this), y(this, ug, yg).call(this), I(this, F) && (I(this, F).close(), t(this, F, null));
560
+ for (const e of Object.values(I(this, $)))
561
+ e.dispose();
562
+ const C = g.getExtension("WEBGL_lose_context");
563
+ C == null || C.loseContext();
564
+ }
565
+ // ---------------------------------------------------------------------------
566
+ // Loop control
567
+ // ---------------------------------------------------------------------------
568
+ start() {
569
+ if (I(this, J) !== null)
570
+ return;
571
+ const g = () => {
572
+ y(this, Gg, fg).call(this), t(this, J, Ug(g));
573
+ };
574
+ t(this, J, Ug(g));
575
+ }
576
+ stop() {
577
+ I(this, J) !== null && (eI(I(this, J)), t(this, J, null));
578
+ }
579
+ get isRunning() {
580
+ return I(this, J) !== null;
581
+ }
582
+ }
583
+ q = new WeakMap(), R = new WeakMap(), Ag = new WeakMap(), $ = new WeakMap(), eg = new WeakMap(), w = new WeakMap(), U = new WeakMap(), j = new WeakMap(), P = new WeakMap(), X = new WeakMap(), S = new WeakMap(), T = new WeakMap(), x = new WeakMap(), M = new WeakMap(), E = new WeakMap(), H = new WeakMap(), D = new WeakMap(), F = new WeakMap(), sg = new WeakMap(), gg = new WeakMap(), V = new WeakMap(), v = new WeakMap(), J = new WeakMap(), Ig = new WeakMap(), Cg = new WeakSet(), lg = function() {
584
+ const g = I(this, q);
585
+ t(this, w, g.width = g.clientWidth || g.width), t(this, U, g.height = g.clientHeight || g.height), !(I(this, w) === 0 || I(this, U) === 0) && (t(this, j, I(this, w) >> 1), t(this, P, I(this, U) >> 1), y(this, dg, Vg).call(this));
586
+ }, dg = new WeakSet(), Vg = function() {
587
+ const g = I(this, R), C = I(this, Ag), e = I(this, j), s = I(this, P);
588
+ y(this, ag, Lg).call(this), t(this, X, pg(g, C, e, s)), t(this, S, pg(g, C, e, s)), t(this, x, pg(g, C, e, s)), t(this, T, Zg(g, C, e, s)), t(this, M, Zg(g, C, e, s));
589
+ }, _ = new WeakSet(), ig = function() {
590
+ if (!(!I(this, v) || I(this, w) === 0)) {
591
+ if (y(this, ug, yg).call(this), I(this, v).type === "text") {
592
+ const { backgroundTex: g, obstacleTex: C, coverageTex: e } = CI(
593
+ I(this, R),
594
+ I(this, w),
595
+ I(this, U),
596
+ I(this, v).opts,
597
+ I(this, F),
598
+ I(this, sg)
599
+ );
600
+ t(this, E, g), t(this, H, C), t(this, D, e);
601
+ } else {
602
+ const { backgroundTex: g, obstacleTex: C, coverageTex: e } = iI(
603
+ I(this, R),
604
+ I(this, v).bitmap,
605
+ I(this, w),
606
+ I(this, U),
607
+ I(this, v).effect,
608
+ I(this, v).size,
609
+ I(this, F),
610
+ I(this, sg)
611
+ );
612
+ t(this, E, g), t(this, H, C), t(this, D, e);
613
+ }
614
+ t(this, Ig, !0);
615
+ }
616
+ }, og = new WeakSet(), rg = function() {
617
+ I(this, Ig) && !this.isRunning && this.start();
618
+ }, ag = new WeakSet(), Lg = function() {
619
+ var g, C, e;
620
+ (g = I(this, X)) == null || g.dispose(), (C = I(this, S)) == null || C.dispose(), (e = I(this, x)) == null || e.dispose(), I(this, T) && (I(this, R).deleteTexture(I(this, T).tex), I(this, R).deleteFramebuffer(I(this, T).fbo)), I(this, M) && (I(this, R).deleteTexture(I(this, M).tex), I(this, R).deleteFramebuffer(I(this, M).fbo)), t(this, X, t(this, S, t(this, x, t(this, T, t(this, M, null)))));
621
+ }, ug = new WeakSet(), yg = function() {
622
+ I(this, E) && I(this, R).deleteTexture(I(this, E)), I(this, H) && I(this, R).deleteTexture(I(this, H)), I(this, D) && I(this, D) !== I(this, H) && I(this, R).deleteTexture(I(this, D)), t(this, E, t(this, H, t(this, D, null)));
623
+ }, Gg = new WeakSet(), fg = function() {
624
+ if (!I(this, Ig) || I(this, w) === 0)
625
+ return;
626
+ const g = I(this, R), C = I(this, gg), { advection: e, divergence: s, pressure: o, gradientSubtract: l, splat: G, curl: n, vorticity: d, display: u } = I(this, $);
627
+ I(this, V).x += (I(this, V).targetX - I(this, V).x) * 0.15, I(this, V).y += (I(this, V).targetY - I(this, V).y) * 0.15;
628
+ const b = I(this, j), c = I(this, P), p = I(this, eg);
629
+ g.viewport(0, 0, b, c), e.bind(), g.uniform2f(e.uniforms.texelSize, 1 / b, 1 / c), g.uniform1f(e.uniforms.dt, Hg), g.uniform1i(e.uniforms.uObstacle, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, H)), g.uniform1f(e.uniforms.dissipation, C.velocityDissipation), g.uniform1i(e.uniforms.uVelocity, 1), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), g.uniform1i(e.uniforms.uSource, 1), p(I(this, S).write.fbo), I(this, S).swap(), g.uniform1f(e.uniforms.dissipation, C.densityDissipation), g.uniform1i(e.uniforms.uSource, 2), g.activeTexture(g.TEXTURE2), g.bindTexture(g.TEXTURE_2D, I(this, X).read.tex), p(I(this, X).write.fbo), I(this, X).swap(), n.bind(), g.uniform2f(n.uniforms.texelSize, 1 / b, 1 / c), g.uniform1i(n.uniforms.uVelocity, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), p(I(this, M).fbo), d.bind(), g.uniform2f(d.uniforms.texelSize, 1 / b, 1 / c), g.uniform1f(d.uniforms.curl, C.curl), g.uniform1f(d.uniforms.dt, Hg), g.uniform1i(d.uniforms.uVelocity, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), g.uniform1i(d.uniforms.uCurl, 1), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, I(this, M).tex), p(I(this, S).write.fbo), I(this, S).swap(), I(this, V).moved && (G.bind(), g.uniform1f(G.uniforms.aspectRatio, I(this, w) / I(this, U)), g.uniform2f(G.uniforms.point, I(this, V).x / I(this, w), 1 - I(this, V).y / I(this, U)), g.uniform1f(G.uniforms.radius, C.splatRadius), g.uniform1i(G.uniforms.uTarget, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), g.uniform3f(G.uniforms.color, I(this, V).dx * C.splatForce, -I(this, V).dy * C.splatForce, 0), p(I(this, S).write.fbo), I(this, S).swap(), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, X).read.tex), g.uniform3f(G.uniforms.color, 1, 1, 1), p(I(this, X).write.fbo), I(this, X).swap(), I(this, V).moved = !1), s.bind(), g.uniform2f(s.uniforms.texelSize, 1 / b, 1 / c), g.uniform1i(s.uniforms.uVelocity, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), g.uniform1i(s.uniforms.uObstacle, 1), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, I(this, H)), p(I(this, T).fbo), o.bind(), g.uniform2f(o.uniforms.texelSize, 1 / b, 1 / c), g.uniform1i(o.uniforms.uDivergence, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, T).tex), g.uniform1i(o.uniforms.uObstacle, 1), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, I(this, H));
630
+ for (let k = 0; k < C.pressureIterations; k++)
631
+ g.uniform1i(o.uniforms.uPressure, 2), g.activeTexture(g.TEXTURE2), g.bindTexture(g.TEXTURE_2D, I(this, x).read.tex), p(I(this, x).write.fbo), I(this, x).swap();
632
+ l.bind(), g.uniform2f(l.uniforms.texelSize, 1 / b, 1 / c), g.uniform1i(l.uniforms.uPressure, 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, x).read.tex), g.uniform1i(l.uniforms.uVelocity, 1), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), g.uniform1i(l.uniforms.uObstacle, 2), g.activeTexture(g.TEXTURE2), g.bindTexture(g.TEXTURE_2D, I(this, H)), p(I(this, S).write.fbo), I(this, S).swap(), g.viewport(0, 0, I(this, w), I(this, U)), g.bindFramebuffer(g.FRAMEBUFFER, null), g.clear(g.COLOR_BUFFER_BIT), u.bind(), g.uniform2f(u.uniforms.texelSize, 1 / I(this, w), 1 / I(this, U)), g.uniform3fv(u.uniforms.uWaterColor, C.waterColor), g.uniform3fv(u.uniforms.uGlowColor, C.glowColor), g.uniform1f(u.uniforms.uRefraction, C.refraction), g.uniform1f(u.uniforms.uSpecularExp, C.specularExp), g.uniform1f(u.uniforms.uShine, C.shine), g.uniform1f(u.uniforms.uWarpStrength, C.warpStrength ?? 0.015), g.uniform1i(u.uniforms.uAlgorithm, sI[C.algorithm] ?? 0), g.activeTexture(g.TEXTURE0), g.bindTexture(g.TEXTURE_2D, I(this, X).read.tex), g.activeTexture(g.TEXTURE1), g.bindTexture(g.TEXTURE_2D, I(this, H)), g.activeTexture(g.TEXTURE2), g.bindTexture(g.TEXTURE_2D, I(this, E)), g.activeTexture(g.TEXTURE3), g.bindTexture(g.TEXTURE_2D, I(this, D)), g.activeTexture(g.TEXTURE4), g.bindTexture(g.TEXTURE_2D, I(this, S).read.tex), g.uniform1i(u.uniforms.uTexture, 0), g.uniform1i(u.uniforms.uObstacle, 1), g.uniform1i(u.uniforms.uBackground, 2), g.uniform1i(u.uniforms.uCoverage, 3), g.uniform1i(u.uniforms.uVelocity, 4), p(null);
633
+ };
634
+ const Tg = "dmFyIFJlID0gT2JqZWN0LmRlZmluZVByb3BlcnR5Owp2YXIgeWUgPSAoaSwgZSwgcikgPT4gZSBpbiBpID8gUmUoaSwgZSwgeyBlbnVtZXJhYmxlOiAhMCwgY29uZmlndXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwLCB2YWx1ZTogciB9KSA6IGlbZV0gPSByOwp2YXIgaWUgPSAoaSwgZSwgcikgPT4gKHllKGksIHR5cGVvZiBlICE9ICJzeW1ib2wiID8gZSArICIiIDogZSwgciksIHIpLCBjZSA9IChpLCBlLCByKSA9PiB7CiAgaWYgKCFlLmhhcyhpKSkKICAgIHRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIgKyByKTsKfTsKdmFyIHQgPSAoaSwgZSwgcikgPT4gKGNlKGksIGUsICJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpLCByID8gci5jYWxsKGkpIDogZS5nZXQoaSkpLCBsID0gKGksIGUsIHIpID0+IHsKICBpZiAoZS5oYXMoaSkpCiAgICB0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTsKICBlIGluc3RhbmNlb2YgV2Vha1NldCA/IGUuYWRkKGkpIDogZS5zZXQoaSwgcik7Cn0sIGEgPSAoaSwgZSwgciwgbykgPT4gKGNlKGksIGUsICJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksIG8gPyBvLmNhbGwoaSwgcikgOiBlLnNldChpLCByKSwgcik7CnZhciBUID0gKGksIGUsIHIpID0+IChjZShpLCBlLCAiYWNjZXNzIHByaXZhdGUgbWV0aG9kIiksIHIpOwpjb25zdCBkZSA9IHsKICBkZW5zaXR5RGlzc2lwYXRpb246IDAuOTkyLAogIHZlbG9jaXR5RGlzc2lwYXRpb246IDAuOTMsCiAgcHJlc3N1cmVJdGVyYXRpb25zOiAxLAogIGN1cmw6IDFlLTQsCiAgc3BsYXRSYWRpdXM6IDRlLTMsCiAgc3BsYXRGb3JjZTogMC45MSwKICByZWZyYWN0aW9uOiAwLjI1LAogIHNwZWN1bGFyRXhwOiAxLjAxLAogIHNoaW5lOiAwLjAxLAogIHdhdGVyQ29sb3I6IFswLCAwLCAwXSwKICBnbG93Q29sb3I6IFswLjcsIDAuODUsIDFdLAogIGFsZ29yaXRobTogInN0YW5kYXJkIiwKICB3YXJwU3RyZW5ndGg6IDAuMDE1Cn0sIERlID0gewogIGNhbG06IHsKICAgIGRlbnNpdHlEaXNzaXBhdGlvbjogMC45OTksCiAgICB2ZWxvY2l0eURpc3NpcGF0aW9uOiAwLjk4LAogICAgY3VybDogMWUtNCwKICAgIHNwbGF0UmFkaXVzOiAzZS0zLAogICAgc3BsYXRGb3JjZTogMC41LAogICAgcmVmcmFjdGlvbjogMC4xNSwKICAgIHNoaW5lOiA1ZS0zLAogICAgZ2xvd0NvbG9yOiBbMC42LCAwLjg1LCAxXSwKICAgIHdhdGVyQ29sb3I6IFswLCAwLjAyLCAwLjA1XQogIH0sCiAgc3Rvcm06IHsKICAgIGRlbnNpdHlEaXNzaXBhdGlvbjogMC45NywKICAgIHZlbG9jaXR5RGlzc2lwYXRpb246IDAuODgsCiAgICBjdXJsOiAwLjQ1LAogICAgc3BsYXRSYWRpdXM6IDAuMDEyLAogICAgc3BsYXRGb3JjZTogMywKICAgIHJlZnJhY3Rpb246IDAuNiwKICAgIHNoaW5lOiAwLjA4LAogICAgZ2xvd0NvbG9yOiBbMC4yLCAwLjMsIDAuOF0sCiAgICB3YXRlckNvbG9yOiBbMCwgMCwgMC4xXSwKICAgIHByZXNzdXJlSXRlcmF0aW9uczogMTUwCiAgfSwKICB3YXZlOiB7CiAgICBkZW5zaXR5RGlzc2lwYXRpb246IDAuOTk0LAogICAgdmVsb2NpdHlEaXNzaXBhdGlvbjogMC45MiwKICAgIGN1cmw6IDAuMiwKICAgIHNwbGF0UmFkaXVzOiA1ZS0zLAogICAgc3BsYXRGb3JjZTogMS4yLAogICAgcmVmcmFjdGlvbjogMC4zNSwKICAgIHNoaW5lOiAwLjAzLAogICAgcHJlc3N1cmVJdGVyYXRpb25zOiA1LAogICAgZ2xvd0NvbG9yOiBbMC41LCAwLjgsIDFdLAogICAgd2F0ZXJDb2xvcjogWzAsIDAuMDEsIDAuMDNdCiAgfSwKICBuZW9uOiB7CiAgICBkZW5zaXR5RGlzc2lwYXRpb246IDAuOTg1LAogICAgdmVsb2NpdHlEaXNzaXBhdGlvbjogMC45MywKICAgIGN1cmw6IDAuMDUsCiAgICBzcGxhdFJhZGl1czogOGUtMywKICAgIHNwbGF0Rm9yY2U6IDEuNSwKICAgIHJlZnJhY3Rpb246IDAuMjUsCiAgICBzcGVjdWxhckV4cDogMC41LAogICAgc2hpbmU6IDAuMTQsCiAgICBnbG93Q29sb3I6IFsxLCAwLjIsIDAuOF0sCiAgICB3YXRlckNvbG9yOiBbMC4wNSwgMCwgMC4wOF0KICB9LAogIHNtb2tlOiB7CiAgICBkZW5zaXR5RGlzc2lwYXRpb246IDAuOTk2LAogICAgdmVsb2NpdHlEaXNzaXBhdGlvbjogMC45NywKICAgIGN1cmw6IDAuMDQsCiAgICBzcGxhdFJhZGl1czogOWUtMywKICAgIHNwbGF0Rm9yY2U6IDAuOCwKICAgIHJlZnJhY3Rpb246IDAuMDgsCiAgICBzaGluZTogMCwKICAgIGdsb3dDb2xvcjogWzAuNSwgMC41LCAwLjVdLAogICAgd2F0ZXJDb2xvcjogWzAuMDYsIDAuMDYsIDAuMDZdCiAgfQp9OwpmdW5jdGlvbiBVZShpID0ge30sIGUpIHsKICByZXR1cm4geyAuLi5lID8geyAuLi5kZSwgLi4uRGVbZV0gfSA6IGRlLCAuLi5pIH07Cn0KY29uc3QgTCA9ICgKICAvKiBnbHNsICovCiAgYAogIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICBhdHRyaWJ1dGUgdmVjMiBhUG9zaXRpb247CiAgdmFyeWluZyB2ZWMyIHZVdjsKICB2YXJ5aW5nIHZlYzIgdkw7IHZhcnlpbmcgdmVjMiB2UjsgdmFyeWluZyB2ZWMyIHZUOyB2YXJ5aW5nIHZlYzIgdkI7CiAgdW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTsKICB2b2lkIG1haW4gKCkgewogICAgdlV2ID0gYVBvc2l0aW9uICogMC41ICsgMC41OwogICAgdkwgPSB2VXYgLSB2ZWMyKHRleGVsU2l6ZS54LCAwLjApOwogICAgdlIgPSB2VXYgKyB2ZWMyKHRleGVsU2l6ZS54LCAwLjApOwogICAgdlQgPSB2VXYgKyB2ZWMyKDAuMCwgdGV4ZWxTaXplLnkpOwogICAgdkIgPSB2VXYgLSB2ZWMyKDAuMCwgdGV4ZWxTaXplLnkpOwogICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFQb3NpdGlvbiwgMC4wLCAxLjApOwogIH0KYAopLCBfZSA9ICgKICAvKiBnbHNsICovCiAgYAogIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICB2YXJ5aW5nIHZlYzIgdlV2OwogIHVuaWZvcm0gc2FtcGxlcjJEIHVWZWxvY2l0eTsKICB1bmlmb3JtIHNhbXBsZXIyRCB1U291cmNlOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVPYnN0YWNsZTsKICB1bmlmb3JtIHZlYzIgdGV4ZWxTaXplOwogIHVuaWZvcm0gZmxvYXQgZHQ7CiAgdW5pZm9ybSBmbG9hdCBkaXNzaXBhdGlvbjsKICB2b2lkIG1haW4gKCkgewogICAgaWYgKHRleHR1cmUyRCh1T2JzdGFjbGUsIHZVdikuciA+IDAuNSkgeyBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCk7IHJldHVybjsgfQogICAgdmVjMiBjb29yZCA9IHZVdiAtIGR0ICogdGV4dHVyZTJEKHVWZWxvY2l0eSwgdlV2KS54eSAqIHRleGVsU2l6ZTsKICAgIGdsX0ZyYWdDb2xvciA9IGRpc3NpcGF0aW9uICogdGV4dHVyZTJEKHVTb3VyY2UsIGNvb3JkKTsKICB9CmAKKSwgd2UgPSAoCiAgLyogZ2xzbCAqLwogIGAKICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgdmFyeWluZyB2ZWMyIHZMOyB2YXJ5aW5nIHZlYzIgdlI7IHZhcnlpbmcgdmVjMiB2VDsgdmFyeWluZyB2ZWMyIHZCOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVWZWxvY2l0eTsKICB1bmlmb3JtIHNhbXBsZXIyRCB1T2JzdGFjbGU7CiAgdm9pZCBtYWluICgpIHsKICAgIGZsb2F0IEwgPSB0ZXh0dXJlMkQodU9ic3RhY2xlLCB2TCkuciA+IDAuNSA/IDAuMCA6IHRleHR1cmUyRCh1VmVsb2NpdHksIHZMKS54OwogICAgZmxvYXQgUiA9IHRleHR1cmUyRCh1T2JzdGFjbGUsIHZSKS5yID4gMC41ID8gMC4wIDogdGV4dHVyZTJEKHVWZWxvY2l0eSwgdlIpLng7CiAgICBmbG9hdCBUID0gdGV4dHVyZTJEKHVPYnN0YWNsZSwgdlQpLnIgPiAwLjUgPyAwLjAgOiB0ZXh0dXJlMkQodVZlbG9jaXR5LCB2VCkueTsKICAgIGZsb2F0IEIgPSB0ZXh0dXJlMkQodU9ic3RhY2xlLCB2QikuciA+IDAuNSA/IDAuMCA6IHRleHR1cmUyRCh1VmVsb2NpdHksIHZCKS55OwogICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjUgKiAoUiAtIEwgKyBUIC0gQiksIDAuMCwgMC4wLCAxLjApOwogIH0KYAopLCBTZSA9ICgKICAvKiBnbHNsICovCiAgYAogIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICB2YXJ5aW5nIHZlYzIgdlV2OyB2YXJ5aW5nIHZlYzIgdkw7IHZhcnlpbmcgdmVjMiB2UjsgdmFyeWluZyB2ZWMyIHZUOyB2YXJ5aW5nIHZlYzIgdkI7CiAgdW5pZm9ybSBzYW1wbGVyMkQgdVByZXNzdXJlOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVEaXZlcmdlbmNlOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVPYnN0YWNsZTsKICB2b2lkIG1haW4gKCkgewogICAgZmxvYXQgQyA9IHRleHR1cmUyRCh1UHJlc3N1cmUsIHZVdikueDsKICAgIGZsb2F0IEwgPSB0ZXh0dXJlMkQodU9ic3RhY2xlLCB2TCkuciA+IDAuNSA/IEMgOiB0ZXh0dXJlMkQodVByZXNzdXJlLCB2TCkueDsKICAgIGZsb2F0IFIgPSB0ZXh0dXJlMkQodU9ic3RhY2xlLCB2UikuciA+IDAuNSA/IEMgOiB0ZXh0dXJlMkQodVByZXNzdXJlLCB2UikueDsKICAgIGZsb2F0IFQgPSB0ZXh0dXJlMkQodU9ic3RhY2xlLCB2VCkuciA+IDAuNSA/IEMgOiB0ZXh0dXJlMkQodVByZXNzdXJlLCB2VCkueDsKICAgIGZsb2F0IEIgPSB0ZXh0dXJlMkQodU9ic3RhY2xlLCB2QikuciA+IDAuNSA/IEMgOiB0ZXh0dXJlMkQodVByZXNzdXJlLCB2QikueDsKICAgIGZsb2F0IGRpdiA9IHRleHR1cmUyRCh1RGl2ZXJnZW5jZSwgdlV2KS54OwogICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgoTCArIFIgKyBCICsgVCAtIGRpdikgKiAwLjI1LCAwLjAsIDAuMCwgMS4wKTsKICB9CmAKKSwgQ2UgPSAoCiAgLyogZ2xzbCAqLwogIGAKICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgdmFyeWluZyB2ZWMyIHZVdjsgdmFyeWluZyB2ZWMyIHZMOyB2YXJ5aW5nIHZlYzIgdlI7IHZhcnlpbmcgdmVjMiB2VDsgdmFyeWluZyB2ZWMyIHZCOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVQcmVzc3VyZTsKICB1bmlmb3JtIHNhbXBsZXIyRCB1VmVsb2NpdHk7CiAgdW5pZm9ybSBzYW1wbGVyMkQgdU9ic3RhY2xlOwogIHZvaWQgbWFpbiAoKSB7CiAgICBpZiAodGV4dHVyZTJEKHVPYnN0YWNsZSwgdlV2KS5yID4gMC41KSB7IGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wKTsgcmV0dXJuOyB9CiAgICBmbG9hdCBMID0gdGV4dHVyZTJEKHVQcmVzc3VyZSwgdkwpLng7CiAgICBmbG9hdCBSID0gdGV4dHVyZTJEKHVQcmVzc3VyZSwgdlIpLng7CiAgICBmbG9hdCBUID0gdGV4dHVyZTJEKHVQcmVzc3VyZSwgdlQpLng7CiAgICBmbG9hdCBCID0gdGV4dHVyZTJEKHVQcmVzc3VyZSwgdkIpLng7CiAgICB2ZWMyIHZlbCA9IHRleHR1cmUyRCh1VmVsb2NpdHksIHZVdikueHkgLSB2ZWMyKFIgLSBMLCBUIC0gQik7CiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHZlbCwgMC4wLCAxLjApOwogIH0KYAopLCBGZSA9ICgKICAvKiBnbHNsICovCiAgYAogIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICB2YXJ5aW5nIHZlYzIgdlV2OwogIHVuaWZvcm0gc2FtcGxlcjJEIHVUYXJnZXQ7CiAgdW5pZm9ybSBmbG9hdCBhc3BlY3RSYXRpbzsKICB1bmlmb3JtIHZlYzMgY29sb3I7CiAgdW5pZm9ybSB2ZWMyIHBvaW50OwogIHVuaWZvcm0gZmxvYXQgcmFkaXVzOwogIHZvaWQgbWFpbiAoKSB7CiAgICB2ZWMyIHAgPSB2VXYgLSBwb2ludC54eTsKICAgIHAueCAqPSBhc3BlY3RSYXRpbzsKICAgIHZlYzMgc3BsYXQgPSBleHAoLWRvdChwLCBwKSAvIHJhZGl1cykgKiBjb2xvcjsKICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQodGV4dHVyZTJEKHVUYXJnZXQsIHZVdikueHl6ICsgc3BsYXQsIDEuMCk7CiAgfQpgCiksIFhlID0gKAogIC8qIGdsc2wgKi8KICBgCiAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwogIHZhcnlpbmcgdmVjMiB2TDsgdmFyeWluZyB2ZWMyIHZSOyB2YXJ5aW5nIHZlYzIgdlQ7IHZhcnlpbmcgdmVjMiB2QjsKICB1bmlmb3JtIHNhbXBsZXIyRCB1VmVsb2NpdHk7CiAgdm9pZCBtYWluICgpIHsKICAgIGZsb2F0IEwgPSB0ZXh0dXJlMkQodVZlbG9jaXR5LCB2TCkueTsKICAgIGZsb2F0IFIgPSB0ZXh0dXJlMkQodVZlbG9jaXR5LCB2UikueTsKICAgIGZsb2F0IFQgPSB0ZXh0dXJlMkQodVZlbG9jaXR5LCB2VCkueDsKICAgIGZsb2F0IEIgPSB0ZXh0dXJlMkQodVZlbG9jaXR5LCB2QikueDsKICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC41ICogKFIgLSBMIC0gVCArIEIpLCAwLjAsIDAuMCwgMS4wKTsKICB9CmAKKSwgQmUgPSAoCiAgLyogZ2xzbCAqLwogIGAKICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CiAgdmFyeWluZyB2ZWMyIHZVdjsgdmFyeWluZyB2ZWMyIHZMOyB2YXJ5aW5nIHZlYzIgdlI7IHZhcnlpbmcgdmVjMiB2VDsgdmFyeWluZyB2ZWMyIHZCOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVWZWxvY2l0eTsKICB1bmlmb3JtIHNhbXBsZXIyRCB1Q3VybDsKICB1bmlmb3JtIGZsb2F0IGN1cmw7CiAgdW5pZm9ybSBmbG9hdCBkdDsKICB2b2lkIG1haW4gKCkgewogICAgZmxvYXQgTCA9IHRleHR1cmUyRCh1Q3VybCwgdkwpLng7CiAgICBmbG9hdCBSID0gdGV4dHVyZTJEKHVDdXJsLCB2UikueDsKICAgIGZsb2F0IFQgPSB0ZXh0dXJlMkQodUN1cmwsIHZUKS54OwogICAgZmxvYXQgQiA9IHRleHR1cmUyRCh1Q3VybCwgdkIpLng7CiAgICBmbG9hdCBDID0gdGV4dHVyZTJEKHVDdXJsLCB2VXYpLng7CiAgICB2ZWMyIGZvcmNlID0gMC41ICogdmVjMihhYnMoVCkgLSBhYnMoQiksIGFicyhSKSAtIGFicyhMKSk7CiAgICBmb3JjZSAvPSBsZW5ndGgoZm9yY2UpICsgMC4wMDAxOwogICAgZm9yY2UgKj0gY3VybCAqIDMwLjAgKiBDOwogICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCh0ZXh0dXJlMkQodVZlbG9jaXR5LCB2VXYpLnh5ICsgZm9yY2UgKiBkdCwgMC4wLCAxLjApOwogIH0KYAopLCBBZSA9ICgKICAvKiBnbHNsICovCiAgYAogIHByZWNpc2lvbiBoaWdocCBmbG9hdDsKICB2YXJ5aW5nIHZlYzIgdlV2OwoKICB1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZTsKICB1bmlmb3JtIHNhbXBsZXIyRCB1T2JzdGFjbGU7CiAgdW5pZm9ybSBzYW1wbGVyMkQgdUJhY2tncm91bmQ7CiAgdW5pZm9ybSBzYW1wbGVyMkQgdUNvdmVyYWdlOwogIHVuaWZvcm0gc2FtcGxlcjJEIHVWZWxvY2l0eTsKCiAgdW5pZm9ybSB2ZWMyICB0ZXhlbFNpemU7CiAgdW5pZm9ybSB2ZWMzICB1V2F0ZXJDb2xvcjsKICB1bmlmb3JtIHZlYzMgIHVHbG93Q29sb3I7CiAgdW5pZm9ybSBmbG9hdCB1UmVmcmFjdGlvbjsKICB1bmlmb3JtIGZsb2F0IHVTcGVjdWxhckV4cDsKICB1bmlmb3JtIGZsb2F0IHVTaGluZTsKICB1bmlmb3JtIGZsb2F0IHVXYXJwU3RyZW5ndGg7CiAgdW5pZm9ybSBpbnQgICB1QWxnb3JpdGhtOwoKICB2b2lkIG1haW4gKCkgewogICAgZmxvYXQgZGVuc2l0eSAgPSBtYXgodGV4dHVyZTJEKHVUZXh0dXJlLCAgIHZVdikuciwgMC4wKTsKICAgIGZsb2F0IG9icyAgICAgID0gdGV4dHVyZTJEKHVPYnN0YWNsZSwgIHZVdikucjsKICAgIGZsb2F0IGNvdmVyYWdlID0gdGV4dHVyZTJEKHVDb3ZlcmFnZSwgIHZVdikucjsKCiAgICBmbG9hdCBkTCA9IG1heCh0ZXh0dXJlMkQodVRleHR1cmUsIHZVdiAtIHZlYzIodGV4ZWxTaXplLnggKiAyLjAsIDAuMCkpLnIsIDAuMCk7CiAgICBmbG9hdCBkUiA9IG1heCh0ZXh0dXJlMkQodVRleHR1cmUsIHZVdiArIHZlYzIodGV4ZWxTaXplLnggKiAyLjAsIDAuMCkpLnIsIDAuMCk7CiAgICBmbG9hdCBkVCA9IG1heCh0ZXh0dXJlMkQodVRleHR1cmUsIHZVdiArIHZlYzIoMC4wLCB0ZXhlbFNpemUueSAqIDIuMCkpLnIsIDAuMCk7CiAgICBmbG9hdCBkQiA9IG1heCh0ZXh0dXJlMkQodVRleHR1cmUsIHZVdiAtIHZlYzIoMC4wLCB0ZXhlbFNpemUueSAqIDIuMCkpLnIsIDAuMCk7CgogICAgdmVjMyAgbm9ybWFsICAgPSBub3JtYWxpemUodmVjMyhkTCAtIGRSLCBkQiAtIGRULCAwLjIpKTsKICAgIHZlYzMgIGxpZ2h0RGlyID0gbm9ybWFsaXplKHZlYzMoMC41LCAxLjAsIDAuNSkpOwogICAgdmVjMyAgaGFsZlYgICAgPSBub3JtYWxpemUobGlnaHREaXIgKyB2ZWMzKDAuMCwgMC4wLCAxLjApKTsKICAgIGZsb2F0IHNwZWMgICAgID0gcG93KG1heChkb3Qobm9ybWFsLCBoYWxmViksIDAuMCksIHVTcGVjdWxhckV4cCkgKiB1U2hpbmUgKiBkZW5zaXR5OwoKICAgIHZlYzMgYmcgICAgPSB0ZXh0dXJlMkQodUJhY2tncm91bmQsIHZVdikucmdiOwogICAgdmVjMyBjb2xvciA9IGJnOwoKICAgIGlmICh1QWxnb3JpdGhtID09IDEpIHsKICAgICAgLy8g4pSA4pSAIGdsYXNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAvLyBTdHJvbmcgVVYgZGlzdG9ydGlvbiBvbmx5LiBJbWFnZSBiZW5kcyBidXQgbm8gY29sb3VyIG92ZXJsYXkuCiAgICAgIHZlYzIgcmVmclV2ID0gY2xhbXAodlV2ICsgbm9ybWFsLnh5ICogdVJlZnJhY3Rpb24gKiBkZW5zaXR5ICogMy4wLCAwLjAsIDEuMCk7CiAgICAgIHZlYzMgcmVmckJnID0gdGV4dHVyZTJEKHVCYWNrZ3JvdW5kLCBtaXgodlV2LCByZWZyVXYsIDEuMCAtIG9icykpLnJnYjsKICAgICAgY29sb3IgPSByZWZyQmcgKyBzcGVjICogdUdsb3dDb2xvciAqIDIuNTsKICAgICAgY29sb3IgPSBtaXgoY29sb3IsIGJnICogMC42LCBvYnMgKiAwLjMpOwoKICAgIH0gZWxzZSBpZiAodUFsZ29yaXRobSA9PSAyKSB7CiAgICAgIC8vIOKUgOKUgCBpbmsg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgIC8vIERlbnNlIG9wYXF1ZSBwaWdtZW50IHRoYXQgc3RhaW5zLiBTdWJ0bGUgcmVmcmFjdGlvbiB1bmRlcm5lYXRoLgogICAgICBmbG9hdCBpbmtEICA9IG1pbihkZW5zaXR5ICogNC4wLCAxLjApOwogICAgICB2ZWMyIHJlZnJVdiA9IGNsYW1wKHZVdiArIG5vcm1hbC54eSAqIHVSZWZyYWN0aW9uICogZGVuc2l0eSAqIDAuNCwgMC4wLCAxLjApOwogICAgICB2ZWMzIHJlZnJCZyA9IHRleHR1cmUyRCh1QmFja2dyb3VuZCwgbWl4KHZVdiwgcmVmclV2LCAxLjAgLSBvYnMpKS5yZ2I7CiAgICAgIGNvbG9yID0gbWl4KHJlZnJCZywgdVdhdGVyQ29sb3IgKyBzcGVjICogdUdsb3dDb2xvciwgaW5rRCk7CiAgICAgIGNvbG9yID0gbWl4KGNvbG9yLCBiZyAqIDAuNSwgb2JzICogMC4xNSk7CgogICAgfSBlbHNlIGlmICh1QWxnb3JpdGhtID09IDMpIHsKICAgICAgLy8g4pSA4pSAIGF1cm9yYSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgLy8gVmVsb2NpdHkgZmllbGQgd2FycHMgYmFja2dyb3VuZCBVVnMg4oCUIGxpcXVpZCBtZXRhbCAvIGxhdmEtbGFtcCBmZWVsLgogICAgICB2ZWMyICB2ZWwgICAgPSB0ZXh0dXJlMkQodVZlbG9jaXR5LCB2VXYpLnh5OwogICAgICBmbG9hdCB2ZWxNYWcgPSBjbGFtcChsZW5ndGgodmVsKSAqIDIwLjAsIDAuMCwgMS4wKTsKICAgICAgdmVjMiAgd2FycFV2ID0gY2xhbXAodlV2ICsgdmVsICogdVdhcnBTdHJlbmd0aCwgMC4wLCAxLjApOwogICAgICB2ZWMzICB3YXJwQmcgPSB0ZXh0dXJlMkQodUJhY2tncm91bmQsIHdhcnBVdikucmdiOwogICAgICBjb2xvciAgPSBtaXgoYmcsIHdhcnBCZywgdmVsTWFnICogKDEuMCAtIG9icykpOwogICAgICBjb2xvciArPSBzcGVjICogdUdsb3dDb2xvciAqIHZlbE1hZyAqIDEuNTsKICAgICAgY29sb3IgKz0gdVdhdGVyQ29sb3IgKiBkZW5zaXR5ICogMC4zOwogICAgICBjb2xvciAgPSBtaXgoY29sb3IsIGJnICogMC41LCBvYnMgKiAwLjIpOwoKICAgIH0gZWxzZSBpZiAodUFsZ29yaXRobSA9PSA0KSB7CiAgICAgIC8vIOKUgOKUgCByaXBwbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgIC8vIEV4YWdnZXJhdGVkIG5vcm1hbCBwZXJ0dXJiYXRpb24gKyBGcmVzbmVsIHJpbSDigJQgY2FsbSB3YXRlciBzdXJmYWNlLgogICAgICB2ZWMyICByaXBwbGVVdiA9IGNsYW1wKHZVdiArIG5vcm1hbC54eSAqIHVSZWZyYWN0aW9uICogZGVuc2l0eSAqIDYuMCwgMC4wLCAxLjApOwogICAgICB2ZWMzICByZWZyQmcgICA9IHRleHR1cmUyRCh1QmFja2dyb3VuZCwgbWl4KHZVdiwgcmlwcGxlVXYsIDEuMCAtIG9icykpLnJnYjsKICAgICAgZmxvYXQgZnJlc25lbCAgPSBwb3coY2xhbXAoMS4wIC0gZG90KG5vcm1hbCwgdmVjMygwLjAsIDAuMCwgMS4wKSksIDAuMCwgMS4wKSwgMy4wKSAqIGRlbnNpdHk7CiAgICAgIGNvbG9yICA9IHJlZnJCZzsKICAgICAgY29sb3IgKz0gZnJlc25lbCAqIHVHbG93Q29sb3IgKiAyLjA7CiAgICAgIGNvbG9yICs9IHNwZWMgKiB1R2xvd0NvbG9yICogZGVuc2l0eSAqIDIuMDsKICAgICAgY29sb3IgID0gbWl4KGNvbG9yLCBiZyAqIDAuNSwgb2JzICogMC4yKTsKCiAgICB9IGVsc2UgewogICAgICAvLyDilIDilIAgc3RhbmRhcmQgKDApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAvLyBPcmlnaW5hbDogY29sb3VyIG92ZXJsYXkgYmxlbmRlZCBvdmVyIHJlZnJhY3RlZCBiYWNrZ3JvdW5kLgogICAgICB2ZWMyIHJlZnJVdiA9IHZVdiArIG5vcm1hbC54eSAqIHVSZWZyYWN0aW9uICogZGVuc2l0eTsKICAgICAgdmVjMyByZWZyQmcgPSB0ZXh0dXJlMkQodUJhY2tncm91bmQsIG1peCh2VXYsIHJlZnJVdiwgMS4wIC0gb2JzKSkucmdiOwogICAgICBjb2xvciAgPSBtaXgocmVmckJnLCB1V2F0ZXJDb2xvciwgbWluKGRlbnNpdHkgKiAxLjUsIDAuOCkpOwogICAgICBjb2xvciArPSBzcGVjICogdUdsb3dDb2xvcjsKICAgICAgY29sb3IgID0gbWl4KGNvbG9yLCBiZyAqIDAuNSwgb2JzICogMC4yKTsKICAgIH0KCiAgICAvLyBQcmVtdWx0aXBsaWVkIGFscGhhIOKAlCB0cmFuc3BhcmVudCB3aGVyZSB0aGVyZSBpcyBuZWl0aGVyIGNvbnRlbnQgbm9yIGZsdWlkLAogICAgLy8gbGV0dGluZyB0aGUgQ1NTIGJhY2tncm91bmRDb2xvciBvbiB0aGUgY29udGFpbmVyIGRpdiBzaG93IHRocm91Z2guCiAgICBmbG9hdCBhbHBoYSA9IGNsYW1wKG1heChkZW5zaXR5ICogMS41LCBjb3ZlcmFnZSksIDAuMCwgMS4wKTsKICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IgKiBhbHBoYSwgYWxwaGEpOwogIH0KYAopOwpmdW5jdGlvbiBMZShpKSB7CiAgY29uc3QgZSA9IHsgYWxwaGE6ICEwLCBkZXB0aDogITEsIHN0ZW5jaWw6ICExLCBhbnRpYWxpYXM6ICEwLCBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6ICExIH07CiAgbGV0IHIgPSBpLmdldENvbnRleHQoIndlYmdsMiIsIGUpOwogIGNvbnN0IG8gPSAhIXI7CiAgbyB8fCAociA9IGkuZ2V0Q29udGV4dCgid2ViZ2wiLCBlKSB8fCBpLmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIsIGUpLCByLmdldEV4dGVuc2lvbigiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0IikpOwogIGNvbnN0IHMgPSBvID8gbnVsbCA6IHIuZ2V0RXh0ZW5zaW9uKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksIG4gPSBvID8gci5IQUxGX0ZMT0FUIDogcy5IQUxGX0ZMT0FUX09FUzsKICByZXR1cm4gci5nZXRFeHRlbnNpb24oIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSwgci5nZXRFeHRlbnNpb24oIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIiksIHsKICAgIGdsOiByLAogICAgaXNXZWJHTDI6IG8sCiAgICBleHQ6IHsKICAgICAgaW50ZXJuYWxGb3JtYXQ6IG8gPyByLlJHQkExNkYgOiByLlJHQkEsCiAgICAgIGZvcm1hdDogci5SR0JBLAogICAgICB0eXBlOiBuCiAgICB9CiAgfTsKfQpjbGFzcyBPIHsKICBjb25zdHJ1Y3RvcihlLCByLCBvKSB7CiAgICBpZSh0aGlzLCAicHJvZ3JhbSIpOwogICAgaWUodGhpcywgInVuaWZvcm1zIiwge30pOwogICAgaWUodGhpcywgIl9nbCIpOwogICAgdGhpcy5fZ2wgPSBlLCB0aGlzLnByb2dyYW0gPSBlLmNyZWF0ZVByb2dyYW0oKSwgZS5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCB0aGlzLl9jb21waWxlKGUuVkVSVEVYX1NIQURFUiwgcikpLCBlLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIHRoaXMuX2NvbXBpbGUoZS5GUkFHTUVOVF9TSEFERVIsIG8pKSwgZS5saW5rUHJvZ3JhbSh0aGlzLnByb2dyYW0pOwogICAgY29uc3QgcyA9IGUuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sIGUuQUNUSVZFX1VOSUZPUk1TKTsKICAgIGZvciAobGV0IG4gPSAwOyBuIDwgczsgbisrKSB7CiAgICAgIGNvbnN0IHUgPSBlLmdldEFjdGl2ZVVuaWZvcm0odGhpcy5wcm9ncmFtLCBuKS5uYW1lOwogICAgICB0aGlzLnVuaWZvcm1zW3VdID0gZS5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCB1KTsKICAgIH0KICB9CiAgX2NvbXBpbGUoZSwgcikgewogICAgY29uc3QgbyA9IHRoaXMuX2dsLCBzID0gby5jcmVhdGVTaGFkZXIoZSk7CiAgICByZXR1cm4gby5zaGFkZXJTb3VyY2UocywgciksIG8uY29tcGlsZVNoYWRlcihzKSwgczsKICB9CiAgYmluZCgpIHsKICAgIHRoaXMuX2dsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKTsKICB9CiAgZGlzcG9zZSgpIHsKICAgIHRoaXMuX2dsLmRlbGV0ZVByb2dyYW0odGhpcy5wcm9ncmFtKTsKICB9Cn0KZnVuY3Rpb24gT2UoaSkgewogIHJldHVybiB7CiAgICBhZHZlY3Rpb246IG5ldyBPKGksIEwsIF9lKSwKICAgIGRpdmVyZ2VuY2U6IG5ldyBPKGksIEwsIHdlKSwKICAgIHByZXNzdXJlOiBuZXcgTyhpLCBMLCBTZSksCiAgICBncmFkaWVudFN1YnRyYWN0OiBuZXcgTyhpLCBMLCBDZSksCiAgICBzcGxhdDogbmV3IE8oaSwgTCwgRmUpLAogICAgY3VybDogbmV3IE8oaSwgTCwgWGUpLAogICAgdm9ydGljaXR5OiBuZXcgTyhpLCBMLCBCZSksCiAgICBkaXNwbGF5OiBuZXcgTyhpLCBMLCBBZSkKICB9Owp9CmZ1bmN0aW9uIHNlKGksIGUsIHIsIG8pIHsKICBpLmFjdGl2ZVRleHR1cmUoaS5URVhUVVJFMCk7CiAgY29uc3QgcyA9IGkuY3JlYXRlVGV4dHVyZSgpOwogIGkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELCBzKSwgaS50ZXhQYXJhbWV0ZXJpKGkuVEVYVFVSRV8yRCwgaS5URVhUVVJFX01JTl9GSUxURVIsIGkuTElORUFSKSwgaS50ZXhQYXJhbWV0ZXJpKGkuVEVYVFVSRV8yRCwgaS5URVhUVVJFX01BR19GSUxURVIsIGkuTElORUFSKSwgaS50ZXhQYXJhbWV0ZXJpKGkuVEVYVFVSRV8yRCwgaS5URVhUVVJFX1dSQVBfUywgaS5DTEFNUF9UT19FREdFKSwgaS50ZXhQYXJhbWV0ZXJpKGkuVEVYVFVSRV8yRCwgaS5URVhUVVJFX1dSQVBfVCwgaS5DTEFNUF9UT19FREdFKSwgaS50ZXhJbWFnZTJEKGkuVEVYVFVSRV8yRCwgMCwgZS5pbnRlcm5hbEZvcm1hdCwgciwgbywgMCwgZS5mb3JtYXQsIGUudHlwZSwgbnVsbCk7CiAgY29uc3QgbiA9IGkuY3JlYXRlRnJhbWVidWZmZXIoKTsKICByZXR1cm4gaS5iaW5kRnJhbWVidWZmZXIoaS5GUkFNRUJVRkZFUiwgbiksIGkuZnJhbWVidWZmZXJUZXh0dXJlMkQoaS5GUkFNRUJVRkZFUiwgaS5DT0xPUl9BVFRBQ0hNRU5UMCwgaS5URVhUVVJFXzJELCBzLCAwKSwgeyB0ZXg6IHMsIGZibzogbiwgd2lkdGg6IHIsIGhlaWdodDogbyB9Owp9CmZ1bmN0aW9uIGZlKGksIGUsIHIsIG8pIHsKICBsZXQgcyA9IHNlKGksIGUsIHIsIG8pLCBuID0gc2UoaSwgZSwgciwgbyk7CiAgcmV0dXJuIHsKICAgIGdldCByZWFkKCkgewogICAgICByZXR1cm4gczsKICAgIH0sCiAgICBnZXQgd3JpdGUoKSB7CiAgICAgIHJldHVybiBuOwogICAgfSwKICAgIHN3YXAoKSB7CiAgICAgIFtzLCBuXSA9IFtuLCBzXTsKICAgIH0sCiAgICBkaXNwb3NlKCkgewogICAgICBpLmRlbGV0ZVRleHR1cmUocy50ZXgpLCBpLmRlbGV0ZUZyYW1lYnVmZmVyKHMuZmJvKSwgaS5kZWxldGVUZXh0dXJlKG4udGV4KSwgaS5kZWxldGVGcmFtZWJ1ZmZlcihuLmZibyk7CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBQZShpKSB7CiAgY29uc3QgZSA9IGkuY3JlYXRlQnVmZmVyKCk7CiAgcmV0dXJuIGkuYmluZEJ1ZmZlcihpLkFSUkFZX0JVRkZFUiwgZSksIGkuYnVmZmVyRGF0YSgKICAgIGkuQVJSQVlfQlVGRkVSLAogICAgbmV3IEZsb2F0MzJBcnJheShbLTEsIC0xLCAtMSwgMSwgMSwgMSwgMSwgLTFdKSwKICAgIGkuU1RBVElDX0RSQVcKICApLCBpLnZlcnRleEF0dHJpYlBvaW50ZXIoMCwgMiwgaS5GTE9BVCwgITEsIDAsIDApLCBpLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApLCBmdW5jdGlvbihvKSB7CiAgICBpLmJpbmRGcmFtZWJ1ZmZlcihpLkZSQU1FQlVGRkVSLCBvKSwgaS5kcmF3QXJyYXlzKGkuVFJJQU5HTEVfRkFOLCAwLCA0KTsKICB9Owp9CmZ1bmN0aW9uIHZlKGksIGUsIHIsIG8sIHMgPSAiY292ZXIiKSB7CiAgbGV0IG47CiAgcyA9PT0gImNvdmVyIiA/IG4gPSBNYXRoLm1heChyIC8gaSwgbyAvIGUpIDogcyA9PT0gImNvbnRhaW4iID8gbiA9IE1hdGgubWluKHIgLyBpLCBvIC8gZSkgOiB0eXBlb2YgcyA9PSAic3RyaW5nIiAmJiBzLmVuZHNXaXRoKCIlIikgPyBuID0gTWF0aC5taW4ociAvIGksIG8gLyBlKSAqIChwYXJzZUZsb2F0KHMpIC8gMTAwKSA6IHR5cGVvZiBzID09ICJzdHJpbmciICYmIHMuZW5kc1dpdGgoInB4IikgPyBuID0gcGFyc2VGbG9hdChzKSAvIE1hdGgubWF4KGksIGUpIDogdHlwZW9mIHMgPT0gIm51bWJlciIgPyBuID0gcyA6IG4gPSBNYXRoLm1heChyIC8gaSwgbyAvIGUpOwogIGNvbnN0IHUgPSBpICogbiwgZCA9IGUgKiBuOwogIHJldHVybiB7IHg6IChyIC0gdSkgLyAyLCB5OiAobyAtIGQpIC8gMiwgZHJhd1c6IHUsIGRyYXdIOiBkIH07Cn0KZnVuY3Rpb24gSWUoaSwgZSwgciwgbywgcyA9IG51bGwsIG4gPSAiY292ZXIiKSB7CiAgY29uc3QgeyB0ZXh0OiB1LCBmb250U2l6ZTogZCwgY29sb3I6IEUsIGZvbnRGYW1pbHk6IGMgPSAic2Fucy1zZXJpZiIsIGZvbnRXZWlnaHQ6IGggPSA5MDAgfSA9IG8sIGcgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKGUsIHIpLCBmID0gZy5nZXRDb250ZXh0KCIyZCIpOwogICgocmUsIFRlID0gMCkgPT4gewogICAgaWYgKHMpIHsKICAgICAgZi5jbGVhclJlY3QoMCwgMCwgZSwgciksIGYuZmlsbFN0eWxlID0gImJsYWNrIiwgZi5maWxsUmVjdCgwLCAwLCBlLCByKTsKICAgICAgY29uc3QgeyB4OiBuZSwgeTogdWUsIGRyYXdXOiBsZSwgZHJhd0g6IGdlIH0gPSB2ZSgKICAgICAgICBzLndpZHRoLAogICAgICAgIHMuaGVpZ2h0LAogICAgICAgIGUsCiAgICAgICAgciwKICAgICAgICBuCiAgICAgICk7CiAgICAgIGYuZHJhd0ltYWdlKHMsIG5lLCB1ZSwgbGUsIGdlKTsKICAgIH0gZWxzZQogICAgICBmLmZpbGxTdHlsZSA9ICJibGFjayIsIGYuZmlsbFJlY3QoMCwgMCwgZSwgcik7CiAgICBmLnNoYWRvd0NvbG9yID0gcmUsIGYuZmlsbFN0eWxlID0gcmUsIGYuZm9udCA9IGAke2h9ICR7ZH1weCAke2N9YCwgZi50ZXh0QWxpZ24gPSAiY2VudGVyIiwgZi50ZXh0QmFzZWxpbmUgPSAibWlkZGxlIiwgZi5maWxsVGV4dCh1LCBlIC8gMiwgciAvIDIpOwogIH0pKEUpOwogIGNvbnN0IE4gPSBLKGksIGcpOwogIGYuZmlsbFN0eWxlID0gImJsYWNrIiwgZi5maWxsUmVjdCgwLCAwLCBlLCByKSwgZi5maWxsU3R5bGUgPSAid2hpdGUiLCBmLmZvbnQgPSBgJHtofSAke2R9cHggJHtjfWAsIGYudGV4dEFsaWduID0gImNlbnRlciIsIGYudGV4dEJhc2VsaW5lID0gIm1pZGRsZSIsIGYuZmlsbFRleHQodSwgZSAvIDIsIHIgLyAyKTsKICBjb25zdCB0ZSA9IEsoaSwgZyk7CiAgcmV0dXJuIHsgYmFja2dyb3VuZFRleDogTiwgb2JzdGFjbGVUZXg6IHRlLCBjb3ZlcmFnZVRleDogdGUgfTsKfQpmdW5jdGlvbiBrZShpLCBlLCByLCBvLCBzID0gMCwgbiA9ICJjb3ZlciIsIHUgPSBudWxsLCBkID0gImNvdmVyIikgewogIGNvbnN0IEUgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHIsIG8pLCBjID0gRS5nZXRDb250ZXh0KCIyZCIpLCB7IHg6IGgsIHk6IGcsIGRyYXdXOiBmLCBkcmF3SDogeSB9ID0gdmUoZS53aWR0aCwgZS5oZWlnaHQsIHIsIG8sIG4pOwogIGlmIChjLmNsZWFyUmVjdCgwLCAwLCByLCBvKSwgYy5maWxsU3R5bGUgPSAiYmxhY2siLCBjLmZpbGxSZWN0KDAsIDAsIHIsIG8pLCB1KSB7CiAgICBjb25zdCB7CiAgICAgIHg6IFRlLAogICAgICB5OiBuZSwKICAgICAgZHJhd1c6IHVlLAogICAgICBkcmF3SDogbGUKICAgIH0gPSB2ZSh1LndpZHRoLCB1LmhlaWdodCwgciwgbywgZCk7CiAgICBjLmZpbHRlciA9IGBicmlnaHRuZXNzKCR7c30pIGJsdXIoOHB4KWAsIGMuZHJhd0ltYWdlKHUsIFRlLCBuZSwgdWUsIGxlKSwgYy5maWx0ZXIgPSAibm9uZSI7CiAgfQogIGMuZHJhd0ltYWdlKGUsIGgsIGcsIGYsIHkpOwogIGNvbnN0IE4gPSBLKGksIEUpOwogIGMuY2xlYXJSZWN0KDAsIDAsIHIsIG8pLCBjLmZpbGxTdHlsZSA9ICJibGFjayIsIGMuZmlsbFJlY3QoMCwgMCwgciwgbyksIGMuZmlsdGVyID0gYGJyaWdodG5lc3MoJHtzfSkgYmx1cig4cHgpYCwgYy5kcmF3SW1hZ2UoZSwgaCwgZywgZiwgeSksIGMuZmlsdGVyID0gIm5vbmUiOwogIGNvbnN0IHRlID0gSyhpLCBFKTsKICBjLmNsZWFyUmVjdCgwLCAwLCByLCBvKSwgYy5maWxsU3R5bGUgPSAiYmxhY2siLCBjLmZpbGxSZWN0KDAsIDAsIHIsIG8pLCBjLmZpbGxTdHlsZSA9ICJ3aGl0ZSIsIGMuZmlsbFJlY3QoCiAgICBNYXRoLm1heCgwLCBoKSwKICAgIE1hdGgubWF4KDAsIGcpLAogICAgTWF0aC5taW4oZiwgciAtIE1hdGgubWF4KDAsIGgpKSwKICAgIE1hdGgubWluKHksIG8gLSBNYXRoLm1heCgwLCBnKSkKICApOwogIGNvbnN0IHJlID0gSyhpLCBFKTsKICByZXR1cm4geyBiYWNrZ3JvdW5kVGV4OiBOLCBvYnN0YWNsZVRleDogdGUsIGNvdmVyYWdlVGV4OiByZSB9Owp9CmZ1bmN0aW9uIEsoaSwgZSkgewogIGNvbnN0IHIgPSBpLmNyZWF0ZVRleHR1cmUoKTsKICByZXR1cm4gaS5iaW5kVGV4dHVyZShpLlRFWFRVUkVfMkQsIHIpLCBpLnBpeGVsU3RvcmVpKGkuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgITApLCBpLnRleEltYWdlMkQoaS5URVhUVVJFXzJELCAwLCBpLlJHQiwgaS5SR0IsIGkuVU5TSUdORURfQllURSwgZSksIGkudGV4UGFyYW1ldGVyaShpLlRFWFRVUkVfMkQsIGkuVEVYVFVSRV9NSU5fRklMVEVSLCBpLkxJTkVBUiksIGkudGV4UGFyYW1ldGVyaShpLlRFWFRVUkVfMkQsIGkuVEVYVFVSRV9NQUdfRklMVEVSLCBpLkxJTkVBUiksIGkudGV4UGFyYW1ldGVyaShpLlRFWFRVUkVfMkQsIGkuVEVYVFVSRV9XUkFQX1MsIGkuQ0xBTVBfVE9fRURHRSksIGkudGV4UGFyYW1ldGVyaShpLlRFWFRVUkVfMkQsIGkuVEVYVFVSRV9XUkFQX1QsIGkuQ0xBTVBfVE9fRURHRSksIHI7Cn0KYXN5bmMgZnVuY3Rpb24gTWUoaSkgewogIGNvbnN0IGUgPSBhd2FpdCBmZXRjaChpKTsKICBpZiAoIWUub2spCiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBpbWFnZTogJHtpfSAoJHtlLnN0YXR1c30pYCk7CiAgY29uc3QgciA9IGF3YWl0IGUuYmxvYigpOwogIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChyKTsKfQpjb25zdCBwZSA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPCAidSIgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZChnbG9iYWxUaGlzKSA6IChpKSA9PiBzZXRUaW1lb3V0KGksIDFlMyAvIDYwKSwgVmUgPSB0eXBlb2YgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPCAidSIgPyBjYW5jZWxBbmltYXRpb25GcmFtZS5iaW5kKGdsb2JhbFRoaXMpIDogY2xlYXJUaW1lb3V0LCBFZSA9IDAuMDE2LCBHZSA9IHsgc3RhbmRhcmQ6IDAsIGdsYXNzOiAxLCBpbms6IDIsIGF1cm9yYTogMywgcmlwcGxlOiA0IH07CnZhciBNLCBiLCBKLCBWLCBZLCBwLCBELCBQLCBJLCBSLCB2LCBTLCBDLCBGLCBBLCBVLCBYLCB3LCBxLCBHLCBtLCBfLCBCLCB6LCBXLCBqLCBRLCBoZSwgaywgJCwgSCwgb2UsIFosIG1lLCBlZSwgeGUsIGFlLCBiZTsKY2xhc3MgemUgewogIGNvbnN0cnVjdG9yKGUsIHIgPSB7fSkgewogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBQcml2YXRlIGhlbHBlcnMKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgbCh0aGlzLCBXKTsKICAgIGwodGhpcywgUSk7CiAgICBsKHRoaXMsIGspOwogICAgbCh0aGlzLCBIKTsKICAgIGwodGhpcywgWik7CiAgICBsKHRoaXMsIGVlKTsKICAgIGwodGhpcywgYWUpOwogICAgbCh0aGlzLCBNLCB2b2lkIDApOwogICAgbCh0aGlzLCBiLCB2b2lkIDApOwogICAgbCh0aGlzLCBKLCB2b2lkIDApOwogICAgbCh0aGlzLCBWLCB2b2lkIDApOwogICAgbCh0aGlzLCBZLCB2b2lkIDApOwogICAgbCh0aGlzLCBwLCAwKTsKICAgIGwodGhpcywgRCwgMCk7CiAgICBsKHRoaXMsIFAsIDApOwogICAgbCh0aGlzLCBJLCAwKTsKICAgIGwodGhpcywgUiwgbnVsbCk7CiAgICBsKHRoaXMsIHYsIG51bGwpOwogICAgbCh0aGlzLCBTLCBudWxsKTsKICAgIGwodGhpcywgQywgbnVsbCk7CiAgICBsKHRoaXMsIEYsIG51bGwpOwogICAgbCh0aGlzLCBBLCBudWxsKTsKICAgIGwodGhpcywgVSwgbnVsbCk7CiAgICBsKHRoaXMsIFgsIG51bGwpOwogICAgLy8gYmluYXJ5IGNvbnRlbnQgbWFzayBmb3IgdHJhbnNwYXJlbnQgY2FudmFzIHN1cHBvcnQKICAgIGwodGhpcywgdywgbnVsbCk7CiAgICAvLyBvcHRpb25hbCBiYWNrZ3JvdW5kIGltYWdlIChmcm9tIGJhY2tncm91bmRTcmMgcHJvcCkKICAgIGwodGhpcywgcSwgImNvdmVyIik7CiAgICBsKHRoaXMsIEcsIHZvaWQgMCk7CiAgICBsKHRoaXMsIG0sIHsgeDogMCwgeTogMCwgZHg6IDAsIGR5OiAwLCB0YXJnZXRYOiAwLCB0YXJnZXRZOiAwLCBtb3ZlZDogITEgfSk7CiAgICAvLyBTdG9yZXMgc291cmNlIHNvIHRleHR1cmVzIGNhbiBiZSByZWJ1aWx0IG9uIHJlc2l6ZQogICAgbCh0aGlzLCBfLCBudWxsKTsKICAgIGwodGhpcywgQiwgbnVsbCk7CiAgICBsKHRoaXMsIHosICExKTsKICAgIGEodGhpcywgTSwgZSksIGEodGhpcywgRywgVWUocikpOwogICAgY29uc3QgeyBnbDogbywgZXh0OiBzIH0gPSBMZShlKTsKICAgIGEodGhpcywgYiwgbyksIGEodGhpcywgSiwgcyksIGEodGhpcywgViwgT2UobykpLCBhKHRoaXMsIFksIFBlKG8pKSwgby5jbGVhckNvbG9yKDAsIDAsIDAsIDApOwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBQdWJsaWMgQVBJCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgc2V0VGV4dFNvdXJjZShlKSB7CiAgICBhKHRoaXMsIF8sIHsgdHlwZTogInRleHQiLCBvcHRzOiBlIH0pLCBUKHRoaXMsIFcsIGopLmNhbGwodGhpcyksIFQodGhpcywgaywgJCkuY2FsbCh0aGlzKSwgVCh0aGlzLCBILCBvZSkuY2FsbCh0aGlzKTsKICB9CiAgYXN5bmMgc2V0SW1hZ2VTb3VyY2UoZSwgciA9IDAsIG8gPSAiY292ZXIiKSB7CiAgICBjb25zdCBzID0gYXdhaXQgTWUoZSk7CiAgICBhKHRoaXMsIF8sIHsgdHlwZTogImltYWdlIiwgYml0bWFwOiBzLCBlZmZlY3Q6IHIsIHNpemU6IG8gfSksIFQodGhpcywgVywgaikuY2FsbCh0aGlzKSwgVCh0aGlzLCBrLCAkKS5jYWxsKHRoaXMpLCBUKHRoaXMsIEgsIG9lKS5jYWxsKHRoaXMpOwogIH0KICBzZXRJbWFnZUJpdG1hcChlLCByID0gMCwgbyA9ICJjb3ZlciIpIHsKICAgIGEodGhpcywgXywgeyB0eXBlOiAiaW1hZ2UiLCBiaXRtYXA6IGUsIGVmZmVjdDogciwgc2l6ZTogbyB9KSwgVCh0aGlzLCBXLCBqKS5jYWxsKHRoaXMpLCBUKHRoaXMsIGssICQpLmNhbGwodGhpcyksIFQodGhpcywgSCwgb2UpLmNhbGwodGhpcyk7CiAgfQogIHNldEJhY2tncm91bmQoZSwgciA9ICJjb3ZlciIpIHsKICAgIHQodGhpcywgdykgJiYgdCh0aGlzLCB3KSAhPT0gZSAmJiB0KHRoaXMsIHcpLmNsb3NlKCksIGEodGhpcywgdywgZSksIGEodGhpcywgcSwgciA/PyAiY292ZXIiKSwgdCh0aGlzLCBfKSAmJiB0KHRoaXMsIHApID4gMCAmJiBUKHRoaXMsIGssICQpLmNhbGwodGhpcyk7CiAgfQogIGhhbmRsZU1vdmUoZSwgciwgbyA9IDEpIHsKICAgIHQodGhpcywgbSkubW92ZWQgPSAhMCwgdCh0aGlzLCBtKS5keCA9IChlIC0gdCh0aGlzLCBtKS50YXJnZXRYKSAqIG8sIHQodGhpcywgbSkuZHkgPSAociAtIHQodGhpcywgbSkudGFyZ2V0WSkgKiBvLCB0KHRoaXMsIG0pLnRhcmdldFggPSBlLCB0KHRoaXMsIG0pLnRhcmdldFkgPSByOwogIH0KICAvKioKICAgKiBJbW1lZGlhdGVseSBhcHBsaWVzIG9uZSBmbHVpZCBzcGxhdCBhdCAoeCwgeSkgd2l0aCBleHBsaWNpdCB2ZWxvY2l0eSAodngsIHZ5KS4KICAgKiBTYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMgcGVyIGZyYW1lIOKAlCBlYWNoIGNhbGwgd3JpdGVzIGRpcmVjdGx5IHRvIHRoZSBGQk9zLgogICAqIERlc2lnbmVkIGZvciBwcm9ncmFtbWF0aWMgdXNlIGNhc2VzIChlLmcuIHBhcnRpY2xlIHN5c3RlbXMsIGF0dHJhY3RvciBwYXRocykKICAgKiB3aGVyZSB5b3Ugd2FudCBOIGluZGVwZW5kZW50IGluamVjdGlvbiBwb2ludHMgcGVyIGZyYW1lIHdpdGhvdXQgZmxvb2RpbmcgdGhlCiAgICogbW91c2Utc3RhdGUgbWFjaGluZSBvciB0aGUgd29ya2VyIG1lc3NhZ2UgcXVldWUuCiAgICovCiAgc3BsYXQoZSwgciwgbywgcywgbiA9IDEpIHsKICAgIGlmICghdCh0aGlzLCB6KSB8fCB0KHRoaXMsIHApID09PSAwKQogICAgICByZXR1cm47CiAgICBjb25zdCB1ID0gdCh0aGlzLCBiKSwgZCA9IHQodGhpcywgRyksIHsgc3BsYXQ6IEUgfSA9IHQodGhpcywgViksIGMgPSB0KHRoaXMsIFkpOwogICAgdS52aWV3cG9ydCgwLCAwLCB0KHRoaXMsIFApLCB0KHRoaXMsIEkpKSwgRS5iaW5kKCksIHUudW5pZm9ybTFmKEUudW5pZm9ybXMuYXNwZWN0UmF0aW8sIHQodGhpcywgcCkgLyB0KHRoaXMsIEQpKSwgdS51bmlmb3JtMmYoRS51bmlmb3Jtcy5wb2ludCwgZSAvIHQodGhpcywgcCksIDEgLSByIC8gdCh0aGlzLCBEKSksIHUudW5pZm9ybTFmKEUudW5pZm9ybXMucmFkaXVzLCBkLnNwbGF0UmFkaXVzKSwgdS51bmlmb3JtMWkoRS51bmlmb3Jtcy51VGFyZ2V0LCAwKSwgdS5hY3RpdmVUZXh0dXJlKHUuVEVYVFVSRTApLCB1LmJpbmRUZXh0dXJlKHUuVEVYVFVSRV8yRCwgdCh0aGlzLCB2KS5yZWFkLnRleCksIHUudW5pZm9ybTNmKEUudW5pZm9ybXMuY29sb3IsIG8gKiBkLnNwbGF0Rm9yY2UgKiBuLCAtcyAqIGQuc3BsYXRGb3JjZSAqIG4sIDApLCBjKHQodGhpcywgdikud3JpdGUuZmJvKSwgdCh0aGlzLCB2KS5zd2FwKCksIHUuYWN0aXZlVGV4dHVyZSh1LlRFWFRVUkUwKSwgdS5iaW5kVGV4dHVyZSh1LlRFWFRVUkVfMkQsIHQodGhpcywgUikucmVhZC50ZXgpLCB1LnVuaWZvcm0zZihFLnVuaWZvcm1zLmNvbG9yLCBuLCBuLCBuKSwgYyh0KHRoaXMsIFIpLndyaXRlLmZibyksIHQodGhpcywgUikuc3dhcCgpOwogIH0KICByZXNpemUoZSwgcikgewogICAgZSAhPT0gdm9pZCAwICYmIGUgPiAwID8gKGEodGhpcywgcCwgdCh0aGlzLCBNKS53aWR0aCA9IGUpLCBhKHRoaXMsIEQsIHQodGhpcywgTSkuaGVpZ2h0ID0gciksIGEodGhpcywgUCwgZSA+PiAxKSwgYSh0aGlzLCBJLCByID4+IDEpLCBUKHRoaXMsIFEsIGhlKS5jYWxsKHRoaXMpKSA6IFQodGhpcywgVywgaikuY2FsbCh0aGlzKSwgdCh0aGlzLCBfKSAmJiBUKHRoaXMsIGssICQpLmNhbGwodGhpcyk7CiAgfQogIHVwZGF0ZUNvbmZpZyhlKSB7CiAgICBPYmplY3QuYXNzaWduKHQodGhpcywgRyksIGUpOwogIH0KICBkZXN0cm95KCkgewogICAgdGhpcy5zdG9wKCk7CiAgICBjb25zdCBlID0gdCh0aGlzLCBiKTsKICAgIFQodGhpcywgWiwgbWUpLmNhbGwodGhpcyksIFQodGhpcywgZWUsIHhlKS5jYWxsKHRoaXMpLCB0KHRoaXMsIHcpICYmICh0KHRoaXMsIHcpLmNsb3NlKCksIGEodGhpcywgdywgbnVsbCkpOwogICAgZm9yIChjb25zdCBvIG9mIE9iamVjdC52YWx1ZXModCh0aGlzLCBWKSkpCiAgICAgIG8uZGlzcG9zZSgpOwogICAgY29uc3QgciA9IGUuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9sb3NlX2NvbnRleHQiKTsKICAgIHIgPT0gbnVsbCB8fCByLmxvc2VDb250ZXh0KCk7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIExvb3AgY29udHJvbAogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHN0YXJ0KCkgewogICAgaWYgKHQodGhpcywgQikgIT09IG51bGwpCiAgICAgIHJldHVybjsKICAgIGNvbnN0IGUgPSAoKSA9PiB7CiAgICAgIFQodGhpcywgYWUsIGJlKS5jYWxsKHRoaXMpLCBhKHRoaXMsIEIsIHBlKGUpKTsKICAgIH07CiAgICBhKHRoaXMsIEIsIHBlKGUpKTsKICB9CiAgc3RvcCgpIHsKICAgIHQodGhpcywgQikgIT09IG51bGwgJiYgKFZlKHQodGhpcywgQikpLCBhKHRoaXMsIEIsIG51bGwpKTsKICB9CiAgZ2V0IGlzUnVubmluZygpIHsKICAgIHJldHVybiB0KHRoaXMsIEIpICE9PSBudWxsOwogIH0KfQpNID0gbmV3IFdlYWtNYXAoKSwgYiA9IG5ldyBXZWFrTWFwKCksIEogPSBuZXcgV2Vha01hcCgpLCBWID0gbmV3IFdlYWtNYXAoKSwgWSA9IG5ldyBXZWFrTWFwKCksIHAgPSBuZXcgV2Vha01hcCgpLCBEID0gbmV3IFdlYWtNYXAoKSwgUCA9IG5ldyBXZWFrTWFwKCksIEkgPSBuZXcgV2Vha01hcCgpLCBSID0gbmV3IFdlYWtNYXAoKSwgdiA9IG5ldyBXZWFrTWFwKCksIFMgPSBuZXcgV2Vha01hcCgpLCBDID0gbmV3IFdlYWtNYXAoKSwgRiA9IG5ldyBXZWFrTWFwKCksIEEgPSBuZXcgV2Vha01hcCgpLCBVID0gbmV3IFdlYWtNYXAoKSwgWCA9IG5ldyBXZWFrTWFwKCksIHcgPSBuZXcgV2Vha01hcCgpLCBxID0gbmV3IFdlYWtNYXAoKSwgRyA9IG5ldyBXZWFrTWFwKCksIG0gPSBuZXcgV2Vha01hcCgpLCBfID0gbmV3IFdlYWtNYXAoKSwgQiA9IG5ldyBXZWFrTWFwKCksIHogPSBuZXcgV2Vha01hcCgpLCBXID0gbmV3IFdlYWtTZXQoKSwgaiA9IGZ1bmN0aW9uKCkgewogIGNvbnN0IGUgPSB0KHRoaXMsIE0pOwogIGEodGhpcywgcCwgZS53aWR0aCA9IGUuY2xpZW50V2lkdGggfHwgZS53aWR0aCksIGEodGhpcywgRCwgZS5oZWlnaHQgPSBlLmNsaWVudEhlaWdodCB8fCBlLmhlaWdodCksICEodCh0aGlzLCBwKSA9PT0gMCB8fCB0KHRoaXMsIEQpID09PSAwKSAmJiAoYSh0aGlzLCBQLCB0KHRoaXMsIHApID4+IDEpLCBhKHRoaXMsIEksIHQodGhpcywgRCkgPj4gMSksIFQodGhpcywgUSwgaGUpLmNhbGwodGhpcykpOwp9LCBRID0gbmV3IFdlYWtTZXQoKSwgaGUgPSBmdW5jdGlvbigpIHsKICBjb25zdCBlID0gdCh0aGlzLCBiKSwgciA9IHQodGhpcywgSiksIG8gPSB0KHRoaXMsIFApLCBzID0gdCh0aGlzLCBJKTsKICBUKHRoaXMsIFosIG1lKS5jYWxsKHRoaXMpLCBhKHRoaXMsIFIsIGZlKGUsIHIsIG8sIHMpKSwgYSh0aGlzLCB2LCBmZShlLCByLCBvLCBzKSksIGEodGhpcywgQywgZmUoZSwgciwgbywgcykpLCBhKHRoaXMsIFMsIHNlKGUsIHIsIG8sIHMpKSwgYSh0aGlzLCBGLCBzZShlLCByLCBvLCBzKSk7Cn0sIGsgPSBuZXcgV2Vha1NldCgpLCAkID0gZnVuY3Rpb24oKSB7CiAgaWYgKCEoIXQodGhpcywgXykgfHwgdCh0aGlzLCBwKSA9PT0gMCkpIHsKICAgIGlmIChUKHRoaXMsIGVlLCB4ZSkuY2FsbCh0aGlzKSwgdCh0aGlzLCBfKS50eXBlID09PSAidGV4dCIpIHsKICAgICAgY29uc3QgeyBiYWNrZ3JvdW5kVGV4OiBlLCBvYnN0YWNsZVRleDogciwgY292ZXJhZ2VUZXg6IG8gfSA9IEllKAogICAgICAgIHQodGhpcywgYiksCiAgICAgICAgdCh0aGlzLCBwKSwKICAgICAgICB0KHRoaXMsIEQpLAogICAgICAgIHQodGhpcywgXykub3B0cywKICAgICAgICB0KHRoaXMsIHcpLAogICAgICAgIHQodGhpcywgcSkKICAgICAgKTsKICAgICAgYSh0aGlzLCBBLCBlKSwgYSh0aGlzLCBVLCByKSwgYSh0aGlzLCBYLCBvKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHsgYmFja2dyb3VuZFRleDogZSwgb2JzdGFjbGVUZXg6IHIsIGNvdmVyYWdlVGV4OiBvIH0gPSBrZSgKICAgICAgICB0KHRoaXMsIGIpLAogICAgICAgIHQodGhpcywgXykuYml0bWFwLAogICAgICAgIHQodGhpcywgcCksCiAgICAgICAgdCh0aGlzLCBEKSwKICAgICAgICB0KHRoaXMsIF8pLmVmZmVjdCwKICAgICAgICB0KHRoaXMsIF8pLnNpemUsCiAgICAgICAgdCh0aGlzLCB3KSwKICAgICAgICB0KHRoaXMsIHEpCiAgICAgICk7CiAgICAgIGEodGhpcywgQSwgZSksIGEodGhpcywgVSwgciksIGEodGhpcywgWCwgbyk7CiAgICB9CiAgICBhKHRoaXMsIHosICEwKTsKICB9Cn0sIEggPSBuZXcgV2Vha1NldCgpLCBvZSA9IGZ1bmN0aW9uKCkgewogIHQodGhpcywgeikgJiYgIXRoaXMuaXNSdW5uaW5nICYmIHRoaXMuc3RhcnQoKTsKfSwgWiA9IG5ldyBXZWFrU2V0KCksIG1lID0gZnVuY3Rpb24oKSB7CiAgdmFyIGUsIHIsIG87CiAgKGUgPSB0KHRoaXMsIFIpKSA9PSBudWxsIHx8IGUuZGlzcG9zZSgpLCAociA9IHQodGhpcywgdikpID09IG51bGwgfHwgci5kaXNwb3NlKCksIChvID0gdCh0aGlzLCBDKSkgPT0gbnVsbCB8fCBvLmRpc3Bvc2UoKSwgdCh0aGlzLCBTKSAmJiAodCh0aGlzLCBiKS5kZWxldGVUZXh0dXJlKHQodGhpcywgUykudGV4KSwgdCh0aGlzLCBiKS5kZWxldGVGcmFtZWJ1ZmZlcih0KHRoaXMsIFMpLmZibykpLCB0KHRoaXMsIEYpICYmICh0KHRoaXMsIGIpLmRlbGV0ZVRleHR1cmUodCh0aGlzLCBGKS50ZXgpLCB0KHRoaXMsIGIpLmRlbGV0ZUZyYW1lYnVmZmVyKHQodGhpcywgRikuZmJvKSksIGEodGhpcywgUiwgYSh0aGlzLCB2LCBhKHRoaXMsIEMsIGEodGhpcywgUywgYSh0aGlzLCBGLCBudWxsKSkpKSk7Cn0sIGVlID0gbmV3IFdlYWtTZXQoKSwgeGUgPSBmdW5jdGlvbigpIHsKICB0KHRoaXMsIEEpICYmIHQodGhpcywgYikuZGVsZXRlVGV4dHVyZSh0KHRoaXMsIEEpKSwgdCh0aGlzLCBVKSAmJiB0KHRoaXMsIGIpLmRlbGV0ZVRleHR1cmUodCh0aGlzLCBVKSksIHQodGhpcywgWCkgJiYgdCh0aGlzLCBYKSAhPT0gdCh0aGlzLCBVKSAmJiB0KHRoaXMsIGIpLmRlbGV0ZVRleHR1cmUodCh0aGlzLCBYKSksIGEodGhpcywgQSwgYSh0aGlzLCBVLCBhKHRoaXMsIFgsIG51bGwpKSk7Cn0sIGFlID0gbmV3IFdlYWtTZXQoKSwgYmUgPSBmdW5jdGlvbigpIHsKICBpZiAoIXQodGhpcywgeikgfHwgdCh0aGlzLCBwKSA9PT0gMCkKICAgIHJldHVybjsKICBjb25zdCBlID0gdCh0aGlzLCBiKSwgciA9IHQodGhpcywgRyksIHsgYWR2ZWN0aW9uOiBvLCBkaXZlcmdlbmNlOiBzLCBwcmVzc3VyZTogbiwgZ3JhZGllbnRTdWJ0cmFjdDogdSwgc3BsYXQ6IGQsIGN1cmw6IEUsIHZvcnRpY2l0eTogYywgZGlzcGxheTogaCB9ID0gdCh0aGlzLCBWKTsKICB0KHRoaXMsIG0pLnggKz0gKHQodGhpcywgbSkudGFyZ2V0WCAtIHQodGhpcywgbSkueCkgKiAwLjE1LCB0KHRoaXMsIG0pLnkgKz0gKHQodGhpcywgbSkudGFyZ2V0WSAtIHQodGhpcywgbSkueSkgKiAwLjE1OwogIGNvbnN0IGcgPSB0KHRoaXMsIFApLCBmID0gdCh0aGlzLCBJKSwgeSA9IHQodGhpcywgWSk7CiAgZS52aWV3cG9ydCgwLCAwLCBnLCBmKSwgby5iaW5kKCksIGUudW5pZm9ybTJmKG8udW5pZm9ybXMudGV4ZWxTaXplLCAxIC8gZywgMSAvIGYpLCBlLnVuaWZvcm0xZihvLnVuaWZvcm1zLmR0LCBFZSksIGUudW5pZm9ybTFpKG8udW5pZm9ybXMudU9ic3RhY2xlLCAwKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTApLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCBVKSksIGUudW5pZm9ybTFmKG8udW5pZm9ybXMuZGlzc2lwYXRpb24sIHIudmVsb2NpdHlEaXNzaXBhdGlvbiksIGUudW5pZm9ybTFpKG8udW5pZm9ybXMudVZlbG9jaXR5LCAxKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTEpLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCB2KS5yZWFkLnRleCksIGUudW5pZm9ybTFpKG8udW5pZm9ybXMudVNvdXJjZSwgMSksIHkodCh0aGlzLCB2KS53cml0ZS5mYm8pLCB0KHRoaXMsIHYpLnN3YXAoKSwgZS51bmlmb3JtMWYoby51bmlmb3Jtcy5kaXNzaXBhdGlvbiwgci5kZW5zaXR5RGlzc2lwYXRpb24pLCBlLnVuaWZvcm0xaShvLnVuaWZvcm1zLnVTb3VyY2UsIDIpLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMiksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIFIpLnJlYWQudGV4KSwgeSh0KHRoaXMsIFIpLndyaXRlLmZibyksIHQodGhpcywgUikuc3dhcCgpLCBFLmJpbmQoKSwgZS51bmlmb3JtMmYoRS51bmlmb3Jtcy50ZXhlbFNpemUsIDEgLyBnLCAxIC8gZiksIGUudW5pZm9ybTFpKEUudW5pZm9ybXMudVZlbG9jaXR5LCAwKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTApLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCB2KS5yZWFkLnRleCksIHkodCh0aGlzLCBGKS5mYm8pLCBjLmJpbmQoKSwgZS51bmlmb3JtMmYoYy51bmlmb3Jtcy50ZXhlbFNpemUsIDEgLyBnLCAxIC8gZiksIGUudW5pZm9ybTFmKGMudW5pZm9ybXMuY3VybCwgci5jdXJsKSwgZS51bmlmb3JtMWYoYy51bmlmb3Jtcy5kdCwgRWUpLCBlLnVuaWZvcm0xaShjLnVuaWZvcm1zLnVWZWxvY2l0eSwgMCksIGUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUwKSwgZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsIHQodGhpcywgdikucmVhZC50ZXgpLCBlLnVuaWZvcm0xaShjLnVuaWZvcm1zLnVDdXJsLCAxKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTEpLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCBGKS50ZXgpLCB5KHQodGhpcywgdikud3JpdGUuZmJvKSwgdCh0aGlzLCB2KS5zd2FwKCksIHQodGhpcywgbSkubW92ZWQgJiYgKGQuYmluZCgpLCBlLnVuaWZvcm0xZihkLnVuaWZvcm1zLmFzcGVjdFJhdGlvLCB0KHRoaXMsIHApIC8gdCh0aGlzLCBEKSksIGUudW5pZm9ybTJmKGQudW5pZm9ybXMucG9pbnQsIHQodGhpcywgbSkueCAvIHQodGhpcywgcCksIDEgLSB0KHRoaXMsIG0pLnkgLyB0KHRoaXMsIEQpKSwgZS51bmlmb3JtMWYoZC51bmlmb3Jtcy5yYWRpdXMsIHIuc3BsYXRSYWRpdXMpLCBlLnVuaWZvcm0xaShkLnVuaWZvcm1zLnVUYXJnZXQsIDApLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMCksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIHYpLnJlYWQudGV4KSwgZS51bmlmb3JtM2YoZC51bmlmb3Jtcy5jb2xvciwgdCh0aGlzLCBtKS5keCAqIHIuc3BsYXRGb3JjZSwgLXQodGhpcywgbSkuZHkgKiByLnNwbGF0Rm9yY2UsIDApLCB5KHQodGhpcywgdikud3JpdGUuZmJvKSwgdCh0aGlzLCB2KS5zd2FwKCksIGUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUwKSwgZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsIHQodGhpcywgUikucmVhZC50ZXgpLCBlLnVuaWZvcm0zZihkLnVuaWZvcm1zLmNvbG9yLCAxLCAxLCAxKSwgeSh0KHRoaXMsIFIpLndyaXRlLmZibyksIHQodGhpcywgUikuc3dhcCgpLCB0KHRoaXMsIG0pLm1vdmVkID0gITEpLCBzLmJpbmQoKSwgZS51bmlmb3JtMmYocy51bmlmb3Jtcy50ZXhlbFNpemUsIDEgLyBnLCAxIC8gZiksIGUudW5pZm9ybTFpKHMudW5pZm9ybXMudVZlbG9jaXR5LCAwKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTApLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCB2KS5yZWFkLnRleCksIGUudW5pZm9ybTFpKHMudW5pZm9ybXMudU9ic3RhY2xlLCAxKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTEpLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCBVKSksIHkodCh0aGlzLCBTKS5mYm8pLCBuLmJpbmQoKSwgZS51bmlmb3JtMmYobi51bmlmb3Jtcy50ZXhlbFNpemUsIDEgLyBnLCAxIC8gZiksIGUudW5pZm9ybTFpKG4udW5pZm9ybXMudURpdmVyZ2VuY2UsIDApLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMCksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIFMpLnRleCksIGUudW5pZm9ybTFpKG4udW5pZm9ybXMudU9ic3RhY2xlLCAxKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTEpLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCBVKSk7CiAgZm9yIChsZXQgTiA9IDA7IE4gPCByLnByZXNzdXJlSXRlcmF0aW9uczsgTisrKQogICAgZS51bmlmb3JtMWkobi51bmlmb3Jtcy51UHJlc3N1cmUsIDIpLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMiksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIEMpLnJlYWQudGV4KSwgeSh0KHRoaXMsIEMpLndyaXRlLmZibyksIHQodGhpcywgQykuc3dhcCgpOwogIHUuYmluZCgpLCBlLnVuaWZvcm0yZih1LnVuaWZvcm1zLnRleGVsU2l6ZSwgMSAvIGcsIDEgLyBmKSwgZS51bmlmb3JtMWkodS51bmlmb3Jtcy51UHJlc3N1cmUsIDApLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMCksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIEMpLnJlYWQudGV4KSwgZS51bmlmb3JtMWkodS51bmlmb3Jtcy51VmVsb2NpdHksIDEpLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMSksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIHYpLnJlYWQudGV4KSwgZS51bmlmb3JtMWkodS51bmlmb3Jtcy51T2JzdGFjbGUsIDIpLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMiksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIFUpKSwgeSh0KHRoaXMsIHYpLndyaXRlLmZibyksIHQodGhpcywgdikuc3dhcCgpLCBlLnZpZXdwb3J0KDAsIDAsIHQodGhpcywgcCksIHQodGhpcywgRCkpLCBlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLCBudWxsKSwgZS5jbGVhcihlLkNPTE9SX0JVRkZFUl9CSVQpLCBoLmJpbmQoKSwgZS51bmlmb3JtMmYoaC51bmlmb3Jtcy50ZXhlbFNpemUsIDEgLyB0KHRoaXMsIHApLCAxIC8gdCh0aGlzLCBEKSksIGUudW5pZm9ybTNmdihoLnVuaWZvcm1zLnVXYXRlckNvbG9yLCByLndhdGVyQ29sb3IpLCBlLnVuaWZvcm0zZnYoaC51bmlmb3Jtcy51R2xvd0NvbG9yLCByLmdsb3dDb2xvciksIGUudW5pZm9ybTFmKGgudW5pZm9ybXMudVJlZnJhY3Rpb24sIHIucmVmcmFjdGlvbiksIGUudW5pZm9ybTFmKGgudW5pZm9ybXMudVNwZWN1bGFyRXhwLCByLnNwZWN1bGFyRXhwKSwgZS51bmlmb3JtMWYoaC51bmlmb3Jtcy51U2hpbmUsIHIuc2hpbmUpLCBlLnVuaWZvcm0xZihoLnVuaWZvcm1zLnVXYXJwU3RyZW5ndGgsIHIud2FycFN0cmVuZ3RoID8/IDAuMDE1KSwgZS51bmlmb3JtMWkoaC51bmlmb3Jtcy51QWxnb3JpdGhtLCBHZVtyLmFsZ29yaXRobV0gPz8gMCksIGUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUwKSwgZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsIHQodGhpcywgUikucmVhZC50ZXgpLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFMSksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIFUpKSwgZS5hY3RpdmVUZXh0dXJlKGUuVEVYVFVSRTIpLCBlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCwgdCh0aGlzLCBBKSksIGUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUzKSwgZS5iaW5kVGV4dHVyZShlLlRFWFRVUkVfMkQsIHQodGhpcywgWCkpLCBlLmFjdGl2ZVRleHR1cmUoZS5URVhUVVJFNCksIGUuYmluZFRleHR1cmUoZS5URVhUVVJFXzJELCB0KHRoaXMsIHYpLnJlYWQudGV4KSwgZS51bmlmb3JtMWkoaC51bmlmb3Jtcy51VGV4dHVyZSwgMCksIGUudW5pZm9ybTFpKGgudW5pZm9ybXMudU9ic3RhY2xlLCAxKSwgZS51bmlmb3JtMWkoaC51bmlmb3Jtcy51QmFja2dyb3VuZCwgMiksIGUudW5pZm9ybTFpKGgudW5pZm9ybXMudUNvdmVyYWdlLCAzKSwgZS51bmlmb3JtMWkoaC51bmlmb3Jtcy51VmVsb2NpdHksIDQpLCB5KG51bGwpOwp9OwpsZXQgeCA9IG51bGw7CnNlbGYub25tZXNzYWdlID0gYXN5bmMgKGkpID0+IHsKICBjb25zdCB7IHR5cGU6IGUsIC4uLnIgfSA9IGkuZGF0YTsKICB0cnkgewogICAgc3dpdGNoIChlKSB7CiAgICAgIGNhc2UgImluaXQiOiB7CiAgICAgICAgY29uc3QgeyBjYW52YXM6IG8sIHdpZHRoOiBzLCBoZWlnaHQ6IG4sIGNvbmZpZzogdSB9ID0gcjsKICAgICAgICBvLndpZHRoID0gcywgby5oZWlnaHQgPSBuLCB4ID0gbmV3IHplKG8sIHUpLCBzZWxmLnBvc3RNZXNzYWdlKHsgdHlwZTogInJlYWR5IiB9KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlICJzZXRUZXh0U291cmNlIjogewogICAgICAgIGlmICgheCkKICAgICAgICAgIHJldHVybjsKICAgICAgICB4LnNldFRleHRTb3VyY2Uoci5vcHRzKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlICJzZXRJbWFnZVNvdXJjZSI6IHsKICAgICAgICBpZiAoIXgpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgYXdhaXQgeC5zZXRJbWFnZVNvdXJjZShyLnNyYywgci5lZmZlY3QsIHIuc2l6ZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAic2V0SW1hZ2VCaXRtYXAiOiB7CiAgICAgICAgaWYgKCF4KQogICAgICAgICAgcmV0dXJuOwogICAgICAgIHguc2V0SW1hZ2VCaXRtYXAoci5iaXRtYXAsIHIuZWZmZWN0LCByLnNpemUpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgInNldEJhY2tncm91bmQiOiB7CiAgICAgICAgaWYgKCF4KQogICAgICAgICAgcmV0dXJuOwogICAgICAgIHguc2V0QmFja2dyb3VuZChyLmJpdG1hcCwgci5zaXplKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlICJzcGxhdCI6IHsKICAgICAgICBpZiAoIXgpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgeC5zcGxhdCgKICAgICAgICAgIHIueCwKICAgICAgICAgIHIueSwKICAgICAgICAgIHIudngsCiAgICAgICAgICByLnZ5LAogICAgICAgICAgci5zdHJlbmd0aCA/PyAxCiAgICAgICAgKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlICJtb3ZlIjogewogICAgICAgIGlmICgheCkKICAgICAgICAgIHJldHVybjsKICAgICAgICB4LmhhbmRsZU1vdmUoci54LCByLnksIHIuc3RyZW5ndGggPz8gMSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAicmVzaXplIjogewogICAgICAgIGlmICgheCkKICAgICAgICAgIHJldHVybjsKICAgICAgICB4LnJlc2l6ZShyLndpZHRoLCByLmhlaWdodCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAidXBkYXRlQ29uZmlnIjogewogICAgICAgIGlmICgheCkKICAgICAgICAgIHJldHVybjsKICAgICAgICB4LnVwZGF0ZUNvbmZpZyhyLmNvbmZpZyk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAiZGVzdHJveSI6IHsKICAgICAgICB4ID09IG51bGwgfHwgeC5kZXN0cm95KCksIHggPSBudWxsOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgY29uc29sZS53YXJuKCJbZmx1aWRpdHktanMgd29ya2VyXSBVbmtub3duIG1lc3NhZ2UgdHlwZToiLCBlKTsKICAgIH0KICB9IGNhdGNoIChvKSB7CiAgICBzZWxmLnBvc3RNZXNzYWdlKHsgdHlwZTogImVycm9yIiwgbWVzc2FnZTogKG8gPT0gbnVsbCA/IHZvaWQgMCA6IG8ubWVzc2FnZSkgPz8gU3RyaW5nKG8pIH0pOwogIH0KfTsK", Wg = typeof window < "u" && window.Blob && new Blob([atob(Tg)], { type: "text/javascript;charset=utf-8" });
635
+ function oI() {
636
+ let i;
637
+ try {
638
+ if (i = Wg && (window.URL || window.webkitURL).createObjectURL(Wg), !i)
639
+ throw "";
640
+ return new Worker(i);
641
+ } catch {
642
+ return new Worker("data:application/javascript;base64," + Tg, { type: "module" });
643
+ } finally {
644
+ i && (window.URL || window.webkitURL).revokeObjectURL(i);
645
+ }
646
+ }
647
+ const tI = typeof Worker < "u" && typeof OffscreenCanvas < "u";
648
+ var B, W, tg, Sg, Bg, xg;
649
+ class lI {
650
+ constructor(g, { isWorkerEnabled: C = !0, config: e = {} } = {}) {
651
+ // ---------------------------------------------------------------------------
652
+ // Private
653
+ // ---------------------------------------------------------------------------
654
+ a(this, Bg);
655
+ a(this, B, null);
656
+ a(this, W, null);
657
+ a(this, tg, void 0);
658
+ a(this, Sg, void 0);
659
+ t(this, Sg, g), t(this, tg, C && tI), I(this, tg) ? y(this, Bg, xg).call(this, g, e) : t(this, W, new vg(g, e));
660
+ }
661
+ // ---------------------------------------------------------------------------
662
+ // Source setters
663
+ // ---------------------------------------------------------------------------
664
+ setTextSource(g) {
665
+ I(this, B) ? I(this, B).postMessage({ type: "setTextSource", opts: g }) : I(this, W).setTextSource(g);
666
+ }
667
+ setImageSource(g, C = 0, e = "cover") {
668
+ I(this, B) ? I(this, B).postMessage({ type: "setImageSource", src: g, effect: C, size: e }) : I(this, W).setImageSource(g, C, e);
669
+ }
670
+ setBackground(g, C = "cover") {
671
+ var e;
672
+ if (I(this, B)) {
673
+ const s = g ? [g] : [];
674
+ I(this, B).postMessage({ type: "setBackground", bitmap: g ?? null, size: C }, s);
675
+ } else
676
+ (e = I(this, W)) == null || e.setBackground(g ?? null, C);
677
+ }
678
+ // ---------------------------------------------------------------------------
679
+ // Interaction
680
+ // ---------------------------------------------------------------------------
681
+ /**
682
+ * Immediately injects one splat at (x, y) with explicit velocity (vx, vy).
683
+ * Safe to call multiple times per frame. See FluidSimulation.splat for details.
684
+ */
685
+ splat(g, C, e, s, o = 1) {
686
+ I(this, B) ? I(this, B).postMessage({ type: "splat", x: g, y: C, vx: e, vy: s, strength: o }) : I(this, W).splat(g, C, e, s, o);
687
+ }
688
+ handleMove(g, C, e = 1) {
689
+ I(this, B) ? I(this, B).postMessage({ type: "move", x: g, y: C, strength: e }) : I(this, W).handleMove(g, C, e);
690
+ }
691
+ // ---------------------------------------------------------------------------
692
+ // Config + control
693
+ // ---------------------------------------------------------------------------
694
+ updateConfig(g) {
695
+ I(this, B) ? I(this, B).postMessage({ type: "updateConfig", config: g }) : I(this, W).updateConfig(g);
696
+ }
697
+ resize(g, C) {
698
+ I(this, B) ? I(this, B).postMessage({ type: "resize", width: g, height: C }) : I(this, W).resize(g, C);
699
+ }
700
+ destroy() {
701
+ var g;
702
+ if (I(this, B)) {
703
+ const C = I(this, B);
704
+ t(this, B, null), C.postMessage({ type: "destroy" }), setTimeout(() => C.terminate(), 50);
705
+ } else
706
+ (g = I(this, W)) == null || g.destroy(), t(this, W, null);
707
+ }
708
+ }
709
+ B = new WeakMap(), W = new WeakMap(), tg = new WeakMap(), Sg = new WeakMap(), Bg = new WeakSet(), xg = function(g, C) {
710
+ const { clientWidth: e, clientHeight: s } = g;
711
+ let o;
712
+ try {
713
+ o = g.transferControlToOffscreen();
714
+ } catch {
715
+ console.warn(
716
+ "[fluidity-js] OffscreenCanvas transfer failed — falling back to main-thread mode. This is expected in React StrictMode development."
717
+ ), t(this, tg, !1), t(this, W, new vg(g, C));
718
+ return;
719
+ }
720
+ t(this, B, new oI()), I(this, B).onerror = (l) => {
721
+ console.error("[fluidity-js] Worker error:", l.message);
722
+ }, I(this, B).onmessage = (l) => {
723
+ l.data.type === "error" && console.error("[fluidity-js] Simulation error:", l.data.message);
724
+ }, I(this, B).postMessage({ type: "init", canvas: o, width: e, height: s, config: C }, [o]);
725
+ };
726
+ function Mg(i, { isWorkerEnabled: g = !0, config: C = {} } = {}) {
727
+ const e = ng(null), s = ng({ isWorkerEnabled: g, config: C });
728
+ return N(() => {
729
+ const o = i.current;
730
+ if (!o)
731
+ return;
732
+ const l = document.createElement("canvas");
733
+ l.style.cssText = "position:absolute;inset:0;width:100%;height:100%;display:block;", o.appendChild(l);
734
+ const G = o.getBoundingClientRect(), n = Math.round(G.width) || o.clientWidth || 0, d = Math.round(G.height) || o.clientHeight || 0;
735
+ n > 0 && (l.width = n, l.height = d);
736
+ const { isWorkerEnabled: u, config: b } = s.current, c = new lI(l, { isWorkerEnabled: u, config: b });
737
+ e.current = c;
738
+ const p = new ResizeObserver((k) => {
739
+ for (const Y of k) {
740
+ const { inlineSize: K, blockSize: m } = Y.contentBoxSize[0];
741
+ c.resize(Math.round(K), Math.round(m));
742
+ }
743
+ });
744
+ return p.observe(o), () => {
745
+ p.disconnect(), c.destroy(), l.remove(), e.current = null;
746
+ };
747
+ }, []), e;
748
+ }
749
+ const aI = Yg(function({
750
+ text: g = "",
751
+ fontSize: C = 100,
752
+ color: e = "#ffffff",
753
+ fontFamily: s = "sans-serif",
754
+ fontWeight: o = 900,
755
+ className: l,
756
+ style: G,
757
+ config: n,
758
+ preset: d,
759
+ algorithm: u,
760
+ backgroundColor: b = "#0a0a0a",
761
+ backgroundSrc: c,
762
+ backgroundSize: p = "cover",
763
+ isMouseEnabled: k = !0,
764
+ isWorkerEnabled: Y = !0
765
+ }, K) {
766
+ const m = ng(null), Z = Mg(m, {
767
+ isWorkerEnabled: Y,
768
+ config: Kg({ ...n, ...u ? { algorithm: u } : {} }, d)
769
+ });
770
+ return Fg(
771
+ K,
772
+ () => ({
773
+ reset() {
774
+ var A;
775
+ (A = Z.current) == null || A.setTextSource({ text: g, fontSize: C, color: e, fontFamily: s, fontWeight: o });
776
+ },
777
+ updateLocation({ x: A, y: r, strength: L = 1 }) {
778
+ var h;
779
+ (h = Z.current) == null || h.handleMove(A, r, L);
780
+ },
781
+ splat(A, r, L, h, f = 1) {
782
+ var z;
783
+ (z = Z.current) == null || z.splat(A, r, L, h, f);
784
+ },
785
+ updateConfig(A) {
786
+ var r;
787
+ (r = Z.current) == null || r.updateConfig(A);
788
+ }
789
+ }),
790
+ [g, C, e, s, o]
791
+ ), N(() => {
792
+ var A;
793
+ (A = Z.current) == null || A.setTextSource({ text: g, fontSize: C, color: e, fontFamily: s, fontWeight: o });
794
+ }, [g, C, e, s, o]), N(() => {
795
+ var A;
796
+ u !== void 0 && ((A = Z.current) == null || A.updateConfig({ algorithm: u }));
797
+ }, [u]), N(() => {
798
+ var r;
799
+ if (!c) {
800
+ (r = Z.current) == null || r.setBackground(null);
801
+ return;
802
+ }
803
+ let A = !1;
804
+ return wg(c).then((L) => {
805
+ var h;
806
+ if (A) {
807
+ L.close();
808
+ return;
809
+ }
810
+ (h = Z.current) == null || h.setBackground(L, p);
811
+ }).catch((L) => console.error("[fluidity-js] backgroundSrc load failed:", L)), () => {
812
+ A = !0;
813
+ };
814
+ }, [c, p]), N(() => {
815
+ if (!k)
816
+ return;
817
+ const A = m.current;
818
+ if (!A)
819
+ return;
820
+ const r = (h) => {
821
+ var z;
822
+ const f = A.getBoundingClientRect();
823
+ (z = Z.current) == null || z.handleMove(h.clientX - f.left, h.clientY - f.top, 2);
824
+ }, L = (h) => {
825
+ var Rg;
826
+ h.preventDefault();
827
+ const f = A.getBoundingClientRect(), z = h.touches[0];
828
+ (Rg = Z.current) == null || Rg.handleMove(z.clientX - f.left, z.clientY - f.top, 1);
829
+ };
830
+ return A.addEventListener("mousemove", r), A.addEventListener("touchmove", L, { passive: !1 }), () => {
831
+ A.removeEventListener("mousemove", r), A.removeEventListener("touchmove", L);
832
+ };
833
+ }, [k]), /* @__PURE__ */ kg(
834
+ "div",
835
+ {
836
+ ref: m,
837
+ className: l,
838
+ style: {
839
+ position: "relative",
840
+ display: "block",
841
+ width: "100%",
842
+ height: "100%",
843
+ background: b,
844
+ ...G
845
+ }
846
+ }
847
+ );
848
+ }), uI = Yg(function({
849
+ src: g,
850
+ effect: C = 0.4,
851
+ imageSize: e = "cover",
852
+ className: s,
853
+ style: o,
854
+ config: l,
855
+ preset: G,
856
+ algorithm: n,
857
+ backgroundColor: d = "#0a0a0a",
858
+ backgroundSrc: u,
859
+ backgroundSize: b = "cover",
860
+ isMouseEnabled: c = !0,
861
+ isWorkerEnabled: p = !0
862
+ }, k) {
863
+ const Y = ng(null), K = Mg(Y, {
864
+ isWorkerEnabled: p,
865
+ config: Kg({ ...l, ...n ? { algorithm: n } : {} }, G)
866
+ });
867
+ return Fg(
868
+ k,
869
+ () => ({
870
+ reset() {
871
+ var m;
872
+ g && ((m = K.current) == null || m.setImageSource(g, C, e));
873
+ },
874
+ updateLocation({ x: m, y: Z, strength: A = 1 }) {
875
+ var r;
876
+ (r = K.current) == null || r.handleMove(m, Z, A);
877
+ },
878
+ splat(m, Z, A, r, L = 1) {
879
+ var h;
880
+ (h = K.current) == null || h.splat(m, Z, A, r, L);
881
+ },
882
+ updateConfig(m) {
883
+ var Z;
884
+ (Z = K.current) == null || Z.updateConfig(m);
885
+ }
886
+ }),
887
+ [g, C, e]
888
+ ), N(() => {
889
+ var m;
890
+ g && ((m = K.current) == null || m.setImageSource(g, C, e));
891
+ }, [g, C, e]), N(() => {
892
+ var m;
893
+ n !== void 0 && ((m = K.current) == null || m.updateConfig({ algorithm: n }));
894
+ }, [n]), N(() => {
895
+ var Z;
896
+ if (!u) {
897
+ (Z = K.current) == null || Z.setBackground(null);
898
+ return;
899
+ }
900
+ let m = !1;
901
+ return wg(u).then((A) => {
902
+ var r;
903
+ if (m) {
904
+ A.close();
905
+ return;
906
+ }
907
+ (r = K.current) == null || r.setBackground(A, b);
908
+ }).catch((A) => console.error("[fluidity-js] backgroundSrc load failed:", A)), () => {
909
+ m = !0;
910
+ };
911
+ }, [u, b]), N(() => {
912
+ if (!c)
913
+ return;
914
+ const m = Y.current;
915
+ if (!m)
916
+ return;
917
+ const Z = (r) => {
918
+ var h;
919
+ const L = m.getBoundingClientRect();
920
+ (h = K.current) == null || h.handleMove(r.clientX - L.left, r.clientY - L.top, 2);
921
+ }, A = (r) => {
922
+ var f;
923
+ r.preventDefault();
924
+ const L = m.getBoundingClientRect(), h = r.touches[0];
925
+ (f = K.current) == null || f.handleMove(h.clientX - L.left, h.clientY - L.top, 1);
926
+ };
927
+ return m.addEventListener("mousemove", Z), m.addEventListener("touchmove", A, { passive: !1 }), () => {
928
+ m.removeEventListener("mousemove", Z), m.removeEventListener("touchmove", A);
929
+ };
930
+ }, [c]), /* @__PURE__ */ kg(
931
+ "div",
932
+ {
933
+ ref: Y,
934
+ className: s,
935
+ style: {
936
+ position: "relative",
937
+ display: "block",
938
+ width: "100%",
939
+ height: "100%",
940
+ background: d,
941
+ ...o
942
+ }
943
+ }
944
+ );
945
+ });
946
+ export {
947
+ Xg as DEFAULT_CONFIG,
948
+ lI as FluidController,
949
+ uI as FluidImage,
950
+ vg as FluidSimulation,
951
+ aI as FluidText,
952
+ Eg as PRESETS,
953
+ wg as loadImageBitmap,
954
+ Kg as mergeConfig,
955
+ Mg as useFluid
956
+ };