angular-three-rapier 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.
- package/fesm2022/angular-three-rapier.mjs +69 -74
- package/fesm2022/angular-three-rapier.mjs.map +1 -1
- package/lib/instanced-rigid-bodies.d.ts +2 -2
- package/lib/mesh-collider.d.ts +2 -2
- package/lib/physics.d.ts +1 -1
- package/lib/types.d.ts +0 -10
- package/package.json +3 -5
- package/esm2022/angular-three-rapier.mjs +0 -5
- package/esm2022/index.mjs +0 -7
- package/esm2022/lib/colliders.mjs +0 -356
- package/esm2022/lib/debug.mjs +0 -46
- package/esm2022/lib/frame-stepper.mjs +0 -44
- package/esm2022/lib/instanced-rigid-bodies.mjs +0 -192
- package/esm2022/lib/joints.mjs +0 -111
- package/esm2022/lib/mesh-collider.mjs +0 -67
- package/esm2022/lib/physics.mjs +0 -391
- package/esm2022/lib/rigid-body.mjs +0 -561
- package/esm2022/lib/shared.mjs +0 -10
- package/esm2022/lib/types.mjs +0 -2
- package/esm2022/lib/utils.mjs +0 -151
package/esm2022/lib/physics.mjs
DELETED
|
@@ -1,391 +0,0 @@
|
|
|
1
|
-
import { NgTemplateOutlet } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, computed, contentChild, DestroyRef, Directive, effect, inject, input, signal, TemplateRef, untracked, } from '@angular/core';
|
|
3
|
-
import { EventQueue } from '@dimforge/rapier3d-compat';
|
|
4
|
-
import { injectStore, pick, vector3 } from 'angular-three';
|
|
5
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
6
|
-
import { MathUtils } from 'three';
|
|
7
|
-
import { NgtrDebug } from './debug';
|
|
8
|
-
import { NgtrFrameStepper } from './frame-stepper';
|
|
9
|
-
import { _matrix4, _position, _rotation, _scale } from './shared';
|
|
10
|
-
import { createSingletonProxy, rapierQuaternionToQuaternion } from './utils';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
const defaultOptions = {
|
|
13
|
-
gravity: [0, -9.81, 0],
|
|
14
|
-
allowedLinearError: 0.001,
|
|
15
|
-
numSolverIterations: 4,
|
|
16
|
-
numAdditionalFrictionIterations: 4,
|
|
17
|
-
numInternalPgsIterations: 1,
|
|
18
|
-
predictionDistance: 0.002,
|
|
19
|
-
minIslandSize: 128,
|
|
20
|
-
maxCcdSubsteps: 1,
|
|
21
|
-
contactNaturalFrequency: 30,
|
|
22
|
-
erp: 0.8,
|
|
23
|
-
lengthUnit: 1,
|
|
24
|
-
colliders: 'cuboid',
|
|
25
|
-
updateLoop: 'follow',
|
|
26
|
-
interpolate: true,
|
|
27
|
-
paused: false,
|
|
28
|
-
timeStep: 1 / 60,
|
|
29
|
-
debug: false,
|
|
30
|
-
};
|
|
31
|
-
export class NgtrPhysicsFallback {
|
|
32
|
-
static ngTemplateContextGuard(_, ctx) {
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtrPhysicsFallback, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
36
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.11", type: NgtrPhysicsFallback, isStandalone: true, selector: "ng-template[rapierFallback]", ngImport: i0 });
|
|
37
|
-
}
|
|
38
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtrPhysicsFallback, decorators: [{
|
|
39
|
-
type: Directive,
|
|
40
|
-
args: [{ selector: 'ng-template[rapierFallback]', standalone: true }]
|
|
41
|
-
}] });
|
|
42
|
-
export class NgtrPhysics {
|
|
43
|
-
options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
44
|
-
content = contentChild.required(TemplateRef);
|
|
45
|
-
fallbackContent = contentChild(NgtrPhysicsFallback, { read: TemplateRef });
|
|
46
|
-
updatePriority = pick(this.options, 'updatePriority');
|
|
47
|
-
updateLoop = pick(this.options, 'updateLoop');
|
|
48
|
-
numSolverIterations = pick(this.options, 'numSolverIterations');
|
|
49
|
-
numAdditionalFrictionIterations = pick(this.options, 'numAdditionalFrictionIterations');
|
|
50
|
-
numInternalPgsIterations = pick(this.options, 'numInternalPgsIterations');
|
|
51
|
-
allowedLinearError = pick(this.options, 'allowedLinearError');
|
|
52
|
-
minIslandSize = pick(this.options, 'minIslandSize');
|
|
53
|
-
maxCcdSubsteps = pick(this.options, 'maxCcdSubsteps');
|
|
54
|
-
predictionDistance = pick(this.options, 'predictionDistance');
|
|
55
|
-
contactNaturalFrequency = pick(this.options, 'contactNaturalFrequency');
|
|
56
|
-
lengthUnit = pick(this.options, 'lengthUnit');
|
|
57
|
-
timeStep = pick(this.options, 'timeStep');
|
|
58
|
-
interpolate = pick(this.options, 'interpolate');
|
|
59
|
-
paused = pick(this.options, 'paused');
|
|
60
|
-
debug = pick(this.options, 'debug');
|
|
61
|
-
colliders = pick(this.options, 'colliders');
|
|
62
|
-
vGravity = vector3(this.options, 'gravity');
|
|
63
|
-
store = injectStore();
|
|
64
|
-
rapierConstruct = signal(null);
|
|
65
|
-
rapierError = signal(null);
|
|
66
|
-
rapier = this.rapierConstruct.asReadonly();
|
|
67
|
-
ready = computed(() => !!this.rapier());
|
|
68
|
-
worldSingleton = computed(() => {
|
|
69
|
-
const rapier = this.rapier();
|
|
70
|
-
if (!rapier)
|
|
71
|
-
return null;
|
|
72
|
-
return createSingletonProxy(() => new rapier.World(untracked(this.vGravity)));
|
|
73
|
-
});
|
|
74
|
-
rigidBodyStates = new Map();
|
|
75
|
-
colliderStates = new Map();
|
|
76
|
-
rigidBodyEvents = new Map();
|
|
77
|
-
colliderEvents = new Map();
|
|
78
|
-
beforeStepCallbacks = new Set();
|
|
79
|
-
afterStepCallbacks = new Set();
|
|
80
|
-
eventQueue = computed(() => {
|
|
81
|
-
const rapier = this.rapier();
|
|
82
|
-
if (!rapier)
|
|
83
|
-
return null;
|
|
84
|
-
return new EventQueue(false);
|
|
85
|
-
});
|
|
86
|
-
steppingState = { accumulator: 0, previousState: {} };
|
|
87
|
-
constructor() {
|
|
88
|
-
import('@dimforge/rapier3d-compat')
|
|
89
|
-
.then((rapier) => rapier.init().then(() => rapier))
|
|
90
|
-
.then(this.rapierConstruct.set.bind(this.rapierConstruct))
|
|
91
|
-
.catch((err) => {
|
|
92
|
-
console.error(`[NGT] Failed to load rapier3d-compat`, err);
|
|
93
|
-
this.rapierError.set(err?.message ?? err.toString());
|
|
94
|
-
});
|
|
95
|
-
effect(() => {
|
|
96
|
-
this.updateWorldEffect();
|
|
97
|
-
});
|
|
98
|
-
inject(DestroyRef).onDestroy(() => {
|
|
99
|
-
const world = this.worldSingleton();
|
|
100
|
-
if (world) {
|
|
101
|
-
world.proxy.free();
|
|
102
|
-
world.reset();
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
step(delta) {
|
|
107
|
-
if (!this.paused()) {
|
|
108
|
-
this.internalStep(delta);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
updateWorldEffect() {
|
|
112
|
-
const world = this.worldSingleton();
|
|
113
|
-
if (!world)
|
|
114
|
-
return;
|
|
115
|
-
world.proxy.gravity = this.vGravity();
|
|
116
|
-
world.proxy.integrationParameters.numSolverIterations = this.numSolverIterations();
|
|
117
|
-
world.proxy.integrationParameters.numAdditionalFrictionIterations = this.numAdditionalFrictionIterations();
|
|
118
|
-
world.proxy.integrationParameters.numInternalPgsIterations = this.numInternalPgsIterations();
|
|
119
|
-
world.proxy.integrationParameters.normalizedAllowedLinearError = this.allowedLinearError();
|
|
120
|
-
world.proxy.integrationParameters.minIslandSize = this.minIslandSize();
|
|
121
|
-
world.proxy.integrationParameters.maxCcdSubsteps = this.maxCcdSubsteps();
|
|
122
|
-
world.proxy.integrationParameters.normalizedPredictionDistance = this.predictionDistance();
|
|
123
|
-
world.proxy.integrationParameters.contact_natural_frequency = this.contactNaturalFrequency();
|
|
124
|
-
world.proxy.lengthUnit = this.lengthUnit();
|
|
125
|
-
}
|
|
126
|
-
internalStep(delta) {
|
|
127
|
-
const worldSingleton = this.worldSingleton();
|
|
128
|
-
if (!worldSingleton)
|
|
129
|
-
return;
|
|
130
|
-
const eventQueue = this.eventQueue();
|
|
131
|
-
if (!eventQueue)
|
|
132
|
-
return;
|
|
133
|
-
const world = worldSingleton.proxy;
|
|
134
|
-
const [timeStep, interpolate, paused] = [this.timeStep(), this.interpolate(), this.paused()];
|
|
135
|
-
/* Check if the timestep is supposed to be variable. We'll do this here
|
|
136
|
-
once so we don't have to string-check every frame. */
|
|
137
|
-
const timeStepVariable = timeStep === 'vary';
|
|
138
|
-
/**
|
|
139
|
-
* Fixed timeStep simulation progression.
|
|
140
|
-
* @see https://gafferongames.com/post/fix_your_timestep/
|
|
141
|
-
*/
|
|
142
|
-
const clampedDelta = MathUtils.clamp(delta, 0, 0.5);
|
|
143
|
-
const stepWorld = (innerDelta) => {
|
|
144
|
-
// Trigger beforeStep callbacks
|
|
145
|
-
this.beforeStepCallbacks.forEach((callback) => {
|
|
146
|
-
callback(world);
|
|
147
|
-
});
|
|
148
|
-
world.timestep = innerDelta;
|
|
149
|
-
world.step(eventQueue);
|
|
150
|
-
// Trigger afterStep callbacks
|
|
151
|
-
this.afterStepCallbacks.forEach((callback) => {
|
|
152
|
-
callback(world);
|
|
153
|
-
});
|
|
154
|
-
};
|
|
155
|
-
if (timeStepVariable) {
|
|
156
|
-
stepWorld(clampedDelta);
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
// don't step time forwards if paused
|
|
160
|
-
// Increase accumulator
|
|
161
|
-
this.steppingState.accumulator += clampedDelta;
|
|
162
|
-
while (this.steppingState.accumulator >= timeStep) {
|
|
163
|
-
// Set up previous state
|
|
164
|
-
// needed for accurate interpolations if the world steps more than once
|
|
165
|
-
if (interpolate) {
|
|
166
|
-
this.steppingState.previousState = {};
|
|
167
|
-
world.forEachRigidBody((body) => {
|
|
168
|
-
this.steppingState.previousState[body.handle] = {
|
|
169
|
-
position: body.translation(),
|
|
170
|
-
rotation: body.rotation(),
|
|
171
|
-
};
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
stepWorld(timeStep);
|
|
175
|
-
this.steppingState.accumulator -= timeStep;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
const interpolationAlpha = timeStepVariable || !interpolate || paused ? 1 : this.steppingState.accumulator / timeStep;
|
|
179
|
-
// Update meshes
|
|
180
|
-
this.rigidBodyStates.forEach((state, handle) => {
|
|
181
|
-
const rigidBody = world.getRigidBody(handle);
|
|
182
|
-
const events = this.rigidBodyEvents.get(handle);
|
|
183
|
-
if (events?.onSleep || events?.onWake) {
|
|
184
|
-
if (rigidBody.isSleeping() && !state.isSleeping)
|
|
185
|
-
events?.onSleep?.();
|
|
186
|
-
if (!rigidBody.isSleeping() && state.isSleeping)
|
|
187
|
-
events?.onWake?.();
|
|
188
|
-
state.isSleeping = rigidBody.isSleeping();
|
|
189
|
-
}
|
|
190
|
-
if (!rigidBody || (rigidBody.isSleeping() && !('isInstancedMesh' in state.object)) || !state.setMatrix) {
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
// New states
|
|
194
|
-
let t = rigidBody.translation();
|
|
195
|
-
let r = rigidBody.rotation();
|
|
196
|
-
let previousState = this.steppingState.previousState[handle];
|
|
197
|
-
if (previousState) {
|
|
198
|
-
// Get previous simulated world position
|
|
199
|
-
_matrix4
|
|
200
|
-
.compose(previousState.position, rapierQuaternionToQuaternion(previousState.rotation), state.scale)
|
|
201
|
-
.premultiply(state.invertedWorldMatrix)
|
|
202
|
-
.decompose(_position, _rotation, _scale);
|
|
203
|
-
// Apply previous tick position
|
|
204
|
-
if (state.meshType == 'mesh') {
|
|
205
|
-
state.object.position.copy(_position);
|
|
206
|
-
state.object.quaternion.copy(_rotation);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
// Get new position
|
|
210
|
-
_matrix4
|
|
211
|
-
.compose(t, rapierQuaternionToQuaternion(r), state.scale)
|
|
212
|
-
.premultiply(state.invertedWorldMatrix)
|
|
213
|
-
.decompose(_position, _rotation, _scale);
|
|
214
|
-
if (state.meshType == 'instancedMesh') {
|
|
215
|
-
state.setMatrix(_matrix4);
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
// Interpolate to new position
|
|
219
|
-
state.object.position.lerp(_position, interpolationAlpha);
|
|
220
|
-
state.object.quaternion.slerp(_rotation, interpolationAlpha);
|
|
221
|
-
}
|
|
222
|
-
});
|
|
223
|
-
eventQueue.drainCollisionEvents((handle1, handle2, started) => {
|
|
224
|
-
const source1 = this.getSourceFromColliderHandle(handle1);
|
|
225
|
-
const source2 = this.getSourceFromColliderHandle(handle2);
|
|
226
|
-
// Collision Events
|
|
227
|
-
if (!source1?.collider.object || !source2?.collider.object) {
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
const collisionPayload1 = this.getCollisionPayloadFromSource(source1, source2);
|
|
231
|
-
const collisionPayload2 = this.getCollisionPayloadFromSource(source2, source1);
|
|
232
|
-
if (started) {
|
|
233
|
-
world.contactPair(source1.collider.object, source2.collider.object, (manifold, flipped) => {
|
|
234
|
-
/* RigidBody events */
|
|
235
|
-
source1.rigidBody.events?.onCollisionEnter?.({ ...collisionPayload1, manifold, flipped });
|
|
236
|
-
source2.rigidBody.events?.onCollisionEnter?.({ ...collisionPayload2, manifold, flipped });
|
|
237
|
-
/* Collider events */
|
|
238
|
-
source1.collider.events?.onCollisionEnter?.({ ...collisionPayload1, manifold, flipped });
|
|
239
|
-
source2.collider.events?.onCollisionEnter?.({ ...collisionPayload2, manifold, flipped });
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
source1.rigidBody.events?.onCollisionExit?.(collisionPayload1);
|
|
244
|
-
source2.rigidBody.events?.onCollisionExit?.(collisionPayload2);
|
|
245
|
-
source1.collider.events?.onCollisionExit?.(collisionPayload1);
|
|
246
|
-
source2.collider.events?.onCollisionExit?.(collisionPayload2);
|
|
247
|
-
}
|
|
248
|
-
// Sensor Intersections
|
|
249
|
-
if (started) {
|
|
250
|
-
if (world.intersectionPair(source1.collider.object, source2.collider.object)) {
|
|
251
|
-
source1.rigidBody.events?.onIntersectionEnter?.(collisionPayload1);
|
|
252
|
-
source2.rigidBody.events?.onIntersectionEnter?.(collisionPayload2);
|
|
253
|
-
source1.collider.events?.onIntersectionEnter?.(collisionPayload1);
|
|
254
|
-
source2.collider.events?.onIntersectionEnter?.(collisionPayload2);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
source1.rigidBody.events?.onIntersectionExit?.(collisionPayload1);
|
|
259
|
-
source2.rigidBody.events?.onIntersectionExit?.(collisionPayload2);
|
|
260
|
-
source1.collider.events?.onIntersectionExit?.(collisionPayload1);
|
|
261
|
-
source2.collider.events?.onIntersectionExit?.(collisionPayload2);
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
eventQueue.drainContactForceEvents((event) => {
|
|
265
|
-
const source1 = this.getSourceFromColliderHandle(event.collider1());
|
|
266
|
-
const source2 = this.getSourceFromColliderHandle(event.collider2());
|
|
267
|
-
// Collision Events
|
|
268
|
-
if (!source1?.collider.object || !source2?.collider.object) {
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
const collisionPayload1 = this.getCollisionPayloadFromSource(source1, source2);
|
|
272
|
-
const collisionPayload2 = this.getCollisionPayloadFromSource(source2, source1);
|
|
273
|
-
source1.rigidBody.events?.onContactForce?.({
|
|
274
|
-
...collisionPayload1,
|
|
275
|
-
totalForce: event.totalForce(),
|
|
276
|
-
totalForceMagnitude: event.totalForceMagnitude(),
|
|
277
|
-
maxForceDirection: event.maxForceDirection(),
|
|
278
|
-
maxForceMagnitude: event.maxForceMagnitude(),
|
|
279
|
-
});
|
|
280
|
-
source2.rigidBody.events?.onContactForce?.({
|
|
281
|
-
...collisionPayload2,
|
|
282
|
-
totalForce: event.totalForce(),
|
|
283
|
-
totalForceMagnitude: event.totalForceMagnitude(),
|
|
284
|
-
maxForceDirection: event.maxForceDirection(),
|
|
285
|
-
maxForceMagnitude: event.maxForceMagnitude(),
|
|
286
|
-
});
|
|
287
|
-
source1.collider.events?.onContactForce?.({
|
|
288
|
-
...collisionPayload1,
|
|
289
|
-
totalForce: event.totalForce(),
|
|
290
|
-
totalForceMagnitude: event.totalForceMagnitude(),
|
|
291
|
-
maxForceDirection: event.maxForceDirection(),
|
|
292
|
-
maxForceMagnitude: event.maxForceMagnitude(),
|
|
293
|
-
});
|
|
294
|
-
source2.collider.events?.onContactForce?.({
|
|
295
|
-
...collisionPayload2,
|
|
296
|
-
totalForce: event.totalForce(),
|
|
297
|
-
totalForceMagnitude: event.totalForceMagnitude(),
|
|
298
|
-
maxForceDirection: event.maxForceDirection(),
|
|
299
|
-
maxForceMagnitude: event.maxForceMagnitude(),
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
world.forEachActiveRigidBody(() => {
|
|
303
|
-
this.store.snapshot.invalidate();
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
getSourceFromColliderHandle(handle) {
|
|
307
|
-
const world = this.worldSingleton();
|
|
308
|
-
if (!world)
|
|
309
|
-
return;
|
|
310
|
-
const collider = world.proxy.getCollider(handle);
|
|
311
|
-
const colEvents = this.colliderEvents.get(handle);
|
|
312
|
-
const colliderState = this.colliderStates.get(handle);
|
|
313
|
-
const rigidBodyHandle = collider.parent()?.handle;
|
|
314
|
-
const rigidBody = rigidBodyHandle !== undefined ? world.proxy.getRigidBody(rigidBodyHandle) : undefined;
|
|
315
|
-
const rigidBodyEvents = rigidBody && rigidBodyHandle !== undefined ? this.rigidBodyEvents.get(rigidBodyHandle) : undefined;
|
|
316
|
-
const rigidBodyState = rigidBodyHandle !== undefined ? this.rigidBodyStates.get(rigidBodyHandle) : undefined;
|
|
317
|
-
return {
|
|
318
|
-
collider: { object: collider, events: colEvents, state: colliderState },
|
|
319
|
-
rigidBody: { object: rigidBody, events: rigidBodyEvents, state: rigidBodyState },
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
getCollisionPayloadFromSource(target, other) {
|
|
323
|
-
return {
|
|
324
|
-
target: {
|
|
325
|
-
rigidBody: target.rigidBody.object,
|
|
326
|
-
collider: target.collider.object,
|
|
327
|
-
colliderObject: target.collider.state?.object,
|
|
328
|
-
rigidBodyObject: target.rigidBody.state?.object,
|
|
329
|
-
},
|
|
330
|
-
other: {
|
|
331
|
-
rigidBody: other.rigidBody.object,
|
|
332
|
-
collider: other.collider.object,
|
|
333
|
-
colliderObject: other.collider.state?.object,
|
|
334
|
-
rigidBodyObject: other.rigidBody.state?.object,
|
|
335
|
-
},
|
|
336
|
-
};
|
|
337
|
-
}
|
|
338
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtrPhysics, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
339
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: NgtrPhysics, isStandalone: true, selector: "ngtr-physics", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "content", first: true, predicate: TemplateRef, descendants: true, isSignal: true }, { propertyName: "fallbackContent", first: true, predicate: NgtrPhysicsFallback, descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0, template: `
|
|
340
|
-
@let _rapierError = rapierError();
|
|
341
|
-
@let _fallbackContent = fallbackContent();
|
|
342
|
-
|
|
343
|
-
@if (rapierConstruct()) {
|
|
344
|
-
@if (debug()) {
|
|
345
|
-
<ngtr-debug [world]="worldSingleton()?.proxy" />
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
<ngtr-frame-stepper
|
|
349
|
-
[ready]="ready()"
|
|
350
|
-
[stepFn]="step.bind(this)"
|
|
351
|
-
[type]="updateLoop()"
|
|
352
|
-
[updatePriority]="updatePriority()"
|
|
353
|
-
/>
|
|
354
|
-
|
|
355
|
-
<ng-container [ngTemplateOutlet]="content()" />
|
|
356
|
-
} @else if (_rapierError && _fallbackContent) {
|
|
357
|
-
<ng-container [ngTemplateOutlet]="_fallbackContent" [ngTemplateOutletContext]="{ error: _rapierError }" />
|
|
358
|
-
}
|
|
359
|
-
`, isInline: true, dependencies: [{ kind: "component", type: NgtrDebug, selector: "ngtr-debug", inputs: ["world"] }, { kind: "directive", type: NgtrFrameStepper, selector: "ngtr-frame-stepper", inputs: ["ready", "updatePriority", "stepFn", "type"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
360
|
-
}
|
|
361
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtrPhysics, decorators: [{
|
|
362
|
-
type: Component,
|
|
363
|
-
args: [{
|
|
364
|
-
selector: 'ngtr-physics',
|
|
365
|
-
standalone: true,
|
|
366
|
-
template: `
|
|
367
|
-
@let _rapierError = rapierError();
|
|
368
|
-
@let _fallbackContent = fallbackContent();
|
|
369
|
-
|
|
370
|
-
@if (rapierConstruct()) {
|
|
371
|
-
@if (debug()) {
|
|
372
|
-
<ngtr-debug [world]="worldSingleton()?.proxy" />
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
<ngtr-frame-stepper
|
|
376
|
-
[ready]="ready()"
|
|
377
|
-
[stepFn]="step.bind(this)"
|
|
378
|
-
[type]="updateLoop()"
|
|
379
|
-
[updatePriority]="updatePriority()"
|
|
380
|
-
/>
|
|
381
|
-
|
|
382
|
-
<ng-container [ngTemplateOutlet]="content()" />
|
|
383
|
-
} @else if (_rapierError && _fallbackContent) {
|
|
384
|
-
<ng-container [ngTemplateOutlet]="_fallbackContent" [ngTemplateOutletContext]="{ error: _rapierError }" />
|
|
385
|
-
}
|
|
386
|
-
`,
|
|
387
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
388
|
-
imports: [NgtrDebug, NgtrFrameStepper, NgTemplateOutlet],
|
|
389
|
-
}]
|
|
390
|
-
}], ctorParameters: () => [] });
|
|
391
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGh5c2ljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvcmFwaWVyL3NyYy9saWIvcGh5c2ljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsWUFBWSxFQUNaLFVBQVUsRUFDVixTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBZSxFQUFrQixVQUFVLEVBQTJCLE1BQU0sMkJBQTJCLENBQUM7QUFDeEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUF1QixNQUFNLE9BQU8sQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFVbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sU0FBUyxDQUFDOztBQUU3RSxNQUFNLGNBQWMsR0FBdUI7SUFDMUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0QixrQkFBa0IsRUFBRSxLQUFLO0lBQ3pCLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsK0JBQStCLEVBQUUsQ0FBQztJQUNsQyx3QkFBd0IsRUFBRSxD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QUFDLE1BQU07Z0JBQ2hDLGNBQWMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNO2dCQUM3QyxlQUFlLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTTthQUMvQztZQUNELEtBQUssRUFBRTtnQkFDTixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNO2dCQUNqQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNO2dCQUMvQixjQUFjLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTTtnQkFDNUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU07YUFDOUM7U0FDRCxDQUFDO0lBQ0gsQ0FBQzt3R0F6VlcsV0FBVzs0RkFBWCxXQUFXLHVQQUdTLFdBQVcsa0dBQ1osbUJBQW1CLDJCQUFVLFdBQVcsNkNBNUI3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFvQlQsNERBRVMsU0FBUywwRUFBRSxnQkFBZ0Isc0hBQUUsZ0JBQWdCOzs0RkFFM0MsV0FBVztrQkEzQnZCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBb0JUO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7aUJBQ3hEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRjb21wdXRlZCxcblx0Y29udGVudENoaWxkLFxuXHREZXN0cm95UmVmLFxuXHREaXJlY3RpdmUsXG5cdGVmZmVjdCxcblx0aW5qZWN0LFxuXHRpbnB1dCxcblx0c2lnbmFsLFxuXHRUZW1wbGF0ZVJlZixcblx0dW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBSQVBJRVIsIHsgQ29sbGlkZXJIYW5kbGUsIEV2ZW50UXVldWUsIFJvdGF0aW9uLCBWZWN0b3IsIFdvcmxkIH0gZnJvbSAnQGRpbWZvcmdlL3JhcGllcjNkLWNvbXBhdCc7XG5pbXBvcnQgeyBpbmplY3RTdG9yZSwgcGljaywgdmVjdG9yMyB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgTWF0aFV0aWxzLCBRdWF0ZXJuaW9uLCBWZWN0b3IzIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTmd0ckRlYnVnIH0gZnJvbSAnLi9kZWJ1Zyc7XG5pbXBvcnQgeyBOZ3RyRnJhbWVTdGVwcGVyIH0gZnJvbSAnLi9mcmFtZS1zdGVwcGVyJztcbmltcG9ydCB7IF9tYXRyaXg0LCBfcG9zaXRpb24sIF9yb3RhdGlvbiwgX3NjYWxlIH0gZnJvbSAnLi9zaGFyZWQnO1xuaW1wb3J0IHtcblx0Tmd0ckNvbGxpZGVyU3RhdGVNYXAsXG5cdE5ndHJDb2xsaXNpb25QYXlsb2FkLFxuXHROZ3RyQ29sbGlzaW9uU291cmNlLFxuXHROZ3RyRXZlbnRNYXAsXG5cdE5ndHJQaHlzaWNzT3B0aW9ucyxcblx0Tmd0clJpZ2lkQm9keVN0YXRlTWFwLFxuXHROZ3RyV29ybGRTdGVwQ2FsbGJhY2tTZXQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlU2luZ2xldG9uUHJveHksIHJhcGllclF1YXRlcm5pb25Ub1F1YXRlcm5pb24gfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE5ndHJQaHlzaWNzT3B0aW9ucyA9IHtcblx0Z3Jhdml0eTogWzAsIC05LjgxLCAwXSxcblx0YWxsb3dlZExpbmVhckVycm9yOiAwLjAwMSxcblx0bnVtU29sdmVySXRlcmF0aW9uczogNCxcblx0bnVtQWRkaXRpb25hbEZyaWN0aW9uSXRlcmF0aW9uczogNCxcblx0bnVtSW50ZXJuYWxQZ3NJdGVyYXRpb25zOiAxLFxuXHRwcmVkaWN0aW9uRGlzdGFuY2U6IDAuMDAyLFxuXHRtaW5Jc2xhbmRTaXplOiAxMjgsXG5cdG1heENjZFN1YnN0ZXBzOiAxLFxuXHRjb250YWN0TmF0dXJhbEZyZXF1ZW5jeTogMzAsXG5cdGVycDogMC44LFxuXHRsZW5ndGhVbml0OiAxLFxuXHRjb2xsaWRlcnM6ICdjdWJvaWQnLFxuXHR1cGRhdGVMb29wOiAnZm9sbG93Jyxcblx0aW50ZXJwb2xhdGU6IHRydWUsXG5cdHBhdXNlZDogZmFsc2UsXG5cdHRpbWVTdGVwOiAxIC8gNjAsXG5cdGRlYnVnOiBmYWxzZSxcbn07XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ25nLXRlbXBsYXRlW3JhcGllckZhbGxiYWNrXScsIHN0YW5kYWxvbmU6IHRydWUgfSlcbmV4cG9ydCBjbGFzcyBOZ3RyUGh5c2ljc0ZhbGxiYWNrIHtcblx0c3RhdGljIG5nVGVtcGxhdGVDb250ZXh0R3VhcmQoXzogTmd0clBoeXNpY3NGYWxsYmFjaywgY3R4OiB1bmtub3duKTogY3R4IGlzIHsgZXJyb3I6IHN0cmluZyB9IHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxufVxuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RyLXBoeXNpY3MnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdEBsZXQgX3JhcGllckVycm9yID0gcmFwaWVyRXJyb3IoKTtcblx0XHRAbGV0IF9mYWxsYmFja0NvbnRlbnQgPSBmYWxsYmFja0NvbnRlbnQoKTtcblxuXHRcdEBpZiAocmFwaWVyQ29uc3RydWN0KCkpIHtcblx0XHRcdEBpZiAoZGVidWcoKSkge1xuXHRcdFx0XHQ8bmd0ci1kZWJ1ZyBbd29ybGRdPVwid29ybGRTaW5nbGV0b24oKT8ucHJveHlcIiAvPlxuXHRcdFx0fVxuXG5cdFx0XHQ8bmd0ci1mcmFtZS1zdGVwcGVyXG5cdFx0XHRcdFtyZWFkeV09XCJyZWFkeSgpXCJcblx0XHRcdFx0W3N0ZXBGbl09XCJzdGVwLmJpbmQodGhpcylcIlxuXHRcdFx0XHRbdHlwZV09XCJ1cGRhdGVMb29wKClcIlxuXHRcdFx0XHRbdXBkYXRlUHJpb3JpdHldPVwidXBkYXRlUHJpb3JpdHkoKVwiXG5cdFx0XHQvPlxuXG5cdFx0XHQ8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnQoKVwiIC8+XG5cdFx0fSBAZWxzZSBpZiAoX3JhcGllckVycm9yICYmIF9mYWxsYmFja0NvbnRlbnQpIHtcblx0XHRcdDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiX2ZhbGxiYWNrQ29udGVudFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGVycm9yOiBfcmFwaWVyRXJyb3IgfVwiIC8+XG5cdFx0fVxuXHRgLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05ndHJEZWJ1ZywgTmd0ckZyYW1lU3RlcHBlciwgTmdUZW1wbGF0ZU91dGxldF0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHJQaHlzaWNzIHtcblx0b3B0aW9ucyA9IGlucHV0KGRlZmF1bHRPcHRpb25zLCB7IHRyYW5zZm9ybTogbWVyZ2VJbnB1dHMoZGVmYXVsdE9wdGlvbnMpIH0pO1xuXG5cdGNvbnRlbnQgPSBjb250ZW50Q2hpbGQucmVxdWlyZWQoVGVtcGxhdGVSZWYpO1xuXHRmYWxsYmFja0NvbnRlbnQgPSBjb250ZW50Q2hpbGQoTmd0clBoeXNpY3NGYWxsYmFjaywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KTtcblxuXHRwcm90ZWN0ZWQgdXBkYXRlUHJpb3JpdHkgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3VwZGF0ZVByaW9yaXR5Jyk7XG5cdHByb3RlY3RlZCB1cGRhdGVMb29wID0gcGljayh0aGlzLm9wdGlvbnMsICd1cGRhdGVMb29wJyk7XG5cblx0cHJpdmF0ZSBudW1Tb2x2ZXJJdGVyYXRpb25zID0gcGljayh0aGlzLm9wdGlvbnMsICdudW1Tb2x2ZXJJdGVyYXRpb25zJyk7XG5cdHByaXZhdGUgbnVtQWRkaXRpb25hbEZyaWN0aW9uSXRlcmF0aW9ucyA9IHBpY2sodGhpcy5vcHRpb25zLCAnbnVtQWRkaXRpb25hbEZyaWN0aW9uSXRlcmF0aW9ucycpO1xuXHRwcml2YXRlIG51bUludGVybmFsUGdzSXRlcmF0aW9ucyA9IHBpY2sodGhpcy5vcHRpb25zLCAnbnVtSW50ZXJuYWxQZ3NJdGVyYXRpb25zJyk7XG5cdHByaXZhdGUgYWxsb3dlZExpbmVhckVycm9yID0gcGljayh0aGlzLm9wdGlvbnMsICdhbGxvd2VkTGluZWFyRXJyb3InKTtcblx0cHJpdmF0ZSBtaW5Jc2xhbmRTaXplID0gcGljayh0aGlzLm9wdGlvbnMsICdtaW5Jc2xhbmRTaXplJyk7XG5cdHByaXZhdGUgbWF4Q2NkU3Vic3RlcHMgPSBwaWNrKHRoaXMub3B0aW9ucywgJ21heENjZFN1YnN0ZXBzJyk7XG5cdHByaXZhdGUgcHJlZGljdGlvbkRpc3RhbmNlID0gcGljayh0aGlzLm9wdGlvbnMsICdwcmVkaWN0aW9uRGlzdGFuY2UnKTtcblx0cHJpdmF0ZSBjb250YWN0TmF0dXJhbEZyZXF1ZW5jeSA9IHBpY2sodGhpcy5vcHRpb25zLCAnY29udGFjdE5hdHVyYWxGcmVxdWVuY3knKTtcblx0cHJpdmF0ZSBsZW5ndGhVbml0ID0gcGljayh0aGlzLm9wdGlvbnMsICdsZW5ndGhVbml0Jyk7XG5cdHByaXZhdGUgdGltZVN0ZXAgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3RpbWVTdGVwJyk7XG5cdHByaXZhdGUgaW50ZXJwb2xhdGUgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2ludGVycG9sYXRlJyk7XG5cblx0cGF1c2VkID0gcGljayh0aGlzLm9wdGlvbnMsICdwYXVzZWQnKTtcblx0ZGVidWcgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2RlYnVnJyk7XG5cdGNvbGxpZGVycyA9IHBpY2sodGhpcy5vcHRpb25zLCAnY29sbGlkZXJzJyk7XG5cblx0cHJpdmF0ZSB2R3Jhdml0eSA9IHZlY3RvcjModGhpcy5vcHRpb25zLCAnZ3Jhdml0eScpO1xuXG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXG5cdHByb3RlY3RlZCByYXBpZXJDb25zdHJ1Y3QgPSBzaWduYWw8dHlwZW9mIFJBUElFUiB8IG51bGw+KG51bGwpO1xuXHRwcm90ZWN0ZWQgcmFwaWVyRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cdHJhcGllciA9IHRoaXMucmFwaWVyQ29uc3RydWN0LmFzUmVhZG9ubHkoKTtcblxuXHRyZWFkeSA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5yYXBpZXIoKSk7XG5cdHdvcmxkU2luZ2xldG9uID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHJhcGllciA9IHRoaXMucmFwaWVyKCk7XG5cdFx0aWYgKCFyYXBpZXIpIHJldHVybiBudWxsO1xuXHRcdHJldHVybiBjcmVhdGVTaW5nbGV0b25Qcm94eTxXb3JsZD4oKCkgPT4gbmV3IHJhcGllci5Xb3JsZCh1bnRyYWNrZWQodGhpcy52R3Jhdml0eSkpKTtcblx0fSk7XG5cblx0cmlnaWRCb2R5U3RhdGVzOiBOZ3RyUmlnaWRCb2R5U3RhdGVNYXAgPSBuZXcgTWFwKCk7XG5cdGNvbGxpZGVyU3RhdGVzOiBOZ3RyQ29sbGlkZXJTdGF0ZU1hcCA9IG5ldyBNYXAoKTtcblx0cmlnaWRCb2R5RXZlbnRzOiBOZ3RyRXZlbnRNYXAgPSBuZXcgTWFwKCk7XG5cdGNvbGxpZGVyRXZlbnRzOiBOZ3RyRXZlbnRNYXAgPSBuZXcgTWFwKCk7XG5cdHByaXZhdGUgYmVmb3JlU3RlcENhbGxiYWNrczogTmd0cldvcmxkU3RlcENhbGxiYWNrU2V0ID0gbmV3IFNldCgpO1xuXHRwcml2YXRlIGFmdGVyU3RlcENhbGxiYWNrczogTmd0cldvcmxkU3RlcENhbGxiYWNrU2V0ID0gbmV3IFNldCgpO1xuXG5cdHByaXZhdGUgZXZlbnRRdWV1ZSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCByYXBpZXIgPSB0aGlzLnJhcGllcigpO1xuXHRcdGlmICghcmFwaWVyKSByZXR1cm4gbnVsbDtcblx0XHRyZXR1cm4gbmV3IEV2ZW50UXVldWUoZmFsc2UpO1xuXHR9KTtcblxuXHRwcml2YXRlIHN0ZXBwaW5nU3RhdGU6IHtcblx0XHRhY2N1bXVsYXRvcjogbnVtYmVyO1xuXHRcdHByZXZpb3VzU3RhdGU6IFJlY29yZDxudW1iZXIsIHsgcG9zaXRpb246IFZlY3Rvcjsgcm90YXRpb246IFJvdGF0aW9uIH0+O1xuXHR9ID0geyBhY2N1bXVsYXRvcjogMCwgcHJldmlvdXNTdGF0ZToge30gfTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRpbXBvcnQoJ0BkaW1mb3JnZS9yYXBpZXIzZC1jb21wYXQnKVxuXHRcdFx0LnRoZW4oKHJhcGllcikgPT4gcmFwaWVyLmluaXQoKS50aGVuKCgpID0+IHJhcGllcikpXG5cdFx0XHQudGhlbih0aGlzLnJhcGllckNvbnN0cnVjdC5zZXQuYmluZCh0aGlzLnJhcGllckNvbnN0cnVjdCkpXG5cdFx0XHQuY2F0Y2goKGVycikgPT4ge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBbTkdUXSBGYWlsZWQgdG8gbG9hZCByYXBpZXIzZC1jb21wYXRgLCBlcnIpO1xuXHRcdFx0XHR0aGlzLnJhcGllckVycm9yLnNldChlcnI/Lm1lc3NhZ2UgPz8gZXJyLnRvU3RyaW5nKCkpO1xuXHRcdFx0fSk7XG5cblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0dGhpcy51cGRhdGVXb3JsZEVmZmVjdCgpO1xuXHRcdH0pO1xuXG5cdFx0aW5qZWN0KERlc3Ryb3lSZWYpLm9uRGVzdHJveSgoKSA9PiB7XG5cdFx0XHRjb25zdCB3b3JsZCA9IHRoaXMud29ybGRTaW5nbGV0b24oKTtcblx0XHRcdGlmICh3b3JsZCkge1xuXHRcdFx0XHR3b3JsZC5wcm94eS5mcmVlKCk7XG5cdFx0XHRcdHdvcmxkLnJlc2V0KCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRzdGVwKGRlbHRhOiBudW1iZXIpIHtcblx0XHRpZiAoIXRoaXMucGF1c2VkKCkpIHtcblx0XHRcdHRoaXMuaW50ZXJuYWxTdGVwKGRlbHRhKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZVdvcmxkRWZmZWN0KCkge1xuXHRcdGNvbnN0IHdvcmxkID0gdGhpcy53b3JsZFNpbmdsZXRvbigpO1xuXHRcdGlmICghd29ybGQpIHJldHVybjtcblxuXHRcdHdvcmxkLnByb3h5LmdyYXZpdHkgPSB0aGlzLnZHcmF2aXR5KCk7XG5cdFx0d29ybGQucHJveHkuaW50ZWdyYXRpb25QYXJhbWV0ZXJzLm51bVNvbHZlckl0ZXJhdGlvbnMgPSB0aGlzLm51bVNvbHZlckl0ZXJhdGlvbnMoKTtcblx0XHR3b3JsZC5wcm94eS5pbnRlZ3JhdGlvblBhcmFtZXRlcnMubnVtQWRkaXRpb25hbEZyaWN0aW9uSXRlcmF0aW9ucyA9IHRoaXMubnVtQWRkaXRpb25hbEZyaWN0aW9uSXRlcmF0aW9ucygpO1xuXHRcdHdvcmxkLnByb3h5LmludGVncmF0aW9uUGFyYW1ldGVycy5udW1JbnRlcm5hbFBnc0l0ZXJhdGlvbnMgPSB0aGlzLm51bUludGVybmFsUGdzSXRlcmF0aW9ucygpO1xuXHRcdHdvcmxkLnByb3h5LmludGVncmF0aW9uUGFyYW1ldGVycy5ub3JtYWxpemVkQWxsb3dlZExpbmVhckVycm9yID0gdGhpcy5hbGxvd2VkTGluZWFyRXJyb3IoKTtcblx0XHR3b3JsZC5wcm94eS5pbnRlZ3JhdGlvblBhcmFtZXRlcnMubWluSXNsYW5kU2l6ZSA9IHRoaXMubWluSXNsYW5kU2l6ZSgpO1xuXHRcdHdvcmxkLnByb3h5LmludGVncmF0aW9uUGFyYW1ldGVycy5tYXhDY2RTdWJzdGVwcyA9IHRoaXMubWF4Q2NkU3Vic3RlcHMoKTtcblx0XHR3b3JsZC5wcm94eS5pbnRlZ3JhdGlvblBhcmFtZXRlcnMubm9ybWFsaXplZFByZWRpY3Rpb25EaXN0YW5jZSA9IHRoaXMucHJlZGljdGlvbkRpc3RhbmNlKCk7XG5cdFx0d29ybGQucHJveHkuaW50ZWdyYXRpb25QYXJhbWV0ZXJzLmNvbnRhY3RfbmF0dXJhbF9mcmVxdWVuY3kgPSB0aGlzLmNvbnRhY3ROYXR1cmFsRnJlcXVlbmN5KCk7XG5cdFx0d29ybGQucHJveHkubGVuZ3RoVW5pdCA9IHRoaXMubGVuZ3RoVW5pdCgpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnRlcm5hbFN0ZXAoZGVsdGE6IG51bWJlcikge1xuXHRcdGNvbnN0IHdvcmxkU2luZ2xldG9uID0gdGhpcy53b3JsZFNpbmdsZXRvbigpO1xuXHRcdGlmICghd29ybGRTaW5nbGV0b24pIHJldHVybjtcblxuXHRcdGNvbnN0IGV2ZW50UXVldWUgPSB0aGlzLmV2ZW50UXVldWUoKTtcblx0XHRpZiAoIWV2ZW50UXVldWUpIHJldHVybjtcblxuXHRcdGNvbnN0IHdvcmxkID0gd29ybGRTaW5nbGV0b24ucHJveHk7XG5cdFx0Y29uc3QgW3RpbWVTdGVwLCBpbnRlcnBvbGF0ZSwgcGF1c2VkXSA9IFt0aGlzLnRpbWVTdGVwKCksIHRoaXMuaW50ZXJwb2xhdGUoKSwgdGhpcy5wYXVzZWQoKV07XG5cblx0XHQvKiBDaGVjayBpZiB0aGUgdGltZXN0ZXAgaXMgc3VwcG9zZWQgdG8gYmUgdmFyaWFibGUuIFdlJ2xsIGRvIHRoaXMgaGVyZVxuICAgICAgb25jZSBzbyB3ZSBkb24ndCBoYXZlIHRvIHN0cmluZy1jaGVjayBldmVyeSBmcmFtZS4gKi9cblx0XHRjb25zdCB0aW1lU3RlcFZhcmlhYmxlID0gdGltZVN0ZXAgPT09ICd2YXJ5JztcblxuXHRcdC8qKlxuXHRcdCAqIEZpeGVkIHRpbWVTdGVwIHNpbXVsYXRpb24gcHJvZ3Jlc3Npb24uXG5cdFx0ICogQHNlZSBodHRwczovL2dhZmZlcm9uZ2FtZXMuY29tL3Bvc3QvZml4X3lvdXJfdGltZXN0ZXAvXG5cdFx0ICovXG5cdFx0Y29uc3QgY2xhbXBlZERlbHRhID0gTWF0aFV0aWxzLmNsYW1wKGRlbHRhLCAwLCAwLjUpO1xuXG5cdFx0Y29uc3Qgc3RlcFdvcmxkID0gKGlubmVyRGVsdGE6IG51bWJlcikgPT4ge1xuXHRcdFx0Ly8gVHJpZ2dlciBiZWZvcmVTdGVwIGNhbGxiYWNrc1xuXHRcdFx0dGhpcy5iZWZvcmVTdGVwQ2FsbGJhY2tzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG5cdFx0XHRcdGNhbGxiYWNrKHdvcmxkKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR3b3JsZC50aW1lc3RlcCA9IGlubmVyRGVsdGE7XG5cdFx0XHR3b3JsZC5zdGVwKGV2ZW50UXVldWUpO1xuXG5cdFx0XHQvLyBUcmlnZ2VyIGFmdGVyU3RlcCBjYWxsYmFja3Ncblx0XHRcdHRoaXMuYWZ0ZXJTdGVwQ2FsbGJhY2tzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG5cdFx0XHRcdGNhbGxiYWNrKHdvcmxkKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRpZiAodGltZVN0ZXBWYXJpYWJsZSkge1xuXHRcdFx0c3RlcFdvcmxkKGNsYW1wZWREZWx0YSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGRvbid0IHN0ZXAgdGltZSBmb3J3YXJkcyBpZiBwYXVzZWRcblx0XHRcdC8vIEluY3JlYXNlIGFjY3VtdWxhdG9yXG5cdFx0XHR0aGlzLnN0ZXBwaW5nU3RhdGUuYWNjdW11bGF0b3IgKz0gY2xhbXBlZERlbHRhO1xuXG5cdFx0XHR3aGlsZSAodGhpcy5zdGVwcGluZ1N0YXRlLmFjY3VtdWxhdG9yID49IHRpbWVTdGVwKSB7XG5cdFx0XHRcdC8vIFNldCB1cCBwcmV2aW91cyBzdGF0ZVxuXHRcdFx0XHQvLyBuZWVkZWQgZm9yIGFjY3VyYXRlIGludGVycG9sYXRpb25zIGlmIHRoZSB3b3JsZCBzdGVwcyBtb3JlIHRoYW4gb25jZVxuXHRcdFx0XHRpZiAoaW50ZXJwb2xhdGUpIHtcblx0XHRcdFx0XHR0aGlzLnN0ZXBwaW5nU3RhdGUucHJldmlvdXNTdGF0ZSA9IHt9O1xuXHRcdFx0XHRcdHdvcmxkLmZvckVhY2hSaWdpZEJvZHkoKGJvZHkpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuc3RlcHBpbmdTdGF0ZS5wcmV2aW91c1N0YXRlW2JvZHkuaGFuZGxlXSA9IHtcblx0XHRcdFx0XHRcdFx0cG9zaXRpb246IGJvZHkudHJhbnNsYXRpb24oKSxcblx0XHRcdFx0XHRcdFx0cm90YXRpb246IGJvZHkucm90YXRpb24oKSxcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzdGVwV29ybGQodGltZVN0ZXApO1xuXHRcdFx0XHR0aGlzLnN0ZXBwaW5nU3RhdGUuYWNjdW11bGF0b3IgLT0gdGltZVN0ZXA7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW50ZXJwb2xhdGlvbkFscGhhID1cblx0XHRcdHRpbWVTdGVwVmFyaWFibGUgfHwgIWludGVycG9sYXRlIHx8IHBhdXNlZCA/IDEgOiB0aGlzLnN0ZXBwaW5nU3RhdGUuYWNjdW11bGF0b3IgLyB0aW1lU3RlcDtcblxuXHRcdC8vIFVwZGF0ZSBtZXNoZXNcblx0XHR0aGlzLnJpZ2lkQm9keVN0YXRlcy5mb3JFYWNoKChzdGF0ZSwgaGFuZGxlKSA9PiB7XG5cdFx0XHRjb25zdCByaWdpZEJvZHkgPSB3b3JsZC5nZXRSaWdpZEJvZHkoaGFuZGxlKTtcblxuXHRcdFx0Y29uc3QgZXZlbnRzID0gdGhpcy5yaWdpZEJvZHlFdmVudHMuZ2V0KGhhbmRsZSk7XG5cdFx0XHRpZiAoZXZlbnRzPy5vblNsZWVwIHx8IGV2ZW50cz8ub25XYWtlKSB7XG5cdFx0XHRcdGlmIChyaWdpZEJvZHkuaXNTbGVlcGluZygpICYmICFzdGF0ZS5pc1NsZWVwaW5nKSBldmVudHM/Lm9uU2xlZXA/LigpO1xuXHRcdFx0XHRpZiAoIXJpZ2lkQm9keS5pc1NsZWVwaW5nKCkgJiYgc3RhdGUuaXNTbGVlcGluZykgZXZlbnRzPy5vbldha2U/LigpO1xuXHRcdFx0XHRzdGF0ZS5pc1NsZWVwaW5nID0gcmlnaWRCb2R5LmlzU2xlZXBpbmcoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFyaWdpZEJvZHkgfHwgKHJpZ2lkQm9keS5pc1NsZWVwaW5nKCkgJiYgISgnaXNJbnN0YW5jZWRNZXNoJyBpbiBzdGF0ZS5vYmplY3QpKSB8fCAhc3RhdGUuc2V0TWF0cml4KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmV3IHN0YXRlc1xuXHRcdFx0bGV0IHQgPSByaWdpZEJvZHkudHJhbnNsYXRpb24oKSBhcyBWZWN0b3IzO1xuXHRcdFx0bGV0IHIgPSByaWdpZEJvZHkucm90YXRpb24oKSBhcyBRdWF0ZXJuaW9uO1xuXG5cdFx0XHRsZXQgcHJldmlvdXNTdGF0ZSA9IHRoaXMuc3RlcHBpbmdTdGF0ZS5wcmV2aW91c1N0YXRlW2hhbmRsZV07XG5cblx0XHRcdGlmIChwcmV2aW91c1N0YXRlKSB7XG5cdFx0XHRcdC8vIEdldCBwcmV2aW91cyBzaW11bGF0ZWQgd29ybGQgcG9zaXRpb25cblx0XHRcdFx0X21hdHJpeDRcblx0XHRcdFx0XHQuY29tcG9zZShwcmV2aW91c1N0YXRlLnBvc2l0aW9uIGFzIFZlY3RvcjMsIHJhcGllclF1YXRlcm5pb25Ub1F1YXRlcm5pb24ocHJldmlvdXNTdGF0ZS5yb3RhdGlvbiksIHN0YXRlLnNjYWxlKVxuXHRcdFx0XHRcdC5wcmVtdWx0aXBseShzdGF0ZS5pbnZlcnRlZFdvcmxkTWF0cml4KVxuXHRcdFx0XHRcdC5kZWNvbXBvc2UoX3Bvc2l0aW9uLCBfcm90YXRpb24sIF9zY2FsZSk7XG5cblx0XHRcdFx0Ly8gQXBwbHkgcHJldmlvdXMgdGljayBwb3NpdGlvblxuXHRcdFx0XHRpZiAoc3RhdGUubWVzaFR5cGUgPT0gJ21lc2gnKSB7XG5cdFx0XHRcdFx0c3RhdGUub2JqZWN0LnBvc2l0aW9uLmNvcHkoX3Bvc2l0aW9uKTtcblx0XHRcdFx0XHRzdGF0ZS5vYmplY3QucXVhdGVybmlvbi5jb3B5KF9yb3RhdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gR2V0IG5ldyBwb3NpdGlvblxuXHRcdFx0X21hdHJpeDRcblx0XHRcdFx0LmNvbXBvc2UodCwgcmFwaWVyUXVhdGVybmlvblRvUXVhdGVybmlvbihyKSwgc3RhdGUuc2NhbGUpXG5cdFx0XHRcdC5wcmVtdWx0aXBseShzdGF0ZS5pbnZlcnRlZFdvcmxkTWF0cml4KVxuXHRcdFx0XHQuZGVjb21wb3NlKF9wb3NpdGlvbiwgX3JvdGF0aW9uLCBfc2NhbGUpO1xuXG5cdFx0XHRpZiAoc3RhdGUubWVzaFR5cGUgPT0gJ2luc3RhbmNlZE1lc2gnKSB7XG5cdFx0XHRcdHN0YXRlLnNldE1hdHJpeChfbWF0cml4NCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJbnRlcnBvbGF0ZSB0byBuZXcgcG9zaXRpb25cblx0XHRcdFx0c3RhdGUub2JqZWN0LnBvc2l0aW9uLmxlcnAoX3Bvc2l0aW9uLCBpbnRlcnBvbGF0aW9uQWxwaGEpO1xuXHRcdFx0XHRzdGF0ZS5vYmplY3QucXVhdGVybmlvbi5zbGVycChfcm90YXRpb24sIGludGVycG9sYXRpb25BbHBoYSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRldmVudFF1ZXVlLmRyYWluQ29sbGlzaW9uRXZlbnRzKChoYW5kbGUxLCBoYW5kbGUyLCBzdGFydGVkKSA9PiB7XG5cdFx0XHRjb25zdCBzb3VyY2UxID0gdGhpcy5nZXRTb3VyY2VGcm9tQ29sbGlkZXJIYW5kbGUoaGFuZGxlMSk7XG5cdFx0XHRjb25zdCBzb3VyY2UyID0gdGhpcy5nZXRTb3VyY2VGcm9tQ29sbGlkZXJIYW5kbGUoaGFuZGxlMik7XG5cblx0XHRcdC8vIENvbGxpc2lvbiBFdmVudHNcblx0XHRcdGlmICghc291cmNlMT8uY29sbGlkZXIub2JqZWN0IHx8ICFzb3VyY2UyPy5jb2xsaWRlci5vYmplY3QpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjb2xsaXNpb25QYXlsb2FkMSA9IHRoaXMuZ2V0Q29sbGlzaW9uUGF5bG9hZEZyb21Tb3VyY2Uoc291cmNlMSwgc291cmNlMik7XG5cdFx0XHRjb25zdCBjb2xsaXNpb25QYXlsb2FkMiA9IHRoaXMuZ2V0Q29sbGlzaW9uUGF5bG9hZEZyb21Tb3VyY2Uoc291cmNlMiwgc291cmNlMSk7XG5cblx0XHRcdGlmIChzdGFydGVkKSB7XG5cdFx0XHRcdHdvcmxkLmNvbnRhY3RQYWlyKHNvdXJjZTEuY29sbGlkZXIub2JqZWN0LCBzb3VyY2UyLmNvbGxpZGVyLm9iamVjdCwgKG1hbmlmb2xkLCBmbGlwcGVkKSA9PiB7XG5cdFx0XHRcdFx0LyogUmlnaWRCb2R5IGV2ZW50cyAqL1xuXHRcdFx0XHRcdHNvdXJjZTEucmlnaWRCb2R5LmV2ZW50cz8ub25Db2xsaXNpb25FbnRlcj8uKHsgLi4uY29sbGlzaW9uUGF5bG9hZDEsIG1hbmlmb2xkLCBmbGlwcGVkIH0pO1xuXHRcdFx0XHRcdHNvdXJjZTIucmlnaWRCb2R5LmV2ZW50cz8ub25Db2xsaXNpb25FbnRlcj8uKHsgLi4uY29sbGlzaW9uUGF5bG9hZDIsIG1hbmlmb2xkLCBmbGlwcGVkIH0pO1xuXG5cdFx0XHRcdFx0LyogQ29sbGlkZXIgZXZlbnRzICovXG5cdFx0XHRcdFx0c291cmNlMS5jb2xsaWRlci5ldmVudHM/Lm9uQ29sbGlzaW9uRW50ZXI/Lih7IC4uLmNvbGxpc2lvblBheWxvYWQxLCBtYW5pZm9sZCwgZmxpcHBlZCB9KTtcblx0XHRcdFx0XHRzb3VyY2UyLmNvbGxpZGVyLmV2ZW50cz8ub25Db2xsaXNpb25FbnRlcj8uKHsgLi4uY29sbGlzaW9uUGF5bG9hZDIsIG1hbmlmb2xkLCBmbGlwcGVkIH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNvdXJjZTEucmlnaWRCb2R5LmV2ZW50cz8ub25Db2xsaXNpb25FeGl0Py4oY29sbGlzaW9uUGF5bG9hZDEpO1xuXHRcdFx0XHRzb3VyY2UyLnJpZ2lkQm9keS5ldmVudHM/Lm9uQ29sbGlzaW9uRXhpdD8uKGNvbGxpc2lvblBheWxvYWQyKTtcblx0XHRcdFx0c291cmNlMS5jb2xsaWRlci5ldmVudHM/Lm9uQ29sbGlzaW9uRXhpdD8uKGNvbGxpc2lvblBheWxvYWQxKTtcblx0XHRcdFx0c291cmNlMi5jb2xsaWRlci5ldmVudHM/Lm9uQ29sbGlzaW9uRXhpdD8uKGNvbGxpc2lvblBheWxvYWQyKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2Vuc29yIEludGVyc2VjdGlvbnNcblx0XHRcdGlmIChzdGFydGVkKSB7XG5cdFx0XHRcdGlmICh3b3JsZC5pbnRlcnNlY3Rpb25QYWlyKHNvdXJjZTEuY29sbGlkZXIub2JqZWN0LCBzb3VyY2UyLmNvbGxpZGVyLm9iamVjdCkpIHtcblx0XHRcdFx0XHRzb3VyY2UxLnJpZ2lkQm9keS5ldmVudHM/Lm9uSW50ZXJzZWN0aW9uRW50ZXI/Lihjb2xsaXNpb25QYXlsb2FkMSk7XG5cdFx0XHRcdFx0c291cmNlMi5yaWdpZEJvZHkuZXZlbnRzPy5vbkludGVyc2VjdGlvbkVudGVyPy4oY29sbGlzaW9uUGF5bG9hZDIpO1xuXHRcdFx0XHRcdHNvdXJjZTEuY29sbGlkZXIuZXZlbnRzPy5vbkludGVyc2VjdGlvbkVudGVyPy4oY29sbGlzaW9uUGF5bG9hZDEpO1xuXHRcdFx0XHRcdHNvdXJjZTIuY29sbGlkZXIuZXZlbnRzPy5vbkludGVyc2VjdGlvbkVudGVyPy4oY29sbGlzaW9uUGF5bG9hZDIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzb3VyY2UxLnJpZ2lkQm9keS5ldmVudHM/Lm9uSW50ZXJzZWN0aW9uRXhpdD8uKGNvbGxpc2lvblBheWxvYWQxKTtcblx0XHRcdFx0c291cmNlMi5yaWdpZEJvZHkuZXZlbnRzPy5vbkludGVyc2VjdGlvbkV4aXQ/Lihjb2xsaXNpb25QYXlsb2FkMik7XG5cdFx0XHRcdHNvdXJjZTEuY29sbGlkZXIuZXZlbnRzPy5vbkludGVyc2VjdGlvbkV4aXQ/Lihjb2xsaXNpb25QYXlsb2FkMSk7XG5cdFx0XHRcdHNvdXJjZTIuY29sbGlkZXIuZXZlbnRzPy5vbkludGVyc2VjdGlvbkV4aXQ/Lihjb2xsaXNpb25QYXlsb2FkMik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRldmVudFF1ZXVlLmRyYWluQ29udGFjdEZvcmNlRXZlbnRzKChldmVudCkgPT4ge1xuXHRcdFx0Y29uc3Qgc291cmNlMSA9IHRoaXMuZ2V0U291cmNlRnJvbUNvbGxpZGVySGFuZGxlKGV2ZW50LmNvbGxpZGVyMSgpKTtcblx0XHRcdGNvbnN0IHNvdXJjZTIgPSB0aGlzLmdldFNvdXJjZUZyb21Db2xsaWRlckhhbmRsZShldmVudC5jb2xsaWRlcjIoKSk7XG5cblx0XHRcdC8vIENvbGxpc2lvbiBFdmVudHNcblx0XHRcdGlmICghc291cmNlMT8uY29sbGlkZXIub2JqZWN0IHx8ICFzb3VyY2UyPy5jb2xsaWRlci5vYmplY3QpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjb2xsaXNpb25QYXlsb2FkMSA9IHRoaXMuZ2V0Q29sbGlzaW9uUGF5bG9hZEZyb21Tb3VyY2Uoc291cmNlMSwgc291cmNlMik7XG5cdFx0XHRjb25zdCBjb2xsaXNpb25QYXlsb2FkMiA9IHRoaXMuZ2V0Q29sbGlzaW9uUGF5bG9hZEZyb21Tb3VyY2Uoc291cmNlMiwgc291cmNlMSk7XG5cblx0XHRcdHNvdXJjZTEucmlnaWRCb2R5LmV2ZW50cz8ub25Db250YWN0Rm9yY2U/Lih7XG5cdFx0XHRcdC4uLmNvbGxpc2lvblBheWxvYWQxLFxuXHRcdFx0XHR0b3RhbEZvcmNlOiBldmVudC50b3RhbEZvcmNlKCksXG5cdFx0XHRcdHRvdGFsRm9yY2VNYWduaXR1ZGU6IGV2ZW50LnRvdGFsRm9yY2VNYWduaXR1ZGUoKSxcblx0XHRcdFx0bWF4Rm9yY2VEaXJlY3Rpb246IGV2ZW50Lm1heEZvcmNlRGlyZWN0aW9uKCksXG5cdFx0XHRcdG1heEZvcmNlTWFnbml0dWRlOiBldmVudC5tYXhGb3JjZU1hZ25pdHVkZSgpLFxuXHRcdFx0fSk7XG5cblx0XHRcdHNvdXJjZTIucmlnaWRCb2R5LmV2ZW50cz8ub25Db250YWN0Rm9yY2U/Lih7XG5cdFx0XHRcdC4uLmNvbGxpc2lvblBheWxvYWQyLFxuXHRcdFx0XHR0b3RhbEZvcmNlOiBldmVudC50b3RhbEZvcmNlKCksXG5cdFx0XHRcdHRvdGFsRm9yY2VNYWduaXR1ZGU6IGV2ZW50LnRvdGFsRm9yY2VNYWduaXR1ZGUoKSxcblx0XHRcdFx0bWF4Rm9yY2VEaXJlY3Rpb246IGV2ZW50Lm1heEZvcmNlRGlyZWN0aW9uKCksXG5cdFx0XHRcdG1heEZvcmNlTWFnbml0dWRlOiBldmVudC5tYXhGb3JjZU1hZ25pdHVkZSgpLFxuXHRcdFx0fSk7XG5cblx0XHRcdHNvdXJjZTEuY29sbGlkZXIuZXZlbnRzPy5vbkNvbnRhY3RGb3JjZT8uKHtcblx0XHRcdFx0Li4uY29sbGlzaW9uUGF5bG9hZDEsXG5cdFx0XHRcdHRvdGFsRm9yY2U6IGV2ZW50LnRvdGFsRm9yY2UoKSxcblx0XHRcdFx0dG90YWxGb3JjZU1hZ25pdHVkZTogZXZlbnQudG90YWxGb3JjZU1hZ25pdHVkZSgpLFxuXHRcdFx0XHRtYXhGb3JjZURpcmVjdGlvbjogZXZlbnQubWF4Rm9yY2VEaXJlY3Rpb24oKSxcblx0XHRcdFx0bWF4Rm9yY2VNYWduaXR1ZGU6IGV2ZW50Lm1heEZvcmNlTWFnbml0dWRlKCksXG5cdFx0XHR9KTtcblxuXHRcdFx0c291cmNlMi5jb2xsaWRlci5ldmVudHM/Lm9uQ29udGFjdEZvcmNlPy4oe1xuXHRcdFx0XHQuLi5jb2xsaXNpb25QYXlsb2FkMixcblx0XHRcdFx0dG90YWxGb3JjZTogZXZlbnQudG90YWxGb3JjZSgpLFxuXHRcdFx0XHR0b3RhbEZvcmNlTWFnbml0dWRlOiBldmVudC50b3RhbEZvcmNlTWFnbml0dWRlKCksXG5cdFx0XHRcdG1heEZvcmNlRGlyZWN0aW9uOiBldmVudC5tYXhGb3JjZURpcmVjdGlvbigpLFxuXHRcdFx0XHRtYXhGb3JjZU1hZ25pdHVkZTogZXZlbnQubWF4Rm9yY2VNYWduaXR1ZGUoKSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0d29ybGQuZm9yRWFjaEFjdGl2ZVJpZ2lkQm9keSgoKSA9PiB7XG5cdFx0XHR0aGlzLnN0b3JlLnNuYXBzaG90LmludmFsaWRhdGUoKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0U291cmNlRnJvbUNvbGxpZGVySGFuZGxlKGhhbmRsZTogQ29sbGlkZXJIYW5kbGUpIHtcblx0XHRjb25zdCB3b3JsZCA9IHRoaXMud29ybGRTaW5nbGV0b24oKTtcblx0XHRpZiAoIXdvcmxkKSByZXR1cm47XG5cblx0XHRjb25zdCBjb2xsaWRlciA9IHdvcmxkLnByb3h5LmdldENvbGxpZGVyKGhhbmRsZSk7XG5cdFx0Y29uc3QgY29sRXZlbnRzID0gdGhpcy5jb2xsaWRlckV2ZW50cy5nZXQoaGFuZGxlKTtcblx0XHRjb25zdCBjb2xsaWRlclN0YXRlID0gdGhpcy5jb2xsaWRlclN0YXRlcy5nZXQoaGFuZGxlKTtcblxuXHRcdGNvbnN0IHJpZ2lkQm9keUhhbmRsZSA9IGNvbGxpZGVyLnBhcmVudCgpPy5oYW5kbGU7XG5cdFx0Y29uc3QgcmlnaWRCb2R5ID0gcmlnaWRCb2R5SGFuZGxlICE9PSB1bmRlZmluZWQgPyB3b3JsZC5wcm94eS5nZXRSaWdpZEJvZHkocmlnaWRCb2R5SGFuZGxlKSA6IHVuZGVmaW5lZDtcblx0XHRjb25zdCByaWdpZEJvZHlFdmVudHMgPVxuXHRcdFx0cmlnaWRCb2R5ICYmIHJpZ2lkQm9keUhhbmRsZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5yaWdpZEJvZHlFdmVudHMuZ2V0KHJpZ2lkQm9keUhhbmRsZSkgOiB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgcmlnaWRCb2R5U3RhdGUgPSByaWdpZEJvZHlIYW5kbGUgIT09IHVuZGVmaW5lZCA/IHRoaXMucmlnaWRCb2R5U3RhdGVzLmdldChyaWdpZEJvZHlIYW5kbGUpIDogdW5kZWZpbmVkO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbGxpZGVyOiB7IG9iamVjdDogY29sbGlkZXIsIGV2ZW50czogY29sRXZlbnRzLCBzdGF0ZTogY29sbGlkZXJTdGF0ZSB9LFxuXHRcdFx0cmlnaWRCb2R5OiB7IG9iamVjdDogcmlnaWRCb2R5LCBldmVudHM6IHJpZ2lkQm9keUV2ZW50cywgc3RhdGU6IHJpZ2lkQm9keVN0YXRlIH0sXG5cdFx0fSBhcyBOZ3RyQ29sbGlzaW9uU291cmNlO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRDb2xsaXNpb25QYXlsb2FkRnJvbVNvdXJjZSh0YXJnZXQ6IE5ndHJDb2xsaXNpb25Tb3VyY2UsIG90aGVyOiBOZ3RyQ29sbGlzaW9uU291cmNlKTogTmd0ckNvbGxpc2lvblBheWxvYWQge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXQ6IHtcblx0XHRcdFx0cmlnaWRCb2R5OiB0YXJnZXQucmlnaWRCb2R5Lm9iamVjdCxcblx0XHRcdFx0Y29sbGlkZXI6IHRhcmdldC5jb2xsaWRlci5vYmplY3QsXG5cdFx0XHRcdGNvbGxpZGVyT2JqZWN0OiB0YXJnZXQuY29sbGlkZXIuc3RhdGU/Lm9iamVjdCxcblx0XHRcdFx0cmlnaWRCb2R5T2JqZWN0OiB0YXJnZXQucmlnaWRCb2R5LnN0YXRlPy5vYmplY3QsXG5cdFx0XHR9LFxuXHRcdFx0b3RoZXI6IHtcblx0XHRcdFx0cmlnaWRCb2R5OiBvdGhlci5yaWdpZEJvZHkub2JqZWN0LFxuXHRcdFx0XHRjb2xsaWRlcjogb3RoZXIuY29sbGlkZXIub2JqZWN0LFxuXHRcdFx0XHRjb2xsaWRlck9iamVjdDogb3RoZXIuY29sbGlkZXIuc3RhdGU/Lm9iamVjdCxcblx0XHRcdFx0cmlnaWRCb2R5T2JqZWN0OiBvdGhlci5yaWdpZEJvZHkuc3RhdGU/Lm9iamVjdCxcblx0XHRcdH0sXG5cdFx0fTtcblx0fVxufVxuIl19
|