angular-three-soba 2.0.0-beta.7 → 2.0.0-beta.8

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 (296) hide show
  1. package/abstractions/billboard/billboard.d.ts +11 -7
  2. package/abstractions/detailed/detailed.d.ts +26 -0
  3. package/abstractions/edges/edges.d.ts +23 -11
  4. package/abstractions/grid/grid.d.ts +41 -50
  5. package/abstractions/index.d.ts +1 -7
  6. package/abstractions/text/text.d.ts +10 -4
  7. package/abstractions/text-3d/text-3d.d.ts +47 -40
  8. package/cameras/camera/camera-content.d.ts +1 -1
  9. package/cameras/camera/camera.d.ts +16 -13
  10. package/cameras/cube-camera/cube-camera.d.ts +50 -23
  11. package/cameras/index.d.ts +0 -1
  12. package/cameras/orthographic-camera/orthographic-camera.d.ts +29 -18
  13. package/cameras/perspective-camera/perspective-camera.d.ts +10 -1
  14. package/controls/orbit-controls/orbit-controls.d.ts +30 -13
  15. package/esm2022/abstractions/billboard/billboard.mjs +36 -33
  16. package/esm2022/abstractions/detailed/detailed.mjs +64 -0
  17. package/esm2022/abstractions/edges/edges.mjs +58 -63
  18. package/esm2022/abstractions/grid/grid.mjs +140 -110
  19. package/esm2022/abstractions/index.mjs +2 -8
  20. package/esm2022/abstractions/text/text.mjs +123 -122
  21. package/esm2022/abstractions/text-3d/text-3d.mjs +119 -121
  22. package/esm2022/cameras/camera/camera-content.mjs +5 -6
  23. package/esm2022/cameras/camera/camera.mjs +48 -42
  24. package/esm2022/cameras/cube-camera/cube-camera.mjs +129 -99
  25. package/esm2022/cameras/index.mjs +1 -2
  26. package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +78 -75
  27. package/esm2022/cameras/perspective-camera/perspective-camera.mjs +25 -26
  28. package/esm2022/controls/orbit-controls/orbit-controls.mjs +94 -90
  29. package/esm2022/loaders/gltf-loader/gltf-loader.mjs +3 -6
  30. package/esm2022/loaders/loader/loader.mjs +92 -87
  31. package/esm2022/loaders/progress/progress.mjs +1 -1
  32. package/esm2022/loaders/texture-loader/texture-loader.mjs +4 -4
  33. package/esm2022/materials/index.mjs +2 -1
  34. package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +60 -51
  35. package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +239 -255
  36. package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +99 -97
  37. package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +167 -146
  38. package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +44 -42
  39. package/esm2022/materials/point-material/point-material.mjs +46 -0
  40. package/esm2022/misc/animations/animations.mjs +20 -16
  41. package/esm2022/misc/bake-shadows/bake-shadows.mjs +13 -13
  42. package/esm2022/misc/caustics/caustics.mjs +387 -0
  43. package/esm2022/misc/decal/decal.mjs +187 -0
  44. package/esm2022/misc/depth-buffer/depth-buffer.mjs +33 -35
  45. package/esm2022/misc/example/example.mjs +160 -0
  46. package/esm2022/misc/fbo/fbo.mjs +35 -35
  47. package/esm2022/misc/html/html-wrapper.mjs +478 -0
  48. package/esm2022/misc/html/html.mjs +304 -0
  49. package/esm2022/misc/index.mjs +10 -1
  50. package/esm2022/misc/sampler/sampler.mjs +142 -0
  51. package/esm2022/misc/shadow/shadow.mjs +111 -0
  52. package/esm2022/misc/stats-gl/stats-gl.mjs +61 -0
  53. package/esm2022/misc/trail/trail.mjs +209 -0
  54. package/esm2022/misc/trail-texture/inject-trail-texture.mjs +17 -0
  55. package/esm2022/misc/trail-texture/trail-texture.mjs +106 -0
  56. package/esm2022/modifiers/angular-three-soba-modifiers.mjs +5 -0
  57. package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +64 -0
  58. package/esm2022/modifiers/index.mjs +2 -0
  59. package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +44 -0
  60. package/esm2022/performances/adaptive-events/adaptive-events.mjs +27 -0
  61. package/esm2022/performances/angular-three-soba-performances.mjs +5 -0
  62. package/esm2022/performances/index.mjs +6 -0
  63. package/esm2022/performances/points/points-input.mjs +64 -0
  64. package/esm2022/performances/points/points.mjs +329 -0
  65. package/esm2022/performances/points/position-point.mjs +54 -0
  66. package/esm2022/performances/segments/segment-object.mjs +9 -0
  67. package/esm2022/performances/segments/segments.mjs +182 -0
  68. package/esm2022/shaders/blur-pass/blur-pass.mjs +1 -1
  69. package/esm2022/shaders/caustics/caustics-material.mjs +130 -0
  70. package/esm2022/shaders/caustics/caustics-projection-material.mjs +31 -0
  71. package/esm2022/shaders/convolution-material/convolution-material.mjs +1 -1
  72. package/esm2022/shaders/discard-material/discard-material.mjs +1 -1
  73. package/esm2022/shaders/grid-material/grid-material.mjs +29 -14
  74. package/esm2022/shaders/index.mjs +5 -3
  75. package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +42 -41
  76. package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +1 -1
  77. package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +2 -2
  78. package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +4 -4
  79. package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +1 -1
  80. package/esm2022/shaders/shader-material/shader-material.mjs +1 -1
  81. package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +17 -25
  82. package/esm2022/shaders/sparkles-material/sparkles-material.mjs +32 -46
  83. package/esm2022/shaders/spot-light-material/spot-light-material.mjs +7 -7
  84. package/esm2022/shaders/star-field-material/star-field-material.mjs +3 -2
  85. package/esm2022/shaders/wireframe-material/wireframe-material.mjs +247 -0
  86. package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +160 -176
  87. package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +1 -1
  88. package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +126 -128
  89. package/esm2022/staging/backdrop/backdrop.mjs +77 -0
  90. package/esm2022/staging/bb-anchor/bb-anchor.mjs +70 -0
  91. package/esm2022/staging/bounds/bounds.mjs +144 -143
  92. package/esm2022/staging/camera-shake/camera-shake.mjs +86 -80
  93. package/esm2022/staging/center/center.mjs +106 -91
  94. package/esm2022/staging/cloud/cloud.mjs +118 -124
  95. package/esm2022/staging/contact-shadows/contact-shadows.mjs +131 -134
  96. package/esm2022/staging/environment/assets.mjs +12 -12
  97. package/esm2022/staging/environment/environment-cube.mjs +28 -30
  98. package/esm2022/staging/environment/environment-ground.mjs +18 -20
  99. package/esm2022/staging/environment/environment-input.mjs +97 -84
  100. package/esm2022/staging/environment/environment-map.mjs +33 -33
  101. package/esm2022/staging/environment/environment-portal.mjs +75 -97
  102. package/esm2022/staging/environment/environment.mjs +34 -51
  103. package/esm2022/staging/environment/utils.mjs +35 -14
  104. package/esm2022/staging/float/float.mjs +70 -58
  105. package/esm2022/staging/index.mjs +7 -3
  106. package/esm2022/staging/matcap-texture/matcap-texture.mjs +64 -0
  107. package/esm2022/staging/normal-texture/normal-texture.mjs +53 -0
  108. package/esm2022/staging/sky/sky.mjs +85 -80
  109. package/esm2022/staging/sparkles/sparkles.mjs +108 -105
  110. package/esm2022/staging/spot-light/shadow-mesh-input.mjs +63 -0
  111. package/esm2022/staging/spot-light/shadow-mesh.mjs +266 -0
  112. package/esm2022/staging/spot-light/spot-light-input.mjs +67 -58
  113. package/esm2022/staging/spot-light/spot-light.mjs +51 -64
  114. package/esm2022/staging/spot-light/volumetric-mesh.mjs +61 -78
  115. package/esm2022/staging/stage/stage.mjs +304 -290
  116. package/esm2022/staging/stars/stars.mjs +101 -102
  117. package/esm2022/staging/wireframe/wireframe-input.mjs +191 -0
  118. package/esm2022/staging/wireframe/wireframe.mjs +224 -0
  119. package/esm2022/utils/angular-three-soba-utils.mjs +5 -0
  120. package/esm2022/utils/content/content.mjs +15 -0
  121. package/esm2022/utils/index.mjs +2 -0
  122. package/fesm2022/angular-three-soba-abstractions.mjs +505 -2087
  123. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  124. package/fesm2022/angular-three-soba-cameras.mjs +302 -259
  125. package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
  126. package/fesm2022/angular-three-soba-controls.mjs +93 -88
  127. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  128. package/fesm2022/angular-three-soba-loaders.mjs +94 -90
  129. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
  130. package/fesm2022/angular-three-soba-materials.mjs +655 -590
  131. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  132. package/fesm2022/angular-three-soba-misc.mjs +2198 -89
  133. package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
  134. package/fesm2022/angular-three-soba-modifiers.mjs +71 -0
  135. package/fesm2022/angular-three-soba-modifiers.mjs.map +1 -0
  136. package/fesm2022/angular-three-soba-performances.mjs +697 -0
  137. package/fesm2022/angular-three-soba-performances.mjs.map +1 -0
  138. package/fesm2022/angular-three-soba-shaders.mjs +501 -264
  139. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
  140. package/fesm2022/angular-three-soba-staging.mjs +2870 -2555
  141. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  142. package/fesm2022/angular-three-soba-utils.mjs +22 -0
  143. package/fesm2022/angular-three-soba-utils.mjs.map +1 -0
  144. package/loaders/gltf-loader/gltf-loader.d.ts +4 -3
  145. package/loaders/loader/loader.d.ts +19 -17
  146. package/loaders/progress/progress.d.ts +1 -1
  147. package/loaders/texture-loader/texture-loader.d.ts +2 -2
  148. package/materials/index.d.ts +1 -0
  149. package/materials/mesh-distort-material/mesh-distort-material.d.ts +25 -15
  150. package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +74 -56
  151. package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +33 -21
  152. package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +55 -39
  153. package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +19 -10
  154. package/materials/point-material/point-material.d.ts +24 -0
  155. package/metadata.json +1 -0
  156. package/misc/animations/animations.d.ts +6 -4
  157. package/misc/caustics/caustics.d.ts +87 -0
  158. package/misc/decal/decal.d.ts +49 -0
  159. package/misc/depth-buffer/depth-buffer.d.ts +2 -2
  160. package/misc/example/example.d.ts +81 -0
  161. package/misc/fbo/fbo.d.ts +2 -2
  162. package/misc/html/html-wrapper.d.ts +559 -0
  163. package/misc/html/html.d.ts +214 -0
  164. package/misc/index.d.ts +9 -0
  165. package/misc/sampler/sampler.d.ts +67 -0
  166. package/misc/shadow/shadow.d.ts +37 -0
  167. package/misc/stats-gl/stats-gl.d.ts +24 -0
  168. package/misc/trail/trail.d.ts +57 -0
  169. package/misc/trail-texture/inject-trail-texture.d.ts +9 -0
  170. package/misc/trail-texture/trail-texture.d.ts +50 -0
  171. package/modifiers/README.md +3 -0
  172. package/modifiers/curve-modifier/curve-modifier.d.ts +23 -0
  173. package/modifiers/index.d.ts +1 -0
  174. package/package.json +30 -22
  175. package/performances/README.md +3 -0
  176. package/performances/adaptive-dpr/adaptive-dpr.d.ts +14 -0
  177. package/{performance/adaptive → performances/adaptive-events}/adaptive-events.d.ts +3 -0
  178. package/performances/index.d.ts +5 -0
  179. package/performances/points/points-input.d.ts +32 -0
  180. package/performances/points/points.d.ts +92 -0
  181. package/{performance/instances/position-mesh.d.ts → performances/points/position-point.d.ts} +4 -3
  182. package/performances/segments/segment-object.d.ts +7 -0
  183. package/performances/segments/segments.d.ts +124 -0
  184. package/shaders/grid-material/grid-material.d.ts +33 -0
  185. package/shaders/index.d.ts +4 -2
  186. package/shaders/mesh-distort-material/mesh-distort-material.d.ts +146 -1
  187. package/shaders/mesh-transmission-material/mesh-transmission-material.d.ts +1 -1
  188. package/shaders/shader-material/shader-material.d.ts +2 -2
  189. package/shaders/soft-shadow-material/soft-shadow-material.d.ts +10 -1
  190. package/shaders/sparkles-material/sparkles-material.d.ts +15 -1
  191. package/shaders/spot-light-material/spot-light-material.d.ts +11 -2
  192. package/shaders/star-field-material/star-field-material.d.ts +11 -1
  193. package/shaders/wireframe-material/wireframe-material.d.ts +58 -0
  194. package/staging/accumulative-shadows/accumulative-shadows.d.ts +89 -39
  195. package/staging/accumulative-shadows/randomized-lights.d.ts +40 -27
  196. package/staging/backdrop/backdrop.d.ts +30 -0
  197. package/staging/bb-anchor/bb-anchor.d.ts +27 -0
  198. package/staging/bounds/bounds.d.ts +100 -24
  199. package/staging/camera-shake/camera-shake.d.ts +30 -19
  200. package/staging/center/center.d.ts +43 -35
  201. package/staging/cloud/cloud.d.ts +26 -23
  202. package/staging/contact-shadows/contact-shadows.d.ts +41 -28
  203. package/staging/environment/assets.d.ts +9 -9
  204. package/staging/environment/environment-cube.d.ts +9 -5
  205. package/staging/environment/environment-ground.d.ts +7 -7
  206. package/staging/environment/environment-input.d.ts +36 -36
  207. package/staging/environment/environment-map.d.ts +10 -5
  208. package/staging/environment/environment-portal.d.ts +10 -5
  209. package/staging/environment/environment.d.ts +0 -4
  210. package/staging/environment/utils.d.ts +2 -2
  211. package/staging/float/float.d.ts +14 -10
  212. package/staging/index.d.ts +6 -2
  213. package/staging/matcap-texture/matcap-texture.d.ts +13 -0
  214. package/staging/normal-texture/normal-texture.d.ts +16 -0
  215. package/staging/sky/sky.d.ts +28 -21
  216. package/staging/sparkles/sparkles.d.ts +35 -21
  217. package/staging/spot-light/shadow-mesh-input.d.ts +29 -0
  218. package/staging/spot-light/shadow-mesh.d.ts +37 -0
  219. package/staging/spot-light/spot-light-input.d.ts +25 -25
  220. package/staging/spot-light/spot-light.d.ts +31 -15
  221. package/staging/spot-light/volumetric-mesh.d.ts +15 -9
  222. package/staging/stage/stage.d.ts +88 -63
  223. package/staging/stars/stars.d.ts +27 -16
  224. package/staging/wireframe/wireframe-input.d.ts +65 -0
  225. package/staging/wireframe/wireframe.d.ts +28 -0
  226. package/utils/README.md +3 -0
  227. package/utils/content/content.d.ts +8 -0
  228. package/utils/index.d.ts +1 -0
  229. package/web-types.json +1 -0
  230. package/abstractions/catmull-rom-line/catmull-rom-line.d.ts +0 -25
  231. package/abstractions/cubic-bezier-line/cubic-bezier-line.d.ts +0 -25
  232. package/abstractions/gizmo-helper/gizmo-helper.d.ts +0 -34
  233. package/abstractions/gizmo-helper/gizmo-viewcube/constants.d.ts +0 -12
  234. package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +0 -22
  235. package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +0 -30
  236. package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +0 -32
  237. package/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +0 -14
  238. package/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +0 -47
  239. package/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +0 -40
  240. package/abstractions/line/line-input.d.ts +0 -42
  241. package/abstractions/line/line.d.ts +0 -35
  242. package/abstractions/quadratic-bezier-line/quadratic-bezier-line.d.ts +0 -23
  243. package/esm2022/abstractions/catmull-rom-line/catmull-rom-line.mjs +0 -131
  244. package/esm2022/abstractions/cubic-bezier-line/cubic-bezier-line.mjs +0 -113
  245. package/esm2022/abstractions/gizmo-helper/gizmo-helper.mjs +0 -210
  246. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/constants.mjs +0 -31
  247. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -95
  248. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -155
  249. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -62
  250. package/esm2022/abstractions/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +0 -80
  251. package/esm2022/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -206
  252. package/esm2022/abstractions/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +0 -273
  253. package/esm2022/abstractions/line/line-input.mjs +0 -113
  254. package/esm2022/abstractions/line/line.mjs +0 -165
  255. package/esm2022/abstractions/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -128
  256. package/esm2022/performance/adaptive/adaptive-dpr.mjs +0 -46
  257. package/esm2022/performance/adaptive/adaptive-events.mjs +0 -31
  258. package/esm2022/performance/angular-three-soba-performance.mjs +0 -5
  259. package/esm2022/performance/detailed/detailed.mjs +0 -61
  260. package/esm2022/performance/index.mjs +0 -7
  261. package/esm2022/performance/instances/instance.mjs +0 -48
  262. package/esm2022/performance/instances/instances.mjs +0 -189
  263. package/esm2022/performance/instances/position-mesh.mjs +0 -52
  264. package/esm2022/performance/stats/stats.mjs +0 -79
  265. package/esm2022/shaders/caustics-material/caustics-material.mjs +0 -128
  266. package/esm2022/shaders/caustics-material/caustics-projection-material.mjs +0 -33
  267. package/esm2022/staging/caustics/caustisc.mjs +0 -384
  268. package/esm2022/staging/spot-light/spot-light-shadow-mesh-input.mjs +0 -57
  269. package/esm2022/staging/spot-light/spot-light-shadow-mesh.mjs +0 -258
  270. package/fesm2022/angular-three-soba-performance.mjs +0 -487
  271. package/fesm2022/angular-three-soba-performance.mjs.map +0 -1
  272. package/performance/README.md +0 -3
  273. package/performance/adaptive/adaptive-dpr.d.ts +0 -8
  274. package/performance/detailed/detailed.d.ts +0 -20
  275. package/performance/index.d.ts +0 -6
  276. package/performance/instances/instance.d.ts +0 -9
  277. package/performance/instances/instances.d.ts +0 -35
  278. package/performance/stats/stats.d.ts +0 -18
  279. package/plugin/generators.json +0 -19
  280. package/plugin/libs/plugin/README.md +0 -11
  281. package/plugin/package.json +0 -9
  282. package/plugin/src/generators/init/compat.d.ts +0 -2
  283. package/plugin/src/generators/init/compat.js +0 -6
  284. package/plugin/src/generators/init/compat.js.map +0 -1
  285. package/plugin/src/generators/init/init.d.ts +0 -7
  286. package/plugin/src/generators/init/init.js +0 -28
  287. package/plugin/src/generators/init/init.js.map +0 -1
  288. package/plugin/src/generators/init/schema.json +0 -6
  289. package/plugin/src/index.d.ts +0 -1
  290. package/plugin/src/index.js +0 -6
  291. package/plugin/src/index.js.map +0 -1
  292. package/staging/caustics/caustisc.d.ts +0 -70
  293. package/staging/spot-light/spot-light-shadow-mesh-input.d.ts +0 -29
  294. package/staging/spot-light/spot-light-shadow-mesh.d.ts +0 -38
  295. /package/shaders/{caustics-material → caustics}/caustics-material.d.ts +0 -0
  296. /package/shaders/{caustics-material → caustics}/caustics-projection-material.d.ts +0 -0
@@ -0,0 +1,478 @@
1
+ var _a;
2
+ import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
3
+ import { Component, ElementRef, TemplateRef, ViewChild, ViewContainerRef, computed, effect, inject, untracked, } from '@angular/core';
4
+ import { HTML, injectBeforeRender, injectNgtStore, is, safeDetectChanges } from 'angular-three';
5
+ import * as THREE from 'three';
6
+ import { injectNgtsHtmlInputs } from './html';
7
+ import * as i0 from "@angular/core";
8
+ const v1 = new THREE.Vector3();
9
+ const v2 = new THREE.Vector3();
10
+ const v3 = new THREE.Vector3();
11
+ export function defaultCalculatePosition(el, camera, size) {
12
+ const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
13
+ objectPos.project(camera);
14
+ const widthHalf = size.width / 2;
15
+ const heightHalf = size.height / 2;
16
+ return [objectPos.x * widthHalf + widthHalf, -(objectPos.y * heightHalf) + heightHalf];
17
+ }
18
+ function isObjectBehindCamera(el, camera) {
19
+ const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
20
+ const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
21
+ const deltaCamObj = objectPos.sub(cameraPos);
22
+ const camDir = camera.getWorldDirection(v3);
23
+ return deltaCamObj.angleTo(camDir) > Math.PI / 2;
24
+ }
25
+ function isObjectVisible(el, camera, raycaster, occlude) {
26
+ const elPos = v1.setFromMatrixPosition(el.matrixWorld);
27
+ const screenPos = elPos.clone();
28
+ screenPos.project(camera);
29
+ raycaster.setFromCamera(screenPos, camera);
30
+ const intersects = raycaster.intersectObjects(occlude, true);
31
+ if (intersects.length) {
32
+ const intersectionDistance = intersects[0].distance;
33
+ const pointDistance = elPos.distanceTo(raycaster.ray.origin);
34
+ return pointDistance < intersectionDistance;
35
+ }
36
+ return true;
37
+ }
38
+ function objectScale(el, camera) {
39
+ if (camera instanceof THREE.OrthographicCamera) {
40
+ return camera.zoom;
41
+ }
42
+ else if (camera instanceof THREE.PerspectiveCamera) {
43
+ const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
44
+ const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
45
+ const vFOV = (camera.fov * Math.PI) / 180;
46
+ const dist = objectPos.distanceTo(cameraPos);
47
+ const scaleFOV = 2 * Math.tan(vFOV / 2) * dist;
48
+ return 1 / scaleFOV;
49
+ }
50
+ else {
51
+ return 1;
52
+ }
53
+ }
54
+ function objectZIndex(el, camera, zIndexRange) {
55
+ if (camera instanceof THREE.PerspectiveCamera || camera instanceof THREE.OrthographicCamera) {
56
+ const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
57
+ const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
58
+ const dist = objectPos.distanceTo(cameraPos);
59
+ const A = (zIndexRange[1] - zIndexRange[0]) / (camera.far - camera.near);
60
+ const B = zIndexRange[1] - A * camera.far;
61
+ return Math.round(A * dist + B);
62
+ }
63
+ return undefined;
64
+ }
65
+ const epsilon = (value) => (Math.abs(value) < 1e-10 ? 0 : value);
66
+ function getCSSMatrix(matrix, multipliers, prepend = '') {
67
+ let matrix3d = 'matrix3d(';
68
+ for (let i = 0; i !== 16; i++) {
69
+ matrix3d += epsilon(multipliers[i] * matrix.elements[i]) + (i !== 15 ? ',' : ')');
70
+ }
71
+ return prepend + matrix3d;
72
+ }
73
+ const getCameraCSSMatrix = ((multipliers) => {
74
+ return (matrix) => getCSSMatrix(matrix, multipliers);
75
+ })([1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1]);
76
+ const getObjectCSSMatrix = ((scaleMultipliers) => {
77
+ return (matrix, factor) => getCSSMatrix(matrix, scaleMultipliers(factor), 'translate(-50%,-50%)');
78
+ })((f) => [1 / f, 1 / f, 1 / f, 1, -1 / f, -1 / f, -1 / f, -1, 1 / f, 1 / f, 1 / f, 1, 1, 1, 1, 1]);
79
+ export class NgtsHtmlWrapper {
80
+ static { _a = HTML; }
81
+ static { this[_a] = true; }
82
+ constructor() {
83
+ this.htmlInputs = injectNgtsHtmlInputs();
84
+ this.store = injectNgtStore();
85
+ this.gl = this.store.select('gl');
86
+ this.connected = this.store.select('events', 'connected', { equal: Object.is });
87
+ this.viewport = this.store.select('viewport');
88
+ this.scene = this.store.select('scene');
89
+ this.camera = this.store.select('camera');
90
+ this.size = this.store.select('size');
91
+ this.raycaster = this.store.select('raycaster');
92
+ this.isMeshSizeSet = false;
93
+ this.document = inject(DOCUMENT);
94
+ this.vcr = inject(ViewContainerRef);
95
+ this.portalElement = computed(() => {
96
+ const portal = this.htmlInputs.portal();
97
+ if (!portal)
98
+ return null;
99
+ return is.ref(portal) ? portal.nativeElement : portal;
100
+ });
101
+ this.element = computed(() => this.document.createElement(this.htmlInputs.as()));
102
+ this.target = computed(() => {
103
+ const portalElement = this.portalElement();
104
+ if (portalElement)
105
+ return portalElement;
106
+ const connected = this.connected();
107
+ if (connected)
108
+ return connected;
109
+ return this.gl().domElement.parentElement;
110
+ });
111
+ this.styles = computed(() => {
112
+ const [style, center, transform, size, fullscreen] = [
113
+ this.htmlInputs.style(),
114
+ this.htmlInputs.center(),
115
+ this.htmlInputs.transform(),
116
+ this.size(),
117
+ this.htmlInputs.fullscreen(),
118
+ ];
119
+ if (transform) {
120
+ return {
121
+ position: 'absolute',
122
+ top: 0,
123
+ left: 0,
124
+ width: size.width,
125
+ height: size.height,
126
+ transformStyle: 'preserve-3d',
127
+ pointerEvents: 'none',
128
+ };
129
+ }
130
+ return {
131
+ position: 'absolute',
132
+ transform: center ? 'translate3d(-50%,-50%,0)' : 'none',
133
+ ...(fullscreen && {
134
+ top: -size.height / 2,
135
+ left: -size.width / 2,
136
+ width: size.width,
137
+ height: size.height,
138
+ }),
139
+ ...(style || {}),
140
+ };
141
+ });
142
+ this.transformInnerStyles = computed(() => ({ position: 'absolute', pointerEvents: this.htmlInputs.pointerEvents() }));
143
+ this.setCanvasElementStyle();
144
+ this.appendElement();
145
+ this.setWrapperClass();
146
+ this.render();
147
+ this.beforeRender();
148
+ }
149
+ setCanvasElementStyle() {
150
+ effect(() => {
151
+ const el = untracked(this.gl).domElement;
152
+ const occlude = this.htmlInputs.occlude();
153
+ if (occlude && occlude === 'blending') {
154
+ el.style.zIndex = `${Math.floor(untracked(this.htmlInputs.zIndexRange)[0] / 2)}`;
155
+ el.style.position = 'absolute';
156
+ el.style.pointerEvents = 'none';
157
+ }
158
+ else {
159
+ el.style.zIndex = null;
160
+ el.style.position = null;
161
+ el.style.pointerEvents = null;
162
+ }
163
+ });
164
+ }
165
+ appendElement() {
166
+ effect((onCleanup) => {
167
+ const [group, element] = [this.htmlInputs.groupRef.nativeElement, this.element()];
168
+ if (group && element) {
169
+ const [target, transform, scene, camera, size, calculatePosition, prepend] = [
170
+ this.target(),
171
+ this.htmlInputs.transform(),
172
+ untracked(this.scene),
173
+ untracked(this.camera),
174
+ untracked(this.size),
175
+ untracked(this.htmlInputs.calculatePosition),
176
+ untracked(this.htmlInputs.prepend),
177
+ ];
178
+ scene.updateMatrixWorld();
179
+ if (transform) {
180
+ element.style.cssText = `position:absolute;top:0;left:0;pointer-events:none;overflow:hidden;`;
181
+ }
182
+ else {
183
+ const vec = calculatePosition(group, camera, size);
184
+ element.style.cssText = `position:absolute;top:0;left:0;transform:translate3d(${vec[0]}px,${vec[1]}px,0);transform-origin:0 0;`;
185
+ }
186
+ if (target) {
187
+ if (prepend)
188
+ target.prepend(element);
189
+ else
190
+ target.appendChild(element);
191
+ }
192
+ onCleanup(() => {
193
+ if (target)
194
+ target.removeChild(element);
195
+ this.vcr.clear();
196
+ });
197
+ }
198
+ });
199
+ }
200
+ setWrapperClass() {
201
+ effect(() => {
202
+ const [element, wrapperClass] = [this.element(), this.htmlInputs.wrapperClass()];
203
+ if (element && wrapperClass) {
204
+ element.className = wrapperClass;
205
+ }
206
+ });
207
+ }
208
+ render() {
209
+ effect((onCleanup) => {
210
+ const [{ transform }, element, content] = [
211
+ this.htmlInputs.state(),
212
+ this.element(),
213
+ this.htmlInputs.content(),
214
+ ];
215
+ if (element) {
216
+ this.isMeshSizeSet = false;
217
+ const params = transform
218
+ ? [this.transformTemplate, {}]
219
+ : [this.renderTemplate, { styles: this.styles }];
220
+ const ref = this.vcr.createEmbeddedView(...params);
221
+ if (ref.rootNodes?.[0]) {
222
+ if (element.hasChildNodes()) {
223
+ element.replaceChildren(...ref.rootNodes);
224
+ }
225
+ else {
226
+ element.append(...ref.rootNodes);
227
+ }
228
+ }
229
+ safeDetectChanges(ref);
230
+ let contentRef;
231
+ let contentParent;
232
+ /**
233
+ * NOTE: utilizing rAF here so that renderAnchor (ViewContainerRef) has a chance to be resolved
234
+ * TODO: Another approach is to call render() in ngOnInit and pass in an injector to the effect
235
+ */
236
+ const rAF = requestAnimationFrame(() => {
237
+ if (content && this.renderAnchor) {
238
+ contentRef = this.renderAnchor.createEmbeddedView(content);
239
+ contentParent = ref.rootNodes[0].lastElementChild || ref.rootNodes[0];
240
+ while (contentParent && contentParent.lastElementChild) {
241
+ contentParent = contentParent.lastElementChild;
242
+ }
243
+ if (contentRef.rootNodes?.[0]) {
244
+ if (contentParent.hasChildNodes()) {
245
+ contentParent.replaceChildren(...contentRef.rootNodes);
246
+ }
247
+ else {
248
+ contentParent.append(...contentRef.rootNodes);
249
+ }
250
+ }
251
+ safeDetectChanges(contentRef);
252
+ }
253
+ });
254
+ onCleanup(() => {
255
+ cancelAnimationFrame(rAF);
256
+ if (contentRef && contentParent) {
257
+ contentRef.rootNodes.forEach((node) => {
258
+ if (contentParent.hasChildNodes()) {
259
+ contentParent.removeChild(node);
260
+ }
261
+ node.remove();
262
+ });
263
+ contentRef.destroy();
264
+ }
265
+ ref.rootNodes.forEach((node) => {
266
+ if (element.hasChildNodes()) {
267
+ element.removeChild(node);
268
+ }
269
+ node.remove();
270
+ });
271
+ ref.destroy();
272
+ this.renderAnchor?.clear();
273
+ this.vcr.clear();
274
+ });
275
+ }
276
+ });
277
+ }
278
+ beforeRender() {
279
+ let oldPosition = [0, 0];
280
+ let oldZoom = 0;
281
+ let visible = true;
282
+ injectBeforeRender((gl) => {
283
+ const [group, camera, transform, calculatePosition, size, eps, isRayCastOcclusion, occlude, scene, raycaster, element, zIndexRange, sprite, distanceFactor, occlusionMeshRef, geometry, viewport, scale,] = [
284
+ this.htmlInputs.groupRef.nativeElement,
285
+ this.camera(),
286
+ this.htmlInputs.transform(),
287
+ this.htmlInputs.calculatePosition(),
288
+ this.size(),
289
+ this.htmlInputs.eps(),
290
+ this.htmlInputs.isRayCastOcclusion(),
291
+ this.htmlInputs.occlude(),
292
+ this.scene(),
293
+ this.raycaster(),
294
+ this.element(),
295
+ this.htmlInputs.zIndexRange(),
296
+ this.htmlInputs.sprite(),
297
+ this.htmlInputs.distanceFactor(),
298
+ this.htmlInputs.occlusionMeshRef.nativeElement,
299
+ this.htmlInputs.geometry(),
300
+ this.viewport(),
301
+ this.htmlInputs.scale(),
302
+ ];
303
+ if (group && element) {
304
+ camera.updateMatrixWorld();
305
+ group.updateWorldMatrix(true, false);
306
+ const vec = transform ? oldPosition : calculatePosition(group, camera, size);
307
+ if (transform ||
308
+ Math.abs(oldZoom - camera.zoom) > eps ||
309
+ Math.abs(oldPosition[0] - vec[0]) > eps ||
310
+ Math.abs(oldPosition[1] - vec[1]) > eps) {
311
+ const isBehindCamera = isObjectBehindCamera(group, camera);
312
+ let raytraceTarget = false;
313
+ if (isRayCastOcclusion) {
314
+ if (occlude !== 'blending') {
315
+ raytraceTarget = [scene];
316
+ }
317
+ else if (Array.isArray(occlude)) {
318
+ raytraceTarget = occlude.map((item) => (is.ref(item) ? item.nativeElement : item));
319
+ }
320
+ }
321
+ const previouslyVisible = visible;
322
+ if (raytraceTarget) {
323
+ const isVisible = isObjectVisible(group, camera, raycaster, raytraceTarget);
324
+ visible = isVisible && !isBehindCamera;
325
+ }
326
+ else {
327
+ visible = !isBehindCamera;
328
+ }
329
+ if (previouslyVisible !== visible) {
330
+ if (this.htmlInputs.occluded.observed) {
331
+ this.htmlInputs.occluded.emit(!visible);
332
+ }
333
+ else {
334
+ element.style.display = visible ? 'block' : 'none';
335
+ }
336
+ }
337
+ const halfRange = Math.floor(zIndexRange[0] / 2);
338
+ const zRange = occlude
339
+ ? isRayCastOcclusion //
340
+ ? [zIndexRange[0], halfRange]
341
+ : [halfRange - 1, 0]
342
+ : zIndexRange;
343
+ element.style.zIndex = `${objectZIndex(group, camera, zRange)}`;
344
+ if (transform) {
345
+ const [widthHalf, heightHalf] = [size.width / 2, size.height / 2];
346
+ const fov = camera.projectionMatrix.elements[5] * heightHalf;
347
+ const { isOrthographicCamera, top, left, bottom, right } = camera;
348
+ const cameraMatrix = getCameraCSSMatrix(camera.matrixWorldInverse);
349
+ const cameraTransform = isOrthographicCamera
350
+ ? `scale(${fov})translate(${epsilon(-(right + left) / 2)}px,${epsilon((top + bottom) / 2)}px)`
351
+ : `translateZ(${fov}px)`;
352
+ let matrix = group.matrixWorld;
353
+ if (sprite) {
354
+ matrix = camera.matrixWorldInverse
355
+ .clone()
356
+ .transpose()
357
+ .copyPosition(matrix)
358
+ .scale(group.scale);
359
+ matrix.elements[3] = matrix.elements[7] = matrix.elements[11] = 0;
360
+ matrix.elements[15] = 1;
361
+ }
362
+ element.style.width = size.width + 'px';
363
+ element.style.height = size.height + 'px';
364
+ element.style.perspective = isOrthographicCamera ? '' : `${fov}px`;
365
+ if (this.outerDiv?.nativeElement && this.innerDiv?.nativeElement) {
366
+ this.outerDiv.nativeElement.style.width = size.width + 'px';
367
+ this.outerDiv.nativeElement.style.height = size.height + 'px';
368
+ this.outerDiv.nativeElement.style.transform = `${cameraTransform}${cameraMatrix}translate(${widthHalf}px,${heightHalf}px)`;
369
+ this.innerDiv.nativeElement.style.transform = getObjectCSSMatrix(matrix, 1 / ((distanceFactor || 10) / 400));
370
+ }
371
+ }
372
+ else {
373
+ const scale = distanceFactor === undefined ? 1 : objectScale(group, camera) * distanceFactor;
374
+ element.style.transform = `translate3d(${vec[0]}px,${vec[1]}px,0) scale(${scale})`;
375
+ }
376
+ oldPosition = vec;
377
+ oldZoom = camera.zoom;
378
+ }
379
+ }
380
+ if (!isRayCastOcclusion && occlusionMeshRef && !this.isMeshSizeSet) {
381
+ if (transform) {
382
+ if (this.outerDiv?.nativeElement) {
383
+ const el = this.outerDiv.nativeElement.children[0];
384
+ if (el?.clientWidth && el?.clientHeight) {
385
+ const { isOrthographicCamera } = camera;
386
+ if (isOrthographicCamera || geometry) {
387
+ if (scale !== 1) {
388
+ if (!Array.isArray(scale)) {
389
+ occlusionMeshRef.scale.setScalar(1 / scale);
390
+ }
391
+ else if (scale instanceof THREE.Vector3) {
392
+ occlusionMeshRef.scale.copy(scale.clone().divideScalar(1));
393
+ }
394
+ else {
395
+ occlusionMeshRef.scale.set(1 / scale[0], 1 / scale[1], 1 / scale[2]);
396
+ }
397
+ }
398
+ }
399
+ else {
400
+ const ratio = (distanceFactor || 10) / 400;
401
+ const w = el.clientWidth * ratio;
402
+ const h = el.clientHeight * ratio;
403
+ occlusionMeshRef.scale.set(w, h, 1);
404
+ }
405
+ this.isMeshSizeSet = true;
406
+ }
407
+ }
408
+ }
409
+ else {
410
+ const ele = element.children[0];
411
+ if (ele?.clientWidth && ele?.clientHeight) {
412
+ const ratio = 1 / viewport.factor;
413
+ const w = ele.clientWidth * ratio;
414
+ const h = ele.clientHeight * ratio;
415
+ occlusionMeshRef.scale.set(w, h, 1);
416
+ this.isMeshSizeSet = true;
417
+ }
418
+ occlusionMeshRef.lookAt(gl.camera.position);
419
+ }
420
+ }
421
+ });
422
+ }
423
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtsHtmlWrapper, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
424
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NgtsHtmlWrapper, isStandalone: true, selector: "ngts-html-wrapper", viewQueries: [{ propertyName: "transformTemplate", first: true, predicate: ["transformTemplate"], descendants: true, static: true }, { propertyName: "renderTemplate", first: true, predicate: ["renderTemplate"], descendants: true, static: true }, { propertyName: "outerDiv", first: true, predicate: ["transformedOuterDiv"], descendants: true }, { propertyName: "innerDiv", first: true, predicate: ["transformedInnerDiv"], descendants: true }, { propertyName: "renderAnchor", first: true, predicate: ["renderAnchor"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
425
+ <ng-template #transformTemplate>
426
+ <div #transformedOuterDiv [style]="styles()">
427
+ <div #transformedInnerDiv [style]="transformInnerStyles()">
428
+ <ng-container *ngTemplateOutlet="renderTemplate; context: { styles: htmlInputs.style }" />
429
+ </div>
430
+ </div>
431
+ </ng-template>
432
+
433
+ <ng-template #renderTemplate let-renderedStyles="styles">
434
+ <div #renderedDiv [class]="htmlInputs.renderedDivClass()" [style]="renderedStyles()">
435
+ <ng-container #renderAnchor />
436
+ </div>
437
+ </ng-template>
438
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
439
+ }
440
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtsHtmlWrapper, decorators: [{
441
+ type: Component,
442
+ args: [{
443
+ selector: 'ngts-html-wrapper',
444
+ standalone: true,
445
+ template: `
446
+ <ng-template #transformTemplate>
447
+ <div #transformedOuterDiv [style]="styles()">
448
+ <div #transformedInnerDiv [style]="transformInnerStyles()">
449
+ <ng-container *ngTemplateOutlet="renderTemplate; context: { styles: htmlInputs.style }" />
450
+ </div>
451
+ </div>
452
+ </ng-template>
453
+
454
+ <ng-template #renderTemplate let-renderedStyles="styles">
455
+ <div #renderedDiv [class]="htmlInputs.renderedDivClass()" [style]="renderedStyles()">
456
+ <ng-container #renderAnchor />
457
+ </div>
458
+ </ng-template>
459
+ `,
460
+ imports: [NgTemplateOutlet],
461
+ }]
462
+ }], ctorParameters: function () { return []; }, propDecorators: { transformTemplate: [{
463
+ type: ViewChild,
464
+ args: ['transformTemplate', { static: true }]
465
+ }], renderTemplate: [{
466
+ type: ViewChild,
467
+ args: ['renderTemplate', { static: true }]
468
+ }], outerDiv: [{
469
+ type: ViewChild,
470
+ args: ['transformedOuterDiv']
471
+ }], innerDiv: [{
472
+ type: ViewChild,
473
+ args: ['transformedInnerDiv']
474
+ }], renderAnchor: [{
475
+ type: ViewChild,
476
+ args: ['renderAnchor', { read: ViewContainerRef }]
477
+ }] } });
478
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC13cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL21pc2Mvc3JjL2h0bWwvaHRtbC13cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBRVYsV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxRQUFRLENBQUM7O0FBRTlDLE1BQU0sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQy9CLE1BQU0sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQy9CLE1BQU0sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBRS9CLE1BQU0sVUFBVSx3QkFBd0IsQ0FDdkMsRUFBa0IsRUFDbEIsTUFBb0IsRUFDcEIsSUFBdUM7SUFFdkMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRCxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFN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LEVBQUUsSUFBSSxFQUFFO2dCQUVYLFFBQVE7c0JBQXpDLFNBQVM7dUJBQUMscUJBQXFCO2dCQUNFLFFBQVE7c0JBQXpDLFNBQVM7dUJBQUMscUJBQXFCO2dCQUN1QixZQUFZO3NCQUFsRSxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5ULCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0RWxlbWVudFJlZixcblx0RW1iZWRkZWRWaWV3UmVmLFxuXHRUZW1wbGF0ZVJlZixcblx0Vmlld0NoaWxkLFxuXHRWaWV3Q29udGFpbmVyUmVmLFxuXHRjb21wdXRlZCxcblx0ZWZmZWN0LFxuXHRpbmplY3QsXG5cdHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIVE1MLCBpbmplY3RCZWZvcmVSZW5kZXIsIGluamVjdE5ndFN0b3JlLCBpcywgc2FmZURldGVjdENoYW5nZXMgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IGluamVjdE5ndHNIdG1sSW5wdXRzIH0gZnJvbSAnLi9odG1sJztcblxuY29uc3QgdjEgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuY29uc3QgdjIgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuY29uc3QgdjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdENhbGN1bGF0ZVBvc2l0aW9uKFxuXHRlbDogVEhSRUUuT2JqZWN0M0QsXG5cdGNhbWVyYTogVEhSRUUuQ2FtZXJhLFxuXHRzaXplOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0sXG4pIHtcblx0Y29uc3Qgb2JqZWN0UG9zID0gdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGVsLm1hdHJpeFdvcmxkKTtcblx0b2JqZWN0UG9zLnByb2plY3QoY2FtZXJhKTtcblx0Y29uc3Qgd2lkdGhIYWxmID0gc2l6ZS53aWR0aCAvIDI7XG5cdGNvbnN0IGhlaWdodEhhbGYgPSBzaXplLmhlaWdodCAvIDI7XG5cdHJldHVybiBbb2JqZWN0UG9zLnggKiB3aWR0aEhhbGYgKyB3aWR0aEhhbGYsIC0ob2JqZWN0UG9zLnkgKiBoZWlnaHRIYWxmKSArIGhlaWdodEhhbGZdO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdEJlaGluZENhbWVyYShlbDogVEhSRUUuT2JqZWN0M0QsIGNhbWVyYTogVEhSRUUuQ2FtZXJhKSB7XG5cdGNvbnN0IG9iamVjdFBvcyA9IHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbihlbC5tYXRyaXhXb3JsZCk7XG5cdGNvbnN0IGNhbWVyYVBvcyA9IHYyLnNldEZyb21NYXRyaXhQb3NpdGlvbihjYW1lcmEubWF0cml4V29ybGQpO1xuXHRjb25zdCBkZWx0YUNhbU9iaiA9IG9iamVjdFBvcy5zdWIoY2FtZXJhUG9zKTtcblx0Y29uc3QgY2FtRGlyID0gY2FtZXJhLmdldFdvcmxkRGlyZWN0aW9uKHYzKTtcblx0cmV0dXJuIGRlbHRhQ2FtT2JqLmFuZ2xlVG8oY2FtRGlyKSA+IE1hdGguUEkgLyAyO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdFZpc2libGUoXG5cdGVsOiBUSFJFRS5PYmplY3QzRCxcblx0Y2FtZXJhOiBUSFJFRS5DYW1lcmEsXG5cdHJheWNhc3RlcjogVEhSRUUuUmF5Y2FzdGVyLFxuXHRvY2NsdWRlOiBUSFJFRS5PYmplY3QzRFtdLFxuKSB7XG5cdGNvbnN0IGVsUG9zID0gdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGVsLm1hdHJpeFdvcmxkKTtcblx0Y29uc3Qgc2NyZWVuUG9zID0gZWxQb3MuY2xvbmUoKTtcblx0c2NyZWVuUG9zLnByb2plY3QoY2FtZXJhKTtcblx0cmF5Y2FzdGVyLnNldEZyb21DYW1lcmEoc2NyZWVuUG9zIGFzIGFueSwgY2FtZXJhKTtcblx0Y29uc3QgaW50ZXJzZWN0cyA9IHJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKG9jY2x1ZGUsIHRydWUpO1xuXHRpZiAoaW50ZXJzZWN0cy5sZW5ndGgpIHtcblx0XHRjb25zdCBpbnRlcnNlY3Rpb25EaXN0YW5jZSA9IGludGVyc2VjdHNbMF0uZGlzdGFuY2U7XG5cdFx0Y29uc3QgcG9pbnREaXN0YW5jZSA9IGVsUG9zLmRpc3RhbmNlVG8ocmF5Y2FzdGVyLnJheS5vcmlnaW4pO1xuXHRcdHJldHVybiBwb2ludERpc3RhbmNlIDwgaW50ZXJzZWN0aW9uRGlzdGFuY2U7XG5cdH1cblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG9iamVjdFNjYWxlKGVsOiBUSFJFRS5PYmplY3QzRCwgY2FtZXJhOiBUSFJFRS5DYW1lcmEpIHtcblx0aWYgKGNhbWVyYSBpbnN0YW5jZW9mIFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuXHRcdHJldHVybiBjYW1lcmEuem9vbTtcblx0fSBlbHNlIGlmIChjYW1lcmEgaW5zdGFuY2VvZiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSkge1xuXHRcdGNvbnN0IG9iamVjdFBvcyA9IHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbihlbC5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgY2FtZXJhUG9zID0gdjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNhbWVyYS5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgdkZPViA9IChjYW1lcmEuZm92ICogTWF0aC5QSSkgLyAxODA7XG5cdFx0Y29uc3QgZGlzdCA9IG9iamVjdFBvcy5kaXN0YW5jZVRvKGNhbWVyYVBvcyk7XG5cdFx0Y29uc3Qgc2NhbGVGT1YgPSAyICogTWF0aC50YW4odkZPViAvIDIpICogZGlzdDtcblx0XHRyZXR1cm4gMSAvIHNjYWxlRk9WO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiAxO1xuXHR9XG59XG5cbmZ1bmN0aW9uIG9iamVjdFpJbmRleChlbDogVEhSRUUuT2JqZWN0M0QsIGNhbWVyYTogVEhSRUUuQ2FtZXJhLCB6SW5kZXhSYW5nZTogQXJyYXk8bnVtYmVyPikge1xuXHRpZiAoY2FtZXJhIGluc3RhbmNlb2YgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEgfHwgY2FtZXJhIGluc3RhbmNlb2YgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhKSB7XG5cdFx0Y29uc3Qgb2JqZWN0UG9zID0gdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGVsLm1hdHJpeFdvcmxkKTtcblx0XHRjb25zdCBjYW1lcmFQb3MgPSB2Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oY2FtZXJhLm1hdHJpeFdvcmxkKTtcblx0XHRjb25zdCBkaXN0ID0gb2JqZWN0UG9zLmRpc3RhbmNlVG8oY2FtZXJhUG9zKTtcblx0XHRjb25zdCBBID0gKHpJbmRleFJhbmdlWzFdIC0gekluZGV4UmFuZ2VbMF0pIC8gKGNhbWVyYS5mYXIgLSBjYW1lcmEubmVhcik7XG5cdFx0Y29uc3QgQiA9IHpJbmRleFJhbmdlWzFdIC0gQSAqIGNhbWVyYS5mYXI7XG5cdFx0cmV0dXJuIE1hdGgucm91bmQoQSAqIGRpc3QgKyBCKTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5jb25zdCBlcHNpbG9uID0gKHZhbHVlOiBudW1iZXIpID0+IChNYXRoLmFicyh2YWx1ZSkgPCAxZS0xMCA/IDAgOiB2YWx1ZSk7XG5cbmZ1bmN0aW9uIGdldENTU01hdHJpeChtYXRyaXg6IFRIUkVFLk1hdHJpeDQsIG11bHRpcGxpZXJzOiBudW1iZXJbXSwgcHJlcGVuZCA9ICcnKSB7XG5cdGxldCBtYXRyaXgzZCA9ICdtYXRyaXgzZCgnO1xuXHRmb3IgKGxldCBpID0gMDsgaSAhPT0gMTY7IGkrKykge1xuXHRcdG1hdHJpeDNkICs9IGVwc2lsb24obXVsdGlwbGllcnNbaV0gKiBtYXRyaXguZWxlbWVudHNbaV0pICsgKGkgIT09IDE1ID8gJywnIDogJyknKTtcblx0fVxuXHRyZXR1cm4gcHJlcGVuZCArIG1hdHJpeDNkO1xufVxuXG5jb25zdCBnZXRDYW1lcmFDU1NNYXRyaXggPSAoKG11bHRpcGxpZXJzOiBudW1iZXJbXSkgPT4ge1xuXHRyZXR1cm4gKG1hdHJpeDogVEhSRUUuTWF0cml4NCkgPT4gZ2V0Q1NTTWF0cml4KG1hdHJpeCwgbXVsdGlwbGllcnMpO1xufSkoWzEsIC0xLCAxLCAxLCAxLCAtMSwgMSwgMSwgMSwgLTEsIDEsIDEsIDEsIC0xLCAxLCAxXSk7XG5cbmNvbnN0IGdldE9iamVjdENTU01hdHJpeCA9ICgoc2NhbGVNdWx0aXBsaWVyczogKG46IG51bWJlcikgPT4gbnVtYmVyW10pID0+IHtcblx0cmV0dXJuIChtYXRyaXg6IFRIUkVFLk1hdHJpeDQsIGZhY3RvcjogbnVtYmVyKSA9PlxuXHRcdGdldENTU01hdHJpeChtYXRyaXgsIHNjYWxlTXVsdGlwbGllcnMoZmFjdG9yKSwgJ3RyYW5zbGF0ZSgtNTAlLC01MCUpJyk7XG59KSgoZjogbnVtYmVyKSA9PiBbMSAvIGYsIDEgLyBmLCAxIC8gZiwgMSwgLTEgLyBmLCAtMSAvIGYsIC0xIC8gZiwgLTEsIDEgLyBmLCAxIC8gZiwgMSAvIGYsIDEsIDEsIDEsIDEsIDFdKTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1odG1sLXdyYXBwZXInLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZy10ZW1wbGF0ZSAjdHJhbnNmb3JtVGVtcGxhdGU+XG5cdFx0XHQ8ZGl2ICN0cmFuc2Zvcm1lZE91dGVyRGl2IFtzdHlsZV09XCJzdHlsZXMoKVwiPlxuXHRcdFx0XHQ8ZGl2ICN0cmFuc2Zvcm1lZElubmVyRGl2IFtzdHlsZV09XCJ0cmFuc2Zvcm1Jbm5lclN0eWxlcygpXCI+XG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlbmRlclRlbXBsYXRlOyBjb250ZXh0OiB7IHN0eWxlczogaHRtbElucHV0cy5zdHlsZSB9XCIgLz5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L25nLXRlbXBsYXRlPlxuXG5cdFx0PG5nLXRlbXBsYXRlICNyZW5kZXJUZW1wbGF0ZSBsZXQtcmVuZGVyZWRTdHlsZXM9XCJzdHlsZXNcIj5cblx0XHRcdDxkaXYgI3JlbmRlcmVkRGl2IFtjbGFzc109XCJodG1sSW5wdXRzLnJlbmRlcmVkRGl2Q2xhc3MoKVwiIFtzdHlsZV09XCJyZW5kZXJlZFN0eWxlcygpXCI+XG5cdFx0XHRcdDxuZy1jb250YWluZXIgI3JlbmRlckFuY2hvciAvPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9uZy10ZW1wbGF0ZT5cblx0YCxcblx0aW1wb3J0czogW05nVGVtcGxhdGVPdXRsZXRdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzSHRtbFdyYXBwZXIge1xuXHRzdGF0aWMgW0hUTUxdID0gdHJ1ZTtcblxuXHRodG1sSW5wdXRzID0gaW5qZWN0Tmd0c0h0bWxJbnB1dHMoKTtcblxuXHRAVmlld0NoaWxkKCd0cmFuc2Zvcm1UZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHRyYW5zZm9ybVRlbXBsYXRlITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cdEBWaWV3Q2hpbGQoJ3JlbmRlclRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgcmVuZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuXHRAVmlld0NoaWxkKCd0cmFuc2Zvcm1lZE91dGVyRGl2Jykgb3V0ZXJEaXY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pjtcblx0QFZpZXdDaGlsZCgndHJhbnNmb3JtZWRJbm5lckRpdicpIGlubmVyRGl2PzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cdEBWaWV3Q2hpbGQoJ3JlbmRlckFuY2hvcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSByZW5kZXJBbmNob3I/OiBWaWV3Q29udGFpbmVyUmVmO1xuXG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3ROZ3RTdG9yZSgpO1xuXHRwcml2YXRlIGdsID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2dsJyk7XG5cdHByaXZhdGUgY29ubmVjdGVkID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2V2ZW50cycsICdjb25uZWN0ZWQnLCB7IGVxdWFsOiBPYmplY3QuaXMgfSk7XG5cdHByaXZhdGUgdmlld3BvcnQgPSB0aGlzLnN0b3JlLnNlbGVjdCgndmlld3BvcnQnKTtcblx0cHJpdmF0ZSBzY2VuZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdzY2VuZScpO1xuXHRwcml2YXRlIGNhbWVyYSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdjYW1lcmEnKTtcblx0cHJpdmF0ZSBzaXplID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3NpemUnKTtcblx0cHJpdmF0ZSByYXljYXN0ZXIgPSB0aGlzLnN0b3JlLnNlbGVjdCgncmF5Y2FzdGVyJyk7XG5cblx0cHJpdmF0ZSBpc01lc2hTaXplU2V0ID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG5cdHByaXZhdGUgdmNyID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xuXG5cdHByaXZhdGUgcG9ydGFsRWxlbWVudCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBwb3J0YWwgPSB0aGlzLmh0bWxJbnB1dHMucG9ydGFsKCk7XG5cdFx0aWYgKCFwb3J0YWwpIHJldHVybiBudWxsO1xuXHRcdHJldHVybiBpcy5yZWYocG9ydGFsKSA/IHBvcnRhbC5uYXRpdmVFbGVtZW50IDogcG9ydGFsO1xuXHR9KTtcblxuXHRwcml2YXRlIGVsZW1lbnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5odG1sSW5wdXRzLmFzKCkpIGFzIEhUTUxFbGVtZW50KTtcblx0cHJpdmF0ZSB0YXJnZXQgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcG9ydGFsRWxlbWVudCA9IHRoaXMucG9ydGFsRWxlbWVudCgpO1xuXHRcdGlmIChwb3J0YWxFbGVtZW50KSByZXR1cm4gcG9ydGFsRWxlbWVudDtcblx0XHRjb25zdCBjb25uZWN0ZWQgPSB0aGlzLmNvbm5lY3RlZCgpO1xuXHRcdGlmIChjb25uZWN0ZWQpIHJldHVybiBjb25uZWN0ZWQgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0cmV0dXJuIHRoaXMuZ2woKS5kb21FbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuXHR9KTtcblxuXHRzdHlsZXMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgW3N0eWxlLCBjZW50ZXIsIHRyYW5zZm9ybSwgc2l6ZSwgZnVsbHNjcmVlbl0gPSBbXG5cdFx0XHR0aGlzLmh0bWxJbnB1dHMuc3R5bGUoKSxcblx0XHRcdHRoaXMuaHRtbElucHV0cy5jZW50ZXIoKSxcblx0XHRcdHRoaXMuaHRtbElucHV0cy50cmFuc2Zvcm0oKSxcblx0XHRcdHRoaXMuc2l6ZSgpLFxuXHRcdFx0dGhpcy5odG1sSW5wdXRzLmZ1bGxzY3JlZW4oKSxcblx0XHRdO1xuXG5cdFx0aWYgKHRyYW5zZm9ybSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cG9zaXRpb246ICdhYnNvbHV0ZScsXG5cdFx0XHRcdHRvcDogMCxcblx0XHRcdFx0bGVmdDogMCxcblx0XHRcdFx0d2lkdGg6IHNpemUud2lkdGgsXG5cdFx0XHRcdGhlaWdodDogc2l6ZS5oZWlnaHQsXG5cdFx0XHRcdHRyYW5zZm9ybVN0eWxlOiAncHJlc2VydmUtM2QnLFxuXHRcdFx0XHRwb2ludGVyRXZlbnRzOiAnbm9uZScsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRwb3NpdGlvbjogJ2Fic29sdXRlJyxcblx0XHRcdHRyYW5zZm9ybTogY2VudGVyID8gJ3RyYW5zbGF0ZTNkKC01MCUsLTUwJSwwKScgOiAnbm9uZScsXG5cdFx0XHQuLi4oZnVsbHNjcmVlbiAmJiB7XG5cdFx0XHRcdHRvcDogLXNpemUuaGVpZ2h0IC8gMixcblx0XHRcdFx0bGVmdDogLXNpemUud2lkdGggLyAyLFxuXHRcdFx0XHR3aWR0aDogc2l6ZS53aWR0aCxcblx0XHRcdFx0aGVpZ2h0OiBzaXplLmhlaWdodCxcblx0XHRcdH0pLFxuXHRcdFx0Li4uKHN0eWxlIHx8IHt9KSxcblx0XHR9O1xuXHR9KTtcblx0dHJhbnNmb3JtSW5uZXJTdHlsZXMgPSBjb21wdXRlZCgoKSA9PiAoeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgcG9pbnRlckV2ZW50czogdGhpcy5odG1sSW5wdXRzLnBvaW50ZXJFdmVudHMoKSB9KSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5zZXRDYW52YXNFbGVtZW50U3R5bGUoKTtcblx0XHR0aGlzLmFwcGVuZEVsZW1lbnQoKTtcblx0XHR0aGlzLnNldFdyYXBwZXJDbGFzcygpO1xuXHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0dGhpcy5iZWZvcmVSZW5kZXIoKTtcblx0fVxuXG5cdHByaXZhdGUgc2V0Q2FudmFzRWxlbWVudFN0eWxlKCkge1xuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBlbCA9IHVudHJhY2tlZCh0aGlzLmdsKS5kb21FbGVtZW50ITtcblx0XHRcdGNvbnN0IG9jY2x1ZGUgPSB0aGlzLmh0bWxJbnB1dHMub2NjbHVkZSgpO1xuXHRcdFx0aWYgKG9jY2x1ZGUgJiYgb2NjbHVkZSA9PT0gJ2JsZW5kaW5nJykge1xuXHRcdFx0XHRlbC5zdHlsZS56SW5kZXggPSBgJHtNYXRoLmZsb29yKHVudHJhY2tlZCh0aGlzLmh0bWxJbnB1dHMuekluZGV4UmFuZ2UpWzBdIC8gMil9YDtcblx0XHRcdFx0ZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdFx0XHRlbC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWwuc3R5bGUuekluZGV4ID0gbnVsbCE7XG5cdFx0XHRcdGVsLnN0eWxlLnBvc2l0aW9uID0gbnVsbCE7XG5cdFx0XHRcdGVsLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBudWxsITtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgYXBwZW5kRWxlbWVudCgpIHtcblx0XHRlZmZlY3QoKG9uQ2xlYW51cCkgPT4ge1xuXHRcdFx0Y29uc3QgW2dyb3VwLCBlbGVtZW50XSA9IFt0aGlzLmh0bWxJbnB1dHMuZ3JvdXBSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5lbGVtZW50KCldO1xuXHRcdFx0aWYgKGdyb3VwICYmIGVsZW1lbnQpIHtcblx0XHRcdFx0Y29uc3QgW3RhcmdldCwgdHJhbnNmb3JtLCBzY2VuZSwgY2FtZXJhLCBzaXplLCBjYWxjdWxhdGVQb3NpdGlvbiwgcHJlcGVuZF0gPSBbXG5cdFx0XHRcdFx0dGhpcy50YXJnZXQoKSxcblx0XHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMudHJhbnNmb3JtKCksXG5cdFx0XHRcdFx0dW50cmFja2VkKHRoaXMuc2NlbmUpLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLmNhbWVyYSksXG5cdFx0XHRcdFx0dW50cmFja2VkKHRoaXMuc2l6ZSksXG5cdFx0XHRcdFx0dW50cmFja2VkKHRoaXMuaHRtbElucHV0cy5jYWxjdWxhdGVQb3NpdGlvbiksXG5cdFx0XHRcdFx0dW50cmFja2VkKHRoaXMuaHRtbElucHV0cy5wcmVwZW5kKSxcblx0XHRcdFx0XTtcblx0XHRcdFx0c2NlbmUudXBkYXRlTWF0cml4V29ybGQoKTtcblx0XHRcdFx0aWYgKHRyYW5zZm9ybSkge1xuXHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGBwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7cG9pbnRlci1ldmVudHM6bm9uZTtvdmVyZmxvdzpoaWRkZW47YDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCB2ZWMgPSBjYWxjdWxhdGVQb3NpdGlvbihncm91cCwgY2FtZXJhLCBzaXplKTtcblx0XHRcdFx0XHRlbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgcG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgke3ZlY1swXX1weCwke3ZlY1sxXX1weCwwKTt0cmFuc2Zvcm0tb3JpZ2luOjAgMDtgO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRhcmdldCkge1xuXHRcdFx0XHRcdGlmIChwcmVwZW5kKSB0YXJnZXQucHJlcGVuZChlbGVtZW50KTtcblx0XHRcdFx0XHRlbHNlIHRhcmdldC5hcHBlbmRDaGlsZChlbGVtZW50KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG9uQ2xlYW51cCgoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKHRhcmdldCkgdGFyZ2V0LnJlbW92ZUNoaWxkKGVsZW1lbnQpO1xuXHRcdFx0XHRcdHRoaXMudmNyLmNsZWFyKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBzZXRXcmFwcGVyQ2xhc3MoKSB7XG5cdFx0ZWZmZWN0KCgpID0+IHtcblx0XHRcdGNvbnN0IFtlbGVtZW50LCB3cmFwcGVyQ2xhc3NdID0gW3RoaXMuZWxlbWVudCgpLCB0aGlzLmh0bWxJbnB1dHMud3JhcHBlckNsYXNzKCldO1xuXHRcdFx0aWYgKGVsZW1lbnQgJiYgd3JhcHBlckNsYXNzKSB7XG5cdFx0XHRcdGVsZW1lbnQuY2xhc3NOYW1lID0gd3JhcHBlckNsYXNzO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSByZW5kZXIoKSB7XG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGNvbnN0IFt7IHRyYW5zZm9ybSB9LCBlbGVtZW50LCBjb250ZW50XSA9IFtcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLnN0YXRlKCksXG5cdFx0XHRcdHRoaXMuZWxlbWVudCgpLFxuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMuY29udGVudCgpLFxuXHRcdFx0XTtcblxuXHRcdFx0aWYgKGVsZW1lbnQpIHtcblx0XHRcdFx0dGhpcy5pc01lc2hTaXplU2V0ID0gZmFsc2U7XG5cdFx0XHRcdGNvbnN0IHBhcmFtczogUGFyYW1ldGVyczxWaWV3Q29udGFpbmVyUmVmWydjcmVhdGVFbWJlZGRlZFZpZXcnXT4gPSB0cmFuc2Zvcm1cblx0XHRcdFx0XHQ/IFt0aGlzLnRyYW5zZm9ybVRlbXBsYXRlLCB7fV1cblx0XHRcdFx0XHQ6IFt0aGlzLnJlbmRlclRlbXBsYXRlLCB7IHN0eWxlczogdGhpcy5zdHlsZXMgfV07XG5cblx0XHRcdFx0Y29uc3QgcmVmID0gdGhpcy52Y3IuY3JlYXRlRW1iZWRkZWRWaWV3KC4uLnBhcmFtcyk7XG5cdFx0XHRcdGlmIChyZWYucm9vdE5vZGVzPy5bMF0pIHtcblx0XHRcdFx0XHRpZiAoZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcblx0XHRcdFx0XHRcdGVsZW1lbnQucmVwbGFjZUNoaWxkcmVuKC4uLnJlZi5yb290Tm9kZXMpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRlbGVtZW50LmFwcGVuZCguLi5yZWYucm9vdE5vZGVzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0c2FmZURldGVjdENoYW5nZXMocmVmKTtcblxuXHRcdFx0XHRsZXQgY29udGVudFJlZjogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+O1xuXHRcdFx0XHRsZXQgY29udGVudFBhcmVudDogSFRNTEVsZW1lbnQ7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBOT1RFOiB1dGlsaXppbmcgckFGIGhlcmUgc28gdGhhdCByZW5kZXJBbmNob3IgKFZpZXdDb250YWluZXJSZWYpIGhhcyBhIGNoYW5jZSB0byBiZSByZXNvbHZlZFxuXHRcdFx0XHQgKiBUT0RPOiBBbm90aGVyIGFwcHJvYWNoIGlzIHRvIGNhbGwgcmVuZGVyKCkgaW4gbmdPbkluaXQgYW5kIHBhc3MgaW4gYW4gaW5qZWN0b3IgdG8gdGhlIGVmZmVjdFxuXHRcdFx0XHQgKi9cblx0XHRcdFx0Y29uc3QgckFGID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRcdFx0XHRpZiAoY29udGVudCAmJiB0aGlzLnJlbmRlckFuY2hvcikge1xuXHRcdFx0XHRcdFx0Y29udGVudFJlZiA9IHRoaXMucmVuZGVyQW5jaG9yLmNyZWF0ZUVtYmVkZGVkVmlldyhjb250ZW50KTtcblx0XHRcdFx0XHRcdGNvbnRlbnRQYXJlbnQgPSByZWYucm9vdE5vZGVzWzBdLmxhc3RFbGVtZW50Q2hpbGQgfHwgcmVmLnJvb3ROb2Rlc1swXTtcblx0XHRcdFx0XHRcdHdoaWxlIChjb250ZW50UGFyZW50ICYmIGNvbnRlbnRQYXJlbnQubGFzdEVsZW1lbnRDaGlsZCkge1xuXHRcdFx0XHRcdFx0XHRjb250ZW50UGFyZW50ID0gY29udGVudFBhcmVudC5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGNvbnRlbnRSZWYucm9vdE5vZGVzPy5bMF0pIHtcblx0XHRcdFx0XHRcdFx0aWYgKGNvbnRlbnRQYXJlbnQuaGFzQ2hpbGROb2RlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGVudFBhcmVudC5yZXBsYWNlQ2hpbGRyZW4oLi4uY29udGVudFJlZi5yb290Tm9kZXMpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnRQYXJlbnQuYXBwZW5kKC4uLmNvbnRlbnRSZWYucm9vdE5vZGVzKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0c2FmZURldGVjdENoYW5nZXMoY29udGVudFJlZik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRvbkNsZWFudXAoKCkgPT4ge1xuXHRcdFx0XHRcdGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJBRik7XG5cblx0XHRcdFx0XHRpZiAoY29udGVudFJlZiAmJiBjb250ZW50UGFyZW50KSB7XG5cdFx0XHRcdFx0XHRjb250ZW50UmVmLnJvb3ROb2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChjb250ZW50UGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRlbnRQYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0bm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRjb250ZW50UmVmLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZWYucm9vdE5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcblx0XHRcdFx0XHRcdGlmIChlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZWYuZGVzdHJveSgpO1xuXHRcdFx0XHRcdHRoaXMucmVuZGVyQW5jaG9yPy5jbGVhcigpO1xuXHRcdFx0XHRcdHRoaXMudmNyLmNsZWFyKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBiZWZvcmVSZW5kZXIoKSB7XG5cdFx0bGV0IG9sZFBvc2l0aW9uID0gWzAsIDBdO1xuXHRcdGxldCBvbGRab29tID0gMDtcblx0XHRsZXQgdmlzaWJsZSA9IHRydWU7XG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKChnbCkgPT4ge1xuXHRcdFx0Y29uc3QgW1xuXHRcdFx0XHRncm91cCxcblx0XHRcdFx0Y2FtZXJhLFxuXHRcdFx0XHR0cmFuc2Zvcm0sXG5cdFx0XHRcdGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0XHRzaXplLFxuXHRcdFx0XHRlcHMsXG5cdFx0XHRcdGlzUmF5Q2FzdE9jY2x1c2lvbixcblx0XHRcdFx0b2NjbHVkZSxcblx0XHRcdFx0c2NlbmUsXG5cdFx0XHRcdHJheWNhc3Rlcixcblx0XHRcdFx0ZWxlbWVudCxcblx0XHRcdFx0ekluZGV4UmFuZ2UsXG5cdFx0XHRcdHNwcml0ZSxcblx0XHRcdFx0ZGlzdGFuY2VGYWN0b3IsXG5cdFx0XHRcdG9jY2x1c2lvbk1lc2hSZWYsXG5cdFx0XHRcdGdlb21ldHJ5LFxuXHRcdFx0XHR2aWV3cG9ydCxcblx0XHRcdFx0c2NhbGUsXG5cdFx0XHRdID0gW1xuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMuZ3JvdXBSZWYubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0dGhpcy5jYW1lcmEoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLnRyYW5zZm9ybSgpLFxuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMuY2FsY3VsYXRlUG9zaXRpb24oKSxcblx0XHRcdFx0dGhpcy5zaXplKCksXG5cdFx0XHRcdHRoaXMuaHRtbElucHV0cy5lcHMoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLmlzUmF5Q2FzdE9jY2x1c2lvbigpLFxuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMub2NjbHVkZSgpLFxuXHRcdFx0XHR0aGlzLnNjZW5lKCksXG5cdFx0XHRcdHRoaXMucmF5Y2FzdGVyKCksXG5cdFx0XHRcdHRoaXMuZWxlbWVudCgpLFxuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMuekluZGV4UmFuZ2UoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLnNwcml0ZSgpLFxuXHRcdFx0XHR0aGlzLmh0bWxJbnB1dHMuZGlzdGFuY2VGYWN0b3IoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLm9jY2x1c2lvbk1lc2hSZWYubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLmdlb21ldHJ5KCksXG5cdFx0XHRcdHRoaXMudmlld3BvcnQoKSxcblx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLnNjYWxlKCksXG5cdFx0XHRdO1xuXHRcdFx0aWYgKGdyb3VwICYmIGVsZW1lbnQpIHtcblx0XHRcdFx0Y2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cdFx0XHRcdGdyb3VwLnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTtcblx0XHRcdFx0Y29uc3QgdmVjID0gdHJhbnNmb3JtID8gb2xkUG9zaXRpb24gOiBjYWxjdWxhdGVQb3NpdGlvbihncm91cCwgY2FtZXJhLCBzaXplKTtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dHJhbnNmb3JtIHx8XG5cdFx0XHRcdFx0TWF0aC5hYnMob2xkWm9vbSAtIGNhbWVyYS56b29tKSA+IGVwcyB8fFxuXHRcdFx0XHRcdE1hdGguYWJzKG9sZFBvc2l0aW9uWzBdIC0gdmVjWzBdKSA+IGVwcyB8fFxuXHRcdFx0XHRcdE1hdGguYWJzKG9sZFBvc2l0aW9uWzFdIC0gdmVjWzFdKSA+IGVwc1xuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjb25zdCBpc0JlaGluZENhbWVyYSA9IGlzT2JqZWN0QmVoaW5kQ2FtZXJhKGdyb3VwLCBjYW1lcmEpO1xuXHRcdFx0XHRcdGxldCByYXl0cmFjZVRhcmdldDogbnVsbCB8IHVuZGVmaW5lZCB8IGJvb2xlYW4gfCBUSFJFRS5PYmplY3QzRFtdID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoaXNSYXlDYXN0T2NjbHVzaW9uKSB7XG5cdFx0XHRcdFx0XHRpZiAob2NjbHVkZSAhPT0gJ2JsZW5kaW5nJykge1xuXHRcdFx0XHRcdFx0XHRyYXl0cmFjZVRhcmdldCA9IFtzY2VuZV07XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2NjbHVkZSkpIHtcblx0XHRcdFx0XHRcdFx0cmF5dHJhY2VUYXJnZXQgPSBvY2NsdWRlLm1hcCgoaXRlbSkgPT4gKGlzLnJlZihpdGVtKSA/IGl0ZW0ubmF0aXZlRWxlbWVudCA6IGl0ZW0pKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBwcmV2aW91c2x5VmlzaWJsZSA9IHZpc2libGU7XG5cdFx0XHRcdFx0aWYgKHJheXRyYWNlVGFyZ2V0KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpc1Zpc2libGUgPSBpc09iamVjdFZpc2libGUoZ3JvdXAsIGNhbWVyYSwgcmF5Y2FzdGVyLCByYXl0cmFjZVRhcmdldCk7XG5cdFx0XHRcdFx0XHR2aXNpYmxlID0gaXNWaXNpYmxlICYmICFpc0JlaGluZENhbWVyYTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dmlzaWJsZSA9ICFpc0JlaGluZENhbWVyYTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocHJldmlvdXNseVZpc2libGUgIT09IHZpc2libGUpIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmh0bWxJbnB1dHMub2NjbHVkZWQub2JzZXJ2ZWQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5odG1sSW5wdXRzLm9jY2x1ZGVkLmVtaXQoIXZpc2libGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICdibG9jaycgOiAnbm9uZSc7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgaGFsZlJhbmdlID0gTWF0aC5mbG9vcih6SW5kZXhSYW5nZVswXSAvIDIpO1xuXHRcdFx0XHRcdGNvbnN0IHpSYW5nZSA9IG9jY2x1ZGVcblx0XHRcdFx0XHRcdD8gaXNSYXlDYXN0T2NjbHVzaW9uIC8vXG5cdFx0XHRcdFx0XHRcdD8gW3pJbmRleFJhbmdlWzBdLCBoYWxmUmFuZ2VdXG5cdFx0XHRcdFx0XHRcdDogW2hhbGZSYW5nZSAtIDEsIDBdXG5cdFx0XHRcdFx0XHQ6IHpJbmRleFJhbmdlO1xuXG5cdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS56SW5kZXggPSBgJHtvYmplY3RaSW5kZXgoZ3JvdXAsIGNhbWVyYSwgelJhbmdlKX1gO1xuXG5cdFx0XHRcdFx0aWYgKHRyYW5zZm9ybSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgW3dpZHRoSGFsZiwgaGVpZ2h0SGFsZl0gPSBbc2l6ZS53aWR0aCAvIDIsIHNpemUuaGVpZ2h0IC8gMl07XG5cdFx0XHRcdFx0XHRjb25zdCBmb3YgPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1s1XSAqIGhlaWdodEhhbGY7XG5cdFx0XHRcdFx0XHRjb25zdCB7IGlzT3J0aG9ncmFwaGljQ2FtZXJhLCB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQgfSA9IGNhbWVyYSBhcyBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmE7XG5cdFx0XHRcdFx0XHRjb25zdCBjYW1lcmFNYXRyaXggPSBnZXRDYW1lcmFDU1NNYXRyaXgoY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSk7XG5cdFx0XHRcdFx0XHRjb25zdCBjYW1lcmFUcmFuc2Zvcm0gPSBpc09ydGhvZ3JhcGhpY0NhbWVyYVxuXHRcdFx0XHRcdFx0XHQ/IGBzY2FsZSgke2Zvdn0pdHJhbnNsYXRlKCR7ZXBzaWxvbigtKHJpZ2h0ICsgbGVmdCkgLyAyKX1weCwke2Vwc2lsb24oXG5cdFx0XHRcdFx0XHRcdFx0XHQodG9wICsgYm90dG9tKSAvIDIsXG5cdFx0XHRcdFx0XHRcdCAgKX1weClgXG5cdFx0XHRcdFx0XHRcdDogYHRyYW5zbGF0ZVooJHtmb3Z9cHgpYDtcblx0XHRcdFx0XHRcdGxldCBtYXRyaXggPSBncm91cC5tYXRyaXhXb3JsZDtcblx0XHRcdFx0XHRcdGlmIChzcHJpdGUpIHtcblx0XHRcdFx0XHRcdFx0bWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZVxuXHRcdFx0XHRcdFx0XHRcdC5jbG9uZSgpXG5cdFx0XHRcdFx0XHRcdFx0LnRyYW5zcG9zZSgpXG5cdFx0XHRcdFx0XHRcdFx0LmNvcHlQb3NpdGlvbihtYXRyaXgpXG5cdFx0XHRcdFx0XHRcdFx0LnNjYWxlKGdyb3VwLnNjYWxlKTtcblx0XHRcdFx0XHRcdFx0bWF0cml4LmVsZW1lbnRzWzNdID0gbWF0cml4LmVsZW1lbnRzWzddID0gbWF0cml4LmVsZW1lbnRzWzExXSA9IDA7XG5cdFx0XHRcdFx0XHRcdG1hdHJpeC5lbGVtZW50c1sxNV0gPSAxO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS53aWR0aCA9IHNpemUud2lkdGggKyAncHgnO1xuXHRcdFx0XHRcdFx0ZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBzaXplLmhlaWdodCArICdweCc7XG5cdFx0XHRcdFx0XHRlbGVtZW50LnN0eWxlLnBlcnNwZWN0aXZlID0gaXNPcnRob2dyYXBoaWNDYW1lcmEgPyAnJyA6IGAke2Zvdn1weGA7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5vdXRlckRpdj8ubmF0aXZlRWxlbWVudCAmJiB0aGlzLmlubmVyRGl2Py5uYXRpdmVFbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMub3V0ZXJEaXYubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IHNpemUud2lkdGggKyAncHgnO1xuXHRcdFx0XHRcdFx0XHR0aGlzLm91dGVyRGl2Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyAncHgnO1xuXHRcdFx0XHRcdFx0XHR0aGlzLm91dGVyRGl2Lm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYCR7Y2FtZXJhVHJhbnNmb3JtfSR7Y2FtZXJhTWF0cml4fXRyYW5zbGF0ZSgke3dpZHRoSGFsZn1weCwke2hlaWdodEhhbGZ9cHgpYDtcblx0XHRcdFx0XHRcdFx0dGhpcy5pbm5lckRpdi5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGdldE9iamVjdENTU01hdHJpeChcblx0XHRcdFx0XHRcdFx0XHRtYXRyaXgsXG5cdFx0XHRcdFx0XHRcdFx0MSAvICgoZGlzdGFuY2VGYWN0b3IgfHwgMTApIC8gNDAwKSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2NhbGUgPSBkaXN0YW5jZUZhY3RvciA9PT0gdW5kZWZpbmVkID8gMSA6IG9iamVjdFNjYWxlKGdyb3VwLCBjYW1lcmEpICogZGlzdGFuY2VGYWN0b3I7XG5cdFx0XHRcdFx0XHRlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke3ZlY1swXX1weCwke3ZlY1sxXX1weCwwKSBzY2FsZSgke3NjYWxlfSlgO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvbGRQb3NpdGlvbiA9IHZlYztcblx0XHRcdFx0XHRvbGRab29tID0gY2FtZXJhLnpvb207XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpc1JheUNhc3RPY2NsdXNpb24gJiYgb2NjbHVzaW9uTWVzaFJlZiAmJiAhdGhpcy5pc01lc2hTaXplU2V0KSB7XG5cdFx0XHRcdGlmICh0cmFuc2Zvcm0pIHtcblx0XHRcdFx0XHRpZiAodGhpcy5vdXRlckRpdj8ubmF0aXZlRWxlbWVudCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgZWwgPSB0aGlzLm91dGVyRGl2Lm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW5bMF07XG5cblx0XHRcdFx0XHRcdGlmIChlbD8uY2xpZW50V2lkdGggJiYgZWw/LmNsaWVudEhlaWdodCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB7IGlzT3J0aG9ncmFwaGljQ2FtZXJhIH0gPSBjYW1lcmEgYXMgVEhSRUUuT3J0aG9ncmFwaGljQ2FtZXJhO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChpc09ydGhvZ3JhcGhpY0NhbWVyYSB8fCBnZW9tZXRyeSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzY2FsZSAhPT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KHNjYWxlKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvY2NsdXNpb25NZXNoUmVmLnNjYWxlLnNldFNjYWxhcigxIC8gKHNjYWxlIGFzIG51bWJlcikpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChzY2FsZSBpbnN0YW5jZW9mIFRIUkVFLlZlY3RvcjMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2NjbHVzaW9uTWVzaFJlZi5zY2FsZS5jb3B5KHNjYWxlLmNsb25lKCkuZGl2aWRlU2NhbGFyKDEpKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9jY2x1c2lvbk1lc2hSZWYuc2NhbGUuc2V0KDEgLyBzY2FsZVswXSwgMSAvIHNjYWxlWzFdLCAxIC8gc2NhbGVbMl0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCByYXRpbyA9IChkaXN0YW5jZUZhY3RvciB8fCAxMCkgLyA0MDA7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdyA9IGVsLmNsaWVudFdpZHRoICogcmF0aW87XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaCA9IGVsLmNsaWVudEhlaWdodCAqIHJhdGlvO1xuXG5cdFx0XHRcdFx0XHRcdFx0b2NjbHVzaW9uTWVzaFJlZi5zY2FsZS5zZXQodywgaCwgMSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR0aGlzLmlzTWVzaFNpemVTZXQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBlbGUgPSBlbGVtZW50LmNoaWxkcmVuWzBdO1xuXG5cdFx0XHRcdFx0aWYgKGVsZT8uY2xpZW50V2lkdGggJiYgZWxlPy5jbGllbnRIZWlnaHQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJhdGlvID0gMSAvIHZpZXdwb3J0LmZhY3Rvcjtcblx0XHRcdFx0XHRcdGNvbnN0IHcgPSBlbGUuY2xpZW50V2lkdGggKiByYXRpbztcblx0XHRcdFx0XHRcdGNvbnN0IGggPSBlbGUuY2xpZW50SGVpZ2h0ICogcmF0aW87XG5cblx0XHRcdFx0XHRcdG9jY2x1c2lvbk1lc2hSZWYuc2NhbGUuc2V0KHcsIGgsIDEpO1xuXG5cdFx0XHRcdFx0XHR0aGlzLmlzTWVzaFNpemVTZXQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG9jY2x1c2lvbk1lc2hSZWYubG9va0F0KGdsLmNhbWVyYS5wb3NpdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuIl19