@zsviczian/excalidraw 0.9.0-obsidian-5 → 0.9.0-obsidian-9

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 (275) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/excalidraw-assets-dev/i18n-ar-SA-json-8617476a4caf18fc0371.js +22 -0
  3. package/dist/excalidraw-assets-dev/{i18n-bg-BG-json-8e2bb5d514f8cc8a936b.js → i18n-bg-BG-json-709d1cdbcdd08cb4196e.js} +2 -2
  4. package/dist/excalidraw-assets-dev/{i18n-ca-ES-json-0d4b865327b1c8a2e162.js → i18n-ca-ES-json-00e9a306a6883ffbbe57.js} +2 -2
  5. package/dist/excalidraw-assets-dev/{i18n-cs-CZ-json-0f816286ac71084bc260.js → i18n-cs-CZ-json-bc9a303ff98ced90903d.js} +1 -1
  6. package/dist/excalidraw-assets-dev/{i18n-da-DK-json-7b31fb592027c574252a.js → i18n-da-DK-json-43287c62e4e654a62e4b.js} +1 -1
  7. package/dist/excalidraw-assets-dev/{i18n-de-DE-json-5030e9ac8691da749eba.js → i18n-de-DE-json-32a0c6840217959c613d.js} +2 -2
  8. package/dist/excalidraw-assets-dev/{i18n-el-GR-json-6296dc761fd8118e1e78.js → i18n-el-GR-json-f03c81650fc237c5cf4a.js} +2 -2
  9. package/dist/excalidraw-assets-dev/{i18n-es-ES-json-c5fd5e8031140d6bafbb.js → i18n-es-ES-json-e9fa5e81b395ea04cf35.js} +2 -2
  10. package/dist/excalidraw-assets-dev/i18n-fa-IR-json-c234b5e54cd2a1672898.js +22 -0
  11. package/dist/excalidraw-assets-dev/{i18n-fi-FI-json-2d77bb0a44634fa78695.js → i18n-fi-FI-json-29106b8736c3568b0e7a.js} +2 -2
  12. package/dist/excalidraw-assets-dev/i18n-fr-FR-json-b4382269051ef449f22a.js +22 -0
  13. package/dist/excalidraw-assets-dev/i18n-he-IL-json-9f9592408d2171d94d28.js +22 -0
  14. package/dist/excalidraw-assets-dev/{i18n-hi-IN-json-dfd13380f880265721d1.js → i18n-hi-IN-json-dfd30ffcd688b76d247b.js} +2 -2
  15. package/dist/excalidraw-assets-dev/{i18n-hu-HU-json-589f4fe4e5271cc8b905.js → i18n-hu-HU-json-385ed66ee674f14883ce.js} +1 -1
  16. package/dist/excalidraw-assets-dev/{i18n-id-ID-json-21a624246904b7e41f4a.js → i18n-id-ID-json-8606e52f65cda64f84de.js} +1 -1
  17. package/dist/excalidraw-assets-dev/{i18n-it-IT-json-65c3715ea484ae03ccf5.js → i18n-it-IT-json-47d0eb1c1ca8ffcc6a8c.js} +1 -1
  18. package/dist/excalidraw-assets-dev/i18n-ja-JP-json-041d339b6d1c6c40a696.js +22 -0
  19. package/dist/excalidraw-assets-dev/{i18n-kab-KAB-json-96dec5963f8bde319606.js → i18n-kab-KAB-json-bc3faead75b6f428fa0e.js} +1 -1
  20. package/dist/excalidraw-assets-dev/{i18n-kk-KZ-json-3c033b44668ea8f33a22.js → i18n-kk-KZ-json-a7087f74220ab6202b31.js} +2 -2
  21. package/dist/excalidraw-assets-dev/{i18n-ko-KR-json-4db910c9a500e94328bd.js → i18n-ko-KR-json-e3fba288c9957c8010cf.js} +1 -1
  22. package/dist/excalidraw-assets-dev/{i18n-lv-LV-json-1a80ea1c8f3354d394cf.js → i18n-lv-LV-json-08034ebe84bb974c35c3.js} +2 -2
  23. package/dist/excalidraw-assets-dev/{i18n-my-MM-json-8a534e22357023f607a4.js → i18n-my-MM-json-cc0225c53edbf917e21f.js} +2 -2
  24. package/dist/excalidraw-assets-dev/{i18n-nb-NO-json-49fa9e922f887d2f60a7.js → i18n-nb-NO-json-34f0bfcf72c71d33376d.js} +2 -2
  25. package/dist/excalidraw-assets-dev/{i18n-nl-NL-json-029a4337aaabed4c9288.js → i18n-nl-NL-json-62820376fea0b9d31fc3.js} +1 -1
  26. package/dist/excalidraw-assets-dev/{i18n-nn-NO-json-50abd892a02e69a883ff.js → i18n-nn-NO-json-a3f47aba453d847cc65a.js} +1 -1
  27. package/dist/excalidraw-assets-dev/{i18n-oc-FR-json-069879d69e9d37f7131f.js → i18n-oc-FR-json-d731d0c7c25481aef3c8.js} +2 -2
  28. package/dist/excalidraw-assets-dev/i18n-pa-IN-json-1ccfa9e432207fa34d73.js +22 -0
  29. package/dist/excalidraw-assets-dev/{i18n-pl-PL-json-296ec26c591842760f6f.js → i18n-pl-PL-json-2c3192cda97bcdfaed27.js} +1 -1
  30. package/dist/excalidraw-assets-dev/i18n-pt-BR-json-8b1f19303a882e28bcb8.js +22 -0
  31. package/dist/excalidraw-assets-dev/{i18n-pt-PT-json-3dcb13e958e56026feef.js → i18n-pt-PT-json-8c9d24df4db900d7eed1.js} +1 -1
  32. package/dist/excalidraw-assets-dev/{i18n-ro-RO-json-4a2e4f653982cc7b046e.js → i18n-ro-RO-json-8ad16b7ee2c00730a103.js} +2 -2
  33. package/dist/excalidraw-assets-dev/{i18n-ru-RU-json-aa64cf921fe14692fff6.js → i18n-ru-RU-json-d0767891cb65e644f458.js} +1 -1
  34. package/dist/excalidraw-assets-dev/{i18n-sk-SK-json-118350b0f0cdc9be21b6.js → i18n-sk-SK-json-e786dadba6fac2b1625b.js} +2 -2
  35. package/dist/excalidraw-assets-dev/{i18n-sv-SE-json-0b0469f979b4abbbd52a.js → i18n-sv-SE-json-35b10171080a427d71a5.js} +2 -2
  36. package/dist/excalidraw-assets-dev/{i18n-tr-TR-json-36562912456a82f27b84.js → i18n-tr-TR-json-a15ed70331602c0a16f7.js} +2 -2
  37. package/dist/excalidraw-assets-dev/{i18n-uk-UA-json-0455e3b621d70d11a5be.js → i18n-uk-UA-json-df1cdfae3f8aa58d22bb.js} +2 -2
  38. package/dist/excalidraw-assets-dev/i18n-zh-CN-json-342311fa1d0fa30c6828.js +22 -0
  39. package/dist/excalidraw-assets-dev/{i18n-zh-TW-json-455a3759551c2688bd1b.js → i18n-zh-TW-json-819e494f1f38cb9ef099.js} +1 -1
  40. package/dist/excalidraw-assets-dev/image-cacb3d0c02eb2e346ecc.js +3 -4
  41. package/dist/excalidraw.development.js +14 -14
  42. package/dist/excalidraw.production.min.js +1 -1
  43. package/package.json +1 -1
  44. package/types/components/App.d.ts +1 -1
  45. package/types/element/newElement.d.ts +1 -0
  46. package/types/element/types.d.ts +1 -0
  47. package/types/packages/excalidraw/dist/130.d.ts +0 -0
  48. package/types/packages/excalidraw/dist/138.d.ts +0 -0
  49. package/types/packages/excalidraw/dist/153.d.ts +0 -0
  50. package/types/packages/excalidraw/dist/327.d.ts +0 -0
  51. package/types/packages/excalidraw/dist/343.d.ts +0 -0
  52. package/types/packages/excalidraw/dist/414.d.ts +0 -0
  53. package/types/packages/excalidraw/dist/610.d.ts +0 -0
  54. package/types/packages/excalidraw/dist/655.d.ts +0 -0
  55. package/types/packages/excalidraw/dist/791.d.ts +0 -0
  56. package/types/packages/excalidraw/dist/853.d.ts +0 -0
  57. package/types/packages/excalidraw/dist/excalidraw-assets/130-85516c2490fa7ab4e546.d.ts +0 -0
  58. package/types/packages/excalidraw/dist/excalidraw-assets/138-48926f115f0ee59c3296.d.ts +0 -0
  59. package/types/packages/excalidraw/dist/excalidraw-assets/153-035c7506bddb18950b22.d.ts +0 -0
  60. package/types/packages/excalidraw/dist/excalidraw-assets/327-555400166929775476c9.d.ts +0 -0
  61. package/types/packages/excalidraw/dist/excalidraw-assets/343-63de1d0a8bca08c0ec94.d.ts +0 -0
  62. package/types/packages/excalidraw/dist/excalidraw-assets/414-4a7302c4a748833decff.d.ts +0 -0
  63. package/types/packages/excalidraw/dist/excalidraw-assets/610-36e8795f724a2d7f6877.d.ts +0 -0
  64. package/types/packages/excalidraw/dist/excalidraw-assets/655-02792bde79621895abda.d.ts +0 -0
  65. package/types/packages/excalidraw/dist/excalidraw-assets/791-3f80f7cecd36685ac7d9.d.ts +0 -0
  66. package/types/packages/excalidraw/dist/excalidraw-assets/853-b354affca17f4801055d.d.ts +0 -0
  67. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ar-SA-json-8617476a4caf18fc0371.d.ts +2 -0
  68. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-bg-BG-json-709d1cdbcdd08cb4196e.d.ts +2 -0
  69. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ca-ES-json-00e9a306a6883ffbbe57.d.ts +2 -0
  70. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-cs-CZ-json-bc9a303ff98ced90903d.d.ts +2 -0
  71. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-da-DK-json-43287c62e4e654a62e4b.d.ts +2 -0
  72. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-de-DE-json-32a0c6840217959c613d.d.ts +2 -0
  73. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-el-GR-json-f03c81650fc237c5cf4a.d.ts +2 -0
  74. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-es-ES-json-e9fa5e81b395ea04cf35.d.ts +2 -0
  75. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-fa-IR-json-c234b5e54cd2a1672898.d.ts +2 -0
  76. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-fi-FI-json-29106b8736c3568b0e7a.d.ts +2 -0
  77. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-fr-FR-json-b4382269051ef449f22a.d.ts +2 -0
  78. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-he-IL-json-9f9592408d2171d94d28.d.ts +2 -0
  79. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-hi-IN-json-dfd30ffcd688b76d247b.d.ts +2 -0
  80. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-hu-HU-json-385ed66ee674f14883ce.d.ts +2 -0
  81. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-id-ID-json-8606e52f65cda64f84de.d.ts +2 -0
  82. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-it-IT-json-47d0eb1c1ca8ffcc6a8c.d.ts +2 -0
  83. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ja-JP-json-041d339b6d1c6c40a696.d.ts +2 -0
  84. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-kab-KAB-json-bc3faead75b6f428fa0e.d.ts +2 -0
  85. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-kk-KZ-json-a7087f74220ab6202b31.d.ts +2 -0
  86. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ko-KR-json-e3fba288c9957c8010cf.d.ts +2 -0
  87. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-lv-LV-json-08034ebe84bb974c35c3.d.ts +2 -0
  88. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-my-MM-json-cc0225c53edbf917e21f.d.ts +2 -0
  89. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-nb-NO-json-34f0bfcf72c71d33376d.d.ts +2 -0
  90. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-nl-NL-json-62820376fea0b9d31fc3.d.ts +2 -0
  91. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-nn-NO-json-a3f47aba453d847cc65a.d.ts +2 -0
  92. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-oc-FR-json-d731d0c7c25481aef3c8.d.ts +2 -0
  93. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-pa-IN-json-1ccfa9e432207fa34d73.d.ts +2 -0
  94. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-pl-PL-json-2c3192cda97bcdfaed27.d.ts +2 -0
  95. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-pt-BR-json-8b1f19303a882e28bcb8.d.ts +2 -0
  96. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-pt-PT-json-8c9d24df4db900d7eed1.d.ts +2 -0
  97. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ro-RO-json-8ad16b7ee2c00730a103.d.ts +2 -0
  98. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ru-RU-json-d0767891cb65e644f458.d.ts +2 -0
  99. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-sk-SK-json-e786dadba6fac2b1625b.d.ts +2 -0
  100. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-sv-SE-json-35b10171080a427d71a5.d.ts +2 -0
  101. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-tr-TR-json-a15ed70331602c0a16f7.d.ts +2 -0
  102. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-uk-UA-json-df1cdfae3f8aa58d22bb.d.ts +2 -0
  103. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-zh-CN-json-342311fa1d0fa30c6828.d.ts +2 -0
  104. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-zh-TW-json-819e494f1f38cb9ef099.d.ts +2 -0
  105. package/types/packages/excalidraw/dist/i18n-ar-SA-json.d.ts +0 -0
  106. package/types/packages/excalidraw/dist/i18n-bg-BG-json.d.ts +0 -0
  107. package/types/packages/excalidraw/dist/i18n-ca-ES-json.d.ts +0 -0
  108. package/types/packages/excalidraw/dist/i18n-cs-CZ-json.d.ts +0 -0
  109. package/types/packages/excalidraw/dist/i18n-da-DK-json.d.ts +0 -0
  110. package/types/packages/excalidraw/dist/i18n-de-DE-json.d.ts +0 -0
  111. package/types/packages/excalidraw/dist/i18n-el-GR-json.d.ts +0 -0
  112. package/types/packages/excalidraw/dist/i18n-es-ES-json.d.ts +0 -0
  113. package/types/packages/excalidraw/dist/i18n-fa-IR-json.d.ts +0 -0
  114. package/types/packages/excalidraw/dist/i18n-fi-FI-json.d.ts +0 -0
  115. package/types/packages/excalidraw/dist/i18n-fr-FR-json.d.ts +0 -0
  116. package/types/packages/excalidraw/dist/i18n-he-IL-json.d.ts +0 -0
  117. package/types/packages/excalidraw/dist/i18n-hi-IN-json.d.ts +0 -0
  118. package/types/packages/excalidraw/dist/i18n-hu-HU-json.d.ts +0 -0
  119. package/types/packages/excalidraw/dist/i18n-id-ID-json.d.ts +0 -0
  120. package/types/packages/excalidraw/dist/i18n-it-IT-json.d.ts +0 -0
  121. package/types/packages/excalidraw/dist/i18n-ja-JP-json.d.ts +0 -0
  122. package/types/packages/excalidraw/dist/i18n-kab-KAB-json.d.ts +0 -0
  123. package/types/packages/excalidraw/dist/i18n-kk-KZ-json.d.ts +0 -0
  124. package/types/packages/excalidraw/dist/i18n-ko-KR-json.d.ts +0 -0
  125. package/types/packages/excalidraw/dist/i18n-lv-LV-json.d.ts +0 -0
  126. package/types/packages/excalidraw/dist/i18n-my-MM-json.d.ts +0 -0
  127. package/types/packages/excalidraw/dist/i18n-nb-NO-json.d.ts +0 -0
  128. package/types/packages/excalidraw/dist/i18n-nl-NL-json.d.ts +0 -0
  129. package/types/packages/excalidraw/dist/i18n-nn-NO-json.d.ts +0 -0
  130. package/types/packages/excalidraw/dist/i18n-oc-FR-json.d.ts +0 -0
  131. package/types/packages/excalidraw/dist/i18n-pa-IN-json.d.ts +0 -0
  132. package/types/packages/excalidraw/dist/i18n-pl-PL-json.d.ts +0 -0
  133. package/types/packages/excalidraw/dist/i18n-pt-BR-json.d.ts +0 -0
  134. package/types/packages/excalidraw/dist/i18n-pt-PT-json.d.ts +0 -0
  135. package/types/packages/excalidraw/dist/i18n-ro-RO-json.d.ts +0 -0
  136. package/types/packages/excalidraw/dist/i18n-ru-RU-json.d.ts +0 -0
  137. package/types/packages/excalidraw/dist/i18n-sk-SK-json.d.ts +0 -0
  138. package/types/packages/excalidraw/dist/i18n-sv-SE-json.d.ts +0 -0
  139. package/types/packages/excalidraw/dist/i18n-tr-TR-json.d.ts +0 -0
  140. package/types/packages/excalidraw/dist/i18n-uk-UA-json.d.ts +0 -0
  141. package/types/packages/excalidraw/dist/i18n-zh-CN-json.d.ts +0 -0
  142. package/types/packages/excalidraw/dist/i18n-zh-TW-json.d.ts +0 -0
  143. package/types/packages/excalidraw/dist/image.d.ts +0 -0
  144. package/types/packages/excalidraw/webpack.prod.config.d.ts +4 -7
  145. package/dist/excalidraw-assets/Cascadia.woff2 +0 -0
  146. package/dist/excalidraw-assets/Virgil.woff2 +0 -0
  147. package/dist/excalidraw-assets/i18n-ar-SA-json-419b81f79ede8820a244.js +0 -1
  148. package/dist/excalidraw-assets/i18n-ar-SA-json-9a7bef3582993b3fde41.js +0 -1
  149. package/dist/excalidraw-assets/i18n-bg-BG-json-7b8493871d1d574c3158.js +0 -1
  150. package/dist/excalidraw-assets/i18n-bg-BG-json-93c3fd2b081c849d4e04.js +0 -1
  151. package/dist/excalidraw-assets/i18n-ca-ES-json-1a3d6b4bd6a2c22062fd.js +0 -1
  152. package/dist/excalidraw-assets/i18n-ca-ES-json-e749f7948c1b822fc757.js +0 -1
  153. package/dist/excalidraw-assets/i18n-cs-CZ-json-8b577e35bb3be3287a0b.js +0 -1
  154. package/dist/excalidraw-assets/i18n-cs-CZ-json-cde33d4886177e2b5943.js +0 -1
  155. package/dist/excalidraw-assets/i18n-da-DK-json-4307920300b28d333967.js +0 -1
  156. package/dist/excalidraw-assets/i18n-da-DK-json-9fa916623852e0c90f45.js +0 -1
  157. package/dist/excalidraw-assets/i18n-de-DE-json-6686cf3027dc5f2c8ac9.js +0 -1
  158. package/dist/excalidraw-assets/i18n-de-DE-json-f72002171c2c56b967cd.js +0 -1
  159. package/dist/excalidraw-assets/i18n-el-GR-json-c387a5784969c8eeb620.js +0 -1
  160. package/dist/excalidraw-assets/i18n-el-GR-json-f8f9a3a1729a4935edbc.js +0 -1
  161. package/dist/excalidraw-assets/i18n-es-ES-json-2c2246b5f03e518b157c.js +0 -1
  162. package/dist/excalidraw-assets/i18n-es-ES-json-9a69ac84385b472240f1.js +0 -1
  163. package/dist/excalidraw-assets/i18n-fa-IR-json-4bb354eb498ae936addb.js +0 -1
  164. package/dist/excalidraw-assets/i18n-fa-IR-json-ed30e5e132ca0fc87ba8.js +0 -1
  165. package/dist/excalidraw-assets/i18n-fi-FI-json-881e59d491b8000cce68.js +0 -1
  166. package/dist/excalidraw-assets/i18n-fi-FI-json-a10d316db60e5c683310.js +0 -1
  167. package/dist/excalidraw-assets/i18n-fr-FR-json-97d3c042d3a35ef178f1.js +0 -1
  168. package/dist/excalidraw-assets/i18n-fr-FR-json-b011cd7d96772728e943.js +0 -1
  169. package/dist/excalidraw-assets/i18n-he-IL-json-2636e07fd8cc89d175d9.js +0 -1
  170. package/dist/excalidraw-assets/i18n-he-IL-json-dbf0b0dfa393c04804dc.js +0 -1
  171. package/dist/excalidraw-assets/i18n-hi-IN-json-04c3d23095ab9ac7f5df.js +0 -1
  172. package/dist/excalidraw-assets/i18n-hi-IN-json-15259c14d6c8090e6041.js +0 -1
  173. package/dist/excalidraw-assets/i18n-hu-HU-json-83f954e3c1e57b6fd4f2.js +0 -1
  174. package/dist/excalidraw-assets/i18n-hu-HU-json-f4ba7b709cbeff58f0cf.js +0 -1
  175. package/dist/excalidraw-assets/i18n-id-ID-json-6f60c51ca6dfbc634c8a.js +0 -1
  176. package/dist/excalidraw-assets/i18n-id-ID-json-9c439203bdabe6684608.js +0 -1
  177. package/dist/excalidraw-assets/i18n-it-IT-json-32a61d0b3e05b538bf63.js +0 -1
  178. package/dist/excalidraw-assets/i18n-it-IT-json-a3b6dc24ca8e4bdff4b5.js +0 -1
  179. package/dist/excalidraw-assets/i18n-ja-JP-json-3d88bed1101df4b70be0.js +0 -1
  180. package/dist/excalidraw-assets/i18n-ja-JP-json-7780222c69cc877e19a5.js +0 -1
  181. package/dist/excalidraw-assets/i18n-kab-KAB-json-18b27de277dd5ed60f77.js +0 -1
  182. package/dist/excalidraw-assets/i18n-kab-KAB-json-9438814b6f8d2d4bca30.js +0 -1
  183. package/dist/excalidraw-assets/i18n-kk-KZ-json-3b5f82fbed99a4b52319.js +0 -1
  184. package/dist/excalidraw-assets/i18n-kk-KZ-json-c6e1e808c0237fb1c06e.js +0 -1
  185. package/dist/excalidraw-assets/i18n-ko-KR-json-60158040fc55af420fec.js +0 -1
  186. package/dist/excalidraw-assets/i18n-ko-KR-json-ee3aceb4a8ffb4ad1184.js +0 -1
  187. package/dist/excalidraw-assets/i18n-lv-LV-json-0a84813c147df37dafd5.js +0 -1
  188. package/dist/excalidraw-assets/i18n-lv-LV-json-84ed581e30c5edb74a7c.js +0 -1
  189. package/dist/excalidraw-assets/i18n-my-MM-json-72061b5e226e3138841a.js +0 -1
  190. package/dist/excalidraw-assets/i18n-my-MM-json-b7cafa3196e9247a3744.js +0 -1
  191. package/dist/excalidraw-assets/i18n-nb-NO-json-7817632f1248c4374b19.js +0 -1
  192. package/dist/excalidraw-assets/i18n-nb-NO-json-a62fb855853b4f6d2995.js +0 -1
  193. package/dist/excalidraw-assets/i18n-nl-NL-json-72e79cc48022d36285a9.js +0 -1
  194. package/dist/excalidraw-assets/i18n-nl-NL-json-7bedb9ed0d2a6ce6dbef.js +0 -1
  195. package/dist/excalidraw-assets/i18n-nn-NO-json-224b770d630509ce33d7.js +0 -1
  196. package/dist/excalidraw-assets/i18n-nn-NO-json-cc3e8135a35bc8f98708.js +0 -1
  197. package/dist/excalidraw-assets/i18n-oc-FR-json-7cd0233768ae95a4ff67.js +0 -1
  198. package/dist/excalidraw-assets/i18n-oc-FR-json-cf468f7e94318eda6291.js +0 -1
  199. package/dist/excalidraw-assets/i18n-pa-IN-json-0346c42fd5a76dafe221.js +0 -1
  200. package/dist/excalidraw-assets/i18n-pa-IN-json-6ef739922adfa053acad.js +0 -1
  201. package/dist/excalidraw-assets/i18n-pl-PL-json-7a95e70848706f300921.js +0 -1
  202. package/dist/excalidraw-assets/i18n-pl-PL-json-fd71968e6ed066a9a7e4.js +0 -1
  203. package/dist/excalidraw-assets/i18n-pt-BR-json-05723da962a56579c5b7.js +0 -1
  204. package/dist/excalidraw-assets/i18n-pt-BR-json-464cb502a9c0fedb90bc.js +0 -1
  205. package/dist/excalidraw-assets/i18n-pt-PT-json-7b7c90b1b9d2f1c8516b.js +0 -1
  206. package/dist/excalidraw-assets/i18n-pt-PT-json-8dad08eff22c09deb132.js +0 -1
  207. package/dist/excalidraw-assets/i18n-ro-RO-json-46d69e1042ed27b1af0e.js +0 -1
  208. package/dist/excalidraw-assets/i18n-ro-RO-json-ac25005e74f8dd8d360c.js +0 -1
  209. package/dist/excalidraw-assets/i18n-ru-RU-json-56a9f0f5dd8e522087ca.js +0 -1
  210. package/dist/excalidraw-assets/i18n-ru-RU-json-ef8daff1f5e8b77e4cad.js +0 -1
  211. package/dist/excalidraw-assets/i18n-sk-SK-json-01a4565891052d4a794e.js +0 -1
  212. package/dist/excalidraw-assets/i18n-sk-SK-json-f50495416e3b91a65ed6.js +0 -1
  213. package/dist/excalidraw-assets/i18n-sv-SE-json-2fd231ccf2c37b2df52d.js +0 -1
  214. package/dist/excalidraw-assets/i18n-sv-SE-json-5e1ba7ca414e68781354.js +0 -1
  215. package/dist/excalidraw-assets/i18n-tr-TR-json-40ddc6f2e1149aec6a89.js +0 -1
  216. package/dist/excalidraw-assets/i18n-tr-TR-json-d1a35f24d637c15b8a22.js +0 -1
  217. package/dist/excalidraw-assets/i18n-uk-UA-json-56a1880a9d0b966ef750.js +0 -1
  218. package/dist/excalidraw-assets/i18n-uk-UA-json-f6fb2e431947fd51c7cd.js +0 -1
  219. package/dist/excalidraw-assets/i18n-zh-CN-json-3333609e8b26b63da65d.js +0 -1
  220. package/dist/excalidraw-assets/i18n-zh-CN-json-96511ea7ac9e3b14a4bb.js +0 -1
  221. package/dist/excalidraw-assets/i18n-zh-TW-json-08026b081d7dae088759.js +0 -1
  222. package/dist/excalidraw-assets/i18n-zh-TW-json-77c4afeec02f07f1d4cc.js +0 -1
  223. package/dist/excalidraw-assets/image-02a1f3ecd6baf42daaa6.js +0 -1
  224. package/dist/excalidraw-assets/image-eafab0c39ce13f7fea67.js +0 -1
  225. package/dist/excalidraw-assets/vendor-448ccb79e58765b61834.js +0 -2
  226. package/dist/excalidraw-assets/vendor-448ccb79e58765b61834.js.LICENSE.txt +0 -1
  227. package/dist/excalidraw-assets/vendor-cb708a4580b007d81177.js +0 -2
  228. package/dist/excalidraw-assets/vendor-cb708a4580b007d81177.js.LICENSE.txt +0 -1
  229. package/dist/excalidraw-assets-dev/i18n-ar-SA-json-42e4a9a6e2c159061c2e.js +0 -22
  230. package/dist/excalidraw-assets-dev/i18n-ar-SA-json-8762f1b4f8506bb671cc.js +0 -22
  231. package/dist/excalidraw-assets-dev/i18n-bg-BG-json-a22c1090c7710e7224e9.js +0 -22
  232. package/dist/excalidraw-assets-dev/i18n-ca-ES-json-cae20cfd28537629a5c3.js +0 -22
  233. package/dist/excalidraw-assets-dev/i18n-cs-CZ-json-3d54eebf950d01467bb5.js +0 -22
  234. package/dist/excalidraw-assets-dev/i18n-da-DK-json-eefd401f00ee00cfd6b4.js +0 -22
  235. package/dist/excalidraw-assets-dev/i18n-de-DE-json-cd1b9a96c40c1214437f.js +0 -22
  236. package/dist/excalidraw-assets-dev/i18n-el-GR-json-8950d1c770bb739bc959.js +0 -22
  237. package/dist/excalidraw-assets-dev/i18n-es-ES-json-ff8d3c988332349324b0.js +0 -22
  238. package/dist/excalidraw-assets-dev/i18n-fa-IR-json-997bcb2327d0cdf8a9ca.js +0 -22
  239. package/dist/excalidraw-assets-dev/i18n-fa-IR-json-c73016eff7a6ff5d7c18.js +0 -22
  240. package/dist/excalidraw-assets-dev/i18n-fi-FI-json-bc393e1d562c37671962.js +0 -22
  241. package/dist/excalidraw-assets-dev/i18n-fr-FR-json-2249e2273f1c8ea609ec.js +0 -22
  242. package/dist/excalidraw-assets-dev/i18n-fr-FR-json-3ab1159cad2de3c20dcc.js +0 -22
  243. package/dist/excalidraw-assets-dev/i18n-he-IL-json-317678dc1c48b901bfb0.js +0 -22
  244. package/dist/excalidraw-assets-dev/i18n-he-IL-json-853dbfc1fcf5a9658ed5.js +0 -22
  245. package/dist/excalidraw-assets-dev/i18n-hi-IN-json-ef79503b785a86a4d7e4.js +0 -22
  246. package/dist/excalidraw-assets-dev/i18n-hu-HU-json-5e40f12439fdaf31e5f8.js +0 -22
  247. package/dist/excalidraw-assets-dev/i18n-id-ID-json-d0fd59d99eb8268ad32d.js +0 -22
  248. package/dist/excalidraw-assets-dev/i18n-it-IT-json-dc31d253c180bd8bc42c.js +0 -22
  249. package/dist/excalidraw-assets-dev/i18n-ja-JP-json-db2805c4535d81f39148.js +0 -22
  250. package/dist/excalidraw-assets-dev/i18n-ja-JP-json-db3c1426e054a5eabd0e.js +0 -22
  251. package/dist/excalidraw-assets-dev/i18n-kab-KAB-json-b88f94c29607a0102313.js +0 -22
  252. package/dist/excalidraw-assets-dev/i18n-kk-KZ-json-8b99ef209de2ab375283.js +0 -22
  253. package/dist/excalidraw-assets-dev/i18n-ko-KR-json-87c10c8f44988dd0e13a.js +0 -22
  254. package/dist/excalidraw-assets-dev/i18n-lv-LV-json-edc8d3b64bad828f29d1.js +0 -22
  255. package/dist/excalidraw-assets-dev/i18n-my-MM-json-94f177b41ad570aed0e2.js +0 -22
  256. package/dist/excalidraw-assets-dev/i18n-nb-NO-json-f622ae767c6fb7da0359.js +0 -22
  257. package/dist/excalidraw-assets-dev/i18n-nl-NL-json-df1ade23a540ca746458.js +0 -22
  258. package/dist/excalidraw-assets-dev/i18n-nn-NO-json-6d27231c8f6f5056953c.js +0 -22
  259. package/dist/excalidraw-assets-dev/i18n-oc-FR-json-32bba579cbe508c2d6b4.js +0 -22
  260. package/dist/excalidraw-assets-dev/i18n-pa-IN-json-5e2e9c3078bfca8530b1.js +0 -22
  261. package/dist/excalidraw-assets-dev/i18n-pa-IN-json-eebd0b703eab5181194a.js +0 -22
  262. package/dist/excalidraw-assets-dev/i18n-pl-PL-json-f161c5a49ee47f8e771c.js +0 -22
  263. package/dist/excalidraw-assets-dev/i18n-pt-BR-json-715832c0500f14d50107.js +0 -22
  264. package/dist/excalidraw-assets-dev/i18n-pt-BR-json-8654a77d14593257605e.js +0 -22
  265. package/dist/excalidraw-assets-dev/i18n-pt-PT-json-482e046bcfea32653cf0.js +0 -22
  266. package/dist/excalidraw-assets-dev/i18n-ro-RO-json-b4f5aa1801ab335c9c27.js +0 -22
  267. package/dist/excalidraw-assets-dev/i18n-ru-RU-json-aa92dea266fa031249ca.js +0 -22
  268. package/dist/excalidraw-assets-dev/i18n-sk-SK-json-64d8c54b4e322042f4ef.js +0 -22
  269. package/dist/excalidraw-assets-dev/i18n-sv-SE-json-b5cf0c46dcfc4ecb6d00.js +0 -22
  270. package/dist/excalidraw-assets-dev/i18n-tr-TR-json-801be2b32d052c1cc5fd.js +0 -22
  271. package/dist/excalidraw-assets-dev/i18n-uk-UA-json-cf0c4a4659e179efded6.js +0 -22
  272. package/dist/excalidraw-assets-dev/i18n-zh-CN-json-3fe440d4981c65767b68.js +0 -22
  273. package/dist/excalidraw-assets-dev/i18n-zh-CN-json-e2e68b548639c6708d55.js +0 -22
  274. package/dist/excalidraw-assets-dev/i18n-zh-TW-json-a78c1cbb2eaa5ad69af6.js +0 -22
  275. package/dist/excalidraw-assets-dev/vendor-0454f90696ac835aeb45.js +0 -356
@@ -96,14 +96,14 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
96
96
 
97
97
  /***/ }),
98
98
 
99
- /***/ "../../../node_modules/perfect-freehand/dist/perfect-freehand.esm.js":
100
- /*!***************************************************************************!*\
101
- !*** ../../../node_modules/perfect-freehand/dist/perfect-freehand.esm.js ***!
102
- \***************************************************************************/
99
+ /***/ "../../../node_modules/perfect-freehand/dist/esm/index.js":
100
+ /*!****************************************************************!*\
101
+ !*** ../../../node_modules/perfect-freehand/dist/esm/index.js ***!
102
+ \****************************************************************/
103
103
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
104
104
 
105
105
  "use strict";
106
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ \"getStrokeOutlinePoints\": () => (/* binding */ getStrokeOutlinePoints),\n/* harmony export */ \"getStrokePoints\": () => (/* binding */ getStrokePoints)\n/* harmony export */ });\nfunction lerp(y1, y2, mu) {\n return y1 * (1 - mu) + y2 * mu;\n}\nfunction clamp(n, a, b) {\n return Math.max(a, Math.min(b, n));\n}\n/**\r\n * Convert an array of points to the correct format ([x, y, radius])\r\n * @param points\r\n * @returns\r\n */\n\nfunction toPointsArray(points) {\n if (Array.isArray(points[0])) {\n return points.map(function (_ref) {\n var x = _ref[0],\n y = _ref[1],\n _ref$ = _ref[2],\n pressure = _ref$ === void 0 ? 0.5 : _ref$;\n return [x, y, pressure];\n });\n } else {\n return points.map(function (_ref2) {\n var x = _ref2.x,\n y = _ref2.y,\n _ref2$pressure = _ref2.pressure,\n pressure = _ref2$pressure === void 0 ? 0.5 : _ref2$pressure;\n return [x, y, pressure];\n });\n }\n}\n/**\r\n * Compute a radius based on the pressure.\r\n * @param size\r\n * @param thinning\r\n * @param easing\r\n * @param pressure\r\n * @returns\r\n */\n\nfunction getStrokeRadius(size, thinning, easing, pressure) {\n if (pressure === void 0) {\n pressure = 0.5;\n }\n\n if (!thinning) return size / 2;\n pressure = clamp(easing(pressure), 0, 1);\n return (thinning < 0 ? lerp(size, size + size * clamp(thinning, -0.95, -0.05), pressure) : lerp(size - size * clamp(thinning, 0.05, 0.95), size, pressure)) / 2;\n}\n\n/**\r\n * Negate a vector.\r\n * @param A\r\n */\n/**\r\n * Add vectors.\r\n * @param A\r\n * @param B\r\n */\n\nfunction add(A, B) {\n return [A[0] + B[0], A[1] + B[1]];\n}\n/**\r\n * Subtract vectors.\r\n * @param A\r\n * @param B\r\n */\n\nfunction sub(A, B) {\n return [A[0] - B[0], A[1] - B[1]];\n}\n/**\r\n * Get the vector from vectors A to B.\r\n * @param A\r\n * @param B\r\n */\n\nfunction vec(A, B) {\n // A, B as vectors get the vector from A to B\n return [B[0] - A[0], B[1] - A[1]];\n}\n/**\r\n * Vector multiplication by scalar\r\n * @param A\r\n * @param n\r\n */\n\nfunction mul(A, n) {\n return [A[0] * n, A[1] * n];\n}\n/**\r\n * Vector division by scalar.\r\n * @param A\r\n * @param n\r\n */\n\nfunction div(A, n) {\n return [A[0] / n, A[1] / n];\n}\n/**\r\n * Perpendicular rotation of a vector A\r\n * @param A\r\n */\n\nfunction per(A) {\n return [A[1], -A[0]];\n}\n/**\r\n * Dot product\r\n * @param A\r\n * @param B\r\n */\n\nfunction dpr(A, B) {\n return A[0] * B[0] + A[1] * B[1];\n}\n/**\r\n * Length of the vector\r\n * @param A\r\n */\n\nfunction len(A) {\n return Math.hypot(A[0], A[1]);\n}\n/**\r\n * Length of the vector squared\r\n * @param A\r\n */\n\nfunction len2(A) {\n return A[0] * A[0] + A[1] * A[1];\n}\n/**\r\n * Dist length from A to B squared.\r\n * @param A\r\n * @param B\r\n */\n\nfunction dist2(A, B) {\n return len2(sub(A, B));\n}\n/**\r\n * Get normalized / unit vector.\r\n * @param A\r\n */\n\nfunction uni(A) {\n return div(A, len(A));\n}\n/**\r\n * Dist length from A to B\r\n * @param A\r\n * @param B\r\n */\n\nfunction dist(A, B) {\n return Math.hypot(A[1] - B[1], A[0] - B[0]);\n}\n/**\r\n * Rotate a vector around another vector by r (radians)\r\n * @param A vector\r\n * @param C center\r\n * @param r rotation in radians\r\n */\n\nfunction rotAround(A, C, r) {\n var s = Math.sin(r);\n var c = Math.cos(r);\n var px = A[0] - C[0];\n var py = A[1] - C[1];\n var nx = px * c - py * s;\n var ny = px * s + py * c;\n return [nx + C[0], ny + C[1]];\n}\n/**\r\n * Interpolate vector A to B with a scalar t\r\n * @param A\r\n * @param B\r\n * @param t scalar\r\n */\n\nfunction lrp(A, B, t) {\n return add(A, mul(vec(A, B), t));\n}\n\nvar min = Math.min,\n PI = Math.PI;\n/**\r\n * ## getStrokePoints\r\n * @description Get points for a stroke.\r\n * @param points An array of points (as `[x, y, pressure]` or `{x, y, pressure}`). Pressure is optional.\r\n * @param streamline How much to streamline the stroke.\r\n * @param size The stroke's size.\r\n */\n\nfunction getStrokePoints(points, options) {\n var _options$simulatePres = options.simulatePressure,\n simulatePressure = _options$simulatePres === void 0 ? true : _options$simulatePres,\n _options$streamline = options.streamline,\n streamline = _options$streamline === void 0 ? 0.5 : _options$streamline,\n _options$size = options.size,\n size = _options$size === void 0 ? 8 : _options$size;\n streamline /= 2;\n\n if (!simulatePressure) {\n streamline /= 2;\n }\n\n var pts = toPointsArray(points);\n var len = pts.length;\n if (len === 0) return [];\n if (len === 1) pts.push(add(pts[0], [1, 0]));\n var strokePoints = [{\n point: [pts[0][0], pts[0][1]],\n pressure: pts[0][2],\n vector: [0, 0],\n distance: 0,\n runningLength: 0\n }];\n\n for (var i = 1, curr = pts[i], prev = strokePoints[0]; i < pts.length; i++, curr = pts[i], prev = strokePoints[i - 1]) {\n var point = lrp(prev.point, curr, 1 - streamline),\n pressure = curr[2],\n vector = uni(vec(point, prev.point)),\n distance = dist(point, prev.point),\n runningLength = prev.runningLength + distance;\n strokePoints.push({\n point: point,\n pressure: pressure,\n vector: vector,\n distance: distance,\n runningLength: runningLength\n });\n }\n /*\r\n Align vectors at the end of the line\r\n Starting from the last point, work back until we've traveled more than\r\n half of the line's size (width). Take the current point's vector and then\r\n work forward, setting all remaining points' vectors to this vector. This\r\n removes the \"noise\" at the end of the line and allows for a better-facing\r\n end cap.\r\n */\n\n\n var totalLength = strokePoints[len - 1].runningLength;\n\n for (var _i = len - 2; _i > 1; _i--) {\n var _strokePoints$_i = strokePoints[_i],\n _runningLength = _strokePoints$_i.runningLength,\n _vector = _strokePoints$_i.vector;\n var dpr$1 = dpr(strokePoints[_i - 1].vector, strokePoints[_i].vector);\n\n if (totalLength - _runningLength > size / 2 || dpr$1 < 0.8) {\n for (var j = _i; j < len; j++) {\n strokePoints[j].vector = _vector;\n }\n\n break;\n }\n }\n\n return strokePoints;\n}\n/**\r\n * ## getStrokeOutlinePoints\r\n * @description Get an array of points (as `[x, y]`) representing the outline of a stroke.\r\n * @param points An array of points (as `[x, y, pressure]` or `{x, y, pressure}`). Pressure is optional.\r\n * @param options An (optional) object with options.\r\n * @param options.size\tThe base size (diameter) of the stroke.\r\n * @param options.thinning The effect of pressure on the stroke's size.\r\n * @param options.smoothing\tHow much to soften the stroke's edges.\r\n * @param options.easing\tAn easing function to apply to each point's pressure.\r\n * @param options.simulatePressure Whether to simulate pressure based on velocity.\r\n * @param options.start Tapering and easing function for the start of the line.\r\n * @param options.end Tapering and easing function for the end of the line.\r\n * @param options.last Whether to handle the points as a completed stroke.\r\n */\n\nfunction getStrokeOutlinePoints(points, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$size2 = _options.size,\n size = _options$size2 === void 0 ? 8 : _options$size2,\n _options$thinning = _options.thinning,\n thinning = _options$thinning === void 0 ? 0.5 : _options$thinning,\n _options$smoothing = _options.smoothing,\n smoothing = _options$smoothing === void 0 ? 0.5 : _options$smoothing,\n _options$simulatePres2 = _options.simulatePressure,\n simulatePressure = _options$simulatePres2 === void 0 ? true : _options$simulatePres2,\n _options$easing = _options.easing,\n easing = _options$easing === void 0 ? function (t) {\n return t;\n } : _options$easing,\n _options$start = _options.start,\n start = _options$start === void 0 ? {} : _options$start,\n _options$end = _options.end,\n end = _options$end === void 0 ? {} : _options$end,\n _options$last = _options.last,\n isComplete = _options$last === void 0 ? false : _options$last;\n var _options2 = options,\n _options2$streamline = _options2.streamline,\n streamline = _options2$streamline === void 0 ? 0.5 : _options2$streamline;\n streamline /= 2;\n var _start$taper = start.taper,\n taperStart = _start$taper === void 0 ? 0 : _start$taper,\n _start$easing = start.easing,\n taperStartEase = _start$easing === void 0 ? function (t) {\n return t * (2 - t);\n } : _start$easing;\n var _end$taper = end.taper,\n taperEnd = _end$taper === void 0 ? 0 : _end$taper,\n _end$easing = end.easing,\n taperEndEase = _end$easing === void 0 ? function (t) {\n return --t * t * t + 1;\n } : _end$easing; // The number of points in the array\n\n var len = points.length; // We can't do anything with an empty array.\n\n if (len === 0) return []; // The total length of the line\n\n var totalLength = points[len - 1].runningLength; // Our collected left and right points\n\n var leftPts = [];\n var rightPts = []; // Previous pressure (start with average of first five pressures)\n\n var prevPressure = points.slice(0, 5).reduce(function (acc, cur) {\n return (acc + cur.pressure) / 2;\n }, points[0].pressure); // The current radius\n\n var radius = getStrokeRadius(size, thinning, easing, points[len - 1].pressure); // Previous vector\n\n var prevVector = points[0].vector; // Previous left and right points\n\n var pl = points[0].point;\n var pr = pl; // Temporary left and right points\n\n var tl = pl;\n var tr = pr;\n /*\r\n Find the outline's left and right points\r\n Iterating through the points and populate the rightPts and leftPts arrays,\r\n skipping the first and last pointsm, which will get caps later on.\r\n */\n\n for (var i = 1; i < len - 1; i++) {\n var _points$i = points[i],\n point = _points$i.point,\n pressure = _points$i.pressure,\n vector = _points$i.vector,\n distance = _points$i.distance,\n runningLength = _points$i.runningLength;\n /*\r\n Calculate the radius\r\n If not thinning, the current point's radius will be half the size; or\r\n otherwise, the size will be based on the current (real or simulated)\r\n pressure.\r\n */\n\n if (thinning) {\n if (simulatePressure) {\n var rp = min(1, 1 - distance / size);\n var sp = min(1, distance / size);\n pressure = min(1, prevPressure + (rp - prevPressure) * (sp / 2));\n }\n\n radius = getStrokeRadius(size, thinning, easing, pressure);\n } else {\n radius = size / 2;\n }\n /*\r\n Apply tapering\r\n If the current length is within the taper distance at either the\r\n start or the end, calculate the taper strengths. Apply the smaller\r\n of the two taper strengths to the radius.\r\n */\n\n\n var ts = runningLength < taperStart ? taperStartEase(runningLength / taperStart) : 1;\n var te = totalLength - runningLength < taperEnd ? taperEndEase((totalLength - runningLength) / taperEnd) : 1;\n radius *= Math.min(ts, te);\n /*\r\n Handle sharp corners\r\n Find the difference (dot product) between the current and next vector.\r\n If the next vector is at more than a right angle to the current vector,\r\n draw a cap at the current point.\r\n */\n\n var nextVector = points[i + 1].vector;\n var dpr$1 = dpr(vector, nextVector);\n\n if (dpr$1 < 0) {\n var _offset = mul(per(prevVector), radius);\n\n var la = add(point, _offset);\n var ra = sub(point, _offset);\n\n for (var t = 0.2; t < 1; t += 0.2) {\n tr = rotAround(la, point, PI * -t);\n tl = rotAround(ra, point, PI * t);\n rightPts.push(tr);\n leftPts.push(tl);\n }\n\n pl = tl;\n pr = tr;\n continue;\n }\n /*\r\n Add regular points\r\n Project points to either side of the current point, using the\r\n calculated size as a distance. If a point's distance to the\r\n previous point on that side greater than the minimum distance\r\n (or if the corner is kinda sharp), add the points to the side's\r\n points array.\r\n */\n\n\n var offset = mul(per(lrp(nextVector, vector, dpr$1)), radius);\n tl = sub(point, offset);\n tr = add(point, offset);\n var alwaysAdd = i === 1 || dpr$1 < 0.25;\n var minDistance = Math.pow((runningLength > size ? size : size / 2) * smoothing, 2);\n\n if (alwaysAdd || dist2(pl, tl) > minDistance) {\n leftPts.push(lrp(pl, tl, streamline));\n pl = tl;\n }\n\n if (alwaysAdd || dist2(pr, tr) > minDistance) {\n rightPts.push(lrp(pr, tr, streamline));\n pr = tr;\n } // Set variables for next iteration\n\n\n prevPressure = pressure;\n prevVector = vector;\n }\n /*\r\n Drawing caps\r\n \n Now that we have our points on either side of the line, we need to\r\n draw caps at the start and end. Tapered lines don't have caps, but\r\n may have dots for very short lines.\r\n */\n\n\n var firstPoint = points[0];\n var lastPoint = points[len - 1];\n var isVeryShort = rightPts.length < 2 || leftPts.length < 2;\n /*\r\n Draw a dot for very short or completed strokes\r\n \n If the line is too short to gather left or right points and if the line is\r\n not tapered on either side, draw a dot. If the line is tapered, then only\r\n draw a dot if the line is both very short and complete. If we draw a dot,\r\n we can just return those points.\r\n */\n\n if (isVeryShort && (!(taperStart || taperEnd) || isComplete)) {\n var ir = 0;\n\n for (var _i2 = 0; _i2 < len; _i2++) {\n var _points$_i = points[_i2],\n _pressure = _points$_i.pressure,\n _runningLength2 = _points$_i.runningLength;\n\n if (_runningLength2 > size) {\n ir = getStrokeRadius(size, thinning, easing, _pressure);\n break;\n }\n }\n\n var _start = sub(firstPoint.point, mul(per(uni(vec(lastPoint.point, firstPoint.point))), ir || radius));\n\n var dotPts = [];\n\n for (var _t = 0, step = 0.1; _t <= 1; _t += step) {\n dotPts.push(rotAround(_start, firstPoint.point, PI * 2 * _t));\n }\n\n return dotPts;\n }\n /*\r\n Draw a start cap\r\n Unless the line has a tapered start, or unless the line has a tapered end\r\n and the line is very short, draw a start cap around the first point. Use\r\n the distance between the second left and right point for the cap's radius.\r\n Finally remove the first left and right points. :psyduck:\r\n */\n\n\n var startCap = [];\n\n if (!taperStart && !(taperEnd && isVeryShort)) {\n tr = rightPts[1];\n tl = leftPts[1];\n\n var _start2 = sub(firstPoint.point, mul(uni(vec(tr, tl)), dist(tr, tl) / 2));\n\n for (var _t2 = 0, _step = 0.2; _t2 <= 1; _t2 += _step) {\n startCap.push(rotAround(_start2, firstPoint.point, PI * _t2));\n }\n\n leftPts.shift();\n rightPts.shift();\n }\n /*\r\n Draw an end cap\r\n If the line does not have a tapered end, and unless the line has a tapered\r\n start and the line is very short, draw a cap around the last point. Finally,\r\n remove the last left and right points. Otherwise, add the last point. Note\r\n that This cap is a full-turn-and-a-half: this prevents incorrect caps on\r\n sharp end turns.\r\n */\n\n\n var endCap = [];\n\n if (!taperEnd && !(taperStart && isVeryShort)) {\n var _start3 = sub(lastPoint.point, mul(per(lastPoint.vector), radius));\n\n for (var _t3 = 0, _step2 = 0.1; _t3 <= 1; _t3 += _step2) {\n endCap.push(rotAround(_start3, lastPoint.point, PI * 3 * _t3));\n }\n } else {\n endCap.push(lastPoint.point);\n }\n /*\r\n Return the points in the correct windind order: begin on the left side, then\r\n continue around the end cap, then come back along the right side, and finally\r\n complete the start cap.\r\n */\n\n\n return leftPts.concat(endCap, rightPts.reverse(), startCap);\n}\n/**\r\n * ## getStroke\r\n * @description Returns a stroke as an array of outline points.\r\n * @param points An array of points (as `[x, y, pressure]` or `{x, y, pressure}`). Pressure is optional.\r\n * @param options An (optional) object with options.\r\n * @param options.size\tThe base size (diameter) of the stroke.\r\n * @param options.thinning The effect of pressure on the stroke's size.\r\n * @param options.smoothing\tHow much to soften the stroke's edges.\r\n * @param options.easing\tAn easing function to apply to each point's pressure.\r\n * @param options.simulatePressure Whether to simulate pressure based on velocity.\r\n * @param options.start Tapering and easing function for the start of the line.\r\n * @param options.end Tapering and easing function for the end of the line.\r\n * @param options.last Whether to handle the points as a completed stroke.\r\n */\n\nfunction getStroke(points, options) {\n if (options === void 0) {\n options = {};\n }\n\n return getStrokeOutlinePoints(getStrokePoints(points, options), options);\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (getStroke);\n\n//# sourceMappingURL=perfect-freehand.esm.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BlcmZlY3QtZnJlZWhhbmQvZGlzdC9wZXJmZWN0LWZyZWVoYW5kLmVzbS5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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QTs7QUFFQTtBQUNBOztBQUVBLG9DQUFvQyxVQUFVO0FBQzlDO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0UsZUFBZTtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlFQUFlLFNBQVMsRUFBQztBQUMwQjtBQUNuRCIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGVyZmVjdC1mcmVlaGFuZC9kaXN0L3BlcmZlY3QtZnJlZWhhbmQuZXNtLmpzPzU2NTYiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gbGVycCh5MSwgeTIsIG11KSB7XG4gIHJldHVybiB5MSAqICgxIC0gbXUpICsgeTIgKiBtdTtcbn1cbmZ1bmN0aW9uIGNsYW1wKG4sIGEsIGIpIHtcbiAgcmV0dXJuIE1hdGgubWF4KGEsIE1hdGgubWluKGIsIG4pKTtcbn1cbi8qKlxyXG4gKiBDb252ZXJ0IGFuIGFycmF5IG9mIHBvaW50cyB0byB0aGUgY29ycmVjdCBmb3JtYXQgKFt4LCB5LCByYWRpdXNdKVxyXG4gKiBAcGFyYW0gcG9pbnRzXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xuXG5mdW5jdGlvbiB0b1BvaW50c0FycmF5KHBvaW50cykge1xuICBpZiAoQXJyYXkuaXNBcnJheShwb2ludHNbMF0pKSB7XG4gICAgcmV0dXJuIHBvaW50cy5tYXAoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciB4ID0gX3JlZlswXSxcbiAgICAgICAgICB5ID0gX3JlZlsxXSxcbiAgICAgICAgICBfcmVmJCA9IF9yZWZbMl0sXG4gICAgICAgICAgcHJlc3N1cmUgPSBfcmVmJCA9PT0gdm9pZCAwID8gMC41IDogX3JlZiQ7XG4gICAgICByZXR1cm4gW3gsIHksIHByZXNzdXJlXTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcG9pbnRzLm1hcChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICAgIHZhciB4ID0gX3JlZjIueCxcbiAgICAgICAgICB5ID0gX3JlZjIueSxcbiAgICAgICAgICBfcmVmMiRwcmVzc3VyZSA9IF9yZWYyLnByZXNzdXJlLFxuICAgICAgICAgIHByZXNzdXJlID0gX3JlZjIkcHJlc3N1cmUgPT09IHZvaWQgMCA/IDAuNSA6IF9yZWYyJHByZXNzdXJlO1xuICAgICAgcmV0dXJuIFt4LCB5LCBwcmVzc3VyZV07XG4gICAgfSk7XG4gIH1cbn1cbi8qKlxyXG4gKiBDb21wdXRlIGEgcmFkaXVzIGJhc2VkIG9uIHRoZSBwcmVzc3VyZS5cclxuICogQHBhcmFtIHNpemVcclxuICogQHBhcmFtIHRoaW5uaW5nXHJcbiAqIEBwYXJhbSBlYXNpbmdcclxuICogQHBhcmFtIHByZXNzdXJlXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xuXG5mdW5jdGlvbiBnZXRTdHJva2VSYWRpdXMoc2l6ZSwgdGhpbm5pbmcsIGVhc2luZywgcHJlc3N1cmUpIHtcbiAgaWYgKHByZXNzdXJlID09PSB2b2lkIDApIHtcbiAgICBwcmVzc3VyZSA9IDAuNTtcbiAgfVxuXG4gIGlmICghdGhpbm5pbmcpIHJldHVybiBzaXplIC8gMjtcbiAgcHJlc3N1cmUgPSBjbGFtcChlYXNpbmcocHJlc3N1cmUpLCAwLCAxKTtcbiAgcmV0dXJuICh0aGlubmluZyA8IDAgPyBsZXJwKHNpemUsIHNpemUgKyBzaXplICogY2xhbXAodGhpbm5pbmcsIC0wLjk1LCAtMC4wNSksIHByZXNzdXJlKSA6IGxlcnAoc2l6ZSAtIHNpemUgKiBjbGFtcCh0aGlubmluZywgMC4wNSwgMC45NSksIHNpemUsIHByZXNzdXJlKSkgLyAyO1xufVxuXG4vKipcclxuICogTmVnYXRlIGEgdmVjdG9yLlxyXG4gKiBAcGFyYW0gQVxyXG4gKi9cbi8qKlxyXG4gKiBBZGQgdmVjdG9ycy5cclxuICogQHBhcmFtIEFcclxuICogQHBhcmFtIEJcclxuICovXG5cbmZ1bmN0aW9uIGFkZChBLCBCKSB7XG4gIHJldHVybiBbQVswXSArIEJbMF0sIEFbMV0gKyBCWzFdXTtcbn1cbi8qKlxyXG4gKiBTdWJ0cmFjdCB2ZWN0b3JzLlxyXG4gKiBAcGFyYW0gQVxyXG4gKiBAcGFyYW0gQlxyXG4gKi9cblxuZnVuY3Rpb24gc3ViKEEsIEIpIHtcbiAgcmV0dXJuIFtBWzBdIC0gQlswXSwgQVsxXSAtIEJbMV1dO1xufVxuLyoqXHJcbiAqIEdldCB0aGUgdmVjdG9yIGZyb20gdmVjdG9ycyBBIHRvIEIuXHJcbiAqIEBwYXJhbSBBXHJcbiAqIEBwYXJhbSBCXHJcbiAqL1xuXG5mdW5jdGlvbiB2ZWMoQSwgQikge1xuICAvLyBBLCBCIGFzIHZlY3RvcnMgZ2V0IHRoZSB2ZWN0b3IgZnJvbSBBIHRvIEJcbiAgcmV0dXJuIFtCWzBdIC0gQVswXSwgQlsxXSAtIEFbMV1dO1xufVxuLyoqXHJcbiAqIFZlY3RvciBtdWx0aXBsaWNhdGlvbiBieSBzY2FsYXJcclxuICogQHBhcmFtIEFcclxuICogQHBhcmFtIG5cclxuICovXG5cbmZ1bmN0aW9uIG11bChBLCBuKSB7XG4gIHJldHVybiBbQVswXSAqIG4sIEFbMV0gKiBuXTtcbn1cbi8qKlxyXG4gKiBWZWN0b3IgZGl2aXNpb24gYnkgc2NhbGFyLlxyXG4gKiBAcGFyYW0gQVxyXG4gKiBAcGFyYW0gblxyXG4gKi9cblxuZnVuY3Rpb24gZGl2KEEsIG4pIHtcbiAgcmV0dXJuIFtBWzBdIC8gbiwgQVsxXSAvIG5dO1xufVxuLyoqXHJcbiAqIFBlcnBlbmRpY3VsYXIgcm90YXRpb24gb2YgYSB2ZWN0b3IgQVxyXG4gKiBAcGFyYW0gQVxyXG4gKi9cblxuZnVuY3Rpb24gcGVyKEEpIHtcbiAgcmV0dXJuIFtBWzFdLCAtQVswXV07XG59XG4vKipcclxuICogRG90IHByb2R1Y3RcclxuICogQHBhcmFtIEFcclxuICogQHBhcmFtIEJcclxuICovXG5cbmZ1bmN0aW9uIGRwcihBLCBCKSB7XG4gIHJldHVybiBBWzBdICogQlswXSArIEFbMV0gKiBCWzFdO1xufVxuLyoqXHJcbiAqIExlbmd0aCBvZiB0aGUgdmVjdG9yXHJcbiAqIEBwYXJhbSBBXHJcbiAqL1xuXG5mdW5jdGlvbiBsZW4oQSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChBWzBdLCBBWzFdKTtcbn1cbi8qKlxyXG4gKiBMZW5ndGggb2YgdGhlIHZlY3RvciBzcXVhcmVkXHJcbiAqIEBwYXJhbSBBXHJcbiAqL1xuXG5mdW5jdGlvbiBsZW4yKEEpIHtcbiAgcmV0dXJuIEFbMF0gKiBBWzBdICsgQVsxXSAqIEFbMV07XG59XG4vKipcclxuICogRGlzdCBsZW5ndGggZnJvbSBBIHRvIEIgc3F1YXJlZC5cclxuICogQHBhcmFtIEFcclxuICogQHBhcmFtIEJcclxuICovXG5cbmZ1bmN0aW9uIGRpc3QyKEEsIEIpIHtcbiAgcmV0dXJuIGxlbjIoc3ViKEEsIEIpKTtcbn1cbi8qKlxyXG4gKiBHZXQgbm9ybWFsaXplZCAvIHVuaXQgdmVjdG9yLlxyXG4gKiBAcGFyYW0gQVxyXG4gKi9cblxuZnVuY3Rpb24gdW5pKEEpIHtcbiAgcmV0dXJuIGRpdihBLCBsZW4oQSkpO1xufVxuLyoqXHJcbiAqIERpc3QgbGVuZ3RoIGZyb20gQSB0byBCXHJcbiAqIEBwYXJhbSBBXHJcbiAqIEBwYXJhbSBCXHJcbiAqL1xuXG5mdW5jdGlvbiBkaXN0KEEsIEIpIHtcbiAgcmV0dXJuIE1hdGguaHlwb3QoQVsxXSAtIEJbMV0sIEFbMF0gLSBCWzBdKTtcbn1cbi8qKlxyXG4gKiBSb3RhdGUgYSB2ZWN0b3IgYXJvdW5kIGFub3RoZXIgdmVjdG9yIGJ5IHIgKHJhZGlhbnMpXHJcbiAqIEBwYXJhbSBBIHZlY3RvclxyXG4gKiBAcGFyYW0gQyBjZW50ZXJcclxuICogQHBhcmFtIHIgcm90YXRpb24gaW4gcmFkaWFuc1xyXG4gKi9cblxuZnVuY3Rpb24gcm90QXJvdW5kKEEsIEMsIHIpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyKTtcbiAgdmFyIHB4ID0gQVswXSAtIENbMF07XG4gIHZhciBweSA9IEFbMV0gLSBDWzFdO1xuICB2YXIgbnggPSBweCAqIGMgLSBweSAqIHM7XG4gIHZhciBueSA9IHB4ICogcyArIHB5ICogYztcbiAgcmV0dXJuIFtueCArIENbMF0sIG55ICsgQ1sxXV07XG59XG4vKipcclxuICogSW50ZXJwb2xhdGUgdmVjdG9yIEEgdG8gQiB3aXRoIGEgc2NhbGFyIHRcclxuICogQHBhcmFtIEFcclxuICogQHBhcmFtIEJcclxuICogQHBhcmFtIHQgc2NhbGFyXHJcbiAqL1xuXG5mdW5jdGlvbiBscnAoQSwgQiwgdCkge1xuICByZXR1cm4gYWRkKEEsIG11bCh2ZWMoQSwgQiksIHQpKTtcbn1cblxudmFyIG1pbiA9IE1hdGgubWluLFxuICAgIFBJID0gTWF0aC5QSTtcbi8qKlxyXG4gKiAjIyBnZXRTdHJva2VQb2ludHNcclxuICogQGRlc2NyaXB0aW9uIEdldCBwb2ludHMgZm9yIGEgc3Ryb2tlLlxyXG4gKiBAcGFyYW0gcG9pbnRzIEFuIGFycmF5IG9mIHBvaW50cyAoYXMgYFt4LCB5LCBwcmVzc3VyZV1gIG9yIGB7eCwgeSwgcHJlc3N1cmV9YCkuIFByZXNzdXJlIGlzIG9wdGlvbmFsLlxyXG4gKiBAcGFyYW0gc3RyZWFtbGluZSBIb3cgbXVjaCB0byBzdHJlYW1saW5lIHRoZSBzdHJva2UuXHJcbiAqIEBwYXJhbSBzaXplIFRoZSBzdHJva2UncyBzaXplLlxyXG4gKi9cblxuZnVuY3Rpb24gZ2V0U3Ryb2tlUG9pbnRzKHBvaW50cywgb3B0aW9ucykge1xuICB2YXIgX29wdGlvbnMkc2ltdWxhdGVQcmVzID0gb3B0aW9ucy5zaW11bGF0ZVByZXNzdXJlLFxuICAgICAgc2ltdWxhdGVQcmVzc3VyZSA9IF9vcHRpb25zJHNpbXVsYXRlUHJlcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHNpbXVsYXRlUHJlcyxcbiAgICAgIF9vcHRpb25zJHN0cmVhbWxpbmUgPSBvcHRpb25zLnN0cmVhbWxpbmUsXG4gICAgICBzdHJlYW1saW5lID0gX29wdGlvbnMkc3RyZWFtbGluZSA9PT0gdm9pZCAwID8gMC41IDogX29wdGlvbnMkc3RyZWFtbGluZSxcbiAgICAgIF9vcHRpb25zJHNpemUgPSBvcHRpb25zLnNpemUsXG4gICAgICBzaXplID0gX29wdGlvbnMkc2l6ZSA9PT0gdm9pZCAwID8gOCA6IF9vcHRpb25zJHNpemU7XG4gIHN0cmVhbWxpbmUgLz0gMjtcblxuICBpZiAoIXNpbXVsYXRlUHJlc3N1cmUpIHtcbiAgICBzdHJlYW1saW5lIC89IDI7XG4gIH1cblxuICB2YXIgcHRzID0gdG9Qb2ludHNBcnJheShwb2ludHMpO1xuICB2YXIgbGVuID0gcHRzLmxlbmd0aDtcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIFtdO1xuICBpZiAobGVuID09PSAxKSBwdHMucHVzaChhZGQocHRzWzBdLCBbMSwgMF0pKTtcbiAgdmFyIHN0cm9rZVBvaW50cyA9IFt7XG4gICAgcG9pbnQ6IFtwdHNbMF1bMF0sIHB0c1swXVsxXV0sXG4gICAgcHJlc3N1cmU6IHB0c1swXVsyXSxcbiAgICB2ZWN0b3I6IFswLCAwXSxcbiAgICBkaXN0YW5jZTogMCxcbiAgICBydW5uaW5nTGVuZ3RoOiAwXG4gIH1dO1xuXG4gIGZvciAodmFyIGkgPSAxLCBjdXJyID0gcHRzW2ldLCBwcmV2ID0gc3Ryb2tlUG9pbnRzWzBdOyBpIDwgcHRzLmxlbmd0aDsgaSsrLCBjdXJyID0gcHRzW2ldLCBwcmV2ID0gc3Ryb2tlUG9pbnRzW2kgLSAxXSkge1xuICAgIHZhciBwb2ludCA9IGxycChwcmV2LnBvaW50LCBjdXJyLCAxIC0gc3RyZWFtbGluZSksXG4gICAgICAgIHByZXNzdXJlID0gY3VyclsyXSxcbiAgICAgICAgdmVjdG9yID0gdW5pKHZlYyhwb2ludCwgcHJldi5wb2ludCkpLFxuICAgICAgICBkaXN0YW5jZSA9IGRpc3QocG9pbnQsIHByZXYucG9pbnQpLFxuICAgICAgICBydW5uaW5nTGVuZ3RoID0gcHJldi5ydW5uaW5nTGVuZ3RoICsgZGlzdGFuY2U7XG4gICAgc3Ryb2tlUG9pbnRzLnB1c2goe1xuICAgICAgcG9pbnQ6IHBvaW50LFxuICAgICAgcHJlc3N1cmU6IHByZXNzdXJlLFxuICAgICAgdmVjdG9yOiB2ZWN0b3IsXG4gICAgICBkaXN0YW5jZTogZGlzdGFuY2UsXG4gICAgICBydW5uaW5nTGVuZ3RoOiBydW5uaW5nTGVuZ3RoXG4gICAgfSk7XG4gIH1cbiAgLypcclxuICAgIEFsaWduIHZlY3RvcnMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZVxyXG4gICAgICAgU3RhcnRpbmcgZnJvbSB0aGUgbGFzdCBwb2ludCwgd29yayBiYWNrIHVudGlsIHdlJ3ZlIHRyYXZlbGVkIG1vcmUgdGhhblxyXG4gICAgaGFsZiBvZiB0aGUgbGluZSdzIHNpemUgKHdpZHRoKS4gVGFrZSB0aGUgY3VycmVudCBwb2ludCdzIHZlY3RvciBhbmQgdGhlblxyXG4gICAgd29yayBmb3J3YXJkLCBzZXR0aW5nIGFsbCByZW1haW5pbmcgcG9pbnRzJyB2ZWN0b3JzIHRvIHRoaXMgdmVjdG9yLiBUaGlzXHJcbiAgICByZW1vdmVzIHRoZSBcIm5vaXNlXCIgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBhbmQgYWxsb3dzIGZvciBhIGJldHRlci1mYWNpbmdcclxuICAgIGVuZCBjYXAuXHJcbiAgKi9cblxuXG4gIHZhciB0b3RhbExlbmd0aCA9IHN0cm9rZVBvaW50c1tsZW4gLSAxXS5ydW5uaW5nTGVuZ3RoO1xuXG4gIGZvciAodmFyIF9pID0gbGVuIC0gMjsgX2kgPiAxOyBfaS0tKSB7XG4gICAgdmFyIF9zdHJva2VQb2ludHMkX2kgPSBzdHJva2VQb2ludHNbX2ldLFxuICAgICAgICBfcnVubmluZ0xlbmd0aCA9IF9zdHJva2VQb2ludHMkX2kucnVubmluZ0xlbmd0aCxcbiAgICAgICAgX3ZlY3RvciA9IF9zdHJva2VQb2ludHMkX2kudmVjdG9yO1xuICAgIHZhciBkcHIkMSA9IGRwcihzdHJva2VQb2ludHNbX2kgLSAxXS52ZWN0b3IsIHN0cm9rZVBvaW50c1tfaV0udmVjdG9yKTtcblxuICAgIGlmICh0b3RhbExlbmd0aCAtIF9ydW5uaW5nTGVuZ3RoID4gc2l6ZSAvIDIgfHwgZHByJDEgPCAwLjgpIHtcbiAgICAgIGZvciAodmFyIGogPSBfaTsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgIHN0cm9rZVBvaW50c1tqXS52ZWN0b3IgPSBfdmVjdG9yO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3Ryb2tlUG9pbnRzO1xufVxuLyoqXHJcbiAqICMjIGdldFN0cm9rZU91dGxpbmVQb2ludHNcclxuICogQGRlc2NyaXB0aW9uIEdldCBhbiBhcnJheSBvZiBwb2ludHMgKGFzIGBbeCwgeV1gKSByZXByZXNlbnRpbmcgdGhlIG91dGxpbmUgb2YgYSBzdHJva2UuXHJcbiAqIEBwYXJhbSBwb2ludHMgQW4gYXJyYXkgb2YgcG9pbnRzIChhcyBgW3gsIHksIHByZXNzdXJlXWAgb3IgYHt4LCB5LCBwcmVzc3VyZX1gKS4gUHJlc3N1cmUgaXMgb3B0aW9uYWwuXHJcbiAqIEBwYXJhbSBvcHRpb25zIEFuIChvcHRpb25hbCkgb2JqZWN0IHdpdGggb3B0aW9ucy5cclxuICogQHBhcmFtIG9wdGlvbnMuc2l6ZVx0VGhlIGJhc2Ugc2l6ZSAoZGlhbWV0ZXIpIG9mIHRoZSBzdHJva2UuXHJcbiAqIEBwYXJhbSBvcHRpb25zLnRoaW5uaW5nIFRoZSBlZmZlY3Qgb2YgcHJlc3N1cmUgb24gdGhlIHN0cm9rZSdzIHNpemUuXHJcbiAqIEBwYXJhbSBvcHRpb25zLnNtb290aGluZ1x0SG93IG11Y2ggdG8gc29mdGVuIHRoZSBzdHJva2UncyBlZGdlcy5cclxuICogQHBhcmFtIG9wdGlvbnMuZWFzaW5nXHRBbiBlYXNpbmcgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBwb2ludCdzIHByZXNzdXJlLlxyXG4gKiBAcGFyYW0gb3B0aW9ucy5zaW11bGF0ZVByZXNzdXJlIFdoZXRoZXIgdG8gc2ltdWxhdGUgcHJlc3N1cmUgYmFzZWQgb24gdmVsb2NpdHkuXHJcbiAqIEBwYXJhbSBvcHRpb25zLnN0YXJ0IFRhcGVyaW5nIGFuZCBlYXNpbmcgZnVuY3Rpb24gZm9yIHRoZSBzdGFydCBvZiB0aGUgbGluZS5cclxuICogQHBhcmFtIG9wdGlvbnMuZW5kIFRhcGVyaW5nIGFuZCBlYXNpbmcgZnVuY3Rpb24gZm9yIHRoZSBlbmQgb2YgdGhlIGxpbmUuXHJcbiAqIEBwYXJhbSBvcHRpb25zLmxhc3QgV2hldGhlciB0byBoYW5kbGUgdGhlIHBvaW50cyBhcyBhIGNvbXBsZXRlZCBzdHJva2UuXHJcbiAqL1xuXG5mdW5jdGlvbiBnZXRTdHJva2VPdXRsaW5lUG9pbnRzKHBvaW50cywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIF9vcHRpb25zJHNpemUyID0gX29wdGlvbnMuc2l6ZSxcbiAgICAgIHNpemUgPSBfb3B0aW9ucyRzaXplMiA9PT0gdm9pZCAwID8gOCA6IF9vcHRpb25zJHNpemUyLFxuICAgICAgX29wdGlvbnMkdGhpbm5pbmcgPSBfb3B0aW9ucy50aGlubmluZyxcbiAgICAgIHRoaW5uaW5nID0gX29wdGlvbnMkdGhpbm5pbmcgPT09IHZvaWQgMCA/IDAuNSA6IF9vcHRpb25zJHRoaW5uaW5nLFxuICAgICAgX29wdGlvbnMkc21vb3RoaW5nID0gX29wdGlvbnMuc21vb3RoaW5nLFxuICAgICAgc21vb3RoaW5nID0gX29wdGlvbnMkc21vb3RoaW5nID09PSB2b2lkIDAgPyAwLjUgOiBfb3B0aW9ucyRzbW9vdGhpbmcsXG4gICAgICBfb3B0aW9ucyRzaW11bGF0ZVByZXMyID0gX29wdGlvbnMuc2ltdWxhdGVQcmVzc3VyZSxcbiAgICAgIHNpbXVsYXRlUHJlc3N1cmUgPSBfb3B0aW9ucyRzaW11bGF0ZVByZXMyID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkc2ltdWxhdGVQcmVzMixcbiAgICAgIF9vcHRpb25zJGVhc2luZyA9IF9vcHRpb25zLmVhc2luZyxcbiAgICAgIGVhc2luZyA9IF9vcHRpb25zJGVhc2luZyA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdDtcbiAgfSA6IF9vcHRpb25zJGVhc2luZyxcbiAgICAgIF9vcHRpb25zJHN0YXJ0ID0gX29wdGlvbnMuc3RhcnQsXG4gICAgICBzdGFydCA9IF9vcHRpb25zJHN0YXJ0ID09PSB2b2lkIDAgPyB7fSA6IF9vcHRpb25zJHN0YXJ0LFxuICAgICAgX29wdGlvbnMkZW5kID0gX29wdGlvbnMuZW5kLFxuICAgICAgZW5kID0gX29wdGlvbnMkZW5kID09PSB2b2lkIDAgPyB7fSA6IF9vcHRpb25zJGVuZCxcbiAgICAgIF9vcHRpb25zJGxhc3QgPSBfb3B0aW9ucy5sYXN0LFxuICAgICAgaXNDb21wbGV0ZSA9IF9vcHRpb25zJGxhc3QgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkbGFzdDtcbiAgdmFyIF9vcHRpb25zMiA9IG9wdGlvbnMsXG4gICAgICBfb3B0aW9uczIkc3RyZWFtbGluZSA9IF9vcHRpb25zMi5zdHJlYW1saW5lLFxuICAgICAgc3RyZWFtbGluZSA9IF9vcHRpb25zMiRzdHJlYW1saW5lID09PSB2b2lkIDAgPyAwLjUgOiBfb3B0aW9uczIkc3RyZWFtbGluZTtcbiAgc3RyZWFtbGluZSAvPSAyO1xuICB2YXIgX3N0YXJ0JHRhcGVyID0gc3RhcnQudGFwZXIsXG4gICAgICB0YXBlclN0YXJ0ID0gX3N0YXJ0JHRhcGVyID09PSB2b2lkIDAgPyAwIDogX3N0YXJ0JHRhcGVyLFxuICAgICAgX3N0YXJ0JGVhc2luZyA9IHN0YXJ0LmVhc2luZyxcbiAgICAgIHRhcGVyU3RhcnRFYXNlID0gX3N0YXJ0JGVhc2luZyA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdCAqICgyIC0gdCk7XG4gIH0gOiBfc3RhcnQkZWFzaW5nO1xuICB2YXIgX2VuZCR0YXBlciA9IGVuZC50YXBlcixcbiAgICAgIHRhcGVyRW5kID0gX2VuZCR0YXBlciA9PT0gdm9pZCAwID8gMCA6IF9lbmQkdGFwZXIsXG4gICAgICBfZW5kJGVhc2luZyA9IGVuZC5lYXNpbmcsXG4gICAgICB0YXBlckVuZEVhc2UgPSBfZW5kJGVhc2luZyA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xuICB9IDogX2VuZCRlYXNpbmc7IC8vIFRoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBhcnJheVxuXG4gIHZhciBsZW4gPSBwb2ludHMubGVuZ3RoOyAvLyBXZSBjYW4ndCBkbyBhbnl0aGluZyB3aXRoIGFuIGVtcHR5IGFycmF5LlxuXG4gIGlmIChsZW4gPT09IDApIHJldHVybiBbXTsgLy8gVGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbGluZVxuXG4gIHZhciB0b3RhbExlbmd0aCA9IHBvaW50c1tsZW4gLSAxXS5ydW5uaW5nTGVuZ3RoOyAvLyBPdXIgY29sbGVjdGVkIGxlZnQgYW5kIHJpZ2h0IHBvaW50c1xuXG4gIHZhciBsZWZ0UHRzID0gW107XG4gIHZhciByaWdodFB0cyA9IFtdOyAvLyBQcmV2aW91cyBwcmVzc3VyZSAoc3RhcnQgd2l0aCBhdmVyYWdlIG9mIGZpcnN0IGZpdmUgcHJlc3N1cmVzKVxuXG4gIHZhciBwcmV2UHJlc3N1cmUgPSBwb2ludHMuc2xpY2UoMCwgNSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGN1cikge1xuICAgIHJldHVybiAoYWNjICsgY3VyLnByZXNzdXJlKSAvIDI7XG4gIH0sIHBvaW50c1swXS5wcmVzc3VyZSk7IC8vIFRoZSBjdXJyZW50IHJhZGl1c1xuXG4gIHZhciByYWRpdXMgPSBnZXRTdHJva2VSYWRpdXMoc2l6ZSwgdGhpbm5pbmcsIGVhc2luZywgcG9pbnRzW2xlbiAtIDFdLnByZXNzdXJlKTsgLy8gUHJldmlvdXMgdmVjdG9yXG5cbiAgdmFyIHByZXZWZWN0b3IgPSBwb2ludHNbMF0udmVjdG9yOyAvLyBQcmV2aW91cyBsZWZ0IGFuZCByaWdodCBwb2ludHNcblxuICB2YXIgcGwgPSBwb2ludHNbMF0ucG9pbnQ7XG4gIHZhciBwciA9IHBsOyAvLyBUZW1wb3JhcnkgbGVmdCBhbmQgcmlnaHQgcG9pbnRzXG5cbiAgdmFyIHRsID0gcGw7XG4gIHZhciB0ciA9IHByO1xuICAvKlxyXG4gICAgRmluZCB0aGUgb3V0bGluZSdzIGxlZnQgYW5kIHJpZ2h0IHBvaW50c1xyXG4gICAgICBJdGVyYXRpbmcgdGhyb3VnaCB0aGUgcG9pbnRzIGFuZCBwb3B1bGF0ZSB0aGUgcmlnaHRQdHMgYW5kIGxlZnRQdHMgYXJyYXlzLFxyXG4gICBza2lwcGluZyB0aGUgZmlyc3QgYW5kIGxhc3QgcG9pbnRzbSwgd2hpY2ggd2lsbCBnZXQgY2FwcyBsYXRlciBvbi5cclxuICAqL1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuIC0gMTsgaSsrKSB7XG4gICAgdmFyIF9wb2ludHMkaSA9IHBvaW50c1tpXSxcbiAgICAgICAgcG9pbnQgPSBfcG9pbnRzJGkucG9pbnQsXG4gICAgICAgIHByZXNzdXJlID0gX3BvaW50cyRpLnByZXNzdXJlLFxuICAgICAgICB2ZWN0b3IgPSBfcG9pbnRzJGkudmVjdG9yLFxuICAgICAgICBkaXN0YW5jZSA9IF9wb2ludHMkaS5kaXN0YW5jZSxcbiAgICAgICAgcnVubmluZ0xlbmd0aCA9IF9wb2ludHMkaS5ydW5uaW5nTGVuZ3RoO1xuICAgIC8qXHJcbiAgICAgIENhbGN1bGF0ZSB0aGUgcmFkaXVzXHJcbiAgICAgICAgICAgSWYgbm90IHRoaW5uaW5nLCB0aGUgY3VycmVudCBwb2ludCdzIHJhZGl1cyB3aWxsIGJlIGhhbGYgdGhlIHNpemU7IG9yXHJcbiAgICAgIG90aGVyd2lzZSwgdGhlIHNpemUgd2lsbCBiZSBiYXNlZCBvbiB0aGUgY3VycmVudCAocmVhbCBvciBzaW11bGF0ZWQpXHJcbiAgICAgIHByZXNzdXJlLlxyXG4gICAgKi9cblxuICAgIGlmICh0aGlubmluZykge1xuICAgICAgaWYgKHNpbXVsYXRlUHJlc3N1cmUpIHtcbiAgICAgICAgdmFyIHJwID0gbWluKDEsIDEgLSBkaXN0YW5jZSAvIHNpemUpO1xuICAgICAgICB2YXIgc3AgPSBtaW4oMSwgZGlzdGFuY2UgLyBzaXplKTtcbiAgICAgICAgcHJlc3N1cmUgPSBtaW4oMSwgcHJldlByZXNzdXJlICsgKHJwIC0gcHJldlByZXNzdXJlKSAqIChzcCAvIDIpKTtcbiAgICAgIH1cblxuICAgICAgcmFkaXVzID0gZ2V0U3Ryb2tlUmFkaXVzKHNpemUsIHRoaW5uaW5nLCBlYXNpbmcsIHByZXNzdXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFkaXVzID0gc2l6ZSAvIDI7XG4gICAgfVxuICAgIC8qXHJcbiAgICAgIEFwcGx5IHRhcGVyaW5nXHJcbiAgICAgICAgICAgSWYgdGhlIGN1cnJlbnQgbGVuZ3RoIGlzIHdpdGhpbiB0aGUgdGFwZXIgZGlzdGFuY2UgYXQgZWl0aGVyIHRoZVxyXG4gICAgICBzdGFydCBvciB0aGUgZW5kLCBjYWxjdWxhdGUgdGhlIHRhcGVyIHN0cmVuZ3Rocy4gQXBwbHkgdGhlIHNtYWxsZXJcclxuICAgICAgb2YgdGhlIHR3byB0YXBlciBzdHJlbmd0aHMgdG8gdGhlIHJhZGl1cy5cclxuICAgICovXG5cblxuICAgIHZhciB0cyA9IHJ1bm5pbmdMZW5ndGggPCB0YXBlclN0YXJ0ID8gdGFwZXJTdGFydEVhc2UocnVubmluZ0xlbmd0aCAvIHRhcGVyU3RhcnQpIDogMTtcbiAgICB2YXIgdGUgPSB0b3RhbExlbmd0aCAtIHJ1bm5pbmdMZW5ndGggPCB0YXBlckVuZCA/IHRhcGVyRW5kRWFzZSgodG90YWxMZW5ndGggLSBydW5uaW5nTGVuZ3RoKSAvIHRhcGVyRW5kKSA6IDE7XG4gICAgcmFkaXVzICo9IE1hdGgubWluKHRzLCB0ZSk7XG4gICAgLypcclxuICAgICAgSGFuZGxlIHNoYXJwIGNvcm5lcnNcclxuICAgICAgICAgICBGaW5kIHRoZSBkaWZmZXJlbmNlIChkb3QgcHJvZHVjdCkgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgbmV4dCB2ZWN0b3IuXHJcbiAgICAgIElmIHRoZSBuZXh0IHZlY3RvciBpcyBhdCBtb3JlIHRoYW4gYSByaWdodCBhbmdsZSB0byB0aGUgY3VycmVudCB2ZWN0b3IsXHJcbiAgICAgIGRyYXcgYSBjYXAgYXQgdGhlIGN1cnJlbnQgcG9pbnQuXHJcbiAgICAqL1xuXG4gICAgdmFyIG5leHRWZWN0b3IgPSBwb2ludHNbaSArIDFdLnZlY3RvcjtcbiAgICB2YXIgZHByJDEgPSBkcHIodmVjdG9yLCBuZXh0VmVjdG9yKTtcblxuICAgIGlmIChkcHIkMSA8IDApIHtcbiAgICAgIHZhciBfb2Zmc2V0ID0gbXVsKHBlcihwcmV2VmVjdG9yKSwgcmFkaXVzKTtcblxuICAgICAgdmFyIGxhID0gYWRkKHBvaW50LCBfb2Zmc2V0KTtcbiAgICAgIHZhciByYSA9IHN1Yihwb2ludCwgX29mZnNldCk7XG5cbiAgICAgIGZvciAodmFyIHQgPSAwLjI7IHQgPCAxOyB0ICs9IDAuMikge1xuICAgICAgICB0ciA9IHJvdEFyb3VuZChsYSwgcG9pbnQsIFBJICogLXQpO1xuICAgICAgICB0bCA9IHJvdEFyb3VuZChyYSwgcG9pbnQsIFBJICogdCk7XG4gICAgICAgIHJpZ2h0UHRzLnB1c2godHIpO1xuICAgICAgICBsZWZ0UHRzLnB1c2godGwpO1xuICAgICAgfVxuXG4gICAgICBwbCA9IHRsO1xuICAgICAgcHIgPSB0cjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvKlxyXG4gICAgICBBZGQgcmVndWxhciBwb2ludHNcclxuICAgICAgICAgICBQcm9qZWN0IHBvaW50cyB0byBlaXRoZXIgc2lkZSBvZiB0aGUgY3VycmVudCBwb2ludCwgdXNpbmcgdGhlXHJcbiAgICAgIGNhbGN1bGF0ZWQgc2l6ZSBhcyBhIGRpc3RhbmNlLiBJZiBhIHBvaW50J3MgZGlzdGFuY2UgdG8gdGhlXHJcbiAgICAgIHByZXZpb3VzIHBvaW50IG9uIHRoYXQgc2lkZSBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gZGlzdGFuY2VcclxuICAgICAgKG9yIGlmIHRoZSBjb3JuZXIgaXMga2luZGEgc2hhcnApLCBhZGQgdGhlIHBvaW50cyB0byB0aGUgc2lkZSdzXHJcbiAgICAgIHBvaW50cyBhcnJheS5cclxuICAgICovXG5cblxuICAgIHZhciBvZmZzZXQgPSBtdWwocGVyKGxycChuZXh0VmVjdG9yLCB2ZWN0b3IsIGRwciQxKSksIHJhZGl1cyk7XG4gICAgdGwgPSBzdWIocG9pbnQsIG9mZnNldCk7XG4gICAgdHIgPSBhZGQocG9pbnQsIG9mZnNldCk7XG4gICAgdmFyIGFsd2F5c0FkZCA9IGkgPT09IDEgfHwgZHByJDEgPCAwLjI1O1xuICAgIHZhciBtaW5EaXN0YW5jZSA9IE1hdGgucG93KChydW5uaW5nTGVuZ3RoID4gc2l6ZSA/IHNpemUgOiBzaXplIC8gMikgKiBzbW9vdGhpbmcsIDIpO1xuXG4gICAgaWYgKGFsd2F5c0FkZCB8fCBkaXN0MihwbCwgdGwpID4gbWluRGlzdGFuY2UpIHtcbiAgICAgIGxlZnRQdHMucHVzaChscnAocGwsIHRsLCBzdHJlYW1saW5lKSk7XG4gICAgICBwbCA9IHRsO1xuICAgIH1cblxuICAgIGlmIChhbHdheXNBZGQgfHwgZGlzdDIocHIsIHRyKSA+IG1pbkRpc3RhbmNlKSB7XG4gICAgICByaWdodFB0cy5wdXNoKGxycChwciwgdHIsIHN0cmVhbWxpbmUpKTtcbiAgICAgIHByID0gdHI7XG4gICAgfSAvLyBTZXQgdmFyaWFibGVzIGZvciBuZXh0IGl0ZXJhdGlvblxuXG5cbiAgICBwcmV2UHJlc3N1cmUgPSBwcmVzc3VyZTtcbiAgICBwcmV2VmVjdG9yID0gdmVjdG9yO1xuICB9XG4gIC8qXHJcbiAgICBEcmF3aW5nIGNhcHNcclxuICAgIFxuICAgIE5vdyB0aGF0IHdlIGhhdmUgb3VyIHBvaW50cyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgbGluZSwgd2UgbmVlZCB0b1xyXG4gICAgZHJhdyBjYXBzIGF0IHRoZSBzdGFydCBhbmQgZW5kLiBUYXBlcmVkIGxpbmVzIGRvbid0IGhhdmUgY2FwcywgYnV0XHJcbiAgICBtYXkgaGF2ZSBkb3RzIGZvciB2ZXJ5IHNob3J0IGxpbmVzLlxyXG4gICovXG5cblxuICB2YXIgZmlyc3RQb2ludCA9IHBvaW50c1swXTtcbiAgdmFyIGxhc3RQb2ludCA9IHBvaW50c1tsZW4gLSAxXTtcbiAgdmFyIGlzVmVyeVNob3J0ID0gcmlnaHRQdHMubGVuZ3RoIDwgMiB8fCBsZWZ0UHRzLmxlbmd0aCA8IDI7XG4gIC8qXHJcbiAgICBEcmF3IGEgZG90IGZvciB2ZXJ5IHNob3J0IG9yIGNvbXBsZXRlZCBzdHJva2VzXHJcbiAgICBcbiAgICBJZiB0aGUgbGluZSBpcyB0b28gc2hvcnQgdG8gZ2F0aGVyIGxlZnQgb3IgcmlnaHQgcG9pbnRzIGFuZCBpZiB0aGUgbGluZSBpc1xyXG4gICAgbm90IHRhcGVyZWQgb24gZWl0aGVyIHNpZGUsIGRyYXcgYSBkb3QuIElmIHRoZSBsaW5lIGlzIHRhcGVyZWQsIHRoZW4gb25seVxyXG4gICAgZHJhdyBhIGRvdCBpZiB0aGUgbGluZSBpcyBib3RoIHZlcnkgc2hvcnQgYW5kIGNvbXBsZXRlLiBJZiB3ZSBkcmF3IGEgZG90LFxyXG4gICAgd2UgY2FuIGp1c3QgcmV0dXJuIHRob3NlIHBvaW50cy5cclxuICAqL1xuXG4gIGlmIChpc1ZlcnlTaG9ydCAmJiAoISh0YXBlclN0YXJ0IHx8IHRhcGVyRW5kKSB8fCBpc0NvbXBsZXRlKSkge1xuICAgIHZhciBpciA9IDA7XG5cbiAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBsZW47IF9pMisrKSB7XG4gICAgICB2YXIgX3BvaW50cyRfaSA9IHBvaW50c1tfaTJdLFxuICAgICAgICAgIF9wcmVzc3VyZSA9IF9wb2ludHMkX2kucHJlc3N1cmUsXG4gICAgICAgICAgX3J1bm5pbmdMZW5ndGgyID0gX3BvaW50cyRfaS5ydW5uaW5nTGVuZ3RoO1xuXG4gICAgICBpZiAoX3J1bm5pbmdMZW5ndGgyID4gc2l6ZSkge1xuICAgICAgICBpciA9IGdldFN0cm9rZVJhZGl1cyhzaXplLCB0aGlubmluZywgZWFzaW5nLCBfcHJlc3N1cmUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgX3N0YXJ0ID0gc3ViKGZpcnN0UG9pbnQucG9pbnQsIG11bChwZXIodW5pKHZlYyhsYXN0UG9pbnQucG9pbnQsIGZpcnN0UG9pbnQucG9pbnQpKSksIGlyIHx8IHJhZGl1cykpO1xuXG4gICAgdmFyIGRvdFB0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgX3QgPSAwLCBzdGVwID0gMC4xOyBfdCA8PSAxOyBfdCArPSBzdGVwKSB7XG4gICAgICBkb3RQdHMucHVzaChyb3RBcm91bmQoX3N0YXJ0LCBmaXJzdFBvaW50LnBvaW50LCBQSSAqIDIgKiBfdCkpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3RQdHM7XG4gIH1cbiAgLypcclxuICAgIERyYXcgYSBzdGFydCBjYXBcclxuICAgICAgIFVubGVzcyB0aGUgbGluZSBoYXMgYSB0YXBlcmVkIHN0YXJ0LCBvciB1bmxlc3MgdGhlIGxpbmUgaGFzIGEgdGFwZXJlZCBlbmRcclxuICAgIGFuZCB0aGUgbGluZSBpcyB2ZXJ5IHNob3J0LCBkcmF3IGEgc3RhcnQgY2FwIGFyb3VuZCB0aGUgZmlyc3QgcG9pbnQuIFVzZVxyXG4gICAgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHNlY29uZCBsZWZ0IGFuZCByaWdodCBwb2ludCBmb3IgdGhlIGNhcCdzIHJhZGl1cy5cclxuICAgIEZpbmFsbHkgcmVtb3ZlIHRoZSBmaXJzdCBsZWZ0IGFuZCByaWdodCBwb2ludHMuIDpwc3lkdWNrOlxyXG4gICovXG5cblxuICB2YXIgc3RhcnRDYXAgPSBbXTtcblxuICBpZiAoIXRhcGVyU3RhcnQgJiYgISh0YXBlckVuZCAmJiBpc1ZlcnlTaG9ydCkpIHtcbiAgICB0ciA9IHJpZ2h0UHRzWzFdO1xuICAgIHRsID0gbGVmdFB0c1sxXTtcblxuICAgIHZhciBfc3RhcnQyID0gc3ViKGZpcnN0UG9pbnQucG9pbnQsIG11bCh1bmkodmVjKHRyLCB0bCkpLCBkaXN0KHRyLCB0bCkgLyAyKSk7XG5cbiAgICBmb3IgKHZhciBfdDIgPSAwLCBfc3RlcCA9IDAuMjsgX3QyIDw9IDE7IF90MiArPSBfc3RlcCkge1xuICAgICAgc3RhcnRDYXAucHVzaChyb3RBcm91bmQoX3N0YXJ0MiwgZmlyc3RQb2ludC5wb2ludCwgUEkgKiBfdDIpKTtcbiAgICB9XG5cbiAgICBsZWZ0UHRzLnNoaWZ0KCk7XG4gICAgcmlnaHRQdHMuc2hpZnQoKTtcbiAgfVxuICAvKlxyXG4gICAgRHJhdyBhbiBlbmQgY2FwXHJcbiAgICAgICBJZiB0aGUgbGluZSBkb2VzIG5vdCBoYXZlIGEgdGFwZXJlZCBlbmQsIGFuZCB1bmxlc3MgdGhlIGxpbmUgaGFzIGEgdGFwZXJlZFxyXG4gICAgc3RhcnQgYW5kIHRoZSBsaW5lIGlzIHZlcnkgc2hvcnQsIGRyYXcgYSBjYXAgYXJvdW5kIHRoZSBsYXN0IHBvaW50LiBGaW5hbGx5LFxyXG4gICAgcmVtb3ZlIHRoZSBsYXN0IGxlZnQgYW5kIHJpZ2h0IHBvaW50cy4gT3RoZXJ3aXNlLCBhZGQgdGhlIGxhc3QgcG9pbnQuIE5vdGVcclxuICAgIHRoYXQgVGhpcyBjYXAgaXMgYSBmdWxsLXR1cm4tYW5kLWEtaGFsZjogdGhpcyBwcmV2ZW50cyBpbmNvcnJlY3QgY2FwcyBvblxyXG4gICAgc2hhcnAgZW5kIHR1cm5zLlxyXG4gICovXG5cblxuICB2YXIgZW5kQ2FwID0gW107XG5cbiAgaWYgKCF0YXBlckVuZCAmJiAhKHRhcGVyU3RhcnQgJiYgaXNWZXJ5U2hvcnQpKSB7XG4gICAgdmFyIF9zdGFydDMgPSBzdWIobGFzdFBvaW50LnBvaW50LCBtdWwocGVyKGxhc3RQb2ludC52ZWN0b3IpLCByYWRpdXMpKTtcblxuICAgIGZvciAodmFyIF90MyA9IDAsIF9zdGVwMiA9IDAuMTsgX3QzIDw9IDE7IF90MyArPSBfc3RlcDIpIHtcbiAgICAgIGVuZENhcC5wdXNoKHJvdEFyb3VuZChfc3RhcnQzLCBsYXN0UG9pbnQucG9pbnQsIFBJICogMyAqIF90MykpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBlbmRDYXAucHVzaChsYXN0UG9pbnQucG9pbnQpO1xuICB9XG4gIC8qXHJcbiAgICBSZXR1cm4gdGhlIHBvaW50cyBpbiB0aGUgY29ycmVjdCB3aW5kaW5kIG9yZGVyOiBiZWdpbiBvbiB0aGUgbGVmdCBzaWRlLCB0aGVuXHJcbiAgICBjb250aW51ZSBhcm91bmQgdGhlIGVuZCBjYXAsIHRoZW4gY29tZSBiYWNrIGFsb25nIHRoZSByaWdodCBzaWRlLCBhbmQgZmluYWxseVxyXG4gICAgY29tcGxldGUgdGhlIHN0YXJ0IGNhcC5cclxuICAqL1xuXG5cbiAgcmV0dXJuIGxlZnRQdHMuY29uY2F0KGVuZENhcCwgcmlnaHRQdHMucmV2ZXJzZSgpLCBzdGFydENhcCk7XG59XG4vKipcclxuICogIyMgZ2V0U3Ryb2tlXHJcbiAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgc3Ryb2tlIGFzIGFuIGFycmF5IG9mIG91dGxpbmUgcG9pbnRzLlxyXG4gKiBAcGFyYW0gcG9pbnRzIEFuIGFycmF5IG9mIHBvaW50cyAoYXMgYFt4LCB5LCBwcmVzc3VyZV1gIG9yIGB7eCwgeSwgcHJlc3N1cmV9YCkuIFByZXNzdXJlIGlzIG9wdGlvbmFsLlxyXG4gKiBAcGFyYW0gb3B0aW9ucyBBbiAob3B0aW9uYWwpIG9iamVjdCB3aXRoIG9wdGlvbnMuXHJcbiAqIEBwYXJhbSBvcHRpb25zLnNpemVcdFRoZSBiYXNlIHNpemUgKGRpYW1ldGVyKSBvZiB0aGUgc3Ryb2tlLlxyXG4gKiBAcGFyYW0gb3B0aW9ucy50aGlubmluZyBUaGUgZWZmZWN0IG9mIHByZXNzdXJlIG9uIHRoZSBzdHJva2UncyBzaXplLlxyXG4gKiBAcGFyYW0gb3B0aW9ucy5zbW9vdGhpbmdcdEhvdyBtdWNoIHRvIHNvZnRlbiB0aGUgc3Ryb2tlJ3MgZWRnZXMuXHJcbiAqIEBwYXJhbSBvcHRpb25zLmVhc2luZ1x0QW4gZWFzaW5nIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggcG9pbnQncyBwcmVzc3VyZS5cclxuICogQHBhcmFtIG9wdGlvbnMuc2ltdWxhdGVQcmVzc3VyZSBXaGV0aGVyIHRvIHNpbXVsYXRlIHByZXNzdXJlIGJhc2VkIG9uIHZlbG9jaXR5LlxyXG4gKiBAcGFyYW0gb3B0aW9ucy5zdGFydCBUYXBlcmluZyBhbmQgZWFzaW5nIGZ1bmN0aW9uIGZvciB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuXHJcbiAqIEBwYXJhbSBvcHRpb25zLmVuZCBUYXBlcmluZyBhbmQgZWFzaW5nIGZ1bmN0aW9uIGZvciB0aGUgZW5kIG9mIHRoZSBsaW5lLlxyXG4gKiBAcGFyYW0gb3B0aW9ucy5sYXN0IFdoZXRoZXIgdG8gaGFuZGxlIHRoZSBwb2ludHMgYXMgYSBjb21wbGV0ZWQgc3Ryb2tlLlxyXG4gKi9cblxuZnVuY3Rpb24gZ2V0U3Ryb2tlKHBvaW50cywgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIGdldFN0cm9rZU91dGxpbmVQb2ludHMoZ2V0U3Ryb2tlUG9pbnRzKHBvaW50cywgb3B0aW9ucyksIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRTdHJva2U7XG5leHBvcnQgeyBnZXRTdHJva2VPdXRsaW5lUG9pbnRzLCBnZXRTdHJva2VQb2ludHMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBlcmZlY3QtZnJlZWhhbmQuZXNtLmpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/perfect-freehand/dist/perfect-freehand.esm.js\n");
106
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ jt),\n/* harmony export */ \"getStroke\": () => (/* binding */ ht),\n/* harmony export */ \"getStrokeOutlinePoints\": () => (/* binding */ ft),\n/* harmony export */ \"getStrokePoints\": () => (/* binding */ bt)\n/* harmony export */ });\nfunction Z(t,e,o,M=g=>g){return t*M(.5-e*(.5-o))}function E(t,e){return[t[0]+e[0],t[1]+e[1]]}function x(t,e){return[t[0]-e[0],t[1]-e[1]]}function z(t,e){return[t[0]*e,t[1]*e]}function gt(t,e){return[t[0]/e,t[1]/e]}function G(t){return[t[1],-t[0]]}function mt(t,e){return t[0]*e[0]+t[1]*e[1]}function T(t,e){return t[0]===e[0]&&t[1]===e[1]}function dt(t){return Math.hypot(t[0],t[1])}function xt(t){return t[0]*t[0]+t[1]*t[1]}function nt(t,e){return xt(x(t,e))}function _(t){return gt(t,dt(t))}function I(t,e){return Math.hypot(t[1]-e[1],t[0]-e[0])}function at(t,e){return z(E(t,e),.5)}function K(t,e,o){let M=Math.sin(o),g=Math.cos(o),R=t[0]-e[0],s=t[1]-e[1],y=R*g-s*M,j=R*M+s*g;return[y+e[0],j+e[1]]}function H(t,e,o){return E(t,z(x(e,t),o))}function h(t,e,o){return E(t,z(e,o))}var{min:V,PI:St}=Math,lt=.275,N=St+1e-4;function ft(t,e={}){var it;let{size:o=16,smoothing:M=.5,thinning:g=.5,simulatePressure:R=!0,easing:s=r=>r,start:y={},end:j={},last:w=!1}=e,{cap:L=!0,taper:v=0,easing:U=r=>r*(2-r)}=y,{cap:d=!0,taper:l=0,easing:q=r=>--r*r*r+1}=j;if(t.length===0)return[];let rt=t[t.length-1].runningLength,ot=Math.pow(o*M,2),f=[],S=[],$=t.slice(0,10).reduce((r,P)=>{let a=P.pressure;if(R){let u=V(1,P.distance/o),p=V(1,1-u);a=V(1,r+(p-r)*(u*lt))}return(r+a)/2},t[0].pressure),k=Z(o,g,t[t.length-1].pressure,s),st,ut=t[0].vector,C=t[0].point,X=C,c=C,m=X,J=!0;for(let r=0;r<t.length-1;r++){let{pressure:P}=t[r],{point:a,vector:u,distance:p,runningLength:n}=t[r];if(r>0&&J&&n<o/2)continue;if(J&&(J=!1),g){if(R){let F=V(1,p/o),et=V(1,1-F);P=V(1,$+(et-$)*(F*lt))}k=Z(o,g,P,s)}else k=o/2;st===void 0&&(st=k);let i=n<v?U(n/v):1,O=rt-n<l?q((rt-n)/l):1;k=Math.max(.01,k*Math.min(i,O));let D=((it=t[r+1])==null?void 0:it.vector)||u,tt=mt(u,D);if(tt<0){let F=z(G(ut),k);for(let et=1/13,Y=0;Y<=1;Y+=et)m=K(E(a,F),a,N*-Y),c=K(x(a,F),a,N*Y),S.push(m),f.push(c);C=c,X=m;continue}let pt=z(G(H(D,u,tt)),k);c=x(a,pt),m=E(a,pt);let ct=r<2||tt<.25;(ct||nt(C,c)>ot)&&(f.push(c),C=c),(ct||nt(X,m)>ot)&&(S.push(m),X=m),$=P,ut=u}let b=t[0],B=t[t.length-1],A=J||S.length<2||f.length<2;if(A&&(!(v||l)||w)){let r=0,P=T(b.point,B.point)?E(b.point,[1,1]):B.point;for(let p=0;p<t.length;p++){let{pressure:n,runningLength:i}=t[p];if(i>o){r=Z(o,g,n,s);break}}let a=h(b.point,G(_(x(b.point,P))),-(r||k)),u=[];for(let p=1/13,n=p;n<=1;n+=p)u.push(K(a,b.point,N*2*n));return u}let Q=[],W=[];if(f.length>1&&S.length>1){m=S[1];for(let n=1;n<f.length;n++)if(!T(m,f[n])){c=f[n];break}if(L||v)if(!v&&!(l&&A)){if(!T(m,c)){let n=h(b.point,_(x(c,m)),-I(m,c)/2);for(let i=1/13,O=i;O<=1;O+=i){let D=K(n,b.point,N*O);if(I(D,c)<1)break;Q.push(D)}f.shift(),S.shift()}}else Q.push(b.point.slice(0,2));else if(!T(m,c)){let n=_(x(c,m)),i=I(m,c)/2;Q.push(h(b.point,n,-i),h(b.point,n,-i*.95),h(b.point,n,i*.95),h(b.point,n,i)),f.shift(),S.shift()}let r=f[f.length-1],P=S[S.length-1],a=at(r,P),u=B.point,p=G(_(x(u,a)));if(d||l)if(!l&&!(v&&A)){let n=h(u,p,k);for(let i=1/29,O=0;O<=1;O+=i){let D=K(n,u,N*3*O);W.push(D)}}else W.push(u.slice(0,2));else{let n=H(a,u,.95),i=k*.95;W.push(h(n,p,i),h(u,p,i),h(u,p,-i),h(n,p,-i))}}return f.concat(W,S.reverse(),Q)}function bt(t,e={}){var U;let{streamline:o=.5,size:M=16,last:g=!1}=e;if(t.length===0)return[];let R=.15+(1-o)*.85,s=Array.isArray(t[0])?t:t.map(({x:d,y:l,pressure:q=.5})=>[d,l,q]);s.length===1&&s.push([...E(s[0],[1,1]),s[0][2]||.5]);let y=[{point:[s[0][0],s[0][1]],pressure:s[0][2]||.25,vector:[1,1],distance:0,runningLength:0}],j=!1,w=0,L=y[0],v=s.length-1;for(let d=1;d<s.length;d++){let l=g&&d===v?s[d]:H(L.point,s[d],R);if(T(L.point,l))continue;let q=I(l,L.point);if(w+=q,d<v&&!j){if(w<M)continue;j=!0}L={point:l,pressure:s[d][2]||.5,vector:_(x(L.point,l)),distance:q,runningLength:w},y.push(L)}return y[0].vector=((U=y[1])==null?void 0:U.vector)||[0,0],y}function ht(t,e={}){return ft(bt(t,e),e)}var jt=ht;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BlcmZlY3QtZnJlZWhhbmQvZGlzdC9lc20vaW5kZXguanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLHlCQUF5Qix3QkFBd0IsZ0JBQWdCLDRCQUE0QixnQkFBZ0IsNEJBQTRCLGdCQUFnQixzQkFBc0IsaUJBQWlCLHNCQUFzQixjQUFjLG1CQUFtQixpQkFBaUIsMkJBQTJCLGdCQUFnQixnQ0FBZ0MsZUFBZSw2QkFBNkIsZUFBZSwyQkFBMkIsaUJBQWlCLGtCQUFrQixjQUFjLG1CQUFtQixnQkFBZ0IsdUNBQXVDLGlCQUFpQixvQkFBb0Isa0JBQWtCLDRFQUE0RSxzQkFBc0Isa0JBQWtCLHdCQUF3QixrQkFBa0IsbUJBQW1CLElBQUksWUFBWSx3QkFBd0Isa0JBQWtCLEVBQUUsT0FBTyxJQUFJLHFGQUFxRixTQUFTLFdBQVcsSUFBSSx1Q0FBdUMsSUFBSSx5Q0FBeUMsR0FBRyx5QkFBeUIsK0ZBQStGLGlCQUFpQixNQUFNLG1DQUFtQyxzQkFBc0IsY0FBYyxrR0FBa0csWUFBWSxhQUFhLEtBQUssSUFBSSxXQUFXLE9BQU8sNENBQTRDLE1BQU0sMEJBQTBCLGdCQUFnQixNQUFNLDJCQUEyQix1QkFBdUIsYUFBYSxXQUFXLG9CQUFvQiwwQ0FBMEMsZ0NBQWdDLHlEQUF5RCxTQUFTLGlCQUFpQixvQkFBb0IsS0FBSywrREFBK0QsUUFBUSxTQUFTLHlCQUF5QixvQkFBb0IsbUJBQW1CLDZFQUE2RSx1REFBdUQsb0JBQW9CLHNEQUFzRCxZQUFZLFdBQVcsS0FBSyxJQUFJLDJCQUEyQixNQUFNLFFBQVEsYUFBYSxPQUFPLGlEQUFpRCxtQkFBbUIsS0FBSyxnQ0FBZ0MsU0FBUyxjQUFjLDJCQUEyQixPQUFPLFlBQVksV0FBVyxtQkFBbUIsT0FBTyxNQUFNLHdCQUF3QixZQUFZLHFDQUFxQyxtQkFBbUIsS0FBSyxNQUFNLHVCQUF1QixrQkFBa0IsVUFBVSxxQkFBcUIsZ0NBQWdDLGlCQUFpQiwyQkFBMkIsa0dBQWtHLHVFQUF1RSx3QkFBd0IsZUFBZSxtQkFBbUIsS0FBSyxNQUFNLG1CQUFtQixXQUFXLDBCQUEwQixLQUFLLHlCQUF5QiwrQ0FBK0MsaUNBQWlDLGtCQUFrQixFQUFFLE1BQU0sSUFBSSxvQ0FBb0MsR0FBRyx5QkFBeUIsb0RBQW9ELHNCQUFzQixZQUFZLHFEQUFxRCxRQUFRLHNGQUFzRiwrQkFBK0IsWUFBWSxXQUFXLEtBQUssc0NBQXNDLHlCQUF5QixtQkFBbUIsaUJBQWlCLGdCQUFnQixLQUFLLEdBQUcsK0VBQStFLFdBQVcsNkRBQTZELGtCQUFrQixFQUFFLHFCQUFxQixVQUFtRyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGVyZmVjdC1mcmVlaGFuZC9kaXN0L2VzbS9pbmRleC5qcz9kMGQ3Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIFoodCxlLG8sTT1nPT5nKXtyZXR1cm4gdCpNKC41LWUqKC41LW8pKX1mdW5jdGlvbiBFKHQsZSl7cmV0dXJuW3RbMF0rZVswXSx0WzFdK2VbMV1dfWZ1bmN0aW9uIHgodCxlKXtyZXR1cm5bdFswXS1lWzBdLHRbMV0tZVsxXV19ZnVuY3Rpb24geih0LGUpe3JldHVyblt0WzBdKmUsdFsxXSplXX1mdW5jdGlvbiBndCh0LGUpe3JldHVyblt0WzBdL2UsdFsxXS9lXX1mdW5jdGlvbiBHKHQpe3JldHVyblt0WzFdLC10WzBdXX1mdW5jdGlvbiBtdCh0LGUpe3JldHVybiB0WzBdKmVbMF0rdFsxXSplWzFdfWZ1bmN0aW9uIFQodCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdfWZ1bmN0aW9uIGR0KHQpe3JldHVybiBNYXRoLmh5cG90KHRbMF0sdFsxXSl9ZnVuY3Rpb24geHQodCl7cmV0dXJuIHRbMF0qdFswXSt0WzFdKnRbMV19ZnVuY3Rpb24gbnQodCxlKXtyZXR1cm4geHQoeCh0LGUpKX1mdW5jdGlvbiBfKHQpe3JldHVybiBndCh0LGR0KHQpKX1mdW5jdGlvbiBJKHQsZSl7cmV0dXJuIE1hdGguaHlwb3QodFsxXS1lWzFdLHRbMF0tZVswXSl9ZnVuY3Rpb24gYXQodCxlKXtyZXR1cm4geihFKHQsZSksLjUpfWZ1bmN0aW9uIEsodCxlLG8pe2xldCBNPU1hdGguc2luKG8pLGc9TWF0aC5jb3MobyksUj10WzBdLWVbMF0scz10WzFdLWVbMV0seT1SKmctcypNLGo9UipNK3MqZztyZXR1cm5beStlWzBdLGorZVsxXV19ZnVuY3Rpb24gSCh0LGUsbyl7cmV0dXJuIEUodCx6KHgoZSx0KSxvKSl9ZnVuY3Rpb24gaCh0LGUsbyl7cmV0dXJuIEUodCx6KGUsbykpfXZhcnttaW46VixQSTpTdH09TWF0aCxsdD0uMjc1LE49U3QrMWUtNDtmdW5jdGlvbiBmdCh0LGU9e30pe3ZhciBpdDtsZXR7c2l6ZTpvPTE2LHNtb290aGluZzpNPS41LHRoaW5uaW5nOmc9LjUsc2ltdWxhdGVQcmVzc3VyZTpSPSEwLGVhc2luZzpzPXI9PnIsc3RhcnQ6eT17fSxlbmQ6aj17fSxsYXN0Onc9ITF9PWUse2NhcDpMPSEwLHRhcGVyOnY9MCxlYXNpbmc6VT1yPT5yKigyLXIpfT15LHtjYXA6ZD0hMCx0YXBlcjpsPTAsZWFzaW5nOnE9cj0+LS1yKnIqcisxfT1qO2lmKHQubGVuZ3RoPT09MClyZXR1cm5bXTtsZXQgcnQ9dFt0Lmxlbmd0aC0xXS5ydW5uaW5nTGVuZ3RoLG90PU1hdGgucG93KG8qTSwyKSxmPVtdLFM9W10sJD10LnNsaWNlKDAsMTApLnJlZHVjZSgocixQKT0+e2xldCBhPVAucHJlc3N1cmU7aWYoUil7bGV0IHU9VigxLFAuZGlzdGFuY2UvbykscD1WKDEsMS11KTthPVYoMSxyKyhwLXIpKih1Kmx0KSl9cmV0dXJuKHIrYSkvMn0sdFswXS5wcmVzc3VyZSksaz1aKG8sZyx0W3QubGVuZ3RoLTFdLnByZXNzdXJlLHMpLHN0LHV0PXRbMF0udmVjdG9yLEM9dFswXS5wb2ludCxYPUMsYz1DLG09WCxKPSEwO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGgtMTtyKyspe2xldHtwcmVzc3VyZTpQfT10W3JdLHtwb2ludDphLHZlY3Rvcjp1LGRpc3RhbmNlOnAscnVubmluZ0xlbmd0aDpufT10W3JdO2lmKHI+MCYmSiYmbjxvLzIpY29udGludWU7aWYoSiYmKEo9ITEpLGcpe2lmKFIpe2xldCBGPVYoMSxwL28pLGV0PVYoMSwxLUYpO1A9VigxLCQrKGV0LSQpKihGKmx0KSl9az1aKG8sZyxQLHMpfWVsc2Ugaz1vLzI7c3Q9PT12b2lkIDAmJihzdD1rKTtsZXQgaT1uPHY/VShuL3YpOjEsTz1ydC1uPGw/cSgocnQtbikvbCk6MTtrPU1hdGgubWF4KC4wMSxrKk1hdGgubWluKGksTykpO2xldCBEPSgoaXQ9dFtyKzFdKT09bnVsbD92b2lkIDA6aXQudmVjdG9yKXx8dSx0dD1tdCh1LEQpO2lmKHR0PDApe2xldCBGPXooRyh1dCksayk7Zm9yKGxldCBldD0xLzEzLFk9MDtZPD0xO1krPWV0KW09SyhFKGEsRiksYSxOKi1ZKSxjPUsoeChhLEYpLGEsTipZKSxTLnB1c2gobSksZi5wdXNoKGMpO0M9YyxYPW07Y29udGludWV9bGV0IHB0PXooRyhIKEQsdSx0dCkpLGspO2M9eChhLHB0KSxtPUUoYSxwdCk7bGV0IGN0PXI8Mnx8dHQ8LjI1OyhjdHx8bnQoQyxjKT5vdCkmJihmLnB1c2goYyksQz1jKSwoY3R8fG50KFgsbSk+b3QpJiYoUy5wdXNoKG0pLFg9bSksJD1QLHV0PXV9bGV0IGI9dFswXSxCPXRbdC5sZW5ndGgtMV0sQT1KfHxTLmxlbmd0aDwyfHxmLmxlbmd0aDwyO2lmKEEmJighKHZ8fGwpfHx3KSl7bGV0IHI9MCxQPVQoYi5wb2ludCxCLnBvaW50KT9FKGIucG9pbnQsWzEsMV0pOkIucG9pbnQ7Zm9yKGxldCBwPTA7cDx0Lmxlbmd0aDtwKyspe2xldHtwcmVzc3VyZTpuLHJ1bm5pbmdMZW5ndGg6aX09dFtwXTtpZihpPm8pe3I9WihvLGcsbixzKTticmVha319bGV0IGE9aChiLnBvaW50LEcoXyh4KGIucG9pbnQsUCkpKSwtKHJ8fGspKSx1PVtdO2ZvcihsZXQgcD0xLzEzLG49cDtuPD0xO24rPXApdS5wdXNoKEsoYSxiLnBvaW50LE4qMipuKSk7cmV0dXJuIHV9bGV0IFE9W10sVz1bXTtpZihmLmxlbmd0aD4xJiZTLmxlbmd0aD4xKXttPVNbMV07Zm9yKGxldCBuPTE7bjxmLmxlbmd0aDtuKyspaWYoIVQobSxmW25dKSl7Yz1mW25dO2JyZWFrfWlmKEx8fHYpaWYoIXYmJiEobCYmQSkpe2lmKCFUKG0sYykpe2xldCBuPWgoYi5wb2ludCxfKHgoYyxtKSksLUkobSxjKS8yKTtmb3IobGV0IGk9MS8xMyxPPWk7Tzw9MTtPKz1pKXtsZXQgRD1LKG4sYi5wb2ludCxOKk8pO2lmKEkoRCxjKTwxKWJyZWFrO1EucHVzaChEKX1mLnNoaWZ0KCksUy5zaGlmdCgpfX1lbHNlIFEucHVzaChiLnBvaW50LnNsaWNlKDAsMikpO2Vsc2UgaWYoIVQobSxjKSl7bGV0IG49Xyh4KGMsbSkpLGk9SShtLGMpLzI7US5wdXNoKGgoYi5wb2ludCxuLC1pKSxoKGIucG9pbnQsbiwtaSouOTUpLGgoYi5wb2ludCxuLGkqLjk1KSxoKGIucG9pbnQsbixpKSksZi5zaGlmdCgpLFMuc2hpZnQoKX1sZXQgcj1mW2YubGVuZ3RoLTFdLFA9U1tTLmxlbmd0aC0xXSxhPWF0KHIsUCksdT1CLnBvaW50LHA9RyhfKHgodSxhKSkpO2lmKGR8fGwpaWYoIWwmJiEodiYmQSkpe2xldCBuPWgodSxwLGspO2ZvcihsZXQgaT0xLzI5LE89MDtPPD0xO08rPWkpe2xldCBEPUsobix1LE4qMypPKTtXLnB1c2goRCl9fWVsc2UgVy5wdXNoKHUuc2xpY2UoMCwyKSk7ZWxzZXtsZXQgbj1IKGEsdSwuOTUpLGk9ayouOTU7Vy5wdXNoKGgobixwLGkpLGgodSxwLGkpLGgodSxwLC1pKSxoKG4scCwtaSkpfX1yZXR1cm4gZi5jb25jYXQoVyxTLnJldmVyc2UoKSxRKX1mdW5jdGlvbiBidCh0LGU9e30pe3ZhciBVO2xldHtzdHJlYW1saW5lOm89LjUsc2l6ZTpNPTE2LGxhc3Q6Zz0hMX09ZTtpZih0Lmxlbmd0aD09PTApcmV0dXJuW107bGV0IFI9LjE1KygxLW8pKi44NSxzPUFycmF5LmlzQXJyYXkodFswXSk/dDp0Lm1hcCgoe3g6ZCx5OmwscHJlc3N1cmU6cT0uNX0pPT5bZCxsLHFdKTtzLmxlbmd0aD09PTEmJnMucHVzaChbLi4uRShzWzBdLFsxLDFdKSxzWzBdWzJdfHwuNV0pO2xldCB5PVt7cG9pbnQ6W3NbMF1bMF0sc1swXVsxXV0scHJlc3N1cmU6c1swXVsyXXx8LjI1LHZlY3RvcjpbMSwxXSxkaXN0YW5jZTowLHJ1bm5pbmdMZW5ndGg6MH1dLGo9ITEsdz0wLEw9eVswXSx2PXMubGVuZ3RoLTE7Zm9yKGxldCBkPTE7ZDxzLmxlbmd0aDtkKyspe2xldCBsPWcmJmQ9PT12P3NbZF06SChMLnBvaW50LHNbZF0sUik7aWYoVChMLnBvaW50LGwpKWNvbnRpbnVlO2xldCBxPUkobCxMLnBvaW50KTtpZih3Kz1xLGQ8diYmIWope2lmKHc8TSljb250aW51ZTtqPSEwfUw9e3BvaW50OmwscHJlc3N1cmU6c1tkXVsyXXx8LjUsdmVjdG9yOl8oeChMLnBvaW50LGwpKSxkaXN0YW5jZTpxLHJ1bm5pbmdMZW5ndGg6d30seS5wdXNoKEwpfXJldHVybiB5WzBdLnZlY3Rvcj0oKFU9eVsxXSk9PW51bGw/dm9pZCAwOlUudmVjdG9yKXx8WzAsMF0seX1mdW5jdGlvbiBodCh0LGU9e30pe3JldHVybiBmdChidCh0LGUpLGUpfXZhciBqdD1odDtleHBvcnR7anQgYXMgZGVmYXVsdCxodCBhcyBnZXRTdHJva2UsZnQgYXMgZ2V0U3Ryb2tlT3V0bGluZVBvaW50cyxidCBhcyBnZXRTdHJva2VQb2ludHN9O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/perfect-freehand/dist/esm/index.js\n");
107
107
 
108
108
  /***/ }),
109
109
 
@@ -1567,7 +1567,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1567
1567
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1568
1568
 
1569
1569
  "use strict";
1570
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"NOT_SPREADSHEET\": () => (/* binding */ NOT_SPREADSHEET),\n/* harmony export */ \"VALID_SPREADSHEET\": () => (/* binding */ VALID_SPREADSHEET),\n/* harmony export */ \"tryParseSpreadsheet\": () => (/* binding */ tryParseSpreadsheet),\n/* harmony export */ \"renderSpreadsheet\": () => (/* binding */ renderSpreadsheet)\n/* harmony export */ });\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./element */ \"../../element/index.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./random */ \"../../random.ts\");\n\r\n\r\n\r\n\r\nconst BAR_WIDTH = 32;\r\nconst BAR_GAP = 12;\r\nconst BAR_HEIGHT = 256;\r\nconst GRID_OPACITY = 50;\r\nconst NOT_SPREADSHEET = \"NOT_SPREADSHEET\";\r\nconst VALID_SPREADSHEET = \"VALID_SPREADSHEET\";\r\nconst tryParseNumber = (s) => {\r\n const match = /^[$€£¥₩]?([0-9,]+(\\.[0-9]+)?)$/.exec(s);\r\n if (!match) {\r\n return null;\r\n }\r\n return parseFloat(match[1].replace(/,/g, \"\"));\r\n};\r\nconst isNumericColumn = (lines, columnIndex) => lines.slice(1).every((line) => tryParseNumber(line[columnIndex]) !== null);\r\nconst tryParseCells = (cells) => {\r\n const numCols = cells[0].length;\r\n if (numCols > 2) {\r\n return { type: NOT_SPREADSHEET, reason: \"More than 2 columns\" };\r\n }\r\n if (numCols === 1) {\r\n if (!isNumericColumn(cells, 0)) {\r\n return { type: NOT_SPREADSHEET, reason: \"Value is not numeric\" };\r\n }\r\n const hasHeader = tryParseNumber(cells[0][0]) === null;\r\n const values = (hasHeader ? cells.slice(1) : cells).map((line) => tryParseNumber(line[0]));\r\n if (values.length < 2) {\r\n return { type: NOT_SPREADSHEET, reason: \"Less than two rows\" };\r\n }\r\n return {\r\n type: VALID_SPREADSHEET,\r\n spreadsheet: {\r\n title: hasHeader ? cells[0][0] : null,\r\n labels: null,\r\n values: values,\r\n },\r\n };\r\n }\r\n const valueColumnIndex = isNumericColumn(cells, 0) ? 0 : 1;\r\n if (!isNumericColumn(cells, valueColumnIndex)) {\r\n return { type: NOT_SPREADSHEET, reason: \"Value is not numeric\" };\r\n }\r\n const labelColumnIndex = (valueColumnIndex + 1) % 2;\r\n const hasHeader = tryParseNumber(cells[0][valueColumnIndex]) === null;\r\n const rows = hasHeader ? cells.slice(1) : cells;\r\n if (rows.length < 2) {\r\n return { type: NOT_SPREADSHEET, reason: \"Less than 2 rows\" };\r\n }\r\n return {\r\n type: VALID_SPREADSHEET,\r\n spreadsheet: {\r\n title: hasHeader ? cells[0][valueColumnIndex] : null,\r\n labels: rows.map((row) => row[labelColumnIndex]),\r\n values: rows.map((row) => tryParseNumber(row[valueColumnIndex])),\r\n },\r\n };\r\n};\r\nconst transposeCells = (cells) => {\r\n const nextCells = [];\r\n for (let col = 0; col < cells[0].length; col++) {\r\n const nextCellRow = [];\r\n for (let row = 0; row < cells.length; row++) {\r\n nextCellRow.push(cells[row][col]);\r\n }\r\n nextCells.push(nextCellRow);\r\n }\r\n return nextCells;\r\n};\r\nconst tryParseSpreadsheet = (text) => {\r\n // Copy/paste from excel, spreadhseets, tsv, csv.\r\n // For now we only accept 2 columns with an optional header\r\n // Check for tab separated values\r\n let lines = text\r\n .trim()\r\n .split(\"\\n\")\r\n .map((line) => line.trim().split(\"\\t\"));\r\n // Check for comma separated files\r\n if (lines.length && lines[0].length !== 2) {\r\n lines = text\r\n .trim()\r\n .split(\"\\n\")\r\n .map((line) => line.trim().split(\",\"));\r\n }\r\n if (lines.length === 0) {\r\n return { type: NOT_SPREADSHEET, reason: \"No values\" };\r\n }\r\n const numColsFirstLine = lines[0].length;\r\n const isSpreadsheet = lines.every((line) => line.length === numColsFirstLine);\r\n if (!isSpreadsheet) {\r\n return {\r\n type: NOT_SPREADSHEET,\r\n reason: \"All rows don't have same number of columns\",\r\n };\r\n }\r\n const result = tryParseCells(lines);\r\n if (result.type !== VALID_SPREADSHEET) {\r\n const transposedResults = tryParseCells(transposeCells(lines));\r\n if (transposedResults.type === VALID_SPREADSHEET) {\r\n return transposedResults;\r\n }\r\n }\r\n return result;\r\n};\r\nconst bgColors = _colors__WEBPACK_IMPORTED_MODULE_0__.default.elementBackground.slice(2, _colors__WEBPACK_IMPORTED_MODULE_0__.default.elementBackground.length);\r\n// Put all the common properties here so when the whole chart is selected\r\n// the properties dialog shows the correct selected values\r\nconst commonProps = {\r\n fillStyle: \"hachure\",\r\n fontFamily: _constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_FONT_FAMILY,\r\n fontSize: _constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_FONT_SIZE,\r\n opacity: 100,\r\n roughness: 1,\r\n strokeColor: _colors__WEBPACK_IMPORTED_MODULE_0__.default.elementStroke[0],\r\n strokeSharpness: \"sharp\",\r\n strokeStyle: \"solid\",\r\n strokeWidth: 1,\r\n verticalAlign: \"middle\",\r\n};\r\nconst getChartDimentions = (spreadsheet) => {\r\n const chartWidth = (BAR_WIDTH + BAR_GAP) * spreadsheet.values.length + BAR_GAP;\r\n const chartHeight = BAR_HEIGHT + BAR_GAP * 2;\r\n return { chartWidth, chartHeight };\r\n};\r\nconst chartXLabels = (spreadsheet, x, y, groupId, backgroundColor) => {\r\n var _a;\r\n return (((_a = spreadsheet.labels) === null || _a === void 0 ? void 0 : _a.map((label, index) => {\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_2__.newTextElement)(Object.assign(Object.assign({ groupIds: [groupId], backgroundColor }, commonProps), { text: label.length > 8 ? `${label.slice(0, 5)}...` : label, x: x + index * (BAR_WIDTH + BAR_GAP) + BAR_GAP * 2, y: y + BAR_GAP / 2, width: BAR_WIDTH, angle: 5.87, fontSize: 16, textAlign: \"center\", verticalAlign: \"top\" }));\r\n })) || []);\r\n};\r\nconst chartYLabels = (spreadsheet, x, y, groupId, backgroundColor) => {\r\n const minYLabel = (0,_element__WEBPACK_IMPORTED_MODULE_2__.newTextElement)(Object.assign(Object.assign({ groupIds: [groupId], backgroundColor }, commonProps), { x: x - BAR_GAP, y: y - BAR_GAP, text: \"0\", textAlign: \"right\" }));\r\n const maxYLabel = (0,_element__WEBPACK_IMPORTED_MODULE_2__.newTextElement)(Object.assign(Object.assign({ groupIds: [groupId], backgroundColor }, commonProps), { x: x - BAR_GAP, y: y - BAR_HEIGHT - minYLabel.height / 2, text: Math.max(...spreadsheet.values).toLocaleString(), textAlign: \"right\" }));\r\n return [minYLabel, maxYLabel];\r\n};\r\nconst chartLines = (spreadsheet, x, y, groupId, backgroundColor) => {\r\n const { chartWidth, chartHeight } = getChartDimentions(spreadsheet);\r\n const xLine = (0,_element__WEBPACK_IMPORTED_MODULE_2__.newLinearElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"line\", x,\r\n y, startArrowhead: null, endArrowhead: null, width: chartWidth, points: [\r\n [0, 0],\r\n [chartWidth, 0],\r\n ] }));\r\n const yLine = (0,_element__WEBPACK_IMPORTED_MODULE_2__.newLinearElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"line\", x,\r\n y, startArrowhead: null, endArrowhead: null, height: chartHeight, points: [\r\n [0, 0],\r\n [0, -chartHeight],\r\n ] }));\r\n const maxLine = (0,_element__WEBPACK_IMPORTED_MODULE_2__.newLinearElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"line\", x, y: y - BAR_HEIGHT - BAR_GAP, startArrowhead: null, endArrowhead: null, strokeStyle: \"dotted\", width: chartWidth, opacity: GRID_OPACITY, points: [\r\n [0, 0],\r\n [chartWidth, 0],\r\n ] }));\r\n return [xLine, yLine, maxLine];\r\n};\r\n// For the maths behind it https://excalidraw.com/#json=6320864370884608,O_5xfD-Agh32tytHpRJx1g\r\nconst chartBaseElements = (spreadsheet, x, y, groupId, backgroundColor, debug) => {\r\n const { chartWidth, chartHeight } = getChartDimentions(spreadsheet);\r\n const title = spreadsheet.title\r\n ? (0,_element__WEBPACK_IMPORTED_MODULE_2__.newTextElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { text: spreadsheet.title, x: x + chartWidth / 2, y: y - BAR_HEIGHT - BAR_GAP * 2 - _constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_FONT_SIZE, strokeSharpness: \"sharp\", strokeStyle: \"solid\", textAlign: \"center\" }))\r\n : null;\r\n const debugRect = debug\r\n ? (0,_element__WEBPACK_IMPORTED_MODULE_2__.newElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"rectangle\", x, y: y - chartHeight, width: chartWidth, height: chartHeight, strokeColor: _colors__WEBPACK_IMPORTED_MODULE_0__.default.elementStroke[0], fillStyle: \"solid\", opacity: 6 }))\r\n : null;\r\n return [\r\n ...(debugRect ? [debugRect] : []),\r\n ...(title ? [title] : []),\r\n ...chartXLabels(spreadsheet, x, y, groupId, backgroundColor),\r\n ...chartYLabels(spreadsheet, x, y, groupId, backgroundColor),\r\n ...chartLines(spreadsheet, x, y, groupId, backgroundColor),\r\n ];\r\n};\r\nconst chartTypeBar = (spreadsheet, x, y) => {\r\n const max = Math.max(...spreadsheet.values);\r\n const groupId = (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomId)();\r\n const backgroundColor = bgColors[Math.floor(Math.random() * bgColors.length)];\r\n const bars = spreadsheet.values.map((value, index) => {\r\n const barHeight = (value / max) * BAR_HEIGHT;\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_2__.newElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"rectangle\", x: x + index * (BAR_WIDTH + BAR_GAP) + BAR_GAP, y: y - barHeight - BAR_GAP, width: BAR_WIDTH, height: barHeight }));\r\n });\r\n return [\r\n ...bars,\r\n ...chartBaseElements(spreadsheet, x, y, groupId, backgroundColor, \"development\" === _constants__WEBPACK_IMPORTED_MODULE_1__.ENV.DEVELOPMENT),\r\n ];\r\n};\r\nconst chartTypeLine = (spreadsheet, x, y) => {\r\n const max = Math.max(...spreadsheet.values);\r\n const groupId = (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomId)();\r\n const backgroundColor = bgColors[Math.floor(Math.random() * bgColors.length)];\r\n let index = 0;\r\n const points = [];\r\n for (const value of spreadsheet.values) {\r\n const cx = index * (BAR_WIDTH + BAR_GAP);\r\n const cy = -(value / max) * BAR_HEIGHT;\r\n points.push([cx, cy]);\r\n index++;\r\n }\r\n const maxX = Math.max(...points.map((element) => element[0]));\r\n const maxY = Math.max(...points.map((element) => element[1]));\r\n const minX = Math.min(...points.map((element) => element[0]));\r\n const minY = Math.min(...points.map((element) => element[1]));\r\n const line = (0,_element__WEBPACK_IMPORTED_MODULE_2__.newLinearElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"line\", x: x + BAR_GAP + BAR_WIDTH / 2, y: y - BAR_GAP, startArrowhead: null, endArrowhead: null, height: maxY - minY, width: maxX - minX, strokeWidth: 2, points: points }));\r\n const dots = spreadsheet.values.map((value, index) => {\r\n const cx = index * (BAR_WIDTH + BAR_GAP) + BAR_GAP / 2;\r\n const cy = -(value / max) * BAR_HEIGHT + BAR_GAP / 2;\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_2__.newElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { fillStyle: \"solid\", strokeWidth: 2, type: \"ellipse\", x: x + cx + BAR_WIDTH / 2, y: y + cy - BAR_GAP * 2, width: BAR_GAP, height: BAR_GAP }));\r\n });\r\n const lines = spreadsheet.values.map((value, index) => {\r\n const cx = index * (BAR_WIDTH + BAR_GAP) + BAR_GAP / 2;\r\n const cy = (value / max) * BAR_HEIGHT + BAR_GAP / 2 + BAR_GAP;\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_2__.newLinearElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"line\", x: x + cx + BAR_WIDTH / 2 + BAR_GAP / 2, y: y - cy, startArrowhead: null, endArrowhead: null, height: cy, strokeStyle: \"dotted\", opacity: GRID_OPACITY, points: [\r\n [0, 0],\r\n [0, cy],\r\n ] }));\r\n });\r\n return [\r\n ...chartBaseElements(spreadsheet, x, y, groupId, backgroundColor, \"development\" === _constants__WEBPACK_IMPORTED_MODULE_1__.ENV.DEVELOPMENT),\r\n line,\r\n ...lines,\r\n ...dots,\r\n ];\r\n};\r\nconst renderSpreadsheet = (chartType, spreadsheet, x, y) => {\r\n if (chartType === \"line\") {\r\n return chartTypeLine(spreadsheet, x, y);\r\n }\r\n return chartTypeBar(spreadsheet, x, y);\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNOLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQzthQUNSLElBQ0QsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLEdBQUcsaUJBQWlCLENBQ2xCLFdBQVcsRUFDWCxDQUFDLEVBQ0QsQ0FBQyxFQUNELE9BQU8sRUFDUCxlQUFlLEVBQ2YsYUFBb0IsS0FBSyx1REFBZSxDQUN6QztRQUNELElBQUk7UUFDSixHQUFHLEtBQUs7UUFDUixHQUFHLElBQUk7S0FDUixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUssTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixTQUFpQixFQUNqQixXQUF3QixFQUN4QixDQUFTLEVBQ1QsQ0FBUyxFQUNNLEVBQUU7SUFDakIsSUFBSSxTQUFTLEtBQUssTUFBTSxFQUFFO1FBQ3hCLE9BQU8sYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDekM7SUFDRCxPQUFPLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jaGFydHMudHM/MmViZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29sb3JzIGZyb20gXCIuL2NvbG9yc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9GT05UX0ZBTUlMWSwgREVGQVVMVF9GT05UX1NJWkUsIEVOViB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbmV3RWxlbWVudCwgbmV3TGluZWFyRWxlbWVudCwgbmV3VGV4dEVsZW1lbnQgfSBmcm9tIFwiLi9lbGVtZW50XCI7XG5pbXBvcnQgeyBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQgfSBmcm9tIFwiLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyByYW5kb21JZCB9IGZyb20gXCIuL3JhbmRvbVwiO1xuXG5leHBvcnQgdHlwZSBDaGFydEVsZW1lbnRzID0gcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W107XG5cbmNvbnN0IEJBUl9XSURUSCA9IDMyO1xuY29uc3QgQkFSX0dBUCA9IDEyO1xuY29uc3QgQkFSX0hFSUdIVCA9IDI1NjtcbmNvbnN0IEdSSURfT1BBQ0lUWSA9IDUwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNwcmVhZHNoZWV0IHtcbiAgdGl0bGU6IHN0cmluZyB8IG51bGw7XG4gIGxhYmVsczogc3RyaW5nW10gfCBudWxsO1xuICB2YWx1ZXM6IG51bWJlcltdO1xufVxuXG5leHBvcnQgY29uc3QgTk9UX1NQUkVBRFNIRUVUID0gXCJOT1RfU1BSRUFEU0hFRVRcIjtcbmV4cG9ydCBjb25zdCBWQUxJRF9TUFJFQURTSEVFVCA9IFwiVkFMSURfU1BSRUFEU0hFRVRcIjtcblxudHlwZSBQYXJzZVNwcmVhZHNoZWV0UmVzdWx0ID1cbiAgfCB7IHR5cGU6IHR5cGVvZiBOT1RfU1BSRUFEU0hFRVQ7IHJlYXNvbjogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IHR5cGVvZiBWQUxJRF9TUFJFQURTSEVFVDsgc3ByZWFkc2hlZXQ6IFNwcmVhZHNoZWV0IH07XG5cbmNvbnN0IHRyeVBhcnNlTnVtYmVyID0gKHM6IHN0cmluZyk6IG51bWJlciB8IG51bGwgPT4ge1xuICBjb25zdCBtYXRjaCA9IC9eWyTigqzCo8Kl4oKpXT8oWzAtOSxdKyhcXC5bMC05XSspPykkLy5leGVjKHMpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHBhcnNlRmxvYXQobWF0Y2hbMV0ucmVwbGFjZSgvLC9nLCBcIlwiKSk7XG59O1xuXG5jb25zdCBpc051bWVyaWNDb2x1bW4gPSAobGluZXM6IHN0cmluZ1tdW10sIGNvbHVtbkluZGV4OiBudW1iZXIpID0+XG4gIGxpbmVzLnNsaWNlKDEpLmV2ZXJ5KChsaW5lKSA9PiB0cnlQYXJzZU51bWJlcihsaW5lW2NvbHVtbkluZGV4XSkgIT09IG51bGwpO1xuXG5jb25zdCB0cnlQYXJzZUNlbGxzID0gKGNlbGxzOiBzdHJpbmdbXVtdKTogUGFyc2VTcHJlYWRzaGVldFJlc3VsdCA9PiB7XG4gIGNvbnN0IG51bUNvbHMgPSBjZWxsc1swXS5sZW5ndGg7XG5cbiAgaWYgKG51bUNvbHMgPiAyKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogTk9UX1NQUkVBRFNIRUVULCByZWFzb246IFwiTW9yZSB0aGFuIDIgY29sdW1uc1wiIH07XG4gIH1cblxuICBpZiAobnVtQ29scyA9PT0gMSkge1xuICAgIGlmICghaXNOdW1lcmljQ29sdW1uKGNlbGxzLCAwKSkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogTk9UX1NQUkVBRFNIRUVULCByZWFzb246IFwiVmFsdWUgaXMgbm90IG51bWVyaWNcIiB9O1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0hlYWRlciA9IHRyeVBhcnNlTnVtYmVyKGNlbGxzWzBdWzBdKSA9PT0gbnVsbDtcbiAgICBjb25zdCB2YWx1ZXMgPSAoaGFzSGVhZGVyID8gY2VsbHMuc2xpY2UoMSkgOiBjZWxscykubWFwKChsaW5lKSA9PlxuICAgICAgdHJ5UGFyc2VOdW1iZXIobGluZVswXSksXG4gICAgKTtcblxuICAgIGlmICh2YWx1ZXMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogTk9UX1NQUkVBRFNIRUVULCByZWFzb246IFwiTGVzcyB0aGFuIHR3byByb3dzXCIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogVkFMSURfU1BSRUFEU0hFRVQsXG4gICAgICBzcHJlYWRzaGVldDoge1xuICAgICAgICB0aXRsZTogaGFzSGVhZGVyID8gY2VsbHNbMF1bMF0gOiBudWxsLFxuICAgICAgICBsYWJlbHM6IG51bGwsXG4gICAgICAgIHZhbHVlczogdmFsdWVzIGFzIG51bWJlcltdLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgdmFsdWVDb2x1bW5JbmRleCA9IGlzTnVtZXJpY0NvbHVtbihjZWxscywgMCkgPyAwIDogMTtcblxuICBpZiAoIWlzTnVtZXJpY0NvbHVtbihjZWxscywgdmFsdWVDb2x1bW5JbmRleCkpIHtcbiAgICByZXR1cm4geyB0eXBlOiBOT1RfU1BSRUFEU0hFRVQsIHJlYXNvbjogXCJWYWx1ZSBpcyBub3QgbnVtZXJpY1wiIH07XG4gIH1cblxuICBjb25zdCBsYWJlbENvbHVtbkluZGV4ID0gKHZhbHVlQ29sdW1uSW5kZXggKyAxKSAlIDI7XG4gIGNvbnN0IGhhc0hlYWRlciA9IHRyeVBhcnNlTnVtYmVyKGNlbGxzWzBdW3ZhbHVlQ29sdW1uSW5kZXhdKSA9PT0gbnVsbDtcbiAgY29uc3Qgcm93cyA9IGhhc0hlYWRlciA/IGNlbGxzLnNsaWNlKDEpIDogY2VsbHM7XG5cbiAgaWYgKHJvd3MubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiB7IHR5cGU6IE5PVF9TUFJFQURTSEVFVCwgcmVhc29uOiBcIkxlc3MgdGhhbiAyIHJvd3NcIiB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBWQUxJRF9TUFJFQURTSEVFVCxcbiAgICBzcHJlYWRzaGVldDoge1xuICAgICAgdGl0bGU6IGhhc0hlYWRlciA/IGNlbGxzWzBdW3ZhbHVlQ29sdW1uSW5kZXhdIDogbnVsbCxcbiAgICAgIGxhYmVsczogcm93cy5tYXAoKHJvdykgPT4gcm93W2xhYmVsQ29sdW1uSW5kZXhdKSxcbiAgICAgIHZhbHVlczogcm93cy5tYXAoKHJvdykgPT4gdHJ5UGFyc2VOdW1iZXIocm93W3ZhbHVlQ29sdW1uSW5kZXhdKSEpLFxuICAgIH0sXG4gIH07XG59O1xuXG5jb25zdCB0cmFuc3Bvc2VDZWxscyA9IChjZWxsczogc3RyaW5nW11bXSkgPT4ge1xuICBjb25zdCBuZXh0Q2VsbHM6IHN0cmluZ1tdW10gPSBbXTtcbiAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgY2VsbHNbMF0ubGVuZ3RoOyBjb2wrKykge1xuICAgIGNvbnN0IG5leHRDZWxsUm93OiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNlbGxzLmxlbmd0aDsgcm93KyspIHtcbiAgICAgIG5leHRDZWxsUm93LnB1c2goY2VsbHNbcm93XVtjb2xdKTtcbiAgICB9XG4gICAgbmV4dENlbGxzLnB1c2gobmV4dENlbGxSb3cpO1xuICB9XG4gIHJldHVybiBuZXh0Q2VsbHM7XG59O1xuXG5leHBvcnQgY29uc3QgdHJ5UGFyc2VTcHJlYWRzaGVldCA9ICh0ZXh0OiBzdHJpbmcpOiBQYXJzZVNwcmVhZHNoZWV0UmVzdWx0ID0+IHtcbiAgLy8gQ29weS9wYXN0ZSBmcm9tIGV4Y2VsLCBzcHJlYWRoc2VldHMsIHRzdiwgY3N2LlxuICAvLyBGb3Igbm93IHdlIG9ubHkgYWNjZXB0IDIgY29sdW1ucyB3aXRoIGFuIG9wdGlvbmFsIGhlYWRlclxuXG4gIC8vIENoZWNrIGZvciB0YWIgc2VwYXJhdGVkIHZhbHVlc1xuICBsZXQgbGluZXMgPSB0ZXh0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpLnNwbGl0KFwiXFx0XCIpKTtcblxuICAvLyBDaGVjayBmb3IgY29tbWEgc2VwYXJhdGVkIGZpbGVzXG4gIGlmIChsaW5lcy5sZW5ndGggJiYgbGluZXNbMF0ubGVuZ3RoICE9PSAyKSB7XG4gICAgbGluZXMgPSB0ZXh0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpLnNwbGl0KFwiLFwiKSk7XG4gIH1cblxuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogTk9UX1NQUkVBRFNIRUVULCByZWFzb246IFwiTm8gdmFsdWVzXCIgfTtcbiAgfVxuXG4gIGNvbnN0IG51bUNvbHNGaXJzdExpbmUgPSBsaW5lc1swXS5sZW5ndGg7XG4gIGNvbnN0IGlzU3ByZWFkc2hlZXQgPSBsaW5lcy5ldmVyeSgobGluZSkgPT4gbGluZS5sZW5ndGggPT09IG51bUNvbHNGaXJzdExpbmUpO1xuXG4gIGlmICghaXNTcHJlYWRzaGVldCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBOT1RfU1BSRUFEU0hFRVQsXG4gICAgICByZWFzb246IFwiQWxsIHJvd3MgZG9uJ3QgaGF2ZSBzYW1lIG51bWJlciBvZiBjb2x1bW5zXCIsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHRyeVBhcnNlQ2VsbHMobGluZXMpO1xuICBpZiAocmVzdWx0LnR5cGUgIT09IFZBTElEX1NQUkVBRFNIRUVUKSB7XG4gICAgY29uc3QgdHJhbnNwb3NlZFJlc3VsdHMgPSB0cnlQYXJzZUNlbGxzKHRyYW5zcG9zZUNlbGxzKGxpbmVzKSk7XG4gICAgaWYgKHRyYW5zcG9zZWRSZXN1bHRzLnR5cGUgPT09IFZBTElEX1NQUkVBRFNIRUVUKSB7XG4gICAgICByZXR1cm4gdHJhbnNwb3NlZFJlc3VsdHM7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBiZ0NvbG9ycyA9IGNvbG9ycy5lbGVtZW50QmFja2dyb3VuZC5zbGljZShcbiAgMixcbiAgY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kLmxlbmd0aCxcbik7XG5cbi8vIFB1dCBhbGwgdGhlIGNvbW1vbiBwcm9wZXJ0aWVzIGhlcmUgc28gd2hlbiB0aGUgd2hvbGUgY2hhcnQgaXMgc2VsZWN0ZWRcbi8vIHRoZSBwcm9wZXJ0aWVzIGRpYWxvZyBzaG93cyB0aGUgY29ycmVjdCBzZWxlY3RlZCB2YWx1ZXNcbmNvbnN0IGNvbW1vblByb3BzID0ge1xuICBmaWxsU3R5bGU6IFwiaGFjaHVyZVwiLFxuICBmb250RmFtaWx5OiBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICBmb250U2l6ZTogREVGQVVMVF9GT05UX1NJWkUsXG4gIG9wYWNpdHk6IDEwMCxcbiAgcm91Z2huZXNzOiAxLFxuICBzdHJva2VDb2xvcjogY29sb3JzLmVsZW1lbnRTdHJva2VbMF0sXG4gIHN0cm9rZVNoYXJwbmVzczogXCJzaGFycFwiLFxuICBzdHJva2VTdHlsZTogXCJzb2xpZFwiLFxuICBzdHJva2VXaWR0aDogMSxcbiAgdmVydGljYWxBbGlnbjogXCJtaWRkbGVcIixcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGdldENoYXJ0RGltZW50aW9ucyA9IChzcHJlYWRzaGVldDogU3ByZWFkc2hlZXQpID0+IHtcbiAgY29uc3QgY2hhcnRXaWR0aCA9XG4gICAgKEJBUl9XSURUSCArIEJBUl9HQVApICogc3ByZWFkc2hlZXQudmFsdWVzLmxlbmd0aCArIEJBUl9HQVA7XG4gIGNvbnN0IGNoYXJ0SGVpZ2h0ID0gQkFSX0hFSUdIVCArIEJBUl9HQVAgKiAyO1xuICByZXR1cm4geyBjaGFydFdpZHRoLCBjaGFydEhlaWdodCB9O1xufTtcblxuY29uc3QgY2hhcnRYTGFiZWxzID0gKFxuICBzcHJlYWRzaGVldDogU3ByZWFkc2hlZXQsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBncm91cElkOiBzdHJpbmcsXG4gIGJhY2tncm91bmRDb2xvcjogc3RyaW5nLFxuKTogQ2hhcnRFbGVtZW50cyA9PiB7XG4gIHJldHVybiAoXG4gICAgc3ByZWFkc2hlZXQubGFiZWxzPy5tYXAoKGxhYmVsLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIG5ld1RleHRFbGVtZW50KHtcbiAgICAgICAgZ3JvdXBJZHM6IFtncm91cElkXSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAuLi5jb21tb25Qcm9wcyxcbiAgICAgICAgdGV4dDogbGFiZWwubGVuZ3RoID4gOCA/IGAke2xhYmVsLnNsaWNlKDAsIDUpfS4uLmAgOiBsYWJlbCxcbiAgICAgICAgeDogeCArIGluZGV4ICogKEJBUl9XSURUSCArIEJBUl9HQVApICsgQkFSX0dBUCAqIDIsXG4gICAgICAgIHk6IHkgKyBCQVJfR0FQIC8gMixcbiAgICAgICAgd2lkdGg6IEJBUl9XSURUSCxcbiAgICAgICAgYW5nbGU6IDUuODcsXG4gICAgICAgIGZvbnRTaXplOiAxNixcbiAgICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiBcInRvcFwiLFxuICAgICAgfSk7XG4gICAgfSkgfHwgW11cbiAgKTtcbn07XG5cbmNvbnN0IGNoYXJ0WUxhYmVscyA9IChcbiAgc3ByZWFkc2hlZXQ6IFNwcmVhZHNoZWV0LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgZ3JvdXBJZDogc3RyaW5nLFxuICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyxcbik6IENoYXJ0RWxlbWVudHMgPT4ge1xuICBjb25zdCBtaW5ZTGFiZWwgPSBuZXdUZXh0RWxlbWVudCh7XG4gICAgZ3JvdXBJZHM6IFtncm91cElkXSxcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgLi4uY29tbW9uUHJvcHMsXG4gICAgeDogeCAtIEJBUl9HQVAsXG4gICAgeTogeSAtIEJBUl9HQVAsXG4gICAgdGV4dDogXCIwXCIsXG4gICAgdGV4dEFsaWduOiBcInJpZ2h0XCIsXG4gIH0pO1xuXG4gIGNvbnN0IG1heFlMYWJlbCA9IG5ld1RleHRFbGVtZW50KHtcbiAgICBncm91cElkczogW2dyb3VwSWRdLFxuICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAuLi5jb21tb25Qcm9wcyxcbiAgICB4OiB4IC0gQkFSX0dBUCxcbiAgICB5OiB5IC0gQkFSX0hFSUdIVCAtIG1pbllMYWJlbC5oZWlnaHQgLyAyLFxuICAgIHRleHQ6IE1hdGgubWF4KC4uLnNwcmVhZHNoZWV0LnZhbHVlcykudG9Mb2NhbGVTdHJpbmcoKSxcbiAgICB0ZXh0QWxpZ246IFwicmlnaHRcIixcbiAgfSk7XG5cbiAgcmV0dXJuIFttaW5ZTGFiZWwsIG1heFlMYWJlbF07XG59O1xuXG5jb25zdCBjaGFydExpbmVzID0gKFxuICBzcHJlYWRzaGVldDogU3ByZWFkc2hlZXQsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBncm91cElkOiBzdHJpbmcsXG4gIGJhY2tncm91bmRDb2xvcjogc3RyaW5nLFxuKTogQ2hhcnRFbGVtZW50cyA9PiB7XG4gIGNvbnN0IHsgY2hhcnRXaWR0aCwgY2hhcnRIZWlnaHQgfSA9IGdldENoYXJ0RGltZW50aW9ucyhzcHJlYWRzaGVldCk7XG4gIGNvbnN0IHhMaW5lID0gbmV3TGluZWFyRWxlbWVudCh7XG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIGdyb3VwSWRzOiBbZ3JvdXBJZF0sXG4gICAgLi4uY29tbW9uUHJvcHMsXG4gICAgdHlwZTogXCJsaW5lXCIsXG4gICAgeCxcbiAgICB5LFxuICAgIHN0YXJ0QXJyb3doZWFkOiBudWxsLFxuICAgIGVuZEFycm93aGVhZDogbnVsbCxcbiAgICB3aWR0aDogY2hhcnRXaWR0aCxcbiAgICBwb2ludHM6IFtcbiAgICAgIFswLCAwXSxcbiAgICAgIFtjaGFydFdpZHRoLCAwXSxcbiAgICBdLFxuICB9KTtcblxuICBjb25zdCB5TGluZSA9IG5ld0xpbmVhckVsZW1lbnQoe1xuICAgIGJhY2tncm91bmRDb2xvcixcbiAgICBncm91cElkczogW2dyb3VwSWRdLFxuICAgIC4uLmNvbW1vblByb3BzLFxuICAgIHR5cGU6IFwibGluZVwiLFxuICAgIHgsXG4gICAgeSxcbiAgICBzdGFydEFycm93aGVhZDogbnVsbCxcbiAgICBlbmRBcnJvd2hlYWQ6IG51bGwsXG4gICAgaGVpZ2h0OiBjaGFydEhlaWdodCxcbiAgICBwb2ludHM6IFtcbiAgICAgIFswLCAwXSxcbiAgICAgIFswLCAtY2hhcnRIZWlnaHRdLFxuICAgIF0sXG4gIH0pO1xuXG4gIGNvbnN0IG1heExpbmUgPSBuZXdMaW5lYXJFbGVtZW50KHtcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgZ3JvdXBJZHM6IFtncm91cElkXSxcbiAgICAuLi5jb21tb25Qcm9wcyxcbiAgICB0eXBlOiBcImxpbmVcIixcbiAgICB4LFxuICAgIHk6IHkgLSBCQVJfSEVJR0hUIC0gQkFSX0dBUCxcbiAgICBzdGFydEFycm93aGVhZDogbnVsbCxcbiAgICBlbmRBcnJvd2hlYWQ6IG51bGwsXG4gICAgc3Ryb2tlU3R5bGU6IFwiZG90dGVkXCIsXG4gICAgd2lkdGg6IGNoYXJ0V2lkdGgsXG4gICAgb3BhY2l0eTogR1JJRF9PUEFDSVRZLFxuICAgIHBvaW50czogW1xuICAgICAgWzAsIDBdLFxuICAgICAgW2NoYXJ0V2lkdGgsIDBdLFxuICAgIF0sXG4gIH0pO1xuXG4gIHJldHVybiBbeExpbmUsIHlMaW5lLCBtYXhMaW5lXTtcbn07XG5cbi8vIEZvciB0aGUgbWF0aHMgYmVoaW5kIGl0IGh0dHBzOi8vZXhjYWxpZHJhdy5jb20vI2pzb249NjMyMDg2NDM3MDg4NDYwOCxPXzV4ZkQtQWdoMzJ0eXRIcFJKeDFnXG5jb25zdCBjaGFydEJhc2VFbGVtZW50cyA9IChcbiAgc3ByZWFkc2hlZXQ6IFNwcmVhZHNoZWV0LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgZ3JvdXBJZDogc3RyaW5nLFxuICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyxcbiAgZGVidWc/OiBib29sZWFuLFxuKTogQ2hhcnRFbGVtZW50cyA9PiB7XG4gIGNvbnN0IHsgY2hhcnRXaWR0aCwgY2hhcnRIZWlnaHQgfSA9IGdldENoYXJ0RGltZW50aW9ucyhzcHJlYWRzaGVldCk7XG5cbiAgY29uc3QgdGl0bGUgPSBzcHJlYWRzaGVldC50aXRsZVxuICAgID8gbmV3VGV4dEVsZW1lbnQoe1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIGdyb3VwSWRzOiBbZ3JvdXBJZF0sXG4gICAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgICB0ZXh0OiBzcHJlYWRzaGVldC50aXRsZSxcbiAgICAgICAgeDogeCArIGNoYXJ0V2lkdGggLyAyLFxuICAgICAgICB5OiB5IC0gQkFSX0hFSUdIVCAtIEJBUl9HQVAgKiAyIC0gREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgIHN0cm9rZVNoYXJwbmVzczogXCJzaGFycFwiLFxuICAgICAgICBzdHJva2VTdHlsZTogXCJzb2xpZFwiLFxuICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXG4gICAgICB9KVxuICAgIDogbnVsbDtcblxuICBjb25zdCBkZWJ1Z1JlY3QgPSBkZWJ1Z1xuICAgID8gbmV3RWxlbWVudCh7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgZ3JvdXBJZHM6IFtncm91cElkXSxcbiAgICAgICAgLi4uY29tbW9uUHJvcHMsXG4gICAgICAgIHR5cGU6IFwicmVjdGFuZ2xlXCIsXG4gICAgICAgIHgsXG4gICAgICAgIHk6IHkgLSBjaGFydEhlaWdodCxcbiAgICAgICAgd2lkdGg6IGNoYXJ0V2lkdGgsXG4gICAgICAgIGhlaWdodDogY2hhcnRIZWlnaHQsXG4gICAgICAgIHN0cm9rZUNvbG9yOiBjb2xvcnMuZWxlbWVudFN0cm9rZVswXSxcbiAgICAgICAgZmlsbFN0eWxlOiBcInNvbGlkXCIsXG4gICAgICAgIG9wYWNpdHk6IDYsXG4gICAgICB9KVxuICAgIDogbnVsbDtcblxuICByZXR1cm4gW1xuICAgIC4uLihkZWJ1Z1JlY3QgPyBbZGVidWdSZWN0XSA6IFtdKSxcbiAgICAuLi4odGl0bGUgPyBbdGl0bGVdIDogW10pLFxuICAgIC4uLmNoYXJ0WExhYmVscyhzcHJlYWRzaGVldCwgeCwgeSwgZ3JvdXBJZCwgYmFja2dyb3VuZENvbG9yKSxcbiAgICAuLi5jaGFydFlMYWJlbHMoc3ByZWFkc2hlZXQsIHgsIHksIGdyb3VwSWQsIGJhY2tncm91bmRDb2xvciksXG4gICAgLi4uY2hhcnRMaW5lcyhzcHJlYWRzaGVldCwgeCwgeSwgZ3JvdXBJZCwgYmFja2dyb3VuZENvbG9yKSxcbiAgXTtcbn07XG5cbmNvbnN0IGNoYXJ0VHlwZUJhciA9IChcbiAgc3ByZWFkc2hlZXQ6IFNwcmVhZHNoZWV0LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IENoYXJ0RWxlbWVudHMgPT4ge1xuICBjb25zdCBtYXggPSBNYXRoLm1heCguLi5zcHJlYWRzaGVldC52YWx1ZXMpO1xuICBjb25zdCBncm91cElkID0gcmFuZG9tSWQoKTtcbiAgY29uc3QgYmFja2dyb3VuZENvbG9yID0gYmdDb2xvcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYmdDb2xvcnMubGVuZ3RoKV07XG5cbiAgY29uc3QgYmFycyA9IHNwcmVhZHNoZWV0LnZhbHVlcy5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGJhckhlaWdodCA9ICh2YWx1ZSAvIG1heCkgKiBCQVJfSEVJR0hUO1xuICAgIHJldHVybiBuZXdFbGVtZW50KHtcbiAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgIGdyb3VwSWRzOiBbZ3JvdXBJZF0sXG4gICAgICAuLi5jb21tb25Qcm9wcyxcbiAgICAgIHR5cGU6IFwicmVjdGFuZ2xlXCIsXG4gICAgICB4OiB4ICsgaW5kZXggKiAoQkFSX1dJRFRIICsgQkFSX0dBUCkgKyBCQVJfR0FQLFxuICAgICAgeTogeSAtIGJhckhlaWdodCAtIEJBUl9HQVAsXG4gICAgICB3aWR0aDogQkFSX1dJRFRILFxuICAgICAgaGVpZ2h0OiBiYXJIZWlnaHQsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBbXG4gICAgLi4uYmFycyxcbiAgICAuLi5jaGFydEJhc2VFbGVtZW50cyhcbiAgICAgIHNwcmVhZHNoZWV0LFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBncm91cElkLFxuICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5ERVZFTE9QTUVOVCxcbiAgICApLFxuICBdO1xufTtcblxuY29uc3QgY2hhcnRUeXBlTGluZSA9IChcbiAgc3ByZWFkc2hlZXQ6IFNwcmVhZHNoZWV0LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IENoYXJ0RWxlbWVudHMgPT4ge1xuICBjb25zdCBtYXggPSBNYXRoLm1heCguLi5zcHJlYWRzaGVldC52YWx1ZXMpO1xuICBjb25zdCBncm91cElkID0gcmFuZG9tSWQoKTtcbiAgY29uc3QgYmFja2dyb3VuZENvbG9yID0gYmdDb2xvcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYmdDb2xvcnMubGVuZ3RoKV07XG5cbiAgbGV0IGluZGV4ID0gMDtcbiAgY29uc3QgcG9pbnRzID0gW107XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc3ByZWFkc2hlZXQudmFsdWVzKSB7XG4gICAgY29uc3QgY3ggPSBpbmRleCAqIChCQVJfV0lEVEggKyBCQVJfR0FQKTtcbiAgICBjb25zdCBjeSA9IC0odmFsdWUgLyBtYXgpICogQkFSX0hFSUdIVDtcbiAgICBwb2ludHMucHVzaChbY3gsIGN5XSk7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGNvbnN0IG1heFggPSBNYXRoLm1heCguLi5wb2ludHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50WzBdKSk7XG4gIGNvbnN0IG1heFkgPSBNYXRoLm1heCguLi5wb2ludHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50WzFdKSk7XG4gIGNvbnN0IG1pblggPSBNYXRoLm1pbiguLi5wb2ludHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50WzBdKSk7XG4gIGNvbnN0IG1pblkgPSBNYXRoLm1pbiguLi5wb2ludHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50WzFdKSk7XG5cbiAgY29uc3QgbGluZSA9IG5ld0xpbmVhckVsZW1lbnQoe1xuICAgIGJhY2tncm91bmRDb2xvcixcbiAgICBncm91cElkczogW2dyb3VwSWRdLFxuICAgIC4uLmNvbW1vblByb3BzLFxuICAgIHR5cGU6IFwibGluZVwiLFxuICAgIHg6IHggKyBCQVJfR0FQICsgQkFSX1dJRFRIIC8gMixcbiAgICB5OiB5IC0gQkFSX0dBUCxcbiAgICBzdGFydEFycm93aGVhZDogbnVsbCxcbiAgICBlbmRBcnJvd2hlYWQ6IG51bGwsXG4gICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcbiAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgcG9pbnRzOiBwb2ludHMgYXMgYW55LFxuICB9KTtcblxuICBjb25zdCBkb3RzID0gc3ByZWFkc2hlZXQudmFsdWVzLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgY3ggPSBpbmRleCAqIChCQVJfV0lEVEggKyBCQVJfR0FQKSArIEJBUl9HQVAgLyAyO1xuICAgIGNvbnN0IGN5ID0gLSh2YWx1ZSAvIG1heCkgKiBCQVJfSEVJR0hUICsgQkFSX0dBUCAvIDI7XG4gICAgcmV0dXJuIG5ld0VsZW1lbnQoe1xuICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgZ3JvdXBJZHM6IFtncm91cElkXSxcbiAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgZmlsbFN0eWxlOiBcInNvbGlkXCIsXG4gICAgICBzdHJva2VXaWR0aDogMixcbiAgICAgIHR5cGU6IFwiZWxsaXBzZVwiLFxuICAgICAgeDogeCArIGN4ICsgQkFSX1dJRFRIIC8gMixcbiAgICAgIHk6IHkgKyBjeSAtIEJBUl9HQVAgKiAyLFxuICAgICAgd2lkdGg6IEJBUl9HQVAsXG4gICAgICBoZWlnaHQ6IEJBUl9HQVAsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IGxpbmVzID0gc3ByZWFkc2hlZXQudmFsdWVzLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgY3ggPSBpbmRleCAqIChCQVJfV0lEVEggKyBCQVJfR0FQKSArIEJBUl9HQVAgLyAyO1xuICAgIGNvbnN0IGN5ID0gKHZhbHVlIC8gbWF4KSAqIEJBUl9IRUlHSFQgKyBCQVJfR0FQIC8gMiArIEJBUl9HQVA7XG4gICAgcmV0dXJuIG5ld0xpbmVhckVsZW1lbnQoe1xuICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgZ3JvdXBJZHM6IFtncm91cElkXSxcbiAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgdHlwZTogXCJsaW5lXCIsXG4gICAgICB4OiB4ICsgY3ggKyBCQVJfV0lEVEggLyAyICsgQkFSX0dBUCAvIDIsXG4gICAgICB5OiB5IC0gY3ksXG4gICAgICBzdGFydEFycm93aGVhZDogbnVsbCxcbiAgICAgIGVuZEFycm93aGVhZDogbnVsbCxcbiAgICAgIGhlaWdodDogY3ksXG4gICAgICBzdHJva2VTdHlsZTogXCJkb3R0ZWRcIixcbiAgICAgIG9wYWNpdHk6IEdSSURfT1BBQ0lUWSxcbiAgICAgIHBvaW50czogW1xuICAgICAgICBbMCwgMF0sXG4gICAgICAgIFswLCBjeV0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gW1xuICAgIC4uLmNoYXJ0QmFzZUVsZW1lbnRzKFxuICAgICAgc3ByZWFkc2hlZXQsXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIGdyb3VwSWQsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLkRFVkVMT1BNRU5ULFxuICAgICksXG4gICAgbGluZSxcbiAgICAuLi5saW5lcyxcbiAgICAuLi5kb3RzLFxuICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbmRlclNwcmVhZHNoZWV0ID0gKFxuICBjaGFydFR5cGU6IHN0cmluZyxcbiAgc3ByZWFkc2hlZXQ6IFNwcmVhZHNoZWV0LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IENoYXJ0RWxlbWVudHMgPT4ge1xuICBpZiAoY2hhcnRUeXBlID09PSBcImxpbmVcIikge1xuICAgIHJldHVybiBjaGFydFR5cGVMaW5lKHNwcmVhZHNoZWV0LCB4LCB5KTtcbiAgfVxuICByZXR1cm4gY2hhcnRUeXBlQmFyKHNwcmVhZHNoZWV0LCB4LCB5KTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../charts.ts\n");
1570
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"NOT_SPREADSHEET\": () => (/* binding */ NOT_SPREADSHEET),\n/* harmony export */ \"VALID_SPREADSHEET\": () => (/* binding */ VALID_SPREADSHEET),\n/* harmony export */ \"tryParseSpreadsheet\": () => (/* binding */ tryParseSpreadsheet),\n/* harmony export */ \"renderSpreadsheet\": () => (/* binding */ renderSpreadsheet)\n/* harmony export */ });\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./element */ \"../../element/index.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./random */ \"../../random.ts\");\n\r\n\r\n\r\n\r\nconst BAR_WIDTH = 32;\r\nconst BAR_GAP = 12;\r\nconst BAR_HEIGHT = 256;\r\nconst GRID_OPACITY = 50;\r\nconst NOT_SPREADSHEET = \"NOT_SPREADSHEET\";\r\nconst VALID_SPREADSHEET = \"VALID_SPREADSHEET\";\r\nconst tryParseNumber = (s) => {\r\n const match = /^[$€£¥₩]?([0-9,]+(\\.[0-9]+)?)$/.exec(s);\r\n if (!match) {\r\n return null;\r\n }\r\n return parseFloat(match[1].replace(/,/g, \"\"));\r\n};\r\nconst isNumericColumn = (lines, columnIndex) => lines.slice(1).every((line) => tryParseNumber(line[columnIndex]) !== null);\r\nconst tryParseCells = (cells) => {\r\n const numCols = cells[0].length;\r\n if (numCols > 2) {\r\n return { type: NOT_SPREADSHEET, reason: \"More than 2 columns\" };\r\n }\r\n if (numCols === 1) {\r\n if (!isNumericColumn(cells, 0)) {\r\n return { type: NOT_SPREADSHEET, reason: \"Value is not numeric\" };\r\n }\r\n const hasHeader = tryParseNumber(cells[0][0]) === null;\r\n const values = (hasHeader ? cells.slice(1) : cells).map((line) => tryParseNumber(line[0]));\r\n if (values.length < 2) {\r\n return { type: NOT_SPREADSHEET, reason: \"Less than two rows\" };\r\n }\r\n return {\r\n type: VALID_SPREADSHEET,\r\n spreadsheet: {\r\n title: hasHeader ? cells[0][0] : null,\r\n labels: null,\r\n values: values,\r\n },\r\n };\r\n }\r\n const valueColumnIndex = isNumericColumn(cells, 0) ? 0 : 1;\r\n if (!isNumericColumn(cells, valueColumnIndex)) {\r\n return { type: NOT_SPREADSHEET, reason: \"Value is not numeric\" };\r\n }\r\n const labelColumnIndex = (valueColumnIndex + 1) % 2;\r\n const hasHeader = tryParseNumber(cells[0][valueColumnIndex]) === null;\r\n const rows = hasHeader ? cells.slice(1) : cells;\r\n if (rows.length < 2) {\r\n return { type: NOT_SPREADSHEET, reason: \"Less than 2 rows\" };\r\n }\r\n return {\r\n type: VALID_SPREADSHEET,\r\n spreadsheet: {\r\n title: hasHeader ? cells[0][valueColumnIndex] : null,\r\n labels: rows.map((row) => row[labelColumnIndex]),\r\n values: rows.map((row) => tryParseNumber(row[valueColumnIndex])),\r\n },\r\n };\r\n};\r\nconst transposeCells = (cells) => {\r\n const nextCells = [];\r\n for (let col = 0; col < cells[0].length; col++) {\r\n const nextCellRow = [];\r\n for (let row = 0; row < cells.length; row++) {\r\n nextCellRow.push(cells[row][col]);\r\n }\r\n nextCells.push(nextCellRow);\r\n }\r\n return nextCells;\r\n};\r\nconst tryParseSpreadsheet = (text) => {\r\n // Copy/paste from excel, spreadhseets, tsv, csv.\r\n // For now we only accept 2 columns with an optional header\r\n // Check for tab separated values\r\n let lines = text\r\n .trim()\r\n .split(\"\\n\")\r\n .map((line) => line.trim().split(\"\\t\"));\r\n // Check for comma separated files\r\n if (lines.length && lines[0].length !== 2) {\r\n lines = text\r\n .trim()\r\n .split(\"\\n\")\r\n .map((line) => line.trim().split(\",\"));\r\n }\r\n if (lines.length === 0) {\r\n return { type: NOT_SPREADSHEET, reason: \"No values\" };\r\n }\r\n const numColsFirstLine = lines[0].length;\r\n const isSpreadsheet = lines.every((line) => line.length === numColsFirstLine);\r\n if (!isSpreadsheet) {\r\n return {\r\n type: NOT_SPREADSHEET,\r\n reason: \"All rows don't have same number of columns\",\r\n };\r\n }\r\n const result = tryParseCells(lines);\r\n if (result.type !== VALID_SPREADSHEET) {\r\n const transposedResults = tryParseCells(transposeCells(lines));\r\n if (transposedResults.type === VALID_SPREADSHEET) {\r\n return transposedResults;\r\n }\r\n }\r\n return result;\r\n};\r\nconst bgColors = _colors__WEBPACK_IMPORTED_MODULE_0__.default.elementBackground.slice(2, _colors__WEBPACK_IMPORTED_MODULE_0__.default.elementBackground.length);\r\n// Put all the common properties here so when the whole chart is selected\r\n// the properties dialog shows the correct selected values\r\nconst commonProps = {\r\n fillStyle: \"hachure\",\r\n fontFamily: _constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_FONT_FAMILY,\r\n fontSize: _constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_FONT_SIZE,\r\n opacity: 100,\r\n roughness: 1,\r\n strokeColor: _colors__WEBPACK_IMPORTED_MODULE_0__.default.elementStroke[0],\r\n strokeSharpness: \"sharp\",\r\n strokeStyle: \"solid\",\r\n strokeWidth: 1,\r\n verticalAlign: \"middle\",\r\n};\r\nconst getChartDimentions = (spreadsheet) => {\r\n const chartWidth = (BAR_WIDTH + BAR_GAP) * spreadsheet.values.length + BAR_GAP;\r\n const chartHeight = BAR_HEIGHT + BAR_GAP * 2;\r\n return { chartWidth, chartHeight };\r\n};\r\nconst chartXLabels = (spreadsheet, x, y, groupId, backgroundColor) => {\r\n var _a;\r\n return (((_a = spreadsheet.labels) === null || _a === void 0 ? void 0 : _a.map((label, index) => {\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_2__.newTextElement)(Object.assign(Object.assign({ groupIds: [groupId], backgroundColor }, commonProps), { text: label.length > 8 ? `${label.slice(0, 5)}...` : label, rawText: label.length > 8 ? `${label.slice(0, 5)}...` : label, x: x + index * (BAR_WIDTH + BAR_GAP) + BAR_GAP * 2, y: y + BAR_GAP / 2, width: BAR_WIDTH, angle: 5.87, fontSize: 16, textAlign: \"center\", verticalAlign: \"top\" }));\r\n })) || []);\r\n};\r\nconst chartYLabels = (spreadsheet, x, y, groupId, backgroundColor) => {\r\n const minYLabel = (0,_element__WEBPACK_IMPORTED_MODULE_2__.newTextElement)(Object.assign(Object.assign({ groupIds: [groupId], backgroundColor }, commonProps), { x: x - BAR_GAP, y: y - BAR_GAP, text: \"0\", rawText: \"0\", textAlign: \"right\" }));\r\n const maxYLabel = (0,_element__WEBPACK_IMPORTED_MODULE_2__.newTextElement)(Object.assign(Object.assign({ groupIds: [groupId], backgroundColor }, commonProps), { x: x - BAR_GAP, y: y - BAR_HEIGHT - minYLabel.height / 2, text: Math.max(...spreadsheet.values).toLocaleString(), rawText: Math.max(...spreadsheet.values).toLocaleString(), textAlign: \"right\" }));\r\n return [minYLabel, maxYLabel];\r\n};\r\nconst chartLines = (spreadsheet, x, y, groupId, backgroundColor) => {\r\n const { chartWidth, chartHeight } = getChartDimentions(spreadsheet);\r\n const xLine = (0,_element__WEBPACK_IMPORTED_MODULE_2__.newLinearElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"line\", x,\r\n y, startArrowhead: null, endArrowhead: null, width: chartWidth, points: [\r\n [0, 0],\r\n [chartWidth, 0],\r\n ] }));\r\n const yLine = (0,_element__WEBPACK_IMPORTED_MODULE_2__.newLinearElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"line\", x,\r\n y, startArrowhead: null, endArrowhead: null, height: chartHeight, points: [\r\n [0, 0],\r\n [0, -chartHeight],\r\n ] }));\r\n const maxLine = (0,_element__WEBPACK_IMPORTED_MODULE_2__.newLinearElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"line\", x, y: y - BAR_HEIGHT - BAR_GAP, startArrowhead: null, endArrowhead: null, strokeStyle: \"dotted\", width: chartWidth, opacity: GRID_OPACITY, points: [\r\n [0, 0],\r\n [chartWidth, 0],\r\n ] }));\r\n return [xLine, yLine, maxLine];\r\n};\r\n// For the maths behind it https://excalidraw.com/#json=6320864370884608,O_5xfD-Agh32tytHpRJx1g\r\nconst chartBaseElements = (spreadsheet, x, y, groupId, backgroundColor, debug) => {\r\n const { chartWidth, chartHeight } = getChartDimentions(spreadsheet);\r\n const title = spreadsheet.title\r\n ? (0,_element__WEBPACK_IMPORTED_MODULE_2__.newTextElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { text: spreadsheet.title, rawText: spreadsheet.title, x: x + chartWidth / 2, y: y - BAR_HEIGHT - BAR_GAP * 2 - _constants__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_FONT_SIZE, strokeSharpness: \"sharp\", strokeStyle: \"solid\", textAlign: \"center\" }))\r\n : null;\r\n const debugRect = debug\r\n ? (0,_element__WEBPACK_IMPORTED_MODULE_2__.newElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"rectangle\", x, y: y - chartHeight, width: chartWidth, height: chartHeight, strokeColor: _colors__WEBPACK_IMPORTED_MODULE_0__.default.elementStroke[0], fillStyle: \"solid\", opacity: 6 }))\r\n : null;\r\n return [\r\n ...(debugRect ? [debugRect] : []),\r\n ...(title ? [title] : []),\r\n ...chartXLabels(spreadsheet, x, y, groupId, backgroundColor),\r\n ...chartYLabels(spreadsheet, x, y, groupId, backgroundColor),\r\n ...chartLines(spreadsheet, x, y, groupId, backgroundColor),\r\n ];\r\n};\r\nconst chartTypeBar = (spreadsheet, x, y) => {\r\n const max = Math.max(...spreadsheet.values);\r\n const groupId = (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomId)();\r\n const backgroundColor = bgColors[Math.floor(Math.random() * bgColors.length)];\r\n const bars = spreadsheet.values.map((value, index) => {\r\n const barHeight = (value / max) * BAR_HEIGHT;\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_2__.newElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"rectangle\", x: x + index * (BAR_WIDTH + BAR_GAP) + BAR_GAP, y: y - barHeight - BAR_GAP, width: BAR_WIDTH, height: barHeight }));\r\n });\r\n return [\r\n ...bars,\r\n ...chartBaseElements(spreadsheet, x, y, groupId, backgroundColor, \"development\" === _constants__WEBPACK_IMPORTED_MODULE_1__.ENV.DEVELOPMENT),\r\n ];\r\n};\r\nconst chartTypeLine = (spreadsheet, x, y) => {\r\n const max = Math.max(...spreadsheet.values);\r\n const groupId = (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomId)();\r\n const backgroundColor = bgColors[Math.floor(Math.random() * bgColors.length)];\r\n let index = 0;\r\n const points = [];\r\n for (const value of spreadsheet.values) {\r\n const cx = index * (BAR_WIDTH + BAR_GAP);\r\n const cy = -(value / max) * BAR_HEIGHT;\r\n points.push([cx, cy]);\r\n index++;\r\n }\r\n const maxX = Math.max(...points.map((element) => element[0]));\r\n const maxY = Math.max(...points.map((element) => element[1]));\r\n const minX = Math.min(...points.map((element) => element[0]));\r\n const minY = Math.min(...points.map((element) => element[1]));\r\n const line = (0,_element__WEBPACK_IMPORTED_MODULE_2__.newLinearElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"line\", x: x + BAR_GAP + BAR_WIDTH / 2, y: y - BAR_GAP, startArrowhead: null, endArrowhead: null, height: maxY - minY, width: maxX - minX, strokeWidth: 2, points: points }));\r\n const dots = spreadsheet.values.map((value, index) => {\r\n const cx = index * (BAR_WIDTH + BAR_GAP) + BAR_GAP / 2;\r\n const cy = -(value / max) * BAR_HEIGHT + BAR_GAP / 2;\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_2__.newElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { fillStyle: \"solid\", strokeWidth: 2, type: \"ellipse\", x: x + cx + BAR_WIDTH / 2, y: y + cy - BAR_GAP * 2, width: BAR_GAP, height: BAR_GAP }));\r\n });\r\n const lines = spreadsheet.values.map((value, index) => {\r\n const cx = index * (BAR_WIDTH + BAR_GAP) + BAR_GAP / 2;\r\n const cy = (value / max) * BAR_HEIGHT + BAR_GAP / 2 + BAR_GAP;\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_2__.newLinearElement)(Object.assign(Object.assign({ backgroundColor, groupIds: [groupId] }, commonProps), { type: \"line\", x: x + cx + BAR_WIDTH / 2 + BAR_GAP / 2, y: y - cy, startArrowhead: null, endArrowhead: null, height: cy, strokeStyle: \"dotted\", opacity: GRID_OPACITY, points: [\r\n [0, 0],\r\n [0, cy],\r\n ] }));\r\n });\r\n return [\r\n ...chartBaseElements(spreadsheet, x, y, groupId, backgroundColor, \"development\" === _constants__WEBPACK_IMPORTED_MODULE_1__.ENV.DEVELOPMENT),\r\n line,\r\n ...lines,\r\n ...dots,\r\n ];\r\n};\r\nconst renderSpreadsheet = (chartType, spreadsheet, x, y) => {\r\n if (chartType === \"line\") {\r\n return chartTypeLine(spreadsheet, x, y);\r\n }\r\n return chartTypeBar(spreadsheet, x, y);\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QixXQUFXLEtBQ2QsSUFBSSxFQUFFLE1BQU0sRUFDWixDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLEdBQUcsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLEVBQ3ZDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUNULGNBQWMsRUFBRSxJQUFJLEVBQ3BCLFlBQVksRUFBRSxJQUFJLEVBQ2xCLE1BQU0sRUFBRSxFQUFFLEVBQ1YsV0FBVyxFQUFFLFFBQVEsRUFDckIsT0FBTyxFQUFFLFlBQVksRUFDckIsTUFBTSxFQUFFO2dCQUNOLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDTixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7YUFDUixJQUNELENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxHQUFHLGlCQUFpQixDQUNsQixXQUFXLEVBQ1gsQ0FBQyxFQUNELENBQUMsRUFDRCxPQUFPLEVBQ1AsZUFBZSxFQUNmLGFBQW9CLEtBQUssdURBQWUsQ0FDekM7UUFDRCxJQUFJO1FBQ0osR0FBRyxLQUFLO1FBQ1IsR0FBRyxJQUFJO0tBQ1IsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVLLE1BQU0saUJBQWlCLEdBQUcsQ0FDL0IsU0FBaUIsRUFDakIsV0FBd0IsRUFDeEIsQ0FBUyxFQUNULENBQVMsRUFDTSxFQUFFO0lBQ2pCLElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRTtRQUN4QixPQUFPLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3pDO0lBQ0QsT0FBTyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QyxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vY2hhcnRzLnRzPzJlYmYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbG9ycyBmcm9tIFwiLi9jb2xvcnNcIjtcbmltcG9ydCB7IERFRkFVTFRfRk9OVF9GQU1JTFksIERFRkFVTFRfRk9OVF9TSVpFLCBFTlYgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IG5ld0VsZW1lbnQsIG5ld0xpbmVhckVsZW1lbnQsIG5ld1RleHRFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgcmFuZG9tSWQgfSBmcm9tIFwiLi9yYW5kb21cIjtcblxuZXhwb3J0IHR5cGUgQ2hhcnRFbGVtZW50cyA9IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdO1xuXG5jb25zdCBCQVJfV0lEVEggPSAzMjtcbmNvbnN0IEJBUl9HQVAgPSAxMjtcbmNvbnN0IEJBUl9IRUlHSFQgPSAyNTY7XG5jb25zdCBHUklEX09QQUNJVFkgPSA1MDtcblxuZXhwb3J0IGludGVyZmFjZSBTcHJlYWRzaGVldCB7XG4gIHRpdGxlOiBzdHJpbmcgfCBudWxsO1xuICBsYWJlbHM6IHN0cmluZ1tdIHwgbnVsbDtcbiAgdmFsdWVzOiBudW1iZXJbXTtcbn1cblxuZXhwb3J0IGNvbnN0IE5PVF9TUFJFQURTSEVFVCA9IFwiTk9UX1NQUkVBRFNIRUVUXCI7XG5leHBvcnQgY29uc3QgVkFMSURfU1BSRUFEU0hFRVQgPSBcIlZBTElEX1NQUkVBRFNIRUVUXCI7XG5cbnR5cGUgUGFyc2VTcHJlYWRzaGVldFJlc3VsdCA9XG4gIHwgeyB0eXBlOiB0eXBlb2YgTk9UX1NQUkVBRFNIRUVUOyByZWFzb246IHN0cmluZyB9XG4gIHwgeyB0eXBlOiB0eXBlb2YgVkFMSURfU1BSRUFEU0hFRVQ7IHNwcmVhZHNoZWV0OiBTcHJlYWRzaGVldCB9O1xuXG5jb25zdCB0cnlQYXJzZU51bWJlciA9IChzOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsID0+IHtcbiAgY29uc3QgbWF0Y2ggPSAvXlsk4oKswqPCpeKCqV0/KFswLTksXSsoXFwuWzAtOV0rKT8pJC8uZXhlYyhzKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBwYXJzZUZsb2F0KG1hdGNoWzFdLnJlcGxhY2UoLywvZywgXCJcIikpO1xufTtcblxuY29uc3QgaXNOdW1lcmljQ29sdW1uID0gKGxpbmVzOiBzdHJpbmdbXVtdLCBjb2x1bW5JbmRleDogbnVtYmVyKSA9PlxuICBsaW5lcy5zbGljZSgxKS5ldmVyeSgobGluZSkgPT4gdHJ5UGFyc2VOdW1iZXIobGluZVtjb2x1bW5JbmRleF0pICE9PSBudWxsKTtcblxuY29uc3QgdHJ5UGFyc2VDZWxscyA9IChjZWxsczogc3RyaW5nW11bXSk6IFBhcnNlU3ByZWFkc2hlZXRSZXN1bHQgPT4ge1xuICBjb25zdCBudW1Db2xzID0gY2VsbHNbMF0ubGVuZ3RoO1xuXG4gIGlmIChudW1Db2xzID4gMikge1xuICAgIHJldHVybiB7IHR5cGU6IE5PVF9TUFJFQURTSEVFVCwgcmVhc29uOiBcIk1vcmUgdGhhbiAyIGNvbHVtbnNcIiB9O1xuICB9XG5cbiAgaWYgKG51bUNvbHMgPT09IDEpIHtcbiAgICBpZiAoIWlzTnVtZXJpY0NvbHVtbihjZWxscywgMCkpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IE5PVF9TUFJFQURTSEVFVCwgcmVhc29uOiBcIlZhbHVlIGlzIG5vdCBudW1lcmljXCIgfTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNIZWFkZXIgPSB0cnlQYXJzZU51bWJlcihjZWxsc1swXVswXSkgPT09IG51bGw7XG4gICAgY29uc3QgdmFsdWVzID0gKGhhc0hlYWRlciA/IGNlbGxzLnNsaWNlKDEpIDogY2VsbHMpLm1hcCgobGluZSkgPT5cbiAgICAgIHRyeVBhcnNlTnVtYmVyKGxpbmVbMF0pLFxuICAgICk7XG5cbiAgICBpZiAodmFsdWVzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IE5PVF9TUFJFQURTSEVFVCwgcmVhc29uOiBcIkxlc3MgdGhhbiB0d28gcm93c1wiIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFZBTElEX1NQUkVBRFNIRUVULFxuICAgICAgc3ByZWFkc2hlZXQ6IHtcbiAgICAgICAgdGl0bGU6IGhhc0hlYWRlciA/IGNlbGxzWzBdWzBdIDogbnVsbCxcbiAgICAgICAgbGFiZWxzOiBudWxsLFxuICAgICAgICB2YWx1ZXM6IHZhbHVlcyBhcyBudW1iZXJbXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlQ29sdW1uSW5kZXggPSBpc051bWVyaWNDb2x1bW4oY2VsbHMsIDApID8gMCA6IDE7XG5cbiAgaWYgKCFpc051bWVyaWNDb2x1bW4oY2VsbHMsIHZhbHVlQ29sdW1uSW5kZXgpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogTk9UX1NQUkVBRFNIRUVULCByZWFzb246IFwiVmFsdWUgaXMgbm90IG51bWVyaWNcIiB9O1xuICB9XG5cbiAgY29uc3QgbGFiZWxDb2x1bW5JbmRleCA9ICh2YWx1ZUNvbHVtbkluZGV4ICsgMSkgJSAyO1xuICBjb25zdCBoYXNIZWFkZXIgPSB0cnlQYXJzZU51bWJlcihjZWxsc1swXVt2YWx1ZUNvbHVtbkluZGV4XSkgPT09IG51bGw7XG4gIGNvbnN0IHJvd3MgPSBoYXNIZWFkZXIgPyBjZWxscy5zbGljZSgxKSA6IGNlbGxzO1xuXG4gIGlmIChyb3dzLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4geyB0eXBlOiBOT1RfU1BSRUFEU0hFRVQsIHJlYXNvbjogXCJMZXNzIHRoYW4gMiByb3dzXCIgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogVkFMSURfU1BSRUFEU0hFRVQsXG4gICAgc3ByZWFkc2hlZXQ6IHtcbiAgICAgIHRpdGxlOiBoYXNIZWFkZXIgPyBjZWxsc1swXVt2YWx1ZUNvbHVtbkluZGV4XSA6IG51bGwsXG4gICAgICBsYWJlbHM6IHJvd3MubWFwKChyb3cpID0+IHJvd1tsYWJlbENvbHVtbkluZGV4XSksXG4gICAgICB2YWx1ZXM6IHJvd3MubWFwKChyb3cpID0+IHRyeVBhcnNlTnVtYmVyKHJvd1t2YWx1ZUNvbHVtbkluZGV4XSkhKSxcbiAgICB9LFxuICB9O1xufTtcblxuY29uc3QgdHJhbnNwb3NlQ2VsbHMgPSAoY2VsbHM6IHN0cmluZ1tdW10pID0+IHtcbiAgY29uc3QgbmV4dENlbGxzOiBzdHJpbmdbXVtdID0gW107XG4gIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNlbGxzWzBdLmxlbmd0aDsgY29sKyspIHtcbiAgICBjb25zdCBuZXh0Q2VsbFJvdzogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjZWxscy5sZW5ndGg7IHJvdysrKSB7XG4gICAgICBuZXh0Q2VsbFJvdy5wdXNoKGNlbGxzW3Jvd11bY29sXSk7XG4gICAgfVxuICAgIG5leHRDZWxscy5wdXNoKG5leHRDZWxsUm93KTtcbiAgfVxuICByZXR1cm4gbmV4dENlbGxzO1xufTtcblxuZXhwb3J0IGNvbnN0IHRyeVBhcnNlU3ByZWFkc2hlZXQgPSAodGV4dDogc3RyaW5nKTogUGFyc2VTcHJlYWRzaGVldFJlc3VsdCA9PiB7XG4gIC8vIENvcHkvcGFzdGUgZnJvbSBleGNlbCwgc3ByZWFkaHNlZXRzLCB0c3YsIGNzdi5cbiAgLy8gRm9yIG5vdyB3ZSBvbmx5IGFjY2VwdCAyIGNvbHVtbnMgd2l0aCBhbiBvcHRpb25hbCBoZWFkZXJcblxuICAvLyBDaGVjayBmb3IgdGFiIHNlcGFyYXRlZCB2YWx1ZXNcbiAgbGV0IGxpbmVzID0gdGV4dFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5zcGxpdChcIlxcdFwiKSk7XG5cbiAgLy8gQ2hlY2sgZm9yIGNvbW1hIHNlcGFyYXRlZCBmaWxlc1xuICBpZiAobGluZXMubGVuZ3RoICYmIGxpbmVzWzBdLmxlbmd0aCAhPT0gMikge1xuICAgIGxpbmVzID0gdGV4dFxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5zcGxpdChcIixcIikpO1xuICB9XG5cbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7IHR5cGU6IE5PVF9TUFJFQURTSEVFVCwgcmVhc29uOiBcIk5vIHZhbHVlc1wiIH07XG4gIH1cblxuICBjb25zdCBudW1Db2xzRmlyc3RMaW5lID0gbGluZXNbMF0ubGVuZ3RoO1xuICBjb25zdCBpc1NwcmVhZHNoZWV0ID0gbGluZXMuZXZlcnkoKGxpbmUpID0+IGxpbmUubGVuZ3RoID09PSBudW1Db2xzRmlyc3RMaW5lKTtcblxuICBpZiAoIWlzU3ByZWFkc2hlZXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogTk9UX1NQUkVBRFNIRUVULFxuICAgICAgcmVhc29uOiBcIkFsbCByb3dzIGRvbid0IGhhdmUgc2FtZSBudW1iZXIgb2YgY29sdW1uc1wiLFxuICAgIH07XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSB0cnlQYXJzZUNlbGxzKGxpbmVzKTtcbiAgaWYgKHJlc3VsdC50eXBlICE9PSBWQUxJRF9TUFJFQURTSEVFVCkge1xuICAgIGNvbnN0IHRyYW5zcG9zZWRSZXN1bHRzID0gdHJ5UGFyc2VDZWxscyh0cmFuc3Bvc2VDZWxscyhsaW5lcykpO1xuICAgIGlmICh0cmFuc3Bvc2VkUmVzdWx0cy50eXBlID09PSBWQUxJRF9TUFJFQURTSEVFVCkge1xuICAgICAgcmV0dXJuIHRyYW5zcG9zZWRSZXN1bHRzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgYmdDb2xvcnMgPSBjb2xvcnMuZWxlbWVudEJhY2tncm91bmQuc2xpY2UoXG4gIDIsXG4gIGNvbG9ycy5lbGVtZW50QmFja2dyb3VuZC5sZW5ndGgsXG4pO1xuXG4vLyBQdXQgYWxsIHRoZSBjb21tb24gcHJvcGVydGllcyBoZXJlIHNvIHdoZW4gdGhlIHdob2xlIGNoYXJ0IGlzIHNlbGVjdGVkXG4vLyB0aGUgcHJvcGVydGllcyBkaWFsb2cgc2hvd3MgdGhlIGNvcnJlY3Qgc2VsZWN0ZWQgdmFsdWVzXG5jb25zdCBjb21tb25Qcm9wcyA9IHtcbiAgZmlsbFN0eWxlOiBcImhhY2h1cmVcIixcbiAgZm9udEZhbWlseTogREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgZm9udFNpemU6IERFRkFVTFRfRk9OVF9TSVpFLFxuICBvcGFjaXR5OiAxMDAsXG4gIHJvdWdobmVzczogMSxcbiAgc3Ryb2tlQ29sb3I6IGNvbG9ycy5lbGVtZW50U3Ryb2tlWzBdLFxuICBzdHJva2VTaGFycG5lc3M6IFwic2hhcnBcIixcbiAgc3Ryb2tlU3R5bGU6IFwic29saWRcIixcbiAgc3Ryb2tlV2lkdGg6IDEsXG4gIHZlcnRpY2FsQWxpZ246IFwibWlkZGxlXCIsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBnZXRDaGFydERpbWVudGlvbnMgPSAoc3ByZWFkc2hlZXQ6IFNwcmVhZHNoZWV0KSA9PiB7XG4gIGNvbnN0IGNoYXJ0V2lkdGggPVxuICAgIChCQVJfV0lEVEggKyBCQVJfR0FQKSAqIHNwcmVhZHNoZWV0LnZhbHVlcy5sZW5ndGggKyBCQVJfR0FQO1xuICBjb25zdCBjaGFydEhlaWdodCA9IEJBUl9IRUlHSFQgKyBCQVJfR0FQICogMjtcbiAgcmV0dXJuIHsgY2hhcnRXaWR0aCwgY2hhcnRIZWlnaHQgfTtcbn07XG5cbmNvbnN0IGNoYXJ0WExhYmVscyA9IChcbiAgc3ByZWFkc2hlZXQ6IFNwcmVhZHNoZWV0LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgZ3JvdXBJZDogc3RyaW5nLFxuICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyxcbik6IENoYXJ0RWxlbWVudHMgPT4ge1xuICByZXR1cm4gKFxuICAgIHNwcmVhZHNoZWV0LmxhYmVscz8ubWFwKChsYWJlbCwgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiBuZXdUZXh0RWxlbWVudCh7XG4gICAgICAgIGdyb3VwSWRzOiBbZ3JvdXBJZF0sXG4gICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgLi4uY29tbW9uUHJvcHMsXG4gICAgICAgIHRleHQ6IGxhYmVsLmxlbmd0aCA+IDggPyBgJHtsYWJlbC5zbGljZSgwLCA1KX0uLi5gIDogbGFiZWwsXG4gICAgICAgIHJhd1RleHQ6IGxhYmVsLmxlbmd0aCA+IDggPyBgJHtsYWJlbC5zbGljZSgwLCA1KX0uLi5gIDogbGFiZWwsXG4gICAgICAgIHg6IHggKyBpbmRleCAqIChCQVJfV0lEVEggKyBCQVJfR0FQKSArIEJBUl9HQVAgKiAyLFxuICAgICAgICB5OiB5ICsgQkFSX0dBUCAvIDIsXG4gICAgICAgIHdpZHRoOiBCQVJfV0lEVEgsXG4gICAgICAgIGFuZ2xlOiA1Ljg3LFxuICAgICAgICBmb250U2l6ZTogMTYsXG4gICAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcbiAgICAgICAgdmVydGljYWxBbGlnbjogXCJ0b3BcIixcbiAgICAgIH0pO1xuICAgIH0pIHx8IFtdXG4gICk7XG59O1xuXG5jb25zdCBjaGFydFlMYWJlbHMgPSAoXG4gIHNwcmVhZHNoZWV0OiBTcHJlYWRzaGVldCxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIGdyb3VwSWQ6IHN0cmluZyxcbiAgYmFja2dyb3VuZENvbG9yOiBzdHJpbmcsXG4pOiBDaGFydEVsZW1lbnRzID0+IHtcbiAgY29uc3QgbWluWUxhYmVsID0gbmV3VGV4dEVsZW1lbnQoe1xuICAgIGdyb3VwSWRzOiBbZ3JvdXBJZF0sXG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIC4uLmNvbW1vblByb3BzLFxuICAgIHg6IHggLSBCQVJfR0FQLFxuICAgIHk6IHkgLSBCQVJfR0FQLFxuICAgIHRleHQ6IFwiMFwiLFxuICAgIHJhd1RleHQ6IFwiMFwiLFxuICAgIHRleHRBbGlnbjogXCJyaWdodFwiLFxuICB9KTtcblxuICBjb25zdCBtYXhZTGFiZWwgPSBuZXdUZXh0RWxlbWVudCh7XG4gICAgZ3JvdXBJZHM6IFtncm91cElkXSxcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgLi4uY29tbW9uUHJvcHMsXG4gICAgeDogeCAtIEJBUl9HQVAsXG4gICAgeTogeSAtIEJBUl9IRUlHSFQgLSBtaW5ZTGFiZWwuaGVpZ2h0IC8gMixcbiAgICB0ZXh0OiBNYXRoLm1heCguLi5zcHJlYWRzaGVldC52YWx1ZXMpLnRvTG9jYWxlU3RyaW5nKCksXG4gICAgcmF3VGV4dDogTWF0aC5tYXgoLi4uc3ByZWFkc2hlZXQudmFsdWVzKS50b0xvY2FsZVN0cmluZygpLFxuICAgIHRleHRBbGlnbjogXCJyaWdodFwiLFxuICB9KTtcblxuICByZXR1cm4gW21pbllMYWJlbCwgbWF4WUxhYmVsXTtcbn07XG5cbmNvbnN0IGNoYXJ0TGluZXMgPSAoXG4gIHNwcmVhZHNoZWV0OiBTcHJlYWRzaGVldCxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIGdyb3VwSWQ6IHN0cmluZyxcbiAgYmFja2dyb3VuZENvbG9yOiBzdHJpbmcsXG4pOiBDaGFydEVsZW1lbnRzID0+IHtcbiAgY29uc3QgeyBjaGFydFdpZHRoLCBjaGFydEhlaWdodCB9ID0gZ2V0Q2hhcnREaW1lbnRpb25zKHNwcmVhZHNoZWV0KTtcbiAgY29uc3QgeExpbmUgPSBuZXdMaW5lYXJFbGVtZW50KHtcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgZ3JvdXBJZHM6IFtncm91cElkXSxcbiAgICAuLi5jb21tb25Qcm9wcyxcbiAgICB0eXBlOiBcImxpbmVcIixcbiAgICB4LFxuICAgIHksXG4gICAgc3RhcnRBcnJvd2hlYWQ6IG51bGwsXG4gICAgZW5kQXJyb3doZWFkOiBudWxsLFxuICAgIHdpZHRoOiBjaGFydFdpZHRoLFxuICAgIHBvaW50czogW1xuICAgICAgWzAsIDBdLFxuICAgICAgW2NoYXJ0V2lkdGgsIDBdLFxuICAgIF0sXG4gIH0pO1xuXG4gIGNvbnN0IHlMaW5lID0gbmV3TGluZWFyRWxlbWVudCh7XG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIGdyb3VwSWRzOiBbZ3JvdXBJZF0sXG4gICAgLi4uY29tbW9uUHJvcHMsXG4gICAgdHlwZTogXCJsaW5lXCIsXG4gICAgeCxcbiAgICB5LFxuICAgIHN0YXJ0QXJyb3doZWFkOiBudWxsLFxuICAgIGVuZEFycm93aGVhZDogbnVsbCxcbiAgICBoZWlnaHQ6IGNoYXJ0SGVpZ2h0LFxuICAgIHBvaW50czogW1xuICAgICAgWzAsIDBdLFxuICAgICAgWzAsIC1jaGFydEhlaWdodF0sXG4gICAgXSxcbiAgfSk7XG5cbiAgY29uc3QgbWF4TGluZSA9IG5ld0xpbmVhckVsZW1lbnQoe1xuICAgIGJhY2tncm91bmRDb2xvcixcbiAgICBncm91cElkczogW2dyb3VwSWRdLFxuICAgIC4uLmNvbW1vblByb3BzLFxuICAgIHR5cGU6IFwibGluZVwiLFxuICAgIHgsXG4gICAgeTogeSAtIEJBUl9IRUlHSFQgLSBCQVJfR0FQLFxuICAgIHN0YXJ0QXJyb3doZWFkOiBudWxsLFxuICAgIGVuZEFycm93aGVhZDogbnVsbCxcbiAgICBzdHJva2VTdHlsZTogXCJkb3R0ZWRcIixcbiAgICB3aWR0aDogY2hhcnRXaWR0aCxcbiAgICBvcGFjaXR5OiBHUklEX09QQUNJVFksXG4gICAgcG9pbnRzOiBbXG4gICAgICBbMCwgMF0sXG4gICAgICBbY2hhcnRXaWR0aCwgMF0sXG4gICAgXSxcbiAgfSk7XG5cbiAgcmV0dXJuIFt4TGluZSwgeUxpbmUsIG1heExpbmVdO1xufTtcblxuLy8gRm9yIHRoZSBtYXRocyBiZWhpbmQgaXQgaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS8janNvbj02MzIwODY0MzcwODg0NjA4LE9fNXhmRC1BZ2gzMnR5dEhwUkp4MWdcbmNvbnN0IGNoYXJ0QmFzZUVsZW1lbnRzID0gKFxuICBzcHJlYWRzaGVldDogU3ByZWFkc2hlZXQsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBncm91cElkOiBzdHJpbmcsXG4gIGJhY2tncm91bmRDb2xvcjogc3RyaW5nLFxuICBkZWJ1Zz86IGJvb2xlYW4sXG4pOiBDaGFydEVsZW1lbnRzID0+IHtcbiAgY29uc3QgeyBjaGFydFdpZHRoLCBjaGFydEhlaWdodCB9ID0gZ2V0Q2hhcnREaW1lbnRpb25zKHNwcmVhZHNoZWV0KTtcblxuICBjb25zdCB0aXRsZSA9IHNwcmVhZHNoZWV0LnRpdGxlXG4gICAgPyBuZXdUZXh0RWxlbWVudCh7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgZ3JvdXBJZHM6IFtncm91cElkXSxcbiAgICAgICAgLi4uY29tbW9uUHJvcHMsXG4gICAgICAgIHRleHQ6IHNwcmVhZHNoZWV0LnRpdGxlLFxuICAgICAgICByYXdUZXh0OiBzcHJlYWRzaGVldC50aXRsZSxcbiAgICAgICAgeDogeCArIGNoYXJ0V2lkdGggLyAyLFxuICAgICAgICB5OiB5IC0gQkFSX0hFSUdIVCAtIEJBUl9HQVAgKiAyIC0gREVGQVVMVF9GT05UX1NJWkUsXG4gICAgICAgIHN0cm9rZVNoYXJwbmVzczogXCJzaGFycFwiLFxuICAgICAgICBzdHJva2VTdHlsZTogXCJzb2xpZFwiLFxuICAgICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXG4gICAgICB9KVxuICAgIDogbnVsbDtcblxuICBjb25zdCBkZWJ1Z1JlY3QgPSBkZWJ1Z1xuICAgID8gbmV3RWxlbWVudCh7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgZ3JvdXBJZHM6IFtncm91cElkXSxcbiAgICAgICAgLi4uY29tbW9uUHJvcHMsXG4gICAgICAgIHR5cGU6IFwicmVjdGFuZ2xlXCIsXG4gICAgICAgIHgsXG4gICAgICAgIHk6IHkgLSBjaGFydEhlaWdodCxcbiAgICAgICAgd2lkdGg6IGNoYXJ0V2lkdGgsXG4gICAgICAgIGhlaWdodDogY2hhcnRIZWlnaHQsXG4gICAgICAgIHN0cm9rZUNvbG9yOiBjb2xvcnMuZWxlbWVudFN0cm9rZVswXSxcbiAgICAgICAgZmlsbFN0eWxlOiBcInNvbGlkXCIsXG4gICAgICAgIG9wYWNpdHk6IDYsXG4gICAgICB9KVxuICAgIDogbnVsbDtcblxuICByZXR1cm4gW1xuICAgIC4uLihkZWJ1Z1JlY3QgPyBbZGVidWdSZWN0XSA6IFtdKSxcbiAgICAuLi4odGl0bGUgPyBbdGl0bGVdIDogW10pLFxuICAgIC4uLmNoYXJ0WExhYmVscyhzcHJlYWRzaGVldCwgeCwgeSwgZ3JvdXBJZCwgYmFja2dyb3VuZENvbG9yKSxcbiAgICAuLi5jaGFydFlMYWJlbHMoc3ByZWFkc2hlZXQsIHgsIHksIGdyb3VwSWQsIGJhY2tncm91bmRDb2xvciksXG4gICAgLi4uY2hhcnRMaW5lcyhzcHJlYWRzaGVldCwgeCwgeSwgZ3JvdXBJZCwgYmFja2dyb3VuZENvbG9yKSxcbiAgXTtcbn07XG5cbmNvbnN0IGNoYXJ0VHlwZUJhciA9IChcbiAgc3ByZWFkc2hlZXQ6IFNwcmVhZHNoZWV0LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IENoYXJ0RWxlbWVudHMgPT4ge1xuICBjb25zdCBtYXggPSBNYXRoLm1heCguLi5zcHJlYWRzaGVldC52YWx1ZXMpO1xuICBjb25zdCBncm91cElkID0gcmFuZG9tSWQoKTtcbiAgY29uc3QgYmFja2dyb3VuZENvbG9yID0gYmdDb2xvcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYmdDb2xvcnMubGVuZ3RoKV07XG5cbiAgY29uc3QgYmFycyA9IHNwcmVhZHNoZWV0LnZhbHVlcy5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGJhckhlaWdodCA9ICh2YWx1ZSAvIG1heCkgKiBCQVJfSEVJR0hUO1xuICAgIHJldHVybiBuZXdFbGVtZW50KHtcbiAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgIGdyb3VwSWRzOiBbZ3JvdXBJZF0sXG4gICAgICAuLi5jb21tb25Qcm9wcyxcbiAgICAgIHR5cGU6IFwicmVjdGFuZ2xlXCIsXG4gICAgICB4OiB4ICsgaW5kZXggKiAoQkFSX1dJRFRIICsgQkFSX0dBUCkgKyBCQVJfR0FQLFxuICAgICAgeTogeSAtIGJhckhlaWdodCAtIEJBUl9HQVAsXG4gICAgICB3aWR0aDogQkFSX1dJRFRILFxuICAgICAgaGVpZ2h0OiBiYXJIZWlnaHQsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiBbXG4gICAgLi4uYmFycyxcbiAgICAuLi5jaGFydEJhc2VFbGVtZW50cyhcbiAgICAgIHNwcmVhZHNoZWV0LFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBncm91cElkLFxuICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5ERVZFTE9QTUVOVCxcbiAgICApLFxuICBdO1xufTtcblxuY29uc3QgY2hhcnRUeXBlTGluZSA9IChcbiAgc3ByZWFkc2hlZXQ6IFNwcmVhZHNoZWV0LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IENoYXJ0RWxlbWVudHMgPT4ge1xuICBjb25zdCBtYXggPSBNYXRoLm1heCguLi5zcHJlYWRzaGVldC52YWx1ZXMpO1xuICBjb25zdCBncm91cElkID0gcmFuZG9tSWQoKTtcbiAgY29uc3QgYmFja2dyb3VuZENvbG9yID0gYmdDb2xvcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYmdDb2xvcnMubGVuZ3RoKV07XG5cbiAgbGV0IGluZGV4ID0gMDtcbiAgY29uc3QgcG9pbnRzID0gW107XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc3ByZWFkc2hlZXQudmFsdWVzKSB7XG4gICAgY29uc3QgY3ggPSBpbmRleCAqIChCQVJfV0lEVEggKyBCQVJfR0FQKTtcbiAgICBjb25zdCBjeSA9IC0odmFsdWUgLyBtYXgpICogQkFSX0hFSUdIVDtcbiAgICBwb2ludHMucHVzaChbY3gsIGN5XSk7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGNvbnN0IG1heFggPSBNYXRoLm1heCguLi5wb2ludHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50WzBdKSk7XG4gIGNvbnN0IG1heFkgPSBNYXRoLm1heCguLi5wb2ludHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50WzFdKSk7XG4gIGNvbnN0IG1pblggPSBNYXRoLm1pbiguLi5wb2ludHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50WzBdKSk7XG4gIGNvbnN0IG1pblkgPSBNYXRoLm1pbiguLi5wb2ludHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50WzFdKSk7XG5cbiAgY29uc3QgbGluZSA9IG5ld0xpbmVhckVsZW1lbnQoe1xuICAgIGJhY2tncm91bmRDb2xvcixcbiAgICBncm91cElkczogW2dyb3VwSWRdLFxuICAgIC4uLmNvbW1vblByb3BzLFxuICAgIHR5cGU6IFwibGluZVwiLFxuICAgIHg6IHggKyBCQVJfR0FQICsgQkFSX1dJRFRIIC8gMixcbiAgICB5OiB5IC0gQkFSX0dBUCxcbiAgICBzdGFydEFycm93aGVhZDogbnVsbCxcbiAgICBlbmRBcnJvd2hlYWQ6IG51bGwsXG4gICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcbiAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgcG9pbnRzOiBwb2ludHMgYXMgYW55LFxuICB9KTtcblxuICBjb25zdCBkb3RzID0gc3ByZWFkc2hlZXQudmFsdWVzLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgY3ggPSBpbmRleCAqIChCQVJfV0lEVEggKyBCQVJfR0FQKSArIEJBUl9HQVAgLyAyO1xuICAgIGNvbnN0IGN5ID0gLSh2YWx1ZSAvIG1heCkgKiBCQVJfSEVJR0hUICsgQkFSX0dBUCAvIDI7XG4gICAgcmV0dXJuIG5ld0VsZW1lbnQoe1xuICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgZ3JvdXBJZHM6IFtncm91cElkXSxcbiAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgZmlsbFN0eWxlOiBcInNvbGlkXCIsXG4gICAgICBzdHJva2VXaWR0aDogMixcbiAgICAgIHR5cGU6IFwiZWxsaXBzZVwiLFxuICAgICAgeDogeCArIGN4ICsgQkFSX1dJRFRIIC8gMixcbiAgICAgIHk6IHkgKyBjeSAtIEJBUl9HQVAgKiAyLFxuICAgICAgd2lkdGg6IEJBUl9HQVAsXG4gICAgICBoZWlnaHQ6IEJBUl9HQVAsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IGxpbmVzID0gc3ByZWFkc2hlZXQudmFsdWVzLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgY3ggPSBpbmRleCAqIChCQVJfV0lEVEggKyBCQVJfR0FQKSArIEJBUl9HQVAgLyAyO1xuICAgIGNvbnN0IGN5ID0gKHZhbHVlIC8gbWF4KSAqIEJBUl9IRUlHSFQgKyBCQVJfR0FQIC8gMiArIEJBUl9HQVA7XG4gICAgcmV0dXJuIG5ld0xpbmVhckVsZW1lbnQoe1xuICAgICAgYmFja2dyb3VuZENvbG9yLFxuICAgICAgZ3JvdXBJZHM6IFtncm91cElkXSxcbiAgICAgIC4uLmNvbW1vblByb3BzLFxuICAgICAgdHlwZTogXCJsaW5lXCIsXG4gICAgICB4OiB4ICsgY3ggKyBCQVJfV0lEVEggLyAyICsgQkFSX0dBUCAvIDIsXG4gICAgICB5OiB5IC0gY3ksXG4gICAgICBzdGFydEFycm93aGVhZDogbnVsbCxcbiAgICAgIGVuZEFycm93aGVhZDogbnVsbCxcbiAgICAgIGhlaWdodDogY3ksXG4gICAgICBzdHJva2VTdHlsZTogXCJkb3R0ZWRcIixcbiAgICAgIG9wYWNpdHk6IEdSSURfT1BBQ0lUWSxcbiAgICAgIHBvaW50czogW1xuICAgICAgICBbMCwgMF0sXG4gICAgICAgIFswLCBjeV0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gW1xuICAgIC4uLmNoYXJ0QmFzZUVsZW1lbnRzKFxuICAgICAgc3ByZWFkc2hlZXQsXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIGdyb3VwSWQsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLkRFVkVMT1BNRU5ULFxuICAgICksXG4gICAgbGluZSxcbiAgICAuLi5saW5lcyxcbiAgICAuLi5kb3RzLFxuICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbmRlclNwcmVhZHNoZWV0ID0gKFxuICBjaGFydFR5cGU6IHN0cmluZyxcbiAgc3ByZWFkc2hlZXQ6IFNwcmVhZHNoZWV0LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IENoYXJ0RWxlbWVudHMgPT4ge1xuICBpZiAoY2hhcnRUeXBlID09PSBcImxpbmVcIikge1xuICAgIHJldHVybiBjaGFydFR5cGVMaW5lKHNwcmVhZHNoZWV0LCB4LCB5KTtcbiAgfVxuICByZXR1cm4gY2hhcnRUeXBlQmFyKHNwcmVhZHNoZWV0LCB4LCB5KTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../charts.ts\n");
1571
1571
 
1572
1572
  /***/ }),
1573
1573
 
@@ -1633,7 +1633,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
1633
1633
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1634
1634
 
1635
1635
  "use strict";
1636
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useIsMobile\": () => (/* binding */ useIsMobile),\n/* harmony export */ \"useExcalidrawContainer\": () => (/* binding */ useExcalidrawContainer),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"../../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var browser_fs_access__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! browser-fs-access */ \"../../../node_modules/browser-fs-access/dist/index.js\");\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! nanoid */ \"../../../node_modules/nanoid/index.dev.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions */ \"../../actions/index.ts\");\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/actionHistory */ \"../../actions/actionHistory.tsx\");\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/manager */ \"../../actions/manager.tsx\");\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/register */ \"../../actions/register.ts\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../analytics */ \"../../analytics.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../data */ \"../../data/index.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/library */ \"../../data/library.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../data/restore */ \"../../data/restore.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/binding */ \"../../element/binding.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../gesture */ \"../../gesture.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../history */ \"../../history.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer */ \"../../renderer/index.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../scene/zoom */ \"../../scene/zoom.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../shapes */ \"../../shapes.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./ContextMenu */ \"../../components/ContextMenu.tsx\");\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./LayerUI */ \"../../components/LayerUI.tsx\");\n/* harmony import */ var _Stats__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Stats */ \"../../components/Stats.tsx\");\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Toast */ \"../../components/Toast.tsx\");\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \"../../actions/actionToggleViewMode.tsx\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst IsMobileContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext(false);\r\nconst useIsMobile = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(IsMobileContext);\r\nconst ExcalidrawContainerContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext({ container: null, id: null });\r\nconst useExcalidrawContainer = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(ExcalidrawContainerContext);\r\nlet didTapTwice = false;\r\nlet tappedTwiceTimer = 0;\r\nlet cursorX = 0;\r\nlet cursorY = 0;\r\nlet isHoldingSpace = false;\r\nlet isPanning = false;\r\nlet isDraggingScrollBar = false;\r\nlet currentScrollBars = { horizontal: null, vertical: null };\r\nlet touchTimeout = 0;\r\nlet invalidateContextMenu = false;\r\nlet lastPointerUp = null;\r\nconst gesture = {\r\n pointers: new Map(),\r\n lastCenter: null,\r\n initialDistance: null,\r\n initialScale: null,\r\n};\r\nclass App extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {\r\n constructor(props) {\r\n var _a;\r\n super(props);\r\n this.canvas = null;\r\n this.rc = null;\r\n this.unmounted = false;\r\n this.isMobile = false;\r\n this.excalidrawContainerRef = react__WEBPACK_IMPORTED_MODULE_1___default().createRef();\r\n this.focusContainer = () => {\r\n var _a;\r\n if (this.props.autoFocus) {\r\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\r\n }\r\n };\r\n this.getSceneElementsIncludingDeleted = () => {\r\n return this.scene.getElementsIncludingDeleted();\r\n };\r\n this.getSceneElements = () => {\r\n return this.scene.getElements();\r\n };\r\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((actionResult) => {\r\n var _a, _b, _c, _d, _e, _f;\r\n if (this.unmounted || actionResult === false) {\r\n return;\r\n }\r\n let editingElement = null;\r\n if (actionResult.elements) {\r\n actionResult.elements.forEach((element) => {\r\n var _a;\r\n if (((_a = this.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id &&\r\n this.state.editingElement !== element &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\r\n editingElement = element;\r\n }\r\n });\r\n this.scene.replaceAllElements(actionResult.elements);\r\n if (actionResult.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n }\r\n if (actionResult.appState || editingElement) {\r\n if (actionResult.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\r\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\r\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\r\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || \"light\";\r\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : this.state.name;\r\n if (typeof this.props.viewModeEnabled !== \"undefined\") {\r\n viewModeEnabled = this.props.viewModeEnabled;\r\n }\r\n if (typeof this.props.zenModeEnabled !== \"undefined\") {\r\n zenModeEnabled = this.props.zenModeEnabled;\r\n }\r\n if (typeof this.props.gridModeEnabled !== \"undefined\") {\r\n gridSize = this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null;\r\n }\r\n if (typeof this.props.theme !== \"undefined\") {\r\n theme = this.props.theme;\r\n }\r\n if (typeof this.props.name !== \"undefined\") {\r\n name = this.props.name;\r\n }\r\n this.setState((state) => {\r\n var _a;\r\n // using Object.assign instead of spread to fool TS 4.2.2+ into\r\n // regarding the resulting type as not containing undefined\r\n // (which the following expression will never contain)\r\n return Object.assign(actionResult.appState || {}, {\r\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\r\n viewModeEnabled,\r\n zenModeEnabled,\r\n gridSize,\r\n theme,\r\n name,\r\n });\r\n }, () => {\r\n if (actionResult.syncHistory) {\r\n this.history.setCurrentState(this.state, this.scene.getElementsIncludingDeleted());\r\n }\r\n });\r\n }\r\n });\r\n // Lifecycle\r\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(() => {\r\n isHoldingSpace = false;\r\n this.setState({ isBindingEnabled: true });\r\n });\r\n this.onUnload = () => {\r\n this.onBlur();\r\n };\r\n this.disableEvent = (event) => {\r\n event.preventDefault();\r\n };\r\n this.onFontLoaded = () => {\r\n this.scene.getElementsIncludingDeleted().forEach((element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element)) {\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\r\n }\r\n });\r\n this.onSceneUpdated();\r\n };\r\n this.importLibraryFromUrl = (url, token) => __awaiter(this, void 0, void 0, function* () {\r\n if (window.location.hash.includes(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary)) {\r\n const hash = new URLSearchParams(window.location.hash.slice(1));\r\n hash.delete(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary);\r\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, `#${hash.toString()}`);\r\n }\r\n else if (window.location.search.includes(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary)) {\r\n const query = new URLSearchParams(window.location.search);\r\n query.delete(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary);\r\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, `?${query.toString()}`);\r\n }\r\n try {\r\n const request = yield fetch(decodeURIComponent(url));\r\n const blob = yield request.blob();\r\n const json = JSON.parse(yield blob.text());\r\n if (!(0,_data_json__WEBPACK_IMPORTED_MODULE_14__.isValidLibrary)(json)) {\r\n throw new Error();\r\n }\r\n if (token === this.id ||\r\n window.confirm((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\"alerts.confirmAddLibrary\", { numShapes: json.library.length }))) {\r\n yield this.library.importLibrary(blob);\r\n // hack to rerender the library items after import\r\n if (this.state.isLibraryOpen) {\r\n this.setState({ isLibraryOpen: false });\r\n }\r\n this.setState({ isLibraryOpen: true });\r\n }\r\n }\r\n catch (error) {\r\n window.alert((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\"alerts.errorLoadingLibrary\"));\r\n console.error(error);\r\n }\r\n finally {\r\n this.focusContainer();\r\n }\r\n });\r\n this.resetHistory = () => {\r\n this.history.clear();\r\n };\r\n /**\r\n * Resets scene & history.\r\n * ! Do not use to clear scene user action !\r\n */\r\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((opts) => {\r\n this.scene.replaceAllElements([]);\r\n this.setState((state) => (Object.assign(Object.assign({}, (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)()), { isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading, theme: this.state.theme })));\r\n this.resetHistory();\r\n });\r\n this.initializeScene = () => __awaiter(this, void 0, void 0, function* () {\r\n if (\"launchQueue\" in window && \"LaunchParams\" in window) {\r\n window.launchQueue.setConsumer((launchParams) => __awaiter(this, void 0, void 0, function* () {\r\n if (!launchParams.files.length) {\r\n return;\r\n }\r\n const fileHandle = launchParams.files[0];\r\n const blob = yield fileHandle.getFile();\r\n blob.handle = fileHandle;\r\n (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(blob, this.state, this.scene.getElementsIncludingDeleted())\r\n .then(({ elements, appState }) => this.syncActionResult({\r\n elements,\r\n appState: Object.assign(Object.assign({}, (appState || this.state)), { isLoading: false }),\r\n commitToHistory: true,\r\n }))\r\n .catch((error) => {\r\n this.setState({ isLoading: false, errorMessage: error.message });\r\n });\r\n }));\r\n }\r\n if (!this.state.isLoading) {\r\n this.setState({ isLoading: true });\r\n }\r\n let initialData = null;\r\n try {\r\n initialData = (yield this.props.initialData) || null;\r\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\r\n this.libraryItemsFromStorage = initialData.libraryItems;\r\n }\r\n }\r\n catch (error) {\r\n console.error(error);\r\n initialData = {\r\n appState: {\r\n errorMessage: error.message ||\r\n \"Encountered an error during importing or restoring scene data\",\r\n },\r\n };\r\n }\r\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restore)(initialData, null, null);\r\n scene.appState = Object.assign(Object.assign({}, scene.appState), { isLoading: false });\r\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\r\n scene.appState = Object.assign(Object.assign({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(scene.elements, Object.assign(Object.assign({}, scene.appState), { width: this.state.width, height: this.state.height, offsetTop: this.state.offsetTop, offsetLeft: this.state.offsetLeft }), null));\r\n }\r\n this.resetHistory();\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { commitToHistory: true }));\r\n const libraryUrl = \r\n // current\r\n new URLSearchParams(window.location.hash.slice(1)).get(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary) ||\r\n // legacy, kept for compat reasons\r\n new URLSearchParams(window.location.search).get(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary);\r\n if (libraryUrl) {\r\n yield this.importLibraryFromUrl(libraryUrl);\r\n }\r\n });\r\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(() => {\r\n this.scene\r\n .getElementsIncludingDeleted()\r\n .forEach((element) => (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element));\r\n this.setState({});\r\n });\r\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(() => {\r\n const { offsetTop, offsetLeft } = this.getCanvasOffsets();\r\n this.setState((state) => {\r\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\r\n return null;\r\n }\r\n return { offsetTop, offsetLeft };\r\n });\r\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.SCROLL_TIMEOUT);\r\n // Copy/paste\r\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n var _a;\r\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\r\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\r\n return;\r\n }\r\n this.cutAll();\r\n event.preventDefault();\r\n });\r\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n var _a;\r\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\r\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\r\n return;\r\n }\r\n this.copyAll();\r\n event.preventDefault();\r\n });\r\n this.cutAll = () => {\r\n this.copyAll();\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected);\r\n };\r\n this.copyAll = () => {\r\n (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.copyToClipboard)(this.scene.getElements(), this.state);\r\n };\r\n this.onTapStart = (event) => {\r\n if (!didTapTwice) {\r\n didTapTwice = true;\r\n clearTimeout(tappedTwiceTimer);\r\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_12__.TAP_TWICE_TIMEOUT);\r\n return;\r\n }\r\n // insert text only if we tapped twice with a single finger\r\n // event.touches.length === 1 will also prevent inserting text when user's zooming\r\n if (didTapTwice && event.touches.length === 1) {\r\n const [touch] = event.touches;\r\n // @ts-ignore\r\n this.handleCanvasDoubleClick({\r\n clientX: touch.clientX,\r\n clientY: touch.clientY,\r\n });\r\n didTapTwice = false;\r\n clearTimeout(tappedTwiceTimer);\r\n }\r\n event.preventDefault();\r\n if (event.touches.length === 2) {\r\n this.setState({\r\n selectedElementIds: {},\r\n });\r\n }\r\n };\r\n this.onTapEnd = (event) => {\r\n if (event.touches.length > 0) {\r\n this.setState({\r\n previousSelectedElementIds: {},\r\n selectedElementIds: this.state.previousSelectedElementIds,\r\n });\r\n }\r\n };\r\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => __awaiter(this, void 0, void 0, function* () {\r\n var _b;\r\n // #686\r\n const target = document.activeElement;\r\n const isExcalidrawActive = (_b = this.excalidrawContainerRef.current) === null || _b === void 0 ? void 0 : _b.contains(target);\r\n if (!isExcalidrawActive) {\r\n return;\r\n }\r\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\r\n if (\r\n // if no ClipboardEvent supplied, assume we're pasting via contextMenu\r\n // thus these checks don't make sense\r\n event &&\r\n (!(elementUnderCursor instanceof HTMLCanvasElement) ||\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(target))) {\r\n return;\r\n }\r\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.parseClipboard)(event);\r\n if (this.props.onPaste) {\r\n if (yield this.props.onPaste(data, event)) {\r\n return;\r\n }\r\n }\r\n if (data.errorMessage) {\r\n this.setState({ errorMessage: data.errorMessage });\r\n }\r\n else if (data.spreadsheet) {\r\n this.setState({\r\n pasteDialog: {\r\n data: data.spreadsheet,\r\n shown: true,\r\n },\r\n });\r\n }\r\n else if (data.elements) {\r\n this.addElementsFromPasteOrLibrary({\r\n elements: data.elements,\r\n position: \"cursor\",\r\n });\r\n }\r\n else if (data.text) {\r\n this.addTextFromPaste(data.text);\r\n }\r\n this.selectShapeTool(\"selection\");\r\n event === null || event === void 0 ? void 0 : event.preventDefault();\r\n }));\r\n this.addElementsFromPasteOrLibrary = (opts) => {\r\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreElements)(opts.elements, null);\r\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(elements);\r\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minX, maxX) / 2;\r\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minY, maxY) / 2;\r\n const clientX = typeof opts.position === \"object\"\r\n ? opts.position.clientX\r\n : opts.position === \"cursor\"\r\n ? cursorX\r\n : this.state.width / 2 + this.state.offsetLeft;\r\n const clientY = typeof opts.position === \"object\"\r\n ? opts.position.clientY\r\n : opts.position === \"cursor\"\r\n ? cursorY\r\n : this.state.height / 2 + this.state.offsetTop;\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\r\n const dx = x - elementsCenterX;\r\n const dy = y - elementsCenterY;\r\n const groupIdMap = new Map();\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(dx, dy, this.state.gridSize);\r\n const oldIdToDuplicatedId = new Map();\r\n const newElements = elements.map((element) => {\r\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(this.state.editingGroupId, groupIdMap, element, {\r\n x: element.x + gridX - minX,\r\n y: element.y + gridY - minY,\r\n });\r\n oldIdToDuplicatedId.set(element.id, newElement.id);\r\n return newElement;\r\n });\r\n const nextElements = [\r\n ...this.scene.getElementsIncludingDeleted(),\r\n ...newElements,\r\n ];\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\r\n this.scene.replaceAllElements(nextElements);\r\n this.history.resumeRecording();\r\n this.setState((0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, this.state), { isLibraryOpen: false, selectedElementIds: newElements.reduce((map, element) => {\r\n map[element.id] = true;\r\n return map;\r\n }, {}), selectedGroupIds: {} }), this.scene.getElements()));\r\n this.selectShapeTool(\"selection\");\r\n };\r\n // Collaboration\r\n this.setAppState = (obj) => {\r\n this.setState(obj);\r\n };\r\n this.removePointer = (event) => {\r\n // remove touch handler for context menu on touch devices\r\n if (event.pointerType === \"touch\" && touchTimeout) {\r\n clearTimeout(touchTimeout);\r\n touchTimeout = 0;\r\n invalidateContextMenu = false;\r\n }\r\n gesture.pointers.delete(event.pointerId);\r\n };\r\n this.toggleLock = () => {\r\n this.setState((prevState) => {\r\n return {\r\n elementLocked: !prevState.elementLocked,\r\n elementType: prevState.elementLocked\r\n ? \"selection\"\r\n : prevState.elementType,\r\n };\r\n });\r\n };\r\n this.toggleZenMode = () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode);\r\n };\r\n this.toggleStats = () => {\r\n if (!this.state.showStats) {\r\n (0,_analytics__WEBPACK_IMPORTED_MODULE_9__.trackEvent)(\"dialog\", \"stats\");\r\n }\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats);\r\n };\r\n this.scrollToContent = (target = this.scene.getElements()) => {\r\n this.setState(Object.assign({}, (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(Array.isArray(target) ? target : [target], this.state, this.canvas)));\r\n };\r\n this.zoomToFit = (target = this.scene.getElements(), maxZoom = 1, //null will zoom to max based on viewport\r\n margin = 0.03) => {\r\n this.setState((0,_actions__WEBPACK_IMPORTED_MODULE_5__.zoomToFitElements)(target, this.state, false, maxZoom, margin).appState);\r\n };\r\n this.clearToast = () => {\r\n this.setState({ toastMessage: null });\r\n };\r\n this.setToastMessage = (toastMessage) => {\r\n this.setState({ toastMessage });\r\n };\r\n this.restoreFileFromShare = () => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n const webShareTargetCache = yield caches.open(\"web-share-target\");\r\n const file = yield webShareTargetCache.match(\"shared-file\");\r\n if (file) {\r\n const blob = yield file.blob();\r\n this.loadFileToCanvas(blob);\r\n yield webShareTargetCache.delete(\"shared-file\");\r\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, window.location.pathname);\r\n }\r\n }\r\n catch (error) {\r\n this.setState({ errorMessage: error.message });\r\n }\r\n });\r\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((sceneData) => {\r\n if (sceneData.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n if (sceneData.appState) {\r\n this.setState(sceneData.appState);\r\n }\r\n if (sceneData.elements) {\r\n this.scene.replaceAllElements(sceneData.elements);\r\n }\r\n if (sceneData.collaborators) {\r\n this.setState({ collaborators: sceneData.collaborators });\r\n }\r\n });\r\n this.onSceneUpdated = () => {\r\n this.setState({});\r\n };\r\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n cursorX = event.clientX;\r\n cursorY = event.clientY;\r\n });\r\n // Input handling\r\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n // normalize `event.key` when CapsLock is pressed #2372\r\n if (\"Proxy\" in window &&\r\n ((!event.shiftKey && /^[A-Z]$/.test(event.key)) ||\r\n (event.shiftKey && /^[a-z]$/.test(event.key)))) {\r\n event = new Proxy(event, {\r\n get(ev, prop) {\r\n const value = ev[prop];\r\n if (typeof value === \"function\") {\r\n // fix for Proxies hijacking `this`\r\n return value.bind(ev);\r\n }\r\n return prop === \"key\"\r\n ? // CapsLock inverts capitalization based on ShiftKey, so invert\r\n // it back\r\n event.shiftKey\r\n ? ev.key.toUpperCase()\r\n : ev.key.toLowerCase()\r\n : value;\r\n },\r\n });\r\n }\r\n if (((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target) && event.key !== _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ESCAPE) ||\r\n // case: using arrows to move between buttons\r\n ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isInputLike)(event.target))) {\r\n return;\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.QUESTION_MARK) {\r\n this.setState({\r\n showHelpDialog: true,\r\n });\r\n }\r\n if (this.actionManager.handleKeyDown(event)) {\r\n return;\r\n }\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && this.state.isBindingEnabled) {\r\n this.setState({ isBindingEnabled: false });\r\n }\r\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_27__.CODES.NINE) {\r\n this.setState({ isLibraryOpen: !this.state.isLibraryOpen });\r\n }\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\r\n const step = (this.state.gridSize &&\r\n (event.shiftKey\r\n ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT\r\n : this.state.gridSize)) ||\r\n (event.shiftKey\r\n ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_SHIFT_TRANSLATE_AMOUNT\r\n : _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT);\r\n const selectedElements = this.scene\r\n .getElements()\r\n .filter((element) => this.state.selectedElementIds[element.id]);\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_LEFT) {\r\n offsetX = -step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_RIGHT) {\r\n offsetX = step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_UP) {\r\n offsetY = -step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_DOWN) {\r\n offsetY = step;\r\n }\r\n selectedElements.forEach((element) => {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\r\n x: element.x + offsetX,\r\n y: element.y + offsetY,\r\n });\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element, {\r\n simultaneouslyUpdated: selectedElements,\r\n });\r\n });\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n event.preventDefault();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ENTER) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1 &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\r\n if (!this.state.editingLinearElement ||\r\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\r\n this.history.resumeRecording();\r\n this.setState({\r\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], this.scene),\r\n });\r\n }\r\n }\r\n else if (selectedElements.length === 1 &&\r\n !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\r\n const selectedElement = selectedElements[0];\r\n this.startTextEditing({\r\n sceneX: selectedElement.x + selectedElement.width / 2,\r\n sceneY: selectedElement.y + selectedElement.height / 2,\r\n });\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n else if (!event.ctrlKey &&\r\n !event.altKey &&\r\n !event.metaKey &&\r\n this.state.draggingElement === null) {\r\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_34__.findShapeByKey)(event.key);\r\n if (shape) {\r\n this.selectShapeTool(shape);\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.Q) {\r\n this.toggleLock();\r\n }\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE && gesture.pointers.size === 0) {\r\n isHoldingSpace = true;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (this.state.elementType === \"selection\" &&\r\n !selectedElements.length) {\r\n return;\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G &&\r\n ((0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(this.state.elementType) ||\r\n selectedElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(element.type)))) {\r\n this.setState({ openPopup: \"backgroundColorPicker\" });\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\r\n this.setState({ openPopup: \"strokeColorPicker\" });\r\n }\r\n }\r\n });\r\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE) {\r\n if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\r\n }\r\n else if (this.state.elementType === \"selection\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, this.state.elementType);\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n isHoldingSpace = false;\r\n }\r\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !this.state.isBindingEnabled) {\r\n this.setState({ isBindingEnabled: true });\r\n }\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state)\r\n ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements)(selectedElements)\r\n : (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)(selectedElements);\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n });\r\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n this.setState({\r\n selectedElementIds: {},\r\n });\r\n gesture.initialScale = this.state.zoom.value;\r\n });\r\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n // onGestureChange only has zoom factor but not the center.\r\n // If we're on iPad or iPhone, then we recognize multi-touch and will\r\n // zoom in at the right location on the touchMove handler already.\r\n // On Macbook, we don't have those events so will zoom in at the\r\n // current location instead.\r\n if (gesture.pointers.size === 2) {\r\n return;\r\n }\r\n const initialScale = gesture.initialScale;\r\n if (initialScale) {\r\n this.setState(({ zoom, offsetLeft, offsetTop }) => ({\r\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * event.scale), zoom, { left: offsetLeft, top: offsetTop }, { x: cursorX, y: cursorY }),\r\n }));\r\n }\r\n });\r\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n this.setState({\r\n previousSelectedElementIds: {},\r\n selectedElementIds: this.state.previousSelectedElementIds,\r\n });\r\n gesture.initialScale = null;\r\n });\r\n this.startTextEditing = ({ sceneX, sceneY, insertAtParentCenter = true, }) => {\r\n const existingTextElement = this.getTextElementAtPosition(sceneX, sceneY);\r\n const parentCenterPosition = insertAtParentCenter &&\r\n this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, this.canvas, window.devicePixelRatio);\r\n const element = existingTextElement\r\n ? existingTextElement\r\n : (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\r\n x: parentCenterPosition\r\n ? parentCenterPosition.elementCenterX\r\n : sceneX,\r\n y: parentCenterPosition\r\n ? parentCenterPosition.elementCenterY\r\n : sceneY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n text: \"\",\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n textAlign: parentCenterPosition\r\n ? \"center\"\r\n : this.state.currentItemTextAlign,\r\n verticalAlign: parentCenterPosition\r\n ? \"middle\"\r\n : _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN,\r\n });\r\n this.setState({ editingElement: element });\r\n if (existingTextElement) {\r\n // if text element is no longer centered to a container, reset\r\n // verticalAlign to default because it's currently internal-only\r\n if (!parentCenterPosition || element.textAlign !== \"center\") {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, { verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN });\r\n }\r\n }\r\n else {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n // case: creating new text not centered to parent elemenent → offset Y\r\n // so that the text is centered to cursor position\r\n if (!parentCenterPosition) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\r\n y: element.y - element.baseline / 2,\r\n });\r\n }\r\n }\r\n this.setState({\r\n editingElement: element,\r\n });\r\n this.handleTextWysiwyg(element, {\r\n isExistingElement: !!existingTextElement,\r\n });\r\n };\r\n this.handleCanvasDoubleClick = (event) => {\r\n // case: double-clicking with arrow/line tool selected would both create\r\n // text and enter multiElement mode\r\n if (this.state.multiElement) {\r\n return;\r\n }\r\n // we should only be able to double click when mode is selection\r\n if (this.state.elementType !== \"selection\") {\r\n return;\r\n }\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\r\n if (!this.state.editingLinearElement ||\r\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\r\n this.history.resumeRecording();\r\n this.setState({\r\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], this.scene),\r\n });\r\n }\r\n return;\r\n }\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\r\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIds)(this.state);\r\n if (selectedGroupIds.length > 0) {\r\n const hitElement = this.getElementAtPosition(sceneX, sceneY);\r\n const selectedGroupId = hitElement &&\r\n (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIdForElement)(hitElement, this.state.selectedGroupIds);\r\n if (selectedGroupId) {\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { editingGroupId: selectedGroupId, selectedElementIds: { [hitElement.id]: true }, selectedGroupIds: {} }), this.scene.getElements()));\r\n return;\r\n }\r\n }\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !this.state.viewModeEnabled) {\r\n this.startTextEditing({\r\n sceneX,\r\n sceneY,\r\n insertAtParentCenter: !event.altKey,\r\n });\r\n }\r\n };\r\n this.handleCanvasPointerMove = (event) => {\r\n this.savePointer(event.clientX, event.clientY, this.state.cursorButton);\r\n if (gesture.pointers.has(event.pointerId)) {\r\n gesture.pointers.set(event.pointerId, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n }\r\n const initialScale = gesture.initialScale;\r\n if (gesture.pointers.size === 2 &&\r\n gesture.lastCenter &&\r\n initialScale &&\r\n gesture.initialDistance) {\r\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\r\n const deltaX = center.x - gesture.lastCenter.x;\r\n const deltaY = center.y - gesture.lastCenter.y;\r\n gesture.lastCenter = center;\r\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\r\n const scaleFactor = distance / gesture.initialDistance;\r\n this.setState(({ zoom, scrollX, scrollY, offsetLeft, offsetTop }) => ({\r\n scrollX: scrollX + deltaX / zoom.value,\r\n scrollY: scrollY + deltaY / zoom.value,\r\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * scaleFactor), zoom, { left: offsetLeft, top: offsetTop }, center),\r\n shouldCacheIgnoreZoom: true,\r\n }));\r\n this.resetShouldCacheIgnoreZoomDebounced();\r\n }\r\n else {\r\n gesture.lastCenter = gesture.initialDistance = gesture.initialScale = null;\r\n }\r\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\r\n return;\r\n }\r\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop);\r\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\r\n if (!this.state.draggingElement && !this.state.multiElement) {\r\n if (isOverScrollBar) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, this.state.elementType);\r\n }\r\n }\r\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\r\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\r\n if (this.state.editingLinearElement &&\r\n !this.state.editingLinearElement.isDragging) {\r\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, this.state.editingLinearElement, this.state.gridSize);\r\n if (editingLinearElement !== this.state.editingLinearElement) {\r\n this.setState({ editingLinearElement });\r\n }\r\n if (editingLinearElement.lastUncommittedPoint != null) {\r\n this.maybeSuggestBindingAtCursor(scenePointer);\r\n }\r\n else {\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElementType)(this.state.elementType)) {\r\n // Hovering with a selected tool or creating new linear element via click\r\n // and point\r\n const { draggingElement } = this.state;\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\r\n this.maybeSuggestBindingForLinearElementAtCursor(draggingElement, \"end\", scenePointer, this.state.startBoundElement);\r\n }\r\n else {\r\n this.maybeSuggestBindingAtCursor(scenePointer);\r\n }\r\n }\r\n if (this.state.multiElement) {\r\n const { multiElement } = this.state;\r\n const { x: rx, y: ry } = multiElement;\r\n const { points, lastCommittedPoint } = multiElement;\r\n const lastPoint = points[points.length - 1];\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, this.state.elementType);\r\n if (lastPoint === lastCommittedPoint) {\r\n // if we haven't yet created a temp point and we're beyond commit-zone\r\n // threshold, add a point\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\r\n points: [...points, [scenePointerX - rx, scenePointerY - ry]],\r\n });\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\r\n // in this branch, we're inside the commit zone, and no uncommitted\r\n // point exists. Thus do nothing (don't add/remove points).\r\n }\r\n }\r\n else if (points.length > 2 &&\r\n lastCommittedPoint &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\r\n points: points.slice(0, -1),\r\n });\r\n }\r\n else {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(points, this.state.zoom.value)) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\r\n }\r\n // update last uncommitted point\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\r\n points: [\r\n ...points.slice(0, -1),\r\n [scenePointerX - rx, scenePointerY - ry],\r\n ],\r\n });\r\n }\r\n return;\r\n }\r\n const hasDeselectedButton = Boolean(event.buttons);\r\n if (hasDeselectedButton ||\r\n (this.state.elementType !== \"selection\" &&\r\n this.state.elementType !== \"text\")) {\r\n return;\r\n }\r\n const elements = this.scene.getElements();\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, this.state);\r\n if (selectedElements.length === 1 &&\r\n !isOverScrollBar &&\r\n !this.state.editingLinearElement) {\r\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, this.state, scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\r\n if (elementWithTransformHandleType &&\r\n elementWithTransformHandleType.transformHandleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)(elementWithTransformHandleType));\r\n return;\r\n }\r\n }\r\n else if (selectedElements.length > 1 && !isOverScrollBar) {\r\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\r\n if (transformHandleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\r\n transformHandleType,\r\n }));\r\n return;\r\n }\r\n }\r\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\r\n if (this.state.elementType === \"text\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\r\n }\r\n else if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\r\n }\r\n else if (isOverScrollBar) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\r\n }\r\n else if (\r\n // if using cmd/ctrl, we're not dragging\r\n !event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] &&\r\n (hitElement ||\r\n this.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements))) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\r\n }\r\n };\r\n // set touch moving for mobile context menu\r\n this.handleTouchMove = (event) => {\r\n invalidateContextMenu = true;\r\n };\r\n this.handleCanvasPointerDown = (event) => {\r\n // remove any active selection when we start to interact with canvas\r\n // (mainly, we care about removing selection outside the component which\r\n // would prevent our copy handling otherwise)\r\n const selection = document.getSelection();\r\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\r\n selection.removeAllRanges();\r\n }\r\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\r\n this.maybeCleanupAfterMissingPointerUp(event);\r\n if (isPanning) {\r\n return;\r\n }\r\n this.setState({\r\n lastPointerDownWith: event.pointerType,\r\n cursorButton: \"down\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"down\");\r\n if (this.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\r\n return;\r\n }\r\n // only handle left mouse button or touch\r\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN &&\r\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.TOUCH) {\r\n return;\r\n }\r\n this.updateGestureOnPointerDown(event);\r\n // don't select while panning\r\n if (gesture.pointers.size > 1) {\r\n return;\r\n }\r\n // State for the duration of a pointer interaction, which starts with a\r\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\r\n const pointerDownState = this.initialPointerDownState(event);\r\n if (this.handleDraggingScrollBar(event, pointerDownState)) {\r\n return;\r\n }\r\n this.clearSelectionIfNotUsingSelection();\r\n this.updateBindingEnabledOnPointerMove(event);\r\n if (this.handleSelectionOnPointerDown(event, pointerDownState)) {\r\n return;\r\n }\r\n if (this.state.elementType === \"text\") {\r\n this.handleTextOnPointerDown(event, pointerDownState);\r\n return;\r\n }\r\n else if (this.state.elementType === \"arrow\" ||\r\n this.state.elementType === \"line\") {\r\n this.handleLinearElementOnPointerDown(event, this.state.elementType, pointerDownState);\r\n }\r\n else if (this.state.elementType === \"freedraw\") {\r\n this.handleFreeDrawElementOnPointerDown(event, this.state.elementType, pointerDownState);\r\n }\r\n else {\r\n this.createGenericElementOnPointerDown(this.state.elementType, pointerDownState);\r\n }\r\n const onPointerMove = this.onPointerMoveFromPointerDownHandler(pointerDownState);\r\n const onPointerUp = this.onPointerUpFromPointerDownHandler(pointerDownState);\r\n const onKeyDown = this.onKeyDownFromPointerDownHandler(pointerDownState);\r\n const onKeyUp = this.onKeyUpFromPointerDownHandler(pointerDownState);\r\n lastPointerUp = onPointerUp;\r\n if (!this.state.viewModeEnabled) {\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, onKeyDown);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, onKeyUp);\r\n pointerDownState.eventListeners.onMove = onPointerMove;\r\n pointerDownState.eventListeners.onUp = onPointerUp;\r\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\r\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\r\n }\r\n };\r\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = (event) => {\r\n // deal with opening context menu on touch devices\r\n if (event.pointerType === \"touch\") {\r\n invalidateContextMenu = false;\r\n if (touchTimeout) {\r\n // If there's already a touchTimeout, this means that there's another\r\n // touch down and we are doing another touch, so we shouldn't open the\r\n // context menu.\r\n invalidateContextMenu = true;\r\n }\r\n else {\r\n // open the context menu with the first touch's clientX and clientY\r\n // if the touch is not moving\r\n touchTimeout = window.setTimeout(() => {\r\n touchTimeout = 0;\r\n if (!invalidateContextMenu) {\r\n this.handleCanvasContextMenu(event);\r\n }\r\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.TOUCH_CTX_MENU_TIMEOUT);\r\n }\r\n }\r\n };\r\n // Returns whether the event is a panning\r\n this.handleCanvasPanUsingWheelOrSpaceDrag = (event) => {\r\n if (!(gesture.pointers.size === 0 &&\r\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.WHEEL ||\r\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN && isHoldingSpace) ||\r\n this.state.viewModeEnabled))) {\r\n return false;\r\n }\r\n isPanning = true;\r\n let nextPastePrevented = false;\r\n const isLinux = /Linux/.test(window.navigator.platform);\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\r\n let { clientX: lastX, clientY: lastY } = event;\r\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n const deltaX = lastX - event.clientX;\r\n const deltaY = lastY - event.clientY;\r\n lastX = event.clientX;\r\n lastY = event.clientY;\r\n /*\r\n * Prevent paste event if we move while middle clicking on Linux.\r\n * See issue #1383.\r\n */\r\n if (isLinux &&\r\n !nextPastePrevented &&\r\n (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\r\n nextPastePrevented = true;\r\n /* Prevent the next paste event */\r\n const preventNextPaste = (event) => {\r\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\r\n event.stopPropagation();\r\n };\r\n /*\r\n * Reenable next paste in case of disabled middle click paste for\r\n * any reason:\r\n * - rigth click paste\r\n * - empty clipboard\r\n */\r\n const enableNextPaste = () => {\r\n setTimeout(() => {\r\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\r\n }, 100);\r\n };\r\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\r\n }\r\n this.setState({\r\n scrollX: this.state.scrollX - deltaX / this.state.zoom.value,\r\n scrollY: this.state.scrollY - deltaY / this.state.zoom.value,\r\n });\r\n });\r\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((lastPointerUp = () => {\r\n lastPointerUp = null;\r\n isPanning = false;\r\n if (!isHoldingSpace) {\r\n if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, this.state.elementType);\r\n }\r\n }\r\n this.setState({\r\n cursorButton: \"up\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"up\");\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\r\n }));\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove, {\r\n passive: true,\r\n });\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\r\n return true;\r\n };\r\n this.clearSelectionIfNotUsingSelection = () => {\r\n if (this.state.elementType !== \"selection\") {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n };\r\n /**\r\n * @returns whether the pointer event has been completely handled\r\n */\r\n this.handleSelectionOnPointerDown = (event, pointerDownState) => {\r\n var _a;\r\n if (this.state.elementType === \"selection\") {\r\n const elements = this.scene.getElements();\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, this.state);\r\n if (selectedElements.length === 1 && !this.state.editingLinearElement) {\r\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, this.state, pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\r\n if (elementWithTransformHandleType != null) {\r\n this.setState({\r\n resizingElement: elementWithTransformHandleType.element,\r\n });\r\n pointerDownState.resize.handleType =\r\n elementWithTransformHandleType.transformHandleType;\r\n }\r\n }\r\n else if (selectedElements.length > 1) {\r\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\r\n }\r\n if (pointerDownState.resize.handleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\r\n transformHandleType: pointerDownState.resize.handleType,\r\n }));\r\n pointerDownState.resize.isResizing = true;\r\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\r\n if (selectedElements.length === 1 &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0]) &&\r\n selectedElements[0].points.length === 2) {\r\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\r\n }\r\n }\r\n else {\r\n if (this.state.editingLinearElement) {\r\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerDown(event, this.state, (appState) => this.setState(appState), this.history, pointerDownState.origin);\r\n if (ret.hitElement) {\r\n pointerDownState.hit.element = ret.hitElement;\r\n }\r\n if (ret.didAddPoint) {\r\n return true;\r\n }\r\n }\r\n // hitElement may already be set above, so check first\r\n pointerDownState.hit.element =\r\n (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : this.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\r\n // For overlapped elements one position may hit\r\n // multiple elements\r\n pointerDownState.hit.allHitElements = this.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\r\n const hitElement = pointerDownState.hit.element;\r\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\r\n if ((hitElement === null || !someHitElementIsSelected) &&\r\n !event.shiftKey &&\r\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n this.clearSelection(hitElement);\r\n }\r\n // If we click on something\r\n if (hitElement != null) {\r\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\r\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD]) {\r\n if (!this.state.selectedElementIds[hitElement.id]) {\r\n pointerDownState.hit.wasAddedToSelection = true;\r\n }\r\n this.setState((prevState) => (Object.assign(Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.editGroupForSelectedElement)(prevState, hitElement)), { previousSelectedElementIds: this.state.selectedElementIds })));\r\n // mark as not completely handled so as to allow dragging etc.\r\n return false;\r\n }\r\n // deselect if item is selected\r\n // if shift is not clicked, this will always return true\r\n // otherwise, it will trigger selection based on current\r\n // state of the box\r\n if (!this.state.selectedElementIds[hitElement.id]) {\r\n // if we are currently editing a group, exiting editing mode and deselect the group.\r\n if (this.state.editingGroupId &&\r\n !(0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, this.state.editingGroupId)) {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n // Add hit element to selection. At this point if we're not holding\r\n // SHIFT the previously selected element(s) were deselected above\r\n // (make sure you use setState updater to use latest state)\r\n if (!someHitElementIsSelected &&\r\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n this.setState((prevState) => {\r\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: true }) }), this.scene.getElements());\r\n });\r\n pointerDownState.hit.wasAddedToSelection = true;\r\n }\r\n }\r\n }\r\n this.setState({\r\n previousSelectedElementIds: this.state.selectedElementIds,\r\n });\r\n }\r\n }\r\n return false;\r\n };\r\n this.handleTextOnPointerDown = (event, pointerDownState) => {\r\n var _a;\r\n // if we're currently still editing text, clicking outside\r\n // should only finalize it, not create another (irrespective\r\n // of state.elementLocked)\r\n if (((_a = this.state.editingElement) === null || _a === void 0 ? void 0 : _a.type) === \"text\") {\r\n return;\r\n }\r\n this.startTextEditing({\r\n sceneX: pointerDownState.origin.x,\r\n sceneY: pointerDownState.origin.y,\r\n insertAtParentCenter: !event.altKey,\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n if (!this.state.elementLocked) {\r\n this.setState({\r\n elementType: \"selection\",\r\n });\r\n }\r\n };\r\n this.handleFreeDrawElementOnPointerDown = (event, elementType, pointerDownState) => {\r\n // Begin a mark capture. This does not have to update state yet.\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\r\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.newFreeDrawElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n simulatePressure: event.pressure === 0.5,\r\n });\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\r\n }));\r\n const pressures = element.simulatePressure\r\n ? element.pressures\r\n : [...element.pressures, event.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\r\n points: [[0, 0]],\r\n pressures,\r\n });\r\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n draggingElement: element,\r\n editingElement: element,\r\n startBoundElement: boundElement,\r\n suggestedBindings: [],\r\n });\r\n };\r\n this.handleLinearElementOnPointerDown = (event, elementType, pointerDownState) => {\r\n if (this.state.multiElement) {\r\n const { multiElement } = this.state;\r\n // finalize if completing a loop\r\n if (multiElement.type === \"line\" &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(multiElement.points, this.state.zoom.value)) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\r\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\r\n return;\r\n }\r\n const { x: rx, y: ry, lastCommittedPoint } = multiElement;\r\n // clicking inside commit zone → finalize arrow\r\n if (multiElement.points.length > 1 &&\r\n lastCommittedPoint &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\r\n return;\r\n }\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [multiElement.id]: true }),\r\n }));\r\n // clicking outside commit zone → update reference for last committed\r\n // point\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\r\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\r\n }\r\n else {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\r\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\r\n If so, we want it to be null for start and \"arrow\" for end. If the linear item is not\r\n an arrow, we want it to be null for both. Otherwise, we want it to use the\r\n values from appState. */\r\n const { currentItemStartArrowhead, currentItemEndArrowhead } = this.state;\r\n const [startArrowhead, endArrowhead] = elementType === \"arrow\"\r\n ? [currentItemStartArrowhead, currentItemEndArrowhead]\r\n : [null, null];\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newLinearElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n startArrowhead,\r\n endArrowhead,\r\n });\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\r\n }));\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\r\n points: [...element.points, [0, 0]],\r\n });\r\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n draggingElement: element,\r\n editingElement: element,\r\n startBoundElement: boundElement,\r\n suggestedBindings: [],\r\n });\r\n }\r\n };\r\n this.createGenericElementOnPointerDown = (elementType, pointerDownState) => {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n });\r\n if (element.type === \"selection\") {\r\n this.setState({\r\n selectionElement: element,\r\n draggingElement: element,\r\n });\r\n }\r\n else {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n multiElement: null,\r\n draggingElement: element,\r\n editingElement: element,\r\n });\r\n }\r\n };\r\n this.updateBindingEnabledOnPointerMove = (event) => {\r\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.shouldEnableBindingForPointerEvent)(event);\r\n if (this.state.isBindingEnabled !== shouldEnableBinding) {\r\n this.setState({ isBindingEnabled: shouldEnableBinding });\r\n }\r\n };\r\n this.maybeSuggestBindingAtCursor = (pointerCoords) => {\r\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerCoords, this.scene);\r\n this.setState({\r\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : [],\r\n });\r\n };\r\n this.maybeSuggestBindingForLinearElementAtCursor = (linearElement, startOrEnd, pointerCoords, \r\n // During line creation the start binding hasn't been written yet\r\n // into `linearElement`\r\n oppositeBindingBoundElement) => {\r\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerCoords, this.scene);\r\n this.setState({\r\n suggestedBindings: hoveredBindableElement != null &&\r\n !(0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)\r\n ? [hoveredBindableElement]\r\n : [],\r\n });\r\n };\r\n this.handleCanvasRef = (canvas) => {\r\n var _a, _b, _c;\r\n // canvas is null when unmounting\r\n if (canvas !== null) {\r\n this.canvas = canvas;\r\n this.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_2__.default.canvas(this.canvas);\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, this.handleWheel, {\r\n passive: false,\r\n });\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, this.onTapStart);\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, this.onTapEnd);\r\n }\r\n else {\r\n (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, this.handleWheel);\r\n (_b = this.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, this.onTapStart);\r\n (_c = this.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, this.onTapEnd);\r\n }\r\n };\r\n this.handleAppOnDrop = (event) => __awaiter(this, void 0, void 0, function* () {\r\n var _c, _d;\r\n try {\r\n if (this.props.onDrop && (yield this.props.onDrop(event))) {\r\n return;\r\n }\r\n const file = event.dataTransfer.files[0];\r\n if ((file === null || file === void 0 ? void 0 : file.type) === \"image/png\" || (file === null || file === void 0 ? void 0 : file.type) === \"image/svg+xml\") {\r\n if (browser_fs_access__WEBPACK_IMPORTED_MODULE_4__.supported) {\r\n try {\r\n // This will only work as of Chrome 86,\r\n // but can be safely ignored on older releases.\r\n const item = event.dataTransfer.items[0];\r\n file.handle = yield item.getAsFileSystemHandle();\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.message);\r\n }\r\n }\r\n const { elements, appState } = yield (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted());\r\n this.syncActionResult({\r\n elements,\r\n appState: Object.assign(Object.assign({}, (appState || this.state)), { isLoading: false }),\r\n commitToHistory: true,\r\n });\r\n return;\r\n }\r\n }\r\n catch (error) {\r\n return this.setState({\r\n isLoading: false,\r\n errorMessage: error.message,\r\n });\r\n }\r\n const libraryShapes = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib);\r\n if (libraryShapes !== \"\") {\r\n this.addElementsFromPasteOrLibrary({\r\n elements: JSON.parse(libraryShapes),\r\n position: event,\r\n });\r\n return;\r\n }\r\n const file = (_c = event.dataTransfer) === null || _c === void 0 ? void 0 : _c.files[0];\r\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib ||\r\n ((_d = file === null || file === void 0 ? void 0 : file.name) === null || _d === void 0 ? void 0 : _d.endsWith(\".excalidrawlib\"))) {\r\n this.library\r\n .importLibrary(file)\r\n .then(() => {\r\n // Close and then open to get the libraries updated\r\n this.setState({ isLibraryOpen: false });\r\n this.setState({ isLibraryOpen: true });\r\n })\r\n .catch((error) => this.setState({ isLoading: false, errorMessage: error.message }));\r\n // default: assume an Excalidraw file regardless of extension/MimeType\r\n }\r\n else {\r\n this.setState({ isLoading: true });\r\n if (browser_fs_access__WEBPACK_IMPORTED_MODULE_4__.supported) {\r\n try {\r\n // This will only work as of Chrome 86,\r\n // but can be safely ignored on older releases.\r\n const item = event.dataTransfer.items[0];\r\n file.handle = yield item.getAsFileSystemHandle();\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.message);\r\n }\r\n }\r\n yield this.loadFileToCanvas(file);\r\n }\r\n });\r\n this.loadFileToCanvas = (file) => {\r\n (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted())\r\n .then(({ elements, appState }) => this.syncActionResult({\r\n elements,\r\n appState: Object.assign(Object.assign({}, (appState || this.state)), { isLoading: false }),\r\n commitToHistory: true,\r\n }))\r\n .catch((error) => {\r\n this.setState({ isLoading: false, errorMessage: error.message });\r\n });\r\n };\r\n this.handleCanvasContextMenu = (event) => {\r\n event.preventDefault();\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\r\n const element = this.getElementAtPosition(x, y, { preferSelected: true });\r\n const type = element ? \"element\" : \"canvas\";\r\n const container = this.excalidrawContainerRef.current;\r\n const { top: offsetTop, left: offsetLeft, } = container.getBoundingClientRect();\r\n const left = event.clientX - offsetLeft;\r\n const top = event.clientY - offsetTop;\r\n if (element && !this.state.selectedElementIds[element.id]) {\r\n this.setState({ selectedElementIds: { [element.id]: true } }, () => {\r\n this._openContextMenu({ top, left }, type);\r\n });\r\n }\r\n else {\r\n this._openContextMenu({ top, left }, type);\r\n }\r\n };\r\n this.maybeDragNewGenericElement = (pointerDownState, event) => {\r\n const draggingElement = this.state.draggingElement;\r\n const pointerCoords = pointerDownState.lastCoords;\r\n if (!draggingElement) {\r\n return;\r\n }\r\n if (draggingElement.type === \"selection\") {\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, this.state.elementType, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getResizeWithSidesSameLengthKey)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getResizeCenterPointKey)(event));\r\n }\r\n else {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, this.state.elementType, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.y, gridY), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getResizeWithSidesSameLengthKey)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getResizeCenterPointKey)(event));\r\n this.maybeSuggestBindingForAll([draggingElement]);\r\n }\r\n };\r\n this.maybeHandleResize = (pointerDownState, event) => {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const transformHandleType = pointerDownState.resize.handleType;\r\n this.setState({\r\n // TODO: rename this state field to \"isScaling\" to distinguish\r\n // it from the generic \"isResizing\" which includes scaling and\r\n // rotating\r\n isResizing: transformHandleType && transformHandleType !== \"rotation\",\r\n isRotating: transformHandleType === \"rotation\",\r\n });\r\n const pointerCoords = pointerDownState.lastCoords;\r\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, this.state.gridSize);\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getRotateWithDiscreteAngleKey)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getResizeCenterPointKey)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getResizeWithSidesSameLengthKey)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n return true;\r\n }\r\n return false;\r\n };\r\n /** @private use this.handleCanvasContextMenu */\r\n this._openContextMenu = ({ left, top, }, type) => {\r\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const separator = \"separator\";\r\n const elements = this.scene.getElements();\r\n const options = [];\r\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0) {\r\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng);\r\n }\r\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0) {\r\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg);\r\n }\r\n if (type === \"canvas\") {\r\n const viewModeOptions = [\r\n ...options,\r\n typeof this.props.gridModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode,\r\n typeof this.props.zenModeEnabled === \"undefined\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode,\r\n typeof this.props.viewModeEnabled === \"undefined\" &&\r\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__.actionToggleViewMode,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats,\r\n ];\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__.default.push({\r\n options: viewModeOptions,\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__.default.push({\r\n options: [\r\n this.isMobile &&\r\n navigator.clipboard && {\r\n name: \"paste\",\r\n perform: (elements, appStates) => {\r\n this.pasteFromClipboard(null);\r\n return {\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.paste\",\r\n },\r\n this.isMobile && navigator.clipboard && separator,\r\n _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob &&\r\n elements.length > 0 &&\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng,\r\n _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText &&\r\n elements.length > 0 &&\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg,\r\n ((_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0) ||\r\n (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0)) &&\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionSelectAll,\r\n separator,\r\n typeof this.props.gridModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode,\r\n typeof this.props.zenModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode,\r\n typeof this.props.viewModeEnabled === \"undefined\" &&\r\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__.actionToggleViewMode,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats,\r\n ],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n return;\r\n }\r\n if (this.state.viewModeEnabled) {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__.default.push({\r\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, ...options],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n return;\r\n }\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__.default.push({\r\n options: [\r\n this.isMobile && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCut,\r\n this.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy,\r\n this.isMobile &&\r\n navigator.clipboard && {\r\n name: \"paste\",\r\n perform: (elements, appStates) => {\r\n this.pasteFromClipboard(null);\r\n return {\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.paste\",\r\n },\r\n this.isMobile && separator,\r\n ...options,\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyStyles,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionPasteStyles,\r\n separator,\r\n maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup,\r\n maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup,\r\n (maybeGroupAction || maybeUngroupAction) && separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionAddToLibrary,\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendBackward,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringForward,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendToBack,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringToFront,\r\n separator,\r\n maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal,\r\n maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical,\r\n (maybeFlipHorizontal || maybeFlipVertical) && separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionDuplicateSelection,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected,\r\n ],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n };\r\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n if (isPanning) {\r\n return;\r\n }\r\n const { deltaX, deltaY } = event;\r\n const { selectedElementIds, previousSelectedElementIds } = this.state;\r\n // note that event.ctrlKey is necessary to handle pinch zooming\r\n if (event.metaKey || event.ctrlKey) {\r\n const sign = Math.sign(deltaY);\r\n const MAX_STEP = 10;\r\n let delta = Math.abs(deltaY);\r\n if (delta > MAX_STEP) {\r\n delta = MAX_STEP;\r\n }\r\n delta *= sign;\r\n if (Object.keys(previousSelectedElementIds).length !== 0) {\r\n setTimeout(() => {\r\n this.setState({\r\n selectedElementIds: previousSelectedElementIds,\r\n previousSelectedElementIds: {},\r\n });\r\n }, 1000);\r\n }\r\n let newZoom = this.state.zoom.value - delta / 100;\r\n // increase zoom steps the more zoomed-in we are (applies to >100% only)\r\n newZoom += Math.log10(Math.max(1, this.state.zoom.value)) * -sign;\r\n // round to nearest step\r\n newZoom = Math.round(newZoom * _constants__WEBPACK_IMPORTED_MODULE_12__.ZOOM_STEP * 100) / (_constants__WEBPACK_IMPORTED_MODULE_12__.ZOOM_STEP * 100);\r\n this.setState(({ zoom, offsetLeft, offsetTop }) => ({\r\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(newZoom), zoom, { left: offsetLeft, top: offsetTop }, {\r\n x: cursorX,\r\n y: cursorY,\r\n }),\r\n selectedElementIds: {},\r\n previousSelectedElementIds: Object.keys(selectedElementIds).length !== 0\r\n ? selectedElementIds\r\n : previousSelectedElementIds,\r\n shouldCacheIgnoreZoom: true,\r\n }));\r\n this.resetShouldCacheIgnoreZoomDebounced();\r\n return;\r\n }\r\n // scroll horizontally when shift pressed\r\n if (event.shiftKey) {\r\n this.setState(({ zoom, scrollX }) => ({\r\n // on Mac, shift+wheel tends to result in deltaX\r\n scrollX: scrollX - (deltaY || deltaX) / zoom.value,\r\n }));\r\n return;\r\n }\r\n this.setState(({ zoom, scrollX, scrollY }) => ({\r\n scrollX: scrollX - deltaX / zoom.value,\r\n scrollY: scrollY - deltaY / zoom.value,\r\n }));\r\n });\r\n this.savePointer = (x, y, button) => {\r\n var _a, _b;\r\n if (!x || !y) {\r\n return;\r\n }\r\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({ clientX: x, clientY: y }, this.state);\r\n if (isNaN(pointer.x) || isNaN(pointer.y)) {\r\n // sometimes the pointer goes off screen\r\n }\r\n (_b = (_a = this.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\r\n pointer,\r\n button,\r\n pointersMap: gesture.pointers,\r\n });\r\n };\r\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(() => {\r\n if (!this.unmounted) {\r\n this.setState({ shouldCacheIgnoreZoom: false });\r\n }\r\n }, 300);\r\n this.updateDOMRect = (cb) => {\r\n var _a;\r\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\r\n const excalidrawContainer = this.excalidrawContainerRef.current;\r\n const { width, height, left: offsetLeft, top: offsetTop, } = excalidrawContainer.getBoundingClientRect();\r\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft, } = this.state;\r\n if (width === currentWidth &&\r\n height === currentHeight &&\r\n offsetLeft === currentOffsetLeft &&\r\n offsetTop === currentOffsetTop) {\r\n if (cb) {\r\n cb();\r\n }\r\n return;\r\n }\r\n this.setState({\r\n width,\r\n height,\r\n offsetLeft,\r\n offsetTop,\r\n }, () => {\r\n cb && cb();\r\n });\r\n }\r\n };\r\n this.refresh = () => {\r\n this.setState(Object.assign({}, this.getCanvasOffsets()));\r\n };\r\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)();\r\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name, } = props;\r\n this.state = Object.assign(Object.assign(Object.assign(Object.assign({}, defaultAppState), { theme, isLoading: true }), this.getCanvasOffsets()), { viewModeEnabled,\r\n zenModeEnabled, gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null, name, width: window.innerWidth, height: window.innerHeight });\r\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_41__.nanoid)();\r\n if (excalidrawRef) {\r\n const readyPromise = (\"current\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise)) ||\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resolvablePromise)();\r\n const api = {\r\n ready: true,\r\n readyPromise,\r\n updateScene: this.updateScene,\r\n resetScene: this.resetScene,\r\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\r\n history: {\r\n clear: this.resetHistory,\r\n },\r\n scrollToContent: this.scrollToContent,\r\n zoomToFit: this.zoomToFit,\r\n getSceneElements: this.getSceneElements,\r\n getAppState: () => this.state,\r\n refresh: this.refresh,\r\n importLibrary: this.importLibraryFromUrl,\r\n setToastMessage: this.setToastMessage,\r\n id: this.id,\r\n };\r\n if (typeof excalidrawRef === \"function\") {\r\n excalidrawRef(api);\r\n }\r\n else {\r\n excalidrawRef.current = api;\r\n }\r\n readyPromise.resolve(api);\r\n }\r\n this.excalidrawContainerValue = {\r\n container: this.excalidrawContainerRef.current,\r\n id: this.id,\r\n };\r\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_32__.default();\r\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_15__.default(this);\r\n this.history = new _history__WEBPACK_IMPORTED_MODULE_25__.default();\r\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_7__.ActionManager(this.syncActionResult, () => this.state, () => this.scene.getElementsIncludingDeleted(), this);\r\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_8__.actions);\r\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createUndoAction)(this.history));\r\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createRedoAction)(this.history));\r\n }\r\n renderCanvas() {\r\n const canvasScale = window.devicePixelRatio;\r\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled, } = this.state;\r\n const canvasWidth = canvasDOMWidth * canvasScale;\r\n const canvasHeight = canvasDOMHeight * canvasScale;\r\n if (viewModeEnabled) {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\r\n width: canvasDOMWidth,\r\n height: canvasDOMHeight,\r\n cursor: _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB,\r\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.removePointer, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove, onPointerDown: this.handleCanvasPointerDown }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\"labels.drawingCanvas\") }), void 0));\r\n }\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\r\n width: canvasDOMWidth,\r\n height: canvasDOMHeight,\r\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerDown: this.handleCanvasPointerDown, onDoubleClick: this.handleCanvasDoubleClick, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.removePointer, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\"labels.drawingCanvas\") }), void 0));\r\n }\r\n render() {\r\n var _a, _b;\r\n const { zenModeEnabled, viewModeEnabled } = this.state;\r\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats, } = this.props;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__.default)(\"excalidraw excalidraw-container\", {\r\n \"excalidraw--view-mode\": viewModeEnabled,\r\n \"excalidraw--mobile\": this.isMobile,\r\n }), ref: this.excalidrawContainerRef, onDrop: this.handleAppOnDrop, tabIndex: 0, onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ExcalidrawContainerContext.Provider, Object.assign({ value: this.excalidrawContainerValue }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(IsMobileContext.Provider, Object.assign({ value: this.isMobile }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_37__.default, { canvas: this.canvas, appState: this.state, setAppState: this.setAppState, actionManager: this.actionManager, elements: this.scene.getElements(), onCollabButtonClick: onCollabButtonClick, onLockToggle: this.toggleLock, onInsertElements: (elements) => this.addElementsFromPasteOrLibrary({\r\n elements,\r\n position: \"center\",\r\n }), zenModeEnabled: zenModeEnabled, toggleZenMode: this.toggleZenMode, langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.getLanguage)().code, isCollaborating: this.props.isCollaborating || false, renderTopRightUI: renderTopRightUI, renderCustomFooter: renderFooter, viewModeEnabled: viewModeEnabled, showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \"undefined\" &&\r\n zenModeEnabled, showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \"undefined\" &&\r\n this.props.UIOptions.canvasActions.theme, libraryReturnUrl: this.props.libraryReturnUrl, UIOptions: this.props.UIOptions, focusContainer: this.focusContainer, library: this.library, id: this.id }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-textEditorContainer\" }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-contextMenuContainer\" }, void 0), this.state.showStats && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Stats__WEBPACK_IMPORTED_MODULE_38__.Stats, { appState: this.state, setAppState: this.setAppState, elements: this.scene.getElements(), onClose: this.toggleStats, renderCustomStats: renderCustomStats }, void 0)), this.state.toastMessage !== null && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_39__.Toast, { message: this.state.toastMessage, clearToast: this.clearToast }, void 0)), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"main\", { children: this.renderCanvas() }, void 0)] }), void 0) }), void 0) }), void 0));\r\n }\r\n componentDidMount() {\r\n var _a, _b;\r\n return __awaiter(this, void 0, void 0, function* () {\r\n this.excalidrawContainerValue.container = this.excalidrawContainerRef.current;\r\n if (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST ||\r\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\r\n const setState = this.setState.bind(this);\r\n Object.defineProperties(window.h, {\r\n state: {\r\n configurable: true,\r\n get: () => {\r\n return this.state;\r\n },\r\n },\r\n setState: {\r\n configurable: true,\r\n value: (...args) => {\r\n return this.setState(...args);\r\n },\r\n },\r\n app: {\r\n configurable: true,\r\n value: this,\r\n },\r\n history: {\r\n configurable: true,\r\n value: this.history,\r\n },\r\n });\r\n }\r\n this.scene.addCallback(this.onSceneUpdated);\r\n this.addEventListeners();\r\n if (this.excalidrawContainerRef.current) {\r\n this.focusContainer();\r\n }\r\n if (\"ResizeObserver\" in window && ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\r\n this.resizeObserver = new ResizeObserver(() => {\r\n // compute isMobile state\r\n // ---------------------------------------------------------------------\r\n const { width, height, } = this.excalidrawContainerRef.current.getBoundingClientRect();\r\n this.isMobile =\r\n width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT ||\r\n (height < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE);\r\n // refresh offsets\r\n // ---------------------------------------------------------------------\r\n this.updateDOMRect();\r\n });\r\n (_b = this.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(this.excalidrawContainerRef.current);\r\n }\r\n else if (window.matchMedia) {\r\n const mediaQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\r\n const handler = () => (this.isMobile = mediaQuery.matches);\r\n mediaQuery.addListener(handler);\r\n this.detachIsMobileMqHandler = () => mediaQuery.removeListener(handler);\r\n }\r\n const searchParams = new URLSearchParams(window.location.search.slice(1));\r\n if (searchParams.has(\"web-share-target\")) {\r\n // Obtain a file that was shared via the Web Share Target API.\r\n this.restoreFileFromShare();\r\n }\r\n else {\r\n this.updateDOMRect(this.initializeScene);\r\n }\r\n });\r\n }\r\n componentWillUnmount() {\r\n var _a;\r\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\r\n this.unmounted = true;\r\n this.removeEventListeners();\r\n this.scene.destroy();\r\n clearTimeout(touchTimeout);\r\n touchTimeout = 0;\r\n }\r\n removeEventListeners() {\r\n var _a, _b;\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\r\n (_a = this.nearestScrollableContainer) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\r\n (_b = this.detachIsMobileMqHandler) === null || _b === void 0 ? void 0 : _b.call(this);\r\n }\r\n addEventListeners() {\r\n var _a, _b;\r\n this.removeEventListeners();\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer); // #3553\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\r\n if (this.props.handleKeyboardGlobally) {\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\r\n }\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp, { passive: true });\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition);\r\n // rerender text elements on font load to fix #637 && #1553\r\n (_b = (_a = document.fonts) === null || _a === void 0 ? void 0 : _a.addEventListener) === null || _b === void 0 ? void 0 : _b.call(_a, \"loadingdone\", this.onFontLoaded);\r\n // Safari-only desktop pinch zoom\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\r\n if (this.props.detectScroll) {\r\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\r\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\r\n }\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\r\n }\r\n componentDidUpdate(prevProps, prevState) {\r\n var _a, _b, _c, _d;\r\n if (prevProps.langCode !== this.props.langCode) {\r\n this.updateLanguage();\r\n }\r\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\r\n this.setState({ viewModeEnabled: !!this.props.viewModeEnabled });\r\n }\r\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\r\n this.addEventListeners();\r\n this.deselectElements();\r\n }\r\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\r\n this.setState({ zenModeEnabled: !!this.props.zenModeEnabled });\r\n }\r\n if (prevProps.theme !== this.props.theme && this.props.theme) {\r\n this.setState({ theme: this.props.theme });\r\n }\r\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\r\n this.setState({\r\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null,\r\n });\r\n }\r\n if (this.props.name && prevProps.name !== this.props.name) {\r\n this.setState({\r\n name: this.props.name,\r\n });\r\n }\r\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.classList.toggle(\"theme--dark\", this.state.theme === \"dark\");\r\n if (this.state.editingLinearElement &&\r\n !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\r\n // defer so that the commitToHistory flag isn't reset via current update\r\n setTimeout(() => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\r\n });\r\n }\r\n const { multiElement } = prevState;\r\n if (prevState.elementType !== this.state.elementType &&\r\n multiElement != null &&\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(multiElement)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\r\n }\r\n const cursorButton = {};\r\n const pointerViewportCoords = {};\r\n const remoteSelectedElementIds = {};\r\n const pointerUsernames = {};\r\n const pointerUserStates = {};\r\n this.state.collaborators.forEach((user, socketId) => {\r\n if (user.selectedElementIds) {\r\n for (const id of Object.keys(user.selectedElementIds)) {\r\n if (!(id in remoteSelectedElementIds)) {\r\n remoteSelectedElementIds[id] = [];\r\n }\r\n remoteSelectedElementIds[id].push(socketId);\r\n }\r\n }\r\n if (!user.pointer) {\r\n return;\r\n }\r\n if (user.username) {\r\n pointerUsernames[socketId] = user.username;\r\n }\r\n if (user.userState) {\r\n pointerUserStates[socketId] = user.userState;\r\n }\r\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\r\n sceneX: user.pointer.x,\r\n sceneY: user.pointer.y,\r\n }, this.state);\r\n cursorButton[socketId] = user.button;\r\n });\r\n const elements = this.scene.getElements();\r\n const { atLeastOneVisibleElement, scrollBars } = (0,_renderer__WEBPACK_IMPORTED_MODULE_29__.renderScene)(elements.filter((element) => {\r\n // don't render text element that's being currently edited (it's\r\n // rendered on remote only)\r\n return (!this.state.editingElement ||\r\n this.state.editingElement.type !== \"text\" ||\r\n element.id !== this.state.editingElement.id);\r\n }), this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\r\n scrollX: this.state.scrollX,\r\n scrollY: this.state.scrollY,\r\n viewBackgroundColor: this.state.viewBackgroundColor,\r\n zoom: this.state.zoom,\r\n remotePointerViewportCoords: pointerViewportCoords,\r\n remotePointerButton: cursorButton,\r\n remoteSelectedElementIds,\r\n remotePointerUsernames: pointerUsernames,\r\n remotePointerUserStates: pointerUserStates,\r\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\r\n }, {\r\n renderOptimizations: true,\r\n renderScrollbars: !this.isMobile,\r\n });\r\n if (scrollBars) {\r\n currentScrollBars = scrollBars;\r\n }\r\n const scrolledOutside = \r\n // hide when editing text\r\n ((_b = this.state.editingElement) === null || _b === void 0 ? void 0 : _b.type) === \"text\"\r\n ? false\r\n : !atLeastOneVisibleElement && elements.length > 0;\r\n if (this.state.scrolledOutside !== scrolledOutside) {\r\n this.setState({ scrolledOutside });\r\n }\r\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\r\n // Do not notify consumers if we're still loading the scene. Among other\r\n // potential issues, this fixes a case where the tab isn't focused during\r\n // init, which would trigger onChange with empty elements, which would then\r\n // override whatever is in localStorage currently.\r\n if (!this.state.isLoading) {\r\n (_d = (_c = this.props).onChange) === null || _d === void 0 ? void 0 : _d.call(_c, this.scene.getElementsIncludingDeleted(), this.state);\r\n }\r\n }\r\n static resetTapTwice() {\r\n didTapTwice = false;\r\n }\r\n addTextFromPaste(text) {\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\r\n x,\r\n y,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n text,\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n textAlign: this.state.currentItemTextAlign,\r\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN,\r\n });\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({ selectedElementIds: { [element.id]: true } });\r\n this.history.resumeRecording();\r\n }\r\n selectShapeTool(elementType) {\r\n if (!isHoldingSpace) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, elementType);\r\n }\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isToolIcon)(document.activeElement)) {\r\n this.focusContainer();\r\n }\r\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElementType)(elementType)) {\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n if (elementType !== \"selection\") {\r\n this.setState({\r\n elementType,\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n else {\r\n this.setState({ elementType });\r\n }\r\n }\r\n handleTextWysiwyg(element, { isExistingElement = false, }) {\r\n const updateElement = (text, isDeleted = false) => {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\r\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\r\n text,\r\n isDeleted,\r\n });\r\n }\r\n return _element;\r\n }),\r\n ]);\r\n };\r\n if (isExistingElement && this.props.onBeforeTextEdit) {\r\n const text = this.props.onBeforeTextEdit(element);\r\n if (text) {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\r\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\r\n element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\r\n text,\r\n isDeleted: false,\r\n });\r\n return element;\r\n }\r\n return _element;\r\n }),\r\n ]);\r\n }\r\n }\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.textWysiwyg)({\r\n id: element.id,\r\n appState: this.state,\r\n canvas: this.canvas,\r\n getViewportCoords: (x, y) => {\r\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\r\n sceneX: x,\r\n sceneY: y,\r\n }, this.state);\r\n return [\r\n viewportX - this.state.offsetLeft,\r\n viewportY - this.state.offsetTop,\r\n ];\r\n },\r\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((text) => {\r\n updateElement(text);\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element);\r\n }\r\n }),\r\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(({ text, viaKeyboard }) => {\r\n const isDeleted = !text.trim();\r\n if (this.props.onBeforeTextSubmit) {\r\n const updatedText = this.props.onBeforeTextSubmit(element, text, isDeleted);\r\n text = updatedText ? updatedText : text;\r\n }\r\n updateElement(text, isDeleted);\r\n // select the created text element only if submitting via keyboard\r\n // (when submitting via click it should act as signal to deselect)\r\n if (!isDeleted && viaKeyboard) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: true }),\r\n }));\r\n }\r\n if (isDeleted) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDeletion)(this.scene.getElements(), [element]);\r\n }\r\n if (!isDeleted || isExistingElement) {\r\n this.history.resumeRecording();\r\n }\r\n this.setState({\r\n draggingElement: null,\r\n editingElement: null,\r\n });\r\n if (this.state.elementLocked) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, this.state.elementType);\r\n }\r\n this.focusContainer();\r\n }),\r\n element,\r\n excalidrawContainer: this.excalidrawContainerRef.current,\r\n });\r\n // deselect all other elements when inserting text\r\n this.deselectElements();\r\n // do an initial update to re-initialize element position since we were\r\n // modifying element's x/y for sake of editor (case: syncing to remote)\r\n updateElement(element.text);\r\n }\r\n deselectElements() {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n getTextElementAtPosition(x, y) {\r\n const element = this.getElementAtPosition(x, y);\r\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && !element.isDeleted) {\r\n return element;\r\n }\r\n return null;\r\n }\r\n getElementAtPosition(x, y, opts) {\r\n const allHitElements = this.getElementsAtPosition(x, y);\r\n if (allHitElements.length > 1) {\r\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\r\n for (let index = allHitElements.length - 1; index > -1; index--) {\r\n if (this.state.selectedElementIds[allHitElements[index].id]) {\r\n return allHitElements[index];\r\n }\r\n }\r\n }\r\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1];\r\n // If we're hitting element with highest z-index only on its bounding box\r\n // while also hitting other element figure, the latter should be considered.\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y)\r\n ? allHitElements[allHitElements.length - 2]\r\n : elementWithHighestZIndex;\r\n }\r\n if (allHitElements.length === 1) {\r\n return allHitElements[0];\r\n }\r\n return null;\r\n }\r\n getElementsAtPosition(x, y) {\r\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsAtPosition)(this.scene.getElements(), (element) => (0,_element__WEBPACK_IMPORTED_MODULE_17__.hitTest)(element, this.state, x, y));\r\n }\r\n maybeCleanupAfterMissingPointerUp(event) {\r\n if (lastPointerUp !== null) {\r\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\r\n // this can happen when a contextual menu or alert is triggered. In order to avoid\r\n // being in a weird state, we clean up on the next pointerdown\r\n lastPointerUp(event);\r\n }\r\n }\r\n updateGestureOnPointerDown(event) {\r\n gesture.pointers.set(event.pointerId, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n if (gesture.pointers.size === 2) {\r\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\r\n gesture.initialScale = this.state.zoom.value;\r\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\r\n }\r\n }\r\n initialPointerDownState(event) {\r\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\r\n return {\r\n origin,\r\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD],\r\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\r\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\r\n // we need to duplicate because we'll be updating this state\r\n lastCoords: Object.assign({}, origin),\r\n originalElements: this.scene.getElements().reduce((acc, element) => {\r\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.deepCopyElement)(element));\r\n return acc;\r\n }, new Map()),\r\n resize: {\r\n handleType: false,\r\n isResizing: false,\r\n offset: { x: 0, y: 0 },\r\n arrowDirection: \"origin\",\r\n center: { x: (maxX + minX) / 2, y: (maxY + minY) / 2 },\r\n },\r\n hit: {\r\n element: null,\r\n allHitElements: [],\r\n wasAddedToSelection: false,\r\n hasBeenDuplicated: false,\r\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\r\n },\r\n drag: {\r\n hasOccurred: false,\r\n offset: null,\r\n },\r\n eventListeners: {\r\n onMove: null,\r\n onUp: null,\r\n onKeyUp: null,\r\n onKeyDown: null,\r\n },\r\n };\r\n }\r\n // Returns whether the event is a dragging a scrollbar\r\n handleDraggingScrollBar(event, pointerDownState) {\r\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\r\n return false;\r\n }\r\n isDraggingScrollBar = true;\r\n pointerDownState.lastCoords.x = event.clientX;\r\n pointerDownState.lastCoords.y = event.clientY;\r\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n const target = event.target;\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n this.handlePointerMoveOverScrollbars(event, pointerDownState);\r\n });\r\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(() => {\r\n isDraggingScrollBar = false;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, this.state.elementType);\r\n lastPointerUp = null;\r\n this.setState({\r\n cursorButton: \"up\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"up\");\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\r\n });\r\n lastPointerUp = onPointerUp;\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\r\n return true;\r\n }\r\n isASelectedElement(hitElement) {\r\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\r\n }\r\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\r\n if (selectedElements.length < 2) {\r\n return false;\r\n }\r\n // How many pixels off the shape boundary we still consider a hit\r\n const threshold = 10 / this.state.zoom.value;\r\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\r\n return (point.x > x1 - threshold &&\r\n point.x < x2 + threshold &&\r\n point.y > y1 - threshold &&\r\n point.y < y2 + threshold);\r\n }\r\n onKeyDownFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return;\r\n }\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n });\r\n }\r\n onKeyUpFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n // Prevents focus from escaping excalidraw tab\r\n event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ALT && event.preventDefault();\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return;\r\n }\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n });\r\n }\r\n onPointerMoveFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n // We need to initialize dragOffsetXY only after we've updated\r\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\r\n // event handler should hopefully ensure we're already working with\r\n // the updated state.\r\n if (pointerDownState.drag.offset === null) {\r\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state), pointerDownState.origin.x, pointerDownState.origin.y));\r\n }\r\n const target = event.target;\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n if (this.handlePointerMoveOverScrollbars(event, pointerDownState)) {\r\n return;\r\n }\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\r\n // for arrows/lines, don't start dragging until a given threshold\r\n // to ensure we don't create a 2-point arrow by mistake when\r\n // user clicks mouse in a way that it moves a tiny bit (thus\r\n // triggering pointermove)\r\n if (!pointerDownState.drag.hasOccurred &&\r\n (this.state.elementType === \"arrow\" ||\r\n this.state.elementType === \"line\")) {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD) {\r\n return;\r\n }\r\n }\r\n if (pointerDownState.resize.isResizing) {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return true;\r\n }\r\n }\r\n if (this.state.editingLinearElement) {\r\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointDragging(this.state, (appState) => this.setState(appState), pointerCoords.x, pointerCoords.y, (element, startOrEnd) => {\r\n this.maybeSuggestBindingForLinearElementAtCursor(element, startOrEnd, pointerCoords);\r\n });\r\n if (didDrag) {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n return;\r\n }\r\n }\r\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\r\n if (hasHitASelectedElement ||\r\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n // Marking that click was used for dragging to check\r\n // if elements should be deselected on pointerup\r\n pointerDownState.drag.hasOccurred = true;\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n // prevent dragging even if we're no longer holding cmd/ctrl otherwise\r\n // it would have weird results (stuff jumping all over the screen)\r\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\r\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, this.state.gridSize);\r\n const [dragDistanceX, dragDistanceY] = [\r\n Math.abs(pointerCoords.x - pointerDownState.origin.x),\r\n Math.abs(pointerCoords.y - pointerDownState.origin.y),\r\n ];\r\n // We only drag in one direction if shift is pressed\r\n const lockDirection = event.shiftKey;\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, this.scene, lockDirection, dragDistanceX, dragDistanceY);\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n // We duplicate the selected element if alt is pressed on pointer move\r\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\r\n // Move the currently selected elements to the top of the z index stack, and\r\n // put the duplicates where the selected elements used to be.\r\n // (the origin point where the dragging started)\r\n pointerDownState.hit.hasBeenDuplicated = true;\r\n const nextElements = [];\r\n const elementsToAppend = [];\r\n const groupIdMap = new Map();\r\n const oldIdToDuplicatedId = new Map();\r\n const hitElement = pointerDownState.hit.element;\r\n for (const element of this.scene.getElementsIncludingDeleted()) {\r\n if (this.state.selectedElementIds[element.id] ||\r\n // case: the state.selectedElementIds might not have been\r\n // updated yet by the time this mousemove event is fired\r\n (element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) &&\r\n pointerDownState.hit.wasAddedToSelection)) {\r\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(this.state.editingGroupId, groupIdMap, element);\r\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, this.state.gridSize);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(duplicatedElement, {\r\n x: duplicatedElement.x + (originDragX - dragX),\r\n y: duplicatedElement.y + (originDragY - dragY),\r\n });\r\n nextElements.push(duplicatedElement);\r\n elementsToAppend.push(element);\r\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\r\n }\r\n else {\r\n nextElements.push(element);\r\n }\r\n }\r\n const nextSceneElements = [...nextElements, ...elementsToAppend];\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \"duplicatesServeAsOld\");\r\n this.scene.replaceAllElements(nextSceneElements);\r\n }\r\n return;\r\n }\r\n }\r\n // It is very important to read this.state within each move event,\r\n // otherwise we would read a stale one!\r\n const draggingElement = this.state.draggingElement;\r\n if (!draggingElement) {\r\n return;\r\n }\r\n if (draggingElement.type === \"freedraw\") {\r\n const points = draggingElement.points;\r\n const dx = pointerCoords.x - draggingElement.x;\r\n const dy = pointerCoords.y - draggingElement.y;\r\n const pressures = draggingElement.simulatePressure\r\n ? draggingElement.pressures\r\n : [...draggingElement.pressures, event.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\r\n points: [...points, [dx, dy]],\r\n pressures,\r\n });\r\n }\r\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\r\n pointerDownState.drag.hasOccurred = true;\r\n const points = draggingElement.points;\r\n let dx = gridX - draggingElement.x;\r\n let dy = gridY - draggingElement.y;\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.getRotateWithDiscreteAngleKey)(event) && points.length === 2) {\r\n ({ width: dx, height: dy } = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getPerfectElementSize)(this.state.elementType, dx, dy));\r\n }\r\n if (points.length === 1) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, { points: [...points, [dx, dy]] });\r\n }\r\n else if (points.length > 1) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\r\n points: [...points.slice(0, -1), [dx, dy]],\r\n });\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\r\n // When creating a linear element by dragging\r\n this.maybeSuggestBindingForLinearElementAtCursor(draggingElement, \"end\", pointerCoords, this.state.startBoundElement);\r\n }\r\n }\r\n else {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n }\r\n if (this.state.elementType === \"selection\") {\r\n const elements = this.scene.getElements();\r\n if (!event.shiftKey && (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(elements, this.state)) {\r\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: {\r\n [pointerDownState.hit.element.id]: true,\r\n } }), this.scene.getElements()));\r\n }\r\n else {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n }\r\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsWithinSelection)(elements, draggingElement);\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign(Object.assign({}, prevState.selectedElementIds), elementsWithinSelection.reduce((map, element) => {\r\n map[element.id] = true;\r\n return map;\r\n }, {})), (pointerDownState.hit.element\r\n ? {\r\n // if using ctrl/cmd, select the hitElement only if we\r\n // haven't box-selected anything else\r\n [pointerDownState.hit.element\r\n .id]: !elementsWithinSelection.length,\r\n }\r\n : null)) }), this.scene.getElements()));\r\n }\r\n });\r\n }\r\n // Returns whether the pointer move happened over either scrollbar\r\n handlePointerMoveOverScrollbars(event, pointerDownState) {\r\n if (pointerDownState.scrollbars.isOverHorizontal) {\r\n const x = event.clientX;\r\n const dx = x - pointerDownState.lastCoords.x;\r\n this.setState({\r\n scrollX: this.state.scrollX - dx / this.state.zoom.value,\r\n });\r\n pointerDownState.lastCoords.x = x;\r\n return true;\r\n }\r\n if (pointerDownState.scrollbars.isOverVertical) {\r\n const y = event.clientY;\r\n const dy = y - pointerDownState.lastCoords.y;\r\n this.setState({\r\n scrollY: this.state.scrollY - dy / this.state.zoom.value,\r\n });\r\n pointerDownState.lastCoords.y = y;\r\n return true;\r\n }\r\n return false;\r\n }\r\n onPointerUpFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((childEvent) => {\r\n const { draggingElement, resizingElement, multiElement, elementType, elementLocked, isResizing, isRotating, } = this.state;\r\n this.setState({\r\n isResizing: false,\r\n isRotating: false,\r\n resizingElement: null,\r\n selectionElement: null,\r\n cursorButton: \"up\",\r\n // text elements are reset on finalize, and resetting on pointerup\r\n // may cause issues with double taps\r\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(this.state.editingElement)\r\n ? this.state.editingElement\r\n : null,\r\n });\r\n this.savePointer(childEvent.clientX, childEvent.clientY, \"up\");\r\n // Handle end of dragging a point of a linear element, might close a loop\r\n // and sets binding element\r\n if (this.state.editingLinearElement) {\r\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerUp(childEvent, this.state.editingLinearElement, this.state);\r\n if (editingLinearElement !== this.state.editingLinearElement) {\r\n this.setState({\r\n editingLinearElement,\r\n suggestedBindings: [],\r\n });\r\n }\r\n }\r\n lastPointerUp = null;\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\r\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \"freedraw\") {\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, this.state);\r\n const points = draggingElement.points;\r\n let dx = pointerCoords.x - draggingElement.x;\r\n let dy = pointerCoords.y - draggingElement.y;\r\n // Allows dots to avoid being flagged as infinitely small\r\n if (dx === points[0][0] && dy === points[0][1]) {\r\n dy += 0.0001;\r\n dx += 0.0001;\r\n }\r\n const pressures = draggingElement.simulatePressure\r\n ? []\r\n : [...draggingElement.pressures, childEvent.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\r\n points: [...points, [dx, dy]],\r\n pressures,\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\r\n return;\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\r\n if (draggingElement.points.length > 1) {\r\n this.history.resumeRecording();\r\n }\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, this.state);\r\n if (!pointerDownState.drag.hasOccurred &&\r\n draggingElement &&\r\n !multiElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\r\n points: [\r\n ...draggingElement.points,\r\n [\r\n pointerCoords.x - draggingElement.x,\r\n pointerCoords.y - draggingElement.y,\r\n ],\r\n ],\r\n });\r\n this.setState({\r\n multiElement: draggingElement,\r\n editingElement: this.state.draggingElement,\r\n });\r\n }\r\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\r\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(draggingElement, this.state, this.scene, pointerCoords);\r\n }\r\n this.setState({ suggestedBindings: [], startBoundElement: null });\r\n if (!elementLocked) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n this.setState((prevState) => ({\r\n draggingElement: null,\r\n elementType: \"selection\",\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [this.state.draggingElement.id]: true }),\r\n }));\r\n }\r\n else {\r\n this.setState((prevState) => ({\r\n draggingElement: null,\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [this.state.draggingElement.id]: true }),\r\n }));\r\n }\r\n }\r\n return;\r\n }\r\n if (elementType !== \"selection\" &&\r\n draggingElement &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(draggingElement)) {\r\n // remove invisible element which was added in onPointerDown\r\n this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().slice(0, -1));\r\n this.setState({\r\n draggingElement: null,\r\n });\r\n return;\r\n }\r\n if (draggingElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getNormalizedDimensions)(draggingElement));\r\n }\r\n if (resizingElement) {\r\n this.history.resumeRecording();\r\n }\r\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(resizingElement)) {\r\n this.scene.replaceAllElements(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((el) => el.id !== resizingElement.id));\r\n }\r\n // Code below handles selection when element(s) weren't\r\n // drag or added to selection on pointer down phase.\r\n const hitElement = pointerDownState.hit.element;\r\n if (hitElement &&\r\n !pointerDownState.drag.hasOccurred &&\r\n !pointerDownState.hit.wasAddedToSelection) {\r\n if (childEvent.shiftKey) {\r\n if (this.state.selectedElementIds[hitElement.id]) {\r\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_24__.isSelectedViaGroup)(this.state, hitElement)) {\r\n // We want to unselect all groups hitElement is part of\r\n // as well as all elements that are part of the groups\r\n // hitElement is part of\r\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds\r\n .flatMap((groupId) => (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getElementsInGroup)(this.scene.getElements(), groupId))\r\n .map((element) => ({ [element.id]: false }))\r\n .reduce((prevId, acc) => (Object.assign(Object.assign({}, prevId), acc)), {});\r\n this.setState((_prevState) => ({\r\n selectedGroupIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), hitElement.groupIds\r\n .map((gId) => ({ [gId]: false }))\r\n .reduce((prev, acc) => (Object.assign(Object.assign({}, prev), acc)), {})),\r\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups),\r\n }));\r\n }\r\n else {\r\n // remove element from selection while\r\n // keeping prev elements selected\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: false }) }), this.scene.getElements()));\r\n }\r\n }\r\n else {\r\n // add element to selection while\r\n // keeping prev elements selected\r\n this.setState((_prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), { [hitElement.id]: true }),\r\n }));\r\n }\r\n }\r\n else {\r\n this.setState((prevState) => (Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: { [hitElement.id]: true } }), this.scene.getElements()))));\r\n }\r\n }\r\n if (!this.state.editingLinearElement &&\r\n !pointerDownState.drag.hasOccurred &&\r\n !this.state.isResizing &&\r\n ((hitElement &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, this.state, pointerDownState.origin.x, pointerDownState.origin.y)) ||\r\n (!hitElement &&\r\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements))) {\r\n // Deselect selected elements\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n return;\r\n }\r\n if (!elementLocked && elementType !== \"freedraw\" && draggingElement) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [draggingElement.id]: true }),\r\n }));\r\n }\r\n if (elementType !== \"selection\" ||\r\n (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(this.scene.getElements(), this.state)) {\r\n this.history.resumeRecording();\r\n }\r\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\r\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state)\r\n ? _element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements\r\n : _element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state));\r\n }\r\n if (!elementLocked && elementType !== \"freedraw\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n this.setState({\r\n draggingElement: null,\r\n suggestedBindings: [],\r\n elementType: \"selection\",\r\n });\r\n }\r\n else {\r\n this.setState({\r\n draggingElement: null,\r\n suggestedBindings: [],\r\n });\r\n }\r\n });\r\n }\r\n maybeSuggestBindingForAll(selectedElements) {\r\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getEligibleElementsForBinding)(selectedElements);\r\n this.setState({ suggestedBindings });\r\n }\r\n clearSelection(hitElement) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n // Continue editing the same group if the user selected a different\r\n // element from it\r\n editingGroupId: prevState.editingGroupId &&\r\n hitElement != null &&\r\n (0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, prevState.editingGroupId)\r\n ? prevState.editingGroupId\r\n : null,\r\n }));\r\n this.setState({\r\n selectedElementIds: {},\r\n previousSelectedElementIds: this.state.selectedElementIds,\r\n });\r\n }\r\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\r\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementContainingPosition)(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((element) => !(0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element)), x, y);\r\n if (elementClickedInside) {\r\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\r\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\r\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\r\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_12__.TEXT_TO_CENTER_SNAP_THRESHOLD;\r\n if (isSnappedToCenter) {\r\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({ sceneX: elementCenterX, sceneY: elementCenterY }, appState);\r\n return { viewportX, viewportY, elementCenterX, elementCenterY };\r\n }\r\n }\r\n }\r\n getCanvasOffsets() {\r\n var _a;\r\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\r\n const excalidrawContainer = this.excalidrawContainerRef.current;\r\n const { left, top } = excalidrawContainer.getBoundingClientRect();\r\n return {\r\n offsetLeft: left,\r\n offsetTop: top,\r\n };\r\n }\r\n return {\r\n offsetLeft: 0,\r\n offsetTop: 0,\r\n };\r\n }\r\n updateLanguage() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_26__.languages.find((lang) => lang.code === this.props.langCode) ||\r\n _i18n__WEBPACK_IMPORTED_MODULE_26__.defaultLang;\r\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.setLanguage)(currentLang);\r\n this.setAppState({});\r\n });\r\n }\r\n}\r\nApp.defaultProps = {\r\n // needed for tests to pass since we directly render App in many tests\r\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_UI_OPTIONS,\r\n};\r\nif (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST ||\r\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\r\n window.h = window.h || {};\r\n Object.defineProperties(window.h, {\r\n elements: {\r\n configurable: true,\r\n get() {\r\n return this.app.scene.getElementsIncludingDeleted();\r\n },\r\n set(elements) {\r\n return this.app.scene.replaceAllElements(elements);\r\n },\r\n },\r\n });\r\n}\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQztLQUFBOztBQTdtSWEsZ0JBQVksR0FBc0I7SUFDOUMsc0VBQXNFO0lBQ3RFLFNBQVMsRUFBRSwyREFBa0I7Q0FDOUIsQ0FBQztBQTZuSUosSUFDRSxhQUFvQixLQUFLLGlEQUFRO0lBQ2pDLGFBQW9CLEtBQUssd0RBQWUsRUFDeEM7SUFDQSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUssRUFBa0IsQ0FBQztJQUUzQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtRQUNoQyxRQUFRLEVBQUU7WUFDUixZQUFZLEVBQUUsSUFBSTtZQUNsQixHQUFHO2dCQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsR0FBRyxDQUFDLFFBQTZCO2dCQUMvQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELENBQUM7U0FDRjtLQUNGLENBQUMsQ0FBQztDQUNKO0FBQ0QsaUVBQWUsR0FBRyxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2NvbXBvbmVudHMvQXBwLnRzeD8wMDcwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBSb3VnaENhbnZhcyB9IGZyb20gXCJyb3VnaGpzL2Jpbi9jYW52YXNcIjtcbmltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCBjbHN4IGZyb20gXCJjbHN4XCI7XG5pbXBvcnQgeyBzdXBwb3J0ZWQgYXMgZnNTdXBwb3J0ZWQgfSBmcm9tIFwiYnJvd3Nlci1mcy1hY2Nlc3NcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gXCJuYW5vaWRcIjtcblxuaW1wb3J0IHtcbiAgYWN0aW9uQWRkVG9MaWJyYXJ5LFxuICBhY3Rpb25CcmluZ0ZvcndhcmQsXG4gIGFjdGlvbkJyaW5nVG9Gcm9udCxcbiAgYWN0aW9uQ29weSxcbiAgYWN0aW9uQ29weUFzUG5nLFxuICBhY3Rpb25Db3B5QXNTdmcsXG4gIGFjdGlvbkNvcHlTdHlsZXMsXG4gIGFjdGlvbkN1dCxcbiAgYWN0aW9uRGVsZXRlU2VsZWN0ZWQsXG4gIGFjdGlvbkR1cGxpY2F0ZVNlbGVjdGlvbixcbiAgYWN0aW9uRmluYWxpemUsXG4gIGFjdGlvbkZsaXBIb3Jpem9udGFsLFxuICBhY3Rpb25GbGlwVmVydGljYWwsXG4gIGFjdGlvbkdyb3VwLFxuICBhY3Rpb25QYXN0ZVN0eWxlcyxcbiAgYWN0aW9uU2VsZWN0QWxsLFxuICBhY3Rpb25TZW5kQmFja3dhcmQsXG4gIGFjdGlvblNlbmRUb0JhY2ssXG4gIGFjdGlvblRvZ2dsZUdyaWRNb2RlLFxuICBhY3Rpb25Ub2dnbGVTdGF0cyxcbiAgYWN0aW9uVG9nZ2xlWmVuTW9kZSxcbiAgYWN0aW9uVW5ncm91cCxcbiAgem9vbVRvRml0RWxlbWVudHMsXG59IGZyb20gXCIuLi9hY3Rpb25zXCI7XG5pbXBvcnQgeyBjcmVhdGVSZWRvQWN0aW9uLCBjcmVhdGVVbmRvQWN0aW9uIH0gZnJvbSBcIi4uL2FjdGlvbnMvYWN0aW9uSGlzdG9yeVwiO1xuaW1wb3J0IHsgQWN0aW9uTWFuYWdlciB9IGZyb20gXCIuLi9hY3Rpb25zL21hbmFnZXJcIjtcbmltcG9ydCB7IGFjdGlvbnMgfSBmcm9tIFwiLi4vYWN0aW9ucy9yZWdpc3RlclwiO1xuaW1wb3J0IHsgQWN0aW9uUmVzdWx0IH0gZnJvbSBcIi4uL2FjdGlvbnMvdHlwZXNcIjtcbmltcG9ydCB7IHRyYWNrRXZlbnQgfSBmcm9tIFwiLi4vYW5hbHl0aWNzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7XG4gIGNvcHlUb0NsaXBib2FyZCxcbiAgcGFyc2VDbGlwYm9hcmQsXG4gIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iLFxuICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0LFxufSBmcm9tIFwiLi4vY2xpcGJvYXJkXCI7XG5pbXBvcnQge1xuICBBUFBfTkFNRSxcbiAgQ1VSU09SX1RZUEUsXG4gIERFRkFVTFRfVUlfT1BUSU9OUyxcbiAgREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgRFJBR0dJTkdfVEhSRVNIT0xELFxuICBFTEVNRU5UX1NISUZUX1RSQU5TTEFURV9BTU9VTlQsXG4gIEVMRU1FTlRfVFJBTlNMQVRFX0FNT1VOVCxcbiAgRU5WLFxuICBFVkVOVCxcbiAgR1JJRF9TSVpFLFxuICBMSU5FX0NPTkZJUk1fVEhSRVNIT0xELFxuICBNSU1FX1RZUEVTLFxuICBNUV9NQVhfSEVJR0hUX0xBTkRTQ0FQRSxcbiAgTVFfTUFYX1dJRFRIX0xBTkRTQ0FQRSxcbiAgTVFfTUFYX1dJRFRIX1BPUlRSQUlULFxuICBQT0lOVEVSX0JVVFRPTixcbiAgU0NST0xMX1RJTUVPVVQsXG4gIFRBUF9UV0lDRV9USU1FT1VULFxuICBURVhUX1RPX0NFTlRFUl9TTkFQX1RIUkVTSE9MRCxcbiAgVE9VQ0hfQ1RYX01FTlVfVElNRU9VVCxcbiAgVVJMX0hBU0hfS0VZUyxcbiAgVVJMX1FVRVJZX0tFWVMsXG4gIFpPT01fU1RFUCxcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbG9hZEZyb21CbG9iIH0gZnJvbSBcIi4uL2RhdGFcIjtcbmltcG9ydCB7IGlzVmFsaWRMaWJyYXJ5IH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcIi4uL2RhdGEvbGlicmFyeVwiO1xuaW1wb3J0IHsgcmVzdG9yZSwgcmVzdG9yZUVsZW1lbnRzIH0gZnJvbSBcIi4uL2RhdGEvcmVzdG9yZVwiO1xuaW1wb3J0IHtcbiAgZHJhZ05ld0VsZW1lbnQsXG4gIGRyYWdTZWxlY3RlZEVsZW1lbnRzLFxuICBkdXBsaWNhdGVFbGVtZW50LFxuICBnZXRDb21tb25Cb3VuZHMsXG4gIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCxcbiAgZ2V0RHJhZ09mZnNldFhZLFxuICBnZXRFbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUsXG4gIGdldE5vcm1hbGl6ZWREaW1lbnNpb25zLFxuICBnZXRQZXJmZWN0RWxlbWVudFNpemUsXG4gIGdldFJlc2l6ZUFycm93RGlyZWN0aW9uLFxuICBnZXRSZXNpemVPZmZzZXRYWSxcbiAgZ2V0VHJhbnNmb3JtSGFuZGxlVHlwZUZyb21Db29yZHMsXG4gIGhpdFRlc3QsXG4gIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudCxcbiAgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQsXG4gIGlzTm9uRGVsZXRlZEVsZW1lbnQsXG4gIGlzVGV4dEVsZW1lbnQsXG4gIG5ld0VsZW1lbnQsXG4gIG5ld0xpbmVhckVsZW1lbnQsXG4gIG5ld1RleHRFbGVtZW50LFxuICB0ZXh0V3lzaXd5ZyxcbiAgdHJhbnNmb3JtRWxlbWVudHMsXG4gIHVwZGF0ZVRleHRFbGVtZW50LFxufSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyxcbiAgZml4QmluZGluZ3NBZnRlckRlbGV0aW9uLFxuICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24sXG4gIGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nLFxuICBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcsXG4gIGlzQmluZGluZ0VuYWJsZWQsXG4gIGlzTGluZWFyRWxlbWVudFNpbXBsZUFuZEFscmVhZHlCb3VuZCxcbiAgbWF5YmVCaW5kTGluZWFyRWxlbWVudCxcbiAgc2hvdWxkRW5hYmxlQmluZGluZ0ZvclBvaW50ZXJFdmVudCxcbiAgdW5iaW5kTGluZWFyRWxlbWVudHMsXG4gIHVwZGF0ZUJvdW5kRWxlbWVudHMsXG59IGZyb20gXCIuLi9lbGVtZW50L2JpbmRpbmdcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZGVlcENvcHlFbGVtZW50LCBuZXdGcmVlRHJhd0VsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC9uZXdFbGVtZW50XCI7XG5pbXBvcnQge1xuICBpc0JpbmRpbmdFbGVtZW50LFxuICBpc0JpbmRpbmdFbGVtZW50VHlwZSxcbiAgaXNMaW5lYXJFbGVtZW50LFxuICBpc0xpbmVhckVsZW1lbnRUeXBlLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBOb25EZWxldGVkLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Q2VudGVyLCBnZXREaXN0YW5jZSB9IGZyb20gXCIuLi9nZXN0dXJlXCI7XG5pbXBvcnQge1xuICBlZGl0R3JvdXBGb3JTZWxlY3RlZEVsZW1lbnQsXG4gIGdldEVsZW1lbnRzSW5Hcm91cCxcbiAgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudCxcbiAgZ2V0U2VsZWN0ZWRHcm91cElkcyxcbiAgaXNFbGVtZW50SW5Hcm91cCxcbiAgaXNTZWxlY3RlZFZpYUdyb3VwLFxuICBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzLFxufSBmcm9tIFwiLi4vZ3JvdXBzXCI7XG5pbXBvcnQgSGlzdG9yeSBmcm9tIFwiLi4vaGlzdG9yeVwiO1xuaW1wb3J0IHsgZGVmYXVsdExhbmcsIGdldExhbmd1YWdlLCBsYW5ndWFnZXMsIHNldExhbmd1YWdlLCB0IH0gZnJvbSBcIi4uL2kxOG5cIjtcbmltcG9ydCB7XG4gIENPREVTLFxuICBnZXRSZXNpemVDZW50ZXJQb2ludEtleSxcbiAgZ2V0UmVzaXplV2l0aFNpZGVzU2FtZUxlbmd0aEtleSxcbiAgZ2V0Um90YXRlV2l0aERpc2NyZXRlQW5nbGVLZXksXG4gIGlzQXJyb3dLZXksXG4gIEtFWVMsXG59IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQgeyBkaXN0YW5jZTJkLCBnZXRHcmlkUG9pbnQsIGlzUGF0aEFMb29wIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lIH0gZnJvbSBcIi4uL3JlbmRlcmVyXCI7XG5pbXBvcnQgeyBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50IH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlckVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZVNjcm9sbENlbnRlcixcbiAgZ2V0RWxlbWVudENvbnRhaW5pbmdQb3NpdGlvbixcbiAgZ2V0RWxlbWVudHNBdFBvc2l0aW9uLFxuICBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbixcbiAgZ2V0Tm9ybWFsaXplZFpvb20sXG4gIGdldFNlbGVjdGVkRWxlbWVudHMsXG4gIGhhc0JhY2tncm91bmQsXG4gIGlzT3ZlclNjcm9sbEJhcnMsXG4gIGlzU29tZUVsZW1lbnRTZWxlY3RlZCxcbn0gZnJvbSBcIi4uL3NjZW5lXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQgeyBTY2VuZVN0YXRlLCBTY3JvbGxCYXJzIH0gZnJvbSBcIi4uL3NjZW5lL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXROZXdab29tIH0gZnJvbSBcIi4uL3NjZW5lL3pvb21cIjtcbmltcG9ydCB7IGZpbmRTaGFwZUJ5S2V5IH0gZnJvbSBcIi4uL3NoYXBlc1wiO1xuaW1wb3J0IHtcbiAgQXBwUHJvcHMsXG4gIEFwcFN0YXRlLFxuICBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSSxcbiAgR2VzdHVyZSxcbiAgR2VzdHVyZUV2ZW50LFxuICBMaWJyYXJ5SXRlbXMsXG4gIFBvaW50ZXJEb3duU3RhdGUsXG4gIFNjZW5lRGF0YSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBkZWJvdW5jZSxcbiAgZGlzdGFuY2UsXG4gIGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyLFxuICBpc0lucHV0TGlrZSxcbiAgaXNUb29sSWNvbixcbiAgaXNXcml0YWJsZUVsZW1lbnQsXG4gIHJlc2V0Q3Vyc29yLFxuICByZXNvbHZhYmxlUHJvbWlzZSxcbiAgc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzLFxuICBzZXRDdXJzb3IsXG4gIHNldEN1cnNvckZvclNoYXBlLFxuICB0dXBsZVRvQ29vcnMsXG4gIHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyxcbiAgd2l0aEJhdGNoZWRVcGRhdGVzLFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCBDb250ZXh0TWVudSwgeyBDb250ZXh0TWVudU9wdGlvbiB9IGZyb20gXCIuL0NvbnRleHRNZW51XCI7XG5pbXBvcnQgTGF5ZXJVSSBmcm9tIFwiLi9MYXllclVJXCI7XG5pbXBvcnQgeyBTdGF0cyB9IGZyb20gXCIuL1N0YXRzXCI7XG5pbXBvcnQgeyBUb2FzdCB9IGZyb20gXCIuL1RvYXN0XCI7XG5pbXBvcnQgeyBhY3Rpb25Ub2dnbGVWaWV3TW9kZSB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvblRvZ2dsZVZpZXdNb2RlXCI7XG5cbmNvbnN0IElzTW9iaWxlQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoZmFsc2UpO1xuZXhwb3J0IGNvbnN0IHVzZUlzTW9iaWxlID0gKCkgPT4gdXNlQ29udGV4dChJc01vYmlsZUNvbnRleHQpO1xuY29uc3QgRXhjYWxpZHJhd0NvbnRhaW5lckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PHtcbiAgY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGw7XG4gIGlkOiBzdHJpbmcgfCBudWxsO1xufT4oeyBjb250YWluZXI6IG51bGwsIGlkOiBudWxsIH0pO1xuZXhwb3J0IGNvbnN0IHVzZUV4Y2FsaWRyYXdDb250YWluZXIgPSAoKSA9PlxuICB1c2VDb250ZXh0KEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0KTtcblxubGV0IGRpZFRhcFR3aWNlOiBib29sZWFuID0gZmFsc2U7XG5sZXQgdGFwcGVkVHdpY2VUaW1lciA9IDA7XG5sZXQgY3Vyc29yWCA9IDA7XG5sZXQgY3Vyc29yWSA9IDA7XG5sZXQgaXNIb2xkaW5nU3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcbmxldCBpc1Bhbm5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbmxldCBpc0RyYWdnaW5nU2Nyb2xsQmFyOiBib29sZWFuID0gZmFsc2U7XG5sZXQgY3VycmVudFNjcm9sbEJhcnM6IFNjcm9sbEJhcnMgPSB7IGhvcml6b250YWw6IG51bGwsIHZlcnRpY2FsOiBudWxsIH07XG5sZXQgdG91Y2hUaW1lb3V0ID0gMDtcbmxldCBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSBmYWxzZTtcblxubGV0IGxhc3RQb2ludGVyVXA6ICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbmNvbnN0IGdlc3R1cmU6IEdlc3R1cmUgPSB7XG4gIHBvaW50ZXJzOiBuZXcgTWFwKCksXG4gIGxhc3RDZW50ZXI6IG51bGwsXG4gIGluaXRpYWxEaXN0YW5jZTogbnVsbCxcbiAgaW5pdGlhbFNjYWxlOiBudWxsLFxufTtcblxuY2xhc3MgQXBwIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PEFwcFByb3BzLCBBcHBTdGF0ZT4ge1xuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHJjOiBSb3VnaENhbnZhcyB8IG51bGwgPSBudWxsO1xuICB1bm1vdW50ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYWN0aW9uTWFuYWdlcjogQWN0aW9uTWFuYWdlcjtcbiAgaXNNb2JpbGUgPSBmYWxzZTtcbiAgZGV0YWNoSXNNb2JpbGVNcUhhbmRsZXI/OiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgZXhjYWxpZHJhd0NvbnRhaW5lclJlZiA9IFJlYWN0LmNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcblxuICBwdWJsaWMgc3RhdGljIGRlZmF1bHRQcm9wczogUGFydGlhbDxBcHBQcm9wcz4gPSB7XG4gICAgLy8gbmVlZGVkIGZvciB0ZXN0cyB0byBwYXNzIHNpbmNlIHdlIGRpcmVjdGx5IHJlbmRlciBBcHAgaW4gbWFueSB0ZXN0c1xuICAgIFVJT3B0aW9uczogREVGQVVMVF9VSV9PUFRJT05TLFxuICB9O1xuXG4gIHByaXZhdGUgc2NlbmU6IFNjZW5lO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBuZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGxpYnJhcnk6IExpYnJhcnk7XG4gIHB1YmxpYyBsaWJyYXJ5SXRlbXNGcm9tU3RvcmFnZTogTGlicmFyeUl0ZW1zIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGlkOiBzdHJpbmc7XG4gIHByaXZhdGUgaGlzdG9yeTogSGlzdG9yeTtcbiAgcHJpdmF0ZSBleGNhbGlkcmF3Q29udGFpbmVyVmFsdWU6IHtcbiAgICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgICBpZDogc3RyaW5nO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBBcHBQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcbiAgICBjb25zdCB7XG4gICAgICBleGNhbGlkcmF3UmVmLFxuICAgICAgdmlld01vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICB6ZW5Nb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgZ3JpZE1vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICB0aGVtZSA9IGRlZmF1bHRBcHBTdGF0ZS50aGVtZSxcbiAgICAgIG5hbWUgPSBkZWZhdWx0QXBwU3RhdGUubmFtZSxcbiAgICB9ID0gcHJvcHM7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIC4uLmRlZmF1bHRBcHBTdGF0ZSxcbiAgICAgIHRoZW1lLFxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxuICAgICAgLi4udGhpcy5nZXRDYW52YXNPZmZzZXRzKCksXG4gICAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgIGdyaWRTaXplOiBncmlkTW9kZUVuYWJsZWQgPyBHUklEX1NJWkUgOiBudWxsLFxuICAgICAgbmFtZSxcbiAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICAgIH07XG5cbiAgICB0aGlzLmlkID0gbmFub2lkKCk7XG5cbiAgICBpZiAoZXhjYWxpZHJhd1JlZikge1xuICAgICAgY29uc3QgcmVhZHlQcm9taXNlID1cbiAgICAgICAgKFwiY3VycmVudFwiIGluIGV4Y2FsaWRyYXdSZWYgJiYgZXhjYWxpZHJhd1JlZi5jdXJyZW50Py5yZWFkeVByb21pc2UpIHx8XG4gICAgICAgIHJlc29sdmFibGVQcm9taXNlPEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJPigpO1xuXG4gICAgICBjb25zdCBhcGk6IEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJID0ge1xuICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgcmVhZHlQcm9taXNlLFxuICAgICAgICB1cGRhdGVTY2VuZTogdGhpcy51cGRhdGVTY2VuZSxcbiAgICAgICAgcmVzZXRTY2VuZTogdGhpcy5yZXNldFNjZW5lLFxuICAgICAgICBnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZDogdGhpcy5nZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCxcbiAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgIGNsZWFyOiB0aGlzLnJlc2V0SGlzdG9yeSxcbiAgICAgICAgfSxcbiAgICAgICAgc2Nyb2xsVG9Db250ZW50OiB0aGlzLnNjcm9sbFRvQ29udGVudCxcbiAgICAgICAgem9vbVRvRml0OiB0aGlzLnpvb21Ub0ZpdCxcbiAgICAgICAgZ2V0U2NlbmVFbGVtZW50czogdGhpcy5nZXRTY2VuZUVsZW1lbnRzLFxuICAgICAgICBnZXRBcHBTdGF0ZTogKCkgPT4gdGhpcy5zdGF0ZSxcbiAgICAgICAgcmVmcmVzaDogdGhpcy5yZWZyZXNoLFxuICAgICAgICBpbXBvcnRMaWJyYXJ5OiB0aGlzLmltcG9ydExpYnJhcnlGcm9tVXJsLFxuICAgICAgICBzZXRUb2FzdE1lc3NhZ2U6IHRoaXMuc2V0VG9hc3RNZXNzYWdlLFxuICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgIH0gYXMgY29uc3Q7XG4gICAgICBpZiAodHlwZW9mIGV4Y2FsaWRyYXdSZWYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBleGNhbGlkcmF3UmVmKGFwaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGNhbGlkcmF3UmVmLmN1cnJlbnQgPSBhcGk7XG4gICAgICB9XG4gICAgICByZWFkeVByb21pc2UucmVzb2x2ZShhcGkpO1xuICAgIH1cblxuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlID0ge1xuICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgIH07XG5cbiAgICB0aGlzLnNjZW5lID0gbmV3IFNjZW5lKCk7XG4gICAgdGhpcy5saWJyYXJ5ID0gbmV3IExpYnJhcnkodGhpcyk7XG4gICAgdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkoKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIgPSBuZXcgQWN0aW9uTWFuYWdlcihcbiAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCxcbiAgICAgICgpID0+IHRoaXMuc3RhdGUsXG4gICAgICAoKSA9PiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgdGhpcyxcbiAgICApO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFsbChhY3Rpb25zKTtcblxuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFjdGlvbihjcmVhdGVVbmRvQWN0aW9uKHRoaXMuaGlzdG9yeSkpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFjdGlvbihjcmVhdGVSZWRvQWN0aW9uKHRoaXMuaGlzdG9yeSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDYW52YXMoKSB7XG4gICAgY29uc3QgY2FudmFzU2NhbGUgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aDogY2FudmFzRE9NV2lkdGgsXG4gICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodCxcbiAgICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhc0RPTVdpZHRoICogY2FudmFzU2NhbGU7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gY2FudmFzRE9NSGVpZ2h0ICogY2FudmFzU2NhbGU7XG4gICAgaWYgKHZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGNhbnZhc1xuICAgICAgICAgIGNsYXNzTmFtZT1cImV4Y2FsaWRyYXdfX2NhbnZhc1wiXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHdpZHRoOiBjYW52YXNET01XaWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgICAgICAgY3Vyc29yOiBDVVJTT1JfVFlQRS5HUkFCLFxuICAgICAgICAgIH19XG4gICAgICAgICAgd2lkdGg9e2NhbnZhc1dpZHRofVxuICAgICAgICAgIGhlaWdodD17Y2FudmFzSGVpZ2h0fVxuICAgICAgICAgIHJlZj17dGhpcy5oYW5kbGVDYW52YXNSZWZ9XG4gICAgICAgICAgb25Db250ZXh0TWVudT17dGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudX1cbiAgICAgICAgICBvblBvaW50ZXJNb3ZlPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlfVxuICAgICAgICAgIG9uUG9pbnRlclVwPXt0aGlzLnJlbW92ZVBvaW50ZXJ9XG4gICAgICAgICAgb25Qb2ludGVyQ2FuY2VsPXt0aGlzLnJlbW92ZVBvaW50ZXJ9XG4gICAgICAgICAgb25Ub3VjaE1vdmU9e3RoaXMuaGFuZGxlVG91Y2hNb3ZlfVxuICAgICAgICAgIG9uUG9pbnRlckRvd249e3RoaXMuaGFuZGxlQ2FudmFzUG9pbnRlckRvd259XG4gICAgICAgID5cbiAgICAgICAgICB7dChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpfVxuICAgICAgICA8L2NhbnZhcz5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8Y2FudmFzXG4gICAgICAgIGNsYXNzTmFtZT1cImV4Y2FsaWRyYXdfX2NhbnZhc1wiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgICB9fVxuICAgICAgICB3aWR0aD17Y2FudmFzV2lkdGh9XG4gICAgICAgIGhlaWdodD17Y2FudmFzSGVpZ2h0fVxuICAgICAgICByZWY9e3RoaXMuaGFuZGxlQ2FudmFzUmVmfVxuICAgICAgICBvbkNvbnRleHRNZW51PXt0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51fVxuICAgICAgICBvblBvaW50ZXJEb3duPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3dufVxuICAgICAgICBvbkRvdWJsZUNsaWNrPXt0aGlzLmhhbmRsZUNhbnZhc0RvdWJsZUNsaWNrfVxuICAgICAgICBvblBvaW50ZXJNb3ZlPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlfVxuICAgICAgICBvblBvaW50ZXJVcD17dGhpcy5yZW1vdmVQb2ludGVyfVxuICAgICAgICBvblBvaW50ZXJDYW5jZWw9e3RoaXMucmVtb3ZlUG9pbnRlcn1cbiAgICAgICAgb25Ub3VjaE1vdmU9e3RoaXMuaGFuZGxlVG91Y2hNb3ZlfVxuICAgICAgPlxuICAgICAgICB7dChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpfVxuICAgICAgPC9jYW52YXM+XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgY29uc3QgeyB6ZW5Nb2RlRW5hYmxlZCwgdmlld01vZGVFbmFibGVkIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgY29uc3Qge1xuICAgICAgb25Db2xsYWJCdXR0b25DbGljayxcbiAgICAgIHJlbmRlclRvcFJpZ2h0VUksXG4gICAgICByZW5kZXJGb290ZXIsXG4gICAgICByZW5kZXJDdXN0b21TdGF0cyxcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y2xzeChcImV4Y2FsaWRyYXcgZXhjYWxpZHJhdy1jb250YWluZXJcIiwge1xuICAgICAgICAgIFwiZXhjYWxpZHJhdy0tdmlldy1tb2RlXCI6IHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgICAgICBcImV4Y2FsaWRyYXctLW1vYmlsZVwiOiB0aGlzLmlzTW9iaWxlLFxuICAgICAgICB9KX1cbiAgICAgICAgcmVmPXt0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWZ9XG4gICAgICAgIG9uRHJvcD17dGhpcy5oYW5kbGVBcHBPbkRyb3B9XG4gICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICBvbktleURvd249e1xuICAgICAgICAgIHRoaXMucHJvcHMuaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSA/IHVuZGVmaW5lZCA6IHRoaXMub25LZXlEb3duXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAgPEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgICAgdmFsdWU9e3RoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlfVxuICAgICAgICA+XG4gICAgICAgICAgPElzTW9iaWxlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17dGhpcy5pc01vYmlsZX0+XG4gICAgICAgICAgICA8TGF5ZXJVSVxuICAgICAgICAgICAgICBjYW52YXM9e3RoaXMuY2FudmFzfVxuICAgICAgICAgICAgICBhcHBTdGF0ZT17dGhpcy5zdGF0ZX1cbiAgICAgICAgICAgICAgc2V0QXBwU3RhdGU9e3RoaXMuc2V0QXBwU3RhdGV9XG4gICAgICAgICAgICAgIGFjdGlvbk1hbmFnZXI9e3RoaXMuYWN0aW9uTWFuYWdlcn1cbiAgICAgICAgICAgICAgZWxlbWVudHM9e3RoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKX1cbiAgICAgICAgICAgICAgb25Db2xsYWJCdXR0b25DbGljaz17b25Db2xsYWJCdXR0b25DbGlja31cbiAgICAgICAgICAgICAgb25Mb2NrVG9nZ2xlPXt0aGlzLnRvZ2dsZUxvY2t9XG4gICAgICAgICAgICAgIG9uSW5zZXJ0RWxlbWVudHM9eyhlbGVtZW50cykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5KHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZD17emVuTW9kZUVuYWJsZWR9XG4gICAgICAgICAgICAgIHRvZ2dsZVplbk1vZGU9e3RoaXMudG9nZ2xlWmVuTW9kZX1cbiAgICAgICAgICAgICAgbGFuZ0NvZGU9e2dldExhbmd1YWdlKCkuY29kZX1cbiAgICAgICAgICAgICAgaXNDb2xsYWJvcmF0aW5nPXt0aGlzLnByb3BzLmlzQ29sbGFib3JhdGluZyB8fCBmYWxzZX1cbiAgICAgICAgICAgICAgcmVuZGVyVG9wUmlnaHRVST17cmVuZGVyVG9wUmlnaHRVSX1cbiAgICAgICAgICAgICAgcmVuZGVyQ3VzdG9tRm9vdGVyPXtyZW5kZXJGb290ZXJ9XG4gICAgICAgICAgICAgIHZpZXdNb2RlRW5hYmxlZD17dmlld01vZGVFbmFibGVkfVxuICAgICAgICAgICAgICBzaG93RXhpdFplbk1vZGVCdG49e1xuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnByb3BzPy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgIHplbk1vZGVFbmFibGVkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2hvd1RoZW1lQnRuPXtcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcz8udGhlbWUgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zLnRoZW1lXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGlicmFyeVJldHVyblVybD17dGhpcy5wcm9wcy5saWJyYXJ5UmV0dXJuVXJsfVxuICAgICAgICAgICAgICBVSU9wdGlvbnM9e3RoaXMucHJvcHMuVUlPcHRpb25zfVxuICAgICAgICAgICAgICBmb2N1c0NvbnRhaW5lcj17dGhpcy5mb2N1c0NvbnRhaW5lcn1cbiAgICAgICAgICAgICAgbGlicmFyeT17dGhpcy5saWJyYXJ5fVxuICAgICAgICAgICAgICBpZD17dGhpcy5pZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImV4Y2FsaWRyYXctY29udGV4dE1lbnVDb250YWluZXJcIiAvPlxuICAgICAgICAgICAge3RoaXMuc3RhdGUuc2hvd1N0YXRzICYmIChcbiAgICAgICAgICAgICAgPFN0YXRzXG4gICAgICAgICAgICAgICAgYXBwU3RhdGU9e3RoaXMuc3RhdGV9XG4gICAgICAgICAgICAgICAgc2V0QXBwU3RhdGU9e3RoaXMuc2V0QXBwU3RhdGV9XG4gICAgICAgICAgICAgICAgZWxlbWVudHM9e3RoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKX1cbiAgICAgICAgICAgICAgICBvbkNsb3NlPXt0aGlzLnRvZ2dsZVN0YXRzfVxuICAgICAgICAgICAgICAgIHJlbmRlckN1c3RvbVN0YXRzPXtyZW5kZXJDdXN0b21TdGF0c31cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7dGhpcy5zdGF0ZS50b2FzdE1lc3NhZ2UgIT09IG51bGwgJiYgKFxuICAgICAgICAgICAgICA8VG9hc3RcbiAgICAgICAgICAgICAgICBtZXNzYWdlPXt0aGlzLnN0YXRlLnRvYXN0TWVzc2FnZX1cbiAgICAgICAgICAgICAgICBjbGVhclRvYXN0PXt0aGlzLmNsZWFyVG9hc3R9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPG1haW4+e3RoaXMucmVuZGVyQ2FudmFzKCl9PC9tYWluPlxuICAgICAgICAgIDwvSXNNb2JpbGVDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICA8L0V4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBmb2N1c0NvbnRhaW5lciA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5wcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gIH07XG5cbiAgcHVibGljIGdldFNjZW5lRWxlbWVudHMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgfTtcblxuICBwcml2YXRlIHN5bmNBY3Rpb25SZXN1bHQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGFjdGlvblJlc3VsdDogQWN0aW9uUmVzdWx0KSA9PiB7XG4gICAgICBpZiAodGhpcy51bm1vdW50ZWQgfHwgYWN0aW9uUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBlZGl0aW5nRWxlbWVudDogQXBwU3RhdGVbXCJlZGl0aW5nRWxlbWVudFwiXSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKGFjdGlvblJlc3VsdC5lbGVtZW50cykge1xuICAgICAgICBhY3Rpb25SZXN1bHQuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQ/LmlkID09PSBlbGVtZW50LmlkICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50ICE9PSBlbGVtZW50ICYmXG4gICAgICAgICAgICBpc05vbkRlbGV0ZWRFbGVtZW50KGVsZW1lbnQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlZGl0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoYWN0aW9uUmVzdWx0LmVsZW1lbnRzKTtcbiAgICAgICAgaWYgKGFjdGlvblJlc3VsdC5jb21taXRUb0hpc3RvcnkpIHtcbiAgICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGlvblJlc3VsdC5hcHBTdGF0ZSB8fCBlZGl0aW5nRWxlbWVudCkge1xuICAgICAgICBpZiAoYWN0aW9uUmVzdWx0LmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2aWV3TW9kZUVuYWJsZWQgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy52aWV3TW9kZUVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICAgIGxldCB6ZW5Nb2RlRW5hYmxlZCA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/Lnplbk1vZGVFbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBsZXQgZ3JpZFNpemUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy5ncmlkU2l6ZSB8fCBudWxsO1xuICAgICAgICBsZXQgdGhlbWUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy50aGVtZSB8fCBcImxpZ2h0XCI7XG4gICAgICAgIGxldCBuYW1lID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8ubmFtZSA/PyB0aGlzLnN0YXRlLm5hbWU7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB2aWV3TW9kZUVuYWJsZWQgPSB0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHplbk1vZGVFbmFibGVkID0gdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBncmlkU2l6ZSA9IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy50aGVtZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIHRoZW1lID0gdGhpcy5wcm9wcy50aGVtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5uYW1lICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgbmFtZSA9IHRoaXMucHJvcHMubmFtZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICAgIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgLy8gdXNpbmcgT2JqZWN0LmFzc2lnbiBpbnN0ZWFkIG9mIHNwcmVhZCB0byBmb29sIFRTIDQuMi4yKyBpbnRvXG4gICAgICAgICAgICAvLyByZWdhcmRpbmcgdGhlIHJlc3VsdGluZyB0eXBlIGFzIG5vdCBjb250YWluaW5nIHVuZGVmaW5lZFxuICAgICAgICAgICAgLy8gKHdoaWNoIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiB3aWxsIG5ldmVyIGNvbnRhaW4pXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY3Rpb25SZXN1bHQuYXBwU3RhdGUgfHwge30sIHtcbiAgICAgICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6XG4gICAgICAgICAgICAgICAgZWRpdGluZ0VsZW1lbnQgfHwgYWN0aW9uUmVzdWx0LmFwcFN0YXRlPy5lZGl0aW5nRWxlbWVudCB8fCBudWxsLFxuICAgICAgICAgICAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICAgICAgICAgIHplbk1vZGVFbmFibGVkLFxuICAgICAgICAgICAgICBncmlkU2l6ZSxcbiAgICAgICAgICAgICAgdGhlbWUsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGlmIChhY3Rpb25SZXN1bHQuc3luY0hpc3RvcnkpIHtcbiAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnNldEN1cnJlbnRTdGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICApO1xuXG4gIC8vIExpZmVjeWNsZVxuXG4gIHByaXZhdGUgb25CbHVyID0gd2l0aEJhdGNoZWRVcGRhdGVzKCgpID0+IHtcbiAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiB0cnVlIH0pO1xuICB9KTtcblxuICBwcml2YXRlIG9uVW5sb2FkID0gKCkgPT4ge1xuICAgIHRoaXMub25CbHVyKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBkaXNhYmxlRXZlbnQ6IEV2ZW50SGFuZGxlck5vbk51bGwgPSAoZXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9O1xuXG4gIHByaXZhdGUgb25Gb250TG9hZGVkID0gKCkgPT4ge1xuICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm9uU2NlbmVVcGRhdGVkKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBpbXBvcnRMaWJyYXJ5RnJvbVVybCA9IGFzeW5jICh1cmw6IHN0cmluZywgdG9rZW4/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoLmluY2x1ZGVzKFVSTF9IQVNIX0tFWVMuYWRkTGlicmFyeSkpIHtcbiAgICAgIGNvbnN0IGhhc2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpKTtcbiAgICAgIGhhc2guZGVsZXRlKFVSTF9IQVNIX0tFWVMuYWRkTGlicmFyeSk7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIEFQUF9OQU1FLCBgIyR7aGFzaC50b1N0cmluZygpfWApO1xuICAgIH0gZWxzZSBpZiAod2luZG93LmxvY2F0aW9uLnNlYXJjaC5pbmNsdWRlcyhVUkxfUVVFUllfS0VZUy5hZGRMaWJyYXJ5KSkge1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgcXVlcnkuZGVsZXRlKFVSTF9RVUVSWV9LRVlTLmFkZExpYnJhcnkpO1xuICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBBUFBfTkFNRSwgYD8ke3F1ZXJ5LnRvU3RyaW5nKCl9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCBmZXRjaChkZWNvZGVVUklDb21wb25lbnQodXJsKSk7XG4gICAgICBjb25zdCBibG9iID0gYXdhaXQgcmVxdWVzdC5ibG9iKCk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBibG9iLnRleHQoKSk7XG4gICAgICBpZiAoIWlzVmFsaWRMaWJyYXJ5KGpzb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0b2tlbiA9PT0gdGhpcy5pZCB8fFxuICAgICAgICB3aW5kb3cuY29uZmlybShcbiAgICAgICAgICB0KFwiYWxlcnRzLmNvbmZpcm1BZGRMaWJyYXJ5XCIsIHsgbnVtU2hhcGVzOiBqc29uLmxpYnJhcnkubGVuZ3RoIH0pLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5saWJyYXJ5LmltcG9ydExpYnJhcnkoYmxvYik7XG4gICAgICAgIC8vIGhhY2sgdG8gcmVyZW5kZXIgdGhlIGxpYnJhcnkgaXRlbXMgYWZ0ZXIgaW1wb3J0XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmlzTGlicmFyeU9wZW4pIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMaWJyYXJ5T3BlbjogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46IHRydWUgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHdpbmRvdy5hbGVydCh0KFwiYWxlcnRzLmVycm9yTG9hZGluZ0xpYnJhcnlcIikpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZm9jdXNDb250YWluZXIoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldEhpc3RvcnkgPSAoKSA9PiB7XG4gICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBzY2VuZSAmIGhpc3RvcnkuXG4gICAqICEgRG8gbm90IHVzZSB0byBjbGVhciBzY2VuZSB1c2VyIGFjdGlvbiAhXG4gICAqL1xuICBwcml2YXRlIHJlc2V0U2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKG9wdHM/OiB7IHJlc2V0TG9hZGluZ1N0YXRlOiBib29sZWFuIH0pID0+IHtcbiAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtdKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiAoe1xuICAgICAgICAuLi5nZXREZWZhdWx0QXBwU3RhdGUoKSxcbiAgICAgICAgaXNMb2FkaW5nOiBvcHRzPy5yZXNldExvYWRpbmdTdGF0ZSA/IGZhbHNlIDogc3RhdGUuaXNMb2FkaW5nLFxuICAgICAgICB0aGVtZTogdGhpcy5zdGF0ZS50aGVtZSxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIGluaXRpYWxpemVTY2VuZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoXCJsYXVuY2hRdWV1ZVwiIGluIHdpbmRvdyAmJiBcIkxhdW5jaFBhcmFtc1wiIGluIHdpbmRvdykge1xuICAgICAgKHdpbmRvdyBhcyBhbnkpLmxhdW5jaFF1ZXVlLnNldENvbnN1bWVyKFxuICAgICAgICBhc3luYyAobGF1bmNoUGFyYW1zOiB7IGZpbGVzOiBhbnlbXSB9KSA9PiB7XG4gICAgICAgICAgaWYgKCFsYXVuY2hQYXJhbXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZpbGVIYW5kbGUgPSBsYXVuY2hQYXJhbXMuZmlsZXNbMF07XG4gICAgICAgICAgY29uc3QgYmxvYjogQmxvYiA9IGF3YWl0IGZpbGVIYW5kbGUuZ2V0RmlsZSgpO1xuICAgICAgICAgIGJsb2IuaGFuZGxlID0gZmlsZUhhbmRsZTtcbiAgICAgICAgICBsb2FkRnJvbUJsb2IoXG4gICAgICAgICAgICBibG9iLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4oKHsgZWxlbWVudHMsIGFwcFN0YXRlIH0pID0+XG4gICAgICAgICAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCh7XG4gICAgICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICAgICAgICAgIC4uLihhcHBTdGF0ZSB8fCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiBmYWxzZSwgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xvYWRpbmc6IHRydWUgfSk7XG4gICAgfVxuICAgIGxldCBpbml0aWFsRGF0YSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGluaXRpYWxEYXRhID0gKGF3YWl0IHRoaXMucHJvcHMuaW5pdGlhbERhdGEpIHx8IG51bGw7XG4gICAgICBpZiAoaW5pdGlhbERhdGE/LmxpYnJhcnlJdGVtcykge1xuICAgICAgICB0aGlzLmxpYnJhcnlJdGVtc0Zyb21TdG9yYWdlID0gaW5pdGlhbERhdGEubGlicmFyeUl0ZW1zO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIGluaXRpYWxEYXRhID0ge1xuICAgICAgICBhcHBTdGF0ZToge1xuICAgICAgICAgIGVycm9yTWVzc2FnZTpcbiAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgfHxcbiAgICAgICAgICAgIFwiRW5jb3VudGVyZWQgYW4gZXJyb3IgZHVyaW5nIGltcG9ydGluZyBvciByZXN0b3Jpbmcgc2NlbmUgZGF0YVwiLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2VuZSA9IHJlc3RvcmUoaW5pdGlhbERhdGEsIG51bGwsIG51bGwpO1xuICAgIHNjZW5lLmFwcFN0YXRlID0ge1xuICAgICAgLi4uc2NlbmUuYXBwU3RhdGUsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIH07XG4gICAgaWYgKGluaXRpYWxEYXRhPy5zY3JvbGxUb0NvbnRlbnQpIHtcbiAgICAgIHNjZW5lLmFwcFN0YXRlID0ge1xuICAgICAgICAuLi5zY2VuZS5hcHBTdGF0ZSxcbiAgICAgICAgLi4uY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKFxuICAgICAgICAgIHNjZW5lLmVsZW1lbnRzLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnNjZW5lLmFwcFN0YXRlLFxuICAgICAgICAgICAgd2lkdGg6IHRoaXMuc3RhdGUud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuc3RhdGUuaGVpZ2h0LFxuICAgICAgICAgICAgb2Zmc2V0VG9wOiB0aGlzLnN0YXRlLm9mZnNldFRvcCxcbiAgICAgICAgICAgIG9mZnNldExlZnQ6IHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMucmVzZXRIaXN0b3J5KCk7XG4gICAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0KHtcbiAgICAgIC4uLnNjZW5lLFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbGlicmFyeVVybCA9XG4gICAgICAvLyBjdXJyZW50XG4gICAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpKS5nZXQoXG4gICAgICAgIFVSTF9IQVNIX0tFWVMuYWRkTGlicmFyeSxcbiAgICAgICkgfHxcbiAgICAgIC8vIGxlZ2FjeSwga2VwdCBmb3IgY29tcGF0IHJlYXNvbnNcbiAgICAgIG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KFxuICAgICAgICBVUkxfUVVFUllfS0VZUy5hZGRMaWJyYXJ5LFxuICAgICAgKTtcblxuICAgIGlmIChsaWJyYXJ5VXJsKSB7XG4gICAgICBhd2FpdCB0aGlzLmltcG9ydExpYnJhcnlGcm9tVXJsKGxpYnJhcnlVcmwpO1xuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUuY29udGFpbmVyID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLlRFU1QgfHxcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuREVWRUxPUE1FTlRcbiAgICApIHtcbiAgICAgIGNvbnN0IHNldFN0YXRlID0gdGhpcy5zZXRTdGF0ZS5iaW5kKHRoaXMpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LmgsIHtcbiAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzZXRTdGF0ZToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIHNldFN0YXRlPikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3RhdGUoLi4uYXJncyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYXBwOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLFxuICAgICAgICB9LFxuICAgICAgICBoaXN0b3J5OiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnNjZW5lLmFkZENhbGxiYWNrKHRoaXMub25TY2VuZVVwZGF0ZWQpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCkge1xuICAgICAgdGhpcy5mb2N1c0NvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIGlmIChcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93ICYmIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZj8uY3VycmVudCkge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgIC8vIGNvbXB1dGUgaXNNb2JpbGUgc3RhdGVcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgIH0gPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuaXNNb2JpbGUgPVxuICAgICAgICAgIHdpZHRoIDwgTVFfTUFYX1dJRFRIX1BPUlRSQUlUIHx8XG4gICAgICAgICAgKGhlaWdodCA8IE1RX01BWF9IRUlHSFRfTEFORFNDQVBFICYmIHdpZHRoIDwgTVFfTUFYX1dJRFRIX0xBTkRTQ0FQRSk7XG4gICAgICAgIC8vIHJlZnJlc2ggb2Zmc2V0c1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdGhpcy51cGRhdGVET01SZWN0KCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/Lm9ic2VydmUodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpO1xuICAgIH0gZWxzZSBpZiAod2luZG93Lm1hdGNoTWVkaWEpIHtcbiAgICAgIGNvbnN0IG1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYShcbiAgICAgICAgYChtYXgtd2lkdGg6ICR7TVFfTUFYX1dJRFRIX1BPUlRSQUlUfXB4KSwgKG1heC1oZWlnaHQ6ICR7TVFfTUFYX0hFSUdIVF9MQU5EU0NBUEV9cHgpIGFuZCAobWF4LXdpZHRoOiAke01RX01BWF9XSURUSF9MQU5EU0NBUEV9cHgpYCxcbiAgICAgICk7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4gKHRoaXMuaXNNb2JpbGUgPSBtZWRpYVF1ZXJ5Lm1hdGNoZXMpO1xuICAgICAgbWVkaWFRdWVyeS5hZGRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgICAgIHRoaXMuZGV0YWNoSXNNb2JpbGVNcUhhbmRsZXIgPSAoKSA9PiBtZWRpYVF1ZXJ5LnJlbW92ZUxpc3RlbmVyKGhhbmRsZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKSk7XG5cbiAgICBpZiAoc2VhcmNoUGFyYW1zLmhhcyhcIndlYi1zaGFyZS10YXJnZXRcIikpIHtcbiAgICAgIC8vIE9idGFpbiBhIGZpbGUgdGhhdCB3YXMgc2hhcmVkIHZpYSB0aGUgV2ViIFNoYXJlIFRhcmdldCBBUEkuXG4gICAgICB0aGlzLnJlc3RvcmVGaWxlRnJvbVNoYXJlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlRE9NUmVjdCh0aGlzLmluaXRpYWxpemVTY2VuZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnVubW91bnRlZCA9IHRydWU7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMuc2NlbmUuZGVzdHJveSgpO1xuICAgIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgIHRvdWNoVGltZW91dCA9IDA7XG4gIH1cblxuICBwcml2YXRlIG9uUmVzaXplID0gd2l0aEJhdGNoZWRVcGRhdGVzKCgpID0+IHtcbiAgICB0aGlzLnNjZW5lXG4gICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgIC5mb3JFYWNoKChlbGVtZW50KSA9PiBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpKTtcbiAgICB0aGlzLnNldFN0YXRlKHt9KTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZW1vdmVFdmVudExpc3RlbmVycygpIHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRoaXMucmVtb3ZlUG9pbnRlcik7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5DT1BZLCB0aGlzLm9uQ29weSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgdGhpcy5wYXN0ZUZyb21DbGlwYm9hcmQpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ1VULCB0aGlzLm9uQ3V0KTtcbiAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyPy5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuU0NST0xMLFxuICAgICAgdGhpcy5vblNjcm9sbCxcbiAgICApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgdGhpcy5vbktleURvd24sIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuTU9VU0VfTU9WRSxcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uLFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCB0aGlzLm9uS2V5VXApO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlVOTE9BRCwgdGhpcy5vblVubG9hZCwgZmFsc2UpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRoaXMub25CbHVyLCBmYWxzZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuRFJBR19PVkVSLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkRST1AsIHRoaXMuZGlzYWJsZUV2ZW50LCBmYWxzZSk7XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9TVEFSVCxcbiAgICAgIHRoaXMub25HZXN0dXJlU3RhcnQgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9DSEFOR0UsXG4gICAgICB0aGlzLm9uR2VzdHVyZUNoYW5nZSBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5HRVNUVVJFX0VORCxcbiAgICAgIHRoaXMub25HZXN0dXJlRW5kIGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG5cbiAgICB0aGlzLmRldGFjaElzTW9iaWxlTXFIYW5kbGVyPy4oKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGhpcy5yZW1vdmVQb2ludGVyKTsgLy8gIzM1NTNcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPUFksIHRoaXMub25Db3B5KTtcbiAgICBpZiAodGhpcy5wcm9wcy5oYW5kbGVLZXlib2FyZEdsb2JhbGx5KSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIHRoaXMub25LZXlVcCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5NT1VTRV9NT1ZFLFxuICAgICAgdGhpcy51cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24sXG4gICAgKTtcbiAgICAvLyByZXJlbmRlciB0ZXh0IGVsZW1lbnRzIG9uIGZvbnQgbG9hZCB0byBmaXggIzYzNyAmJiAjMTU1M1xuICAgIGRvY3VtZW50LmZvbnRzPy5hZGRFdmVudExpc3RlbmVyPy4oXCJsb2FkaW5nZG9uZVwiLCB0aGlzLm9uRm9udExvYWRlZCk7XG4gICAgLy8gU2FmYXJpLW9ubHkgZGVza3RvcCBwaW5jaCB6b29tXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfU1RBUlQsXG4gICAgICB0aGlzLm9uR2VzdHVyZVN0YXJ0IGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfQ0hBTkdFLFxuICAgICAgdGhpcy5vbkdlc3R1cmVDaGFuZ2UgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9FTkQsXG4gICAgICB0aGlzLm9uR2VzdHVyZUVuZCBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgaWYgKHRoaXMucHJvcHMuZGV0ZWN0U2Nyb2xsKSB7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIoXG4gICAgICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgICk7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULlNDUk9MTCxcbiAgICAgICAgdGhpcy5vblNjcm9sbCxcbiAgICAgICk7XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlVOTE9BRCwgdGhpcy5vblVubG9hZCwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRoaXMub25CbHVyLCBmYWxzZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuRFJBR19PVkVSLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkRST1AsIHRoaXMuZGlzYWJsZUV2ZW50LCBmYWxzZSk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBBcHBQcm9wcywgcHJldlN0YXRlOiBBcHBTdGF0ZSkge1xuICAgIGlmIChwcmV2UHJvcHMubGFuZ0NvZGUgIT09IHRoaXMucHJvcHMubGFuZ0NvZGUpIHtcbiAgICAgIHRoaXMudXBkYXRlTGFuZ3VhZ2UoKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnZpZXdNb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aWV3TW9kZUVuYWJsZWQ6ICEhdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZTdGF0ZS52aWV3TW9kZUVuYWJsZWQgIT09IHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmRlc2VsZWN0RWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnplbk1vZGVFbmFibGVkICE9PSB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgemVuTW9kZUVuYWJsZWQ6ICEhdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnRoZW1lICE9PSB0aGlzLnByb3BzLnRoZW1lICYmIHRoaXMucHJvcHMudGhlbWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyB0aGVtZTogdGhpcy5wcm9wcy50aGVtZSB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLmdyaWRNb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBncmlkU2l6ZTogdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPyBHUklEX1NJWkUgOiBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMubmFtZSAmJiBwcmV2UHJvcHMubmFtZSAhPT0gdGhpcy5wcm9wcy5uYW1lKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbmFtZTogdGhpcy5wcm9wcy5uYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNsYXNzTGlzdC50b2dnbGUoXG4gICAgICBcInRoZW1lLS1kYXJrXCIsXG4gICAgICB0aGlzLnN0YXRlLnRoZW1lID09PSBcImRhcmtcIixcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJlxuICAgICAgIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW3RoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkXVxuICAgICkge1xuICAgICAgLy8gZGVmZXIgc28gdGhhdCB0aGUgY29tbWl0VG9IaXN0b3J5IGZsYWcgaXNuJ3QgcmVzZXQgdmlhIGN1cnJlbnQgdXBkYXRlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgbXVsdGlFbGVtZW50IH0gPSBwcmV2U3RhdGU7XG4gICAgaWYgKFxuICAgICAgcHJldlN0YXRlLmVsZW1lbnRUeXBlICE9PSB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICYmXG4gICAgICBtdWx0aUVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICAgaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKSAmJlxuICAgICAgaXNCaW5kaW5nRWxlbWVudChtdWx0aUVsZW1lbnQpXG4gICAgKSB7XG4gICAgICBtYXliZUJpbmRMaW5lYXJFbGVtZW50KFxuICAgICAgICBtdWx0aUVsZW1lbnQsXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgIHR1cGxlVG9Db29ycyhcbiAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50QXRJbmRleEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgICAgICAgbXVsdGlFbGVtZW50LFxuICAgICAgICAgICAgLTEsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yQnV0dG9uOiB7XG4gICAgICBbaWQ6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB9ID0ge307XG4gICAgY29uc3QgcG9pbnRlclZpZXdwb3J0Q29vcmRzOiBTY2VuZVN0YXRlW1wicmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzXCJdID0ge307XG4gICAgY29uc3QgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiBTY2VuZVN0YXRlW1wicmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzXCJdID0ge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJuYW1lczogeyBbaWQ6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJTdGF0ZXM6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIHRoaXMuc3RhdGUuY29sbGFib3JhdG9ycy5mb3JFYWNoKCh1c2VyLCBzb2NrZXRJZCkgPT4ge1xuICAgICAgaWYgKHVzZXIuc2VsZWN0ZWRFbGVtZW50SWRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXModXNlci5zZWxlY3RlZEVsZW1lbnRJZHMpKSB7XG4gICAgICAgICAgaWYgKCEoaWQgaW4gcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzKSkge1xuICAgICAgICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2lkXSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHNbaWRdLnB1c2goc29ja2V0SWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXVzZXIucG9pbnRlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgICBwb2ludGVyVXNlcm5hbWVzW3NvY2tldElkXSA9IHVzZXIudXNlcm5hbWU7XG4gICAgICB9XG4gICAgICBpZiAodXNlci51c2VyU3RhdGUpIHtcbiAgICAgICAgcG9pbnRlclVzZXJTdGF0ZXNbc29ja2V0SWRdID0gdXNlci51c2VyU3RhdGU7XG4gICAgICB9XG4gICAgICBwb2ludGVyVmlld3BvcnRDb29yZHNbc29ja2V0SWRdID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKFxuICAgICAgICB7XG4gICAgICAgICAgc2NlbmVYOiB1c2VyLnBvaW50ZXIueCxcbiAgICAgICAgICBzY2VuZVk6IHVzZXIucG9pbnRlci55LFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgKTtcbiAgICAgIGN1cnNvckJ1dHRvbltzb2NrZXRJZF0gPSB1c2VyLmJ1dHRvbjtcbiAgICB9KTtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICBjb25zdCB7IGF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCwgc2Nyb2xsQmFycyB9ID0gcmVuZGVyU2NlbmUoXG4gICAgICBlbGVtZW50cy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcbiAgICAgICAgLy8gZG9uJ3QgcmVuZGVyIHRleHQgZWxlbWVudCB0aGF0J3MgYmVpbmcgY3VycmVudGx5IGVkaXRlZCAoaXQnc1xuICAgICAgICAvLyByZW5kZXJlZCBvbiByZW1vdGUgb25seSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudCB8fFxuICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQudHlwZSAhPT0gXCJ0ZXh0XCIgfHxcbiAgICAgICAgICBlbGVtZW50LmlkICE9PSB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50LmlkXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgICB0aGlzLnN0YXRlLnNlbGVjdGlvbkVsZW1lbnQsXG4gICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgIHRoaXMucmMhLFxuICAgICAgdGhpcy5jYW52YXMhLFxuICAgICAge1xuICAgICAgICBzY3JvbGxYOiB0aGlzLnN0YXRlLnNjcm9sbFgsXG4gICAgICAgIHNjcm9sbFk6IHRoaXMuc3RhdGUuc2Nyb2xsWSxcbiAgICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yLFxuICAgICAgICB6b29tOiB0aGlzLnN0YXRlLnpvb20sXG4gICAgICAgIHJlbW90ZVBvaW50ZXJWaWV3cG9ydENvb3JkczogcG9pbnRlclZpZXdwb3J0Q29vcmRzLFxuICAgICAgICByZW1vdGVQb2ludGVyQnV0dG9uOiBjdXJzb3JCdXR0b24sXG4gICAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczogcG9pbnRlclVzZXJuYW1lcyxcbiAgICAgICAgcmVtb3RlUG9pbnRlclVzZXJTdGF0ZXM6IHBvaW50ZXJVc2VyU3RhdGVzLFxuICAgICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IHRoaXMuc3RhdGUuc2hvdWxkQ2FjaGVJZ25vcmVab29tLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcmVuZGVyT3B0aW1pemF0aW9uczogdHJ1ZSxcbiAgICAgICAgcmVuZGVyU2Nyb2xsYmFyczogIXRoaXMuaXNNb2JpbGUsXG4gICAgICB9LFxuICAgICk7XG4gICAgaWYgKHNjcm9sbEJhcnMpIHtcbiAgICAgIGN1cnJlbnRTY3JvbGxCYXJzID0gc2Nyb2xsQmFycztcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsZWRPdXRzaWRlID1cbiAgICAgIC8vIGhpZGUgd2hlbiBlZGl0aW5nIHRleHRcbiAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQ/LnR5cGUgPT09IFwidGV4dFwiXG4gICAgICAgID8gZmFsc2VcbiAgICAgICAgOiAhYXRMZWFzdE9uZVZpc2libGVFbGVtZW50ICYmIGVsZW1lbnRzLmxlbmd0aCA+IDA7XG4gICAgaWYgKHRoaXMuc3RhdGUuc2Nyb2xsZWRPdXRzaWRlICE9PSBzY3JvbGxlZE91dHNpZGUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzY3JvbGxlZE91dHNpZGUgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5oaXN0b3J5LnJlY29yZCh0aGlzLnN0YXRlLCB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKTtcblxuICAgIC8vIERvIG5vdCBub3RpZnkgY29uc3VtZXJzIGlmIHdlJ3JlIHN0aWxsIGxvYWRpbmcgdGhlIHNjZW5lLiBBbW9uZyBvdGhlclxuICAgIC8vIHBvdGVudGlhbCBpc3N1ZXMsIHRoaXMgZml4ZXMgYSBjYXNlIHdoZXJlIHRoZSB0YWIgaXNuJ3QgZm9jdXNlZCBkdXJpbmdcbiAgICAvLyBpbml0LCB3aGljaCB3b3VsZCB0cmlnZ2VyIG9uQ2hhbmdlIHdpdGggZW1wdHkgZWxlbWVudHMsIHdoaWNoIHdvdWxkIHRoZW5cbiAgICAvLyBvdmVycmlkZSB3aGF0ZXZlciBpcyBpbiBsb2NhbFN0b3JhZ2UgY3VycmVudGx5LlxuICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMucHJvcHMub25DaGFuZ2U/LihcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblNjcm9sbCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICBjb25zdCB7IG9mZnNldFRvcCwgb2Zmc2V0TGVmdCB9ID0gdGhpcy5nZXRDYW52YXNPZmZzZXRzKCk7XG4gICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGUpID0+IHtcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXRMZWZ0ID09PSBvZmZzZXRMZWZ0ICYmIHN0YXRlLm9mZnNldFRvcCA9PT0gb2Zmc2V0VG9wKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgb2Zmc2V0VG9wLCBvZmZzZXRMZWZ0IH07XG4gICAgfSk7XG4gIH0sIFNDUk9MTF9USU1FT1VUKTtcblxuICAvLyBDb3B5L3Bhc3RlXG5cbiAgcHJpdmF0ZSBvbkN1dCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKFxuICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxcbiAgICApO1xuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jdXRBbGwoKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9KTtcblxuICBwcml2YXRlIG9uQ29weSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKFxuICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxcbiAgICApO1xuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb3B5QWxsKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBjdXRBbGwgPSAoKSA9PiB7XG4gICAgdGhpcy5jb3B5QWxsKCk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRGVsZXRlU2VsZWN0ZWQpO1xuICB9O1xuXG4gIHByaXZhdGUgY29weUFsbCA9ICgpID0+IHtcbiAgICBjb3B5VG9DbGlwYm9hcmQodGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCB0aGlzLnN0YXRlKTtcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyByZXNldFRhcFR3aWNlKCkge1xuICAgIGRpZFRhcFR3aWNlID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIG9uVGFwU3RhcnQgPSAoZXZlbnQ6IFRvdWNoRXZlbnQpID0+IHtcbiAgICBpZiAoIWRpZFRhcFR3aWNlKSB7XG4gICAgICBkaWRUYXBUd2ljZSA9IHRydWU7XG4gICAgICBjbGVhclRpbWVvdXQodGFwcGVkVHdpY2VUaW1lcik7XG4gICAgICB0YXBwZWRUd2ljZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoXG4gICAgICAgIEFwcC5yZXNldFRhcFR3aWNlLFxuICAgICAgICBUQVBfVFdJQ0VfVElNRU9VVCxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGluc2VydCB0ZXh0IG9ubHkgaWYgd2UgdGFwcGVkIHR3aWNlIHdpdGggYSBzaW5nbGUgZmluZ2VyXG4gICAgLy8gZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEgd2lsbCBhbHNvIHByZXZlbnQgaW5zZXJ0aW5nIHRleHQgd2hlbiB1c2VyJ3Mgem9vbWluZ1xuICAgIGlmIChkaWRUYXBUd2ljZSAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgW3RvdWNoXSA9IGV2ZW50LnRvdWNoZXM7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLmhhbmRsZUNhbnZhc0RvdWJsZUNsaWNrKHtcbiAgICAgICAgY2xpZW50WDogdG91Y2guY2xpZW50WCxcbiAgICAgICAgY2xpZW50WTogdG91Y2guY2xpZW50WSxcbiAgICAgIH0pO1xuICAgICAgZGlkVGFwVHdpY2UgPSBmYWxzZTtcbiAgICAgIGNsZWFyVGltZW91dCh0YXBwZWRUd2ljZVRpbWVyKTtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgb25UYXBFbmQgPSAoZXZlbnQ6IFRvdWNoRXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUucHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBwYXN0ZUZyb21DbGlwYm9hcmQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgYXN5bmMgKGV2ZW50OiBDbGlwYm9hcmRFdmVudCB8IG51bGwpID0+IHtcbiAgICAgIC8vICM2ODZcbiAgICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBpc0V4Y2FsaWRyYXdBY3RpdmUgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uY29udGFpbnMoXG4gICAgICAgIHRhcmdldCxcbiAgICAgICk7XG4gICAgICBpZiAoIWlzRXhjYWxpZHJhd0FjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRVbmRlckN1cnNvciA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoY3Vyc29yWCwgY3Vyc29yWSk7XG4gICAgICBpZiAoXG4gICAgICAgIC8vIGlmIG5vIENsaXBib2FyZEV2ZW50IHN1cHBsaWVkLCBhc3N1bWUgd2UncmUgcGFzdGluZyB2aWEgY29udGV4dE1lbnVcbiAgICAgICAgLy8gdGh1cyB0aGVzZSBjaGVja3MgZG9uJ3QgbWFrZSBzZW5zZVxuICAgICAgICBldmVudCAmJlxuICAgICAgICAoIShlbGVtZW50VW5kZXJDdXJzb3IgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkgfHxcbiAgICAgICAgICBpc1dyaXRhYmxlRWxlbWVudCh0YXJnZXQpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBwYXJzZUNsaXBib2FyZChldmVudCk7XG4gICAgICBpZiAodGhpcy5wcm9wcy5vblBhc3RlKSB7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLnByb3BzLm9uUGFzdGUoZGF0YSwgZXZlbnQpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5lcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGVycm9yTWVzc2FnZTogZGF0YS5lcnJvck1lc3NhZ2UgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuc3ByZWFkc2hlZXQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcGFzdGVEaWFsb2c6IHtcbiAgICAgICAgICAgIGRhdGE6IGRhdGEuc3ByZWFkc2hlZXQsXG4gICAgICAgICAgICBzaG93bjogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5lbGVtZW50cykge1xuICAgICAgICB0aGlzLmFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5KHtcbiAgICAgICAgICBlbGVtZW50czogZGF0YS5lbGVtZW50cyxcbiAgICAgICAgICBwb3NpdGlvbjogXCJjdXJzb3JcIixcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEudGV4dCkge1xuICAgICAgICB0aGlzLmFkZFRleHRGcm9tUGFzdGUoZGF0YS50ZXh0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0U2hhcGVUb29sKFwic2VsZWN0aW9uXCIpO1xuICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIGFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5ID0gKG9wdHM6IHtcbiAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgICBwb3NpdGlvbjogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9IHwgXCJjdXJzb3JcIiB8IFwiY2VudGVyXCI7XG4gIH0pID0+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHJlc3RvcmVFbGVtZW50cyhvcHRzLmVsZW1lbnRzLCBudWxsKTtcbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDb21tb25Cb3VuZHMoZWxlbWVudHMpO1xuXG4gICAgY29uc3QgZWxlbWVudHNDZW50ZXJYID0gZGlzdGFuY2UobWluWCwgbWF4WCkgLyAyO1xuICAgIGNvbnN0IGVsZW1lbnRzQ2VudGVyWSA9IGRpc3RhbmNlKG1pblksIG1heFkpIC8gMjtcblxuICAgIGNvbnN0IGNsaWVudFggPVxuICAgICAgdHlwZW9mIG9wdHMucG9zaXRpb24gPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBvcHRzLnBvc2l0aW9uLmNsaWVudFhcbiAgICAgICAgOiBvcHRzLnBvc2l0aW9uID09PSBcImN1cnNvclwiXG4gICAgICAgID8gY3Vyc29yWFxuICAgICAgICA6IHRoaXMuc3RhdGUud2lkdGggLyAyICsgdGhpcy5zdGF0ZS5vZmZzZXRMZWZ0O1xuICAgIGNvbnN0IGNsaWVudFkgPVxuICAgICAgdHlwZW9mIG9wdHMucG9zaXRpb24gPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBvcHRzLnBvc2l0aW9uLmNsaWVudFlcbiAgICAgICAgOiBvcHRzLnBvc2l0aW9uID09PSBcImN1cnNvclwiXG4gICAgICAgID8gY3Vyc29yWVxuICAgICAgICA6IHRoaXMuc3RhdGUuaGVpZ2h0IC8gMiArIHRoaXMuc3RhdGUub2Zmc2V0VG9wO1xuXG4gICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICB7IGNsaWVudFgsIGNsaWVudFkgfSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IGR4ID0geCAtIGVsZW1lbnRzQ2VudGVyWDtcbiAgICBjb25zdCBkeSA9IHkgLSBlbGVtZW50c0NlbnRlclk7XG4gICAgY29uc3QgZ3JvdXBJZE1hcCA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KGR4LCBkeSwgdGhpcy5zdGF0ZS5ncmlkU2l6ZSk7XG5cbiAgICBjb25zdCBvbGRJZFRvRHVwbGljYXRlZElkID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBuZXdFbGVtZW50ID0gZHVwbGljYXRlRWxlbWVudChcbiAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nR3JvdXBJZCxcbiAgICAgICAgZ3JvdXBJZE1hcCxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAge1xuICAgICAgICAgIHg6IGVsZW1lbnQueCArIGdyaWRYIC0gbWluWCxcbiAgICAgICAgICB5OiBlbGVtZW50LnkgKyBncmlkWSAtIG1pblksXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZC5zZXQoZWxlbWVudC5pZCwgbmV3RWxlbWVudC5pZCk7XG4gICAgICByZXR1cm4gbmV3RWxlbWVudDtcbiAgICB9KTtcbiAgICBjb25zdCBuZXh0RWxlbWVudHMgPSBbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgLi4ubmV3RWxlbWVudHMsXG4gICAgXTtcbiAgICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24obmV4dEVsZW1lbnRzLCBlbGVtZW50cywgb2xkSWRUb0R1cGxpY2F0ZWRJZCk7XG5cbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0RWxlbWVudHMpO1xuICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAge1xuICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgaXNMaWJyYXJ5T3BlbjogZmFsc2UsXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBuZXdFbGVtZW50cy5yZWR1Y2UoKG1hcCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgbWFwW2VsZW1lbnQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgfSwge30gYXMgYW55KSxcbiAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgKSxcbiAgICApO1xuICAgIHRoaXMuc2VsZWN0U2hhcGVUb29sKFwic2VsZWN0aW9uXCIpO1xuICB9O1xuXG4gIHByaXZhdGUgYWRkVGV4dEZyb21QYXN0ZSh0ZXh0OiBhbnkpIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgIHsgY2xpZW50WDogY3Vyc29yWCwgY2xpZW50WTogY3Vyc29yWSB9LFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IG5ld1RleHRFbGVtZW50KHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICB0ZXh0LFxuICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgIGZvbnRGYW1pbHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250RmFtaWx5LFxuICAgICAgdGV4dEFsaWduOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtVGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbjogREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgICB9KTtcblxuICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICBlbGVtZW50LFxuICAgIF0pO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2VsZW1lbnQuaWRdOiB0cnVlIH0gfSk7XG4gICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICB9XG5cbiAgLy8gQ29sbGFib3JhdGlvblxuXG4gIHNldEFwcFN0YXRlID0gKG9iajogYW55KSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZShvYmopO1xuICB9O1xuXG4gIHJlbW92ZVBvaW50ZXIgPSAoZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MRWxlbWVudD4gfCBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAvLyByZW1vdmUgdG91Y2ggaGFuZGxlciBmb3IgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIiAmJiB0b3VjaFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGdlc3R1cmUucG9pbnRlcnMuZGVsZXRlKGV2ZW50LnBvaW50ZXJJZCk7XG4gIH07XG5cbiAgdG9nZ2xlTG9jayA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVsZW1lbnRMb2NrZWQ6ICFwcmV2U3RhdGUuZWxlbWVudExvY2tlZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IHByZXZTdGF0ZS5lbGVtZW50TG9ja2VkXG4gICAgICAgICAgPyBcInNlbGVjdGlvblwiXG4gICAgICAgICAgOiBwcmV2U3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIHRvZ2dsZVplbk1vZGUgPSAoKSA9PiB7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uVG9nZ2xlWmVuTW9kZSk7XG4gIH07XG5cbiAgdG9nZ2xlU3RhdHMgPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLnNob3dTdGF0cykge1xuICAgICAgdHJhY2tFdmVudChcImRpYWxvZ1wiLCBcInN0YXRzXCIpO1xuICAgIH1cbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25Ub2dnbGVTdGF0cyk7XG4gIH07XG5cbiAgc2Nyb2xsVG9Db250ZW50ID0gKFxuICAgIHRhcmdldDpcbiAgICAgIHwgRXhjYWxpZHJhd0VsZW1lbnRcbiAgICAgIHwgcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAuLi5jYWxjdWxhdGVTY3JvbGxDZW50ZXIoXG4gICAgICAgIEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldCA6IFt0YXJnZXRdLFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICksXG4gICAgfSk7XG4gIH07XG5cbiAgem9vbVRvRml0ID0gKFxuICAgIHRhcmdldDpcbiAgICAgIHwgRXhjYWxpZHJhd0VsZW1lbnRbXVxuICAgICAgfCByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgIG1heFpvb206IG51bWJlciA9IDEsIC8vbnVsbCB3aWxsIHpvb20gdG8gbWF4IGJhc2VkIG9uIHZpZXdwb3J0XG4gICAgbWFyZ2luOiBudW1iZXIgPSAwLjAzLCAvL3BlcmNlbnRhZ2Ugb2Ygdmlld3BvcnQgd2lkdGgmaGVpZ2h0XG4gICkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICB6b29tVG9GaXRFbGVtZW50cyh0YXJnZXQsIHRoaXMuc3RhdGUsIGZhbHNlLCBtYXhab29tLCBtYXJnaW4pLmFwcFN0YXRlLFxuICAgICk7XG4gIH07XG5cbiAgY2xlYXJUb2FzdCA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgdG9hc3RNZXNzYWdlOiBudWxsIH0pO1xuICB9O1xuXG4gIHNldFRvYXN0TWVzc2FnZSA9ICh0b2FzdE1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyB0b2FzdE1lc3NhZ2UgfSk7XG4gIH07XG5cbiAgcmVzdG9yZUZpbGVGcm9tU2hhcmUgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYlNoYXJlVGFyZ2V0Q2FjaGUgPSBhd2FpdCBjYWNoZXMub3BlbihcIndlYi1zaGFyZS10YXJnZXRcIik7XG5cbiAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB3ZWJTaGFyZVRhcmdldENhY2hlLm1hdGNoKFwic2hhcmVkLWZpbGVcIik7XG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgZmlsZS5ibG9iKCk7XG4gICAgICAgIHRoaXMubG9hZEZpbGVUb0NhbnZhcyhibG9iKTtcbiAgICAgICAgYXdhaXQgd2ViU2hhcmVUYXJnZXRDYWNoZS5kZWxldGUoXCJzaGFyZWQtZmlsZVwiKTtcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIEFQUF9OQU1FLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgdXBkYXRlU2NlbmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgPEsgZXh0ZW5kcyBrZXlvZiBBcHBTdGF0ZT4oc2NlbmVEYXRhOiB7XG4gICAgICBlbGVtZW50cz86IFNjZW5lRGF0YVtcImVsZW1lbnRzXCJdO1xuICAgICAgYXBwU3RhdGU/OiBQaWNrPEFwcFN0YXRlLCBLPiB8IG51bGw7XG4gICAgICBjb2xsYWJvcmF0b3JzPzogU2NlbmVEYXRhW1wiY29sbGFib3JhdG9yc1wiXTtcbiAgICAgIGNvbW1pdFRvSGlzdG9yeT86IFNjZW5lRGF0YVtcImNvbW1pdFRvSGlzdG9yeVwiXTtcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoc2NlbmVEYXRhLmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEuYXBwU3RhdGUpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShzY2VuZURhdGEuYXBwU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NlbmVEYXRhLmVsZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKHNjZW5lRGF0YS5lbGVtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEuY29sbGFib3JhdG9ycykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY29sbGFib3JhdG9yczogc2NlbmVEYXRhLmNvbGxhYm9yYXRvcnMgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIG9uU2NlbmVVcGRhdGVkID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoe30pO1xuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY3Vyc29yWCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjdXJzb3JZID0gZXZlbnQuY2xpZW50WTtcbiAgICB9LFxuICApO1xuXG4gIC8vIElucHV0IGhhbmRsaW5nXG5cbiAgcHJpdmF0ZSBvbktleURvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGV2ZW50OiBSZWFjdC5LZXlib2FyZEV2ZW50IHwgS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgLy8gbm9ybWFsaXplIGBldmVudC5rZXlgIHdoZW4gQ2Fwc0xvY2sgaXMgcHJlc3NlZCAjMjM3MlxuICAgICAgaWYgKFxuICAgICAgICBcIlByb3h5XCIgaW4gd2luZG93ICYmXG4gICAgICAgICgoIWV2ZW50LnNoaWZ0S2V5ICYmIC9eW0EtWl0kLy50ZXN0KGV2ZW50LmtleSkpIHx8XG4gICAgICAgICAgKGV2ZW50LnNoaWZ0S2V5ICYmIC9eW2Etel0kLy50ZXN0KGV2ZW50LmtleSkpKVxuICAgICAgKSB7XG4gICAgICAgIGV2ZW50ID0gbmV3IFByb3h5KGV2ZW50LCB7XG4gICAgICAgICAgZ2V0KGV2OiBhbnksIHByb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXZbcHJvcF07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgLy8gZml4IGZvciBQcm94aWVzIGhpamFja2luZyBgdGhpc2BcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb3AgPT09IFwia2V5XCJcbiAgICAgICAgICAgICAgPyAvLyBDYXBzTG9jayBpbnZlcnRzIGNhcGl0YWxpemF0aW9uIGJhc2VkIG9uIFNoaWZ0S2V5LCBzbyBpbnZlcnRcbiAgICAgICAgICAgICAgICAvLyBpdCBiYWNrXG4gICAgICAgICAgICAgICAgZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgICAgICAgICA/IGV2LmtleS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgOiBldi5rZXkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA6IHZhbHVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIChpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpICYmIGV2ZW50LmtleSAhPT0gS0VZUy5FU0NBUEUpIHx8XG4gICAgICAgIC8vIGNhc2U6IHVzaW5nIGFycm93cyB0byBtb3ZlIGJldHdlZW4gYnV0dG9uc1xuICAgICAgICAoaXNBcnJvd0tleShldmVudC5rZXkpICYmIGlzSW5wdXRMaWtlKGV2ZW50LnRhcmdldCkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlFVRVNUSU9OX01BUkspIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2hvd0hlbHBEaWFsb2c6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hY3Rpb25NYW5hZ2VyLmhhbmRsZUtleURvd24oZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmIHRoaXMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNCaW5kaW5nRW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5jb2RlID09PSBDT0RFUy5OSU5FKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xpYnJhcnlPcGVuOiAhdGhpcy5zdGF0ZS5pc0xpYnJhcnlPcGVuIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJvd0tleShldmVudC5rZXkpKSB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgICAgICh0aGlzLnN0YXRlLmdyaWRTaXplICYmXG4gICAgICAgICAgICAoZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgICAgICAgPyBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlRcbiAgICAgICAgICAgICAgOiB0aGlzLnN0YXRlLmdyaWRTaXplKSkgfHxcbiAgICAgICAgICAoZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgICAgID8gRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5UXG4gICAgICAgICAgICA6IEVMRU1FTlRfVFJBTlNMQVRFX0FNT1VOVCk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IHRoaXMuc2NlbmVcbiAgICAgICAgICAuZ2V0RWxlbWVudHMoKVxuICAgICAgICAgIC5maWx0ZXIoKGVsZW1lbnQpID0+IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2VsZW1lbnQuaWRdKTtcblxuICAgICAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXRZID0gMDtcblxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX0xFRlQpIHtcbiAgICAgICAgICBvZmZzZXRYID0gLXN0ZXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX1JJR0hUKSB7XG4gICAgICAgICAgb2Zmc2V0WCA9IHN0ZXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX1VQKSB7XG4gICAgICAgICAgb2Zmc2V0WSA9IC1zdGVwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19ET1dOKSB7XG4gICAgICAgICAgb2Zmc2V0WSA9IHN0ZXA7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICAgIHg6IGVsZW1lbnQueCArIG9mZnNldFgsXG4gICAgICAgICAgICB5OiBlbGVtZW50LnkgKyBvZmZzZXRZLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50LCB7XG4gICAgICAgICAgICBzaW11bHRhbmVvdXNseVVwZGF0ZWQ6IHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChzZWxlY3RlZEVsZW1lbnRzKTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCAhPT0gc2VsZWN0ZWRFbGVtZW50c1swXS5pZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBuZXcgTGluZWFyRWxlbWVudEVkaXRvcihcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAhaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHNbMF07XG4gICAgICAgICAgdGhpcy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgICAgIHNjZW5lWDogc2VsZWN0ZWRFbGVtZW50LnggKyBzZWxlY3RlZEVsZW1lbnQud2lkdGggLyAyLFxuICAgICAgICAgICAgc2NlbmVZOiBzZWxlY3RlZEVsZW1lbnQueSArIHNlbGVjdGVkRWxlbWVudC5oZWlnaHQgLyAyLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAhZXZlbnQuY3RybEtleSAmJlxuICAgICAgICAhZXZlbnQuYWx0S2V5ICYmXG4gICAgICAgICFldmVudC5tZXRhS2V5ICYmXG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50ID09PSBudWxsXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSBmaW5kU2hhcGVCeUtleShldmVudC5rZXkpO1xuICAgICAgICBpZiAoc2hhcGUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdFNoYXBlVG9vbChzaGFwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlEpIHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZUxvY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSAmJiBnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgaXNIb2xkaW5nU3BhY2UgPSB0cnVlO1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5HIHx8IGV2ZW50LmtleSA9PT0gS0VZUy5TKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgICAgICFzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgZXZlbnQua2V5ID09PSBLRVlTLkcgJiZcbiAgICAgICAgICAoaGFzQmFja2dyb3VuZCh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKSB8fFxuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiBoYXNCYWNrZ3JvdW5kKGVsZW1lbnQudHlwZSkpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgb3BlblBvcHVwOiBcImJhY2tncm91bmRDb2xvclBpY2tlclwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuUykge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuUG9wdXA6IFwic3Ryb2tlQ29sb3JQaWNrZXJcIiB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICk7XG5cbiAgcHJpdmF0ZSBvbktleVVwID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuU1BBQ0UpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmICF0aGlzLnN0YXRlLmlzQmluZGluZ0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAoaXNBcnJvd0tleShldmVudC5rZXkpKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgKTtcbiAgICAgIGlzQmluZGluZ0VuYWJsZWQodGhpcy5zdGF0ZSlcbiAgICAgICAgPyBiaW5kT3JVbmJpbmRTZWxlY3RlZEVsZW1lbnRzKHNlbGVjdGVkRWxlbWVudHMpXG4gICAgICAgIDogdW5iaW5kTGluZWFyRWxlbWVudHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc3VnZ2VzdGVkQmluZGluZ3M6IFtdIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJpdmF0ZSBzZWxlY3RTaGFwZVRvb2woZWxlbWVudFR5cGU6IEFwcFN0YXRlW1wiZWxlbWVudFR5cGVcIl0pIHtcbiAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgZWxlbWVudFR5cGUpO1xuICAgIH1cbiAgICBpZiAoaXNUb29sSWNvbihkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgdGhpcy5mb2N1c0NvbnRhaW5lcigpO1xuICAgIH1cbiAgICBpZiAoIWlzTGluZWFyRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc3VnZ2VzdGVkQmluZGluZ3M6IFtdIH0pO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBlbGVtZW50VHlwZSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uR2VzdHVyZVN0YXJ0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogR2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgfSk7XG4gICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gIH0pO1xuXG4gIHByaXZhdGUgb25HZXN0dXJlQ2hhbmdlID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogR2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIG9uR2VzdHVyZUNoYW5nZSBvbmx5IGhhcyB6b29tIGZhY3RvciBidXQgbm90IHRoZSBjZW50ZXIuXG4gICAgLy8gSWYgd2UncmUgb24gaVBhZCBvciBpUGhvbmUsIHRoZW4gd2UgcmVjb2duaXplIG11bHRpLXRvdWNoIGFuZCB3aWxsXG4gICAgLy8gem9vbSBpbiBhdCB0aGUgcmlnaHQgbG9jYXRpb24gb24gdGhlIHRvdWNoTW92ZSBoYW5kbGVyIGFscmVhZHkuXG4gICAgLy8gT24gTWFjYm9vaywgd2UgZG9uJ3QgaGF2ZSB0aG9zZSBldmVudHMgc28gd2lsbCB6b29tIGluIGF0IHRoZVxuICAgIC8vIGN1cnJlbnQgbG9jYXRpb24gaW5zdGVhZC5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFNjYWxlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGU7XG4gICAgaWYgKGluaXRpYWxTY2FsZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyB6b29tLCBvZmZzZXRMZWZ0LCBvZmZzZXRUb3AgfSkgPT4gKHtcbiAgICAgICAgem9vbTogZ2V0TmV3Wm9vbShcbiAgICAgICAgICBnZXROb3JtYWxpemVkWm9vbShpbml0aWFsU2NhbGUgKiBldmVudC5zY2FsZSksXG4gICAgICAgICAgem9vbSxcbiAgICAgICAgICB7IGxlZnQ6IG9mZnNldExlZnQsIHRvcDogb2Zmc2V0VG9wIH0sXG4gICAgICAgICAgeyB4OiBjdXJzb3JYLCB5OiBjdXJzb3JZIH0sXG4gICAgICAgICksXG4gICAgICB9KSk7XG4gICAgfVxuICB9KTtcblxuICBwcml2YXRlIG9uR2VzdHVyZUVuZCA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEdlc3R1cmVFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUucHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgfSk7XG4gICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSBudWxsO1xuICB9KTtcblxuICBwcml2YXRlIGhhbmRsZVRleHRXeXNpd3lnKFxuICAgIGVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgICB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIGlzRXhpc3RpbmdFbGVtZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gKHRleHQ6IHN0cmluZywgaXNEZWxldGVkID0gZmFsc2UpID0+IHtcbiAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoKF9lbGVtZW50KSA9PiB7XG4gICAgICAgICAgaWYgKF9lbGVtZW50LmlkID09PSBlbGVtZW50LmlkICYmIGlzVGV4dEVsZW1lbnQoX2VsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlVGV4dEVsZW1lbnQoX2VsZW1lbnQsIHtcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgaXNEZWxldGVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBfZWxlbWVudDtcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICB9O1xuXG4gICAgaWYgKGlzRXhpc3RpbmdFbGVtZW50ICYmIHRoaXMucHJvcHMub25CZWZvcmVUZXh0RWRpdCkge1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucHJvcHMub25CZWZvcmVUZXh0RWRpdChlbGVtZW50KTtcbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFtcbiAgICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcCgoX2VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChfZWxlbWVudC5pZCA9PT0gZWxlbWVudC5pZCAmJiBpc1RleHRFbGVtZW50KF9lbGVtZW50KSkge1xuICAgICAgICAgICAgICBlbGVtZW50ID0gdXBkYXRlVGV4dEVsZW1lbnQoX2VsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgIGlzRGVsZXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfZWxlbWVudDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGV4dFd5c2l3eWcoe1xuICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgIGNhbnZhczogdGhpcy5jYW52YXMsXG4gICAgICBnZXRWaWV3cG9ydENvb3JkczogKHgsIHkpID0+IHtcbiAgICAgICAgY29uc3QgeyB4OiB2aWV3cG9ydFgsIHk6IHZpZXdwb3J0WSB9ID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjZW5lWDogeCxcbiAgICAgICAgICAgIHNjZW5lWTogeSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgdmlld3BvcnRYIC0gdGhpcy5zdGF0ZS5vZmZzZXRMZWZ0LFxuICAgICAgICAgIHZpZXdwb3J0WSAtIHRoaXMuc3RhdGUub2Zmc2V0VG9wLFxuICAgICAgICBdO1xuICAgICAgfSxcbiAgICAgIG9uQ2hhbmdlOiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKHRleHQpID0+IHtcbiAgICAgICAgdXBkYXRlRWxlbWVudCh0ZXh0KTtcbiAgICAgICAgaWYgKGlzTm9uRGVsZXRlZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG9uU3VibWl0OiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKHsgdGV4dCwgdmlhS2V5Ym9hcmQgfSkgPT4ge1xuICAgICAgICBjb25zdCBpc0RlbGV0ZWQgPSAhdGV4dC50cmltKCk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQmVmb3JlVGV4dFN1Ym1pdCkge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRUZXh0ID0gdGhpcy5wcm9wcy5vbkJlZm9yZVRleHRTdWJtaXQoXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIGlzRGVsZXRlZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHRleHQgPSB1cGRhdGVkVGV4dCA/IHVwZGF0ZWRUZXh0IDogdGV4dDtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVFbGVtZW50KHRleHQsIGlzRGVsZXRlZCk7XG4gICAgICAgIC8vIHNlbGVjdCB0aGUgY3JlYXRlZCB0ZXh0IGVsZW1lbnQgb25seSBpZiBzdWJtaXR0aW5nIHZpYSBrZXlib2FyZFxuICAgICAgICAvLyAod2hlbiBzdWJtaXR0aW5nIHZpYSBjbGljayBpdCBzaG91bGQgYWN0IGFzIHNpZ25hbCB0byBkZXNlbGVjdClcbiAgICAgICAgaWYgKCFpc0RlbGV0ZWQgJiYgdmlhS2V5Ym9hcmQpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgW2VsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGVsZXRlZCkge1xuICAgICAgICAgIGZpeEJpbmRpbmdzQWZ0ZXJEZWxldGlvbih0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksIFtlbGVtZW50XSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0RlbGV0ZWQgfHwgaXNFeGlzdGluZ0VsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50TG9ja2VkKSB7XG4gICAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c0NvbnRhaW5lcigpO1xuICAgICAgfSksXG4gICAgICBlbGVtZW50LFxuICAgICAgZXhjYWxpZHJhd0NvbnRhaW5lcjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgfSk7XG4gICAgLy8gZGVzZWxlY3QgYWxsIG90aGVyIGVsZW1lbnRzIHdoZW4gaW5zZXJ0aW5nIHRleHRcbiAgICB0aGlzLmRlc2VsZWN0RWxlbWVudHMoKTtcblxuICAgIC8vIGRvIGFuIGluaXRpYWwgdXBkYXRlIHRvIHJlLWluaXRpYWxpemUgZWxlbWVudCBwb3NpdGlvbiBzaW5jZSB3ZSB3ZXJlXG4gICAgLy8gbW9kaWZ5aW5nIGVsZW1lbnQncyB4L3kgZm9yIHNha2Ugb2YgZWRpdG9yIChjYXNlOiBzeW5jaW5nIHRvIHJlbW90ZSlcbiAgICB1cGRhdGVFbGVtZW50KGVsZW1lbnQudGV4dCk7XG4gIH1cblxuICBwcml2YXRlIGRlc2VsZWN0RWxlbWVudHMoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGV4dEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICk6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PiB8IG51bGwge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHgsIHkpO1xuXG4gICAgaWYgKGVsZW1lbnQgJiYgaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiAhZWxlbWVudC5pc0RlbGV0ZWQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWxlbWVudEF0UG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICBvcHRzPzoge1xuICAgICAgLyoqIGlmIHRydWUsIHJldHVybnMgdGhlIGZpcnN0IHNlbGVjdGVkIGVsZW1lbnQgKHdpdGggaGlnaGVzdCB6LWluZGV4KVxuICAgICAgICBvZiBhbGwgaGl0IGVsZW1lbnRzICovXG4gICAgICBwcmVmZXJTZWxlY3RlZD86IGJvb2xlYW47XG4gICAgfSxcbiAgKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD4gfCBudWxsIHtcbiAgICBjb25zdCBhbGxIaXRFbGVtZW50cyA9IHRoaXMuZ2V0RWxlbWVudHNBdFBvc2l0aW9uKHgsIHkpO1xuICAgIGlmIChhbGxIaXRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICBpZiAob3B0cz8ucHJlZmVyU2VsZWN0ZWQpIHtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSBhbGxIaXRFbGVtZW50cy5sZW5ndGggLSAxOyBpbmRleCA+IC0xOyBpbmRleC0tKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2FsbEhpdEVsZW1lbnRzW2luZGV4XS5pZF0pIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxIaXRFbGVtZW50c1tpbmRleF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXggPVxuICAgICAgICBhbGxIaXRFbGVtZW50c1thbGxIaXRFbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgIC8vIElmIHdlJ3JlIGhpdHRpbmcgZWxlbWVudCB3aXRoIGhpZ2hlc3Qgei1pbmRleCBvbmx5IG9uIGl0cyBib3VuZGluZyBib3hcbiAgICAgIC8vIHdoaWxlIGFsc28gaGl0dGluZyBvdGhlciBlbGVtZW50IGZpZ3VyZSwgdGhlIGxhdHRlciBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgIHJldHVybiBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQoXG4gICAgICAgIGVsZW1lbnRXaXRoSGlnaGVzdFpJbmRleCxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgIClcbiAgICAgICAgPyBhbGxIaXRFbGVtZW50c1thbGxIaXRFbGVtZW50cy5sZW5ndGggLSAyXVxuICAgICAgICA6IGVsZW1lbnRXaXRoSGlnaGVzdFpJbmRleDtcbiAgICB9XG4gICAgaWYgKGFsbEhpdEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGFsbEhpdEVsZW1lbnRzWzBdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWxlbWVudHNBdFBvc2l0aW9uKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICk6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+W10ge1xuICAgIHJldHVybiBnZXRFbGVtZW50c0F0UG9zaXRpb24odGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCAoZWxlbWVudCkgPT5cbiAgICAgIGhpdFRlc3QoZWxlbWVudCwgdGhpcy5zdGF0ZSwgeCwgeSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRUZXh0RWRpdGluZyA9ICh7XG4gICAgc2NlbmVYLFxuICAgIHNjZW5lWSxcbiAgICBpbnNlcnRBdFBhcmVudENlbnRlciA9IHRydWUsXG4gIH06IHtcbiAgICAvKiogWCBwb3NpdGlvbiB0byBpbnNlcnQgdGV4dCBhdCAqL1xuICAgIHNjZW5lWDogbnVtYmVyO1xuICAgIC8qKiBZIHBvc2l0aW9uIHRvIGluc2VydCB0ZXh0IGF0ICovXG4gICAgc2NlbmVZOiBudW1iZXI7XG4gICAgLyoqIHdoZXRoZXIgdG8gYXR0ZW1wdCB0byBpbnNlcnQgYXQgZWxlbWVudCBjZW50ZXIgaWYgYXBwbGljYWJsZSAqL1xuICAgIGluc2VydEF0UGFyZW50Q2VudGVyPzogYm9vbGVhbjtcbiAgfSkgPT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nVGV4dEVsZW1lbnQgPSB0aGlzLmdldFRleHRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSk7XG5cbiAgICBjb25zdCBwYXJlbnRDZW50ZXJQb3NpdGlvbiA9XG4gICAgICBpbnNlcnRBdFBhcmVudENlbnRlciAmJlxuICAgICAgdGhpcy5nZXRUZXh0V3lzaXd5Z1NuYXBwZWRUb0NlbnRlclBvc2l0aW9uKFxuICAgICAgICBzY2VuZVgsXG4gICAgICAgIHNjZW5lWSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgdGhpcy5jYW52YXMsXG4gICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgKTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBleGlzdGluZ1RleHRFbGVtZW50XG4gICAgICA/IGV4aXN0aW5nVGV4dEVsZW1lbnRcbiAgICAgIDogbmV3VGV4dEVsZW1lbnQoe1xuICAgICAgICAgIHg6IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IHBhcmVudENlbnRlclBvc2l0aW9uLmVsZW1lbnRDZW50ZXJYXG4gICAgICAgICAgICA6IHNjZW5lWCxcbiAgICAgICAgICB5OiBwYXJlbnRDZW50ZXJQb3NpdGlvblxuICAgICAgICAgICAgPyBwYXJlbnRDZW50ZXJQb3NpdGlvbi5lbGVtZW50Q2VudGVyWVxuICAgICAgICAgICAgOiBzY2VuZVksXG4gICAgICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgICAgICB0ZXh0QWxpZ246IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IFwiY2VudGVyXCJcbiAgICAgICAgICAgIDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBwYXJlbnRDZW50ZXJQb3NpdGlvblxuICAgICAgICAgICAgPyBcIm1pZGRsZVwiXG4gICAgICAgICAgICA6IERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gICAgICAgIH0pO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IGVkaXRpbmdFbGVtZW50OiBlbGVtZW50IH0pO1xuXG4gICAgaWYgKGV4aXN0aW5nVGV4dEVsZW1lbnQpIHtcbiAgICAgIC8vIGlmIHRleHQgZWxlbWVudCBpcyBubyBsb25nZXIgY2VudGVyZWQgdG8gYSBjb250YWluZXIsIHJlc2V0XG4gICAgICAvLyB2ZXJ0aWNhbEFsaWduIHRvIGRlZmF1bHQgYmVjYXVzZSBpdCdzIGN1cnJlbnRseSBpbnRlcm5hbC1vbmx5XG4gICAgICBpZiAoIXBhcmVudENlbnRlclBvc2l0aW9uIHx8IGVsZW1lbnQudGV4dEFsaWduICE9PSBcImNlbnRlclwiKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwgeyB2ZXJ0aWNhbEFsaWduOiBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICBdKTtcblxuICAgICAgLy8gY2FzZTogY3JlYXRpbmcgbmV3IHRleHQgbm90IGNlbnRlcmVkIHRvIHBhcmVudCBlbGVtZW5lbnQg4oaSIG9mZnNldCBZXG4gICAgICAvLyBzbyB0aGF0IHRoZSB0ZXh0IGlzIGNlbnRlcmVkIHRvIGN1cnNvciBwb3NpdGlvblxuICAgICAgaWYgKCFwYXJlbnRDZW50ZXJQb3NpdGlvbikge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICB5OiBlbGVtZW50LnkgLSBlbGVtZW50LmJhc2VsaW5lIC8gMixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICB9KTtcblxuICAgIHRoaXMuaGFuZGxlVGV4dFd5c2l3eWcoZWxlbWVudCwge1xuICAgICAgaXNFeGlzdGluZ0VsZW1lbnQ6ICEhZXhpc3RpbmdUZXh0RWxlbWVudCxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc0RvdWJsZUNsaWNrID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKSA9PiB7XG4gICAgLy8gY2FzZTogZG91YmxlLWNsaWNraW5nIHdpdGggYXJyb3cvbGluZSB0b29sIHNlbGVjdGVkIHdvdWxkIGJvdGggY3JlYXRlXG4gICAgLy8gdGV4dCBhbmQgZW50ZXIgbXVsdGlFbGVtZW50IG1vZGVcbiAgICBpZiAodGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gd2Ugc2hvdWxkIG9ubHkgYmUgYWJsZSB0byBkb3VibGUgY2xpY2sgd2hlbiBtb2RlIGlzIHNlbGVjdGlvblxuICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8XG4gICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkICE9PSBzZWxlY3RlZEVsZW1lbnRzWzBdLmlkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDogbmV3IExpbmVhckVsZW1lbnRFZGl0b3IoXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG5cbiAgICBjb25zdCB7IHg6IHNjZW5lWCwgeTogc2NlbmVZIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICBldmVudCxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBJZHMgPSBnZXRTZWxlY3RlZEdyb3VwSWRzKHRoaXMuc3RhdGUpO1xuXG4gICAgaWYgKHNlbGVjdGVkR3JvdXBJZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEdyb3VwSWQgPVxuICAgICAgICBoaXRFbGVtZW50ICYmXG4gICAgICAgIGdldFNlbGVjdGVkR3JvdXBJZEZvckVsZW1lbnQoaGl0RWxlbWVudCwgdGhpcy5zdGF0ZS5zZWxlY3RlZEdyb3VwSWRzKTtcblxuICAgICAgaWYgKHNlbGVjdGVkR3JvdXBJZCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+XG4gICAgICAgICAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogc2VsZWN0ZWRHcm91cElkLFxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2hpdEVsZW1lbnQhLmlkXTogdHJ1ZSB9LFxuICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICBpZiAoIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmICF0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgc2NlbmVYLFxuICAgICAgICBzY2VuZVksXG4gICAgICAgIGluc2VydEF0UGFyZW50Q2VudGVyOiAhZXZlbnQuYWx0S2V5LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzUG9pbnRlck1vdmUgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgdGhpcy5zdGF0ZS5jdXJzb3JCdXR0b24pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcbiAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2V0KGV2ZW50LnBvaW50ZXJJZCwge1xuICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFNjYWxlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGU7XG4gICAgaWYgKFxuICAgICAgZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyICYmXG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgJiZcbiAgICAgIGluaXRpYWxTY2FsZSAmJlxuICAgICAgZ2VzdHVyZS5pbml0aWFsRGlzdGFuY2VcbiAgICApIHtcbiAgICAgIGNvbnN0IGNlbnRlciA9IGdldENlbnRlcihnZXN0dXJlLnBvaW50ZXJzKTtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGNlbnRlci54IC0gZ2VzdHVyZS5sYXN0Q2VudGVyLng7XG4gICAgICBjb25zdCBkZWx0YVkgPSBjZW50ZXIueSAtIGdlc3R1cmUubGFzdENlbnRlci55O1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gY2VudGVyO1xuXG4gICAgICBjb25zdCBkaXN0YW5jZSA9IGdldERpc3RhbmNlKEFycmF5LmZyb20oZ2VzdHVyZS5wb2ludGVycy52YWx1ZXMoKSkpO1xuICAgICAgY29uc3Qgc2NhbGVGYWN0b3IgPSBkaXN0YW5jZSAvIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIHNjcm9sbFgsIHNjcm9sbFksIG9mZnNldExlZnQsIG9mZnNldFRvcCB9KSA9PiAoe1xuICAgICAgICBzY3JvbGxYOiBzY3JvbGxYICsgZGVsdGFYIC8gem9vbS52YWx1ZSxcbiAgICAgICAgc2Nyb2xsWTogc2Nyb2xsWSArIGRlbHRhWSAvIHpvb20udmFsdWUsXG4gICAgICAgIHpvb206IGdldE5ld1pvb20oXG4gICAgICAgICAgZ2V0Tm9ybWFsaXplZFpvb20oaW5pdGlhbFNjYWxlICogc2NhbGVGYWN0b3IpLFxuICAgICAgICAgIHpvb20sXG4gICAgICAgICAgeyBsZWZ0OiBvZmZzZXRMZWZ0LCB0b3A6IG9mZnNldFRvcCB9LFxuICAgICAgICAgIGNlbnRlcixcbiAgICAgICAgKSxcbiAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0cnVlLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoaXNIb2xkaW5nU3BhY2UgfHwgaXNQYW5uaW5nIHx8IGlzRHJhZ2dpbmdTY3JvbGxCYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycyA9IGlzT3ZlclNjcm9sbEJhcnMoXG4gICAgICBjdXJyZW50U2Nyb2xsQmFycyxcbiAgICAgIGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICBldmVudC5jbGllbnRZIC0gdGhpcy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgKTtcbiAgICBjb25zdCBpc092ZXJTY3JvbGxCYXIgPSBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycy5pc092ZXJFaXRoZXI7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCAmJiAhdGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNjZW5lUG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgdGhpcy5zdGF0ZSk7XG4gICAgY29uc3QgeyB4OiBzY2VuZVBvaW50ZXJYLCB5OiBzY2VuZVBvaW50ZXJZIH0gPSBzY2VuZVBvaW50ZXI7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmXG4gICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5pc0RyYWdnaW5nXG4gICAgKSB7XG4gICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlck1vdmUoXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBzY2VuZVBvaW50ZXJYLFxuICAgICAgICBzY2VuZVBvaW50ZXJZLFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgKTtcbiAgICAgIGlmIChlZGl0aW5nTGluZWFyRWxlbWVudCAhPT0gdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZWRpdGluZ0xpbmVhckVsZW1lbnQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQubGFzdFVuY29tbWl0dGVkUG9pbnQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNCaW5kaW5nRWxlbWVudFR5cGUodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSkpIHtcbiAgICAgIC8vIEhvdmVyaW5nIHdpdGggYSBzZWxlY3RlZCB0b29sIG9yIGNyZWF0aW5nIG5ldyBsaW5lYXIgZWxlbWVudCB2aWEgY2xpY2tcbiAgICAgIC8vIGFuZCBwb2ludFxuICAgICAgY29uc3QgeyBkcmFnZ2luZ0VsZW1lbnQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAoaXNCaW5kaW5nRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckxpbmVhckVsZW1lbnRBdEN1cnNvcihcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgXCJlbmRcIixcbiAgICAgICAgICBzY2VuZVBvaW50ZXIsXG4gICAgICAgICAgdGhpcy5zdGF0ZS5zdGFydEJvdW5kRWxlbWVudCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yKHNjZW5lUG9pbnRlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IHsgeDogcngsIHk6IHJ5IH0gPSBtdWx0aUVsZW1lbnQ7XG5cbiAgICAgIGNvbnN0IHsgcG9pbnRzLCBsYXN0Q29tbWl0dGVkUG9pbnQgfSA9IG11bHRpRWxlbWVudDtcbiAgICAgIGNvbnN0IGxhc3RQb2ludCA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG5cbiAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKTtcblxuICAgICAgaWYgKGxhc3RQb2ludCA9PT0gbGFzdENvbW1pdHRlZFBvaW50KSB7XG4gICAgICAgIC8vIGlmIHdlIGhhdmVuJ3QgeWV0IGNyZWF0ZWQgYSB0ZW1wIHBvaW50IGFuZCB3ZSdyZSBiZXlvbmQgY29tbWl0LXpvbmVcbiAgICAgICAgLy8gdGhyZXNob2xkLCBhZGQgYSBwb2ludFxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGlzdGFuY2UyZChcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlclggLSByeCxcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlclkgLSByeSxcbiAgICAgICAgICAgIGxhc3RQb2ludFswXSxcbiAgICAgICAgICAgIGxhc3RQb2ludFsxXSxcbiAgICAgICAgICApID49IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICAgKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW3NjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5XV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgICAgICAvLyBpbiB0aGlzIGJyYW5jaCwgd2UncmUgaW5zaWRlIHRoZSBjb21taXQgem9uZSwgYW5kIG5vIHVuY29tbWl0dGVkXG4gICAgICAgICAgLy8gcG9pbnQgZXhpc3RzLiBUaHVzIGRvIG5vdGhpbmcgKGRvbid0IGFkZC9yZW1vdmUgcG9pbnRzKS5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcG9pbnRzLmxlbmd0aCA+IDIgJiZcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50ICYmXG4gICAgICAgIGRpc3RhbmNlMmQoXG4gICAgICAgICAgc2NlbmVQb2ludGVyWCAtIHJ4LFxuICAgICAgICAgIHNjZW5lUG9pbnRlclkgLSByeSxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnRbMF0sXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzFdLFxuICAgICAgICApIDwgTElORV9DT05GSVJNX1RIUkVTSE9MRFxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBwb2ludHMuc2xpY2UoMCwgLTEpLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1BhdGhBTG9vcChwb2ludHMsIHRoaXMuc3RhdGUuem9vbS52YWx1ZSkpIHtcbiAgICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVwZGF0ZSBsYXN0IHVuY29tbWl0dGVkIHBvaW50XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBbXG4gICAgICAgICAgICAuLi5wb2ludHMuc2xpY2UoMCwgLTEpLFxuICAgICAgICAgICAgW3NjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5XSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0Rlc2VsZWN0ZWRCdXR0b24gPSBCb29sZWFuKGV2ZW50LmJ1dHRvbnMpO1xuICAgIGlmIChcbiAgICAgIGhhc0Rlc2VsZWN0ZWRCdXR0b24gfHxcbiAgICAgICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiICYmXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwidGV4dFwiKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIHRoaXMuc3RhdGUpO1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAhaXNPdmVyU2Nyb2xsQmFyICYmXG4gICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudFxuICAgICkge1xuICAgICAgY29uc3QgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgc2NlbmVQb2ludGVyWCxcbiAgICAgICAgc2NlbmVQb2ludGVyWSxcbiAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAmJlxuICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZVxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxICYmICFpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhcbiAgICAgICAgZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpLFxuICAgICAgICBzY2VuZVBvaW50ZXJYLFxuICAgICAgICBzY2VuZVBvaW50ZXJZLFxuICAgICAgICB0aGlzLnN0YXRlLnpvb20sXG4gICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpdEVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICApO1xuICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInRleHRcIikge1xuICAgICAgc2V0Q3Vyc29yKFxuICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgaXNUZXh0RWxlbWVudChoaXRFbGVtZW50KSA/IENVUlNPUl9UWVBFLlRFWFQgOiBDVVJTT1JfVFlQRS5DUk9TU0hBSVIsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgfSBlbHNlIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIGlmIHVzaW5nIGNtZC9jdHJsLCB3ZSdyZSBub3QgZHJhZ2dpbmdcbiAgICAgICFldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJlxuICAgICAgKGhpdEVsZW1lbnQgfHxcbiAgICAgICAgdGhpcy5pc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICBzY2VuZVBvaW50ZXIsXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgKSlcbiAgICApIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIHNldCB0b3VjaCBtb3ZpbmcgZm9yIG1vYmlsZSBjb250ZXh0IG1lbnVcbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaE1vdmUgPSAoZXZlbnQ6IFJlYWN0LlRvdWNoRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+KSA9PiB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc1BvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICAvLyByZW1vdmUgYW55IGFjdGl2ZSBzZWxlY3Rpb24gd2hlbiB3ZSBzdGFydCB0byBpbnRlcmFjdCB3aXRoIGNhbnZhc1xuICAgIC8vIChtYWlubHksIHdlIGNhcmUgYWJvdXQgcmVtb3Zpbmcgc2VsZWN0aW9uIG91dHNpZGUgdGhlIGNvbXBvbmVudCB3aGljaFxuICAgIC8vICB3b3VsZCBwcmV2ZW50IG91ciBjb3B5IGhhbmRsaW5nIG90aGVyd2lzZSlcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoc2VsZWN0aW9uPy5hbmNob3JOb2RlKSB7XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5tYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyhldmVudCk7XG4gICAgdGhpcy5tYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoZXZlbnQpO1xuXG4gICAgaWYgKGlzUGFubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbGFzdFBvaW50ZXJEb3duV2l0aDogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICBjdXJzb3JCdXR0b246IFwiZG93blwiLFxuICAgIH0pO1xuICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJkb3duXCIpO1xuXG4gICAgaWYgKHRoaXMuaGFuZGxlQ2FudmFzUGFuVXNpbmdXaGVlbE9yU3BhY2VEcmFnKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG9ubHkgaGFuZGxlIGxlZnQgbW91c2UgYnV0dG9uIG9yIHRvdWNoXG4gICAgaWYgKFxuICAgICAgZXZlbnQuYnV0dG9uICE9PSBQT0lOVEVSX0JVVFRPTi5NQUlOICYmXG4gICAgICBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLlRPVUNIXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVHZXN0dXJlT25Qb2ludGVyRG93bihldmVudCk7XG5cbiAgICAvLyBkb24ndCBzZWxlY3Qgd2hpbGUgcGFubmluZ1xuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPiAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhdGUgZm9yIHRoZSBkdXJhdGlvbiBvZiBhIHBvaW50ZXIgaW50ZXJhY3Rpb24sIHdoaWNoIHN0YXJ0cyB3aXRoIGFcbiAgICAvLyBwb2ludGVyRG93biBldmVudCwgZW5kcyB3aXRoIGEgcG9pbnRlclVwIGV2ZW50IChvciBhbm90aGVyIHBvaW50ZXJEb3duKVxuICAgIGNvbnN0IHBvaW50ZXJEb3duU3RhdGUgPSB0aGlzLmluaXRpYWxQb2ludGVyRG93blN0YXRlKGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmhhbmRsZURyYWdnaW5nU2Nyb2xsQmFyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUoZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuaGFuZGxlU2VsZWN0aW9uT25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlVGV4dE9uUG9pbnRlckRvd24oZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImFycm93XCIgfHxcbiAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwibGluZVwiXG4gICAgKSB7XG4gICAgICB0aGlzLmhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duKFxuICAgICAgICBldmVudCxcbiAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlRnJlZURyYXdFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZUdlbmVyaWNFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IHRoaXMub25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9IHRoaXMub25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3Qgb25LZXlEb3duID0gdGhpcy5vbktleURvd25Gcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIGNvbnN0IG9uS2V5VXAgPSB0aGlzLm9uS2V5VXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgbGFzdFBvaW50ZXJVcCA9IG9uUG9pbnRlclVwO1xuXG4gICAgaWYgKCF0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIG9uS2V5RG93bik7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgb25LZXlVcCk7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSA9IG9uUG9pbnRlck1vdmU7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uVXAgPSBvblBvaW50ZXJVcDtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlVcCA9IG9uS2V5VXA7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5RG93biA9IG9uS2V5RG93bjtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKTogdm9pZCA9PiB7XG4gICAgLy8gZGVhbCB3aXRoIG9wZW5pbmcgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIikge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG5cbiAgICAgIGlmICh0b3VjaFRpbWVvdXQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbHJlYWR5IGEgdG91Y2hUaW1lb3V0LCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUncyBhbm90aGVyXG4gICAgICAgIC8vIHRvdWNoIGRvd24gYW5kIHdlIGFyZSBkb2luZyBhbm90aGVyIHRvdWNoLCBzbyB3ZSBzaG91bGRuJ3Qgb3BlbiB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51LlxuICAgICAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3BlbiB0aGUgY29udGV4dCBtZW51IHdpdGggdGhlIGZpcnN0IHRvdWNoJ3MgY2xpZW50WCBhbmQgY2xpZW50WVxuICAgICAgICAvLyBpZiB0aGUgdG91Y2ggaXMgbm90IG1vdmluZ1xuICAgICAgICB0b3VjaFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICAgICAgICBpZiAoIWludmFsaWRhdGVDb250ZXh0TWVudSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBUT1VDSF9DVFhfTUVOVV9USU1FT1VUKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IHZvaWQge1xuICAgIGlmIChsYXN0UG9pbnRlclVwICE9PSBudWxsKSB7XG4gICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBzb21ldGltZXMgd2UgZG9uJ3QgZ2V0IGEgcG9pbnRlcnVwIGFmdGVyIGEgcG9pbnRlcmRvd24sXG4gICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbnRleHR1YWwgbWVudSBvciBhbGVydCBpcyB0cmlnZ2VyZWQuIEluIG9yZGVyIHRvIGF2b2lkXG4gICAgICAvLyBiZWluZyBpbiBhIHdlaXJkIHN0YXRlLCB3ZSBjbGVhbiB1cCBvbiB0aGUgbmV4dCBwb2ludGVyZG93blxuICAgICAgbGFzdFBvaW50ZXJVcChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIHBhbm5pbmdcbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNQYW5Vc2luZ1doZWVsT3JTcGFjZURyYWcgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMCAmJlxuICAgICAgICAoZXZlbnQuYnV0dG9uID09PSBQT0lOVEVSX0JVVFRPTi5XSEVFTCB8fFxuICAgICAgICAgIChldmVudC5idXR0b24gPT09IFBPSU5URVJfQlVUVE9OLk1BSU4gJiYgaXNIb2xkaW5nU3BhY2UpIHx8XG4gICAgICAgICAgdGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlzUGFubmluZyA9IHRydWU7XG5cbiAgICBsZXQgbmV4dFBhc3RlUHJldmVudGVkID0gZmFsc2U7XG4gICAgY29uc3QgaXNMaW51eCA9IC9MaW51eC8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtKTtcblxuICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQkJJTkcpO1xuICAgIGxldCB7IGNsaWVudFg6IGxhc3RYLCBjbGllbnRZOiBsYXN0WSB9ID0gZXZlbnQ7XG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZGVsdGFYID0gbGFzdFggLSBldmVudC5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gbGFzdFkgLSBldmVudC5jbGllbnRZO1xuICAgICAgbGFzdFggPSBldmVudC5jbGllbnRYO1xuICAgICAgbGFzdFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvKlxuICAgICAgICogUHJldmVudCBwYXN0ZSBldmVudCBpZiB3ZSBtb3ZlIHdoaWxlIG1pZGRsZSBjbGlja2luZyBvbiBMaW51eC5cbiAgICAgICAqIFNlZSBpc3N1ZSAjMTM4My5cbiAgICAgICAqL1xuICAgICAgaWYgKFxuICAgICAgICBpc0xpbnV4ICYmXG4gICAgICAgICFuZXh0UGFzdGVQcmV2ZW50ZWQgJiZcbiAgICAgICAgKE1hdGguYWJzKGRlbHRhWCkgPiAxIHx8IE1hdGguYWJzKGRlbHRhWSkgPiAxKVxuICAgICAgKSB7XG4gICAgICAgIG5leHRQYXN0ZVByZXZlbnRlZCA9IHRydWU7XG5cbiAgICAgICAgLyogUHJldmVudCB0aGUgbmV4dCBwYXN0ZSBldmVudCAqL1xuICAgICAgICBjb25zdCBwcmV2ZW50TmV4dFBhc3RlID0gKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLypcbiAgICAgICAgICogUmVlbmFibGUgbmV4dCBwYXN0ZSBpbiBjYXNlIG9mIGRpc2FibGVkIG1pZGRsZSBjbGljayBwYXN0ZSBmb3JcbiAgICAgICAgICogYW55IHJlYXNvbjpcbiAgICAgICAgICogLSByaWd0aCBjbGljayBwYXN0ZVxuICAgICAgICAgKiAtIGVtcHR5IGNsaXBib2FyZFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZW5hYmxlTmV4dFBhc3RlID0gKCkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIGVuYWJsZU5leHRQYXN0ZSk7XG4gICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBlbmFibGVOZXh0UGFzdGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsWDogdGhpcy5zdGF0ZS5zY3JvbGxYIC0gZGVsdGFYIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFkgLSBkZWx0YVkgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCB0ZWFyZG93biA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICAgIChsYXN0UG9pbnRlclVwID0gKCkgPT4ge1xuICAgICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcbiAgICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICghaXNIb2xkaW5nU3BhY2UpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIFwidXBcIik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQkxVUiwgdGVhcmRvd24pO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0ZWFyZG93bik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZUdlc3R1cmVPblBvaW50ZXJEb3duKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiB2b2lkIHtcbiAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgIH0pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgICAgICBBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxQb2ludGVyRG93blN0YXRlKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiBQb2ludGVyRG93blN0YXRlIHtcbiAgICBjb25zdCBvcmlnaW4gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW4sXG4gICAgICB3aXRoQ21kT3JDdHJsOiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSxcbiAgICAgIG9yaWdpbkluR3JpZDogdHVwbGVUb0Nvb3JzKFxuICAgICAgICBnZXRHcmlkUG9pbnQob3JpZ2luLngsIG9yaWdpbi55LCB0aGlzLnN0YXRlLmdyaWRTaXplKSxcbiAgICAgICksXG4gICAgICBzY3JvbGxiYXJzOiBpc092ZXJTY3JvbGxCYXJzKFxuICAgICAgICBjdXJyZW50U2Nyb2xsQmFycyxcbiAgICAgICAgZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgICAgZXZlbnQuY2xpZW50WSAtIHRoaXMuc3RhdGUub2Zmc2V0VG9wLFxuICAgICAgKSxcbiAgICAgIC8vIHdlIG5lZWQgdG8gZHVwbGljYXRlIGJlY2F1c2Ugd2UnbGwgYmUgdXBkYXRpbmcgdGhpcyBzdGF0ZVxuICAgICAgbGFzdENvb3JkczogeyAuLi5vcmlnaW4gfSxcbiAgICAgIG9yaWdpbmFsRWxlbWVudHM6IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKS5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICAgICAgICBhY2Muc2V0KGVsZW1lbnQuaWQsIGRlZXBDb3B5RWxlbWVudChlbGVtZW50KSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBuZXcgTWFwKCkgYXMgUG9pbnRlckRvd25TdGF0ZVtcIm9yaWdpbmFsRWxlbWVudHNcIl0pLFxuICAgICAgcmVzaXplOiB7XG4gICAgICAgIGhhbmRsZVR5cGU6IGZhbHNlLFxuICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgYXJyb3dEaXJlY3Rpb246IFwib3JpZ2luXCIsXG4gICAgICAgIGNlbnRlcjogeyB4OiAobWF4WCArIG1pblgpIC8gMiwgeTogKG1heFkgKyBtaW5ZKSAvIDIgfSxcbiAgICAgIH0sXG4gICAgICBoaXQ6IHtcbiAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgYWxsSGl0RWxlbWVudHM6IFtdLFxuICAgICAgICB3YXNBZGRlZFRvU2VsZWN0aW9uOiBmYWxzZSxcbiAgICAgICAgaGFzQmVlbkR1cGxpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBoYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50czogdGhpcy5pc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICBkcmFnOiB7XG4gICAgICAgIGhhc09jY3VycmVkOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgICAgIG9uTW92ZTogbnVsbCxcbiAgICAgICAgb25VcDogbnVsbCxcbiAgICAgICAgb25LZXlVcDogbnVsbCxcbiAgICAgICAgb25LZXlEb3duOiBudWxsLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGRyYWdnaW5nIGEgc2Nyb2xsYmFyXG4gIHByaXZhdGUgaGFuZGxlRHJhZ2dpbmdTY3JvbGxCYXIoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIShwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVyRWl0aGVyICYmICF0aGlzLnN0YXRlLm11bHRpRWxlbWVudClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IHRydWU7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBldmVudC5jbGllbnRYO1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKCkgPT4ge1xuICAgICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IGZhbHNlO1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJ1cFwiKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgfSk7XG5cbiAgICBsYXN0UG9pbnRlclVwID0gb25Qb2ludGVyVXA7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBwb2ludGVyIGV2ZW50IGhhcyBiZWVuIGNvbXBsZXRlbHkgaGFuZGxlZFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTZWxlY3Rpb25PblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCB0aGlzLnN0YXRlKTtcbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRFbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHJlc2l6aW5nRWxlbWVudDogZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLmVsZW1lbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9XG4gICAgICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9IGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzKFxuICAgICAgICAgIGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKSxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUpIHtcbiAgICAgICAgc2V0Q3Vyc29yKFxuICAgICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICAgIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCh7XG4gICAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlOiBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5pc1Jlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIGdldFJlc2l6ZU9mZnNldFhZKFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSxcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkgJiZcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLnBvaW50cy5sZW5ndGggPT09IDJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24gPSBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbihcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyRG93bihcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIChhcHBTdGF0ZSkgPT4gdGhpcy5zZXRTdGF0ZShhcHBTdGF0ZSksXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnksXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChyZXQuaGl0RWxlbWVudCkge1xuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA9IHJldC5oaXRFbGVtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmV0LmRpZEFkZFBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoaXRFbGVtZW50IG1heSBhbHJlYWR5IGJlIHNldCBhYm92ZSwgc28gY2hlY2sgZmlyc3RcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA9XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA/P1xuICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudEF0UG9zaXRpb24oXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApO1xuXG4gICAgICAgIC8vIEZvciBvdmVybGFwcGVkIGVsZW1lbnRzIG9uZSBwb3NpdGlvbiBtYXkgaGl0XG4gICAgICAgIC8vIG11bHRpcGxlIGVsZW1lbnRzXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24oXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuICAgICAgICBjb25zdCBzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKFxuICAgICAgICAgIChlbGVtZW50KSA9PiB0aGlzLmlzQVNlbGVjdGVkRWxlbWVudChlbGVtZW50KSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChoaXRFbGVtZW50ID09PSBudWxsIHx8ICFzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQpICYmXG4gICAgICAgICAgIWV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBjbGljayBvbiBzb21ldGhpbmdcbiAgICAgICAgaWYgKGhpdEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIG9uIENNRC9DVFJMLCBkcmlsbCBkb3duIHRvIGhpdCBlbGVtZW50IHJlZ2FyZGxlc3Mgb2YgZ3JvdXBzIGV0Yy5cbiAgICAgICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIC4uLmVkaXRHcm91cEZvclNlbGVjdGVkRWxlbWVudChwcmV2U3RhdGUsIGhpdEVsZW1lbnQpLFxuICAgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAvLyBtYXJrIGFzIG5vdCBjb21wbGV0ZWx5IGhhbmRsZWQgc28gYXMgdG8gYWxsb3cgZHJhZ2dpbmcgZXRjLlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRlc2VsZWN0IGlmIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICAgICAgICAvLyBpZiBzaGlmdCBpcyBub3QgY2xpY2tlZCwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZVxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQgd2lsbCB0cmlnZ2VyIHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50XG4gICAgICAgICAgLy8gc3RhdGUgb2YgdGhlIGJveFxuICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZyBhIGdyb3VwLCBleGl0aW5nIGVkaXRpbmcgbW9kZSBhbmQgZGVzZWxlY3QgdGhlIGdyb3VwLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkICYmXG4gICAgICAgICAgICAgICFpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHRoaXMuc3RhdGUuZWRpdGluZ0dyb3VwSWQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBoaXQgZWxlbWVudCB0byBzZWxlY3Rpb24uIEF0IHRoaXMgcG9pbnQgaWYgd2UncmUgbm90IGhvbGRpbmdcbiAgICAgICAgICAgIC8vIFNISUZUIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkZXNlbGVjdGVkIGFib3ZlXG4gICAgICAgICAgICAvLyAobWFrZSBzdXJlIHlvdSB1c2Ugc2V0U3RhdGUgdXBkYXRlciB0byB1c2UgbGF0ZXN0IHN0YXRlKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHByaXZhdGUgaXNBU2VsZWN0ZWRFbGVtZW50KGhpdEVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBoaXRFbGVtZW50ICE9IG51bGwgJiYgdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF07XG4gIH1cblxuICBwcml2YXRlIGlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKFxuICAgIHBvaW50OiBSZWFkb25seTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+LFxuICAgIHNlbGVjdGVkRWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBIb3cgbWFueSBwaXhlbHMgb2ZmIHRoZSBzaGFwZSBib3VuZGFyeSB3ZSBzdGlsbCBjb25zaWRlciBhIGhpdFxuICAgIGNvbnN0IHRocmVzaG9sZCA9IDEwIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIHBvaW50LnggPiB4MSAtIHRocmVzaG9sZCAmJlxuICAgICAgcG9pbnQueCA8IHgyICsgdGhyZXNob2xkICYmXG4gICAgICBwb2ludC55ID4geTEgLSB0aHJlc2hvbGQgJiZcbiAgICAgIHBvaW50LnkgPCB5MiArIHRocmVzaG9sZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRleHRPblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIGlmIHdlJ3JlIGN1cnJlbnRseSBzdGlsbCBlZGl0aW5nIHRleHQsIGNsaWNraW5nIG91dHNpZGVcbiAgICAvLyBzaG91bGQgb25seSBmaW5hbGl6ZSBpdCwgbm90IGNyZWF0ZSBhbm90aGVyIChpcnJlc3BlY3RpdmVcbiAgICAvLyBvZiBzdGF0ZS5lbGVtZW50TG9ja2VkKVxuICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50Py50eXBlID09PSBcInRleHRcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRUZXh0RWRpdGluZyh7XG4gICAgICBzY2VuZVg6IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICBzY2VuZVk6IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleSxcbiAgICB9KTtcblxuICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICBpZiAoIXRoaXMuc3RhdGUuZWxlbWVudExvY2tlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlRnJlZURyYXdFbGVtZW50T25Qb2ludGVyRG93biA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBlbGVtZW50VHlwZTogRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKSA9PiB7XG4gICAgLy8gQmVnaW4gYSBtYXJrIGNhcHR1cmUuIFRoaXMgZG9lcyBub3QgaGF2ZSB0byB1cGRhdGUgc3RhdGUgeWV0LlxuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICBudWxsLFxuICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gbmV3RnJlZURyYXdFbGVtZW50KHtcbiAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgeDogZ3JpZFgsXG4gICAgICB5OiBncmlkWSxcbiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgc2ltdWxhdGVQcmVzc3VyZTogZXZlbnQucHJlc3N1cmUgPT09IDAuNSxcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICBbZWxlbWVudC5pZF06IGZhbHNlLFxuICAgICAgfSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBwcmVzc3VyZXMgPSBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmVcbiAgICAgID8gZWxlbWVudC5wcmVzc3VyZXNcbiAgICAgIDogWy4uLmVsZW1lbnQucHJlc3N1cmVzLCBldmVudC5wcmVzc3VyZV07XG5cbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgIHBvaW50czogW1swLCAwXV0sXG4gICAgICBwcmVzc3VyZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBib3VuZEVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgIHRoaXMuc2NlbmUsXG4gICAgKTtcbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgZWxlbWVudCxcbiAgICBdKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRyYWdnaW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IGJvdW5kRWxlbWVudCxcbiAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIGVsZW1lbnRUeXBlOiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgLy8gZmluYWxpemUgaWYgY29tcGxldGluZyBhIGxvb3BcbiAgICAgIGlmIChcbiAgICAgICAgbXVsdGlFbGVtZW50LnR5cGUgPT09IFwibGluZVwiICYmXG4gICAgICAgIGlzUGF0aEFMb29wKG11bHRpRWxlbWVudC5wb2ludHMsIHRoaXMuc3RhdGUuem9vbS52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDpcbiAgICAgICAgICAgIG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHg6IHJ4LCB5OiByeSwgbGFzdENvbW1pdHRlZFBvaW50IH0gPSBtdWx0aUVsZW1lbnQ7XG5cbiAgICAgIC8vIGNsaWNraW5nIGluc2lkZSBjb21taXQgem9uZSDihpIgZmluYWxpemUgYXJyb3dcbiAgICAgIGlmIChcbiAgICAgICAgbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggPiAxICYmXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludCAmJlxuICAgICAgICBkaXN0YW5jZTJkKFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSByeCxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcnksXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzBdLFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFsxXSxcbiAgICAgICAgKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICkge1xuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgIFttdWx0aUVsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgICAgLy8gY2xpY2tpbmcgb3V0c2lkZSBjb21taXQgem9uZSDihpIgdXBkYXRlIHJlZmVyZW5jZSBmb3IgbGFzdCBjb21taXR0ZWRcbiAgICAgIC8vIHBvaW50XG4gICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXSxcbiAgICAgIH0pO1xuICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuXG4gICAgICAvKiBJZiBhcnJvdyBpcyBwcmUtYXJyb3doZWFkcywgaXQgd2lsbCBoYXZlIHVuZGVmaW5lZCBmb3IgYm90aCBzdGFydCBhbmQgZW5kIGFycm93aGVhZHMuXG4gICAgICBJZiBzbywgd2Ugd2FudCBpdCB0byBiZSBudWxsIGZvciBzdGFydCBhbmQgXCJhcnJvd1wiIGZvciBlbmQuIElmIHRoZSBsaW5lYXIgaXRlbSBpcyBub3RcbiAgICAgIGFuIGFycm93LCB3ZSB3YW50IGl0IHRvIGJlIG51bGwgZm9yIGJvdGguIE90aGVyd2lzZSwgd2Ugd2FudCBpdCB0byB1c2UgdGhlXG4gICAgICB2YWx1ZXMgZnJvbSBhcHBTdGF0ZS4gKi9cblxuICAgICAgY29uc3QgeyBjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IFtzdGFydEFycm93aGVhZCwgZW5kQXJyb3doZWFkXSA9XG4gICAgICAgIGVsZW1lbnRUeXBlID09PSBcImFycm93XCJcbiAgICAgICAgICA/IFtjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZF1cbiAgICAgICAgICA6IFtudWxsLCBudWxsXTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IG5ld0xpbmVhckVsZW1lbnQoe1xuICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgeDogZ3JpZFgsXG4gICAgICAgIHk6IGdyaWRZLFxuICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgICBzdGFydEFycm93aGVhZCxcbiAgICAgICAgZW5kQXJyb3doZWFkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICBwb2ludHM6IFsuLi5lbGVtZW50LnBvaW50cywgWzAsIDBdXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICk7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICBdKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBzdGFydEJvdW5kRWxlbWVudDogYm91bmRFbGVtZW50LFxuICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBjcmVhdGVHZW5lcmljRWxlbWVudE9uUG9pbnRlckRvd24gPSAoXG4gICAgZWxlbWVudFR5cGU6IEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgKTtcbiAgICBjb25zdCBlbGVtZW50ID0gbmV3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgXSk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbXVsdGlFbGVtZW50OiBudWxsLFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgb25LZXlEb3duRnJvbVBvaW50ZXJEb3duSGFuZGxlcihcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uS2V5VXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIC8vIFByZXZlbnRzIGZvY3VzIGZyb20gZXNjYXBpbmcgZXhjYWxpZHJhdyB0YWJcbiAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5BTFQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmICh0aGlzLm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm1heWJlRHJhZ05ld0dlbmVyaWNFbGVtZW50KHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBkcmFnT2Zmc2V0WFkgb25seSBhZnRlciB3ZSd2ZSB1cGRhdGVkXG4gICAgICAvLyBgc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzYCBvbiBwb2ludGVyRG93bi4gRG9pbmcgaXQgaGVyZSBpbiBwb2ludGVyTW92ZVxuICAgICAgLy8gZXZlbnQgaGFuZGxlciBzaG91bGQgaG9wZWZ1bGx5IGVuc3VyZSB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgd2l0aFxuICAgICAgLy8gdGhlIHVwZGF0ZWQgc3RhdGUuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9PT0gbnVsbCkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIGdldERyYWdPZmZzZXRYWShcbiAgICAgICAgICAgIGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgdGhpcy5zdGF0ZSk7XG4gICAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuXG4gICAgICAvLyBmb3IgYXJyb3dzL2xpbmVzLCBkb24ndCBzdGFydCBkcmFnZ2luZyB1bnRpbCBhIGdpdmVuIHRocmVzaG9sZFxuICAgICAgLy8gdG8gZW5zdXJlIHdlIGRvbid0IGNyZWF0ZSBhIDItcG9pbnQgYXJyb3cgYnkgbWlzdGFrZSB3aGVuXG4gICAgICAvLyB1c2VyIGNsaWNrcyBtb3VzZSBpbiBhIHdheSB0aGF0IGl0IG1vdmVzIGEgdGlueSBiaXQgKHRodXNcbiAgICAgIC8vIHRyaWdnZXJpbmcgcG9pbnRlcm1vdmUpXG4gICAgICBpZiAoXG4gICAgICAgICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiYXJyb3dcIiB8fFxuICAgICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwibGluZVwiKVxuICAgICAgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkaXN0YW5jZTJkKFxuICAgICAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICAgICAgcG9pbnRlckNvb3Jkcy55LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgKSA8IERSQUdHSU5HX1RIUkVTSE9MRFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmlzUmVzaXppbmcpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuICAgICAgICBpZiAodGhpcy5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBkaWREcmFnID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludERyYWdnaW5nKFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgKGFwcFN0YXRlKSA9PiB0aGlzLnNldFN0YXRlKGFwcFN0YXRlKSxcbiAgICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgICAgcG9pbnRlckNvb3Jkcy55LFxuICAgICAgICAgIChlbGVtZW50LCBzdGFydE9yRW5kKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JMaW5lYXJFbGVtZW50QXRDdXJzb3IoXG4gICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgIHN0YXJ0T3JFbmQsXG4gICAgICAgICAgICAgIHBvaW50ZXJDb29yZHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRpZERyYWcpIHtcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHBvaW50ZXJDb29yZHMueTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzSGl0QVNlbGVjdGVkRWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzLnNvbWUoXG4gICAgICAgIChlbGVtZW50KSA9PiB0aGlzLmlzQVNlbGVjdGVkRWxlbWVudChlbGVtZW50KSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaGFzSGl0QVNlbGVjdGVkRWxlbWVudCB8fFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgKSB7XG4gICAgICAgIC8vIE1hcmtpbmcgdGhhdCBjbGljayB3YXMgdXNlZCBmb3IgZHJhZ2dpbmcgdG8gY2hlY2tcbiAgICAgICAgLy8gaWYgZWxlbWVudHMgc2hvdWxkIGJlIGRlc2VsZWN0ZWQgb24gcG9pbnRlcnVwXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICAvLyBwcmV2ZW50IGRyYWdnaW5nIGV2ZW4gaWYgd2UncmUgbm8gbG9uZ2VyIGhvbGRpbmcgY21kL2N0cmwgb3RoZXJ3aXNlXG4gICAgICAgIC8vIGl0IHdvdWxkIGhhdmUgd2VpcmQgcmVzdWx0cyAoc3R1ZmYganVtcGluZyBhbGwgb3ZlciB0aGUgc2NyZWVuKVxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwICYmICFwb2ludGVyRG93blN0YXRlLndpdGhDbWRPckN0cmwpIHtcbiAgICAgICAgICBjb25zdCBbZHJhZ1gsIGRyYWdZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgICAgIHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueCxcbiAgICAgICAgICAgIHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueSxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IFtkcmFnRGlzdGFuY2VYLCBkcmFnRGlzdGFuY2VZXSA9IFtcbiAgICAgICAgICAgIE1hdGguYWJzKHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngpLFxuICAgICAgICAgICAgTWF0aC5hYnMocG9pbnRlckNvb3Jkcy55IC0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSksXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIC8vIFdlIG9ubHkgZHJhZyBpbiBvbmUgZGlyZWN0aW9uIGlmIHNoaWZ0IGlzIHByZXNzZWRcbiAgICAgICAgICBjb25zdCBsb2NrRGlyZWN0aW9uID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICAgICAgICBkcmFnU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLFxuICAgICAgICAgICAgZHJhZ1gsXG4gICAgICAgICAgICBkcmFnWSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgICBsb2NrRGlyZWN0aW9uLFxuICAgICAgICAgICAgZHJhZ0Rpc3RhbmNlWCxcbiAgICAgICAgICAgIGRyYWdEaXN0YW5jZVksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgICAgICAvLyBXZSBkdXBsaWNhdGUgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaWYgYWx0IGlzIHByZXNzZWQgb24gcG9pbnRlciBtb3ZlXG4gICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSAmJiAhcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQpIHtcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50cyB0byB0aGUgdG9wIG9mIHRoZSB6IGluZGV4IHN0YWNrLCBhbmRcbiAgICAgICAgICAgIC8vIHB1dCB0aGUgZHVwbGljYXRlcyB3aGVyZSB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgdXNlZCB0byBiZS5cbiAgICAgICAgICAgIC8vICh0aGUgb3JpZ2luIHBvaW50IHdoZXJlIHRoZSBkcmFnZ2luZyBzdGFydGVkKVxuXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNCZWVuRHVwbGljYXRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRFbGVtZW50cyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNUb0FwcGVuZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBJZE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZElkVG9EdXBsaWNhdGVkSWQgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSB8fFxuICAgICAgICAgICAgICAgIC8vIGNhc2U6IHRoZSBzdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMgbWlnaHQgbm90IGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgeWV0IGJ5IHRoZSB0aW1lIHRoaXMgbW91c2Vtb3ZlIGV2ZW50IGlzIGZpcmVkXG4gICAgICAgICAgICAgICAgKGVsZW1lbnQuaWQgPT09IGhpdEVsZW1lbnQ/LmlkICYmXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVkRWxlbWVudCA9IGR1cGxpY2F0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkLFxuICAgICAgICAgICAgICAgICAgZ3JvdXBJZE1hcCxcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBbb3JpZ2luRHJhZ1gsIG9yaWdpbkRyYWdZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LFxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHVwbGljYXRlZEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgIHg6IGR1cGxpY2F0ZWRFbGVtZW50LnggKyAob3JpZ2luRHJhZ1ggLSBkcmFnWCksXG4gICAgICAgICAgICAgICAgICB5OiBkdXBsaWNhdGVkRWxlbWVudC55ICsgKG9yaWdpbkRyYWdZIC0gZHJhZ1kpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGR1cGxpY2F0ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZC5zZXQoZWxlbWVudC5pZCwgZHVwbGljYXRlZEVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0U2NlbmVFbGVtZW50cyA9IFsuLi5uZXh0RWxlbWVudHMsIC4uLmVsZW1lbnRzVG9BcHBlbmRdO1xuICAgICAgICAgICAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uKFxuICAgICAgICAgICAgICBuZXh0U2NlbmVFbGVtZW50cyxcbiAgICAgICAgICAgICAgZWxlbWVudHNUb0FwcGVuZCxcbiAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZCxcbiAgICAgICAgICAgICAgXCJkdXBsaWNhdGVzU2VydmVBc09sZFwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKG5leHRTY2VuZUVsZW1lbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRvIHJlYWQgdGhpcy5zdGF0ZSB3aXRoaW4gZWFjaCBtb3ZlIGV2ZW50LFxuICAgICAgLy8gb3RoZXJ3aXNlIHdlIHdvdWxkIHJlYWQgYSBzdGFsZSBvbmUhXG4gICAgICBjb25zdCBkcmFnZ2luZ0VsZW1lbnQgPSB0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudDtcbiAgICAgIGlmICghZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudC50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgY29uc3QgZHggPSBwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgY29uc3QgZHkgPSBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueTtcblxuICAgICAgICBjb25zdCBwcmVzc3VyZXMgPSBkcmFnZ2luZ0VsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZVxuICAgICAgICAgID8gZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlc1xuICAgICAgICAgIDogWy4uLmRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMsIGV2ZW50LnByZXNzdXJlXTtcblxuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgIHByZXNzdXJlcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IGdyaWRYIC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IGdyaWRZIC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgaWYgKGdldFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlS2V5KGV2ZW50KSAmJiBwb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgKHsgd2lkdGg6IGR4LCBoZWlnaHQ6IGR5IH0gPSBnZXRQZXJmZWN0RWxlbWVudFNpemUoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgZHgsXG4gICAgICAgICAgICBkeSxcbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHsgcG9pbnRzOiBbLi4ucG9pbnRzLCBbZHgsIGR5XV0gfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLnNsaWNlKDAsIC0xKSwgW2R4LCBkeV1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICAgIC8vIFdoZW4gY3JlYXRpbmcgYSBsaW5lYXIgZWxlbWVudCBieSBkcmFnZ2luZ1xuICAgICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckxpbmVhckVsZW1lbnRBdEN1cnNvcihcbiAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgIFwiZW5kXCIsXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5zdGFydEJvdW5kRWxlbWVudCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG4gICAgICAgIHRoaXMubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICAgICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiBpc1NvbWVFbGVtZW50U2VsZWN0ZWQoZWxlbWVudHMsIHRoaXMuc3RhdGUpKSB7XG4gICAgICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUud2l0aENtZE9yQ3RybCAmJiBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+XG4gICAgICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50IS5pZF06IHRydWUsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50c1dpdGhpblNlbGVjdGlvbiA9IGdldEVsZW1lbnRzV2l0aGluU2VsZWN0aW9uKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAuLi5lbGVtZW50c1dpdGhpblNlbGVjdGlvbi5yZWR1Y2UoKG1hcCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgbWFwW2VsZW1lbnQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfSwge30gYXMgYW55KSxcbiAgICAgICAgICAgICAgICAuLi4ocG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudFxuICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNpbmcgY3RybC9jbWQsIHNlbGVjdCB0aGUgaGl0RWxlbWVudCBvbmx5IGlmIHdlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZW4ndCBib3gtc2VsZWN0ZWQgYW55dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAuaWRdOiAhZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA6IG51bGwpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwb2ludGVyIG1vdmUgaGFwcGVuZWQgb3ZlciBlaXRoZXIgc2Nyb2xsYmFyXG4gIHByaXZhdGUgaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVySG9yaXpvbnRhbCkge1xuICAgICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCBkeCA9IHggLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueDtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxYOiB0aGlzLnN0YXRlLnNjcm9sbFggLSBkeCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSB4O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJWZXJ0aWNhbCkge1xuICAgICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBjb25zdCBkeSA9IHkgLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFkgLSBkeSAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSB5O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgb25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB2b2lkIHtcbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKChjaGlsZEV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICByZXNpemluZ0VsZW1lbnQsXG4gICAgICAgIG11bHRpRWxlbWVudCxcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIGVsZW1lbnRMb2NrZWQsXG4gICAgICAgIGlzUmVzaXppbmcsXG4gICAgICAgIGlzUm90YXRpbmcsXG4gICAgICB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzUmVzaXppbmc6IGZhbHNlLFxuICAgICAgICBpc1JvdGF0aW5nOiBmYWxzZSxcbiAgICAgICAgcmVzaXppbmdFbGVtZW50OiBudWxsLFxuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBudWxsLFxuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIixcbiAgICAgICAgLy8gdGV4dCBlbGVtZW50cyBhcmUgcmVzZXQgb24gZmluYWxpemUsIGFuZCByZXNldHRpbmcgb24gcG9pbnRlcnVwXG4gICAgICAgIC8vIG1heSBjYXVzZSBpc3N1ZXMgd2l0aCBkb3VibGUgdGFwc1xuICAgICAgICBlZGl0aW5nRWxlbWVudDpcbiAgICAgICAgICBtdWx0aUVsZW1lbnQgfHwgaXNUZXh0RWxlbWVudCh0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50KVxuICAgICAgICAgICAgPyB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zYXZlUG9pbnRlcihjaGlsZEV2ZW50LmNsaWVudFgsIGNoaWxkRXZlbnQuY2xpZW50WSwgXCJ1cFwiKTtcblxuICAgICAgLy8gSGFuZGxlIGVuZCBvZiBkcmFnZ2luZyBhIHBvaW50IG9mIGEgbGluZWFyIGVsZW1lbnQsIG1pZ2h0IGNsb3NlIGEgbG9vcFxuICAgICAgLy8gYW5kIHNldHMgYmluZGluZyBlbGVtZW50XG4gICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlclVwKFxuICAgICAgICAgIGNoaWxkRXZlbnQsXG4gICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQgIT09IHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQb2ludGVyVXAgPSBudWxsO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuUE9JTlRFUl9NT1ZFLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSEsXG4gICAgICApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULlBPSU5URVJfVVAsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25VcCEsXG4gICAgICApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULktFWURPV04sXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlEb3duISxcbiAgICAgICk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuS0VZVVAsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlVcCEsXG4gICAgICApO1xuXG4gICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50Py50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgICBjaGlsZEV2ZW50LFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgbGV0IGR4ID0gcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IHBvaW50ZXJDb29yZHMueSAtIGRyYWdnaW5nRWxlbWVudC55O1xuXG4gICAgICAgIC8vIEFsbG93cyBkb3RzIHRvIGF2b2lkIGJlaW5nIGZsYWdnZWQgYXMgaW5maW5pdGVseSBzbWFsbFxuICAgICAgICBpZiAoZHggPT09IHBvaW50c1swXVswXSAmJiBkeSA9PT0gcG9pbnRzWzBdWzFdKSB7XG4gICAgICAgICAgZHkgKz0gMC4wMDAxO1xuICAgICAgICAgIGR4ICs9IDAuMDAwMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXNzdXJlcyA9IGRyYWdnaW5nRWxlbWVudC5zaW11bGF0ZVByZXNzdXJlXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogWy4uLmRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMsIGNoaWxkRXZlbnQucHJlc3N1cmVdO1xuXG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLCBbZHgsIGR5XV0sXG4gICAgICAgICAgcHJlc3N1cmVzLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNMaW5lYXJFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudCEucG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgICBjaGlsZEV2ZW50LFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQgJiZcbiAgICAgICAgICAhbXVsdGlFbGVtZW50XG4gICAgICAgICkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFtcbiAgICAgICAgICAgICAgLi4uZHJhZ2dpbmdFbGVtZW50LnBvaW50cyxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHBvaW50ZXJDb29yZHMueCAtIGRyYWdnaW5nRWxlbWVudC54LFxuICAgICAgICAgICAgICAgIHBvaW50ZXJDb29yZHMueSAtIGRyYWdnaW5nRWxlbWVudC55LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIG11bHRpRWxlbWVudDogZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiAhbXVsdGlFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKSAmJlxuICAgICAgICAgICAgaXNCaW5kaW5nRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtYXliZUJpbmRMaW5lYXJFbGVtZW50KFxuICAgICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgICAgIHBvaW50ZXJDb29yZHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLCBzdGFydEJvdW5kRWxlbWVudDogbnVsbCB9KTtcbiAgICAgICAgICBpZiAoIWVsZW1lbnRMb2NrZWQpIHtcbiAgICAgICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIixcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICBbdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQhLmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgW3RoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50IS5pZF06IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBlbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQgJiZcbiAgICAgICAgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KVxuICAgICAgKSB7XG4gICAgICAgIC8vIHJlbW92ZSBpbnZpc2libGUgZWxlbWVudCB3aGljaCB3YXMgYWRkZWQgaW4gb25Qb2ludGVyRG93blxuICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoXG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgIGdldE5vcm1hbGl6ZWREaW1lbnNpb25zKGRyYWdnaW5nRWxlbWVudCksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNpemluZ0VsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzaXppbmdFbGVtZW50ICYmIGlzSW52aXNpYmx5U21hbGxFbGVtZW50KHJlc2l6aW5nRWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAgICAgLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpXG4gICAgICAgICAgICAuZmlsdGVyKChlbCkgPT4gZWwuaWQgIT09IHJlc2l6aW5nRWxlbWVudC5pZCksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvZGUgYmVsb3cgaGFuZGxlcyBzZWxlY3Rpb24gd2hlbiBlbGVtZW50KHMpIHdlcmVuJ3RcbiAgICAgIC8vIGRyYWcgb3IgYWRkZWQgdG8gc2VsZWN0aW9uIG9uIHBvaW50ZXIgZG93biBwaGFzZS5cbiAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuICAgICAgaWYgKFxuICAgICAgICBoaXRFbGVtZW50ICYmXG4gICAgICAgICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb25cbiAgICAgICkge1xuICAgICAgICBpZiAoY2hpbGRFdmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1toaXRFbGVtZW50LmlkXSkge1xuICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRWaWFHcm91cCh0aGlzLnN0YXRlLCBoaXRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVuc2VsZWN0IGFsbCBncm91cHMgaGl0RWxlbWVudCBpcyBwYXJ0IG9mXG4gICAgICAgICAgICAgIC8vIGFzIHdlbGwgYXMgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGdyb3Vwc1xuICAgICAgICAgICAgICAvLyBoaXRFbGVtZW50IGlzIHBhcnQgb2ZcbiAgICAgICAgICAgICAgY29uc3QgaWRzT2ZTZWxlY3RlZEVsZW1lbnRzVGhhdEFyZUluR3JvdXBzID0gaGl0RWxlbWVudC5ncm91cElkc1xuICAgICAgICAgICAgICAgIC5mbGF0TWFwKChncm91cElkKSA9PlxuICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudHNJbkdyb3VwKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgZ3JvdXBJZCksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5tYXAoKGVsZW1lbnQpID0+ICh7IFtlbGVtZW50LmlkXTogZmFsc2UgfSkpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgocHJldklkLCBhY2MpID0+ICh7IC4uLnByZXZJZCwgLi4uYWNjIH0pLCB7fSk7XG5cbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgoX3ByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7XG4gICAgICAgICAgICAgICAgICAuLi5fcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAgIC4uLmhpdEVsZW1lbnQuZ3JvdXBJZHNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoZ0lkKSA9PiAoeyBbZ0lkXTogZmFsc2UgfSkpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHByZXYsIGFjYykgPT4gKHsgLi4ucHJldiwgLi4uYWNjIH0pLCB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAgIC4uLl9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgICAgLi4uaWRzT2ZTZWxlY3RlZEVsZW1lbnRzVGhhdEFyZUluR3JvdXBzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIHJlbW92ZSBlbGVtZW50IGZyb20gc2VsZWN0aW9uIHdoaWxlXG4gICAgICAgICAgICAgIC8vIGtlZXBpbmcgcHJldiBlbGVtZW50cyBzZWxlY3RlZFxuICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+XG4gICAgICAgICAgICAgICAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50IS5pZF06IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhZGQgZWxlbWVudCB0byBzZWxlY3Rpb24gd2hpbGVcbiAgICAgICAgICAgIC8vIGtlZXBpbmcgcHJldiBlbGVtZW50cyBzZWxlY3RlZFxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgoX3ByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4uX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQhLmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgLi4uc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2hpdEVsZW1lbnQuaWRdOiB0cnVlIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiZcbiAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJlxuICAgICAgICAhdGhpcy5zdGF0ZS5pc1Jlc2l6aW5nICYmXG4gICAgICAgICgoaGl0RWxlbWVudCAmJlxuICAgICAgICAgIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChcbiAgICAgICAgICAgIGhpdEVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgKSkgfHxcbiAgICAgICAgICAoIWhpdEVsZW1lbnQgJiZcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSlcbiAgICAgICkge1xuICAgICAgICAvLyBEZXNlbGVjdCBzZWxlY3RlZCBlbGVtZW50c1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudExvY2tlZCAmJiBlbGVtZW50VHlwZSAhPT0gXCJmcmVlZHJhd1wiICYmIGRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgW2RyYWdnaW5nRWxlbWVudC5pZF06IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiIHx8XG4gICAgICAgIGlzU29tZUVsZW1lbnRTZWxlY3RlZCh0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksIHRoaXMuc3RhdGUpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkIHx8IGlzUmVzaXppbmcgfHwgaXNSb3RhdGluZykge1xuICAgICAgICAoaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKVxuICAgICAgICAgID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICAgIDogdW5iaW5kTGluZWFyRWxlbWVudHMpKFxuICAgICAgICAgIGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50TG9ja2VkICYmIGVsZW1lbnRUeXBlICE9PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIGNvbnN0IHNob3VsZEVuYWJsZUJpbmRpbmcgPSBzaG91bGRFbmFibGVCaW5kaW5nRm9yUG9pbnRlckV2ZW50KGV2ZW50KTtcbiAgICBpZiAodGhpcy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkICE9PSBzaG91bGRFbmFibGVCaW5kaW5nKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNCaW5kaW5nRW5hYmxlZDogc2hvdWxkRW5hYmxlQmluZGluZyB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZVN1Z2dlc3RCaW5kaW5nQXRDdXJzb3IgPSAocG9pbnRlckNvb3Jkczoge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0pOiB2b2lkID0+IHtcbiAgICBjb25zdCBob3ZlcmVkQmluZGFibGVFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgcG9pbnRlckNvb3JkcyxcbiAgICAgIHRoaXMuc2NlbmUsXG4gICAgKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOlxuICAgICAgICBob3ZlcmVkQmluZGFibGVFbGVtZW50ICE9IG51bGwgPyBbaG92ZXJlZEJpbmRhYmxlRWxlbWVudF0gOiBbXSxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIG1heWJlU3VnZ2VzdEJpbmRpbmdGb3JMaW5lYXJFbGVtZW50QXRDdXJzb3IgPSAoXG4gICAgbGluZWFyRWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgc3RhcnRPckVuZDogXCJzdGFydFwiIHwgXCJlbmRcIixcbiAgICBwb2ludGVyQ29vcmRzOiB7XG4gICAgICB4OiBudW1iZXI7XG4gICAgICB5OiBudW1iZXI7XG4gICAgfSxcbiAgICAvLyBEdXJpbmcgbGluZSBjcmVhdGlvbiB0aGUgc3RhcnQgYmluZGluZyBoYXNuJ3QgYmVlbiB3cml0dGVuIHlldFxuICAgIC8vIGludG8gYGxpbmVhckVsZW1lbnRgXG4gICAgb3Bwb3NpdGVCaW5kaW5nQm91bmRFbGVtZW50PzogRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCB8IG51bGwsXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICBwb2ludGVyQ29vcmRzLFxuICAgICAgdGhpcy5zY2VuZSxcbiAgICApO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6XG4gICAgICAgIGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICAgICAhaXNMaW5lYXJFbGVtZW50U2ltcGxlQW5kQWxyZWFkeUJvdW5kKFxuICAgICAgICAgIGxpbmVhckVsZW1lbnQsXG4gICAgICAgICAgb3Bwb3NpdGVCaW5kaW5nQm91bmRFbGVtZW50Py5pZCxcbiAgICAgICAgICBob3ZlcmVkQmluZGFibGVFbGVtZW50LFxuICAgICAgICApXG4gICAgICAgICAgPyBbaG92ZXJlZEJpbmRhYmxlRWxlbWVudF1cbiAgICAgICAgICA6IFtdLFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChcbiAgICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBzdWdnZXN0ZWRCaW5kaW5ncyA9IGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5ncyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgLy8gQ29udGludWUgZWRpdGluZyB0aGUgc2FtZSBncm91cCBpZiB0aGUgdXNlciBzZWxlY3RlZCBhIGRpZmZlcmVudFxuICAgICAgLy8gZWxlbWVudCBmcm9tIGl0XG4gICAgICBlZGl0aW5nR3JvdXBJZDpcbiAgICAgICAgcHJldlN0YXRlLmVkaXRpbmdHcm91cElkICYmXG4gICAgICAgIGhpdEVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICAgICBpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZClcbiAgICAgICAgICA/IHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZFxuICAgICAgICAgIDogbnVsbCxcbiAgICB9KSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNSZWYgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkgPT4ge1xuICAgIC8vIGNhbnZhcyBpcyBudWxsIHdoZW4gdW5tb3VudGluZ1xuICAgIGlmIChjYW52YXMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgICAgdGhpcy5yYyA9IHJvdWdoLmNhbnZhcyh0aGlzLmNhbnZhcyk7XG5cbiAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuV0hFRUwsIHRoaXMuaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfU1RBUlQsIHRoaXMub25UYXBTdGFydCk7XG4gICAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX0VORCwgdGhpcy5vblRhcEVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULldIRUVMLCB0aGlzLmhhbmRsZVdoZWVsKTtcbiAgICAgIHRoaXMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX1NUQVJULCB0aGlzLm9uVGFwU3RhcnQpO1xuICAgICAgdGhpcy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfRU5ELCB0aGlzLm9uVGFwRW5kKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVBcHBPbkRyb3AgPSBhc3luYyAoZXZlbnQ6IFJlYWN0LkRyYWdFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMucHJvcHMub25Ecm9wICYmIChhd2FpdCB0aGlzLnByb3BzLm9uRHJvcChldmVudCkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXNbMF07XG4gICAgICBpZiAoZmlsZT8udHlwZSA9PT0gXCJpbWFnZS9wbmdcIiB8fCBmaWxlPy50eXBlID09PSBcImltYWdlL3N2Zyt4bWxcIikge1xuICAgICAgICBpZiAoZnNTdXBwb3J0ZWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgd29yayBhcyBvZiBDaHJvbWUgODYsXG4gICAgICAgICAgICAvLyBidXQgY2FuIGJlIHNhZmVseSBpZ25vcmVkIG9uIG9sZGVyIHJlbGVhc2VzLlxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtc1swXTtcbiAgICAgICAgICAgIChmaWxlIGFzIGFueSkuaGFuZGxlID0gYXdhaXQgKGl0ZW0gYXMgYW55KS5nZXRBc0ZpbGVTeXN0ZW1IYW5kbGUoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgZWxlbWVudHMsIGFwcFN0YXRlIH0gPSBhd2FpdCBsb2FkRnJvbUJsb2IoXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCh7XG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICAgIC4uLihhcHBTdGF0ZSB8fCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGlicmFyeVNoYXBlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYik7XG4gICAgaWYgKGxpYnJhcnlTaGFwZXMgIT09IFwiXCIpIHtcbiAgICAgIHRoaXMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICBlbGVtZW50czogSlNPTi5wYXJzZShsaWJyYXJ5U2hhcGVzKSxcbiAgICAgICAgcG9zaXRpb246IGV2ZW50LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXNbMF07XG4gICAgaWYgKFxuICAgICAgZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3bGliIHx8XG4gICAgICBmaWxlPy5uYW1lPy5lbmRzV2l0aChcIi5leGNhbGlkcmF3bGliXCIpXG4gICAgKSB7XG4gICAgICB0aGlzLmxpYnJhcnlcbiAgICAgICAgLmltcG9ydExpYnJhcnkoZmlsZSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIENsb3NlIGFuZCB0aGVuIG9wZW4gdG8gZ2V0IHRoZSBsaWJyYXJpZXMgdXBkYXRlZFxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xpYnJhcnlPcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMaWJyYXJ5T3BlbjogdHJ1ZSB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT5cbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiBmYWxzZSwgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pLFxuICAgICAgICApO1xuICAgICAgLy8gZGVmYXVsdDogYXNzdW1lIGFuIEV4Y2FsaWRyYXcgZmlsZSByZWdhcmRsZXNzIG9mIGV4dGVuc2lvbi9NaW1lVHlwZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiB0cnVlIH0pO1xuICAgICAgaWYgKGZzU3VwcG9ydGVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgd29yayBhcyBvZiBDaHJvbWUgODYsXG4gICAgICAgICAgLy8gYnV0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCBvbiBvbGRlciByZWxlYXNlcy5cbiAgICAgICAgICBjb25zdCBpdGVtID0gZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zWzBdO1xuICAgICAgICAgIChmaWxlIGFzIGFueSkuaGFuZGxlID0gYXdhaXQgKGl0ZW0gYXMgYW55KS5nZXRBc0ZpbGVTeXN0ZW1IYW5kbGUoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMubG9hZEZpbGVUb0NhbnZhcyhmaWxlKTtcbiAgICB9XG4gIH07XG5cbiAgbG9hZEZpbGVUb0NhbnZhcyA9IChmaWxlOiBCbG9iKSA9PiB7XG4gICAgbG9hZEZyb21CbG9iKGZpbGUsIHRoaXMuc3RhdGUsIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkpXG4gICAgICAudGhlbigoeyBlbGVtZW50cywgYXBwU3RhdGUgfSkgPT5cbiAgICAgICAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0KHtcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZToge1xuICAgICAgICAgICAgLi4uKGFwcFN0YXRlIHx8IHRoaXMuc3RhdGUpLFxuICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xvYWRpbmc6IGZhbHNlLCBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc0NvbnRleHRNZW51ID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHgsIHksIHsgcHJlZmVyU2VsZWN0ZWQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCB0eXBlID0gZWxlbWVudCA/IFwiZWxlbWVudFwiIDogXCJjYW52YXNcIjtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ITtcbiAgICBjb25zdCB7XG4gICAgICB0b3A6IG9mZnNldFRvcCxcbiAgICAgIGxlZnQ6IG9mZnNldExlZnQsXG4gICAgfSA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgY29uc3QgdG9wID0gZXZlbnQuY2xpZW50WSAtIG9mZnNldFRvcDtcblxuICAgIGlmIChlbGVtZW50ICYmICF0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkRWxlbWVudElkczogeyBbZWxlbWVudC5pZF06IHRydWUgfSB9LCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX29wZW5Db250ZXh0TWVudSh7IHRvcCwgbGVmdCB9LCB0eXBlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnUoeyB0b3AsIGxlZnQgfSwgdHlwZSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQgPSAoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgICBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGRyYWdnaW5nRWxlbWVudCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50O1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgaWYgKCFkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRyYWdnaW5nRWxlbWVudC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBkcmFnTmV3RWxlbWVudChcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckNvb3Jkcy54KSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgcG9pbnRlckNvb3Jkcy55KSxcbiAgICAgICAgZ2V0UmVzaXplV2l0aFNpZGVzU2FtZUxlbmd0aEtleShldmVudCksXG4gICAgICAgIGdldFJlc2l6ZUNlbnRlclBvaW50S2V5KGV2ZW50KSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICk7XG4gICAgICBkcmFnTmV3RWxlbWVudChcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC54LFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC55LFxuICAgICAgICBncmlkWCxcbiAgICAgICAgZ3JpZFksXG4gICAgICAgIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLngsIGdyaWRYKSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueSwgZ3JpZFkpLFxuICAgICAgICBnZXRSZXNpemVXaXRoU2lkZXNTYW1lTGVuZ3RoS2V5KGV2ZW50KSxcbiAgICAgICAgZ2V0UmVzaXplQ2VudGVyUG9pbnRLZXkoZXZlbnQpLFxuICAgICAgKTtcbiAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChbZHJhZ2dpbmdFbGVtZW50XSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVIYW5kbGVSZXNpemUgPSAoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgICBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLy8gVE9ETzogcmVuYW1lIHRoaXMgc3RhdGUgZmllbGQgdG8gXCJpc1NjYWxpbmdcIiB0byBkaXN0aW5ndWlzaFxuICAgICAgLy8gaXQgZnJvbSB0aGUgZ2VuZXJpYyBcImlzUmVzaXppbmdcIiB3aGljaCBpbmNsdWRlcyBzY2FsaW5nIGFuZFxuICAgICAgLy8gcm90YXRpbmdcbiAgICAgIGlzUmVzaXppbmc6IHRyYW5zZm9ybUhhbmRsZVR5cGUgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJyb3RhdGlvblwiLFxuICAgICAgaXNSb3RhdGluZzogdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJyb3RhdGlvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgY29uc3QgW3Jlc2l6ZVgsIHJlc2l6ZVldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgcG9pbnRlckNvb3Jkcy54IC0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0LngsXG4gICAgICBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQueSxcbiAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICB0cmFuc2Zvcm1FbGVtZW50cyhcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24sXG4gICAgICAgIGdldFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlS2V5KGV2ZW50KSxcbiAgICAgICAgZ2V0UmVzaXplQ2VudGVyUG9pbnRLZXkoZXZlbnQpLFxuICAgICAgICBnZXRSZXNpemVXaXRoU2lkZXNTYW1lTGVuZ3RoS2V5KGV2ZW50KSxcbiAgICAgICAgcmVzaXplWCxcbiAgICAgICAgcmVzaXplWSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuY2VudGVyLngsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmNlbnRlci55LFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKiogQHByaXZhdGUgdXNlIHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUgKi9cbiAgcHJpdmF0ZSBfb3BlbkNvbnRleHRNZW51ID0gKFxuICAgIHtcbiAgICAgIGxlZnQsXG4gICAgICB0b3AsXG4gICAgfToge1xuICAgICAgbGVmdDogbnVtYmVyO1xuICAgICAgdG9wOiBudW1iZXI7XG4gICAgfSxcbiAgICB0eXBlOiBcImNhbnZhc1wiIHwgXCJlbGVtZW50XCIsXG4gICkgPT4ge1xuICAgIGNvbnN0IG1heWJlR3JvdXBBY3Rpb24gPSBhY3Rpb25Hcm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5YmVVbmdyb3VwQWN0aW9uID0gYWN0aW9uVW5ncm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5YmVGbGlwSG9yaXpvbnRhbCA9IGFjdGlvbkZsaXBIb3Jpem9udGFsLmNvbnRleHRJdGVtUHJlZGljYXRlIShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBtYXliZUZsaXBWZXJ0aWNhbCA9IGFjdGlvbkZsaXBWZXJ0aWNhbC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VwYXJhdG9yID0gXCJzZXBhcmF0b3JcIjtcblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQ29udGV4dE1lbnVPcHRpb25bXSA9IFtdO1xuICAgIGlmIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zLnB1c2goYWN0aW9uQ29weUFzUG5nKTtcbiAgICB9XG5cbiAgICBpZiAocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zLnB1c2goYWN0aW9uQ29weUFzU3ZnKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwiY2FudmFzXCIpIHtcbiAgICAgIGNvbnN0IHZpZXdNb2RlT3B0aW9ucyA9IFtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsXG4gICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZVplbk1vZGUsXG4gICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgIGFjdGlvblRvZ2dsZVZpZXdNb2RlLFxuICAgICAgICBhY3Rpb25Ub2dnbGVTdGF0cyxcbiAgICAgIF07XG5cbiAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICBvcHRpb25zOiB2aWV3TW9kZU9wdGlvbnMsXG4gICAgICAgIHRvcCxcbiAgICAgICAgbGVmdCxcbiAgICAgICAgYWN0aW9uTWFuYWdlcjogdGhpcy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICB0aGlzLmlzTW9iaWxlICYmXG4gICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLnBhc3RlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBzZXBhcmF0b3IsXG4gICAgICAgICAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiZcbiAgICAgICAgICAgIGVsZW1lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIGFjdGlvbkNvcHlBc1BuZyxcbiAgICAgICAgICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmXG4gICAgICAgICAgICBlbGVtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICBhY3Rpb25Db3B5QXNTdmcsXG4gICAgICAgICAgKChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkpICYmXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgYWN0aW9uU2VsZWN0QWxsLFxuICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgIGFjdGlvblRvZ2dsZUdyaWRNb2RlLFxuICAgICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICBhY3Rpb25Ub2dnbGVaZW5Nb2RlLFxuICAgICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgYWN0aW9uVG9nZ2xlVmlld01vZGUsXG4gICAgICAgICAgYWN0aW9uVG9nZ2xlU3RhdHMsXG4gICAgICAgIF0sXG4gICAgICAgIHRvcCxcbiAgICAgICAgbGVmdCxcbiAgICAgICAgYWN0aW9uTWFuYWdlcjogdGhpcy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICBvcHRpb25zOiBbbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LCAuLi5vcHRpb25zXSxcbiAgICAgICAgdG9wLFxuICAgICAgICBsZWZ0LFxuICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgIGFwcFN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICB0aGlzLmlzTW9iaWxlICYmIGFjdGlvbkN1dCxcbiAgICAgICAgdGhpcy5pc01vYmlsZSAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIGFjdGlvbkNvcHksXG4gICAgICAgIHRoaXMuaXNNb2JpbGUgJiZcbiAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHtcbiAgICAgICAgICAgIG5hbWU6IFwicGFzdGVcIixcbiAgICAgICAgICAgIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGVzKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKG51bGwpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIixcbiAgICAgICAgICB9LFxuICAgICAgICB0aGlzLmlzTW9iaWxlICYmIHNlcGFyYXRvcixcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICBhY3Rpb25Db3B5U3R5bGVzLFxuICAgICAgICBhY3Rpb25QYXN0ZVN0eWxlcyxcbiAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICBtYXliZUdyb3VwQWN0aW9uICYmIGFjdGlvbkdyb3VwLFxuICAgICAgICBtYXliZVVuZ3JvdXBBY3Rpb24gJiYgYWN0aW9uVW5ncm91cCxcbiAgICAgICAgKG1heWJlR3JvdXBBY3Rpb24gfHwgbWF5YmVVbmdyb3VwQWN0aW9uKSAmJiBzZXBhcmF0b3IsXG4gICAgICAgIGFjdGlvbkFkZFRvTGlicmFyeSxcbiAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICBhY3Rpb25TZW5kQmFja3dhcmQsXG4gICAgICAgIGFjdGlvbkJyaW5nRm9yd2FyZCxcbiAgICAgICAgYWN0aW9uU2VuZFRvQmFjayxcbiAgICAgICAgYWN0aW9uQnJpbmdUb0Zyb250LFxuICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgIG1heWJlRmxpcEhvcml6b250YWwgJiYgYWN0aW9uRmxpcEhvcml6b250YWwsXG4gICAgICAgIG1heWJlRmxpcFZlcnRpY2FsICYmIGFjdGlvbkZsaXBWZXJ0aWNhbCxcbiAgICAgICAgKG1heWJlRmxpcEhvcml6b250YWwgfHwgbWF5YmVGbGlwVmVydGljYWwpICYmIHNlcGFyYXRvcixcbiAgICAgICAgYWN0aW9uRHVwbGljYXRlU2VsZWN0aW9uLFxuICAgICAgICBhY3Rpb25EZWxldGVTZWxlY3RlZCxcbiAgICAgIF0sXG4gICAgICB0b3AsXG4gICAgICBsZWZ0LFxuICAgICAgYWN0aW9uTWFuYWdlcjogdGhpcy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZVdoZWVsID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSB9ID0gZXZlbnQ7XG4gICAgY29uc3QgeyBzZWxlY3RlZEVsZW1lbnRJZHMsIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzIH0gPSB0aGlzLnN0YXRlO1xuICAgIC8vIG5vdGUgdGhhdCBldmVudC5jdHJsS2V5IGlzIG5lY2Vzc2FyeSB0byBoYW5kbGUgcGluY2ggem9vbWluZ1xuICAgIGlmIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIGNvbnN0IHNpZ24gPSBNYXRoLnNpZ24oZGVsdGFZKTtcbiAgICAgIGNvbnN0IE1BWF9TVEVQID0gMTA7XG4gICAgICBsZXQgZGVsdGEgPSBNYXRoLmFicyhkZWx0YVkpO1xuICAgICAgaWYgKGRlbHRhID4gTUFYX1NURVApIHtcbiAgICAgICAgZGVsdGEgPSBNQVhfU1RFUDtcbiAgICAgIH1cbiAgICAgIGRlbHRhICo9IHNpZ247XG4gICAgICBpZiAoT2JqZWN0LmtleXMocHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3Wm9vbSA9IHRoaXMuc3RhdGUuem9vbS52YWx1ZSAtIGRlbHRhIC8gMTAwO1xuICAgICAgLy8gaW5jcmVhc2Ugem9vbSBzdGVwcyB0aGUgbW9yZSB6b29tZWQtaW4gd2UgYXJlIChhcHBsaWVzIHRvID4xMDAlIG9ubHkpXG4gICAgICBuZXdab29tICs9IE1hdGgubG9nMTAoTWF0aC5tYXgoMSwgdGhpcy5zdGF0ZS56b29tLnZhbHVlKSkgKiAtc2lnbjtcbiAgICAgIC8vIHJvdW5kIHRvIG5lYXJlc3Qgc3RlcFxuICAgICAgbmV3Wm9vbSA9IE1hdGgucm91bmQobmV3Wm9vbSAqIFpPT01fU1RFUCAqIDEwMCkgLyAoWk9PTV9TVEVQICogMTAwKTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyB6b29tLCBvZmZzZXRMZWZ0LCBvZmZzZXRUb3AgfSkgPT4gKHtcbiAgICAgICAgem9vbTogZ2V0TmV3Wm9vbShcbiAgICAgICAgICBnZXROb3JtYWxpemVkWm9vbShuZXdab29tKSxcbiAgICAgICAgICB6b29tLFxuICAgICAgICAgIHsgbGVmdDogb2Zmc2V0TGVmdCwgdG9wOiBvZmZzZXRUb3AgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB4OiBjdXJzb3JYLFxuICAgICAgICAgICAgeTogY3Vyc29yWSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczpcbiAgICAgICAgICBPYmplY3Qua2V5cyhzZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAhPT0gMFxuICAgICAgICAgICAgPyBzZWxlY3RlZEVsZW1lbnRJZHNcbiAgICAgICAgICAgIDogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMucmVzZXRTaG91bGRDYWNoZUlnbm9yZVpvb21EZWJvdW5jZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzY3JvbGwgaG9yaXpvbnRhbGx5IHdoZW4gc2hpZnQgcHJlc3NlZFxuICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyB6b29tLCBzY3JvbGxYIH0pID0+ICh7XG4gICAgICAgIC8vIG9uIE1hYywgc2hpZnQrd2hlZWwgdGVuZHMgdG8gcmVzdWx0IGluIGRlbHRhWFxuICAgICAgICBzY3JvbGxYOiBzY3JvbGxYIC0gKGRlbHRhWSB8fCBkZWx0YVgpIC8gem9vbS52YWx1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIHNjcm9sbFgsIHNjcm9sbFkgfSkgPT4gKHtcbiAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSBkZWx0YVggLyB6b29tLnZhbHVlLFxuICAgICAgc2Nyb2xsWTogc2Nyb2xsWSAtIGRlbHRhWSAvIHpvb20udmFsdWUsXG4gICAgfSkpO1xuICB9KTtcblxuICBwcml2YXRlIGdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gICAgc2NhbGU6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudENsaWNrZWRJbnNpZGUgPSBnZXRFbGVtZW50Q29udGFpbmluZ1Bvc2l0aW9uKFxuICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gIWlzVGV4dEVsZW1lbnQoZWxlbWVudCkpLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudENsaWNrZWRJbnNpZGUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJYID1cbiAgICAgICAgZWxlbWVudENsaWNrZWRJbnNpZGUueCArIGVsZW1lbnRDbGlja2VkSW5zaWRlLndpZHRoIC8gMjtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJZID1cbiAgICAgICAgZWxlbWVudENsaWNrZWRJbnNpZGUueSArIGVsZW1lbnRDbGlja2VkSW5zaWRlLmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBkaXN0YW5jZVRvQ2VudGVyID0gTWF0aC5oeXBvdChcbiAgICAgICAgeCAtIGVsZW1lbnRDZW50ZXJYLFxuICAgICAgICB5IC0gZWxlbWVudENlbnRlclksXG4gICAgICApO1xuICAgICAgY29uc3QgaXNTbmFwcGVkVG9DZW50ZXIgPVxuICAgICAgICBkaXN0YW5jZVRvQ2VudGVyIDwgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQ7XG4gICAgICBpZiAoaXNTbmFwcGVkVG9DZW50ZXIpIHtcbiAgICAgICAgY29uc3QgeyB4OiB2aWV3cG9ydFgsIHk6IHZpZXdwb3J0WSB9ID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKFxuICAgICAgICAgIHsgc2NlbmVYOiBlbGVtZW50Q2VudGVyWCwgc2NlbmVZOiBlbGVtZW50Q2VudGVyWSB9LFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyB2aWV3cG9ydFgsIHZpZXdwb3J0WSwgZWxlbWVudENlbnRlclgsIGVsZW1lbnRDZW50ZXJZIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlUG9pbnRlciA9ICh4OiBudW1iZXIsIHk6IG51bWJlciwgYnV0dG9uOiBcInVwXCIgfCBcImRvd25cIikgPT4ge1xuICAgIGlmICgheCB8fCAheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0sXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBpZiAoaXNOYU4ocG9pbnRlci54KSB8fCBpc05hTihwb2ludGVyLnkpKSB7XG4gICAgICAvLyBzb21ldGltZXMgdGhlIHBvaW50ZXIgZ29lcyBvZmYgc2NyZWVuXG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5vblBvaW50ZXJVcGRhdGU/Lih7XG4gICAgICBwb2ludGVyLFxuICAgICAgYnV0dG9uLFxuICAgICAgcG9pbnRlcnNNYXA6IGdlc3R1cmUucG9pbnRlcnMsXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICBpZiAoIXRoaXMudW5tb3VudGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZSB9KTtcbiAgICB9XG4gIH0sIDMwMCk7XG5cbiAgcHJpdmF0ZSB1cGRhdGVET01SZWN0ID0gKGNiPzogKCkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgdG9wOiBvZmZzZXRUb3AsXG4gICAgICB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGg6IGN1cnJlbnRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjdXJyZW50SGVpZ2h0LFxuICAgICAgICBvZmZzZXRUb3A6IGN1cnJlbnRPZmZzZXRUb3AsXG4gICAgICAgIG9mZnNldExlZnQ6IGN1cnJlbnRPZmZzZXRMZWZ0LFxuICAgICAgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgd2lkdGggPT09IGN1cnJlbnRXaWR0aCAmJlxuICAgICAgICBoZWlnaHQgPT09IGN1cnJlbnRIZWlnaHQgJiZcbiAgICAgICAgb2Zmc2V0TGVmdCA9PT0gY3VycmVudE9mZnNldExlZnQgJiZcbiAgICAgICAgb2Zmc2V0VG9wID09PSBjdXJyZW50T2Zmc2V0VG9wXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgb2Zmc2V0TGVmdCxcbiAgICAgICAgICBvZmZzZXRUb3AsXG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHJlZnJlc2ggPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IC4uLnRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0Q2FudmFzT2Zmc2V0cygpOiBQaWNrPEFwcFN0YXRlLCBcIm9mZnNldFRvcFwiIHwgXCJvZmZzZXRMZWZ0XCI+IHtcbiAgICBpZiAodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICBjb25zdCBleGNhbGlkcmF3Q29udGFpbmVyID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldExlZnQ6IGxlZnQsXG4gICAgICAgIG9mZnNldFRvcDogdG9wLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldExlZnQ6IDAsXG4gICAgICBvZmZzZXRUb3A6IDAsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlTGFuZ3VhZ2UoKSB7XG4gICAgY29uc3QgY3VycmVudExhbmcgPVxuICAgICAgbGFuZ3VhZ2VzLmZpbmQoKGxhbmcpID0+IGxhbmcuY29kZSA9PT0gdGhpcy5wcm9wcy5sYW5nQ29kZSkgfHxcbiAgICAgIGRlZmF1bHRMYW5nO1xuICAgIGF3YWl0IHNldExhbmd1YWdlKGN1cnJlbnRMYW5nKTtcbiAgICB0aGlzLnNldEFwcFN0YXRlKHt9KTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVEVTVCBIT09LU1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBoOiB7XG4gICAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgICAgIHN0YXRlOiBBcHBTdGF0ZTtcbiAgICAgIHNldFN0YXRlOiBSZWFjdC5Db21wb25lbnQ8YW55LCBBcHBTdGF0ZT5bXCJzZXRTdGF0ZVwiXTtcbiAgICAgIGFwcDogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+O1xuICAgICAgaGlzdG9yeTogSGlzdG9yeTtcbiAgICB9O1xuICB9XG59XG5cbmlmIChcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5URVNUIHx8XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuREVWRUxPUE1FTlRcbikge1xuICB3aW5kb3cuaCA9IHdpbmRvdy5oIHx8ICh7fSBhcyBXaW5kb3dbXCJoXCJdKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cuaCwge1xuICAgIGVsZW1lbnRzOiB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcC5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgICAgIH0sXG4gICAgICBzZXQoZWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhlbGVtZW50cyk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgQXBwO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../components/App.tsx\n");
1636
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"useIsMobile\": () => (/* binding */ useIsMobile),\n/* harmony export */ \"useExcalidrawContainer\": () => (/* binding */ useExcalidrawContainer),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-runtime */ \"../../../node_modules/react/jsx-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ \"../../../node_modules/clsx/dist/clsx.m.js\");\n/* harmony import */ var browser_fs_access__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! browser-fs-access */ \"../../../node_modules/browser-fs-access/dist/index.js\");\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! nanoid */ \"../../../node_modules/nanoid/index.dev.js\");\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions */ \"../../actions/index.ts\");\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/actionHistory */ \"../../actions/actionHistory.tsx\");\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/manager */ \"../../actions/manager.tsx\");\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/register */ \"../../actions/register.ts\");\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../analytics */ \"../../analytics.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../data */ \"../../data/index.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/library */ \"../../data/library.ts\");\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../data/restore */ \"../../data/restore.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/binding */ \"../../element/binding.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../gesture */ \"../../gesture.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../history */ \"../../history.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer */ \"../../renderer/index.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../scene/zoom */ \"../../scene/zoom.ts\");\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../shapes */ \"../../shapes.tsx\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./ContextMenu */ \"../../components/ContextMenu.tsx\");\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./LayerUI */ \"../../components/LayerUI.tsx\");\n/* harmony import */ var _Stats__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Stats */ \"../../components/Stats.tsx\");\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Toast */ \"../../components/Toast.tsx\");\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \"../../actions/actionToggleViewMode.tsx\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst IsMobileContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext(false);\r\nconst useIsMobile = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(IsMobileContext);\r\nconst ExcalidrawContainerContext = react__WEBPACK_IMPORTED_MODULE_1___default().createContext({ container: null, id: null });\r\nconst useExcalidrawContainer = () => (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(ExcalidrawContainerContext);\r\nlet didTapTwice = false;\r\nlet tappedTwiceTimer = 0;\r\nlet cursorX = 0;\r\nlet cursorY = 0;\r\nlet isHoldingSpace = false;\r\nlet isPanning = false;\r\nlet isDraggingScrollBar = false;\r\nlet currentScrollBars = { horizontal: null, vertical: null };\r\nlet touchTimeout = 0;\r\nlet invalidateContextMenu = false;\r\nlet lastPointerUp = null;\r\nconst gesture = {\r\n pointers: new Map(),\r\n lastCenter: null,\r\n initialDistance: null,\r\n initialScale: null,\r\n};\r\nclass App extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {\r\n constructor(props) {\r\n var _a;\r\n super(props);\r\n this.canvas = null;\r\n this.rc = null;\r\n this.unmounted = false;\r\n this.isMobile = false;\r\n this.excalidrawContainerRef = react__WEBPACK_IMPORTED_MODULE_1___default().createRef();\r\n this.focusContainer = () => {\r\n var _a;\r\n if (this.props.autoFocus) {\r\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\r\n }\r\n };\r\n this.getSceneElementsIncludingDeleted = () => {\r\n return this.scene.getElementsIncludingDeleted();\r\n };\r\n this.getSceneElements = () => {\r\n return this.scene.getElements();\r\n };\r\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((actionResult) => {\r\n var _a, _b, _c, _d, _e, _f;\r\n if (this.unmounted || actionResult === false) {\r\n return;\r\n }\r\n let editingElement = null;\r\n if (actionResult.elements) {\r\n actionResult.elements.forEach((element) => {\r\n var _a;\r\n if (((_a = this.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id &&\r\n this.state.editingElement !== element &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\r\n editingElement = element;\r\n }\r\n });\r\n this.scene.replaceAllElements(actionResult.elements);\r\n if (actionResult.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n }\r\n if (actionResult.appState || editingElement) {\r\n if (actionResult.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\r\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\r\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\r\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || \"light\";\r\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : this.state.name;\r\n if (typeof this.props.viewModeEnabled !== \"undefined\") {\r\n viewModeEnabled = this.props.viewModeEnabled;\r\n }\r\n if (typeof this.props.zenModeEnabled !== \"undefined\") {\r\n zenModeEnabled = this.props.zenModeEnabled;\r\n }\r\n if (typeof this.props.gridModeEnabled !== \"undefined\") {\r\n gridSize = this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null;\r\n }\r\n if (typeof this.props.theme !== \"undefined\") {\r\n theme = this.props.theme;\r\n }\r\n if (typeof this.props.name !== \"undefined\") {\r\n name = this.props.name;\r\n }\r\n this.setState((state) => {\r\n var _a;\r\n // using Object.assign instead of spread to fool TS 4.2.2+ into\r\n // regarding the resulting type as not containing undefined\r\n // (which the following expression will never contain)\r\n return Object.assign(actionResult.appState || {}, {\r\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\r\n viewModeEnabled,\r\n zenModeEnabled,\r\n gridSize,\r\n theme,\r\n name,\r\n });\r\n }, () => {\r\n if (actionResult.syncHistory) {\r\n this.history.setCurrentState(this.state, this.scene.getElementsIncludingDeleted());\r\n }\r\n });\r\n }\r\n });\r\n // Lifecycle\r\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(() => {\r\n isHoldingSpace = false;\r\n this.setState({ isBindingEnabled: true });\r\n });\r\n this.onUnload = () => {\r\n this.onBlur();\r\n };\r\n this.disableEvent = (event) => {\r\n event.preventDefault();\r\n };\r\n this.onFontLoaded = () => {\r\n this.scene.getElementsIncludingDeleted().forEach((element) => {\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element)) {\r\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\r\n }\r\n });\r\n this.onSceneUpdated();\r\n };\r\n this.importLibraryFromUrl = (url, token) => __awaiter(this, void 0, void 0, function* () {\r\n if (window.location.hash.includes(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary)) {\r\n const hash = new URLSearchParams(window.location.hash.slice(1));\r\n hash.delete(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary);\r\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, `#${hash.toString()}`);\r\n }\r\n else if (window.location.search.includes(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary)) {\r\n const query = new URLSearchParams(window.location.search);\r\n query.delete(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary);\r\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, `?${query.toString()}`);\r\n }\r\n try {\r\n const request = yield fetch(decodeURIComponent(url));\r\n const blob = yield request.blob();\r\n const json = JSON.parse(yield blob.text());\r\n if (!(0,_data_json__WEBPACK_IMPORTED_MODULE_14__.isValidLibrary)(json)) {\r\n throw new Error();\r\n }\r\n if (token === this.id ||\r\n window.confirm((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\"alerts.confirmAddLibrary\", { numShapes: json.library.length }))) {\r\n yield this.library.importLibrary(blob);\r\n // hack to rerender the library items after import\r\n if (this.state.isLibraryOpen) {\r\n this.setState({ isLibraryOpen: false });\r\n }\r\n this.setState({ isLibraryOpen: true });\r\n }\r\n }\r\n catch (error) {\r\n window.alert((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\"alerts.errorLoadingLibrary\"));\r\n console.error(error);\r\n }\r\n finally {\r\n this.focusContainer();\r\n }\r\n });\r\n this.resetHistory = () => {\r\n this.history.clear();\r\n };\r\n /**\r\n * Resets scene & history.\r\n * ! Do not use to clear scene user action !\r\n */\r\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((opts) => {\r\n this.scene.replaceAllElements([]);\r\n this.setState((state) => (Object.assign(Object.assign({}, (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)()), { isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading, theme: this.state.theme })));\r\n this.resetHistory();\r\n });\r\n this.initializeScene = () => __awaiter(this, void 0, void 0, function* () {\r\n if (\"launchQueue\" in window && \"LaunchParams\" in window) {\r\n window.launchQueue.setConsumer((launchParams) => __awaiter(this, void 0, void 0, function* () {\r\n if (!launchParams.files.length) {\r\n return;\r\n }\r\n const fileHandle = launchParams.files[0];\r\n const blob = yield fileHandle.getFile();\r\n blob.handle = fileHandle;\r\n (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(blob, this.state, this.scene.getElementsIncludingDeleted())\r\n .then(({ elements, appState }) => this.syncActionResult({\r\n elements,\r\n appState: Object.assign(Object.assign({}, (appState || this.state)), { isLoading: false }),\r\n commitToHistory: true,\r\n }))\r\n .catch((error) => {\r\n this.setState({ isLoading: false, errorMessage: error.message });\r\n });\r\n }));\r\n }\r\n if (!this.state.isLoading) {\r\n this.setState({ isLoading: true });\r\n }\r\n let initialData = null;\r\n try {\r\n initialData = (yield this.props.initialData) || null;\r\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\r\n this.libraryItemsFromStorage = initialData.libraryItems;\r\n }\r\n }\r\n catch (error) {\r\n console.error(error);\r\n initialData = {\r\n appState: {\r\n errorMessage: error.message ||\r\n \"Encountered an error during importing or restoring scene data\",\r\n },\r\n };\r\n }\r\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restore)(initialData, null, null);\r\n scene.appState = Object.assign(Object.assign({}, scene.appState), { isLoading: false });\r\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\r\n scene.appState = Object.assign(Object.assign({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(scene.elements, Object.assign(Object.assign({}, scene.appState), { width: this.state.width, height: this.state.height, offsetTop: this.state.offsetTop, offsetLeft: this.state.offsetLeft }), null));\r\n }\r\n this.resetHistory();\r\n this.syncActionResult(Object.assign(Object.assign({}, scene), { commitToHistory: true }));\r\n const libraryUrl = \r\n // current\r\n new URLSearchParams(window.location.hash.slice(1)).get(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary) ||\r\n // legacy, kept for compat reasons\r\n new URLSearchParams(window.location.search).get(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary);\r\n if (libraryUrl) {\r\n yield this.importLibraryFromUrl(libraryUrl);\r\n }\r\n });\r\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(() => {\r\n this.scene\r\n .getElementsIncludingDeleted()\r\n .forEach((element) => (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element));\r\n this.setState({});\r\n });\r\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(() => {\r\n const { offsetTop, offsetLeft } = this.getCanvasOffsets();\r\n this.setState((state) => {\r\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\r\n return null;\r\n }\r\n return { offsetTop, offsetLeft };\r\n });\r\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.SCROLL_TIMEOUT);\r\n // Copy/paste\r\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n var _a;\r\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\r\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\r\n return;\r\n }\r\n this.cutAll();\r\n event.preventDefault();\r\n });\r\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n var _a;\r\n const isExcalidrawActive = (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\r\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\r\n return;\r\n }\r\n this.copyAll();\r\n event.preventDefault();\r\n });\r\n this.cutAll = () => {\r\n this.copyAll();\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected);\r\n };\r\n this.copyAll = () => {\r\n (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.copyToClipboard)(this.scene.getElements(), this.state);\r\n };\r\n this.onTapStart = (event) => {\r\n if (!didTapTwice) {\r\n didTapTwice = true;\r\n clearTimeout(tappedTwiceTimer);\r\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_12__.TAP_TWICE_TIMEOUT);\r\n return;\r\n }\r\n // insert text only if we tapped twice with a single finger\r\n // event.touches.length === 1 will also prevent inserting text when user's zooming\r\n if (didTapTwice && event.touches.length === 1) {\r\n const [touch] = event.touches;\r\n // @ts-ignore\r\n this.handleCanvasDoubleClick({\r\n clientX: touch.clientX,\r\n clientY: touch.clientY,\r\n });\r\n didTapTwice = false;\r\n clearTimeout(tappedTwiceTimer);\r\n }\r\n event.preventDefault();\r\n if (event.touches.length === 2) {\r\n this.setState({\r\n selectedElementIds: {},\r\n });\r\n }\r\n };\r\n this.onTapEnd = (event) => {\r\n if (event.touches.length > 0) {\r\n this.setState({\r\n previousSelectedElementIds: {},\r\n selectedElementIds: this.state.previousSelectedElementIds,\r\n });\r\n }\r\n };\r\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => __awaiter(this, void 0, void 0, function* () {\r\n var _b;\r\n // #686\r\n const target = document.activeElement;\r\n const isExcalidrawActive = (_b = this.excalidrawContainerRef.current) === null || _b === void 0 ? void 0 : _b.contains(target);\r\n if (!isExcalidrawActive) {\r\n return;\r\n }\r\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\r\n if (\r\n // if no ClipboardEvent supplied, assume we're pasting via contextMenu\r\n // thus these checks don't make sense\r\n event &&\r\n (!(elementUnderCursor instanceof HTMLCanvasElement) ||\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(target))) {\r\n return;\r\n }\r\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.parseClipboard)(event);\r\n if (this.props.onPaste) {\r\n try {\r\n if ((yield this.props.onPaste(data, event)) === false) {\r\n return;\r\n }\r\n }\r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n if (data.errorMessage) {\r\n this.setState({ errorMessage: data.errorMessage });\r\n }\r\n else if (data.spreadsheet) {\r\n this.setState({\r\n pasteDialog: {\r\n data: data.spreadsheet,\r\n shown: true,\r\n },\r\n });\r\n }\r\n else if (data.elements) {\r\n this.addElementsFromPasteOrLibrary({\r\n elements: data.elements,\r\n position: \"cursor\",\r\n });\r\n }\r\n else if (data.text) {\r\n this.addTextFromPaste(data.text);\r\n }\r\n this.selectShapeTool(\"selection\");\r\n event === null || event === void 0 ? void 0 : event.preventDefault();\r\n }));\r\n this.addElementsFromPasteOrLibrary = (opts) => {\r\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreElements)(opts.elements, null);\r\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(elements);\r\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minX, maxX) / 2;\r\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minY, maxY) / 2;\r\n const clientX = typeof opts.position === \"object\"\r\n ? opts.position.clientX\r\n : opts.position === \"cursor\"\r\n ? cursorX\r\n : this.state.width / 2 + this.state.offsetLeft;\r\n const clientY = typeof opts.position === \"object\"\r\n ? opts.position.clientY\r\n : opts.position === \"cursor\"\r\n ? cursorY\r\n : this.state.height / 2 + this.state.offsetTop;\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({ clientX, clientY }, this.state);\r\n const dx = x - elementsCenterX;\r\n const dy = y - elementsCenterY;\r\n const groupIdMap = new Map();\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(dx, dy, this.state.gridSize);\r\n const oldIdToDuplicatedId = new Map();\r\n const newElements = elements.map((element) => {\r\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(this.state.editingGroupId, groupIdMap, element, {\r\n x: element.x + gridX - minX,\r\n y: element.y + gridY - minY,\r\n });\r\n oldIdToDuplicatedId.set(element.id, newElement.id);\r\n return newElement;\r\n });\r\n const nextElements = [\r\n ...this.scene.getElementsIncludingDeleted(),\r\n ...newElements,\r\n ];\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\r\n this.scene.replaceAllElements(nextElements);\r\n this.history.resumeRecording();\r\n this.setState((0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, this.state), { isLibraryOpen: false, selectedElementIds: newElements.reduce((map, element) => {\r\n map[element.id] = true;\r\n return map;\r\n }, {}), selectedGroupIds: {} }), this.scene.getElements()));\r\n this.selectShapeTool(\"selection\");\r\n };\r\n // Collaboration\r\n this.setAppState = (obj) => {\r\n this.setState(obj);\r\n };\r\n this.removePointer = (event) => {\r\n // remove touch handler for context menu on touch devices\r\n if (event.pointerType === \"touch\" && touchTimeout) {\r\n clearTimeout(touchTimeout);\r\n touchTimeout = 0;\r\n invalidateContextMenu = false;\r\n }\r\n gesture.pointers.delete(event.pointerId);\r\n };\r\n this.toggleLock = () => {\r\n this.setState((prevState) => {\r\n return {\r\n elementLocked: !prevState.elementLocked,\r\n elementType: prevState.elementLocked\r\n ? \"selection\"\r\n : prevState.elementType,\r\n };\r\n });\r\n };\r\n this.toggleZenMode = () => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode);\r\n };\r\n this.toggleStats = () => {\r\n if (!this.state.showStats) {\r\n (0,_analytics__WEBPACK_IMPORTED_MODULE_9__.trackEvent)(\"dialog\", \"stats\");\r\n }\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats);\r\n };\r\n this.scrollToContent = (target = this.scene.getElements()) => {\r\n this.setState(Object.assign({}, (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(Array.isArray(target) ? target : [target], this.state, this.canvas)));\r\n };\r\n this.zoomToFit = (target = this.scene.getElements(), maxZoom = 1, //null will zoom to max based on viewport\r\n margin = 0.03) => {\r\n if (!target)\r\n target = this.scene.getElements();\r\n if (target.length === 0)\r\n maxZoom = 1;\r\n this.setState((0,_actions__WEBPACK_IMPORTED_MODULE_5__.zoomToFitElements)(target, this.state, false, maxZoom, margin).appState);\r\n };\r\n this.clearToast = () => {\r\n this.setState({ toastMessage: null });\r\n };\r\n this.setToastMessage = (toastMessage) => {\r\n this.setState({ toastMessage });\r\n };\r\n this.restoreFileFromShare = () => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n const webShareTargetCache = yield caches.open(\"web-share-target\");\r\n const file = yield webShareTargetCache.match(\"shared-file\");\r\n if (file) {\r\n const blob = yield file.blob();\r\n this.loadFileToCanvas(blob);\r\n yield webShareTargetCache.delete(\"shared-file\");\r\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, window.location.pathname);\r\n }\r\n }\r\n catch (error) {\r\n this.setState({ errorMessage: error.message });\r\n }\r\n });\r\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((sceneData) => {\r\n if (sceneData.commitToHistory) {\r\n this.history.resumeRecording();\r\n }\r\n if (sceneData.appState) {\r\n this.setState(sceneData.appState);\r\n }\r\n if (sceneData.elements) {\r\n this.scene.replaceAllElements(sceneData.elements);\r\n }\r\n if (sceneData.collaborators) {\r\n this.setState({ collaborators: sceneData.collaborators });\r\n }\r\n });\r\n this.onSceneUpdated = () => {\r\n this.setState({});\r\n };\r\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n cursorX = event.clientX;\r\n cursorY = event.clientY;\r\n });\r\n // Input handling\r\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n // normalize `event.key` when CapsLock is pressed #2372\r\n if (\"Proxy\" in window &&\r\n ((!event.shiftKey && /^[A-Z]$/.test(event.key)) ||\r\n (event.shiftKey && /^[a-z]$/.test(event.key)))) {\r\n event = new Proxy(event, {\r\n get(ev, prop) {\r\n const value = ev[prop];\r\n if (typeof value === \"function\") {\r\n // fix for Proxies hijacking `this`\r\n return value.bind(ev);\r\n }\r\n return prop === \"key\"\r\n ? // CapsLock inverts capitalization based on ShiftKey, so invert\r\n // it back\r\n event.shiftKey\r\n ? ev.key.toUpperCase()\r\n : ev.key.toLowerCase()\r\n : value;\r\n },\r\n });\r\n }\r\n if (((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target) && event.key !== _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ESCAPE) ||\r\n // case: using arrows to move between buttons\r\n ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isInputLike)(event.target))) {\r\n return;\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.QUESTION_MARK) {\r\n this.setState({\r\n showHelpDialog: true,\r\n });\r\n }\r\n if (this.actionManager.handleKeyDown(event)) {\r\n return;\r\n }\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && this.state.isBindingEnabled) {\r\n this.setState({ isBindingEnabled: false });\r\n }\r\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_27__.CODES.NINE) {\r\n this.setState({ isLibraryOpen: !this.state.isLibraryOpen });\r\n }\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\r\n const step = (this.state.gridSize &&\r\n (event.shiftKey\r\n ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT\r\n : this.state.gridSize)) ||\r\n (event.shiftKey\r\n ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_SHIFT_TRANSLATE_AMOUNT\r\n : _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT);\r\n const selectedElements = this.scene\r\n .getElements()\r\n .filter((element) => this.state.selectedElementIds[element.id]);\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_LEFT) {\r\n offsetX = -step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_RIGHT) {\r\n offsetX = step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_UP) {\r\n offsetY = -step;\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_DOWN) {\r\n offsetY = step;\r\n }\r\n selectedElements.forEach((element) => {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\r\n x: element.x + offsetX,\r\n y: element.y + offsetY,\r\n });\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element, {\r\n simultaneouslyUpdated: selectedElements,\r\n });\r\n });\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n event.preventDefault();\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ENTER) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1 &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\r\n if (!this.state.editingLinearElement ||\r\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\r\n this.history.resumeRecording();\r\n this.setState({\r\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], this.scene),\r\n });\r\n }\r\n }\r\n else if (selectedElements.length === 1 &&\r\n !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\r\n const selectedElement = selectedElements[0];\r\n this.startTextEditing({\r\n sceneX: selectedElement.x + selectedElement.width / 2,\r\n sceneY: selectedElement.y + selectedElement.height / 2,\r\n });\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n else if (!event.ctrlKey &&\r\n !event.altKey &&\r\n !event.metaKey &&\r\n this.state.draggingElement === null) {\r\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_34__.findShapeByKey)(event.key);\r\n if (shape) {\r\n this.selectShapeTool(shape);\r\n }\r\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.Q) {\r\n this.toggleLock();\r\n }\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE && gesture.pointers.size === 0) {\r\n isHoldingSpace = true;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (this.state.elementType === \"selection\" &&\r\n !selectedElements.length) {\r\n return;\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G &&\r\n ((0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(this.state.elementType) ||\r\n selectedElements.some((element) => (0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(element.type)))) {\r\n this.setState({ openPopup: \"backgroundColorPicker\" });\r\n }\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\r\n this.setState({ openPopup: \"strokeColorPicker\" });\r\n }\r\n }\r\n });\r\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE) {\r\n if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\r\n }\r\n else if (this.state.elementType === \"selection\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, this.state.elementType);\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n isHoldingSpace = false;\r\n }\r\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !this.state.isBindingEnabled) {\r\n this.setState({ isBindingEnabled: true });\r\n }\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state)\r\n ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements)(selectedElements)\r\n : (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)(selectedElements);\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n });\r\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n this.setState({\r\n selectedElementIds: {},\r\n });\r\n gesture.initialScale = this.state.zoom.value;\r\n });\r\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n // onGestureChange only has zoom factor but not the center.\r\n // If we're on iPad or iPhone, then we recognize multi-touch and will\r\n // zoom in at the right location on the touchMove handler already.\r\n // On Macbook, we don't have those events so will zoom in at the\r\n // current location instead.\r\n if (gesture.pointers.size === 2) {\r\n return;\r\n }\r\n const initialScale = gesture.initialScale;\r\n if (initialScale) {\r\n this.setState(({ zoom, offsetLeft, offsetTop }) => ({\r\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * event.scale), zoom, { left: offsetLeft, top: offsetTop }, { x: cursorX, y: cursorY }),\r\n }));\r\n }\r\n });\r\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n this.setState({\r\n previousSelectedElementIds: {},\r\n selectedElementIds: this.state.previousSelectedElementIds,\r\n });\r\n gesture.initialScale = null;\r\n });\r\n this.startTextEditing = ({ sceneX, sceneY, insertAtParentCenter = true, }) => {\r\n const existingTextElement = this.getTextElementAtPosition(sceneX, sceneY);\r\n const parentCenterPosition = insertAtParentCenter &&\r\n this.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, this.state, this.canvas, window.devicePixelRatio);\r\n const element = existingTextElement\r\n ? existingTextElement\r\n : (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\r\n x: parentCenterPosition\r\n ? parentCenterPosition.elementCenterX\r\n : sceneX,\r\n y: parentCenterPosition\r\n ? parentCenterPosition.elementCenterY\r\n : sceneY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n text: \"\",\r\n rawText: \"\",\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n textAlign: parentCenterPosition\r\n ? \"center\"\r\n : this.state.currentItemTextAlign,\r\n verticalAlign: parentCenterPosition\r\n ? \"middle\"\r\n : _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN,\r\n });\r\n this.setState({ editingElement: element });\r\n if (existingTextElement) {\r\n // if text element is no longer centered to a container, reset\r\n // verticalAlign to default because it's currently internal-only\r\n if (!parentCenterPosition || element.textAlign !== \"center\") {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, { verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN });\r\n }\r\n }\r\n else {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n // case: creating new text not centered to parent elemenent → offset Y\r\n // so that the text is centered to cursor position\r\n if (!parentCenterPosition) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\r\n y: element.y - element.baseline / 2,\r\n });\r\n }\r\n }\r\n this.setState({\r\n editingElement: element,\r\n });\r\n this.handleTextWysiwyg(element, {\r\n isExistingElement: !!existingTextElement,\r\n });\r\n };\r\n this.handleCanvasDoubleClick = (event) => {\r\n // case: double-clicking with arrow/line tool selected would both create\r\n // text and enter multiElement mode\r\n if (this.state.multiElement) {\r\n return;\r\n }\r\n // we should only be able to double click when mode is selection\r\n if (this.state.elementType !== \"selection\") {\r\n return;\r\n }\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\r\n if (!this.state.editingLinearElement ||\r\n this.state.editingLinearElement.elementId !== selectedElements[0].id) {\r\n this.history.resumeRecording();\r\n this.setState({\r\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], this.scene),\r\n });\r\n }\r\n return;\r\n }\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\r\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIds)(this.state);\r\n if (selectedGroupIds.length > 0) {\r\n const hitElement = this.getElementAtPosition(sceneX, sceneY);\r\n const selectedGroupId = hitElement &&\r\n (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIdForElement)(hitElement, this.state.selectedGroupIds);\r\n if (selectedGroupId) {\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { editingGroupId: selectedGroupId, selectedElementIds: { [hitElement.id]: true }, selectedGroupIds: {} }), this.scene.getElements()));\r\n return;\r\n }\r\n }\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !this.state.viewModeEnabled) {\r\n this.startTextEditing({\r\n sceneX,\r\n sceneY,\r\n insertAtParentCenter: !event.altKey,\r\n });\r\n }\r\n };\r\n this.handleCanvasPointerMove = (event) => {\r\n this.savePointer(event.clientX, event.clientY, this.state.cursorButton);\r\n if (gesture.pointers.has(event.pointerId)) {\r\n gesture.pointers.set(event.pointerId, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n }\r\n const initialScale = gesture.initialScale;\r\n if (gesture.pointers.size === 2 &&\r\n gesture.lastCenter &&\r\n initialScale &&\r\n gesture.initialDistance) {\r\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\r\n const deltaX = center.x - gesture.lastCenter.x;\r\n const deltaY = center.y - gesture.lastCenter.y;\r\n gesture.lastCenter = center;\r\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\r\n const scaleFactor = distance / gesture.initialDistance;\r\n this.setState(({ zoom, scrollX, scrollY, offsetLeft, offsetTop }) => ({\r\n scrollX: scrollX + deltaX / zoom.value,\r\n scrollY: scrollY + deltaY / zoom.value,\r\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * scaleFactor), zoom, { left: offsetLeft, top: offsetTop }, center),\r\n shouldCacheIgnoreZoom: true,\r\n }));\r\n this.resetShouldCacheIgnoreZoomDebounced();\r\n }\r\n else {\r\n gesture.lastCenter = gesture.initialDistance = gesture.initialScale = null;\r\n }\r\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\r\n return;\r\n }\r\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop);\r\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\r\n if (!this.state.draggingElement && !this.state.multiElement) {\r\n if (isOverScrollBar) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, this.state.elementType);\r\n }\r\n }\r\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\r\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\r\n if (this.state.editingLinearElement &&\r\n !this.state.editingLinearElement.isDragging) {\r\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, this.state.editingLinearElement, this.state.gridSize);\r\n if (editingLinearElement !== this.state.editingLinearElement) {\r\n this.setState({ editingLinearElement });\r\n }\r\n if (editingLinearElement.lastUncommittedPoint != null) {\r\n this.maybeSuggestBindingAtCursor(scenePointer);\r\n }\r\n else {\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElementType)(this.state.elementType)) {\r\n // Hovering with a selected tool or creating new linear element via click\r\n // and point\r\n const { draggingElement } = this.state;\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\r\n this.maybeSuggestBindingForLinearElementAtCursor(draggingElement, \"end\", scenePointer, this.state.startBoundElement);\r\n }\r\n else {\r\n this.maybeSuggestBindingAtCursor(scenePointer);\r\n }\r\n }\r\n if (this.state.multiElement) {\r\n const { multiElement } = this.state;\r\n const { x: rx, y: ry } = multiElement;\r\n const { points, lastCommittedPoint } = multiElement;\r\n const lastPoint = points[points.length - 1];\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, this.state.elementType);\r\n if (lastPoint === lastCommittedPoint) {\r\n // if we haven't yet created a temp point and we're beyond commit-zone\r\n // threshold, add a point\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\r\n points: [...points, [scenePointerX - rx, scenePointerY - ry]],\r\n });\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\r\n // in this branch, we're inside the commit zone, and no uncommitted\r\n // point exists. Thus do nothing (don't add/remove points).\r\n }\r\n }\r\n else if (points.length > 2 &&\r\n lastCommittedPoint &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\r\n points: points.slice(0, -1),\r\n });\r\n }\r\n else {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(points, this.state.zoom.value)) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\r\n }\r\n // update last uncommitted point\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\r\n points: [\r\n ...points.slice(0, -1),\r\n [scenePointerX - rx, scenePointerY - ry],\r\n ],\r\n });\r\n }\r\n return;\r\n }\r\n const hasDeselectedButton = Boolean(event.buttons);\r\n if (hasDeselectedButton ||\r\n (this.state.elementType !== \"selection\" &&\r\n this.state.elementType !== \"text\")) {\r\n return;\r\n }\r\n const elements = this.scene.getElements();\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, this.state);\r\n if (selectedElements.length === 1 &&\r\n !isOverScrollBar &&\r\n !this.state.editingLinearElement) {\r\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, this.state, scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\r\n if (elementWithTransformHandleType &&\r\n elementWithTransformHandleType.transformHandleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)(elementWithTransformHandleType));\r\n return;\r\n }\r\n }\r\n else if (selectedElements.length > 1 && !isOverScrollBar) {\r\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, this.state.zoom, event.pointerType);\r\n if (transformHandleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\r\n transformHandleType,\r\n }));\r\n return;\r\n }\r\n }\r\n const hitElement = this.getElementAtPosition(scenePointer.x, scenePointer.y);\r\n if (this.state.elementType === \"text\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\r\n }\r\n else if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\r\n }\r\n else if (isOverScrollBar) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\r\n }\r\n else if (\r\n // if using cmd/ctrl, we're not dragging\r\n !event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] &&\r\n (hitElement ||\r\n this.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements))) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\r\n }\r\n };\r\n // set touch moving for mobile context menu\r\n this.handleTouchMove = (event) => {\r\n invalidateContextMenu = true;\r\n };\r\n this.handleCanvasPointerDown = (event) => {\r\n // remove any active selection when we start to interact with canvas\r\n // (mainly, we care about removing selection outside the component which\r\n // would prevent our copy handling otherwise)\r\n const selection = document.getSelection();\r\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\r\n selection.removeAllRanges();\r\n }\r\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\r\n this.maybeCleanupAfterMissingPointerUp(event);\r\n if (isPanning) {\r\n return;\r\n }\r\n this.setState({\r\n lastPointerDownWith: event.pointerType,\r\n cursorButton: \"down\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"down\");\r\n if (this.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\r\n return;\r\n }\r\n // only handle left mouse button or touch\r\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN &&\r\n event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.TOUCH) {\r\n return;\r\n }\r\n this.updateGestureOnPointerDown(event);\r\n // don't select while panning\r\n if (gesture.pointers.size > 1) {\r\n return;\r\n }\r\n // State for the duration of a pointer interaction, which starts with a\r\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\r\n const pointerDownState = this.initialPointerDownState(event);\r\n if (this.handleDraggingScrollBar(event, pointerDownState)) {\r\n return;\r\n }\r\n this.clearSelectionIfNotUsingSelection();\r\n this.updateBindingEnabledOnPointerMove(event);\r\n if (this.handleSelectionOnPointerDown(event, pointerDownState)) {\r\n return;\r\n }\r\n if (this.state.elementType === \"text\") {\r\n this.handleTextOnPointerDown(event, pointerDownState);\r\n return;\r\n }\r\n else if (this.state.elementType === \"arrow\" ||\r\n this.state.elementType === \"line\") {\r\n this.handleLinearElementOnPointerDown(event, this.state.elementType, pointerDownState);\r\n }\r\n else if (this.state.elementType === \"freedraw\") {\r\n this.handleFreeDrawElementOnPointerDown(event, this.state.elementType, pointerDownState);\r\n }\r\n else {\r\n this.createGenericElementOnPointerDown(this.state.elementType, pointerDownState);\r\n }\r\n const onPointerMove = this.onPointerMoveFromPointerDownHandler(pointerDownState);\r\n const onPointerUp = this.onPointerUpFromPointerDownHandler(pointerDownState);\r\n const onKeyDown = this.onKeyDownFromPointerDownHandler(pointerDownState);\r\n const onKeyUp = this.onKeyUpFromPointerDownHandler(pointerDownState);\r\n lastPointerUp = onPointerUp;\r\n if (!this.state.viewModeEnabled) {\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, onKeyDown);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, onKeyUp);\r\n pointerDownState.eventListeners.onMove = onPointerMove;\r\n pointerDownState.eventListeners.onUp = onPointerUp;\r\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\r\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\r\n }\r\n };\r\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = (event) => {\r\n // deal with opening context menu on touch devices\r\n if (event.pointerType === \"touch\") {\r\n invalidateContextMenu = false;\r\n if (touchTimeout) {\r\n // If there's already a touchTimeout, this means that there's another\r\n // touch down and we are doing another touch, so we shouldn't open the\r\n // context menu.\r\n invalidateContextMenu = true;\r\n }\r\n else {\r\n // open the context menu with the first touch's clientX and clientY\r\n // if the touch is not moving\r\n touchTimeout = window.setTimeout(() => {\r\n touchTimeout = 0;\r\n if (!invalidateContextMenu) {\r\n this.handleCanvasContextMenu(event);\r\n }\r\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.TOUCH_CTX_MENU_TIMEOUT);\r\n }\r\n }\r\n };\r\n // Returns whether the event is a panning\r\n this.handleCanvasPanUsingWheelOrSpaceDrag = (event) => {\r\n if (!(gesture.pointers.size === 0 &&\r\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.WHEEL ||\r\n (event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN && isHoldingSpace) ||\r\n this.state.viewModeEnabled))) {\r\n return false;\r\n }\r\n isPanning = true;\r\n let nextPastePrevented = false;\r\n const isLinux = /Linux/.test(window.navigator.platform);\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\r\n let { clientX: lastX, clientY: lastY } = event;\r\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n const deltaX = lastX - event.clientX;\r\n const deltaY = lastY - event.clientY;\r\n lastX = event.clientX;\r\n lastY = event.clientY;\r\n /*\r\n * Prevent paste event if we move while middle clicking on Linux.\r\n * See issue #1383.\r\n */\r\n if (isLinux &&\r\n !nextPastePrevented &&\r\n (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\r\n nextPastePrevented = true;\r\n /* Prevent the next paste event */\r\n const preventNextPaste = (event) => {\r\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\r\n event.stopPropagation();\r\n };\r\n /*\r\n * Reenable next paste in case of disabled middle click paste for\r\n * any reason:\r\n * - rigth click paste\r\n * - empty clipboard\r\n */\r\n const enableNextPaste = () => {\r\n setTimeout(() => {\r\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\r\n }, 100);\r\n };\r\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\r\n }\r\n this.setState({\r\n scrollX: this.state.scrollX - deltaX / this.state.zoom.value,\r\n scrollY: this.state.scrollY - deltaY / this.state.zoom.value,\r\n });\r\n });\r\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((lastPointerUp = () => {\r\n lastPointerUp = null;\r\n isPanning = false;\r\n if (!isHoldingSpace) {\r\n if (this.state.viewModeEnabled) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\r\n }\r\n else {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, this.state.elementType);\r\n }\r\n }\r\n this.setState({\r\n cursorButton: \"up\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"up\");\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\r\n }));\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove, {\r\n passive: true,\r\n });\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\r\n return true;\r\n };\r\n this.clearSelectionIfNotUsingSelection = () => {\r\n if (this.state.elementType !== \"selection\") {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n };\r\n /**\r\n * @returns whether the pointer event has been completely handled\r\n */\r\n this.handleSelectionOnPointerDown = (event, pointerDownState) => {\r\n var _a;\r\n if (this.state.elementType === \"selection\") {\r\n const elements = this.scene.getElements();\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, this.state);\r\n if (selectedElements.length === 1 && !this.state.editingLinearElement) {\r\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, this.state, pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\r\n if (elementWithTransformHandleType != null) {\r\n this.setState({\r\n resizingElement: elementWithTransformHandleType.element,\r\n });\r\n pointerDownState.resize.handleType =\r\n elementWithTransformHandleType.transformHandleType;\r\n }\r\n }\r\n else if (selectedElements.length > 1) {\r\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, this.state.zoom, event.pointerType);\r\n }\r\n if (pointerDownState.resize.handleType) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\r\n transformHandleType: pointerDownState.resize.handleType,\r\n }));\r\n pointerDownState.resize.isResizing = true;\r\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\r\n if (selectedElements.length === 1 &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0]) &&\r\n selectedElements[0].points.length === 2) {\r\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\r\n }\r\n }\r\n else {\r\n if (this.state.editingLinearElement) {\r\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerDown(event, this.state, (appState) => this.setState(appState), this.history, pointerDownState.origin);\r\n if (ret.hitElement) {\r\n pointerDownState.hit.element = ret.hitElement;\r\n }\r\n if (ret.didAddPoint) {\r\n return true;\r\n }\r\n }\r\n // hitElement may already be set above, so check first\r\n pointerDownState.hit.element =\r\n (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : this.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\r\n // For overlapped elements one position may hit\r\n // multiple elements\r\n pointerDownState.hit.allHitElements = this.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\r\n const hitElement = pointerDownState.hit.element;\r\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\r\n if ((hitElement === null || !someHitElementIsSelected) &&\r\n !event.shiftKey &&\r\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n this.clearSelection(hitElement);\r\n }\r\n // If we click on something\r\n if (hitElement != null) {\r\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\r\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD]) {\r\n if (!this.state.selectedElementIds[hitElement.id]) {\r\n pointerDownState.hit.wasAddedToSelection = true;\r\n }\r\n this.setState((prevState) => (Object.assign(Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.editGroupForSelectedElement)(prevState, hitElement)), { previousSelectedElementIds: this.state.selectedElementIds })));\r\n // mark as not completely handled so as to allow dragging etc.\r\n return false;\r\n }\r\n // deselect if item is selected\r\n // if shift is not clicked, this will always return true\r\n // otherwise, it will trigger selection based on current\r\n // state of the box\r\n if (!this.state.selectedElementIds[hitElement.id]) {\r\n // if we are currently editing a group, exiting editing mode and deselect the group.\r\n if (this.state.editingGroupId &&\r\n !(0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, this.state.editingGroupId)) {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n // Add hit element to selection. At this point if we're not holding\r\n // SHIFT the previously selected element(s) were deselected above\r\n // (make sure you use setState updater to use latest state)\r\n if (!someHitElementIsSelected &&\r\n !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n this.setState((prevState) => {\r\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: true }) }), this.scene.getElements());\r\n });\r\n pointerDownState.hit.wasAddedToSelection = true;\r\n }\r\n }\r\n }\r\n this.setState({\r\n previousSelectedElementIds: this.state.selectedElementIds,\r\n });\r\n }\r\n }\r\n return false;\r\n };\r\n this.handleTextOnPointerDown = (event, pointerDownState) => {\r\n var _a;\r\n // if we're currently still editing text, clicking outside\r\n // should only finalize it, not create another (irrespective\r\n // of state.elementLocked)\r\n if (((_a = this.state.editingElement) === null || _a === void 0 ? void 0 : _a.type) === \"text\") {\r\n return;\r\n }\r\n this.startTextEditing({\r\n sceneX: pointerDownState.origin.x,\r\n sceneY: pointerDownState.origin.y,\r\n insertAtParentCenter: !event.altKey,\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n if (!this.state.elementLocked) {\r\n this.setState({\r\n elementType: \"selection\",\r\n });\r\n }\r\n };\r\n this.handleFreeDrawElementOnPointerDown = (event, elementType, pointerDownState) => {\r\n // Begin a mark capture. This does not have to update state yet.\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\r\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.newFreeDrawElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n simulatePressure: event.pressure === 0.5,\r\n });\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\r\n }));\r\n const pressures = element.simulatePressure\r\n ? element.pressures\r\n : [...element.pressures, event.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\r\n points: [[0, 0]],\r\n pressures,\r\n });\r\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n draggingElement: element,\r\n editingElement: element,\r\n startBoundElement: boundElement,\r\n suggestedBindings: [],\r\n });\r\n };\r\n this.handleLinearElementOnPointerDown = (event, elementType, pointerDownState) => {\r\n if (this.state.multiElement) {\r\n const { multiElement } = this.state;\r\n // finalize if completing a loop\r\n if (multiElement.type === \"line\" &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(multiElement.points, this.state.zoom.value)) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\r\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\r\n return;\r\n }\r\n const { x: rx, y: ry, lastCommittedPoint } = multiElement;\r\n // clicking inside commit zone → finalize arrow\r\n if (multiElement.points.length > 1 &&\r\n lastCommittedPoint &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\r\n return;\r\n }\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [multiElement.id]: true }),\r\n }));\r\n // clicking outside commit zone → update reference for last committed\r\n // point\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\r\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\r\n });\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(this.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\r\n }\r\n else {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\r\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\r\n If so, we want it to be null for start and \"arrow\" for end. If the linear item is not\r\n an arrow, we want it to be null for both. Otherwise, we want it to use the\r\n values from appState. */\r\n const { currentItemStartArrowhead, currentItemEndArrowhead } = this.state;\r\n const [startArrowhead, endArrowhead] = elementType === \"arrow\"\r\n ? [currentItemStartArrowhead, currentItemEndArrowhead]\r\n : [null, null];\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newLinearElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemLinearStrokeSharpness,\r\n startArrowhead,\r\n endArrowhead,\r\n });\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: false }),\r\n }));\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\r\n points: [...element.points, [0, 0]],\r\n });\r\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, this.scene);\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n draggingElement: element,\r\n editingElement: element,\r\n startBoundElement: boundElement,\r\n suggestedBindings: [],\r\n });\r\n }\r\n };\r\n this.createGenericElementOnPointerDown = (elementType, pointerDownState) => {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, this.state.gridSize);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newElement)({\r\n type: elementType,\r\n x: gridX,\r\n y: gridY,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n });\r\n if (element.type === \"selection\") {\r\n this.setState({\r\n selectionElement: element,\r\n draggingElement: element,\r\n });\r\n }\r\n else {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({\r\n multiElement: null,\r\n draggingElement: element,\r\n editingElement: element,\r\n });\r\n }\r\n };\r\n this.updateBindingEnabledOnPointerMove = (event) => {\r\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.shouldEnableBindingForPointerEvent)(event);\r\n if (this.state.isBindingEnabled !== shouldEnableBinding) {\r\n this.setState({ isBindingEnabled: shouldEnableBinding });\r\n }\r\n };\r\n this.maybeSuggestBindingAtCursor = (pointerCoords) => {\r\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerCoords, this.scene);\r\n this.setState({\r\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : [],\r\n });\r\n };\r\n this.maybeSuggestBindingForLinearElementAtCursor = (linearElement, startOrEnd, pointerCoords, \r\n // During line creation the start binding hasn't been written yet\r\n // into `linearElement`\r\n oppositeBindingBoundElement) => {\r\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerCoords, this.scene);\r\n this.setState({\r\n suggestedBindings: hoveredBindableElement != null &&\r\n !(0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)\r\n ? [hoveredBindableElement]\r\n : [],\r\n });\r\n };\r\n this.handleCanvasRef = (canvas) => {\r\n var _a, _b, _c;\r\n // canvas is null when unmounting\r\n if (canvas !== null) {\r\n this.canvas = canvas;\r\n this.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_2__.default.canvas(this.canvas);\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, this.handleWheel, {\r\n passive: false,\r\n });\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, this.onTapStart);\r\n this.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, this.onTapEnd);\r\n }\r\n else {\r\n (_a = this.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, this.handleWheel);\r\n (_b = this.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, this.onTapStart);\r\n (_c = this.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, this.onTapEnd);\r\n }\r\n };\r\n this.handleAppOnDrop = (event) => __awaiter(this, void 0, void 0, function* () {\r\n var _c, _d;\r\n try {\r\n if (this.props.onDrop) {\r\n try {\r\n if ((yield this.props.onDrop(event)) === false) {\r\n return;\r\n }\r\n }\r\n catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n const file = event.dataTransfer.files[0];\r\n if ((file === null || file === void 0 ? void 0 : file.type) === \"image/png\" || (file === null || file === void 0 ? void 0 : file.type) === \"image/svg+xml\") {\r\n if (browser_fs_access__WEBPACK_IMPORTED_MODULE_4__.supported) {\r\n try {\r\n // This will only work as of Chrome 86,\r\n // but can be safely ignored on older releases.\r\n const item = event.dataTransfer.items[0];\r\n file.handle = yield item.getAsFileSystemHandle();\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.message);\r\n }\r\n }\r\n const { elements, appState } = yield (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted());\r\n this.syncActionResult({\r\n elements,\r\n appState: Object.assign(Object.assign({}, (appState || this.state)), { isLoading: false }),\r\n commitToHistory: true,\r\n });\r\n return;\r\n }\r\n }\r\n catch (error) {\r\n return this.setState({\r\n isLoading: false,\r\n errorMessage: error.message,\r\n });\r\n }\r\n const libraryShapes = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib);\r\n if (libraryShapes !== \"\") {\r\n this.addElementsFromPasteOrLibrary({\r\n elements: JSON.parse(libraryShapes),\r\n position: event,\r\n });\r\n return;\r\n }\r\n const file = (_c = event.dataTransfer) === null || _c === void 0 ? void 0 : _c.files[0];\r\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib ||\r\n ((_d = file === null || file === void 0 ? void 0 : file.name) === null || _d === void 0 ? void 0 : _d.endsWith(\".excalidrawlib\"))) {\r\n this.library\r\n .importLibrary(file)\r\n .then(() => {\r\n // Close and then open to get the libraries updated\r\n this.setState({ isLibraryOpen: false });\r\n this.setState({ isLibraryOpen: true });\r\n })\r\n .catch((error) => this.setState({ isLoading: false, errorMessage: error.message }));\r\n // default: assume an Excalidraw file regardless of extension/MimeType\r\n }\r\n else {\r\n this.setState({ isLoading: true });\r\n if (browser_fs_access__WEBPACK_IMPORTED_MODULE_4__.supported) {\r\n try {\r\n // This will only work as of Chrome 86,\r\n // but can be safely ignored on older releases.\r\n const item = event.dataTransfer.items[0];\r\n file.handle = yield item.getAsFileSystemHandle();\r\n }\r\n catch (error) {\r\n console.warn(error.name, error.message);\r\n }\r\n }\r\n yield this.loadFileToCanvas(file);\r\n }\r\n });\r\n this.loadFileToCanvas = (file) => {\r\n (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, this.state, this.scene.getElementsIncludingDeleted())\r\n .then(({ elements, appState }) => this.syncActionResult({\r\n elements,\r\n appState: Object.assign(Object.assign({}, (appState || this.state)), { isLoading: false }),\r\n commitToHistory: true,\r\n }))\r\n .catch((error) => {\r\n this.setState({ isLoading: false, errorMessage: error.message });\r\n });\r\n };\r\n this.handleCanvasContextMenu = (event) => {\r\n event.preventDefault();\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\r\n const element = this.getElementAtPosition(x, y, { preferSelected: true });\r\n const type = element ? \"element\" : \"canvas\";\r\n const container = this.excalidrawContainerRef.current;\r\n const { top: offsetTop, left: offsetLeft, } = container.getBoundingClientRect();\r\n const left = event.clientX - offsetLeft;\r\n const top = event.clientY - offsetTop;\r\n if (element && !this.state.selectedElementIds[element.id]) {\r\n this.setState({ selectedElementIds: { [element.id]: true } }, () => {\r\n this._openContextMenu({ top, left }, type);\r\n });\r\n }\r\n else {\r\n this._openContextMenu({ top, left }, type);\r\n }\r\n };\r\n this.maybeDragNewGenericElement = (pointerDownState, event) => {\r\n const draggingElement = this.state.draggingElement;\r\n const pointerCoords = pointerDownState.lastCoords;\r\n if (!draggingElement) {\r\n return;\r\n }\r\n if (draggingElement.type === \"selection\") {\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, this.state.elementType, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getResizeWithSidesSameLengthKey)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getResizeCenterPointKey)(event));\r\n }\r\n else {\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, this.state.elementType, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.y, gridY), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getResizeWithSidesSameLengthKey)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getResizeCenterPointKey)(event));\r\n this.maybeSuggestBindingForAll([draggingElement]);\r\n }\r\n };\r\n this.maybeHandleResize = (pointerDownState, event) => {\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const transformHandleType = pointerDownState.resize.handleType;\r\n this.setState({\r\n // TODO: rename this state field to \"isScaling\" to distinguish\r\n // it from the generic \"isResizing\" which includes scaling and\r\n // rotating\r\n isResizing: transformHandleType && transformHandleType !== \"rotation\",\r\n isRotating: transformHandleType === \"rotation\",\r\n });\r\n const pointerCoords = pointerDownState.lastCoords;\r\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, this.state.gridSize);\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getRotateWithDiscreteAngleKey)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getResizeCenterPointKey)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.getResizeWithSidesSameLengthKey)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n return true;\r\n }\r\n return false;\r\n };\r\n /** @private use this.handleCanvasContextMenu */\r\n this._openContextMenu = ({ left, top, }, type) => {\r\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical.contextItemPredicate(this.actionManager.getElementsIncludingDeleted(), this.actionManager.getAppState());\r\n const separator = \"separator\";\r\n const elements = this.scene.getElements();\r\n const options = [];\r\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0) {\r\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng);\r\n }\r\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0) {\r\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg);\r\n }\r\n if (type === \"canvas\") {\r\n const viewModeOptions = [\r\n ...options,\r\n typeof this.props.gridModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode,\r\n typeof this.props.zenModeEnabled === \"undefined\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode,\r\n typeof this.props.viewModeEnabled === \"undefined\" &&\r\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__.actionToggleViewMode,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats,\r\n ];\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__.default.push({\r\n options: viewModeOptions,\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__.default.push({\r\n options: [\r\n this.isMobile &&\r\n navigator.clipboard && {\r\n name: \"paste\",\r\n perform: (elements, appStates) => {\r\n this.pasteFromClipboard(null);\r\n return {\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.paste\",\r\n },\r\n this.isMobile && navigator.clipboard && separator,\r\n _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob &&\r\n elements.length > 0 &&\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng,\r\n _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText &&\r\n elements.length > 0 &&\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg,\r\n ((_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0) ||\r\n (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0)) &&\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionSelectAll,\r\n separator,\r\n typeof this.props.gridModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode,\r\n typeof this.props.zenModeEnabled === \"undefined\" &&\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode,\r\n typeof this.props.viewModeEnabled === \"undefined\" &&\r\n _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__.actionToggleViewMode,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats,\r\n ],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n return;\r\n }\r\n if (this.state.viewModeEnabled) {\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__.default.push({\r\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, ...options],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n return;\r\n }\r\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__.default.push({\r\n options: [\r\n this.isMobile && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCut,\r\n this.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy,\r\n this.isMobile &&\r\n navigator.clipboard && {\r\n name: \"paste\",\r\n perform: (elements, appStates) => {\r\n this.pasteFromClipboard(null);\r\n return {\r\n commitToHistory: false,\r\n };\r\n },\r\n contextItemLabel: \"labels.paste\",\r\n },\r\n this.isMobile && separator,\r\n ...options,\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyStyles,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionPasteStyles,\r\n separator,\r\n maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup,\r\n maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup,\r\n (maybeGroupAction || maybeUngroupAction) && separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionAddToLibrary,\r\n separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendBackward,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringForward,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendToBack,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringToFront,\r\n separator,\r\n maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal,\r\n maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical,\r\n (maybeFlipHorizontal || maybeFlipVertical) && separator,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionDuplicateSelection,\r\n _actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected,\r\n ],\r\n top,\r\n left,\r\n actionManager: this.actionManager,\r\n appState: this.state,\r\n container: this.excalidrawContainerRef.current,\r\n });\r\n };\r\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n event.preventDefault();\r\n if (isPanning) {\r\n return;\r\n }\r\n const { deltaX, deltaY } = event;\r\n const { selectedElementIds, previousSelectedElementIds } = this.state;\r\n // note that event.ctrlKey is necessary to handle pinch zooming\r\n if (event.metaKey || event.ctrlKey) {\r\n const sign = Math.sign(deltaY);\r\n const MAX_STEP = 10;\r\n let delta = Math.abs(deltaY);\r\n if (delta > MAX_STEP) {\r\n delta = MAX_STEP;\r\n }\r\n delta *= sign;\r\n if (Object.keys(previousSelectedElementIds).length !== 0) {\r\n setTimeout(() => {\r\n this.setState({\r\n selectedElementIds: previousSelectedElementIds,\r\n previousSelectedElementIds: {},\r\n });\r\n }, 1000);\r\n }\r\n let newZoom = this.state.zoom.value - delta / 100;\r\n // increase zoom steps the more zoomed-in we are (applies to >100% only)\r\n newZoom += Math.log10(Math.max(1, this.state.zoom.value)) * -sign;\r\n // round to nearest step\r\n newZoom = Math.round(newZoom * _constants__WEBPACK_IMPORTED_MODULE_12__.ZOOM_STEP * 100) / (_constants__WEBPACK_IMPORTED_MODULE_12__.ZOOM_STEP * 100);\r\n this.setState(({ zoom, offsetLeft, offsetTop }) => ({\r\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(newZoom), zoom, { left: offsetLeft, top: offsetTop }, {\r\n x: cursorX,\r\n y: cursorY,\r\n }),\r\n selectedElementIds: {},\r\n previousSelectedElementIds: Object.keys(selectedElementIds).length !== 0\r\n ? selectedElementIds\r\n : previousSelectedElementIds,\r\n shouldCacheIgnoreZoom: true,\r\n }));\r\n this.resetShouldCacheIgnoreZoomDebounced();\r\n return;\r\n }\r\n // scroll horizontally when shift pressed\r\n if (event.shiftKey) {\r\n this.setState(({ zoom, scrollX }) => ({\r\n // on Mac, shift+wheel tends to result in deltaX\r\n scrollX: scrollX - (deltaY || deltaX) / zoom.value,\r\n }));\r\n return;\r\n }\r\n this.setState(({ zoom, scrollX, scrollY }) => ({\r\n scrollX: scrollX - deltaX / zoom.value,\r\n scrollY: scrollY - deltaY / zoom.value,\r\n }));\r\n });\r\n this.savePointer = (x, y, button) => {\r\n var _a, _b;\r\n if (!x || !y) {\r\n return;\r\n }\r\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({ clientX: x, clientY: y }, this.state);\r\n if (isNaN(pointer.x) || isNaN(pointer.y)) {\r\n // sometimes the pointer goes off screen\r\n }\r\n (_b = (_a = this.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\r\n pointer,\r\n button,\r\n pointersMap: gesture.pointers,\r\n });\r\n };\r\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(() => {\r\n if (!this.unmounted) {\r\n this.setState({ shouldCacheIgnoreZoom: false });\r\n }\r\n }, 300);\r\n this.updateDOMRect = (cb) => {\r\n var _a;\r\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\r\n const excalidrawContainer = this.excalidrawContainerRef.current;\r\n const { width, height, left: offsetLeft, top: offsetTop, } = excalidrawContainer.getBoundingClientRect();\r\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft, } = this.state;\r\n if (width === currentWidth &&\r\n height === currentHeight &&\r\n offsetLeft === currentOffsetLeft &&\r\n offsetTop === currentOffsetTop) {\r\n if (cb) {\r\n cb();\r\n }\r\n return;\r\n }\r\n this.setState({\r\n width,\r\n height,\r\n offsetLeft,\r\n offsetTop,\r\n }, () => {\r\n cb && cb();\r\n });\r\n }\r\n };\r\n this.refresh = () => {\r\n this.setState(Object.assign({}, this.getCanvasOffsets()));\r\n };\r\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)();\r\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name, } = props;\r\n this.state = Object.assign(Object.assign(Object.assign(Object.assign({}, defaultAppState), { theme, isLoading: true }), this.getCanvasOffsets()), { viewModeEnabled,\r\n zenModeEnabled, gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null, name, width: window.innerWidth, height: window.innerHeight });\r\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_41__.nanoid)();\r\n if (excalidrawRef) {\r\n const readyPromise = (\"current\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise)) ||\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resolvablePromise)();\r\n const api = {\r\n ready: true,\r\n readyPromise,\r\n updateScene: this.updateScene,\r\n resetScene: this.resetScene,\r\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\r\n history: {\r\n clear: this.resetHistory,\r\n },\r\n scrollToContent: this.scrollToContent,\r\n zoomToFit: this.zoomToFit,\r\n getSceneElements: this.getSceneElements,\r\n getAppState: () => this.state,\r\n refresh: this.refresh,\r\n importLibrary: this.importLibraryFromUrl,\r\n setToastMessage: this.setToastMessage,\r\n id: this.id,\r\n };\r\n if (typeof excalidrawRef === \"function\") {\r\n excalidrawRef(api);\r\n }\r\n else {\r\n excalidrawRef.current = api;\r\n }\r\n readyPromise.resolve(api);\r\n }\r\n this.excalidrawContainerValue = {\r\n container: this.excalidrawContainerRef.current,\r\n id: this.id,\r\n };\r\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_32__.default();\r\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_15__.default(this);\r\n this.history = new _history__WEBPACK_IMPORTED_MODULE_25__.default();\r\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_7__.ActionManager(this.syncActionResult, () => this.state, () => this.scene.getElementsIncludingDeleted(), this);\r\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_8__.actions);\r\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createUndoAction)(this.history));\r\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createRedoAction)(this.history));\r\n }\r\n renderCanvas() {\r\n const canvasScale = window.devicePixelRatio;\r\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled, } = this.state;\r\n const canvasWidth = canvasDOMWidth * canvasScale;\r\n const canvasHeight = canvasDOMHeight * canvasScale;\r\n if (viewModeEnabled) {\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\r\n width: canvasDOMWidth,\r\n height: canvasDOMHeight,\r\n cursor: _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB,\r\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.removePointer, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove, onPointerDown: this.handleCanvasPointerDown }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\"labels.drawingCanvas\") }), void 0));\r\n }\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"canvas\", Object.assign({ className: \"excalidraw__canvas\", style: {\r\n width: canvasDOMWidth,\r\n height: canvasDOMHeight,\r\n }, width: canvasWidth, height: canvasHeight, ref: this.handleCanvasRef, onContextMenu: this.handleCanvasContextMenu, onPointerDown: this.handleCanvasPointerDown, onDoubleClick: this.handleCanvasDoubleClick, onPointerMove: this.handleCanvasPointerMove, onPointerUp: this.removePointer, onPointerCancel: this.removePointer, onTouchMove: this.handleTouchMove }, { children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\"labels.drawingCanvas\") }), void 0));\r\n }\r\n render() {\r\n var _a, _b;\r\n const { zenModeEnabled, viewModeEnabled } = this.state;\r\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats, } = this.props;\r\n return ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", Object.assign({ className: (0,clsx__WEBPACK_IMPORTED_MODULE_3__.default)(\"excalidraw excalidraw-container\", {\r\n \"excalidraw--view-mode\": viewModeEnabled,\r\n \"excalidraw--mobile\": this.isMobile,\r\n }), ref: this.excalidrawContainerRef, onDrop: this.handleAppOnDrop, tabIndex: 0, onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ExcalidrawContainerContext.Provider, Object.assign({ value: this.excalidrawContainerValue }, { children: (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(IsMobileContext.Provider, Object.assign({ value: this.isMobile }, { children: [(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_37__.default, { canvas: this.canvas, appState: this.state, setAppState: this.setAppState, actionManager: this.actionManager, elements: this.scene.getElements(), onCollabButtonClick: onCollabButtonClick, onLockToggle: this.toggleLock, onInsertElements: (elements) => this.addElementsFromPasteOrLibrary({\r\n elements,\r\n position: \"center\",\r\n }), zenModeEnabled: zenModeEnabled, toggleZenMode: this.toggleZenMode, langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.getLanguage)().code, isCollaborating: this.props.isCollaborating || false, renderTopRightUI: renderTopRightUI, renderCustomFooter: renderFooter, viewModeEnabled: viewModeEnabled, showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \"undefined\" &&\r\n zenModeEnabled, showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \"undefined\" &&\r\n this.props.UIOptions.canvasActions.theme, libraryReturnUrl: this.props.libraryReturnUrl, UIOptions: this.props.UIOptions, focusContainer: this.focusContainer, library: this.library, id: this.id }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-textEditorContainer\" }, void 0), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"div\", { className: \"excalidraw-contextMenuContainer\" }, void 0), this.state.showStats && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Stats__WEBPACK_IMPORTED_MODULE_38__.Stats, { appState: this.state, setAppState: this.setAppState, elements: this.scene.getElements(), onClose: this.toggleStats, renderCustomStats: renderCustomStats }, void 0)), this.state.toastMessage !== null && ((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_39__.Toast, { message: this.state.toastMessage, clearToast: this.clearToast }, void 0)), (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(\"main\", { children: this.renderCanvas() }, void 0)] }), void 0) }), void 0) }), void 0));\r\n }\r\n componentDidMount() {\r\n var _a, _b;\r\n return __awaiter(this, void 0, void 0, function* () {\r\n this.excalidrawContainerValue.container = this.excalidrawContainerRef.current;\r\n if (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST ||\r\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\r\n const setState = this.setState.bind(this);\r\n Object.defineProperties(window.h, {\r\n state: {\r\n configurable: true,\r\n get: () => {\r\n return this.state;\r\n },\r\n },\r\n setState: {\r\n configurable: true,\r\n value: (...args) => {\r\n return this.setState(...args);\r\n },\r\n },\r\n app: {\r\n configurable: true,\r\n value: this,\r\n },\r\n history: {\r\n configurable: true,\r\n value: this.history,\r\n },\r\n });\r\n }\r\n this.scene.addCallback(this.onSceneUpdated);\r\n this.addEventListeners();\r\n if (this.excalidrawContainerRef.current) {\r\n this.focusContainer();\r\n }\r\n if (\"ResizeObserver\" in window && ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\r\n this.resizeObserver = new ResizeObserver(() => {\r\n // compute isMobile state\r\n // ---------------------------------------------------------------------\r\n const { width, height, } = this.excalidrawContainerRef.current.getBoundingClientRect();\r\n this.isMobile =\r\n width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT ||\r\n (height < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE);\r\n // refresh offsets\r\n // ---------------------------------------------------------------------\r\n this.updateDOMRect();\r\n });\r\n (_b = this.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(this.excalidrawContainerRef.current);\r\n }\r\n else if (window.matchMedia) {\r\n const mediaQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\r\n const handler = () => (this.isMobile = mediaQuery.matches);\r\n mediaQuery.addListener(handler);\r\n this.detachIsMobileMqHandler = () => mediaQuery.removeListener(handler);\r\n }\r\n const searchParams = new URLSearchParams(window.location.search.slice(1));\r\n if (searchParams.has(\"web-share-target\")) {\r\n // Obtain a file that was shared via the Web Share Target API.\r\n this.restoreFileFromShare();\r\n }\r\n else {\r\n this.updateDOMRect(this.initializeScene);\r\n }\r\n });\r\n }\r\n componentWillUnmount() {\r\n var _a;\r\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\r\n this.unmounted = true;\r\n this.removeEventListeners();\r\n this.scene.destroy();\r\n clearTimeout(touchTimeout);\r\n touchTimeout = 0;\r\n }\r\n removeEventListeners() {\r\n var _a, _b;\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\r\n (_a = this.nearestScrollableContainer) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\r\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\r\n (_b = this.detachIsMobileMqHandler) === null || _b === void 0 ? void 0 : _b.call(this);\r\n }\r\n addEventListeners() {\r\n var _a, _b;\r\n this.removeEventListeners();\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer); // #3553\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\r\n if (this.props.handleKeyboardGlobally) {\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\r\n }\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp, { passive: true });\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition);\r\n // rerender text elements on font load to fix #637 && #1553\r\n (_b = (_a = document.fonts) === null || _a === void 0 ? void 0 : _a.addEventListener) === null || _b === void 0 ? void 0 : _b.call(_a, \"loadingdone\", this.onFontLoaded);\r\n // Safari-only desktop pinch zoom\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\r\n if (this.state.viewModeEnabled) {\r\n return;\r\n }\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\r\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\r\n if (this.props.detectScroll) {\r\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\r\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\r\n }\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\r\n }\r\n componentDidUpdate(prevProps, prevState) {\r\n var _a, _b, _c, _d;\r\n if (prevProps.langCode !== this.props.langCode) {\r\n this.updateLanguage();\r\n }\r\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\r\n this.setState({ viewModeEnabled: !!this.props.viewModeEnabled });\r\n }\r\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\r\n this.addEventListeners();\r\n this.deselectElements();\r\n }\r\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\r\n this.setState({ zenModeEnabled: !!this.props.zenModeEnabled });\r\n }\r\n if (prevProps.theme !== this.props.theme && this.props.theme) {\r\n this.setState({ theme: this.props.theme });\r\n }\r\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\r\n this.setState({\r\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null,\r\n });\r\n }\r\n if (this.props.name && prevProps.name !== this.props.name) {\r\n this.setState({\r\n name: this.props.name,\r\n });\r\n }\r\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.classList.toggle(\"theme--dark\", this.state.theme === \"dark\");\r\n if (this.state.editingLinearElement &&\r\n !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\r\n // defer so that the commitToHistory flag isn't reset via current update\r\n setTimeout(() => {\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\r\n });\r\n }\r\n const { multiElement } = prevState;\r\n if (prevState.elementType !== this.state.elementType &&\r\n multiElement != null &&\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(multiElement)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\r\n }\r\n const cursorButton = {};\r\n const pointerViewportCoords = {};\r\n const remoteSelectedElementIds = {};\r\n const pointerUsernames = {};\r\n const pointerUserStates = {};\r\n this.state.collaborators.forEach((user, socketId) => {\r\n if (user.selectedElementIds) {\r\n for (const id of Object.keys(user.selectedElementIds)) {\r\n if (!(id in remoteSelectedElementIds)) {\r\n remoteSelectedElementIds[id] = [];\r\n }\r\n remoteSelectedElementIds[id].push(socketId);\r\n }\r\n }\r\n if (!user.pointer) {\r\n return;\r\n }\r\n if (user.username) {\r\n pointerUsernames[socketId] = user.username;\r\n }\r\n if (user.userState) {\r\n pointerUserStates[socketId] = user.userState;\r\n }\r\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\r\n sceneX: user.pointer.x,\r\n sceneY: user.pointer.y,\r\n }, this.state);\r\n cursorButton[socketId] = user.button;\r\n });\r\n const elements = this.scene.getElements();\r\n const { atLeastOneVisibleElement, scrollBars } = (0,_renderer__WEBPACK_IMPORTED_MODULE_29__.renderScene)(elements.filter((element) => {\r\n // don't render text element that's being currently edited (it's\r\n // rendered on remote only)\r\n return (!this.state.editingElement ||\r\n this.state.editingElement.type !== \"text\" ||\r\n element.id !== this.state.editingElement.id);\r\n }), this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\r\n scrollX: this.state.scrollX,\r\n scrollY: this.state.scrollY,\r\n viewBackgroundColor: this.state.viewBackgroundColor,\r\n zoom: this.state.zoom,\r\n remotePointerViewportCoords: pointerViewportCoords,\r\n remotePointerButton: cursorButton,\r\n remoteSelectedElementIds,\r\n remotePointerUsernames: pointerUsernames,\r\n remotePointerUserStates: pointerUserStates,\r\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\r\n }, {\r\n renderOptimizations: true,\r\n renderScrollbars: !this.isMobile,\r\n });\r\n if (scrollBars) {\r\n currentScrollBars = scrollBars;\r\n }\r\n const scrolledOutside = \r\n // hide when editing text\r\n ((_b = this.state.editingElement) === null || _b === void 0 ? void 0 : _b.type) === \"text\"\r\n ? false\r\n : !atLeastOneVisibleElement && elements.length > 0;\r\n if (this.state.scrolledOutside !== scrolledOutside) {\r\n this.setState({ scrolledOutside });\r\n }\r\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\r\n // Do not notify consumers if we're still loading the scene. Among other\r\n // potential issues, this fixes a case where the tab isn't focused during\r\n // init, which would trigger onChange with empty elements, which would then\r\n // override whatever is in localStorage currently.\r\n if (!this.state.isLoading) {\r\n (_d = (_c = this.props).onChange) === null || _d === void 0 ? void 0 : _d.call(_c, this.scene.getElementsIncludingDeleted(), this.state);\r\n }\r\n }\r\n static resetTapTwice() {\r\n didTapTwice = false;\r\n }\r\n addTextFromPaste(text) {\r\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({ clientX: cursorX, clientY: cursorY }, this.state);\r\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\r\n x,\r\n y,\r\n strokeColor: this.state.currentItemStrokeColor,\r\n backgroundColor: this.state.currentItemBackgroundColor,\r\n fillStyle: this.state.currentItemFillStyle,\r\n strokeWidth: this.state.currentItemStrokeWidth,\r\n strokeStyle: this.state.currentItemStrokeStyle,\r\n roughness: this.state.currentItemRoughness,\r\n opacity: this.state.currentItemOpacity,\r\n strokeSharpness: this.state.currentItemStrokeSharpness,\r\n text,\r\n rawText: text,\r\n fontSize: this.state.currentItemFontSize,\r\n fontFamily: this.state.currentItemFontFamily,\r\n textAlign: this.state.currentItemTextAlign,\r\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN,\r\n });\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted(),\r\n element,\r\n ]);\r\n this.setState({ selectedElementIds: { [element.id]: true } });\r\n this.history.resumeRecording();\r\n }\r\n selectShapeTool(elementType) {\r\n if (!isHoldingSpace) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, elementType);\r\n }\r\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isToolIcon)(document.activeElement)) {\r\n this.focusContainer();\r\n }\r\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElementType)(elementType)) {\r\n this.setState({ suggestedBindings: [] });\r\n }\r\n if (elementType !== \"selection\") {\r\n this.setState({\r\n elementType,\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n else {\r\n this.setState({ elementType });\r\n }\r\n }\r\n handleTextWysiwyg(element, { isExistingElement = false, }) {\r\n const updateElement = (text, isDeleted = false) => {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\r\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\r\n text,\r\n isDeleted,\r\n });\r\n }\r\n return _element;\r\n }),\r\n ]);\r\n };\r\n if (isExistingElement && this.props.onBeforeTextEdit) {\r\n const text = this.props.onBeforeTextEdit(element);\r\n if (text) {\r\n this.scene.replaceAllElements([\r\n ...this.scene.getElementsIncludingDeleted().map((_element) => {\r\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\r\n element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\r\n text,\r\n isDeleted: false,\r\n });\r\n return element;\r\n }\r\n return _element;\r\n }),\r\n ]);\r\n }\r\n }\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.textWysiwyg)({\r\n id: element.id,\r\n appState: this.state,\r\n canvas: this.canvas,\r\n getViewportCoords: (x, y) => {\r\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\r\n sceneX: x,\r\n sceneY: y,\r\n }, this.state);\r\n return [\r\n viewportX - this.state.offsetLeft,\r\n viewportY - this.state.offsetTop,\r\n ];\r\n },\r\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((text) => {\r\n updateElement(text);\r\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element);\r\n }\r\n }),\r\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(({ text, viaKeyboard }) => {\r\n const isDeleted = !text.trim();\r\n if (this.props.onBeforeTextSubmit) {\r\n const updatedText = this.props.onBeforeTextSubmit(element, text, isDeleted);\r\n text = updatedText !== null && updatedText !== void 0 ? updatedText : text;\r\n }\r\n updateElement(text, isDeleted);\r\n // select the created text element only if submitting via keyboard\r\n // (when submitting via click it should act as signal to deselect)\r\n if (!isDeleted && viaKeyboard) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [element.id]: true }),\r\n }));\r\n }\r\n if (isDeleted) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDeletion)(this.scene.getElements(), [element]);\r\n }\r\n if (!isDeleted || isExistingElement) {\r\n this.history.resumeRecording();\r\n }\r\n this.setState({\r\n draggingElement: null,\r\n editingElement: null,\r\n });\r\n if (this.state.elementLocked) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, this.state.elementType);\r\n }\r\n this.focusContainer();\r\n }),\r\n element,\r\n excalidrawContainer: this.excalidrawContainerRef.current,\r\n });\r\n // deselect all other elements when inserting text\r\n this.deselectElements();\r\n // do an initial update to re-initialize element position since we were\r\n // modifying element's x/y for sake of editor (case: syncing to remote)\r\n updateElement(element.text);\r\n }\r\n deselectElements() {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n getTextElementAtPosition(x, y) {\r\n const element = this.getElementAtPosition(x, y);\r\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && !element.isDeleted) {\r\n return element;\r\n }\r\n return null;\r\n }\r\n getElementAtPosition(x, y, opts) {\r\n const allHitElements = this.getElementsAtPosition(x, y);\r\n if (allHitElements.length > 1) {\r\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\r\n for (let index = allHitElements.length - 1; index > -1; index--) {\r\n if (this.state.selectedElementIds[allHitElements[index].id]) {\r\n return allHitElements[index];\r\n }\r\n }\r\n }\r\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1];\r\n // If we're hitting element with highest z-index only on its bounding box\r\n // while also hitting other element figure, the latter should be considered.\r\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y)\r\n ? allHitElements[allHitElements.length - 2]\r\n : elementWithHighestZIndex;\r\n }\r\n if (allHitElements.length === 1) {\r\n return allHitElements[0];\r\n }\r\n return null;\r\n }\r\n getElementsAtPosition(x, y) {\r\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsAtPosition)(this.scene.getElements(), (element) => (0,_element__WEBPACK_IMPORTED_MODULE_17__.hitTest)(element, this.state, x, y));\r\n }\r\n maybeCleanupAfterMissingPointerUp(event) {\r\n if (lastPointerUp !== null) {\r\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\r\n // this can happen when a contextual menu or alert is triggered. In order to avoid\r\n // being in a weird state, we clean up on the next pointerdown\r\n lastPointerUp(event);\r\n }\r\n }\r\n updateGestureOnPointerDown(event) {\r\n gesture.pointers.set(event.pointerId, {\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n if (gesture.pointers.size === 2) {\r\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\r\n gesture.initialScale = this.state.zoom.value;\r\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\r\n }\r\n }\r\n initialPointerDownState(event) {\r\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\r\n return {\r\n origin,\r\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD],\r\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\r\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\r\n // we need to duplicate because we'll be updating this state\r\n lastCoords: Object.assign({}, origin),\r\n originalElements: this.scene.getElements().reduce((acc, element) => {\r\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.deepCopyElement)(element));\r\n return acc;\r\n }, new Map()),\r\n resize: {\r\n handleType: false,\r\n isResizing: false,\r\n offset: { x: 0, y: 0 },\r\n arrowDirection: \"origin\",\r\n center: { x: (maxX + minX) / 2, y: (maxY + minY) / 2 },\r\n },\r\n hit: {\r\n element: null,\r\n allHitElements: [],\r\n wasAddedToSelection: false,\r\n hasBeenDuplicated: false,\r\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\r\n },\r\n drag: {\r\n hasOccurred: false,\r\n offset: null,\r\n },\r\n eventListeners: {\r\n onMove: null,\r\n onUp: null,\r\n onKeyUp: null,\r\n onKeyDown: null,\r\n },\r\n };\r\n }\r\n // Returns whether the event is a dragging a scrollbar\r\n handleDraggingScrollBar(event, pointerDownState) {\r\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\r\n return false;\r\n }\r\n isDraggingScrollBar = true;\r\n pointerDownState.lastCoords.x = event.clientX;\r\n pointerDownState.lastCoords.y = event.clientY;\r\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n const target = event.target;\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n this.handlePointerMoveOverScrollbars(event, pointerDownState);\r\n });\r\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(() => {\r\n isDraggingScrollBar = false;\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, this.state.elementType);\r\n lastPointerUp = null;\r\n this.setState({\r\n cursorButton: \"up\",\r\n });\r\n this.savePointer(event.clientX, event.clientY, \"up\");\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\r\n });\r\n lastPointerUp = onPointerUp;\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\r\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\r\n return true;\r\n }\r\n isASelectedElement(hitElement) {\r\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\r\n }\r\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\r\n if (selectedElements.length < 2) {\r\n return false;\r\n }\r\n // How many pixels off the shape boundary we still consider a hit\r\n const threshold = 10 / this.state.zoom.value;\r\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\r\n return (point.x > x1 - threshold &&\r\n point.x < x2 + threshold &&\r\n point.y > y1 - threshold &&\r\n point.y < y2 + threshold);\r\n }\r\n onKeyDownFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return;\r\n }\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n });\r\n }\r\n onKeyUpFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n // Prevents focus from escaping excalidraw tab\r\n event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ALT && event.preventDefault();\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return;\r\n }\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n });\r\n }\r\n onPointerMoveFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((event) => {\r\n // We need to initialize dragOffsetXY only after we've updated\r\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\r\n // event handler should hopefully ensure we're already working with\r\n // the updated state.\r\n if (pointerDownState.drag.offset === null) {\r\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state), pointerDownState.origin.x, pointerDownState.origin.y));\r\n }\r\n const target = event.target;\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n if (this.handlePointerMoveOverScrollbars(event, pointerDownState)) {\r\n return;\r\n }\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\r\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, this.state.gridSize);\r\n // for arrows/lines, don't start dragging until a given threshold\r\n // to ensure we don't create a 2-point arrow by mistake when\r\n // user clicks mouse in a way that it moves a tiny bit (thus\r\n // triggering pointermove)\r\n if (!pointerDownState.drag.hasOccurred &&\r\n (this.state.elementType === \"arrow\" ||\r\n this.state.elementType === \"line\")) {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD) {\r\n return;\r\n }\r\n }\r\n if (pointerDownState.resize.isResizing) {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n if (this.maybeHandleResize(pointerDownState, event)) {\r\n return true;\r\n }\r\n }\r\n if (this.state.editingLinearElement) {\r\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointDragging(this.state, (appState) => this.setState(appState), pointerCoords.x, pointerCoords.y, (element, startOrEnd) => {\r\n this.maybeSuggestBindingForLinearElementAtCursor(element, startOrEnd, pointerCoords);\r\n });\r\n if (didDrag) {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n return;\r\n }\r\n }\r\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some((element) => this.isASelectedElement(element));\r\n if (hasHitASelectedElement ||\r\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\r\n // Marking that click was used for dragging to check\r\n // if elements should be deselected on pointerup\r\n pointerDownState.drag.hasOccurred = true;\r\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\r\n // prevent dragging even if we're no longer holding cmd/ctrl otherwise\r\n // it would have weird results (stuff jumping all over the screen)\r\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\r\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, this.state.gridSize);\r\n const [dragDistanceX, dragDistanceY] = [\r\n Math.abs(pointerCoords.x - pointerDownState.origin.x),\r\n Math.abs(pointerCoords.y - pointerDownState.origin.y),\r\n ];\r\n // We only drag in one direction if shift is pressed\r\n const lockDirection = event.shiftKey;\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, this.scene, lockDirection, dragDistanceX, dragDistanceY);\r\n this.maybeSuggestBindingForAll(selectedElements);\r\n // We duplicate the selected element if alt is pressed on pointer move\r\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\r\n // Move the currently selected elements to the top of the z index stack, and\r\n // put the duplicates where the selected elements used to be.\r\n // (the origin point where the dragging started)\r\n pointerDownState.hit.hasBeenDuplicated = true;\r\n const nextElements = [];\r\n const elementsToAppend = [];\r\n const groupIdMap = new Map();\r\n const oldIdToDuplicatedId = new Map();\r\n const hitElement = pointerDownState.hit.element;\r\n for (const element of this.scene.getElementsIncludingDeleted()) {\r\n if (this.state.selectedElementIds[element.id] ||\r\n // case: the state.selectedElementIds might not have been\r\n // updated yet by the time this mousemove event is fired\r\n (element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) &&\r\n pointerDownState.hit.wasAddedToSelection)) {\r\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(this.state.editingGroupId, groupIdMap, element);\r\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, this.state.gridSize);\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(duplicatedElement, {\r\n x: duplicatedElement.x + (originDragX - dragX),\r\n y: duplicatedElement.y + (originDragY - dragY),\r\n });\r\n nextElements.push(duplicatedElement);\r\n elementsToAppend.push(element);\r\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\r\n }\r\n else {\r\n nextElements.push(element);\r\n }\r\n }\r\n const nextSceneElements = [...nextElements, ...elementsToAppend];\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \"duplicatesServeAsOld\");\r\n this.scene.replaceAllElements(nextSceneElements);\r\n }\r\n return;\r\n }\r\n }\r\n // It is very important to read this.state within each move event,\r\n // otherwise we would read a stale one!\r\n const draggingElement = this.state.draggingElement;\r\n if (!draggingElement) {\r\n return;\r\n }\r\n if (draggingElement.type === \"freedraw\") {\r\n const points = draggingElement.points;\r\n const dx = pointerCoords.x - draggingElement.x;\r\n const dy = pointerCoords.y - draggingElement.y;\r\n const pressures = draggingElement.simulatePressure\r\n ? draggingElement.pressures\r\n : [...draggingElement.pressures, event.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\r\n points: [...points, [dx, dy]],\r\n pressures,\r\n });\r\n }\r\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\r\n pointerDownState.drag.hasOccurred = true;\r\n const points = draggingElement.points;\r\n let dx = gridX - draggingElement.x;\r\n let dy = gridY - draggingElement.y;\r\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.getRotateWithDiscreteAngleKey)(event) && points.length === 2) {\r\n ({ width: dx, height: dy } = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getPerfectElementSize)(this.state.elementType, dx, dy));\r\n }\r\n if (points.length === 1) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, { points: [...points, [dx, dy]] });\r\n }\r\n else if (points.length > 1) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\r\n points: [...points.slice(0, -1), [dx, dy]],\r\n });\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\r\n // When creating a linear element by dragging\r\n this.maybeSuggestBindingForLinearElementAtCursor(draggingElement, \"end\", pointerCoords, this.state.startBoundElement);\r\n }\r\n }\r\n else {\r\n pointerDownState.lastCoords.x = pointerCoords.x;\r\n pointerDownState.lastCoords.y = pointerCoords.y;\r\n this.maybeDragNewGenericElement(pointerDownState, event);\r\n }\r\n if (this.state.elementType === \"selection\") {\r\n const elements = this.scene.getElements();\r\n if (!event.shiftKey && (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(elements, this.state)) {\r\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: {\r\n [pointerDownState.hit.element.id]: true,\r\n } }), this.scene.getElements()));\r\n }\r\n else {\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n }\r\n }\r\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsWithinSelection)(elements, draggingElement);\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign(Object.assign({}, prevState.selectedElementIds), elementsWithinSelection.reduce((map, element) => {\r\n map[element.id] = true;\r\n return map;\r\n }, {})), (pointerDownState.hit.element\r\n ? {\r\n // if using ctrl/cmd, select the hitElement only if we\r\n // haven't box-selected anything else\r\n [pointerDownState.hit.element\r\n .id]: !elementsWithinSelection.length,\r\n }\r\n : null)) }), this.scene.getElements()));\r\n }\r\n });\r\n }\r\n // Returns whether the pointer move happened over either scrollbar\r\n handlePointerMoveOverScrollbars(event, pointerDownState) {\r\n if (pointerDownState.scrollbars.isOverHorizontal) {\r\n const x = event.clientX;\r\n const dx = x - pointerDownState.lastCoords.x;\r\n this.setState({\r\n scrollX: this.state.scrollX - dx / this.state.zoom.value,\r\n });\r\n pointerDownState.lastCoords.x = x;\r\n return true;\r\n }\r\n if (pointerDownState.scrollbars.isOverVertical) {\r\n const y = event.clientY;\r\n const dy = y - pointerDownState.lastCoords.y;\r\n this.setState({\r\n scrollY: this.state.scrollY - dy / this.state.zoom.value,\r\n });\r\n pointerDownState.lastCoords.y = y;\r\n return true;\r\n }\r\n return false;\r\n }\r\n onPointerUpFromPointerDownHandler(pointerDownState) {\r\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)((childEvent) => {\r\n const { draggingElement, resizingElement, multiElement, elementType, elementLocked, isResizing, isRotating, } = this.state;\r\n this.setState({\r\n isResizing: false,\r\n isRotating: false,\r\n resizingElement: null,\r\n selectionElement: null,\r\n cursorButton: \"up\",\r\n // text elements are reset on finalize, and resetting on pointerup\r\n // may cause issues with double taps\r\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(this.state.editingElement)\r\n ? this.state.editingElement\r\n : null,\r\n });\r\n this.savePointer(childEvent.clientX, childEvent.clientY, \"up\");\r\n // Handle end of dragging a point of a linear element, might close a loop\r\n // and sets binding element\r\n if (this.state.editingLinearElement) {\r\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerUp(childEvent, this.state.editingLinearElement, this.state);\r\n if (editingLinearElement !== this.state.editingLinearElement) {\r\n this.setState({\r\n editingLinearElement,\r\n suggestedBindings: [],\r\n });\r\n }\r\n }\r\n lastPointerUp = null;\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\r\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\r\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \"freedraw\") {\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, this.state);\r\n const points = draggingElement.points;\r\n let dx = pointerCoords.x - draggingElement.x;\r\n let dy = pointerCoords.y - draggingElement.y;\r\n // Allows dots to avoid being flagged as infinitely small\r\n if (dx === points[0][0] && dy === points[0][1]) {\r\n dy += 0.0001;\r\n dx += 0.0001;\r\n }\r\n const pressures = draggingElement.simulatePressure\r\n ? []\r\n : [...draggingElement.pressures, childEvent.pressure];\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\r\n points: [...points, [dx, dy]],\r\n pressures,\r\n });\r\n this.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\r\n return;\r\n }\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\r\n if (draggingElement.points.length > 1) {\r\n this.history.resumeRecording();\r\n }\r\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, this.state);\r\n if (!pointerDownState.drag.hasOccurred &&\r\n draggingElement &&\r\n !multiElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\r\n points: [\r\n ...draggingElement.points,\r\n [\r\n pointerCoords.x - draggingElement.x,\r\n pointerCoords.y - draggingElement.y,\r\n ],\r\n ],\r\n });\r\n this.setState({\r\n multiElement: draggingElement,\r\n editingElement: this.state.draggingElement,\r\n });\r\n }\r\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\r\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state) &&\r\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\r\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(draggingElement, this.state, this.scene, pointerCoords);\r\n }\r\n this.setState({ suggestedBindings: [], startBoundElement: null });\r\n if (!elementLocked) {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n this.setState((prevState) => ({\r\n draggingElement: null,\r\n elementType: \"selection\",\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [this.state.draggingElement.id]: true }),\r\n }));\r\n }\r\n else {\r\n this.setState((prevState) => ({\r\n draggingElement: null,\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [this.state.draggingElement.id]: true }),\r\n }));\r\n }\r\n }\r\n return;\r\n }\r\n if (elementType !== \"selection\" &&\r\n draggingElement &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(draggingElement)) {\r\n // remove invisible element which was added in onPointerDown\r\n this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().slice(0, -1));\r\n this.setState({\r\n draggingElement: null,\r\n });\r\n return;\r\n }\r\n if (draggingElement) {\r\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getNormalizedDimensions)(draggingElement));\r\n }\r\n if (resizingElement) {\r\n this.history.resumeRecording();\r\n }\r\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(resizingElement)) {\r\n this.scene.replaceAllElements(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((el) => el.id !== resizingElement.id));\r\n }\r\n // Code below handles selection when element(s) weren't\r\n // drag or added to selection on pointer down phase.\r\n const hitElement = pointerDownState.hit.element;\r\n if (hitElement &&\r\n !pointerDownState.drag.hasOccurred &&\r\n !pointerDownState.hit.wasAddedToSelection) {\r\n if (childEvent.shiftKey) {\r\n if (this.state.selectedElementIds[hitElement.id]) {\r\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_24__.isSelectedViaGroup)(this.state, hitElement)) {\r\n // We want to unselect all groups hitElement is part of\r\n // as well as all elements that are part of the groups\r\n // hitElement is part of\r\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds\r\n .flatMap((groupId) => (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getElementsInGroup)(this.scene.getElements(), groupId))\r\n .map((element) => ({ [element.id]: false }))\r\n .reduce((prevId, acc) => (Object.assign(Object.assign({}, prevId), acc)), {});\r\n this.setState((_prevState) => ({\r\n selectedGroupIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), hitElement.groupIds\r\n .map((gId) => ({ [gId]: false }))\r\n .reduce((prev, acc) => (Object.assign(Object.assign({}, prev), acc)), {})),\r\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups),\r\n }));\r\n }\r\n else {\r\n // remove element from selection while\r\n // keeping prev elements selected\r\n this.setState((prevState) => (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [hitElement.id]: false }) }), this.scene.getElements()));\r\n }\r\n }\r\n else {\r\n // add element to selection while\r\n // keeping prev elements selected\r\n this.setState((_prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, _prevState.selectedElementIds), { [hitElement.id]: true }),\r\n }));\r\n }\r\n }\r\n else {\r\n this.setState((prevState) => (Object.assign({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(Object.assign(Object.assign({}, prevState), { selectedElementIds: { [hitElement.id]: true } }), this.scene.getElements()))));\r\n }\r\n }\r\n if (!this.state.editingLinearElement &&\r\n !pointerDownState.drag.hasOccurred &&\r\n !this.state.isResizing &&\r\n ((hitElement &&\r\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, this.state, pointerDownState.origin.x, pointerDownState.origin.y)) ||\r\n (!hitElement &&\r\n pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements))) {\r\n // Deselect selected elements\r\n this.setState({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n editingGroupId: null,\r\n });\r\n return;\r\n }\r\n if (!elementLocked && elementType !== \"freedraw\" && draggingElement) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: Object.assign(Object.assign({}, prevState.selectedElementIds), { [draggingElement.id]: true }),\r\n }));\r\n }\r\n if (elementType !== \"selection\" ||\r\n (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(this.scene.getElements(), this.state)) {\r\n this.history.resumeRecording();\r\n }\r\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\r\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state)\r\n ? _element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements\r\n : _element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state));\r\n }\r\n if (!elementLocked && elementType !== \"freedraw\") {\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(this.canvas);\r\n this.setState({\r\n draggingElement: null,\r\n suggestedBindings: [],\r\n elementType: \"selection\",\r\n });\r\n }\r\n else {\r\n this.setState({\r\n draggingElement: null,\r\n suggestedBindings: [],\r\n });\r\n }\r\n });\r\n }\r\n maybeSuggestBindingForAll(selectedElements) {\r\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getEligibleElementsForBinding)(selectedElements);\r\n this.setState({ suggestedBindings });\r\n }\r\n clearSelection(hitElement) {\r\n this.setState((prevState) => ({\r\n selectedElementIds: {},\r\n selectedGroupIds: {},\r\n // Continue editing the same group if the user selected a different\r\n // element from it\r\n editingGroupId: prevState.editingGroupId &&\r\n hitElement != null &&\r\n (0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, prevState.editingGroupId)\r\n ? prevState.editingGroupId\r\n : null,\r\n }));\r\n this.setState({\r\n selectedElementIds: {},\r\n previousSelectedElementIds: this.state.selectedElementIds,\r\n });\r\n }\r\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\r\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementContainingPosition)(this.scene\r\n .getElementsIncludingDeleted()\r\n .filter((element) => !(0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element)), x, y);\r\n if (elementClickedInside) {\r\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\r\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\r\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\r\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_12__.TEXT_TO_CENTER_SNAP_THRESHOLD;\r\n if (isSnappedToCenter) {\r\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({ sceneX: elementCenterX, sceneY: elementCenterY }, appState);\r\n return { viewportX, viewportY, elementCenterX, elementCenterY };\r\n }\r\n }\r\n }\r\n getCanvasOffsets() {\r\n var _a;\r\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\r\n const excalidrawContainer = this.excalidrawContainerRef.current;\r\n const { left, top } = excalidrawContainer.getBoundingClientRect();\r\n return {\r\n offsetLeft: left,\r\n offsetTop: top,\r\n };\r\n }\r\n return {\r\n offsetLeft: 0,\r\n offsetTop: 0,\r\n };\r\n }\r\n updateLanguage() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_26__.languages.find((lang) => lang.code === this.props.langCode) ||\r\n _i18n__WEBPACK_IMPORTED_MODULE_26__.defaultLang;\r\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.setLanguage)(currentLang);\r\n this.setAppState({});\r\n });\r\n }\r\n}\r\nApp.defaultProps = {\r\n // needed for tests to pass since we directly render App in many tests\r\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_UI_OPTIONS,\r\n};\r\nif (\"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST ||\r\n \"development\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\r\n window.h = window.h || {};\r\n Object.defineProperties(window.h, {\r\n elements: {\r\n configurable: true,\r\n get() {\r\n return this.app.scene.getElementsIncludingDeleted();\r\n },\r\n set(elements) {\r\n return this.app.scene.replaceAllElements(elements);\r\n },\r\n },\r\n });\r\n}\r\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SUFBSSxTQUFTLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFO1lBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztTQUNsRTtRQUVELElBQUksU0FBUyxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUM1RCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtRQUVELElBQUksU0FBUyxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRTtZQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDaEU7UUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUU7WUFDNUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDNUM7UUFFRCxJQUFJLFNBQVMsQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUU7WUFDNUQsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDWixRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGtEQUFTLENBQUMsQ0FBQyxDQUFDLElBQUk7YUFDeEQsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFD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SjtBQUNELGlFQUFlLEdBQUcsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL0FwcC50c3g/MDA3MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgUm91Z2hDYW52YXMgfSBmcm9tIFwicm91Z2hqcy9iaW4vY2FudmFzXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgY2xzeCBmcm9tIFwiY2xzeFwiO1xuaW1wb3J0IHsgc3VwcG9ydGVkIGFzIGZzU3VwcG9ydGVkIH0gZnJvbSBcImJyb3dzZXItZnMtYWNjZXNzXCI7XG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwibmFub2lkXCI7XG5cbmltcG9ydCB7XG4gIGFjdGlvbkFkZFRvTGlicmFyeSxcbiAgYWN0aW9uQnJpbmdGb3J3YXJkLFxuICBhY3Rpb25CcmluZ1RvRnJvbnQsXG4gIGFjdGlvbkNvcHksXG4gIGFjdGlvbkNvcHlBc1BuZyxcbiAgYWN0aW9uQ29weUFzU3ZnLFxuICBhY3Rpb25Db3B5U3R5bGVzLFxuICBhY3Rpb25DdXQsXG4gIGFjdGlvbkRlbGV0ZVNlbGVjdGVkLFxuICBhY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb24sXG4gIGFjdGlvbkZpbmFsaXplLFxuICBhY3Rpb25GbGlwSG9yaXpvbnRhbCxcbiAgYWN0aW9uRmxpcFZlcnRpY2FsLFxuICBhY3Rpb25Hcm91cCxcbiAgYWN0aW9uUGFzdGVTdHlsZXMsXG4gIGFjdGlvblNlbGVjdEFsbCxcbiAgYWN0aW9uU2VuZEJhY2t3YXJkLFxuICBhY3Rpb25TZW5kVG9CYWNrLFxuICBhY3Rpb25Ub2dnbGVHcmlkTW9kZSxcbiAgYWN0aW9uVG9nZ2xlU3RhdHMsXG4gIGFjdGlvblRvZ2dsZVplbk1vZGUsXG4gIGFjdGlvblVuZ3JvdXAsXG4gIHpvb21Ub0ZpdEVsZW1lbnRzLFxufSBmcm9tIFwiLi4vYWN0aW9uc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVkb0FjdGlvbiwgY3JlYXRlVW5kb0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvbkhpc3RvcnlcIjtcbmltcG9ydCB7IEFjdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vYWN0aW9ucy9tYW5hZ2VyXCI7XG5pbXBvcnQgeyBhY3Rpb25zIH0gZnJvbSBcIi4uL2FjdGlvbnMvcmVnaXN0ZXJcIjtcbmltcG9ydCB7IEFjdGlvblJlc3VsdCB9IGZyb20gXCIuLi9hY3Rpb25zL3R5cGVzXCI7XG5pbXBvcnQgeyB0cmFja0V2ZW50IH0gZnJvbSBcIi4uL2FuYWx5dGljc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQge1xuICBjb3B5VG9DbGlwYm9hcmQsXG4gIHBhcnNlQ2xpcGJvYXJkLFxuICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYixcbiAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCxcbn0gZnJvbSBcIi4uL2NsaXBib2FyZFwiO1xuaW1wb3J0IHtcbiAgQVBQX05BTUUsXG4gIENVUlNPUl9UWVBFLFxuICBERUZBVUxUX1VJX09QVElPTlMsXG4gIERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gIERSQUdHSU5HX1RIUkVTSE9MRCxcbiAgRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5ULFxuICBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQsXG4gIEVOVixcbiAgRVZFTlQsXG4gIEdSSURfU0laRSxcbiAgTElORV9DT05GSVJNX1RIUkVTSE9MRCxcbiAgTUlNRV9UWVBFUyxcbiAgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUsXG4gIE1RX01BWF9XSURUSF9MQU5EU0NBUEUsXG4gIE1RX01BWF9XSURUSF9QT1JUUkFJVCxcbiAgUE9JTlRFUl9CVVRUT04sXG4gIFNDUk9MTF9USU1FT1VULFxuICBUQVBfVFdJQ0VfVElNRU9VVCxcbiAgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQsXG4gIFRPVUNIX0NUWF9NRU5VX1RJTUVPVVQsXG4gIFVSTF9IQVNIX0tFWVMsXG4gIFVSTF9RVUVSWV9LRVlTLFxuICBaT09NX1NURVAsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGxvYWRGcm9tQmxvYiB9IGZyb20gXCIuLi9kYXRhXCI7XG5pbXBvcnQgeyBpc1ZhbGlkTGlicmFyeSB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCIuLi9kYXRhL2xpYnJhcnlcIjtcbmltcG9ydCB7IHJlc3RvcmUsIHJlc3RvcmVFbGVtZW50cyB9IGZyb20gXCIuLi9kYXRhL3Jlc3RvcmVcIjtcbmltcG9ydCB7XG4gIGRyYWdOZXdFbGVtZW50LFxuICBkcmFnU2VsZWN0ZWRFbGVtZW50cyxcbiAgZHVwbGljYXRlRWxlbWVudCxcbiAgZ2V0Q29tbW9uQm91bmRzLFxuICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQsXG4gIGdldERyYWdPZmZzZXRYWSxcbiAgZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuICBnZXROb3JtYWxpemVkRGltZW5zaW9ucyxcbiAgZ2V0UGVyZmVjdEVsZW1lbnRTaXplLFxuICBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbixcbiAgZ2V0UmVzaXplT2Zmc2V0WFksXG4gIGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzLFxuICBoaXRUZXN0LFxuICBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQsXG4gIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LFxuICBpc05vbkRlbGV0ZWRFbGVtZW50LFxuICBpc1RleHRFbGVtZW50LFxuICBuZXdFbGVtZW50LFxuICBuZXdMaW5lYXJFbGVtZW50LFxuICBuZXdUZXh0RWxlbWVudCxcbiAgdGV4dFd5c2l3eWcsXG4gIHRyYW5zZm9ybUVsZW1lbnRzLFxuICB1cGRhdGVUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGJpbmRPclVuYmluZFNlbGVjdGVkRWxlbWVudHMsXG4gIGZpeEJpbmRpbmdzQWZ0ZXJEZWxldGlvbixcbiAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uLFxuICBnZXRFbGlnaWJsZUVsZW1lbnRzRm9yQmluZGluZyxcbiAgZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nLFxuICBpc0JpbmRpbmdFbmFibGVkLFxuICBpc0xpbmVhckVsZW1lbnRTaW1wbGVBbmRBbHJlYWR5Qm91bmQsXG4gIG1heWJlQmluZExpbmVhckVsZW1lbnQsXG4gIHNob3VsZEVuYWJsZUJpbmRpbmdGb3JQb2ludGVyRXZlbnQsXG4gIHVuYmluZExpbmVhckVsZW1lbnRzLFxuICB1cGRhdGVCb3VuZEVsZW1lbnRzLFxufSBmcm9tIFwiLi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4uL2VsZW1lbnQvbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGRlZXBDb3B5RWxlbWVudCwgbmV3RnJlZURyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvbmV3RWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgaXNCaW5kaW5nRWxlbWVudCxcbiAgaXNCaW5kaW5nRWxlbWVudFR5cGUsXG4gIGlzTGluZWFyRWxlbWVudCxcbiAgaXNMaW5lYXJFbGVtZW50VHlwZSxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldENlbnRlciwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi4vZ2VzdHVyZVwiO1xuaW1wb3J0IHtcbiAgZWRpdEdyb3VwRm9yU2VsZWN0ZWRFbGVtZW50LFxuICBnZXRFbGVtZW50c0luR3JvdXAsXG4gIGdldFNlbGVjdGVkR3JvdXBJZEZvckVsZW1lbnQsXG4gIGdldFNlbGVjdGVkR3JvdXBJZHMsXG4gIGlzRWxlbWVudEluR3JvdXAsXG4gIGlzU2VsZWN0ZWRWaWFHcm91cCxcbiAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyxcbn0gZnJvbSBcIi4uL2dyb3Vwc1wiO1xuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIi4uL2hpc3RvcnlcIjtcbmltcG9ydCB7IGRlZmF1bHRMYW5nLCBnZXRMYW5ndWFnZSwgbGFuZ3VhZ2VzLCBzZXRMYW5ndWFnZSwgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQge1xuICBDT0RFUyxcbiAgZ2V0UmVzaXplQ2VudGVyUG9pbnRLZXksXG4gIGdldFJlc2l6ZVdpdGhTaWRlc1NhbWVMZW5ndGhLZXksXG4gIGdldFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlS2V5LFxuICBpc0Fycm93S2V5LFxuICBLRVlTLFxufSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsgZGlzdGFuY2UyZCwgZ2V0R3JpZFBvaW50LCBpc1BhdGhBTG9vcCB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZSB9IGZyb20gXCIuLi9yZW5kZXJlclwiO1xuaW1wb3J0IHsgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudCB9IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJFbGVtZW50XCI7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVTY3JvbGxDZW50ZXIsXG4gIGdldEVsZW1lbnRDb250YWluaW5nUG9zaXRpb24sXG4gIGdldEVsZW1lbnRzQXRQb3NpdGlvbixcbiAgZ2V0RWxlbWVudHNXaXRoaW5TZWxlY3Rpb24sXG4gIGdldE5vcm1hbGl6ZWRab29tLFxuICBnZXRTZWxlY3RlZEVsZW1lbnRzLFxuICBoYXNCYWNrZ3JvdW5kLFxuICBpc092ZXJTY3JvbGxCYXJzLFxuICBpc1NvbWVFbGVtZW50U2VsZWN0ZWQsXG59IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgU2NlbmVTdGF0ZSwgU2Nyb2xsQmFycyB9IGZyb20gXCIuLi9zY2VuZS90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0TmV3Wm9vbSB9IGZyb20gXCIuLi9zY2VuZS96b29tXCI7XG5pbXBvcnQgeyBmaW5kU2hhcGVCeUtleSB9IGZyb20gXCIuLi9zaGFwZXNcIjtcbmltcG9ydCB7XG4gIEFwcFByb3BzLFxuICBBcHBTdGF0ZSxcbiAgRXhjYWxpZHJhd0ltcGVyYXRpdmVBUEksXG4gIEdlc3R1cmUsXG4gIEdlc3R1cmVFdmVudCxcbiAgTGlicmFyeUl0ZW1zLFxuICBQb2ludGVyRG93blN0YXRlLFxuICBTY2VuZURhdGEsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZGVib3VuY2UsXG4gIGRpc3RhbmNlLFxuICBnZXROZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcixcbiAgaXNJbnB1dExpa2UsXG4gIGlzVG9vbEljb24sXG4gIGlzV3JpdGFibGVFbGVtZW50LFxuICByZXNldEN1cnNvcixcbiAgcmVzb2x2YWJsZVByb21pc2UsXG4gIHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyxcbiAgc2V0Q3Vyc29yLFxuICBzZXRDdXJzb3JGb3JTaGFwZSxcbiAgdHVwbGVUb0Nvb3JzLFxuICB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMsXG4gIHdpdGhCYXRjaGVkVXBkYXRlcyxcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgQ29udGV4dE1lbnUsIHsgQ29udGV4dE1lbnVPcHRpb24gfSBmcm9tIFwiLi9Db250ZXh0TWVudVwiO1xuaW1wb3J0IExheWVyVUkgZnJvbSBcIi4vTGF5ZXJVSVwiO1xuaW1wb3J0IHsgU3RhdHMgfSBmcm9tIFwiLi9TdGF0c1wiO1xuaW1wb3J0IHsgVG9hc3QgfSBmcm9tIFwiLi9Ub2FzdFwiO1xuaW1wb3J0IHsgYWN0aW9uVG9nZ2xlVmlld01vZGUgfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25Ub2dnbGVWaWV3TW9kZVwiO1xuXG5jb25zdCBJc01vYmlsZUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KGZhbHNlKTtcbmV4cG9ydCBjb25zdCB1c2VJc01vYmlsZSA9ICgpID0+IHVzZUNvbnRleHQoSXNNb2JpbGVDb250ZXh0KTtcbmNvbnN0IEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dDx7XG4gIGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsO1xuICBpZDogc3RyaW5nIHwgbnVsbDtcbn0+KHsgY29udGFpbmVyOiBudWxsLCBpZDogbnVsbCB9KTtcbmV4cG9ydCBjb25zdCB1c2VFeGNhbGlkcmF3Q29udGFpbmVyID0gKCkgPT5cbiAgdXNlQ29udGV4dChFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dCk7XG5cbmxldCBkaWRUYXBUd2ljZTogYm9vbGVhbiA9IGZhbHNlO1xubGV0IHRhcHBlZFR3aWNlVGltZXIgPSAwO1xubGV0IGN1cnNvclggPSAwO1xubGV0IGN1cnNvclkgPSAwO1xubGV0IGlzSG9sZGluZ1NwYWNlOiBib29sZWFuID0gZmFsc2U7XG5sZXQgaXNQYW5uaW5nOiBib29sZWFuID0gZmFsc2U7XG5sZXQgaXNEcmFnZ2luZ1Njcm9sbEJhcjogYm9vbGVhbiA9IGZhbHNlO1xubGV0IGN1cnJlbnRTY3JvbGxCYXJzOiBTY3JvbGxCYXJzID0geyBob3Jpem9udGFsOiBudWxsLCB2ZXJ0aWNhbDogbnVsbCB9O1xubGV0IHRvdWNoVGltZW91dCA9IDA7XG5sZXQgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG5cbmxldCBsYXN0UG9pbnRlclVwOiAoKGV2ZW50OiBhbnkpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5jb25zdCBnZXN0dXJlOiBHZXN0dXJlID0ge1xuICBwb2ludGVyczogbmV3IE1hcCgpLFxuICBsYXN0Q2VudGVyOiBudWxsLFxuICBpbml0aWFsRGlzdGFuY2U6IG51bGwsXG4gIGluaXRpYWxTY2FsZTogbnVsbCxcbn07XG5cbmNsYXNzIEFwcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxBcHBQcm9wcywgQXBwU3RhdGU+IHtcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICByYzogUm91Z2hDYW52YXMgfCBudWxsID0gbnVsbDtcbiAgdW5tb3VudGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGFjdGlvbk1hbmFnZXI6IEFjdGlvbk1hbmFnZXI7XG4gIGlzTW9iaWxlID0gZmFsc2U7XG4gIGRldGFjaElzTW9iaWxlTXFIYW5kbGVyPzogKCkgPT4gdm9pZDtcblxuICBwcml2YXRlIGV4Y2FsaWRyYXdDb250YWluZXJSZWYgPSBSZWFjdC5jcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG5cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UHJvcHM6IFBhcnRpYWw8QXBwUHJvcHM+ID0ge1xuICAgIC8vIG5lZWRlZCBmb3IgdGVzdHMgdG8gcGFzcyBzaW5jZSB3ZSBkaXJlY3RseSByZW5kZXIgQXBwIGluIG1hbnkgdGVzdHNcbiAgICBVSU9wdGlvbnM6IERFRkFVTFRfVUlfT1BUSU9OUyxcbiAgfTtcblxuICBwcml2YXRlIHNjZW5lOiBTY2VuZTtcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgbmVhcmVzdFNjcm9sbGFibGVDb250YWluZXI6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBsaWJyYXJ5OiBMaWJyYXJ5O1xuICBwdWJsaWMgbGlicmFyeUl0ZW1zRnJvbVN0b3JhZ2U6IExpYnJhcnlJdGVtcyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpZDogc3RyaW5nO1xuICBwcml2YXRlIGhpc3Rvcnk6IEhpc3Rvcnk7XG4gIHByaXZhdGUgZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlOiB7XG4gICAgY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGw7XG4gICAgaWQ6IHN0cmluZztcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQXBwUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG4gICAgY29uc3Qge1xuICAgICAgZXhjYWxpZHJhd1JlZixcbiAgICAgIHZpZXdNb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgemVuTW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIGdyaWRNb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgdGhlbWUgPSBkZWZhdWx0QXBwU3RhdGUudGhlbWUsXG4gICAgICBuYW1lID0gZGVmYXVsdEFwcFN0YXRlLm5hbWUsXG4gICAgfSA9IHByb3BzO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAuLi5kZWZhdWx0QXBwU3RhdGUsXG4gICAgICB0aGVtZSxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIC4uLnRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpLFxuICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgICAgemVuTW9kZUVuYWJsZWQsXG4gICAgICBncmlkU2l6ZTogZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbCxcbiAgICAgIG5hbWUsXG4gICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICB9O1xuXG4gICAgdGhpcy5pZCA9IG5hbm9pZCgpO1xuXG4gICAgaWYgKGV4Y2FsaWRyYXdSZWYpIHtcbiAgICAgIGNvbnN0IHJlYWR5UHJvbWlzZSA9XG4gICAgICAgIChcImN1cnJlbnRcIiBpbiBleGNhbGlkcmF3UmVmICYmIGV4Y2FsaWRyYXdSZWYuY3VycmVudD8ucmVhZHlQcm9taXNlKSB8fFxuICAgICAgICByZXNvbHZhYmxlUHJvbWlzZTxFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQST4oKTtcblxuICAgICAgY29uc3QgYXBpOiBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSSA9IHtcbiAgICAgICAgcmVhZHk6IHRydWUsXG4gICAgICAgIHJlYWR5UHJvbWlzZSxcbiAgICAgICAgdXBkYXRlU2NlbmU6IHRoaXMudXBkYXRlU2NlbmUsXG4gICAgICAgIHJlc2V0U2NlbmU6IHRoaXMucmVzZXRTY2VuZSxcbiAgICAgICAgZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQ6IHRoaXMuZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQsXG4gICAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgICBjbGVhcjogdGhpcy5yZXNldEhpc3RvcnksXG4gICAgICAgIH0sXG4gICAgICAgIHNjcm9sbFRvQ29udGVudDogdGhpcy5zY3JvbGxUb0NvbnRlbnQsXG4gICAgICAgIHpvb21Ub0ZpdDogdGhpcy56b29tVG9GaXQsXG4gICAgICAgIGdldFNjZW5lRWxlbWVudHM6IHRoaXMuZ2V0U2NlbmVFbGVtZW50cyxcbiAgICAgICAgZ2V0QXBwU3RhdGU6ICgpID0+IHRoaXMuc3RhdGUsXG4gICAgICAgIHJlZnJlc2g6IHRoaXMucmVmcmVzaCxcbiAgICAgICAgaW1wb3J0TGlicmFyeTogdGhpcy5pbXBvcnRMaWJyYXJ5RnJvbVVybCxcbiAgICAgICAgc2V0VG9hc3RNZXNzYWdlOiB0aGlzLnNldFRvYXN0TWVzc2FnZSxcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB9IGFzIGNvbnN0O1xuICAgICAgaWYgKHR5cGVvZiBleGNhbGlkcmF3UmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZXhjYWxpZHJhd1JlZihhcGkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhjYWxpZHJhd1JlZi5jdXJyZW50ID0gYXBpO1xuICAgICAgfVxuICAgICAgcmVhZHlQcm9taXNlLnJlc29sdmUoYXBpKTtcbiAgICB9XG5cbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJWYWx1ZSA9IHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICB9O1xuXG4gICAgdGhpcy5zY2VuZSA9IG5ldyBTY2VuZSgpO1xuICAgIHRoaXMubGlicmFyeSA9IG5ldyBMaWJyYXJ5KHRoaXMpO1xuICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KCk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyID0gbmV3IEFjdGlvbk1hbmFnZXIoXG4gICAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQsXG4gICAgICAoKSA9PiB0aGlzLnN0YXRlLFxuICAgICAgKCkgPT4gdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMsXG4gICAgKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBbGwoYWN0aW9ucyk7XG5cbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBY3Rpb24oY3JlYXRlVW5kb0FjdGlvbih0aGlzLmhpc3RvcnkpKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBY3Rpb24oY3JlYXRlUmVkb0FjdGlvbih0aGlzLmhpc3RvcnkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ2FudmFzKCkge1xuICAgIGNvbnN0IGNhbnZhc1NjYWxlID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHQsXG4gICAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgY2FudmFzV2lkdGggPSBjYW52YXNET01XaWR0aCAqIGNhbnZhc1NjYWxlO1xuICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IGNhbnZhc0RPTUhlaWdodCAqIGNhbnZhc1NjYWxlO1xuICAgIGlmICh2aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxjYW52YXNcbiAgICAgICAgICBjbGFzc05hbWU9XCJleGNhbGlkcmF3X19jYW52YXNcIlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICB3aWR0aDogY2FudmFzRE9NV2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodCxcbiAgICAgICAgICAgIGN1cnNvcjogQ1VSU09SX1RZUEUuR1JBQixcbiAgICAgICAgICB9fVxuICAgICAgICAgIHdpZHRoPXtjYW52YXNXaWR0aH1cbiAgICAgICAgICBoZWlnaHQ9e2NhbnZhc0hlaWdodH1cbiAgICAgICAgICByZWY9e3RoaXMuaGFuZGxlQ2FudmFzUmVmfVxuICAgICAgICAgIG9uQ29udGV4dE1lbnU9e3RoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnV9XG4gICAgICAgICAgb25Qb2ludGVyTW92ZT17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyTW92ZX1cbiAgICAgICAgICBvblBvaW50ZXJVcD17dGhpcy5yZW1vdmVQb2ludGVyfVxuICAgICAgICAgIG9uUG9pbnRlckNhbmNlbD17dGhpcy5yZW1vdmVQb2ludGVyfVxuICAgICAgICAgIG9uVG91Y2hNb3ZlPXt0aGlzLmhhbmRsZVRvdWNoTW92ZX1cbiAgICAgICAgICBvblBvaW50ZXJEb3duPXt0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3dufVxuICAgICAgICA+XG4gICAgICAgICAge3QoXCJsYWJlbHMuZHJhd2luZ0NhbnZhc1wiKX1cbiAgICAgICAgPC9jYW52YXM+XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGNhbnZhc1xuICAgICAgICBjbGFzc05hbWU9XCJleGNhbGlkcmF3X19jYW52YXNcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIHdpZHRoOiBjYW52YXNET01XaWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodCxcbiAgICAgICAgfX1cbiAgICAgICAgd2lkdGg9e2NhbnZhc1dpZHRofVxuICAgICAgICBoZWlnaHQ9e2NhbnZhc0hlaWdodH1cbiAgICAgICAgcmVmPXt0aGlzLmhhbmRsZUNhbnZhc1JlZn1cbiAgICAgICAgb25Db250ZXh0TWVudT17dGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudX1cbiAgICAgICAgb25Qb2ludGVyRG93bj17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyRG93bn1cbiAgICAgICAgb25Eb3VibGVDbGljaz17dGhpcy5oYW5kbGVDYW52YXNEb3VibGVDbGlja31cbiAgICAgICAgb25Qb2ludGVyTW92ZT17dGhpcy5oYW5kbGVDYW52YXNQb2ludGVyTW92ZX1cbiAgICAgICAgb25Qb2ludGVyVXA9e3RoaXMucmVtb3ZlUG9pbnRlcn1cbiAgICAgICAgb25Qb2ludGVyQ2FuY2VsPXt0aGlzLnJlbW92ZVBvaW50ZXJ9XG4gICAgICAgIG9uVG91Y2hNb3ZlPXt0aGlzLmhhbmRsZVRvdWNoTW92ZX1cbiAgICAgID5cbiAgICAgICAge3QoXCJsYWJlbHMuZHJhd2luZ0NhbnZhc1wiKX1cbiAgICAgIDwvY2FudmFzPlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgemVuTW9kZUVuYWJsZWQsIHZpZXdNb2RlRW5hYmxlZCB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGNvbnN0IHtcbiAgICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2ssXG4gICAgICByZW5kZXJUb3BSaWdodFVJLFxuICAgICAgcmVuZGVyRm9vdGVyLFxuICAgICAgcmVuZGVyQ3VzdG9tU3RhdHMsXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9e2Nsc3goXCJleGNhbGlkcmF3IGV4Y2FsaWRyYXctY29udGFpbmVyXCIsIHtcbiAgICAgICAgICBcImV4Y2FsaWRyYXctLXZpZXctbW9kZVwiOiB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICAgICAgXCJleGNhbGlkcmF3LS1tb2JpbGVcIjogdGhpcy5pc01vYmlsZSxcbiAgICAgICAgfSl9XG4gICAgICAgIHJlZj17dGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmfVxuICAgICAgICBvbkRyb3A9e3RoaXMuaGFuZGxlQXBwT25Ecm9wfVxuICAgICAgICB0YWJJbmRleD17MH1cbiAgICAgICAgb25LZXlEb3duPXtcbiAgICAgICAgICB0aGlzLnByb3BzLmhhbmRsZUtleWJvYXJkR2xvYmFsbHkgPyB1bmRlZmluZWQgOiB0aGlzLm9uS2V5RG93blxuICAgICAgICB9XG4gICAgICA+XG4gICAgICAgIDxFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dC5Qcm92aWRlclxuICAgICAgICAgIHZhbHVlPXt0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJWYWx1ZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxJc01vYmlsZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3RoaXMuaXNNb2JpbGV9PlxuICAgICAgICAgICAgPExheWVyVUlcbiAgICAgICAgICAgICAgY2FudmFzPXt0aGlzLmNhbnZhc31cbiAgICAgICAgICAgICAgYXBwU3RhdGU9e3RoaXMuc3RhdGV9XG4gICAgICAgICAgICAgIHNldEFwcFN0YXRlPXt0aGlzLnNldEFwcFN0YXRlfVxuICAgICAgICAgICAgICBhY3Rpb25NYW5hZ2VyPXt0aGlzLmFjdGlvbk1hbmFnZXJ9XG4gICAgICAgICAgICAgIGVsZW1lbnRzPXt0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCl9XG4gICAgICAgICAgICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2s9e29uQ29sbGFiQnV0dG9uQ2xpY2t9XG4gICAgICAgICAgICAgIG9uTG9ja1RvZ2dsZT17dGhpcy50b2dnbGVMb2NrfVxuICAgICAgICAgICAgICBvbkluc2VydEVsZW1lbnRzPXsoZWxlbWVudHMpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgemVuTW9kZUVuYWJsZWQ9e3plbk1vZGVFbmFibGVkfVxuICAgICAgICAgICAgICB0b2dnbGVaZW5Nb2RlPXt0aGlzLnRvZ2dsZVplbk1vZGV9XG4gICAgICAgICAgICAgIGxhbmdDb2RlPXtnZXRMYW5ndWFnZSgpLmNvZGV9XG4gICAgICAgICAgICAgIGlzQ29sbGFib3JhdGluZz17dGhpcy5wcm9wcy5pc0NvbGxhYm9yYXRpbmcgfHwgZmFsc2V9XG4gICAgICAgICAgICAgIHJlbmRlclRvcFJpZ2h0VUk9e3JlbmRlclRvcFJpZ2h0VUl9XG4gICAgICAgICAgICAgIHJlbmRlckN1c3RvbUZvb3Rlcj17cmVuZGVyRm9vdGVyfVxuICAgICAgICAgICAgICB2aWV3TW9kZUVuYWJsZWQ9e3ZpZXdNb2RlRW5hYmxlZH1cbiAgICAgICAgICAgICAgc2hvd0V4aXRaZW5Nb2RlQnRuPXtcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcz8uemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNob3dUaGVtZUJ0bj17XG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMucHJvcHM/LnRoZW1lID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5VSU9wdGlvbnMuY2FudmFzQWN0aW9ucy50aGVtZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxpYnJhcnlSZXR1cm5Vcmw9e3RoaXMucHJvcHMubGlicmFyeVJldHVyblVybH1cbiAgICAgICAgICAgICAgVUlPcHRpb25zPXt0aGlzLnByb3BzLlVJT3B0aW9uc31cbiAgICAgICAgICAgICAgZm9jdXNDb250YWluZXI9e3RoaXMuZm9jdXNDb250YWluZXJ9XG4gICAgICAgICAgICAgIGxpYnJhcnk9e3RoaXMubGlicmFyeX1cbiAgICAgICAgICAgICAgaWQ9e3RoaXMuaWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJleGNhbGlkcmF3LXRleHRFZGl0b3JDb250YWluZXJcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJleGNhbGlkcmF3LWNvbnRleHRNZW51Q29udGFpbmVyXCIgLz5cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLnNob3dTdGF0cyAmJiAoXG4gICAgICAgICAgICAgIDxTdGF0c1xuICAgICAgICAgICAgICAgIGFwcFN0YXRlPXt0aGlzLnN0YXRlfVxuICAgICAgICAgICAgICAgIHNldEFwcFN0YXRlPXt0aGlzLnNldEFwcFN0YXRlfVxuICAgICAgICAgICAgICAgIGVsZW1lbnRzPXt0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCl9XG4gICAgICAgICAgICAgICAgb25DbG9zZT17dGhpcy50b2dnbGVTdGF0c31cbiAgICAgICAgICAgICAgICByZW5kZXJDdXN0b21TdGF0cz17cmVuZGVyQ3VzdG9tU3RhdHN9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3RoaXMuc3RhdGUudG9hc3RNZXNzYWdlICE9PSBudWxsICYmIChcbiAgICAgICAgICAgICAgPFRvYXN0XG4gICAgICAgICAgICAgICAgbWVzc2FnZT17dGhpcy5zdGF0ZS50b2FzdE1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgY2xlYXJUb2FzdD17dGhpcy5jbGVhclRvYXN0fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDxtYWluPnt0aGlzLnJlbmRlckNhbnZhcygpfTwvbWFpbj5cbiAgICAgICAgICA8L0lzTW9iaWxlQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgPC9FeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZm9jdXNDb250YWluZXIgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMucHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIGdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpO1xuICB9O1xuXG4gIHB1YmxpYyBnZXRTY2VuZUVsZW1lbnRzID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBzeW5jQWN0aW9uUmVzdWx0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIChhY3Rpb25SZXN1bHQ6IEFjdGlvblJlc3VsdCkgPT4ge1xuICAgICAgaWYgKHRoaXMudW5tb3VudGVkIHx8IGFjdGlvblJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgZWRpdGluZ0VsZW1lbnQ6IEFwcFN0YXRlW1wiZWRpdGluZ0VsZW1lbnRcIl0gfCBudWxsID0gbnVsbDtcbiAgICAgIGlmIChhY3Rpb25SZXN1bHQuZWxlbWVudHMpIHtcbiAgICAgICAgYWN0aW9uUmVzdWx0LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50Py5pZCA9PT0gZWxlbWVudC5pZCAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudCAhPT0gZWxlbWVudCAmJlxuICAgICAgICAgICAgaXNOb25EZWxldGVkRWxlbWVudChlbGVtZW50KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZWRpdGluZ0VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGFjdGlvblJlc3VsdC5lbGVtZW50cyk7XG4gICAgICAgIGlmIChhY3Rpb25SZXN1bHQuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3Rpb25SZXN1bHQuYXBwU3RhdGUgfHwgZWRpdGluZ0VsZW1lbnQpIHtcbiAgICAgICAgaWYgKGFjdGlvblJlc3VsdC5jb21taXRUb0hpc3RvcnkpIHtcbiAgICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmlld01vZGVFbmFibGVkID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8udmlld01vZGVFbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBsZXQgemVuTW9kZUVuYWJsZWQgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy56ZW5Nb2RlRW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgbGV0IGdyaWRTaXplID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8uZ3JpZFNpemUgfHwgbnVsbDtcbiAgICAgICAgbGV0IHRoZW1lID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8udGhlbWUgfHwgXCJsaWdodFwiO1xuICAgICAgICBsZXQgbmFtZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/Lm5hbWUgPz8gdGhpcy5zdGF0ZS5uYW1lO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgdmlld01vZGVFbmFibGVkID0gdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZCA9IHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgZ3JpZFNpemUgPSB0aGlzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMudGhlbWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB0aGVtZSA9IHRoaXMucHJvcHMudGhlbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMubmFtZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLnByb3BzLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgIC8vIHVzaW5nIE9iamVjdC5hc3NpZ24gaW5zdGVhZCBvZiBzcHJlYWQgdG8gZm9vbCBUUyA0LjIuMisgaW50b1xuICAgICAgICAgICAgLy8gcmVnYXJkaW5nIHRoZSByZXN1bHRpbmcgdHlwZSBhcyBub3QgY29udGFpbmluZyB1bmRlZmluZWRcbiAgICAgICAgICAgIC8vICh3aGljaCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb24gd2lsbCBuZXZlciBjb250YWluKVxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IHt9LCB7XG4gICAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50OlxuICAgICAgICAgICAgICAgIGVkaXRpbmdFbGVtZW50IHx8IGFjdGlvblJlc3VsdC5hcHBTdGF0ZT8uZWRpdGluZ0VsZW1lbnQgfHwgbnVsbCxcbiAgICAgICAgICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgICAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgICAgICAgICAgZ3JpZFNpemUsXG4gICAgICAgICAgICAgIHRoZW1lLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uUmVzdWx0LnN5bmNIaXN0b3J5KSB7XG4gICAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5zZXRDdXJyZW50U3RhdGUoXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICAvLyBMaWZlY3ljbGVcblxuICBwcml2YXRlIG9uQmx1ciA9IHdpdGhCYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgaXNIb2xkaW5nU3BhY2UgPSBmYWxzZTtcbiAgICB0aGlzLnNldFN0YXRlKHsgaXNCaW5kaW5nRW5hYmxlZDogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBvblVubG9hZCA9ICgpID0+IHtcbiAgICB0aGlzLm9uQmx1cigpO1xuICB9O1xuXG4gIHByaXZhdGUgZGlzYWJsZUV2ZW50OiBFdmVudEhhbmRsZXJOb25OdWxsID0gKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfTtcblxuICBwcml2YXRlIG9uRm9udExvYWRlZCA9ICgpID0+IHtcbiAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5vblNjZW5lVXBkYXRlZCgpO1xuICB9O1xuXG4gIHByaXZhdGUgaW1wb3J0TGlicmFyeUZyb21VcmwgPSBhc3luYyAodXJsOiBzdHJpbmcsIHRva2VuPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaGFzaC5pbmNsdWRlcyhVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnkpKSB7XG4gICAgICBjb25zdCBoYXNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKSk7XG4gICAgICBoYXNoLmRlbGV0ZShVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnkpO1xuICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBBUFBfTkFNRSwgYCMke2hhc2gudG9TdHJpbmcoKX1gKTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guaW5jbHVkZXMoVVJMX1FVRVJZX0tFWVMuYWRkTGlicmFyeSkpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgIHF1ZXJ5LmRlbGV0ZShVUkxfUVVFUllfS0VZUy5hZGRMaWJyYXJ5KTtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgQVBQX05BTUUsIGA/JHtxdWVyeS50b1N0cmluZygpfWApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgZmV0Y2goZGVjb2RlVVJJQ29tcG9uZW50KHVybCkpO1xuICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlcXVlc3QuYmxvYigpO1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgYmxvYi50ZXh0KCkpO1xuICAgICAgaWYgKCFpc1ZhbGlkTGlicmFyeShqc29uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdG9rZW4gPT09IHRoaXMuaWQgfHxcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgdChcImFsZXJ0cy5jb25maXJtQWRkTGlicmFyeVwiLCB7IG51bVNoYXBlczoganNvbi5saWJyYXJ5Lmxlbmd0aCB9KSxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubGlicmFyeS5pbXBvcnRMaWJyYXJ5KGJsb2IpO1xuICAgICAgICAvLyBoYWNrIHRvIHJlcmVuZGVyIHRoZSBsaWJyYXJ5IGl0ZW1zIGFmdGVyIGltcG9ydFxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pc0xpYnJhcnlPcGVuKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xpYnJhcnlPcGVuOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB3aW5kb3cuYWxlcnQodChcImFsZXJ0cy5lcnJvckxvYWRpbmdMaWJyYXJ5XCIpKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgcmVzZXRIaXN0b3J5ID0gKCkgPT4ge1xuICAgIHRoaXMuaGlzdG9yeS5jbGVhcigpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNldHMgc2NlbmUgJiBoaXN0b3J5LlxuICAgKiAhIERvIG5vdCB1c2UgdG8gY2xlYXIgc2NlbmUgdXNlciBhY3Rpb24gIVxuICAgKi9cbiAgcHJpdmF0ZSByZXNldFNjZW5lID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIChvcHRzPzogeyByZXNldExvYWRpbmdTdGF0ZTogYm9vbGVhbiB9KSA9PiB7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXSk7XG4gICAgICB0aGlzLnNldFN0YXRlKChzdGF0ZSkgPT4gKHtcbiAgICAgICAgLi4uZ2V0RGVmYXVsdEFwcFN0YXRlKCksXG4gICAgICAgIGlzTG9hZGluZzogb3B0cz8ucmVzZXRMb2FkaW5nU3RhdGUgPyBmYWxzZSA6IHN0YXRlLmlzTG9hZGluZyxcbiAgICAgICAgdGhlbWU6IHRoaXMuc3RhdGUudGhlbWUsXG4gICAgICB9KSk7XG4gICAgICB0aGlzLnJlc2V0SGlzdG9yeSgpO1xuICAgIH0sXG4gICk7XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2NlbmUgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKFwibGF1bmNoUXVldWVcIiBpbiB3aW5kb3cgJiYgXCJMYXVuY2hQYXJhbXNcIiBpbiB3aW5kb3cpIHtcbiAgICAgICh3aW5kb3cgYXMgYW55KS5sYXVuY2hRdWV1ZS5zZXRDb25zdW1lcihcbiAgICAgICAgYXN5bmMgKGxhdW5jaFBhcmFtczogeyBmaWxlczogYW55W10gfSkgPT4ge1xuICAgICAgICAgIGlmICghbGF1bmNoUGFyYW1zLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmaWxlSGFuZGxlID0gbGF1bmNoUGFyYW1zLmZpbGVzWzBdO1xuICAgICAgICAgIGNvbnN0IGJsb2I6IEJsb2IgPSBhd2FpdCBmaWxlSGFuZGxlLmdldEZpbGUoKTtcbiAgICAgICAgICBibG9iLmhhbmRsZSA9IGZpbGVIYW5kbGU7XG4gICAgICAgICAgbG9hZEZyb21CbG9iKFxuICAgICAgICAgICAgYmxvYixcbiAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICAgIClcbiAgICAgICAgICAgIC50aGVuKCh7IGVsZW1lbnRzLCBhcHBTdGF0ZSB9KSA9PlxuICAgICAgICAgICAgICB0aGlzLnN5bmNBY3Rpb25SZXN1bHQoe1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgICAgICAgICAuLi4oYXBwU3RhdGUgfHwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTG9hZGluZzogZmFsc2UsIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiB0cnVlIH0pO1xuICAgIH1cbiAgICBsZXQgaW5pdGlhbERhdGEgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBpbml0aWFsRGF0YSA9IChhd2FpdCB0aGlzLnByb3BzLmluaXRpYWxEYXRhKSB8fCBudWxsO1xuICAgICAgaWYgKGluaXRpYWxEYXRhPy5saWJyYXJ5SXRlbXMpIHtcbiAgICAgICAgdGhpcy5saWJyYXJ5SXRlbXNGcm9tU3RvcmFnZSA9IGluaXRpYWxEYXRhLmxpYnJhcnlJdGVtcztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICBpbml0aWFsRGF0YSA9IHtcbiAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlIHx8XG4gICAgICAgICAgICBcIkVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyBpbXBvcnRpbmcgb3IgcmVzdG9yaW5nIHNjZW5lIGRhdGFcIixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmUgPSByZXN0b3JlKGluaXRpYWxEYXRhLCBudWxsLCBudWxsKTtcbiAgICBzY2VuZS5hcHBTdGF0ZSA9IHtcbiAgICAgIC4uLnNjZW5lLmFwcFN0YXRlLFxuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICB9O1xuICAgIGlmIChpbml0aWFsRGF0YT8uc2Nyb2xsVG9Db250ZW50KSB7XG4gICAgICBzY2VuZS5hcHBTdGF0ZSA9IHtcbiAgICAgICAgLi4uc2NlbmUuYXBwU3RhdGUsXG4gICAgICAgIC4uLmNhbGN1bGF0ZVNjcm9sbENlbnRlcihcbiAgICAgICAgICBzY2VuZS5lbGVtZW50cyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5zY2VuZS5hcHBTdGF0ZSxcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnN0YXRlLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnN0YXRlLmhlaWdodCxcbiAgICAgICAgICAgIG9mZnNldFRvcDogdGhpcy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgICAgICAgICBvZmZzZXRMZWZ0OiB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBudWxsLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0SGlzdG9yeSgpO1xuICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCh7XG4gICAgICAuLi5zY2VuZSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGxpYnJhcnlVcmwgPVxuICAgICAgLy8gY3VycmVudFxuICAgICAgbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKSkuZ2V0KFxuICAgICAgICBVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnksXG4gICAgICApIHx8XG4gICAgICAvLyBsZWdhY3ksIGtlcHQgZm9yIGNvbXBhdCByZWFzb25zXG4gICAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldChcbiAgICAgICAgVVJMX1FVRVJZX0tFWVMuYWRkTGlicmFyeSxcbiAgICAgICk7XG5cbiAgICBpZiAobGlicmFyeVVybCkge1xuICAgICAgYXdhaXQgdGhpcy5pbXBvcnRMaWJyYXJ5RnJvbVVybChsaWJyYXJ5VXJsKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIGFzeW5jIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlLmNvbnRhaW5lciA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50O1xuXG4gICAgaWYgKFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5URVNUIHx8XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLkRFVkVMT1BNRU5UXG4gICAgKSB7XG4gICAgICBjb25zdCBzZXRTdGF0ZSA9IHRoaXMuc2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdpbmRvdy5oLCB7XG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2V0U3RhdGU6IHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWU6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBzZXRTdGF0ZT4pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldFN0YXRlKC4uLmFyZ3MpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFwcDoge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogdGhpcyxcbiAgICAgICAgfSxcbiAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5oaXN0b3J5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zY2VuZS5hZGRDYWxsYmFjayh0aGlzLm9uU2NlbmVVcGRhdGVkKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICBpZiAodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIHRoaXMuZm9jdXNDb250YWluZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoXCJSZXNpemVPYnNlcnZlclwiIGluIHdpbmRvdyAmJiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAvLyBjb21wdXRlIGlzTW9iaWxlIHN0YXRlXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICB9ID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLmlzTW9iaWxlID1cbiAgICAgICAgICB3aWR0aCA8IE1RX01BWF9XSURUSF9QT1JUUkFJVCB8fFxuICAgICAgICAgIChoZWlnaHQgPCBNUV9NQVhfSEVJR0hUX0xBTkRTQ0FQRSAmJiB3aWR0aCA8IE1RX01BWF9XSURUSF9MQU5EU0NBUEUpO1xuICAgICAgICAvLyByZWZyZXNoIG9mZnNldHNcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIHRoaXMudXBkYXRlRE9NUmVjdCgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5vYnNlcnZlKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKSB7XG4gICAgICBjb25zdCBtZWRpYVF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoXG4gICAgICAgIGAobWF4LXdpZHRoOiAke01RX01BWF9XSURUSF9QT1JUUkFJVH1weCksIChtYXgtaGVpZ2h0OiAke01RX01BWF9IRUlHSFRfTEFORFNDQVBFfXB4KSBhbmQgKG1heC13aWR0aDogJHtNUV9NQVhfV0lEVEhfTEFORFNDQVBFfXB4KWAsXG4gICAgICApO1xuICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+ICh0aGlzLmlzTW9iaWxlID0gbWVkaWFRdWVyeS5tYXRjaGVzKTtcbiAgICAgIG1lZGlhUXVlcnkuYWRkTGlzdGVuZXIoaGFuZGxlcik7XG4gICAgICB0aGlzLmRldGFjaElzTW9iaWxlTXFIYW5kbGVyID0gKCkgPT4gbWVkaWFRdWVyeS5yZW1vdmVMaXN0ZW5lcihoYW5kbGVyKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkpO1xuXG4gICAgaWYgKHNlYXJjaFBhcmFtcy5oYXMoXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpKSB7XG4gICAgICAvLyBPYnRhaW4gYSBmaWxlIHRoYXQgd2FzIHNoYXJlZCB2aWEgdGhlIFdlYiBTaGFyZSBUYXJnZXQgQVBJLlxuICAgICAgdGhpcy5yZXN0b3JlRmlsZUZyb21TaGFyZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZURPTVJlY3QodGhpcy5pbml0aWFsaXplU2NlbmUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcbiAgICBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICB0b3VjaFRpbWVvdXQgPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlc2l6ZSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoKSA9PiB7XG4gICAgdGhpcy5zY2VuZVxuICAgICAgLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpXG4gICAgICAuZm9yRWFjaCgoZWxlbWVudCkgPT4gaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7fSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0aGlzLnJlbW92ZVBvaW50ZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ09QWSwgdGhpcy5vbkNvcHkpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULlNDUk9MTCxcbiAgICAgIHRoaXMub25TY3JvbGwsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULk1PVVNFX01PVkUsXG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRDdXJzb3JQb3NpdGlvbixcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgdGhpcy5vbktleVVwKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5SRVNJWkUsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5VTkxPQUQsIHRoaXMub25VbmxvYWQsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0aGlzLm9uQmx1ciwgZmFsc2UpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkRSQUdfT1ZFUiwgdGhpcy5kaXNhYmxlRXZlbnQsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5EUk9QLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfU1RBUlQsXG4gICAgICB0aGlzLm9uR2VzdHVyZVN0YXJ0IGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfQ0hBTkdFLFxuICAgICAgdGhpcy5vbkdlc3R1cmVDaGFuZ2UgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuR0VTVFVSRV9FTkQsXG4gICAgICB0aGlzLm9uR2VzdHVyZUVuZCBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuXG4gICAgdGhpcy5kZXRhY2hJc01vYmlsZU1xSGFuZGxlcj8uKCk7XG4gIH1cblxuICBwcml2YXRlIGFkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRoaXMucmVtb3ZlUG9pbnRlcik7IC8vICMzNTUzXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT1BZLCB0aGlzLm9uQ29weSk7XG4gICAgaWYgKHRoaXMucHJvcHMuaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSkge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCB0aGlzLm9uS2V5RG93biwgZmFsc2UpO1xuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCB0aGlzLm9uS2V5VXAsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgRVZFTlQuTU9VU0VfTU9WRSxcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uLFxuICAgICk7XG4gICAgLy8gcmVyZW5kZXIgdGV4dCBlbGVtZW50cyBvbiBmb250IGxvYWQgdG8gZml4ICM2MzcgJiYgIzE1NTNcbiAgICBkb2N1bWVudC5mb250cz8uYWRkRXZlbnRMaXN0ZW5lcj8uKFwibG9hZGluZ2RvbmVcIiwgdGhpcy5vbkZvbnRMb2FkZWQpO1xuICAgIC8vIFNhZmFyaS1vbmx5IGRlc2t0b3AgcGluY2ggem9vbVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5HRVNUVVJFX1NUQVJULFxuICAgICAgdGhpcy5vbkdlc3R1cmVTdGFydCBhcyBhbnksXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBFVkVOVC5HRVNUVVJFX0NIQU5HRSxcbiAgICAgIHRoaXMub25HZXN0dXJlQ2hhbmdlIGFzIGFueSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgIEVWRU5ULkdFU1RVUkVfRU5ELFxuICAgICAgdGhpcy5vbkdlc3R1cmVFbmQgYXMgYW55LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DVVQsIHRoaXMub25DdXQpO1xuICAgIGlmICh0aGlzLnByb3BzLmRldGVjdFNjcm9sbCkge1xuICAgICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lciA9IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyKFxuICAgICAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICApO1xuICAgICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICBFVkVOVC5TQ1JPTEwsXG4gICAgICAgIHRoaXMub25TY3JvbGwsXG4gICAgICApO1xuICAgIH1cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5SRVNJWkUsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5VTkxPQUQsIHRoaXMub25VbmxvYWQsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0aGlzLm9uQmx1ciwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkRSQUdfT1ZFUiwgdGhpcy5kaXNhYmxlRXZlbnQsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5EUk9QLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogQXBwUHJvcHMsIHByZXZTdGF0ZTogQXBwU3RhdGUpIHtcbiAgICBpZiAocHJldlByb3BzLmxhbmdDb2RlICE9PSB0aGlzLnByb3BzLmxhbmdDb2RlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxhbmd1YWdlKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy52aWV3TW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgdmlld01vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMudmlld01vZGVFbmFibGVkIH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2U3RhdGUudmlld01vZGVFbmFibGVkICE9PSB0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgdGhpcy5kZXNlbGVjdEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy56ZW5Nb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHplbk1vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy50aGVtZSAhPT0gdGhpcy5wcm9wcy50aGVtZSAmJiB0aGlzLnByb3BzLnRoZW1lKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgdGhlbWU6IHRoaXMucHJvcHMudGhlbWUgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5ncmlkTW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZ3JpZFNpemU6IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLm5hbWUgJiYgcHJldlByb3BzLm5hbWUgIT09IHRoaXMucHJvcHMubmFtZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG5hbWU6IHRoaXMucHJvcHMubmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jbGFzc0xpc3QudG9nZ2xlKFxuICAgICAgXCJ0aGVtZS0tZGFya1wiLFxuICAgICAgdGhpcy5zdGF0ZS50aGVtZSA9PT0gXCJkYXJrXCIsXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiZcbiAgICAgICF0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1t0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF1cbiAgICApIHtcbiAgICAgIC8vIGRlZmVyIHNvIHRoYXQgdGhlIGNvbW1pdFRvSGlzdG9yeSBmbGFnIGlzbid0IHJlc2V0IHZpYSBjdXJyZW50IHVwZGF0ZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gcHJldlN0YXRlO1xuICAgIGlmIChcbiAgICAgIHByZXZTdGF0ZS5lbGVtZW50VHlwZSAhPT0gdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSAmJlxuICAgICAgbXVsdGlFbGVtZW50ICE9IG51bGwgJiZcbiAgICAgIGlzQmluZGluZ0VuYWJsZWQodGhpcy5zdGF0ZSkgJiZcbiAgICAgIGlzQmluZGluZ0VsZW1lbnQobXVsdGlFbGVtZW50KVxuICAgICkge1xuICAgICAgbWF5YmVCaW5kTGluZWFyRWxlbWVudChcbiAgICAgICAgbXVsdGlFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICB0aGlzLnNjZW5lLFxuICAgICAgICB0dXBsZVRvQ29vcnMoXG4gICAgICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEF0SW5kZXhHbG9iYWxDb29yZGluYXRlcyhcbiAgICAgICAgICAgIG11bHRpRWxlbWVudCxcbiAgICAgICAgICAgIC0xLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvckJ1dHRvbjoge1xuICAgICAgW2lkOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgfSA9IHt9O1xuICAgIGNvbnN0IHBvaW50ZXJWaWV3cG9ydENvb3JkczogU2NlbmVTdGF0ZVtcInJlbW90ZVBvaW50ZXJWaWV3cG9ydENvb3Jkc1wiXSA9IHt9O1xuICAgIGNvbnN0IHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczogU2NlbmVTdGF0ZVtcInJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1wiXSA9IHt9O1xuICAgIGNvbnN0IHBvaW50ZXJVc2VybmFtZXM6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgIGNvbnN0IHBvaW50ZXJVc2VyU3RhdGVzOiB7IFtpZDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICB0aGlzLnN0YXRlLmNvbGxhYm9yYXRvcnMuZm9yRWFjaCgodXNlciwgc29ja2V0SWQpID0+IHtcbiAgICAgIGlmICh1c2VyLnNlbGVjdGVkRWxlbWVudElkcykge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIE9iamVjdC5rZXlzKHVzZXIuc2VsZWN0ZWRFbGVtZW50SWRzKSkge1xuICAgICAgICAgIGlmICghKGlkIGluIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkcykpIHtcbiAgICAgICAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1tpZF0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2lkXS5wdXNoKHNvY2tldElkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF1c2VyLnBvaW50ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHVzZXIudXNlcm5hbWUpIHtcbiAgICAgICAgcG9pbnRlclVzZXJuYW1lc1tzb2NrZXRJZF0gPSB1c2VyLnVzZXJuYW1lO1xuICAgICAgfVxuICAgICAgaWYgKHVzZXIudXNlclN0YXRlKSB7XG4gICAgICAgIHBvaW50ZXJVc2VyU3RhdGVzW3NvY2tldElkXSA9IHVzZXIudXNlclN0YXRlO1xuICAgICAgfVxuICAgICAgcG9pbnRlclZpZXdwb3J0Q29vcmRzW3NvY2tldElkXSA9IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyhcbiAgICAgICAge1xuICAgICAgICAgIHNjZW5lWDogdXNlci5wb2ludGVyLngsXG4gICAgICAgICAgc2NlbmVZOiB1c2VyLnBvaW50ZXIueSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICk7XG4gICAgICBjdXJzb3JCdXR0b25bc29ja2V0SWRdID0gdXNlci5idXR0b247XG4gICAgfSk7XG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG4gICAgY29uc3QgeyBhdExlYXN0T25lVmlzaWJsZUVsZW1lbnQsIHNjcm9sbEJhcnMgfSA9IHJlbmRlclNjZW5lKFxuICAgICAgZWxlbWVudHMuZmlsdGVyKChlbGVtZW50KSA9PiB7XG4gICAgICAgIC8vIGRvbid0IHJlbmRlciB0ZXh0IGVsZW1lbnQgdGhhdCdzIGJlaW5nIGN1cnJlbnRseSBlZGl0ZWQgKGl0J3NcbiAgICAgICAgLy8gcmVuZGVyZWQgb24gcmVtb3RlIG9ubHkpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIXRoaXMuc3RhdGUuZWRpdGluZ0VsZW1lbnQgfHxcbiAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50LnR5cGUgIT09IFwidGV4dFwiIHx8XG4gICAgICAgICAgZWxlbWVudC5pZCAhPT0gdGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudC5pZFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICAgdGhpcy5zdGF0ZS5zZWxlY3Rpb25FbGVtZW50LFxuICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICB0aGlzLnJjISxcbiAgICAgIHRoaXMuY2FudmFzISxcbiAgICAgIHtcbiAgICAgICAgc2Nyb2xsWDogdGhpcy5zdGF0ZS5zY3JvbGxYLFxuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFksXG4gICAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUudmlld0JhY2tncm91bmRDb2xvcixcbiAgICAgICAgem9vbTogdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICByZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHM6IHBvaW50ZXJWaWV3cG9ydENvb3JkcyxcbiAgICAgICAgcmVtb3RlUG9pbnRlckJ1dHRvbjogY3Vyc29yQnV0dG9uLFxuICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIHJlbW90ZVBvaW50ZXJVc2VybmFtZXM6IHBvaW50ZXJVc2VybmFtZXMsXG4gICAgICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiBwb2ludGVyVXNlclN0YXRlcyxcbiAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0aGlzLnN0YXRlLnNob3VsZENhY2hlSWdub3JlWm9vbSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHJlbmRlck9wdGltaXphdGlvbnM6IHRydWUsXG4gICAgICAgIHJlbmRlclNjcm9sbGJhcnM6ICF0aGlzLmlzTW9iaWxlLFxuICAgICAgfSxcbiAgICApO1xuICAgIGlmIChzY3JvbGxCYXJzKSB7XG4gICAgICBjdXJyZW50U2Nyb2xsQmFycyA9IHNjcm9sbEJhcnM7XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbGVkT3V0c2lkZSA9XG4gICAgICAvLyBoaWRlIHdoZW4gZWRpdGluZyB0ZXh0XG4gICAgICB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50Py50eXBlID09PSBcInRleHRcIlxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogIWF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCAmJiBlbGVtZW50cy5sZW5ndGggPiAwO1xuICAgIGlmICh0aGlzLnN0YXRlLnNjcm9sbGVkT3V0c2lkZSAhPT0gc2Nyb2xsZWRPdXRzaWRlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2Nyb2xsZWRPdXRzaWRlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaGlzdG9yeS5yZWNvcmQodGhpcy5zdGF0ZSwgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSk7XG5cbiAgICAvLyBEbyBub3Qgbm90aWZ5IGNvbnN1bWVycyBpZiB3ZSdyZSBzdGlsbCBsb2FkaW5nIHRoZSBzY2VuZS4gQW1vbmcgb3RoZXJcbiAgICAvLyBwb3RlbnRpYWwgaXNzdWVzLCB0aGlzIGZpeGVzIGEgY2FzZSB3aGVyZSB0aGUgdGFiIGlzbid0IGZvY3VzZWQgZHVyaW5nXG4gICAgLy8gaW5pdCwgd2hpY2ggd291bGQgdHJpZ2dlciBvbkNoYW5nZSB3aXRoIGVtcHR5IGVsZW1lbnRzLCB3aGljaCB3b3VsZCB0aGVuXG4gICAgLy8gb3ZlcnJpZGUgd2hhdGV2ZXIgaXMgaW4gbG9jYWxTdG9yYWdlIGN1cnJlbnRseS5cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlPy4oXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25TY3JvbGwgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgY29uc3QgeyBvZmZzZXRUb3AsIG9mZnNldExlZnQgfSA9IHRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpO1xuICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlKSA9PiB7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0TGVmdCA9PT0gb2Zmc2V0TGVmdCAmJiBzdGF0ZS5vZmZzZXRUb3AgPT09IG9mZnNldFRvcCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG9mZnNldFRvcCwgb2Zmc2V0TGVmdCB9O1xuICAgIH0pO1xuICB9LCBTQ1JPTExfVElNRU9VVCk7XG5cbiAgLy8gQ29weS9wYXN0ZVxuXG4gIHByaXZhdGUgb25DdXQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoIWlzRXhjYWxpZHJhd0FjdGl2ZSB8fCBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3V0QWxsKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBvbkNvcHkgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsXG4gICAgKTtcbiAgICBpZiAoIWlzRXhjYWxpZHJhd0FjdGl2ZSB8fCBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29weUFsbCgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH0pO1xuXG4gIHByaXZhdGUgY3V0QWxsID0gKCkgPT4ge1xuICAgIHRoaXMuY29weUFsbCgpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkRlbGV0ZVNlbGVjdGVkKTtcbiAgfTtcblxuICBwcml2YXRlIGNvcHlBbGwgPSAoKSA9PiB7XG4gICAgY29weVRvQ2xpcGJvYXJkKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVzZXRUYXBUd2ljZSgpIHtcbiAgICBkaWRUYXBUd2ljZSA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBvblRhcFN0YXJ0ID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgaWYgKCFkaWRUYXBUd2ljZSkge1xuICAgICAgZGlkVGFwVHdpY2UgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRhcHBlZFR3aWNlVGltZXIpO1xuICAgICAgdGFwcGVkVHdpY2VUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICBBcHAucmVzZXRUYXBUd2ljZSxcbiAgICAgICAgVEFQX1RXSUNFX1RJTUVPVVQsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpbnNlcnQgdGV4dCBvbmx5IGlmIHdlIHRhcHBlZCB0d2ljZSB3aXRoIGEgc2luZ2xlIGZpbmdlclxuICAgIC8vIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAxIHdpbGwgYWxzbyBwcmV2ZW50IGluc2VydGluZyB0ZXh0IHdoZW4gdXNlcidzIHpvb21pbmdcbiAgICBpZiAoZGlkVGFwVHdpY2UgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IFt0b3VjaF0gPSBldmVudC50b3VjaGVzO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5oYW5kbGVDYW52YXNEb3VibGVDbGljayh7XG4gICAgICAgIGNsaWVudFg6IHRvdWNoLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFksXG4gICAgICB9KTtcbiAgICAgIGRpZFRhcFR3aWNlID0gZmFsc2U7XG4gICAgICBjbGVhclRpbWVvdXQodGFwcGVkVHdpY2VUaW1lcik7XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG9uVGFwRW5kID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB0aGlzLnN0YXRlLnByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgcGFzdGVGcm9tQ2xpcGJvYXJkID0gd2l0aEJhdGNoZWRVcGRhdGVzKFxuICAgIGFzeW5jIChldmVudDogQ2xpcGJvYXJkRXZlbnQgfCBudWxsKSA9PiB7XG4gICAgICAvLyAjNjg2XG4gICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKFxuICAgICAgICB0YXJnZXQsXG4gICAgICApO1xuICAgICAgaWYgKCFpc0V4Y2FsaWRyYXdBY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGVtZW50VW5kZXJDdXJzb3IgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGN1cnNvclgsIGN1cnNvclkpO1xuICAgICAgaWYgKFxuICAgICAgICAvLyBpZiBubyBDbGlwYm9hcmRFdmVudCBzdXBwbGllZCwgYXNzdW1lIHdlJ3JlIHBhc3RpbmcgdmlhIGNvbnRleHRNZW51XG4gICAgICAgIC8vIHRodXMgdGhlc2UgY2hlY2tzIGRvbid0IG1ha2Ugc2Vuc2VcbiAgICAgICAgZXZlbnQgJiZcbiAgICAgICAgKCEoZWxlbWVudFVuZGVyQ3Vyc29yIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHx8XG4gICAgICAgICAgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcGFyc2VDbGlwYm9hcmQoZXZlbnQpO1xuICAgICAgaWYgKHRoaXMucHJvcHMub25QYXN0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICgoYXdhaXQgdGhpcy5wcm9wcy5vblBhc3RlKGRhdGEsIGV2ZW50KSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRhdGEuZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvck1lc3NhZ2U6IGRhdGEuZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHBhc3RlRGlhbG9nOiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnNwcmVhZHNoZWV0LFxuICAgICAgICAgICAgc2hvd246IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEuZWxlbWVudHMpIHtcbiAgICAgICAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgICAgZWxlbWVudHM6IGRhdGEuZWxlbWVudHMsXG4gICAgICAgICAgcG9zaXRpb246IFwiY3Vyc29yXCIsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnRleHQpIHtcbiAgICAgICAgdGhpcy5hZGRUZXh0RnJvbVBhc3RlKGRhdGEudGV4dCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdFNoYXBlVG9vbChcInNlbGVjdGlvblwiKTtcbiAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG4gICk7XG5cbiAgcHJpdmF0ZSBhZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSA9IChvcHRzOiB7XG4gICAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W107XG4gICAgcG9zaXRpb246IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSB8IFwiY3Vyc29yXCIgfCBcImNlbnRlclwiO1xuICB9KSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSByZXN0b3JlRWxlbWVudHMob3B0cy5lbGVtZW50cywgbnVsbCk7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcblxuICAgIGNvbnN0IGVsZW1lbnRzQ2VudGVyWCA9IGRpc3RhbmNlKG1pblgsIG1heFgpIC8gMjtcbiAgICBjb25zdCBlbGVtZW50c0NlbnRlclkgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSAvIDI7XG5cbiAgICBjb25zdCBjbGllbnRYID1cbiAgICAgIHR5cGVvZiBvcHRzLnBvc2l0aW9uID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gb3B0cy5wb3NpdGlvbi5jbGllbnRYXG4gICAgICAgIDogb3B0cy5wb3NpdGlvbiA9PT0gXCJjdXJzb3JcIlxuICAgICAgICA/IGN1cnNvclhcbiAgICAgICAgOiB0aGlzLnN0YXRlLndpZHRoIC8gMiArIHRoaXMuc3RhdGUub2Zmc2V0TGVmdDtcbiAgICBjb25zdCBjbGllbnRZID1cbiAgICAgIHR5cGVvZiBvcHRzLnBvc2l0aW9uID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gb3B0cy5wb3NpdGlvbi5jbGllbnRZXG4gICAgICAgIDogb3B0cy5wb3NpdGlvbiA9PT0gXCJjdXJzb3JcIlxuICAgICAgICA/IGN1cnNvcllcbiAgICAgICAgOiB0aGlzLnN0YXRlLmhlaWdodCAvIDIgKyB0aGlzLnN0YXRlLm9mZnNldFRvcDtcblxuICAgIGNvbnN0IHsgeCwgeSB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgeyBjbGllbnRYLCBjbGllbnRZIH0sXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBjb25zdCBkeCA9IHggLSBlbGVtZW50c0NlbnRlclg7XG4gICAgY29uc3QgZHkgPSB5IC0gZWxlbWVudHNDZW50ZXJZO1xuICAgIGNvbnN0IGdyb3VwSWRNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChkeCwgZHksIHRoaXMuc3RhdGUuZ3JpZFNpemUpO1xuXG4gICAgY29uc3Qgb2xkSWRUb0R1cGxpY2F0ZWRJZCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBuZXdFbGVtZW50cyA9IGVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgbmV3RWxlbWVudCA9IGR1cGxpY2F0ZUVsZW1lbnQoXG4gICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0dyb3VwSWQsXG4gICAgICAgIGdyb3VwSWRNYXAsXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHtcbiAgICAgICAgICB4OiBlbGVtZW50LnggKyBncmlkWCAtIG1pblgsXG4gICAgICAgICAgeTogZWxlbWVudC55ICsgZ3JpZFkgLSBtaW5ZLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQuc2V0KGVsZW1lbnQuaWQsIG5ld0VsZW1lbnQuaWQpO1xuICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gICAgfSk7XG4gICAgY29uc3QgbmV4dEVsZW1lbnRzID0gW1xuICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIC4uLm5ld0VsZW1lbnRzLFxuICAgIF07XG4gICAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uKG5leHRFbGVtZW50cywgZWxlbWVudHMsIG9sZElkVG9EdXBsaWNhdGVkSWQpO1xuXG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMobmV4dEVsZW1lbnRzKTtcbiAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgIGlzTGlicmFyeU9wZW46IGZhbHNlLFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogbmV3RWxlbWVudHMucmVkdWNlKChtYXAsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIG1hcFtlbGVtZW50LmlkXSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICAgIH0sIHt9IGFzIGFueSksXG4gICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICksXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdFNoYXBlVG9vbChcInNlbGVjdGlvblwiKTtcbiAgfTtcblxuICBwcml2YXRlIGFkZFRleHRGcm9tUGFzdGUodGV4dDogYW55KSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICB7IGNsaWVudFg6IGN1cnNvclgsIGNsaWVudFk6IGN1cnNvclkgfSxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdUZXh0RWxlbWVudCh7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgdGV4dCxcbiAgICAgIHJhd1RleHQ6IHRleHQsXG4gICAgICBmb250U2l6ZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRTaXplLFxuICAgICAgZm9udEZhbWlseTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHksXG4gICAgICB0ZXh0QWxpZ246IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1UZXh0QWxpZ24sXG4gICAgICB2ZXJ0aWNhbEFsaWduOiBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIGVsZW1lbnQsXG4gICAgXSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkRWxlbWVudElkczogeyBbZWxlbWVudC5pZF06IHRydWUgfSB9KTtcbiAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gIH1cblxuICAvLyBDb2xsYWJvcmF0aW9uXG5cbiAgc2V0QXBwU3RhdGUgPSAob2JqOiBhbnkpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKG9iaik7XG4gIH07XG5cbiAgcmVtb3ZlUG9pbnRlciA9IChldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxFbGVtZW50PiB8IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgIC8vIHJlbW92ZSB0b3VjaCBoYW5kbGVyIGZvciBjb250ZXh0IG1lbnUgb24gdG91Y2ggZGV2aWNlc1xuICAgIGlmIChldmVudC5wb2ludGVyVHlwZSA9PT0gXCJ0b3VjaFwiICYmIHRvdWNoVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG4gICAgICB0b3VjaFRpbWVvdXQgPSAwO1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2VzdHVyZS5wb2ludGVycy5kZWxldGUoZXZlbnQucG9pbnRlcklkKTtcbiAgfTtcblxuICB0b2dnbGVMb2NrID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudExvY2tlZDogIXByZXZTdGF0ZS5lbGVtZW50TG9ja2VkLFxuICAgICAgICBlbGVtZW50VHlwZTogcHJldlN0YXRlLmVsZW1lbnRMb2NrZWRcbiAgICAgICAgICA/IFwic2VsZWN0aW9uXCJcbiAgICAgICAgICA6IHByZXZTdGF0ZS5lbGVtZW50VHlwZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgdG9nZ2xlWmVuTW9kZSA9ICgpID0+IHtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25Ub2dnbGVaZW5Nb2RlKTtcbiAgfTtcblxuICB0b2dnbGVTdGF0cyA9ICgpID0+IHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuc2hvd1N0YXRzKSB7XG4gICAgICB0cmFja0V2ZW50KFwiZGlhbG9nXCIsIFwic3RhdHNcIik7XG4gICAgfVxuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvblRvZ2dsZVN0YXRzKTtcbiAgfTtcblxuICBzY3JvbGxUb0NvbnRlbnQgPSAoXG4gICAgdGFyZ2V0OlxuICAgICAgfCBFeGNhbGlkcmF3RWxlbWVudFxuICAgICAgfCByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICApID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIC4uLmNhbGN1bGF0ZVNjcm9sbENlbnRlcihcbiAgICAgICAgQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0IDogW3RhcmdldF0sXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgKSxcbiAgICB9KTtcbiAgfTtcblxuICB6b29tVG9GaXQgPSAoXG4gICAgdGFyZ2V0OiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgIG1heFpvb206IG51bWJlciA9IDEsIC8vbnVsbCB3aWxsIHpvb20gdG8gbWF4IGJhc2VkIG9uIHZpZXdwb3J0XG4gICAgbWFyZ2luOiBudW1iZXIgPSAwLjAzLCAvL3BlcmNlbnRhZ2Ugb2Ygdmlld3BvcnQgd2lkdGgmaGVpZ2h0XG4gICkgPT4ge1xuICAgIGlmKCF0YXJnZXQpIHRhcmdldCA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICBpZih0YXJnZXQubGVuZ3RoPT09MCkgbWF4Wm9vbSA9IDE7XG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHpvb21Ub0ZpdEVsZW1lbnRzKHRhcmdldCwgdGhpcy5zdGF0ZSwgZmFsc2UsIG1heFpvb20sIG1hcmdpbikuYXBwU3RhdGUsXG4gICAgKTtcbiAgfTtcblxuICBjbGVhclRvYXN0ID0gKCkgPT4ge1xuICAgIHRoaXMuc2V0U3RhdGUoeyB0b2FzdE1lc3NhZ2U6IG51bGwgfSk7XG4gIH07XG5cbiAgc2V0VG9hc3RNZXNzYWdlID0gKHRvYXN0TWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHRvYXN0TWVzc2FnZSB9KTtcbiAgfTtcblxuICByZXN0b3JlRmlsZUZyb21TaGFyZSA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2ViU2hhcmVUYXJnZXRDYWNoZSA9IGF3YWl0IGNhY2hlcy5vcGVuKFwid2ViLXNoYXJlLXRhcmdldFwiKTtcblxuICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IHdlYlNoYXJlVGFyZ2V0Q2FjaGUubWF0Y2goXCJzaGFyZWQtZmlsZVwiKTtcbiAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBmaWxlLmJsb2IoKTtcbiAgICAgICAgdGhpcy5sb2FkRmlsZVRvQ2FudmFzKGJsb2IpO1xuICAgICAgICBhd2FpdCB3ZWJTaGFyZVRhcmdldENhY2hlLmRlbGV0ZShcInNoYXJlZC1maWxlXCIpO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgQVBQX05BTUUsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfVxuICB9O1xuXG4gIHB1YmxpYyB1cGRhdGVTY2VuZSA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICA8SyBleHRlbmRzIGtleW9mIEFwcFN0YXRlPihzY2VuZURhdGE6IHtcbiAgICAgIGVsZW1lbnRzPzogU2NlbmVEYXRhW1wiZWxlbWVudHNcIl07XG4gICAgICBhcHBTdGF0ZT86IFBpY2s8QXBwU3RhdGUsIEs+IHwgbnVsbDtcbiAgICAgIGNvbGxhYm9yYXRvcnM/OiBTY2VuZURhdGFbXCJjb2xsYWJvcmF0b3JzXCJdO1xuICAgICAgY29tbWl0VG9IaXN0b3J5PzogU2NlbmVEYXRhW1wiY29tbWl0VG9IaXN0b3J5XCJdO1xuICAgIH0pID0+IHtcbiAgICAgIGlmIChzY2VuZURhdGEuY29tbWl0VG9IaXN0b3J5KSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjZW5lRGF0YS5hcHBTdGF0ZSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHNjZW5lRGF0YS5hcHBTdGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2VuZURhdGEuZWxlbWVudHMpIHtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoc2NlbmVEYXRhLmVsZW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjZW5lRGF0YS5jb2xsYWJvcmF0b3JzKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBjb2xsYWJvcmF0b3JzOiBzY2VuZURhdGEuY29sbGFib3JhdG9ycyB9KTtcbiAgICAgIH1cbiAgICB9LFxuICApO1xuXG4gIHByaXZhdGUgb25TY2VuZVVwZGF0ZWQgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7fSk7XG4gIH07XG5cbiAgcHJpdmF0ZSB1cGRhdGVDdXJyZW50Q3Vyc29yUG9zaXRpb24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoXG4gICAgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjdXJzb3JYID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGN1cnNvclkgPSBldmVudC5jbGllbnRZO1xuICAgIH0sXG4gICk7XG5cbiAgLy8gSW5wdXQgaGFuZGxpbmdcblxuICBwcml2YXRlIG9uS2V5RG93biA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICAoZXZlbnQ6IFJlYWN0LktleWJvYXJkRXZlbnQgfCBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAvLyBub3JtYWxpemUgYGV2ZW50LmtleWAgd2hlbiBDYXBzTG9jayBpcyBwcmVzc2VkICMyMzcyXG4gICAgICBpZiAoXG4gICAgICAgIFwiUHJveHlcIiBpbiB3aW5kb3cgJiZcbiAgICAgICAgKCghZXZlbnQuc2hpZnRLZXkgJiYgL15bQS1aXSQvLnRlc3QoZXZlbnQua2V5KSkgfHxcbiAgICAgICAgICAoZXZlbnQuc2hpZnRLZXkgJiYgL15bYS16XSQvLnRlc3QoZXZlbnQua2V5KSkpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnQgPSBuZXcgUHJveHkoZXZlbnQsIHtcbiAgICAgICAgICBnZXQoZXY6IGFueSwgcHJvcCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBldltwcm9wXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAvLyBmaXggZm9yIFByb3hpZXMgaGlqYWNraW5nIGB0aGlzYFxuICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuYmluZChldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvcCA9PT0gXCJrZXlcIlxuICAgICAgICAgICAgICA/IC8vIENhcHNMb2NrIGludmVydHMgY2FwaXRhbGl6YXRpb24gYmFzZWQgb24gU2hpZnRLZXksIHNvIGludmVydFxuICAgICAgICAgICAgICAgIC8vIGl0IGJhY2tcbiAgICAgICAgICAgICAgICBldmVudC5zaGlmdEtleVxuICAgICAgICAgICAgICAgID8gZXYua2V5LnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICA6IGV2LmtleS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIDogdmFsdWU7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgKGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkgJiYgZXZlbnQua2V5ICE9PSBLRVlTLkVTQ0FQRSkgfHxcbiAgICAgICAgLy8gY2FzZTogdXNpbmcgYXJyb3dzIHRvIG1vdmUgYmV0d2VlbiBidXR0b25zXG4gICAgICAgIChpc0Fycm93S2V5KGV2ZW50LmtleSkgJiYgaXNJbnB1dExpa2UoZXZlbnQudGFyZ2V0KSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuUVVFU1RJT05fTUFSSykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzaG93SGVscERpYWxvZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmFjdGlvbk1hbmFnZXIuaGFuZGxlS2V5RG93bihldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgdGhpcy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0JpbmRpbmdFbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IENPREVTLk5JTkUpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTGlicmFyeU9wZW46ICF0aGlzLnN0YXRlLmlzTGlicmFyeU9wZW4gfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Fycm93S2V5KGV2ZW50LmtleSkpIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9XG4gICAgICAgICAgKHRoaXMuc3RhdGUuZ3JpZFNpemUgJiZcbiAgICAgICAgICAgIChldmVudC5zaGlmdEtleVxuICAgICAgICAgICAgICA/IEVMRU1FTlRfVFJBTlNMQVRFX0FNT1VOVFxuICAgICAgICAgICAgICA6IHRoaXMuc3RhdGUuZ3JpZFNpemUpKSB8fFxuICAgICAgICAgIChldmVudC5zaGlmdEtleVxuICAgICAgICAgICAgPyBFTEVNRU5UX1NISUZUX1RSQU5TTEFURV9BTU9VTlRcbiAgICAgICAgICAgIDogRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UKTtcblxuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5zY2VuZVxuICAgICAgICAgIC5nZXRFbGVtZW50cygpXG4gICAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbZWxlbWVudC5pZF0pO1xuXG4gICAgICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICAgICAgbGV0IG9mZnNldFkgPSAwO1xuXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfTEVGVCkge1xuICAgICAgICAgIG9mZnNldFggPSAtc3RlcDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfUklHSFQpIHtcbiAgICAgICAgICBvZmZzZXRYID0gc3RlcDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfVVApIHtcbiAgICAgICAgICBvZmZzZXRZID0gLXN0ZXA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX0RPV04pIHtcbiAgICAgICAgICBvZmZzZXRZID0gc3RlcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgICAgeDogZWxlbWVudC54ICsgb2Zmc2V0WCxcbiAgICAgICAgICAgIHk6IGVsZW1lbnQueSArIG9mZnNldFksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQsIHtcbiAgICAgICAgICAgIHNpbXVsdGFuZW91c2x5VXBkYXRlZDogc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FTlRFUikge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkICE9PSBzZWxlY3RlZEVsZW1lbnRzWzBdLmlkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IG5ldyBMaW5lYXJFbGVtZW50RWRpdG9yKFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHNbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICFpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgICAgICB0aGlzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgICAgICAgc2NlbmVYOiBzZWxlY3RlZEVsZW1lbnQueCArIHNlbGVjdGVkRWxlbWVudC53aWR0aCAvIDIsXG4gICAgICAgICAgICBzY2VuZVk6IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFldmVudC5jdHJsS2V5ICYmXG4gICAgICAgICFldmVudC5hbHRLZXkgJiZcbiAgICAgICAgIWV2ZW50Lm1ldGFLZXkgJiZcbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQgPT09IG51bGxcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzaGFwZSA9IGZpbmRTaGFwZUJ5S2V5KGV2ZW50LmtleSk7XG4gICAgICAgIGlmIChzaGFwZSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0U2hhcGVUb29sKHNoYXBlKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuUSkge1xuICAgICAgICAgIHRoaXMudG9nZ2xlTG9jaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlNQQUNFICYmIGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICBpc0hvbGRpbmdTcGFjZSA9IHRydWU7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQkJJTkcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkcgfHwgZXZlbnQua2V5ID09PSBLRVlTLlMpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiICYmXG4gICAgICAgICAgIXNlbGVjdGVkRWxlbWVudHMubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBldmVudC5rZXkgPT09IEtFWVMuRyAmJlxuICAgICAgICAgIChoYXNCYWNrZ3JvdW5kKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUpIHx8XG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGhhc0JhY2tncm91bmQoZWxlbWVudC50eXBlKSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuUG9wdXA6IFwiYmFja2dyb3VuZENvbG9yUGlja2VyXCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5Qb3B1cDogXCJzdHJva2VDb2xvclBpY2tlclwiIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgKTtcblxuICBwcml2YXRlIG9uS2V5VXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5TUEFDRSkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlzSG9sZGluZ1NwYWNlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgIXRoaXMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzQmluZGluZ0VuYWJsZWQ6IHRydWUgfSk7XG4gICAgfVxuICAgIGlmIChpc0Fycm93S2V5KGV2ZW50LmtleSkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICApO1xuICAgICAgaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKVxuICAgICAgICA/IGJpbmRPclVuYmluZFNlbGVjdGVkRWxlbWVudHMoc2VsZWN0ZWRFbGVtZW50cylcbiAgICAgICAgOiB1bmJpbmRMaW5lYXJFbGVtZW50cyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5nczogW10gfSk7XG4gICAgfVxuICB9KTtcblxuICBwcml2YXRlIHNlbGVjdFNoYXBlVG9vbChlbGVtZW50VHlwZTogQXBwU3RhdGVbXCJlbGVtZW50VHlwZVwiXSkge1xuICAgIGlmICghaXNIb2xkaW5nU3BhY2UpIHtcbiAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCBlbGVtZW50VHlwZSk7XG4gICAgfVxuICAgIGlmIChpc1Rvb2xJY29uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgfVxuICAgIGlmICghaXNMaW5lYXJFbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5nczogW10gfSk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGVsZW1lbnRUeXBlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25HZXN0dXJlU3RhcnQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBHZXN0dXJlRXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICB9KTtcbiAgICBnZXN0dXJlLmluaXRpYWxTY2FsZSA9IHRoaXMuc3RhdGUuem9vbS52YWx1ZTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBvbkdlc3R1cmVDaGFuZ2UgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBHZXN0dXJlRXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gb25HZXN0dXJlQ2hhbmdlIG9ubHkgaGFzIHpvb20gZmFjdG9yIGJ1dCBub3QgdGhlIGNlbnRlci5cbiAgICAvLyBJZiB3ZSdyZSBvbiBpUGFkIG9yIGlQaG9uZSwgdGhlbiB3ZSByZWNvZ25pemUgbXVsdGktdG91Y2ggYW5kIHdpbGxcbiAgICAvLyB6b29tIGluIGF0IHRoZSByaWdodCBsb2NhdGlvbiBvbiB0aGUgdG91Y2hNb3ZlIGhhbmRsZXIgYWxyZWFkeS5cbiAgICAvLyBPbiBNYWNib29rLCB3ZSBkb24ndCBoYXZlIHRob3NlIGV2ZW50cyBzbyB3aWxsIHpvb20gaW4gYXQgdGhlXG4gICAgLy8gY3VycmVudCBsb2NhdGlvbiBpbnN0ZWFkLlxuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPT09IDIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWFsU2NhbGUgPSBnZXN0dXJlLmluaXRpYWxTY2FsZTtcbiAgICBpZiAoaW5pdGlhbFNjYWxlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIG9mZnNldExlZnQsIG9mZnNldFRvcCB9KSA9PiAoe1xuICAgICAgICB6b29tOiBnZXROZXdab29tKFxuICAgICAgICAgIGdldE5vcm1hbGl6ZWRab29tKGluaXRpYWxTY2FsZSAqIGV2ZW50LnNjYWxlKSxcbiAgICAgICAgICB6b29tLFxuICAgICAgICAgIHsgbGVmdDogb2Zmc2V0TGVmdCwgdG9wOiBvZmZzZXRUb3AgfSxcbiAgICAgICAgICB7IHg6IGN1cnNvclgsIHk6IGN1cnNvclkgfSxcbiAgICAgICAgKSxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pO1xuXG4gIHByaXZhdGUgb25HZXN0dXJlRW5kID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogR2VzdHVyZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5wcmV2aW91c1NlbGVjdGVkRWxlbWVudElkcyxcbiAgICB9KTtcbiAgICBnZXN0dXJlLmluaXRpYWxTY2FsZSA9IG51bGw7XG4gIH0pO1xuXG4gIHByaXZhdGUgaGFuZGxlVGV4dFd5c2l3eWcoXG4gICAgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICAgIHtcbiAgICAgIGlzRXhpc3RpbmdFbGVtZW50ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgaXNFeGlzdGluZ0VsZW1lbnQ/OiBib29sZWFuO1xuICAgIH0sXG4gICkge1xuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnQgPSAodGV4dDogc3RyaW5nLCBpc0RlbGV0ZWQgPSBmYWxzZSkgPT4ge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcCgoX2VsZW1lbnQpID0+IHtcbiAgICAgICAgICBpZiAoX2VsZW1lbnQuaWQgPT09IGVsZW1lbnQuaWQgJiYgaXNUZXh0RWxlbWVudChfZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVUZXh0RWxlbWVudChfZWxlbWVudCwge1xuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICBpc0RlbGV0ZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIF9lbGVtZW50O1xuICAgICAgICB9KSxcbiAgICAgIF0pO1xuICAgIH07XG5cbiAgICBpZiAoaXNFeGlzdGluZ0VsZW1lbnQgJiYgdGhpcy5wcm9wcy5vbkJlZm9yZVRleHRFZGl0KSB7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5wcm9wcy5vbkJlZm9yZVRleHRFZGl0KGVsZW1lbnQpO1xuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKChfZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKF9lbGVtZW50LmlkID09PSBlbGVtZW50LmlkICYmIGlzVGV4dEVsZW1lbnQoX2VsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQgPSB1cGRhdGVUZXh0RWxlbWVudChfZWxlbWVudCwge1xuICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgaXNEZWxldGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9lbGVtZW50O1xuICAgICAgICAgIH0pLFxuICAgICAgICBdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0ZXh0V3lzaXd5Zyh7XG4gICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgIGFwcFN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgY2FudmFzOiB0aGlzLmNhbnZhcyxcbiAgICAgIGdldFZpZXdwb3J0Q29vcmRzOiAoeCwgeSkgPT4ge1xuICAgICAgICBjb25zdCB7IHg6IHZpZXdwb3J0WCwgeTogdmlld3BvcnRZIH0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NlbmVYOiB4LFxuICAgICAgICAgICAgc2NlbmVZOiB5LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB2aWV3cG9ydFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICAgICAgdmlld3BvcnRZIC0gdGhpcy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgICAgIF07XG4gICAgICB9LFxuICAgICAgb25DaGFuZ2U6IHdpdGhCYXRjaGVkVXBkYXRlcygodGV4dCkgPT4ge1xuICAgICAgICB1cGRhdGVFbGVtZW50KHRleHQpO1xuICAgICAgICBpZiAoaXNOb25EZWxldGVkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgb25TdWJtaXQ6IHdpdGhCYXRjaGVkVXBkYXRlcygoeyB0ZXh0LCB2aWFLZXlib2FyZCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzRGVsZXRlZCA9ICF0ZXh0LnRyaW0oKTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25CZWZvcmVUZXh0U3VibWl0KSB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZFRleHQgPSB0aGlzLnByb3BzLm9uQmVmb3JlVGV4dFN1Ym1pdChcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgaXNEZWxldGVkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGV4dCA9IHVwZGF0ZWRUZXh0ID8/IHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlRWxlbWVudCh0ZXh0LCBpc0RlbGV0ZWQpO1xuICAgICAgICAvLyBzZWxlY3QgdGhlIGNyZWF0ZWQgdGV4dCBlbGVtZW50IG9ubHkgaWYgc3VibWl0dGluZyB2aWEga2V5Ym9hcmRcbiAgICAgICAgLy8gKHdoZW4gc3VibWl0dGluZyB2aWEgY2xpY2sgaXQgc2hvdWxkIGFjdCBhcyBzaWduYWwgdG8gZGVzZWxlY3QpXG4gICAgICAgIGlmICghaXNEZWxldGVkICYmIHZpYUtleWJvYXJkKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgIFtlbGVtZW50LmlkXTogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlbGV0ZWQpIHtcbiAgICAgICAgICBmaXhCaW5kaW5nc0FmdGVyRGVsZXRpb24odGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCBbZWxlbWVudF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNEZWxldGVkIHx8IGlzRXhpc3RpbmdFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIGVkaXRpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZWxlbWVudExvY2tlZCkge1xuICAgICAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNDb250YWluZXIoKTtcbiAgICAgIH0pLFxuICAgICAgZWxlbWVudCxcbiAgICAgIGV4Y2FsaWRyYXdDb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgIH0pO1xuICAgIC8vIGRlc2VsZWN0IGFsbCBvdGhlciBlbGVtZW50cyB3aGVuIGluc2VydGluZyB0ZXh0XG4gICAgdGhpcy5kZXNlbGVjdEVsZW1lbnRzKCk7XG5cbiAgICAvLyBkbyBhbiBpbml0aWFsIHVwZGF0ZSB0byByZS1pbml0aWFsaXplIGVsZW1lbnQgcG9zaXRpb24gc2luY2Ugd2Ugd2VyZVxuICAgIC8vIG1vZGlmeWluZyBlbGVtZW50J3MgeC95IGZvciBzYWtlIG9mIGVkaXRvciAoY2FzZTogc3luY2luZyB0byByZW1vdGUpXG4gICAgdXBkYXRlRWxlbWVudChlbGVtZW50LnRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXNlbGVjdEVsZW1lbnRzKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGwsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRleHRFbGVtZW50QXRQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4gfCBudWxsIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5KTtcblxuICAgIGlmIChlbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgIWVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgb3B0cz86IHtcbiAgICAgIC8qKiBpZiB0cnVlLCByZXR1cm5zIHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50ICh3aXRoIGhpZ2hlc3Qgei1pbmRleClcbiAgICAgICAgb2YgYWxsIGhpdCBlbGVtZW50cyAqL1xuICAgICAgcHJlZmVyU2VsZWN0ZWQ/OiBib29sZWFuO1xuICAgIH0sXG4gICk6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+IHwgbnVsbCB7XG4gICAgY29uc3QgYWxsSGl0RWxlbWVudHMgPSB0aGlzLmdldEVsZW1lbnRzQXRQb3NpdGlvbih4LCB5KTtcbiAgICBpZiAoYWxsSGl0RWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgaWYgKG9wdHM/LnByZWZlclNlbGVjdGVkKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMTsgaW5kZXggPiAtMTsgaW5kZXgtLSkge1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1thbGxIaXRFbGVtZW50c1tpbmRleF0uaWRdKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsSGl0RWxlbWVudHNbaW5kZXhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4ID1cbiAgICAgICAgYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICAvLyBJZiB3ZSdyZSBoaXR0aW5nIGVsZW1lbnQgd2l0aCBoaWdoZXN0IHotaW5kZXggb25seSBvbiBpdHMgYm91bmRpbmcgYm94XG4gICAgICAvLyB3aGlsZSBhbHNvIGhpdHRpbmcgb3RoZXIgZWxlbWVudCBmaWd1cmUsIHRoZSBsYXR0ZXIgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICByZXR1cm4gaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50KFxuICAgICAgICBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXgsXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICApXG4gICAgICAgID8gYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMl1cbiAgICAgICAgOiBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXg7XG4gICAgfVxuICAgIGlmIChhbGxIaXRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBhbGxIaXRFbGVtZW50c1swXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRzQXRQb3NpdGlvbihcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICApOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdIHtcbiAgICByZXR1cm4gZ2V0RWxlbWVudHNBdFBvc2l0aW9uKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgKGVsZW1lbnQpID0+XG4gICAgICBoaXRUZXN0KGVsZW1lbnQsIHRoaXMuc3RhdGUsIHgsIHkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0VGV4dEVkaXRpbmcgPSAoe1xuICAgIHNjZW5lWCxcbiAgICBzY2VuZVksXG4gICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXIgPSB0cnVlLFxuICB9OiB7XG4gICAgLyoqIFggcG9zaXRpb24gdG8gaW5zZXJ0IHRleHQgYXQgKi9cbiAgICBzY2VuZVg6IG51bWJlcjtcbiAgICAvKiogWSBwb3NpdGlvbiB0byBpbnNlcnQgdGV4dCBhdCAqL1xuICAgIHNjZW5lWTogbnVtYmVyO1xuICAgIC8qKiB3aGV0aGVyIHRvIGF0dGVtcHQgdG8gaW5zZXJ0IGF0IGVsZW1lbnQgY2VudGVyIGlmIGFwcGxpY2FibGUgKi9cbiAgICBpbnNlcnRBdFBhcmVudENlbnRlcj86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICBjb25zdCBleGlzdGluZ1RleHRFbGVtZW50ID0gdGhpcy5nZXRUZXh0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuXG4gICAgY29uc3QgcGFyZW50Q2VudGVyUG9zaXRpb24gPVxuICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXIgJiZcbiAgICAgIHRoaXMuZ2V0VGV4dFd5c2l3eWdTbmFwcGVkVG9DZW50ZXJQb3NpdGlvbihcbiAgICAgICAgc2NlbmVYLFxuICAgICAgICBzY2VuZVksXG4gICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gZXhpc3RpbmdUZXh0RWxlbWVudFxuICAgICAgPyBleGlzdGluZ1RleHRFbGVtZW50XG4gICAgICA6IG5ld1RleHRFbGVtZW50KHtcbiAgICAgICAgICB4OiBwYXJlbnRDZW50ZXJQb3NpdGlvblxuICAgICAgICAgICAgPyBwYXJlbnRDZW50ZXJQb3NpdGlvbi5lbGVtZW50Q2VudGVyWFxuICAgICAgICAgICAgOiBzY2VuZVgsXG4gICAgICAgICAgeTogcGFyZW50Q2VudGVyUG9zaXRpb25cbiAgICAgICAgICAgID8gcGFyZW50Q2VudGVyUG9zaXRpb24uZWxlbWVudENlbnRlcllcbiAgICAgICAgICAgIDogc2NlbmVZLFxuICAgICAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICAgICAgICB0ZXh0OiBcIlwiLFxuICAgICAgICAgIHJhd1RleHQ6IFwiXCIsXG4gICAgICAgICAgZm9udFNpemU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgICAgICB0ZXh0QWxpZ246IHBhcmVudENlbnRlclBvc2l0aW9uXG4gICAgICAgICAgICA/IFwiY2VudGVyXCJcbiAgICAgICAgICAgIDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBwYXJlbnRDZW50ZXJQb3NpdGlvblxuICAgICAgICAgICAgPyBcIm1pZGRsZVwiXG4gICAgICAgICAgICA6IERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gICAgICAgIH0pO1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IGVkaXRpbmdFbGVtZW50OiBlbGVtZW50IH0pO1xuXG4gICAgaWYgKGV4aXN0aW5nVGV4dEVsZW1lbnQpIHtcbiAgICAgIC8vIGlmIHRleHQgZWxlbWVudCBpcyBubyBsb25nZXIgY2VudGVyZWQgdG8gYSBjb250YWluZXIsIHJlc2V0XG4gICAgICAvLyB2ZXJ0aWNhbEFsaWduIHRvIGRlZmF1bHQgYmVjYXVzZSBpdCdzIGN1cnJlbnRseSBpbnRlcm5hbC1vbmx5XG4gICAgICBpZiAoIXBhcmVudENlbnRlclBvc2l0aW9uIHx8IGVsZW1lbnQudGV4dEFsaWduICE9PSBcImNlbnRlclwiKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwgeyB2ZXJ0aWNhbEFsaWduOiBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICBdKTtcblxuICAgICAgLy8gY2FzZTogY3JlYXRpbmcgbmV3IHRleHQgbm90IGNlbnRlcmVkIHRvIHBhcmVudCBlbGVtZW5lbnQg4oaSIG9mZnNldCBZXG4gICAgICAvLyBzbyB0aGF0IHRoZSB0ZXh0IGlzIGNlbnRlcmVkIHRvIGN1cnNvciBwb3NpdGlvblxuICAgICAgaWYgKCFwYXJlbnRDZW50ZXJQb3NpdGlvbikge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICB5OiBlbGVtZW50LnkgLSBlbGVtZW50LmJhc2VsaW5lIC8gMixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICB9KTtcblxuICAgIHRoaXMuaGFuZGxlVGV4dFd5c2l3eWcoZWxlbWVudCwge1xuICAgICAgaXNFeGlzdGluZ0VsZW1lbnQ6ICEhZXhpc3RpbmdUZXh0RWxlbWVudCxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc0RvdWJsZUNsaWNrID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKSA9PiB7XG4gICAgLy8gY2FzZTogZG91YmxlLWNsaWNraW5nIHdpdGggYXJyb3cvbGluZSB0b29sIHNlbGVjdGVkIHdvdWxkIGJvdGggY3JlYXRlXG4gICAgLy8gdGV4dCBhbmQgZW50ZXIgbXVsdGlFbGVtZW50IG1vZGVcbiAgICBpZiAodGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gd2Ugc2hvdWxkIG9ubHkgYmUgYWJsZSB0byBkb3VibGUgY2xpY2sgd2hlbiBtb2RlIGlzIHNlbGVjdGlvblxuICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8XG4gICAgICAgIHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkICE9PSBzZWxlY3RlZEVsZW1lbnRzWzBdLmlkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDogbmV3IExpbmVhckVsZW1lbnRFZGl0b3IoXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXNldEN1cnNvcih0aGlzLmNhbnZhcyk7XG5cbiAgICBjb25zdCB7IHg6IHNjZW5lWCwgeTogc2NlbmVZIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoXG4gICAgICBldmVudCxcbiAgICAgIHRoaXMuc3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBJZHMgPSBnZXRTZWxlY3RlZEdyb3VwSWRzKHRoaXMuc3RhdGUpO1xuXG4gICAgaWYgKHNlbGVjdGVkR3JvdXBJZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaGl0RWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudEF0UG9zaXRpb24oc2NlbmVYLCBzY2VuZVkpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEdyb3VwSWQgPVxuICAgICAgICBoaXRFbGVtZW50ICYmXG4gICAgICAgIGdldFNlbGVjdGVkR3JvdXBJZEZvckVsZW1lbnQoaGl0RWxlbWVudCwgdGhpcy5zdGF0ZS5zZWxlY3RlZEdyb3VwSWRzKTtcblxuICAgICAgaWYgKHNlbGVjdGVkR3JvdXBJZCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+XG4gICAgICAgICAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogc2VsZWN0ZWRHcm91cElkLFxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2hpdEVsZW1lbnQhLmlkXTogdHJ1ZSB9LFxuICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICBpZiAoIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmICF0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgc2NlbmVYLFxuICAgICAgICBzY2VuZVksXG4gICAgICAgIGluc2VydEF0UGFyZW50Q2VudGVyOiAhZXZlbnQuYWx0S2V5LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FudmFzUG9pbnRlck1vdmUgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgdGhpcy5zdGF0ZS5jdXJzb3JCdXR0b24pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcbiAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2V0KGV2ZW50LnBvaW50ZXJJZCwge1xuICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFNjYWxlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGU7XG4gICAgaWYgKFxuICAgICAgZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyICYmXG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgJiZcbiAgICAgIGluaXRpYWxTY2FsZSAmJlxuICAgICAgZ2VzdHVyZS5pbml0aWFsRGlzdGFuY2VcbiAgICApIHtcbiAgICAgIGNvbnN0IGNlbnRlciA9IGdldENlbnRlcihnZXN0dXJlLnBvaW50ZXJzKTtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGNlbnRlci54IC0gZ2VzdHVyZS5sYXN0Q2VudGVyLng7XG4gICAgICBjb25zdCBkZWx0YVkgPSBjZW50ZXIueSAtIGdlc3R1cmUubGFzdENlbnRlci55O1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gY2VudGVyO1xuXG4gICAgICBjb25zdCBkaXN0YW5jZSA9IGdldERpc3RhbmNlKEFycmF5LmZyb20oZ2VzdHVyZS5wb2ludGVycy52YWx1ZXMoKSkpO1xuICAgICAgY29uc3Qgc2NhbGVGYWN0b3IgPSBkaXN0YW5jZSAvIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIHNjcm9sbFgsIHNjcm9sbFksIG9mZnNldExlZnQsIG9mZnNldFRvcCB9KSA9PiAoe1xuICAgICAgICBzY3JvbGxYOiBzY3JvbGxYICsgZGVsdGFYIC8gem9vbS52YWx1ZSxcbiAgICAgICAgc2Nyb2xsWTogc2Nyb2xsWSArIGRlbHRhWSAvIHpvb20udmFsdWUsXG4gICAgICAgIHpvb206IGdldE5ld1pvb20oXG4gICAgICAgICAgZ2V0Tm9ybWFsaXplZFpvb20oaW5pdGlhbFNjYWxlICogc2NhbGVGYWN0b3IpLFxuICAgICAgICAgIHpvb20sXG4gICAgICAgICAgeyBsZWZ0OiBvZmZzZXRMZWZ0LCB0b3A6IG9mZnNldFRvcCB9LFxuICAgICAgICAgIGNlbnRlcixcbiAgICAgICAgKSxcbiAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0cnVlLFxuICAgICAgfSkpO1xuICAgICAgdGhpcy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoaXNIb2xkaW5nU3BhY2UgfHwgaXNQYW5uaW5nIHx8IGlzRHJhZ2dpbmdTY3JvbGxCYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycyA9IGlzT3ZlclNjcm9sbEJhcnMoXG4gICAgICBjdXJyZW50U2Nyb2xsQmFycyxcbiAgICAgIGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsXG4gICAgICBldmVudC5jbGllbnRZIC0gdGhpcy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgKTtcbiAgICBjb25zdCBpc092ZXJTY3JvbGxCYXIgPSBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycy5pc092ZXJFaXRoZXI7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudCAmJiAhdGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNjZW5lUG9pbnRlciA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgdGhpcy5zdGF0ZSk7XG4gICAgY29uc3QgeyB4OiBzY2VuZVBvaW50ZXJYLCB5OiBzY2VuZVBvaW50ZXJZIH0gPSBzY2VuZVBvaW50ZXI7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmXG4gICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5pc0RyYWdnaW5nXG4gICAgKSB7XG4gICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlck1vdmUoXG4gICAgICAgIGV2ZW50LFxuICAgICAgICBzY2VuZVBvaW50ZXJYLFxuICAgICAgICBzY2VuZVBvaW50ZXJZLFxuICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmdyaWRTaXplLFxuICAgICAgKTtcbiAgICAgIGlmIChlZGl0aW5nTGluZWFyRWxlbWVudCAhPT0gdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZWRpdGluZ0xpbmVhckVsZW1lbnQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQubGFzdFVuY29tbWl0dGVkUG9pbnQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdBdEN1cnNvcihzY2VuZVBvaW50ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNCaW5kaW5nRWxlbWVudFR5cGUodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSkpIHtcbiAgICAgIC8vIEhvdmVyaW5nIHdpdGggYSBzZWxlY3RlZCB0b29sIG9yIGNyZWF0aW5nIG5ldyBsaW5lYXIgZWxlbWVudCB2aWEgY2xpY2tcbiAgICAgIC8vIGFuZCBwb2ludFxuICAgICAgY29uc3QgeyBkcmFnZ2luZ0VsZW1lbnQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICBpZiAoaXNCaW5kaW5nRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckxpbmVhckVsZW1lbnRBdEN1cnNvcihcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgXCJlbmRcIixcbiAgICAgICAgICBzY2VuZVBvaW50ZXIsXG4gICAgICAgICAgdGhpcy5zdGF0ZS5zdGFydEJvdW5kRWxlbWVudCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yKHNjZW5lUG9pbnRlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IHsgeDogcngsIHk6IHJ5IH0gPSBtdWx0aUVsZW1lbnQ7XG5cbiAgICAgIGNvbnN0IHsgcG9pbnRzLCBsYXN0Q29tbWl0dGVkUG9pbnQgfSA9IG11bHRpRWxlbWVudDtcbiAgICAgIGNvbnN0IGxhc3RQb2ludCA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG5cbiAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKTtcblxuICAgICAgaWYgKGxhc3RQb2ludCA9PT0gbGFzdENvbW1pdHRlZFBvaW50KSB7XG4gICAgICAgIC8vIGlmIHdlIGhhdmVuJ3QgeWV0IGNyZWF0ZWQgYSB0ZW1wIHBvaW50IGFuZCB3ZSdyZSBiZXlvbmQgY29tbWl0LXpvbmVcbiAgICAgICAgLy8gdGhyZXNob2xkLCBhZGQgYSBwb2ludFxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGlzdGFuY2UyZChcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlclggLSByeCxcbiAgICAgICAgICAgIHNjZW5lUG9pbnRlclkgLSByeSxcbiAgICAgICAgICAgIGxhc3RQb2ludFswXSxcbiAgICAgICAgICAgIGxhc3RQb2ludFsxXSxcbiAgICAgICAgICApID49IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICAgKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW3NjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5XV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICAgICAgICAvLyBpbiB0aGlzIGJyYW5jaCwgd2UncmUgaW5zaWRlIHRoZSBjb21taXQgem9uZSwgYW5kIG5vIHVuY29tbWl0dGVkXG4gICAgICAgICAgLy8gcG9pbnQgZXhpc3RzLiBUaHVzIGRvIG5vdGhpbmcgKGRvbid0IGFkZC9yZW1vdmUgcG9pbnRzKS5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcG9pbnRzLmxlbmd0aCA+IDIgJiZcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50ICYmXG4gICAgICAgIGRpc3RhbmNlMmQoXG4gICAgICAgICAgc2NlbmVQb2ludGVyWCAtIHJ4LFxuICAgICAgICAgIHNjZW5lUG9pbnRlclkgLSByeSxcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnRbMF0sXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzFdLFxuICAgICAgICApIDwgTElORV9DT05GSVJNX1RIUkVTSE9MRFxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBwb2ludHMuc2xpY2UoMCwgLTEpLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1BhdGhBTG9vcChwb2ludHMsIHRoaXMuc3RhdGUuem9vbS52YWx1ZSkpIHtcbiAgICAgICAgICBzZXRDdXJzb3IodGhpcy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVwZGF0ZSBsYXN0IHVuY29tbWl0dGVkIHBvaW50XG4gICAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBbXG4gICAgICAgICAgICAuLi5wb2ludHMuc2xpY2UoMCwgLTEpLFxuICAgICAgICAgICAgW3NjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5XSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0Rlc2VsZWN0ZWRCdXR0b24gPSBCb29sZWFuKGV2ZW50LmJ1dHRvbnMpO1xuICAgIGlmIChcbiAgICAgIGhhc0Rlc2VsZWN0ZWRCdXR0b24gfHxcbiAgICAgICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiICYmXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwidGV4dFwiKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIHRoaXMuc3RhdGUpO1xuICAgIGlmIChcbiAgICAgIHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxICYmXG4gICAgICAhaXNPdmVyU2Nyb2xsQmFyICYmXG4gICAgICAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudFxuICAgICkge1xuICAgICAgY29uc3QgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgc2NlbmVQb2ludGVyWCxcbiAgICAgICAgc2NlbmVQb2ludGVyWSxcbiAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAmJlxuICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZVxuICAgICAgKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxICYmICFpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhcbiAgICAgICAgZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpLFxuICAgICAgICBzY2VuZVBvaW50ZXJYLFxuICAgICAgICBzY2VuZVBvaW50ZXJZLFxuICAgICAgICB0aGlzLnN0YXRlLnpvb20sXG4gICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlKSB7XG4gICAgICAgIHNldEN1cnNvcihcbiAgICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgICBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpdEVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKFxuICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICApO1xuICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInRleHRcIikge1xuICAgICAgc2V0Q3Vyc29yKFxuICAgICAgICB0aGlzLmNhbnZhcyxcbiAgICAgICAgaXNUZXh0RWxlbWVudChoaXRFbGVtZW50KSA/IENVUlNPUl9UWVBFLlRFWFQgOiBDVVJTT1JfVFlQRS5DUk9TU0hBSVIsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgfSBlbHNlIGlmIChpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIGlmIHVzaW5nIGNtZC9jdHJsLCB3ZSdyZSBub3QgZHJhZ2dpbmdcbiAgICAgICFldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJlxuICAgICAgKGhpdEVsZW1lbnQgfHxcbiAgICAgICAgdGhpcy5pc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICBzY2VuZVBvaW50ZXIsXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgKSlcbiAgICApIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIHNldCB0b3VjaCBtb3ZpbmcgZm9yIG1vYmlsZSBjb250ZXh0IG1lbnVcbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaE1vdmUgPSAoZXZlbnQ6IFJlYWN0LlRvdWNoRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+KSA9PiB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc1BvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICAvLyByZW1vdmUgYW55IGFjdGl2ZSBzZWxlY3Rpb24gd2hlbiB3ZSBzdGFydCB0byBpbnRlcmFjdCB3aXRoIGNhbnZhc1xuICAgIC8vIChtYWlubHksIHdlIGNhcmUgYWJvdXQgcmVtb3Zpbmcgc2VsZWN0aW9uIG91dHNpZGUgdGhlIGNvbXBvbmVudCB3aGljaFxuICAgIC8vICB3b3VsZCBwcmV2ZW50IG91ciBjb3B5IGhhbmRsaW5nIG90aGVyd2lzZSlcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoc2VsZWN0aW9uPy5hbmNob3JOb2RlKSB7XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5tYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyhldmVudCk7XG4gICAgdGhpcy5tYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoZXZlbnQpO1xuXG4gICAgaWYgKGlzUGFubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbGFzdFBvaW50ZXJEb3duV2l0aDogZXZlbnQucG9pbnRlclR5cGUsXG4gICAgICBjdXJzb3JCdXR0b246IFwiZG93blwiLFxuICAgIH0pO1xuICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJkb3duXCIpO1xuXG4gICAgaWYgKHRoaXMuaGFuZGxlQ2FudmFzUGFuVXNpbmdXaGVlbE9yU3BhY2VEcmFnKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG9ubHkgaGFuZGxlIGxlZnQgbW91c2UgYnV0dG9uIG9yIHRvdWNoXG4gICAgaWYgKFxuICAgICAgZXZlbnQuYnV0dG9uICE9PSBQT0lOVEVSX0JVVFRPTi5NQUlOICYmXG4gICAgICBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLlRPVUNIXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVHZXN0dXJlT25Qb2ludGVyRG93bihldmVudCk7XG5cbiAgICAvLyBkb24ndCBzZWxlY3Qgd2hpbGUgcGFubmluZ1xuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPiAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhdGUgZm9yIHRoZSBkdXJhdGlvbiBvZiBhIHBvaW50ZXIgaW50ZXJhY3Rpb24sIHdoaWNoIHN0YXJ0cyB3aXRoIGFcbiAgICAvLyBwb2ludGVyRG93biBldmVudCwgZW5kcyB3aXRoIGEgcG9pbnRlclVwIGV2ZW50IChvciBhbm90aGVyIHBvaW50ZXJEb3duKVxuICAgIGNvbnN0IHBvaW50ZXJEb3duU3RhdGUgPSB0aGlzLmluaXRpYWxQb2ludGVyRG93blN0YXRlKGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmhhbmRsZURyYWdnaW5nU2Nyb2xsQmFyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUoZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuaGFuZGxlU2VsZWN0aW9uT25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlVGV4dE9uUG9pbnRlckRvd24oZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImFycm93XCIgfHxcbiAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwibGluZVwiXG4gICAgKSB7XG4gICAgICB0aGlzLmhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duKFxuICAgICAgICBldmVudCxcbiAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlRnJlZURyYXdFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZUdlbmVyaWNFbGVtZW50T25Qb2ludGVyRG93bihcbiAgICAgICAgdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IHRoaXMub25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgICBwb2ludGVyRG93blN0YXRlLFxuICAgICk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9IHRoaXMub25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICApO1xuXG4gICAgY29uc3Qgb25LZXlEb3duID0gdGhpcy5vbktleURvd25Gcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIGNvbnN0IG9uS2V5VXAgPSB0aGlzLm9uS2V5VXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgbGFzdFBvaW50ZXJVcCA9IG9uUG9pbnRlclVwO1xuXG4gICAgaWYgKCF0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIG9uS2V5RG93bik7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgb25LZXlVcCk7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSA9IG9uUG9pbnRlck1vdmU7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uVXAgPSBvblBvaW50ZXJVcDtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlVcCA9IG9uS2V5VXA7XG4gICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5RG93biA9IG9uS2V5RG93bjtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgKTogdm9pZCA9PiB7XG4gICAgLy8gZGVhbCB3aXRoIG9wZW5pbmcgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIikge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG5cbiAgICAgIGlmICh0b3VjaFRpbWVvdXQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbHJlYWR5IGEgdG91Y2hUaW1lb3V0LCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUncyBhbm90aGVyXG4gICAgICAgIC8vIHRvdWNoIGRvd24gYW5kIHdlIGFyZSBkb2luZyBhbm90aGVyIHRvdWNoLCBzbyB3ZSBzaG91bGRuJ3Qgb3BlbiB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51LlxuICAgICAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3BlbiB0aGUgY29udGV4dCBtZW51IHdpdGggdGhlIGZpcnN0IHRvdWNoJ3MgY2xpZW50WCBhbmQgY2xpZW50WVxuICAgICAgICAvLyBpZiB0aGUgdG91Y2ggaXMgbm90IG1vdmluZ1xuICAgICAgICB0b3VjaFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICAgICAgICBpZiAoIWludmFsaWRhdGVDb250ZXh0TWVudSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBUT1VDSF9DVFhfTUVOVV9USU1FT1VUKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IHZvaWQge1xuICAgIGlmIChsYXN0UG9pbnRlclVwICE9PSBudWxsKSB7XG4gICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBzb21ldGltZXMgd2UgZG9uJ3QgZ2V0IGEgcG9pbnRlcnVwIGFmdGVyIGEgcG9pbnRlcmRvd24sXG4gICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbnRleHR1YWwgbWVudSBvciBhbGVydCBpcyB0cmlnZ2VyZWQuIEluIG9yZGVyIHRvIGF2b2lkXG4gICAgICAvLyBiZWluZyBpbiBhIHdlaXJkIHN0YXRlLCB3ZSBjbGVhbiB1cCBvbiB0aGUgbmV4dCBwb2ludGVyZG93blxuICAgICAgbGFzdFBvaW50ZXJVcChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIHBhbm5pbmdcbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNQYW5Vc2luZ1doZWVsT3JTcGFjZURyYWcgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMCAmJlxuICAgICAgICAoZXZlbnQuYnV0dG9uID09PSBQT0lOVEVSX0JVVFRPTi5XSEVFTCB8fFxuICAgICAgICAgIChldmVudC5idXR0b24gPT09IFBPSU5URVJfQlVUVE9OLk1BSU4gJiYgaXNIb2xkaW5nU3BhY2UpIHx8XG4gICAgICAgICAgdGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlzUGFubmluZyA9IHRydWU7XG5cbiAgICBsZXQgbmV4dFBhc3RlUHJldmVudGVkID0gZmFsc2U7XG4gICAgY29uc3QgaXNMaW51eCA9IC9MaW51eC8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtKTtcblxuICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQkJJTkcpO1xuICAgIGxldCB7IGNsaWVudFg6IGxhc3RYLCBjbGllbnRZOiBsYXN0WSB9ID0gZXZlbnQ7XG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZGVsdGFYID0gbGFzdFggLSBldmVudC5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gbGFzdFkgLSBldmVudC5jbGllbnRZO1xuICAgICAgbGFzdFggPSBldmVudC5jbGllbnRYO1xuICAgICAgbGFzdFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvKlxuICAgICAgICogUHJldmVudCBwYXN0ZSBldmVudCBpZiB3ZSBtb3ZlIHdoaWxlIG1pZGRsZSBjbGlja2luZyBvbiBMaW51eC5cbiAgICAgICAqIFNlZSBpc3N1ZSAjMTM4My5cbiAgICAgICAqL1xuICAgICAgaWYgKFxuICAgICAgICBpc0xpbnV4ICYmXG4gICAgICAgICFuZXh0UGFzdGVQcmV2ZW50ZWQgJiZcbiAgICAgICAgKE1hdGguYWJzKGRlbHRhWCkgPiAxIHx8IE1hdGguYWJzKGRlbHRhWSkgPiAxKVxuICAgICAgKSB7XG4gICAgICAgIG5leHRQYXN0ZVByZXZlbnRlZCA9IHRydWU7XG5cbiAgICAgICAgLyogUHJldmVudCB0aGUgbmV4dCBwYXN0ZSBldmVudCAqL1xuICAgICAgICBjb25zdCBwcmV2ZW50TmV4dFBhc3RlID0gKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgcHJldmVudE5leHRQYXN0ZSk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLypcbiAgICAgICAgICogUmVlbmFibGUgbmV4dCBwYXN0ZSBpbiBjYXNlIG9mIGRpc2FibGVkIG1pZGRsZSBjbGljayBwYXN0ZSBmb3JcbiAgICAgICAgICogYW55IHJlYXNvbjpcbiAgICAgICAgICogLSByaWd0aCBjbGljayBwYXN0ZVxuICAgICAgICAgKiAtIGVtcHR5IGNsaXBib2FyZFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZW5hYmxlTmV4dFBhc3RlID0gKCkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIGVuYWJsZU5leHRQYXN0ZSk7XG4gICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBlbmFibGVOZXh0UGFzdGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsWDogdGhpcy5zdGF0ZS5zY3JvbGxYIC0gZGVsdGFYIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFkgLSBkZWx0YVkgLyB0aGlzLnN0YXRlLnpvb20udmFsdWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCB0ZWFyZG93biA9IHdpdGhCYXRjaGVkVXBkYXRlcyhcbiAgICAgIChsYXN0UG9pbnRlclVwID0gKCkgPT4ge1xuICAgICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcbiAgICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICghaXNIb2xkaW5nU3BhY2UpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgICAgIHNldEN1cnNvcih0aGlzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldEN1cnNvckZvclNoYXBlKHRoaXMuY2FudmFzLCB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIFwidXBcIik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQkxVUiwgdGVhcmRvd24pO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0ZWFyZG93bik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlLFxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZUdlc3R1cmVPblBvaW50ZXJEb3duKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiB2b2lkIHtcbiAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZLFxuICAgIH0pO1xuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gZ2V0Q2VudGVyKGdlc3R1cmUucG9pbnRlcnMpO1xuICAgICAgZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgICAgICBBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxQb2ludGVyRG93blN0YXRlKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApOiBQb2ludGVyRG93blN0YXRlIHtcbiAgICBjb25zdCBvcmlnaW4gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW4sXG4gICAgICB3aXRoQ21kT3JDdHJsOiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSxcbiAgICAgIG9yaWdpbkluR3JpZDogdHVwbGVUb0Nvb3JzKFxuICAgICAgICBnZXRHcmlkUG9pbnQob3JpZ2luLngsIG9yaWdpbi55LCB0aGlzLnN0YXRlLmdyaWRTaXplKSxcbiAgICAgICksXG4gICAgICBzY3JvbGxiYXJzOiBpc092ZXJTY3JvbGxCYXJzKFxuICAgICAgICBjdXJyZW50U2Nyb2xsQmFycyxcbiAgICAgICAgZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhdGUub2Zmc2V0TGVmdCxcbiAgICAgICAgZXZlbnQuY2xpZW50WSAtIHRoaXMuc3RhdGUub2Zmc2V0VG9wLFxuICAgICAgKSxcbiAgICAgIC8vIHdlIG5lZWQgdG8gZHVwbGljYXRlIGJlY2F1c2Ugd2UnbGwgYmUgdXBkYXRpbmcgdGhpcyBzdGF0ZVxuICAgICAgbGFzdENvb3JkczogeyAuLi5vcmlnaW4gfSxcbiAgICAgIG9yaWdpbmFsRWxlbWVudHM6IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKS5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICAgICAgICBhY2Muc2V0KGVsZW1lbnQuaWQsIGRlZXBDb3B5RWxlbWVudChlbGVtZW50KSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBuZXcgTWFwKCkgYXMgUG9pbnRlckRvd25TdGF0ZVtcIm9yaWdpbmFsRWxlbWVudHNcIl0pLFxuICAgICAgcmVzaXplOiB7XG4gICAgICAgIGhhbmRsZVR5cGU6IGZhbHNlLFxuICAgICAgICBpc1Jlc2l6aW5nOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgYXJyb3dEaXJlY3Rpb246IFwib3JpZ2luXCIsXG4gICAgICAgIGNlbnRlcjogeyB4OiAobWF4WCArIG1pblgpIC8gMiwgeTogKG1heFkgKyBtaW5ZKSAvIDIgfSxcbiAgICAgIH0sXG4gICAgICBoaXQ6IHtcbiAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgYWxsSGl0RWxlbWVudHM6IFtdLFxuICAgICAgICB3YXNBZGRlZFRvU2VsZWN0aW9uOiBmYWxzZSxcbiAgICAgICAgaGFzQmVlbkR1cGxpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBoYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50czogdGhpcy5pc0hpdHRpbmdDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICBkcmFnOiB7XG4gICAgICAgIGhhc09jY3VycmVkOiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiBudWxsLFxuICAgICAgfSxcbiAgICAgIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgICAgIG9uTW92ZTogbnVsbCxcbiAgICAgICAgb25VcDogbnVsbCxcbiAgICAgICAgb25LZXlVcDogbnVsbCxcbiAgICAgICAgb25LZXlEb3duOiBudWxsLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGRyYWdnaW5nIGEgc2Nyb2xsYmFyXG4gIHByaXZhdGUgaGFuZGxlRHJhZ2dpbmdTY3JvbGxCYXIoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIShwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVyRWl0aGVyICYmICF0aGlzLnN0YXRlLm11bHRpRWxlbWVudClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IHRydWU7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBldmVudC5jbGllbnRYO1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoKCkgPT4ge1xuICAgICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IGZhbHNlO1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgY3Vyc29yQnV0dG9uOiBcInVwXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJ1cFwiKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfTU9WRSwgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBvblBvaW50ZXJVcCk7XG4gICAgfSk7XG5cbiAgICBsYXN0UG9pbnRlclVwID0gb25Qb2ludGVyVXA7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBwb2ludGVyIGV2ZW50IGhhcyBiZWVuIGNvbXBsZXRlbHkgaGFuZGxlZFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTZWxlY3Rpb25PblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICh0aGlzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCB0aGlzLnN0YXRlKTtcbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRFbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUoXG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHJlc2l6aW5nRWxlbWVudDogZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLmVsZW1lbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9XG4gICAgICAgICAgICBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9IGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzKFxuICAgICAgICAgIGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKSxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgdGhpcy5zdGF0ZS56b29tLFxuICAgICAgICAgIGV2ZW50LnBvaW50ZXJUeXBlLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUpIHtcbiAgICAgICAgc2V0Q3Vyc29yKFxuICAgICAgICAgIHRoaXMuY2FudmFzLFxuICAgICAgICAgIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCh7XG4gICAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlOiBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5pc1Jlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIGdldFJlc2l6ZU9mZnNldFhZKFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSxcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHMsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkgJiZcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLnBvaW50cy5sZW5ndGggPT09IDJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24gPSBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbihcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzWzBdLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyRG93bihcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIChhcHBTdGF0ZSkgPT4gdGhpcy5zZXRTdGF0ZShhcHBTdGF0ZSksXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnksXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChyZXQuaGl0RWxlbWVudCkge1xuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA9IHJldC5oaXRFbGVtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmV0LmRpZEFkZFBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoaXRFbGVtZW50IG1heSBhbHJlYWR5IGJlIHNldCBhYm92ZSwgc28gY2hlY2sgZmlyc3RcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA9XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA/P1xuICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudEF0UG9zaXRpb24oXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgICAgICApO1xuXG4gICAgICAgIC8vIEZvciBvdmVybGFwcGVkIGVsZW1lbnRzIG9uZSBwb3NpdGlvbiBtYXkgaGl0XG4gICAgICAgIC8vIG11bHRpcGxlIGVsZW1lbnRzXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24oXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuICAgICAgICBjb25zdCBzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKFxuICAgICAgICAgIChlbGVtZW50KSA9PiB0aGlzLmlzQVNlbGVjdGVkRWxlbWVudChlbGVtZW50KSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChoaXRFbGVtZW50ID09PSBudWxsIHx8ICFzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQpICYmXG4gICAgICAgICAgIWV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBjbGljayBvbiBzb21ldGhpbmdcbiAgICAgICAgaWYgKGhpdEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIG9uIENNRC9DVFJMLCBkcmlsbCBkb3duIHRvIGhpdCBlbGVtZW50IHJlZ2FyZGxlc3Mgb2YgZ3JvdXBzIGV0Yy5cbiAgICAgICAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgIC4uLmVkaXRHcm91cEZvclNlbGVjdGVkRWxlbWVudChwcmV2U3RhdGUsIGhpdEVsZW1lbnQpLFxuICAgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAvLyBtYXJrIGFzIG5vdCBjb21wbGV0ZWx5IGhhbmRsZWQgc28gYXMgdG8gYWxsb3cgZHJhZ2dpbmcgZXRjLlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRlc2VsZWN0IGlmIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICAgICAgICAvLyBpZiBzaGlmdCBpcyBub3QgY2xpY2tlZCwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZVxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQgd2lsbCB0cmlnZ2VyIHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50XG4gICAgICAgICAgLy8gc3RhdGUgb2YgdGhlIGJveFxuICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF0pIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBjdXJyZW50bHkgZWRpdGluZyBhIGdyb3VwLCBleGl0aW5nIGVkaXRpbmcgbW9kZSBhbmQgZGVzZWxlY3QgdGhlIGdyb3VwLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkICYmXG4gICAgICAgICAgICAgICFpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHRoaXMuc3RhdGUuZWRpdGluZ0dyb3VwSWQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBoaXQgZWxlbWVudCB0byBzZWxlY3Rpb24uIEF0IHRoaXMgcG9pbnQgaWYgd2UncmUgbm90IGhvbGRpbmdcbiAgICAgICAgICAgIC8vIFNISUZUIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkZXNlbGVjdGVkIGFib3ZlXG4gICAgICAgICAgICAvLyAobWFrZSBzdXJlIHlvdSB1c2Ugc2V0U3RhdGUgdXBkYXRlciB0byB1c2UgbGF0ZXN0IHN0YXRlKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHByaXZhdGUgaXNBU2VsZWN0ZWRFbGVtZW50KGhpdEVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBoaXRFbGVtZW50ICE9IG51bGwgJiYgdGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbaGl0RWxlbWVudC5pZF07XG4gIH1cblxuICBwcml2YXRlIGlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKFxuICAgIHBvaW50OiBSZWFkb25seTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+LFxuICAgIHNlbGVjdGVkRWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBIb3cgbWFueSBwaXhlbHMgb2ZmIHRoZSBzaGFwZSBib3VuZGFyeSB3ZSBzdGlsbCBjb25zaWRlciBhIGhpdFxuICAgIGNvbnN0IHRocmVzaG9sZCA9IDEwIC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlO1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgcmV0dXJuIChcbiAgICAgIHBvaW50LnggPiB4MSAtIHRocmVzaG9sZCAmJlxuICAgICAgcG9pbnQueCA8IHgyICsgdGhyZXNob2xkICYmXG4gICAgICBwb2ludC55ID4geTEgLSB0aHJlc2hvbGQgJiZcbiAgICAgIHBvaW50LnkgPCB5MiArIHRocmVzaG9sZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRleHRPblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIGlmIHdlJ3JlIGN1cnJlbnRseSBzdGlsbCBlZGl0aW5nIHRleHQsIGNsaWNraW5nIG91dHNpZGVcbiAgICAvLyBzaG91bGQgb25seSBmaW5hbGl6ZSBpdCwgbm90IGNyZWF0ZSBhbm90aGVyIChpcnJlc3BlY3RpdmVcbiAgICAvLyBvZiBzdGF0ZS5lbGVtZW50TG9ja2VkKVxuICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50Py50eXBlID09PSBcInRleHRcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRUZXh0RWRpdGluZyh7XG4gICAgICBzY2VuZVg6IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICBzY2VuZVk6IHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleSxcbiAgICB9KTtcblxuICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICBpZiAoIXRoaXMuc3RhdGUuZWxlbWVudExvY2tlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlRnJlZURyYXdFbGVtZW50T25Qb2ludGVyRG93biA9IChcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBlbGVtZW50VHlwZTogRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKSA9PiB7XG4gICAgLy8gQmVnaW4gYSBtYXJrIGNhcHR1cmUuIFRoaXMgZG9lcyBub3QgaGF2ZSB0byB1cGRhdGUgc3RhdGUgeWV0LlxuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICBudWxsLFxuICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gbmV3RnJlZURyYXdFbGVtZW50KHtcbiAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgeDogZ3JpZFgsXG4gICAgICB5OiBncmlkWSxcbiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgc2ltdWxhdGVQcmVzc3VyZTogZXZlbnQucHJlc3N1cmUgPT09IDAuNSxcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICBbZWxlbWVudC5pZF06IGZhbHNlLFxuICAgICAgfSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBwcmVzc3VyZXMgPSBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmVcbiAgICAgID8gZWxlbWVudC5wcmVzc3VyZXNcbiAgICAgIDogWy4uLmVsZW1lbnQucHJlc3N1cmVzLCBldmVudC5wcmVzc3VyZV07XG5cbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgIHBvaW50czogW1swLCAwXV0sXG4gICAgICBwcmVzc3VyZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBib3VuZEVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgIHRoaXMuc2NlbmUsXG4gICAgKTtcbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgZWxlbWVudCxcbiAgICBdKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRyYWdnaW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgc3RhcnRCb3VuZEVsZW1lbnQ6IGJvdW5kRWxlbWVudCxcbiAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIGVsZW1lbnRUeXBlOiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuc3RhdGUubXVsdGlFbGVtZW50KSB7XG4gICAgICBjb25zdCB7IG11bHRpRWxlbWVudCB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgLy8gZmluYWxpemUgaWYgY29tcGxldGluZyBhIGxvb3BcbiAgICAgIGlmIChcbiAgICAgICAgbXVsdGlFbGVtZW50LnR5cGUgPT09IFwibGluZVwiICYmXG4gICAgICAgIGlzUGF0aEFMb29wKG11bHRpRWxlbWVudC5wb2ludHMsIHRoaXMuc3RhdGUuem9vbS52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDpcbiAgICAgICAgICAgIG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHg6IHJ4LCB5OiByeSwgbGFzdENvbW1pdHRlZFBvaW50IH0gPSBtdWx0aUVsZW1lbnQ7XG5cbiAgICAgIC8vIGNsaWNraW5nIGluc2lkZSBjb21taXQgem9uZSDihpIgZmluYWxpemUgYXJyb3dcbiAgICAgIGlmIChcbiAgICAgICAgbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggPiAxICYmXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludCAmJlxuICAgICAgICBkaXN0YW5jZTJkKFxuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSByeCxcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcnksXG4gICAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50WzBdLFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFsxXSxcbiAgICAgICAgKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTERcbiAgICAgICkge1xuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgIFttdWx0aUVsZW1lbnQuaWRdOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgICAgLy8gY2xpY2tpbmcgb3V0c2lkZSBjb21taXQgem9uZSDihpIgdXBkYXRlIHJlZmVyZW5jZSBmb3IgbGFzdCBjb21taXR0ZWRcbiAgICAgIC8vIHBvaW50XG4gICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXSxcbiAgICAgIH0pO1xuICAgICAgc2V0Q3Vyc29yKHRoaXMuY2FudmFzLCBDVVJTT1JfVFlQRS5QT0lOVEVSKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuXG4gICAgICAvKiBJZiBhcnJvdyBpcyBwcmUtYXJyb3doZWFkcywgaXQgd2lsbCBoYXZlIHVuZGVmaW5lZCBmb3IgYm90aCBzdGFydCBhbmQgZW5kIGFycm93aGVhZHMuXG4gICAgICBJZiBzbywgd2Ugd2FudCBpdCB0byBiZSBudWxsIGZvciBzdGFydCBhbmQgXCJhcnJvd1wiIGZvciBlbmQuIElmIHRoZSBsaW5lYXIgaXRlbSBpcyBub3RcbiAgICAgIGFuIGFycm93LCB3ZSB3YW50IGl0IHRvIGJlIG51bGwgZm9yIGJvdGguIE90aGVyd2lzZSwgd2Ugd2FudCBpdCB0byB1c2UgdGhlXG4gICAgICB2YWx1ZXMgZnJvbSBhcHBTdGF0ZS4gKi9cblxuICAgICAgY29uc3QgeyBjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgIGNvbnN0IFtzdGFydEFycm93aGVhZCwgZW5kQXJyb3doZWFkXSA9XG4gICAgICAgIGVsZW1lbnRUeXBlID09PSBcImFycm93XCJcbiAgICAgICAgICA/IFtjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZF1cbiAgICAgICAgICA6IFtudWxsLCBudWxsXTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IG5ld0xpbmVhckVsZW1lbnQoe1xuICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgeDogZ3JpZFgsXG4gICAgICAgIHk6IGdyaWRZLFxuICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtTGluZWFyU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgICBzdGFydEFycm93aGVhZCxcbiAgICAgICAgZW5kQXJyb3doZWFkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgW2VsZW1lbnQuaWRdOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICBwb2ludHM6IFsuLi5lbGVtZW50LnBvaW50cywgWzAsIDBdXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbixcbiAgICAgICAgdGhpcy5zY2VuZSxcbiAgICAgICk7XG4gICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbXG4gICAgICAgIC4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICBdKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBzdGFydEJvdW5kRWxlbWVudDogYm91bmRFbGVtZW50LFxuICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBjcmVhdGVHZW5lcmljRWxlbWVudE9uUG9pbnRlckRvd24gPSAoXG4gICAgZWxlbWVudFR5cGU6IEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudFtcInR5cGVcIl0sXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoXG4gICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSxcbiAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgKTtcbiAgICBjb25zdCBlbGVtZW50ID0gbmV3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVNoYXJwbmVzcyxcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW1xuICAgICAgICAuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgXSk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbXVsdGlFbGVtZW50OiBudWxsLFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgb25LZXlEb3duRnJvbVBvaW50ZXJEb3duSGFuZGxlcihcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uS2V5VXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHdpdGhCYXRjaGVkVXBkYXRlcygoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIC8vIFByZXZlbnRzIGZvY3VzIGZyb20gZXNjYXBpbmcgZXhjYWxpZHJhdyB0YWJcbiAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5BTFQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmICh0aGlzLm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm1heWJlRHJhZ05ld0dlbmVyaWNFbGVtZW50KHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgKTogKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHZvaWQge1xuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBkcmFnT2Zmc2V0WFkgb25seSBhZnRlciB3ZSd2ZSB1cGRhdGVkXG4gICAgICAvLyBgc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzYCBvbiBwb2ludGVyRG93bi4gRG9pbmcgaXQgaGVyZSBpbiBwb2ludGVyTW92ZVxuICAgICAgLy8gZXZlbnQgaGFuZGxlciBzaG91bGQgaG9wZWZ1bGx5IGVuc3VyZSB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgd2l0aFxuICAgICAgLy8gdGhlIHVwZGF0ZWQgc3RhdGUuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9PT0gbnVsbCkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgIGdldERyYWdPZmZzZXRYWShcbiAgICAgICAgICAgIGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlT3ZlclNjcm9sbGJhcnMoZXZlbnQsIHBvaW50ZXJEb3duU3RhdGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgdGhpcy5zdGF0ZSk7XG4gICAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuXG4gICAgICAvLyBmb3IgYXJyb3dzL2xpbmVzLCBkb24ndCBzdGFydCBkcmFnZ2luZyB1bnRpbCBhIGdpdmVuIHRocmVzaG9sZFxuICAgICAgLy8gdG8gZW5zdXJlIHdlIGRvbid0IGNyZWF0ZSBhIDItcG9pbnQgYXJyb3cgYnkgbWlzdGFrZSB3aGVuXG4gICAgICAvLyB1c2VyIGNsaWNrcyBtb3VzZSBpbiBhIHdheSB0aGF0IGl0IG1vdmVzIGEgdGlueSBiaXQgKHRodXNcbiAgICAgIC8vIHRyaWdnZXJpbmcgcG9pbnRlcm1vdmUpXG4gICAgICBpZiAoXG4gICAgICAgICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgKHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiYXJyb3dcIiB8fFxuICAgICAgICAgIHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwibGluZVwiKVxuICAgICAgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkaXN0YW5jZTJkKFxuICAgICAgICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgICAgICAgcG9pbnRlckNvb3Jkcy55LFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgKSA8IERSQUdHSU5HX1RIUkVTSE9MRFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmlzUmVzaXppbmcpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuICAgICAgICBpZiAodGhpcy5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBkaWREcmFnID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludERyYWdnaW5nKFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgKGFwcFN0YXRlKSA9PiB0aGlzLnNldFN0YXRlKGFwcFN0YXRlKSxcbiAgICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgICAgcG9pbnRlckNvb3Jkcy55LFxuICAgICAgICAgIChlbGVtZW50LCBzdGFydE9yRW5kKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JMaW5lYXJFbGVtZW50QXRDdXJzb3IoXG4gICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgIHN0YXJ0T3JFbmQsXG4gICAgICAgICAgICAgIHBvaW50ZXJDb29yZHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRpZERyYWcpIHtcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueSA9IHBvaW50ZXJDb29yZHMueTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzSGl0QVNlbGVjdGVkRWxlbWVudCA9IHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzLnNvbWUoXG4gICAgICAgIChlbGVtZW50KSA9PiB0aGlzLmlzQVNlbGVjdGVkRWxlbWVudChlbGVtZW50KSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgaGFzSGl0QVNlbGVjdGVkRWxlbWVudCB8fFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgKSB7XG4gICAgICAgIC8vIE1hcmtpbmcgdGhhdCBjbGljayB3YXMgdXNlZCBmb3IgZHJhZ2dpbmcgdG8gY2hlY2tcbiAgICAgICAgLy8gaWYgZWxlbWVudHMgc2hvdWxkIGJlIGRlc2VsZWN0ZWQgb24gcG9pbnRlcnVwXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICAvLyBwcmV2ZW50IGRyYWdnaW5nIGV2ZW4gaWYgd2UncmUgbm8gbG9uZ2VyIGhvbGRpbmcgY21kL2N0cmwgb3RoZXJ3aXNlXG4gICAgICAgIC8vIGl0IHdvdWxkIGhhdmUgd2VpcmQgcmVzdWx0cyAoc3R1ZmYganVtcGluZyBhbGwgb3ZlciB0aGUgc2NyZWVuKVxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwICYmICFwb2ludGVyRG93blN0YXRlLndpdGhDbWRPckN0cmwpIHtcbiAgICAgICAgICBjb25zdCBbZHJhZ1gsIGRyYWdZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgICAgIHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueCxcbiAgICAgICAgICAgIHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueSxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IFtkcmFnRGlzdGFuY2VYLCBkcmFnRGlzdGFuY2VZXSA9IFtcbiAgICAgICAgICAgIE1hdGguYWJzKHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngpLFxuICAgICAgICAgICAgTWF0aC5hYnMocG9pbnRlckNvb3Jkcy55IC0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSksXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIC8vIFdlIG9ubHkgZHJhZyBpbiBvbmUgZGlyZWN0aW9uIGlmIHNoaWZ0IGlzIHByZXNzZWRcbiAgICAgICAgICBjb25zdCBsb2NrRGlyZWN0aW9uID0gZXZlbnQuc2hpZnRLZXk7XG5cbiAgICAgICAgICBkcmFnU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzLFxuICAgICAgICAgICAgZHJhZ1gsXG4gICAgICAgICAgICBkcmFnWSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgICBsb2NrRGlyZWN0aW9uLFxuICAgICAgICAgICAgZHJhZ0Rpc3RhbmNlWCxcbiAgICAgICAgICAgIGRyYWdEaXN0YW5jZVksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgICAgICAvLyBXZSBkdXBsaWNhdGUgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaWYgYWx0IGlzIHByZXNzZWQgb24gcG9pbnRlciBtb3ZlXG4gICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSAmJiAhcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQpIHtcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50cyB0byB0aGUgdG9wIG9mIHRoZSB6IGluZGV4IHN0YWNrLCBhbmRcbiAgICAgICAgICAgIC8vIHB1dCB0aGUgZHVwbGljYXRlcyB3aGVyZSB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgdXNlZCB0byBiZS5cbiAgICAgICAgICAgIC8vICh0aGUgb3JpZ2luIHBvaW50IHdoZXJlIHRoZSBkcmFnZ2luZyBzdGFydGVkKVxuXG4gICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNCZWVuRHVwbGljYXRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRFbGVtZW50cyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNUb0FwcGVuZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBJZE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZElkVG9EdXBsaWNhdGVkSWQgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBoaXRFbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSB8fFxuICAgICAgICAgICAgICAgIC8vIGNhc2U6IHRoZSBzdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMgbWlnaHQgbm90IGhhdmUgYmVlblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgeWV0IGJ5IHRoZSB0aW1lIHRoaXMgbW91c2Vtb3ZlIGV2ZW50IGlzIGZpcmVkXG4gICAgICAgICAgICAgICAgKGVsZW1lbnQuaWQgPT09IGhpdEVsZW1lbnQ/LmlkICYmXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkdXBsaWNhdGVkRWxlbWVudCA9IGR1cGxpY2F0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmVkaXRpbmdHcm91cElkLFxuICAgICAgICAgICAgICAgICAgZ3JvdXBJZE1hcCxcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBbb3JpZ2luRHJhZ1gsIG9yaWdpbkRyYWdZXSA9IGdldEdyaWRQb2ludChcbiAgICAgICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnggLSBwb2ludGVyRG93blN0YXRlLmRyYWcub2Zmc2V0LngsXG4gICAgICAgICAgICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LFxuICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHVwbGljYXRlZEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgIHg6IGR1cGxpY2F0ZWRFbGVtZW50LnggKyAob3JpZ2luRHJhZ1ggLSBkcmFnWCksXG4gICAgICAgICAgICAgICAgICB5OiBkdXBsaWNhdGVkRWxlbWVudC55ICsgKG9yaWdpbkRyYWdZIC0gZHJhZ1kpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGR1cGxpY2F0ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZC5zZXQoZWxlbWVudC5pZCwgZHVwbGljYXRlZEVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0U2NlbmVFbGVtZW50cyA9IFsuLi5uZXh0RWxlbWVudHMsIC4uLmVsZW1lbnRzVG9BcHBlbmRdO1xuICAgICAgICAgICAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uKFxuICAgICAgICAgICAgICBuZXh0U2NlbmVFbGVtZW50cyxcbiAgICAgICAgICAgICAgZWxlbWVudHNUb0FwcGVuZCxcbiAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZCxcbiAgICAgICAgICAgICAgXCJkdXBsaWNhdGVzU2VydmVBc09sZFwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKG5leHRTY2VuZUVsZW1lbnRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRvIHJlYWQgdGhpcy5zdGF0ZSB3aXRoaW4gZWFjaCBtb3ZlIGV2ZW50LFxuICAgICAgLy8gb3RoZXJ3aXNlIHdlIHdvdWxkIHJlYWQgYSBzdGFsZSBvbmUhXG4gICAgICBjb25zdCBkcmFnZ2luZ0VsZW1lbnQgPSB0aGlzLnN0YXRlLmRyYWdnaW5nRWxlbWVudDtcbiAgICAgIGlmICghZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudC50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgY29uc3QgZHggPSBwb2ludGVyQ29vcmRzLnggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgY29uc3QgZHkgPSBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueTtcblxuICAgICAgICBjb25zdCBwcmVzc3VyZXMgPSBkcmFnZ2luZ0VsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZVxuICAgICAgICAgID8gZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlc1xuICAgICAgICAgIDogWy4uLmRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMsIGV2ZW50LnByZXNzdXJlXTtcblxuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgIHByZXNzdXJlcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGRyYWdnaW5nRWxlbWVudC5wb2ludHM7XG4gICAgICAgIGxldCBkeCA9IGdyaWRYIC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IGdyaWRZIC0gZHJhZ2dpbmdFbGVtZW50Lnk7XG5cbiAgICAgICAgaWYgKGdldFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlS2V5KGV2ZW50KSAmJiBwb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgKHsgd2lkdGg6IGR4LCBoZWlnaHQ6IGR5IH0gPSBnZXRQZXJmZWN0RWxlbWVudFNpemUoXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgZHgsXG4gICAgICAgICAgICBkeSxcbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHsgcG9pbnRzOiBbLi4ucG9pbnRzLCBbZHgsIGR5XV0gfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLnNsaWNlKDAsIC0xKSwgW2R4LCBkeV1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICAgIC8vIFdoZW4gY3JlYXRpbmcgYSBsaW5lYXIgZWxlbWVudCBieSBkcmFnZ2luZ1xuICAgICAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckxpbmVhckVsZW1lbnRBdEN1cnNvcihcbiAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgICAgIFwiZW5kXCIsXG4gICAgICAgICAgICBwb2ludGVyQ29vcmRzLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5zdGFydEJvdW5kRWxlbWVudCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG4gICAgICAgIHRoaXMubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICAgICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiBpc1NvbWVFbGVtZW50U2VsZWN0ZWQoZWxlbWVudHMsIHRoaXMuc3RhdGUpKSB7XG4gICAgICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUud2l0aENtZE9yQ3RybCAmJiBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+XG4gICAgICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50IS5pZF06IHRydWUsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50c1dpdGhpblNlbGVjdGlvbiA9IGdldEVsZW1lbnRzV2l0aGluU2VsZWN0aW9uKFxuICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PlxuICAgICAgICAgIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAuLi5lbGVtZW50c1dpdGhpblNlbGVjdGlvbi5yZWR1Y2UoKG1hcCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgbWFwW2VsZW1lbnQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgfSwge30gYXMgYW55KSxcbiAgICAgICAgICAgICAgICAuLi4ocG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudFxuICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNpbmcgY3RybC9jbWQsIHNlbGVjdCB0aGUgaGl0RWxlbWVudCBvbmx5IGlmIHdlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZW4ndCBib3gtc2VsZWN0ZWQgYW55dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAuaWRdOiAhZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA6IG51bGwpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwb2ludGVyIG1vdmUgaGFwcGVuZWQgb3ZlciBlaXRoZXIgc2Nyb2xsYmFyXG4gIHByaXZhdGUgaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVySG9yaXpvbnRhbCkge1xuICAgICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCBkeCA9IHggLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueDtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxYOiB0aGlzLnN0YXRlLnNjcm9sbFggLSBkeCAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSB4O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJWZXJ0aWNhbCkge1xuICAgICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICBjb25zdCBkeSA9IHkgLSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFkgLSBkeSAvIHRoaXMuc3RhdGUuem9vbS52YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSB5O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgb25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICk6IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB2b2lkIHtcbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKChjaGlsZEV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICByZXNpemluZ0VsZW1lbnQsXG4gICAgICAgIG11bHRpRWxlbWVudCxcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIGVsZW1lbnRMb2NrZWQsXG4gICAgICAgIGlzUmVzaXppbmcsXG4gICAgICAgIGlzUm90YXRpbmcsXG4gICAgICB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzUmVzaXppbmc6IGZhbHNlLFxuICAgICAgICBpc1JvdGF0aW5nOiBmYWxzZSxcbiAgICAgICAgcmVzaXppbmdFbGVtZW50OiBudWxsLFxuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBudWxsLFxuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIixcbiAgICAgICAgLy8gdGV4dCBlbGVtZW50cyBhcmUgcmVzZXQgb24gZmluYWxpemUsIGFuZCByZXNldHRpbmcgb24gcG9pbnRlcnVwXG4gICAgICAgIC8vIG1heSBjYXVzZSBpc3N1ZXMgd2l0aCBkb3VibGUgdGFwc1xuICAgICAgICBlZGl0aW5nRWxlbWVudDpcbiAgICAgICAgICBtdWx0aUVsZW1lbnQgfHwgaXNUZXh0RWxlbWVudCh0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50KVxuICAgICAgICAgICAgPyB0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zYXZlUG9pbnRlcihjaGlsZEV2ZW50LmNsaWVudFgsIGNoaWxkRXZlbnQuY2xpZW50WSwgXCJ1cFwiKTtcblxuICAgICAgLy8gSGFuZGxlIGVuZCBvZiBkcmFnZ2luZyBhIHBvaW50IG9mIGEgbGluZWFyIGVsZW1lbnQsIG1pZ2h0IGNsb3NlIGEgbG9vcFxuICAgICAgLy8gYW5kIHNldHMgYmluZGluZyBlbGVtZW50XG4gICAgICBpZiAodGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlclVwKFxuICAgICAgICAgIGNoaWxkRXZlbnQsXG4gICAgICAgICAgdGhpcy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQgIT09IHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQb2ludGVyVXAgPSBudWxsO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuUE9JTlRFUl9NT1ZFLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uTW92ZSEsXG4gICAgICApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULlBPSU5URVJfVVAsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25VcCEsXG4gICAgICApO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIEVWRU5ULktFWURPV04sXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlEb3duISxcbiAgICAgICk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgRVZFTlQuS0VZVVAsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlVcCEsXG4gICAgICApO1xuXG4gICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50Py50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgICBjaGlsZEV2ZW50LFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgbGV0IGR4ID0gcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IHBvaW50ZXJDb29yZHMueSAtIGRyYWdnaW5nRWxlbWVudC55O1xuXG4gICAgICAgIC8vIEFsbG93cyBkb3RzIHRvIGF2b2lkIGJlaW5nIGZsYWdnZWQgYXMgaW5maW5pdGVseSBzbWFsbFxuICAgICAgICBpZiAoZHggPT09IHBvaW50c1swXVswXSAmJiBkeSA9PT0gcG9pbnRzWzBdWzFdKSB7XG4gICAgICAgICAgZHkgKz0gMC4wMDAxO1xuICAgICAgICAgIGR4ICs9IDAuMDAwMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXNzdXJlcyA9IGRyYWdnaW5nRWxlbWVudC5zaW11bGF0ZVByZXNzdXJlXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogWy4uLmRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMsIGNoaWxkRXZlbnQucHJlc3N1cmVdO1xuXG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLCBbZHgsIGR5XV0sXG4gICAgICAgICAgcHJlc3N1cmVzLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNMaW5lYXJFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudCEucG9pbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhcbiAgICAgICAgICBjaGlsZEV2ZW50LFxuICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQgJiZcbiAgICAgICAgICAhbXVsdGlFbGVtZW50XG4gICAgICAgICkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFtcbiAgICAgICAgICAgICAgLi4uZHJhZ2dpbmdFbGVtZW50LnBvaW50cyxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHBvaW50ZXJDb29yZHMueCAtIGRyYWdnaW5nRWxlbWVudC54LFxuICAgICAgICAgICAgICAgIHBvaW50ZXJDb29yZHMueSAtIGRyYWdnaW5nRWxlbWVudC55LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIG11bHRpRWxlbWVudDogZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiAhbXVsdGlFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKSAmJlxuICAgICAgICAgICAgaXNCaW5kaW5nRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBtYXliZUJpbmRMaW5lYXJFbGVtZW50KFxuICAgICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQsXG4gICAgICAgICAgICAgIHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgIHRoaXMuc2NlbmUsXG4gICAgICAgICAgICAgIHBvaW50ZXJDb29yZHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLCBzdGFydEJvdW5kRWxlbWVudDogbnVsbCB9KTtcbiAgICAgICAgICBpZiAoIWVsZW1lbnRMb2NrZWQpIHtcbiAgICAgICAgICAgIHJlc2V0Q3Vyc29yKHRoaXMuY2FudmFzKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIixcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICBbdGhpcy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQhLmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgW3RoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50IS5pZF06IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBlbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJlxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQgJiZcbiAgICAgICAgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KVxuICAgICAgKSB7XG4gICAgICAgIC8vIHJlbW92ZSBpbnZpc2libGUgZWxlbWVudCB3aGljaCB3YXMgYWRkZWQgaW4gb25Qb2ludGVyRG93blxuICAgICAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhcbiAgICAgICAgICB0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50KSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoXG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgIGdldE5vcm1hbGl6ZWREaW1lbnNpb25zKGRyYWdnaW5nRWxlbWVudCksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNpemluZ0VsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzaXppbmdFbGVtZW50ICYmIGlzSW52aXNpYmx5U21hbGxFbGVtZW50KHJlc2l6aW5nRWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoXG4gICAgICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAgICAgLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpXG4gICAgICAgICAgICAuZmlsdGVyKChlbCkgPT4gZWwuaWQgIT09IHJlc2l6aW5nRWxlbWVudC5pZCksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvZGUgYmVsb3cgaGFuZGxlcyBzZWxlY3Rpb24gd2hlbiBlbGVtZW50KHMpIHdlcmVuJ3RcbiAgICAgIC8vIGRyYWcgb3IgYWRkZWQgdG8gc2VsZWN0aW9uIG9uIHBvaW50ZXIgZG93biBwaGFzZS5cbiAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuICAgICAgaWYgKFxuICAgICAgICBoaXRFbGVtZW50ICYmXG4gICAgICAgICFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiZcbiAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb25cbiAgICAgICkge1xuICAgICAgICBpZiAoY2hpbGRFdmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1toaXRFbGVtZW50LmlkXSkge1xuICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWRWaWFHcm91cCh0aGlzLnN0YXRlLCBoaXRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVuc2VsZWN0IGFsbCBncm91cHMgaGl0RWxlbWVudCBpcyBwYXJ0IG9mXG4gICAgICAgICAgICAgIC8vIGFzIHdlbGwgYXMgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGdyb3Vwc1xuICAgICAgICAgICAgICAvLyBoaXRFbGVtZW50IGlzIHBhcnQgb2ZcbiAgICAgICAgICAgICAgY29uc3QgaWRzT2ZTZWxlY3RlZEVsZW1lbnRzVGhhdEFyZUluR3JvdXBzID0gaGl0RWxlbWVudC5ncm91cElkc1xuICAgICAgICAgICAgICAgIC5mbGF0TWFwKChncm91cElkKSA9PlxuICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudHNJbkdyb3VwKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgZ3JvdXBJZCksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5tYXAoKGVsZW1lbnQpID0+ICh7IFtlbGVtZW50LmlkXTogZmFsc2UgfSkpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgocHJldklkLCBhY2MpID0+ICh7IC4uLnByZXZJZCwgLi4uYWNjIH0pLCB7fSk7XG5cbiAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgoX3ByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7XG4gICAgICAgICAgICAgICAgICAuLi5fcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgICAgICAgICAgICAgIC4uLmhpdEVsZW1lbnQuZ3JvdXBJZHNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoZ0lkKSA9PiAoeyBbZ0lkXTogZmFsc2UgfSkpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHByZXYsIGFjYykgPT4gKHsgLi4ucHJldiwgLi4uYWNjIH0pLCB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAgIC4uLl9wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgICAgLi4uaWRzT2ZTZWxlY3RlZEVsZW1lbnRzVGhhdEFyZUluR3JvdXBzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIHJlbW92ZSBlbGVtZW50IGZyb20gc2VsZWN0aW9uIHdoaWxlXG4gICAgICAgICAgICAgIC8vIGtlZXBpbmcgcHJldiBlbGVtZW50cyBzZWxlY3RlZFxuICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+XG4gICAgICAgICAgICAgICAgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucHJldlN0YXRlLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50IS5pZF06IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhZGQgZWxlbWVudCB0byBzZWxlY3Rpb24gd2hpbGVcbiAgICAgICAgICAgIC8vIGtlZXBpbmcgcHJldiBlbGVtZW50cyBzZWxlY3RlZFxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSgoX3ByZXZTdGF0ZSkgPT4gKHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgLi4uX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQhLmlkXTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgLi4uc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLnByZXZTdGF0ZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2hpdEVsZW1lbnQuaWRdOiB0cnVlIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiZcbiAgICAgICAgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJlxuICAgICAgICAhdGhpcy5zdGF0ZS5pc1Jlc2l6aW5nICYmXG4gICAgICAgICgoaGl0RWxlbWVudCAmJlxuICAgICAgICAgIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChcbiAgICAgICAgICAgIGhpdEVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCxcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksXG4gICAgICAgICAgKSkgfHxcbiAgICAgICAgICAoIWhpdEVsZW1lbnQgJiZcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKSlcbiAgICAgICkge1xuICAgICAgICAvLyBEZXNlbGVjdCBzZWxlY3RlZCBlbGVtZW50c1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudExvY2tlZCAmJiBlbGVtZW50VHlwZSAhPT0gXCJmcmVlZHJhd1wiICYmIGRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAuLi5wcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgICAgICAgICAgW2RyYWdnaW5nRWxlbWVudC5pZF06IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiIHx8XG4gICAgICAgIGlzU29tZUVsZW1lbnRTZWxlY3RlZCh0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksIHRoaXMuc3RhdGUpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkIHx8IGlzUmVzaXppbmcgfHwgaXNSb3RhdGluZykge1xuICAgICAgICAoaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKVxuICAgICAgICAgID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICAgIDogdW5iaW5kTGluZWFyRWxlbWVudHMpKFxuICAgICAgICAgIGdldFNlbGVjdGVkRWxlbWVudHModGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50TG9ja2VkICYmIGVsZW1lbnRUeXBlICE9PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgcmVzZXRDdXJzb3IodGhpcy5jYW52YXMpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW10sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUgPSAoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICkgPT4ge1xuICAgIGNvbnN0IHNob3VsZEVuYWJsZUJpbmRpbmcgPSBzaG91bGRFbmFibGVCaW5kaW5nRm9yUG9pbnRlckV2ZW50KGV2ZW50KTtcbiAgICBpZiAodGhpcy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkICE9PSBzaG91bGRFbmFibGVCaW5kaW5nKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNCaW5kaW5nRW5hYmxlZDogc2hvdWxkRW5hYmxlQmluZGluZyB9KTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBtYXliZVN1Z2dlc3RCaW5kaW5nQXRDdXJzb3IgPSAocG9pbnRlckNvb3Jkczoge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0pOiB2b2lkID0+IHtcbiAgICBjb25zdCBob3ZlcmVkQmluZGFibGVFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgcG9pbnRlckNvb3JkcyxcbiAgICAgIHRoaXMuc2NlbmUsXG4gICAgKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOlxuICAgICAgICBob3ZlcmVkQmluZGFibGVFbGVtZW50ICE9IG51bGwgPyBbaG92ZXJlZEJpbmRhYmxlRWxlbWVudF0gOiBbXSxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIG1heWJlU3VnZ2VzdEJpbmRpbmdGb3JMaW5lYXJFbGVtZW50QXRDdXJzb3IgPSAoXG4gICAgbGluZWFyRWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgc3RhcnRPckVuZDogXCJzdGFydFwiIHwgXCJlbmRcIixcbiAgICBwb2ludGVyQ29vcmRzOiB7XG4gICAgICB4OiBudW1iZXI7XG4gICAgICB5OiBudW1iZXI7XG4gICAgfSxcbiAgICAvLyBEdXJpbmcgbGluZSBjcmVhdGlvbiB0aGUgc3RhcnQgYmluZGluZyBoYXNuJ3QgYmVlbiB3cml0dGVuIHlldFxuICAgIC8vIGludG8gYGxpbmVhckVsZW1lbnRgXG4gICAgb3Bwb3NpdGVCaW5kaW5nQm91bmRFbGVtZW50PzogRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCB8IG51bGwsXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgPSBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICBwb2ludGVyQ29vcmRzLFxuICAgICAgdGhpcy5zY2VuZSxcbiAgICApO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6XG4gICAgICAgIGhvdmVyZWRCaW5kYWJsZUVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICAgICAhaXNMaW5lYXJFbGVtZW50U2ltcGxlQW5kQWxyZWFkeUJvdW5kKFxuICAgICAgICAgIGxpbmVhckVsZW1lbnQsXG4gICAgICAgICAgb3Bwb3NpdGVCaW5kaW5nQm91bmRFbGVtZW50Py5pZCxcbiAgICAgICAgICBob3ZlcmVkQmluZGFibGVFbGVtZW50LFxuICAgICAgICApXG4gICAgICAgICAgPyBbaG92ZXJlZEJpbmRhYmxlRWxlbWVudF1cbiAgICAgICAgICA6IFtdLFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChcbiAgICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBzdWdnZXN0ZWRCaW5kaW5ncyA9IGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzdWdnZXN0ZWRCaW5kaW5ncyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTdGF0ZSgocHJldlN0YXRlKSA9PiAoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgLy8gQ29udGludWUgZWRpdGluZyB0aGUgc2FtZSBncm91cCBpZiB0aGUgdXNlciBzZWxlY3RlZCBhIGRpZmZlcmVudFxuICAgICAgLy8gZWxlbWVudCBmcm9tIGl0XG4gICAgICBlZGl0aW5nR3JvdXBJZDpcbiAgICAgICAgcHJldlN0YXRlLmVkaXRpbmdHcm91cElkICYmXG4gICAgICAgIGhpdEVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICAgICBpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZClcbiAgICAgICAgICA/IHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZFxuICAgICAgICAgIDogbnVsbCxcbiAgICB9KSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW52YXNSZWYgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkgPT4ge1xuICAgIC8vIGNhbnZhcyBpcyBudWxsIHdoZW4gdW5tb3VudGluZ1xuICAgIGlmIChjYW52YXMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgICAgdGhpcy5yYyA9IHJvdWdoLmNhbnZhcyh0aGlzLmNhbnZhcyk7XG5cbiAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuV0hFRUwsIHRoaXMuaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfU1RBUlQsIHRoaXMub25UYXBTdGFydCk7XG4gICAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX0VORCwgdGhpcy5vblRhcEVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULldIRUVMLCB0aGlzLmhhbmRsZVdoZWVsKTtcbiAgICAgIHRoaXMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX1NUQVJULCB0aGlzLm9uVGFwU3RhcnQpO1xuICAgICAgdGhpcy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfRU5ELCB0aGlzLm9uVGFwRW5kKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVBcHBPbkRyb3AgPSBhc3luYyAoZXZlbnQ6IFJlYWN0LkRyYWdFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMucHJvcHMub25Ecm9wKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKChhd2FpdCB0aGlzLnByb3BzLm9uRHJvcChldmVudCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXNbMF07XG4gICAgICBpZiAoZmlsZT8udHlwZSA9PT0gXCJpbWFnZS9wbmdcIiB8fCBmaWxlPy50eXBlID09PSBcImltYWdlL3N2Zyt4bWxcIikge1xuICAgICAgICBpZiAoZnNTdXBwb3J0ZWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgd29yayBhcyBvZiBDaHJvbWUgODYsXG4gICAgICAgICAgICAvLyBidXQgY2FuIGJlIHNhZmVseSBpZ25vcmVkIG9uIG9sZGVyIHJlbGVhc2VzLlxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtc1swXTtcbiAgICAgICAgICAgIChmaWxlIGFzIGFueSkuaGFuZGxlID0gYXdhaXQgKGl0ZW0gYXMgYW55KS5nZXRBc0ZpbGVTeXN0ZW1IYW5kbGUoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGVycm9yLm5hbWUsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgZWxlbWVudHMsIGFwcFN0YXRlIH0gPSBhd2FpdCBsb2FkRnJvbUJsb2IoXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICB0aGlzLnN0YXRlLFxuICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3luY0FjdGlvblJlc3VsdCh7XG4gICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgYXBwU3RhdGU6IHtcbiAgICAgICAgICAgIC4uLihhcHBTdGF0ZSB8fCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGlicmFyeVNoYXBlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYik7XG4gICAgaWYgKGxpYnJhcnlTaGFwZXMgIT09IFwiXCIpIHtcbiAgICAgIHRoaXMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICBlbGVtZW50czogSlNPTi5wYXJzZShsaWJyYXJ5U2hhcGVzKSxcbiAgICAgICAgcG9zaXRpb246IGV2ZW50LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXNbMF07XG4gICAgaWYgKFxuICAgICAgZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3bGliIHx8XG4gICAgICBmaWxlPy5uYW1lPy5lbmRzV2l0aChcIi5leGNhbGlkcmF3bGliXCIpXG4gICAgKSB7XG4gICAgICB0aGlzLmxpYnJhcnlcbiAgICAgICAgLmltcG9ydExpYnJhcnkoZmlsZSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIC8vIENsb3NlIGFuZCB0aGVuIG9wZW4gdG8gZ2V0IHRoZSBsaWJyYXJpZXMgdXBkYXRlZFxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xpYnJhcnlPcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMaWJyYXJ5T3BlbjogdHJ1ZSB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT5cbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiBmYWxzZSwgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pLFxuICAgICAgICApO1xuICAgICAgLy8gZGVmYXVsdDogYXNzdW1lIGFuIEV4Y2FsaWRyYXcgZmlsZSByZWdhcmRsZXNzIG9mIGV4dGVuc2lvbi9NaW1lVHlwZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaXNMb2FkaW5nOiB0cnVlIH0pO1xuICAgICAgaWYgKGZzU3VwcG9ydGVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgd29yayBhcyBvZiBDaHJvbWUgODYsXG4gICAgICAgICAgLy8gYnV0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCBvbiBvbGRlciByZWxlYXNlcy5cbiAgICAgICAgICBjb25zdCBpdGVtID0gZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zWzBdO1xuICAgICAgICAgIChmaWxlIGFzIGFueSkuaGFuZGxlID0gYXdhaXQgKGl0ZW0gYXMgYW55KS5nZXRBc0ZpbGVTeXN0ZW1IYW5kbGUoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMubG9hZEZpbGVUb0NhbnZhcyhmaWxlKTtcbiAgICB9XG4gIH07XG5cbiAgbG9hZEZpbGVUb0NhbnZhcyA9IChmaWxlOiBCbG9iKSA9PiB7XG4gICAgbG9hZEZyb21CbG9iKGZpbGUsIHRoaXMuc3RhdGUsIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkpXG4gICAgICAudGhlbigoeyBlbGVtZW50cywgYXBwU3RhdGUgfSkgPT5cbiAgICAgICAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0KHtcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBhcHBTdGF0ZToge1xuICAgICAgICAgICAgLi4uKGFwcFN0YXRlIHx8IHRoaXMuc3RhdGUpLFxuICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc0xvYWRpbmc6IGZhbHNlLCBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbnZhc0NvbnRleHRNZW51ID0gKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICApID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgeyB4LCB5IH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHgsIHksIHsgcHJlZmVyU2VsZWN0ZWQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCB0eXBlID0gZWxlbWVudCA/IFwiZWxlbWVudFwiIDogXCJjYW52YXNcIjtcblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ITtcbiAgICBjb25zdCB7XG4gICAgICB0b3A6IG9mZnNldFRvcCxcbiAgICAgIGxlZnQ6IG9mZnNldExlZnQsXG4gICAgfSA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgY29uc3QgdG9wID0gZXZlbnQuY2xpZW50WSAtIG9mZnNldFRvcDtcblxuICAgIGlmIChlbGVtZW50ICYmICF0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdGVkRWxlbWVudElkczogeyBbZWxlbWVudC5pZF06IHRydWUgfSB9LCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX29wZW5Db250ZXh0TWVudSh7IHRvcCwgbGVmdCB9LCB0eXBlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcGVuQ29udGV4dE1lbnUoeyB0b3AsIGxlZnQgfSwgdHlwZSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQgPSAoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgICBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGRyYWdnaW5nRWxlbWVudCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50O1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgaWYgKCFkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRyYWdnaW5nRWxlbWVudC50eXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBkcmFnTmV3RWxlbWVudChcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LFxuICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckNvb3Jkcy54KSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgcG9pbnRlckNvb3Jkcy55KSxcbiAgICAgICAgZ2V0UmVzaXplV2l0aFNpZGVzU2FtZUxlbmd0aEtleShldmVudCksXG4gICAgICAgIGdldFJlc2l6ZUNlbnRlclBvaW50S2V5KGV2ZW50KSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgICAgdGhpcy5zdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICk7XG4gICAgICBkcmFnTmV3RWxlbWVudChcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICB0aGlzLnN0YXRlLmVsZW1lbnRUeXBlLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC54LFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC55LFxuICAgICAgICBncmlkWCxcbiAgICAgICAgZ3JpZFksXG4gICAgICAgIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLngsIGdyaWRYKSxcbiAgICAgICAgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueSwgZ3JpZFkpLFxuICAgICAgICBnZXRSZXNpemVXaXRoU2lkZXNTYW1lTGVuZ3RoS2V5KGV2ZW50KSxcbiAgICAgICAgZ2V0UmVzaXplQ2VudGVyUG9pbnRLZXkoZXZlbnQpLFxuICAgICAgKTtcbiAgICAgIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0ZvckFsbChbZHJhZ2dpbmdFbGVtZW50XSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWF5YmVIYW5kbGVSZXNpemUgPSAoXG4gICAgcG9pbnRlckRvd25TdGF0ZTogUG9pbnRlckRvd25TdGF0ZSxcbiAgICBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsXG4gICk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKFxuICAgICAgdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgdGhpcy5zdGF0ZSxcbiAgICApO1xuICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgLy8gVE9ETzogcmVuYW1lIHRoaXMgc3RhdGUgZmllbGQgdG8gXCJpc1NjYWxpbmdcIiB0byBkaXN0aW5ndWlzaFxuICAgICAgLy8gaXQgZnJvbSB0aGUgZ2VuZXJpYyBcImlzUmVzaXppbmdcIiB3aGljaCBpbmNsdWRlcyBzY2FsaW5nIGFuZFxuICAgICAgLy8gcm90YXRpbmdcbiAgICAgIGlzUmVzaXppbmc6IHRyYW5zZm9ybUhhbmRsZVR5cGUgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJyb3RhdGlvblwiLFxuICAgICAgaXNSb3RhdGluZzogdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJyb3RhdGlvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG4gICAgY29uc3QgW3Jlc2l6ZVgsIHJlc2l6ZVldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgcG9pbnRlckNvb3Jkcy54IC0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0LngsXG4gICAgICBwb2ludGVyQ29vcmRzLnkgLSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQueSxcbiAgICAgIHRoaXMuc3RhdGUuZ3JpZFNpemUsXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICB0cmFuc2Zvcm1FbGVtZW50cyhcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZSxcbiAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50cyxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuYXJyb3dEaXJlY3Rpb24sXG4gICAgICAgIGdldFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlS2V5KGV2ZW50KSxcbiAgICAgICAgZ2V0UmVzaXplQ2VudGVyUG9pbnRLZXkoZXZlbnQpLFxuICAgICAgICBnZXRSZXNpemVXaXRoU2lkZXNTYW1lTGVuZ3RoS2V5KGV2ZW50KSxcbiAgICAgICAgcmVzaXplWCxcbiAgICAgICAgcmVzaXplWSxcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuY2VudGVyLngsXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmNlbnRlci55LFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhpcy5tYXliZVN1Z2dlc3RCaW5kaW5nRm9yQWxsKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKiogQHByaXZhdGUgdXNlIHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUgKi9cbiAgcHJpdmF0ZSBfb3BlbkNvbnRleHRNZW51ID0gKFxuICAgIHtcbiAgICAgIGxlZnQsXG4gICAgICB0b3AsXG4gICAgfToge1xuICAgICAgbGVmdDogbnVtYmVyO1xuICAgICAgdG9wOiBudW1iZXI7XG4gICAgfSxcbiAgICB0eXBlOiBcImNhbnZhc1wiIHwgXCJlbGVtZW50XCIsXG4gICkgPT4ge1xuICAgIGNvbnN0IG1heWJlR3JvdXBBY3Rpb24gPSBhY3Rpb25Hcm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5YmVVbmdyb3VwQWN0aW9uID0gYWN0aW9uVW5ncm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3QgbWF5YmVGbGlwSG9yaXpvbnRhbCA9IGFjdGlvbkZsaXBIb3Jpem9udGFsLmNvbnRleHRJdGVtUHJlZGljYXRlIShcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSxcbiAgICAgIHRoaXMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpLFxuICAgICk7XG5cbiAgICBjb25zdCBtYXliZUZsaXBWZXJ0aWNhbCA9IGFjdGlvbkZsaXBWZXJ0aWNhbC5jb250ZXh0SXRlbVByZWRpY2F0ZSEoXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksXG4gICAgICB0aGlzLmFjdGlvbk1hbmFnZXIuZ2V0QXBwU3RhdGUoKSxcbiAgICApO1xuXG4gICAgY29uc3Qgc2VwYXJhdG9yID0gXCJzZXBhcmF0b3JcIjtcblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQ29udGV4dE1lbnVPcHRpb25bXSA9IFtdO1xuICAgIGlmIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zLnB1c2goYWN0aW9uQ29weUFzUG5nKTtcbiAgICB9XG5cbiAgICBpZiAocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBvcHRpb25zLnB1c2goYWN0aW9uQ29weUFzU3ZnKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwiY2FudmFzXCIpIHtcbiAgICAgIGNvbnN0IHZpZXdNb2RlT3B0aW9ucyA9IFtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgdHlwZW9mIHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsXG4gICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZVplbk1vZGUsXG4gICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgIGFjdGlvblRvZ2dsZVZpZXdNb2RlLFxuICAgICAgICBhY3Rpb25Ub2dnbGVTdGF0cyxcbiAgICAgIF07XG5cbiAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICBvcHRpb25zOiB2aWV3TW9kZU9wdGlvbnMsXG4gICAgICAgIHRvcCxcbiAgICAgICAgbGVmdCxcbiAgICAgICAgYWN0aW9uTWFuYWdlcjogdGhpcy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICB0aGlzLmlzTW9iaWxlICYmXG4gICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlcykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbnRleHRJdGVtTGFiZWw6IFwibGFiZWxzLnBhc3RlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBzZXBhcmF0b3IsXG4gICAgICAgICAgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiZcbiAgICAgICAgICAgIGVsZW1lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIGFjdGlvbkNvcHlBc1BuZyxcbiAgICAgICAgICBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0ICYmXG4gICAgICAgICAgICBlbGVtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICBhY3Rpb25Db3B5QXNTdmcsXG4gICAgICAgICAgKChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkpICYmXG4gICAgICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgICAgYWN0aW9uU2VsZWN0QWxsLFxuICAgICAgICAgIHNlcGFyYXRvcixcbiAgICAgICAgICB0eXBlb2YgdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgIGFjdGlvblRvZ2dsZUdyaWRNb2RlLFxuICAgICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICBhY3Rpb25Ub2dnbGVaZW5Nb2RlLFxuICAgICAgICAgIHR5cGVvZiB0aGlzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgYWN0aW9uVG9nZ2xlVmlld01vZGUsXG4gICAgICAgICAgYWN0aW9uVG9nZ2xlU3RhdHMsXG4gICAgICAgIF0sXG4gICAgICAgIHRvcCxcbiAgICAgICAgbGVmdCxcbiAgICAgICAgYWN0aW9uTWFuYWdlcjogdGhpcy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCEsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgICBvcHRpb25zOiBbbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LCAuLi5vcHRpb25zXSxcbiAgICAgICAgdG9wLFxuICAgICAgICBsZWZ0LFxuICAgICAgICBhY3Rpb25NYW5hZ2VyOiB0aGlzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgIGFwcFN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIENvbnRleHRNZW51LnB1c2goe1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICB0aGlzLmlzTW9iaWxlICYmIGFjdGlvbkN1dCxcbiAgICAgICAgdGhpcy5pc01vYmlsZSAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIGFjdGlvbkNvcHksXG4gICAgICAgIHRoaXMuaXNNb2JpbGUgJiZcbiAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHtcbiAgICAgICAgICAgIG5hbWU6IFwicGFzdGVcIixcbiAgICAgICAgICAgIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGVzKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKG51bGwpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIixcbiAgICAgICAgICB9LFxuICAgICAgICB0aGlzLmlzTW9iaWxlICYmIHNlcGFyYXRvcixcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICBhY3Rpb25Db3B5U3R5bGVzLFxuICAgICAgICBhY3Rpb25QYXN0ZVN0eWxlcyxcbiAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICBtYXliZUdyb3VwQWN0aW9uICYmIGFjdGlvbkdyb3VwLFxuICAgICAgICBtYXliZVVuZ3JvdXBBY3Rpb24gJiYgYWN0aW9uVW5ncm91cCxcbiAgICAgICAgKG1heWJlR3JvdXBBY3Rpb24gfHwgbWF5YmVVbmdyb3VwQWN0aW9uKSAmJiBzZXBhcmF0b3IsXG4gICAgICAgIGFjdGlvbkFkZFRvTGlicmFyeSxcbiAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICBhY3Rpb25TZW5kQmFja3dhcmQsXG4gICAgICAgIGFjdGlvbkJyaW5nRm9yd2FyZCxcbiAgICAgICAgYWN0aW9uU2VuZFRvQmFjayxcbiAgICAgICAgYWN0aW9uQnJpbmdUb0Zyb250LFxuICAgICAgICBzZXBhcmF0b3IsXG4gICAgICAgIG1heWJlRmxpcEhvcml6b250YWwgJiYgYWN0aW9uRmxpcEhvcml6b250YWwsXG4gICAgICAgIG1heWJlRmxpcFZlcnRpY2FsICYmIGFjdGlvbkZsaXBWZXJ0aWNhbCxcbiAgICAgICAgKG1heWJlRmxpcEhvcml6b250YWwgfHwgbWF5YmVGbGlwVmVydGljYWwpICYmIHNlcGFyYXRvcixcbiAgICAgICAgYWN0aW9uRHVwbGljYXRlU2VsZWN0aW9uLFxuICAgICAgICBhY3Rpb25EZWxldGVTZWxlY3RlZCxcbiAgICAgIF0sXG4gICAgICB0b3AsXG4gICAgICBsZWZ0LFxuICAgICAgYWN0aW9uTWFuYWdlcjogdGhpcy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50ISxcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZVdoZWVsID0gd2l0aEJhdGNoZWRVcGRhdGVzKChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBkZWx0YVgsIGRlbHRhWSB9ID0gZXZlbnQ7XG4gICAgY29uc3QgeyBzZWxlY3RlZEVsZW1lbnRJZHMsIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzIH0gPSB0aGlzLnN0YXRlO1xuICAgIC8vIG5vdGUgdGhhdCBldmVudC5jdHJsS2V5IGlzIG5lY2Vzc2FyeSB0byBoYW5kbGUgcGluY2ggem9vbWluZ1xuICAgIGlmIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIGNvbnN0IHNpZ24gPSBNYXRoLnNpZ24oZGVsdGFZKTtcbiAgICAgIGNvbnN0IE1BWF9TVEVQID0gMTA7XG4gICAgICBsZXQgZGVsdGEgPSBNYXRoLmFicyhkZWx0YVkpO1xuICAgICAgaWYgKGRlbHRhID4gTUFYX1NURVApIHtcbiAgICAgICAgZGVsdGEgPSBNQVhfU1RFUDtcbiAgICAgIH1cbiAgICAgIGRlbHRhICo9IHNpZ247XG4gICAgICBpZiAoT2JqZWN0LmtleXMocHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfVxuXG4gICAgICBsZXQgbmV3Wm9vbSA9IHRoaXMuc3RhdGUuem9vbS52YWx1ZSAtIGRlbHRhIC8gMTAwO1xuICAgICAgLy8gaW5jcmVhc2Ugem9vbSBzdGVwcyB0aGUgbW9yZSB6b29tZWQtaW4gd2UgYXJlIChhcHBsaWVzIHRvID4xMDAlIG9ubHkpXG4gICAgICBuZXdab29tICs9IE1hdGgubG9nMTAoTWF0aC5tYXgoMSwgdGhpcy5zdGF0ZS56b29tLnZhbHVlKSkgKiAtc2lnbjtcbiAgICAgIC8vIHJvdW5kIHRvIG5lYXJlc3Qgc3RlcFxuICAgICAgbmV3Wm9vbSA9IE1hdGgucm91bmQobmV3Wm9vbSAqIFpPT01fU1RFUCAqIDEwMCkgLyAoWk9PTV9TVEVQICogMTAwKTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyB6b29tLCBvZmZzZXRMZWZ0LCBvZmZzZXRUb3AgfSkgPT4gKHtcbiAgICAgICAgem9vbTogZ2V0TmV3Wm9vbShcbiAgICAgICAgICBnZXROb3JtYWxpemVkWm9vbShuZXdab29tKSxcbiAgICAgICAgICB6b29tLFxuICAgICAgICAgIHsgbGVmdDogb2Zmc2V0TGVmdCwgdG9wOiBvZmZzZXRUb3AgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB4OiBjdXJzb3JYLFxuICAgICAgICAgICAgeTogY3Vyc29yWSxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczpcbiAgICAgICAgICBPYmplY3Qua2V5cyhzZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAhPT0gMFxuICAgICAgICAgICAgPyBzZWxlY3RlZEVsZW1lbnRJZHNcbiAgICAgICAgICAgIDogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHRoaXMucmVzZXRTaG91bGRDYWNoZUlnbm9yZVpvb21EZWJvdW5jZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzY3JvbGwgaG9yaXpvbnRhbGx5IHdoZW4gc2hpZnQgcHJlc3NlZFxuICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyB6b29tLCBzY3JvbGxYIH0pID0+ICh7XG4gICAgICAgIC8vIG9uIE1hYywgc2hpZnQrd2hlZWwgdGVuZHMgdG8gcmVzdWx0IGluIGRlbHRhWFxuICAgICAgICBzY3JvbGxYOiBzY3JvbGxYIC0gKGRlbHRhWSB8fCBkZWx0YVgpIC8gem9vbS52YWx1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKCh7IHpvb20sIHNjcm9sbFgsIHNjcm9sbFkgfSkgPT4gKHtcbiAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSBkZWx0YVggLyB6b29tLnZhbHVlLFxuICAgICAgc2Nyb2xsWTogc2Nyb2xsWSAtIGRlbHRhWSAvIHpvb20udmFsdWUsXG4gICAgfSkpO1xuICB9KTtcblxuICBwcml2YXRlIGdldFRleHRXeXNpd3lnU25hcHBlZFRvQ2VudGVyUG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gICAgc2NhbGU6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudENsaWNrZWRJbnNpZGUgPSBnZXRFbGVtZW50Q29udGFpbmluZ1Bvc2l0aW9uKFxuICAgICAgdGhpcy5zY2VuZVxuICAgICAgICAuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gIWlzVGV4dEVsZW1lbnQoZWxlbWVudCkpLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudENsaWNrZWRJbnNpZGUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJYID1cbiAgICAgICAgZWxlbWVudENsaWNrZWRJbnNpZGUueCArIGVsZW1lbnRDbGlja2VkSW5zaWRlLndpZHRoIC8gMjtcbiAgICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJZID1cbiAgICAgICAgZWxlbWVudENsaWNrZWRJbnNpZGUueSArIGVsZW1lbnRDbGlja2VkSW5zaWRlLmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBkaXN0YW5jZVRvQ2VudGVyID0gTWF0aC5oeXBvdChcbiAgICAgICAgeCAtIGVsZW1lbnRDZW50ZXJYLFxuICAgICAgICB5IC0gZWxlbWVudENlbnRlclksXG4gICAgICApO1xuICAgICAgY29uc3QgaXNTbmFwcGVkVG9DZW50ZXIgPVxuICAgICAgICBkaXN0YW5jZVRvQ2VudGVyIDwgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQ7XG4gICAgICBpZiAoaXNTbmFwcGVkVG9DZW50ZXIpIHtcbiAgICAgICAgY29uc3QgeyB4OiB2aWV3cG9ydFgsIHk6IHZpZXdwb3J0WSB9ID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKFxuICAgICAgICAgIHsgc2NlbmVYOiBlbGVtZW50Q2VudGVyWCwgc2NlbmVZOiBlbGVtZW50Q2VudGVyWSB9LFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyB2aWV3cG9ydFgsIHZpZXdwb3J0WSwgZWxlbWVudENlbnRlclgsIGVsZW1lbnRDZW50ZXJZIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlUG9pbnRlciA9ICh4OiBudW1iZXIsIHk6IG51bWJlciwgYnV0dG9uOiBcInVwXCIgfCBcImRvd25cIikgPT4ge1xuICAgIGlmICgheCB8fCAheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKFxuICAgICAgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0sXG4gICAgICB0aGlzLnN0YXRlLFxuICAgICk7XG5cbiAgICBpZiAoaXNOYU4ocG9pbnRlci54KSB8fCBpc05hTihwb2ludGVyLnkpKSB7XG4gICAgICAvLyBzb21ldGltZXMgdGhlIHBvaW50ZXIgZ29lcyBvZmYgc2NyZWVuXG4gICAgfVxuXG4gICAgdGhpcy5wcm9wcy5vblBvaW50ZXJVcGRhdGU/Lih7XG4gICAgICBwb2ludGVyLFxuICAgICAgYnV0dG9uLFxuICAgICAgcG9pbnRlcnNNYXA6IGdlc3R1cmUucG9pbnRlcnMsXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICBpZiAoIXRoaXMudW5tb3VudGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZSB9KTtcbiAgICB9XG4gIH0sIDMwMCk7XG5cbiAgcHJpdmF0ZSB1cGRhdGVET01SZWN0ID0gKGNiPzogKCkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgdG9wOiBvZmZzZXRUb3AsXG4gICAgICB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGg6IGN1cnJlbnRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjdXJyZW50SGVpZ2h0LFxuICAgICAgICBvZmZzZXRUb3A6IGN1cnJlbnRPZmZzZXRUb3AsXG4gICAgICAgIG9mZnNldExlZnQ6IGN1cnJlbnRPZmZzZXRMZWZ0LFxuICAgICAgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgd2lkdGggPT09IGN1cnJlbnRXaWR0aCAmJlxuICAgICAgICBoZWlnaHQgPT09IGN1cnJlbnRIZWlnaHQgJiZcbiAgICAgICAgb2Zmc2V0TGVmdCA9PT0gY3VycmVudE9mZnNldExlZnQgJiZcbiAgICAgICAgb2Zmc2V0VG9wID09PSBjdXJyZW50T2Zmc2V0VG9wXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgb2Zmc2V0TGVmdCxcbiAgICAgICAgICBvZmZzZXRUb3AsXG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBjYiAmJiBjYigpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgcHVibGljIHJlZnJlc2ggPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IC4uLnRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0Q2FudmFzT2Zmc2V0cygpOiBQaWNrPEFwcFN0YXRlLCBcIm9mZnNldFRvcFwiIHwgXCJvZmZzZXRMZWZ0XCI+IHtcbiAgICBpZiAodGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICBjb25zdCBleGNhbGlkcmF3Q29udGFpbmVyID0gdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldExlZnQ6IGxlZnQsXG4gICAgICAgIG9mZnNldFRvcDogdG9wLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldExlZnQ6IDAsXG4gICAgICBvZmZzZXRUb3A6IDAsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlTGFuZ3VhZ2UoKSB7XG4gICAgY29uc3QgY3VycmVudExhbmcgPVxuICAgICAgbGFuZ3VhZ2VzLmZpbmQoKGxhbmcpID0+IGxhbmcuY29kZSA9PT0gdGhpcy5wcm9wcy5sYW5nQ29kZSkgfHxcbiAgICAgIGRlZmF1bHRMYW5nO1xuICAgIGF3YWl0IHNldExhbmd1YWdlKGN1cnJlbnRMYW5nKTtcbiAgICB0aGlzLnNldEFwcFN0YXRlKHt9KTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVEVTVCBIT09LU1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBoOiB7XG4gICAgICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgICAgIHN0YXRlOiBBcHBTdGF0ZTtcbiAgICAgIHNldFN0YXRlOiBSZWFjdC5Db21wb25lbnQ8YW55LCBBcHBTdGF0ZT5bXCJzZXRTdGF0ZVwiXTtcbiAgICAgIGFwcDogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+O1xuICAgICAgaGlzdG9yeTogSGlzdG9yeTtcbiAgICB9O1xuICB9XG59XG5cbmlmIChcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5URVNUIHx8XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuREVWRUxPUE1FTlRcbikge1xuICB3aW5kb3cuaCA9IHdpbmRvdy5oIHx8ICh7fSBhcyBXaW5kb3dbXCJoXCJdKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cuaCwge1xuICAgIGVsZW1lbnRzOiB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcC5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgICAgIH0sXG4gICAgICBzZXQoZWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhlbGVtZW50cyk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xufVxuZXhwb3J0IGRlZmF1bHQgQXBwO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../components/App.tsx\n");
1637
1637
 
1638
1638
  /***/ }),
1639
1639
 
@@ -2128,7 +2128,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2128
2128
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2129
2129
 
2130
2130
  "use strict";
2131
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"AllowedExcalidrawElementTypes\": () => (/* binding */ AllowedExcalidrawElementTypes),\n/* harmony export */ \"restoreElements\": () => (/* binding */ restoreElements),\n/* harmony export */ \"restoreAppState\": () => (/* binding */ restoreAppState),\n/* harmony export */ \"restore\": () => (/* binding */ restore)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst AllowedExcalidrawElementTypes = {\r\n selection: true,\r\n text: true,\r\n rectangle: true,\r\n diamond: true,\r\n ellipse: true,\r\n line: true,\r\n arrow: true,\r\n freedraw: true,\r\n};\r\nconst getFontFamilyByName = (fontFamilyName) => {\r\n if (Object.keys(_constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY).includes(fontFamilyName)) {\r\n return _constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY[fontFamilyName];\r\n }\r\n return _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_FONT_FAMILY;\r\n};\r\nconst restoreElementWithProperties = (element, extra) => {\r\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;\r\n const base = {\r\n type: extra.type || element.type,\r\n // all elements must have version > 0 so getSceneVersion() will pick up\r\n // newly added elements\r\n version: element.version || 1,\r\n versionNonce: (_a = element.versionNonce) !== null && _a !== void 0 ? _a : 0,\r\n isDeleted: (_b = element.isDeleted) !== null && _b !== void 0 ? _b : false,\r\n id: element.id || (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(),\r\n fillStyle: element.fillStyle || \"hachure\",\r\n strokeWidth: element.strokeWidth || 1,\r\n strokeStyle: (_c = element.strokeStyle) !== null && _c !== void 0 ? _c : \"solid\",\r\n roughness: (_d = element.roughness) !== null && _d !== void 0 ? _d : 1,\r\n opacity: element.opacity == null ? 100 : element.opacity,\r\n angle: element.angle || 0,\r\n x: (_f = (_e = extra.x) !== null && _e !== void 0 ? _e : element.x) !== null && _f !== void 0 ? _f : 0,\r\n y: (_h = (_g = extra.y) !== null && _g !== void 0 ? _g : element.y) !== null && _h !== void 0 ? _h : 0,\r\n strokeColor: element.strokeColor,\r\n backgroundColor: element.backgroundColor,\r\n width: element.width || 0,\r\n height: element.height || 0,\r\n seed: (_j = element.seed) !== null && _j !== void 0 ? _j : 1,\r\n groupIds: (_k = element.groupIds) !== null && _k !== void 0 ? _k : [],\r\n strokeSharpness: (_l = element.strokeSharpness) !== null && _l !== void 0 ? _l : ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isLinearElementType)(element.type) ? \"round\" : \"sharp\"),\r\n boundElementIds: (_m = element.boundElementIds) !== null && _m !== void 0 ? _m : [],\r\n };\r\n return Object.assign(Object.assign(Object.assign({}, base), (0,_element__WEBPACK_IMPORTED_MODULE_0__.getNormalizedDimensions)(base)), extra);\r\n};\r\nconst restoreElement = (element) => {\r\n var _a;\r\n switch (element.type) {\r\n case \"text\":\r\n let fontSize = element.fontSize;\r\n let fontFamily = element.fontFamily;\r\n if (\"font\" in element) {\r\n const [fontPx, _fontFamily] = element.font.split(\" \");\r\n fontSize = parseInt(fontPx, 10);\r\n fontFamily = getFontFamilyByName(_fontFamily);\r\n }\r\n return restoreElementWithProperties(element, {\r\n fontSize,\r\n fontFamily,\r\n text: (_a = element.text) !== null && _a !== void 0 ? _a : \"\",\r\n baseline: element.baseline,\r\n textAlign: element.textAlign || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_TEXT_ALIGN,\r\n verticalAlign: element.verticalAlign || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_VERTICAL_ALIGN,\r\n });\r\n case \"freedraw\": {\r\n return restoreElementWithProperties(element, {\r\n points: element.points,\r\n lastCommittedPoint: null,\r\n simulatePressure: element.simulatePressure,\r\n pressures: element.pressures,\r\n });\r\n }\r\n case \"line\":\r\n // @ts-ignore LEGACY type\r\n // eslint-disable-next-line no-fallthrough\r\n case \"draw\":\r\n case \"arrow\": {\r\n const { startArrowhead = null, endArrowhead = element.type === \"arrow\" ? \"arrow\" : null, } = element;\r\n let x = element.x;\r\n let y = element.y;\r\n let points = // migrate old arrow model to new one\r\n !Array.isArray(element.points) || element.points.length < 2\r\n ? [\r\n [0, 0],\r\n [element.width, element.height],\r\n ]\r\n : element.points;\r\n if (points[0][0] !== 0 || points[0][1] !== 0) {\r\n ({ points, x, y } = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_5__.LinearElementEditor.getNormalizedPoints(element));\r\n }\r\n return restoreElementWithProperties(element, {\r\n type: element.type === \"draw\"\r\n ? \"line\"\r\n : element.type,\r\n startBinding: element.startBinding,\r\n endBinding: element.endBinding,\r\n lastCommittedPoint: null,\r\n startArrowhead,\r\n endArrowhead,\r\n points,\r\n x,\r\n y,\r\n });\r\n }\r\n // generic elements\r\n case \"ellipse\":\r\n return restoreElementWithProperties(element, {});\r\n case \"rectangle\":\r\n return restoreElementWithProperties(element, {});\r\n case \"diamond\":\r\n return restoreElementWithProperties(element, {});\r\n // Don't use default case so as to catch a missing an element type case.\r\n // We also don't want to throw, but instead return void so we filter\r\n // out these unsupported elements from the restored array.\r\n }\r\n};\r\nconst restoreElements = (elements, \r\n/** NOTE doesn't serve for reconciliation */\r\nlocalElements) => {\r\n const localElementsMap = localElements ? (0,_element__WEBPACK_IMPORTED_MODULE_0__.getElementMap)(localElements) : null;\r\n return (elements || []).reduce((elements, element) => {\r\n // filtering out selection, which is legacy, no longer kept in elements,\r\n // and causing issues if retained\r\n if (element.type !== \"selection\" && !(0,_element__WEBPACK_IMPORTED_MODULE_0__.isInvisiblySmallElement)(element)) {\r\n let migratedElement = restoreElement(element);\r\n if (migratedElement) {\r\n const localElement = localElementsMap === null || localElementsMap === void 0 ? void 0 : localElementsMap[element.id];\r\n if (localElement && localElement.version > migratedElement.version) {\r\n migratedElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_6__.bumpVersion)(migratedElement, localElement.version);\r\n }\r\n elements.push(migratedElement);\r\n }\r\n }\r\n return elements;\r\n }, []);\r\n};\r\nconst restoreAppState = (appState, localAppState) => {\r\n appState = appState || {};\r\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_4__.getDefaultAppState)();\r\n const nextAppState = {};\r\n for (const [key, defaultValue] of Object.entries(defaultAppState)) {\r\n const suppliedValue = appState[key];\r\n const localValue = localAppState ? localAppState[key] : undefined;\r\n nextAppState[key] =\r\n suppliedValue !== undefined\r\n ? suppliedValue\r\n : localValue !== undefined\r\n ? localValue\r\n : defaultValue;\r\n }\r\n return Object.assign(Object.assign({}, nextAppState), { elementType: AllowedExcalidrawElementTypes[nextAppState.elementType]\r\n ? nextAppState.elementType\r\n : \"selection\", \r\n // Migrates from previous version where appState.zoom was a number\r\n zoom: typeof appState.zoom === \"number\"\r\n ? {\r\n value: appState.zoom,\r\n translation: defaultAppState.zoom.translation,\r\n }\r\n : appState.zoom || defaultAppState.zoom });\r\n};\r\nconst restore = (data, \r\n/**\r\n * Local AppState (`this.state` or initial state from localStorage) so that we\r\n * don't overwrite local state with default values (when values not\r\n * explicitly specified).\r\n * Supply `null` if you can't get access to it.\r\n */\r\nlocalAppState, localElements) => {\r\n return {\r\n elements: restoreElements(data === null || data === void 0 ? void 0 : data.elements, localElements),\r\n appState: restoreAppState(data === null || data === void 0 ? void 0 : data.appState, localAppState || null),\r\n };\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QzNDLFdBQVcsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVc7YUFDOUM7WUFDSCxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxlQUFlLENBQUMsSUFBSSxJQUMzQztBQUNKLENBQUMsQ0FBQztBQUVLLE1BQU0sT0FBTyxHQUFHLENBQ3JCLElBQThCO0FBQzlCOzs7OztHQUtHO0FBQ0gsYUFBbUQsRUFDbkQsYUFBOEQsRUFDM0MsRUFBRTtJQUNyQixPQUFPO1FBQ0wsUUFBUSxFQUFFLGVBQWUsQ0FBQyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQztRQUN4RCxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxRQUFRLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQztLQUNqRSxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2RhdGEvcmVzdG9yZS50cz84NzIwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3U2VsZWN0aW9uRWxlbWVudCxcbiAgRm9udEZhbWlseVZhbHVlcyxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBOb3JtYWxpemVkWm9vbVZhbHVlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJbXBvcnRlZERhdGFTdGF0ZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBnZXRFbGVtZW50TWFwLFxuICBnZXROb3JtYWxpemVkRGltZW5zaW9ucyxcbiAgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQsXG59IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgeyBpc0xpbmVhckVsZW1lbnRUeXBlIH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgcmFuZG9tSWQgfSBmcm9tIFwiLi4vcmFuZG9tXCI7XG5pbXBvcnQge1xuICBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICBERUZBVUxUX1RFWFRfQUxJR04sXG4gIERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gIEZPTlRfRkFNSUxZLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBidW1wVmVyc2lvbiB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcblxudHlwZSBSZXN0b3JlZEFwcFN0YXRlID0gT21pdDxcbiAgQXBwU3RhdGUsXG4gIFwib2Zmc2V0VG9wXCIgfCBcIm9mZnNldExlZnRcIiB8IFwid2lkdGhcIiB8IFwiaGVpZ2h0XCJcbj47XG5cbmV4cG9ydCBjb25zdCBBbGxvd2VkRXhjYWxpZHJhd0VsZW1lbnRUeXBlczogUmVjb3JkPFxuICBFeGNhbGlkcmF3RWxlbWVudFtcInR5cGVcIl0sXG4gIHRydWVcbj4gPSB7XG4gIHNlbGVjdGlvbjogdHJ1ZSxcbiAgdGV4dDogdHJ1ZSxcbiAgcmVjdGFuZ2xlOiB0cnVlLFxuICBkaWFtb25kOiB0cnVlLFxuICBlbGxpcHNlOiB0cnVlLFxuICBsaW5lOiB0cnVlLFxuICBhcnJvdzogdHJ1ZSxcbiAgZnJlZWRyYXc6IHRydWUsXG59O1xuXG5leHBvcnQgdHlwZSBSZXN0b3JlZERhdGFTdGF0ZSA9IHtcbiAgZWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W107XG4gIGFwcFN0YXRlOiBSZXN0b3JlZEFwcFN0YXRlO1xufTtcblxuY29uc3QgZ2V0Rm9udEZhbWlseUJ5TmFtZSA9IChmb250RmFtaWx5TmFtZTogc3RyaW5nKTogRm9udEZhbWlseVZhbHVlcyA9PiB7XG4gIGlmIChPYmplY3Qua2V5cyhGT05UX0ZBTUlMWSkuaW5jbHVkZXMoZm9udEZhbWlseU5hbWUpKSB7XG4gICAgcmV0dXJuIEZPTlRfRkFNSUxZW1xuICAgICAgZm9udEZhbWlseU5hbWUgYXMga2V5b2YgdHlwZW9mIEZPTlRfRkFNSUxZXG4gICAgXSBhcyBGb250RmFtaWx5VmFsdWVzO1xuICB9XG4gIHJldHVybiBERUZBVUxUX0ZPTlRfRkFNSUxZO1xufTtcblxuY29uc3QgcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyA9IDxcbiAgVCBleHRlbmRzIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBLIGV4dGVuZHMga2V5b2YgT21pdDxcbiAgICBSZXF1aXJlZDxUPixcbiAgICBFeGNsdWRlPGtleW9mIEV4Y2FsaWRyYXdFbGVtZW50LCBcInR5cGVcIiB8IFwieFwiIHwgXCJ5XCI+XG4gID5cbj4oXG4gIGVsZW1lbnQ6IFJlcXVpcmVkPFQ+LFxuICBleHRyYTogUGljazxULCBLPixcbik6IFQgPT4ge1xuICBjb25zdCBiYXNlOiBQaWNrPFQsIGtleW9mIEV4Y2FsaWRyYXdFbGVtZW50PiA9IHtcbiAgICB0eXBlOiAoZXh0cmEgYXMgUGFydGlhbDxUPikudHlwZSB8fCBlbGVtZW50LnR5cGUsXG4gICAgLy8gYWxsIGVsZW1lbnRzIG11c3QgaGF2ZSB2ZXJzaW9uID4gMCBzbyBnZXRTY2VuZVZlcnNpb24oKSB3aWxsIHBpY2sgdXBcbiAgICAvLyBuZXdseSBhZGRlZCBlbGVtZW50c1xuICAgIHZlcnNpb246IGVsZW1lbnQudmVyc2lvbiB8fCAxLFxuICAgIHZlcnNpb25Ob25jZTogZWxlbWVudC52ZXJzaW9uTm9uY2UgPz8gMCxcbiAgICBpc0RlbGV0ZWQ6IGVsZW1lbnQuaXNEZWxldGVkID8/IGZhbHNlLFxuICAgIGlkOiBlbGVtZW50LmlkIHx8IHJhbmRvbUlkKCksXG4gICAgZmlsbFN0eWxlOiBlbGVtZW50LmZpbGxTdHlsZSB8fCBcImhhY2h1cmVcIixcbiAgICBzdHJva2VXaWR0aDogZWxlbWVudC5zdHJva2VXaWR0aCB8fCAxLFxuICAgIHN0cm9rZVN0eWxlOiBlbGVtZW50LnN0cm9rZVN0eWxlID8/IFwic29saWRcIixcbiAgICByb3VnaG5lc3M6IGVsZW1lbnQucm91Z2huZXNzID8/IDEsXG4gICAgb3BhY2l0eTogZWxlbWVudC5vcGFjaXR5ID09IG51bGwgPyAxMDAgOiBlbGVtZW50Lm9wYWNpdHksXG4gICAgYW5nbGU6IGVsZW1lbnQuYW5nbGUgfHwgMCxcbiAgICB4OiAoZXh0cmEgYXMgUGFydGlhbDxUPikueCA/PyBlbGVtZW50LnggPz8gMCxcbiAgICB5OiAoZXh0cmEgYXMgUGFydGlhbDxUPikueSA/PyBlbGVtZW50LnkgPz8gMCxcbiAgICBzdHJva2VDb2xvcjogZWxlbWVudC5zdHJva2VDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IGVsZW1lbnQuYmFja2dyb3VuZENvbG9yLFxuICAgIHdpZHRoOiBlbGVtZW50LndpZHRoIHx8IDAsXG4gICAgaGVpZ2h0OiBlbGVtZW50LmhlaWdodCB8fCAwLFxuICAgIHNlZWQ6IGVsZW1lbnQuc2VlZCA/PyAxLFxuICAgIGdyb3VwSWRzOiBlbGVtZW50Lmdyb3VwSWRzID8/IFtdLFxuICAgIHN0cm9rZVNoYXJwbmVzczpcbiAgICAgIGVsZW1lbnQuc3Ryb2tlU2hhcnBuZXNzID8/XG4gICAgICAoaXNMaW5lYXJFbGVtZW50VHlwZShlbGVtZW50LnR5cGUpID8gXCJyb3VuZFwiIDogXCJzaGFycFwiKSxcbiAgICBib3VuZEVsZW1lbnRJZHM6IGVsZW1lbnQuYm91bmRFbGVtZW50SWRzID8/IFtdLFxuICB9O1xuXG4gIHJldHVybiAoe1xuICAgIC4uLmJhc2UsXG4gICAgLi4uZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMoYmFzZSksXG4gICAgLi4uZXh0cmEsXG4gIH0gYXMgdW5rbm93bikgYXMgVDtcbn07XG5cbmNvbnN0IHJlc3RvcmVFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNsdWRlPEV4Y2FsaWRyYXdFbGVtZW50LCBFeGNhbGlkcmF3U2VsZWN0aW9uRWxlbWVudD4sXG4pOiB0eXBlb2YgZWxlbWVudCA9PiB7XG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInRleHRcIjpcbiAgICAgIGxldCBmb250U2l6ZSA9IGVsZW1lbnQuZm9udFNpemU7XG4gICAgICBsZXQgZm9udEZhbWlseSA9IGVsZW1lbnQuZm9udEZhbWlseTtcbiAgICAgIGlmIChcImZvbnRcIiBpbiBlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IFtmb250UHgsIF9mb250RmFtaWx5XTogW1xuICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICBzdHJpbmcsXG4gICAgICAgIF0gPSAoZWxlbWVudCBhcyBhbnkpLmZvbnQuc3BsaXQoXCIgXCIpO1xuICAgICAgICBmb250U2l6ZSA9IHBhcnNlSW50KGZvbnRQeCwgMTApO1xuICAgICAgICBmb250RmFtaWx5ID0gZ2V0Rm9udEZhbWlseUJ5TmFtZShfZm9udEZhbWlseSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7XG4gICAgICAgIGZvbnRTaXplLFxuICAgICAgICBmb250RmFtaWx5LFxuICAgICAgICB0ZXh0OiBlbGVtZW50LnRleHQgPz8gXCJcIixcbiAgICAgICAgYmFzZWxpbmU6IGVsZW1lbnQuYmFzZWxpbmUsXG4gICAgICAgIHRleHRBbGlnbjogZWxlbWVudC50ZXh0QWxpZ24gfHwgREVGQVVMVF9URVhUX0FMSUdOLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiBlbGVtZW50LnZlcnRpY2FsQWxpZ24gfHwgREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgICAgIH0pO1xuICAgIGNhc2UgXCJmcmVlZHJhd1wiOiB7XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7XG4gICAgICAgIHBvaW50czogZWxlbWVudC5wb2ludHMsXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgICAgICAgc2ltdWxhdGVQcmVzc3VyZTogZWxlbWVudC5zaW11bGF0ZVByZXNzdXJlLFxuICAgICAgICBwcmVzc3VyZXM6IGVsZW1lbnQucHJlc3N1cmVzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgLy8gQHRzLWlnbm9yZSBMRUdBQ1kgdHlwZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIGNhc2UgXCJkcmF3XCI6XG4gICAgY2FzZSBcImFycm93XCI6IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3RhcnRBcnJvd2hlYWQgPSBudWxsLFxuICAgICAgICBlbmRBcnJvd2hlYWQgPSBlbGVtZW50LnR5cGUgPT09IFwiYXJyb3dcIiA/IFwiYXJyb3dcIiA6IG51bGwsXG4gICAgICB9ID0gZWxlbWVudDtcblxuICAgICAgbGV0IHggPSBlbGVtZW50Lng7XG4gICAgICBsZXQgeSA9IGVsZW1lbnQueTtcbiAgICAgIGxldCBwb2ludHMgPSAvLyBtaWdyYXRlIG9sZCBhcnJvdyBtb2RlbCB0byBuZXcgb25lXG4gICAgICAgICFBcnJheS5pc0FycmF5KGVsZW1lbnQucG9pbnRzKSB8fCBlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIFswLCAwXSxcbiAgICAgICAgICAgICAgW2VsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0XSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IGVsZW1lbnQucG9pbnRzO1xuXG4gICAgICBpZiAocG9pbnRzWzBdWzBdICE9PSAwIHx8IHBvaW50c1swXVsxXSAhPT0gMCkge1xuICAgICAgICAoeyBwb2ludHMsIHgsIHkgfSA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Tm9ybWFsaXplZFBvaW50cyhlbGVtZW50KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN0b3JlRWxlbWVudFdpdGhQcm9wZXJ0aWVzKGVsZW1lbnQsIHtcbiAgICAgICAgdHlwZTpcbiAgICAgICAgICAoZWxlbWVudC50eXBlIGFzIEV4Y2FsaWRyYXdFbGVtZW50W1widHlwZVwiXSB8IFwiZHJhd1wiKSA9PT0gXCJkcmF3XCJcbiAgICAgICAgICAgID8gXCJsaW5lXCJcbiAgICAgICAgICAgIDogZWxlbWVudC50eXBlLFxuICAgICAgICBzdGFydEJpbmRpbmc6IGVsZW1lbnQuc3RhcnRCaW5kaW5nLFxuICAgICAgICBlbmRCaW5kaW5nOiBlbGVtZW50LmVuZEJpbmRpbmcsXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgICAgICAgc3RhcnRBcnJvd2hlYWQsXG4gICAgICAgIGVuZEFycm93aGVhZCxcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGdlbmVyaWMgZWxlbWVudHNcbiAgICBjYXNlIFwiZWxsaXBzZVwiOlxuICAgICAgcmV0dXJuIHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge30pO1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICAgIHJldHVybiByZXN0b3JlRWxlbWVudFdpdGhQcm9wZXJ0aWVzKGVsZW1lbnQsIHt9KTtcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgICAgcmV0dXJuIHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge30pO1xuXG4gICAgLy8gRG9uJ3QgdXNlIGRlZmF1bHQgY2FzZSBzbyBhcyB0byBjYXRjaCBhIG1pc3NpbmcgYW4gZWxlbWVudCB0eXBlIGNhc2UuXG4gICAgLy8gV2UgYWxzbyBkb24ndCB3YW50IHRvIHRocm93LCBidXQgaW5zdGVhZCByZXR1cm4gdm9pZCBzbyB3ZSBmaWx0ZXJcbiAgICAvLyBvdXQgdGhlc2UgdW5zdXBwb3J0ZWQgZWxlbWVudHMgZnJvbSB0aGUgcmVzdG9yZWQgYXJyYXkuXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZXN0b3JlRWxlbWVudHMgPSAoXG4gIGVsZW1lbnRzOiBJbXBvcnRlZERhdGFTdGF0ZVtcImVsZW1lbnRzXCJdLFxuICAvKiogTk9URSBkb2Vzbid0IHNlcnZlIGZvciByZWNvbmNpbGlhdGlvbiAqL1xuICBsb2NhbEVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IEV4Y2FsaWRyYXdFbGVtZW50W10gPT4ge1xuICBjb25zdCBsb2NhbEVsZW1lbnRzTWFwID0gbG9jYWxFbGVtZW50cyA/IGdldEVsZW1lbnRNYXAobG9jYWxFbGVtZW50cykgOiBudWxsO1xuICByZXR1cm4gKGVsZW1lbnRzIHx8IFtdKS5yZWR1Y2UoKGVsZW1lbnRzLCBlbGVtZW50KSA9PiB7XG4gICAgLy8gZmlsdGVyaW5nIG91dCBzZWxlY3Rpb24sIHdoaWNoIGlzIGxlZ2FjeSwgbm8gbG9uZ2VyIGtlcHQgaW4gZWxlbWVudHMsXG4gICAgLy8gYW5kIGNhdXNpbmcgaXNzdWVzIGlmIHJldGFpbmVkXG4gICAgaWYgKGVsZW1lbnQudHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJiAhaXNJbnZpc2libHlTbWFsbEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIGxldCBtaWdyYXRlZEVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50ID0gcmVzdG9yZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAobWlncmF0ZWRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGxvY2FsRWxlbWVudCA9IGxvY2FsRWxlbWVudHNNYXA/LltlbGVtZW50LmlkXTtcbiAgICAgICAgaWYgKGxvY2FsRWxlbWVudCAmJiBsb2NhbEVsZW1lbnQudmVyc2lvbiA+IG1pZ3JhdGVkRWxlbWVudC52ZXJzaW9uKSB7XG4gICAgICAgICAgbWlncmF0ZWRFbGVtZW50ID0gYnVtcFZlcnNpb24obWlncmF0ZWRFbGVtZW50LCBsb2NhbEVsZW1lbnQudmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMucHVzaChtaWdyYXRlZEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH0sIFtdIGFzIEV4Y2FsaWRyYXdFbGVtZW50W10pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc3RvcmVBcHBTdGF0ZSA9IChcbiAgYXBwU3RhdGU6IEltcG9ydGVkRGF0YVN0YXRlW1wiYXBwU3RhdGVcIl0sXG4gIGxvY2FsQXBwU3RhdGU6IFBhcnRpYWw8QXBwU3RhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IFJlc3RvcmVkQXBwU3RhdGUgPT4ge1xuICBhcHBTdGF0ZSA9IGFwcFN0YXRlIHx8IHt9O1xuXG4gIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuICBjb25zdCBuZXh0QXBwU3RhdGUgPSB7fSBhcyB0eXBlb2YgZGVmYXVsdEFwcFN0YXRlO1xuXG4gIGZvciAoY29uc3QgW2tleSwgZGVmYXVsdFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZWZhdWx0QXBwU3RhdGUpIGFzIFtcbiAgICBrZXlvZiB0eXBlb2YgZGVmYXVsdEFwcFN0YXRlLFxuICAgIGFueSxcbiAgXVtdKSB7XG4gICAgY29uc3Qgc3VwcGxpZWRWYWx1ZSA9IGFwcFN0YXRlW2tleV07XG4gICAgY29uc3QgbG9jYWxWYWx1ZSA9IGxvY2FsQXBwU3RhdGUgPyBsb2NhbEFwcFN0YXRlW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgKG5leHRBcHBTdGF0ZSBhcyBhbnkpW2tleV0gPVxuICAgICAgc3VwcGxpZWRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gc3VwcGxpZWRWYWx1ZVxuICAgICAgICA6IGxvY2FsVmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGxvY2FsVmFsdWVcbiAgICAgICAgOiBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLm5leHRBcHBTdGF0ZSxcbiAgICBlbGVtZW50VHlwZTogQWxsb3dlZEV4Y2FsaWRyYXdFbGVtZW50VHlwZXNbbmV4dEFwcFN0YXRlLmVsZW1lbnRUeXBlXVxuICAgICAgPyBuZXh0QXBwU3RhdGUuZWxlbWVudFR5cGVcbiAgICAgIDogXCJzZWxlY3Rpb25cIixcbiAgICAvLyBNaWdyYXRlcyBmcm9tIHByZXZpb3VzIHZlcnNpb24gd2hlcmUgYXBwU3RhdGUuem9vbSB3YXMgYSBudW1iZXJcbiAgICB6b29tOlxuICAgICAgdHlwZW9mIGFwcFN0YXRlLnpvb20gPT09IFwibnVtYmVyXCJcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB2YWx1ZTogYXBwU3RhdGUuem9vbSBhcyBOb3JtYWxpemVkWm9vbVZhbHVlLFxuICAgICAgICAgICAgdHJhbnNsYXRpb246IGRlZmF1bHRBcHBTdGF0ZS56b29tLnRyYW5zbGF0aW9uLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBhcHBTdGF0ZS56b29tIHx8IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc3RvcmUgPSAoXG4gIGRhdGE6IEltcG9ydGVkRGF0YVN0YXRlIHwgbnVsbCxcbiAgLyoqXG4gICAqIExvY2FsIEFwcFN0YXRlIChgdGhpcy5zdGF0ZWAgb3IgaW5pdGlhbCBzdGF0ZSBmcm9tIGxvY2FsU3RvcmFnZSkgc28gdGhhdCB3ZVxuICAgKiBkb24ndCBvdmVyd3JpdGUgbG9jYWwgc3RhdGUgd2l0aCBkZWZhdWx0IHZhbHVlcyAod2hlbiB2YWx1ZXMgbm90XG4gICAqIGV4cGxpY2l0bHkgc3BlY2lmaWVkKS5cbiAgICogU3VwcGx5IGBudWxsYCBpZiB5b3UgY2FuJ3QgZ2V0IGFjY2VzcyB0byBpdC5cbiAgICovXG4gIGxvY2FsQXBwU3RhdGU6IFBhcnRpYWw8QXBwU3RhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbG9jYWxFbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBSZXN0b3JlZERhdGFTdGF0ZSA9PiB7XG4gIHJldHVybiB7XG4gICAgZWxlbWVudHM6IHJlc3RvcmVFbGVtZW50cyhkYXRhPy5lbGVtZW50cywgbG9jYWxFbGVtZW50cyksXG4gICAgYXBwU3RhdGU6IHJlc3RvcmVBcHBTdGF0ZShkYXRhPy5hcHBTdGF0ZSwgbG9jYWxBcHBTdGF0ZSB8fCBudWxsKSxcbiAgfTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../data/restore.ts\n");
2131
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"AllowedExcalidrawElementTypes\": () => (/* binding */ AllowedExcalidrawElementTypes),\n/* harmony export */ \"restoreElements\": () => (/* binding */ restoreElements),\n/* harmony export */ \"restoreAppState\": () => (/* binding */ restoreAppState),\n/* harmony export */ \"restore\": () => (/* binding */ restore)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst AllowedExcalidrawElementTypes = {\r\n selection: true,\r\n text: true,\r\n rectangle: true,\r\n diamond: true,\r\n ellipse: true,\r\n line: true,\r\n arrow: true,\r\n freedraw: true,\r\n};\r\nconst getFontFamilyByName = (fontFamilyName) => {\r\n if (Object.keys(_constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY).includes(fontFamilyName)) {\r\n return _constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY[fontFamilyName];\r\n }\r\n return _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_FONT_FAMILY;\r\n};\r\nconst restoreElementWithProperties = (element, extra) => {\r\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;\r\n const base = {\r\n type: extra.type || element.type,\r\n // all elements must have version > 0 so getSceneVersion() will pick up\r\n // newly added elements\r\n version: element.version || 1,\r\n versionNonce: (_a = element.versionNonce) !== null && _a !== void 0 ? _a : 0,\r\n isDeleted: (_b = element.isDeleted) !== null && _b !== void 0 ? _b : false,\r\n id: element.id || (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(),\r\n fillStyle: element.fillStyle || \"hachure\",\r\n strokeWidth: element.strokeWidth || 1,\r\n strokeStyle: (_c = element.strokeStyle) !== null && _c !== void 0 ? _c : \"solid\",\r\n roughness: (_d = element.roughness) !== null && _d !== void 0 ? _d : 1,\r\n opacity: element.opacity == null ? 100 : element.opacity,\r\n angle: element.angle || 0,\r\n x: (_f = (_e = extra.x) !== null && _e !== void 0 ? _e : element.x) !== null && _f !== void 0 ? _f : 0,\r\n y: (_h = (_g = extra.y) !== null && _g !== void 0 ? _g : element.y) !== null && _h !== void 0 ? _h : 0,\r\n strokeColor: element.strokeColor,\r\n backgroundColor: element.backgroundColor,\r\n width: element.width || 0,\r\n height: element.height || 0,\r\n seed: (_j = element.seed) !== null && _j !== void 0 ? _j : 1,\r\n groupIds: (_k = element.groupIds) !== null && _k !== void 0 ? _k : [],\r\n strokeSharpness: (_l = element.strokeSharpness) !== null && _l !== void 0 ? _l : ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isLinearElementType)(element.type) ? \"round\" : \"sharp\"),\r\n boundElementIds: (_m = element.boundElementIds) !== null && _m !== void 0 ? _m : [],\r\n };\r\n return Object.assign(Object.assign(Object.assign({}, base), (0,_element__WEBPACK_IMPORTED_MODULE_0__.getNormalizedDimensions)(base)), extra);\r\n};\r\nconst restoreElement = (element) => {\r\n var _a, _b;\r\n switch (element.type) {\r\n case \"text\":\r\n let fontSize = element.fontSize;\r\n let fontFamily = element.fontFamily;\r\n if (\"font\" in element) {\r\n const [fontPx, _fontFamily] = element.font.split(\" \");\r\n fontSize = parseInt(fontPx, 10);\r\n fontFamily = getFontFamilyByName(_fontFamily);\r\n }\r\n return restoreElementWithProperties(element, {\r\n fontSize,\r\n fontFamily,\r\n text: (_a = element.text) !== null && _a !== void 0 ? _a : \"\",\r\n rawText: (_b = element.rawText) !== null && _b !== void 0 ? _b : \"\",\r\n baseline: element.baseline,\r\n textAlign: element.textAlign || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_TEXT_ALIGN,\r\n verticalAlign: element.verticalAlign || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_VERTICAL_ALIGN,\r\n });\r\n case \"freedraw\": {\r\n return restoreElementWithProperties(element, {\r\n points: element.points,\r\n lastCommittedPoint: null,\r\n simulatePressure: element.simulatePressure,\r\n pressures: element.pressures,\r\n });\r\n }\r\n case \"line\":\r\n // @ts-ignore LEGACY type\r\n // eslint-disable-next-line no-fallthrough\r\n case \"draw\":\r\n case \"arrow\": {\r\n const { startArrowhead = null, endArrowhead = element.type === \"arrow\" ? \"arrow\" : null, } = element;\r\n let x = element.x;\r\n let y = element.y;\r\n let points = // migrate old arrow model to new one\r\n !Array.isArray(element.points) || element.points.length < 2\r\n ? [\r\n [0, 0],\r\n [element.width, element.height],\r\n ]\r\n : element.points;\r\n if (points[0][0] !== 0 || points[0][1] !== 0) {\r\n ({ points, x, y } = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_5__.LinearElementEditor.getNormalizedPoints(element));\r\n }\r\n return restoreElementWithProperties(element, {\r\n type: element.type === \"draw\"\r\n ? \"line\"\r\n : element.type,\r\n startBinding: element.startBinding,\r\n endBinding: element.endBinding,\r\n lastCommittedPoint: null,\r\n startArrowhead,\r\n endArrowhead,\r\n points,\r\n x,\r\n y,\r\n });\r\n }\r\n // generic elements\r\n case \"ellipse\":\r\n return restoreElementWithProperties(element, {});\r\n case \"rectangle\":\r\n return restoreElementWithProperties(element, {});\r\n case \"diamond\":\r\n return restoreElementWithProperties(element, {});\r\n // Don't use default case so as to catch a missing an element type case.\r\n // We also don't want to throw, but instead return void so we filter\r\n // out these unsupported elements from the restored array.\r\n }\r\n};\r\nconst restoreElements = (elements, \r\n/** NOTE doesn't serve for reconciliation */\r\nlocalElements) => {\r\n const localElementsMap = localElements ? (0,_element__WEBPACK_IMPORTED_MODULE_0__.getElementMap)(localElements) : null;\r\n return (elements || []).reduce((elements, element) => {\r\n // filtering out selection, which is legacy, no longer kept in elements,\r\n // and causing issues if retained\r\n if (element.type !== \"selection\" && !(0,_element__WEBPACK_IMPORTED_MODULE_0__.isInvisiblySmallElement)(element)) {\r\n let migratedElement = restoreElement(element);\r\n if (migratedElement) {\r\n const localElement = localElementsMap === null || localElementsMap === void 0 ? void 0 : localElementsMap[element.id];\r\n if (localElement && localElement.version > migratedElement.version) {\r\n migratedElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_6__.bumpVersion)(migratedElement, localElement.version);\r\n }\r\n elements.push(migratedElement);\r\n }\r\n }\r\n return elements;\r\n }, []);\r\n};\r\nconst restoreAppState = (appState, localAppState) => {\r\n appState = appState || {};\r\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_4__.getDefaultAppState)();\r\n const nextAppState = {};\r\n for (const [key, defaultValue] of Object.entries(defaultAppState)) {\r\n const suppliedValue = appState[key];\r\n const localValue = localAppState ? localAppState[key] : undefined;\r\n nextAppState[key] =\r\n suppliedValue !== undefined\r\n ? suppliedValue\r\n : localValue !== undefined\r\n ? localValue\r\n : defaultValue;\r\n }\r\n return Object.assign(Object.assign({}, nextAppState), { elementType: AllowedExcalidrawElementTypes[nextAppState.elementType]\r\n ? nextAppState.elementType\r\n : \"selection\", \r\n // Migrates from previous version where appState.zoom was a number\r\n zoom: typeof appState.zoom === \"number\"\r\n ? {\r\n value: appState.zoom,\r\n translation: defaultAppState.zoom.translation,\r\n }\r\n : appState.zoom || defaultAppState.zoom });\r\n};\r\nconst restore = (data, \r\n/**\r\n * Local AppState (`this.state` or initial state from localStorage) so that we\r\n * don't overwrite local state with default values (when values not\r\n * explicitly specified).\r\n * Supply `null` if you can't get access to it.\r\n */\r\nlocalAppState, localElements) => {\r\n return {\r\n elements: restoreElements(data === null || data === void 0 ? void 0 : data.elements, localElements),\r\n appState: restoreAppState(data === null || data === void 0 ? void 0 : data.appState, localAppState || null),\r\n };\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMsQ0FBQztnQkFDRSxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQTJCO2dCQUMzQyxXQUFXLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXO2FBQzlDO1lBQ0gsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksZUFBZSxDQUFDLElBQUksSUFDM0M7QUFDSixDQUFDLENBQUM7QUFFSyxNQUFNLE9BQU8sR0FBRyxDQUNyQixJQUE4QjtBQUM5Qjs7Ozs7R0FLRztBQUNILGFBQW1ELEVBQ25ELGFBQThELEVBQzNDLEVBQUU7SUFDckIsT0FBTztRQUNMLFFBQVEsRUFBRSxlQUFlLENBQUMsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFFBQVEsRUFBRSxhQUFhLENBQUM7UUFDeEQsUUFBUSxFQUFFLGVBQWUsQ0FBQyxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsUUFBUSxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQUM7S0FDakUsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9kYXRhL3Jlc3RvcmUudHM/ODcyMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd1NlbGVjdGlvbkVsZW1lbnQsXG4gIEZvbnRGYW1pbHlWYWx1ZXMsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgTm9ybWFsaXplZFpvb21WYWx1ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgSW1wb3J0ZWREYXRhU3RhdGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RWxlbWVudE1hcCxcbiAgZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMsXG4gIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LFxufSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgaXNMaW5lYXJFbGVtZW50VHlwZSB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IHJhbmRvbUlkIH0gZnJvbSBcIi4uL3JhbmRvbVwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9URVhUX0FMSUdOLFxuICBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICBGT05UX0ZBTUlMWSxcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4uL2VsZW1lbnQvbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgYnVtcFZlcnNpb24gfSBmcm9tIFwiLi4vZWxlbWVudC9tdXRhdGVFbGVtZW50XCI7XG5cbnR5cGUgUmVzdG9yZWRBcHBTdGF0ZSA9IE9taXQ8XG4gIEFwcFN0YXRlLFxuICBcIm9mZnNldFRvcFwiIHwgXCJvZmZzZXRMZWZ0XCIgfCBcIndpZHRoXCIgfCBcImhlaWdodFwiXG4+O1xuXG5leHBvcnQgY29uc3QgQWxsb3dlZEV4Y2FsaWRyYXdFbGVtZW50VHlwZXM6IFJlY29yZDxcbiAgRXhjYWxpZHJhd0VsZW1lbnRbXCJ0eXBlXCJdLFxuICB0cnVlXG4+ID0ge1xuICBzZWxlY3Rpb246IHRydWUsXG4gIHRleHQ6IHRydWUsXG4gIHJlY3RhbmdsZTogdHJ1ZSxcbiAgZGlhbW9uZDogdHJ1ZSxcbiAgZWxsaXBzZTogdHJ1ZSxcbiAgbGluZTogdHJ1ZSxcbiAgYXJyb3c6IHRydWUsXG4gIGZyZWVkcmF3OiB0cnVlLFxufTtcblxuZXhwb3J0IHR5cGUgUmVzdG9yZWREYXRhU3RhdGUgPSB7XG4gIGVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdO1xuICBhcHBTdGF0ZTogUmVzdG9yZWRBcHBTdGF0ZTtcbn07XG5cbmNvbnN0IGdldEZvbnRGYW1pbHlCeU5hbWUgPSAoZm9udEZhbWlseU5hbWU6IHN0cmluZyk6IEZvbnRGYW1pbHlWYWx1ZXMgPT4ge1xuICBpZiAoT2JqZWN0LmtleXMoRk9OVF9GQU1JTFkpLmluY2x1ZGVzKGZvbnRGYW1pbHlOYW1lKSkge1xuICAgIHJldHVybiBGT05UX0ZBTUlMWVtcbiAgICAgIGZvbnRGYW1pbHlOYW1lIGFzIGtleW9mIHR5cGVvZiBGT05UX0ZBTUlMWVxuICAgIF0gYXMgRm9udEZhbWlseVZhbHVlcztcbiAgfVxuICByZXR1cm4gREVGQVVMVF9GT05UX0ZBTUlMWTtcbn07XG5cbmNvbnN0IHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMgPSA8XG4gIFQgZXh0ZW5kcyBFeGNhbGlkcmF3RWxlbWVudCxcbiAgSyBleHRlbmRzIGtleW9mIE9taXQ8XG4gICAgUmVxdWlyZWQ8VD4sXG4gICAgRXhjbHVkZTxrZXlvZiBFeGNhbGlkcmF3RWxlbWVudCwgXCJ0eXBlXCIgfCBcInhcIiB8IFwieVwiPlxuICA+XG4+KFxuICBlbGVtZW50OiBSZXF1aXJlZDxUPixcbiAgZXh0cmE6IFBpY2s8VCwgSz4sXG4pOiBUID0+IHtcbiAgY29uc3QgYmFzZTogUGljazxULCBrZXlvZiBFeGNhbGlkcmF3RWxlbWVudD4gPSB7XG4gICAgdHlwZTogKGV4dHJhIGFzIFBhcnRpYWw8VD4pLnR5cGUgfHwgZWxlbWVudC50eXBlLFxuICAgIC8vIGFsbCBlbGVtZW50cyBtdXN0IGhhdmUgdmVyc2lvbiA+IDAgc28gZ2V0U2NlbmVWZXJzaW9uKCkgd2lsbCBwaWNrIHVwXG4gICAgLy8gbmV3bHkgYWRkZWQgZWxlbWVudHNcbiAgICB2ZXJzaW9uOiBlbGVtZW50LnZlcnNpb24gfHwgMSxcbiAgICB2ZXJzaW9uTm9uY2U6IGVsZW1lbnQudmVyc2lvbk5vbmNlID8/IDAsXG4gICAgaXNEZWxldGVkOiBlbGVtZW50LmlzRGVsZXRlZCA/PyBmYWxzZSxcbiAgICBpZDogZWxlbWVudC5pZCB8fCByYW5kb21JZCgpLFxuICAgIGZpbGxTdHlsZTogZWxlbWVudC5maWxsU3R5bGUgfHwgXCJoYWNodXJlXCIsXG4gICAgc3Ryb2tlV2lkdGg6IGVsZW1lbnQuc3Ryb2tlV2lkdGggfHwgMSxcbiAgICBzdHJva2VTdHlsZTogZWxlbWVudC5zdHJva2VTdHlsZSA/PyBcInNvbGlkXCIsXG4gICAgcm91Z2huZXNzOiBlbGVtZW50LnJvdWdobmVzcyA/PyAxLFxuICAgIG9wYWNpdHk6IGVsZW1lbnQub3BhY2l0eSA9PSBudWxsID8gMTAwIDogZWxlbWVudC5vcGFjaXR5LFxuICAgIGFuZ2xlOiBlbGVtZW50LmFuZ2xlIHx8IDAsXG4gICAgeDogKGV4dHJhIGFzIFBhcnRpYWw8VD4pLnggPz8gZWxlbWVudC54ID8/IDAsXG4gICAgeTogKGV4dHJhIGFzIFBhcnRpYWw8VD4pLnkgPz8gZWxlbWVudC55ID8/IDAsXG4gICAgc3Ryb2tlQ29sb3I6IGVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yOiBlbGVtZW50LmJhY2tncm91bmRDb2xvcixcbiAgICB3aWR0aDogZWxlbWVudC53aWR0aCB8fCAwLFxuICAgIGhlaWdodDogZWxlbWVudC5oZWlnaHQgfHwgMCxcbiAgICBzZWVkOiBlbGVtZW50LnNlZWQgPz8gMSxcbiAgICBncm91cElkczogZWxlbWVudC5ncm91cElkcyA/PyBbXSxcbiAgICBzdHJva2VTaGFycG5lc3M6XG4gICAgICBlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyA/P1xuICAgICAgKGlzTGluZWFyRWxlbWVudFR5cGUoZWxlbWVudC50eXBlKSA/IFwicm91bmRcIiA6IFwic2hhcnBcIiksXG4gICAgYm91bmRFbGVtZW50SWRzOiBlbGVtZW50LmJvdW5kRWxlbWVudElkcyA/PyBbXSxcbiAgfTtcblxuICByZXR1cm4gKHtcbiAgICAuLi5iYXNlLFxuICAgIC4uLmdldE5vcm1hbGl6ZWREaW1lbnNpb25zKGJhc2UpLFxuICAgIC4uLmV4dHJhLFxuICB9IGFzIHVua25vd24pIGFzIFQ7XG59O1xuXG5jb25zdCByZXN0b3JlRWxlbWVudCA9IChcbiAgZWxlbWVudDogRXhjbHVkZTxFeGNhbGlkcmF3RWxlbWVudCwgRXhjYWxpZHJhd1NlbGVjdGlvbkVsZW1lbnQ+LFxuKTogdHlwZW9mIGVsZW1lbnQgPT4ge1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICBsZXQgZm9udFNpemUgPSBlbGVtZW50LmZvbnRTaXplO1xuICAgICAgbGV0IGZvbnRGYW1pbHkgPSBlbGVtZW50LmZvbnRGYW1pbHk7XG4gICAgICBpZiAoXCJmb250XCIgaW4gZWxlbWVudCkge1xuICAgICAgICBjb25zdCBbZm9udFB4LCBfZm9udEZhbWlseV06IFtcbiAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgc3RyaW5nLFxuICAgICAgICBdID0gKGVsZW1lbnQgYXMgYW55KS5mb250LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9udFNpemUgPSBwYXJzZUludChmb250UHgsIDEwKTtcbiAgICAgICAgZm9udEZhbWlseSA9IGdldEZvbnRGYW1pbHlCeU5hbWUoX2ZvbnRGYW1pbHkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge1xuICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseSxcbiAgICAgICAgdGV4dDogZWxlbWVudC50ZXh0ID8/IFwiXCIsXG4gICAgICAgIHJhd1RleHQ6IGVsZW1lbnQucmF3VGV4dCA/PyBcIlwiLFxuICAgICAgICBiYXNlbGluZTogZWxlbWVudC5iYXNlbGluZSxcbiAgICAgICAgdGV4dEFsaWduOiBlbGVtZW50LnRleHRBbGlnbiB8fCBERUZBVUxUX1RFWFRfQUxJR04sXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IGVsZW1lbnQudmVydGljYWxBbGlnbiB8fCBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICAgICAgfSk7XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgIHJldHVybiByZXN0b3JlRWxlbWVudFdpdGhQcm9wZXJ0aWVzKGVsZW1lbnQsIHtcbiAgICAgICAgcG9pbnRzOiBlbGVtZW50LnBvaW50cyxcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBudWxsLFxuICAgICAgICBzaW11bGF0ZVByZXNzdXJlOiBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmUsXG4gICAgICAgIHByZXNzdXJlczogZWxlbWVudC5wcmVzc3VyZXMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2FzZSBcImxpbmVcIjpcbiAgICAvLyBAdHMtaWdub3JlIExFR0FDWSB0eXBlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgY2FzZSBcImRyYXdcIjpcbiAgICBjYXNlIFwiYXJyb3dcIjoge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdGFydEFycm93aGVhZCA9IG51bGwsXG4gICAgICAgIGVuZEFycm93aGVhZCA9IGVsZW1lbnQudHlwZSA9PT0gXCJhcnJvd1wiID8gXCJhcnJvd1wiIDogbnVsbCxcbiAgICAgIH0gPSBlbGVtZW50O1xuXG4gICAgICBsZXQgeCA9IGVsZW1lbnQueDtcbiAgICAgIGxldCB5ID0gZWxlbWVudC55O1xuICAgICAgbGV0IHBvaW50cyA9IC8vIG1pZ3JhdGUgb2xkIGFycm93IG1vZGVsIHRvIG5ldyBvbmVcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoZWxlbWVudC5wb2ludHMpIHx8IGVsZW1lbnQucG9pbnRzLmxlbmd0aCA8IDJcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgWzAsIDBdLFxuICAgICAgICAgICAgICBbZWxlbWVudC53aWR0aCwgZWxlbWVudC5oZWlnaHRdLFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogZWxlbWVudC5wb2ludHM7XG5cbiAgICAgIGlmIChwb2ludHNbMF1bMF0gIT09IDAgfHwgcG9pbnRzWzBdWzFdICE9PSAwKSB7XG4gICAgICAgICh7IHBvaW50cywgeCwgeSB9ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXROb3JtYWxpemVkUG9pbnRzKGVsZW1lbnQpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge1xuICAgICAgICB0eXBlOlxuICAgICAgICAgIChlbGVtZW50LnR5cGUgYXMgRXhjYWxpZHJhd0VsZW1lbnRbXCJ0eXBlXCJdIHwgXCJkcmF3XCIpID09PSBcImRyYXdcIlxuICAgICAgICAgICAgPyBcImxpbmVcIlxuICAgICAgICAgICAgOiBlbGVtZW50LnR5cGUsXG4gICAgICAgIHN0YXJ0QmluZGluZzogZWxlbWVudC5zdGFydEJpbmRpbmcsXG4gICAgICAgIGVuZEJpbmRpbmc6IGVsZW1lbnQuZW5kQmluZGluZyxcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBudWxsLFxuICAgICAgICBzdGFydEFycm93aGVhZCxcbiAgICAgICAgZW5kQXJyb3doZWFkLFxuICAgICAgICBwb2ludHMsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gZ2VuZXJpYyBlbGVtZW50c1xuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7fSk7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgICAgcmV0dXJuIHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge30pO1xuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7fSk7XG5cbiAgICAvLyBEb24ndCB1c2UgZGVmYXVsdCBjYXNlIHNvIGFzIHRvIGNhdGNoIGEgbWlzc2luZyBhbiBlbGVtZW50IHR5cGUgY2FzZS5cbiAgICAvLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gdGhyb3csIGJ1dCBpbnN0ZWFkIHJldHVybiB2b2lkIHNvIHdlIGZpbHRlclxuICAgIC8vIG91dCB0aGVzZSB1bnN1cHBvcnRlZCBlbGVtZW50cyBmcm9tIHRoZSByZXN0b3JlZCBhcnJheS5cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc3RvcmVFbGVtZW50cyA9IChcbiAgZWxlbWVudHM6IEltcG9ydGVkRGF0YVN0YXRlW1wiZWxlbWVudHNcIl0sXG4gIC8qKiBOT1RFIGRvZXNuJ3Qgc2VydmUgZm9yIHJlY29uY2lsaWF0aW9uICovXG4gIGxvY2FsRWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10gfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogRXhjYWxpZHJhd0VsZW1lbnRbXSA9PiB7XG4gIGNvbnN0IGxvY2FsRWxlbWVudHNNYXAgPSBsb2NhbEVsZW1lbnRzID8gZ2V0RWxlbWVudE1hcChsb2NhbEVsZW1lbnRzKSA6IG51bGw7XG4gIHJldHVybiAoZWxlbWVudHMgfHwgW10pLnJlZHVjZSgoZWxlbWVudHMsIGVsZW1lbnQpID0+IHtcbiAgICAvLyBmaWx0ZXJpbmcgb3V0IHNlbGVjdGlvbiwgd2hpY2ggaXMgbGVnYWN5LCBubyBsb25nZXIga2VwdCBpbiBlbGVtZW50cyxcbiAgICAvLyBhbmQgY2F1c2luZyBpc3N1ZXMgaWYgcmV0YWluZWRcbiAgICBpZiAoZWxlbWVudC50eXBlICE9PSBcInNlbGVjdGlvblwiICYmICFpc0ludmlzaWJseVNtYWxsRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgbGV0IG1pZ3JhdGVkRWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgPSByZXN0b3JlRWxlbWVudChlbGVtZW50KTtcbiAgICAgIGlmIChtaWdyYXRlZEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgbG9jYWxFbGVtZW50ID0gbG9jYWxFbGVtZW50c01hcD8uW2VsZW1lbnQuaWRdO1xuICAgICAgICBpZiAobG9jYWxFbGVtZW50ICYmIGxvY2FsRWxlbWVudC52ZXJzaW9uID4gbWlncmF0ZWRFbGVtZW50LnZlcnNpb24pIHtcbiAgICAgICAgICBtaWdyYXRlZEVsZW1lbnQgPSBidW1wVmVyc2lvbihtaWdyYXRlZEVsZW1lbnQsIGxvY2FsRWxlbWVudC52ZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50cy5wdXNoKG1pZ3JhdGVkRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50cztcbiAgfSwgW10gYXMgRXhjYWxpZHJhd0VsZW1lbnRbXSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVzdG9yZUFwcFN0YXRlID0gKFxuICBhcHBTdGF0ZTogSW1wb3J0ZWREYXRhU3RhdGVbXCJhcHBTdGF0ZVwiXSxcbiAgbG9jYWxBcHBTdGF0ZTogUGFydGlhbDxBcHBTdGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUmVzdG9yZWRBcHBTdGF0ZSA9PiB7XG4gIGFwcFN0YXRlID0gYXBwU3RhdGUgfHwge307XG5cbiAgY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG4gIGNvbnN0IG5leHRBcHBTdGF0ZSA9IHt9IGFzIHR5cGVvZiBkZWZhdWx0QXBwU3RhdGU7XG5cbiAgZm9yIChjb25zdCBba2V5LCBkZWZhdWx0VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmF1bHRBcHBTdGF0ZSkgYXMgW1xuICAgIGtleW9mIHR5cGVvZiBkZWZhdWx0QXBwU3RhdGUsXG4gICAgYW55LFxuICBdW10pIHtcbiAgICBjb25zdCBzdXBwbGllZFZhbHVlID0gYXBwU3RhdGVba2V5XTtcbiAgICBjb25zdCBsb2NhbFZhbHVlID0gbG9jYWxBcHBTdGF0ZSA/IGxvY2FsQXBwU3RhdGVba2V5XSA6IHVuZGVmaW5lZDtcbiAgICAobmV4dEFwcFN0YXRlIGFzIGFueSlba2V5XSA9XG4gICAgICBzdXBwbGllZFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBzdXBwbGllZFZhbHVlXG4gICAgICAgIDogbG9jYWxWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbG9jYWxWYWx1ZVxuICAgICAgICA6IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ubmV4dEFwcFN0YXRlLFxuICAgIGVsZW1lbnRUeXBlOiBBbGxvd2VkRXhjYWxpZHJhd0VsZW1lbnRUeXBlc1tuZXh0QXBwU3RhdGUuZWxlbWVudFR5cGVdXG4gICAgICA/IG5leHRBcHBTdGF0ZS5lbGVtZW50VHlwZVxuICAgICAgOiBcInNlbGVjdGlvblwiLFxuICAgIC8vIE1pZ3JhdGVzIGZyb20gcHJldmlvdXMgdmVyc2lvbiB3aGVyZSBhcHBTdGF0ZS56b29tIHdhcyBhIG51bWJlclxuICAgIHpvb206XG4gICAgICB0eXBlb2YgYXBwU3RhdGUuem9vbSA9PT0gXCJudW1iZXJcIlxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHZhbHVlOiBhcHBTdGF0ZS56b29tIGFzIE5vcm1hbGl6ZWRab29tVmFsdWUsXG4gICAgICAgICAgICB0cmFuc2xhdGlvbjogZGVmYXVsdEFwcFN0YXRlLnpvb20udHJhbnNsYXRpb24sXG4gICAgICAgICAgfVxuICAgICAgICA6IGFwcFN0YXRlLnpvb20gfHwgZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgcmVzdG9yZSA9IChcbiAgZGF0YTogSW1wb3J0ZWREYXRhU3RhdGUgfCBudWxsLFxuICAvKipcbiAgICogTG9jYWwgQXBwU3RhdGUgKGB0aGlzLnN0YXRlYCBvciBpbml0aWFsIHN0YXRlIGZyb20gbG9jYWxTdG9yYWdlKSBzbyB0aGF0IHdlXG4gICAqIGRvbid0IG92ZXJ3cml0ZSBsb2NhbCBzdGF0ZSB3aXRoIGRlZmF1bHQgdmFsdWVzICh3aGVuIHZhbHVlcyBub3RcbiAgICogZXhwbGljaXRseSBzcGVjaWZpZWQpLlxuICAgKiBTdXBwbHkgYG51bGxgIGlmIHlvdSBjYW4ndCBnZXQgYWNjZXNzIHRvIGl0LlxuICAgKi9cbiAgbG9jYWxBcHBTdGF0ZTogUGFydGlhbDxBcHBTdGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBsb2NhbEVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IFJlc3RvcmVkRGF0YVN0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50czogcmVzdG9yZUVsZW1lbnRzKGRhdGE/LmVsZW1lbnRzLCBsb2NhbEVsZW1lbnRzKSxcbiAgICBhcHBTdGF0ZTogcmVzdG9yZUFwcFN0YXRlKGRhdGE/LmFwcFN0YXRlLCBsb2NhbEFwcFN0YXRlIHx8IG51bGwpLFxuICB9O1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../data/restore.ts\n");
2132
2132
 
2133
2133
  /***/ }),
2134
2134
 
@@ -2227,7 +2227,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2227
2227
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2228
2228
 
2229
2229
  "use strict";
2230
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"newElement\": () => (/* binding */ newElement),\n/* harmony export */ \"newTextElement\": () => (/* binding */ newTextElement),\n/* harmony export */ \"updateTextElement\": () => (/* binding */ updateTextElement),\n/* harmony export */ \"newFreeDrawElement\": () => (/* binding */ newFreeDrawElement),\n/* harmony export */ \"newLinearElement\": () => (/* binding */ newLinearElement),\n/* harmony export */ \"deepCopyElement\": () => (/* binding */ deepCopyElement),\n/* harmony export */ \"duplicateElement\": () => (/* binding */ duplicateElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst _newElementBase = (type, _a) => {\r\n var _b, _c;\r\n var { x, y, strokeColor, backgroundColor, fillStyle, strokeWidth, strokeStyle, roughness, opacity, width = 0, height = 0, angle = 0, groupIds = [], strokeSharpness, boundElementIds = null } = _a, rest = __rest(_a, [\"x\", \"y\", \"strokeColor\", \"backgroundColor\", \"fillStyle\", \"strokeWidth\", \"strokeStyle\", \"roughness\", \"opacity\", \"width\", \"height\", \"angle\", \"groupIds\", \"strokeSharpness\", \"boundElementIds\"]);\r\n return ({\r\n id: rest.id || (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)(),\r\n type,\r\n x,\r\n y,\r\n width,\r\n height,\r\n angle,\r\n strokeColor,\r\n backgroundColor,\r\n fillStyle,\r\n strokeWidth,\r\n strokeStyle,\r\n roughness,\r\n opacity,\r\n groupIds,\r\n strokeSharpness,\r\n seed: (_b = rest.seed) !== null && _b !== void 0 ? _b : (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)(),\r\n version: rest.version || 1,\r\n versionNonce: (_c = rest.versionNonce) !== null && _c !== void 0 ? _c : 0,\r\n isDeleted: false,\r\n boundElementIds,\r\n });\r\n};\r\nconst newElement = (opts) => _newElementBase(opts.type, opts);\r\n/** computes element x/y offset based on textAlign/verticalAlign */\r\nconst getTextElementPositionOffsets = (opts, metrics) => {\r\n return {\r\n x: opts.textAlign === \"center\"\r\n ? metrics.width / 2\r\n : opts.textAlign === \"right\"\r\n ? metrics.width\r\n : 0,\r\n y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0,\r\n };\r\n};\r\nconst newTextElement = (opts) => {\r\n const metrics = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.measureText)(opts.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(opts));\r\n const offsets = getTextElementPositionOffsets(opts, metrics);\r\n const textElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(Object.assign(Object.assign({}, _newElementBase(\"text\", opts)), { text: opts.text, fontSize: opts.fontSize, fontFamily: opts.fontFamily, textAlign: opts.textAlign, verticalAlign: opts.verticalAlign, x: opts.x - offsets.x, y: opts.y - offsets.y, width: metrics.width, height: metrics.height, baseline: metrics.baseline }), {});\r\n return textElement;\r\n};\r\nconst getAdjustedDimensions = (element, nextText) => {\r\n const { width: nextWidth, height: nextHeight, baseline: nextBaseline, } = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.measureText)(nextText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element));\r\n const { textAlign, verticalAlign } = element;\r\n let x;\r\n let y;\r\n if (textAlign === \"center\" && verticalAlign === \"middle\") {\r\n const prevMetrics = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element));\r\n const offsets = getTextElementPositionOffsets(element, {\r\n width: nextWidth - prevMetrics.width,\r\n height: nextHeight - prevMetrics.height,\r\n });\r\n x = element.x - offsets.x;\r\n y = element.y - offsets.y;\r\n }\r\n else {\r\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(element);\r\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_6__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight);\r\n const deltaX1 = (x1 - nextX1) / 2;\r\n const deltaY1 = (y1 - nextY1) / 2;\r\n const deltaX2 = (x2 - nextX2) / 2;\r\n const deltaY2 = (y2 - nextY2) / 2;\r\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.adjustXYWithRotation)({\r\n s: true,\r\n e: textAlign === \"center\" || textAlign === \"left\",\r\n w: textAlign === \"center\" || textAlign === \"right\",\r\n }, element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\r\n }\r\n return {\r\n width: nextWidth,\r\n height: nextHeight,\r\n x: Number.isFinite(x) ? x : element.x,\r\n y: Number.isFinite(y) ? y : element.y,\r\n baseline: nextBaseline,\r\n };\r\n};\r\nconst updateTextElement = (element, { text, isDeleted }) => {\r\n return (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(element, Object.assign({ text, isDeleted: isDeleted !== null && isDeleted !== void 0 ? isDeleted : element.isDeleted }, getAdjustedDimensions(element, text)));\r\n};\r\nconst newFreeDrawElement = (opts) => {\r\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], pressures: [], simulatePressure: opts.simulatePressure, lastCommittedPoint: null });\r\n};\r\nconst newLinearElement = (opts) => {\r\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], lastCommittedPoint: null, startBinding: null, endBinding: null, startArrowhead: opts.startArrowhead, endArrowhead: opts.endArrowhead });\r\n};\r\n// Simplified deep clone for the purpose of cloning ExcalidrawElement only\r\n// (doesn't clone Date, RegExp, Map, Set, Typed arrays etc.)\r\n//\r\n// Adapted from https://github.com/lukeed/klona\r\nconst deepCopyElement = (val, depth = 0) => {\r\n if (val == null || typeof val !== \"object\") {\r\n return val;\r\n }\r\n if (Object.prototype.toString.call(val) === \"[object Object]\") {\r\n const tmp = typeof val.constructor === \"function\"\r\n ? Object.create(Object.getPrototypeOf(val))\r\n : {};\r\n for (const key in val) {\r\n if (val.hasOwnProperty(key)) {\r\n // don't copy top-level shape property, which we want to regenerate\r\n if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\r\n continue;\r\n }\r\n tmp[key] = deepCopyElement(val[key], depth + 1);\r\n }\r\n }\r\n return tmp;\r\n }\r\n if (Array.isArray(val)) {\r\n let k = val.length;\r\n const arr = new Array(k);\r\n while (k--) {\r\n arr[k] = deepCopyElement(val[k], depth + 1);\r\n }\r\n return arr;\r\n }\r\n return val;\r\n};\r\n/**\r\n * Duplicate an element, often used in the alt-drag operation.\r\n * Note that this method has gotten a bit complicated since the\r\n * introduction of gruoping/ungrouping elements.\r\n * @param editingGroupId The current group being edited. The new\r\n * element will inherit this group and its\r\n * parents.\r\n * @param groupIdMapForOperation A Map that maps old group IDs to\r\n * duplicated ones. If you are duplicating\r\n * multiple elements at once, share this map\r\n * amongst all of them\r\n * @param element Element to duplicate\r\n * @param overrides Any element properties to override\r\n */\r\nconst duplicateElement = (editingGroupId, groupIdMapForOperation, element, overrides) => {\r\n var _a, _b;\r\n let copy = deepCopyElement(element);\r\n if (false) {}\r\n else {\r\n copy.id = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)();\r\n }\r\n copy.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\r\n copy.groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_3__.getNewGroupIdsForDuplication)(copy.groupIds, editingGroupId, (groupId) => {\r\n if (!groupIdMapForOperation.has(groupId)) {\r\n groupIdMapForOperation.set(groupId, (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)());\r\n }\r\n return groupIdMapForOperation.get(groupId);\r\n });\r\n if (overrides) {\r\n copy = Object.assign(copy, overrides);\r\n }\r\n return copy;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZWxlbWVudC9uZXdFbGVtZW50LnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhc0Q7QUFDRjtBQUNIO0FBQ1E7QUFFWjtBQUNFO0FBQ1k7QUFjM0QsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsSUFBZSxFQUNmLEVBaUIyRSxFQUMzRSxFQUFFOztRQWxCRixFQUNFLENBQUMsRUFDRCxDQUFDLEVBQ0QsV0FBVyxFQUNYLGVBQWUsRUFDZixTQUFTLEVBQ1QsV0FBVyxFQUNYLFdBQVcsRUFDWCxTQUFTLEVBQ1QsT0FBTyxFQUNQLEtBQUssR0FBRyxDQUFDLEVBQ1QsTUFBTSxHQUFHLENBQUMsRUFDVixLQUFLLEdBQUcsQ0FBQyxFQUNULFFBQVEsR0FBRyxFQUFFLEVBQ2IsZUFBZSxFQUNmLGVBQWUsR0FBRyxJQUFJLE9BRW1ELEVBRHRFLElBQUksY0FoQlQsNkxBaUJDLENBRFE7SUFFTixRQUFDO1FBQ0osRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksaURBQVEsRUFBRTtRQUN6QixJQUFJO1FBQ0osQ0FBQztRQUNELENBQUM7UUFDRCxLQUFLO1FBQ0wsTUFBTTtRQUNOLEtBQUs7UUFDTCxXQUFXO1FBQ1gsZUFBZTtRQUNmLFNBQVM7UUFDVCxXQUFXO1FBQ1gsV0FBVztRQUNYLFNBQVM7UUFDVCxPQUFPO1FBQ1AsUUFBUTtRQUNSLGVBQWU7UUFDZixJQUFJLEVBQUUsVUFBSSxDQUFDLElBQUksbUNBQUksc0RBQWEsRUFBRTtRQUNsQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDO1FBQzFCLFlBQVksRUFBRSxVQUFJLENBQUMsWUFBWSxtQ0FBSSxDQUFDO1FBQ3BDLFNBQVMsRUFBRSxLQUFjO1FBQ3pCLGVBQWU7S0FDaEIsQ0FBQztDQUFBLENBQUM7QUFFSSxNQUFNLFVBQVUsR0FBRyxDQUN4QixJQUUwQixFQUNZLEVBQUUsQ0FDeEMsZUFBZSxDQUEyQixJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBRTdELG1FQUFtRTtBQUNuRSxNQUFNLDZCQUE2QixHQUFHLENBQ3BDLElBR0MsRUFDRCxPQUdDLEVBQ0QsRUFBRTtJQUNGLE9BQU87UUFDTCxDQUFDLEVBQ0MsSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRO1lBQ3pCLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUM7WUFDbkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssT0FBTztnQkFDNUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLO2dCQUNmLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM1RCxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUssTUFBTSxjQUFjLEdBQUcsQ0FDNUIsSUFNMEIsRUFDUyxFQUFFO0lBQ3JDLE1BQU0sT0FBTyxHQUFHLG1EQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxxREFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUQsTUFBTSxPQUFPLEdBQUcsNkJBQTZCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdELE1BQU0sV0FBVyxHQUFHLDhEQUFjLGlDQUUzQixlQUFlLENBQXdCLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FDdkQsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQ3ZCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFDekIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQ2pDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQ3JCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQ3JCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFDdEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEtBRTVCLEVBQUUsQ0FDSCxDQUFDO0lBQ0YsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRyxDQUM1QixPQUE4QixFQUM5QixRQUFnQixFQU9oQixFQUFFO0lBQ0YsTUFBTSxFQUNKLEtBQUssRUFBRSxTQUFTLEVBQ2hCLE1BQU0sRUFBRSxVQUFVLEVBQ2xCLFFBQVEsRUFBRSxZQUFZLEdBQ3ZCLEdBQUcsbURBQVcsQ0FBQyxRQUFRLEVBQUUscURBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTdDLElBQUksQ0FBUyxDQUFDO0lBQ2QsSUFBSSxDQUFTLENBQUM7SUFFZCxJQUFJLFNBQVMsS0FBSyxRQUFRLElBQUksYUFBYSxLQUFLLFFBQVEsRUFBRTtRQUN4RCxNQUFNLFdBQVcsR0FBRyxtREFBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUscURBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sT0FBTyxHQUFHLDZCQUE2QixDQUFDLE9BQU8sRUFBRTtZQUNyRCxLQUFLLEVBQUUsU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLO1lBQ3BDLE1BQU0sRUFBRSxVQUFVLEdBQUcsV0FBVyxDQUFDLE1BQU07U0FDeEMsQ0FBQyxDQUFDO1FBRUgsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMxQixDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0tBQzNCO1NBQU07UUFDTCxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsMkRBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLHdFQUErQixDQUN0RSxPQUFPLEVBQ1AsU0FBUyxFQUNULFVBQVUsQ0FDWCxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWxDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLDJEQUFvQixDQUMzQjtZQUNFLENBQUMsRUFBRSxJQUFJO1lBQ1AsQ0FBQyxFQUFFLFNBQVMsS0FBSyxRQUFRLElBQUksU0FBUyxLQUFLLE1BQU07WUFDakQsQ0FBQyxFQUFFLFNBQVMsS0FBSyxRQUFRLElBQUksU0FBUyxLQUFLLE9BQU87U0FDbkQsRUFDRCxPQUFPLENBQUMsQ0FBQyxFQUNULE9BQU8sQ0FBQyxDQUFDLEVBQ1QsT0FBTyxDQUFDLEtBQUssRUFDYixPQUFPLEVBQ1AsT0FBTyxFQUNQLE9BQU8sRUFDUCxPQUFPLENBQ1IsQ0FBQztLQUNIO0lBRUQsT0FBTztRQUNMLEtBQUssRUFBRSxTQUFTO1FBQ2hCLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLENBQUMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLFFBQVEsRUFBRSxZQUFZO0tBQ3ZCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFSyxNQUFNLGlCQUFpQixHQUFHLENBQy9CLE9BQThCLEVBQzlCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBeUMsRUFDbkMsRUFBRTtJQUN6QixPQUFPLDhEQUFjLENBQUMsT0FBTyxrQkFDM0IsSUFBSSxFQUNKLFNBQVMsRUFBRSxTQUFTLGFBQVQsU0FBUyxjQUFULFNBQVMsR0FBSSxPQUFPLENBQUMsU0FBUyxJQUN0QyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQ3ZDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFSyxNQUFNLGtCQUFrQixHQUFHLENBQ2hDLElBSTBCLEVBQ2EsRUFBRTtJQUN6Qyx1Q0FDSyxlQUFlLENBQTRCLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQzlELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFDekIsU0FBUyxFQUFFLEVBQUUsRUFDYixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQ3ZDLGtCQUFrQixFQUFFLElBQUksSUFDeEI7QUFDSixDQUFDLENBQUM7QUFFSyxNQUFNLGdCQUFnQixHQUFHLENBQzlCLElBSzBCLEVBQ1csRUFBRTtJQUN2Qyx1Q0FDSyxlQUFlLENBQTBCLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQzVELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFDekIsa0JBQWtCLEVBQUUsSUFBSSxFQUN4QixZQUFZLEVBQUUsSUFBSSxFQUNsQixVQUFVLEVBQUUsSUFBSSxFQUNoQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFDbkMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLElBQy9CO0FBQ0osQ0FBQyxDQUFDO0FBRUYsMEVBQTBFO0FBQzFFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsK0NBQStDO0FBQ3hDLE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBUSxFQUFFLFFBQWdCLENBQUMsRUFBRSxFQUFFO0lBQzdELElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7UUFDMUMsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUVELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLGlCQUFpQixFQUFFO1FBQzdELE1BQU0sR0FBRyxHQUNQLE9BQU8sR0FBRyxDQUFDLFdBQVcsS0FBSyxVQUFVO1lBQ25DLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNULEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1lBQ3JCLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDM0IsbUVBQW1FO2dCQUNuRSxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssT0FBTyxJQUFJLEdBQUcsS0FBSyxRQUFRLENBQUMsRUFBRTtvQkFDeEQsU0FBUztpQkFDVjtnQkFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDakQ7U0FDRjtRQUNELE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNJLE1BQU0sZ0JBQWdCLEdBQUcsQ0FDOUIsY0FBMEMsRUFDMUMsc0JBQTZDLEVBQzdDLE9BQWlCLEVBQ2pCLFNBQTZCLEVBQ25CLEVBQUU7O0lBQ1osSUFBSSxJQUFJLEdBQWEsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLElBQUksS0FBK0IsRUFBRSxFQVVwQztTQUFNO1FBQ0wsSUFBSSxDQUFDLEVBQUUsR0FBRyxpREFBUSxFQUFFLENBQUM7S0FDdEI7SUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLHNEQUFhLEVBQUUsQ0FBQztJQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLHFFQUE0QixDQUMxQyxJQUFJLENBQUMsUUFBUSxFQUNiLGNBQWMsRUFDZCxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ1YsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN4QyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLGlEQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEO1FBQ0QsT0FBTyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFFLENBQUM7SUFDOUMsQ0FBQyxDQUNGLENBQUM7SUFDRixJQUFJLFNBQVMsRUFBRTtRQUNiLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztLQUN2QztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvbmV3RWxlbWVudC50cz8xMjUzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQsXG4gIE5vbkRlbGV0ZWQsXG4gIFRleHRBbGlnbixcbiAgR3JvdXBJZCxcbiAgVmVydGljYWxBbGlnbixcbiAgQXJyb3doZWFkLFxuICBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuICBGb250RmFtaWx5VmFsdWVzLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgbWVhc3VyZVRleHQsIGdldEZvbnRTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IHJhbmRvbUludGVnZXIsIHJhbmRvbUlkIH0gZnJvbSBcIi4uL3JhbmRvbVwiO1xuaW1wb3J0IHsgbmV3RWxlbWVudFdpdGggfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXROZXdHcm91cElkc0ZvckR1cGxpY2F0aW9uIH0gZnJvbSBcIi4uL2dyb3Vwc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBhZGp1c3RYWVdpdGhSb3RhdGlvbiB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgeyBnZXRSZXNpemVkRWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4vYm91bmRzXCI7XG5cbnR5cGUgRWxlbWVudENvbnN0cnVjdG9yT3B0cyA9IE1hcmtPcHRpb25hbDxcbiAgT21pdDxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQsIFwiaWRcIiB8IFwidHlwZVwiIHwgXCJpc0RlbGV0ZWRcIj4sXG4gIHwgXCJ3aWR0aFwiXG4gIHwgXCJoZWlnaHRcIlxuICB8IFwiYW5nbGVcIlxuICB8IFwiZ3JvdXBJZHNcIlxuICB8IFwiYm91bmRFbGVtZW50SWRzXCJcbiAgfCBcInNlZWRcIlxuICB8IFwidmVyc2lvblwiXG4gIHwgXCJ2ZXJzaW9uTm9uY2VcIlxuPjtcblxuY29uc3QgX25ld0VsZW1lbnRCYXNlID0gPFQgZXh0ZW5kcyBFeGNhbGlkcmF3RWxlbWVudD4oXG4gIHR5cGU6IFRbXCJ0eXBlXCJdLFxuICB7XG4gICAgeCxcbiAgICB5LFxuICAgIHN0cm9rZUNvbG9yLFxuICAgIGJhY2tncm91bmRDb2xvcixcbiAgICBmaWxsU3R5bGUsXG4gICAgc3Ryb2tlV2lkdGgsXG4gICAgc3Ryb2tlU3R5bGUsXG4gICAgcm91Z2huZXNzLFxuICAgIG9wYWNpdHksXG4gICAgd2lkdGggPSAwLFxuICAgIGhlaWdodCA9IDAsXG4gICAgYW5nbGUgPSAwLFxuICAgIGdyb3VwSWRzID0gW10sXG4gICAgc3Ryb2tlU2hhcnBuZXNzLFxuICAgIGJvdW5kRWxlbWVudElkcyA9IG51bGwsXG4gICAgLi4ucmVzdFxuICB9OiBFbGVtZW50Q29uc3RydWN0b3JPcHRzICYgT21pdDxQYXJ0aWFsPEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudD4sIFwidHlwZVwiPixcbikgPT4gKHtcbiAgaWQ6IHJlc3QuaWQgfHwgcmFuZG9tSWQoKSxcbiAgdHlwZSxcbiAgeCxcbiAgeSxcbiAgd2lkdGgsXG4gIGhlaWdodCxcbiAgYW5nbGUsXG4gIHN0cm9rZUNvbG9yLFxuICBiYWNrZ3JvdW5kQ29sb3IsXG4gIGZpbGxTdHlsZSxcbiAgc3Ryb2tlV2lkdGgsXG4gIHN0cm9rZVN0eWxlLFxuICByb3VnaG5lc3MsXG4gIG9wYWNpdHksXG4gIGdyb3VwSWRzLFxuICBzdHJva2VTaGFycG5lc3MsXG4gIHNlZWQ6IHJlc3Quc2VlZCA/PyByYW5kb21JbnRlZ2VyKCksXG4gIHZlcnNpb246IHJlc3QudmVyc2lvbiB8fCAxLFxuICB2ZXJzaW9uTm9uY2U6IHJlc3QudmVyc2lvbk5vbmNlID8/IDAsXG4gIGlzRGVsZXRlZDogZmFsc2UgYXMgZmFsc2UsXG4gIGJvdW5kRWxlbWVudElkcyxcbn0pO1xuXG5leHBvcnQgY29uc3QgbmV3RWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudFtcInR5cGVcIl07XG4gIH0gJiBFbGVtZW50Q29uc3RydWN0b3JPcHRzLFxuKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQ+ID0+XG4gIF9uZXdFbGVtZW50QmFzZTxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQ+KG9wdHMudHlwZSwgb3B0cyk7XG5cbi8qKiBjb21wdXRlcyBlbGVtZW50IHgveSBvZmZzZXQgYmFzZWQgb24gdGV4dEFsaWduL3ZlcnRpY2FsQWxpZ24gKi9cbmNvbnN0IGdldFRleHRFbGVtZW50UG9zaXRpb25PZmZzZXRzID0gKFxuICBvcHRzOiB7XG4gICAgdGV4dEFsaWduOiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJ0ZXh0QWxpZ25cIl07XG4gICAgdmVydGljYWxBbGlnbjogRXhjYWxpZHJhd1RleHRFbGVtZW50W1widmVydGljYWxBbGlnblwiXTtcbiAgfSxcbiAgbWV0cmljczoge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgcmV0dXJuIHtcbiAgICB4OlxuICAgICAgb3B0cy50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCJcbiAgICAgICAgPyBtZXRyaWNzLndpZHRoIC8gMlxuICAgICAgICA6IG9wdHMudGV4dEFsaWduID09PSBcInJpZ2h0XCJcbiAgICAgICAgPyBtZXRyaWNzLndpZHRoXG4gICAgICAgIDogMCxcbiAgICB5OiBvcHRzLnZlcnRpY2FsQWxpZ24gPT09IFwibWlkZGxlXCIgPyBtZXRyaWNzLmhlaWdodCAvIDIgOiAwLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld1RleHRFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGZvbnRTaXplOiBudW1iZXI7XG4gICAgZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbiAgICB0ZXh0QWxpZ246IFRleHRBbGlnbjtcbiAgICB2ZXJ0aWNhbEFsaWduOiBWZXJ0aWNhbEFsaWduO1xuICB9ICYgRWxlbWVudENvbnN0cnVjdG9yT3B0cyxcbik6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PiA9PiB7XG4gIGNvbnN0IG1ldHJpY3MgPSBtZWFzdXJlVGV4dChvcHRzLnRleHQsIGdldEZvbnRTdHJpbmcob3B0cykpO1xuICBjb25zdCBvZmZzZXRzID0gZ2V0VGV4dEVsZW1lbnRQb3NpdGlvbk9mZnNldHMob3B0cywgbWV0cmljcyk7XG4gIGNvbnN0IHRleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoXG4gICAge1xuICAgICAgLi4uX25ld0VsZW1lbnRCYXNlPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4oXCJ0ZXh0XCIsIG9wdHMpLFxuICAgICAgdGV4dDogb3B0cy50ZXh0LFxuICAgICAgZm9udFNpemU6IG9wdHMuZm9udFNpemUsXG4gICAgICBmb250RmFtaWx5OiBvcHRzLmZvbnRGYW1pbHksXG4gICAgICB0ZXh0QWxpZ246IG9wdHMudGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbjogb3B0cy52ZXJ0aWNhbEFsaWduLFxuICAgICAgeDogb3B0cy54IC0gb2Zmc2V0cy54LFxuICAgICAgeTogb3B0cy55IC0gb2Zmc2V0cy55LFxuICAgICAgd2lkdGg6IG1ldHJpY3Mud2lkdGgsXG4gICAgICBoZWlnaHQ6IG1ldHJpY3MuaGVpZ2h0LFxuICAgICAgYmFzZWxpbmU6IG1ldHJpY3MuYmFzZWxpbmUsXG4gICAgfSxcbiAgICB7fSxcbiAgKTtcbiAgcmV0dXJuIHRleHRFbGVtZW50O1xufTtcblxuY29uc3QgZ2V0QWRqdXN0ZWREaW1lbnNpb25zID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIG5leHRUZXh0OiBzdHJpbmcsXG4pOiB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgYmFzZWxpbmU6IG51bWJlcjtcbn0gPT4ge1xuICBjb25zdCB7XG4gICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgYmFzZWxpbmU6IG5leHRCYXNlbGluZSxcbiAgfSA9IG1lYXN1cmVUZXh0KG5leHRUZXh0LCBnZXRGb250U3RyaW5nKGVsZW1lbnQpKTtcbiAgY29uc3QgeyB0ZXh0QWxpZ24sIHZlcnRpY2FsQWxpZ24gfSA9IGVsZW1lbnQ7XG5cbiAgbGV0IHg6IG51bWJlcjtcbiAgbGV0IHk6IG51bWJlcjtcblxuICBpZiAodGV4dEFsaWduID09PSBcImNlbnRlclwiICYmIHZlcnRpY2FsQWxpZ24gPT09IFwibWlkZGxlXCIpIHtcbiAgICBjb25zdCBwcmV2TWV0cmljcyA9IG1lYXN1cmVUZXh0KGVsZW1lbnQudGV4dCwgZ2V0Rm9udFN0cmluZyhlbGVtZW50KSk7XG4gICAgY29uc3Qgb2Zmc2V0cyA9IGdldFRleHRFbGVtZW50UG9zaXRpb25PZmZzZXRzKGVsZW1lbnQsIHtcbiAgICAgIHdpZHRoOiBuZXh0V2lkdGggLSBwcmV2TWV0cmljcy53aWR0aCxcbiAgICAgIGhlaWdodDogbmV4dEhlaWdodCAtIHByZXZNZXRyaWNzLmhlaWdodCxcbiAgICB9KTtcblxuICAgIHggPSBlbGVtZW50LnggLSBvZmZzZXRzLng7XG4gICAgeSA9IGVsZW1lbnQueSAtIG9mZnNldHMueTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuXG4gICAgY29uc3QgW25leHRYMSwgbmV4dFkxLCBuZXh0WDIsIG5leHRZMl0gPSBnZXRSZXNpemVkRWxlbWVudEFic29sdXRlQ29vcmRzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIG5leHRXaWR0aCxcbiAgICAgIG5leHRIZWlnaHQsXG4gICAgKTtcbiAgICBjb25zdCBkZWx0YVgxID0gKHgxIC0gbmV4dFgxKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMSA9ICh5MSAtIG5leHRZMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWDIgPSAoeDIgLSBuZXh0WDIpIC8gMjtcbiAgICBjb25zdCBkZWx0YVkyID0gKHkyIC0gbmV4dFkyKSAvIDI7XG5cbiAgICBbeCwgeV0gPSBhZGp1c3RYWVdpdGhSb3RhdGlvbihcbiAgICAgIHtcbiAgICAgICAgczogdHJ1ZSxcbiAgICAgICAgZTogdGV4dEFsaWduID09PSBcImNlbnRlclwiIHx8IHRleHRBbGlnbiA9PT0gXCJsZWZ0XCIsXG4gICAgICAgIHc6IHRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIiB8fCB0ZXh0QWxpZ24gPT09IFwicmlnaHRcIixcbiAgICAgIH0sXG4gICAgICBlbGVtZW50LngsXG4gICAgICBlbGVtZW50LnksXG4gICAgICBlbGVtZW50LmFuZ2xlLFxuICAgICAgZGVsdGFYMSxcbiAgICAgIGRlbHRhWTEsXG4gICAgICBkZWx0YVgyLFxuICAgICAgZGVsdGFZMixcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogbmV4dFdpZHRoLFxuICAgIGhlaWdodDogbmV4dEhlaWdodCxcbiAgICB4OiBOdW1iZXIuaXNGaW5pdGUoeCkgPyB4IDogZWxlbWVudC54LFxuICAgIHk6IE51bWJlci5pc0Zpbml0ZSh5KSA/IHkgOiBlbGVtZW50LnksXG4gICAgYmFzZWxpbmU6IG5leHRCYXNlbGluZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVUZXh0RWxlbWVudCA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICB7IHRleHQsIGlzRGVsZXRlZCB9OiB7IHRleHQ6IHN0cmluZzsgaXNEZWxldGVkPzogYm9vbGVhbiB9LFxuKTogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0+IHtcbiAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKGVsZW1lbnQsIHtcbiAgICB0ZXh0LFxuICAgIGlzRGVsZXRlZDogaXNEZWxldGVkID8/IGVsZW1lbnQuaXNEZWxldGVkLFxuICAgIC4uLmdldEFkanVzdGVkRGltZW5zaW9ucyhlbGVtZW50LCB0ZXh0KSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgbmV3RnJlZURyYXdFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogXCJmcmVlZHJhd1wiO1xuICAgIHBvaW50cz86IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnRbXCJwb2ludHNcIl07XG4gICAgc2ltdWxhdGVQcmVzc3VyZTogYm9vbGVhbjtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQ+ID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudD4ob3B0cy50eXBlLCBvcHRzKSxcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIHByZXNzdXJlczogW10sXG4gICAgc2ltdWxhdGVQcmVzc3VyZTogb3B0cy5zaW11bGF0ZVByZXNzdXJlLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXdMaW5lYXJFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdHlwZTogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnRbXCJ0eXBlXCJdO1xuICAgIHN0YXJ0QXJyb3doZWFkOiBBcnJvd2hlYWQgfCBudWxsO1xuICAgIGVuZEFycm93aGVhZDogQXJyb3doZWFkIHwgbnVsbDtcbiAgICBwb2ludHM/OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudFtcInBvaW50c1wiXTtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PiA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uX25ld0VsZW1lbnRCYXNlPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PihvcHRzLnR5cGUsIG9wdHMpLFxuICAgIHBvaW50czogb3B0cy5wb2ludHMgfHwgW10sXG4gICAgbGFzdENvbW1pdHRlZFBvaW50OiBudWxsLFxuICAgIHN0YXJ0QmluZGluZzogbnVsbCxcbiAgICBlbmRCaW5kaW5nOiBudWxsLFxuICAgIHN0YXJ0QXJyb3doZWFkOiBvcHRzLnN0YXJ0QXJyb3doZWFkLFxuICAgIGVuZEFycm93aGVhZDogb3B0cy5lbmRBcnJvd2hlYWQsXG4gIH07XG59O1xuXG4vLyBTaW1wbGlmaWVkIGRlZXAgY2xvbmUgZm9yIHRoZSBwdXJwb3NlIG9mIGNsb25pbmcgRXhjYWxpZHJhd0VsZW1lbnQgb25seVxuLy8gKGRvZXNuJ3QgY2xvbmUgRGF0ZSwgUmVnRXhwLCBNYXAsIFNldCwgVHlwZWQgYXJyYXlzIGV0Yy4pXG4vL1xuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQva2xvbmFcbmV4cG9ydCBjb25zdCBkZWVwQ29weUVsZW1lbnQgPSAodmFsOiBhbnksIGRlcHRoOiBudW1iZXIgPSAwKSA9PiB7XG4gIGlmICh2YWwgPT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgIGNvbnN0IHRtcCA9XG4gICAgICB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWwpKVxuICAgICAgICA6IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbCkge1xuICAgICAgaWYgKHZhbC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIGRvbid0IGNvcHkgdG9wLWxldmVsIHNoYXBlIHByb3BlcnR5LCB3aGljaCB3ZSB3YW50IHRvIHJlZ2VuZXJhdGVcbiAgICAgICAgaWYgKGRlcHRoID09PSAwICYmIChrZXkgPT09IFwic2hhcGVcIiB8fCBrZXkgPT09IFwiY2FudmFzXCIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdG1wW2tleV0gPSBkZWVwQ29weUVsZW1lbnQodmFsW2tleV0sIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0bXA7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgbGV0IGsgPSB2YWwubGVuZ3RoO1xuICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShrKTtcbiAgICB3aGlsZSAoay0tKSB7XG4gICAgICBhcnJba10gPSBkZWVwQ29weUVsZW1lbnQodmFsW2tdLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn07XG5cbi8qKlxuICogRHVwbGljYXRlIGFuIGVsZW1lbnQsIG9mdGVuIHVzZWQgaW4gdGhlIGFsdC1kcmFnIG9wZXJhdGlvbi5cbiAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBoYXMgZ290dGVuIGEgYml0IGNvbXBsaWNhdGVkIHNpbmNlIHRoZVxuICogaW50cm9kdWN0aW9uIG9mIGdydW9waW5nL3VuZ3JvdXBpbmcgZWxlbWVudHMuXG4gKiBAcGFyYW0gZWRpdGluZ0dyb3VwSWQgVGhlIGN1cnJlbnQgZ3JvdXAgYmVpbmcgZWRpdGVkLiBUaGUgbmV3XG4gKiAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCB3aWxsIGluaGVyaXQgdGhpcyBncm91cCBhbmQgaXRzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5cbiAqIEBwYXJhbSBncm91cElkTWFwRm9yT3BlcmF0aW9uIEEgTWFwIHRoYXQgbWFwcyBvbGQgZ3JvdXAgSURzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkIG9uZXMuIElmIHlvdSBhcmUgZHVwbGljYXRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIGVsZW1lbnRzIGF0IG9uY2UsIHNoYXJlIHRoaXMgbWFwXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW9uZ3N0IGFsbCBvZiB0aGVtXG4gKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIGR1cGxpY2F0ZVxuICogQHBhcmFtIG92ZXJyaWRlcyBBbnkgZWxlbWVudCBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlXG4gKi9cbmV4cG9ydCBjb25zdCBkdXBsaWNhdGVFbGVtZW50ID0gPFRFbGVtZW50IGV4dGVuZHMgTXV0YWJsZTxFeGNhbGlkcmF3RWxlbWVudD4+KFxuICBlZGl0aW5nR3JvdXBJZDogQXBwU3RhdGVbXCJlZGl0aW5nR3JvdXBJZFwiXSxcbiAgZ3JvdXBJZE1hcEZvck9wZXJhdGlvbjogTWFwPEdyb3VwSWQsIEdyb3VwSWQ+LFxuICBlbGVtZW50OiBURWxlbWVudCxcbiAgb3ZlcnJpZGVzPzogUGFydGlhbDxURWxlbWVudD4sXG4pOiBURWxlbWVudCA9PiB7XG4gIGxldCBjb3B5OiBURWxlbWVudCA9IGRlZXBDb3B5RWxlbWVudChlbGVtZW50KTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgIGNvcHkuaWQgPSBgJHtjb3B5LmlkfV9jb3B5YDtcbiAgICAvLyBgd2luZG93LmhgIG1heSBub3QgYmUgZGVmaW5lZCBpbiBzb21lIHVuaXQgdGVzdHNcbiAgICBpZiAoXG4gICAgICB3aW5kb3cuaD8uYXBwXG4gICAgICAgID8uZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKVxuICAgICAgICAuZmluZCgoZWwpID0+IGVsLmlkID09PSBjb3B5LmlkKVxuICAgICkge1xuICAgICAgY29weS5pZCArPSBcIl9jb3B5XCI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvcHkuaWQgPSByYW5kb21JZCgpO1xuICB9XG4gIGNvcHkuc2VlZCA9IHJhbmRvbUludGVnZXIoKTtcbiAgY29weS5ncm91cElkcyA9IGdldE5ld0dyb3VwSWRzRm9yRHVwbGljYXRpb24oXG4gICAgY29weS5ncm91cElkcyxcbiAgICBlZGl0aW5nR3JvdXBJZCxcbiAgICAoZ3JvdXBJZCkgPT4ge1xuICAgICAgaWYgKCFncm91cElkTWFwRm9yT3BlcmF0aW9uLmhhcyhncm91cElkKSkge1xuICAgICAgICBncm91cElkTWFwRm9yT3BlcmF0aW9uLnNldChncm91cElkLCByYW5kb21JZCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBncm91cElkTWFwRm9yT3BlcmF0aW9uLmdldChncm91cElkKSE7XG4gICAgfSxcbiAgKTtcbiAgaWYgKG92ZXJyaWRlcykge1xuICAgIGNvcHkgPSBPYmplY3QuYXNzaWduKGNvcHksIG92ZXJyaWRlcyk7XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/newElement.ts\n");
2230
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"newElement\": () => (/* binding */ newElement),\n/* harmony export */ \"newTextElement\": () => (/* binding */ newTextElement),\n/* harmony export */ \"updateTextElement\": () => (/* binding */ updateTextElement),\n/* harmony export */ \"newFreeDrawElement\": () => (/* binding */ newFreeDrawElement),\n/* harmony export */ \"newLinearElement\": () => (/* binding */ newLinearElement),\n/* harmony export */ \"deepCopyElement\": () => (/* binding */ deepCopyElement),\n/* harmony export */ \"duplicateElement\": () => (/* binding */ duplicateElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst _newElementBase = (type, _a) => {\r\n var _b, _c;\r\n var { x, y, strokeColor, backgroundColor, fillStyle, strokeWidth, strokeStyle, roughness, opacity, width = 0, height = 0, angle = 0, groupIds = [], strokeSharpness, boundElementIds = null } = _a, rest = __rest(_a, [\"x\", \"y\", \"strokeColor\", \"backgroundColor\", \"fillStyle\", \"strokeWidth\", \"strokeStyle\", \"roughness\", \"opacity\", \"width\", \"height\", \"angle\", \"groupIds\", \"strokeSharpness\", \"boundElementIds\"]);\r\n return ({\r\n id: rest.id || (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)(),\r\n type,\r\n x,\r\n y,\r\n width,\r\n height,\r\n angle,\r\n strokeColor,\r\n backgroundColor,\r\n fillStyle,\r\n strokeWidth,\r\n strokeStyle,\r\n roughness,\r\n opacity,\r\n groupIds,\r\n strokeSharpness,\r\n seed: (_b = rest.seed) !== null && _b !== void 0 ? _b : (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)(),\r\n version: rest.version || 1,\r\n versionNonce: (_c = rest.versionNonce) !== null && _c !== void 0 ? _c : 0,\r\n isDeleted: false,\r\n boundElementIds,\r\n });\r\n};\r\nconst newElement = (opts) => _newElementBase(opts.type, opts);\r\n/** computes element x/y offset based on textAlign/verticalAlign */\r\nconst getTextElementPositionOffsets = (opts, metrics) => {\r\n return {\r\n x: opts.textAlign === \"center\"\r\n ? metrics.width / 2\r\n : opts.textAlign === \"right\"\r\n ? metrics.width\r\n : 0,\r\n y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0,\r\n };\r\n};\r\nconst newTextElement = (opts) => {\r\n const metrics = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.measureText)(opts.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(opts));\r\n const offsets = getTextElementPositionOffsets(opts, metrics);\r\n const textElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(Object.assign(Object.assign({}, _newElementBase(\"text\", opts)), { text: opts.text, rawText: opts.rawText, fontSize: opts.fontSize, fontFamily: opts.fontFamily, textAlign: opts.textAlign, verticalAlign: opts.verticalAlign, x: opts.x - offsets.x, y: opts.y - offsets.y, width: metrics.width, height: metrics.height, baseline: metrics.baseline }), {});\r\n return textElement;\r\n};\r\nconst getAdjustedDimensions = (element, nextText) => {\r\n const { width: nextWidth, height: nextHeight, baseline: nextBaseline, } = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.measureText)(nextText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element));\r\n const { textAlign, verticalAlign } = element;\r\n let x;\r\n let y;\r\n if (textAlign === \"center\" && verticalAlign === \"middle\") {\r\n const prevMetrics = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element));\r\n const offsets = getTextElementPositionOffsets(element, {\r\n width: nextWidth - prevMetrics.width,\r\n height: nextHeight - prevMetrics.height,\r\n });\r\n x = element.x - offsets.x;\r\n y = element.y - offsets.y;\r\n }\r\n else {\r\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(element);\r\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_6__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight);\r\n const deltaX1 = (x1 - nextX1) / 2;\r\n const deltaY1 = (y1 - nextY1) / 2;\r\n const deltaX2 = (x2 - nextX2) / 2;\r\n const deltaY2 = (y2 - nextY2) / 2;\r\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.adjustXYWithRotation)({\r\n s: true,\r\n e: textAlign === \"center\" || textAlign === \"left\",\r\n w: textAlign === \"center\" || textAlign === \"right\",\r\n }, element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\r\n }\r\n return {\r\n width: nextWidth,\r\n height: nextHeight,\r\n x: Number.isFinite(x) ? x : element.x,\r\n y: Number.isFinite(y) ? y : element.y,\r\n baseline: nextBaseline,\r\n };\r\n};\r\nconst updateTextElement = (element, { text, isDeleted }) => {\r\n return (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(element, Object.assign({ text, isDeleted: isDeleted !== null && isDeleted !== void 0 ? isDeleted : element.isDeleted }, getAdjustedDimensions(element, text)));\r\n};\r\nconst newFreeDrawElement = (opts) => {\r\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], pressures: [], simulatePressure: opts.simulatePressure, lastCommittedPoint: null });\r\n};\r\nconst newLinearElement = (opts) => {\r\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], lastCommittedPoint: null, startBinding: null, endBinding: null, startArrowhead: opts.startArrowhead, endArrowhead: opts.endArrowhead });\r\n};\r\n// Simplified deep clone for the purpose of cloning ExcalidrawElement only\r\n// (doesn't clone Date, RegExp, Map, Set, Typed arrays etc.)\r\n//\r\n// Adapted from https://github.com/lukeed/klona\r\nconst deepCopyElement = (val, depth = 0) => {\r\n if (val == null || typeof val !== \"object\") {\r\n return val;\r\n }\r\n if (Object.prototype.toString.call(val) === \"[object Object]\") {\r\n const tmp = typeof val.constructor === \"function\"\r\n ? Object.create(Object.getPrototypeOf(val))\r\n : {};\r\n for (const key in val) {\r\n if (val.hasOwnProperty(key)) {\r\n // don't copy top-level shape property, which we want to regenerate\r\n if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\r\n continue;\r\n }\r\n tmp[key] = deepCopyElement(val[key], depth + 1);\r\n }\r\n }\r\n return tmp;\r\n }\r\n if (Array.isArray(val)) {\r\n let k = val.length;\r\n const arr = new Array(k);\r\n while (k--) {\r\n arr[k] = deepCopyElement(val[k], depth + 1);\r\n }\r\n return arr;\r\n }\r\n return val;\r\n};\r\n/**\r\n * Duplicate an element, often used in the alt-drag operation.\r\n * Note that this method has gotten a bit complicated since the\r\n * introduction of gruoping/ungrouping elements.\r\n * @param editingGroupId The current group being edited. The new\r\n * element will inherit this group and its\r\n * parents.\r\n * @param groupIdMapForOperation A Map that maps old group IDs to\r\n * duplicated ones. If you are duplicating\r\n * multiple elements at once, share this map\r\n * amongst all of them\r\n * @param element Element to duplicate\r\n * @param overrides Any element properties to override\r\n */\r\nconst duplicateElement = (editingGroupId, groupIdMapForOperation, element, overrides) => {\r\n var _a, _b;\r\n let copy = deepCopyElement(element);\r\n if (false) {}\r\n else {\r\n copy.id = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)();\r\n }\r\n copy.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\r\n copy.groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_3__.getNewGroupIdsForDuplication)(copy.groupIds, editingGroupId, (groupId) => {\r\n if (!groupIdMapForOperation.has(groupId)) {\r\n groupIdMapForOperation.set(groupId, (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)());\r\n }\r\n return groupIdMapForOperation.get(groupId);\r\n });\r\n if (overrides) {\r\n copy = Object.assign(copy, overrides);\r\n }\r\n return copy;\r\n};\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUssR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM3QztRQUNELE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSSxNQUFNLGdCQUFnQixHQUFHLENBQzlCLGNBQTBDLEVBQzFDLHNCQUE2QyxFQUM3QyxPQUFpQixFQUNqQixTQUE2QixFQUNuQixFQUFFOztJQUNaLElBQUksSUFBSSxHQUFhLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxJQUFJLEtBQStCLEVBQUUsRUFVcEM7U0FBTTtRQUNMLElBQUksQ0FBQyxFQUFFLEdBQUcsaURBQVEsRUFBRSxDQUFDO0tBQ3RCO0lBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxzREFBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxxRUFBNEIsQ0FDMUMsSUFBSSxDQUFDLFFBQVEsRUFDYixjQUFjLEVBQ2QsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNWLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxpREFBUSxFQUFFLENBQUMsQ0FBQztTQUNqRDtRQUNELE9BQU8sc0JBQXNCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBRSxDQUFDO0lBQzlDLENBQUMsQ0FDRixDQUFDO0lBQ0YsSUFBSSxTQUFTLEVBQUU7UUFDYixJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDdkM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L25ld0VsZW1lbnQudHM/MTI1MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50LFxuICBOb25EZWxldGVkLFxuICBUZXh0QWxpZ24sXG4gIEdyb3VwSWQsXG4gIFZlcnRpY2FsQWxpZ24sXG4gIEFycm93aGVhZCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgRm9udEZhbWlseVZhbHVlcyxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IG1lYXN1cmVUZXh0LCBnZXRGb250U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyByYW5kb21JbnRlZ2VyLCByYW5kb21JZCB9IGZyb20gXCIuLi9yYW5kb21cIjtcbmltcG9ydCB7IG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0TmV3R3JvdXBJZHNGb3JEdXBsaWNhdGlvbiB9IGZyb20gXCIuLi9ncm91cHNcIjtcbmltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgYWRqdXN0WFlXaXRoUm90YXRpb24gfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHsgZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyB9IGZyb20gXCIuL2JvdW5kc1wiO1xuXG50eXBlIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMgPSBNYXJrT3B0aW9uYWw8XG4gIE9taXQ8RXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50LCBcImlkXCIgfCBcInR5cGVcIiB8IFwiaXNEZWxldGVkXCI+LFxuICB8IFwid2lkdGhcIlxuICB8IFwiaGVpZ2h0XCJcbiAgfCBcImFuZ2xlXCJcbiAgfCBcImdyb3VwSWRzXCJcbiAgfCBcImJvdW5kRWxlbWVudElkc1wiXG4gIHwgXCJzZWVkXCJcbiAgfCBcInZlcnNpb25cIlxuICB8IFwidmVyc2lvbk5vbmNlXCJcbj47XG5cbmNvbnN0IF9uZXdFbGVtZW50QmFzZSA9IDxUIGV4dGVuZHMgRXhjYWxpZHJhd0VsZW1lbnQ+KFxuICB0eXBlOiBUW1widHlwZVwiXSxcbiAge1xuICAgIHgsXG4gICAgeSxcbiAgICBzdHJva2VDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgZmlsbFN0eWxlLFxuICAgIHN0cm9rZVdpZHRoLFxuICAgIHN0cm9rZVN0eWxlLFxuICAgIHJvdWdobmVzcyxcbiAgICBvcGFjaXR5LFxuICAgIHdpZHRoID0gMCxcbiAgICBoZWlnaHQgPSAwLFxuICAgIGFuZ2xlID0gMCxcbiAgICBncm91cElkcyA9IFtdLFxuICAgIHN0cm9rZVNoYXJwbmVzcyxcbiAgICBib3VuZEVsZW1lbnRJZHMgPSBudWxsLFxuICAgIC4uLnJlc3RcbiAgfTogRWxlbWVudENvbnN0cnVjdG9yT3B0cyAmIE9taXQ8UGFydGlhbDxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQ+LCBcInR5cGVcIj4sXG4pID0+ICh7XG4gIGlkOiByZXN0LmlkIHx8IHJhbmRvbUlkKCksXG4gIHR5cGUsXG4gIHgsXG4gIHksXG4gIHdpZHRoLFxuICBoZWlnaHQsXG4gIGFuZ2xlLFxuICBzdHJva2VDb2xvcixcbiAgYmFja2dyb3VuZENvbG9yLFxuICBmaWxsU3R5bGUsXG4gIHN0cm9rZVdpZHRoLFxuICBzdHJva2VTdHlsZSxcbiAgcm91Z2huZXNzLFxuICBvcGFjaXR5LFxuICBncm91cElkcyxcbiAgc3Ryb2tlU2hhcnBuZXNzLFxuICBzZWVkOiByZXN0LnNlZWQgPz8gcmFuZG9tSW50ZWdlcigpLFxuICB2ZXJzaW9uOiByZXN0LnZlcnNpb24gfHwgMSxcbiAgdmVyc2lvbk5vbmNlOiByZXN0LnZlcnNpb25Ob25jZSA/PyAwLFxuICBpc0RlbGV0ZWQ6IGZhbHNlIGFzIGZhbHNlLFxuICBib3VuZEVsZW1lbnRJZHMsXG59KTtcblxuZXhwb3J0IGNvbnN0IG5ld0VsZW1lbnQgPSAoXG4gIG9wdHM6IHtcbiAgICB0eXBlOiBFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnRbXCJ0eXBlXCJdO1xuICB9ICYgRWxlbWVudENvbnN0cnVjdG9yT3B0cyxcbik6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50PiA9PlxuICBfbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50PihvcHRzLnR5cGUsIG9wdHMpO1xuXG4vKiogY29tcHV0ZXMgZWxlbWVudCB4L3kgb2Zmc2V0IGJhc2VkIG9uIHRleHRBbGlnbi92ZXJ0aWNhbEFsaWduICovXG5jb25zdCBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyA9IChcbiAgb3B0czoge1xuICAgIHRleHRBbGlnbjogRXhjYWxpZHJhd1RleHRFbGVtZW50W1widGV4dEFsaWduXCJdO1xuICAgIHZlcnRpY2FsQWxpZ246IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcInZlcnRpY2FsQWxpZ25cIl07XG4gIH0sXG4gIG1ldHJpY3M6IHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIHJldHVybiB7XG4gICAgeDpcbiAgICAgIG9wdHMudGV4dEFsaWduID09PSBcImNlbnRlclwiXG4gICAgICAgID8gbWV0cmljcy53aWR0aCAvIDJcbiAgICAgICAgOiBvcHRzLnRleHRBbGlnbiA9PT0gXCJyaWdodFwiXG4gICAgICAgID8gbWV0cmljcy53aWR0aFxuICAgICAgICA6IDAsXG4gICAgeTogb3B0cy52ZXJ0aWNhbEFsaWduID09PSBcIm1pZGRsZVwiID8gbWV0cmljcy5oZWlnaHQgLyAyIDogMCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXdUZXh0RWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICByYXdUZXh0OiBzdHJpbmc7XG4gICAgZm9udFNpemU6IG51bWJlcjtcbiAgICBmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzO1xuICAgIHRleHRBbGlnbjogVGV4dEFsaWduO1xuICAgIHZlcnRpY2FsQWxpZ246IFZlcnRpY2FsQWxpZ247XG4gIH0gJiBFbGVtZW50Q29uc3RydWN0b3JPcHRzLFxuKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+ID0+IHtcbiAgY29uc3QgbWV0cmljcyA9IG1lYXN1cmVUZXh0KG9wdHMudGV4dCwgZ2V0Rm9udFN0cmluZyhvcHRzKSk7XG4gIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyhvcHRzLCBtZXRyaWNzKTtcbiAgY29uc3QgdGV4dEVsZW1lbnQgPSBuZXdFbGVtZW50V2l0aChcbiAgICB7XG4gICAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd1RleHRFbGVtZW50PihcInRleHRcIiwgb3B0cyksXG4gICAgICB0ZXh0OiBvcHRzLnRleHQsXG4gICAgICByYXdUZXh0OiBvcHRzLnJhd1RleHQsXG4gICAgICBmb250U2l6ZTogb3B0cy5mb250U2l6ZSxcbiAgICAgIGZvbnRGYW1pbHk6IG9wdHMuZm9udEZhbWlseSxcbiAgICAgIHRleHRBbGlnbjogb3B0cy50ZXh0QWxpZ24sXG4gICAgICB2ZXJ0aWNhbEFsaWduOiBvcHRzLnZlcnRpY2FsQWxpZ24sXG4gICAgICB4OiBvcHRzLnggLSBvZmZzZXRzLngsXG4gICAgICB5OiBvcHRzLnkgLSBvZmZzZXRzLnksXG4gICAgICB3aWR0aDogbWV0cmljcy53aWR0aCxcbiAgICAgIGhlaWdodDogbWV0cmljcy5oZWlnaHQsXG4gICAgICBiYXNlbGluZTogbWV0cmljcy5iYXNlbGluZSxcbiAgICB9LFxuICAgIHt9LFxuICApO1xuICByZXR1cm4gdGV4dEVsZW1lbnQ7XG59O1xuXG5jb25zdCBnZXRBZGp1c3RlZERpbWVuc2lvbnMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgbmV4dFRleHQ6IHN0cmluZyxcbik6IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBiYXNlbGluZTogbnVtYmVyO1xufSA9PiB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aDogbmV4dFdpZHRoLFxuICAgIGhlaWdodDogbmV4dEhlaWdodCxcbiAgICBiYXNlbGluZTogbmV4dEJhc2VsaW5lLFxuICB9ID0gbWVhc3VyZVRleHQobmV4dFRleHQsIGdldEZvbnRTdHJpbmcoZWxlbWVudCkpO1xuICBjb25zdCB7IHRleHRBbGlnbiwgdmVydGljYWxBbGlnbiB9ID0gZWxlbWVudDtcblxuICBsZXQgeDogbnVtYmVyO1xuICBsZXQgeTogbnVtYmVyO1xuXG4gIGlmICh0ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgJiYgdmVydGljYWxBbGlnbiA9PT0gXCJtaWRkbGVcIikge1xuICAgIGNvbnN0IHByZXZNZXRyaWNzID0gbWVhc3VyZVRleHQoZWxlbWVudC50ZXh0LCBnZXRGb250U3RyaW5nKGVsZW1lbnQpKTtcbiAgICBjb25zdCBvZmZzZXRzID0gZ2V0VGV4dEVsZW1lbnRQb3NpdGlvbk9mZnNldHMoZWxlbWVudCwge1xuICAgICAgd2lkdGg6IG5leHRXaWR0aCAtIHByZXZNZXRyaWNzLndpZHRoLFxuICAgICAgaGVpZ2h0OiBuZXh0SGVpZ2h0IC0gcHJldk1ldHJpY3MuaGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgeCA9IGVsZW1lbnQueCAtIG9mZnNldHMueDtcbiAgICB5ID0gZWxlbWVudC55IC0gb2Zmc2V0cy55O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG5cbiAgICBjb25zdCBbbmV4dFgxLCBuZXh0WTEsIG5leHRYMiwgbmV4dFkyXSA9IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMoXG4gICAgICBlbGVtZW50LFxuICAgICAgbmV4dFdpZHRoLFxuICAgICAgbmV4dEhlaWdodCxcbiAgICApO1xuICAgIGNvbnN0IGRlbHRhWDEgPSAoeDEgLSBuZXh0WDEpIC8gMjtcbiAgICBjb25zdCBkZWx0YVkxID0gKHkxIC0gbmV4dFkxKSAvIDI7XG4gICAgY29uc3QgZGVsdGFYMiA9ICh4MiAtIG5leHRYMikgLyAyO1xuICAgIGNvbnN0IGRlbHRhWTIgPSAoeTIgLSBuZXh0WTIpIC8gMjtcblxuICAgIFt4LCB5XSA9IGFkanVzdFhZV2l0aFJvdGF0aW9uKFxuICAgICAge1xuICAgICAgICBzOiB0cnVlLFxuICAgICAgICBlOiB0ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgfHwgdGV4dEFsaWduID09PSBcImxlZnRcIixcbiAgICAgICAgdzogdGV4dEFsaWduID09PSBcImNlbnRlclwiIHx8IHRleHRBbGlnbiA9PT0gXCJyaWdodFwiLFxuICAgICAgfSxcbiAgICAgIGVsZW1lbnQueCxcbiAgICAgIGVsZW1lbnQueSxcbiAgICAgIGVsZW1lbnQuYW5nbGUsXG4gICAgICBkZWx0YVgxLFxuICAgICAgZGVsdGFZMSxcbiAgICAgIGRlbHRhWDIsXG4gICAgICBkZWx0YVkyLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgIHg6IE51bWJlci5pc0Zpbml0ZSh4KSA/IHggOiBlbGVtZW50LngsXG4gICAgeTogTnVtYmVyLmlzRmluaXRlKHkpID8geSA6IGVsZW1lbnQueSxcbiAgICBiYXNlbGluZTogbmV4dEJhc2VsaW5lLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVRleHRFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIHsgdGV4dCwgaXNEZWxldGVkIH06IHsgdGV4dDogc3RyaW5nOyBpc0RlbGV0ZWQ/OiBib29sZWFuIH0sXG4pOiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgPT4ge1xuICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlbWVudCwge1xuICAgIHRleHQsXG4gICAgaXNEZWxldGVkOiBpc0RlbGV0ZWQgPz8gZWxlbWVudC5pc0RlbGV0ZWQsXG4gICAgLi4uZ2V0QWRqdXN0ZWREaW1lbnNpb25zKGVsZW1lbnQsIHRleHQpLFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXdGcmVlRHJhd0VsZW1lbnQgPSAoXG4gIG9wdHM6IHtcbiAgICB0eXBlOiBcImZyZWVkcmF3XCI7XG4gICAgcG9pbnRzPzogRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudFtcInBvaW50c1wiXTtcbiAgICBzaW11bGF0ZVByZXNzdXJlOiBib29sZWFuO1xuICB9ICYgRWxlbWVudENvbnN0cnVjdG9yT3B0cyxcbik6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudD4gPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLl9uZXdFbGVtZW50QmFzZTxFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50PihvcHRzLnR5cGUsIG9wdHMpLFxuICAgIHBvaW50czogb3B0cy5wb2ludHMgfHwgW10sXG4gICAgcHJlc3N1cmVzOiBbXSxcbiAgICBzaW11bGF0ZVByZXNzdXJlOiBvcHRzLnNpbXVsYXRlUHJlc3N1cmUsXG4gICAgbGFzdENvbW1pdHRlZFBvaW50OiBudWxsLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld0xpbmVhckVsZW1lbnQgPSAoXG4gIG9wdHM6IHtcbiAgICB0eXBlOiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudFtcInR5cGVcIl07XG4gICAgc3RhcnRBcnJvd2hlYWQ6IEFycm93aGVhZCB8IG51bGw7XG4gICAgZW5kQXJyb3doZWFkOiBBcnJvd2hlYWQgfCBudWxsO1xuICAgIHBvaW50cz86IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50W1wicG9pbnRzXCJdO1xuICB9ICYgRWxlbWVudENvbnN0cnVjdG9yT3B0cyxcbik6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+ID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+KG9wdHMudHlwZSwgb3B0cyksXG4gICAgcG9pbnRzOiBvcHRzLnBvaW50cyB8fCBbXSxcbiAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG51bGwsXG4gICAgc3RhcnRCaW5kaW5nOiBudWxsLFxuICAgIGVuZEJpbmRpbmc6IG51bGwsXG4gICAgc3RhcnRBcnJvd2hlYWQ6IG9wdHMuc3RhcnRBcnJvd2hlYWQsXG4gICAgZW5kQXJyb3doZWFkOiBvcHRzLmVuZEFycm93aGVhZCxcbiAgfTtcbn07XG5cbi8vIFNpbXBsaWZpZWQgZGVlcCBjbG9uZSBmb3IgdGhlIHB1cnBvc2Ugb2YgY2xvbmluZyBFeGNhbGlkcmF3RWxlbWVudCBvbmx5XG4vLyAoZG9lc24ndCBjbG9uZSBEYXRlLCBSZWdFeHAsIE1hcCwgU2V0LCBUeXBlZCBhcnJheXMgZXRjLilcbi8vXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2x1a2VlZC9rbG9uYVxuZXhwb3J0IGNvbnN0IGRlZXBDb3B5RWxlbWVudCA9ICh2YWw6IGFueSwgZGVwdGg6IG51bWJlciA9IDApID0+IHtcbiAgaWYgKHZhbCA9PSBudWxsIHx8IHR5cGVvZiB2YWwgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpID09PSBcIltvYmplY3QgT2JqZWN0XVwiKSB7XG4gICAgY29uc3QgdG1wID1cbiAgICAgIHR5cGVvZiB2YWwuY29uc3RydWN0b3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbCkpXG4gICAgICAgIDoge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsKSB7XG4gICAgICBpZiAodmFsLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gZG9uJ3QgY29weSB0b3AtbGV2ZWwgc2hhcGUgcHJvcGVydHksIHdoaWNoIHdlIHdhbnQgdG8gcmVnZW5lcmF0ZVxuICAgICAgICBpZiAoZGVwdGggPT09IDAgJiYgKGtleSA9PT0gXCJzaGFwZVwiIHx8IGtleSA9PT0gXCJjYW52YXNcIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0bXBba2V5XSA9IGRlZXBDb3B5RWxlbWVudCh2YWxba2V5XSwgZGVwdGggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRtcDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICBsZXQgayA9IHZhbC5sZW5ndGg7XG4gICAgY29uc3QgYXJyID0gbmV3IEFycmF5KGspO1xuICAgIHdoaWxlIChrLS0pIHtcbiAgICAgIGFycltrXSA9IGRlZXBDb3B5RWxlbWVudCh2YWxba10sIGRlcHRoICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG4gIH1cblxuICByZXR1cm4gdmFsO1xufTtcblxuLyoqXG4gKiBEdXBsaWNhdGUgYW4gZWxlbWVudCwgb2Z0ZW4gdXNlZCBpbiB0aGUgYWx0LWRyYWcgb3BlcmF0aW9uLlxuICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGhhcyBnb3R0ZW4gYSBiaXQgY29tcGxpY2F0ZWQgc2luY2UgdGhlXG4gKiBpbnRyb2R1Y3Rpb24gb2YgZ3J1b3BpbmcvdW5ncm91cGluZyBlbGVtZW50cy5cbiAqIEBwYXJhbSBlZGl0aW5nR3JvdXBJZCBUaGUgY3VycmVudCBncm91cCBiZWluZyBlZGl0ZWQuIFRoZSBuZXdcbiAqICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IHdpbGwgaW5oZXJpdCB0aGlzIGdyb3VwIGFuZCBpdHNcbiAqICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLlxuICogQHBhcmFtIGdyb3VwSWRNYXBGb3JPcGVyYXRpb24gQSBNYXAgdGhhdCBtYXBzIG9sZCBncm91cCBJRHMgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZWQgb25lcy4gSWYgeW91IGFyZSBkdXBsaWNhdGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgZWxlbWVudHMgYXQgb25jZSwgc2hhcmUgdGhpcyBtYXBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtb25nc3QgYWxsIG9mIHRoZW1cbiAqIEBwYXJhbSBlbGVtZW50IEVsZW1lbnQgdG8gZHVwbGljYXRlXG4gKiBAcGFyYW0gb3ZlcnJpZGVzIEFueSBlbGVtZW50IHByb3BlcnRpZXMgdG8gb3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGNvbnN0IGR1cGxpY2F0ZUVsZW1lbnQgPSA8VEVsZW1lbnQgZXh0ZW5kcyBNdXRhYmxlPEV4Y2FsaWRyYXdFbGVtZW50Pj4oXG4gIGVkaXRpbmdHcm91cElkOiBBcHBTdGF0ZVtcImVkaXRpbmdHcm91cElkXCJdLFxuICBncm91cElkTWFwRm9yT3BlcmF0aW9uOiBNYXA8R3JvdXBJZCwgR3JvdXBJZD4sXG4gIGVsZW1lbnQ6IFRFbGVtZW50LFxuICBvdmVycmlkZXM/OiBQYXJ0aWFsPFRFbGVtZW50Pixcbik6IFRFbGVtZW50ID0+IHtcbiAgbGV0IGNvcHk6IFRFbGVtZW50ID0gZGVlcENvcHlFbGVtZW50KGVsZW1lbnQpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgY29weS5pZCA9IGAke2NvcHkuaWR9X2NvcHlgO1xuICAgIC8vIGB3aW5kb3cuaGAgbWF5IG5vdCBiZSBkZWZpbmVkIGluIHNvbWUgdW5pdCB0ZXN0c1xuICAgIGlmIChcbiAgICAgIHdpbmRvdy5oPy5hcHBcbiAgICAgICAgPy5nZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpXG4gICAgICAgIC5maW5kKChlbCkgPT4gZWwuaWQgPT09IGNvcHkuaWQpXG4gICAgKSB7XG4gICAgICBjb3B5LmlkICs9IFwiX2NvcHlcIjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29weS5pZCA9IHJhbmRvbUlkKCk7XG4gIH1cbiAgY29weS5zZWVkID0gcmFuZG9tSW50ZWdlcigpO1xuICBjb3B5Lmdyb3VwSWRzID0gZ2V0TmV3R3JvdXBJZHNGb3JEdXBsaWNhdGlvbihcbiAgICBjb3B5Lmdyb3VwSWRzLFxuICAgIGVkaXRpbmdHcm91cElkLFxuICAgIChncm91cElkKSA9PiB7XG4gICAgICBpZiAoIWdyb3VwSWRNYXBGb3JPcGVyYXRpb24uaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgIGdyb3VwSWRNYXBGb3JPcGVyYXRpb24uc2V0KGdyb3VwSWQsIHJhbmRvbUlkKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGdyb3VwSWRNYXBGb3JPcGVyYXRpb24uZ2V0KGdyb3VwSWQpITtcbiAgICB9LFxuICApO1xuICBpZiAob3ZlcnJpZGVzKSB7XG4gICAgY29weSA9IE9iamVjdC5hc3NpZ24oY29weSwgb3ZlcnJpZGVzKTtcbiAgfVxuICByZXR1cm4gY29weTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/newElement.ts\n");
2231
2231
 
2232
2232
  /***/ }),
2233
2233
 
@@ -2546,7 +2546,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2546
2546
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2547
2547
 
2548
2548
  "use strict";
2549
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getShapeForElement\": () => (/* binding */ getShapeForElement),\n/* harmony export */ \"invalidateShapeForElement\": () => (/* binding */ invalidateShapeForElement),\n/* harmony export */ \"generateRoughOptions\": () => (/* binding */ generateRoughOptions),\n/* harmony export */ \"renderElement\": () => (/* binding */ renderElement),\n/* harmony export */ \"renderElementToSvg\": () => (/* binding */ renderElementToSvg),\n/* harmony export */ \"pathsCache\": () => (/* binding */ pathsCache),\n/* harmony export */ \"generateFreeDrawShape\": () => (/* binding */ generateFreeDrawShape),\n/* harmony export */ \"getFreeDrawPath2D\": () => (/* binding */ getFreeDrawPath2D),\n/* harmony export */ \"getFreeDrawSvgPath\": () => (/* binding */ getFreeDrawSvgPath)\n/* harmony export */ });\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var perfect_freehand__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! perfect-freehand */ \"../../../node_modules/perfect-freehand/dist/perfect-freehand.esm.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\r\nconst getDashArrayDashed = (strokeWidth) => [8, 8 + strokeWidth];\r\nconst getDashArrayDotted = (strokeWidth) => [1.5, 6 + strokeWidth];\r\nconst getCanvasPadding = (element) => element.type === \"freedraw\" ? element.strokeWidth * 12 : 20;\r\nconst generateElementCanvas = (element, zoom) => {\r\n const canvas = document.createElement(\"canvas\");\r\n const context = canvas.getContext(\"2d\");\r\n const padding = getCanvasPadding(element);\r\n let canvasOffsetX = 0;\r\n let canvasOffsetY = 0;\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isLinearElement)(element) || (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)) {\r\n let [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n x1 = Math.floor(x1);\r\n x2 = Math.ceil(x2);\r\n y1 = Math.floor(y1);\r\n y2 = Math.ceil(y2);\r\n canvas.width =\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(x1, x2) * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n canvas.height =\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(y1, y2) * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n canvasOffsetX =\r\n element.x > x1\r\n ? Math.floor((0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(element.x, x1)) *\r\n window.devicePixelRatio *\r\n zoom.value\r\n : 0;\r\n canvasOffsetY =\r\n element.y > y1\r\n ? Math.floor((0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(element.y, y1)) *\r\n window.devicePixelRatio *\r\n zoom.value\r\n : 0;\r\n context.translate(canvasOffsetX, canvasOffsetY);\r\n }\r\n else {\r\n canvas.width =\r\n element.width * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n canvas.height =\r\n element.height * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n }\r\n context.save();\r\n context.translate(padding * zoom.value, padding * zoom.value);\r\n context.scale(window.devicePixelRatio * zoom.value, window.devicePixelRatio * zoom.value);\r\n const rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__.default.canvas(canvas);\r\n drawElementOnCanvas(element, rc, context);\r\n context.restore();\r\n return {\r\n element,\r\n canvas,\r\n canvasZoom: zoom.value,\r\n canvasOffsetX,\r\n canvasOffsetY,\r\n };\r\n};\r\nconst drawElementOnCanvas = (element, rc, context) => {\r\n context.globalAlpha = element.opacity / 100;\r\n switch (element.type) {\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\": {\r\n context.lineJoin = \"round\";\r\n context.lineCap = \"round\";\r\n rc.draw(getShapeForElement(element));\r\n break;\r\n }\r\n case \"arrow\":\r\n case \"line\": {\r\n context.lineJoin = \"round\";\r\n context.lineCap = \"round\";\r\n getShapeForElement(element).forEach((shape) => {\r\n rc.draw(shape);\r\n });\r\n break;\r\n }\r\n case \"freedraw\": {\r\n // Draw directly to canvas\r\n context.save();\r\n context.fillStyle = element.strokeColor;\r\n const path = getFreeDrawPath2D(element);\r\n context.fillStyle = element.strokeColor;\r\n context.fill(path);\r\n context.restore();\r\n break;\r\n }\r\n default: {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\r\n const rtl = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.isRTL)(element.text);\r\n const shouldTemporarilyAttach = rtl && !context.canvas.isConnected;\r\n if (shouldTemporarilyAttach) {\r\n // to correctly render RTL text mixed with LTR, we have to append it\r\n // to the DOM\r\n document.body.appendChild(context.canvas);\r\n }\r\n context.canvas.setAttribute(\"dir\", rtl ? \"rtl\" : \"ltr\");\r\n context.save();\r\n context.font = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(element);\r\n context.fillStyle = element.strokeColor;\r\n context.textAlign = element.textAlign;\r\n // Canvas does not support multiline text by default\r\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\r\n const lineHeight = element.height / lines.length;\r\n const verticalOffset = element.height - element.baseline;\r\n const horizontalOffset = element.textAlign === \"center\"\r\n ? element.width / 2\r\n : element.textAlign === \"right\"\r\n ? element.width\r\n : 0;\r\n for (let index = 0; index < lines.length; index++) {\r\n context.fillText(lines[index], horizontalOffset, (index + 1) * lineHeight - verticalOffset);\r\n }\r\n context.restore();\r\n if (shouldTemporarilyAttach) {\r\n context.canvas.remove();\r\n }\r\n }\r\n else {\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n }\r\n context.globalAlpha = 1;\r\n};\r\nconst elementWithCanvasCache = new WeakMap();\r\nconst shapeCache = new WeakMap();\r\nconst getShapeForElement = (element) => shapeCache.get(element);\r\nconst invalidateShapeForElement = (element) => shapeCache.delete(element);\r\nconst generateRoughOptions = (element, continuousPath = false) => {\r\n const options = {\r\n seed: element.seed,\r\n strokeLineDash: element.strokeStyle === \"dashed\"\r\n ? getDashArrayDashed(element.strokeWidth)\r\n : element.strokeStyle === \"dotted\"\r\n ? getDashArrayDotted(element.strokeWidth)\r\n : undefined,\r\n // for non-solid strokes, disable multiStroke because it tends to make\r\n // dashes/dots overlay each other\r\n disableMultiStroke: element.strokeStyle !== \"solid\",\r\n // for non-solid strokes, increase the width a bit to make it visually\r\n // similar to solid strokes, because we're also disabling multiStroke\r\n strokeWidth: element.strokeStyle !== \"solid\"\r\n ? element.strokeWidth + 0.5\r\n : element.strokeWidth,\r\n // when increasing strokeWidth, we must explicitly set fillWeight and\r\n // hachureGap because if not specified, roughjs uses strokeWidth to\r\n // calculate them (and we don't want the fills to be modified)\r\n fillWeight: element.strokeWidth / 2,\r\n hachureGap: element.strokeWidth * 4,\r\n roughness: element.roughness,\r\n stroke: element.strokeColor,\r\n preserveVertices: continuousPath,\r\n };\r\n switch (element.type) {\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\": {\r\n options.fillStyle = element.fillStyle;\r\n options.fill =\r\n element.backgroundColor === \"transparent\"\r\n ? undefined\r\n : element.backgroundColor;\r\n if (element.type === \"ellipse\") {\r\n options.curveFitting = 1;\r\n }\r\n return options;\r\n }\r\n case \"line\": {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points)) {\r\n options.fillStyle = element.fillStyle;\r\n options.fill =\r\n element.backgroundColor === \"transparent\"\r\n ? undefined\r\n : element.backgroundColor;\r\n }\r\n return options;\r\n }\r\n case \"freedraw\":\r\n case \"arrow\":\r\n return options;\r\n default: {\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n};\r\n/**\r\n * Generates the element's shape and puts it into the cache.\r\n * @param element\r\n * @param generator\r\n */\r\nconst generateElementShape = (element, generator) => {\r\n let shape = shapeCache.get(element) || null;\r\n if (!shape) {\r\n elementWithCanvasCache.delete(element);\r\n switch (element.type) {\r\n case \"rectangle\":\r\n if (element.strokeSharpness === \"round\") {\r\n const w = element.width;\r\n const h = element.height;\r\n const r = Math.min(w, h) * 0.25;\r\n shape = generator.path(`M ${r} 0 L ${w - r} 0 Q ${w} 0, ${w} ${r} L ${w} ${h - r} Q ${w} ${h}, ${w - r} ${h} L ${r} ${h} Q 0 ${h}, 0 ${h - r} L 0 ${r} Q 0 0, ${r} 0`, generateRoughOptions(element, true));\r\n }\r\n else {\r\n shape = generator.rectangle(0, 0, element.width, element.height, generateRoughOptions(element));\r\n }\r\n break;\r\n case \"diamond\": {\r\n const [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY,] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getDiamondPoints)(element);\r\n shape = generator.polygon([\r\n [topX, topY],\r\n [rightX, rightY],\r\n [bottomX, bottomY],\r\n [leftX, leftY],\r\n ], generateRoughOptions(element));\r\n break;\r\n }\r\n case \"ellipse\":\r\n shape = generator.ellipse(element.width / 2, element.height / 2, element.width, element.height, generateRoughOptions(element));\r\n break;\r\n case \"line\":\r\n case \"arrow\": {\r\n const options = generateRoughOptions(element);\r\n // points array can be empty in the beginning, so it is important to add\r\n // initial position to it\r\n const points = element.points.length ? element.points : [[0, 0]];\r\n // curve is always the first element\r\n // this simplifies finding the curve for an element\r\n if (element.strokeSharpness === \"sharp\") {\r\n if (options.fill) {\r\n shape = [generator.polygon(points, options)];\r\n }\r\n else {\r\n shape = [\r\n generator.linearPath(points, options),\r\n ];\r\n }\r\n }\r\n else {\r\n shape = [generator.curve(points, options)];\r\n }\r\n // add lines only in arrow\r\n if (element.type === \"arrow\") {\r\n const { startArrowhead = null, endArrowhead = \"arrow\" } = element;\r\n const getArrowheadShapes = (element, shape, position, arrowhead) => {\r\n const arrowheadPoints = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getArrowheadPoints)(element, shape, position, arrowhead);\r\n if (arrowheadPoints === null) {\r\n return [];\r\n }\r\n // Other arrowheads here...\r\n if (arrowhead === \"dot\") {\r\n const [x, y, r] = arrowheadPoints;\r\n return [\r\n generator.circle(x, y, r, Object.assign(Object.assign({}, options), { fill: element.strokeColor, fillStyle: \"solid\", stroke: \"none\" })),\r\n ];\r\n }\r\n // Arrow arrowheads\r\n const [x2, y2, x3, y3, x4, y4] = arrowheadPoints;\r\n if (element.strokeStyle === \"dotted\") {\r\n // for dotted arrows caps, reduce gap to make it more legible\r\n const dash = getDashArrayDotted(element.strokeWidth - 1);\r\n options.strokeLineDash = [dash[0], dash[1] - 1];\r\n }\r\n else {\r\n // for solid/dashed, keep solid arrow cap\r\n delete options.strokeLineDash;\r\n }\r\n return [\r\n generator.line(x3, y3, x2, y2, options),\r\n generator.line(x4, y4, x2, y2, options),\r\n ];\r\n };\r\n if (startArrowhead !== null) {\r\n const shapes = getArrowheadShapes(element, shape, \"start\", startArrowhead);\r\n shape.push(...shapes);\r\n }\r\n if (endArrowhead !== null) {\r\n if (endArrowhead === undefined) {\r\n // Hey, we have an old arrow here!\r\n }\r\n const shapes = getArrowheadShapes(element, shape, \"end\", endArrowhead);\r\n shape.push(...shapes);\r\n }\r\n }\r\n break;\r\n }\r\n case \"freedraw\": {\r\n generateFreeDrawShape(element);\r\n shape = [];\r\n break;\r\n }\r\n case \"text\": {\r\n // just to ensure we don't regenerate element.canvas on rerenders\r\n shape = [];\r\n break;\r\n }\r\n }\r\n shapeCache.set(element, shape);\r\n }\r\n};\r\nconst generateElementWithCanvas = (element, sceneState) => {\r\n const zoom = sceneState ? sceneState.zoom : defaultAppState.zoom;\r\n const prevElementWithCanvas = elementWithCanvasCache.get(element);\r\n const shouldRegenerateBecauseZoom = prevElementWithCanvas &&\r\n prevElementWithCanvas.canvasZoom !== zoom.value &&\r\n !(sceneState === null || sceneState === void 0 ? void 0 : sceneState.shouldCacheIgnoreZoom);\r\n if (!prevElementWithCanvas || shouldRegenerateBecauseZoom) {\r\n const elementWithCanvas = generateElementCanvas(element, zoom);\r\n elementWithCanvasCache.set(element, elementWithCanvas);\r\n return elementWithCanvas;\r\n }\r\n return prevElementWithCanvas;\r\n};\r\nconst drawElementFromCanvas = (elementWithCanvas, rc, context, sceneState) => {\r\n const element = elementWithCanvas.element;\r\n const padding = getCanvasPadding(element);\r\n let [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n // Free draw elements will otherwise \"shuffle\" as the min x and y change\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)) {\r\n x1 = Math.floor(x1);\r\n x2 = Math.ceil(x2);\r\n y1 = Math.floor(y1);\r\n y2 = Math.ceil(y2);\r\n }\r\n const cx = ((x1 + x2) / 2 + sceneState.scrollX) * window.devicePixelRatio;\r\n const cy = ((y1 + y2) / 2 + sceneState.scrollY) * window.devicePixelRatio;\r\n context.save();\r\n context.scale(1 / window.devicePixelRatio, 1 / window.devicePixelRatio);\r\n context.translate(cx, cy);\r\n context.rotate(element.angle);\r\n context.drawImage(elementWithCanvas.canvas, (-(x2 - x1) / 2) * window.devicePixelRatio -\r\n (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, (-(y2 - y1) / 2) * window.devicePixelRatio -\r\n (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, elementWithCanvas.canvas.width / elementWithCanvas.canvasZoom, elementWithCanvas.canvas.height / elementWithCanvas.canvasZoom);\r\n context.restore();\r\n // Clear the nested element we appended to the DOM\r\n};\r\nconst renderElement = (element, rc, context, renderOptimizations, sceneState) => {\r\n const generator = rc.generator;\r\n switch (element.type) {\r\n case \"selection\": {\r\n context.save();\r\n context.translate(element.x + sceneState.scrollX, element.y + sceneState.scrollY);\r\n context.fillStyle = \"rgba(0, 0, 255, 0.10)\";\r\n context.fillRect(0, 0, element.width, element.height);\r\n context.restore();\r\n break;\r\n }\r\n case \"freedraw\": {\r\n generateElementShape(element, generator);\r\n if (renderOptimizations) {\r\n const elementWithCanvas = generateElementWithCanvas(element, sceneState);\r\n drawElementFromCanvas(elementWithCanvas, rc, context, sceneState);\r\n }\r\n else {\r\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const cx = (x1 + x2) / 2 + sceneState.scrollX;\r\n const cy = (y1 + y2) / 2 + sceneState.scrollY;\r\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\r\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\r\n context.save();\r\n context.translate(cx, cy);\r\n context.rotate(element.angle);\r\n context.translate(-shiftX, -shiftY);\r\n drawElementOnCanvas(element, rc, context);\r\n context.restore();\r\n }\r\n break;\r\n }\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\":\r\n case \"line\":\r\n case \"arrow\":\r\n case \"text\": {\r\n generateElementShape(element, generator);\r\n if (renderOptimizations) {\r\n const elementWithCanvas = generateElementWithCanvas(element, sceneState);\r\n drawElementFromCanvas(elementWithCanvas, rc, context, sceneState);\r\n }\r\n else {\r\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const cx = (x1 + x2) / 2 + sceneState.scrollX;\r\n const cy = (y1 + y2) / 2 + sceneState.scrollY;\r\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\r\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\r\n context.save();\r\n context.translate(cx, cy);\r\n context.rotate(element.angle);\r\n context.translate(-shiftX, -shiftY);\r\n drawElementOnCanvas(element, rc, context);\r\n context.restore();\r\n }\r\n break;\r\n }\r\n default: {\r\n // @ts-ignore\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n};\r\nconst roughSVGDrawWithPrecision = (rsvg, drawable, precision) => {\r\n if (typeof precision === \"undefined\") {\r\n return rsvg.draw(drawable);\r\n }\r\n const pshape = {\r\n sets: drawable.sets,\r\n shape: drawable.shape,\r\n options: Object.assign(Object.assign({}, drawable.options), { fixedDecimalPlaceDigits: precision }),\r\n };\r\n return rsvg.draw(pshape);\r\n};\r\nconst renderElementToSvg = (element, rsvg, svgRoot, offsetX, offsetY) => {\r\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const cx = (x2 - x1) / 2 - (element.x - x1);\r\n const cy = (y2 - y1) / 2 - (element.y - y1);\r\n const degree = (180 * element.angle) / Math.PI;\r\n const generator = rsvg.generator;\r\n switch (element.type) {\r\n case \"selection\": {\r\n // Since this is used only during editing experience, which is canvas based,\r\n // this should not happen\r\n throw new Error(\"Selection rendering is not supported for SVG\");\r\n }\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\": {\r\n generateElementShape(element, generator);\r\n const node = roughSVGDrawWithPrecision(rsvg, getShapeForElement(element), _constants__WEBPACK_IMPORTED_MODULE_7__.MAX_DECIMALS_FOR_SVG_EXPORT);\r\n const opacity = element.opacity / 100;\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"stroke-linecap\", \"round\");\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n svgRoot.appendChild(node);\r\n break;\r\n }\r\n case \"line\":\r\n case \"arrow\": {\r\n generateElementShape(element, generator);\r\n const group = svgRoot.ownerDocument.createElementNS(_utils__WEBPACK_IMPORTED_MODULE_2__.SVG_NS, \"g\");\r\n const opacity = element.opacity / 100;\r\n group.setAttribute(\"stroke-linecap\", \"round\");\r\n getShapeForElement(element).forEach((shape) => {\r\n const node = roughSVGDrawWithPrecision(rsvg, shape, _constants__WEBPACK_IMPORTED_MODULE_7__.MAX_DECIMALS_FOR_SVG_EXPORT);\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n if (element.type === \"line\" &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points) &&\r\n element.backgroundColor !== \"transparent\") {\r\n node.setAttribute(\"fill-rule\", \"evenodd\");\r\n }\r\n group.appendChild(node);\r\n });\r\n svgRoot.appendChild(group);\r\n break;\r\n }\r\n case \"freedraw\": {\r\n generateFreeDrawShape(element);\r\n const opacity = element.opacity / 100;\r\n const node = svgRoot.ownerDocument.createElementNS(_utils__WEBPACK_IMPORTED_MODULE_2__.SVG_NS, \"g\");\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n const path = svgRoot.ownerDocument.createElementNS(_utils__WEBPACK_IMPORTED_MODULE_2__.SVG_NS, \"path\");\r\n node.setAttribute(\"stroke\", \"none\");\r\n node.setAttribute(\"fill\", element.strokeColor);\r\n path.setAttribute(\"d\", getFreeDrawSvgPath(element));\r\n node.appendChild(path);\r\n svgRoot.appendChild(node);\r\n break;\r\n }\r\n default: {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\r\n const opacity = element.opacity / 100;\r\n const node = svgRoot.ownerDocument.createElementNS(_utils__WEBPACK_IMPORTED_MODULE_2__.SVG_NS, \"g\");\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\r\n const lineHeight = element.height / lines.length;\r\n const verticalOffset = element.height - element.baseline;\r\n const horizontalOffset = element.textAlign === \"center\"\r\n ? element.width / 2\r\n : element.textAlign === \"right\"\r\n ? element.width\r\n : 0;\r\n const direction = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.isRTL)(element.text) ? \"rtl\" : \"ltr\";\r\n const textAnchor = element.textAlign === \"center\"\r\n ? \"middle\"\r\n : element.textAlign === \"right\" || direction === \"rtl\"\r\n ? \"end\"\r\n : \"start\";\r\n for (let i = 0; i < lines.length; i++) {\r\n const text = svgRoot.ownerDocument.createElementNS(_utils__WEBPACK_IMPORTED_MODULE_2__.SVG_NS, \"text\");\r\n text.textContent = lines[i];\r\n text.setAttribute(\"x\", `${horizontalOffset}`);\r\n text.setAttribute(\"y\", `${(i + 1) * lineHeight - verticalOffset}`);\r\n text.setAttribute(\"font-family\", (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontFamilyString)(element));\r\n text.setAttribute(\"font-size\", `${element.fontSize}px`);\r\n text.setAttribute(\"fill\", element.strokeColor);\r\n text.setAttribute(\"text-anchor\", textAnchor);\r\n text.setAttribute(\"style\", \"white-space: pre;\");\r\n text.setAttribute(\"direction\", direction);\r\n node.appendChild(text);\r\n }\r\n svgRoot.appendChild(node);\r\n }\r\n else {\r\n // @ts-ignore\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n }\r\n};\r\nconst pathsCache = new WeakMap([]);\r\nfunction generateFreeDrawShape(element) {\r\n const svgPathData = getFreeDrawSvgPath(element);\r\n const path = new Path2D(svgPathData);\r\n pathsCache.set(element, path);\r\n return path;\r\n}\r\nfunction getFreeDrawPath2D(element) {\r\n return pathsCache.get(element);\r\n}\r\nfunction getFreeDrawSvgPath(element) {\r\n const inputPoints = element.simulatePressure\r\n ? element.points\r\n : element.points.length\r\n ? element.points.map(([x, y], i) => [x, y, element.pressures[i]])\r\n : [[0, 0, 0]];\r\n // Consider changing the options for simulated pressure vs real pressure\r\n const options = {\r\n simulatePressure: element.simulatePressure,\r\n size: element.strokeWidth * 6,\r\n thinning: 0.5,\r\n smoothing: 0.5,\r\n streamline: 0.5,\r\n easing: (t) => t * (2 - t),\r\n last: true,\r\n };\r\n const points = (0,perfect_freehand__WEBPACK_IMPORTED_MODULE_6__.default)(inputPoints, options);\r\n const d = [];\r\n let [p0, p1] = points;\r\n d.push(\"M\", p0[0], p0[1], \"Q\");\r\n for (let i = 0; i < points.length; i++) {\r\n d.push(p0[0], p0[1], (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2);\r\n p0 = p1;\r\n p1 = points[i];\r\n }\r\n p1 = points[0];\r\n d.push(p0[0], p0[1], (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2);\r\n d.push(\"Z\");\r\n return d.join(\" \");\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvRCxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ1IsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNoQjtJQUVELEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRS9ELENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFWixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9yZW5kZXJlci9yZW5kZXJFbGVtZW50LnRzP2E2ZGMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEFycm93aGVhZCxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgaXNUZXh0RWxlbWVudCxcbiAgaXNMaW5lYXJFbGVtZW50LFxuICBpc0ZyZWVEcmF3RWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RGlhbW9uZFBvaW50cyxcbiAgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzLFxuICBnZXRBcnJvd2hlYWRQb2ludHMsXG59IGZyb20gXCIuLi9lbGVtZW50L2JvdW5kc1wiO1xuaW1wb3J0IHsgUm91Z2hDYW52YXMgfSBmcm9tIFwicm91Z2hqcy9iaW4vY2FudmFzXCI7XG5pbXBvcnQgeyBEcmF3YWJsZSwgT3B0aW9ucyB9IGZyb20gXCJyb3VnaGpzL2Jpbi9jb3JlXCI7XG5pbXBvcnQgeyBSb3VnaFNWRyB9IGZyb20gXCJyb3VnaGpzL2Jpbi9zdmdcIjtcbmltcG9ydCB7IFJvdWdoR2VuZXJhdG9yIH0gZnJvbSBcInJvdWdoanMvYmluL2dlbmVyYXRvclwiO1xuaW1wb3J0IHsgU2NlbmVTdGF0ZSB9IGZyb20gXCIuLi9zY2VuZS90eXBlc1wiO1xuaW1wb3J0IHtcbiAgU1ZHX05TLFxuICBkaXN0YW5jZSxcbiAgZ2V0Rm9udFN0cmluZyxcbiAgZ2V0Rm9udEZhbWlseVN0cmluZyxcbiAgaXNSVEwsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgaXNQYXRoQUxvb3AgfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgWm9vbSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgZ2V0RnJlZURyYXdTaGFwZSBmcm9tIFwicGVyZmVjdC1mcmVlaGFuZFwiO1xuaW1wb3J0IHsgTUFYX0RFQ0lNQUxTX0ZPUl9TVkdfRVhQT1JUIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5jb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuY29uc3QgZ2V0RGFzaEFycmF5RGFzaGVkID0gKHN0cm9rZVdpZHRoOiBudW1iZXIpID0+IFs4LCA4ICsgc3Ryb2tlV2lkdGhdO1xuXG5jb25zdCBnZXREYXNoQXJyYXlEb3R0ZWQgPSAoc3Ryb2tlV2lkdGg6IG51bWJlcikgPT4gWzEuNSwgNiArIHN0cm9rZVdpZHRoXTtcblxuY29uc3QgZ2V0Q2FudmFzUGFkZGluZyA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT5cbiAgZWxlbWVudC50eXBlID09PSBcImZyZWVkcmF3XCIgPyBlbGVtZW50LnN0cm9rZVdpZHRoICogMTIgOiAyMDtcblxuZXhwb3J0IGludGVyZmFjZSBFeGNhbGlkcmF3RWxlbWVudFdpdGhDYW52YXMge1xuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgY2FudmFzWm9vbTogWm9vbVtcInZhbHVlXCJdO1xuICBjYW52YXNPZmZzZXRYOiBudW1iZXI7XG4gIGNhbnZhc09mZnNldFk6IG51bWJlcjtcbn1cblxuY29uc3QgZ2VuZXJhdGVFbGVtZW50Q2FudmFzID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHpvb206IFpvb20sXG4pOiBFeGNhbGlkcmF3RWxlbWVudFdpdGhDYW52YXMgPT4ge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSE7XG4gIGNvbnN0IHBhZGRpbmcgPSBnZXRDYW52YXNQYWRkaW5nKGVsZW1lbnQpO1xuXG4gIGxldCBjYW52YXNPZmZzZXRYID0gMDtcbiAgbGV0IGNhbnZhc09mZnNldFkgPSAwO1xuXG4gIGlmIChpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgfHwgaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBsZXQgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcblxuICAgIHgxID0gTWF0aC5mbG9vcih4MSk7XG4gICAgeDIgPSBNYXRoLmNlaWwoeDIpO1xuICAgIHkxID0gTWF0aC5mbG9vcih5MSk7XG4gICAgeTIgPSBNYXRoLmNlaWwoeTIpO1xuXG4gICAgY2FudmFzLndpZHRoID1cbiAgICAgIGRpc3RhbmNlKHgxLCB4MikgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20udmFsdWUgK1xuICAgICAgcGFkZGluZyAqIHpvb20udmFsdWUgKiAyO1xuICAgIGNhbnZhcy5oZWlnaHQgPVxuICAgICAgZGlzdGFuY2UoeTEsIHkyKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogem9vbS52YWx1ZSArXG4gICAgICBwYWRkaW5nICogem9vbS52YWx1ZSAqIDI7XG5cbiAgICBjYW52YXNPZmZzZXRYID1cbiAgICAgIGVsZW1lbnQueCA+IHgxXG4gICAgICAgID8gTWF0aC5mbG9vcihkaXN0YW5jZShlbGVtZW50LngsIHgxKSkgKlxuICAgICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICpcbiAgICAgICAgICB6b29tLnZhbHVlXG4gICAgICAgIDogMDtcblxuICAgIGNhbnZhc09mZnNldFkgPVxuICAgICAgZWxlbWVudC55ID4geTFcbiAgICAgICAgPyBNYXRoLmZsb29yKGRpc3RhbmNlKGVsZW1lbnQueSwgeTEpKSAqXG4gICAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKlxuICAgICAgICAgIHpvb20udmFsdWVcbiAgICAgICAgOiAwO1xuXG4gICAgY29udGV4dC50cmFuc2xhdGUoY2FudmFzT2Zmc2V0WCwgY2FudmFzT2Zmc2V0WSk7XG4gIH0gZWxzZSB7XG4gICAgY2FudmFzLndpZHRoID1cbiAgICAgIGVsZW1lbnQud2lkdGggKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20udmFsdWUgK1xuICAgICAgcGFkZGluZyAqIHpvb20udmFsdWUgKiAyO1xuICAgIGNhbnZhcy5oZWlnaHQgPVxuICAgICAgZWxlbWVudC5oZWlnaHQgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20udmFsdWUgK1xuICAgICAgcGFkZGluZyAqIHpvb20udmFsdWUgKiAyO1xuICB9XG5cbiAgY29udGV4dC5zYXZlKCk7XG4gIGNvbnRleHQudHJhbnNsYXRlKHBhZGRpbmcgKiB6b29tLnZhbHVlLCBwYWRkaW5nICogem9vbS52YWx1ZSk7XG4gIGNvbnRleHQuc2NhbGUoXG4gICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiB6b29tLnZhbHVlLFxuICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogem9vbS52YWx1ZSxcbiAgKTtcblxuICBjb25zdCByYyA9IHJvdWdoLmNhbnZhcyhjYW52YXMpO1xuXG4gIGRyYXdFbGVtZW50T25DYW52YXMoZWxlbWVudCwgcmMsIGNvbnRleHQpO1xuICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50LFxuICAgIGNhbnZhcyxcbiAgICBjYW52YXNab29tOiB6b29tLnZhbHVlLFxuICAgIGNhbnZhc09mZnNldFgsXG4gICAgY2FudmFzT2Zmc2V0WSxcbiAgfTtcbn07XG5cbmNvbnN0IGRyYXdFbGVtZW50T25DYW52YXMgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgcmM6IFJvdWdoQ2FudmFzLFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4pID0+IHtcbiAgY29udGV4dC5nbG9iYWxBbHBoYSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgY2FzZSBcImRpYW1vbmRcIjpcbiAgICBjYXNlIFwiZWxsaXBzZVwiOiB7XG4gICAgICBjb250ZXh0LmxpbmVKb2luID0gXCJyb3VuZFwiO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gXCJyb3VuZFwiO1xuICAgICAgcmMuZHJhdyhnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkgYXMgRHJhd2FibGUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJhcnJvd1wiOlxuICAgIGNhc2UgXCJsaW5lXCI6IHtcbiAgICAgIGNvbnRleHQubGluZUpvaW4gPSBcInJvdW5kXCI7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSBcInJvdW5kXCI7XG5cbiAgICAgIChnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkgYXMgRHJhd2FibGVbXSkuZm9yRWFjaCgoc2hhcGUpID0+IHtcbiAgICAgICAgcmMuZHJhdyhzaGFwZSk7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiZnJlZWRyYXdcIjoge1xuICAgICAgLy8gRHJhdyBkaXJlY3RseSB0byBjYW52YXNcbiAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBlbGVtZW50LnN0cm9rZUNvbG9yO1xuXG4gICAgICBjb25zdCBwYXRoID0gZ2V0RnJlZURyYXdQYXRoMkQoZWxlbWVudCkgYXMgUGF0aDJEO1xuXG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGVsZW1lbnQuc3Ryb2tlQ29sb3I7XG4gICAgICBjb250ZXh0LmZpbGwocGF0aCk7XG5cbiAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IHJ0bCA9IGlzUlRMKGVsZW1lbnQudGV4dCk7XG4gICAgICAgIGNvbnN0IHNob3VsZFRlbXBvcmFyaWx5QXR0YWNoID0gcnRsICYmICFjb250ZXh0LmNhbnZhcy5pc0Nvbm5lY3RlZDtcbiAgICAgICAgaWYgKHNob3VsZFRlbXBvcmFyaWx5QXR0YWNoKSB7XG4gICAgICAgICAgLy8gdG8gY29ycmVjdGx5IHJlbmRlciBSVEwgdGV4dCBtaXhlZCB3aXRoIExUUiwgd2UgaGF2ZSB0byBhcHBlbmQgaXRcbiAgICAgICAgICAvLyB0byB0aGUgRE9NXG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250ZXh0LmNhbnZhcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5jYW52YXMuc2V0QXR0cmlidXRlKFwiZGlyXCIsIHJ0bCA/IFwicnRsXCIgOiBcImx0clwiKTtcbiAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgIGNvbnRleHQuZm9udCA9IGdldEZvbnRTdHJpbmcoZWxlbWVudCk7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gZWxlbWVudC5zdHJva2VDb2xvcjtcbiAgICAgICAgY29udGV4dC50ZXh0QWxpZ24gPSBlbGVtZW50LnRleHRBbGlnbiBhcyBDYW52YXNUZXh0QWxpZ247XG5cbiAgICAgICAgLy8gQ2FudmFzIGRvZXMgbm90IHN1cHBvcnQgbXVsdGlsaW5lIHRleHQgYnkgZGVmYXVsdFxuICAgICAgICBjb25zdCBsaW5lcyA9IGVsZW1lbnQudGV4dC5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQgLyBsaW5lcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsT2Zmc2V0ID0gZWxlbWVudC5oZWlnaHQgLSBlbGVtZW50LmJhc2VsaW5lO1xuICAgICAgICBjb25zdCBob3Jpem9udGFsT2Zmc2V0ID1cbiAgICAgICAgICBlbGVtZW50LnRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIlxuICAgICAgICAgICAgPyBlbGVtZW50LndpZHRoIC8gMlxuICAgICAgICAgICAgOiBlbGVtZW50LnRleHRBbGlnbiA9PT0gXCJyaWdodFwiXG4gICAgICAgICAgICA/IGVsZW1lbnQud2lkdGhcbiAgICAgICAgICAgIDogMDtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGNvbnRleHQuZmlsbFRleHQoXG4gICAgICAgICAgICBsaW5lc1tpbmRleF0sXG4gICAgICAgICAgICBob3Jpem9udGFsT2Zmc2V0LFxuICAgICAgICAgICAgKGluZGV4ICsgMSkgKiBsaW5lSGVpZ2h0IC0gdmVydGljYWxPZmZzZXQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgaWYgKHNob3VsZFRlbXBvcmFyaWx5QXR0YWNoKSB7XG4gICAgICAgICAgY29udGV4dC5jYW52YXMucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5pbXBsZW1lbnRlZCB0eXBlICR7ZWxlbWVudC50eXBlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb250ZXh0Lmdsb2JhbEFscGhhID0gMTtcbn07XG5cbmNvbnN0IGVsZW1lbnRXaXRoQ2FudmFzQ2FjaGUgPSBuZXcgV2Vha01hcDxcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdFbGVtZW50V2l0aENhbnZhc1xuPigpO1xuXG5jb25zdCBzaGFwZUNhY2hlID0gbmV3IFdlYWtNYXA8XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBEcmF3YWJsZSB8IERyYXdhYmxlW10gfCBudWxsXG4+KCk7XG5cbmV4cG9ydCBjb25zdCBnZXRTaGFwZUZvckVsZW1lbnQgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+XG4gIHNoYXBlQ2FjaGUuZ2V0KGVsZW1lbnQpO1xuXG5leHBvcnQgY29uc3QgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudCA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT5cbiAgc2hhcGVDYWNoZS5kZWxldGUoZWxlbWVudCk7XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGNvbnRpbnVvdXNQYXRoID0gZmFsc2UsXG4pOiBPcHRpb25zID0+IHtcbiAgY29uc3Qgb3B0aW9uczogT3B0aW9ucyA9IHtcbiAgICBzZWVkOiBlbGVtZW50LnNlZWQsXG4gICAgc3Ryb2tlTGluZURhc2g6XG4gICAgICBlbGVtZW50LnN0cm9rZVN0eWxlID09PSBcImRhc2hlZFwiXG4gICAgICAgID8gZ2V0RGFzaEFycmF5RGFzaGVkKGVsZW1lbnQuc3Ryb2tlV2lkdGgpXG4gICAgICAgIDogZWxlbWVudC5zdHJva2VTdHlsZSA9PT0gXCJkb3R0ZWRcIlxuICAgICAgICA/IGdldERhc2hBcnJheURvdHRlZChlbGVtZW50LnN0cm9rZVdpZHRoKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAvLyBmb3Igbm9uLXNvbGlkIHN0cm9rZXMsIGRpc2FibGUgbXVsdGlTdHJva2UgYmVjYXVzZSBpdCB0ZW5kcyB0byBtYWtlXG4gICAgLy8gZGFzaGVzL2RvdHMgb3ZlcmxheSBlYWNoIG90aGVyXG4gICAgZGlzYWJsZU11bHRpU3Ryb2tlOiBlbGVtZW50LnN0cm9rZVN0eWxlICE9PSBcInNvbGlkXCIsXG4gICAgLy8gZm9yIG5vbi1zb2xpZCBzdHJva2VzLCBpbmNyZWFzZSB0aGUgd2lkdGggYSBiaXQgdG8gbWFrZSBpdCB2aXN1YWxseVxuICAgIC8vIHNpbWlsYXIgdG8gc29saWQgc3Ryb2tlcywgYmVjYXVzZSB3ZSdyZSBhbHNvIGRpc2FibGluZyBtdWx0aVN0cm9rZVxuICAgIHN0cm9rZVdpZHRoOlxuICAgICAgZWxlbWVudC5zdHJva2VTdHlsZSAhPT0gXCJzb2xpZFwiXG4gICAgICAgID8gZWxlbWVudC5zdHJva2VXaWR0aCArIDAuNVxuICAgICAgICA6IGVsZW1lbnQuc3Ryb2tlV2lkdGgsXG4gICAgLy8gd2hlbiBpbmNyZWFzaW5nIHN0cm9rZVdpZHRoLCB3ZSBtdXN0IGV4cGxpY2l0bHkgc2V0IGZpbGxXZWlnaHQgYW5kXG4gICAgLy8gaGFjaHVyZUdhcCBiZWNhdXNlIGlmIG5vdCBzcGVjaWZpZWQsIHJvdWdoanMgdXNlcyBzdHJva2VXaWR0aCB0b1xuICAgIC8vIGNhbGN1bGF0ZSB0aGVtIChhbmQgd2UgZG9uJ3Qgd2FudCB0aGUgZmlsbHMgdG8gYmUgbW9kaWZpZWQpXG4gICAgZmlsbFdlaWdodDogZWxlbWVudC5zdHJva2VXaWR0aCAvIDIsXG4gICAgaGFjaHVyZUdhcDogZWxlbWVudC5zdHJva2VXaWR0aCAqIDQsXG4gICAgcm91Z2huZXNzOiBlbGVtZW50LnJvdWdobmVzcyxcbiAgICBzdHJva2U6IGVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgcHJlc2VydmVWZXJ0aWNlczogY29udGludW91c1BhdGgsXG4gIH07XG5cbiAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgY2FzZSBcImRpYW1vbmRcIjpcbiAgICBjYXNlIFwiZWxsaXBzZVwiOiB7XG4gICAgICBvcHRpb25zLmZpbGxTdHlsZSA9IGVsZW1lbnQuZmlsbFN0eWxlO1xuICAgICAgb3B0aW9ucy5maWxsID1cbiAgICAgICAgZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3IgPT09IFwidHJhbnNwYXJlbnRcIlxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBlbGVtZW50LmJhY2tncm91bmRDb2xvcjtcbiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwiZWxsaXBzZVwiKSB7XG4gICAgICAgIG9wdGlvbnMuY3VydmVGaXR0aW5nID0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgICBjYXNlIFwibGluZVwiOiB7XG4gICAgICBpZiAoaXNQYXRoQUxvb3AoZWxlbWVudC5wb2ludHMpKSB7XG4gICAgICAgIG9wdGlvbnMuZmlsbFN0eWxlID0gZWxlbWVudC5maWxsU3R5bGU7XG4gICAgICAgIG9wdGlvbnMuZmlsbCA9XG4gICAgICAgICAgZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3IgPT09IFwidHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6XG4gICAgY2FzZSBcImFycm93XCI6XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaW1wbGVtZW50ZWQgdHlwZSAke2VsZW1lbnQudHlwZX1gKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBlbGVtZW50J3Mgc2hhcGUgYW5kIHB1dHMgaXQgaW50byB0aGUgY2FjaGUuXG4gKiBAcGFyYW0gZWxlbWVudFxuICogQHBhcmFtIGdlbmVyYXRvclxuICovXG5jb25zdCBnZW5lcmF0ZUVsZW1lbnRTaGFwZSA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBnZW5lcmF0b3I6IFJvdWdoR2VuZXJhdG9yLFxuKSA9PiB7XG4gIGxldCBzaGFwZSA9IHNoYXBlQ2FjaGUuZ2V0KGVsZW1lbnQpIHx8IG51bGw7XG5cbiAgaWYgKCFzaGFwZSkge1xuICAgIGVsZW1lbnRXaXRoQ2FudmFzQ2FjaGUuZGVsZXRlKGVsZW1lbnQpO1xuXG4gICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICAgICAgaWYgKGVsZW1lbnQuc3Ryb2tlU2hhcnBuZXNzID09PSBcInJvdW5kXCIpIHtcbiAgICAgICAgICBjb25zdCB3ID0gZWxlbWVudC53aWR0aDtcbiAgICAgICAgICBjb25zdCBoID0gZWxlbWVudC5oZWlnaHQ7XG4gICAgICAgICAgY29uc3QgciA9IE1hdGgubWluKHcsIGgpICogMC4yNTtcbiAgICAgICAgICBzaGFwZSA9IGdlbmVyYXRvci5wYXRoKFxuICAgICAgICAgICAgYE0gJHtyfSAwIEwgJHt3IC0gcn0gMCBRICR7d30gMCwgJHt3fSAke3J9IEwgJHt3fSAke1xuICAgICAgICAgICAgICBoIC0gclxuICAgICAgICAgICAgfSBRICR7d30gJHtofSwgJHt3IC0gcn0gJHtofSBMICR7cn0gJHtofSBRIDAgJHtofSwgMCAke1xuICAgICAgICAgICAgICBoIC0gclxuICAgICAgICAgICAgfSBMIDAgJHtyfSBRIDAgMCwgJHtyfSAwYCxcbiAgICAgICAgICAgIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQsIHRydWUpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hhcGUgPSBnZW5lcmF0b3IucmVjdGFuZ2xlKFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBlbGVtZW50LndpZHRoLFxuICAgICAgICAgICAgZWxlbWVudC5oZWlnaHQsXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImRpYW1vbmRcIjoge1xuICAgICAgICBjb25zdCBbXG4gICAgICAgICAgdG9wWCxcbiAgICAgICAgICB0b3BZLFxuICAgICAgICAgIHJpZ2h0WCxcbiAgICAgICAgICByaWdodFksXG4gICAgICAgICAgYm90dG9tWCxcbiAgICAgICAgICBib3R0b21ZLFxuICAgICAgICAgIGxlZnRYLFxuICAgICAgICAgIGxlZnRZLFxuICAgICAgICBdID0gZ2V0RGlhbW9uZFBvaW50cyhlbGVtZW50KTtcbiAgICAgICAgc2hhcGUgPSBnZW5lcmF0b3IucG9seWdvbihcbiAgICAgICAgICBbXG4gICAgICAgICAgICBbdG9wWCwgdG9wWV0sXG4gICAgICAgICAgICBbcmlnaHRYLCByaWdodFldLFxuICAgICAgICAgICAgW2JvdHRvbVgsIGJvdHRvbVldLFxuICAgICAgICAgICAgW2xlZnRYLCBsZWZ0WV0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiZWxsaXBzZVwiOlxuICAgICAgICBzaGFwZSA9IGdlbmVyYXRvci5lbGxpcHNlKFxuICAgICAgICAgIGVsZW1lbnQud2lkdGggLyAyLFxuICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0IC8gMixcbiAgICAgICAgICBlbGVtZW50LndpZHRoLFxuICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICAgIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgICBjYXNlIFwiYXJyb3dcIjoge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCk7XG5cbiAgICAgICAgLy8gcG9pbnRzIGFycmF5IGNhbiBiZSBlbXB0eSBpbiB0aGUgYmVnaW5uaW5nLCBzbyBpdCBpcyBpbXBvcnRhbnQgdG8gYWRkXG4gICAgICAgIC8vIGluaXRpYWwgcG9zaXRpb24gdG8gaXRcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZWxlbWVudC5wb2ludHMubGVuZ3RoID8gZWxlbWVudC5wb2ludHMgOiBbWzAsIDBdXTtcblxuICAgICAgICAvLyBjdXJ2ZSBpcyBhbHdheXMgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgICAgLy8gdGhpcyBzaW1wbGlmaWVzIGZpbmRpbmcgdGhlIGN1cnZlIGZvciBhbiBlbGVtZW50XG4gICAgICAgIGlmIChlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyA9PT0gXCJzaGFycFwiKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuZmlsbCkge1xuICAgICAgICAgICAgc2hhcGUgPSBbZ2VuZXJhdG9yLnBvbHlnb24ocG9pbnRzIGFzIFtudW1iZXIsIG51bWJlcl1bXSwgb3B0aW9ucyldO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzaGFwZSA9IFtcbiAgICAgICAgICAgICAgZ2VuZXJhdG9yLmxpbmVhclBhdGgocG9pbnRzIGFzIFtudW1iZXIsIG51bWJlcl1bXSwgb3B0aW9ucyksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaGFwZSA9IFtnZW5lcmF0b3IuY3VydmUocG9pbnRzIGFzIFtudW1iZXIsIG51bWJlcl1bXSwgb3B0aW9ucyldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGxpbmVzIG9ubHkgaW4gYXJyb3dcbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJhcnJvd1wiKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGFydEFycm93aGVhZCA9IG51bGwsIGVuZEFycm93aGVhZCA9IFwiYXJyb3dcIiB9ID0gZWxlbWVudDtcblxuICAgICAgICAgIGNvbnN0IGdldEFycm93aGVhZFNoYXBlcyA9IChcbiAgICAgICAgICAgIGVsZW1lbnQ6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgc2hhcGU6IERyYXdhYmxlW10sXG4gICAgICAgICAgICBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJlbmRcIixcbiAgICAgICAgICAgIGFycm93aGVhZDogQXJyb3doZWFkLFxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXJyb3doZWFkUG9pbnRzID0gZ2V0QXJyb3doZWFkUG9pbnRzKFxuICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICAgIGFycm93aGVhZCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChhcnJvd2hlYWRQb2ludHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPdGhlciBhcnJvd2hlYWRzIGhlcmUuLi5cbiAgICAgICAgICAgIGlmIChhcnJvd2hlYWQgPT09IFwiZG90XCIpIHtcbiAgICAgICAgICAgICAgY29uc3QgW3gsIHksIHJdID0gYXJyb3doZWFkUG9pbnRzO1xuXG4gICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmNpcmNsZSh4LCB5LCByLCB7XG4gICAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgZmlsbDogZWxlbWVudC5zdHJva2VDb2xvcixcbiAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogXCJzb2xpZFwiLFxuICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQXJyb3cgYXJyb3doZWFkc1xuICAgICAgICAgICAgY29uc3QgW3gyLCB5MiwgeDMsIHkzLCB4NCwgeTRdID0gYXJyb3doZWFkUG9pbnRzO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5zdHJva2VTdHlsZSA9PT0gXCJkb3R0ZWRcIikge1xuICAgICAgICAgICAgICAvLyBmb3IgZG90dGVkIGFycm93cyBjYXBzLCByZWR1Y2UgZ2FwIHRvIG1ha2UgaXQgbW9yZSBsZWdpYmxlXG4gICAgICAgICAgICAgIGNvbnN0IGRhc2ggPSBnZXREYXNoQXJyYXlEb3R0ZWQoZWxlbWVudC5zdHJva2VXaWR0aCAtIDEpO1xuICAgICAgICAgICAgICBvcHRpb25zLnN0cm9rZUxpbmVEYXNoID0gW2Rhc2hbMF0sIGRhc2hbMV0gLSAxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGZvciBzb2xpZC9kYXNoZWQsIGtlZXAgc29saWQgYXJyb3cgY2FwXG4gICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLnN0cm9rZUxpbmVEYXNoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgZ2VuZXJhdG9yLmxpbmUoeDMsIHkzLCB4MiwgeTIsIG9wdGlvbnMpLFxuICAgICAgICAgICAgICBnZW5lcmF0b3IubGluZSh4NCwgeTQsIHgyLCB5Miwgb3B0aW9ucyksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoc3RhcnRBcnJvd2hlYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlcyA9IGdldEFycm93aGVhZFNoYXBlcyhcbiAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgICAgIFwic3RhcnRcIixcbiAgICAgICAgICAgICAgc3RhcnRBcnJvd2hlYWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc2hhcGUucHVzaCguLi5zaGFwZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlbmRBcnJvd2hlYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChlbmRBcnJvd2hlYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBIZXksIHdlIGhhdmUgYW4gb2xkIGFycm93IGhlcmUhXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNoYXBlcyA9IGdldEFycm93aGVhZFNoYXBlcyhcbiAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgICAgIFwiZW5kXCIsXG4gICAgICAgICAgICAgIGVuZEFycm93aGVhZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzaGFwZS5wdXNoKC4uLnNoYXBlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiZnJlZWRyYXdcIjoge1xuICAgICAgICBnZW5lcmF0ZUZyZWVEcmF3U2hhcGUoZWxlbWVudCk7XG4gICAgICAgIHNoYXBlID0gW107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInRleHRcIjoge1xuICAgICAgICAvLyBqdXN0IHRvIGVuc3VyZSB3ZSBkb24ndCByZWdlbmVyYXRlIGVsZW1lbnQuY2FudmFzIG9uIHJlcmVuZGVyc1xuICAgICAgICBzaGFwZSA9IFtdO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgc2hhcGVDYWNoZS5zZXQoZWxlbWVudCwgc2hhcGUpO1xuICB9XG59O1xuXG5jb25zdCBnZW5lcmF0ZUVsZW1lbnRXaXRoQ2FudmFzID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHNjZW5lU3RhdGU/OiBTY2VuZVN0YXRlLFxuKSA9PiB7XG4gIGNvbnN0IHpvb206IFpvb20gPSBzY2VuZVN0YXRlID8gc2NlbmVTdGF0ZS56b29tIDogZGVmYXVsdEFwcFN0YXRlLnpvb207XG4gIGNvbnN0IHByZXZFbGVtZW50V2l0aENhbnZhcyA9IGVsZW1lbnRXaXRoQ2FudmFzQ2FjaGUuZ2V0KGVsZW1lbnQpO1xuICBjb25zdCBzaG91bGRSZWdlbmVyYXRlQmVjYXVzZVpvb20gPVxuICAgIHByZXZFbGVtZW50V2l0aENhbnZhcyAmJlxuICAgIHByZXZFbGVtZW50V2l0aENhbnZhcy5jYW52YXNab29tICE9PSB6b29tLnZhbHVlICYmXG4gICAgIXNjZW5lU3RhdGU/LnNob3VsZENhY2hlSWdub3JlWm9vbTtcbiAgaWYgKCFwcmV2RWxlbWVudFdpdGhDYW52YXMgfHwgc2hvdWxkUmVnZW5lcmF0ZUJlY2F1c2Vab29tKSB7XG4gICAgY29uc3QgZWxlbWVudFdpdGhDYW52YXMgPSBnZW5lcmF0ZUVsZW1lbnRDYW52YXMoZWxlbWVudCwgem9vbSk7XG5cbiAgICBlbGVtZW50V2l0aENhbnZhc0NhY2hlLnNldChlbGVtZW50LCBlbGVtZW50V2l0aENhbnZhcyk7XG5cbiAgICByZXR1cm4gZWxlbWVudFdpdGhDYW52YXM7XG4gIH1cbiAgcmV0dXJuIHByZXZFbGVtZW50V2l0aENhbnZhcztcbn07XG5cbmNvbnN0IGRyYXdFbGVtZW50RnJvbUNhbnZhcyA9IChcbiAgZWxlbWVudFdpdGhDYW52YXM6IEV4Y2FsaWRyYXdFbGVtZW50V2l0aENhbnZhcyxcbiAgcmM6IFJvdWdoQ2FudmFzLFxuICBjb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIHNjZW5lU3RhdGU6IFNjZW5lU3RhdGUsXG4pID0+IHtcbiAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRXaXRoQ2FudmFzLmVsZW1lbnQ7XG4gIGNvbnN0IHBhZGRpbmcgPSBnZXRDYW52YXNQYWRkaW5nKGVsZW1lbnQpO1xuICBsZXQgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcblxuICAvLyBGcmVlIGRyYXcgZWxlbWVudHMgd2lsbCBvdGhlcndpc2UgXCJzaHVmZmxlXCIgYXMgdGhlIG1pbiB4IGFuZCB5IGNoYW5nZVxuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICB4MSA9IE1hdGguZmxvb3IoeDEpO1xuICAgIHgyID0gTWF0aC5jZWlsKHgyKTtcbiAgICB5MSA9IE1hdGguZmxvb3IoeTEpO1xuICAgIHkyID0gTWF0aC5jZWlsKHkyKTtcbiAgfVxuXG4gIGNvbnN0IGN4ID0gKCh4MSArIHgyKSAvIDIgKyBzY2VuZVN0YXRlLnNjcm9sbFgpICogd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gIGNvbnN0IGN5ID0gKCh5MSArIHkyKSAvIDIgKyBzY2VuZVN0YXRlLnNjcm9sbFkpICogd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gIGNvbnRleHQuc2F2ZSgpO1xuICBjb250ZXh0LnNjYWxlKDEgLyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgMSAvIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29udGV4dC50cmFuc2xhdGUoY3gsIGN5KTtcbiAgY29udGV4dC5yb3RhdGUoZWxlbWVudC5hbmdsZSk7XG5cbiAgY29udGV4dC5kcmF3SW1hZ2UoXG4gICAgZWxlbWVudFdpdGhDYW52YXMuY2FudmFzISxcbiAgICAoLSh4MiAtIHgxKSAvIDIpICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gLVxuICAgICAgKHBhZGRpbmcgKiBlbGVtZW50V2l0aENhbnZhcy5jYW52YXNab29tKSAvIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhc1pvb20sXG4gICAgKC0oeTIgLSB5MSkgLyAyKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIC1cbiAgICAgIChwYWRkaW5nICogZWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSkgLyBlbGVtZW50V2l0aENhbnZhcy5jYW52YXNab29tLFxuICAgIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcyEud2lkdGggLyBlbGVtZW50V2l0aENhbnZhcy5jYW52YXNab29tLFxuICAgIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcyEuaGVpZ2h0IC8gZWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSxcbiAgKTtcbiAgY29udGV4dC5yZXN0b3JlKCk7XG5cbiAgLy8gQ2xlYXIgdGhlIG5lc3RlZCBlbGVtZW50IHdlIGFwcGVuZGVkIHRvIHRoZSBET01cbn07XG5cbmV4cG9ydCBjb25zdCByZW5kZXJFbGVtZW50ID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHJjOiBSb3VnaENhbnZhcyxcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICByZW5kZXJPcHRpbWl6YXRpb25zOiBib29sZWFuLFxuICBzY2VuZVN0YXRlOiBTY2VuZVN0YXRlLFxuKSA9PiB7XG4gIGNvbnN0IGdlbmVyYXRvciA9IHJjLmdlbmVyYXRvcjtcbiAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICBjYXNlIFwic2VsZWN0aW9uXCI6IHtcbiAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgY29udGV4dC50cmFuc2xhdGUoXG4gICAgICAgIGVsZW1lbnQueCArIHNjZW5lU3RhdGUuc2Nyb2xsWCxcbiAgICAgICAgZWxlbWVudC55ICsgc2NlbmVTdGF0ZS5zY3JvbGxZLFxuICAgICAgKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gXCJyZ2JhKDAsIDAsIDI1NSwgMC4xMClcIjtcbiAgICAgIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgZWxlbWVudC53aWR0aCwgZWxlbWVudC5oZWlnaHQpO1xuICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgIGdlbmVyYXRlRWxlbWVudFNoYXBlKGVsZW1lbnQsIGdlbmVyYXRvcik7XG5cbiAgICAgIGlmIChyZW5kZXJPcHRpbWl6YXRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaXRoQ2FudmFzID0gZ2VuZXJhdGVFbGVtZW50V2l0aENhbnZhcyhcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIHNjZW5lU3RhdGUsXG4gICAgICAgICk7XG4gICAgICAgIGRyYXdFbGVtZW50RnJvbUNhbnZhcyhlbGVtZW50V2l0aENhbnZhcywgcmMsIGNvbnRleHQsIHNjZW5lU3RhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgICAgICAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyICsgc2NlbmVTdGF0ZS5zY3JvbGxYO1xuICAgICAgICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDIgKyBzY2VuZVN0YXRlLnNjcm9sbFk7XG4gICAgICAgIGNvbnN0IHNoaWZ0WCA9ICh4MiAtIHgxKSAvIDIgLSAoZWxlbWVudC54IC0geDEpO1xuICAgICAgICBjb25zdCBzaGlmdFkgPSAoeTIgLSB5MSkgLyAyIC0gKGVsZW1lbnQueSAtIHkxKTtcbiAgICAgICAgY29udGV4dC5zYXZlKCk7XG4gICAgICAgIGNvbnRleHQudHJhbnNsYXRlKGN4LCBjeSk7XG4gICAgICAgIGNvbnRleHQucm90YXRlKGVsZW1lbnQuYW5nbGUpO1xuICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZSgtc2hpZnRYLCAtc2hpZnRZKTtcbiAgICAgICAgZHJhd0VsZW1lbnRPbkNhbnZhcyhlbGVtZW50LCByYywgY29udGV4dCk7XG4gICAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgY2FzZSBcImVsbGlwc2VcIjpcbiAgICBjYXNlIFwibGluZVwiOlxuICAgIGNhc2UgXCJhcnJvd1wiOlxuICAgIGNhc2UgXCJ0ZXh0XCI6IHtcbiAgICAgIGdlbmVyYXRlRWxlbWVudFNoYXBlKGVsZW1lbnQsIGdlbmVyYXRvcik7XG4gICAgICBpZiAocmVuZGVyT3B0aW1pemF0aW9ucykge1xuICAgICAgICBjb25zdCBlbGVtZW50V2l0aENhbnZhcyA9IGdlbmVyYXRlRWxlbWVudFdpdGhDYW52YXMoXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICBzY2VuZVN0YXRlLFxuICAgICAgICApO1xuICAgICAgICBkcmF3RWxlbWVudEZyb21DYW52YXMoZWxlbWVudFdpdGhDYW52YXMsIHJjLCBjb250ZXh0LCBzY2VuZVN0YXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMiArIHNjZW5lU3RhdGUuc2Nyb2xsWDtcbiAgICAgICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyICsgc2NlbmVTdGF0ZS5zY3JvbGxZO1xuICAgICAgICBjb25zdCBzaGlmdFggPSAoeDIgLSB4MSkgLyAyIC0gKGVsZW1lbnQueCAtIHgxKTtcbiAgICAgICAgY29uc3Qgc2hpZnRZID0gKHkyIC0geTEpIC8gMiAtIChlbGVtZW50LnkgLSB5MSk7XG4gICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZShjeCwgY3kpO1xuICAgICAgICBjb250ZXh0LnJvdGF0ZShlbGVtZW50LmFuZ2xlKTtcbiAgICAgICAgY29udGV4dC50cmFuc2xhdGUoLXNoaWZ0WCwgLXNoaWZ0WSk7XG4gICAgICAgIGRyYXdFbGVtZW50T25DYW52YXMoZWxlbWVudCwgcmMsIGNvbnRleHQpO1xuICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaW1wbGVtZW50ZWQgdHlwZSAke2VsZW1lbnQudHlwZX1gKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IHJvdWdoU1ZHRHJhd1dpdGhQcmVjaXNpb24gPSAoXG4gIHJzdmc6IFJvdWdoU1ZHLFxuICBkcmF3YWJsZTogRHJhd2FibGUsXG4gIHByZWNpc2lvbj86IG51bWJlcixcbikgPT4ge1xuICBpZiAodHlwZW9mIHByZWNpc2lvbiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiByc3ZnLmRyYXcoZHJhd2FibGUpO1xuICB9XG4gIGNvbnN0IHBzaGFwZTogRHJhd2FibGUgPSB7XG4gICAgc2V0czogZHJhd2FibGUuc2V0cyxcbiAgICBzaGFwZTogZHJhd2FibGUuc2hhcGUsXG4gICAgb3B0aW9uczogeyAuLi5kcmF3YWJsZS5vcHRpb25zLCBmaXhlZERlY2ltYWxQbGFjZURpZ2l0czogcHJlY2lzaW9uIH0sXG4gIH07XG4gIHJldHVybiByc3ZnLmRyYXcocHNoYXBlKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW5kZXJFbGVtZW50VG9TdmcgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgcnN2ZzogUm91Z2hTVkcsXG4gIHN2Z1Jvb3Q6IFNWR0VsZW1lbnQsXG4gIG9mZnNldFg/OiBudW1iZXIsXG4gIG9mZnNldFk/OiBudW1iZXIsXG4pID0+IHtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgY29uc3QgY3ggPSAoeDIgLSB4MSkgLyAyIC0gKGVsZW1lbnQueCAtIHgxKTtcbiAgY29uc3QgY3kgPSAoeTIgLSB5MSkgLyAyIC0gKGVsZW1lbnQueSAtIHkxKTtcbiAgY29uc3QgZGVncmVlID0gKDE4MCAqIGVsZW1lbnQuYW5nbGUpIC8gTWF0aC5QSTtcbiAgY29uc3QgZ2VuZXJhdG9yID0gcnN2Zy5nZW5lcmF0b3I7XG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInNlbGVjdGlvblwiOiB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGlzIHVzZWQgb25seSBkdXJpbmcgZWRpdGluZyBleHBlcmllbmNlLCB3aGljaCBpcyBjYW52YXMgYmFzZWQsXG4gICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3Rpb24gcmVuZGVyaW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNWR1wiKTtcbiAgICB9XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgY2FzZSBcImVsbGlwc2VcIjoge1xuICAgICAgZ2VuZXJhdGVFbGVtZW50U2hhcGUoZWxlbWVudCwgZ2VuZXJhdG9yKTtcbiAgICAgIGNvbnN0IG5vZGUgPSByb3VnaFNWR0RyYXdXaXRoUHJlY2lzaW9uKFxuICAgICAgICByc3ZnLFxuICAgICAgICBnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkgYXMgRHJhd2FibGUsXG4gICAgICAgIE1BWF9ERUNJTUFMU19GT1JfU1ZHX0VYUE9SVCxcbiAgICAgICk7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gZWxlbWVudC5vcGFjaXR5IC8gMTAwO1xuICAgICAgaWYgKG9wYWNpdHkgIT09IDEpIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImZpbGwtb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgfVxuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2UtbGluZWNhcFwiLCBcInJvdW5kXCIpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIFwidHJhbnNmb3JtXCIsXG4gICAgICAgIGB0cmFuc2xhdGUoJHtvZmZzZXRYIHx8IDB9ICR7XG4gICAgICAgICAgb2Zmc2V0WSB8fCAwXG4gICAgICAgIH0pIHJvdGF0ZSgke2RlZ3JlZX0gJHtjeH0gJHtjeX0pYCxcbiAgICAgICk7XG4gICAgICBzdmdSb290LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgY2FzZSBcImFycm93XCI6IHtcbiAgICAgIGdlbmVyYXRlRWxlbWVudFNoYXBlKGVsZW1lbnQsIGdlbmVyYXRvcik7XG4gICAgICBjb25zdCBncm91cCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJnXCIpO1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgICAgIGdyb3VwLnNldEF0dHJpYnV0ZShcInN0cm9rZS1saW5lY2FwXCIsIFwicm91bmRcIik7XG5cbiAgICAgIChnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkgYXMgRHJhd2FibGVbXSkuZm9yRWFjaCgoc2hhcGUpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHJvdWdoU1ZHRHJhd1dpdGhQcmVjaXNpb24oXG4gICAgICAgICAgcnN2ZyxcbiAgICAgICAgICBzaGFwZSxcbiAgICAgICAgICBNQVhfREVDSU1BTFNfRk9SX1NWR19FWFBPUlQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZmlsbC1vcGFjaXR5XCIsIGAke29wYWNpdHl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgICAgb2Zmc2V0WSB8fCAwXG4gICAgICAgICAgfSkgcm90YXRlKCR7ZGVncmVlfSAke2N4fSAke2N5fSlgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZWxlbWVudC50eXBlID09PSBcImxpbmVcIiAmJlxuICAgICAgICAgIGlzUGF0aEFMb29wKGVsZW1lbnQucG9pbnRzKSAmJlxuICAgICAgICAgIGVsZW1lbnQuYmFja2dyb3VuZENvbG9yICE9PSBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgfSk7XG4gICAgICBzdmdSb290LmFwcGVuZENoaWxkKGdyb3VwKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiZnJlZWRyYXdcIjoge1xuICAgICAgZ2VuZXJhdGVGcmVlRHJhd1NoYXBlKGVsZW1lbnQpO1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZ1wiKTtcbiAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICB9KSByb3RhdGUoJHtkZWdyZWV9ICR7Y3h9ICR7Y3l9KWAsXG4gICAgICApO1xuICAgICAgY29uc3QgcGF0aCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJwYXRoXCIpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJub25lXCIpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIGVsZW1lbnQuc3Ryb2tlQ29sb3IpO1xuICAgICAgcGF0aC5zZXRBdHRyaWJ1dGUoXCJkXCIsIGdldEZyZWVEcmF3U3ZnUGF0aChlbGVtZW50KSk7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKHBhdGgpO1xuICAgICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBvcGFjaXR5ID0gZWxlbWVudC5vcGFjaXR5IC8gMTAwO1xuICAgICAgICBjb25zdCBub2RlID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImdcIik7XG4gICAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZmlsbC1vcGFjaXR5XCIsIGAke29wYWNpdHl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgICAgb2Zmc2V0WSB8fCAwXG4gICAgICAgICAgfSkgcm90YXRlKCR7ZGVncmVlfSAke2N4fSAke2N5fSlgLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGVsZW1lbnQudGV4dC5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQgLyBsaW5lcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsT2Zmc2V0ID0gZWxlbWVudC5oZWlnaHQgLSBlbGVtZW50LmJhc2VsaW5lO1xuICAgICAgICBjb25zdCBob3Jpem9udGFsT2Zmc2V0ID1cbiAgICAgICAgICBlbGVtZW50LnRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIlxuICAgICAgICAgICAgPyBlbGVtZW50LndpZHRoIC8gMlxuICAgICAgICAgICAgOiBlbGVtZW50LnRleHRBbGlnbiA9PT0gXCJyaWdodFwiXG4gICAgICAgICAgICA/IGVsZW1lbnQud2lkdGhcbiAgICAgICAgICAgIDogMDtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gaXNSVEwoZWxlbWVudC50ZXh0KSA/IFwicnRsXCIgOiBcImx0clwiO1xuICAgICAgICBjb25zdCB0ZXh0QW5jaG9yID1cbiAgICAgICAgICBlbGVtZW50LnRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIlxuICAgICAgICAgICAgPyBcIm1pZGRsZVwiXG4gICAgICAgICAgICA6IGVsZW1lbnQudGV4dEFsaWduID09PSBcInJpZ2h0XCIgfHwgZGlyZWN0aW9uID09PSBcInJ0bFwiXG4gICAgICAgICAgICA/IFwiZW5kXCJcbiAgICAgICAgICAgIDogXCJzdGFydFwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJ0ZXh0XCIpO1xuICAgICAgICAgIHRleHQudGV4dENvbnRlbnQgPSBsaW5lc1tpXTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcInhcIiwgYCR7aG9yaXpvbnRhbE9mZnNldH1gKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcInlcIiwgYCR7KGkgKyAxKSAqIGxpbmVIZWlnaHQgLSB2ZXJ0aWNhbE9mZnNldH1gKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcImZvbnQtZmFtaWx5XCIsIGdldEZvbnRGYW1pbHlTdHJpbmcoZWxlbWVudCkpO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwiZm9udC1zaXplXCIsIGAke2VsZW1lbnQuZm9udFNpemV9cHhgKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgZWxlbWVudC5zdHJva2VDb2xvcik7XG4gICAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoXCJ0ZXh0LWFuY2hvclwiLCB0ZXh0QW5jaG9yKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwid2hpdGUtc3BhY2U6IHByZTtcIik7XG4gICAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoXCJkaXJlY3Rpb25cIiwgZGlyZWN0aW9uKTtcbiAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5pbXBsZW1lbnRlZCB0eXBlICR7ZWxlbWVudC50eXBlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHBhdGhzQ2FjaGUgPSBuZXcgV2Vha01hcDxFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LCBQYXRoMkQ+KFtdKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRnJlZURyYXdTaGFwZShlbGVtZW50OiBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50KSB7XG4gIGNvbnN0IHN2Z1BhdGhEYXRhID0gZ2V0RnJlZURyYXdTdmdQYXRoKGVsZW1lbnQpO1xuICBjb25zdCBwYXRoID0gbmV3IFBhdGgyRChzdmdQYXRoRGF0YSk7XG4gIHBhdGhzQ2FjaGUuc2V0KGVsZW1lbnQsIHBhdGgpO1xuICByZXR1cm4gcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZyZWVEcmF3UGF0aDJEKGVsZW1lbnQ6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQpIHtcbiAgcmV0dXJuIHBhdGhzQ2FjaGUuZ2V0KGVsZW1lbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJlZURyYXdTdmdQYXRoKGVsZW1lbnQ6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQpIHtcbiAgY29uc3QgaW5wdXRQb2ludHMgPSBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmVcbiAgICA/IGVsZW1lbnQucG9pbnRzXG4gICAgOiBlbGVtZW50LnBvaW50cy5sZW5ndGhcbiAgICA/IGVsZW1lbnQucG9pbnRzLm1hcCgoW3gsIHldLCBpKSA9PiBbeCwgeSwgZWxlbWVudC5wcmVzc3VyZXNbaV1dKVxuICAgIDogW1swLCAwLCAwXV07XG5cbiAgLy8gQ29uc2lkZXIgY2hhbmdpbmcgdGhlIG9wdGlvbnMgZm9yIHNpbXVsYXRlZCBwcmVzc3VyZSB2cyByZWFsIHByZXNzdXJlXG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgc2ltdWxhdGVQcmVzc3VyZTogZWxlbWVudC5zaW11bGF0ZVByZXNzdXJlLFxuICAgIHNpemU6IGVsZW1lbnQuc3Ryb2tlV2lkdGggKiA2LFxuICAgIHRoaW5uaW5nOiAwLjUsXG4gICAgc21vb3RoaW5nOiAwLjUsXG4gICAgc3RyZWFtbGluZTogMC41LFxuICAgIGVhc2luZzogKHQ6IG51bWJlcikgPT4gdCAqICgyIC0gdCksXG4gICAgbGFzdDogdHJ1ZSxcbiAgfTtcblxuICBjb25zdCBwb2ludHMgPSBnZXRGcmVlRHJhd1NoYXBlKGlucHV0UG9pbnRzIGFzIG51bWJlcltdW10sIG9wdGlvbnMpO1xuICBjb25zdCBkOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG5cbiAgbGV0IFtwMCwgcDFdID0gcG9pbnRzO1xuXG4gIGQucHVzaChcIk1cIiwgcDBbMF0sIHAwWzFdLCBcIlFcIik7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICBkLnB1c2gocDBbMF0sIHAwWzFdLCAocDBbMF0gKyBwMVswXSkgLyAyLCAocDBbMV0gKyBwMVsxXSkgLyAyKTtcbiAgICBwMCA9IHAxO1xuICAgIHAxID0gcG9pbnRzW2ldO1xuICB9XG5cbiAgcDEgPSBwb2ludHNbMF07XG4gIGQucHVzaChwMFswXSwgcDBbMV0sIChwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSArIHAxWzFdKSAvIDIpO1xuXG4gIGQucHVzaChcIlpcIik7XG5cbiAgcmV0dXJuIGQuam9pbihcIiBcIik7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../renderer/renderElement.ts\n");
2549
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getShapeForElement\": () => (/* binding */ getShapeForElement),\n/* harmony export */ \"invalidateShapeForElement\": () => (/* binding */ invalidateShapeForElement),\n/* harmony export */ \"generateRoughOptions\": () => (/* binding */ generateRoughOptions),\n/* harmony export */ \"renderElement\": () => (/* binding */ renderElement),\n/* harmony export */ \"renderElementToSvg\": () => (/* binding */ renderElementToSvg),\n/* harmony export */ \"pathsCache\": () => (/* binding */ pathsCache),\n/* harmony export */ \"generateFreeDrawShape\": () => (/* binding */ generateFreeDrawShape),\n/* harmony export */ \"getFreeDrawPath2D\": () => (/* binding */ getFreeDrawPath2D),\n/* harmony export */ \"getFreeDrawSvgPath\": () => (/* binding */ getFreeDrawSvgPath)\n/* harmony export */ });\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var perfect_freehand__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! perfect-freehand */ \"../../../node_modules/perfect-freehand/dist/esm/index.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\r\nconst getDashArrayDashed = (strokeWidth) => [8, 8 + strokeWidth];\r\nconst getDashArrayDotted = (strokeWidth) => [1.5, 6 + strokeWidth];\r\nconst getCanvasPadding = (element) => element.type === \"freedraw\" ? element.strokeWidth * 12 : 20;\r\nconst generateElementCanvas = (element, zoom) => {\r\n const canvas = document.createElement(\"canvas\");\r\n const context = canvas.getContext(\"2d\");\r\n const padding = getCanvasPadding(element);\r\n let canvasOffsetX = 0;\r\n let canvasOffsetY = 0;\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isLinearElement)(element) || (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)) {\r\n let [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n x1 = Math.floor(x1);\r\n x2 = Math.ceil(x2);\r\n y1 = Math.floor(y1);\r\n y2 = Math.ceil(y2);\r\n canvas.width =\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(x1, x2) * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n canvas.height =\r\n (0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(y1, y2) * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n canvasOffsetX =\r\n element.x > x1\r\n ? Math.floor((0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(element.x, x1)) *\r\n window.devicePixelRatio *\r\n zoom.value\r\n : 0;\r\n canvasOffsetY =\r\n element.y > y1\r\n ? Math.floor((0,_utils__WEBPACK_IMPORTED_MODULE_2__.distance)(element.y, y1)) *\r\n window.devicePixelRatio *\r\n zoom.value\r\n : 0;\r\n context.translate(canvasOffsetX, canvasOffsetY);\r\n }\r\n else {\r\n canvas.width =\r\n element.width * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n canvas.height =\r\n element.height * window.devicePixelRatio * zoom.value +\r\n padding * zoom.value * 2;\r\n }\r\n context.save();\r\n context.translate(padding * zoom.value, padding * zoom.value);\r\n context.scale(window.devicePixelRatio * zoom.value, window.devicePixelRatio * zoom.value);\r\n const rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_4__.default.canvas(canvas);\r\n drawElementOnCanvas(element, rc, context);\r\n context.restore();\r\n return {\r\n element,\r\n canvas,\r\n canvasZoom: zoom.value,\r\n canvasOffsetX,\r\n canvasOffsetY,\r\n };\r\n};\r\nconst drawElementOnCanvas = (element, rc, context) => {\r\n context.globalAlpha = element.opacity / 100;\r\n switch (element.type) {\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\": {\r\n context.lineJoin = \"round\";\r\n context.lineCap = \"round\";\r\n rc.draw(getShapeForElement(element));\r\n break;\r\n }\r\n case \"arrow\":\r\n case \"line\": {\r\n context.lineJoin = \"round\";\r\n context.lineCap = \"round\";\r\n getShapeForElement(element).forEach((shape) => {\r\n rc.draw(shape);\r\n });\r\n break;\r\n }\r\n case \"freedraw\": {\r\n // Draw directly to canvas\r\n context.save();\r\n context.fillStyle = element.strokeColor;\r\n const path = getFreeDrawPath2D(element);\r\n context.fillStyle = element.strokeColor;\r\n context.fill(path);\r\n context.restore();\r\n break;\r\n }\r\n default: {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\r\n const rtl = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.isRTL)(element.text);\r\n const shouldTemporarilyAttach = rtl && !context.canvas.isConnected;\r\n if (shouldTemporarilyAttach) {\r\n // to correctly render RTL text mixed with LTR, we have to append it\r\n // to the DOM\r\n document.body.appendChild(context.canvas);\r\n }\r\n context.canvas.setAttribute(\"dir\", rtl ? \"rtl\" : \"ltr\");\r\n context.save();\r\n context.font = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(element);\r\n context.fillStyle = element.strokeColor;\r\n context.textAlign = element.textAlign;\r\n // Canvas does not support multiline text by default\r\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\r\n const lineHeight = element.height / lines.length;\r\n const verticalOffset = element.height - element.baseline;\r\n const horizontalOffset = element.textAlign === \"center\"\r\n ? element.width / 2\r\n : element.textAlign === \"right\"\r\n ? element.width\r\n : 0;\r\n for (let index = 0; index < lines.length; index++) {\r\n context.fillText(lines[index], horizontalOffset, (index + 1) * lineHeight - verticalOffset);\r\n }\r\n context.restore();\r\n if (shouldTemporarilyAttach) {\r\n context.canvas.remove();\r\n }\r\n }\r\n else {\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n }\r\n context.globalAlpha = 1;\r\n};\r\nconst elementWithCanvasCache = new WeakMap();\r\nconst shapeCache = new WeakMap();\r\nconst getShapeForElement = (element) => shapeCache.get(element);\r\nconst invalidateShapeForElement = (element) => shapeCache.delete(element);\r\nconst generateRoughOptions = (element, continuousPath = false) => {\r\n const options = {\r\n seed: element.seed,\r\n strokeLineDash: element.strokeStyle === \"dashed\"\r\n ? getDashArrayDashed(element.strokeWidth)\r\n : element.strokeStyle === \"dotted\"\r\n ? getDashArrayDotted(element.strokeWidth)\r\n : undefined,\r\n // for non-solid strokes, disable multiStroke because it tends to make\r\n // dashes/dots overlay each other\r\n disableMultiStroke: element.strokeStyle !== \"solid\",\r\n // for non-solid strokes, increase the width a bit to make it visually\r\n // similar to solid strokes, because we're also disabling multiStroke\r\n strokeWidth: element.strokeStyle !== \"solid\"\r\n ? element.strokeWidth + 0.5\r\n : element.strokeWidth,\r\n // when increasing strokeWidth, we must explicitly set fillWeight and\r\n // hachureGap because if not specified, roughjs uses strokeWidth to\r\n // calculate them (and we don't want the fills to be modified)\r\n fillWeight: element.strokeWidth / 2,\r\n hachureGap: element.strokeWidth * 4,\r\n roughness: element.roughness,\r\n stroke: element.strokeColor,\r\n preserveVertices: continuousPath,\r\n };\r\n switch (element.type) {\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\": {\r\n options.fillStyle = element.fillStyle;\r\n options.fill =\r\n element.backgroundColor === \"transparent\"\r\n ? undefined\r\n : element.backgroundColor;\r\n if (element.type === \"ellipse\") {\r\n options.curveFitting = 1;\r\n }\r\n return options;\r\n }\r\n case \"line\": {\r\n if ((0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points)) {\r\n options.fillStyle = element.fillStyle;\r\n options.fill =\r\n element.backgroundColor === \"transparent\"\r\n ? undefined\r\n : element.backgroundColor;\r\n }\r\n return options;\r\n }\r\n case \"freedraw\":\r\n case \"arrow\":\r\n return options;\r\n default: {\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n};\r\n/**\r\n * Generates the element's shape and puts it into the cache.\r\n * @param element\r\n * @param generator\r\n */\r\nconst generateElementShape = (element, generator) => {\r\n let shape = shapeCache.get(element) || null;\r\n if (!shape) {\r\n elementWithCanvasCache.delete(element);\r\n switch (element.type) {\r\n case \"rectangle\":\r\n if (element.strokeSharpness === \"round\") {\r\n const w = element.width;\r\n const h = element.height;\r\n const r = Math.min(w, h) * 0.25;\r\n shape = generator.path(`M ${r} 0 L ${w - r} 0 Q ${w} 0, ${w} ${r} L ${w} ${h - r} Q ${w} ${h}, ${w - r} ${h} L ${r} ${h} Q 0 ${h}, 0 ${h - r} L 0 ${r} Q 0 0, ${r} 0`, generateRoughOptions(element, true));\r\n }\r\n else {\r\n shape = generator.rectangle(0, 0, element.width, element.height, generateRoughOptions(element));\r\n }\r\n break;\r\n case \"diamond\": {\r\n const [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY,] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getDiamondPoints)(element);\r\n shape = generator.polygon([\r\n [topX, topY],\r\n [rightX, rightY],\r\n [bottomX, bottomY],\r\n [leftX, leftY],\r\n ], generateRoughOptions(element));\r\n break;\r\n }\r\n case \"ellipse\":\r\n shape = generator.ellipse(element.width / 2, element.height / 2, element.width, element.height, generateRoughOptions(element));\r\n break;\r\n case \"line\":\r\n case \"arrow\": {\r\n const options = generateRoughOptions(element);\r\n // points array can be empty in the beginning, so it is important to add\r\n // initial position to it\r\n const points = element.points.length ? element.points : [[0, 0]];\r\n // curve is always the first element\r\n // this simplifies finding the curve for an element\r\n if (element.strokeSharpness === \"sharp\") {\r\n if (options.fill) {\r\n shape = [generator.polygon(points, options)];\r\n }\r\n else {\r\n shape = [\r\n generator.linearPath(points, options),\r\n ];\r\n }\r\n }\r\n else {\r\n shape = [generator.curve(points, options)];\r\n }\r\n // add lines only in arrow\r\n if (element.type === \"arrow\") {\r\n const { startArrowhead = null, endArrowhead = \"arrow\" } = element;\r\n const getArrowheadShapes = (element, shape, position, arrowhead) => {\r\n const arrowheadPoints = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getArrowheadPoints)(element, shape, position, arrowhead);\r\n if (arrowheadPoints === null) {\r\n return [];\r\n }\r\n // Other arrowheads here...\r\n if (arrowhead === \"dot\") {\r\n const [x, y, r] = arrowheadPoints;\r\n return [\r\n generator.circle(x, y, r, Object.assign(Object.assign({}, options), { fill: element.strokeColor, fillStyle: \"solid\", stroke: \"none\" })),\r\n ];\r\n }\r\n // Arrow arrowheads\r\n const [x2, y2, x3, y3, x4, y4] = arrowheadPoints;\r\n if (element.strokeStyle === \"dotted\") {\r\n // for dotted arrows caps, reduce gap to make it more legible\r\n const dash = getDashArrayDotted(element.strokeWidth - 1);\r\n options.strokeLineDash = [dash[0], dash[1] - 1];\r\n }\r\n else {\r\n // for solid/dashed, keep solid arrow cap\r\n delete options.strokeLineDash;\r\n }\r\n return [\r\n generator.line(x3, y3, x2, y2, options),\r\n generator.line(x4, y4, x2, y2, options),\r\n ];\r\n };\r\n if (startArrowhead !== null) {\r\n const shapes = getArrowheadShapes(element, shape, \"start\", startArrowhead);\r\n shape.push(...shapes);\r\n }\r\n if (endArrowhead !== null) {\r\n if (endArrowhead === undefined) {\r\n // Hey, we have an old arrow here!\r\n }\r\n const shapes = getArrowheadShapes(element, shape, \"end\", endArrowhead);\r\n shape.push(...shapes);\r\n }\r\n }\r\n break;\r\n }\r\n case \"freedraw\": {\r\n generateFreeDrawShape(element);\r\n shape = [];\r\n break;\r\n }\r\n case \"text\": {\r\n // just to ensure we don't regenerate element.canvas on rerenders\r\n shape = [];\r\n break;\r\n }\r\n }\r\n shapeCache.set(element, shape);\r\n }\r\n};\r\nconst generateElementWithCanvas = (element, sceneState) => {\r\n const zoom = sceneState ? sceneState.zoom : defaultAppState.zoom;\r\n const prevElementWithCanvas = elementWithCanvasCache.get(element);\r\n const shouldRegenerateBecauseZoom = prevElementWithCanvas &&\r\n prevElementWithCanvas.canvasZoom !== zoom.value &&\r\n !(sceneState === null || sceneState === void 0 ? void 0 : sceneState.shouldCacheIgnoreZoom);\r\n if (!prevElementWithCanvas || shouldRegenerateBecauseZoom) {\r\n const elementWithCanvas = generateElementCanvas(element, zoom);\r\n elementWithCanvasCache.set(element, elementWithCanvas);\r\n return elementWithCanvas;\r\n }\r\n return prevElementWithCanvas;\r\n};\r\nconst drawElementFromCanvas = (elementWithCanvas, rc, context, sceneState) => {\r\n const element = elementWithCanvas.element;\r\n const padding = getCanvasPadding(element);\r\n let [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n // Free draw elements will otherwise \"shuffle\" as the min x and y change\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isFreeDrawElement)(element)) {\r\n x1 = Math.floor(x1);\r\n x2 = Math.ceil(x2);\r\n y1 = Math.floor(y1);\r\n y2 = Math.ceil(y2);\r\n }\r\n const cx = ((x1 + x2) / 2 + sceneState.scrollX) * window.devicePixelRatio;\r\n const cy = ((y1 + y2) / 2 + sceneState.scrollY) * window.devicePixelRatio;\r\n context.save();\r\n context.scale(1 / window.devicePixelRatio, 1 / window.devicePixelRatio);\r\n context.translate(cx, cy);\r\n context.rotate(element.angle);\r\n context.drawImage(elementWithCanvas.canvas, (-(x2 - x1) / 2) * window.devicePixelRatio -\r\n (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, (-(y2 - y1) / 2) * window.devicePixelRatio -\r\n (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom, elementWithCanvas.canvas.width / elementWithCanvas.canvasZoom, elementWithCanvas.canvas.height / elementWithCanvas.canvasZoom);\r\n context.restore();\r\n // Clear the nested element we appended to the DOM\r\n};\r\nconst renderElement = (element, rc, context, renderOptimizations, sceneState) => {\r\n const generator = rc.generator;\r\n switch (element.type) {\r\n case \"selection\": {\r\n context.save();\r\n context.translate(element.x + sceneState.scrollX, element.y + sceneState.scrollY);\r\n context.fillStyle = \"rgba(0, 0, 255, 0.10)\";\r\n context.fillRect(0, 0, element.width, element.height);\r\n context.restore();\r\n break;\r\n }\r\n case \"freedraw\": {\r\n generateElementShape(element, generator);\r\n if (renderOptimizations) {\r\n const elementWithCanvas = generateElementWithCanvas(element, sceneState);\r\n drawElementFromCanvas(elementWithCanvas, rc, context, sceneState);\r\n }\r\n else {\r\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const cx = (x1 + x2) / 2 + sceneState.scrollX;\r\n const cy = (y1 + y2) / 2 + sceneState.scrollY;\r\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\r\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\r\n context.save();\r\n context.translate(cx, cy);\r\n context.rotate(element.angle);\r\n context.translate(-shiftX, -shiftY);\r\n drawElementOnCanvas(element, rc, context);\r\n context.restore();\r\n }\r\n break;\r\n }\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\":\r\n case \"line\":\r\n case \"arrow\":\r\n case \"text\": {\r\n generateElementShape(element, generator);\r\n if (renderOptimizations) {\r\n const elementWithCanvas = generateElementWithCanvas(element, sceneState);\r\n drawElementFromCanvas(elementWithCanvas, rc, context, sceneState);\r\n }\r\n else {\r\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const cx = (x1 + x2) / 2 + sceneState.scrollX;\r\n const cy = (y1 + y2) / 2 + sceneState.scrollY;\r\n const shiftX = (x2 - x1) / 2 - (element.x - x1);\r\n const shiftY = (y2 - y1) / 2 - (element.y - y1);\r\n context.save();\r\n context.translate(cx, cy);\r\n context.rotate(element.angle);\r\n context.translate(-shiftX, -shiftY);\r\n drawElementOnCanvas(element, rc, context);\r\n context.restore();\r\n }\r\n break;\r\n }\r\n default: {\r\n // @ts-ignore\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n};\r\nconst roughSVGDrawWithPrecision = (rsvg, drawable, precision) => {\r\n if (typeof precision === \"undefined\") {\r\n return rsvg.draw(drawable);\r\n }\r\n const pshape = {\r\n sets: drawable.sets,\r\n shape: drawable.shape,\r\n options: Object.assign(Object.assign({}, drawable.options), { fixedDecimalPlaceDigits: precision }),\r\n };\r\n return rsvg.draw(pshape);\r\n};\r\nconst renderElementToSvg = (element, rsvg, svgRoot, offsetX, offsetY) => {\r\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\r\n const cx = (x2 - x1) / 2 - (element.x - x1);\r\n const cy = (y2 - y1) / 2 - (element.y - y1);\r\n const degree = (180 * element.angle) / Math.PI;\r\n const generator = rsvg.generator;\r\n switch (element.type) {\r\n case \"selection\": {\r\n // Since this is used only during editing experience, which is canvas based,\r\n // this should not happen\r\n throw new Error(\"Selection rendering is not supported for SVG\");\r\n }\r\n case \"rectangle\":\r\n case \"diamond\":\r\n case \"ellipse\": {\r\n generateElementShape(element, generator);\r\n const node = roughSVGDrawWithPrecision(rsvg, getShapeForElement(element), _constants__WEBPACK_IMPORTED_MODULE_7__.MAX_DECIMALS_FOR_SVG_EXPORT);\r\n const opacity = element.opacity / 100;\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"stroke-linecap\", \"round\");\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n svgRoot.appendChild(node);\r\n break;\r\n }\r\n case \"line\":\r\n case \"arrow\": {\r\n generateElementShape(element, generator);\r\n const group = svgRoot.ownerDocument.createElementNS(_utils__WEBPACK_IMPORTED_MODULE_2__.SVG_NS, \"g\");\r\n const opacity = element.opacity / 100;\r\n group.setAttribute(\"stroke-linecap\", \"round\");\r\n getShapeForElement(element).forEach((shape) => {\r\n const node = roughSVGDrawWithPrecision(rsvg, shape, _constants__WEBPACK_IMPORTED_MODULE_7__.MAX_DECIMALS_FOR_SVG_EXPORT);\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n if (element.type === \"line\" &&\r\n (0,_math__WEBPACK_IMPORTED_MODULE_3__.isPathALoop)(element.points) &&\r\n element.backgroundColor !== \"transparent\") {\r\n node.setAttribute(\"fill-rule\", \"evenodd\");\r\n }\r\n group.appendChild(node);\r\n });\r\n svgRoot.appendChild(group);\r\n break;\r\n }\r\n case \"freedraw\": {\r\n generateFreeDrawShape(element);\r\n const opacity = element.opacity / 100;\r\n const node = svgRoot.ownerDocument.createElementNS(_utils__WEBPACK_IMPORTED_MODULE_2__.SVG_NS, \"g\");\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n const path = svgRoot.ownerDocument.createElementNS(_utils__WEBPACK_IMPORTED_MODULE_2__.SVG_NS, \"path\");\r\n node.setAttribute(\"stroke\", \"none\");\r\n node.setAttribute(\"fill\", element.strokeColor);\r\n path.setAttribute(\"d\", getFreeDrawSvgPath(element));\r\n node.appendChild(path);\r\n svgRoot.appendChild(node);\r\n break;\r\n }\r\n default: {\r\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isTextElement)(element)) {\r\n const opacity = element.opacity / 100;\r\n const node = svgRoot.ownerDocument.createElementNS(_utils__WEBPACK_IMPORTED_MODULE_2__.SVG_NS, \"g\");\r\n if (opacity !== 1) {\r\n node.setAttribute(\"stroke-opacity\", `${opacity}`);\r\n node.setAttribute(\"fill-opacity\", `${opacity}`);\r\n }\r\n node.setAttribute(\"transform\", `translate(${offsetX || 0} ${offsetY || 0}) rotate(${degree} ${cx} ${cy})`);\r\n const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\r\n const lineHeight = element.height / lines.length;\r\n const verticalOffset = element.height - element.baseline;\r\n const horizontalOffset = element.textAlign === \"center\"\r\n ? element.width / 2\r\n : element.textAlign === \"right\"\r\n ? element.width\r\n : 0;\r\n const direction = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.isRTL)(element.text) ? \"rtl\" : \"ltr\";\r\n const textAnchor = element.textAlign === \"center\"\r\n ? \"middle\"\r\n : element.textAlign === \"right\" || direction === \"rtl\"\r\n ? \"end\"\r\n : \"start\";\r\n for (let i = 0; i < lines.length; i++) {\r\n const text = svgRoot.ownerDocument.createElementNS(_utils__WEBPACK_IMPORTED_MODULE_2__.SVG_NS, \"text\");\r\n text.textContent = lines[i];\r\n text.setAttribute(\"x\", `${horizontalOffset}`);\r\n text.setAttribute(\"y\", `${(i + 1) * lineHeight - verticalOffset}`);\r\n text.setAttribute(\"font-family\", (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontFamilyString)(element));\r\n text.setAttribute(\"font-size\", `${element.fontSize}px`);\r\n text.setAttribute(\"fill\", element.strokeColor);\r\n text.setAttribute(\"text-anchor\", textAnchor);\r\n text.setAttribute(\"style\", \"white-space: pre;\");\r\n text.setAttribute(\"direction\", direction);\r\n node.appendChild(text);\r\n }\r\n svgRoot.appendChild(node);\r\n }\r\n else {\r\n // @ts-ignore\r\n throw new Error(`Unimplemented type ${element.type}`);\r\n }\r\n }\r\n }\r\n};\r\nconst pathsCache = new WeakMap([]);\r\nfunction generateFreeDrawShape(element) {\r\n const svgPathData = getFreeDrawSvgPath(element);\r\n const path = new Path2D(svgPathData);\r\n pathsCache.set(element, path);\r\n return path;\r\n}\r\nfunction getFreeDrawPath2D(element) {\r\n return pathsCache.get(element);\r\n}\r\nfunction getFreeDrawSvgPath(element) {\r\n // If input points are empty (should they ever be?) return a dot\r\n const inputPoints = element.simulatePressure\r\n ? element.points\r\n : element.points.length\r\n ? element.points.map(([x, y], i) => [x, y, element.pressures[i]])\r\n : [[0, 0, 0.5]];\r\n // Consider changing the options for simulated pressure vs real pressure\r\n const options = {\r\n simulatePressure: element.simulatePressure,\r\n size: element.strokeWidth * 4.25,\r\n thinning: 0.6,\r\n smoothing: 0.5,\r\n streamline: 0.5,\r\n easing: (t) => Math.sin((t * Math.PI) / 2),\r\n last: false,\r\n };\r\n return getSvgPathFromStroke((0,perfect_freehand__WEBPACK_IMPORTED_MODULE_6__.getStroke)(inputPoints, options));\r\n}\r\nfunction med(A, B) {\r\n return [(A[0] + B[0]) / 2, (A[1] + B[1]) / 2];\r\n}\r\n// Trim SVG path data so number are each two decimal points. This\r\n// improves SVG exports, and prevents rendering errors on points\r\n// with long decimals.\r\nconst TO_FIXED_PRECISION = /(\\s?[A-Z]?,?-?[0-9]*\\.[0-9]{0,2})(([0-9]|e|-)*)/g;\r\nfunction getSvgPathFromStroke(points) {\r\n if (!points.length) {\r\n return \"\";\r\n }\r\n const max = points.length - 1;\r\n return points\r\n .reduce((acc, point, i, arr) => {\r\n if (i === max) {\r\n acc.push(point, med(point, arr[0]), \"L\", arr[0], \"Z\");\r\n }\r\n else {\r\n acc.push(point, med(point, arr[i + 1]));\r\n }\r\n return acc;\r\n }, [\"M\", points[0], \"Q\"])\r\n .join(\" \")\r\n .replaceAll(TO_FIXED_PRECISION, \"$1\");\r\n}\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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UUFDbEIsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRTlCLE9BQU8sTUFBTTtTQUNWLE1BQU0sQ0FDTCxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUNiLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0wsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6QztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUNELENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FDdEI7U0FDQSxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ1QsVUFBVSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudC50cz9hNmRjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBBcnJvd2hlYWQsXG4gIE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbn0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7XG4gIGlzVGV4dEVsZW1lbnQsXG4gIGlzTGluZWFyRWxlbWVudCxcbiAgaXNGcmVlRHJhd0VsZW1lbnQsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7XG4gIGdldERpYW1vbmRQb2ludHMsXG4gIGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyxcbiAgZ2V0QXJyb3doZWFkUG9pbnRzLFxufSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IFJvdWdoQ2FudmFzIH0gZnJvbSBcInJvdWdoanMvYmluL2NhbnZhc1wiO1xuaW1wb3J0IHsgRHJhd2FibGUsIE9wdGlvbnMgfSBmcm9tIFwicm91Z2hqcy9iaW4vY29yZVwiO1xuaW1wb3J0IHsgUm91Z2hTVkcgfSBmcm9tIFwicm91Z2hqcy9iaW4vc3ZnXCI7XG5pbXBvcnQgeyBSb3VnaEdlbmVyYXRvciB9IGZyb20gXCJyb3VnaGpzL2Jpbi9nZW5lcmF0b3JcIjtcbmltcG9ydCB7IFNjZW5lU3RhdGUgfSBmcm9tIFwiLi4vc2NlbmUvdHlwZXNcIjtcbmltcG9ydCB7XG4gIFNWR19OUyxcbiAgZGlzdGFuY2UsXG4gIGdldEZvbnRTdHJpbmcsXG4gIGdldEZvbnRGYW1pbHlTdHJpbmcsXG4gIGlzUlRMLFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IGlzUGF0aEFMb29wIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IFpvb20gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgZ2V0U3Ryb2tlLCBTdHJva2VPcHRpb25zIH0gZnJvbSBcInBlcmZlY3QtZnJlZWhhbmRcIjtcbmltcG9ydCB7IE1BWF9ERUNJTUFMU19GT1JfU1ZHX0VYUE9SVCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG5cbmNvbnN0IGdldERhc2hBcnJheURhc2hlZCA9IChzdHJva2VXaWR0aDogbnVtYmVyKSA9PiBbOCwgOCArIHN0cm9rZVdpZHRoXTtcblxuY29uc3QgZ2V0RGFzaEFycmF5RG90dGVkID0gKHN0cm9rZVdpZHRoOiBudW1iZXIpID0+IFsxLjUsIDYgKyBzdHJva2VXaWR0aF07XG5cbmNvbnN0IGdldENhbnZhc1BhZGRpbmcgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+XG4gIGVsZW1lbnQudHlwZSA9PT0gXCJmcmVlZHJhd1wiID8gZWxlbWVudC5zdHJva2VXaWR0aCAqIDEyIDogMjA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjYWxpZHJhd0VsZW1lbnRXaXRoQ2FudmFzIHtcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIGNhbnZhc1pvb206IFpvb21bXCJ2YWx1ZVwiXTtcbiAgY2FudmFzT2Zmc2V0WDogbnVtYmVyO1xuICBjYW52YXNPZmZzZXRZOiBudW1iZXI7XG59XG5cbmNvbnN0IGdlbmVyYXRlRWxlbWVudENhbnZhcyA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICB6b29tOiBab29tLFxuKTogRXhjYWxpZHJhd0VsZW1lbnRXaXRoQ2FudmFzID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuICBjb25zdCBwYWRkaW5nID0gZ2V0Q2FudmFzUGFkZGluZyhlbGVtZW50KTtcblxuICBsZXQgY2FudmFzT2Zmc2V0WCA9IDA7XG4gIGxldCBjYW52YXNPZmZzZXRZID0gMDtcblxuICBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpIHx8IGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgbGV0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG5cbiAgICB4MSA9IE1hdGguZmxvb3IoeDEpO1xuICAgIHgyID0gTWF0aC5jZWlsKHgyKTtcbiAgICB5MSA9IE1hdGguZmxvb3IoeTEpO1xuICAgIHkyID0gTWF0aC5jZWlsKHkyKTtcblxuICAgIGNhbnZhcy53aWR0aCA9XG4gICAgICBkaXN0YW5jZSh4MSwgeDIpICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiB6b29tLnZhbHVlICtcbiAgICAgIHBhZGRpbmcgKiB6b29tLnZhbHVlICogMjtcbiAgICBjYW52YXMuaGVpZ2h0ID1cbiAgICAgIGRpc3RhbmNlKHkxLCB5MikgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20udmFsdWUgK1xuICAgICAgcGFkZGluZyAqIHpvb20udmFsdWUgKiAyO1xuXG4gICAgY2FudmFzT2Zmc2V0WCA9XG4gICAgICBlbGVtZW50LnggPiB4MVxuICAgICAgICA/IE1hdGguZmxvb3IoZGlzdGFuY2UoZWxlbWVudC54LCB4MSkpICpcbiAgICAgICAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqXG4gICAgICAgICAgem9vbS52YWx1ZVxuICAgICAgICA6IDA7XG5cbiAgICBjYW52YXNPZmZzZXRZID1cbiAgICAgIGVsZW1lbnQueSA+IHkxXG4gICAgICAgID8gTWF0aC5mbG9vcihkaXN0YW5jZShlbGVtZW50LnksIHkxKSkgKlxuICAgICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICpcbiAgICAgICAgICB6b29tLnZhbHVlXG4gICAgICAgIDogMDtcblxuICAgIGNvbnRleHQudHJhbnNsYXRlKGNhbnZhc09mZnNldFgsIGNhbnZhc09mZnNldFkpO1xuICB9IGVsc2Uge1xuICAgIGNhbnZhcy53aWR0aCA9XG4gICAgICBlbGVtZW50LndpZHRoICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiB6b29tLnZhbHVlICtcbiAgICAgIHBhZGRpbmcgKiB6b29tLnZhbHVlICogMjtcbiAgICBjYW52YXMuaGVpZ2h0ID1cbiAgICAgIGVsZW1lbnQuaGVpZ2h0ICogd2luZG93LmRldmljZVBpeGVsUmF0aW8gKiB6b29tLnZhbHVlICtcbiAgICAgIHBhZGRpbmcgKiB6b29tLnZhbHVlICogMjtcbiAgfVxuXG4gIGNvbnRleHQuc2F2ZSgpO1xuICBjb250ZXh0LnRyYW5zbGF0ZShwYWRkaW5nICogem9vbS52YWx1ZSwgcGFkZGluZyAqIHpvb20udmFsdWUpO1xuICBjb250ZXh0LnNjYWxlKFxuICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICogem9vbS52YWx1ZSxcbiAgICB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAqIHpvb20udmFsdWUsXG4gICk7XG5cbiAgY29uc3QgcmMgPSByb3VnaC5jYW52YXMoY2FudmFzKTtcblxuICBkcmF3RWxlbWVudE9uQ2FudmFzKGVsZW1lbnQsIHJjLCBjb250ZXh0KTtcbiAgY29udGV4dC5yZXN0b3JlKCk7XG4gIHJldHVybiB7XG4gICAgZWxlbWVudCxcbiAgICBjYW52YXMsXG4gICAgY2FudmFzWm9vbTogem9vbS52YWx1ZSxcbiAgICBjYW52YXNPZmZzZXRYLFxuICAgIGNhbnZhc09mZnNldFksXG4gIH07XG59O1xuXG5jb25zdCBkcmF3RWxlbWVudE9uQ2FudmFzID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHJjOiBSb3VnaENhbnZhcyxcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuKSA9PiB7XG4gIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBlbGVtZW50Lm9wYWNpdHkgLyAxMDA7XG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgY2FzZSBcImVsbGlwc2VcIjoge1xuICAgICAgY29udGV4dC5saW5lSm9pbiA9IFwicm91bmRcIjtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9IFwicm91bmRcIjtcbiAgICAgIHJjLmRyYXcoZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpIGFzIERyYXdhYmxlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICBjYXNlIFwibGluZVwiOiB7XG4gICAgICBjb250ZXh0LmxpbmVKb2luID0gXCJyb3VuZFwiO1xuICAgICAgY29udGV4dC5saW5lQ2FwID0gXCJyb3VuZFwiO1xuXG4gICAgICAoZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpIGFzIERyYXdhYmxlW10pLmZvckVhY2goKHNoYXBlKSA9PiB7XG4gICAgICAgIHJjLmRyYXcoc2hhcGUpO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgIC8vIERyYXcgZGlyZWN0bHkgdG8gY2FudmFzXG4gICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gZWxlbWVudC5zdHJva2VDb2xvcjtcblxuICAgICAgY29uc3QgcGF0aCA9IGdldEZyZWVEcmF3UGF0aDJEKGVsZW1lbnQpIGFzIFBhdGgyRDtcblxuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBlbGVtZW50LnN0cm9rZUNvbG9yO1xuICAgICAgY29udGV4dC5maWxsKHBhdGgpO1xuXG4gICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBydGwgPSBpc1JUTChlbGVtZW50LnRleHQpO1xuICAgICAgICBjb25zdCBzaG91bGRUZW1wb3JhcmlseUF0dGFjaCA9IHJ0bCAmJiAhY29udGV4dC5jYW52YXMuaXNDb25uZWN0ZWQ7XG4gICAgICAgIGlmIChzaG91bGRUZW1wb3JhcmlseUF0dGFjaCkge1xuICAgICAgICAgIC8vIHRvIGNvcnJlY3RseSByZW5kZXIgUlRMIHRleHQgbWl4ZWQgd2l0aCBMVFIsIHdlIGhhdmUgdG8gYXBwZW5kIGl0XG4gICAgICAgICAgLy8gdG8gdGhlIERPTVxuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGV4dC5jYW52YXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY2FudmFzLnNldEF0dHJpYnV0ZShcImRpclwiLCBydGwgPyBcInJ0bFwiIDogXCJsdHJcIik7XG4gICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICBjb250ZXh0LmZvbnQgPSBnZXRGb250U3RyaW5nKGVsZW1lbnQpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGVsZW1lbnQuc3Ryb2tlQ29sb3I7XG4gICAgICAgIGNvbnRleHQudGV4dEFsaWduID0gZWxlbWVudC50ZXh0QWxpZ24gYXMgQ2FudmFzVGV4dEFsaWduO1xuXG4gICAgICAgIC8vIENhbnZhcyBkb2VzIG5vdCBzdXBwb3J0IG11bHRpbGluZSB0ZXh0IGJ5IGRlZmF1bHRcbiAgICAgICAgY29uc3QgbGluZXMgPSBlbGVtZW50LnRleHQucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbE9mZnNldCA9IGVsZW1lbnQuaGVpZ2h0IC0gZWxlbWVudC5iYXNlbGluZTtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9mZnNldCA9XG4gICAgICAgICAgZWxlbWVudC50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCJcbiAgICAgICAgICAgID8gZWxlbWVudC53aWR0aCAvIDJcbiAgICAgICAgICAgIDogZWxlbWVudC50ZXh0QWxpZ24gPT09IFwicmlnaHRcIlxuICAgICAgICAgICAgPyBlbGVtZW50LndpZHRoXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb250ZXh0LmZpbGxUZXh0KFxuICAgICAgICAgICAgbGluZXNbaW5kZXhdLFxuICAgICAgICAgICAgaG9yaXpvbnRhbE9mZnNldCxcbiAgICAgICAgICAgIChpbmRleCArIDEpICogbGluZUhlaWdodCAtIHZlcnRpY2FsT2Zmc2V0LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgIGlmIChzaG91bGRUZW1wb3JhcmlseUF0dGFjaCkge1xuICAgICAgICAgIGNvbnRleHQuY2FudmFzLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaW1wbGVtZW50ZWQgdHlwZSAke2VsZW1lbnQudHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29udGV4dC5nbG9iYWxBbHBoYSA9IDE7XG59O1xuXG5jb25zdCBlbGVtZW50V2l0aENhbnZhc0NhY2hlID0gbmV3IFdlYWtNYXA8XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3RWxlbWVudFdpdGhDYW52YXNcbj4oKTtcblxuY29uc3Qgc2hhcGVDYWNoZSA9IG5ldyBXZWFrTWFwPFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRHJhd2FibGUgfCBEcmF3YWJsZVtdIHwgbnVsbFxuPigpO1xuXG5leHBvcnQgY29uc3QgZ2V0U2hhcGVGb3JFbGVtZW50ID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PlxuICBzaGFwZUNhY2hlLmdldChlbGVtZW50KTtcblxuZXhwb3J0IGNvbnN0IGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+XG4gIHNoYXBlQ2FjaGUuZGVsZXRlKGVsZW1lbnQpO1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSb3VnaE9wdGlvbnMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBjb250aW51b3VzUGF0aCA9IGZhbHNlLFxuKTogT3B0aW9ucyA9PiB7XG4gIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gICAgc2VlZDogZWxlbWVudC5zZWVkLFxuICAgIHN0cm9rZUxpbmVEYXNoOlxuICAgICAgZWxlbWVudC5zdHJva2VTdHlsZSA9PT0gXCJkYXNoZWRcIlxuICAgICAgICA/IGdldERhc2hBcnJheURhc2hlZChlbGVtZW50LnN0cm9rZVdpZHRoKVxuICAgICAgICA6IGVsZW1lbnQuc3Ryb2tlU3R5bGUgPT09IFwiZG90dGVkXCJcbiAgICAgICAgPyBnZXREYXNoQXJyYXlEb3R0ZWQoZWxlbWVudC5zdHJva2VXaWR0aClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgLy8gZm9yIG5vbi1zb2xpZCBzdHJva2VzLCBkaXNhYmxlIG11bHRpU3Ryb2tlIGJlY2F1c2UgaXQgdGVuZHMgdG8gbWFrZVxuICAgIC8vIGRhc2hlcy9kb3RzIG92ZXJsYXkgZWFjaCBvdGhlclxuICAgIGRpc2FibGVNdWx0aVN0cm9rZTogZWxlbWVudC5zdHJva2VTdHlsZSAhPT0gXCJzb2xpZFwiLFxuICAgIC8vIGZvciBub24tc29saWQgc3Ryb2tlcywgaW5jcmVhc2UgdGhlIHdpZHRoIGEgYml0IHRvIG1ha2UgaXQgdmlzdWFsbHlcbiAgICAvLyBzaW1pbGFyIHRvIHNvbGlkIHN0cm9rZXMsIGJlY2F1c2Ugd2UncmUgYWxzbyBkaXNhYmxpbmcgbXVsdGlTdHJva2VcbiAgICBzdHJva2VXaWR0aDpcbiAgICAgIGVsZW1lbnQuc3Ryb2tlU3R5bGUgIT09IFwic29saWRcIlxuICAgICAgICA/IGVsZW1lbnQuc3Ryb2tlV2lkdGggKyAwLjVcbiAgICAgICAgOiBlbGVtZW50LnN0cm9rZVdpZHRoLFxuICAgIC8vIHdoZW4gaW5jcmVhc2luZyBzdHJva2VXaWR0aCwgd2UgbXVzdCBleHBsaWNpdGx5IHNldCBmaWxsV2VpZ2h0IGFuZFxuICAgIC8vIGhhY2h1cmVHYXAgYmVjYXVzZSBpZiBub3Qgc3BlY2lmaWVkLCByb3VnaGpzIHVzZXMgc3Ryb2tlV2lkdGggdG9cbiAgICAvLyBjYWxjdWxhdGUgdGhlbSAoYW5kIHdlIGRvbid0IHdhbnQgdGhlIGZpbGxzIHRvIGJlIG1vZGlmaWVkKVxuICAgIGZpbGxXZWlnaHQ6IGVsZW1lbnQuc3Ryb2tlV2lkdGggLyAyLFxuICAgIGhhY2h1cmVHYXA6IGVsZW1lbnQuc3Ryb2tlV2lkdGggKiA0LFxuICAgIHJvdWdobmVzczogZWxlbWVudC5yb3VnaG5lc3MsXG4gICAgc3Ryb2tlOiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgIHByZXNlcnZlVmVydGljZXM6IGNvbnRpbnVvdXNQYXRoLFxuICB9O1xuXG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgY2FzZSBcImVsbGlwc2VcIjoge1xuICAgICAgb3B0aW9ucy5maWxsU3R5bGUgPSBlbGVtZW50LmZpbGxTdHlsZTtcbiAgICAgIG9wdGlvbnMuZmlsbCA9XG4gICAgICAgIGVsZW1lbnQuYmFja2dyb3VuZENvbG9yID09PSBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgICAgICBvcHRpb25zLmN1cnZlRml0dGluZyA9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG4gICAgY2FzZSBcImxpbmVcIjoge1xuICAgICAgaWYgKGlzUGF0aEFMb29wKGVsZW1lbnQucG9pbnRzKSkge1xuICAgICAgICBvcHRpb25zLmZpbGxTdHlsZSA9IGVsZW1lbnQuZmlsbFN0eWxlO1xuICAgICAgICBvcHRpb25zLmZpbGwgPVxuICAgICAgICAgIGVsZW1lbnQuYmFja2dyb3VuZENvbG9yID09PSBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGVsZW1lbnQuYmFja2dyb3VuZENvbG9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIGNhc2UgXCJmcmVlZHJhd1wiOlxuICAgIGNhc2UgXCJhcnJvd1wiOlxuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgZWxlbWVudCdzIHNoYXBlIGFuZCBwdXRzIGl0IGludG8gdGhlIGNhY2hlLlxuICogQHBhcmFtIGVsZW1lbnRcbiAqIEBwYXJhbSBnZW5lcmF0b3JcbiAqL1xuY29uc3QgZ2VuZXJhdGVFbGVtZW50U2hhcGUgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgZ2VuZXJhdG9yOiBSb3VnaEdlbmVyYXRvcixcbikgPT4ge1xuICBsZXQgc2hhcGUgPSBzaGFwZUNhY2hlLmdldChlbGVtZW50KSB8fCBudWxsO1xuXG4gIGlmICghc2hhcGUpIHtcbiAgICBlbGVtZW50V2l0aENhbnZhc0NhY2hlLmRlbGV0ZShlbGVtZW50KTtcblxuICAgIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgICAgIGlmIChlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyA9PT0gXCJyb3VuZFwiKSB7XG4gICAgICAgICAgY29uc3QgdyA9IGVsZW1lbnQud2lkdGg7XG4gICAgICAgICAgY29uc3QgaCA9IGVsZW1lbnQuaGVpZ2h0O1xuICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLm1pbih3LCBoKSAqIDAuMjU7XG4gICAgICAgICAgc2hhcGUgPSBnZW5lcmF0b3IucGF0aChcbiAgICAgICAgICAgIGBNICR7cn0gMCBMICR7dyAtIHJ9IDAgUSAke3d9IDAsICR7d30gJHtyfSBMICR7d30gJHtcbiAgICAgICAgICAgICAgaCAtIHJcbiAgICAgICAgICAgIH0gUSAke3d9ICR7aH0sICR7dyAtIHJ9ICR7aH0gTCAke3J9ICR7aH0gUSAwICR7aH0sIDAgJHtcbiAgICAgICAgICAgICAgaCAtIHJcbiAgICAgICAgICAgIH0gTCAwICR7cn0gUSAwIDAsICR7cn0gMGAsXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50LCB0cnVlKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLnJlY3RhbmdsZShcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgZWxlbWVudC53aWR0aCxcbiAgICAgICAgICAgIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJkaWFtb25kXCI6IHtcbiAgICAgICAgY29uc3QgW1xuICAgICAgICAgIHRvcFgsXG4gICAgICAgICAgdG9wWSxcbiAgICAgICAgICByaWdodFgsXG4gICAgICAgICAgcmlnaHRZLFxuICAgICAgICAgIGJvdHRvbVgsXG4gICAgICAgICAgYm90dG9tWSxcbiAgICAgICAgICBsZWZ0WCxcbiAgICAgICAgICBsZWZ0WSxcbiAgICAgICAgXSA9IGdldERpYW1vbmRQb2ludHMoZWxlbWVudCk7XG4gICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLnBvbHlnb24oXG4gICAgICAgICAgW1xuICAgICAgICAgICAgW3RvcFgsIHRvcFldLFxuICAgICAgICAgICAgW3JpZ2h0WCwgcmlnaHRZXSxcbiAgICAgICAgICAgIFtib3R0b21YLCBib3R0b21ZXSxcbiAgICAgICAgICAgIFtsZWZ0WCwgbGVmdFldLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImVsbGlwc2VcIjpcbiAgICAgICAgc2hhcGUgPSBnZW5lcmF0b3IuZWxsaXBzZShcbiAgICAgICAgICBlbGVtZW50LndpZHRoIC8gMixcbiAgICAgICAgICBlbGVtZW50LmhlaWdodCAvIDIsXG4gICAgICAgICAgZWxlbWVudC53aWR0aCxcbiAgICAgICAgICBlbGVtZW50LmhlaWdodCxcbiAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSxcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibGluZVwiOlxuICAgICAgY2FzZSBcImFycm93XCI6IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpO1xuXG4gICAgICAgIC8vIHBvaW50cyBhcnJheSBjYW4gYmUgZW1wdHkgaW4gdGhlIGJlZ2lubmluZywgc28gaXQgaXMgaW1wb3J0YW50IHRvIGFkZFxuICAgICAgICAvLyBpbml0aWFsIHBvc2l0aW9uIHRvIGl0XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGVsZW1lbnQucG9pbnRzLmxlbmd0aCA/IGVsZW1lbnQucG9pbnRzIDogW1swLCAwXV07XG5cbiAgICAgICAgLy8gY3VydmUgaXMgYWx3YXlzIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICAgIC8vIHRoaXMgc2ltcGxpZmllcyBmaW5kaW5nIHRoZSBjdXJ2ZSBmb3IgYW4gZWxlbWVudFxuICAgICAgICBpZiAoZWxlbWVudC5zdHJva2VTaGFycG5lc3MgPT09IFwic2hhcnBcIikge1xuICAgICAgICAgIGlmIChvcHRpb25zLmZpbGwpIHtcbiAgICAgICAgICAgIHNoYXBlID0gW2dlbmVyYXRvci5wb2x5Z29uKHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sIG9wdGlvbnMpXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2hhcGUgPSBbXG4gICAgICAgICAgICAgIGdlbmVyYXRvci5saW5lYXJQYXRoKHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sIG9wdGlvbnMpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hhcGUgPSBbZ2VuZXJhdG9yLmN1cnZlKHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sIG9wdGlvbnMpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCBsaW5lcyBvbmx5IGluIGFycm93XG4gICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwiYXJyb3dcIikge1xuICAgICAgICAgIGNvbnN0IHsgc3RhcnRBcnJvd2hlYWQgPSBudWxsLCBlbmRBcnJvd2hlYWQgPSBcImFycm93XCIgfSA9IGVsZW1lbnQ7XG5cbiAgICAgICAgICBjb25zdCBnZXRBcnJvd2hlYWRTaGFwZXMgPSAoXG4gICAgICAgICAgICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgIHNoYXBlOiBEcmF3YWJsZVtdLFxuICAgICAgICAgICAgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiZW5kXCIsXG4gICAgICAgICAgICBhcnJvd2hlYWQ6IEFycm93aGVhZCxcbiAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFycm93aGVhZFBvaW50cyA9IGdldEFycm93aGVhZFBvaW50cyhcbiAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgICBhcnJvd2hlYWQsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoYXJyb3doZWFkUG9pbnRzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT3RoZXIgYXJyb3doZWFkcyBoZXJlLi4uXG4gICAgICAgICAgICBpZiAoYXJyb3doZWFkID09PSBcImRvdFwiKSB7XG4gICAgICAgICAgICAgIGNvbnN0IFt4LCB5LCByXSA9IGFycm93aGVhZFBvaW50cztcblxuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGdlbmVyYXRvci5jaXJjbGUoeCwgeSwgciwge1xuICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIGZpbGw6IGVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IFwic29saWRcIixcbiAgICAgICAgICAgICAgICAgIHN0cm9rZTogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFycm93IGFycm93aGVhZHNcbiAgICAgICAgICAgIGNvbnN0IFt4MiwgeTIsIHgzLCB5MywgeDQsIHk0XSA9IGFycm93aGVhZFBvaW50cztcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3Ryb2tlU3R5bGUgPT09IFwiZG90dGVkXCIpIHtcbiAgICAgICAgICAgICAgLy8gZm9yIGRvdHRlZCBhcnJvd3MgY2FwcywgcmVkdWNlIGdhcCB0byBtYWtlIGl0IG1vcmUgbGVnaWJsZVxuICAgICAgICAgICAgICBjb25zdCBkYXNoID0gZ2V0RGFzaEFycmF5RG90dGVkKGVsZW1lbnQuc3Ryb2tlV2lkdGggLSAxKTtcbiAgICAgICAgICAgICAgb3B0aW9ucy5zdHJva2VMaW5lRGFzaCA9IFtkYXNoWzBdLCBkYXNoWzFdIC0gMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBmb3Igc29saWQvZGFzaGVkLCBrZWVwIHNvbGlkIGFycm93IGNhcFxuICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5zdHJva2VMaW5lRGFzaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIGdlbmVyYXRvci5saW5lKHgzLCB5MywgeDIsIHkyLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgZ2VuZXJhdG9yLmxpbmUoeDQsIHk0LCB4MiwgeTIsIG9wdGlvbnMpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKHN0YXJ0QXJyb3doZWFkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzaGFwZXMgPSBnZXRBcnJvd2hlYWRTaGFwZXMoXG4gICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgIHNoYXBlLFxuICAgICAgICAgICAgICBcInN0YXJ0XCIsXG4gICAgICAgICAgICAgIHN0YXJ0QXJyb3doZWFkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHNoYXBlLnB1c2goLi4uc2hhcGVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZW5kQXJyb3doZWFkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZW5kQXJyb3doZWFkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gSGV5LCB3ZSBoYXZlIGFuIG9sZCBhcnJvdyBoZXJlIVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzaGFwZXMgPSBnZXRBcnJvd2hlYWRTaGFwZXMoXG4gICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgIHNoYXBlLFxuICAgICAgICAgICAgICBcImVuZFwiLFxuICAgICAgICAgICAgICBlbmRBcnJvd2hlYWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc2hhcGUucHVzaCguLi5zaGFwZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgICAgZ2VuZXJhdGVGcmVlRHJhd1NoYXBlKGVsZW1lbnQpO1xuICAgICAgICBzaGFwZSA9IFtdO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJ0ZXh0XCI6IHtcbiAgICAgICAgLy8ganVzdCB0byBlbnN1cmUgd2UgZG9uJ3QgcmVnZW5lcmF0ZSBlbGVtZW50LmNhbnZhcyBvbiByZXJlbmRlcnNcbiAgICAgICAgc2hhcGUgPSBbXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHNoYXBlQ2FjaGUuc2V0KGVsZW1lbnQsIHNoYXBlKTtcbiAgfVxufTtcblxuY29uc3QgZ2VuZXJhdGVFbGVtZW50V2l0aENhbnZhcyA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBzY2VuZVN0YXRlPzogU2NlbmVTdGF0ZSxcbikgPT4ge1xuICBjb25zdCB6b29tOiBab29tID0gc2NlbmVTdGF0ZSA/IHNjZW5lU3RhdGUuem9vbSA6IGRlZmF1bHRBcHBTdGF0ZS56b29tO1xuICBjb25zdCBwcmV2RWxlbWVudFdpdGhDYW52YXMgPSBlbGVtZW50V2l0aENhbnZhc0NhY2hlLmdldChlbGVtZW50KTtcbiAgY29uc3Qgc2hvdWxkUmVnZW5lcmF0ZUJlY2F1c2Vab29tID1cbiAgICBwcmV2RWxlbWVudFdpdGhDYW52YXMgJiZcbiAgICBwcmV2RWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSAhPT0gem9vbS52YWx1ZSAmJlxuICAgICFzY2VuZVN0YXRlPy5zaG91bGRDYWNoZUlnbm9yZVpvb207XG4gIGlmICghcHJldkVsZW1lbnRXaXRoQ2FudmFzIHx8IHNob3VsZFJlZ2VuZXJhdGVCZWNhdXNlWm9vbSkge1xuICAgIGNvbnN0IGVsZW1lbnRXaXRoQ2FudmFzID0gZ2VuZXJhdGVFbGVtZW50Q2FudmFzKGVsZW1lbnQsIHpvb20pO1xuXG4gICAgZWxlbWVudFdpdGhDYW52YXNDYWNoZS5zZXQoZWxlbWVudCwgZWxlbWVudFdpdGhDYW52YXMpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnRXaXRoQ2FudmFzO1xuICB9XG4gIHJldHVybiBwcmV2RWxlbWVudFdpdGhDYW52YXM7XG59O1xuXG5jb25zdCBkcmF3RWxlbWVudEZyb21DYW52YXMgPSAoXG4gIGVsZW1lbnRXaXRoQ2FudmFzOiBFeGNhbGlkcmF3RWxlbWVudFdpdGhDYW52YXMsXG4gIHJjOiBSb3VnaENhbnZhcyxcbiAgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBzY2VuZVN0YXRlOiBTY2VuZVN0YXRlLFxuKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50V2l0aENhbnZhcy5lbGVtZW50O1xuICBjb25zdCBwYWRkaW5nID0gZ2V0Q2FudmFzUGFkZGluZyhlbGVtZW50KTtcbiAgbGV0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG5cbiAgLy8gRnJlZSBkcmF3IGVsZW1lbnRzIHdpbGwgb3RoZXJ3aXNlIFwic2h1ZmZsZVwiIGFzIHRoZSBtaW4geCBhbmQgeSBjaGFuZ2VcbiAgaWYgKGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgeDEgPSBNYXRoLmZsb29yKHgxKTtcbiAgICB4MiA9IE1hdGguY2VpbCh4Mik7XG4gICAgeTEgPSBNYXRoLmZsb29yKHkxKTtcbiAgICB5MiA9IE1hdGguY2VpbCh5Mik7XG4gIH1cblxuICBjb25zdCBjeCA9ICgoeDEgKyB4MikgLyAyICsgc2NlbmVTdGF0ZS5zY3JvbGxYKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICBjb25zdCBjeSA9ICgoeTEgKyB5MikgLyAyICsgc2NlbmVTdGF0ZS5zY3JvbGxZKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICBjb250ZXh0LnNhdmUoKTtcbiAgY29udGV4dC5zY2FsZSgxIC8gd2luZG93LmRldmljZVBpeGVsUmF0aW8sIDEgLyB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gIGNvbnRleHQudHJhbnNsYXRlKGN4LCBjeSk7XG4gIGNvbnRleHQucm90YXRlKGVsZW1lbnQuYW5nbGUpO1xuXG4gIGNvbnRleHQuZHJhd0ltYWdlKFxuICAgIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhcyEsXG4gICAgKC0oeDIgLSB4MSkgLyAyKSAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIC1cbiAgICAgIChwYWRkaW5nICogZWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSkgLyBlbGVtZW50V2l0aENhbnZhcy5jYW52YXNab29tLFxuICAgICgtKHkyIC0geTEpIC8gMikgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAtXG4gICAgICAocGFkZGluZyAqIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhc1pvb20pIC8gZWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSxcbiAgICBlbGVtZW50V2l0aENhbnZhcy5jYW52YXMhLndpZHRoIC8gZWxlbWVudFdpdGhDYW52YXMuY2FudmFzWm9vbSxcbiAgICBlbGVtZW50V2l0aENhbnZhcy5jYW52YXMhLmhlaWdodCAvIGVsZW1lbnRXaXRoQ2FudmFzLmNhbnZhc1pvb20sXG4gICk7XG4gIGNvbnRleHQucmVzdG9yZSgpO1xuXG4gIC8vIENsZWFyIHRoZSBuZXN0ZWQgZWxlbWVudCB3ZSBhcHBlbmRlZCB0byB0aGUgRE9NXG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyRWxlbWVudCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICByYzogUm91Z2hDYW52YXMsXG4gIGNvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgcmVuZGVyT3B0aW1pemF0aW9uczogYm9vbGVhbixcbiAgc2NlbmVTdGF0ZTogU2NlbmVTdGF0ZSxcbikgPT4ge1xuICBjb25zdCBnZW5lcmF0b3IgPSByYy5nZW5lcmF0b3I7XG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInNlbGVjdGlvblwiOiB7XG4gICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgIGNvbnRleHQudHJhbnNsYXRlKFxuICAgICAgICBlbGVtZW50LnggKyBzY2VuZVN0YXRlLnNjcm9sbFgsXG4gICAgICAgIGVsZW1lbnQueSArIHNjZW5lU3RhdGUuc2Nyb2xsWSxcbiAgICAgICk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IFwicmdiYSgwLCAwLCAyNTUsIDAuMTApXCI7XG4gICAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGVsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0KTtcbiAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJmcmVlZHJhd1wiOiB7XG4gICAgICBnZW5lcmF0ZUVsZW1lbnRTaGFwZShlbGVtZW50LCBnZW5lcmF0b3IpO1xuXG4gICAgICBpZiAocmVuZGVyT3B0aW1pemF0aW9ucykge1xuICAgICAgICBjb25zdCBlbGVtZW50V2l0aENhbnZhcyA9IGdlbmVyYXRlRWxlbWVudFdpdGhDYW52YXMoXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICBzY2VuZVN0YXRlLFxuICAgICAgICApO1xuICAgICAgICBkcmF3RWxlbWVudEZyb21DYW52YXMoZWxlbWVudFdpdGhDYW52YXMsIHJjLCBjb250ZXh0LCBzY2VuZVN0YXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMiArIHNjZW5lU3RhdGUuc2Nyb2xsWDtcbiAgICAgICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyICsgc2NlbmVTdGF0ZS5zY3JvbGxZO1xuICAgICAgICBjb25zdCBzaGlmdFggPSAoeDIgLSB4MSkgLyAyIC0gKGVsZW1lbnQueCAtIHgxKTtcbiAgICAgICAgY29uc3Qgc2hpZnRZID0gKHkyIC0geTEpIC8gMiAtIChlbGVtZW50LnkgLSB5MSk7XG4gICAgICAgIGNvbnRleHQuc2F2ZSgpO1xuICAgICAgICBjb250ZXh0LnRyYW5zbGF0ZShjeCwgY3kpO1xuICAgICAgICBjb250ZXh0LnJvdGF0ZShlbGVtZW50LmFuZ2xlKTtcbiAgICAgICAgY29udGV4dC50cmFuc2xhdGUoLXNoaWZ0WCwgLXNoaWZ0WSk7XG4gICAgICAgIGRyYXdFbGVtZW50T25DYW52YXMoZWxlbWVudCwgcmMsIGNvbnRleHQpO1xuICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgY2FzZSBcImxpbmVcIjpcbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICBnZW5lcmF0ZUVsZW1lbnRTaGFwZShlbGVtZW50LCBnZW5lcmF0b3IpO1xuICAgICAgaWYgKHJlbmRlck9wdGltaXphdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFdpdGhDYW52YXMgPSBnZW5lcmF0ZUVsZW1lbnRXaXRoQ2FudmFzKFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgc2NlbmVTdGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgZHJhd0VsZW1lbnRGcm9tQ2FudmFzKGVsZW1lbnRXaXRoQ2FudmFzLCByYywgY29udGV4dCwgc2NlbmVTdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDIgKyBzY2VuZVN0YXRlLnNjcm9sbFg7XG4gICAgICAgIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMiArIHNjZW5lU3RhdGUuc2Nyb2xsWTtcbiAgICAgICAgY29uc3Qgc2hpZnRYID0gKHgyIC0geDEpIC8gMiAtIChlbGVtZW50LnggLSB4MSk7XG4gICAgICAgIGNvbnN0IHNoaWZ0WSA9ICh5MiAtIHkxKSAvIDIgLSAoZWxlbWVudC55IC0geTEpO1xuICAgICAgICBjb250ZXh0LnNhdmUoKTtcbiAgICAgICAgY29udGV4dC50cmFuc2xhdGUoY3gsIGN5KTtcbiAgICAgICAgY29udGV4dC5yb3RhdGUoZWxlbWVudC5hbmdsZSk7XG4gICAgICAgIGNvbnRleHQudHJhbnNsYXRlKC1zaGlmdFgsIC1zaGlmdFkpO1xuICAgICAgICBkcmF3RWxlbWVudE9uQ2FudmFzKGVsZW1lbnQsIHJjLCBjb250ZXh0KTtcbiAgICAgICAgY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCByb3VnaFNWR0RyYXdXaXRoUHJlY2lzaW9uID0gKFxuICByc3ZnOiBSb3VnaFNWRyxcbiAgZHJhd2FibGU6IERyYXdhYmxlLFxuICBwcmVjaXNpb24/OiBudW1iZXIsXG4pID0+IHtcbiAgaWYgKHR5cGVvZiBwcmVjaXNpb24gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gcnN2Zy5kcmF3KGRyYXdhYmxlKTtcbiAgfVxuICBjb25zdCBwc2hhcGU6IERyYXdhYmxlID0ge1xuICAgIHNldHM6IGRyYXdhYmxlLnNldHMsXG4gICAgc2hhcGU6IGRyYXdhYmxlLnNoYXBlLFxuICAgIG9wdGlvbnM6IHsgLi4uZHJhd2FibGUub3B0aW9ucywgZml4ZWREZWNpbWFsUGxhY2VEaWdpdHM6IHByZWNpc2lvbiB9LFxuICB9O1xuICByZXR1cm4gcnN2Zy5kcmF3KHBzaGFwZSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyRWxlbWVudFRvU3ZnID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHJzdmc6IFJvdWdoU1ZHLFxuICBzdmdSb290OiBTVkdFbGVtZW50LFxuICBvZmZzZXRYPzogbnVtYmVyLFxuICBvZmZzZXRZPzogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGNvbnN0IGN4ID0gKHgyIC0geDEpIC8gMiAtIChlbGVtZW50LnggLSB4MSk7XG4gIGNvbnN0IGN5ID0gKHkyIC0geTEpIC8gMiAtIChlbGVtZW50LnkgLSB5MSk7XG4gIGNvbnN0IGRlZ3JlZSA9ICgxODAgKiBlbGVtZW50LmFuZ2xlKSAvIE1hdGguUEk7XG4gIGNvbnN0IGdlbmVyYXRvciA9IHJzdmcuZ2VuZXJhdG9yO1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJzZWxlY3Rpb25cIjoge1xuICAgICAgLy8gU2luY2UgdGhpcyBpcyB1c2VkIG9ubHkgZHVyaW5nIGVkaXRpbmcgZXhwZXJpZW5jZSwgd2hpY2ggaXMgY2FudmFzIGJhc2VkLFxuICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2VsZWN0aW9uIHJlbmRlcmluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBTVkdcIik7XG4gICAgfVxuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgIGNhc2UgXCJlbGxpcHNlXCI6IHtcbiAgICAgIGdlbmVyYXRlRWxlbWVudFNoYXBlKGVsZW1lbnQsIGdlbmVyYXRvcik7XG4gICAgICBjb25zdCBub2RlID0gcm91Z2hTVkdEcmF3V2l0aFByZWNpc2lvbihcbiAgICAgICAgcnN2ZyxcbiAgICAgICAgZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpIGFzIERyYXdhYmxlLFxuICAgICAgICBNQVhfREVDSU1BTFNfRk9SX1NWR19FWFBPUlQsXG4gICAgICApO1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgIH1cbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLWxpbmVjYXBcIiwgXCJyb3VuZFwiKTtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICBcInRyYW5zZm9ybVwiLFxuICAgICAgICBgdHJhbnNsYXRlKCR7b2Zmc2V0WCB8fCAwfSAke1xuICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICB9KSByb3RhdGUoJHtkZWdyZWV9ICR7Y3h9ICR7Y3l9KWAsXG4gICAgICApO1xuICAgICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwibGluZVwiOlxuICAgIGNhc2UgXCJhcnJvd1wiOiB7XG4gICAgICBnZW5lcmF0ZUVsZW1lbnRTaGFwZShlbGVtZW50LCBnZW5lcmF0b3IpO1xuICAgICAgY29uc3QgZ3JvdXAgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZ1wiKTtcbiAgICAgIGNvbnN0IG9wYWNpdHkgPSBlbGVtZW50Lm9wYWNpdHkgLyAxMDA7XG4gICAgICBncm91cC5zZXRBdHRyaWJ1dGUoXCJzdHJva2UtbGluZWNhcFwiLCBcInJvdW5kXCIpO1xuXG4gICAgICAoZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpIGFzIERyYXdhYmxlW10pLmZvckVhY2goKHNoYXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSByb3VnaFNWR0RyYXdXaXRoUHJlY2lzaW9uKFxuICAgICAgICAgIHJzdmcsXG4gICAgICAgICAgc2hhcGUsXG4gICAgICAgICAgTUFYX0RFQ0lNQUxTX0ZPUl9TVkdfRVhQT1JULFxuICAgICAgICApO1xuICAgICAgICBpZiAob3BhY2l0eSAhPT0gMSkge1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImZpbGwtb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICAgIFwidHJhbnNmb3JtXCIsXG4gICAgICAgICAgYHRyYW5zbGF0ZSgke29mZnNldFggfHwgMH0gJHtcbiAgICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICAgIH0pIHJvdGF0ZSgke2RlZ3JlZX0gJHtjeH0gJHtjeX0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVsZW1lbnQudHlwZSA9PT0gXCJsaW5lXCIgJiZcbiAgICAgICAgICBpc1BhdGhBTG9vcChlbGVtZW50LnBvaW50cykgJiZcbiAgICAgICAgICBlbGVtZW50LmJhY2tncm91bmRDb2xvciAhPT0gXCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICkge1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZmlsbC1ydWxlXCIsIFwiZXZlbm9kZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBncm91cC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIH0pO1xuICAgICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChncm91cCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgIGdlbmVyYXRlRnJlZURyYXdTaGFwZShlbGVtZW50KTtcbiAgICAgIGNvbnN0IG9wYWNpdHkgPSBlbGVtZW50Lm9wYWNpdHkgLyAxMDA7XG4gICAgICBjb25zdCBub2RlID0gc3ZnUm9vdC5vd25lckRvY3VtZW50IS5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImdcIik7XG4gICAgICBpZiAob3BhY2l0eSAhPT0gMSkge1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcInN0cm9rZS1vcGFjaXR5XCIsIGAke29wYWNpdHl9YCk7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZmlsbC1vcGFjaXR5XCIsIGAke29wYWNpdHl9YCk7XG4gICAgICB9XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShcbiAgICAgICAgXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgYHRyYW5zbGF0ZSgke29mZnNldFggfHwgMH0gJHtcbiAgICAgICAgICBvZmZzZXRZIHx8IDBcbiAgICAgICAgfSkgcm90YXRlKCR7ZGVncmVlfSAke2N4fSAke2N5fSlgLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBhdGggPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicGF0aFwiKTtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwibm9uZVwiKTtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBlbGVtZW50LnN0cm9rZUNvbG9yKTtcbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKFwiZFwiLCBnZXRGcmVlRHJhd1N2Z1BhdGgoZWxlbWVudCkpO1xuICAgICAgbm9kZS5hcHBlbmRDaGlsZChwYXRoKTtcbiAgICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3Qgb3BhY2l0eSA9IGVsZW1lbnQub3BhY2l0eSAvIDEwMDtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJnXCIpO1xuICAgICAgICBpZiAob3BhY2l0eSAhPT0gMSkge1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLW9wYWNpdHlcIiwgYCR7b3BhY2l0eX1gKTtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImZpbGwtb3BhY2l0eVwiLCBgJHtvcGFjaXR5fWApO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICAgIFwidHJhbnNmb3JtXCIsXG4gICAgICAgICAgYHRyYW5zbGF0ZSgke29mZnNldFggfHwgMH0gJHtcbiAgICAgICAgICAgIG9mZnNldFkgfHwgMFxuICAgICAgICAgIH0pIHJvdGF0ZSgke2RlZ3JlZX0gJHtjeH0gJHtjeX0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbGluZXMgPSBlbGVtZW50LnRleHQucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKS5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbE9mZnNldCA9IGVsZW1lbnQuaGVpZ2h0IC0gZWxlbWVudC5iYXNlbGluZTtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9mZnNldCA9XG4gICAgICAgICAgZWxlbWVudC50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCJcbiAgICAgICAgICAgID8gZWxlbWVudC53aWR0aCAvIDJcbiAgICAgICAgICAgIDogZWxlbWVudC50ZXh0QWxpZ24gPT09IFwicmlnaHRcIlxuICAgICAgICAgICAgPyBlbGVtZW50LndpZHRoXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGlzUlRMKGVsZW1lbnQudGV4dCkgPyBcInJ0bFwiIDogXCJsdHJcIjtcbiAgICAgICAgY29uc3QgdGV4dEFuY2hvciA9XG4gICAgICAgICAgZWxlbWVudC50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCJcbiAgICAgICAgICAgID8gXCJtaWRkbGVcIlxuICAgICAgICAgICAgOiBlbGVtZW50LnRleHRBbGlnbiA9PT0gXCJyaWdodFwiIHx8IGRpcmVjdGlvbiA9PT0gXCJydGxcIlxuICAgICAgICAgICAgPyBcImVuZFwiXG4gICAgICAgICAgICA6IFwic3RhcnRcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHRleHQgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwidGV4dFwiKTtcbiAgICAgICAgICB0ZXh0LnRleHRDb250ZW50ID0gbGluZXNbaV07XG4gICAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoXCJ4XCIsIGAke2hvcml6b250YWxPZmZzZXR9YCk7XG4gICAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIGAkeyhpICsgMSkgKiBsaW5lSGVpZ2h0IC0gdmVydGljYWxPZmZzZXR9YCk7XG4gICAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoXCJmb250LWZhbWlseVwiLCBnZXRGb250RmFtaWx5U3RyaW5nKGVsZW1lbnQpKTtcbiAgICAgICAgICB0ZXh0LnNldEF0dHJpYnV0ZShcImZvbnQtc2l6ZVwiLCBgJHtlbGVtZW50LmZvbnRTaXplfXB4YCk7XG4gICAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIGVsZW1lbnQuc3Ryb2tlQ29sb3IpO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwidGV4dC1hbmNob3JcIiwgdGV4dEFuY2hvcik7XG4gICAgICAgICAgdGV4dC5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcIndoaXRlLXNwYWNlOiBwcmU7XCIpO1xuICAgICAgICAgIHRleHQuc2V0QXR0cmlidXRlKFwiZGlyZWN0aW9uXCIsIGRpcmVjdGlvbik7XG4gICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBzdmdSb290LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaW1wbGVtZW50ZWQgdHlwZSAke2VsZW1lbnQudHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwYXRoc0NhY2hlID0gbmV3IFdlYWtNYXA8RXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCwgUGF0aDJEPihbXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUZyZWVEcmF3U2hhcGUoZWxlbWVudDogRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCkge1xuICBjb25zdCBzdmdQYXRoRGF0YSA9IGdldEZyZWVEcmF3U3ZnUGF0aChlbGVtZW50KTtcbiAgY29uc3QgcGF0aCA9IG5ldyBQYXRoMkQoc3ZnUGF0aERhdGEpO1xuICBwYXRoc0NhY2hlLnNldChlbGVtZW50LCBwYXRoKTtcbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGcmVlRHJhd1BhdGgyRChlbGVtZW50OiBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50KSB7XG4gIHJldHVybiBwYXRoc0NhY2hlLmdldChlbGVtZW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZyZWVEcmF3U3ZnUGF0aChlbGVtZW50OiBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50KSB7XG4gIC8vIElmIGlucHV0IHBvaW50cyBhcmUgZW1wdHkgKHNob3VsZCB0aGV5IGV2ZXIgYmU/KSByZXR1cm4gYSBkb3RcbiAgY29uc3QgaW5wdXRQb2ludHMgPSBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmVcbiAgICA/IGVsZW1lbnQucG9pbnRzXG4gICAgOiBlbGVtZW50LnBvaW50cy5sZW5ndGhcbiAgICA/IGVsZW1lbnQucG9pbnRzLm1hcCgoW3gsIHldLCBpKSA9PiBbeCwgeSwgZWxlbWVudC5wcmVzc3VyZXNbaV1dKVxuICAgIDogW1swLCAwLCAwLjVdXTtcblxuICAvLyBDb25zaWRlciBjaGFuZ2luZyB0aGUgb3B0aW9ucyBmb3Igc2ltdWxhdGVkIHByZXNzdXJlIHZzIHJlYWwgcHJlc3N1cmVcbiAgY29uc3Qgb3B0aW9uczogU3Ryb2tlT3B0aW9ucyA9IHtcbiAgICBzaW11bGF0ZVByZXNzdXJlOiBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmUsXG4gICAgc2l6ZTogZWxlbWVudC5zdHJva2VXaWR0aCAqIDQuMjUsXG4gICAgdGhpbm5pbmc6IDAuNixcbiAgICBzbW9vdGhpbmc6IDAuNSxcbiAgICBzdHJlYW1saW5lOiAwLjUsXG4gICAgZWFzaW5nOiAodCkgPT4gTWF0aC5zaW4oKHQgKiBNYXRoLlBJKSAvIDIpLCAvLyBodHRwczovL2Vhc2luZ3MubmV0LyNlYXNlT3V0U2luZVxuICAgIGxhc3Q6IGZhbHNlLFxuICB9O1xuXG4gIHJldHVybiBnZXRTdmdQYXRoRnJvbVN0cm9rZShnZXRTdHJva2UoaW5wdXRQb2ludHMgYXMgbnVtYmVyW11bXSwgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiBtZWQoQTogbnVtYmVyW10sIEI6IG51bWJlcltdKSB7XG4gIHJldHVybiBbKEFbMF0gKyBCWzBdKSAvIDIsIChBWzFdICsgQlsxXSkgLyAyXTtcbn1cblxuLy8gVHJpbSBTVkcgcGF0aCBkYXRhIHNvIG51bWJlciBhcmUgZWFjaCB0d28gZGVjaW1hbCBwb2ludHMuIFRoaXNcbi8vIGltcHJvdmVzIFNWRyBleHBvcnRzLCBhbmQgcHJldmVudHMgcmVuZGVyaW5nIGVycm9ycyBvbiBwb2ludHNcbi8vIHdpdGggbG9uZyBkZWNpbWFscy5cbmNvbnN0IFRPX0ZJWEVEX1BSRUNJU0lPTiA9IC8oXFxzP1tBLVpdPyw/LT9bMC05XSpcXC5bMC05XXswLDJ9KSgoWzAtOV18ZXwtKSopL2c7XG5cbmZ1bmN0aW9uIGdldFN2Z1BhdGhGcm9tU3Ryb2tlKHBvaW50czogbnVtYmVyW11bXSk6IHN0cmluZyB7XG4gIGlmICghcG9pbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgY29uc3QgbWF4ID0gcG9pbnRzLmxlbmd0aCAtIDE7XG5cbiAgcmV0dXJuIHBvaW50c1xuICAgIC5yZWR1Y2UoXG4gICAgICAoYWNjLCBwb2ludCwgaSwgYXJyKSA9PiB7XG4gICAgICAgIGlmIChpID09PSBtYXgpIHtcbiAgICAgICAgICBhY2MucHVzaChwb2ludCwgbWVkKHBvaW50LCBhcnJbMF0pLCBcIkxcIiwgYXJyWzBdLCBcIlpcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjLnB1c2gocG9pbnQsIG1lZChwb2ludCwgYXJyW2kgKyAxXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgW1wiTVwiLCBwb2ludHNbMF0sIFwiUVwiXSxcbiAgICApXG4gICAgLmpvaW4oXCIgXCIpXG4gICAgLnJlcGxhY2VBbGwoVE9fRklYRURfUFJFQ0lTSU9OLCBcIiQxXCIpO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../renderer/renderElement.ts\n");
2550
2550
 
2551
2551
  /***/ }),
2552
2552
 
@@ -2810,7 +2810,7 @@ module.exports = JSON.parse('{"white":"#ffffff","black":"#000000","gray":["#f8f9
2810
2810
  /***/ ((module) => {
2811
2811
 
2812
2812
  "use strict";
2813
- module.exports = JSON.parse('{"labels":{"paste":"Paste","pasteCharts":"Paste charts","selectAll":"Select all","multiSelect":"Add element to selection","moveCanvas":"Move canvas","cut":"Cut","copy":"Copy","copyAsPng":"Copy to clipboard as PNG","copyAsSvg":"Copy to clipboard as SVG","bringForward":"Bring forward","sendToBack":"Send to back","bringToFront":"Bring to front","sendBackward":"Send backward","delete":"Delete","copyStyles":"Copy styles","pasteStyles":"Paste styles","stroke":"Stroke","background":"Background","fill":"Fill","strokeWidth":"Stroke width","strokeShape":"Stroke shape","strokeShape_gel":"Gel pen","strokeShape_fountain":"Fountain pen","strokeShape_brush":"Brush pen","strokeStyle":"Stroke style","strokeStyle_solid":"Solid","strokeStyle_dashed":"Dashed","strokeStyle_dotted":"Dotted","sloppiness":"Sloppiness","opacity":"Opacity","textAlign":"Text align","edges":"Edges","sharp":"Sharp","round":"Round","arrowheads":"Arrowheads","arrowhead_none":"None","arrowhead_arrow":"Arrow","arrowhead_bar":"Bar","arrowhead_dot":"Dot","fontSize":"Font size","fontFamily":"Font family","onlySelected":"Only selected","withBackground":"Background","exportEmbedScene":"Embed scene","exportEmbedScene_details":"Scene data will be saved into the exported PNG/SVG file so that the scene can be restored from it.\\nWill increase exported file size.","addWatermark":"Add \\"Made with Excalidraw\\"","handDrawn":"Hand-drawn","normal":"Normal","code":"Code","small":"Small","medium":"Medium","large":"Large","veryLarge":"Very large","solid":"Solid","hachure":"Hachure","crossHatch":"Cross-hatch","thin":"Thin","bold":"Bold","left":"Left","center":"Center","right":"Right","extraBold":"Extra bold","architect":"Architect","artist":"Artist","cartoonist":"Cartoonist","fileTitle":"File name","colorPicker":"Color picker","canvasBackground":"Canvas background","drawingCanvas":"Drawing canvas","layers":"Layers","actions":"Actions","language":"Language","liveCollaboration":"Live collaboration","duplicateSelection":"Duplicate","untitled":"Untitled","name":"Name","yourName":"Your name","madeWithExcalidraw":"Made with Excalidraw","group":"Group selection","ungroup":"Ungroup selection","collaborators":"Collaborators","showGrid":"Show grid","addToLibrary":"Add to library","removeFromLibrary":"Remove from library","libraryLoadingMessage":"Loading library…","libraries":"Browse libraries","loadingScene":"Loading scene…","align":"Align","alignTop":"Align top","alignBottom":"Align bottom","alignLeft":"Align left","alignRight":"Align right","centerVertically":"Center vertically","centerHorizontally":"Center horizontally","distributeHorizontally":"Distribute horizontally","distributeVertically":"Distribute vertically","flipHorizontal":"Flip horizontal","flipVertical":"Flip vertical","viewMode":"View mode","toggleExportColorScheme":"Toggle export color scheme","share":"Share","showStroke":"Show stroke color picker","showBackground":"Show background color picker","toggleTheme":"Toggle theme"},"buttons":{"clearReset":"Reset the canvas","exportJSON":"Export to file","exportImage":"Save as image","export":"Export","exportToPng":"Export to PNG","exportToSvg":"Export to SVG","copyToClipboard":"Copy to clipboard","copyPngToClipboard":"Copy PNG to clipboard","scale":"Scale","save":"Save to current file","saveAs":"Save as","load":"Load","getShareableLink":"Get shareable link","close":"Close","selectLanguage":"Select language","scrollBackToContent":"Scroll back to content","zoomIn":"Zoom in","zoomOut":"Zoom out","resetZoom":"Reset zoom","menu":"Menu","done":"Done","edit":"Edit","undo":"Undo","redo":"Redo","resetLibrary":"Reset library","createNewRoom":"Create new room","fullScreen":"Full screen","darkMode":"Dark mode","lightMode":"Light mode","zenMode":"Zen mode","exitZenMode":"Exit zen mode"},"alerts":{"clearReset":"This will clear the whole canvas. Are you sure?","couldNotCreateShareableLink":"Couldn\'t create shareable link.","couldNotCreateShareableLinkTooBig":"Couldn\'t create shareable link: the scene is too big","couldNotLoadInvalidFile":"Couldn\'t load invalid file","importBackendFailed":"Importing from backend failed.","cannotExportEmptyCanvas":"Cannot export empty canvas.","couldNotCopyToClipboard":"Couldn\'t copy to clipboard. Try using Chrome browser.","decryptFailed":"Couldn\'t decrypt data.","uploadedSecurly":"The upload has been secured with end-to-end encryption, which means that Excalidraw server and third parties can\'t read the content.","loadSceneOverridePrompt":"Loading external drawing will replace your existing content. Do you wish to continue?","collabStopOverridePrompt":"Stopping the session will overwrite your previous, locally stored drawing. Are you sure?\\n\\n(If you want to keep your local drawing, simply close the browser tab instead.)","errorLoadingLibrary":"There was an error loading the third party library.","errorAddingToLibrary":"Couldn\'t add item to the library","errorRemovingFromLibrary":"Couldn\'t remove item from the library","confirmAddLibrary":"This will add {{numShapes}} shape(s) to your library. Are you sure?","imageDoesNotContainScene":"Importing images isn\'t supported at the moment.\\n\\nDid you want to import a scene? This image does not seem to contain any scene data. Have you enabled this during export?","cannotRestoreFromImage":"Scene couldn\'t be restored from this image file","invalidSceneUrl":"Couldn\'t import scene from the supplied URL. It\'s either malformed, or doesn\'t contain valid Excalidraw JSON data.","resetLibrary":"This will clear your library. Are you sure?"},"toolBar":{"selection":"Selection","rectangle":"Rectangle","diamond":"Diamond","ellipse":"Ellipse","arrow":"Arrow","line":"Line","freedraw":"Draw","text":"Text","library":"Library","lock":"Keep selected tool active after drawing"},"headings":{"canvasActions":"Canvas actions","selectedShapeActions":"Selected shape actions","shapes":"Shapes"},"hints":{"linearElement":"Click to start multiple points, drag for single line","freeDraw":"Click and drag, release when you\'re finished","text":"Tip: you can also add text by double-clicking anywhere with the selection tool","text_selected":"Double-click or press ENTER to edit text","text_editing":"Press Escape or CtrlOrCmd+ENTER to finish editing","linearElementMulti":"Click on last point or press Escape or Enter to finish","lockAngle":"You can constrain angle by holding SHIFT","resize":"You can constrain proportions by holding SHIFT while resizing,\\nhold ALT to resize from the center","rotate":"You can constrain angles by holding SHIFT while rotating","lineEditor_info":"Double-click or press Enter to edit points","lineEditor_pointSelected":"Press Delete to remove point, CtrlOrCmd+D to duplicate, or drag to move","lineEditor_nothingSelected":"Select a point to move or remove, or hold Alt and click to add new points"},"canvasError":{"cannotShowPreview":"Cannot show preview","canvasTooBig":"The canvas may be too big.","canvasTooBigTip":"Tip: try moving the farthest elements a bit closer together."},"errorSplash":{"headingMain_pre":"Encountered an error. Try ","headingMain_button":"reloading the page.","clearCanvasMessage":"If reloading doesn\'t work, try ","clearCanvasMessage_button":"clearing the canvas.","clearCanvasCaveat":" This will result in loss of work ","trackedToSentry_pre":"The error with identifier ","trackedToSentry_post":" was tracked on our system.","openIssueMessage_pre":"We were very cautious not to include your scene information on the error. If your scene is not private, please consider following up on our ","openIssueMessage_button":"bug tracker.","openIssueMessage_post":" Please include information below by copying and pasting into the GitHub issue.","sceneContent":"Scene content:"},"roomDialog":{"desc_intro":"You can invite people to your current scene to collaborate with you.","desc_privacy":"Don\'t worry, the session uses end-to-end encryption, so whatever you draw will stay private. Not even our server will be able to see what you come up with.","button_startSession":"Start session","button_stopSession":"Stop session","desc_inProgressIntro":"Live-collaboration session is now in progress.","desc_shareLink":"Share this link with anyone you want to collaborate with:","desc_exitSession":"Stopping the session will disconnect you from the room, but you\'ll be able to continue working with the scene, locally. Note that this won\'t affect other people, and they\'ll still be able to collaborate on their version.","shareTitle":"Join a live collaboration session on Excalidraw"},"errorDialog":{"title":"Error"},"exportDialog":{"disk_title":"Save to disk","disk_details":"Export the scene data to a file from which you can import later.","disk_button":"Save to file","link_title":"Shareable link","link_details":"Export as a read-only link.","link_button":"Export to Link","excalidrawplus_description":"Save the scene to your Excalidraw+ workspace.","excalidrawplus_button":"Export","excalidrawplus_exportError":"Couldn\'t export to Excalidraw+ at this moment..."},"helpDialog":{"blog":"Read our blog","click":"click","curvedArrow":"Curved arrow","curvedLine":"Curved line","documentation":"Documentation","doubleClick":"double-click","drag":"drag","editor":"Editor","editSelectedShape":"Edit selected shape (text/arrow/line)","github":"Found an issue? Submit","howto":"Follow our guides","or":"or","preventBinding":"Prevent arrow binding","shapes":"Shapes","shortcuts":"Keyboard shortcuts","textFinish":"Finish editing (text editor)","textNewLine":"Add new line (text editor)","title":"Help","view":"View","zoomToFit":"Zoom to fit all elements","zoomToSelection":"Zoom to selection"},"encrypted":{"tooltip":"Your drawings are end-to-end encrypted so Excalidraw\'s servers will never see them.","link":"Blog post on end-to-end encryption in Excalidraw"},"stats":{"angle":"Angle","element":"Element","elements":"Elements","height":"Height","scene":"Scene","selected":"Selected","storage":"Storage","title":"Stats for nerds","total":"Total","version":"Version","versionCopy":"Click to copy","versionNotAvailable":"Version not available","width":"Width"},"toast":{"copyStyles":"Copied styles.","copyToClipboard":"Copied to clipboard.","copyToClipboardAsPng":"Copied {{exportSelection}} to clipboard as PNG\\n({{exportColorScheme}})","fileSaved":"File saved.","fileSavedToFilename":"Saved to {filename}","canvas":"canvas","selection":"selection"},"colors":{"495057":"Gray 7","ffffff":"White","f8f9fa":"Gray 0","f1f3f5":"Gray 1","fff5f5":"Red 0","fff0f6":"Pink 0","f8f0fc":"Grape 0","f3f0ff":"Violet 0","edf2ff":"Indigo 0","e7f5ff":"Blue 0","e3fafc":"Cyan 0","e6fcf5":"Teal 0","ebfbee":"Green 0","f4fce3":"Lime 0","fff9db":"Yellow 0","fff4e6":"Orange 0","transparent":"Transparent","ced4da":"Gray 4","868e96":"Gray 6","fa5252":"Red 6","e64980":"Pink 6","be4bdb":"Grape 6","7950f2":"Violet 6","4c6ef5":"Indigo 6","228be6":"Blue 6","15aabf":"Cyan 6","12b886":"Teal 6","40c057":"Green 6","82c91e":"Lime 6","fab005":"Yellow 6","fd7e14":"Orange 6","000000":"Black","343a40":"Gray 8","c92a2a":"Red 9","a61e4d":"Pink 9","862e9c":"Grape 9","5f3dc4":"Violet 9","364fc7":"Indigo 9","1864ab":"Blue 9","0b7285":"Cyan 9","087f5b":"Teal 9","2b8a3e":"Green 9","5c940d":"Lime 9","e67700":"Yellow 9","d9480f":"Orange 9"}}');
2813
+ module.exports = JSON.parse('{"labels":{"paste":"Paste","pasteCharts":"Paste charts","selectAll":"Select all","multiSelect":"Add element to selection","moveCanvas":"Move canvas","cut":"Cut","copy":"Copy","copyAsPng":"Copy to clipboard as PNG","copyAsSvg":"Copy to clipboard as SVG","bringForward":"Bring forward","sendToBack":"Send to back","bringToFront":"Bring to front","sendBackward":"Send backward","delete":"Delete","copyStyles":"Copy styles","pasteStyles":"Paste styles","stroke":"Stroke","background":"Background","fill":"Fill","strokeWidth":"Stroke width","strokeShape":"Stroke shape","strokeShape_gel":"Gel pen","strokeShape_fountain":"Fountain pen","strokeShape_brush":"Brush pen","strokeStyle":"Stroke style","strokeStyle_solid":"Solid","strokeStyle_dashed":"Dashed","strokeStyle_dotted":"Dotted","sloppiness":"Sloppiness","opacity":"Opacity","textAlign":"Text align","edges":"Edges","sharp":"Sharp","round":"Round","arrowheads":"Arrowheads","arrowhead_none":"None","arrowhead_arrow":"Arrow","arrowhead_bar":"Bar","arrowhead_dot":"Dot","fontSize":"Font size","fontFamily":"Font family","onlySelected":"Only selected","withBackground":"Background","exportEmbedScene":"Embed scene","exportEmbedScene_details":"Scene data will be saved into the exported PNG/SVG file so that the scene can be restored from it.\\nWill increase exported file size.","addWatermark":"Add \\"Made with Excalidraw\\"","handDrawn":"Hand-drawn","normal":"Normal","code":"Code","small":"Small","medium":"Medium","large":"Large","veryLarge":"Very large","solid":"Solid","hachure":"Hachure","crossHatch":"Cross-hatch","thin":"Thin","bold":"Bold","left":"Left","center":"Center","right":"Right","extraBold":"Extra bold","architect":"Architect","artist":"Artist","cartoonist":"Cartoonist","fileTitle":"File name","colorPicker":"Color picker","canvasBackground":"Canvas background","drawingCanvas":"Drawing canvas","layers":"Layers","actions":"Actions","language":"Language","liveCollaboration":"Live collaboration","duplicateSelection":"Duplicate","untitled":"Untitled","name":"Name","yourName":"Your name","madeWithExcalidraw":"Made with Excalidraw","group":"Group selection","ungroup":"Ungroup selection","collaborators":"Collaborators","showGrid":"Show grid","addToLibrary":"Add to library","removeFromLibrary":"Remove from library","libraryLoadingMessage":"Loading library…","libraries":"Browse libraries","loadingScene":"Loading scene…","align":"Align","alignTop":"Align top","alignBottom":"Align bottom","alignLeft":"Align left","alignRight":"Align right","centerVertically":"Center vertically","centerHorizontally":"Center horizontally","distributeHorizontally":"Distribute horizontally","distributeVertically":"Distribute vertically","flipHorizontal":"Flip horizontal","flipVertical":"Flip vertical","viewMode":"View mode","toggleExportColorScheme":"Toggle export color scheme","share":"Share","showStroke":"Show stroke color picker","showBackground":"Show background color picker","toggleTheme":"Toggle theme"},"buttons":{"clearReset":"Reset the canvas","exportJSON":"Export to file","exportImage":"Save as image","export":"Export","exportToPng":"Export to PNG","exportToSvg":"Export to SVG","copyToClipboard":"Copy to clipboard","copyPngToClipboard":"Copy PNG to clipboard","scale":"Scale","save":"Save to current file","saveAs":"Save as","load":"Load","getShareableLink":"Get shareable link","close":"Close","selectLanguage":"Select language","scrollBackToContent":"Scroll back to content","zoomIn":"Zoom in","zoomOut":"Zoom out","resetZoom":"Reset zoom","menu":"Menu","done":"Done","edit":"Edit","undo":"Undo","redo":"Redo","resetLibrary":"Reset library","createNewRoom":"Create new room","fullScreen":"Full screen","darkMode":"Dark mode","lightMode":"Light mode","zenMode":"Zen mode","exitZenMode":"Exit zen mode"},"alerts":{"clearReset":"This will clear the whole canvas. Are you sure?","couldNotCreateShareableLink":"Couldn\'t create shareable link.","couldNotCreateShareableLinkTooBig":"Couldn\'t create shareable link: the scene is too big","couldNotLoadInvalidFile":"Couldn\'t load invalid file","importBackendFailed":"Importing from backend failed.","cannotExportEmptyCanvas":"Cannot export empty canvas.","couldNotCopyToClipboard":"Couldn\'t copy to clipboard. Try using Chrome browser.","decryptFailed":"Couldn\'t decrypt data.","uploadedSecurly":"The upload has been secured with end-to-end encryption, which means that Excalidraw server and third parties can\'t read the content.","loadSceneOverridePrompt":"Loading external drawing will replace your existing content. Do you wish to continue?","collabStopOverridePrompt":"Stopping the session will overwrite your previous, locally stored drawing. Are you sure?\\n\\n(If you want to keep your local drawing, simply close the browser tab instead.)","errorLoadingLibrary":"There was an error loading the third party library.","errorAddingToLibrary":"Couldn\'t add item to the library","errorRemovingFromLibrary":"Couldn\'t remove item from the library","confirmAddLibrary":"This will add {{numShapes}} shape(s) to your library. Are you sure?","imageDoesNotContainScene":"Importing images isn\'t supported at the moment.\\n\\nDid you want to import a scene? This image does not seem to contain any scene data. Have you enabled this during export?","cannotRestoreFromImage":"Scene couldn\'t be restored from this image file","invalidSceneUrl":"Couldn\'t import scene from the supplied URL. It\'s either malformed, or doesn\'t contain valid Excalidraw JSON data.","resetLibrary":"This will clear your library. Are you sure?","invalidEncryptionKey":"Encryption key must be of 22 characters. Live collaboration is disabled."},"toolBar":{"selection":"Selection","rectangle":"Rectangle","diamond":"Diamond","ellipse":"Ellipse","arrow":"Arrow","line":"Line","freedraw":"Draw","text":"Text","library":"Library","lock":"Keep selected tool active after drawing"},"headings":{"canvasActions":"Canvas actions","selectedShapeActions":"Selected shape actions","shapes":"Shapes"},"hints":{"linearElement":"Click to start multiple points, drag for single line","freeDraw":"Click and drag, release when you\'re finished","text":"Tip: you can also add text by double-clicking anywhere with the selection tool","text_selected":"Double-click or press ENTER to edit text","text_editing":"Press Escape or CtrlOrCmd+ENTER to finish editing","linearElementMulti":"Click on last point or press Escape or Enter to finish","lockAngle":"You can constrain angle by holding SHIFT","resize":"You can constrain proportions by holding SHIFT while resizing,\\nhold ALT to resize from the center","rotate":"You can constrain angles by holding SHIFT while rotating","lineEditor_info":"Double-click or press Enter to edit points","lineEditor_pointSelected":"Press Delete to remove point, CtrlOrCmd+D to duplicate, or drag to move","lineEditor_nothingSelected":"Select a point to move or remove, or hold Alt and click to add new points"},"canvasError":{"cannotShowPreview":"Cannot show preview","canvasTooBig":"The canvas may be too big.","canvasTooBigTip":"Tip: try moving the farthest elements a bit closer together."},"errorSplash":{"headingMain_pre":"Encountered an error. Try ","headingMain_button":"reloading the page.","clearCanvasMessage":"If reloading doesn\'t work, try ","clearCanvasMessage_button":"clearing the canvas.","clearCanvasCaveat":" This will result in loss of work ","trackedToSentry_pre":"The error with identifier ","trackedToSentry_post":" was tracked on our system.","openIssueMessage_pre":"We were very cautious not to include your scene information on the error. If your scene is not private, please consider following up on our ","openIssueMessage_button":"bug tracker.","openIssueMessage_post":" Please include information below by copying and pasting into the GitHub issue.","sceneContent":"Scene content:"},"roomDialog":{"desc_intro":"You can invite people to your current scene to collaborate with you.","desc_privacy":"Don\'t worry, the session uses end-to-end encryption, so whatever you draw will stay private. Not even our server will be able to see what you come up with.","button_startSession":"Start session","button_stopSession":"Stop session","desc_inProgressIntro":"Live-collaboration session is now in progress.","desc_shareLink":"Share this link with anyone you want to collaborate with:","desc_exitSession":"Stopping the session will disconnect you from the room, but you\'ll be able to continue working with the scene, locally. Note that this won\'t affect other people, and they\'ll still be able to collaborate on their version.","shareTitle":"Join a live collaboration session on Excalidraw"},"errorDialog":{"title":"Error"},"exportDialog":{"disk_title":"Save to disk","disk_details":"Export the scene data to a file from which you can import later.","disk_button":"Save to file","link_title":"Shareable link","link_details":"Export as a read-only link.","link_button":"Export to Link","excalidrawplus_description":"Save the scene to your Excalidraw+ workspace.","excalidrawplus_button":"Export","excalidrawplus_exportError":"Couldn\'t export to Excalidraw+ at this moment..."},"helpDialog":{"blog":"Read our blog","click":"click","curvedArrow":"Curved arrow","curvedLine":"Curved line","documentation":"Documentation","doubleClick":"double-click","drag":"drag","editor":"Editor","editSelectedShape":"Edit selected shape (text/arrow/line)","github":"Found an issue? Submit","howto":"Follow our guides","or":"or","preventBinding":"Prevent arrow binding","shapes":"Shapes","shortcuts":"Keyboard shortcuts","textFinish":"Finish editing (text editor)","textNewLine":"Add new line (text editor)","title":"Help","view":"View","zoomToFit":"Zoom to fit all elements","zoomToSelection":"Zoom to selection"},"encrypted":{"tooltip":"Your drawings are end-to-end encrypted so Excalidraw\'s servers will never see them.","link":"Blog post on end-to-end encryption in Excalidraw"},"stats":{"angle":"Angle","element":"Element","elements":"Elements","height":"Height","scene":"Scene","selected":"Selected","storage":"Storage","title":"Stats for nerds","total":"Total","version":"Version","versionCopy":"Click to copy","versionNotAvailable":"Version not available","width":"Width"},"toast":{"copyStyles":"Copied styles.","copyToClipboard":"Copied to clipboard.","copyToClipboardAsPng":"Copied {{exportSelection}} to clipboard as PNG\\n({{exportColorScheme}})","fileSaved":"File saved.","fileSavedToFilename":"Saved to {filename}","canvas":"canvas","selection":"selection"},"colors":{"495057":"Gray 7","ffffff":"White","f8f9fa":"Gray 0","f1f3f5":"Gray 1","fff5f5":"Red 0","fff0f6":"Pink 0","f8f0fc":"Grape 0","f3f0ff":"Violet 0","edf2ff":"Indigo 0","e7f5ff":"Blue 0","e3fafc":"Cyan 0","e6fcf5":"Teal 0","ebfbee":"Green 0","f4fce3":"Lime 0","fff9db":"Yellow 0","fff4e6":"Orange 0","transparent":"Transparent","ced4da":"Gray 4","868e96":"Gray 6","fa5252":"Red 6","e64980":"Pink 6","be4bdb":"Grape 6","7950f2":"Violet 6","4c6ef5":"Indigo 6","228be6":"Blue 6","15aabf":"Cyan 6","12b886":"Teal 6","40c057":"Green 6","82c91e":"Lime 6","fab005":"Yellow 6","fd7e14":"Orange 6","000000":"Black","343a40":"Gray 8","c92a2a":"Red 9","a61e4d":"Pink 9","862e9c":"Grape 9","5f3dc4":"Violet 9","364fc7":"Indigo 9","1864ab":"Blue 9","0b7285":"Cyan 9","087f5b":"Teal 9","2b8a3e":"Green 9","5c940d":"Lime 9","e67700":"Yellow 9","d9480f":"Orange 9"}}');
2814
2814
 
2815
2815
  /***/ }),
2816
2816
 
@@ -2821,7 +2821,7 @@ module.exports = JSON.parse('{"labels":{"paste":"Paste","pasteCharts":"Paste cha
2821
2821
  /***/ ((module) => {
2822
2822
 
2823
2823
  "use strict";
2824
- module.exports = JSON.parse('{"ar-SA":90,"bg-BG":81,"ca-ES":100,"cs-CZ":35,"da-DK":24,"de-DE":100,"el-GR":86,"en":100,"es-ES":98,"fa-IR":92,"fi-FI":99,"fr-FR":100,"he-IL":78,"hi-IN":80,"hu-HU":71,"id-ID":100,"it-IT":100,"ja-JP":100,"kab-KAB":98,"kk-KZ":31,"ko-KR":81,"lv-LV":16,"my-MM":67,"nb-NO":100,"nl-NL":100,"nn-NO":88,"oc-FR":100,"pa-IN":96,"pl-PL":83,"pt-BR":88,"pt-PT":100,"ro-RO":100,"ru-RU":100,"sk-SK":100,"sv-SE":100,"tr-TR":93,"uk-UA":95,"zh-CN":98,"zh-TW":99}');
2824
+ module.exports = JSON.parse('{"ar-SA":100,"bg-BG":68,"ca-ES":84,"cs-CZ":30,"da-DK":20,"de-DE":100,"el-GR":73,"en":100,"es-ES":83,"fa-IR":77,"fi-FI":84,"fr-FR":100,"he-IL":72,"hi-IN":67,"hu-HU":60,"id-ID":100,"it-IT":100,"ja-JP":100,"kab-KAB":93,"kk-KZ":26,"ko-KR":68,"lv-LV":14,"my-MM":56,"nb-NO":100,"nl-NL":98,"nn-NO":74,"oc-FR":100,"pa-IN":100,"pl-PL":70,"pt-BR":100,"pt-PT":100,"ro-RO":100,"ru-RU":100,"sk-SK":100,"sv-SE":100,"tr-TR":78,"uk-UA":80,"zh-CN":100,"zh-TW":99}');
2825
2825
 
2826
2826
  /***/ }),
2827
2827
 
@@ -2832,7 +2832,7 @@ module.exports = JSON.parse('{"ar-SA":90,"bg-BG":81,"ca-ES":100,"cs-CZ":35,"da-D
2832
2832
  /***/ ((module) => {
2833
2833
 
2834
2834
  "use strict";
2835
- module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.9.0-obsidian-5","main":"main.js","types":"types/packages/excalidraw/index.d.ts","files":["dist/*","types/*"],"publishConfig":{"access":"public"},"description":"Excalidraw as a React component","repository":"https://github.com/excalidraw/excalidraw","license":"MIT","keywords":["excalidraw","excalidraw-embed","react","npm","npm excalidraw"],"browserslist":{"production":[">0.2%","not dead","not ie <= 11","not op_mini all","not safari < 12","not kaios <= 2.5","not edge < 79","not chrome < 70","not and_uc < 13","not samsung < 10"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"peerDependencies":{"react":"^17.0.2","react-dom":"^17.0.2"},"devDependencies":{"@babel/core":"7.14.8","@babel/plugin-transform-arrow-functions":"7.14.5","@babel/plugin-transform-async-to-generator":"7.14.5","@babel/plugin-transform-runtime":"7.14.5","@babel/plugin-transform-typescript":"7.14.6","@babel/preset-env":"7.14.9","@babel/preset-react":"7.14.5","@babel/preset-typescript":"7.14.5","autoprefixer":"10.3.1","babel-loader":"8.2.2","babel-plugin-transform-class-properties":"6.24.1","cross-env":"7.0.3","css-loader":"5.2.6","file-loader":"6.2.0","mini-css-extract-plugin":"1.6.1","postcss-loader":"6.1.1","sass-loader":"12.1.0","terser-webpack-plugin":"5.1.4","ts-loader":"9.2.4","typescript":"4.3.5","webpack":"5.50.0","webpack-bundle-analyzer":"4.4.2","webpack-cli":"4.7.2"},"bugs":"https://github.com/excalidraw/excalidraw/issues","homepage":"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw","scripts":{"gen:types":"tsc --project ../../../tsconfig-types.json","build:umd":"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types","build:umd:withAnalyzer":"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js","pack":"yarn build:umd && yarn pack"}}');
2835
+ module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.9.0-obsidian-9","main":"main.js","types":"types/packages/excalidraw/index.d.ts","files":["dist/*","types/*"],"publishConfig":{"access":"public"},"description":"Excalidraw as a React component","repository":"https://github.com/excalidraw/excalidraw","license":"MIT","keywords":["excalidraw","excalidraw-embed","react","npm","npm excalidraw"],"browserslist":{"production":[">0.2%","not dead","not ie <= 11","not op_mini all","not safari < 12","not kaios <= 2.5","not edge < 79","not chrome < 70","not and_uc < 13","not samsung < 10"],"development":["last 1 chrome version","last 1 firefox version","last 1 safari version"]},"peerDependencies":{"react":"^17.0.2","react-dom":"^17.0.2"},"devDependencies":{"@babel/core":"7.14.8","@babel/plugin-transform-arrow-functions":"7.14.5","@babel/plugin-transform-async-to-generator":"7.14.5","@babel/plugin-transform-runtime":"7.14.5","@babel/plugin-transform-typescript":"7.14.6","@babel/preset-env":"7.14.9","@babel/preset-react":"7.14.5","@babel/preset-typescript":"7.14.5","autoprefixer":"10.3.1","babel-loader":"8.2.2","babel-plugin-transform-class-properties":"6.24.1","cross-env":"7.0.3","css-loader":"5.2.6","file-loader":"6.2.0","mini-css-extract-plugin":"1.6.1","postcss-loader":"6.1.1","sass-loader":"12.1.0","terser-webpack-plugin":"5.1.4","ts-loader":"9.2.4","typescript":"4.3.5","webpack":"5.50.0","webpack-bundle-analyzer":"4.4.2","webpack-cli":"4.7.2"},"bugs":"https://github.com/excalidraw/excalidraw/issues","homepage":"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw","scripts":{"gen:types":"tsc --project ../../../tsconfig-types.json","build:umd":"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types","build:umd:withAnalyzer":"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js","pack":"yarn build:umd && yarn pack"}}');
2836
2836
 
2837
2837
  /***/ })
2838
2838
 
@@ -2938,7 +2938,7 @@ module.exports = JSON.parse('{"name":"@zsviczian/excalidraw","version":"0.9.0-ob
2938
2938
  /******/ // This function allow to reference async chunks
2939
2939
  /******/ __webpack_require__.u = (chunkId) => {
2940
2940
  /******/ // return url for filenames based on template
2941
- /******/ return "excalidraw-assets-dev/" + chunkId + "-" + {"i18n-ar-SA-json":"8762f1b4f8506bb671cc","i18n-bg-BG-json":"a22c1090c7710e7224e9","i18n-ca-ES-json":"cae20cfd28537629a5c3","i18n-cs-CZ-json":"0f816286ac71084bc260","i18n-da-DK-json":"7b31fb592027c574252a","i18n-de-DE-json":"cd1b9a96c40c1214437f","i18n-el-GR-json":"8950d1c770bb739bc959","i18n-es-ES-json":"ff8d3c988332349324b0","i18n-fa-IR-json":"c73016eff7a6ff5d7c18","i18n-fi-FI-json":"bc393e1d562c37671962","i18n-fr-FR-json":"3ab1159cad2de3c20dcc","i18n-he-IL-json":"317678dc1c48b901bfb0","i18n-hi-IN-json":"ef79503b785a86a4d7e4","i18n-hu-HU-json":"589f4fe4e5271cc8b905","i18n-id-ID-json":"21a624246904b7e41f4a","i18n-it-IT-json":"65c3715ea484ae03ccf5","i18n-ja-JP-json":"db3c1426e054a5eabd0e","i18n-kab-KAB-json":"96dec5963f8bde319606","i18n-kk-KZ-json":"8b99ef209de2ab375283","i18n-ko-KR-json":"4db910c9a500e94328bd","i18n-lv-LV-json":"edc8d3b64bad828f29d1","i18n-my-MM-json":"94f177b41ad570aed0e2","i18n-nb-NO-json":"f622ae767c6fb7da0359","i18n-nl-NL-json":"029a4337aaabed4c9288","i18n-nn-NO-json":"50abd892a02e69a883ff","i18n-oc-FR-json":"32bba579cbe508c2d6b4","i18n-pa-IN-json":"eebd0b703eab5181194a","i18n-pl-PL-json":"296ec26c591842760f6f","i18n-pt-BR-json":"8654a77d14593257605e","i18n-pt-PT-json":"3dcb13e958e56026feef","i18n-ro-RO-json":"b4f5aa1801ab335c9c27","i18n-ru-RU-json":"aa64cf921fe14692fff6","i18n-sk-SK-json":"64d8c54b4e322042f4ef","i18n-sv-SE-json":"b5cf0c46dcfc4ecb6d00","i18n-tr-TR-json":"801be2b32d052c1cc5fd","i18n-uk-UA-json":"cf0c4a4659e179efded6","i18n-zh-CN-json":"e2e68b548639c6708d55","i18n-zh-TW-json":"455a3759551c2688bd1b","vendor":"7ad6c104c3421ae6511d","image":"cacb3d0c02eb2e346ecc"}[chunkId] + ".js";
2941
+ /******/ return "excalidraw-assets-dev/" + chunkId + "-" + {"i18n-ar-SA-json":"8617476a4caf18fc0371","i18n-bg-BG-json":"709d1cdbcdd08cb4196e","i18n-ca-ES-json":"00e9a306a6883ffbbe57","i18n-cs-CZ-json":"bc9a303ff98ced90903d","i18n-da-DK-json":"43287c62e4e654a62e4b","i18n-de-DE-json":"32a0c6840217959c613d","i18n-el-GR-json":"f03c81650fc237c5cf4a","i18n-es-ES-json":"e9fa5e81b395ea04cf35","i18n-fa-IR-json":"c234b5e54cd2a1672898","i18n-fi-FI-json":"29106b8736c3568b0e7a","i18n-fr-FR-json":"b4382269051ef449f22a","i18n-he-IL-json":"9f9592408d2171d94d28","i18n-hi-IN-json":"dfd30ffcd688b76d247b","i18n-hu-HU-json":"385ed66ee674f14883ce","i18n-id-ID-json":"8606e52f65cda64f84de","i18n-it-IT-json":"47d0eb1c1ca8ffcc6a8c","i18n-ja-JP-json":"041d339b6d1c6c40a696","i18n-kab-KAB-json":"bc3faead75b6f428fa0e","i18n-kk-KZ-json":"a7087f74220ab6202b31","i18n-ko-KR-json":"e3fba288c9957c8010cf","i18n-lv-LV-json":"08034ebe84bb974c35c3","i18n-my-MM-json":"cc0225c53edbf917e21f","i18n-nb-NO-json":"34f0bfcf72c71d33376d","i18n-nl-NL-json":"62820376fea0b9d31fc3","i18n-nn-NO-json":"a3f47aba453d847cc65a","i18n-oc-FR-json":"d731d0c7c25481aef3c8","i18n-pa-IN-json":"1ccfa9e432207fa34d73","i18n-pl-PL-json":"2c3192cda97bcdfaed27","i18n-pt-BR-json":"8b1f19303a882e28bcb8","i18n-pt-PT-json":"8c9d24df4db900d7eed1","i18n-ro-RO-json":"8ad16b7ee2c00730a103","i18n-ru-RU-json":"d0767891cb65e644f458","i18n-sk-SK-json":"e786dadba6fac2b1625b","i18n-sv-SE-json":"35b10171080a427d71a5","i18n-tr-TR-json":"a15ed70331602c0a16f7","i18n-uk-UA-json":"df1cdfae3f8aa58d22bb","i18n-zh-CN-json":"342311fa1d0fa30c6828","i18n-zh-TW-json":"819e494f1f38cb9ef099","vendor":"7ad6c104c3421ae6511d","image":"cacb3d0c02eb2e346ecc"}[chunkId] + ".js";
2942
2942
  /******/ };
2943
2943
  /******/ })();
2944
2944
  /******/