angular-three 2.14.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/fesm2022/angular-three-nativescript.mjs +3 -3
  2. package/fesm2022/angular-three-nativescript.mjs.map +1 -1
  3. package/fesm2022/angular-three-testing.mjs +12 -14
  4. package/fesm2022/angular-three-testing.mjs.map +1 -1
  5. package/fesm2022/angular-three.mjs +116 -100
  6. package/fesm2022/angular-three.mjs.map +1 -1
  7. package/lib/canvas.d.ts +31 -31
  8. package/lib/html.d.ts +3 -3
  9. package/lib/portal.d.ts +2 -2
  10. package/lib/routed-scene.d.ts +8 -2
  11. package/lib/utils/object-events.d.ts +0 -19
  12. package/nativescript/lib/canvas.d.ts +3 -3
  13. package/package.json +3 -9
  14. package/plugin/src/generators/init/schema.json +8 -8
  15. package/esm2022/angular-three.mjs +0 -5
  16. package/esm2022/index.mjs +0 -25
  17. package/esm2022/lib/canvas.mjs +0 -188
  18. package/esm2022/lib/directives/args.mjs +0 -53
  19. package/esm2022/lib/directives/selection.mjs +0 -69
  20. package/esm2022/lib/dom/events.mjs +0 -73
  21. package/esm2022/lib/events.mjs +0 -361
  22. package/esm2022/lib/html.mjs +0 -44
  23. package/esm2022/lib/instance.mjs +0 -83
  24. package/esm2022/lib/loader.mjs +0 -93
  25. package/esm2022/lib/loop.mjs +0 -141
  26. package/esm2022/lib/pipes/hexify.mjs +0 -86
  27. package/esm2022/lib/portal.mjs +0 -220
  28. package/esm2022/lib/renderer/catalogue.mjs +0 -7
  29. package/esm2022/lib/renderer/constants.mjs +0 -23
  30. package/esm2022/lib/renderer/index.mjs +0 -544
  31. package/esm2022/lib/renderer/state.mjs +0 -54
  32. package/esm2022/lib/renderer/utils.mjs +0 -223
  33. package/esm2022/lib/roots.mjs +0 -274
  34. package/esm2022/lib/routed-scene.mjs +0 -33
  35. package/esm2022/lib/store.mjs +0 -179
  36. package/esm2022/lib/three-types.mjs +0 -2
  37. package/esm2022/lib/types.mjs +0 -2
  38. package/esm2022/lib/utils/apply-props.mjs +0 -130
  39. package/esm2022/lib/utils/attach.mjs +0 -46
  40. package/esm2022/lib/utils/before-render.mjs +0 -41
  41. package/esm2022/lib/utils/is.mjs +0 -52
  42. package/esm2022/lib/utils/make.mjs +0 -52
  43. package/esm2022/lib/utils/object-events.mjs +0 -137
  44. package/esm2022/lib/utils/output-ref.mjs +0 -9
  45. package/esm2022/lib/utils/parameters.mjs +0 -70
  46. package/esm2022/lib/utils/resolve-ref.mjs +0 -8
  47. package/esm2022/lib/utils/signal-store.mjs +0 -90
  48. package/esm2022/lib/utils/update.mjs +0 -37
  49. package/esm2022/nativescript/angular-three-nativescript.mjs +0 -5
  50. package/esm2022/nativescript/index.mjs +0 -2
  51. package/esm2022/nativescript/lib/canvas.mjs +0 -127
  52. package/esm2022/testing/angular-three-testing.mjs +0 -5
  53. package/esm2022/testing/index.mjs +0 -3
  54. package/esm2022/testing/lib/test-bed.mjs +0 -130
  55. package/esm2022/testing/lib/test-canvas.mjs +0 -45
  56. package/esm2022/testing/lib/utils/mock-canvas.mjs +0 -37
  57. package/esm2022/testing/lib/utils/web-gl-rendering-context.mjs +0 -752
@@ -1,361 +0,0 @@
1
- import { Vector3 } from 'three';
2
- import { getLocalState } from './instance';
3
- import { makeId } from './utils/make';
4
- /**
5
- * Release pointer captures.
6
- * This is called by releasePointerCapture in the API, and when an object is removed.
7
- */
8
- function releaseInternalPointerCapture(capturedMap, obj, captures, pointerId) {
9
- const captureData = captures.get(obj);
10
- if (captureData) {
11
- captures.delete(obj);
12
- // If this was the last capturing object for this pointer
13
- if (captures.size === 0) {
14
- capturedMap.delete(pointerId);
15
- captureData.target.releasePointerCapture(pointerId);
16
- }
17
- }
18
- }
19
- export function removeInteractivity(store, object) {
20
- const { internal } = store.snapshot;
21
- // Removes every trace of an object from the data store
22
- internal.interaction = internal.interaction.filter((o) => o !== object);
23
- internal.initialHits = internal.initialHits.filter((o) => o !== object);
24
- internal.hovered.forEach((value, key) => {
25
- if (value.eventObject === object || value.object === object) {
26
- // Clear out intersects, they are outdated by now
27
- internal.hovered.delete(key);
28
- }
29
- });
30
- internal.capturedMap.forEach((captures, pointerId) => {
31
- releaseInternalPointerCapture(internal.capturedMap, object, captures, pointerId);
32
- });
33
- }
34
- export function createEvents(store) {
35
- /** Calculates delta */
36
- function calculateDistance(event) {
37
- const internal = store.get('internal');
38
- const dx = event.offsetX - internal.initialClick[0];
39
- const dy = event.offsetY - internal.initialClick[1];
40
- return Math.round(Math.sqrt(dx * dx + dy * dy));
41
- }
42
- /** Returns true if an instance has a valid pointer-event registered, this excludes scroll, clicks etc */
43
- function filterPointerEvents(objects) {
44
- return objects.filter((obj) => ['move', 'over', 'enter', 'out', 'leave'].some((name) => {
45
- const eventName = `pointer${name}`;
46
- return getLocalState(obj)?.handlers?.[eventName];
47
- }));
48
- }
49
- function intersect(event, filter) {
50
- const state = store.get();
51
- const duplicates = new Set();
52
- const intersections = [];
53
- // Allow callers to eliminate event objects
54
- const eventsObjects = filter ? filter(state.internal.interaction) : state.internal.interaction;
55
- // Reset all raycaster cameras to undefined
56
- for (let i = 0; i < eventsObjects.length; i++) {
57
- const objectRootState = getLocalState(eventsObjects[i])?.store.snapshot;
58
- if (objectRootState) {
59
- objectRootState.raycaster.camera = undefined;
60
- }
61
- }
62
- if (!state.previousRoot) {
63
- // Make sure root-level pointer and ray are set up
64
- state.events.compute?.(event, store, null);
65
- }
66
- function handleRaycast(obj) {
67
- const objStore = getLocalState(obj)?.store;
68
- const objState = objStore?.snapshot;
69
- // Skip event handling when noEvents is set, or when the raycasters camera is null
70
- if (!objState || !objState.events.enabled || objState.raycaster.camera === null)
71
- return [];
72
- // When the camera is undefined we have to call the event layers update function
73
- if (objState.raycaster.camera === undefined) {
74
- objState.events.compute?.(event, objStore, objState.previousRoot);
75
- // If the camera is still undefined we have to skip this layer entirely
76
- if (objState.raycaster.camera === undefined)
77
- objState.raycaster.camera = null;
78
- }
79
- // Intersect object by object
80
- return objState.raycaster.camera ? objState.raycaster.intersectObject(obj, true) : [];
81
- }
82
- // Collect events
83
- let hits = eventsObjects
84
- // Intersect objects
85
- .flatMap(handleRaycast)
86
- // Sort by event priority and distance
87
- .sort((a, b) => {
88
- const aState = getLocalState(a.object)?.store.snapshot;
89
- const bState = getLocalState(b.object)?.store.snapshot;
90
- if (!aState || !bState)
91
- return a.distance - b.distance;
92
- return bState.events.priority - aState.events.priority || a.distance - b.distance;
93
- })
94
- // Filter out duplicates
95
- .filter((item) => {
96
- const id = makeId(item);
97
- if (duplicates.has(id))
98
- return false;
99
- duplicates.add(id);
100
- return true;
101
- });
102
- // https://github.com/mrdoob/three.js/issues/16031
103
- // Allow custom userland intersect sort order, this likely only makes sense on the root filter
104
- if (state.events.filter)
105
- hits = state.events.filter(hits, store);
106
- // Bubble up the events, find the event source (eventObject)
107
- for (const hit of hits) {
108
- let eventObject = hit.object;
109
- // bubble event up
110
- while (eventObject) {
111
- if (getLocalState(eventObject)?.eventCount)
112
- intersections.push({ ...hit, eventObject });
113
- eventObject = eventObject.parent;
114
- }
115
- }
116
- // If the interaction is captured, make all capturing targets part of the intersect.
117
- if ('pointerId' in event && state.internal.capturedMap.has(event.pointerId)) {
118
- for (const captureData of state.internal.capturedMap.get(event.pointerId).values()) {
119
- if (!duplicates.has(makeId(captureData.intersection)))
120
- intersections.push(captureData.intersection);
121
- }
122
- }
123
- return intersections;
124
- }
125
- /** Handles intersections by forwarding them to handlers */
126
- function handleIntersects(intersections, event, delta, callback) {
127
- const rootState = store.snapshot;
128
- // If anything has been found, forward it to the event listeners
129
- if (intersections.length) {
130
- const localState = { stopped: false };
131
- for (const hit of intersections) {
132
- const { raycaster, pointer, camera, internal } = getLocalState(hit.object)?.store.snapshot || rootState;
133
- const unprojectedPoint = new Vector3(pointer.x, pointer.y, 0).unproject(camera);
134
- const hasPointerCapture = (id) => internal.capturedMap.get(id)?.has(hit.eventObject) ?? false;
135
- const setPointerCapture = (id) => {
136
- const captureData = { intersection: hit, target: event.target };
137
- if (internal.capturedMap.has(id)) {
138
- // if the pointerId was previously captured, we add the hit to the
139
- // event capturedMap.
140
- internal.capturedMap.get(id).set(hit.eventObject, captureData);
141
- }
142
- else {
143
- // if the pointerId was not previously captured, we create a map
144
- // containing the hitObject, and the hit. hitObject is used for
145
- // faster access.
146
- internal.capturedMap.set(id, new Map([[hit.eventObject, captureData]]));
147
- }
148
- // Call the original event now
149
- event.target.setPointerCapture(id);
150
- };
151
- const releasePointerCapture = (id) => {
152
- const captures = internal.capturedMap.get(id);
153
- if (captures) {
154
- releaseInternalPointerCapture(internal.capturedMap, hit.eventObject, captures, id);
155
- }
156
- };
157
- // Add native event props
158
- const extractEventProps = {};
159
- // This iterates over the event's properties including the inherited ones. Native PointerEvents have most of their props as getters which are inherited, but polyfilled PointerEvents have them all as their own properties (i.e. not inherited). We can't use Object.keys() or Object.entries() as they only return "own" properties; nor Object.getPrototypeOf(event) as that *doesn't* return "own" properties, only inherited ones.
160
- for (const prop in event) {
161
- const property = event[prop];
162
- // Only copy over atomics, leave functions alone as these should be
163
- // called as event.nativeEvent.fn()
164
- if (typeof property !== 'function')
165
- extractEventProps[prop] = property;
166
- }
167
- const raycastEvent = {
168
- ...hit,
169
- ...extractEventProps,
170
- pointer,
171
- intersections,
172
- stopped: localState.stopped,
173
- delta,
174
- unprojectedPoint,
175
- ray: raycaster.ray,
176
- camera,
177
- // Hijack stopPropagation, which just sets a flag
178
- stopPropagation() {
179
- // https://github.com/pmndrs/react-three-fiber/issues/596
180
- // Events are not allowed to stop propagation if the pointer has been captured
181
- const capturesForPointer = 'pointerId' in event && internal.capturedMap.get(event.pointerId);
182
- // We only authorize stopPropagation...
183
- if (
184
- // ...if this pointer hasn't been captured
185
- !capturesForPointer ||
186
- // ... or if the hit object is capturing the pointer
187
- capturesForPointer.has(hit.eventObject)) {
188
- raycastEvent.stopped = localState.stopped = true;
189
- // Propagation is stopped, remove all other hover records
190
- // An event handler is only allowed to flush other handlers if it is hovered itself
191
- if (internal.hovered.size &&
192
- Array.from(internal.hovered.values()).find((i) => i.eventObject === hit.eventObject)) {
193
- // Objects cannot flush out higher up objects that have already caught the event
194
- const higher = intersections.slice(0, intersections.indexOf(hit));
195
- cancelPointer([...higher, hit]);
196
- }
197
- }
198
- },
199
- // there should be a distinction between target and currentTarget
200
- target: { hasPointerCapture, setPointerCapture, releasePointerCapture },
201
- currentTarget: { hasPointerCapture, setPointerCapture, releasePointerCapture },
202
- nativeEvent: event,
203
- };
204
- // Call subscribers
205
- callback(raycastEvent);
206
- // Event bubbling may be interrupted by stopPropagation
207
- if (localState.stopped)
208
- break;
209
- }
210
- }
211
- return intersections;
212
- }
213
- function cancelPointer(intersections) {
214
- const internal = store.get('internal');
215
- for (const hoveredObj of internal.hovered.values()) {
216
- // When no objects were hit or the the hovered object wasn't found underneath the cursor
217
- // we call onPointerOut and delete the object from the hovered-elements map
218
- if (!intersections.length ||
219
- !intersections.find((hit) => hit.object === hoveredObj.object &&
220
- hit.index === hoveredObj.index &&
221
- hit.instanceId === hoveredObj.instanceId)) {
222
- const eventObject = hoveredObj.eventObject;
223
- const instance = getLocalState(eventObject);
224
- const handlers = instance?.handlers;
225
- internal.hovered.delete(makeId(hoveredObj));
226
- if (instance?.eventCount) {
227
- // Clear out intersects, they are outdated by now
228
- const data = { ...hoveredObj, intersections };
229
- handlers?.pointerout?.(data);
230
- handlers?.pointerleave?.(data);
231
- }
232
- }
233
- }
234
- }
235
- function pointerMissed(event, objects) {
236
- for (let i = 0; i < objects.length; i++) {
237
- const instance = getLocalState(objects[i]);
238
- instance?.handlers.pointermissed?.(event);
239
- }
240
- }
241
- function handlePointer(name) {
242
- // Deal with cancelation
243
- switch (name) {
244
- case 'pointerleave':
245
- case 'pointercancel':
246
- return () => cancelPointer([]);
247
- case 'lostpointercapture':
248
- return (event) => {
249
- const { internal } = store.snapshot;
250
- if ('pointerId' in event && internal.capturedMap.has(event.pointerId)) {
251
- // If the object event interface had lostpointercapture, we'd call it here on every
252
- // object that's getting removed. We call it on the next frame because lostpointercapture
253
- // fires before pointerup. Otherwise pointerUp would never be called if the event didn't
254
- // happen in the object it originated from, leaving components in a in-between state.
255
- requestAnimationFrame(() => {
256
- // Only release if pointer-up didn't do it already
257
- if (internal.capturedMap.has(event.pointerId)) {
258
- internal.capturedMap.delete(event.pointerId);
259
- cancelPointer([]);
260
- }
261
- });
262
- }
263
- };
264
- }
265
- // Any other pointer goes here ...
266
- return function handleEvent(event) {
267
- // NOTE: pointerMissed$ on NgtStore is private
268
- const pointerMissed$ = store['pointerMissed$'];
269
- const internal = store.get('internal');
270
- // prepareRay(event)
271
- internal.lastEvent.nativeElement = event;
272
- // Get fresh intersects
273
- const isPointerMove = name === 'pointermove';
274
- const isClickEvent = name === 'click' || name === 'contextmenu' || name === 'dblclick';
275
- const filter = isPointerMove ? filterPointerEvents : undefined;
276
- const hits = intersect(event, filter);
277
- const delta = isClickEvent ? calculateDistance(event) : 0;
278
- // Save initial coordinates on pointer-down
279
- if (name === 'pointerdown') {
280
- internal.initialClick = [event.offsetX, event.offsetY];
281
- internal.initialHits = hits.map((hit) => hit.eventObject);
282
- }
283
- // If a click yields no results, pass it back to the user as a miss
284
- // Missed events have to come first in order to establish user-land side-effect clean up
285
- if (isClickEvent && !hits.length) {
286
- if (delta <= 2) {
287
- pointerMissed(event, internal.interaction);
288
- pointerMissed$.next(event);
289
- }
290
- }
291
- // Take care of unhover
292
- if (isPointerMove)
293
- cancelPointer(hits);
294
- function onIntersect(data) {
295
- const eventObject = data.eventObject;
296
- const instance = getLocalState(eventObject);
297
- const handlers = instance?.handlers;
298
- // Check presence of handlers
299
- if (!instance?.eventCount)
300
- return;
301
- /*
302
- MAYBE TODO, DELETE IF NOT:
303
- Check if the object is captured, captured events should not have intersects running in parallel
304
- But wouldn't it be better to just replace capturedMap with a single entry?
305
- Also, are we OK with straight up making picking up multiple objects impossible?
306
-
307
- const pointerId = (data as ThreeEvent<PointerEvent>).pointerId
308
- if (pointerId !== undefined) {
309
- const capturedMeshSet = internal.capturedMap.get(pointerId)
310
- if (capturedMeshSet) {
311
- const captured = capturedMeshSet.get(eventObject)
312
- if (captured && captured.localState.stopped) return
313
- }
314
- }*/
315
- if (isPointerMove) {
316
- // Move event ...
317
- if (handlers?.pointerover || handlers?.pointerenter || handlers?.pointerout || handlers?.pointerleave) {
318
- // When enter or out is present take care of hover-state
319
- const id = makeId(data);
320
- const hoveredItem = internal.hovered.get(id);
321
- if (!hoveredItem) {
322
- // If the object wasn't previously hovered, book it and call its handler
323
- internal.hovered.set(id, data);
324
- handlers.pointerover?.(data);
325
- handlers.pointerenter?.(data);
326
- }
327
- else if (hoveredItem.stopped) {
328
- // If the object was previously hovered and stopped, we shouldn't allow other items to proceed
329
- data.stopPropagation();
330
- }
331
- }
332
- // Call mouse move
333
- handlers?.pointermove?.(data);
334
- }
335
- else {
336
- // All other events ...
337
- const handler = handlers?.[name];
338
- if (handler) {
339
- // Forward all events back to their respective handlers with the exception of click events,
340
- // which must use the initial target
341
- if (!isClickEvent || internal.initialHits.includes(eventObject)) {
342
- // Missed events have to come first
343
- pointerMissed(event, internal.interaction.filter((object) => !internal.initialHits.includes(object)));
344
- // Now call the handler
345
- handler(data);
346
- }
347
- }
348
- else {
349
- // Trigger onPointerMissed on all elements that have pointer over/out handlers, but not click and weren't hit
350
- if (isClickEvent && internal.initialHits.includes(eventObject)) {
351
- pointerMissed(event, internal.interaction.filter((object) => !internal.initialHits.includes(object)));
352
- }
353
- }
354
- }
355
- }
356
- handleIntersects(hits, event, delta, onIntersect);
357
- };
358
- }
359
- return { handlePointer };
360
- }
361
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZXZlbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBMEIsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFVM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd0Qzs7O0dBR0c7QUFDSCxTQUFTLDZCQUE2QixDQUNyQyxXQUFnRSxFQUNoRSxHQUFhLEVBQ2IsUUFBZ0QsRUFDaEQsU0FBaUI7SUFFakIsTUFBTSxXQUFXLEdBQXdDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0UsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNqQixRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLHlEQUF5RDtRQUN6RCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QixXQUFXLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDRixDQUFDO0FBQ0YsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUErQixFQUFFLE1BQWdCO0lBQ3BGLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQ3BDLHVEQUF1RDtJQUN2RCxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDeEUsUUFBUSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0s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QUFDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbnRlcnNlY3Rpb24sIE9iamVjdDNELCBWZWN0b3IzIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSB9IGZyb20gJy4vaW5zdGFuY2UnO1xuaW1wb3J0IHtcblx0Tmd0QW55UmVjb3JkLFxuXHROZ3REb21FdmVudCxcblx0Tmd0RXZlbnRIYW5kbGVycyxcblx0Tmd0SW50ZXJzZWN0aW9uLFxuXHROZ3RQb2ludGVyQ2FwdHVyZVRhcmdldCxcblx0Tmd0U3RhdGUsXG5cdE5ndFRocmVlRXZlbnQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgbWFrZUlkIH0gZnJvbSAnLi91dGlscy9tYWtlJztcbmltcG9ydCB7IE5ndFNpZ25hbFN0b3JlIH0gZnJvbSAnLi91dGlscy9zaWduYWwtc3RvcmUnO1xuXG4vKipcbiAqIFJlbGVhc2UgcG9pbnRlciBjYXB0dXJlcy5cbiAqIFRoaXMgaXMgY2FsbGVkIGJ5IHJlbGVhc2VQb2ludGVyQ2FwdHVyZSBpbiB0aGUgQVBJLCBhbmQgd2hlbiBhbiBvYmplY3QgaXMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gcmVsZWFzZUludGVybmFsUG9pbnRlckNhcHR1cmUoXG5cdGNhcHR1cmVkTWFwOiBNYXA8bnVtYmVyLCBNYXA8T2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0Pj4sXG5cdG9iajogT2JqZWN0M0QsXG5cdGNhcHR1cmVzOiBNYXA8T2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0Pixcblx0cG9pbnRlcklkOiBudW1iZXIsXG4pOiB2b2lkIHtcblx0Y29uc3QgY2FwdHVyZURhdGE6IE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0IHwgdW5kZWZpbmVkID0gY2FwdHVyZXMuZ2V0KG9iaik7XG5cdGlmIChjYXB0dXJlRGF0YSkge1xuXHRcdGNhcHR1cmVzLmRlbGV0ZShvYmopO1xuXHRcdC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IGNhcHR1cmluZyBvYmplY3QgZm9yIHRoaXMgcG9pbnRlclxuXHRcdGlmIChjYXB0dXJlcy5zaXplID09PSAwKSB7XG5cdFx0XHRjYXB0dXJlZE1hcC5kZWxldGUocG9pbnRlcklkKTtcblx0XHRcdGNhcHR1cmVEYXRhLnRhcmdldC5yZWxlYXNlUG9pbnRlckNhcHR1cmUocG9pbnRlcklkKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUludGVyYWN0aXZpdHkoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiwgb2JqZWN0OiBPYmplY3QzRCkge1xuXHRjb25zdCB7IGludGVybmFsIH0gPSBzdG9yZS5zbmFwc2hvdDtcblx0Ly8gUmVtb3ZlcyBldmVyeSB0cmFjZSBvZiBhbiBvYmplY3QgZnJvbSB0aGUgZGF0YSBzdG9yZVxuXHRpbnRlcm5hbC5pbnRlcmFjdGlvbiA9IGludGVybmFsLmludGVyYWN0aW9uLmZpbHRlcigobykgPT4gbyAhPT0gb2JqZWN0KTtcblx0aW50ZXJuYWwuaW5pdGlhbEhpdHMgPSBpbnRlcm5hbC5pbml0aWFsSGl0cy5maWx0ZXIoKG8pID0+IG8gIT09IG9iamVjdCk7XG5cdGludGVybmFsLmhvdmVyZWQuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuXHRcdGlmICh2YWx1ZS5ldmVudE9iamVjdCA9PT0gb2JqZWN0IHx8IHZhbHVlLm9iamVjdCA9PT0gb2JqZWN0KSB7XG5cdFx0XHQvLyBDbGVhciBvdXQgaW50ZXJzZWN0cywgdGhleSBhcmUgb3V0ZGF0ZWQgYnkgbm93XG5cdFx0XHRpbnRlcm5hbC5ob3ZlcmVkLmRlbGV0ZShrZXkpO1xuXHRcdH1cblx0fSk7XG5cdGludGVybmFsLmNhcHR1cmVkTWFwLmZvckVhY2goKGNhcHR1cmVzLCBwb2ludGVySWQpID0+IHtcblx0XHRyZWxlYXNlSW50ZXJuYWxQb2ludGVyQ2FwdHVyZShpbnRlcm5hbC5jYXB0dXJlZE1hcCwgb2JqZWN0LCBjYXB0dXJlcywgcG9pbnRlcklkKTtcblx0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmVudHMoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPikge1xuXHQvKiogQ2FsY3VsYXRlcyBkZWx0YSAqL1xuXHRmdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZShldmVudDogTmd0RG9tRXZlbnQpIHtcblx0XHRjb25zdCBpbnRlcm5hbCA9IHN0b3JlLmdldCgnaW50ZXJuYWwnKTtcblx0XHRjb25zdCBkeCA9IGV2ZW50Lm9mZnNldFggLSBpbnRlcm5hbC5pbml0aWFsQ2xpY2tbMF07XG5cdFx0Y29uc3QgZHkgPSBldmVudC5vZmZzZXRZIC0gaW50ZXJuYWwuaW5pdGlhbENsaWNrWzFdO1xuXHRcdHJldHVybiBNYXRoLnJvdW5kKE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkpO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdHJ1ZSBpZiBhbiBpbnN0YW5jZSBoYXMgYSB2YWxpZCBwb2ludGVyLWV2ZW50IHJlZ2lzdGVyZWQsIHRoaXMgZXhjbHVkZXMgc2Nyb2xsLCBjbGlja3MgZXRjICovXG5cdGZ1bmN0aW9uIGZpbHRlclBvaW50ZXJFdmVudHMob2JqZWN0czogT2JqZWN0M0RbXSkge1xuXHRcdHJldHVybiBvYmplY3RzLmZpbHRlcigob2JqKSA9PlxuXHRcdFx0Wydtb3ZlJywgJ292ZXInLCAnZW50ZXInLCAnb3V0JywgJ2xlYXZlJ10uc29tZSgobmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBldmVudE5hbWUgPSBgcG9pbnRlciR7bmFtZX1gIGFzIGtleW9mIE5ndEV2ZW50SGFuZGxlcnM7XG5cdFx0XHRcdHJldHVybiBnZXRMb2NhbFN0YXRlKG9iaik/LmhhbmRsZXJzPy5bZXZlbnROYW1lXTtcblx0XHRcdH0pLFxuXHRcdCk7XG5cdH1cblxuXHRmdW5jdGlvbiBpbnRlcnNlY3QoZXZlbnQ6IE5ndERvbUV2ZW50LCBmaWx0ZXI/OiAob2JqZWN0czogT2JqZWN0M0RbXSkgPT4gT2JqZWN0M0RbXSkge1xuXHRcdGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0KCk7XG5cdFx0Y29uc3QgZHVwbGljYXRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGNvbnN0IGludGVyc2VjdGlvbnM6IE5ndEludGVyc2VjdGlvbltdID0gW107XG5cdFx0Ly8gQWxsb3cgY2FsbGVycyB0byBlbGltaW5hdGUgZXZlbnQgb2JqZWN0c1xuXHRcdGNvbnN0IGV2ZW50c09iamVjdHMgPSBmaWx0ZXIgPyBmaWx0ZXIoc3RhdGUuaW50ZXJuYWwuaW50ZXJhY3Rpb24pIDogc3RhdGUuaW50ZXJuYWwuaW50ZXJhY3Rpb247XG5cdFx0Ly8gUmVzZXQgYWxsIHJheWNhc3RlciBjYW1lcmFzIHRvIHVuZGVmaW5lZFxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnRzT2JqZWN0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgb2JqZWN0Um9vdFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShldmVudHNPYmplY3RzW2ldKT8uc3RvcmUuc25hcHNob3Q7XG5cdFx0XHRpZiAob2JqZWN0Um9vdFN0YXRlKSB7XG5cdFx0XHRcdG9iamVjdFJvb3RTdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID0gdW5kZWZpbmVkITtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIXN0YXRlLnByZXZpb3VzUm9vdCkge1xuXHRcdFx0Ly8gTWFrZSBzdXJlIHJvb3QtbGV2ZWwgcG9pbnRlciBhbmQgcmF5IGFyZSBzZXQgdXBcblx0XHRcdHN0YXRlLmV2ZW50cy5jb21wdXRlPy4oZXZlbnQsIHN0b3JlLCBudWxsKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBoYW5kbGVSYXljYXN0KG9iajogT2JqZWN0M0QpIHtcblx0XHRcdGNvbnN0IG9ialN0b3JlID0gZ2V0TG9jYWxTdGF0ZShvYmopPy5zdG9yZTtcblx0XHRcdGNvbnN0IG9ialN0YXRlID0gb2JqU3RvcmU/LnNuYXBzaG90O1xuXHRcdFx0Ly8gU2tpcCBldmVudCBoYW5kbGluZyB3aGVuIG5vRXZlbnRzIGlzIHNldCwgb3Igd2hlbiB0aGUgcmF5Y2FzdGVycyBjYW1lcmEgaXMgbnVsbFxuXHRcdFx0aWYgKCFvYmpTdGF0ZSB8fCAhb2JqU3RhdGUuZXZlbnRzLmVuYWJsZWQgfHwgb2JqU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuXG5cdFx0XHQvLyBXaGVuIHRoZSBjYW1lcmEgaXMgdW5kZWZpbmVkIHdlIGhhdmUgdG8gY2FsbCB0aGUgZXZlbnQgbGF5ZXJzIHVwZGF0ZSBmdW5jdGlvblxuXHRcdFx0aWYgKG9ialN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRvYmpTdGF0ZS5ldmVudHMuY29tcHV0ZT8uKGV2ZW50LCBvYmpTdG9yZSwgb2JqU3RhdGUucHJldmlvdXNSb290KTtcblx0XHRcdFx0Ly8gSWYgdGhlIGNhbWVyYSBpcyBzdGlsbCB1bmRlZmluZWQgd2UgaGF2ZSB0byBza2lwIHRoaXMgbGF5ZXIgZW50aXJlbHlcblx0XHRcdFx0aWYgKG9ialN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPT09IHVuZGVmaW5lZCkgb2JqU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9IG51bGwhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbnRlcnNlY3Qgb2JqZWN0IGJ5IG9iamVjdFxuXHRcdFx0cmV0dXJuIG9ialN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPyBvYmpTdGF0ZS5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0KG9iaiwgdHJ1ZSkgOiBbXTtcblx0XHR9XG5cblx0XHQvLyBDb2xsZWN0IGV2ZW50c1xuXHRcdGxldCBoaXRzOiBJbnRlcnNlY3Rpb248T2JqZWN0M0Q+W10gPSBldmVudHNPYmplY3RzXG5cdFx0XHQvLyBJbnRlcnNlY3Qgb2JqZWN0c1xuXHRcdFx0LmZsYXRNYXAoaGFuZGxlUmF5Y2FzdClcblx0XHRcdC8vIFNvcnQgYnkgZXZlbnQgcHJpb3JpdHkgYW5kIGRpc3RhbmNlXG5cdFx0XHQuc29ydCgoYSwgYikgPT4ge1xuXHRcdFx0XHRjb25zdCBhU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGEub2JqZWN0KT8uc3RvcmUuc25hcHNob3Q7XG5cdFx0XHRcdGNvbnN0IGJTdGF0ZSA9IGdldExvY2FsU3RhdGUoYi5vYmplY3QpPy5zdG9yZS5zbmFwc2hvdDtcblx0XHRcdFx0aWYgKCFhU3RhdGUgfHwgIWJTdGF0ZSkgcmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlO1xuXHRcdFx0XHRyZXR1cm4gYlN0YXRlLmV2ZW50cy5wcmlvcml0eSAtIGFTdGF0ZS5ldmVudHMucHJpb3JpdHkgfHwgYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XG5cdFx0XHR9KVxuXHRcdFx0Ly8gRmlsdGVyIG91dCBkdXBsaWNhdGVzXG5cdFx0XHQuZmlsdGVyKChpdGVtKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGlkID0gbWFrZUlkKGl0ZW0gYXMgTmd0SW50ZXJzZWN0aW9uKTtcblx0XHRcdFx0aWYgKGR1cGxpY2F0ZXMuaGFzKGlkKSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRkdXBsaWNhdGVzLmFkZChpZCk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2lzc3Vlcy8xNjAzMVxuXHRcdC8vIEFsbG93IGN1c3RvbSB1c2VybGFuZCBpbnRlcnNlY3Qgc29ydCBvcmRlciwgdGhpcyBsaWtlbHkgb25seSBtYWtlcyBzZW5zZSBvbiB0aGUgcm9vdCBmaWx0ZXJcblx0XHRpZiAoc3RhdGUuZXZlbnRzLmZpbHRlcikgaGl0cyA9IHN0YXRlLmV2ZW50cy5maWx0ZXIoaGl0cywgc3RvcmUpO1xuXG5cdFx0Ly8gQnViYmxlIHVwIHRoZSBldmVudHMsIGZpbmQgdGhlIGV2ZW50IHNvdXJjZSAoZXZlbnRPYmplY3QpXG5cdFx0Zm9yIChjb25zdCBoaXQgb2YgaGl0cykge1xuXHRcdFx0bGV0IGV2ZW50T2JqZWN0OiBPYmplY3QzRCB8IG51bGwgPSBoaXQub2JqZWN0O1xuXHRcdFx0Ly8gYnViYmxlIGV2ZW50IHVwXG5cdFx0XHR3aGlsZSAoZXZlbnRPYmplY3QpIHtcblx0XHRcdFx0aWYgKGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3QpPy5ldmVudENvdW50KSBpbnRlcnNlY3Rpb25zLnB1c2goeyAuLi5oaXQsIGV2ZW50T2JqZWN0IH0pO1xuXHRcdFx0XHRldmVudE9iamVjdCA9IGV2ZW50T2JqZWN0LnBhcmVudDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgaW50ZXJhY3Rpb24gaXMgY2FwdHVyZWQsIG1ha2UgYWxsIGNhcHR1cmluZyB0YXJnZXRzIHBhcnQgb2YgdGhlIGludGVyc2VjdC5cblx0XHRpZiAoJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgc3RhdGUuaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcblx0XHRcdGZvciAoY29uc3QgY2FwdHVyZURhdGEgb2Ygc3RhdGUuaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGV2ZW50LnBvaW50ZXJJZCkhLnZhbHVlcygpKSB7XG5cdFx0XHRcdGlmICghZHVwbGljYXRlcy5oYXMobWFrZUlkKGNhcHR1cmVEYXRhLmludGVyc2VjdGlvbikpKSBpbnRlcnNlY3Rpb25zLnB1c2goY2FwdHVyZURhdGEuaW50ZXJzZWN0aW9uKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGludGVyc2VjdGlvbnM7XG5cdH1cblxuXHQvKiogIEhhbmRsZXMgaW50ZXJzZWN0aW9ucyBieSBmb3J3YXJkaW5nIHRoZW0gdG8gaGFuZGxlcnMgKi9cblx0ZnVuY3Rpb24gaGFuZGxlSW50ZXJzZWN0cyhcblx0XHRpbnRlcnNlY3Rpb25zOiBOZ3RJbnRlcnNlY3Rpb25bXSxcblx0XHRldmVudDogTmd0RG9tRXZlbnQsXG5cdFx0ZGVsdGE6IG51bWJlcixcblx0XHRjYWxsYmFjazogKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PE5ndERvbUV2ZW50PikgPT4gdm9pZCxcblx0KSB7XG5cdFx0Y29uc3Qgcm9vdFN0YXRlID0gc3RvcmUuc25hcHNob3Q7XG5cblx0XHQvLyBJZiBhbnl0aGluZyBoYXMgYmVlbiBmb3VuZCwgZm9yd2FyZCBpdCB0byB0aGUgZXZlbnQgbGlzdGVuZXJzXG5cdFx0aWYgKGludGVyc2VjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBsb2NhbFN0YXRlID0geyBzdG9wcGVkOiBmYWxzZSB9O1xuXHRcdFx0Zm9yIChjb25zdCBoaXQgb2YgaW50ZXJzZWN0aW9ucykge1xuXHRcdFx0XHRjb25zdCB7IHJheWNhc3RlciwgcG9pbnRlciwgY2FtZXJhLCBpbnRlcm5hbCB9ID0gZ2V0TG9jYWxTdGF0ZShoaXQub2JqZWN0KT8uc3RvcmUuc25hcHNob3QgfHwgcm9vdFN0YXRlO1xuXHRcdFx0XHRjb25zdCB1bnByb2plY3RlZFBvaW50ID0gbmV3IFZlY3RvcjMocG9pbnRlci54LCBwb2ludGVyLnksIDApLnVucHJvamVjdChjYW1lcmEpO1xuXHRcdFx0XHRjb25zdCBoYXNQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoaWQpPy5oYXMoaGl0LmV2ZW50T2JqZWN0KSA/PyBmYWxzZTtcblxuXHRcdFx0XHRjb25zdCBzZXRQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2FwdHVyZURhdGEgPSB7IGludGVyc2VjdGlvbjogaGl0LCB0YXJnZXQ6IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50IH07XG5cdFx0XHRcdFx0aWYgKGludGVybmFsLmNhcHR1cmVkTWFwLmhhcyhpZCkpIHtcblx0XHRcdFx0XHRcdC8vIGlmIHRoZSBwb2ludGVySWQgd2FzIHByZXZpb3VzbHkgY2FwdHVyZWQsIHdlIGFkZCB0aGUgaGl0IHRvIHRoZVxuXHRcdFx0XHRcdFx0Ly8gZXZlbnQgY2FwdHVyZWRNYXAuXG5cdFx0XHRcdFx0XHRpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoaWQpIS5zZXQoaGl0LmV2ZW50T2JqZWN0LCBjYXB0dXJlRGF0YSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIGlmIHRoZSBwb2ludGVySWQgd2FzIG5vdCBwcmV2aW91c2x5IGNhcHR1cmVkLCB3ZSBjcmVhdGUgYSBtYXBcblx0XHRcdFx0XHRcdC8vIGNvbnRhaW5pbmcgdGhlIGhpdE9iamVjdCwgYW5kIHRoZSBoaXQuIGhpdE9iamVjdCBpcyB1c2VkIGZvclxuXHRcdFx0XHRcdFx0Ly8gZmFzdGVyIGFjY2Vzcy5cblx0XHRcdFx0XHRcdGludGVybmFsLmNhcHR1cmVkTWFwLnNldChpZCwgbmV3IE1hcChbW2hpdC5ldmVudE9iamVjdCwgY2FwdHVyZURhdGFdXSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBDYWxsIHRoZSBvcmlnaW5hbCBldmVudCBub3dcblx0XHRcdFx0XHQoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLnNldFBvaW50ZXJDYXB0dXJlKGlkKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRjb25zdCByZWxlYXNlUG9pbnRlckNhcHR1cmUgPSAoaWQ6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNhcHR1cmVzID0gaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGlkKTtcblx0XHRcdFx0XHRpZiAoY2FwdHVyZXMpIHtcblx0XHRcdFx0XHRcdHJlbGVhc2VJbnRlcm5hbFBvaW50ZXJDYXB0dXJlKGludGVybmFsLmNhcHR1cmVkTWFwLCBoaXQuZXZlbnRPYmplY3QsIGNhcHR1cmVzLCBpZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIEFkZCBuYXRpdmUgZXZlbnQgcHJvcHNcblx0XHRcdFx0Y29uc3QgZXh0cmFjdEV2ZW50UHJvcHM6IGFueSA9IHt9O1xuXHRcdFx0XHQvLyBUaGlzIGl0ZXJhdGVzIG92ZXIgdGhlIGV2ZW50J3MgcHJvcGVydGllcyBpbmNsdWRpbmcgdGhlIGluaGVyaXRlZCBvbmVzLiBOYXRpdmUgUG9pbnRlckV2ZW50cyBoYXZlIG1vc3Qgb2YgdGhlaXIgcHJvcHMgYXMgZ2V0dGVycyB3aGljaCBhcmUgaW5oZXJpdGVkLCBidXQgcG9seWZpbGxlZCBQb2ludGVyRXZlbnRzIGhhdmUgdGhlbSBhbGwgYXMgdGhlaXIgb3duIHByb3BlcnRpZXMgKGkuZS4gbm90IGluaGVyaXRlZCkuIFdlIGNhbid0IHVzZSBPYmplY3Qua2V5cygpIG9yIE9iamVjdC5lbnRyaWVzKCkgYXMgdGhleSBvbmx5IHJldHVybiBcIm93blwiIHByb3BlcnRpZXM7IG5vciBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZXZlbnQpIGFzIHRoYXQgKmRvZXNuJ3QqIHJldHVybiBcIm93blwiIHByb3BlcnRpZXMsIG9ubHkgaW5oZXJpdGVkIG9uZXMuXG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcCBpbiBldmVudCkge1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gZXZlbnRbcHJvcCBhcyBrZXlvZiBOZ3REb21FdmVudF07XG5cdFx0XHRcdFx0Ly8gT25seSBjb3B5IG92ZXIgYXRvbWljcywgbGVhdmUgZnVuY3Rpb25zIGFsb25lIGFzIHRoZXNlIHNob3VsZCBiZVxuXHRcdFx0XHRcdC8vIGNhbGxlZCBhcyBldmVudC5uYXRpdmVFdmVudC5mbigpXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ2Z1bmN0aW9uJykgZXh0cmFjdEV2ZW50UHJvcHNbcHJvcF0gPSBwcm9wZXJ0eTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHJheWNhc3RFdmVudDogTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4gPSB7XG5cdFx0XHRcdFx0Li4uaGl0LFxuXHRcdFx0XHRcdC4uLmV4dHJhY3RFdmVudFByb3BzLFxuXHRcdFx0XHRcdHBvaW50ZXIsXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9ucyxcblx0XHRcdFx0XHRzdG9wcGVkOiBsb2NhbFN0YXRlLnN0b3BwZWQsXG5cdFx0XHRcdFx0ZGVsdGEsXG5cdFx0XHRcdFx0dW5wcm9qZWN0ZWRQb2ludCxcblx0XHRcdFx0XHRyYXk6IHJheWNhc3Rlci5yYXksXG5cdFx0XHRcdFx0Y2FtZXJhLFxuXHRcdFx0XHRcdC8vIEhpamFjayBzdG9wUHJvcGFnYXRpb24sIHdoaWNoIGp1c3Qgc2V0cyBhIGZsYWdcblx0XHRcdFx0XHRzdG9wUHJvcGFnYXRpb24oKSB7XG5cdFx0XHRcdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vcG1uZHJzL3JlYWN0LXRocmVlLWZpYmVyL2lzc3Vlcy81OTZcblx0XHRcdFx0XHRcdC8vIEV2ZW50cyBhcmUgbm90IGFsbG93ZWQgdG8gc3RvcCBwcm9wYWdhdGlvbiBpZiB0aGUgcG9pbnRlciBoYXMgYmVlbiBjYXB0dXJlZFxuXHRcdFx0XHRcdFx0Y29uc3QgY2FwdHVyZXNGb3JQb2ludGVyID0gJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGV2ZW50LnBvaW50ZXJJZCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIG9ubHkgYXV0aG9yaXplIHN0b3BQcm9wYWdhdGlvbi4uLlxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHQvLyAuLi5pZiB0aGlzIHBvaW50ZXIgaGFzbid0IGJlZW4gY2FwdHVyZWRcblx0XHRcdFx0XHRcdFx0IWNhcHR1cmVzRm9yUG9pbnRlciB8fFxuXHRcdFx0XHRcdFx0XHQvLyAuLi4gb3IgaWYgdGhlIGhpdCBvYmplY3QgaXMgY2FwdHVyaW5nIHRoZSBwb2ludGVyXG5cdFx0XHRcdFx0XHRcdGNhcHR1cmVzRm9yUG9pbnRlci5oYXMoaGl0LmV2ZW50T2JqZWN0KVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHJheWNhc3RFdmVudC5zdG9wcGVkID0gbG9jYWxTdGF0ZS5zdG9wcGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0Ly8gUHJvcGFnYXRpb24gaXMgc3RvcHBlZCwgcmVtb3ZlIGFsbCBvdGhlciBob3ZlciByZWNvcmRzXG5cdFx0XHRcdFx0XHRcdC8vIEFuIGV2ZW50IGhhbmRsZXIgaXMgb25seSBhbGxvd2VkIHRvIGZsdXNoIG90aGVyIGhhbmRsZXJzIGlmIGl0IGlzIGhvdmVyZWQgaXRzZWxmXG5cdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRpbnRlcm5hbC5ob3ZlcmVkLnNpemUgJiZcblx0XHRcdFx0XHRcdFx0XHRBcnJheS5mcm9tKGludGVybmFsLmhvdmVyZWQudmFsdWVzKCkpLmZpbmQoKGkpID0+IGkuZXZlbnRPYmplY3QgPT09IGhpdC5ldmVudE9iamVjdClcblx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT2JqZWN0cyBjYW5ub3QgZmx1c2ggb3V0IGhpZ2hlciB1cCBvYmplY3RzIHRoYXQgaGF2ZSBhbHJlYWR5IGNhdWdodCB0aGUgZXZlbnRcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBoaWdoZXIgPSBpbnRlcnNlY3Rpb25zLnNsaWNlKDAsIGludGVyc2VjdGlvbnMuaW5kZXhPZihoaXQpKTtcblx0XHRcdFx0XHRcdFx0XHRjYW5jZWxQb2ludGVyKFsuLi5oaWdoZXIsIGhpdF0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQvLyB0aGVyZSBzaG91bGQgYmUgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRhcmdldCBhbmQgY3VycmVudFRhcmdldFxuXHRcdFx0XHRcdHRhcmdldDogeyBoYXNQb2ludGVyQ2FwdHVyZSwgc2V0UG9pbnRlckNhcHR1cmUsIHJlbGVhc2VQb2ludGVyQ2FwdHVyZSB9LFxuXHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQ6IHsgaGFzUG9pbnRlckNhcHR1cmUsIHNldFBvaW50ZXJDYXB0dXJlLCByZWxlYXNlUG9pbnRlckNhcHR1cmUgfSxcblx0XHRcdFx0XHRuYXRpdmVFdmVudDogZXZlbnQsXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gQ2FsbCBzdWJzY3JpYmVyc1xuXHRcdFx0XHRjYWxsYmFjayhyYXljYXN0RXZlbnQpO1xuXHRcdFx0XHQvLyBFdmVudCBidWJibGluZyBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgc3RvcFByb3BhZ2F0aW9uXG5cdFx0XHRcdGlmIChsb2NhbFN0YXRlLnN0b3BwZWQpIGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW50ZXJzZWN0aW9ucztcblx0fVxuXG5cdGZ1bmN0aW9uIGNhbmNlbFBvaW50ZXIoaW50ZXJzZWN0aW9uczogTmd0SW50ZXJzZWN0aW9uW10pIHtcblx0XHRjb25zdCBpbnRlcm5hbCA9IHN0b3JlLmdldCgnaW50ZXJuYWwnKTtcblx0XHRmb3IgKGNvbnN0IGhvdmVyZWRPYmogb2YgaW50ZXJuYWwuaG92ZXJlZC52YWx1ZXMoKSkge1xuXHRcdFx0Ly8gV2hlbiBubyBvYmplY3RzIHdlcmUgaGl0IG9yIHRoZSB0aGUgaG92ZXJlZCBvYmplY3Qgd2Fzbid0IGZvdW5kIHVuZGVybmVhdGggdGhlIGN1cnNvclxuXHRcdFx0Ly8gd2UgY2FsbCBvblBvaW50ZXJPdXQgYW5kIGRlbGV0ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGhvdmVyZWQtZWxlbWVudHMgbWFwXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFpbnRlcnNlY3Rpb25zLmxlbmd0aCB8fFxuXHRcdFx0XHQhaW50ZXJzZWN0aW9ucy5maW5kKFxuXHRcdFx0XHRcdChoaXQpID0+XG5cdFx0XHRcdFx0XHRoaXQub2JqZWN0ID09PSBob3ZlcmVkT2JqLm9iamVjdCAmJlxuXHRcdFx0XHRcdFx0aGl0LmluZGV4ID09PSBob3ZlcmVkT2JqLmluZGV4ICYmXG5cdFx0XHRcdFx0XHRoaXQuaW5zdGFuY2VJZCA9PT0gaG92ZXJlZE9iai5pbnN0YW5jZUlkLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgZXZlbnRPYmplY3QgPSBob3ZlcmVkT2JqLmV2ZW50T2JqZWN0O1xuXHRcdFx0XHRjb25zdCBpbnN0YW5jZSA9IGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3QpO1xuXHRcdFx0XHRjb25zdCBoYW5kbGVycyA9IGluc3RhbmNlPy5oYW5kbGVycztcblx0XHRcdFx0aW50ZXJuYWwuaG92ZXJlZC5kZWxldGUobWFrZUlkKGhvdmVyZWRPYmopKTtcblx0XHRcdFx0aWYgKGluc3RhbmNlPy5ldmVudENvdW50KSB7XG5cdFx0XHRcdFx0Ly8gQ2xlYXIgb3V0IGludGVyc2VjdHMsIHRoZXkgYXJlIG91dGRhdGVkIGJ5IG5vd1xuXHRcdFx0XHRcdGNvbnN0IGRhdGEgPSB7IC4uLmhvdmVyZWRPYmosIGludGVyc2VjdGlvbnMgfTtcblx0XHRcdFx0XHRoYW5kbGVycz8ucG9pbnRlcm91dD8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcblx0XHRcdFx0XHRoYW5kbGVycz8ucG9pbnRlcmxlYXZlPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gcG9pbnRlck1pc3NlZChldmVudDogTW91c2VFdmVudCwgb2JqZWN0czogT2JqZWN0M0RbXSkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBnZXRMb2NhbFN0YXRlKG9iamVjdHNbaV0pO1xuXHRcdFx0aW5zdGFuY2U/LmhhbmRsZXJzLnBvaW50ZXJtaXNzZWQ/LihldmVudCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gaGFuZGxlUG9pbnRlcihuYW1lOiBzdHJpbmcpIHtcblx0XHQvLyBEZWFsIHdpdGggY2FuY2VsYXRpb25cblx0XHRzd2l0Y2ggKG5hbWUpIHtcblx0XHRcdGNhc2UgJ3BvaW50ZXJsZWF2ZSc6XG5cdFx0XHRjYXNlICdwb2ludGVyY2FuY2VsJzpcblx0XHRcdFx0cmV0dXJuICgpID0+IGNhbmNlbFBvaW50ZXIoW10pO1xuXHRcdFx0Y2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcblx0XHRcdFx0cmV0dXJuIChldmVudDogTmd0RG9tRXZlbnQpID0+IHtcblx0XHRcdFx0XHRjb25zdCB7IGludGVybmFsIH0gPSBzdG9yZS5zbmFwc2hvdDtcblx0XHRcdFx0XHRpZiAoJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBvYmplY3QgZXZlbnQgaW50ZXJmYWNlIGhhZCBsb3N0cG9pbnRlcmNhcHR1cmUsIHdlJ2QgY2FsbCBpdCBoZXJlIG9uIGV2ZXJ5XG5cdFx0XHRcdFx0XHQvLyBvYmplY3QgdGhhdCdzIGdldHRpbmcgcmVtb3ZlZC4gV2UgY2FsbCBpdCBvbiB0aGUgbmV4dCBmcmFtZSBiZWNhdXNlIGxvc3Rwb2ludGVyY2FwdHVyZVxuXHRcdFx0XHRcdFx0Ly8gZmlyZXMgYmVmb3JlIHBvaW50ZXJ1cC4gT3RoZXJ3aXNlIHBvaW50ZXJVcCB3b3VsZCBuZXZlciBiZSBjYWxsZWQgaWYgdGhlIGV2ZW50IGRpZG4ndFxuXHRcdFx0XHRcdFx0Ly8gaGFwcGVuIGluIHRoZSBvYmplY3QgaXQgb3JpZ2luYXRlZCBmcm9tLCBsZWF2aW5nIGNvbXBvbmVudHMgaW4gYSBpbi1iZXR3ZWVuIHN0YXRlLlxuXHRcdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gT25seSByZWxlYXNlIGlmIHBvaW50ZXItdXAgZGlkbid0IGRvIGl0IGFscmVhZHlcblx0XHRcdFx0XHRcdFx0aWYgKGludGVybmFsLmNhcHR1cmVkTWFwLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG5cdFx0XHRcdFx0XHRcdFx0aW50ZXJuYWwuY2FwdHVyZWRNYXAuZGVsZXRlKGV2ZW50LnBvaW50ZXJJZCk7XG5cdFx0XHRcdFx0XHRcdFx0Y2FuY2VsUG9pbnRlcihbXSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBBbnkgb3RoZXIgcG9pbnRlciBnb2VzIGhlcmUgLi4uXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50OiBOZ3REb21FdmVudCkge1xuXHRcdFx0Ly8gTk9URTogcG9pbnRlck1pc3NlZCQgb24gTmd0U3RvcmUgaXMgcHJpdmF0ZVxuXHRcdFx0Y29uc3QgcG9pbnRlck1pc3NlZCQ6IFN1YmplY3Q8TW91c2VFdmVudD4gPSAoc3RvcmUgYXMgTmd0QW55UmVjb3JkKVsncG9pbnRlck1pc3NlZCQnXTtcblx0XHRcdGNvbnN0IGludGVybmFsID0gc3RvcmUuZ2V0KCdpbnRlcm5hbCcpO1xuXG5cdFx0XHQvLyBwcmVwYXJlUmF5KGV2ZW50KVxuXHRcdFx0aW50ZXJuYWwubGFzdEV2ZW50Lm5hdGl2ZUVsZW1lbnQgPSBldmVudDtcblxuXHRcdFx0Ly8gR2V0IGZyZXNoIGludGVyc2VjdHNcblx0XHRcdGNvbnN0IGlzUG9pbnRlck1vdmUgPSBuYW1lID09PSAncG9pbnRlcm1vdmUnO1xuXHRcdFx0Y29uc3QgaXNDbGlja0V2ZW50ID0gbmFtZSA9PT0gJ2NsaWNrJyB8fCBuYW1lID09PSAnY29udGV4dG1lbnUnIHx8IG5hbWUgPT09ICdkYmxjbGljayc7XG5cdFx0XHRjb25zdCBmaWx0ZXIgPSBpc1BvaW50ZXJNb3ZlID8gZmlsdGVyUG9pbnRlckV2ZW50cyA6IHVuZGVmaW5lZDtcblxuXHRcdFx0Y29uc3QgaGl0cyA9IGludGVyc2VjdChldmVudCwgZmlsdGVyKTtcblx0XHRcdGNvbnN0IGRlbHRhID0gaXNDbGlja0V2ZW50ID8gY2FsY3VsYXRlRGlzdGFuY2UoZXZlbnQpIDogMDtcblxuXHRcdFx0Ly8gU2F2ZSBpbml0aWFsIGNvb3JkaW5hdGVzIG9uIHBvaW50ZXItZG93blxuXHRcdFx0aWYgKG5hbWUgPT09ICdwb2ludGVyZG93bicpIHtcblx0XHRcdFx0aW50ZXJuYWwuaW5pdGlhbENsaWNrID0gW2V2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFldO1xuXHRcdFx0XHRpbnRlcm5hbC5pbml0aWFsSGl0cyA9IGhpdHMubWFwKChoaXQpID0+IGhpdC5ldmVudE9iamVjdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgY2xpY2sgeWllbGRzIG5vIHJlc3VsdHMsIHBhc3MgaXQgYmFjayB0byB0aGUgdXNlciBhcyBhIG1pc3Ncblx0XHRcdC8vIE1pc3NlZCBldmVudHMgaGF2ZSB0byBjb21lIGZpcnN0IGluIG9yZGVyIHRvIGVzdGFibGlzaCB1c2VyLWxhbmQgc2lkZS1lZmZlY3QgY2xlYW4gdXBcblx0XHRcdGlmIChpc0NsaWNrRXZlbnQgJiYgIWhpdHMubGVuZ3RoKSB7XG5cdFx0XHRcdGlmIChkZWx0YSA8PSAyKSB7XG5cdFx0XHRcdFx0cG9pbnRlck1pc3NlZChldmVudCwgaW50ZXJuYWwuaW50ZXJhY3Rpb24pO1xuXHRcdFx0XHRcdHBvaW50ZXJNaXNzZWQkLm5leHQoZXZlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgY2FyZSBvZiB1bmhvdmVyXG5cdFx0XHRpZiAoaXNQb2ludGVyTW92ZSkgY2FuY2VsUG9pbnRlcihoaXRzKTtcblxuXHRcdFx0ZnVuY3Rpb24gb25JbnRlcnNlY3QoZGF0YTogTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4pIHtcblx0XHRcdFx0Y29uc3QgZXZlbnRPYmplY3QgPSBkYXRhLmV2ZW50T2JqZWN0O1xuXHRcdFx0XHRjb25zdCBpbnN0YW5jZSA9IGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3QpO1xuXHRcdFx0XHRjb25zdCBoYW5kbGVycyA9IGluc3RhbmNlPy5oYW5kbGVycztcblxuXHRcdFx0XHQvLyBDaGVjayBwcmVzZW5jZSBvZiBoYW5kbGVyc1xuXHRcdFx0XHRpZiAoIWluc3RhbmNlPy5ldmVudENvdW50KSByZXR1cm47XG5cblx0XHRcdFx0LypcbiAgICAgICAgTUFZQkUgVE9ETywgREVMRVRFIElGIE5PVDpcbiAgICAgICAgICBDaGVjayBpZiB0aGUgb2JqZWN0IGlzIGNhcHR1cmVkLCBjYXB0dXJlZCBldmVudHMgc2hvdWxkIG5vdCBoYXZlIGludGVyc2VjdHMgcnVubmluZyBpbiBwYXJhbGxlbFxuICAgICAgICAgIEJ1dCB3b3VsZG4ndCBpdCBiZSBiZXR0ZXIgdG8ganVzdCByZXBsYWNlIGNhcHR1cmVkTWFwIHdpdGggYSBzaW5nbGUgZW50cnk/XG4gICAgICAgICAgQWxzbywgYXJlIHdlIE9LIHdpdGggc3RyYWlnaHQgdXAgbWFraW5nIHBpY2tpbmcgdXAgbXVsdGlwbGUgb2JqZWN0cyBpbXBvc3NpYmxlP1xuXG4gICAgICAgIGNvbnN0IHBvaW50ZXJJZCA9IChkYXRhIGFzIFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50PikucG9pbnRlcklkXG4gICAgICAgIGlmIChwb2ludGVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGNhcHR1cmVkTWVzaFNldCA9IGludGVybmFsLmNhcHR1cmVkTWFwLmdldChwb2ludGVySWQpXG4gICAgICAgICAgaWYgKGNhcHR1cmVkTWVzaFNldCkge1xuICAgICAgICAgICAgY29uc3QgY2FwdHVyZWQgPSBjYXB0dXJlZE1lc2hTZXQuZ2V0KGV2ZW50T2JqZWN0KVxuICAgICAgICAgICAgaWYgKGNhcHR1cmVkICYmIGNhcHR1cmVkLmxvY2FsU3RhdGUuc3RvcHBlZCkgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9Ki9cblxuXHRcdFx0XHRpZiAoaXNQb2ludGVyTW92ZSkge1xuXHRcdFx0XHRcdC8vIE1vdmUgZXZlbnQgLi4uXG5cdFx0XHRcdFx0aWYgKGhhbmRsZXJzPy5wb2ludGVyb3ZlciB8fCBoYW5kbGVycz8ucG9pbnRlcmVudGVyIHx8IGhhbmRsZXJzPy5wb2ludGVyb3V0IHx8IGhhbmRsZXJzPy5wb2ludGVybGVhdmUpIHtcblx0XHRcdFx0XHRcdC8vIFdoZW4gZW50ZXIgb3Igb3V0IGlzIHByZXNlbnQgdGFrZSBjYXJlIG9mIGhvdmVyLXN0YXRlXG5cdFx0XHRcdFx0XHRjb25zdCBpZCA9IG1ha2VJZChkYXRhKTtcblx0XHRcdFx0XHRcdGNvbnN0IGhvdmVyZWRJdGVtID0gaW50ZXJuYWwuaG92ZXJlZC5nZXQoaWQpO1xuXHRcdFx0XHRcdFx0aWYgKCFob3ZlcmVkSXRlbSkge1xuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgb2JqZWN0IHdhc24ndCBwcmV2aW91c2x5IGhvdmVyZWQsIGJvb2sgaXQgYW5kIGNhbGwgaXRzIGhhbmRsZXJcblx0XHRcdFx0XHRcdFx0aW50ZXJuYWwuaG92ZXJlZC5zZXQoaWQsIGRhdGEpO1xuXHRcdFx0XHRcdFx0XHRoYW5kbGVycy5wb2ludGVyb3Zlcj8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcblx0XHRcdFx0XHRcdFx0aGFuZGxlcnMucG9pbnRlcmVudGVyPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChob3ZlcmVkSXRlbS5zdG9wcGVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBvYmplY3Qgd2FzIHByZXZpb3VzbHkgaG92ZXJlZCBhbmQgc3RvcHBlZCwgd2Ugc2hvdWxkbid0IGFsbG93IG90aGVyIGl0ZW1zIHRvIHByb2NlZWRcblx0XHRcdFx0XHRcdFx0ZGF0YS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQ2FsbCBtb3VzZSBtb3ZlXG5cdFx0XHRcdFx0aGFuZGxlcnM/LnBvaW50ZXJtb3ZlPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEFsbCBvdGhlciBldmVudHMgLi4uXG5cdFx0XHRcdFx0Y29uc3QgaGFuZGxlciA9IGhhbmRsZXJzPy5bbmFtZSBhcyBrZXlvZiBOZ3RFdmVudEhhbmRsZXJzXSBhcyAoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50PikgPT4gdm9pZDtcblx0XHRcdFx0XHRpZiAoaGFuZGxlcikge1xuXHRcdFx0XHRcdFx0Ly8gRm9yd2FyZCBhbGwgZXZlbnRzIGJhY2sgdG8gdGhlaXIgcmVzcGVjdGl2ZSBoYW5kbGVycyB3aXRoIHRoZSBleGNlcHRpb24gb2YgY2xpY2sgZXZlbnRzLFxuXHRcdFx0XHRcdFx0Ly8gd2hpY2ggbXVzdCB1c2UgdGhlIGluaXRpYWwgdGFyZ2V0XG5cdFx0XHRcdFx0XHRpZiAoIWlzQ2xpY2tFdmVudCB8fCBpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhldmVudE9iamVjdCkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gTWlzc2VkIGV2ZW50cyBoYXZlIHRvIGNvbWUgZmlyc3Rcblx0XHRcdFx0XHRcdFx0cG9pbnRlck1pc3NlZChcblx0XHRcdFx0XHRcdFx0XHRldmVudCxcblx0XHRcdFx0XHRcdFx0XHRpbnRlcm5hbC5pbnRlcmFjdGlvbi5maWx0ZXIoKG9iamVjdCkgPT4gIWludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKG9iamVjdCkpLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHQvLyBOb3cgY2FsbCB0aGUgaGFuZGxlclxuXHRcdFx0XHRcdFx0XHRoYW5kbGVyKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVHJpZ2dlciBvblBvaW50ZXJNaXNzZWQgb24gYWxsIGVsZW1lbnRzIHRoYXQgaGF2ZSBwb2ludGVyIG92ZXIvb3V0IGhhbmRsZXJzLCBidXQgbm90IGNsaWNrIGFuZCB3ZXJlbid0IGhpdFxuXHRcdFx0XHRcdFx0aWYgKGlzQ2xpY2tFdmVudCAmJiBpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhldmVudE9iamVjdCkpIHtcblx0XHRcdFx0XHRcdFx0cG9pbnRlck1pc3NlZChcblx0XHRcdFx0XHRcdFx0XHRldmVudCxcblx0XHRcdFx0XHRcdFx0XHRpbnRlcm5hbC5pbnRlcmFjdGlvbi5maWx0ZXIoKG9iamVjdCkgPT4gIWludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKG9iamVjdCkpLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRoYW5kbGVJbnRlcnNlY3RzKGhpdHMsIGV2ZW50LCBkZWx0YSwgb25JbnRlcnNlY3QpO1xuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4geyBoYW5kbGVQb2ludGVyIH07XG59XG4iXX0=
@@ -1,44 +0,0 @@
1
- var _a;
2
- import { DestroyRef, Directive, ElementRef, inject, InjectionToken, } from '@angular/core';
3
- import { HTML } from './renderer';
4
- import { DOM_PARENT } from './renderer/constants';
5
- import { injectStore } from './store';
6
- import * as i0 from "@angular/core";
7
- const NGT_HTML_DOM_ELEMENT = new InjectionToken('NGT_HTML_DOM_ELEMENT');
8
- export function provideHTMLDomElement(...args) {
9
- if (args.length === 0) {
10
- return { provide: NGT_HTML_DOM_ELEMENT, useFactory: () => 'gl' };
11
- }
12
- if (args.length === 1) {
13
- return { provide: NGT_HTML_DOM_ELEMENT, useFactory: args[0] };
14
- }
15
- return { provide: NGT_HTML_DOM_ELEMENT, useFactory: args.pop(), deps: args };
16
- }
17
- export class NgtHTML {
18
- static { _a = HTML; }
19
- static { this[_a] = true; }
20
- constructor() {
21
- this.store = injectStore();
22
- this.destroyRef = inject(DestroyRef);
23
- this.host = inject(ElementRef);
24
- this.domElement = inject(NGT_HTML_DOM_ELEMENT, { self: true, optional: true });
25
- if (this.domElement === 'gl') {
26
- Object.assign(this.host.nativeElement, {
27
- [DOM_PARENT]: this.store.snapshot.gl.domElement.parentElement,
28
- });
29
- }
30
- else if (this.domElement) {
31
- Object.assign(this.host.nativeElement, { [DOM_PARENT]: this.domElement });
32
- }
33
- this.destroyRef.onDestroy(() => {
34
- this.host.nativeElement[DOM_PARENT] = null;
35
- delete this.host.nativeElement[DOM_PARENT];
36
- });
37
- }
38
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtHTML, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
39
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.11", type: NgtHTML, ngImport: i0 }); }
40
- }
41
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtHTML, decorators: [{
42
- type: Directive
43
- }], ctorParameters: () => [] });
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL2h0bWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTixVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sY0FBYyxHQUlkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7O0FBR3RDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQXFCLHNCQUFzQixDQUFDLENBQUM7QUFVNUYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEdBQUcsSUFBVztJQUNuRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbEUsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMvRCxDQUFDO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM5RSxDQUFDO0FBR0QsTUFBTSxPQUFnQixPQUFPO2tCQUNwQixJQUFJO2FBQUwsUUFBTSxHQUFHLElBQUksQUFBUCxDQUFRO0lBT3JCO1FBTFUsVUFBSyxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsU0FBSSxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUM7UUFDbkQsZUFBVSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFHbkYsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RDLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhO2FBQzdELENBQUMsQ0FBQztRQUNKLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM1QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBOEIsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDN0QsT0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQThCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOytHQXJCb0IsT0FBTzttR0FBUCxPQUFPOzs0RkFBUCxPQUFPO2tCQUQ1QixTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0QWJzdHJhY3RUeXBlLFxuXHREZXN0cm95UmVmLFxuXHREaXJlY3RpdmUsXG5cdEVsZW1lbnRSZWYsXG5cdGluamVjdCxcblx0SW5qZWN0aW9uVG9rZW4sXG5cdFByb3ZpZGVyLFxuXHRQcm92aWRlclRva2VuLFxuXHRUeXBlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhUTUwgfSBmcm9tICcuL3JlbmRlcmVyJztcbmltcG9ydCB7IERPTV9QQVJFTlQgfSBmcm9tICcuL3JlbmRlcmVyL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpbmplY3RTdG9yZSB9IGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IHsgTmd0QW55UmVjb3JkIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IE5HVF9IVE1MX0RPTV9FTEVNRU5UID0gbmV3IEluamVjdGlvblRva2VuPCdnbCcgfCBIVE1MRWxlbWVudD4oJ05HVF9IVE1MX0RPTV9FTEVNRU5UJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlSFRNTERvbUVsZW1lbnQoKTogUHJvdmlkZXI7XG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUhUTUxEb21FbGVtZW50KGZhY3Rvcnk6ICgpID0+IEhUTUxFbGVtZW50KTogUHJvdmlkZXI7XG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUhUTUxEb21FbGVtZW50PFxuXHRURGVwcyBleHRlbmRzIEFycmF5PFByb3ZpZGVyVG9rZW48YW55Pj4sXG5cdFRWYWx1ZXMgZXh0ZW5kcyB7XG5cdFx0W0sgaW4ga2V5b2YgVERlcHNdOiBURGVwc1tLXSBleHRlbmRzIFR5cGU8aW5mZXIgVD4gfCBBYnN0cmFjdFR5cGU8aW5mZXIgVD4gfCBJbmplY3Rpb25Ub2tlbjxpbmZlciBUPiA/IFQgOiBuZXZlcjtcblx0fSxcbj4oZGVwczogVERlcHMsIGZhY3Rvcnk6ICguLi5hcmdzOiBUVmFsdWVzKSA9PiBIVE1MRWxlbWVudCk6IFByb3ZpZGVyO1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVIVE1MRG9tRWxlbWVudCguLi5hcmdzOiBhbnlbXSkge1xuXHRpZiAoYXJncy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4geyBwcm92aWRlOiBOR1RfSFRNTF9ET01fRUxFTUVOVCwgdXNlRmFjdG9yeTogKCkgPT4gJ2dsJyB9O1xuXHR9XG5cblx0aWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG5cdFx0cmV0dXJuIHsgcHJvdmlkZTogTkdUX0hUTUxfRE9NX0VMRU1FTlQsIHVzZUZhY3Rvcnk6IGFyZ3NbMF0gfTtcblx0fVxuXG5cdHJldHVybiB7IHByb3ZpZGU6IE5HVF9IVE1MX0RPTV9FTEVNRU5ULCB1c2VGYWN0b3J5OiBhcmdzLnBvcCgpLCBkZXBzOiBhcmdzIH07XG59XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5ndEhUTUwge1xuXHRzdGF0aWMgW0hUTUxdID0gdHJ1ZTtcblxuXHRwcm90ZWN0ZWQgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXHRwcm90ZWN0ZWQgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblx0cHJvdGVjdGVkIGhvc3QgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuXHRwcm90ZWN0ZWQgZG9tRWxlbWVudCA9IGluamVjdChOR1RfSFRNTF9ET01fRUxFTUVOVCwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRpZiAodGhpcy5kb21FbGVtZW50ID09PSAnZ2wnKSB7XG5cdFx0XHRPYmplY3QuYXNzaWduKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LCB7XG5cdFx0XHRcdFtET01fUEFSRU5UXTogdGhpcy5zdG9yZS5zbmFwc2hvdC5nbC5kb21FbGVtZW50LnBhcmVudEVsZW1lbnQsXG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuZG9tRWxlbWVudCkge1xuXHRcdFx0T2JqZWN0LmFzc2lnbih0aGlzLmhvc3QubmF0aXZlRWxlbWVudCwgeyBbRE9NX1BBUkVOVF06IHRoaXMuZG9tRWxlbWVudCB9KTtcblx0XHR9XG5cblx0XHR0aGlzLmRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcblx0XHRcdCh0aGlzLmhvc3QubmF0aXZlRWxlbWVudCBhcyBOZ3RBbnlSZWNvcmQpW0RPTV9QQVJFTlRdID0gbnVsbDtcblx0XHRcdGRlbGV0ZSAodGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQgYXMgTmd0QW55UmVjb3JkKVtET01fUEFSRU5UXTtcblx0XHR9KTtcblx0fVxufVxuIl19
@@ -1,83 +0,0 @@
1
- import { computed } from '@angular/core';
2
- import { signalStore } from './utils/signal-store';
3
- import { checkUpdate } from './utils/update';
4
- export function getLocalState(obj) {
5
- if (!obj)
6
- return undefined;
7
- return obj['__ngt__'];
8
- }
9
- export function invalidateInstance(instance) {
10
- let store = getLocalState(instance)?.store;
11
- if (store) {
12
- while (store.snapshot.previousRoot) {
13
- store = store.snapshot.previousRoot;
14
- }
15
- if (store.snapshot.internal.frames === 0) {
16
- store.snapshot.invalidate();
17
- }
18
- }
19
- checkUpdate(instance);
20
- }
21
- export function prepare(object, localState) {
22
- const instance = object;
23
- if (localState?.primitive || !instance.__ngt__) {
24
- const { instanceStore = signalStore({
25
- parent: null,
26
- objects: [],
27
- nonObjects: [],
28
- geometryStamp: Date.now(),
29
- }), ...rest } = localState || {};
30
- const nonObjects = instanceStore.select('nonObjects');
31
- const geometryStamp = instanceStore.select('geometryStamp');
32
- const nonObjectsChanged = computed(() => {
33
- const [_nonObjects] = [nonObjects(), geometryStamp()];
34
- return _nonObjects;
35
- });
36
- instance.__ngt__ = {
37
- previousAttach: null,
38
- store: null,
39
- memoized: {},
40
- eventCount: 0,
41
- handlers: {},
42
- instanceStore,
43
- parent: instanceStore.select('parent'),
44
- objects: instanceStore.select('objects'),
45
- nonObjects: nonObjectsChanged,
46
- add(object, type) {
47
- const current = instance.__ngt__.instanceStore.snapshot[type];
48
- const foundIndex = current.findIndex((node) => object === node || (!!object.uuid && !!node.uuid && object.uuid === node.uuid));
49
- if (foundIndex > -1) {
50
- current.splice(foundIndex, 1, object);
51
- instance.__ngt__.instanceStore.update({ [type]: current });
52
- }
53
- else {
54
- instance.__ngt__.instanceStore.update((prev) => ({ [type]: [...prev[type], object] }));
55
- }
56
- notifyAncestors(instance.__ngt__.instanceStore.snapshot.parent, type);
57
- },
58
- remove(object, type) {
59
- instance.__ngt__.instanceStore.update((prev) => ({ [type]: prev[type].filter((node) => node !== object) }));
60
- notifyAncestors(instance.__ngt__.instanceStore.snapshot.parent, type);
61
- },
62
- setParent(parent) {
63
- instance.__ngt__.instanceStore.update({ parent });
64
- },
65
- updateGeometryStamp() {
66
- instance.__ngt__.instanceStore.update({ geometryStamp: Date.now() });
67
- },
68
- ...rest,
69
- };
70
- }
71
- return instance;
72
- }
73
- function notifyAncestors(instance, type) {
74
- if (!instance)
75
- return;
76
- const localState = getLocalState(instance);
77
- if (!localState)
78
- return;
79
- const { parent } = localState.instanceStore.snapshot;
80
- localState.instanceStore.update({ [type]: (localState.instanceStore.snapshot[type] || []).slice() });
81
- notifyAncestors(parent, type);
82
- }
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsTUFBTSxVQUFVLGFBQWEsQ0FBMkIsR0FBMEI7SUFDakYsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMzQixPQUFRLEdBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FBMkIsUUFBbUI7SUFDL0UsSUFBSSxLQUFLLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUUzQyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BDLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNyQyxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0YsQ0FBQztJQUVELFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FDdEIsTUFBaUIsRUFDakIsVUFBbUM7SUFFbkMsTUFBTSxRQUFRLEdBQUcsTUFBK0MsQ0FBQztJQUVqRSxJQUFJLFVBQVUsRUFBRSxTQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEQsTUFBTSxFQUNMLGFBQWEsR0FBRyxXQUFXLENBQXdCO1lBQ2xELE1BQU0sRUFBRSxJQUFJO1lBQ1osT0FBTyxFQUFFLEVBQUU7WUFDWCxVQUFVLEVBQUUsRUFBRTtZQUNkLGFBQWEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1NBQ3pCLENBQUMsRUFDRixHQUFHLElBQUksRUFDUCxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFFckIsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RCxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTVELE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUN2QyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELE9BQU8sV0FBVyxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLE9BQU8sR0FBRztZQUNsQixjQUFjLEVBQUUsSUFBSTtZQUNwQixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLENBQUM7WUFDYixRQUFRLEVBQUUsRUFBRTtZQUNaLGFBQWE7WUFDYixNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDdEMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ3hDLFVBQVUsRUFBRSxpQkFBaUI7WUFDN0IsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJO2dCQUNmLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FDbkMsQ0FBQyxJQUFxQixFQUFFLEVBQUUsQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3pHLENBQUM7Z0JBRUYsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDckIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUN0QyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQzVELENBQUM7cUJBQU0sQ0FBQztvQkFDUCxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hGLENBQUM7Z0JBRUQsZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUNELE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSTtnQkFDbEIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVHLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFDRCxTQUFTLENBQUMsTUFBTTtnQkFDZixRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFDRCxtQkFBbUI7Z0JBQ2xCLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLENBQUM7WUFDRCxHQUFHLElBQUk7U0FDVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNqQixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsUUFBZ0MsRUFBRSxJQUE4QjtJQUN4RixJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU87SUFDdEIsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTztJQUN4QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDckQsVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ3RBbnlSZWNvcmQsIE5ndEluc3RhbmNlTm9kZSwgTmd0TG9jYWxJbnN0YW5jZVN0YXRlLCBOZ3RMb2NhbFN0YXRlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBzaWduYWxTdG9yZSB9IGZyb20gJy4vdXRpbHMvc2lnbmFsLXN0b3JlJztcbmltcG9ydCB7IGNoZWNrVXBkYXRlIH0gZnJvbSAnLi91dGlscy91cGRhdGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxTdGF0ZTxUSW5zdGFuY2UgZXh0ZW5kcyBvYmplY3Q+KG9iajogVEluc3RhbmNlIHwgdW5kZWZpbmVkKTogTmd0TG9jYWxTdGF0ZSB8IHVuZGVmaW5lZCB7XG5cdGlmICghb2JqKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRyZXR1cm4gKG9iaiBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9fJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkYXRlSW5zdGFuY2U8VEluc3RhbmNlIGV4dGVuZHMgb2JqZWN0PihpbnN0YW5jZTogVEluc3RhbmNlKSB7XG5cdGxldCBzdG9yZSA9IGdldExvY2FsU3RhdGUoaW5zdGFuY2UpPy5zdG9yZTtcblxuXHRpZiAoc3RvcmUpIHtcblx0XHR3aGlsZSAoc3RvcmUuc25hcHNob3QucHJldmlvdXNSb290KSB7XG5cdFx0XHRzdG9yZSA9IHN0b3JlLnNuYXBzaG90LnByZXZpb3VzUm9vdDtcblx0XHR9XG5cblx0XHRpZiAoc3RvcmUuc25hcHNob3QuaW50ZXJuYWwuZnJhbWVzID09PSAwKSB7XG5cdFx0XHRzdG9yZS5zbmFwc2hvdC5pbnZhbGlkYXRlKCk7XG5cdFx0fVxuXHR9XG5cblx0Y2hlY2tVcGRhdGUoaW5zdGFuY2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZTxUSW5zdGFuY2UgZXh0ZW5kcyBvYmplY3QgPSBOZ3RBbnlSZWNvcmQ+KFxuXHRvYmplY3Q6IFRJbnN0YW5jZSxcblx0bG9jYWxTdGF0ZT86IFBhcnRpYWw8Tmd0TG9jYWxTdGF0ZT4sXG4pIHtcblx0Y29uc3QgaW5zdGFuY2UgPSBvYmplY3QgYXMgdW5rbm93biBhcyBOZ3RJbnN0YW5jZU5vZGU8VEluc3RhbmNlPjtcblxuXHRpZiAobG9jYWxTdGF0ZT8ucHJpbWl0aXZlIHx8ICFpbnN0YW5jZS5fX25ndF9fKSB7XG5cdFx0Y29uc3Qge1xuXHRcdFx0aW5zdGFuY2VTdG9yZSA9IHNpZ25hbFN0b3JlPE5ndExvY2FsSW5zdGFuY2VTdGF0ZT4oe1xuXHRcdFx0XHRwYXJlbnQ6IG51bGwsXG5cdFx0XHRcdG9iamVjdHM6IFtdLFxuXHRcdFx0XHRub25PYmplY3RzOiBbXSxcblx0XHRcdFx0Z2VvbWV0cnlTdGFtcDogRGF0ZS5ub3coKSxcblx0XHRcdH0pLFxuXHRcdFx0Li4ucmVzdFxuXHRcdH0gPSBsb2NhbFN0YXRlIHx8IHt9O1xuXG5cdFx0Y29uc3Qgbm9uT2JqZWN0cyA9IGluc3RhbmNlU3RvcmUuc2VsZWN0KCdub25PYmplY3RzJyk7XG5cdFx0Y29uc3QgZ2VvbWV0cnlTdGFtcCA9IGluc3RhbmNlU3RvcmUuc2VsZWN0KCdnZW9tZXRyeVN0YW1wJyk7XG5cblx0XHRjb25zdCBub25PYmplY3RzQ2hhbmdlZCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdGNvbnN0IFtfbm9uT2JqZWN0c10gPSBbbm9uT2JqZWN0cygpLCBnZW9tZXRyeVN0YW1wKCldO1xuXHRcdFx0cmV0dXJuIF9ub25PYmplY3RzO1xuXHRcdH0pO1xuXG5cdFx0aW5zdGFuY2UuX19uZ3RfXyA9IHtcblx0XHRcdHByZXZpb3VzQXR0YWNoOiBudWxsLFxuXHRcdFx0c3RvcmU6IG51bGwsXG5cdFx0XHRtZW1vaXplZDoge30sXG5cdFx0XHRldmVudENvdW50OiAwLFxuXHRcdFx0aGFuZGxlcnM6IHt9LFxuXHRcdFx0aW5zdGFuY2VTdG9yZSxcblx0XHRcdHBhcmVudDogaW5zdGFuY2VTdG9yZS5zZWxlY3QoJ3BhcmVudCcpLFxuXHRcdFx0b2JqZWN0czogaW5zdGFuY2VTdG9yZS5zZWxlY3QoJ29iamVjdHMnKSxcblx0XHRcdG5vbk9iamVjdHM6IG5vbk9iamVjdHNDaGFuZ2VkLFxuXHRcdFx0YWRkKG9iamVjdCwgdHlwZSkge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50ID0gaW5zdGFuY2UuX19uZ3RfXy5pbnN0YW5jZVN0b3JlLnNuYXBzaG90W3R5cGVdO1xuXHRcdFx0XHRjb25zdCBmb3VuZEluZGV4ID0gY3VycmVudC5maW5kSW5kZXgoXG5cdFx0XHRcdFx0KG5vZGU6IE5ndEluc3RhbmNlTm9kZSkgPT4gb2JqZWN0ID09PSBub2RlIHx8ICghIW9iamVjdC51dWlkICYmICEhbm9kZS51dWlkICYmIG9iamVjdC51dWlkID09PSBub2RlLnV1aWQpLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmIChmb3VuZEluZGV4ID4gLTEpIHtcblx0XHRcdFx0XHRjdXJyZW50LnNwbGljZShmb3VuZEluZGV4LCAxLCBvYmplY3QpO1xuXHRcdFx0XHRcdGluc3RhbmNlLl9fbmd0X18uaW5zdGFuY2VTdG9yZS51cGRhdGUoeyBbdHlwZV06IGN1cnJlbnQgfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aW5zdGFuY2UuX19uZ3RfXy5pbnN0YW5jZVN0b3JlLnVwZGF0ZSgocHJldikgPT4gKHsgW3R5cGVdOiBbLi4ucHJldlt0eXBlXSwgb2JqZWN0XSB9KSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRub3RpZnlBbmNlc3RvcnMoaW5zdGFuY2UuX19uZ3RfXy5pbnN0YW5jZVN0b3JlLnNuYXBzaG90LnBhcmVudCwgdHlwZSk7XG5cdFx0XHR9LFxuXHRcdFx0cmVtb3ZlKG9iamVjdCwgdHlwZSkge1xuXHRcdFx0XHRpbnN0YW5jZS5fX25ndF9fLmluc3RhbmNlU3RvcmUudXBkYXRlKChwcmV2KSA9PiAoeyBbdHlwZV06IHByZXZbdHlwZV0uZmlsdGVyKChub2RlKSA9PiBub2RlICE9PSBvYmplY3QpIH0pKTtcblx0XHRcdFx0bm90aWZ5QW5jZXN0b3JzKGluc3RhbmNlLl9fbmd0X18uaW5zdGFuY2VTdG9yZS5zbmFwc2hvdC5wYXJlbnQsIHR5cGUpO1xuXHRcdFx0fSxcblx0XHRcdHNldFBhcmVudChwYXJlbnQpIHtcblx0XHRcdFx0aW5zdGFuY2UuX19uZ3RfXy5pbnN0YW5jZVN0b3JlLnVwZGF0ZSh7IHBhcmVudCB9KTtcblx0XHRcdH0sXG5cdFx0XHR1cGRhdGVHZW9tZXRyeVN0YW1wKCkge1xuXHRcdFx0XHRpbnN0YW5jZS5fX25ndF9fLmluc3RhbmNlU3RvcmUudXBkYXRlKHsgZ2VvbWV0cnlTdGFtcDogRGF0ZS5ub3coKSB9KTtcblx0XHRcdH0sXG5cdFx0XHQuLi5yZXN0LFxuXHRcdH0gYXMgTmd0TG9jYWxTdGF0ZTtcblx0fVxuXG5cdHJldHVybiBpbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gbm90aWZ5QW5jZXN0b3JzKGluc3RhbmNlOiBOZ3RJbnN0YW5jZU5vZGUgfCBudWxsLCB0eXBlOiAnb2JqZWN0cycgfCAnbm9uT2JqZWN0cycpIHtcblx0aWYgKCFpbnN0YW5jZSkgcmV0dXJuO1xuXHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShpbnN0YW5jZSk7XG5cdGlmICghbG9jYWxTdGF0ZSkgcmV0dXJuO1xuXHRjb25zdCB7IHBhcmVudCB9ID0gbG9jYWxTdGF0ZS5pbnN0YW5jZVN0b3JlLnNuYXBzaG90O1xuXHRsb2NhbFN0YXRlLmluc3RhbmNlU3RvcmUudXBkYXRlKHsgW3R5cGVdOiAobG9jYWxTdGF0ZS5pbnN0YW5jZVN0b3JlLnNuYXBzaG90W3R5cGVdIHx8IFtdKS5zbGljZSgpIH0pO1xuXHRub3RpZnlBbmNlc3RvcnMocGFyZW50LCB0eXBlKTtcbn1cbiJdfQ==