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.
@@ -1,561 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, Directive, effect, ElementRef, inject, input, model, output, untracked, } from '@angular/core';
2
- import { ActiveEvents, ColliderDesc, RigidBodyDesc } from '@dimforge/rapier3d-compat';
3
- import { applyProps, extend, getEmitter, getLocalState, hasListener, pick, } from 'angular-three';
4
- import { mergeInputs } from 'ngxtension/inject-inputs';
5
- import { Object3D, Vector3 } from 'three';
6
- import { NgtrPhysics } from './physics';
7
- import { _matrix4, _position, _rotation, _scale, _vector3 } from './shared';
8
- import { createColliderOptions } from './utils';
9
- import * as i0 from "@angular/core";
10
- const colliderDefaultOptions = {
11
- contactSkin: 0,
12
- };
13
- export class NgtrAnyCollider {
14
- position = input([0, 0, 0]);
15
- rotation = input([0, 0, 0]);
16
- scale = input([1, 1, 1]);
17
- quaternion = input([0, 0, 0, 1]);
18
- userData = input({});
19
- name = input();
20
- options = input(colliderDefaultOptions, { transform: mergeInputs(rigidBodyDefaultOptions) });
21
- object3DParameters = computed(() => {
22
- return {
23
- position: this.position(),
24
- rotation: this.rotation(),
25
- scale: this.scale(),
26
- quaternion: this.quaternion(),
27
- userData: this.userData(),
28
- name: this.name(),
29
- };
30
- });
31
- // TODO: change this to input required when Angular allows setting hostDirective input
32
- shape = model(undefined, { alias: 'ngtrCollider' });
33
- args = model([]);
34
- collisionEnter = output();
35
- collisionExit = output();
36
- intersectionEnter = output();
37
- intersectionExit = output();
38
- contactForce = output();
39
- sensor = pick(this.options, 'sensor');
40
- collisionGroups = pick(this.options, 'collisionGroups');
41
- solverGroups = pick(this.options, 'solverGroups');
42
- friction = pick(this.options, 'friction');
43
- frictionCombineRule = pick(this.options, 'frictionCombineRule');
44
- restitution = pick(this.options, 'restitution');
45
- restitutionCombineRule = pick(this.options, 'restitutionCombineRule');
46
- activeCollisionTypes = pick(this.options, 'activeCollisionTypes');
47
- contactSkin = pick(this.options, 'contactSkin');
48
- mass = pick(this.options, 'mass');
49
- massProperties = pick(this.options, 'massProperties');
50
- density = pick(this.options, 'density');
51
- rigidBody = inject(NgtrRigidBody, { optional: true });
52
- physics = inject(NgtrPhysics);
53
- objectRef = inject(ElementRef);
54
- scaledArgs = computed(() => {
55
- const [shape, args] = [
56
- this.shape(),
57
- this.args(),
58
- ];
59
- const cloned = args.slice();
60
- // Heightfield uses a vector
61
- if (shape === 'heightfield') {
62
- const s = cloned[3];
63
- s.x *= this.worldScale.x;
64
- s.y *= this.worldScale.y;
65
- s.z *= this.worldScale.z;
66
- return cloned;
67
- }
68
- // Trimesh and convex scale the vertices
69
- if (shape === 'trimesh' || shape === 'convexHull') {
70
- cloned[0] = this.scaleVertices(cloned[0], this.worldScale);
71
- return cloned;
72
- }
73
- // prefill with some extra
74
- const scaleArray = [this.worldScale.x, this.worldScale.y, this.worldScale.z, this.worldScale.x, this.worldScale.x];
75
- return cloned.map((arg, index) => scaleArray[index] * arg);
76
- });
77
- collider = computed(() => {
78
- const worldSingleton = this.physics.worldSingleton();
79
- if (!worldSingleton)
80
- return null;
81
- const [shape, args, rigidBody] = [this.shape(), this.scaledArgs(), this.rigidBody?.rigidBody()];
82
- // @ts-expect-error - we know the type of the data
83
- const desc = ColliderDesc[shape](...args);
84
- if (!desc)
85
- return null;
86
- return worldSingleton.proxy.createCollider(desc, rigidBody ?? undefined);
87
- });
88
- constructor() {
89
- extend({ Object3D });
90
- effect(() => {
91
- const object3DParameters = this.object3DParameters();
92
- applyProps(this.objectRef.nativeElement, object3DParameters);
93
- });
94
- effect((onCleanup) => {
95
- const cleanup = this.createColliderStateEffect();
96
- onCleanup(() => cleanup?.());
97
- });
98
- effect((onCleanup) => {
99
- const cleanup = this.createColliderEventsEffect();
100
- onCleanup(() => cleanup?.());
101
- });
102
- effect(() => {
103
- this.updateColliderEffect();
104
- this.updateMassPropertiesEffect();
105
- });
106
- }
107
- get worldScale() {
108
- return this.objectRef.nativeElement.getWorldScale(new Vector3());
109
- }
110
- setShape(shape) {
111
- this.shape.set(shape);
112
- }
113
- setArgs(args) {
114
- this.args.set(args);
115
- }
116
- createColliderStateEffect() {
117
- const collider = this.collider();
118
- if (!collider)
119
- return;
120
- const worldSingleton = this.physics.worldSingleton();
121
- if (!worldSingleton)
122
- return;
123
- const localState = getLocalState(this.objectRef.nativeElement);
124
- if (!localState)
125
- return;
126
- const parent = localState.parent();
127
- if (!parent || !parent.isObject3D)
128
- return;
129
- const state = this.createColliderState(collider, this.objectRef.nativeElement, this.rigidBody?.objectRef.nativeElement);
130
- this.physics.colliderStates.set(collider.handle, state);
131
- return () => {
132
- this.physics.colliderStates.delete(collider.handle);
133
- if (worldSingleton.proxy.getCollider(collider.handle)) {
134
- worldSingleton.proxy.removeCollider(collider, true);
135
- }
136
- };
137
- }
138
- createColliderEventsEffect() {
139
- const collider = this.collider();
140
- if (!collider)
141
- return;
142
- const worldSingleton = this.physics.worldSingleton();
143
- if (!worldSingleton)
144
- return;
145
- const collisionEnter = getEmitter(this.collisionEnter);
146
- const collisionExit = getEmitter(this.collisionExit);
147
- const intersectionEnter = getEmitter(this.intersectionEnter);
148
- const intersectionExit = getEmitter(this.intersectionExit);
149
- const contactForce = getEmitter(this.contactForce);
150
- const hasCollisionEvent = hasListener(this.collisionEnter, this.collisionExit, this.intersectionEnter, this.intersectionExit, this.rigidBody?.collisionEnter, this.rigidBody?.collisionExit, this.rigidBody?.intersectionEnter, this.rigidBody?.intersectionExit);
151
- const hasContactForceEvent = hasListener(this.contactForce, this.rigidBody?.contactForce);
152
- if (hasCollisionEvent && hasContactForceEvent) {
153
- collider.setActiveEvents(ActiveEvents.COLLISION_EVENTS | ActiveEvents.CONTACT_FORCE_EVENTS);
154
- }
155
- else if (hasCollisionEvent) {
156
- collider.setActiveEvents(ActiveEvents.COLLISION_EVENTS);
157
- }
158
- else if (hasContactForceEvent) {
159
- collider.setActiveEvents(ActiveEvents.CONTACT_FORCE_EVENTS);
160
- }
161
- this.physics.colliderEvents.set(collider.handle, {
162
- onCollisionEnter: collisionEnter,
163
- onCollisionExit: collisionExit,
164
- onIntersectionEnter: intersectionEnter,
165
- onIntersectionExit: intersectionExit,
166
- onContactForce: contactForce,
167
- });
168
- return () => {
169
- this.physics.colliderEvents.delete(collider.handle);
170
- };
171
- }
172
- updateColliderEffect() {
173
- const collider = this.collider();
174
- if (!collider)
175
- return;
176
- const worldSingleton = this.physics.worldSingleton();
177
- if (!worldSingleton)
178
- return;
179
- const state = this.physics.colliderStates.get(collider.handle);
180
- if (!state)
181
- return;
182
- // Update collider position based on the object's position
183
- const parentWorldScale = state.object.parent.getWorldScale(_vector3);
184
- const parentInvertedWorldMatrix = state.worldParent?.matrixWorld.clone().invert();
185
- state.object.updateWorldMatrix(true, false);
186
- _matrix4.copy(state.object.matrixWorld);
187
- if (parentInvertedWorldMatrix) {
188
- _matrix4.premultiply(parentInvertedWorldMatrix);
189
- }
190
- _matrix4.decompose(_position, _rotation, _scale);
191
- if (collider.parent()) {
192
- collider.setTranslationWrtParent({
193
- x: _position.x * parentWorldScale.x,
194
- y: _position.y * parentWorldScale.y,
195
- z: _position.z * parentWorldScale.z,
196
- });
197
- collider.setRotationWrtParent(_rotation);
198
- }
199
- else {
200
- collider.setTranslation({
201
- x: _position.x * parentWorldScale.x,
202
- y: _position.y * parentWorldScale.y,
203
- z: _position.z * parentWorldScale.z,
204
- });
205
- collider.setRotation(_rotation);
206
- }
207
- const [sensor, collisionGroups, solverGroups, friction, frictionCombineRule, restitution, restitutionCombineRule, activeCollisionTypes, contactSkin,] = [
208
- this.sensor(),
209
- this.collisionGroups(),
210
- this.solverGroups(),
211
- this.friction(),
212
- this.frictionCombineRule(),
213
- this.restitution(),
214
- this.restitutionCombineRule(),
215
- this.activeCollisionTypes(),
216
- this.contactSkin(),
217
- ];
218
- if (sensor !== undefined)
219
- collider.setSensor(sensor);
220
- if (collisionGroups !== undefined)
221
- collider.setCollisionGroups(collisionGroups);
222
- if (solverGroups !== undefined)
223
- collider.setSolverGroups(solverGroups);
224
- if (friction !== undefined)
225
- collider.setFriction(friction);
226
- if (frictionCombineRule !== undefined)
227
- collider.setFrictionCombineRule(frictionCombineRule);
228
- if (restitution !== undefined)
229
- collider.setRestitution(restitution);
230
- if (restitutionCombineRule !== undefined)
231
- collider.setRestitutionCombineRule(restitutionCombineRule);
232
- if (activeCollisionTypes !== undefined)
233
- collider.setActiveCollisionTypes(activeCollisionTypes);
234
- if (contactSkin !== undefined)
235
- collider.setContactSkin(contactSkin);
236
- }
237
- updateMassPropertiesEffect() {
238
- const collider = this.collider();
239
- if (!collider)
240
- return;
241
- const [mass, massProperties, density] = [this.mass(), this.massProperties(), this.density()];
242
- if (density !== undefined) {
243
- if (mass !== undefined || massProperties !== undefined) {
244
- throw new Error('[NGT Rapier] Cannot set mass and massProperties along with density');
245
- }
246
- collider.setDensity(density);
247
- return;
248
- }
249
- if (mass !== undefined) {
250
- if (massProperties !== undefined) {
251
- throw new Error('[NGT Rapier] Cannot set massProperties along with mass');
252
- }
253
- collider.setMass(mass);
254
- return;
255
- }
256
- if (massProperties !== undefined) {
257
- collider.setMassProperties(massProperties.mass, massProperties.centerOfMass, massProperties.principalAngularInertia, massProperties.angularInertiaLocalFrame);
258
- return;
259
- }
260
- }
261
- createColliderState(collider, object, rigidBodyObject) {
262
- return { collider, worldParent: rigidBodyObject || undefined, object };
263
- }
264
- scaleVertices(vertices, scale) {
265
- const scaledVerts = Array.from(vertices);
266
- for (let i = 0; i < vertices.length / 3; i++) {
267
- scaledVerts[i * 3] *= scale.x;
268
- scaledVerts[i * 3 + 1] *= scale.y;
269
- scaledVerts[i * 3 + 2] *= scale.z;
270
- }
271
- return scaledVerts;
272
- }
273
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtrAnyCollider, deps: [], target: i0.ɵɵFactoryTarget.Directive });
274
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.11", type: NgtrAnyCollider, isStandalone: true, selector: "ngt-object3D[ngtrCollider]", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, rotation: { classPropertyName: "rotation", publicName: "rotation", isSignal: true, isRequired: false, transformFunction: null }, scale: { classPropertyName: "scale", publicName: "scale", isSignal: true, isRequired: false, transformFunction: null }, quaternion: { classPropertyName: "quaternion", publicName: "quaternion", isSignal: true, isRequired: false, transformFunction: null }, userData: { classPropertyName: "userData", publicName: "userData", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "ngtrCollider", isSignal: true, isRequired: false, transformFunction: null }, args: { classPropertyName: "args", publicName: "args", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { shape: "ngtrColliderChange", args: "argsChange", collisionEnter: "collisionEnter", collisionExit: "collisionExit", intersectionEnter: "intersectionEnter", intersectionExit: "intersectionExit", contactForce: "contactForce" }, ngImport: i0 });
275
- }
276
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtrAnyCollider, decorators: [{
277
- type: Directive,
278
- args: [{ selector: 'ngt-object3D[ngtrCollider]', standalone: true }]
279
- }], ctorParameters: () => [] });
280
- const RIGID_BODY_TYPE_MAP = {
281
- fixed: 1,
282
- dynamic: 0,
283
- kinematicPosition: 2,
284
- kinematicVelocity: 3,
285
- };
286
- export const rigidBodyDefaultOptions = {
287
- canSleep: true,
288
- linearVelocity: [0, 0, 0],
289
- angularVelocity: [0, 0, 0],
290
- gravityScale: 1,
291
- dominanceGroup: 0,
292
- ccd: false,
293
- softCcdPrediction: 0,
294
- contactSkin: 0,
295
- };
296
- export class NgtrRigidBody {
297
- type = input('dynamic', {
298
- alias: 'ngtrRigidBody',
299
- transform: (value) => {
300
- if (value === '' || value === undefined)
301
- return 'dynamic';
302
- return value;
303
- },
304
- });
305
- position = input([0, 0, 0]);
306
- rotation = input([0, 0, 0]);
307
- scale = input([1, 1, 1]);
308
- quaternion = input([0, 0, 0, 1]);
309
- userData = input({});
310
- options = input(rigidBodyDefaultOptions, { transform: mergeInputs(rigidBodyDefaultOptions) });
311
- object3DParameters = computed(() => {
312
- return {
313
- position: this.position(),
314
- rotation: this.rotation(),
315
- scale: this.scale(),
316
- quaternion: this.quaternion(),
317
- userData: this.userData(),
318
- };
319
- });
320
- wake = output();
321
- sleep = output();
322
- collisionEnter = output();
323
- collisionExit = output();
324
- intersectionEnter = output();
325
- intersectionExit = output();
326
- contactForce = output();
327
- canSleep = pick(this.options, 'canSleep');
328
- colliders = pick(this.options, 'colliders');
329
- transformState = pick(this.options, 'transformState');
330
- gravityScale = pick(this.options, 'gravityScale');
331
- dominanceGroup = pick(this.options, 'dominanceGroup');
332
- ccd = pick(this.options, 'ccd');
333
- softCcdPrediction = pick(this.options, 'softCcdPrediction');
334
- additionalSolverIterations = pick(this.options, 'additionalSolverIterations');
335
- linearDamping = pick(this.options, 'linearDamping');
336
- angularDamping = pick(this.options, 'angularDamping');
337
- lockRotations = pick(this.options, 'lockRotations');
338
- lockTranslations = pick(this.options, 'lockTranslations');
339
- enabledRotations = pick(this.options, 'enabledRotations');
340
- enabledTranslations = pick(this.options, 'enabledTranslations');
341
- angularVelocity = pick(this.options, 'angularVelocity');
342
- linearVelocity = pick(this.options, 'linearVelocity');
343
- objectRef = inject(ElementRef);
344
- physics = inject(NgtrPhysics);
345
- bodyType = computed(() => RIGID_BODY_TYPE_MAP[this.type()]);
346
- bodyDesc = computed(() => {
347
- const [canSleep, bodyType] = [this.canSleep(), untracked(this.bodyType), this.colliders()];
348
- return new RigidBodyDesc(bodyType).setCanSleep(canSleep);
349
- });
350
- rigidBody = computed(() => {
351
- const worldSingleton = this.physics.worldSingleton();
352
- if (!worldSingleton)
353
- return null;
354
- return worldSingleton.proxy.createRigidBody(this.bodyDesc());
355
- });
356
- childColliderOptions = computed(() => {
357
- const colliders = this.colliders();
358
- // if self colliders is false explicitly, disable auto colliders for this object entirely.
359
- if (colliders === false)
360
- return [];
361
- const physicsColliders = this.physics.colliders();
362
- // if physics colliders is false explicitly AND colliders is not set, disable auto colliders for this object entirely.
363
- if (physicsColliders === false && colliders === undefined)
364
- return [];
365
- const options = untracked(this.options);
366
- // if colliders on object is not set, use physics colliders
367
- if (!options.colliders)
368
- options.colliders = physicsColliders;
369
- const objectLocalState = getLocalState(this.objectRef.nativeElement);
370
- if (!objectLocalState)
371
- return [];
372
- // track object's parent and non-object children
373
- const [parent] = [objectLocalState.parent(), objectLocalState.nonObjects()];
374
- if (!parent || !parent.isObject3D)
375
- return [];
376
- return createColliderOptions(this.objectRef.nativeElement, options, true);
377
- });
378
- constructor() {
379
- extend({ Object3D });
380
- effect(() => {
381
- const object3DParameters = this.object3DParameters();
382
- applyProps(this.objectRef.nativeElement, object3DParameters);
383
- });
384
- effect((onCleanup) => {
385
- const cleanup = this.createRigidBodyStateEffect();
386
- onCleanup(() => cleanup?.());
387
- });
388
- effect((onCleanup) => {
389
- const cleanup = this.createRigidBodyEventsEffect();
390
- onCleanup(() => cleanup?.());
391
- });
392
- effect(() => {
393
- this.updateRigidBodyEffect();
394
- });
395
- }
396
- createRigidBodyStateEffect() {
397
- const worldSingleton = this.physics.worldSingleton();
398
- if (!worldSingleton)
399
- return;
400
- const body = this.rigidBody();
401
- if (!body)
402
- return;
403
- const transformState = untracked(this.transformState);
404
- const localState = getLocalState(this.objectRef.nativeElement);
405
- if (!localState)
406
- return;
407
- const parent = localState.parent();
408
- if (!parent || !parent.isObject3D)
409
- return;
410
- const state = this.createRigidBodyState(body, this.objectRef.nativeElement);
411
- this.physics.rigidBodyStates.set(body.handle, transformState ? transformState(state) : state);
412
- return () => {
413
- this.physics.rigidBodyStates.delete(body.handle);
414
- if (worldSingleton.proxy.getRigidBody(body.handle)) {
415
- worldSingleton.proxy.removeRigidBody(body);
416
- }
417
- };
418
- }
419
- createRigidBodyEventsEffect() {
420
- const worldSingleton = this.physics.worldSingleton();
421
- if (!worldSingleton)
422
- return;
423
- const body = this.rigidBody();
424
- if (!body)
425
- return;
426
- const wake = getEmitter(this.wake);
427
- const sleep = getEmitter(this.sleep);
428
- const collisionEnter = getEmitter(this.collisionEnter);
429
- const collisionExit = getEmitter(this.collisionExit);
430
- const intersectionEnter = getEmitter(this.intersectionEnter);
431
- const intersectionExit = getEmitter(this.intersectionExit);
432
- const contactForce = getEmitter(this.contactForce);
433
- this.physics.rigidBodyEvents.set(body.handle, {
434
- onWake: wake,
435
- onSleep: sleep,
436
- onCollisionEnter: collisionEnter,
437
- onCollisionExit: collisionExit,
438
- onIntersectionEnter: intersectionEnter,
439
- onIntersectionExit: intersectionExit,
440
- onContactForce: contactForce,
441
- });
442
- return () => {
443
- this.physics.rigidBodyEvents.delete(body.handle);
444
- };
445
- }
446
- updateRigidBodyEffect() {
447
- const worldSingleton = this.physics.worldSingleton();
448
- if (!worldSingleton)
449
- return;
450
- const body = this.rigidBody();
451
- if (!body)
452
- return;
453
- const state = this.physics.rigidBodyStates.get(body.handle);
454
- if (!state)
455
- return;
456
- state.object.updateWorldMatrix(true, false);
457
- _matrix4.copy(state.object.matrixWorld).decompose(_position, _rotation, _scale);
458
- body.setTranslation(_position, true);
459
- body.setRotation(_rotation, true);
460
- const [gravityScale, additionalSolverIterations, linearDamping, angularDamping, lockRotations, lockTranslations, enabledRotations, enabledTranslations, angularVelocity, linearVelocity, ccd, softCcdPrediction, dominanceGroup, userData, bodyType,] = [
461
- this.gravityScale(),
462
- this.additionalSolverIterations(),
463
- this.linearDamping(),
464
- this.angularDamping(),
465
- this.lockRotations(),
466
- this.lockTranslations(),
467
- this.enabledRotations(),
468
- this.enabledTranslations(),
469
- this.angularVelocity(),
470
- this.linearVelocity(),
471
- this.ccd(),
472
- this.softCcdPrediction(),
473
- this.dominanceGroup(),
474
- this.userData(),
475
- this.bodyType(),
476
- ];
477
- body.setGravityScale(gravityScale, true);
478
- if (additionalSolverIterations !== undefined)
479
- body.setAdditionalSolverIterations(additionalSolverIterations);
480
- if (linearDamping !== undefined)
481
- body.setLinearDamping(linearDamping);
482
- if (angularDamping !== undefined)
483
- body.setAngularDamping(angularDamping);
484
- body.setDominanceGroup(dominanceGroup);
485
- if (enabledRotations !== undefined)
486
- body.setEnabledRotations(...enabledRotations, true);
487
- if (enabledTranslations !== undefined)
488
- body.setEnabledTranslations(...enabledTranslations, true);
489
- if (lockRotations !== undefined)
490
- body.lockRotations(lockRotations, true);
491
- if (lockTranslations !== undefined)
492
- body.lockTranslations(lockTranslations, true);
493
- body.setAngvel({ x: angularVelocity[0], y: angularVelocity[1], z: angularVelocity[2] }, true);
494
- body.setLinvel({ x: linearVelocity[0], y: linearVelocity[1], z: linearVelocity[2] }, true);
495
- body.enableCcd(ccd);
496
- body.setSoftCcdPrediction(softCcdPrediction);
497
- if (userData !== undefined)
498
- body.userData = userData;
499
- if (bodyType !== body.bodyType())
500
- body.setBodyType(bodyType, true);
501
- }
502
- createRigidBodyState(rigidBody, object, setMatrix, getMatrix, worldScale, meshType = 'mesh') {
503
- object.updateWorldMatrix(true, false);
504
- const invertedWorldMatrix = object.parent.matrixWorld.clone().invert();
505
- return {
506
- object,
507
- rigidBody,
508
- invertedWorldMatrix,
509
- setMatrix: setMatrix
510
- ? setMatrix
511
- : (matrix) => {
512
- object.matrix.copy(matrix);
513
- },
514
- getMatrix: getMatrix ? getMatrix : (matrix) => matrix.copy(object.matrix),
515
- scale: worldScale || object.getWorldScale(_scale).clone(),
516
- isSleeping: false,
517
- meshType,
518
- };
519
- }
520
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtrRigidBody, deps: [], target: i0.ɵɵFactoryTarget.Component });
521
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: NgtrRigidBody, isStandalone: true, selector: "ngt-object3D[ngtrRigidBody]", inputs: { type: { classPropertyName: "type", publicName: "ngtrRigidBody", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, rotation: { classPropertyName: "rotation", publicName: "rotation", isSignal: true, isRequired: false, transformFunction: null }, scale: { classPropertyName: "scale", publicName: "scale", isSignal: true, isRequired: false, transformFunction: null }, quaternion: { classPropertyName: "quaternion", publicName: "quaternion", isSignal: true, isRequired: false, transformFunction: null }, userData: { classPropertyName: "userData", publicName: "userData", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { wake: "wake", sleep: "sleep", collisionEnter: "collisionEnter", collisionExit: "collisionExit", intersectionEnter: "intersectionEnter", intersectionExit: "intersectionExit", contactForce: "contactForce" }, exportAs: ["rigidBody"], ngImport: i0, template: `
522
- <ng-content />
523
- @for (childColliderOption of childColliderOptions(); track $index) {
524
- <ngt-object3D
525
- [ngtrCollider]="childColliderOption.shape"
526
- [args]="childColliderOption.args"
527
- [position]="childColliderOption.position"
528
- [rotation]="childColliderOption.rotation"
529
- [scale]="childColliderOption.scale"
530
- [name]="objectRef.nativeElement.name + '-collider-' + $index"
531
- [options]="childColliderOption.colliderOptions"
532
- />
533
- }
534
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtrAnyCollider, selector: "ngt-object3D[ngtrCollider]", inputs: ["position", "rotation", "scale", "quaternion", "userData", "name", "options", "ngtrCollider", "args"], outputs: ["ngtrColliderChange", "argsChange", "collisionEnter", "collisionExit", "intersectionEnter", "intersectionExit", "contactForce"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
535
- }
536
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtrRigidBody, decorators: [{
537
- type: Component,
538
- args: [{
539
- selector: 'ngt-object3D[ngtrRigidBody]',
540
- exportAs: 'rigidBody',
541
- standalone: true,
542
- template: `
543
- <ng-content />
544
- @for (childColliderOption of childColliderOptions(); track $index) {
545
- <ngt-object3D
546
- [ngtrCollider]="childColliderOption.shape"
547
- [args]="childColliderOption.args"
548
- [position]="childColliderOption.position"
549
- [rotation]="childColliderOption.rotation"
550
- [scale]="childColliderOption.scale"
551
- [name]="objectRef.nativeElement.name + '-collider-' + $index"
552
- [options]="childColliderOption.colliderOptions"
553
- />
554
- }
555
- `,
556
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
557
- changeDetection: ChangeDetectionStrategy.OnPush,
558
- imports: [NgtrAnyCollider],
559
- }]
560
- }], ctorParameters: () => [] });
561
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlnaWQtYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvcmFwaWVyL3NyYy9saWIvcmlnaWQtYm9keS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLFNBQVMsRUFDVCxNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBWSxZQUFZLEVBQWEsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0csT0FBTyxFQUNOLFVBQVUsRUFDVixNQUFNLEVBQ04sVUFBVSxFQUNWLGFBQWEsRUFDYixXQUFXLEVBS1gsSUFBSSxHQUNKLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQVcsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBYzVFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFFaEQsTUFBTSxzQkFBc0IsR0FBd0I7SUFDbkQsV0FBVyxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBR0YsTUFBTSxPQUFPLGVBQWU7SUFDM0IsUUFBUSxHQUFHLEtBQUssQ0FBeUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsUUFBUSxHQUFHLEtBQUssQ0FBdUIsQ0FBQyxDQUFDLEVBQUUsQ0FB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bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLDZCQUE2QjtvQkFDdkMsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7RUFhVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQztpQkFDMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRjb21wdXRlZCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0RGlyZWN0aXZlLFxuXHRlZmZlY3QsXG5cdEVsZW1lbnRSZWYsXG5cdGluamVjdCxcblx0aW5wdXQsXG5cdG1vZGVsLFxuXHRvdXRwdXQsXG5cdHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmVFdmVudHMsIENvbGxpZGVyLCBDb2xsaWRlckRlc2MsIFJpZ2lkQm9keSwgUmlnaWRCb2R5RGVzYyB9IGZyb20gJ0BkaW1mb3JnZS9yYXBpZXIzZC1jb21wYXQnO1xuaW1wb3J0IHtcblx0YXBwbHlQcm9wcyxcblx0ZXh0ZW5kLFxuXHRnZXRFbWl0dGVyLFxuXHRnZXRMb2NhbFN0YXRlLFxuXHRoYXNMaXN0ZW5lcixcblx0Tmd0RXVsZXIsXG5cdE5ndE9iamVjdDNELFxuXHROZ3RRdWF0ZXJuaW9uLFxuXHROZ3RWZWN0b3IzLFxuXHRwaWNrLFxufSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IE1hdHJpeDQsIE9iamVjdDNELCBWZWN0b3IzIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTmd0clBoeXNpY3MgfSBmcm9tICcuL3BoeXNpY3MnO1xuaW1wb3J0IHsgX21hdHJpeDQsIF9wb3NpdGlvbiwgX3JvdGF0aW9uLCBfc2NhbGUsIF92ZWN0b3IzIH0gZnJvbSAnLi9zaGFyZWQnO1xuaW1wb3J0IHtcblx0Tmd0ckNvbGxpZGVyT3B0aW9ucyxcblx0Tmd0ckNvbGxpZGVyU2hhcGUsXG5cdE5ndHJDb2xsaWRlclN0YXRlLFxuXHROZ3RyQ29sbGlzaW9uRW50ZXJQYXlsb2FkLFxuXHROZ3RyQ29sbGlzaW9uRXhpdFBheWxvYWQsXG5cdE5ndHJDb250YWN0Rm9yY2VQYXlsb2FkLFxuXHROZ3RySW50ZXJzZWN0aW9uRW50ZXJQYXlsb2FkLFxuXHROZ3RySW50ZXJzZWN0aW9uRXhpdFBheWxvYWQsXG5cdE5ndHJSaWdpZEJvZHlPcHRpb25zLFxuXHROZ3RyUmlnaWRCb2R5U3RhdGUsXG5cdE5ndHJSaWdpZEJvZHlUeXBlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUNvbGxpZGVyT3B0aW9ucyB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBjb2xsaWRlckRlZmF1bHRPcHRpb25zOiBOZ3RyQ29sbGlkZXJPcHRpb25zID0ge1xuXHRjb250YWN0U2tpbjogMCxcbn07XG5cbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ25ndC1vYmplY3QzRFtuZ3RyQ29sbGlkZXJdJywgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIE5ndHJBbnlDb2xsaWRlciB7XG5cdHBvc2l0aW9uID0gaW5wdXQ8Tmd0VmVjdG9yMyB8IHVuZGVmaW5lZD4oWzAsIDAsIDBdKTtcblx0cm90YXRpb24gPSBpbnB1dDxOZ3RFdWxlciB8IHVuZGVmaW5lZD4oWzAsIDAsIDBdKTtcblx0c2NhbGUgPSBpbnB1dDxOZ3RWZWN0b3IzIHwgdW5kZWZpbmVkPihbMSwgMSwgMV0pO1xuXHRxdWF0ZXJuaW9uID0gaW5wdXQ8Tmd0UXVhdGVybmlvbiB8IHVuZGVmaW5lZD4oWzAsIDAsIDAsIDFdKTtcblx0dXNlckRhdGEgPSBpbnB1dDxOZ3RPYmplY3QzRFsndXNlckRhdGEnXSB8IHVuZGVmaW5lZD4oe30pO1xuXHRuYW1lID0gaW5wdXQ8Tmd0T2JqZWN0M0RbJ25hbWUnXSB8IHVuZGVmaW5lZD4oKTtcblx0b3B0aW9ucyA9IGlucHV0KGNvbGxpZGVyRGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhyaWdpZEJvZHlEZWZhdWx0T3B0aW9ucykgfSk7XG5cblx0cHJpdmF0ZSBvYmplY3QzRFBhcmFtZXRlcnMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uKCksXG5cdFx0XHRyb3RhdGlvbjogdGhpcy5yb3RhdGlvbigpLFxuXHRcdFx0c2NhbGU6IHRoaXMuc2NhbGUoKSxcblx0XHRcdHF1YXRlcm5pb246IHRoaXMucXVhdGVybmlvbigpLFxuXHRcdFx0dXNlckRhdGE6IHRoaXMudXNlckRhdGEoKSxcblx0XHRcdG5hbWU6IHRoaXMubmFtZSgpLFxuXHRcdH07XG5cdH0pO1xuXG5cdC8vIFRPRE86IGNoYW5nZSB0aGlzIHRvIGlucHV0IHJlcXVpcmVkIHdoZW4gQW5ndWxhciBhbGxvd3Mgc2V0dGluZyBob3N0RGlyZWN0aXZlIGlucHV0XG5cdHNoYXBlID0gbW9kZWw8Tmd0ckNvbGxpZGVyU2hhcGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwgeyBhbGlhczogJ25ndHJDb2xsaWRlcicgfSk7XG5cdGFyZ3MgPSBtb2RlbDx1bmtub3duW10+KFtdKTtcblxuXHRjb2xsaXNpb25FbnRlciA9IG91dHB1dDxOZ3RyQ29sbGlzaW9uRW50ZXJQYXlsb2FkPigpO1xuXHRjb2xsaXNpb25FeGl0ID0gb3V0cHV0PE5ndHJDb2xsaXNpb25FeGl0UGF5bG9hZD4oKTtcblx0aW50ZXJzZWN0aW9uRW50ZXIgPSBvdXRwdXQ8Tmd0ckludGVyc2VjdGlvbkVudGVyUGF5bG9hZD4oKTtcblx0aW50ZXJzZWN0aW9uRXhpdCA9IG91dHB1dDxOZ3RySW50ZXJzZWN0aW9uRXhpdFBheWxvYWQ+KCk7XG5cdGNvbnRhY3RGb3JjZSA9IG91dHB1dDxOZ3RyQ29udGFjdEZvcmNlUGF5bG9hZD4oKTtcblxuXHRwcml2YXRlIHNlbnNvciA9IHBpY2sodGhpcy5vcHRpb25zLCAnc2Vuc29yJyk7XG5cdHByaXZhdGUgY29sbGlzaW9uR3JvdXBzID0gcGljayh0aGlzLm9wdGlvbnMsICdjb2xsaXNpb25Hcm91cHMnKTtcblx0cHJpdmF0ZSBzb2x2ZXJHcm91cHMgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3NvbHZlckdyb3VwcycpO1xuXHRwcml2YXRlIGZyaWN0aW9uID0gcGljayh0aGlzLm9wdGlvbnMsICdmcmljdGlvbicpO1xuXHRwcml2YXRlIGZyaWN0aW9uQ29tYmluZVJ1bGUgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2ZyaWN0aW9uQ29tYmluZVJ1bGUnKTtcblx0cHJpdmF0ZSByZXN0aXR1dGlvbiA9IHBpY2sodGhpcy5vcHRpb25zLCAncmVzdGl0dXRpb24nKTtcblx0cHJpdmF0ZSByZXN0aXR1dGlvbkNvbWJpbmVSdWxlID0gcGljayh0aGlzLm9wdGlvbnMsICdyZXN0aXR1dGlvbkNvbWJpbmVSdWxlJyk7XG5cdHByaXZhdGUgYWN0aXZlQ29sbGlzaW9uVHlwZXMgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2FjdGl2ZUNvbGxpc2lvblR5cGVzJyk7XG5cdHByaXZhdGUgY29udGFjdFNraW4gPSBwaWNrKHRoaXMub3B0aW9ucywgJ2NvbnRhY3RTa2luJyk7XG5cdHByaXZhdGUgbWFzcyA9IHBpY2sodGhpcy5vcHRpb25zLCAnbWFzcycpO1xuXHRwcml2YXRlIG1hc3NQcm9wZXJ0aWVzID0gcGljayh0aGlzLm9wdGlvbnMsICdtYXNzUHJvcGVydGllcycpO1xuXHRwcml2YXRlIGRlbnNpdHkgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2RlbnNpdHknKTtcblxuXHRwcml2YXRlIHJpZ2lkQm9keSA9IGluamVjdChOZ3RyUmlnaWRCb2R5LCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXHRwcml2YXRlIHBoeXNpY3MgPSBpbmplY3QoTmd0clBoeXNpY3MpO1xuXHRwcml2YXRlIG9iamVjdFJlZiA9IGluamVjdDxFbGVtZW50UmVmPE9iamVjdDNEPj4oRWxlbWVudFJlZik7XG5cblx0cHJpdmF0ZSBzY2FsZWRBcmdzID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IFtzaGFwZSwgYXJnc10gPSBbXG5cdFx0XHR0aGlzLnNoYXBlKCksXG5cdFx0XHR0aGlzLmFyZ3MoKSBhcyAobnVtYmVyIHwgQXJyYXlMaWtlPG51bWJlcj4gfCB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSlbXSxcblx0XHRdO1xuXG5cdFx0Y29uc3QgY2xvbmVkID0gYXJncy5zbGljZSgpO1xuXG5cdFx0Ly8gSGVpZ2h0ZmllbGQgdXNlcyBhIHZlY3RvclxuXHRcdGlmIChzaGFwZSA9PT0gJ2hlaWdodGZpZWxkJykge1xuXHRcdFx0Y29uc3QgcyA9IGNsb25lZFszXSBhcyB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcblx0XHRcdHMueCAqPSB0aGlzLndvcmxkU2NhbGUueDtcblx0XHRcdHMueSAqPSB0aGlzLndvcmxkU2NhbGUueTtcblx0XHRcdHMueiAqPSB0aGlzLndvcmxkU2NhbGUuejtcblxuXHRcdFx0cmV0dXJuIGNsb25lZDtcblx0XHR9XG5cblx0XHQvLyBUcmltZXNoIGFuZCBjb252ZXggc2NhbGUgdGhlIHZlcnRpY2VzXG5cdFx0aWYgKHNoYXBlID09PSAndHJpbWVzaCcgfHwgc2hhcGUgPT09ICdjb252ZXhIdWxsJykge1xuXHRcdFx0Y2xvbmVkWzBdID0gdGhpcy5zY2FsZVZlcnRpY2VzKGNsb25lZFswXSBhcyBBcnJheUxpa2U8bnVtYmVyPiwgdGhpcy53b3JsZFNjYWxlKTtcblx0XHRcdHJldHVybiBjbG9uZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gcHJlZmlsbCB3aXRoIHNvbWUgZXh0cmFcblx0XHRjb25zdCBzY2FsZUFycmF5ID0gW3RoaXMud29ybGRTY2FsZS54LCB0aGlzLndvcmxkU2NhbGUueSwgdGhpcy53b3JsZFNjYWxlLnosIHRoaXMud29ybGRTY2FsZS54LCB0aGlzLndvcmxkU2NhbGUueF07XG5cdFx0cmV0dXJuIGNsb25lZC5tYXAoKGFyZywgaW5kZXgpID0+IHNjYWxlQXJyYXlbaW5kZXhdICogKGFyZyBhcyBudW1iZXIpKTtcblx0fSk7XG5cblx0cHJpdmF0ZSBjb2xsaWRlciA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB3b3JsZFNpbmdsZXRvbiA9IHRoaXMucGh5c2ljcy53b3JsZFNpbmdsZXRvbigpO1xuXHRcdGlmICghd29ybGRTaW5nbGV0b24pIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3QgW3NoYXBlLCBhcmdzLCByaWdpZEJvZHldID0gW3RoaXMuc2hhcGUoKSwgdGhpcy5zY2FsZWRBcmdzKCksIHRoaXMucmlnaWRCb2R5Py5yaWdpZEJvZHkoKV07XG5cblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gd2Uga25vdyB0aGUgdHlwZSBvZiB0aGUgZGF0YVxuXHRcdGNvbnN0IGRlc2MgPSBDb2xsaWRlckRlc2Nbc2hhcGVdKC4uLmFyZ3MpO1xuXHRcdGlmICghZGVzYykgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gd29ybGRTaW5nbGV0b24ucHJveHkuY3JlYXRlQ29sbGlkZXIoZGVzYywgcmlnaWRCb2R5ID8/IHVuZGVmaW5lZCk7XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGV4dGVuZCh7IE9iamVjdDNEIH0pO1xuXG5cdFx0ZWZmZWN0KCgpID0+IHtcblx0XHRcdGNvbnN0IG9iamVjdDNEUGFyYW1ldGVycyA9IHRoaXMub2JqZWN0M0RQYXJhbWV0ZXJzKCk7XG5cdFx0XHRhcHBseVByb3BzKHRoaXMub2JqZWN0UmVmLm5hdGl2ZUVsZW1lbnQsIG9iamVjdDNEUGFyYW1ldGVycyk7XG5cdFx0fSk7XG5cblx0XHRlZmZlY3QoKG9uQ2xlYW51cCkgPT4ge1xuXHRcdFx0Y29uc3QgY2xlYW51cCA9IHRoaXMuY3JlYXRlQ29sbGlkZXJTdGF0ZUVmZmVjdCgpO1xuXHRcdFx0b25DbGVhbnVwKCgpID0+IGNsZWFudXA/LigpKTtcblx0XHR9KTtcblxuXHRcdGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRjb25zdCBjbGVhbnVwID0gdGhpcy5jcmVhdGVDb2xsaWRlckV2ZW50c0VmZmVjdCgpO1xuXHRcdFx0b25DbGVhbnVwKCgpID0+IGNsZWFudXA/LigpKTtcblx0XHR9KTtcblxuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHR0aGlzLnVwZGF0ZUNvbGxpZGVyRWZmZWN0KCk7XG5cdFx0XHR0aGlzLnVwZGF0ZU1hc3NQcm9wZXJ0aWVzRWZmZWN0KCk7XG5cdFx0fSk7XG5cdH1cblxuXHRnZXQgd29ybGRTY2FsZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5vYmplY3RSZWYubmF0aXZlRWxlbWVudC5nZXRXb3JsZFNjYWxlKG5ldyBWZWN0b3IzKCkpO1xuXHR9XG5cblx0c2V0U2hhcGUoc2hhcGU6IE5ndHJDb2xsaWRlclNoYXBlKSB7XG5cdFx0dGhpcy5zaGFwZS5zZXQoc2hhcGUpO1xuXHR9XG5cblx0c2V0QXJncyhhcmdzOiB1bmtub3duW10pIHtcblx0XHR0aGlzLmFyZ3Muc2V0KGFyZ3MpO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVDb2xsaWRlclN0YXRlRWZmZWN0KCkge1xuXHRcdGNvbnN0IGNvbGxpZGVyID0gdGhpcy5jb2xsaWRlcigpO1xuXHRcdGlmICghY29sbGlkZXIpIHJldHVybjtcblxuXHRcdGNvbnN0IHdvcmxkU2luZ2xldG9uID0gdGhpcy5waHlzaWNzLndvcmxkU2luZ2xldG9uKCk7XG5cdFx0aWYgKCF3b3JsZFNpbmdsZXRvbikgcmV0dXJuO1xuXG5cdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUodGhpcy5vYmplY3RSZWYubmF0aXZlRWxlbWVudCk7XG5cdFx0aWYgKCFsb2NhbFN0YXRlKSByZXR1cm47XG5cblx0XHRjb25zdCBwYXJlbnQgPSBsb2NhbFN0YXRlLnBhcmVudCgpO1xuXHRcdGlmICghcGFyZW50IHx8ICEocGFyZW50IGFzIE9iamVjdDNEKS5pc09iamVjdDNEKSByZXR1cm47XG5cblx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuY3JlYXRlQ29sbGlkZXJTdGF0ZShcblx0XHRcdGNvbGxpZGVyLFxuXHRcdFx0dGhpcy5vYmplY3RSZWYubmF0aXZlRWxlbWVudCxcblx0XHRcdHRoaXMucmlnaWRCb2R5Py5vYmplY3RSZWYubmF0aXZlRWxlbWVudCxcblx0XHQpO1xuXHRcdHRoaXMucGh5c2ljcy5jb2xsaWRlclN0YXRlcy5zZXQoY29sbGlkZXIuaGFuZGxlLCBzdGF0ZSk7XG5cblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0dGhpcy5waHlzaWNzLmNvbGxpZGVyU3RhdGVzLmRlbGV0ZShjb2xsaWRlci5oYW5kbGUpO1xuXHRcdFx0aWYgKHdvcmxkU2luZ2xldG9uLnByb3h5LmdldENvbGxpZGVyKGNvbGxpZGVyLmhhbmRsZSkpIHtcblx0XHRcdFx0d29ybGRTaW5nbGV0b24ucHJveHkucmVtb3ZlQ29sbGlkZXIoY29sbGlkZXIsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxpZGVyRXZlbnRzRWZmZWN0KCkge1xuXHRcdGNvbnN0IGNvbGxpZGVyID0gdGhpcy5jb2xsaWRlcigpO1xuXHRcdGlmICghY29sbGlkZXIpIHJldHVybjtcblxuXHRcdGNvbnN0IHdvcmxkU2luZ2xldG9uID0gdGhpcy5waHlzaWNzLndvcmxkU2luZ2xldG9uKCk7XG5cdFx0aWYgKCF3b3JsZFNpbmdsZXRvbikgcmV0dXJuO1xuXG5cdFx0Y29uc3QgY29sbGlzaW9uRW50ZXIgPSBnZXRFbWl0dGVyKHRoaXMuY29sbGlzaW9uRW50ZXIpO1xuXHRcdGNvbnN0IGNvbGxpc2lvbkV4aXQgPSBnZXRFbWl0dGVyKHRoaXMuY29sbGlzaW9uRXhpdCk7XG5cdFx0Y29uc3QgaW50ZXJzZWN0aW9uRW50ZXIgPSBnZXRFbWl0dGVyKHRoaXMuaW50ZXJzZWN0aW9uRW50ZXIpO1xuXHRcdGNvbnN0IGludGVyc2VjdGlvbkV4aXQgPSBnZXRFbWl0dGVyKHRoaXMuaW50ZXJzZWN0aW9uRXhpdCk7XG5cdFx0Y29uc3QgY29udGFjdEZvcmNlID0gZ2V0RW1pdHRlcih0aGlzLmNvbnRhY3RGb3JjZSk7XG5cblx0XHRjb25zdCBoYXNDb2xsaXNpb25FdmVudCA9IGhhc0xpc3RlbmVyKFxuXHRcdFx0dGhpcy5jb2xsaXNpb25FbnRlcixcblx0XHRcdHRoaXMuY29sbGlzaW9uRXhpdCxcblx0XHRcdHRoaXMuaW50ZXJzZWN0aW9uRW50ZXIsXG5cdFx0XHR0aGlzLmludGVyc2VjdGlvbkV4aXQsXG5cdFx0XHR0aGlzLnJpZ2lkQm9keT8uY29sbGlzaW9uRW50ZXIsXG5cdFx0XHR0aGlzLnJpZ2lkQm9keT8uY29sbGlzaW9uRXhpdCxcblx0XHRcdHRoaXMucmlnaWRCb2R5Py5pbnRlcnNlY3Rpb25FbnRlcixcblx0XHRcdHRoaXMucmlnaWRCb2R5Py5pbnRlcnNlY3Rpb25FeGl0LFxuXHRcdCk7XG5cdFx0Y29uc3QgaGFzQ29udGFjdEZvcmNlRXZlbnQgPSBoYXNMaXN0ZW5lcih0aGlzLmNvbnRhY3RGb3JjZSwgdGhpcy5yaWdpZEJvZHk/LmNvbnRhY3RGb3JjZSk7XG5cblx0XHRpZiAoaGFzQ29sbGlzaW9uRXZlbnQgJiYgaGFzQ29udGFjdEZvcmNlRXZlbnQpIHtcblx0XHRcdGNvbGxpZGVyLnNldEFjdGl2ZUV2ZW50cyhBY3RpdmVFdmVudHMuQ09MTElTSU9OX0VWRU5UUyB8IEFjdGl2ZUV2ZW50cy5DT05UQUNUX0ZPUkNFX0VWRU5UUyk7XG5cdFx0fSBlbHNlIGlmIChoYXNDb2xsaXNpb25FdmVudCkge1xuXHRcdFx0Y29sbGlkZXIuc2V0QWN0aXZlRXZlbnRzKEFjdGl2ZUV2ZW50cy5DT0xMSVNJT05fRVZFTlRTKTtcblx0XHR9IGVsc2UgaWYgKGhhc0NvbnRhY3RGb3JjZUV2ZW50KSB7XG5cdFx0XHRjb2xsaWRlci5zZXRBY3RpdmVFdmVudHMoQWN0aXZlRXZlbnRzLkNPTlRBQ1RfRk9SQ0VfRVZFTlRTKTtcblx0XHR9XG5cblx0XHR0aGlzLnBoeXNpY3MuY29sbGlkZXJFdmVudHMuc2V0KGNvbGxpZGVyLmhhbmRsZSwge1xuXHRcdFx0b25Db2xsaXNpb25FbnRlcjogY29sbGlzaW9uRW50ZXIsXG5cdFx0XHRvbkNvbGxpc2lvbkV4aXQ6IGNvbGxpc2lvbkV4aXQsXG5cdFx0XHRvbkludGVyc2VjdGlvbkVudGVyOiBpbnRlcnNlY3Rpb25FbnRlcixcblx0XHRcdG9uSW50ZXJzZWN0aW9uRXhpdDogaW50ZXJzZWN0aW9uRXhpdCxcblx0XHRcdG9uQ29udGFjdEZvcmNlOiBjb250YWN0Rm9yY2UsXG5cdFx0fSk7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRoaXMucGh5c2ljcy5jb2xsaWRlckV2ZW50cy5kZWxldGUoY29sbGlkZXIuaGFuZGxlKTtcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVDb2xsaWRlckVmZmVjdCgpIHtcblx0XHRjb25zdCBjb2xsaWRlciA9IHRoaXMuY29sbGlkZXIoKTtcblx0XHRpZiAoIWNvbGxpZGVyKSByZXR1cm47XG5cblx0XHRjb25zdCB3b3JsZFNpbmdsZXRvbiA9IHRoaXMucGh5c2ljcy53b3JsZFNpbmdsZXRvbigpO1xuXHRcdGlmICghd29ybGRTaW5nbGV0b24pIHJldHVybjtcblxuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5waHlzaWNzLmNvbGxpZGVyU3RhdGVzLmdldChjb2xsaWRlci5oYW5kbGUpO1xuXHRcdGlmICghc3RhdGUpIHJldHVybjtcblxuXHRcdC8vIFVwZGF0ZSBjb2xsaWRlciBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgb2JqZWN0J3MgcG9zaXRpb25cblx0XHRjb25zdCBwYXJlbnRXb3JsZFNjYWxlID0gc3RhdGUub2JqZWN0LnBhcmVudCEuZ2V0V29ybGRTY2FsZShfdmVjdG9yMyk7XG5cdFx0Y29uc3QgcGFyZW50SW52ZXJ0ZWRXb3JsZE1hdHJpeCA9IHN0YXRlLndvcmxkUGFyZW50Py5tYXRyaXhXb3JsZC5jbG9uZSgpLmludmVydCgpO1xuXG5cdFx0c3RhdGUub2JqZWN0LnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTtcblxuXHRcdF9tYXRyaXg0LmNvcHkoc3RhdGUub2JqZWN0Lm1hdHJpeFdvcmxkKTtcblxuXHRcdGlmIChwYXJlbnRJbnZlcnRlZFdvcmxkTWF0cml4KSB7XG5cdFx0XHRfbWF0cml4NC5wcmVtdWx0aXBseShwYXJlbnRJbnZlcnRlZFdvcmxkTWF0cml4KTtcblx0XHR9XG5cblx0XHRfbWF0cml4NC5kZWNvbXBvc2UoX3Bvc2l0aW9uLCBfcm90YXRpb24sIF9zY2FsZSk7XG5cblx0XHRpZiAoY29sbGlkZXIucGFyZW50KCkpIHtcblx0XHRcdGNvbGxpZGVyLnNldFRyYW5zbGF0aW9uV3J0UGFyZW50KHtcblx0XHRcdFx0eDogX3Bvc2l0aW9uLnggKiBwYXJlbnRXb3JsZFNjYWxlLngsXG5cdFx0XHRcdHk6IF9wb3NpdGlvbi55ICogcGFyZW50V29ybGRTY2FsZS55LFxuXHRcdFx0XHR6OiBfcG9zaXRpb24ueiAqIHBhcmVudFdvcmxkU2NhbGUueixcblx0XHRcdH0pO1xuXHRcdFx0Y29sbGlkZXIuc2V0Um90YXRpb25XcnRQYXJlbnQoX3JvdGF0aW9uKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29sbGlkZXIuc2V0VHJhbnNsYXRpb24oe1xuXHRcdFx0XHR4OiBfcG9zaXRpb24ueCAqIHBhcmVudFdvcmxkU2NhbGUueCxcblx0XHRcdFx0eTogX3Bvc2l0aW9uLnkgKiBwYXJlbnRXb3JsZFNjYWxlLnksXG5cdFx0XHRcdHo6IF9wb3NpdGlvbi56ICogcGFyZW50V29ybGRTY2FsZS56LFxuXHRcdFx0fSk7XG5cdFx0XHRjb2xsaWRlci5zZXRSb3RhdGlvbihfcm90YXRpb24pO1xuXHRcdH1cblxuXHRcdGNvbnN0IFtcblx0XHRcdHNlbnNvcixcblx0XHRcdGNvbGxpc2lvbkdyb3Vwcyxcblx0XHRcdHNvbHZlckdyb3Vwcyxcblx0XHRcdGZyaWN0aW9uLFxuXHRcdFx0ZnJpY3Rpb25Db21iaW5lUnVsZSxcblx0XHRcdHJlc3RpdHV0aW9uLFxuXHRcdFx0cmVzdGl0dXRpb25Db21iaW5lUnVsZSxcblx0XHRcdGFjdGl2ZUNvbGxpc2lvblR5cGVzLFxuXHRcdFx0Y29udGFjdFNraW4sXG5cdFx0XSA9IFtcblx0XHRcdHRoaXMuc2Vuc29yKCksXG5cdFx0XHR0aGlzLmNvbGxpc2lvbkdyb3VwcygpLFxuXHRcdFx0dGhpcy5zb2x2ZXJHcm91cHMoKSxcblx0XHRcdHRoaXMuZnJpY3Rpb24oKSxcblx0XHRcdHRoaXMuZnJpY3Rpb25Db21iaW5lUnVsZSgpLFxuXHRcdFx0dGhpcy5yZXN0aXR1dGlvbigpLFxuXHRcdFx0dGhpcy5yZXN0aXR1dGlvbkNvbWJpbmVSdWxlKCksXG5cdFx0XHR0aGlzLmFjdGl2ZUNvbGxpc2lvblR5cGVzKCksXG5cdFx0XHR0aGlzLmNvbnRhY3RTa2luKCksXG5cdFx0XTtcblxuXHRcdGlmIChzZW5zb3IgIT09IHVuZGVmaW5lZCkgY29sbGlkZXIuc2V0U2Vuc29yKHNlbnNvcik7XG5cdFx0aWYgKGNvbGxpc2lvbkdyb3VwcyAhPT0gdW5kZWZpbmVkKSBjb2xsaWRlci5zZXRDb2xsaXNpb25Hcm91cHMoY29sbGlzaW9uR3JvdXBzKTtcblx0XHRpZiAoc29sdmVyR3JvdXBzICE9PSB1bmRlZmluZWQpIGNvbGxpZGVyLnNldFNvbHZlckdyb3Vwcyhzb2x2ZXJHcm91cHMpO1xuXHRcdGlmIChmcmljdGlvbiAhPT0gdW5kZWZpbmVkKSBjb2xsaWRlci5zZXRGcmljdGlvbihmcmljdGlvbik7XG5cdFx0aWYgKGZyaWN0aW9uQ29tYmluZVJ1bGUgIT09IHVuZGVmaW5lZCkgY29sbGlkZXIuc2V0RnJpY3Rpb25Db21iaW5lUnVsZShmcmljdGlvbkNvbWJpbmVSdWxlKTtcblx0XHRpZiAocmVzdGl0dXRpb24gIT09IHVuZGVmaW5lZCkgY29sbGlkZXIuc2V0UmVzdGl0dXRpb24ocmVzdGl0dXRpb24pO1xuXHRcdGlmIChyZXN0aXR1dGlvbkNvbWJpbmVSdWxlICE9PSB1bmRlZmluZWQpIGNvbGxpZGVyLnNldFJlc3RpdHV0aW9uQ29tYmluZVJ1bGUocmVzdGl0dXRpb25Db21iaW5lUnVsZSk7XG5cdFx0aWYgKGFjdGl2ZUNvbGxpc2lvblR5cGVzICE9PSB1bmRlZmluZWQpIGNvbGxpZGVyLnNldEFjdGl2ZUNvbGxpc2lvblR5cGVzKGFjdGl2ZUNvbGxpc2lvblR5cGVzKTtcblx0XHRpZiAoY29udGFjdFNraW4gIT09IHVuZGVmaW5lZCkgY29sbGlkZXIuc2V0Q29udGFjdFNraW4oY29udGFjdFNraW4pO1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVNYXNzUHJvcGVydGllc0VmZmVjdCgpIHtcblx0XHRjb25zdCBjb2xsaWRlciA9IHRoaXMuY29sbGlkZXIoKTtcblx0XHRpZiAoIWNvbGxpZGVyKSByZXR1cm47XG5cblx0XHRjb25zdCBbbWFzcywgbWFzc1Byb3BlcnRpZXMsIGRlbnNpdHldID0gW3RoaXMubWFzcygpLCB0aGlzLm1hc3NQcm9wZXJ0aWVzKCksIHRoaXMuZGVuc2l0eSgpXTtcblxuXHRcdGlmIChkZW5zaXR5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmIChtYXNzICE9PSB1bmRlZmluZWQgfHwgbWFzc1Byb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1tOR1QgUmFwaWVyXSBDYW5ub3Qgc2V0IG1hc3MgYW5kIG1hc3NQcm9wZXJ0aWVzIGFsb25nIHdpdGggZGVuc2l0eScpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb2xsaWRlci5zZXREZW5zaXR5KGRlbnNpdHkpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChtYXNzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmIChtYXNzUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignW05HVCBSYXBpZXJdIENhbm5vdCBzZXQgbWFzc1Byb3BlcnRpZXMgYWxvbmcgd2l0aCBtYXNzJyk7XG5cdFx0XHR9XG5cdFx0XHRjb2xsaWRlci5zZXRNYXNzKG1hc3MpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChtYXNzUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb2xsaWRlci5zZXRNYXNzUHJvcGVydGllcyhcblx0XHRcdFx0bWFzc1Byb3BlcnRpZXMubWFzcyxcblx0XHRcdFx0bWFzc1Byb3BlcnRpZXMuY2VudGVyT2ZNYXNzLFxuXHRcdFx0XHRtYXNzUHJvcGVydGllcy5wcmluY2lwYWxBbmd1bGFySW5lcnRpYSxcblx0XHRcdFx0bWFzc1Byb3BlcnRpZXMuYW5ndWxhckluZXJ0aWFMb2NhbEZyYW1lLFxuXHRcdFx0KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxpZGVyU3RhdGUoXG5cdFx0Y29sbGlkZXI6IENvbGxpZGVyLFxuXHRcdG9iamVjdDogT2JqZWN0M0QsXG5cdFx0cmlnaWRCb2R5T2JqZWN0PzogT2JqZWN0M0QgfCBudWxsLFxuXHQpOiBOZ3RyQ29sbGlkZXJTdGF0ZSB7XG5cdFx0cmV0dXJuIHsgY29sbGlkZXIsIHdvcmxkUGFyZW50OiByaWdpZEJvZHlPYmplY3QgfHwgdW5kZWZpbmVkLCBvYmplY3QgfTtcblx0fVxuXG5cdHByaXZhdGUgc2NhbGVWZXJ0aWNlcyh2ZXJ0aWNlczogQXJyYXlMaWtlPG51bWJlcj4sIHNjYWxlOiBWZWN0b3IzKSB7XG5cdFx0Y29uc3Qgc2NhbGVkVmVydHMgPSBBcnJheS5mcm9tKHZlcnRpY2VzKTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoIC8gMzsgaSsrKSB7XG5cdFx0XHRzY2FsZWRWZXJ0c1tpICogM10gKj0gc2NhbGUueDtcblx0XHRcdHNjYWxlZFZlcnRzW2kgKiAzICsgMV0gKj0gc2NhbGUueTtcblx0XHRcdHNjYWxlZFZlcnRzW2kgKiAzICsgMl0gKj0gc2NhbGUuejtcblx0XHR9XG5cblx0XHRyZXR1cm4gc2NhbGVkVmVydHM7XG5cdH1cbn1cblxuY29uc3QgUklHSURfQk9EWV9UWVBFX01BUDogUmVjb3JkPE5ndHJSaWdpZEJvZHlUeXBlLCBudW1iZXI+ID0ge1xuXHRmaXhlZDogMSxcblx0ZHluYW1pYzogMCxcblx0a2luZW1hdGljUG9zaXRpb246IDIsXG5cdGtpbmVtYXRpY1ZlbG9jaXR5OiAzLFxufTtcblxuZXhwb3J0IGNvbnN0IHJpZ2lkQm9keURlZmF1bHRPcHRpb25zOiBOZ3RyUmlnaWRCb2R5T3B0aW9ucyA9IHtcblx0Y2FuU2xlZXA6IHRydWUsXG5cdGxpbmVhclZlbG9jaXR5OiBbMCwgMCwgMF0sXG5cdGFuZ3VsYXJWZWxvY2l0eTogWzAsIDAsIDBdLFxuXHRncmF2aXR5U2NhbGU6IDEsXG5cdGRvbWluYW5jZUdyb3VwOiAwLFxuXHRjY2Q6IGZhbHNlLFxuXHRzb2Z0Q2NkUHJlZGljdGlvbjogMCxcblx0Y29udGFjdFNraW46IDAsXG59O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3Qtb2JqZWN0M0Rbbmd0clJpZ2lkQm9keV0nLFxuXHRleHBvcnRBczogJ3JpZ2lkQm9keScsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5nLWNvbnRlbnQgLz5cblx0XHRAZm9yIChjaGlsZENvbGxpZGVyT3B0aW9uIG9mIGNoaWxkQ29sbGlkZXJPcHRpb25zKCk7IHRyYWNrICRpbmRleCkge1xuXHRcdFx0PG5ndC1vYmplY3QzRFxuXHRcdFx0XHRbbmd0ckNvbGxpZGVyXT1cImNoaWxkQ29sbGlkZXJPcHRpb24uc2hhcGVcIlxuXHRcdFx0XHRbYXJnc109XCJjaGlsZENvbGxpZGVyT3B0aW9uLmFyZ3NcIlxuXHRcdFx0XHRbcG9zaXRpb25dPVwiY2hpbGRDb2xsaWRlck9wdGlvbi5wb3NpdGlvblwiXG5cdFx0XHRcdFtyb3RhdGlvbl09XCJjaGlsZENvbGxpZGVyT3B0aW9uLnJvdGF0aW9uXCJcblx0XHRcdFx0W3NjYWxlXT1cImNoaWxkQ29sbGlkZXJPcHRpb24uc2NhbGVcIlxuXHRcdFx0XHRbbmFtZV09XCJvYmplY3RSZWYubmF0aXZlRWxlbWVudC5uYW1lICsgJy1jb2xsaWRlci0nICsgJGluZGV4XCJcblx0XHRcdFx0W29wdGlvbnNdPVwiY2hpbGRDb2xsaWRlck9wdGlvbi5jb2xsaWRlck9wdGlvbnNcIlxuXHRcdFx0Lz5cblx0XHR9XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RyQW55Q29sbGlkZXJdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RyUmlnaWRCb2R5IHtcblx0dHlwZSA9IGlucHV0KCdkeW5hbWljJywge1xuXHRcdGFsaWFzOiAnbmd0clJpZ2lkQm9keScsXG5cdFx0dHJhbnNmb3JtOiAodmFsdWU6IE5ndHJSaWdpZEJvZHlUeXBlIHwgJycgfCB1bmRlZmluZWQpID0+IHtcblx0XHRcdGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuICdkeW5hbWljJyBhcyBOZ3RyUmlnaWRCb2R5VHlwZTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9LFxuXHR9KTtcblx0cG9zaXRpb24gPSBpbnB1dDxOZ3RWZWN0b3IzIHwgdW5kZWZpbmVkPihbMCwgMCwgMF0pO1xuXHRyb3RhdGlvbiA9IGlucHV0PE5ndEV1bGVyIHwgdW5kZWZpbmVkPihbMCwgMCwgMF0pO1xuXHRzY2FsZSA9IGlucHV0PE5ndFZlY3RvcjMgfCB1bmRlZmluZWQ+KFsxLCAxLCAxXSk7XG5cdHF1YXRlcm5pb24gPSBpbnB1dDxOZ3RRdWF0ZXJuaW9uIHwgdW5kZWZpbmVkPihbMCwgMCwgMCwgMV0pO1xuXHR1c2VyRGF0YSA9IGlucHV0PE5ndE9iamVjdDNEWyd1c2VyRGF0YSddIHwgdW5kZWZpbmVkPih7fSk7XG5cdG9wdGlvbnMgPSBpbnB1dChyaWdpZEJvZHlEZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKHJpZ2lkQm9keURlZmF1bHRPcHRpb25zKSB9KTtcblxuXHRwcml2YXRlIG9iamVjdDNEUGFyYW1ldGVycyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cG9zaXRpb246IHRoaXMucG9zaXRpb24oKSxcblx0XHRcdHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uKCksXG5cdFx0XHRzY2FsZTogdGhpcy5zY2FsZSgpLFxuXHRcdFx0cXVhdGVybmlvbjogdGhpcy5xdWF0ZXJuaW9uKCksXG5cdFx0XHR1c2VyRGF0YTogdGhpcy51c2VyRGF0YSgpLFxuXHRcdH07XG5cdH0pO1xuXG5cdHdha2UgPSBvdXRwdXQ8dm9pZD4oKTtcblx0c2xlZXAgPSBvdXRwdXQ8dm9pZD4oKTtcblx0Y29sbGlzaW9uRW50ZXIgPSBvdXRwdXQ8Tmd0ckNvbGxpc2lvbkVudGVyUGF5bG9hZD4oKTtcblx0Y29sbGlzaW9uRXhpdCA9IG91dHB1dDxOZ3RyQ29sbGlzaW9uRXhpdFBheWxvYWQ+KCk7XG5cdGludGVyc2VjdGlvbkVudGVyID0gb3V0cHV0PE5ndHJJbnRlcnNlY3Rpb25FbnRlclBheWxvYWQ+KCk7XG5cdGludGVyc2VjdGlvbkV4aXQgPSBvdXRwdXQ8Tmd0ckludGVyc2VjdGlvbkV4aXRQYXlsb2FkPigpO1xuXHRjb250YWN0Rm9yY2UgPSBvdXRwdXQ8Tmd0ckNvbnRhY3RGb3JjZVBheWxvYWQ+KCk7XG5cblx0cHJpdmF0ZSBjYW5TbGVlcCA9IHBpY2sodGhpcy5vcHRpb25zLCAnY2FuU2xlZXAnKTtcblx0cHJpdmF0ZSBjb2xsaWRlcnMgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2NvbGxpZGVycycpO1xuXHRwcml2YXRlIHRyYW5zZm9ybVN0YXRlID0gcGljayh0aGlzLm9wdGlvbnMsICd0cmFuc2Zvcm1TdGF0ZScpO1xuXHRwcml2YXRlIGdyYXZpdHlTY2FsZSA9IHBpY2sodGhpcy5vcHRpb25zLCAnZ3Jhdml0eVNjYWxlJyk7XG5cdHByaXZhdGUgZG9taW5hbmNlR3JvdXAgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2RvbWluYW5jZUdyb3VwJyk7XG5cdHByaXZhdGUgY2NkID0gcGljayh0aGlzLm9wdGlvbnMsICdjY2QnKTtcblx0cHJpdmF0ZSBzb2Z0Q2NkUHJlZGljdGlvbiA9IHBpY2sodGhpcy5vcHRpb25zLCAnc29mdENjZFByZWRpY3Rpb24nKTtcblx0cHJpdmF0ZSBhZGRpdGlvbmFsU29sdmVySXRlcmF0aW9ucyA9IHBpY2sodGhpcy5vcHRpb25zLCAnYWRkaXRpb25hbFNvbHZlckl0ZXJhdGlvbnMnKTtcblx0cHJpdmF0ZSBsaW5lYXJEYW1waW5nID0gcGljayh0aGlzLm9wdGlvbnMsICdsaW5lYXJEYW1waW5nJyk7XG5cdHByaXZhdGUgYW5ndWxhckRhbXBpbmcgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2FuZ3VsYXJEYW1waW5nJyk7XG5cdHByaXZhdGUgbG9ja1JvdGF0aW9ucyA9IHBpY2sodGhpcy5vcHRpb25zLCAnbG9ja1JvdGF0aW9ucycpO1xuXHRwcml2YXRlIGxvY2tUcmFuc2xhdGlvbnMgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2xvY2tUcmFuc2xhdGlvbnMnKTtcblx0cHJpdmF0ZSBlbmFibGVkUm90YXRpb25zID0gcGljayh0aGlzLm9wdGlvbnMsICdlbmFibGVkUm90YXRpb25zJyk7XG5cdHByaXZhdGUgZW5hYmxlZFRyYW5zbGF0aW9ucyA9IHBpY2sodGhpcy5vcHRpb25zLCAnZW5hYmxlZFRyYW5zbGF0aW9ucycpO1xuXHRwcml2YXRlIGFuZ3VsYXJWZWxvY2l0eSA9IHBpY2sodGhpcy5vcHRpb25zLCAnYW5ndWxhclZlbG9jaXR5Jyk7XG5cdHByaXZhdGUgbGluZWFyVmVsb2NpdHkgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2xpbmVhclZlbG9jaXR5Jyk7XG5cblx0b2JqZWN0UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8T2JqZWN0M0Q+PihFbGVtZW50UmVmKTtcblx0cHJpdmF0ZSBwaHlzaWNzID0gaW5qZWN0KE5ndHJQaHlzaWNzKTtcblxuXHRwcml2YXRlIGJvZHlUeXBlID0gY29tcHV0ZWQoKCkgPT4gUklHSURfQk9EWV9UWVBFX01BUFt0aGlzLnR5cGUoKV0pO1xuXHRwcml2YXRlIGJvZHlEZXNjID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IFtjYW5TbGVlcCwgYm9keVR5cGVdID0gW3RoaXMuY2FuU2xlZXAoKSwgdW50cmFja2VkKHRoaXMuYm9keVR5cGUpLCB0aGlzLmNvbGxpZGVycygpXTtcblx0XHRyZXR1cm4gbmV3IFJpZ2lkQm9keURlc2MoYm9keVR5cGUpLnNldENhblNsZWVwKGNhblNsZWVwKTtcblx0fSk7XG5cdHJpZ2lkQm9keSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB3b3JsZFNpbmdsZXRvbiA9IHRoaXMucGh5c2ljcy53b3JsZFNpbmdsZXRvbigpO1xuXHRcdGlmICghd29ybGRTaW5nbGV0b24pIHJldHVybiBudWxsO1xuXHRcdHJldHVybiB3b3JsZFNpbmdsZXRvbi5wcm94eS5jcmVhdGVSaWdpZEJvZHkodGhpcy5ib2R5RGVzYygpKTtcblx0fSk7XG5cblx0cHJvdGVjdGVkIGNoaWxkQ29sbGlkZXJPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IGNvbGxpZGVycyA9IHRoaXMuY29sbGlkZXJzKCk7XG5cdFx0Ly8gaWYgc2VsZiBjb2xsaWRlcnMgaXMgZmFsc2UgZXhwbGljaXRseSwgZGlzYWJsZSBhdXRvIGNvbGxpZGVycyBmb3IgdGhpcyBvYmplY3QgZW50aXJlbHkuXG5cdFx0aWYgKGNvbGxpZGVycyA9PT0gZmFsc2UpIHJldHVybiBbXTtcblxuXHRcdGNvbnN0IHBoeXNpY3NDb2xsaWRlcnMgPSB0aGlzLnBoeXNpY3MuY29sbGlkZXJzKCk7XG5cdFx0Ly8gaWYgcGh5c2ljcyBjb2xsaWRlcnMgaXMgZmFsc2UgZXhwbGljaXRseSBBTkQgY29sbGlkZXJzIGlzIG5vdCBzZXQsIGRpc2FibGUgYXV0byBjb2xsaWRlcnMgZm9yIHRoaXMgb2JqZWN0IGVudGlyZWx5LlxuXHRcdGlmIChwaHlzaWNzQ29sbGlkZXJzID09PSBmYWxzZSAmJiBjb2xsaWRlcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuXG5cdFx0Y29uc3Qgb3B0aW9ucyA9IHVudHJhY2tlZCh0aGlzLm9wdGlvbnMpO1xuXHRcdC8vIGlmIGNvbGxpZGVycyBvbiBvYmplY3QgaXMgbm90IHNldCwgdXNlIHBoeXNpY3MgY29sbGlkZXJzXG5cdFx0aWYgKCFvcHRpb25zLmNvbGxpZGVycykgb3B0aW9ucy5jb2xsaWRlcnMgPSBwaHlzaWNzQ29sbGlkZXJzO1xuXG5cdFx0Y29uc3Qgb2JqZWN0TG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUodGhpcy5vYmplY3RSZWYubmF0aXZlRWxlbWVudCk7XG5cdFx0aWYgKCFvYmplY3RMb2NhbFN0YXRlKSByZXR1cm4gW107XG5cblx0XHQvLyB0cmFjayBvYmplY3QncyBwYXJlbnQgYW5kIG5vbi1vYmplY3QgY2hpbGRyZW5cblx0XHRjb25zdCBbcGFyZW50XSA9IFtvYmplY3RMb2NhbFN0YXRlLnBhcmVudCgpLCBvYmplY3RMb2NhbFN0YXRlLm5vbk9iamVjdHMoKV07XG5cdFx0aWYgKCFwYXJlbnQgfHwgIShwYXJlbnQgYXMgT2JqZWN0M0QpLmlzT2JqZWN0M0QpIHJldHVybiBbXTtcblxuXHRcdHJldHVybiBjcmVhdGVDb2xsaWRlck9wdGlvbnModGhpcy5vYmplY3RSZWYubmF0aXZlRWxlbWVudCwgb3B0aW9ucywgdHJ1ZSk7XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGV4dGVuZCh7IE9iamVjdDNEIH0pO1xuXG5cdFx0ZWZmZWN0KCgpID0+IHtcblx0XHRcdGNvbnN0IG9iamVjdDNEUGFyYW1ldGVycyA9IHRoaXMub2JqZWN0M0RQYXJhbWV0ZXJzKCk7XG5cdFx0XHRhcHBseVByb3BzKHRoaXMub2JqZWN0UmVmLm5hdGl2ZUVsZW1lbnQsIG9iamVjdDNEUGFyYW1ldGVycyk7XG5cdFx0fSk7XG5cblx0XHRlZmZlY3QoKG9uQ2xlYW51cCkgPT4ge1xuXHRcdFx0Y29uc3QgY2xlYW51cCA9IHRoaXMuY3JlYXRlUmlnaWRCb2R5U3RhdGVFZmZlY3QoKTtcblx0XHRcdG9uQ2xlYW51cCgoKSA9PiBjbGVhbnVwPy4oKSk7XG5cdFx0fSk7XG5cblx0XHRlZmZlY3QoKG9uQ2xlYW51cCkgPT4ge1xuXHRcdFx0Y29uc3QgY2xlYW51cCA9IHRoaXMuY3JlYXRlUmlnaWRCb2R5RXZlbnRzRWZmZWN0KCk7XG5cdFx0XHRvbkNsZWFudXAoKCkgPT4gY2xlYW51cD8uKCkpO1xuXHRcdH0pO1xuXG5cdFx0ZWZmZWN0KCgpID0+IHtcblx0XHRcdHRoaXMudXBkYXRlUmlnaWRCb2R5RWZmZWN0KCk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZVJpZ2lkQm9keVN0YXRlRWZmZWN0KCkge1xuXHRcdGNvbnN0IHdvcmxkU2luZ2xldG9uID0gdGhpcy5waHlzaWNzLndvcmxkU2luZ2xldG9uKCk7XG5cdFx0aWYgKCF3b3JsZFNpbmdsZXRvbikgcmV0dXJuO1xuXG5cdFx0Y29uc3QgYm9keSA9IHRoaXMucmlnaWRCb2R5KCk7XG5cdFx0aWYgKCFib2R5KSByZXR1cm47XG5cblx0XHRjb25zdCB0cmFuc2Zvcm1TdGF0ZSA9IHVudHJhY2tlZCh0aGlzLnRyYW5zZm9ybVN0YXRlKTtcblxuXHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKHRoaXMub2JqZWN0UmVmLm5hdGl2ZUVsZW1lbnQpO1xuXHRcdGlmICghbG9jYWxTdGF0ZSkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgcGFyZW50ID0gbG9jYWxTdGF0ZS5wYXJlbnQoKTtcblx0XHRpZiAoIXBhcmVudCB8fCAhKHBhcmVudCBhcyBPYmplY3QzRCkuaXNPYmplY3QzRCkgcmV0dXJuO1xuXG5cdFx0Y29uc3Qgc3RhdGUgPSB0aGlzLmNyZWF0ZVJpZ2lkQm9keVN0YXRlKGJvZHksIHRoaXMub2JqZWN0UmVmLm5hdGl2ZUVsZW1lbnQpO1xuXHRcdHRoaXMucGh5c2ljcy5yaWdpZEJvZHlTdGF0ZXMuc2V0KGJvZHkuaGFuZGxlLCB0cmFuc2Zvcm1TdGF0ZSA/IHRyYW5zZm9ybVN0YXRlKHN0YXRlKSA6IHN0YXRlKTtcblxuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHR0aGlzLnBoeXNpY3MucmlnaWRCb2R5U3RhdGVzLmRlbGV0ZShib2R5LmhhbmRsZSk7XG5cdFx0XHRpZiAod29ybGRTaW5nbGV0b24ucHJveHkuZ2V0UmlnaWRCb2R5KGJvZHkuaGFuZGxlKSkge1xuXHRcdFx0XHR3b3JsZFNpbmdsZXRvbi5wcm94eS5yZW1vdmVSaWdpZEJvZHkoYm9keSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlUmlnaWRCb2R5RXZlbnRzRWZmZWN0KCkge1xuXHRcdGNvbnN0IHdvcmxkU2luZ2xldG9uID0gdGhpcy5waHlzaWNzLndvcmxkU2luZ2xldG9uKCk7XG5cdFx0aWYgKCF3b3JsZFNpbmdsZXRvbikgcmV0dXJuO1xuXG5cdFx0Y29uc3QgYm9keSA9IHRoaXMucmlnaWRCb2R5KCk7XG5cdFx0aWYgKCFib2R5KSByZXR1cm47XG5cblx0XHRjb25zdCB3YWtlID0gZ2V0RW1pdHRlcih0aGlzLndha2UpO1xuXHRcdGNvbnN0IHNsZWVwID0gZ2V0RW1pdHRlcih0aGlzLnNsZWVwKTtcblx0XHRjb25zdCBjb2xsaXNpb25FbnRlciA9IGdldEVtaXR0ZXIodGhpcy5jb2xsaXNpb25FbnRlcik7XG5cdFx0Y29uc3QgY29sbGlzaW9uRXhpdCA9IGdldEVtaXR0ZXIodGhpcy5jb2xsaXNpb25FeGl0KTtcblx0XHRjb25zdCBpbnRlcnNlY3Rpb25FbnRlciA9IGdldEVtaXR0ZXIodGhpcy5pbnRlcnNlY3Rpb25FbnRlcik7XG5cdFx0Y29uc3QgaW50ZXJzZWN0aW9uRXhpdCA9IGdldEVtaXR0ZXIodGhpcy5pbnRlcnNlY3Rpb25FeGl0KTtcblx0XHRjb25zdCBjb250YWN0Rm9yY2UgPSBnZXRFbWl0dGVyKHRoaXMuY29udGFjdEZvcmNlKTtcblxuXHRcdHRoaXMucGh5c2ljcy5yaWdpZEJvZHlFdmVudHMuc2V0KGJvZHkuaGFuZGxlLCB7XG5cdFx0XHRvbldha2U6IHdha2UsXG5cdFx0XHRvblNsZWVwOiBzbGVlcCxcblx0XHRcdG9uQ29sbGlzaW9uRW50ZXI6IGNvbGxpc2lvbkVudGVyLFxuXHRcdFx0b25Db2xsaXNpb25FeGl0OiBjb2xsaXNpb25FeGl0LFxuXHRcdFx0b25JbnRlcnNlY3Rpb25FbnRlcjogaW50ZXJzZWN0aW9uRW50ZXIsXG5cdFx0XHRvbkludGVyc2VjdGlvbkV4aXQ6IGludGVyc2VjdGlvbkV4aXQsXG5cdFx0XHRvbkNvbnRhY3RGb3JjZTogY29udGFjdEZvcmNlLFxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRoaXMucGh5c2ljcy5yaWdpZEJvZHlFdmVudHMuZGVsZXRlKGJvZHkuaGFuZGxlKTtcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVSaWdpZEJvZHlFZmZlY3QoKSB7XG5cdFx0Y29uc3Qgd29ybGRTaW5nbGV0b24gPSB0aGlzLnBoeXNpY3Mud29ybGRTaW5nbGV0b24oKTtcblx0XHRpZiAoIXdvcmxkU2luZ2xldG9uKSByZXR1cm47XG5cblx0XHRjb25zdCBib2R5ID0gdGhpcy5yaWdpZEJvZHkoKTtcblx0XHRpZiAoIWJvZHkpIHJldHVybjtcblxuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5waHlzaWNzLnJpZ2lkQm9keVN0YXRlcy5nZXQoYm9keS5oYW5kbGUpO1xuXHRcdGlmICghc3RhdGUpIHJldHVybjtcblxuXHRcdHN0YXRlLm9iamVjdC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7XG5cdFx0X21hdHJpeDQuY29weShzdGF0ZS5vYmplY3QubWF0cml4V29ybGQpLmRlY29tcG9zZShfcG9zaXRpb24sIF9yb3RhdGlvbiwgX3NjYWxlKTtcblx0XHRib2R5LnNldFRyYW5zbGF0aW9uKF9wb3NpdGlvbiwgdHJ1ZSk7XG5cdFx0Ym9keS5zZXRSb3RhdGlvbihfcm90YXRpb24sIHRydWUpO1xuXG5cdFx0Y29uc3QgW1xuXHRcdFx0Z3Jhdml0eVNjYWxlLFxuXHRcdFx0YWRkaXRpb25hbFNvbHZlckl0ZXJhdGlvbnMsXG5cdFx0XHRsaW5lYXJEYW1waW5nLFxuXHRcdFx0YW5ndWxhckRhbXBpbmcsXG5cdFx0XHRsb2NrUm90YXRpb25zLFxuXHRcdFx0bG9ja1RyYW5zbGF0aW9ucyxcblx0XHRcdGVuYWJsZWRSb3RhdGlvbnMsXG5cdFx0XHRlbmFibGVkVHJhbnNsYXRpb25zLFxuXHRcdFx0YW5ndWxhclZlbG9jaXR5LFxuXHRcdFx0bGluZWFyVmVsb2NpdHksXG5cdFx0XHRjY2QsXG5cdFx0XHRzb2Z0Q2NkUHJlZGljdGlvbixcblx0XHRcdGRvbWluYW5jZUdyb3VwLFxuXHRcdFx0dXNlckRhdGEsXG5cdFx0XHRib2R5VHlwZSxcblx0XHRdID0gW1xuXHRcdFx0dGhpcy5ncmF2aXR5U2NhbGUoKSxcblx0XHRcdHRoaXMuYWRkaXRpb25hbFNvbHZlckl0ZXJhdGlvbnMoKSxcblx0XHRcdHRoaXMubGluZWFyRGFtcGluZygpLFxuXHRcdFx0dGhpcy5hbmd1bGFyRGFtcGluZygpLFxuXHRcdFx0dGhpcy5sb2NrUm90YXRpb25zKCksXG5cdFx0XHR0aGlzLmxvY2tUcmFuc2xhdGlvbnMoKSxcblx0XHRcdHRoaXMuZW5hYmxlZFJvdGF0aW9ucygpLFxuXHRcdFx0dGhpcy5lbmFibGVkVHJhbnNsYXRpb25zKCksXG5cdFx0XHR0aGlzLmFuZ3VsYXJWZWxvY2l0eSgpLFxuXHRcdFx0dGhpcy5saW5lYXJWZWxvY2l0eSgpLFxuXHRcdFx0dGhpcy5jY2QoKSxcblx0XHRcdHRoaXMuc29mdENjZFByZWRpY3Rpb24oKSxcblx0XHRcdHRoaXMuZG9taW5hbmNlR3JvdXAoKSxcblx0XHRcdHRoaXMudXNlckRhdGEoKSxcblx0XHRcdHRoaXMuYm9keVR5cGUoKSxcblx0XHRdO1xuXG5cdFx0Ym9keS5zZXRHcmF2aXR5U2NhbGUoZ3Jhdml0eVNjYWxlLCB0cnVlKTtcblx0XHRpZiAoYWRkaXRpb25hbFNvbHZlckl0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZCkgYm9keS5zZXRBZGRpdGlvbmFsU29sdmVySXRlcmF0aW9ucyhhZGRpdGlvbmFsU29sdmVySXRlcmF0aW9ucyk7XG5cdFx0aWYgKGxpbmVhckRhbXBpbmcgIT09IHVuZGVmaW5lZCkgYm9keS5zZXRMaW5lYXJEYW1waW5nKGxpbmVhckRhbXBpbmcpO1xuXHRcdGlmIChhbmd1bGFyRGFtcGluZyAhPT0gdW5kZWZpbmVkKSBib2R5LnNldEFuZ3VsYXJEYW1waW5nKGFuZ3VsYXJEYW1waW5nKTtcblx0XHRib2R5LnNldERvbWluYW5jZUdyb3VwKGRvbWluYW5jZUdyb3VwKTtcblx0XHRpZiAoZW5hYmxlZFJvdGF0aW9ucyAhPT0gdW5kZWZpbmVkKSBib2R5LnNldEVuYWJsZWRSb3RhdGlvbnMoLi4uZW5hYmxlZFJvdGF0aW9ucywgdHJ1ZSk7XG5cdFx0aWYgKGVuYWJsZWRUcmFuc2xhdGlvbnMgIT09IHVuZGVmaW5lZCkgYm9keS5zZXRFbmFibGVkVHJhbnNsYXRpb25zKC4uLmVuYWJsZWRUcmFuc2xhdGlvbnMsIHRydWUpO1xuXHRcdGlmIChsb2NrUm90YXRpb25zICE9PSB1bmRlZmluZWQpIGJvZHkubG9ja1JvdGF0aW9ucyhsb2NrUm90YXRpb25zLCB0cnVlKTtcblx0XHRpZiAobG9ja1RyYW5zbGF0aW9ucyAhPT0gdW5kZWZpbmVkKSBib2R5LmxvY2tUcmFuc2xhdGlvbnMobG9ja1RyYW5zbGF0aW9ucywgdHJ1ZSk7XG5cdFx0Ym9keS5zZXRBbmd2ZWwoeyB4OiBhbmd1bGFyVmVsb2NpdHlbMF0sIHk6IGFuZ3VsYXJWZWxvY2l0eVsxXSwgejogYW5ndWxhclZlbG9jaXR5WzJdIH0sIHRydWUpO1xuXHRcdGJvZHkuc2V0TGludmVsKHsgeDogbGluZWFyVmVsb2NpdHlbMF0sIHk6IGxpbmVhclZlbG9jaXR5WzFdLCB6OiBsaW5lYXJWZWxvY2l0eVsyXSB9LCB0cnVlKTtcblx0XHRib2R5LmVuYWJsZUNjZChjY2QpO1xuXHRcdGJvZHkuc2V0U29mdENjZFByZWRpY3Rpb24oc29mdENjZFByZWRpY3Rpb24pO1xuXHRcdGlmICh1c2VyRGF0YSAhPT0gdW5kZWZpbmVkKSBib2R5LnVzZXJEYXRhID0gdXNlckRhdGE7XG5cdFx0aWYgKGJvZHlUeXBlICE9PSBib2R5LmJvZHlUeXBlKCkpIGJvZHkuc2V0Qm9keVR5cGUoYm9keVR5cGUsIHRydWUpO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVSaWdpZEJvZHlTdGF0ZShcblx0XHRyaWdpZEJvZHk6IFJpZ2lkQm9keSxcblx0XHRvYmplY3Q6IE9iamVjdDNELFxuXHRcdHNldE1hdHJpeD86IChtYXRyaXg6IE1hdHJpeDQpID0+IHZvaWQsXG5cdFx0Z2V0TWF0cml4PzogKG1hdHJpeDogTWF0cml4NCkgPT4gTWF0cml4NCxcblx0XHR3b3JsZFNjYWxlPzogVmVjdG9yMyxcblx0XHRtZXNoVHlwZTogTmd0clJpZ2lkQm9keVN0YXRlWydtZXNoVHlwZSddID0gJ21lc2gnLFxuXHQpIHtcblx0XHRvYmplY3QudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xuXHRcdGNvbnN0IGludmVydGVkV29ybGRNYXRyaXggPSBvYmplY3QucGFyZW50IS5tYXRyaXhXb3JsZC5jbG9uZSgpLmludmVydCgpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRvYmplY3QsXG5cdFx0XHRyaWdpZEJvZHksXG5cdFx0XHRpbnZlcnRlZFdvcmxkTWF0cml4LFxuXHRcdFx0c2V0TWF0cml4OiBzZXRNYXRyaXhcblx0XHRcdFx0PyBzZXRNYXRyaXhcblx0XHRcdFx0OiAobWF0cml4OiBNYXRyaXg0KSA9PiB7XG5cdFx0XHRcdFx0XHRvYmplY3QubWF0cml4LmNvcHkobWF0cml4KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0Z2V0TWF0cml4OiBnZXRNYXRyaXggPyBnZXRNYXRyaXggOiAobWF0cml4OiBNYXRyaXg0KSA9PiBtYXRyaXguY29weShvYmplY3QubWF0cml4KSxcblx0XHRcdHNjYWxlOiB3b3JsZFNjYWxlIHx8IG9iamVjdC5nZXRXb3JsZFNjYWxlKF9zY2FsZSkuY2xvbmUoKSxcblx0XHRcdGlzU2xlZXBpbmc6IGZhbHNlLFxuXHRcdFx0bWVzaFR5cGUsXG5cdFx0fTtcblx0fVxufVxuIl19