@wolsok/thanos 3.0.1 → 16.0.1

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.
Files changed (35) hide show
  1. package/README.md +109 -107
  2. package/{esm2020 → esm2022}/index.mjs +10 -10
  3. package/esm2022/lib/animation.state.mjs +2 -0
  4. package/esm2022/lib/create-ws-thanos-options.mjs +9 -0
  5. package/{esm2020 → esm2022}/lib/simplex-noise-options.mjs +1 -1
  6. package/esm2022/lib/simplex-noise.mjs +194 -0
  7. package/{esm2020 → esm2022}/lib/ws-thanos-options.token.mjs +13 -13
  8. package/esm2022/lib/ws-thanos.directive.mjs +76 -0
  9. package/{esm2020 → esm2022}/lib/ws-thanos.options.mjs +1 -1
  10. package/esm2022/lib/ws-thanos.service.mjs +253 -0
  11. package/{esm2020 → esm2022}/wolsok-thanos.mjs +4 -4
  12. package/index.d.ts +8 -6
  13. package/index.d.ts.map +1 -0
  14. package/lib/animation.state.d.ts +7 -0
  15. package/lib/animation.state.d.ts.map +1 -0
  16. package/lib/create-ws-thanos-options.d.ts +3 -2
  17. package/lib/create-ws-thanos-options.d.ts.map +1 -0
  18. package/lib/simplex-noise-options.d.ts +10 -9
  19. package/lib/simplex-noise-options.d.ts.map +1 -0
  20. package/lib/simplex-noise.d.ts +19 -18
  21. package/lib/simplex-noise.d.ts.map +1 -0
  22. package/lib/ws-thanos-options.token.d.ts +5 -4
  23. package/lib/ws-thanos-options.token.d.ts.map +1 -0
  24. package/lib/ws-thanos.directive.d.ts +36 -18
  25. package/lib/ws-thanos.directive.d.ts.map +1 -0
  26. package/lib/ws-thanos.options.d.ts +6 -5
  27. package/lib/ws-thanos.options.d.ts.map +1 -0
  28. package/lib/ws-thanos.service.d.ts +27 -32
  29. package/lib/ws-thanos.service.d.ts.map +1 -0
  30. package/package.json +16 -17
  31. package/wolsok-thanos.d.ts.map +1 -0
  32. package/esm2020/lib/create-ws-thanos-options.mjs +0 -9
  33. package/esm2020/lib/simplex-noise.mjs +0 -199
  34. package/esm2020/lib/ws-thanos.directive.mjs +0 -56
  35. package/esm2020/lib/ws-thanos.service.mjs +0 -260
@@ -0,0 +1,253 @@
1
+ import { Inject, Injectable, NgZone } from '@angular/core';
2
+ import { default as html2canvas } from 'html2canvas';
3
+ import { animationFrameScheduler, finalize, from, interval, map, switchMap, takeWhile, tap, timeInterval, } from 'rxjs';
4
+ import { SimplexNoise } from './simplex-noise';
5
+ import { WS_THANOS_OPTIONS_TOKEN } from './ws-thanos-options.token';
6
+ import * as i0 from "@angular/core";
7
+ const PARTICLE_BYTE_LENGTH = 10;
8
+ const MIN_PARTICLE_ALPHA = ~~(255 * 0.01);
9
+ const HEIGHT_SCALE = 5;
10
+ const WIDTH_SCALE = 2;
11
+ const FLOW_FIELD_RES = 0.05;
12
+ class WsThanosService {
13
+ thanosOptions;
14
+ ngZone;
15
+ constructor(thanosOptions, ngZone) {
16
+ this.thanosOptions = thanosOptions;
17
+ this.ngZone = ngZone;
18
+ }
19
+ static getParticleIndicesForBase(base) {
20
+ return {
21
+ x: base,
22
+ y: base + 1,
23
+ dx: base + 2,
24
+ dy: base + 3,
25
+ ax: base + 4,
26
+ ay: base + 5,
27
+ r: base + 6,
28
+ g: base + 7,
29
+ b: base + 8,
30
+ a: base + 9,
31
+ };
32
+ }
33
+ static getColorIndicesForCoord(x, y, width) {
34
+ const red = y * (width * 4) + x * 4;
35
+ return { r: red, g: red + 1, b: red + 2, a: red + 3 };
36
+ }
37
+ static updateParticles({ seed, noise, particlesData, thanosOptions, animationState, }) {
38
+ const { deltaTSec, animationT, maxWidth, maxHeight } = animationState;
39
+ const { particleAcceleration } = thanosOptions;
40
+ const { particles, maxParticleX, minParticleY } = particlesData;
41
+ // the time is used to calculate the vaporization front.
42
+ const time = Math.sin(animationT * (Math.PI / 2)) * 1.1;
43
+ const startAccelerateX = maxParticleX - time * maxParticleX;
44
+ const startAccelerateY = time * (maxHeight - minParticleY) + minParticleY;
45
+ const lengthY = maxHeight - startAccelerateY;
46
+ const accelerateRadiusPow = startAccelerateX * startAccelerateX + lengthY * lengthY;
47
+ for (let i = 0; i < particles.length; i += PARTICLE_BYTE_LENGTH) {
48
+ const { x, y, dx, dy, ax, ay, a } = WsThanosService.getParticleIndicesForBase(i);
49
+ const particleX = particles[x];
50
+ const particleY = particles[y];
51
+ // only update particles that are inside view and visible
52
+ if (particleX > maxWidth ||
53
+ particleX < 0 ||
54
+ particleY > maxHeight ||
55
+ particleY < 0 ||
56
+ particles[a] < MIN_PARTICLE_ALPHA) {
57
+ continue;
58
+ }
59
+ if (!(Math.abs(particles[ax]) > 0 || Math.abs(particles[ay]) > 0)) {
60
+ let pYLength = maxHeight - particleY;
61
+ let pXLength = particleX;
62
+ // we calculate some random looking numbers and functions to have nice looking vaporizing front of particles
63
+ // todo consider to use noise;
64
+ pXLength += Math.tan((pXLength / 20.12) * time + seed) * 0.5;
65
+ pXLength += (particleX % deltaTSec) * 0.5;
66
+ pXLength += Math.sin((pXLength / 30 + 723.394) * time + seed * 12.5) * 11;
67
+ pYLength += Math.tan((pYLength / 0.45) * time + seed * 1.5) * 0.5;
68
+ pYLength += Math.cos((pYLength / 100 + 2323.234) * time + seed * 456.1) * 23;
69
+ const pLength = pXLength * pXLength + pYLength * pYLength;
70
+ if (pLength > accelerateRadiusPow) {
71
+ particles[ax] = Math.random();
72
+ particles[ay] = Math.random() * -1;
73
+ }
74
+ }
75
+ else {
76
+ // use noise to flow along velocity field
77
+ const flowFieldAcc = WsThanosService.getXYFromFlowField(noise, seed, particleX, particleY);
78
+ const accelerationX = flowFieldAcc[0];
79
+ const accelerationY = flowFieldAcc[1];
80
+ particles[ax] += accelerationX;
81
+ particles[ay] += accelerationY;
82
+ }
83
+ // * Math.pow(1 + animationT, 4)
84
+ particles[dx] += particles[ax] * particleAcceleration * deltaTSec;
85
+ particles[dy] += particles[ay] * particleAcceleration * deltaTSec;
86
+ particles[x] += particles[dx] * deltaTSec;
87
+ particles[y] += particles[dy] * deltaTSec;
88
+ // fade particle out ( very late);
89
+ particles[a] *= 1 - Math.pow(animationT, 15); // 255 - Math.sqrt(particles[dx] * particles[dx] + particles[dy] * particles[dy]) / 1.2;
90
+ }
91
+ }
92
+ static drawParticles(drawCtx, particles) {
93
+ const { width, height } = drawCtx.canvas;
94
+ drawCtx.clearRect(0, 0, width, height);
95
+ const image = drawCtx.getImageData(0, 0, width, height);
96
+ const imageData = image.data;
97
+ for (let i = 0; i < particles.length; i += PARTICLE_BYTE_LENGTH) {
98
+ const particleX = particles[i];
99
+ const particleY = particles[i + 1];
100
+ const pI = WsThanosService.getParticleIndicesForBase(i);
101
+ if (particleX > width ||
102
+ particleX < 0 ||
103
+ particleY > height ||
104
+ particleY < 0 ||
105
+ particles[pI.a] < MIN_PARTICLE_ALPHA) {
106
+ continue;
107
+ }
108
+ const { r, g, b, a } = WsThanosService.getColorIndicesForCoord(~~particles[pI.x], ~~particles[pI.y], width);
109
+ imageData[r] = ~~particles[pI.r];
110
+ imageData[g] = ~~particles[pI.g];
111
+ imageData[b] = ~~particles[pI.b];
112
+ imageData[a] = ~~particles[pI.a];
113
+ }
114
+ drawCtx.putImageData(image, 0, 0);
115
+ }
116
+ static prepareCanvasForVaporize(divCanvas, maxParticleCount) {
117
+ const { width, height } = divCanvas;
118
+ // scale result canvas to have more room to draw particles while vaporizing;
119
+ const resultHeight = height * HEIGHT_SCALE;
120
+ const resultWidth = width * WIDTH_SCALE;
121
+ const resultCanvas = document.createElement('canvas');
122
+ resultCanvas.height = resultHeight;
123
+ resultCanvas.width = resultWidth;
124
+ const imageData = divCanvas.getContext('2d')?.getImageData(0, 0, width, height);
125
+ if (imageData == null) {
126
+ throw new Error('Could not get image data from canvas');
127
+ }
128
+ const particlesData = WsThanosService.createParticlesForImageData(imageData, maxParticleCount, resultHeight);
129
+ return { resultCanvas, particlesData };
130
+ }
131
+ static createParticlesForImageData(imageData, maxParticleCount, resultHeight) {
132
+ const { width, height } = imageData;
133
+ let particleCandidates = 0;
134
+ let particleCount = 0;
135
+ const particleCandiatesList = [];
136
+ for (let y = 0; y < height; y++) {
137
+ for (let x = 0; x < width; x++) {
138
+ const { a } = WsThanosService.getColorIndicesForCoord(x, y, width);
139
+ if (imageData.data[a] >= MIN_PARTICLE_ALPHA) {
140
+ particleCandidates++;
141
+ particleCandiatesList.push({ x, y });
142
+ }
143
+ }
144
+ }
145
+ const maxNumParticles = Math.min(particleCandidates, maxParticleCount);
146
+ const particles = new Float32Array(Float32Array.BYTES_PER_ELEMENT * maxNumParticles * PARTICLE_BYTE_LENGTH);
147
+ let maxParticleX = 0;
148
+ let minParticleY = resultHeight;
149
+ while (particleCount < maxNumParticles) {
150
+ // select random index from candiates
151
+ const index = ~~(Math.random() * particleCandiatesList.length);
152
+ const { x, y } = particleCandiatesList[index];
153
+ // overwrite index with last element to prevent double selection of particles
154
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
155
+ particleCandiatesList[index] = particleCandiatesList.pop();
156
+ maxParticleX = Math.max(maxParticleX, x);
157
+ minParticleY = Math.min(minParticleY, y);
158
+ const { dx, dy, ax, ay, r, g, b, a, ...xy } = WsThanosService.getParticleIndicesForBase(particleCount * PARTICLE_BYTE_LENGTH);
159
+ particles[xy.x] = x;
160
+ particles[xy.y] = y + resultHeight - height;
161
+ particles[dx] = 0;
162
+ particles[dy] = 0;
163
+ particles[ax] = 0;
164
+ particles[ay] = 0;
165
+ const indicesImage = WsThanosService.getColorIndicesForCoord(x, y, width);
166
+ particles[r] = imageData.data[indicesImage.r];
167
+ particles[g] = imageData.data[indicesImage.g];
168
+ particles[b] = imageData.data[indicesImage.b];
169
+ particles[a] = imageData.data[indicesImage.a];
170
+ particleCount++;
171
+ }
172
+ return { particles, maxParticleX, minParticleY };
173
+ }
174
+ static getXYFromFlowField(noise, seed, x, y) {
175
+ const sampleX = noise.scaled3D(x, y, seed + 33.23, FLOW_FIELD_RES);
176
+ const sampleY = noise.scaled3D(x, seed / 13.23, y, FLOW_FIELD_RES) * -1;
177
+ return [sampleX, sampleY];
178
+ }
179
+ /**
180
+ * start the vaporizeAndScrollIntoView-effect.
181
+ *
182
+ * It's running outside the ngZone.
183
+ */
184
+ vaporize(elem) {
185
+ return this.ngZone.runOutsideAngular(() => this.vaporizeIntern(elem));
186
+ }
187
+ vaporizeIntern(elem) {
188
+ elem.style.opacity = elem.style.opacity || '1';
189
+ elem.style.transition = `opacity ${Math.floor(this.thanosOptions.animationLength * 0.8)}ms ease-out`;
190
+ const noise = new SimplexNoise({ frequency: 0.01, min: 0 });
191
+ const seed = new Date().getDate() * Math.random();
192
+ const html2CanvasPromise = html2canvas(elem, {
193
+ backgroundColor: null,
194
+ scale: 1,
195
+ allowTaint: true,
196
+ windowHeight: window.innerHeight,
197
+ windowWidth: window.innerWidth,
198
+ scrollY: -window.scrollY,
199
+ });
200
+ return from(html2CanvasPromise).pipe(map((canvasFromHtmlElem) => {
201
+ const canvasAndParticles = WsThanosService.prepareCanvasForVaporize(canvasFromHtmlElem, this.thanosOptions.maxParticleCount);
202
+ const { resultCanvas } = canvasAndParticles;
203
+ if (elem.parentElement) {
204
+ elem.parentElement.style.position = elem.parentElement.style.position || 'relative';
205
+ }
206
+ resultCanvas.style.position = 'absolute';
207
+ resultCanvas.style.left = 0 + 'px';
208
+ resultCanvas.style.top = '-' + elem.getBoundingClientRect().height * (HEIGHT_SCALE - 1) + 'px';
209
+ resultCanvas.style.zIndex = '2000';
210
+ resultCanvas.style.pointerEvents = 'none';
211
+ elem.insertAdjacentElement('beforebegin', resultCanvas);
212
+ // this should start the transition above defined
213
+ elem.style.opacity = '0';
214
+ return canvasAndParticles;
215
+ }), switchMap(({ resultCanvas, particlesData }) => {
216
+ let time = 0;
217
+ const { animationLength, maxParticleCount, particleAcceleration } = this.thanosOptions;
218
+ return interval(1000 / 60, animationFrameScheduler).pipe(timeInterval(), tap((deltaT) => (time += deltaT.interval)), map((deltaT) => ({
219
+ deltaTSec: deltaT.interval / 1000,
220
+ animationT: time / animationLength,
221
+ maxWidth: resultCanvas.width,
222
+ maxHeight: resultCanvas.height,
223
+ })), tap((animationState) => {
224
+ WsThanosService.updateParticles({
225
+ particlesData,
226
+ animationState,
227
+ thanosOptions: {
228
+ animationLength,
229
+ maxParticleCount,
230
+ particleAcceleration,
231
+ },
232
+ noise,
233
+ seed,
234
+ });
235
+ const context = resultCanvas.getContext('2d');
236
+ if (context) {
237
+ WsThanosService.drawParticles(context, particlesData.particles);
238
+ }
239
+ }), takeWhile((animationState) => animationState.animationT <= 1), finalize(() => resultCanvas.remove()));
240
+ }));
241
+ }
242
+ static ɵfac = function WsThanosService_Factory(t) { return new (t || WsThanosService)(i0.ɵɵinject(WS_THANOS_OPTIONS_TOKEN), i0.ɵɵinject(i0.NgZone)); };
243
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: WsThanosService, factory: WsThanosService.ɵfac, providedIn: 'root' });
244
+ }
245
+ export { WsThanosService };
246
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WsThanosService, [{
247
+ type: Injectable,
248
+ args: [{ providedIn: 'root' }]
249
+ }], function () { return [{ type: undefined, decorators: [{
250
+ type: Inject,
251
+ args: [WS_THANOS_OPTIONS_TOKEN]
252
+ }] }, { type: i0.NgZone }]; }, null); })();
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGhhbm9zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3B1YmxpYy93cy10aGFub3Mvc3JjL2xpYi93cy10aGFub3Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixRQUFRLEVBQ1IsSUFBSSxFQUNKLFFBQVEsRUFDUixHQUFHLEVBRUgsU0FBUyxFQUNULFNBQVMsRUFDVCxHQUFHLEVBQ0gsWUFBWSxHQUNiLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQUdwRSxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUNoQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUMxQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDdkIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQztBQTZCNUIsTUFDYSxlQUFlO0lBR2hCO0lBQ0E7SUFIVixZQUVVLGFBQThCLEVBQzlCLE1BQWM7UUFEZCxrQkFBYSxHQUFiLGFBQWEsQ0FBaUI7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUNyQixDQUFDO0lBRUksTUFBTSxDQUFDLHlCQUF5QixDQUFDLElBQVk7UUFDbkQsT0FBTztZQUNMLENBQUMsRUFBRSxJQUFJO1lBQ1AsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDO1lBQ1gsRUFBRSxF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d0JBQ2IsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLG9CQUFvQjtxQkFDckI7b0JBQ0QsS0FBSztvQkFDTCxJQUFJO2lCQUNMLENBQUMsQ0FBQztnQkFDSCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLE9BQU8sRUFBRTtvQkFDWCxlQUFlLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ2pFO1lBQ0gsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxFQUM3RCxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQ3RDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzt5RUExU1UsZUFBZSxjQUVoQix1QkFBdUI7Z0VBRnRCLGVBQWUsV0FBZixlQUFlLG1CQURGLE1BQU07O1NBQ25CLGVBQWU7dUZBQWYsZUFBZTtjQUQzQixVQUFVO2VBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOztzQkFHN0IsTUFBTTt1QkFBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBkZWZhdWx0IGFzIGh0bWwyY2FudmFzIH0gZnJvbSAnaHRtbDJjYW52YXMnO1xuaW1wb3J0IHtcbiAgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIsXG4gIGZpbmFsaXplLFxuICBmcm9tLFxuICBpbnRlcnZhbCxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBzd2l0Y2hNYXAsXG4gIHRha2VXaGlsZSxcbiAgdGFwLFxuICB0aW1lSW50ZXJ2YWwsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQW5pbWF0aW9uU3RhdGUgfSBmcm9tICcuL2FuaW1hdGlvbi5zdGF0ZSc7XG5pbXBvcnQgeyBTaW1wbGV4Tm9pc2UgfSBmcm9tICcuL3NpbXBsZXgtbm9pc2UnO1xuaW1wb3J0IHsgV1NfVEhBTk9TX09QVElPTlNfVE9LRU4gfSBmcm9tICcuL3dzLXRoYW5vcy1vcHRpb25zLnRva2VuJztcbmltcG9ydCB0eXBlIHsgV3NUaGFub3NPcHRpb25zIH0gZnJvbSAnLi93cy10aGFub3Mub3B0aW9ucyc7XG5cbmNvbnN0IFBBUlRJQ0xFX0JZVEVfTEVOR1RIID0gMTA7XG5jb25zdCBNSU5fUEFSVElDTEVfQUxQSEEgPSB+figyNTUgKiAwLjAxKTtcbmNvbnN0IEhFSUdIVF9TQ0FMRSA9IDU7XG5jb25zdCBXSURUSF9TQ0FMRSA9IDI7XG5jb25zdCBGTE9XX0ZJRUxEX1JFUyA9IDAuMDU7XG5cbmludGVyZmFjZSBQYXJ0aWNsZXNEYXRhIHtcbiAgcGFydGljbGVzOiBGbG9hdDMyQXJyYXk7XG4gIG1heFBhcnRpY2xlWDogbnVtYmVyO1xuICBtaW5QYXJ0aWNsZVk6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFVwZGF0ZVBhcnRpY2xlUGFyYW1zIHtcbiAgcGFydGljbGVzRGF0YTogUGFydGljbGVzRGF0YTtcbiAgYW5pbWF0aW9uU3RhdGU6IEFuaW1hdGlvblN0YXRlO1xuICB0aGFub3NPcHRpb25zOiBXc1RoYW5vc09wdGlvbnM7XG4gIG5vaXNlOiBTaW1wbGV4Tm9pc2U7XG4gIHNlZWQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFBhcnRpY2xlSW5kaWNlcyB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICBkeDogbnVtYmVyO1xuICBkeTogbnVtYmVyO1xuICBheDogbnVtYmVyO1xuICBheTogbnVtYmVyO1xuICByOiBudW1iZXI7XG4gIGc6IG51bWJlcjtcbiAgYjogbnVtYmVyO1xuICBhOiBudW1iZXI7XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgV3NUaGFub3NTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChXU19USEFOT1NfT1BUSU9OU19UT0tFTilcbiAgICBwcml2YXRlIHRoYW5vc09wdGlvbnM6IFdzVGhhbm9zT3B0aW9ucyxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICkge31cblxuICBwcml2YXRlIHN0YXRpYyBnZXRQYXJ0aWNsZUluZGljZXNGb3JCYXNlKGJhc2U6IG51bWJlcik6IFBhcnRpY2xlSW5kaWNlcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGJhc2UsXG4gICAgICB5OiBiYXNlICsgMSxcbiAgICAgIGR4OiBiYXNlICsgMixcbiAgICAgIGR5OiBiYXNlICsgMyxcbiAgICAgIGF4OiBiYXNlICsgNCxcbiAgICAgIGF5OiBiYXNlICsgNSxcbiAgICAgIHI6IGJhc2UgKyA2LFxuICAgICAgZzogYmFzZSArIDcsXG4gICAgICBiOiBiYXNlICsgOCxcbiAgICAgIGE6IGJhc2UgKyA5LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRDb2xvckluZGljZXNGb3JDb29yZChcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHdpZHRoOiBudW1iZXJcbiAgKTogeyBhOiBudW1iZXI7IHI6IG51bWJlcjsgYjogbnVtYmVyOyBnOiBudW1iZXIgfSB7XG4gICAgY29uc3QgcmVkID0geSAqICh3aWR0aCAqIDQpICsgeCAqIDQ7XG4gICAgcmV0dXJuIHsgcjogcmVkLCBnOiByZWQgKyAxLCBiOiByZWQgKyAyLCBhOiByZWQgKyAzIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyB1cGRhdGVQYXJ0aWNsZXMoe1xuICAgIHNlZWQsXG4gICAgbm9pc2UsXG4gICAgcGFydGljbGVzRGF0YSxcbiAgICB0aGFub3NPcHRpb25zLFxuICAgIGFuaW1hdGlvblN0YXRlLFxuICB9OiBVcGRhdGVQYXJ0aWNsZVBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHsgZGVsdGFUU2VjLCBhbmltYXRpb25ULCBtYXhXaWR0aCwgbWF4SGVpZ2h0IH0gPSBhbmltYXRpb25TdGF0ZTtcbiAgICBjb25zdCB7IHBhcnRpY2xlQWNjZWxlcmF0aW9uIH0gPSB0aGFub3NPcHRpb25zO1xuICAgIGNvbnN0IHsgcGFydGljbGVzLCBtYXhQYXJ0aWNsZVgsIG1pblBhcnRpY2xlWSB9ID0gcGFydGljbGVzRGF0YTtcblxuICAgIC8vIHRoZSB0aW1lIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2YXBvcml6YXRpb24gZnJvbnQuXG4gICAgY29uc3QgdGltZSA9IE1hdGguc2luKGFuaW1hdGlvblQgKiAoTWF0aC5QSSAvIDIpKSAqIDEuMTtcblxuICAgIGNvbnN0IHN0YXJ0QWNjZWxlcmF0ZVggPSBtYXhQYXJ0aWNsZVggLSB0aW1lICogbWF4UGFydGljbGVYO1xuICAgIGNvbnN0IHN0YXJ0QWNjZWxlcmF0ZVkgPSB0aW1lICogKG1heEhlaWdodCAtIG1pblBhcnRpY2xlWSkgKyBtaW5QYXJ0aWNsZVk7XG5cbiAgICBjb25zdCBsZW5ndGhZID0gbWF4SGVpZ2h0IC0gc3RhcnRBY2NlbGVyYXRlWTtcbiAgICBjb25zdCBhY2NlbGVyYXRlUmFkaXVzUG93ID0gc3RhcnRBY2NlbGVyYXRlWCAqIHN0YXJ0QWNjZWxlcmF0ZVggKyBsZW5ndGhZICogbGVuZ3RoWTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydGljbGVzLmxlbmd0aDsgaSArPSBQQVJUSUNMRV9CWVRFX0xFTkdUSCkge1xuICAgICAgY29uc3QgeyB4LCB5LCBkeCwgZHksIGF4LCBheSwgYSB9ID0gV3NUaGFub3NTZXJ2aWNlLmdldFBhcnRpY2xlSW5kaWNlc0ZvckJhc2UoaSk7XG4gICAgICBjb25zdCBwYXJ0aWNsZVggPSBwYXJ0aWNsZXNbeF07XG4gICAgICBjb25zdCBwYXJ0aWNsZVkgPSBwYXJ0aWNsZXNbeV07XG5cbiAgICAgIC8vIG9ubHkgdXBkYXRlIHBhcnRpY2xlcyB0aGF0IGFyZSBpbnNpZGUgdmlldyBhbmQgdmlzaWJsZVxuICAgICAgaWYgKFxuICAgICAgICBwYXJ0aWNsZVggPiBtYXhXaWR0aCB8fFxuICAgICAgICBwYXJ0aWNsZVggPCAwIHx8XG4gICAgICAgIHBhcnRpY2xlWSA+IG1heEhlaWdodCB8fFxuICAgICAgICBwYXJ0aWNsZVkgPCAwIHx8XG4gICAgICAgIHBhcnRpY2xlc1thXSA8IE1JTl9QQVJUSUNMRV9BTFBIQVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIShNYXRoLmFicyhwYXJ0aWNsZXNbYXhdKSA+IDAgfHwgTWF0aC5hYnMocGFydGljbGVzW2F5XSkgPiAwKSkge1xuICAgICAgICBsZXQgcFlMZW5ndGggPSBtYXhIZWlnaHQgLSBwYXJ0aWNsZVk7XG4gICAgICAgIGxldCBwWExlbmd0aCA9IHBhcnRpY2xlWDtcblxuICAgICAgICAvLyB3ZSBjYWxjdWxhdGUgc29tZSByYW5kb20gbG9va2luZyBudW1iZXJzIGFuZCBmdW5jdGlvbnMgdG8gaGF2ZSBuaWNlIGxvb2tpbmcgdmFwb3JpemluZyBmcm9udCBvZiBwYXJ0aWNsZXNcbiAgICAgICAgLy8gdG9kbyBjb25zaWRlciB0byB1c2Ugbm9pc2U7XG4gICAgICAgIHBYTGVuZ3RoICs9IE1hdGgudGFuKChwWExlbmd0aCAvIDIwLjEyKSAqIHRpbWUgKyBzZWVkKSAqIDAuNTtcbiAgICAgICAgcFhMZW5ndGggKz0gKHBhcnRpY2xlWCAlIGRlbHRhVFNlYykgKiAwLjU7XG4gICAgICAgIHBYTGVuZ3RoICs9IE1hdGguc2luKChwWExlbmd0aCAvIDMwICsgNzIzLjM5NCkgKiB0aW1lICsgc2VlZCAqIDEyLjUpICogMTE7XG4gICAgICAgIHBZTGVuZ3RoICs9IE1hdGgudGFuKChwWUxlbmd0aCAvIDAuNDUpICogdGltZSArIHNlZWQgKiAxLjUpICogMC41O1xuICAgICAgICBwWUxlbmd0aCArPSBNYXRoLmNvcygocFlMZW5ndGggLyAxMDAgKyAyMzIzLjIzNCkgKiB0aW1lICsgc2VlZCAqIDQ1Ni4xKSAqIDIzO1xuXG4gICAgICAgIGNvbnN0IHBMZW5ndGggPSBwWExlbmd0aCAqIHBYTGVuZ3RoICsgcFlMZW5ndGggKiBwWUxlbmd0aDtcbiAgICAgICAgaWYgKHBMZW5ndGggPiBhY2NlbGVyYXRlUmFkaXVzUG93KSB7XG4gICAgICAgICAgcGFydGljbGVzW2F4XSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICAgICAgcGFydGljbGVzW2F5XSA9IE1hdGgucmFuZG9tKCkgKiAtMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXNlIG5vaXNlIHRvIGZsb3cgYWxvbmcgdmVsb2NpdHkgZmllbGRcbiAgICAgICAgY29uc3QgZmxvd0ZpZWxkQWNjID0gV3NUaGFub3NTZXJ2aWNlLmdldFhZRnJvbUZsb3dGaWVsZChub2lzZSwgc2VlZCwgcGFydGljbGVYLCBwYXJ0aWNsZVkpO1xuICAgICAgICBjb25zdCBhY2NlbGVyYXRpb25YID0gZmxvd0ZpZWxkQWNjWzBdO1xuICAgICAgICBjb25zdCBhY2NlbGVyYXRpb25ZID0gZmxvd0ZpZWxkQWNjWzFdO1xuICAgICAgICBwYXJ0aWNsZXNbYXhdICs9IGFjY2VsZXJhdGlvblg7XG4gICAgICAgIHBhcnRpY2xlc1theV0gKz0gYWNjZWxlcmF0aW9uWTtcbiAgICAgIH1cblxuICAgICAgLy8gKiBNYXRoLnBvdygxICsgYW5pbWF0aW9uVCwgNClcbiAgICAgIHBhcnRpY2xlc1tkeF0gKz0gcGFydGljbGVzW2F4XSAqIHBhcnRpY2xlQWNjZWxlcmF0aW9uICogZGVsdGFUU2VjO1xuICAgICAgcGFydGljbGVzW2R5XSArPSBwYXJ0aWNsZXNbYXldICogcGFydGljbGVBY2NlbGVyYXRpb24gKiBkZWx0YVRTZWM7XG4gICAgICBwYXJ0aWNsZXNbeF0gKz0gcGFydGljbGVzW2R4XSAqIGRlbHRhVFNlYztcbiAgICAgIHBhcnRpY2xlc1t5XSArPSBwYXJ0aWNsZXNbZHldICogZGVsdGFUU2VjO1xuICAgICAgLy8gZmFkZSBwYXJ0aWNsZSBvdXQgKCB2ZXJ5IGxhdGUpO1xuICAgICAgcGFydGljbGVzW2FdICo9IDEgLSBNYXRoLnBvdyhhbmltYXRpb25ULCAxNSk7IC8vIDI1NSAtIE1hdGguc3FydChwYXJ0aWNsZXNbZHhdICogcGFydGljbGVzW2R4XSArIHBhcnRpY2xlc1tkeV0gKiBwYXJ0aWNsZXNbZHldKSAvIDEuMjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkcmF3UGFydGljbGVzKGRyYXdDdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgcGFydGljbGVzOiBGbG9hdDMyQXJyYXkpOiB2b2lkIHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGRyYXdDdHguY2FudmFzO1xuICAgIGRyYXdDdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnN0IGltYWdlID0gZHJhd0N0eC5nZXRJbWFnZURhdGEoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gaW1hZ2UuZGF0YTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRpY2xlcy5sZW5ndGg7IGkgKz0gUEFSVElDTEVfQllURV9MRU5HVEgpIHtcbiAgICAgIGNvbnN0IHBhcnRpY2xlWCA9IHBhcnRpY2xlc1tpXTtcbiAgICAgIGNvbnN0IHBhcnRpY2xlWSA9IHBhcnRpY2xlc1tpICsgMV07XG4gICAgICBjb25zdCBwSSA9IFdzVGhhbm9zU2VydmljZS5nZXRQYXJ0aWNsZUluZGljZXNGb3JCYXNlKGkpO1xuICAgICAgaWYgKFxuICAgICAgICBwYXJ0aWNsZVggPiB3aWR0aCB8fFxuICAgICAgICBwYXJ0aWNsZVggPCAwIHx8XG4gICAgICAgIHBhcnRpY2xlWSA+IGhlaWdodCB8fFxuICAgICAgICBwYXJ0aWNsZVkgPCAwIHx8XG4gICAgICAgIHBhcnRpY2xlc1twSS5hXSA8IE1JTl9QQVJUSUNMRV9BTFBIQVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyByLCBnLCBiLCBhIH0gPSBXc1RoYW5vc1NlcnZpY2UuZ2V0Q29sb3JJbmRpY2VzRm9yQ29vcmQofn5wYXJ0aWNsZXNbcEkueF0sIH5+cGFydGljbGVzW3BJLnldLCB3aWR0aCk7XG4gICAgICBpbWFnZURhdGFbcl0gPSB+fnBhcnRpY2xlc1twSS5yXTtcbiAgICAgIGltYWdlRGF0YVtnXSA9IH5+cGFydGljbGVzW3BJLmddO1xuICAgICAgaW1hZ2VEYXRhW2JdID0gfn5wYXJ0aWNsZXNbcEkuYl07XG4gICAgICBpbWFnZURhdGFbYV0gPSB+fnBhcnRpY2xlc1twSS5hXTtcbiAgICB9XG4gICAgZHJhd0N0eC5wdXRJbWFnZURhdGEoaW1hZ2UsIDAsIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcHJlcGFyZUNhbnZhc0ZvclZhcG9yaXplKFxuICAgIGRpdkNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gICAgbWF4UGFydGljbGVDb3VudDogbnVtYmVyXG4gICk6IHtcbiAgICBwYXJ0aWNsZXNEYXRhOiBQYXJ0aWNsZXNEYXRhO1xuICAgIHJlc3VsdENhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIH0ge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZGl2Q2FudmFzO1xuXG4gICAgLy8gc2NhbGUgcmVzdWx0IGNhbnZhcyB0byBoYXZlIG1vcmUgcm9vbSB0byBkcmF3IHBhcnRpY2xlcyB3aGlsZSB2YXBvcml6aW5nO1xuICAgIGNvbnN0IHJlc3VsdEhlaWdodCA9IGhlaWdodCAqIEhFSUdIVF9TQ0FMRTtcbiAgICBjb25zdCByZXN1bHRXaWR0aCA9IHdpZHRoICogV0lEVEhfU0NBTEU7XG4gICAgY29uc3QgcmVzdWx0Q2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIHJlc3VsdENhbnZhcy5oZWlnaHQgPSByZXN1bHRIZWlnaHQ7XG4gICAgcmVzdWx0Q2FudmFzLndpZHRoID0gcmVzdWx0V2lkdGg7XG5cbiAgICBjb25zdCBpbWFnZURhdGEgPSBkaXZDYW52YXMuZ2V0Q29udGV4dCgnMmQnKT8uZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmIChpbWFnZURhdGEgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZ2V0IGltYWdlIGRhdGEgZnJvbSBjYW52YXMnKTtcbiAgICB9XG4gICAgY29uc3QgcGFydGljbGVzRGF0YSA9IFdzVGhhbm9zU2VydmljZS5jcmVhdGVQYXJ0aWNsZXNGb3JJbWFnZURhdGEoaW1hZ2VEYXRhLCBtYXhQYXJ0aWNsZUNvdW50LCByZXN1bHRIZWlnaHQpO1xuICAgIHJldHVybiB7IHJlc3VsdENhbnZhcywgcGFydGljbGVzRGF0YSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUGFydGljbGVzRm9ySW1hZ2VEYXRhKFxuICAgIGltYWdlRGF0YTogSW1hZ2VEYXRhLFxuICAgIG1heFBhcnRpY2xlQ291bnQ6IG51bWJlcixcbiAgICByZXN1bHRIZWlnaHQ6IG51bWJlclxuICApOiB7IG1pblBhcnRpY2xlWTogbnVtYmVyOyBtYXhQYXJ0aWNsZVg6IG51bWJlcjsgcGFydGljbGVzOiBGbG9hdDMyQXJyYXkgfSB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBpbWFnZURhdGE7XG4gICAgbGV0IHBhcnRpY2xlQ2FuZGlkYXRlcyA9IDA7XG4gICAgbGV0IHBhcnRpY2xlQ291bnQgPSAwO1xuXG4gICAgY29uc3QgcGFydGljbGVDYW5kaWF0ZXNMaXN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICBjb25zdCB7IGEgfSA9IFdzVGhhbm9zU2VydmljZS5nZXRDb2xvckluZGljZXNGb3JDb29yZCh4LCB5LCB3aWR0aCk7XG4gICAgICAgIGlmIChpbWFnZURhdGEuZGF0YVthXSA+PSBNSU5fUEFSVElDTEVfQUxQSEEpIHtcbiAgICAgICAgICBwYXJ0aWNsZUNhbmRpZGF0ZXMrKztcbiAgICAgICAgICBwYXJ0aWNsZUNhbmRpYXRlc0xpc3QucHVzaCh7IHgsIHkgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtYXhOdW1QYXJ0aWNsZXMgPSBNYXRoLm1pbihwYXJ0aWNsZUNhbmRpZGF0ZXMsIG1heFBhcnRpY2xlQ291bnQpO1xuICAgIGNvbnN0IHBhcnRpY2xlcyA9IG5ldyBGbG9hdDMyQXJyYXkoRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UICogbWF4TnVtUGFydGljbGVzICogUEFSVElDTEVfQllURV9MRU5HVEgpO1xuXG4gICAgbGV0IG1heFBhcnRpY2xlWCA9IDA7XG4gICAgbGV0IG1pblBhcnRpY2xlWSA9IHJlc3VsdEhlaWdodDtcbiAgICB3aGlsZSAocGFydGljbGVDb3VudCA8IG1heE51bVBhcnRpY2xlcykge1xuICAgICAgLy8gc2VsZWN0IHJhbmRvbSBpbmRleCBmcm9tIGNhbmRpYXRlc1xuICAgICAgY29uc3QgaW5kZXggPSB+fihNYXRoLnJhbmRvbSgpICogcGFydGljbGVDYW5kaWF0ZXNMaXN0Lmxlbmd0aCk7XG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHBhcnRpY2xlQ2FuZGlhdGVzTGlzdFtpbmRleF07XG5cbiAgICAgIC8vIG92ZXJ3cml0ZSBpbmRleCB3aXRoIGxhc3QgZWxlbWVudCB0byBwcmV2ZW50IGRvdWJsZSBzZWxlY3Rpb24gb2YgcGFydGljbGVzXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgcGFydGljbGVDYW5kaWF0ZXNMaXN0W2luZGV4XSA9IHBhcnRpY2xlQ2FuZGlhdGVzTGlzdC5wb3AoKSE7XG5cbiAgICAgIG1heFBhcnRpY2xlWCA9IE1hdGgubWF4KG1heFBhcnRpY2xlWCwgeCk7XG4gICAgICBtaW5QYXJ0aWNsZVkgPSBNYXRoLm1pbihtaW5QYXJ0aWNsZVksIHkpO1xuICAgICAgY29uc3QgeyBkeCwgZHksIGF4LCBheSwgciwgZywgYiwgYSwgLi4ueHkgfSA9IFdzVGhhbm9zU2VydmljZS5nZXRQYXJ0aWNsZUluZGljZXNGb3JCYXNlKFxuICAgICAgICBwYXJ0aWNsZUNvdW50ICogUEFSVElDTEVfQllURV9MRU5HVEhcbiAgICAgICk7XG4gICAgICBwYXJ0aWNsZXNbeHkueF0gPSB4O1xuICAgICAgcGFydGljbGVzW3h5LnldID0geSArIHJlc3VsdEhlaWdodCAtIGhlaWdodDtcbiAgICAgIHBhcnRpY2xlc1tkeF0gPSAwO1xuICAgICAgcGFydGljbGVzW2R5XSA9IDA7XG4gICAgICBwYXJ0aWNsZXNbYXhdID0gMDtcbiAgICAgIHBhcnRpY2xlc1theV0gPSAwO1xuXG4gICAgICBjb25zdCBpbmRpY2VzSW1hZ2UgPSBXc1RoYW5vc1NlcnZpY2UuZ2V0Q29sb3JJbmRpY2VzRm9yQ29vcmQoeCwgeSwgd2lkdGgpO1xuXG4gICAgICBwYXJ0aWNsZXNbcl0gPSBpbWFnZURhdGEuZGF0YVtpbmRpY2VzSW1hZ2Uucl07XG4gICAgICBwYXJ0aWNsZXNbZ10gPSBpbWFnZURhdGEuZGF0YVtpbmRpY2VzSW1hZ2UuZ107XG4gICAgICBwYXJ0aWNsZXNbYl0gPSBpbWFnZURhdGEuZGF0YVtpbmRpY2VzSW1hZ2UuYl07XG4gICAgICBwYXJ0aWNsZXNbYV0gPSBpbWFnZURhdGEuZGF0YVtpbmRpY2VzSW1hZ2UuYV07XG4gICAgICBwYXJ0aWNsZUNvdW50Kys7XG4gICAgfVxuICAgIHJldHVybiB7IHBhcnRpY2xlcywgbWF4UGFydGljbGVYLCBtaW5QYXJ0aWNsZVkgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldFhZRnJvbUZsb3dGaWVsZChub2lzZTogU2ltcGxleE5vaXNlLCBzZWVkOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgY29uc3Qgc2FtcGxlWCA9IG5vaXNlLnNjYWxlZDNEKHgsIHksIHNlZWQgKyAzMy4yMywgRkxPV19GSUVMRF9SRVMpO1xuICAgIGNvbnN0IHNhbXBsZVkgPSBub2lzZS5zY2FsZWQzRCh4LCBzZWVkIC8gMTMuMjMsIHksIEZMT1dfRklFTERfUkVTKSAqIC0xO1xuICAgIHJldHVybiBbc2FtcGxlWCwgc2FtcGxlWV07XG4gIH1cblxuICAvKipcbiAgICogc3RhcnQgdGhlIHZhcG9yaXplQW5kU2Nyb2xsSW50b1ZpZXctZWZmZWN0LlxuICAgKlxuICAgKiBJdCdzIHJ1bm5pbmcgb3V0c2lkZSB0aGUgbmdab25lLlxuICAgKi9cbiAgdmFwb3JpemUoZWxlbTogSFRNTEVsZW1lbnQpOiBPYnNlcnZhYmxlPEFuaW1hdGlvblN0YXRlPiB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMudmFwb3JpemVJbnRlcm4oZWxlbSkpO1xuICB9XG5cbiAgcHJpdmF0ZSB2YXBvcml6ZUludGVybihlbGVtOiBIVE1MRWxlbWVudCk6IE9ic2VydmFibGU8QW5pbWF0aW9uU3RhdGU+IHtcbiAgICBlbGVtLnN0eWxlLm9wYWNpdHkgPSBlbGVtLnN0eWxlLm9wYWNpdHkgfHwgJzEnO1xuICAgIGVsZW0uc3R5bGUudHJhbnNpdGlvbiA9IGBvcGFjaXR5ICR7TWF0aC5mbG9vcih0aGlzLnRoYW5vc09wdGlvbnMuYW5pbWF0aW9uTGVuZ3RoICogMC44KX1tcyBlYXNlLW91dGA7XG4gICAgY29uc3Qgbm9pc2UgPSBuZXcgU2ltcGxleE5vaXNlKHsgZnJlcXVlbmN5OiAwLjAxLCBtaW46IDAgfSk7XG4gICAgY29uc3Qgc2VlZCA9IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpICogTWF0aC5yYW5kb20oKTtcbiAgICBjb25zdCBodG1sMkNhbnZhc1Byb21pc2U6IFByb21pc2U8SFRNTENhbnZhc0VsZW1lbnQ+ID0gaHRtbDJjYW52YXMoZWxlbSwge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxuICAgICAgc2NhbGU6IDEsXG4gICAgICBhbGxvd1RhaW50OiB0cnVlLFxuICAgICAgd2luZG93SGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICB3aW5kb3dXaWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBzY3JvbGxZOiAtd2luZG93LnNjcm9sbFksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnJvbShodG1sMkNhbnZhc1Byb21pc2UpLnBpcGUoXG4gICAgICBtYXAoKGNhbnZhc0Zyb21IdG1sRWxlbSkgPT4ge1xuICAgICAgICBjb25zdCBjYW52YXNBbmRQYXJ0aWNsZXMgPSBXc1RoYW5vc1NlcnZpY2UucHJlcGFyZUNhbnZhc0ZvclZhcG9yaXplKFxuICAgICAgICAgIGNhbnZhc0Zyb21IdG1sRWxlbSxcbiAgICAgICAgICB0aGlzLnRoYW5vc09wdGlvbnMubWF4UGFydGljbGVDb3VudFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB7IHJlc3VsdENhbnZhcyB9ID0gY2FudmFzQW5kUGFydGljbGVzO1xuICAgICAgICBpZiAoZWxlbS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgZWxlbS5wYXJlbnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gZWxlbS5wYXJlbnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uIHx8ICdyZWxhdGl2ZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLmxlZnQgPSAwICsgJ3B4JztcbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLnRvcCA9ICctJyArIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICogKEhFSUdIVF9TQ0FMRSAtIDEpICsgJ3B4JztcbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLnpJbmRleCA9ICcyMDAwJztcbiAgICAgICAgcmVzdWx0Q2FudmFzLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG5cbiAgICAgICAgZWxlbS5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgcmVzdWx0Q2FudmFzKTtcbiAgICAgICAgLy8gdGhpcyBzaG91bGQgc3RhcnQgdGhlIHRyYW5zaXRpb24gYWJvdmUgZGVmaW5lZFxuICAgICAgICBlbGVtLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHJldHVybiBjYW52YXNBbmRQYXJ0aWNsZXM7XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcCgoeyByZXN1bHRDYW52YXMsIHBhcnRpY2xlc0RhdGEgfSkgPT4ge1xuICAgICAgICBsZXQgdGltZSA9IDA7XG4gICAgICAgIGNvbnN0IHsgYW5pbWF0aW9uTGVuZ3RoLCBtYXhQYXJ0aWNsZUNvdW50LCBwYXJ0aWNsZUFjY2VsZXJhdGlvbiB9ID0gdGhpcy50aGFub3NPcHRpb25zO1xuICAgICAgICByZXR1cm4gaW50ZXJ2YWwoMTAwMCAvIDYwLCBhbmltYXRpb25GcmFtZVNjaGVkdWxlcikucGlwZShcbiAgICAgICAgICB0aW1lSW50ZXJ2YWwoKSxcbiAgICAgICAgICB0YXAoKGRlbHRhVCkgPT4gKHRpbWUgKz0gZGVsdGFULmludGVydmFsKSksXG4gICAgICAgICAgbWFwKFxuICAgICAgICAgICAgKGRlbHRhVCkgPT5cbiAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICBkZWx0YVRTZWM6IGRlbHRhVC5pbnRlcnZhbCAvIDEwMDAsXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uVDogdGltZSAvIGFuaW1hdGlvbkxlbmd0aCxcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogcmVzdWx0Q2FudmFzLndpZHRoLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogcmVzdWx0Q2FudmFzLmhlaWdodCxcbiAgICAgICAgICAgICAgfSBhcyBBbmltYXRpb25TdGF0ZSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRhcCgoYW5pbWF0aW9uU3RhdGUpID0+IHtcbiAgICAgICAgICAgIFdzVGhhbm9zU2VydmljZS51cGRhdGVQYXJ0aWNsZXMoe1xuICAgICAgICAgICAgICBwYXJ0aWNsZXNEYXRhLFxuICAgICAgICAgICAgICBhbmltYXRpb25TdGF0ZSxcbiAgICAgICAgICAgICAgdGhhbm9zT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbkxlbmd0aCxcbiAgICAgICAgICAgICAgICBtYXhQYXJ0aWNsZUNvdW50LFxuICAgICAgICAgICAgICAgIHBhcnRpY2xlQWNjZWxlcmF0aW9uLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBub2lzZSxcbiAgICAgICAgICAgICAgc2VlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHJlc3VsdENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgV3NUaGFub3NTZXJ2aWNlLmRyYXdQYXJ0aWNsZXMoY29udGV4dCwgcGFydGljbGVzRGF0YS5wYXJ0aWNsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VXaGlsZSgoYW5pbWF0aW9uU3RhdGUpID0+IGFuaW1hdGlvblN0YXRlLmFuaW1hdGlvblQgPD0gMSksXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4gcmVzdWx0Q2FudmFzLnJlbW92ZSgpKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -1,5 +1,5 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './index';
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
5
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29sc29rLXRoYW5vcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvcHVibGljL3dzLXRoYW5vcy9zcmMvd29sc29rLXRoYW5vcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
package/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
- export * from './lib/ws-thanos.service';
2
- export * from './lib/ws-thanos.directive';
3
- export * from './lib/ws-thanos-options.token';
4
- export * from './lib/ws-thanos.options';
5
- export * from './lib/create-ws-thanos-options';
6
- export * from './lib/simplex-noise';
1
+ export * from './lib/ws-thanos.service';
2
+ export * from './lib/ws-thanos.directive';
3
+ export * from './lib/ws-thanos-options.token';
4
+ export * from './lib/ws-thanos.options';
5
+ export * from './lib/create-ws-thanos-options';
6
+ export * from './lib/simplex-noise';
7
+ export { AnimationState } from './lib/animation.state';
8
+ //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../libs/public/ws-thanos/src/index.ts"],"names":[],"mappings":"AAGA,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface AnimationState {
2
+ deltaTSec: number;
3
+ animationT: number;
4
+ maxWidth: number;
5
+ maxHeight: number;
6
+ }
7
+ //# sourceMappingURL=animation.state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation.state.d.ts","sourceRoot":"","sources":["../../../../../libs/public/ws-thanos/src/lib/animation.state.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -1,2 +1,3 @@
1
- import { WsThanosOptions } from './ws-thanos.options';
2
- export declare function createWsThanosOptions(options?: Partial<WsThanosOptions>): WsThanosOptions;
1
+ import { WsThanosOptions } from './ws-thanos.options';
2
+ export declare function createWsThanosOptions(options?: Partial<WsThanosOptions>): WsThanosOptions;
3
+ //# sourceMappingURL=create-ws-thanos-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-ws-thanos-options.d.ts","sourceRoot":"","sources":["../../../../../libs/public/ws-thanos/src/lib/create-ws-thanos-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAOzF"}
@@ -1,9 +1,10 @@
1
- export interface SimplexNoiseOptions {
2
- amplitude: number;
3
- frequency: number;
4
- max: number;
5
- min: number;
6
- octaves: number;
7
- persistence: number;
8
- random: () => number;
9
- }
1
+ export interface SimplexNoiseOptions {
2
+ amplitude: number;
3
+ frequency: number;
4
+ max: number;
5
+ min: number;
6
+ octaves: number;
7
+ persistence: number;
8
+ random: () => number;
9
+ }
10
+ //# sourceMappingURL=simplex-noise-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simplex-noise-options.d.ts","sourceRoot":"","sources":["../../../../../libs/public/ws-thanos/src/lib/simplex-noise-options.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,MAAM,CAAC;CACtB"}
@@ -1,18 +1,19 @@
1
- import type { SimplexNoiseOptions } from './simplex-noise-options';
2
- export declare class SimplexNoise {
3
- constructor(options?: Partial<SimplexNoiseOptions>);
4
- static G3: number;
5
- static GRAD3D: number[][];
6
- readonly amplitude: number;
7
- readonly frequency: number;
8
- readonly octaves: number;
9
- readonly perm: Uint8Array;
10
- readonly permMod12: Uint8Array;
11
- readonly persistence: number;
12
- readonly random: () => number;
13
- readonly scale: (value: number) => number;
14
- private memScale3D;
15
- dot(gs: number[], coords: number[]): number;
16
- raw3D(x: number, y: number, z: number): number;
17
- scaled3D(x: number, y: number, z: number, resolution: number): number;
18
- }
1
+ import type { SimplexNoiseOptions } from './simplex-noise-options';
2
+ export declare class SimplexNoise {
3
+ constructor(options?: Partial<SimplexNoiseOptions>);
4
+ static G3: number;
5
+ static GRAD3D: number[][];
6
+ readonly amplitude: number;
7
+ readonly frequency: number;
8
+ readonly octaves: number;
9
+ readonly perm: Uint8Array;
10
+ readonly permMod12: Uint8Array;
11
+ readonly persistence: number;
12
+ readonly random: () => number;
13
+ readonly scale: (value: number) => number;
14
+ private memScale3D;
15
+ dot(gs: number[], coords: number[]): number;
16
+ raw3D(x: number, y: number, z: number): number;
17
+ scaled3D(x: number, y: number, z: number, resolution: number): number;
18
+ }
19
+ //# sourceMappingURL=simplex-noise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simplex-noise.d.ts","sourceRoot":"","sources":["../../../../../libs/public/ws-thanos/src/lib/simplex-noise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,qBAAa,YAAY;gBACX,OAAO,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAiClD,MAAM,CAAC,EAAE,SAAa;IAEtB,MAAM,CAAC,MAAM,aAaX;IAEF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAiC;IAEnD,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM;IAI3C,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IA2E9C,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;CAsBtE"}
@@ -1,4 +1,5 @@
1
- import { InjectionToken, Provider } from '@angular/core';
2
- import type { WsThanosOptions } from './ws-thanos.options';
3
- export declare const WS_THANOS_OPTIONS_TOKEN: InjectionToken<WsThanosOptions>;
4
- export declare function provideWsThanosOptions(options?: Partial<WsThanosOptions>): Provider;
1
+ import { InjectionToken, Provider } from '@angular/core';
2
+ import type { WsThanosOptions } from './ws-thanos.options';
3
+ export declare const WS_THANOS_OPTIONS_TOKEN: InjectionToken<WsThanosOptions>;
4
+ export declare function provideWsThanosOptions(options?: Partial<WsThanosOptions>): Provider;
5
+ //# sourceMappingURL=ws-thanos-options.token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-thanos-options.token.d.ts","sourceRoot":"","sources":["../../../../../libs/public/ws-thanos/src/lib/ws-thanos-options.token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,eAAO,MAAM,uBAAuB,iCAGlC,CAAC;AAEH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,QAAQ,CAKnF"}
@@ -1,18 +1,36 @@
1
- import { ElementRef, NgZone, OnDestroy } from '@angular/core';
2
- import { Observable } from 'rxjs';
3
- import type { WsThanosOptions } from './ws-thanos.options';
4
- import { WsThanosService } from './ws-thanos.service';
5
- import * as i0 from "@angular/core";
6
- export declare class WsThanosDirective implements OnDestroy {
7
- private readonly vaporizeDomElem;
8
- private readonly thanosService;
9
- private readonly thanosOptions;
10
- private readonly ngZone;
11
- private subscription?;
12
- private wsThanosComplete;
13
- constructor(vaporizeDomElem: ElementRef<HTMLElement>, thanosService: WsThanosService, thanosOptions: WsThanosOptions, ngZone: NgZone);
14
- vaporize(removeElem?: boolean): Observable<void>;
15
- ngOnDestroy(): void;
16
- static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosDirective, never>;
17
- static ɵdir: i0.ɵɵDirectiveDeclaration<WsThanosDirective, "[wsThanos], ws-thanos", ["thanos"], {}, { "wsThanosComplete": "wsThanosComplete"; }, never, never, true>;
18
- }
1
+ import { ElementRef, NgZone } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { AnimationState } from './animation.state';
4
+ import type { WsThanosOptions } from './ws-thanos.options';
5
+ import { WsThanosService } from './ws-thanos.service';
6
+ import * as i0 from "@angular/core";
7
+ export declare class WsThanosDirective {
8
+ private readonly vaporizeDomElem;
9
+ private readonly thanosService;
10
+ private readonly thanosOptions;
11
+ private readonly ngZone;
12
+ private wsThanosCompleteSubject;
13
+ private untilDestroyed;
14
+ wsThanosComplete: Observable<void>;
15
+ private subscriptions;
16
+ constructor(vaporizeDomElem: ElementRef<HTMLElement>, thanosService: WsThanosService, thanosOptions: WsThanosOptions, ngZone: NgZone);
17
+ /**
18
+ *
19
+ * Vaporize the dom element of this directive
20
+ * @param removeElem remove the vaporized dom element or blend back in after a while
21
+ *
22
+ * Subscribe to the returned observable to start vaporization
23
+ *
24
+ */
25
+ vaporize$(removeElem?: boolean): Observable<AnimationState>;
26
+ /**
27
+ * Vaporize the dom element of this directive
28
+ * @param removeElem remove the vaporized dom element or blend back in after a while
29
+ *
30
+ * @Deprecated use vaporizeAndScrollIntoView$ instead and subscribe to it
31
+ */
32
+ vaporize(removeElem?: boolean): Observable<void>;
33
+ static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosDirective, never>;
34
+ static ɵdir: i0.ɵɵDirectiveDeclaration<WsThanosDirective, "[wsThanos], ws-thanos", ["thanos"], {}, { "wsThanosComplete": "wsThanosComplete"; }, never, never, true, never>;
35
+ }
36
+ //# sourceMappingURL=ws-thanos.directive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-thanos.directive.d.ts","sourceRoot":"","sources":["../../../../../libs/public/ws-thanos/src/lib/ws-thanos.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAU,MAAM,EAAU,MAAM,eAAe,CAAC;AAE9E,OAAO,EAAY,UAAU,EAAoC,MAAM,MAAM,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;;AAEtD,qBAKa,iBAAiB;IAS1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZzB,OAAO,CAAC,uBAAuB,CAAuB;IACtD,OAAO,CAAC,cAAc,CAAwB;IAGvC,gBAAgB,EAAE,UAAU,CAAC,IAAI,CAAC,CAA+C;IACxF,OAAO,CAAC,aAAa,CAAoC;gBAGtC,eAAe,EAAE,UAAU,CAAC,WAAW,CAAC,EACxC,aAAa,EAAE,eAAe,EAE9B,aAAa,EAAE,eAAe,EAC9B,MAAM,EAAE,MAAM;IAGjC;;;;;;;OAOG;IACI,SAAS,CAAC,UAAU,UAAO,GAAG,UAAU,CAAC,cAAc,CAAC;IAuB/D;;;;;OAKG;IACI,QAAQ,CAAC,UAAU,UAAO,GAAG,UAAU,CAAC,IAAI,CAAC;yCArDzC,iBAAiB;2CAAjB,iBAAiB;CAyD7B"}
@@ -1,5 +1,6 @@
1
- export interface WsThanosOptions {
2
- animationLength: number;
3
- maxParticleCount: number;
4
- particleAcceleration: number;
5
- }
1
+ export interface WsThanosOptions {
2
+ animationLength: number;
3
+ maxParticleCount: number;
4
+ particleAcceleration: number;
5
+ }
6
+ //# sourceMappingURL=ws-thanos.options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-thanos.options.d.ts","sourceRoot":"","sources":["../../../../../libs/public/ws-thanos/src/lib/ws-thanos.options.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;CAC9B"}
@@ -1,32 +1,27 @@
1
- import { NgZone } from '@angular/core';
2
- import { Observable } from 'rxjs';
3
- import type { WsThanosOptions } from './ws-thanos.options';
4
- import * as i0 from "@angular/core";
5
- interface AnimationState {
6
- deltaTSec: number;
7
- animationT: number;
8
- maxWidth: number;
9
- maxHeight: number;
10
- }
11
- export declare class WsThanosService {
12
- private thanosOptions;
13
- private ngZone;
14
- constructor(thanosOptions: WsThanosOptions, ngZone: NgZone);
15
- private static getParticleIndicesForBase;
16
- private static getColorIndicesForCoord;
17
- private static updateParticles;
18
- private static drawParticles;
19
- private static prepareCanvasForVaporize;
20
- private static createParticlesForImageData;
21
- private static getXYFromFlowField;
22
- /**
23
- * start the vaporize-effect.
24
- *
25
- * It's running outside the ngZone.
26
- */
27
- vaporize(elem: HTMLElement): Observable<AnimationState>;
28
- private vaporizeIntern;
29
- static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosService, never>;
30
- static ɵprov: i0.ɵɵInjectableDeclaration<WsThanosService>;
31
- }
32
- export {};
1
+ import { NgZone } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { AnimationState } from './animation.state';
4
+ import type { WsThanosOptions } from './ws-thanos.options';
5
+ import * as i0 from "@angular/core";
6
+ export declare class WsThanosService {
7
+ private thanosOptions;
8
+ private ngZone;
9
+ constructor(thanosOptions: WsThanosOptions, ngZone: NgZone);
10
+ private static getParticleIndicesForBase;
11
+ private static getColorIndicesForCoord;
12
+ private static updateParticles;
13
+ private static drawParticles;
14
+ private static prepareCanvasForVaporize;
15
+ private static createParticlesForImageData;
16
+ private static getXYFromFlowField;
17
+ /**
18
+ * start the vaporizeAndScrollIntoView-effect.
19
+ *
20
+ * It's running outside the ngZone.
21
+ */
22
+ vaporize(elem: HTMLElement): Observable<AnimationState>;
23
+ private vaporizeIntern;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<WsThanosService, never>;
25
+ static ɵprov: i0.ɵɵInjectableDeclaration<WsThanosService>;
26
+ }
27
+ //# sourceMappingURL=ws-thanos.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-thanos.service.d.ts","sourceRoot":"","sources":["../../../../../libs/public/ws-thanos/src/lib/ws-thanos.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,MAAM,EAAE,MAAM,eAAe,CAAC;AAG3D,OAAO,EAML,UAAU,EAKX,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;;AAmC3D,qBACa,eAAe;IAGxB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,MAAM;gBADN,aAAa,EAAE,eAAe,EAC9B,MAAM,EAAE,MAAM;IAGxB,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAexC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAStC,OAAO,CAAC,MAAM,CAAC,eAAe;IAwE9B,OAAO,CAAC,MAAM,CAAC,aAAa;IA2B5B,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAwBvC,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAyD1C,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAMjC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,cAAc,CAAC;IAIvD,OAAO,CAAC,cAAc;yCAlOX,eAAe;6CAAf,eAAe;CA2S3B"}