@realsee/dnalogel 3.69.4-alpha.1 → 3.69.4-alpha.3

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 (483) hide show
  1. package/components/index.js +575 -1202
  2. package/dist/floorplan/Assets/camera.d.ts +1 -0
  3. package/dist/floorplan/FloorplanGuidePlugin/Components/FloorplanCompass.svelte.d.ts +1 -0
  4. package/dist/floorplan/FloorplanGuidePlugin/typing.d.ts +12 -0
  5. package/dist/index.cjs.js +61 -61
  6. package/dist/index.js +6335 -6190
  7. package/dist/index.umd.js +54 -54
  8. package/docs/classes/AreaMakerPluginType.AreaMakerController.html +2 -2
  9. package/docs/classes/AreaMakerPluginType.AreaMakerItem.html +2 -2
  10. package/docs/classes/CSS3DRender.html +2 -2
  11. package/docs/classes/GuideLineItem.GuideLineItem.html +2 -2
  12. package/docs/classes/GuideLineModeItem.GuideLineModeItem.html +2 -2
  13. package/docs/classes/ModelMakerPluginInstance.html +2 -2
  14. package/docs/classes/ModelMakerPluginType.ModelMakerBoxItem.html +2 -2
  15. package/docs/classes/ModelMakerPluginType.ModelMakerPolygonItem.html +2 -2
  16. package/docs/classes/ModelMakerPluginType.ModelMakerPrismItem.html +2 -2
  17. package/docs/classes/ModelRoomLabelController.html +2 -2
  18. package/docs/classes/MoveController.html +2 -2
  19. package/docs/classes/Object3DHelperController.html +2 -2
  20. package/docs/classes/PaintBrush.html +2 -2
  21. package/docs/classes/PanoMeasurePluginLine.html +2 -2
  22. package/docs/classes/PanoMeasurePluginModel.html +2 -2
  23. package/docs/classes/PanoMeasurePluginPoint.html +2 -2
  24. package/docs/classes/PanoMeasurePluginPolyline.html +2 -2
  25. package/docs/classes/PanoTagPluginController.html +2 -2
  26. package/docs/classes/Sculpt.html +2 -2
  27. package/docs/classes/Util.BetterTween.html +2 -2
  28. package/docs/classes/Util.FiveDomEvents.html +2 -2
  29. package/docs/classes/Util.FivePuppet.html +2 -2
  30. package/docs/classes/Util.Interval.html +2 -2
  31. package/docs/classes/Util.LegacyPointHelper.html +2 -2
  32. package/docs/classes/Util.LightTag.html +2 -2
  33. package/docs/classes/Util.LineSegments.html +2 -2
  34. package/docs/classes/Util.Magnifier.html +2 -2
  35. package/docs/classes/Util.Object3D.html +2 -2
  36. package/docs/classes/Util.PointDomHelper.html +2 -2
  37. package/docs/classes/Util.PointHelper.html +2 -2
  38. package/docs/classes/Util.PointSelector.html +2 -2
  39. package/docs/classes/Util.PointSelectorHelper.html +2 -2
  40. package/docs/classes/Util.Rectangle.html +2 -2
  41. package/docs/classes/Util.sculpt.BaseEditor.html +2 -2
  42. package/docs/classes/Util.sculpt.BoxMesh.html +2 -2
  43. package/docs/classes/Util.sculpt.BoxMeshEditor.html +2 -2
  44. package/docs/classes/Util.sculpt.CircleMesh.html +2 -2
  45. package/docs/classes/Util.sculpt.CircleMeshEditor.html +2 -2
  46. package/docs/classes/Util.sculpt.CircleWithEdgeMesh.html +2 -2
  47. package/docs/classes/Util.sculpt.CylinderMesh.html +2 -2
  48. package/docs/classes/Util.sculpt.CylinderMeshEditor.html +2 -2
  49. package/docs/classes/Util.sculpt.LineMesh.html +2 -2
  50. package/docs/classes/Util.sculpt.PointMesh.html +2 -2
  51. package/docs/classes/Util.sculpt.PolygonMesh.html +2 -2
  52. package/docs/classes/Util.sculpt.PrismMesh.html +2 -2
  53. package/docs/classes/Util.sculpt.PrismMeshEditor.html +2 -2
  54. package/docs/classes/Util.sculpt.RectangleMesh.html +2 -2
  55. package/docs/classes/Util.sculpt.RectangleMeshEditor.html +2 -2
  56. package/docs/classes/Util.sculpt.RectangleWithEdgeMesh.html +2 -2
  57. package/docs/classes/WalkController.html +2 -2
  58. package/docs/enums/CameraMovementEffect.html +2 -2
  59. package/docs/enums/ContentType.html +2 -2
  60. package/docs/enums/DIRECTION.html +2 -2
  61. package/docs/enums/DISPLAY_STRATEGY_TYPE.html +2 -2
  62. package/docs/enums/DimensionType.html +2 -2
  63. package/docs/enums/FLOOR_PLAN_ATTACHED_TO.html +2 -2
  64. package/docs/enums/ITEM_LABEL_PLUGIN_DISPLAY_STRATEGY_TYPE.html +2 -2
  65. package/docs/enums/PaintBrushTypeEnum.html +2 -2
  66. package/docs/enums/PointType.html +2 -2
  67. package/docs/enums/Rotation.html +2 -2
  68. package/docs/functions/AreaMakerPlugin.html +1 -1
  69. package/docs/functions/CSS3DRenderPlugin.html +1 -1
  70. package/docs/functions/CameraMovementPlugin.html +2 -2
  71. package/docs/functions/CruisePlugin.html +1 -1
  72. package/docs/functions/CurrentPanoImagePlugin.html +1 -1
  73. package/docs/functions/FloorplanGuidePlugin.html +1 -1
  74. package/docs/functions/GuideLinePlugin.html +1 -1
  75. package/docs/functions/ItemLabelPlugin.html +1 -1
  76. package/docs/functions/MapviewFloorplanPlugin.html +1 -1
  77. package/docs/functions/MeasurePlugin.html +1 -1
  78. package/docs/functions/ModelChassisCompassPlugin.html +2 -2
  79. package/docs/functions/ModelEntryDoorGuidePlugin.html +2 -2
  80. package/docs/functions/ModelFloorplanPlugin.html +1 -1
  81. package/docs/functions/ModelItemLabelPlugin.html +1 -1
  82. package/docs/functions/ModelMakerPlugin.html +1 -1
  83. package/docs/functions/ModelRoomLabelPlugin.html +1 -1
  84. package/docs/functions/ModelTVVideoPlugin.html +1 -1
  85. package/docs/functions/ModelViewPlugin.html +2 -2
  86. package/docs/functions/MovePlugin.html +1 -1
  87. package/docs/functions/Object3DHelperPlugin.html +1 -1
  88. package/docs/functions/PanoCompassPlugin.html +1 -1
  89. package/docs/functions/PanoCursorRaycasterPlugin.html +2 -2
  90. package/docs/functions/PanoDoorLabelPlugin.html +1 -1
  91. package/docs/functions/PanoFloorplanRadarPlugin.html +1 -1
  92. package/docs/functions/PanoMeasurePlugin.html +1 -1
  93. package/docs/functions/PanoRulerPlugin.html +2 -2
  94. package/docs/functions/PanoRulerProPlugin.html +2 -2
  95. package/docs/functions/PanoSpatialTagPlugin.html +2 -2
  96. package/docs/functions/PanoTagPlugin.html +1 -1
  97. package/docs/functions/PanoVideoPlugin.html +2 -2
  98. package/docs/functions/PipelinePlugin.html +1 -1
  99. package/docs/functions/SculptPlugin.html +2 -2
  100. package/docs/functions/SculptPluginForFive.html +2 -2
  101. package/docs/functions/TopviewFloorplanPlugin.html +1 -1
  102. package/docs/functions/Util.awaitNextFrame.html +1 -1
  103. package/docs/functions/Util.blink.html +2 -2
  104. package/docs/functions/Util.bounding.html +1 -1
  105. package/docs/functions/Util.boundingBox.html +1 -1
  106. package/docs/functions/Util.boundingSphere.html +1 -1
  107. package/docs/functions/Util.boxVertex.html +2 -2
  108. package/docs/functions/Util.boxVertexes.html +1 -1
  109. package/docs/functions/Util.checkFiveModelLoaded.html +2 -2
  110. package/docs/functions/Util.convexHull.html +2 -2
  111. package/docs/functions/Util.equal.html +2 -2
  112. package/docs/functions/Util.fiveModelIsLoaded.html +2 -2
  113. package/docs/functions/Util.getCoordsFromClient.html +1 -1
  114. package/docs/functions/Util.getCoordsFromElement.html +1 -1
  115. package/docs/functions/Util.getFrameTime.html +2 -2
  116. package/docs/functions/Util.getIntersectFromRelativePosition.html +1 -1
  117. package/docs/functions/Util.getRaycasterFromFivePointer.html +1 -1
  118. package/docs/functions/Util.initialCSS3DRender.html +1 -1
  119. package/docs/functions/Util.inside.html +1 -1
  120. package/docs/functions/Util.isModelLike.html +1 -1
  121. package/docs/functions/Util.isNil.html +2 -2
  122. package/docs/functions/Util.isPanoramaLike.html +1 -1
  123. package/docs/functions/Util.lookObject.html +2 -2
  124. package/docs/functions/Util.lookPoint.html +2 -2
  125. package/docs/functions/Util.nextFrame.html +1 -1
  126. package/docs/functions/Util.notNil.html +2 -2
  127. package/docs/functions/Util.reblink.html +2 -2
  128. package/docs/functions/Util.replaceStaticPrefix.html +2 -2
  129. package/docs/functions/Util.requestAnimationFrameInterval.html +2 -2
  130. package/docs/functions/Util.sculpt.createBox.html +1 -1
  131. package/docs/functions/Util.sculpt.createCircle.html +1 -1
  132. package/docs/functions/Util.sculpt.createCylinder.html +1 -1
  133. package/docs/functions/Util.sculpt.createLine.html +2 -2
  134. package/docs/functions/Util.sculpt.createPoint.html +1 -1
  135. package/docs/functions/Util.sculpt.createPolygon.html +1 -1
  136. package/docs/functions/Util.sculpt.createPrism.html +1 -1
  137. package/docs/functions/Util.sculpt.createRectangle.html +2 -2
  138. package/docs/functions/Util.tag.html +1 -1
  139. package/docs/functions/Util.tweenProgress.html +1 -1
  140. package/docs/functions/Util.uuid.html +2 -2
  141. package/docs/functions/Util.waitFiveModelLoaded.html +2 -2
  142. package/docs/functions/Util.worldBounding.html +1 -1
  143. package/docs/functions/Util.worldBoundingBox.html +1 -1
  144. package/docs/functions/Util.worldBoundingSphere.html +1 -1
  145. package/docs/functions/createPolyline.html +2 -2
  146. package/docs/functions/pluginFlag.html +1 -1
  147. package/docs/hierarchy.html +1 -1
  148. package/docs/index.html +2 -2
  149. package/docs/interfaces/AreaMakerPluginType.AnimeOptions.html +2 -2
  150. package/docs/interfaces/AreaMakerPluginType.Config.html +2 -2
  151. package/docs/interfaces/AreaMakerPluginType.EventMap.html +2 -2
  152. package/docs/interfaces/AreaMakerPluginType.Params.html +2 -2
  153. package/docs/interfaces/AreaMakerPluginType.ServerAreaMakerItem.html +2 -2
  154. package/docs/interfaces/AreaMakerPluginType.ServerAreaMakerItemV1.html +2 -2
  155. package/docs/interfaces/AreaMakerPluginType.ServerDataV1.html +2 -2
  156. package/docs/interfaces/AreaMakerPluginType.ServerDataV2.html +2 -2
  157. package/docs/interfaces/AreaMakerPluginType.ShowHideOptions.html +2 -2
  158. package/docs/interfaces/AreaMakerPluginType.State.html +2 -2
  159. package/docs/interfaces/CSS3DRenderPluginEventMap.html +2 -2
  160. package/docs/interfaces/CSS3DRenderPluginState.html +2 -2
  161. package/docs/interfaces/CameraMovementPluginExportType.html +2 -2
  162. package/docs/interfaces/ContentTypeMapInterface.html +2 -2
  163. package/docs/interfaces/CruisePluginTypes.Config.html +2 -2
  164. package/docs/interfaces/CruisePluginTypes.CruiseKeyframe.html +2 -2
  165. package/docs/interfaces/CruisePluginTypes.EventMap.html +2 -2
  166. package/docs/interfaces/CruisePluginTypes.GuildLineConfig.html +2 -2
  167. package/docs/interfaces/CruisePluginTypes.MoveAction.html +2 -2
  168. package/docs/interfaces/CruisePluginTypes.MoveWithKeyframesAction.html +2 -2
  169. package/docs/interfaces/CruisePluginTypes.MoveWithPanoIndexAction.html +2 -2
  170. package/docs/interfaces/CruisePluginTypes.PluginData.html +2 -2
  171. package/docs/interfaces/CruisePluginTypes.PluginServerData.html +2 -2
  172. package/docs/interfaces/CruisePluginTypes.PluginState.html +2 -2
  173. package/docs/interfaces/CurrentPanoImagePluginType.Config.html +2 -2
  174. package/docs/interfaces/CurrentPanoImagePluginType.EventMap.html +2 -2
  175. package/docs/interfaces/CurrentPanoImagePluginType.Params.html +2 -2
  176. package/docs/interfaces/CurrentPanoImagePluginType.ShowHideOptions.html +2 -2
  177. package/docs/interfaces/CurrentPanoImagePluginType.State.html +2 -2
  178. package/docs/interfaces/FloorplanBounding.html +2 -2
  179. package/docs/interfaces/FloorplanData.html +2 -2
  180. package/docs/interfaces/FloorplanEntrance.html +2 -2
  181. package/docs/interfaces/FloorplanExtraObject.html +2 -2
  182. package/docs/interfaces/FloorplanExtraObject3D.html +2 -2
  183. package/docs/interfaces/FloorplanFloorData.html +2 -2
  184. package/docs/interfaces/FloorplanImagePosition.html +2 -2
  185. package/docs/interfaces/FloorplanObserver.html +2 -2
  186. package/docs/interfaces/FloorplanOutlineItem.html +2 -2
  187. package/docs/interfaces/FloorplanPosition.html +2 -2
  188. package/docs/interfaces/FloorplanRoomItem.html +2 -2
  189. package/docs/interfaces/FloorplanRoomLabelItem.html +2 -2
  190. package/docs/interfaces/FloorplanServerBounding.html +2 -2
  191. package/docs/interfaces/FloorplanServerComputedData.html +2 -2
  192. package/docs/interfaces/FloorplanServerData.html +2 -2
  193. package/docs/interfaces/FloorplanServerDoorItem.html +2 -2
  194. package/docs/interfaces/FloorplanServerDoorPosition.html +2 -2
  195. package/docs/interfaces/FloorplanServerEntrance.html +2 -2
  196. package/docs/interfaces/FloorplanServerFloorData.html +2 -2
  197. package/docs/interfaces/FloorplanServerImagePosition.html +2 -2
  198. package/docs/interfaces/FloorplanServerObserver.html +2 -2
  199. package/docs/interfaces/FloorplanServerOutlineItem.html +2 -2
  200. package/docs/interfaces/FloorplanServerPosition.html +2 -2
  201. package/docs/interfaces/FloorplanServerRoomItem.html +2 -2
  202. package/docs/interfaces/FloorplanServerRoomLabelItem.html +2 -2
  203. package/docs/interfaces/GuideLineModeItem.GuideLineTagContainer.html +2 -2
  204. package/docs/interfaces/GuideLinePluginType.CatmullRomCurve3.html +2 -2
  205. package/docs/interfaces/GuideLinePluginType.EventMap.html +2 -2
  206. package/docs/interfaces/GuideLinePluginType.ExtraRouteData.html +2 -2
  207. package/docs/interfaces/GuideLinePluginType.GuideLineGeometryStyle.html +2 -2
  208. package/docs/interfaces/GuideLinePluginType.GuideLineItemContainer.html +2 -2
  209. package/docs/interfaces/GuideLinePluginType.GuideLineMaterialStyle.html +2 -2
  210. package/docs/interfaces/GuideLinePluginType.GuideLineMeshStyle.html +2 -2
  211. package/docs/interfaces/GuideLinePluginType.LineGeometriesConfig.html +2 -2
  212. package/docs/interfaces/GuideLinePluginType.ModelGuideLineStyle.html +2 -2
  213. package/docs/interfaces/GuideLinePluginType.ModelGuideLineTagData.html +2 -2
  214. package/docs/interfaces/GuideLinePluginType.PanoramaGuideLineStyle.html +2 -2
  215. package/docs/interfaces/GuideLinePluginType.PluginDataV2.html +1 -1
  216. package/docs/interfaces/GuideLinePluginType.PluginServerData.html +2 -2
  217. package/docs/interfaces/GuideLinePluginType.PluginState.html +2 -2
  218. package/docs/interfaces/GuideLinePluginType.Route.html +2 -2
  219. package/docs/interfaces/HelperOffset.html +2 -2
  220. package/docs/interfaces/ImagePlaneGroup.html +2 -2
  221. package/docs/interfaces/ItemLabelPluginData.html +2 -2
  222. package/docs/interfaces/ItemLabelPluginExportReturnsType.html +2 -2
  223. package/docs/interfaces/ItemLabelPluginParametersType.html +2 -2
  224. package/docs/interfaces/MinMax.html +2 -2
  225. package/docs/interfaces/ModelChassisCompassPluginData.html +2 -2
  226. package/docs/interfaces/ModelChassisCompassPluginExportType.html +2 -2
  227. package/docs/interfaces/ModelChassisCompassPluginParameterType.html +2 -2
  228. package/docs/interfaces/ModelEntryDoorGuidePluginData.html +2 -2
  229. package/docs/interfaces/ModelEntryDoorGuidePluginExportType.html +2 -2
  230. package/docs/interfaces/ModelItemLabelPluginData.html +2 -2
  231. package/docs/interfaces/ModelItemLabelPluginExportReturnsType.html +2 -2
  232. package/docs/interfaces/ModelItemLabelPluginParametersType.html +2 -2
  233. package/docs/interfaces/ModelMakerPluginType.BoxItemObjectData.html +2 -2
  234. package/docs/interfaces/ModelMakerPluginType.EventMap.html +2 -2
  235. package/docs/interfaces/ModelMakerPluginType.PrismItemObjectData.html +2 -2
  236. package/docs/interfaces/ModelMakerPluginType.ServerBaseItem.html +2 -2
  237. package/docs/interfaces/ModelMakerPluginType.ServerBoxItem.html +2 -2
  238. package/docs/interfaces/ModelMakerPluginType.ServerData.html +2 -2
  239. package/docs/interfaces/ModelMakerPluginType.ServerPrismItem.html +2 -2
  240. package/docs/interfaces/ModelMakerPluginType.ServerTrianglesItem.html +2 -2
  241. package/docs/interfaces/ModelMakerPluginType.State.html +2 -2
  242. package/docs/interfaces/ModelMakerPluginType.TrianglesItemObjectData.html +2 -2
  243. package/docs/interfaces/ModelRoomLabelPluginData.html +2 -2
  244. package/docs/interfaces/ModelTVVideoPluginData.html +2 -2
  245. package/docs/interfaces/ModelTVVideoPluginExportType.html +2 -2
  246. package/docs/interfaces/ModelTVVideoPluginParameterType.html +2 -2
  247. package/docs/interfaces/ModelViewPluginExportType.html +2 -2
  248. package/docs/interfaces/Object3DHelperState.html +2 -2
  249. package/docs/interfaces/ObjectHelperControllers.html +2 -2
  250. package/docs/interfaces/PaintBrushAction.html +2 -2
  251. package/docs/interfaces/PaintBrushConfigs.html +2 -2
  252. package/docs/interfaces/PaintBrushState.html +2 -2
  253. package/docs/interfaces/PanoCursorRaycasterPluginExportType.html +2 -2
  254. package/docs/interfaces/PanoCursorRaycasterPluginParameterType.html +1 -1
  255. package/docs/interfaces/PanoMeasureParameterType.html +2 -2
  256. package/docs/interfaces/PanoMeasurePluginLineJson.html +2 -2
  257. package/docs/interfaces/PanoMeasurePluginOpenParameter.html +2 -2
  258. package/docs/interfaces/PanoMeasurePluginPointJson.html +2 -2
  259. package/docs/interfaces/PanoMeasurePluginPolylineJson.html +2 -2
  260. package/docs/interfaces/PanoRulerPluginExportType.html +2 -2
  261. package/docs/interfaces/PanoRulerPluginOptions.html +2 -2
  262. package/docs/interfaces/PanoRulerPluginParameterType.html +2 -2
  263. package/docs/interfaces/PanoRulerProPluginExportType.html +2 -2
  264. package/docs/interfaces/PanoRulerProPluginOptions.html +2 -2
  265. package/docs/interfaces/PanoRulerProPluginParameterType.html +2 -2
  266. package/docs/interfaces/PanoRulerProPluginState.html +2 -2
  267. package/docs/interfaces/PanoSpatialTagPluginContentEvent.html +1 -1
  268. package/docs/interfaces/PanoSpatialTagPluginContentReplacement.html +1 -1
  269. package/docs/interfaces/PanoSpatialTagPluginData.html +2 -2
  270. package/docs/interfaces/PanoSpatialTagPluginDataElement.html +2 -2
  271. package/docs/interfaces/PanoSpatialTagPluginExportType.html +2 -2
  272. package/docs/interfaces/PanoSpatialTagPluginOriginElement.html +2 -2
  273. package/docs/interfaces/PanoSpatialTagPluginParameterType.html +2 -2
  274. package/docs/interfaces/PanoSpatialTagPluginPointElement.html +2 -2
  275. package/docs/interfaces/PanoSpatialTagPluginTagElement.html +2 -2
  276. package/docs/interfaces/PanoVideoPluginType.LoadParams.html +2 -2
  277. package/docs/interfaces/PanoVideoPluginType.PanoVideoItem.html +2 -2
  278. package/docs/interfaces/PanoVideoPluginType.PluginData.html +2 -2
  279. package/docs/interfaces/PanoVideoPluginType.PluginEventMap.html +2 -2
  280. package/docs/interfaces/PanoVideoPluginType.PluginState.html +2 -2
  281. package/docs/interfaces/PanoVideoPluginType.VideoItem.html +2 -2
  282. package/docs/interfaces/PanoVideoPluginType.VideoMeshParams.html +2 -2
  283. package/docs/interfaces/PluginEventMap.html +2 -2
  284. package/docs/interfaces/Point.html +2 -2
  285. package/docs/interfaces/Room.html +2 -2
  286. package/docs/interfaces/RoomInfo.html +2 -2
  287. package/docs/interfaces/RoomLabel.html +2 -2
  288. package/docs/interfaces/RoomRules.html +1 -1
  289. package/docs/interfaces/Rooms.html +1 -1
  290. package/docs/interfaces/Scissor.html +2 -2
  291. package/docs/interfaces/SculptConfig.html +2 -2
  292. package/docs/interfaces/State.html +2 -2
  293. package/docs/interfaces/TagCacheInterface.html +2 -2
  294. package/docs/interfaces/TagConfig.html +2 -2
  295. package/docs/interfaces/TagGLTFObjectGroup.html +2 -2
  296. package/docs/interfaces/TagIconUrl.html +2 -2
  297. package/docs/interfaces/TagObjectGroup.html +2 -2
  298. package/docs/interfaces/TagState.html +2 -2
  299. package/docs/interfaces/TagStyle.html +2 -2
  300. package/docs/interfaces/Tags.html +2 -2
  301. package/docs/interfaces/TemporaryState.html +2 -2
  302. package/docs/interfaces/Util.AnimeInstance.html +2 -2
  303. package/docs/interfaces/Util.BlinkAnimeOptions.html +2 -2
  304. package/docs/interfaces/Util.EventHandlerConfig.html +2 -2
  305. package/docs/interfaces/Util.FiveDomEvent.html +2 -2
  306. package/docs/interfaces/Util.FiveDomEventMap.html +2 -2
  307. package/docs/interfaces/Util.LegacyMouseGroupParameter.html +2 -2
  308. package/docs/interfaces/Util.MagnifierParameter.html +2 -2
  309. package/docs/interfaces/Util.MouseGroupParameter.html +2 -2
  310. package/docs/interfaces/Util.PointIntersection.html +2 -2
  311. package/docs/interfaces/Util.PointSelectorHelperConfig.html +2 -2
  312. package/docs/interfaces/Util.ReBlinkAnimeOptions.html +2 -2
  313. package/docs/modules/AreaMakerPluginType.html +2 -2
  314. package/docs/modules/CruisePluginTypes.html +2 -2
  315. package/docs/modules/CurrentPanoImagePluginType.html +2 -2
  316. package/docs/modules/GuideLineItem.html +2 -2
  317. package/docs/modules/GuideLineModeItem.html +2 -2
  318. package/docs/modules/GuideLinePluginType.html +2 -2
  319. package/docs/modules/ModelMakerPluginType.html +2 -2
  320. package/docs/modules/PanoVideoPluginType.html +2 -2
  321. package/docs/modules/SculptData.html +2 -2
  322. package/docs/modules/SculptType.html +2 -2
  323. package/docs/modules/Util.html +2 -2
  324. package/docs/modules/Util.sculpt.html +2 -2
  325. package/docs/modules.html +2 -2
  326. package/docs/types/AddObject3DHelperConfig.html +2 -2
  327. package/docs/types/AreaMakerPluginType.AreaMakerItemEventMap.html +2 -2
  328. package/docs/types/AreaMakerPluginType.ItemRenderer.html +1 -1
  329. package/docs/types/AreaMakerPluginType.PluginData.html +2 -2
  330. package/docs/types/AreaMakerPluginType.ServerData.html +2 -2
  331. package/docs/types/ArrayPosition.html +1 -1
  332. package/docs/types/AudioAppearance.html +1 -1
  333. package/docs/types/CSS3DRenderExportType.html +1 -1
  334. package/docs/types/CSS3DRenderPluginExportType.html +1 -1
  335. package/docs/types/CSS3DRenderPluginParameterType.html +1 -1
  336. package/docs/types/ClassFunctionParameters.html +1 -1
  337. package/docs/types/Color.html +1 -1
  338. package/docs/types/ContentTypeConfigKey.html +1 -1
  339. package/docs/types/ContentTypeConfigKeySplit.html +1 -1
  340. package/docs/types/ContentTypeMap.html +1 -1
  341. package/docs/types/Create3DDomContainerReturnType.html +1 -1
  342. package/docs/types/Create3DElementReturnType.html +1 -1
  343. package/docs/types/CruisePluginExportType.html +1 -1
  344. package/docs/types/CruisePluginTypes.CruiseData.html +2 -2
  345. package/docs/types/CruisePluginTypes.MoveEffect.html +1 -1
  346. package/docs/types/CurrentPanoImagePluginExportType.html +1 -1
  347. package/docs/types/DeprecatedMediaPlaneProperty.html +2 -2
  348. package/docs/types/DeprecatedTagProperty.html +2 -2
  349. package/docs/types/Direction-1.html +1 -1
  350. package/docs/types/Direction4.html +1 -1
  351. package/docs/types/ElementRenderer.html +2 -2
  352. package/docs/types/FloorplanGuidePluginParameterType.html +1 -1
  353. package/docs/types/FloorplanGuidePluginReturnType.html +1 -1
  354. package/docs/types/FloorplanRuleLabels.html +2 -2
  355. package/docs/types/FloorplanServerRuleLabels.html +1 -1
  356. package/docs/types/GuideLinePluginExportType.html +1 -1
  357. package/docs/types/GuideLinePluginType.GuideLineItem.html +2 -2
  358. package/docs/types/GuideLinePluginType.GuideLineItemEventMap.html +1 -1
  359. package/docs/types/GuideLinePluginType.GuideLineModeItemMode.html +1 -1
  360. package/docs/types/GuideLinePluginType.GuideLineStyle.html +2 -2
  361. package/docs/types/GuideLinePluginType.ModelGuideLineTag.html +2 -2
  362. package/docs/types/GuideLinePluginType.PathItem.html +2 -2
  363. package/docs/types/GuideLinePluginType.PluginData.html +2 -2
  364. package/docs/types/GuideLinePluginType.RouteConfig.html +2 -2
  365. package/docs/types/HelperEventMap.html +1 -1
  366. package/docs/types/InternalHelperEventMap.html +1 -1
  367. package/docs/types/MapviewFloorplanPluginParameterType.html +1 -1
  368. package/docs/types/MapviewFloorplanPluginReturnType.html +1 -1
  369. package/docs/types/MeasureEndReason.html +1 -1
  370. package/docs/types/MeasurePluginConfig.html +2 -2
  371. package/docs/types/MediaData.html +2 -2
  372. package/docs/types/MediaStore.html +1 -1
  373. package/docs/types/ModelEntryDoorGuidePluginParameterType.html +1 -1
  374. package/docs/types/ModelFloorplanPluginParameterType.html +1 -1
  375. package/docs/types/ModelFloorplanPluginReturnType.html +1 -1
  376. package/docs/types/ModelId.html +1 -1
  377. package/docs/types/ModelMakerPluginType.ElementRenderer.html +1 -1
  378. package/docs/types/ModelMakerPluginType.ItemType.html +2 -2
  379. package/docs/types/ModelMakerPluginType.MarkerItem.html +1 -1
  380. package/docs/types/ModelMakerPluginType.ServerItem.html +2 -2
  381. package/docs/types/ModelRoomLabelPluginParameters.html +1 -1
  382. package/docs/types/ModelRoomLabelPluginReturnType.html +1 -1
  383. package/docs/types/MoveArgs.html +2 -2
  384. package/docs/types/MoveOpts.html +2 -2
  385. package/docs/types/Object3DHelperEventMap.html +1 -1
  386. package/docs/types/ObjectFit.html +1 -1
  387. package/docs/types/PaintBrushEventMap.html +1 -1
  388. package/docs/types/PanoCompassPluginData.html +1 -1
  389. package/docs/types/PanoCompassPluginExportType.html +1 -1
  390. package/docs/types/PanoCompassPluginParameterType.html +1 -1
  391. package/docs/types/PanoFloorplanRadarPluginParameterType.html +1 -1
  392. package/docs/types/PanoFloorplanRadarPluginReturnType.html +1 -1
  393. package/docs/types/PanoIndex.html +1 -1
  394. package/docs/types/PanoMeasurePluginEvent.html +1 -1
  395. package/docs/types/PanoMeasureReturnType.html +1 -1
  396. package/docs/types/PanoSpatialTagPluginId.html +1 -1
  397. package/docs/types/PanoTagPluginExportInterface.html +1 -1
  398. package/docs/types/PanoTagPluginParamsInterface.html +1 -1
  399. package/docs/types/PanoVideoPluginParameterType.html +1 -1
  400. package/docs/types/PanoVideoPluginReturnType.html +1 -1
  401. package/docs/types/PickTagContentTypeInContentTypeConfigKey.html +2 -2
  402. package/docs/types/PipelinePluginParameterType.html +1 -1
  403. package/docs/types/PipelinePluginReturnType.html +1 -1
  404. package/docs/types/PlaneTag.html +2 -2
  405. package/docs/types/Point2DTag.html +2 -2
  406. package/docs/types/Point3DTag.html +2 -2
  407. package/docs/types/PointTagInstance.html +1 -1
  408. package/docs/types/Position.html +1 -1
  409. package/docs/types/PositionFrom.html +1 -1
  410. package/docs/types/RotateArgs.html +2 -2
  411. package/docs/types/RotateOpts.html +2 -2
  412. package/docs/types/RuleLabelsKey.html +1 -1
  413. package/docs/types/RuleLabelsValue.html +1 -1
  414. package/docs/types/ScaleCallback.html +1 -1
  415. package/docs/types/ScalePosition.html +2 -2
  416. package/docs/types/SculptData.BoxData.html +1 -1
  417. package/docs/types/SculptData.CircleData.html +1 -1
  418. package/docs/types/SculptData.CylinderData.html +1 -1
  419. package/docs/types/SculptData.PointData.html +1 -1
  420. package/docs/types/SculptData.PolygonData.html +1 -1
  421. package/docs/types/SculptData.PolylineData.html +1 -1
  422. package/docs/types/SculptData.PrismData.html +1 -1
  423. package/docs/types/SculptData.RectangleData.html +1 -1
  424. package/docs/types/SculptType.Theme.html +2 -2
  425. package/docs/types/StickType.html +1 -1
  426. package/docs/types/Tag.html +2 -2
  427. package/docs/types/Tag2D.html +2 -2
  428. package/docs/types/Tag3D.html +2 -2
  429. package/docs/types/TagClickParams.html +1 -1
  430. package/docs/types/TagConfigByKey.html +1 -1
  431. package/docs/types/TagContentType.html +1 -1
  432. package/docs/types/TagContentTypeMapping.html +1 -1
  433. package/docs/types/TagDimensionType.html +1 -1
  434. package/docs/types/TagElement.html +2 -2
  435. package/docs/types/TagEvents.html +1 -1
  436. package/docs/types/TagGLTFObject.html +1 -1
  437. package/docs/types/TagHooks.html +1 -1
  438. package/docs/types/TagId.html +1 -1
  439. package/docs/types/TagInstance.html +1 -1
  440. package/docs/types/TagPlacement.html +2 -2
  441. package/docs/types/TagPointType.html +2 -2
  442. package/docs/types/TagRendererMap.html +1 -1
  443. package/docs/types/TopviewFloorplanPluginParameterType.html +1 -1
  444. package/docs/types/TopviewFloorplanPluginReturnType.html +1 -1
  445. package/docs/types/Util.ActionIfNoIntersection.html +1 -1
  446. package/docs/types/Util.AdherePoint.html +2 -2
  447. package/docs/types/Util.PointSelectorConfig.html +1 -1
  448. package/docs/types/WorkCode.html +1 -1
  449. package/docs/variables/FLOOR_TYPE_MAP.html +2 -2
  450. package/docs/variables/PLUGIN.html +1 -1
  451. package/docs/variables/ROOM_FETILE_TYPE_MAP.html +2 -2
  452. package/docs/variables/ROOM_TYPE_MAP.html +2 -2
  453. package/docs/variables/Util.CURRENT_PANO_IMAGE_DEFAULT_IMAGE.html +2 -2
  454. package/docs/variables/Util.DEFAULT_STATIC_PREFIX.html +2 -2
  455. package/docs/variables/Util.DNALOGEL_DEFAULT_ASSETS.html +2 -2
  456. package/docs/variables/Util.ENTRY_DOOR_DEFAULT_IMAGE.html +2 -2
  457. package/docs/variables/Util.FLOORPLAN_DEFAULT_IMAGE.html +2 -2
  458. package/docs/variables/Util.GUIDELINE_DEFAULT_ARROW_TEXTURE.html +2 -2
  459. package/docs/variables/Util.GUIDELINE_WHITE_ARROW_TEXTURE.html +2 -2
  460. package/docs/variables/Util.MODEL_CHASSIS_COMPASS_DEFAULT_MODEL.html +2 -2
  461. package/docs/variables/Util.MODEL_ENTRY_DOOR_GUIDE_PLUGIN_DEFAULT_MODEL.html +2 -2
  462. package/docs/variables/Util.PANO_COMPASS_DEFAULT_IMAGE.html +2 -2
  463. package/docs/variables/Util.PANO_SPATIAL_TAG_BLUR_IMAGE.html +2 -2
  464. package/docs/variables/Util.PANO_TAG_DEFAULT_LINK_ICON.html +2 -2
  465. package/docs/variables/Util.animeMap.html +1 -1
  466. package/docs/variables/defaultGlobalConfig.html +1 -1
  467. package/docs/variables/itemLabelPluginServerParams.html +1 -1
  468. package/docs/variables/modelItemLabelPluginServerParams.html +1 -1
  469. package/docs/variables/modelRoomLabelPluginServerParams.html +1 -1
  470. package/libs/base/BasePlugin.js +1 -1
  471. package/libs/floorplan/Assets/camera.d.ts +1 -0
  472. package/libs/floorplan/Assets/camera.js +3 -2
  473. package/libs/floorplan/FloorplanGuidePlugin/Components/Camera.js +52 -52
  474. package/libs/floorplan/FloorplanGuidePlugin/Components/FloorplanCompass.js +110 -0
  475. package/libs/floorplan/FloorplanGuidePlugin/Components/FloorplanCompass.svelte.d.ts +1 -0
  476. package/libs/floorplan/FloorplanGuidePlugin/Components/Main.js +244 -216
  477. package/libs/floorplan/FloorplanGuidePlugin/Components/ObserverDots.js +91 -80
  478. package/libs/floorplan/FloorplanGuidePlugin/Controller.js +21 -19
  479. package/libs/floorplan/FloorplanGuidePlugin/index.js +8 -8
  480. package/libs/floorplan/FloorplanGuidePlugin/typing.d.ts +12 -0
  481. package/libs/index.js +149 -148
  482. package/libs/shared-utils/logger.js +1 -1
  483. package/package.json +1 -1
@@ -1,893 +1,462 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => {
4
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
- return value;
6
- };
7
- function noop() {
1
+ var z = Object.defineProperty;
2
+ var Z = (t, i, e) => i in t ? z(t, i, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[i] = e;
3
+ var C = (t, i, e) => (Z(t, typeof i != "symbol" ? i + "" : i, e), e);
4
+ function m() {
8
5
  }
9
- const promise = () => Promise.resolve();
10
- const state = {
6
+ const B = () => Promise.resolve(), k = {
11
7
  __queue: Promise.resolve()
12
8
  };
13
- function queue(promiseCallback = promise) {
14
- state.__queue = state.__queue.then(promiseCallback).catch(promise);
9
+ function G(t = B) {
10
+ k.__queue = k.__queue.then(t).catch(B);
15
11
  }
16
- function transformCoords(coords, cw, ch) {
17
- const _x = coords.x;
18
- const _y = coords.y;
19
- const x = Math.floor(_x / cw * 1e4) / 1e4;
20
- const y = Math.floor(_y / ch * 1e4) / 1e4;
21
- return { x, y };
12
+ function T(t, i, e) {
13
+ const n = t.x, s = t.y, r = Math.floor(n / i * 1e4) / 1e4, a = Math.floor(s / e * 1e4) / 1e4;
14
+ return { x: r, y: a };
22
15
  }
23
- function unTransformCoords(coords, cw, ch) {
24
- const { x: _x, y: _y } = coords;
25
- const x = _x * cw;
26
- const y = _y * ch;
27
- return { x, y };
16
+ function L(t, i, e) {
17
+ const { x: n, y: s } = t, r = n * i, a = s * e;
18
+ return { x: r, y: a };
28
19
  }
29
- function getQuadraticCurvePoint(points) {
30
- if (points.length < 2)
20
+ function j(t) {
21
+ if (t.length < 2)
31
22
  return {};
32
- const lastTwo = points.slice(-2);
33
- const control = lastTwo[0];
34
- const end = {
35
- x: (lastTwo[0].x + lastTwo[1].x) / 2,
36
- y: (lastTwo[0].y + lastTwo[1].y) / 2
23
+ const i = t.slice(-2), e = i[0], n = {
24
+ x: (i[0].x + i[1].x) / 2,
25
+ y: (i[0].y + i[1].y) / 2
37
26
  };
38
- return { control, end };
27
+ return { control: e, end: n };
39
28
  }
40
- function execInterval(i, time, callback = noop) {
41
- new Promise((resolve) => {
29
+ function U(t, i, e = m) {
30
+ new Promise((n) => {
42
31
  setTimeout(() => {
43
- callback();
44
- resolve(true);
45
- }, time * i);
32
+ e(), n(!0);
33
+ }, i * t);
46
34
  });
47
35
  }
48
- const _window = window;
49
- const _requestAnimationFrame = window.requestAnimationFrame || _window.webkitRequestAnimationFrame || ((fn) => setTimeout(fn, 16));
50
- function nextFrame(fn, delay = 0) {
51
- if (delay <= 0)
52
- _requestAnimationFrame(fn);
53
- else
54
- _requestAnimationFrame(() => nextFrame(fn, delay - 1));
36
+ const W = window, R = window.requestAnimationFrame || W.webkitRequestAnimationFrame || ((t) => setTimeout(t, 16));
37
+ function P(t, i = 0) {
38
+ i <= 0 ? R(t) : R(() => P(t, i - 1));
55
39
  }
56
- var Easing = Object.freeze({
40
+ var b = Object.freeze({
57
41
  Linear: Object.freeze({
58
- None: function(amount) {
59
- return amount;
42
+ None: function(t) {
43
+ return t;
60
44
  },
61
- In: function(amount) {
62
- return amount;
45
+ In: function(t) {
46
+ return t;
63
47
  },
64
- Out: function(amount) {
65
- return amount;
48
+ Out: function(t) {
49
+ return t;
66
50
  },
67
- InOut: function(amount) {
68
- return amount;
51
+ InOut: function(t) {
52
+ return t;
69
53
  }
70
54
  }),
71
55
  Quadratic: Object.freeze({
72
- In: function(amount) {
73
- return amount * amount;
56
+ In: function(t) {
57
+ return t * t;
74
58
  },
75
- Out: function(amount) {
76
- return amount * (2 - amount);
59
+ Out: function(t) {
60
+ return t * (2 - t);
77
61
  },
78
- InOut: function(amount) {
79
- if ((amount *= 2) < 1) {
80
- return 0.5 * amount * amount;
81
- }
82
- return -0.5 * (--amount * (amount - 2) - 1);
62
+ InOut: function(t) {
63
+ return (t *= 2) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1);
83
64
  }
84
65
  }),
85
66
  Cubic: Object.freeze({
86
- In: function(amount) {
87
- return amount * amount * amount;
67
+ In: function(t) {
68
+ return t * t * t;
88
69
  },
89
- Out: function(amount) {
90
- return --amount * amount * amount + 1;
70
+ Out: function(t) {
71
+ return --t * t * t + 1;
91
72
  },
92
- InOut: function(amount) {
93
- if ((amount *= 2) < 1) {
94
- return 0.5 * amount * amount * amount;
95
- }
96
- return 0.5 * ((amount -= 2) * amount * amount + 2);
73
+ InOut: function(t) {
74
+ return (t *= 2) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2);
97
75
  }
98
76
  }),
99
77
  Quartic: Object.freeze({
100
- In: function(amount) {
101
- return amount * amount * amount * amount;
78
+ In: function(t) {
79
+ return t * t * t * t;
102
80
  },
103
- Out: function(amount) {
104
- return 1 - --amount * amount * amount * amount;
81
+ Out: function(t) {
82
+ return 1 - --t * t * t * t;
105
83
  },
106
- InOut: function(amount) {
107
- if ((amount *= 2) < 1) {
108
- return 0.5 * amount * amount * amount * amount;
109
- }
110
- return -0.5 * ((amount -= 2) * amount * amount * amount - 2);
84
+ InOut: function(t) {
85
+ return (t *= 2) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2);
111
86
  }
112
87
  }),
113
88
  Quintic: Object.freeze({
114
- In: function(amount) {
115
- return amount * amount * amount * amount * amount;
89
+ In: function(t) {
90
+ return t * t * t * t * t;
116
91
  },
117
- Out: function(amount) {
118
- return --amount * amount * amount * amount * amount + 1;
92
+ Out: function(t) {
93
+ return --t * t * t * t * t + 1;
119
94
  },
120
- InOut: function(amount) {
121
- if ((amount *= 2) < 1) {
122
- return 0.5 * amount * amount * amount * amount * amount;
123
- }
124
- return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2);
95
+ InOut: function(t) {
96
+ return (t *= 2) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2);
125
97
  }
126
98
  }),
127
99
  Sinusoidal: Object.freeze({
128
- In: function(amount) {
129
- return 1 - Math.sin((1 - amount) * Math.PI / 2);
100
+ In: function(t) {
101
+ return 1 - Math.sin((1 - t) * Math.PI / 2);
130
102
  },
131
- Out: function(amount) {
132
- return Math.sin(amount * Math.PI / 2);
103
+ Out: function(t) {
104
+ return Math.sin(t * Math.PI / 2);
133
105
  },
134
- InOut: function(amount) {
135
- return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount)));
106
+ InOut: function(t) {
107
+ return 0.5 * (1 - Math.sin(Math.PI * (0.5 - t)));
136
108
  }
137
109
  }),
138
110
  Exponential: Object.freeze({
139
- In: function(amount) {
140
- return amount === 0 ? 0 : Math.pow(1024, amount - 1);
111
+ In: function(t) {
112
+ return t === 0 ? 0 : Math.pow(1024, t - 1);
141
113
  },
142
- Out: function(amount) {
143
- return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount);
114
+ Out: function(t) {
115
+ return t === 1 ? 1 : 1 - Math.pow(2, -10 * t);
144
116
  },
145
- InOut: function(amount) {
146
- if (amount === 0) {
147
- return 0;
148
- }
149
- if (amount === 1) {
150
- return 1;
151
- }
152
- if ((amount *= 2) < 1) {
153
- return 0.5 * Math.pow(1024, amount - 1);
154
- }
155
- return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2);
117
+ InOut: function(t) {
118
+ return t === 0 ? 0 : t === 1 ? 1 : (t *= 2) < 1 ? 0.5 * Math.pow(1024, t - 1) : 0.5 * (-Math.pow(2, -10 * (t - 1)) + 2);
156
119
  }
157
120
  }),
158
121
  Circular: Object.freeze({
159
- In: function(amount) {
160
- return 1 - Math.sqrt(1 - amount * amount);
122
+ In: function(t) {
123
+ return 1 - Math.sqrt(1 - t * t);
161
124
  },
162
- Out: function(amount) {
163
- return Math.sqrt(1 - --amount * amount);
125
+ Out: function(t) {
126
+ return Math.sqrt(1 - --t * t);
164
127
  },
165
- InOut: function(amount) {
166
- if ((amount *= 2) < 1) {
167
- return -0.5 * (Math.sqrt(1 - amount * amount) - 1);
168
- }
169
- return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1);
128
+ InOut: function(t) {
129
+ return (t *= 2) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);
170
130
  }
171
131
  }),
172
132
  Elastic: Object.freeze({
173
- In: function(amount) {
174
- if (amount === 0) {
175
- return 0;
176
- }
177
- if (amount === 1) {
178
- return 1;
179
- }
180
- return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);
133
+ In: function(t) {
134
+ return t === 0 ? 0 : t === 1 ? 1 : -Math.pow(2, 10 * (t - 1)) * Math.sin((t - 1.1) * 5 * Math.PI);
181
135
  },
182
- Out: function(amount) {
183
- if (amount === 0) {
184
- return 0;
185
- }
186
- if (amount === 1) {
187
- return 1;
188
- }
189
- return Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1;
136
+ Out: function(t) {
137
+ return t === 0 ? 0 : t === 1 ? 1 : Math.pow(2, -10 * t) * Math.sin((t - 0.1) * 5 * Math.PI) + 1;
190
138
  },
191
- InOut: function(amount) {
192
- if (amount === 0) {
193
- return 0;
194
- }
195
- if (amount === 1) {
196
- return 1;
197
- }
198
- amount *= 2;
199
- if (amount < 1) {
200
- return -0.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);
201
- }
202
- return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1;
139
+ InOut: function(t) {
140
+ return t === 0 ? 0 : t === 1 ? 1 : (t *= 2, t < 1 ? -0.5 * Math.pow(2, 10 * (t - 1)) * Math.sin((t - 1.1) * 5 * Math.PI) : 0.5 * Math.pow(2, -10 * (t - 1)) * Math.sin((t - 1.1) * 5 * Math.PI) + 1);
203
141
  }
204
142
  }),
205
143
  Back: Object.freeze({
206
- In: function(amount) {
207
- var s = 1.70158;
208
- return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s);
144
+ In: function(t) {
145
+ var i = 1.70158;
146
+ return t === 1 ? 1 : t * t * ((i + 1) * t - i);
209
147
  },
210
- Out: function(amount) {
211
- var s = 1.70158;
212
- return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1;
148
+ Out: function(t) {
149
+ var i = 1.70158;
150
+ return t === 0 ? 0 : --t * t * ((i + 1) * t + i) + 1;
213
151
  },
214
- InOut: function(amount) {
215
- var s = 1.70158 * 1.525;
216
- if ((amount *= 2) < 1) {
217
- return 0.5 * (amount * amount * ((s + 1) * amount - s));
218
- }
219
- return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2);
152
+ InOut: function(t) {
153
+ var i = 2.5949095;
154
+ return (t *= 2) < 1 ? 0.5 * (t * t * ((i + 1) * t - i)) : 0.5 * ((t -= 2) * t * ((i + 1) * t + i) + 2);
220
155
  }
221
156
  }),
222
157
  Bounce: Object.freeze({
223
- In: function(amount) {
224
- return 1 - Easing.Bounce.Out(1 - amount);
158
+ In: function(t) {
159
+ return 1 - b.Bounce.Out(1 - t);
225
160
  },
226
- Out: function(amount) {
227
- if (amount < 1 / 2.75) {
228
- return 7.5625 * amount * amount;
229
- } else if (amount < 2 / 2.75) {
230
- return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75;
231
- } else if (amount < 2.5 / 2.75) {
232
- return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375;
233
- } else {
234
- return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375;
235
- }
161
+ Out: function(t) {
162
+ return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + 0.75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375 : 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;
236
163
  },
237
- InOut: function(amount) {
238
- if (amount < 0.5) {
239
- return Easing.Bounce.In(amount * 2) * 0.5;
240
- }
241
- return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5;
164
+ InOut: function(t) {
165
+ return t < 0.5 ? b.Bounce.In(t * 2) * 0.5 : b.Bounce.Out(t * 2 - 1) * 0.5 + 0.5;
242
166
  }
243
167
  }),
244
- generatePow: function(power) {
245
- if (power === void 0) {
246
- power = 4;
247
- }
248
- power = power < Number.EPSILON ? Number.EPSILON : power;
249
- power = power > 1e4 ? 1e4 : power;
250
- return {
251
- In: function(amount) {
252
- return Math.pow(amount, power);
168
+ generatePow: function(t) {
169
+ return t === void 0 && (t = 4), t = t < Number.EPSILON ? Number.EPSILON : t, t = t > 1e4 ? 1e4 : t, {
170
+ In: function(i) {
171
+ return Math.pow(i, t);
253
172
  },
254
- Out: function(amount) {
255
- return 1 - Math.pow(1 - amount, power);
173
+ Out: function(i) {
174
+ return 1 - Math.pow(1 - i, t);
256
175
  },
257
- InOut: function(amount) {
258
- if (amount < 0.5) {
259
- return Math.pow(amount * 2, power) / 2;
260
- }
261
- return (1 - Math.pow(2 - amount * 2, power)) / 2 + 0.5;
176
+ InOut: function(i) {
177
+ return i < 0.5 ? Math.pow(i * 2, t) / 2 : (1 - Math.pow(2 - i * 2, t)) / 2 + 0.5;
262
178
  }
263
179
  };
264
180
  }
265
- });
266
- var now = function() {
181
+ }), N = function() {
267
182
  return performance.now();
268
- };
269
- var Group = (
183
+ }, Y = (
270
184
  /** @class */
271
185
  function() {
272
- function Group2() {
273
- this._tweens = {};
274
- this._tweensAddedDuringUpdate = {};
186
+ function t() {
187
+ this._tweens = {}, this._tweensAddedDuringUpdate = {};
275
188
  }
276
- Group2.prototype.getAll = function() {
277
- var _this = this;
278
- return Object.keys(this._tweens).map(function(tweenId) {
279
- return _this._tweens[tweenId];
189
+ return t.prototype.getAll = function() {
190
+ var i = this;
191
+ return Object.keys(this._tweens).map(function(e) {
192
+ return i._tweens[e];
280
193
  });
281
- };
282
- Group2.prototype.removeAll = function() {
194
+ }, t.prototype.removeAll = function() {
283
195
  this._tweens = {};
284
- };
285
- Group2.prototype.add = function(tween2) {
286
- this._tweens[tween2.getId()] = tween2;
287
- this._tweensAddedDuringUpdate[tween2.getId()] = tween2;
288
- };
289
- Group2.prototype.remove = function(tween2) {
290
- delete this._tweens[tween2.getId()];
291
- delete this._tweensAddedDuringUpdate[tween2.getId()];
292
- };
293
- Group2.prototype.update = function(time, preserve) {
294
- if (time === void 0) {
295
- time = now();
296
- }
297
- if (preserve === void 0) {
298
- preserve = false;
299
- }
300
- var tweenIds = Object.keys(this._tweens);
301
- if (tweenIds.length === 0) {
302
- return false;
303
- }
304
- while (tweenIds.length > 0) {
196
+ }, t.prototype.add = function(i) {
197
+ this._tweens[i.getId()] = i, this._tweensAddedDuringUpdate[i.getId()] = i;
198
+ }, t.prototype.remove = function(i) {
199
+ delete this._tweens[i.getId()], delete this._tweensAddedDuringUpdate[i.getId()];
200
+ }, t.prototype.update = function(i, e) {
201
+ i === void 0 && (i = N()), e === void 0 && (e = !1);
202
+ var n = Object.keys(this._tweens);
203
+ if (n.length === 0)
204
+ return !1;
205
+ for (; n.length > 0; ) {
305
206
  this._tweensAddedDuringUpdate = {};
306
- for (var i = 0; i < tweenIds.length; i++) {
307
- var tween2 = this._tweens[tweenIds[i]];
308
- var autoStart = !preserve;
309
- if (tween2 && tween2.update(time, autoStart) === false && !preserve) {
310
- delete this._tweens[tweenIds[i]];
311
- }
207
+ for (var s = 0; s < n.length; s++) {
208
+ var r = this._tweens[n[s]], a = !e;
209
+ r && r.update(i, a) === !1 && !e && delete this._tweens[n[s]];
312
210
  }
313
- tweenIds = Object.keys(this._tweensAddedDuringUpdate);
211
+ n = Object.keys(this._tweensAddedDuringUpdate);
314
212
  }
315
- return true;
316
- };
317
- return Group2;
213
+ return !0;
214
+ }, t;
318
215
  }()
319
- );
320
- var Interpolation = {
321
- Linear: function(v, k) {
322
- var m = v.length - 1;
323
- var f = m * k;
324
- var i = Math.floor(f);
325
- var fn = Interpolation.Utils.Linear;
326
- if (k < 0) {
327
- return fn(v[0], v[1], f);
328
- }
329
- if (k > 1) {
330
- return fn(v[m], v[m - 1], m - f);
331
- }
332
- return fn(v[i], v[i + 1 > m ? m : i + 1], f - i);
216
+ ), w = {
217
+ Linear: function(t, i) {
218
+ var e = t.length - 1, n = e * i, s = Math.floor(n), r = w.Utils.Linear;
219
+ return i < 0 ? r(t[0], t[1], n) : i > 1 ? r(t[e], t[e - 1], e - n) : r(t[s], t[s + 1 > e ? e : s + 1], n - s);
333
220
  },
334
- Bezier: function(v, k) {
335
- var b = 0;
336
- var n = v.length - 1;
337
- var pw = Math.pow;
338
- var bn = Interpolation.Utils.Bernstein;
339
- for (var i = 0; i <= n; i++) {
340
- b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i);
341
- }
342
- return b;
221
+ Bezier: function(t, i) {
222
+ for (var e = 0, n = t.length - 1, s = Math.pow, r = w.Utils.Bernstein, a = 0; a <= n; a++)
223
+ e += s(1 - i, n - a) * s(i, a) * t[a] * r(n, a);
224
+ return e;
343
225
  },
344
- CatmullRom: function(v, k) {
345
- var m = v.length - 1;
346
- var f = m * k;
347
- var i = Math.floor(f);
348
- var fn = Interpolation.Utils.CatmullRom;
349
- if (v[0] === v[m]) {
350
- if (k < 0) {
351
- i = Math.floor(f = m * (1 + k));
352
- }
353
- return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i);
354
- } else {
355
- if (k < 0) {
356
- return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]);
357
- }
358
- if (k > 1) {
359
- return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]);
360
- }
361
- return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i);
362
- }
226
+ CatmullRom: function(t, i) {
227
+ var e = t.length - 1, n = e * i, s = Math.floor(n), r = w.Utils.CatmullRom;
228
+ return t[0] === t[e] ? (i < 0 && (s = Math.floor(n = e * (1 + i))), r(t[(s - 1 + e) % e], t[s], t[(s + 1) % e], t[(s + 2) % e], n - s)) : i < 0 ? t[0] - (r(t[0], t[0], t[1], t[1], -n) - t[0]) : i > 1 ? t[e] - (r(t[e], t[e], t[e - 1], t[e - 1], n - e) - t[e]) : r(t[s ? s - 1 : 0], t[s], t[e < s + 1 ? e : s + 1], t[e < s + 2 ? e : s + 2], n - s);
363
229
  },
364
230
  Utils: {
365
- Linear: function(p0, p1, t) {
366
- return (p1 - p0) * t + p0;
231
+ Linear: function(t, i, e) {
232
+ return (i - t) * e + t;
367
233
  },
368
- Bernstein: function(n, i) {
369
- var fc = Interpolation.Utils.Factorial;
370
- return fc(n) / fc(i) / fc(n - i);
234
+ Bernstein: function(t, i) {
235
+ var e = w.Utils.Factorial;
236
+ return e(t) / e(i) / e(t - i);
371
237
  },
372
238
  Factorial: function() {
373
- var a = [1];
374
- return function(n) {
375
- var s = 1;
376
- if (a[n]) {
377
- return a[n];
378
- }
379
- for (var i = n; i > 1; i--) {
380
- s *= i;
381
- }
382
- a[n] = s;
383
- return s;
239
+ var t = [1];
240
+ return function(i) {
241
+ var e = 1;
242
+ if (t[i])
243
+ return t[i];
244
+ for (var n = i; n > 1; n--)
245
+ e *= n;
246
+ return t[i] = e, e;
384
247
  };
385
248
  }(),
386
- CatmullRom: function(p0, p1, p2, p3, t) {
387
- var v0 = (p2 - p0) * 0.5;
388
- var v1 = (p3 - p1) * 0.5;
389
- var t2 = t * t;
390
- var t3 = t * t2;
391
- return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;
249
+ CatmullRom: function(t, i, e, n, s) {
250
+ var r = (e - t) * 0.5, a = (n - i) * 0.5, o = s * s, c = s * o;
251
+ return (2 * i - 2 * e + r + a) * c + (-3 * i + 3 * e - 2 * r - a) * o + r * s + i;
392
252
  }
393
253
  }
394
- };
395
- var Sequence = (
254
+ }, H = (
396
255
  /** @class */
397
256
  function() {
398
- function Sequence2() {
257
+ function t() {
399
258
  }
400
- Sequence2.nextId = function() {
401
- return Sequence2._nextId++;
402
- };
403
- Sequence2._nextId = 0;
404
- return Sequence2;
259
+ return t.nextId = function() {
260
+ return t._nextId++;
261
+ }, t._nextId = 0, t;
405
262
  }()
406
- );
407
- var mainGroup = new Group();
408
- var Tween = (
263
+ ), E = new Y(), Q = (
409
264
  /** @class */
410
265
  function() {
411
- function Tween2(_object, _group) {
412
- if (_group === void 0) {
413
- _group = mainGroup;
414
- }
415
- this._object = _object;
416
- this._group = _group;
417
- this._isPaused = false;
418
- this._pauseStart = 0;
419
- this._valuesStart = {};
420
- this._valuesEnd = {};
421
- this._valuesStartRepeat = {};
422
- this._duration = 1e3;
423
- this._isDynamic = false;
424
- this._initialRepeat = 0;
425
- this._repeat = 0;
426
- this._yoyo = false;
427
- this._isPlaying = false;
428
- this._reversed = false;
429
- this._delayTime = 0;
430
- this._startTime = 0;
431
- this._easingFunction = Easing.Linear.None;
432
- this._interpolationFunction = Interpolation.Linear;
433
- this._chainedTweens = [];
434
- this._onStartCallbackFired = false;
435
- this._onEveryStartCallbackFired = false;
436
- this._id = Sequence.nextId();
437
- this._isChainStopped = false;
438
- this._propertiesAreSetUp = false;
439
- this._goToEnd = false;
266
+ function t(i, e) {
267
+ e === void 0 && (e = E), this._object = i, this._group = e, this._isPaused = !1, this._pauseStart = 0, this._valuesStart = {}, this._valuesEnd = {}, this._valuesStartRepeat = {}, this._duration = 1e3, this._isDynamic = !1, this._initialRepeat = 0, this._repeat = 0, this._yoyo = !1, this._isPlaying = !1, this._reversed = !1, this._delayTime = 0, this._startTime = 0, this._easingFunction = b.Linear.None, this._interpolationFunction = w.Linear, this._chainedTweens = [], this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._id = H.nextId(), this._isChainStopped = !1, this._propertiesAreSetUp = !1, this._goToEnd = !1;
440
268
  }
441
- Tween2.prototype.getId = function() {
269
+ return t.prototype.getId = function() {
442
270
  return this._id;
443
- };
444
- Tween2.prototype.isPlaying = function() {
271
+ }, t.prototype.isPlaying = function() {
445
272
  return this._isPlaying;
446
- };
447
- Tween2.prototype.isPaused = function() {
273
+ }, t.prototype.isPaused = function() {
448
274
  return this._isPaused;
449
- };
450
- Tween2.prototype.getDuration = function() {
275
+ }, t.prototype.getDuration = function() {
451
276
  return this._duration;
452
- };
453
- Tween2.prototype.to = function(target, duration) {
454
- if (duration === void 0) {
455
- duration = 1e3;
456
- }
457
- if (this._isPlaying)
277
+ }, t.prototype.to = function(i, e) {
278
+ if (e === void 0 && (e = 1e3), this._isPlaying)
458
279
  throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.");
459
- this._valuesEnd = target;
460
- this._propertiesAreSetUp = false;
461
- this._duration = duration < 0 ? 0 : duration;
462
- return this;
463
- };
464
- Tween2.prototype.duration = function(duration) {
465
- if (duration === void 0) {
466
- duration = 1e3;
467
- }
468
- this._duration = duration < 0 ? 0 : duration;
469
- return this;
470
- };
471
- Tween2.prototype.dynamic = function(dynamic) {
472
- if (dynamic === void 0) {
473
- dynamic = false;
474
- }
475
- this._isDynamic = dynamic;
476
- return this;
477
- };
478
- Tween2.prototype.start = function(time, overrideStartingValues) {
479
- if (time === void 0) {
480
- time = now();
481
- }
482
- if (overrideStartingValues === void 0) {
483
- overrideStartingValues = false;
484
- }
485
- if (this._isPlaying) {
280
+ return this._valuesEnd = i, this._propertiesAreSetUp = !1, this._duration = e < 0 ? 0 : e, this;
281
+ }, t.prototype.duration = function(i) {
282
+ return i === void 0 && (i = 1e3), this._duration = i < 0 ? 0 : i, this;
283
+ }, t.prototype.dynamic = function(i) {
284
+ return i === void 0 && (i = !1), this._isDynamic = i, this;
285
+ }, t.prototype.start = function(i, e) {
286
+ if (i === void 0 && (i = N()), e === void 0 && (e = !1), this._isPlaying)
486
287
  return this;
487
- }
488
- this._group && this._group.add(this);
489
- this._repeat = this._initialRepeat;
490
- if (this._reversed) {
491
- this._reversed = false;
492
- for (var property in this._valuesStartRepeat) {
493
- this._swapEndStartRepeatValues(property);
494
- this._valuesStart[property] = this._valuesStartRepeat[property];
288
+ if (this._group && this._group.add(this), this._repeat = this._initialRepeat, this._reversed) {
289
+ this._reversed = !1;
290
+ for (var n in this._valuesStartRepeat)
291
+ this._swapEndStartRepeatValues(n), this._valuesStart[n] = this._valuesStartRepeat[n];
292
+ }
293
+ if (this._isPlaying = !0, this._isPaused = !1, this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._isChainStopped = !1, this._startTime = i, this._startTime += this._delayTime, !this._propertiesAreSetUp || e) {
294
+ if (this._propertiesAreSetUp = !0, !this._isDynamic) {
295
+ var s = {};
296
+ for (var r in this._valuesEnd)
297
+ s[r] = this._valuesEnd[r];
298
+ this._valuesEnd = s;
495
299
  }
496
- }
497
- this._isPlaying = true;
498
- this._isPaused = false;
499
- this._onStartCallbackFired = false;
500
- this._onEveryStartCallbackFired = false;
501
- this._isChainStopped = false;
502
- this._startTime = time;
503
- this._startTime += this._delayTime;
504
- if (!this._propertiesAreSetUp || overrideStartingValues) {
505
- this._propertiesAreSetUp = true;
506
- if (!this._isDynamic) {
507
- var tmp = {};
508
- for (var prop in this._valuesEnd)
509
- tmp[prop] = this._valuesEnd[prop];
510
- this._valuesEnd = tmp;
511
- }
512
- this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues);
300
+ this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, e);
513
301
  }
514
302
  return this;
515
- };
516
- Tween2.prototype.startFromCurrentValues = function(time) {
517
- return this.start(time, true);
518
- };
519
- Tween2.prototype._setupProperties = function(_object, _valuesStart, _valuesEnd, _valuesStartRepeat, overrideStartingValues) {
520
- for (var property in _valuesEnd) {
521
- var startValue = _object[property];
522
- var startValueIsArray = Array.isArray(startValue);
523
- var propType = startValueIsArray ? "array" : typeof startValue;
524
- var isInterpolationList = !startValueIsArray && Array.isArray(_valuesEnd[property]);
525
- if (propType === "undefined" || propType === "function") {
526
- continue;
527
- }
528
- if (isInterpolationList) {
529
- var endValues = _valuesEnd[property];
530
- if (endValues.length === 0) {
531
- continue;
532
- }
533
- var temp = [startValue];
534
- for (var i = 0, l = endValues.length; i < l; i += 1) {
535
- var value = this._handleRelativeValue(startValue, endValues[i]);
536
- if (isNaN(value)) {
537
- isInterpolationList = false;
538
- console.warn("Found invalid interpolation list. Skipping.");
539
- break;
303
+ }, t.prototype.startFromCurrentValues = function(i) {
304
+ return this.start(i, !0);
305
+ }, t.prototype._setupProperties = function(i, e, n, s, r) {
306
+ for (var a in n) {
307
+ var o = i[a], c = Array.isArray(o), d = c ? "array" : typeof o, I = !c && Array.isArray(n[a]);
308
+ if (!(d === "undefined" || d === "function")) {
309
+ if (I) {
310
+ var u = n[a];
311
+ if (u.length === 0)
312
+ continue;
313
+ for (var l = [o], h = 0, g = u.length; h < g; h += 1) {
314
+ var f = this._handleRelativeValue(o, u[h]);
315
+ if (isNaN(f)) {
316
+ I = !1, console.warn("Found invalid interpolation list. Skipping.");
317
+ break;
318
+ }
319
+ l.push(f);
540
320
  }
541
- temp.push(value);
542
- }
543
- if (isInterpolationList) {
544
- _valuesEnd[property] = temp;
545
- }
546
- }
547
- if ((propType === "object" || startValueIsArray) && startValue && !isInterpolationList) {
548
- _valuesStart[property] = startValueIsArray ? [] : {};
549
- var nestedObject = startValue;
550
- for (var prop in nestedObject) {
551
- _valuesStart[property][prop] = nestedObject[prop];
552
- }
553
- _valuesStartRepeat[property] = startValueIsArray ? [] : {};
554
- var endValues = _valuesEnd[property];
555
- if (!this._isDynamic) {
556
- var tmp = {};
557
- for (var prop in endValues)
558
- tmp[prop] = endValues[prop];
559
- _valuesEnd[property] = endValues = tmp;
560
- }
561
- this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property], overrideStartingValues);
562
- } else {
563
- if (typeof _valuesStart[property] === "undefined" || overrideStartingValues) {
564
- _valuesStart[property] = startValue;
565
- }
566
- if (!startValueIsArray) {
567
- _valuesStart[property] *= 1;
568
- }
569
- if (isInterpolationList) {
570
- _valuesStartRepeat[property] = _valuesEnd[property].slice().reverse();
571
- } else {
572
- _valuesStartRepeat[property] = _valuesStart[property] || 0;
321
+ I && (n[a] = l);
573
322
  }
323
+ if ((d === "object" || c) && o && !I) {
324
+ e[a] = c ? [] : {};
325
+ var p = o;
326
+ for (var A in p)
327
+ e[a][A] = p[A];
328
+ s[a] = c ? [] : {};
329
+ var u = n[a];
330
+ if (!this._isDynamic) {
331
+ var v = {};
332
+ for (var A in u)
333
+ v[A] = u[A];
334
+ n[a] = u = v;
335
+ }
336
+ this._setupProperties(p, e[a], u, s[a], r);
337
+ } else
338
+ (typeof e[a] == "undefined" || r) && (e[a] = o), c || (e[a] *= 1), I ? s[a] = n[a].slice().reverse() : s[a] = e[a] || 0;
574
339
  }
575
340
  }
576
- };
577
- Tween2.prototype.stop = function() {
578
- if (!this._isChainStopped) {
579
- this._isChainStopped = true;
580
- this.stopChainedTweens();
581
- }
582
- if (!this._isPlaying) {
583
- return this;
584
- }
585
- this._group && this._group.remove(this);
586
- this._isPlaying = false;
587
- this._isPaused = false;
588
- if (this._onStopCallback) {
589
- this._onStopCallback(this._object);
590
- }
591
- return this;
592
- };
593
- Tween2.prototype.end = function() {
594
- this._goToEnd = true;
595
- this.update(Infinity);
596
- return this;
597
- };
598
- Tween2.prototype.pause = function(time) {
599
- if (time === void 0) {
600
- time = now();
601
- }
602
- if (this._isPaused || !this._isPlaying) {
603
- return this;
604
- }
605
- this._isPaused = true;
606
- this._pauseStart = time;
607
- this._group && this._group.remove(this);
608
- return this;
609
- };
610
- Tween2.prototype.resume = function(time) {
611
- if (time === void 0) {
612
- time = now();
613
- }
614
- if (!this._isPaused || !this._isPlaying) {
615
- return this;
616
- }
617
- this._isPaused = false;
618
- this._startTime += time - this._pauseStart;
619
- this._pauseStart = 0;
620
- this._group && this._group.add(this);
621
- return this;
622
- };
623
- Tween2.prototype.stopChainedTweens = function() {
624
- for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {
341
+ }, t.prototype.stop = function() {
342
+ return this._isChainStopped || (this._isChainStopped = !0, this.stopChainedTweens()), this._isPlaying ? (this._group && this._group.remove(this), this._isPlaying = !1, this._isPaused = !1, this._onStopCallback && this._onStopCallback(this._object), this) : this;
343
+ }, t.prototype.end = function() {
344
+ return this._goToEnd = !0, this.update(1 / 0), this;
345
+ }, t.prototype.pause = function(i) {
346
+ return i === void 0 && (i = N()), this._isPaused || !this._isPlaying ? this : (this._isPaused = !0, this._pauseStart = i, this._group && this._group.remove(this), this);
347
+ }, t.prototype.resume = function(i) {
348
+ return i === void 0 && (i = N()), !this._isPaused || !this._isPlaying ? this : (this._isPaused = !1, this._startTime += i - this._pauseStart, this._pauseStart = 0, this._group && this._group.add(this), this);
349
+ }, t.prototype.stopChainedTweens = function() {
350
+ for (var i = 0, e = this._chainedTweens.length; i < e; i++)
625
351
  this._chainedTweens[i].stop();
626
- }
627
- return this;
628
- };
629
- Tween2.prototype.group = function(group) {
630
- if (group === void 0) {
631
- group = mainGroup;
632
- }
633
- this._group = group;
634
- return this;
635
- };
636
- Tween2.prototype.delay = function(amount) {
637
- if (amount === void 0) {
638
- amount = 0;
639
- }
640
- this._delayTime = amount;
641
- return this;
642
- };
643
- Tween2.prototype.repeat = function(times) {
644
- if (times === void 0) {
645
- times = 0;
646
- }
647
- this._initialRepeat = times;
648
- this._repeat = times;
649
352
  return this;
650
- };
651
- Tween2.prototype.repeatDelay = function(amount) {
652
- this._repeatDelayTime = amount;
653
- return this;
654
- };
655
- Tween2.prototype.yoyo = function(yoyo) {
656
- if (yoyo === void 0) {
657
- yoyo = false;
658
- }
659
- this._yoyo = yoyo;
660
- return this;
661
- };
662
- Tween2.prototype.easing = function(easingFunction) {
663
- if (easingFunction === void 0) {
664
- easingFunction = Easing.Linear.None;
665
- }
666
- this._easingFunction = easingFunction;
667
- return this;
668
- };
669
- Tween2.prototype.interpolation = function(interpolationFunction) {
670
- if (interpolationFunction === void 0) {
671
- interpolationFunction = Interpolation.Linear;
672
- }
673
- this._interpolationFunction = interpolationFunction;
674
- return this;
675
- };
676
- Tween2.prototype.chain = function() {
677
- var tweens = [];
678
- for (var _i = 0; _i < arguments.length; _i++) {
679
- tweens[_i] = arguments[_i];
680
- }
681
- this._chainedTweens = tweens;
682
- return this;
683
- };
684
- Tween2.prototype.onStart = function(callback) {
685
- this._onStartCallback = callback;
686
- return this;
687
- };
688
- Tween2.prototype.onEveryStart = function(callback) {
689
- this._onEveryStartCallback = callback;
690
- return this;
691
- };
692
- Tween2.prototype.onUpdate = function(callback) {
693
- this._onUpdateCallback = callback;
694
- return this;
695
- };
696
- Tween2.prototype.onRepeat = function(callback) {
697
- this._onRepeatCallback = callback;
698
- return this;
699
- };
700
- Tween2.prototype.onComplete = function(callback) {
701
- this._onCompleteCallback = callback;
702
- return this;
703
- };
704
- Tween2.prototype.onStop = function(callback) {
705
- this._onStopCallback = callback;
706
- return this;
707
- };
708
- Tween2.prototype.update = function(time, autoStart) {
709
- var _this = this;
710
- var _a;
711
- if (time === void 0) {
712
- time = now();
713
- }
714
- if (autoStart === void 0) {
715
- autoStart = true;
716
- }
717
- if (this._isPaused)
718
- return true;
719
- var property;
720
- var endTime = this._startTime + this._duration;
353
+ }, t.prototype.group = function(i) {
354
+ return i === void 0 && (i = E), this._group = i, this;
355
+ }, t.prototype.delay = function(i) {
356
+ return i === void 0 && (i = 0), this._delayTime = i, this;
357
+ }, t.prototype.repeat = function(i) {
358
+ return i === void 0 && (i = 0), this._initialRepeat = i, this._repeat = i, this;
359
+ }, t.prototype.repeatDelay = function(i) {
360
+ return this._repeatDelayTime = i, this;
361
+ }, t.prototype.yoyo = function(i) {
362
+ return i === void 0 && (i = !1), this._yoyo = i, this;
363
+ }, t.prototype.easing = function(i) {
364
+ return i === void 0 && (i = b.Linear.None), this._easingFunction = i, this;
365
+ }, t.prototype.interpolation = function(i) {
366
+ return i === void 0 && (i = w.Linear), this._interpolationFunction = i, this;
367
+ }, t.prototype.chain = function() {
368
+ for (var i = [], e = 0; e < arguments.length; e++)
369
+ i[e] = arguments[e];
370
+ return this._chainedTweens = i, this;
371
+ }, t.prototype.onStart = function(i) {
372
+ return this._onStartCallback = i, this;
373
+ }, t.prototype.onEveryStart = function(i) {
374
+ return this._onEveryStartCallback = i, this;
375
+ }, t.prototype.onUpdate = function(i) {
376
+ return this._onUpdateCallback = i, this;
377
+ }, t.prototype.onRepeat = function(i) {
378
+ return this._onRepeatCallback = i, this;
379
+ }, t.prototype.onComplete = function(i) {
380
+ return this._onCompleteCallback = i, this;
381
+ }, t.prototype.onStop = function(i) {
382
+ return this._onStopCallback = i, this;
383
+ }, t.prototype.update = function(i, e) {
384
+ var n = this, s;
385
+ if (i === void 0 && (i = N()), e === void 0 && (e = !0), this._isPaused)
386
+ return !0;
387
+ var r, a = this._startTime + this._duration;
721
388
  if (!this._goToEnd && !this._isPlaying) {
722
- if (time > endTime)
723
- return false;
724
- if (autoStart)
725
- this.start(time, true);
726
- }
727
- this._goToEnd = false;
728
- if (time < this._startTime) {
729
- return true;
730
- }
731
- if (this._onStartCallbackFired === false) {
732
- if (this._onStartCallback) {
733
- this._onStartCallback(this._object);
734
- }
735
- this._onStartCallbackFired = true;
736
- }
737
- if (this._onEveryStartCallbackFired === false) {
738
- if (this._onEveryStartCallback) {
739
- this._onEveryStartCallback(this._object);
740
- }
741
- this._onEveryStartCallbackFired = true;
742
- }
743
- var elapsedTime = time - this._startTime;
744
- var durationAndDelay = this._duration + ((_a = this._repeatDelayTime) !== null && _a !== void 0 ? _a : this._delayTime);
745
- var totalTime = this._duration + this._repeat * durationAndDelay;
746
- var calculateElapsedPortion = function() {
747
- if (_this._duration === 0)
389
+ if (i > a)
390
+ return !1;
391
+ e && this.start(i, !0);
392
+ }
393
+ if (this._goToEnd = !1, i < this._startTime)
394
+ return !0;
395
+ this._onStartCallbackFired === !1 && (this._onStartCallback && this._onStartCallback(this._object), this._onStartCallbackFired = !0), this._onEveryStartCallbackFired === !1 && (this._onEveryStartCallback && this._onEveryStartCallback(this._object), this._onEveryStartCallbackFired = !0);
396
+ var o = i - this._startTime, c = this._duration + ((s = this._repeatDelayTime) !== null && s !== void 0 ? s : this._delayTime), d = this._duration + this._repeat * c, I = function() {
397
+ if (n._duration === 0 || o > d)
748
398
  return 1;
749
- if (elapsedTime > totalTime) {
750
- return 1;
751
- }
752
- var timesRepeated = Math.trunc(elapsedTime / durationAndDelay);
753
- var timeIntoCurrentRepeat = elapsedTime - timesRepeated * durationAndDelay;
754
- var portion = Math.min(timeIntoCurrentRepeat / _this._duration, 1);
755
- if (portion === 0 && elapsedTime === _this._duration) {
756
- return 1;
757
- }
758
- return portion;
759
- };
760
- var elapsed = calculateElapsedPortion();
761
- var value = this._easingFunction(elapsed);
762
- this._updateProperties(this._object, this._valuesStart, this._valuesEnd, value);
763
- if (this._onUpdateCallback) {
764
- this._onUpdateCallback(this._object, elapsed);
765
- }
766
- if (this._duration === 0 || elapsedTime >= this._duration) {
399
+ var p = Math.trunc(o / c), A = o - p * c, v = Math.min(A / n._duration, 1);
400
+ return v === 0 && o === n._duration ? 1 : v;
401
+ }, u = I(), l = this._easingFunction(u);
402
+ if (this._updateProperties(this._object, this._valuesStart, this._valuesEnd, l), this._onUpdateCallback && this._onUpdateCallback(this._object, u), this._duration === 0 || o >= this._duration)
767
403
  if (this._repeat > 0) {
768
- var completeCount = Math.min(Math.trunc((elapsedTime - this._duration) / durationAndDelay) + 1, this._repeat);
769
- if (isFinite(this._repeat)) {
770
- this._repeat -= completeCount;
771
- }
772
- for (property in this._valuesStartRepeat) {
773
- if (!this._yoyo && typeof this._valuesEnd[property] === "string") {
774
- this._valuesStartRepeat[property] = // eslint-disable-next-line
775
- // @ts-ignore FIXME?
776
- this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]);
777
- }
778
- if (this._yoyo) {
779
- this._swapEndStartRepeatValues(property);
780
- }
781
- this._valuesStart[property] = this._valuesStartRepeat[property];
782
- }
783
- if (this._yoyo) {
784
- this._reversed = !this._reversed;
785
- }
786
- this._startTime += durationAndDelay * completeCount;
787
- if (this._onRepeatCallback) {
788
- this._onRepeatCallback(this._object);
789
- }
790
- this._onEveryStartCallbackFired = false;
791
- return true;
404
+ var h = Math.min(Math.trunc((o - this._duration) / c) + 1, this._repeat);
405
+ isFinite(this._repeat) && (this._repeat -= h);
406
+ for (r in this._valuesStartRepeat)
407
+ !this._yoyo && typeof this._valuesEnd[r] == "string" && (this._valuesStartRepeat[r] = // eslint-disable-next-line
408
+ // @ts-ignore FIXME?
409
+ this._valuesStartRepeat[r] + parseFloat(this._valuesEnd[r])), this._yoyo && this._swapEndStartRepeatValues(r), this._valuesStart[r] = this._valuesStartRepeat[r];
410
+ return this._yoyo && (this._reversed = !this._reversed), this._startTime += c * h, this._onRepeatCallback && this._onRepeatCallback(this._object), this._onEveryStartCallbackFired = !1, !0;
792
411
  } else {
793
- if (this._onCompleteCallback) {
794
- this._onCompleteCallback(this._object);
795
- }
796
- for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {
797
- this._chainedTweens[i].start(this._startTime + this._duration, false);
798
- }
799
- this._isPlaying = false;
800
- return false;
801
- }
802
- }
803
- return true;
804
- };
805
- Tween2.prototype._updateProperties = function(_object, _valuesStart, _valuesEnd, value) {
806
- for (var property in _valuesEnd) {
807
- if (_valuesStart[property] === void 0) {
808
- continue;
412
+ this._onCompleteCallback && this._onCompleteCallback(this._object);
413
+ for (var g = 0, f = this._chainedTweens.length; g < f; g++)
414
+ this._chainedTweens[g].start(this._startTime + this._duration, !1);
415
+ return this._isPlaying = !1, !1;
809
416
  }
810
- var start = _valuesStart[property] || 0;
811
- var end = _valuesEnd[property];
812
- var startIsArray = Array.isArray(_object[property]);
813
- var endIsArray = Array.isArray(end);
814
- var isInterpolationList = !startIsArray && endIsArray;
815
- if (isInterpolationList) {
816
- _object[property] = this._interpolationFunction(end, value);
817
- } else if (typeof end === "object" && end) {
818
- this._updateProperties(_object[property], start, end, value);
819
- } else {
820
- end = this._handleRelativeValue(start, end);
821
- if (typeof end === "number") {
822
- _object[property] = start + (end - start) * value;
823
- }
417
+ return !0;
418
+ }, t.prototype._updateProperties = function(i, e, n, s) {
419
+ for (var r in n)
420
+ if (e[r] !== void 0) {
421
+ var a = e[r] || 0, o = n[r], c = Array.isArray(i[r]), d = Array.isArray(o), I = !c && d;
422
+ I ? i[r] = this._interpolationFunction(o, s) : typeof o == "object" && o ? this._updateProperties(i[r], a, o, s) : (o = this._handleRelativeValue(a, o), typeof o == "number" && (i[r] = a + (o - a) * s));
824
423
  }
825
- }
826
- };
827
- Tween2.prototype._handleRelativeValue = function(start, end) {
828
- if (typeof end !== "string") {
829
- return end;
830
- }
831
- if (end.charAt(0) === "+" || end.charAt(0) === "-") {
832
- return start + parseFloat(end);
833
- }
834
- return parseFloat(end);
835
- };
836
- Tween2.prototype._swapEndStartRepeatValues = function(property) {
837
- var tmp = this._valuesStartRepeat[property];
838
- var endValue = this._valuesEnd[property];
839
- if (typeof endValue === "string") {
840
- this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue);
841
- } else {
842
- this._valuesStartRepeat[property] = this._valuesEnd[property];
843
- }
844
- this._valuesEnd[property] = tmp;
845
- };
846
- return Tween2;
424
+ }, t.prototype._handleRelativeValue = function(i, e) {
425
+ return typeof e != "string" ? e : e.charAt(0) === "+" || e.charAt(0) === "-" ? i + parseFloat(e) : parseFloat(e);
426
+ }, t.prototype._swapEndStartRepeatValues = function(i) {
427
+ var e = this._valuesStartRepeat[i], n = this._valuesEnd[i];
428
+ typeof n == "string" ? this._valuesStartRepeat[i] = this._valuesStartRepeat[i] + parseFloat(n) : this._valuesStartRepeat[i] = this._valuesEnd[i], this._valuesEnd[i] = e;
429
+ }, t;
847
430
  }()
848
- );
849
- var TWEEN = mainGroup;
850
- TWEEN.getAll.bind(TWEEN);
851
- TWEEN.removeAll.bind(TWEEN);
852
- TWEEN.add.bind(TWEEN);
853
- TWEEN.remove.bind(TWEEN);
854
- TWEEN.update.bind(TWEEN);
855
- function tween(from, to, duration, easing = Easing.Linear.None) {
856
- const tweenInstance = new Tween(from).to(to, duration).easing(easing).start();
857
- function animate(time) {
858
- if (!tweenInstance.update(time))
859
- return;
860
- requestAnimationFrame(animate);
861
- }
862
- requestAnimationFrame(animate);
863
- return tweenInstance;
431
+ ), _ = E;
432
+ _.getAll.bind(_);
433
+ _.removeAll.bind(_);
434
+ _.add.bind(_);
435
+ _.remove.bind(_);
436
+ _.update.bind(_);
437
+ function F(t, i, e, n = b.Linear.None) {
438
+ const s = new Q(t).to(i, e).easing(n).start();
439
+ function r(a) {
440
+ s.update(a) && requestAnimationFrame(r);
441
+ }
442
+ return requestAnimationFrame(r), s;
864
443
  }
865
- var PaintBrushTypeEnum = /* @__PURE__ */ ((PaintBrushTypeEnum2) => {
866
- PaintBrushTypeEnum2["Drawline"] = "Drawline";
867
- PaintBrushTypeEnum2["Undo"] = "Undo";
868
- PaintBrushTypeEnum2["Exit"] = "Exit";
869
- return PaintBrushTypeEnum2;
870
- })(PaintBrushTypeEnum || {});
871
- const EVENT_SYMBOL = Symbol("$$PAINT_BRUSH_EVENT$$");
872
- function __generateEventIfNotExisted(instance) {
873
- if (!instance[EVENT_SYMBOL]) {
874
- instance[EVENT_SYMBOL] = {};
875
- }
876
- return instance[EVENT_SYMBOL];
444
+ var y = /* @__PURE__ */ ((t) => (t.Drawline = "Drawline", t.Undo = "Undo", t.Exit = "Exit", t))(y || {});
445
+ const x = Symbol("$$PAINT_BRUSH_EVENT$$");
446
+ function S(t) {
447
+ return t[x] || (t[x] = {}), t[x];
877
448
  }
878
- function __removeEventIfNotExisted(instance) {
879
- if (!instance[EVENT_SYMBOL]) {
880
- delete instance[EVENT_SYMBOL];
881
- }
449
+ function J(t) {
450
+ t[x] || delete t[x];
882
451
  }
883
- class Subscribe {
452
+ class K {
884
453
  /**
885
454
  * 判断是否注册了事件
886
455
  * @param name 事件类型
887
456
  */
888
- hasListener(name) {
889
- const events = __generateEventIfNotExisted(this);
890
- return events && events[name] && events[name].length > 0;
457
+ hasListener(i) {
458
+ const e = S(this);
459
+ return e && e[i] && e[i].length > 0;
891
460
  }
892
461
  /**
893
462
  * 注册事件
@@ -898,12 +467,9 @@ class Subscribe {
898
467
  * @template K 预设的监听事件名称
899
468
  * @template C 回调函数函数上下文
900
469
  */
901
- on(name, callback, once) {
902
- const events = __generateEventIfNotExisted(this);
903
- if (!events[name])
904
- events[name] = [];
905
- events[name].push([callback, once || false]);
906
- return () => this.off(name, callback);
470
+ on(i, e, n) {
471
+ const s = S(this);
472
+ return s[i] || (s[i] = []), s[i].push([e, n || !1]), () => this.off(i, e);
907
473
  }
908
474
  /**
909
475
  * 注册事件(是否只执行一次)
@@ -913,8 +479,8 @@ class Subscribe {
913
479
  * @template K 预设的监听事件名称
914
480
  * @template C 回调函数函数上下文
915
481
  */
916
- once(name, callback) {
917
- return this.on(name, callback, true);
482
+ once(i, e) {
483
+ return this.on(i, e, !0);
918
484
  }
919
485
  /**
920
486
  * 解除事件
@@ -925,26 +491,20 @@ class Subscribe {
925
491
  * @param callback 事件回调函数
926
492
  * @template K 预设的监听事件名称
927
493
  */
928
- off(name, callback) {
929
- if (name === void 0) {
930
- __removeEventIfNotExisted(this);
494
+ off(i, e) {
495
+ if (i === void 0) {
496
+ J(this);
931
497
  return;
932
498
  }
933
- const events = __generateEventIfNotExisted(this);
934
- if (!events[name])
935
- events[name] = [];
936
- if (callback === void 0) {
937
- events[name].length = 0;
499
+ const n = S(this);
500
+ if (n[i] || (n[i] = []), e === void 0) {
501
+ n[i].length = 0;
938
502
  return;
939
503
  }
940
- let index = 0;
941
- for (; index < events[name].length; index++) {
942
- if (events[name][index][0] === callback)
943
- break;
944
- }
945
- if (index < events[name].length) {
946
- events[name].splice(index, 1);
947
- }
504
+ let s = 0;
505
+ for (; s < n[i].length && n[i][s][0] !== e; s++)
506
+ ;
507
+ s < n[i].length && n[i].splice(s, 1);
948
508
  }
949
509
  /**
950
510
  * 触发事件
@@ -953,28 +513,23 @@ class Subscribe {
953
513
  * @returns canceled 是否被触发取消
954
514
  * @template K 预设的监听事件名称
955
515
  */
956
- emit(name, ...data) {
957
- let canceled = false;
958
- const events = __generateEventIfNotExisted(this);
959
- const event = events[name] || [];
960
- for (let one of event.slice()) {
961
- const [callback, once = false] = one;
962
- const result = callback(...data);
963
- if (once)
964
- this.off(name, callback);
965
- if (result === false)
966
- canceled = true;
516
+ emit(i, ...e) {
517
+ let n = !1;
518
+ const r = S(this)[i] || [];
519
+ for (let a of r.slice()) {
520
+ const [o, c = !1] = a, d = o(...e);
521
+ c && this.off(i, o), d === !1 && (n = !0);
967
522
  }
968
- return canceled;
523
+ return n;
969
524
  }
970
525
  }
971
- function S4() {
526
+ function M() {
972
527
  return ((1 + Math.random()) * 65536 | 0).toString(16).substring(1);
973
528
  }
974
- function uuid() {
975
- return (S4() + S4() + "-" + S4() + "-4" + S4().substr(0, 3) + "-" + S4() + "-" + S4() + S4() + S4()).toLowerCase();
529
+ function X() {
530
+ return (M() + M() + "-" + M() + "-4" + M().substr(0, 3) + "-" + M() + "-" + M() + M() + M()).toLowerCase();
976
531
  }
977
- const PaintBrushStyle = `
532
+ const V = `
978
533
  <style type="text/css">
979
534
 
980
535
  #_gl_paintBrush {
@@ -1075,26 +630,21 @@ transition: all 500ms;
1075
630
 
1076
631
  </style>
1077
632
  `;
1078
- class Controller extends Subscribe {
1079
- constructor(configs) {
633
+ class q extends K {
634
+ constructor(e) {
1080
635
  super();
1081
- __publicField(this, "configs");
1082
- __publicField(this, "clientWidth");
1083
- __publicField(this, "clientHeight");
1084
- __publicField(this, "ready", false);
1085
- __publicField(this, "uuid", uuid());
1086
- __publicField(this, "tween");
1087
- __publicField(this, "tweening", false);
1088
- __publicField(this, "container");
1089
- __publicField(this, "canvas");
1090
- __publicField(this, "data", {});
1091
- __publicField(this, "tempLine", {});
1092
- this.configs = configs;
1093
- this.clientWidth = document.body.clientWidth;
1094
- this.clientHeight = document.body.clientHeight;
1095
- this.container = this.ifInsertToDOM();
1096
- this.canvas = {};
1097
- this.initCtrl();
636
+ C(this, "configs");
637
+ C(this, "clientWidth");
638
+ C(this, "clientHeight");
639
+ C(this, "ready", !1);
640
+ C(this, "uuid", X());
641
+ C(this, "tween");
642
+ C(this, "tweening", !1);
643
+ C(this, "container");
644
+ C(this, "canvas");
645
+ C(this, "data", {});
646
+ C(this, "tempLine", {});
647
+ this.configs = e, this.clientWidth = document.body.clientWidth, this.clientHeight = document.body.clientHeight, this.container = this.ifInsertToDOM(), this.canvas = {}, this.initCtrl();
1098
648
  }
1099
649
  get color() {
1100
650
  return this.configs.currentColor;
@@ -1106,481 +656,305 @@ class Controller extends Subscribe {
1106
656
  return this.configs.DPR || 1;
1107
657
  }
1108
658
  ifInsertToDOM() {
1109
- if (this.container) {
659
+ if (this.container)
1110
660
  return this.container;
1111
- }
1112
- if (this.configs.container) {
1113
- this.configs.container.id = "_gl_paintBrush";
1114
- this.container = this.configs.container;
1115
- } else if (!document.getElementById("_gl_paintBrush")) {
1116
- const container = document.createElement("div");
1117
- container.id = "_gl_paintBrush";
1118
- document.body.appendChild(container);
1119
- this.container = container;
1120
- } else {
661
+ if (this.configs.container)
662
+ this.configs.container.id = "_gl_paintBrush", this.container = this.configs.container;
663
+ else if (document.getElementById("_gl_paintBrush"))
1121
664
  this.container = document.getElementById("_gl_paintBrush");
665
+ else {
666
+ const e = document.createElement("div");
667
+ e.id = "_gl_paintBrush", document.body.appendChild(e), this.container = e;
1122
668
  }
1123
- this.container.innerHTML = PaintBrushStyle;
1124
- return this.container;
669
+ return this.container.innerHTML = V, this.container;
1125
670
  }
1126
671
  /**
1127
672
  *
1128
673
  * @param className 初始化画板
1129
674
  * @returns
1130
675
  */
1131
- initCanvas(className) {
1132
- const canvas = document.createElement("canvas");
1133
- canvas.className = className;
1134
- canvas.width = this.clientWidth;
1135
- canvas.height = this.clientHeight;
1136
- const ctx = canvas.getContext("2d");
1137
- if (!ctx)
1138
- return;
1139
- ctx.lineWidth = 5 * this.dpr;
1140
- ctx.lineCap = "round";
1141
- ctx.lineJoin = "round";
1142
- this.container.appendChild(canvas);
1143
- return canvas;
676
+ initCanvas(e) {
677
+ const n = document.createElement("canvas");
678
+ n.className = e, n.width = this.clientWidth, n.height = this.clientHeight;
679
+ const s = n.getContext("2d");
680
+ if (s)
681
+ return s.lineWidth = 5 * this.dpr, s.lineCap = "round", s.lineJoin = "round", this.container.appendChild(n), n;
1144
682
  }
1145
683
  /**
1146
684
  * 初始化操作面板
1147
685
  * @returns
1148
686
  */
1149
687
  initCtrl() {
1150
- const ctrl = document.createElement("div");
1151
- ctrl.className = "_paintBrush-ctrl";
1152
- const ctrl_inner = document.createElement("div");
1153
- ctrl_inner.className = "_paintBrush-ctrlinner";
1154
- const a_undo = document.createElement("a");
1155
- a_undo.className = "_paintBrush-ctrlitem _paintBrush-ctrlitem--undo";
1156
- a_undo.addEventListener("click", (e) => {
1157
- var _a;
1158
- e.stopPropagation();
1159
- if (this.configs.onClickUndo) {
1160
- this.configs.onClickUndo();
1161
- }
1162
- if (!this.canvas[this.uuid] || !this.data[this.uuid] || this.data[this.uuid].length === 0) {
688
+ const e = document.createElement("div");
689
+ e.className = "_paintBrush-ctrl";
690
+ const n = document.createElement("div");
691
+ n.className = "_paintBrush-ctrlinner";
692
+ const s = document.createElement("a");
693
+ s.className = "_paintBrush-ctrlitem _paintBrush-ctrlitem--undo", s.addEventListener("click", (o) => {
694
+ var l;
695
+ if (o.stopPropagation(), this.configs.onClickUndo && this.configs.onClickUndo(), !this.canvas[this.uuid] || !this.data[this.uuid] || this.data[this.uuid].length === 0)
1163
696
  return;
1164
- }
1165
- const popState = this.data[this.uuid].pop();
1166
- if (popState) {
1167
- this.emitStateChange({
1168
- type: PaintBrushTypeEnum.Undo,
1169
- color: this.color,
1170
- ready: this.ready,
1171
- state: popState,
1172
- uuid: this.uuid
1173
- });
1174
- }
1175
- const $ctx = (_a = this.canvas[this.uuid]) == null ? void 0 : _a.getContext("2d");
1176
- if (!this.canvas[this.uuid]) {
697
+ const c = this.data[this.uuid].pop();
698
+ c && this.emitStateChange({
699
+ type: y.Undo,
700
+ color: this.color,
701
+ ready: this.ready,
702
+ state: c,
703
+ uuid: this.uuid
704
+ });
705
+ const d = (l = this.canvas[this.uuid]) == null ? void 0 : l.getContext("2d");
706
+ if (!this.canvas[this.uuid])
1177
707
  return;
1178
- }
1179
- const { width, height } = this.canvas[this.uuid];
1180
- if ($ctx) {
1181
- $ctx.clearRect(0, 0, width, height);
1182
- }
1183
- this.data[this.uuid].forEach((ld) => this.handleDrawLine(this.uuid, ld, { withUndo: true }));
708
+ const { width: I, height: u } = this.canvas[this.uuid];
709
+ d && d.clearRect(0, 0, I, u), this.data[this.uuid].forEach((h) => this.handleDrawLine(this.uuid, h, { withUndo: !0 }));
1184
710
  });
1185
- const a_close = document.createElement("a");
1186
- a_close.className = "_paintBrush-ctrlitem _paintBrush-ctrlitem--close";
1187
- a_close.addEventListener("click", (e) => {
1188
- e.stopPropagation();
1189
- this.closeBrush();
1190
- if (this.configs.onClickClose) {
1191
- this.configs.onClickClose();
1192
- }
1193
- });
1194
- const $A = [a_undo, a_close];
1195
- $A.forEach(($a) => {
1196
- const $i = document.createElement("i");
1197
- $i.className = "brush-icon";
1198
- const $span = document.createElement("span");
1199
- $span.className = "brush-txt";
1200
- $span.innerText = $a.className.endsWith("undo") ? this.configs.onUndoText : this.configs.onExitText;
1201
- $a.appendChild($i);
1202
- $a.appendChild($span);
1203
- });
1204
- ctrl_inner.appendChild(a_undo);
1205
- ctrl_inner.appendChild(a_close);
1206
- ctrl.appendChild(ctrl_inner);
1207
- this.container.appendChild(ctrl);
1208
- return ctrl;
711
+ const r = document.createElement("a");
712
+ return r.className = "_paintBrush-ctrlitem _paintBrush-ctrlitem--close", r.addEventListener("click", (o) => {
713
+ o.stopPropagation(), this.closeBrush(), this.configs.onClickClose && this.configs.onClickClose();
714
+ }), [s, r].forEach((o) => {
715
+ const c = document.createElement("i");
716
+ c.className = "brush-icon";
717
+ const d = document.createElement("span");
718
+ d.className = "brush-txt", d.innerText = o.className.endsWith("undo") ? this.configs.onUndoText : this.configs.onExitText, o.appendChild(c), o.appendChild(d);
719
+ }), n.appendChild(s), n.appendChild(r), e.appendChild(n), this.container.appendChild(e), e;
1209
720
  }
1210
721
  openBrush() {
1211
722
  if (this.ready)
1212
723
  return;
1213
- if (!this.canvas[this.uuid]) {
1214
- this.canvas[this.uuid] = this.initCanvas("_paintBrush-canvas");
1215
- }
1216
- this.container.className = "brushing";
1217
- const $curCanvas = this.canvas[this.uuid];
1218
- const $ctx = $curCanvas.getContext("2d");
1219
- $ctx.clearRect(0, 0, $curCanvas.width, $curCanvas.height);
1220
- this.openBrushHandle();
1221
- this.ready = true;
1222
- this.emit("readyChange", true);
724
+ this.canvas[this.uuid] || (this.canvas[this.uuid] = this.initCanvas("_paintBrush-canvas")), this.container.className = "brushing";
725
+ const e = this.canvas[this.uuid];
726
+ e.getContext("2d").clearRect(0, 0, e.width, e.height), this.openBrushHandle(), this.ready = !0, this.emit("readyChange", !0);
1223
727
  }
1224
728
  closeBrush() {
1225
- if (!this.ready)
1226
- return;
1227
- this.container.className = "";
1228
- this.data = {};
1229
- this.tempLine = {};
1230
- Object.keys(this.canvas).forEach((key) => {
1231
- this.canvas[key].ontouchstart = () => false;
1232
- this.canvas[key].ontouchmove = () => false;
1233
- this.canvas[key].ontouchend = () => false;
1234
- this.canvas[key].ontouchcancel = () => false;
1235
- const $ctx = this.canvas[key].getContext("2d");
1236
- if ($ctx) {
1237
- $ctx.clearRect(0, 0, this.canvas[key].width, this.canvas[key].height);
1238
- }
1239
- });
1240
- this.ready = false;
1241
- this.emit("readyChange", false);
1242
- this.emitStateChange({
1243
- type: PaintBrushTypeEnum.Exit,
729
+ this.ready && (this.container.className = "", this.data = {}, this.tempLine = {}, Object.keys(this.canvas).forEach((e) => {
730
+ this.canvas[e].ontouchstart = () => !1, this.canvas[e].ontouchmove = () => !1, this.canvas[e].ontouchend = () => !1, this.canvas[e].ontouchcancel = () => !1;
731
+ const n = this.canvas[e].getContext("2d");
732
+ n && n.clearRect(0, 0, this.canvas[e].width, this.canvas[e].height);
733
+ }), this.ready = !1, this.emit("readyChange", !1), this.emitStateChange({
734
+ type: y.Exit,
1244
735
  color: this.color,
1245
- ready: false,
736
+ ready: !1,
1246
737
  uuid: this.uuid
1247
- });
738
+ }));
1248
739
  }
1249
- updateCurrentColor(color) {
1250
- const currentCanvas = this.canvas[this.uuid];
1251
- if (!currentCanvas)
1252
- return;
1253
- const currentCtx = currentCanvas.getContext("2d");
1254
- if (!currentCtx)
740
+ updateCurrentColor(e) {
741
+ const n = this.canvas[this.uuid];
742
+ if (!n)
1255
743
  return;
1256
- this.configs.currentColor = color;
1257
- currentCtx.strokeStyle = color;
744
+ const s = n.getContext("2d");
745
+ s && (this.configs.currentColor = e, s.strokeStyle = e);
1258
746
  }
1259
747
  openBrushHandle() {
1260
- const currentCanvas = this.canvas[this.uuid];
1261
- if (!currentCanvas)
748
+ const e = this.canvas[this.uuid];
749
+ if (!e)
1262
750
  return;
1263
- const currentCtx = currentCanvas.getContext("2d");
1264
- if (!currentCtx)
751
+ const n = e.getContext("2d");
752
+ if (!n)
1265
753
  return;
1266
- const color = this.color || "#6D92FF";
1267
- currentCtx.strokeStyle = color;
1268
- let begin = null;
1269
- let points = [];
1270
- let move;
1271
- let line = [];
1272
- let startTime = 0;
1273
- const draw = (beginPoint, controlPoint, endPoint) => {
1274
- const color2 = this.color || "#ff0000";
1275
- currentCtx.strokeStyle = color2;
1276
- currentCtx.beginPath();
1277
- currentCtx.moveTo(beginPoint.x, beginPoint.y);
1278
- currentCtx.quadraticCurveTo(controlPoint.x, controlPoint.y, endPoint.x, endPoint.y);
1279
- currentCtx.stroke();
1280
- };
1281
- currentCanvas.onmousedown = (e) => {
1282
- e.preventDefault();
1283
- startTime = Date.now();
1284
- const x = e.clientX;
1285
- const y = e.clientY;
1286
- points = [];
1287
- points.push({ x, y });
1288
- begin = { x, y };
1289
- move = transformCoords({ x, y }, this.clientWidth, this.clientHeight);
1290
- line = [];
1291
- };
1292
- currentCanvas.onmousemove = (e) => {
1293
- e.preventDefault();
1294
- if (!begin)
754
+ const s = this.color || "#6D92FF";
755
+ n.strokeStyle = s;
756
+ let r = null, a = [], o, c = [], d = 0;
757
+ const I = (u, l, h) => {
758
+ const g = this.color || "#ff0000";
759
+ n.strokeStyle = g, n.beginPath(), n.moveTo(u.x, u.y), n.quadraticCurveTo(l.x, l.y, h.x, h.y), n.stroke();
760
+ };
761
+ e.onmousedown = (u) => {
762
+ u.preventDefault(), d = Date.now();
763
+ const l = u.clientX, h = u.clientY;
764
+ a = [], a.push({ x: l, y: h }), r = { x: l, y: h }, o = T({ x: l, y: h }, this.clientWidth, this.clientHeight), c = [];
765
+ }, e.onmousemove = (u) => {
766
+ if (u.preventDefault(), !r)
1295
767
  return;
1296
- const x = Number(e.clientX);
1297
- const y = Number(e.clientY);
1298
- if (Math.abs(x - begin.x) < 5 && Math.abs(y - begin.y) < 5) {
768
+ const l = Number(u.clientX), h = Number(u.clientY);
769
+ if (Math.abs(l - r.x) < 5 && Math.abs(h - r.y) < 5 || (a.push({ x: l, y: h }), c.push(T({ x: l, y: h }, this.clientWidth, this.clientHeight)), a.length < 3))
1299
770
  return;
1300
- }
1301
- points.push({ x, y });
1302
- line.push(transformCoords({ x, y }, this.clientWidth, this.clientHeight));
1303
- if (points.length < 3) {
1304
- return;
1305
- }
1306
- const { control, end } = getQuadraticCurvePoint(points);
1307
- if (!control || !end) {
771
+ const { control: g, end: f } = j(a);
772
+ !g || !f || (I(r, g, f), r = f);
773
+ }, e.onmouseup = (u) => {
774
+ if (u.preventDefault(), r = null, a.length < 3)
1308
775
  return;
1309
- }
1310
- draw(begin, control, end);
1311
- begin = end;
1312
- };
1313
- currentCanvas.onmouseup = (e) => {
1314
- e.preventDefault();
1315
- begin = null;
1316
- if (points.length < 3)
1317
- return;
1318
- if (!this.data[this.uuid]) {
1319
- this.data[this.uuid] = [];
1320
- }
1321
- const duration = Date.now() - startTime;
1322
- const state2 = {
1323
- move: Object.assign({}, move),
776
+ this.data[this.uuid] || (this.data[this.uuid] = []);
777
+ const l = Date.now() - d, h = {
778
+ move: Object.assign({}, o),
1324
779
  uuid: this.uuid,
1325
- line: [...line],
780
+ line: [...c],
1326
781
  color: this.color,
1327
- duration: duration < 1280 ? duration : duration < 2e3 ? 1280 : 0
782
+ duration: l < 1280 ? l : l < 2e3 ? 1280 : 0
1328
783
  // 单次笔迹时长超过2000ms不加动画
1329
784
  };
1330
- this.data[this.uuid].push(state2);
1331
- nextFrame(() => {
785
+ this.data[this.uuid].push(h), P(() => {
1332
786
  this.emitStateChange({
1333
- type: PaintBrushTypeEnum.Drawline,
787
+ type: y.Drawline,
1334
788
  color: this.color,
1335
789
  ready: this.ready,
1336
- state: state2,
790
+ state: h,
1337
791
  uuid: this.uuid
1338
792
  });
1339
793
  });
1340
- };
1341
- currentCanvas.ontouchstart = (e) => {
1342
- e.preventDefault();
1343
- startTime = Date.now();
1344
- const x = e.touches[0].clientX;
1345
- const y = e.touches[0].clientY;
1346
- points = [];
1347
- points.push({ x, y });
1348
- begin = { x, y };
1349
- move = transformCoords({ x, y }, this.clientWidth, this.clientHeight);
1350
- line = [];
1351
- };
1352
- currentCanvas.ontouchmove = (e) => {
1353
- e.preventDefault();
1354
- if (!begin)
1355
- return;
1356
- const x = Number(e.touches[0].clientX);
1357
- const y = Number(e.touches[0].clientY);
1358
- if (Math.abs(x - begin.x) < 5 && Math.abs(y - begin.y) < 5)
1359
- return;
1360
- points.push({ x, y });
1361
- line.push(transformCoords({ x, y }, this.clientWidth, this.clientHeight));
1362
- if (points.length < 3)
794
+ }, e.ontouchstart = (u) => {
795
+ u.preventDefault(), d = Date.now();
796
+ const l = u.touches[0].clientX, h = u.touches[0].clientY;
797
+ a = [], a.push({ x: l, y: h }), r = { x: l, y: h }, o = T({ x: l, y: h }, this.clientWidth, this.clientHeight), c = [];
798
+ }, e.ontouchmove = (u) => {
799
+ if (u.preventDefault(), !r)
1363
800
  return;
1364
- const { control, end } = getQuadraticCurvePoint(points);
1365
- if (!control || !end)
801
+ const l = Number(u.touches[0].clientX), h = Number(u.touches[0].clientY);
802
+ if (Math.abs(l - r.x) < 5 && Math.abs(h - r.y) < 5 || (a.push({ x: l, y: h }), c.push(T({ x: l, y: h }, this.clientWidth, this.clientHeight)), a.length < 3))
1366
803
  return;
1367
- draw(begin, control, end);
1368
- begin = end;
1369
- };
1370
- currentCanvas.ontouchend = currentCanvas.ontouchcancel = (e) => {
1371
- e.preventDefault();
1372
- begin = null;
1373
- if (points.length < 3)
804
+ const { control: g, end: f } = j(a);
805
+ !g || !f || (I(r, g, f), r = f);
806
+ }, e.ontouchend = e.ontouchcancel = (u) => {
807
+ if (u.preventDefault(), r = null, a.length < 3)
1374
808
  return;
1375
- if (!this.data[this.uuid]) {
1376
- this.data[this.uuid] = [];
1377
- }
1378
- const duration = Date.now() - startTime;
1379
- const state2 = {
1380
- move: Object.assign({}, move),
1381
- line: [...line],
809
+ this.data[this.uuid] || (this.data[this.uuid] = []);
810
+ const l = Date.now() - d, h = {
811
+ move: Object.assign({}, o),
812
+ line: [...c],
1382
813
  uuid: this.uuid,
1383
814
  color: this.color,
1384
- duration: duration < 1280 ? duration : duration < 2e3 ? 1280 : 0
815
+ duration: l < 1280 ? l : l < 2e3 ? 1280 : 0
1385
816
  // 单次笔迹时长超过2000ms不加动画
1386
817
  };
1387
- this.data[this.uuid].push(state2);
1388
- nextFrame(() => {
818
+ this.data[this.uuid].push(h), P(() => {
1389
819
  this.emitStateChange({
1390
- type: PaintBrushTypeEnum.Drawline,
820
+ type: y.Drawline,
1391
821
  color: this.color,
1392
822
  ready: this.ready,
1393
- state: state2,
823
+ state: h,
1394
824
  uuid: this.uuid
1395
825
  });
1396
826
  });
1397
827
  };
1398
828
  }
1399
- emitStateChange(action, userAction = true) {
1400
- if (action.type !== PaintBrushTypeEnum.Drawline) {
1401
- this.emit("stateChange", action, userAction);
829
+ emitStateChange(e, n = !0) {
830
+ if (e.type !== y.Drawline) {
831
+ this.emit("stateChange", e, n);
1402
832
  return;
1403
833
  }
1404
- const timestamp = Date.now();
1405
- const state2 = action.state;
1406
- if (!state2)
834
+ const s = Date.now(), r = e.state;
835
+ if (!r || !r.line)
1407
836
  return;
1408
- if (!state2.line)
1409
- return;
1410
- const sliceCount = Math.ceil(state2.line.length / 100);
1411
- for (let i = 0; i < sliceCount; i++) {
1412
- const localityAction = {
837
+ const a = Math.ceil(r.line.length / 100);
838
+ for (let o = 0; o < a; o++) {
839
+ const c = {
1413
840
  uuid: this.uuid,
1414
841
  color: this.color,
1415
842
  ready: this.ready,
1416
- type: action.type,
843
+ type: e.type,
1417
844
  state: {
1418
845
  uuid: this.uuid,
1419
- move: state2.move,
1420
- duration: state2.duration,
846
+ move: r.move,
847
+ duration: r.duration,
1421
848
  color: this.color,
1422
- line: state2.line.slice(i * 100, (i + 1) * 100)
849
+ line: r.line.slice(o * 100, (o + 1) * 100)
1423
850
  },
1424
- timestamp,
1425
- end: i === sliceCount - 1
851
+ timestamp: s,
852
+ end: o === a - 1
1426
853
  };
1427
- execInterval(i, 20, () => {
1428
- this.emit("stateChange", localityAction, userAction);
854
+ U(o, 20, () => {
855
+ this.emit("stateChange", c, n);
1429
856
  });
1430
857
  }
1431
858
  }
1432
- action(action) {
1433
- const { ready, type, uuid: uuid2 } = action;
1434
- if (!ready && this.ready) {
859
+ action(e) {
860
+ const { ready: n, type: s, uuid: r } = e;
861
+ if (!n && this.ready) {
1435
862
  this.closeBrush();
1436
863
  return;
1437
864
  }
1438
- if (ready && !this.ready) {
865
+ if (n && !this.ready) {
1439
866
  this.openBrush();
1440
867
  return;
1441
868
  }
1442
- if (!this.ready) {
1443
- return;
1444
- }
1445
- switch (type) {
1446
- case PaintBrushTypeEnum.Drawline:
1447
- const { state: state2, timestamp, end } = action;
1448
- if (!timestamp)
1449
- return;
1450
- if (!state2)
1451
- return;
1452
- this.tempLine[timestamp] = [].concat(this.tempLine[timestamp] || [], state2.line);
1453
- if (end) {
1454
- Object.assign(state2, { line: this.tempLine[timestamp] });
1455
- this.handleDrawLine(uuid2, state2, {}, () => delete this.tempLine[timestamp]);
1456
- }
1457
- break;
1458
- case PaintBrushTypeEnum.Undo:
1459
- this.handleUndo(uuid2);
1460
- break;
1461
- }
1462
- }
1463
- handleDrawLine(_uuid, data, { withUndo = false }, callback = noop) {
1464
- if (!data || Object.prototype.toString.call(data) != "[object Object]" || Object.keys(data).length === 0) {
1465
- return;
1466
- }
1467
- queue(() => {
1468
- return new Promise((resolve) => {
1469
- if (!withUndo) {
1470
- if (!this.canvas[_uuid]) {
1471
- this.canvas[_uuid] = this.initCanvas("_paintBrush-canvas--sync");
1472
- }
1473
- if (!this.data[_uuid]) {
1474
- this.data[_uuid] = [];
1475
- }
1476
- this.data[_uuid].push(data);
1477
- }
1478
- if (!this.canvas[_uuid]) {
1479
- return;
1480
- }
1481
- const $ctx = this.canvas[_uuid].getContext("2d");
1482
- if (!$ctx)
1483
- return;
1484
- const { line = [], color = "black", duration = 0, uuid: uuid2 } = data;
1485
- const move = unTransformCoords(data.move || {}, this.clientWidth, this.clientHeight);
1486
- let points = [move];
1487
- $ctx.strokeStyle = color;
1488
- $ctx.beginPath();
1489
- $ctx.moveTo(move.x, move.y);
1490
- if (duration && !withUndo) {
1491
- let drawCache = [];
1492
- const self = this;
1493
- self.tween = tween({ step: 0 }, { step: line.length - 1 }, duration).onUpdate(({ step }) => {
1494
- var _a;
1495
- self.tweening = true;
1496
- if (!self.ready) {
1497
- $ctx.clearRect(0, 0, self.canvas[uuid2].width, self.canvas[uuid2].height);
1498
- return (_a = self.tween) == null ? void 0 : _a.stop();
1499
- }
1500
- const i = Math.floor(step);
1501
- if (!drawCache.find((dc) => dc === i)) {
1502
- drawCache.push(i);
1503
- points.push(unTransformCoords(line[i], self.clientWidth, self.clientHeight));
1504
- if (points.length < 3)
1505
- return;
1506
- const { control, end } = getQuadraticCurvePoint(points);
1507
- if (!control || !end)
1508
- return;
1509
- $ctx.quadraticCurveTo(control.x, control.y, end.x, end.y);
1510
- $ctx.stroke();
1511
- }
1512
- }).onComplete((e) => {
1513
- self.tween = void 0;
1514
- self.tweening = false;
1515
- drawCache = [];
1516
- points = [];
1517
- if (callback)
1518
- callback();
1519
- resolve();
1520
- });
1521
- } else {
1522
- for (let i = 0; i < line.length; i++) {
1523
- points.push(unTransformCoords(line[i], this.clientWidth, this.clientHeight));
1524
- if (points.length < 3)
1525
- continue;
1526
- const { control, end } = getQuadraticCurvePoint(points);
1527
- if (!control || !end)
1528
- continue;
1529
- $ctx.quadraticCurveTo(control.x, control.y, end.x, end.y);
869
+ if (this.ready)
870
+ switch (s) {
871
+ case y.Drawline:
872
+ const { state: a, timestamp: o, end: c } = e;
873
+ if (!o || !a)
874
+ return;
875
+ this.tempLine[o] = [].concat(this.tempLine[o] || [], a.line), c && (Object.assign(a, { line: this.tempLine[o] }), this.handleDrawLine(r, a, {}, () => delete this.tempLine[o]));
876
+ break;
877
+ case y.Undo:
878
+ this.handleUndo(r);
879
+ break;
880
+ }
881
+ }
882
+ handleDrawLine(e, n, { withUndo: s = !1 }, r = m) {
883
+ !n || Object.prototype.toString.call(n) != "[object Object]" || Object.keys(n).length === 0 || G(() => new Promise((a) => {
884
+ if (s || (this.canvas[e] || (this.canvas[e] = this.initCanvas("_paintBrush-canvas--sync")), this.data[e] || (this.data[e] = []), this.data[e].push(n)), !this.canvas[e])
885
+ return;
886
+ const o = this.canvas[e].getContext("2d");
887
+ if (!o)
888
+ return;
889
+ const { line: c = [], color: d = "black", duration: I = 0, uuid: u } = n, l = L(n.move || {}, this.clientWidth, this.clientHeight);
890
+ let h = [l];
891
+ if (o.strokeStyle = d, o.beginPath(), o.moveTo(l.x, l.y), I && !s) {
892
+ let g = [];
893
+ const f = this;
894
+ f.tween = F({ step: 0 }, { step: c.length - 1 }, I).onUpdate(({ step: p }) => {
895
+ var v;
896
+ if (f.tweening = !0, !f.ready)
897
+ return o.clearRect(0, 0, f.canvas[u].width, f.canvas[u].height), (v = f.tween) == null ? void 0 : v.stop();
898
+ const A = Math.floor(p);
899
+ if (!g.find((D) => D === A)) {
900
+ if (g.push(A), h.push(L(c[A], f.clientWidth, f.clientHeight)), h.length < 3)
901
+ return;
902
+ const { control: D, end: O } = j(h);
903
+ if (!D || !O)
904
+ return;
905
+ o.quadraticCurveTo(D.x, D.y, O.x, O.y), o.stroke();
1530
906
  }
1531
- $ctx.stroke();
1532
- points = [];
1533
- if (callback)
1534
- callback();
1535
- resolve();
907
+ }).onComplete((p) => {
908
+ f.tween = void 0, f.tweening = !1, g = [], h = [], r && r(), a();
909
+ });
910
+ } else {
911
+ for (let g = 0; g < c.length; g++) {
912
+ if (h.push(L(c[g], this.clientWidth, this.clientHeight)), h.length < 3)
913
+ continue;
914
+ const { control: f, end: p } = j(h);
915
+ !f || !p || o.quadraticCurveTo(f.x, f.y, p.x, p.y);
1536
916
  }
1537
- });
1538
- });
917
+ o.stroke(), h = [], r && r(), a();
918
+ }
919
+ }));
1539
920
  }
1540
- handleUndo(uuid2) {
1541
- if (!this.canvas[uuid2] || !this.data[uuid2] || this.data[uuid2].length === 0) {
921
+ handleUndo(e) {
922
+ if (!this.canvas[e] || !this.data[e] || this.data[e].length === 0)
1542
923
  return;
1543
- }
1544
- this.data[uuid2].pop();
1545
- const handle = () => {
1546
- var _a;
1547
- const $ctx = (_a = this.canvas[uuid2]) == null ? void 0 : _a.getContext("2d");
1548
- if ($ctx) {
1549
- $ctx.clearRect(0, 0, this.canvas[uuid2].width, this.canvas[uuid2].height);
1550
- }
1551
- this.data[uuid2].forEach((ld) => this.handleDrawLine(uuid2, ld, { withUndo: true }));
924
+ this.data[e].pop();
925
+ const n = () => {
926
+ var r;
927
+ const s = (r = this.canvas[e]) == null ? void 0 : r.getContext("2d");
928
+ s && s.clearRect(0, 0, this.canvas[e].width, this.canvas[e].height), this.data[e].forEach((a) => this.handleDrawLine(e, a, { withUndo: !0 }));
1552
929
  };
1553
930
  if (this.tween && this.tweening) {
1554
- this.tween.stop();
1555
- nextFrame(handle, 60);
931
+ this.tween.stop(), P(n, 60);
1556
932
  return;
1557
933
  }
1558
- handle();
934
+ n();
1559
935
  }
1560
936
  destroyBrush() {
1561
- this.closeBrush();
1562
- this.ready = false;
1563
- this.emit("readyChange", true);
937
+ this.closeBrush(), this.ready = !1, this.emit("readyChange", !0);
1564
938
  }
1565
939
  }
1566
- class PaintBrush {
1567
- constructor(configs = {}) {
1568
- __publicField(this, "controller");
1569
- const _configs = Object.assign({
940
+ class tt {
941
+ constructor(i = {}) {
942
+ C(this, "controller");
943
+ const e = Object.assign({
1570
944
  currentColor: "#f44336",
1571
945
  onUndoText: "回退",
1572
946
  onExitText: "关闭"
1573
- }, configs);
1574
- this.controller = new Controller(_configs);
947
+ }, i);
948
+ this.controller = new q(e);
1575
949
  }
1576
- on(name, callback) {
1577
- this.controller.on(name, callback);
950
+ on(i, e) {
951
+ this.controller.on(i, e);
1578
952
  }
1579
- off(name, callback) {
1580
- this.controller.off(name, callback);
953
+ off(i, e) {
954
+ this.controller.off(i, e);
1581
955
  }
1582
- once(name, callback) {
1583
- this.controller.once(name, callback);
956
+ once(i, e) {
957
+ this.controller.once(i, e);
1584
958
  }
1585
959
  /**
1586
960
  * 显示画笔。
@@ -1588,8 +962,8 @@ class PaintBrush {
1588
962
  show() {
1589
963
  this.controller.openBrush();
1590
964
  }
1591
- action(action) {
1592
- this.controller.action(action);
965
+ action(i) {
966
+ this.controller.action(i);
1593
967
  }
1594
968
  /**
1595
969
  * 获取画笔状态。
@@ -1610,12 +984,11 @@ class PaintBrush {
1610
984
  dispose() {
1611
985
  return this.controller.destroyBrush();
1612
986
  }
1613
- setCurrentColor(color) {
1614
- this.controller.updateCurrentColor(color);
987
+ setCurrentColor(i) {
988
+ this.controller.updateCurrentColor(i);
1615
989
  }
1616
990
  }
1617
991
  export {
1618
- PaintBrush,
1619
- PaintBrushTypeEnum
992
+ tt as PaintBrush,
993
+ y as PaintBrushTypeEnum
1620
994
  };
1621
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzL1BhaW50QnJ1c2gvdXRpbHMudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHR3ZWVuanMvdHdlZW4uanMvZGlzdC90d2Vlbi5lc20uanMiLCIuLi9zcmMvY29tcG9uZW50cy9QYWludEJydXNoL3R3ZWVuLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFpbnRCcnVzaC90eXBpbmdzLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFpbnRCcnVzaC9TdWJzY3JpYmUudHMiLCIuLi9zcmMvc2hhcmVkLXV0aWxzL3V1aWQudHMiLCIuLi9zcmMvY29tcG9uZW50cy9QYWludEJydXNoL3N0eWxlLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFpbnRCcnVzaC9Db250cm9sbGVyLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFpbnRCcnVzaC9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gbm9vcCgpIHsgfVxuY29uc3QgcHJvbWlzZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZSgpXG5cbmNvbnN0IHN0YXRlID0ge1xuICBfX3F1ZXVlOiBQcm9taXNlLnJlc29sdmUoKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvb3JkcyB7XG4gIHg6IG51bWJlclxuICB5OiBudW1iZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXVlKHByb21pc2VDYWxsYmFjayA9IHByb21pc2UpIHtcbiAgc3RhdGUuX19xdWV1ZSA9IHN0YXRlLl9fcXVldWUudGhlbihwcm9taXNlQ2FsbGJhY2spLmNhdGNoKHByb21pc2UpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1Db29yZHMoY29vcmRzOiBDb29yZHMsIGN3OiBudW1iZXIsIGNoOiBudW1iZXIpIHtcbiAgY29uc3QgX3g6IG51bWJlciA9IGNvb3Jkcy54XG4gIGNvbnN0IF95OiBudW1iZXIgPSBjb29yZHMueVxuICBjb25zdCB4ID0gTWF0aC5mbG9vcigoX3ggLyBjdykgKiAxMDAwMCkgLyAxMDAwMCAgIC8vIOS/neeVmeWbm+S9jeWwj+aVsFxuICBjb25zdCB5ID0gTWF0aC5mbG9vcigoX3kgLyBjaCkgKiAxMDAwMCkgLyAxMDAwMCAgIC8vIOS/neeVmeWbm+S9jeWwj+aVsFxuICByZXR1cm4geyB4LCB5IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuVHJhbnNmb3JtQ29vcmRzKGNvb3JkczogQ29vcmRzLCBjdzogbnVtYmVyLCBjaDogbnVtYmVyKSB7XG4gIGNvbnN0IHsgeDogX3gsIHk6IF95IH0gPSBjb29yZHNcbiAgY29uc3QgeCA9IF94ICogY3dcbiAgY29uc3QgeSA9IF95ICogY2hcbiAgcmV0dXJuIHsgeCwgeSB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50czogQ29vcmRzW10pIHtcbiAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSByZXR1cm4ge31cbiAgY29uc3QgbGFzdFR3byA9IHBvaW50cy5zbGljZSgtMilcbiAgY29uc3QgY29udHJvbCA9IGxhc3RUd29bMF1cbiAgY29uc3QgZW5kID0ge1xuICAgIHg6IChsYXN0VHdvWzBdLnggKyBsYXN0VHdvWzFdLngpIC8gMixcbiAgICB5OiAobGFzdFR3b1swXS55ICsgbGFzdFR3b1sxXS55KSAvIDIsXG4gIH1cbiAgcmV0dXJuIHsgY29udHJvbCwgZW5kIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNJbnRlcnZhbChpOiBudW1iZXIsIHRpbWU6IG51bWJlciwgY2FsbGJhY2sgPSBub29wKSB7XG4gIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICByZXNvbHZlKHRydWUpXG4gICAgfSwgdGltZSAqIGkpXG4gIH0pXG59XG5cbmNvbnN0IF93aW5kb3cgPSB3aW5kb3cgYXMgYW55XG5cbmNvbnN0IF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPVxuICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gIF93aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gIChmbiA9PiBzZXRUaW1lb3V0KGZuLCAxNikpXG5cbmNvbnN0IF9jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCBfd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IGNsZWFyVGltZW91dFxuXG5cbmV4cG9ydCBmdW5jdGlvbiBuZXh0RnJhbWUgKGZuOiBGcmFtZVJlcXVlc3RDYWxsYmFjaywgZGVsYXkgPSAwKSB7XG4gIGlmIChkZWxheSA8PSAwKSBfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKVxuICBlbHNlIF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gbmV4dEZyYW1lKGZuLCBkZWxheSAtIDEpKVxufSIsIi8qKlxuICogVGhlIEVhc2UgY2xhc3MgcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIGVhc2luZyBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoIHR3ZWVuLmpzLlxuICovXG52YXIgRWFzaW5nID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgTGluZWFyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgTm9uZTogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgUXVhZHJhdGljOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudCAqICgyIC0gYW1vdW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwLjUgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTAuNSAqICgtLWFtb3VudCAqIChhbW91bnQgLSAyKSAtIDEpO1xuICAgICAgICB9LFxuICAgIH0pLFxuICAgIEN1YmljOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIC0tYW1vdW50ICogYW1vdW50ICogYW1vdW50ICsgMTtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwLjUgKiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMC41ICogKChhbW91bnQgLT0gMikgKiBhbW91bnQgKiBhbW91bnQgKyAyKTtcbiAgICAgICAgfSxcbiAgICB9KSxcbiAgICBRdWFydGljOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIDEgLSAtLWFtb3VudCAqIGFtb3VudCAqIGFtb3VudCAqIGFtb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwLjUgKiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTAuNSAqICgoYW1vdW50IC09IDIpICogYW1vdW50ICogYW1vdW50ICogYW1vdW50IC0gMik7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgUXVpbnRpYzogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIEluOiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50O1xuICAgICAgICB9LFxuICAgICAgICBPdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiAtLWFtb3VudCAqIGFtb3VudCAqIGFtb3VudCAqIGFtb3VudCAqIGFtb3VudCArIDE7XG4gICAgICAgIH0sXG4gICAgICAgIEluT3V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICBpZiAoKGFtb3VudCAqPSAyKSA8IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMC41ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAuNSAqICgoYW1vdW50IC09IDIpICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICsgMik7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgU2ludXNvaWRhbDogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIEluOiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gMSAtIE1hdGguc2luKCgoMS4wIC0gYW1vdW50KSAqIE1hdGguUEkpIC8gMik7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguc2luKChhbW91bnQgKiBNYXRoLlBJKSAvIDIpO1xuICAgICAgICB9LFxuICAgICAgICBJbk91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIDAuNSAqICgxIC0gTWF0aC5zaW4oTWF0aC5QSSAqICgwLjUgLSBhbW91bnQpKSk7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgRXhwb25lbnRpYWw6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBJbjogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudCA9PT0gMCA/IDAgOiBNYXRoLnBvdygxMDI0LCBhbW91bnQgLSAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgT3V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYW1vdW50ID09PSAxID8gMSA6IDEgLSBNYXRoLnBvdygyLCAtMTAgKiBhbW91bnQpO1xuICAgICAgICB9LFxuICAgICAgICBJbk91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgaWYgKGFtb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFtb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChhbW91bnQgKj0gMikgPCAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAuNSAqIE1hdGgucG93KDEwMjQsIGFtb3VudCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAuNSAqICgtTWF0aC5wb3coMiwgLTEwICogKGFtb3VudCAtIDEpKSArIDIpO1xuICAgICAgICB9LFxuICAgIH0pLFxuICAgIENpcmN1bGFyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiAxIC0gTWF0aC5zcXJ0KDEgLSBhbW91bnQgKiBhbW91bnQpO1xuICAgICAgICB9LFxuICAgICAgICBPdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoMSAtIC0tYW1vdW50ICogYW1vdW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMC41ICogKE1hdGguc3FydCgxIC0gYW1vdW50ICogYW1vdW50KSAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAuNSAqIChNYXRoLnNxcnQoMSAtIChhbW91bnQgLT0gMikgKiBhbW91bnQpICsgMSk7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgRWxhc3RpYzogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIEluOiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICBpZiAoYW1vdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYW1vdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLU1hdGgucG93KDIsIDEwICogKGFtb3VudCAtIDEpKSAqIE1hdGguc2luKChhbW91bnQgLSAxLjEpICogNSAqIE1hdGguUEkpO1xuICAgICAgICB9LFxuICAgICAgICBPdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmIChhbW91bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbW91bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBNYXRoLnBvdygyLCAtMTAgKiBhbW91bnQpICogTWF0aC5zaW4oKGFtb3VudCAtIDAuMSkgKiA1ICogTWF0aC5QSSkgKyAxO1xuICAgICAgICB9LFxuICAgICAgICBJbk91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgaWYgKGFtb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFtb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYW1vdW50ICo9IDI7XG4gICAgICAgICAgICBpZiAoYW1vdW50IDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMC41ICogTWF0aC5wb3coMiwgMTAgKiAoYW1vdW50IC0gMSkpICogTWF0aC5zaW4oKGFtb3VudCAtIDEuMSkgKiA1ICogTWF0aC5QSSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMC41ICogTWF0aC5wb3coMiwgLTEwICogKGFtb3VudCAtIDEpKSAqIE1hdGguc2luKChhbW91bnQgLSAxLjEpICogNSAqIE1hdGguUEkpICsgMTtcbiAgICAgICAgfSxcbiAgICB9KSxcbiAgICBCYWNrOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHZhciBzID0gMS43MDE1ODtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQgPT09IDEgPyAxIDogYW1vdW50ICogYW1vdW50ICogKChzICsgMSkgKiBhbW91bnQgLSBzKTtcbiAgICAgICAgfSxcbiAgICAgICAgT3V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICB2YXIgcyA9IDEuNzAxNTg7XG4gICAgICAgICAgICByZXR1cm4gYW1vdW50ID09PSAwID8gMCA6IC0tYW1vdW50ICogYW1vdW50ICogKChzICsgMSkgKiBhbW91bnQgKyBzKSArIDE7XG4gICAgICAgIH0sXG4gICAgICAgIEluT3V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICB2YXIgcyA9IDEuNzAxNTggKiAxLjUyNTtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwLjUgKiAoYW1vdW50ICogYW1vdW50ICogKChzICsgMSkgKiBhbW91bnQgLSBzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMC41ICogKChhbW91bnQgLT0gMikgKiBhbW91bnQgKiAoKHMgKyAxKSAqIGFtb3VudCArIHMpICsgMik7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgQm91bmNlOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiAxIC0gRWFzaW5nLkJvdW5jZS5PdXQoMSAtIGFtb3VudCk7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgaWYgKGFtb3VudCA8IDEgLyAyLjc1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDcuNTYyNSAqIGFtb3VudCAqIGFtb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFtb3VudCA8IDIgLyAyLjc1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDcuNTYyNSAqIChhbW91bnQgLT0gMS41IC8gMi43NSkgKiBhbW91bnQgKyAwLjc1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYW1vdW50IDwgMi41IC8gMi43NSkge1xuICAgICAgICAgICAgICAgIHJldHVybiA3LjU2MjUgKiAoYW1vdW50IC09IDIuMjUgLyAyLjc1KSAqIGFtb3VudCArIDAuOTM3NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiA3LjU2MjUgKiAoYW1vdW50IC09IDIuNjI1IC8gMi43NSkgKiBhbW91bnQgKyAwLjk4NDM3NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmIChhbW91bnQgPCAwLjUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRWFzaW5nLkJvdW5jZS5JbihhbW91bnQgKiAyKSAqIDAuNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBFYXNpbmcuQm91bmNlLk91dChhbW91bnQgKiAyIC0gMSkgKiAwLjUgKyAwLjU7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgZ2VuZXJhdGVQb3c6IGZ1bmN0aW9uIChwb3dlcikge1xuICAgICAgICBpZiAocG93ZXIgPT09IHZvaWQgMCkgeyBwb3dlciA9IDQ7IH1cbiAgICAgICAgcG93ZXIgPSBwb3dlciA8IE51bWJlci5FUFNJTE9OID8gTnVtYmVyLkVQU0lMT04gOiBwb3dlcjtcbiAgICAgICAgcG93ZXIgPSBwb3dlciA+IDEwMDAwID8gMTAwMDAgOiBwb3dlcjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIEluOiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucG93KGFtb3VudCwgcG93ZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC0gTWF0aC5wb3coKDEgLSBhbW91bnQpLCBwb3dlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW1vdW50IDwgMC41KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnBvdygoYW1vdW50ICogMiksIHBvd2VyKSAvIDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAoMSAtIE1hdGgucG93KCgyIC0gYW1vdW50ICogMiksIHBvd2VyKSkgLyAyICsgMC41O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9LFxufSk7XG5cbnZhciBub3cgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTsgfTtcblxuLyoqXG4gKiBDb250cm9sbGluZyBncm91cHMgb2YgdHdlZW5zXG4gKlxuICogVXNpbmcgdGhlIFRXRUVOIHNpbmdsZXRvbiB0byBtYW5hZ2UgeW91ciB0d2VlbnMgY2FuIGNhdXNlIGlzc3VlcyBpbiBsYXJnZSBhcHBzIHdpdGggbWFueSBjb21wb25lbnRzLlxuICogSW4gdGhlc2UgY2FzZXMsIHlvdSBtYXkgd2FudCB0byBjcmVhdGUgeW91ciBvd24gc21hbGxlciBncm91cHMgb2YgdHdlZW5cbiAqL1xudmFyIEdyb3VwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEdyb3VwKCkge1xuICAgICAgICB0aGlzLl90d2VlbnMgPSB7fTtcbiAgICAgICAgdGhpcy5fdHdlZW5zQWRkZWREdXJpbmdVcGRhdGUgPSB7fTtcbiAgICB9XG4gICAgR3JvdXAucHJvdG90eXBlLmdldEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3R3ZWVucykubWFwKGZ1bmN0aW9uICh0d2VlbklkKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX3R3ZWVuc1t0d2VlbklkXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBHcm91cC5wcm90b3R5cGUucmVtb3ZlQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl90d2VlbnMgPSB7fTtcbiAgICB9O1xuICAgIEdyb3VwLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodHdlZW4pIHtcbiAgICAgICAgdGhpcy5fdHdlZW5zW3R3ZWVuLmdldElkKCldID0gdHdlZW47XG4gICAgICAgIHRoaXMuX3R3ZWVuc0FkZGVkRHVyaW5nVXBkYXRlW3R3ZWVuLmdldElkKCldID0gdHdlZW47XG4gICAgfTtcbiAgICBHcm91cC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHR3ZWVuKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90d2VlbnNbdHdlZW4uZ2V0SWQoKV07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90d2VlbnNBZGRlZER1cmluZ1VwZGF0ZVt0d2Vlbi5nZXRJZCgpXTtcbiAgICB9O1xuICAgIEdyb3VwLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodGltZSwgcHJlc2VydmUpIHtcbiAgICAgICAgaWYgKHRpbWUgPT09IHZvaWQgMCkgeyB0aW1lID0gbm93KCk7IH1cbiAgICAgICAgaWYgKHByZXNlcnZlID09PSB2b2lkIDApIHsgcHJlc2VydmUgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgdHdlZW5JZHMgPSBPYmplY3Qua2V5cyh0aGlzLl90d2VlbnMpO1xuICAgICAgICBpZiAodHdlZW5JZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHdlZW5zIGFyZSB1cGRhdGVkIGluIFwiYmF0Y2hlc1wiLiBJZiB5b3UgYWRkIGEgbmV3IHR3ZWVuIGR1cmluZyBhblxuICAgICAgICAvLyB1cGRhdGUsIHRoZW4gdGhlIG5ldyB0d2VlbiB3aWxsIGJlIHVwZGF0ZWQgaW4gdGhlIG5leHQgYmF0Y2guXG4gICAgICAgIC8vIElmIHlvdSByZW1vdmUgYSB0d2VlbiBkdXJpbmcgYW4gdXBkYXRlLCBpdCBtYXkgb3IgbWF5IG5vdCBiZSB1cGRhdGVkLlxuICAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgcmVtb3ZlZCB0d2VlbiB3YXMgYWRkZWQgZHVyaW5nIHRoZSBjdXJyZW50IGJhdGNoLFxuICAgICAgICAvLyB0aGVuIGl0IHdpbGwgbm90IGJlIHVwZGF0ZWQuXG4gICAgICAgIHdoaWxlICh0d2Vlbklkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl90d2VlbnNBZGRlZER1cmluZ1VwZGF0ZSA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0d2Vlbklkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciB0d2VlbiA9IHRoaXMuX3R3ZWVuc1t0d2Vlbklkc1tpXV07XG4gICAgICAgICAgICAgICAgdmFyIGF1dG9TdGFydCA9ICFwcmVzZXJ2ZTtcbiAgICAgICAgICAgICAgICBpZiAodHdlZW4gJiYgdHdlZW4udXBkYXRlKHRpbWUsIGF1dG9TdGFydCkgPT09IGZhbHNlICYmICFwcmVzZXJ2ZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdHdlZW5zW3R3ZWVuSWRzW2ldXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0d2VlbklkcyA9IE9iamVjdC5rZXlzKHRoaXMuX3R3ZWVuc0FkZGVkRHVyaW5nVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBHcm91cDtcbn0oKSk7XG5cbi8qKlxuICpcbiAqL1xudmFyIEludGVycG9sYXRpb24gPSB7XG4gICAgTGluZWFyOiBmdW5jdGlvbiAodiwgaykge1xuICAgICAgICB2YXIgbSA9IHYubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIGYgPSBtICogaztcbiAgICAgICAgdmFyIGkgPSBNYXRoLmZsb29yKGYpO1xuICAgICAgICB2YXIgZm4gPSBJbnRlcnBvbGF0aW9uLlV0aWxzLkxpbmVhcjtcbiAgICAgICAgaWYgKGsgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odlswXSwgdlsxXSwgZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGsgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odlttXSwgdlttIC0gMV0sIG0gLSBmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4odltpXSwgdltpICsgMSA+IG0gPyBtIDogaSArIDFdLCBmIC0gaSk7XG4gICAgfSxcbiAgICBCZXppZXI6IGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIHZhciBiID0gMDtcbiAgICAgICAgdmFyIG4gPSB2Lmxlbmd0aCAtIDE7XG4gICAgICAgIHZhciBwdyA9IE1hdGgucG93O1xuICAgICAgICB2YXIgYm4gPSBJbnRlcnBvbGF0aW9uLlV0aWxzLkJlcm5zdGVpbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbjsgaSsrKSB7XG4gICAgICAgICAgICBiICs9IHB3KDEgLSBrLCBuIC0gaSkgKiBwdyhrLCBpKSAqIHZbaV0gKiBibihuLCBpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYjtcbiAgICB9LFxuICAgIENhdG11bGxSb206IGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIHZhciBtID0gdi5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgZiA9IG0gKiBrO1xuICAgICAgICB2YXIgaSA9IE1hdGguZmxvb3IoZik7XG4gICAgICAgIHZhciBmbiA9IEludGVycG9sYXRpb24uVXRpbHMuQ2F0bXVsbFJvbTtcbiAgICAgICAgaWYgKHZbMF0gPT09IHZbbV0pIHtcbiAgICAgICAgICAgIGlmIChrIDwgMCkge1xuICAgICAgICAgICAgICAgIGkgPSBNYXRoLmZsb29yKChmID0gbSAqICgxICsgaykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmbih2WyhpIC0gMSArIG0pICUgbV0sIHZbaV0sIHZbKGkgKyAxKSAlIG1dLCB2WyhpICsgMikgJSBtXSwgZiAtIGkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGsgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZbMF0gLSAoZm4odlswXSwgdlswXSwgdlsxXSwgdlsxXSwgLWYpIC0gdlswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoayA+IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdlttXSAtIChmbih2W21dLCB2W21dLCB2W20gLSAxXSwgdlttIC0gMV0sIGYgLSBtKSAtIHZbbV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuKHZbaSA/IGkgLSAxIDogMF0sIHZbaV0sIHZbbSA8IGkgKyAxID8gbSA6IGkgKyAxXSwgdlttIDwgaSArIDIgPyBtIDogaSArIDJdLCBmIC0gaSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFV0aWxzOiB7XG4gICAgICAgIExpbmVhcjogZnVuY3Rpb24gKHAwLCBwMSwgdCkge1xuICAgICAgICAgICAgcmV0dXJuIChwMSAtIHAwKSAqIHQgKyBwMDtcbiAgICAgICAgfSxcbiAgICAgICAgQmVybnN0ZWluOiBmdW5jdGlvbiAobiwgaSkge1xuICAgICAgICAgICAgdmFyIGZjID0gSW50ZXJwb2xhdGlvbi5VdGlscy5GYWN0b3JpYWw7XG4gICAgICAgICAgICByZXR1cm4gZmMobikgLyBmYyhpKSAvIGZjKG4gLSBpKTtcbiAgICAgICAgfSxcbiAgICAgICAgRmFjdG9yaWFsOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGEgPSBbMV07XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IDE7XG4gICAgICAgICAgICAgICAgaWYgKGFbbl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFbbl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBuOyBpID4gMTsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIHMgKj0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYVtuXSA9IHM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSgpLFxuICAgICAgICBDYXRtdWxsUm9tOiBmdW5jdGlvbiAocDAsIHAxLCBwMiwgcDMsIHQpIHtcbiAgICAgICAgICAgIHZhciB2MCA9IChwMiAtIHAwKSAqIDAuNTtcbiAgICAgICAgICAgIHZhciB2MSA9IChwMyAtIHAxKSAqIDAuNTtcbiAgICAgICAgICAgIHZhciB0MiA9IHQgKiB0O1xuICAgICAgICAgICAgdmFyIHQzID0gdCAqIHQyO1xuICAgICAgICAgICAgcmV0dXJuICgyICogcDEgLSAyICogcDIgKyB2MCArIHYxKSAqIHQzICsgKC0zICogcDEgKyAzICogcDIgLSAyICogdjAgLSB2MSkgKiB0MiArIHYwICogdCArIHAxO1xuICAgICAgICB9LFxuICAgIH0sXG59O1xuXG4vKipcbiAqIFV0aWxzXG4gKi9cbnZhciBTZXF1ZW5jZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZXF1ZW5jZSgpIHtcbiAgICB9XG4gICAgU2VxdWVuY2UubmV4dElkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gU2VxdWVuY2UuX25leHRJZCsrO1xuICAgIH07XG4gICAgU2VxdWVuY2UuX25leHRJZCA9IDA7XG4gICAgcmV0dXJuIFNlcXVlbmNlO1xufSgpKTtcblxudmFyIG1haW5Hcm91cCA9IG5ldyBHcm91cCgpO1xuXG4vKipcbiAqIFR3ZWVuLmpzIC0gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vdHdlZW5qcy90d2Vlbi5qc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdlZW5qcy90d2Vlbi5qcy9ncmFwaHMvY29udHJpYnV0b3JzIGZvciB0aGUgZnVsbCBsaXN0IG9mIGNvbnRyaWJ1dG9ycy5cbiAqIFRoYW5rIHlvdSBhbGwsIHlvdSdyZSBhd2Vzb21lIVxuICovXG52YXIgVHdlZW4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHdlZW4oX29iamVjdCwgX2dyb3VwKSB7XG4gICAgICAgIGlmIChfZ3JvdXAgPT09IHZvaWQgMCkgeyBfZ3JvdXAgPSBtYWluR3JvdXA7IH1cbiAgICAgICAgdGhpcy5fb2JqZWN0ID0gX29iamVjdDtcbiAgICAgICAgdGhpcy5fZ3JvdXAgPSBfZ3JvdXA7XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhdXNlU3RhcnQgPSAwO1xuICAgICAgICB0aGlzLl92YWx1ZXNTdGFydCA9IHt9O1xuICAgICAgICB0aGlzLl92YWx1ZXNFbmQgPSB7fTtcbiAgICAgICAgdGhpcy5fdmFsdWVzU3RhcnRSZXBlYXQgPSB7fTtcbiAgICAgICAgdGhpcy5fZHVyYXRpb24gPSAxMDAwO1xuICAgICAgICB0aGlzLl9pc0R5bmFtaWMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faW5pdGlhbFJlcGVhdCA9IDA7XG4gICAgICAgIHRoaXMuX3JlcGVhdCA9IDA7XG4gICAgICAgIHRoaXMuX3lveW8gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3JldmVyc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2RlbGF5VGltZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IDA7XG4gICAgICAgIHRoaXMuX2Vhc2luZ0Z1bmN0aW9uID0gRWFzaW5nLkxpbmVhci5Ob25lO1xuICAgICAgICB0aGlzLl9pbnRlcnBvbGF0aW9uRnVuY3Rpb24gPSBJbnRlcnBvbGF0aW9uLkxpbmVhcjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHRoaXMuX2NoYWluZWRUd2VlbnMgPSBbXTtcbiAgICAgICAgdGhpcy5fb25TdGFydENhbGxiYWNrRmlyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb25FdmVyeVN0YXJ0Q2FsbGJhY2tGaXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pZCA9IFNlcXVlbmNlLm5leHRJZCgpO1xuICAgICAgICB0aGlzLl9pc0NoYWluU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzQXJlU2V0VXAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZ29Ub0VuZCA9IGZhbHNlO1xuICAgIH1cbiAgICBUd2Vlbi5wcm90b3R5cGUuZ2V0SWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5pc1BsYXlpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1BsYXlpbmc7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1BhdXNlZDtcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5nZXREdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLnRvID0gZnVuY3Rpb24gKHRhcmdldCwgZHVyYXRpb24pIHtcbiAgICAgICAgaWYgKGR1cmF0aW9uID09PSB2b2lkIDApIHsgZHVyYXRpb24gPSAxMDAwOyB9XG4gICAgICAgIGlmICh0aGlzLl9pc1BsYXlpbmcpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgY2FsbCBUd2Vlbi50bygpIHdoaWxlIFR3ZWVuIGlzIGFscmVhZHkgc3RhcnRlZCBvciBwYXVzZWQuIFN0b3AgdGhlIFR3ZWVuIGZpcnN0LicpO1xuICAgICAgICB0aGlzLl92YWx1ZXNFbmQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXNBcmVTZXRVcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IGR1cmF0aW9uIDwgMCA/IDAgOiBkdXJhdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuZHVyYXRpb24gPSBmdW5jdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgaWYgKGR1cmF0aW9uID09PSB2b2lkIDApIHsgZHVyYXRpb24gPSAxMDAwOyB9XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gZHVyYXRpb24gPCAwID8gMCA6IGR1cmF0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5keW5hbWljID0gZnVuY3Rpb24gKGR5bmFtaWMpIHtcbiAgICAgICAgaWYgKGR5bmFtaWMgPT09IHZvaWQgMCkgeyBkeW5hbWljID0gZmFsc2U7IH1cbiAgICAgICAgdGhpcy5faXNEeW5hbWljID0gZHluYW1pYztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAodGltZSwgb3ZlcnJpZGVTdGFydGluZ1ZhbHVlcykge1xuICAgICAgICBpZiAodGltZSA9PT0gdm9pZCAwKSB7IHRpbWUgPSBub3coKTsgfVxuICAgICAgICBpZiAob3ZlcnJpZGVTdGFydGluZ1ZhbHVlcyA9PT0gdm9pZCAwKSB7IG92ZXJyaWRlU3RhcnRpbmdWYWx1ZXMgPSBmYWxzZTsgfVxuICAgICAgICBpZiAodGhpcy5faXNQbGF5aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgdGhpcy5fZ3JvdXAgJiYgdGhpcy5fZ3JvdXAuYWRkKHRoaXMpO1xuICAgICAgICB0aGlzLl9yZXBlYXQgPSB0aGlzLl9pbml0aWFsUmVwZWF0O1xuICAgICAgICBpZiAodGhpcy5fcmV2ZXJzZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIHdlcmUgcmV2ZXJzZWQgKGYuZS4gdXNpbmcgdGhlIHlveW8gZmVhdHVyZSkgdGhlbiB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyBmbGlwIHRoZSB0d2VlbiBkaXJlY3Rpb24gYmFjayB0byBmb3J3YXJkLlxuICAgICAgICAgICAgdGhpcy5fcmV2ZXJzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMuX3ZhbHVlc1N0YXJ0UmVwZWF0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3dhcEVuZFN0YXJ0UmVwZWF0VmFsdWVzKHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNTdGFydFtwcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb25TdGFydENhbGxiYWNrRmlyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb25FdmVyeVN0YXJ0Q2FsbGJhY2tGaXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc0NoYWluU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSB0aW1lO1xuICAgICAgICB0aGlzLl9zdGFydFRpbWUgKz0gdGhpcy5fZGVsYXlUaW1lO1xuICAgICAgICBpZiAoIXRoaXMuX3Byb3BlcnRpZXNBcmVTZXRVcCB8fCBvdmVycmlkZVN0YXJ0aW5nVmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzQXJlU2V0VXAgPSB0cnVlO1xuICAgICAgICAgICAgLy8gSWYgZHluYW1pYyBpcyBub3QgZW5hYmxlZCwgY2xvbmUgdGhlIGVuZCB2YWx1ZXMgaW5zdGVhZCBvZiB1c2luZyB0aGUgcGFzc2VkLWluIGVuZCB2YWx1ZXMuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzRHluYW1pYykge1xuICAgICAgICAgICAgICAgIHZhciB0bXAgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHRoaXMuX3ZhbHVlc0VuZClcbiAgICAgICAgICAgICAgICAgICAgdG1wW3Byb3BdID0gdGhpcy5fdmFsdWVzRW5kW3Byb3BdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc0VuZCA9IHRtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NldHVwUHJvcGVydGllcyh0aGlzLl9vYmplY3QsIHRoaXMuX3ZhbHVlc1N0YXJ0LCB0aGlzLl92YWx1ZXNFbmQsIHRoaXMuX3ZhbHVlc1N0YXJ0UmVwZWF0LCBvdmVycmlkZVN0YXJ0aW5nVmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5zdGFydEZyb21DdXJyZW50VmFsdWVzID0gZnVuY3Rpb24gKHRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQodGltZSwgdHJ1ZSk7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuX3NldHVwUHJvcGVydGllcyA9IGZ1bmN0aW9uIChfb2JqZWN0LCBfdmFsdWVzU3RhcnQsIF92YWx1ZXNFbmQsIF92YWx1ZXNTdGFydFJlcGVhdCwgb3ZlcnJpZGVTdGFydGluZ1ZhbHVlcykge1xuICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBfdmFsdWVzRW5kKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnRWYWx1ZSA9IF9vYmplY3RbcHJvcGVydHldO1xuICAgICAgICAgICAgdmFyIHN0YXJ0VmFsdWVJc0FycmF5ID0gQXJyYXkuaXNBcnJheShzdGFydFZhbHVlKTtcbiAgICAgICAgICAgIHZhciBwcm9wVHlwZSA9IHN0YXJ0VmFsdWVJc0FycmF5ID8gJ2FycmF5JyA6IHR5cGVvZiBzdGFydFZhbHVlO1xuICAgICAgICAgICAgdmFyIGlzSW50ZXJwb2xhdGlvbkxpc3QgPSAhc3RhcnRWYWx1ZUlzQXJyYXkgJiYgQXJyYXkuaXNBcnJheShfdmFsdWVzRW5kW3Byb3BlcnR5XSk7XG4gICAgICAgICAgICAvLyBJZiBgdG8oKWAgc3BlY2lmaWVzIGEgcHJvcGVydHkgdGhhdCBkb2Vzbid0IGV4aXN0IGluIHRoZSBzb3VyY2Ugb2JqZWN0LFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIG5vdCBzZXQgdGhhdCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0XG4gICAgICAgICAgICBpZiAocHJvcFR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBhbiBBcnJheSB3YXMgcHJvdmlkZWQgYXMgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgICAgIGlmIChpc0ludGVycG9sYXRpb25MaXN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGVuZFZhbHVlcyA9IF92YWx1ZXNFbmRbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIGlmIChlbmRWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYW4gYXJyYXkgb2YgcmVsYXRpdmUgdmFsdWVzLlxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZXMgYSBsb2NhbCBjb3B5IG9mIHRoZSBBcnJheSB3aXRoIHRoZSBzdGFydCB2YWx1ZSBhdCB0aGUgZnJvbnRcbiAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IFtzdGFydFZhbHVlXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGVuZFZhbHVlcy5sZW5ndGg7IGkgPCBsOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5faGFuZGxlUmVsYXRpdmVWYWx1ZShzdGFydFZhbHVlLCBlbmRWYWx1ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0ludGVycG9sYXRpb25MaXN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZvdW5kIGludmFsaWQgaW50ZXJwb2xhdGlvbiBsaXN0LiBTa2lwcGluZy4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRlbXAucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0ludGVycG9sYXRpb25MaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChfdmFsdWVzU3RhcnRbcHJvcGVydHldID09PSB1bmRlZmluZWQpIHsgLy8gaGFuZGxlIGVuZCB2YWx1ZXMgb25seSB0aGUgZmlyc3QgdGltZS4gTk9UIE5FRURFRD8gc2V0dXBQcm9wZXJ0aWVzIGlzIG5vdyBndWFyZGVkIGJ5IF9wcm9wZXJ0aWVzQXJlU2V0VXAuXG4gICAgICAgICAgICAgICAgICAgIF92YWx1ZXNFbmRbcHJvcGVydHldID0gdGVtcDtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZGVlcG5lc3Mgb2YgdGhlIHZhbHVlc1xuICAgICAgICAgICAgaWYgKChwcm9wVHlwZSA9PT0gJ29iamVjdCcgfHwgc3RhcnRWYWx1ZUlzQXJyYXkpICYmIHN0YXJ0VmFsdWUgJiYgIWlzSW50ZXJwb2xhdGlvbkxpc3QpIHtcbiAgICAgICAgICAgICAgICBfdmFsdWVzU3RhcnRbcHJvcGVydHldID0gc3RhcnRWYWx1ZUlzQXJyYXkgPyBbXSA6IHt9O1xuICAgICAgICAgICAgICAgIHZhciBuZXN0ZWRPYmplY3QgPSBzdGFydFZhbHVlO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gbmVzdGVkT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIF92YWx1ZXNTdGFydFtwcm9wZXJ0eV1bcHJvcF0gPSBuZXN0ZWRPYmplY3RbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRPRE8/IHJlcGVhdCBuZXN0ZWQgdmFsdWVzPyBBbmQgeW95bz8gQW5kIGFycmF5IHZhbHVlcz9cbiAgICAgICAgICAgICAgICBfdmFsdWVzU3RhcnRSZXBlYXRbcHJvcGVydHldID0gc3RhcnRWYWx1ZUlzQXJyYXkgPyBbXSA6IHt9O1xuICAgICAgICAgICAgICAgIHZhciBlbmRWYWx1ZXMgPSBfdmFsdWVzRW5kW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAvLyBJZiBkeW5hbWljIGlzIG5vdCBlbmFibGVkLCBjbG9uZSB0aGUgZW5kIHZhbHVlcyBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBwYXNzZWQtaW4gZW5kIHZhbHVlcy5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lzRHluYW1pYykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG1wID0ge307XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gZW5kVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG1wW3Byb3BdID0gZW5kVmFsdWVzW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICBfdmFsdWVzRW5kW3Byb3BlcnR5XSA9IGVuZFZhbHVlcyA9IHRtcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0dXBQcm9wZXJ0aWVzKG5lc3RlZE9iamVjdCwgX3ZhbHVlc1N0YXJ0W3Byb3BlcnR5XSwgZW5kVmFsdWVzLCBfdmFsdWVzU3RhcnRSZXBlYXRbcHJvcGVydHldLCBvdmVycmlkZVN0YXJ0aW5nVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHZhbHVlLCBidXQgb25seSBvbmNlIHVubGVzcyBvdmVycmlkZSBpcyByZXF1ZXN0ZWQuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBfdmFsdWVzU3RhcnRbcHJvcGVydHldID09PSAndW5kZWZpbmVkJyB8fCBvdmVycmlkZVN0YXJ0aW5nVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIF92YWx1ZXNTdGFydFtwcm9wZXJ0eV0gPSBzdGFydFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0VmFsdWVJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIEZJWE1FP1xuICAgICAgICAgICAgICAgICAgICBfdmFsdWVzU3RhcnRbcHJvcGVydHldICo9IDEuMDsgLy8gRW5zdXJlcyB3ZSdyZSB1c2luZyBudW1iZXJzLCBub3Qgc3RyaW5nc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNJbnRlcnBvbGF0aW9uTGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBGSVhNRT9cbiAgICAgICAgICAgICAgICAgICAgX3ZhbHVlc1N0YXJ0UmVwZWF0W3Byb3BlcnR5XSA9IF92YWx1ZXNFbmRbcHJvcGVydHldLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZhbHVlc1N0YXJ0UmVwZWF0W3Byb3BlcnR5XSA9IF92YWx1ZXNTdGFydFtwcm9wZXJ0eV0gfHwgMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2lzQ2hhaW5TdG9wcGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0NoYWluU3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN0b3BDaGFpbmVkVHdlZW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9pc1BsYXlpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICB0aGlzLl9ncm91cCAmJiB0aGlzLl9ncm91cC5yZW1vdmUodGhpcyk7XG4gICAgICAgIHRoaXMuX2lzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fb25TdG9wQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuX29uU3RvcENhbGxiYWNrKHRoaXMuX29iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9nb1RvRW5kID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGUoSW5maW5pdHkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgIGlmICh0aW1lID09PSB2b2lkIDApIHsgdGltZSA9IG5vdygpOyB9XG4gICAgICAgIGlmICh0aGlzLl9pc1BhdXNlZCB8fCAhdGhpcy5faXNQbGF5aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc1BhdXNlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3BhdXNlU3RhcnQgPSB0aW1lO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgdGhpcy5fZ3JvdXAgJiYgdGhpcy5fZ3JvdXAucmVtb3ZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAodGltZSkge1xuICAgICAgICBpZiAodGltZSA9PT0gdm9pZCAwKSB7IHRpbWUgPSBub3coKTsgfVxuICAgICAgICBpZiAoIXRoaXMuX2lzUGF1c2VkIHx8ICF0aGlzLl9pc1BsYXlpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSArPSB0aW1lIC0gdGhpcy5fcGF1c2VTdGFydDtcbiAgICAgICAgdGhpcy5fcGF1c2VTdGFydCA9IDA7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICB0aGlzLl9ncm91cCAmJiB0aGlzLl9ncm91cC5hZGQodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLnN0b3BDaGFpbmVkVHdlZW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbnVtQ2hhaW5lZFR3ZWVucyA9IHRoaXMuX2NoYWluZWRUd2VlbnMubGVuZ3RoOyBpIDwgbnVtQ2hhaW5lZFR3ZWVuczsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFpbmVkVHdlZW5zW2ldLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5ncm91cCA9IGZ1bmN0aW9uIChncm91cCkge1xuICAgICAgICBpZiAoZ3JvdXAgPT09IHZvaWQgMCkgeyBncm91cCA9IG1haW5Hcm91cDsgfVxuICAgICAgICB0aGlzLl9ncm91cCA9IGdyb3VwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5kZWxheSA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgaWYgKGFtb3VudCA9PT0gdm9pZCAwKSB7IGFtb3VudCA9IDA7IH1cbiAgICAgICAgdGhpcy5fZGVsYXlUaW1lID0gYW1vdW50O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5yZXBlYXQgPSBmdW5jdGlvbiAodGltZXMpIHtcbiAgICAgICAgaWYgKHRpbWVzID09PSB2b2lkIDApIHsgdGltZXMgPSAwOyB9XG4gICAgICAgIHRoaXMuX2luaXRpYWxSZXBlYXQgPSB0aW1lcztcbiAgICAgICAgdGhpcy5fcmVwZWF0ID0gdGltZXM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLnJlcGVhdERlbGF5ID0gZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICB0aGlzLl9yZXBlYXREZWxheVRpbWUgPSBhbW91bnQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLnlveW8gPSBmdW5jdGlvbiAoeW95bykge1xuICAgICAgICBpZiAoeW95byA9PT0gdm9pZCAwKSB7IHlveW8gPSBmYWxzZTsgfVxuICAgICAgICB0aGlzLl95b3lvID0geW95bztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuZWFzaW5nID0gZnVuY3Rpb24gKGVhc2luZ0Z1bmN0aW9uKSB7XG4gICAgICAgIGlmIChlYXNpbmdGdW5jdGlvbiA9PT0gdm9pZCAwKSB7IGVhc2luZ0Z1bmN0aW9uID0gRWFzaW5nLkxpbmVhci5Ob25lOyB9XG4gICAgICAgIHRoaXMuX2Vhc2luZ0Z1bmN0aW9uID0gZWFzaW5nRnVuY3Rpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLmludGVycG9sYXRpb24gPSBmdW5jdGlvbiAoaW50ZXJwb2xhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uRnVuY3Rpb24gPT09IHZvaWQgMCkgeyBpbnRlcnBvbGF0aW9uRnVuY3Rpb24gPSBJbnRlcnBvbGF0aW9uLkxpbmVhcjsgfVxuICAgICAgICB0aGlzLl9pbnRlcnBvbGF0aW9uRnVuY3Rpb24gPSBpbnRlcnBvbGF0aW9uRnVuY3Rpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgVHdlZW4ucHJvdG90eXBlLmNoYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdHdlZW5zID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0d2VlbnNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFpbmVkVHdlZW5zID0gdHdlZW5zO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uU3RhcnRDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5vbkV2ZXJ5U3RhcnQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25FdmVyeVN0YXJ0Q2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUub25VcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25VcGRhdGVDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5vblJlcGVhdCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vblJlcGVhdENhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLm9uQ29tcGxldGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25Db21wbGV0ZUNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLm9uU3RvcCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vblN0b3BDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3ZWVuIGlzIHN0aWxsIHBsYXlpbmcgYWZ0ZXIgdGhlIHVwZGF0ZSwgZmFsc2VcbiAgICAgKiBvdGhlcndpc2UgKGNhbGxpbmcgdXBkYXRlIG9uIGEgcGF1c2VkIHR3ZWVuIHN0aWxsIHJldHVybnMgdHJ1ZSBiZWNhdXNlXG4gICAgICogaXQgaXMgc3RpbGwgcGxheWluZywganVzdCBwYXVzZWQpLlxuICAgICAqL1xuICAgIFR3ZWVuLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodGltZSwgYXV0b1N0YXJ0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRpbWUgPT09IHZvaWQgMCkgeyB0aW1lID0gbm93KCk7IH1cbiAgICAgICAgaWYgKGF1dG9TdGFydCA9PT0gdm9pZCAwKSB7IGF1dG9TdGFydCA9IHRydWU7IH1cbiAgICAgICAgaWYgKHRoaXMuX2lzUGF1c2VkKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHZhciBwcm9wZXJ0eTtcbiAgICAgICAgdmFyIGVuZFRpbWUgPSB0aGlzLl9zdGFydFRpbWUgKyB0aGlzLl9kdXJhdGlvbjtcbiAgICAgICAgaWYgKCF0aGlzLl9nb1RvRW5kICYmICF0aGlzLl9pc1BsYXlpbmcpIHtcbiAgICAgICAgICAgIGlmICh0aW1lID4gZW5kVGltZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoYXV0b1N0YXJ0KVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQodGltZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZ29Ub0VuZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGltZSA8IHRoaXMuX3N0YXJ0VGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX29uU3RhcnRDYWxsYmFja0ZpcmVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX29uU3RhcnRDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uU3RhcnRDYWxsYmFjayh0aGlzLl9vYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb25TdGFydENhbGxiYWNrRmlyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vbkV2ZXJ5U3RhcnRDYWxsYmFja0ZpcmVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX29uRXZlcnlTdGFydENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FdmVyeVN0YXJ0Q2FsbGJhY2sodGhpcy5fb2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29uRXZlcnlTdGFydENhbGxiYWNrRmlyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbGFwc2VkVGltZSA9IHRpbWUgLSB0aGlzLl9zdGFydFRpbWU7XG4gICAgICAgIHZhciBkdXJhdGlvbkFuZERlbGF5ID0gdGhpcy5fZHVyYXRpb24gKyAoKF9hID0gdGhpcy5fcmVwZWF0RGVsYXlUaW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLl9kZWxheVRpbWUpO1xuICAgICAgICB2YXIgdG90YWxUaW1lID0gdGhpcy5fZHVyYXRpb24gKyB0aGlzLl9yZXBlYXQgKiBkdXJhdGlvbkFuZERlbGF5O1xuICAgICAgICB2YXIgY2FsY3VsYXRlRWxhcHNlZFBvcnRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuX2R1cmF0aW9uID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKGVsYXBzZWRUaW1lID4gdG90YWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGltZXNSZXBlYXRlZCA9IE1hdGgudHJ1bmMoZWxhcHNlZFRpbWUgLyBkdXJhdGlvbkFuZERlbGF5KTtcbiAgICAgICAgICAgIHZhciB0aW1lSW50b0N1cnJlbnRSZXBlYXQgPSBlbGFwc2VkVGltZSAtIHRpbWVzUmVwZWF0ZWQgKiBkdXJhdGlvbkFuZERlbGF5O1xuICAgICAgICAgICAgLy8gVE9ETyB1c2UgJT9cbiAgICAgICAgICAgIC8vIGNvbnN0IHRpbWVJbnRvQ3VycmVudFJlcGVhdCA9IGVsYXBzZWRUaW1lICUgZHVyYXRpb25BbmREZWxheVxuICAgICAgICAgICAgdmFyIHBvcnRpb24gPSBNYXRoLm1pbih0aW1lSW50b0N1cnJlbnRSZXBlYXQgLyBfdGhpcy5fZHVyYXRpb24sIDEpO1xuICAgICAgICAgICAgaWYgKHBvcnRpb24gPT09IDAgJiYgZWxhcHNlZFRpbWUgPT09IF90aGlzLl9kdXJhdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBvcnRpb247XG4gICAgICAgIH07XG4gICAgICAgIHZhciBlbGFwc2VkID0gY2FsY3VsYXRlRWxhcHNlZFBvcnRpb24oKTtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZWFzaW5nRnVuY3Rpb24oZWxhcHNlZCk7XG4gICAgICAgIC8vIHByb3BlcnRpZXMgdHJhbnNmb3JtYXRpb25zXG4gICAgICAgIHRoaXMuX3VwZGF0ZVByb3BlcnRpZXModGhpcy5fb2JqZWN0LCB0aGlzLl92YWx1ZXNTdGFydCwgdGhpcy5fdmFsdWVzRW5kLCB2YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLl9vblVwZGF0ZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9vblVwZGF0ZUNhbGxiYWNrKHRoaXMuX29iamVjdCwgZWxhcHNlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2R1cmF0aW9uID09PSAwIHx8IGVsYXBzZWRUaW1lID49IHRoaXMuX2R1cmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVwZWF0ID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBjb21wbGV0ZUNvdW50ID0gTWF0aC5taW4oTWF0aC50cnVuYygoZWxhcHNlZFRpbWUgLSB0aGlzLl9kdXJhdGlvbikgLyBkdXJhdGlvbkFuZERlbGF5KSArIDEsIHRoaXMuX3JlcGVhdCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmluaXRlKHRoaXMuX3JlcGVhdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwZWF0IC09IGNvbXBsZXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFJlYXNzaWduIHN0YXJ0aW5nIHZhbHVlcywgcmVzdGFydCBieSBtYWtpbmcgc3RhcnRUaW1lID0gbm93XG4gICAgICAgICAgICAgICAgZm9yIChwcm9wZXJ0eSBpbiB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3lveW8gJiYgdHlwZW9mIHRoaXMuX3ZhbHVlc0VuZFtwcm9wZXJ0eV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgRklYTUU/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzU3RhcnRSZXBlYXRbcHJvcGVydHldICsgcGFyc2VGbG9hdCh0aGlzLl92YWx1ZXNFbmRbcHJvcGVydHldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5feW95bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3dhcEVuZFN0YXJ0UmVwZWF0VmFsdWVzKHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNTdGFydFtwcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl95b3lvKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JldmVyc2VkID0gIXRoaXMuX3JldmVyc2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFRpbWUgKz0gZHVyYXRpb25BbmREZWxheSAqIGNvbXBsZXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uUmVwZWF0Q2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25SZXBlYXRDYWxsYmFjayh0aGlzLl9vYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9vbkV2ZXJ5U3RhcnRDYWxsYmFja0ZpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb25Db21wbGV0ZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ29tcGxldGVDYWxsYmFjayh0aGlzLl9vYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbnVtQ2hhaW5lZFR3ZWVucyA9IHRoaXMuX2NoYWluZWRUd2VlbnMubGVuZ3RoOyBpIDwgbnVtQ2hhaW5lZFR3ZWVuczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIGNoYWluZWQgdHdlZW5zIHN0YXJ0IGV4YWN0bHkgYXQgdGhlIHRpbWUgdGhleSBzaG91bGQsXG4gICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gaWYgdGhlIGB1cGRhdGUoKWAgbWV0aG9kIHdhcyBjYWxsZWQgd2F5IHBhc3QgdGhlIGR1cmF0aW9uIG9mIHRoZSB0d2VlblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFpbmVkVHdlZW5zW2ldLnN0YXJ0KHRoaXMuX3N0YXJ0VGltZSArIHRoaXMuX2R1cmF0aW9uLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2lzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5fdXBkYXRlUHJvcGVydGllcyA9IGZ1bmN0aW9uIChfb2JqZWN0LCBfdmFsdWVzU3RhcnQsIF92YWx1ZXNFbmQsIHZhbHVlKSB7XG4gICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIF92YWx1ZXNFbmQpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVwZGF0ZSBwcm9wZXJ0aWVzIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBzb3VyY2Ugb2JqZWN0XG4gICAgICAgICAgICBpZiAoX3ZhbHVlc1N0YXJ0W3Byb3BlcnR5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBfdmFsdWVzU3RhcnRbcHJvcGVydHldIHx8IDA7XG4gICAgICAgICAgICB2YXIgZW5kID0gX3ZhbHVlc0VuZFtwcm9wZXJ0eV07XG4gICAgICAgICAgICB2YXIgc3RhcnRJc0FycmF5ID0gQXJyYXkuaXNBcnJheShfb2JqZWN0W3Byb3BlcnR5XSk7XG4gICAgICAgICAgICB2YXIgZW5kSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoZW5kKTtcbiAgICAgICAgICAgIHZhciBpc0ludGVycG9sYXRpb25MaXN0ID0gIXN0YXJ0SXNBcnJheSAmJiBlbmRJc0FycmF5O1xuICAgICAgICAgICAgaWYgKGlzSW50ZXJwb2xhdGlvbkxpc3QpIHtcbiAgICAgICAgICAgICAgICBfb2JqZWN0W3Byb3BlcnR5XSA9IHRoaXMuX2ludGVycG9sYXRpb25GdW5jdGlvbihlbmQsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdvYmplY3QnICYmIGVuZCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgRklYTUU/XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlUHJvcGVydGllcyhfb2JqZWN0W3Byb3BlcnR5XSwgc3RhcnQsIGVuZCwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUGFyc2VzIHJlbGF0aXZlIGVuZCB2YWx1ZXMgd2l0aCBzdGFydCBhcyBiYXNlIChlLmcuOiArMTAsIC0zKVxuICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuX2hhbmRsZVJlbGF0aXZlVmFsdWUoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgICAgICAgLy8gUHJvdGVjdCBhZ2FpbnN0IG5vbiBudW1lcmljIHByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbmQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIEZJWE1FP1xuICAgICAgICAgICAgICAgICAgICBfb2JqZWN0W3Byb3BlcnR5XSA9IHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLl9oYW5kbGVSZWxhdGl2ZVZhbHVlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQuY2hhckF0KDApID09PSAnKycgfHwgZW5kLmNoYXJBdCgwKSA9PT0gJy0nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBwYXJzZUZsb2F0KGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoZW5kKTtcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5fc3dhcEVuZFN0YXJ0UmVwZWF0VmFsdWVzID0gZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgIHZhciB0bXAgPSB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV07XG4gICAgICAgIHZhciBlbmRWYWx1ZSA9IHRoaXMuX3ZhbHVlc0VuZFtwcm9wZXJ0eV07XG4gICAgICAgIGlmICh0eXBlb2YgZW5kVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV0gKyBwYXJzZUZsb2F0KGVuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1N0YXJ0UmVwZWF0W3Byb3BlcnR5XSA9IHRoaXMuX3ZhbHVlc0VuZFtwcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmFsdWVzRW5kW3Byb3BlcnR5XSA9IHRtcDtcbiAgICB9O1xuICAgIHJldHVybiBUd2Vlbjtcbn0oKSk7XG5cbnZhciBWRVJTSU9OID0gJzIzLjEuMyc7XG5cbi8qKlxuICogVHdlZW4uanMgLSBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2VlbmpzL3R3ZWVuLmpzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2VlbmpzL3R3ZWVuLmpzL2dyYXBocy9jb250cmlidXRvcnMgZm9yIHRoZSBmdWxsIGxpc3Qgb2YgY29udHJpYnV0b3JzLlxuICogVGhhbmsgeW91IGFsbCwgeW91J3JlIGF3ZXNvbWUhXG4gKi9cbnZhciBuZXh0SWQgPSBTZXF1ZW5jZS5uZXh0SWQ7XG4vKipcbiAqIENvbnRyb2xsaW5nIGdyb3VwcyBvZiB0d2VlbnNcbiAqXG4gKiBVc2luZyB0aGUgVFdFRU4gc2luZ2xldG9uIHRvIG1hbmFnZSB5b3VyIHR3ZWVucyBjYW4gY2F1c2UgaXNzdWVzIGluIGxhcmdlIGFwcHMgd2l0aCBtYW55IGNvbXBvbmVudHMuXG4gKiBJbiB0aGVzZSBjYXNlcywgeW91IG1heSB3YW50IHRvIGNyZWF0ZSB5b3VyIG93biBzbWFsbGVyIGdyb3VwcyBvZiB0d2VlbnMuXG4gKi9cbnZhciBUV0VFTiA9IG1haW5Hcm91cDtcbi8vIFRoaXMgaXMgdGhlIGJlc3Qgd2F5IHRvIGV4cG9ydCB0aGluZ3MgaW4gYSB3YXkgdGhhdCdzIGNvbXBhdGlibGUgd2l0aCBib3RoIEVTXG4vLyBNb2R1bGVzIGFuZCBDb21tb25KUywgd2l0aG91dCBidWlsZCBoYWNrcywgYW5kIHNvIGFzIG5vdCB0byBicmVhayB0aGVcbi8vIGV4aXN0aW5nIEFQSS5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcm9sbHVwL2lzc3Vlcy8xOTYxI2lzc3VlY29tbWVudC00MjMwMzc4ODFcbnZhciBnZXRBbGwgPSBUV0VFTi5nZXRBbGwuYmluZChUV0VFTik7XG52YXIgcmVtb3ZlQWxsID0gVFdFRU4ucmVtb3ZlQWxsLmJpbmQoVFdFRU4pO1xudmFyIGFkZCA9IFRXRUVOLmFkZC5iaW5kKFRXRUVOKTtcbnZhciByZW1vdmUgPSBUV0VFTi5yZW1vdmUuYmluZChUV0VFTik7XG52YXIgdXBkYXRlID0gVFdFRU4udXBkYXRlLmJpbmQoVFdFRU4pO1xudmFyIGV4cG9ydHMgPSB7XG4gICAgRWFzaW5nOiBFYXNpbmcsXG4gICAgR3JvdXA6IEdyb3VwLFxuICAgIEludGVycG9sYXRpb246IEludGVycG9sYXRpb24sXG4gICAgbm93OiBub3csXG4gICAgU2VxdWVuY2U6IFNlcXVlbmNlLFxuICAgIG5leHRJZDogbmV4dElkLFxuICAgIFR3ZWVuOiBUd2VlbixcbiAgICBWRVJTSU9OOiBWRVJTSU9OLFxuICAgIGdldEFsbDogZ2V0QWxsLFxuICAgIHJlbW92ZUFsbDogcmVtb3ZlQWxsLFxuICAgIGFkZDogYWRkLFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIHVwZGF0ZTogdXBkYXRlLFxufTtcblxuZXhwb3J0IHsgRWFzaW5nLCBHcm91cCwgSW50ZXJwb2xhdGlvbiwgU2VxdWVuY2UsIFR3ZWVuLCBWRVJTSU9OLCBhZGQsIGV4cG9ydHMgYXMgZGVmYXVsdCwgZ2V0QWxsLCBuZXh0SWQsIG5vdywgcmVtb3ZlLCByZW1vdmVBbGwsIHVwZGF0ZSB9O1xuIiwiaW1wb3J0IHsgVHdlZW4sIEVhc2luZyB9IGZyb20gJ0B0d2VlbmpzL3R3ZWVuLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFR3ZWVuUmVzIGV4dGVuZHMgVHdlZW48YW55PiB7XG4gIG9uRGVzdHJveTogKGZuOiAoKSA9PiB2b2lkKSA9PiBhbnlcbiAgZGVzdHJveTogKCkgPT4gYW55XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0d2Vlbihmcm9tOiBhbnksIHRvOiBhbnksIGR1cmF0aW9uOiBudW1iZXIsIGVhc2luZyA9IEVhc2luZy5MaW5lYXIuTm9uZSkge1xuICBjb25zdCB0d2Vlbkluc3RhbmNlID0gbmV3IFR3ZWVuKGZyb20pLnRvKHRvLCBkdXJhdGlvbikuZWFzaW5nKGVhc2luZykuc3RhcnQoKSBhcyBUd2VlblJlc1xuXG4gIGZ1bmN0aW9uIGFuaW1hdGUodGltZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0d2Vlbkluc3RhbmNlLnVwZGF0ZSh0aW1lKSkgcmV0dXJuXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpXG4gIH1cbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpXG5cbiAgcmV0dXJuIHR3ZWVuSW5zdGFuY2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR3ZWVuUHJvZ3Jlc3MoZHVyYXRpb246IG51bWJlciwgZWFzaW5nOiAoYW1vdW50OiBudW1iZXIpID0+IG51bWJlcikge1xuICByZXR1cm4gdHdlZW4oeyBwcm9ncmVzczogMCB9LCB7IHByb2dyZXNzOiAxIH0sIGR1cmF0aW9uLCBlYXNpbmcpXG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIFBhaW50QnJ1c2hDb25maWdzIHtcbiAgY29udGFpbmVyPzogSFRNTERpdkVsZW1lbnRcbiAgY3VycmVudENvbG9yOiBzdHJpbmdcbiAgRFBSPzogbnVtYmVyLFxuICBvbkNsaWNrQ2xvc2U/OiAoKSA9PiB2b2lkLFxuICBvbkNsaWNrVW5kbz86ICgpID0+IHZvaWQsXG4gIG9uVW5kb1RleHQ/OiBzdHJpbmdcbiAgb25FeGl0VGV4dD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBQYWludEJydXNoRXZlbnRNYXAgPSB7XG4gIHJlYWR5Q2hhbmdlOiAocmVhZHk6IGJvb2xlYW4pID0+IHZvaWQsXG4gIHN0YXRlQ2hhbmdlOiAoc3RhdGU6IFBhaW50QnJ1c2hBY3Rpb24sIHVzZXJBY3Rpb246IGJvb2xlYW4pID0+IHZvaWQsXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBQYWludEJydXNoU3RhdGUge1xuICBtb3ZlOiB7eDogbnVtYmVyLCB5OiBudW1iZXJ9XG4gIGxpbmU6IHt4OiBudW1iZXIsIHk6IG51bWJlcn1bXVxuICBjb2xvcjogc3RyaW5nXG4gIHV1aWQ6IHN0cmluZ1xuICBkdXJhdGlvbjogbnVtYmVyIC8vIOWNleasoeeslOi/ueaXtumVv+i2hei/hzIwMDBtc+S4jeWKoOWKqOeUu1xufVxuXG5cbmV4cG9ydCBlbnVtIFBhaW50QnJ1c2hUeXBlRW51bSB7XG4gIERyYXdsaW5lPSdEcmF3bGluZScsXG4gIFVuZG89J1VuZG8nLFxuICBFeGl0PSdFeGl0Jyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWludEJydXNoQWN0aW9uIHtcbiAgdXVpZDogc3RyaW5nXG4gIC8qKlxuICAgKiDnsbvlnovmnprkuL5cbiAgICovXG4gIHR5cGU6IFBhaW50QnJ1c2hUeXBlRW51bVxuICAvKipcbiAgICog6aKc6Imy6Imy5YC8XG4gICAqL1xuICBjb2xvcjogc3RyaW5nXG4gIC8qKlxuICAgKiDmmK/lkKblsLHnu6pcbiAgICovXG4gIHJlYWR5OiBib29sZWFuXG4gIC8qKlxuICAgKiDnirbmgIHlgLxcbiAgICovXG4gIHN0YXRlPzogUGFpbnRCcnVzaFN0YXRlXG4gIC8qKlxuICAgKiDml7bpl7TmiLPvvJrlvZPkvZwgdXVpZCDkvb/nlKhcbiAgICovXG4gIHRpbWVzdGFtcD86IG51bWJlclxuICAvKipcbiAgICog5piv5ZCm5piv57uT5bC+5pWw5o2uXG4gICAqL1xuICBlbmQ/OiBib29sZWFuXG59XG4iLCIvLyB0eXBlIFVuaXF1ZVN5bWJvbCA9IFJldHVyblR5cGU8KGE6IHN0cmluZykgPT4geyByZWFkb25seSAwOiB1bmlxdWUgc3ltYm9sIH1bMF0+O1xuLy9cbi8vIGZ1bmN0aW9uIGNyZWF0ZVN5bWJvbChkZXNjcmlwdGlvbjogc3RyaW5nKTogVW5pcXVlU3ltYm9sIHtcbi8vICAgLy8gVE9ETyDop6PlhrPmj5DnpLpcbi8vICAgLy8gQHRzLWlnbm9yZVxuLy8gICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiA/IGAkU3ltYm9sPCR7ZGVzY3JpcHRpb259PiRgIDogU3ltYm9sKGRlc2NyaXB0aW9uKTtcbi8vIH1cbi8vXG4vLyBjb25zdCBFVkVOVF9TWU1CT0wgPSBjcmVhdGVTeW1ib2woXCIkJExJVkVfRVZFTlQkJFwiKVxuXG5jb25zdCBFVkVOVF9TWU1CT0w6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woXCIkJFBBSU5UX0JSVVNIX0VWRU5UJCRcIilcblxuZXhwb3J0IHR5cGUgRXZlbnRNYXAgPSB7XG4gIFtuYW1lOiBzdHJpbmddOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQgfCBib29sZWFuLFxufVxuXG5mdW5jdGlvbiBfX2dlbmVyYXRlRXZlbnRJZk5vdEV4aXN0ZWQ8VCBleHRlbmRzIEV2ZW50TWFwPihpbnN0YW5jZTogYW55KToge1xuICBbS2V5IGluIGtleW9mIFRdOiBbY2FsbGJhY2s6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFRbS2V5XT4pID0+IFJldHVyblR5cGU8VFtLZXldPiwgb25jZTogYm9vbGVhbl1bXVxufSB7XG4gIGlmICghaW5zdGFuY2VbRVZFTlRfU1lNQk9MXSkge1xuICAgIGluc3RhbmNlW0VWRU5UX1NZTUJPTF0gPSB7fVxuICB9XG4gIHJldHVybiBpbnN0YW5jZVtFVkVOVF9TWU1CT0xdXG59XG5cbmZ1bmN0aW9uIF9fcmVtb3ZlRXZlbnRJZk5vdEV4aXN0ZWQoaW5zdGFuY2U6IGFueSkge1xuICBpZiAoIWluc3RhbmNlW0VWRU5UX1NZTUJPTF0pIHtcbiAgICBkZWxldGUgaW5zdGFuY2VbRVZFTlRfU1lNQk9MXVxuICB9XG59XG5cbi8qKlxuICog55uR5ZCs6ICF5qih5byPXG4gKiBAdGVtcGxhdGUgVCDpooTorr7nmoTnm5HlkKzlm57osIPnsbvlnotcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIG5ldyBTdWJzY3JpYmU8e1xuICogXCJmb29cIjogW2FyZzE6IG51bWJlciwgYXJnMjogc3RyaW5nXSxcbiAqIFwiYmFyXCI6IFthcmc6IGJvb2xlYW5dLFxuICogfT4oKVxuICogYGBgXG4gKi9cbmNsYXNzIFN1YnNjcmliZTxUIGV4dGVuZHMgRXZlbnRNYXA+e1xuICAvKipcbiAgICog5Yik5pat5piv5ZCm5rOo5YaM5LqG5LqL5Lu2XG4gICAqIEBwYXJhbSBuYW1lICDkuovku7bnsbvlnotcbiAgICovXG4gIGhhc0xpc3RlbmVyKG5hbWU6IGtleW9mIFQpOiBib29sZWFuIHtcbiAgICBjb25zdCBldmVudHMgPSBfX2dlbmVyYXRlRXZlbnRJZk5vdEV4aXN0ZWQ8VD4odGhpcylcbiAgICByZXR1cm4gZXZlbnRzICYmIGV2ZW50c1tuYW1lXSAmJiBldmVudHNbbmFtZV0ubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tlxuICAgKiBAcGFyYW0gIG5hbWUgICAg5LqL5Lu257G75Z6LXG4gICAqIEBwYXJhbSAgY2FsbGJhY2sg5LqL5Lu25Zue6LCD5Ye95pWwXG4gICAqIEBwYXJhbSAgb25jZSAgICAg5piv5ZCm5Y+q5omn6KGM5LiA5qyhXG4gICAqIEByZXR1cm5zIOino+mZpOS6i+S7tlxuICAgKiBAdGVtcGxhdGUgSyDpooTorr7nmoTnm5HlkKzkuovku7blkI3np7BcbiAgICogQHRlbXBsYXRlIEMg5Zue6LCD5Ye95pWw5Ye95pWw5LiK5LiL5paHXG4gICAqL1xuICBvbjxLIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgbmFtZTogSyxcbiAgICBjYWxsYmFjazogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IFJldHVyblR5cGU8VFtLXT4sXG4gICAgb25jZT86IGJvb2xlYW5cbiAgKTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3QgZXZlbnRzID0gX19nZW5lcmF0ZUV2ZW50SWZOb3RFeGlzdGVkPFQ+KHRoaXMpXG4gICAgaWYgKCFldmVudHNbbmFtZV0pIGV2ZW50c1tuYW1lXSA9IFtdXG4gICAgZXZlbnRzW25hbWVdLnB1c2goW2NhbGxiYWNrIGFzIGFueSwgb25jZSB8fCBmYWxzZV0pXG4gICAgcmV0dXJuICgpID0+IHRoaXMub2ZmKG5hbWUsIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tijmmK/lkKblj6rmiafooYzkuIDmrKEpXG4gICAqIEBwYXJhbSAgbmFtZSAgICAg5LqL5Lu257G75Z6LXG4gICAqIEBwYXJhbSAgY2FsbGJhY2sg5LqL5Lu25Zue6LCD5Ye95pWwXG4gICAqIEByZXR1cm5zIOino+mZpOS6i+S7tlxuICAgKiBAdGVtcGxhdGUgSyDpooTorr7nmoTnm5HlkKzkuovku7blkI3np7BcbiAgICogQHRlbXBsYXRlIEMg5Zue6LCD5Ye95pWw5Ye95pWw5LiK5LiL5paHXG4gICAqL1xuICBvbmNlPEsgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICBuYW1lOiBLLFxuICAgIGNhbGxiYWNrOiAoLi4uYXJnczogUGFyYW1ldGVyczxUW0tdPikgPT4gUmV0dXJuVHlwZTxUW0tdPixcbiAgKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMub24obmFtZSwgY2FsbGJhY2ssIHRydWUpXG4gIH1cblxuICAvKipcbiAgICog6Kej6Zmk5LqL5Lu2XG4gICAqXG4gICAqIOWmguaenCBuYW1lIOS4jeS8oOeahOivneino+mZpOWvueW6lOaJgOacieS6i+S7tlxuICAgKiDlpoLmnpwgbmFtZSwgY2FsbGJhY2sg5LiN5Lyg55qE6K+d6Kej6Zmk5omA5pyJbmFtZeeahOaJgOacieS6i+S7tlxuICAgKiBAcGFyYW0gIG5hbWUgICAgIOS6i+S7tuexu+Wei1xuICAgKiBAcGFyYW0gIGNhbGxiYWNrIOS6i+S7tuWbnuiwg+WHveaVsFxuICAgKiBAdGVtcGxhdGUgSyDpooTorr7nmoTnm5HlkKzkuovku7blkI3np7BcbiAgICovXG4gIG9mZjxLIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgbmFtZT86IEssXG4gICAgY2FsbGJhY2s/OiAoLi4uYXJnczogUGFyYW1ldGVyczxUW0tdPikgPT4gUmV0dXJuVHlwZTxUW0tdPlxuICApOiB2b2lkIHtcbiAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBfX3JlbW92ZUV2ZW50SWZOb3RFeGlzdGVkKHRoaXMpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZXZlbnRzID0gX19nZW5lcmF0ZUV2ZW50SWZOb3RFeGlzdGVkPFQ+KHRoaXMpXG4gICAgaWYgKCFldmVudHNbbmFtZV0pIGV2ZW50c1tuYW1lXSA9IFtdXG4gICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGV2ZW50c1tuYW1lXS5sZW5ndGggPSAwXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbGV0IGluZGV4ID0gMFxuICAgIGZvciAoOyBpbmRleCA8IGV2ZW50c1tuYW1lXS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmIChldmVudHNbbmFtZV1baW5kZXhdWzBdID09PSBjYWxsYmFjaykgYnJlYWtcbiAgICB9XG4gICAgaWYgKGluZGV4IDwgZXZlbnRzW25hbWVdLmxlbmd0aCkge1xuICAgICAgZXZlbnRzW25hbWVdLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6Kem5Y+R5LqL5Lu2XG4gICAqIEBwYXJhbSAgbmFtZSAg5LqL5Lu257G75Z6LXG4gICAqIEBwYXJhbSAgZGF0YSAg6Kem5Y+R5LqL5Lu255qE5pWw5o2uXG4gICAqIEByZXR1cm5zIGNhbmNlbGVkIOaYr+WQpuiiq+inpuWPkeWPlua2iFxuICAgKiBAdGVtcGxhdGUgSyDpooTorr7nmoTnm5HlkKzkuovku7blkI3np7BcbiAgICovXG4gIGVtaXQ8SyBleHRlbmRzIGtleW9mIFQ+KG5hbWU6IEssIC4uLmRhdGE6IFBhcmFtZXRlcnM8VFtLXT4pOiBib29sZWFuIHtcbiAgICBsZXQgY2FuY2VsZWQgPSBmYWxzZVxuICAgIGNvbnN0IGV2ZW50cyA9IF9fZ2VuZXJhdGVFdmVudElmTm90RXhpc3RlZDxUPih0aGlzKVxuICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRzW25hbWVdIHx8IFtdXG4gICAgZm9yIChsZXQgb25lIG9mIGV2ZW50LnNsaWNlKCkpIHtcbiAgICAgIGNvbnN0IFtjYWxsYmFjaywgb25jZSA9IGZhbHNlXSA9IG9uZVxuICAgICAgY29uc3QgcmVzdWx0ID0gY2FsbGJhY2soLi4uZGF0YSlcbiAgICAgIGlmIChvbmNlKSB0aGlzLm9mZihuYW1lLCBjYWxsYmFjaylcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSBjYW5jZWxlZCA9IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGNhbmNlbGVkXG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTdWJzY3JpYmVNaXhpblR5cGUge1xuICBleHBvcnQgaW50ZXJmYWNlIGhhc0xpc3RlbmVyPFQgZXh0ZW5kcyBFdmVudE1hcD4ge1xuICAgIChuYW1lOiBrZXlvZiBUKTogYm9vbGVhblxuICB9XG4gIGV4cG9ydCBpbnRlcmZhY2Ugb248VCBleHRlbmRzIEV2ZW50TWFwPiB7XG4gICAgPEsgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICAgIG5hbWU6IEssXG4gICAgICBjYWxsYmFjazogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IFJldHVyblR5cGU8VFtLXT4sXG4gICAgICBvbmNlPzogYm9vbGVhblxuICAgICk6ICgpID0+IHZvaWRcbiAgfVxuICBleHBvcnQgaW50ZXJmYWNlIG9uY2U8VCBleHRlbmRzIEV2ZW50TWFwPiB7XG4gICAgPEsgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICAgIG5hbWU6IEssXG4gICAgICBjYWxsYmFjazogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IFJldHVyblR5cGU8VFtLXT4sXG4gICAgKTogKCkgPT4gdm9pZFxuICB9XG4gIGV4cG9ydCBpbnRlcmZhY2Ugb2ZmPFQgZXh0ZW5kcyBFdmVudE1hcD4ge1xuICAgIDxLIGV4dGVuZHMga2V5b2YgVD4obmFtZXM/OiBLIHwgS1tdLCBjYWxsYmFjaz86ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogdm9pZFxuICB9XG4gIGV4cG9ydCBpbnRlcmZhY2UgZW1pdDxUIGV4dGVuZHMgRXZlbnRNYXA+IHtcbiAgICA8SyBleHRlbmRzIGtleW9mIFQ+KG5hbWU6IEssIC4uLmRhdGE6IFBhcmFtZXRlcnM8VFtLXT4pOiBib29sZWFuXG4gIH1cbn1cblxuZXhwb3J0IHsgU3Vic2NyaWJlIH1cbiIsIi8vIHV1aWRcbmZ1bmN0aW9uIFM0KCkge1xuICByZXR1cm4gKCgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCkgfCAwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpXG59XG4vKipcbiAqIOmaj+acuueUn+aIkOS4gOS4qnV1aWTlgLxcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1dWlkKCkge1xuICAvLyB0aGVuIHRvIGNhbGwgaXQsIHBsdXMgc3RpdGNoIGluICc0JyBpbiB0aGUgdGhpcmQgZ3JvdXBcbiAgcmV0dXJuIChTNCgpICsgUzQoKSArICctJyArIFM0KCkgKyAnLTQnICsgUzQoKS5zdWJzdHIoMCwgMykgKyAnLScgKyBTNCgpICsgJy0nICsgUzQoKSArIFM0KCkgKyBTNCgpKS50b0xvd2VyQ2FzZSgpXG59XG5cbmV4cG9ydCB7IHV1aWQgfVxuIiwiY29uc3QgUGFpbnRCcnVzaFN0eWxlID0gYFxuPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPlxuXG4jX2dsX3BhaW50QnJ1c2gge1xucG9zaXRpb246IGZpeGVkO1xudG9wOiAwO1xuYm90dG9tOiAwO1xubGVmdDogMDtcbnJpZ2h0OiAwO1xudHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApO1xuei1pbmRleDogMTk5NztcbnBvaW50ZXItZXZlbnRzOiBub25lO1xub3BhY2l0eTogMDtcbnRyYW5zaXRpb246IGFsbCA1MDBtcztcbn1cblxuI19nbF9wYWludEJydXNoLmJydXNoaW5nIHtcbiAgb3BhY2l0eTogMTtcbn1cblxuI19nbF9wYWludEJydXNoIC5fcGFpbnRCcnVzaC1jYW52YXMge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbn1cblxuI19nbF9wYWludEJydXNoIC5fcGFpbnRCcnVzaC1jYW52YXMtLXN5bmMge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgei1pbmRleDogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG59XG5cbiNfZ2xfcGFpbnRCcnVzaCAuX3BhaW50QnJ1c2gtY2FudmFzIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHotaW5kZXg6IDE7XG59XG5cbiNfZ2xfcGFpbnRCcnVzaC5icnVzaGluZyAuX3BhaW50QnJ1c2gtY2FudmFzIHtcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbiNfZ2xfcGFpbnRCcnVzaCAuX3BhaW50QnJ1c2gtY3RybCB7XG4gIHdpZHRoOiAxNDBweDtcbiAgaGVpZ2h0OiA1MnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogMjhweDtcbiAgcmlnaHQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDUwJSk7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgY29sb3I6IHdoaXRlO1xuICB6LWluZGV4OiAyO1xufVxuXG4jX2dsX3BhaW50QnJ1c2guYnJ1c2hpbmcgLl9wYWludEJydXNoLWN0cmwge1xuICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuI19nbF9wYWludEJydXNoIC5fcGFpbnRCcnVzaC1jdHJsIC5fcGFpbnRCcnVzaC1jdHJsaW5uZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDI2cHg7XG4gIHBhZGRpbmc6IDhweCAxNnB4O1xuICBib3gtc2hhZG93OiAwIDJweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCBoc2woMGRlZyAwJSAwJSAvIDU3JSksIGhzbCgwZGVnIDAlIDAlIC8gNzAlKSAxMTclKTtcbn1cblxuLl9wYWludEJydXNoLWN0cmxpdGVtIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHdpZHRoOiAzOHB4O1xuICBoZWlnaHQ6IDM4cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLl9wYWludEJydXNoLWN0cmxpdGVtLS11bmRvID4uYnJ1c2gtaWNvbntcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lQejRLUEhOMlp5QjNhV1IwYUQwaU1qSndlQ0lnYUdWcFoyaDBQU0l5TW5CNElpQjJhV1YzUW05NFBTSXdJREFnTWpJZ01qSWlJSFpsY25OcGIyNDlJakV1TVNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUkrQ2lBZ0lDQThaR1ZtY3o0S0lDQWdJQ0FnSUNBOGJHbHVaV0Z5UjNKaFpHbGxiblFnZURFOUlqVXdKU0lnZVRFOUlqUTFMalkzTlRJME9DVWlJSGd5UFNJdE1UWXVPVFl4TURJekpTSWdlVEk5SWpnMExqSXpPRFF4T1RnbElpQnBaRDBpYkdsdVpXRnlSM0poWkdsbGJuUXRNU0krQ2lBZ0lDQWdJQ0FnSUNBZ0lEeHpkRzl3SUhOMGIzQXRZMjlzYjNJOUlpTkdSa1pHUmtZaUlHOW1abk5sZEQwaU1DVWlQand2YzNSdmNENEtJQ0FnSUNBZ0lDQWdJQ0FnUEhOMGIzQWdjM1J2Y0MxamIyeHZjajBpSTBaR1JrWkdSaUlnYzNSdmNDMXZjR0ZqYVhSNVBTSXdMak13TXpZM05qYzVNaUlnYjJabWMyVjBQU0l4TURBbElqNDhMM04wYjNBK0NpQWdJQ0FnSUNBZ1BDOXNhVzVsWVhKSGNtRmthV1Z1ZEQ0S0lDQWdJRHd2WkdWbWN6NEtJQ0FnSUR4bklITjBjbTlyWlQwaWJtOXVaU0lnYzNSeWIydGxMWGRwWkhSb1BTSXhJaUJtYVd4c1BTSnViMjVsSWlCbWFXeHNMWEoxYkdVOUltVjJaVzV2WkdRaVBnb2dJQ0FnSUNBZ0lEeG5JSFJ5WVc1elptOXliVDBpZEhKaGJuTnNZWFJsS0MweE5EQXVNREF3TURBd0xDQXROelF3TGpBd01EQXdNQ2tpUGdvZ0lDQWdJQ0FnSUNBZ0lDQThaeUIwY21GdWMyWnZjbTA5SW5SeVlXNXpiR0YwWlNneE5EQXVNREF3TURBd0xDQTNOREF1TURBd01EQXdLU0krQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0E4Y21WamRDQm1hV3hzUFNJalJEaEVPRVE0SWlCdmNHRmphWFI1UFNJd0lpQjRQU0l3SWlCNVBTSXdJaUIzYVdSMGFEMGlNaklpSUdobGFXZG9kRDBpTWpJaVBqd3ZjbVZqZEQ0S0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUR4bklIUnlZVzV6Wm05eWJUMGlkSEpoYm5Oc1lYUmxLRFF1TURBd01EQXdMQ0F5TGprNU1EWTFPU2tpSUhOMGNtOXJaUzFzYVc1bFkyRndQU0p5YjNWdVpDSWdjM1J5YjJ0bExYZHBaSFJvUFNJeUlqNEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0E4Y0dGMGFDQmtQU0pOTUN3ekxqYzFPRGMxTnpBNUlFdzVMamcwTXpjMUxETXVOelU0TnpVM01Ea2dRekV5TGpZNU1UUTJPRElzTXk0M05UZzNOVGN3T1NBeE5TdzJMakEyTnpJNE9EZzFJREUxTERndU9URTFNREEzTURrZ1F6RTFMREV4TGpjMk1qY3lOVE1nTVRJdU5qa3hORFk0TWl3eE5DNHdOekV5TlRjeElEa3VPRFF6TnpVc01UUXVNRGN4TWpVM01TQk1NU3d4TkM0d056RXlOVGN4SWlCemRISnZhMlU5SW5WeWJDZ2piR2x1WldGeVIzSmhaR2xsYm5RdE1Ta2lQand2Y0dGMGFENEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0E4Y0c5c2VXeHBibVVnYzNSeWIydGxQU0lqUmtaR1JrWkdJaUJ6ZEhKdmEyVXRiR2x1WldwdmFXNDlJbkp2ZFc1a0lpQndiMmx1ZEhNOUlqTXVOemt3TWpJM01EY2dOeTQxTXprMk5qQTJOQ0F3SURNdU56VTROelUzTURrZ015NDNPVEF5TWpjd055QXdJajQ4TDNCdmJIbHNhVzVsUGdvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnUEM5blBnb2dJQ0FnSUNBZ0lDQWdJQ0E4TDJjK0NpQWdJQ0FnSUNBZ1BDOW5QZ29nSUNBZ1BDOW5QZ284TDNOMlp6ND0pO1xuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJTtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG59XG5cbi5fcGFpbnRCcnVzaC1jdHJsaXRlbS0tY2xvc2UgPi5icnVzaC1pY29uIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lQejRLUEhOMlp5QjNhV1IwYUQwaU1qSndlQ0lnYUdWcFoyaDBQU0l5TW5CNElpQjJhV1YzUW05NFBTSXdJREFnTWpJZ01qSWlJSFpsY25OcGIyNDlJakV1TVNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUkrQ2lBZ0lDQThaR1ZtY3o0S0lDQWdJQ0FnSUNBOGJHbHVaV0Z5UjNKaFpHbGxiblFnZURFOUlqVXdMakF5TURZNU15VWlJSGt4UFNJdE1UTXVOek16TXpjMU1TVWlJSGd5UFNJMU1DVWlJSGt5UFNJeE1UUXVNVEV3T1RrMEpTSWdhV1E5SW14cGJtVmhja2R5WVdScFpXNTBMVEVpUGdvZ0lDQWdJQ0FnSUNBZ0lDQThjM1J2Y0NCemRHOXdMV052Ykc5eVBTSWpSa1pHUmtaR0lpQnZabVp6WlhROUlqQWxJajQ4TDNOMGIzQStDaUFnSUNBZ0lDQWdJQ0FnSUR4emRHOXdJSE4wYjNBdFkyOXNiM0k5SWlOR1JrWkdSa1lpSUhOMGIzQXRiM0JoWTJsMGVUMGlNQzQyTURFd05ETTBPRGdpSUc5bVpuTmxkRDBpTkRrdU16QTRORGc0TWlVaVBqd3ZjM1J2Y0Q0S0lDQWdJQ0FnSUNBZ0lDQWdQSE4wYjNBZ2MzUnZjQzFqYjJ4dmNqMGlJMFpHUmtaR1JpSWdiMlptYzJWMFBTSXhNREFsSWo0OEwzTjBiM0ErQ2lBZ0lDQWdJQ0FnUEM5c2FXNWxZWEpIY21Ga2FXVnVkRDRLSUNBZ0lDQWdJQ0E4YkdsdVpXRnlSM0poWkdsbGJuUWdlREU5SWpVd0pTSWdlVEU5SWpBbElpQjRNajBpTlRBbElpQjVNajBpTVRBd0pTSWdhV1E5SW14cGJtVmhja2R5WVdScFpXNTBMVElpUGdvZ0lDQWdJQ0FnSUNBZ0lDQThjM1J2Y0NCemRHOXdMV052Ykc5eVBTSWpSa1pHUmtaR0lpQnZabVp6WlhROUlqQWxJajQ4TDNOMGIzQStDaUFnSUNBZ0lDQWdJQ0FnSUR4emRHOXdJSE4wYjNBdFkyOXNiM0k5SWlOR1JrWkdSa1lpSUc5bVpuTmxkRDBpTlRVdU9UWTRNVFV6TlNVaVBqd3ZjM1J2Y0Q0S0lDQWdJQ0FnSUNBZ0lDQWdQSE4wYjNBZ2MzUnZjQzFqYjJ4dmNqMGlJMFpHUmtaR1JpSWdiMlptYzJWMFBTSXhNREFsSWo0OEwzTjBiM0ErQ2lBZ0lDQWdJQ0FnUEM5c2FXNWxZWEpIY21Ga2FXVnVkRDRLSUNBZ0lEd3ZaR1ZtY3o0S0lDQWdJRHhuSUhOMGNtOXJaVDBpYm05dVpTSWdjM1J5YjJ0bExYZHBaSFJvUFNJeElpQm1hV3hzUFNKdWIyNWxJaUJtYVd4c0xYSjFiR1U5SW1WMlpXNXZaR1FpUGdvZ0lDQWdJQ0FnSUR4blBnb2dJQ0FnSUNBZ0lDQWdJQ0E4Y21WamRDQm1hV3hzUFNJalJEaEVPRVE0SWlCdmNHRmphWFI1UFNJd0lpQjRQU0l3SWlCNVBTSXdJaUIzYVdSMGFEMGlNaklpSUdobGFXZG9kRDBpTWpJaVBqd3ZjbVZqZEQ0S0lDQWdJQ0FnSUNBZ0lDQWdQR2NnZEhKaGJuTm1iM0p0UFNKMGNtRnVjMnhoZEdVb05DNHdNREF3TURBc0lEVXVNREF3TURBd0tTSWdabWxzYkMxeWRXeGxQU0p1YjI1NlpYSnZJajRLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRHhuUGdvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lEeHdZWFJvSUdROUlrMDNMQzB5TGprNE9ERTJOVFk0SUVNM0xqVXhNamd6TlRnMExDMHlMams0T0RFMk5UWTRJRGN1T1RNMU5UQTNNVFlzTFRJdU5qQXlNVEkxTkRrZ055NDVPVE15TnpJeU55d3RNaTR4TURRM09EWTRNU0JNT0N3dE1TNDVPRGd4TmpVMk9DQk1PQ3d4TXk0NU9UZ3hNVFEySUVNNExERTBMalUxTURNNU9UTWdOeTQxTlRJeU9EUTNOU3d4TkM0NU9UZ3hNVFEySURjc01UUXVPVGs0TVRFME5pQkROaTQwT0RjeE5qUXhOaXd4TkM0NU9UZ3hNVFEySURZdU1EWTBORGt5T0RRc01UUXVOakV5TURjME5DQTJMakF3TmpjeU56Y3pMREUwTGpFeE5EY3pOVGNnVERZc01UTXVPVGs0TVRFME5pQk1OaXd0TVM0NU9EZ3hOalUyT0NCRE5pd3RNaTQxTkRBME5UQTBNeUEyTGpRME56Y3hOVEkxTEMweUxqazRPREUyTlRZNElEY3NMVEl1T1RnNE1UWTFOamdnV2lJZ1ptbHNiRDBpZFhKc0tDTnNhVzVsWVhKSGNtRmthV1Z1ZEMweEtTSWdkSEpoYm5ObWIzSnRQU0owY21GdWMyeGhkR1VvTnk0d01EQXdNREFzSURZdU1EQTBPVGMwS1NCeWIzUmhkR1VvTFRRMUxqQXdNREF3TUNrZ2RISmhibk5zWVhSbEtDMDNMakF3TURBd01Dd2dMVFl1TURBME9UYzBLU0FpUGp3dmNHRjBhRDRLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBOGNHRjBhQ0JrUFNKTk55d3RNaTQ1T0RneE5qVTJPQ0JETnk0MU1USTRNelU0TkN3dE1pNDVPRGd4TmpVMk9DQTNMamt6TlRVd056RTJMQzB5TGpZd01qRXlOVFE1SURjdU9Ua3pNamN5TWpjc0xUSXVNVEEwTnpnMk9ERWdURGdzTFRFdU9UZzRNVFkxTmpnZ1REZ3NNVE11T1RrNE1URTBOaUJET0N3eE5DNDFOVEF6T1RreklEY3VOVFV5TWpnME56VXNNVFF1T1RrNE1URTBOaUEzTERFMExqazVPREV4TkRZZ1F6WXVORGczTVRZME1UWXNNVFF1T1RrNE1URTBOaUEyTGpBMk5EUTVNamcwTERFMExqWXhNakEzTkRRZ05pNHdNRFkzTWpjM015d3hOQzR4TVRRM016VTNJRXcyTERFekxqazVPREV4TkRZZ1REWXNMVEV1T1RnNE1UWTFOamdnUXpZc0xUSXVOVFF3TkRVd05ETWdOaTQwTkRjM01UVXlOU3d0TWk0NU9EZ3hOalUyT0NBM0xDMHlMams0T0RFMk5UWTRJRm9pSUdacGJHdzlJblZ5YkNnamJHbHVaV0Z5UjNKaFpHbGxiblF0TWlraUlIUnlZVzV6Wm05eWJUMGlkSEpoYm5Oc1lYUmxLRGN1TURBd01EQXdMQ0EyTGpBd05EazNOQ2tnY205MFlYUmxLQzB4TXpVdU1EQXdNREF3S1NCMGNtRnVjMnhoZEdVb0xUY3VNREF3TURBd0xDQXROaTR3TURRNU56UXBJQ0krUEM5d1lYUm9QZ29nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdQQzluUGdvZ0lDQWdJQ0FnSUNBZ0lDQThMMmMrQ2lBZ0lDQWdJQ0FnUEM5blBnb2dJQ0FnUEM5blBnbzhMM04yWno0PSk7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlO1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbn1cblxuPC9zdHlsZT5cbmBcblxuZXhwb3J0IGRlZmF1bHQgUGFpbnRCcnVzaFN0eWxlXG4iLCJpbXBvcnQge1xuICBxdWV1ZSxcbiAgZXhlY0ludGVydmFsLFxuICB0cmFuc2Zvcm1Db29yZHMsXG4gIHVuVHJhbnNmb3JtQ29vcmRzLFxuICBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50LFxuICBub29wLFxuICB0eXBlIENvb3JkcyxcbiAgbmV4dEZyYW1lLFxufSBmcm9tICcuL3V0aWxzJ1xuXG5pbXBvcnQgdHdlZW4sIHsgdHlwZSBUd2VlblJlcyB9IGZyb20gJy4vdHdlZW4nXG5cbmltcG9ydCB7XG4gIHR5cGUgUGFpbnRCcnVzaEFjdGlvbixcbiAgdHlwZSBQYWludEJydXNoQ29uZmlncyxcbiAgdHlwZSBQYWludEJydXNoRXZlbnRNYXAsXG4gIHR5cGUgUGFpbnRCcnVzaFN0YXRlLFxuICBQYWludEJydXNoVHlwZUVudW0sXG59IGZyb20gJy4vdHlwaW5ncydcblxuaW1wb3J0IHsgU3Vic2NyaWJlIH0gZnJvbSAnLi9TdWJzY3JpYmUnXG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnLi4vLi4vc2hhcmVkLXV0aWxzL3V1aWQnXG5pbXBvcnQgUGFpbnRCcnVzaFN0eWxlIGZyb20gJy4vc3R5bGUnXG5cbmV4cG9ydCBjbGFzcyBDb250cm9sbGVyIGV4dGVuZHMgU3Vic2NyaWJlPFBhaW50QnJ1c2hFdmVudE1hcD4ge1xuICBjb25maWdzOiBQYWludEJydXNoQ29uZmlnc1xuXG4gcHJpdmF0ZSBjbGllbnRXaWR0aDogbnVtYmVyXG4gcHJpdmF0ZSBjbGllbnRIZWlnaHQ6IG51bWJlclxuXG4gcHJpdmF0ZSByZWFkeSA9IGZhbHNlXG5cbiBwcml2YXRlIHV1aWQgPSB1dWlkKClcbiBwcml2YXRlIHR3ZWVuPzogVHdlZW5SZXNcbiBwcml2YXRlIHR3ZWVuaW5nID0gZmFsc2VcblxuIHByaXZhdGUgY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudFxuIHByaXZhdGUgY2FudmFzOiBSZWNvcmQ8c3RyaW5nLCBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZD5cbiBwcml2YXRlIGRhdGE6IFJlY29yZDxzdHJpbmcsIFBhaW50QnJ1c2hTdGF0ZVtdPiA9IHt9XG4gcHJpdmF0ZSB0ZW1wTGluZTogUmVjb3JkPHN0cmluZywgQ29vcmRzW10+ID0ge31cblxuICBnZXQgY29sb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlncy5jdXJyZW50Q29sb3JcbiAgfVxuXG4gIGdldCBzdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhXG4gIH1cblxuICBnZXQgZHByKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3MuRFBSIHx8IDFcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ3M6IFBhaW50QnJ1c2hDb25maWdzKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuY29uZmlncyA9IGNvbmZpZ3NcblxuICAgIHRoaXMuY2xpZW50V2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoXG4gICAgdGhpcy5jbGllbnRIZWlnaHQgPSBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodFxuXG4gICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmlmSW5zZXJ0VG9ET00oKVxuICAgIHRoaXMuY2FudmFzID0ge31cbiAgICB0aGlzLmluaXRDdHJsKClcbiAgfVxuXG4gIGlmSW5zZXJ0VG9ET00oKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXJcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlncy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMuY29uZmlncy5jb250YWluZXIuaWQgPSAnX2dsX3BhaW50QnJ1c2gnXG4gICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuY29uZmlncy5jb250YWluZXJcbiAgICB9IGVsc2UgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX2dsX3BhaW50QnJ1c2gnKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgIGNvbnRhaW5lci5pZCA9ICdfZ2xfcGFpbnRCcnVzaCdcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKVxuICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXJcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX2dsX3BhaW50QnJ1c2gnKSBhcyBIVE1MRGl2RWxlbWVudFxuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVyLmlubmVySFRNTCA9IFBhaW50QnJ1c2hTdHlsZVxuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSDliJ3lp4vljJbnlLvmnb9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGluaXRDYW52YXMoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgIGNhbnZhcy5jbGFzc05hbWUgPSBjbGFzc05hbWVcbiAgICBjYW52YXMud2lkdGggPSB0aGlzLmNsaWVudFdpZHRoXG4gICAgY2FudmFzLmhlaWdodCA9IHRoaXMuY2xpZW50SGVpZ2h0XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICBpZiAoIWN0eCkgcmV0dXJuXG4gICAgY3R4LmxpbmVXaWR0aCA9IDUgKiB0aGlzLmRwclxuICAgIGN0eC5saW5lQ2FwID0gJ3JvdW5kJ1xuICAgIGN0eC5saW5lSm9pbiA9ICdyb3VuZCdcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpXG4gICAgcmV0dXJuIGNhbnZhc1xuICB9XG5cblxuICAvKipcbiAgICog5Yid5aeL5YyW5pON5L2c6Z2i5p2/XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBpbml0Q3RybCgpIHtcbiAgICBjb25zdCBjdHJsOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgY3RybC5jbGFzc05hbWUgPSAnX3BhaW50QnJ1c2gtY3RybCdcbiAgICBjb25zdCBjdHJsX2lubmVyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgY3RybF9pbm5lci5jbGFzc05hbWUgPSAnX3BhaW50QnJ1c2gtY3RybGlubmVyJ1xuXG4gICAgY29uc3QgYV91bmRvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgYV91bmRvLmNsYXNzTmFtZSA9ICdfcGFpbnRCcnVzaC1jdHJsaXRlbSBfcGFpbnRCcnVzaC1jdHJsaXRlbS0tdW5kbydcbiAgICBhX3VuZG8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICAgICAvLyDngrnlh7vmkqTlm57vvJrkvpvln4vngrnkvb/nlKhcbiAgICAgIGlmICh0aGlzLmNvbmZpZ3Mub25DbGlja1VuZG8pIHtcbiAgICAgICAgdGhpcy5jb25maWdzLm9uQ2xpY2tVbmRvKClcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmNhbnZhc1t0aGlzLnV1aWRdIHx8ICF0aGlzLmRhdGFbdGhpcy51dWlkXSB8fCB0aGlzLmRhdGFbdGhpcy51dWlkXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBwb3BTdGF0ZSA9IHRoaXMuZGF0YVt0aGlzLnV1aWRdLnBvcCgpXG5cbiAgICAgIGlmIChwb3BTdGF0ZSkge1xuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSh7XG4gICAgICAgICAgdHlwZTogUGFpbnRCcnVzaFR5cGVFbnVtLlVuZG8sXG4gICAgICAgICAgY29sb3I6IHRoaXMuY29sb3IsXG4gICAgICAgICAgcmVhZHk6IHRoaXMucmVhZHksXG4gICAgICAgICAgc3RhdGU6IHBvcFN0YXRlLFxuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgJGN0eCA9IHRoaXMuY2FudmFzW3RoaXMudXVpZF0/LmdldENvbnRleHQoJzJkJylcbiAgICAgIGlmICghdGhpcy5jYW52YXNbdGhpcy51dWlkXSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5jYW52YXNbdGhpcy51dWlkXSFcbiAgICAgIGlmICgkY3R4KSB7XG4gICAgICAgICRjdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpXG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXS5mb3JFYWNoKChsZDogYW55KSA9PiB0aGlzLmhhbmRsZURyYXdMaW5lKHRoaXMudXVpZCwgbGQsIHsgd2l0aFVuZG86IHRydWUgfSkpXG5cbiAgICB9KVxuICAgIGNvbnN0IGFfY2xvc2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBhX2Nsb3NlLmNsYXNzTmFtZSA9ICdfcGFpbnRCcnVzaC1jdHJsaXRlbSBfcGFpbnRCcnVzaC1jdHJsaXRlbS0tY2xvc2UnXG4gICAgYV9jbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICB0aGlzLmNsb3NlQnJ1c2goKVxuICAgICAgLy8g54K55Ye75YWz6Zet77ya5L6b5Z+L54K55L2/55SoXG4gICAgICBpZiAodGhpcy5jb25maWdzLm9uQ2xpY2tDbG9zZSkge1xuICAgICAgICB0aGlzLmNvbmZpZ3Mub25DbGlja0Nsb3NlKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgJEEgPSBbYV91bmRvLCBhX2Nsb3NlXVxuICAgICRBLmZvckVhY2goKCRhKSA9PiB7XG4gICAgICBjb25zdCAkaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKVxuICAgICAgJGkuY2xhc3NOYW1lID0gJ2JydXNoLWljb24nXG4gICAgICBjb25zdCAkc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxuICAgICAgJHNwYW4uY2xhc3NOYW1lID0gJ2JydXNoLXR4dCdcblxuICAgICAgJHNwYW4uaW5uZXJUZXh0ID0gJGEuY2xhc3NOYW1lLmVuZHNXaXRoKCd1bmRvJykgPyB0aGlzLmNvbmZpZ3Mub25VbmRvVGV4dCA6IHRoaXMuY29uZmlncy5vbkV4aXRUZXh0XG4gICAgICAkYS5hcHBlbmRDaGlsZCgkaSlcbiAgICAgICRhLmFwcGVuZENoaWxkKCRzcGFuKVxuICAgIH0pXG5cbiAgICBjdHJsX2lubmVyLmFwcGVuZENoaWxkKGFfdW5kbylcbiAgICBjdHJsX2lubmVyLmFwcGVuZENoaWxkKGFfY2xvc2UpXG4gICAgY3RybC5hcHBlbmRDaGlsZChjdHJsX2lubmVyKVxuXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoY3RybClcblxuICAgIHJldHVybiBjdHJsXG4gIH1cblxuICBvcGVuQnJ1c2goKSB7XG4gICAgaWYgKHRoaXMucmVhZHkpIHJldHVyblxuICAgIGlmICghdGhpcy5jYW52YXNbdGhpcy51dWlkXSkge1xuICAgICAgdGhpcy5jYW52YXNbdGhpcy51dWlkXSA9IHRoaXMuaW5pdENhbnZhcygnX3BhaW50QnJ1c2gtY2FudmFzJylcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gJ2JydXNoaW5nJ1xuICAgIGNvbnN0ICRjdXJDYW52YXMgPSB0aGlzLmNhbnZhc1t0aGlzLnV1aWRdIVxuXG4gICAgY29uc3QgJGN0eCA9ICRjdXJDYW52YXMuZ2V0Q29udGV4dCgnMmQnKSFcbiAgICAkY3R4LmNsZWFyUmVjdCgwLCAwLCAkY3VyQ2FudmFzLndpZHRoLCAkY3VyQ2FudmFzLmhlaWdodClcbiAgICB0aGlzLm9wZW5CcnVzaEhhbmRsZSgpXG4gICAgdGhpcy5yZWFkeSA9IHRydWVcbiAgICB0aGlzLmVtaXQoJ3JlYWR5Q2hhbmdlJywgdHJ1ZSlcbiAgfVxuXG4gIGNsb3NlQnJ1c2goKSB7XG4gICAgaWYgKCF0aGlzLnJlYWR5KSByZXR1cm5cblxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICcnXG4gICAgdGhpcy5kYXRhID0ge31cbiAgICB0aGlzLnRlbXBMaW5lID0ge31cbiAgICBPYmplY3Qua2V5cyh0aGlzLmNhbnZhcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICB0aGlzLmNhbnZhc1trZXldIS5vbnRvdWNoc3RhcnQgPSAoKSA9PiBmYWxzZVxuICAgICAgdGhpcy5jYW52YXNba2V5XSEub250b3VjaG1vdmUgPSAoKSA9PiBmYWxzZVxuICAgICAgdGhpcy5jYW52YXNba2V5XSEub250b3VjaGVuZCA9ICgpID0+IGZhbHNlXG4gICAgICB0aGlzLmNhbnZhc1trZXldIS5vbnRvdWNoY2FuY2VsID0gKCkgPT4gZmFsc2VcbiAgICAgIGNvbnN0ICRjdHggPSB0aGlzLmNhbnZhc1trZXldIS5nZXRDb250ZXh0KCcyZCcpXG4gICAgICBpZiAoJGN0eCkge1xuICAgICAgICAkY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhc1trZXldIS53aWR0aCwgdGhpcy5jYW52YXNba2V5XSEuaGVpZ2h0KVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5yZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdyZWFkeUNoYW5nZScsIGZhbHNlKVxuXG4gICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2Uoe1xuICAgICAgdHlwZTogUGFpbnRCcnVzaFR5cGVFbnVtLkV4aXQsXG4gICAgICBjb2xvcjogdGhpcy5jb2xvcixcbiAgICAgIHJlYWR5OiBmYWxzZSxcbiAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlQ3VycmVudENvbG9yKGNvbG9yOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50Q2FudmFzID0gdGhpcy5jYW52YXNbdGhpcy51dWlkXVxuICAgIGlmICghY3VycmVudENhbnZhcykgcmV0dXJuXG4gICAgY29uc3QgY3VycmVudEN0eCA9IGN1cnJlbnRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIGlmICghY3VycmVudEN0eCkgcmV0dXJuXG4gICAgdGhpcy5jb25maWdzLmN1cnJlbnRDb2xvciA9IGNvbG9yXG4gICAgY3VycmVudEN0eC5zdHJva2VTdHlsZSA9IGNvbG9yXG5cbiAgfVxuXG4gIG9wZW5CcnVzaEhhbmRsZSgpIHtcbiAgICBjb25zdCBjdXJyZW50Q2FudmFzID0gdGhpcy5jYW52YXNbdGhpcy51dWlkXVxuICAgIGlmICghY3VycmVudENhbnZhcykgcmV0dXJuXG4gICAgY29uc3QgY3VycmVudEN0eCA9IGN1cnJlbnRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIGlmICghY3VycmVudEN0eCkgcmV0dXJuXG5cbiAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3IgfHwgJyM2RDkyRkYnXG5cbiAgICBjdXJyZW50Q3R4LnN0cm9rZVN0eWxlID0gY29sb3JcblxuICAgIGxldCBiZWdpbjogYW55ID0gbnVsbCAvLyDlvIDlp4vngrlcbiAgICBsZXQgcG9pbnRzOiBhbnlbXSA9IFtdIC8vIOWNleasoSB0b3VjaCDngrnkvY3pm4blkIhcbiAgICBsZXQgbW92ZTogQ29vcmRzXG4gICAgbGV0IGxpbmU6IENvb3Jkc1tdID0gW10gLy8g5ZCM5q2lIHRvdWNoIOeCueS9jeaVsOaNrlxuICAgIGxldCBzdGFydFRpbWUgPSAwIC8vIHRvdWNoIOW8gOWni+aXtumXtFxuXG4gICAgLy8g57uY5Yi2XG4gICAgY29uc3QgZHJhdyA9IChiZWdpblBvaW50OiBDb29yZHMsIGNvbnRyb2xQb2ludDogQ29vcmRzLCBlbmRQb2ludDogQ29vcmRzKSA9PiB7XG4gICAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3IgfHwgJyNmZjAwMDAnXG4gICAgICBjdXJyZW50Q3R4LnN0cm9rZVN0eWxlID0gY29sb3JcbiAgICAgIGN1cnJlbnRDdHguYmVnaW5QYXRoKClcbiAgICAgIGN1cnJlbnRDdHgubW92ZVRvKGJlZ2luUG9pbnQueCwgYmVnaW5Qb2ludC55KVxuICAgICAgY3VycmVudEN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgZW5kUG9pbnQueCwgZW5kUG9pbnQueSlcbiAgICAgIGN1cnJlbnRDdHguc3Ryb2tlKClcbiAgICB9XG5cbiAgICAvLyDpvKDmoIfmjInkuItcbiAgICBjdXJyZW50Q2FudmFzLm9ubW91c2Vkb3duID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgY29uc3QgeCA9IGUuY2xpZW50WFxuICAgICAgY29uc3QgeSA9IGUuY2xpZW50WVxuXG4gICAgICBwb2ludHMgPSBbXVxuICAgICAgcG9pbnRzLnB1c2goeyB4LCB5IH0pXG4gICAgICBiZWdpbiA9IHsgeCwgeSB9XG5cbiAgICAgIG1vdmUgPSB0cmFuc2Zvcm1Db29yZHMoeyB4LCB5IH0sIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KVxuICAgICAgbGluZSA9IFtdXG4gICAgfVxuXG4gICAgLy8g6byg5qCH56e75YqoXG4gICAgY3VycmVudENhbnZhcy5vbm1vdXNlbW92ZSA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGlmICghYmVnaW4pIHJldHVyblxuICAgICAgY29uc3QgeCA9IE51bWJlcihlLmNsaWVudFgpXG4gICAgICBjb25zdCB5ID0gTnVtYmVyKGUuY2xpZW50WSlcbiAgICAgIC8vIOWvhumbhueCueS9jeeogOmHilxuICAgICAgaWYgKE1hdGguYWJzKHggLSBiZWdpbi54KSA8IDUgJiYgTWF0aC5hYnMoeSAtIGJlZ2luLnkpIDwgNSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHBvaW50cy5wdXNoKHsgeCwgeSB9KVxuICAgICAgLy8g5q2k5aSE5bqU6K6w5b2V5oqY57q/5ouf5ZCI5LmL5YmN55qE54K5XG4gICAgICBsaW5lLnB1c2godHJhbnNmb3JtQ29vcmRzKHsgeCwgeSB9LCB0aGlzLmNsaWVudFdpZHRoLCB0aGlzLmNsaWVudEhlaWdodCkpXG4gICAgICAvLyDmipjnur/mi5/lkIjkuozmrKHotJ3loZ7lsJTmm7Lnur/oh7PlsJHpnIDopoHkuInkuKrngrlcbiAgICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgY29udHJvbCwgZW5kIH0gPSBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50cylcbiAgICAgIGlmICghY29udHJvbCB8fCAhZW5kKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZHJhdyhiZWdpbiwgY29udHJvbCwgZW5kKVxuICAgICAgYmVnaW4gPSBlbmRcbiAgICB9XG5cbiAgICAvLyDpvKDmoIfmnb7lvIBcbiAgICBjdXJyZW50Q2FudmFzLm9ubW91c2V1cCA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGJlZ2luID0gbnVsbFxuICAgICAgaWYgKHBvaW50cy5sZW5ndGggPCAzKSByZXR1cm5cblxuICAgICAgaWYgKCF0aGlzLmRhdGFbdGhpcy51dWlkXSkge1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXSA9IFtdXG4gICAgICB9XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWVcbiAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICBtb3ZlOiBPYmplY3QuYXNzaWduKHt9LCBtb3ZlKSxcbiAgICAgICAgdXVpZDogdGhpcy51dWlkLFxuICAgICAgICBsaW5lOiBbLi4ubGluZV0sXG4gICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gPCAxMjgwID8gZHVyYXRpb24gOiBkdXJhdGlvbiA8IDIwMDAgPyAxMjgwIDogMCwgLy8g5Y2V5qyh56yU6L+55pe26ZW/6LaF6L+HMjAwMG1z5LiN5Yqg5Yqo55S7XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXS5wdXNoKHN0YXRlKVxuICAgICAgLy8g5bm/5pKt5pWw5o2uXG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSh7XG4gICAgICAgICAgdHlwZTogUGFpbnRCcnVzaFR5cGVFbnVtLkRyYXdsaW5lLFxuICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICAgIHJlYWR5OiB0aGlzLnJlYWR5LFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8g5omL5Yq/5oyJ5Y6LXG4gICAgY3VycmVudENhbnZhcy5vbnRvdWNoc3RhcnQgPSAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICBjb25zdCB4ID0gZS50b3VjaGVzWzBdLmNsaWVudFhcbiAgICAgIGNvbnN0IHkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WVxuXG4gICAgICBwb2ludHMgPSBbXVxuICAgICAgcG9pbnRzLnB1c2goeyB4LCB5IH0pXG4gICAgICBiZWdpbiA9IHsgeCwgeSB9XG5cbiAgICAgIG1vdmUgPSB0cmFuc2Zvcm1Db29yZHMoeyB4LCB5IH0sIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KVxuICAgICAgbGluZSA9IFtdXG4gICAgfVxuXG4gICAgLy8g5omL5Yq/56e75YqoXG4gICAgY3VycmVudENhbnZhcy5vbnRvdWNobW92ZSA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGlmICghYmVnaW4pIHJldHVyblxuICAgICAgY29uc3QgeCA9IE51bWJlcihlLnRvdWNoZXNbMF0uY2xpZW50WClcbiAgICAgIGNvbnN0IHkgPSBOdW1iZXIoZS50b3VjaGVzWzBdLmNsaWVudFkpXG4gICAgICBpZiAoTWF0aC5hYnMoeCAtIGJlZ2luLngpIDwgNSAmJiBNYXRoLmFicyh5IC0gYmVnaW4ueSkgPCA1KSByZXR1cm4gLy8g5a+G6ZuG54K55L2N56iA6YeKXG4gICAgICBwb2ludHMucHVzaCh7IHgsIHkgfSlcbiAgICAgIGxpbmUucHVzaCh0cmFuc2Zvcm1Db29yZHMoeyB4LCB5IH0sIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KSkgLy8g5q2k5aSE5bqU6K6w5b2V5oqY57q/5ouf5ZCI5LmL5YmN55qE54K5XG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybiAvLyDmipjnur/mi5/lkIjkuozmrKHotJ3loZ7lsJTmm7Lnur/oh7PlsJHpnIDopoHkuInkuKrngrlcbiAgICAgIGNvbnN0IHsgY29udHJvbCwgZW5kIH0gPSBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50cylcbiAgICAgIGlmICghY29udHJvbCB8fCAhZW5kKSByZXR1cm5cbiAgICAgIGRyYXcoYmVnaW4sIGNvbnRyb2wsIGVuZClcbiAgICAgIGJlZ2luID0gZW5kXG4gICAgfVxuXG4gICAgLy8g5omL5Yq/5oyJ5Y6L56a75byAXG4gICAgY3VycmVudENhbnZhcy5vbnRvdWNoZW5kID0gY3VycmVudENhbnZhcy5vbnRvdWNoY2FuY2VsID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgYmVnaW4gPSBudWxsXG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVyblxuICAgICAgaWYgKCF0aGlzLmRhdGFbdGhpcy51dWlkXSkge1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXSA9IFtdXG4gICAgICB9XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWVcbiAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICBtb3ZlOiBPYmplY3QuYXNzaWduKHt9LCBtb3ZlKSxcbiAgICAgICAgbGluZTogWy4uLmxpbmVdLFxuICAgICAgICB1dWlkOiB0aGlzLnV1aWQsXG4gICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gPCAxMjgwID8gZHVyYXRpb24gOiBkdXJhdGlvbiA8IDIwMDAgPyAxMjgwIDogMCwgLy8g5Y2V5qyh56yU6L+55pe26ZW/6LaF6L+HMjAwMG1z5LiN5Yqg5Yqo55S7XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXS5wdXNoKHN0YXRlKVxuICAgICAgLy8g5bm/5pKt5pWw5o2uXG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSh7XG4gICAgICAgICAgdHlwZTogUGFpbnRCcnVzaFR5cGVFbnVtLkRyYXdsaW5lLFxuICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICAgIHJlYWR5OiB0aGlzLnJlYWR5LFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZW1pdFN0YXRlQ2hhbmdlKGFjdGlvbjogUGFpbnRCcnVzaEFjdGlvbiwgdXNlckFjdGlvbjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgIT09IFBhaW50QnJ1c2hUeXBlRW51bS5EcmF3bGluZSkge1xuICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZScsIGFjdGlvbiwgdXNlckFjdGlvbilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KClcbiAgICBjb25zdCBzdGF0ZSA9IGFjdGlvbi5zdGF0ZVxuICAgIGlmICghc3RhdGUpIHJldHVyblxuICAgIGlmICghc3RhdGUubGluZSkgcmV0dXJuXG4gICAgY29uc3Qgc2xpY2VDb3VudCA9IE1hdGguY2VpbChzdGF0ZS5saW5lLmxlbmd0aCAvIDEwMClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpY2VDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBsb2NhbGl0eUFjdGlvbjogUGFpbnRCcnVzaEFjdGlvbiA9IHtcbiAgICAgICAgdXVpZDogdGhpcy51dWlkLFxuICAgICAgICBjb2xvcjogdGhpcy5jb2xvcixcbiAgICAgICAgcmVhZHk6IHRoaXMucmVhZHksXG4gICAgICAgIHR5cGU6IGFjdGlvbi50eXBlLFxuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgICBtb3ZlOiBzdGF0ZS5tb3ZlLFxuICAgICAgICAgIGR1cmF0aW9uOiBzdGF0ZS5kdXJhdGlvbixcbiAgICAgICAgICBjb2xvcjogdGhpcy5jb2xvcixcbiAgICAgICAgICBsaW5lOiBzdGF0ZS5saW5lLnNsaWNlKGkgKiAxMDAsIChpICsgMSkgKiAxMDApLFxuICAgICAgICB9LFxuICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgIGVuZDogaSA9PT0gc2xpY2VDb3VudCAtIDEsXG4gICAgICB9XG4gICAgICAvKiog55Sx5LqO5Y2V5qyhIHdzIOS8oOi+k+aVsOaNrumHj+i/h+Wkp++8jOS8muWvvOiHtCB3cyDmlq3mjonvvIzmiYDku6XliIbmibnkvKDmlbDmja4gKi9cbiAgICAgIGV4ZWNJbnRlcnZhbChpLCAyMCwgKCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoJ3N0YXRlQ2hhbmdlJywgbG9jYWxpdHlBY3Rpb24sIHVzZXJBY3Rpb24pXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGFjdGlvbihhY3Rpb246IFBhaW50QnJ1c2hBY3Rpb24pIHtcbiAgICBjb25zdCB7IHJlYWR5LCB0eXBlLCB1dWlkIH0gPSBhY3Rpb25cblxuICAgIGlmICghcmVhZHkgJiYgdGhpcy5yZWFkeSkge1xuICAgICAgLy8g5YWz6Zet6Z2i5p2/XG4gICAgICB0aGlzLmNsb3NlQnJ1c2goKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChyZWFkeSAmJiAhdGhpcy5yZWFkeSkge1xuICAgICAgLy8g5byA5ZCv6Z2i5p2/77ya6aaW5qyh5omT5byA55S756yU5LiN5ZCM5q2l5LiK5LiA5qyh55qE55S757q/XG4gICAgICB0aGlzLm9wZW5CcnVzaCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucmVhZHkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBQYWludEJydXNoVHlwZUVudW0uRHJhd2xpbmU6XG4gICAgICAgIGNvbnN0IHsgc3RhdGUsIHRpbWVzdGFtcCwgZW5kIH0gPSBhY3Rpb25cbiAgICAgICAgaWYgKCF0aW1lc3RhbXApIHJldHVyblxuICAgICAgICBpZiAoIXN0YXRlKSByZXR1cm5cbiAgICAgICAgdGhpcy50ZW1wTGluZVt0aW1lc3RhbXBdID0gKFtdIGFzIENvb3Jkc1tdKS5jb25jYXQodGhpcy50ZW1wTGluZVt0aW1lc3RhbXBdIHx8IFtdLCBzdGF0ZS5saW5lKVxuICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwgeyBsaW5lOiB0aGlzLnRlbXBMaW5lW3RpbWVzdGFtcF0gfSlcbiAgICAgICAgICB0aGlzLmhhbmRsZURyYXdMaW5lKHV1aWQsIHN0YXRlLCB7fSwgKCkgPT4gZGVsZXRlIHRoaXMudGVtcExpbmVbdGltZXN0YW1wXSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBQYWludEJydXNoVHlwZUVudW0uVW5kbzpcbiAgICAgICAgdGhpcy5oYW5kbGVVbmRvKHV1aWQpXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG5cbiAgaGFuZGxlRHJhd0xpbmUoX3V1aWQ6IHN0cmluZywgZGF0YTogUGFpbnRCcnVzaFN0YXRlLCB7IHdpdGhVbmRvID0gZmFsc2UgfSwgY2FsbGJhY2sgPSBub29wKSB7XG4gICAgaWYgKCFkYXRhIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSAhPSAnW29iamVjdCBPYmplY3RdJyB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHF1ZXVlKCgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBpZiAoIXdpdGhVbmRvKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNhbnZhc1tfdXVpZF0pIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzW191dWlkXSA9IHRoaXMuaW5pdENhbnZhcygnX3BhaW50QnJ1c2gtY2FudmFzLS1zeW5jJylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGFbX3V1aWRdKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFbX3V1aWRdID0gW11cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kYXRhW191dWlkXS5wdXNoKGRhdGEpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuY2FudmFzW191dWlkXSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0ICRjdHggPSB0aGlzLmNhbnZhc1tfdXVpZF0hLmdldENvbnRleHQoJzJkJylcblxuICAgICAgICBpZiAoISRjdHgpIHJldHVyblxuICAgICAgICBjb25zdCB7IGxpbmUgPSBbXSwgY29sb3IgPSAnYmxhY2snLCBkdXJhdGlvbiA9IDAsIHV1aWQgfSA9IGRhdGFcbiAgICAgICAgY29uc3QgbW92ZSA9IHVuVHJhbnNmb3JtQ29vcmRzKGRhdGEubW92ZSB8fCB7fSBhcyBDb29yZHMsIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KVxuXG4gICAgICAgIGxldCBwb2ludHMgPSBbbW92ZV1cblxuICAgICAgICAkY3R4LnN0cm9rZVN0eWxlID0gY29sb3JcblxuICAgICAgICAkY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICRjdHgubW92ZVRvKG1vdmUueCwgbW92ZS55KVxuXG4gICAgICAgIGlmIChkdXJhdGlvbiAmJiAhd2l0aFVuZG8pIHtcbiAgICAgICAgICBsZXQgZHJhd0NhY2hlOiBhbnlbXSA9IFtdXG4gICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICAgICAgICBzZWxmLnR3ZWVuID0gdHdlZW4oeyBzdGVwOiAwIH0sIHsgc3RlcDogbGluZS5sZW5ndGggLSAxIH0sIGR1cmF0aW9uKVxuICAgICAgICAgICAgLm9uVXBkYXRlKCh7IHN0ZXAgfSkgPT4ge1xuICAgICAgICAgICAgICBzZWxmLnR3ZWVuaW5nID0gdHJ1ZVxuICAgICAgICAgICAgICBpZiAoIXNlbGYucmVhZHkpIHtcbiAgICAgICAgICAgICAgICAkY3R4LmNsZWFyUmVjdCgwLCAwLCBzZWxmLmNhbnZhc1t1dWlkXSEud2lkdGgsIHNlbGYuY2FudmFzW3V1aWRdIS5oZWlnaHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudHdlZW4/LnN0b3AoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKHN0ZXApXG4gICAgICAgICAgICAgIGlmICghZHJhd0NhY2hlLmZpbmQoKGRjKSA9PiBkYyA9PT0gaSkpIHtcbiAgICAgICAgICAgICAgICBkcmF3Q2FjaGUucHVzaChpKVxuICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKHVuVHJhbnNmb3JtQ29vcmRzKGxpbmVbaV0sIHNlbGYuY2xpZW50V2lkdGgsIHNlbGYuY2xpZW50SGVpZ2h0KSlcbiAgICAgICAgICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVyblxuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29udHJvbCwgZW5kIH0gPSBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50cylcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wgfHwgIWVuZCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgJGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2wueCwgY29udHJvbC55LCBlbmQueCwgZW5kLnkpXG4gICAgICAgICAgICAgICAgJGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uQ29tcGxldGUoKGUpID0+IHtcbiAgICAgICAgICAgICAgc2VsZi50d2VlbiA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICBzZWxmLnR3ZWVuaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgZHJhd0NhY2hlID0gW11cbiAgICAgICAgICAgICAgcG9pbnRzID0gW11cbiAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpXG4gICAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHVuVHJhbnNmb3JtQ29vcmRzKGxpbmVbaV0sIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KSlcbiAgICAgICAgICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMykgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IHsgY29udHJvbCwgZW5kIH0gPSBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50cylcbiAgICAgICAgICAgIGlmICghY29udHJvbCB8fCAhZW5kKSBjb250aW51ZVxuICAgICAgICAgICAgJGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2wueCwgY29udHJvbC55LCBlbmQueCwgZW5kLnkpXG4gICAgICAgICAgfVxuICAgICAgICAgICRjdHguc3Ryb2tlKClcbiAgICAgICAgICBwb2ludHMgPSBbXVxuICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKVxuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBoYW5kbGVVbmRvKHV1aWQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5jYW52YXNbdXVpZF0gfHwgIXRoaXMuZGF0YVt1dWlkXSB8fCB0aGlzLmRhdGFbdXVpZF0ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5kYXRhW3V1aWRdLnBvcCgpXG5cbiAgICBjb25zdCBoYW5kbGUgPSAoKSA9PiB7XG4gICAgICBjb25zdCAkY3R4ID0gdGhpcy5jYW52YXNbdXVpZF0/LmdldENvbnRleHQoJzJkJylcbiAgICAgIGlmICgkY3R4KSB7XG4gICAgICAgICRjdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzW3V1aWRdIS53aWR0aCwgdGhpcy5jYW52YXNbdXVpZF0hLmhlaWdodClcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVt1dWlkXS5mb3JFYWNoKChsZDogYW55KSA9PiB0aGlzLmhhbmRsZURyYXdMaW5lKHV1aWQsIGxkLCB7IHdpdGhVbmRvOiB0cnVlIH0pKVxuICAgIH1cbiAgICBpZiAodGhpcy50d2VlbiAmJiB0aGlzLnR3ZWVuaW5nKSB7XG4gICAgICB0aGlzLnR3ZWVuLnN0b3AoKVxuICAgICAgbmV4dEZyYW1lKGhhbmRsZSwgNjApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaGFuZGxlKClcbiAgfVxuXG4gIGRlc3Ryb3lCcnVzaCgpIHtcbiAgICB0aGlzLmNsb3NlQnJ1c2goKVxuICAgIHRoaXMucmVhZHkgPSBmYWxzZVxuICAgIHRoaXMuZW1pdCgncmVhZHlDaGFuZ2UnLCB0cnVlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDb250cm9sbGVyIH0gZnJvbSAnLi9Db250cm9sbGVyJ1xuaW1wb3J0IHR5cGUgeyBQYWludEJydXNoQWN0aW9uLCBQYWludEJydXNoQ29uZmlncywgUGFpbnRCcnVzaEV2ZW50TWFwLCBQYWludEJydXNoU3RhdGUgfSBmcm9tICcuL3R5cGluZ3MnXG5cbmV4cG9ydCBjbGFzcyBQYWludEJydXNoIHtcblxuICBwcml2YXRlIGNvbnRyb2xsZXI6IENvbnRyb2xsZXJcblxuICBjb25zdHJ1Y3Rvcihjb25maWdzOiBQYXJ0aWFsPFBhaW50QnJ1c2hDb25maWdzPiA9IHt9KSB7XG4gICAgY29uc3QgX2NvbmZpZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGN1cnJlbnRDb2xvcjogJyNmNDQzMzYnLFxuICAgICAgb25VbmRvVGV4dDogJ+WbnumAgCcsXG4gICAgICBvbkV4aXRUZXh0OiAn5YWz6ZetJ1xuICAgIH0sIGNvbmZpZ3MpXG5cbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcihfY29uZmlncylcbiAgfVxuXG4gIG9uPEsgZXh0ZW5kcyBrZXlvZiBQYWludEJydXNoRXZlbnRNYXA+KG5hbWU6IEssXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFBhaW50QnJ1c2hFdmVudE1hcFtLXT4pID0+IFJldHVyblR5cGU8UGFpbnRCcnVzaEV2ZW50TWFwW0tdPilcbiAge1xuICAgIHRoaXMuY29udHJvbGxlci5vbihuYW1lLCBjYWxsYmFjaylcbiAgfVxuXG4gIG9mZjxLIGV4dGVuZHMga2V5b2YgUGFpbnRCcnVzaEV2ZW50TWFwPihuYW1lOiBLLFxuICAgIGNhbGxiYWNrOiAoLi4uYXJnczogUGFyYW1ldGVyczxQYWludEJydXNoRXZlbnRNYXBbS10+KSA9PiBSZXR1cm5UeXBlPFBhaW50QnJ1c2hFdmVudE1hcFtLXT4pXG4gIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIub2ZmKG5hbWUsIGNhbGxiYWNrKVxuICB9XG5cblxuICBvbmNlPEsgZXh0ZW5kcyBrZXlvZiBQYWludEJydXNoRXZlbnRNYXA+KG5hbWU6IEssXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFBhaW50QnJ1c2hFdmVudE1hcFtLXT4pID0+IFJldHVyblR5cGU8UGFpbnRCcnVzaEV2ZW50TWFwW0tdPilcbiAge1xuICAgIHRoaXMuY29udHJvbGxlci5vbmNlKG5hbWUsIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIOaYvuekuueUu+eslOOAglxuICAgKi9cbiAgc2hvdygpIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIub3BlbkJydXNoKClcbiAgfVxuXG4gIGFjdGlvbihhY3Rpb246IFBhaW50QnJ1c2hBY3Rpb24pIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuYWN0aW9uKGFjdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnlLvnrJTnirbmgIHjgIJcbiAgICovXG4gIGdldCBzdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLnN0YXRlXG4gIH1cblxuICBnZXQgY29uZmlncygpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmNvbmZpZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiDplIDmr4HjgIJcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uIOeUu+eslOW6lOivpee7tOaKpOS4gOS4qiAqKuWFqOWxgOWNleS+iyoq77yM6YeN5aSN5Yip55So44CCXG4gICAqL1xuICBkaXNwb3NlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZGVzdHJveUJydXNoKClcbiAgfVxuXG4gIHNldEN1cnJlbnRDb2xvcihjb2xvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5jb250cm9sbGVyLnVwZGF0ZUN1cnJlbnRDb2xvcihjb2xvcilcbiAgfVxufVxuIl0sIm5hbWVzIjpbIkdyb3VwIiwidHdlZW4iLCJTZXF1ZW5jZSIsIlR3ZWVuIiwiUGFpbnRCcnVzaFR5cGVFbnVtIiwiY29sb3IiLCJzdGF0ZSIsInV1aWQiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLFNBQVMsT0FBTztBQUFFO0FBQ3pCLE1BQU0sVUFBVSxNQUFNLFFBQVE7QUFFOUIsTUFBTSxRQUFRO0FBQUEsRUFDWixTQUFTLFFBQVEsUUFBUTtBQUMzQjtBQU9nQixTQUFBLE1BQU0sa0JBQWtCLFNBQVM7QUFDL0MsUUFBTSxVQUFVLE1BQU0sUUFBUSxLQUFLLGVBQWUsRUFBRSxNQUFNLE9BQU87QUFDbkU7QUFFZ0IsU0FBQSxnQkFBZ0IsUUFBZ0IsSUFBWSxJQUFZO0FBQ3RFLFFBQU0sS0FBYSxPQUFPO0FBQzFCLFFBQU0sS0FBYSxPQUFPO0FBQzFCLFFBQU0sSUFBSSxLQUFLLE1BQU8sS0FBSyxLQUFNLEdBQUssSUFBSTtBQUMxQyxRQUFNLElBQUksS0FBSyxNQUFPLEtBQUssS0FBTSxHQUFLLElBQUk7QUFDbkMsU0FBQSxFQUFFLEdBQUc7QUFDZDtBQUVnQixTQUFBLGtCQUFrQixRQUFnQixJQUFZLElBQVk7QUFDeEUsUUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLE9BQU87QUFDekIsUUFBTSxJQUFJLEtBQUs7QUFDZixRQUFNLElBQUksS0FBSztBQUNSLFNBQUEsRUFBRSxHQUFHO0FBQ2Q7QUFFTyxTQUFTLHVCQUF1QixRQUFrQjtBQUN2RCxNQUFJLE9BQU8sU0FBUztBQUFHLFdBQU87QUFDeEIsUUFBQSxVQUFVLE9BQU8sTUFBTSxFQUFFO0FBQ3pCLFFBQUEsVUFBVSxRQUFRLENBQUM7QUFDekIsUUFBTSxNQUFNO0FBQUEsSUFDVixJQUFJLFFBQVEsQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDLEVBQUUsS0FBSztBQUFBLElBQ25DLElBQUksUUFBUSxDQUFDLEVBQUUsSUFB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