angular-three-soba 2.0.0-beta.261 → 2.0.0-beta.263
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/controls/index.d.ts +1 -0
- package/controls/lib/scroll-controls.d.ts +78 -0
- package/esm2022/controls/index.mjs +2 -1
- package/esm2022/controls/lib/scroll-controls.mjs +268 -0
- package/esm2022/staging/lib/environment.mjs +13 -4
- package/fesm2022/angular-three-soba-controls.mjs +271 -7
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +12 -3
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/package.json +12 -12
- package/staging/README.md +4 -4
package/controls/index.d.ts
CHANGED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { NgtHTML } from 'angular-three';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export interface NgtsScrollControlsOptions {
|
|
4
|
+
/** Precision, default 0.00001 */
|
|
5
|
+
eps: number;
|
|
6
|
+
/** Horizontal scroll, default false (vertical) */
|
|
7
|
+
horizontal: boolean;
|
|
8
|
+
/** Infinite scroll, default false (experimental!) */
|
|
9
|
+
infinite: boolean;
|
|
10
|
+
/** Defines the lenght of the scroll area, each page is height:100%, default 1 */
|
|
11
|
+
pages: number;
|
|
12
|
+
/** A factor that increases scroll bar travel,default: 1 */
|
|
13
|
+
distance: number;
|
|
14
|
+
/** Friction in seconds, default: 0.25 (1/4 second) */
|
|
15
|
+
damping: number;
|
|
16
|
+
/** maxSpeed optionally allows you to clamp the maximum speed. If damping is 0.2s and looks OK
|
|
17
|
+
* going between, say, page 1 and 2, but not for pages far apart as it'll move very rapid,
|
|
18
|
+
* then a maxSpeed of e.g. 3 which will clamp the speed to 3 units per second, it may now
|
|
19
|
+
* take much longer than damping to reach the target if it is far away. Default: Infinity */
|
|
20
|
+
maxSpeed: number;
|
|
21
|
+
/** If true attaches the scroll container before the canvas */
|
|
22
|
+
prepend: boolean;
|
|
23
|
+
enabled: boolean;
|
|
24
|
+
style: Partial<CSSStyleDeclaration>;
|
|
25
|
+
}
|
|
26
|
+
export declare class NgtsScrollControls {
|
|
27
|
+
progress: import("@angular/core").ModelSignal<number>;
|
|
28
|
+
options: import("@angular/core").InputSignalWithTransform<NgtsScrollControlsOptions, "" | Partial<NgtsScrollControlsOptions>>;
|
|
29
|
+
private document;
|
|
30
|
+
private store;
|
|
31
|
+
private gl;
|
|
32
|
+
private events;
|
|
33
|
+
private invalidate;
|
|
34
|
+
private size;
|
|
35
|
+
private domElement;
|
|
36
|
+
private target;
|
|
37
|
+
private _el;
|
|
38
|
+
private _fill;
|
|
39
|
+
private _fixed;
|
|
40
|
+
private style;
|
|
41
|
+
private prepend;
|
|
42
|
+
private enabled;
|
|
43
|
+
private infinite;
|
|
44
|
+
private maxSpeed;
|
|
45
|
+
eps: import("@angular/core").Signal<number>;
|
|
46
|
+
horizontal: import("@angular/core").Signal<boolean>;
|
|
47
|
+
pages: import("@angular/core").Signal<number>;
|
|
48
|
+
distance: import("@angular/core").Signal<number>;
|
|
49
|
+
damping: import("@angular/core").Signal<number>;
|
|
50
|
+
scroll: number;
|
|
51
|
+
offset: number;
|
|
52
|
+
delta: number;
|
|
53
|
+
constructor();
|
|
54
|
+
get el(): HTMLDivElement;
|
|
55
|
+
get fill(): HTMLDivElement;
|
|
56
|
+
get fixed(): HTMLDivElement;
|
|
57
|
+
range(from: number, distance: number, margin?: number): number;
|
|
58
|
+
curve(from: number, distance: number, margin?: number): number;
|
|
59
|
+
visible(from: number, distance: number, margin?: number): boolean;
|
|
60
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtsScrollControls, never>;
|
|
61
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtsScrollControls, "ngts-scroll-controls", never, { "progress": { "alias": "progress"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; }, { "progress": "progressChange"; }, never, ["*"], true, never>;
|
|
62
|
+
}
|
|
63
|
+
export declare class NgtsScrollCanvas {
|
|
64
|
+
private host;
|
|
65
|
+
private scrollControls;
|
|
66
|
+
private store;
|
|
67
|
+
private viewport;
|
|
68
|
+
constructor();
|
|
69
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtsScrollCanvas, never>;
|
|
70
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtsScrollCanvas, "ngt-group[ngts-scroll-canvas]", never, {}, {}, never, never, true, never>;
|
|
71
|
+
}
|
|
72
|
+
export declare class NgtsScrollHtml extends NgtHTML {
|
|
73
|
+
private scrollControls;
|
|
74
|
+
private size;
|
|
75
|
+
constructor();
|
|
76
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtsScrollHtml, never>;
|
|
77
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtsScrollHtml, "div[ngts-scroll-html]", never, {}, {}, never, never, true, never>;
|
|
78
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export * from './lib/camera-controls';
|
|
2
2
|
export * from './lib/orbit-controls';
|
|
3
|
-
|
|
3
|
+
export * from './lib/scroll-controls';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvY29udHJvbHMvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvY2FtZXJhLWNvbnRyb2xzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL29yYml0LWNvbnRyb2xzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Njcm9sbC1jb250cm9scyc7XG4iXX0=
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { afterNextRender, ChangeDetectionStrategy, Component, Directive, ElementRef, inject, input, model, untracked, } from '@angular/core';
|
|
3
|
+
import { injectBeforeRender, injectStore, NgtHTML, pick, provideHTMLDomElement } from 'angular-three';
|
|
4
|
+
import { easing } from 'maath';
|
|
5
|
+
import { injectAutoEffect } from 'ngxtension/auto-effect';
|
|
6
|
+
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
const defaultOptions = {
|
|
9
|
+
eps: 0.00001,
|
|
10
|
+
horizontal: false,
|
|
11
|
+
infinite: false,
|
|
12
|
+
pages: 1,
|
|
13
|
+
distance: 1,
|
|
14
|
+
damping: 0.25,
|
|
15
|
+
maxSpeed: Infinity,
|
|
16
|
+
prepend: false,
|
|
17
|
+
enabled: true,
|
|
18
|
+
style: {},
|
|
19
|
+
};
|
|
20
|
+
export class NgtsScrollControls {
|
|
21
|
+
constructor() {
|
|
22
|
+
this.progress = model(0);
|
|
23
|
+
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
24
|
+
this.document = inject(DOCUMENT);
|
|
25
|
+
this.store = injectStore();
|
|
26
|
+
this.gl = this.store.select('gl');
|
|
27
|
+
this.events = this.store.select('events');
|
|
28
|
+
this.invalidate = this.store.select('invalidate');
|
|
29
|
+
this.size = this.store.select('size');
|
|
30
|
+
this.domElement = pick(this.gl, 'domElement');
|
|
31
|
+
this.target = pick(this.domElement, 'parentNode');
|
|
32
|
+
this._el = this.document.createElement('div');
|
|
33
|
+
this._fill = this.document.createElement('div');
|
|
34
|
+
this._fixed = this.document.createElement('div');
|
|
35
|
+
this.style = pick(this.options, 'style');
|
|
36
|
+
this.prepend = pick(this.options, 'prepend');
|
|
37
|
+
this.enabled = pick(this.options, 'enabled');
|
|
38
|
+
this.infinite = pick(this.options, 'infinite');
|
|
39
|
+
this.maxSpeed = pick(this.options, 'maxSpeed');
|
|
40
|
+
this.eps = pick(this.options, 'eps');
|
|
41
|
+
this.horizontal = pick(this.options, 'horizontal');
|
|
42
|
+
this.pages = pick(this.options, 'pages');
|
|
43
|
+
this.distance = pick(this.options, 'distance');
|
|
44
|
+
this.damping = pick(this.options, 'damping');
|
|
45
|
+
this.scroll = 0;
|
|
46
|
+
this.offset = 0;
|
|
47
|
+
this.delta = 0;
|
|
48
|
+
const autoEffect = injectAutoEffect();
|
|
49
|
+
afterNextRender(() => {
|
|
50
|
+
autoEffect(() => {
|
|
51
|
+
const target = this.target();
|
|
52
|
+
if (!target)
|
|
53
|
+
return;
|
|
54
|
+
const parent = target;
|
|
55
|
+
const [pages, distance, horizontal, el, fill, fixed, style, prepend, domElement, events] = [
|
|
56
|
+
this.pages(),
|
|
57
|
+
this.distance(),
|
|
58
|
+
this.horizontal(),
|
|
59
|
+
this.el,
|
|
60
|
+
this.fill,
|
|
61
|
+
this.fixed,
|
|
62
|
+
untracked(this.style),
|
|
63
|
+
untracked(this.prepend),
|
|
64
|
+
untracked(this.domElement),
|
|
65
|
+
untracked(this.events),
|
|
66
|
+
];
|
|
67
|
+
el.style.position = 'absolute';
|
|
68
|
+
el.style.width = '100%';
|
|
69
|
+
el.style.height = '100%';
|
|
70
|
+
el.style[horizontal ? 'overflowX' : 'overflowY'] = 'auto';
|
|
71
|
+
el.style[horizontal ? 'overflowY' : 'overflowX'] = 'hidden';
|
|
72
|
+
el.style.top = '0px';
|
|
73
|
+
el.style.left = '0px';
|
|
74
|
+
for (const key in style) {
|
|
75
|
+
el.style[key] = style[key];
|
|
76
|
+
}
|
|
77
|
+
fixed.style.position = 'sticky';
|
|
78
|
+
fixed.style.top = '0px';
|
|
79
|
+
fixed.style.left = '0px';
|
|
80
|
+
fixed.style.width = '100%';
|
|
81
|
+
fixed.style.height = '100%';
|
|
82
|
+
fixed.style.overflow = 'hidden';
|
|
83
|
+
el.appendChild(fixed);
|
|
84
|
+
fill.style.height = horizontal ? '100%' : `${pages * distance * 100}%`;
|
|
85
|
+
fill.style.width = horizontal ? `${pages * distance * 100}%` : '100%';
|
|
86
|
+
fill.style.pointerEvents = 'none';
|
|
87
|
+
el.appendChild(fill);
|
|
88
|
+
if (prepend)
|
|
89
|
+
parent.prepend(el);
|
|
90
|
+
else
|
|
91
|
+
parent.appendChild(el);
|
|
92
|
+
// Init scroll one pixel in to allow upward/leftward scroll
|
|
93
|
+
el[horizontal ? 'scrollLeft' : 'scrollTop'] = 1;
|
|
94
|
+
const oldTarget = (events.connected || domElement);
|
|
95
|
+
requestAnimationFrame(() => events.connect?.(el));
|
|
96
|
+
const oldCompute = events.compute?.bind(events);
|
|
97
|
+
this.store.snapshot.setEvents({
|
|
98
|
+
compute(event, store) {
|
|
99
|
+
const state = store.snapshot;
|
|
100
|
+
// we are using boundingClientRect because we could not rely on target.offsetTop as canvas could be positioned anywhere in dom
|
|
101
|
+
const { left, top } = parent.getBoundingClientRect();
|
|
102
|
+
const offsetX = event.clientX - left;
|
|
103
|
+
const offsetY = event.clientY - top;
|
|
104
|
+
state.pointer.set((offsetX / state.size.width) * 2 - 1, -(offsetY / state.size.height) * 2 + 1);
|
|
105
|
+
state.raycaster.setFromCamera(state.pointer, state.camera);
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
return () => {
|
|
109
|
+
parent.removeChild(el);
|
|
110
|
+
this.store.snapshot.setEvents({ compute: oldCompute });
|
|
111
|
+
events.connect?.(oldTarget);
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
autoEffect(() => {
|
|
115
|
+
const [el, events, size, infinite, invalidate, horizontal, enabled] = [
|
|
116
|
+
this.el,
|
|
117
|
+
this.events(),
|
|
118
|
+
this.size(),
|
|
119
|
+
this.infinite(),
|
|
120
|
+
this.invalidate(),
|
|
121
|
+
this.horizontal(),
|
|
122
|
+
this.enabled(),
|
|
123
|
+
];
|
|
124
|
+
if (events.connected !== el)
|
|
125
|
+
return;
|
|
126
|
+
const containerLength = size[horizontal ? 'width' : 'height'];
|
|
127
|
+
const scrollLength = el[horizontal ? 'scrollWidth' : 'scrollHeight'];
|
|
128
|
+
const scrollThreshold = scrollLength - containerLength;
|
|
129
|
+
let current = 0;
|
|
130
|
+
let disableScroll = true;
|
|
131
|
+
let firstRun = true;
|
|
132
|
+
const onScroll = () => {
|
|
133
|
+
// Prevent first scroll because it is indirectly caused by the one pixel offset
|
|
134
|
+
if (!enabled || firstRun)
|
|
135
|
+
return;
|
|
136
|
+
invalidate();
|
|
137
|
+
current = el[horizontal ? 'scrollLeft' : 'scrollTop'];
|
|
138
|
+
this.scroll = current / scrollThreshold;
|
|
139
|
+
if (infinite) {
|
|
140
|
+
if (!disableScroll) {
|
|
141
|
+
if (current >= scrollThreshold) {
|
|
142
|
+
const damp = 1 - this.offset;
|
|
143
|
+
el[horizontal ? 'scrollLeft' : 'scrollTop'] = 1;
|
|
144
|
+
this.scroll = this.offset = -damp;
|
|
145
|
+
disableScroll = true;
|
|
146
|
+
}
|
|
147
|
+
else if (current <= 0) {
|
|
148
|
+
const damp = 1 + this.offset;
|
|
149
|
+
el[horizontal ? 'scrollLeft' : 'scrollTop'] = scrollLength;
|
|
150
|
+
this.scroll = this.offset = damp;
|
|
151
|
+
disableScroll = true;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (disableScroll)
|
|
155
|
+
setTimeout(() => (disableScroll = false), 40);
|
|
156
|
+
}
|
|
157
|
+
untracked(() => {
|
|
158
|
+
this.progress.set(this.scroll);
|
|
159
|
+
});
|
|
160
|
+
};
|
|
161
|
+
el.addEventListener('scroll', onScroll, { passive: true });
|
|
162
|
+
requestAnimationFrame(() => (firstRun = false));
|
|
163
|
+
const onWheel = (e) => (el[horizontal ? 'scrollLeft' : 'scrollTop'] += e.deltaY / 2);
|
|
164
|
+
if (horizontal)
|
|
165
|
+
el.addEventListener('wheel', onWheel, { passive: true });
|
|
166
|
+
return () => {
|
|
167
|
+
el.removeEventListener('scroll', onScroll);
|
|
168
|
+
if (horizontal)
|
|
169
|
+
el.removeEventListener('wheel', onWheel);
|
|
170
|
+
};
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
let last = 0;
|
|
174
|
+
injectBeforeRender(({ delta }) => {
|
|
175
|
+
last = this.offset;
|
|
176
|
+
easing.damp(this, 'offset', this.scroll, this.damping(), delta, this.maxSpeed(), undefined, this.eps());
|
|
177
|
+
easing.damp(this, 'delta', Math.abs(last - this.offset), this.damping(), delta, this.maxSpeed(), undefined, this.eps());
|
|
178
|
+
if (this.delta > this.eps())
|
|
179
|
+
this.invalidate()();
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
get el() {
|
|
183
|
+
return this._el;
|
|
184
|
+
}
|
|
185
|
+
get fill() {
|
|
186
|
+
return this._fill;
|
|
187
|
+
}
|
|
188
|
+
get fixed() {
|
|
189
|
+
return this._fixed;
|
|
190
|
+
}
|
|
191
|
+
range(from, distance, margin = 0) {
|
|
192
|
+
const start = from - margin;
|
|
193
|
+
const end = start + distance + margin * 2;
|
|
194
|
+
return this.offset < start ? 0 : this.offset > end ? 1 : (this.offset - start) / (end - start);
|
|
195
|
+
}
|
|
196
|
+
curve(from, distance, margin = 0) {
|
|
197
|
+
return Math.sin(this.range(from, distance, margin) * Math.PI);
|
|
198
|
+
}
|
|
199
|
+
visible(from, distance, margin = 0) {
|
|
200
|
+
const start = from - margin;
|
|
201
|
+
const end = start + distance + margin * 2;
|
|
202
|
+
return this.offset >= start && this.offset <= end;
|
|
203
|
+
}
|
|
204
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsScrollControls, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
205
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.1.0", type: NgtsScrollControls, isStandalone: true, selector: "ngts-scroll-controls", inputs: { progress: { classPropertyName: "progress", publicName: "progress", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { progress: "progressChange" }, ngImport: i0, template: `
|
|
206
|
+
<ng-content />
|
|
207
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
208
|
+
}
|
|
209
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsScrollControls, decorators: [{
|
|
210
|
+
type: Component,
|
|
211
|
+
args: [{
|
|
212
|
+
selector: 'ngts-scroll-controls',
|
|
213
|
+
standalone: true,
|
|
214
|
+
template: `
|
|
215
|
+
<ng-content />
|
|
216
|
+
`,
|
|
217
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
218
|
+
}]
|
|
219
|
+
}], ctorParameters: () => [] });
|
|
220
|
+
export class NgtsScrollCanvas {
|
|
221
|
+
constructor() {
|
|
222
|
+
this.host = inject(ElementRef);
|
|
223
|
+
this.scrollControls = inject(NgtsScrollControls);
|
|
224
|
+
this.store = injectStore();
|
|
225
|
+
this.viewport = this.store.select('viewport');
|
|
226
|
+
injectBeforeRender(() => {
|
|
227
|
+
const group = this.host.nativeElement;
|
|
228
|
+
group.position.x = this.scrollControls.horizontal()
|
|
229
|
+
? -this.viewport().width * (this.scrollControls.pages() - 1) * this.scrollControls.offset
|
|
230
|
+
: 0;
|
|
231
|
+
group.position.y = this.scrollControls.horizontal()
|
|
232
|
+
? 0
|
|
233
|
+
: this.viewport().height * (this.scrollControls.pages() - 1) * this.scrollControls.offset;
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsScrollCanvas, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
237
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.1.0", type: NgtsScrollCanvas, isStandalone: true, selector: "ngt-group[ngts-scroll-canvas]", ngImport: i0 }); }
|
|
238
|
+
}
|
|
239
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsScrollCanvas, decorators: [{
|
|
240
|
+
type: Directive,
|
|
241
|
+
args: [{ selector: 'ngt-group[ngts-scroll-canvas]', standalone: true }]
|
|
242
|
+
}], ctorParameters: () => [] });
|
|
243
|
+
export class NgtsScrollHtml extends NgtHTML {
|
|
244
|
+
constructor() {
|
|
245
|
+
super();
|
|
246
|
+
this.scrollControls = inject(NgtsScrollControls);
|
|
247
|
+
this.size = this.store.select('size');
|
|
248
|
+
injectBeforeRender(() => {
|
|
249
|
+
if (this.scrollControls.delta > this.scrollControls.eps()) {
|
|
250
|
+
this.host.nativeElement.style.transform = `translate3d(${this.scrollControls.horizontal()
|
|
251
|
+
? -this.size().width * (this.scrollControls.pages() - 1) * this.scrollControls.offset
|
|
252
|
+
: 0}px,${this.scrollControls.horizontal() ? 0 : this.size().height * (this.scrollControls.pages() - 1) * -this.scrollControls.offset}px,0)`;
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsScrollHtml, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
257
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.1.0", type: NgtsScrollHtml, isStandalone: true, selector: "div[ngts-scroll-html]", host: { styleAttribute: "position: absolute; top: 0; left: 0; will-change: transform;" }, providers: [provideHTMLDomElement([NgtsScrollControls], (scrollControls) => scrollControls.fixed)], usesInheritance: true, ngImport: i0 }); }
|
|
258
|
+
}
|
|
259
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsScrollHtml, decorators: [{
|
|
260
|
+
type: Directive,
|
|
261
|
+
args: [{
|
|
262
|
+
selector: 'div[ngts-scroll-html]',
|
|
263
|
+
standalone: true,
|
|
264
|
+
host: { style: 'position: absolute; top: 0; left: 0; will-change: transform;' },
|
|
265
|
+
providers: [provideHTMLDomElement([NgtsScrollControls], (scrollControls) => scrollControls.fixed)],
|
|
266
|
+
}]
|
|
267
|
+
}], ctorParameters: () => [] });
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLWNvbnRyb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL2NvbnRyb2xzL3NyYy9saWIvc2Nyb2xsLWNvbnRyb2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ04sZUFBZSxFQUNmLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFDTCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDOztBQTJCdkQsTUFBTSxjQUFjLEdBQThCO0lBQ2pELEdBQUcsRUFBRSxPQUFPO0lBQ1osVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLEtBQUs7SUFDZixLQUFLLEVBQUUsQ0FBQztJQUNSLFFBQVEsRUFBRSxDQUFDO0lBQ1gsT0FBTyxFQUFFLElBQUk7SUFDYixRQUFRLEVBQUUsUUFBUTtJQUNsQixPQUFPLEVBQUUsS0FBSztJQUNkLE9BQU8sRUFBRSxJQUFJO0lBQ2IsS0FBSyxFQUFFLEVBQUU7Q0FDVCxDQUFDO0FBVUYsTUFBTSxPQUFPLGtCQUFrQjtJQWdDOUI7UUEvQkEsYUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixZQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxXQUFX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Q0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sT0FBTyxDQUFDO1lBQzFJLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7OEdBZlcsY0FBYztrR0FBZCxjQUFjLDhKQUZmLENBQUMscUJBQXFCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7OzJGQUV0RixjQUFjO2tCQU4xQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsOERBQThELEVBQUU7b0JBQy9FLFNBQVMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNsRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0RGlyZWN0aXZlLFxuXHRFbGVtZW50UmVmLFxuXHRpbmplY3QsXG5cdGlucHV0LFxuXHRtb2RlbCxcblx0dW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGluamVjdEJlZm9yZVJlbmRlciwgaW5qZWN0U3RvcmUsIE5ndEhUTUwsIHBpY2ssIHByb3ZpZGVIVE1MRG9tRWxlbWVudCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgZWFzaW5nIH0gZnJvbSAnbWFhdGgnO1xuaW1wb3J0IHsgaW5qZWN0QXV0b0VmZmVjdCB9IGZyb20gJ25neHRlbnNpb24vYXV0by1lZmZlY3QnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c1Njcm9sbENvbnRyb2xzT3B0aW9ucyB7XG5cdC8qKiBQcmVjaXNpb24sIGRlZmF1bHQgMC4wMDAwMSAqL1xuXHRlcHM6IG51bWJlcjtcblx0LyoqIEhvcml6b250YWwgc2Nyb2xsLCBkZWZhdWx0IGZhbHNlICh2ZXJ0aWNhbCkgKi9cblx0aG9yaXpvbnRhbDogYm9vbGVhbjtcblx0LyoqIEluZmluaXRlIHNjcm9sbCwgZGVmYXVsdCBmYWxzZSAoZXhwZXJpbWVudGFsISkgKi9cblx0aW5maW5pdGU6IGJvb2xlYW47XG5cdC8qKiBEZWZpbmVzIHRoZSBsZW5naHQgb2YgdGhlIHNjcm9sbCBhcmVhLCBlYWNoIHBhZ2UgaXMgaGVpZ2h0OjEwMCUsIGRlZmF1bHQgMSAqL1xuXHRwYWdlczogbnVtYmVyO1xuXHQvKiogQSBmYWN0b3IgdGhhdCBpbmNyZWFzZXMgc2Nyb2xsIGJhciB0cmF2ZWwsZGVmYXVsdDogMSAqL1xuXHRkaXN0YW5jZTogbnVtYmVyO1xuXHQvKiogRnJpY3Rpb24gaW4gc2Vjb25kcywgZGVmYXVsdDogMC4yNSAoMS80IHNlY29uZCkgKi9cblx0ZGFtcGluZzogbnVtYmVyO1xuXHQvKiogbWF4U3BlZWQgb3B0aW9uYWxseSBhbGxvd3MgeW91IHRvIGNsYW1wIHRoZSBtYXhpbXVtIHNwZWVkLiBJZiBkYW1waW5nIGlzIDAuMnMgYW5kIGxvb2tzIE9LXG5cdCAqICBnb2luZyBiZXR3ZWVuLCBzYXksIHBhZ2UgMSBhbmQgMiwgYnV0IG5vdCBmb3IgcGFnZXMgZmFyIGFwYXJ0IGFzIGl0J2xsIG1vdmUgdmVyeSByYXBpZCxcblx0ICogIHRoZW4gYSBtYXhTcGVlZCBvZiBlLmcuIDMgd2hpY2ggd2lsbCBjbGFtcCB0aGUgc3BlZWQgdG8gMyB1bml0cyBwZXIgc2Vjb25kLCBpdCBtYXkgbm93XG5cdCAqICB0YWtlIG11Y2ggbG9uZ2VyIHRoYW4gZGFtcGluZyB0byByZWFjaCB0aGUgdGFyZ2V0IGlmIGl0IGlzIGZhciBhd2F5LiBEZWZhdWx0OiBJbmZpbml0eSAqL1xuXHRtYXhTcGVlZDogbnVtYmVyO1xuXHQvKiogSWYgdHJ1ZSBhdHRhY2hlcyB0aGUgc2Nyb2xsIGNvbnRhaW5lciBiZWZvcmUgdGhlIGNhbnZhcyAqL1xuXHRwcmVwZW5kOiBib29sZWFuO1xuXHRlbmFibGVkOiBib29sZWFuO1xuXHRzdHlsZTogUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPjtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE5ndHNTY3JvbGxDb250cm9sc09wdGlvbnMgPSB7XG5cdGVwczogMC4wMDAwMSxcblx0aG9yaXpvbnRhbDogZmFsc2UsXG5cdGluZmluaXRlOiBmYWxzZSxcblx0cGFnZXM6IDEsXG5cdGRpc3RhbmNlOiAxLFxuXHRkYW1waW5nOiAwLjI1LFxuXHRtYXhTcGVlZDogSW5maW5pdHksXG5cdHByZXBlbmQ6IGZhbHNlLFxuXHRlbmFibGVkOiB0cnVlLFxuXHRzdHlsZToge30sXG59O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RzLXNjcm9sbC1jb250cm9scycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5nLWNvbnRlbnQgLz5cblx0YCxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNTY3JvbGxDb250cm9scyB7XG5cdHByb2dyZXNzID0gbW9kZWwoMCk7XG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblxuXHRwcml2YXRlIGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cdHByaXZhdGUgZ2wgPSB0aGlzLnN0b3JlLnNlbGVjdCgnZ2wnKTtcblx0cHJpdmF0ZSBldmVudHMgPSB0aGlzLnN0b3JlLnNlbGVjdCgnZXZlbnRzJyk7XG5cdHByaXZhdGUgaW52YWxpZGF0ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdpbnZhbGlkYXRlJyk7XG5cdHByaXZhdGUgc2l6ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdzaXplJyk7XG5cblx0cHJpdmF0ZSBkb21FbGVtZW50ID0gcGljayh0aGlzLmdsLCAnZG9tRWxlbWVudCcpO1xuXHRwcml2YXRlIHRhcmdldCA9IHBpY2sodGhpcy5kb21FbGVtZW50LCAncGFyZW50Tm9kZScpO1xuXG5cdHByaXZhdGUgX2VsID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0cHJpdmF0ZSBfZmlsbCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdHByaXZhdGUgX2ZpeGVkID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuXHRwcml2YXRlIHN0eWxlID0gcGljayh0aGlzLm9wdGlvbnMsICdzdHlsZScpO1xuXHRwcml2YXRlIHByZXBlbmQgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3ByZXBlbmQnKTtcblx0cHJpdmF0ZSBlbmFibGVkID0gcGljayh0aGlzLm9wdGlvbnMsICdlbmFibGVkJyk7XG5cdHByaXZhdGUgaW5maW5pdGUgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2luZmluaXRlJyk7XG5cdHByaXZhdGUgbWF4U3BlZWQgPSBwaWNrKHRoaXMub3B0aW9ucywgJ21heFNwZWVkJyk7XG5cdGVwcyA9IHBpY2sodGhpcy5vcHRpb25zLCAnZXBzJyk7XG5cdGhvcml6b250YWwgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2hvcml6b250YWwnKTtcblx0cGFnZXMgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3BhZ2VzJyk7XG5cdGRpc3RhbmNlID0gcGljayh0aGlzLm9wdGlvbnMsICdkaXN0YW5jZScpO1xuXHRkYW1waW5nID0gcGljayh0aGlzLm9wdGlvbnMsICdkYW1waW5nJyk7XG5cdHNjcm9sbCA9IDA7XG5cdG9mZnNldCA9IDA7XG5cdGRlbHRhID0gMDtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRjb25zdCBhdXRvRWZmZWN0ID0gaW5qZWN0QXV0b0VmZmVjdCgpO1xuXG5cdFx0YWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcblx0XHRcdGF1dG9FZmZlY3QoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB0YXJnZXQgPSB0aGlzLnRhcmdldCgpO1xuXHRcdFx0XHRpZiAoIXRhcmdldCkgcmV0dXJuO1xuXG5cdFx0XHRcdGNvbnN0IHBhcmVudCA9IHRhcmdldCBhcyBIVE1MRWxlbWVudDtcblx0XHRcdFx0Y29uc3QgW3BhZ2VzLCBkaXN0YW5jZSwgaG9yaXpvbnRhbCwgZWwsIGZpbGwsIGZpeGVkLCBzdHlsZSwgcHJlcGVuZCwgZG9tRWxlbWVudCwgZXZlbnRzXSA9IFtcblx0XHRcdFx0XHR0aGlzLnBhZ2VzKCksXG5cdFx0XHRcdFx0dGhpcy5kaXN0YW5jZSgpLFxuXHRcdFx0XHRcdHRoaXMuaG9yaXpvbnRhbCgpLFxuXHRcdFx0XHRcdHRoaXMuZWwsXG5cdFx0XHRcdFx0dGhpcy5maWxsLFxuXHRcdFx0XHRcdHRoaXMuZml4ZWQsXG5cdFx0XHRcdFx0dW50cmFja2VkKHRoaXMuc3R5bGUpLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLnByZXBlbmQpLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLmRvbUVsZW1lbnQpLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLmV2ZW50cyksXG5cdFx0XHRcdF07XG5cblx0XHRcdFx0ZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdFx0XHRlbC5zdHlsZS53aWR0aCA9ICcxMDAlJztcblx0XHRcdFx0ZWwuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuXHRcdFx0XHRlbC5zdHlsZVtob3Jpem9udGFsID8gJ292ZXJmbG93WCcgOiAnb3ZlcmZsb3dZJ10gPSAnYXV0byc7XG5cdFx0XHRcdGVsLnN0eWxlW2hvcml6b250YWwgPyAnb3ZlcmZsb3dZJyA6ICdvdmVyZmxvd1gnXSA9ICdoaWRkZW4nO1xuXHRcdFx0XHRlbC5zdHlsZS50b3AgPSAnMHB4Jztcblx0XHRcdFx0ZWwuc3R5bGUubGVmdCA9ICcwcHgnO1xuXG5cdFx0XHRcdGZvciAoY29uc3Qga2V5IGluIHN0eWxlKSB7XG5cdFx0XHRcdFx0ZWwuc3R5bGVba2V5XSA9IChzdHlsZSBhcyBDU1NTdHlsZURlY2xhcmF0aW9uKVtrZXldO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zml4ZWQuc3R5bGUucG9zaXRpb24gPSAnc3RpY2t5Jztcblx0XHRcdFx0Zml4ZWQuc3R5bGUudG9wID0gJzBweCc7XG5cdFx0XHRcdGZpeGVkLnN0eWxlLmxlZnQgPSAnMHB4Jztcblx0XHRcdFx0Zml4ZWQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG5cdFx0XHRcdGZpeGVkLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcblx0XHRcdFx0Zml4ZWQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcblx0XHRcdFx0ZWwuYXBwZW5kQ2hpbGQoZml4ZWQpO1xuXG5cdFx0XHRcdGZpbGwuc3R5bGUuaGVpZ2h0ID0gaG9yaXpvbnRhbCA/ICcxMDAlJyA6IGAke3BhZ2VzICogZGlzdGFuY2UgKiAxMDB9JWA7XG5cdFx0XHRcdGZpbGwuc3R5bGUud2lkdGggPSBob3Jpem9udGFsID8gYCR7cGFnZXMgKiBkaXN0YW5jZSAqIDEwMH0lYCA6ICcxMDAlJztcblx0XHRcdFx0ZmlsbC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuXHRcdFx0XHRlbC5hcHBlbmRDaGlsZChmaWxsKTtcblxuXHRcdFx0XHRpZiAocHJlcGVuZCkgcGFyZW50LnByZXBlbmQoZWwpO1xuXHRcdFx0XHRlbHNlIHBhcmVudC5hcHBlbmRDaGlsZChlbCk7XG5cblx0XHRcdFx0Ly8gSW5pdCBzY3JvbGwgb25lIHBpeGVsIGluIHRvIGFsbG93IHVwd2FyZC9sZWZ0d2FyZCBzY3JvbGxcblx0XHRcdFx0ZWxbaG9yaXpvbnRhbCA/ICdzY3JvbGxMZWZ0JyA6ICdzY3JvbGxUb3AnXSA9IDE7XG5cblx0XHRcdFx0Y29uc3Qgb2xkVGFyZ2V0ID0gKGV2ZW50cy5jb25uZWN0ZWQgfHwgZG9tRWxlbWVudCkgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBldmVudHMuY29ubmVjdD8uKGVsKSk7XG5cdFx0XHRcdGNvbnN0IG9sZENvbXB1dGUgPSBldmVudHMuY29tcHV0ZT8uYmluZChldmVudHMpO1xuXG5cdFx0XHRcdHRoaXMuc3RvcmUuc25hcHNob3Quc2V0RXZlbnRzKHtcblx0XHRcdFx0XHRjb21wdXRlKGV2ZW50LCBzdG9yZSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc3RhdGUgPSBzdG9yZS5zbmFwc2hvdDtcblx0XHRcdFx0XHRcdC8vIHdlIGFyZSB1c2luZyBib3VuZGluZ0NsaWVudFJlY3QgYmVjYXVzZSB3ZSBjb3VsZCBub3QgcmVseSBvbiB0YXJnZXQub2Zmc2V0VG9wIGFzIGNhbnZhcyBjb3VsZCBiZSBwb3NpdGlvbmVkIGFueXdoZXJlIGluIGRvbVxuXHRcdFx0XHRcdFx0Y29uc3QgeyBsZWZ0LCB0b3AgfSA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdFx0XHRcdGNvbnN0IG9mZnNldFggPSBldmVudC5jbGllbnRYIC0gbGVmdDtcblx0XHRcdFx0XHRcdGNvbnN0IG9mZnNldFkgPSBldmVudC5jbGllbnRZIC0gdG9wO1xuXHRcdFx0XHRcdFx0c3RhdGUucG9pbnRlci5zZXQoKG9mZnNldFggLyBzdGF0ZS5zaXplLndpZHRoKSAqIDIgLSAxLCAtKG9mZnNldFkgLyBzdGF0ZS5zaXplLmhlaWdodCkgKiAyICsgMSk7XG5cdFx0XHRcdFx0XHRzdGF0ZS5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYShzdGF0ZS5wb2ludGVyLCBzdGF0ZS5jYW1lcmEpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdFx0cGFyZW50LnJlbW92ZUNoaWxkKGVsKTtcblx0XHRcdFx0XHR0aGlzLnN0b3JlLnNuYXBzaG90LnNldEV2ZW50cyh7IGNvbXB1dGU6IG9sZENvbXB1dGUgfSk7XG5cdFx0XHRcdFx0ZXZlbnRzLmNvbm5lY3Q/LihvbGRUYXJnZXQpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cblx0XHRcdGF1dG9FZmZlY3QoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBbZWwsIGV2ZW50cywgc2l6ZSwgaW5maW5pdGUsIGludmFsaWRhdGUsIGhvcml6b250YWwsIGVuYWJsZWRdID0gW1xuXHRcdFx0XHRcdHRoaXMuZWwsXG5cdFx0XHRcdFx0dGhpcy5ldmVudHMoKSxcblx0XHRcdFx0XHR0aGlzLnNpemUoKSxcblx0XHRcdFx0XHR0aGlzLmluZmluaXRlKCksXG5cdFx0XHRcdFx0dGhpcy5pbnZhbGlkYXRlKCksXG5cdFx0XHRcdFx0dGhpcy5ob3Jpem9udGFsKCksXG5cdFx0XHRcdFx0dGhpcy5lbmFibGVkKCksXG5cdFx0XHRcdF07XG5cblx0XHRcdFx0aWYgKGV2ZW50cy5jb25uZWN0ZWQgIT09IGVsKSByZXR1cm47XG5cblx0XHRcdFx0Y29uc3QgY29udGFpbmVyTGVuZ3RoID0gc2l6ZVtob3Jpem9udGFsID8gJ3dpZHRoJyA6ICdoZWlnaHQnXTtcblx0XHRcdFx0Y29uc3Qgc2Nyb2xsTGVuZ3RoID0gZWxbaG9yaXpvbnRhbCA/ICdzY3JvbGxXaWR0aCcgOiAnc2Nyb2xsSGVpZ2h0J107XG5cdFx0XHRcdGNvbnN0IHNjcm9sbFRocmVzaG9sZCA9IHNjcm9sbExlbmd0aCAtIGNvbnRhaW5lckxlbmd0aDtcblxuXHRcdFx0XHRsZXQgY3VycmVudCA9IDA7XG5cdFx0XHRcdGxldCBkaXNhYmxlU2Nyb2xsID0gdHJ1ZTtcblx0XHRcdFx0bGV0IGZpcnN0UnVuID0gdHJ1ZTtcblxuXHRcdFx0XHRjb25zdCBvblNjcm9sbCA9ICgpID0+IHtcblx0XHRcdFx0XHQvLyBQcmV2ZW50IGZpcnN0IHNjcm9sbCBiZWNhdXNlIGl0IGlzIGluZGlyZWN0bHkgY2F1c2VkIGJ5IHRoZSBvbmUgcGl4ZWwgb2Zmc2V0XG5cdFx0XHRcdFx0aWYgKCFlbmFibGVkIHx8IGZpcnN0UnVuKSByZXR1cm47XG5cdFx0XHRcdFx0aW52YWxpZGF0ZSgpO1xuXHRcdFx0XHRcdGN1cnJlbnQgPSBlbFtob3Jpem9udGFsID8gJ3Njcm9sbExlZnQnIDogJ3Njcm9sbFRvcCddO1xuXHRcdFx0XHRcdHRoaXMuc2Nyb2xsID0gY3VycmVudCAvIHNjcm9sbFRocmVzaG9sZDtcblxuXHRcdFx0XHRcdGlmIChpbmZpbml0ZSkge1xuXHRcdFx0XHRcdFx0aWYgKCFkaXNhYmxlU2Nyb2xsKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChjdXJyZW50ID49IHNjcm9sbFRocmVzaG9sZCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGRhbXAgPSAxIC0gdGhpcy5vZmZzZXQ7XG5cdFx0XHRcdFx0XHRcdFx0ZWxbaG9yaXpvbnRhbCA/ICdzY3JvbGxMZWZ0JyA6ICdzY3JvbGxUb3AnXSA9IDE7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zY3JvbGwgPSB0aGlzLm9mZnNldCA9IC1kYW1wO1xuXHRcdFx0XHRcdFx0XHRcdGRpc2FibGVTY3JvbGwgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGN1cnJlbnQgPD0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGRhbXAgPSAxICsgdGhpcy5vZmZzZXQ7XG5cdFx0XHRcdFx0XHRcdFx0ZWxbaG9yaXpvbnRhbCA/ICdzY3JvbGxMZWZ0JyA6ICdzY3JvbGxUb3AnXSA9IHNjcm9sbExlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnNjcm9sbCA9IHRoaXMub2Zmc2V0ID0gZGFtcDtcblx0XHRcdFx0XHRcdFx0XHRkaXNhYmxlU2Nyb2xsID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGRpc2FibGVTY3JvbGwpIHNldFRpbWVvdXQoKCkgPT4gKGRpc2FibGVTY3JvbGwgPSBmYWxzZSksIDQwKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR1bnRyYWNrZWQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wcm9ncmVzcy5zZXQodGhpcy5zY3JvbGwpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsLCB7IHBhc3NpdmU6IHRydWUgfSk7XG5cdFx0XHRcdHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiAoZmlyc3RSdW4gPSBmYWxzZSkpO1xuXG5cdFx0XHRcdGNvbnN0IG9uV2hlZWwgPSAoZTogV2hlZWxFdmVudCkgPT4gKGVsW2hvcml6b250YWwgPyAnc2Nyb2xsTGVmdCcgOiAnc2Nyb2xsVG9wJ10gKz0gZS5kZWx0YVkgLyAyKTtcblx0XHRcdFx0aWYgKGhvcml6b250YWwpIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25XaGVlbCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG5cdFx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdFx0ZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25TY3JvbGwpO1xuXHRcdFx0XHRcdGlmIChob3Jpem9udGFsKSBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uV2hlZWwpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRsZXQgbGFzdCA9IDA7XG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCh7IGRlbHRhIH0pID0+IHtcblx0XHRcdGxhc3QgPSB0aGlzLm9mZnNldDtcblx0XHRcdGVhc2luZy5kYW1wKHRoaXMsICdvZmZzZXQnLCB0aGlzLnNjcm9sbCwgdGhpcy5kYW1waW5nKCksIGRlbHRhLCB0aGlzLm1heFNwZWVkKCksIHVuZGVmaW5lZCwgdGhpcy5lcHMoKSk7XG5cdFx0XHRlYXNpbmcuZGFtcChcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0J2RlbHRhJyxcblx0XHRcdFx0TWF0aC5hYnMobGFzdCAtIHRoaXMub2Zmc2V0KSxcblx0XHRcdFx0dGhpcy5kYW1waW5nKCksXG5cdFx0XHRcdGRlbHRhLFxuXHRcdFx0XHR0aGlzLm1heFNwZWVkKCksXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0dGhpcy5lcHMoKSxcblx0XHRcdCk7XG5cdFx0XHRpZiAodGhpcy5kZWx0YSA+IHRoaXMuZXBzKCkpIHRoaXMuaW52YWxpZGF0ZSgpKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRnZXQgZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2VsO1xuXHR9XG5cblx0Z2V0IGZpbGwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2ZpbGw7XG5cdH1cblxuXHRnZXQgZml4ZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2ZpeGVkO1xuXHR9XG5cblx0cmFuZ2UoZnJvbTogbnVtYmVyLCBkaXN0YW5jZTogbnVtYmVyLCBtYXJnaW46IG51bWJlciA9IDApOiBudW1iZXIge1xuXHRcdGNvbnN0IHN0YXJ0ID0gZnJvbSAtIG1hcmdpbjtcblx0XHRjb25zdCBlbmQgPSBzdGFydCArIGRpc3RhbmNlICsgbWFyZ2luICogMjtcblx0XHRyZXR1cm4gdGhpcy5vZmZzZXQgPCBzdGFydCA/IDAgOiB0aGlzLm9mZnNldCA+IGVuZCA/IDEgOiAodGhpcy5vZmZzZXQgLSBzdGFydCkgLyAoZW5kIC0gc3RhcnQpO1xuXHR9XG5cblx0Y3VydmUoZnJvbTogbnVtYmVyLCBkaXN0YW5jZTogbnVtYmVyLCBtYXJnaW46IG51bWJlciA9IDApOiBudW1iZXIge1xuXHRcdHJldHVybiBNYXRoLnNpbih0aGlzLnJhbmdlKGZyb20sIGRpc3RhbmNlLCBtYXJnaW4pICogTWF0aC5QSSk7XG5cdH1cblxuXHR2aXNpYmxlKGZyb206IG51bWJlciwgZGlzdGFuY2U6IG51bWJlciwgbWFyZ2luOiBudW1iZXIgPSAwKTogYm9vbGVhbiB7XG5cdFx0Y29uc3Qgc3RhcnQgPSBmcm9tIC0gbWFyZ2luO1xuXHRcdGNvbnN0IGVuZCA9IHN0YXJ0ICsgZGlzdGFuY2UgKyBtYXJnaW4gKiAyO1xuXHRcdHJldHVybiB0aGlzLm9mZnNldCA+PSBzdGFydCAmJiB0aGlzLm9mZnNldCA8PSBlbmQ7XG5cdH1cbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnbmd0LWdyb3VwW25ndHMtc2Nyb2xsLWNhbnZhc10nLCBzdGFuZGFsb25lOiB0cnVlIH0pXG5leHBvcnQgY2xhc3MgTmd0c1Njcm9sbENhbnZhcyB7XG5cdHByaXZhdGUgaG9zdCA9IGluamVjdDxFbGVtZW50UmVmPEdyb3VwPj4oRWxlbWVudFJlZik7XG5cdHByaXZhdGUgc2Nyb2xsQ29udHJvbHMgPSBpbmplY3QoTmd0c1Njcm9sbENvbnRyb2xzKTtcblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cdHByaXZhdGUgdmlld3BvcnQgPSB0aGlzLnN0b3JlLnNlbGVjdCgndmlld3BvcnQnKTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRpbmplY3RCZWZvcmVSZW5kZXIoKCkgPT4ge1xuXHRcdFx0Y29uc3QgZ3JvdXAgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudDtcblxuXHRcdFx0Z3JvdXAucG9zaXRpb24ueCA9IHRoaXMuc2Nyb2xsQ29udHJvbHMuaG9yaXpvbnRhbCgpXG5cdFx0XHRcdD8gLXRoaXMudmlld3BvcnQoKS53aWR0aCAqICh0aGlzLnNjcm9sbENvbnRyb2xzLnBhZ2VzKCkgLSAxKSAqIHRoaXMuc2Nyb2xsQ29udHJvbHMub2Zmc2V0XG5cdFx0XHRcdDogMDtcblx0XHRcdGdyb3VwLnBvc2l0aW9uLnkgPSB0aGlzLnNjcm9sbENvbnRyb2xzLmhvcml6b250YWwoKVxuXHRcdFx0XHQ/IDBcblx0XHRcdFx0OiB0aGlzLnZpZXdwb3J0KCkuaGVpZ2h0ICogKHRoaXMuc2Nyb2xsQ29udHJvbHMucGFnZXMoKSAtIDEpICogdGhpcy5zY3JvbGxDb250cm9scy5vZmZzZXQ7XG5cdFx0fSk7XG5cdH1cbn1cblxuQERpcmVjdGl2ZSh7XG5cdHNlbGVjdG9yOiAnZGl2W25ndHMtc2Nyb2xsLWh0bWxdJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0aG9zdDogeyBzdHlsZTogJ3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOycgfSxcblx0cHJvdmlkZXJzOiBbcHJvdmlkZUhUTUxEb21FbGVtZW50KFtOZ3RzU2Nyb2xsQ29udHJvbHNdLCAoc2Nyb2xsQ29udHJvbHMpID0+IHNjcm9sbENvbnRyb2xzLmZpeGVkKV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNTY3JvbGxIdG1sIGV4dGVuZHMgTmd0SFRNTCB7XG5cdHByaXZhdGUgc2Nyb2xsQ29udHJvbHMgPSBpbmplY3QoTmd0c1Njcm9sbENvbnRyb2xzKTtcblx0cHJpdmF0ZSBzaXplID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3NpemUnKTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5zY3JvbGxDb250cm9scy5kZWx0YSA+IHRoaXMuc2Nyb2xsQ29udHJvbHMuZXBzKCkpIHtcblx0XHRcdFx0dGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKCR7XG5cdFx0XHRcdFx0dGhpcy5zY3JvbGxDb250cm9scy5ob3Jpem9udGFsKClcblx0XHRcdFx0XHRcdD8gLXRoaXMuc2l6ZSgpLndpZHRoICogKHRoaXMuc2Nyb2xsQ29udHJvbHMucGFnZXMoKSAtIDEpICogdGhpcy5zY3JvbGxDb250cm9scy5vZmZzZXRcblx0XHRcdFx0XHRcdDogMFxuXHRcdFx0XHR9cHgsJHt0aGlzLnNjcm9sbENvbnRyb2xzLmhvcml6b250YWwoKSA/IDAgOiB0aGlzLnNpemUoKS5oZWlnaHQgKiAodGhpcy5zY3JvbGxDb250cm9scy5wYWdlcygpIC0gMSkgKiAtdGhpcy5zY3JvbGxDb250cm9scy5vZmZzZXR9cHgsMClgO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG4iXX0=
|