@lynx-js/react 0.109.2 → 0.110.1

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 (202) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/components/lib/Page.js.map +1 -1
  3. package/components/src/Page.ts +1 -1
  4. package/package.json +1 -1
  5. package/refresh/.turbo/turbo-build.log +1 -1
  6. package/runtime/lib/backgroundSnapshot.d.ts +2 -1
  7. package/runtime/lib/backgroundSnapshot.js +66 -42
  8. package/runtime/lib/backgroundSnapshot.js.map +1 -1
  9. package/runtime/lib/compat/initData.d.ts +7 -5
  10. package/runtime/lib/compat/initData.js +1 -2
  11. package/runtime/lib/compat/initData.js.map +1 -1
  12. package/runtime/lib/compat/lynxComponent.js +10 -12
  13. package/runtime/lib/compat/lynxComponent.js.map +1 -1
  14. package/runtime/lib/debug/profile.js +1 -0
  15. package/runtime/lib/debug/profile.js.map +1 -1
  16. package/runtime/lib/gesture/processGestureBagkround.d.ts +1 -1
  17. package/runtime/lib/gesture/processGestureBagkround.js +4 -1
  18. package/runtime/lib/gesture/processGestureBagkround.js.map +1 -1
  19. package/runtime/lib/gesture/types.js.map +1 -1
  20. package/runtime/lib/hooks/react.js +3 -3
  21. package/runtime/lib/hooks/react.js.map +1 -1
  22. package/runtime/lib/hooks/useLynxGlobalEventListener.d.ts +1 -1
  23. package/runtime/lib/hydrate.d.ts +1 -1
  24. package/runtime/lib/hydrate.js +5 -4
  25. package/runtime/lib/hydrate.js.map +1 -1
  26. package/runtime/lib/internal.d.ts +3 -2
  27. package/runtime/lib/internal.js +3 -2
  28. package/runtime/lib/internal.js.map +1 -1
  29. package/runtime/lib/legacy-react-runtime/index.js +1 -1
  30. package/runtime/lib/legacy-react-runtime/index.js.map +1 -1
  31. package/runtime/lib/lifecycle/destroy.js +1 -0
  32. package/runtime/lib/lifecycle/destroy.js.map +1 -1
  33. package/runtime/lib/lifecycle/event/delayEvents.js +3 -0
  34. package/runtime/lib/lifecycle/event/delayEvents.js.map +1 -1
  35. package/runtime/lib/lifecycle/event/delayLifecycleEvents.d.ts +3 -2
  36. package/runtime/lib/lifecycle/event/delayLifecycleEvents.js +1 -12
  37. package/runtime/lib/lifecycle/event/delayLifecycleEvents.js.map +1 -1
  38. package/runtime/lib/lifecycle/event/jsReady.d.ts +1 -1
  39. package/runtime/lib/lifecycle/event/jsReady.js +3 -2
  40. package/runtime/lib/lifecycle/event/jsReady.js.map +1 -1
  41. package/runtime/lib/lifecycle/patch/commit.d.ts +0 -2
  42. package/runtime/lib/lifecycle/patch/commit.js +8 -36
  43. package/runtime/lib/lifecycle/patch/commit.js.map +1 -1
  44. package/runtime/lib/lifecycle/patch/error.d.ts +8 -0
  45. package/runtime/lib/lifecycle/patch/error.js +47 -0
  46. package/runtime/lib/lifecycle/patch/error.js.map +1 -0
  47. package/runtime/lib/lifecycle/patch/isMainThreadHydrationFinished.js +3 -0
  48. package/runtime/lib/lifecycle/patch/isMainThreadHydrationFinished.js.map +1 -1
  49. package/runtime/lib/lifecycle/patch/snapshotPatch.d.ts +2 -2
  50. package/runtime/lib/lifecycle/patch/snapshotPatch.js.map +1 -1
  51. package/runtime/lib/lifecycle/patch/snapshotPatchApply.js +10 -10
  52. package/runtime/lib/lifecycle/patch/snapshotPatchApply.js.map +1 -1
  53. package/runtime/lib/lifecycle/patch/updateMainThread.d.ts +0 -1
  54. package/runtime/lib/lifecycle/patch/updateMainThread.js +7 -14
  55. package/runtime/lib/lifecycle/patch/updateMainThread.js.map +1 -1
  56. package/runtime/lib/lifecycle/ref/delay.d.ts +31 -0
  57. package/runtime/lib/lifecycle/ref/delay.js +80 -0
  58. package/runtime/lib/lifecycle/ref/delay.js.map +1 -0
  59. package/runtime/lib/lifecycle/reload.d.ts +1 -1
  60. package/runtime/lib/lifecycle/reload.js +8 -5
  61. package/runtime/lib/lifecycle/reload.js.map +1 -1
  62. package/runtime/lib/lifecycle/render.js +3 -2
  63. package/runtime/lib/lifecycle/render.js.map +1 -1
  64. package/runtime/lib/lifecycleConstant.d.ts +10 -7
  65. package/runtime/lib/lifecycleConstant.js +8 -8
  66. package/runtime/lib/lifecycleConstant.js.map +1 -1
  67. package/runtime/lib/list.d.ts +1 -45
  68. package/runtime/lib/list.js +31 -206
  69. package/runtime/lib/list.js.map +1 -1
  70. package/runtime/lib/listUpdateInfo.d.ts +38 -0
  71. package/runtime/lib/listUpdateInfo.js +152 -0
  72. package/runtime/lib/listUpdateInfo.js.map +1 -0
  73. package/runtime/lib/lynx/calledByNative.js +9 -6
  74. package/runtime/lib/lynx/calledByNative.js.map +1 -1
  75. package/runtime/lib/lynx/component.js +7 -0
  76. package/runtime/lib/lynx/component.js.map +1 -1
  77. package/runtime/lib/lynx/dynamic-js.d.ts +5 -1
  78. package/runtime/lib/lynx/dynamic-js.js +1 -0
  79. package/runtime/lib/lynx/dynamic-js.js.map +1 -1
  80. package/runtime/lib/lynx/env.d.ts +1 -1
  81. package/runtime/lib/lynx/env.js +13 -13
  82. package/runtime/lib/lynx/env.js.map +1 -1
  83. package/runtime/lib/lynx/lazy-bundle.js +7 -5
  84. package/runtime/lib/lynx/lazy-bundle.js.map +1 -1
  85. package/runtime/lib/lynx/performance.js +1 -1
  86. package/runtime/lib/lynx/performance.js.map +1 -1
  87. package/runtime/lib/lynx/runWithForce.js +3 -0
  88. package/runtime/lib/lynx/runWithForce.js.map +1 -1
  89. package/runtime/lib/lynx/tt.js +12 -33
  90. package/runtime/lib/lynx/tt.js.map +1 -1
  91. package/runtime/lib/lynx-api.d.ts +1 -1
  92. package/runtime/lib/lynx-api.js +3 -0
  93. package/runtime/lib/lynx-api.js.map +1 -1
  94. package/runtime/lib/lynx.js +6 -6
  95. package/runtime/lib/lynx.js.map +1 -1
  96. package/runtime/lib/opcodes.js +2 -1
  97. package/runtime/lib/opcodes.js.map +1 -1
  98. package/runtime/lib/pendingListUpdates.d.ts +6 -0
  99. package/runtime/lib/pendingListUpdates.js +16 -0
  100. package/runtime/lib/pendingListUpdates.js.map +1 -0
  101. package/runtime/lib/renderToOpcodes/index.js +7 -7
  102. package/runtime/lib/renderToOpcodes/index.js.map +1 -1
  103. package/runtime/lib/snapshot/dynamicPartType.d.ts +12 -0
  104. package/runtime/lib/snapshot/dynamicPartType.js +17 -0
  105. package/runtime/lib/snapshot/dynamicPartType.js.map +1 -0
  106. package/runtime/lib/snapshot/gesture.js +3 -0
  107. package/runtime/lib/snapshot/gesture.js.map +1 -1
  108. package/runtime/lib/snapshot/list.d.ts +3 -0
  109. package/runtime/lib/snapshot/list.js +23 -0
  110. package/runtime/lib/snapshot/list.js.map +1 -0
  111. package/runtime/lib/snapshot/platformInfo.d.ts +10 -0
  112. package/runtime/lib/snapshot/platformInfo.js +6 -3
  113. package/runtime/lib/snapshot/platformInfo.js.map +1 -1
  114. package/runtime/lib/snapshot/ref.d.ts +17 -9
  115. package/runtime/lib/snapshot/ref.js +64 -73
  116. package/runtime/lib/snapshot/ref.js.map +1 -1
  117. package/runtime/lib/snapshot/spread.d.ts +2 -2
  118. package/runtime/lib/snapshot/spread.js +12 -12
  119. package/runtime/lib/snapshot/spread.js.map +1 -1
  120. package/runtime/lib/snapshot/workletEvent.js +1 -1
  121. package/runtime/lib/snapshot/workletEvent.js.map +1 -1
  122. package/runtime/lib/snapshot/workletRef.d.ts +3 -3
  123. package/runtime/lib/snapshot/workletRef.js +27 -8
  124. package/runtime/lib/snapshot/workletRef.js.map +1 -1
  125. package/runtime/lib/snapshot.d.ts +9 -18
  126. package/runtime/lib/snapshot.js +46 -40
  127. package/runtime/lib/snapshot.js.map +1 -1
  128. package/runtime/lib/snapshotInstanceHydrationMap.d.ts +9 -0
  129. package/runtime/lib/snapshotInstanceHydrationMap.js +16 -0
  130. package/runtime/lib/snapshotInstanceHydrationMap.js.map +1 -0
  131. package/runtime/lib/utils.js +1 -1
  132. package/runtime/lib/utils.js.map +1 -1
  133. package/runtime/lib/worklet/workletRef.js +1 -2
  134. package/runtime/lib/worklet/workletRef.js.map +1 -1
  135. package/runtime/src/backgroundSnapshot.ts +75 -52
  136. package/runtime/src/compat/initData.ts +10 -9
  137. package/runtime/src/compat/lynxComponent.ts +12 -13
  138. package/runtime/src/debug/profile.ts +1 -0
  139. package/runtime/src/gesture/processGestureBagkround.ts +5 -1
  140. package/runtime/src/gesture/types.ts +3 -0
  141. package/runtime/src/hooks/react.ts +3 -3
  142. package/runtime/src/hooks/useLynxGlobalEventListener.ts +1 -1
  143. package/runtime/src/hydrate.ts +6 -4
  144. package/runtime/src/internal.ts +3 -2
  145. package/runtime/src/legacy-react-runtime/index.ts +1 -1
  146. package/runtime/src/lifecycle/destroy.ts +1 -0
  147. package/runtime/src/lifecycle/event/delayEvents.ts +3 -0
  148. package/runtime/src/lifecycle/event/delayLifecycleEvents.ts +7 -13
  149. package/runtime/src/lifecycle/event/jsReady.ts +4 -3
  150. package/runtime/src/lifecycle/patch/commit.ts +10 -41
  151. package/runtime/src/lifecycle/patch/error.ts +61 -0
  152. package/runtime/src/lifecycle/patch/isMainThreadHydrationFinished.ts +3 -0
  153. package/runtime/src/lifecycle/patch/snapshotPatch.ts +2 -2
  154. package/runtime/src/lifecycle/patch/snapshotPatchApply.ts +28 -28
  155. package/runtime/src/lifecycle/patch/updateMainThread.ts +7 -16
  156. package/runtime/src/lifecycle/ref/delay.ts +99 -0
  157. package/runtime/src/lifecycle/reload.ts +10 -7
  158. package/runtime/src/lifecycle/render.ts +3 -2
  159. package/runtime/src/lifecycleConstant.ts +11 -7
  160. package/runtime/src/list.ts +33 -269
  161. package/runtime/src/listUpdateInfo.ts +221 -0
  162. package/runtime/src/lynx/calledByNative.ts +15 -10
  163. package/runtime/src/lynx/component.ts +9 -0
  164. package/runtime/src/lynx/dynamic-js.ts +5 -1
  165. package/runtime/src/lynx/env.ts +17 -17
  166. package/runtime/src/lynx/lazy-bundle.ts +22 -14
  167. package/runtime/src/lynx/performance.ts +1 -1
  168. package/runtime/src/lynx/runWithForce.ts +9 -5
  169. package/runtime/src/lynx/tt.ts +19 -37
  170. package/runtime/src/lynx-api.ts +5 -2
  171. package/runtime/src/lynx.ts +7 -6
  172. package/runtime/src/opcodes.ts +2 -1
  173. package/runtime/src/pendingListUpdates.ts +18 -0
  174. package/runtime/src/renderToOpcodes/index.ts +7 -7
  175. package/runtime/src/snapshot/dynamicPartType.ts +16 -0
  176. package/runtime/src/snapshot/gesture.ts +3 -0
  177. package/runtime/src/snapshot/list.ts +36 -0
  178. package/runtime/src/snapshot/platformInfo.ts +19 -5
  179. package/runtime/src/snapshot/ref.ts +78 -87
  180. package/runtime/src/snapshot/spread.ts +47 -22
  181. package/runtime/src/snapshot/workletEvent.ts +1 -1
  182. package/runtime/src/snapshot/workletRef.ts +36 -10
  183. package/runtime/src/snapshot.ts +62 -51
  184. package/runtime/src/snapshotInstanceHydrationMap.ts +17 -0
  185. package/runtime/src/utils.ts +3 -3
  186. package/runtime/src/worklet/workletRef.ts +1 -2
  187. package/testing-library/dist/env/vitest.js +8 -6
  188. package/testing-library/dist/pure.js +4 -3
  189. package/testing-library/dist/vitest.config.js +7 -7
  190. package/transform/cjs/main.cjs +4 -0
  191. package/transform/dist/wasm.cjs +1 -1
  192. package/worklet-runtime/dist/dev.js +1 -4
  193. package/worklet-runtime/dist/main.js +0 -3
  194. package/worklet-runtime/lib/bindings/observers.d.ts +14 -1
  195. package/worklet-runtime/lib/bindings/observers.js +7 -7
  196. package/worklet-runtime/lib/bindings/observers.js.map +1 -1
  197. package/worklet-runtime/lib/hydrate.js +0 -5
  198. package/worklet-runtime/lib/hydrate.js.map +1 -1
  199. package/runtime/lib/lifecycle/delayUnmount.d.ts +0 -8
  200. package/runtime/lib/lifecycle/delayUnmount.js +0 -65
  201. package/runtime/lib/lifecycle/delayUnmount.js.map +0 -1
  202. package/runtime/src/lifecycle/delayUnmount.ts +0 -77
@@ -334,9 +334,6 @@
334
334
  return;
335
335
  }
336
336
  const ref = lynxWorkletImpl._refImpl._workletRefMap[refId];
337
- if (ref.current instanceof Element) {
338
- return;
339
- }
340
337
  ref.current = value.current;
341
338
  }
342
339
  function hydrateDelayRunOnBackgroundTasks(fnObjs, firstScreenFnObjs, execId) {
@@ -518,4 +515,4 @@
518
515
  initEventListeners();
519
516
  }
520
517
  })();
521
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2FwaS9lbGVtZW50LnRzIiwgIi4uL3NyYy9hcGkvbGVwdXNRdWVyeVNlbGVjdG9yLnRzIiwgIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwgIi4uL3NyYy9hcGkvbHlueEFwaS50cyIsICIuLi9zcmMvdXRpbHMvcHJvZmlsZS50cyIsICIuLi9zcmMvd29ya2xldFJlZi50cyIsICIuLi9zcmMvbGlzdGVuZXJzLnRzIiwgIi4uL3NyYy9kZWxheVJ1bk9uQmFja2dyb3VuZC50cyIsICIuLi9zcmMvZGVsYXlXb3JrbGV0RXZlbnQudHMiLCAiLi4vc3JjL2h5ZHJhdGUudHMiLCAiLi4vc3JjL2pzRnVuY3Rpb25MaWZlY3ljbGUudHMiLCAiLi4vc3JjL3dvcmtsZXRSdW50aW1lLnRzIiwgIi4uL3NyYy9pbmRleC50cyJdLAogICJzb3VyY2VSb290IjogIi9ob21lL3J1bm5lci93b3JrL2x5bngtc3RhY2svbHlueC1zdGFjay9wYWNrYWdlcy9yZWFjdC93b3JrbGV0LXJ1bnRpbWUvc3JjIiwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5leHBvcnQgY2xhc3MgRWxlbWVudCB7XG4gIHByaXZhdGUgc3RhdGljIHdpbGxGbHVzaCA9IGZhbHNlO1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Igc2V0IGluIGNvbnN0cnVjdG9yXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudDogRWxlbWVudE5vZGU7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudE5vZGUpIHtcbiAgICAvLyBJbiBMeW54IHZlcnNpb25zIHByaW9yIHRvIGFuZCBpbmNsdWRpbmcgMi4xNSxcbiAgICAvLyBhIGNyYXNoIG9jY3VycyB3aGVuIHByaW50aW5nIG9yIHRyYW5zZmVycmluZyByZWZDb3VudGVkIGFjcm9zcyB0aHJlYWRzLlxuICAgIC8vIEJ5cGFzcyB0aGlzIHByb2JsZW0gYnkgaGlkaW5nIHRoZSBlbGVtZW50IG9iamVjdC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2VsZW1lbnQnLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIF9fU2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgbmFtZSwgdmFsdWUpO1xuICAgIHRoaXMuZmx1c2hFbGVtZW50VHJlZSgpO1xuICB9XG5cbiAgcHVibGljIHNldFN0eWxlUHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgX19BZGRJbmxpbmVTdHlsZSh0aGlzLmVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmZsdXNoRWxlbWVudFRyZWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdHlsZVByb3BlcnRpZXMoc3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3R5bGVzKSB7XG4gICAgICBfX0FkZElubGluZVN0eWxlKHRoaXMuZWxlbWVudCwga2V5LCBzdHlsZXNba2V5XSEpO1xuICAgIH1cbiAgICB0aGlzLmZsdXNoRWxlbWVudFRyZWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIF9fR2V0QXR0cmlidXRlQnlOYW1lKHRoaXMuZWxlbWVudCwgYXR0cmlidXRlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXR0cmlidXRlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBfX0dldEF0dHJpYnV0ZU5hbWVzKHRoaXMuZWxlbWVudCk7XG4gIH1cblxuICBwdWJsaWMgcXVlcnlTZWxlY3RvcihzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHJlZiA9IF9fUXVlcnlTZWxlY3Rvcih0aGlzLmVsZW1lbnQsIHNlbGVjdG9yLCB7fSk7XG4gICAgcmV0dXJuIHJlZiA/IG5ldyBFbGVtZW50KHJlZikgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3I6IHN0cmluZyk6IEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIF9fUXVlcnlTZWxlY3RvckFsbCh0aGlzLmVsZW1lbnQsIHNlbGVjdG9yLCB7fSkubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEVsZW1lbnQoZWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaW52b2tlKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9fSW52b2tlVUlNZXRob2QoXG4gICAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGFyYW1zID8/IHt9LFxuICAgICAgICAocmVzOiB7IGNvZGU6IG51bWJlcjsgZGF0YTogdW5rbm93biB9KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5jb2RlID09PSAwKSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlcy5kYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVUkgbWV0aG9kIGludm9rZTogJyArIEpTT04uc3RyaW5naWZ5KHJlcykpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdGhpcy5mbHVzaEVsZW1lbnRUcmVlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZsdXNoRWxlbWVudFRyZWUoKSB7XG4gICAgaWYgKEVsZW1lbnQud2lsbEZsdXNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEVsZW1lbnQud2lsbEZsdXNoID0gdHJ1ZTtcbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgRWxlbWVudC53aWxsRmx1c2ggPSBmYWxzZTtcbiAgICAgIF9fRmx1c2hFbGVtZW50VHJlZSgpO1xuICAgIH0pO1xuICB9XG59XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICcuL2VsZW1lbnQuanMnO1xuXG5jbGFzcyBQYWdlRWxlbWVudCB7XG4gIHByaXZhdGUgc3RhdGljIHBhZ2VFbGVtZW50OiBFbGVtZW50Tm9kZSB8IHVuZGVmaW5lZDtcblxuICBzdGF0aWMgZ2V0KCkge1xuICAgIFBhZ2VFbGVtZW50LnBhZ2VFbGVtZW50ID8/PSBfX0dldFBhZ2VFbGVtZW50KCk7XG4gICAgcmV0dXJuIFBhZ2VFbGVtZW50LnBhZ2VFbGVtZW50O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yKGNzc1NlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IGVsZW1lbnQgPSBfX1F1ZXJ5U2VsZWN0b3IoUGFnZUVsZW1lbnQuZ2V0KCksIGNzc1NlbGVjdG9yLCB7fSk7XG4gIHJldHVybiBlbGVtZW50ID8gbmV3IEVsZW1lbnQoZWxlbWVudCkgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbChjc3NTZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudFtdIHtcbiAgcmV0dXJuIF9fUXVlcnlTZWxlY3RvckFsbChQYWdlRWxlbWVudC5nZXQoKSwgY3NzU2VsZWN0b3IsIHt9KS5tYXAoXG4gICAgKGVsZW1lbnQpID0+IHtcbiAgICAgIHJldHVybiBuZXcgRWxlbWVudChlbGVtZW50KTtcbiAgICB9LFxuICApO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5leHBvcnQgZnVuY3Rpb24gaXNTZGtWZXJzaW9uR3QobWFqb3I6IG51bWJlciwgbWlub3I6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBseW54U2RrVmVyc2lvbjogc3RyaW5nID0gU3lzdGVtSW5mby5seW54U2RrVmVyc2lvbiA/PyAnMS4wJztcbiAgY29uc3QgdmVyc2lvbiA9IGx5bnhTZGtWZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiAoXG4gICAgTnVtYmVyKHZlcnNpb25bMF0pID4gbWFqb3JcbiAgICB8fCAoTnVtYmVyKHZlcnNpb25bMF0pID09IG1ham9yICYmIE51bWJlcih2ZXJzaW9uWzFdKSA+IG1pbm9yKVxuICApO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBxdWVyeVNlbGVjdG9yLCBxdWVyeVNlbGVjdG9yQWxsIH0gZnJvbSAnLi9sZXB1c1F1ZXJ5U2VsZWN0b3IuanMnO1xuaW1wb3J0IHsgaXNTZGtWZXJzaW9uR3QgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcblxuZnVuY3Rpb24gaW5pdEFwaUVudigpOiB2b2lkIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGx5bngucXVlcnlTZWxlY3RvciA9IHF1ZXJ5U2VsZWN0b3I7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBseW54LnF1ZXJ5U2VsZWN0b3JBbGwgPSBxdWVyeVNlbGVjdG9yQWxsO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGVcbiAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0ID0gbHlueC5zZXRUaW1lb3V0IGFzIChjYjogKCkgPT4gdm9pZCwgdGltZW91dDogbnVtYmVyKSA9PiBudW1iZXI7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBnbG9iYWxUaGlzLnNldEludGVydmFsID0gbHlueC5zZXRJbnRlcnZhbCBhcyAoY2I6ICgpID0+IHZvaWQsIHRpbWVvdXQ6IG51bWJlcikgPT4gbnVtYmVyO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGVcbiAgZ2xvYmFsVGhpcy5jbGVhclRpbWVvdXQgPSBseW54LmNsZWFyVGltZW91dCBhcyAodGltZW91dDogbnVtYmVyKSA9PiB2b2lkO1xuICAvLyBJbiBseW54IDIuMTQgYGNsZWFySW50ZXJ2YWxgIGlzIG1pc3Rha2VubHkgc3BlbGxlZCBhcyBgY2xlYXJUaW1lSW50ZXJ2YWxgLiBUaGlzIGlzIGZpeGVkIGluIGx5bnggMi4xNS5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGdsb2JhbFRoaXMuY2xlYXJJbnRlcnZhbCA9IChseW54LmNsZWFySW50ZXJ2YWwgPz8gbHlueC5jbGVhclRpbWVJbnRlcnZhbCkgYXMgKHRpbWVvdXQ6IG51bWJlcikgPT4gdm9pZDtcblxuICB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gICAgY29uc3QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gbHlueC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgYXMgKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiBudW1iZXI7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gICAgbHlueC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBnbG9iYWxUaGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IChcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB2b2lkLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFpc1Nka1ZlcnNpb25HdCgyLCAxNSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUgaW4gbWFpbiB0aHJlYWQgc2NyaXB0IHJlcXVpcmVzIEx5bnggc2RrIHZlcnNpb24gMi4xNicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGdsb2JhbFRoaXMuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBseW54LmNhbmNlbEFuaW1hdGlvbkZyYW1lIGFzIChyZXF1ZXN0SWQ6IG51bWJlcikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHsgaW5pdEFwaUVudiB9O1xuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5leHBvcnQgZnVuY3Rpb24gcHJvZmlsZTxSZXQsIEZuIGV4dGVuZHMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUmV0PihcbiAgc2xpY2VOYW1lOiBzdHJpbmcsXG4gIGY6IEZuLFxuKTogUmV0IHtcbiAgLyogdjggaWdub3JlIG5leHQgOSAqL1xuICAvLyBUT0RPOiBjaGFuZ2UgaXQgdG8gX19QUk9GSUxFX19cbiAgaWYgKF9fREVWX18pIHtcbiAgICBjb25zb2xlLnByb2ZpbGUoc2xpY2VOYW1lKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGYoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc29sZS5wcm9maWxlRW5kKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmKCk7XG4gIH1cbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJy4vYXBpL2VsZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrbGV0UmVmLCBXb3JrbGV0UmVmSWQsIFdvcmtsZXRSZWZJbXBsIH0gZnJvbSAnLi9iaW5kaW5ncy90eXBlcy5qcyc7XG5pbXBvcnQgeyBwcm9maWxlIH0gZnJvbSAnLi91dGlscy9wcm9maWxlLmpzJztcblxuaW50ZXJmYWNlIFJlZkltcGwge1xuICBfd29ya2xldFJlZk1hcDogUmVjb3JkPFdvcmtsZXRSZWZJZCwgV29ya2xldFJlZjx1bmtub3duPj47XG4gIF9maXJzdFNjcmVlbldvcmtsZXRSZWZNYXA6IFJlY29yZDxXb3JrbGV0UmVmSWQsIFdvcmtsZXRSZWY8dW5rbm93bj4+O1xuICB1cGRhdGVXb3JrbGV0UmVmKFxuICAgIHJlZkltcGw6IFdvcmtsZXRSZWZJbXBsPEVsZW1lbnQgfCBudWxsPixcbiAgICBlbGVtZW50OiBFbGVtZW50Tm9kZSB8IG51bGwsXG4gICk6IHZvaWQ7XG4gIHVwZGF0ZVdvcmtsZXRSZWZJbml0VmFsdWVDaGFuZ2VzKHBhdGNoOiBbbnVtYmVyLCB1bmtub3duXVtdKTogdm9pZDtcbiAgY2xlYXJGaXJzdFNjcmVlbldvcmtsZXRSZWZNYXAoKTogdm9pZDtcbn1cblxubGV0IGltcGw6IFJlZkltcGwgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGluaXRXb3JrbGV0UmVmKCk6IFJlZkltcGwge1xuICByZXR1cm4gKGltcGwgPSB7XG4gICAgX3dvcmtsZXRSZWZNYXA6IHt9LFxuICAgIC8qKlxuICAgICAqIE1hcCBvZiB3b3JrbGV0IHJlZnMgdGhhdCBhcmUgY3JlYXRlZCBkdXJpbmcgZmlyc3Qgc2NyZWVuIHJlbmRlcmluZy5cbiAgICAgKiBUaGVzZSByZWZzIGFyZSBjcmVhdGVkIHdpdGggbmVnYXRpdmUgSURzIGFuZCBuZWVkIHRvIGJlIGh5ZHJhdGVkXG4gICAgICogd2hlbiB0aGUgYXBwIHN0YXJ0cy4gVGhlIG1hcCBpcyBjbGVhcmVkIGFmdGVyIGh5ZHJhdGlvbiBpcyBjb21wbGV0ZVxuICAgICAqIHRvIGZyZWUgdXAgbWVtb3J5LlxuICAgICAqL1xuICAgIF9maXJzdFNjcmVlbldvcmtsZXRSZWZNYXA6IHt9LFxuICAgIHVwZGF0ZVdvcmtsZXRSZWYsXG4gICAgdXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMsXG4gICAgY2xlYXJGaXJzdFNjcmVlbldvcmtsZXRSZWZNYXAsXG4gIH0pO1xufVxuXG5jb25zdCBjcmVhdGVXb3JrbGV0UmVmID0gPFQ+KFxuICBpZDogV29ya2xldFJlZklkLFxuICB2YWx1ZTogVCxcbik6IFdvcmtsZXRSZWY8VD4gPT4ge1xuICByZXR1cm4ge1xuICAgIGN1cnJlbnQ6IHZhbHVlLFxuICAgIF93dmlkOiBpZCxcbiAgfTtcbn07XG5cbmNvbnN0IGdldEZyb21Xb3JrbGV0UmVmTWFwID0gPFQ+KFxuICByZWZJbXBsOiBXb3JrbGV0UmVmSW1wbDxUPixcbik6IFdvcmtsZXRSZWY8VD4gPT4ge1xuICBjb25zdCBpZCA9IHJlZkltcGwuX3d2aWQ7XG4gIGxldCB2YWx1ZTtcbiAgaWYgKGlkIDwgMCkge1xuICAgIC8vIEF0IHRoZSBmaXJzdCBzY3JlZW4gcmVuZGVyaW5nLCB0aGUgd29ya2xldCByZWYgaXMgY3JlYXRlZCB3aXRoIGEgbmVnYXRpdmUgSUQuXG4gICAgLy8gTWlnaHQgYmUgY2FsbGVkIGluIHR3byBzY2VuYXJpb3M6XG4gICAgLy8gMS4gSW4gTVRTIGV2ZW50c1xuICAgIC8vIDIuIEluIGBtYWluLXRocmVhZDpyZWZgXG4gICAgdmFsdWUgPSBpbXBsIS5fZmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwW2lkXSBhcyBXb3JrbGV0UmVmPFQ+O1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHZhbHVlID0gaW1wbCEuX2ZpcnN0U2NyZWVuV29ya2xldFJlZk1hcFtpZF0gPSBjcmVhdGVXb3JrbGV0UmVmKGlkLCByZWZJbXBsLl9pbml0VmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGltcGwhLl93b3JrbGV0UmVmTWFwW2lkXSBhcyBXb3JrbGV0UmVmPFQ+O1xuICB9XG5cbiAgLyogdjggaWdub3JlIG5leHQgMyAqL1xuICBpZiAoX19ERVZfXyAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdXb3JrbGV0OiByZWYgaXMgbm90IGluaXRpYWxpemVkOiAnICsgaWQpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbVdvcmtsZXRSZWZNYXAoaWQ6IFdvcmtsZXRSZWZJZCk6IHZvaWQge1xuICBkZWxldGUgaW1wbCEuX3dvcmtsZXRSZWZNYXBbaWRdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50IGluc3RhbmNlIG9mIHRoZSBnaXZlbiBlbGVtZW50IG5vZGUsIHRoZW4gc2V0IHRoZSB3b3JrbGV0IHZhbHVlIHRvIGl0LlxuICogVGhpcyBpcyBjYWxsZWQgaW4gYHNuYXBzaG90Q29udGV4dFVwZGF0ZVdvcmtsZXRSZWZgLlxuICogQHBhcmFtIGhhbmRsZSBoYW5kbGUgb2YgdGhlIHdvcmtsZXQgdmFsdWUuXG4gKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCBub2RlLlxuICovXG5mdW5jdGlvbiB1cGRhdGVXb3JrbGV0UmVmKFxuICBoYW5kbGU6IFdvcmtsZXRSZWZJbXBsPEVsZW1lbnQgfCBudWxsPixcbiAgZWxlbWVudDogRWxlbWVudE5vZGUgfCBudWxsLFxuKTogdm9pZCB7XG4gIGdldEZyb21Xb3JrbGV0UmVmTWFwKGhhbmRsZSkuY3VycmVudCA9IGVsZW1lbnRcbiAgICA/IG5ldyBFbGVtZW50KGVsZW1lbnQpXG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVXb3JrbGV0UmVmSW5pdFZhbHVlQ2hhbmdlcyhcbiAgcGF0Y2g6IFtXb3JrbGV0UmVmSWQsIHVua25vd25dW10sXG4pOiB2b2lkIHtcbiAgcHJvZmlsZSgndXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMnLCAoKSA9PiB7XG4gICAgcGF0Y2guZm9yRWFjaCgoW2lkLCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICghaW1wbCEuX3dvcmtsZXRSZWZNYXBbaWRdKSB7XG4gICAgICAgIGltcGwhLl93b3JrbGV0UmVmTWFwW2lkXSA9IGNyZWF0ZVdvcmtsZXRSZWYoaWQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyRmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwKCk6IHZvaWQge1xuICBpbXBsIS5fZmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwID0ge307XG59XG5cbmV4cG9ydCB7XG4gIHR5cGUgUmVmSW1wbCxcbiAgY3JlYXRlV29ya2xldFJlZixcbiAgaW5pdFdvcmtsZXRSZWYsXG4gIGdldEZyb21Xb3JrbGV0UmVmTWFwLFxuICByZW1vdmVWYWx1ZUZyb21Xb3JrbGV0UmVmTWFwLFxuICB1cGRhdGVXb3JrbGV0UmVmSW5pdFZhbHVlQ2hhbmdlcyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IFdvcmtsZXRFdmVudHMgfSBmcm9tICcuL2JpbmRpbmdzL2V2ZW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlbGVhc2VXb3JrbGV0UmVmRGF0YSwgUnVuV29ya2xldEN0eERhdGEsIFJ1bldvcmtsZXRDdHhSZXREYXRhIH0gZnJvbSAnLi9iaW5kaW5ncy9ldmVudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDbG9zdXJlVmFsdWVUeXBlIH0gZnJvbSAnLi9iaW5kaW5ncy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSAnLi90eXBlcy9ydW50aW1lUHJveHkuanMnO1xuaW1wb3J0IHsgcmVtb3ZlVmFsdWVGcm9tV29ya2xldFJlZk1hcCB9IGZyb20gJy4vd29ya2xldFJlZi5qcyc7XG5cbmZ1bmN0aW9uIGluaXRFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgY29uc3QganNDb250ZXh0ID0gbHlueC5nZXRKU0NvbnRleHQoKTtcbiAganNDb250ZXh0LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgV29ya2xldEV2ZW50cy5ydW5Xb3JrbGV0Q3R4LFxuICAgIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEgYXMgc3RyaW5nKSBhcyBSdW5Xb3JrbGV0Q3R4RGF0YTtcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gcnVuV29ya2xldChkYXRhLndvcmtsZXQsIGRhdGEucGFyYW1zIGFzIENsb3N1cmVWYWx1ZVR5cGVbXSk7XG4gICAgICBqc0NvbnRleHQuZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHR5cGU6IFdvcmtsZXRFdmVudHMuRnVuY3Rpb25DYWxsUmV0LFxuICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgcmVzb2x2ZUlkOiBkYXRhLnJlc29sdmVJZCxcbiAgICAgICAgICByZXR1cm5WYWx1ZSxcbiAgICAgICAgfSBhcyBSdW5Xb3JrbGV0Q3R4UmV0RGF0YSksXG4gICAgICB9KTtcbiAgICB9LFxuICApO1xuICBqc0NvbnRleHQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICBXb3JrbGV0RXZlbnRzLnJlbGVhc2VXb3JrbGV0UmVmLFxuICAgIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIHJlbW92ZVZhbHVlRnJvbVdvcmtsZXRSZWZNYXAoKGV2ZW50LmRhdGEgYXMgUmVsZWFzZVdvcmtsZXRSZWZEYXRhKS5pZCk7XG4gICAgfSxcbiAgKTtcbn1cblxuZXhwb3J0IHsgaW5pdEV2ZW50TGlzdGVuZXJzIH07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB0eXBlIHsgSnNGbkhhbmRsZSB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuXG5pbnRlcmZhY2UgRGV0YWlscyB7XG4gIHRhc2s6IChmbklkOiBudW1iZXIsIGV4ZWNJZDogbnVtYmVyKSA9PiB2b2lkO1xuXG4gIC8vIFRoaXMgY29tZXMgZnJvbSB0aGUgYmFja2dyb3VuZCB0aHJlYWQsIGluc2VydGVkIGhlcmUgZHVyaW5nIGN0eCBoeWRyYXRpb24uXG4gIGpzRm5IYW5kbGU/OiBKc0ZuSGFuZGxlO1xufVxuXG5pbnRlcmZhY2UgUnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsIHtcbiAgLy8gRWxlbWVudHMgc2hvdWxkIGtlZXAgdGhlIG9yZGVyIGJlaW5nIGNhbGxlZCBieSB0aGUgdXNlci5cbiAgZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5OiBEZXRhaWxzW107XG4gIGRlbGF5UnVuT25CYWNrZ3JvdW5kKGZuT2JqOiBKc0ZuSGFuZGxlLCBmbjogKGZuSWQ6IG51bWJlciwgZXhlY0lkOiBudW1iZXIpID0+IHZvaWQpOiB2b2lkO1xuICBydW5EZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9ucygpOiB2b2lkO1xufVxuXG5sZXQgaW1wbDogUnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpbml0UnVuT25CYWNrZ3JvdW5kRGVsYXkoKTogUnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsIHtcbiAgcmV0dXJuIChpbXBsID0ge1xuICAgIGRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheTogW10sXG4gICAgZGVsYXlSdW5PbkJhY2tncm91bmQsXG4gICAgcnVuRGVsYXllZEJhY2tncm91bmRGdW5jdGlvbnMsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWxheVJ1bk9uQmFja2dyb3VuZChmbk9iajogSnNGbkhhbmRsZSwgdGFzazogKGZuSWQ6IG51bWJlciwgZXhlY0lkOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgaW1wbCEuZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5LnB1c2goeyB0YXNrIH0pO1xuICBjb25zdCBkZWxheUluZGljZXMgPSBmbk9iai5fZGVsYXlJbmRpY2VzID8/PSBbXTtcbiAgZGVsYXlJbmRpY2VzLnB1c2goaW1wbCEuZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5Lmxlbmd0aCAtIDEpO1xufVxuXG5mdW5jdGlvbiBydW5EZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9ucygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBkZXRhaWxzIG9mIGltcGwhLmRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheSkge1xuICAgIGlmIChkZXRhaWxzLmpzRm5IYW5kbGUpIHtcbiAgICAgIGRldGFpbHMudGFzayhkZXRhaWxzLmpzRm5IYW5kbGUuX2pzRm5JZCEsIGRldGFpbHMuanNGbkhhbmRsZS5fZXhlY0lkISk7XG4gICAgfVxuICB9XG4gIGltcGwhLmRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheS5sZW5ndGggPSAwO1xufVxuXG5leHBvcnQgeyB0eXBlIFJ1bk9uQmFja2dyb3VuZERlbGF5SW1wbCwgaW5pdFJ1bk9uQmFja2dyb3VuZERlbGF5IH07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgV29ya2xldCB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5cbmludGVyZmFjZSBFdmVudERlbGF5SW1wbCB7XG4gIF9kZWxheWVkV29ya2xldFBhcmFtc01hcDogTWFwPHN0cmluZywgQ2xvc3VyZVZhbHVlVHlwZVtdW10+O1xuICBydW5EZWxheWVkV29ya2xldCh3b3JrbGV0OiBXb3JrbGV0LCBlbGVtZW50OiBFbGVtZW50Tm9kZSk6IHZvaWQ7XG4gIGNsZWFyRGVsYXllZFdvcmtsZXRzKCk6IHZvaWQ7XG59XG5cbmxldCBpbXBsOiBFdmVudERlbGF5SW1wbCB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaW5pdEV2ZW50RGVsYXkoKTogRXZlbnREZWxheUltcGwge1xuICByZXR1cm4gKGltcGwgPSB7XG4gICAgX2RlbGF5ZWRXb3JrbGV0UGFyYW1zTWFwOiBuZXcgTWFwKCksXG4gICAgcnVuRGVsYXllZFdvcmtsZXQsXG4gICAgY2xlYXJEZWxheWVkV29ya2xldHMsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWxheUV4ZWNVbnRpbEpzUmVhZHkoXG4gIGhhc2g6IHN0cmluZyxcbiAgcGFyYW1zOiBDbG9zdXJlVmFsdWVUeXBlW10sXG4pOiB2b2lkIHtcbiAgcHJvZmlsZSgnZGVsYXlFeGVjVW50aWxKc1JlYWR5OiAnICsgaGFzaCwgKCkgPT4ge1xuICAgIGNvbnN0IG1hcCA9IGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcDtcbiAgICBjb25zdCBwYXJhbVZlYyA9IG1hcC5nZXQoaGFzaCk7XG4gICAgaWYgKHBhcmFtVmVjKSB7XG4gICAgICBwYXJhbVZlYy5wdXNoKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcC5zZXQoaGFzaCwgW3BhcmFtc10pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRlbGF5ZWRXb3JrbGV0KHdvcmtsZXQ6IFdvcmtsZXQsIGVsZW1lbnQ6IEVsZW1lbnROb2RlKTogdm9pZCB7XG4gIHByb2ZpbGUoJ2NvbW1pdERlbGF5ZWRXb3JrbGV0JywgKCkgPT4ge1xuICAgIGNvbnN0IHBhcmFtc1ZlYyA9IGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcC5nZXQoXG4gICAgICB3b3JrbGV0Ll93a2x0SWQsXG4gICAgKTtcbiAgICBpZiAocGFyYW1zVmVjID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGVmdFBhcmFtc1ZlYzogQ2xvc3VyZVZhbHVlVHlwZVtdW10gPSBbXTtcbiAgICBwYXJhbXNWZWMuZm9yRWFjaCgocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFBhcmFtID0gcGFyYW1zWzBdIGFzIHsgY3VycmVudFRhcmdldD86IHsgZWxlbWVudFJlZnB0cj86IEVsZW1lbnROb2RlIH0gfSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChmaXJzdFBhcmFtPy5jdXJyZW50VGFyZ2V0Py5lbGVtZW50UmVmcHRyID09PSBlbGVtZW50KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHByb2ZpbGUoJ3J1bkRlbGF5ZWRXb3JrbGV0JywgKCkgPT4ge1xuICAgICAgICAgICAgcnVuV29ya2xldCh3b3JrbGV0LCBwYXJhbXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlZnRQYXJhbXNWZWMucHVzaChwYXJhbXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcC5zZXQoXG4gICAgICB3b3JrbGV0Ll93a2x0SWQsXG4gICAgICBsZWZ0UGFyYW1zVmVjLFxuICAgICk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhckRlbGF5ZWRXb3JrbGV0cygpOiB2b2lkIHtcbiAgaW1wbCEuX2RlbGF5ZWRXb3JrbGV0UGFyYW1zTWFwLmNsZWFyKCk7XG59XG5cbmV4cG9ydCB7IHR5cGUgRXZlbnREZWxheUltcGwsIGluaXRFdmVudERlbGF5LCBkZWxheUV4ZWNVbnRpbEpzUmVhZHksIHJ1bkRlbGF5ZWRXb3JrbGV0LCBjbGVhckRlbGF5ZWRXb3JrbGV0cyB9O1xuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICcuL2FwaS9lbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgSnNGbkhhbmRsZSwgV29ya2xldCwgV29ya2xldFJlZklkLCBXb3JrbGV0UmVmSW1wbCB9IGZyb20gJy4vYmluZGluZ3MvaW5kZXguanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5cbi8qKlxuICogSHlkcmF0ZXMgYSBXb3JrbGV0IGNvbnRleHQgd2l0aCBkYXRhIGZyb20gYSBmaXJzdC1zY3JlZW4gV29ya2xldCBjb250ZXh0LlxuICogVGhpcyBwcm9jZXNzIGlzIHR5cGljYWxseSB1c2VkIHRvIHJ1biBhbGwgZGVsYXllZCBgcnVuT25CYWNrZ3JvdW5kYCBmdW5jdGlvbnNcbiAqIGFuZCBpbml0aWFsaXplIGBXb3JrbGV0UmVmYCB2YWx1ZXMgbW9kaWZpZWQgYmVmb3JlIGh5ZHJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gY3R4IFRoZSB0YXJnZXQgV29ya2xldCBjb250ZXh0IHRvIGJlIGh5ZHJhdGVkLlxuICogQHBhcmFtIGZpcnN0U2NyZWVuQ3R4IFRoZSBXb3JrbGV0IGNvbnRleHQgZnJvbSB0aGUgZmlyc3Qgc2NyZWVuIHJlbmRlcmluZyxcbiAqICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBkYXRhIHRvIGh5ZHJhdGUgd2l0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVDdHgoY3R4OiBXb3JrbGV0LCBmaXJzdFNjcmVlbkN0eDogV29ya2xldCk6IHZvaWQge1xuICBwcm9maWxlKCdoeWRyYXRlQ3R4JywgKCkgPT4ge1xuICAgIGh5ZHJhdGVDdHhJbXBsKGN0eCwgZmlyc3RTY3JlZW5DdHgsIGN0eC5fZXhlY0lkISk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlQ3R4SW1wbChjdHg6IENsb3N1cmVWYWx1ZVR5cGUsIGZpcnN0U2NyZWVuQ3R4OiBDbG9zdXJlVmFsdWVUeXBlLCBleGVjSWQ6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIWN0eCB8fCB0eXBlb2YgY3R4ICE9PSAnb2JqZWN0JyB8fCAhZmlyc3RTY3JlZW5DdHggfHwgdHlwZW9mIGZpcnN0U2NyZWVuQ3R4ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IGN0eE9iaiA9IGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcbiAgY29uc3QgZmlyc3RTY3JlZW5DdHhPYmogPSBmaXJzdFNjcmVlbkN0eCBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcblxuICBpZiAoY3R4T2JqWydfd2tsdElkJ10gJiYgY3R4T2JqWydfd2tsdElkJ10gIT09IGZpcnN0U2NyZWVuQ3R4T2JqWydfd2tsdElkJ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZvci1pbi1hcnJheVxuICBmb3IgKGNvbnN0IGtleSBpbiBjdHgpIHtcbiAgICBpZiAoa2V5ID09PSAnX3d2aWQnKSB7XG4gICAgICBoeWRyYXRlTWFpblRocmVhZFJlZihjdHhPYmpba2V5XSBhcyBXb3JrbGV0UmVmSWQsIGZpcnN0U2NyZWVuQ3R4T2JqIGFzIHVua25vd24gYXMgV29ya2xldFJlZkltcGw8dW5rbm93bj4pO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnX2pzRm4nKSB7XG4gICAgICBoeWRyYXRlRGVsYXlSdW5PbkJhY2tncm91bmRUYXNrcyhcbiAgICAgICAgY3R4T2JqW2tleV0gYXMgUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sXG4gICAgICAgIGZpcnN0U2NyZWVuQ3R4T2JqW2tleV0gYXMgUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sXG4gICAgICAgIGV4ZWNJZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpcnN0U2NyZWVuVmFsdWUgPSB0eXBlb2YgZmlyc3RTY3JlZW5DdHhPYmpba2V5XSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IChmaXJzdFNjcmVlbkN0eE9ialtrZXldIGFzIHsgY3R4OiBDbG9zdXJlVmFsdWVUeXBlIH0pLmN0eFxuICAgICAgICA6IGZpcnN0U2NyZWVuQ3R4T2JqW2tleV07XG4gICAgICBoeWRyYXRlQ3R4SW1wbChjdHhPYmpba2V5XSwgZmlyc3RTY3JlZW5WYWx1ZSwgZXhlY0lkKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBIeWRyYXRlcyBhIFdvcmtsZXRSZWYgb24gdGhlIG1haW4gdGhyZWFkLlxuICogVGhpcyBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgV29ya2xldFJlZidzIGJhY2tncm91bmQgaW5pdGlhbCB2YWx1ZSBiYXNlZCBvbiBjaGFuZ2VzXG4gKiB0aGF0IG9jY3VycmVkIGluIHRoZSBmaXJzdC1zY3JlZW4gV29ya2xldCBjb250ZXh0IGJlZm9yZSBoeWRyYXRpb24uXG4gKlxuICogQHBhcmFtIHJlZklkIFRoZSBJRCBvZiB0aGUgV29ya2xldFJlZiB0byBoeWRyYXRlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBXb3JrbGV0UmVmLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlTWFpblRocmVhZFJlZihyZWZJZDogV29ya2xldFJlZklkLCB2YWx1ZTogV29ya2xldFJlZkltcGw8dW5rbm93bj4gfCB7IGN1cnJlbnQ6IHVua25vd24gfSkge1xuICBpZiAoJ19pbml0VmFsdWUnIGluIHZhbHVlKSB7XG4gICAgLy8gVGhlIHJlZiBoYXMgbm90IGJlZW4gYWNjZXNzZWQgeWV0LlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWYgPSBseW54V29ya2xldEltcGwhLl9yZWZJbXBsLl93b3JrbGV0UmVmTWFwW3JlZklkXSE7XG4gIGlmIChyZWYuY3VycmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAvLyBNb2RpZmllZCBieSBgbWFpbi10aHJlYWQ6cmVmYFxuICAgIHJldHVybjtcbiAgfVxuICByZWYuY3VycmVudCA9IHZhbHVlLmN1cnJlbnQ7XG59XG5cbi8qKlxuICogSHlkcmF0ZXMgZGVsYXllZCBgcnVuT25CYWNrZ3JvdW5kYCB0YXNrcy5cbiAqIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGFueSBgcnVuT25CYWNrZ3JvdW5kYCBjYWxscyB0aGF0IHdlcmUgZGVsYXllZFxuICogZHVyaW5nIHRoZSBmaXJzdC1zY3JlZW4gcmVuZGVyaW5nIGFyZSBjb3JyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZWlyXG4gKiByZXNwZWN0aXZlIEphdmFTY3JpcHQgZnVuY3Rpb24gaGFuZGxlcyBpbiB0aGUgaHlkcmF0ZWQgV29ya2xldCBjb250ZXh0LlxuICovXG5mdW5jdGlvbiBoeWRyYXRlRGVsYXlSdW5PbkJhY2tncm91bmRUYXNrcyhcbiAgZm5PYmpzOiBSZWNvcmQ8c3RyaW5nLCBKc0ZuSGFuZGxlPiwgLy8gZXhhbXBsZToge1wiX2pzRm4xXCI6e1wiX2pzRm5JZFwiOjF9fVxuICBmaXJzdFNjcmVlbkZuT2JqczogUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sIC8vIGV4YW1wbGU6IHtcIl9qc0ZuMVwiOntcIl9pc0ZpcnN0U2NyZWVuXCI6dHJ1ZSxcIl9kZWxheUluZGljZXNcIjpbMF19fVxuICBleGVjSWQ6IG51bWJlcixcbikge1xuICBmb3IgKGNvbnN0IGZuTmFtZSBpbiBmbk9ianMpIHtcbiAgICBjb25zdCBmbk9iaiA9IGZuT2Jqc1tmbk5hbWVdITtcbiAgICBjb25zdCBmaXJzdFNjcmVlbkZuT2JqOiBKc0ZuSGFuZGxlIHwgdW5kZWZpbmVkID0gZmlyc3RTY3JlZW5Gbk9ianNbZm5OYW1lXTtcbiAgICBpZiAoIWZpcnN0U2NyZWVuRm5PYmo/Ll9kZWxheUluZGljZXMpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGZpcnN0U2NyZWVuRm5PYmouX2RlbGF5SW5kaWNlcykge1xuICAgICAgY29uc3QgZGV0YWlscyA9IGx5bnhXb3JrbGV0SW1wbCEuX3J1bk9uQmFja2dyb3VuZERlbGF5SW1wbC5kZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9uQXJyYXlbaW5kZXhdITtcbiAgICAgIGZuT2JqLl9leGVjSWQgPSBleGVjSWQ7XG4gICAgICBkZXRhaWxzLmpzRm5IYW5kbGUgPSBmbk9iajtcbiAgICB9XG4gIH1cbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgV29ya2xldEV2ZW50cyB9IGZyb20gJy4vYmluZGluZ3MvZXZlbnRzLmpzJztcbmltcG9ydCB7IHByb2ZpbGUgfSBmcm9tICcuL3V0aWxzL3Byb2ZpbGUuanMnO1xuaW1wb3J0IHsgaXNTZGtWZXJzaW9uR3QgfSBmcm9tICcuL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIGBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlcmAgbW9uaXRvcnMgcmVmZXJlbmNlcyB0byBKUyBmdW5jdGlvbiBoYW5kbGVzIHRvIGJlIGNhbGxlZCBieSBgcnVuT25CYWNrZ3JvdW5kKClgLlxuICogSW4gSlMgY29udGV4dCwgZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBieSBgcnVuT25CYWNrZ3JvdW5kKClgIGlzIHJlZmVyZW5jZWQgYnkgYEpzRm5IYW5kbGVgcyBhbmQgZmluYWxseSBieSBgZXhlY0lkYC5cbiAqIFdoZW4gYWxsIGBKc0ZuSGFuZGxlYHMgaW4gbGVwdXMgYXJlIHJlbGVhc2VkLCBhbiBldmVudCB3aWxsIGJlIHNlbnQgdG8gSlMgY29udGV4dCB0byBkZS1yZWYgdGhlIGBleGVjSWRgLFxuICogcmVzdWx0aW5nIGEgZGUtcmVmIHRvIHRoZSBqcyBmdW5jdGlvbiBpbiBKUyBjb250ZXh0LlxuICovXG5jbGFzcyBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciB7XG4gIHByaXZhdGUgZXhlY0lkUmVmQ291bnQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBwcml2YXRlIGV4ZWNJZFNldFRvRmlyZSA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBwcml2YXRlIHdpbGxGaXJlID0gZmFsc2U7XG4gIHByaXZhdGUgcmVnaXN0cnk/OiBGaW5hbGl6YXRpb25SZWdpc3RyeTxudW1iZXI+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucmVnaXN0cnkgPSBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnk8bnVtYmVyPih0aGlzLnJlbW92ZVJlZi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGFkZFJlZihleGVjSWQ6IG51bWJlciwgb2JqVG9SZWY6IG9iamVjdCk6IHZvaWQge1xuICAgIHRoaXMuZXhlY0lkUmVmQ291bnQuc2V0KFxuICAgICAgZXhlY0lkLFxuICAgICAgKHRoaXMuZXhlY0lkUmVmQ291bnQuZ2V0KGV4ZWNJZCkgPz8gMCkgKyAxLFxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RyeSEucmVnaXN0ZXIob2JqVG9SZWYsIGV4ZWNJZCk7XG4gIH1cblxuICByZW1vdmVSZWYoZXhlY0lkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCByYyA9IHRoaXMuZXhlY0lkUmVmQ291bnQuZ2V0KGV4ZWNJZCkhO1xuICAgIGlmIChyYyA+IDEpIHtcbiAgICAgIHRoaXMuZXhlY0lkUmVmQ291bnQuc2V0KGV4ZWNJZCwgcmMgLSAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5leGVjSWRSZWZDb3VudC5kZWxldGUoZXhlY0lkKTtcbiAgICB0aGlzLmV4ZWNJZFNldFRvRmlyZS5hZGQoZXhlY0lkKTtcbiAgICBpZiAoIXRoaXMud2lsbEZpcmUpIHtcbiAgICAgIHRoaXMud2lsbEZpcmUgPSB0cnVlO1xuICAgICAgdm9pZCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5maXJlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmaXJlKCk6IHZvaWQge1xuICAgIHByb2ZpbGUoJ0pzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyLmZpcmUnLCAoKSA9PiB7XG4gICAgICBseW54LmdldEpTQ29udGV4dCgpLmRpc3BhdGNoRXZlbnQoe1xuICAgICAgICB0eXBlOiBXb3JrbGV0RXZlbnRzLnJlbGVhc2VCYWNrZ3JvdW5kV29ya2xldEN0eCxcbiAgICAgICAgZGF0YTogQXJyYXkuZnJvbSh0aGlzLmV4ZWNJZFNldFRvRmlyZSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhlY0lkU2V0VG9GaXJlLmNsZWFyKCk7XG4gICAgICB0aGlzLndpbGxGaXJlID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNSdW5PbkJhY2tncm91bmRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNTZGtWZXJzaW9uR3QoMiwgMTUpO1xufVxuXG5leHBvcnQgeyBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciwgaXNSdW5PbkJhY2tncm91bmRFbmFibGVkIH07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICcuL2FwaS9lbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgV29ya2xldCwgV29ya2xldFJlZkltcGwgfSBmcm9tICcuL2JpbmRpbmdzL3R5cGVzLmpzJztcbmltcG9ydCB7IGluaXRSdW5PbkJhY2tncm91bmREZWxheSB9IGZyb20gJy4vZGVsYXlSdW5PbkJhY2tncm91bmQuanMnO1xuaW1wb3J0IHsgZGVsYXlFeGVjVW50aWxKc1JlYWR5LCBpbml0RXZlbnREZWxheSB9IGZyb20gJy4vZGVsYXlXb3JrbGV0RXZlbnQuanMnO1xuaW1wb3J0IHsgaHlkcmF0ZUN0eCB9IGZyb20gJy4vaHlkcmF0ZS5qcyc7XG5pbXBvcnQgeyBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciwgaXNSdW5PbkJhY2tncm91bmRFbmFibGVkIH0gZnJvbSAnLi9qc0Z1bmN0aW9uTGlmZWN5Y2xlLmpzJztcbmltcG9ydCB7IHByb2ZpbGUgfSBmcm9tICcuL3V0aWxzL3Byb2ZpbGUuanMnO1xuaW1wb3J0IHsgZ2V0RnJvbVdvcmtsZXRSZWZNYXAsIGluaXRXb3JrbGV0UmVmIH0gZnJvbSAnLi93b3JrbGV0UmVmLmpzJztcblxuZnVuY3Rpb24gaW5pdFdvcmtsZXQoKTogdm9pZCB7XG4gIGdsb2JhbFRoaXMubHlueFdvcmtsZXRJbXBsID0ge1xuICAgIF93b3JrbGV0TWFwOiB7fSxcbiAgICBfcmVmSW1wbDogaW5pdFdvcmtsZXRSZWYoKSxcbiAgICBfcnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsOiBpbml0UnVuT25CYWNrZ3JvdW5kRGVsYXkoKSxcbiAgICBfaHlkcmF0ZUN0eDogaHlkcmF0ZUN0eCxcbiAgICBfZXZlbnREZWxheUltcGw6IGluaXRFdmVudERlbGF5KCksXG4gIH07XG5cbiAgaWYgKGlzUnVuT25CYWNrZ3JvdW5kRW5hYmxlZCgpKSB7XG4gICAgZ2xvYmFsVGhpcy5seW54V29ya2xldEltcGwuX2pzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyID0gbmV3IEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyKCk7XG4gIH1cblxuICBnbG9iYWxUaGlzLnJlZ2lzdGVyV29ya2xldCA9IHJlZ2lzdGVyV29ya2xldDtcbiAgZ2xvYmFsVGhpcy5yZWdpc3RlcldvcmtsZXRJbnRlcm5hbCA9IHJlZ2lzdGVyV29ya2xldDtcbiAgZ2xvYmFsVGhpcy5ydW5Xb3JrbGV0ID0gcnVuV29ya2xldDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIHdvcmtsZXQgZnVuY3Rpb24sIGFsbG93aW5nIGl0IHRvIGJlIGV4ZWN1dGVkIGJ5IGBydW5Xb3JrbGV0KClgLlxuICogVGhpcyBpcyBjYWxsZWQgaW4gbGVwdXMuanMuXG4gKiBAcGFyYW0gX3R5cGUgd29ya2xldCB0eXBlLCAnbWFpbi10aHJlYWQnIG9yICd1aSdcbiAqIEBwYXJhbSBpZCB3b3JrbGV0IGhhc2hcbiAqIEBwYXJhbSB3b3JrbGV0IHdvcmtsZXQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJXb3JrbGV0KF90eXBlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHdvcmtsZXQ6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pOiB2b2lkIHtcbiAgbHlueFdvcmtsZXRJbXBsLl93b3JrbGV0TWFwW2lkXSA9IHdvcmtsZXQ7XG59XG5cbi8qKlxuICogRW50cmFuY2Ugb2YgYWxsIHdvcmtsZXQgY2FsbHMuXG4gKiBOYXRpdmUgZXZlbnQgdG91Y2ggaGFuZGxlciB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBjdHggd29ya2xldCBvYmplY3QuXG4gKiBAcGFyYW0gcGFyYW1zIHdvcmtsZXQgcGFyYW1zLlxuICovXG5mdW5jdGlvbiBydW5Xb3JrbGV0KGN0eDogV29ya2xldCwgcGFyYW1zOiBDbG9zdXJlVmFsdWVUeXBlW10pOiB1bmtub3duIHtcbiAgaWYgKCF2YWxpZGF0ZVdvcmtsZXQoY3R4KSkge1xuICAgIGNvbnNvbGUud2FybignV29ya2xldDogSW52YWxpZCB3b3JrbGV0IG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KGN0eCkpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoJ19sZXB1c1dvcmtsZXRIYXNoJyBpbiBjdHgpIHtcbiAgICBkZWxheUV4ZWNVbnRpbEpzUmVhZHkoY3R4Ll9sZXB1c1dvcmtsZXRIYXNoLCBwYXJhbXMpO1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gcnVuV29ya2xldEltcGwoY3R4LCBwYXJhbXMpO1xufVxuXG5mdW5jdGlvbiBydW5Xb3JrbGV0SW1wbChjdHg6IFdvcmtsZXQsIHBhcmFtczogQ2xvc3VyZVZhbHVlVHlwZVtdKTogdW5rbm93biB7XG4gIGNvbnN0IHdvcmtsZXQ6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24gPSBwcm9maWxlKFxuICAgICd0cmFuc2Zvcm1Xb3JrbGV0Q3R4ICcgKyBjdHguX3drbHRJZCxcbiAgICAoKSA9PiB0cmFuc2Zvcm1Xb3JrbGV0KGN0eCwgdHJ1ZSksXG4gICk7XG4gIGNvbnN0IHBhcmFtc186IENsb3N1cmVWYWx1ZVR5cGVbXSA9IHByb2ZpbGUoXG4gICAgJ3RyYW5zZm9ybVdvcmtsZXRQYXJhbXMnLFxuICAgICgpID0+IHRyYW5zZm9ybVdvcmtsZXQocGFyYW1zIHx8IFtdLCBmYWxzZSksXG4gICk7XG4gIHJldHVybiBwcm9maWxlKCdydW5Xb3JrbGV0JywgKCkgPT4gd29ya2xldCguLi5wYXJhbXNfKSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlV29ya2xldChjdHg6IHVua25vd24pOiBjdHggaXMgV29ya2xldCB7XG4gIHJldHVybiB0eXBlb2YgY3R4ID09PSAnb2JqZWN0JyAmJiBjdHggIT09IG51bGwgJiYgKCdfd2tsdElkJyBpbiBjdHggfHwgJ19sZXB1c1dvcmtsZXRIYXNoJyBpbiBjdHgpO1xufVxuXG5jb25zdCB3b3JrbGV0Q2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIENsb3N1cmVWYWx1ZVR5cGUgfCAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bik+KCk7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVdvcmtsZXQoY3R4OiBXb3JrbGV0LCBpc1dvcmtsZXQ6IHRydWUpOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuZnVuY3Rpb24gdHJhbnNmb3JtV29ya2xldChcbiAgY3R4OiBDbG9zdXJlVmFsdWVUeXBlW10sXG4gIGlzV29ya2xldDogZmFsc2UsXG4pOiBDbG9zdXJlVmFsdWVUeXBlW107XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVdvcmtsZXQoXG4gIGN0eDogQ2xvc3VyZVZhbHVlVHlwZSxcbiAgaXNXb3JrbGV0OiBib29sZWFuLFxuKTogQ2xvc3VyZVZhbHVlVHlwZSB8ICgoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKSB7XG4gIC8qIHY4IGlnbm9yZSBuZXh0IDMgKi9cbiAgaWYgKHR5cGVvZiBjdHggIT09ICdvYmplY3QnIHx8IGN0eCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBjdHg7XG4gIH1cblxuICBpZiAoaXNXb3JrbGV0KSB7XG4gICAgY29uc3QgcmVzID0gd29ya2xldENhY2hlLmdldChjdHgpO1xuICAgIGlmIChyZXMpIHtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgd29ya2xldCA9IHsgbWFpbjogY3R4IH07XG4gIHRyYW5zZm9ybVdvcmtsZXRJbm5lcih3b3JrbGV0LCAwLCBjdHgpO1xuXG4gIGlmIChpc1dvcmtsZXQpIHtcbiAgICB3b3JrbGV0Q2FjaGUuc2V0KGN0eCwgd29ya2xldC5tYWluKTtcbiAgfVxuICByZXR1cm4gd29ya2xldC5tYWluO1xufVxuXG5jb25zdCB0cmFuc2Zvcm1Xb3JrbGV0SW5uZXIgPSAoXG4gIHZhbHVlOiBDbG9zdXJlVmFsdWVUeXBlLFxuICBkZXB0aDogbnVtYmVyLFxuICBjdHg6IHVua25vd24sXG4pID0+IHtcbiAgY29uc3QgbGltaXQgPSAxMDAwO1xuICBpZiAoKytkZXB0aCA+PSBsaW1pdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGVwdGggb2YgdmFsdWUgZXhjZWVkcyBsaW1pdCBvZiAnICsgbGltaXQgKyAnLicpO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBuZXh0IDMgKi9cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgQ2xvc3VyZVZhbHVlVHlwZT47XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgY29uc3Qgc3ViT2JqOiBDbG9zdXJlVmFsdWVUeXBlID0gb2JqW2tleV07XG4gICAgaWYgKHR5cGVvZiBzdWJPYmogIT09ICdvYmplY3QnIHx8IHN1Yk9iaiA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgaXNFdmVudFRhcmdldCA9ICdlbGVtZW50UmVmcHRyJyBpbiBzdWJPYmo7XG4gICAgaWYgKCFpc0V2ZW50VGFyZ2V0KSB7XG4gICAgICB0cmFuc2Zvcm1Xb3JrbGV0SW5uZXIoc3ViT2JqLCBkZXB0aCwgY3R4KTtcbiAgICB9XG5cbiAgICBpZiAoaXNFdmVudFRhcmdldCkge1xuICAgICAgb2JqW2tleV0gPSBuZXcgRWxlbWVudChzdWJPYmpbJ2VsZW1lbnRSZWZwdHInXSBhcyBFbGVtZW50Tm9kZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaXNXb3JrbGV0UmVmID0gJ193dmlkJyBpbiAoc3ViT2JqIGFzIG9iamVjdCk7XG4gICAgaWYgKGlzV29ya2xldFJlZikge1xuICAgICAgb2JqW2tleV0gPSBnZXRGcm9tV29ya2xldFJlZk1hcChcbiAgICAgICAgc3ViT2JqIGFzIHVua25vd24gYXMgV29ya2xldFJlZkltcGw8dW5rbm93bj4sXG4gICAgICApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGlzV29ya2xldCA9ICdfd2tsdElkJyBpbiBzdWJPYmo7XG4gICAgaWYgKGlzV29ya2xldCkge1xuICAgICAgLy8gYHN1Yk9iamAgaXMgd29ya2xldCBjdHguIFNoYWxsb3cgY29weSBpdCB0byBwcmV2ZW50IHRoZSB0cmFuc2Zvcm1lZCB3b3JrbGV0IGZyb20gcmVmZXJlbmNpbmcgY3R4LlxuICAgICAgLy8gVGhpcyB3b3VsZCByZXN1bHQgaW4gdGhlIHZhbHVlIG9mIGB3b3JrbGV0Q2FjaGVgIHJlZmVyZW5jaW5nIGl0cyBrZXkuXG4gICAgICBvYmpba2V5XSA9IGx5bnhXb3JrbGV0SW1wbC5fd29ya2xldE1hcFsoc3ViT2JqIGFzIFdvcmtsZXQpLl93a2x0SWRdIVxuICAgICAgICAuYmluZCh7IC4uLnN1Yk9iaiB9KTtcbiAgICAgIG9ialtrZXldLmN0eCA9IHN1Yk9iajtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBpc0pzRm4gPSAnX2pzRm5JZCcgaW4gc3ViT2JqO1xuICAgIGlmIChpc0pzRm4pIHtcbiAgICAgIHN1Yk9ialsnX2V4ZWNJZCddID0gKGN0eCBhcyBXb3JrbGV0KS5fZXhlY0lkO1xuICAgICAgbHlueFdvcmtsZXRJbXBsLl9qc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlcj8uYWRkUmVmKFxuICAgICAgICAoY3R4IGFzIFdvcmtsZXQpLl9leGVjSWQhLFxuICAgICAgICBzdWJPYmosXG4gICAgICApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgeyBpbml0V29ya2xldCB9O1xuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBpbml0QXBpRW52IH0gZnJvbSAnLi9hcGkvbHlueEFwaS5qcyc7XG5pbXBvcnQgeyBpbml0RXZlbnRMaXN0ZW5lcnMgfSBmcm9tICcuL2xpc3RlbmVycy5qcyc7XG5pbXBvcnQgeyBpbml0V29ya2xldCB9IGZyb20gJy4vd29ya2xldFJ1bnRpbWUuanMnO1xuXG5pZiAoZ2xvYmFsVGhpcy5seW54V29ya2xldEltcGwgPT09IHVuZGVmaW5lZCkge1xuICBpbml0V29ya2xldCgpO1xuICBpbml0QXBpRW52KCk7XG4gIGluaXRFdmVudExpc3RlbmVycygpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQUdPLE1BQU0sV0FBTixNQUFNLFNBQVE7QUFBQSxJQU1uQixZQUFZLFNBQXNCO0FBRmxDO0FBQUEsMEJBQWlCO0FBTWYsYUFBTyxlQUFlLE1BQU0sV0FBVztBQUFBLFFBQ3JDLE1BQU07QUFDSixpQkFBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFTyxhQUFhLE1BQWMsT0FBc0I7QUFDdEQscUJBQWUsS0FBSyxTQUFTLE1BQU0sS0FBSztBQUN4QyxXQUFLLGlCQUFpQjtBQUFBLElBQ3hCO0FBQUEsSUFFTyxpQkFBaUIsTUFBYyxPQUFxQjtBQUN6RCx1QkFBaUIsS0FBSyxTQUFTLE1BQU0sS0FBSztBQUMxQyxXQUFLLGlCQUFpQjtBQUFBLElBQ3hCO0FBQUEsSUFFTyxtQkFBbUIsUUFBc0M7QUFDOUQsaUJBQVcsT0FBTyxRQUFRO0FBQ3hCLHlCQUFpQixLQUFLLFNBQVMsS0FBSyxPQUFPLEdBQUcsQ0FBRTtBQUFBLE1BQ2xEO0FBQ0EsV0FBSyxpQkFBaUI7QUFBQSxJQUN4QjtBQUFBLElBRU8sYUFBYSxlQUFnQztBQUNsRCxhQUFPLHFCQUFxQixLQUFLLFNBQVMsYUFBYTtBQUFBLElBQ3pEO0FBQUEsSUFFTyxvQkFBOEI7QUFDbkMsYUFBTyxvQkFBb0IsS0FBSyxPQUFPO0FBQUEsSUFDekM7QUFBQSxJQUVPLGNBQWMsVUFBa0M7QUFDckQsWUFBTSxNQUFNLGdCQUFnQixLQUFLLFNBQVMsVUFBVSxDQUFDLENBQUM7QUFDdEQsYUFBTyxNQUFNLElBQUksU0FBUSxHQUFHLElBQUk7QUFBQSxJQUNsQztBQUFBLElBRU8saUJBQWlCLFVBQTZCO0FBQ25ELGFBQU8sbUJBQW1CLEtBQUssU0FBUyxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FB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
518
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2FwaS9lbGVtZW50LnRzIiwgIi4uL3NyYy9hcGkvbGVwdXNRdWVyeVNlbGVjdG9yLnRzIiwgIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwgIi4uL3NyYy9hcGkvbHlueEFwaS50cyIsICIuLi9zcmMvdXRpbHMvcHJvZmlsZS50cyIsICIuLi9zcmMvd29ya2xldFJlZi50cyIsICIuLi9zcmMvbGlzdGVuZXJzLnRzIiwgIi4uL3NyYy9kZWxheVJ1bk9uQmFja2dyb3VuZC50cyIsICIuLi9zcmMvZGVsYXlXb3JrbGV0RXZlbnQudHMiLCAiLi4vc3JjL2h5ZHJhdGUudHMiLCAiLi4vc3JjL2pzRnVuY3Rpb25MaWZlY3ljbGUudHMiLCAiLi4vc3JjL3dvcmtsZXRSdW50aW1lLnRzIiwgIi4uL3NyYy9pbmRleC50cyJdLAogICJzb3VyY2VSb290IjogIi9ob21lL3J1bm5lci93b3JrL2x5bngtc3RhY2svbHlueC1zdGFjay9wYWNrYWdlcy9yZWFjdC93b3JrbGV0LXJ1bnRpbWUvc3JjIiwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5leHBvcnQgY2xhc3MgRWxlbWVudCB7XG4gIHByaXZhdGUgc3RhdGljIHdpbGxGbHVzaCA9IGZhbHNlO1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Igc2V0IGluIGNvbnN0cnVjdG9yXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudDogRWxlbWVudE5vZGU7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudE5vZGUpIHtcbiAgICAvLyBJbiBMeW54IHZlcnNpb25zIHByaW9yIHRvIGFuZCBpbmNsdWRpbmcgMi4xNSxcbiAgICAvLyBhIGNyYXNoIG9jY3VycyB3aGVuIHByaW50aW5nIG9yIHRyYW5zZmVycmluZyByZWZDb3VudGVkIGFjcm9zcyB0aHJlYWRzLlxuICAgIC8vIEJ5cGFzcyB0aGlzIHByb2JsZW0gYnkgaGlkaW5nIHRoZSBlbGVtZW50IG9iamVjdC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2VsZW1lbnQnLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIF9fU2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgbmFtZSwgdmFsdWUpO1xuICAgIHRoaXMuZmx1c2hFbGVtZW50VHJlZSgpO1xuICB9XG5cbiAgcHVibGljIHNldFN0eWxlUHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgX19BZGRJbmxpbmVTdHlsZSh0aGlzLmVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmZsdXNoRWxlbWVudFRyZWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdHlsZVByb3BlcnRpZXMoc3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3R5bGVzKSB7XG4gICAgICBfX0FkZElubGluZVN0eWxlKHRoaXMuZWxlbWVudCwga2V5LCBzdHlsZXNba2V5XSEpO1xuICAgIH1cbiAgICB0aGlzLmZsdXNoRWxlbWVudFRyZWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIF9fR2V0QXR0cmlidXRlQnlOYW1lKHRoaXMuZWxlbWVudCwgYXR0cmlidXRlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXR0cmlidXRlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBfX0dldEF0dHJpYnV0ZU5hbWVzKHRoaXMuZWxlbWVudCk7XG4gIH1cblxuICBwdWJsaWMgcXVlcnlTZWxlY3RvcihzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHJlZiA9IF9fUXVlcnlTZWxlY3Rvcih0aGlzLmVsZW1lbnQsIHNlbGVjdG9yLCB7fSk7XG4gICAgcmV0dXJuIHJlZiA/IG5ldyBFbGVtZW50KHJlZikgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3I6IHN0cmluZyk6IEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIF9fUXVlcnlTZWxlY3RvckFsbCh0aGlzLmVsZW1lbnQsIHNlbGVjdG9yLCB7fSkubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEVsZW1lbnQoZWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaW52b2tlKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9fSW52b2tlVUlNZXRob2QoXG4gICAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGFyYW1zID8/IHt9LFxuICAgICAgICAocmVzOiB7IGNvZGU6IG51bWJlcjsgZGF0YTogdW5rbm93biB9KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5jb2RlID09PSAwKSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlcy5kYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVUkgbWV0aG9kIGludm9rZTogJyArIEpTT04uc3RyaW5naWZ5KHJlcykpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdGhpcy5mbHVzaEVsZW1lbnRUcmVlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZsdXNoRWxlbWVudFRyZWUoKSB7XG4gICAgaWYgKEVsZW1lbnQud2lsbEZsdXNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEVsZW1lbnQud2lsbEZsdXNoID0gdHJ1ZTtcbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgRWxlbWVudC53aWxsRmx1c2ggPSBmYWxzZTtcbiAgICAgIF9fRmx1c2hFbGVtZW50VHJlZSgpO1xuICAgIH0pO1xuICB9XG59XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICcuL2VsZW1lbnQuanMnO1xuXG5jbGFzcyBQYWdlRWxlbWVudCB7XG4gIHByaXZhdGUgc3RhdGljIHBhZ2VFbGVtZW50OiBFbGVtZW50Tm9kZSB8IHVuZGVmaW5lZDtcblxuICBzdGF0aWMgZ2V0KCkge1xuICAgIFBhZ2VFbGVtZW50LnBhZ2VFbGVtZW50ID8/PSBfX0dldFBhZ2VFbGVtZW50KCk7XG4gICAgcmV0dXJuIFBhZ2VFbGVtZW50LnBhZ2VFbGVtZW50O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yKGNzc1NlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IGVsZW1lbnQgPSBfX1F1ZXJ5U2VsZWN0b3IoUGFnZUVsZW1lbnQuZ2V0KCksIGNzc1NlbGVjdG9yLCB7fSk7XG4gIHJldHVybiBlbGVtZW50ID8gbmV3IEVsZW1lbnQoZWxlbWVudCkgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbChjc3NTZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudFtdIHtcbiAgcmV0dXJuIF9fUXVlcnlTZWxlY3RvckFsbChQYWdlRWxlbWVudC5nZXQoKSwgY3NzU2VsZWN0b3IsIHt9KS5tYXAoXG4gICAgKGVsZW1lbnQpID0+IHtcbiAgICAgIHJldHVybiBuZXcgRWxlbWVudChlbGVtZW50KTtcbiAgICB9LFxuICApO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5leHBvcnQgZnVuY3Rpb24gaXNTZGtWZXJzaW9uR3QobWFqb3I6IG51bWJlciwgbWlub3I6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBseW54U2RrVmVyc2lvbjogc3RyaW5nID0gU3lzdGVtSW5mby5seW54U2RrVmVyc2lvbiA/PyAnMS4wJztcbiAgY29uc3QgdmVyc2lvbiA9IGx5bnhTZGtWZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiAoXG4gICAgTnVtYmVyKHZlcnNpb25bMF0pID4gbWFqb3JcbiAgICB8fCAoTnVtYmVyKHZlcnNpb25bMF0pID09IG1ham9yICYmIE51bWJlcih2ZXJzaW9uWzFdKSA+IG1pbm9yKVxuICApO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBxdWVyeVNlbGVjdG9yLCBxdWVyeVNlbGVjdG9yQWxsIH0gZnJvbSAnLi9sZXB1c1F1ZXJ5U2VsZWN0b3IuanMnO1xuaW1wb3J0IHsgaXNTZGtWZXJzaW9uR3QgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcblxuZnVuY3Rpb24gaW5pdEFwaUVudigpOiB2b2lkIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGx5bngucXVlcnlTZWxlY3RvciA9IHF1ZXJ5U2VsZWN0b3I7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBseW54LnF1ZXJ5U2VsZWN0b3JBbGwgPSBxdWVyeVNlbGVjdG9yQWxsO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGVcbiAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0ID0gbHlueC5zZXRUaW1lb3V0IGFzIChjYjogKCkgPT4gdm9pZCwgdGltZW91dDogbnVtYmVyKSA9PiBudW1iZXI7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBnbG9iYWxUaGlzLnNldEludGVydmFsID0gbHlueC5zZXRJbnRlcnZhbCBhcyAoY2I6ICgpID0+IHZvaWQsIHRpbWVvdXQ6IG51bWJlcikgPT4gbnVtYmVyO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGVcbiAgZ2xvYmFsVGhpcy5jbGVhclRpbWVvdXQgPSBseW54LmNsZWFyVGltZW91dCBhcyAodGltZW91dDogbnVtYmVyKSA9PiB2b2lkO1xuICAvLyBJbiBseW54IDIuMTQgYGNsZWFySW50ZXJ2YWxgIGlzIG1pc3Rha2VubHkgc3BlbGxlZCBhcyBgY2xlYXJUaW1lSW50ZXJ2YWxgLiBUaGlzIGlzIGZpeGVkIGluIGx5bnggMi4xNS5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGdsb2JhbFRoaXMuY2xlYXJJbnRlcnZhbCA9IChseW54LmNsZWFySW50ZXJ2YWwgPz8gbHlueC5jbGVhclRpbWVJbnRlcnZhbCkgYXMgKHRpbWVvdXQ6IG51bWJlcikgPT4gdm9pZDtcblxuICB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gICAgY29uc3QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gbHlueC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgYXMgKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiBudW1iZXI7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gICAgbHlueC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBnbG9iYWxUaGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IChcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB2b2lkLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFpc1Nka1ZlcnNpb25HdCgyLCAxNSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUgaW4gbWFpbiB0aHJlYWQgc2NyaXB0IHJlcXVpcmVzIEx5bnggc2RrIHZlcnNpb24gMi4xNicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGdsb2JhbFRoaXMuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBseW54LmNhbmNlbEFuaW1hdGlvbkZyYW1lIGFzIChyZXF1ZXN0SWQ6IG51bWJlcikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHsgaW5pdEFwaUVudiB9O1xuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5leHBvcnQgZnVuY3Rpb24gcHJvZmlsZTxSZXQsIEZuIGV4dGVuZHMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUmV0PihcbiAgc2xpY2VOYW1lOiBzdHJpbmcsXG4gIGY6IEZuLFxuKTogUmV0IHtcbiAgLyogdjggaWdub3JlIG5leHQgOSAqL1xuICAvLyBUT0RPOiBjaGFuZ2UgaXQgdG8gX19QUk9GSUxFX19cbiAgaWYgKF9fREVWX18pIHtcbiAgICBjb25zb2xlLnByb2ZpbGUoc2xpY2VOYW1lKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGYoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc29sZS5wcm9maWxlRW5kKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmKCk7XG4gIH1cbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJy4vYXBpL2VsZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrbGV0UmVmLCBXb3JrbGV0UmVmSWQsIFdvcmtsZXRSZWZJbXBsIH0gZnJvbSAnLi9iaW5kaW5ncy90eXBlcy5qcyc7XG5pbXBvcnQgeyBwcm9maWxlIH0gZnJvbSAnLi91dGlscy9wcm9maWxlLmpzJztcblxuaW50ZXJmYWNlIFJlZkltcGwge1xuICBfd29ya2xldFJlZk1hcDogUmVjb3JkPFdvcmtsZXRSZWZJZCwgV29ya2xldFJlZjx1bmtub3duPj47XG4gIF9maXJzdFNjcmVlbldvcmtsZXRSZWZNYXA6IFJlY29yZDxXb3JrbGV0UmVmSWQsIFdvcmtsZXRSZWY8dW5rbm93bj4+O1xuICB1cGRhdGVXb3JrbGV0UmVmKFxuICAgIHJlZkltcGw6IFdvcmtsZXRSZWZJbXBsPEVsZW1lbnQgfCBudWxsPixcbiAgICBlbGVtZW50OiBFbGVtZW50Tm9kZSB8IG51bGwsXG4gICk6IHZvaWQ7XG4gIHVwZGF0ZVdvcmtsZXRSZWZJbml0VmFsdWVDaGFuZ2VzKHBhdGNoOiBbbnVtYmVyLCB1bmtub3duXVtdKTogdm9pZDtcbiAgY2xlYXJGaXJzdFNjcmVlbldvcmtsZXRSZWZNYXAoKTogdm9pZDtcbn1cblxubGV0IGltcGw6IFJlZkltcGwgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGluaXRXb3JrbGV0UmVmKCk6IFJlZkltcGwge1xuICByZXR1cm4gKGltcGwgPSB7XG4gICAgX3dvcmtsZXRSZWZNYXA6IHt9LFxuICAgIC8qKlxuICAgICAqIE1hcCBvZiB3b3JrbGV0IHJlZnMgdGhhdCBhcmUgY3JlYXRlZCBkdXJpbmcgZmlyc3Qgc2NyZWVuIHJlbmRlcmluZy5cbiAgICAgKiBUaGVzZSByZWZzIGFyZSBjcmVhdGVkIHdpdGggbmVnYXRpdmUgSURzIGFuZCBuZWVkIHRvIGJlIGh5ZHJhdGVkXG4gICAgICogd2hlbiB0aGUgYXBwIHN0YXJ0cy4gVGhlIG1hcCBpcyBjbGVhcmVkIGFmdGVyIGh5ZHJhdGlvbiBpcyBjb21wbGV0ZVxuICAgICAqIHRvIGZyZWUgdXAgbWVtb3J5LlxuICAgICAqL1xuICAgIF9maXJzdFNjcmVlbldvcmtsZXRSZWZNYXA6IHt9LFxuICAgIHVwZGF0ZVdvcmtsZXRSZWYsXG4gICAgdXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMsXG4gICAgY2xlYXJGaXJzdFNjcmVlbldvcmtsZXRSZWZNYXAsXG4gIH0pO1xufVxuXG5jb25zdCBjcmVhdGVXb3JrbGV0UmVmID0gPFQ+KFxuICBpZDogV29ya2xldFJlZklkLFxuICB2YWx1ZTogVCxcbik6IFdvcmtsZXRSZWY8VD4gPT4ge1xuICByZXR1cm4ge1xuICAgIGN1cnJlbnQ6IHZhbHVlLFxuICAgIF93dmlkOiBpZCxcbiAgfTtcbn07XG5cbmNvbnN0IGdldEZyb21Xb3JrbGV0UmVmTWFwID0gPFQ+KFxuICByZWZJbXBsOiBXb3JrbGV0UmVmSW1wbDxUPixcbik6IFdvcmtsZXRSZWY8VD4gPT4ge1xuICBjb25zdCBpZCA9IHJlZkltcGwuX3d2aWQ7XG4gIGxldCB2YWx1ZTtcbiAgaWYgKGlkIDwgMCkge1xuICAgIC8vIEF0IHRoZSBmaXJzdCBzY3JlZW4gcmVuZGVyaW5nLCB0aGUgd29ya2xldCByZWYgaXMgY3JlYXRlZCB3aXRoIGEgbmVnYXRpdmUgSUQuXG4gICAgLy8gTWlnaHQgYmUgY2FsbGVkIGluIHR3byBzY2VuYXJpb3M6XG4gICAgLy8gMS4gSW4gTVRTIGV2ZW50c1xuICAgIC8vIDIuIEluIGBtYWluLXRocmVhZDpyZWZgXG4gICAgdmFsdWUgPSBpbXBsIS5fZmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwW2lkXSBhcyBXb3JrbGV0UmVmPFQ+O1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHZhbHVlID0gaW1wbCEuX2ZpcnN0U2NyZWVuV29ya2xldFJlZk1hcFtpZF0gPSBjcmVhdGVXb3JrbGV0UmVmKGlkLCByZWZJbXBsLl9pbml0VmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGltcGwhLl93b3JrbGV0UmVmTWFwW2lkXSBhcyBXb3JrbGV0UmVmPFQ+O1xuICB9XG5cbiAgLyogdjggaWdub3JlIG5leHQgMyAqL1xuICBpZiAoX19ERVZfXyAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdXb3JrbGV0OiByZWYgaXMgbm90IGluaXRpYWxpemVkOiAnICsgaWQpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbVdvcmtsZXRSZWZNYXAoaWQ6IFdvcmtsZXRSZWZJZCk6IHZvaWQge1xuICBkZWxldGUgaW1wbCEuX3dvcmtsZXRSZWZNYXBbaWRdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50IGluc3RhbmNlIG9mIHRoZSBnaXZlbiBlbGVtZW50IG5vZGUsIHRoZW4gc2V0IHRoZSB3b3JrbGV0IHZhbHVlIHRvIGl0LlxuICogVGhpcyBpcyBjYWxsZWQgaW4gYHNuYXBzaG90Q29udGV4dFVwZGF0ZVdvcmtsZXRSZWZgLlxuICogQHBhcmFtIGhhbmRsZSBoYW5kbGUgb2YgdGhlIHdvcmtsZXQgdmFsdWUuXG4gKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCBub2RlLlxuICovXG5mdW5jdGlvbiB1cGRhdGVXb3JrbGV0UmVmKFxuICBoYW5kbGU6IFdvcmtsZXRSZWZJbXBsPEVsZW1lbnQgfCBudWxsPixcbiAgZWxlbWVudDogRWxlbWVudE5vZGUgfCBudWxsLFxuKTogdm9pZCB7XG4gIGdldEZyb21Xb3JrbGV0UmVmTWFwKGhhbmRsZSkuY3VycmVudCA9IGVsZW1lbnRcbiAgICA/IG5ldyBFbGVtZW50KGVsZW1lbnQpXG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVXb3JrbGV0UmVmSW5pdFZhbHVlQ2hhbmdlcyhcbiAgcGF0Y2g6IFtXb3JrbGV0UmVmSWQsIHVua25vd25dW10sXG4pOiB2b2lkIHtcbiAgcHJvZmlsZSgndXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMnLCAoKSA9PiB7XG4gICAgcGF0Y2guZm9yRWFjaCgoW2lkLCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICghaW1wbCEuX3dvcmtsZXRSZWZNYXBbaWRdKSB7XG4gICAgICAgIGltcGwhLl93b3JrbGV0UmVmTWFwW2lkXSA9IGNyZWF0ZVdvcmtsZXRSZWYoaWQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyRmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwKCk6IHZvaWQge1xuICBpbXBsIS5fZmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwID0ge307XG59XG5cbmV4cG9ydCB7XG4gIHR5cGUgUmVmSW1wbCxcbiAgY3JlYXRlV29ya2xldFJlZixcbiAgaW5pdFdvcmtsZXRSZWYsXG4gIGdldEZyb21Xb3JrbGV0UmVmTWFwLFxuICByZW1vdmVWYWx1ZUZyb21Xb3JrbGV0UmVmTWFwLFxuICB1cGRhdGVXb3JrbGV0UmVmSW5pdFZhbHVlQ2hhbmdlcyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IFdvcmtsZXRFdmVudHMgfSBmcm9tICcuL2JpbmRpbmdzL2V2ZW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlbGVhc2VXb3JrbGV0UmVmRGF0YSwgUnVuV29ya2xldEN0eERhdGEsIFJ1bldvcmtsZXRDdHhSZXREYXRhIH0gZnJvbSAnLi9iaW5kaW5ncy9ldmVudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDbG9zdXJlVmFsdWVUeXBlIH0gZnJvbSAnLi9iaW5kaW5ncy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSAnLi90eXBlcy9ydW50aW1lUHJveHkuanMnO1xuaW1wb3J0IHsgcmVtb3ZlVmFsdWVGcm9tV29ya2xldFJlZk1hcCB9IGZyb20gJy4vd29ya2xldFJlZi5qcyc7XG5cbmZ1bmN0aW9uIGluaXRFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgY29uc3QganNDb250ZXh0ID0gbHlueC5nZXRKU0NvbnRleHQoKTtcbiAganNDb250ZXh0LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgV29ya2xldEV2ZW50cy5ydW5Xb3JrbGV0Q3R4LFxuICAgIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEgYXMgc3RyaW5nKSBhcyBSdW5Xb3JrbGV0Q3R4RGF0YTtcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gcnVuV29ya2xldChkYXRhLndvcmtsZXQsIGRhdGEucGFyYW1zIGFzIENsb3N1cmVWYWx1ZVR5cGVbXSk7XG4gICAgICBqc0NvbnRleHQuZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHR5cGU6IFdvcmtsZXRFdmVudHMuRnVuY3Rpb25DYWxsUmV0LFxuICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgcmVzb2x2ZUlkOiBkYXRhLnJlc29sdmVJZCxcbiAgICAgICAgICByZXR1cm5WYWx1ZSxcbiAgICAgICAgfSBhcyBSdW5Xb3JrbGV0Q3R4UmV0RGF0YSksXG4gICAgICB9KTtcbiAgICB9LFxuICApO1xuICBqc0NvbnRleHQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICBXb3JrbGV0RXZlbnRzLnJlbGVhc2VXb3JrbGV0UmVmLFxuICAgIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIHJlbW92ZVZhbHVlRnJvbVdvcmtsZXRSZWZNYXAoKGV2ZW50LmRhdGEgYXMgUmVsZWFzZVdvcmtsZXRSZWZEYXRhKS5pZCk7XG4gICAgfSxcbiAgKTtcbn1cblxuZXhwb3J0IHsgaW5pdEV2ZW50TGlzdGVuZXJzIH07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB0eXBlIHsgSnNGbkhhbmRsZSB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuXG5pbnRlcmZhY2UgRGV0YWlscyB7XG4gIHRhc2s6IChmbklkOiBudW1iZXIsIGV4ZWNJZDogbnVtYmVyKSA9PiB2b2lkO1xuXG4gIC8vIFRoaXMgY29tZXMgZnJvbSB0aGUgYmFja2dyb3VuZCB0aHJlYWQsIGluc2VydGVkIGhlcmUgZHVyaW5nIGN0eCBoeWRyYXRpb24uXG4gIGpzRm5IYW5kbGU/OiBKc0ZuSGFuZGxlO1xufVxuXG5pbnRlcmZhY2UgUnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsIHtcbiAgLy8gRWxlbWVudHMgc2hvdWxkIGtlZXAgdGhlIG9yZGVyIGJlaW5nIGNhbGxlZCBieSB0aGUgdXNlci5cbiAgZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5OiBEZXRhaWxzW107XG4gIGRlbGF5UnVuT25CYWNrZ3JvdW5kKGZuT2JqOiBKc0ZuSGFuZGxlLCBmbjogKGZuSWQ6IG51bWJlciwgZXhlY0lkOiBudW1iZXIpID0+IHZvaWQpOiB2b2lkO1xuICBydW5EZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9ucygpOiB2b2lkO1xufVxuXG5sZXQgaW1wbDogUnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpbml0UnVuT25CYWNrZ3JvdW5kRGVsYXkoKTogUnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsIHtcbiAgcmV0dXJuIChpbXBsID0ge1xuICAgIGRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheTogW10sXG4gICAgZGVsYXlSdW5PbkJhY2tncm91bmQsXG4gICAgcnVuRGVsYXllZEJhY2tncm91bmRGdW5jdGlvbnMsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWxheVJ1bk9uQmFja2dyb3VuZChmbk9iajogSnNGbkhhbmRsZSwgdGFzazogKGZuSWQ6IG51bWJlciwgZXhlY0lkOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgaW1wbCEuZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5LnB1c2goeyB0YXNrIH0pO1xuICBjb25zdCBkZWxheUluZGljZXMgPSBmbk9iai5fZGVsYXlJbmRpY2VzID8/PSBbXTtcbiAgZGVsYXlJbmRpY2VzLnB1c2goaW1wbCEuZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5Lmxlbmd0aCAtIDEpO1xufVxuXG5mdW5jdGlvbiBydW5EZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9ucygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBkZXRhaWxzIG9mIGltcGwhLmRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheSkge1xuICAgIGlmIChkZXRhaWxzLmpzRm5IYW5kbGUpIHtcbiAgICAgIGRldGFpbHMudGFzayhkZXRhaWxzLmpzRm5IYW5kbGUuX2pzRm5JZCEsIGRldGFpbHMuanNGbkhhbmRsZS5fZXhlY0lkISk7XG4gICAgfVxuICB9XG4gIGltcGwhLmRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheS5sZW5ndGggPSAwO1xufVxuXG5leHBvcnQgeyB0eXBlIFJ1bk9uQmFja2dyb3VuZERlbGF5SW1wbCwgaW5pdFJ1bk9uQmFja2dyb3VuZERlbGF5IH07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgV29ya2xldCB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5cbmludGVyZmFjZSBFdmVudERlbGF5SW1wbCB7XG4gIF9kZWxheWVkV29ya2xldFBhcmFtc01hcDogTWFwPHN0cmluZywgQ2xvc3VyZVZhbHVlVHlwZVtdW10+O1xuICBydW5EZWxheWVkV29ya2xldCh3b3JrbGV0OiBXb3JrbGV0LCBlbGVtZW50OiBFbGVtZW50Tm9kZSk6IHZvaWQ7XG4gIGNsZWFyRGVsYXllZFdvcmtsZXRzKCk6IHZvaWQ7XG59XG5cbmxldCBpbXBsOiBFdmVudERlbGF5SW1wbCB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaW5pdEV2ZW50RGVsYXkoKTogRXZlbnREZWxheUltcGwge1xuICByZXR1cm4gKGltcGwgPSB7XG4gICAgX2RlbGF5ZWRXb3JrbGV0UGFyYW1zTWFwOiBuZXcgTWFwKCksXG4gICAgcnVuRGVsYXllZFdvcmtsZXQsXG4gICAgY2xlYXJEZWxheWVkV29ya2xldHMsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWxheUV4ZWNVbnRpbEpzUmVhZHkoXG4gIGhhc2g6IHN0cmluZyxcbiAgcGFyYW1zOiBDbG9zdXJlVmFsdWVUeXBlW10sXG4pOiB2b2lkIHtcbiAgcHJvZmlsZSgnZGVsYXlFeGVjVW50aWxKc1JlYWR5OiAnICsgaGFzaCwgKCkgPT4ge1xuICAgIGNvbnN0IG1hcCA9IGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcDtcbiAgICBjb25zdCBwYXJhbVZlYyA9IG1hcC5nZXQoaGFzaCk7XG4gICAgaWYgKHBhcmFtVmVjKSB7XG4gICAgICBwYXJhbVZlYy5wdXNoKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcC5zZXQoaGFzaCwgW3BhcmFtc10pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRlbGF5ZWRXb3JrbGV0KHdvcmtsZXQ6IFdvcmtsZXQsIGVsZW1lbnQ6IEVsZW1lbnROb2RlKTogdm9pZCB7XG4gIHByb2ZpbGUoJ2NvbW1pdERlbGF5ZWRXb3JrbGV0JywgKCkgPT4ge1xuICAgIGNvbnN0IHBhcmFtc1ZlYyA9IGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcC5nZXQoXG4gICAgICB3b3JrbGV0Ll93a2x0SWQsXG4gICAgKTtcbiAgICBpZiAocGFyYW1zVmVjID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGVmdFBhcmFtc1ZlYzogQ2xvc3VyZVZhbHVlVHlwZVtdW10gPSBbXTtcbiAgICBwYXJhbXNWZWMuZm9yRWFjaCgocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFBhcmFtID0gcGFyYW1zWzBdIGFzIHsgY3VycmVudFRhcmdldD86IHsgZWxlbWVudFJlZnB0cj86IEVsZW1lbnROb2RlIH0gfSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChmaXJzdFBhcmFtPy5jdXJyZW50VGFyZ2V0Py5lbGVtZW50UmVmcHRyID09PSBlbGVtZW50KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHByb2ZpbGUoJ3J1bkRlbGF5ZWRXb3JrbGV0JywgKCkgPT4ge1xuICAgICAgICAgICAgcnVuV29ya2xldCh3b3JrbGV0LCBwYXJhbXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlZnRQYXJhbXNWZWMucHVzaChwYXJhbXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcC5zZXQoXG4gICAgICB3b3JrbGV0Ll93a2x0SWQsXG4gICAgICBsZWZ0UGFyYW1zVmVjLFxuICAgICk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhckRlbGF5ZWRXb3JrbGV0cygpOiB2b2lkIHtcbiAgaW1wbCEuX2RlbGF5ZWRXb3JrbGV0UGFyYW1zTWFwLmNsZWFyKCk7XG59XG5cbmV4cG9ydCB7IHR5cGUgRXZlbnREZWxheUltcGwsIGluaXRFdmVudERlbGF5LCBkZWxheUV4ZWNVbnRpbEpzUmVhZHksIHJ1bkRlbGF5ZWRXb3JrbGV0LCBjbGVhckRlbGF5ZWRXb3JrbGV0cyB9O1xuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5cbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgSnNGbkhhbmRsZSwgV29ya2xldCwgV29ya2xldFJlZklkLCBXb3JrbGV0UmVmSW1wbCB9IGZyb20gJy4vYmluZGluZ3MvaW5kZXguanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5cbi8qKlxuICogSHlkcmF0ZXMgYSBXb3JrbGV0IGNvbnRleHQgd2l0aCBkYXRhIGZyb20gYSBmaXJzdC1zY3JlZW4gV29ya2xldCBjb250ZXh0LlxuICogVGhpcyBwcm9jZXNzIGlzIHR5cGljYWxseSB1c2VkIHRvIHJ1biBhbGwgZGVsYXllZCBgcnVuT25CYWNrZ3JvdW5kYCBmdW5jdGlvbnNcbiAqIGFuZCBpbml0aWFsaXplIGBXb3JrbGV0UmVmYCB2YWx1ZXMgbW9kaWZpZWQgYmVmb3JlIGh5ZHJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gY3R4IFRoZSB0YXJnZXQgV29ya2xldCBjb250ZXh0IHRvIGJlIGh5ZHJhdGVkLlxuICogQHBhcmFtIGZpcnN0U2NyZWVuQ3R4IFRoZSBXb3JrbGV0IGNvbnRleHQgZnJvbSB0aGUgZmlyc3Qgc2NyZWVuIHJlbmRlcmluZyxcbiAqICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBkYXRhIHRvIGh5ZHJhdGUgd2l0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVDdHgoY3R4OiBXb3JrbGV0LCBmaXJzdFNjcmVlbkN0eDogV29ya2xldCk6IHZvaWQge1xuICBwcm9maWxlKCdoeWRyYXRlQ3R4JywgKCkgPT4ge1xuICAgIGh5ZHJhdGVDdHhJbXBsKGN0eCwgZmlyc3RTY3JlZW5DdHgsIGN0eC5fZXhlY0lkISk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlQ3R4SW1wbChjdHg6IENsb3N1cmVWYWx1ZVR5cGUsIGZpcnN0U2NyZWVuQ3R4OiBDbG9zdXJlVmFsdWVUeXBlLCBleGVjSWQ6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIWN0eCB8fCB0eXBlb2YgY3R4ICE9PSAnb2JqZWN0JyB8fCAhZmlyc3RTY3JlZW5DdHggfHwgdHlwZW9mIGZpcnN0U2NyZWVuQ3R4ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IGN0eE9iaiA9IGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcbiAgY29uc3QgZmlyc3RTY3JlZW5DdHhPYmogPSBmaXJzdFNjcmVlbkN0eCBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcblxuICBpZiAoY3R4T2JqWydfd2tsdElkJ10gJiYgY3R4T2JqWydfd2tsdElkJ10gIT09IGZpcnN0U2NyZWVuQ3R4T2JqWydfd2tsdElkJ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZvci1pbi1hcnJheVxuICBmb3IgKGNvbnN0IGtleSBpbiBjdHgpIHtcbiAgICBpZiAoa2V5ID09PSAnX3d2aWQnKSB7XG4gICAgICBoeWRyYXRlTWFpblRocmVhZFJlZihjdHhPYmpba2V5XSBhcyBXb3JrbGV0UmVmSWQsIGZpcnN0U2NyZWVuQ3R4T2JqIGFzIHVua25vd24gYXMgV29ya2xldFJlZkltcGw8dW5rbm93bj4pO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnX2pzRm4nKSB7XG4gICAgICBoeWRyYXRlRGVsYXlSdW5PbkJhY2tncm91bmRUYXNrcyhcbiAgICAgICAgY3R4T2JqW2tleV0gYXMgUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sXG4gICAgICAgIGZpcnN0U2NyZWVuQ3R4T2JqW2tleV0gYXMgUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sXG4gICAgICAgIGV4ZWNJZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpcnN0U2NyZWVuVmFsdWUgPSB0eXBlb2YgZmlyc3RTY3JlZW5DdHhPYmpba2V5XSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IChmaXJzdFNjcmVlbkN0eE9ialtrZXldIGFzIHsgY3R4OiBDbG9zdXJlVmFsdWVUeXBlIH0pLmN0eFxuICAgICAgICA6IGZpcnN0U2NyZWVuQ3R4T2JqW2tleV07XG4gICAgICBoeWRyYXRlQ3R4SW1wbChjdHhPYmpba2V5XSwgZmlyc3RTY3JlZW5WYWx1ZSwgZXhlY0lkKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBIeWRyYXRlcyBhIFdvcmtsZXRSZWYgb24gdGhlIG1haW4gdGhyZWFkLlxuICogVGhpcyBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgV29ya2xldFJlZidzIGJhY2tncm91bmQgaW5pdGlhbCB2YWx1ZSBiYXNlZCBvbiBjaGFuZ2VzXG4gKiB0aGF0IG9jY3VycmVkIGluIHRoZSBmaXJzdC1zY3JlZW4gV29ya2xldCBjb250ZXh0IGJlZm9yZSBoeWRyYXRpb24uXG4gKlxuICogQHBhcmFtIHJlZklkIFRoZSBJRCBvZiB0aGUgV29ya2xldFJlZiB0byBoeWRyYXRlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBXb3JrbGV0UmVmLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlTWFpblRocmVhZFJlZihyZWZJZDogV29ya2xldFJlZklkLCB2YWx1ZTogV29ya2xldFJlZkltcGw8dW5rbm93bj4gfCB7IGN1cnJlbnQ6IHVua25vd24gfSkge1xuICBpZiAoJ19pbml0VmFsdWUnIGluIHZhbHVlKSB7XG4gICAgLy8gVGhlIHJlZiBoYXMgbm90IGJlZW4gYWNjZXNzZWQgeWV0LlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWYgPSBseW54V29ya2xldEltcGwhLl9yZWZJbXBsLl93b3JrbGV0UmVmTWFwW3JlZklkXSE7XG4gIHJlZi5jdXJyZW50ID0gdmFsdWUuY3VycmVudDtcbn1cblxuLyoqXG4gKiBIeWRyYXRlcyBkZWxheWVkIGBydW5PbkJhY2tncm91bmRgIHRhc2tzLlxuICogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgYW55IGBydW5PbkJhY2tncm91bmRgIGNhbGxzIHRoYXQgd2VyZSBkZWxheWVkXG4gKiBkdXJpbmcgdGhlIGZpcnN0LXNjcmVlbiByZW5kZXJpbmcgYXJlIGNvcnJlY3RseSBhc3NvY2lhdGVkIHdpdGggdGhlaXJcbiAqIHJlc3BlY3RpdmUgSmF2YVNjcmlwdCBmdW5jdGlvbiBoYW5kbGVzIGluIHRoZSBoeWRyYXRlZCBXb3JrbGV0IGNvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVEZWxheVJ1bk9uQmFja2dyb3VuZFRhc2tzKFxuICBmbk9ianM6IFJlY29yZDxzdHJpbmcsIEpzRm5IYW5kbGU+LCAvLyBleGFtcGxlOiB7XCJfanNGbjFcIjp7XCJfanNGbklkXCI6MX19XG4gIGZpcnN0U2NyZWVuRm5PYmpzOiBSZWNvcmQ8c3RyaW5nLCBKc0ZuSGFuZGxlPiwgLy8gZXhhbXBsZToge1wiX2pzRm4xXCI6e1wiX2lzRmlyc3RTY3JlZW5cIjp0cnVlLFwiX2RlbGF5SW5kaWNlc1wiOlswXX19XG4gIGV4ZWNJZDogbnVtYmVyLFxuKSB7XG4gIGZvciAoY29uc3QgZm5OYW1lIGluIGZuT2Jqcykge1xuICAgIGNvbnN0IGZuT2JqID0gZm5PYmpzW2ZuTmFtZV0hO1xuICAgIGNvbnN0IGZpcnN0U2NyZWVuRm5PYmo6IEpzRm5IYW5kbGUgfCB1bmRlZmluZWQgPSBmaXJzdFNjcmVlbkZuT2Jqc1tmbk5hbWVdO1xuICAgIGlmICghZmlyc3RTY3JlZW5Gbk9iaj8uX2RlbGF5SW5kaWNlcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgZmlyc3RTY3JlZW5Gbk9iai5fZGVsYXlJbmRpY2VzKSB7XG4gICAgICBjb25zdCBkZXRhaWxzID0gbHlueFdvcmtsZXRJbXBsIS5fcnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsLmRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheVtpbmRleF0hO1xuICAgICAgZm5PYmouX2V4ZWNJZCA9IGV4ZWNJZDtcbiAgICAgIGRldGFpbHMuanNGbkhhbmRsZSA9IGZuT2JqO1xuICAgIH1cbiAgfVxufVxuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBXb3JrbGV0RXZlbnRzIH0gZnJvbSAnLi9iaW5kaW5ncy9ldmVudHMuanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5pbXBvcnQgeyBpc1Nka1ZlcnNpb25HdCB9IGZyb20gJy4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbi8qKlxuICogYEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyYCBtb25pdG9ycyByZWZlcmVuY2VzIHRvIEpTIGZ1bmN0aW9uIGhhbmRsZXMgdG8gYmUgY2FsbGVkIGJ5IGBydW5PbkJhY2tncm91bmQoKWAuXG4gKiBJbiBKUyBjb250ZXh0LCBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIGJ5IGBydW5PbkJhY2tncm91bmQoKWAgaXMgcmVmZXJlbmNlZCBieSBgSnNGbkhhbmRsZWBzIGFuZCBmaW5hbGx5IGJ5IGBleGVjSWRgLlxuICogV2hlbiBhbGwgYEpzRm5IYW5kbGVgcyBpbiBsZXB1cyBhcmUgcmVsZWFzZWQsIGFuIGV2ZW50IHdpbGwgYmUgc2VudCB0byBKUyBjb250ZXh0IHRvIGRlLXJlZiB0aGUgYGV4ZWNJZGAsXG4gKiByZXN1bHRpbmcgYSBkZS1yZWYgdG8gdGhlIGpzIGZ1bmN0aW9uIGluIEpTIGNvbnRleHQuXG4gKi9cbmNsYXNzIEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBleGVjSWRSZWZDb3VudCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gIHByaXZhdGUgZXhlY0lkU2V0VG9GaXJlID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIHByaXZhdGUgd2lsbEZpcmUgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWdpc3RyeT86IEZpbmFsaXphdGlvblJlZ2lzdHJ5PG51bWJlcj4gPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZWdpc3RyeSA9IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeTxudW1iZXI+KHRoaXMucmVtb3ZlUmVmLmJpbmQodGhpcykpO1xuICB9XG5cbiAgYWRkUmVmKGV4ZWNJZDogbnVtYmVyLCBvYmpUb1JlZjogb2JqZWN0KTogdm9pZCB7XG4gICAgdGhpcy5leGVjSWRSZWZDb3VudC5zZXQoXG4gICAgICBleGVjSWQsXG4gICAgICAodGhpcy5leGVjSWRSZWZDb3VudC5nZXQoZXhlY0lkKSA/PyAwKSArIDEsXG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdHJ5IS5yZWdpc3RlcihvYmpUb1JlZiwgZXhlY0lkKTtcbiAgfVxuXG4gIHJlbW92ZVJlZihleGVjSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJjID0gdGhpcy5leGVjSWRSZWZDb3VudC5nZXQoZXhlY0lkKSE7XG4gICAgaWYgKHJjID4gMSkge1xuICAgICAgdGhpcy5leGVjSWRSZWZDb3VudC5zZXQoZXhlY0lkLCByYyAtIDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmV4ZWNJZFJlZkNvdW50LmRlbGV0ZShleGVjSWQpO1xuICAgIHRoaXMuZXhlY0lkU2V0VG9GaXJlLmFkZChleGVjSWQpO1xuICAgIGlmICghdGhpcy53aWxsRmlyZSkge1xuICAgICAgdGhpcy53aWxsRmlyZSA9IHRydWU7XG4gICAgICB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmZpcmUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZpcmUoKTogdm9pZCB7XG4gICAgcHJvZmlsZSgnSnNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXIuZmlyZScsICgpID0+IHtcbiAgICAgIGx5bnguZ2V0SlNDb250ZXh0KCkuZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHR5cGU6IFdvcmtsZXRFdmVudHMucmVsZWFzZUJhY2tncm91bmRXb3JrbGV0Q3R4LFxuICAgICAgICBkYXRhOiBBcnJheS5mcm9tKHRoaXMuZXhlY0lkU2V0VG9GaXJlKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGVjSWRTZXRUb0ZpcmUuY2xlYXIoKTtcbiAgICAgIHRoaXMud2lsbEZpcmUgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1J1bk9uQmFja2dyb3VuZEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Nka1ZlcnNpb25HdCgyLCAxNSk7XG59XG5cbmV4cG9ydCB7IEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyLCBpc1J1bk9uQmFja2dyb3VuZEVuYWJsZWQgfTtcbiIsICIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJy4vYXBpL2VsZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBDbG9zdXJlVmFsdWVUeXBlLCBXb3JrbGV0LCBXb3JrbGV0UmVmSW1wbCB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuaW1wb3J0IHsgaW5pdFJ1bk9uQmFja2dyb3VuZERlbGF5IH0gZnJvbSAnLi9kZWxheVJ1bk9uQmFja2dyb3VuZC5qcyc7XG5pbXBvcnQgeyBkZWxheUV4ZWNVbnRpbEpzUmVhZHksIGluaXRFdmVudERlbGF5IH0gZnJvbSAnLi9kZWxheVdvcmtsZXRFdmVudC5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlQ3R4IH0gZnJvbSAnLi9oeWRyYXRlLmpzJztcbmltcG9ydCB7IEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyLCBpc1J1bk9uQmFja2dyb3VuZEVuYWJsZWQgfSBmcm9tICcuL2pzRnVuY3Rpb25MaWZlY3ljbGUuanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5pbXBvcnQgeyBnZXRGcm9tV29ya2xldFJlZk1hcCwgaW5pdFdvcmtsZXRSZWYgfSBmcm9tICcuL3dvcmtsZXRSZWYuanMnO1xuXG5mdW5jdGlvbiBpbml0V29ya2xldCgpOiB2b2lkIHtcbiAgZ2xvYmFsVGhpcy5seW54V29ya2xldEltcGwgPSB7XG4gICAgX3dvcmtsZXRNYXA6IHt9LFxuICAgIF9yZWZJbXBsOiBpbml0V29ya2xldFJlZigpLFxuICAgIF9ydW5PbkJhY2tncm91bmREZWxheUltcGw6IGluaXRSdW5PbkJhY2tncm91bmREZWxheSgpLFxuICAgIF9oeWRyYXRlQ3R4OiBoeWRyYXRlQ3R4LFxuICAgIF9ldmVudERlbGF5SW1wbDogaW5pdEV2ZW50RGVsYXkoKSxcbiAgfTtcblxuICBpZiAoaXNSdW5PbkJhY2tncm91bmRFbmFibGVkKCkpIHtcbiAgICBnbG9iYWxUaGlzLmx5bnhXb3JrbGV0SW1wbC5fanNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXIgPSBuZXcgSnNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXIoKTtcbiAgfVxuXG4gIGdsb2JhbFRoaXMucmVnaXN0ZXJXb3JrbGV0ID0gcmVnaXN0ZXJXb3JrbGV0O1xuICBnbG9iYWxUaGlzLnJlZ2lzdGVyV29ya2xldEludGVybmFsID0gcmVnaXN0ZXJXb3JrbGV0O1xuICBnbG9iYWxUaGlzLnJ1bldvcmtsZXQgPSBydW5Xb3JrbGV0O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgd29ya2xldCBmdW5jdGlvbiwgYWxsb3dpbmcgaXQgdG8gYmUgZXhlY3V0ZWQgYnkgYHJ1bldvcmtsZXQoKWAuXG4gKiBUaGlzIGlzIGNhbGxlZCBpbiBsZXB1cy5qcy5cbiAqIEBwYXJhbSBfdHlwZSB3b3JrbGV0IHR5cGUsICdtYWluLXRocmVhZCcgb3IgJ3VpJ1xuICogQHBhcmFtIGlkIHdvcmtsZXQgaGFzaFxuICogQHBhcmFtIHdvcmtsZXQgd29ya2xldCBmdW5jdGlvblxuICovXG5mdW5jdGlvbiByZWdpc3RlcldvcmtsZXQoX3R5cGU6IHN0cmluZywgaWQ6IHN0cmluZywgd29ya2xldDogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bik6IHZvaWQge1xuICBseW54V29ya2xldEltcGwuX3dvcmtsZXRNYXBbaWRdID0gd29ya2xldDtcbn1cblxuLyoqXG4gKiBFbnRyYW5jZSBvZiBhbGwgd29ya2xldCBjYWxscy5cbiAqIE5hdGl2ZSBldmVudCB0b3VjaCBoYW5kbGVyIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uLlxuICogQHBhcmFtIGN0eCB3b3JrbGV0IG9iamVjdC5cbiAqIEBwYXJhbSBwYXJhbXMgd29ya2xldCBwYXJhbXMuXG4gKi9cbmZ1bmN0aW9uIHJ1bldvcmtsZXQoY3R4OiBXb3JrbGV0LCBwYXJhbXM6IENsb3N1cmVWYWx1ZVR5cGVbXSk6IHVua25vd24ge1xuICBpZiAoIXZhbGlkYXRlV29ya2xldChjdHgpKSB7XG4gICAgY29uc29sZS53YXJuKCdXb3JrbGV0OiBJbnZhbGlkIHdvcmtsZXQgb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkoY3R4KSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICgnX2xlcHVzV29ya2xldEhhc2gnIGluIGN0eCkge1xuICAgIGRlbGF5RXhlY1VudGlsSnNSZWFkeShjdHguX2xlcHVzV29ya2xldEhhc2gsIHBhcmFtcyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiBydW5Xb3JrbGV0SW1wbChjdHgsIHBhcmFtcyk7XG59XG5cbmZ1bmN0aW9uIHJ1bldvcmtsZXRJbXBsKGN0eDogV29ya2xldCwgcGFyYW1zOiBDbG9zdXJlVmFsdWVUeXBlW10pOiB1bmtub3duIHtcbiAgY29uc3Qgd29ya2xldDogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93biA9IHByb2ZpbGUoXG4gICAgJ3RyYW5zZm9ybVdvcmtsZXRDdHggJyArIGN0eC5fd2tsdElkLFxuICAgICgpID0+IHRyYW5zZm9ybVdvcmtsZXQoY3R4LCB0cnVlKSxcbiAgKTtcbiAgY29uc3QgcGFyYW1zXzogQ2xvc3VyZVZhbHVlVHlwZVtdID0gcHJvZmlsZShcbiAgICAndHJhbnNmb3JtV29ya2xldFBhcmFtcycsXG4gICAgKCkgPT4gdHJhbnNmb3JtV29ya2xldChwYXJhbXMgfHwgW10sIGZhbHNlKSxcbiAgKTtcbiAgcmV0dXJuIHByb2ZpbGUoJ3J1bldvcmtsZXQnLCAoKSA9PiB3b3JrbGV0KC4uLnBhcmFtc18pKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVXb3JrbGV0KGN0eDogdW5rbm93bik6IGN0eCBpcyBXb3JrbGV0IHtcbiAgcmV0dXJuIHR5cGVvZiBjdHggPT09ICdvYmplY3QnICYmIGN0eCAhPT0gbnVsbCAmJiAoJ193a2x0SWQnIGluIGN0eCB8fCAnX2xlcHVzV29ya2xldEhhc2gnIGluIGN0eCk7XG59XG5cbmNvbnN0IHdvcmtsZXRDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgQ2xvc3VyZVZhbHVlVHlwZSB8ICgoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKT4oKTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtV29ya2xldChjdHg6IFdvcmtsZXQsIGlzV29ya2xldDogdHJ1ZSk6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG5mdW5jdGlvbiB0cmFuc2Zvcm1Xb3JrbGV0KFxuICBjdHg6IENsb3N1cmVWYWx1ZVR5cGVbXSxcbiAgaXNXb3JrbGV0OiBmYWxzZSxcbik6IENsb3N1cmVWYWx1ZVR5cGVbXTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtV29ya2xldChcbiAgY3R4OiBDbG9zdXJlVmFsdWVUeXBlLFxuICBpc1dvcmtsZXQ6IGJvb2xlYW4sXG4pOiBDbG9zdXJlVmFsdWVUeXBlIHwgKCguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pIHtcbiAgLyogdjggaWdub3JlIG5leHQgMyAqL1xuICBpZiAodHlwZW9mIGN0eCAhPT0gJ29iamVjdCcgfHwgY3R4ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGN0eDtcbiAgfVxuXG4gIGlmIChpc1dvcmtsZXQpIHtcbiAgICBjb25zdCByZXMgPSB3b3JrbGV0Q2FjaGUuZ2V0KGN0eCk7XG4gICAgaWYgKHJlcykge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gIH1cblxuICBjb25zdCB3b3JrbGV0ID0geyBtYWluOiBjdHggfTtcbiAgdHJhbnNmb3JtV29ya2xldElubmVyKHdvcmtsZXQsIDAsIGN0eCk7XG5cbiAgaWYgKGlzV29ya2xldCkge1xuICAgIHdvcmtsZXRDYWNoZS5zZXQoY3R4LCB3b3JrbGV0Lm1haW4pO1xuICB9XG4gIHJldHVybiB3b3JrbGV0Lm1haW47XG59XG5cbmNvbnN0IHRyYW5zZm9ybVdvcmtsZXRJbm5lciA9IChcbiAgdmFsdWU6IENsb3N1cmVWYWx1ZVR5cGUsXG4gIGRlcHRoOiBudW1iZXIsXG4gIGN0eDogdW5rbm93bixcbikgPT4ge1xuICBjb25zdCBsaW1pdCA9IDEwMDA7XG4gIGlmICgrK2RlcHRoID49IGxpbWl0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEZXB0aCBvZiB2YWx1ZSBleGNlZWRzIGxpbWl0IG9mICcgKyBsaW1pdCArICcuJyk7XG4gIH1cbiAgLyogdjggaWdub3JlIG5leHQgMyAqL1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBjb25zdCBzdWJPYmo6IENsb3N1cmVWYWx1ZVR5cGUgPSBvYmpba2V5XTtcbiAgICBpZiAodHlwZW9mIHN1Yk9iaiAhPT0gJ29iamVjdCcgfHwgc3ViT2JqID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0V2ZW50VGFyZ2V0ID0gJ2VsZW1lbnRSZWZwdHInIGluIHN1Yk9iajtcbiAgICBpZiAoIWlzRXZlbnRUYXJnZXQpIHtcbiAgICAgIHRyYW5zZm9ybVdvcmtsZXRJbm5lcihzdWJPYmosIGRlcHRoLCBjdHgpO1xuICAgIH1cblxuICAgIGlmIChpc0V2ZW50VGFyZ2V0KSB7XG4gICAgICBvYmpba2V5XSA9IG5ldyBFbGVtZW50KHN1Yk9ialsnZWxlbWVudFJlZnB0ciddIGFzIEVsZW1lbnROb2RlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBpc1dvcmtsZXRSZWYgPSAnX3d2aWQnIGluIChzdWJPYmogYXMgb2JqZWN0KTtcbiAgICBpZiAoaXNXb3JrbGV0UmVmKSB7XG4gICAgICBvYmpba2V5XSA9IGdldEZyb21Xb3JrbGV0UmVmTWFwKFxuICAgICAgICBzdWJPYmogYXMgdW5rbm93biBhcyBXb3JrbGV0UmVmSW1wbDx1bmtub3duPixcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaXNXb3JrbGV0ID0gJ193a2x0SWQnIGluIHN1Yk9iajtcbiAgICBpZiAoaXNXb3JrbGV0KSB7XG4gICAgICAvLyBgc3ViT2JqYCBpcyB3b3JrbGV0IGN0eC4gU2hhbGxvdyBjb3B5IGl0IHRvIHByZXZlbnQgdGhlIHRyYW5zZm9ybWVkIHdvcmtsZXQgZnJvbSByZWZlcmVuY2luZyBjdHguXG4gICAgICAvLyBUaGlzIHdvdWxkIHJlc3VsdCBpbiB0aGUgdmFsdWUgb2YgYHdvcmtsZXRDYWNoZWAgcmVmZXJlbmNpbmcgaXRzIGtleS5cbiAgICAgIG9ialtrZXldID0gbHlueFdvcmtsZXRJbXBsLl93b3JrbGV0TWFwWyhzdWJPYmogYXMgV29ya2xldCkuX3drbHRJZF0hXG4gICAgICAgIC5iaW5kKHsgLi4uc3ViT2JqIH0pO1xuICAgICAgb2JqW2tleV0uY3R4ID0gc3ViT2JqO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGlzSnNGbiA9ICdfanNGbklkJyBpbiBzdWJPYmo7XG4gICAgaWYgKGlzSnNGbikge1xuICAgICAgc3ViT2JqWydfZXhlY0lkJ10gPSAoY3R4IGFzIFdvcmtsZXQpLl9leGVjSWQ7XG4gICAgICBseW54V29ya2xldEltcGwuX2pzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyPy5hZGRSZWYoXG4gICAgICAgIChjdHggYXMgV29ya2xldCkuX2V4ZWNJZCEsXG4gICAgICAgIHN1Yk9iaixcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCB7IGluaXRXb3JrbGV0IH07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IGluaXRBcGlFbnYgfSBmcm9tICcuL2FwaS9seW54QXBpLmpzJztcbmltcG9ydCB7IGluaXRFdmVudExpc3RlbmVycyB9IGZyb20gJy4vbGlzdGVuZXJzLmpzJztcbmltcG9ydCB7IGluaXRXb3JrbGV0IH0gZnJvbSAnLi93b3JrbGV0UnVudGltZS5qcyc7XG5cbmlmIChnbG9iYWxUaGlzLmx5bnhXb3JrbGV0SW1wbCA9PT0gdW5kZWZpbmVkKSB7XG4gIGluaXRXb3JrbGV0KCk7XG4gIGluaXRBcGlFbnYoKTtcbiAgaW5pdEV2ZW50TGlzdGVuZXJzKCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBR08sTUFBTSxXQUFO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
@@ -334,9 +334,6 @@
334
334
  return;
335
335
  }
336
336
  const ref = lynxWorkletImpl._refImpl._workletRefMap[refId];
337
- if (ref.current instanceof Element) {
338
- return;
339
- }
340
337
  ref.current = value.current;
341
338
  }
342
339
  function hydrateDelayRunOnBackgroundTasks(fnObjs, firstScreenFnObjs, execId) {
@@ -1 +1,14 @@
1
- export { onWorkletCtxUpdate, onHydrationFinished };
1
+ import type { Worklet } from './types.js';
2
+ /**
3
+ * This function must be called when a worklet context is updated.
4
+ *
5
+ * @param worklet - The worklet to be updated
6
+ * @param oldWorklet - The old worklet context
7
+ * @param isFirstScreen - Whether it is before the hydration is finished
8
+ * @param element - The element
9
+ */
10
+ export declare function onWorkletCtxUpdate(worklet: Worklet, oldWorklet: Worklet | null | undefined, isFirstScreen: boolean, element: ElementNode): void;
11
+ /**
12
+ * This must be called when the hydration is finished.
13
+ */
14
+ export declare function onHydrationFinished(): void;
@@ -8,24 +8,24 @@
8
8
  * @param oldWorklet - The old worklet context
9
9
  * @param isFirstScreen - Whether it is before the hydration is finished
10
10
  * @param element - The element
11
- * @internal
12
11
  */
13
- function onWorkletCtxUpdate(worklet, oldWorklet, isFirstScreen, element) {
12
+ export function onWorkletCtxUpdate(worklet, oldWorklet, isFirstScreen, element) {
14
13
  globalThis.lynxWorkletImpl?._jsFunctionLifecycleManager?.addRef(worklet._execId, worklet);
15
14
  if (isFirstScreen && oldWorklet) {
16
15
  globalThis.lynxWorkletImpl?._hydrateCtx(worklet, oldWorklet);
17
16
  }
18
17
  // For old version dynamic component compatibility.
19
- globalThis.lynxWorkletImpl?._eventDelayImpl.runDelayedWorklet(worklet, element);
18
+ if (isFirstScreen) {
19
+ globalThis.lynxWorkletImpl?._eventDelayImpl.runDelayedWorklet(worklet, element);
20
+ }
20
21
  }
21
22
  /**
22
23
  * This must be called when the hydration is finished.
23
- *
24
- * @internal
25
24
  */
26
- function onHydrationFinished() {
25
+ export function onHydrationFinished() {
27
26
  globalThis.lynxWorkletImpl?._runOnBackgroundDelayImpl.runDelayedBackgroundFunctions();
28
27
  globalThis.lynxWorkletImpl?._refImpl.clearFirstScreenWorkletRefMap();
28
+ // For old version dynamic component compatibility.
29
+ globalThis.lynxWorkletImpl?._eventDelayImpl.clearDelayedWorklets();
29
30
  }
30
- export { onWorkletCtxUpdate, onHydrationFinished };
31
31
  //# sourceMappingURL=observers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"observers.js","sourceRoot":"","sources":["../../src/bindings/observers.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAI1D;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CACzB,OAAgB,EAChB,UAAsC,EACtC,aAAsB,EACtB,OAAoB;IAEpB,UAAU,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC,OAAO,CAAC,OAAQ,EAAE,OAAO,CAAC,CAAC;IAC3F,IAAI,aAAa,IAAI,UAAU,EAAE,CAAC;QAChC,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IACD,mDAAmD;IACnD,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB;IAC1B,UAAU,CAAC,eAAe,EAAE,yBAAyB,CAAC,6BAA6B,EAAE,CAAC;IACtF,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,6BAA6B,EAAE,CAAC;AACvE,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"observers.js","sourceRoot":"","sources":["../../src/bindings/observers.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAI1D;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAgB,EAChB,UAAsC,EACtC,aAAsB,EACtB,OAAoB;IAEpB,UAAU,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC,OAAO,CAAC,OAAQ,EAAE,OAAO,CAAC,CAAC;IAC3F,IAAI,aAAa,IAAI,UAAU,EAAE,CAAC;QAChC,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IACD,mDAAmD;IACnD,IAAI,aAAa,EAAE,CAAC;QAClB,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,UAAU,CAAC,eAAe,EAAE,yBAAyB,CAAC,6BAA6B,EAAE,CAAC;IACtF,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,6BAA6B,EAAE,CAAC;IACrE,mDAAmD;IACnD,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,oBAAoB,EAAE,CAAC;AACrE,CAAC"}
@@ -1,7 +1,6 @@
1
1
  // Copyright 2024 The Lynx Authors. All rights reserved.
2
2
  // Licensed under the Apache License Version 2.0 that can be found in the
3
3
  // LICENSE file in the root directory of this source tree.
4
- import { Element } from './api/element.js';
5
4
  import { profile } from './utils/profile.js';
6
5
  /**
7
6
  * Hydrates a Worklet context with data from a first-screen Worklet context.
@@ -55,10 +54,6 @@ function hydrateMainThreadRef(refId, value) {
55
54
  return;
56
55
  }
57
56
  const ref = lynxWorkletImpl._refImpl._workletRefMap[refId];
58
- if (ref.current instanceof Element) {
59
- // Modified by `main-thread:ref`
60
- return;
61
- }
62
57
  ref.current = value.current;
63
58
  }
64
59
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"hydrate.js","sourceRoot":"","sources":["../src/hydrate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hydrate.js","sourceRoot":"","sources":["../src/hydrate.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAG1D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,GAAY,EAAE,cAAuB;IAC9D,OAAO,CAAC,YAAY,EAAE,GAAG,EAAE;QACzB,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,CAAC,OAAQ,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,GAAqB,EAAE,cAAgC,EAAE,MAAc;IAC7F,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,cAAc,IAAI,OAAO,cAAc,KAAK,QAAQ;QAAE,OAAO;IAErG,MAAM,MAAM,GAAG,GAAuC,CAAC;IACvD,MAAM,iBAAiB,GAAG,cAAkD,CAAC;IAE7E,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,8DAA8D;IAC9D,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAiB,EAAE,iBAAuD,CAAC,CAAC;QAC7G,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3B,gCAAgC,CAC9B,MAAM,CAAC,GAAG,CAA+B,EACzC,iBAAiB,CAAC,GAAG,CAA+B,EACpD,MAAM,CACP,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,gBAAgB,GAAG,OAAO,iBAAiB,CAAC,GAAG,CAAC,KAAK,UAAU;gBACnE,CAAC,CAAE,iBAAiB,CAAC,GAAG,CAA+B,CAAC,GAAG;gBAC3D,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAC3B,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,oBAAoB,CAAC,KAAmB,EAAE,KAAqD;IACtG,IAAI,YAAY,IAAI,KAAK,EAAE,CAAC;QAC1B,qCAAqC;QACrC,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,eAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAE,CAAC;IAC7D,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,SAAS,gCAAgC,CACvC,MAAkC,EAAE,oCAAoC;AACxE,iBAA6C,EAAE,kEAAkE;AACjH,MAAc;IAEd,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAE,CAAC;QAC9B,MAAM,gBAAgB,GAA2B,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC3E,IAAI,CAAC,gBAAgB,EAAE,aAAa,EAAE,CAAC;YACrC,SAAS;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,aAAa,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,eAAgB,CAAC,yBAAyB,CAAC,8BAA8B,CAAC,KAAK,CAAE,CAAC;YAClG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YACvB,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,8 +0,0 @@
1
- type DelayedUnmounts = (() => void)[];
2
- declare function takeDelayedUnmounts(): DelayedUnmounts;
3
- declare function runDelayedUnmounts(delayedUnmounts: DelayedUnmounts): void;
4
- /**
5
- * Delay `componentWillUnmount` until main thread patching finishes.
6
- */
7
- declare function initDelayUnmount(): void;
8
- export { initDelayUnmount, runDelayedUnmounts, takeDelayedUnmounts };
@@ -1,65 +0,0 @@
1
- import { options } from 'preact';
2
- import { CATCH_ERROR, COMPONENT, DIFF, VNODE } from '../renderToOpcodes/constants.js';
3
- let delayedUnmounts = [];
4
- let parentVNode;
5
- function takeDelayedUnmounts() {
6
- const ret = delayedUnmounts;
7
- delayedUnmounts = [];
8
- // not clearing `parentVNode` here, which would be cleared before next diff in `options[DIFF]`
9
- return ret;
10
- }
11
- function runDelayedUnmounts(delayedUnmounts) {
12
- for (const fn of delayedUnmounts) {
13
- fn();
14
- }
15
- }
16
- /**
17
- * Delay `componentWillUnmount` until main thread patching finishes.
18
- */
19
- function initDelayUnmount() {
20
- const oldUnmount = options.unmount;
21
- options.unmount = (vnode) => {
22
- if (!parentVNode) {
23
- // `parentVNode` is the first vnode to unmount,
24
- // which is needed to find proper error boundary when running `componentWillUnmount`.
25
- // Shallow copy vnode to prevent modification to vnode in preact unmounting process.
26
- parentVNode = { ...vnode };
27
- const oldDiff = options[DIFF];
28
- options[DIFF] = (vnode) => {
29
- // A new diff indicates that the unmounting process of parentVNode is finished.
30
- parentVNode = undefined;
31
- options[DIFF] = oldDiff;
32
- oldDiff?.(vnode);
33
- };
34
- }
35
- const component = vnode[COMPONENT];
36
- if (component) {
37
- if (oldUnmount) {
38
- const vnode_clone = { ...vnode };
39
- delayedUnmounts.push(() => {
40
- const v = vnode_clone[COMPONENT][VNODE];
41
- vnode_clone[COMPONENT][VNODE] = vnode_clone;
42
- oldUnmount?.(vnode_clone);
43
- vnode_clone[COMPONENT][VNODE] = v;
44
- });
45
- }
46
- if (component.componentWillUnmount) {
47
- const unmount = component.componentWillUnmount;
48
- // @ts-ignore
49
- component.componentWillUnmount = undefined;
50
- const parentVNode_ = parentVNode;
51
- delayedUnmounts.push(() => {
52
- try {
53
- component.componentWillUnmount = unmount;
54
- component.componentWillUnmount();
55
- }
56
- catch (e) {
57
- options[CATCH_ERROR](e, parentVNode_);
58
- }
59
- });
60
- }
61
- }
62
- };
63
- }
64
- export { initDelayUnmount, runDelayedUnmounts, takeDelayedUnmounts };
65
- //# sourceMappingURL=delayUnmount.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delayUnmount.js","sourceRoot":"","sources":["../../src/lifecycle/delayUnmount.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAItF,IAAI,eAAe,GAAoB,EAAE,CAAC;AAC1C,IAAI,WAAkC,CAAC;AAEvC,SAAS,mBAAmB;IAC1B,MAAM,GAAG,GAAG,eAAe,CAAC;IAC5B,eAAe,GAAG,EAAE,CAAC;IACrB,8FAA8F;IAC9F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,kBAAkB,CAAC,eAAgC;IAC1D,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;QACjC,EAAE,EAAE,CAAC;IACP,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB;IACvB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IACnC,OAAO,CAAC,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;QACjC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,+CAA+C;YAC/C,qFAAqF;YACrF,oFAAoF;YACpF,WAAW,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;YAE3B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAA2B,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAY,EAAE,EAAE;gBAC/B,+EAA+E;gBAC/E,WAAW,GAAG,SAAS,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;gBACxB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;gBACjC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE;oBACxB,MAAM,CAAC,GAAG,WAAW,CAAC,SAAS,CAAE,CAAC,KAAK,CAAqB,CAAC;oBAC7D,WAAW,CAAC,SAAS,CAAE,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;oBAC7C,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC;oBAC1B,WAAW,CAAC,SAAS,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrC,CAAC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,SAAS,CAAC,oBAAoB,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,SAAS,CAAC,oBAAoB,CAAC;gBAC/C,aAAa;gBACb,SAAS,CAAC,oBAAoB,GAAG,SAAS,CAAC;gBAC3C,MAAM,YAAY,GAAG,WAAW,CAAC;gBACjC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE;oBACxB,IAAI,CAAC;wBACH,SAAS,CAAC,oBAAoB,GAAG,OAAO,CAAC;wBACzC,SAAS,CAAC,oBAAoB,EAAE,CAAC;oBACnC,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC"}
@@ -1,77 +0,0 @@
1
- // Copyright 2024 The Lynx Authors. All rights reserved.
2
- // Licensed under the Apache License Version 2.0 that can be found in the
3
- // LICENSE file in the root directory of this source tree.
4
- import type { VNode } from 'preact';
5
- import { options } from 'preact';
6
-
7
- import { CATCH_ERROR, COMPONENT, DIFF, VNODE } from '../renderToOpcodes/constants.js';
8
-
9
- type FakeVNode = VNode;
10
- type DelayedUnmounts = (() => void)[];
11
- let delayedUnmounts: DelayedUnmounts = [];
12
- let parentVNode: FakeVNode | undefined;
13
-
14
- function takeDelayedUnmounts(): DelayedUnmounts {
15
- const ret = delayedUnmounts;
16
- delayedUnmounts = [];
17
- // not clearing `parentVNode` here, which would be cleared before next diff in `options[DIFF]`
18
- return ret;
19
- }
20
-
21
- function runDelayedUnmounts(delayedUnmounts: DelayedUnmounts): void {
22
- for (const fn of delayedUnmounts) {
23
- fn();
24
- }
25
- }
26
-
27
- /**
28
- * Delay `componentWillUnmount` until main thread patching finishes.
29
- */
30
- function initDelayUnmount(): void {
31
- const oldUnmount = options.unmount;
32
- options.unmount = (vnode: VNode) => {
33
- if (!parentVNode) {
34
- // `parentVNode` is the first vnode to unmount,
35
- // which is needed to find proper error boundary when running `componentWillUnmount`.
36
- // Shallow copy vnode to prevent modification to vnode in preact unmounting process.
37
- parentVNode = { ...vnode };
38
-
39
- const oldDiff = options[DIFF] as (vnode: VNode) => void;
40
- options[DIFF] = (vnode: VNode) => {
41
- // A new diff indicates that the unmounting process of parentVNode is finished.
42
- parentVNode = undefined;
43
- options[DIFF] = oldDiff;
44
- oldDiff?.(vnode);
45
- };
46
- }
47
-
48
- const component = vnode[COMPONENT];
49
- if (component) {
50
- if (oldUnmount) {
51
- const vnode_clone = { ...vnode };
52
- delayedUnmounts.push(() => {
53
- const v = vnode_clone[COMPONENT]![VNODE] as VNode<{}> | null;
54
- vnode_clone[COMPONENT]![VNODE] = vnode_clone;
55
- oldUnmount?.(vnode_clone);
56
- vnode_clone[COMPONENT]![VNODE] = v;
57
- });
58
- }
59
- if (component.componentWillUnmount) {
60
- const unmount = component.componentWillUnmount;
61
- // @ts-ignore
62
- component.componentWillUnmount = undefined;
63
- const parentVNode_ = parentVNode;
64
- delayedUnmounts.push(() => {
65
- try {
66
- component.componentWillUnmount = unmount;
67
- component.componentWillUnmount();
68
- } catch (e) {
69
- options[CATCH_ERROR](e, parentVNode_);
70
- }
71
- });
72
- }
73
- }
74
- };
75
- }
76
-
77
- export { initDelayUnmount, runDelayedUnmounts, takeDelayedUnmounts };