@cloudbase/js-sdk 3.4.6 → 3.4.7

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 (779) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/ai/dist/index.esm.js +2 -3
  3. package/ai/dist/index.esm.js.map +1 -0
  4. package/ai/dist/index.js +2 -21
  5. package/ai/dist/index.js.map +1 -0
  6. package/apis/dist/index.esm.js +2 -3
  7. package/apis/dist/index.esm.js.map +1 -0
  8. package/apis/dist/index.js +2 -21
  9. package/apis/dist/index.js.map +1 -0
  10. package/app/dist/index.esm.js +2 -11
  11. package/app/dist/index.esm.js.map +1 -0
  12. package/app/dist/index.js +2 -18
  13. package/app/dist/index.js.map +1 -0
  14. package/auth/dist/index.esm.js +3 -8
  15. package/auth/dist/index.esm.js.LICENSE.txt +12 -0
  16. package/auth/dist/index.esm.js.map +1 -0
  17. package/auth/dist/index.js +3 -13
  18. package/auth/dist/index.js.LICENSE.txt +12 -0
  19. package/auth/dist/index.js.map +1 -0
  20. package/cloudrun/dist/index.esm.js +2 -3
  21. package/cloudrun/dist/index.esm.js.map +1 -0
  22. package/cloudrun/dist/index.js +2 -21
  23. package/cloudrun/dist/index.js.map +1 -0
  24. package/container/dist/index.esm.js +2 -8
  25. package/container/dist/index.esm.js.map +1 -0
  26. package/container/dist/index.js +2 -13
  27. package/container/dist/index.js.map +1 -0
  28. package/database/package.json +34 -4
  29. package/dist/index.cjs.js +3 -38
  30. package/dist/index.cjs.js.LICENSE.txt +12 -0
  31. package/dist/index.cjs.js.map +1 -0
  32. package/dist/index.esm.js +3 -33
  33. package/dist/index.esm.js.LICENSE.txt +12 -0
  34. package/dist/index.esm.js.map +1 -0
  35. package/functions/dist/index.esm.js +2 -8
  36. package/functions/dist/index.esm.js.map +1 -0
  37. package/functions/dist/index.js +2 -13
  38. package/functions/dist/index.js.map +1 -0
  39. package/miniprogram_dist/ai.js +1 -1
  40. package/miniprogram_dist/apis.js +1 -1
  41. package/miniprogram_dist/app.js +1 -1
  42. package/miniprogram_dist/auth.js +1 -1
  43. package/miniprogram_dist/cloudrun.js +1 -1
  44. package/miniprogram_dist/container.js +1 -1
  45. package/miniprogram_dist/database.js +1 -1
  46. package/miniprogram_dist/functions.js +1 -1
  47. package/miniprogram_dist/index.js +1 -1
  48. package/miniprogram_dist/model.js +1 -1
  49. package/miniprogram_dist/mysql.js +1 -1
  50. package/miniprogram_dist/oauth.js +2 -1
  51. package/miniprogram_dist/realtime.js +1 -1
  52. package/miniprogram_dist/storage.js +1 -1
  53. package/model/dist/index.esm.js +2 -3
  54. package/model/dist/index.esm.js.map +1 -0
  55. package/model/dist/index.js +2 -21
  56. package/model/dist/index.js.map +1 -0
  57. package/mysql/dist/index.esm.js +2 -3
  58. package/mysql/dist/index.esm.js.map +1 -0
  59. package/mysql/dist/index.js +2 -21
  60. package/mysql/dist/index.js.map +1 -0
  61. package/oauth/dist/index.esm.js +3 -3
  62. package/oauth/dist/index.esm.js.LICENSE.txt +12 -0
  63. package/oauth/dist/index.esm.js.map +1 -0
  64. package/oauth/dist/index.js +3 -21
  65. package/oauth/dist/index.js.LICENSE.txt +12 -0
  66. package/oauth/dist/index.js.map +1 -0
  67. package/package.json +29 -47
  68. package/realtime/dist/index.esm.js +2 -8
  69. package/realtime/dist/index.esm.js.map +1 -0
  70. package/realtime/dist/index.js +2 -13
  71. package/realtime/dist/index.js.map +1 -0
  72. package/storage/dist/index.esm.js +2 -4
  73. package/storage/dist/index.esm.js.map +1 -0
  74. package/storage/dist/index.js +2 -9
  75. package/storage/dist/index.js.map +1 -0
  76. package/types/analytics.d.ts +51 -0
  77. package/types/container.d.ts +93 -0
  78. package/{node_modules/@cloudbase/types → types}/package.json +1 -1
  79. package/{node_modules/@cloudbase/utilities → utilities}/package.json +2 -2
  80. package/ai/src/index.d.ts +0 -1
  81. package/ai/src/index.ts +0 -1
  82. package/apis/src/index.d.ts +0 -1
  83. package/apis/src/index.ts +0 -1
  84. package/app/src/index.ts +0 -17
  85. package/auth/src/index.d.ts +0 -2
  86. package/auth/src/index.ts +0 -8
  87. package/cloudrun/src/index.d.ts +0 -1
  88. package/cloudrun/src/index.ts +0 -1
  89. package/container/src/index.d.ts +0 -2
  90. package/container/src/index.ts +0 -8
  91. package/database/dist/index.d.ts +0 -3
  92. package/database/dist/index.esm.js +0 -503
  93. package/database/dist/index.js +0 -509
  94. package/database/src/index.d.ts +0 -3
  95. package/database/src/index.ts +0 -486
  96. package/functions/src/index.d.ts +0 -2
  97. package/functions/src/index.ts +0 -8
  98. package/model/src/index.d.ts +0 -1
  99. package/model/src/index.ts +0 -1
  100. package/mysql/src/index.d.ts +0 -1
  101. package/mysql/src/index.ts +0 -1
  102. package/node_modules/@cloudbase/ai/.eslintrc.js +0 -15
  103. package/node_modules/@cloudbase/ai/dist/cjs/AI.d.ts +0 -27
  104. package/node_modules/@cloudbase/ai/dist/cjs/AI.js +0 -224
  105. package/node_modules/@cloudbase/ai/dist/cjs/bot/index.d.ts +0 -41
  106. package/node_modules/@cloudbase/ai/dist/cjs/bot/index.js +0 -376
  107. package/node_modules/@cloudbase/ai/dist/cjs/bot/types.d.ts +0 -144
  108. package/node_modules/@cloudbase/ai/dist/cjs/bot/types.js +0 -3
  109. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/index.d.ts +0 -2
  110. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/index.js +0 -6
  111. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/parse.d.ts +0 -2
  112. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/parse.js +0 -126
  113. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/stream.d.ts +0 -5
  114. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/stream.js +0 -40
  115. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/types.d.ts +0 -16
  116. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/types.js +0 -3
  117. package/node_modules/@cloudbase/ai/dist/cjs/index.d.ts +0 -40
  118. package/node_modules/@cloudbase/ai/dist/cjs/index.js +0 -187
  119. package/node_modules/@cloudbase/ai/dist/cjs/models/Ark/index.d.ts +0 -10
  120. package/node_modules/@cloudbase/ai/dist/cjs/models/Ark/index.js +0 -130
  121. package/node_modules/@cloudbase/ai/dist/cjs/models/Ark/type.d.ts +0 -71
  122. package/node_modules/@cloudbase/ai/dist/cjs/models/Ark/type.js +0 -3
  123. package/node_modules/@cloudbase/ai/dist/cjs/models/DashScope/index.d.ts +0 -10
  124. package/node_modules/@cloudbase/ai/dist/cjs/models/DashScope/index.js +0 -130
  125. package/node_modules/@cloudbase/ai/dist/cjs/models/DashScope/type.d.ts +0 -74
  126. package/node_modules/@cloudbase/ai/dist/cjs/models/DashScope/type.js +0 -3
  127. package/node_modules/@cloudbase/ai/dist/cjs/models/DeepSeek/index.d.ts +0 -10
  128. package/node_modules/@cloudbase/ai/dist/cjs/models/DeepSeek/index.js +0 -126
  129. package/node_modules/@cloudbase/ai/dist/cjs/models/Default/index.d.ts +0 -10
  130. package/node_modules/@cloudbase/ai/dist/cjs/models/Default/index.js +0 -122
  131. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/index.d.ts +0 -10
  132. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/index.js +0 -135
  133. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/type.d.ts +0 -74
  134. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/type.js +0 -3
  135. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/util.d.ts +0 -4
  136. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/util.js +0 -56
  137. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanBeta/index.d.ts +0 -10
  138. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanBeta/index.js +0 -127
  139. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanExp/index.d.ts +0 -10
  140. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanExp/index.js +0 -125
  141. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanOpen/index.d.ts +0 -10
  142. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanOpen/index.js +0 -127
  143. package/node_modules/@cloudbase/ai/dist/cjs/models/Moonshot/index.d.ts +0 -10
  144. package/node_modules/@cloudbase/ai/dist/cjs/models/Moonshot/index.js +0 -130
  145. package/node_modules/@cloudbase/ai/dist/cjs/models/Moonshot/type.d.ts +0 -85
  146. package/node_modules/@cloudbase/ai/dist/cjs/models/Moonshot/type.js +0 -3
  147. package/node_modules/@cloudbase/ai/dist/cjs/models/Yi/index.d.ts +0 -10
  148. package/node_modules/@cloudbase/ai/dist/cjs/models/Yi/index.js +0 -133
  149. package/node_modules/@cloudbase/ai/dist/cjs/models/Yi/type.d.ts +0 -75
  150. package/node_modules/@cloudbase/ai/dist/cjs/models/Yi/type.js +0 -3
  151. package/node_modules/@cloudbase/ai/dist/cjs/models/ZhiPu/index.d.ts +0 -10
  152. package/node_modules/@cloudbase/ai/dist/cjs/models/ZhiPu/index.js +0 -139
  153. package/node_modules/@cloudbase/ai/dist/cjs/models/ZhiPu/type.d.ts +0 -71
  154. package/node_modules/@cloudbase/ai/dist/cjs/models/ZhiPu/type.js +0 -3
  155. package/node_modules/@cloudbase/ai/dist/cjs/models/image-model.d.ts +0 -18
  156. package/node_modules/@cloudbase/ai/dist/cjs/models/image-model.js +0 -85
  157. package/node_modules/@cloudbase/ai/dist/cjs/models/index.d.ts +0 -26
  158. package/node_modules/@cloudbase/ai/dist/cjs/models/index.js +0 -42
  159. package/node_modules/@cloudbase/ai/dist/cjs/models/model.d.ts +0 -40
  160. package/node_modules/@cloudbase/ai/dist/cjs/models/model.js +0 -481
  161. package/node_modules/@cloudbase/ai/dist/cjs/type.d.ts +0 -190
  162. package/node_modules/@cloudbase/ai/dist/cjs/type.js +0 -10
  163. package/node_modules/@cloudbase/ai/dist/cjs/utils.d.ts +0 -38
  164. package/node_modules/@cloudbase/ai/dist/cjs/utils.js +0 -263
  165. package/node_modules/@cloudbase/ai/dist/esm/AI.d.ts +0 -27
  166. package/node_modules/@cloudbase/ai/dist/esm/AI.js +0 -198
  167. package/node_modules/@cloudbase/ai/dist/esm/bot/index.d.ts +0 -41
  168. package/node_modules/@cloudbase/ai/dist/esm/bot/index.js +0 -373
  169. package/node_modules/@cloudbase/ai/dist/esm/bot/types.d.ts +0 -144
  170. package/node_modules/@cloudbase/ai/dist/esm/bot/types.js +0 -2
  171. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/index.d.ts +0 -2
  172. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/index.js +0 -2
  173. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/parse.d.ts +0 -2
  174. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/parse.js +0 -122
  175. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/stream.d.ts +0 -5
  176. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/stream.js +0 -37
  177. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/types.d.ts +0 -16
  178. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/types.js +0 -2
  179. package/node_modules/@cloudbase/ai/dist/esm/index.d.ts +0 -40
  180. package/node_modules/@cloudbase/ai/dist/esm/index.js +0 -152
  181. package/node_modules/@cloudbase/ai/dist/esm/models/Ark/index.d.ts +0 -10
  182. package/node_modules/@cloudbase/ai/dist/esm/models/Ark/index.js +0 -127
  183. package/node_modules/@cloudbase/ai/dist/esm/models/Ark/type.d.ts +0 -71
  184. package/node_modules/@cloudbase/ai/dist/esm/models/Ark/type.js +0 -2
  185. package/node_modules/@cloudbase/ai/dist/esm/models/DashScope/index.d.ts +0 -10
  186. package/node_modules/@cloudbase/ai/dist/esm/models/DashScope/index.js +0 -127
  187. package/node_modules/@cloudbase/ai/dist/esm/models/DashScope/type.d.ts +0 -74
  188. package/node_modules/@cloudbase/ai/dist/esm/models/DashScope/type.js +0 -2
  189. package/node_modules/@cloudbase/ai/dist/esm/models/DeepSeek/index.d.ts +0 -10
  190. package/node_modules/@cloudbase/ai/dist/esm/models/DeepSeek/index.js +0 -123
  191. package/node_modules/@cloudbase/ai/dist/esm/models/Default/index.d.ts +0 -10
  192. package/node_modules/@cloudbase/ai/dist/esm/models/Default/index.js +0 -119
  193. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/index.d.ts +0 -10
  194. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/index.js +0 -132
  195. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/type.d.ts +0 -74
  196. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/type.js +0 -2
  197. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/util.d.ts +0 -4
  198. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/util.js +0 -51
  199. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanBeta/index.d.ts +0 -10
  200. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanBeta/index.js +0 -124
  201. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanExp/index.d.ts +0 -10
  202. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanExp/index.js +0 -122
  203. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanOpen/index.d.ts +0 -10
  204. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanOpen/index.js +0 -124
  205. package/node_modules/@cloudbase/ai/dist/esm/models/Moonshot/index.d.ts +0 -10
  206. package/node_modules/@cloudbase/ai/dist/esm/models/Moonshot/index.js +0 -127
  207. package/node_modules/@cloudbase/ai/dist/esm/models/Moonshot/type.d.ts +0 -85
  208. package/node_modules/@cloudbase/ai/dist/esm/models/Moonshot/type.js +0 -2
  209. package/node_modules/@cloudbase/ai/dist/esm/models/Yi/index.d.ts +0 -10
  210. package/node_modules/@cloudbase/ai/dist/esm/models/Yi/index.js +0 -130
  211. package/node_modules/@cloudbase/ai/dist/esm/models/Yi/type.d.ts +0 -75
  212. package/node_modules/@cloudbase/ai/dist/esm/models/Yi/type.js +0 -2
  213. package/node_modules/@cloudbase/ai/dist/esm/models/ZhiPu/index.d.ts +0 -10
  214. package/node_modules/@cloudbase/ai/dist/esm/models/ZhiPu/index.js +0 -136
  215. package/node_modules/@cloudbase/ai/dist/esm/models/ZhiPu/type.d.ts +0 -71
  216. package/node_modules/@cloudbase/ai/dist/esm/models/ZhiPu/type.js +0 -2
  217. package/node_modules/@cloudbase/ai/dist/esm/models/image-model.d.ts +0 -18
  218. package/node_modules/@cloudbase/ai/dist/esm/models/image-model.js +0 -82
  219. package/node_modules/@cloudbase/ai/dist/esm/models/index.d.ts +0 -26
  220. package/node_modules/@cloudbase/ai/dist/esm/models/index.js +0 -27
  221. package/node_modules/@cloudbase/ai/dist/esm/models/model.d.ts +0 -40
  222. package/node_modules/@cloudbase/ai/dist/esm/models/model.js +0 -478
  223. package/node_modules/@cloudbase/ai/dist/esm/type.d.ts +0 -190
  224. package/node_modules/@cloudbase/ai/dist/esm/type.js +0 -7
  225. package/node_modules/@cloudbase/ai/dist/esm/utils.d.ts +0 -38
  226. package/node_modules/@cloudbase/ai/dist/esm/utils.js +0 -252
  227. package/node_modules/@cloudbase/ai/dist/miniprogram/index.js +0 -2
  228. package/node_modules/@cloudbase/ai/dist/miniprogram/index.js.LICENSE.txt +0 -22
  229. package/node_modules/@cloudbase/ai/package.json +0 -32
  230. package/node_modules/@cloudbase/apis/.eslintrc.js +0 -15
  231. package/node_modules/@cloudbase/apis/dist/cjs/callApis.d.ts +0 -20
  232. package/node_modules/@cloudbase/apis/dist/cjs/callApis.js +0 -154
  233. package/node_modules/@cloudbase/apis/dist/cjs/index.d.ts +0 -5
  234. package/node_modules/@cloudbase/apis/dist/cjs/index.js +0 -53
  235. package/node_modules/@cloudbase/apis/dist/cjs/type.d.ts +0 -14
  236. package/node_modules/@cloudbase/apis/dist/cjs/type.js +0 -3
  237. package/node_modules/@cloudbase/apis/dist/esm/callApis.d.ts +0 -20
  238. package/node_modules/@cloudbase/apis/dist/esm/callApis.js +0 -148
  239. package/node_modules/@cloudbase/apis/dist/esm/index.d.ts +0 -5
  240. package/node_modules/@cloudbase/apis/dist/esm/index.js +0 -35
  241. package/node_modules/@cloudbase/apis/dist/esm/type.d.ts +0 -14
  242. package/node_modules/@cloudbase/apis/dist/esm/type.js +0 -2
  243. package/node_modules/@cloudbase/apis/dist/miniprogram/index.js +0 -1
  244. package/node_modules/@cloudbase/apis/package.json +0 -28
  245. package/node_modules/@cloudbase/app/.eslintrc.js +0 -12
  246. package/node_modules/@cloudbase/app/dist/cjs/constants/common.d.ts +0 -38
  247. package/node_modules/@cloudbase/app/dist/cjs/constants/common.js +0 -103
  248. package/node_modules/@cloudbase/app/dist/cjs/index.d.ts +0 -65
  249. package/node_modules/@cloudbase/app/dist/cjs/index.js +0 -340
  250. package/node_modules/@cloudbase/app/dist/cjs/index.node.d.ts +0 -6
  251. package/node_modules/@cloudbase/app/dist/cjs/index.node.js +0 -27
  252. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/constants.d.ts +0 -33
  253. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/constants.js +0 -38
  254. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/context.d.ts +0 -17
  255. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/context.js +0 -189
  256. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/index.d.ts +0 -25
  257. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/index.js +0 -150
  258. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/metadata.d.ts +0 -14
  259. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/metadata.js +0 -130
  260. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/request.d.ts +0 -41
  261. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/request.js +0 -521
  262. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/tool.d.ts +0 -2
  263. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/tool.js +0 -354
  264. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/types.d.ts +0 -102
  265. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/types.js +0 -3
  266. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/utils.d.ts +0 -37
  267. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/utils.js +0 -286
  268. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/wx.d.ts +0 -39
  269. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/wx.js +0 -272
  270. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter.d.ts +0 -3
  271. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter.js +0 -163
  272. package/node_modules/@cloudbase/app/dist/cjs/libs/cache.d.ts +0 -6
  273. package/node_modules/@cloudbase/app/dist/cjs/libs/cache.js +0 -38
  274. package/node_modules/@cloudbase/app/dist/cjs/libs/component.d.ts +0 -3
  275. package/node_modules/@cloudbase/app/dist/cjs/libs/component.js +0 -126
  276. package/node_modules/@cloudbase/app/dist/cjs/libs/lang.d.ts +0 -23
  277. package/node_modules/@cloudbase/app/dist/cjs/libs/lang.js +0 -59
  278. package/node_modules/@cloudbase/app/dist/cjs/libs/request.d.ts +0 -62
  279. package/node_modules/@cloudbase/app/dist/cjs/libs/request.js +0 -480
  280. package/node_modules/@cloudbase/app/dist/esm/constants/common.d.ts +0 -38
  281. package/node_modules/@cloudbase/app/dist/esm/constants/common.js +0 -91
  282. package/node_modules/@cloudbase/app/dist/esm/index.d.ts +0 -65
  283. package/node_modules/@cloudbase/app/dist/esm/index.js +0 -335
  284. package/node_modules/@cloudbase/app/dist/esm/index.node.d.ts +0 -6
  285. package/node_modules/@cloudbase/app/dist/esm/index.node.js +0 -19
  286. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/constants.d.ts +0 -33
  287. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/constants.js +0 -35
  288. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/context.d.ts +0 -17
  289. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/context.js +0 -181
  290. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/index.d.ts +0 -25
  291. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/index.js +0 -120
  292. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/metadata.d.ts +0 -14
  293. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/metadata.js +0 -123
  294. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/request.d.ts +0 -41
  295. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/request.js +0 -495
  296. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/tool.d.ts +0 -2
  297. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/tool.js +0 -350
  298. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/types.d.ts +0 -102
  299. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/types.js +0 -2
  300. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/utils.d.ts +0 -37
  301. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/utils.js +0 -264
  302. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/wx.d.ts +0 -39
  303. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/wx.js +0 -237
  304. package/node_modules/@cloudbase/app/dist/esm/libs/adapter.d.ts +0 -3
  305. package/node_modules/@cloudbase/app/dist/esm/libs/adapter.js +0 -136
  306. package/node_modules/@cloudbase/app/dist/esm/libs/cache.d.ts +0 -6
  307. package/node_modules/@cloudbase/app/dist/esm/libs/cache.js +0 -32
  308. package/node_modules/@cloudbase/app/dist/esm/libs/component.d.ts +0 -3
  309. package/node_modules/@cloudbase/app/dist/esm/libs/component.js +0 -121
  310. package/node_modules/@cloudbase/app/dist/esm/libs/lang.d.ts +0 -23
  311. package/node_modules/@cloudbase/app/dist/esm/libs/lang.js +0 -54
  312. package/node_modules/@cloudbase/app/dist/esm/libs/request.d.ts +0 -62
  313. package/node_modules/@cloudbase/app/dist/esm/libs/request.js +0 -475
  314. package/node_modules/@cloudbase/app/dist/miniprogram/index.js +0 -2
  315. package/node_modules/@cloudbase/app/dist/miniprogram/index.js.LICENSE.txt +0 -7
  316. package/node_modules/@cloudbase/app/package.json +0 -59
  317. package/node_modules/@cloudbase/auth/.eslintrc.js +0 -15
  318. package/node_modules/@cloudbase/auth/dist/cjs/adapter.d.ts +0 -2
  319. package/node_modules/@cloudbase/auth/dist/cjs/adapter.js +0 -272
  320. package/node_modules/@cloudbase/auth/dist/cjs/index.d.ts +0 -283
  321. package/node_modules/@cloudbase/auth/dist/cjs/index.js +0 -3018
  322. package/node_modules/@cloudbase/auth/dist/cjs/type.d.ts +0 -258
  323. package/node_modules/@cloudbase/auth/dist/cjs/type.js +0 -6
  324. package/node_modules/@cloudbase/auth/dist/cjs/utilities.d.ts +0 -7
  325. package/node_modules/@cloudbase/auth/dist/cjs/utilities.js +0 -23
  326. package/node_modules/@cloudbase/auth/dist/cjs/utils.d.ts +0 -5
  327. package/node_modules/@cloudbase/auth/dist/cjs/utils.js +0 -60
  328. package/node_modules/@cloudbase/auth/dist/cjs/v1-compat.d.ts +0 -77
  329. package/node_modules/@cloudbase/auth/dist/cjs/v1-compat.js +0 -423
  330. package/node_modules/@cloudbase/auth/dist/esm/adapter.d.ts +0 -2
  331. package/node_modules/@cloudbase/auth/dist/esm/adapter.js +0 -268
  332. package/node_modules/@cloudbase/auth/dist/esm/index.d.ts +0 -283
  333. package/node_modules/@cloudbase/auth/dist/esm/index.js +0 -3008
  334. package/node_modules/@cloudbase/auth/dist/esm/type.d.ts +0 -258
  335. package/node_modules/@cloudbase/auth/dist/esm/type.js +0 -3
  336. package/node_modules/@cloudbase/auth/dist/esm/utilities.d.ts +0 -7
  337. package/node_modules/@cloudbase/auth/dist/esm/utilities.js +0 -8
  338. package/node_modules/@cloudbase/auth/dist/esm/utils.d.ts +0 -5
  339. package/node_modules/@cloudbase/auth/dist/esm/utils.js +0 -52
  340. package/node_modules/@cloudbase/auth/dist/esm/v1-compat.d.ts +0 -77
  341. package/node_modules/@cloudbase/auth/dist/esm/v1-compat.js +0 -419
  342. package/node_modules/@cloudbase/auth/dist/miniprogram/index.js +0 -1
  343. package/node_modules/@cloudbase/auth/package.json +0 -31
  344. package/node_modules/@cloudbase/cloudrun/.eslintrc.js +0 -15
  345. package/node_modules/@cloudbase/cloudrun/dist/cjs/index.d.ts +0 -4
  346. package/node_modules/@cloudbase/cloudrun/dist/cjs/index.js +0 -154
  347. package/node_modules/@cloudbase/cloudrun/dist/esm/index.d.ts +0 -4
  348. package/node_modules/@cloudbase/cloudrun/dist/esm/index.js +0 -149
  349. package/node_modules/@cloudbase/cloudrun/package.json +0 -30
  350. package/node_modules/@cloudbase/container/.eslintrc.js +0 -15
  351. package/node_modules/@cloudbase/container/.prettierrc.js +0 -41
  352. package/node_modules/@cloudbase/container/dist/cjs/constants/index.d.ts +0 -1
  353. package/node_modules/@cloudbase/container/dist/cjs/constants/index.js +0 -5
  354. package/node_modules/@cloudbase/container/dist/cjs/go_wams_exec.d.ts +0 -2
  355. package/node_modules/@cloudbase/container/dist/cjs/go_wams_exec.js +0 -538
  356. package/node_modules/@cloudbase/container/dist/cjs/index.d.ts +0 -13
  357. package/node_modules/@cloudbase/container/dist/cjs/index.js +0 -343
  358. package/node_modules/@cloudbase/container/dist/cjs/utils/index.d.ts +0 -3
  359. package/node_modules/@cloudbase/container/dist/cjs/utils/index.js +0 -83
  360. package/node_modules/@cloudbase/container/dist/cjs/utils/loader.d.ts +0 -8
  361. package/node_modules/@cloudbase/container/dist/cjs/utils/loader.js +0 -186
  362. package/node_modules/@cloudbase/container/dist/cjs/utils/request.d.ts +0 -12
  363. package/node_modules/@cloudbase/container/dist/cjs/utils/request.js +0 -106
  364. package/node_modules/@cloudbase/container/dist/esm/constants/index.d.ts +0 -1
  365. package/node_modules/@cloudbase/container/dist/esm/constants/index.js +0 -2
  366. package/node_modules/@cloudbase/container/dist/esm/go_wams_exec.d.ts +0 -2
  367. package/node_modules/@cloudbase/container/dist/esm/go_wams_exec.js +0 -536
  368. package/node_modules/@cloudbase/container/dist/esm/index.d.ts +0 -13
  369. package/node_modules/@cloudbase/container/dist/esm/index.js +0 -338
  370. package/node_modules/@cloudbase/container/dist/esm/utils/index.d.ts +0 -3
  371. package/node_modules/@cloudbase/container/dist/esm/utils/index.js +0 -77
  372. package/node_modules/@cloudbase/container/dist/esm/utils/loader.d.ts +0 -8
  373. package/node_modules/@cloudbase/container/dist/esm/utils/loader.js +0 -178
  374. package/node_modules/@cloudbase/container/dist/esm/utils/request.d.ts +0 -12
  375. package/node_modules/@cloudbase/container/dist/esm/utils/request.js +0 -102
  376. package/node_modules/@cloudbase/container/package.json +0 -30
  377. package/node_modules/@cloudbase/database/README.md +0 -119
  378. package/node_modules/@cloudbase/database/package.json +0 -36
  379. package/node_modules/@cloudbase/database/tsconfig.test.json +0 -15
  380. package/node_modules/@cloudbase/functions/.eslintrc.js +0 -15
  381. package/node_modules/@cloudbase/functions/dist/cjs/index.d.ts +0 -2
  382. package/node_modules/@cloudbase/functions/dist/cjs/index.js +0 -223
  383. package/node_modules/@cloudbase/functions/dist/esm/index.d.ts +0 -2
  384. package/node_modules/@cloudbase/functions/dist/esm/index.js +0 -219
  385. package/node_modules/@cloudbase/functions/package.json +0 -32
  386. package/node_modules/@cloudbase/model/.eslintrc.js +0 -15
  387. package/node_modules/@cloudbase/model/dist/cjs/index.d.ts +0 -5
  388. package/node_modules/@cloudbase/model/dist/cjs/index.js +0 -144
  389. package/node_modules/@cloudbase/model/dist/esm/index.d.ts +0 -5
  390. package/node_modules/@cloudbase/model/dist/esm/index.js +0 -125
  391. package/node_modules/@cloudbase/model/package.json +0 -29
  392. package/node_modules/@cloudbase/mysql/.eslintrc.js +0 -6
  393. package/node_modules/@cloudbase/mysql/dist/cjs/index.d.ts +0 -4
  394. package/node_modules/@cloudbase/mysql/dist/cjs/index.d.ts.map +0 -1
  395. package/node_modules/@cloudbase/mysql/dist/cjs/index.js +0 -173
  396. package/node_modules/@cloudbase/mysql/dist/esm/index.d.ts +0 -3
  397. package/node_modules/@cloudbase/mysql/dist/esm/index.js +0 -155
  398. package/node_modules/@cloudbase/mysql/package.json +0 -30
  399. package/node_modules/@cloudbase/oauth/.eslintrc.js +0 -15
  400. package/node_modules/@cloudbase/oauth/dist/cjs/auth/apis.d.ts +0 -142
  401. package/node_modules/@cloudbase/oauth/dist/cjs/auth/apis.js +0 -1280
  402. package/node_modules/@cloudbase/oauth/dist/cjs/auth/auth-error.d.ts +0 -22
  403. package/node_modules/@cloudbase/oauth/dist/cjs/auth/auth-error.js +0 -278
  404. package/node_modules/@cloudbase/oauth/dist/cjs/auth/consts.d.ts +0 -139
  405. package/node_modules/@cloudbase/oauth/dist/cjs/auth/consts.js +0 -147
  406. package/node_modules/@cloudbase/oauth/dist/cjs/auth/models.d.ts +0 -557
  407. package/node_modules/@cloudbase/oauth/dist/cjs/auth/models.js +0 -3
  408. package/node_modules/@cloudbase/oauth/dist/cjs/captcha/captcha-dom.d.ts +0 -3
  409. package/node_modules/@cloudbase/oauth/dist/cjs/captcha/captcha-dom.js +0 -223
  410. package/node_modules/@cloudbase/oauth/dist/cjs/captcha/captcha.d.ts +0 -42
  411. package/node_modules/@cloudbase/oauth/dist/cjs/captcha/captcha.js +0 -205
  412. package/node_modules/@cloudbase/oauth/dist/cjs/index.d.ts +0 -22
  413. package/node_modules/@cloudbase/oauth/dist/cjs/index.js +0 -107
  414. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/consts.d.ts +0 -20
  415. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/consts.js +0 -26
  416. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/interface.d.ts +0 -15
  417. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/interface.js +0 -10
  418. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/models.d.ts +0 -74
  419. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/models.js +0 -3
  420. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/oauth2client.d.ts +0 -129
  421. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/oauth2client.js +0 -1174
  422. package/node_modules/@cloudbase/oauth/dist/cjs/utils/base64.d.ts +0 -9
  423. package/node_modules/@cloudbase/oauth/dist/cjs/utils/base64.js +0 -112
  424. package/node_modules/@cloudbase/oauth/dist/cjs/utils/encrypt.d.ts +0 -4
  425. package/node_modules/@cloudbase/oauth/dist/cjs/utils/encrypt.js +0 -26
  426. package/node_modules/@cloudbase/oauth/dist/cjs/utils/encryptlong/index.d.ts +0 -546
  427. package/node_modules/@cloudbase/oauth/dist/cjs/utils/encryptlong/index.js +0 -2982
  428. package/node_modules/@cloudbase/oauth/dist/cjs/utils/function/single-promise.d.ts +0 -6
  429. package/node_modules/@cloudbase/oauth/dist/cjs/utils/function/single-promise.js +0 -94
  430. package/node_modules/@cloudbase/oauth/dist/cjs/utils/index.d.ts +0 -2
  431. package/node_modules/@cloudbase/oauth/dist/cjs/utils/index.js +0 -56
  432. package/node_modules/@cloudbase/oauth/dist/cjs/utils/mp.d.ts +0 -2
  433. package/node_modules/@cloudbase/oauth/dist/cjs/utils/mp.js +0 -66
  434. package/node_modules/@cloudbase/oauth/dist/cjs/utils/urlSearchParams.d.ts +0 -13
  435. package/node_modules/@cloudbase/oauth/dist/cjs/utils/urlSearchParams.js +0 -66
  436. package/node_modules/@cloudbase/oauth/dist/cjs/utils/uuid.d.ts +0 -1
  437. package/node_modules/@cloudbase/oauth/dist/cjs/utils/uuid.js +0 -12
  438. package/node_modules/@cloudbase/oauth/dist/esm/auth/apis.d.ts +0 -142
  439. package/node_modules/@cloudbase/oauth/dist/esm/auth/apis.js +0 -768
  440. package/node_modules/@cloudbase/oauth/dist/esm/auth/auth-error.d.ts +0 -22
  441. package/node_modules/@cloudbase/oauth/dist/esm/auth/auth-error.js +0 -255
  442. package/node_modules/@cloudbase/oauth/dist/esm/auth/consts.d.ts +0 -139
  443. package/node_modules/@cloudbase/oauth/dist/esm/auth/consts.js +0 -144
  444. package/node_modules/@cloudbase/oauth/dist/esm/auth/models.d.ts +0 -557
  445. package/node_modules/@cloudbase/oauth/dist/esm/auth/models.js +0 -2
  446. package/node_modules/@cloudbase/oauth/dist/esm/captcha/captcha-dom.d.ts +0 -3
  447. package/node_modules/@cloudbase/oauth/dist/esm/captcha/captcha-dom.js +0 -130
  448. package/node_modules/@cloudbase/oauth/dist/esm/captcha/captcha.d.ts +0 -42
  449. package/node_modules/@cloudbase/oauth/dist/esm/captcha/captcha.js +0 -104
  450. package/node_modules/@cloudbase/oauth/dist/esm/index.d.ts +0 -22
  451. package/node_modules/@cloudbase/oauth/dist/esm/index.js +0 -64
  452. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/consts.d.ts +0 -20
  453. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/consts.js +0 -22
  454. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/interface.d.ts +0 -15
  455. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/interface.js +0 -3
  456. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/models.d.ts +0 -74
  457. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/models.js +0 -2
  458. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/oauth2client.d.ts +0 -129
  459. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/oauth2client.js +0 -711
  460. package/node_modules/@cloudbase/oauth/dist/esm/utils/base64.d.ts +0 -9
  461. package/node_modules/@cloudbase/oauth/dist/esm/utils/base64.js +0 -104
  462. package/node_modules/@cloudbase/oauth/dist/esm/utils/encrypt.d.ts +0 -4
  463. package/node_modules/@cloudbase/oauth/dist/esm/utils/encrypt.js +0 -18
  464. package/node_modules/@cloudbase/oauth/dist/esm/utils/encryptlong/index.d.ts +0 -546
  465. package/node_modules/@cloudbase/oauth/dist/esm/utils/encryptlong/index.js +0 -2953
  466. package/node_modules/@cloudbase/oauth/dist/esm/utils/function/single-promise.d.ts +0 -6
  467. package/node_modules/@cloudbase/oauth/dist/esm/utils/function/single-promise.js +0 -34
  468. package/node_modules/@cloudbase/oauth/dist/esm/utils/index.d.ts +0 -2
  469. package/node_modules/@cloudbase/oauth/dist/esm/utils/index.js +0 -51
  470. package/node_modules/@cloudbase/oauth/dist/esm/utils/mp.d.ts +0 -2
  471. package/node_modules/@cloudbase/oauth/dist/esm/utils/mp.js +0 -61
  472. package/node_modules/@cloudbase/oauth/dist/esm/utils/urlSearchParams.d.ts +0 -13
  473. package/node_modules/@cloudbase/oauth/dist/esm/utils/urlSearchParams.js +0 -58
  474. package/node_modules/@cloudbase/oauth/dist/esm/utils/uuid.d.ts +0 -1
  475. package/node_modules/@cloudbase/oauth/dist/esm/utils/uuid.js +0 -8
  476. package/node_modules/@cloudbase/oauth/dist/miniprogram/index.js +0 -1
  477. package/node_modules/@cloudbase/oauth/package.json +0 -20
  478. package/node_modules/@cloudbase/realtime/.eslintrc.js +0 -15
  479. package/node_modules/@cloudbase/realtime/dist/cjs/common.d.ts +0 -4
  480. package/node_modules/@cloudbase/realtime/dist/cjs/common.js +0 -22
  481. package/node_modules/@cloudbase/realtime/dist/cjs/error.d.ts +0 -36
  482. package/node_modules/@cloudbase/realtime/dist/cjs/error.js +0 -106
  483. package/node_modules/@cloudbase/realtime/dist/cjs/index.d.ts +0 -2
  484. package/node_modules/@cloudbase/realtime/dist/cjs/index.js +0 -36
  485. package/node_modules/@cloudbase/realtime/dist/cjs/listener.d.ts +0 -14
  486. package/node_modules/@cloudbase/realtime/dist/cjs/listener.js +0 -18
  487. package/node_modules/@cloudbase/realtime/dist/cjs/message.d.ts +0 -3
  488. package/node_modules/@cloudbase/realtime/dist/cjs/message.js +0 -13
  489. package/node_modules/@cloudbase/realtime/dist/cjs/snapshot.d.ts +0 -17
  490. package/node_modules/@cloudbase/realtime/dist/cjs/snapshot.js +0 -45
  491. package/node_modules/@cloudbase/realtime/dist/cjs/utils.d.ts +0 -1
  492. package/node_modules/@cloudbase/realtime/dist/cjs/utils.js +0 -9
  493. package/node_modules/@cloudbase/realtime/dist/cjs/virtual-websocket-client.d.ts +0 -62
  494. package/node_modules/@cloudbase/realtime/dist/cjs/virtual-websocket-client.js +0 -960
  495. package/node_modules/@cloudbase/realtime/dist/cjs/websocket-client.d.ts +0 -78
  496. package/node_modules/@cloudbase/realtime/dist/cjs/websocket-client.js +0 -750
  497. package/node_modules/@cloudbase/realtime/dist/cjs/ws-event.d.ts +0 -126
  498. package/node_modules/@cloudbase/realtime/dist/cjs/ws-event.js +0 -141
  499. package/node_modules/@cloudbase/realtime/dist/esm/common.d.ts +0 -4
  500. package/node_modules/@cloudbase/realtime/dist/esm/common.js +0 -15
  501. package/node_modules/@cloudbase/realtime/dist/esm/error.d.ts +0 -36
  502. package/node_modules/@cloudbase/realtime/dist/esm/error.js +0 -100
  503. package/node_modules/@cloudbase/realtime/dist/esm/index.d.ts +0 -2
  504. package/node_modules/@cloudbase/realtime/dist/esm/index.js +0 -32
  505. package/node_modules/@cloudbase/realtime/dist/esm/listener.d.ts +0 -14
  506. package/node_modules/@cloudbase/realtime/dist/esm/listener.js +0 -15
  507. package/node_modules/@cloudbase/realtime/dist/esm/message.d.ts +0 -3
  508. package/node_modules/@cloudbase/realtime/dist/esm/message.js +0 -8
  509. package/node_modules/@cloudbase/realtime/dist/esm/snapshot.d.ts +0 -17
  510. package/node_modules/@cloudbase/realtime/dist/esm/snapshot.js +0 -42
  511. package/node_modules/@cloudbase/realtime/dist/esm/utils.d.ts +0 -1
  512. package/node_modules/@cloudbase/realtime/dist/esm/utils.js +0 -5
  513. package/node_modules/@cloudbase/realtime/dist/esm/virtual-websocket-client.d.ts +0 -62
  514. package/node_modules/@cloudbase/realtime/dist/esm/virtual-websocket-client.js +0 -954
  515. package/node_modules/@cloudbase/realtime/dist/esm/websocket-client.d.ts +0 -78
  516. package/node_modules/@cloudbase/realtime/dist/esm/websocket-client.js +0 -747
  517. package/node_modules/@cloudbase/realtime/dist/esm/ws-event.d.ts +0 -126
  518. package/node_modules/@cloudbase/realtime/dist/esm/ws-event.js +0 -137
  519. package/node_modules/@cloudbase/realtime/package.json +0 -29
  520. package/node_modules/@cloudbase/storage/.eslintrc.js +0 -15
  521. package/node_modules/@cloudbase/storage/dist/cjs/index.d.ts +0 -195
  522. package/node_modules/@cloudbase/storage/dist/cjs/index.js +0 -1426
  523. package/node_modules/@cloudbase/storage/dist/cjs/supabase/errors.d.ts +0 -20
  524. package/node_modules/@cloudbase/storage/dist/cjs/supabase/errors.js +0 -65
  525. package/node_modules/@cloudbase/storage/dist/cjs/supabase/types.d.ts +0 -64
  526. package/node_modules/@cloudbase/storage/dist/cjs/supabase/types.js +0 -3
  527. package/node_modules/@cloudbase/storage/dist/esm/index.d.ts +0 -195
  528. package/node_modules/@cloudbase/storage/dist/esm/index.js +0 -1422
  529. package/node_modules/@cloudbase/storage/dist/esm/supabase/errors.d.ts +0 -20
  530. package/node_modules/@cloudbase/storage/dist/esm/supabase/errors.js +0 -61
  531. package/node_modules/@cloudbase/storage/dist/esm/supabase/types.d.ts +0 -64
  532. package/node_modules/@cloudbase/storage/dist/esm/supabase/types.js +0 -2
  533. package/node_modules/@cloudbase/storage/package.json +0 -28
  534. package/node_modules/@cloudbase/types/index.js +0 -1
  535. package/node_modules/@cloudbase/utilities/.eslintrc.js +0 -15
  536. package/oauth/src/index.d.ts +0 -1
  537. package/oauth/src/index.ts +0 -1
  538. package/realtime/src/index.d.ts +0 -2
  539. package/realtime/src/index.ts +0 -8
  540. package/storage/src/index.d.ts +0 -2
  541. package/storage/src/index.js +0 -5
  542. package/storage/src/index.ts +0 -4
  543. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/aggregate.d.ts +0 -0
  544. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/aggregate.js +0 -0
  545. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/collection.d.ts +0 -0
  546. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/collection.js +0 -0
  547. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/command.d.ts +0 -0
  548. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/command.js +0 -0
  549. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/commands/logic.d.ts +0 -0
  550. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/commands/logic.js +0 -0
  551. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/commands/query.d.ts +0 -0
  552. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/commands/query.js +0 -0
  553. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/commands/update.d.ts +0 -0
  554. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/commands/update.js +0 -0
  555. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/config/app.config.d.ts +0 -0
  556. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/config/app.config.js +0 -0
  557. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/config/error.config.d.ts +0 -0
  558. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/config/error.config.js +0 -0
  559. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/const/code.d.ts +0 -0
  560. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/const/code.js +0 -0
  561. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/constant.d.ts +0 -0
  562. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/constant.js +0 -0
  563. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/document.d.ts +0 -0
  564. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/document.js +0 -0
  565. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/index.d.ts +0 -0
  566. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/index.js +0 -0
  567. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/interface.d.ts +0 -0
  568. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/interface.js +0 -0
  569. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/lineString.d.ts +0 -0
  570. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/lineString.js +0 -0
  571. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/multiLineString.d.ts +0 -0
  572. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/multiLineString.js +0 -0
  573. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/multiPoint.d.ts +0 -0
  574. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/multiPoint.js +0 -0
  575. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/multiPolygon.d.ts +0 -0
  576. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/multiPolygon.js +0 -0
  577. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/point.d.ts +0 -0
  578. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/point.js +0 -0
  579. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/polygon.d.ts +0 -0
  580. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/geo/polygon.js +0 -0
  581. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/helper/symbol.d.ts +0 -0
  582. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/helper/symbol.js +0 -0
  583. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/index.d.ts +0 -0
  584. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/index.js +0 -0
  585. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/lib/util.d.ts +0 -0
  586. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/lib/util.js +0 -0
  587. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/operator-map.d.ts +0 -0
  588. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/operator-map.js +0 -0
  589. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/query.d.ts +0 -0
  590. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/query.js +0 -0
  591. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/regexp/index.d.ts +0 -0
  592. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/regexp/index.js +0 -0
  593. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/common.d.ts +0 -0
  594. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/common.js +0 -0
  595. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/datatype.d.ts +0 -0
  596. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/datatype.js +0 -0
  597. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/query.d.ts +0 -0
  598. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/query.js +0 -0
  599. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/update.d.ts +0 -0
  600. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serializer/update.js +0 -0
  601. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serverDate/index.d.ts +0 -0
  602. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/serverDate/index.js +0 -0
  603. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/collection.d.ts +0 -0
  604. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/collection.js +0 -0
  605. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/document.d.ts +0 -0
  606. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/document.js +0 -0
  607. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/index.d.ts +0 -0
  608. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/index.js +0 -0
  609. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/query.d.ts +0 -0
  610. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/transaction/query.js +0 -0
  611. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/typings/index.d.ts +0 -0
  612. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/typings/index.js +0 -0
  613. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/typings/realtime.d.ts +0 -0
  614. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/typings/realtime.js +0 -0
  615. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/util.d.ts +0 -0
  616. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/util.js +0 -0
  617. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/error.d.ts +0 -0
  618. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/error.js +0 -0
  619. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/msg.d.ts +0 -0
  620. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/msg.js +0 -0
  621. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/symbol.d.ts +0 -0
  622. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/symbol.js +0 -0
  623. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/type.d.ts +0 -0
  624. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/type.js +0 -0
  625. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/utils.d.ts +0 -0
  626. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/utils/utils.js +0 -0
  627. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/validate.d.ts +0 -0
  628. /package/{node_modules/@cloudbase/database → database}/dist/commonjs/validate.js +0 -0
  629. /package/{node_modules/@cloudbase/database → database}/dist/esm/aggregate.d.ts +0 -0
  630. /package/{node_modules/@cloudbase/database → database}/dist/esm/aggregate.js +0 -0
  631. /package/{node_modules/@cloudbase/database → database}/dist/esm/collection.d.ts +0 -0
  632. /package/{node_modules/@cloudbase/database → database}/dist/esm/collection.js +0 -0
  633. /package/{node_modules/@cloudbase/database → database}/dist/esm/command.d.ts +0 -0
  634. /package/{node_modules/@cloudbase/database → database}/dist/esm/command.js +0 -0
  635. /package/{node_modules/@cloudbase/database → database}/dist/esm/commands/logic.d.ts +0 -0
  636. /package/{node_modules/@cloudbase/database → database}/dist/esm/commands/logic.js +0 -0
  637. /package/{node_modules/@cloudbase/database → database}/dist/esm/commands/query.d.ts +0 -0
  638. /package/{node_modules/@cloudbase/database → database}/dist/esm/commands/query.js +0 -0
  639. /package/{node_modules/@cloudbase/database → database}/dist/esm/commands/update.d.ts +0 -0
  640. /package/{node_modules/@cloudbase/database → database}/dist/esm/commands/update.js +0 -0
  641. /package/{node_modules/@cloudbase/database → database}/dist/esm/config/app.config.d.ts +0 -0
  642. /package/{node_modules/@cloudbase/database → database}/dist/esm/config/app.config.js +0 -0
  643. /package/{node_modules/@cloudbase/database → database}/dist/esm/config/error.config.d.ts +0 -0
  644. /package/{node_modules/@cloudbase/database → database}/dist/esm/config/error.config.js +0 -0
  645. /package/{node_modules/@cloudbase/database → database}/dist/esm/const/code.d.ts +0 -0
  646. /package/{node_modules/@cloudbase/database → database}/dist/esm/const/code.js +0 -0
  647. /package/{node_modules/@cloudbase/database → database}/dist/esm/constant.d.ts +0 -0
  648. /package/{node_modules/@cloudbase/database → database}/dist/esm/constant.js +0 -0
  649. /package/{node_modules/@cloudbase/database → database}/dist/esm/document.d.ts +0 -0
  650. /package/{node_modules/@cloudbase/database → database}/dist/esm/document.js +0 -0
  651. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/index.d.ts +0 -0
  652. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/index.js +0 -0
  653. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/interface.d.ts +0 -0
  654. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/interface.js +0 -0
  655. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/lineString.d.ts +0 -0
  656. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/lineString.js +0 -0
  657. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/multiLineString.d.ts +0 -0
  658. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/multiLineString.js +0 -0
  659. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/multiPoint.d.ts +0 -0
  660. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/multiPoint.js +0 -0
  661. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/multiPolygon.d.ts +0 -0
  662. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/multiPolygon.js +0 -0
  663. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/point.d.ts +0 -0
  664. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/point.js +0 -0
  665. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/polygon.d.ts +0 -0
  666. /package/{node_modules/@cloudbase/database → database}/dist/esm/geo/polygon.js +0 -0
  667. /package/{node_modules/@cloudbase/database → database}/dist/esm/helper/symbol.d.ts +0 -0
  668. /package/{node_modules/@cloudbase/database → database}/dist/esm/helper/symbol.js +0 -0
  669. /package/{node_modules/@cloudbase/database → database}/dist/esm/index.d.ts +0 -0
  670. /package/{node_modules/@cloudbase/database → database}/dist/esm/index.js +0 -0
  671. /package/{node_modules/@cloudbase/database → database}/dist/esm/lib/util.d.ts +0 -0
  672. /package/{node_modules/@cloudbase/database → database}/dist/esm/lib/util.js +0 -0
  673. /package/{node_modules/@cloudbase/database → database}/dist/esm/operator-map.d.ts +0 -0
  674. /package/{node_modules/@cloudbase/database → database}/dist/esm/operator-map.js +0 -0
  675. /package/{node_modules/@cloudbase/database → database}/dist/esm/query.d.ts +0 -0
  676. /package/{node_modules/@cloudbase/database → database}/dist/esm/query.js +0 -0
  677. /package/{node_modules/@cloudbase/database → database}/dist/esm/regexp/index.d.ts +0 -0
  678. /package/{node_modules/@cloudbase/database → database}/dist/esm/regexp/index.js +0 -0
  679. /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/common.d.ts +0 -0
  680. /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/common.js +0 -0
  681. /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/datatype.d.ts +0 -0
  682. /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/datatype.js +0 -0
  683. /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/query.d.ts +0 -0
  684. /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/query.js +0 -0
  685. /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/update.d.ts +0 -0
  686. /package/{node_modules/@cloudbase/database → database}/dist/esm/serializer/update.js +0 -0
  687. /package/{node_modules/@cloudbase/database → database}/dist/esm/serverDate/index.d.ts +0 -0
  688. /package/{node_modules/@cloudbase/database → database}/dist/esm/serverDate/index.js +0 -0
  689. /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/collection.d.ts +0 -0
  690. /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/collection.js +0 -0
  691. /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/document.d.ts +0 -0
  692. /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/document.js +0 -0
  693. /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/index.d.ts +0 -0
  694. /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/index.js +0 -0
  695. /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/query.d.ts +0 -0
  696. /package/{node_modules/@cloudbase/database → database}/dist/esm/transaction/query.js +0 -0
  697. /package/{node_modules/@cloudbase/database → database}/dist/esm/typings/index.d.ts +0 -0
  698. /package/{node_modules/@cloudbase/database → database}/dist/esm/typings/index.js +0 -0
  699. /package/{node_modules/@cloudbase/database → database}/dist/esm/typings/realtime.d.ts +0 -0
  700. /package/{node_modules/@cloudbase/database → database}/dist/esm/typings/realtime.js +0 -0
  701. /package/{node_modules/@cloudbase/database → database}/dist/esm/util.d.ts +0 -0
  702. /package/{node_modules/@cloudbase/database → database}/dist/esm/util.js +0 -0
  703. /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/error.d.ts +0 -0
  704. /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/error.js +0 -0
  705. /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/msg.d.ts +0 -0
  706. /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/msg.js +0 -0
  707. /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/symbol.d.ts +0 -0
  708. /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/symbol.js +0 -0
  709. /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/type.d.ts +0 -0
  710. /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/type.js +0 -0
  711. /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/utils.d.ts +0 -0
  712. /package/{node_modules/@cloudbase/database → database}/dist/esm/utils/utils.js +0 -0
  713. /package/{node_modules/@cloudbase/database → database}/dist/esm/validate.d.ts +0 -0
  714. /package/{node_modules/@cloudbase/database → database}/dist/esm/validate.js +0 -0
  715. /package/{app/src → dist}/index.d.ts +0 -0
  716. /package/{node_modules/@cloudbase/types → types}/auth.d.ts +0 -0
  717. /package/{node_modules/@cloudbase/types → types}/cache.d.ts +0 -0
  718. /package/{node_modules/@cloudbase/types → types}/cloudrun.d.ts +0 -0
  719. /package/{node_modules/@cloudbase/types → types}/component.d.ts +0 -0
  720. /package/{node_modules/@cloudbase/types → types}/database.d.ts +0 -0
  721. /package/{node_modules/@cloudbase/types → types}/events.d.ts +0 -0
  722. /package/{node_modules/@cloudbase/types → types}/functions.d.ts +0 -0
  723. /package/{node_modules/@cloudbase/types → types}/index.d.ts +0 -0
  724. /package/{node_modules/@cloudbase/types → types}/realtime.d.ts +0 -0
  725. /package/{node_modules/@cloudbase/types → types}/request.d.ts +0 -0
  726. /package/{node_modules/@cloudbase/types → types}/storage.d.ts +0 -0
  727. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/adapters/index.d.ts +0 -0
  728. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/adapters/index.js +0 -0
  729. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/adapters/platforms/web.d.ts +0 -0
  730. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/adapters/platforms/web.js +0 -0
  731. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/constants/common.d.ts +0 -0
  732. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/constants/common.js +0 -0
  733. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/constants/errors.d.ts +0 -0
  734. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/constants/errors.js +0 -0
  735. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/constants/index.d.ts +0 -0
  736. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/constants/index.js +0 -0
  737. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/helpers/decorators.d.ts +0 -0
  738. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/helpers/decorators.js +0 -0
  739. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/helpers/index.d.ts +0 -0
  740. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/helpers/index.js +0 -0
  741. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/index.d.ts +0 -0
  742. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/index.js +0 -0
  743. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/abortController.d.ts +0 -0
  744. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/abortController.js +0 -0
  745. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/cache.d.ts +0 -0
  746. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/cache.js +0 -0
  747. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/events.d.ts +0 -0
  748. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/events.js +0 -0
  749. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/langEvent.d.ts +0 -0
  750. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/langEvent.js +0 -0
  751. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/util.d.ts +0 -0
  752. /package/{node_modules/@cloudbase/utilities → utilities}/dist/cjs/libs/util.js +0 -0
  753. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/adapters/index.d.ts +0 -0
  754. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/adapters/index.js +0 -0
  755. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/adapters/platforms/web.d.ts +0 -0
  756. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/adapters/platforms/web.js +0 -0
  757. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/constants/common.d.ts +0 -0
  758. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/constants/common.js +0 -0
  759. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/constants/errors.d.ts +0 -0
  760. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/constants/errors.js +0 -0
  761. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/constants/index.d.ts +0 -0
  762. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/constants/index.js +0 -0
  763. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/helpers/decorators.d.ts +0 -0
  764. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/helpers/decorators.js +0 -0
  765. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/helpers/index.d.ts +0 -0
  766. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/helpers/index.js +0 -0
  767. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/index.d.ts +0 -0
  768. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/index.js +0 -0
  769. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/abortController.d.ts +0 -0
  770. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/abortController.js +0 -0
  771. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/cache.d.ts +0 -0
  772. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/cache.js +0 -0
  773. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/events.d.ts +0 -0
  774. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/events.js +0 -0
  775. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/langEvent.d.ts +0 -0
  776. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/langEvent.js +0 -0
  777. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/util.d.ts +0 -0
  778. /package/{node_modules/@cloudbase/utilities → utilities}/dist/esm/libs/util.js +0 -0
  779. /package/{node_modules/@cloudbase/utilities → utilities}/dist/miniprogram/index.js +0 -0
@@ -1,3008 +0,0 @@
1
- var __extends = (this && this.__extends) || (function () {
2
- var extendStatics = function (d, b) {
3
- extendStatics = Object.setPrototypeOf ||
4
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
6
- return extendStatics(d, b);
7
- };
8
- return function (d, b) {
9
- if (typeof b !== "function" && b !== null)
10
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
11
- extendStatics(d, b);
12
- function __() { this.constructor = d; }
13
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
14
- };
15
- })();
16
- var __assign = (this && this.__assign) || function () {
17
- __assign = Object.assign || function(t) {
18
- for (var s, i = 1, n = arguments.length; i < n; i++) {
19
- s = arguments[i];
20
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
21
- t[p] = s[p];
22
- }
23
- return t;
24
- };
25
- return __assign.apply(this, arguments);
26
- };
27
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
28
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
29
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
30
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
31
- return c > 3 && r && Object.defineProperty(target, key, r), r;
32
- };
33
- var __metadata = (this && this.__metadata) || function (k, v) {
34
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
35
- };
36
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
- return new (P || (P = Promise))(function (resolve, reject) {
39
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
- step((generator = generator.apply(thisArg, _arguments || [])).next());
43
- });
44
- };
45
- var __generator = (this && this.__generator) || function (thisArg, body) {
46
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
47
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48
- function verb(n) { return function (v) { return step([n, v]); }; }
49
- function step(op) {
50
- if (f) throw new TypeError("Generator is already executing.");
51
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
52
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
53
- if (y = 0, t) op = [op[0] & 2, t.value];
54
- switch (op[0]) {
55
- case 0: case 1: t = op; break;
56
- case 4: _.label++; return { value: op[1], done: false };
57
- case 5: _.label++; y = op[1]; op = [0]; continue;
58
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
59
- default:
60
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
61
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
62
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
63
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
64
- if (t[2]) _.ops.pop();
65
- _.trys.pop(); continue;
66
- }
67
- op = body.call(thisArg, _);
68
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
69
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
- }
71
- };
72
- var __rest = (this && this.__rest) || function (s, e) {
73
- var t = {};
74
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
75
- t[p] = s[p];
76
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
77
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
78
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
79
- t[p[i]] = s[p[i]];
80
- }
81
- return t;
82
- };
83
- import { CloudbaseOAuth, AUTH_API_PREFIX, LOGIN_STATE_CHANGED_TYPE, EVENTS, AUTH_STATE_CHANGED_TYPE, OAUTH_TYPE, weAppJwtDecodeAll, AuthError, AuthErrorCategory, authModels, DEFAULT_NODE_ACCESS_SCOPE, } from '@cloudbase/oauth';
84
- import { useAuthAdapter } from './adapter';
85
- import { printWarn, throwError, ERRORS, COMMUNITY_SITE_URL, catchErrorsDecorator, CloudbaseEventEmitter, CloudbaseCache, adapterForWxMp, useDefaultAdapter, } from './utilities';
86
- import { saveToBrowserSession, getBrowserSession, removeBrowserSession, addUrlSearch } from './utils';
87
- import { AuthV1Compat, WeixinAuthProvider, CustomAuthProvider, AnonymousAuthProvider, applyUserV1Compat, } from './v1-compat';
88
- import { utils } from '@cloudbase/utilities';
89
- var isBrowser = function () { return typeof window !== 'undefined' && typeof document !== 'undefined'; };
90
- var COMPONENT_NAME = 'auth';
91
- var onCredentialsError = function (eventBus) { return function (params) {
92
- eventBus.fire(EVENTS.LOGIN_STATE_CHANGED, __assign(__assign({}, params), { eventType: LOGIN_STATE_CHANGED_TYPE.CREDENTIALS_ERROR }));
93
- }; };
94
- export var User = (function () {
95
- function User(options) {
96
- var cache = options.cache, oauthInstance = options.oauthInstance;
97
- this.cache = cache;
98
- this.oauthInstance = oauthInstance;
99
- this.setUserInfo();
100
- }
101
- User.prototype.checkLocalInfo = function () {
102
- return __awaiter(this, void 0, void 0, function () {
103
- return __generator(this, function (_a) {
104
- this.uid = this.getLocalUserInfo('uid');
105
- this.gender = this.getLocalUserInfo('gender');
106
- this.picture = this.getLocalUserInfo('picture');
107
- this.email = this.getLocalUserInfo('email');
108
- this.emailVerified = this.getLocalUserInfo('email_verified');
109
- this.phoneNumber = this.getLocalUserInfo('phone_number');
110
- this.username = this.getLocalUserInfo('username');
111
- this.name = this.getLocalUserInfo('name');
112
- this.birthdate = this.getLocalUserInfo('birthdate');
113
- this.zoneinfo = this.getLocalUserInfo('zoneinfo');
114
- this.locale = this.getLocalUserInfo('locale');
115
- this.sub = this.getLocalUserInfo('sub');
116
- this.createdFrom = this.getLocalUserInfo('created_from');
117
- this.providers = this.getLocalUserInfo('providers');
118
- return [2];
119
- });
120
- });
121
- };
122
- User.prototype.checkLocalInfoAsync = function () {
123
- return __awaiter(this, void 0, void 0, function () {
124
- var _a, _b, _c, _d;
125
- return __generator(this, function (_e) {
126
- switch (_e.label) {
127
- case 0:
128
- _a = this;
129
- return [4, this.getLocalUserInfoAsync('uid')];
130
- case 1:
131
- _a.uid = _e.sent();
132
- _b = this;
133
- return [4, this.getLocalUserInfoAsync('gender')];
134
- case 2:
135
- _b.gender = _e.sent();
136
- this.picture = this.getLocalUserInfo('picture');
137
- _c = this;
138
- return [4, this.getLocalUserInfoAsync('email')];
139
- case 3:
140
- _c.email = _e.sent();
141
- this.emailVerified = this.getLocalUserInfo('email_verified');
142
- this.phoneNumber = this.getLocalUserInfo('phone_number');
143
- _d = this;
144
- return [4, this.getLocalUserInfoAsync('username')];
145
- case 4:
146
- _d.username = _e.sent();
147
- this.name = this.getLocalUserInfo('name');
148
- this.birthdate = this.getLocalUserInfo('birthdate');
149
- this.zoneinfo = this.getLocalUserInfo('zoneinfo');
150
- this.locale = this.getLocalUserInfo('locale');
151
- this.sub = this.getLocalUserInfo('sub');
152
- this.createdFrom = this.getLocalUserInfo('created_from');
153
- this.providers = this.getLocalUserInfo('providers');
154
- return [2];
155
- }
156
- });
157
- });
158
- };
159
- User.prototype.update = function (userInfo) {
160
- return __awaiter(this, void 0, void 0, function () {
161
- var newUserInfo;
162
- return __generator(this, function (_a) {
163
- switch (_a.label) {
164
- case 0: return [4, this.oauthInstance.authApi.setUserProfile(__assign({}, userInfo))];
165
- case 1:
166
- newUserInfo = _a.sent();
167
- this.setLocalUserInfo(newUserInfo);
168
- return [2];
169
- }
170
- });
171
- });
172
- };
173
- User.prototype.updateUserBasicInfo = function (params) {
174
- return __awaiter(this, void 0, void 0, function () {
175
- return __generator(this, function (_a) {
176
- switch (_a.label) {
177
- case 0: return [4, this.oauthInstance.authApi.updateUserBasicInfo(__assign({}, params))];
178
- case 1:
179
- _a.sent();
180
- return [4, this.refresh()];
181
- case 2:
182
- _a.sent();
183
- return [2];
184
- }
185
- });
186
- });
187
- };
188
- User.prototype.updatePassword = function (newPassword, oldPassword) {
189
- return this.oauthInstance.authApi.updatePasswordByOld({
190
- old_password: oldPassword,
191
- new_password: newPassword,
192
- });
193
- };
194
- User.prototype.updateUsername = function (username) {
195
- if (typeof username !== 'string') {
196
- throwError(ERRORS.INVALID_PARAMS, 'username must be a string');
197
- }
198
- return this.update({
199
- username: username,
200
- });
201
- };
202
- User.prototype.refresh = function (params) {
203
- return __awaiter(this, void 0, void 0, function () {
204
- var newUserInfo;
205
- return __generator(this, function (_a) {
206
- switch (_a.label) {
207
- case 0: return [4, this.oauthInstance.authApi.getUserInfo(params)];
208
- case 1:
209
- newUserInfo = _a.sent();
210
- if (newUserInfo.code === 'INVALID_ACCESS_TOKEN') {
211
- this.setLocalUserInfo({});
212
- throw newUserInfo;
213
- }
214
- this.setLocalUserInfo(newUserInfo);
215
- return [2, newUserInfo];
216
- }
217
- });
218
- });
219
- };
220
- User.prototype.getLocalUserInfo = function (key) {
221
- var userInfoKey = this.cache.keys.userInfoKey;
222
- var userInfo = this.cache.getStore(userInfoKey);
223
- if (!key)
224
- return userInfo || {};
225
- return userInfo[key];
226
- };
227
- User.prototype.setLocalUserInfo = function (userInfo) {
228
- var userInfoKey = this.cache.keys.userInfoKey;
229
- this.cache.setStore(userInfoKey, userInfo);
230
- this.setUserInfo();
231
- };
232
- User.prototype.getLocalUserInfoAsync = function (key) {
233
- return __awaiter(this, void 0, void 0, function () {
234
- var userInfoKey, userInfo;
235
- return __generator(this, function (_a) {
236
- switch (_a.label) {
237
- case 0:
238
- userInfoKey = this.cache.keys.userInfoKey;
239
- return [4, this.cache.getStoreAsync(userInfoKey)];
240
- case 1:
241
- userInfo = _a.sent();
242
- return [2, userInfo[key]];
243
- }
244
- });
245
- });
246
- };
247
- User.prototype.setUserInfo = function () {
248
- var _this = this;
249
- var userInfoKey = this.cache.keys.userInfoKey;
250
- var userInfo = this.cache.getStore(userInfoKey);
251
- [
252
- 'uid',
253
- 'email',
254
- 'name',
255
- 'gender',
256
- 'picture',
257
- 'email_verified',
258
- 'phone_number',
259
- 'birthdate',
260
- 'zoneinfo',
261
- 'locale',
262
- 'sub',
263
- 'created_from',
264
- 'providers',
265
- 'username',
266
- 'created_at',
267
- 'open_id',
268
- ].forEach(function (infoKey) {
269
- _this[infoKey] = userInfo[infoKey];
270
- });
271
- };
272
- __decorate([
273
- catchErrorsDecorator({
274
- title: '更新用户信息失败',
275
- messages: [
276
- '请确认以下各项:',
277
- ' 1 - 调用 User.update() 的语法或参数是否正确',
278
- ' 2 - 用户信息中是否包含非法值',
279
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
280
- ],
281
- }),
282
- __metadata("design:type", Function),
283
- __metadata("design:paramtypes", [Object]),
284
- __metadata("design:returntype", Promise)
285
- ], User.prototype, "update", null);
286
- __decorate([
287
- catchErrorsDecorator({
288
- title: '更新密码失败',
289
- messages: [
290
- '请确认以下各项:',
291
- ' 1 - 调用 User.updatePassword() 的语法或参数是否正确',
292
- ' 3 - 新密码中是否包含非法字符',
293
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
294
- ],
295
- }),
296
- __metadata("design:type", Function),
297
- __metadata("design:paramtypes", [String, String]),
298
- __metadata("design:returntype", void 0)
299
- ], User.prototype, "updatePassword", null);
300
- __decorate([
301
- catchErrorsDecorator({
302
- title: '更新用户名失败',
303
- messages: [
304
- '请确认以下各项:',
305
- ' 1 - 调用 User.updateUsername() 的语法或参数是否正确',
306
- ' 2 - 当前环境是否开通了用户名密码登录',
307
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
308
- ],
309
- }),
310
- __metadata("design:type", Function),
311
- __metadata("design:paramtypes", [String]),
312
- __metadata("design:returntype", void 0)
313
- ], User.prototype, "updateUsername", null);
314
- __decorate([
315
- catchErrorsDecorator({
316
- title: '刷新本地用户信息失败',
317
- messages: [
318
- '请确认以下各项:',
319
- ' 1 - 调用 User.refresh() 的语法或参数是否正确',
320
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
321
- ],
322
- }),
323
- __metadata("design:type", Function),
324
- __metadata("design:paramtypes", [Object]),
325
- __metadata("design:returntype", Promise)
326
- ], User.prototype, "refresh", null);
327
- return User;
328
- }());
329
- applyUserV1Compat(User);
330
- var LoginState = (function () {
331
- function LoginState(options) {
332
- var envId = options.envId, cache = options.cache, oauthInstance = options.oauthInstance;
333
- if (!envId) {
334
- throwError(ERRORS.INVALID_PARAMS, 'envId is not defined');
335
- }
336
- this.cache = cache;
337
- this.oauthInstance = oauthInstance;
338
- this.user = new User({
339
- cache: this.cache,
340
- oauthInstance: oauthInstance,
341
- });
342
- }
343
- LoginState.prototype.checkLocalState = function () {
344
- var _a;
345
- this.oauthLoginState = (_a = this.oauthInstance) === null || _a === void 0 ? void 0 : _a.authApi.hasLoginStateSync();
346
- this.user.checkLocalInfo();
347
- };
348
- LoginState.prototype.checkLocalStateAsync = function () {
349
- var _a;
350
- return __awaiter(this, void 0, void 0, function () {
351
- return __generator(this, function (_b) {
352
- switch (_b.label) {
353
- case 0: return [4, ((_a = this.oauthInstance) === null || _a === void 0 ? void 0 : _a.authApi.getLoginState())];
354
- case 1:
355
- _b.sent();
356
- return [4, this.user.checkLocalInfoAsync()];
357
- case 2:
358
- _b.sent();
359
- return [2];
360
- }
361
- });
362
- });
363
- };
364
- return LoginState;
365
- }());
366
- export { LoginState };
367
- var Auth = (function (_super) {
368
- __extends(Auth, _super);
369
- function Auth(config) {
370
- var _this = _super.call(this) || this;
371
- _this.listeners = new Map();
372
- _this.hasListenerSetUp = false;
373
- _this.config = config;
374
- _this.oauthInstance = config.oauthInstance;
375
- _this.cache = config.cache;
376
- _this.init();
377
- _this.setAccessKey();
378
- return _this;
379
- }
380
- Auth.prototype.signInAnonymously = function (params) {
381
- return __awaiter(this, void 0, void 0, function () {
382
- var loginState, _a, _b, session, error_1, authError;
383
- return __generator(this, function (_c) {
384
- switch (_c.label) {
385
- case 0:
386
- _c.trys.push([0, 4, , 5]);
387
- return [4, this.oauthInstance.authApi.signInAnonymously(params)];
388
- case 1:
389
- _c.sent();
390
- return [4, this.createLoginState()];
391
- case 2:
392
- loginState = _c.sent();
393
- return [4, this.getSession()];
394
- case 3:
395
- _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
396
- return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
397
- case 4:
398
- error_1 = _c.sent();
399
- authError = new AuthError(error_1, { method: 'signInAnonymously' });
400
- if (authError.category === AuthErrorCategory.PROVIDER_NOT_ENABLED) {
401
- console.error(authError.helpMessage);
402
- console.error('[CloudBase Auth] 提示:匿名登录需要在控制台开启「匿名登录」。\n'
403
- + ' 如果您需要使用用户名密码登录,请改用 auth.signInWithPassword({ username, password })。\n'
404
- + ' 不要在匿名登录失败后自动回退到密码登录,这两种方式的使用场景不同。');
405
- }
406
- else {
407
- console.warn("[CloudBase Auth] signInAnonymously \u5931\u8D25 [".concat(authError.category, "]: ").concat(authError.message));
408
- if (authError.loginMethodHint) {
409
- console.warn(authError.loginMethodHint);
410
- }
411
- }
412
- return [2, { data: {}, error: authError }];
413
- case 5: return [2];
414
- }
415
- });
416
- });
417
- };
418
- Auth.prototype.signUp = function (params) {
419
- return __awaiter(this, void 0, void 0, function () {
420
- var verificationInfo_1, error_2;
421
- var _this = this;
422
- return __generator(this, function (_a) {
423
- switch (_a.label) {
424
- case 0:
425
- if (!(params.phone_number || params.verification_code || params.verification_token || params.provider_token)) return [3, 2];
426
- if (params.phone_number) {
427
- params.phone_number = this.formatPhone(params.phone_number);
428
- }
429
- return [4, this.oauthInstance.authApi.signUp(params)];
430
- case 1:
431
- _a.sent();
432
- return [2, this.createLoginState()];
433
- case 2:
434
- _a.trys.push([2, 4, , 5]);
435
- this.validateAtLeastOne(params, [['email'], ['phone']], 'You must provide either an email or phone number');
436
- return [4, this.getVerification(params.email ? { email: params.email } : { phone_number: this.formatPhone(params.phone) })];
437
- case 3:
438
- verificationInfo_1 = _a.sent();
439
- return [2, {
440
- data: {
441
- verifyOtp: function (_a) {
442
- var token = _a.token, _b = _a.messageId, messageId = _b === void 0 ? verificationInfo_1.verification_id : _b;
443
- return __awaiter(_this, void 0, void 0, function () {
444
- var verificationTokenRes, data, _c, _d, session, error_3;
445
- return __generator(this, function (_e) {
446
- switch (_e.label) {
447
- case 0:
448
- _e.trys.push([0, 8, , 9]);
449
- return [4, this.verify({
450
- verification_id: messageId || verificationInfo_1.verification_id,
451
- verification_code: token,
452
- })];
453
- case 1:
454
- verificationTokenRes = _e.sent();
455
- if (!verificationInfo_1.is_user) return [3, 3];
456
- return [4, this.signIn({
457
- username: params.email || this.formatPhone(params.phone),
458
- verification_token: verificationTokenRes.verification_token,
459
- })];
460
- case 2:
461
- _e.sent();
462
- return [3, 6];
463
- case 3:
464
- data = JSON.parse(JSON.stringify(params));
465
- delete data.email;
466
- delete data.phone;
467
- return [4, this.oauthInstance.authApi.signUp(__assign(__assign(__assign({}, data), (params.email ? { email: params.email } : { phone_number: this.formatPhone(params.phone) })), { verification_token: verificationTokenRes.verification_token, verification_code: token }))];
468
- case 4:
469
- _e.sent();
470
- return [4, this.createLoginState()];
471
- case 5:
472
- _e.sent();
473
- _e.label = 6;
474
- case 6: return [4, this.getSession()];
475
- case 7:
476
- _c = (_e.sent()).data, _d = _c === void 0 ? {} : _c, session = _d.session;
477
- return [2, { data: { user: session.user, session: session }, error: null }];
478
- case 8:
479
- error_3 = _e.sent();
480
- return [2, { data: {}, error: new AuthError(error_3, { method: 'signUp' }) }];
481
- case 9: return [2];
482
- }
483
- });
484
- });
485
- },
486
- },
487
- error: null,
488
- }];
489
- case 4:
490
- error_2 = _a.sent();
491
- return [2, { data: {}, error: new AuthError(error_2, { method: 'signUp' }) }];
492
- case 5: return [2];
493
- }
494
- });
495
- });
496
- };
497
- Auth.prototype.signOut = function (params) {
498
- var _a, _b;
499
- return __awaiter(this, void 0, void 0, function () {
500
- var userInfoKey, res, error_4;
501
- return __generator(this, function (_c) {
502
- switch (_c.label) {
503
- case 0:
504
- _c.trys.push([0, 3, , 4]);
505
- userInfoKey = this.cache.keys.userInfoKey;
506
- return [4, this.oauthInstance.authApi.signOut(params)];
507
- case 1:
508
- res = _c.sent();
509
- return [4, this.cache.removeStoreAsync(userInfoKey)];
510
- case 2:
511
- _c.sent();
512
- this.setAccessKey();
513
- (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.LOGIN_STATE_CHANGED, { eventType: LOGIN_STATE_CHANGED_TYPE.SIGN_OUT });
514
- (_b = this.config.eventBus) === null || _b === void 0 ? void 0 : _b.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_OUT });
515
- return [2, __assign(__assign({}, res), { data: {}, error: null })];
516
- case 3:
517
- error_4 = _c.sent();
518
- return [2, { data: {}, error: new AuthError(error_4, { method: 'signOut' }) }];
519
- case 4: return [2];
520
- }
521
- });
522
- });
523
- };
524
- Auth.prototype.onAuthStateChange = function (callback) {
525
- var _this = this;
526
- if (!this.hasListenerSetUp) {
527
- this.setupListeners();
528
- this.hasListenerSetUp = true;
529
- }
530
- var id = Math.random().toString(36);
531
- if (!this.listeners.has(id)) {
532
- this.listeners.set(id, new Set());
533
- }
534
- this.listeners.get(id).add(callback);
535
- var subscription = {
536
- id: id,
537
- callback: callback,
538
- unsubscribe: function () {
539
- var callbacks = _this.listeners.get(id);
540
- if (callbacks) {
541
- callbacks.delete(callback);
542
- if (callbacks.size === 0) {
543
- _this.listeners.delete(id);
544
- }
545
- }
546
- },
547
- };
548
- return {
549
- data: { subscription: subscription },
550
- };
551
- };
552
- Auth.prototype.signInWithPassword = function (params) {
553
- return __awaiter(this, void 0, void 0, function () {
554
- var _a, _b, session, error_5, authError;
555
- return __generator(this, function (_c) {
556
- switch (_c.label) {
557
- case 0:
558
- _c.trys.push([0, 3, , 4]);
559
- this.validateAtLeastOne(params, [['username'], ['email'], ['phone']], 'You must provide either username, email, or phone');
560
- this.validateParams(params, {
561
- password: { required: true, message: 'Password is required' },
562
- });
563
- return [4, this.signIn(__assign({ username: params.username || params.email || this.formatPhone(params.phone), password: params.password }, (params.is_encrypt ? { isEncrypt: true, version: 'v2' } : {})))];
564
- case 1:
565
- _c.sent();
566
- return [4, this.getSession()];
567
- case 2:
568
- _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
569
- return [2, { data: { user: session.user, session: session }, error: null }];
570
- case 3:
571
- error_5 = _c.sent();
572
- authError = new AuthError(error_5, { method: 'signInWithPassword' });
573
- if (authError.category === AuthErrorCategory.PROVIDER_NOT_ENABLED) {
574
- console.error(authError.helpMessage);
575
- }
576
- else if (authError.category === AuthErrorCategory.INVALID_CREDENTIALS) {
577
- console.warn(authError.helpMessage);
578
- }
579
- else if (authError.category === AuthErrorCategory.USER_NOT_FOUND) {
580
- console.warn(authError.helpMessage);
581
- }
582
- else {
583
- console.warn("[CloudBase Auth] signInWithPassword \u5931\u8D25 [".concat(authError.category, "]: ").concat(authError.message));
584
- }
585
- if (authError.loginMethodHint) {
586
- console.info(authError.loginMethodHint);
587
- }
588
- return [2, { data: {}, error: authError }];
589
- case 4: return [2];
590
- }
591
- });
592
- });
593
- };
594
- Auth.prototype.signInWithIdToken = function (params) {
595
- return __awaiter(this, void 0, void 0, function () {
596
- var _a, _b, session, error_6;
597
- return __generator(this, function (_c) {
598
- switch (_c.label) {
599
- case 0:
600
- _c.trys.push([0, 3, , 4]);
601
- this.validateParams(params, {
602
- token: { required: true, message: 'Token is required' },
603
- });
604
- return [4, this.signInWithProvider({
605
- provider_token: params.token,
606
- })];
607
- case 1:
608
- _c.sent();
609
- return [4, this.getSession()];
610
- case 2:
611
- _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
612
- return [2, { data: { user: session.user, session: session }, error: null }];
613
- case 3:
614
- error_6 = _c.sent();
615
- return [2, { data: {}, error: new AuthError(error_6, { method: 'signInWithIdToken' }) }];
616
- case 4: return [2];
617
- }
618
- });
619
- });
620
- };
621
- Auth.prototype.signInWithOtp = function (params) {
622
- var _a, _b, _c, _d;
623
- return __awaiter(this, void 0, void 0, function () {
624
- var verificationInfo_2, error_7;
625
- var _this = this;
626
- return __generator(this, function (_e) {
627
- switch (_e.label) {
628
- case 0:
629
- if (!((_a = params.options) === null || _a === void 0 ? void 0 : _a.emailRedirectTo) && (((_b = params.options) === null || _b === void 0 ? void 0 : _b.shouldCreateUser) === undefined || !!((_c = params.options) === null || _c === void 0 ? void 0 : _c.shouldCreateUser))) {
630
- return [2, this.signUp({
631
- email: params.email,
632
- phone: params.phone,
633
- })];
634
- }
635
- _e.label = 1;
636
- case 1:
637
- _e.trys.push([1, 3, , 4]);
638
- this.validateAtLeastOne(params, [['email'], ['phone']], 'You must provide either an email or phone number');
639
- return [4, this.getVerification(__assign({ email_redirect_to: (_d = params.options) === null || _d === void 0 ? void 0 : _d.emailRedirectTo }, (params.email ? { email: params.email } : { phone_number: this.formatPhone(params.phone) })))];
640
- case 2:
641
- verificationInfo_2 = _e.sent();
642
- return [2, {
643
- data: {
644
- user: null,
645
- session: null,
646
- verifyOtp: function (_a) {
647
- var token = _a.token, _b = _a.messageId, messageId = _b === void 0 ? verificationInfo_2.verification_id : _b;
648
- return __awaiter(_this, void 0, void 0, function () {
649
- return __generator(this, function (_c) {
650
- return [2, this.verifyOtp({
651
- email: params.email,
652
- phone: params.phone,
653
- token: token,
654
- messageId: messageId,
655
- })];
656
- });
657
- });
658
- },
659
- },
660
- error: null,
661
- }];
662
- case 3:
663
- error_7 = _e.sent();
664
- return [2, { data: {}, error: new AuthError(error_7, { method: 'signInWithOtp' }) }];
665
- case 4: return [2];
666
- }
667
- });
668
- });
669
- };
670
- Auth.prototype.verifyOAuth = function (params) {
671
- return __awaiter(this, void 0, void 0, function () {
672
- var data, code, state, cacheData, provider, token, res, localSearch, error_8;
673
- return __generator(this, function (_a) {
674
- switch (_a.label) {
675
- case 0:
676
- data = {};
677
- _a.label = 1;
678
- case 1:
679
- _a.trys.push([1, 7, , 8]);
680
- code = (params === null || params === void 0 ? void 0 : params.code) || utils.getQuery('code');
681
- state = (params === null || params === void 0 ? void 0 : params.state) || utils.getQuery('state');
682
- if (!code) {
683
- return [2, { data: {}, error: new AuthError({ message: 'Code is required' }) }];
684
- }
685
- if (!state) {
686
- return [2, { data: {}, error: new AuthError({ message: 'State is required' }) }];
687
- }
688
- cacheData = getBrowserSession(state);
689
- data.type = cacheData === null || cacheData === void 0 ? void 0 : cacheData.type;
690
- provider = (params === null || params === void 0 ? void 0 : params.provider) || (cacheData === null || cacheData === void 0 ? void 0 : cacheData.provider) || utils.getQuery('provider');
691
- if (!provider) {
692
- return [2, { data: data, error: new AuthError({ message: 'Provider is required' }) }];
693
- }
694
- return [4, this.grantProviderToken({
695
- provider_id: provider,
696
- provider_redirect_uri: location.origin + location.pathname,
697
- provider_code: code,
698
- })];
699
- case 2:
700
- token = (_a.sent()).provider_token;
701
- res = void 0;
702
- if (!(cacheData.type === OAUTH_TYPE.BIND_IDENTITY)) return [3, 4];
703
- return [4, this.oauthInstance.authApi.toBindIdentity({ provider_token: token, provider: provider, fireEvent: true })];
704
- case 3:
705
- res = _a.sent();
706
- return [3, 6];
707
- case 4: return [4, this.signInWithIdToken({
708
- token: token,
709
- })];
710
- case 5:
711
- res = _a.sent();
712
- res.data = __assign(__assign({}, data), res.data);
713
- _a.label = 6;
714
- case 6:
715
- localSearch = new URLSearchParams(location === null || location === void 0 ? void 0 : location.search);
716
- localSearch.delete('code');
717
- localSearch.delete('state');
718
- res.data.redirectUrl = addUrlSearch((cacheData === null || cacheData === void 0 ? void 0 : cacheData.search) === undefined ? "?".concat(localSearch.toString()) : cacheData === null || cacheData === void 0 ? void 0 : cacheData.search, (cacheData === null || cacheData === void 0 ? void 0 : cacheData.hash) || location.hash);
719
- removeBrowserSession(state);
720
- return [2, res];
721
- case 7:
722
- error_8 = _a.sent();
723
- return [2, { data: data, error: new AuthError(error_8, { method: 'verifyOAuth' }) }];
724
- case 8: return [2];
725
- }
726
- });
727
- });
728
- };
729
- Auth.prototype.signInWithOAuth = function (params) {
730
- var _a, _b, _c, _d, _e;
731
- return __awaiter(this, void 0, void 0, function () {
732
- var href, urlObject, provider_redirect_uri, state, uri, decodedUri, finalUri, url_1, error_9;
733
- return __generator(this, function (_f) {
734
- switch (_f.label) {
735
- case 0:
736
- _f.trys.push([0, 2, , 3]);
737
- this.validateParams(params, {
738
- provider: { required: true, message: 'Provider is required' },
739
- });
740
- href = ((_a = params.options) === null || _a === void 0 ? void 0 : _a.redirectTo) || location.href;
741
- urlObject = new URL(href);
742
- provider_redirect_uri = urlObject.origin + urlObject.pathname;
743
- state = ((_b = params.options) === null || _b === void 0 ? void 0 : _b.state) || "prd-".concat(params.provider, "-").concat(Math.random().toString(36)
744
- .slice(2));
745
- return [4, this.genProviderRedirectUri({
746
- provider_id: params.provider,
747
- provider_redirect_uri: provider_redirect_uri,
748
- state: state,
749
- })];
750
- case 1:
751
- uri = (_f.sent()).uri;
752
- decodedUri = decodeURIComponent(uri);
753
- finalUri = decodedUri;
754
- if ((_c = params.options) === null || _c === void 0 ? void 0 : _c.queryParams) {
755
- url_1 = new URL(decodedUri);
756
- Object.entries(params.options.queryParams).forEach(function (_a) {
757
- var key = _a[0], value = _a[1];
758
- url_1.searchParams.set(key, value);
759
- });
760
- finalUri = url_1.toString();
761
- }
762
- saveToBrowserSession(state, {
763
- provider: params.provider,
764
- search: urlObject.search,
765
- hash: urlObject.hash,
766
- type: ((_d = params.options) === null || _d === void 0 ? void 0 : _d.type) || OAUTH_TYPE.SIGN_IN,
767
- });
768
- if (isBrowser() && !((_e = params.options) === null || _e === void 0 ? void 0 : _e.skipBrowserRedirect)) {
769
- window.location.assign(finalUri);
770
- }
771
- return [2, { data: { url: finalUri, provider: params.provider }, error: null }];
772
- case 2:
773
- error_9 = _f.sent();
774
- return [2, { data: {}, error: new AuthError(error_9, { method: 'signInWithOAuth' }) }];
775
- case 3: return [2];
776
- }
777
- });
778
- });
779
- };
780
- Auth.prototype.getClaims = function () {
781
- return __awaiter(this, void 0, void 0, function () {
782
- var accessToken, parsedToken, error_10;
783
- return __generator(this, function (_a) {
784
- switch (_a.label) {
785
- case 0:
786
- _a.trys.push([0, 2, , 3]);
787
- return [4, this.getAccessToken()];
788
- case 1:
789
- accessToken = (_a.sent()).accessToken;
790
- parsedToken = weAppJwtDecodeAll(accessToken);
791
- return [2, { data: parsedToken, error: null }];
792
- case 2:
793
- error_10 = _a.sent();
794
- return [2, { data: {}, error: new AuthError(error_10, { method: 'getClaims' }) }];
795
- case 3: return [2];
796
- }
797
- });
798
- });
799
- };
800
- Auth.prototype.resetPasswordForEmail = function (emailOrPhone, options) {
801
- return __awaiter(this, void 0, void 0, function () {
802
- var redirectTo_1, isEmail_1, verificationParams, formattedPhone, verificationInfo_3, error_11;
803
- var _this = this;
804
- return __generator(this, function (_a) {
805
- switch (_a.label) {
806
- case 0:
807
- _a.trys.push([0, 2, , 3]);
808
- this.validateParams({ emailOrPhone: emailOrPhone }, {
809
- emailOrPhone: { required: true, message: 'Email or phone is required' },
810
- });
811
- redirectTo_1 = (options || {}).redirectTo;
812
- isEmail_1 = emailOrPhone.includes('@');
813
- verificationParams = void 0;
814
- if (isEmail_1) {
815
- verificationParams = { email: emailOrPhone };
816
- }
817
- else {
818
- formattedPhone = this.formatPhone(emailOrPhone);
819
- verificationParams = { phone_number: formattedPhone };
820
- }
821
- return [4, this.getVerification(verificationParams)];
822
- case 1:
823
- verificationInfo_3 = _a.sent();
824
- return [2, {
825
- data: {
826
- updateUser: function (attributes) { return __awaiter(_this, void 0, void 0, function () {
827
- var verificationTokenRes, res, error_12;
828
- var _a;
829
- return __generator(this, function (_b) {
830
- switch (_b.label) {
831
- case 0:
832
- this.validateParams(attributes, {
833
- nonce: { required: true, message: 'Nonce is required' },
834
- password: { required: true, message: 'Password is required' },
835
- });
836
- _b.label = 1;
837
- case 1:
838
- _b.trys.push([1, 5, , 6]);
839
- return [4, this.verify({
840
- verification_id: verificationInfo_3.verification_id,
841
- verification_code: attributes.nonce,
842
- })];
843
- case 2:
844
- verificationTokenRes = _b.sent();
845
- return [4, this.oauthInstance.authApi.resetPassword({
846
- email: isEmail_1 ? emailOrPhone : undefined,
847
- phone_number: !isEmail_1 ? emailOrPhone : undefined,
848
- new_password: attributes.password,
849
- verification_token: verificationTokenRes.verification_token,
850
- })];
851
- case 3:
852
- _b.sent();
853
- (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, {
854
- event: AUTH_STATE_CHANGED_TYPE.PASSWORD_RECOVERY,
855
- });
856
- return [4, this.signInWithPassword({
857
- email: isEmail_1 ? emailOrPhone : undefined,
858
- phone: !isEmail_1 ? emailOrPhone : undefined,
859
- password: attributes.password,
860
- })];
861
- case 4:
862
- res = _b.sent();
863
- if (redirectTo_1 && isBrowser()) {
864
- window.location.assign(redirectTo_1);
865
- }
866
- return [2, res];
867
- case 5:
868
- error_12 = _b.sent();
869
- return [2, { data: {}, error: new AuthError(error_12, { method: 'resetPasswordForEmail' }) }];
870
- case 6: return [2];
871
- }
872
- });
873
- }); },
874
- },
875
- error: null,
876
- }];
877
- case 2:
878
- error_11 = _a.sent();
879
- return [2, { data: {}, error: new AuthError(error_11, { method: 'resetPasswordForEmail' }) }];
880
- case 3: return [2];
881
- }
882
- });
883
- });
884
- };
885
- Auth.prototype.resetPasswordForOld = function (params) {
886
- return __awaiter(this, void 0, void 0, function () {
887
- var _a, _b, session, error_13;
888
- return __generator(this, function (_c) {
889
- switch (_c.label) {
890
- case 0:
891
- _c.trys.push([0, 3, , 4]);
892
- return [4, this.oauthInstance.authApi.updatePasswordByOld({
893
- old_password: params.old_password,
894
- new_password: params.new_password,
895
- })];
896
- case 1:
897
- _c.sent();
898
- return [4, this.getSession()];
899
- case 2:
900
- _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
901
- return [2, { data: { user: session.user, session: session }, error: null }];
902
- case 3:
903
- error_13 = _c.sent();
904
- return [2, { data: {}, error: new AuthError(error_13, { method: 'resetPasswordForOld' }) }];
905
- case 4: return [2];
906
- }
907
- });
908
- });
909
- };
910
- Auth.prototype.verifyOtp = function (params) {
911
- return __awaiter(this, void 0, void 0, function () {
912
- var type, _a, _b, session, error_14;
913
- return __generator(this, function (_c) {
914
- switch (_c.label) {
915
- case 0:
916
- _c.trys.push([0, 6, , 7]);
917
- type = params.type;
918
- this.validateParams(params, {
919
- token: { required: true, message: 'Token is required' },
920
- messageId: { required: true, message: 'messageId is required' },
921
- });
922
- if (!['phone_change', 'email_change'].includes(type)) return [3, 2];
923
- return [4, this.verify({
924
- verification_id: params.messageId,
925
- verification_code: params.token,
926
- })];
927
- case 1:
928
- _c.sent();
929
- return [3, 4];
930
- case 2: return [4, this.signInWithUsername({
931
- verificationInfo: { verification_id: params.messageId, is_user: true },
932
- verificationCode: params.token,
933
- username: params.email || this.formatPhone(params.phone) || '',
934
- loginType: params.email ? 'email' : 'phone',
935
- })];
936
- case 3:
937
- _c.sent();
938
- _c.label = 4;
939
- case 4: return [4, this.getSession()];
940
- case 5:
941
- _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
942
- return [2, { data: { user: session.user, session: session }, error: null }];
943
- case 6:
944
- error_14 = _c.sent();
945
- return [2, { data: {}, error: new AuthError(error_14, { method: 'verifyOtp' }) }];
946
- case 7: return [2];
947
- }
948
- });
949
- });
950
- };
951
- Auth.prototype.getSession = function () {
952
- return __awaiter(this, void 0, void 0, function () {
953
- var credentials, _a, _b, user, error_15;
954
- return __generator(this, function (_c) {
955
- switch (_c.label) {
956
- case 0:
957
- _c.trys.push([0, 3, , 4]);
958
- return [4, this.oauthInstance.oauth2client.getCredentials()];
959
- case 1:
960
- credentials = _c.sent();
961
- if (!credentials || credentials.scope === 'accessKey') {
962
- return [2, { data: { session: null }, error: null }];
963
- }
964
- return [4, this.getUser(false)];
965
- case 2:
966
- _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, user = _b.user;
967
- return [2, { data: { session: __assign(__assign({}, credentials), { user: user }), user: user }, error: null }];
968
- case 3:
969
- error_15 = _c.sent();
970
- return [2, { data: {}, error: new AuthError(error_15, { method: 'getSession' }) }];
971
- case 4: return [2];
972
- }
973
- });
974
- });
975
- };
976
- Auth.prototype.refreshSession = function (refresh_token) {
977
- return __awaiter(this, void 0, void 0, function () {
978
- var credentials, newTokens, _a, _b, user, error_16;
979
- return __generator(this, function (_c) {
980
- switch (_c.label) {
981
- case 0:
982
- _c.trys.push([0, 4, , 5]);
983
- return [4, this.oauthInstance.oauth2client.localCredentials.getCredentials()];
984
- case 1:
985
- credentials = _c.sent();
986
- credentials.refresh_token = refresh_token || credentials.refresh_token;
987
- return [4, this.oauthInstance.oauth2client.refreshToken(credentials)];
988
- case 2:
989
- newTokens = _c.sent();
990
- return [4, this.getUser(false)];
991
- case 3:
992
- _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, user = _b.user;
993
- return [2, { data: { user: user, session: __assign(__assign({}, newTokens), { user: user }) }, error: null }];
994
- case 4:
995
- error_16 = _c.sent();
996
- return [2, { data: {}, error: new AuthError(error_16, { method: 'refreshSession' }) }];
997
- case 5: return [2];
998
- }
999
- });
1000
- });
1001
- };
1002
- Auth.prototype.getUser = function (isRefresh) {
1003
- if (isRefresh === void 0) { isRefresh = true; }
1004
- return __awaiter(this, void 0, void 0, function () {
1005
- var user, _a, error_17;
1006
- return __generator(this, function (_b) {
1007
- switch (_b.label) {
1008
- case 0:
1009
- _b.trys.push([0, 2, , 3]);
1010
- _a = this.convertToUser;
1011
- return [4, this.getCurrentUser(isRefresh)];
1012
- case 1:
1013
- user = _a.apply(this, [_b.sent()]);
1014
- return [2, { data: { user: user }, error: null }];
1015
- case 2:
1016
- error_17 = _b.sent();
1017
- return [2, { data: {}, error: new AuthError(error_17, { method: 'getUser' }) }];
1018
- case 3: return [2];
1019
- }
1020
- });
1021
- });
1022
- };
1023
- Auth.prototype.refreshUser = function () {
1024
- return __awaiter(this, void 0, void 0, function () {
1025
- var _a, _b, session, error_18;
1026
- return __generator(this, function (_c) {
1027
- switch (_c.label) {
1028
- case 0:
1029
- _c.trys.push([0, 3, , 4]);
1030
- return [4, this.currentUser.refresh()];
1031
- case 1:
1032
- _c.sent();
1033
- return [4, this.getSession()];
1034
- case 2:
1035
- _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
1036
- return [2, { data: { user: session.user, session: session }, error: null }];
1037
- case 3:
1038
- error_18 = _c.sent();
1039
- return [2, { data: {}, error: new AuthError(error_18, { method: 'refreshUser' }) }];
1040
- case 4: return [2];
1041
- }
1042
- });
1043
- });
1044
- };
1045
- Auth.prototype.updateUser = function (params) {
1046
- var _a;
1047
- return __awaiter(this, void 0, void 0, function () {
1048
- var hasValue, email, phone, restParams, needsEmailVerification_1, needsPhoneVerification, extraRes, verificationParams, verificationType_1, formattedPhone, verificationInfo_4, _b, user, error_19;
1049
- var _this = this;
1050
- return __generator(this, function (_c) {
1051
- switch (_c.label) {
1052
- case 0:
1053
- _c.trys.push([0, 8, , 9]);
1054
- hasValue = Object.keys(params).some(function (key) { return params[key] !== undefined && params[key] !== null && params[key] !== ''; });
1055
- if (!hasValue) {
1056
- throw new AuthError({ message: 'At least one field must be provided for update' });
1057
- }
1058
- email = params.email, phone = params.phone, restParams = __rest(params, ["email", "phone"]);
1059
- needsEmailVerification_1 = email !== undefined;
1060
- needsPhoneVerification = phone !== undefined;
1061
- extraRes = {};
1062
- if (!(needsEmailVerification_1 || needsPhoneVerification)) return [3, 4];
1063
- verificationParams = void 0;
1064
- if (needsEmailVerification_1) {
1065
- verificationParams = { email: params.email };
1066
- verificationType_1 = 'email_change';
1067
- }
1068
- else {
1069
- formattedPhone = this.formatPhone(params.phone);
1070
- verificationParams = { phone_number: formattedPhone };
1071
- verificationType_1 = 'phone_change';
1072
- }
1073
- return [4, this.getVerification(verificationParams)];
1074
- case 1:
1075
- verificationInfo_4 = _c.sent();
1076
- _b = Object.keys(restParams).length > 0;
1077
- if (!_b) return [3, 3];
1078
- return [4, this.updateUserBasicInfo(restParams)];
1079
- case 2:
1080
- _b = (_c.sent());
1081
- _c.label = 3;
1082
- case 3:
1083
- _b;
1084
- extraRes = {
1085
- messageId: verificationInfo_4.verification_id,
1086
- verifyOtp: function (verifyParams) { return __awaiter(_this, void 0, void 0, function () {
1087
- var user_1, error_20;
1088
- var _a;
1089
- return __generator(this, function (_b) {
1090
- switch (_b.label) {
1091
- case 0:
1092
- _b.trys.push([0, 11, , 12]);
1093
- if (!(verifyParams.email && params.email === verifyParams.email)) return [3, 3];
1094
- return [4, this.verifyOtp({
1095
- type: 'email_change',
1096
- email: params.email,
1097
- token: verifyParams.token,
1098
- messageId: verificationInfo_4.verification_id,
1099
- })];
1100
- case 1:
1101
- _b.sent();
1102
- return [4, this.updateUserBasicInfo({ email: params.email })];
1103
- case 2:
1104
- _b.sent();
1105
- return [3, 9];
1106
- case 3:
1107
- if (!(verifyParams.phone && params.phone === verifyParams.phone)) return [3, 6];
1108
- return [4, this.verifyOtp({
1109
- type: 'phone_change',
1110
- phone: params.phone,
1111
- token: verifyParams.token,
1112
- messageId: verificationInfo_4.verification_id,
1113
- })];
1114
- case 4:
1115
- _b.sent();
1116
- return [4, this.updateUserBasicInfo({ phone: this.formatPhone(params.phone) })];
1117
- case 5:
1118
- _b.sent();
1119
- return [3, 9];
1120
- case 6: return [4, this.verifyOtp({
1121
- type: verificationType_1,
1122
- email: needsEmailVerification_1 ? params.email : undefined,
1123
- phone: !needsEmailVerification_1 ? params.phone : undefined,
1124
- token: verifyParams.token,
1125
- messageId: verificationInfo_4.verification_id,
1126
- })];
1127
- case 7:
1128
- _b.sent();
1129
- return [4, this.updateUserBasicInfo(params)];
1130
- case 8:
1131
- _b.sent();
1132
- _b.label = 9;
1133
- case 9: return [4, this.getUser(false)];
1134
- case 10:
1135
- user_1 = (_b.sent()).data.user;
1136
- (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.USER_UPDATED });
1137
- return [2, { data: { user: user_1 }, error: null }];
1138
- case 11:
1139
- error_20 = _b.sent();
1140
- return [2, { data: {}, error: new AuthError(error_20, { method: 'updateUser' }) }];
1141
- case 12: return [2];
1142
- }
1143
- });
1144
- }); },
1145
- };
1146
- return [3, 6];
1147
- case 4: return [4, this.updateUserBasicInfo(params)];
1148
- case 5:
1149
- _c.sent();
1150
- _c.label = 6;
1151
- case 6: return [4, this.getUser(false)];
1152
- case 7:
1153
- user = (_c.sent()).data.user;
1154
- (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.USER_UPDATED });
1155
- return [2, { data: __assign({ user: user }, extraRes), error: null }];
1156
- case 8:
1157
- error_19 = _c.sent();
1158
- return [2, { data: {}, error: new AuthError(error_19, { method: 'updateUser' }) }];
1159
- case 9: return [2];
1160
- }
1161
- });
1162
- });
1163
- };
1164
- Auth.prototype.getUserIdentities = function () {
1165
- var _a;
1166
- return __awaiter(this, void 0, void 0, function () {
1167
- var providers, error_21;
1168
- return __generator(this, function (_b) {
1169
- switch (_b.label) {
1170
- case 0:
1171
- _b.trys.push([0, 2, , 3]);
1172
- return [4, this.oauthInstance.authApi.getProviders()];
1173
- case 1:
1174
- providers = _b.sent();
1175
- return [2, {
1176
- data: {
1177
- identities: (_a = providers === null || providers === void 0 ? void 0 : providers.data) === null || _a === void 0 ? void 0 : _a.filter(function (v) { return !!v.bind; }),
1178
- },
1179
- error: null,
1180
- }];
1181
- case 2:
1182
- error_21 = _b.sent();
1183
- return [2, { data: {}, error: new AuthError(error_21, { method: 'getUserIdentities' }) }];
1184
- case 3: return [2];
1185
- }
1186
- });
1187
- });
1188
- };
1189
- Auth.prototype.linkIdentity = function (params) {
1190
- return __awaiter(this, void 0, void 0, function () {
1191
- var error_22;
1192
- return __generator(this, function (_a) {
1193
- switch (_a.label) {
1194
- case 0:
1195
- _a.trys.push([0, 2, , 3]);
1196
- this.validateParams(params, {
1197
- provider: { required: true, message: 'Provider is required' },
1198
- });
1199
- return [4, this.signInWithOAuth({
1200
- provider: params.provider,
1201
- options: {
1202
- type: OAUTH_TYPE.BIND_IDENTITY,
1203
- },
1204
- })];
1205
- case 1:
1206
- _a.sent();
1207
- return [2, { data: { provider: params.provider }, error: null }];
1208
- case 2:
1209
- error_22 = _a.sent();
1210
- return [2, { data: {}, error: new AuthError(error_22, { method: 'linkIdentity' }) }];
1211
- case 3: return [2];
1212
- }
1213
- });
1214
- });
1215
- };
1216
- Auth.prototype.unlinkIdentity = function (params) {
1217
- return __awaiter(this, void 0, void 0, function () {
1218
- var error_23;
1219
- return __generator(this, function (_a) {
1220
- switch (_a.label) {
1221
- case 0:
1222
- _a.trys.push([0, 2, , 3]);
1223
- this.validateParams(params, {
1224
- provider: { required: true, message: 'Provider is required' },
1225
- });
1226
- return [4, this.oauthInstance.authApi.unbindProvider({ provider_id: params.provider })];
1227
- case 1:
1228
- _a.sent();
1229
- return [2, { data: {}, error: null }];
1230
- case 2:
1231
- error_23 = _a.sent();
1232
- return [2, { data: {}, error: new AuthError(error_23, { method: 'unlinkIdentity' }) }];
1233
- case 3: return [2];
1234
- }
1235
- });
1236
- });
1237
- };
1238
- Auth.prototype.reauthenticate = function () {
1239
- return __awaiter(this, void 0, void 0, function () {
1240
- var user, userInfo_1, verificationInfo_5, error_24;
1241
- var _this = this;
1242
- return __generator(this, function (_a) {
1243
- switch (_a.label) {
1244
- case 0:
1245
- _a.trys.push([0, 3, , 4]);
1246
- return [4, this.getUser(false)];
1247
- case 1:
1248
- user = (_a.sent()).data.user;
1249
- this.validateAtLeastOne(user, [['email', 'phone']], 'You must provide either an email or phone number');
1250
- userInfo_1 = user.email ? { email: user.email } : { phone_number: this.formatPhone(user.phone) };
1251
- return [4, this.getVerification(userInfo_1)];
1252
- case 2:
1253
- verificationInfo_5 = _a.sent();
1254
- return [2, {
1255
- data: {
1256
- updateUser: function (attributes) { return __awaiter(_this, void 0, void 0, function () {
1257
- var verificationTokenRes, sudoRes, _a, _b, session, error_25;
1258
- return __generator(this, function (_c) {
1259
- switch (_c.label) {
1260
- case 0:
1261
- this.validateParams(attributes, {
1262
- nonce: { required: true, message: 'Nonce is required' },
1263
- });
1264
- _c.label = 1;
1265
- case 1:
1266
- _c.trys.push([1, 9, , 10]);
1267
- if (!attributes.password) return [3, 5];
1268
- return [4, this.verify({
1269
- verification_id: verificationInfo_5.verification_id,
1270
- verification_code: attributes.nonce,
1271
- })];
1272
- case 2:
1273
- verificationTokenRes = _c.sent();
1274
- return [4, this.oauthInstance.authApi.sudo({
1275
- verification_token: verificationTokenRes.verification_token,
1276
- })];
1277
- case 3:
1278
- sudoRes = _c.sent();
1279
- return [4, this.oauthInstance.authApi.setPassword({
1280
- new_password: attributes.password,
1281
- sudo_token: sudoRes.sudo_token,
1282
- })];
1283
- case 4:
1284
- _c.sent();
1285
- return [3, 7];
1286
- case 5: return [4, this.signInWithUsername(__assign(__assign({ verificationInfo: verificationInfo_5, verificationCode: attributes.nonce }, userInfo_1), { loginType: userInfo_1.email ? 'email' : 'phone' }))];
1287
- case 6:
1288
- _c.sent();
1289
- _c.label = 7;
1290
- case 7: return [4, this.getSession()];
1291
- case 8:
1292
- _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
1293
- return [2, { data: { user: session.user, session: session }, error: null }];
1294
- case 9:
1295
- error_25 = _c.sent();
1296
- return [2, { data: {}, error: new AuthError(error_25, { method: 'reauthenticate' }) }];
1297
- case 10: return [2];
1298
- }
1299
- });
1300
- }); },
1301
- },
1302
- error: null,
1303
- }];
1304
- case 3:
1305
- error_24 = _a.sent();
1306
- return [2, { data: {}, error: new AuthError(error_24, { method: 'reauthenticate' }) }];
1307
- case 4: return [2];
1308
- }
1309
- });
1310
- });
1311
- };
1312
- Auth.prototype.resend = function (params) {
1313
- return __awaiter(this, void 0, void 0, function () {
1314
- var target, data, verificationId, error_26;
1315
- return __generator(this, function (_a) {
1316
- switch (_a.label) {
1317
- case 0:
1318
- _a.trys.push([0, 2, , 3]);
1319
- this.validateAtLeastOne(params, [['email'], ['phone']], 'You must provide either an email or phone number');
1320
- target = params.type === 'signup' ? 'ANY' : 'USER';
1321
- data = { target: target };
1322
- if ('email' in params) {
1323
- data.email = params.email;
1324
- }
1325
- if ('phone' in params) {
1326
- data.phone_number = this.formatPhone(params.phone);
1327
- }
1328
- return [4, this.oauthInstance.authApi.getVerification(data)];
1329
- case 1:
1330
- verificationId = (_a.sent()).verification_id;
1331
- return [2, {
1332
- data: { messageId: verificationId },
1333
- error: null,
1334
- }];
1335
- case 2:
1336
- error_26 = _a.sent();
1337
- return [2, {
1338
- data: {},
1339
- error: new AuthError(error_26, { method: 'resend' }),
1340
- }];
1341
- case 3: return [2];
1342
- }
1343
- });
1344
- });
1345
- };
1346
- Auth.prototype.setSession = function (params) {
1347
- var _a;
1348
- return __awaiter(this, void 0, void 0, function () {
1349
- var _b, _c, session, error_27;
1350
- return __generator(this, function (_d) {
1351
- switch (_d.label) {
1352
- case 0:
1353
- _d.trys.push([0, 3, , 4]);
1354
- this.validateParams(params, {
1355
- access_token: { required: true, message: 'Access token is required' },
1356
- refresh_token: { required: true, message: 'Refresh token is required' },
1357
- });
1358
- return [4, this.oauthInstance.oauth2client.refreshToken(params, { throwError: true })];
1359
- case 1:
1360
- _d.sent();
1361
- return [4, this.getSession()];
1362
- case 2:
1363
- _b = (_d.sent()).data, _c = _b === void 0 ? {} : _b, session = _c.session;
1364
- (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_IN });
1365
- return [2, { data: { user: session.user, session: session }, error: null }];
1366
- case 3:
1367
- error_27 = _d.sent();
1368
- return [2, { data: {}, error: new AuthError(error_27, { method: 'setSession' }) }];
1369
- case 4: return [2];
1370
- }
1371
- });
1372
- });
1373
- };
1374
- Auth.prototype.exchangeCodeForSession = function () {
1375
- return __awaiter(this, void 0, void 0, function () {
1376
- return __generator(this, function (_a) {
1377
- return [2];
1378
- });
1379
- });
1380
- };
1381
- Auth.prototype.deleteUser = function (params) {
1382
- return __awaiter(this, void 0, void 0, function () {
1383
- var sudo_token, error_28;
1384
- return __generator(this, function (_a) {
1385
- switch (_a.label) {
1386
- case 0:
1387
- _a.trys.push([0, 3, , 4]);
1388
- this.validateParams(params, {
1389
- password: { required: true, message: 'Password is required' },
1390
- });
1391
- return [4, this.oauthInstance.authApi.sudo(params)];
1392
- case 1:
1393
- sudo_token = (_a.sent()).sudo_token;
1394
- return [4, this.oauthInstance.authApi.deleteMe({ sudo_token: sudo_token })];
1395
- case 2:
1396
- _a.sent();
1397
- return [2, { data: {}, error: null }];
1398
- case 3:
1399
- error_28 = _a.sent();
1400
- return [2, { data: {}, error: new AuthError(error_28, { method: 'deleteUser' }) }];
1401
- case 4: return [2];
1402
- }
1403
- });
1404
- });
1405
- };
1406
- Auth.prototype.toDefaultLoginPage = function (params) {
1407
- if (params === void 0) { params = {}; }
1408
- return __awaiter(this, void 0, void 0, function () {
1409
- var configVersion, query, redirectUri, urlObj, loginPage;
1410
- return __generator(this, function (_a) {
1411
- try {
1412
- configVersion = params.config_version || 'env';
1413
- query = Object.keys(params.query || {})
1414
- .map(function (key) { return "".concat(key, "=").concat(params.query[key]); })
1415
- .join('&');
1416
- if (adapterForWxMp.isMatch()) {
1417
- wx.navigateTo({ url: "/packages/$wd_system/pages/login/index".concat(query ? "?".concat(query) : '') });
1418
- }
1419
- else {
1420
- redirectUri = params.redirect_uri || window.location.href;
1421
- urlObj = new URL(redirectUri);
1422
- loginPage = "".concat(urlObj.origin, "/__auth/?app_id=").concat(params.app_id || '', "&env_id=").concat(this.config.env, "&client_id=").concat(this.config.clientId || this.config.env, "&config_version=").concat(configVersion, "&redirect_uri=").concat(encodeURIComponent(redirectUri)).concat(query ? "&".concat(query) : '');
1423
- window.location.href = loginPage;
1424
- }
1425
- return [2, { data: {}, error: null }];
1426
- }
1427
- catch (error) {
1428
- return [2, { data: {}, error: new AuthError(error, { method: 'toDefaultLoginPage' }) }];
1429
- }
1430
- return [2];
1431
- });
1432
- });
1433
- };
1434
- Auth.prototype.signInWithCustomTicket = function (getTickFn) {
1435
- return __awaiter(this, void 0, void 0, function () {
1436
- var loginState, _a, _b, session, error_29;
1437
- return __generator(this, function (_c) {
1438
- switch (_c.label) {
1439
- case 0:
1440
- if (getTickFn) {
1441
- this.setCustomSignFunc(getTickFn);
1442
- }
1443
- _c.label = 1;
1444
- case 1:
1445
- _c.trys.push([1, 5, , 6]);
1446
- return [4, this.oauthInstance.authApi.signInWithCustomTicket()];
1447
- case 2:
1448
- _c.sent();
1449
- return [4, this.createLoginState()];
1450
- case 3:
1451
- loginState = _c.sent();
1452
- return [4, this.getSession()];
1453
- case 4:
1454
- _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
1455
- return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
1456
- case 5:
1457
- error_29 = _c.sent();
1458
- return [2, { data: {}, error: new AuthError(error_29, { method: 'signInWithCustomTicket' }) }];
1459
- case 6: return [2];
1460
- }
1461
- });
1462
- });
1463
- };
1464
- Auth.prototype.signInWithOpenId = function (_a) {
1465
- var _b = _a === void 0 ? {} : _a, _c = _b.useWxCloud, useWxCloud = _c === void 0 ? true : _c;
1466
- return __awaiter(this, void 0, void 0, function () {
1467
- var wxInfo, mainFunc, loginState, _d, _e, session, error_30;
1468
- var _this = this;
1469
- return __generator(this, function (_f) {
1470
- switch (_f.label) {
1471
- case 0:
1472
- if (!adapterForWxMp.isMatch()) {
1473
- throw Error('wx api undefined');
1474
- }
1475
- wxInfo = wx.getAccountInfoSync().miniProgram;
1476
- mainFunc = function (code) { return __awaiter(_this, void 0, void 0, function () {
1477
- var result, credentials, error_31;
1478
- return __generator(this, function (_a) {
1479
- switch (_a.label) {
1480
- case 0:
1481
- result = undefined;
1482
- credentials = undefined;
1483
- _a.label = 1;
1484
- case 1:
1485
- _a.trys.push([1, 4, , 5]);
1486
- return [4, this.oauthInstance.authApi.grantProviderToken({
1487
- provider_id: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
1488
- provider_code: code,
1489
- provider_params: {
1490
- provider_code_type: 'open_id',
1491
- appid: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
1492
- },
1493
- }, useWxCloud)];
1494
- case 2:
1495
- result = _a.sent();
1496
- if ((result === null || result === void 0 ? void 0 : result.error_code) || !result.provider_token) {
1497
- throw result;
1498
- }
1499
- return [4, this.oauthInstance.authApi.signInWithProvider({ provider_token: result.provider_token }, useWxCloud)];
1500
- case 3:
1501
- credentials = _a.sent();
1502
- if (credentials === null || credentials === void 0 ? void 0 : credentials.error_code) {
1503
- throw credentials;
1504
- }
1505
- return [3, 5];
1506
- case 4:
1507
- error_31 = _a.sent();
1508
- throw error_31;
1509
- case 5: return [4, this.oauthInstance.oauth2client.setCredentials(credentials)];
1510
- case 6:
1511
- _a.sent();
1512
- return [2];
1513
- }
1514
- });
1515
- }); };
1516
- _f.label = 1;
1517
- case 1:
1518
- _f.trys.push([1, 5, , 6]);
1519
- return [4, new Promise(function (resolve, reject) {
1520
- wx.login({
1521
- success: function (res) { return __awaiter(_this, void 0, void 0, function () {
1522
- var error_32;
1523
- return __generator(this, function (_a) {
1524
- switch (_a.label) {
1525
- case 0:
1526
- _a.trys.push([0, 2, , 3]);
1527
- return [4, mainFunc(res.code)];
1528
- case 1:
1529
- _a.sent();
1530
- resolve(true);
1531
- return [3, 3];
1532
- case 2:
1533
- error_32 = _a.sent();
1534
- reject(error_32);
1535
- return [3, 3];
1536
- case 3: return [2];
1537
- }
1538
- });
1539
- }); },
1540
- fail: function (res) {
1541
- var error = new Error(res === null || res === void 0 ? void 0 : res.errMsg);
1542
- error.code = res === null || res === void 0 ? void 0 : res.errno;
1543
- reject(error);
1544
- },
1545
- });
1546
- })];
1547
- case 2:
1548
- _f.sent();
1549
- return [4, this.createLoginState()];
1550
- case 3:
1551
- loginState = _f.sent();
1552
- return [4, this.getSession()];
1553
- case 4:
1554
- _d = (_f.sent()).data, _e = _d === void 0 ? {} : _d, session = _e.session;
1555
- return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
1556
- case 5:
1557
- error_30 = _f.sent();
1558
- return [2, { data: {}, error: new AuthError(error_30, { method: 'signInWithOpenId' }) }];
1559
- case 6: return [2];
1560
- }
1561
- });
1562
- });
1563
- };
1564
- Auth.prototype.signInWithPhoneAuth = function (_a) {
1565
- var _b = _a.phoneCode, phoneCode = _b === void 0 ? '' : _b, _c = _a.useWxCloud, useWxCloud = _c === void 0 ? false : _c;
1566
- return __awaiter(this, void 0, void 0, function () {
1567
- var wxInfo, providerInfo, code, providerToken, signInRes, error_33, loginState, _d, _e, session;
1568
- return __generator(this, function (_f) {
1569
- switch (_f.label) {
1570
- case 0:
1571
- if (!adapterForWxMp.isMatch()) {
1572
- return [2, { data: {}, error: new AuthError({ message: 'wx api undefined' }) }];
1573
- }
1574
- wxInfo = wx.getAccountInfoSync().miniProgram;
1575
- providerInfo = {
1576
- provider_params: { provider_code_type: 'phone', code: phoneCode, appid: wxInfo.appId },
1577
- provider_id: wxInfo.appId,
1578
- };
1579
- return [4, wx.login()];
1580
- case 1:
1581
- code = (_f.sent()).code;
1582
- providerInfo.provider_code = code;
1583
- _f.label = 2;
1584
- case 2:
1585
- _f.trys.push([2, 5, , 6]);
1586
- return [4, this.oauthInstance.authApi.grantProviderToken(providerInfo, useWxCloud)];
1587
- case 3:
1588
- providerToken = _f.sent();
1589
- if (providerToken.error_code) {
1590
- throw providerToken;
1591
- }
1592
- return [4, this.oauthInstance.authApi.signInWithProvider({
1593
- provider_token: providerToken.provider_token,
1594
- }, useWxCloud)];
1595
- case 4:
1596
- signInRes = _f.sent();
1597
- if (signInRes === null || signInRes === void 0 ? void 0 : signInRes.error_code) {
1598
- throw signInRes;
1599
- }
1600
- return [3, 6];
1601
- case 5:
1602
- error_33 = _f.sent();
1603
- return [2, { data: {}, error: new AuthError(error_33, { method: 'signInWithPhoneAuth' }) }];
1604
- case 6: return [4, this.createLoginState()];
1605
- case 7:
1606
- loginState = _f.sent();
1607
- return [4, this.getSession()];
1608
- case 8:
1609
- _d = (_f.sent()).data, _e = _d === void 0 ? {} : _d, session = _e.session;
1610
- return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
1611
- }
1612
- });
1613
- });
1614
- };
1615
- Auth.prototype.bindPhoneNumber = function (params) {
1616
- return __awaiter(this, void 0, void 0, function () {
1617
- return __generator(this, function (_a) {
1618
- return [2, this.oauthInstance.authApi.editContact(params)];
1619
- });
1620
- });
1621
- };
1622
- Auth.prototype.unbindProvider = function (params) {
1623
- return __awaiter(this, void 0, void 0, function () {
1624
- return __generator(this, function (_a) {
1625
- return [2, this.oauthInstance.authApi.unbindProvider(params)];
1626
- });
1627
- });
1628
- };
1629
- Auth.prototype.bindEmail = function (params) {
1630
- return this.oauthInstance.authApi.editContact(params);
1631
- };
1632
- Auth.prototype.verify = function (params) {
1633
- return __awaiter(this, void 0, void 0, function () {
1634
- return __generator(this, function (_a) {
1635
- return [2, this.oauthInstance.authApi.verify(params)];
1636
- });
1637
- });
1638
- };
1639
- Auth.prototype.getVerification = function (params, options) {
1640
- return __awaiter(this, void 0, void 0, function () {
1641
- return __generator(this, function (_a) {
1642
- if (params.phone_number) {
1643
- params.phone_number = this.formatPhone(params.phone_number);
1644
- }
1645
- return [2, this.oauthInstance.authApi.getVerification(params, options)];
1646
- });
1647
- });
1648
- };
1649
- Object.defineProperty(Auth.prototype, "currentUser", {
1650
- get: function () {
1651
- if (this.cache.mode === 'async') {
1652
- printWarn(ERRORS.INVALID_OPERATION, 'current platform\'s storage is asynchronous, please use getCurrentUser instead');
1653
- return;
1654
- }
1655
- var loginState = this.hasLoginState();
1656
- if (loginState) {
1657
- return loginState.user || null;
1658
- }
1659
- return null;
1660
- },
1661
- enumerable: false,
1662
- configurable: true
1663
- });
1664
- Auth.prototype.getCurrentUser = function (isRefresh) {
1665
- if (isRefresh === void 0) { isRefresh = true; }
1666
- return __awaiter(this, void 0, void 0, function () {
1667
- var loginState_1, error_34, loginState, userInfo;
1668
- return __generator(this, function (_a) {
1669
- switch (_a.label) {
1670
- case 0:
1671
- _a.trys.push([0, 4, , 5]);
1672
- if (!isRefresh) return [3, 3];
1673
- return [4, this.getLoginState()];
1674
- case 1:
1675
- loginState_1 = _a.sent();
1676
- if (!loginState_1) return [3, 3];
1677
- return [4, loginState_1.user.refresh()];
1678
- case 2:
1679
- _a.sent();
1680
- _a.label = 3;
1681
- case 3: return [3, 5];
1682
- case 4:
1683
- error_34 = _a.sent();
1684
- return [3, 5];
1685
- case 5: return [4, this.getLoginState()];
1686
- case 6:
1687
- loginState = _a.sent();
1688
- if (!loginState) return [3, 8];
1689
- userInfo = loginState.user.getLocalUserInfo();
1690
- return [4, loginState.user.checkLocalInfoAsync()];
1691
- case 7:
1692
- _a.sent();
1693
- return [2, __assign(__assign({}, loginState.user), userInfo)];
1694
- case 8: return [2, null];
1695
- }
1696
- });
1697
- });
1698
- };
1699
- Auth.prototype.signInAnonymouslyInWx = function (_a) {
1700
- var _b = _a === void 0 ? {} : _a, useWxCloud = _b.useWxCloud;
1701
- return __awaiter(this, void 0, void 0, function () {
1702
- var wxInfo, mainFunc;
1703
- var _this = this;
1704
- return __generator(this, function (_c) {
1705
- switch (_c.label) {
1706
- case 0:
1707
- if (!adapterForWxMp.isMatch()) {
1708
- throw Error('wx api undefined');
1709
- }
1710
- wxInfo = wx.getAccountInfoSync().miniProgram;
1711
- mainFunc = function (code) { return __awaiter(_this, void 0, void 0, function () {
1712
- var result, credentials, error_35;
1713
- return __generator(this, function (_a) {
1714
- switch (_a.label) {
1715
- case 0:
1716
- result = undefined;
1717
- credentials = undefined;
1718
- _a.label = 1;
1719
- case 1:
1720
- _a.trys.push([1, 4, , 5]);
1721
- return [4, this.oauthInstance.authApi.grantProviderToken({
1722
- provider_id: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
1723
- provider_code: code,
1724
- provider_params: {
1725
- provider_code_type: 'open_id',
1726
- appid: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
1727
- },
1728
- }, useWxCloud)];
1729
- case 2:
1730
- result = _a.sent();
1731
- if ((result === null || result === void 0 ? void 0 : result.error_code) || !result.provider_token) {
1732
- throw result;
1733
- }
1734
- return [4, this.oauthInstance.authApi.signInAnonymously({ provider_token: result.provider_token }, useWxCloud)];
1735
- case 3:
1736
- credentials = _a.sent();
1737
- if (credentials === null || credentials === void 0 ? void 0 : credentials.error_code) {
1738
- throw credentials;
1739
- }
1740
- return [3, 5];
1741
- case 4:
1742
- error_35 = _a.sent();
1743
- throw error_35;
1744
- case 5: return [2];
1745
- }
1746
- });
1747
- }); };
1748
- return [4, new Promise(function (resolve, reject) {
1749
- wx.login({
1750
- success: function (res) { return __awaiter(_this, void 0, void 0, function () {
1751
- var error_36;
1752
- return __generator(this, function (_a) {
1753
- switch (_a.label) {
1754
- case 0:
1755
- _a.trys.push([0, 2, , 3]);
1756
- return [4, mainFunc(res.code)];
1757
- case 1:
1758
- _a.sent();
1759
- resolve(true);
1760
- return [3, 3];
1761
- case 2:
1762
- error_36 = _a.sent();
1763
- reject(error_36);
1764
- return [3, 3];
1765
- case 3: return [2];
1766
- }
1767
- });
1768
- }); },
1769
- fail: function (res) {
1770
- var error = new Error(res === null || res === void 0 ? void 0 : res.errMsg);
1771
- error.code = res === null || res === void 0 ? void 0 : res.errno;
1772
- reject(error);
1773
- },
1774
- });
1775
- })];
1776
- case 1:
1777
- _c.sent();
1778
- return [2, this.createLoginState(undefined, { asyncRefreshUser: true })];
1779
- }
1780
- });
1781
- });
1782
- };
1783
- Auth.prototype.bindOpenId = function () {
1784
- return __awaiter(this, void 0, void 0, function () {
1785
- var wxInfo, mainFunc;
1786
- var _this = this;
1787
- return __generator(this, function (_a) {
1788
- switch (_a.label) {
1789
- case 0:
1790
- if (!adapterForWxMp.isMatch()) {
1791
- throw Error('wx api undefined');
1792
- }
1793
- wxInfo = wx.getAccountInfoSync().miniProgram;
1794
- mainFunc = function (code) { return __awaiter(_this, void 0, void 0, function () {
1795
- var result, error_37;
1796
- return __generator(this, function (_a) {
1797
- switch (_a.label) {
1798
- case 0:
1799
- result = undefined;
1800
- _a.label = 1;
1801
- case 1:
1802
- _a.trys.push([1, 4, , 5]);
1803
- return [4, this.oauthInstance.authApi.grantProviderToken({
1804
- provider_id: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
1805
- provider_code: code,
1806
- provider_params: {
1807
- provider_code_type: 'open_id',
1808
- appid: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
1809
- },
1810
- })];
1811
- case 2:
1812
- result = _a.sent();
1813
- if ((result === null || result === void 0 ? void 0 : result.error_code) || !result.provider_token) {
1814
- throw result;
1815
- }
1816
- return [4, this.oauthInstance.authApi.bindWithProvider({ provider_token: result.provider_token })];
1817
- case 3:
1818
- _a.sent();
1819
- return [3, 5];
1820
- case 4:
1821
- error_37 = _a.sent();
1822
- throw error_37;
1823
- case 5: return [2];
1824
- }
1825
- });
1826
- }); };
1827
- return [4, new Promise(function (resolve, reject) {
1828
- wx.login({
1829
- success: function (res) { return __awaiter(_this, void 0, void 0, function () {
1830
- var error_38;
1831
- return __generator(this, function (_a) {
1832
- switch (_a.label) {
1833
- case 0:
1834
- _a.trys.push([0, 2, , 3]);
1835
- return [4, mainFunc(res.code)];
1836
- case 1:
1837
- _a.sent();
1838
- resolve(true);
1839
- return [3, 3];
1840
- case 2:
1841
- error_38 = _a.sent();
1842
- reject(error_38);
1843
- return [3, 3];
1844
- case 3: return [2];
1845
- }
1846
- });
1847
- }); },
1848
- fail: function (res) {
1849
- var error = new Error(res === null || res === void 0 ? void 0 : res.errMsg);
1850
- error.code = res === null || res === void 0 ? void 0 : res.errno;
1851
- reject(error);
1852
- },
1853
- });
1854
- })];
1855
- case 1:
1856
- _a.sent();
1857
- return [2];
1858
- }
1859
- });
1860
- });
1861
- };
1862
- Auth.prototype.signInWithUnionId = function () {
1863
- return __awaiter(this, void 0, void 0, function () {
1864
- var error_39;
1865
- var _this = this;
1866
- return __generator(this, function (_a) {
1867
- switch (_a.label) {
1868
- case 0:
1869
- if (!adapterForWxMp.isMatch()) {
1870
- throw Error('wx api undefined');
1871
- }
1872
- _a.label = 1;
1873
- case 1:
1874
- _a.trys.push([1, 3, , 4]);
1875
- return [4, new Promise(function (resolve, reject) {
1876
- var wxInfo = wx.getAccountInfoSync().miniProgram;
1877
- wx.login({
1878
- success: function (res) { return __awaiter(_this, void 0, void 0, function () {
1879
- var providerId, result, providerToken, signInRes, error_40;
1880
- return __generator(this, function (_a) {
1881
- switch (_a.label) {
1882
- case 0:
1883
- providerId = wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId;
1884
- _a.label = 1;
1885
- case 1:
1886
- _a.trys.push([1, 4, , 5]);
1887
- return [4, this.oauthInstance.authApi.grantProviderToken({
1888
- provider_code: res.code,
1889
- provider_id: providerId,
1890
- provider_params: {
1891
- provider_code_type: 'union_id',
1892
- appid: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
1893
- },
1894
- })];
1895
- case 2:
1896
- result = _a.sent();
1897
- providerToken = result.provider_token;
1898
- if (!providerToken) {
1899
- reject(result);
1900
- return [2];
1901
- }
1902
- return [4, this.oauthInstance.authApi.signInWithProvider({
1903
- provider_id: providerId,
1904
- provider_token: providerToken,
1905
- })];
1906
- case 3:
1907
- signInRes = _a.sent();
1908
- if (signInRes === null || signInRes === void 0 ? void 0 : signInRes.error_code) {
1909
- reject(signInRes);
1910
- return [2];
1911
- }
1912
- resolve(true);
1913
- return [3, 5];
1914
- case 4:
1915
- error_40 = _a.sent();
1916
- reject(error_40);
1917
- return [3, 5];
1918
- case 5: return [2];
1919
- }
1920
- });
1921
- }); },
1922
- fail: function (res) {
1923
- var error = new Error(res === null || res === void 0 ? void 0 : res.errMsg);
1924
- error.code = res === null || res === void 0 ? void 0 : res.errno;
1925
- reject(error);
1926
- },
1927
- });
1928
- })];
1929
- case 2:
1930
- _a.sent();
1931
- return [3, 4];
1932
- case 3:
1933
- error_39 = _a.sent();
1934
- throw error_39;
1935
- case 4: return [2, this.createLoginState()];
1936
- }
1937
- });
1938
- });
1939
- };
1940
- Auth.prototype.signInWithSms = function (_a) {
1941
- var _b = _a.verificationInfo, verificationInfo = _b === void 0 ? { verification_id: '', is_user: false } : _b, _c = _a.verificationCode, verificationCode = _c === void 0 ? '' : _c, _d = _a.phoneNum, phoneNum = _d === void 0 ? '' : _d, _e = _a.bindInfo, bindInfo = _e === void 0 ? undefined : _e;
1942
- return __awaiter(this, void 0, void 0, function () {
1943
- return __generator(this, function (_f) {
1944
- try {
1945
- return [2, this.signInWithUsername({
1946
- verificationInfo: verificationInfo,
1947
- verificationCode: verificationCode,
1948
- bindInfo: bindInfo,
1949
- username: phoneNum,
1950
- loginType: 'sms',
1951
- })];
1952
- }
1953
- catch (error) {
1954
- throw error;
1955
- }
1956
- return [2];
1957
- });
1958
- });
1959
- };
1960
- Auth.prototype.signInWithEmail = function (_a) {
1961
- var _b = _a.verificationInfo, verificationInfo = _b === void 0 ? { verification_id: '', is_user: false } : _b, _c = _a.verificationCode, verificationCode = _c === void 0 ? '' : _c, _d = _a.bindInfo, bindInfo = _d === void 0 ? undefined : _d, _e = _a.email, email = _e === void 0 ? '' : _e;
1962
- return __awaiter(this, void 0, void 0, function () {
1963
- return __generator(this, function (_f) {
1964
- try {
1965
- return [2, this.signInWithUsername({
1966
- verificationInfo: verificationInfo,
1967
- verificationCode: verificationCode,
1968
- bindInfo: bindInfo,
1969
- username: email,
1970
- loginType: 'email',
1971
- })];
1972
- }
1973
- catch (error) {
1974
- throw error;
1975
- }
1976
- return [2];
1977
- });
1978
- });
1979
- };
1980
- Auth.prototype.setCustomSignFunc = function (getTickFn) {
1981
- this.oauthInstance.authApi.setCustomSignFunc(getTickFn);
1982
- };
1983
- Auth.prototype.signIn = function (params) {
1984
- return __awaiter(this, void 0, void 0, function () {
1985
- return __generator(this, function (_a) {
1986
- switch (_a.label) {
1987
- case 0: return [4, this.oauthInstance.authApi.signIn(params)];
1988
- case 1:
1989
- _a.sent();
1990
- return [2, this.createLoginState(params)];
1991
- }
1992
- });
1993
- });
1994
- };
1995
- Auth.prototype.setPassword = function (params) {
1996
- return __awaiter(this, void 0, void 0, function () {
1997
- return __generator(this, function (_a) {
1998
- return [2, this.oauthInstance.authApi.setPassword(params)];
1999
- });
2000
- });
2001
- };
2002
- Auth.prototype.isUsernameRegistered = function (username) {
2003
- return __awaiter(this, void 0, void 0, function () {
2004
- var exist;
2005
- return __generator(this, function (_a) {
2006
- switch (_a.label) {
2007
- case 0:
2008
- if (typeof username !== 'string') {
2009
- throwError(ERRORS.INVALID_PARAMS, 'username must be a string');
2010
- }
2011
- return [4, this.oauthInstance.authApi.checkIfUserExist({ username: username })];
2012
- case 1:
2013
- exist = (_a.sent()).exist;
2014
- return [2, exist];
2015
- }
2016
- });
2017
- });
2018
- };
2019
- Auth.prototype.hasLoginState = function () {
2020
- var _a;
2021
- if (this.cache.mode === 'async') {
2022
- printWarn(ERRORS.INVALID_OPERATION, 'current platform\'s storage is asynchronous, please use getLoginState instead');
2023
- return;
2024
- }
2025
- var oauthLoginState = (_a = this.oauthInstance) === null || _a === void 0 ? void 0 : _a.authApi.hasLoginStateSync();
2026
- if (oauthLoginState) {
2027
- var loginState = new LoginState({
2028
- envId: this.config.env,
2029
- cache: this.cache,
2030
- oauthInstance: this.oauthInstance,
2031
- });
2032
- return loginState;
2033
- }
2034
- return null;
2035
- };
2036
- Auth.prototype.getLoginState = function () {
2037
- return __awaiter(this, void 0, void 0, function () {
2038
- var oauthLoginState, error_41, loginState;
2039
- return __generator(this, function (_a) {
2040
- switch (_a.label) {
2041
- case 0:
2042
- oauthLoginState = null;
2043
- _a.label = 1;
2044
- case 1:
2045
- _a.trys.push([1, 3, , 4]);
2046
- return [4, this.oauthInstance.authApi.getLoginState()];
2047
- case 2:
2048
- oauthLoginState = _a.sent();
2049
- return [3, 4];
2050
- case 3:
2051
- error_41 = _a.sent();
2052
- return [2, null];
2053
- case 4:
2054
- if (oauthLoginState) {
2055
- loginState = new LoginState({
2056
- envId: this.config.env,
2057
- cache: this.cache,
2058
- oauthInstance: this.oauthInstance,
2059
- });
2060
- return [2, loginState];
2061
- }
2062
- return [2, null];
2063
- }
2064
- });
2065
- });
2066
- };
2067
- Auth.prototype.getUserInfo = function () {
2068
- return __awaiter(this, void 0, void 0, function () {
2069
- return __generator(this, function (_a) {
2070
- return [2, this.getCurrentUser()];
2071
- });
2072
- });
2073
- };
2074
- Auth.prototype.getWedaUserInfo = function () {
2075
- return __awaiter(this, void 0, void 0, function () {
2076
- return __generator(this, function (_a) {
2077
- return [2, this.oauthInstance.authApi.getWedaUserInfo()];
2078
- });
2079
- });
2080
- };
2081
- Auth.prototype.updateUserBasicInfo = function (params) {
2082
- return __awaiter(this, void 0, void 0, function () {
2083
- var loginState;
2084
- return __generator(this, function (_a) {
2085
- switch (_a.label) {
2086
- case 0: return [4, this.getLoginState()];
2087
- case 1:
2088
- loginState = _a.sent();
2089
- if (!loginState) return [3, 3];
2090
- return [4, loginState.user.updateUserBasicInfo(params)];
2091
- case 2:
2092
- _a.sent();
2093
- _a.label = 3;
2094
- case 3: return [2];
2095
- }
2096
- });
2097
- });
2098
- };
2099
- Auth.prototype.getAuthHeader = function () {
2100
- console.error('Auth.getAuthHeader API 已废弃');
2101
- return {};
2102
- };
2103
- Auth.prototype.bindWithProvider = function (params) {
2104
- return __awaiter(this, void 0, void 0, function () {
2105
- return __generator(this, function (_a) {
2106
- return [2, this.oauthInstance.authApi.bindWithProvider(params)];
2107
- });
2108
- });
2109
- };
2110
- Auth.prototype.queryUser = function (queryObj) {
2111
- return __awaiter(this, void 0, void 0, function () {
2112
- return __generator(this, function (_a) {
2113
- return [2, this.oauthInstance.authApi.queryUserProfile(queryObj)];
2114
- });
2115
- });
2116
- };
2117
- Auth.prototype.getAccessToken = function () {
2118
- return __awaiter(this, void 0, void 0, function () {
2119
- var oauthAccessTokenRes;
2120
- return __generator(this, function (_a) {
2121
- switch (_a.label) {
2122
- case 0: return [4, this.oauthInstance.oauth2client.getAccessToken()];
2123
- case 1:
2124
- oauthAccessTokenRes = _a.sent();
2125
- return [2, {
2126
- accessToken: oauthAccessTokenRes,
2127
- env: this.config.env,
2128
- }];
2129
- }
2130
- });
2131
- });
2132
- };
2133
- Auth.prototype.grantProviderToken = function (params) {
2134
- return __awaiter(this, void 0, void 0, function () {
2135
- return __generator(this, function (_a) {
2136
- return [2, this.oauthInstance.authApi.grantProviderToken(params)];
2137
- });
2138
- });
2139
- };
2140
- Auth.prototype.patchProviderToken = function (params) {
2141
- return __awaiter(this, void 0, void 0, function () {
2142
- return __generator(this, function (_a) {
2143
- return [2, this.oauthInstance.authApi.patchProviderToken(params)];
2144
- });
2145
- });
2146
- };
2147
- Auth.prototype.signInWithProvider = function (params) {
2148
- return __awaiter(this, void 0, void 0, function () {
2149
- return __generator(this, function (_a) {
2150
- switch (_a.label) {
2151
- case 0: return [4, this.oauthInstance.authApi.signInWithProvider(params)];
2152
- case 1:
2153
- _a.sent();
2154
- return [2, this.createLoginState(params)];
2155
- }
2156
- });
2157
- });
2158
- };
2159
- Auth.prototype.signInWithWechat = function (params) {
2160
- if (params === void 0) { params = {}; }
2161
- return __awaiter(this, void 0, void 0, function () {
2162
- return __generator(this, function (_a) {
2163
- switch (_a.label) {
2164
- case 0: return [4, this.oauthInstance.authApi.signInWithWechat(params)];
2165
- case 1:
2166
- _a.sent();
2167
- return [2, this.createLoginState(params)];
2168
- }
2169
- });
2170
- });
2171
- };
2172
- Auth.prototype.grantToken = function (params) {
2173
- return __awaiter(this, void 0, void 0, function () {
2174
- return __generator(this, function (_a) {
2175
- switch (_a.label) {
2176
- case 0: return [4, this.oauthInstance.authApi.grantToken(params)];
2177
- case 1:
2178
- _a.sent();
2179
- return [2, this.createLoginState()];
2180
- }
2181
- });
2182
- });
2183
- };
2184
- Auth.prototype.genProviderRedirectUri = function (params) {
2185
- return __awaiter(this, void 0, void 0, function () {
2186
- return __generator(this, function (_a) {
2187
- return [2, this.oauthInstance.authApi.genProviderRedirectUri(params)];
2188
- });
2189
- });
2190
- };
2191
- Auth.prototype.resetPassword = function (params) {
2192
- return __awaiter(this, void 0, void 0, function () {
2193
- return __generator(this, function (_a) {
2194
- return [2, this.oauthInstance.authApi.resetPassword(params)];
2195
- });
2196
- });
2197
- };
2198
- Auth.prototype.deviceAuthorize = function (params) {
2199
- return __awaiter(this, void 0, void 0, function () {
2200
- return __generator(this, function (_a) {
2201
- return [2, this.oauthInstance.authApi.deviceAuthorize(params)];
2202
- });
2203
- });
2204
- };
2205
- Auth.prototype.sudo = function (params) {
2206
- return __awaiter(this, void 0, void 0, function () {
2207
- return __generator(this, function (_a) {
2208
- return [2, this.oauthInstance.authApi.sudo(params)];
2209
- });
2210
- });
2211
- };
2212
- Auth.prototype.deleteMe = function (params) {
2213
- return __awaiter(this, void 0, void 0, function () {
2214
- return __generator(this, function (_a) {
2215
- return [2, this.oauthInstance.authApi.deleteMe(params)];
2216
- });
2217
- });
2218
- };
2219
- Auth.prototype.getProviders = function () {
2220
- return __awaiter(this, void 0, void 0, function () {
2221
- return __generator(this, function (_a) {
2222
- return [2, this.oauthInstance.authApi.getProviders()];
2223
- });
2224
- });
2225
- };
2226
- Auth.prototype.loginScope = function () {
2227
- return __awaiter(this, void 0, void 0, function () {
2228
- return __generator(this, function (_a) {
2229
- return [2, this.oauthInstance.authApi.loginScope()];
2230
- });
2231
- });
2232
- };
2233
- Auth.prototype.loginGroups = function () {
2234
- return __awaiter(this, void 0, void 0, function () {
2235
- return __generator(this, function (_a) {
2236
- return [2, this.oauthInstance.authApi.loginGroups()];
2237
- });
2238
- });
2239
- };
2240
- Auth.prototype.onLoginStateChanged = function (callback) {
2241
- var _a;
2242
- return __awaiter(this, void 0, void 0, function () {
2243
- var loginState;
2244
- var _this = this;
2245
- return __generator(this, function (_b) {
2246
- switch (_b.label) {
2247
- case 0:
2248
- (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.on(EVENTS.LOGIN_STATE_CHANGED, function (params) { return __awaiter(_this, void 0, void 0, function () {
2249
- var loginState, _a;
2250
- var _b;
2251
- return __generator(this, function (_c) {
2252
- switch (_c.label) {
2253
- case 0:
2254
- if (!(((_b = params === null || params === void 0 ? void 0 : params.data) === null || _b === void 0 ? void 0 : _b.eventType) !== LOGIN_STATE_CHANGED_TYPE.CREDENTIALS_ERROR)) return [3, 2];
2255
- return [4, this.getLoginState()];
2256
- case 1:
2257
- _a = _c.sent();
2258
- return [3, 3];
2259
- case 2:
2260
- _a = {};
2261
- _c.label = 3;
2262
- case 3:
2263
- loginState = _a;
2264
- callback.call(this, __assign(__assign({}, params), loginState));
2265
- return [2];
2266
- }
2267
- });
2268
- }); });
2269
- return [4, this.getLoginState()];
2270
- case 1:
2271
- loginState = _b.sent();
2272
- callback.call(this, loginState);
2273
- return [2];
2274
- }
2275
- });
2276
- });
2277
- };
2278
- Auth.prototype.refreshTokenForce = function (params) {
2279
- return __awaiter(this, void 0, void 0, function () {
2280
- return __generator(this, function (_a) {
2281
- return [2, this.oauthInstance.authApi.refreshTokenForce(params)];
2282
- });
2283
- });
2284
- };
2285
- Auth.prototype.getCredentials = function () {
2286
- return __awaiter(this, void 0, void 0, function () {
2287
- return __generator(this, function (_a) {
2288
- return [2, this.oauthInstance.authApi.getCredentials()];
2289
- });
2290
- });
2291
- };
2292
- Auth.prototype.setCredentials = function (credentials) {
2293
- return __awaiter(this, void 0, void 0, function () {
2294
- return __generator(this, function (_a) {
2295
- switch (_a.label) {
2296
- case 0: return [4, this.oauthInstance.oauth2client.setCredentials(credentials)];
2297
- case 1:
2298
- _a.sent();
2299
- return [2];
2300
- }
2301
- });
2302
- });
2303
- };
2304
- Auth.prototype.getProviderSubType = function () {
2305
- return __awaiter(this, void 0, void 0, function () {
2306
- return __generator(this, function (_a) {
2307
- return [2, this.oauthInstance.authApi.getProviderSubType()];
2308
- });
2309
- });
2310
- };
2311
- Auth.prototype.createCaptchaData = function (params) {
2312
- return __awaiter(this, void 0, void 0, function () {
2313
- return __generator(this, function (_a) {
2314
- return [2, this.oauthInstance.authApi.createCaptchaData(params)];
2315
- });
2316
- });
2317
- };
2318
- Auth.prototype.verifyCaptchaData = function (params) {
2319
- return __awaiter(this, void 0, void 0, function () {
2320
- return __generator(this, function (_a) {
2321
- return [2, this.oauthInstance.authApi.verifyCaptchaData(params)];
2322
- });
2323
- });
2324
- };
2325
- Auth.prototype.getMiniProgramQrCode = function (params) {
2326
- return __awaiter(this, void 0, void 0, function () {
2327
- return __generator(this, function (_a) {
2328
- return [2, this.oauthInstance.authApi.getMiniProgramCode(params)];
2329
- });
2330
- });
2331
- };
2332
- Auth.prototype.getMiniProgramQrCodeStatus = function (params) {
2333
- return __awaiter(this, void 0, void 0, function () {
2334
- return __generator(this, function (_a) {
2335
- return [2, this.oauthInstance.authApi.getMiniProgramQrCodeStatus(params)];
2336
- });
2337
- });
2338
- };
2339
- Auth.prototype.modifyPassword = function (params) {
2340
- return __awaiter(this, void 0, void 0, function () {
2341
- return __generator(this, function (_a) {
2342
- return [2, this.oauthInstance.authApi.modifyPassword(params)];
2343
- });
2344
- });
2345
- };
2346
- Auth.prototype.modifyPasswordWithoutLogin = function (params) {
2347
- return __awaiter(this, void 0, void 0, function () {
2348
- return __generator(this, function (_a) {
2349
- return [2, this.oauthInstance.authApi.modifyPasswordWithoutLogin(params)];
2350
- });
2351
- });
2352
- };
2353
- Auth.prototype.getUserBehaviorLog = function (params) {
2354
- return __awaiter(this, void 0, void 0, function () {
2355
- return __generator(this, function (_a) {
2356
- return [2, this.oauthInstance.authApi.getUserBehaviorLog(params)];
2357
- });
2358
- });
2359
- };
2360
- Auth.prototype.signInWithUsername = function (_a) {
2361
- var _b = _a.verificationInfo, verificationInfo = _b === void 0 ? { verification_id: '', is_user: false } : _b, _c = _a.verificationCode, verificationCode = _c === void 0 ? '' : _c, _d = _a.username, rawUsername = _d === void 0 ? '' : _d, _e = _a.bindInfo, bindInfo = _e === void 0 ? undefined : _e, _f = _a.loginType, loginType = _f === void 0 ? '' : _f;
2362
- return __awaiter(this, void 0, void 0, function () {
2363
- var verifyRes, verification_token, username, signUpParam, signInRes, bindRes, signUpRes, error_42;
2364
- return __generator(this, function (_g) {
2365
- switch (_g.label) {
2366
- case 0:
2367
- _g.trys.push([0, 8, , 9]);
2368
- return [4, this.oauthInstance.authApi.verify({
2369
- verification_id: verificationInfo.verification_id,
2370
- verification_code: verificationCode,
2371
- })];
2372
- case 1:
2373
- verifyRes = _g.sent();
2374
- if (verifyRes === null || verifyRes === void 0 ? void 0 : verifyRes.error_code) {
2375
- throw verifyRes;
2376
- }
2377
- verification_token = verifyRes.verification_token;
2378
- username = this.formatPhone(rawUsername);
2379
- signUpParam = { phone_number: username };
2380
- if (loginType === 'email') {
2381
- username = rawUsername;
2382
- signUpParam = { email: username };
2383
- }
2384
- if (!verificationInfo.is_user) return [3, 5];
2385
- return [4, this.oauthInstance.authApi.signIn({
2386
- username: username,
2387
- verification_token: verification_token,
2388
- })];
2389
- case 2:
2390
- signInRes = _g.sent();
2391
- if (signInRes === null || signInRes === void 0 ? void 0 : signInRes.error_code) {
2392
- throw signInRes;
2393
- }
2394
- if (!bindInfo) return [3, 4];
2395
- return [4, this.oauthInstance.authApi.bindWithProvider({
2396
- provider_token: bindInfo === null || bindInfo === void 0 ? void 0 : bindInfo.providerToken,
2397
- })];
2398
- case 3:
2399
- bindRes = _g.sent();
2400
- if (bindRes === null || bindRes === void 0 ? void 0 : bindRes.error_code) {
2401
- throw bindRes;
2402
- }
2403
- _g.label = 4;
2404
- case 4: return [3, 7];
2405
- case 5: return [4, this.oauthInstance.authApi.signUp(__assign(__assign({}, signUpParam), { verification_token: verification_token, provider_token: bindInfo === null || bindInfo === void 0 ? void 0 : bindInfo.providerId }))];
2406
- case 6:
2407
- signUpRes = _g.sent();
2408
- if (signUpRes === null || signUpRes === void 0 ? void 0 : signUpRes.error_code) {
2409
- throw signUpRes;
2410
- }
2411
- _g.label = 7;
2412
- case 7: return [2, this.createLoginState()];
2413
- case 8:
2414
- error_42 = _g.sent();
2415
- throw error_42;
2416
- case 9: return [2];
2417
- }
2418
- });
2419
- });
2420
- };
2421
- Auth.prototype.createLoginState = function (params, options) {
2422
- var _a, _b;
2423
- return __awaiter(this, void 0, void 0, function () {
2424
- var loginState;
2425
- return __generator(this, function (_c) {
2426
- switch (_c.label) {
2427
- case 0:
2428
- loginState = new LoginState({
2429
- envId: this.config.env,
2430
- cache: this.cache,
2431
- oauthInstance: this.oauthInstance,
2432
- });
2433
- return [4, loginState.checkLocalStateAsync()];
2434
- case 1:
2435
- _c.sent();
2436
- if (!(options === null || options === void 0 ? void 0 : options.userInfo)) return [3, 2];
2437
- loginState.user.setLocalUserInfo(options.userInfo);
2438
- return [3, 5];
2439
- case 2:
2440
- if (!(options === null || options === void 0 ? void 0 : options.asyncRefreshUser)) return [3, 3];
2441
- loginState.user.refresh(params);
2442
- return [3, 5];
2443
- case 3: return [4, loginState.user.refresh(params)];
2444
- case 4:
2445
- _c.sent();
2446
- _c.label = 5;
2447
- case 5:
2448
- (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.LOGIN_STATE_CHANGED, { eventType: LOGIN_STATE_CHANGED_TYPE.SIGN_IN });
2449
- (_b = this.config.eventBus) === null || _b === void 0 ? void 0 : _b.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_IN });
2450
- return [2, loginState];
2451
- }
2452
- });
2453
- });
2454
- };
2455
- Auth.prototype.setAccessKey = function () {
2456
- var _a, _b;
2457
- return __awaiter(this, void 0, void 0, function () {
2458
- var accessToken, scope;
2459
- return __generator(this, function (_c) {
2460
- accessToken = '';
2461
- scope = '';
2462
- if (this.config.accessKey) {
2463
- accessToken = this.config.accessKey;
2464
- scope = 'accessKey';
2465
- }
2466
- else if (((_a = this.config.auth) === null || _a === void 0 ? void 0 : _a.secretId) && ((_b = this.config.auth) === null || _b === void 0 ? void 0 : _b.secretKey)) {
2467
- accessToken = '';
2468
- scope = DEFAULT_NODE_ACCESS_SCOPE;
2469
- }
2470
- if (!scope) {
2471
- return [2];
2472
- }
2473
- try {
2474
- this.oauthInstance.oauth2client.setAccessKeyCredentials({
2475
- access_token: accessToken,
2476
- token_type: 'Bearer',
2477
- scope: scope,
2478
- expires_at: new Date(+new Date() + +new Date()),
2479
- expires_in: +new Date() + +new Date(),
2480
- });
2481
- }
2482
- catch (error) {
2483
- console.warn('accessKey error: ', error);
2484
- }
2485
- return [2];
2486
- });
2487
- });
2488
- };
2489
- Auth.prototype.formatPhone = function (phone) {
2490
- if (!/\s+/.test(phone) && /^\+\d{1,3}\d+/.test(phone)) {
2491
- return phone.replace(/^(\+\d{1,2})(\d+)$/, '$1 $2');
2492
- }
2493
- return /^\+\d{1,3}\s+/.test(phone) ? phone : "+86 ".concat(phone);
2494
- };
2495
- Auth.prototype.notifyListeners = function (event, session, info) {
2496
- this.listeners.forEach(function (callbacks) {
2497
- callbacks.forEach(function (callback) {
2498
- try {
2499
- callback(event, session, info);
2500
- }
2501
- catch (error) {
2502
- console.error('Error in auth state change callback:', error);
2503
- }
2504
- });
2505
- });
2506
- return;
2507
- };
2508
- Auth.prototype.setupListeners = function () {
2509
- var _this = this;
2510
- var _a;
2511
- (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.on(EVENTS.AUTH_STATE_CHANGED, function (params) { return __awaiter(_this, void 0, void 0, function () {
2512
- var event, info, session;
2513
- var _a, _b;
2514
- return __generator(this, function (_c) {
2515
- switch (_c.label) {
2516
- case 0:
2517
- event = (_a = params === null || params === void 0 ? void 0 : params.data) === null || _a === void 0 ? void 0 : _a.event;
2518
- info = (_b = params === null || params === void 0 ? void 0 : params.data) === null || _b === void 0 ? void 0 : _b.info;
2519
- return [4, this.getSession()];
2520
- case 1:
2521
- session = (_c.sent()).data.session;
2522
- this.notifyListeners(event, session, info);
2523
- return [2];
2524
- }
2525
- });
2526
- }); });
2527
- };
2528
- Auth.prototype.convertToUser = function (userInfo) {
2529
- var _a, _b, _c, _d, _e, _f;
2530
- if (!userInfo)
2531
- return null;
2532
- var email = (userInfo === null || userInfo === void 0 ? void 0 : userInfo.email) || '';
2533
- var phone = (userInfo === null || userInfo === void 0 ? void 0 : userInfo.phone_number) || '';
2534
- var userId = (userInfo === null || userInfo === void 0 ? void 0 : userInfo.sub) || (userInfo === null || userInfo === void 0 ? void 0 : userInfo.uid) || '';
2535
- return {
2536
- id: userId,
2537
- aud: 'authenticated',
2538
- role: (_b = (_a = userInfo.groups) === null || _a === void 0 ? void 0 : _a.map) === null || _b === void 0 ? void 0 : _b.call(_a, function (group) { return (typeof group === 'string' ? group : group.id); }),
2539
- email: email || '',
2540
- email_confirmed_at: (userInfo === null || userInfo === void 0 ? void 0 : userInfo.email_verified) ? userInfo.created_at : userInfo.created_at,
2541
- phone: phone,
2542
- phone_confirmed_at: phone ? userInfo.created_at : undefined,
2543
- confirmed_at: userInfo.created_at,
2544
- last_sign_in_at: userInfo.last_sign_in_at,
2545
- app_metadata: {
2546
- provider: ((_c = userInfo.loginType) === null || _c === void 0 ? void 0 : _c.toLowerCase()) || 'cloudbase',
2547
- providers: [((_d = userInfo.loginType) === null || _d === void 0 ? void 0 : _d.toLowerCase()) || 'cloudbase'],
2548
- },
2549
- user_metadata: {
2550
- name: userInfo === null || userInfo === void 0 ? void 0 : userInfo.name,
2551
- picture: userInfo === null || userInfo === void 0 ? void 0 : userInfo.picture,
2552
- username: userInfo === null || userInfo === void 0 ? void 0 : userInfo.username,
2553
- gender: userInfo === null || userInfo === void 0 ? void 0 : userInfo.gender,
2554
- locale: userInfo === null || userInfo === void 0 ? void 0 : userInfo.locale,
2555
- uid: userInfo.uid,
2556
- nickName: userInfo.nickName || (userInfo === null || userInfo === void 0 ? void 0 : userInfo.name),
2557
- avatarUrl: userInfo.avatarUrl || userInfo.picture,
2558
- location: userInfo.location,
2559
- hasPassword: (_e = userInfo.hasPassword) !== null && _e !== void 0 ? _e : (userInfo.password === 'SET'),
2560
- open_id: userInfo === null || userInfo === void 0 ? void 0 : userInfo.open_id,
2561
- },
2562
- identities: ((_f = userInfo === null || userInfo === void 0 ? void 0 : userInfo.providers) === null || _f === void 0 ? void 0 : _f.map(function (p) { return ({
2563
- id: p.id || '',
2564
- identity_id: p.id || '',
2565
- user_id: userId,
2566
- identity_data: {
2567
- provider_id: p.id,
2568
- provider_user_id: p.provider_user_id,
2569
- name: p.name,
2570
- },
2571
- provider: p.id || 'cloudbase',
2572
- created_at: userInfo.created_at,
2573
- updated_at: userInfo.updated_at,
2574
- last_sign_in_at: userInfo.last_sign_in_at,
2575
- }); })) || [],
2576
- created_at: userInfo.created_at,
2577
- updated_at: userInfo.updated_at,
2578
- is_anonymous: userInfo.name === 'anonymous',
2579
- };
2580
- };
2581
- Auth.prototype.validateParams = function (params, rules) {
2582
- for (var _i = 0, _a = Object.entries(rules); _i < _a.length; _i++) {
2583
- var _b = _a[_i], key = _b[0], rule = _b[1];
2584
- if (rule.required && ((params === null || params === void 0 ? void 0 : params[key]) === undefined || (params === null || params === void 0 ? void 0 : params[key]) === null || (params === null || params === void 0 ? void 0 : params[key]) === '')) {
2585
- throw new AuthError({ message: rule.message });
2586
- }
2587
- }
2588
- };
2589
- Auth.prototype.validateAtLeastOne = function (params, fieldGroups, message) {
2590
- var hasValue = fieldGroups.some(function (group) { return group.some(function (field) { return (params === null || params === void 0 ? void 0 : params[field]) !== undefined && (params === null || params === void 0 ? void 0 : params[field]) !== null && (params === null || params === void 0 ? void 0 : params[field]) !== ''; }); });
2591
- if (!hasValue) {
2592
- throw new AuthError({ message: message });
2593
- }
2594
- };
2595
- Auth.prototype.init = function () {
2596
- var _a;
2597
- return __awaiter(this, void 0, void 0, function () {
2598
- var credentials, error_43;
2599
- return __generator(this, function (_b) {
2600
- switch (_b.label) {
2601
- case 0:
2602
- _b.trys.push([0, 2, , 3]);
2603
- return [4, this.oauthInstance.oauth2client.localCredentials.getCredentials()];
2604
- case 1:
2605
- credentials = _b.sent();
2606
- if (credentials) {
2607
- (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.INITIAL_SESSION });
2608
- }
2609
- return [3, 3];
2610
- case 2:
2611
- error_43 = _b.sent();
2612
- return [3, 3];
2613
- case 3: return [2, { error: null }];
2614
- }
2615
- });
2616
- });
2617
- };
2618
- __decorate([
2619
- catchErrorsDecorator({
2620
- title: '绑定手机号失败',
2621
- messages: [
2622
- '请确认以下各项:',
2623
- ' 1 - 调用 auth().bindPhoneNumber() 的语法或参数是否正确',
2624
- ' 2 - 当前环境是否开通了短信验证码登录',
2625
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2626
- ],
2627
- }),
2628
- __metadata("design:type", Function),
2629
- __metadata("design:paramtypes", [Object]),
2630
- __metadata("design:returntype", Promise)
2631
- ], Auth.prototype, "bindPhoneNumber", null);
2632
- __decorate([
2633
- catchErrorsDecorator({
2634
- title: '解除三方绑定失败',
2635
- messages: [
2636
- '请确认以下各项:',
2637
- ' 1 - 调用 auth().unbindProvider() 的语法或参数是否正确',
2638
- ' 2 - 当前账户是否已经与此登录方式解绑',
2639
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2640
- ],
2641
- }),
2642
- __metadata("design:type", Function),
2643
- __metadata("design:paramtypes", [Object]),
2644
- __metadata("design:returntype", Promise)
2645
- ], Auth.prototype, "unbindProvider", null);
2646
- __decorate([
2647
- catchErrorsDecorator({
2648
- title: '绑定邮箱地址失败',
2649
- messages: [
2650
- '请确认以下各项:',
2651
- ' 1 - 调用 auth().bindEmail() 的语法或参数是否正确',
2652
- ' 2 - 当前环境是否开通了邮箱密码登录',
2653
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2654
- ],
2655
- }),
2656
- __metadata("design:type", Function),
2657
- __metadata("design:paramtypes", [Object]),
2658
- __metadata("design:returntype", void 0)
2659
- ], Auth.prototype, "bindEmail", null);
2660
- __decorate([
2661
- catchErrorsDecorator({
2662
- title: '验证码验证失败',
2663
- messages: [
2664
- '请确认以下各项:',
2665
- ' 1 - 调用 auth().verify() 的语法或参数是否正确',
2666
- ' 2 - 当前环境是否开通了手机验证码/邮箱登录',
2667
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2668
- ],
2669
- }),
2670
- __metadata("design:type", Function),
2671
- __metadata("design:paramtypes", [Object]),
2672
- __metadata("design:returntype", Promise)
2673
- ], Auth.prototype, "verify", null);
2674
- __decorate([
2675
- catchErrorsDecorator({
2676
- title: '获取验证码失败',
2677
- messages: [
2678
- '请确认以下各项:',
2679
- ' 1 - 调用 auth().getVerification() 的语法或参数是否正确',
2680
- ' 2 - 当前环境是否开通了手机验证码/邮箱登录',
2681
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2682
- ],
2683
- }),
2684
- __metadata("design:type", Function),
2685
- __metadata("design:paramtypes", [Object, Object]),
2686
- __metadata("design:returntype", Promise)
2687
- ], Auth.prototype, "getVerification", null);
2688
- __decorate([
2689
- catchErrorsDecorator({
2690
- title: '获取用户信息失败',
2691
- messages: [
2692
- '请确认以下各项:',
2693
- ' 1 - 调用 auth().getCurrentUser() 的语法或参数是否正确',
2694
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2695
- ],
2696
- }),
2697
- __metadata("design:type", Function),
2698
- __metadata("design:paramtypes", [Object]),
2699
- __metadata("design:returntype", Promise)
2700
- ], Auth.prototype, "getCurrentUser", null);
2701
- __decorate([
2702
- catchErrorsDecorator({
2703
- title: '小程序匿名登录失败',
2704
- messages: [
2705
- '请确认以下各项:',
2706
- ' 1 - 当前环境是否开启了匿名登录',
2707
- ' 2 - 调用 auth().signInAnonymouslyInWx() 的语法或参数是否正确',
2708
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2709
- ],
2710
- }),
2711
- __metadata("design:type", Function),
2712
- __metadata("design:paramtypes", [Object]),
2713
- __metadata("design:returntype", Promise)
2714
- ], Auth.prototype, "signInAnonymouslyInWx", null);
2715
- __decorate([
2716
- catchErrorsDecorator({
2717
- title: '小程序绑定OpenID失败',
2718
- messages: [
2719
- '请确认以下各项:',
2720
- ' 1 - 当前环境是否开启了小程序openId静默登录',
2721
- ' 2 - 调用 auth().bindOpenId() 的语法或参数是否正确',
2722
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2723
- ],
2724
- }),
2725
- __metadata("design:type", Function),
2726
- __metadata("design:paramtypes", []),
2727
- __metadata("design:returntype", Promise)
2728
- ], Auth.prototype, "bindOpenId", null);
2729
- __decorate([
2730
- catchErrorsDecorator({
2731
- title: '小程序unionId静默登录失败',
2732
- messages: [
2733
- '请确认以下各项:',
2734
- ' 1 - 当前环境是否开启了小程序unionId静默登录',
2735
- ' 2 - 调用 auth().signInWithUnionId() 的语法或参数是否正确',
2736
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2737
- ],
2738
- }),
2739
- __metadata("design:type", Function),
2740
- __metadata("design:paramtypes", []),
2741
- __metadata("design:returntype", Promise)
2742
- ], Auth.prototype, "signInWithUnionId", null);
2743
- __decorate([
2744
- catchErrorsDecorator({
2745
- title: '短信验证码登陆',
2746
- messages: [
2747
- '请确认以下各项:',
2748
- ' 1 - 当前环境是否开启了小程序短信验证码登陆',
2749
- ' 2 - 调用 auth().signInWithSms() 的语法或参数是否正确',
2750
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2751
- ],
2752
- }),
2753
- __metadata("design:type", Function),
2754
- __metadata("design:paramtypes", [Object]),
2755
- __metadata("design:returntype", Promise)
2756
- ], Auth.prototype, "signInWithSms", null);
2757
- __decorate([
2758
- catchErrorsDecorator({
2759
- title: '邮箱验证码登陆',
2760
- messages: [
2761
- '请确认以下各项:',
2762
- ' 1 - 当前环境是否开启了邮箱登陆',
2763
- ' 2 - 调用 auth().signInWithEmail() 的语法或参数是否正确',
2764
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2765
- ],
2766
- }),
2767
- __metadata("design:type", Function),
2768
- __metadata("design:paramtypes", [Object]),
2769
- __metadata("design:returntype", Promise)
2770
- ], Auth.prototype, "signInWithEmail", null);
2771
- __decorate([
2772
- catchErrorsDecorator({
2773
- title: '获取用户是否被占用失败',
2774
- messages: [
2775
- '请确认以下各项:',
2776
- ' 1 - 调用 auth().isUsernameRegistered() 的语法或参数是否正确',
2777
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2778
- ],
2779
- }),
2780
- __metadata("design:type", Function),
2781
- __metadata("design:paramtypes", [String]),
2782
- __metadata("design:returntype", Promise)
2783
- ], Auth.prototype, "isUsernameRegistered", null);
2784
- __decorate([
2785
- catchErrorsDecorator({
2786
- title: '获取本地登录态失败',
2787
- messages: [
2788
- '请确认以下各项:',
2789
- ' 1 - 调用 auth().getLoginState() 的语法或参数是否正确',
2790
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2791
- ],
2792
- }),
2793
- __metadata("design:type", Function),
2794
- __metadata("design:paramtypes", []),
2795
- __metadata("design:returntype", Promise)
2796
- ], Auth.prototype, "getLoginState", null);
2797
- __decorate([
2798
- catchErrorsDecorator({
2799
- title: '获取用户信息失败',
2800
- messages: [
2801
- '请确认以下各项:',
2802
- ' 1 - 是否已登录',
2803
- ' 2 - 调用 auth().getUserInfo() 的语法或参数是否正确',
2804
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2805
- ],
2806
- }),
2807
- __metadata("design:type", Function),
2808
- __metadata("design:paramtypes", []),
2809
- __metadata("design:returntype", Promise)
2810
- ], Auth.prototype, "getUserInfo", null);
2811
- __decorate([
2812
- catchErrorsDecorator({
2813
- title: '获取微搭插件用户信息失败',
2814
- messages: [
2815
- '请确认以下各项:',
2816
- ' 1 - 是否已登录',
2817
- ' 2 - 调用 auth().getWedaUserInfo() 的语法或参数是否正确',
2818
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2819
- ],
2820
- }),
2821
- __metadata("design:type", Function),
2822
- __metadata("design:paramtypes", []),
2823
- __metadata("design:returntype", Promise)
2824
- ], Auth.prototype, "getWedaUserInfo", null);
2825
- __decorate([
2826
- catchErrorsDecorator({
2827
- title: '绑定第三方登录方式失败',
2828
- messages: [
2829
- '请确认以下各项:',
2830
- ' 1 - 调用 auth().bindWithProvider() 的语法或参数是否正确',
2831
- ' 2 - 此账户是否已经绑定此第三方',
2832
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2833
- ],
2834
- }),
2835
- __metadata("design:type", Function),
2836
- __metadata("design:paramtypes", [Object]),
2837
- __metadata("design:returntype", Promise)
2838
- ], Auth.prototype, "bindWithProvider", null);
2839
- __decorate([
2840
- catchErrorsDecorator({
2841
- title: '获取身份源类型',
2842
- messages: [
2843
- '请确认以下各项:',
2844
- ' 1 - 调用 auth().getProviderSubType() 的语法或参数是否正确',
2845
- "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
2846
- ],
2847
- }),
2848
- __metadata("design:type", Function),
2849
- __metadata("design:paramtypes", []),
2850
- __metadata("design:returntype", Promise)
2851
- ], Auth.prototype, "getProviderSubType", null);
2852
- return Auth;
2853
- }(AuthV1Compat));
2854
- export function generateAuthInstance(config, options) {
2855
- var _this = this;
2856
- var _a, _b, _c, _d;
2857
- var _e = config.region, region = _e === void 0 ? 'ap-shanghai' : _e, i18n = config.i18n, accessKey = config.accessKey, useWxCloud = config.useWxCloud;
2858
- var platform = (options === null || options === void 0 ? void 0 : options.platform) || useDefaultAdapter.bind(options)();
2859
- var runtime = platform.runtime, adapter = platform.adapter;
2860
- var _f = options || {}, env = _f.env, clientId = _f.clientId, debug = _f.debug, cache = _f.cache, cloudbase = _f.app;
2861
- var apiOrigin = (options || {}).apiOrigin;
2862
- if (!apiOrigin) {
2863
- apiOrigin = "https://".concat(env, ".").concat(region, ".tcb-api.tencentcloudapi.com");
2864
- }
2865
- var commonOpts = {
2866
- env: env,
2867
- clientId: clientId,
2868
- i18n: i18n,
2869
- accessKey: accessKey,
2870
- useWxCloud: useWxCloud,
2871
- eventBus: new CloudbaseEventEmitter(),
2872
- };
2873
- var oauthInstance = new CloudbaseOAuth(useAuthAdapter(__assign(__assign({}, commonOpts), { apiOrigin: apiOrigin, apiPath: (config === null || config === void 0 ? void 0 : config.apiPath) || AUTH_API_PREFIX, storage: config === null || config === void 0 ? void 0 : config.storage, baseRequest: config === null || config === void 0 ? void 0 : config.baseRequest, request: config === null || config === void 0 ? void 0 : config.request, anonymousSignInFunc: config === null || config === void 0 ? void 0 : config.anonymousSignInFunc, captchaOptions: config === null || config === void 0 ? void 0 : config.captchaOptions, wxCloud: config === null || config === void 0 ? void 0 : config.wxCloud, adapter: adapter, onCredentialsError: onCredentialsError(commonOpts.eventBus), headers: __assign({ 'X-SDK-Version': "@cloudbase/js-sdk/".concat(config.sdkVersion) }, (config.headers || {})), detectSessionInUrl: config.detectSessionInUrl, debug: debug, auth: (_b = (_a = options.app) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.auth })));
2874
- var authInstance = new Auth(__assign(__assign({}, commonOpts), { region: region, persistence: config.persistence, debug: debug, cache: cache || new CloudbaseCache({
2875
- persistence: config.persistence,
2876
- keys: { userInfoKey: "user_info_".concat(env) },
2877
- platformInfo: platform,
2878
- }), runtime: runtime || 'web', _fromApp: cloudbase, oauthInstance: oauthInstance, auth: (_d = (_c = options.app) === null || _c === void 0 ? void 0 : _c.config) === null || _d === void 0 ? void 0 : _d.auth }));
2879
- oauthInstance.initializeSession(function (data, error) { return __awaiter(_this, void 0, void 0, function () {
2880
- return __generator(this, function (_a) {
2881
- if (!data)
2882
- return [2];
2883
- if (data.type === OAUTH_TYPE.SIGN_IN) {
2884
- if (error) {
2885
- commonOpts.eventBus.fire(EVENTS.AUTH_STATE_CHANGED, {
2886
- event: AUTH_STATE_CHANGED_TYPE.SIGNED_IN,
2887
- info: __assign(__assign({}, data), { error: error }),
2888
- });
2889
- }
2890
- else if (data.user) {
2891
- authInstance.createLoginState({}, { userInfo: data.user });
2892
- }
2893
- }
2894
- else if (data.type === OAUTH_TYPE.BIND_IDENTITY) {
2895
- commonOpts.eventBus.fire(EVENTS.AUTH_STATE_CHANGED, {
2896
- event: AUTH_STATE_CHANGED_TYPE.BIND_IDENTITY,
2897
- info: __assign(__assign({}, data), { error: error }),
2898
- });
2899
- }
2900
- return [2];
2901
- });
2902
- }); });
2903
- return { authInstance: authInstance, oauthInstance: oauthInstance };
2904
- }
2905
- var NAMESPACE = 'auth';
2906
- function levenshteinDistance(a, b) {
2907
- var matrix = [];
2908
- for (var i = 0; i <= a.length; i++) {
2909
- matrix[i] = [i];
2910
- }
2911
- for (var j = 0; j <= b.length; j++) {
2912
- matrix[0][j] = j;
2913
- }
2914
- for (var i = 1; i <= a.length; i++) {
2915
- for (var j = 1; j <= b.length; j++) {
2916
- var cost = a[i - 1].toLowerCase() === b[j - 1].toLowerCase() ? 0 : 1;
2917
- matrix[i][j] = Math.min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + cost);
2918
- }
2919
- }
2920
- return matrix[a.length][b.length];
2921
- }
2922
- function findSimilarMethod(target, methods) {
2923
- var bestMatch = null;
2924
- var bestDistance = Infinity;
2925
- for (var _i = 0, methods_1 = methods; _i < methods_1.length; _i++) {
2926
- var method = methods_1[_i];
2927
- if (method.startsWith('_') || method === 'constructor')
2928
- continue;
2929
- var distance = levenshteinDistance(target, method);
2930
- if (distance < bestDistance) {
2931
- bestDistance = distance;
2932
- bestMatch = method;
2933
- }
2934
- }
2935
- return bestMatch;
2936
- }
2937
- var component = {
2938
- name: COMPONENT_NAME,
2939
- namespace: NAMESPACE,
2940
- entity: function (config) {
2941
- var auth = function (config) {
2942
- var _a;
2943
- if (this.authInstance && !config) {
2944
- return this.authInstance;
2945
- }
2946
- config = config || {
2947
- region: '',
2948
- persistence: 'local',
2949
- apiPath: AUTH_API_PREFIX,
2950
- };
2951
- var adapter = this.platform.adapter;
2952
- var newPersistence = config.persistence || adapter.primaryStorage;
2953
- if (newPersistence && newPersistence !== this.config.persistence) {
2954
- this.updateConfig({ persistence: newPersistence });
2955
- }
2956
- var _b = generateAuthInstance(__assign(__assign({ wxCloud: this.config.wxCloud, storage: this.config.storage }, config), { persistence: this.config.persistence, i18n: this.config.i18n, accessKey: this.config.accessKey, useWxCloud: this.config.useWxCloud, sdkVersion: this.version, detectSessionInUrl: (_a = this.config.auth) === null || _a === void 0 ? void 0 : _a.detectSessionInUrl }), {
2957
- env: this.config.env,
2958
- clientId: this.config.clientId,
2959
- apiOrigin: this.request.getBaseEndPoint(this.config.endPointMode || 'CLOUD_API'),
2960
- platform: this.platform,
2961
- cache: this.cache,
2962
- app: this,
2963
- debug: this.config.debug,
2964
- }), authInstance = _b.authInstance, oauthInstance = _b.oauthInstance;
2965
- this.oauthInstance = oauthInstance;
2966
- this.authInstance = authInstance;
2967
- return this.authInstance;
2968
- };
2969
- var authProto = auth.call(this, config);
2970
- Object.assign(auth, authProto);
2971
- Object.setPrototypeOf(auth, Object.getPrototypeOf(authProto));
2972
- var authWithHint = typeof Proxy !== 'undefined'
2973
- ? new Proxy(auth, {
2974
- get: function (target, prop, receiver) {
2975
- var value = Reflect.get(target, prop, receiver);
2976
- if (value !== undefined || typeof prop !== 'string') {
2977
- return value;
2978
- }
2979
- var allKeys = Object.getOwnPropertyNames(Object.getPrototypeOf(target))
2980
- .concat(Object.keys(target))
2981
- .filter(function (k) { return typeof target[k] === 'function'; });
2982
- var suggestion = findSimilarMethod(prop, allKeys);
2983
- if (suggestion) {
2984
- console.warn("[CloudBase Auth] auth.".concat(prop, " is not a function. Did you mean: auth.").concat(suggestion, "() ?"));
2985
- }
2986
- return value;
2987
- },
2988
- })
2989
- : auth;
2990
- this[NAMESPACE] = authWithHint;
2991
- return authWithHint;
2992
- },
2993
- };
2994
- try {
2995
- cloudbase.registerComponent(component);
2996
- }
2997
- catch (e) { }
2998
- export { Auth, WeixinAuthProvider, CustomAuthProvider, AnonymousAuthProvider };
2999
- export { AuthErrorCategory, AuthError } from '@cloudbase/oauth';
3000
- export function registerAuth(app) {
3001
- try {
3002
- app.registerComponent(component);
3003
- }
3004
- catch (e) {
3005
- console.warn(e);
3006
- }
3007
- }
3008
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLE9BQU8sRUFDTCxjQUFjLEVBQ2QsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixNQUFNLEVBQ04sdUJBQXVCLEVBQ3ZCLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGlCQUFpQixFQUNqQixVQUFVLEVBQ1YseUJBQXlCLEdBQzFCLE1BQU0sa0JBQWtCLENBQUE7QUFDekIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUMxQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGNBQWMsRUFDZCxpQkFBaUIsR0FDbEIsTUFBTSxhQUFhLENBQUE7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUNyRyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLGlCQUFpQixHQUNsQixNQUFNLGFBQWEsQ0FBQTtBQUNwQixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFrQzVDLElBQU0sU0FBUyxHQUFHLGNBQU0sT0FBQSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFoRSxDQUFnRSxDQUFBO0FBbUN4RixJQUFNLGNBQWMsR0FBRyxNQUFNLENBQUE7QUFrQjdCLElBQU0sa0JBQWtCLEdBQUcsVUFBQSxRQUFRLElBQUksT0FBQSxV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RixDQUFDLENBQUMsSUFBSSxDQUFBO1FBRVIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFlBQVksQ0FBQTtRQUM5QixPQUFPLFlBQVksQ0FBQTtJQUNyQixDQUFDO0NBQ0YsQ0FBQTtBQUVELElBQUk7SUFHRixTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUE7Q0FDdkM7QUFBQyxPQUFPLENBQUMsRUFBRSxHQUFFO0FBRWQsT0FBTyxFQUFZLElBQUksRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxDQUFBO0FBRXhGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUkvRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQTBDO0lBQ3JFLElBQUk7UUFDRixHQUFHLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUE7S0FDakM7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7S0FDaEI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ2xvdWRiYXNlLCBJQ2xvdWRiYXNlQ29uZmlnLCBJQ2xvdWRiYXNlUGxhdGZvcm1JbmZvIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcydcbmltcG9ydCB0eXBlIHsgSUNsb3VkYmFzZUNhY2hlIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9jYWNoZSdcbmltcG9ydCB0eXBlIHsgSUNsb3VkYmFzZVJlcXVlc3QgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL3JlcXVlc3QnXG5pbXBvcnQgdHlwZSB7IElDbG91ZGJhc2VBdXRoQ29uZmlnLCBJVXNlciwgSUxvZ2luU3RhdGUgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2F1dGgnXG5pbXBvcnQgdHlwZSB7IElDbG91ZGJhc2VDb21wb25lbnQgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2NvbXBvbmVudCdcbmltcG9ydCB0eXBlIHsgQXV0aE9wdGlvbnMsIENyZWRlbnRpYWxzIH0gZnJvbSAnQGNsb3VkYmFzZS9vYXV0aCdcbmltcG9ydCB7XG4gIENsb3VkYmFzZU9BdXRoLFxuICBBVVRIX0FQSV9QUkVGSVgsXG4gIExPR0lOX1NUQVRFX0NIQU5HRURfVFlQRSxcbiAgRVZFTlRTLFxuICBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRSxcbiAgT0FVVEhfVFlQRSxcbiAgd2VBcHBKd3REZWNvZGVBbGwsXG4gIEF1dGhFcnJvcixcbiAgQXV0aEVycm9yQ2F0ZWdvcnksXG4gIGF1dGhNb2RlbHMsXG4gIERFRkFVTFRfTk9ERV9BQ0NFU1NfU0NPUEUsXG59IGZyb20gJ0BjbG91ZGJhc2Uvb2F1dGgnXG5pbXBvcnQgeyB1c2VBdXRoQWRhcHRlciB9IGZyb20gJy4vYWRhcHRlcidcbmltcG9ydCB7XG4gIHByaW50V2FybixcbiAgdGhyb3dFcnJvcixcbiAgRVJST1JTLFxuICBDT01NVU5JVFlfU0lURV9VUkwsXG4gIGNhdGNoRXJyb3JzRGVjb3JhdG9yLFxuICBDbG91ZGJhc2VFdmVudEVtaXR0ZXIsXG4gIENsb3VkYmFzZUNhY2hlLFxuICBhZGFwdGVyRm9yV3hNcCxcbiAgdXNlRGVmYXVsdEFkYXB0ZXIsXG59IGZyb20gJy4vdXRpbGl0aWVzJ1xuaW1wb3J0IHsgc2F2ZVRvQnJvd3NlclNlc3Npb24sIGdldEJyb3dzZXJTZXNzaW9uLCByZW1vdmVCcm93c2VyU2Vzc2lvbiwgYWRkVXJsU2VhcmNoIH0gZnJvbSAnLi91dGlscydcbmltcG9ydCB7XG4gIEF1dGhWMUNvbXBhdCxcbiAgV2VpeGluQXV0aFByb3ZpZGVyLFxuICBDdXN0b21BdXRoUHJvdmlkZXIsXG4gIEFub255bW91c0F1dGhQcm92aWRlcixcbiAgYXBwbHlVc2VyVjFDb21wYXQsXG59IGZyb20gJy4vdjEtY29tcGF0J1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcbmltcG9ydCB7XG4gIENvbW1vblJlcyxcbiAgRGVsZXRlTWVSZXEsXG4gIEdldENsYWltc1JlcyxcbiAgR2V0VXNlcklkZW50aXRpZXNSZXMsXG4gIEdldFVzZXJSZXMsXG4gIExpbmtJZGVudGl0eVJlcSxcbiAgTGlua0lkZW50aXR5UmVzLFxuICBPbkF1dGhTdGF0ZUNoYW5nZUNhbGxiYWNrLFxuICBSZWF1dGhlbnRpY2F0ZVJlcyxcbiAgUmVzZW5kUmVxLFxuICBSZXNlbmRSZXMsXG4gIFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcyxcbiAgUmVzZXRQYXNzd29yZEZvck9sZFJlcSxcbiAgU2V0U2Vzc2lvblJlcSxcbiAgU2lnbkluQW5vbnltb3VzbHlSZXEsXG4gIFNpZ25Jbk9BdXRoUmVzLFxuICBTaWduSW5SZXMsXG4gIFNpZ25JbldpdGhJZFRva2VuUmVxLFxuICBTaWduSW5XaXRoT0F1dGhSZXEsXG4gIFNpZ25JbldpdGhPdHBSZXEsXG4gIFNpZ25JbldpdGhPdHBSZXMsXG4gIFNpZ25JbldpdGhQYXNzd29yZFJlcSxcbiAgU2lnblVwUmVzLFxuICBVbmxpbmtJZGVudGl0eVJlcSxcbiAgVXBkYXRlVXNlckF0dHJpYnV0ZXMsXG4gIFVwZGF0ZVVzZXJSZXEsXG4gIFVwZGF0ZVVzZXJXaXRoVmVyaWZpY2F0aW9uUmVzLFxuICBWZXJpZnlPQXV0aFJlcSxcbiAgVmVyaWZ5T0F1dGhSZXMsXG4gIFZlcmlmeU90cFJlcSxcbn0gZnJvbSAnLi90eXBlJ1xuXG5jb25zdCBpc0Jyb3dzZXIgPSAoKSA9PiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG5cbmV4cG9ydCB0eXBlIHtcbiAgU2lnbkluUmVzLFxuICBHZXRVc2VyUmVzLFxuICBDb21tb25SZXMsXG4gIFNpZ25JbldpdGhPdHBSZXMsXG4gIFNpZ25Jbk9BdXRoUmVzLFxuICBHZXRDbGFpbXNSZXMsXG4gIFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcyxcbiAgR2V0VXNlcklkZW50aXRpZXNSZXMsXG4gIExpbmtJZGVudGl0eVJlcyxcbiAgUmVhdXRoZW50aWNhdGVSZXMsXG4gIFJlc2VuZFJlcyxcbiAgVXBkYXRlVXNlcldpdGhWZXJpZmljYXRpb25SZXMsXG4gIE9uQXV0aFN0YXRlQ2hhbmdlQ2FsbGJhY2ssXG4gIFNpZ25JbldpdGhQYXNzd29yZFJlcSxcbiAgU2lnbkluV2l0aElkVG9rZW5SZXEsXG4gIFNpZ25JbldpdGhPQXV0aFJlcSxcbiAgVmVyaWZ5T0F1dGhSZXEsXG4gIFZlcmlmeU90cFJlcSxcbiAgTGlua0lkZW50aXR5UmVxLFxuICBVbmxpbmtJZGVudGl0eVJlcSxcbiAgVXBkYXRlVXNlclJlcSxcbiAgU2lnbkluV2l0aE90cFJlcSxcbiAgUmVzZXRQYXNzd29yZEZvck9sZFJlcSxcbiAgUmVzZW5kUmVxLFxuICBTZXRTZXNzaW9uUmVxLFxuICBEZWxldGVNZVJlcSxcbiAgU2lnblVwUmVzLFxufSBmcm9tICcuL3R5cGUnXG5cbmRlY2xhcmUgY29uc3QgY2xvdWRiYXNlOiBJQ2xvdWRiYXNlXG5kZWNsYXJlIGNvbnN0IHd4OiBhbnlcblxuY29uc3QgQ09NUE9ORU5UX05BTUUgPSAnYXV0aCdcblxuaW50ZXJmYWNlIFVzZXJJbmZvIHtcbiAgdWlkPzogc3RyaW5nXG4gIGdlbmRlcj86IHN0cmluZ1xuICBwaWN0dXJlPzogc3RyaW5nXG4gIGVtYWlsPzogc3RyaW5nXG4gIGVtYWlsX3ZlcmlmaWVkPzogYm9vbGVhblxuICBwaG9uZV9udW1iZXI/OiBzdHJpbmdcbiAgdXNlcm5hbWU/OiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZ1xuICBiaXJ0aGRhdGU/OiBzdHJpbmdcbiAgem9uZWluZm8/OiBzdHJpbmdcbiAgbG9jYWxlPzogc3RyaW5nXG4gIHN1Yj86IHN0cmluZ1xuICBjcmVhdGVkX2Zyb20/OiBzdHJpbmdcbn1cblxuY29uc3Qgb25DcmVkZW50aWFsc0Vycm9yID0gZXZlbnRCdXMgPT4gKHBhcmFtcykgPT4ge1xuICBldmVudEJ1cy5maXJlKEVWRU5UUy5MT0dJTl9TVEFURV9DSEFOR0VELCB7IC4uLnBhcmFtcywgZXZlbnRUeXBlOiBMT0dJTl9TVEFURV9DSEFOR0VEX1RZUEUuQ1JFREVOVElBTFNfRVJST1IgfSlcbn1cblxuaW50ZXJmYWNlIElVc2VyT3B0aW9ucyB7XG4gIGNhY2hlOiBJQ2xvdWRiYXNlQ2FjaGVcbiAgb2F1dGhJbnN0YW5jZTogQ2xvdWRiYXNlT0F1dGhcbn1cblxuZXhwb3J0IGNsYXNzIFVzZXIgaW1wbGVtZW50cyBJVXNlciB7XG4gIHB1YmxpYyB1aWQ/OiBzdHJpbmdcbiAgcHVibGljIGdlbmRlcj86IHN0cmluZ1xuICBwdWJsaWMgcGljdHVyZT86IHN0cmluZ1xuICBwdWJsaWMgZW1haWw/OiBzdHJpbmdcbiAgcHVibGljIGVtYWlsVmVyaWZpZWQ/OiBib29sZWFuXG4gIHB1YmxpYyBwaG9uZU51bWJlcj86IHN0cmluZ1xuICBwdWJsaWMgdXNlcm5hbWU/OiBzdHJpbmcgLy8g55So5oi35ZCN56ew77yM6ZW/5bqmIDUtMjQg5L2N77yM5pSv5oyB5a2X56ym5Lit6Iux5paH44CB5pWw5a2X44CB54m55q6K5a2X56ym77yI5LuF5pSv5oyBXy3vvInvvIzkuI3mlK/mjIHkuK3mlodcbiAgcHVibGljIG5hbWU/OiBzdHJpbmdcbiAgcHVibGljIHByb3ZpZGVycz86IHtcbiAgICBpZD86IHN0cmluZ1xuICAgIHByb3ZpZGVyVXNlcklkPzogc3RyaW5nXG4gICAgbmFtZT86IHN0cmluZ1xuICB9W11cbiAgcHVibGljIGJpcnRoZGF0ZT86IHN0cmluZ1xuICBwdWJsaWMgem9uZWluZm8/OiBzdHJpbmdcbiAgcHVibGljIGxvY2FsZT86IHN0cmluZ1xuICBwdWJsaWMgc3ViPzogc3RyaW5nXG4gIHB1YmxpYyBjcmVhdGVkRnJvbT86IHN0cmluZ1xuICBwdWJsaWMgb3Blbl9pZD86IHN0cmluZ1xuXG4gIHByaXZhdGUgY2FjaGU6IElDbG91ZGJhc2VDYWNoZVxuICBwcml2YXRlIG9hdXRoSW5zdGFuY2U6IENsb3VkYmFzZU9BdXRoIC8vIENsb3VkYmFzZU9BdXRoIOexu+Wei1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElVc2VyT3B0aW9ucykge1xuICAgIGNvbnN0IHsgY2FjaGUsIG9hdXRoSW5zdGFuY2UgfSA9IG9wdGlvbnNcbiAgICB0aGlzLmNhY2hlID0gY2FjaGVcbiAgICB0aGlzLm9hdXRoSW5zdGFuY2UgPSBvYXV0aEluc3RhbmNlXG5cbiAgICB0aGlzLnNldFVzZXJJbmZvKClcbiAgfVxuICAvKipcbiAgICog6I635Y+W5pys5Zyw55So5oi35L+h5oGvLeWQjOatpVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNoZWNrTG9jYWxJbmZvKCkge1xuICAgIHRoaXMudWlkID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCd1aWQnKSBhcyBzdHJpbmdcbiAgICB0aGlzLmdlbmRlciA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnZ2VuZGVyJykgYXMgc3RyaW5nXG4gICAgdGhpcy5waWN0dXJlID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdwaWN0dXJlJykgYXMgc3RyaW5nXG4gICAgdGhpcy5lbWFpbCA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnZW1haWwnKSBhcyBzdHJpbmdcbiAgICB0aGlzLmVtYWlsVmVyaWZpZWQgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2VtYWlsX3ZlcmlmaWVkJykgYXMgYm9vbGVhblxuICAgIHRoaXMucGhvbmVOdW1iZXIgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3Bob25lX251bWJlcicpIGFzIHN0cmluZ1xuICAgIHRoaXMudXNlcm5hbWUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3VzZXJuYW1lJykgYXMgc3RyaW5nXG4gICAgdGhpcy5uYW1lID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCduYW1lJykgYXMgc3RyaW5nXG4gICAgdGhpcy5iaXJ0aGRhdGUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2JpcnRoZGF0ZScpIGFzIHN0cmluZ1xuICAgIHRoaXMuem9uZWluZm8gPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3pvbmVpbmZvJykgYXMgc3RyaW5nXG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2xvY2FsZScpIGFzIHN0cmluZ1xuICAgIHRoaXMuc3ViID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdzdWInKSBhcyBzdHJpbmdcbiAgICB0aGlzLmNyZWF0ZWRGcm9tID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdjcmVhdGVkX2Zyb20nKSBhcyBzdHJpbmdcbiAgICB0aGlzLnByb3ZpZGVycyA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygncHJvdmlkZXJzJykgYXMgYW55XG4gIH1cbiAgLyoqXG4gICAqIOiOt+WPluacrOWcsOeUqOaIt+S/oeaBry3lvILmraVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGVja0xvY2FsSW5mb0FzeW5jKCkge1xuICAgIHRoaXMudWlkID0gYXdhaXQgdGhpcy5nZXRMb2NhbFVzZXJJbmZvQXN5bmMoJ3VpZCcpXG4gICAgdGhpcy5nZW5kZXIgPSBhd2FpdCB0aGlzLmdldExvY2FsVXNlckluZm9Bc3luYygnZ2VuZGVyJylcbiAgICB0aGlzLnBpY3R1cmUgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3BpY3R1cmUnKSBhcyBzdHJpbmdcbiAgICB0aGlzLmVtYWlsID0gYXdhaXQgdGhpcy5nZXRMb2NhbFVzZXJJbmZvQXN5bmMoJ2VtYWlsJylcbiAgICB0aGlzLmVtYWlsVmVyaWZpZWQgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ2VtYWlsX3ZlcmlmaWVkJykgYXMgYm9vbGVhblxuICAgIHRoaXMucGhvbmVOdW1iZXIgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3Bob25lX251bWJlcicpIGFzIHN0cmluZ1xuICAgIHRoaXMudXNlcm5hbWUgPSBhd2FpdCB0aGlzLmdldExvY2FsVXNlckluZm9Bc3luYygndXNlcm5hbWUnKVxuICAgIHRoaXMubmFtZSA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnbmFtZScpIGFzIHN0cmluZ1xuICAgIHRoaXMuYmlydGhkYXRlID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdiaXJ0aGRhdGUnKSBhcyBzdHJpbmdcbiAgICB0aGlzLnpvbmVpbmZvID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCd6b25laW5mbycpIGFzIHN0cmluZ1xuICAgIHRoaXMubG9jYWxlID0gdGhpcy5nZXRMb2NhbFVzZXJJbmZvKCdsb2NhbGUnKSBhcyBzdHJpbmdcbiAgICB0aGlzLnN1YiA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnc3ViJykgYXMgc3RyaW5nXG4gICAgdGhpcy5jcmVhdGVkRnJvbSA9IHRoaXMuZ2V0TG9jYWxVc2VySW5mbygnY3JlYXRlZF9mcm9tJykgYXMgc3RyaW5nXG4gICAgdGhpcy5wcm92aWRlcnMgPSB0aGlzLmdldExvY2FsVXNlckluZm8oJ3Byb3ZpZGVycycpIGFzIGFueVxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOeUqOaIt+S/oeaBr1xuICAgKiBAcGFyYW0gdXNlckluZm9cbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfmm7TmlrDnlKjmiLfkv6Hmga/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggVXNlci51cGRhdGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOeUqOaIt+S/oeaBr+S4reaYr+WQpuWMheWQq+mdnuazleWAvCcsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgdXBkYXRlKHVzZXJJbmZvOiBhdXRoTW9kZWxzLlVzZXJQcm9maWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gY29uc3QgeyBuYW1lLCBnZW5kZXIsIGF2YXRhclVybCwgcHJvdmluY2UsIGNvdW50cnksIGNpdHkgfSA9IHVzZXJJbmZvXG4gICAgY29uc3QgbmV3VXNlckluZm8gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zZXRVc2VyUHJvZmlsZSh7IC4uLnVzZXJJbmZvIH0pXG5cbiAgICB0aGlzLnNldExvY2FsVXNlckluZm8obmV3VXNlckluZm8pXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVXNlckJhc2ljSW5mbyhwYXJhbXM6IGF1dGhNb2RlbHMuTW9kaWZ5VXNlckJhc2ljSW5mb1JlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS51cGRhdGVVc2VyQmFzaWNJbmZvKHsgLi4ucGFyYW1zIH0pXG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKClcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrDlr4bnoIFcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkXG4gICAqIEBwYXJhbSBvbGRQYXNzd29yZFxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+abtOaWsOWvhueggeWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBVc2VyLnVwZGF0ZVBhc3N3b3JkKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDMgLSDmlrDlr4bnoIHkuK3mmK/lkKbljIXlkKvpnZ7ms5XlrZfnrKYnLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIHVwZGF0ZVBhc3N3b3JkKG5ld1Bhc3N3b3JkOiBzdHJpbmcsIG9sZFBhc3N3b3JkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudXBkYXRlUGFzc3dvcmRCeU9sZCh7XG4gICAgICBvbGRfcGFzc3dvcmQ6IG9sZFBhc3N3b3JkLFxuICAgICAgbmV3X3Bhc3N3b3JkOiBuZXdQYXNzd29yZCxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOeUqOaIt+WQjVxuICAgKiBAcGFyYW0gdXNlcm5hbWVcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfmm7TmlrDnlKjmiLflkI3lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggVXNlci51cGRhdGVVc2VybmFtZSgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN546v5aKD5piv5ZCm5byA6YCa5LqG55So5oi35ZCN5a+G56CB55m75b2VJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyB1cGRhdGVVc2VybmFtZSh1c2VybmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93RXJyb3IoRVJST1JTLklOVkFMSURfUEFSQU1TLCAndXNlcm5hbWUgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlKHtcbiAgICAgIHVzZXJuYW1lLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICog5Yi35paw5pys5Zyw55So5oi35L+h5oGv44CC5b2T55So5oi35Zyo5YW25LuW5a6i5oi356uv5pu05paw55So5oi35L+h5oGv5LmL5ZCO77yM5Y+v5Lul6LCD55So5q2k5o6l5Y+j5ZCM5q2l5pu05paw5LmL5ZCO55qE5L+h5oGv44CCXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn5Yi35paw5pys5Zyw55So5oi35L+h5oGv5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIFVzZXIucmVmcmVzaCgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgcmVmcmVzaChwYXJhbXM/OiB7IHZlcnNpb24/OiBzdHJpbmc7IHF1ZXJ5PzogYW55IH0pOiBQcm9taXNlPGF1dGhNb2RlbHMuVXNlckluZm8+IHtcbiAgICBjb25zdCBuZXdVc2VySW5mbyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFVzZXJJbmZvKHBhcmFtcylcbiAgICBpZiAoKG5ld1VzZXJJbmZvIGFzIGFueSkuY29kZSA9PT0gJ0lOVkFMSURfQUNDRVNTX1RPS0VOJykge1xuICAgICAgdGhpcy5zZXRMb2NhbFVzZXJJbmZvKHt9KVxuICAgICAgdGhyb3cgbmV3VXNlckluZm9cbiAgICB9XG4gICAgdGhpcy5zZXRMb2NhbFVzZXJJbmZvKG5ld1VzZXJJbmZvKVxuICAgIHJldHVybiBuZXdVc2VySW5mb1xuICB9XG5cbiAgcHVibGljIGdldExvY2FsVXNlckluZm8oa2V5Pzogc3RyaW5nKTogc3RyaW5nIHwgYm9vbGVhbiB8IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHsgdXNlckluZm9LZXkgfSA9IHRoaXMuY2FjaGUua2V5c1xuICAgIGNvbnN0IHVzZXJJbmZvID0gdGhpcy5jYWNoZS5nZXRTdG9yZSh1c2VySW5mb0tleSlcblxuICAgIGlmICgha2V5KSByZXR1cm4gdXNlckluZm8gfHwge31cblxuICAgIHJldHVybiB1c2VySW5mb1trZXldXG4gIH1cblxuICBwdWJsaWMgc2V0TG9jYWxVc2VySW5mbyh1c2VySW5mbzogYW55KSB7XG4gICAgY29uc3QgeyB1c2VySW5mb0tleSB9ID0gdGhpcy5jYWNoZS5rZXlzXG4gICAgdGhpcy5jYWNoZS5zZXRTdG9yZSh1c2VySW5mb0tleSwgdXNlckluZm8pXG4gICAgdGhpcy5zZXRVc2VySW5mbygpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldExvY2FsVXNlckluZm9Bc3luYyhrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyB1c2VySW5mb0tleSB9ID0gdGhpcy5jYWNoZS5rZXlzXG4gICAgY29uc3QgdXNlckluZm8gPSBhd2FpdCB0aGlzLmNhY2hlLmdldFN0b3JlQXN5bmModXNlckluZm9LZXkpXG4gICAgcmV0dXJuIHVzZXJJbmZvW2tleV1cbiAgfVxuXG4gIHByaXZhdGUgc2V0VXNlckluZm8oKSB7XG4gICAgY29uc3QgeyB1c2VySW5mb0tleSB9ID0gdGhpcy5jYWNoZS5rZXlzXG4gICAgY29uc3QgdXNlckluZm8gPSB0aGlzLmNhY2hlLmdldFN0b3JlKHVzZXJJbmZvS2V5KVxuICAgIDtbXG4gICAgICAndWlkJyxcbiAgICAgICdlbWFpbCcsXG4gICAgICAnbmFtZScsXG4gICAgICAnZ2VuZGVyJyxcbiAgICAgICdwaWN0dXJlJyxcbiAgICAgICdlbWFpbF92ZXJpZmllZCcsXG4gICAgICAncGhvbmVfbnVtYmVyJyxcbiAgICAgICdiaXJ0aGRhdGUnLFxuICAgICAgJ3pvbmVpbmZvJyxcbiAgICAgICdsb2NhbGUnLFxuICAgICAgJ3N1YicsXG4gICAgICAnY3JlYXRlZF9mcm9tJyxcbiAgICAgICdwcm92aWRlcnMnLFxuICAgICAgJ3VzZXJuYW1lJyxcbiAgICAgICdjcmVhdGVkX2F0JyxcbiAgICAgICdvcGVuX2lkJyxcbiAgICBdLmZvckVhY2goKGluZm9LZXkpID0+IHtcbiAgICAgIHRoaXNbaW5mb0tleV0gPSB1c2VySW5mb1tpbmZvS2V5XVxuICAgIH0pXG4gIH1cbn1cblxuLy8g5bqU55SoIHYxIOWFvOWuueaWueazleWIsCBVc2VyIOexu1xuYXBwbHlVc2VyVjFDb21wYXQoVXNlcilcblxuaW50ZXJmYWNlIElMb2dpblN0YXRlT3B0aW9ucyBleHRlbmRzIElVc2VyT3B0aW9ucyB7XG4gIGVudklkOiBzdHJpbmdcbn1cbmV4cG9ydCBjbGFzcyBMb2dpblN0YXRlIGltcGxlbWVudHMgSUxvZ2luU3RhdGUge1xuICBwdWJsaWMgdXNlcjogVXNlclxuICBwdWJsaWMgb2F1dGhMb2dpblN0YXRlOiBhbnlcblxuICBwcml2YXRlIG9hdXRoSW5zdGFuY2U6IENsb3VkYmFzZU9BdXRoXG4gIHByaXZhdGUgY2FjaGU6IElDbG91ZGJhc2VDYWNoZVxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElMb2dpblN0YXRlT3B0aW9ucykge1xuICAgIGNvbnN0IHsgZW52SWQsIGNhY2hlLCBvYXV0aEluc3RhbmNlIH0gPSBvcHRpb25zXG4gICAgaWYgKCFlbnZJZCkge1xuICAgICAgdGhyb3dFcnJvcihFUlJPUlMuSU5WQUxJRF9QQVJBTVMsICdlbnZJZCBpcyBub3QgZGVmaW5lZCcpXG4gICAgfVxuICAgIHRoaXMuY2FjaGUgPSBjYWNoZVxuICAgIHRoaXMub2F1dGhJbnN0YW5jZSA9IG9hdXRoSW5zdGFuY2VcblxuICAgIHRoaXMudXNlciA9IG5ldyBVc2VyKHtcbiAgICAgIGNhY2hlOiB0aGlzLmNhY2hlLFxuICAgICAgb2F1dGhJbnN0YW5jZSxcbiAgICB9KVxuICB9XG5cbiAgcHVibGljIGNoZWNrTG9jYWxTdGF0ZSgpIHtcbiAgICB0aGlzLm9hdXRoTG9naW5TdGF0ZSA9IHRoaXMub2F1dGhJbnN0YW5jZT8uYXV0aEFwaS5oYXNMb2dpblN0YXRlU3luYygpXG4gICAgdGhpcy51c2VyLmNoZWNrTG9jYWxJbmZvKClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjaGVja0xvY2FsU3RhdGVBc3luYygpIHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2U/LmF1dGhBcGkuZ2V0TG9naW5TdGF0ZSgpXG4gICAgYXdhaXQgdGhpcy51c2VyLmNoZWNrTG9jYWxJbmZvQXN5bmMoKVxuICB9XG59XG5cbmludGVyZmFjZSBJQXV0aENvbmZpZyBleHRlbmRzIElDbG91ZGJhc2VBdXRoQ29uZmlnIHtcbiAgY2FjaGU6IElDbG91ZGJhc2VDYWNoZVxuICByZXF1ZXN0PzogSUNsb3VkYmFzZVJlcXVlc3RcbiAgcnVudGltZT86IHN0cmluZ1xufVxuXG5jbGFzcyBBdXRoIGV4dGVuZHMgQXV0aFYxQ29tcGF0IHtcbiAgcmVhZG9ubHkgY29uZmlnOiBJQXV0aENvbmZpZ1xuICBvYXV0aEluc3RhbmNlOiBDbG91ZGJhc2VPQXV0aFxuICByZWFkb25seSBjYWNoZTogSUNsb3VkYmFzZUNhY2hlXG4gIHByaXZhdGUgbGlzdGVuZXJzOiBNYXA8c3RyaW5nLCBTZXQ8T25BdXRoU3RhdGVDaGFuZ2VDYWxsYmFjaz4+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgaGFzTGlzdGVuZXJTZXRVcCA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBJQXV0aENvbmZpZykge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZ1xuICAgIHRoaXMub2F1dGhJbnN0YW5jZSA9IGNvbmZpZy5vYXV0aEluc3RhbmNlXG4gICAgdGhpcy5jYWNoZSA9IGNvbmZpZy5jYWNoZVxuICAgIHRoaXMuaW5pdCgpXG4gICAgdGhpcy5zZXRBY2Nlc3NLZXkoKVxuICB9XG5cbiAgLy8gPT09PT09PT09PSBuZXcgYXV0aCBhcGkgbWV0aG9kcyBtZXJnZWQgYmVsb3cgPT09PT09PT09PVxuXG4gIC8qKlxuICAgKiDljL/lkI3nmbvlvZXjgILml6DpnIDnlKjmiLfms6jlhozljbPlj6/kvb/nlKjlupTnlKjlip/og73jgIJcbiAgICpcbiAgICogKirliY3nva7mnaHku7YqKu+8mumcgOimgeWcqOS6keW8gOWPkeaOp+WItuWPsOW8gOWQr+OAjOWMv+WQjeeZu+W9leOAjeOAglxuICAgKlxuICAgKiAqKumHjeimgSoq77ya5Yy/5ZCN55m75b2V5b+F6aG75Zyo5L2/55SoIHdhdGNoKCkg562J5a6e5pe25pWw5o2u5bqT5Yqf6IO95LmL5YmN5a6M5oiQ77yMXG4gICAqIOWQpuWImSBXZWJTb2NrZXQg6L+e5o6l5Lya5Zug57y65bCR6K6k6K+B5L+h5oGv6ICM5aSx6LSl44CCXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ25pbmFub255bW91c2x5XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgYXV0aC5zaWduSW5Bbm9ueW1vdXNseSgpO1xuICAgKiBpZiAoIWVycm9yKSB7XG4gICAqICAgY29uc29sZS5sb2coJ+eUqOaIt0lEOicsIGRhdGEudXNlci5pZCwgJ+aYr+WQpuWMv+WQjTonLCBkYXRhLnVzZXIuaXNfYW5vbnltb3VzKTtcbiAgICogICAvLyDnjrDlnKjlj6/ku6Xkvb/nlKggd2F0Y2goKSDnrYnlrp7ml7blip/og71cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyDlj6/pgInlj4LmlbBcbiAgICogQHJldHVybnMg55m75b2V57uT5p6c77yM5oiQ5Yqf5pe2IGRhdGEg5YyF5ZCrIHVzZXIg5ZKMIHNlc3Npb25cbiAgICovXG4gIGFzeW5jIHNpZ25JbkFub255bW91c2x5KHBhcmFtczogU2lnbkluQW5vbnltb3VzbHlSZXEpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5Bbm9ueW1vdXNseShwYXJhbXMpXG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAvLyBsb2dpblN0YXRl6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLihsb2dpblN0YXRlIGFzIGFueSksIGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgYXV0aEVycm9yID0gbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdzaWduSW5Bbm9ueW1vdXNseScgfSlcbiAgICAgIC8vIOWMv+WQjeeZu+W9leWksei0peaXtuaPkOS+m+aYjuehruaMh+W8lVxuICAgICAgaWYgKGF1dGhFcnJvci5jYXRlZ29yeSA9PT0gQXV0aEVycm9yQ2F0ZWdvcnkuUFJPVklERVJfTk9UX0VOQUJMRUQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihhdXRoRXJyb3IuaGVscE1lc3NhZ2UpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDbG91ZEJhc2UgQXV0aF0g5o+Q56S677ya5Yy/5ZCN55m75b2V6ZyA6KaB5Zyo5o6n5Yi25Y+w5byA5ZCv44CM5Yy/5ZCN55m75b2V44CN44CCXFxuJ1xuICAgICAgICAgICsgJyAg5aaC5p6c5oKo6ZyA6KaB5L2/55So55So5oi35ZCN5a+G56CB55m75b2V77yM6K+35pS555SoIGF1dGguc2lnbkluV2l0aFBhc3N3b3JkKHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0p44CCXFxuJ1xuICAgICAgICAgICsgJyAg5LiN6KaB5Zyo5Yy/5ZCN55m75b2V5aSx6LSl5ZCO6Ieq5Yqo5Zue6YCA5Yiw5a+G56CB55m75b2V77yM6L+Z5Lik56eN5pa55byP55qE5L2/55So5Zy65pmv5LiN5ZCM44CCJywpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtDbG91ZEJhc2UgQXV0aF0gc2lnbkluQW5vbnltb3VzbHkg5aSx6LSlIFske2F1dGhFcnJvci5jYXRlZ29yeX1dOiAke2F1dGhFcnJvci5tZXNzYWdlfWApXG4gICAgICAgIGlmIChhdXRoRXJyb3IubG9naW5NZXRob2RIaW50KSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGF1dGhFcnJvci5sb2dpbk1ldGhvZEhpbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogYXV0aEVycm9yIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ251cFxuICAgKiBTaWduIHVwIGEgbmV3IHVzZXIgd2l0aCBlbWFpbCBvciBwaG9uZSB1c2luZyBhIG9uZS10aW1lIHBhc3N3b3JkIChPVFApLiBJZiB0aGUgYWNjb3VudCBub3QgZXhpc3QsIGEgbmV3IGFjY291bnQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnblVwUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnblVwKHBhcmFtczogYXV0aE1vZGVscy5TaWduVXBSZXF1ZXN0ICYgeyBwaG9uZT86IHN0cmluZyB9KTogUHJvbWlzZTxTaWduVXBSZXM+IHtcbiAgICBpZiAocGFyYW1zLnBob25lX251bWJlciB8fCBwYXJhbXMudmVyaWZpY2F0aW9uX2NvZGUgfHwgcGFyYW1zLnZlcmlmaWNhdGlvbl90b2tlbiB8fCBwYXJhbXMucHJvdmlkZXJfdG9rZW4pIHtcbiAgICAgIGlmIChwYXJhbXMucGhvbmVfbnVtYmVyKSB7XG4gICAgICAgIHBhcmFtcy5waG9uZV9udW1iZXIgPSB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZV9udW1iZXIpXG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduVXAocGFyYW1zKVxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpIGFzIGFueVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yaZW1haWzmiJZwaG9uZeW/heWhq+WFtuS4gFxuICAgICAgdGhpcy52YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zLCBbWydlbWFpbCddLCBbJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbihwYXJhbXMuZW1haWwgPyB7IGVtYWlsOiBwYXJhbXMuZW1haWwgfSA6IHsgcGhvbmVfbnVtYmVyOiB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSkgfSwpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB2ZXJpZnlPdHA6IGFzeW5jICh7IHRva2VuLCBtZXNzYWdlSWQgPSB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCB9KTogUHJvbWlzZTxTaWduSW5SZXM+ID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIOesrOS4ieatpe+8muW+heeUqOaIt+i+k+WFpeWujOmqjOivgeeggeS5i+WQju+8jOmqjOivgeefreS/oemqjOivgeeggVxuICAgICAgICAgICAgICBjb25zdCB2ZXJpZmljYXRpb25Ub2tlblJlcyA9IGF3YWl0IHRoaXMudmVyaWZ5KHtcbiAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25faWQ6IG1lc3NhZ2VJZCB8fCB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fY29kZTogdG9rZW4sXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgLy8g56ys5Zub5q2l77ya5rOo5YaM5bm255m75b2V5oiW55u05o6l55m75b2VXG4gICAgICAgICAgICAgIC8vIOWmguaenOeUqOaIt+W3sue7j+WtmOWcqO+8jOebtOaOpeeZu+W9lVxuICAgICAgICAgICAgICBpZiAodmVyaWZpY2F0aW9uSW5mby5pc191c2VyKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zaWduSW4oe1xuICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6IHBhcmFtcy5lbWFpbCB8fCB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSksXG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fdG9rZW46IHZlcmlmaWNhdGlvblRva2VuUmVzLnZlcmlmaWNhdGlvbl90b2tlbixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIOWmguaenOeUqOaIt+S4jeWtmOWcqO+8jOazqOWGjOeUqOaIt1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBhcmFtcykpXG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGEuZW1haWxcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YS5waG9uZVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnblVwKHtcbiAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAuLi4ocGFyYW1zLmVtYWlsID8geyBlbWFpbDogcGFyYW1zLmVtYWlsIH0gOiB7IHBob25lX251bWJlcjogdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIH0pLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuOiB2ZXJpZmljYXRpb25Ub2tlblJlcy52ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fY29kZTogdG9rZW4sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdzaWduVXAnIH0pIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ3NpZ25VcCcgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbm91dFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhdXRoLnNpZ25PdXQoKTtcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgc2lnbk91dChwYXJhbXM/OiBhdXRoTW9kZWxzLlNpZ25vdXRSZXF1ZXN0LCk6IFByb21pc2U8YXV0aE1vZGVscy5TaWdub3V0UmVzcG9uc2UgJiB7IGRhdGE6IE9iamVjdDsgZXJyb3I6IEF1dGhFcnJvciB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlckluZm9LZXkgfSA9IHRoaXMuY2FjaGUua2V5c1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbk91dChwYXJhbXMpXG4gICAgICBhd2FpdCB0aGlzLmNhY2hlLnJlbW92ZVN0b3JlQXN5bmModXNlckluZm9LZXkpXG4gICAgICB0aGlzLnNldEFjY2Vzc0tleSgpXG5cbiAgICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5MT0dJTl9TVEFURV9DSEFOR0VELCB7IGV2ZW50VHlwZTogTE9HSU5fU1RBVEVfQ0hBTkdFRF9UWVBFLlNJR05fT1VUIH0pXG5cbiAgICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLlNJR05FRF9PVVQgfSlcblxuICAgICAgLy8gcmVz6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLnJlcywgZGF0YToge30sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ3NpZ25PdXQnIH0pIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLW9uYXV0aHN0YXRlY2hhbmdlXG4gICAqIFJlY2VpdmUgYSBub3RpZmljYXRpb24gZXZlcnkgdGltZSBhbiBhdXRoIGV2ZW50IGhhcHBlbnMuXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyBQcm9taXNlPHsgZGF0YTogeyBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB9LCBlcnJvcjogRXJyb3IgfCBudWxsIH0+XG4gICAqL1xuICBvbkF1dGhTdGF0ZUNoYW5nZShjYWxsYmFjazogT25BdXRoU3RhdGVDaGFuZ2VDYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5oYXNMaXN0ZW5lclNldFVwKSB7XG4gICAgICB0aGlzLnNldHVwTGlzdGVuZXJzKClcbiAgICAgIHRoaXMuaGFzTGlzdGVuZXJTZXRVcCA9IHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpXG5cbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLnNldChpZCwgbmV3IFNldCgpKVxuICAgIH1cblxuICAgIHRoaXMubGlzdGVuZXJzLmdldChpZCkhLmFkZChjYWxsYmFjaylcblxuICAgIC8vIOi/lOWbniBTdWJzY3JpcHRpb24g5a+56LGhXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0ge1xuICAgICAgaWQsXG4gICAgICBjYWxsYmFjayxcbiAgICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMubGlzdGVuZXJzLmdldChpZClcbiAgICAgICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgICAgIGNhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spXG4gICAgICAgICAgaWYgKGNhbGxiYWNrcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5kZWxldGUoaWQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiB7IHN1YnNjcmlwdGlvbiB9LFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmlud2l0aHBhc3N3b3JkXG4gICAqIExvZyBpbiBhbiBleGlzdGluZyB1c2VyIHdpdGggYW4gZW1haWwgYW5kIHBhc3N3b3JkIG9yIHBob25lIGFuZCBwYXNzd29yZCBvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoUGFzc3dvcmQocGFyYW1zOiBTaWduSW5XaXRoUGFzc3dvcmRSZXEpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJp1c2VybmFtZS9lbWFpbC9waG9uZeS4iemAieS4gO+8jHBhc3N3b3Jk5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlQXRMZWFzdE9uZShcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBbWyd1c2VybmFtZSddLCBbJ2VtYWlsJ10sIFsncGhvbmUnXV0sXG4gICAgICAgICdZb3UgbXVzdCBwcm92aWRlIGVpdGhlciB1c2VybmFtZSwgZW1haWwsIG9yIHBob25lJyxcbiAgICAgIClcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHBhc3N3b3JkOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLnNpZ25Jbih7XG4gICAgICAgIHVzZXJuYW1lOiBwYXJhbXMudXNlcm5hbWUgfHwgcGFyYW1zLmVtYWlsIHx8IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzd29yZCxcbiAgICAgICAgLi4uKHBhcmFtcy5pc19lbmNyeXB0ID8geyBpc0VuY3J5cHQ6IHRydWUsIHZlcnNpb246ICd2MicgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgYXV0aEVycm9yID0gbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdzaWduSW5XaXRoUGFzc3dvcmQnIH0pXG4gICAgICAvLyDmoLnmja7plJnor6/liIbnsbvovpPlh7rlr7nlupTnmoTlj6/mk43kvZzmgKfmjIflvJVcbiAgICAgIGlmIChhdXRoRXJyb3IuY2F0ZWdvcnkgPT09IEF1dGhFcnJvckNhdGVnb3J5LlBST1ZJREVSX05PVF9FTkFCTEVEKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYXV0aEVycm9yLmhlbHBNZXNzYWdlKVxuICAgICAgfSBlbHNlIGlmIChhdXRoRXJyb3IuY2F0ZWdvcnkgPT09IEF1dGhFcnJvckNhdGVnb3J5LklOVkFMSURfQ1JFREVOVElBTFMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGF1dGhFcnJvci5oZWxwTWVzc2FnZSlcbiAgICAgIH0gZWxzZSBpZiAoYXV0aEVycm9yLmNhdGVnb3J5ID09PSBBdXRoRXJyb3JDYXRlZ29yeS5VU0VSX05PVF9GT1VORCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYXV0aEVycm9yLmhlbHBNZXNzYWdlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbQ2xvdWRCYXNlIEF1dGhdIHNpZ25JbldpdGhQYXNzd29yZCDlpLHotKUgWyR7YXV0aEVycm9yLmNhdGVnb3J5fV06ICR7YXV0aEVycm9yLm1lc3NhZ2V9YClcbiAgICAgIH1cbiAgICAgIGlmIChhdXRoRXJyb3IubG9naW5NZXRob2RIaW50KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhhdXRoRXJyb3IubG9naW5NZXRob2RIaW50KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBhdXRoRXJyb3IgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmlud2l0aGlkdG9rZW5cbiAgICog56ys5LiJ5pa55bmz5Y+w55m75b2V44CC5aaC5p6c55So5oi35LiN5a2Y5Zyo77yM5Lya5qC55o2u5LqR5byA5Y+R5bmz5Y+wLeeZu+W9leaWueW8j+S4reWvueW6lOi6q+S7vea6kOeahOeZu+W9leaooeW8j+mFjee9ru+8jOWIpOaWreaYr+WQpuiHquWKqOazqOWGjFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aElkVG9rZW4ocGFyYW1zOiBTaWduSW5XaXRoSWRUb2tlblJlcSk6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mnRva2Vu5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICB0b2tlbjogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Rva2VuIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5zaWduSW5XaXRoUHJvdmlkZXIoe1xuICAgICAgICBwcm92aWRlcl90b2tlbjogcGFyYW1zLnRva2VuLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAnc2lnbkluV2l0aElkVG9rZW4nIH0pIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ25pbndpdGhvdHBcbiAgICogTG9nIGluIGEgdXNlciB1c2luZyBhIG9uZS10aW1lIHBhc3N3b3JkIChPVFApLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluV2l0aE90cFJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25JbldpdGhPdHAocGFyYW1zOiBTaWduSW5XaXRoT3RwUmVxKTogUHJvbWlzZTxTaWduSW5XaXRoT3RwUmVzPiB7XG4gICAgaWYgKCFwYXJhbXMub3B0aW9ucz8uZW1haWxSZWRpcmVjdFRvICYmIChwYXJhbXMub3B0aW9ucz8uc2hvdWxkQ3JlYXRlVXNlciA9PT0gdW5kZWZpbmVkIHx8ICEhcGFyYW1zLm9wdGlvbnM/LnNob3VsZENyZWF0ZVVzZXIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVXAoe1xuICAgICAgICBlbWFpbDogcGFyYW1zLmVtYWlsLFxuICAgICAgICBwaG9uZTogcGFyYW1zLnBob25lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yaZW1haWzmiJZwaG9uZeW/heWhq+WFtuS4gFxuICAgICAgdGhpcy52YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zLCBbWydlbWFpbCddLCBbJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih7XG4gICAgICAgIGVtYWlsX3JlZGlyZWN0X3RvOiBwYXJhbXMub3B0aW9ucz8uZW1haWxSZWRpcmVjdFRvLFxuICAgICAgICAuLi4ocGFyYW1zLmVtYWlsID8geyBlbWFpbDogcGFyYW1zLmVtYWlsIH0gOiB7IHBob25lX251bWJlcjogdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIH0pLFxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHVzZXI6IG51bGwsXG4gICAgICAgICAgc2Vzc2lvbjogbnVsbCxcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB2ZXJpZnlPdHA6IGFzeW5jICh7IHRva2VuLCBtZXNzYWdlSWQgPSB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCB9KTogUHJvbWlzZTxTaWduSW5SZXM+ID0+IHRoaXMudmVyaWZ5T3RwKHtcbiAgICAgICAgICAgIGVtYWlsOiBwYXJhbXMuZW1haWwsXG4gICAgICAgICAgICBwaG9uZTogcGFyYW1zLnBob25lLFxuICAgICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAnc2lnbkluV2l0aE90cCcgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoKHpqoznrKzkuInmlrnlubPlj7DmjojmnYPnmbvlvZXlm57osINcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHZlcmlmeU9BdXRoKHBhcmFtcz86IFZlcmlmeU9BdXRoUmVxKTogUHJvbWlzZTxWZXJpZnlPQXV0aFJlcz4ge1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWbnuiwg+iHsyBwcm92aWRlcl9yZWRpcmVjdF91cmkg5Zyw5Z2A77yIdXJsIHF1ZXJ55Lit5pC65bimIOaOiOadg2NvZGXvvIxzdGF0ZeetieWPguaVsO+8ie+8jOatpOaXtuajgOafpSBzdGF0ZSDmmK/lkKbnrKblkIjpooTmnJ/vvIjlpoIg6Ieq5bex6K6+572u55qEIHd4X29wZW4pXG4gICAgICBjb25zdCBjb2RlID0gcGFyYW1zPy5jb2RlIHx8IHV0aWxzLmdldFF1ZXJ5KCdjb2RlJylcbiAgICAgIGNvbnN0IHN0YXRlID0gcGFyYW1zPy5zdGF0ZSB8fCB1dGlscy5nZXRRdWVyeSgnc3RhdGUnKVxuXG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpjb2Rl5ZKMc3RhdGXlv4XloatcbiAgICAgIGlmICghY29kZSkge1xuICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlOiAnQ29kZSBpcyByZXF1aXJlZCcgfSkgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2U6ICdTdGF0ZSBpcyByZXF1aXJlZCcgfSkgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjYWNoZURhdGEgPSBnZXRCcm93c2VyU2Vzc2lvbihzdGF0ZSlcbiAgICAgIGRhdGEudHlwZSA9IGNhY2hlRGF0YT8udHlwZVxuXG4gICAgICBjb25zdCBwcm92aWRlciA9IHBhcmFtcz8ucHJvdmlkZXIgfHwgY2FjaGVEYXRhPy5wcm92aWRlciB8fCB1dGlscy5nZXRRdWVyeSgncHJvdmlkZXInKVxuXG4gICAgICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGEsIGVycm9yOiBuZXcgQXV0aEVycm9yKHsgbWVzc2FnZTogJ1Byb3ZpZGVyIGlzIHJlcXVpcmVkJyB9KSB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0YXRl56ym5ZCI6aKE5pyf77yM5YiZ6I635Y+W6K+l5LiJ5pa55bmz5Y+wdG9rZW5cbiAgICAgIGNvbnN0IHsgcHJvdmlkZXJfdG9rZW46IHRva2VuIH0gPSBhd2FpdCB0aGlzLmdyYW50UHJvdmlkZXJUb2tlbih7XG4gICAgICAgIHByb3ZpZGVyX2lkOiBwcm92aWRlcixcbiAgICAgICAgcHJvdmlkZXJfcmVkaXJlY3RfdXJpOiBsb2NhdGlvbi5vcmlnaW4gKyBsb2NhdGlvbi5wYXRobmFtZSwgLy8g5oyH5a6a5LiJ5pa55bmz5Y+w6Lez5Zue55qEIHVybCDlnLDlnYBcbiAgICAgICAgcHJvdmlkZXJfY29kZTogY29kZSwgLy8g56ys5LiJ5pa55bmz5Y+w6Lez6L2s5Zue6aG16Z2i5pe277yMdXJsIHBhcmFtIOS4reaQuuW4pueahCBjb2RlIOWPguaVsFxuICAgICAgfSlcblxuICAgICAgbGV0IHJlczogVmVyaWZ5T0F1dGhSZXNcblxuICAgICAgaWYgKGNhY2hlRGF0YS50eXBlID09PSBPQVVUSF9UWVBFLkJJTkRfSURFTlRJVFkpIHtcbiAgICAgICAgcmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudG9CaW5kSWRlbnRpdHkoeyBwcm92aWRlcl90b2tlbjogdG9rZW4sIHByb3ZpZGVyLCBmaXJlRXZlbnQ6IHRydWUgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOmAmui/hyBwcm92aWRlcl90b2tlbiDku4XnmbvlvZXmiJbnmbvlvZXlubbms6jlhozvvIjkuI7kupHlvIDlj5HlubPlj7At55m75b2V5pa55byPLei6q+S7vea6kOeZu+W9leaooeW8j+mFjee9ruacieWFs++8iVxuICAgICAgICByZXMgPSBhd2FpdCB0aGlzLnNpZ25JbldpdGhJZFRva2VuKHtcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgfSlcbiAgICAgICAgcmVzLmRhdGEgPSB7IC4uLmRhdGEsIC4uLnJlcy5kYXRhIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9jYWxTZWFyY2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uPy5zZWFyY2gpXG4gICAgICBsb2NhbFNlYXJjaC5kZWxldGUoJ2NvZGUnKVxuICAgICAgbG9jYWxTZWFyY2guZGVsZXRlKCdzdGF0ZScpXG4gICAgICByZXMuZGF0YS5yZWRpcmVjdFVybCA9IGFkZFVybFNlYXJjaChcbiAgICAgICAgY2FjaGVEYXRhPy5zZWFyY2ggPT09IHVuZGVmaW5lZCA/IGA/JHtsb2NhbFNlYXJjaC50b1N0cmluZygpfWAgOiBjYWNoZURhdGE/LnNlYXJjaCxcbiAgICAgICAgY2FjaGVEYXRhPy5oYXNoIHx8IGxvY2F0aW9uLmhhc2gsXG4gICAgICApXG4gICAgICByZW1vdmVCcm93c2VyU2Vzc2lvbihzdGF0ZSlcblxuICAgICAgcmV0dXJuIHJlc1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhLCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICd2ZXJpZnlPQXV0aCcgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmlud2l0aG9hdXRoXG4gICAqIOeUn+aIkOesrOS4ieaWueW5s+WPsOaOiOadgyBVcmkg77yI5aaC5b6u5L+h5LqM57u056CB5omr56CB5o6I5p2D572R6aG177yJXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5PQXV0aFJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25JbldpdGhPQXV0aChwYXJhbXM6IFNpZ25JbldpdGhPQXV0aFJlcSk6IFByb21pc2U8U2lnbkluT0F1dGhSZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yacHJvdmlkZXLlv4XloatcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHByb3ZpZGVyOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUHJvdmlkZXIgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBocmVmID0gcGFyYW1zLm9wdGlvbnM/LnJlZGlyZWN0VG8gfHwgbG9jYXRpb24uaHJlZlxuXG4gICAgICBjb25zdCB1cmxPYmplY3QgPSBuZXcgVVJMKGhyZWYpXG5cbiAgICAgIGNvbnN0IHByb3ZpZGVyX3JlZGlyZWN0X3VyaSA9IHVybE9iamVjdC5vcmlnaW4gKyB1cmxPYmplY3QucGF0aG5hbWVcblxuICAgICAgY29uc3Qgc3RhdGUgPSBwYXJhbXMub3B0aW9ucz8uc3RhdGUgfHwgYHByZC0ke3BhcmFtcy5wcm92aWRlcn0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KVxuICAgICAgICAuc2xpY2UoMil9YFxuXG4gICAgICBjb25zdCB7IHVyaSB9ID0gYXdhaXQgdGhpcy5nZW5Qcm92aWRlclJlZGlyZWN0VXJpKHtcbiAgICAgICAgcHJvdmlkZXJfaWQ6IHBhcmFtcy5wcm92aWRlcixcbiAgICAgICAgcHJvdmlkZXJfcmVkaXJlY3RfdXJpLFxuICAgICAgICBzdGF0ZSxcbiAgICAgIH0pXG5cbiAgICAgIC8vIOWvuSBVUkwg6L+b6KGM6Kej56CBXG4gICAgICBjb25zdCBkZWNvZGVkVXJpID0gZGVjb2RlVVJJQ29tcG9uZW50KHVyaSlcblxuICAgICAgLy8g5ZCI5bm26aKd5aSW55qE5p+l6K+i5Y+C5pWwXG4gICAgICBsZXQgZmluYWxVcmkgPSBkZWNvZGVkVXJpXG5cbiAgICAgIGlmIChwYXJhbXMub3B0aW9ucz8ucXVlcnlQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChkZWNvZGVkVXJpKVxuICAgICAgICBPYmplY3QuZW50cmllcyhwYXJhbXMub3B0aW9ucy5xdWVyeVBhcmFtcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICAgICAgZmluYWxVcmkgPSB1cmwudG9TdHJpbmcoKVxuICAgICAgfVxuXG4gICAgICBzYXZlVG9Ccm93c2VyU2Vzc2lvbihzdGF0ZSwge1xuICAgICAgICBwcm92aWRlcjogcGFyYW1zLnByb3ZpZGVyLFxuICAgICAgICBzZWFyY2g6IHVybE9iamVjdC5zZWFyY2gsXG4gICAgICAgIGhhc2g6IHVybE9iamVjdC5oYXNoLFxuICAgICAgICB0eXBlOiBwYXJhbXMub3B0aW9ucz8udHlwZSB8fCBPQVVUSF9UWVBFLlNJR05fSU4sXG4gICAgICB9KVxuXG4gICAgICBpZiAoaXNCcm93c2VyKCkgJiYgIXBhcmFtcy5vcHRpb25zPy5za2lwQnJvd3NlclJlZGlyZWN0KSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZmluYWxVcmkpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXJsOiBmaW5hbFVyaSwgcHJvdmlkZXI6IHBhcmFtcy5wcm92aWRlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdzaWduSW5XaXRoT0F1dGgnIH0pIH1cbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtZ2V0Y2xhaW1zXG4gIGFzeW5jIGdldENsYWltcygpOiBQcm9taXNlPEdldENsYWltc1Jlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFjY2Vzc1Rva2VuIH0gPSBhd2FpdCB0aGlzLmdldEFjY2Vzc1Rva2VuKClcbiAgICAgIGNvbnN0IHBhcnNlZFRva2VuID0gd2VBcHBKd3REZWNvZGVBbGwoYWNjZXNzVG9rZW4pXG4gICAgICByZXR1cm4geyBkYXRhOiBwYXJzZWRUb2tlbiwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAnZ2V0Q2xhaW1zJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1yZXNldHBhc3N3b3JkZm9yZW1haWxcbiAgICog6YCa6L+HIGVtYWlsIOaIluaJi+acuuWPt+mHjee9ruWvhueggVxuICAgKiBAcGFyYW0gZW1haWxPclBob25lIOmCrueuseaIluaJi+acuuWPt1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcz5cbiAgICovXG4gIGFzeW5jIHJlc2V0UGFzc3dvcmRGb3JFbWFpbChcbiAgICBlbWFpbE9yUGhvbmU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyByZWRpcmVjdFRvPzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8UmVzZXRQYXNzd29yZEZvckVtYWlsUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mmVtYWlsT3JQaG9uZeW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhcbiAgICAgICAgeyBlbWFpbE9yUGhvbmUgfSxcbiAgICAgICAge1xuICAgICAgICAgIGVtYWlsT3JQaG9uZTogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ0VtYWlsIG9yIHBob25lIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICBjb25zdCB7IHJlZGlyZWN0VG8gfSA9IG9wdGlvbnMgfHwge31cblxuICAgICAgLy8g5Yik5pat5piv6YKu566x6L+Y5piv5omL5py65Y+3XG4gICAgICBjb25zdCBpc0VtYWlsID0gZW1haWxPclBob25lLmluY2x1ZGVzKCdAJylcbiAgICAgIGxldCB2ZXJpZmljYXRpb25QYXJhbXM6IHsgZW1haWw/OiBzdHJpbmc7IHBob25lX251bWJlcj86IHN0cmluZyB9XG5cbiAgICAgIGlmIChpc0VtYWlsKSB7XG4gICAgICAgIHZlcmlmaWNhdGlvblBhcmFtcyA9IHsgZW1haWw6IGVtYWlsT3JQaG9uZSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDmraPop4TljJbmiYvmnLrlj7dcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkUGhvbmUgPSB0aGlzLmZvcm1hdFBob25lKGVtYWlsT3JQaG9uZSlcbiAgICAgICAgdmVyaWZpY2F0aW9uUGFyYW1zID0geyBwaG9uZV9udW1iZXI6IGZvcm1hdHRlZFBob25lIH1cbiAgICAgIH1cblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih2ZXJpZmljYXRpb25QYXJhbXMpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB1cGRhdGVVc2VyOiBhc3luYyAoYXR0cmlidXRlczogVXBkYXRlVXNlckF0dHJpYnV0ZXMpOiBQcm9taXNlPFNpZ25JblJlcz4gPT4ge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICAgIG5vbmNlOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnTm9uY2UgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICAgIHBhc3N3b3JkOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8g56ys5LiJ5q2l77ya5b6F55So5oi36L6T5YWl5a6M6aqM6K+B56CB5LmL5ZCO77yM6aqM6K+B6aqM6K+B56CBXG4gICAgICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblRva2VuUmVzID0gYXdhaXQgdGhpcy52ZXJpZnkoe1xuICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9pZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IGF0dHJpYnV0ZXMubm9uY2UsXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucmVzZXRQYXNzd29yZCh7XG4gICAgICAgICAgICAgICAgZW1haWw6IGlzRW1haWwgPyBlbWFpbE9yUGhvbmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcGhvbmVfbnVtYmVyOiAhaXNFbWFpbCA/IGVtYWlsT3JQaG9uZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBuZXdfcGFzc3dvcmQ6IGF0dHJpYnV0ZXMucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuOiB2ZXJpZmljYXRpb25Ub2tlblJlcy52ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXZlbnRCdXM/LmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwge1xuICAgICAgICAgICAgICAgIGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5QQVNTV09SRF9SRUNPVkVSWSxcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNpZ25JbldpdGhQYXNzd29yZCh7XG4gICAgICAgICAgICAgICAgZW1haWw6IGlzRW1haWwgPyBlbWFpbE9yUGhvbmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcGhvbmU6ICFpc0VtYWlsID8gZW1haWxPclBob25lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBhdHRyaWJ1dGVzLnBhc3N3b3JkLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIGlmIChyZWRpcmVjdFRvICYmIGlzQnJvd3NlcigpKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihyZWRpcmVjdFRvKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ3Jlc2V0UGFzc3dvcmRGb3JFbWFpbCcgfSkgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAncmVzZXRQYXNzd29yZEZvckVtYWlsJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/h+aXp+WvhueggemHjee9ruWvhueggVxuICAgKiBAcGFyYW0gbmV3X3Bhc3N3b3JkXG4gICAqIEBwYXJhbSBvbGRfcGFzc3dvcmRcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHJlc2V0UGFzc3dvcmRGb3JPbGQocGFyYW1zOiBSZXNldFBhc3N3b3JkRm9yT2xkUmVxKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnVwZGF0ZVBhc3N3b3JkQnlPbGQoe1xuICAgICAgICBvbGRfcGFzc3dvcmQ6IHBhcmFtcy5vbGRfcGFzc3dvcmQsXG4gICAgICAgIG5ld19wYXNzd29yZDogcGFyYW1zLm5ld19wYXNzd29yZCxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAncmVzZXRQYXNzd29yZEZvck9sZCcgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtdmVyaWZ5b3RwXG4gICAqIExvZyBpbiBhIHVzZXIgZ2l2ZW4gYSBVc2VyIHN1cHBsaWVkIE9UUCBhbmQgdmVyaWZpY2F0aW9uSWQgcmVjZWl2ZWQgdGhyb3VnaCBtb2JpbGUgb3IgZW1haWwuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyB2ZXJpZnlPdHAocGFyYW1zOiBWZXJpZnlPdHBSZXEpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHR5cGUgfSA9IHBhcmFtc1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yadG9rZW7lkox2ZXJpZmljYXRpb25JbmZv5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICB0b2tlbjogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Rva2VuIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgICBtZXNzYWdlSWQ6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdtZXNzYWdlSWQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBpZiAoWydwaG9uZV9jaGFuZ2UnLCAnZW1haWxfY2hhbmdlJ10uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy52ZXJpZnkoe1xuICAgICAgICAgIHZlcmlmaWNhdGlvbl9pZDogcGFyYW1zLm1lc3NhZ2VJZCxcbiAgICAgICAgICB2ZXJpZmljYXRpb25fY29kZTogcGFyYW1zLnRva2VuLFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgICAgICAgIHZlcmlmaWNhdGlvbkluZm86IHsgdmVyaWZpY2F0aW9uX2lkOiBwYXJhbXMubWVzc2FnZUlkLCBpc191c2VyOiB0cnVlIH0sXG4gICAgICAgICAgdmVyaWZpY2F0aW9uQ29kZTogcGFyYW1zLnRva2VuLFxuICAgICAgICAgIHVzZXJuYW1lOiBwYXJhbXMuZW1haWwgfHwgdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIHx8ICcnLFxuICAgICAgICAgIGxvZ2luVHlwZTogcGFyYW1zLmVtYWlsID8gJ2VtYWlsJyA6ICdwaG9uZScsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAndmVyaWZ5T3RwJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1nZXRTZXNzaW9uXG4gICAqIFJldHVybnMgdGhlIHNlc3Npb24sIHJlZnJlc2hpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIGdldFNlc3Npb24oKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5nZXRDcmVkZW50aWFscygpXG5cbiAgICAgIGlmICghY3JlZGVudGlhbHMgfHwgY3JlZGVudGlhbHMuc2NvcGUgPT09ICdhY2Nlc3NLZXknKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHsgc2Vzc2lvbjogbnVsbCB9LCBlcnJvcjogbnVsbCB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyB1c2VyIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRVc2VyKGZhbHNlKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHNlc3Npb246IHsgLi4uY3JlZGVudGlhbHMsIHVzZXIgfSwgdXNlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdnZXRTZXNzaW9uJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1yZWZyZXNoc2Vzc2lvblxuICAgKiDml6Dorrrov4fmnJ/nirbmgIHlpoLkvZXvvIzpg73ov5Tlm57kuIDkuKrmlrDnmoTkvJror51cbiAgICogQHBhcmFtIHJlZnJlc2hfdG9rZW5cbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyByZWZyZXNoU2Vzc2lvbihyZWZyZXNoX3Rva2VuPzogc3RyaW5nKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5sb2NhbENyZWRlbnRpYWxzLmdldENyZWRlbnRpYWxzKClcbiAgICAgIGNyZWRlbnRpYWxzLnJlZnJlc2hfdG9rZW4gPSByZWZyZXNoX3Rva2VuIHx8IGNyZWRlbnRpYWxzLnJlZnJlc2hfdG9rZW5cbiAgICAgIGNvbnN0IG5ld1Rva2VucyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQucmVmcmVzaFRva2VuKGNyZWRlbnRpYWxzKVxuICAgICAgY29uc3QgeyBkYXRhOiB7IHVzZXIgfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoZmFsc2UpXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlciwgc2Vzc2lvbjogeyAuLi5uZXdUb2tlbnMsIHVzZXIgfSB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdyZWZyZXNoU2Vzc2lvbicgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtZ2V0dXNlclxuICAgKiDlpoLmnpzlrZjlnKjnjrDmnInkvJror53vvIzliJnojrflj5blvZPliY3nlKjmiLfor6bnu4bkv6Hmga9cbiAgICogQHJldHVybnMgUHJvbWlzZTxHZXRVc2VyUmVzPlxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlcihpc1JlZnJlc2ggPSB0cnVlKTogUHJvbWlzZTxHZXRVc2VyUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNvbnZlcnRUb1VzZXIoYXdhaXQgdGhpcy5nZXRDdXJyZW50VXNlcihpc1JlZnJlc2gpKVxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ2dldFVzZXInIH0pIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Yi35paw55So5oi35L+h5oGvXG4gICAqIEByZXR1cm5zIFByb21pc2U8Q29tbW9uUmVzPlxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaFVzZXIoKTogUHJvbWlzZTxDb21tb25SZXM+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jdXJyZW50VXNlci5yZWZyZXNoKClcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAncmVmcmVzaFVzZXInIH0pIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXVwZGF0ZXVzZXJcbiAgICog5pu05paw55So5oi35L+h5oGvXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxHZXRVc2VyUmVzIHwgVXBkYXRlVXNlcldpdGhWZXJpZmljYXRpb25SZXM+XG4gICAqL1xuICBhc3luYyB1cGRhdGVVc2VyKHBhcmFtczogVXBkYXRlVXNlclJlcSk6IFByb21pc2U8R2V0VXNlclJlcyB8IFVwZGF0ZVVzZXJXaXRoVmVyaWZpY2F0aW9uUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8muiHs+WwkeacieS4gOS4quabtOaWsOWtl+auteiiq+aPkOS+m1xuICAgICAgY29uc3QgaGFzVmFsdWUgPSBPYmplY3Qua2V5cyhwYXJhbXMpLnNvbWUoa2V5ID0+IHBhcmFtc1trZXldICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zW2tleV0gIT09IG51bGwgJiYgcGFyYW1zW2tleV0gIT09ICcnLClcbiAgICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2U6ICdBdCBsZWFzdCBvbmUgZmllbGQgbXVzdCBiZSBwcm92aWRlZCBmb3IgdXBkYXRlJyB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGVtYWlsLCBwaG9uZSwgLi4ucmVzdFBhcmFtcyB9ID0gcGFyYW1zXG5cbiAgICAgIC8vIOajgOafpeaYr+WQpumcgOimgeabtOaWsCBlbWFpbCDmiJYgcGhvbmVcbiAgICAgIGNvbnN0IG5lZWRzRW1haWxWZXJpZmljYXRpb24gPSBlbWFpbCAhPT0gdW5kZWZpbmVkXG4gICAgICBjb25zdCBuZWVkc1Bob25lVmVyaWZpY2F0aW9uID0gcGhvbmUgIT09IHVuZGVmaW5lZFxuXG4gICAgICBsZXQgZXh0cmFSZXMgPSB7fVxuXG4gICAgICBpZiAobmVlZHNFbWFpbFZlcmlmaWNhdGlvbiB8fCBuZWVkc1Bob25lVmVyaWZpY2F0aW9uKSB7XG4gICAgICAgIC8vIOmcgOimgeWPkemAgemqjOivgeeggVxuICAgICAgICBsZXQgdmVyaWZpY2F0aW9uUGFyYW1zOiB7IGVtYWlsPzogc3RyaW5nOyBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfVxuICAgICAgICBsZXQgdmVyaWZpY2F0aW9uVHlwZTogJ2VtYWlsX2NoYW5nZScgfCAncGhvbmVfY2hhbmdlJ1xuXG4gICAgICAgIGlmIChuZWVkc0VtYWlsVmVyaWZpY2F0aW9uKSB7XG4gICAgICAgICAgdmVyaWZpY2F0aW9uUGFyYW1zID0geyBlbWFpbDogcGFyYW1zLmVtYWlsIH1cbiAgICAgICAgICB2ZXJpZmljYXRpb25UeXBlID0gJ2VtYWlsX2NoYW5nZSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDmraPop4TljJbmiYvmnLrlj7dcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRQaG9uZSA9IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKVxuICAgICAgICAgIHZlcmlmaWNhdGlvblBhcmFtcyA9IHsgcGhvbmVfbnVtYmVyOiBmb3JtYXR0ZWRQaG9uZSB9XG4gICAgICAgICAgdmVyaWZpY2F0aW9uVHlwZSA9ICdwaG9uZV9jaGFuZ2UnXG4gICAgICAgIH1cblxuICAgICAgICAvLyDlj5HpgIHpqozor4HnoIFcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uSW5mbyA9IGF3YWl0IHRoaXMuZ2V0VmVyaWZpY2F0aW9uKHZlcmlmaWNhdGlvblBhcmFtcylcblxuICAgICAgICBPYmplY3Qua2V5cyhyZXN0UGFyYW1zKS5sZW5ndGggPiAwICYmIChhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8ocmVzdFBhcmFtcykpXG5cbiAgICAgICAgZXh0cmFSZXMgPSB7XG4gICAgICAgICAgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICB2ZXJpZnlPdHA6IGFzeW5jICh2ZXJpZnlQYXJhbXM6IHsgZW1haWw/OiBzdHJpbmc7IHBob25lPzogc3RyaW5nOyB0b2tlbjogc3RyaW5nIH0pOiBQcm9taXNlPEdldFVzZXJSZXM+ID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICh2ZXJpZnlQYXJhbXMuZW1haWwgJiYgcGFyYW1zLmVtYWlsID09PSB2ZXJpZnlQYXJhbXMuZW1haWwpIHtcbiAgICAgICAgICAgICAgICAvLyDpqozor4HnoIHpqozor4FcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZlcmlmeU90cCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZW1haWxfY2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiBwYXJhbXMuZW1haWwsXG4gICAgICAgICAgICAgICAgICB0b2tlbjogdmVyaWZ5UGFyYW1zLnRva2VuLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlckJhc2ljSW5mbyh7IGVtYWlsOiBwYXJhbXMuZW1haWwgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJpZnlQYXJhbXMucGhvbmUgJiYgcGFyYW1zLnBob25lID09PSB2ZXJpZnlQYXJhbXMucGhvbmUpIHtcbiAgICAgICAgICAgICAgICAvLyDpqozor4HnoIHpqozor4FcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZlcmlmeU90cCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAncGhvbmVfY2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIHBob25lOiBwYXJhbXMucGhvbmUsXG4gICAgICAgICAgICAgICAgICB0b2tlbjogdmVyaWZ5UGFyYW1zLnRva2VuLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlckJhc2ljSW5mbyh7IHBob25lOiB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSkgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZlcmlmeU90cCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiB2ZXJpZmljYXRpb25UeXBlLFxuICAgICAgICAgICAgICAgICAgZW1haWw6IG5lZWRzRW1haWxWZXJpZmljYXRpb24gPyBwYXJhbXMuZW1haWwgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBwaG9uZTogIW5lZWRzRW1haWxWZXJpZmljYXRpb24gPyBwYXJhbXMucGhvbmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICB0b2tlbjogdmVyaWZ5UGFyYW1zLnRva2VuLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC8vIOmqjOivgeaIkOWKn+WQjuabtOaWsOeUqOaIt+S/oeaBr1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlckJhc2ljSW5mbyhwYXJhbXMpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZGF0YTogeyB1c2VyIH0sXG4gICAgICAgICAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoZmFsc2UpXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLlVTRVJfVVBEQVRFRCB9KVxuXG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAndXBkYXRlVXNlcicgfSkgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOS4jemcgOimgemqjOivge+8jOebtOaOpeabtOaWsFxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8ocGFyYW1zKVxuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhOiB7IHVzZXIgfSxcbiAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoZmFsc2UpXG4gICAgICB0aGlzLmNvbmZpZy5ldmVudEJ1cz8uZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7IGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5VU0VSX1VQREFURUQgfSlcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyLCAuLi5leHRyYVJlcyB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICd1cGRhdGVVc2VyJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1nZXR1c2VyaWRlbnRpdGllc1xuICAgKiDojrflj5bmiYDmnInouqvku73mupBcbiAgICogQHJldHVybnMgUHJvbWlzZTxHZXRVc2VySWRlbnRpdGllc1Jlcz5cbiAgICovXG4gIGFzeW5jIGdldFVzZXJJZGVudGl0aWVzKCk6IFByb21pc2U8R2V0VXNlcklkZW50aXRpZXNSZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0UHJvdmlkZXJzKClcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGlkZW50aXRpZXM6IHByb3ZpZGVycz8uZGF0YT8uZmlsdGVyKHYgPT4gISF2LmJpbmQpIGFzIHVua25vd24gYXMgR2V0VXNlcklkZW50aXRpZXNSZXNbJ2RhdGEnXVsnaWRlbnRpdGllcyddLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ2dldFVzZXJJZGVudGl0aWVzJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1saW5raWRlbnRpdHlcbiAgICog57uR5a6a6Lqr5Lu95rqQ5Yiw5b2T5YmN55So5oi3XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxMaW5rSWRlbnRpdHlSZXM+XG4gICAqL1xuICBhc3luYyBsaW5rSWRlbnRpdHkocGFyYW1zOiBMaW5rSWRlbnRpdHlSZXEpOiBQcm9taXNlPExpbmtJZGVudGl0eVJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpwcm92aWRlcuW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgcHJvdmlkZXI6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdQcm92aWRlciBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMuc2lnbkluV2l0aE9BdXRoKHtcbiAgICAgICAgcHJvdmlkZXI6IHBhcmFtcy5wcm92aWRlcixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHR5cGU6IE9BVVRIX1RZUEUuQklORF9JREVOVElUWSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgcHJvdmlkZXI6IHBhcmFtcy5wcm92aWRlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdsaW5rSWRlbnRpdHknIH0pIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXVubGlua2lkZW50aXR5XG4gICAqIOino+e7kei6q+S7vea6kFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8Q29tbW9uUmVzPlxuICAgKi9cbiAgYXN5bmMgdW5saW5rSWRlbnRpdHkocGFyYW1zOiBVbmxpbmtJZGVudGl0eVJlcSk6IFByb21pc2U8Q29tbW9uUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mnByb3ZpZGVy5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICBwcm92aWRlcjogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Byb3ZpZGVyIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudW5iaW5kUHJvdmlkZXIoeyBwcm92aWRlcl9pZDogcGFyYW1zLnByb3ZpZGVyIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICd1bmxpbmtJZGVudGl0eScgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtcmVhdXRoZW50aWNhdGlvblxuICAgKiDph43mlrDorqTor4FcbiAgICogQHJldHVybnMgUHJvbWlzZTxSZWF1dGhlbnRpY2F0ZVJlcz5cbiAgICovXG4gIGFzeW5jIHJlYXV0aGVudGljYXRlKCk6IFByb21pc2U8UmVhdXRoZW50aWNhdGVSZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhOiB7IHVzZXIgfSxcbiAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoZmFsc2UpXG5cbiAgICAgIHRoaXMudmFsaWRhdGVBdExlYXN0T25lKHVzZXIsIFtbJ2VtYWlsJywgJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcbiAgICAgIGNvbnN0IHVzZXJJbmZvID0gdXNlci5lbWFpbCA/IHsgZW1haWw6IHVzZXIuZW1haWwgfSA6IHsgcGhvbmVfbnVtYmVyOiB0aGlzLmZvcm1hdFBob25lKHVzZXIucGhvbmUpIH1cblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih1c2VySW5mbylcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIC8vIOesrOS6jOatpe+8muetieW+heeUqOaIt+i+k+WFpemqjOivgeegge+8iOmAmui/hyBQcm9taXNlIOWMheijheeUqOaIt+i+k+WFpeS6i+S7tu+8iVxuICAgICAgICAgIHVwZGF0ZVVzZXI6IGFzeW5jIChhdHRyaWJ1dGVzOiBVcGRhdGVVc2VyQXR0cmlidXRlcyk6IFByb21pc2U8U2lnbkluUmVzPiA9PiB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgICAgbm9uY2U6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdOb25jZSBpcyByZXF1aXJlZCcgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5wYXNzd29yZCkge1xuICAgICAgICAgICAgICAgIC8vIOesrOS4ieatpe+8muW+heeUqOaIt+i+k+WFpeWujOmqjOivgeeggeS5i+WQju+8jOmqjOivgemqjOivgeeggVxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblRva2VuUmVzID0gYXdhaXQgdGhpcy52ZXJpZnkoe1xuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2lkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9jb2RlOiBhdHRyaWJ1dGVzLm5vbmNlLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAvLyDnrKzlm5vmraXvvJrojrflj5Ygc3Vkb190b2tlblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1ZG9SZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zdWRvKHtcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl90b2tlbjogdmVyaWZpY2F0aW9uVG9rZW5SZXMudmVyaWZpY2F0aW9uX3Rva2VuLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zZXRQYXNzd29yZCh7XG4gICAgICAgICAgICAgICAgICBuZXdfcGFzc3dvcmQ6IGF0dHJpYnV0ZXMucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICBzdWRvX3Rva2VuOiBzdWRvUmVzLnN1ZG9fdG9rZW4sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNpZ25JbldpdGhVc2VybmFtZSh7XG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25JbmZvLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uQ29kZTogYXR0cmlidXRlcy5ub25jZSxcbiAgICAgICAgICAgICAgICAgIC4uLnVzZXJJbmZvLFxuICAgICAgICAgICAgICAgICAgbG9naW5UeXBlOiB1c2VySW5mby5lbWFpbCA/ICdlbWFpbCcgOiAncGhvbmUnLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ3JlYXV0aGVudGljYXRlJyB9KSB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdyZWF1dGhlbnRpY2F0ZScgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtcmVzZW5kXG4gICAqIOmHjeaWsOWPkemAgemqjOivgeeggVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8UmVzZW5kUmVzPlxuICAgKi9cbiAgYXN5bmMgcmVzZW5kKHBhcmFtczogUmVzZW5kUmVxKTogUHJvbWlzZTxSZXNlbmRSZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yaZW1haWzmiJZwaG9uZeW/heWhq+WFtuS4gFxuICAgICAgdGhpcy52YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zLCBbWydlbWFpbCddLCBbJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcblxuICAgICAgY29uc3QgdGFyZ2V0ID0gcGFyYW1zLnR5cGUgPT09ICdzaWdudXAnID8gJ0FOWScgOiAnVVNFUidcbiAgICAgIGNvbnN0IGRhdGE6IHsgZW1haWw/OiBzdHJpbmc7IHBob25lX251bWJlcj86IHN0cmluZzsgdGFyZ2V0OiAnVVNFUicgfCAnQU5ZJyB9ID0geyB0YXJnZXQgfVxuICAgICAgaWYgKCdlbWFpbCcgaW4gcGFyYW1zKSB7XG4gICAgICAgIGRhdGEuZW1haWwgPSBwYXJhbXMuZW1haWxcbiAgICAgIH1cblxuICAgICAgaWYgKCdwaG9uZScgaW4gcGFyYW1zKSB7XG4gICAgICAgIGRhdGEucGhvbmVfbnVtYmVyID0gdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpXG4gICAgICB9XG5cbiAgICAgIC8vIOmHjeaWsOWPkemAgemqjOivgeeggVxuICAgICAgY29uc3QgeyB2ZXJpZmljYXRpb25faWQ6IHZlcmlmaWNhdGlvbklkIH0gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRWZXJpZmljYXRpb24oZGF0YSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogeyBtZXNzYWdlSWQ6IHZlcmlmaWNhdGlvbklkIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHt9LFxuICAgICAgICBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdyZXNlbmQnIH0pLFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2V0c2Vzc2lvblxuICAgKiDkvb/nlKhhY2Nlc3NfdG9rZW7lkoxyZWZyZXNoX3Rva2Vu5p2l6K6+572u5Lya6K+dXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzZXRTZXNzaW9uKHBhcmFtczogU2V0U2Vzc2lvblJlcSk6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIGFjY2Vzc190b2tlbjogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ0FjY2VzcyB0b2tlbiBpcyByZXF1aXJlZCcgfSxcbiAgICAgICAgcmVmcmVzaF90b2tlbjogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1JlZnJlc2ggdG9rZW4gaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2Uub2F1dGgyY2xpZW50LnJlZnJlc2hUb2tlbihwYXJhbXMsIHsgdGhyb3dFcnJvcjogdHJ1ZSB9KVxuXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLlNJR05FRF9JTiB9KVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdzZXRTZXNzaW9uJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLWV4Y2hhbmdlY29kZWZvcnNlc3Npb25cbiAgYXN5bmMgZXhjaGFuZ2VDb2RlRm9yU2Vzc2lvbigpIHtcbiAgICAvL1xuICB9XG5cbiAgLyoqXG4gICAqIOWIoOmZpOW9k+WJjeeUqOaIt1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBkZWxldGVVc2VyKHBhcmFtczogRGVsZXRlTWVSZXEpOiBQcm9taXNlPENvbW1vblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICBwYXNzd29yZDogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgY29uc3QgeyBzdWRvX3Rva2VuIH0gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zdWRvKHBhcmFtcylcblxuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZGVsZXRlTWUoeyBzdWRvX3Rva2VuIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvciwgeyBtZXRob2Q6ICdkZWxldGVVc2VyJyB9KSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOi3s+i9rOezu+e7n+m7mOiupOeZu+W9lemhtVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhdXRoTW9kZWxzLlRvRGVmYXVsdExvZ2luUGFnZT59XG4gICAqIEBtZW1iZXJvZiBBdXRoXG4gICAqL1xuICBhc3luYyB0b0RlZmF1bHRMb2dpblBhZ2UocGFyYW1zOiBhdXRoTW9kZWxzLlRvRGVmYXVsdExvZ2luUGFnZSA9IHt9KTogUHJvbWlzZTxDb21tb25SZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnVmVyc2lvbiA9IHBhcmFtcy5jb25maWdfdmVyc2lvbiB8fCAnZW52J1xuICAgICAgY29uc3QgcXVlcnkgPSBPYmplY3Qua2V5cyhwYXJhbXMucXVlcnkgfHwge30pXG4gICAgICAgIC5tYXAoa2V5ID0+IGAke2tleX09JHtwYXJhbXMucXVlcnlba2V5XX1gKVxuICAgICAgICAuam9pbignJicpXG5cbiAgICAgIGlmIChhZGFwdGVyRm9yV3hNcC5pc01hdGNoKCkpIHtcbiAgICAgICAgd3gubmF2aWdhdGVUbyh7IHVybDogYC9wYWNrYWdlcy8kd2Rfc3lzdGVtL3BhZ2VzL2xvZ2luL2luZGV4JHtxdWVyeSA/IGA/JHtxdWVyeX1gIDogJyd9YCB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVkaXJlY3RVcmkgPSBwYXJhbXMucmVkaXJlY3RfdXJpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmXG4gICAgICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwocmVkaXJlY3RVcmkpXG4gICAgICAgIGNvbnN0IGxvZ2luUGFnZSA9IGAke3VybE9iai5vcmlnaW59L19fYXV0aC8/YXBwX2lkPSR7cGFyYW1zLmFwcF9pZCB8fCAnJ30mZW52X2lkPSR7dGhpcy5jb25maWcuZW52fSZjbGllbnRfaWQ9JHtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5jbGllbnRJZCB8fCB0aGlzLmNvbmZpZy5lbnZcbiAgICAgICAgfSZjb25maWdfdmVyc2lvbj0ke2NvbmZpZ1ZlcnNpb259JnJlZGlyZWN0X3VyaT0ke2VuY29kZVVSSUNvbXBvbmVudChyZWRpcmVjdFVyaSl9JHtxdWVyeSA/IGAmJHtxdWVyeX1gIDogJyd9YFxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGxvZ2luUGFnZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ3RvRGVmYXVsdExvZ2luUGFnZScgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDoh6rlrprkuYnnmbvlvZVcbiAgICogQHBhcmFtIGdldFRpY2tGbiAoKSA9PiBQcm9taXNlPHN0cmluZz4sIOiOt+WPluiHquWumuS5ieeZu+W9lSB0aWNrZXQg55qE5Ye95pWwXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoQ3VzdG9tVGlja2V0KGdldFRpY2tGbj86IGF1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZuKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICBpZiAoZ2V0VGlja0ZuKSB7XG4gICAgICB0aGlzLnNldEN1c3RvbVNpZ25GdW5jKGdldFRpY2tGbilcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aEN1c3RvbVRpY2tldCgpXG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAvLyBsb2dpblN0YXRl6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLihsb2dpblN0YXRlIGFzIGFueSksIGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yLCB7IG1ldGhvZDogJ3NpZ25JbldpdGhDdXN0b21UaWNrZXQnIH0pIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5bCP56iL5bqPb3Blbklk6Z2Z6buY55m75b2VXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoT3BlbklkKHsgdXNlV3hDbG91ZCA9IHRydWUgfSA9IHt9KTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICBpZiAoIWFkYXB0ZXJGb3JXeE1wLmlzTWF0Y2goKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ3d4IGFwaSB1bmRlZmluZWQnKVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuXG4gICAgY29uc3QgbWFpbkZ1bmMgPSBhc3luYyAoY29kZSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogYXV0aE1vZGVscy5HcmFudFByb3ZpZGVyVG9rZW5SZXNwb25zZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICAgICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4oXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgICBwcm92aWRlcl9jb2RlOiBjb2RlLFxuICAgICAgICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyX2NvZGVfdHlwZTogJ29wZW5faWQnLFxuICAgICAgICAgICAgICBhcHBpZDogd3hJbmZvPy5hcHBJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VXeENsb3VkLFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKChyZXN1bHQgYXMgYW55KT8uZXJyb3JfY29kZSB8fCAhcmVzdWx0LnByb3ZpZGVyX3Rva2VuKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0XG4gICAgICAgIH1cblxuICAgICAgICBjcmVkZW50aWFscyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbldpdGhQcm92aWRlcihcbiAgICAgICAgICB7IHByb3ZpZGVyX3Rva2VuOiByZXN1bHQucHJvdmlkZXJfdG9rZW4gfSxcbiAgICAgICAgICB1c2VXeENsb3VkLFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKChjcmVkZW50aWFscyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgICAgdGhyb3cgY3JlZGVudGlhbHNcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQuc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHMgYXMgQ3JlZGVudGlhbHMpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3gubG9naW4oe1xuICAgICAgICAgIHN1Y2Nlc3M6IGFzeW5jIChyZXM6IHsgY29kZTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IG1haW5GdW5jKHJlcy5jb2RlKVxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmYWlsOiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHJlcz8uZXJyTXNnKVxuICAgICAgICAgICAgOyhlcnJvciBhcyBhbnkpLmNvZGUgPSByZXM/LmVycm5vXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIC8vIGxvZ2luU3RhdGXov5Tlm57mmK/kuLrkuoblhbzlrrl2MueJiOacrFxuICAgICAgcmV0dXJuIHsgLi4uKGxvZ2luU3RhdGUgYXMgYW55KSwgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAnc2lnbkluV2l0aE9wZW5JZCcgfSkgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlsI/nqIvluo/miYvmnLrlj7fmjojmnYPnmbvlvZVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25JbldpdGhQaG9uZUF1dGgoeyBwaG9uZUNvZGUgPSAnJywgdXNlV3hDbG91ZCA9IGZhbHNlIH0pOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIGlmICghYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlOiAnd3ggYXBpIHVuZGVmaW5lZCcgfSkgfVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuICAgIGNvbnN0IHByb3ZpZGVySW5mbyA9IHtcbiAgICAgIHByb3ZpZGVyX3BhcmFtczogeyBwcm92aWRlcl9jb2RlX3R5cGU6ICdwaG9uZScsIGNvZGU6IHBob25lQ29kZSwgYXBwaWQ6IHd4SW5mby5hcHBJZCB9LFxuICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mby5hcHBJZCxcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHd4LmxvZ2luKClcbiAgICA7KHByb3ZpZGVySW5mbyBhcyBhbnkpLnByb3ZpZGVyX2NvZGUgPSBjb2RlXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvdmlkZXJUb2tlbiA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdyYW50UHJvdmlkZXJUb2tlbihwcm92aWRlckluZm8sIHVzZVd4Q2xvdWQpXG4gICAgICBpZiAocHJvdmlkZXJUb2tlbi5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHRocm93IHByb3ZpZGVyVG9rZW5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2lnbkluUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aFByb3ZpZGVyKHtcbiAgICAgICAgcHJvdmlkZXJfdG9rZW46IHByb3ZpZGVyVG9rZW4ucHJvdmlkZXJfdG9rZW4sXG4gICAgICB9LCB1c2VXeENsb3VkKVxuXG4gICAgICBpZiAoKHNpZ25JblJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHRocm93IHNpZ25JblJlc1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IsIHsgbWV0aG9kOiAnc2lnbkluV2l0aFBob25lQXV0aCcgfSkgfVxuICAgIH1cblxuICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuXG4gICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgLy8gbG9naW5TdGF0Zei/lOWbnuaYr+S4uuS6huWFvOWuuXYy54mI5pysXG4gICAgcmV0dXJuIHsgLi4uKGxvZ2luU3RhdGUgYXMgYW55KSwgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICB9XG5cbiAgLyoqXG4gICAqIOe7keWumuaJi+acuuWPt1xuICAgKiBAcGFyYW0gcGhvbmVOdW1iZXJcbiAgICogQHBhcmFtIHBob25lQ29kZVxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+e7keWumuaJi+acuuWPt+Wksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuYmluZFBob25lTnVtYmVyKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3njq/looPmmK/lkKblvIDpgJrkuobnn63kv6Hpqozor4HnoIHnmbvlvZUnLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGJpbmRQaG9uZU51bWJlcihwYXJhbXM6IGF1dGhNb2RlbHMuQmluZFBob25lUmVxdWVzdCkge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5lZGl0Q29udGFjdChwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICog6Kej57uR5LiJ5pa557uR5a6aXG4gICAqIEBwYXJhbSBsb2dpblR5cGVcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfop6PpmaTkuInmlrnnu5HlrprlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLnVuYmluZFByb3ZpZGVyKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3otKbmiLfmmK/lkKblt7Lnu4/kuI7mraTnmbvlvZXmlrnlvI/op6Pnu5EnLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHVuYmluZFByb3ZpZGVyKHBhcmFtczogYXV0aE1vZGVscy5VbmJpbmRQcm92aWRlclJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudW5iaW5kUHJvdmlkZXIocGFyYW1zKVxuICB9XG5cbiAgLyoqXG4gICAqIOabtOaWsOmCrueuseWcsOWdgFxuICAgKiBAcGFyYW0gZW1haWxcbiAgICogQHBhcmFtIHN1ZG9fdG9rZW5cbiAgICogQHBhcmFtIHZlcmlmaWNhdGlvbl90b2tlblxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+e7keWumumCrueuseWcsOWdgOWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuYmluZEVtYWlsKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3njq/looPmmK/lkKblvIDpgJrkuobpgq7nrrHlr4bnoIHnmbvlvZUnLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGJpbmRFbWFpbChwYXJhbXM6IGF1dGhNb2RlbHMuQmluZEVtYWlsUmVxdWVzdCkge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5lZGl0Q29udGFjdChwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICogdmVyaWZ5XG4gICAqIEBwYXJhbSB7YXV0aE1vZGVscy5WZXJpZnlSZXF1ZXN0fSBwYXJhbXNcbiAgICogQHJldHVybnMge1Byb21pc2U8YXV0aE1vZGVscy5WZXJpZnlSZXNwb25zZT59XG4gICAqIEBtZW1iZXJvZiBVc2VyXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6aqM6K+B56CB6aqM6K+B5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS52ZXJpZnkoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOmAmuS6huaJi+acuumqjOivgeeggS/pgq7nrrHnmbvlvZUnLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHZlcmlmeShwYXJhbXM6IGF1dGhNb2RlbHMuVmVyaWZ5UmVxdWVzdCk6IFByb21pc2U8YXV0aE1vZGVscy5WZXJpZnlSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS52ZXJpZnkocGFyYW1zKVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPlumqjOivgeeggVxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuR2V0VmVyaWZpY2F0aW9uUmVxdWVzdH0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGF1dGhNb2RlbHMuR2V0VmVyaWZpY2F0aW9uUmVzcG9uc2U+fVxuICAgKiBAbWVtYmVyb2YgVXNlclxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+iOt+WPlumqjOivgeeggeWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuZ2V0VmVyaWZpY2F0aW9uKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3njq/looPmmK/lkKblvIDpgJrkuobmiYvmnLrpqozor4HnoIEv6YKu566x55m75b2VJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBnZXRWZXJpZmljYXRpb24oXG4gICAgcGFyYW1zOiBhdXRoTW9kZWxzLkdldFZlcmlmaWNhdGlvblJlcXVlc3QsXG4gICAgb3B0aW9ucz86IHsgd2l0aENhcHRjaGE6IGJvb2xlYW4gfSxcbiAgKTogUHJvbWlzZTxhdXRoTW9kZWxzLkdldFZlcmlmaWNhdGlvblJlc3BvbnNlPiB7XG4gICAgaWYgKHBhcmFtcy5waG9uZV9udW1iZXIpIHtcbiAgICAgIHBhcmFtcy5waG9uZV9udW1iZXIgPSB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZV9udW1iZXIpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRWZXJpZmljYXRpb24ocGFyYW1zLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeeZu+W9leeahOeUqOaIt+S/oeaBry3lkIzmraVcbiAgICovXG4gIGdldCBjdXJyZW50VXNlcigpIHtcbiAgICBpZiAodGhpcy5jYWNoZS5tb2RlID09PSAnYXN5bmMnKSB7XG4gICAgICAvLyBhc3luYyBzdG9yYWdl55qE5bmz5Y+w6LCD55So5q2kQVBJ5o+Q56S6XG4gICAgICBwcmludFdhcm4oXG4gICAgICAgIEVSUk9SUy5JTlZBTElEX09QRVJBVElPTixcbiAgICAgICAgJ2N1cnJlbnQgcGxhdGZvcm1cXCdzIHN0b3JhZ2UgaXMgYXN5bmNocm9ub3VzLCBwbGVhc2UgdXNlIGdldEN1cnJlbnRVc2VyIGluc3RlYWQnLFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IHRoaXMuaGFzTG9naW5TdGF0ZSgpXG5cbiAgICBpZiAobG9naW5TdGF0ZSkge1xuICAgICAgcmV0dXJuIGxvZ2luU3RhdGUudXNlciB8fCBudWxsXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5b2T5YmN55m75b2V55qE55So5oi35L+h5oGvLeW8guatpVxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+iOt+WPlueUqOaIt+S/oeaBr+Wksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBhdXRoKCkuZ2V0Q3VycmVudFVzZXIoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldEN1cnJlbnRVc2VyKGlzUmVmcmVzaCA9IHRydWUpOiBQcm9taXNlPChhdXRoTW9kZWxzLlVzZXJJbmZvICYgUGFydGlhbDxVc2VyPikgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChpc1JlZnJlc2gpIHtcbiAgICAgICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TG9naW5TdGF0ZSgpXG4gICAgICAgIGlmIChsb2dpblN0YXRlKSB7XG4gICAgICAgICAgLy8g5q+P5qyh6YO95Y+R6K+35rGC6I635Y+W5pyA5paw55So5oi35L+h5oGv77yM5LiN6LWw57yT5a2YXG4gICAgICAgICAgYXdhaXQgbG9naW5TdGF0ZS51c2VyLnJlZnJlc2goKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vXG4gICAgfVxuXG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TG9naW5TdGF0ZSgpXG4gICAgaWYgKGxvZ2luU3RhdGUpIHtcbiAgICAgIGNvbnN0IHVzZXJJbmZvID0gbG9naW5TdGF0ZS51c2VyLmdldExvY2FsVXNlckluZm8oKSBhcyBhdXRoTW9kZWxzLlVzZXJJbmZvXG4gICAgICBhd2FpdCBsb2dpblN0YXRlLnVzZXIuY2hlY2tMb2NhbEluZm9Bc3luYygpXG4gICAgICByZXR1cm4geyAuLi5sb2dpblN0YXRlLnVzZXIsIC4uLnVzZXJJbmZvIH0gYXMgdW5rbm93biBhcyBhdXRoTW9kZWxzLlVzZXJJbmZvICYgUGFydGlhbDxVc2VyPlxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIOWMv+WQjeeZu+W9lVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICflsI/nqIvluo/ljL/lkI3nmbvlvZXlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuobljL/lkI3nmbvlvZUnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuc2lnbkluQW5vbnltb3VzbHlJbld4KCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBzaWduSW5Bbm9ueW1vdXNseUluV3goe1xuICAgIHVzZVd4Q2xvdWQsXG4gIH06IHtcbiAgICB1c2VXeENsb3VkPzogYm9vbGVhblxuICB9ID0ge30pOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgICBpZiAoIWFkYXB0ZXJGb3JXeE1wLmlzTWF0Y2goKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ3d4IGFwaSB1bmRlZmluZWQnKVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuXG4gICAgY29uc3QgbWFpbkZ1bmMgPSBhc3luYyAoY29kZSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogYXV0aE1vZGVscy5HcmFudFByb3ZpZGVyVG9rZW5SZXNwb25zZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICAgICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4oXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgICBwcm92aWRlcl9jb2RlOiBjb2RlLFxuICAgICAgICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyX2NvZGVfdHlwZTogJ29wZW5faWQnLFxuICAgICAgICAgICAgICBhcHBpZDogd3hJbmZvPy5hcHBJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VXeENsb3VkLFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKChyZXN1bHQgYXMgYW55KT8uZXJyb3JfY29kZSB8fCAhcmVzdWx0LnByb3ZpZGVyX3Rva2VuKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0XG4gICAgICAgIH1cblxuICAgICAgICBjcmVkZW50aWFscyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbkFub255bW91c2x5KFxuICAgICAgICAgIHsgcHJvdmlkZXJfdG9rZW46IHJlc3VsdC5wcm92aWRlcl90b2tlbiB9LFxuICAgICAgICAgIHVzZVd4Q2xvdWQsXG4gICAgICAgIClcblxuICAgICAgICBpZiAoKGNyZWRlbnRpYWxzIGFzIGFueSk/LmVycm9yX2NvZGUpIHtcbiAgICAgICAgICB0aHJvdyBjcmVkZW50aWFsc1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHd4LmxvZ2luKHtcbiAgICAgICAgc3VjY2VzczogYXN5bmMgKHJlczogeyBjb2RlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBtYWluRnVuYyhyZXMuY29kZSlcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZmFpbDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IocmVzPy5lcnJNc2cpXG4gICAgICAgICAgOyhlcnJvciBhcyBhbnkpLmNvZGUgPSByZXM/LmVycm5vXG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSh1bmRlZmluZWQsIHsgYXN5bmNSZWZyZXNoVXNlcjogdHJ1ZSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j+e7keWumk9wZW5JRFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICflsI/nqIvluo/nu5HlrppPcGVuSUTlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuoblsI/nqIvluo9vcGVuSWTpnZnpu5jnmbvlvZUnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuYmluZE9wZW5JZCgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgYmluZE9wZW5JZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWFkYXB0ZXJGb3JXeE1wLmlzTWF0Y2goKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ3d4IGFwaSB1bmRlZmluZWQnKVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuXG4gICAgY29uc3QgbWFpbkZ1bmMgPSBhc3luYyAoY29kZSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogYXV0aE1vZGVscy5HcmFudFByb3ZpZGVyVG9rZW5SZXNwb25zZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4oe1xuICAgICAgICAgIHByb3ZpZGVyX2lkOiB3eEluZm8/LmFwcElkLFxuICAgICAgICAgIHByb3ZpZGVyX2NvZGU6IGNvZGUsXG4gICAgICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7XG4gICAgICAgICAgICBwcm92aWRlcl9jb2RlX3R5cGU6ICdvcGVuX2lkJyxcbiAgICAgICAgICAgIGFwcGlkOiB3eEluZm8/LmFwcElkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKChyZXN1bHQgYXMgYW55KT8uZXJyb3JfY29kZSB8fCAhcmVzdWx0LnByb3ZpZGVyX3Rva2VuKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5iaW5kV2l0aFByb3ZpZGVyKHsgcHJvdmlkZXJfdG9rZW46IHJlc3VsdC5wcm92aWRlcl90b2tlbiB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB3eC5sb2dpbih7XG4gICAgICAgIHN1Y2Nlc3M6IGFzeW5jIChyZXM6IHsgY29kZTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgbWFpbkZ1bmMocmVzLmNvZGUpXG4gICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGZhaWw6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHJlcz8uZXJyTXNnKVxuICAgICAgICAgIDsoZXJyb3IgYXMgYW55KS5jb2RlID0gcmVzPy5lcnJub1xuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVyblxuICB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j3VuaW9uSWTpnZnpu5jnmbvlvZVcbiAgICogQHJldHVybnMge1Byb21pc2U8TG9naW5TdGF0ZT59XG4gICAqIEBtZW1iZXJvZiBBdXRoXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn5bCP56iL5bqPdW5pb25JZOmdmem7mOeZu+W9leWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6huWwj+eoi+W6j3VuaW9uSWTpnZnpu5jnmbvlvZUnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuc2lnbkluV2l0aFVuaW9uSWQoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHNpZ25JbldpdGhVbmlvbklkKCk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGlmICghYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICB0aHJvdyBFcnJvcignd3ggYXBpIHVuZGVmaW5lZCcpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHd4SW5mbyA9IHd4LmdldEFjY291bnRJbmZvU3luYygpLm1pbmlQcm9ncmFtXG4gICAgICAgIHd4LmxvZ2luKHtcbiAgICAgICAgICBzdWNjZXNzOiBhc3luYyAocmVzOiB7IGNvZGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm92aWRlcklkID0gd3hJbmZvPy5hcHBJZFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ3JhbnRQcm92aWRlclRva2VuKHtcbiAgICAgICAgICAgICAgICBwcm92aWRlcl9jb2RlOiByZXMuY29kZSxcbiAgICAgICAgICAgICAgICBwcm92aWRlcl9pZDogcHJvdmlkZXJJZCxcbiAgICAgICAgICAgICAgICBwcm92aWRlcl9wYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgIHByb3ZpZGVyX2NvZGVfdHlwZTogJ3VuaW9uX2lkJyxcbiAgICAgICAgICAgICAgICAgIGFwcGlkOiB3eEluZm8/LmFwcElkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgY29uc3QgeyBwcm92aWRlcl90b2tlbjogcHJvdmlkZXJUb2tlbiB9ID0gcmVzdWx0XG5cbiAgICAgICAgICAgICAgaWYgKCFwcm92aWRlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHNpZ25JblJlcyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbldpdGhQcm92aWRlcih7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJfaWQ6IHByb3ZpZGVySWQsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJfdG9rZW46IHByb3ZpZGVyVG9rZW4sXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgaWYgKChzaWduSW5SZXMgYXMgYW55KT8uZXJyb3JfY29kZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChzaWduSW5SZXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmFpbDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihyZXM/LmVyck1zZylcbiAgICAgICAgICAgIDsoZXJyb3IgYXMgYW55KS5jb2RlID0gcmVzPy5lcnJub1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j+efreS/oemqjOivgeeggeeZu+mZhlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfnn63kv6Hpqozor4HnoIHnmbvpmYYnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuoblsI/nqIvluo/nn63kv6Hpqozor4HnoIHnmbvpmYYnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuc2lnbkluV2l0aFNtcygpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aFNtcyh7XG4gICAgdmVyaWZpY2F0aW9uSW5mbyA9IHsgdmVyaWZpY2F0aW9uX2lkOiAnJywgaXNfdXNlcjogZmFsc2UgfSxcbiAgICB2ZXJpZmljYXRpb25Db2RlID0gJycsXG4gICAgcGhvbmVOdW0gPSAnJyxcbiAgICBiaW5kSW5mbyA9IHVuZGVmaW5lZCxcbiAgfSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgICAgICB2ZXJpZmljYXRpb25JbmZvLFxuICAgICAgICB2ZXJpZmljYXRpb25Db2RlLFxuICAgICAgICBiaW5kSW5mbyxcbiAgICAgICAgdXNlcm5hbWU6IHBob25lTnVtLFxuICAgICAgICBsb2dpblR5cGU6ICdzbXMnLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YKu566x6aqM6K+B56CB55m76ZmGXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICB0aXRsZTogJ+mCrueusemqjOivgeeggeeZu+mZhicsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6humCrueuseeZu+mZhicsXG4gICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5XaXRoRW1haWwoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHNpZ25JbldpdGhFbWFpbCh7XG4gICAgdmVyaWZpY2F0aW9uSW5mbyA9IHsgdmVyaWZpY2F0aW9uX2lkOiAnJywgaXNfdXNlcjogZmFsc2UgfSxcbiAgICB2ZXJpZmljYXRpb25Db2RlID0gJycsXG4gICAgYmluZEluZm8gPSB1bmRlZmluZWQsXG4gICAgZW1haWwgPSAnJyxcbiAgfSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgICAgICB2ZXJpZmljYXRpb25JbmZvLFxuICAgICAgICB2ZXJpZmljYXRpb25Db2RlLFxuICAgICAgICBiaW5kSW5mbyxcbiAgICAgICAgdXNlcm5hbWU6IGVtYWlsLFxuICAgICAgICBsb2dpblR5cGU6ICdlbWFpbCcsXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva7ojrflj5boh6rlrprkuYnnmbvlvZUgdGlja2V0IOWHveaVsFxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZufSBnZXRUaWNrRm5cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIHB1YmxpYyBzZXRDdXN0b21TaWduRnVuYyhnZXRUaWNrRm46IGF1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZuKTogdm9pZCB7XG4gICAgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2V0Q3VzdG9tU2lnbkZ1bmMoZ2V0VGlja0ZuKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgLy8gQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgLy8gICB0aXRsZTogJ+iHquWumuS5ieeZu+W9leWksei0pScsXG4gIC8vICAgbWVzc2FnZXM6IFtcbiAgLy8gICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAvLyAgICAgJyAgMSAtIOW9k+WJjeeOr+Wig+aYr+WQpuW8gOWQr+S6huiHquWumuS5ieeZu+W9lScsXG4gIC8vICAgICAnICAyIC0g6LCD55SoIGF1dGgoKS5zaWduSW5XaXRoQ3VzdG9tVGlja2V0KCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgLy8gICAgICcgIDMgLSB0aWNrZXQg5piv5ZCm5b2S5bGe5LqO5b2T5YmN546v5aKDJyxcbiAgLy8gICAgICcgIDQgLSDliJvlu7ogdGlja2V0IOeahOiHquWumuS5ieeZu+W9leengemSpeaYr+WQpui/h+acnycsXG4gIC8vICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgLy8gICBdLFxuICAvLyB9KVxuICAvLyBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aEN1c3RvbVRpY2tldCgpOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgLy8gICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoQ3VzdG9tVGlja2V0KClcbiAgLy8gICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcbiAgLy8gfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuU2lnbkluUmVxdWVzdH0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPExvZ2luU3RhdGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNpZ25JbihwYXJhbXM6IGF1dGhNb2RlbHMuU2lnbkluUmVxdWVzdCk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbihwYXJhbXMpXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZShwYXJhbXMpXG4gIH1cblxuICAvLyAvKipcbiAgLy8gICpcbiAgLy8gICogQHBhcmFtIHthdXRoTW9kZWxzLlNpZ25VcFJlcXVlc3R9IHBhcmFtc1xuICAvLyAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dpblN0YXRlPn1cbiAgLy8gICogQG1lbWJlcm9mIEF1dGhcbiAgLy8gICovXG4gIC8vIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gIC8vICAgdGl0bGU6ICfms6jlhozlpLHotKUnLFxuICAvLyAgIG1lc3NhZ2VzOiBbXG4gIC8vICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgLy8gICAgICcgIDEgLSDlvZPliY3njq/looPmmK/lkKblvIDlkK/kuobmjIflrprnmbvlvZXmlrnlvI8nLFxuICAvLyAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuc2lnblVwKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgLy8gICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAvLyAgIF0sXG4gIC8vIH0pXG4gIC8vIHB1YmxpYyBhc3luYyBzaWduVXAocGFyYW1zOiBhdXRoTW9kZWxzLlNpZ25VcFJlcXVlc3QpOiBQcm9taXNlPGFueT4ge1xuICAvLyAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25VcChwYXJhbXMpXG4gIC8vICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG4gIC8vIH1cblxuICAvKipcbiAgICog6K6+572u5a+G56CBXG4gICAqIEBwYXJhbSB7YXV0aE1vZGVscy5TZXRQYXNzd29yZFJlcXVlc3R9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRQYXNzd29yZChwYXJhbXM6IGF1dGhNb2RlbHMuU2V0UGFzc3dvcmRSZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNldFBhc3N3b3JkKHBhcmFtcylcbiAgfVxuXG4gIC8qKlxuICAgKiDmo4DmtYvnlKjmiLflkI3mmK/lkKblt7Lnu4/ljaDnlKhcbiAgICogQHBhcmFtIHVzZXJuYW1lXG4gICAqL1xuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W55So5oi35piv5ZCm6KKr5Y2g55So5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS5pc1VzZXJuYW1lUmVnaXN0ZXJlZCgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgaXNVc2VybmFtZVJlZ2lzdGVyZWQodXNlcm5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0eXBlb2YgdXNlcm5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvd0Vycm9yKEVSUk9SUy5JTlZBTElEX1BBUkFNUywgJ3VzZXJuYW1lIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIGNvbnN0IHsgZXhpc3QgfSA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmNoZWNrSWZVc2VyRXhpc3QoeyB1c2VybmFtZSB9KVxuICAgIHJldHVybiBleGlzdFxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluacrOWcsOeZu+W9leaAgS3lkIzmraVcbiAgICovXG4gIHB1YmxpYyBoYXNMb2dpblN0YXRlKCk6IExvZ2luU3RhdGUgfCBudWxsIHtcbiAgICBpZiAodGhpcy5jYWNoZS5tb2RlID09PSAnYXN5bmMnKSB7XG4gICAgICAvLyBhc3luYyBzdG9yYWdl55qE5bmz5Y+w6LCD55So5q2kQVBJ5o+Q56S6XG4gICAgICBwcmludFdhcm4oXG4gICAgICAgIEVSUk9SUy5JTlZBTElEX09QRVJBVElPTixcbiAgICAgICAgJ2N1cnJlbnQgcGxhdGZvcm1cXCdzIHN0b3JhZ2UgaXMgYXN5bmNocm9ub3VzLCBwbGVhc2UgdXNlIGdldExvZ2luU3RhdGUgaW5zdGVhZCcsXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvYXV0aExvZ2luU3RhdGUgPSB0aGlzLm9hdXRoSW5zdGFuY2U/LmF1dGhBcGkuaGFzTG9naW5TdGF0ZVN5bmMoKVxuICAgIGlmIChvYXV0aExvZ2luU3RhdGUpIHtcbiAgICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBuZXcgTG9naW5TdGF0ZSh7XG4gICAgICAgIGVudklkOiB0aGlzLmNvbmZpZy5lbnYsXG4gICAgICAgIGNhY2hlOiB0aGlzLmNhY2hlLFxuICAgICAgICBvYXV0aEluc3RhbmNlOiB0aGlzLm9hdXRoSW5zdGFuY2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIGxvZ2luU3RhdGVcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmnKzlnLDnmbvlvZXmgIEt5byC5q2lXG4gICAqIOatpEFQSeS4uuWFvOWuueW8guatpXN0b3JhZ2XnmoTlubPlj7BcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfojrflj5bmnKzlnLDnmbvlvZXmgIHlpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLmdldExvZ2luU3RhdGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldExvZ2luU3RhdGUoKSB7XG4gICAgbGV0IG9hdXRoTG9naW5TdGF0ZSA9IG51bGxcblxuICAgIHRyeSB7XG4gICAgICBvYXV0aExvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRMb2dpblN0YXRlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAob2F1dGhMb2dpblN0YXRlKSB7XG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gbmV3IExvZ2luU3RhdGUoe1xuICAgICAgICBlbnZJZDogdGhpcy5jb25maWcuZW52LFxuICAgICAgICBjYWNoZTogdGhpcy5jYWNoZSxcbiAgICAgICAgb2F1dGhJbnN0YW5jZTogdGhpcy5vYXV0aEluc3RhbmNlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiBsb2dpblN0YXRlXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCDkvb/nlKggZ2V0Q3VycmVudFVzZXIg5Luj5pu/77yM5Zug5Li65LiObm9kZS1zZGvmlrnms5XlkI3lhrLnqoFcbiAgICogQHJldHVybnNcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfojrflj5bnlKjmiLfkv6Hmga/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDmmK/lkKblt7LnmbvlvZUnLFxuICAgICAgJyAgMiAtIOiwg+eUqCBhdXRoKCkuZ2V0VXNlckluZm8oKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldFVzZXJJbmZvKCk6IFByb21pc2U8KGF1dGhNb2RlbHMuVXNlckluZm8gJiBQYXJ0aWFsPFVzZXI+KSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50VXNlcigpXG4gIH1cblxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W5b6u5pCt5o+S5Lu255So5oi35L+h5oGv5aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g5piv5ZCm5bey55m75b2VJyxcbiAgICAgICcgIDIgLSDosIPnlKggYXV0aCgpLmdldFdlZGFVc2VySW5mbygpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgZ2V0V2VkYVVzZXJJbmZvKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFdlZGFVc2VySW5mbygpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVXNlckJhc2ljSW5mbyhwYXJhbXM6IGF1dGhNb2RlbHMuTW9kaWZ5VXNlckJhc2ljSW5mb1JlcXVlc3QpIHtcbiAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5nZXRMb2dpblN0YXRlKClcbiAgICBpZiAobG9naW5TdGF0ZSkge1xuICAgICAgYXdhaXQgKGxvZ2luU3RhdGUudXNlciBhcyBVc2VyKS51cGRhdGVVc2VyQmFzaWNJbmZvKHBhcmFtcylcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvKipcbiAgICogZ2V0QXV0aEhlYWRlciDlhbzlrrnlpITnkIZcbiAgICog6L+U5Zue56m65a+56LGhXG4gICAqL1xuICBwdWJsaWMgZ2V0QXV0aEhlYWRlcigpOiB7fSB7XG4gICAgY29uc29sZS5lcnJvcignQXV0aC5nZXRBdXRoSGVhZGVyIEFQSSDlt7Llup/lvIMnKVxuICAgIHJldHVybiB7fVxuICB9XG5cbiAgLyoqXG4gICAqIOS4uuW3suaciei0puaIt+e7keesrOS4ieaWuei0puaIt1xuICAgKiBAcGFyYW0ge2F1dGhNb2RlbHMuQmluZFdpdGhQcm92aWRlclJlcXVlc3R9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgdGl0bGU6ICfnu5HlrprnrKzkuInmlrnnmbvlvZXmlrnlvI/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggYXV0aCgpLmJpbmRXaXRoUHJvdmlkZXIoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOatpOi0puaIt+aYr+WQpuW3sue7j+e7keWumuatpOesrOS4ieaWuScsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgYmluZFdpdGhQcm92aWRlcihwYXJhbXM6IGF1dGhNb2RlbHMuQmluZFdpdGhQcm92aWRlclJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuYmluZFdpdGhQcm92aWRlcihwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICog5p+l6K+i55So5oi3XG4gICAqIEBwYXJhbSB7YXV0aE1vZGVscy5RdWVyeVVzZXJQcm9maWxlUmVxdWVzdH0gYXBwZW5kZWRfcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGF1dGhNb2RlbHMuVXNlclByb2ZpbGU+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHF1ZXJ5VXNlcihxdWVyeU9iajogYXV0aE1vZGVscy5RdWVyeVVzZXJQcm9maWxlUmVxdWVzdCk6IFByb21pc2U8YXV0aE1vZGVscy5RdWVyeVVzZXJQcm9maWxlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucXVlcnlVc2VyUHJvZmlsZShxdWVyeU9iailcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBY2Nlc3NUb2tlbigpIHtcbiAgICBjb25zdCBvYXV0aEFjY2Vzc1Rva2VuUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5nZXRBY2Nlc3NUb2tlbigpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY2Vzc1Rva2VuOiBvYXV0aEFjY2Vzc1Rva2VuUmVzLFxuICAgICAgZW52OiB0aGlzLmNvbmZpZy5lbnYsXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdyYW50UHJvdmlkZXJUb2tlbihwYXJhbXM6IGF1dGhNb2RlbHMuR3JhbnRQcm92aWRlclRva2VuUmVxdWVzdCwpOiBQcm9taXNlPGF1dGhNb2RlbHMuR3JhbnRQcm92aWRlclRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ3JhbnRQcm92aWRlclRva2VuKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwYXRjaFByb3ZpZGVyVG9rZW4ocGFyYW1zOiBhdXRoTW9kZWxzLlBhdGNoUHJvdmlkZXJUb2tlblJlcXVlc3QsKTogUHJvbWlzZTxhdXRoTW9kZWxzLlBhdGNoUHJvdmlkZXJUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnBhdGNoUHJvdmlkZXJUb2tlbihwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aFByb3ZpZGVyKHBhcmFtczogYXV0aE1vZGVscy5TaWduSW5XaXRoUHJvdmlkZXJSZXF1ZXN0KTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aFByb3ZpZGVyKHBhcmFtcylcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoV2VjaGF0KHBhcmFtczogYW55ID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoV2VjaGF0KHBhcmFtcylcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBncmFudFRva2VuKHBhcmFtczogYXV0aE1vZGVscy5HcmFudFRva2VuUmVxdWVzdCk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdyYW50VG9rZW4ocGFyYW1zKVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdlblByb3ZpZGVyUmVkaXJlY3RVcmkocGFyYW1zOiBhdXRoTW9kZWxzLkdlblByb3ZpZGVyUmVkaXJlY3RVcmlSZXF1ZXN0LCk6IFByb21pc2U8YXV0aE1vZGVscy5HZW5Qcm92aWRlclJlZGlyZWN0VXJpUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2VuUHJvdmlkZXJSZWRpcmVjdFVyaShwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzZXRQYXNzd29yZChwYXJhbXM6IGF1dGhNb2RlbHMuUmVzZXRQYXNzd29yZFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucmVzZXRQYXNzd29yZChwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGV2aWNlQXV0aG9yaXplKHBhcmFtczogYXV0aE1vZGVscy5EZXZpY2VBdXRob3JpemVSZXF1ZXN0KTogUHJvbWlzZTxhdXRoTW9kZWxzLkRldmljZUF1dGhvcml6ZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmRldmljZUF1dGhvcml6ZShwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3VkbyhwYXJhbXM6IGF1dGhNb2RlbHMuU3Vkb1JlcXVlc3QpOiBQcm9taXNlPGF1dGhNb2RlbHMuU3Vkb1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnN1ZG8ocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlbGV0ZU1lKHBhcmFtczogYXV0aE1vZGVscy5XaXRoU3Vkb1JlcXVlc3QpOiBQcm9taXNlPGF1dGhNb2RlbHMuVXNlclByb2ZpbGU+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZGVsZXRlTWUocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFByb3ZpZGVycygpOiBQcm9taXNlPGF1dGhNb2RlbHMuUHJvdmlkZXJzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0UHJvdmlkZXJzKClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2dpblNjb3BlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmxvZ2luU2NvcGUoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvZ2luR3JvdXBzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkubG9naW5Hcm91cHMoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIG9uTG9naW5TdGF0ZUNoYW5nZWQoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5jb25maWcuZXZlbnRCdXM/Lm9uKEVWRU5UUy5MT0dJTl9TVEFURV9DSEFOR0VELCBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgICAvLyBnZXRMb2dpblN0YXRl5Lya6YeN5aSN6Kem5Y+RZ2V0Q3JlZGVudGlhbHPvvIzlr7zoh7Tmrbvlvqrnjq/vvIzmiYDku6VnZXRDcmVkZW50aWFsc+WHuumUmeS4jeWGjeWHuuWPkWdldExvZ2luU3RhdGVcbiAgICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBwYXJhbXM/LmRhdGE/LmV2ZW50VHlwZSAhPT0gTE9HSU5fU1RBVEVfQ0hBTkdFRF9UWVBFLkNSRURFTlRJQUxTX0VSUk9SID8gYXdhaXQgdGhpcy5nZXRMb2dpblN0YXRlKCkgOiB7fVxuICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLCB7IC4uLnBhcmFtcywgLi4ubG9naW5TdGF0ZSB9KVxuICAgIH0pXG4gICAgLy8g56uL5Yi75omn6KGM5LiA5qyh5Zue6LCDXG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TG9naW5TdGF0ZSgpXG4gICAgY2FsbGJhY2suY2FsbCh0aGlzLCBsb2dpblN0YXRlKVxuICB9XG5cbiAgLyoqXG4gICAqIOW8uuWItuWIt+aWsHRva2VuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWZyZXNoVG9rZW5Gb3JjZShwYXJhbXM6IHsgdmVyc2lvbj86IHN0cmluZyB9KTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5yZWZyZXNoVG9rZW5Gb3JjZShwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICog6I635Y+W6Lqr5Lu95L+h5oGvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q3JlZGVudGlhbHMoKTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRDcmVkZW50aWFscygpXG4gIH1cbiAgLyoqXG4gICAqIOWGmeWFpei6q+S7veS/oeaBr1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscykge1xuICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQuc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHMpXG4gIH1cblxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIHRpdGxlOiAn6I635Y+W6Lqr5Lu95rqQ57G75Z6LJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGF1dGgoKS5nZXRQcm92aWRlclN1YlR5cGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIGdldFByb3ZpZGVyU3ViVHlwZSgpOiBQcm9taXNlPGF1dGhNb2RlbHMuUHJvdmlkZXJTdWJUeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFByb3ZpZGVyU3ViVHlwZSgpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlQ2FwdGNoYURhdGEocGFyYW1zOiB7IHN0YXRlOiBzdHJpbmc7IHJlZGlyZWN0X3VyaT86IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmNyZWF0ZUNhcHRjaGFEYXRhKHBhcmFtcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnlDYXB0Y2hhRGF0YShwYXJhbXM6IHsgdG9rZW46IHN0cmluZzsga2V5OiBzdHJpbmcgfSkge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS52ZXJpZnlDYXB0Y2hhRGF0YShwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TWluaVByb2dyYW1RckNvZGUocGFyYW1zOiBhdXRoTW9kZWxzLkdldE1pbmlQcm9ncmFtUXJDb2RlUmVxdWVzdCwpOiBQcm9taXNlPGF1dGhNb2RlbHMuR2V0TWluaVByb2dyYW1RckNvZGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRNaW5pUHJvZ3JhbUNvZGUocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldE1pbmlQcm9ncmFtUXJDb2RlU3RhdHVzKHBhcmFtczogYXV0aE1vZGVscy5HZXRNaW5pUHJvZ3JhbVFyQ29kZVN0YXR1c1JlcXVlc3QsKTogUHJvbWlzZTxhdXRoTW9kZWxzLkdldE1pbmlQcm9ncmFtUXJDb2RlU3RhdHVzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0TWluaVByb2dyYW1RckNvZGVTdGF0dXMocGFyYW1zKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIG1vZGlmeVBhc3N3b3JkKHBhcmFtczogYXV0aE1vZGVscy5Nb2RpZnlVc2VyQmFzaWNJbmZvUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5tb2RpZnlQYXNzd29yZChwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbW9kaWZ5UGFzc3dvcmRXaXRob3V0TG9naW4ocGFyYW1zOiBhdXRoTW9kZWxzLk1vZGlmeVBhc3N3b3JkV2l0aG91dExvZ2luUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5tb2RpZnlQYXNzd29yZFdpdGhvdXRMb2dpbihwYXJhbXMpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VXNlckJlaGF2aW9yTG9nKHBhcmFtczogYXV0aE1vZGVscy5HZXRVc2VyQmVoYXZpb3JMb2cpOiBQcm9taXNlPGF1dGhNb2RlbHMuR2V0VXNlckJlaGF2aW9yTG9nUmVzPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFVzZXJCZWhhdmlvckxvZyhwYXJhbXMpXG4gIH1cblxuICAvKipcbiAgICogc21zL2VtYWlsIOmqjOivgeeggeeZu+W9lS/ms6jlhozvvIzpgLvovpHkuIDoh7TmlLbmlZtcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgIHZlcmlmaWNhdGlvbkluZm8gPSB7IHZlcmlmaWNhdGlvbl9pZDogJycsIGlzX3VzZXI6IGZhbHNlIH0sXG4gICAgdmVyaWZpY2F0aW9uQ29kZSA9ICcnLFxuICAgIHVzZXJuYW1lOiByYXdVc2VybmFtZSA9ICcnLFxuICAgIGJpbmRJbmZvID0gdW5kZWZpbmVkLFxuICAgIGxvZ2luVHlwZSA9ICcnLFxuICB9OiB7XG4gICAgdmVyaWZpY2F0aW9uSW5mbz86IGF1dGhNb2RlbHMuR2V0VmVyaWZpY2F0aW9uUmVzcG9uc2VcbiAgICB2ZXJpZmljYXRpb25Db2RlPzogc3RyaW5nXG4gICAgdXNlcm5hbWU/OiBzdHJpbmdcbiAgICBiaW5kSW5mbz86IGFueVxuICAgIGxvZ2luVHlwZT86IHN0cmluZ1xuICB9KTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIOmqjOivgemqjOivgeeggVxuICAgICAgY29uc3QgdmVyaWZ5UmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudmVyaWZ5KHtcbiAgICAgICAgdmVyaWZpY2F0aW9uX2lkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IHZlcmlmaWNhdGlvbkNvZGUsXG4gICAgICB9KVxuXG4gICAgICBpZiAoKHZlcmlmeVJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHRocm93IHZlcmlmeVJlc1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgICBjb25zdCB7IHZlcmlmaWNhdGlvbl90b2tlbiB9ID0gdmVyaWZ5UmVzXG5cbiAgICAgIC8vIOaJi+acuueZu+W9leWPguaVsFxuICAgICAgbGV0IHVzZXJuYW1lID0gdGhpcy5mb3JtYXRQaG9uZShyYXdVc2VybmFtZSlcbiAgICAgIGxldCBzaWduVXBQYXJhbTogYW55ID0geyBwaG9uZV9udW1iZXI6IHVzZXJuYW1lIH1cblxuICAgICAgLy8g6YKu566x55m75b2V5Y+C5pWwXG4gICAgICBpZiAobG9naW5UeXBlID09PSAnZW1haWwnKSB7XG4gICAgICAgIHVzZXJuYW1lID0gcmF3VXNlcm5hbWVcbiAgICAgICAgc2lnblVwUGFyYW0gPSB7IGVtYWlsOiB1c2VybmFtZSB9XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIOagueaNruaYr+WQpuW3sue7j+aYr+eUqOaIt++8jOWIhuWIq+i1sOeZu+W9leaIluazqOWGjOmAu+i+kVxuICAgICAgaWYgKHZlcmlmaWNhdGlvbkluZm8uaXNfdXNlcikge1xuICAgICAgICAvLyDnp4HmnInljJbnjq/looPmiJbogIXoh6rlrprkuYnlupTnlKjotbB2MeeJiOacrOeahOiAgemAu+i+kVxuICAgICAgICBjb25zdCBzaWduSW5SZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW4oe1xuICAgICAgICAgIHVzZXJuYW1lLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbl90b2tlbixcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoKHNpZ25JblJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgICAgdGhyb3cgc2lnbkluUmVzXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmluZEluZm8pIHtcbiAgICAgICAgICBjb25zdCBiaW5kUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuYmluZFdpdGhQcm92aWRlcih7XG4gICAgICAgICAgICBwcm92aWRlcl90b2tlbjogKGJpbmRJbmZvIGFzIGFueSk/LnByb3ZpZGVyVG9rZW4sXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmICgoYmluZFJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBiaW5kUmVzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDoh6rlrprkuYnlupTnlKjotbBzaWduVXDpgLvovpFcbiAgICAgICAgY29uc3Qgc2lnblVwUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnblVwKHtcbiAgICAgICAgICAuLi5zaWduVXBQYXJhbSxcbiAgICAgICAgICB2ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgICAgcHJvdmlkZXJfdG9rZW46IChiaW5kSW5mbyBhcyBhbnkpPy5wcm92aWRlcklkLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICgoc2lnblVwUmVzIGFzIGFueSk/LmVycm9yX2NvZGUpIHtcbiAgICAgICAgICB0aHJvdyBzaWduVXBSZXNcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVMb2dpblN0YXRlKFxuICAgIHBhcmFtcz86IHsgdmVyc2lvbj86IHN0cmluZzsgcXVlcnk/OiBhbnkgfSxcbiAgICBvcHRpb25zPzogeyBhc3luY1JlZnJlc2hVc2VyPzogYm9vbGVhbjsgdXNlckluZm8/OiBhbnkgfSxcbiAgKTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IG5ldyBMb2dpblN0YXRlKHtcbiAgICAgIGVudklkOiB0aGlzLmNvbmZpZy5lbnYsXG4gICAgICBjYWNoZTogdGhpcy5jYWNoZSxcbiAgICAgIG9hdXRoSW5zdGFuY2U6IHRoaXMub2F1dGhJbnN0YW5jZSxcbiAgICB9KVxuXG4gICAgYXdhaXQgbG9naW5TdGF0ZS5jaGVja0xvY2FsU3RhdGVBc3luYygpXG5cbiAgICBpZiAob3B0aW9ucz8udXNlckluZm8pIHtcbiAgICAgIGxvZ2luU3RhdGUudXNlci5zZXRMb2NhbFVzZXJJbmZvKG9wdGlvbnMudXNlckluZm8pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zPy5hc3luY1JlZnJlc2hVc2VyKSB7XG4gICAgICAgIGxvZ2luU3RhdGUudXNlci5yZWZyZXNoKHBhcmFtcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGxvZ2luU3RhdGUudXNlci5yZWZyZXNoKHBhcmFtcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZy5ldmVudEJ1cz8uZmlyZShFVkVOVFMuTE9HSU5fU1RBVEVfQ0hBTkdFRCwgeyBldmVudFR5cGU6IExPR0lOX1NUQVRFX0NIQU5HRURfVFlQRS5TSUdOX0lOIH0pXG5cbiAgICB0aGlzLmNvbmZpZy5ldmVudEJ1cz8uZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7IGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5TSUdORURfSU4gfSlcbiAgICByZXR1cm4gbG9naW5TdGF0ZVxuICB9XG5cbiAgYXN5bmMgc2V0QWNjZXNzS2V5KCkge1xuICAgIGxldCBhY2Nlc3NUb2tlbiA9ICcnXG4gICAgbGV0IHNjb3BlID0gJydcbiAgICBpZiAodGhpcy5jb25maWcuYWNjZXNzS2V5KSB7XG4gICAgICBhY2Nlc3NUb2tlbiA9IHRoaXMuY29uZmlnLmFjY2Vzc0tleVxuICAgICAgc2NvcGUgPSAnYWNjZXNzS2V5J1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcuYXV0aD8uc2VjcmV0SWQgJiYgdGhpcy5jb25maWcuYXV0aD8uc2VjcmV0S2V5KSB7XG4gICAgICBhY2Nlc3NUb2tlbiA9ICcnXG4gICAgICBzY29wZSA9IERFRkFVTFRfTk9ERV9BQ0NFU1NfU0NPUEVcbiAgICB9XG5cbiAgICBpZiAoIXNjb3BlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5zZXRBY2Nlc3NLZXlDcmVkZW50aWFscyh7XG4gICAgICAgIGFjY2Vzc190b2tlbjogYWNjZXNzVG9rZW4sXG4gICAgICAgIHRva2VuX3R5cGU6ICdCZWFyZXInLFxuICAgICAgICBzY29wZSxcbiAgICAgICAgZXhwaXJlc19hdDogbmV3IERhdGUoK25ldyBEYXRlKCkgKyArbmV3IERhdGUoKSksXG4gICAgICAgIGV4cGlyZXNfaW46ICtuZXcgRGF0ZSgpICsgK25ldyBEYXRlKCksXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2FjY2Vzc0tleSBlcnJvcjogJywgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGZvcm1hdFBob25lKHBob25lOiBzdHJpbmcpIHtcbiAgICBpZiAoIS9cXHMrLy50ZXN0KHBob25lKSAmJiAvXlxcK1xcZHsxLDN9XFxkKy8udGVzdChwaG9uZSkpIHtcbiAgICAgIHJldHVybiBwaG9uZS5yZXBsYWNlKC9eKFxcK1xcZHsxLDJ9KShcXGQrKSQvLCAnJDEgJDInKVxuICAgIH1cbiAgICByZXR1cm4gL15cXCtcXGR7MSwzfVxccysvLnRlc3QocGhvbmUpID8gcGhvbmUgOiBgKzg2ICR7cGhvbmV9YFxuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlMaXN0ZW5lcnMoZXZlbnQsIHNlc3Npb24sIGluZm8pOiBPbkF1dGhTdGF0ZUNoYW5nZUNhbGxiYWNrIHtcbiAgICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKChjYWxsYmFja3MpID0+IHtcbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGxiYWNrKGV2ZW50LCBzZXNzaW9uLCBpbmZvKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGF1dGggc3RhdGUgY2hhbmdlIGNhbGxiYWNrOicsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgcmV0dXJuXG4gIH1cblxuICBwcml2YXRlIHNldHVwTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5vbihFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IHBhcmFtcz8uZGF0YT8uZXZlbnRcbiAgICAgIGNvbnN0IGluZm8gPSBwYXJhbXM/LmRhdGE/LmluZm9cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YTogeyBzZXNzaW9uIH0sXG4gICAgICB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoZXZlbnQsIHNlc3Npb24sIGluZm8pXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvVXNlcih1c2VySW5mbzogYXV0aE1vZGVscy5Vc2VySW5mbyAmIFBhcnRpYWw8VXNlcj4pIHtcbiAgICBpZiAoIXVzZXJJbmZvKSByZXR1cm4gbnVsbFxuXG4gICAgLy8g5LyY5YWI5L2/55SoIHVzZXJJbmZvIOS4reeahOaVsOaNru+8iFYzIEFQSe+8iVxuICAgIGNvbnN0IGVtYWlsID0gdXNlckluZm8/LmVtYWlsIHx8ICcnXG4gICAgY29uc3QgcGhvbmUgPSB1c2VySW5mbz8ucGhvbmVfbnVtYmVyIHx8ICcnXG4gICAgY29uc3QgdXNlcklkID0gdXNlckluZm8/LnN1YiB8fCB1c2VySW5mbz8udWlkIHx8ICcnXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgIGF1ZDogJ2F1dGhlbnRpY2F0ZWQnLFxuICAgICAgcm9sZTogdXNlckluZm8uZ3JvdXBzPy5tYXA/Lihncm91cCA9PiAodHlwZW9mIGdyb3VwID09PSAnc3RyaW5nJyA/IGdyb3VwIDogZ3JvdXAuaWQpKSxcbiAgICAgIGVtYWlsOiBlbWFpbCB8fCAnJyxcbiAgICAgIGVtYWlsX2NvbmZpcm1lZF9hdDogdXNlckluZm8/LmVtYWlsX3ZlcmlmaWVkID8gdXNlckluZm8uY3JlYXRlZF9hdCA6IHVzZXJJbmZvLmNyZWF0ZWRfYXQsXG4gICAgICBwaG9uZSxcbiAgICAgIHBob25lX2NvbmZpcm1lZF9hdDogcGhvbmUgPyB1c2VySW5mby5jcmVhdGVkX2F0IDogdW5kZWZpbmVkLFxuICAgICAgY29uZmlybWVkX2F0OiB1c2VySW5mby5jcmVhdGVkX2F0LFxuICAgICAgbGFzdF9zaWduX2luX2F0OiAodXNlckluZm8gYXMgYW55KS5sYXN0X3NpZ25faW5fYXQsXG4gICAgICBhcHBfbWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXI6IHVzZXJJbmZvLmxvZ2luVHlwZT8udG9Mb3dlckNhc2UoKSB8fCAnY2xvdWRiYXNlJyxcbiAgICAgICAgcHJvdmlkZXJzOiBbdXNlckluZm8ubG9naW5UeXBlPy50b0xvd2VyQ2FzZSgpIHx8ICdjbG91ZGJhc2UnXSxcbiAgICAgIH0sXG4gICAgICB1c2VyX21ldGFkYXRhOiB7XG4gICAgICAgIC8vIFYzIEFQSSDnlKjmiLfkv6Hmga9cbiAgICAgICAgbmFtZTogdXNlckluZm8/Lm5hbWUsXG4gICAgICAgIHBpY3R1cmU6IHVzZXJJbmZvPy5waWN0dXJlLFxuICAgICAgICB1c2VybmFtZTogdXNlckluZm8/LnVzZXJuYW1lLCAvLyDnlKjmiLflkI3np7DvvIzplb/luqYgNS0yNCDkvY3vvIzmlK/mjIHlrZfnrKbkuK3oi7HmlofjgIHmlbDlrZfjgIHnibnmrorlrZfnrKbvvIjku4XmlK/mjIFfLe+8ie+8jOS4jeaUr+aMgeS4reaWh1xuICAgICAgICBnZW5kZXI6IHVzZXJJbmZvPy5nZW5kZXIsXG4gICAgICAgIGxvY2FsZTogdXNlckluZm8/LmxvY2FsZSxcbiAgICAgICAgLy8gVjIgQVBJIOWFvOWuue+8iOS9v+eUqCBhbnkg6YG/5YWN57G75Z6L6ZSZ6K+v77yJXG4gICAgICAgIHVpZDogdXNlckluZm8udWlkLFxuICAgICAgICBuaWNrTmFtZTogdXNlckluZm8ubmlja05hbWUgfHwgdXNlckluZm8/Lm5hbWUsXG4gICAgICAgIGF2YXRhclVybDogdXNlckluZm8uYXZhdGFyVXJsIHx8IHVzZXJJbmZvLnBpY3R1cmUsXG4gICAgICAgIGxvY2F0aW9uOiB1c2VySW5mby5sb2NhdGlvbixcbiAgICAgICAgaGFzUGFzc3dvcmQ6IHVzZXJJbmZvLmhhc1Bhc3N3b3JkID8/ICgodXNlckluZm8gYXMgYW55KS5wYXNzd29yZCA9PT0gJ1NFVCcpLFxuICAgICAgICBvcGVuX2lkOiB1c2VySW5mbz8ub3Blbl9pZCxcbiAgICAgIH0sXG4gICAgICBpZGVudGl0aWVzOlxuICAgICAgICB1c2VySW5mbz8ucHJvdmlkZXJzPy5tYXAocCA9PiAoe1xuICAgICAgICAgIGlkOiBwLmlkIHx8ICcnLFxuICAgICAgICAgIGlkZW50aXR5X2lkOiBwLmlkIHx8ICcnLFxuICAgICAgICAgIHVzZXJfaWQ6IHVzZXJJZCxcbiAgICAgICAgICBpZGVudGl0eV9kYXRhOiB7XG4gICAgICAgICAgICBwcm92aWRlcl9pZDogcC5pZCxcbiAgICAgICAgICAgIHByb3ZpZGVyX3VzZXJfaWQ6IHAucHJvdmlkZXJfdXNlcl9pZCxcbiAgICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3ZpZGVyOiBwLmlkIHx8ICdjbG91ZGJhc2UnLFxuICAgICAgICAgIGNyZWF0ZWRfYXQ6IHVzZXJJbmZvLmNyZWF0ZWRfYXQsXG4gICAgICAgICAgdXBkYXRlZF9hdDogdXNlckluZm8udXBkYXRlZF9hdCxcbiAgICAgICAgICBsYXN0X3NpZ25faW5fYXQ6ICh1c2VySW5mbyBhcyBhbnkpLmxhc3Rfc2lnbl9pbl9hdCxcbiAgICAgICAgfSkpIHx8IFtdLFxuICAgICAgY3JlYXRlZF9hdDogdXNlckluZm8uY3JlYXRlZF9hdCxcbiAgICAgIHVwZGF0ZWRfYXQ6IHVzZXJJbmZvLnVwZGF0ZWRfYXQsXG4gICAgICBpc19hbm9ueW1vdXM6IHVzZXJJbmZvLm5hbWUgPT09ICdhbm9ueW1vdXMnLFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlj4LmlbDmoKHpqozovoXliqnmlrnms5VcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbXMocGFyYW1zOiBhbnksIHJ1bGVzOiB7IFtrZXk6IHN0cmluZ106IHsgcmVxdWlyZWQ/OiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmcgfSB9KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBba2V5LCBydWxlXSBvZiBPYmplY3QuZW50cmllcyhydWxlcykpIHtcbiAgICAgIGlmIChydWxlLnJlcXVpcmVkICYmIChwYXJhbXM/LltrZXldID09PSB1bmRlZmluZWQgfHwgcGFyYW1zPy5ba2V5XSA9PT0gbnVsbCB8fCBwYXJhbXM/LltrZXldID09PSAnJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2U6IHJ1bGUubWVzc2FnZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoKHpqozlv4Xloavlj4LmlbDnu4TvvIjoh7PlsJHmnInkuIDkuKrlj4LmlbDlv4XpobvmnInlgLzvvIlcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVBdExlYXN0T25lKHBhcmFtczogYW55LCBmaWVsZEdyb3Vwczogc3RyaW5nW11bXSwgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaGFzVmFsdWUgPSBmaWVsZEdyb3Vwcy5zb21lKGdyb3VwID0+IGdyb3VwLnNvbWUoZmllbGQgPT4gcGFyYW1zPy5bZmllbGRdICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zPy5bZmllbGRdICE9PSBudWxsICYmIHBhcmFtcz8uW2ZpZWxkXSAhPT0gJycpLClcblxuICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlIH0pXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8eyBlcnJvcjogRXJyb3IgfCBudWxsIH0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5sb2NhbENyZWRlbnRpYWxzLmdldENyZWRlbnRpYWxzKClcbiAgICAgIGlmIChjcmVkZW50aWFscykge1xuICAgICAgICB0aGlzLmNvbmZpZy5ldmVudEJ1cz8uZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7IGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5JTklUSUFMX1NFU1NJT04gfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JlIGVycm9ycyB3aGVuIGNoZWNraW5nIGZvciBleGlzdGluZyBjcmVkZW50aWFsc1xuICAgIH1cblxuICAgIHJldHVybiB7IGVycm9yOiBudWxsIH1cbiAgfVxufVxuXG50eXBlIFRJbml0QXV0aE9wdGlvbnMgPSBQaWNrPFxuSUNsb3VkYmFzZUF1dGhDb25maWcsXG4ncmVnaW9uJyB8ICdwZXJzaXN0ZW5jZScgfCAnaTE4bicgfCAnYWNjZXNzS2V5JyB8ICd1c2VXeENsb3VkJyB8ICdhdXRoJ1xuPiAmXG5QYXJ0aWFsPEF1dGhPcHRpb25zPiAmIHtcbiAgZGV0ZWN0U2Vzc2lvbkluVXJsPzogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBdXRoSW5zdGFuY2UoXG4gIGNvbmZpZzogVEluaXRBdXRoT3B0aW9ucyAmIHsgc2RrVmVyc2lvbj86IHN0cmluZyB9LFxuICBvcHRpb25zPzoge1xuICAgIGNsaWVudElkOiBJQ2xvdWRiYXNlQ29uZmlnWydjbGllbnRJZCddXG4gICAgZW52OiBJQ2xvdWRiYXNlQ29uZmlnWydlbnYnXVxuICAgIGFwaU9yaWdpbjogc3RyaW5nXG4gICAgY2FjaGU/OiBJQ2xvdWRiYXNlQ2FjaGVcbiAgICBwbGF0Zm9ybT86IElDbG91ZGJhc2VbJ3BsYXRmb3JtJ11cbiAgICBhcHA/OiBJQ2xvdWRiYXNlXG4gICAgZGVidWc/OiBJQ2xvdWRiYXNlQXV0aENvbmZpZ1snZGVidWcnXVxuICAgIGRldGVjdFNlc3Npb25JblVybD86IElDbG91ZGJhc2VBdXRoQ29uZmlnWydkZXRlY3RTZXNzaW9uSW5VcmwnXVxuICB9LFxuKSB7XG4gIGNvbnN0IHsgcmVnaW9uID0gJ2FwLXNoYW5naGFpJywgaTE4biwgYWNjZXNzS2V5LCB1c2VXeENsb3VkIH0gPSBjb25maWdcbiAgY29uc3QgcGxhdGZvcm0gPSBvcHRpb25zPy5wbGF0Zm9ybSB8fCAodXNlRGVmYXVsdEFkYXB0ZXIuYmluZChvcHRpb25zKSgpIGFzIElDbG91ZGJhc2VQbGF0Zm9ybUluZm8pXG4gIGNvbnN0IHsgcnVudGltZSwgYWRhcHRlciB9ID0gcGxhdGZvcm1cblxuICBjb25zdCB7IGVudiwgY2xpZW50SWQsIGRlYnVnLCBjYWNoZSwgYXBwOiBjbG91ZGJhc2UgfSA9IG9wdGlvbnMgfHwge31cbiAgbGV0IHsgYXBpT3JpZ2luIH0gPSBvcHRpb25zIHx8IHt9XG4gIGlmICghYXBpT3JpZ2luKSB7XG4gICAgYXBpT3JpZ2luID0gYGh0dHBzOi8vJHtlbnZ9LiR7cmVnaW9ufS50Y2ItYXBpLnRlbmNlbnRjbG91ZGFwaS5jb21gXG4gIH1cblxuICBjb25zdCBjb21tb25PcHRzID0ge1xuICAgIGVudixcbiAgICBjbGllbnRJZCxcbiAgICBpMThuLFxuICAgIGFjY2Vzc0tleSxcbiAgICB1c2VXeENsb3VkLFxuICAgIGV2ZW50QnVzOiBuZXcgQ2xvdWRiYXNlRXZlbnRFbWl0dGVyKCksXG4gIH1cblxuICBjb25zdCBvYXV0aEluc3RhbmNlID0gbmV3IENsb3VkYmFzZU9BdXRoKHVzZUF1dGhBZGFwdGVyKHtcbiAgICAuLi5jb21tb25PcHRzLFxuICAgIGFwaU9yaWdpbixcbiAgICBhcGlQYXRoOiBjb25maWc/LmFwaVBhdGggfHwgQVVUSF9BUElfUFJFRklYLFxuICAgIC8vIEB0b2RvIOS7peS4i+acgOWlvei1sGFkYXB0b3LlpITnkIbvvIznm67liY1vYXV0aOaooeWdl+ayoeaMiWFkYXB0b3LmjqXlj6Porr7orqFcbiAgICBzdG9yYWdlOiBjb25maWc/LnN0b3JhZ2UsXG4gICAgYmFzZVJlcXVlc3Q6IGNvbmZpZz8uYmFzZVJlcXVlc3QsXG4gICAgcmVxdWVzdDogY29uZmlnPy5yZXF1ZXN0LFxuICAgIGFub255bW91c1NpZ25JbkZ1bmM6IGNvbmZpZz8uYW5vbnltb3VzU2lnbkluRnVuYyxcbiAgICBjYXB0Y2hhT3B0aW9uczogY29uZmlnPy5jYXB0Y2hhT3B0aW9ucyxcbiAgICB3eENsb3VkOiBjb25maWc/Lnd4Q2xvdWQsXG4gICAgYWRhcHRlcixcbiAgICBvbkNyZWRlbnRpYWxzRXJyb3I6IG9uQ3JlZGVudGlhbHNFcnJvcihjb21tb25PcHRzLmV2ZW50QnVzKSxcbiAgICBoZWFkZXJzOiB7ICdYLVNESy1WZXJzaW9uJzogYEBjbG91ZGJhc2UvanMtc2RrLyR7Y29uZmlnLnNka1ZlcnNpb259YCwgLi4uKGNvbmZpZy5oZWFkZXJzIHx8IHt9KSB9LFxuICAgIGRldGVjdFNlc3Npb25JblVybDogY29uZmlnLmRldGVjdFNlc3Npb25JblVybCxcbiAgICBkZWJ1ZyxcbiAgICBhdXRoOiBvcHRpb25zLmFwcD8uY29uZmlnPy5hdXRoLFxuICB9KSwpXG5cbiAgY29uc3QgYXV0aEluc3RhbmNlID0gbmV3IEF1dGgoe1xuICAgIC4uLmNvbW1vbk9wdHMsXG4gICAgcmVnaW9uLFxuICAgIHBlcnNpc3RlbmNlOiBjb25maWcucGVyc2lzdGVuY2UsXG4gICAgZGVidWcsXG4gICAgY2FjaGU6XG4gICAgICBjYWNoZSB8fCBuZXcgQ2xvdWRiYXNlQ2FjaGUoe1xuICAgICAgICBwZXJzaXN0ZW5jZTogY29uZmlnLnBlcnNpc3RlbmNlLFxuICAgICAgICBrZXlzOiB7IHVzZXJJbmZvS2V5OiBgdXNlcl9pbmZvXyR7ZW52fWAgfSxcbiAgICAgICAgcGxhdGZvcm1JbmZvOiBwbGF0Zm9ybSxcbiAgICAgIH0pLFxuICAgIHJ1bnRpbWU6IHJ1bnRpbWUgfHwgJ3dlYicsXG4gICAgX2Zyb21BcHA6IGNsb3VkYmFzZSxcbiAgICBvYXV0aEluc3RhbmNlLFxuICAgIGF1dGg6IG9wdGlvbnMuYXBwPy5jb25maWc/LmF1dGgsXG4gIH0pXG5cbiAgLy8gSW5pdGlhbGl6ZSBzZXNzaW9uIHdpdGggdXNlciBpbmZvIGNhbGxiYWNrXG4gIC8vIFRoaXMgaGFuZGxlcyBPQXV0aCBjYWxsYmFjayBVUkwgZGV0ZWN0aW9uIGFuZCBjcmVhdGVzIGxvZ2luIHN0YXRlIGF0b21pY2FsbHlcbiAgb2F1dGhJbnN0YW5jZS5pbml0aWFsaXplU2Vzc2lvbihhc3luYyAoZGF0YSwgZXJyb3IpID0+IHtcbiAgICBpZiAoIWRhdGEpIHJldHVyblxuXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gT0FVVEhfVFlQRS5TSUdOX0lOKSB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29tbW9uT3B0cy5ldmVudEJ1cy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHtcbiAgICAgICAgICBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuU0lHTkVEX0lOLFxuICAgICAgICAgIGluZm86IHsgLi4uZGF0YSwgZXJyb3IgfSxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS51c2VyKSB7XG4gICAgICAgIC8vIOS9v+eUqOW3suiOt+WPlueahCB1c2VyIOS/oeaBr+WIm+W7uiBMb2dpblN0YXRl77yM5aSN55SoIGNyZWF0ZUxvZ2luU3RhdGUg6YC76L6RXG4gICAgICAgIC8vIOS9hui3s+i/hyByZWZyZXNoKCkg6YG/5YWN5YaN5qyh6K+35rGCIEFQSSDlr7zoh7TmrbvplIFcbiAgICAgICAgYXV0aEluc3RhbmNlLmNyZWF0ZUxvZ2luU3RhdGUoe30sIHsgdXNlckluZm86IGRhdGEudXNlciB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSBPQVVUSF9UWVBFLkJJTkRfSURFTlRJVFkpIHtcbiAgICAgIGNvbW1vbk9wdHMuZXZlbnRCdXMuZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7XG4gICAgICAgIGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5CSU5EX0lERU5USVRZLFxuICAgICAgICBpbmZvOiB7IC4uLmRhdGEsIGVycm9yIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4geyBhdXRoSW5zdGFuY2UsIG9hdXRoSW5zdGFuY2UgfVxufVxuXG5jb25zdCBOQU1FU1BBQ0UgPSAnYXV0aCdcblxuLyoqXG4gKiDorqHnrpfkuKTkuKrlrZfnrKbkuLLkuYvpl7TnmoTnvJbovpHot53nprvvvIhMZXZlbnNodGVpbiBkaXN0YW5jZe+8iVxuICog55So5LqO5Zyo55So5oi36LCD55So5LiN5a2Y5Zyo55qEIEF1dGgg5pa55rOV5pe277yM5o6o6I2Q5pyA55u45Ly855qE5pa55rOV5ZCNXG4gKi9cbmZ1bmN0aW9uIGxldmVuc2h0ZWluRGlzdGFuY2UoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBtYXRyaXg6IG51bWJlcltdW10gPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8PSBhLmxlbmd0aDsgaSsrKSB7XG4gICAgbWF0cml4W2ldID0gW2ldXG4gIH1cbiAgZm9yIChsZXQgaiA9IDA7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIG1hdHJpeFswXVtqXSA9IGpcbiAgfVxuICBmb3IgKGxldCBpID0gMTsgaSA8PSBhLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDE7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgY29zdCA9IGFbaSAtIDFdLnRvTG93ZXJDYXNlKCkgPT09IGJbaiAtIDFdLnRvTG93ZXJDYXNlKCkgPyAwIDogMVxuICAgICAgbWF0cml4W2ldW2pdID0gTWF0aC5taW4oXG4gICAgICAgIG1hdHJpeFtpIC0gMV1bal0gKyAxLFxuICAgICAgICBtYXRyaXhbaV1baiAtIDFdICsgMSxcbiAgICAgICAgbWF0cml4W2kgLSAxXVtqIC0gMV0gKyBjb3N0LFxuICAgICAgKVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWF0cml4W2EubGVuZ3RoXVtiLmxlbmd0aF1cbn1cblxuLyoqXG4gKiDlnKjmlrnms5XliJfooajkuK3mn6Xmib7kuI7nm67moIflkI3np7DmnIDnm7jkvLznmoTmlrnms5VcbiAqIEByZXR1cm5zIOacgOebuOS8vOeahOaWueazleWQje+8jOWmguaenOayoeaciei2s+Wkn+ebuOS8vOeahOWImei/lOWbniBudWxsXG4gKi9cbmZ1bmN0aW9uIGZpbmRTaW1pbGFyTWV0aG9kKHRhcmdldDogc3RyaW5nLCBtZXRob2RzOiBzdHJpbmdbXSk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgYmVzdE1hdGNoOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHlcblxuICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgLy8g6Lez6L+H56eB5pyJ5pa55rOV5ZKM5p6E6YCg5Ye95pWwXG4gICAgaWYgKG1ldGhvZC5zdGFydHNXaXRoKCdfJykgfHwgbWV0aG9kID09PSAnY29uc3RydWN0b3InKSBjb250aW51ZVxuICAgIGNvbnN0IGRpc3RhbmNlID0gbGV2ZW5zaHRlaW5EaXN0YW5jZSh0YXJnZXQsIG1ldGhvZClcbiAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlXG4gICAgICBiZXN0TWF0Y2ggPSBtZXRob2RcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJlc3RNYXRjaFxufVxuXG5jb25zdCBjb21wb25lbnQ6IElDbG91ZGJhc2VDb21wb25lbnQgPSB7XG4gIG5hbWU6IENPTVBPTkVOVF9OQU1FLFxuICBuYW1lc3BhY2U6IE5BTUVTUEFDRSxcbiAgZW50aXR5KGNvbmZpZz86IFRJbml0QXV0aE9wdGlvbnMpIHtcbiAgICBjb25zdCBhdXRoID0gZnVuY3Rpb24gKGNvbmZpZz86IFRJbml0QXV0aE9wdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmF1dGhJbnN0YW5jZSAmJiAhY29uZmlnKSB7XG4gICAgICAgIC8vIHByaW50V2FybihFUlJPUlMuSU5WQUxJRF9PUEVSQVRJT04sICdldmVyeSBjbG91ZGJhc2UgaW5zdGFuY2Ugc2hvdWxkIGhhcyBvbmx5IG9uZSBhdXRoIG9iamVjdCcpXG4gICAgICAgIHJldHVybiB0aGlzLmF1dGhJbnN0YW5jZVxuICAgICAgfVxuXG4gICAgICBjb25maWcgPSBjb25maWcgfHwge1xuICAgICAgICByZWdpb246ICcnLFxuICAgICAgICBwZXJzaXN0ZW5jZTogJ2xvY2FsJyxcbiAgICAgICAgYXBpUGF0aDogQVVUSF9BUElfUFJFRklYLFxuICAgICAgfVxuICAgICAgY29uc3QgeyBhZGFwdGVyIH0gPSB0aGlzLnBsYXRmb3JtXG4gICAgICAvLyDlpoLkuI3mmI7noa7mjIflrppwZXJzaXN0ZW5jZeWImeS8mOWFiOWPluWQhOW5s+WPsGFkYXB0ZXLpppbpgInvvIzlhbbmrKFsb2NhbFN0b3JhZ2VcbiAgICAgIGNvbnN0IG5ld1BlcnNpc3RlbmNlID0gY29uZmlnLnBlcnNpc3RlbmNlIHx8IGFkYXB0ZXIucHJpbWFyeVN0b3JhZ2VcbiAgICAgIGlmIChuZXdQZXJzaXN0ZW5jZSAmJiBuZXdQZXJzaXN0ZW5jZSAhPT0gdGhpcy5jb25maWcucGVyc2lzdGVuY2UpIHtcbiAgICAgICAgdGhpcy51cGRhdGVDb25maWcoeyBwZXJzaXN0ZW5jZTogbmV3UGVyc2lzdGVuY2UgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBhdXRoSW5zdGFuY2UsIG9hdXRoSW5zdGFuY2UgfSA9IGdlbmVyYXRlQXV0aEluc3RhbmNlKFxuICAgICAgICB7XG4gICAgICAgICAgd3hDbG91ZDogdGhpcy5jb25maWcud3hDbG91ZCxcbiAgICAgICAgICBzdG9yYWdlOiB0aGlzLmNvbmZpZy5zdG9yYWdlLFxuICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICBwZXJzaXN0ZW5jZTogdGhpcy5jb25maWcucGVyc2lzdGVuY2UsXG4gICAgICAgICAgaTE4bjogdGhpcy5jb25maWcuaTE4bixcbiAgICAgICAgICBhY2Nlc3NLZXk6IHRoaXMuY29uZmlnLmFjY2Vzc0tleSxcbiAgICAgICAgICB1c2VXeENsb3VkOiB0aGlzLmNvbmZpZy51c2VXeENsb3VkLFxuICAgICAgICAgIHNka1ZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgICBkZXRlY3RTZXNzaW9uSW5Vcmw6IHRoaXMuY29uZmlnLmF1dGg/LmRldGVjdFNlc3Npb25JblVybCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGVudjogdGhpcy5jb25maWcuZW52LFxuICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNvbmZpZy5jbGllbnRJZCxcbiAgICAgICAgICBhcGlPcmlnaW46IHRoaXMucmVxdWVzdC5nZXRCYXNlRW5kUG9pbnQodGhpcy5jb25maWcuZW5kUG9pbnRNb2RlIHx8ICdDTE9VRF9BUEknKSxcbiAgICAgICAgICBwbGF0Zm9ybTogdGhpcy5wbGF0Zm9ybSxcbiAgICAgICAgICBjYWNoZTogdGhpcy5jYWNoZSxcbiAgICAgICAgICBhcHA6IHRoaXMsXG4gICAgICAgICAgZGVidWc6IHRoaXMuY29uZmlnLmRlYnVnLFxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICB0aGlzLm9hdXRoSW5zdGFuY2UgPSBvYXV0aEluc3RhbmNlXG5cbiAgICAgIHRoaXMuYXV0aEluc3RhbmNlID0gYXV0aEluc3RhbmNlXG5cbiAgICAgIHJldHVybiB0aGlzLmF1dGhJbnN0YW5jZVxuICAgIH1cblxuICAgIGNvbnN0IGF1dGhQcm90byA9IGF1dGguY2FsbCh0aGlzLCBjb25maWcpXG4gICAgT2JqZWN0LmFzc2lnbihhdXRoLCBhdXRoUHJvdG8pXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGF1dGgsIE9iamVjdC5nZXRQcm90b3R5cGVPZihhdXRoUHJvdG8pKVxuXG4gICAgLy8g5YyF6KOFIFByb3h577yM5b2T55So5oi36LCD55So5LiN5a2Y5Zyo55qE5pa55rOV5pe25o+Q5L6bIFwiRGlkIHlvdSBtZWFuP1wiIOaPkOekulxuICAgIGNvbnN0IGF1dGhXaXRoSGludCA9IHR5cGVvZiBQcm94eSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgID8gbmV3IFByb3h5KGF1dGgsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpXG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgfHwgdHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g5p+l5om+5pyA55u45Ly855qE5pa55rOV5ZCNXG4gICAgICAgICAgY29uc3QgYWxsS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpKVxuICAgICAgICAgICAgLmNvbmNhdChPYmplY3Qua2V5cyh0YXJnZXQpKVxuICAgICAgICAgICAgLmZpbHRlcihrID0+IHR5cGVvZiB0YXJnZXRba10gPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGZpbmRTaW1pbGFyTWV0aG9kKHByb3AsIGFsbEtleXMpXG4gICAgICAgICAgaWYgKHN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW0Nsb3VkQmFzZSBBdXRoXSBhdXRoLiR7cHJvcH0gaXMgbm90IGEgZnVuY3Rpb24uIERpZCB5b3UgbWVhbjogYXV0aC4ke3N1Z2dlc3Rpb259KCkgP2ApXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIDogYXV0aFxuXG4gICAgdGhpc1tOQU1FU1BBQ0VdID0gYXV0aFdpdGhIaW50XG4gICAgcmV0dXJuIGF1dGhXaXRoSGludFxuICB9LFxufVxuXG50cnkge1xuICAvLyDlsJ3or5Xoh6rliqjms6jlhozoh7PlhajlsYDlj5jph49jbG91ZGJhc2VcbiAgLy8g5q2k6KGM5Li65Y+q5Zyo5rWP6KeI5Zmo546v5aKD5LiL5pyJ5pWIXG4gIGNsb3VkYmFzZS5yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQpXG59IGNhdGNoIChlKSB7fVxuXG5leHBvcnQgeyBVc2VySW5mbywgQXV0aCwgV2VpeGluQXV0aFByb3ZpZGVyLCBDdXN0b21BdXRoUHJvdmlkZXIsIEFub255bW91c0F1dGhQcm92aWRlciB9XG4vLyDlr7zlh7rplJnor6/liIbnsbvmnprkuL7lkowgQXV0aEVycm9y77yM5pa55L6/5byA5Y+R6ICF6L+b6KGM6ZSZ6K+v5YiG57G75aSE55CGXG5leHBvcnQgeyBBdXRoRXJyb3JDYXRlZ29yeSwgQXV0aEVycm9yIH0gZnJvbSAnQGNsb3VkYmFzZS9vYXV0aCdcbi8qKlxuICogQGFwaSDmiYvliqjms6jlhozoh7NjbG91ZGJhc2UgYXBwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckF1dGgoYXBwOiBQaWNrPElDbG91ZGJhc2UsICdyZWdpc3RlckNvbXBvbmVudCc+KSB7XG4gIHRyeSB7XG4gICAgYXBwLnJlZ2lzdGVyQ29tcG9uZW50KGNvbXBvbmVudClcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybihlKVxuICB9XG59XG4iXX0=