angular-three 1.9.16 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/canvas.mjs +243 -0
- package/esm2022/lib/directives/args.mjs +36 -0
- package/esm2022/lib/directives/common.mjs +32 -0
- package/esm2022/lib/directives/parent.mjs +36 -0
- package/esm2022/lib/directives/repeat.mjs +18 -0
- package/esm2022/lib/loader.mjs +55 -0
- package/esm2022/lib/pipes/push.mjs +50 -0
- package/esm2022/lib/portal.mjs +240 -0
- package/esm2022/lib/renderer/renderer.mjs +361 -0
- package/esm2022/lib/routed-scene.mjs +29 -0
- package/esm2022/lib/stores/rx-store.mjs +108 -0
- package/esm2022/lib/stores/store.mjs +404 -0
- package/esm2022/lib/types.mjs +2 -0
- package/esm2022/lib/utils/apply-props.mjs +107 -0
- package/esm2022/lib/utils/is.mjs +51 -0
- package/{fesm2020 → fesm2022}/angular-three.mjs +78 -61
- package/fesm2022/angular-three.mjs.map +1 -0
- package/lib/canvas.d.ts +1 -1
- package/lib/directives/args.d.ts +1 -1
- package/lib/directives/parent.d.ts +1 -1
- package/lib/directives/repeat.d.ts +1 -1
- package/lib/loader.d.ts +3 -11
- package/lib/portal.d.ts +2 -2
- package/lib/types.d.ts +91 -120
- package/lib/utils/is.d.ts +6 -1
- package/metadata.json +1 -0
- package/package.json +13 -17
- package/plugin/package.json +1 -4
- package/plugin/src/generators/init/compat.js +1 -1
- package/plugin/src/generators/init/compat.js.map +1 -1
- package/plugin/src/generators/init/init.d.ts +3 -3
- package/plugin/src/generators/init/init.js +23 -3
- package/plugin/src/generators/init/init.js.map +1 -1
- package/web-types.json +1 -0
- package/esm2020/lib/canvas.mjs +0 -242
- package/esm2020/lib/directives/args.mjs +0 -35
- package/esm2020/lib/directives/common.mjs +0 -31
- package/esm2020/lib/directives/parent.mjs +0 -35
- package/esm2020/lib/directives/repeat.mjs +0 -17
- package/esm2020/lib/loader.mjs +0 -56
- package/esm2020/lib/pipes/push.mjs +0 -49
- package/esm2020/lib/portal.mjs +0 -237
- package/esm2020/lib/renderer/renderer.mjs +0 -360
- package/esm2020/lib/routed-scene.mjs +0 -28
- package/esm2020/lib/stores/rx-store.mjs +0 -107
- package/esm2020/lib/stores/store.mjs +0 -402
- package/esm2020/lib/types.mjs +0 -2
- package/esm2020/lib/utils/apply-props.mjs +0 -91
- package/esm2020/lib/utils/is.mjs +0 -50
- package/fesm2015/angular-three.mjs +0 -3051
- package/fesm2015/angular-three.mjs.map +0 -1
- package/fesm2020/angular-three.mjs.map +0 -1
- /package/{esm2020 → esm2022}/angular-three.mjs +0 -0
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/di/before-render.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/di/catalogue.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/di/destroy.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/di/ref.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/di/run-in-context.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/loop.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/renderer/di.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/renderer/enums.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/renderer/provider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/renderer/store.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/renderer/utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/attach.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/instance.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/make.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/safe-detect-changes.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/update.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/web/events.mjs +0 -0
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { inject, Injectable } from '@angular/core';
|
|
3
|
+
import { combineLatest } from 'rxjs';
|
|
4
|
+
import * as THREE from 'three';
|
|
5
|
+
import { createLoop } from '../loop';
|
|
6
|
+
import { applyProps } from '../utils/apply-props';
|
|
7
|
+
import { prepare } from '../utils/instance';
|
|
8
|
+
import { is } from '../utils/is';
|
|
9
|
+
import { makeDefaultCamera, makeDefaultRenderer, makeDpr } from '../utils/make';
|
|
10
|
+
import { checkNeedsUpdate, updateCamera } from '../utils/update';
|
|
11
|
+
import { NgtRxStore } from './rx-store';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
export const rootStateMap = new Map();
|
|
14
|
+
const { invalidate, advance } = createLoop(rootStateMap);
|
|
15
|
+
const shallowLoose = { objects: 'shallow', strict: false };
|
|
16
|
+
class NgtStore extends NgtRxStore {
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...arguments);
|
|
19
|
+
this.parentStore = inject(NgtStore, { optional: true, skipSelf: true });
|
|
20
|
+
this.window = inject(DOCUMENT).defaultView;
|
|
21
|
+
this.isInit = false;
|
|
22
|
+
}
|
|
23
|
+
init() {
|
|
24
|
+
if (!this.isInit) {
|
|
25
|
+
const position = new THREE.Vector3();
|
|
26
|
+
const defaultTarget = new THREE.Vector3();
|
|
27
|
+
const tempTarget = new THREE.Vector3();
|
|
28
|
+
const getCurrentViewport = (camera = this.get('camera'), target = defaultTarget, size = this.get('size')) => {
|
|
29
|
+
const { width, height, top, left } = size;
|
|
30
|
+
const aspect = width / height;
|
|
31
|
+
if (target instanceof THREE.Vector3)
|
|
32
|
+
tempTarget.copy(target);
|
|
33
|
+
else
|
|
34
|
+
tempTarget.set(...target);
|
|
35
|
+
const distance = camera.getWorldPosition(position).distanceTo(tempTarget);
|
|
36
|
+
if (is.orthographicCamera(camera)) {
|
|
37
|
+
return {
|
|
38
|
+
width: width / camera.zoom,
|
|
39
|
+
height: height / camera.zoom,
|
|
40
|
+
top,
|
|
41
|
+
left,
|
|
42
|
+
factor: 1,
|
|
43
|
+
distance,
|
|
44
|
+
aspect,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
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 * aspect;
|
|
50
|
+
return { width: w, height: h, top, left, factor: width / w, distance, aspect };
|
|
51
|
+
};
|
|
52
|
+
let performanceTimeout;
|
|
53
|
+
const setPerformanceCurrent = (current) => {
|
|
54
|
+
this.set((state) => ({ performance: { ...state.performance, current } }));
|
|
55
|
+
};
|
|
56
|
+
this.set({
|
|
57
|
+
get: this.get.bind(this),
|
|
58
|
+
set: this.set.bind(this),
|
|
59
|
+
select: this.select.bind(this),
|
|
60
|
+
ready: false,
|
|
61
|
+
scene: prepare(new THREE.Scene(), { store: this }),
|
|
62
|
+
events: { priority: 1, enabled: true, connected: false },
|
|
63
|
+
invalidate: (frames = 1) => invalidate(this, frames),
|
|
64
|
+
advance: (timestamp, runGlobalEffects) => advance(timestamp, runGlobalEffects, this),
|
|
65
|
+
legacy: false,
|
|
66
|
+
linear: false,
|
|
67
|
+
flat: false,
|
|
68
|
+
controls: null,
|
|
69
|
+
clock: new THREE.Clock(),
|
|
70
|
+
pointer: new THREE.Vector2(),
|
|
71
|
+
frameloop: 'always',
|
|
72
|
+
performance: {
|
|
73
|
+
current: 1,
|
|
74
|
+
min: 0.5,
|
|
75
|
+
max: 1,
|
|
76
|
+
debounce: 200,
|
|
77
|
+
regress: () => {
|
|
78
|
+
const state = this.get();
|
|
79
|
+
// clear timeout
|
|
80
|
+
if (performanceTimeout)
|
|
81
|
+
clearTimeout(performanceTimeout);
|
|
82
|
+
// set lower bound
|
|
83
|
+
if (state.performance.current !== state.performance.min) {
|
|
84
|
+
setPerformanceCurrent(state.performance.min);
|
|
85
|
+
}
|
|
86
|
+
// go back to upper bound
|
|
87
|
+
performanceTimeout = setTimeout(() => setPerformanceCurrent(this.get('performance', 'max') || 1), state.performance.debounce);
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
size: { width: 0, height: 0, top: 0, left: 0 },
|
|
91
|
+
viewport: {
|
|
92
|
+
initialDpr: 0,
|
|
93
|
+
dpr: 0,
|
|
94
|
+
width: 0,
|
|
95
|
+
height: 0,
|
|
96
|
+
top: 0,
|
|
97
|
+
left: 0,
|
|
98
|
+
aspect: 0,
|
|
99
|
+
distance: 0,
|
|
100
|
+
factor: 0,
|
|
101
|
+
getCurrentViewport,
|
|
102
|
+
},
|
|
103
|
+
previousStore: this.parentStore,
|
|
104
|
+
internal: {
|
|
105
|
+
active: false,
|
|
106
|
+
priority: 0,
|
|
107
|
+
frames: 0,
|
|
108
|
+
lastEvent: null,
|
|
109
|
+
interaction: [],
|
|
110
|
+
hovered: new Map(),
|
|
111
|
+
subscribers: [],
|
|
112
|
+
initialClick: [0, 0],
|
|
113
|
+
initialHits: [],
|
|
114
|
+
capturedMap: new Map(),
|
|
115
|
+
subscribe: (callback, priority = 0, store = this) => {
|
|
116
|
+
const internal = this.get('internal');
|
|
117
|
+
// If this subscription was given a priority, it takes rendering into its own hands
|
|
118
|
+
// For that reason we switch off automatic rendering and increase the manual flag
|
|
119
|
+
// As long as this flag is positive there can be no internal rendering at all
|
|
120
|
+
// because there could be multiple render subscriptions
|
|
121
|
+
internal.priority = internal.priority + (priority > 0 ? 1 : 0);
|
|
122
|
+
internal.subscribers.push({ priority, store, callback });
|
|
123
|
+
// Register subscriber and sort layers from lowest to highest, meaning,
|
|
124
|
+
// highest priority renders last (on top of the other frames)
|
|
125
|
+
internal.subscribers.sort((a, b) => (a.priority || 0) - (b.priority || 0));
|
|
126
|
+
return () => {
|
|
127
|
+
const internal = this.get('internal');
|
|
128
|
+
if (internal?.subscribers) {
|
|
129
|
+
// Decrease manual flag if this subscription had a priority
|
|
130
|
+
internal.priority = internal.priority - (priority > 0 ? 1 : 0);
|
|
131
|
+
// Remove subscriber from list
|
|
132
|
+
internal.subscribers = internal.subscribers.filter((s) => s.callback !== callback);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
setEvents: (events) => {
|
|
138
|
+
this.set((state) => ({ events: { ...state.events, ...events } }));
|
|
139
|
+
},
|
|
140
|
+
setSize: (width, height, top, left) => {
|
|
141
|
+
const camera = this.get('camera');
|
|
142
|
+
const size = { width, height, top: top || 0, left: left || 0 };
|
|
143
|
+
this.set((state) => ({
|
|
144
|
+
size,
|
|
145
|
+
viewport: { ...state.viewport, ...getCurrentViewport(camera, defaultTarget, size) },
|
|
146
|
+
}));
|
|
147
|
+
},
|
|
148
|
+
setDpr: (dpr) => {
|
|
149
|
+
const resolved = makeDpr(dpr, this.window);
|
|
150
|
+
this.set((state) => ({
|
|
151
|
+
viewport: {
|
|
152
|
+
...state.viewport,
|
|
153
|
+
dpr: resolved,
|
|
154
|
+
initialDpr: state.viewport.initialDpr || resolved,
|
|
155
|
+
},
|
|
156
|
+
}));
|
|
157
|
+
},
|
|
158
|
+
setFrameloop: (frameloop = 'always') => {
|
|
159
|
+
const clock = this.get('clock');
|
|
160
|
+
clock.stop();
|
|
161
|
+
clock.elapsedTime = 0;
|
|
162
|
+
if (frameloop !== 'never') {
|
|
163
|
+
clock.start();
|
|
164
|
+
clock.elapsedTime = 0;
|
|
165
|
+
}
|
|
166
|
+
this.set({ frameloop });
|
|
167
|
+
},
|
|
168
|
+
addInteraction: (interaction) => {
|
|
169
|
+
this.set((state) => ({
|
|
170
|
+
internal: { ...state.internal, interaction: [...state.internal.interaction, interaction] },
|
|
171
|
+
}));
|
|
172
|
+
},
|
|
173
|
+
removeInteraction: (uuid) => {
|
|
174
|
+
this.set((state) => ({
|
|
175
|
+
internal: {
|
|
176
|
+
...state.internal,
|
|
177
|
+
interaction: state.internal.interaction.filter((interaction) => interaction.uuid !== uuid),
|
|
178
|
+
},
|
|
179
|
+
}));
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
this.isInit = true;
|
|
183
|
+
this.resize();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
configure(inputs, canvasElement) {
|
|
187
|
+
const { gl: glOptions, size: sizeOptions, camera: cameraOptions, raycaster: raycasterOptions, events, orthographic, lookAt, shadows, linear, legacy, flat, dpr, frameloop, performance, } = inputs;
|
|
188
|
+
const state = this.get();
|
|
189
|
+
const stateToUpdate = {};
|
|
190
|
+
// setup renderer
|
|
191
|
+
let gl = state.gl;
|
|
192
|
+
if (!state.gl)
|
|
193
|
+
stateToUpdate.gl = gl = makeDefaultRenderer(glOptions, canvasElement);
|
|
194
|
+
// setup raycaster
|
|
195
|
+
let raycaster = state.raycaster;
|
|
196
|
+
if (!raycaster)
|
|
197
|
+
stateToUpdate.raycaster = raycaster = new THREE.Raycaster();
|
|
198
|
+
// set raycaster options
|
|
199
|
+
const { params, ...options } = raycasterOptions || {};
|
|
200
|
+
if (!is.equ(options, raycaster, shallowLoose))
|
|
201
|
+
applyProps(raycaster, { ...options });
|
|
202
|
+
if (!is.equ(params, raycaster.params, shallowLoose)) {
|
|
203
|
+
applyProps(raycaster, { params: { ...raycaster.params, ...(params || {}) } });
|
|
204
|
+
}
|
|
205
|
+
// create default camera
|
|
206
|
+
if (!state.camera) {
|
|
207
|
+
const isCamera = is.camera(cameraOptions);
|
|
208
|
+
let camera = isCamera ? cameraOptions : makeDefaultCamera(orthographic || false, state.size);
|
|
209
|
+
if (!isCamera) {
|
|
210
|
+
if (cameraOptions)
|
|
211
|
+
applyProps(camera, cameraOptions);
|
|
212
|
+
// set position.z
|
|
213
|
+
if (!cameraOptions?.position)
|
|
214
|
+
camera.position.z = 5;
|
|
215
|
+
// always look at center or passed-in lookAt by default
|
|
216
|
+
if (!cameraOptions?.rotation) {
|
|
217
|
+
if (Array.isArray(lookAt))
|
|
218
|
+
camera.lookAt(lookAt[0], lookAt[1], lookAt[2]);
|
|
219
|
+
else if (lookAt instanceof THREE.Vector3)
|
|
220
|
+
camera.lookAt(lookAt);
|
|
221
|
+
else
|
|
222
|
+
camera.lookAt(0, 0, 0);
|
|
223
|
+
}
|
|
224
|
+
// update projection matrix after applyprops
|
|
225
|
+
camera.updateProjectionMatrix?.();
|
|
226
|
+
}
|
|
227
|
+
if (!is.instance(camera))
|
|
228
|
+
camera = prepare(camera, { store: this });
|
|
229
|
+
stateToUpdate.camera = camera;
|
|
230
|
+
}
|
|
231
|
+
// Set up XR (one time only!)
|
|
232
|
+
if (!state.xr) {
|
|
233
|
+
// Handle frame behavior in WebXR
|
|
234
|
+
const handleXRFrame = (timestamp, frame) => {
|
|
235
|
+
const state = this.get();
|
|
236
|
+
if (state.frameloop === 'never')
|
|
237
|
+
return;
|
|
238
|
+
advance(timestamp, true, this, frame);
|
|
239
|
+
};
|
|
240
|
+
// Toggle render switching on session
|
|
241
|
+
const handleSessionChange = () => {
|
|
242
|
+
const state = this.get();
|
|
243
|
+
state.gl.xr.enabled = state.gl.xr.isPresenting;
|
|
244
|
+
state.gl.xr.setAnimationLoop(state.gl.xr.isPresenting ? handleXRFrame : null);
|
|
245
|
+
if (!state.gl.xr.isPresenting)
|
|
246
|
+
invalidate(this);
|
|
247
|
+
};
|
|
248
|
+
// WebXR session manager
|
|
249
|
+
const xr = {
|
|
250
|
+
connect: () => {
|
|
251
|
+
gl.xr.addEventListener('sessionstart', handleSessionChange);
|
|
252
|
+
gl.xr.addEventListener('sessionend', handleSessionChange);
|
|
253
|
+
},
|
|
254
|
+
disconnect: () => {
|
|
255
|
+
gl.xr.removeEventListener('sessionstart', handleSessionChange);
|
|
256
|
+
gl.xr.removeEventListener('sessionend', handleSessionChange);
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
// Subscribe to WebXR session events
|
|
260
|
+
if (gl.xr)
|
|
261
|
+
xr.connect();
|
|
262
|
+
stateToUpdate.xr = xr;
|
|
263
|
+
}
|
|
264
|
+
// Set shadowmap
|
|
265
|
+
if (gl.shadowMap) {
|
|
266
|
+
const isBoolean = typeof shadows === 'boolean';
|
|
267
|
+
if ((isBoolean && gl.shadowMap.enabled !== shadows) || !is.equ(shadows, gl.shadowMap, shallowLoose)) {
|
|
268
|
+
const old = gl.shadowMap.enabled;
|
|
269
|
+
gl.shadowMap.enabled = !!shadows;
|
|
270
|
+
if (!isBoolean)
|
|
271
|
+
Object.assign(gl.shadowMap, shadows);
|
|
272
|
+
else
|
|
273
|
+
gl.shadowMap.type = THREE.PCFSoftShadowMap;
|
|
274
|
+
if (old !== gl.shadowMap.enabled)
|
|
275
|
+
checkNeedsUpdate(gl.shadowMap);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Safely set color management if available.
|
|
279
|
+
// Avoid accessing THREE.ColorManagement to play nice with older versions
|
|
280
|
+
if (THREE.ColorManagement) {
|
|
281
|
+
const ColorManagement = THREE.ColorManagement;
|
|
282
|
+
if ('enabled' in ColorManagement)
|
|
283
|
+
ColorManagement['enabled'] = !legacy ?? false;
|
|
284
|
+
else if ('legacyMode' in ColorManagement)
|
|
285
|
+
ColorManagement['legacyMode'] = legacy ?? true;
|
|
286
|
+
}
|
|
287
|
+
// set color space and tonemapping preferences
|
|
288
|
+
const LinearEncoding = 3000;
|
|
289
|
+
const sRGBEncoding = 3001;
|
|
290
|
+
applyProps(gl, {
|
|
291
|
+
outputEncoding: linear ? LinearEncoding : sRGBEncoding,
|
|
292
|
+
toneMapping: flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping,
|
|
293
|
+
});
|
|
294
|
+
// Update color management state
|
|
295
|
+
if (state.legacy !== legacy)
|
|
296
|
+
stateToUpdate.legacy = legacy;
|
|
297
|
+
if (state.linear !== linear)
|
|
298
|
+
stateToUpdate.linear = linear;
|
|
299
|
+
if (state.flat !== flat)
|
|
300
|
+
stateToUpdate.flat = flat;
|
|
301
|
+
// Set gl props
|
|
302
|
+
gl.setClearAlpha(0);
|
|
303
|
+
gl.setPixelRatio(makeDpr(state.viewport.dpr));
|
|
304
|
+
gl.setSize(state.size.width, state.size.height);
|
|
305
|
+
if (is.obj(glOptions) &&
|
|
306
|
+
!(typeof glOptions === 'function') &&
|
|
307
|
+
!is.renderer(glOptions) &&
|
|
308
|
+
!is.equ(glOptions, gl, shallowLoose)) {
|
|
309
|
+
applyProps(gl, glOptions);
|
|
310
|
+
}
|
|
311
|
+
// Store events internally
|
|
312
|
+
if (events && !state.events.handlers)
|
|
313
|
+
stateToUpdate.events = events(this);
|
|
314
|
+
// Check performance
|
|
315
|
+
if (performance && !is.equ(performance, state.performance, shallowLoose)) {
|
|
316
|
+
stateToUpdate.performance = { ...state.performance, ...performance };
|
|
317
|
+
}
|
|
318
|
+
this.set(stateToUpdate);
|
|
319
|
+
// Check pixelratio
|
|
320
|
+
if (dpr && state.viewport.dpr !== makeDpr(dpr))
|
|
321
|
+
state.setDpr(dpr);
|
|
322
|
+
// Check size, allow it to take on container bounds initially
|
|
323
|
+
const size = computeInitialSize(canvasElement, sizeOptions);
|
|
324
|
+
if (!is.equ(size, state.size, shallowLoose))
|
|
325
|
+
state.setSize(size.width, size.height, size.top, size.left);
|
|
326
|
+
// Check frameloop
|
|
327
|
+
if (state.frameloop !== frameloop)
|
|
328
|
+
state.setFrameloop(frameloop);
|
|
329
|
+
if (!this.get('ready'))
|
|
330
|
+
this.set({ ready: true });
|
|
331
|
+
this.invalidate();
|
|
332
|
+
}
|
|
333
|
+
destroy(canvas) {
|
|
334
|
+
this.set((state) => ({ internal: { ...state.internal, active: false } }));
|
|
335
|
+
setTimeout(() => {
|
|
336
|
+
const { gl, xr, events } = this.get();
|
|
337
|
+
if (gl) {
|
|
338
|
+
if (events.disconnect) {
|
|
339
|
+
events.disconnect();
|
|
340
|
+
}
|
|
341
|
+
gl.renderLists.dispose();
|
|
342
|
+
gl.forceContextLoss();
|
|
343
|
+
if (gl.xr && gl.xr.enabled) {
|
|
344
|
+
gl.xr.setAnimationLoop(null);
|
|
345
|
+
xr.disconnect();
|
|
346
|
+
}
|
|
347
|
+
dispose(this.get());
|
|
348
|
+
rootStateMap.delete(canvas);
|
|
349
|
+
}
|
|
350
|
+
}, 500);
|
|
351
|
+
}
|
|
352
|
+
resize() {
|
|
353
|
+
const state = this.get();
|
|
354
|
+
let oldSize = state.size;
|
|
355
|
+
let oldDpr = state.viewport.dpr;
|
|
356
|
+
let oldCamera = state.camera;
|
|
357
|
+
this.hold(combineLatest([this.select('camera'), this.select('size'), this.select('viewport'), this.select('gl')]), ([camera, size, viewport, gl]) => {
|
|
358
|
+
// resize camera and renderer on changes to size and dpr
|
|
359
|
+
if (size !== oldSize || viewport.dpr !== oldDpr) {
|
|
360
|
+
oldSize = size;
|
|
361
|
+
oldDpr = viewport.dpr;
|
|
362
|
+
// update camera
|
|
363
|
+
updateCamera(camera, size);
|
|
364
|
+
gl.setPixelRatio(viewport.dpr);
|
|
365
|
+
gl.setSize(size.width, size.height);
|
|
366
|
+
}
|
|
367
|
+
// update viewport when camera changes
|
|
368
|
+
if (camera !== oldCamera) {
|
|
369
|
+
updateCamera(camera, size);
|
|
370
|
+
oldCamera = camera;
|
|
371
|
+
this.set((state) => ({
|
|
372
|
+
viewport: { ...state.viewport, ...state.viewport.getCurrentViewport(camera) },
|
|
373
|
+
}));
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
invalidate() {
|
|
378
|
+
this.hold(this.select(), () => invalidate(this));
|
|
379
|
+
}
|
|
380
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtStore, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
381
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtStore }); }
|
|
382
|
+
}
|
|
383
|
+
export { NgtStore };
|
|
384
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtStore, decorators: [{
|
|
385
|
+
type: Injectable
|
|
386
|
+
}] });
|
|
387
|
+
function computeInitialSize(canvas, defaultSize) {
|
|
388
|
+
if (defaultSize)
|
|
389
|
+
return defaultSize;
|
|
390
|
+
if (canvas instanceof HTMLCanvasElement && canvas.parentElement) {
|
|
391
|
+
return canvas.parentElement.getBoundingClientRect();
|
|
392
|
+
}
|
|
393
|
+
return { width: 0, height: 0, top: 0, left: 0 };
|
|
394
|
+
}
|
|
395
|
+
// Disposes an object and all its properties
|
|
396
|
+
function dispose(obj) {
|
|
397
|
+
if (obj.dispose && !is.scene(obj))
|
|
398
|
+
obj.dispose();
|
|
399
|
+
for (const p in obj) {
|
|
400
|
+
p.dispose?.();
|
|
401
|
+
delete obj[p];
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2xpYi9zdG9yZXMvc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQWFyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFFeEMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO0FBQ3JFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pELE1BQU0sWUFBWSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFrQixDQUFDO0FBRTNFLE1BQ2EsUUFBUyxTQUFRLFVBQW9CO0lBRGxEOztRQUVxQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxRQUFR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RCxFQUFFLFdBQXFCO0lBQ2hHLElBQUksV0FBVztRQUFFLE9BQU8sV0FBVyxDQUFDO0lBRXBDLElBQUksTUFBTSxZQUFZLGlCQUFpQixJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUU7UUFDN0QsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7S0FDdkQ7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3BELENBQUM7QUFFRCw0Q0FBNEM7QUFDNUMsU0FBUyxPQUFPLENBQTJFLEdBQVM7SUFDaEcsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakQsS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUU7UUFDaEIsQ0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDdkIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDakI7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBjcmVhdGVMb29wIH0gZnJvbSAnLi4vbG9vcCc7XG5pbXBvcnQgdHlwZSB7XG4gICAgTmd0QW55UmVjb3JkLFxuICAgIE5ndEJlZm9yZVJlbmRlclJlY29yZCxcbiAgICBOZ3RDYW1lcmFNYW51YWwsXG4gICAgTmd0Q2FudmFzSW5wdXRzLFxuICAgIE5ndERwcixcbiAgICBOZ3RFcXVDb25maWcsXG4gICAgTmd0RXZlbnRNYW5hZ2VyLFxuICAgIE5ndFNpemUsXG4gICAgTmd0U3RhdGUsXG4gICAgTmd0Vmlld3BvcnQsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGFwcGx5UHJvcHMgfSBmcm9tICcuLi91dGlscy9hcHBseS1wcm9wcyc7XG5pbXBvcnQgeyBwcmVwYXJlIH0gZnJvbSAnLi4vdXRpbHMvaW5zdGFuY2UnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuLi91dGlscy9pcyc7XG5pbXBvcnQgeyBtYWtlRGVmYXVsdENhbWVyYSwgbWFrZURlZmF1bHRSZW5kZXJlciwgbWFrZURwciB9IGZyb20gJy4uL3V0aWxzL21ha2UnO1xuaW1wb3J0IHsgY2hlY2tOZWVkc1VwZGF0ZSwgdXBkYXRlQ2FtZXJhIH0gZnJvbSAnLi4vdXRpbHMvdXBkYXRlJztcbmltcG9ydCB7IE5ndFJ4U3RvcmUgfSBmcm9tICcuL3J4LXN0b3JlJztcblxuZXhwb3J0IGNvbnN0IHJvb3RTdGF0ZU1hcCA9IG5ldyBNYXA8RWxlbWVudCwgTmd0UnhTdG9yZTxOZ3RTdGF0ZT4+KCk7XG5jb25zdCB7IGludmFsaWRhdGUsIGFkdmFuY2UgfSA9IGNyZWF0ZUxvb3Aocm9vdFN0YXRlTWFwKTtcbmNvbnN0IHNoYWxsb3dMb29zZSA9IHsgb2JqZWN0czogJ3NoYWxsb3cnLCBzdHJpY3Q6IGZhbHNlIH0gYXMgTmd0RXF1Q29uZmlnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmd0U3RvcmUgZXh0ZW5kcyBOZ3RSeFN0b3JlPE5ndFN0YXRlPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdG9yZSA9IGluamVjdChOZ3RTdG9yZSwgeyBvcHRpb25hbDogdHJ1ZSwgc2tpcFNlbGY6IHRydWUgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB3aW5kb3cgPSBpbmplY3QoRE9DVU1FTlQpLmRlZmF1bHRWaWV3IGFzIFdpbmRvdyAmIHR5cGVvZiBnbG9iYWxUaGlzO1xuXG4gICAgaXNJbml0ID0gZmFsc2U7XG5cbiAgICBpbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNJbml0KSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0VGFyZ2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBUYXJnZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuXG4gICAgICAgICAgICBjb25zdCBnZXRDdXJyZW50Vmlld3BvcnQgPSAoXG4gICAgICAgICAgICAgICAgY2FtZXJhID0gdGhpcy5nZXQoJ2NhbWVyYScpLFxuICAgICAgICAgICAgICAgIHRhcmdldDogVEhSRUUuVmVjdG9yMyB8IFBhcmFtZXRlcnM8VEhSRUUuVmVjdG9yM1snc2V0J10+ID0gZGVmYXVsdFRhcmdldCxcbiAgICAgICAgICAgICAgICBzaXplID0gdGhpcy5nZXQoJ3NpemUnKVxuICAgICAgICAgICAgKTogT21pdDxOZ3RWaWV3cG9ydCwgJ2RwcicgfCAnaW5pdGlhbERwcic+ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcCwgbGVmdCB9ID0gc2l6ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBhc3BlY3QgPSB3aWR0aCAvIGhlaWdodDtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVEhSRUUuVmVjdG9yMykgdGVtcFRhcmdldC5jb3B5KHRhcmdldCk7XG4gICAgICAgICAgICAgICAgZWxzZSB0ZW1wVGFyZ2V0LnNldCguLi50YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBjYW1lcmEuZ2V0V29ybGRQb3NpdGlvbihwb3NpdGlvbikuZGlzdGFuY2VUbyh0ZW1wVGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgIGlmIChpcy5vcnRob2dyYXBoaWNDYW1lcmEoY2FtZXJhKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoIC8gY2FtZXJhLnpvb20sXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCAvIGNhbWVyYS56b29tLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZvdiA9IChjYW1lcmEuZm92ICogTWF0aC5QSSkgLyAxODA7IC8vIGNvbnZlcnQgdmVydGljYWwgZm92IHRvIHJhZGlhbnNcbiAgICAgICAgICAgICAgICBjb25zdCBoID0gMiAqIE1hdGgudGFuKGZvdiAvIDIpICogZGlzdGFuY2U7IC8vIHZpc2libGUgaGVpZ2h0XG4gICAgICAgICAgICAgICAgY29uc3QgdyA9IGggKiBhc3BlY3Q7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IHcsIGhlaWdodDogaCwgdG9wLCBsZWZ0LCBmYWN0b3I6IHdpZHRoIC8gdywgZGlzdGFuY2UsIGFzcGVjdCB9O1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IHBlcmZvcm1hbmNlVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gICAgICAgICAgICBjb25zdCBzZXRQZXJmb3JtYW5jZUN1cnJlbnQgPSAoY3VycmVudDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoKHN0YXRlKSA9PiAoeyBwZXJmb3JtYW5jZTogeyAuLi5zdGF0ZS5wZXJmb3JtYW5jZSwgY3VycmVudCB9IH0pKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgICAgICBnZXQ6IHRoaXMuZ2V0LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgc2V0OiB0aGlzLnNldC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICAgIHNlbGVjdDogdGhpcy5zZWxlY3QuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICByZWFkeTogZmFsc2UsXG5cbiAgICAgICAgICAgICAgICBzY2VuZTogcHJlcGFyZShuZXcgVEhSRUUuU2NlbmUoKSwgeyBzdG9yZTogdGhpcyB9KSxcbiAgICAgICAgICAgICAgICBldmVudHM6IHsgcHJpb3JpdHk6IDEsIGVuYWJsZWQ6IHRydWUsIGNvbm5lY3RlZDogZmFsc2UgfSxcblxuICAgICAgICAgICAgICAgIGludmFsaWRhdGU6IChmcmFtZXMgPSAxKSA9PiBpbnZhbGlkYXRlKHRoaXMsIGZyYW1lcyksXG4gICAgICAgICAgICAgICAgYWR2YW5jZTogKHRpbWVzdGFtcDogbnVtYmVyLCBydW5HbG9iYWxFZmZlY3RzPzogYm9vbGVhbikgPT4gYWR2YW5jZSh0aW1lc3RhbXAsIHJ1bkdsb2JhbEVmZmVjdHMsIHRoaXMpLFxuXG4gICAgICAgICAgICAgICAgbGVnYWN5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsaW5lYXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZsYXQ6IGZhbHNlLFxuXG4gICAgICAgICAgICAgICAgY29udHJvbHM6IG51bGwsXG4gICAgICAgICAgICAgICAgY2xvY2s6IG5ldyBUSFJFRS5DbG9jaygpLFxuICAgICAgICAgICAgICAgIHBvaW50ZXI6IG5ldyBUSFJFRS5WZWN0b3IyKCksXG5cbiAgICAgICAgICAgICAgICBmcmFtZWxvb3A6ICdhbHdheXMnLFxuICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlOiB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQ6IDEsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogMC41LFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDEsXG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIHJlZ3Jlc3M6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRpbWVvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZXJmb3JtYW5jZVRpbWVvdXQpIGNsZWFyVGltZW91dChwZXJmb3JtYW5jZVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGxvd2VyIGJvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUucGVyZm9ybWFuY2UuY3VycmVudCAhPT0gc3RhdGUucGVyZm9ybWFuY2UubWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGVyZm9ybWFuY2VDdXJyZW50KHN0YXRlLnBlcmZvcm1hbmNlLm1pbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnbyBiYWNrIHRvIHVwcGVyIGJvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZVRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHNldFBlcmZvcm1hbmNlQ3VycmVudCh0aGlzLmdldCgncGVyZm9ybWFuY2UnLCAnbWF4JykgfHwgMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucGVyZm9ybWFuY2UuZGVib3VuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9LFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxEcHI6IDAsXG4gICAgICAgICAgICAgICAgICAgIGRwcjogMCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICBhc3BlY3Q6IDAsXG4gICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICAgICAgICAgICAgICBmYWN0b3I6IDAsXG4gICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRWaWV3cG9ydCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHByZXZpb3VzU3RvcmU6IHRoaXMucGFyZW50U3RvcmUgYXMgTmd0U3RvcmUsXG4gICAgICAgICAgICAgICAgaW50ZXJuYWw6IHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk6IDAsXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lczogMCxcbiAgICAgICAgICAgICAgICAgICAgbGFzdEV2ZW50OiBudWxsISxcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb246IFtdLFxuICAgICAgICAgICAgICAgICAgICBob3ZlcmVkOiBuZXcgTWFwKCksXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENsaWNrOiBbMCwgMF0sXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxIaXRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgY2FwdHVyZWRNYXA6IG5ldyBNYXAoKSxcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlOiAoY2FsbGJhY2s6IE5ndEJlZm9yZVJlbmRlclJlY29yZFsnY2FsbGJhY2snXSwgcHJpb3JpdHkgPSAwLCBzdG9yZSA9IHRoaXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsID0gdGhpcy5nZXQoJ2ludGVybmFsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHN1YnNjcmlwdGlvbiB3YXMgZ2l2ZW4gYSBwcmlvcml0eSwgaXQgdGFrZXMgcmVuZGVyaW5nIGludG8gaXRzIG93biBoYW5kc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHRoYXQgcmVhc29uIHdlIHN3aXRjaCBvZmYgYXV0b21hdGljIHJlbmRlcmluZyBhbmQgaW5jcmVhc2UgdGhlIG1hbnVhbCBmbGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBcyBsb25nIGFzIHRoaXMgZmxhZyBpcyBwb3NpdGl2ZSB0aGVyZSBjYW4gYmUgbm8gaW50ZXJuYWwgcmVuZGVyaW5nIGF0IGFsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSByZW5kZXIgc3Vic2NyaXB0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwucHJpb3JpdHkgPSBpbnRlcm5hbC5wcmlvcml0eSArIChwcmlvcml0eSA+IDAgPyAxIDogMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5zdWJzY3JpYmVycy5wdXNoKHsgcHJpb3JpdHksIHN0b3JlLCBjYWxsYmFjayB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHN1YnNjcmliZXIgYW5kIHNvcnQgbGF5ZXJzIGZyb20gbG93ZXN0IHRvIGhpZ2hlc3QsIG1lYW5pbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWdoZXN0IHByaW9yaXR5IHJlbmRlcnMgbGFzdCAob24gdG9wIG9mIHRoZSBvdGhlciBmcmFtZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5zdWJzY3JpYmVycy5zb3J0KChhLCBiKSA9PiAoYS5wcmlvcml0eSB8fCAwKSAtIChiLnByaW9yaXR5IHx8IDApKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbCA9IHRoaXMuZ2V0KCdpbnRlcm5hbCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbD8uc3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVjcmVhc2UgbWFudWFsIGZsYWcgaWYgdGhpcyBzdWJzY3JpcHRpb24gaGFkIGEgcHJpb3JpdHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwucHJpb3JpdHkgPSBpbnRlcm5hbC5wcmlvcml0eSAtIChwcmlvcml0eSA+IDAgPyAxIDogMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBzdWJzY3JpYmVyIGZyb20gbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5zdWJzY3JpYmVycyA9IGludGVybmFsLnN1YnNjcmliZXJzLmZpbHRlcigocykgPT4gcy5jYWxsYmFjayAhPT0gY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRFdmVudHM6IChldmVudHM6IFBhcnRpYWw8Tmd0RXZlbnRNYW5hZ2VyPGFueT4+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KChzdGF0ZSkgPT4gKHsgZXZlbnRzOiB7IC4uLnN0YXRlLmV2ZW50cywgLi4uZXZlbnRzIH0gfSkpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0U2l6ZTogKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCB0b3A/OiBudW1iZXIsIGxlZnQ/OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhID0gdGhpcy5nZXQoJ2NhbWVyYScpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplID0geyB3aWR0aCwgaGVpZ2h0LCB0b3A6IHRvcCB8fCAwLCBsZWZ0OiBsZWZ0IHx8IDAgfTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCgoc3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnQ6IHsgLi4uc3RhdGUudmlld3BvcnQsIC4uLmdldEN1cnJlbnRWaWV3cG9ydChjYW1lcmEsIGRlZmF1bHRUYXJnZXQsIHNpemUpIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldERwcjogKGRwcjogTmd0RHByKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gbWFrZURwcihkcHIsIHRoaXMud2luZG93KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoKHN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zdGF0ZS52aWV3cG9ydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHI6IHJlc29sdmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxEcHI6IHN0YXRlLnZpZXdwb3J0LmluaXRpYWxEcHIgfHwgcmVzb2x2ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRGcmFtZWxvb3A6IChmcmFtZWxvb3A6ICdhbHdheXMnIHwgJ2RlbWFuZCcgfCAnbmV2ZXInID0gJ2Fsd2F5cycpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xvY2sgPSB0aGlzLmdldCgnY2xvY2snKTtcbiAgICAgICAgICAgICAgICAgICAgY2xvY2suc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICBjbG9jay5lbGFwc2VkVGltZSA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lbG9vcCAhPT0gJ25ldmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2suc3RhcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLmVsYXBzZWRUaW1lID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KHsgZnJhbWVsb29wIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWRkSW50ZXJhY3Rpb246IChpbnRlcmFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCgoc3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDogeyAuLi5zdGF0ZS5pbnRlcm5hbCwgaW50ZXJhY3Rpb246IFsuLi5zdGF0ZS5pbnRlcm5hbC5pbnRlcmFjdGlvbiwgaW50ZXJhY3Rpb25dIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlbW92ZUludGVyYWN0aW9uOiAodXVpZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCgoc3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLmludGVybmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uOiBzdGF0ZS5pbnRlcm5hbC5pbnRlcmFjdGlvbi5maWx0ZXIoKGludGVyYWN0aW9uKSA9PiBpbnRlcmFjdGlvbi51dWlkICE9PSB1dWlkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuaXNJbml0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25maWd1cmUoaW5wdXRzOiBOZ3RDYW52YXNJbnB1dHMsIGNhbnZhc0VsZW1lbnQ6IEhUTUxDYW52YXNFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGdsOiBnbE9wdGlvbnMsXG4gICAgICAgICAgICBzaXplOiBzaXplT3B0aW9ucyxcbiAgICAgICAgICAgIGNhbWVyYTogY2FtZXJhT3B0aW9ucyxcbiAgICAgICAgICAgIHJheWNhc3RlcjogcmF5Y2FzdGVyT3B0aW9ucyxcbiAgICAgICAgICAgIGV2ZW50cyxcbiAgICAgICAgICAgIG9ydGhvZ3JhcGhpYyxcbiAgICAgICAgICAgIGxvb2tBdCxcbiAgICAgICAgICAgIHNoYWRvd3MsXG4gICAgICAgICAgICBsaW5lYXIsXG4gICAgICAgICAgICBsZWdhY3ksXG4gICAgICAgICAgICBmbGF0LFxuICAgICAgICAgICAgZHByLFxuICAgICAgICAgICAgZnJhbWVsb29wLFxuICAgICAgICAgICAgcGVyZm9ybWFuY2UsXG4gICAgICAgIH0gPSBpbnB1dHM7XG5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldCgpO1xuICAgICAgICBjb25zdCBzdGF0ZVRvVXBkYXRlOiBQYXJ0aWFsPE5ndFN0YXRlPiA9IHt9O1xuXG4gICAgICAgIC8vIHNldHVwIHJlbmRlcmVyXG4gICAgICAgIGxldCBnbCA9IHN0YXRlLmdsO1xuICAgICAgICBpZiAoIXN0YXRlLmdsKSBzdGF0ZVRvVXBkYXRlLmdsID0gZ2wgPSBtYWtlRGVmYXVsdFJlbmRlcmVyKGdsT3B0aW9ucywgY2FudmFzRWxlbWVudCk7XG5cbiAgICAgICAgLy8gc2V0dXAgcmF5Y2FzdGVyXG4gICAgICAgIGxldCByYXljYXN0ZXIgPSBzdGF0ZS5yYXljYXN0ZXI7XG4gICAgICAgIGlmICghcmF5Y2FzdGVyKSBzdGF0ZVRvVXBkYXRlLnJheWNhc3RlciA9IHJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcblxuICAgICAgICAvLyBzZXQgcmF5Y2FzdGVyIG9wdGlvbnNcbiAgICAgICAgY29uc3QgeyBwYXJhbXMsIC4uLm9wdGlvbnMgfSA9IHJheWNhc3Rlck9wdGlvbnMgfHwge307XG4gICAgICAgIGlmICghaXMuZXF1KG9wdGlvbnMsIHJheWNhc3Rlciwgc2hhbGxvd0xvb3NlKSkgYXBwbHlQcm9wcyhyYXljYXN0ZXIsIHsgLi4ub3B0aW9ucyB9KTtcbiAgICAgICAgaWYgKCFpcy5lcXUocGFyYW1zLCByYXljYXN0ZXIucGFyYW1zLCBzaGFsbG93TG9vc2UpKSB7XG4gICAgICAgICAgICBhcHBseVByb3BzKHJheWNhc3RlciwgeyBwYXJhbXM6IHsgLi4ucmF5Y2FzdGVyLnBhcmFtcywgLi4uKHBhcmFtcyB8fCB7fSkgfSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNyZWF0ZSBkZWZhdWx0IGNhbWVyYVxuICAgICAgICBpZiAoIXN0YXRlLmNhbWVyYSkge1xuICAgICAgICAgICAgY29uc3QgaXNDYW1lcmEgPSBpcy5jYW1lcmEoY2FtZXJhT3B0aW9ucyk7XG4gICAgICAgICAgICBsZXQgY2FtZXJhID0gaXNDYW1lcmEgPyBjYW1lcmFPcHRpb25zIDogbWFrZURlZmF1bHRDYW1lcmEob3J0aG9ncmFwaGljIHx8IGZhbHNlLCBzdGF0ZS5zaXplKTtcblxuICAgICAgICAgICAgaWYgKCFpc0NhbWVyYSkge1xuICAgICAgICAgICAgICAgIGlmIChjYW1lcmFPcHRpb25zKSBhcHBseVByb3BzKGNhbWVyYSwgY2FtZXJhT3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICAvLyBzZXQgcG9zaXRpb24uelxuICAgICAgICAgICAgICAgIGlmICghY2FtZXJhT3B0aW9ucz8ucG9zaXRpb24pIGNhbWVyYS5wb3NpdGlvbi56ID0gNTtcblxuICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBsb29rIGF0IGNlbnRlciBvciBwYXNzZWQtaW4gbG9va0F0IGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgICBpZiAoIWNhbWVyYU9wdGlvbnM/LnJvdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxvb2tBdCkpIGNhbWVyYS5sb29rQXQobG9va0F0WzBdLCBsb29rQXRbMV0sIGxvb2tBdFsyXSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvb2tBdCBpbnN0YW5jZW9mIFRIUkVFLlZlY3RvcjMpIGNhbWVyYS5sb29rQXQobG9va0F0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBjYW1lcmEubG9va0F0KDAsIDAsIDApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9qZWN0aW9uIG1hdHJpeCBhZnRlciBhcHBseXByb3BzXG4gICAgICAgICAgICAgICAgY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXg/LigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlzLmluc3RhbmNlKGNhbWVyYSkpIGNhbWVyYSA9IHByZXBhcmUoY2FtZXJhLCB7IHN0b3JlOiB0aGlzIH0pO1xuXG4gICAgICAgICAgICBzdGF0ZVRvVXBkYXRlLmNhbWVyYSA9IGNhbWVyYSBhcyBOZ3RDYW1lcmFNYW51YWw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdXAgWFIgKG9uZSB0aW1lIG9ubHkhKVxuICAgICAgICBpZiAoIXN0YXRlLnhyKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgZnJhbWUgYmVoYXZpb3IgaW4gV2ViWFJcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVhSRnJhbWU6IFhSRnJhbWVSZXF1ZXN0Q2FsbGJhY2sgPSAodGltZXN0YW1wOiBudW1iZXIsIGZyYW1lPzogWFJGcmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXQoKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZnJhbWVsb29wID09PSAnbmV2ZXInKSByZXR1cm47XG4gICAgICAgICAgICAgICAgYWR2YW5jZSh0aW1lc3RhbXAsIHRydWUsIHRoaXMsIGZyYW1lKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIFRvZ2dsZSByZW5kZXIgc3dpdGNoaW5nIG9uIHNlc3Npb25cbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVNlc3Npb25DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldCgpO1xuICAgICAgICAgICAgICAgIHN0YXRlLmdsLnhyLmVuYWJsZWQgPSBzdGF0ZS5nbC54ci5pc1ByZXNlbnRpbmc7XG5cbiAgICAgICAgICAgICAgICBzdGF0ZS5nbC54ci5zZXRBbmltYXRpb25Mb29wKHN0YXRlLmdsLnhyLmlzUHJlc2VudGluZyA/IGhhbmRsZVhSRnJhbWUgOiBudWxsKTtcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmdsLnhyLmlzUHJlc2VudGluZykgaW52YWxpZGF0ZSh0aGlzKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIFdlYlhSIHNlc3Npb24gbWFuYWdlclxuICAgICAgICAgICAgY29uc3QgeHIgPSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBnbC54ci5hZGRFdmVudExpc3RlbmVyKCdzZXNzaW9uc3RhcnQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgZ2wueHIuYWRkRXZlbnRMaXN0ZW5lcignc2Vzc2lvbmVuZCcsIGhhbmRsZVNlc3Npb25DaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlzY29ubmVjdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBnbC54ci5yZW1vdmVFdmVudExpc3RlbmVyKCdzZXNzaW9uc3RhcnQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgZ2wueHIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vzc2lvbmVuZCcsIGhhbmRsZVNlc3Npb25DaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gV2ViWFIgc2Vzc2lvbiBldmVudHNcbiAgICAgICAgICAgIGlmIChnbC54cikgeHIuY29ubmVjdCgpO1xuICAgICAgICAgICAgc3RhdGVUb1VwZGF0ZS54ciA9IHhyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHNoYWRvd21hcFxuICAgICAgICBpZiAoZ2wuc2hhZG93TWFwKSB7XG4gICAgICAgICAgICBjb25zdCBpc0Jvb2xlYW4gPSB0eXBlb2Ygc2hhZG93cyA9PT0gJ2Jvb2xlYW4nO1xuICAgICAgICAgICAgaWYgKChpc0Jvb2xlYW4gJiYgZ2wuc2hhZG93TWFwLmVuYWJsZWQgIT09IHNoYWRvd3MpIHx8ICFpcy5lcXUoc2hhZG93cywgZ2wuc2hhZG93TWFwLCBzaGFsbG93TG9vc2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkID0gZ2wuc2hhZG93TWFwLmVuYWJsZWQ7XG4gICAgICAgICAgICAgICAgZ2wuc2hhZG93TWFwLmVuYWJsZWQgPSAhIXNoYWRvd3M7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Jvb2xlYW4pIE9iamVjdC5hc3NpZ24oZ2wuc2hhZG93TWFwLCBzaGFkb3dzKTtcbiAgICAgICAgICAgICAgICBlbHNlIGdsLnNoYWRvd01hcC50eXBlID0gVEhSRUUuUENGU29mdFNoYWRvd01hcDtcblxuICAgICAgICAgICAgICAgIGlmIChvbGQgIT09IGdsLnNoYWRvd01hcC5lbmFibGVkKSBjaGVja05lZWRzVXBkYXRlKGdsLnNoYWRvd01hcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTYWZlbHkgc2V0IGNvbG9yIG1hbmFnZW1lbnQgaWYgYXZhaWxhYmxlLlxuICAgICAgICAvLyBBdm9pZCBhY2Nlc3NpbmcgVEhSRUUuQ29sb3JNYW5hZ2VtZW50IHRvIHBsYXkgbmljZSB3aXRoIG9sZGVyIHZlcnNpb25zXG4gICAgICAgIGlmIChUSFJFRS5Db2xvck1hbmFnZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IENvbG9yTWFuYWdlbWVudCA9IFRIUkVFLkNvbG9yTWFuYWdlbWVudCBhcyBOZ3RBbnlSZWNvcmQ7XG4gICAgICAgICAgICBpZiAoJ2VuYWJsZWQnIGluIENvbG9yTWFuYWdlbWVudCkgQ29sb3JNYW5hZ2VtZW50WydlbmFibGVkJ10gPSAhbGVnYWN5ID8/IGZhbHNlO1xuICAgICAgICAgICAgZWxzZSBpZiAoJ2xlZ2FjeU1vZGUnIGluIENvbG9yTWFuYWdlbWVudCkgQ29sb3JNYW5hZ2VtZW50WydsZWdhY3lNb2RlJ10gPSBsZWdhY3kgPz8gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCBjb2xvciBzcGFjZSBhbmQgdG9uZW1hcHBpbmcgcHJlZmVyZW5jZXNcbiAgICAgICAgY29uc3QgTGluZWFyRW5jb2RpbmcgPSAzMDAwO1xuICAgICAgICBjb25zdCBzUkdCRW5jb2RpbmcgPSAzMDAxO1xuICAgICAgICBhcHBseVByb3BzKGdsLCB7XG4gICAgICAgICAgICBvdXRwdXRFbmNvZGluZzogbGluZWFyID8gTGluZWFyRW5jb2RpbmcgOiBzUkdCRW5jb2RpbmcsXG4gICAgICAgICAgICB0b25lTWFwcGluZzogZmxhdCA/IFRIUkVFLk5vVG9uZU1hcHBpbmcgOiBUSFJFRS5BQ0VTRmlsbWljVG9uZU1hcHBpbmcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBjb2xvciBtYW5hZ2VtZW50IHN0YXRlXG4gICAgICAgIGlmIChzdGF0ZS5sZWdhY3kgIT09IGxlZ2FjeSkgc3RhdGVUb1VwZGF0ZS5sZWdhY3kgPSBsZWdhY3k7XG4gICAgICAgIGlmIChzdGF0ZS5saW5lYXIgIT09IGxpbmVhcikgc3RhdGVUb1VwZGF0ZS5saW5lYXIgPSBsaW5lYXI7XG4gICAgICAgIGlmIChzdGF0ZS5mbGF0ICE9PSBmbGF0KSBzdGF0ZVRvVXBkYXRlLmZsYXQgPSBmbGF0O1xuXG4gICAgICAgIC8vIFNldCBnbCBwcm9wc1xuICAgICAgICBnbC5zZXRDbGVhckFscGhhKDApO1xuICAgICAgICBnbC5zZXRQaXhlbFJhdGlvKG1ha2VEcHIoc3RhdGUudmlld3BvcnQuZHByKSk7XG4gICAgICAgIGdsLnNldFNpemUoc3RhdGUuc2l6ZS53aWR0aCwgc3RhdGUuc2l6ZS5oZWlnaHQpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzLm9iaihnbE9wdGlvbnMpICYmXG4gICAgICAgICAgICAhKHR5cGVvZiBnbE9wdGlvbnMgPT09ICdmdW5jdGlvbicpICYmXG4gICAgICAgICAgICAhaXMucmVuZGVyZXIoZ2xPcHRpb25zKSAmJlxuICAgICAgICAgICAgIWlzLmVxdShnbE9wdGlvbnMsIGdsLCBzaGFsbG93TG9vc2UpXG4gICAgICAgICkge1xuICAgICAgICAgICAgYXBwbHlQcm9wcyhnbCwgZ2xPcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIGV2ZW50cyBpbnRlcm5hbGx5XG4gICAgICAgIGlmIChldmVudHMgJiYgIXN0YXRlLmV2ZW50cy5oYW5kbGVycykgc3RhdGVUb1VwZGF0ZS5ldmVudHMgPSBldmVudHModGhpcyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGVyZm9ybWFuY2VcbiAgICAgICAgaWYgKHBlcmZvcm1hbmNlICYmICFpcy5lcXUocGVyZm9ybWFuY2UsIHN0YXRlLnBlcmZvcm1hbmNlLCBzaGFsbG93TG9vc2UpKSB7XG4gICAgICAgICAgICBzdGF0ZVRvVXBkYXRlLnBlcmZvcm1hbmNlID0geyAuLi5zdGF0ZS5wZXJmb3JtYW5jZSwgLi4ucGVyZm9ybWFuY2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0KHN0YXRlVG9VcGRhdGUpO1xuXG4gICAgICAgIC8vIENoZWNrIHBpeGVscmF0aW9cbiAgICAgICAgaWYgKGRwciAmJiBzdGF0ZS52aWV3cG9ydC5kcHIgIT09IG1ha2VEcHIoZHByKSkgc3RhdGUuc2V0RHByKGRwcik7XG4gICAgICAgIC8vIENoZWNrIHNpemUsIGFsbG93IGl0IHRvIHRha2Ugb24gY29udGFpbmVyIGJvdW5kcyBpbml0aWFsbHlcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGNvbXB1dGVJbml0aWFsU2l6ZShjYW52YXNFbGVtZW50LCBzaXplT3B0aW9ucyk7XG4gICAgICAgIGlmICghaXMuZXF1KHNpemUsIHN0YXRlLnNpemUsIHNoYWxsb3dMb29zZSkpIHN0YXRlLnNldFNpemUoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQsIHNpemUudG9wLCBzaXplLmxlZnQpO1xuXG4gICAgICAgIC8vIENoZWNrIGZyYW1lbG9vcFxuICAgICAgICBpZiAoc3RhdGUuZnJhbWVsb29wICE9PSBmcmFtZWxvb3ApIHN0YXRlLnNldEZyYW1lbG9vcChmcmFtZWxvb3ApO1xuXG4gICAgICAgIGlmICghdGhpcy5nZXQoJ3JlYWR5JykpIHRoaXMuc2V0KHsgcmVhZHk6IHRydWUgfSk7XG5cbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlKCk7XG4gICAgfVxuXG4gICAgZGVzdHJveShjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2V0KChzdGF0ZSkgPT4gKHsgaW50ZXJuYWw6IHsgLi4uc3RhdGUuaW50ZXJuYWwsIGFjdGl2ZTogZmFsc2UgfSB9KSk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGdsLCB4ciwgZXZlbnRzIH0gPSB0aGlzLmdldCgpO1xuICAgICAgICAgICAgaWYgKGdsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50cy5kaXNjb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50cy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZ2wucmVuZGVyTGlzdHMuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIGdsLmZvcmNlQ29udGV4dExvc3MoKTtcblxuICAgICAgICAgICAgICAgIGlmIChnbC54ciAmJiBnbC54ci5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsLnhyLnNldEFuaW1hdGlvbkxvb3AobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHhyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkaXNwb3NlKHRoaXMuZ2V0KCkpO1xuXG4gICAgICAgICAgICAgICAgcm9vdFN0YXRlTWFwLmRlbGV0ZShjYW52YXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCA1MDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzaXplKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0KCk7XG4gICAgICAgIGxldCBvbGRTaXplID0gc3RhdGUuc2l6ZTtcbiAgICAgICAgbGV0IG9sZERwciA9IHN0YXRlLnZpZXdwb3J0LmRwcjtcbiAgICAgICAgbGV0IG9sZENhbWVyYSA9IHN0YXRlLmNhbWVyYTtcblxuICAgICAgICB0aGlzLmhvbGQoXG4gICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnNlbGVjdCgnY2FtZXJhJyksIHRoaXMuc2VsZWN0KCdzaXplJyksIHRoaXMuc2VsZWN0KCd2aWV3cG9ydCcpLCB0aGlzLnNlbGVjdCgnZ2wnKV0pLFxuICAgICAgICAgICAgKFtjYW1lcmEsIHNpemUsIHZpZXdwb3J0LCBnbF0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyByZXNpemUgY2FtZXJhIGFuZCByZW5kZXJlciBvbiBjaGFuZ2VzIHRvIHNpemUgYW5kIGRwclxuICAgICAgICAgICAgICAgIGlmIChzaXplICE9PSBvbGRTaXplIHx8IHZpZXdwb3J0LmRwciAhPT0gb2xkRHByKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZFNpemUgPSBzaXplO1xuICAgICAgICAgICAgICAgICAgICBvbGREcHIgPSB2aWV3cG9ydC5kcHI7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjYW1lcmFcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2FtZXJhKGNhbWVyYSwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIGdsLnNldFBpeGVsUmF0aW8odmlld3BvcnQuZHByKTtcbiAgICAgICAgICAgICAgICAgICAgZ2wuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHZpZXdwb3J0IHdoZW4gY2FtZXJhIGNoYW5nZXNcbiAgICAgICAgICAgICAgICBpZiAoY2FtZXJhICE9PSBvbGRDYW1lcmEpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2FtZXJhKGNhbWVyYSwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIG9sZENhbWVyYSA9IGNhbWVyYTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoKHN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnQ6IHsgLi4uc3RhdGUudmlld3BvcnQsIC4uLnN0YXRlLnZpZXdwb3J0LmdldEN1cnJlbnRWaWV3cG9ydChjYW1lcmEpIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbnZhbGlkYXRlKCkge1xuICAgICAgICB0aGlzLmhvbGQodGhpcy5zZWxlY3QoKSwgKCkgPT4gaW52YWxpZGF0ZSh0aGlzKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlSW5pdGlhbFNpemUoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IFRIUkVFLk9mZnNjcmVlbkNhbnZhcywgZGVmYXVsdFNpemU/OiBOZ3RTaXplKTogTmd0U2l6ZSB7XG4gICAgaWYgKGRlZmF1bHRTaXplKSByZXR1cm4gZGVmYXVsdFNpemU7XG5cbiAgICBpZiAoY2FudmFzIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgJiYgY2FudmFzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGNhbnZhcy5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9O1xufVxuXG4vLyBEaXNwb3NlcyBhbiBvYmplY3QgYW5kIGFsbCBpdHMgcHJvcGVydGllc1xuZnVuY3Rpb24gZGlzcG9zZTxUT2JqIGV4dGVuZHMgeyBkaXNwb3NlPzogKCkgPT4gdm9pZDsgdHlwZT86IHN0cmluZzsgW2tleTogc3RyaW5nXTogYW55IH0+KG9iajogVE9iaikge1xuICAgIGlmIChvYmouZGlzcG9zZSAmJiAhaXMuc2NlbmUob2JqKSkgb2JqLmRpc3Bvc2UoKTtcbiAgICBmb3IgKGNvbnN0IHAgaW4gb2JqKSB7XG4gICAgICAgIChwIGFzIGFueSkuZGlzcG9zZT8uKCk7XG4gICAgICAgIGRlbGV0ZSBvYmpbcF07XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2xpYi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgdHlwZSB7IE5ndFJ4U3RvcmUgfSBmcm9tICcuL3N0b3Jlcy9yeC1zdG9yZSc7XG5cbmV4cG9ydCB0eXBlIE5ndEFueVJlY29yZCA9IFJlY29yZDxzdHJpbmcsIGFueT47XG5leHBvcnQgdHlwZSBOZ3RQcm9wZXJ0aWVzPFQ+ID0gUGljazxULCB7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKF86IGFueSkgPT4gYW55ID8gbmV2ZXIgOiBLIH1ba2V5b2YgVF0+O1xuXG5leHBvcnQgdHlwZSBOZ3RFcXVDb25maWcgPSB7XG4gICAgLyoqIENvbXBhcmUgYXJyYXlzIGJ5IHJlZmVyZW5jZSBlcXVhbGl0eSBhID09PSBiIChkZWZhdWx0KSwgb3IgYnkgc2hhbGxvdyBlcXVhbGl0eSAqL1xuICAgIGFycmF5cz86ICdyZWZlcmVuY2UnIHwgJ3NoYWxsb3cnO1xuICAgIC8qKiBDb21wYXJlIG9iamVjdHMgYnkgcmVmZXJlbmNlIGVxdWFsaXR5IGEgPT09IGIgKGRlZmF1bHQpLCBvciBieSBzaGFsbG93IGVxdWFsaXR5ICovXG4gICAgb2JqZWN0cz86ICdyZWZlcmVuY2UnIHwgJ3NoYWxsb3cnO1xuICAgIC8qKiBJZiB0cnVlIHRoZSBrZXlzIGluIGJvdGggYSBhbmQgYiBtdXN0IG1hdGNoIDE6MSAoZGVmYXVsdCksIGlmIGZhbHNlIGEncyBrZXlzIG11c3QgaW50ZXJzZWN0IGIncyAqL1xuICAgIHN0cmljdD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBOZ3REcHIgPSBudW1iZXIgfCBbbWluOiBudW1iZXIsIG1heDogbnVtYmVyXTtcbmV4cG9ydCB0eXBlIE5ndFNpemUgPSB7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICB0b3A6IG51bWJlcjtcbiAgICBsZWZ0OiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgTmd0Vmlld3BvcnQgPSBOZ3RTaXplICYge1xuICAgIC8qKiBUaGUgaW5pdGlhbCBwaXhlbCByYXRpbyAqL1xuICAgIGluaXRpYWxEcHI6IG51bWJlcjtcbiAgICAvKiogQ3VycmVudCBwaXhlbCByYXRpbyAqL1xuICAgIGRwcjogbnVtYmVyO1xuICAgIC8qKiBzaXplLndpZHRoIC8gdmlld3BvcnQud2lkdGggKi9cbiAgICBmYWN0b3I6IG51bWJlcjtcbiAgICAvKiogQ2FtZXJhIGRpc3RhbmNlICovXG4gICAgZGlzdGFuY2U6IG51bWJlcjtcbiAgICAvKiogQ2FtZXJhIGFzcGVjdCByYXRpbzogd2lkdGggLyBoZWlnaHQgKi9cbiAgICBhc3BlY3Q6IG51bWJlcjtcbn07XG5leHBvcnQgdHlwZSBOZ3RQZXJmb3JtYW5jZSA9IHtcbiAgICAvKiogQ3VycmVudCBwZXJmb3JtYW5jZSBub3JtYWwsIGJldHdlZW4gbWluIGFuZCBtYXggKi9cbiAgICBjdXJyZW50OiBudW1iZXI7XG4gICAgLyoqIEhvdyBsb3cgdGhlIHBlcmZvcm1hbmNlIGNhbiBnbywgYmV0d2VlbiAwIGFuZCBtYXggKi9cbiAgICBtaW46IG51bWJlcjtcbiAgICAvKiogSG93IGhpZ2ggdGhlIHBlcmZvcm1hbmNlIGNhbiBnbywgYmV0d2VlbiBtaW4gYW5kIG1heCAqL1xuICAgIG1heDogbnVtYmVyO1xuICAgIC8qKiBUaW1lIHVudGlsIGN1cnJlbnQgcmV0dXJucyB0byBtYXggaW4gbXMgKi9cbiAgICBkZWJvdW5jZTogbnVtYmVyO1xuICAgIC8qKiBTZXRzIGN1cnJlbnQgdG8gbWluLCBwdXRzIHRoZSBzeXN0ZW0gaW4gcmVncmVzc2lvbiAqL1xuICAgIHJlZ3Jlc3M6ICgpID0+IHZvaWQ7XG59O1xuZXhwb3J0IHR5cGUgTmd0UmVuZGVyZXIgPSB7IHJlbmRlcjogKHNjZW5lOiBUSFJFRS5TY2VuZSwgY2FtZXJhOiBUSFJFRS5DYW1lcmEpID0+IGFueSB9O1xuZXhwb3J0IHR5cGUgTmd0Q2FtZXJhID0gVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhIHwgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmE7XG5leHBvcnQgdHlwZSBOZ3RDYW1lcmFNYW51YWwgPSBOZ3RDYW1lcmEgJiB7IG1hbnVhbD86IGJvb2xlYW4gfTtcbmV4cG9ydCBpbnRlcmZhY2UgTmd0SW50ZXJzZWN0aW9uIGV4dGVuZHMgVEhSRUUuSW50ZXJzZWN0aW9uIHtcbiAgICAvKiogVGhlIGV2ZW50IHNvdXJjZSAodGhlIG9iamVjdCB3aGljaCByZWdpc3RlcmVkIHRoZSBoYW5kbGVyKSAqL1xuICAgIGV2ZW50T2JqZWN0OiBUSFJFRS5PYmplY3QzRDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RJbnRlcnNlY3Rpb25FdmVudDxUU291cmNlRXZlbnQ+IGV4dGVuZHMgTmd0SW50ZXJzZWN0aW9uIHtcbiAgICAvKiogVGhlIGV2ZW50IHNvdXJjZSAodGhlIG9iamVjdCB3aGljaCByZWdpc3RlcmVkIHRoZSBoYW5kbGVyKSAqL1xuICAgIGV2ZW50T2JqZWN0OiBUSFJFRS5PYmplY3QzRDtcbiAgICAvKiogQW4gYXJyYXkgb2YgaW50ZXJzZWN0aW9ucyAqL1xuICAgIGludGVyc2VjdGlvbnM6IE5ndEludGVyc2VjdGlvbltdO1xuICAgIC8qKiB2ZWMzLnNldChwb2ludGVyLngsIHBvaW50ZXIueSwgMCkudW5wcm9qZWN0KGNhbWVyYSkgKi9cbiAgICB1bnByb2plY3RlZFBvaW50OiBUSFJFRS5WZWN0b3IzO1xuICAgIC8qKiBOb3JtYWxpemVkIGV2ZW50IGNvb3JkaW5hdGVzICovXG4gICAgcG9pbnRlcjogVEhSRUUuVmVjdG9yMjtcbiAgICAvKiogRGVsdGEgYmV0d2VlbiBmaXJzdCBjbGljayBhbmQgdGhpcyBldmVudCAqL1xuICAgIGRlbHRhOiBudW1iZXI7XG4gICAgLyoqIFRoZSByYXkgdGhhdCBwaWVyY2VkIGl0ICovXG4gICAgcmF5OiBUSFJFRS5SYXk7XG4gICAgLyoqIFRoZSBjYW1lcmEgdGhhdCB3YXMgdXNlZCBieSB0aGUgcmF5Y2FzdGVyICovXG4gICAgY2FtZXJhOiBOZ3RDYW1lcmFNYW51YWw7XG4gICAgLyoqIHN0b3BQcm9wYWdhdGlvbiB3aWxsIHN0b3AgdW5kZXJseWluZyBoYW5kbGVycyBmcm9tIGZpcmluZyAqL1xuICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4gdm9pZDtcbiAgICAvKiogVGhlIG9yaWdpbmFsIGhvc3QgZXZlbnQgKi9cbiAgICBuYXRpdmVFdmVudDogVFNvdXJjZUV2ZW50O1xuICAgIC8qKiBJZiB0aGUgZXZlbnQgd2FzIHN0b3BwZWQgYnkgY2FsbGluZyBzdG9wUHJvcGFnYXRpb24gKi9cbiAgICBzdG9wcGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBOZ3RUaHJlZUV2ZW50PFRFdmVudD4gPSBOZ3RJbnRlcnNlY3Rpb25FdmVudDxURXZlbnQ+ICYgTmd0UHJvcGVydGllczxURXZlbnQ+O1xuZXhwb3J0IHR5cGUgTmd0RG9tRXZlbnQgPSBQb2ludGVyRXZlbnQgfCBNb3VzZUV2ZW50IHwgV2hlZWxFdmVudDtcblxuZXhwb3J0IHR5cGUgTmd0RXZlbnRIYW5kbGVycyA9IHtcbiAgICBjbGljaz86IChldmVudDogTmd0VGhyZWVFdmVudDxNb3VzZUV2ZW50PikgPT4gdm9pZDtcbiAgICBjb250ZXh0bWVudT86IChldmVudDogTmd0VGhyZWVFdmVudDxNb3VzZUV2ZW50PikgPT4gdm9pZDtcbiAgICBkYmxjbGljaz86IChldmVudDogTmd0VGhyZWVFdmVudDxNb3VzZUV2ZW50PikgPT4gdm9pZDtcbiAgICBwb2ludGVydXA/OiAoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50PikgPT4gdm9pZDtcbiAgICBwb2ludGVyZG93bj86IChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSA9PiB2b2lkO1xuICAgIHBvaW50ZXJvdmVyPzogKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pID0+IHZvaWQ7XG4gICAgcG9pbnRlcm91dD86IChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSA9PiB2b2lkO1xuICAgIHBvaW50ZXJlbnRlcj86IChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSA9PiB2b2lkO1xuICAgIHBvaW50ZXJsZWF2ZT86IChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSA9PiB2b2lkO1xuICAgIHBvaW50ZXJtb3ZlPzogKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pID0+IHZvaWQ7XG4gICAgcG9pbnRlcm1pc3NlZD86IChldmVudDogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgICBwb2ludGVyY2FuY2VsPzogKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pID0+IHZvaWQ7XG4gICAgd2hlZWw/OiAoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8V2hlZWxFdmVudD4pID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RFdmVudHMgPSB7XG4gICAgW1RFdmVudCBpbiBrZXlvZiBOZ3RFdmVudEhhbmRsZXJzXS0/OiBFdmVudExpc3RlbmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0RmlsdGVyRnVuY3Rpb24gPSAoaXRlbXM6IFRIUkVFLkludGVyc2VjdGlvbltdLCBzdG9yZTogTmd0UnhTdG9yZTxOZ3RTdGF0ZT4pID0+IFRIUkVFLkludGVyc2VjdGlvbltdO1xuZXhwb3J0IHR5cGUgTmd0Q29tcHV0ZUZ1bmN0aW9uID0gKFxuICAgIGV2ZW50OiBOZ3REb21FdmVudCxcbiAgICByb290OiBOZ3RSeFN0b3JlPE5ndFN0YXRlPixcbiAgICBwcmV2aW91cz86IE5ndFJ4U3RvcmU8Tmd0U3RhdGU+XG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIE5ndEV2ZW50TWFuYWdlcjxUVGFyZ2V0PiA9IHtcbiAgICAvKiogRGV0ZXJtaW5lcyBpZiB0aGUgZXZlbnQgbGF5ZXIgaXMgYWN0aXZlICovXG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKiogRXZlbnQgbGF5ZXIgcHJpb3JpdHksIGhpZ2hlciBwcmlvcml0aXplZCBsYXllcnMgY29tZSBmaXJzdCBhbmQgbWF5IHN0b3AoLXByb3BhZ2F0ZSkgbG93ZXIgbGF5ZXIgICovXG4gICAgcHJpb3JpdHk6IG51bWJlcjtcbiAgICAvKiogVGhlIGNvbXB1dGUgZnVuY3Rpb24gbmVlZHMgdG8gc2V0IHVwIHRoZSByYXljYXN0ZXIgYW5kIGFuIHh5LSBwb2ludGVyICAqL1xuICAgIGNvbXB1dGU/OiBOZ3RDb21wdXRlRnVuY3Rpb247XG4gICAgLyoqIFRoZSBmaWx0ZXIgY2FuIHJlLW9yZGVyIG9yIHJlLXN0cnVjdHVyZSB0aGUgaW50ZXJzZWN0aW9ucyAgKi9cbiAgICBmaWx0ZXI/OiBOZ3RGaWx0ZXJGdW5jdGlvbjtcbiAgICAvKiogVGhlIHRhcmdldCBub2RlIHRoZSBldmVudCBsYXllciBpcyB0aWVkIHRvICovXG4gICAgY29ubmVjdGVkPzogVFRhcmdldDtcbiAgICAvKiogQWxsIHRoZSBwb2ludGVyIGV2ZW50IGhhbmRsZXJzIHRocm91Z2ggd2hpY2ggdGhlIGhvc3QgZm9yd2FyZHMgbmF0aXZlIGV2ZW50cyAqL1xuICAgIGhhbmRsZXJzPzogTmd0RXZlbnRzO1xuICAgIC8qKiBBbGxvd3MgcmUtY29ubmVjdGluZyB0byBhbm90aGVyIHRhcmdldCAqL1xuICAgIGNvbm5lY3Q/OiAodGFyZ2V0OiBUVGFyZ2V0KSA9PiB2b2lkO1xuICAgIC8qKiBSZW1vdmVzIGFsbCBleGlzdGluZyBldmVudHMgaGFuZGxlcnMgZnJvbSB0aGUgdGFyZ2V0ICovXG4gICAgZGlzY29ubmVjdD86ICgpID0+IHZvaWQ7XG4gICAgLyoqIFRyaWdnZXJzIGEgb25Qb2ludGVyTW92ZSB3aXRoIHRoZSBsYXN0IGtub3duIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gZW5hYmxlIHJheWNhc3Rpbmcgd2l0aG91dFxuICAgICAqICBleHBsaWNpdCB1c2VyIGludGVyYWN0aW9uLCBmb3IgaW5zdGFuY2Ugd2hlbiB0aGUgY2FtZXJhIG1vdmVzIGEgaG92ZXJhYmxlIG9iamVjdCB1bmRlcm5lYXRoIHRoZSBjdXJzb3IuXG4gICAgICovXG4gICAgdXBkYXRlPzogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0ID0ge1xuICAgIGludGVyc2VjdGlvbjogTmd0SW50ZXJzZWN0aW9uO1xuICAgIHRhcmdldDogRWxlbWVudDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlclN0YXRlID0gTmd0U3RhdGUgJiB7IGRlbHRhOiBudW1iZXI7IGZyYW1lPzogWFJGcmFtZSB9O1xuXG5leHBvcnQgdHlwZSBOZ3RCZWZvcmVSZW5kZXJFdmVudDxUT2JqZWN0IGV4dGVuZHMgTmd0SW5zdGFuY2VOb2RlID0gTmd0SW5zdGFuY2VOb2RlPiA9IHtcbiAgICBzdGF0ZTogTmd0UmVuZGVyU3RhdGU7XG4gICAgb2JqZWN0OiBUT2JqZWN0O1xufTtcblxuZXhwb3J0IHR5cGUgTmd0QmVmb3JlUmVuZGVyUmVjb3JkID0ge1xuICAgIGNhbGxiYWNrOiAoc3RhdGU6IE5ndFJlbmRlclN0YXRlKSA9PiB2b2lkO1xuICAgIHN0b3JlOiBOZ3RSeFN0b3JlPE5ndFN0YXRlPjtcbiAgICBwcmlvcml0eT86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndEludGVybmFsU3RhdGUgPSB7XG4gICAgYWN0aXZlOiBib29sZWFuO1xuICAgIHByaW9yaXR5OiBudW1iZXI7XG4gICAgZnJhbWVzOiBudW1iZXI7XG4gICAgbGFzdEV2ZW50OiBOZ3REb21FdmVudCB8IG51bGw7XG4gICAgaW50ZXJhY3Rpb246IFRIUkVFLk9iamVjdDNEW107XG4gICAgaG92ZXJlZDogTWFwPHN0cmluZywgTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4+O1xuICAgIHN1YnNjcmliZXJzOiBOZ3RCZWZvcmVSZW5kZXJSZWNvcmRbXTtcbiAgICBjYXB0dXJlZE1hcDogTWFwPG51bWJlciwgTWFwPFRIUkVFLk9iamVjdDNELCBOZ3RQb2ludGVyQ2FwdHVyZVRhcmdldD4+O1xuICAgIGluaXRpYWxDbGljazogW3g6IG51bWJlciwgeTogbnVtYmVyXTtcbiAgICBpbml0aWFsSGl0czogVEhSRUUuT2JqZWN0M0RbXTtcbiAgICBzdWJzY3JpYmU6IChcbiAgICAgICAgY2FsbGJhY2s6IE5ndEJlZm9yZVJlbmRlclJlY29yZFsnY2FsbGJhY2snXSxcbiAgICAgICAgcHJpb3JpdHk/OiBudW1iZXIsXG4gICAgICAgIHN0b3JlPzogTmd0UnhTdG9yZTxOZ3RTdGF0ZT5cbiAgICApID0+ICgpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RTdGF0ZSA9IHtcbiAgICBnZXQ6IE5ndFJ4U3RvcmU8Tmd0U3RhdGU+WydnZXQnXTtcbiAgICBzZXQ6IE5ndFJ4U3RvcmU8Tmd0U3RhdGU+WydzZXQnXTtcbiAgICAvKiogd2hlbiBhbGwgYnVpbGRpbmcgYmxvY2tzIGFyZSBpbml0aWFsaXplZCAqL1xuICAgIHJlYWR5OiBib29sZWFuO1xuICAgIC8qKiBUaGUgaW5zdGFuY2Ugb2YgdGhlIHJlbmRlcmVyICovXG4gICAgZ2w6IFRIUkVFLldlYkdMUmVuZGVyZXI7XG4gICAgLyoqIERlZmF1bHQgY2FtZXJhICovXG4gICAgY2FtZXJhOiBOZ3RDYW1lcmFNYW51YWw7XG4gICAgLyoqIERlZmF1bHQgc2NlbmUgKi9cbiAgICBzY2VuZTogVEhSRUUuU2NlbmU7XG4gICAgLyoqIERlZmF1bHQgcmF5Y2FzdGVyICovXG4gICAgcmF5Y2FzdGVyOiBUSFJFRS5SYXljYXN0ZXI7XG4gICAgLyoqIERlZmF1bHQgY2xvY2sgKi9cbiAgICBjbG9jazogVEhSRUUuQ2xvY2s7XG4gICAgLyoqIEV2ZW50IGxheWVyIGludGVyZmFjZSwgY29udGFpbnMgdGhlIGV2ZW50IGhhbmRsZXIgYW5kIHRoZSBub2RlIHRoZXkncmUgY29ubmVjdGVkIHRvICovXG4gICAgZXZlbnRzOiBOZ3RFdmVudE1hbmFnZXI8YW55PjtcbiAgICAvKiogWFIgaW50ZXJmYWNlICovXG4gICAgeHI6IHsgY29ubmVjdDogKCkgPT4gdm9pZDsgZGlzY29ubmVjdDogKCkgPT4gdm9pZCB9O1xuICAgIC8qKiBDdXJyZW50bHkgdXNlZCBjb250cm9scyAqL1xuICAgIGNvbnRyb2xzOiBUSFJFRS5FdmVudERpc3BhdGNoZXIgfCBudWxsO1xuICAgIC8qKiBOb3JtYWxpemVkIGV2ZW50IGNvb3JkaW5hdGVzICovXG4gICAgcG9pbnRlcjogVEhSRUUuVmVjdG9yMjtcbiAgICAvKiBXaGV0aGVyIHRvIGVuYWJsZSByMTM5J3MgVEhSRUUuQ29sb3JNYW5hZ2VtZW50LmxlZ2FjeU1vZGUgKi9cbiAgICBsZWdhY3k6IGJvb2xlYW47XG4gICAgLyoqIFNob3J0Y3V0IHRvIGdsLm91dHB1dEVuY29kaW5nID0gTGluZWFyRW5jb2RpbmcgKi9cbiAgICBsaW5lYXI6IGJvb2xlYW47XG4gICAgLyoqIFNob3J0Y3V0IHRvIGdsLnRvbmVNYXBwaW5nID0gTm9Ub25lbWFwcGluZyAqL1xuICAgIGZsYXQ6IGJvb2xlYW47XG4gICAgLyoqIFJlbmRlciBsb29wIGZsYWdzICovXG4gICAgZnJhbWVsb29wOiAnYWx3YXlzJyB8ICdkZW1hbmQnIHwgJ25ldmVyJztcbiAgICAvKiogQWRhcHRpdmUgcGVyZm9ybWFuY2UgaW50ZXJmYWNlICovXG4gICAgcGVyZm9ybWFuY2U6IE5ndFBlcmZvcm1hbmNlO1xuICAgIC8qKiBSZWFjdGl2ZSBwaXhlbC1zaXplIG9mIHRoZSBjYW52YXMgKi9cbiAgICBzaXplOiBOZ3RTaXplO1xuICAgIC8qKiBSZWFjdGl2ZSBzaXplIG9mIHRoZSB2aWV3cG9ydCBpbiB0aHJlZWpzIHVuaXRzICovXG4gICAgdmlld3BvcnQ6IE5ndFZpZXdwb3J0ICYge1xuICAgICAgICBnZXRDdXJyZW50Vmlld3BvcnQ6IChcbiAgICAgICAgICAgIGNhbWVyYT86IE5ndENhbWVyYU1hbnVhbCxcbiAgICAgICAgICAgIHRhcmdldD86IFRIUkVFLlZlY3RvcjMgfCBQYXJhbWV0ZXJzPFRIUkVFLlZlY3RvcjNbJ3NldCddPixcbiAgICAgICAgICAgIHNpemU/OiBOZ3RTaXplXG4gICAgICAgICkgPT4gT21pdDxOZ3RWaWV3cG9ydCwgJ2RwcicgfCAnaW5pdGlhbERwcic+O1xuICAgIH07XG4gICAgLyoqIEZsYWdzIHRoZSBjYW52YXMgZm9yIHJlbmRlciwgYnV0IGRvZXNuJ3QgcmVuZGVyIGluIGl0c2VsZiAqL1xuICAgIGludmFsaWRhdGU6IChmcmFtZXM/OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgLyoqIEFkdmFuY2UgKHJlbmRlcikgb25lIHN0ZXAgKi9cbiAgICBhZHZhbmNlOiAodGltZXN0YW1wOiBudW1iZXIsIHJ1bkdsb2JhbEVmZmVjdHM/OiBib29sZWFuKSA9PiB2b2lkO1xuICAgIC8qKiBTaG9ydGN1dCB0byBzZXR0aW5nIHRoZSBldmVudCBsYXllciAqL1xuICAgIHNldEV2ZW50czogKGV2ZW50czogUGFydGlhbDxOZ3RFdmVudE1hbmFnZXI8YW55Pj4pID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogU2hvcnRjdXQgdG8gbWFudWFsIHNpemluZ1xuICAgICAqL1xuICAgIHNldFNpemU6ICh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgdG9wPzogbnVtYmVyLCBsZWZ0PzogbnVtYmVyKSA9PiB2b2lkO1xuICAgIC8qKiBTaG9ydGN1dCB0byBtYW51YWwgc2V0dGluZyB0aGUgcGl4ZWwgcmF0aW8gKi9cbiAgICBzZXREcHI6IChkcHI6IE5ndERwcikgPT4gdm9pZDtcbiAgICAvKiogU2hvcnRjdXQgdG8gZnJhbWVsb29wIGZsYWdzICovXG4gICAgc2V0RnJhbWVsb29wOiAoZnJhbWVsb29wPzogJ2Fsd2F5cycgfCAnZGVtYW5kJyB8ICduZXZlcicpID0+IHZvaWQ7XG4gICAgLyoqIFdoZW4gdGhlIGNhbnZhcyB3YXMgY2xpY2tlZCBidXQgbm90aGluZyB3YXMgaGl0ICovXG4gICAgb25Qb2ludGVyTWlzc2VkPzogKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICAgIC8qKiBJZiB0aGlzIHN0YXRlIG1vZGVsIGlzIGxheWVyZCAodmlhIGNyZWF0ZVBvcnRhbCkgdGhlbiB0aGlzIGNvbnRhaW5zIHRoZSBwcmV2aW91cyBsYXllciAqL1xuICAgIHByZXZpb3VzU3RvcmU/OiBOZ3RSeFN0b3JlPE5ndFN0YXRlPjtcbiAgICAvKiogSW50ZXJuYWxzICovXG4gICAgaW50ZXJuYWw6IE5ndEludGVybmFsU3RhdGU7XG4gICAgYWRkSW50ZXJhY3Rpb246IChpbnN0YW5jZTogVEhSRUUuT2JqZWN0M0QpID0+IHZvaWQ7XG4gICAgcmVtb3ZlSW50ZXJhY3Rpb246ICh1dWlkOiBzdHJpbmcpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RBdHRhY2hGdW5jdGlvbjxUQ2hpbGQgPSBhbnksIFRQYXJlbnQgPSBhbnk+ID0gKFxuICAgIHBhcmVudDogVFBhcmVudCxcbiAgICBjaGlsZDogVENoaWxkLFxuICAgIHN0b3JlOiBOZ3RSeFN0b3JlPE5ndFN0YXRlPlxuKSA9PiB2b2lkIHwgKCgpID0+IHZvaWQpO1xuXG5leHBvcnQgdHlwZSBOZ3RBZnRlckF0dGFjaDxcbiAgICBUUGFyZW50IGV4dGVuZHMgTmd0SW5zdGFuY2VOb2RlID0gTmd0SW5zdGFuY2VOb2RlLFxuICAgIFRDaGlsZCBleHRlbmRzIE5ndEluc3RhbmNlTm9kZSA9IE5ndEluc3RhbmNlTm9kZVxuPiA9IHsgcGFyZW50OiBUUGFyZW50OyBub2RlOiBUQ2hpbGQgfTtcblxuZXhwb3J0IHR5cGUgTmd0SW5zdGFuY2VMb2NhbFN0YXRlID0ge1xuICAgIC8qKiB0aGUgc3RhdGUgZ2V0dGVyIG9mIHRoZSBjYW52YXMgdGhhdCB0aGUgaW5zdGFuY2UgaXMgYmVpbmcgcmVuZGVyZWQgdG8gKi9cbiAgICBzdG9yZTogTmd0UnhTdG9yZTxOZ3RTdGF0ZT47XG4gICAgLy8gb2JqZWN0cyBhbmQgcGFyZW50IGFyZSB1c2VkIHdoZW4gY2hpbGRyZW4gYXJlIGFkZGVkIHdpdGggYGF0dGFjaGAgaW5zdGVhZCBvZiBiZWluZyBhZGRlZCB0byB0aGUgT2JqZWN0M0Qgc2NlbmUgZ3JhcGhcbiAgICBub25PYmplY3RzOiBCZWhhdmlvclN1YmplY3Q8Tmd0SW5zdGFuY2VOb2RlW10+O1xuICAgIC8vIG9iamVjdHMgdGhhdCBhcmUgT2JqZWN0M0RcbiAgICBvYmplY3RzOiBCZWhhdmlvclN1YmplY3Q8Tmd0SW5zdGFuY2VOb2RlW10+O1xuICAgIC8vIHNob3J0Y3V0IHRvIGFkZC9yZW1vdmUgb2JqZWN0IHRvIGxpc3RcbiAgICBhZGQ6IChpbnN0YW5jZTogTmd0SW5zdGFuY2VOb2RlLCB0eXBlOiAnb2JqZWN0cycgfCAnbm9uT2JqZWN0cycpID0+IHZvaWQ7XG4gICAgcmVtb3ZlOiAoaW5zdGFuY2U6IE5ndEluc3RhbmNlTm9kZSwgdHlwZTogJ29iamVjdHMnIHwgJ25vbk9iamVjdHMnKSA9PiB2b2lkO1xuICAgIC8vIHBhcmVudCBiYXNlZCBvbiBhdHRhY2ggdGhyZWUgaW5zdGFuY2VcbiAgICBwYXJlbnQ6IE5ndEluc3RhbmNlTm9kZSB8IG51bGw7XG4gICAgLy8gaWYgdGhpcyBUSFJFRSBpbnN0YW5jZSBpcyBhIG5ndC1wcmltaXRpdmVcbiAgICBwcmltaXRpdmU/OiBib29sZWFuO1xuICAgIC8vIGlmIHRoaXMgVEhSRUUgb2JqZWN0IGhhcyBhbnkgZXZlbnRzIGJvdW5kIHRvIGl0XG4gICAgZXZlbnRDb3VudDogbnVtYmVyO1xuICAgIC8vIGxpc3Qgb2YgaGFuZGxlcnMgdG8gaGFuZGxlIHRoZSBldmVudHNcbiAgICBoYW5kbGVyczogUGFydGlhbDxOZ3RFdmVudEhhbmRsZXJzPjtcbiAgICAvLyBwcmV2aW91cyBhcmdzXG4gICAgYXJncz86IHVua25vd25bXTtcbiAgICAvLyBhdHRhY2ggaW5mb3JtYXRpb24gc28gdGhhdCB3ZSBjYW4gZGV0YWNoIGFzIHdlbGwgYXMgcmVzZXRcbiAgICBhdHRhY2g/OiBzdHJpbmdbXSB8IE5ndEF0dGFjaEZ1bmN0aW9uO1xuICAgIC8vIHByZXZpb3VzbHkgYXR0YWNoIGluZm9ybWF0aW9uIHNvIHdlIGNhbiByZXNldCBhcyB3ZWxsIGFzIGNsZWFuIHVwXG4gICAgcHJldmlvdXNBdHRhY2g/OiB1bmtub3duIHwgKCgpID0+IHZvaWQpO1xuICAgIC8vIGlzIHJhdyB2YWx1ZVxuICAgIGlzUmF3PzogYm9vbGVhbjtcbiAgICAvLyBwcmlvcml0eSBmb3IgYmVmb3JlIHJlbmRlclxuICAgIHByaW9yaXR5PzogbnVtYmVyO1xuICAgIC8vIGVtaXR0ZXIgYWZ0ZXIgcHJvcHMgdXBkYXRlXG4gICAgYWZ0ZXJVcGRhdGU/OiBFdmVudEVtaXR0ZXI8Tmd0SW5zdGFuY2VOb2RlPjtcbiAgICAvLyBlbWl0dGVyIGFmdGVyIGF0dGFjaGluZyB0byBwYXJlbnRcbiAgICBhZnRlckF0dGFjaD86IEV2ZW50RW1pdHRlcjxOZ3RBZnRlckF0dGFjaD47XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RJbnN0YW5jZU5vZGU8VE5vZGUgPSBhbnk+ID0ge1xuICAgIF9fbmd0X186IE5ndEluc3RhbmNlTG9jYWxTdGF0ZTtcbn0gJiBOZ3RBbnlSZWNvcmQgJlxuICAgIFROb2RlO1xuXG5leHBvcnQgdHlwZSBOZ3RHTFJlbmRlcmVyID0ge1xuICAgIHJlbmRlcjogKHNjZW5lOiBUSFJFRS5TY2VuZSwgY2FtZXJhOiBUSFJFRS5DYW1lcmEpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RHTE9wdGlvbnMgPVxuICAgIHwgTmd0R0xSZW5kZXJlclxuICAgIHwgKChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KSA9PiBOZ3RHTFJlbmRlcmVyKVxuICAgIHwgUGFydGlhbDxOZ3RQcm9wZXJ0aWVzPFRIUkVFLldlYkdMUmVuZGVyZXI+IHwgVEhSRUUuV2ViR0xSZW5kZXJlclBhcmFtZXRlcnM+XG4gICAgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0T2JqZWN0TWFwIHtcbiAgICBub2RlczogeyBbbmFtZTogc3RyaW5nXTogVEhSRUUuT2JqZWN0M0QgfTtcbiAgICBtYXRlcmlhbHM6IHsgW25hbWU6IHN0cmluZ106IFRIUkVFLk1hdGVyaWFsIH07XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgdHlwZSBOZ3RDYW52YXNJbnB1dHMgPSB7XG4gICAgLyoqIEEgdGhyZWVqcyByZW5kZXJlciBpbnN0YW5jZSBvciBwcm9wcyB0aGF0IGdvIGludG8gdGhlIGRlZmF1bHQgcmVuZGVyZXIgKi9cbiAgICBnbD86IE5ndEdMT3B0aW9ucztcbiAgICBzaXplPzogTmd0U2l6ZTtcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc2hhZG93cyAoYnkgZGVmYXVsdCBQQ0Zzb2Z0KS4gQ2FuIGFjY2VwdCBgZ2wuc2hhZG93TWFwYCBvcHRpb25zIGZvciBmaW5lLXR1bmluZyxcbiAgICAgKiBidXQgYWxzbyBzdHJpbmdzOiAnYmFzaWMnIHwgJ3BlcmNlbnRhZ2UnIHwgJ3NvZnQnIHwgJ3ZhcmlhbmNlJy5cbiAgICAgKiBAc2VlIGh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jYXBpL2VuL3JlbmRlcmVycy9XZWJHTFJlbmRlcmVyLnNoYWRvd01hcFxuICAgICAqL1xuICAgIHNoYWRvd3M/OiBib29sZWFuIHwgJ2Jhc2ljJyB8ICdwZXJjZW50YWdlJyB8ICdzb2Z0JyB8ICd2YXJpYW5jZScgfCBQYXJ0aWFsPFRIUkVFLldlYkdMU2hhZG93TWFwPjtcbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aHJlZSByMTM5IGNvbG9yIG1hbmFnZW1lbnQuXG4gICAgICogQHNlZSBodHRwczovL3RocmVlanMub3JnL2RvY3MvI21hbnVhbC9lbi9pbnRyb2R1Y3Rpb24vQ29sb3ItbWFuYWdlbWVudFxuICAgICAqL1xuICAgIGxlZ2FjeT86IGJvb2xlYW47XG4gICAgLyoqIFN3aXRjaCBvZmYgYXV0b21hdGljIHNSR0IgZW5jb2RpbmcgYW5kIGdhbW1hIGNvcnJlY3Rpb24gKi9cbiAgICBsaW5lYXI/OiBib29sZWFuO1xuICAgIC8qKiBVc2UgYFRIUkVFLk5vVG9uZU1hcHBpbmdgIGluc3RlYWQgb2YgYFRIUkVFLkFDRVNGaWxtaWNUb25lTWFwcGluZ2AgKi9cbiAgICBmbGF0PzogYm9vbGVhbjtcbiAgICAvKiogQ3JlYXRlcyBhbiBvcnRob2dyYXBoaWMgY2FtZXJhICovXG4gICAgb3J0aG9ncmFwaGljPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBSM0YncyByZW5kZXIgbW9kZS4gU2V0IHRvIGBkZW1hbmRgIHRvIG9ubHkgcmVuZGVyIG9uIHN0YXRlIGNoYW5nZSBvciBgbmV2ZXJgIHRvIHRha2UgY29udHJvbC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5wbW5kLnJzL3JlYWN0LXRocmVlLWZpYmVyL2FkdmFuY2VkL3NjYWxpbmctcGVyZm9ybWFuY2Ujb24tZGVtYW5kLXJlbmRlcmluZ1xuICAgICAqL1xuICAgIGZyYW1lbG9vcD86ICdhbHdheXMnIHwgJ2RlbWFuZCcgfCAnbmV2ZXInO1xuICAgIC8qKlxuICAgICAqIFIzRiBwZXJmb3JtYW5jZSBvcHRpb25zIGZvciBhZGFwdGl2ZSBwZXJmb3JtYW5jZS5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5wbW5kLnJzL3JlYWN0LXRocmVlLWZpYmVyL2FkdmFuY2VkL3NjYWxpbmctcGVyZm9ybWFuY2UjbW92ZW1lbnQtcmVncmVzc2lvblxuICAgICAqL1xuICAgIHBlcmZvcm1hbmNlPzogUGFydGlhbDxPbWl0PE5ndFBlcmZvcm1hbmNlLCAncmVncmVzcyc+PjtcbiAgICAvKiogVGFyZ2V0IHBpeGVsIHJhdGlvLiBDYW4gY2xhbXAgYmV0d2VlbiBhIHJhbmdlOiBgW21pbiwgbWF4XWAgKi9cbiAgICBkcHI/OiBOZ3REcHI7XG4gICAgLyoqIFByb3BzIHRoYXQgZ28gaW50byB0aGUgZGVmYXVsdCByYXljYXN0ZXIgKi9cbiAgICByYXljYXN0ZXI/OiBQYXJ0aWFsPFRIUkVFLlJheWNhc3Rlcj47XG4gICAgLyoqIEEgYFRIUkVFLlNjZW5lYCBpbnN0YW5jZSBvciBwcm9wcyB0aGF0IGdvIGludG8gdGhlIGRlZmF1bHQgc2NlbmUgKi9cbiAgICBzY2VuZT86IFRIUkVFLlNjZW5lIHwgUGFydGlhbDxUSFJFRS5TY2VuZT47XG4gICAgLyoqIEEgYENhbWVyYWAgaW5zdGFuY2Ugb3IgcHJvcHMgdGhhdCBnbyBpbnRvIHRoZSBkZWZhdWx0IGNhbWVyYSAqL1xuICAgIGNhbWVyYT86IChOZ3RDYW1lcmEgfCBQYXJ0aWFsPFRIUkVFLkNhbWVyYT4pICYge1xuICAgICAgICAvKiogRmxhZ3MgdGhlIGNhbWVyYSBhcyBtYW51YWwsIHB1dHRpbmcgcHJvamVjdGlvbiBpbnRvIHlvdXIgb3duIGhhbmRzICovXG4gICAgICAgIG1hbnVhbD86IGJvb2xlYW47XG4gICAgfTtcbiAgICAvKiogQW4gUjNGIGV2ZW50IG1hbmFnZXIgdG8gbWFuYWdlIGVsZW1lbnRzJyBwb2ludGVyIGV2ZW50cyAqL1xuICAgIGV2ZW50cz86IChzdG9yZTogTmd0UnhTdG9yZTxOZ3RTdGF0ZT4pID0+IE5ndEV2ZW50TWFuYWdlcjxIVE1MRWxlbWVudD47XG4gICAgLyoqIFRoZSB0YXJnZXQgd2hlcmUgZXZlbnRzIGFyZSBiZWluZyBzdWJzY3JpYmVkIHRvLCBkZWZhdWx0OiB0aGUgZGl2IHRoYXQgd3JhcHMgY2FudmFzICovXG4gICAgZXZlbnRTb3VyY2U/OiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAgIC8qKiBUaGUgZXZlbnQgcHJlZml4IHRoYXQgaXMgY2FzdCBpbnRvIGNhbnZhcyBwb2ludGVyIHgveSBldmVudHMsIGRlZmF1bHQ6IFwib2Zmc2V0XCIgKi9cbiAgICBldmVudFByZWZpeD86ICdvZmZzZXQnIHwgJ2NsaWVudCcgfCAncGFnZScgfCAnbGF5ZXInIHwgJ3NjcmVlbic7XG4gICAgLyoqIERlZmF1bHQgY29vcmRpbmF0ZSBmb3IgdGhlIGNhbWVyYSB0byBsb29rIGF0ICovXG4gICAgbG9va0F0PzogVEhSRUUuVmVjdG9yMyB8IFBhcmFtZXRlcnM8VEhSRUUuVmVjdG9yM1snc2V0J10+O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RMb2FkZXI8VD4gZXh0ZW5kcyBUSFJFRS5Mb2FkZXIge1xuICAgIGxvYWQoXG4gICAgICAgIHVybDogc3RyaW5nLFxuICAgICAgICBvbkxvYWQ/OiAocmVzdWx0OiBUKSA9PiB2b2lkLFxuICAgICAgICBvblByb2dyZXNzPzogKGV2ZW50OiBQcm9ncmVzc0V2ZW50KSA9PiB2b2lkLFxuICAgICAgICBvbkVycm9yPzogKGV2ZW50OiBFcnJvckV2ZW50KSA9PiB2b2lkXG4gICAgKTogdW5rbm93bjtcbiAgICBsb2FkQXN5bmModXJsOiBzdHJpbmcsIG9uUHJvZ3Jlc3M/OiAoZXZlbnQ6IFByb2dyZXNzRXZlbnQpID0+IHZvaWQpOiBQcm9taXNlPFQ+O1xufVxuXG5leHBvcnQgdHlwZSBOZ3RMb2FkZXJQcm90bzxUPiA9IG5ldyAoLi4uYXJnczogYW55KSA9PiBOZ3RMb2FkZXI8VCBleHRlbmRzIHVua25vd24gPyBhbnkgOiBUPjtcbmV4cG9ydCB0eXBlIE5ndExvYWRlclJldHVyblR5cGU8VCwgTCBleHRlbmRzIE5ndExvYWRlclByb3RvPFQ+PiA9IFQgZXh0ZW5kcyB1bmtub3duXG4gICAgPyBBd2FpdGVkPFJldHVyblR5cGU8SW5zdGFuY2VUeXBlPEw+Wydsb2FkQXN5bmMnXT4+XG4gICAgOiBUO1xuZXhwb3J0IHR5cGUgTmd0TG9hZGVyRXh0ZW5zaW9uczxUIGV4dGVuZHMgeyBwcm90b3R5cGU6IE5ndExvYWRlclByb3RvPGFueT4gfT4gPSAobG9hZGVyOiBUWydwcm90b3R5cGUnXSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIE5ndENvbmRpdGlvbmFsVHlwZTxDaGlsZCwgUGFyZW50LCBUcnV0aHksIEZhbHN5PiA9IENoaWxkIGV4dGVuZHMgUGFyZW50ID8gVHJ1dGh5IDogRmFsc3k7XG5leHBvcnQgdHlwZSBOZ3RCcmFuY2hpbmdSZXR1cm48VCwgUGFyZW50LCBDb2VyY2VkPiA9IE5ndENvbmRpdGlvbmFsVHlwZTxULCBQYXJlbnQsIENvZXJjZWQsIFQ+O1xuIl19
|