angular-three 2.0.0-beta.3 → 2.0.0-beta.300

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/README.md +186 -112
  2. package/esm2022/angular-three.mjs +1 -1
  3. package/esm2022/index.mjs +17 -18
  4. package/esm2022/lib/canvas.mjs +155 -252
  5. package/esm2022/lib/directives/args.mjs +49 -21
  6. package/esm2022/lib/directives/selection.mjs +65 -0
  7. package/esm2022/lib/dom/events.mjs +7 -2
  8. package/esm2022/lib/events.mjs +98 -79
  9. package/esm2022/lib/html.mjs +40 -0
  10. package/esm2022/lib/instance.mjs +72 -0
  11. package/esm2022/lib/loader.mjs +77 -57
  12. package/esm2022/lib/loop.mjs +30 -24
  13. package/esm2022/lib/pipes/hexify.mjs +67 -0
  14. package/esm2022/lib/portal.mjs +184 -215
  15. package/esm2022/lib/renderer/catalogue.mjs +7 -0
  16. package/esm2022/lib/renderer/constants.mjs +20 -0
  17. package/esm2022/lib/renderer/index.mjs +557 -0
  18. package/esm2022/lib/renderer/state.mjs +49 -0
  19. package/esm2022/lib/renderer/utils.mjs +85 -74
  20. package/esm2022/lib/roots.mjs +273 -0
  21. package/esm2022/lib/routed-scene.mjs +13 -11
  22. package/esm2022/lib/store.mjs +183 -0
  23. package/esm2022/lib/three-types.mjs +1 -1
  24. package/esm2022/lib/types.mjs +1 -1
  25. package/esm2022/lib/utils/apply-props.mjs +43 -35
  26. package/esm2022/lib/utils/attach.mjs +13 -10
  27. package/esm2022/lib/utils/before-render.mjs +12 -0
  28. package/esm2022/lib/utils/is.mjs +6 -5
  29. package/esm2022/lib/utils/make.mjs +19 -17
  30. package/esm2022/lib/utils/non-nullish.mjs +7 -0
  31. package/esm2022/lib/utils/object-events.mjs +92 -0
  32. package/esm2022/lib/utils/parameters.mjs +70 -0
  33. package/esm2022/lib/utils/resolve-ref.mjs +8 -0
  34. package/esm2022/lib/utils/signal-store.mjs +90 -0
  35. package/esm2022/lib/utils/update.mjs +8 -4
  36. package/esm2022/testing/angular-three-testing.mjs +5 -0
  37. package/esm2022/testing/index.mjs +3 -0
  38. package/esm2022/testing/lib/test-bed.mjs +130 -0
  39. package/esm2022/testing/lib/test-canvas.mjs +45 -0
  40. package/esm2022/testing/lib/utils/mock-canvas.mjs +37 -0
  41. package/esm2022/testing/lib/utils/web-gl-rendering-context.mjs +752 -0
  42. package/fesm2022/angular-three-testing.mjs +966 -0
  43. package/fesm2022/angular-three-testing.mjs.map +1 -0
  44. package/fesm2022/angular-three.mjs +2110 -2057
  45. package/fesm2022/angular-three.mjs.map +1 -1
  46. package/index.d.ts +18 -17
  47. package/lib/canvas.d.ts +373 -33
  48. package/lib/directives/args.d.ts +14 -7
  49. package/lib/directives/selection.d.ts +17 -0
  50. package/lib/dom/events.d.ts +2 -2
  51. package/lib/events.d.ts +4 -4
  52. package/lib/html.d.ts +17 -0
  53. package/lib/instance.d.ts +4 -0
  54. package/lib/loader.d.ts +28 -5
  55. package/lib/loop.d.ts +27 -17
  56. package/lib/pipes/hexify.d.ts +20 -0
  57. package/lib/portal.d.ts +58 -44
  58. package/lib/renderer/catalogue.d.ts +13 -0
  59. package/lib/renderer/constants.d.ts +19 -0
  60. package/lib/renderer/{renderer.d.ts → index.d.ts} +34 -18
  61. package/lib/renderer/state.d.ts +24 -0
  62. package/lib/renderer/utils.d.ts +12 -20
  63. package/lib/roots.d.ts +13 -0
  64. package/lib/routed-scene.d.ts +1 -1
  65. package/lib/store.d.ts +15 -0
  66. package/lib/three-types.d.ts +502 -149
  67. package/lib/types.d.ts +161 -178
  68. package/lib/utils/apply-props.d.ts +2 -2
  69. package/lib/utils/attach.d.ts +4 -4
  70. package/lib/utils/is.d.ts +13 -13
  71. package/lib/utils/make.d.ts +10 -5
  72. package/lib/utils/non-nullish.d.ts +4 -0
  73. package/lib/utils/object-events.d.ts +34 -0
  74. package/lib/utils/parameters.d.ts +20 -0
  75. package/lib/utils/resolve-ref.d.ts +2 -0
  76. package/lib/utils/signal-store.d.ts +26 -0
  77. package/lib/utils/update.d.ts +1 -1
  78. package/metadata.json +1 -1
  79. package/package.json +41 -14
  80. package/plugin/generators.json +34 -16
  81. package/plugin/package.json +3 -6
  82. package/plugin/src/generators/add-soba/compat.d.ts +2 -0
  83. package/plugin/src/generators/add-soba/compat.js +6 -0
  84. package/plugin/src/generators/add-soba/compat.js.map +1 -0
  85. package/plugin/src/generators/add-soba/generator.d.ts +3 -0
  86. package/plugin/src/generators/add-soba/generator.js +78 -0
  87. package/plugin/src/generators/add-soba/generator.js.map +1 -0
  88. package/plugin/src/generators/add-soba/schema.json +4 -0
  89. package/plugin/src/generators/gltf/compat.d.ts +2 -0
  90. package/plugin/src/generators/gltf/compat.js +6 -0
  91. package/plugin/src/generators/gltf/compat.js.map +1 -0
  92. package/plugin/src/generators/gltf/files/__fileName__.ts__tmpl__ +36 -0
  93. package/plugin/src/generators/gltf/generator.d.ts +12 -0
  94. package/plugin/src/generators/gltf/generator.js +125 -0
  95. package/plugin/src/generators/gltf/generator.js.map +1 -0
  96. package/plugin/src/generators/gltf/schema.json +58 -0
  97. package/plugin/src/generators/init/compat.d.ts +1 -1
  98. package/plugin/src/generators/init/compat.js +2 -2
  99. package/plugin/src/generators/init/compat.js.map +1 -1
  100. package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +29 -0
  101. package/plugin/src/generators/init/generator.d.ts +6 -0
  102. package/plugin/src/generators/init/generator.js +154 -0
  103. package/plugin/src/generators/init/generator.js.map +1 -0
  104. package/plugin/src/generators/init/schema.json +11 -4
  105. package/plugin/src/generators/utils.d.ts +2 -0
  106. package/plugin/src/generators/utils.js +35 -0
  107. package/plugin/src/generators/utils.js.map +1 -0
  108. package/plugin/src/generators/version.d.ts +16 -0
  109. package/plugin/src/generators/version.js +20 -0
  110. package/plugin/src/generators/version.js.map +1 -0
  111. package/plugin/src/index.d.ts +0 -1
  112. package/plugin/src/index.js +0 -5
  113. package/plugin/src/index.js.map +1 -1
  114. package/testing/README.md +3 -0
  115. package/testing/index.d.ts +2 -0
  116. package/testing/lib/test-bed.d.ts +38 -0
  117. package/testing/lib/test-canvas.d.ts +11 -0
  118. package/testing/lib/utils/mock-canvas.d.ts +5 -0
  119. package/testing/lib/utils/web-gl-rendering-context.d.ts +16 -0
  120. package/testing/package.json +3 -0
  121. package/web-types.json +1 -1
  122. package/esm2022/lib/di/before-render.mjs +0 -13
  123. package/esm2022/lib/di/catalogue.mjs +0 -7
  124. package/esm2022/lib/di/ref.mjs +0 -49
  125. package/esm2022/lib/directives/common.mjs +0 -39
  126. package/esm2022/lib/directives/parent.mjs +0 -33
  127. package/esm2022/lib/directives/repeat.mjs +0 -18
  128. package/esm2022/lib/renderer/di.mjs +0 -3
  129. package/esm2022/lib/renderer/enums.mjs +0 -2
  130. package/esm2022/lib/renderer/provider.mjs +0 -18
  131. package/esm2022/lib/renderer/renderer.mjs +0 -365
  132. package/esm2022/lib/renderer/store.mjs +0 -372
  133. package/esm2022/lib/stores/signal.store.mjs +0 -81
  134. package/esm2022/lib/stores/store.mjs +0 -423
  135. package/esm2022/lib/utils/assert-in-injection-context.mjs +0 -14
  136. package/esm2022/lib/utils/instance.mjs +0 -63
  137. package/esm2022/lib/utils/safe-detect-changes.mjs +0 -15
  138. package/esm2022/lib/utils/signal.mjs +0 -24
  139. package/esm2022/lib/utils/timing.mjs +0 -21
  140. package/lib/di/catalogue.d.ts +0 -3
  141. package/lib/di/ref.d.ts +0 -7
  142. package/lib/directives/common.d.ts +0 -11
  143. package/lib/directives/parent.d.ts +0 -11
  144. package/lib/directives/repeat.d.ts +0 -7
  145. package/lib/renderer/di.d.ts +0 -2
  146. package/lib/renderer/enums.d.ts +0 -26
  147. package/lib/renderer/provider.d.ts +0 -8
  148. package/lib/renderer/store.d.ts +0 -63
  149. package/lib/stores/signal.store.d.ts +0 -20
  150. package/lib/stores/store.d.ts +0 -13
  151. package/lib/utils/assert-in-injection-context.d.ts +0 -2
  152. package/lib/utils/instance.d.ts +0 -4
  153. package/lib/utils/safe-detect-changes.d.ts +0 -2
  154. package/lib/utils/signal.d.ts +0 -2
  155. package/lib/utils/timing.d.ts +0 -4
  156. package/plugin/src/generators/init/init.d.ts +0 -5
  157. package/plugin/src/generators/init/init.js +0 -56
  158. package/plugin/src/generators/init/init.js.map +0 -1
  159. /package/lib/{di → utils}/before-render.d.ts +0 -0
@@ -1,11 +1,15 @@
1
- import * as THREE from 'three';
2
- import { getLocalState } from './utils/instance';
1
+ import { Vector3 } from 'three';
2
+ import { getLocalState } from './instance';
3
3
  import { makeId } from './utils/make';
4
+ /**
5
+ * Release pointer captures.
6
+ * This is called by releasePointerCapture in the API, and when an object is removed.
7
+ */
4
8
  function releaseInternalPointerCapture(capturedMap, obj, captures, pointerId) {
5
9
  const captureData = captures.get(obj);
6
10
  if (captureData) {
7
11
  captures.delete(obj);
8
- // if this was the last captured object for this pointer
12
+ // If this was the last capturing object for this pointer
9
13
  if (captures.size === 0) {
10
14
  capturedMap.delete(pointerId);
11
15
  captureData.target.releasePointerCapture(pointerId);
@@ -13,85 +17,81 @@ function releaseInternalPointerCapture(capturedMap, obj, captures, pointerId) {
13
17
  }
14
18
  }
15
19
  export function removeInteractivity(store, object) {
16
- const internal = store.get('internal');
17
- // removes every trace of an object from data store
20
+ const { internal } = store.snapshot;
21
+ // Removes every trace of an object from the data store
18
22
  internal.interaction = internal.interaction.filter((o) => o !== object);
19
23
  internal.initialHits = internal.initialHits.filter((o) => o !== object);
20
24
  internal.hovered.forEach((value, key) => {
21
25
  if (value.eventObject === object || value.object === object) {
22
- // clear out intersects, they are outdated by now
26
+ // Clear out intersects, they are outdated by now
23
27
  internal.hovered.delete(key);
24
28
  }
25
29
  });
26
30
  internal.capturedMap.forEach((captures, pointerId) => {
27
31
  releaseInternalPointerCapture(internal.capturedMap, object, captures, pointerId);
28
32
  });
29
- if (store.get('previousStore')) {
30
- removeInteractivity(store.get('previousStore'), object);
31
- }
32
33
  }
33
34
  export function createEvents(store) {
34
- /** calculates delta **/
35
+ /** Calculates delta */
35
36
  function calculateDistance(event) {
36
37
  const internal = store.get('internal');
37
38
  const dx = event.offsetX - internal.initialClick[0];
38
39
  const dy = event.offsetY - internal.initialClick[1];
39
40
  return Math.round(Math.sqrt(dx * dx + dy * dy));
40
41
  }
41
- /** returns true if an instance has a valid pointer-event registered, this excludes scroll, clicks etc... **/
42
+ /** Returns true if an instance has a valid pointer-event registered, this excludes scroll, clicks etc */
42
43
  function filterPointerEvents(objects) {
43
44
  return objects.filter((obj) => ['move', 'over', 'enter', 'out', 'leave'].some((name) => {
44
45
  const eventName = `pointer${name}`;
45
- return getLocalState(obj).handlers?.[eventName];
46
+ return getLocalState(obj)?.handlers?.[eventName];
46
47
  }));
47
48
  }
48
49
  function intersect(event, filter) {
49
50
  const state = store.get();
50
51
  const duplicates = new Set();
51
52
  const intersections = [];
52
- // allow callers to eliminate event objects
53
- const eventObjects = filter ? filter(state.internal.interaction) : state.internal.interaction;
54
- // reset all raycaster cameras to undefined
55
- for (let i = 0; i < eventObjects.length; i++) {
56
- const instanceState = getLocalState(eventObjects[i]).store?.get();
57
- if (instanceState) {
58
- instanceState.raycaster.camera = undefined;
53
+ // Allow callers to eliminate event objects
54
+ const eventsObjects = filter ? filter(state.internal.interaction) : state.internal.interaction;
55
+ // Reset all raycaster cameras to undefined
56
+ for (let i = 0; i < eventsObjects.length; i++) {
57
+ const objectRootState = getLocalState(eventsObjects[i])?.store.snapshot;
58
+ if (objectRootState) {
59
+ objectRootState.raycaster.camera = undefined;
59
60
  }
60
61
  }
61
- if (!state.previousStore) {
62
- // make sure root-level pointer and ray are setup
63
- state.events.compute?.(event, store);
62
+ if (!state.previousRoot) {
63
+ // Make sure root-level pointer and ray are set up
64
+ state.events.compute?.(event, store, null);
64
65
  }
65
66
  function handleRaycast(obj) {
66
- const objLocalState = getLocalState(obj);
67
- const objStore = objLocalState.store;
68
- const objState = objStore?.get();
69
- // skip event handling when noEvents is set, or when raycaster camera is null
67
+ const objStore = getLocalState(obj)?.store;
68
+ const objState = objStore?.snapshot;
69
+ // Skip event handling when noEvents is set, or when the raycasters camera is null
70
70
  if (!objState || !objState.events.enabled || objState.raycaster.camera === null)
71
71
  return [];
72
- // when the camera is undefined, we have to call the events layers to update function
72
+ // When the camera is undefined we have to call the event layers update function
73
73
  if (objState.raycaster.camera === undefined) {
74
- objState.events.compute?.(event, objStore, objState.previousStore);
75
- // if the camera is still undefined, we have to skip this layer entirely
74
+ objState.events.compute?.(event, objStore, objState.previousRoot);
75
+ // If the camera is still undefined we have to skip this layer entirely
76
76
  if (objState.raycaster.camera === undefined)
77
77
  objState.raycaster.camera = null;
78
78
  }
79
- // intersect object by object
79
+ // Intersect object by object
80
80
  return objState.raycaster.camera ? objState.raycaster.intersectObject(obj, true) : [];
81
81
  }
82
- // collect events
83
- let hits = eventObjects
84
- // intersect objects
82
+ // Collect events
83
+ let hits = eventsObjects
84
+ // Intersect objects
85
85
  .flatMap(handleRaycast)
86
- // sort by event priority
86
+ // Sort by event priority and distance
87
87
  .sort((a, b) => {
88
- const aState = getLocalState(a.object).store.get();
89
- const bState = getLocalState(b.object).store.get();
88
+ const aState = getLocalState(a.object)?.store.snapshot;
89
+ const bState = getLocalState(b.object)?.store.snapshot;
90
90
  if (!aState || !bState)
91
91
  return a.distance - b.distance;
92
92
  return bState.events.priority - aState.events.priority || a.distance - b.distance;
93
93
  })
94
- // filter out duplicates
94
+ // Filter out duplicates
95
95
  .filter((item) => {
96
96
  const id = makeId(item);
97
97
  if (duplicates.has(id))
@@ -99,52 +99,53 @@ export function createEvents(store) {
99
99
  duplicates.add(id);
100
100
  return true;
101
101
  });
102
- // allow custom userland intersect sort order, this likely only makes sense on the root
102
+ // https://github.com/mrdoob/three.js/issues/16031
103
+ // Allow custom userland intersect sort order, this likely only makes sense on the root filter
103
104
  if (state.events.filter)
104
105
  hits = state.events.filter(hits, store);
105
- // bubble up the events, find the event source
106
+ // Bubble up the events, find the event source (eventObject)
106
107
  for (const hit of hits) {
107
108
  let eventObject = hit.object;
108
109
  // bubble event up
109
110
  while (eventObject) {
110
- if (getLocalState(eventObject).eventCount) {
111
+ if (getLocalState(eventObject)?.eventCount)
111
112
  intersections.push({ ...hit, eventObject });
112
- }
113
113
  eventObject = eventObject.parent;
114
114
  }
115
115
  }
116
- // if the interaction is captured, make all capturing targets part of the intersects
116
+ // If the interaction is captured, make all capturing targets part of the intersect.
117
117
  if ('pointerId' in event && state.internal.capturedMap.has(event.pointerId)) {
118
- for (const capturedData of state.internal.capturedMap.get(event.pointerId).values()) {
119
- if (!duplicates.has(makeId(capturedData.intersection))) {
120
- intersections.push(capturedData.intersection);
121
- }
118
+ for (const captureData of state.internal.capturedMap.get(event.pointerId).values()) {
119
+ if (!duplicates.has(makeId(captureData.intersection)))
120
+ intersections.push(captureData.intersection);
122
121
  }
123
122
  }
124
123
  return intersections;
125
124
  }
126
- /** handle intersections by forwarding them to handlers */
125
+ /** Handles intersections by forwarding them to handlers */
127
126
  function handleIntersects(intersections, event, delta, callback) {
128
- const rootState = store.get();
129
- // if anything has been found, forward it to the event listeners
127
+ const rootState = store.snapshot;
128
+ // If anything has been found, forward it to the event listeners
130
129
  if (intersections.length) {
131
130
  const localState = { stopped: false };
132
131
  for (const hit of intersections) {
133
- const state = getLocalState(hit.object).store?.get() || rootState;
134
- const { raycaster, pointer, camera, internal } = state;
135
- const unprojectedPoint = new THREE.Vector3(pointer.x, pointer.y, 0).unproject(camera);
132
+ const { raycaster, pointer, camera, internal } = getLocalState(hit.object)?.store.snapshot || rootState;
133
+ const unprojectedPoint = new Vector3(pointer.x, pointer.y, 0).unproject(camera);
136
134
  const hasPointerCapture = (id) => internal.capturedMap.get(id)?.has(hit.eventObject) ?? false;
137
135
  const setPointerCapture = (id) => {
138
136
  const captureData = { intersection: hit, target: event.target };
139
137
  if (internal.capturedMap.has(id)) {
140
- // if the pointerId was previously captured, we add the hit to the event capturedMap
138
+ // if the pointerId was previously captured, we add the hit to the
139
+ // event capturedMap.
141
140
  internal.capturedMap.get(id).set(hit.eventObject, captureData);
142
141
  }
143
142
  else {
144
- // if the pointerId was not previously captured, we create a Map containing the hitObject, and the hit. hitObject is used for faster access
143
+ // if the pointerId was not previously captured, we create a map
144
+ // containing the hitObject, and the hit. hitObject is used for
145
+ // faster access.
145
146
  internal.capturedMap.set(id, new Map([[hit.eventObject, captureData]]));
146
147
  }
147
- // call the original event now
148
+ // Call the original event now
148
149
  event.target.setPointerCapture(id);
149
150
  };
150
151
  const releasePointerCapture = (id) => {
@@ -153,15 +154,15 @@ export function createEvents(store) {
153
154
  releaseInternalPointerCapture(internal.capturedMap, hit.eventObject, captures, id);
154
155
  }
155
156
  };
156
- // add native event props
157
+ // Add native event props
157
158
  const extractEventProps = {};
158
159
  // This iterates over the event's properties including the inherited ones. Native PointerEvents have most of their props as getters which are inherited, but polyfilled PointerEvents have them all as their own properties (i.e. not inherited). We can't use Object.keys() or Object.entries() as they only return "own" properties; nor Object.getPrototypeOf(event) as that *doesn't* return "own" properties, only inherited ones.
159
160
  for (const prop in event) {
160
161
  const property = event[prop];
161
- // only copy over atomics, leave functions alone as these should be called as event.nativeEvent.fn()
162
- if (typeof property !== 'function') {
162
+ // Only copy over atomics, leave functions alone as these should be
163
+ // called as event.nativeEvent.fn()
164
+ if (typeof property !== 'function')
163
165
  extractEventProps[prop] = property;
164
- }
165
166
  }
166
167
  const raycastEvent = {
167
168
  ...hit,
@@ -172,7 +173,7 @@ export function createEvents(store) {
172
173
  delta,
173
174
  unprojectedPoint,
174
175
  ray: raycaster.ray,
175
- camera: camera,
176
+ camera,
176
177
  // Hijack stopPropagation, which just sets a flag
177
178
  stopPropagation() {
178
179
  // https://github.com/pmndrs/react-three-fiber/issues/596
@@ -200,19 +201,19 @@ export function createEvents(store) {
200
201
  currentTarget: { hasPointerCapture, setPointerCapture, releasePointerCapture },
201
202
  nativeEvent: event,
202
203
  };
203
- // call subscribers
204
+ // Call subscribers
204
205
  callback(raycastEvent);
205
- // event bubbling may be interupted by stopPropagation
206
- if (localState.stopped === true)
206
+ // Event bubbling may be interrupted by stopPropagation
207
+ if (localState.stopped)
207
208
  break;
208
209
  }
209
210
  }
210
211
  return intersections;
211
212
  }
212
213
  function cancelPointer(intersections) {
213
- const { internal } = store.get();
214
+ const internal = store.get('internal');
214
215
  for (const hoveredObj of internal.hovered.values()) {
215
- // When no objects were hit or the hovered object wasn't found underneath the cursor
216
+ // When no objects were hit or the the hovered object wasn't found underneath the cursor
216
217
  // we call onPointerOut and delete the object from the hovered-elements map
217
218
  if (!intersections.length ||
218
219
  !intersections.find((hit) => hit.object === hoveredObj.object &&
@@ -245,25 +246,33 @@ export function createEvents(store) {
245
246
  return () => cancelPointer([]);
246
247
  case 'lostpointercapture':
247
248
  return (event) => {
248
- const { internal } = store.get();
249
+ const { internal } = store.snapshot;
249
250
  if ('pointerId' in event && internal.capturedMap.has(event.pointerId)) {
250
- // If the object event interface had onLostPointerCapture, we'd call it here on every
251
- // object that's getting removed.
252
- internal.capturedMap.delete(event.pointerId);
253
- cancelPointer([]);
251
+ // If the object event interface had lostpointercapture, we'd call it here on every
252
+ // object that's getting removed. We call it on the next frame because lostpointercapture
253
+ // fires before pointerup. Otherwise pointerUp would never be called if the event didn't
254
+ // happen in the object it originated from, leaving components in a in-between state.
255
+ requestAnimationFrame(() => {
256
+ // Only release if pointer-up didn't do it already
257
+ if (internal.capturedMap.has(event.pointerId)) {
258
+ internal.capturedMap.delete(event.pointerId);
259
+ cancelPointer([]);
260
+ }
261
+ });
254
262
  }
255
263
  };
256
264
  }
257
265
  // Any other pointer goes here ...
258
266
  return function handleEvent(event) {
259
- const { onPointerMissed, internal } = store.get();
267
+ // NOTE: pointerMissed$ on NgtStore is private
268
+ const pointerMissed$ = store['pointerMissed$'];
269
+ const internal = store.get('internal');
260
270
  // prepareRay(event)
261
271
  internal.lastEvent.nativeElement = event;
262
272
  // Get fresh intersects
263
273
  const isPointerMove = name === 'pointermove';
264
274
  const isClickEvent = name === 'click' || name === 'contextmenu' || name === 'dblclick';
265
275
  const filter = isPointerMove ? filterPointerEvents : undefined;
266
- // const hits = patchIntersects(intersect(filter), event)
267
276
  const hits = intersect(event, filter);
268
277
  const delta = isClickEvent ? calculateDistance(event) : 0;
269
278
  // Save initial coordinates on pointer-down
@@ -276,8 +285,7 @@ export function createEvents(store) {
276
285
  if (isClickEvent && !hits.length) {
277
286
  if (delta <= 2) {
278
287
  pointerMissed(event, internal.interaction);
279
- if (onPointerMissed)
280
- onPointerMissed(event);
288
+ pointerMissed$.next(event);
281
289
  }
282
290
  }
283
291
  // Take care of unhover
@@ -290,12 +298,23 @@ export function createEvents(store) {
290
298
  // Check presence of handlers
291
299
  if (!instance?.eventCount)
292
300
  return;
301
+ /*
302
+ MAYBE TODO, DELETE IF NOT:
303
+ Check if the object is captured, captured events should not have intersects running in parallel
304
+ But wouldn't it be better to just replace capturedMap with a single entry?
305
+ Also, are we OK with straight up making picking up multiple objects impossible?
306
+
307
+ const pointerId = (data as ThreeEvent<PointerEvent>).pointerId
308
+ if (pointerId !== undefined) {
309
+ const capturedMeshSet = internal.capturedMap.get(pointerId)
310
+ if (capturedMeshSet) {
311
+ const captured = capturedMeshSet.get(eventObject)
312
+ if (captured && captured.localState.stopped) return
313
+ }
314
+ }*/
293
315
  if (isPointerMove) {
294
316
  // Move event ...
295
- if (handlers?.pointerover ||
296
- handlers?.pointerenter ||
297
- handlers?.pointerout ||
298
- handlers?.pointerleave) {
317
+ if (handlers?.pointerover || handlers?.pointerenter || handlers?.pointerout || handlers?.pointerleave) {
299
318
  // When enter or out is present take care of hover-state
300
319
  const id = makeId(data);
301
320
  const hoveredItem = internal.hovered.get(id);
@@ -339,4 +358,4 @@ export function createEvents(store) {
339
358
  }
340
359
  return { handlePointer };
341
360
  }
342
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvZXZlbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBVS9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXRDLFNBQVMsNkJBQTZCLENBQ2xDLFdBQXNFLEVBQ3RFLEdBQW1CLEVBQ25CLFFBQXNELEVBQ3RELFNBQWlCO0lBRWpCLE1BQU0sV0FBVyxHQUF3QyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLElBQUksV0FBVyxFQUFFO1FBQ2IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQix3REFBd0Q7UUFDeEQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNyQixXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLFdBQVcsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdkQ7S0FDSjtBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsS0FBK0IsRUFBRSxNQUFzQjtJQUN2RixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZDLG1EQUFtRDtJQUNuRCxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDeEUsUUFBUSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxF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LFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQ2xGLENBQUM7NEJBQ0YsdUJBQXVCOzRCQUN2QixPQUFPLENBQUMsSUFBbUMsQ0FBQyxDQUFDO3lCQUNoRDtxQkFDSjt5QkFBTTt3QkFDSCw2R0FBNkc7d0JBQzdHLElBQUksWUFBWSxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFOzRCQUM1RCxhQUFhLENBQ1QsS0FBSyxFQUNMLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQ2xGLENBQUM7eUJBQ0w7cUJBQ0o7aUJBQ0o7WUFDTCxDQUFDO1lBRUQsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RTaWduYWxTdG9yZSB9IGZyb20gJy4vc3RvcmVzL3NpZ25hbC5zdG9yZSc7XG5pbXBvcnQgdHlwZSB7XG4gICAgTmd0RG9tRXZlbnQsXG4gICAgTmd0RXZlbnRIYW5kbGVycyxcbiAgICBOZ3RJbnRlcnNlY3Rpb24sXG4gICAgTmd0UG9pbnRlckNhcHR1cmVUYXJnZXQsXG4gICAgTmd0U3RhdGUsXG4gICAgTmd0VGhyZWVFdmVudCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRMb2NhbFN0YXRlIH0gZnJvbSAnLi91dGlscy9pbnN0YW5jZSc7XG5pbXBvcnQgeyBtYWtlSWQgfSBmcm9tICcuL3V0aWxzL21ha2UnO1xuXG5mdW5jdGlvbiByZWxlYXNlSW50ZXJuYWxQb2ludGVyQ2FwdHVyZShcbiAgICBjYXB0dXJlZE1hcDogTWFwPG51bWJlciwgTWFwPFRIUkVFLk9iamVjdDNELCBOZ3RQb2ludGVyQ2FwdHVyZVRhcmdldD4+LFxuICAgIG9iajogVEhSRUUuT2JqZWN0M0QsXG4gICAgY2FwdHVyZXM6IE1hcDxUSFJFRS5PYmplY3QzRCwgTmd0UG9pbnRlckNhcHR1cmVUYXJnZXQ+LFxuICAgIHBvaW50ZXJJZDogbnVtYmVyXG4pOiB2b2lkIHtcbiAgICBjb25zdCBjYXB0dXJlRGF0YTogTmd0UG9pbnRlckNhcHR1cmVUYXJnZXQgfCB1bmRlZmluZWQgPSBjYXB0dXJlcy5nZXQob2JqKTtcbiAgICBpZiAoY2FwdHVyZURhdGEpIHtcbiAgICAgICAgY2FwdHVyZXMuZGVsZXRlKG9iaik7XG4gICAgICAgIC8vIGlmIHRoaXMgd2FzIHRoZSBsYXN0IGNhcHR1cmVkIG9iamVjdCBmb3IgdGhpcyBwb2ludGVyXG4gICAgICAgIGlmIChjYXB0dXJlcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICBjYXB0dXJlZE1hcC5kZWxldGUocG9pbnRlcklkKTtcbiAgICAgICAgICAgIGNhcHR1cmVEYXRhLnRhcmdldC5yZWxlYXNlUG9pbnRlckNhcHR1cmUocG9pbnRlcklkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUludGVyYWN0aXZpdHkoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiwgb2JqZWN0OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xuICAgIGNvbnN0IGludGVybmFsID0gc3RvcmUuZ2V0KCdpbnRlcm5hbCcpO1xuICAgIC8vIHJlbW92ZXMgZXZlcnkgdHJhY2Ugb2YgYW4gb2JqZWN0IGZyb20gZGF0YSBzdG9yZVxuICAgIGludGVybmFsLmludGVyYWN0aW9uID0gaW50ZXJuYWwuaW50ZXJhY3Rpb24uZmlsdGVyKChvKSA9PiBvICE9PSBvYmplY3QpO1xuICAgIGludGVybmFsLmluaXRpYWxIaXRzID0gaW50ZXJuYWwuaW5pdGlhbEhpdHMuZmlsdGVyKChvKSA9PiBvICE9PSBvYmplY3QpO1xuICAgIGludGVybmFsLmhvdmVyZWQuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUuZXZlbnRPYmplY3QgPT09IG9iamVjdCB8fCB2YWx1ZS5vYmplY3QgPT09IG9iamVjdCkge1xuICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGludGVyc2VjdHMsIHRoZXkgYXJlIG91dGRhdGVkIGJ5IG5vd1xuICAgICAgICAgICAgaW50ZXJuYWwuaG92ZXJlZC5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGludGVybmFsLmNhcHR1cmVkTWFwLmZvckVhY2goKGNhcHR1cmVzLCBwb2ludGVySWQpID0+IHtcbiAgICAgICAgcmVsZWFzZUludGVybmFsUG9pbnRlckNhcHR1cmUoaW50ZXJuYWwuY2FwdHVyZWRNYXAsIG9iamVjdCwgY2FwdHVyZXMsIHBvaW50ZXJJZCk7XG4gICAgfSk7XG5cbiAgICBpZiAoc3RvcmUuZ2V0KCdwcmV2aW91c1N0b3JlJykpIHtcbiAgICAgICAgcmVtb3ZlSW50ZXJhY3Rpdml0eShzdG9yZS5nZXQoJ3ByZXZpb3VzU3RvcmUnKSEsIG9iamVjdCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRzKHN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4pIHtcbiAgICAvKiogY2FsY3VsYXRlcyBkZWx0YSAqKi9cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZShldmVudDogTmd0RG9tRXZlbnQpIHtcbiAgICAgICAgY29uc3QgaW50ZXJuYWwgPSBzdG9yZS5nZXQoJ2ludGVybmFsJyk7XG4gICAgICAgIGNvbnN0IGR4ID0gZXZlbnQub2Zmc2V0WCAtIGludGVybmFsLmluaXRpYWxDbGlja1swXTtcbiAgICAgICAgY29uc3QgZHkgPSBldmVudC5vZmZzZXRZIC0gaW50ZXJuYWwuaW5pdGlhbENsaWNrWzFdO1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpKTtcbiAgICB9XG5cbiAgICAvKiogcmV0dXJucyB0cnVlIGlmIGFuIGluc3RhbmNlIGhhcyBhIHZhbGlkIHBvaW50ZXItZXZlbnQgcmVnaXN0ZXJlZCwgdGhpcyBleGNsdWRlcyBzY3JvbGwsIGNsaWNrcyBldGMuLi4gKiovXG4gICAgZnVuY3Rpb24gZmlsdGVyUG9pbnRlckV2ZW50cyhvYmplY3RzOiBUSFJFRS5PYmplY3QzRFtdKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RzLmZpbHRlcigob2JqKSA9PlxuICAgICAgICAgICAgWydtb3ZlJywgJ292ZXInLCAnZW50ZXInLCAnb3V0JywgJ2xlYXZlJ10uc29tZSgobmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGBwb2ludGVyJHtuYW1lfWAgYXMga2V5b2YgTmd0RXZlbnRIYW5kbGVycztcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TG9jYWxTdGF0ZShvYmopLmhhbmRsZXJzPy5bZXZlbnROYW1lXTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW50ZXJzZWN0KGV2ZW50OiBOZ3REb21FdmVudCwgZmlsdGVyPzogKG9iamVjdHM6IFRIUkVFLk9iamVjdDNEW10pID0+IFRIUkVFLk9iamVjdDNEW10pIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBzdG9yZS5nZXQoKTtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBjb25zdCBpbnRlcnNlY3Rpb25zOiBOZ3RJbnRlcnNlY3Rpb25bXSA9IFtdO1xuICAgICAgICAvLyBhbGxvdyBjYWxsZXJzIHRvIGVsaW1pbmF0ZSBldmVudCBvYmplY3RzXG4gICAgICAgIGNvbnN0IGV2ZW50T2JqZWN0cyA9IGZpbHRlciA/IGZpbHRlcihzdGF0ZS5pbnRlcm5hbC5pbnRlcmFjdGlvbikgOiBzdGF0ZS5pbnRlcm5hbC5pbnRlcmFjdGlvbjtcbiAgICAgICAgLy8gcmVzZXQgYWxsIHJheWNhc3RlciBjYW1lcmFzIHRvIHVuZGVmaW5lZFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50T2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VTdGF0ZSA9IGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3RzW2ldKS5zdG9yZT8uZ2V0KCk7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9IHVuZGVmaW5lZCE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0YXRlLnByZXZpb3VzU3RvcmUpIHtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSByb290LWxldmVsIHBvaW50ZXIgYW5kIHJheSBhcmUgc2V0dXBcbiAgICAgICAgICAgIHN0YXRlLmV2ZW50cy5jb21wdXRlPy4oZXZlbnQsIHN0b3JlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJheWNhc3Qob2JqOiBUSFJFRS5PYmplY3QzRDxUSFJFRS5FdmVudD4pIHtcbiAgICAgICAgICAgIGNvbnN0IG9iakxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG9iaik7XG4gICAgICAgICAgICBjb25zdCBvYmpTdG9yZSA9IG9iakxvY2FsU3RhdGUuc3RvcmU7XG4gICAgICAgICAgICBjb25zdCBvYmpTdGF0ZSA9IG9ialN0b3JlPy5nZXQoKTtcbiAgICAgICAgICAgIC8vIHNraXAgZXZlbnQgaGFuZGxpbmcgd2hlbiBub0V2ZW50cyBpcyBzZXQsIG9yIHdoZW4gcmF5Y2FzdGVyIGNhbWVyYSBpcyBudWxsXG4gICAgICAgICAgICBpZiAoIW9ialN0YXRlIHx8ICFvYmpTdGF0ZS5ldmVudHMuZW5hYmxlZCB8fCBvYmpTdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID09PSBudWxsKSByZXR1cm4gW107XG4gICAgICAgICAgICAvLyB3aGVuIHRoZSBjYW1lcmEgaXMgdW5kZWZpbmVkLCB3ZSBoYXZlIHRvIGNhbGwgdGhlIGV2ZW50cyBsYXllcnMgdG8gdXBkYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICBpZiAob2JqU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgb2JqU3RhdGUuZXZlbnRzLmNvbXB1dGU/LihldmVudCwgb2JqU3RvcmUsIG9ialN0YXRlLnByZXZpb3VzU3RvcmUpO1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjYW1lcmEgaXMgc3RpbGwgdW5kZWZpbmVkLCB3ZSBoYXZlIHRvIHNraXAgdGhpcyBsYXllciBlbnRpcmVseVxuICAgICAgICAgICAgICAgIGlmIChvYmpTdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID09PSB1bmRlZmluZWQpIG9ialN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPSBudWxsITtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW50ZXJzZWN0IG9iamVjdCBieSBvYmplY3RcbiAgICAgICAgICAgIHJldHVybiBvYmpTdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID8gb2JqU3RhdGUucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdChvYmosIHRydWUpIDogW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb2xsZWN0IGV2ZW50c1xuICAgICAgICBsZXQgaGl0czogVEhSRUUuSW50ZXJzZWN0aW9uPFRIUkVFLk9iamVjdDNEPFRIUkVFLkV2ZW50Pj5bXSA9IGV2ZW50T2JqZWN0c1xuICAgICAgICAgICAgLy8gaW50ZXJzZWN0IG9iamVjdHNcbiAgICAgICAgICAgIC5mbGF0TWFwKGhhbmRsZVJheWNhc3QpXG4gICAgICAgICAgICAvLyBzb3J0IGJ5IGV2ZW50IHByaW9yaXR5XG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFTdGF0ZSA9IGdldExvY2FsU3RhdGUoYS5vYmplY3QpLnN0b3JlLmdldCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJTdGF0ZSA9IGdldExvY2FsU3RhdGUoYi5vYmplY3QpLnN0b3JlLmdldCgpO1xuICAgICAgICAgICAgICAgIGlmICghYVN0YXRlIHx8ICFiU3RhdGUpIHJldHVybiBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYlN0YXRlLmV2ZW50cy5wcmlvcml0eSAtIGFTdGF0ZS5ldmVudHMucHJpb3JpdHkgfHwgYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBkdXBsaWNhdGVzXG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBtYWtlSWQoaXRlbSBhcyBOZ3RJbnRlcnNlY3Rpb24pO1xuICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVzLmhhcyhpZCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGVzLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBhbGxvdyBjdXN0b20gdXNlcmxhbmQgaW50ZXJzZWN0IHNvcnQgb3JkZXIsIHRoaXMgbGlrZWx5IG9ubHkgbWFrZXMgc2Vuc2Ugb24gdGhlIHJvb3RcbiAgICAgICAgaWYgKHN0YXRlLmV2ZW50cy5maWx0ZXIpIGhpdHMgPSBzdGF0ZS5ldmVudHMuZmlsdGVyKGhpdHMsIHN0b3JlKTtcblxuICAgICAgICAvLyBidWJibGUgdXAgdGhlIGV2ZW50cywgZmluZCB0aGUgZXZlbnQgc291cmNlXG4gICAgICAgIGZvciAoY29uc3QgaGl0IG9mIGhpdHMpIHtcbiAgICAgICAgICAgIGxldCBldmVudE9iamVjdDogVEhSRUUuT2JqZWN0M0QgfCBudWxsID0gaGl0Lm9iamVjdDtcbiAgICAgICAgICAgIC8vIGJ1YmJsZSBldmVudCB1cFxuICAgICAgICAgICAgd2hpbGUgKGV2ZW50T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3QpLmV2ZW50Q291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKHsgLi4uaGl0LCBldmVudE9iamVjdCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXZlbnRPYmplY3QgPSBldmVudE9iamVjdC5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGUgaW50ZXJhY3Rpb24gaXMgY2FwdHVyZWQsIG1ha2UgYWxsIGNhcHR1cmluZyB0YXJnZXRzIHBhcnQgb2YgdGhlIGludGVyc2VjdHNcbiAgICAgICAgaWYgKCdwb2ludGVySWQnIGluIGV2ZW50ICYmIHN0YXRlLmludGVybmFsLmNhcHR1cmVkTWFwLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhcHR1cmVkRGF0YSBvZiBzdGF0ZS5pbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoZXZlbnQucG9pbnRlcklkKSEudmFsdWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZXMuaGFzKG1ha2VJZChjYXB0dXJlZERhdGEuaW50ZXJzZWN0aW9uKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9ucy5wdXNoKGNhcHR1cmVkRGF0YS5pbnRlcnNlY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9ucztcbiAgICB9XG5cbiAgICAvKiogaGFuZGxlIGludGVyc2VjdGlvbnMgYnkgZm9yd2FyZGluZyB0aGVtIHRvIGhhbmRsZXJzICovXG4gICAgZnVuY3Rpb24gaGFuZGxlSW50ZXJzZWN0cyhcbiAgICAgICAgaW50ZXJzZWN0aW9uczogTmd0SW50ZXJzZWN0aW9uW10sXG4gICAgICAgIGV2ZW50OiBOZ3REb21FdmVudCxcbiAgICAgICAgZGVsdGE6IG51bWJlcixcbiAgICAgICAgY2FsbGJhY2s6IChldmVudDogTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4pID0+IHZvaWRcbiAgICApIHtcbiAgICAgICAgY29uc3Qgcm9vdFN0YXRlID0gc3RvcmUuZ2V0KCk7XG4gICAgICAgIC8vIGlmIGFueXRoaW5nIGhhcyBiZWVuIGZvdW5kLCBmb3J3YXJkIGl0IHRvIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFN0YXRlID0geyBzdG9wcGVkOiBmYWxzZSB9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhpdCBvZiBpbnRlcnNlY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXRMb2NhbFN0YXRlKGhpdC5vYmplY3QpLnN0b3JlPy5nZXQoKSB8fCByb290U3RhdGU7XG4gICAgICAgICAgICAgICAgY29uc3QgeyByYXljYXN0ZXIsIHBvaW50ZXIsIGNhbWVyYSwgaW50ZXJuYWwgfSA9IHN0YXRlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVucHJvamVjdGVkUG9pbnQgPSBuZXcgVEhSRUUuVmVjdG9yMyhwb2ludGVyLngsIHBvaW50ZXIueSwgMCkudW5wcm9qZWN0KGNhbWVyYSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFzUG9pbnRlckNhcHR1cmUgPSAoaWQ6IG51bWJlcikgPT4gaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGlkKT8uaGFzKGhpdC5ldmVudE9iamVjdCkgPz8gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzZXRQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcHR1cmVEYXRhID0geyBpbnRlcnNlY3Rpb246IGhpdCwgdGFyZ2V0OiBldmVudC50YXJnZXQgYXMgRWxlbWVudCB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBvaW50ZXJJZCB3YXMgcHJldmlvdXNseSBjYXB0dXJlZCwgd2UgYWRkIHRoZSBoaXQgdG8gdGhlIGV2ZW50IGNhcHR1cmVkTWFwXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoaWQpIS5zZXQoaGl0LmV2ZW50T2JqZWN0LCBjYXB0dXJlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcG9pbnRlcklkIHdhcyBub3QgcHJldmlvdXNseSBjYXB0dXJlZCwgd2UgY3JlYXRlIGEgTWFwIGNvbnRhaW5pbmcgdGhlIGhpdE9iamVjdCwgYW5kIHRoZSBoaXQuIGhpdE9iamVjdCBpcyB1c2VkIGZvciBmYXN0ZXIgYWNjZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5jYXB0dXJlZE1hcC5zZXQoaWQsIG5ldyBNYXAoW1toaXQuZXZlbnRPYmplY3QsIGNhcHR1cmVEYXRhXV0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBjYWxsIHRoZSBvcmlnaW5hbCBldmVudCBub3dcbiAgICAgICAgICAgICAgICAgICAgKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS5zZXRQb2ludGVyQ2FwdHVyZShpZCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGVhc2VQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcHR1cmVzID0gaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhcHR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlSW50ZXJuYWxQb2ludGVyQ2FwdHVyZShpbnRlcm5hbC5jYXB0dXJlZE1hcCwgaGl0LmV2ZW50T2JqZWN0LCBjYXB0dXJlcywgaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8vIGFkZCBuYXRpdmUgZXZlbnQgcHJvcHNcbiAgICAgICAgICAgICAgICBjb25zdCBleHRyYWN0RXZlbnRQcm9wczogYW55ID0ge307XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpdGVyYXRlcyBvdmVyIHRoZSBldmVudCdzIHByb3BlcnRpZXMgaW5jbHVkaW5nIHRoZSBpbmhlcml0ZWQgb25lcy4gTmF0aXZlIFBvaW50ZXJFdmVudHMgaGF2ZSBtb3N0IG9mIHRoZWlyIHByb3BzIGFzIGdldHRlcnMgd2hpY2ggYXJlIGluaGVyaXRlZCwgYnV0IHBvbHlmaWxsZWQgUG9pbnRlckV2ZW50cyBoYXZlIHRoZW0gYWxsIGFzIHRoZWlyIG93biBwcm9wZXJ0aWVzIChpLmUuIG5vdCBpbmhlcml0ZWQpLiBXZSBjYW4ndCB1c2UgT2JqZWN0LmtleXMoKSBvciBPYmplY3QuZW50cmllcygpIGFzIHRoZXkgb25seSByZXR1cm4gXCJvd25cIiBwcm9wZXJ0aWVzOyBub3IgT2JqZWN0LmdldFByb3RvdHlwZU9mKGV2ZW50KSBhcyB0aGF0ICpkb2Vzbid0KiByZXR1cm4gXCJvd25cIiBwcm9wZXJ0aWVzLCBvbmx5IGluaGVyaXRlZCBvbmVzLlxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IGV2ZW50W3Byb3AgYXMga2V5b2YgTmd0RG9tRXZlbnRdO1xuICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGNvcHkgb3ZlciBhdG9taWNzLCBsZWF2ZSBmdW5jdGlvbnMgYWxvbmUgYXMgdGhlc2Ugc2hvdWxkIGJlIGNhbGxlZCBhcyBldmVudC5uYXRpdmVFdmVudC5mbigpXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RFdmVudFByb3BzW3Byb3BdID0gcHJvcGVydHk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByYXljYXN0RXZlbnQ6IE5ndFRocmVlRXZlbnQ8Tmd0RG9tRXZlbnQ+ID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5oaXQsXG4gICAgICAgICAgICAgICAgICAgIC4uLmV4dHJhY3RFdmVudFByb3BzLFxuICAgICAgICAgICAgICAgICAgICBwb2ludGVyLFxuICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb25zLFxuICAgICAgICAgICAgICAgICAgICBzdG9wcGVkOiBsb2NhbFN0YXRlLnN0b3BwZWQsXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhLFxuICAgICAgICAgICAgICAgICAgICB1bnByb2plY3RlZFBvaW50LFxuICAgICAgICAgICAgICAgICAgICByYXk6IHJheWNhc3Rlci5yYXksXG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYTogY2FtZXJhLFxuICAgICAgICAgICAgICAgICAgICAvLyBIaWphY2sgc3RvcFByb3BhZ2F0aW9uLCB3aGljaCBqdXN0IHNldHMgYSBmbGFnXG4gICAgICAgICAgICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wbW5kcnMvcmVhY3QtdGhyZWUtZmliZXIvaXNzdWVzLzU5NlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnRzIGFyZSBub3QgYWxsb3dlZCB0byBzdG9wIHByb3BhZ2F0aW9uIGlmIHRoZSBwb2ludGVyIGhhcyBiZWVuIGNhcHR1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXB0dXJlc0ZvclBvaW50ZXIgPSAncG9pbnRlcklkJyBpbiBldmVudCAmJiBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoZXZlbnQucG9pbnRlcklkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBhdXRob3JpemUgc3RvcFByb3BhZ2F0aW9uLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4uaWYgdGhpcyBwb2ludGVyIGhhc24ndCBiZWVuIGNhcHR1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNhcHR1cmVzRm9yUG9pbnRlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLiBvciBpZiB0aGUgaGl0IG9iamVjdCBpcyBjYXB0dXJpbmcgdGhlIHBvaW50ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlc0ZvclBvaW50ZXIuaGFzKGhpdC5ldmVudE9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJheWNhc3RFdmVudC5zdG9wcGVkID0gbG9jYWxTdGF0ZS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wYWdhdGlvbiBpcyBzdG9wcGVkLCByZW1vdmUgYWxsIG90aGVyIGhvdmVyIHJlY29yZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbiBldmVudCBoYW5kbGVyIGlzIG9ubHkgYWxsb3dlZCB0byBmbHVzaCBvdGhlciBoYW5kbGVycyBpZiBpdCBpcyBob3ZlcmVkIGl0c2VsZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuaG92ZXJlZC5zaXplICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmZyb20oaW50ZXJuYWwuaG92ZXJlZC52YWx1ZXMoKSkuZmluZCgoaSkgPT4gaS5ldmVudE9iamVjdCA9PT0gaGl0LmV2ZW50T2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPYmplY3RzIGNhbm5vdCBmbHVzaCBvdXQgaGlnaGVyIHVwIG9iamVjdHMgdGhhdCBoYXZlIGFscmVhZHkgY2F1Z2h0IHRoZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdoZXIgPSBpbnRlcnNlY3Rpb25zLnNsaWNlKDAsIGludGVyc2VjdGlvbnMuaW5kZXhPZihoaXQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsUG9pbnRlcihbLi4uaGlnaGVyLCBoaXRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIHNob3VsZCBiZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gdGFyZ2V0IGFuZCBjdXJyZW50VGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogeyBoYXNQb2ludGVyQ2FwdHVyZSwgc2V0UG9pbnRlckNhcHR1cmUsIHJlbGVhc2VQb2ludGVyQ2FwdHVyZSB9LFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0OiB7IGhhc1BvaW50ZXJDYXB0dXJlLCBzZXRQb2ludGVyQ2FwdHVyZSwgcmVsZWFzZVBvaW50ZXJDYXB0dXJlIH0sXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50OiBldmVudCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLy8gY2FsbCBzdWJzY3JpYmVyc1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJheWNhc3RFdmVudCk7XG4gICAgICAgICAgICAgICAgLy8gZXZlbnQgYnViYmxpbmcgbWF5IGJlIGludGVydXB0ZWQgYnkgc3RvcFByb3BhZ2F0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RhdGUuc3RvcHBlZCA9PT0gdHJ1ZSkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuY2VsUG9pbnRlcihpbnRlcnNlY3Rpb25zOiBOZ3RJbnRlcnNlY3Rpb25bXSkge1xuICAgICAgICBjb25zdCB7IGludGVybmFsIH0gPSBzdG9yZS5nZXQoKTtcbiAgICAgICAgZm9yIChjb25zdCBob3ZlcmVkT2JqIG9mIGludGVybmFsLmhvdmVyZWQudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gbm8gb2JqZWN0cyB3ZXJlIGhpdCBvciB0aGUgaG92ZXJlZCBvYmplY3Qgd2Fzbid0IGZvdW5kIHVuZGVybmVhdGggdGhlIGN1cnNvclxuICAgICAgICAgICAgLy8gd2UgY2FsbCBvblBvaW50ZXJPdXQgYW5kIGRlbGV0ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGhvdmVyZWQtZWxlbWVudHMgbWFwXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWludGVyc2VjdGlvbnMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgIWludGVyc2VjdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKGhpdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5vYmplY3QgPT09IGhvdmVyZWRPYmoub2JqZWN0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBoaXQuaW5kZXggPT09IGhvdmVyZWRPYmouaW5kZXggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5pbnN0YW5jZUlkID09PSBob3ZlcmVkT2JqLmluc3RhbmNlSWRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudE9iamVjdCA9IGhvdmVyZWRPYmouZXZlbnRPYmplY3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBnZXRMb2NhbFN0YXRlKGV2ZW50T2JqZWN0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IGluc3RhbmNlPy5oYW5kbGVycztcbiAgICAgICAgICAgICAgICBpbnRlcm5hbC5ob3ZlcmVkLmRlbGV0ZShtYWtlSWQoaG92ZXJlZE9iaikpO1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZT8uZXZlbnRDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBvdXQgaW50ZXJzZWN0cywgdGhleSBhcmUgb3V0ZGF0ZWQgYnkgbm93XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IC4uLmhvdmVyZWRPYmosIGludGVyc2VjdGlvbnMgfTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnM/LnBvaW50ZXJvdXQ/LihkYXRhIGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pik7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzPy5wb2ludGVybGVhdmU/LihkYXRhIGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9pbnRlck1pc3NlZChldmVudDogTW91c2VFdmVudCwgb2JqZWN0czogVEhSRUUuT2JqZWN0M0RbXSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0TG9jYWxTdGF0ZShvYmplY3RzW2ldKTtcbiAgICAgICAgICAgIGluc3RhbmNlPy5oYW5kbGVycy5wb2ludGVybWlzc2VkPy4oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlUG9pbnRlcihuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gRGVhbCB3aXRoIGNhbmNlbGF0aW9uXG4gICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgY2FzZSAncG9pbnRlcmxlYXZlJzpcbiAgICAgICAgICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiBjYW5jZWxQb2ludGVyKFtdKTtcbiAgICAgICAgICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChldmVudDogTmd0RG9tRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpbnRlcm5hbCB9ID0gc3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgncG9pbnRlcklkJyBpbiBldmVudCAmJiBpbnRlcm5hbC5jYXB0dXJlZE1hcC5oYXMoZXZlbnQucG9pbnRlcklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG9iamVjdCBldmVudCBpbnRlcmZhY2UgaGFkIG9uTG9zdFBvaW50ZXJDYXB0dXJlLCB3ZSdkIGNhbGwgaXQgaGVyZSBvbiBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0IHRoYXQncyBnZXR0aW5nIHJlbW92ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5jYXB0dXJlZE1hcC5kZWxldGUoZXZlbnQucG9pbnRlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFBvaW50ZXIoW10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFueSBvdGhlciBwb2ludGVyIGdvZXMgaGVyZSAuLi5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50OiBOZ3REb21FdmVudCkge1xuICAgICAgICAgICAgY29uc3QgeyBvblBvaW50ZXJNaXNzZWQsIGludGVybmFsIH0gPSBzdG9yZS5nZXQoKTtcblxuICAgICAgICAgICAgLy8gcHJlcGFyZVJheShldmVudClcbiAgICAgICAgICAgIGludGVybmFsLmxhc3RFdmVudC5uYXRpdmVFbGVtZW50ID0gZXZlbnQ7XG5cbiAgICAgICAgICAgIC8vIEdldCBmcmVzaCBpbnRlcnNlY3RzXG4gICAgICAgICAgICBjb25zdCBpc1BvaW50ZXJNb3ZlID0gbmFtZSA9PT0gJ3BvaW50ZXJtb3ZlJztcbiAgICAgICAgICAgIGNvbnN0IGlzQ2xpY2tFdmVudCA9IG5hbWUgPT09ICdjbGljaycgfHwgbmFtZSA9PT0gJ2NvbnRleHRtZW51JyB8fCBuYW1lID09PSAnZGJsY2xpY2snO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gaXNQb2ludGVyTW92ZSA/IGZpbHRlclBvaW50ZXJFdmVudHMgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBjb25zdCBoaXRzID0gcGF0Y2hJbnRlcnNlY3RzKGludGVyc2VjdChmaWx0ZXIpLCBldmVudClcbiAgICAgICAgICAgIGNvbnN0IGhpdHMgPSBpbnRlcnNlY3QoZXZlbnQsIGZpbHRlcik7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGlzQ2xpY2tFdmVudCA/IGNhbGN1bGF0ZURpc3RhbmNlKGV2ZW50KSA6IDA7XG5cbiAgICAgICAgICAgIC8vIFNhdmUgaW5pdGlhbCBjb29yZGluYXRlcyBvbiBwb2ludGVyLWRvd25cbiAgICAgICAgICAgIGlmIChuYW1lID09PSAncG9pbnRlcmRvd24nKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWwuaW5pdGlhbENsaWNrID0gW2V2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFldO1xuICAgICAgICAgICAgICAgIGludGVybmFsLmluaXRpYWxIaXRzID0gaGl0cy5tYXAoKGhpdCkgPT4gaGl0LmV2ZW50T2JqZWN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgYSBjbGljayB5aWVsZHMgbm8gcmVzdWx0cywgcGFzcyBpdCBiYWNrIHRvIHRoZSB1c2VyIGFzIGEgbWlzc1xuICAgICAgICAgICAgLy8gTWlzc2VkIGV2ZW50cyBoYXZlIHRvIGNvbWUgZmlyc3QgaW4gb3JkZXIgdG8gZXN0YWJsaXNoIHVzZXItbGFuZCBzaWRlLWVmZmVjdCBjbGVhbiB1cFxuICAgICAgICAgICAgaWYgKGlzQ2xpY2tFdmVudCAmJiAhaGl0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPD0gMikge1xuICAgICAgICAgICAgICAgICAgICBwb2ludGVyTWlzc2VkKGV2ZW50LCBpbnRlcm5hbC5pbnRlcmFjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvblBvaW50ZXJNaXNzZWQpIG9uUG9pbnRlck1pc3NlZChldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGFrZSBjYXJlIG9mIHVuaG92ZXJcbiAgICAgICAgICAgIGlmIChpc1BvaW50ZXJNb3ZlKSBjYW5jZWxQb2ludGVyKGhpdHMpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBvbkludGVyc2VjdChkYXRhOiBOZ3RUaHJlZUV2ZW50PE5ndERvbUV2ZW50Pikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50T2JqZWN0ID0gZGF0YS5ldmVudE9iamVjdDtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3QpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gaW5zdGFuY2U/LmhhbmRsZXJzO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIHByZXNlbmNlIG9mIGhhbmRsZXJzXG4gICAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZT8uZXZlbnRDb3VudCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlck1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBldmVudCAuLi5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnM/LnBvaW50ZXJvdmVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcmVudGVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz8ucG9pbnRlcm91dCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnM/LnBvaW50ZXJsZWF2ZVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gZW50ZXIgb3Igb3V0IGlzIHByZXNlbnQgdGFrZSBjYXJlIG9mIGhvdmVyLXN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IG1ha2VJZChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvdmVyZWRJdGVtID0gaW50ZXJuYWwuaG92ZXJlZC5nZXQoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFob3ZlcmVkSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBvYmplY3Qgd2Fzbid0IHByZXZpb3VzbHkgaG92ZXJlZCwgYm9vayBpdCBhbmQgY2FsbCBpdHMgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLmhvdmVyZWQuc2V0KGlkLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5wb2ludGVyb3Zlcj8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5wb2ludGVyZW50ZXI/LihkYXRhIGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhvdmVyZWRJdGVtLnN0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgb2JqZWN0IHdhcyBwcmV2aW91c2x5IGhvdmVyZWQgYW5kIHN0b3BwZWQsIHdlIHNob3VsZG4ndCBhbGxvdyBvdGhlciBpdGVtcyB0byBwcm9jZWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIG1vdXNlIG1vdmVcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnM/LnBvaW50ZXJtb3ZlPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbCBvdGhlciBldmVudHMgLi4uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVycz8uW25hbWUgYXMga2V5b2YgTmd0RXZlbnRIYW5kbGVyc10gYXMgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50PlxuICAgICAgICAgICAgICAgICAgICApID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3J3YXJkIGFsbCBldmVudHMgYmFjayB0byB0aGVpciByZXNwZWN0aXZlIGhhbmRsZXJzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBjbGljayBldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBtdXN0IHVzZSB0aGUgaW5pdGlhbCB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNDbGlja0V2ZW50IHx8IGludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKGV2ZW50T2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pc3NlZCBldmVudHMgaGF2ZSB0byBjb21lIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlck1pc3NlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLmludGVyYWN0aW9uLmZpbHRlcigob2JqZWN0KSA9PiAhaW50ZXJuYWwuaW5pdGlhbEhpdHMuaW5jbHVkZXMob2JqZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBjYWxsIHRoZSBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcihkYXRhIGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIG9uUG9pbnRlck1pc3NlZCBvbiBhbGwgZWxlbWVudHMgdGhhdCBoYXZlIHBvaW50ZXIgb3Zlci9vdXQgaGFuZGxlcnMsIGJ1dCBub3QgY2xpY2sgYW5kIHdlcmVuJ3QgaGl0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDbGlja0V2ZW50ICYmIGludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKGV2ZW50T2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJNaXNzZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbC5pbnRlcmFjdGlvbi5maWx0ZXIoKG9iamVjdCkgPT4gIWludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKG9iamVjdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaGFuZGxlSW50ZXJzZWN0cyhoaXRzLCBldmVudCwgZGVsdGEsIG9uSW50ZXJzZWN0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBoYW5kbGVQb2ludGVyIH07XG59XG4iXX0=
361
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZXZlbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBMEIsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFVM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd0Qzs7O0dBR0c7QUFDSCxTQUFTLDZCQUE2QixDQUNyQyxXQUFnRSxFQUNoRSxHQUFhLEVBQ2IsUUFBZ0QsRUFDaEQsU0FBaUI7SUFFakIsTUFBTSxXQUFXLEdBQXdDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0UsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNqQixRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLHlEQUF5RDtRQUN6RCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QixXQUFXLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDRixDQUFDO0FBQ0YsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUErQixFQUFFLE1BQWdCO0lBQ3BGLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQ3BDLHVEQUF1RDtJQUN2RCxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDeEUsUUFBUSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0s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QUFDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbnRlcnNlY3Rpb24sIE9iamVjdDNELCBWZWN0b3IzIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSB9IGZyb20gJy4vaW5zdGFuY2UnO1xuaW1wb3J0IHtcblx0Tmd0QW55UmVjb3JkLFxuXHROZ3REb21FdmVudCxcblx0Tmd0RXZlbnRIYW5kbGVycyxcblx0Tmd0SW50ZXJzZWN0aW9uLFxuXHROZ3RQb2ludGVyQ2FwdHVyZVRhcmdldCxcblx0Tmd0U3RhdGUsXG5cdE5ndFRocmVlRXZlbnQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgbWFrZUlkIH0gZnJvbSAnLi91dGlscy9tYWtlJztcbmltcG9ydCB7IE5ndFNpZ25hbFN0b3JlIH0gZnJvbSAnLi91dGlscy9zaWduYWwtc3RvcmUnO1xuXG4vKipcbiAqIFJlbGVhc2UgcG9pbnRlciBjYXB0dXJlcy5cbiAqIFRoaXMgaXMgY2FsbGVkIGJ5IHJlbGVhc2VQb2ludGVyQ2FwdHVyZSBpbiB0aGUgQVBJLCBhbmQgd2hlbiBhbiBvYmplY3QgaXMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gcmVsZWFzZUludGVybmFsUG9pbnRlckNhcHR1cmUoXG5cdGNhcHR1cmVkTWFwOiBNYXA8bnVtYmVyLCBNYXA8T2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0Pj4sXG5cdG9iajogT2JqZWN0M0QsXG5cdGNhcHR1cmVzOiBNYXA8T2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0Pixcblx0cG9pbnRlcklkOiBudW1iZXIsXG4pOiB2b2lkIHtcblx0Y29uc3QgY2FwdHVyZURhdGE6IE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0IHwgdW5kZWZpbmVkID0gY2FwdHVyZXMuZ2V0KG9iaik7XG5cdGlmIChjYXB0dXJlRGF0YSkge1xuXHRcdGNhcHR1cmVzLmRlbGV0ZShvYmopO1xuXHRcdC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IGNhcHR1cmluZyBvYmplY3QgZm9yIHRoaXMgcG9pbnRlclxuXHRcdGlmIChjYXB0dXJlcy5zaXplID09PSAwKSB7XG5cdFx0XHRjYXB0dXJlZE1hcC5kZWxldGUocG9pbnRlcklkKTtcblx0XHRcdGNhcHR1cmVEYXRhLnRhcmdldC5yZWxlYXNlUG9pbnRlckNhcHR1cmUocG9pbnRlcklkKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUludGVyYWN0aXZpdHkoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiwgb2JqZWN0OiBPYmplY3QzRCkge1xuXHRjb25zdCB7IGludGVybmFsIH0gPSBzdG9yZS5zbmFwc2hvdDtcblx0Ly8gUmVtb3ZlcyBldmVyeSB0cmFjZSBvZiBhbiBvYmplY3QgZnJvbSB0aGUgZGF0YSBzdG9yZVxuXHRpbnRlcm5hbC5pbnRlcmFjdGlvbiA9IGludGVybmFsLmludGVyYWN0aW9uLmZpbHRlcigobykgPT4gbyAhPT0gb2JqZWN0KTtcblx0aW50ZXJuYWwuaW5pdGlhbEhpdHMgPSBpbnRlcm5hbC5pbml0aWFsSGl0cy5maWx0ZXIoKG8pID0+IG8gIT09IG9iamVjdCk7XG5cdGludGVybmFsLmhvdmVyZWQuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuXHRcdGlmICh2YWx1ZS5ldmVudE9iamVjdCA9PT0gb2JqZWN0IHx8IHZhbHVlLm9iamVjdCA9PT0gb2JqZWN0KSB7XG5cdFx0XHQvLyBDbGVhciBvdXQgaW50ZXJzZWN0cywgdGhleSBhcmUgb3V0ZGF0ZWQgYnkgbm93XG5cdFx0XHRpbnRlcm5hbC5ob3ZlcmVkLmRlbGV0ZShrZXkpO1xuXHRcdH1cblx0fSk7XG5cdGludGVybmFsLmNhcHR1cmVkTWFwLmZvckVhY2goKGNhcHR1cmVzLCBwb2ludGVySWQpID0+IHtcblx0XHRyZWxlYXNlSW50ZXJuYWxQb2ludGVyQ2FwdHVyZShpbnRlcm5hbC5jYXB0dXJlZE1hcCwgb2JqZWN0LCBjYXB0dXJlcywgcG9pbnRlcklkKTtcblx0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmVudHMoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPikge1xuXHQvKiogQ2FsY3VsYXRlcyBkZWx0YSAqL1xuXHRmdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZShldmVudDogTmd0RG9tRXZlbnQpIHtcblx0XHRjb25zdCBpbnRlcm5hbCA9IHN0b3JlLmdldCgnaW50ZXJuYWwnKTtcblx0XHRjb25zdCBkeCA9IGV2ZW50Lm9mZnNldFggLSBpbnRlcm5hbC5pbml0aWFsQ2xpY2tbMF07XG5cdFx0Y29uc3QgZHkgPSBldmVudC5vZmZzZXRZIC0gaW50ZXJuYWwuaW5pdGlhbENsaWNrWzFdO1xuXHRcdHJldHVybiBNYXRoLnJvdW5kKE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkpO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdHJ1ZSBpZiBhbiBpbnN0YW5jZSBoYXMgYSB2YWxpZCBwb2ludGVyLWV2ZW50IHJlZ2lzdGVyZWQsIHRoaXMgZXhjbHVkZXMgc2Nyb2xsLCBjbGlja3MgZXRjICovXG5cdGZ1bmN0aW9uIGZpbHRlclBvaW50ZXJFdmVudHMob2JqZWN0czogT2JqZWN0M0RbXSkge1xuXHRcdHJldHVybiBvYmplY3RzLmZpbHRlcigob2JqKSA9PlxuXHRcdFx0Wydtb3ZlJywgJ292ZXInLCAnZW50ZXInLCAnb3V0JywgJ2xlYXZlJ10uc29tZSgobmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBldmVudE5hbWUgPSBgcG9pbnRlciR7bmFtZX1gIGFzIGtleW9mIE5ndEV2ZW50SGFuZGxlcnM7XG5cdFx0XHRcdHJldHVybiBnZXRMb2NhbFN0YXRlKG9iaik/LmhhbmRsZXJzPy5bZXZlbnROYW1lXTtcblx0XHRcdH0pLFxuXHRcdCk7XG5cdH1cblxuXHRmdW5jdGlvbiBpbnRlcnNlY3QoZXZlbnQ6IE5ndERvbUV2ZW50LCBmaWx0ZXI/OiAob2JqZWN0czogT2JqZWN0M0RbXSkgPT4gT2JqZWN0M0RbXSkge1xuXHRcdGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0KCk7XG5cdFx0Y29uc3QgZHVwbGljYXRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGNvbnN0IGludGVyc2VjdGlvbnM6IE5ndEludGVyc2VjdGlvbltdID0gW107XG5cdFx0Ly8gQWxsb3cgY2FsbGVycyB0byBlbGltaW5hdGUgZXZlbnQgb2JqZWN0c1xuXHRcdGNvbnN0IGV2ZW50c09iamVjdHMgPSBmaWx0ZXIgPyBmaWx0ZXIoc3RhdGUuaW50ZXJuYWwuaW50ZXJhY3Rpb24pIDogc3RhdGUuaW50ZXJuYWwuaW50ZXJhY3Rpb247XG5cdFx0Ly8gUmVzZXQgYWxsIHJheWNhc3RlciBjYW1lcmFzIHRvIHVuZGVmaW5lZFxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnRzT2JqZWN0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgb2JqZWN0Um9vdFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShldmVudHNPYmplY3RzW2ldKT8uc3RvcmUuc25hcHNob3Q7XG5cdFx0XHRpZiAob2JqZWN0Um9vdFN0YXRlKSB7XG5cdFx0XHRcdG9iamVjdFJvb3RTdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID0gdW5kZWZpbmVkITtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIXN0YXRlLnByZXZpb3VzUm9vdCkge1xuXHRcdFx0Ly8gTWFrZSBzdXJlIHJvb3QtbGV2ZWwgcG9pbnRlciBhbmQgcmF5IGFyZSBzZXQgdXBcblx0XHRcdHN0YXRlLmV2ZW50cy5jb21wdXRlPy4oZXZlbnQsIHN0b3JlLCBudWxsKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBoYW5kbGVSYXljYXN0KG9iajogT2JqZWN0M0QpIHtcblx0XHRcdGNvbnN0IG9ialN0b3JlID0gZ2V0TG9jYWxTdGF0ZShvYmopPy5zdG9yZTtcblx0XHRcdGNvbnN0IG9ialN0YXRlID0gb2JqU3RvcmU/LnNuYXBzaG90O1xuXHRcdFx0Ly8gU2tpcCBldmVudCBoYW5kbGluZyB3aGVuIG5vRXZlbnRzIGlzIHNldCwgb3Igd2hlbiB0aGUgcmF5Y2FzdGVycyBjYW1lcmEgaXMgbnVsbFxuXHRcdFx0aWYgKCFvYmpTdGF0ZSB8fCAhb2JqU3RhdGUuZXZlbnRzLmVuYWJsZWQgfHwgb2JqU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuXG5cdFx0XHQvLyBXaGVuIHRoZSBjYW1lcmEgaXMgdW5kZWZpbmVkIHdlIGhhdmUgdG8gY2FsbCB0aGUgZXZlbnQgbGF5ZXJzIHVwZGF0ZSBmdW5jdGlvblxuXHRcdFx0aWYgKG9ialN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRvYmpTdGF0ZS5ldmVudHMuY29tcHV0ZT8uKGV2ZW50LCBvYmpTdG9yZSwgb2JqU3RhdGUucHJldmlvdXNSb290KTtcblx0XHRcdFx0Ly8gSWYgdGhlIGNhbWVyYSBpcyBzdGlsbCB1bmRlZmluZWQgd2UgaGF2ZSB0byBza2lwIHRoaXMgbGF5ZXIgZW50aXJlbHlcblx0XHRcdFx0aWYgKG9ialN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPT09IHVuZGVmaW5lZCkgb2JqU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9IG51bGwhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbnRlcnNlY3Qgb2JqZWN0IGJ5IG9iamVjdFxuXHRcdFx0cmV0dXJuIG9ialN0YXRlLnJheWNhc3Rlci5jYW1lcmEgPyBvYmpTdGF0ZS5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0KG9iaiwgdHJ1ZSkgOiBbXTtcblx0XHR9XG5cblx0XHQvLyBDb2xsZWN0IGV2ZW50c1xuXHRcdGxldCBoaXRzOiBJbnRlcnNlY3Rpb248T2JqZWN0M0Q+W10gPSBldmVudHNPYmplY3RzXG5cdFx0XHQvLyBJbnRlcnNlY3Qgb2JqZWN0c1xuXHRcdFx0LmZsYXRNYXAoaGFuZGxlUmF5Y2FzdClcblx0XHRcdC8vIFNvcnQgYnkgZXZlbnQgcHJpb3JpdHkgYW5kIGRpc3RhbmNlXG5cdFx0XHQuc29ydCgoYSwgYikgPT4ge1xuXHRcdFx0XHRjb25zdCBhU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGEub2JqZWN0KT8uc3RvcmUuc25hcHNob3Q7XG5cdFx0XHRcdGNvbnN0IGJTdGF0ZSA9IGdldExvY2FsU3RhdGUoYi5vYmplY3QpPy5zdG9yZS5zbmFwc2hvdDtcblx0XHRcdFx0aWYgKCFhU3RhdGUgfHwgIWJTdGF0ZSkgcmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlO1xuXHRcdFx0XHRyZXR1cm4gYlN0YXRlLmV2ZW50cy5wcmlvcml0eSAtIGFTdGF0ZS5ldmVudHMucHJpb3JpdHkgfHwgYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XG5cdFx0XHR9KVxuXHRcdFx0Ly8gRmlsdGVyIG91dCBkdXBsaWNhdGVzXG5cdFx0XHQuZmlsdGVyKChpdGVtKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGlkID0gbWFrZUlkKGl0ZW0gYXMgTmd0SW50ZXJzZWN0aW9uKTtcblx0XHRcdFx0aWYgKGR1cGxpY2F0ZXMuaGFzKGlkKSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRkdXBsaWNhdGVzLmFkZChpZCk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2lzc3Vlcy8xNjAzMVxuXHRcdC8vIEFsbG93IGN1c3RvbSB1c2VybGFuZCBpbnRlcnNlY3Qgc29ydCBvcmRlciwgdGhpcyBsaWtlbHkgb25seSBtYWtlcyBzZW5zZSBvbiB0aGUgcm9vdCBmaWx0ZXJcblx0XHRpZiAoc3RhdGUuZXZlbnRzLmZpbHRlcikgaGl0cyA9IHN0YXRlLmV2ZW50cy5maWx0ZXIoaGl0cywgc3RvcmUpO1xuXG5cdFx0Ly8gQnViYmxlIHVwIHRoZSBldmVudHMsIGZpbmQgdGhlIGV2ZW50IHNvdXJjZSAoZXZlbnRPYmplY3QpXG5cdFx0Zm9yIChjb25zdCBoaXQgb2YgaGl0cykge1xuXHRcdFx0bGV0IGV2ZW50T2JqZWN0OiBPYmplY3QzRCB8IG51bGwgPSBoaXQub2JqZWN0O1xuXHRcdFx0Ly8gYnViYmxlIGV2ZW50IHVwXG5cdFx0XHR3aGlsZSAoZXZlbnRPYmplY3QpIHtcblx0XHRcdFx0aWYgKGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3QpPy5ldmVudENvdW50KSBpbnRlcnNlY3Rpb25zLnB1c2goeyAuLi5oaXQsIGV2ZW50T2JqZWN0IH0pO1xuXHRcdFx0XHRldmVudE9iamVjdCA9IGV2ZW50T2JqZWN0LnBhcmVudDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgaW50ZXJhY3Rpb24gaXMgY2FwdHVyZWQsIG1ha2UgYWxsIGNhcHR1cmluZyB0YXJnZXRzIHBhcnQgb2YgdGhlIGludGVyc2VjdC5cblx0XHRpZiAoJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgc3RhdGUuaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcblx0XHRcdGZvciAoY29uc3QgY2FwdHVyZURhdGEgb2Ygc3RhdGUuaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGV2ZW50LnBvaW50ZXJJZCkhLnZhbHVlcygpKSB7XG5cdFx0XHRcdGlmICghZHVwbGljYXRlcy5oYXMobWFrZUlkKGNhcHR1cmVEYXRhLmludGVyc2VjdGlvbikpKSBpbnRlcnNlY3Rpb25zLnB1c2goY2FwdHVyZURhdGEuaW50ZXJzZWN0aW9uKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGludGVyc2VjdGlvbnM7XG5cdH1cblxuXHQvKiogIEhhbmRsZXMgaW50ZXJzZWN0aW9ucyBieSBmb3J3YXJkaW5nIHRoZW0gdG8gaGFuZGxlcnMgKi9cblx0ZnVuY3Rpb24gaGFuZGxlSW50ZXJzZWN0cyhcblx0XHRpbnRlcnNlY3Rpb25zOiBOZ3RJbnRlcnNlY3Rpb25bXSxcblx0XHRldmVudDogTmd0RG9tRXZlbnQsXG5cdFx0ZGVsdGE6IG51bWJlcixcblx0XHRjYWxsYmFjazogKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PE5ndERvbUV2ZW50PikgPT4gdm9pZCxcblx0KSB7XG5cdFx0Y29uc3Qgcm9vdFN0YXRlID0gc3RvcmUuc25hcHNob3Q7XG5cblx0XHQvLyBJZiBhbnl0aGluZyBoYXMgYmVlbiBmb3VuZCwgZm9yd2FyZCBpdCB0byB0aGUgZXZlbnQgbGlzdGVuZXJzXG5cdFx0aWYgKGludGVyc2VjdGlvbnMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBsb2NhbFN0YXRlID0geyBzdG9wcGVkOiBmYWxzZSB9O1xuXHRcdFx0Zm9yIChjb25zdCBoaXQgb2YgaW50ZXJzZWN0aW9ucykge1xuXHRcdFx0XHRjb25zdCB7IHJheWNhc3RlciwgcG9pbnRlciwgY2FtZXJhLCBpbnRlcm5hbCB9ID0gZ2V0TG9jYWxTdGF0ZShoaXQub2JqZWN0KT8uc3RvcmUuc25hcHNob3QgfHwgcm9vdFN0YXRlO1xuXHRcdFx0XHRjb25zdCB1bnByb2plY3RlZFBvaW50ID0gbmV3IFZlY3RvcjMocG9pbnRlci54LCBwb2ludGVyLnksIDApLnVucHJvamVjdChjYW1lcmEpO1xuXHRcdFx0XHRjb25zdCBoYXNQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoaWQpPy5oYXMoaGl0LmV2ZW50T2JqZWN0KSA/PyBmYWxzZTtcblxuXHRcdFx0XHRjb25zdCBzZXRQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2FwdHVyZURhdGEgPSB7IGludGVyc2VjdGlvbjogaGl0LCB0YXJnZXQ6IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50IH07XG5cdFx0XHRcdFx0aWYgKGludGVybmFsLmNhcHR1cmVkTWFwLmhhcyhpZCkpIHtcblx0XHRcdFx0XHRcdC8vIGlmIHRoZSBwb2ludGVySWQgd2FzIHByZXZpb3VzbHkgY2FwdHVyZWQsIHdlIGFkZCB0aGUgaGl0IHRvIHRoZVxuXHRcdFx0XHRcdFx0Ly8gZXZlbnQgY2FwdHVyZWRNYXAuXG5cdFx0XHRcdFx0XHRpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoaWQpIS5zZXQoaGl0LmV2ZW50T2JqZWN0LCBjYXB0dXJlRGF0YSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIGlmIHRoZSBwb2ludGVySWQgd2FzIG5vdCBwcmV2aW91c2x5IGNhcHR1cmVkLCB3ZSBjcmVhdGUgYSBtYXBcblx0XHRcdFx0XHRcdC8vIGNvbnRhaW5pbmcgdGhlIGhpdE9iamVjdCwgYW5kIHRoZSBoaXQuIGhpdE9iamVjdCBpcyB1c2VkIGZvclxuXHRcdFx0XHRcdFx0Ly8gZmFzdGVyIGFjY2Vzcy5cblx0XHRcdFx0XHRcdGludGVybmFsLmNhcHR1cmVkTWFwLnNldChpZCwgbmV3IE1hcChbW2hpdC5ldmVudE9iamVjdCwgY2FwdHVyZURhdGFdXSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBDYWxsIHRoZSBvcmlnaW5hbCBldmVudCBub3dcblx0XHRcdFx0XHQoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLnNldFBvaW50ZXJDYXB0dXJlKGlkKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRjb25zdCByZWxlYXNlUG9pbnRlckNhcHR1cmUgPSAoaWQ6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNhcHR1cmVzID0gaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGlkKTtcblx0XHRcdFx0XHRpZiAoY2FwdHVyZXMpIHtcblx0XHRcdFx0XHRcdHJlbGVhc2VJbnRlcm5hbFBvaW50ZXJDYXB0dXJlKGludGVybmFsLmNhcHR1cmVkTWFwLCBoaXQuZXZlbnRPYmplY3QsIGNhcHR1cmVzLCBpZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIEFkZCBuYXRpdmUgZXZlbnQgcHJvcHNcblx0XHRcdFx0Y29uc3QgZXh0cmFjdEV2ZW50UHJvcHM6IGFueSA9IHt9O1xuXHRcdFx0XHQvLyBUaGlzIGl0ZXJhdGVzIG92ZXIgdGhlIGV2ZW50J3MgcHJvcGVydGllcyBpbmNsdWRpbmcgdGhlIGluaGVyaXRlZCBvbmVzLiBOYXRpdmUgUG9pbnRlckV2ZW50cyBoYXZlIG1vc3Qgb2YgdGhlaXIgcHJvcHMgYXMgZ2V0dGVycyB3aGljaCBhcmUgaW5oZXJpdGVkLCBidXQgcG9seWZpbGxlZCBQb2ludGVyRXZlbnRzIGhhdmUgdGhlbSBhbGwgYXMgdGhlaXIgb3duIHByb3BlcnRpZXMgKGkuZS4gbm90IGluaGVyaXRlZCkuIFdlIGNhbid0IHVzZSBPYmplY3Qua2V5cygpIG9yIE9iamVjdC5lbnRyaWVzKCkgYXMgdGhleSBvbmx5IHJldHVybiBcIm93blwiIHByb3BlcnRpZXM7IG5vciBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZXZlbnQpIGFzIHRoYXQgKmRvZXNuJ3QqIHJldHVybiBcIm93blwiIHByb3BlcnRpZXMsIG9ubHkgaW5oZXJpdGVkIG9uZXMuXG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcCBpbiBldmVudCkge1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gZXZlbnRbcHJvcCBhcyBrZXlvZiBOZ3REb21FdmVudF07XG5cdFx0XHRcdFx0Ly8gT25seSBjb3B5IG92ZXIgYXRvbWljcywgbGVhdmUgZnVuY3Rpb25zIGFsb25lIGFzIHRoZXNlIHNob3VsZCBiZVxuXHRcdFx0XHRcdC8vIGNhbGxlZCBhcyBldmVudC5uYXRpdmVFdmVudC5mbigpXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wZXJ0eSAhPT0gJ2Z1bmN0aW9uJykgZXh0cmFjdEV2ZW50UHJvcHNbcHJvcF0gPSBwcm9wZXJ0eTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHJheWNhc3RFdmVudDogTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4gPSB7XG5cdFx0XHRcdFx0Li4uaGl0LFxuXHRcdFx0XHRcdC4uLmV4dHJhY3RFdmVudFByb3BzLFxuXHRcdFx0XHRcdHBvaW50ZXIsXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9ucyxcblx0XHRcdFx0XHRzdG9wcGVkOiBsb2NhbFN0YXRlLnN0b3BwZWQsXG5cdFx0XHRcdFx0ZGVsdGEsXG5cdFx0XHRcdFx0dW5wcm9qZWN0ZWRQb2ludCxcblx0XHRcdFx0XHRyYXk6IHJheWNhc3Rlci5yYXksXG5cdFx0XHRcdFx0Y2FtZXJhLFxuXHRcdFx0XHRcdC8vIEhpamFjayBzdG9wUHJvcGFnYXRpb24sIHdoaWNoIGp1c3Qgc2V0cyBhIGZsYWdcblx0XHRcdFx0XHRzdG9wUHJvcGFnYXRpb24oKSB7XG5cdFx0XHRcdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vcG1uZHJzL3JlYWN0LXRocmVlLWZpYmVyL2lzc3Vlcy81OTZcblx0XHRcdFx0XHRcdC8vIEV2ZW50cyBhcmUgbm90IGFsbG93ZWQgdG8gc3RvcCBwcm9wYWdhdGlvbiBpZiB0aGUgcG9pbnRlciBoYXMgYmVlbiBjYXB0dXJlZFxuXHRcdFx0XHRcdFx0Y29uc3QgY2FwdHVyZXNGb3JQb2ludGVyID0gJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KGV2ZW50LnBvaW50ZXJJZCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIG9ubHkgYXV0aG9yaXplIHN0b3BQcm9wYWdhdGlvbi4uLlxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHQvLyAuLi5pZiB0aGlzIHBvaW50ZXIgaGFzbid0IGJlZW4gY2FwdHVyZWRcblx0XHRcdFx0XHRcdFx0IWNhcHR1cmVzRm9yUG9pbnRlciB8fFxuXHRcdFx0XHRcdFx0XHQvLyAuLi4gb3IgaWYgdGhlIGhpdCBvYmplY3QgaXMgY2FwdHVyaW5nIHRoZSBwb2ludGVyXG5cdFx0XHRcdFx0XHRcdGNhcHR1cmVzRm9yUG9pbnRlci5oYXMoaGl0LmV2ZW50T2JqZWN0KVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHJheWNhc3RFdmVudC5zdG9wcGVkID0gbG9jYWxTdGF0ZS5zdG9wcGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0Ly8gUHJvcGFnYXRpb24gaXMgc3RvcHBlZCwgcmVtb3ZlIGFsbCBvdGhlciBob3ZlciByZWNvcmRzXG5cdFx0XHRcdFx0XHRcdC8vIEFuIGV2ZW50IGhhbmRsZXIgaXMgb25seSBhbGxvd2VkIHRvIGZsdXNoIG90aGVyIGhhbmRsZXJzIGlmIGl0IGlzIGhvdmVyZWQgaXRzZWxmXG5cdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRpbnRlcm5hbC5ob3ZlcmVkLnNpemUgJiZcblx0XHRcdFx0XHRcdFx0XHRBcnJheS5mcm9tKGludGVybmFsLmhvdmVyZWQudmFsdWVzKCkpLmZpbmQoKGkpID0+IGkuZXZlbnRPYmplY3QgPT09IGhpdC5ldmVudE9iamVjdClcblx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT2JqZWN0cyBjYW5ub3QgZmx1c2ggb3V0IGhpZ2hlciB1cCBvYmplY3RzIHRoYXQgaGF2ZSBhbHJlYWR5IGNhdWdodCB0aGUgZXZlbnRcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBoaWdoZXIgPSBpbnRlcnNlY3Rpb25zLnNsaWNlKDAsIGludGVyc2VjdGlvbnMuaW5kZXhPZihoaXQpKTtcblx0XHRcdFx0XHRcdFx0XHRjYW5jZWxQb2ludGVyKFsuLi5oaWdoZXIsIGhpdF0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQvLyB0aGVyZSBzaG91bGQgYmUgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRhcmdldCBhbmQgY3VycmVudFRhcmdldFxuXHRcdFx0XHRcdHRhcmdldDogeyBoYXNQb2ludGVyQ2FwdHVyZSwgc2V0UG9pbnRlckNhcHR1cmUsIHJlbGVhc2VQb2ludGVyQ2FwdHVyZSB9LFxuXHRcdFx0XHRcdGN1cnJlbnRUYXJnZXQ6IHsgaGFzUG9pbnRlckNhcHR1cmUsIHNldFBvaW50ZXJDYXB0dXJlLCByZWxlYXNlUG9pbnRlckNhcHR1cmUgfSxcblx0XHRcdFx0XHRuYXRpdmVFdmVudDogZXZlbnQsXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gQ2FsbCBzdWJzY3JpYmVyc1xuXHRcdFx0XHRjYWxsYmFjayhyYXljYXN0RXZlbnQpO1xuXHRcdFx0XHQvLyBFdmVudCBidWJibGluZyBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgc3RvcFByb3BhZ2F0aW9uXG5cdFx0XHRcdGlmIChsb2NhbFN0YXRlLnN0b3BwZWQpIGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW50ZXJzZWN0aW9ucztcblx0fVxuXG5cdGZ1bmN0aW9uIGNhbmNlbFBvaW50ZXIoaW50ZXJzZWN0aW9uczogTmd0SW50ZXJzZWN0aW9uW10pIHtcblx0XHRjb25zdCBpbnRlcm5hbCA9IHN0b3JlLmdldCgnaW50ZXJuYWwnKTtcblx0XHRmb3IgKGNvbnN0IGhvdmVyZWRPYmogb2YgaW50ZXJuYWwuaG92ZXJlZC52YWx1ZXMoKSkge1xuXHRcdFx0Ly8gV2hlbiBubyBvYmplY3RzIHdlcmUgaGl0IG9yIHRoZSB0aGUgaG92ZXJlZCBvYmplY3Qgd2Fzbid0IGZvdW5kIHVuZGVybmVhdGggdGhlIGN1cnNvclxuXHRcdFx0Ly8gd2UgY2FsbCBvblBvaW50ZXJPdXQgYW5kIGRlbGV0ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGhvdmVyZWQtZWxlbWVudHMgbWFwXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFpbnRlcnNlY3Rpb25zLmxlbmd0aCB8fFxuXHRcdFx0XHQhaW50ZXJzZWN0aW9ucy5maW5kKFxuXHRcdFx0XHRcdChoaXQpID0+XG5cdFx0XHRcdFx0XHRoaXQub2JqZWN0ID09PSBob3ZlcmVkT2JqLm9iamVjdCAmJlxuXHRcdFx0XHRcdFx0aGl0LmluZGV4ID09PSBob3ZlcmVkT2JqLmluZGV4ICYmXG5cdFx0XHRcdFx0XHRoaXQuaW5zdGFuY2VJZCA9PT0gaG92ZXJlZE9iai5pbnN0YW5jZUlkLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3QgZXZlbnRPYmplY3QgPSBob3ZlcmVkT2JqLmV2ZW50T2JqZWN0O1xuXHRcdFx0XHRjb25zdCBpbnN0YW5jZSA9IGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3QpO1xuXHRcdFx0XHRjb25zdCBoYW5kbGVycyA9IGluc3RhbmNlPy5oYW5kbGVycztcblx0XHRcdFx0aW50ZXJuYWwuaG92ZXJlZC5kZWxldGUobWFrZUlkKGhvdmVyZWRPYmopKTtcblx0XHRcdFx0aWYgKGluc3RhbmNlPy5ldmVudENvdW50KSB7XG5cdFx0XHRcdFx0Ly8gQ2xlYXIgb3V0IGludGVyc2VjdHMsIHRoZXkgYXJlIG91dGRhdGVkIGJ5IG5vd1xuXHRcdFx0XHRcdGNvbnN0IGRhdGEgPSB7IC4uLmhvdmVyZWRPYmosIGludGVyc2VjdGlvbnMgfTtcblx0XHRcdFx0XHRoYW5kbGVycz8ucG9pbnRlcm91dD8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcblx0XHRcdFx0XHRoYW5kbGVycz8ucG9pbnRlcmxlYXZlPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gcG9pbnRlck1pc3NlZChldmVudDogTW91c2VFdmVudCwgb2JqZWN0czogT2JqZWN0M0RbXSkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBnZXRMb2NhbFN0YXRlKG9iamVjdHNbaV0pO1xuXHRcdFx0aW5zdGFuY2U/LmhhbmRsZXJzLnBvaW50ZXJtaXNzZWQ/LihldmVudCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gaGFuZGxlUG9pbnRlcihuYW1lOiBzdHJpbmcpIHtcblx0XHQvLyBEZWFsIHdpdGggY2FuY2VsYXRpb25cblx0XHRzd2l0Y2ggKG5hbWUpIHtcblx0XHRcdGNhc2UgJ3BvaW50ZXJsZWF2ZSc6XG5cdFx0XHRjYXNlICdwb2ludGVyY2FuY2VsJzpcblx0XHRcdFx0cmV0dXJuICgpID0+IGNhbmNlbFBvaW50ZXIoW10pO1xuXHRcdFx0Y2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcblx0XHRcdFx0cmV0dXJuIChldmVudDogTmd0RG9tRXZlbnQpID0+IHtcblx0XHRcdFx0XHRjb25zdCB7IGludGVybmFsIH0gPSBzdG9yZS5zbmFwc2hvdDtcblx0XHRcdFx0XHRpZiAoJ3BvaW50ZXJJZCcgaW4gZXZlbnQgJiYgaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBvYmplY3QgZXZlbnQgaW50ZXJmYWNlIGhhZCBsb3N0cG9pbnRlcmNhcHR1cmUsIHdlJ2QgY2FsbCBpdCBoZXJlIG9uIGV2ZXJ5XG5cdFx0XHRcdFx0XHQvLyBvYmplY3QgdGhhdCdzIGdldHRpbmcgcmVtb3ZlZC4gV2UgY2FsbCBpdCBvbiB0aGUgbmV4dCBmcmFtZSBiZWNhdXNlIGxvc3Rwb2ludGVyY2FwdHVyZVxuXHRcdFx0XHRcdFx0Ly8gZmlyZXMgYmVmb3JlIHBvaW50ZXJ1cC4gT3RoZXJ3aXNlIHBvaW50ZXJVcCB3b3VsZCBuZXZlciBiZSBjYWxsZWQgaWYgdGhlIGV2ZW50IGRpZG4ndFxuXHRcdFx0XHRcdFx0Ly8gaGFwcGVuIGluIHRoZSBvYmplY3QgaXQgb3JpZ2luYXRlZCBmcm9tLCBsZWF2aW5nIGNvbXBvbmVudHMgaW4gYSBpbi1iZXR3ZWVuIHN0YXRlLlxuXHRcdFx0XHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gT25seSByZWxlYXNlIGlmIHBvaW50ZXItdXAgZGlkbid0IGRvIGl0IGFscmVhZHlcblx0XHRcdFx0XHRcdFx0aWYgKGludGVybmFsLmNhcHR1cmVkTWFwLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG5cdFx0XHRcdFx0XHRcdFx0aW50ZXJuYWwuY2FwdHVyZWRNYXAuZGVsZXRlKGV2ZW50LnBvaW50ZXJJZCk7XG5cdFx0XHRcdFx0XHRcdFx0Y2FuY2VsUG9pbnRlcihbXSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBBbnkgb3RoZXIgcG9pbnRlciBnb2VzIGhlcmUgLi4uXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50OiBOZ3REb21FdmVudCkge1xuXHRcdFx0Ly8gTk9URTogcG9pbnRlck1pc3NlZCQgb24gTmd0U3RvcmUgaXMgcHJpdmF0ZVxuXHRcdFx0Y29uc3QgcG9pbnRlck1pc3NlZCQ6IFN1YmplY3Q8TW91c2VFdmVudD4gPSAoc3RvcmUgYXMgTmd0QW55UmVjb3JkKVsncG9pbnRlck1pc3NlZCQnXTtcblx0XHRcdGNvbnN0IGludGVybmFsID0gc3RvcmUuZ2V0KCdpbnRlcm5hbCcpO1xuXG5cdFx0XHQvLyBwcmVwYXJlUmF5KGV2ZW50KVxuXHRcdFx0aW50ZXJuYWwubGFzdEV2ZW50Lm5hdGl2ZUVsZW1lbnQgPSBldmVudDtcblxuXHRcdFx0Ly8gR2V0IGZyZXNoIGludGVyc2VjdHNcblx0XHRcdGNvbnN0IGlzUG9pbnRlck1vdmUgPSBuYW1lID09PSAncG9pbnRlcm1vdmUnO1xuXHRcdFx0Y29uc3QgaXNDbGlja0V2ZW50ID0gbmFtZSA9PT0gJ2NsaWNrJyB8fCBuYW1lID09PSAnY29udGV4dG1lbnUnIHx8IG5hbWUgPT09ICdkYmxjbGljayc7XG5cdFx0XHRjb25zdCBmaWx0ZXIgPSBpc1BvaW50ZXJNb3ZlID8gZmlsdGVyUG9pbnRlckV2ZW50cyA6IHVuZGVmaW5lZDtcblxuXHRcdFx0Y29uc3QgaGl0cyA9IGludGVyc2VjdChldmVudCwgZmlsdGVyKTtcblx0XHRcdGNvbnN0IGRlbHRhID0gaXNDbGlja0V2ZW50ID8gY2FsY3VsYXRlRGlzdGFuY2UoZXZlbnQpIDogMDtcblxuXHRcdFx0Ly8gU2F2ZSBpbml0aWFsIGNvb3JkaW5hdGVzIG9uIHBvaW50ZXItZG93blxuXHRcdFx0aWYgKG5hbWUgPT09ICdwb2ludGVyZG93bicpIHtcblx0XHRcdFx0aW50ZXJuYWwuaW5pdGlhbENsaWNrID0gW2V2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFldO1xuXHRcdFx0XHRpbnRlcm5hbC5pbml0aWFsSGl0cyA9IGhpdHMubWFwKChoaXQpID0+IGhpdC5ldmVudE9iamVjdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgY2xpY2sgeWllbGRzIG5vIHJlc3VsdHMsIHBhc3MgaXQgYmFjayB0byB0aGUgdXNlciBhcyBhIG1pc3Ncblx0XHRcdC8vIE1pc3NlZCBldmVudHMgaGF2ZSB0byBjb21lIGZpcnN0IGluIG9yZGVyIHRvIGVzdGFibGlzaCB1c2VyLWxhbmQgc2lkZS1lZmZlY3QgY2xlYW4gdXBcblx0XHRcdGlmIChpc0NsaWNrRXZlbnQgJiYgIWhpdHMubGVuZ3RoKSB7XG5cdFx0XHRcdGlmIChkZWx0YSA8PSAyKSB7XG5cdFx0XHRcdFx0cG9pbnRlck1pc3NlZChldmVudCwgaW50ZXJuYWwuaW50ZXJhY3Rpb24pO1xuXHRcdFx0XHRcdHBvaW50ZXJNaXNzZWQkLm5leHQoZXZlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgY2FyZSBvZiB1bmhvdmVyXG5cdFx0XHRpZiAoaXNQb2ludGVyTW92ZSkgY2FuY2VsUG9pbnRlcihoaXRzKTtcblxuXHRcdFx0ZnVuY3Rpb24gb25JbnRlcnNlY3QoZGF0YTogTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4pIHtcblx0XHRcdFx0Y29uc3QgZXZlbnRPYmplY3QgPSBkYXRhLmV2ZW50T2JqZWN0O1xuXHRcdFx0XHRjb25zdCBpbnN0YW5jZSA9IGdldExvY2FsU3RhdGUoZXZlbnRPYmplY3QpO1xuXHRcdFx0XHRjb25zdCBoYW5kbGVycyA9IGluc3RhbmNlPy5oYW5kbGVycztcblxuXHRcdFx0XHQvLyBDaGVjayBwcmVzZW5jZSBvZiBoYW5kbGVyc1xuXHRcdFx0XHRpZiAoIWluc3RhbmNlPy5ldmVudENvdW50KSByZXR1cm47XG5cblx0XHRcdFx0LypcbiAgICAgICAgTUFZQkUgVE9ETywgREVMRVRFIElGIE5PVDpcbiAgICAgICAgICBDaGVjayBpZiB0aGUgb2JqZWN0IGlzIGNhcHR1cmVkLCBjYXB0dXJlZCBldmVudHMgc2hvdWxkIG5vdCBoYXZlIGludGVyc2VjdHMgcnVubmluZyBpbiBwYXJhbGxlbFxuICAgICAgICAgIEJ1dCB3b3VsZG4ndCBpdCBiZSBiZXR0ZXIgdG8ganVzdCByZXBsYWNlIGNhcHR1cmVkTWFwIHdpdGggYSBzaW5nbGUgZW50cnk/XG4gICAgICAgICAgQWxzbywgYXJlIHdlIE9LIHdpdGggc3RyYWlnaHQgdXAgbWFraW5nIHBpY2tpbmcgdXAgbXVsdGlwbGUgb2JqZWN0cyBpbXBvc3NpYmxlP1xuXG4gICAgICAgIGNvbnN0IHBvaW50ZXJJZCA9IChkYXRhIGFzIFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50PikucG9pbnRlcklkXG4gICAgICAgIGlmIChwb2ludGVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGNhcHR1cmVkTWVzaFNldCA9IGludGVybmFsLmNhcHR1cmVkTWFwLmdldChwb2ludGVySWQpXG4gICAgICAgICAgaWYgKGNhcHR1cmVkTWVzaFNldCkge1xuICAgICAgICAgICAgY29uc3QgY2FwdHVyZWQgPSBjYXB0dXJlZE1lc2hTZXQuZ2V0KGV2ZW50T2JqZWN0KVxuICAgICAgICAgICAgaWYgKGNhcHR1cmVkICYmIGNhcHR1cmVkLmxvY2FsU3RhdGUuc3RvcHBlZCkgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9Ki9cblxuXHRcdFx0XHRpZiAoaXNQb2ludGVyTW92ZSkge1xuXHRcdFx0XHRcdC8vIE1vdmUgZXZlbnQgLi4uXG5cdFx0XHRcdFx0aWYgKGhhbmRsZXJzPy5wb2ludGVyb3ZlciB8fCBoYW5kbGVycz8ucG9pbnRlcmVudGVyIHx8IGhhbmRsZXJzPy5wb2ludGVyb3V0IHx8IGhhbmRsZXJzPy5wb2ludGVybGVhdmUpIHtcblx0XHRcdFx0XHRcdC8vIFdoZW4gZW50ZXIgb3Igb3V0IGlzIHByZXNlbnQgdGFrZSBjYXJlIG9mIGhvdmVyLXN0YXRlXG5cdFx0XHRcdFx0XHRjb25zdCBpZCA9IG1ha2VJZChkYXRhKTtcblx0XHRcdFx0XHRcdGNvbnN0IGhvdmVyZWRJdGVtID0gaW50ZXJuYWwuaG92ZXJlZC5nZXQoaWQpO1xuXHRcdFx0XHRcdFx0aWYgKCFob3ZlcmVkSXRlbSkge1xuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgb2JqZWN0IHdhc24ndCBwcmV2aW91c2x5IGhvdmVyZWQsIGJvb2sgaXQgYW5kIGNhbGwgaXRzIGhhbmRsZXJcblx0XHRcdFx0XHRcdFx0aW50ZXJuYWwuaG92ZXJlZC5zZXQoaWQsIGRhdGEpO1xuXHRcdFx0XHRcdFx0XHRoYW5kbGVycy5wb2ludGVyb3Zlcj8uKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcblx0XHRcdFx0XHRcdFx0aGFuZGxlcnMucG9pbnRlcmVudGVyPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChob3ZlcmVkSXRlbS5zdG9wcGVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBvYmplY3Qgd2FzIHByZXZpb3VzbHkgaG92ZXJlZCBhbmQgc3RvcHBlZCwgd2Ugc2hvdWxkbid0IGFsbG93IG90aGVyIGl0ZW1zIHRvIHByb2NlZWRcblx0XHRcdFx0XHRcdFx0ZGF0YS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQ2FsbCBtb3VzZSBtb3ZlXG5cdFx0XHRcdFx0aGFuZGxlcnM/LnBvaW50ZXJtb3ZlPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEFsbCBvdGhlciBldmVudHMgLi4uXG5cdFx0XHRcdFx0Y29uc3QgaGFuZGxlciA9IGhhbmRsZXJzPy5bbmFtZSBhcyBrZXlvZiBOZ3RFdmVudEhhbmRsZXJzXSBhcyAoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50PikgPT4gdm9pZDtcblx0XHRcdFx0XHRpZiAoaGFuZGxlcikge1xuXHRcdFx0XHRcdFx0Ly8gRm9yd2FyZCBhbGwgZXZlbnRzIGJhY2sgdG8gdGhlaXIgcmVzcGVjdGl2ZSBoYW5kbGVycyB3aXRoIHRoZSBleGNlcHRpb24gb2YgY2xpY2sgZXZlbnRzLFxuXHRcdFx0XHRcdFx0Ly8gd2hpY2ggbXVzdCB1c2UgdGhlIGluaXRpYWwgdGFyZ2V0XG5cdFx0XHRcdFx0XHRpZiAoIWlzQ2xpY2tFdmVudCB8fCBpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhldmVudE9iamVjdCkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gTWlzc2VkIGV2ZW50cyBoYXZlIHRvIGNvbWUgZmlyc3Rcblx0XHRcdFx0XHRcdFx0cG9pbnRlck1pc3NlZChcblx0XHRcdFx0XHRcdFx0XHRldmVudCxcblx0XHRcdFx0XHRcdFx0XHRpbnRlcm5hbC5pbnRlcmFjdGlvbi5maWx0ZXIoKG9iamVjdCkgPT4gIWludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKG9iamVjdCkpLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHQvLyBOb3cgY2FsbCB0aGUgaGFuZGxlclxuXHRcdFx0XHRcdFx0XHRoYW5kbGVyKGRhdGEgYXMgTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVHJpZ2dlciBvblBvaW50ZXJNaXNzZWQgb24gYWxsIGVsZW1lbnRzIHRoYXQgaGF2ZSBwb2ludGVyIG92ZXIvb3V0IGhhbmRsZXJzLCBidXQgbm90IGNsaWNrIGFuZCB3ZXJlbid0IGhpdFxuXHRcdFx0XHRcdFx0aWYgKGlzQ2xpY2tFdmVudCAmJiBpbnRlcm5hbC5pbml0aWFsSGl0cy5pbmNsdWRlcyhldmVudE9iamVjdCkpIHtcblx0XHRcdFx0XHRcdFx0cG9pbnRlck1pc3NlZChcblx0XHRcdFx0XHRcdFx0XHRldmVudCxcblx0XHRcdFx0XHRcdFx0XHRpbnRlcm5hbC5pbnRlcmFjdGlvbi5maWx0ZXIoKG9iamVjdCkgPT4gIWludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKG9iamVjdCkpLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRoYW5kbGVJbnRlcnNlY3RzKGhpdHMsIGV2ZW50LCBkZWx0YSwgb25JbnRlcnNlY3QpO1xuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4geyBoYW5kbGVQb2ludGVyIH07XG59XG4iXX0=
@@ -0,0 +1,40 @@
1
+ var _a;
2
+ import { DestroyRef, Directive, ElementRef, inject, InjectionToken, } from '@angular/core';
3
+ import { HTML } from './renderer';
4
+ import { injectStore } from './store';
5
+ import * as i0 from "@angular/core";
6
+ const NGT_HTML_DOM_ELEMENT = new InjectionToken('NGT_HTML_DOM_ELEMENT');
7
+ export function provideHTMLDomElement(...args) {
8
+ if (args.length === 0) {
9
+ return { provide: NGT_HTML_DOM_ELEMENT, useFactory: () => 'gl' };
10
+ }
11
+ return { provide: NGT_HTML_DOM_ELEMENT, useFactory: args.pop(), deps: args };
12
+ }
13
+ export class NgtHTML {
14
+ static { _a = HTML; }
15
+ static { this[_a] = true; }
16
+ constructor() {
17
+ this.store = injectStore();
18
+ this.destroyRef = inject(DestroyRef);
19
+ this.host = inject(ElementRef);
20
+ this.domElement = inject(NGT_HTML_DOM_ELEMENT, { self: true, optional: true });
21
+ if (this.domElement === 'gl') {
22
+ Object.assign(this.host.nativeElement, {
23
+ __ngt_dom_parent__: this.store.snapshot.gl.domElement.parentElement,
24
+ });
25
+ }
26
+ else if (this.domElement) {
27
+ Object.assign(this.host.nativeElement, { __ngt_dom_parent__: this.domElement });
28
+ }
29
+ this.destroyRef.onDestroy(() => {
30
+ this.host.nativeElement['__ngt_dom_parent__'] = null;
31
+ delete this.host.nativeElement['__ngt_dom_parent__'];
32
+ });
33
+ }
34
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtHTML, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
35
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.1.3", type: NgtHTML, ngImport: i0 }); }
36
+ }
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NgtHTML, decorators: [{
38
+ type: Directive
39
+ }], ctorParameters: () => [] });
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL2h0bWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTixVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sY0FBYyxHQUlkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFHdEMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLGNBQWMsQ0FBcUIsc0JBQXNCLENBQUMsQ0FBQztBQVM1RixNQUFNLFVBQVUscUJBQXFCLENBQUMsR0FBRyxJQUFXO0lBQ25ELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM5RSxDQUFDO0FBR0QsTUFBTSxPQUFnQixPQUFPO2tCQUNwQixJQUFJO2FBQUwsUUFBTSxHQUFHLElBQUksQUFBUCxDQUFRO0lBT3JCO1FBTFUsVUFBSyxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsU0FBSSxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUM7UUFDbkQsZUFBVSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFHbkYsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYTthQUNuRSxDQUFDLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUE4QixDQUFDLG9CQUFvQixDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ3ZFLE9BQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUE4QixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOzhHQXJCb0IsT0FBTztrR0FBUCxPQUFPOzsyRkFBUCxPQUFPO2tCQUQ1QixTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0QWJzdHJhY3RUeXBlLFxuXHREZXN0cm95UmVmLFxuXHREaXJlY3RpdmUsXG5cdEVsZW1lbnRSZWYsXG5cdGluamVjdCxcblx0SW5qZWN0aW9uVG9rZW4sXG5cdFByb3ZpZGVyLFxuXHRQcm92aWRlclRva2VuLFxuXHRUeXBlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhUTUwgfSBmcm9tICcuL3JlbmRlcmVyJztcbmltcG9ydCB7IGluamVjdFN0b3JlIH0gZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgeyBOZ3RBbnlSZWNvcmQgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgTkdUX0hUTUxfRE9NX0VMRU1FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48J2dsJyB8IEhUTUxFbGVtZW50PignTkdUX0hUTUxfRE9NX0VMRU1FTlQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVIVE1MRG9tRWxlbWVudCgpOiBQcm92aWRlcjtcbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlSFRNTERvbUVsZW1lbnQ8XG5cdFREZXBzIGV4dGVuZHMgQXJyYXk8UHJvdmlkZXJUb2tlbjxhbnk+Pixcblx0VFZhbHVlcyBleHRlbmRzIHtcblx0XHRbSyBpbiBrZXlvZiBURGVwc106IFREZXBzW0tdIGV4dGVuZHMgVHlwZTxpbmZlciBUPiB8IEFic3RyYWN0VHlwZTxpbmZlciBUPiB8IEluamVjdGlvblRva2VuPGluZmVyIFQ+ID8gVCA6IG5ldmVyO1xuXHR9LFxuPihkZXBzOiBURGVwcywgZmFjdG9yeTogKC4uLmFyZ3M6IFRWYWx1ZXMpID0+IEhUTUxFbGVtZW50KTogUHJvdmlkZXI7XG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUhUTUxEb21FbGVtZW50KC4uLmFyZ3M6IGFueVtdKSB7XG5cdGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiB7IHByb3ZpZGU6IE5HVF9IVE1MX0RPTV9FTEVNRU5ULCB1c2VGYWN0b3J5OiAoKSA9PiAnZ2wnIH07XG5cdH1cblxuXHRyZXR1cm4geyBwcm92aWRlOiBOR1RfSFRNTF9ET01fRUxFTUVOVCwgdXNlRmFjdG9yeTogYXJncy5wb3AoKSwgZGVwczogYXJncyB9O1xufVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOZ3RIVE1MIHtcblx0c3RhdGljIFtIVE1MXSA9IHRydWU7XG5cblx0cHJvdGVjdGVkIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJvdGVjdGVkIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cdHByb3RlY3RlZCBob3N0ID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcblx0cHJvdGVjdGVkIGRvbUVsZW1lbnQgPSBpbmplY3QoTkdUX0hUTUxfRE9NX0VMRU1FTlQsIHsgc2VsZjogdHJ1ZSwgb3B0aW9uYWw6IHRydWUgfSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0aWYgKHRoaXMuZG9tRWxlbWVudCA9PT0gJ2dsJykge1xuXHRcdFx0T2JqZWN0LmFzc2lnbih0aGlzLmhvc3QubmF0aXZlRWxlbWVudCwge1xuXHRcdFx0XHRfX25ndF9kb21fcGFyZW50X186IHRoaXMuc3RvcmUuc25hcHNob3QuZ2wuZG9tRWxlbWVudC5wYXJlbnRFbGVtZW50LFxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmRvbUVsZW1lbnQpIHtcblx0XHRcdE9iamVjdC5hc3NpZ24odGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQsIHsgX19uZ3RfZG9tX3BhcmVudF9fOiB0aGlzLmRvbUVsZW1lbnQgfSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG5cdFx0XHQodGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQgYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfZG9tX3BhcmVudF9fJ10gPSBudWxsO1xuXHRcdFx0ZGVsZXRlICh0aGlzLmhvc3QubmF0aXZlRWxlbWVudCBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9kb21fcGFyZW50X18nXTtcblx0XHR9KTtcblx0fVxufVxuIl19