angular-three 2.0.0-beta.31 → 2.0.0-beta.310
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/README.md +221 -4
- package/esm2022/index.mjs +13 -13
- package/esm2022/lib/canvas.mjs +128 -200
- package/esm2022/lib/directives/args.mjs +46 -20
- package/esm2022/lib/directives/selection.mjs +65 -0
- package/esm2022/lib/dom/events.mjs +2 -2
- package/esm2022/lib/events.mjs +33 -31
- package/esm2022/lib/html.mjs +40 -0
- package/esm2022/lib/instance.mjs +43 -36
- package/esm2022/lib/loader.mjs +62 -31
- package/esm2022/lib/loop.mjs +28 -25
- package/esm2022/lib/pipes/hexify.mjs +67 -0
- package/esm2022/lib/portal.mjs +173 -193
- package/esm2022/lib/renderer/catalogue.mjs +2 -2
- package/esm2022/lib/renderer/constants.mjs +5 -6
- package/esm2022/lib/renderer/index.mjs +387 -234
- package/esm2022/lib/renderer/state.mjs +49 -0
- package/esm2022/lib/renderer/utils.mjs +107 -95
- package/esm2022/lib/roots.mjs +85 -61
- package/esm2022/lib/routed-scene.mjs +6 -7
- package/esm2022/lib/store.mjs +170 -194
- package/esm2022/lib/three-types.mjs +2 -2
- package/esm2022/lib/types.mjs +1 -1
- package/esm2022/lib/utils/apply-props.mjs +24 -28
- package/esm2022/lib/utils/attach.mjs +12 -9
- package/esm2022/lib/utils/before-render.mjs +12 -0
- package/esm2022/lib/utils/is.mjs +6 -5
- package/esm2022/lib/utils/make.mjs +19 -17
- package/esm2022/lib/utils/non-nullish.mjs +7 -0
- package/esm2022/lib/utils/object-events.mjs +92 -0
- package/esm2022/lib/utils/parameters.mjs +70 -0
- package/esm2022/lib/utils/resolve-ref.mjs +8 -0
- package/esm2022/lib/utils/signal-store.mjs +52 -58
- package/esm2022/lib/utils/update.mjs +8 -4
- package/esm2022/testing/angular-three-testing.mjs +5 -0
- package/esm2022/testing/index.mjs +3 -0
- package/esm2022/testing/lib/test-bed.mjs +130 -0
- package/esm2022/testing/lib/test-canvas.mjs +45 -0
- package/esm2022/testing/lib/utils/mock-canvas.mjs +37 -0
- package/esm2022/testing/lib/utils/web-gl-rendering-context.mjs +752 -0
- package/fesm2022/angular-three-testing.mjs +966 -0
- package/fesm2022/angular-three-testing.mjs.map +1 -0
- package/fesm2022/angular-three.mjs +2506 -2539
- package/fesm2022/angular-three.mjs.map +1 -1
- package/index.d.ts +14 -12
- package/lib/canvas.d.ts +366 -96
- package/lib/directives/args.d.ts +14 -7
- package/lib/directives/selection.d.ts +17 -0
- package/lib/dom/events.d.ts +2 -3
- package/lib/events.d.ts +4 -80
- package/lib/html.d.ts +17 -0
- package/lib/instance.d.ts +3 -35
- package/lib/loader.d.ts +18 -6
- package/lib/loop.d.ts +11 -59
- package/lib/pipes/hexify.d.ts +20 -0
- package/lib/portal.d.ts +54 -48
- package/lib/renderer/catalogue.d.ts +7 -3
- package/lib/renderer/constants.d.ts +4 -5
- package/lib/renderer/index.d.ts +64 -4
- package/lib/renderer/state.d.ts +24 -0
- package/lib/renderer/utils.d.ts +9 -27
- package/lib/roots.d.ts +9 -7
- package/lib/store.d.ts +13 -141
- package/lib/three-types.d.ts +500 -147
- package/lib/types.d.ts +291 -0
- package/lib/utils/apply-props.d.ts +1 -3
- package/lib/utils/attach.d.ts +3 -5
- package/lib/{before-render.d.ts → utils/before-render.d.ts} +1 -1
- package/lib/utils/is.d.ts +13 -14
- package/lib/utils/make.d.ts +7 -13
- package/lib/utils/non-nullish.d.ts +4 -0
- package/lib/utils/object-events.d.ts +34 -0
- package/lib/utils/parameters.d.ts +20 -0
- package/lib/utils/resolve-ref.d.ts +2 -0
- package/lib/utils/signal-store.d.ts +13 -4
- package/lib/utils/update.d.ts +1 -1
- package/metadata.json +1 -1
- package/package.json +40 -24
- package/plugin/generators.json +8 -30
- package/plugin/package.json +3 -22
- package/plugin/src/generators/add-soba/compat.js.map +1 -0
- package/plugin/src/generators/add-soba/generator.d.ts +3 -0
- package/plugin/src/generators/add-soba/generator.js +78 -0
- package/plugin/src/generators/add-soba/generator.js.map +1 -0
- package/plugin/src/generators/add-soba/schema.json +4 -0
- package/plugin/src/generators/init/compat.d.ts +1 -3
- package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +18 -7
- package/plugin/src/generators/init/generator.d.ts +5 -5
- package/plugin/src/generators/init/generator.js +100 -106
- package/plugin/src/generators/init/generator.js.map +1 -1
- package/plugin/src/generators/init/schema.json +8 -12
- package/plugin/src/generators/utils.js +4 -3
- package/plugin/src/generators/utils.js.map +1 -1
- package/plugin/src/generators/version.d.ts +17 -0
- package/plugin/src/generators/version.js +21 -0
- package/plugin/src/generators/version.js.map +1 -0
- package/plugin/src/index.d.ts +0 -3
- package/plugin/src/index.js +0 -9
- package/plugin/src/index.js.map +1 -1
- package/testing/README.md +3 -0
- package/testing/index.d.ts +2 -0
- package/testing/lib/test-bed.d.ts +38 -0
- package/testing/lib/test-canvas.d.ts +11 -0
- package/testing/lib/utils/mock-canvas.d.ts +5 -0
- package/testing/lib/utils/web-gl-rendering-context.d.ts +16 -0
- package/testing/package.json +3 -0
- package/web-types.json +1 -1
- package/esm2022/lib/before-render.mjs +0 -13
- package/esm2022/lib/directives/common.mjs +0 -41
- package/esm2022/lib/directives/key.mjs +0 -29
- package/esm2022/lib/directives/parent.mjs +0 -35
- package/esm2022/lib/ref.mjs +0 -48
- package/esm2022/lib/renderer/store.mjs +0 -408
- package/esm2022/lib/utils/safe-detect-changes.mjs +0 -17
- package/lib/directives/common.d.ts +0 -15
- package/lib/directives/key.d.ts +0 -10
- package/lib/directives/parent.d.ts +0 -11
- package/lib/ref.d.ts +0 -8
- package/lib/renderer/store.d.ts +0 -67
- package/lib/utils/safe-detect-changes.d.ts +0 -2
- package/plugin/migrations.json +0 -16
- package/plugin/src/generators/init/files/experience/experience.component.html__tmpl__ +0 -4
- package/plugin/src/generators/init-cannon/compat.js.map +0 -1
- package/plugin/src/generators/init-cannon/generator.d.ts +0 -2
- package/plugin/src/generators/init-cannon/generator.js +0 -23
- package/plugin/src/generators/init-cannon/generator.js.map +0 -1
- package/plugin/src/generators/init-cannon/schema.json +0 -6
- package/plugin/src/generators/init-postprocessing/compat.d.ts +0 -2
- package/plugin/src/generators/init-postprocessing/compat.js +0 -6
- package/plugin/src/generators/init-postprocessing/compat.js.map +0 -1
- package/plugin/src/generators/init-postprocessing/generator.d.ts +0 -2
- package/plugin/src/generators/init-postprocessing/generator.js +0 -21
- package/plugin/src/generators/init-postprocessing/generator.js.map +0 -1
- package/plugin/src/generators/init-postprocessing/schema.json +0 -6
- package/plugin/src/generators/init-soba/compat.d.ts +0 -2
- package/plugin/src/generators/init-soba/compat.js +0 -6
- package/plugin/src/generators/init-soba/compat.js.map +0 -1
- package/plugin/src/generators/init-soba/generator.d.ts +0 -2
- package/plugin/src/generators/init-soba/generator.js +0 -27
- package/plugin/src/generators/init-soba/generator.js.map +0 -1
- package/plugin/src/generators/init-soba/schema.json +0 -6
- package/plugin/src/generators/versions.d.ts +0 -13
- package/plugin/src/generators/versions.js +0 -17
- package/plugin/src/generators/versions.js.map +0 -1
- package/plugin/src/migrations/migrate-to-ngxtension/compat.d.ts +0 -2
- package/plugin/src/migrations/migrate-to-ngxtension/compat.js +0 -6
- package/plugin/src/migrations/migrate-to-ngxtension/compat.js.map +0 -1
- package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.d.ts +0 -2
- package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.js +0 -41
- package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.js.map +0 -1
- /package/plugin/src/generators/{init-cannon → add-soba}/compat.d.ts +0 -0
- /package/plugin/src/generators/{init-cannon → add-soba}/compat.js +0 -0
package/esm2022/lib/store.mjs
CHANGED
|
@@ -1,207 +1,183 @@
|
|
|
1
1
|
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import {
|
|
3
|
-
import { createInjectionToken } from 'ngxtension/create-injection-token';
|
|
2
|
+
import { ElementRef, InjectionToken, effect, inject } from '@angular/core';
|
|
4
3
|
import { Subject } from 'rxjs';
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
4
|
+
import { Clock, Vector2, Vector3 } from 'three';
|
|
5
|
+
import { injectLoop } from './loop';
|
|
7
6
|
import { is } from './utils/is';
|
|
8
7
|
import { makeDpr } from './utils/make';
|
|
9
|
-
import { safeDetectChanges } from './utils/safe-detect-changes';
|
|
10
8
|
import { signalStore } from './utils/signal-store';
|
|
11
9
|
import { updateCamera } from './utils/update';
|
|
12
|
-
function storeFactory(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
width: width / camera.zoom,
|
|
38
|
-
height: height / camera.zoom,
|
|
39
|
-
top,
|
|
40
|
-
left,
|
|
41
|
-
factor: 1,
|
|
42
|
-
distance,
|
|
43
|
-
aspect,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
const fov = (camera.fov * Math.PI) / 180; // convert vertical fov to radians
|
|
48
|
-
const h = 2 * Math.tan(fov / 2) * distance; // visible height
|
|
49
|
-
const w = h * (width / height);
|
|
50
|
-
return { width: w, height: h, top, left, factor: width / w, distance, aspect };
|
|
51
|
-
}
|
|
10
|
+
function storeFactory(previousStore) {
|
|
11
|
+
const document = inject(DOCUMENT);
|
|
12
|
+
const window = document.defaultView;
|
|
13
|
+
if (!window) {
|
|
14
|
+
// TODO: revisit this when we need to support multiple platforms
|
|
15
|
+
throw new Error(`[NGT] Window is not available.`);
|
|
16
|
+
}
|
|
17
|
+
const loop = injectLoop();
|
|
18
|
+
// NOTE: using Subject because we do not care about late-subscribers
|
|
19
|
+
const pointerMissed$ = new Subject();
|
|
20
|
+
const store = signalStore(({ get, update }) => {
|
|
21
|
+
const { invalidate, advance } = loop;
|
|
22
|
+
const position = new Vector3();
|
|
23
|
+
const defaultTarget = new Vector3();
|
|
24
|
+
const tempTarget = new Vector3();
|
|
25
|
+
function getCurrentViewport(camera = get('camera'), target = defaultTarget, size = get('size')) {
|
|
26
|
+
const { width, height, top, left } = size;
|
|
27
|
+
const aspect = width / height;
|
|
28
|
+
if (target instanceof Vector3)
|
|
29
|
+
tempTarget.copy(target);
|
|
30
|
+
else
|
|
31
|
+
tempTarget.set(...target);
|
|
32
|
+
const distance = camera.getWorldPosition(position).distanceTo(tempTarget);
|
|
33
|
+
if (is.orthographicCamera(camera)) {
|
|
34
|
+
return { width: width / camera.zoom, height: height / camera.zoom, top, left, factor: 1, distance, aspect };
|
|
52
35
|
}
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
const
|
|
56
|
-
return {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
performanceTimeout
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
dpr: 0,
|
|
92
|
-
width: 0,
|
|
93
|
-
height: 0,
|
|
94
|
-
top: 0,
|
|
95
|
-
left: 0,
|
|
96
|
-
aspect: 0,
|
|
97
|
-
distance: 0,
|
|
98
|
-
factor: 0,
|
|
99
|
-
getCurrentViewport,
|
|
100
|
-
},
|
|
101
|
-
setEvents: (events) => set((state) => ({ ...state, events: { ...state.events, ...events } })),
|
|
102
|
-
setSize: (width, height, top, left) => {
|
|
103
|
-
const camera = get('camera');
|
|
104
|
-
const size = { width, height, top: top || 0, left: left || 0 };
|
|
105
|
-
set((state) => ({
|
|
106
|
-
size,
|
|
107
|
-
viewport: { ...state.viewport, ...getCurrentViewport(camera, defaultTarget, size) },
|
|
108
|
-
}));
|
|
36
|
+
const fov = (camera.fov * Math.PI) / 180; // convert vertical fov to radians
|
|
37
|
+
const h = 2 * Math.tan(fov / 2) * distance; // visible height
|
|
38
|
+
const w = h * (width / height);
|
|
39
|
+
return { width: w, height: h, top, left, factor: width / w, distance, aspect };
|
|
40
|
+
}
|
|
41
|
+
let performanceTimeout = undefined;
|
|
42
|
+
const setPerformanceCurrent = (current) => update((state) => ({ performance: { ...state.performance, current } }));
|
|
43
|
+
const pointer = new Vector2();
|
|
44
|
+
return {
|
|
45
|
+
pointerMissed$: pointerMissed$.asObservable(),
|
|
46
|
+
events: { priority: 1, enabled: true, connected: false },
|
|
47
|
+
invalidate: (frames = 1) => invalidate(store, frames),
|
|
48
|
+
advance: (timestamp, runGlobalEffects) => advance(timestamp, runGlobalEffects, store),
|
|
49
|
+
legacy: false,
|
|
50
|
+
linear: false,
|
|
51
|
+
flat: false,
|
|
52
|
+
controls: null,
|
|
53
|
+
clock: new Clock(),
|
|
54
|
+
pointer,
|
|
55
|
+
frameloop: 'always',
|
|
56
|
+
performance: {
|
|
57
|
+
current: 1,
|
|
58
|
+
min: 0.5,
|
|
59
|
+
max: 1,
|
|
60
|
+
debounce: 200,
|
|
61
|
+
regress: () => {
|
|
62
|
+
const state = get();
|
|
63
|
+
// Clear timeout
|
|
64
|
+
if (performanceTimeout)
|
|
65
|
+
clearTimeout(performanceTimeout);
|
|
66
|
+
// Set lower bound performance
|
|
67
|
+
if (state.performance.current !== state.performance.min)
|
|
68
|
+
setPerformanceCurrent(state.performance.min);
|
|
69
|
+
// Go back to upper bound performance after a while unless something regresses meanwhile
|
|
70
|
+
performanceTimeout = setTimeout(() => {
|
|
71
|
+
setPerformanceCurrent(get('performance', 'max'));
|
|
72
|
+
// safeDetectChanges(cdr);
|
|
73
|
+
}, state.performance.debounce);
|
|
109
74
|
},
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
75
|
+
},
|
|
76
|
+
size: { width: 0, height: 0, top: 0, left: 0, updateStyle: false },
|
|
77
|
+
viewport: {
|
|
78
|
+
initialDpr: 0,
|
|
79
|
+
dpr: 0,
|
|
80
|
+
width: 0,
|
|
81
|
+
height: 0,
|
|
82
|
+
top: 0,
|
|
83
|
+
left: 0,
|
|
84
|
+
aspect: 0,
|
|
85
|
+
distance: 0,
|
|
86
|
+
factor: 0,
|
|
87
|
+
getCurrentViewport,
|
|
88
|
+
},
|
|
89
|
+
setEvents: (events) => update((state) => ({ ...state, events: { ...state.events, ...events } })),
|
|
90
|
+
setSize: (width, height, top, left) => {
|
|
91
|
+
const camera = get('camera');
|
|
92
|
+
const size = { width, height, top: top || 0, left: left || 0 };
|
|
93
|
+
update((state) => ({
|
|
94
|
+
size,
|
|
95
|
+
viewport: { ...state.viewport, ...getCurrentViewport(camera, defaultTarget, size) },
|
|
96
|
+
}));
|
|
97
|
+
},
|
|
98
|
+
setDpr: (dpr) => update((state) => {
|
|
99
|
+
const resolved = makeDpr(dpr, window);
|
|
100
|
+
return { viewport: { ...state.viewport, dpr: resolved, initialDpr: state.viewport.initialDpr || resolved } };
|
|
101
|
+
}),
|
|
102
|
+
setFrameloop: (frameloop = 'always') => {
|
|
103
|
+
const clock = get('clock');
|
|
104
|
+
// if frameloop === "never" clock.elapsedTime is updated using advance(timestamp)
|
|
105
|
+
clock.stop();
|
|
106
|
+
clock.elapsedTime = 0;
|
|
107
|
+
if (frameloop !== 'never') {
|
|
108
|
+
clock.start();
|
|
124
109
|
clock.elapsedTime = 0;
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
110
|
+
}
|
|
111
|
+
update(() => ({ frameloop }));
|
|
112
|
+
},
|
|
113
|
+
previousRoot: previousStore,
|
|
114
|
+
internal: {
|
|
115
|
+
active: false,
|
|
116
|
+
priority: 0,
|
|
117
|
+
frames: 0,
|
|
118
|
+
lastEvent: new ElementRef(null),
|
|
119
|
+
interaction: [],
|
|
120
|
+
hovered: new Map(),
|
|
121
|
+
subscribers: [],
|
|
122
|
+
initialClick: [0, 0],
|
|
123
|
+
initialHits: [],
|
|
124
|
+
capturedMap: new Map(),
|
|
125
|
+
subscribe: (callback, priority = 0, _store = store) => {
|
|
126
|
+
const internal = get('internal');
|
|
127
|
+
// If this subscription was given a priority, it takes rendering into its own hands
|
|
128
|
+
// For that reason we switch off automatic rendering and increase the manual flag
|
|
129
|
+
// As long as this flag is positive there can be no internal rendering at all
|
|
130
|
+
// because there could be multiple render subscriptions
|
|
131
|
+
internal.priority = internal.priority + (priority > 0 ? 1 : 0);
|
|
132
|
+
internal.subscribers.push({ callback, priority, store: _store });
|
|
133
|
+
// Register subscriber and sort layers from lowest to highest, meaning,
|
|
134
|
+
// highest priority renders last (on top of the other frames)
|
|
135
|
+
internal.subscribers = internal.subscribers.sort((a, b) => (a.priority || 0) - (b.priority || 0));
|
|
136
|
+
return () => {
|
|
144
137
|
const internal = get('internal');
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
// highest priority renders last (on top of the other frames)
|
|
153
|
-
internal.subscribers = internal.subscribers.sort((a, b) => (a.priority || 0) - (b.priority || 0));
|
|
154
|
-
return () => {
|
|
155
|
-
const internal = get('internal');
|
|
156
|
-
if (internal?.subscribers) {
|
|
157
|
-
// Decrease manual flag if this subscription had a priority
|
|
158
|
-
internal.priority = internal.priority - (priority > 0 ? 1 : 0);
|
|
159
|
-
// Remove subscriber from list
|
|
160
|
-
internal.subscribers = internal.subscribers.filter((s) => s.callback !== callback);
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
},
|
|
138
|
+
if (internal?.subscribers) {
|
|
139
|
+
// Decrease manual flag if this subscription had a priority
|
|
140
|
+
internal.priority = internal.priority - (priority > 0 ? 1 : 0);
|
|
141
|
+
// Remove subscriber from list
|
|
142
|
+
internal.subscribers = internal.subscribers.filter((s) => s.callback !== callback);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
164
145
|
},
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
// NOTE: assign pointerMissed$ so we can use it in events
|
|
168
|
-
Object.defineProperty(store, 'pointerMissed$', { get: () => pointerMissed$ });
|
|
169
|
-
const state = store.get();
|
|
170
|
-
let oldSize = state.size;
|
|
171
|
-
let oldDpr = state.viewport.dpr;
|
|
172
|
-
let oldCamera = state.camera;
|
|
173
|
-
const _camera = store.select('camera');
|
|
174
|
-
const _size = store.select('size');
|
|
175
|
-
const _viewport = store.select('viewport');
|
|
176
|
-
effect(() => {
|
|
177
|
-
const [camera, size, viewport, gl] = [_camera(), _size(), _viewport(), store.get('gl')];
|
|
178
|
-
// Resize camera and renderer on changes to size and pixelratio
|
|
179
|
-
if (size !== oldSize || viewport.dpr !== oldDpr) {
|
|
180
|
-
oldSize = size;
|
|
181
|
-
oldDpr = viewport.dpr;
|
|
182
|
-
// Update camera & renderer
|
|
183
|
-
updateCamera(camera, size);
|
|
184
|
-
gl.setPixelRatio(viewport.dpr);
|
|
185
|
-
const updateStyle = typeof HTMLCanvasElement !== 'undefined' && gl.domElement instanceof HTMLCanvasElement;
|
|
186
|
-
gl.setSize(size.width, size.height, updateStyle);
|
|
187
|
-
}
|
|
188
|
-
// Update viewport once the camera changes
|
|
189
|
-
if (camera !== oldCamera) {
|
|
190
|
-
oldCamera = camera;
|
|
191
|
-
updateCamera(camera, size);
|
|
192
|
-
// Update viewport
|
|
193
|
-
store.set((state) => ({
|
|
194
|
-
viewport: { ...state.viewport, ...state.viewport.getCurrentViewport(camera) },
|
|
195
|
-
}));
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
return store;
|
|
146
|
+
},
|
|
147
|
+
};
|
|
199
148
|
});
|
|
149
|
+
Object.defineProperty(store, 'pointerMissed$', { get: () => pointerMissed$ });
|
|
150
|
+
let { size: oldSize, viewport: { dpr: oldDpr }, camera: oldCamera, } = store.snapshot;
|
|
151
|
+
effect(() => {
|
|
152
|
+
const { camera: newCamera, size: newSize, viewport: { dpr: newDpr }, gl, } = store.state();
|
|
153
|
+
// Resize camera and renderer on changes to size and pixel-ratio
|
|
154
|
+
if (newSize !== oldSize || newDpr !== oldDpr) {
|
|
155
|
+
oldSize = newSize;
|
|
156
|
+
oldDpr = newDpr;
|
|
157
|
+
// Update camera & renderer
|
|
158
|
+
updateCamera(newCamera, newSize);
|
|
159
|
+
gl.setPixelRatio(newDpr);
|
|
160
|
+
const updateStyle = typeof HTMLCanvasElement !== 'undefined' && gl.domElement instanceof HTMLCanvasElement;
|
|
161
|
+
gl.setSize(newSize.width, newSize.height, updateStyle);
|
|
162
|
+
}
|
|
163
|
+
// Update viewport once the camera changes
|
|
164
|
+
if (newCamera !== oldCamera) {
|
|
165
|
+
oldCamera = newCamera;
|
|
166
|
+
updateCamera(newCamera, newSize);
|
|
167
|
+
// Update viewport
|
|
168
|
+
store.update((state) => ({ viewport: { ...state.viewport, ...state.viewport.getCurrentViewport(newCamera) } }));
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
return store;
|
|
172
|
+
}
|
|
173
|
+
export const NGT_STORE = new InjectionToken('NgtStore Token');
|
|
174
|
+
export function provideStore(store) {
|
|
175
|
+
if (store) {
|
|
176
|
+
return { provide: NGT_STORE, useFactory: store };
|
|
177
|
+
}
|
|
178
|
+
return { provide: NGT_STORE, useFactory: storeFactory };
|
|
179
|
+
}
|
|
180
|
+
export function injectStore(options) {
|
|
181
|
+
return inject(NGT_STORE, options);
|
|
200
182
|
}
|
|
201
|
-
export const NGT_STORE = new InjectionToken('NgtStore token');
|
|
202
|
-
export const [injectNgtStore, provideNgtStore] = createInjectionToken(storeFactory, {
|
|
203
|
-
isRoot: false,
|
|
204
|
-
deps: [NGT_LOOP, DOCUMENT, Injector, [new Optional(), new SkipSelf(), NGT_STORE]],
|
|
205
|
-
token: NGT_STORE,
|
|
206
|
-
});
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNOLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsY0FBYyxFQUNkLFFBQVEsRUFDUixRQUFRLEVBQ1IsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04scUJBQXFCLEdBQ3JCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxPQUFPLEVBQW1CLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRy9CLE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sUUFBUSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLHNCQUFzQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQXNJOUMsU0FBUyxZQUFZLENBQUMsSUFBYSxFQUFFLFFBQWtCLEVBQUUsUUFBa0IsRUFBRSxNQUF1QztJQUNuSCxPQUFPLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDM0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUVwQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1osZ0VBQWdFO1lBQ2hFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztTQUNsRDtRQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXRDLG9FQUFvRTtRQUNwRSxNQUFNLGNBQWMsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO1FBRWpELE1BQU0sS0FBSyxHQUE2QixXQUFXLENBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFO1lBQzlFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO1lBRXJDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JDLE1BQU0sYUFBYSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRXZDLFNBQVMsa0JBQWtCLENBQzFCLFNBQW9CLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFDakMsU0FBMkQsYUFBYSxFQUN4RSxPQUFnQixHQUFHLENBQUMsTUFBTSxDQUFDO2dCQUUzQixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO2dCQUMxQyxNQUFNLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO2dCQUM5QixJQUFJLE1BQU0sWUFBWSxLQUFLLENBQUMsT0FBTztvQkFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDOztvQkFDeEQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO2dCQUMvQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMxRSxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDbEMsT0FBTzt3QkFDTixLQUFLLEVBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJO3dCQUMxQixNQUFNLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJO3dCQUM1QixHQUFHO3dCQUNILElBQUk7d0JBQ0osTUFBTSxFQUFFLENBQUM7d0JBQ1QsUUFBUTt3QkFDUixNQUFNO3FCQUNOLENBQUM7aUJBQ0Y7cUJBQU07b0JBQ04sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxrQ0FBa0M7b0JBQzVFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxpQkFBaUI7b0JBQzdELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQztvQkFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztpQkFDL0U7WUFDRixDQUFDO1lBRUQsSUFBSSxrQkFBa0IsR0FBOEMsU0FBUyxDQUFDO1lBQzlFLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUNqRCxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFdEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFcEMsT0FBTztnQkFDTixjQUFjLEVBQUUsY0FBYyxDQUFDLFlBQVksRUFBRTtnQkFDN0MsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUU7Z0JBRXhELFVBQVUsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO2dCQUNyRCxPQUFPLEVBQUUsQ0FBQyxTQUFpQixFQUFFLGdCQUEwQixFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEtBQUssQ0FBQztnQkFFdkcsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsSUFBSSxFQUFFLEtBQUs7Z0JBRVgsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRTtnQkFDeEIsT0FBTztnQkFFUCxTQUFTLEVBQUUsUUFBUTtnQkFFbkIsV0FBVyxFQUFFO29CQUNaLE9BQU8sRUFBRSxDQUFDO29CQUNWLEdBQUcsRUFBRSxHQUFHO29CQUNSLEdBQUcsRUFBRSxDQUFDO29CQUNOLFFBQVEsRUFBRSxHQUFHO29CQUNiLE9BQU8sRUFBRSxHQUFHLEVBQUU7d0JBQ2IsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUM7d0JBQ3BCLGdCQUFnQjt3QkFDaEIsSUFBSSxrQkFBa0I7NEJBQUUsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7d0JBQ3pELDhCQUE4Qjt3QkFDOUIsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUc7NEJBQ3RELHFCQUFxQixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBRTlDLHdGQUF3Rjt3QkFDeEYsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTs0QkFDcEMscUJBQXFCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDOzRCQUNqRCxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDeEIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ2hDLENBQUM7aUJBQ0Q7Z0JBRUQsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO2dCQUNsRSxRQUFRLEVBQUU7b0JBQ1QsVUFBVSxFQUFFLENBQUM7b0JBQ2IsR0FBRyxFQUFFLENBQUM7b0JBQ04sS0FBSyxFQUFFLENBQUM7b0JBQ1IsTUFBTSxFQUFFLENBQUM7b0JBQ1QsR0FBRyxFQUFFLENBQUM7b0JBQ04sSUFBSSxFQUFFLENBQUM7b0JBQ1AsTUFBTSxFQUFFLENBQUM7b0JBQ1QsUUFBUSxFQUFFLENBQUM7b0JBQ1gsTUFBTSxFQUFFLENBQUM7b0JBQ1Qsa0JBQWtCO2lCQUNsQjtnQkFFRCxTQUFTLEVBQUUsQ0FBQyxNQUFxQyxFQUFFLEVBQUUsQ0FDcEQsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSxPQUFPLEVBQUUsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLEdBQVksRUFBRSxJQUFhLEVBQUUsRUFBRTtvQkFDdkUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUM3QixNQUFNLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDL0QsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUNmLElBQUk7d0JBQ0osUUFBUSxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsRUFBRTtxQkFDbkYsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxNQUFNLEVBQUUsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUN2QixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDYixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUN0QyxPQUFPO3dCQUNOLFFBQVEsRUFBRTs0QkFDVCxHQUFHLEtBQUssQ0FBQyxRQUFROzRCQUNqQixHQUFHLEVBQUUsUUFBUTs0QkFDYixVQUFVLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksUUFBUTt5QkFDakQ7cUJBQ0QsQ0FBQztnQkFDSCxDQUFDLENBQUM7Z0JBQ0gsWUFBWSxFQUFFLENBQUMsWUFBMkMsUUFBUSxFQUFFLEVBQUU7b0JBQ3JFLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFFM0IsaUZBQWlGO29CQUNqRixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2IsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7b0JBRXRCLElBQUksU0FBUyxLQUFLLE9BQU8sRUFBRTt3QkFDMUIsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNkLEtBQUssQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO3FCQUN0QjtvQkFDRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDNUIsQ0FBQztnQkFFRCxZQUFZLEVBQUUsTUFBTTtnQkFDcEIsUUFBUSxFQUFFO29CQUNULE1BQU0sRUFBRSxLQUFLO29CQUNiLFFBQVEsRUFBRSxDQUFDO29CQUNYLE1BQU0sRUFBRSxDQUFDO29CQUNULFNBQVMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQy9CLFdBQVcsRUFBRSxFQUFFO29CQUNmLE9BQU8sRUFBRSxJQUFJLEdBQUcsRUFBRTtvQkFDbEIsV0FBVyxFQUFFLEVBQUU7b0JBQ2YsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDcEIsV0FBVyxFQUFFLEVBQUU7b0JBQ2YsV0FBVyxFQUFFLElBQUksR0FBRyxFQUFFO29CQUV0QixTQUFTLEVBQUUsQ0FDVixRQUEyQyxFQUMzQyxRQUFRLEdBQUcsQ0FBQyxFQUNaLFNBQW1DLEtBQUssRUFDdkMsRUFBRTt3QkFDSCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ2pDLG1GQUFtRjt3QkFDbkYsaUZBQWlGO3dCQUNqRiw2RUFBNkU7d0JBQzdFLHVEQUF1RDt3QkFDdkQsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDL0QsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7d0JBQ3pELHVFQUF1RTt3QkFDdkUsNkRBQTZEO3dCQUM3RCxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUMvQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQy9DLENBQUM7d0JBQ0YsT0FBTyxHQUFHLEVBQUU7NEJBQ1gsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUNqQyxJQUFJLFFBQVEsRUFBRSxXQUFXLEVBQUU7Z0NBQzFCLDJEQUEyRDtnQ0FDM0QsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDL0QsOEJBQThCO2dDQUM5QixRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDOzZCQUNuRjt3QkFDRixDQUFDLENBQUM7b0JBQ0gsQ0FBQztpQkFDRDthQUNELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILHlEQUF5RDtRQUN6RCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRTlFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUUxQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3pCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQ2hDLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFN0IsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFM0MsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNYLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUV4RiwrREFBK0Q7WUFDL0QsSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLFFBQVEsQ0FBQyxHQUFHLEtBQUssTUFBTSxFQUFFO2dCQUNoRCxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNmLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUN0QiwyQkFBMkI7Z0JBQzNCLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNCLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUUvQixNQUFNLFdBQVcsR0FDaEIsT0FBTyxpQkFBaUIsS0FBSyxXQUFXLElBQUksRUFBRSxDQUFDLFVBQVUsWUFBWSxpQkFBaUIsQ0FBQztnQkFDeEYsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDakQ7WUFFRCwwQ0FBMEM7WUFDMUMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN6QixTQUFTLEdBQUcsTUFBTSxDQUFDO2dCQUNuQixZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzQixrQkFBa0I7Z0JBQ2xCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3JCLFFBQVEsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUU7aUJBQzdFLENBQUMsQ0FBQyxDQUFDO2FBQ0o7UUFDRixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBSUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLElBQUksY0FBYyxDQUFXLGdCQUFnQixDQUFDLENBQUM7QUFDeEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsZUFBZSxDQUFDLEdBQUcsb0JBQW9CLENBQUMsWUFBWSxFQUFFO0lBQ25GLE1BQU0sRUFBRSxLQUFLO0lBQ2IsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRSxFQUFFLElBQUksUUFBUSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakYsS0FBSyxFQUFFLFNBQVM7Q0FDaEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0b3JSZWYsXG5cdEVsZW1lbnRSZWYsXG5cdEluamVjdGlvblRva2VuLFxuXHRJbmplY3Rvcixcblx0T3B0aW9uYWwsXG5cdFNraXBTZWxmLFxuXHRlZmZlY3QsXG5cdGluamVjdCxcblx0cnVuSW5JbmplY3Rpb25Db250ZXh0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUluamVjdGlvblRva2VuIH0gZnJvbSAnbmd4dGVuc2lvbi9jcmVhdGUtaW5qZWN0aW9uLXRva2VuJztcbmltcG9ydCB7IFN1YmplY3QsIHR5cGUgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RDYW1lcmEsIE5ndERvbUV2ZW50LCBOZ3RFdmVudE1hbmFnZXIsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0LCBOZ3RUaHJlZUV2ZW50IH0gZnJvbSAnLi9ldmVudHMnO1xuaW1wb3J0IHR5cGUgeyBOZ3RJbnN0YW5jZU5vZGUgfSBmcm9tICcuL2luc3RhbmNlJztcbmltcG9ydCB7IE5HVF9MT09QLCB0eXBlIE5ndExvb3AgfSBmcm9tICcuL2xvb3AnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuL3V0aWxzL2lzJztcbmltcG9ydCB7IG1ha2VEcHIgfSBmcm9tICcuL3V0aWxzL21ha2UnO1xuaW1wb3J0IHsgc2FmZURldGVjdENoYW5nZXMgfSBmcm9tICcuL3V0aWxzL3NhZmUtZGV0ZWN0LWNoYW5nZXMnO1xuaW1wb3J0IHsgc2lnbmFsU3RvcmUsIHR5cGUgTmd0U2lnbmFsU3RvcmUgfSBmcm9tICcuL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5pbXBvcnQgeyB1cGRhdGVDYW1lcmEgfSBmcm9tICcuL3V0aWxzL3VwZGF0ZSc7XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlcmVyID0geyByZW5kZXI6IChzY2VuZTogVEhSRUUuU2NlbmUsIGNhbWVyYTogVEhSRUUuQ2FtZXJhKSA9PiBhbnkgfTtcbmV4cG9ydCB0eXBlIE5ndENhbWVyYU1hbnVhbCA9IE5ndENhbWVyYSAmIHsgbWFudWFsPzogYm9vbGVhbiB9O1xuXG5leHBvcnQgdHlwZSBOZ3REcHIgPSBudW1iZXIgfCBbbWluOiBudW1iZXIsIG1heDogbnVtYmVyXTtcbmV4cG9ydCB0eXBlIE5ndFNpemUgPSB7XG5cdHdpZHRoOiBudW1iZXI7XG5cdGhlaWdodDogbnVtYmVyO1xuXHR0b3A6IG51bWJlcjtcblx0bGVmdDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0Vmlld3BvcnQgPSBOZ3RTaXplICYge1xuXHQvKiogVGhlIGluaXRpYWwgcGl4ZWwgcmF0aW8gKi9cblx0aW5pdGlhbERwcjogbnVtYmVyO1xuXHQvKiogQ3VycmVudCBwaXhlbCByYXRpbyAqL1xuXHRkcHI6IG51bWJlcjtcblx0LyoqIHNpemUud2lkdGggLyB2aWV3cG9ydC53aWR0aCAqL1xuXHRmYWN0b3I6IG51bWJlcjtcblx0LyoqIENhbWVyYSBkaXN0YW5jZSAqL1xuXHRkaXN0YW5jZTogbnVtYmVyO1xuXHQvKiogQ2FtZXJhIGFzcGVjdCByYXRpbzogd2lkdGggLyBoZWlnaHQgKi9cblx0YXNwZWN0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RQZXJmb3JtYW5jZSA9IHtcblx0LyoqIEN1cnJlbnQgcGVyZm9ybWFuY2Ugbm9ybWFsLCBiZXR3ZWVuIG1pbiBhbmQgbWF4ICovXG5cdGN1cnJlbnQ6IG51bWJlcjtcblx0LyoqIEhvdyBsb3cgdGhlIHBlcmZvcm1hbmNlIGNhbiBnbywgYmV0d2VlbiAwIGFuZCBtYXggKi9cblx0bWluOiBudW1iZXI7XG5cdC8qKiBIb3cgaGlnaCB0aGUgcGVyZm9ybWFuY2UgY2FuIGdvLCBiZXR3ZWVuIG1pbiBhbmQgbWF4ICovXG5cdG1heDogbnVtYmVyO1xuXHQvKiogVGltZSB1bnRpbCBjdXJyZW50IHJldHVybnMgdG8gbWF4IGluIG1zICovXG5cdGRlYm91bmNlOiBudW1iZXI7XG5cdC8qKiBTZXRzIGN1cnJlbnQgdG8gbWluLCBwdXRzIHRoZSBzeXN0ZW0gaW4gcmVncmVzc2lvbiAqL1xuXHRyZWdyZXNzOiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0UmVuZGVyU3RhdGUgPSBOZ3RTdGF0ZSAmIHsgZGVsdGE6IG51bWJlcjsgZnJhbWU/OiBYUkZyYW1lIH07XG5cbmV4cG9ydCB0eXBlIE5ndEJlZm9yZVJlbmRlckV2ZW50PFRPYmplY3QgZXh0ZW5kcyBOZ3RJbnN0YW5jZU5vZGUgPSBOZ3RJbnN0YW5jZU5vZGU+ID0ge1xuXHRzdGF0ZTogTmd0UmVuZGVyU3RhdGU7XG5cdG9iamVjdDogVE9iamVjdDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndEJlZm9yZVJlbmRlclJlY29yZCA9IHtcblx0Y2FsbGJhY2s6IChzdGF0ZTogTmd0UmVuZGVyU3RhdGUpID0+IHZvaWQ7XG5cdHN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT47XG5cdHByaW9yaXR5PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0SW50ZXJuYWxTdGF0ZSA9IHtcblx0YWN0aXZlOiBib29sZWFuO1xuXHRwcmlvcml0eTogbnVtYmVyO1xuXHRmcmFtZXM6IG51bWJlcjtcblx0bGFzdEV2ZW50OiBFbGVtZW50UmVmPE5ndERvbUV2ZW50IHwgbnVsbD47XG5cdGludGVyYWN0aW9uOiBUSFJFRS5PYmplY3QzRFtdO1xuXHRob3ZlcmVkOiBNYXA8c3RyaW5nLCBOZ3RUaHJlZUV2ZW50PE5ndERvbUV2ZW50Pj47XG5cdGNhcHR1cmVkTWFwOiBNYXA8bnVtYmVyLCBNYXA8VEhSRUUuT2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0Pj47XG5cdGluaXRpYWxDbGljazogW3g6IG51bWJlciwgeTogbnVtYmVyXTtcblx0aW5pdGlhbEhpdHM6IFRIUkVFLk9iamVjdDNEW107XG5cdHN1YnNjcmliZXJzOiBOZ3RCZWZvcmVSZW5kZXJSZWNvcmRbXTtcblx0c3Vic2NyaWJlOiAoXG5cdFx0Y2FsbGJhY2s6IE5ndEJlZm9yZVJlbmRlclJlY29yZFsnY2FsbGJhY2snXSxcblx0XHRwcmlvcml0eT86IG51bWJlcixcblx0XHRzdG9yZT86IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPixcblx0KSA9PiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0U3RhdGUgPSB7XG5cdC8qKiB3aGVuIGFsbCBidWlsZGluZyBibG9ja3MgYXJlIGluaXRpYWxpemVkICovXG5cdHJlYWR5OiBib29sZWFuO1xuXHQvKiogVGhlIGluc3RhbmNlIG9mIHRoZSByZW5kZXJlciAqL1xuXHRnbDogVEhSRUUuV2ViR0xSZW5kZXJlcjtcblx0LyoqIERlZmF1bHQgY2FtZXJhICovXG5cdGNhbWVyYTogTmd0Q2FtZXJhTWFudWFsO1xuXHQvKiogRGVmYXVsdCBzY2VuZSAqL1xuXHRzY2VuZTogVEhSRUUuU2NlbmU7XG5cdC8qKiBEZWZhdWx0IHJheWNhc3RlciAqL1xuXHRyYXljYXN0ZXI6IFRIUkVFLlJheWNhc3Rlcjtcblx0LyoqIERlZmF1bHQgY2xvY2sgKi9cblx0Y2xvY2s6IFRIUkVFLkNsb2NrO1xuXHQvKiogRXZlbnQgbGF5ZXIgaW50ZXJmYWNlLCBjb250YWlucyB0aGUgZXZlbnQgaGFuZGxlciBhbmQgdGhlIG5vZGUgdGhleSdyZSBjb25uZWN0ZWQgdG8gKi9cblx0ZXZlbnRzOiBOZ3RFdmVudE1hbmFnZXI8YW55Pjtcblx0LyoqIFhSIGludGVyZmFjZSAqL1xuXHR4cjogeyBjb25uZWN0OiAoKSA9PiB2b2lkOyBkaXNjb25uZWN0OiAoKSA9PiB2b2lkIH07XG5cdC8qKiBDdXJyZW50bHkgdXNlZCBjb250cm9scyAqL1xuXHRjb250cm9sczogVEhSRUUuRXZlbnREaXNwYXRjaGVyIHwgbnVsbDtcblx0LyoqIE5vcm1hbGl6ZWQgZXZlbnQgY29vcmRpbmF0ZXMgKi9cblx0cG9pbnRlcjogVEhSRUUuVmVjdG9yMjtcblx0LyogV2hldGhlciB0byBlbmFibGUgcjEzOSdzIFRIUkVFLkNvbG9yTWFuYWdlbWVudCAqL1xuXHRsZWdhY3k6IGJvb2xlYW47XG5cdC8qKiBTaG9ydGN1dCB0byBnbC5vdXRwdXRDb2xvclNwYWNlID0gVEhSRUUuTGluZWFyU1JHQkNvbG9yU3BhY2UgKi9cblx0bGluZWFyOiBib29sZWFuO1xuXHQvKiogU2hvcnRjdXQgdG8gZ2wudG9uZU1hcHBpbmcgPSBOb1RvbmVtYXBwaW5nICovXG5cdGZsYXQ6IGJvb2xlYW47XG5cdC8qKiBSZW5kZXIgbG9vcCBmbGFncyAqL1xuXHRmcmFtZWxvb3A6ICdhbHdheXMnIHwgJ2RlbWFuZCcgfCAnbmV2ZXInO1xuXHQvKiogQWRhcHRpdmUgcGVyZm9ybWFuY2UgaW50ZXJmYWNlICovXG5cdHBlcmZvcm1hbmNlOiBOZ3RQZXJmb3JtYW5jZTtcblx0LyoqIFJlYWN0aXZlIHBpeGVsLXNpemUgb2YgdGhlIGNhbnZhcyAqL1xuXHRzaXplOiBOZ3RTaXplO1xuXHQvKiogUmVhY3RpdmUgc2l6ZSBvZiB0aGUgdmlld3BvcnQgaW4gdGhyZWVqcyB1bml0cyAqL1xuXHR2aWV3cG9ydDogTmd0Vmlld3BvcnQgJiB7XG5cdFx0Z2V0Q3VycmVudFZpZXdwb3J0OiAoXG5cdFx0XHRjYW1lcmE/OiBOZ3RDYW1lcmEsXG5cdFx0XHR0YXJnZXQ/OiBUSFJFRS5WZWN0b3IzIHwgUGFyYW1ldGVyczxUSFJFRS5WZWN0b3IzWydzZXQnXT4sXG5cdFx0XHRzaXplPzogTmd0U2l6ZSxcblx0XHQpID0+IE9taXQ8Tmd0Vmlld3BvcnQsICdkcHInIHwgJ2luaXRpYWxEcHInPjtcblx0fTtcblx0LyoqIEZsYWdzIHRoZSBjYW52YXMgZm9yIHJlbmRlciwgYnV0IGRvZXNuJ3QgcmVuZGVyIGluIGl0c2VsZiAqL1xuXHRpbnZhbGlkYXRlOiAoZnJhbWVzPzogbnVtYmVyKSA9PiB2b2lkO1xuXHQvKiogQWR2YW5jZSAocmVuZGVyKSBvbmUgc3RlcCAqL1xuXHRhZHZhbmNlOiAodGltZXN0YW1wOiBudW1iZXIsIHJ1bkdsb2JhbEVmZmVjdHM/OiBib29sZWFuKSA9PiB2b2lkO1xuXHQvKiogU2hvcnRjdXQgdG8gc2V0dGluZyB0aGUgZXZlbnQgbGF5ZXIgKi9cblx0c2V0RXZlbnRzOiAoZXZlbnRzOiBQYXJ0aWFsPE5ndEV2ZW50TWFuYWdlcjxhbnk+PikgPT4gdm9pZDtcblx0LyoqXG5cdCAqIFNob3J0Y3V0IHRvIG1hbnVhbCBzaXppbmdcblx0ICovXG5cdHNldFNpemU6ICh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgdG9wPzogbnVtYmVyLCBsZWZ0PzogbnVtYmVyKSA9PiB2b2lkO1xuXHQvKiogU2hvcnRjdXQgdG8gbWFudWFsIHNldHRpbmcgdGhlIHBpeGVsIHJhdGlvICovXG5cdHNldERwcjogKGRwcjogTmd0RHByKSA9PiB2b2lkO1xuXHQvKiogU2hvcnRjdXQgdG8gZnJhbWVsb29wIGZsYWdzICovXG5cdHNldEZyYW1lbG9vcDogKGZyYW1lbG9vcD86ICdhbHdheXMnIHwgJ2RlbWFuZCcgfCAnbmV2ZXInKSA9PiB2b2lkO1xuXHQvKiogV2hlbiB0aGUgY2FudmFzIHdhcyBjbGlja2VkIGJ1dCBub3RoaW5nIHdhcyBoaXQgKi9cblx0LyoqIFBvaW50ZXJNaXNzZWQgT2JzZXJ2YWJsZSAqL1xuXHRwb2ludGVyTWlzc2VkJDogT2JzZXJ2YWJsZTxNb3VzZUV2ZW50Pjtcblx0LyoqIElmIHRoaXMgc3RhdGUgbW9kZWwgaXMgbGF5ZXJkICh2aWEgY3JlYXRlUG9ydGFsKSB0aGVuIHRoaXMgY29udGFpbnMgdGhlIHByZXZpb3VzIGxheWVyICovXG5cdHByZXZpb3VzUm9vdDogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+IHwgbnVsbDtcblx0LyoqIEludGVybmFscyAqL1xuXHRpbnRlcm5hbDogTmd0SW50ZXJuYWxTdGF0ZTtcbn07XG5cbmZ1bmN0aW9uIHN0b3JlRmFjdG9yeShsb29wOiBOZ3RMb29wLCBkb2N1bWVudDogRG9jdW1lbnQsIGluamVjdG9yOiBJbmplY3RvciwgcGFyZW50OiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4gfCBudWxsKSB7XG5cdHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+IHtcblx0XHRjb25zdCB3aW5kb3cgPSBkb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICghd2luZG93KSB7XG5cdFx0XHQvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBuZWVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgcGxhdGZvcm1zXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFtOR1RdIFdpbmRvdyBpcyBub3QgYXZhaWxhYmxlLmApO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cblx0XHQvLyBOT1RFOiB1c2luZyBTdWJqZWN0IGJlY2F1c2Ugd2UgZG8gbm90IGNhcmUgYWJvdXQgbGF0ZS1zdWJzY3JpYmVyc1xuXHRcdGNvbnN0IHBvaW50ZXJNaXNzZWQkID0gbmV3IFN1YmplY3Q8TW91c2VFdmVudD4oKTtcblxuXHRcdGNvbnN0IHN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4gPSBzaWduYWxTdG9yZTxOZ3RTdGF0ZT4oKHsgZ2V0LCBzZXQgfSkgPT4ge1xuXHRcdFx0Y29uc3QgeyBpbnZhbGlkYXRlLCBhZHZhbmNlIH0gPSBsb29wO1xuXG5cdFx0XHRjb25zdCBwb3NpdGlvbiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5cdFx0XHRjb25zdCBkZWZhdWx0VGFyZ2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IHRlbXBUYXJnZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuXG5cdFx0XHRmdW5jdGlvbiBnZXRDdXJyZW50Vmlld3BvcnQoXG5cdFx0XHRcdGNhbWVyYTogTmd0Q2FtZXJhID0gZ2V0KCdjYW1lcmEnKSxcblx0XHRcdFx0dGFyZ2V0OiBUSFJFRS5WZWN0b3IzIHwgUGFyYW1ldGVyczxUSFJFRS5WZWN0b3IzWydzZXQnXT4gPSBkZWZhdWx0VGFyZ2V0LFxuXHRcdFx0XHRzaXplOiBOZ3RTaXplID0gZ2V0KCdzaXplJyksXG5cdFx0XHQpOiBPbWl0PE5ndFZpZXdwb3J0LCAnZHByJyB8ICdpbml0aWFsRHByJz4ge1xuXHRcdFx0XHRjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gc2l6ZTtcblx0XHRcdFx0Y29uc3QgYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XG5cdFx0XHRcdGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUSFJFRS5WZWN0b3IzKSB0ZW1wVGFyZ2V0LmNvcHkodGFyZ2V0KTtcblx0XHRcdFx0ZWxzZSB0ZW1wVGFyZ2V0LnNldCguLi50YXJnZXQpO1xuXHRcdFx0XHRjb25zdCBkaXN0YW5jZSA9IGNhbWVyYS5nZXRXb3JsZFBvc2l0aW9uKHBvc2l0aW9uKS5kaXN0YW5jZVRvKHRlbXBUYXJnZXQpO1xuXHRcdFx0XHRpZiAoaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkpIHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0d2lkdGg6IHdpZHRoIC8gY2FtZXJhLnpvb20sXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IGhlaWdodCAvIGNhbWVyYS56b29tLFxuXHRcdFx0XHRcdFx0dG9wLFxuXHRcdFx0XHRcdFx0bGVmdCxcblx0XHRcdFx0XHRcdGZhY3RvcjogMSxcblx0XHRcdFx0XHRcdGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0YXNwZWN0LFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgZm92ID0gKGNhbWVyYS5mb3YgKiBNYXRoLlBJKSAvIDE4MDsgLy8gY29udmVydCB2ZXJ0aWNhbCBmb3YgdG8gcmFkaWFuc1xuXHRcdFx0XHRcdGNvbnN0IGggPSAyICogTWF0aC50YW4oZm92IC8gMikgKiBkaXN0YW5jZTsgLy8gdmlzaWJsZSBoZWlnaHRcblx0XHRcdFx0XHRjb25zdCB3ID0gaCAqICh3aWR0aCAvIGhlaWdodCk7XG5cdFx0XHRcdFx0cmV0dXJuIHsgd2lkdGg6IHcsIGhlaWdodDogaCwgdG9wLCBsZWZ0LCBmYWN0b3I6IHdpZHRoIC8gdywgZGlzdGFuY2UsIGFzcGVjdCB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGxldCBwZXJmb3JtYW5jZVRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3Qgc2V0UGVyZm9ybWFuY2VDdXJyZW50ID0gKGN1cnJlbnQ6IG51bWJlcikgPT5cblx0XHRcdFx0c2V0KChzdGF0ZSkgPT4gKHsgcGVyZm9ybWFuY2U6IHsgLi4uc3RhdGUucGVyZm9ybWFuY2UsIGN1cnJlbnQgfSB9KSk7XG5cblx0XHRcdGNvbnN0IHBvaW50ZXIgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRwb2ludGVyTWlzc2VkJDogcG9pbnRlck1pc3NlZCQuYXNPYnNlcnZhYmxlKCksXG5cdFx0XHRcdGV2ZW50czogeyBwcmlvcml0eTogMSwgZW5hYmxlZDogdHJ1ZSwgY29ubmVjdGVkOiBmYWxzZSB9LFxuXG5cdFx0XHRcdGludmFsaWRhdGU6IChmcmFtZXMgPSAxKSA9PiBpbnZhbGlkYXRlKHN0b3JlLCBmcmFtZXMpLFxuXHRcdFx0XHRhZHZhbmNlOiAodGltZXN0YW1wOiBudW1iZXIsIHJ1bkdsb2JhbEVmZmVjdHM/OiBib29sZWFuKSA9PiBhZHZhbmNlKHRpbWVzdGFtcCwgcnVuR2xvYmFsRWZmZWN0cywgc3RvcmUpLFxuXG5cdFx0XHRcdGxlZ2FjeTogZmFsc2UsXG5cdFx0XHRcdGxpbmVhcjogZmFsc2UsXG5cdFx0XHRcdGZsYXQ6IGZhbHNlLFxuXG5cdFx0XHRcdGNvbnRyb2xzOiBudWxsLFxuXHRcdFx0XHRjbG9jazogbmV3IFRIUkVFLkNsb2NrKCksXG5cdFx0XHRcdHBvaW50ZXIsXG5cblx0XHRcdFx0ZnJhbWVsb29wOiAnYWx3YXlzJyxcblxuXHRcdFx0XHRwZXJmb3JtYW5jZToge1xuXHRcdFx0XHRcdGN1cnJlbnQ6IDEsXG5cdFx0XHRcdFx0bWluOiAwLjUsXG5cdFx0XHRcdFx0bWF4OiAxLFxuXHRcdFx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRcdFx0cmVncmVzczogKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc3RhdGUgPSBnZXQoKTtcblx0XHRcdFx0XHRcdC8vIENsZWFyIHRpbWVvdXRcblx0XHRcdFx0XHRcdGlmIChwZXJmb3JtYW5jZVRpbWVvdXQpIGNsZWFyVGltZW91dChwZXJmb3JtYW5jZVRpbWVvdXQpO1xuXHRcdFx0XHRcdFx0Ly8gU2V0IGxvd2VyIGJvdW5kIHBlcmZvcm1hbmNlXG5cdFx0XHRcdFx0XHRpZiAoc3RhdGUucGVyZm9ybWFuY2UuY3VycmVudCAhPT0gc3RhdGUucGVyZm9ybWFuY2UubWluKVxuXHRcdFx0XHRcdFx0XHRzZXRQZXJmb3JtYW5jZUN1cnJlbnQoc3RhdGUucGVyZm9ybWFuY2UubWluKTtcblxuXHRcdFx0XHRcdFx0Ly8gR28gYmFjayB0byB1cHBlciBib3VuZCBwZXJmb3JtYW5jZSBhZnRlciBhIHdoaWxlIHVubGVzcyBzb21ldGhpbmcgcmVncmVzc2VzIG1lYW53aGlsZVxuXHRcdFx0XHRcdFx0cGVyZm9ybWFuY2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHNldFBlcmZvcm1hbmNlQ3VycmVudChnZXQoJ3BlcmZvcm1hbmNlJywgJ21heCcpKTtcblx0XHRcdFx0XHRcdFx0c2FmZURldGVjdENoYW5nZXMoY2RyKTtcblx0XHRcdFx0XHRcdH0sIHN0YXRlLnBlcmZvcm1hbmNlLmRlYm91bmNlKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdHNpemU6IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwLCB1cGRhdGVTdHlsZTogZmFsc2UgfSxcblx0XHRcdFx0dmlld3BvcnQ6IHtcblx0XHRcdFx0XHRpbml0aWFsRHByOiAwLFxuXHRcdFx0XHRcdGRwcjogMCxcblx0XHRcdFx0XHR3aWR0aDogMCxcblx0XHRcdFx0XHRoZWlnaHQ6IDAsXG5cdFx0XHRcdFx0dG9wOiAwLFxuXHRcdFx0XHRcdGxlZnQ6IDAsXG5cdFx0XHRcdFx0YXNwZWN0OiAwLFxuXHRcdFx0XHRcdGRpc3RhbmNlOiAwLFxuXHRcdFx0XHRcdGZhY3RvcjogMCxcblx0XHRcdFx0XHRnZXRDdXJyZW50Vmlld3BvcnQsXG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0c2V0RXZlbnRzOiAoZXZlbnRzOiBQYXJ0aWFsPE5ndEV2ZW50TWFuYWdlcjxhbnk+PikgPT5cblx0XHRcdFx0XHRzZXQoKHN0YXRlKSA9PiAoeyAuLi5zdGF0ZSwgZXZlbnRzOiB7IC4uLnN0YXRlLmV2ZW50cywgLi4uZXZlbnRzIH0gfSkpLFxuXHRcdFx0XHRzZXRTaXplOiAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHRvcD86IG51bWJlciwgbGVmdD86IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNhbWVyYSA9IGdldCgnY2FtZXJhJyk7XG5cdFx0XHRcdFx0Y29uc3Qgc2l6ZSA9IHsgd2lkdGgsIGhlaWdodCwgdG9wOiB0b3AgfHwgMCwgbGVmdDogbGVmdCB8fCAwIH07XG5cdFx0XHRcdFx0c2V0KChzdGF0ZSkgPT4gKHtcblx0XHRcdFx0XHRcdHNpemUsXG5cdFx0XHRcdFx0XHR2aWV3cG9ydDogeyAuLi5zdGF0ZS52aWV3cG9ydCwgLi4uZ2V0Q3VycmVudFZpZXdwb3J0KGNhbWVyYSwgZGVmYXVsdFRhcmdldCwgc2l6ZSkgfSxcblx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNldERwcjogKGRwcjogTmd0RHByKSA9PlxuXHRcdFx0XHRcdHNldCgoc3RhdGUpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlc29sdmVkID0gbWFrZURwcihkcHIsIHdpbmRvdyk7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHR2aWV3cG9ydDoge1xuXHRcdFx0XHRcdFx0XHRcdC4uLnN0YXRlLnZpZXdwb3J0LFxuXHRcdFx0XHRcdFx0XHRcdGRwcjogcmVzb2x2ZWQsXG5cdFx0XHRcdFx0XHRcdFx0aW5pdGlhbERwcjogc3RhdGUudmlld3BvcnQuaW5pdGlhbERwciB8fCByZXNvbHZlZCxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdHNldEZyYW1lbG9vcDogKGZyYW1lbG9vcDogJ2Fsd2F5cycgfCAnZGVtYW5kJyB8ICduZXZlcicgPSAnYWx3YXlzJykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNsb2NrID0gZ2V0KCdjbG9jaycpO1xuXG5cdFx0XHRcdFx0Ly8gaWYgZnJhbWVsb29wID09PSBcIm5ldmVyXCIgY2xvY2suZWxhcHNlZFRpbWUgaXMgdXBkYXRlZCB1c2luZyBhZHZhbmNlKHRpbWVzdGFtcClcblx0XHRcdFx0XHRjbG9jay5zdG9wKCk7XG5cdFx0XHRcdFx0Y2xvY2suZWxhcHNlZFRpbWUgPSAwO1xuXG5cdFx0XHRcdFx0aWYgKGZyYW1lbG9vcCAhPT0gJ25ldmVyJykge1xuXHRcdFx0XHRcdFx0Y2xvY2suc3RhcnQoKTtcblx0XHRcdFx0XHRcdGNsb2NrLmVsYXBzZWRUaW1lID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2V0KCgpID0+ICh7IGZyYW1lbG9vcCB9KSk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0cHJldmlvdXNSb290OiBwYXJlbnQsXG5cdFx0XHRcdGludGVybmFsOiB7XG5cdFx0XHRcdFx0YWN0aXZlOiBmYWxzZSxcblx0XHRcdFx0XHRwcmlvcml0eTogMCxcblx0XHRcdFx0XHRmcmFtZXM6IDAsXG5cdFx0XHRcdFx0bGFzdEV2ZW50OiBuZXcgRWxlbWVudFJlZihudWxsKSxcblx0XHRcdFx0XHRpbnRlcmFjdGlvbjogW10sXG5cdFx0XHRcdFx0aG92ZXJlZDogbmV3IE1hcCgpLFxuXHRcdFx0XHRcdHN1YnNjcmliZXJzOiBbXSxcblx0XHRcdFx0XHRpbml0aWFsQ2xpY2s6IFswLCAwXSxcblx0XHRcdFx0XHRpbml0aWFsSGl0czogW10sXG5cdFx0XHRcdFx0Y2FwdHVyZWRNYXA6IG5ldyBNYXAoKSxcblxuXHRcdFx0XHRcdHN1YnNjcmliZTogKFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2s6IE5ndEJlZm9yZVJlbmRlclJlY29yZFsnY2FsbGJhY2snXSxcblx0XHRcdFx0XHRcdHByaW9yaXR5ID0gMCxcblx0XHRcdFx0XHRcdF9zdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+ID0gc3RvcmUsXG5cdFx0XHRcdFx0KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBpbnRlcm5hbCA9IGdldCgnaW50ZXJuYWwnKTtcblx0XHRcdFx0XHRcdC8vIElmIHRoaXMgc3Vic2NyaXB0aW9uIHdhcyBnaXZlbiBhIHByaW9yaXR5LCBpdCB0YWtlcyByZW5kZXJpbmcgaW50byBpdHMgb3duIGhhbmRzXG5cdFx0XHRcdFx0XHQvLyBGb3IgdGhhdCByZWFzb24gd2Ugc3dpdGNoIG9mZiBhdXRvbWF0aWMgcmVuZGVyaW5nIGFuZCBpbmNyZWFzZSB0aGUgbWFudWFsIGZsYWdcblx0XHRcdFx0XHRcdC8vIEFzIGxvbmcgYXMgdGhpcyBmbGFnIGlzIHBvc2l0aXZlIHRoZXJlIGNhbiBiZSBubyBpbnRlcm5hbCByZW5kZXJpbmcgYXQgYWxsXG5cdFx0XHRcdFx0XHQvLyBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIHJlbmRlciBzdWJzY3JpcHRpb25zXG5cdFx0XHRcdFx0XHRpbnRlcm5hbC5wcmlvcml0eSA9IGludGVybmFsLnByaW9yaXR5ICsgKHByaW9yaXR5ID4gMCA/IDEgOiAwKTtcblx0XHRcdFx0XHRcdGludGVybmFsLnN1YnNjcmliZXJzLnB1c2goeyBjYWxsYmFjaywgcHJpb3JpdHksIHN0b3JlIH0pO1xuXHRcdFx0XHRcdFx0Ly8gUmVnaXN0ZXIgc3Vic2NyaWJlciBhbmQgc29ydCBsYXllcnMgZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCwgbWVhbmluZyxcblx0XHRcdFx0XHRcdC8vIGhpZ2hlc3QgcHJpb3JpdHkgcmVuZGVycyBsYXN0IChvbiB0b3Agb2YgdGhlIG90aGVyIGZyYW1lcylcblx0XHRcdFx0XHRcdGludGVybmFsLnN1YnNjcmliZXJzID0gaW50ZXJuYWwuc3Vic2NyaWJlcnMuc29ydChcblx0XHRcdFx0XHRcdFx0KGEsIGIpID0+IChhLnByaW9yaXR5IHx8IDApIC0gKGIucHJpb3JpdHkgfHwgMCksXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgaW50ZXJuYWwgPSBnZXQoJ2ludGVybmFsJyk7XG5cdFx0XHRcdFx0XHRcdGlmIChpbnRlcm5hbD8uc3Vic2NyaWJlcnMpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBEZWNyZWFzZSBtYW51YWwgZmxhZyBpZiB0aGlzIHN1YnNjcmlwdGlvbiBoYWQgYSBwcmlvcml0eVxuXHRcdFx0XHRcdFx0XHRcdGludGVybmFsLnByaW9yaXR5ID0gaW50ZXJuYWwucHJpb3JpdHkgLSAocHJpb3JpdHkgPiAwID8gMSA6IDApO1xuXHRcdFx0XHRcdFx0XHRcdC8vIFJlbW92ZSBzdWJzY3JpYmVyIGZyb20gbGlzdFxuXHRcdFx0XHRcdFx0XHRcdGludGVybmFsLnN1YnNjcmliZXJzID0gaW50ZXJuYWwuc3Vic2NyaWJlcnMuZmlsdGVyKChzKSA9PiBzLmNhbGxiYWNrICE9PSBjYWxsYmFjayk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdH07XG5cdFx0fSk7XG5cblx0XHQvLyBOT1RFOiBhc3NpZ24gcG9pbnRlck1pc3NlZCQgc28gd2UgY2FuIHVzZSBpdCBpbiBldmVudHNcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3RvcmUsICdwb2ludGVyTWlzc2VkJCcsIHsgZ2V0OiAoKSA9PiBwb2ludGVyTWlzc2VkJCB9KTtcblxuXHRcdGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0KCk7XG5cblx0XHRsZXQgb2xkU2l6ZSA9IHN0YXRlLnNpemU7XG5cdFx0bGV0IG9sZERwciA9IHN0YXRlLnZpZXdwb3J0LmRwcjtcblx0XHRsZXQgb2xkQ2FtZXJhID0gc3RhdGUuY2FtZXJhO1xuXG5cdFx0Y29uc3QgX2NhbWVyYSA9IHN0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cdFx0Y29uc3QgX3NpemUgPSBzdG9yZS5zZWxlY3QoJ3NpemUnKTtcblx0XHRjb25zdCBfdmlld3BvcnQgPSBzdG9yZS5zZWxlY3QoJ3ZpZXdwb3J0Jyk7XG5cblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgW2NhbWVyYSwgc2l6ZSwgdmlld3BvcnQsIGdsXSA9IFtfY2FtZXJhKCksIF9zaXplKCksIF92aWV3cG9ydCgpLCBzdG9yZS5nZXQoJ2dsJyldO1xuXG5cdFx0XHQvLyBSZXNpemUgY2FtZXJhIGFuZCByZW5kZXJlciBvbiBjaGFuZ2VzIHRvIHNpemUgYW5kIHBpeGVscmF0aW9cblx0XHRcdGlmIChzaXplICE9PSBvbGRTaXplIHx8IHZpZXdwb3J0LmRwciAhPT0gb2xkRHByKSB7XG5cdFx0XHRcdG9sZFNpemUgPSBzaXplO1xuXHRcdFx0XHRvbGREcHIgPSB2aWV3cG9ydC5kcHI7XG5cdFx0XHRcdC8vIFVwZGF0ZSBjYW1lcmEgJiByZW5kZXJlclxuXHRcdFx0XHR1cGRhdGVDYW1lcmEoY2FtZXJhLCBzaXplKTtcblx0XHRcdFx0Z2wuc2V0UGl4ZWxSYXRpbyh2aWV3cG9ydC5kcHIpO1xuXG5cdFx0XHRcdGNvbnN0IHVwZGF0ZVN0eWxlID1cblx0XHRcdFx0XHR0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGdsLmRvbUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudDtcblx0XHRcdFx0Z2wuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCwgdXBkYXRlU3R5bGUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdmlld3BvcnQgb25jZSB0aGUgY2FtZXJhIGNoYW5nZXNcblx0XHRcdGlmIChjYW1lcmEgIT09IG9sZENhbWVyYSkge1xuXHRcdFx0XHRvbGRDYW1lcmEgPSBjYW1lcmE7XG5cdFx0XHRcdHVwZGF0ZUNhbWVyYShjYW1lcmEsIHNpemUpO1xuXHRcdFx0XHQvLyBVcGRhdGUgdmlld3BvcnRcblx0XHRcdFx0c3RvcmUuc2V0KChzdGF0ZSkgPT4gKHtcblx0XHRcdFx0XHR2aWV3cG9ydDogeyAuLi5zdGF0ZS52aWV3cG9ydCwgLi4uc3RhdGUudmlld3BvcnQuZ2V0Q3VycmVudFZpZXdwb3J0KGNhbWVyYSkgfSxcblx0XHRcdFx0fSkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHN0b3JlO1xuXHR9KTtcbn1cblxuZXhwb3J0IHR5cGUgTmd0U3RvcmUgPSBSZXR1cm5UeXBlPHR5cGVvZiBzdG9yZUZhY3Rvcnk+O1xuXG5leHBvcnQgY29uc3QgTkdUX1NUT1JFID0gbmV3IEluamVjdGlvblRva2VuPE5ndFN0b3JlPignTmd0U3RvcmUgdG9rZW4nKTtcbmV4cG9ydCBjb25zdCBbaW5qZWN0Tmd0U3RvcmUsIHByb3ZpZGVOZ3RTdG9yZV0gPSBjcmVhdGVJbmplY3Rpb25Ub2tlbihzdG9yZUZhY3RvcnksIHtcblx0aXNSb290OiBmYWxzZSxcblx0ZGVwczogW05HVF9MT09QLCBET0NVTUVOVCwgSW5qZWN0b3IsIFtuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIE5HVF9TVE9SRV1dLFxuXHR0b2tlbjogTkdUX1NUT1JFLFxufSk7XG4iXX0=
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBaUIsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVwQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsU0FBUyxZQUFZLENBQUMsYUFBOEM7SUFDbkUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFFcEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2IsZ0VBQWdFO1FBQ2hFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFFMUIsb0VBQW9FO0lBQ3BFLE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxFQUFjLENBQUM7SUFFakQsTUFBTSxLQUFLLEdBQTZCLFdBQVcsQ0FBVyxDQUFDLEVBQUUsR0FBRyxF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QUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakgsQ0FBQztJQUNGLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxLQUFLLENBQUM7QUFDZCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLElBQUksY0FBYyxDQUEyQixnQkFBZ0IsQ0FBQyxDQUFDO0FBRXhGLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBc0M7SUFDbEUsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ3pELENBQUM7QUFLRCxNQUFNLFVBQVUsV0FBVyxDQUFDLE9BQXVCO0lBQ2xELE9BQU8sTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUF3QixDQUFDLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdE9wdGlvbnMsIEluamVjdGlvblRva2VuLCBlZmZlY3QsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2xvY2ssIFZlY3RvcjIsIFZlY3RvcjMgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBpbmplY3RMb29wIH0gZnJvbSAnLi9sb29wJztcbmltcG9ydCB7IE5ndEJlZm9yZVJlbmRlclJlY29yZCwgTmd0Q2FtZXJhLCBOZ3REcHIsIE5ndEV2ZW50TWFuYWdlciwgTmd0U2l6ZSwgTmd0U3RhdGUsIE5ndFZpZXdwb3J0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBpcyB9IGZyb20gJy4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgbWFrZURwciB9IGZyb20gJy4vdXRpbHMvbWFrZSc7XG5pbXBvcnQgeyBOZ3RTaWduYWxTdG9yZSwgc2lnbmFsU3RvcmUgfSBmcm9tICcuL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5pbXBvcnQgeyB1cGRhdGVDYW1lcmEgfSBmcm9tICcuL3V0aWxzL3VwZGF0ZSc7XG5cbmZ1bmN0aW9uIHN0b3JlRmFjdG9yeShwcmV2aW91c1N0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4gfCBudWxsKSB7XG5cdGNvbnN0IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblx0Y29uc3Qgd2luZG93ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cblx0aWYgKCF3aW5kb3cpIHtcblx0XHQvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBuZWVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgcGxhdGZvcm1zXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBbTkdUXSBXaW5kb3cgaXMgbm90IGF2YWlsYWJsZS5gKTtcblx0fVxuXG5cdGNvbnN0IGxvb3AgPSBpbmplY3RMb29wKCk7XG5cblx0Ly8gTk9URTogdXNpbmcgU3ViamVjdCBiZWNhdXNlIHdlIGRvIG5vdCBjYXJlIGFib3V0IGxhdGUtc3Vic2NyaWJlcnNcblx0Y29uc3QgcG9pbnRlck1pc3NlZCQgPSBuZXcgU3ViamVjdDxNb3VzZUV2ZW50PigpO1xuXG5cdGNvbnN0IHN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4gPSBzaWduYWxTdG9yZTxOZ3RTdGF0ZT4oKHsgZ2V0LCB1cGRhdGUgfSkgPT4ge1xuXHRcdGNvbnN0IHsgaW52YWxpZGF0ZSwgYWR2YW5jZSB9ID0gbG9vcDtcblxuXHRcdGNvbnN0IHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCBkZWZhdWx0VGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCB0ZW1wVGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZ1bmN0aW9uIGdldEN1cnJlbnRWaWV3cG9ydChcblx0XHRcdGNhbWVyYTogTmd0Q2FtZXJhID0gZ2V0KCdjYW1lcmEnKSxcblx0XHRcdHRhcmdldDogVmVjdG9yMyB8IFBhcmFtZXRlcnM8VmVjdG9yM1snc2V0J10+ID0gZGVmYXVsdFRhcmdldCxcblx0XHRcdHNpemU6IE5ndFNpemUgPSBnZXQoJ3NpemUnKSxcblx0XHQpOiBPbWl0PE5ndFZpZXdwb3J0LCAnZHByJyB8ICdpbml0aWFsRHByJz4ge1xuXHRcdFx0Y29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB0b3AsIGxlZnQgfSA9IHNpemU7XG5cdFx0XHRjb25zdCBhc3BlY3QgPSB3aWR0aCAvIGhlaWdodDtcblxuXHRcdFx0aWYgKHRhcmdldCBpbnN0YW5jZW9mIFZlY3RvcjMpIHRlbXBUYXJnZXQuY29weSh0YXJnZXQpO1xuXHRcdFx0ZWxzZSB0ZW1wVGFyZ2V0LnNldCguLi50YXJnZXQpO1xuXG5cdFx0XHRjb25zdCBkaXN0YW5jZSA9IGNhbWVyYS5nZXRXb3JsZFBvc2l0aW9uKHBvc2l0aW9uKS5kaXN0YW5jZVRvKHRlbXBUYXJnZXQpO1xuXG5cdFx0XHRpZiAoaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkpIHtcblx0XHRcdFx0cmV0dXJuIHsgd2lkdGg6IHdpZHRoIC8gY2FtZXJhLnpvb20sIGhlaWdodDogaGVpZ2h0IC8gY2FtZXJhLnpvb20sIHRvcCwgbGVmdCwgZmFjdG9yOiAxLCBkaXN0YW5jZSwgYXNwZWN0IH07XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZvdiA9IChjYW1lcmEuZm92ICogTWF0aC5QSSkgLyAxODA7IC8vIGNvbnZlcnQgdmVydGljYWwgZm92IHRvIHJhZGlhbnNcblx0XHRcdGNvbnN0IGggPSAyICogTWF0aC50YW4oZm92IC8gMikgKiBkaXN0YW5jZTsgLy8gdmlzaWJsZSBoZWlnaHRcblx0XHRcdGNvbnN0IHcgPSBoICogKHdpZHRoIC8gaGVpZ2h0KTtcblx0XHRcdHJldHVybiB7IHdpZHRoOiB3LCBoZWlnaHQ6IGgsIHRvcCwgbGVmdCwgZmFjdG9yOiB3aWR0aCAvIHcsIGRpc3RhbmNlLCBhc3BlY3QgfTtcblx0XHR9XG5cblx0XHRsZXQgcGVyZm9ybWFuY2VUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblx0XHRjb25zdCBzZXRQZXJmb3JtYW5jZUN1cnJlbnQgPSAoY3VycmVudDogbnVtYmVyKSA9PlxuXHRcdFx0dXBkYXRlKChzdGF0ZSkgPT4gKHsgcGVyZm9ybWFuY2U6IHsgLi4uc3RhdGUucGVyZm9ybWFuY2UsIGN1cnJlbnQgfSB9KSk7XG5cblx0XHRjb25zdCBwb2ludGVyID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRwb2ludGVyTWlzc2VkJDogcG9pbnRlck1pc3NlZCQuYXNPYnNlcnZhYmxlKCksXG5cdFx0XHRldmVudHM6IHsgcHJpb3JpdHk6IDEsIGVuYWJsZWQ6IHRydWUsIGNvbm5lY3RlZDogZmFsc2UgfSxcblxuXHRcdFx0aW52YWxpZGF0ZTogKGZyYW1lcyA9IDEpID0+IGludmFsaWRhdGUoc3RvcmUsIGZyYW1lcyksXG5cdFx0XHRhZHZhbmNlOiAodGltZXN0YW1wOiBudW1iZXIsIHJ1bkdsb2JhbEVmZmVjdHM/OiBib29sZWFuKSA9PiBhZHZhbmNlKHRpbWVzdGFtcCwgcnVuR2xvYmFsRWZmZWN0cywgc3RvcmUpLFxuXG5cdFx0XHRsZWdhY3k6IGZhbHNlLFxuXHRcdFx0bGluZWFyOiBmYWxzZSxcblx0XHRcdGZsYXQ6IGZhbHNlLFxuXG5cdFx0XHRjb250cm9sczogbnVsbCxcblx0XHRcdGNsb2NrOiBuZXcgQ2xvY2soKSxcblx0XHRcdHBvaW50ZXIsXG5cblx0XHRcdGZyYW1lbG9vcDogJ2Fsd2F5cycsXG5cblx0XHRcdHBlcmZvcm1hbmNlOiB7XG5cdFx0XHRcdGN1cnJlbnQ6IDEsXG5cdFx0XHRcdG1pbjogMC41LFxuXHRcdFx0XHRtYXg6IDEsXG5cdFx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRcdHJlZ3Jlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBzdGF0ZSA9IGdldCgpO1xuXHRcdFx0XHRcdC8vIENsZWFyIHRpbWVvdXRcblx0XHRcdFx0XHRpZiAocGVyZm9ybWFuY2VUaW1lb3V0KSBjbGVhclRpbWVvdXQocGVyZm9ybWFuY2VUaW1lb3V0KTtcblx0XHRcdFx0XHQvLyBTZXQgbG93ZXIgYm91bmQgcGVyZm9ybWFuY2Vcblx0XHRcdFx0XHRpZiAoc3RhdGUucGVyZm9ybWFuY2UuY3VycmVudCAhPT0gc3RhdGUucGVyZm9ybWFuY2UubWluKSBzZXRQZXJmb3JtYW5jZUN1cnJlbnQoc3RhdGUucGVyZm9ybWFuY2UubWluKTtcblx0XHRcdFx0XHQvLyBHbyBiYWNrIHRvIHVwcGVyIGJvdW5kIHBlcmZvcm1hbmNlIGFmdGVyIGEgd2hpbGUgdW5sZXNzIHNvbWV0aGluZyByZWdyZXNzZXMgbWVhbndoaWxlXG5cdFx0XHRcdFx0cGVyZm9ybWFuY2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0XHRzZXRQZXJmb3JtYW5jZUN1cnJlbnQoZ2V0KCdwZXJmb3JtYW5jZScsICdtYXgnKSk7XG5cdFx0XHRcdFx0XHQvLyBzYWZlRGV0ZWN0Q2hhbmdlcyhjZHIpO1xuXHRcdFx0XHRcdH0sIHN0YXRlLnBlcmZvcm1hbmNlLmRlYm91bmNlKTtcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cblx0XHRcdHNpemU6IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwLCB1cGRhdGVTdHlsZTogZmFsc2UgfSxcblx0XHRcdHZpZXdwb3J0OiB7XG5cdFx0XHRcdGluaXRpYWxEcHI6IDAsXG5cdFx0XHRcdGRwcjogMCxcblx0XHRcdFx0d2lkdGg6IDAsXG5cdFx0XHRcdGhlaWdodDogMCxcblx0XHRcdFx0dG9wOiAwLFxuXHRcdFx0XHRsZWZ0OiAwLFxuXHRcdFx0XHRhc3BlY3Q6IDAsXG5cdFx0XHRcdGRpc3RhbmNlOiAwLFxuXHRcdFx0XHRmYWN0b3I6IDAsXG5cdFx0XHRcdGdldEN1cnJlbnRWaWV3cG9ydCxcblx0XHRcdH0sXG5cblx0XHRcdHNldEV2ZW50czogKGV2ZW50czogUGFydGlhbDxOZ3RFdmVudE1hbmFnZXI8YW55Pj4pID0+XG5cdFx0XHRcdHVwZGF0ZSgoc3RhdGUpID0+ICh7IC4uLnN0YXRlLCBldmVudHM6IHsgLi4uc3RhdGUuZXZlbnRzLCAuLi5ldmVudHMgfSB9KSksXG5cdFx0XHRzZXRTaXplOiAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHRvcD86IG51bWJlciwgbGVmdD86IG51bWJlcikgPT4ge1xuXHRcdFx0XHRjb25zdCBjYW1lcmEgPSBnZXQoJ2NhbWVyYScpO1xuXHRcdFx0XHRjb25zdCBzaXplID0geyB3aWR0aCwgaGVpZ2h0LCB0b3A6IHRvcCB8fCAwLCBsZWZ0OiBsZWZ0IHx8IDAgfTtcblx0XHRcdFx0dXBkYXRlKChzdGF0ZSkgPT4gKHtcblx0XHRcdFx0XHRzaXplLFxuXHRcdFx0XHRcdHZpZXdwb3J0OiB7IC4uLnN0YXRlLnZpZXdwb3J0LCAuLi5nZXRDdXJyZW50Vmlld3BvcnQoY2FtZXJhLCBkZWZhdWx0VGFyZ2V0LCBzaXplKSB9LFxuXHRcdFx0XHR9KSk7XG5cdFx0XHR9LFxuXHRcdFx0c2V0RHByOiAoZHByOiBOZ3REcHIpID0+XG5cdFx0XHRcdHVwZGF0ZSgoc3RhdGUpID0+IHtcblx0XHRcdFx0XHRjb25zdCByZXNvbHZlZCA9IG1ha2VEcHIoZHByLCB3aW5kb3cpO1xuXHRcdFx0XHRcdHJldHVybiB7IHZpZXdwb3J0OiB7IC4uLnN0YXRlLnZpZXdwb3J0LCBkcHI6IHJlc29sdmVkLCBpbml0aWFsRHByOiBzdGF0ZS52aWV3cG9ydC5pbml0aWFsRHByIHx8IHJlc29sdmVkIH0gfTtcblx0XHRcdFx0fSksXG5cdFx0XHRzZXRGcmFtZWxvb3A6IChmcmFtZWxvb3A6ICdhbHdheXMnIHwgJ2RlbWFuZCcgfCAnbmV2ZXInID0gJ2Fsd2F5cycpID0+IHtcblx0XHRcdFx0Y29uc3QgY2xvY2sgPSBnZXQoJ2Nsb2NrJyk7XG5cblx0XHRcdFx0Ly8gaWYgZnJhbWVsb29wID09PSBcIm5ldmVyXCIgY2xvY2suZWxhcHNlZFRpbWUgaXMgdXBkYXRlZCB1c2luZyBhZHZhbmNlKHRpbWVzdGFtcClcblx0XHRcdFx0Y2xvY2suc3RvcCgpO1xuXHRcdFx0XHRjbG9jay5lbGFwc2VkVGltZSA9IDA7XG5cblx0XHRcdFx0aWYgKGZyYW1lbG9vcCAhPT0gJ25ldmVyJykge1xuXHRcdFx0XHRcdGNsb2NrLnN0YXJ0KCk7XG5cdFx0XHRcdFx0Y2xvY2suZWxhcHNlZFRpbWUgPSAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dXBkYXRlKCgpID0+ICh7IGZyYW1lbG9vcCB9KSk7XG5cdFx0XHR9LFxuXG5cdFx0XHRwcmV2aW91c1Jvb3Q6IHByZXZpb3VzU3RvcmUsXG5cdFx0XHRpbnRlcm5hbDoge1xuXHRcdFx0XHRhY3RpdmU6IGZhbHNlLFxuXHRcdFx0XHRwcmlvcml0eTogMCxcblx0XHRcdFx0ZnJhbWVzOiAwLFxuXHRcdFx0XHRsYXN0RXZlbnQ6IG5ldyBFbGVtZW50UmVmKG51bGwpLFxuXHRcdFx0XHRpbnRlcmFjdGlvbjogW10sXG5cdFx0XHRcdGhvdmVyZWQ6IG5ldyBNYXAoKSxcblx0XHRcdFx0c3Vic2NyaWJlcnM6IFtdLFxuXHRcdFx0XHRpbml0aWFsQ2xpY2s6IFswLCAwXSxcblx0XHRcdFx0aW5pdGlhbEhpdHM6IFtdLFxuXHRcdFx0XHRjYXB0dXJlZE1hcDogbmV3IE1hcCgpLFxuXHRcdFx0XHRzdWJzY3JpYmU6IChcblx0XHRcdFx0XHRjYWxsYmFjazogTmd0QmVmb3JlUmVuZGVyUmVjb3JkWydjYWxsYmFjayddLFxuXHRcdFx0XHRcdHByaW9yaXR5ID0gMCxcblx0XHRcdFx0XHRfc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiA9IHN0b3JlLFxuXHRcdFx0XHQpID0+IHtcblx0XHRcdFx0XHRjb25zdCBpbnRlcm5hbCA9IGdldCgnaW50ZXJuYWwnKTtcblx0XHRcdFx0XHQvLyBJZiB0aGlzIHN1YnNjcmlwdGlvbiB3YXMgZ2l2ZW4gYSBwcmlvcml0eSwgaXQgdGFrZXMgcmVuZGVyaW5nIGludG8gaXRzIG93biBoYW5kc1xuXHRcdFx0XHRcdC8vIEZvciB0aGF0IHJlYXNvbiB3ZSBzd2l0Y2ggb2ZmIGF1dG9tYXRpYyByZW5kZXJpbmcgYW5kIGluY3JlYXNlIHRoZSBtYW51YWwgZmxhZ1xuXHRcdFx0XHRcdC8vIEFzIGxvbmcgYXMgdGhpcyBmbGFnIGlzIHBvc2l0aXZlIHRoZXJlIGNhbiBiZSBubyBpbnRlcm5hbCByZW5kZXJpbmcgYXQgYWxsXG5cdFx0XHRcdFx0Ly8gYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSByZW5kZXIgc3Vic2NyaXB0aW9uc1xuXHRcdFx0XHRcdGludGVybmFsLnByaW9yaXR5ID0gaW50ZXJuYWwucHJpb3JpdHkgKyAocHJpb3JpdHkgPiAwID8gMSA6IDApO1xuXHRcdFx0XHRcdGludGVybmFsLnN1YnNjcmliZXJzLnB1c2goeyBjYWxsYmFjaywgcHJpb3JpdHksIHN0b3JlOiBfc3RvcmUgfSk7XG5cdFx0XHRcdFx0Ly8gUmVnaXN0ZXIgc3Vic2NyaWJlciBhbmQgc29ydCBsYXllcnMgZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCwgbWVhbmluZyxcblx0XHRcdFx0XHQvLyBoaWdoZXN0IHByaW9yaXR5IHJlbmRlcnMgbGFzdCAob24gdG9wIG9mIHRoZSBvdGhlciBmcmFtZXMpXG5cdFx0XHRcdFx0aW50ZXJuYWwuc3Vic2NyaWJlcnMgPSBpbnRlcm5hbC5zdWJzY3JpYmVycy5zb3J0KChhLCBiKSA9PiAoYS5wcmlvcml0eSB8fCAwKSAtIChiLnByaW9yaXR5IHx8IDApKTtcblxuXHRcdFx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBpbnRlcm5hbCA9IGdldCgnaW50ZXJuYWwnKTtcblx0XHRcdFx0XHRcdGlmIChpbnRlcm5hbD8uc3Vic2NyaWJlcnMpIHtcblx0XHRcdFx0XHRcdFx0Ly8gRGVjcmVhc2UgbWFudWFsIGZsYWcgaWYgdGhpcyBzdWJzY3JpcHRpb24gaGFkIGEgcHJpb3JpdHlcblx0XHRcdFx0XHRcdFx0aW50ZXJuYWwucHJpb3JpdHkgPSBpbnRlcm5hbC5wcmlvcml0eSAtIChwcmlvcml0eSA+IDAgPyAxIDogMCk7XG5cdFx0XHRcdFx0XHRcdC8vIFJlbW92ZSBzdWJzY3JpYmVyIGZyb20gbGlzdFxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbC5zdWJzY3JpYmVycyA9IGludGVybmFsLnN1YnNjcmliZXJzLmZpbHRlcigocykgPT4gcy5jYWxsYmFjayAhPT0gY2FsbGJhY2spO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdH07XG5cdH0pO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdG9yZSwgJ3BvaW50ZXJNaXNzZWQkJywgeyBnZXQ6ICgpID0+IHBvaW50ZXJNaXNzZWQkIH0pO1xuXG5cdGxldCB7XG5cdFx0c2l6ZTogb2xkU2l6ZSxcblx0XHR2aWV3cG9ydDogeyBkcHI6IG9sZERwciB9LFxuXHRcdGNhbWVyYTogb2xkQ2FtZXJhLFxuXHR9ID0gc3RvcmUuc25hcHNob3Q7XG5cblx0ZWZmZWN0KCgpID0+IHtcblx0XHRjb25zdCB7XG5cdFx0XHRjYW1lcmE6IG5ld0NhbWVyYSxcblx0XHRcdHNpemU6IG5ld1NpemUsXG5cdFx0XHR2aWV3cG9ydDogeyBkcHI6IG5ld0RwciB9LFxuXHRcdFx0Z2wsXG5cdFx0fSA9IHN0b3JlLnN0YXRlKCk7XG5cblx0XHQvLyBSZXNpemUgY2FtZXJhIGFuZCByZW5kZXJlciBvbiBjaGFuZ2VzIHRvIHNpemUgYW5kIHBpeGVsLXJhdGlvXG5cdFx0aWYgKG5ld1NpemUgIT09IG9sZFNpemUgfHwgbmV3RHByICE9PSBvbGREcHIpIHtcblx0XHRcdG9sZFNpemUgPSBuZXdTaXplO1xuXHRcdFx0b2xkRHByID0gbmV3RHByO1xuXHRcdFx0Ly8gVXBkYXRlIGNhbWVyYSAmIHJlbmRlcmVyXG5cdFx0XHR1cGRhdGVDYW1lcmEobmV3Q2FtZXJhLCBuZXdTaXplKTtcblx0XHRcdGdsLnNldFBpeGVsUmF0aW8obmV3RHByKTtcblxuXHRcdFx0Y29uc3QgdXBkYXRlU3R5bGUgPSB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGdsLmRvbUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudDtcblx0XHRcdGdsLnNldFNpemUobmV3U2l6ZS53aWR0aCwgbmV3U2l6ZS5oZWlnaHQsIHVwZGF0ZVN0eWxlKTtcblx0XHR9XG5cblx0XHQvLyBVcGRhdGUgdmlld3BvcnQgb25jZSB0aGUgY2FtZXJhIGNoYW5nZXNcblx0XHRpZiAobmV3Q2FtZXJhICE9PSBvbGRDYW1lcmEpIHtcblx0XHRcdG9sZENhbWVyYSA9IG5ld0NhbWVyYTtcblx0XHRcdHVwZGF0ZUNhbWVyYShuZXdDYW1lcmEsIG5ld1NpemUpO1xuXHRcdFx0Ly8gVXBkYXRlIHZpZXdwb3J0XG5cdFx0XHRzdG9yZS51cGRhdGUoKHN0YXRlKSA9PiAoeyB2aWV3cG9ydDogeyAuLi5zdGF0ZS52aWV3cG9ydCwgLi4uc3RhdGUudmlld3BvcnQuZ2V0Q3VycmVudFZpZXdwb3J0KG5ld0NhbWVyYSkgfSB9KSk7XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gc3RvcmU7XG59XG5cbmV4cG9ydCBjb25zdCBOR1RfU1RPUkUgPSBuZXcgSW5qZWN0aW9uVG9rZW48Tmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+PignTmd0U3RvcmUgVG9rZW4nKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVTdG9yZShzdG9yZT86ICgpID0+IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPikge1xuXHRpZiAoc3RvcmUpIHtcblx0XHRyZXR1cm4geyBwcm92aWRlOiBOR1RfU1RPUkUsIHVzZUZhY3Rvcnk6IHN0b3JlIH07XG5cdH1cblx0cmV0dXJuIHsgcHJvdmlkZTogTkdUX1NUT1JFLCB1c2VGYWN0b3J5OiBzdG9yZUZhY3RvcnkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFN0b3JlKG9wdGlvbnM6IEluamVjdE9wdGlvbnMgJiB7IG9wdGlvbmFsPzogZmFsc2UgfSk6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPjtcbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RTdG9yZShvcHRpb25zOiBJbmplY3RPcHRpb25zKTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RTdG9yZSgpOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT47XG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0U3RvcmUob3B0aW9ucz86IEluamVjdE9wdGlvbnMpIHtcblx0cmV0dXJuIGluamVjdChOR1RfU1RPUkUsIG9wdGlvbnMgYXMgSW5qZWN0T3B0aW9ucyk7XG59XG4iXX0=
|