@aibee/owlly 1.0.25

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 (500) hide show
  1. package/README.external.md +75 -0
  2. package/README.md +28 -0
  3. package/lib/src/external/lines/line-geometry.d.ts +9 -0
  4. package/lib/src/external/lines/line-geometry.js +52 -0
  5. package/lib/src/external/lines/line-geometry.js.map +1 -0
  6. package/lib/src/external/lines/line-material.d.ts +10 -0
  7. package/lib/src/external/lines/line-material.js +377 -0
  8. package/lib/src/external/lines/line-material.js.map +1 -0
  9. package/lib/src/external/lines/line-segments-2.d.ts +7 -0
  10. package/lib/src/external/lines/line-segments-2.js +144 -0
  11. package/lib/src/external/lines/line-segments-2.js.map +1 -0
  12. package/lib/src/external/lines/line-segments-geometry.d.ts +15 -0
  13. package/lib/src/external/lines/line-segments-geometry.js +141 -0
  14. package/lib/src/external/lines/line-segments-geometry.js.map +1 -0
  15. package/lib/src/external/loaders/gltf-loader.d.ts +77 -0
  16. package/lib/src/external/loaders/gltf-loader.js +2319 -0
  17. package/lib/src/external/loaders/gltf-loader.js.map +1 -0
  18. package/lib/src/external/orbit-controls.d.ts +44 -0
  19. package/lib/src/external/orbit-controls.js +746 -0
  20. package/lib/src/external/orbit-controls.js.map +1 -0
  21. package/lib/src/external/renderers/css-2d-renderer.d.ts +16 -0
  22. package/lib/src/external/renderers/css-2d-renderer.js +122 -0
  23. package/lib/src/external/renderers/css-2d-renderer.js.map +1 -0
  24. package/lib/src/external/renderers/css-3d-renderer.d.ts +18 -0
  25. package/lib/src/external/renderers/css-3d-renderer.js +139 -0
  26. package/lib/src/external/renderers/css-3d-renderer.js.map +1 -0
  27. package/lib/src/external/transform-controls.d.ts +106 -0
  28. package/lib/src/external/transform-controls.js +1113 -0
  29. package/lib/src/external/transform-controls.js.map +1 -0
  30. package/lib/src/external/util/buffer-geometry-utils.d.ts +45 -0
  31. package/lib/src/external/util/buffer-geometry-utils.js +569 -0
  32. package/lib/src/external/util/buffer-geometry-utils.js.map +1 -0
  33. package/lib/src/owlly/controller/aerial-element-controller.d.ts +65 -0
  34. package/lib/src/owlly/controller/aerial-element-controller.js +236 -0
  35. package/lib/src/owlly/controller/aerial-element-controller.js.map +1 -0
  36. package/lib/src/owlly/controller/basic-controller.d.ts +324 -0
  37. package/lib/src/owlly/controller/basic-controller.js +1239 -0
  38. package/lib/src/owlly/controller/basic-controller.js.map +1 -0
  39. package/lib/src/owlly/controller/camera-controller.d.ts +37 -0
  40. package/lib/src/owlly/controller/camera-controller.js +138 -0
  41. package/lib/src/owlly/controller/camera-controller.js.map +1 -0
  42. package/lib/src/owlly/controller/controller.d.ts +61 -0
  43. package/lib/src/owlly/controller/controller.js +24 -0
  44. package/lib/src/owlly/controller/controller.js.map +1 -0
  45. package/lib/src/owlly/controller/index.d.ts +2 -0
  46. package/lib/src/owlly/controller/index.js +14 -0
  47. package/lib/src/owlly/controller/index.js.map +1 -0
  48. package/lib/src/owlly/controller/mouse-indicator-controller.d.ts +34 -0
  49. package/lib/src/owlly/controller/mouse-indicator-controller.js +119 -0
  50. package/lib/src/owlly/controller/mouse-indicator-controller.js.map +1 -0
  51. package/lib/src/owlly/controller/orbit-control.d.ts +147 -0
  52. package/lib/src/owlly/controller/orbit-control.js +265 -0
  53. package/lib/src/owlly/controller/orbit-control.js.map +1 -0
  54. package/lib/src/owlly/controller/panorama-adjust-controller.d.ts +45 -0
  55. package/lib/src/owlly/controller/panorama-adjust-controller.js +158 -0
  56. package/lib/src/owlly/controller/panorama-adjust-controller.js.map +1 -0
  57. package/lib/src/owlly/controller/panorama-controller.d.ts +441 -0
  58. package/lib/src/owlly/controller/panorama-controller.js +1944 -0
  59. package/lib/src/owlly/controller/panorama-controller.js.map +1 -0
  60. package/lib/src/owlly/controller/panorama-transform-controller.d.ts +66 -0
  61. package/lib/src/owlly/controller/panorama-transform-controller.js +137 -0
  62. package/lib/src/owlly/controller/panorama-transform-controller.js.map +1 -0
  63. package/lib/src/owlly/controller/plane-controller.d.ts +43 -0
  64. package/lib/src/owlly/controller/plane-controller.js +174 -0
  65. package/lib/src/owlly/controller/plane-controller.js.map +1 -0
  66. package/lib/src/owlly/controller/texture-controller.d.ts +181 -0
  67. package/lib/src/owlly/controller/texture-controller.js +876 -0
  68. package/lib/src/owlly/controller/texture-controller.js.map +1 -0
  69. package/lib/src/owlly/controller/tile-panorama-controller.d.ts +308 -0
  70. package/lib/src/owlly/controller/tile-panorama-controller.js +1354 -0
  71. package/lib/src/owlly/controller/tile-panorama-controller.js.map +1 -0
  72. package/lib/src/owlly/controller/transform-controller.d.ts +106 -0
  73. package/lib/src/owlly/controller/transform-controller.js +546 -0
  74. package/lib/src/owlly/controller/transform-controller.js.map +1 -0
  75. package/lib/src/owlly/element/bottom-nav-element.d.ts +65 -0
  76. package/lib/src/owlly/element/bottom-nav-element.js +258 -0
  77. package/lib/src/owlly/element/bottom-nav-element.js.map +1 -0
  78. package/lib/src/owlly/element/camera.d.ts +82 -0
  79. package/lib/src/owlly/element/camera.js +284 -0
  80. package/lib/src/owlly/element/camera.js.map +1 -0
  81. package/lib/src/owlly/element/dom-2d-element.d.ts +35 -0
  82. package/lib/src/owlly/element/dom-2d-element.js +49 -0
  83. package/lib/src/owlly/element/dom-2d-element.js.map +1 -0
  84. package/lib/src/owlly/element/dom-3d-element.d.ts +27 -0
  85. package/lib/src/owlly/element/dom-3d-element.js +34 -0
  86. package/lib/src/owlly/element/dom-3d-element.js.map +1 -0
  87. package/lib/src/owlly/element/dom-label-2d.d.ts +116 -0
  88. package/lib/src/owlly/element/dom-label-2d.js +383 -0
  89. package/lib/src/owlly/element/dom-label-2d.js.map +1 -0
  90. package/lib/src/owlly/element/element.d.ts +53 -0
  91. package/lib/src/owlly/element/element.js +76 -0
  92. package/lib/src/owlly/element/element.js.map +1 -0
  93. package/lib/src/owlly/element/floor-model.d.ts +83 -0
  94. package/lib/src/owlly/element/floor-model.js +228 -0
  95. package/lib/src/owlly/element/floor-model.js.map +1 -0
  96. package/lib/src/owlly/element/gif-kit/Gif.d.ts +96 -0
  97. package/lib/src/owlly/element/gif-kit/Gif.js +433 -0
  98. package/lib/src/owlly/element/gif-kit/Gif.js.map +1 -0
  99. package/lib/src/owlly/element/gif-kit/GifColor.d.ts +21 -0
  100. package/lib/src/owlly/element/gif-kit/GifColor.js +38 -0
  101. package/lib/src/owlly/element/gif-kit/GifColor.js.map +1 -0
  102. package/lib/src/owlly/element/gif-kit/GifCompressedCodesToByteArrayConverter.d.ts +20 -0
  103. package/lib/src/owlly/element/gif-kit/GifCompressedCodesToByteArrayConverter.js +51 -0
  104. package/lib/src/owlly/element/gif-kit/GifCompressedCodesToByteArrayConverter.js.map +1 -0
  105. package/lib/src/owlly/element/gif-kit/GifFrame.d.ts +31 -0
  106. package/lib/src/owlly/element/gif-kit/GifFrame.js +97 -0
  107. package/lib/src/owlly/element/gif-kit/GifFrame.js.map +1 -0
  108. package/lib/src/owlly/element/gif-kit/GifImage.d.ts +23 -0
  109. package/lib/src/owlly/element/gif-kit/GifImage.js +8 -0
  110. package/lib/src/owlly/element/gif-kit/GifImage.js.map +1 -0
  111. package/lib/src/owlly/element/gif-kit/GifParser.d.ts +17 -0
  112. package/lib/src/owlly/element/gif-kit/GifParser.js +197 -0
  113. package/lib/src/owlly/element/gif-kit/GifParser.js.map +1 -0
  114. package/lib/src/owlly/element/gif-kit/GifPresenter.d.ts +20 -0
  115. package/lib/src/owlly/element/gif-kit/GifPresenter.js +44 -0
  116. package/lib/src/owlly/element/gif-kit/GifPresenter.js.map +1 -0
  117. package/lib/src/owlly/element/gif-kit/GifVersion.d.ts +10 -0
  118. package/lib/src/owlly/element/gif-kit/GifVersion.js +13 -0
  119. package/lib/src/owlly/element/gif-kit/GifVersion.js.map +1 -0
  120. package/lib/src/owlly/element/gltf-mesh-element.d.ts +31 -0
  121. package/lib/src/owlly/element/gltf-mesh-element.js +137 -0
  122. package/lib/src/owlly/element/gltf-mesh-element.js.map +1 -0
  123. package/lib/src/owlly/element/index.d.ts +20 -0
  124. package/lib/src/owlly/element/index.js +25 -0
  125. package/lib/src/owlly/element/index.js.map +1 -0
  126. package/lib/src/owlly/element/map-kit/area.d.ts +24 -0
  127. package/lib/src/owlly/element/map-kit/area.js +218 -0
  128. package/lib/src/owlly/element/map-kit/area.js.map +1 -0
  129. package/lib/src/owlly/element/map-kit/block-set.d.ts +39 -0
  130. package/lib/src/owlly/element/map-kit/block-set.js +91 -0
  131. package/lib/src/owlly/element/map-kit/block-set.js.map +1 -0
  132. package/lib/src/owlly/element/map-kit/block.d.ts +77 -0
  133. package/lib/src/owlly/element/map-kit/block.js +339 -0
  134. package/lib/src/owlly/element/map-kit/block.js.map +1 -0
  135. package/lib/src/owlly/element/map-kit/index.d.ts +4 -0
  136. package/lib/src/owlly/element/map-kit/index.js +7 -0
  137. package/lib/src/owlly/element/map-kit/index.js.map +1 -0
  138. package/lib/src/owlly/element/map-kit/shape.d.ts +131 -0
  139. package/lib/src/owlly/element/map-kit/shape.js +190 -0
  140. package/lib/src/owlly/element/map-kit/shape.js.map +1 -0
  141. package/lib/src/owlly/element/mesh-element.d.ts +22 -0
  142. package/lib/src/owlly/element/mesh-element.js +64 -0
  143. package/lib/src/owlly/element/mesh-element.js.map +1 -0
  144. package/lib/src/owlly/element/mesh-line-2d.d.ts +82 -0
  145. package/lib/src/owlly/element/mesh-line-2d.js +888 -0
  146. package/lib/src/owlly/element/mesh-line-2d.js.map +1 -0
  147. package/lib/src/owlly/element/meshline-o.d.ts +64 -0
  148. package/lib/src/owlly/element/meshline-o.js +679 -0
  149. package/lib/src/owlly/element/meshline-o.js.map +1 -0
  150. package/lib/src/owlly/element/panorama-group.d.ts +241 -0
  151. package/lib/src/owlly/element/panorama-group.js +967 -0
  152. package/lib/src/owlly/element/panorama-group.js.map +1 -0
  153. package/lib/src/owlly/element/panorama.d.ts +132 -0
  154. package/lib/src/owlly/element/panorama.js +813 -0
  155. package/lib/src/owlly/element/panorama.js.map +1 -0
  156. package/lib/src/owlly/element/path-group.d.ts +69 -0
  157. package/lib/src/owlly/element/path-group.js +172 -0
  158. package/lib/src/owlly/element/path-group.js.map +1 -0
  159. package/lib/src/owlly/element/path.d.ts +99 -0
  160. package/lib/src/owlly/element/path.js +532 -0
  161. package/lib/src/owlly/element/path.js.map +1 -0
  162. package/lib/src/owlly/element/placeable-2d.d.ts +158 -0
  163. package/lib/src/owlly/element/placeable-2d.js +471 -0
  164. package/lib/src/owlly/element/placeable-2d.js.map +1 -0
  165. package/lib/src/owlly/element/polygon-mesh.d.ts +107 -0
  166. package/lib/src/owlly/element/polygon-mesh.js +308 -0
  167. package/lib/src/owlly/element/polygon-mesh.js.map +1 -0
  168. package/lib/src/owlly/element/ring-element.d.ts +79 -0
  169. package/lib/src/owlly/element/ring-element.js +384 -0
  170. package/lib/src/owlly/element/ring-element.js.map +1 -0
  171. package/lib/src/owlly/element/sphere-mesh.d.ts +28 -0
  172. package/lib/src/owlly/element/sphere-mesh.js +70 -0
  173. package/lib/src/owlly/element/sphere-mesh.js.map +1 -0
  174. package/lib/src/owlly/element/svg-floor-model.d.ts +22 -0
  175. package/lib/src/owlly/element/svg-floor-model.js +185 -0
  176. package/lib/src/owlly/element/svg-floor-model.js.map +1 -0
  177. package/lib/src/owlly/element/svg-floors.d.ts +27 -0
  178. package/lib/src/owlly/element/svg-floors.js +110 -0
  179. package/lib/src/owlly/element/svg-floors.js.map +1 -0
  180. package/lib/src/owlly/element/tile-panorama-group.d.ts +335 -0
  181. package/lib/src/owlly/element/tile-panorama-group.js +1007 -0
  182. package/lib/src/owlly/element/tile-panorama-group.js.map +1 -0
  183. package/lib/src/owlly/element/tile-panorama.d.ts +161 -0
  184. package/lib/src/owlly/element/tile-panorama.js +511 -0
  185. package/lib/src/owlly/element/tile-panorama.js.map +1 -0
  186. package/lib/src/owlly/element/tile-plane.d.ts +105 -0
  187. package/lib/src/owlly/element/tile-plane.js +361 -0
  188. package/lib/src/owlly/element/tile-plane.js.map +1 -0
  189. package/lib/src/owlly/element/video-element.d.ts +33 -0
  190. package/lib/src/owlly/element/video-element.js +160 -0
  191. package/lib/src/owlly/element/video-element.js.map +1 -0
  192. package/lib/src/owlly/geometries/ExtrudeGeometry2.d.ts +15 -0
  193. package/lib/src/owlly/geometries/ExtrudeGeometry2.js +211 -0
  194. package/lib/src/owlly/geometries/ExtrudeGeometry2.js.map +1 -0
  195. package/lib/src/owlly/index.d.ts +13 -0
  196. package/lib/src/owlly/index.js +17 -0
  197. package/lib/src/owlly/index.js.map +1 -0
  198. package/lib/src/owlly/overlay/canvas-overlay.d.ts +96 -0
  199. package/lib/src/owlly/overlay/canvas-overlay.js +511 -0
  200. package/lib/src/owlly/overlay/canvas-overlay.js.map +1 -0
  201. package/lib/src/owlly/overlay/css-2d-overlay.d.ts +14 -0
  202. package/lib/src/owlly/overlay/css-2d-overlay.js +36 -0
  203. package/lib/src/owlly/overlay/css-2d-overlay.js.map +1 -0
  204. package/lib/src/owlly/overlay/css-3d-overlay.d.ts +16 -0
  205. package/lib/src/owlly/overlay/css-3d-overlay.js +37 -0
  206. package/lib/src/owlly/overlay/css-3d-overlay.js.map +1 -0
  207. package/lib/src/owlly/overlay/index.d.ts +6 -0
  208. package/lib/src/owlly/overlay/index.js +12 -0
  209. package/lib/src/owlly/overlay/index.js.map +1 -0
  210. package/lib/src/owlly/overlay/label-overlay.d.ts +62 -0
  211. package/lib/src/owlly/overlay/label-overlay.js +329 -0
  212. package/lib/src/owlly/overlay/label-overlay.js.map +1 -0
  213. package/lib/src/owlly/overlay/overlay.d.ts +14 -0
  214. package/lib/src/owlly/overlay/overlay.js +5 -0
  215. package/lib/src/owlly/overlay/overlay.js.map +1 -0
  216. package/lib/src/owlly/overlay/path-overlay.d.ts +39 -0
  217. package/lib/src/owlly/overlay/path-overlay.js +125 -0
  218. package/lib/src/owlly/overlay/path-overlay.js.map +1 -0
  219. package/lib/src/owlly/overlay/path-overlay2.d.ts +35 -0
  220. package/lib/src/owlly/overlay/path-overlay2.js +119 -0
  221. package/lib/src/owlly/overlay/path-overlay2.js.map +1 -0
  222. package/lib/src/owlly/overlay/poi-overlay-3d.d.ts +278 -0
  223. package/lib/src/owlly/overlay/poi-overlay-3d.js +1433 -0
  224. package/lib/src/owlly/overlay/poi-overlay-3d.js.map +1 -0
  225. package/lib/src/owlly/overlay/poi-overlay.d.ts +277 -0
  226. package/lib/src/owlly/overlay/poi-overlay.js +1412 -0
  227. package/lib/src/owlly/overlay/poi-overlay.js.map +1 -0
  228. package/lib/src/owlly/owlly-2d/index.d.ts +28 -0
  229. package/lib/src/owlly/owlly-2d/index.js +93 -0
  230. package/lib/src/owlly/owlly-2d/index.js.map +1 -0
  231. package/lib/src/owlly/screen/index.d.ts +1 -0
  232. package/lib/src/owlly/screen/index.js +2 -0
  233. package/lib/src/owlly/screen/index.js.map +1 -0
  234. package/lib/src/owlly/screen/screen.d.ts +73 -0
  235. package/lib/src/owlly/screen/screen.js +237 -0
  236. package/lib/src/owlly/screen/screen.js.map +1 -0
  237. package/lib/src/owlly/stage/__test__/stage.spec.d.ts +1 -0
  238. package/lib/src/owlly/stage/__test__/stage.spec.js +15 -0
  239. package/lib/src/owlly/stage/__test__/stage.spec.js.map +1 -0
  240. package/lib/src/owlly/stage/externals.d.ts +19 -0
  241. package/lib/src/owlly/stage/externals.js +25 -0
  242. package/lib/src/owlly/stage/externals.js.map +1 -0
  243. package/lib/src/owlly/stage/index.d.ts +4 -0
  244. package/lib/src/owlly/stage/index.js +7 -0
  245. package/lib/src/owlly/stage/index.js.map +1 -0
  246. package/lib/src/owlly/stage/owlly.d.ts +38 -0
  247. package/lib/src/owlly/stage/owlly.js +168 -0
  248. package/lib/src/owlly/stage/owlly.js.map +1 -0
  249. package/lib/src/owlly/stage/stage.d.ts +108 -0
  250. package/lib/src/owlly/stage/stage.js +235 -0
  251. package/lib/src/owlly/stage/stage.js.map +1 -0
  252. package/lib/src/owlly/utils/alignment-utils.d.ts +20 -0
  253. package/lib/src/owlly/utils/alignment-utils.js +64 -0
  254. package/lib/src/owlly/utils/alignment-utils.js.map +1 -0
  255. package/lib/src/owlly/utils/basic-calc.d.ts +18 -0
  256. package/lib/src/owlly/utils/basic-calc.js +130 -0
  257. package/lib/src/owlly/utils/basic-calc.js.map +1 -0
  258. package/lib/src/owlly/utils/basic-tools.d.ts +71 -0
  259. package/lib/src/owlly/utils/basic-tools.js +236 -0
  260. package/lib/src/owlly/utils/basic-tools.js.map +1 -0
  261. package/lib/src/owlly/utils/bvh-tree.d.ts +105 -0
  262. package/lib/src/owlly/utils/bvh-tree.js +540 -0
  263. package/lib/src/owlly/utils/bvh-tree.js.map +1 -0
  264. package/lib/src/owlly/utils/camera.d.ts +37 -0
  265. package/lib/src/owlly/utils/camera.js +51 -0
  266. package/lib/src/owlly/utils/camera.js.map +1 -0
  267. package/lib/src/owlly/utils/cube-texture-cache.d.ts +25 -0
  268. package/lib/src/owlly/utils/cube-texture-cache.js +144 -0
  269. package/lib/src/owlly/utils/cube-texture-cache.js.map +1 -0
  270. package/lib/src/owlly/utils/device-utils.d.ts +18 -0
  271. package/lib/src/owlly/utils/device-utils.js +42 -0
  272. package/lib/src/owlly/utils/device-utils.js.map +1 -0
  273. package/lib/src/owlly/utils/environment-utils.d.ts +37 -0
  274. package/lib/src/owlly/utils/environment-utils.js +74 -0
  275. package/lib/src/owlly/utils/environment-utils.js.map +1 -0
  276. package/lib/src/owlly/utils/event-hub.d.ts +50 -0
  277. package/lib/src/owlly/utils/event-hub.js +107 -0
  278. package/lib/src/owlly/utils/event-hub.js.map +1 -0
  279. package/lib/src/owlly/utils/events.d.ts +219 -0
  280. package/lib/src/owlly/utils/events.js +220 -0
  281. package/lib/src/owlly/utils/events.js.map +1 -0
  282. package/lib/src/owlly/utils/geometry-utils.d.ts +119 -0
  283. package/lib/src/owlly/utils/geometry-utils.js +623 -0
  284. package/lib/src/owlly/utils/geometry-utils.js.map +1 -0
  285. package/lib/src/owlly/utils/helper.d.ts +6 -0
  286. package/lib/src/owlly/utils/helper.js +25 -0
  287. package/lib/src/owlly/utils/helper.js.map +1 -0
  288. package/lib/src/owlly/utils/index.d.ts +14 -0
  289. package/lib/src/owlly/utils/index.js +18 -0
  290. package/lib/src/owlly/utils/index.js.map +1 -0
  291. package/lib/src/owlly/utils/lru-cache.d.ts +26 -0
  292. package/lib/src/owlly/utils/lru-cache.js +110 -0
  293. package/lib/src/owlly/utils/lru-cache.js.map +1 -0
  294. package/lib/src/owlly/utils/map-utils.d.ts +7 -0
  295. package/lib/src/owlly/utils/map-utils.js +53 -0
  296. package/lib/src/owlly/utils/map-utils.js.map +1 -0
  297. package/lib/src/owlly/utils/number-utils.d.ts +8 -0
  298. package/lib/src/owlly/utils/number-utils.js +73 -0
  299. package/lib/src/owlly/utils/number-utils.js.map +1 -0
  300. package/lib/src/owlly/utils/panorama-model-util.d.ts +46 -0
  301. package/lib/src/owlly/utils/panorama-model-util.js +246 -0
  302. package/lib/src/owlly/utils/panorama-model-util.js.map +1 -0
  303. package/lib/src/owlly/utils/path-utils.d.ts +80 -0
  304. package/lib/src/owlly/utils/path-utils.js +729 -0
  305. package/lib/src/owlly/utils/path-utils.js.map +1 -0
  306. package/lib/src/owlly/utils/svgutils.d.ts +138 -0
  307. package/lib/src/owlly/utils/svgutils.js +562 -0
  308. package/lib/src/owlly/utils/svgutils.js.map +1 -0
  309. package/lib/src/owlly/utils/texture-cache.d.ts +29 -0
  310. package/lib/src/owlly/utils/texture-cache.js +116 -0
  311. package/lib/src/owlly/utils/texture-cache.js.map +1 -0
  312. package/lib/src/owlly/utils/tile-util.d.ts +187 -0
  313. package/lib/src/owlly/utils/tile-util.js +457 -0
  314. package/lib/src/owlly/utils/tile-util.js.map +1 -0
  315. package/lib/src/owlly/utils/time-profiler.d.ts +21 -0
  316. package/lib/src/owlly/utils/time-profiler.js +49 -0
  317. package/lib/src/owlly/utils/time-profiler.js.map +1 -0
  318. package/lib/src/owlly/view/__test__/perspective-view.spec.d.ts +0 -0
  319. package/lib/src/owlly/view/__test__/perspective-view.spec.js +22 -0
  320. package/lib/src/owlly/view/__test__/perspective-view.spec.js.map +1 -0
  321. package/lib/src/owlly/view/camera-view.d.ts +35 -0
  322. package/lib/src/owlly/view/camera-view.js +102 -0
  323. package/lib/src/owlly/view/camera-view.js.map +1 -0
  324. package/lib/src/owlly/view/index.d.ts +3 -0
  325. package/lib/src/owlly/view/index.js +6 -0
  326. package/lib/src/owlly/view/index.js.map +1 -0
  327. package/lib/src/owlly/view/orthographic-view.d.ts +40 -0
  328. package/lib/src/owlly/view/orthographic-view.js +95 -0
  329. package/lib/src/owlly/view/orthographic-view.js.map +1 -0
  330. package/lib/src/owlly/view/perspective-view.d.ts +40 -0
  331. package/lib/src/owlly/view/perspective-view.js +96 -0
  332. package/lib/src/owlly/view/perspective-view.js.map +1 -0
  333. package/lib/src/owlly/view/svg-map-view.d.ts +46 -0
  334. package/lib/src/owlly/view/svg-map-view.js +145 -0
  335. package/lib/src/owlly/view/svg-map-view.js.map +1 -0
  336. package/lib/src/owlly/view/view.d.ts +146 -0
  337. package/lib/src/owlly/view/view.js +318 -0
  338. package/lib/src/owlly/view/view.js.map +1 -0
  339. package/lib/src/web/main.centroid.d.ts +0 -0
  340. package/lib/src/web/main.centroid.js +74 -0
  341. package/lib/src/web/main.centroid.js.map +1 -0
  342. package/lib/src/web/main.hyma.meshline2d.d.ts +1 -0
  343. package/lib/src/web/main.hyma.meshline2d.js +76 -0
  344. package/lib/src/web/main.hyma.meshline2d.js.map +1 -0
  345. package/lib/src/web/main.jyfang.sample.d.ts +0 -0
  346. package/lib/src/web/main.jyfang.sample.js +122 -0
  347. package/lib/src/web/main.jyfang.sample.js.map +1 -0
  348. package/lib/src/web/main.rpeng.extrude.d.ts +1 -0
  349. package/lib/src/web/main.rpeng.extrude.js +180 -0
  350. package/lib/src/web/main.rpeng.extrude.js.map +1 -0
  351. package/lib/src/web/main.rpeng.mes.plane.d.ts +1 -0
  352. package/lib/src/web/main.rpeng.mes.plane.js +135 -0
  353. package/lib/src/web/main.rpeng.mes.plane.js.map +1 -0
  354. package/lib/src/web/main.rpeng.sample.d.ts +0 -0
  355. package/lib/src/web/main.rpeng.sample.js +318 -0
  356. package/lib/src/web/main.rpeng.sample.js.map +1 -0
  357. package/lib/src/web/main.rpeng.vr.d.ts +1 -0
  358. package/lib/src/web/main.rpeng.vr.js +141 -0
  359. package/lib/src/web/main.rpeng.vr.js.map +1 -0
  360. package/lib/src/web/main.sample.d.ts +1 -0
  361. package/lib/src/web/main.sample.js +52 -0
  362. package/lib/src/web/main.sample.js.map +1 -0
  363. package/lib/src/web/quattree.hyma.d.ts +0 -0
  364. package/lib/src/web/quattree.hyma.js +150 -0
  365. package/lib/src/web/quattree.hyma.js.map +1 -0
  366. package/lib/src/web/sensor-vr-plugin.d.ts +0 -0
  367. package/lib/src/web/sensor-vr-plugin.js +166 -0
  368. package/lib/src/web/sensor-vr-plugin.js.map +1 -0
  369. package/package.json +142 -0
  370. package/src/@types/SceneUtils.d.ts +9 -0
  371. package/src/@types/chaikin-smooth.d.ts +5 -0
  372. package/src/@types/global.d.ts +3 -0
  373. package/src/@types/snapsvg.d.ts +11 -0
  374. package/src/@types/svgson.d.ts +30 -0
  375. package/src/assets/favicon.ico +0 -0
  376. package/src/external/lines/line-geometry.ts +70 -0
  377. package/src/external/lines/line-material.ts +453 -0
  378. package/src/external/lines/line-segments-2.ts +194 -0
  379. package/src/external/lines/line-segments-geometry.ts +197 -0
  380. package/src/external/loaders/gltf-loader.ts +3004 -0
  381. package/src/external/orbit-controls.ts +1070 -0
  382. package/src/external/renderers/css-2d-renderer.ts +185 -0
  383. package/src/external/renderers/css-3d-renderer.ts +245 -0
  384. package/src/external/transform-controls.ts +1532 -0
  385. package/src/external/util/buffer-geometry-utils.ts +783 -0
  386. package/src/owlly/controller/aerial-element-controller.ts +277 -0
  387. package/src/owlly/controller/basic-controller.ts +1509 -0
  388. package/src/owlly/controller/camera-controller.ts +155 -0
  389. package/src/owlly/controller/controller.ts +76 -0
  390. package/src/owlly/controller/index.ts +15 -0
  391. package/src/owlly/controller/mouse-indicator-controller.ts +157 -0
  392. package/src/owlly/controller/orbit-control.ts +310 -0
  393. package/src/owlly/controller/panorama-adjust-controller.ts +183 -0
  394. package/src/owlly/controller/panorama-controller.ts +2234 -0
  395. package/src/owlly/controller/panorama-transform-controller.ts +151 -0
  396. package/src/owlly/controller/plane-controller.ts +222 -0
  397. package/src/owlly/controller/texture-controller.ts +949 -0
  398. package/src/owlly/controller/tile-panorama-controller.ts +1633 -0
  399. package/src/owlly/controller/transform-controller.ts +684 -0
  400. package/src/owlly/element/bottom-nav-element.ts +352 -0
  401. package/src/owlly/element/camera.ts +389 -0
  402. package/src/owlly/element/dom-2d-element.ts +88 -0
  403. package/src/owlly/element/dom-3d-element.ts +87 -0
  404. package/src/owlly/element/dom-label-2d.ts +497 -0
  405. package/src/owlly/element/element.ts +117 -0
  406. package/src/owlly/element/floor-model.ts +290 -0
  407. package/src/owlly/element/gif-kit/Gif.ts +509 -0
  408. package/src/owlly/element/gif-kit/GifColor.ts +44 -0
  409. package/src/owlly/element/gif-kit/GifCompressedCodesToByteArrayConverter.ts +56 -0
  410. package/src/owlly/element/gif-kit/GifFrame.ts +207 -0
  411. package/src/owlly/element/gif-kit/GifImage.ts +26 -0
  412. package/src/owlly/element/gif-kit/GifParser.ts +254 -0
  413. package/src/owlly/element/gif-kit/GifPresenter.ts +46 -0
  414. package/src/owlly/element/gif-kit/GifVersion.ts +12 -0
  415. package/src/owlly/element/gltf-mesh-element.ts +184 -0
  416. package/src/owlly/element/index.ts +25 -0
  417. package/src/owlly/element/map-kit/area.ts +232 -0
  418. package/src/owlly/element/map-kit/block-set.ts +102 -0
  419. package/src/owlly/element/map-kit/block.ts +417 -0
  420. package/src/owlly/element/map-kit/index.ts +6 -0
  421. package/src/owlly/element/map-kit/shape.ts +285 -0
  422. package/src/owlly/element/mesh-element.ts +94 -0
  423. package/src/owlly/element/mesh-line-2d.ts +1032 -0
  424. package/src/owlly/element/meshline-o.ts +802 -0
  425. package/src/owlly/element/panorama-group.ts +1250 -0
  426. package/src/owlly/element/panorama.ts +1044 -0
  427. package/src/owlly/element/path-group.ts +212 -0
  428. package/src/owlly/element/path.ts +727 -0
  429. package/src/owlly/element/placeable-2d.ts +627 -0
  430. package/src/owlly/element/polygon-mesh.ts +344 -0
  431. package/src/owlly/element/ring-element.ts +517 -0
  432. package/src/owlly/element/sphere-mesh.ts +96 -0
  433. package/src/owlly/element/svg-floor-model.ts +200 -0
  434. package/src/owlly/element/svg-floors.ts +121 -0
  435. package/src/owlly/element/tile-panorama-group.ts +1314 -0
  436. package/src/owlly/element/tile-panorama.ts +636 -0
  437. package/src/owlly/element/tile-plane.ts +430 -0
  438. package/src/owlly/element/video-element.ts +190 -0
  439. package/src/owlly/geometries/ExtrudeGeometry2.ts +255 -0
  440. package/src/owlly/index.ts +19 -0
  441. package/src/owlly/overlay/canvas-overlay.ts +642 -0
  442. package/src/owlly/overlay/css-2d-overlay.ts +48 -0
  443. package/src/owlly/overlay/css-3d-overlay.ts +50 -0
  444. package/src/owlly/overlay/index.ts +11 -0
  445. package/src/owlly/overlay/label-overlay.ts +419 -0
  446. package/src/owlly/overlay/overlay.ts +17 -0
  447. package/src/owlly/overlay/path-overlay.ts +170 -0
  448. package/src/owlly/overlay/path-overlay2.ts +149 -0
  449. package/src/owlly/overlay/poi-overlay-3d.ts +1759 -0
  450. package/src/owlly/overlay/poi-overlay.ts +1739 -0
  451. package/src/owlly/owlly-2d/index.ts +108 -0
  452. package/src/owlly/screen/index.ts +1 -0
  453. package/src/owlly/screen/screen.ts +323 -0
  454. package/src/owlly/stage/__test__/stage.spec.ts +15 -0
  455. package/src/owlly/stage/externals.ts +45 -0
  456. package/src/owlly/stage/index.ts +12 -0
  457. package/src/owlly/stage/owlly.ts +223 -0
  458. package/src/owlly/stage/stage.ts +274 -0
  459. package/src/owlly/utils/alignment-utils.ts +84 -0
  460. package/src/owlly/utils/basic-calc.ts +141 -0
  461. package/src/owlly/utils/basic-tools.ts +286 -0
  462. package/src/owlly/utils/bvh-tree.ts +695 -0
  463. package/src/owlly/utils/camera.ts +72 -0
  464. package/src/owlly/utils/cube-texture-cache.ts +155 -0
  465. package/src/owlly/utils/device-utils.ts +53 -0
  466. package/src/owlly/utils/environment-utils.ts +81 -0
  467. package/src/owlly/utils/event-hub.ts +120 -0
  468. package/src/owlly/utils/events.ts +266 -0
  469. package/src/owlly/utils/geometry-utils.ts +749 -0
  470. package/src/owlly/utils/helper.ts +33 -0
  471. package/src/owlly/utils/index.ts +17 -0
  472. package/src/owlly/utils/lru-cache.ts +126 -0
  473. package/src/owlly/utils/map-utils.ts +55 -0
  474. package/src/owlly/utils/number-utils.ts +75 -0
  475. package/src/owlly/utils/panorama-model-util.ts +255 -0
  476. package/src/owlly/utils/path-utils.ts +837 -0
  477. package/src/owlly/utils/svgutils.ts +732 -0
  478. package/src/owlly/utils/texture-cache.ts +132 -0
  479. package/src/owlly/utils/tile-util.ts +563 -0
  480. package/src/owlly/utils/time-profiler.ts +57 -0
  481. package/src/owlly/view/__test__/perspective-view.spec.ts +23 -0
  482. package/src/owlly/view/camera-view.ts +114 -0
  483. package/src/owlly/view/index.ts +5 -0
  484. package/src/owlly/view/orthographic-view.ts +124 -0
  485. package/src/owlly/view/perspective-view.ts +125 -0
  486. package/src/owlly/view/svg-map-view.ts +187 -0
  487. package/src/owlly/view/view.ts +409 -0
  488. package/src/public/js/jsmpeg.min.js +3129 -0
  489. package/src/web/index.html +52 -0
  490. package/src/web/main.centroid.ts +85 -0
  491. package/src/web/main.hyma.meshline2d.ts +84 -0
  492. package/src/web/main.jyfang.sample.ts +139 -0
  493. package/src/web/main.rpeng.extrude.ts +194 -0
  494. package/src/web/main.rpeng.mes.plane.ts +161 -0
  495. package/src/web/main.rpeng.sample.ts +345 -0
  496. package/src/web/main.rpeng.vr.ts +159 -0
  497. package/src/web/main.sample.ts +59 -0
  498. package/src/web/quattree.hyma.ts +163 -0
  499. package/src/web/sensor-vr-plugin.ts +201 -0
  500. package/src/web/testPixel.png +0 -0
@@ -0,0 +1,3129 @@
1
+ var JSMpeg = {
2
+ Player: null,
3
+ VideoElement: null,
4
+ BitBuffer: null,
5
+ Source: {},
6
+ Demuxer: {},
7
+ Decoder: {},
8
+ Renderer: {},
9
+ AudioOutput: {},
10
+ Now: function() {
11
+ return window.performance ? window.performance.now() / 1e3 : Date.now() / 1e3
12
+ },
13
+ CreateVideoElements: function() {
14
+ var elements = document.querySelectorAll(".jsmpeg");
15
+ for (var i = 0; i < elements.length; i++) {
16
+ new JSMpeg.VideoElement(elements[i])
17
+ }
18
+ },
19
+ Fill: function(array, value) {
20
+ if (array.fill) {
21
+ array.fill(value)
22
+ } else {
23
+ for (var i = 0; i < array.length; i++) {
24
+ array[i] = value
25
+ }
26
+ }
27
+ },
28
+ Base64ToArrayBuffer: function(base64) {
29
+ var binary = window.atob(base64);
30
+ var length = binary.length;
31
+ var bytes = new Uint8Array(length);
32
+ for (var i = 0; i < length; i++) {
33
+ bytes[i] = binary.charCodeAt(i)
34
+ }
35
+ return bytes.buffer
36
+ },
37
+ WASM_BINARY_INLINED: null
38
+ };
39
+ if (document.readyState === "complete") {
40
+ JSMpeg.CreateVideoElements()
41
+ } else {
42
+ document.addEventListener("DOMContentLoaded", JSMpeg.CreateVideoElements)
43
+ }
44
+ JSMpeg.VideoElement = function() {
45
+ "use strict";
46
+ var VideoElement = function(element) {
47
+ var url = element.dataset.url;
48
+ if (!url) {
49
+ throw "VideoElement has no `data-url` attribute"
50
+ }
51
+ var addStyles = function(element, styles) {
52
+ for (var name in styles) {
53
+ element.style[name] = styles[name]
54
+ }
55
+ };
56
+ this.container = element;
57
+ addStyles(this.container, {
58
+ display: "inline-block",
59
+ position: "relative",
60
+ minWidth: "80px",
61
+ minHeight: "80px"
62
+ });
63
+ this.canvas = document.createElement("canvas");
64
+ this.canvas.width = 960;
65
+ this.canvas.height = 540;
66
+ addStyles(this.canvas, {
67
+ display: "block",
68
+ width: "100%"
69
+ });
70
+ this.container.appendChild(this.canvas);
71
+ this.playButton = document.createElement("div");
72
+ this.playButton.innerHTML = VideoElement.PLAY_BUTTON;
73
+ addStyles(this.playButton, {
74
+ zIndex: 2,
75
+ position: "absolute",
76
+ top: "0",
77
+ bottom: "0",
78
+ left: "0",
79
+ right: "0",
80
+ maxWidth: "75px",
81
+ maxHeight: "75px",
82
+ margin: "auto",
83
+ opacity: "0.7",
84
+ cursor: "pointer"
85
+ });
86
+ this.container.appendChild(this.playButton);
87
+ var options = {
88
+ canvas: this.canvas
89
+ };
90
+ for (var option in element.dataset) {
91
+ try {
92
+ options[option] = JSON.parse(element.dataset[option])
93
+ } catch (err) {
94
+ options[option] = element.dataset[option]
95
+ }
96
+ }
97
+ this.player = new JSMpeg.Player(url, options);
98
+ element.playerInstance = this.player;
99
+ if (options.poster && !options.autoplay && !this.player.options.streaming) {
100
+ options.decodeFirstFrame = false;
101
+ this.poster = new Image;
102
+ this.poster.src = options.poster;
103
+ this.poster.addEventListener("load", this.posterLoaded);
104
+ addStyles(this.poster, {
105
+ display: "block",
106
+ zIndex: 1,
107
+ position: "absolute",
108
+ top: 0,
109
+ left: 0,
110
+ bottom: 0,
111
+ right: 0
112
+ });
113
+ this.container.appendChild(this.poster)
114
+ }
115
+ if (!this.player.options.streaming) {
116
+ this.container.addEventListener("click", this.onClick.bind(this))
117
+ }
118
+ if (options.autoplay || this.player.options.streaming) {
119
+ this.playButton.style.display = "none"
120
+ }
121
+ if (this.player.audioOut && !this.player.audioOut.unlocked) {
122
+ var unlockAudioElement = this.container;
123
+ if (options.autoplay || this.player.options.streaming) {
124
+ this.unmuteButton = document.createElement("div");
125
+ this.unmuteButton.innerHTML = VideoElement.UNMUTE_BUTTON;
126
+ addStyles(this.unmuteButton, {
127
+ zIndex: 2,
128
+ position: "absolute",
129
+ bottom: "10px",
130
+ right: "20px",
131
+ width: "75px",
132
+ height: "75px",
133
+ margin: "auto",
134
+ opacity: "0.7",
135
+ cursor: "pointer"
136
+ });
137
+ this.container.appendChild(this.unmuteButton);
138
+ unlockAudioElement = this.unmuteButton
139
+ }
140
+ this.unlockAudioBound = this.onUnlockAudio.bind(this, unlockAudioElement);
141
+ unlockAudioElement.addEventListener("touchstart", this.unlockAudioBound, false);
142
+ unlockAudioElement.addEventListener("click", this.unlockAudioBound, true)
143
+ }
144
+ };
145
+ VideoElement.prototype.onUnlockAudio = function(element, ev) {
146
+ if (this.unmuteButton) {
147
+ ev.preventDefault();
148
+ ev.stopPropagation()
149
+ }
150
+ this.player.audioOut.unlock(function() {
151
+ if (this.unmuteButton) {
152
+ this.unmuteButton.style.display = "none"
153
+ }
154
+ element.removeEventListener("touchstart", this.unlockAudioBound);
155
+ element.removeEventListener("click", this.unlockAudioBound)
156
+ }.bind(this))
157
+ };
158
+ VideoElement.prototype.onClick = function(ev) {
159
+ if (this.player.isPlaying) {
160
+ this.player.pause();
161
+ this.playButton.style.display = "block"
162
+ } else {
163
+ this.player.play();
164
+ this.playButton.style.display = "none";
165
+ if (this.poster) {
166
+ this.poster.style.display = "none"
167
+ }
168
+ }
169
+ };
170
+ VideoElement.PLAY_BUTTON = '<svg style="max-width: 75px; max-height: 75px;" ' + 'viewBox="0 0 200 200" alt="Play video">' + '<circle cx="100" cy="100" r="90" fill="none" ' + 'stroke-width="15" stroke="#fff"/>' + '<polygon points="70, 55 70, 145 145, 100" fill="#fff"/>' + "</svg>";
171
+ VideoElement.UNMUTE_BUTTON = '<svg style="max-width: 75px; max-height: 75px;" viewBox="0 0 75 75">' + '<polygon class="audio-speaker" stroke="none" fill="#fff" ' + 'points="39,13 22,28 6,28 6,47 21,47 39,62 39,13"/>' + '<g stroke="#fff" stroke-width="5">' + '<path d="M 49,50 69,26"/>' + '<path d="M 69,50 49,26"/>' + "</g>" + "</svg>";
172
+ return VideoElement
173
+ }();
174
+ JSMpeg.Player = function() {
175
+ "use strict";
176
+ var Player = function(url, options) {
177
+ this.options = options || {};
178
+ if (options.source) {
179
+ this.source = new options.source(url, options);
180
+ options.streaming = !!this.source.streaming
181
+ } else if (url.match(/^wss?:\/\//)) {
182
+ this.source = new JSMpeg.Source.WebSocket(url, options);
183
+ options.streaming = true
184
+ } else if (options.progressive !== false) {
185
+ this.source = new JSMpeg.Source.AjaxProgressive(url, options);
186
+ options.streaming = false
187
+ } else {
188
+ this.source = new JSMpeg.Source.Ajax(url, options);
189
+ options.streaming = false
190
+ }
191
+ this.maxAudioLag = options.maxAudioLag || .25;
192
+ this.loop = options.loop !== false;
193
+ this.autoplay = !!options.autoplay || options.streaming;
194
+ this.demuxer = new JSMpeg.Demuxer.TS(options);
195
+ this.source.connect(this.demuxer);
196
+ if (!options.disableWebAssembly && JSMpeg.WASMModule.IsSupported()) {
197
+ this.wasmModule = JSMpeg.WASMModule.GetModule();
198
+ options.wasmModule = this.wasmModule
199
+ }
200
+ if (options.video !== false) {
201
+ this.video = options.wasmModule ? new JSMpeg.Decoder.MPEG1VideoWASM(options) : new JSMpeg.Decoder.MPEG1Video(options);
202
+ this.renderer = !options.disableGl && JSMpeg.Renderer.WebGL.IsSupported() ? new JSMpeg.Renderer.WebGL(options) : new JSMpeg.Renderer.Canvas2D(options);
203
+ this.demuxer.connect(JSMpeg.Demuxer.TS.STREAM.VIDEO_1, this.video);
204
+ this.video.connect(this.renderer)
205
+ }
206
+ if (options.audio !== false && JSMpeg.AudioOutput.WebAudio.IsSupported()) {
207
+ this.audio = options.wasmModule ? new JSMpeg.Decoder.MP2AudioWASM(options) : new JSMpeg.Decoder.MP2Audio(options);
208
+ this.audioOut = new JSMpeg.AudioOutput.WebAudio(options);
209
+ this.demuxer.connect(JSMpeg.Demuxer.TS.STREAM.AUDIO_1, this.audio);
210
+ this.audio.connect(this.audioOut)
211
+ }
212
+ Object.defineProperty(this, "currentTime", {
213
+ get: this.getCurrentTime,
214
+ set: this.setCurrentTime
215
+ });
216
+ Object.defineProperty(this, "volume", {
217
+ get: this.getVolume,
218
+ set: this.setVolume
219
+ });
220
+ this.paused = true;
221
+ this.unpauseOnShow = false;
222
+ if (options.pauseWhenHidden !== false) {
223
+ document.addEventListener("visibilitychange", this.showHide.bind(this))
224
+ }
225
+ if (this.wasmModule) {
226
+ if (this.wasmModule.ready) {
227
+ this.startLoading()
228
+ } else if (JSMpeg.WASM_BINARY_INLINED) {
229
+ var wasm = JSMpeg.Base64ToArrayBuffer(JSMpeg.WASM_BINARY_INLINED);
230
+ this.wasmModule.loadFromBuffer(wasm, this.startLoading.bind(this))
231
+ } else {
232
+ this.wasmModule.loadFromFile("jsmpeg.wasm", this.startLoading.bind(this))
233
+ }
234
+ } else {
235
+ this.startLoading()
236
+ }
237
+ };
238
+ Player.prototype.startLoading = function() {
239
+ this.source.start();
240
+ if (this.autoplay) {
241
+ this.play()
242
+ }
243
+ };
244
+ Player.prototype.showHide = function(ev) {
245
+ if (document.visibilityState === "hidden") {
246
+ this.unpauseOnShow = this.wantsToPlay;
247
+ this.pause()
248
+ } else if (this.unpauseOnShow) {
249
+ this.play()
250
+ }
251
+ };
252
+ Player.prototype.play = function(ev) {
253
+ if (this.animationId) {
254
+ return
255
+ }
256
+ this.animationId = requestAnimationFrame(this.update.bind(this));
257
+ this.wantsToPlay = true;
258
+ this.paused = false
259
+ };
260
+ Player.prototype.pause = function(ev) {
261
+ if (this.paused) {
262
+ return
263
+ }
264
+ cancelAnimationFrame(this.animationId);
265
+ this.animationId = null;
266
+ this.wantsToPlay = false;
267
+ this.isPlaying = false;
268
+ this.paused = true;
269
+ if (this.audio && this.audio.canPlay) {
270
+ this.audioOut.stop();
271
+ this.seek(this.currentTime)
272
+ }
273
+ if (this.options.onPause) {
274
+ this.options.onPause(this)
275
+ }
276
+ };
277
+ Player.prototype.getVolume = function() {
278
+ return this.audioOut ? this.audioOut.volume : 0
279
+ };
280
+ Player.prototype.setVolume = function(volume) {
281
+ if (this.audioOut) {
282
+ this.audioOut.volume = volume
283
+ }
284
+ };
285
+ Player.prototype.stop = function(ev) {
286
+ this.pause();
287
+ this.seek(0);
288
+ if (this.video && this.options.decodeFirstFrame !== false) {
289
+ this.video.decode()
290
+ }
291
+ };
292
+ Player.prototype.destroy = function() {
293
+ this.pause();
294
+ this.source.destroy();
295
+ this.video && this.video.destroy();
296
+ this.renderer && this.renderer.destroy();
297
+ this.audio && this.audio.destroy();
298
+ this.audioOut && this.audioOut.destroy()
299
+ };
300
+ Player.prototype.seek = function(time) {
301
+ var startOffset = this.audio && this.audio.canPlay ? this.audio.startTime : this.video.startTime;
302
+ if (this.video) {
303
+ this.video.seek(time + startOffset)
304
+ }
305
+ if (this.audio) {
306
+ this.audio.seek(time + startOffset)
307
+ }
308
+ this.startTime = JSMpeg.Now() - time
309
+ };
310
+ Player.prototype.getCurrentTime = function() {
311
+ return this.audio && this.audio.canPlay ? this.audio.currentTime - this.audio.startTime : this.video.currentTime - this.video.startTime
312
+ };
313
+ Player.prototype.setCurrentTime = function(time) {
314
+ this.seek(time)
315
+ };
316
+ Player.prototype.update = function() {
317
+ this.animationId = requestAnimationFrame(this.update.bind(this));
318
+ if (!this.source.established) {
319
+ if (this.renderer) {
320
+ this.renderer.renderProgress(this.source.progress)
321
+ }
322
+ return
323
+ }
324
+ if (!this.isPlaying) {
325
+ this.isPlaying = true;
326
+ this.startTime = JSMpeg.Now() - this.currentTime;
327
+ if (this.options.onPlay) {
328
+ this.options.onPlay(this)
329
+ }
330
+ }
331
+ if (this.options.streaming) {
332
+ this.updateForStreaming()
333
+ } else {
334
+ this.updateForStaticFile()
335
+ }
336
+ };
337
+ Player.prototype.updateForStreaming = function() {
338
+ if (this.video) {
339
+ this.video.decode()
340
+ }
341
+ if (this.audio) {
342
+ var decoded = false;
343
+ do {
344
+ if (this.audioOut.enqueuedTime > this.maxAudioLag) {
345
+ this.audioOut.resetEnqueuedTime();
346
+ this.audioOut.enabled = false
347
+ }
348
+ decoded = this.audio.decode()
349
+ } while (decoded);
350
+ this.audioOut.enabled = true
351
+ }
352
+ };
353
+ Player.prototype.nextFrame = function() {
354
+ if (this.source.established && this.video) {
355
+ return this.video.decode()
356
+ }
357
+ return false
358
+ };
359
+ Player.prototype.updateForStaticFile = function() {
360
+ var notEnoughData = false,
361
+ headroom = 0;
362
+ if (this.audio && this.audio.canPlay) {
363
+ while (!notEnoughData && this.audio.decodedTime - this.audio.currentTime < .25) {
364
+ notEnoughData = !this.audio.decode()
365
+ }
366
+ if (this.video && this.video.currentTime < this.audio.currentTime) {
367
+ notEnoughData = !this.video.decode()
368
+ }
369
+ headroom = this.demuxer.currentTime - this.audio.currentTime
370
+ } else if (this.video) {
371
+ var targetTime = JSMpeg.Now() - this.startTime + this.video.startTime,
372
+ lateTime = targetTime - this.video.currentTime,
373
+ frameTime = 1 / this.video.frameRate;
374
+ if (this.video && lateTime > 0) {
375
+ if (lateTime > frameTime * 2) {
376
+ this.startTime += lateTime
377
+ }
378
+ notEnoughData = !this.video.decode()
379
+ }
380
+ headroom = this.demuxer.currentTime - targetTime
381
+ }
382
+ this.source.resume(headroom);
383
+ if (notEnoughData && this.source.completed) {
384
+ if (this.loop) {
385
+ this.seek(0)
386
+ } else {
387
+ this.pause();
388
+ if (this.options.onEnded) {
389
+ this.options.onEnded(this)
390
+ }
391
+ }
392
+ } else if (notEnoughData && this.options.onStalled) {
393
+ this.options.onStalled(this)
394
+ }
395
+ };
396
+ return Player
397
+ }();
398
+ JSMpeg.BitBuffer = function() {
399
+ "use strict";
400
+ var BitBuffer = function(bufferOrLength, mode) {
401
+ if (typeof bufferOrLength === "object") {
402
+ this.bytes = bufferOrLength instanceof Uint8Array ? bufferOrLength : new Uint8Array(bufferOrLength);
403
+ this.byteLength = this.bytes.length
404
+ } else {
405
+ this.bytes = new Uint8Array(bufferOrLength || 1024 * 1024);
406
+ this.byteLength = 0
407
+ }
408
+ this.mode = mode || BitBuffer.MODE.EXPAND;
409
+ this.index = 0
410
+ };
411
+ BitBuffer.prototype.resize = function(size) {
412
+ var newBytes = new Uint8Array(size);
413
+ if (this.byteLength !== 0) {
414
+ this.byteLength = Math.min(this.byteLength, size);
415
+ newBytes.set(this.bytes, 0, this.byteLength)
416
+ }
417
+ this.bytes = newBytes;
418
+ this.index = Math.min(this.index, this.byteLength << 3)
419
+ };
420
+ BitBuffer.prototype.evict = function(sizeNeeded) {
421
+ var bytePos = this.index >> 3,
422
+ available = this.bytes.length - this.byteLength;
423
+ if (this.index === this.byteLength << 3 || sizeNeeded > available + bytePos) {
424
+ this.byteLength = 0;
425
+ this.index = 0;
426
+ return
427
+ } else if (bytePos === 0) {
428
+ return
429
+ }
430
+ if (this.bytes.copyWithin) {
431
+ this.bytes.copyWithin(0, bytePos, this.byteLength)
432
+ } else {
433
+ this.bytes.set(this.bytes.subarray(bytePos, this.byteLength))
434
+ }
435
+ this.byteLength = this.byteLength - bytePos;
436
+ this.index -= bytePos << 3;
437
+ return
438
+ };
439
+ BitBuffer.prototype.write = function(buffers) {
440
+ var isArrayOfBuffers = typeof buffers[0] === "object",
441
+ totalLength = 0,
442
+ available = this.bytes.length - this.byteLength;
443
+ if (isArrayOfBuffers) {
444
+ var totalLength = 0;
445
+ for (var i = 0; i < buffers.length; i++) {
446
+ totalLength += buffers[i].byteLength
447
+ }
448
+ } else {
449
+ totalLength = buffers.byteLength
450
+ }
451
+ if (totalLength > available) {
452
+ if (this.mode === BitBuffer.MODE.EXPAND) {
453
+ var newSize = Math.max(this.bytes.length * 2, totalLength - available);
454
+ this.resize(newSize)
455
+ } else {
456
+ this.evict(totalLength)
457
+ }
458
+ }
459
+ if (isArrayOfBuffers) {
460
+ for (var i = 0; i < buffers.length; i++) {
461
+ this.appendSingleBuffer(buffers[i])
462
+ }
463
+ } else {
464
+ this.appendSingleBuffer(buffers)
465
+ }
466
+ return totalLength
467
+ };
468
+ BitBuffer.prototype.appendSingleBuffer = function(buffer) {
469
+ buffer = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
470
+ this.bytes.set(buffer, this.byteLength);
471
+ this.byteLength += buffer.length
472
+ };
473
+ BitBuffer.prototype.findNextStartCode = function() {
474
+ for (var i = this.index + 7 >> 3; i < this.byteLength; i++) {
475
+ if (this.bytes[i] == 0 && this.bytes[i + 1] == 0 && this.bytes[i + 2] == 1) {
476
+ this.index = i + 4 << 3;
477
+ return this.bytes[i + 3]
478
+ }
479
+ }
480
+ this.index = this.byteLength << 3;
481
+ return -1
482
+ };
483
+ BitBuffer.prototype.findStartCode = function(code) {
484
+ var current = 0;
485
+ while (true) {
486
+ current = this.findNextStartCode();
487
+ if (current === code || current === -1) {
488
+ return current
489
+ }
490
+ }
491
+ return -1
492
+ };
493
+ BitBuffer.prototype.nextBytesAreStartCode = function() {
494
+ var i = this.index + 7 >> 3;
495
+ return i >= this.byteLength || this.bytes[i] == 0 && this.bytes[i + 1] == 0 && this.bytes[i + 2] == 1
496
+ };
497
+ BitBuffer.prototype.peek = function(count) {
498
+ var offset = this.index;
499
+ var value = 0;
500
+ while (count) {
501
+ var currentByte = this.bytes[offset >> 3],
502
+ remaining = 8 - (offset & 7),
503
+ read = remaining < count ? remaining : count,
504
+ shift = remaining - read,
505
+ mask = 255 >> 8 - read;
506
+ value = value << read | (currentByte & mask << shift) >> shift;
507
+ offset += read;
508
+ count -= read
509
+ }
510
+ return value
511
+ };
512
+ BitBuffer.prototype.read = function(count) {
513
+ var value = this.peek(count);
514
+ this.index += count;
515
+ return value
516
+ };
517
+ BitBuffer.prototype.skip = function(count) {
518
+ return this.index += count
519
+ };
520
+ BitBuffer.prototype.rewind = function(count) {
521
+ this.index = Math.max(this.index - count, 0)
522
+ };
523
+ BitBuffer.prototype.has = function(count) {
524
+ return (this.byteLength << 3) - this.index >= count
525
+ };
526
+ BitBuffer.MODE = {
527
+ EVICT: 1,
528
+ EXPAND: 2
529
+ };
530
+ return BitBuffer
531
+ }();
532
+ JSMpeg.Source.Ajax = function() {
533
+ "use strict";
534
+ var AjaxSource = function(url, options) {
535
+ this.url = url;
536
+ this.destination = null;
537
+ this.request = null;
538
+ this.streaming = false;
539
+ this.completed = false;
540
+ this.established = false;
541
+ this.progress = 0;
542
+ this.onEstablishedCallback = options.onSourceEstablished;
543
+ this.onCompletedCallback = options.onSourceCompleted
544
+ };
545
+ AjaxSource.prototype.connect = function(destination) {
546
+ this.destination = destination
547
+ };
548
+ AjaxSource.prototype.start = function() {
549
+ this.request = new XMLHttpRequest;
550
+ this.request.onreadystatechange = function() {
551
+ if (this.request.readyState === this.request.DONE && this.request.status === 200) {
552
+ this.onLoad(this.request.response)
553
+ }
554
+ }.bind(this);
555
+ this.request.onprogress = this.onProgress.bind(this);
556
+ this.request.open("GET", this.url);
557
+ this.request.responseType = "arraybuffer";
558
+ this.request.send()
559
+ };
560
+ AjaxSource.prototype.resume = function(secondsHeadroom) {};
561
+ AjaxSource.prototype.destroy = function() {
562
+ this.request.abort()
563
+ };
564
+ AjaxSource.prototype.onProgress = function(ev) {
565
+ this.progress = ev.loaded / ev.total
566
+ };
567
+ AjaxSource.prototype.onLoad = function(data) {
568
+ this.established = true;
569
+ this.completed = true;
570
+ this.progress = 1;
571
+ if (this.onEstablishedCallback) {
572
+ this.onEstablishedCallback(this)
573
+ }
574
+ if (this.onCompletedCallback) {
575
+ this.onCompletedCallback(this)
576
+ }
577
+ if (this.destination) {
578
+ this.destination.write(data)
579
+ }
580
+ };
581
+ return AjaxSource
582
+ }();
583
+ JSMpeg.Source.Fetch = function() {
584
+ "use strict";
585
+ var FetchSource = function(url, options) {
586
+ this.url = url;
587
+ this.destination = null;
588
+ this.request = null;
589
+ this.streaming = true;
590
+ this.completed = false;
591
+ this.established = false;
592
+ this.progress = 0;
593
+ this.aborted = false;
594
+ this.onEstablishedCallback = options.onSourceEstablished;
595
+ this.onCompletedCallback = options.onSourceCompleted
596
+ };
597
+ FetchSource.prototype.connect = function(destination) {
598
+ this.destination = destination
599
+ };
600
+ FetchSource.prototype.start = function() {
601
+ var params = {
602
+ method: "GET",
603
+ headers: new Headers,
604
+ cache: "default"
605
+ };
606
+ self.fetch(this.url, params).then(function(res) {
607
+ if (res.ok && (res.status >= 200 && res.status <= 299)) {
608
+ this.progress = 1;
609
+ this.established = true;
610
+ return this.pump(res.body.getReader())
611
+ } else {}
612
+ }.bind(this)).catch(function(err) {
613
+ throw err
614
+ })
615
+ };
616
+ FetchSource.prototype.pump = function(reader) {
617
+ return reader.read().then(function(result) {
618
+ if (result.done) {
619
+ this.completed = true
620
+ } else {
621
+ if (this.aborted) {
622
+ return reader.cancel()
623
+ }
624
+ if (this.destination) {
625
+ this.destination.write(result.value.buffer)
626
+ }
627
+ return this.pump(reader)
628
+ }
629
+ }.bind(this)).catch(function(err) {
630
+ throw err
631
+ })
632
+ };
633
+ FetchSource.prototype.resume = function(secondsHeadroom) {};
634
+ FetchSource.prototype.abort = function() {
635
+ this.aborted = true
636
+ };
637
+ return FetchSource
638
+ }();
639
+ JSMpeg.Source.AjaxProgressive = function() {
640
+ "use strict";
641
+ var AjaxProgressiveSource = function(url, options) {
642
+ this.url = url;
643
+ this.destination = null;
644
+ this.request = null;
645
+ this.streaming = false;
646
+ this.completed = false;
647
+ this.established = false;
648
+ this.progress = 0;
649
+ this.fileSize = 0;
650
+ this.loadedSize = 0;
651
+ this.chunkSize = options.chunkSize || 1024 * 1024;
652
+ this.isLoading = false;
653
+ this.loadStartTime = 0;
654
+ this.throttled = options.throttled !== false;
655
+ this.aborted = false;
656
+ this.onEstablishedCallback = options.onSourceEstablished;
657
+ this.onCompletedCallback = options.onSourceCompleted
658
+ };
659
+ AjaxProgressiveSource.prototype.connect = function(destination) {
660
+ this.destination = destination
661
+ };
662
+ AjaxProgressiveSource.prototype.start = function() {
663
+ this.request = new XMLHttpRequest;
664
+ this.request.onreadystatechange = function() {
665
+ if (this.request.readyState === this.request.DONE) {
666
+ this.fileSize = parseInt(this.request.getResponseHeader("Content-Length"));
667
+ this.loadNextChunk()
668
+ }
669
+ }.bind(this);
670
+ this.request.onprogress = this.onProgress.bind(this);
671
+ this.request.open("HEAD", this.url);
672
+ this.request.send()
673
+ };
674
+ AjaxProgressiveSource.prototype.resume = function(secondsHeadroom) {
675
+ if (this.isLoading || !this.throttled) {
676
+ return
677
+ }
678
+ var worstCaseLoadingTime = this.loadTime * 8 + 2;
679
+ if (worstCaseLoadingTime > secondsHeadroom) {
680
+ this.loadNextChunk()
681
+ }
682
+ };
683
+ AjaxProgressiveSource.prototype.destroy = function() {
684
+ this.request.abort();
685
+ this.aborted = true
686
+ };
687
+ AjaxProgressiveSource.prototype.loadNextChunk = function() {
688
+ var start = this.loadedSize,
689
+ end = Math.min(this.loadedSize + this.chunkSize - 1, this.fileSize - 1);
690
+ if (start >= this.fileSize || this.aborted) {
691
+ this.completed = true;
692
+ if (this.onCompletedCallback) {
693
+ this.onCompletedCallback(this)
694
+ }
695
+ return
696
+ }
697
+ this.isLoading = true;
698
+ this.loadStartTime = JSMpeg.Now();
699
+ this.request = new XMLHttpRequest;
700
+ this.request.onreadystatechange = function() {
701
+ if (this.request.readyState === this.request.DONE && this.request.status >= 200 && this.request.status < 300) {
702
+ this.onChunkLoad(this.request.response)
703
+ } else if (this.request.readyState === this.request.DONE) {
704
+ if (this.loadFails++ < 3) {
705
+ this.loadNextChunk()
706
+ }
707
+ }
708
+ }.bind(this);
709
+ if (start === 0) {
710
+ this.request.onprogress = this.onProgress.bind(this)
711
+ }
712
+ this.request.open("GET", this.url + "?" + start + "-" + end);
713
+ this.request.setRequestHeader("Range", "bytes=" + start + "-" + end);
714
+ this.request.responseType = "arraybuffer";
715
+ this.request.send()
716
+ };
717
+ AjaxProgressiveSource.prototype.onProgress = function(ev) {
718
+ this.progress = ev.loaded / ev.total
719
+ };
720
+ AjaxProgressiveSource.prototype.onChunkLoad = function(data) {
721
+ var isFirstChunk = !this.established;
722
+ this.established = true;
723
+ this.progress = 1;
724
+ this.loadedSize += data.byteLength;
725
+ this.loadFails = 0;
726
+ this.isLoading = false;
727
+ if (isFirstChunk && this.onEstablishedCallback) {
728
+ this.onEstablishedCallback(this)
729
+ }
730
+ if (this.destination) {
731
+ this.destination.write(data)
732
+ }
733
+ this.loadTime = JSMpeg.Now() - this.loadStartTime;
734
+ if (!this.throttled) {
735
+ this.loadNextChunk()
736
+ }
737
+ };
738
+ return AjaxProgressiveSource
739
+ }();
740
+ JSMpeg.Source.WebSocket = function() {
741
+ "use strict";
742
+ var WSSource = function(url, options) {
743
+ this.url = url;
744
+ this.options = options;
745
+ this.socket = null;
746
+ this.streaming = true;
747
+ this.callbacks = {
748
+ connect: [],
749
+ data: []
750
+ };
751
+ this.destination = null;
752
+ this.reconnectInterval = options.reconnectInterval !== undefined ? options.reconnectInterval : 5;
753
+ this.shouldAttemptReconnect = !!this.reconnectInterval;
754
+ this.completed = false;
755
+ this.established = false;
756
+ this.progress = 0;
757
+ this.reconnectTimeoutId = 0;
758
+ this.onEstablishedCallback = options.onSourceEstablished;
759
+ this.onCompletedCallback = options.onSourceCompleted
760
+ };
761
+ WSSource.prototype.connect = function(destination) {
762
+ this.destination = destination
763
+ };
764
+ WSSource.prototype.destroy = function() {
765
+ clearTimeout(this.reconnectTimeoutId);
766
+ this.shouldAttemptReconnect = false;
767
+ this.socket.close()
768
+ };
769
+ WSSource.prototype.start = function() {
770
+ this.shouldAttemptReconnect = !!this.reconnectInterval;
771
+ this.progress = 0;
772
+ this.established = false;
773
+ this.socket = new WebSocket(this.url, this.options.protocols || null);
774
+ this.socket.binaryType = "arraybuffer";
775
+ this.socket.onmessage = this.onMessage.bind(this);
776
+ this.socket.onopen = this.onOpen.bind(this);
777
+ this.socket.onerror = this.onClose.bind(this);
778
+ this.socket.onclose = this.onClose.bind(this)
779
+ };
780
+ WSSource.prototype.resume = function(secondsHeadroom) {};
781
+ WSSource.prototype.onOpen = function() {
782
+ this.progress = 1
783
+ };
784
+ WSSource.prototype.onClose = function() {
785
+ if (this.shouldAttemptReconnect) {
786
+ clearTimeout(this.reconnectTimeoutId);
787
+ this.reconnectTimeoutId = setTimeout(function() {
788
+ this.start()
789
+ }.bind(this), this.reconnectInterval * 1e3)
790
+ }
791
+ };
792
+ WSSource.prototype.onMessage = function(ev) {
793
+ var isFirstChunk = !this.established;
794
+ this.established = true;
795
+ if (isFirstChunk && this.onEstablishedCallback) {
796
+ this.onEstablishedCallback(this)
797
+ }
798
+ if (this.destination) {
799
+ this.destination.write(ev.data)
800
+ }
801
+ };
802
+ return WSSource
803
+ }();
804
+ JSMpeg.Demuxer.TS = function() {
805
+ "use strict";
806
+ var TS = function(options) {
807
+ this.bits = null;
808
+ this.leftoverBytes = null;
809
+ this.guessVideoFrameEnd = true;
810
+ this.pidsToStreamIds = {};
811
+ this.pesPacketInfo = {};
812
+ this.startTime = 0;
813
+ this.currentTime = 0
814
+ };
815
+ TS.prototype.connect = function(streamId, destination) {
816
+ this.pesPacketInfo[streamId] = {
817
+ destination: destination,
818
+ currentLength: 0,
819
+ totalLength: 0,
820
+ pts: 0,
821
+ buffers: []
822
+ }
823
+ };
824
+ TS.prototype.write = function(buffer) {
825
+ if (this.leftoverBytes) {
826
+ var totalLength = buffer.byteLength + this.leftoverBytes.byteLength;
827
+ this.bits = new JSMpeg.BitBuffer(totalLength);
828
+ this.bits.write([this.leftoverBytes, buffer])
829
+ } else {
830
+ this.bits = new JSMpeg.BitBuffer(buffer)
831
+ }
832
+ while (this.bits.has(188 << 3) && this.parsePacket()) {}
833
+ var leftoverCount = this.bits.byteLength - (this.bits.index >> 3);
834
+ this.leftoverBytes = leftoverCount > 0 ? this.bits.bytes.subarray(this.bits.index >> 3) : null
835
+ };
836
+ TS.prototype.parsePacket = function() {
837
+ if (this.bits.read(8) !== 71) {
838
+ if (!this.resync()) {
839
+ return false
840
+ }
841
+ }
842
+ var end = (this.bits.index >> 3) + 187;
843
+ var transportError = this.bits.read(1),
844
+ payloadStart = this.bits.read(1),
845
+ transportPriority = this.bits.read(1),
846
+ pid = this.bits.read(13),
847
+ transportScrambling = this.bits.read(2),
848
+ adaptationField = this.bits.read(2),
849
+ continuityCounter = this.bits.read(4);
850
+ var streamId = this.pidsToStreamIds[pid];
851
+ if (payloadStart && streamId) {
852
+ var pi = this.pesPacketInfo[streamId];
853
+ if (pi && pi.currentLength) {
854
+ this.packetComplete(pi)
855
+ }
856
+ }
857
+ if (adaptationField & 1) {
858
+ if (adaptationField & 2) {
859
+ var adaptationFieldLength = this.bits.read(8);
860
+ this.bits.skip(adaptationFieldLength << 3)
861
+ }
862
+ if (payloadStart && this.bits.nextBytesAreStartCode()) {
863
+ this.bits.skip(24);
864
+ streamId = this.bits.read(8);
865
+ this.pidsToStreamIds[pid] = streamId;
866
+ var packetLength = this.bits.read(16);
867
+ this.bits.skip(8);
868
+ var ptsDtsFlag = this.bits.read(2);
869
+ this.bits.skip(6);
870
+ var headerLength = this.bits.read(8);
871
+ var payloadBeginIndex = this.bits.index + (headerLength << 3);
872
+ var pi = this.pesPacketInfo[streamId];
873
+ if (pi) {
874
+ var pts = 0;
875
+ if (ptsDtsFlag & 2) {
876
+ this.bits.skip(4);
877
+ var p32_30 = this.bits.read(3);
878
+ this.bits.skip(1);
879
+ var p29_15 = this.bits.read(15);
880
+ this.bits.skip(1);
881
+ var p14_0 = this.bits.read(15);
882
+ this.bits.skip(1);
883
+ pts = (p32_30 * 1073741824 + p29_15 * 32768 + p14_0) / 9e4;
884
+ this.currentTime = pts;
885
+ if (this.startTime === -1) {
886
+ this.startTime = pts
887
+ }
888
+ }
889
+ var payloadLength = packetLength ? packetLength - headerLength - 3 : 0;
890
+ this.packetStart(pi, pts, payloadLength)
891
+ }
892
+ this.bits.index = payloadBeginIndex
893
+ }
894
+ if (streamId) {
895
+ var pi = this.pesPacketInfo[streamId];
896
+ if (pi) {
897
+ var start = this.bits.index >> 3;
898
+ var complete = this.packetAddData(pi, start, end);
899
+ var hasPadding = !payloadStart && adaptationField & 2;
900
+ if (complete || this.guessVideoFrameEnd && hasPadding) {
901
+ this.packetComplete(pi)
902
+ }
903
+ }
904
+ }
905
+ }
906
+ this.bits.index = end << 3;
907
+ return true
908
+ };
909
+ TS.prototype.resync = function() {
910
+ if (!this.bits.has(188 * 6 << 3)) {
911
+ return false
912
+ }
913
+ var byteIndex = this.bits.index >> 3;
914
+ for (var i = 0; i < 187; i++) {
915
+ if (this.bits.bytes[byteIndex + i] === 71) {
916
+ var foundSync = true;
917
+ for (var j = 1; j < 5; j++) {
918
+ if (this.bits.bytes[byteIndex + i + 188 * j] !== 71) {
919
+ foundSync = false;
920
+ break
921
+ }
922
+ }
923
+ if (foundSync) {
924
+ this.bits.index = byteIndex + i + 1 << 3;
925
+ return true
926
+ }
927
+ }
928
+ }
929
+ console.warn("JSMpeg: Possible garbage data. Skipping.");
930
+ this.bits.skip(187 << 3);
931
+ return false
932
+ };
933
+ TS.prototype.packetStart = function(pi, pts, payloadLength) {
934
+ pi.totalLength = payloadLength;
935
+ pi.currentLength = 0;
936
+ pi.pts = pts
937
+ };
938
+ TS.prototype.packetAddData = function(pi, start, end) {
939
+ pi.buffers.push(this.bits.bytes.subarray(start, end));
940
+ pi.currentLength += end - start;
941
+ var complete = pi.totalLength !== 0 && pi.currentLength >= pi.totalLength;
942
+ return complete
943
+ };
944
+ TS.prototype.packetComplete = function(pi) {
945
+ pi.destination.write(pi.pts, pi.buffers);
946
+ pi.totalLength = 0;
947
+ pi.currentLength = 0;
948
+ pi.buffers = []
949
+ };
950
+ TS.STREAM = {
951
+ PACK_HEADER: 186,
952
+ SYSTEM_HEADER: 187,
953
+ PROGRAM_MAP: 188,
954
+ PRIVATE_1: 189,
955
+ PADDING: 190,
956
+ PRIVATE_2: 191,
957
+ AUDIO_1: 192,
958
+ VIDEO_1: 224,
959
+ DIRECTORY: 255
960
+ };
961
+ return TS
962
+ }();
963
+ JSMpeg.Decoder.Base = function() {
964
+ "use strict";
965
+ var BaseDecoder = function(options) {
966
+ this.destination = null;
967
+ this.canPlay = false;
968
+ this.collectTimestamps = !options.streaming;
969
+ this.bytesWritten = 0;
970
+ this.timestamps = [];
971
+ this.timestampIndex = 0;
972
+ this.startTime = 0;
973
+ this.decodedTime = 0;
974
+ Object.defineProperty(this, "currentTime", {
975
+ get: this.getCurrentTime
976
+ })
977
+ };
978
+ BaseDecoder.prototype.destroy = function() {};
979
+ BaseDecoder.prototype.connect = function(destination) {
980
+ this.destination = destination
981
+ };
982
+ BaseDecoder.prototype.bufferGetIndex = function() {
983
+ return this.bits.index
984
+ };
985
+ BaseDecoder.prototype.bufferSetIndex = function(index) {
986
+ this.bits.index = index
987
+ };
988
+ BaseDecoder.prototype.bufferWrite = function(buffers) {
989
+ return this.bits.write(buffers)
990
+ };
991
+ BaseDecoder.prototype.write = function(pts, buffers) {
992
+ if (this.collectTimestamps) {
993
+ if (this.timestamps.length === 0) {
994
+ this.startTime = pts;
995
+ this.decodedTime = pts
996
+ }
997
+ this.timestamps.push({
998
+ index: this.bytesWritten << 3,
999
+ time: pts
1000
+ })
1001
+ }
1002
+ this.bytesWritten += this.bufferWrite(buffers);
1003
+ this.canPlay = true
1004
+ };
1005
+ BaseDecoder.prototype.seek = function(time) {
1006
+ if (!this.collectTimestamps) {
1007
+ return
1008
+ }
1009
+ this.timestampIndex = 0;
1010
+ for (var i = 0; i < this.timestamps.length; i++) {
1011
+ if (this.timestamps[i].time > time) {
1012
+ break
1013
+ }
1014
+ this.timestampIndex = i
1015
+ }
1016
+ var ts = this.timestamps[this.timestampIndex];
1017
+ if (ts) {
1018
+ this.bufferSetIndex(ts.index);
1019
+ this.decodedTime = ts.time
1020
+ } else {
1021
+ this.bufferSetIndex(0);
1022
+ this.decodedTime = this.startTime
1023
+ }
1024
+ };
1025
+ BaseDecoder.prototype.decode = function() {
1026
+ this.advanceDecodedTime(0)
1027
+ };
1028
+ BaseDecoder.prototype.advanceDecodedTime = function(seconds) {
1029
+ if (this.collectTimestamps) {
1030
+ var newTimestampIndex = -1;
1031
+ var currentIndex = this.bufferGetIndex();
1032
+ for (var i = this.timestampIndex; i < this.timestamps.length; i++) {
1033
+ if (this.timestamps[i].index > currentIndex) {
1034
+ break
1035
+ }
1036
+ newTimestampIndex = i
1037
+ }
1038
+ if (newTimestampIndex !== -1 && newTimestampIndex !== this.timestampIndex) {
1039
+ this.timestampIndex = newTimestampIndex;
1040
+ this.decodedTime = this.timestamps[this.timestampIndex].time;
1041
+ return
1042
+ }
1043
+ }
1044
+ this.decodedTime += seconds
1045
+ };
1046
+ BaseDecoder.prototype.getCurrentTime = function() {
1047
+ return this.decodedTime
1048
+ };
1049
+ return BaseDecoder
1050
+ }();
1051
+ JSMpeg.Decoder.MPEG1Video = function() {
1052
+ "use strict";
1053
+ var MPEG1 = function(options) {
1054
+ JSMpeg.Decoder.Base.call(this, options);
1055
+ this.onDecodeCallback = options.onVideoDecode;
1056
+ var bufferSize = options.videoBufferSize || 512 * 1024;
1057
+ var bufferMode = options.streaming ? JSMpeg.BitBuffer.MODE.EVICT : JSMpeg.BitBuffer.MODE.EXPAND;
1058
+ this.bits = new JSMpeg.BitBuffer(bufferSize, bufferMode);
1059
+ this.customIntraQuantMatrix = new Uint8Array(64);
1060
+ this.customNonIntraQuantMatrix = new Uint8Array(64);
1061
+ this.blockData = new Int32Array(64);
1062
+ this.currentFrame = 0;
1063
+ this.decodeFirstFrame = options.decodeFirstFrame !== false
1064
+ };
1065
+ MPEG1.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
1066
+ MPEG1.prototype.constructor = MPEG1;
1067
+ MPEG1.prototype.write = function(pts, buffers) {
1068
+ JSMpeg.Decoder.Base.prototype.write.call(this, pts, buffers);
1069
+ if (!this.hasSequenceHeader) {
1070
+ if (this.bits.findStartCode(MPEG1.START.SEQUENCE) === -1) {
1071
+ return false
1072
+ }
1073
+ this.decodeSequenceHeader();
1074
+ if (this.decodeFirstFrame) {
1075
+ this.decode()
1076
+ }
1077
+ }
1078
+ };
1079
+ MPEG1.prototype.decode = function() {
1080
+ var startTime = JSMpeg.Now();
1081
+ if (!this.hasSequenceHeader) {
1082
+ return false
1083
+ }
1084
+ if (this.bits.findStartCode(MPEG1.START.PICTURE) === -1) {
1085
+ var bufferedBytes = this.bits.byteLength - (this.bits.index >> 3);
1086
+ return false
1087
+ }
1088
+ this.decodePicture();
1089
+ this.advanceDecodedTime(1 / this.frameRate);
1090
+ var elapsedTime = JSMpeg.Now() - startTime;
1091
+ if (this.onDecodeCallback) {
1092
+ this.onDecodeCallback(this, elapsedTime)
1093
+ }
1094
+ return true
1095
+ };
1096
+ MPEG1.prototype.readHuffman = function(codeTable) {
1097
+ var state = 0;
1098
+ do {
1099
+ state = codeTable[state + this.bits.read(1)]
1100
+ } while (state >= 0 && codeTable[state] !== 0);
1101
+ return codeTable[state + 2]
1102
+ };
1103
+ MPEG1.prototype.frameRate = 30;
1104
+ MPEG1.prototype.decodeSequenceHeader = function() {
1105
+ var newWidth = this.bits.read(12),
1106
+ newHeight = this.bits.read(12);
1107
+ this.bits.skip(4);
1108
+ this.frameRate = MPEG1.PICTURE_RATE[this.bits.read(4)];
1109
+ this.bits.skip(18 + 1 + 10 + 1);
1110
+ if (newWidth !== this.width || newHeight !== this.height) {
1111
+ this.width = newWidth;
1112
+ this.height = newHeight;
1113
+ this.initBuffers();
1114
+ if (this.destination) {
1115
+ this.destination.resize(newWidth, newHeight)
1116
+ }
1117
+ }
1118
+ if (this.bits.read(1)) {
1119
+ for (var i = 0; i < 64; i++) {
1120
+ this.customIntraQuantMatrix[MPEG1.ZIG_ZAG[i]] = this.bits.read(8)
1121
+ }
1122
+ this.intraQuantMatrix = this.customIntraQuantMatrix
1123
+ }
1124
+ if (this.bits.read(1)) {
1125
+ for (var i = 0; i < 64; i++) {
1126
+ var idx = MPEG1.ZIG_ZAG[i];
1127
+ this.customNonIntraQuantMatrix[idx] = this.bits.read(8)
1128
+ }
1129
+ this.nonIntraQuantMatrix = this.customNonIntraQuantMatrix
1130
+ }
1131
+ this.hasSequenceHeader = true
1132
+ };
1133
+ MPEG1.prototype.initBuffers = function() {
1134
+ this.intraQuantMatrix = MPEG1.DEFAULT_INTRA_QUANT_MATRIX;
1135
+ this.nonIntraQuantMatrix = MPEG1.DEFAULT_NON_INTRA_QUANT_MATRIX;
1136
+ this.mbWidth = this.width + 15 >> 4;
1137
+ this.mbHeight = this.height + 15 >> 4;
1138
+ this.mbSize = this.mbWidth * this.mbHeight;
1139
+ this.codedWidth = this.mbWidth << 4;
1140
+ this.codedHeight = this.mbHeight << 4;
1141
+ this.codedSize = this.codedWidth * this.codedHeight;
1142
+ this.halfWidth = this.mbWidth << 3;
1143
+ this.halfHeight = this.mbHeight << 3;
1144
+ this.currentY = new Uint8ClampedArray(this.codedSize);
1145
+ this.currentY32 = new Uint32Array(this.currentY.buffer);
1146
+ this.currentCr = new Uint8ClampedArray(this.codedSize >> 2);
1147
+ this.currentCr32 = new Uint32Array(this.currentCr.buffer);
1148
+ this.currentCb = new Uint8ClampedArray(this.codedSize >> 2);
1149
+ this.currentCb32 = new Uint32Array(this.currentCb.buffer);
1150
+ this.forwardY = new Uint8ClampedArray(this.codedSize);
1151
+ this.forwardY32 = new Uint32Array(this.forwardY.buffer);
1152
+ this.forwardCr = new Uint8ClampedArray(this.codedSize >> 2);
1153
+ this.forwardCr32 = new Uint32Array(this.forwardCr.buffer);
1154
+ this.forwardCb = new Uint8ClampedArray(this.codedSize >> 2);
1155
+ this.forwardCb32 = new Uint32Array(this.forwardCb.buffer)
1156
+ };
1157
+ MPEG1.prototype.currentY = null;
1158
+ MPEG1.prototype.currentCr = null;
1159
+ MPEG1.prototype.currentCb = null;
1160
+ MPEG1.prototype.pictureType = 0;
1161
+ MPEG1.prototype.forwardY = null;
1162
+ MPEG1.prototype.forwardCr = null;
1163
+ MPEG1.prototype.forwardCb = null;
1164
+ MPEG1.prototype.fullPelForward = false;
1165
+ MPEG1.prototype.forwardFCode = 0;
1166
+ MPEG1.prototype.forwardRSize = 0;
1167
+ MPEG1.prototype.forwardF = 0;
1168
+ MPEG1.prototype.decodePicture = function(skipOutput) {
1169
+ this.currentFrame++;
1170
+ this.bits.skip(10);
1171
+ this.pictureType = this.bits.read(3);
1172
+ this.bits.skip(16);
1173
+ if (this.pictureType <= 0 || this.pictureType >= MPEG1.PICTURE_TYPE.B) {
1174
+ return
1175
+ }
1176
+ if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
1177
+ this.fullPelForward = this.bits.read(1);
1178
+ this.forwardFCode = this.bits.read(3);
1179
+ if (this.forwardFCode === 0) {
1180
+ return
1181
+ }
1182
+ this.forwardRSize = this.forwardFCode - 1;
1183
+ this.forwardF = 1 << this.forwardRSize
1184
+ }
1185
+ var code = 0;
1186
+ do {
1187
+ code = this.bits.findNextStartCode()
1188
+ } while (code === MPEG1.START.EXTENSION || code === MPEG1.START.USER_DATA);
1189
+ while (code >= MPEG1.START.SLICE_FIRST && code <= MPEG1.START.SLICE_LAST) {
1190
+ this.decodeSlice(code & 255);
1191
+ code = this.bits.findNextStartCode()
1192
+ }
1193
+ if (code !== -1) {
1194
+ this.bits.rewind(32)
1195
+ }
1196
+ if (this.destination) {
1197
+ this.destination.render(this.currentY, this.currentCr, this.currentCb, true)
1198
+ }
1199
+ if (this.pictureType === MPEG1.PICTURE_TYPE.INTRA || this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
1200
+ var tmpY = this.forwardY,
1201
+ tmpY32 = this.forwardY32,
1202
+ tmpCr = this.forwardCr,
1203
+ tmpCr32 = this.forwardCr32,
1204
+ tmpCb = this.forwardCb,
1205
+ tmpCb32 = this.forwardCb32;
1206
+ this.forwardY = this.currentY;
1207
+ this.forwardY32 = this.currentY32;
1208
+ this.forwardCr = this.currentCr;
1209
+ this.forwardCr32 = this.currentCr32;
1210
+ this.forwardCb = this.currentCb;
1211
+ this.forwardCb32 = this.currentCb32;
1212
+ this.currentY = tmpY;
1213
+ this.currentY32 = tmpY32;
1214
+ this.currentCr = tmpCr;
1215
+ this.currentCr32 = tmpCr32;
1216
+ this.currentCb = tmpCb;
1217
+ this.currentCb32 = tmpCb32
1218
+ }
1219
+ };
1220
+ MPEG1.prototype.quantizerScale = 0;
1221
+ MPEG1.prototype.sliceBegin = false;
1222
+ MPEG1.prototype.decodeSlice = function(slice) {
1223
+ this.sliceBegin = true;
1224
+ this.macroblockAddress = (slice - 1) * this.mbWidth - 1;
1225
+ this.motionFwH = this.motionFwHPrev = 0;
1226
+ this.motionFwV = this.motionFwVPrev = 0;
1227
+ this.dcPredictorY = 128;
1228
+ this.dcPredictorCr = 128;
1229
+ this.dcPredictorCb = 128;
1230
+ this.quantizerScale = this.bits.read(5);
1231
+ while (this.bits.read(1)) {
1232
+ this.bits.skip(8)
1233
+ }
1234
+ do {
1235
+ this.decodeMacroblock()
1236
+ } while (!this.bits.nextBytesAreStartCode())
1237
+ };
1238
+ MPEG1.prototype.macroblockAddress = 0;
1239
+ MPEG1.prototype.mbRow = 0;
1240
+ MPEG1.prototype.mbCol = 0;
1241
+ MPEG1.prototype.macroblockType = 0;
1242
+ MPEG1.prototype.macroblockIntra = false;
1243
+ MPEG1.prototype.macroblockMotFw = false;
1244
+ MPEG1.prototype.motionFwH = 0;
1245
+ MPEG1.prototype.motionFwV = 0;
1246
+ MPEG1.prototype.motionFwHPrev = 0;
1247
+ MPEG1.prototype.motionFwVPrev = 0;
1248
+ MPEG1.prototype.decodeMacroblock = function() {
1249
+ var increment = 0,
1250
+ t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT);
1251
+ while (t === 34) {
1252
+ t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT);
1253
+
1254
+ }
1255
+ while (t === 35) {
1256
+ increment += 33;
1257
+ t = this.readHuffman(MPEG1.MACROBLOCK_ADDRESS_INCREMENT)
1258
+ }
1259
+ increment += t;
1260
+ if (this.sliceBegin) {
1261
+ this.sliceBegin = false;
1262
+ this.macroblockAddress += increment
1263
+ } else {
1264
+ if (this.macroblockAddress + increment >= this.mbSize) {
1265
+ return
1266
+ }
1267
+ if (increment > 1) {
1268
+ this.dcPredictorY = 128;
1269
+ this.dcPredictorCr = 128;
1270
+ this.dcPredictorCb = 128;
1271
+ if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
1272
+ this.motionFwH = this.motionFwHPrev = 0;
1273
+ this.motionFwV = this.motionFwVPrev = 0
1274
+ }
1275
+ }
1276
+ while (increment > 1) {
1277
+ this.macroblockAddress++;
1278
+ this.mbRow = this.macroblockAddress / this.mbWidth | 0;
1279
+ this.mbCol = this.macroblockAddress % this.mbWidth;
1280
+ this.copyMacroblock(this.motionFwH, this.motionFwV, this.forwardY, this.forwardCr, this.forwardCb);
1281
+ increment--
1282
+ }
1283
+ this.macroblockAddress++
1284
+ }
1285
+ this.mbRow = this.macroblockAddress / this.mbWidth | 0;
1286
+ this.mbCol = this.macroblockAddress % this.mbWidth;
1287
+ var mbTable = MPEG1.MACROBLOCK_TYPE[this.pictureType];
1288
+ this.macroblockType = this.readHuffman(mbTable);
1289
+ this.macroblockIntra = this.macroblockType & 1;
1290
+ this.macroblockMotFw = this.macroblockType & 8;
1291
+ if ((this.macroblockType & 16) !== 0) {
1292
+ this.quantizerScale = this.bits.read(5)
1293
+ }
1294
+ if (this.macroblockIntra) {
1295
+ this.motionFwH = this.motionFwHPrev = 0;
1296
+ this.motionFwV = this.motionFwVPrev = 0
1297
+ } else {
1298
+ this.dcPredictorY = 128;
1299
+ this.dcPredictorCr = 128;
1300
+ this.dcPredictorCb = 128;
1301
+ this.decodeMotionVectors();
1302
+ this.copyMacroblock(this.motionFwH, this.motionFwV, this.forwardY, this.forwardCr, this.forwardCb)
1303
+ }
1304
+ var cbp = (this.macroblockType & 2) !== 0 ? this.readHuffman(MPEG1.CODE_BLOCK_PATTERN) : this.macroblockIntra ? 63 : 0;
1305
+ for (var block = 0, mask = 32; block < 6; block++) {
1306
+ if ((cbp & mask) !== 0) {
1307
+ this.decodeBlock(block)
1308
+ }
1309
+ mask >>= 1
1310
+ }
1311
+ };
1312
+ MPEG1.prototype.decodeMotionVectors = function() {
1313
+ var code, d, r = 0;
1314
+ if (this.macroblockMotFw) {
1315
+ code = this.readHuffman(MPEG1.MOTION);
1316
+ if (code !== 0 && this.forwardF !== 1) {
1317
+ r = this.bits.read(this.forwardRSize);
1318
+ d = (Math.abs(code) - 1 << this.forwardRSize) + r + 1;
1319
+ if (code < 0) {
1320
+ d = -d
1321
+ }
1322
+ } else {
1323
+ d = code
1324
+ }
1325
+ this.motionFwHPrev += d;
1326
+ if (this.motionFwHPrev > (this.forwardF << 4) - 1) {
1327
+ this.motionFwHPrev -= this.forwardF << 5
1328
+ } else if (this.motionFwHPrev < -this.forwardF << 4) {
1329
+ this.motionFwHPrev += this.forwardF << 5
1330
+ }
1331
+ this.motionFwH = this.motionFwHPrev;
1332
+ if (this.fullPelForward) {
1333
+ this.motionFwH <<= 1
1334
+ }
1335
+ code = this.readHuffman(MPEG1.MOTION);
1336
+ if (code !== 0 && this.forwardF !== 1) {
1337
+ r = this.bits.read(this.forwardRSize);
1338
+ d = (Math.abs(code) - 1 << this.forwardRSize) + r + 1;
1339
+ if (code < 0) {
1340
+ d = -d
1341
+ }
1342
+ } else {
1343
+ d = code
1344
+ }
1345
+ this.motionFwVPrev += d;
1346
+ if (this.motionFwVPrev > (this.forwardF << 4) - 1) {
1347
+ this.motionFwVPrev -= this.forwardF << 5
1348
+ } else if (this.motionFwVPrev < -this.forwardF << 4) {
1349
+ this.motionFwVPrev += this.forwardF << 5
1350
+ }
1351
+ this.motionFwV = this.motionFwVPrev;
1352
+ if (this.fullPelForward) {
1353
+ this.motionFwV <<= 1
1354
+ }
1355
+ } else if (this.pictureType === MPEG1.PICTURE_TYPE.PREDICTIVE) {
1356
+ this.motionFwH = this.motionFwHPrev = 0;
1357
+ this.motionFwV = this.motionFwVPrev = 0
1358
+ }
1359
+ };
1360
+ MPEG1.prototype.copyMacroblock = function(motionH, motionV, sY, sCr, sCb) {
1361
+ var width, scan, H, V, oddH, oddV, src, dest, last;
1362
+ var dY = this.currentY32,
1363
+ dCb = this.currentCb32,
1364
+ dCr = this.currentCr32;
1365
+ width = this.codedWidth;
1366
+ scan = width - 16;
1367
+ H = motionH >> 1;
1368
+ V = motionV >> 1;
1369
+ oddH = (motionH & 1) === 1;
1370
+ oddV = (motionV & 1) === 1;
1371
+ src = ((this.mbRow << 4) + V) * width + (this.mbCol << 4) + H;
1372
+ dest = this.mbRow * width + this.mbCol << 2;
1373
+ last = dest + (width << 2);
1374
+ var x, y1, y2, y;
1375
+ if (oddH) {
1376
+ if (oddV) {
1377
+ while (dest < last) {
1378
+ y1 = sY[src] + sY[src + width];
1379
+ src++;
1380
+ for (x = 0; x < 4; x++) {
1381
+ y2 = sY[src] + sY[src + width];
1382
+ src++;
1383
+ y = y1 + y2 + 2 >> 2 & 255;
1384
+ y1 = sY[src] + sY[src + width];
1385
+ src++;
1386
+ y |= y1 + y2 + 2 << 6 & 65280;
1387
+ y2 = sY[src] + sY[src + width];
1388
+ src++;
1389
+ y |= y1 + y2 + 2 << 14 & 16711680;
1390
+ y1 = sY[src] + sY[src + width];
1391
+ src++;
1392
+ y |= y1 + y2 + 2 << 22 & 4278190080;
1393
+ dY[dest++] = y
1394
+ }
1395
+ dest += scan >> 2;
1396
+ src += scan - 1
1397
+ }
1398
+ } else {
1399
+ while (dest < last) {
1400
+ y1 = sY[src++];
1401
+ for (x = 0; x < 4; x++) {
1402
+ y2 = sY[src++];
1403
+ y = y1 + y2 + 1 >> 1 & 255;
1404
+ y1 = sY[src++];
1405
+ y |= y1 + y2 + 1 << 7 & 65280;
1406
+ y2 = sY[src++];
1407
+ y |= y1 + y2 + 1 << 15 & 16711680;
1408
+ y1 = sY[src++];
1409
+ y |= y1 + y2 + 1 << 23 & 4278190080;
1410
+ dY[dest++] = y
1411
+ }
1412
+ dest += scan >> 2;
1413
+ src += scan - 1
1414
+ }
1415
+ }
1416
+ } else {
1417
+ if (oddV) {
1418
+ while (dest < last) {
1419
+ for (x = 0; x < 4; x++) {
1420
+ y = sY[src] + sY[src + width] + 1 >> 1 & 255;
1421
+ src++;
1422
+ y |= sY[src] + sY[src + width] + 1 << 7 & 65280;
1423
+ src++;
1424
+ y |= sY[src] + sY[src + width] + 1 << 15 & 16711680;
1425
+ src++;
1426
+ y |= sY[src] + sY[src + width] + 1 << 23 & 4278190080;
1427
+ src++;
1428
+ dY[dest++] = y
1429
+ }
1430
+ dest += scan >> 2;
1431
+ src += scan
1432
+ }
1433
+ } else {
1434
+ while (dest < last) {
1435
+ for (x = 0; x < 4; x++) {
1436
+ y = sY[src];
1437
+ src++;
1438
+ y |= sY[src] << 8;
1439
+ src++;
1440
+ y |= sY[src] << 16;
1441
+ src++;
1442
+ y |= sY[src] << 24;
1443
+ src++;
1444
+ dY[dest++] = y
1445
+ }
1446
+ dest += scan >> 2;
1447
+ src += scan
1448
+ }
1449
+ }
1450
+ }
1451
+ width = this.halfWidth;
1452
+ scan = width - 8;
1453
+ H = motionH / 2 >> 1;
1454
+ V = motionV / 2 >> 1;
1455
+ oddH = (motionH / 2 & 1) === 1;
1456
+ oddV = (motionV / 2 & 1) === 1;
1457
+ src = ((this.mbRow << 3) + V) * width + (this.mbCol << 3) + H;
1458
+ dest = this.mbRow * width + this.mbCol << 1;
1459
+ last = dest + (width << 1);
1460
+ var cr1, cr2, cr, cb1, cb2, cb;
1461
+ if (oddH) {
1462
+ if (oddV) {
1463
+ while (dest < last) {
1464
+ cr1 = sCr[src] + sCr[src + width];
1465
+ cb1 = sCb[src] + sCb[src + width];
1466
+ src++;
1467
+ for (x = 0; x < 2; x++) {
1468
+ cr2 = sCr[src] + sCr[src + width];
1469
+ cb2 = sCb[src] + sCb[src + width];
1470
+ src++;
1471
+ cr = cr1 + cr2 + 2 >> 2 & 255;
1472
+ cb = cb1 + cb2 + 2 >> 2 & 255;
1473
+ cr1 = sCr[src] + sCr[src + width];
1474
+ cb1 = sCb[src] + sCb[src + width];
1475
+ src++;
1476
+ cr |= cr1 + cr2 + 2 << 6 & 65280;
1477
+ cb |= cb1 + cb2 + 2 << 6 & 65280;
1478
+ cr2 = sCr[src] + sCr[src + width];
1479
+ cb2 = sCb[src] + sCb[src + width];
1480
+ src++;
1481
+ cr |= cr1 + cr2 + 2 << 14 & 16711680;
1482
+ cb |= cb1 + cb2 + 2 << 14 & 16711680;
1483
+ cr1 = sCr[src] + sCr[src + width];
1484
+ cb1 = sCb[src] + sCb[src + width];
1485
+ src++;
1486
+ cr |= cr1 + cr2 + 2 << 22 & 4278190080;
1487
+ cb |= cb1 + cb2 + 2 << 22 & 4278190080;
1488
+ dCr[dest] = cr;
1489
+ dCb[dest] = cb;
1490
+ dest++
1491
+ }
1492
+ dest += scan >> 2;
1493
+ src += scan - 1
1494
+ }
1495
+ } else {
1496
+ while (dest < last) {
1497
+ cr1 = sCr[src];
1498
+ cb1 = sCb[src];
1499
+ src++;
1500
+ for (x = 0; x < 2; x++) {
1501
+ cr2 = sCr[src];
1502
+ cb2 = sCb[src++];
1503
+ cr = cr1 + cr2 + 1 >> 1 & 255;
1504
+ cb = cb1 + cb2 + 1 >> 1 & 255;
1505
+ cr1 = sCr[src];
1506
+ cb1 = sCb[src++];
1507
+ cr |= cr1 + cr2 + 1 << 7 & 65280;
1508
+ cb |= cb1 + cb2 + 1 << 7 & 65280;
1509
+ cr2 = sCr[src];
1510
+ cb2 = sCb[src++];
1511
+ cr |= cr1 + cr2 + 1 << 15 & 16711680;
1512
+ cb |= cb1 + cb2 + 1 << 15 & 16711680;
1513
+ cr1 = sCr[src];
1514
+ cb1 = sCb[src++];
1515
+ cr |= cr1 + cr2 + 1 << 23 & 4278190080;
1516
+ cb |= cb1 + cb2 + 1 << 23 & 4278190080;
1517
+ dCr[dest] = cr;
1518
+ dCb[dest] = cb;
1519
+ dest++
1520
+ }
1521
+ dest += scan >> 2;
1522
+ src += scan - 1
1523
+ }
1524
+ }
1525
+ } else {
1526
+ if (oddV) {
1527
+ while (dest < last) {
1528
+ for (x = 0; x < 2; x++) {
1529
+ cr = sCr[src] + sCr[src + width] + 1 >> 1 & 255;
1530
+ cb = sCb[src] + sCb[src + width] + 1 >> 1 & 255;
1531
+ src++;
1532
+ cr |= sCr[src] + sCr[src + width] + 1 << 7 & 65280;
1533
+ cb |= sCb[src] + sCb[src + width] + 1 << 7 & 65280;
1534
+ src++;
1535
+ cr |= sCr[src] + sCr[src + width] + 1 << 15 & 16711680;
1536
+ cb |= sCb[src] + sCb[src + width] + 1 << 15 & 16711680;
1537
+ src++;
1538
+ cr |= sCr[src] + sCr[src + width] + 1 << 23 & 4278190080;
1539
+ cb |= sCb[src] + sCb[src + width] + 1 << 23 & 4278190080;
1540
+ src++;
1541
+ dCr[dest] = cr;
1542
+ dCb[dest] = cb;
1543
+ dest++
1544
+ }
1545
+ dest += scan >> 2;
1546
+ src += scan
1547
+ }
1548
+ } else {
1549
+ while (dest < last) {
1550
+ for (x = 0; x < 2; x++) {
1551
+ cr = sCr[src];
1552
+ cb = sCb[src];
1553
+ src++;
1554
+ cr |= sCr[src] << 8;
1555
+ cb |= sCb[src] << 8;
1556
+ src++;
1557
+ cr |= sCr[src] << 16;
1558
+ cb |= sCb[src] << 16;
1559
+ src++;
1560
+ cr |= sCr[src] << 24;
1561
+ cb |= sCb[src] << 24;
1562
+ src++;
1563
+ dCr[dest] = cr;
1564
+ dCb[dest] = cb;
1565
+ dest++
1566
+ }
1567
+ dest += scan >> 2;
1568
+ src += scan
1569
+ }
1570
+ }
1571
+ }
1572
+ };
1573
+ MPEG1.prototype.dcPredictorY = 0;
1574
+ MPEG1.prototype.dcPredictorCr = 0;
1575
+ MPEG1.prototype.dcPredictorCb = 0;
1576
+ MPEG1.prototype.blockData = null;
1577
+ MPEG1.prototype.decodeBlock = function(block) {
1578
+ var n = 0,
1579
+ quantMatrix;
1580
+ if (this.macroblockIntra) {
1581
+ var predictor, dctSize;
1582
+ if (block < 4) {
1583
+ predictor = this.dcPredictorY;
1584
+ dctSize = this.readHuffman(MPEG1.DCT_DC_SIZE_LUMINANCE)
1585
+ } else {
1586
+ predictor = block === 4 ? this.dcPredictorCr : this.dcPredictorCb;
1587
+ dctSize = this.readHuffman(MPEG1.DCT_DC_SIZE_CHROMINANCE)
1588
+ }
1589
+ if (dctSize > 0) {
1590
+ var differential = this.bits.read(dctSize);
1591
+ if ((differential & 1 << dctSize - 1) !== 0) {
1592
+ this.blockData[0] = predictor + differential
1593
+ } else {
1594
+ this.blockData[0] = predictor + (-1 << dctSize | differential + 1)
1595
+ }
1596
+ } else {
1597
+ this.blockData[0] = predictor
1598
+ }
1599
+ if (block < 4) {
1600
+ this.dcPredictorY = this.blockData[0]
1601
+ } else if (block === 4) {
1602
+ this.dcPredictorCr = this.blockData[0]
1603
+ } else {
1604
+ this.dcPredictorCb = this.blockData[0]
1605
+ }
1606
+ this.blockData[0] <<= 3 + 5;
1607
+ quantMatrix = this.intraQuantMatrix;
1608
+ n = 1
1609
+ } else {
1610
+ quantMatrix = this.nonIntraQuantMatrix
1611
+ }
1612
+ var level = 0;
1613
+ while (true) {
1614
+ var run = 0,
1615
+ coeff = this.readHuffman(MPEG1.DCT_COEFF);
1616
+ if (coeff === 1 && n > 0 && this.bits.read(1) === 0) {
1617
+ break
1618
+ }
1619
+ if (coeff === 65535) {
1620
+ run = this.bits.read(6);
1621
+ level = this.bits.read(8);
1622
+ if (level === 0) {
1623
+ level = this.bits.read(8)
1624
+ } else if (level === 128) {
1625
+ level = this.bits.read(8) - 256
1626
+ } else if (level > 128) {
1627
+ level = level - 256
1628
+ }
1629
+ } else {
1630
+ run = coeff >> 8;
1631
+ level = coeff & 255;
1632
+ if (this.bits.read(1)) {
1633
+ level = -level
1634
+ }
1635
+ }
1636
+ n += run;
1637
+ var dezigZagged = MPEG1.ZIG_ZAG[n];
1638
+ n++;
1639
+ level <<= 1;
1640
+ if (!this.macroblockIntra) {
1641
+ level += level < 0 ? -1 : 1
1642
+ }
1643
+ level = level * this.quantizerScale * quantMatrix[dezigZagged] >> 4;
1644
+ if ((level & 1) === 0) {
1645
+ level -= level > 0 ? 1 : -1
1646
+ }
1647
+ if (level > 2047) {
1648
+ level = 2047
1649
+ } else if (level < -2048) {
1650
+ level = -2048
1651
+ }
1652
+ this.blockData[dezigZagged] = level * MPEG1.PREMULTIPLIER_MATRIX[dezigZagged]
1653
+ }
1654
+ var destArray, destIndex, scan;
1655
+ if (block < 4) {
1656
+ destArray = this.currentY;
1657
+ scan = this.codedWidth - 8;
1658
+ destIndex = this.mbRow * this.codedWidth + this.mbCol << 4;
1659
+ if ((block & 1) !== 0) {
1660
+ destIndex += 8
1661
+ }
1662
+ if ((block & 2) !== 0) {
1663
+ destIndex += this.codedWidth << 3
1664
+ }
1665
+ } else {
1666
+ destArray = block === 4 ? this.currentCb : this.currentCr;
1667
+ scan = (this.codedWidth >> 1) - 8;
1668
+ destIndex = (this.mbRow * this.codedWidth << 2) + (this.mbCol << 3)
1669
+ }
1670
+ if (this.macroblockIntra) {
1671
+ if (n === 1) {
1672
+ MPEG1.CopyValueToDestination(this.blockData[0] + 128 >> 8, destArray, destIndex, scan);
1673
+ this.blockData[0] = 0
1674
+ } else {
1675
+ MPEG1.IDCT(this.blockData);
1676
+ MPEG1.CopyBlockToDestination(this.blockData, destArray, destIndex, scan);
1677
+ JSMpeg.Fill(this.blockData, 0)
1678
+ }
1679
+ } else {
1680
+ if (n === 1) {
1681
+ MPEG1.AddValueToDestination(this.blockData[0] + 128 >> 8, destArray, destIndex, scan);
1682
+ this.blockData[0] = 0
1683
+ } else {
1684
+ MPEG1.IDCT(this.blockData);
1685
+ MPEG1.AddBlockToDestination(this.blockData, destArray, destIndex, scan);
1686
+ JSMpeg.Fill(this.blockData, 0)
1687
+ }
1688
+ }
1689
+ n = 0
1690
+ };
1691
+ MPEG1.CopyBlockToDestination = function(block, dest, index, scan) {
1692
+ for (var n = 0; n < 64; n += 8, index += scan + 8) {
1693
+ dest[index + 0] = block[n + 0];
1694
+ dest[index + 1] = block[n + 1];
1695
+ dest[index + 2] = block[n + 2];
1696
+ dest[index + 3] = block[n + 3];
1697
+ dest[index + 4] = block[n + 4];
1698
+ dest[index + 5] = block[n + 5];
1699
+ dest[index + 6] = block[n + 6];
1700
+ dest[index + 7] = block[n + 7]
1701
+ }
1702
+ };
1703
+ MPEG1.AddBlockToDestination = function(block, dest, index, scan) {
1704
+ for (var n = 0; n < 64; n += 8, index += scan + 8) {
1705
+ dest[index + 0] += block[n + 0];
1706
+ dest[index + 1] += block[n + 1];
1707
+ dest[index + 2] += block[n + 2];
1708
+ dest[index + 3] += block[n + 3];
1709
+ dest[index + 4] += block[n + 4];
1710
+ dest[index + 5] += block[n + 5];
1711
+ dest[index + 6] += block[n + 6];
1712
+ dest[index + 7] += block[n + 7]
1713
+ }
1714
+ };
1715
+ MPEG1.CopyValueToDestination = function(value, dest, index, scan) {
1716
+ for (var n = 0; n < 64; n += 8, index += scan + 8) {
1717
+ dest[index + 0] = value;
1718
+ dest[index + 1] = value;
1719
+ dest[index + 2] = value;
1720
+ dest[index + 3] = value;
1721
+ dest[index + 4] = value;
1722
+ dest[index + 5] = value;
1723
+ dest[index + 6] = value;
1724
+ dest[index + 7] = value
1725
+ }
1726
+ };
1727
+ MPEG1.AddValueToDestination = function(value, dest, index, scan) {
1728
+ for (var n = 0; n < 64; n += 8, index += scan + 8) {
1729
+ dest[index + 0] += value;
1730
+ dest[index + 1] += value;
1731
+ dest[index + 2] += value;
1732
+ dest[index + 3] += value;
1733
+ dest[index + 4] += value;
1734
+ dest[index + 5] += value;
1735
+ dest[index + 6] += value;
1736
+ dest[index + 7] += value
1737
+ }
1738
+ };
1739
+ MPEG1.IDCT = function(block) {
1740
+ var b1, b3, b4, b6, b7, tmp1, tmp2, m0, x0, x1, x2, x3, x4, y3, y4, y5, y6, y7;
1741
+ for (var i = 0; i < 8; ++i) {
1742
+ b1 = block[4 * 8 + i];
1743
+ b3 = block[2 * 8 + i] + block[6 * 8 + i];
1744
+ b4 = block[5 * 8 + i] - block[3 * 8 + i];
1745
+ tmp1 = block[1 * 8 + i] + block[7 * 8 + i];
1746
+ tmp2 = block[3 * 8 + i] + block[5 * 8 + i];
1747
+ b6 = block[1 * 8 + i] - block[7 * 8 + i];
1748
+ b7 = tmp1 + tmp2;
1749
+ m0 = block[0 * 8 + i];
1750
+ x4 = (b6 * 473 - b4 * 196 + 128 >> 8) - b7;
1751
+ x0 = x4 - ((tmp1 - tmp2) * 362 + 128 >> 8);
1752
+ x1 = m0 - b1;
1753
+ x2 = ((block[2 * 8 + i] - block[6 * 8 + i]) * 362 + 128 >> 8) - b3;
1754
+ x3 = m0 + b1;
1755
+ y3 = x1 + x2;
1756
+ y4 = x3 + b3;
1757
+ y5 = x1 - x2;
1758
+ y6 = x3 - b3;
1759
+ y7 = -x0 - (b4 * 473 + b6 * 196 + 128 >> 8);
1760
+ block[0 * 8 + i] = b7 + y4;
1761
+ block[1 * 8 + i] = x4 + y3;
1762
+ block[2 * 8 + i] = y5 - x0;
1763
+ block[3 * 8 + i] = y6 - y7;
1764
+ block[4 * 8 + i] = y6 + y7;
1765
+ block[5 * 8 + i] = x0 + y5;
1766
+ block[6 * 8 + i] = y3 - x4;
1767
+ block[7 * 8 + i] = y4 - b7
1768
+ }
1769
+ for (var i = 0; i < 64; i += 8) {
1770
+ b1 = block[4 + i];
1771
+ b3 = block[2 + i] + block[6 + i];
1772
+ b4 = block[5 + i] - block[3 + i];
1773
+ tmp1 = block[1 + i] + block[7 + i];
1774
+ tmp2 = block[3 + i] + block[5 + i];
1775
+ b6 = block[1 + i] - block[7 + i];
1776
+ b7 = tmp1 + tmp2;
1777
+ m0 = block[0 + i];
1778
+ x4 = (b6 * 473 - b4 * 196 + 128 >> 8) - b7;
1779
+ x0 = x4 - ((tmp1 - tmp2) * 362 + 128 >> 8);
1780
+ x1 = m0 - b1;
1781
+ x2 = ((block[2 + i] - block[6 + i]) * 362 + 128 >> 8) - b3;
1782
+ x3 = m0 + b1;
1783
+ y3 = x1 + x2;
1784
+ y4 = x3 + b3;
1785
+ y5 = x1 - x2;
1786
+ y6 = x3 - b3;
1787
+ y7 = -x0 - (b4 * 473 + b6 * 196 + 128 >> 8);
1788
+ block[0 + i] = b7 + y4 + 128 >> 8;
1789
+ block[1 + i] = x4 + y3 + 128 >> 8;
1790
+ block[2 + i] = y5 - x0 + 128 >> 8;
1791
+ block[3 + i] = y6 - y7 + 128 >> 8;
1792
+ block[4 + i] = y6 + y7 + 128 >> 8;
1793
+ block[5 + i] = x0 + y5 + 128 >> 8;
1794
+ block[6 + i] = y3 - x4 + 128 >> 8;
1795
+ block[7 + i] = y4 - b7 + 128 >> 8
1796
+ }
1797
+ };
1798
+ MPEG1.PICTURE_RATE = [0, 23.976, 24, 25, 29.97, 30, 50, 59.94, 60, 0, 0, 0, 0, 0, 0, 0];
1799
+ MPEG1.ZIG_ZAG = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
1800
+ MPEG1.DEFAULT_INTRA_QUANT_MATRIX = new Uint8Array([8, 16, 19, 22, 26, 27, 29, 34, 16, 16, 22, 24, 27, 29, 34, 37, 19, 22, 26, 27, 29, 34, 34, 38, 22, 22, 26, 27, 29, 34, 37, 40, 22, 26, 27, 29, 32, 35, 40, 48, 26, 27, 29, 32, 35, 40, 48, 58, 26, 27, 29, 34, 38, 46, 56, 69, 27, 29, 35, 38, 46, 56, 69, 83]);
1801
+ MPEG1.DEFAULT_NON_INTRA_QUANT_MATRIX = new Uint8Array([16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]);
1802
+ MPEG1.PREMULTIPLIER_MATRIX = new Uint8Array([32, 44, 42, 38, 32, 25, 17, 9, 44, 62, 58, 52, 44, 35, 24, 12, 42, 58, 55, 49, 42, 33, 23, 12, 38, 52, 49, 44, 38, 30, 20, 10, 32, 44, 42, 38, 32, 25, 17, 9, 25, 35, 33, 30, 25, 20, 14, 7, 17, 24, 23, 20, 17, 14, 9, 5, 9, 12, 12, 10, 9, 7, 5, 2]);
1803
+ MPEG1.MACROBLOCK_ADDRESS_INCREMENT = new Int16Array([1 * 3, 2 * 3, 0, 3 * 3, 4 * 3, 0, 0, 0, 1, 5 * 3, 6 * 3, 0, 7 * 3, 8 * 3, 0, 9 * 3, 10 * 3, 0, 11 * 3, 12 * 3, 0, 0, 0, 3, 0, 0, 2, 13 * 3, 14 * 3, 0, 15 * 3, 16 * 3, 0, 0, 0, 5, 0, 0, 4, 17 * 3, 18 * 3, 0, 19 * 3, 20 * 3, 0, 0, 0, 7, 0, 0, 6, 21 * 3, 22 * 3, 0, 23 * 3, 24 * 3, 0, 25 * 3, 26 * 3, 0, 27 * 3, 28 * 3, 0, -1, 29 * 3, 0, -1, 30 * 3, 0, 31 * 3, 32 * 3, 0, 33 * 3, 34 * 3, 0, 35 * 3, 36 * 3, 0, 37 * 3, 38 * 3, 0, 0, 0, 9, 0, 0, 8, 39 * 3, 40 * 3, 0, 41 * 3, 42 * 3, 0, 43 * 3, 44 * 3, 0, 45 * 3, 46 * 3, 0, 0, 0, 15, 0, 0, 14, 0, 0, 13, 0, 0, 12, 0, 0, 11, 0, 0, 10, 47 * 3, -1, 0, -1, 48 * 3, 0, 49 * 3, 50 * 3, 0, 51 * 3, 52 * 3, 0, 53 * 3, 54 * 3, 0, 55 * 3, 56 * 3, 0, 57 * 3, 58 * 3, 0, 59 * 3, 60 * 3, 0, 61 * 3, -1, 0, -1, 62 * 3, 0, 63 * 3, 64 * 3, 0, 65 * 3, 66 * 3, 0, 67 * 3, 68 * 3, 0, 69 * 3, 70 * 3, 0, 71 * 3, 72 * 3, 0, 73 * 3, 74 * 3, 0, 0, 0, 21, 0, 0, 20, 0, 0, 19, 0, 0, 18, 0, 0, 17, 0, 0, 16, 0, 0, 35, 0, 0, 34, 0, 0, 33, 0, 0, 32, 0, 0, 31, 0, 0, 30, 0, 0, 29, 0, 0, 28, 0, 0, 27, 0, 0, 26, 0, 0, 25, 0, 0, 24, 0, 0, 23, 0, 0, 22]);
1804
+ MPEG1.MACROBLOCK_TYPE_INTRA = new Int8Array([1 * 3, 2 * 3, 0, -1, 3 * 3, 0, 0, 0, 1, 0, 0, 17]);
1805
+ MPEG1.MACROBLOCK_TYPE_PREDICTIVE = new Int8Array([1 * 3, 2 * 3, 0, 3 * 3, 4 * 3, 0, 0, 0, 10, 5 * 3, 6 * 3, 0, 0, 0, 2, 7 * 3, 8 * 3, 0, 0, 0, 8, 9 * 3, 10 * 3, 0, 11 * 3, 12 * 3, 0, -1, 13 * 3, 0, 0, 0, 18, 0, 0, 26, 0, 0, 1, 0, 0, 17]);
1806
+ MPEG1.MACROBLOCK_TYPE_B = new Int8Array([1 * 3, 2 * 3, 0, 3 * 3, 5 * 3, 0, 4 * 3, 6 * 3, 0, 8 * 3, 7 * 3, 0, 0, 0, 12, 9 * 3, 10 * 3, 0, 0, 0, 14, 13 * 3, 14 * 3, 0, 12 * 3, 11 * 3, 0, 0, 0, 4, 0, 0, 6, 18 * 3, 16 * 3, 0, 15 * 3, 17 * 3, 0, 0, 0, 8, 0, 0, 10, -1, 19 * 3, 0, 0, 0, 1, 20 * 3, 21 * 3, 0, 0, 0, 30, 0, 0, 17, 0, 0, 22, 0, 0, 26]);
1807
+ MPEG1.MACROBLOCK_TYPE = [null, MPEG1.MACROBLOCK_TYPE_INTRA, MPEG1.MACROBLOCK_TYPE_PREDICTIVE, MPEG1.MACROBLOCK_TYPE_B];
1808
+ MPEG1.CODE_BLOCK_PATTERN = new Int16Array([2 * 3, 1 * 3, 0, 3 * 3, 6 * 3, 0, 4 * 3, 5 * 3, 0, 8 * 3, 11 * 3, 0, 12 * 3, 13 * 3, 0, 9 * 3, 7 * 3, 0, 10 * 3, 14 * 3, 0, 20 * 3, 19 * 3, 0, 18 * 3, 16 * 3, 0, 23 * 3, 17 * 3, 0, 27 * 3, 25 * 3, 0, 21 * 3, 28 * 3, 0, 15 * 3, 22 * 3, 0, 24 * 3, 26 * 3, 0, 0, 0, 60, 35 * 3, 40 * 3, 0, 44 * 3, 48 * 3, 0, 38 * 3, 36 * 3, 0, 42 * 3, 47 * 3, 0, 29 * 3, 31 * 3, 0, 39 * 3, 32 * 3, 0, 0, 0, 32, 45 * 3, 46 * 3, 0, 33 * 3, 41 * 3, 0, 43 * 3, 34 * 3, 0, 0, 0, 4, 30 * 3, 37 * 3, 0, 0, 0, 8, 0, 0, 16, 0, 0, 44, 50 * 3, 56 * 3, 0, 0, 0, 28, 0, 0, 52, 0, 0, 62, 61 * 3, 59 * 3, 0, 52 * 3, 60 * 3, 0, 0, 0, 1, 55 * 3, 54 * 3, 0, 0, 0, 61, 0, 0, 56, 57 * 3, 58 * 3, 0, 0, 0, 2, 0, 0, 40, 51 * 3, 62 * 3, 0, 0, 0, 48, 64 * 3, 63 * 3, 0, 49 * 3, 53 * 3, 0, 0, 0, 20, 0, 0, 12, 80 * 3, 83 * 3, 0, 0, 0, 63, 77 * 3, 75 * 3, 0, 65 * 3, 73 * 3, 0, 84 * 3, 66 * 3, 0, 0, 0, 24, 0, 0, 36, 0, 0, 3, 69 * 3, 87 * 3, 0, 81 * 3, 79 * 3, 0, 68 * 3, 71 * 3, 0, 70 * 3, 78 * 3, 0, 67 * 3, 76 * 3, 0, 72 * 3, 74 * 3, 0, 86 * 3, 85 * 3, 0, 88 * 3, 82 * 3, 0, -1, 94 * 3, 0, 95 * 3, 97 * 3, 0, 0, 0, 33, 0, 0, 9, 106 * 3, 110 * 3, 0, 102 * 3, 116 * 3, 0, 0, 0, 5, 0, 0, 10, 93 * 3, 89 * 3, 0, 0, 0, 6, 0, 0, 18, 0, 0, 17, 0, 0, 34, 113 * 3, 119 * 3, 0, 103 * 3, 104 * 3, 0, 90 * 3, 92 * 3, 0, 109 * 3, 107 * 3, 0, 117 * 3, 118 * 3, 0, 101 * 3, 99 * 3, 0, 98 * 3, 96 * 3, 0, 100 * 3, 91 * 3, 0, 114 * 3, 115 * 3, 0, 105 * 3, 108 * 3, 0, 112 * 3, 111 * 3, 0, 121 * 3, 125 * 3, 0, 0, 0, 41, 0, 0, 14, 0, 0, 21, 124 * 3, 122 * 3, 0, 120 * 3, 123 * 3, 0, 0, 0, 11, 0, 0, 19, 0, 0, 7, 0, 0, 35, 0, 0, 13, 0, 0, 50, 0, 0, 49, 0, 0, 58, 0, 0, 37, 0, 0, 25, 0, 0, 45, 0, 0, 57, 0, 0, 26, 0, 0, 29, 0, 0, 38, 0, 0, 53, 0, 0, 23, 0, 0, 43, 0, 0, 46, 0, 0, 42, 0, 0, 22, 0, 0, 54, 0, 0, 51, 0, 0, 15, 0, 0, 30, 0, 0, 39, 0, 0, 47, 0, 0, 55, 0, 0, 27, 0, 0, 59, 0, 0, 31]);
1809
+ MPEG1.MOTION = new Int16Array([1 * 3, 2 * 3, 0, 4 * 3, 3 * 3, 0, 0, 0, 0, 6 * 3, 5 * 3, 0, 8 * 3, 7 * 3, 0, 0, 0, -1, 0, 0, 1, 9 * 3, 10 * 3, 0, 12 * 3, 11 * 3, 0, 0, 0, 2, 0, 0, -2, 14 * 3, 15 * 3, 0, 16 * 3, 13 * 3, 0, 20 * 3, 18 * 3, 0, 0, 0, 3, 0, 0, -3, 17 * 3, 19 * 3, 0, -1, 23 * 3, 0, 27 * 3, 25 * 3, 0, 26 * 3, 21 * 3, 0, 24 * 3, 22 * 3, 0, 32 * 3, 28 * 3, 0, 29 * 3, 31 * 3, 0, -1, 33 * 3, 0, 36 * 3, 35 * 3, 0, 0, 0, -4, 30 * 3, 34 * 3, 0, 0, 0, 4, 0, 0, -7, 0, 0, 5, 37 * 3, 41 * 3, 0, 0, 0, -5, 0, 0, 7, 38 * 3, 40 * 3, 0, 42 * 3, 39 * 3, 0, 0, 0, -6, 0, 0, 6, 51 * 3, 54 * 3, 0, 50 * 3, 49 * 3, 0, 45 * 3, 46 * 3, 0, 52 * 3, 47 * 3, 0, 43 * 3, 53 * 3, 0, 44 * 3, 48 * 3, 0, 0, 0, 10, 0, 0, 9, 0, 0, 8, 0, 0, -8, 57 * 3, 66 * 3, 0, 0, 0, -9, 60 * 3, 64 * 3, 0, 56 * 3, 61 * 3, 0, 55 * 3, 62 * 3, 0, 58 * 3, 63 * 3, 0, 0, 0, -10, 59 * 3, 65 * 3, 0, 0, 0, 12, 0, 0, 16, 0, 0, 13, 0, 0, 14, 0, 0, 11, 0, 0, 15, 0, 0, -16, 0, 0, -12, 0, 0, -14, 0, 0, -15, 0, 0, -11, 0, 0, -13]);
1810
+ MPEG1.DCT_DC_SIZE_LUMINANCE = new Int8Array([2 * 3, 1 * 3, 0, 6 * 3, 5 * 3, 0, 3 * 3, 4 * 3, 0, 0, 0, 1, 0, 0, 2, 9 * 3, 8 * 3, 0, 7 * 3, 10 * 3, 0, 0, 0, 0, 12 * 3, 11 * 3, 0, 0, 0, 4, 0, 0, 3, 13 * 3, 14 * 3, 0, 0, 0, 5, 0, 0, 6, 16 * 3, 15 * 3, 0, 17 * 3, -1, 0, 0, 0, 7, 0, 0, 8]);
1811
+ MPEG1.DCT_DC_SIZE_CHROMINANCE = new Int8Array([2 * 3, 1 * 3, 0, 4 * 3, 3 * 3, 0, 6 * 3, 5 * 3, 0, 8 * 3, 7 * 3, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 10 * 3, 9 * 3, 0, 0, 0, 3, 12 * 3, 11 * 3, 0, 0, 0, 4, 14 * 3, 13 * 3, 0, 0, 0, 5, 16 * 3, 15 * 3, 0, 0, 0, 6, 17 * 3, -1, 0, 0, 0, 7, 0, 0, 8]);
1812
+ MPEG1.DCT_COEFF = new Int32Array([1 * 3, 2 * 3, 0, 4 * 3, 3 * 3, 0, 0, 0, 1, 7 * 3, 8 * 3, 0, 6 * 3, 5 * 3, 0, 13 * 3, 9 * 3, 0, 11 * 3, 10 * 3, 0, 14 * 3, 12 * 3, 0, 0, 0, 257, 20 * 3, 22 * 3, 0, 18 * 3, 21 * 3, 0, 16 * 3, 19 * 3, 0, 0, 0, 513, 17 * 3, 15 * 3, 0, 0, 0, 2, 0, 0, 3, 27 * 3, 25 * 3, 0, 29 * 3, 31 * 3, 0, 24 * 3, 26 * 3, 0, 32 * 3, 30 * 3, 0, 0, 0, 1025, 23 * 3, 28 * 3, 0, 0, 0, 769, 0, 0, 258, 0, 0, 1793, 0, 0, 65535, 0, 0, 1537, 37 * 3, 36 * 3, 0, 0, 0, 1281, 35 * 3, 34 * 3, 0, 39 * 3, 38 * 3, 0, 33 * 3, 42 * 3, 0, 40 * 3, 41 * 3, 0, 52 * 3, 50 * 3, 0, 54 * 3, 53 * 3, 0, 48 * 3, 49 * 3, 0, 43 * 3, 45 * 3, 0, 46 * 3, 44 * 3, 0, 0, 0, 2049, 0, 0, 4, 0, 0, 514, 0, 0, 2305, 51 * 3, 47 * 3, 0, 55 * 3, 57 * 3, 0, 60 * 3, 56 * 3, 0, 59 * 3, 58 * 3, 0, 61 * 3, 62 * 3, 0, 0, 0, 2561, 0, 0, 3329, 0, 0, 6, 0, 0, 259, 0, 0, 5, 0, 0, 770, 0, 0, 2817, 0, 0, 3073, 76 * 3, 75 * 3, 0, 67 * 3, 70 * 3, 0, 73 * 3, 71 * 3, 0, 78 * 3, 74 * 3, 0, 72 * 3, 77 * 3, 0, 69 * 3, 64 * 3, 0, 68 * 3, 63 * 3, 0, 66 * 3, 65 * 3, 0, 81 * 3, 87 * 3, 0, 91 * 3, 80 * 3, 0, 82 * 3, 79 * 3, 0, 83 * 3, 86 * 3, 0, 93 * 3, 92 * 3, 0, 84 * 3, 85 * 3, 0, 90 * 3, 94 * 3, 0, 88 * 3, 89 * 3, 0, 0, 0, 515, 0, 0, 260, 0, 0, 7, 0, 0, 1026, 0, 0, 1282, 0, 0, 4097, 0, 0, 3841, 0, 0, 3585, 105 * 3, 107 * 3, 0, 111 * 3, 114 * 3, 0, 104 * 3, 97 * 3, 0, 125 * 3, 119 * 3, 0, 96 * 3, 98 * 3, 0, -1, 123 * 3, 0, 95 * 3, 101 * 3, 0, 106 * 3, 121 * 3, 0, 99 * 3, 102 * 3, 0, 113 * 3, 103 * 3, 0, 112 * 3, 116 * 3, 0, 110 * 3, 100 * 3, 0, 124 * 3, 115 * 3, 0, 117 * 3, 122 * 3, 0, 109 * 3, 118 * 3, 0, 120 * 3, 108 * 3, 0, 127 * 3, 136 * 3, 0, 139 * 3, 140 * 3, 0, 130 * 3, 126 * 3, 0, 145 * 3, 146 * 3, 0, 128 * 3, 129 * 3, 0, 0, 0, 2050, 132 * 3, 134 * 3, 0, 155 * 3, 154 * 3, 0, 0, 0, 8, 137 * 3, 133 * 3, 0, 143 * 3, 144 * 3, 0, 151 * 3, 138 * 3, 0, 142 * 3, 141 * 3, 0, 0, 0, 10, 0, 0, 9, 0, 0, 11, 0, 0, 5377, 0, 0, 1538, 0, 0, 771, 0, 0, 5121, 0, 0, 1794, 0, 0, 4353, 0, 0, 4609, 0, 0, 4865, 148 * 3, 152 * 3, 0, 0, 0, 1027, 153 * 3, 150 * 3, 0, 0, 0, 261, 131 * 3, 135 * 3, 0, 0, 0, 516, 149 * 3, 147 * 3, 0, 172 * 3, 173 * 3, 0, 162 * 3, 158 * 3, 0, 170 * 3, 161 * 3, 0, 168 * 3, 166 * 3, 0, 157 * 3, 179 * 3, 0, 169 * 3, 167 * 3, 0, 174 * 3, 171 * 3, 0, 178 * 3, 177 * 3, 0, 156 * 3, 159 * 3, 0, 164 * 3, 165 * 3, 0, 183 * 3, 182 * 3, 0, 175 * 3, 176 * 3, 0, 0, 0, 263, 0, 0, 2562, 0, 0, 2306, 0, 0, 5633, 0, 0, 5889, 0, 0, 6401, 0, 0, 6145, 0, 0, 1283, 0, 0, 772, 0, 0, 13, 0, 0, 12, 0, 0, 14, 0, 0, 15, 0, 0, 517, 0, 0, 6657, 0, 0, 262, 180 * 3, 181 * 3, 0, 160 * 3, 163 * 3, 0, 196 * 3, 199 * 3, 0, 0, 0, 27, 203 * 3, 185 * 3, 0, 202 * 3, 201 * 3, 0, 0, 0, 19, 0, 0, 22, 197 * 3, 207 * 3, 0, 0, 0, 18, 191 * 3, 192 * 3, 0, 188 * 3, 190 * 3, 0, 0, 0, 20, 184 * 3, 194 * 3, 0, 0, 0, 21, 186 * 3, 193 * 3, 0, 0, 0, 23, 204 * 3, 198 * 3, 0, 0, 0, 25, 0, 0, 24, 200 * 3, 205 * 3, 0, 0, 0, 31, 0, 0, 30, 0, 0, 28, 0, 0, 29, 0, 0, 26, 0, 0, 17, 0, 0, 16, 189 * 3, 206 * 3, 0, 187 * 3, 195 * 3, 0, 218 * 3, 211 * 3, 0, 0, 0, 37, 215 * 3, 216 * 3, 0, 0, 0, 36, 210 * 3, 212 * 3, 0, 0, 0, 34, 213 * 3, 209 * 3, 0, 221 * 3, 222 * 3, 0, 219 * 3, 208 * 3, 0, 217 * 3, 214 * 3, 0, 223 * 3, 220 * 3, 0, 0, 0, 35, 0, 0, 267, 0, 0, 40, 0, 0, 268, 0, 0, 266, 0, 0, 32, 0, 0, 264, 0, 0, 265, 0, 0, 38, 0, 0, 269, 0, 0, 270, 0, 0, 33, 0, 0, 39, 0, 0, 7937, 0, 0, 6913, 0, 0, 7681, 0, 0, 4098, 0, 0, 7425, 0, 0, 7169, 0, 0, 271, 0, 0, 274, 0, 0, 273, 0, 0, 272, 0, 0, 1539, 0, 0, 2818, 0, 0, 3586, 0, 0, 3330, 0, 0, 3074, 0, 0, 3842]);
1813
+ MPEG1.PICTURE_TYPE = {
1814
+ INTRA: 1,
1815
+ PREDICTIVE: 2,
1816
+ B: 3
1817
+ };
1818
+ MPEG1.START = {
1819
+ SEQUENCE: 179,
1820
+ SLICE_FIRST: 1,
1821
+ SLICE_LAST: 175,
1822
+ PICTURE: 0,
1823
+ EXTENSION: 181,
1824
+ USER_DATA: 178
1825
+ };
1826
+ return MPEG1
1827
+ }();
1828
+ JSMpeg.Decoder.MPEG1VideoWASM = function() {
1829
+ "use strict";
1830
+ var MPEG1WASM = function(options) {
1831
+ JSMpeg.Decoder.Base.call(this, options);
1832
+ this.onDecodeCallback = options.onVideoDecode;
1833
+ this.module = options.wasmModule;
1834
+ this.bufferSize = options.videoBufferSize || 512 * 1024;
1835
+ this.bufferMode = options.streaming ? JSMpeg.BitBuffer.MODE.EVICT : JSMpeg.BitBuffer.MODE.EXPAND;
1836
+ this.decodeFirstFrame = options.decodeFirstFrame !== false;
1837
+ this.hasSequenceHeader = false
1838
+ };
1839
+ MPEG1WASM.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
1840
+ MPEG1WASM.prototype.constructor = MPEG1WASM;
1841
+ MPEG1WASM.prototype.initializeWasmDecoder = function() {
1842
+ if (!this.module.instance) {
1843
+ console.warn("JSMpeg: WASM module not compiled yet");
1844
+ return
1845
+ }
1846
+ this.instance = this.module.instance;
1847
+ this.functions = this.module.instance.exports;
1848
+ this.decoder = this.functions._mpeg1_decoder_create(this.bufferSize, this.bufferMode)
1849
+ };
1850
+ MPEG1WASM.prototype.destroy = function() {
1851
+ if (!this.decoder) {
1852
+ return
1853
+ }
1854
+ this.functions._mpeg1_decoder_destroy(this.decoder)
1855
+ };
1856
+ MPEG1WASM.prototype.bufferGetIndex = function() {
1857
+ if (!this.decoder) {
1858
+ return
1859
+ }
1860
+ return this.functions._mpeg1_decoder_get_index(this.decoder)
1861
+ };
1862
+ MPEG1WASM.prototype.bufferSetIndex = function(index) {
1863
+ if (!this.decoder) {
1864
+ return
1865
+ }
1866
+ this.functions._mpeg1_decoder_set_index(this.decoder, index)
1867
+ };
1868
+ MPEG1WASM.prototype.bufferWrite = function(buffers) {
1869
+ if (!this.decoder) {
1870
+ this.initializeWasmDecoder()
1871
+ }
1872
+ var totalLength = 0;
1873
+ for (var i = 0; i < buffers.length; i++) {
1874
+ totalLength += buffers[i].length
1875
+ }
1876
+ var ptr = this.functions._mpeg1_decoder_get_write_ptr(this.decoder, totalLength);
1877
+ for (var i = 0; i < buffers.length; i++) {
1878
+ this.instance.heapU8.set(buffers[i], ptr);
1879
+ ptr += buffers[i].length
1880
+ }
1881
+ this.functions._mpeg1_decoder_did_write(this.decoder, totalLength);
1882
+ return totalLength
1883
+ };
1884
+ MPEG1WASM.prototype.write = function(pts, buffers) {
1885
+ JSMpeg.Decoder.Base.prototype.write.call(this, pts, buffers);
1886
+ if (!this.hasSequenceHeader && this.functions._mpeg1_decoder_has_sequence_header(this.decoder)) {
1887
+ this.loadSequnceHeader()
1888
+ }
1889
+ };
1890
+ MPEG1WASM.prototype.loadSequnceHeader = function() {
1891
+ this.hasSequenceHeader = true;
1892
+ this.frameRate = this.functions._mpeg1_decoder_get_frame_rate(this.decoder);
1893
+ this.codedSize = this.functions._mpeg1_decoder_get_coded_size(this.decoder);
1894
+ if (this.destination) {
1895
+ var w = this.functions._mpeg1_decoder_get_width(this.decoder);
1896
+ var h = this.functions._mpeg1_decoder_get_height(this.decoder);
1897
+ this.destination.resize(w, h)
1898
+ }
1899
+ if (this.decodeFirstFrame) {
1900
+ this.decode()
1901
+ }
1902
+ };
1903
+ MPEG1WASM.prototype.decode = function() {
1904
+ var startTime = JSMpeg.Now();
1905
+ if (!this.decoder) {
1906
+ return false
1907
+ }
1908
+ var didDecode = this.functions._mpeg1_decoder_decode(this.decoder);
1909
+ if (!didDecode) {
1910
+ return false
1911
+ }
1912
+ if (this.destination) {
1913
+ var ptrY = this.functions._mpeg1_decoder_get_y_ptr(this.decoder),
1914
+ ptrCr = this.functions._mpeg1_decoder_get_cr_ptr(this.decoder),
1915
+ ptrCb = this.functions._mpeg1_decoder_get_cb_ptr(this.decoder);
1916
+ var dy = this.instance.heapU8.subarray(ptrY, ptrY + this.codedSize);
1917
+ var dcr = this.instance.heapU8.subarray(ptrCr, ptrCr + (this.codedSize >> 2));
1918
+ var dcb = this.instance.heapU8.subarray(ptrCb, ptrCb + (this.codedSize >> 2));
1919
+ this.destination.render(dy, dcr, dcb, false)
1920
+ }
1921
+ this.advanceDecodedTime(1 / this.frameRate);
1922
+ var elapsedTime = JSMpeg.Now() - startTime;
1923
+ if (this.onDecodeCallback) {
1924
+ this.onDecodeCallback(this, elapsedTime)
1925
+ }
1926
+ return true
1927
+ };
1928
+ return MPEG1WASM
1929
+ }();
1930
+ JSMpeg.Decoder.MP2Audio = function() {
1931
+ "use strict";
1932
+ var MP2 = function(options) {
1933
+ JSMpeg.Decoder.Base.call(this, options);
1934
+ this.onDecodeCallback = options.onAudioDecode;
1935
+ var bufferSize = options.audioBufferSize || 128 * 1024;
1936
+ var bufferMode = options.streaming ? JSMpeg.BitBuffer.MODE.EVICT : JSMpeg.BitBuffer.MODE.EXPAND;
1937
+ this.bits = new JSMpeg.BitBuffer(bufferSize, bufferMode);
1938
+ this.left = new Float32Array(1152);
1939
+ this.right = new Float32Array(1152);
1940
+ this.sampleRate = 44100;
1941
+ this.D = new Float32Array(1024);
1942
+ this.D.set(MP2.SYNTHESIS_WINDOW, 0);
1943
+ this.D.set(MP2.SYNTHESIS_WINDOW, 512);
1944
+ this.V = new Float32Array(1024);
1945
+ this.U = new Int32Array(32);
1946
+ this.VPos = 0;
1947
+ this.allocation = [new Array(32), new Array(32)];
1948
+ this.scaleFactorInfo = [new Uint8Array(32), new Uint8Array(32)];
1949
+ this.scaleFactor = [new Array(32), new Array(32)];
1950
+ this.sample = [new Array(32), new Array(32)];
1951
+ for (var j = 0; j < 2; j++) {
1952
+ for (var i = 0; i < 32; i++) {
1953
+ this.scaleFactor[j][i] = [0, 0, 0];
1954
+ this.sample[j][i] = [0, 0, 0]
1955
+ }
1956
+ }
1957
+ };
1958
+ MP2.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
1959
+ MP2.prototype.constructor = MP2;
1960
+ MP2.prototype.decode = function() {
1961
+ var startTime = JSMpeg.Now();
1962
+ var pos = this.bits.index >> 3;
1963
+ if (pos >= this.bits.byteLength) {
1964
+ return false
1965
+ }
1966
+ var decoded = this.decodeFrame(this.left, this.right);
1967
+ this.bits.index = pos + decoded << 3;
1968
+ if (!decoded) {
1969
+ return false
1970
+ }
1971
+ if (this.destination) {
1972
+ this.destination.play(this.sampleRate, this.left, this.right)
1973
+ }
1974
+ this.advanceDecodedTime(this.left.length / this.sampleRate);
1975
+ var elapsedTime = JSMpeg.Now() - startTime;
1976
+ if (this.onDecodeCallback) {
1977
+ this.onDecodeCallback(this, elapsedTime)
1978
+ }
1979
+ return true
1980
+ };
1981
+ MP2.prototype.getCurrentTime = function() {
1982
+ var enqueuedTime = this.destination ? this.destination.enqueuedTime : 0;
1983
+ return this.decodedTime - enqueuedTime
1984
+ };
1985
+ MP2.prototype.decodeFrame = function(left, right) {
1986
+ var sync = this.bits.read(11),
1987
+ version = this.bits.read(2),
1988
+ layer = this.bits.read(2),
1989
+ hasCRC = !this.bits.read(1);
1990
+ if (sync !== MP2.FRAME_SYNC || version !== MP2.VERSION.MPEG_1 || layer !== MP2.LAYER.II) {
1991
+ return 0
1992
+ }
1993
+ var bitrateIndex = this.bits.read(4) - 1;
1994
+ if (bitrateIndex > 13) {
1995
+ return 0
1996
+ }
1997
+ var sampleRateIndex = this.bits.read(2);
1998
+ var sampleRate = MP2.SAMPLE_RATE[sampleRateIndex];
1999
+ if (sampleRateIndex === 3) {
2000
+ return 0
2001
+ }
2002
+ if (version === MP2.VERSION.MPEG_2) {
2003
+ sampleRateIndex += 4;
2004
+ bitrateIndex += 14
2005
+ }
2006
+ var padding = this.bits.read(1),
2007
+ privat = this.bits.read(1),
2008
+ mode = this.bits.read(2);
2009
+ var bound = 0;
2010
+ if (mode === MP2.MODE.JOINT_STEREO) {
2011
+ bound = this.bits.read(2) + 1 << 2
2012
+ } else {
2013
+ this.bits.skip(2);
2014
+ bound = mode === MP2.MODE.MONO ? 0 : 32
2015
+ }
2016
+ this.bits.skip(4);
2017
+ if (hasCRC) {
2018
+ this.bits.skip(16)
2019
+ }
2020
+ var bitrate = MP2.BIT_RATE[bitrateIndex],
2021
+ sampleRate = MP2.SAMPLE_RATE[sampleRateIndex],
2022
+ frameSize = 144e3 * bitrate / sampleRate + padding | 0;
2023
+ var tab3 = 0;
2024
+ var sblimit = 0;
2025
+ if (version === MP2.VERSION.MPEG_2) {
2026
+ tab3 = 2;
2027
+ sblimit = 30
2028
+ } else {
2029
+ var tab1 = mode === MP2.MODE.MONO ? 0 : 1;
2030
+ var tab2 = MP2.QUANT_LUT_STEP_1[tab1][bitrateIndex];
2031
+ tab3 = MP2.QUANT_LUT_STEP_2[tab2][sampleRateIndex];
2032
+ sblimit = tab3 & 63;
2033
+ tab3 >>= 6
2034
+ }
2035
+ if (bound > sblimit) {
2036
+ bound = sblimit
2037
+ }
2038
+ for (var sb = 0; sb < bound; sb++) {
2039
+ this.allocation[0][sb] = this.readAllocation(sb, tab3);
2040
+ this.allocation[1][sb] = this.readAllocation(sb, tab3)
2041
+ }
2042
+ for (var sb = bound; sb < sblimit; sb++) {
2043
+ this.allocation[0][sb] = this.allocation[1][sb] = this.readAllocation(sb, tab3)
2044
+ }
2045
+ var channels = mode === MP2.MODE.MONO ? 1 : 2;
2046
+ for (var sb = 0; sb < sblimit; sb++) {
2047
+ for (ch = 0; ch < channels; ch++) {
2048
+ if (this.allocation[ch][sb]) {
2049
+ this.scaleFactorInfo[ch][sb] = this.bits.read(2)
2050
+ }
2051
+ }
2052
+ if (mode === MP2.MODE.MONO) {
2053
+ this.scaleFactorInfo[1][sb] = this.scaleFactorInfo[0][sb]
2054
+ }
2055
+ }
2056
+ for (var sb = 0; sb < sblimit; sb++) {
2057
+ for (var ch = 0; ch < channels; ch++) {
2058
+ if (this.allocation[ch][sb]) {
2059
+ var sf = this.scaleFactor[ch][sb];
2060
+ switch (this.scaleFactorInfo[ch][sb]) {
2061
+ case 0:
2062
+ sf[0] = this.bits.read(6);
2063
+ sf[1] = this.bits.read(6);
2064
+ sf[2] = this.bits.read(6);
2065
+ break;
2066
+ case 1:
2067
+ sf[0] = sf[1] = this.bits.read(6);
2068
+ sf[2] = this.bits.read(6);
2069
+ break;
2070
+ case 2:
2071
+ sf[0] = sf[1] = sf[2] = this.bits.read(6);
2072
+ break;
2073
+ case 3:
2074
+ sf[0] = this.bits.read(6);
2075
+ sf[1] = sf[2] = this.bits.read(6);
2076
+ break
2077
+ }
2078
+ }
2079
+ }
2080
+ if (mode === MP2.MODE.MONO) {
2081
+ this.scaleFactor[1][sb][0] = this.scaleFactor[0][sb][0];
2082
+ this.scaleFactor[1][sb][1] = this.scaleFactor[0][sb][1];
2083
+ this.scaleFactor[1][sb][2] = this.scaleFactor[0][sb][2]
2084
+ }
2085
+ }
2086
+ var outPos = 0;
2087
+ for (var part = 0; part < 3; part++) {
2088
+ for (var granule = 0; granule < 4; granule++) {
2089
+ for (var sb = 0; sb < bound; sb++) {
2090
+ this.readSamples(0, sb, part);
2091
+ this.readSamples(1, sb, part)
2092
+ }
2093
+ for (var sb = bound; sb < sblimit; sb++) {
2094
+ this.readSamples(0, sb, part);
2095
+ this.sample[1][sb][0] = this.sample[0][sb][0];
2096
+ this.sample[1][sb][1] = this.sample[0][sb][1];
2097
+ this.sample[1][sb][2] = this.sample[0][sb][2]
2098
+ }
2099
+ for (var sb = sblimit; sb < 32; sb++) {
2100
+ this.sample[0][sb][0] = 0;
2101
+ this.sample[0][sb][1] = 0;
2102
+ this.sample[0][sb][2] = 0;
2103
+ this.sample[1][sb][0] = 0;
2104
+ this.sample[1][sb][1] = 0;
2105
+ this.sample[1][sb][2] = 0
2106
+ }
2107
+ for (var p = 0; p < 3; p++) {
2108
+ this.VPos = this.VPos - 64 & 1023;
2109
+ for (var ch = 0; ch < 2; ch++) {
2110
+ MP2.MatrixTransform(this.sample[ch], p, this.V, this.VPos);
2111
+ JSMpeg.Fill(this.U, 0);
2112
+ var dIndex = 512 - (this.VPos >> 1);
2113
+ var vIndex = this.VPos % 128 >> 1;
2114
+ while (vIndex < 1024) {
2115
+ for (var i = 0; i < 32; ++i) {
2116
+ this.U[i] += this.D[dIndex++] * this.V[vIndex++]
2117
+ }
2118
+ vIndex += 128 - 32;
2119
+ dIndex += 64 - 32
2120
+ }
2121
+ vIndex = 128 - 32 + 1024 - vIndex;
2122
+ dIndex -= 512 - 32;
2123
+ while (vIndex < 1024) {
2124
+ for (var i = 0; i < 32; ++i) {
2125
+ this.U[i] += this.D[dIndex++] * this.V[vIndex++]
2126
+ }
2127
+ vIndex += 128 - 32;
2128
+ dIndex += 64 - 32
2129
+ }
2130
+ var outChannel = ch === 0 ? left : right;
2131
+ for (var j = 0; j < 32; j++) {
2132
+ outChannel[outPos + j] = this.U[j] / 2147418112
2133
+ }
2134
+ }
2135
+ outPos += 32
2136
+ }
2137
+ }
2138
+ }
2139
+ this.sampleRate = sampleRate;
2140
+ return frameSize
2141
+ };
2142
+ MP2.prototype.readAllocation = function(sb, tab3) {
2143
+ var tab4 = MP2.QUANT_LUT_STEP_3[tab3][sb];
2144
+ var qtab = MP2.QUANT_LUT_STEP4[tab4 & 15][this.bits.read(tab4 >> 4)];
2145
+ return qtab ? MP2.QUANT_TAB[qtab - 1] : 0
2146
+ };
2147
+ MP2.prototype.readSamples = function(ch, sb, part) {
2148
+ var q = this.allocation[ch][sb],
2149
+ sf = this.scaleFactor[ch][sb][part],
2150
+ sample = this.sample[ch][sb],
2151
+ val = 0;
2152
+ if (!q) {
2153
+ sample[0] = sample[1] = sample[2] = 0;
2154
+ return
2155
+ }
2156
+ if (sf === 63) {
2157
+ sf = 0
2158
+ } else {
2159
+ var shift = sf / 3 | 0;
2160
+ sf = MP2.SCALEFACTOR_BASE[sf % 3] + (1 << shift >> 1) >> shift
2161
+ }
2162
+ var adj = q.levels;
2163
+ if (q.group) {
2164
+ val = this.bits.read(q.bits);
2165
+ sample[0] = val % adj;
2166
+ val = val / adj | 0;
2167
+ sample[1] = val % adj;
2168
+ sample[2] = val / adj | 0
2169
+ } else {
2170
+ sample[0] = this.bits.read(q.bits);
2171
+ sample[1] = this.bits.read(q.bits);
2172
+ sample[2] = this.bits.read(q.bits)
2173
+ }
2174
+ var scale = 65536 / (adj + 1) | 0;
2175
+ adj = (adj + 1 >> 1) - 1;
2176
+ val = (adj - sample[0]) * scale;
2177
+ sample[0] = val * (sf >> 12) + (val * (sf & 4095) + 2048 >> 12) >> 12;
2178
+ val = (adj - sample[1]) * scale;
2179
+ sample[1] = val * (sf >> 12) + (val * (sf & 4095) + 2048 >> 12) >> 12;
2180
+ val = (adj - sample[2]) * scale;
2181
+ sample[2] = val * (sf >> 12) + (val * (sf & 4095) + 2048 >> 12) >> 12
2182
+ };
2183
+ MP2.MatrixTransform = function(s, ss, d, dp) {
2184
+ var t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, t21, t22, t23, t24, t25, t26, t27, t28, t29, t30, t31, t32, t33;
2185
+ t01 = s[0][ss] + s[31][ss];
2186
+ t02 = (s[0][ss] - s[31][ss]) * .500602998235;
2187
+ t03 = s[1][ss] + s[30][ss];
2188
+ t04 = (s[1][ss] - s[30][ss]) * .505470959898;
2189
+ t05 = s[2][ss] + s[29][ss];
2190
+ t06 = (s[2][ss] - s[29][ss]) * .515447309923;
2191
+ t07 = s[3][ss] + s[28][ss];
2192
+ t08 = (s[3][ss] - s[28][ss]) * .53104259109;
2193
+ t09 = s[4][ss] + s[27][ss];
2194
+ t10 = (s[4][ss] - s[27][ss]) * .553103896034;
2195
+ t11 = s[5][ss] + s[26][ss];
2196
+ t12 = (s[5][ss] - s[26][ss]) * .582934968206;
2197
+ t13 = s[6][ss] + s[25][ss];
2198
+ t14 = (s[6][ss] - s[25][ss]) * .622504123036;
2199
+ t15 = s[7][ss] + s[24][ss];
2200
+ t16 = (s[7][ss] - s[24][ss]) * .674808341455;
2201
+ t17 = s[8][ss] + s[23][ss];
2202
+ t18 = (s[8][ss] - s[23][ss]) * .744536271002;
2203
+ t19 = s[9][ss] + s[22][ss];
2204
+ t20 = (s[9][ss] - s[22][ss]) * .839349645416;
2205
+ t21 = s[10][ss] + s[21][ss];
2206
+ t22 = (s[10][ss] - s[21][ss]) * .972568237862;
2207
+ t23 = s[11][ss] + s[20][ss];
2208
+ t24 = (s[11][ss] - s[20][ss]) * 1.16943993343;
2209
+ t25 = s[12][ss] + s[19][ss];
2210
+ t26 = (s[12][ss] - s[19][ss]) * 1.48416461631;
2211
+ t27 = s[13][ss] + s[18][ss];
2212
+ t28 = (s[13][ss] - s[18][ss]) * 2.05778100995;
2213
+ t29 = s[14][ss] + s[17][ss];
2214
+ t30 = (s[14][ss] - s[17][ss]) * 3.40760841847;
2215
+ t31 = s[15][ss] + s[16][ss];
2216
+ t32 = (s[15][ss] - s[16][ss]) * 10.1900081235;
2217
+ t33 = t01 + t31;
2218
+ t31 = (t01 - t31) * .502419286188;
2219
+ t01 = t03 + t29;
2220
+ t29 = (t03 - t29) * .52249861494;
2221
+ t03 = t05 + t27;
2222
+ t27 = (t05 - t27) * .566944034816;
2223
+ t05 = t07 + t25;
2224
+ t25 = (t07 - t25) * .64682178336;
2225
+ t07 = t09 + t23;
2226
+ t23 = (t09 - t23) * .788154623451;
2227
+ t09 = t11 + t21;
2228
+ t21 = (t11 - t21) * 1.06067768599;
2229
+ t11 = t13 + t19;
2230
+ t19 = (t13 - t19) * 1.72244709824;
2231
+ t13 = t15 + t17;
2232
+ t17 = (t15 - t17) * 5.10114861869;
2233
+ t15 = t33 + t13;
2234
+ t13 = (t33 - t13) * .509795579104;
2235
+ t33 = t01 + t11;
2236
+ t01 = (t01 - t11) * .601344886935;
2237
+ t11 = t03 + t09;
2238
+ t09 = (t03 - t09) * .899976223136;
2239
+ t03 = t05 + t07;
2240
+ t07 = (t05 - t07) * 2.56291544774;
2241
+ t05 = t15 + t03;
2242
+ t15 = (t15 - t03) * .541196100146;
2243
+ t03 = t33 + t11;
2244
+ t11 = (t33 - t11) * 1.30656296488;
2245
+ t33 = t05 + t03;
2246
+ t05 = (t05 - t03) * .707106781187;
2247
+ t03 = t15 + t11;
2248
+ t15 = (t15 - t11) * .707106781187;
2249
+ t03 += t15;
2250
+ t11 = t13 + t07;
2251
+ t13 = (t13 - t07) * .541196100146;
2252
+ t07 = t01 + t09;
2253
+ t09 = (t01 - t09) * 1.30656296488;
2254
+ t01 = t11 + t07;
2255
+ t07 = (t11 - t07) * .707106781187;
2256
+ t11 = t13 + t09;
2257
+ t13 = (t13 - t09) * .707106781187;
2258
+ t11 += t13;
2259
+ t01 += t11;
2260
+ t11 += t07;
2261
+ t07 += t13;
2262
+ t09 = t31 + t17;
2263
+ t31 = (t31 - t17) * .509795579104;
2264
+ t17 = t29 + t19;
2265
+ t29 = (t29 - t19) * .601344886935;
2266
+ t19 = t27 + t21;
2267
+ t21 = (t27 - t21) * .899976223136;
2268
+ t27 = t25 + t23;
2269
+ t23 = (t25 - t23) * 2.56291544774;
2270
+ t25 = t09 + t27;
2271
+ t09 = (t09 - t27) * .541196100146;
2272
+ t27 = t17 + t19;
2273
+ t19 = (t17 - t19) * 1.30656296488;
2274
+ t17 = t25 + t27;
2275
+ t27 = (t25 - t27) * .707106781187;
2276
+ t25 = t09 + t19;
2277
+ t19 = (t09 - t19) * .707106781187;
2278
+ t25 += t19;
2279
+ t09 = t31 + t23;
2280
+ t31 = (t31 - t23) * .541196100146;
2281
+ t23 = t29 + t21;
2282
+ t21 = (t29 - t21) * 1.30656296488;
2283
+ t29 = t09 + t23;
2284
+ t23 = (t09 - t23) * .707106781187;
2285
+ t09 = t31 + t21;
2286
+ t31 = (t31 - t21) * .707106781187;
2287
+ t09 += t31;
2288
+ t29 += t09;
2289
+ t09 += t23;
2290
+ t23 += t31;
2291
+ t17 += t29;
2292
+ t29 += t25;
2293
+ t25 += t09;
2294
+ t09 += t27;
2295
+ t27 += t23;
2296
+ t23 += t19;
2297
+ t19 += t31;
2298
+ t21 = t02 + t32;
2299
+ t02 = (t02 - t32) * .502419286188;
2300
+ t32 = t04 + t30;
2301
+ t04 = (t04 - t30) * .52249861494;
2302
+ t30 = t06 + t28;
2303
+ t28 = (t06 - t28) * .566944034816;
2304
+ t06 = t08 + t26;
2305
+ t08 = (t08 - t26) * .64682178336;
2306
+ t26 = t10 + t24;
2307
+ t10 = (t10 - t24) * .788154623451;
2308
+ t24 = t12 + t22;
2309
+ t22 = (t12 - t22) * 1.06067768599;
2310
+ t12 = t14 + t20;
2311
+ t20 = (t14 - t20) * 1.72244709824;
2312
+ t14 = t16 + t18;
2313
+ t16 = (t16 - t18) * 5.10114861869;
2314
+ t18 = t21 + t14;
2315
+ t14 = (t21 - t14) * .509795579104;
2316
+ t21 = t32 + t12;
2317
+ t32 = (t32 - t12) * .601344886935;
2318
+ t12 = t30 + t24;
2319
+ t24 = (t30 - t24) * .899976223136;
2320
+ t30 = t06 + t26;
2321
+ t26 = (t06 - t26) * 2.56291544774;
2322
+ t06 = t18 + t30;
2323
+ t18 = (t18 - t30) * .541196100146;
2324
+ t30 = t21 + t12;
2325
+ t12 = (t21 - t12) * 1.30656296488;
2326
+ t21 = t06 + t30;
2327
+ t30 = (t06 - t30) * .707106781187;
2328
+ t06 = t18 + t12;
2329
+ t12 = (t18 - t12) * .707106781187;
2330
+ t06 += t12;
2331
+ t18 = t14 + t26;
2332
+ t26 = (t14 - t26) * .541196100146;
2333
+ t14 = t32 + t24;
2334
+ t24 = (t32 - t24) * 1.30656296488;
2335
+ t32 = t18 + t14;
2336
+ t14 = (t18 - t14) * .707106781187;
2337
+ t18 = t26 + t24;
2338
+ t24 = (t26 - t24) * .707106781187;
2339
+ t18 += t24;
2340
+ t32 += t18;
2341
+ t18 += t14;
2342
+ t26 = t14 + t24;
2343
+ t14 = t02 + t16;
2344
+ t02 = (t02 - t16) * .509795579104;
2345
+ t16 = t04 + t20;
2346
+ t04 = (t04 - t20) * .601344886935;
2347
+ t20 = t28 + t22;
2348
+ t22 = (t28 - t22) * .899976223136;
2349
+ t28 = t08 + t10;
2350
+ t10 = (t08 - t10) * 2.56291544774;
2351
+ t08 = t14 + t28;
2352
+ t14 = (t14 - t28) * .541196100146;
2353
+ t28 = t16 + t20;
2354
+ t20 = (t16 - t20) * 1.30656296488;
2355
+ t16 = t08 + t28;
2356
+ t28 = (t08 - t28) * .707106781187;
2357
+ t08 = t14 + t20;
2358
+ t20 = (t14 - t20) * .707106781187;
2359
+ t08 += t20;
2360
+ t14 = t02 + t10;
2361
+ t02 = (t02 - t10) * .541196100146;
2362
+ t10 = t04 + t22;
2363
+ t22 = (t04 - t22) * 1.30656296488;
2364
+ t04 = t14 + t10;
2365
+ t10 = (t14 - t10) * .707106781187;
2366
+ t14 = t02 + t22;
2367
+ t02 = (t02 - t22) * .707106781187;
2368
+ t14 += t02;
2369
+ t04 += t14;
2370
+ t14 += t10;
2371
+ t10 += t02;
2372
+ t16 += t04;
2373
+ t04 += t08;
2374
+ t08 += t14;
2375
+ t14 += t28;
2376
+ t28 += t10;
2377
+ t10 += t20;
2378
+ t20 += t02;
2379
+ t21 += t16;
2380
+ t16 += t32;
2381
+ t32 += t04;
2382
+ t04 += t06;
2383
+ t06 += t08;
2384
+ t08 += t18;
2385
+ t18 += t14;
2386
+ t14 += t30;
2387
+ t30 += t28;
2388
+ t28 += t26;
2389
+ t26 += t10;
2390
+ t10 += t12;
2391
+ t12 += t20;
2392
+ t20 += t24;
2393
+ t24 += t02;
2394
+ d[dp + 48] = -t33;
2395
+ d[dp + 49] = d[dp + 47] = -t21;
2396
+ d[dp + 50] = d[dp + 46] = -t17;
2397
+ d[dp + 51] = d[dp + 45] = -t16;
2398
+ d[dp + 52] = d[dp + 44] = -t01;
2399
+ d[dp + 53] = d[dp + 43] = -t32;
2400
+ d[dp + 54] = d[dp + 42] = -t29;
2401
+ d[dp + 55] = d[dp + 41] = -t04;
2402
+ d[dp + 56] = d[dp + 40] = -t03;
2403
+ d[dp + 57] = d[dp + 39] = -t06;
2404
+ d[dp + 58] = d[dp + 38] = -t25;
2405
+ d[dp + 59] = d[dp + 37] = -t08;
2406
+ d[dp + 60] = d[dp + 36] = -t11;
2407
+ d[dp + 61] = d[dp + 35] = -t18;
2408
+ d[dp + 62] = d[dp + 34] = -t09;
2409
+ d[dp + 63] = d[dp + 33] = -t14;
2410
+ d[dp + 32] = -t05;
2411
+ d[dp + 0] = t05;
2412
+ d[dp + 31] = -t30;
2413
+ d[dp + 1] = t30;
2414
+ d[dp + 30] = -t27;
2415
+ d[dp + 2] = t27;
2416
+ d[dp + 29] = -t28;
2417
+ d[dp + 3] = t28;
2418
+ d[dp + 28] = -t07;
2419
+ d[dp + 4] = t07;
2420
+ d[dp + 27] = -t26;
2421
+ d[dp + 5] = t26;
2422
+ d[dp + 26] = -t23;
2423
+ d[dp + 6] = t23;
2424
+
2425
+ d[dp + 25] = -t10;
2426
+ d[dp + 7] = t10;
2427
+ d[dp + 24] = -t15;
2428
+ d[dp + 8] = t15;
2429
+ d[dp + 23] = -t12;
2430
+ d[dp + 9] = t12;
2431
+ d[dp + 22] = -t19;
2432
+ d[dp + 10] = t19;
2433
+ d[dp + 21] = -t20;
2434
+ d[dp + 11] = t20;
2435
+ d[dp + 20] = -t13;
2436
+ d[dp + 12] = t13;
2437
+ d[dp + 19] = -t24;
2438
+ d[dp + 13] = t24;
2439
+ d[dp + 18] = -t31;
2440
+ d[dp + 14] = t31;
2441
+ d[dp + 17] = -t02;
2442
+ d[dp + 15] = t02;
2443
+ d[dp + 16] = 0
2444
+ };
2445
+ MP2.FRAME_SYNC = 2047;
2446
+ MP2.VERSION = {
2447
+ MPEG_2_5: 0,
2448
+ MPEG_2: 2,
2449
+ MPEG_1: 3
2450
+ };
2451
+ MP2.LAYER = {
2452
+ III: 1,
2453
+ II: 2,
2454
+ I: 3
2455
+ };
2456
+ MP2.MODE = {
2457
+ STEREO: 0,
2458
+ JOINT_STEREO: 1,
2459
+ DUAL_CHANNEL: 2,
2460
+ MONO: 3
2461
+ };
2462
+ MP2.SAMPLE_RATE = new Uint16Array([44100, 48e3, 32e3, 0, 22050, 24e3, 16e3, 0]);
2463
+ MP2.BIT_RATE = new Uint16Array([32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]);
2464
+ MP2.SCALEFACTOR_BASE = new Uint32Array([33554432, 26632170, 21137968]);
2465
+ MP2.SYNTHESIS_WINDOW = new Float32Array([0, -.5, -.5, -.5, -.5, -.5, -.5, -1, -1, -1, -1, -1.5, -1.5, -2, -2, -2.5, -2.5, -3, -3.5, -3.5, -4, -4.5, -5, -5.5, -6.5, -7, -8, -8.5, -9.5, -10.5, -12, -13, -14.5, -15.5, -17.5, -19, -20.5, -22.5, -24.5, -26.5, -29, -31.5, -34, -36.5, -39.5, -42.5, -45.5, -48.5, -52, -55.5, -58.5, -62.5, -66, -69.5, -73.5, -77, -80.5, -84.5, -88, -91.5, -95, -98, -101, -104, 106.5, 109, 111, 112.5, 113.5, 114, 114, 113.5, 112, 110.5, 107.5, 104, 100, 94.5, 88.5, 81.5, 73, 63.5, 53, 41.5, 28.5, 14.5, -1, -18, -36, -55.5, -76.5, -98.5, -122, -147, -173.5, -200.5, -229.5, -259.5, -290.5, -322.5, -355.5, -389.5, -424, -459.5, -495.5, -532, -568.5, -605, -641.5, -678, -714, -749, -783.5, -817, -849, -879.5, -908.5, -935, -959.5, -981, -1000.5, -1016, -1028.5, -1037.5, -1042.5, -1043.5, -1040, -1031.5, 1018.5, 1e3, 976, 946.5, 911, 869.5, 822, 767.5, 707, 640, 565.5, 485, 397, 302.5, 201, 92.5, -22.5, -144, -272.5, -407, -547.5, -694, -846, -1003, -1165, -1331.5, -1502, -1675.5, -1852.5, -2031.5, -2212.5, -2394, -2576.5, -2758.5, -2939.5, -3118.5, -3294.5, -3467.5, -3635.5, -3798.5, -3955, -4104.5, -4245.5, -4377.5, -4499, -4609.5, -4708, -4792.5, -4863.5, -4919, -4958, -4979.5, -4983, -4967.5, -4931.5, -4875, -4796, -4694.5, -4569.5, -4420, -4246, -4046, -3820, -3567, 3287, 2979.5, 2644, 2280.5, 1888, 1467.5, 1018.5, 541, 35, -499, -1061, -1650, -2266.5, -2909, -3577, -4270, -4987.5, -5727.5, -6490, -7274, -8077.5, -8899.5, -9739, -10594.5, -11464.5, -12347, -13241, -14144.5, -15056, -15973.5, -16895.5, -17820, -18744.5, -19668, -20588, -21503, -22410.5, -23308.5, -24195, -25068.5, -25926.5, -26767, -27589, -28389, -29166.5, -29919, -30644.5, -31342, -32009.5, -32645, -33247, -33814.5, -34346, -34839.5, -35295, -35710, -36084.5, -36417.5, -36707.5, -36954, -37156.5, -37315, -37428, -37496, 37519, 37496, 37428, 37315, 37156.5, 36954, 36707.5, 36417.5, 36084.5, 35710, 35295, 34839.5, 34346, 33814.5, 33247, 32645, 32009.5, 31342, 30644.5, 29919, 29166.5, 28389, 27589, 26767, 25926.5, 25068.5, 24195, 23308.5, 22410.5, 21503, 20588, 19668, 18744.5, 17820, 16895.5, 15973.5, 15056, 14144.5, 13241, 12347, 11464.5, 10594.5, 9739, 8899.5, 8077.5, 7274, 6490, 5727.5, 4987.5, 4270, 3577, 2909, 2266.5, 1650, 1061, 499, -35, -541, -1018.5, -1467.5, -1888, -2280.5, -2644, -2979.5, 3287, 3567, 3820, 4046, 4246, 4420, 4569.5, 4694.5, 4796, 4875, 4931.5, 4967.5, 4983, 4979.5, 4958, 4919, 4863.5, 4792.5, 4708, 4609.5, 4499, 4377.5, 4245.5, 4104.5, 3955, 3798.5, 3635.5, 3467.5, 3294.5, 3118.5, 2939.5, 2758.5, 2576.5, 2394, 2212.5, 2031.5, 1852.5, 1675.5, 1502, 1331.5, 1165, 1003, 846, 694, 547.5, 407, 272.5, 144, 22.5, -92.5, -201, -302.5, -397, -485, -565.5, -640, -707, -767.5, -822, -869.5, -911, -946.5, -976, -1e3, 1018.5, 1031.5, 1040, 1043.5, 1042.5, 1037.5, 1028.5, 1016, 1000.5, 981, 959.5, 935, 908.5, 879.5, 849, 817, 783.5, 749, 714, 678, 641.5, 605, 568.5, 532, 495.5, 459.5, 424, 389.5, 355.5, 322.5, 290.5, 259.5, 229.5, 200.5, 173.5, 147, 122, 98.5, 76.5, 55.5, 36, 18, 1, -14.5, -28.5, -41.5, -53, -63.5, -73, -81.5, -88.5, -94.5, -100, -104, -107.5, -110.5, -112, -113.5, -114, -114, -113.5, -112.5, -111, -109, 106.5, 104, 101, 98, 95, 91.5, 88, 84.5, 80.5, 77, 73.5, 69.5, 66, 62.5, 58.5, 55.5, 52, 48.5, 45.5, 42.5, 39.5, 36.5, 34, 31.5, 29, 26.5, 24.5, 22.5, 20.5, 19, 17.5, 15.5, 14.5, 13, 12, 10.5, 9.5, 8.5, 8, 7, 6.5, 5.5, 5, 4.5, 4, 3.5, 3.5, 3, 2.5, 2.5, 2, 2, 1.5, 1.5, 1, 1, 1, 1, .5, .5, .5, .5, .5, .5]);
2466
+ MP2.QUANT_LUT_STEP_1 = [
2467
+ [0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2],
2468
+ [0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2]
2469
+ ];
2470
+ MP2.QUANT_TAB = {
2471
+ A: 27 | 64,
2472
+ B: 30 | 64,
2473
+ C: 8,
2474
+ D: 12
2475
+ };
2476
+ MP2.QUANT_LUT_STEP_2 = [
2477
+ [MP2.QUANT_TAB.C, MP2.QUANT_TAB.C, MP2.QUANT_TAB.D],
2478
+ [MP2.QUANT_TAB.A, MP2.QUANT_TAB.A, MP2.QUANT_TAB.A],
2479
+ [MP2.QUANT_TAB.B, MP2.QUANT_TAB.A, MP2.QUANT_TAB.B]
2480
+ ];
2481
+ MP2.QUANT_LUT_STEP_3 = [
2482
+ [68, 68, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52],
2483
+ [67, 67, 67, 66, 66, 66, 66, 66, 66, 66, 66, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 32, 32, 32, 32, 32, 32, 32],
2484
+ [69, 69, 69, 69, 52, 52, 52, 52, 52, 52, 52, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36]
2485
+ ];
2486
+ MP2.QUANT_LUT_STEP4 = [
2487
+ [0, 1, 2, 17],
2488
+ [0, 1, 2, 3, 4, 5, 6, 17],
2489
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17],
2490
+ [0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
2491
+ [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17],
2492
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
2493
+ ];
2494
+ MP2.QUANT_TAB = [{
2495
+ levels: 3,
2496
+ group: 1,
2497
+ bits: 5
2498
+ }, {
2499
+ levels: 5,
2500
+ group: 1,
2501
+ bits: 7
2502
+ }, {
2503
+ levels: 7,
2504
+ group: 0,
2505
+ bits: 3
2506
+ }, {
2507
+ levels: 9,
2508
+ group: 1,
2509
+ bits: 10
2510
+ }, {
2511
+ levels: 15,
2512
+ group: 0,
2513
+ bits: 4
2514
+ }, {
2515
+ levels: 31,
2516
+ group: 0,
2517
+ bits: 5
2518
+ }, {
2519
+ levels: 63,
2520
+ group: 0,
2521
+ bits: 6
2522
+ }, {
2523
+ levels: 127,
2524
+ group: 0,
2525
+ bits: 7
2526
+ }, {
2527
+ levels: 255,
2528
+ group: 0,
2529
+ bits: 8
2530
+ }, {
2531
+ levels: 511,
2532
+ group: 0,
2533
+ bits: 9
2534
+ }, {
2535
+ levels: 1023,
2536
+ group: 0,
2537
+ bits: 10
2538
+ }, {
2539
+ levels: 2047,
2540
+ group: 0,
2541
+ bits: 11
2542
+ }, {
2543
+ levels: 4095,
2544
+ group: 0,
2545
+ bits: 12
2546
+ }, {
2547
+ levels: 8191,
2548
+ group: 0,
2549
+ bits: 13
2550
+ }, {
2551
+ levels: 16383,
2552
+ group: 0,
2553
+ bits: 14
2554
+ }, {
2555
+ levels: 32767,
2556
+ group: 0,
2557
+ bits: 15
2558
+ }, {
2559
+ levels: 65535,
2560
+ group: 0,
2561
+ bits: 16
2562
+ }];
2563
+ return MP2
2564
+ }();
2565
+ JSMpeg.Decoder.MP2AudioWASM = function() {
2566
+ "use strict";
2567
+ var MP2WASM = function(options) {
2568
+ JSMpeg.Decoder.Base.call(this, options);
2569
+ this.onDecodeCallback = options.onAudioDecode;
2570
+ this.module = options.wasmModule;
2571
+ this.bufferSize = options.audioBufferSize || 128 * 1024;
2572
+ this.bufferMode = options.streaming ? JSMpeg.BitBuffer.MODE.EVICT : JSMpeg.BitBuffer.MODE.EXPAND;
2573
+ this.sampleRate = 0
2574
+ };
2575
+ MP2WASM.prototype = Object.create(JSMpeg.Decoder.Base.prototype);
2576
+ MP2WASM.prototype.constructor = MP2WASM;
2577
+ MP2WASM.prototype.initializeWasmDecoder = function() {
2578
+ if (!this.module.instance) {
2579
+ console.warn("JSMpeg: WASM module not compiled yet");
2580
+ return
2581
+ }
2582
+ this.instance = this.module.instance;
2583
+ this.functions = this.module.instance.exports;
2584
+ this.decoder = this.functions._mp2_decoder_create(this.bufferSize, this.bufferMode)
2585
+ };
2586
+ MP2WASM.prototype.destroy = function() {
2587
+ if (!this.decoder) {
2588
+ return
2589
+ }
2590
+ this.functions._mp2_decoder_destroy(this.decoder)
2591
+ };
2592
+ MP2WASM.prototype.bufferGetIndex = function() {
2593
+ if (!this.decoder) {
2594
+ return
2595
+ }
2596
+ return this.functions._mp2_decoder_get_index(this.decoder)
2597
+ };
2598
+ MP2WASM.prototype.bufferSetIndex = function(index) {
2599
+ if (!this.decoder) {
2600
+ return
2601
+ }
2602
+ this.functions._mp2_decoder_set_index(this.decoder, index)
2603
+ };
2604
+ MP2WASM.prototype.bufferWrite = function(buffers) {
2605
+ if (!this.decoder) {
2606
+ this.initializeWasmDecoder()
2607
+ }
2608
+ var totalLength = 0;
2609
+ for (var i = 0; i < buffers.length; i++) {
2610
+ totalLength += buffers[i].length
2611
+ }
2612
+ var ptr = this.functions._mp2_decoder_get_write_ptr(this.decoder, totalLength);
2613
+ for (var i = 0; i < buffers.length; i++) {
2614
+ this.instance.heapU8.set(buffers[i], ptr);
2615
+ ptr += buffers[i].length
2616
+ }
2617
+ this.functions._mp2_decoder_did_write(this.decoder, totalLength);
2618
+ return totalLength
2619
+ };
2620
+ MP2WASM.prototype.decode = function() {
2621
+ var startTime = JSMpeg.Now();
2622
+ if (!this.decoder) {
2623
+ return false
2624
+ }
2625
+ var decodedBytes = this.functions._mp2_decoder_decode(this.decoder);
2626
+ if (decodedBytes === 0) {
2627
+ return false
2628
+ }
2629
+ if (!this.sampleRate) {
2630
+ this.sampleRate = this.functions._mp2_decoder_get_sample_rate(this.decoder)
2631
+ }
2632
+ if (this.destination) {
2633
+ var leftPtr = this.functions._mp2_decoder_get_left_channel_ptr(this.decoder),
2634
+ rightPtr = this.functions._mp2_decoder_get_right_channel_ptr(this.decoder);
2635
+ var leftOffset = leftPtr / Float32Array.BYTES_PER_ELEMENT,
2636
+ rightOffset = rightPtr / Float32Array.BYTES_PER_ELEMENT;
2637
+ var left = this.instance.heapF32.subarray(leftOffset, leftOffset + MP2WASM.SAMPLES_PER_FRAME),
2638
+ right = this.instance.heapF32.subarray(rightOffset, rightOffset + MP2WASM.SAMPLES_PER_FRAME);
2639
+ this.destination.play(this.sampleRate, left, right)
2640
+ }
2641
+ this.advanceDecodedTime(MP2WASM.SAMPLES_PER_FRAME / this.sampleRate);
2642
+ var elapsedTime = JSMpeg.Now() - startTime;
2643
+ if (this.onDecodeCallback) {
2644
+ this.onDecodeCallback(this, elapsedTime)
2645
+ }
2646
+ return true
2647
+ };
2648
+ MP2WASM.prototype.getCurrentTime = function() {
2649
+ var enqueuedTime = this.destination ? this.destination.enqueuedTime : 0;
2650
+ return this.decodedTime - enqueuedTime
2651
+ };
2652
+ MP2WASM.SAMPLES_PER_FRAME = 1152;
2653
+ return MP2WASM
2654
+ }();
2655
+ JSMpeg.Renderer.WebGL = function() {
2656
+ "use strict";
2657
+ var WebGLRenderer = function(options) {
2658
+ this.canvas = options.canvas || document.createElement("canvas");
2659
+ this.width = this.canvas.width;
2660
+ this.height = this.canvas.height;
2661
+ this.enabled = true;
2662
+ this.hasTextureData = {};
2663
+ var contextCreateOptions = {
2664
+ preserveDrawingBuffer: !!options.preserveDrawingBuffer,
2665
+ alpha: false,
2666
+ depth: false,
2667
+ stencil: false,
2668
+ antialias: false,
2669
+ premultipliedAlpha: false
2670
+ };
2671
+ this.gl = this.canvas.getContext("webgl", contextCreateOptions) || this.canvas.getContext("experimental-webgl", contextCreateOptions);
2672
+ if (!this.gl) {
2673
+ throw new Error("Failed to get WebGL Context")
2674
+ }
2675
+ var gl = this.gl;
2676
+ var vertexAttr = null;
2677
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
2678
+ this.vertexBuffer = gl.createBuffer();
2679
+ var vertexCoords = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);
2680
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
2681
+ gl.bufferData(gl.ARRAY_BUFFER, vertexCoords, gl.STATIC_DRAW);
2682
+ this.program = this.createProgram(WebGLRenderer.SHADER.VERTEX_IDENTITY, WebGLRenderer.SHADER.FRAGMENT_YCRCB_TO_RGBA);
2683
+ vertexAttr = gl.getAttribLocation(this.program, "vertex");
2684
+ gl.enableVertexAttribArray(vertexAttr);
2685
+ gl.vertexAttribPointer(vertexAttr, 2, gl.FLOAT, false, 0, 0);
2686
+ this.textureY = this.createTexture(0, "textureY");
2687
+ this.textureCb = this.createTexture(1, "textureCb");
2688
+ this.textureCr = this.createTexture(2, "textureCr");
2689
+ this.loadingProgram = this.createProgram(WebGLRenderer.SHADER.VERTEX_IDENTITY, WebGLRenderer.SHADER.FRAGMENT_LOADING);
2690
+ vertexAttr = gl.getAttribLocation(this.loadingProgram, "vertex");
2691
+ gl.enableVertexAttribArray(vertexAttr);
2692
+ gl.vertexAttribPointer(vertexAttr, 2, gl.FLOAT, false, 0, 0);
2693
+ this.shouldCreateUnclampedViews = !this.allowsClampedTextureData()
2694
+ };
2695
+ WebGLRenderer.prototype.destroy = function() {
2696
+ var gl = this.gl;
2697
+ this.deleteTexture(gl.TEXTURE0, this.textureY);
2698
+ this.deleteTexture(gl.TEXTURE1, this.textureCb);
2699
+ this.deleteTexture(gl.TEXTURE2, this.textureCr);
2700
+ gl.useProgram(null);
2701
+ gl.deleteProgram(this.program);
2702
+ gl.deleteProgram(this.loadingProgram);
2703
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
2704
+ gl.deleteBuffer(this.vertexBuffer);
2705
+ gl.getExtension("WEBGL_lose_context").loseContext();
2706
+ this.canvas.remove()
2707
+ };
2708
+ WebGLRenderer.prototype.resize = function(width, height) {
2709
+ this.width = width | 0;
2710
+ this.height = height | 0;
2711
+ this.canvas.width = this.width;
2712
+ this.canvas.height = this.height;
2713
+ this.gl.useProgram(this.program);
2714
+ var codedWidth = this.width + 15 >> 4 << 4;
2715
+ this.gl.viewport(0, 0, codedWidth, this.height)
2716
+ };
2717
+ WebGLRenderer.prototype.createTexture = function(index, name) {
2718
+ var gl = this.gl;
2719
+ var texture = gl.createTexture();
2720
+ gl.bindTexture(gl.TEXTURE_2D, texture);
2721
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
2722
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
2723
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
2724
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
2725
+ gl.uniform1i(gl.getUniformLocation(this.program, name), index);
2726
+ return texture
2727
+ };
2728
+ WebGLRenderer.prototype.createProgram = function(vsh, fsh) {
2729
+ var gl = this.gl;
2730
+ var program = gl.createProgram();
2731
+ gl.attachShader(program, this.compileShader(gl.VERTEX_SHADER, vsh));
2732
+ gl.attachShader(program, this.compileShader(gl.FRAGMENT_SHADER, fsh));
2733
+ gl.linkProgram(program);
2734
+ gl.useProgram(program);
2735
+ return program
2736
+ };
2737
+ WebGLRenderer.prototype.compileShader = function(type, source) {
2738
+ var gl = this.gl;
2739
+ var shader = gl.createShader(type);
2740
+ gl.shaderSource(shader, source);
2741
+ gl.compileShader(shader);
2742
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
2743
+ throw new Error(gl.getShaderInfoLog(shader))
2744
+ }
2745
+ return shader
2746
+ };
2747
+ WebGLRenderer.prototype.allowsClampedTextureData = function() {
2748
+ var gl = this.gl;
2749
+ var texture = gl.createTexture();
2750
+ gl.bindTexture(gl.TEXTURE_2D, texture);
2751
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, 1, 1, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, new Uint8ClampedArray([0]));
2752
+ return gl.getError() === 0
2753
+ };
2754
+ WebGLRenderer.prototype.renderProgress = function(progress) {
2755
+ var gl = this.gl;
2756
+ gl.useProgram(this.loadingProgram);
2757
+ var loc = gl.getUniformLocation(this.loadingProgram, "progress");
2758
+ gl.uniform1f(loc, progress);
2759
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
2760
+ };
2761
+ WebGLRenderer.prototype.render = function(y, cb, cr, isClampedArray) {
2762
+ if (!this.enabled) {
2763
+ return
2764
+ }
2765
+ var gl = this.gl;
2766
+ var w = this.width + 15 >> 4 << 4,
2767
+ h = this.height,
2768
+ w2 = w >> 1,
2769
+ h2 = h >> 1;
2770
+ if (isClampedArray && this.shouldCreateUnclampedViews) {
2771
+ y = new Uint8Array(y.buffer), cb = new Uint8Array(cb.buffer), cr = new Uint8Array(cr.buffer)
2772
+ }
2773
+ gl.useProgram(this.program);
2774
+ this.updateTexture(gl.TEXTURE0, this.textureY, w, h, y);
2775
+ this.updateTexture(gl.TEXTURE1, this.textureCb, w2, h2, cb);
2776
+ this.updateTexture(gl.TEXTURE2, this.textureCr, w2, h2, cr);
2777
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
2778
+ };
2779
+ WebGLRenderer.prototype.updateTexture = function(unit, texture, w, h, data) {
2780
+ var gl = this.gl;
2781
+ gl.activeTexture(unit);
2782
+ gl.bindTexture(gl.TEXTURE_2D, texture);
2783
+ if (this.hasTextureData[unit]) {
2784
+ gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, w, h, gl.LUMINANCE, gl.UNSIGNED_BYTE, data)
2785
+ } else {
2786
+ this.hasTextureData[unit] = true;
2787
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, w, h, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data)
2788
+ }
2789
+ };
2790
+ WebGLRenderer.prototype.deleteTexture = function(unit, texture) {
2791
+ var gl = this.gl;
2792
+ gl.activeTexture(unit);
2793
+ gl.bindTexture(gl.TEXTURE_2D, null);
2794
+ gl.deleteTexture(texture)
2795
+ };
2796
+ WebGLRenderer.IsSupported = function() {
2797
+ try {
2798
+ if (!window.WebGLRenderingContext) {
2799
+ return false
2800
+ }
2801
+ var canvas = document.createElement("canvas");
2802
+ return !!(canvas.getContext("webgl") || canvas.getContext("experimental-webgl"))
2803
+ } catch (err) {
2804
+ return false
2805
+ }
2806
+ };
2807
+ WebGLRenderer.SHADER = {
2808
+ FRAGMENT_YCRCB_TO_RGBA: ["precision mediump float;", "uniform sampler2D textureY;", "uniform sampler2D textureCb;", "uniform sampler2D textureCr;", "varying vec2 texCoord;", "mat4 rec601 = mat4(", "1.16438, 0.00000, 1.59603, -0.87079,", "1.16438, -0.39176, -0.81297, 0.52959,", "1.16438, 2.01723, 0.00000, -1.08139,", "0, 0, 0, 1", ");", "void main() {", "float y = texture2D(textureY, texCoord).r;", "float cb = texture2D(textureCb, texCoord).r;", "float cr = texture2D(textureCr, texCoord).r;", "gl_FragColor = vec4(y, cr, cb, 1.0) * rec601;", "}"].join("\n"),
2809
+ FRAGMENT_LOADING: ["precision mediump float;", "uniform float progress;", "varying vec2 texCoord;", "void main() {", "float c = ceil(progress-(1.0-texCoord.y));", "gl_FragColor = vec4(c,c,c,1);", "}"].join("\n"),
2810
+ VERTEX_IDENTITY: ["attribute vec2 vertex;", "varying vec2 texCoord;", "void main() {", "texCoord = vertex;", "gl_Position = vec4((vertex * 2.0 - 1.0) * vec2(1, -1), 0.0, 1.0);", "}"].join("\n")
2811
+ };
2812
+ return WebGLRenderer
2813
+ }();
2814
+ JSMpeg.Renderer.Canvas2D = function() {
2815
+ "use strict";
2816
+ var CanvasRenderer = function(options) {
2817
+ this.canvas = options.canvas || document.createElement("canvas");
2818
+ this.width = this.canvas.width;
2819
+ this.height = this.canvas.height;
2820
+ this.enabled = true;
2821
+ this.context = this.canvas.getContext("2d")
2822
+ };
2823
+ CanvasRenderer.prototype.destroy = function() {
2824
+ this.canvas.remove()
2825
+ };
2826
+ CanvasRenderer.prototype.resize = function(width, height) {
2827
+ this.width = width | 0;
2828
+ this.height = height | 0;
2829
+ this.canvas.width = this.width;
2830
+ this.canvas.height = this.height;
2831
+ this.imageData = this.context.getImageData(0, 0, this.width, this.height);
2832
+ JSMpeg.Fill(this.imageData.data, 255)
2833
+ };
2834
+ CanvasRenderer.prototype.renderProgress = function(progress) {
2835
+ var w = this.canvas.width,
2836
+ h = this.canvas.height,
2837
+ ctx = this.context;
2838
+ ctx.fillStyle = "#222";
2839
+ ctx.fillRect(0, 0, w, h);
2840
+ ctx.fillStyle = "#fff";
2841
+ ctx.fillRect(0, h - h * progress, w, h * progress)
2842
+ };
2843
+ CanvasRenderer.prototype.render = function(y, cb, cr) {
2844
+ this.YCbCrToRGBA(y, cb, cr, this.imageData.data);
2845
+ this.context.putImageData(this.imageData, 0, 0)
2846
+ };
2847
+ CanvasRenderer.prototype.YCbCrToRGBA = function(y, cb, cr, rgba) {
2848
+ if (!this.enabled) {
2849
+ return
2850
+ }
2851
+ var w = this.width + 15 >> 4 << 4,
2852
+ w2 = w >> 1;
2853
+ var yIndex1 = 0,
2854
+ yIndex2 = w,
2855
+ yNext2Lines = w + (w - this.width);
2856
+ var cIndex = 0,
2857
+ cNextLine = w2 - (this.width >> 1);
2858
+ var rgbaIndex1 = 0,
2859
+ rgbaIndex2 = this.width * 4,
2860
+ rgbaNext2Lines = this.width * 4;
2861
+ var cols = this.width >> 1,
2862
+ rows = this.height >> 1;
2863
+ var ccb, ccr, r, g, b;
2864
+ for (var row = 0; row < rows; row++) {
2865
+ for (var col = 0; col < cols; col++) {
2866
+ ccb = cb[cIndex];
2867
+ ccr = cr[cIndex];
2868
+ cIndex++;
2869
+ r = ccb + (ccb * 103 >> 8) - 179;
2870
+ g = (ccr * 88 >> 8) - 44 + (ccb * 183 >> 8) - 91;
2871
+ b = ccr + (ccr * 198 >> 8) - 227;
2872
+ var y1 = y[yIndex1++];
2873
+ var y2 = y[yIndex1++];
2874
+ rgba[rgbaIndex1] = y1 + r;
2875
+ rgba[rgbaIndex1 + 1] = y1 - g;
2876
+ rgba[rgbaIndex1 + 2] = y1 + b;
2877
+ rgba[rgbaIndex1 + 4] = y2 + r;
2878
+ rgba[rgbaIndex1 + 5] = y2 - g;
2879
+ rgba[rgbaIndex1 + 6] = y2 + b;
2880
+ rgbaIndex1 += 8;
2881
+ var y3 = y[yIndex2++];
2882
+ var y4 = y[yIndex2++];
2883
+ rgba[rgbaIndex2] = y3 + r;
2884
+ rgba[rgbaIndex2 + 1] = y3 - g;
2885
+ rgba[rgbaIndex2 + 2] = y3 + b;
2886
+ rgba[rgbaIndex2 + 4] = y4 + r;
2887
+ rgba[rgbaIndex2 + 5] = y4 - g;
2888
+ rgba[rgbaIndex2 + 6] = y4 + b;
2889
+ rgbaIndex2 += 8
2890
+ }
2891
+ yIndex1 += yNext2Lines;
2892
+ yIndex2 += yNext2Lines;
2893
+ rgbaIndex1 += rgbaNext2Lines;
2894
+ rgbaIndex2 += rgbaNext2Lines;
2895
+ cIndex += cNextLine
2896
+ }
2897
+ };
2898
+ return CanvasRenderer
2899
+ }();
2900
+ JSMpeg.AudioOutput.WebAudio = function() {
2901
+ "use strict";
2902
+ var WebAudioOut = function(options) {
2903
+ this.context = WebAudioOut.CachedContext = WebAudioOut.CachedContext || new(window.AudioContext || window.webkitAudioContext);
2904
+ this.gain = this.context.createGain();
2905
+ this.destination = this.gain;
2906
+ this.gain.connect(this.context.destination);
2907
+ this.context._connections = (this.context._connections || 0) + 1;
2908
+ this.startTime = 0;
2909
+ this.buffer = null;
2910
+ this.wallclockStartTime = 0;
2911
+ this.volume = 1;
2912
+ this.enabled = true;
2913
+ this.unlocked = !WebAudioOut.NeedsUnlocking();
2914
+ Object.defineProperty(this, "enqueuedTime", {
2915
+ get: this.getEnqueuedTime
2916
+ })
2917
+ };
2918
+ WebAudioOut.prototype.destroy = function() {
2919
+ this.gain.disconnect();
2920
+ this.context._connections--;
2921
+ if (this.context._connections === 0) {
2922
+ this.context.close();
2923
+ WebAudioOut.CachedContext = null
2924
+ }
2925
+ };
2926
+ WebAudioOut.prototype.play = function(sampleRate, left, right) {
2927
+ if (!this.enabled) {
2928
+ return
2929
+ }
2930
+ if (!this.unlocked) {
2931
+ var ts = JSMpeg.Now();
2932
+ if (this.wallclockStartTime < ts) {
2933
+ this.wallclockStartTime = ts
2934
+ }
2935
+ this.wallclockStartTime += left.length / sampleRate;
2936
+ return
2937
+ }
2938
+ this.gain.gain.value = this.volume;
2939
+ var buffer = this.context.createBuffer(2, left.length, sampleRate);
2940
+ buffer.getChannelData(0).set(left);
2941
+ buffer.getChannelData(1).set(right);
2942
+ var source = this.context.createBufferSource();
2943
+ source.buffer = buffer;
2944
+ source.connect(this.destination);
2945
+ var now = this.context.currentTime;
2946
+ var duration = buffer.duration;
2947
+ if (this.startTime < now) {
2948
+ this.startTime = now;
2949
+ this.wallclockStartTime = JSMpeg.Now()
2950
+ }
2951
+ source.start(this.startTime);
2952
+ this.startTime += duration;
2953
+ this.wallclockStartTime += duration
2954
+ };
2955
+ WebAudioOut.prototype.stop = function() {
2956
+ this.gain.gain.value = 0
2957
+ };
2958
+ WebAudioOut.prototype.getEnqueuedTime = function() {
2959
+ return Math.max(this.wallclockStartTime - JSMpeg.Now(), 0)
2960
+ };
2961
+ WebAudioOut.prototype.resetEnqueuedTime = function() {
2962
+ this.startTime = this.context.currentTime;
2963
+ this.wallclockStartTime = JSMpeg.Now()
2964
+ };
2965
+ WebAudioOut.prototype.unlock = function(callback) {
2966
+ if (this.unlocked) {
2967
+ if (callback) {
2968
+ callback()
2969
+ }
2970
+ return
2971
+ }
2972
+ this.unlockCallback = callback;
2973
+ var buffer = this.context.createBuffer(1, 1, 22050);
2974
+ var source = this.context.createBufferSource();
2975
+ source.buffer = buffer;
2976
+ source.connect(this.destination);
2977
+ source.start(0);
2978
+ setTimeout(this.checkIfUnlocked.bind(this, source, 0), 0)
2979
+ };
2980
+ WebAudioOut.prototype.checkIfUnlocked = function(source, attempt) {
2981
+ if (source.playbackState === source.PLAYING_STATE || source.playbackState === source.FINISHED_STATE) {
2982
+ this.unlocked = true;
2983
+ if (this.unlockCallback) {
2984
+ this.unlockCallback();
2985
+ this.unlockCallback = null
2986
+ }
2987
+ } else if (attempt < 10) {
2988
+ setTimeout(this.checkIfUnlocked.bind(this, source, attempt + 1), 100)
2989
+ }
2990
+ };
2991
+ WebAudioOut.NeedsUnlocking = function() {
2992
+ return /iPhone|iPad|iPod/i.test(navigator.userAgent)
2993
+ };
2994
+ WebAudioOut.IsSupported = function() {
2995
+ return window.AudioContext || window.webkitAudioContext
2996
+ };
2997
+ WebAudioOut.CachedContext = null;
2998
+ return WebAudioOut
2999
+ }();
3000
+ JSMpeg.WASMModule = function() {
3001
+ "use strict";
3002
+ var WASM = function() {
3003
+ this.stackSize = 5 * 1024 * 1024;
3004
+ this.pageSize = 64 * 1024;
3005
+ this.onInitCallback = null;
3006
+ this.ready = false
3007
+ };
3008
+ WASM.prototype.write = function(buffer) {
3009
+ this.loadFromBuffer(buffer, this.onInitCallback)
3010
+ };
3011
+ WASM.prototype.loadFromFile = function(url, callback) {
3012
+ this.onInitCallback = callback;
3013
+ var ajax = new JSMpeg.Source.Ajax(url, {});
3014
+ ajax.connect(this);
3015
+ ajax.start()
3016
+ };
3017
+ WASM.prototype.loadFromBuffer = function(buffer, callback) {
3018
+ this.moduleInfo = this.readDylinkSection(buffer);
3019
+ if (!this.moduleInfo) {
3020
+ this.callback && this.callback(null);
3021
+ return
3022
+ }
3023
+ this.memory = new WebAssembly.Memory({
3024
+ initial: 256
3025
+ });
3026
+ var env = {
3027
+ memory: this.memory,
3028
+ memoryBase: 0,
3029
+ __memory_base: 0,
3030
+ table: new WebAssembly.Table({
3031
+ initial: this.moduleInfo.tableSize,
3032
+ element: "anyfunc"
3033
+ }),
3034
+ tableBase: 0,
3035
+ __table_base: 0,
3036
+ abort: this.c_abort.bind(this),
3037
+ ___assert_fail: this.c_assertFail.bind(this),
3038
+ _sbrk: this.c_sbrk.bind(this)
3039
+ };
3040
+ this.brk = this.align(this.moduleInfo.memorySize + this.stackSize);
3041
+ WebAssembly.instantiate(buffer, {
3042
+ env: env
3043
+ }).then(function(results) {
3044
+ this.instance = results.instance;
3045
+ if (this.instance.exports.__post_instantiate) {
3046
+ this.instance.exports.__post_instantiate()
3047
+ }
3048
+ this.createHeapViews();
3049
+ this.ready = true;
3050
+ callback && callback(this)
3051
+ }.bind(this))
3052
+ };
3053
+ WASM.prototype.createHeapViews = function() {
3054
+ this.instance.heapU8 = new Uint8Array(this.memory.buffer);
3055
+ this.instance.heapU32 = new Uint32Array(this.memory.buffer);
3056
+ this.instance.heapF32 = new Float32Array(this.memory.buffer)
3057
+ };
3058
+ WASM.prototype.align = function(addr) {
3059
+ var a = Math.pow(2, this.moduleInfo.memoryAlignment);
3060
+ return Math.ceil(addr / a) * a
3061
+ };
3062
+ WASM.prototype.c_sbrk = function(size) {
3063
+ var previousBrk = this.brk;
3064
+ this.brk += size;
3065
+ if (this.brk > this.memory.buffer.byteLength) {
3066
+ var bytesNeeded = this.brk - this.memory.buffer.byteLength;
3067
+ var pagesNeeded = Math.ceil(bytesNeeded / this.pageSize);
3068
+ this.memory.grow(pagesNeeded);
3069
+ this.createHeapViews()
3070
+ }
3071
+ return previousBrk
3072
+ };
3073
+ WASM.prototype.c_abort = function(size) {
3074
+ console.warn("JSMPeg: WASM abort", arguments)
3075
+ };
3076
+ WASM.prototype.c_assertFail = function(size) {
3077
+ console.warn("JSMPeg: WASM ___assert_fail", arguments)
3078
+ };
3079
+ WASM.prototype.readDylinkSection = function(buffer) {
3080
+ var bytes = new Uint8Array(buffer);
3081
+ var next = 0;
3082
+ var readVarUint = function() {
3083
+ var ret = 0;
3084
+ var mul = 1;
3085
+ while (1) {
3086
+ var byte = bytes[next++];
3087
+ ret += (byte & 127) * mul;
3088
+ mul *= 128;
3089
+ if (!(byte & 128)) {
3090
+ return ret
3091
+ }
3092
+ }
3093
+ };
3094
+ var matchNextBytes = function(expected) {
3095
+ for (var i = 0; i < expected.length; i++) {
3096
+ var b = typeof expected[i] === "string" ? expected[i].charCodeAt(0) : expected[i];
3097
+ if (bytes[next++] !== b) {
3098
+ return false
3099
+ }
3100
+ }
3101
+ return true
3102
+ };
3103
+ if (!matchNextBytes([0, "a", "s", "m"])) {
3104
+ console.warn("JSMpeg: WASM header not found");
3105
+ return null
3106
+ }
3107
+ var next = 9;
3108
+ var sectionSize = readVarUint();
3109
+ if (!matchNextBytes([6, "d", "y", "l", "i", "n", "k"])) {
3110
+ console.warn("JSMpeg: No dylink section found in WASM");
3111
+ return null
3112
+ }
3113
+ return {
3114
+ memorySize: readVarUint(),
3115
+ memoryAlignment: readVarUint(),
3116
+ tableSize: readVarUint(),
3117
+ tableAlignment: readVarUint()
3118
+ }
3119
+ };
3120
+ WASM.IsSupported = function() {
3121
+ return !!window.WebAssembly
3122
+ };
3123
+ WASM.GetModule = function() {
3124
+ WASM.CACHED_MODULE = WASM.CACHED_MODULE || new WASM;
3125
+ return WASM.CACHED_MODULE
3126
+ };
3127
+ return WASM
3128
+ }();
3129
+ JSMpeg.WASM_BINARY_INLINED = "AGFzbQEAAAAADwZkeWxpbmvwz8ACBAAAAAE0CWAEf39/fwBgAX8Bf2ACf38Bf2ABfwBgAn9/AGABfwF9YAZ/f39/f38AYAN/f38Bf2AAAAJGBANlbnYOX19fYXNzZXJ0X2ZhaWwAAANlbnYFX3NicmsAAQNlbnYNX19tZW1vcnlfYmFzZQN/AANlbnYGbWVtb3J5AgCAAgM9PAIDAgEEBAMBBQEBAQEBAQEDBAMGAwQAAwAAAAIDAgEEBAEBAQEBAAACAwIBAgECAQEBAQMEAwMCBwcHCAYLAn8BQQALfwFBAAsHggYfEl9fcG9zdF9pbnN0YW50aWF0ZQA9BV9mcmVlADgHX21hbGxvYwAxB19tZW1jcHkAOghfbWVtbW92ZQA7B19tZW1zZXQAPBNfbXAyX2RlY29kZXJfY3JlYXRlAB0TX21wMl9kZWNvZGVyX2RlY29kZQAmFF9tcDJfZGVjb2Rlcl9kZXN0cm95AB4WX21wMl9kZWNvZGVyX2RpZF93cml0ZQAiFl9tcDJfZGVjb2Rlcl9nZXRfaW5kZXgAICFfbXAyX2RlY29kZXJfZ2V0X2xlZnRfY2hhbm5lbF9wdHIAJCJfbXAyX2RlY29kZXJfZ2V0X3JpZ2h0X2NoYW5uZWxfcHRyACUcX21wMl9kZWNvZGVyX2dldF9zYW1wbGVfcmF0ZQAjGl9tcDJfZGVjb2Rlcl9nZXRfd3JpdGVfcHRyAB8WX21wMl9kZWNvZGVyX3NldF9pbmRleAAhFV9tcGVnMV9kZWNvZGVyX2NyZWF0ZQACFV9tcGVnMV9kZWNvZGVyX2RlY29kZQARFl9tcGVnMV9kZWNvZGVyX2Rlc3Ryb3kAAxhfbXBlZzFfZGVjb2Rlcl9kaWRfd3JpdGUABxlfbXBlZzFfZGVjb2Rlcl9nZXRfY2JfcHRyABAdX21wZWcxX2RlY29kZXJfZ2V0X2NvZGVkX3NpemUACxlfbXBlZzFfZGVjb2Rlcl9nZXRfY3JfcHRyAA8dX21wZWcxX2RlY29kZXJfZ2V0X2ZyYW1lX3JhdGUAChlfbXBlZzFfZGVjb2Rlcl9nZXRfaGVpZ2h0AA0YX21wZWcxX2RlY29kZXJfZ2V0X2luZGV4AAUYX21wZWcxX2RlY29kZXJfZ2V0X3dpZHRoAAwcX21wZWcxX2RlY29kZXJfZ2V0X3dy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BQJ/IANBzQBHDQIgACgCgAFBBhAwIQMCQAJAIAAoAoABQQgQMCIEIgYEQCAGQYABRgRADAIFDAMLAAsgACgCgAFBCBAwDAILIAAoAoABQQgQMEGAfmoMAQsgBEGAfmogBCAEQYABShsLCyEEDAELIAZB/wFxIgNBACADayAAKAKAAUEBEDBFGyEEIAZBCHUhAwsgAiADaiIGIwBBQGtqLQAAIgMgBWotAAAgACgCREEAIARBAXQiAkEfdUEBciAAKAJcGyACamxsIgJBBHVBAEEBQX8gAkEPShsgAkEQcRtrIgJBgHAgAkGAcEobIQIgAEGcAWogA0ECdGogAyMAQZA1amotAAAgAkH/DyACQf8PSBtsNgIAIAZBAWohAgwBCwsgAUEESARAIABBhAFqIQUgAUEDdEEIcSAAKAJUIAAoAhgiAyAAKAJQbGpBBHRyIANBA3RBACABQQJxG2ohBAUgAEGMAWogAEGIAWogAUEERhshBSAAKAJQIAAoAhgiAUECdGwgACgCVEEDdGohBCABQQF1IQMLIANBeGohAyAFKAIAIQUgAkEBRiECIABBnAFqIQEgACgCXARAIAIEQCABKAIAQYABakEIdSAFIAQgAxAYIAFBADYCAAUgARAZIAEgBSAEIAMQGiABQQBBgAIQPBoLBSACBEAgASgCAEGAAWpBCHUgBSAEIAMQGyABQQA2AgAFIAEQGSABIAUgBCADEBwgAUEAQYACEDwaCwsL7AYAIAEgAmogAEEAIABBAEobIgBB/wEgAEH/AUgbQf8BcSIAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAACABIAIgA0EIaiIDaiICaiAAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAACABIAIgA2oiAmogADoAACABIAJBAWpqIAA6AAAgASACQQJqaiAAOgAAIAEgAkEDamogADoAACABIAJBBGpqIAA6AAAgASACQQVqaiAAOgAAIAEgAkEGamogADoAACABIAJBB2pqIAA6AAAgASACIANqIgJqIAA6AAAgASACQQFqaiAAOgAAIAEgAkECamogADoAACABIAJBA2pqIAA6AAAgASACQQRqaiAAOgAAIAEgAkEFamogADoAACABIAJBBmpqIAA6AAAgASACQQdqaiAAOgAAIAEgAiADaiICaiAAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAACABIAIgA2oiAmogADoAACABIAJBAWpqIAA6AAAgASACQQJqaiAAOgAAIAEgAkEDamogADoAACABIAJBBGpqIAA6AAAgASACQQVqaiAAOgAAIAEgAkEGamogADoAACABIAJBB2pqIAA6AAAgASACIANqIgJqIAA6AAAgASACQQFqaiAAOgAAIAEgAkECamogADoAACABIAJBA2pqIAA6AAAgASACQQRqaiAAOgAAIAEgAkEFamogADoAACABIAJBBmpqIAA6AAAgASACQQdqaiAAOgAAIAEgAiADaiICaiAAOgAAIAEgAkEBamogADoAACABIAJBAmpqIAA6AAAgASACQQNqaiAAOgAAIAEgAkEEamogADoAACABIAJBBWpqIAA6AAAgASACQQZqaiAAOgAAIAEgAkEHamogADoAAAubBgEUfwNAIAFBEGpBAnQgAGoiBygCACIGIAFBMGpBAnQgAGoiDSgCACIJaiEFIAFBCGpBAnQgAGoiDigCACICIAFBOGpBAnQgAGoiDygCACIDaiEEIAIgA2siEEHZA2wgAUEoakECdCAAaiIKKAIAIgIgAUEYakECdCAAaiIRKAIAIgNrIgtBvH5sQYABampBCHUgBCACIANqIghqIgJrIgMgBCAIa0HqAmxBgAFqQQh1ayEEIAFBAnQgAGoiCCgCACIMIAFBIGpBAnQgAGoiEigCACITayIUIAYgCWtB6gJsQYABakEIdSAFayIJaiEGIAggAiAMIBNqIgggBWoiDGo2AgAgDiADIAZqNgIAIAcgFCAJayIHIARrNgIAIBEgC0HZA2xBgAFqIBBBxAFsakEIdSAEaiIJIAggBWsiBWo2AgAgEiAFIAlrNgIAIAogBCAHajYCACANIAYgA2s2AgAgDyAMIAJr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aiABQQxsaiAAKAIIQQYQMCICNgLUAiAAIANBgANsaiABQQxsaiACNgLQAiAFIAI2AgAMAgsgBSAAKAIIQQYQMDYCACAAIANBgANsaiABQQxsaiAAKAIIQQYQMCICNgLUAiAAIANBgANsaiABQQxsaiACNgLQAgsLCyADQQFqIgMgCEkNAAsgAUEBaiIBIAtHDQALCwsLaiALQSBJIRwgAEHM9gBqIRYgAEHMlgFqIQQgAEHMCGohHSAAQcwLaiEeA0BBACEXIBQhAwNAIBkEQEEAIQEDQCAAQQAgASAOECggAEEBIAEgDhAoIAFBAWoiASANSA0ACwsgGgRAIA0hAQNAIABBACABIA4QKCAAQcwLaiABQQxsaiAAQcwIaiABQQxsaigCADYCACAAIAFBDGxqQdALaiAAIAFBDGxqQdAIaigCADYCACAAIAFBDGxqQdQLaiAAIAFBDGxqQdQIaigCADYCACABQQFqIgEgC0gNAAsLIBwEQCALIQEDQCAAQcwIaiABQQxsakEANgIAIAAgAUEMbGpB0AhqQQA2AgAgACABQQxsakHUCGpBADYCACAAQcwLaiABQQxsakEANgIAIAAgAUEMbGpB0AtqQQA2AgAgACABQQxsakHUC2pBADYCACABQQFqIgFBIEcNAAsLIAAoAgQhASADIRFBACESA0AgACABQcAHakH/B3EiATYCBCAdIBIgFiABECkgBEIANwIAIARCADcCCCAEQgA3AhAgBEIANwIYIARCADcCICAEQgA3AiggBEIANwIwIARCADcCOCAEQUBrQgA3AgAgBEIANwJIIARCADcCUCAEQgA3AlggBEIANwJgIARCADcCaCAEQgA3AnAgBEIANwJ4IAAoAgQiD0EBdSETQf8HIA9BgAFvQQF1IgxrIgFBgH9xIRUgAUEHdkEGdEHABGohEEGABCATayEGIAwhAQNAIAYhB0EAIQkgASECA0AgB0EBaiEIIAJBAWohBSAAQcyWAWogCUECdGoiCiAAQczWAGogB0ECdGoqAgAgAEHM9gBqIAJBAnRqKgIAlCAKKAIAspKoNgIAIAlBAWoiCUEgRwRAIAghByAFIQIMAQsLIAFBgAFqIQIgBkFAayEGIAFBgAdIBEAgAiEBDAELC0HgByAMIBVqayIBQYAISARAIBAgE2tBoHxqIQYDQCABQR9qIAYh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ujBFka7n9D+itiJLk7tEuEt/Zp6g5j+itiI6kiEqIANBMGpBAnQgAmogTSA8kow4AgAgA0EvakECdCACaiApICiSIEwgSZIgJJIiKJKMIik4AgAgA0ExakECdCACaiApOAIAIANBLmpBAnQgAmogRiBFkiAjkowiKTgCACADQTJqQQJ0IAJqICk4AgAgA0EtakECdCACaiAwIC2SIEAgPpIgJpIiKZIiPCAokowiKDgCACADQTNqQQJ0IAJqICg4AgAgA0EsakECdCACaiA2IE+SIFEgUJIgNZIiKJKMIjY4AgAgA0E0akECdCACaiA2OAIAIANBK2pBAnQgAmogPCA/IDiSIDOSIjwgJJIiJJKMIjY4AgAgA0E1akECdCACaiA2OAIAIANBKmpBAnQgAmogPSBSkiA7kiI9ICOSjCIjOAIAIANBNmpBAnQgAmogIzgCACADQSlqQQJ0IAJqIEsgSpIgOpIiIyAkkowiJDgCACADQTdqQQJ0IAJqICQ4AgAgA0EoakECdCACaiBIIE6SIDGSjCIkOAIAIANBOGpBAnQgAmogJDgCACADQSdqQQJ0IAJqICMgPCArkiIjkowiJDgCACADQTlqQQJ0IAJqICQ4AgAgA0EmakECdCACaiA9ICeSjCIkOAIAIANBOmpBAnQgAmogJDgCACADQSVqQQJ0IAJqICkgLSAwk7tEuEt/Zp6g5j+itiIpkiItICOSjCIjOAIAIANBO2pBAnQgAmogIzgCACADQSRqQQJ0IAJqICggR5KMIiM4AgAgA0E8akECdCACaiAjOAIAIANBI2pBAnQgAmogLSArIDKSIiOSjCIoOAIAIANBPWpBAnQgAmogKDgCACADQSJqQQJ0IAJqICcgU5KMIic4AgAgA0E+akECdCACaiAnOAIAIANBIWpBAnQgAmogIyBCkowiIzgCACADQT9qQQJ0IAJqICM4AgAgA0EgakECdCACaiA0jDgCACADQQJ0IAJqIDQ4AgAgA0EfakECdCACaiAsjDgCACADQQFqQQJ0IAJqICw4AgAgA0EeakECdCACaiA5jDgCACADQQJqQQJ0IAJqIDk4AgAgA0EdakECdCACaiApICaSIjQgQZIiI4w4AgAgA0EDakECdCACaiAjOAIAIANBHGpBAnQgAmogL4w4AgAgA0EEakECdCACaiAvOAIAIANBG2pBAnQgAmogNCA3IDOSIjSSIi+MOAIAIANBBWpBAnQgAmogLzgCACADQRpqQQJ0IAJqIEQgO5IiL4w4AgAgA0EGakECdCACaiAvOAIAIANBGWpBAnQgAmogNCA6kiI0jDgCACADQQdqQQJ0IAJqIDQ4AgAgA0EYakECdCACaiAxjDgCACADQQhqQQJ0IAJqIDE4AgAgA0EXakECdCACaiAqjDgCACADQQlqQQJ0IAJqICo4AgAgA0EWakECdCACaiA7IC6SIjGMOAIAIANBCmpBAnQgAmogMTgCACADQRVqQQJ0IAJqIEMgJpIiMYw4AgAgA0ELakECdCACaiAxOAIAIANBFGpBAnQgAmogNYw4AgAgA0EMakECdCACaiA1OAIAIANBE2pBAnQgAmogJiAlkiImjDgCACADQQ1qQQJ0IAJqICY4AgAgA0ESakECdCACaiAujDgCACADQQ5qQQJ0IAJqIC44AgAgA0ERakECdCACaiAljDgCACADQQ9qQQJ0IAJqICU4AgAgA0EQakECdCACakMAAAAAOAIACy8BAX9BFBAxIgIgATYCECACIAAQMTYCACACIAA2AgggAkEANgIMIAJBADYCBCACCw0AIAAoAgAQOCAAEDgL6QEBBH8gACgCCCIDIAAoAgwiAmsiBCABSQRAAkAgACgCEEECRgRAIAAgACgCACABIARrIANBAXQiAiACIARqIAFJGyIBEDk2AgAgACABNgIIIAAoAgQgACgCDCIBQQN0IgJNDQEgACACNgIEDAELIAIgACgCBCIFQQN2IgNGIAMgBGogAUlyBEAgAEEANgIMIABBADYCBEEAIQEMAQsgAwRAIAAoAgAiASABIANqIAIgA2sQOxogACAAKAIMIANrIgE2AgwgACAAKAIEIAVBeHFrNgIEBSACIQELCwUgAiEBCyAAKAIAIAFqC40BAQR/IAAoAgRBB2pBA3YiASAAKAIMIgRJBEACQCAAKAIAIQIDQAJAIAFBAWohAyABIAJqLAAARQRAIAIgA2osAABFBEAgAiABQQJqaiwAAEEBRg0CCwsgAyAETw0CIAMhAQwBCwsgACABQQN0QSBqNgIEIAIgAUEDamotAAAPCwsgACAEQQN0NgIEQX8LqQEBBH8gACgCBEEHakEDdiICIAAoAgwiBUkEQAJAIAAoAgAhBANAAkAgAkEBaiEDAkACQCACIARqLAAADQAgAyAEaiwAAA0AIAQgAkECamosAABBAUcNACAAIAJBA3QiA0EgajYCBCABIAQgAkEDamotAABGDQIgA0EnakEDdiICIAVPDQQMAQsgAyAFTw0DIAMhAgsMAQsLIAEPCwsgACAFQQN0NgIEQX8LTwEBfyAAKAIEQQdqQQN2IgEgACgCDE8EQEEBDwsgACgCACIAIAFqLAAABEBBAA8LIAAgAUEBamosAAAEQEEADwsgACABQQJqaiwAAEEBRguGAQEGfyAAKAIEIQYgAUUEQCAAIAEgBmo2AgRBAA8LIAAoAgAhByABIQMgBiEEA0AgAkEIIARBB3FrIgIgAyACIANJGyIFdCAHIARBA3VqLQAAQf8BQQggBWt2IAIgBWsiAnRxIAJ2ciECIAQgBWohBCADIAVrIgMNAAsgACABIAZqNgIEIAILhgMBA38gAEUEQEEADwsgABAyIgEEQCABIQAFAkACQCMAQaTOwAJqKAIAIgFFDQAgASgCACICQQFxDQAgASACQQFyNgIAIAJBAXZBeGoiAkUEQCMAQeXIAGojAEHuyABqQYICIwBBpckAahAAC0EfIAJBCCACQQhLGyICZ2tBASACGyICQX1qQR1PBEAjAEG2yQBqIwBB7sgAakGHAiMAQaXJAGoQAAsjAEGgzQBqIAJBAnRqIgMoAgAgAUEIaiICRgRAIAMgASgCDDYCAAsgAigCACIDBEAgAyABKAIMNgIECyABKAIMIgEEQCABIAIoAgA2AgALIAAQM0UjAEGkzsACaigCACEABEAgACAAKAIAQX5xNgIAQQAPCwwBCyAAEDQhAAsgAEUEQEEADwsLIAAoAgBBAXYgAGpBABABSwRAIwBB8MkAaiMAQe7IAGpBtwYjAEGMygBqEAALIAAoAgBBAXFFBEAjAEGcygBqIwBB7sgAakHOASMAQa7KAGoQAAsgAEEIaguJBQEFfyAARQRAIwBB5cgAaiMAQe7IAGpBkgIjAEHRywBqEAALQR8gAEEIIABBCEsbIgFna0EBIAEbIgFBfWpBHU8EQCMAQbbJAGojAEHuyABqQYcCIwBBpckAahAACyAAaUEBRyABaiIDQQNLQQEgA3QgAEtxBEAjACADQQJ0akGczQBqKAIAIgEEQAJAA0AgAUF4aiIEKAIAQQF2QXhqIgUgAEkEQCABKAIEIgFBAEcgAkEBaiICQSBJcUUNAgwBCwsgBUUEQCMAQeXIAGojAEHuyABqQYICIwBBpckAahAAC0EfIAVBCCAFQQhLGyICZ2tBASACGyICQX1qQR1PBEAjAEG2yQBqIwBB7sgAakGHAiMAQaXJAGoQAAsjAEGgzQBqIAJBAnRqIgIoAgAgAUYEQCACIAEoAgQ2AgALIAEoAgAiAgRAIAIgASgCBDYCBAsgASgCBCICBEAgAiABKAIANgIACyAEIAQoAgBBAXI2AgAgBCAAEDYgBA8LCwsgA0EgTwRAQQAPCyADIQECQAJAA0AjAEGgzQBqIAFBAnRqKAIAIgJFBEAgAUEBaiIBQSBPDQIMAQsLDAELQQAPCyACQXhqIgEoAgBBAXZBeGoiA0UEQCMAQeXIAGojAEHuyABqQYICIwBBpckAahAAC0EfIANBCCADQQhLGyIDZ2tBASADGyIDQX1qQR1PBEAjAEG2yQBqIwBB7sgAakGHAiMAQaXJAGoQAAsgAiMAQaDNAGogA0ECdGoiAygCAEYEQCADIAIoAgQ2AgALIAIoAgAiAwRAIAMgAigCBDYCBAsgAigCBCIDBEAgAyACKAIANgIACyABIAEoAgBBAXI2AgAgASAAEDYgAQvDAgEEfyAAQQ9qQXhxIwBBpM7AAmooAgAoAgBBAXZrIgMQASICQX9GBEBBAA8LIwBBpM7AAmooAgAiACgCACIEQQF2IQEgAiAAIAFqRwRAIwBBlssAaiMAQe7IAGpBqwMjAEGyywBqEAALIARBAXFFBEAgAUF4aiIBRQRAIwBB5cgAaiMAQe7IAGpBggIjAEGlyQBqEAALQR8gAUEIIAFBCEsbIgFna0EBIAEbIgFBfWpBHU8EQCMAQbbJAGojAEHuyABqQYcCIwBBpckAahAACyMAQaDNAGogAUECdGoiAigCACAAQQhqIgFGBEAgAiAAKAIMNgIACyABKAIAIgIEQCACIAAoAgw2AgQLIAAoAgwiAgRAIAIgASgCADYCAAsLIAAgACgCACADQQF0aiIBNgIAIAFBAXEEQEEBDwsgABA1QQEL1QIBBX8gAEEPakF4cSIEEAEiAUF/RgRAQQAPCwJAAkAgAUEHakF4cSIAIgUgAUYEQCMAQaDOwAJqKAIAQQBHIQIjAEGkzsACaigCACIBRQRAIAJFDQIjAEH9ygBqIwBB7sgAakH3BSMAQeLKAGoQAAsgAgRAIAAgATYCBCAAIQMFIwBBissAaiMAQe7IAGpB+wUjAEHiygBqEAALBSAAIAFrEAEiAkF/RgRAQQAPCyACIAEgBGpHBEAjAEG5ygBqIwBB7sgAakHsBSMAQeLKAGoQAAsjAEGkzsACaigCAARAIwBB8coAaiMAQe7IAGpB7gUjAEHiygBqEAALIwBBoM7AAmooAgBFDQEjAEH9ygBqIwBB7sgAakH3BSMAQeLKAGoQAAsMAQsjAEGgzsACaiAFNgIAIAAhAwsjAEGkzsACaiAFNgIAIAMgBEEBdEEBcjYCACADC9IBAQJ/IAAgACgCAEEBdmpBABABSwRAIwBB8MkAaiMAQe7IAGpBvAIjAEHDywBqEAALIAAoAgBBAXZBeGoiAUUEQCMAQeXIAGojAEHuyABqQYICIwBBpckAahAAC0EfIAFBCCABQQhLGyIBZ2tBASABGyIBQX1qQR1PBEAjAEG2yQBqIwBB7sgAakGHAiMAQaXJAGoQAAsjAEGgzQBqIAFBAnRqIgIoAgAhASACIABBCGoiAjYCACAAQQA2AgggACABNgIMIAFFBEAPCyABIAI2AgALzwIBBH8gACgCACIEQQF2IgVBeGoiAyABSQRAIwBB68sAaiMAQe7IAGpBtgMjAEH/ywBqEAALIAMgAWsiA0F4cUEIRiAAIwBBpM7AAmooAgBGcQRAIAUQM0UEQA8LIANBCGpBD0sEQCAAKAIAIQIFIwBBlswAaiMAQe7IAGpBxwMjAEH/ywBqEAALBSADQQ9LBH8gBAUPCyECCyACQQFxIgRFBEAjAEGcygBqIwBB7sgAakHOASMAQa7KAGoQAAsgACAEIAAgAWpBD2pBeHEiASAAa0EBdHI2AgAgACACQQF2aiABayICQQ9NBEAjAEGvzABqIwBB7sgAakHWAyMAQf/LAGoQAAsgASABKAIAQQFxIAJBAXRyNgIAIAEgADYCBCMAQaTOwAJqIAEgAkH/////B3FqQQRqIAAjAEGkzsACaigCAEYbIAE2AgAgARA3C6gHAQd/IAAgACgCACIDQX5xNgIAIAAgA0EBdmpBABABSwRAIwBB8MkAaiMAQe7IAGpBzgIjAEHRzABqEAALIAAoAgQhASAAIwBBpM7AAmooAgAiBUYiBwR/QQAhA0EABSAAIAAoAgBBAXZqIgMLIQYgAQRAIAEoAgAiAkEBcUUEQCACQQF2QXhqIgJFBEAjAEHlyABqIwBB7sgAakGCAiMAQaXJAGoQAAtBHyACQQggAkEISxsiAmdrQQEgAhsiAkF9akEdTwRAIwBBtskAaiMAQe7IAGpBhwIjAEGlyQBqEAALIwBBoM0AaiACQQJ0aiIEKAIAIAFBCGoiAkYEQCAEIAEoAgw2AgALIAIoAgAiBARAIAQgASgCDDYCBAsgASgCDCIEBEAgBCACKAIANgIACyABIAEoAgAgACgCAEF+cWo2AgACQAJAIAMEQCADIAE2AgQgAygCACIAQQFxRQRAIABBAXZBeGoiAEUEQCMAQeXIAGojAEHuyABqQYICIwBBpckAahAAC0EfIABBCCAAQQhLGyIAZ2tBASAAGyIAQX1qQR1PBEAjAEG2yQBqIwBB7sgAakGHAiMAQaXJAGoQAAsjAEGgzQBqIABBAnRqIgIoAgAgA0EIaiIARgRAIAIgAygCDDYCAAsgACgCACICBEAgAiADKAIMNgIECyADKAIMIgIEQCACIAAoAgA2AgAjAEGkzsACaigCACEFCyABIAEoAgAgAygCAEF+cWo2AgAgAyAFRgRAIwBBpM7AAmohAAUgBiADKAIAQQF2akEEaiEACwwCCwUgBwRAIwBBpM7AAmohAAwCBSMAQe3MAGojAEHuyABqQdwCIwBB0cwAahAACwsMAQsgACABNgIACyABEDUPCwsgAwRAIAMoAgAiAUEBcUUEQCABQQF2QXhqIgFFBEAjAEHlyABqIwBB7sgAakGCAiMAQaXJAGoQAAtBHyABQQggAUEISxsiAWdrQQEgARsiAUF9akEdTwRAIwBBtskAaiMAQe7IAGpBhwIjAEGlyQBqEAALIwBBoM0AaiABQQJ0aiICKAIAIANBCGoiAUYEQCACIAMoAgw2AgALIAEoAgAiAgRAIAIgAygCDDYCBAsgAygCDCICBEAgAiABKAIANgIAIwBBpM7AAmooAgAhBQsgACAAKAIAIAMoAgBBfnFqNgIAIAMgBUYEfyMAQaTOwAJqBSAGIAMoAgBBAXZqQQRqCyAANgIAIAAQNQ8LCyAAEDULEAAgAEUEQA8LIABBeGoQNwvlCQEFfyABRSECAkACQCAARQRAIAINASABEDIiAEUEQAJAAkAjAEGkzsACaigCACIARQ0AIAAoAgAiAkEBcQ0AIAAgAkEBcjYCACACQQF2QXhqIgJFBEAjAEHlyABqIwBB7sgAakGCAiMAQaXJAGoQAAtBHyACQQggAkEISxsiAmdrQQEgAhsiAkF9akEdTwRAIwBBtskAaiMAQe7IAGpBhwIjAEGlyQBqEAALIwBBoM0AaiACQQJ0aiIEKAIAIABBCGoiAkYEQCAEIAAoAgw2AgALIAIoAgAiBARAIAQgACgCDDYCBAsgACgCDCIABEAgACACKAIANgIACyABEDNFIwBBpM7AAmooAgAhAARAIAAgACgCAEF+cTYCAAwFCwwBCyABEDQhAAsgAEUNAgsgACgCAEEBdiAAakEAEAFLBEAjAEHwyQBqIwBB7sgAakG3BiMAQYzKAGoQAAsgACgCAEEBcUUEQCMAQZzKAGojAEHuyABqQc4BIwBBrsoAahAACyAAQQhqDwsgAEF4aiEEIAIEQCAEEDcMAQsgBCgCACICQQFxRQRAIwBBnMoAaiMAQe7IAGpB0AYjAEGCzQBqEAALIAJBAXYiA0F4aiABTw0BIAMgBGohAyAEIwBBpM7AAmooAgAiBUcEQCADKAIAIgZBAXFFBEAgBkEBdkF4aiICRQRAIwBB5cgAaiMAQe7IAGpBggIjAEGlyQBqEAALQR8gAkEIIAJBCEsbIgJna0EBIAIbIgJBfWpBHU8EQCMAQbbJAGojAEHuyABqQYcCIwBBpckAahAACyMAQaDNAGogAkECdGoiBigCACADQQhqIgJGBEAgBiADKAIMNgIACyACKAIAIgYEQCAGIAMoAgw2AgQLIAMoAgwiBgRAIAYgAigCADYCAAsgBCAEKAIAIAMoAgBBfnFqIgI2AgAgAyAFRgRAIwBBpM7AAmogBDYCAAUgAyADKAIAQQF2aiAENgIECwsLIAJBAXZBeGogAU8NASABEDIiAkEARyEDIANBAXMjAEGkzsACaigCACAERnEEQCABEDMEQCAADwsLIANFBEACQAJAIwBBpM7AAmooAgAiAkUNACACKAIAIgNBAXENACACIANBAXI2AgAgA0EBdkF4aiIDRQRAIwBB5cgAaiMAQe7IAGpBggIjAEGlyQBqEAALQR8gA0EIIANBCEsbIgNna0EBIAMbIgNBfWpBHU8EQCMAQbbJAGojAEHuyABqQYcCIwBBpckAahAACyMAQaDNAGogA0ECdGoiBSgCACACQQhqIgNGBEAgBSACKAIMNgIACyADKAIAIgUEQCAFIAIoAgw2AgQLIAIoAgwiAgRAIAIgAygCADYCAAsgARAzRSMAQaTOwAJqKAIAIQIEQCACIAIoAgBBfnE2AgAMBAsMAQsgARA0IQILIAJFDQELIAIoAgBBAXFFBEAjAEGcygBqIwBB7sgAakHOASMAQa7KAGoQAAsgBCgCACIDQQFxRQRAIwBBnMoAaiMAQe7IAGpBzgEjAEGuygBqEAALIAJBCGoiBSAAIAEgA0EBdkF4aiIAIAAgAUsbEDoaIAQQNyACKAIAQQFxBEAgBQ8FIwBBnMoAaiMAQe7IAGpBzgEjAEGuygBqEAALQQAPC0EADwsgBCACQQFyNgIAIAQgARA2IAAL+woBCH8gAkEARyABQQNxQQBHcQR/IAAhAwN/IANBAWohBCADIAEsAAA6AAAgAUEBaiIBQQNxQQBHIAJBf2oiAkEAR3EEfyAEIQMMAQUgBAsLBSAACyIDQQNxRQRAIAJBD0sEfyACQXBqIgVBcHEiB0EQaiIIIANqIAIhBCABIQIDQCADIAIoAgA2AgAgAyACKAIENgIEIAMgAigCCDYCCCADIAIoAgw2AgwgAkEQaiECIANBEGohAyAEQXBqIgRBD0sNAAshAyABIAhqIQEgBSAHawUgAgsiBEEIcQR/IAMgASgCADYCACADIAEoAgQ2AgQgA0EIaiEDIAFBCGoFIAELIQIgBEEEcQR/IAMgAigCADYCACACQQRqIQIgA0EEagUgAwshASAEQQJxBEAgASACLAAAOgAAIAEgAiwAAToAASABQQJqIQEgAkECaiECCyAEQQFxRQRAIAAPCyABIAIsAAA6AAAgAA8LIAJBH0sEQAJAAkACQAJAIANBA3FBAWsOAwABAgMLIAMgASgCACIFOgAAIAMgASwAAToAASADIAEsAAI6AAIgAkFsakFwcSIIQRNqIgkgAWogAkFtaiADQQNqIQQgAkF9aiEGIAFBA2ohAiAFIQEDQCAEIAIoAgEiBUEIdCABQRh2cjYCACAEIAIoAgUiAUEIdCAFQRh2cjYCBCAEIAIoAgkiBUEIdCABQRh2cjYCCCAEIAIoAg0iAUEIdCAFQRh2cjYCDCACQRBqIQIgBEEQaiEEIAZBcGoiBkEQSw0ACyADIAlqIQMgCGshAiEBDAILIAMgASgCACIFOgAAIAMgASwAAToAASACQWxqQXBxIghBEmoiCSABaiACQW5qIANBAmohBCACQX5qIQYgAUECaiECIAUhAQNAIAQgAigCAiIFQRB0IAFBEHZyNgIAIAQgAigCBiIBQRB0IAVBEHZyNgIEIAQgAigCCiIFQRB0IAFBEHZyNgIIIAQgAigCDiIBQRB0IAVBEHZyNgIMIAJBEGohAiAEQRBqIQQgBkFwaiIGQRFLDQALIAMgCWohAyAIayECIQEMAQsgAyABKAIAIgU6AAAgAkFsakFwcSIIQRFqIgkgAWogAkFvaiADQQFqIQQgAkF/aiEGIAFBAWohAiAFIQEDQCAEIAIoAgMiBUEYdCABQQh2cjYCACAEIAIoAgciAUEYdCAFQQh2cjYCBCAEIAIoAgsiBUEYdCABQQh2cjYCCCAEIAIoAg8iAUEYdCAFQQh2cjYCDCACQRBqIQIgBEEQaiEEIAZBcGoiBkESSw0ACyADIAlqIQMgCGshAiEBCwsgAkEQcQRAIAMgASwAADoAACADIAEsAAE6AAEgAyABLAACOgACIAMgASwAAzoAAyADIAEsAAQ6AAQgAyABLAAFOgAFIAMgASwABjoABiADIAEsAAc6AAcgAyABLAAIOgAIIAMgASwACToACSADIAEsAAo6AAogAyABLAALOgALIAMgASwADDoADCADIAEsAA06AA0gAyABLAAOOgAOIAMgASwADzoADyADQRBqIQMgAUEQaiEBCyACQQhxBEAgAyABLAAAOgAAIAMgASwAAToAASADIAEsAAI6AAIgAyABLAADOgADIAMgASwABDoABCADIAEsAAU6AAUgAyABLAAGOgAGIAMgASwABzoAByADQQhqIQMgAUEIaiEBCyACQQRxBEAgAyABLAAAOgAAIAMgASwAAToAASADIAEsAAI6AAIgAyABLAADOgADIANBBGohAyABQQRqIQELIAJBAnEEQCADIAEsAAA6AAAgAyABLAABOgABIANBAmohAyABQQJqIQELIAJBAXFFBEAgAA8LIAMgASwAADoAACAAC8ADAQZ/IAAgAUYEQCAADwsgASACaiAASyAAIAJqIgUgAUtxRQRAIAAgASACEDoaIAAPCyABIAAiA3NBA3FFIQQgAyABSQR/IAQEQCADQQNxBEAC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JCQkJCQkAAAAAQIRAAAAAAAAAAAAAAAAAAECAwQFBhEAAAAAAAAAAAABAgMEBQYHCAkKCwwNDhEAAQMFBgcICQoLDA0ODxARAAECBAUGBwgJCgsMDQ4PEQABAgMEBQYHCAkKCwwNDg8DAAEFBQABBwcAAAMJAAEKDwAABB8AAAU/AAAGfwAAB/8AAAj/AQAJ/wMACv8HAAv/DwAM/x8ADf8/AA7/fwAP//8AEAAAAAAAAAAAAAAAAAAAAALqX5YBMIpCAQgIDFtbW15bXnNpemUgPiAwAEQ6L3Nydi9lbXNkay9lbXNjcmlwdGVuLzEuMzguNS9zeXN0ZW0vbGliL2VtbWFsbG9jLmNwcABnZXRGcmVlTGlzdEluZGV4AE1JTl9GUkVFTElTVF9JTkRFWCA8PSBpbmRleCAmJiBpbmRleCA8IE1BWF9GUkVFTElTVF9JTkRFWABnZXRBZnRlcihyZWdpb24pIDw9IHNicmsoMCkAZW1tYWxsb2NfbWFsbG9jAHJlZ2lvbi0+Z2V0VXNlZCgpAGdldFBheWxvYWQAKGNoYXIqKWV4dHJhUHRyID09IChjaGFyKilwdHIgKyBzYnJrU2l6ZQBhbGxvY2F0ZVJlZ2lvbgAhbGFzdFJlZ2lvbgAhZmlyc3RSZWdpb24AZmlyc3RSZWdpb24AcHRyID09IGdldEFmdGVyKGxhc3RSZWdpb24pAGV4dGVuZExhc3RSZWdpb24AYWRkVG9GcmVlTGlzdABnZXRCaWdFbm91Z2hGcmVlTGlzdEluZGV4AHBheWxvYWRTaXplID49IHNpemUAcG9zc2libHlTcGxpdFJlbWFpbmRlcgBleHRyYSA+PSBNSU5fUkVHSU9OX1NJWkUAdG90YWxTcGxpdFNpemUgPj0gTUlOX1JFR0lPTl9TSVpFAG1lcmdlSW50b0V4aXN0aW5nRnJlZVJlZ2lvbgByZWdpb24gPT0gbGFzdFJlZ2lvbgBlbW1hbGxvY19yZWFsbG9j";