@gnwebsoft/ui 4.0.21 → 4.0.23

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 (321) hide show
  1. package/package.json +1 -1
  2. package/dist/chunk-BWEFHFD4.js +0 -2399
  3. package/dist/chunk-FMN47XRJ.cjs +0 -72
  4. package/dist/chunk-FYU2OIMD.js +0 -15
  5. package/dist/chunk-HDL5E7XD.js +0 -523
  6. package/dist/chunk-LUW7V5GI.cjs +0 -15
  7. package/dist/chunk-PW777IOX.js +0 -140
  8. package/dist/chunk-QYHJIPSZ.cjs +0 -140
  9. package/dist/chunk-RVGPXTBE.js +0 -2535
  10. package/dist/chunk-T5H5X3VR.js +0 -72
  11. package/dist/chunk-TQQUGQTW.cjs +0 -2535
  12. package/dist/chunk-UZ2KNGOF.cjs +0 -523
  13. package/dist/chunk-W5EM6HLW.cjs +0 -2399
  14. package/dist/core/api/ApiClient.d.ts +0 -329
  15. package/dist/core/api/ApiClient.d.ts.map +0 -1
  16. package/dist/core/api/CorrelationIdGenerator.d.ts +0 -52
  17. package/dist/core/api/CorrelationIdGenerator.d.ts.map +0 -1
  18. package/dist/core/api/Errors/ErrorNormalizer.d.ts +0 -106
  19. package/dist/core/api/Errors/ErrorNormalizer.d.ts.map +0 -1
  20. package/dist/core/api/Interceptors/InterceptorManager.d.ts +0 -236
  21. package/dist/core/api/Interceptors/InterceptorManager.d.ts.map +0 -1
  22. package/dist/core/api/Models/FilterModel.d.ts +0 -22
  23. package/dist/core/api/Models/FilterModel.d.ts.map +0 -1
  24. package/dist/core/api/Models/QueryParams.d.ts +0 -13
  25. package/dist/core/api/Models/QueryParams.d.ts.map +0 -1
  26. package/dist/core/api/Models/index.d.ts +0 -3
  27. package/dist/core/api/Models/index.d.ts.map +0 -1
  28. package/dist/core/api/RequestManager.d.ts +0 -142
  29. package/dist/core/api/RequestManager.d.ts.map +0 -1
  30. package/dist/core/api/Retry/RetryHandler.d.ts +0 -100
  31. package/dist/core/api/Retry/RetryHandler.d.ts.map +0 -1
  32. package/dist/core/api/Signals/SignalManager.d.ts +0 -153
  33. package/dist/core/api/Signals/SignalManager.d.ts.map +0 -1
  34. package/dist/core/api/Utils/ResponseParser.d.ts +0 -105
  35. package/dist/core/api/Utils/ResponseParser.d.ts.map +0 -1
  36. package/dist/core/api/Utils/UrlBuilder.d.ts +0 -111
  37. package/dist/core/api/Utils/UrlBuilder.d.ts.map +0 -1
  38. package/dist/core/api/createApiClient.d.ts +0 -247
  39. package/dist/core/api/createApiClient.d.ts.map +0 -1
  40. package/dist/core/api/index.d.ts +0 -7
  41. package/dist/core/api/index.d.ts.map +0 -1
  42. package/dist/core/api/types/ApiError.d.ts +0 -17
  43. package/dist/core/api/types/ApiError.d.ts.map +0 -1
  44. package/dist/core/api/types/ApiResponse.d.ts +0 -76
  45. package/dist/core/api/types/ApiResponse.d.ts.map +0 -1
  46. package/dist/core/api/types/CancelToken.d.ts +0 -15
  47. package/dist/core/api/types/CancelToken.d.ts.map +0 -1
  48. package/dist/core/api/types/ErrorInterceptor.d.ts +0 -3
  49. package/dist/core/api/types/ErrorInterceptor.d.ts.map +0 -1
  50. package/dist/core/api/types/ErrorResponseData.d.ts +0 -68
  51. package/dist/core/api/types/ErrorResponseData.d.ts.map +0 -1
  52. package/dist/core/api/types/RequestConfig.d.ts +0 -21
  53. package/dist/core/api/types/RequestConfig.d.ts.map +0 -1
  54. package/dist/core/api/types/RequestInterceptor.d.ts +0 -3
  55. package/dist/core/api/types/RequestInterceptor.d.ts.map +0 -1
  56. package/dist/core/api/types/ResponseInterceptor.d.ts +0 -3
  57. package/dist/core/api/types/ResponseInterceptor.d.ts.map +0 -1
  58. package/dist/core/api/types/ValidationErrors.d.ts +0 -7
  59. package/dist/core/api/types/ValidationErrors.d.ts.map +0 -1
  60. package/dist/core/api/types/index.d.ts +0 -10
  61. package/dist/core/api/types/index.d.ts.map +0 -1
  62. package/dist/core/api/useValidationErrors.d.ts +0 -11
  63. package/dist/core/api/useValidationErrors.d.ts.map +0 -1
  64. package/dist/core/components/AuthorizedView/AuthorizedView.d.ts +0 -7
  65. package/dist/core/components/AuthorizedView/AuthorizedView.d.ts.map +0 -1
  66. package/dist/core/components/AuthorizedView/index.d.ts +0 -2
  67. package/dist/core/components/AuthorizedView/index.d.ts.map +0 -1
  68. package/dist/core/components/CancelButton/CancelButton.d.ts +0 -4
  69. package/dist/core/components/CancelButton/CancelButton.d.ts.map +0 -1
  70. package/dist/core/components/CancelButton/index.d.ts +0 -2
  71. package/dist/core/components/CancelButton/index.d.ts.map +0 -1
  72. package/dist/core/components/ClearButton/ClearButton.d.ts +0 -63
  73. package/dist/core/components/ClearButton/ClearButton.d.ts.map +0 -1
  74. package/dist/core/components/ClearButton/index.d.ts +0 -2
  75. package/dist/core/components/ClearButton/index.d.ts.map +0 -1
  76. package/dist/core/components/Containers/SimpleContainer.d.ts +0 -10
  77. package/dist/core/components/Containers/SimpleContainer.d.ts.map +0 -1
  78. package/dist/core/components/Containers/index.d.ts +0 -2
  79. package/dist/core/components/Containers/index.d.ts.map +0 -1
  80. package/dist/core/components/FilterButton/FilterButton.d.ts +0 -86
  81. package/dist/core/components/FilterButton/FilterButton.d.ts.map +0 -1
  82. package/dist/core/components/FilterButton/index.d.ts +0 -2
  83. package/dist/core/components/FilterButton/index.d.ts.map +0 -1
  84. package/dist/core/components/FilterDisplay/FilterChip.d.ts +0 -9
  85. package/dist/core/components/FilterDisplay/FilterChip.d.ts.map +0 -1
  86. package/dist/core/components/FilterDisplay/FilterDisplay.d.ts +0 -10
  87. package/dist/core/components/FilterDisplay/FilterDisplay.d.ts.map +0 -1
  88. package/dist/core/components/FilterDisplay/index.d.ts +0 -3
  89. package/dist/core/components/FilterDisplay/index.d.ts.map +0 -1
  90. package/dist/core/components/FilterWrapper/FilterWrapper.d.ts +0 -99
  91. package/dist/core/components/FilterWrapper/FilterWrapper.d.ts.map +0 -1
  92. package/dist/core/components/FilterWrapper/index.d.ts +0 -2
  93. package/dist/core/components/FilterWrapper/index.d.ts.map +0 -1
  94. package/dist/core/components/Footer/Footer.d.ts +0 -3
  95. package/dist/core/components/Footer/Footer.d.ts.map +0 -1
  96. package/dist/core/components/Footer/index.d.ts +0 -2
  97. package/dist/core/components/Footer/index.d.ts.map +0 -1
  98. package/dist/core/components/LabelText/LabelText.d.ts +0 -103
  99. package/dist/core/components/LabelText/LabelText.d.ts.map +0 -1
  100. package/dist/core/components/LabelText/index.d.ts +0 -2
  101. package/dist/core/components/LabelText/index.d.ts.map +0 -1
  102. package/dist/core/components/RenderIf/RenderIf.d.ts +0 -7
  103. package/dist/core/components/RenderIf/RenderIf.d.ts.map +0 -1
  104. package/dist/core/components/RenderIf/index.d.ts +0 -2
  105. package/dist/core/components/RenderIf/index.d.ts.map +0 -1
  106. package/dist/core/components/SectionBox/SectionBox.d.ts +0 -15
  107. package/dist/core/components/SectionBox/SectionBox.d.ts.map +0 -1
  108. package/dist/core/components/SectionBox/index.d.ts +0 -2
  109. package/dist/core/components/SectionBox/index.d.ts.map +0 -1
  110. package/dist/core/components/SimpleTabs/SimpleTabs.d.ts +0 -17
  111. package/dist/core/components/SimpleTabs/SimpleTabs.d.ts.map +0 -1
  112. package/dist/core/components/SimpleTabs/index.d.ts +0 -2
  113. package/dist/core/components/SimpleTabs/index.d.ts.map +0 -1
  114. package/dist/core/components/SubmitButton/SubmitButton.d.ts +0 -6
  115. package/dist/core/components/SubmitButton/SubmitButton.d.ts.map +0 -1
  116. package/dist/core/components/SubmitButton/index.d.ts +0 -2
  117. package/dist/core/components/SubmitButton/index.d.ts.map +0 -1
  118. package/dist/core/components/WithRef/WithRef.d.ts +0 -14
  119. package/dist/core/components/WithRef/WithRef.d.ts.map +0 -1
  120. package/dist/core/components/WithRef/index.d.ts +0 -2
  121. package/dist/core/components/WithRef/index.d.ts.map +0 -1
  122. package/dist/core/components/index.d.ts +0 -15
  123. package/dist/core/components/index.d.ts.map +0 -1
  124. package/dist/core/config.d.ts +0 -24
  125. package/dist/core/config.d.ts.map +0 -1
  126. package/dist/core/hooks/index.d.ts +0 -3
  127. package/dist/core/hooks/index.d.ts.map +0 -1
  128. package/dist/core/hooks/makeQuery.d.ts +0 -12
  129. package/dist/core/hooks/makeQuery.d.ts.map +0 -1
  130. package/dist/core/hooks/useApiClient.d.ts +0 -3
  131. package/dist/core/hooks/useApiClient.d.ts.map +0 -1
  132. package/dist/core/hooks/useFormErrorHandler.d.ts +0 -35
  133. package/dist/core/hooks/useFormErrorHandler.d.ts.map +0 -1
  134. package/dist/core/hooks/useListView.d.ts +0 -20
  135. package/dist/core/hooks/useListView.d.ts.map +0 -1
  136. package/dist/core/index.cjs +0 -123
  137. package/dist/core/index.d.ts +0 -8
  138. package/dist/core/index.d.ts.map +0 -1
  139. package/dist/core/index.js +0 -123
  140. package/dist/core/models.d.ts +0 -5
  141. package/dist/core/models.d.ts.map +0 -1
  142. package/dist/core/types/FilterLabel.d.ts +0 -6
  143. package/dist/core/types/FilterLabel.d.ts.map +0 -1
  144. package/dist/core/types/ListModels.d.ts +0 -18
  145. package/dist/core/types/ListModels.d.ts.map +0 -1
  146. package/dist/core/types/OptionsRequest.d.ts +0 -4
  147. package/dist/core/types/OptionsRequest.d.ts.map +0 -1
  148. package/dist/core/types/index.d.ts +0 -4
  149. package/dist/core/types/index.d.ts.map +0 -1
  150. package/dist/core/utils/CacheUtility/index.d.ts +0 -15
  151. package/dist/core/utils/CacheUtility/index.d.ts.map +0 -1
  152. package/dist/core/utils/calculateFilterCount.d.ts +0 -2
  153. package/dist/core/utils/calculateFilterCount.d.ts.map +0 -1
  154. package/dist/core/utils/format-time.d.ts +0 -79
  155. package/dist/core/utils/format-time.d.ts.map +0 -1
  156. package/dist/core/utils/getEmptyObject.d.ts +0 -7
  157. package/dist/core/utils/getEmptyObject.d.ts.map +0 -1
  158. package/dist/core/utils/index.d.ts +0 -7
  159. package/dist/core/utils/index.d.ts.map +0 -1
  160. package/dist/core/utils/useStableRowCount.d.ts +0 -9
  161. package/dist/core/utils/useStableRowCount.d.ts.map +0 -1
  162. package/dist/core/utils/watch/core.d.ts +0 -22
  163. package/dist/core/utils/watch/core.d.ts.map +0 -1
  164. package/dist/core/utils/watch/index.d.ts +0 -49
  165. package/dist/core/utils/watch/index.d.ts.map +0 -1
  166. package/dist/core/utils/watch/utilities.d.ts +0 -34
  167. package/dist/core/utils/watch/utilities.d.ts.map +0 -1
  168. package/dist/hooks/index.cjs +0 -11
  169. package/dist/hooks/index.d.ts +0 -3
  170. package/dist/hooks/index.d.ts.map +0 -1
  171. package/dist/hooks/index.js +0 -11
  172. package/dist/hooks/useTransform/enhanced.d.ts +0 -133
  173. package/dist/hooks/useTransform/enhanced.d.ts.map +0 -1
  174. package/dist/hooks/useTransform/index.d.ts +0 -93
  175. package/dist/hooks/useTransform/index.d.ts.map +0 -1
  176. package/dist/index.cjs +0 -265
  177. package/dist/index.d.ts +0 -6
  178. package/dist/index.d.ts.map +0 -1
  179. package/dist/index.js +0 -265
  180. package/dist/types/AsyncMultiSelectPayload.d.ts +0 -5
  181. package/dist/types/AsyncMultiSelectPayload.d.ts.map +0 -1
  182. package/dist/types/AsyncSelectPayload.d.ts +0 -5
  183. package/dist/types/AsyncSelectPayload.d.ts.map +0 -1
  184. package/dist/types/OperationResponse.d.ts +0 -5
  185. package/dist/types/OperationResponse.d.ts.map +0 -1
  186. package/dist/types/OptionItem.d.ts +0 -66
  187. package/dist/types/OptionItem.d.ts.map +0 -1
  188. package/dist/types/api.d.ts +0 -127
  189. package/dist/types/api.d.ts.map +0 -1
  190. package/dist/types/events.d.ts +0 -74
  191. package/dist/types/events.d.ts.map +0 -1
  192. package/dist/types/index.cjs +0 -31
  193. package/dist/types/index.d.ts +0 -14
  194. package/dist/types/index.d.ts.map +0 -1
  195. package/dist/types/index.js +0 -31
  196. package/dist/types/utilities.d.ts +0 -458
  197. package/dist/types/utilities.d.ts.map +0 -1
  198. package/dist/utils/flattenObjectKeys.d.ts +0 -63
  199. package/dist/utils/flattenObjectKeys.d.ts.map +0 -1
  200. package/dist/utils/getTimezone.d.ts +0 -4
  201. package/dist/utils/getTimezone.d.ts.map +0 -1
  202. package/dist/utils/handleServerErrors.d.ts +0 -70
  203. package/dist/utils/handleServerErrors.d.ts.map +0 -1
  204. package/dist/utils/index.cjs +0 -55
  205. package/dist/utils/index.d.ts +0 -9
  206. package/dist/utils/index.d.ts.map +0 -1
  207. package/dist/utils/index.js +0 -55
  208. package/dist/utils/propertyExists.d.ts +0 -35
  209. package/dist/utils/propertyExists.d.ts.map +0 -1
  210. package/dist/utils/readValueAsDate.d.ts +0 -4
  211. package/dist/utils/readValueAsDate.d.ts.map +0 -1
  212. package/dist/utils/removeLeadingTrailingSlashes.d.ts +0 -2
  213. package/dist/utils/removeLeadingTrailingSlashes.d.ts.map +0 -1
  214. package/dist/utils/schemaTools.d.ts +0 -209
  215. package/dist/utils/schemaTools.d.ts.map +0 -1
  216. package/dist/utils/typeGuards.d.ts +0 -316
  217. package/dist/utils/typeGuards.d.ts.map +0 -1
  218. package/dist/utils/watch/core.d.ts +0 -22
  219. package/dist/utils/watch/core.d.ts.map +0 -1
  220. package/dist/utils/watch/index.d.ts +0 -49
  221. package/dist/utils/watch/index.d.ts.map +0 -1
  222. package/dist/utils/watch/utilities.d.ts +0 -34
  223. package/dist/utils/watch/utilities.d.ts.map +0 -1
  224. package/dist/wrappers/AsyncMultiSelect/AsyncMultiSelect.d.ts +0 -9
  225. package/dist/wrappers/AsyncMultiSelect/AsyncMultiSelect.d.ts.map +0 -1
  226. package/dist/wrappers/AsyncMultiSelect/index.d.ts +0 -3
  227. package/dist/wrappers/AsyncMultiSelect/index.d.ts.map +0 -1
  228. package/dist/wrappers/AsyncMultiSelect/types.d.ts +0 -19
  229. package/dist/wrappers/AsyncMultiSelect/types.d.ts.map +0 -1
  230. package/dist/wrappers/AsyncSelect/index.d.ts +0 -9
  231. package/dist/wrappers/AsyncSelect/index.d.ts.map +0 -1
  232. package/dist/wrappers/AsyncSelect/types.d.ts +0 -20
  233. package/dist/wrappers/AsyncSelect/types.d.ts.map +0 -1
  234. package/dist/wrappers/Button.d.ts +0 -49
  235. package/dist/wrappers/Button.d.ts.map +0 -1
  236. package/dist/wrappers/CheckboxElement/CheckboxElement.d.ts +0 -102
  237. package/dist/wrappers/CheckboxElement/CheckboxElement.d.ts.map +0 -1
  238. package/dist/wrappers/CheckboxElement/index.d.ts +0 -3
  239. package/dist/wrappers/CheckboxElement/index.d.ts.map +0 -1
  240. package/dist/wrappers/CheckboxElement/types.d.ts +0 -76
  241. package/dist/wrappers/CheckboxElement/types.d.ts.map +0 -1
  242. package/dist/wrappers/CheckboxGroup/CheckboxGroup.d.ts +0 -98
  243. package/dist/wrappers/CheckboxGroup/CheckboxGroup.d.ts.map +0 -1
  244. package/dist/wrappers/CheckboxGroup/EnhancedCheckboxGroup.d.ts +0 -49
  245. package/dist/wrappers/CheckboxGroup/EnhancedCheckboxGroup.d.ts.map +0 -1
  246. package/dist/wrappers/CheckboxGroup/enhanced-types.d.ts +0 -171
  247. package/dist/wrappers/CheckboxGroup/enhanced-types.d.ts.map +0 -1
  248. package/dist/wrappers/CheckboxGroup/index.d.ts +0 -3
  249. package/dist/wrappers/CheckboxGroup/index.d.ts.map +0 -1
  250. package/dist/wrappers/CheckboxGroup/types.d.ts +0 -106
  251. package/dist/wrappers/CheckboxGroup/types.d.ts.map +0 -1
  252. package/dist/wrappers/DatePickerElement/DatePickerElement.d.ts +0 -131
  253. package/dist/wrappers/DatePickerElement/DatePickerElement.d.ts.map +0 -1
  254. package/dist/wrappers/DatePickerElement/DatePickerElementCore.d.ts +0 -57
  255. package/dist/wrappers/DatePickerElement/DatePickerElementCore.d.ts.map +0 -1
  256. package/dist/wrappers/DatePickerElement/hooks/index.d.ts +0 -24
  257. package/dist/wrappers/DatePickerElement/hooks/index.d.ts.map +0 -1
  258. package/dist/wrappers/DatePickerElement/hooks/useDatePickerStyles.d.ts +0 -63
  259. package/dist/wrappers/DatePickerElement/hooks/useDatePickerStyles.d.ts.map +0 -1
  260. package/dist/wrappers/DatePickerElement/hooks/useDatePickerValidation.d.ts +0 -79
  261. package/dist/wrappers/DatePickerElement/hooks/useDatePickerValidation.d.ts.map +0 -1
  262. package/dist/wrappers/DatePickerElement/hooks/useDatePickerValue.d.ts +0 -73
  263. package/dist/wrappers/DatePickerElement/hooks/useDatePickerValue.d.ts.map +0 -1
  264. package/dist/wrappers/DatePickerElement/index.d.ts +0 -47
  265. package/dist/wrappers/DatePickerElement/index.d.ts.map +0 -1
  266. package/dist/wrappers/DatePickerElement/types.d.ts +0 -183
  267. package/dist/wrappers/DatePickerElement/types.d.ts.map +0 -1
  268. package/dist/wrappers/DatePickerElement/utils.d.ts +0 -89
  269. package/dist/wrappers/DatePickerElement/utils.d.ts.map +0 -1
  270. package/dist/wrappers/DateTimePickerElement/index.d.ts +0 -1
  271. package/dist/wrappers/DateTimePickerElement/index.d.ts.map +0 -1
  272. package/dist/wrappers/DateTimePickerElement/types.d.ts +0 -1
  273. package/dist/wrappers/DateTimePickerElement/types.d.ts.map +0 -1
  274. package/dist/wrappers/Field/index.d.ts +0 -42
  275. package/dist/wrappers/Field/index.d.ts.map +0 -1
  276. package/dist/wrappers/NumberFieldElement/NumberFieldElement.d.ts +0 -177
  277. package/dist/wrappers/NumberFieldElement/NumberFieldElement.d.ts.map +0 -1
  278. package/dist/wrappers/NumberFieldElement/index.d.ts +0 -3
  279. package/dist/wrappers/NumberFieldElement/index.d.ts.map +0 -1
  280. package/dist/wrappers/OTPInputElement/HelperText.d.ts +0 -8
  281. package/dist/wrappers/OTPInputElement/HelperText.d.ts.map +0 -1
  282. package/dist/wrappers/OTPInputElement/OTPInputElement.d.ts +0 -32
  283. package/dist/wrappers/OTPInputElement/OTPInputElement.d.ts.map +0 -1
  284. package/dist/wrappers/OTPInputElement/index.d.ts +0 -3
  285. package/dist/wrappers/OTPInputElement/index.d.ts.map +0 -1
  286. package/dist/wrappers/PasswordElement/PasswordElement.d.ts +0 -104
  287. package/dist/wrappers/PasswordElement/PasswordElement.d.ts.map +0 -1
  288. package/dist/wrappers/PasswordElement/index.d.ts +0 -2
  289. package/dist/wrappers/PasswordElement/index.d.ts.map +0 -1
  290. package/dist/wrappers/RadioButtonGroup/RadioButtonGroup.d.ts +0 -38
  291. package/dist/wrappers/RadioButtonGroup/RadioButtonGroup.d.ts.map +0 -1
  292. package/dist/wrappers/RadioButtonGroup/index.d.ts +0 -2
  293. package/dist/wrappers/RadioButtonGroup/index.d.ts.map +0 -1
  294. package/dist/wrappers/SelectCascadeElement/SelectCascadeElement.d.ts +0 -22
  295. package/dist/wrappers/SelectCascadeElement/SelectCascadeElement.d.ts.map +0 -1
  296. package/dist/wrappers/SelectCascadeElement/index.d.ts +0 -2
  297. package/dist/wrappers/SelectCascadeElement/index.d.ts.map +0 -1
  298. package/dist/wrappers/SelectElement/SelectElement.d.ts +0 -93
  299. package/dist/wrappers/SelectElement/SelectElement.d.ts.map +0 -1
  300. package/dist/wrappers/SelectElement/index.d.ts +0 -2
  301. package/dist/wrappers/SelectElement/index.d.ts.map +0 -1
  302. package/dist/wrappers/SelectMultiElement/SelectMultiElement.d.ts +0 -21
  303. package/dist/wrappers/SelectMultiElement/SelectMultiElement.d.ts.map +0 -1
  304. package/dist/wrappers/SelectMultiElement/index.d.ts +0 -2
  305. package/dist/wrappers/SelectMultiElement/index.d.ts.map +0 -1
  306. package/dist/wrappers/TextFieldElement/TextFieldElement.d.ts +0 -179
  307. package/dist/wrappers/TextFieldElement/TextFieldElement.d.ts.map +0 -1
  308. package/dist/wrappers/TextFieldElement/index.d.ts +0 -3
  309. package/dist/wrappers/TextFieldElement/index.d.ts.map +0 -1
  310. package/dist/wrappers/TimePickerElement/TimePickerElement.d.ts +0 -30
  311. package/dist/wrappers/TimePickerElement/TimePickerElement.d.ts.map +0 -1
  312. package/dist/wrappers/TimePickerElement/index.d.ts +0 -2
  313. package/dist/wrappers/TimePickerElement/index.d.ts.map +0 -1
  314. package/dist/wrappers/index.cjs +0 -59
  315. package/dist/wrappers/index.d.ts +0 -15
  316. package/dist/wrappers/index.d.ts.map +0 -1
  317. package/dist/wrappers/index.js +0 -59
  318. package/dist/wrappers/types/common.d.ts +0 -87
  319. package/dist/wrappers/types/common.d.ts.map +0 -1
  320. package/dist/wrappers/types/index.d.ts +0 -8
  321. package/dist/wrappers/types/index.d.ts.map +0 -1
@@ -1,523 +0,0 @@
1
- // src/utils/flattenObjectKeys.ts
2
- var isNested = (obj) => typeof obj === "object" && obj !== null && !Array.isArray(obj);
3
- var isArray = (obj) => Array.isArray(obj);
4
- var flattenObjectKeys = (obj, prefix = "") => {
5
- if (!isNested(obj)) {
6
- return {
7
- [prefix]: obj
8
- };
9
- }
10
- return Object.keys(obj).reduce((acc, key) => {
11
- const currentPrefix = prefix.length ? `${prefix}.` : "";
12
- if (isNested(obj[key]) && Object.keys(obj[key]).length) {
13
- if (isArray(obj[key]) && obj[key].length) {
14
- obj[key].forEach((item, index) => {
15
- Object.assign(
16
- acc,
17
- flattenObjectKeys(item, `${currentPrefix + key}.${index}`)
18
- );
19
- });
20
- } else {
21
- Object.assign(acc, flattenObjectKeys(obj[key], currentPrefix + key));
22
- }
23
- acc[currentPrefix + key] = obj[key];
24
- } else {
25
- acc[currentPrefix + key] = obj[key];
26
- }
27
- return acc;
28
- }, {});
29
- };
30
-
31
- // src/utils/getTimezone.ts
32
- function getTimezone(adapter, value) {
33
- return value == null || !adapter.utils.isValid(value) ? null : adapter.utils.getTimezone(value);
34
- }
35
-
36
- // src/utils/handleServerErrors.ts
37
- var handleServerErrors = function handleServerErrors2(args) {
38
- const { errors, setError } = args;
39
- for (const key in errors) {
40
- const isKeyInVariables = Object.keys(flattenObjectKeys(errors)).includes(
41
- key
42
- );
43
- if (!isKeyInVariables) {
44
- continue;
45
- }
46
- const fieldError = errors[key];
47
- let errorMessage = "";
48
- if (Array.isArray(fieldError)) {
49
- errorMessage = fieldError.join(" ");
50
- }
51
- if (typeof fieldError === "string") {
52
- errorMessage = fieldError;
53
- }
54
- if (typeof fieldError === "boolean" && fieldError) {
55
- errorMessage = "Field is not valid.";
56
- }
57
- setError(key, {
58
- message: errorMessage
59
- });
60
- }
61
- };
62
-
63
- // src/utils/propertyExists.ts
64
- function propertyExists(obj, prop) {
65
- return typeof obj === "object" && obj !== null && Object.prototype.hasOwnProperty.call(obj, prop);
66
- }
67
-
68
- // src/utils/removeLeadingTrailingSlashes.ts
69
- var removeLeadingTrailingSlashes = (route) => {
70
- return route.replace(/^\/|\/$/g, "");
71
- };
72
-
73
- // src/utils/schemaTools.ts
74
- import dayjs from "dayjs";
75
- import { z } from "zod";
76
- function isValidLuhn(value) {
77
- if (!value || value.trim() === "") {
78
- return false;
79
- }
80
- const number = value.replace(/[\s-]/g, "");
81
- if (!/^\d+$/.test(number)) {
82
- return false;
83
- }
84
- if (number.length < 13 || number.length > 19) {
85
- return false;
86
- }
87
- let sum = 0;
88
- let alternate = false;
89
- for (let i = number.length - 1; i >= 0; i--) {
90
- let digit = parseInt(number.charAt(i), 10);
91
- if (alternate) {
92
- digit *= 2;
93
- if (digit > 9) {
94
- digit -= 9;
95
- }
96
- }
97
- sum += digit;
98
- alternate = !alternate;
99
- }
100
- return sum % 10 === 0;
101
- }
102
- var schemaTools = {
103
- // Date validations
104
- date: ({ message } = {}) => z.coerce.string().transform((c) => c === "null" || c === "undefined" ? null : c).refine((c) => !!c, { message: message || "Date is required" }).refine((c) => c ? dayjs(c).isValid() : true, {
105
- message: message || "Invalid date"
106
- }),
107
- nullableDate: ({ message } = {}) => z.coerce.string().transform((c) => c === "null" ? null : c).transform((c) => c === "undefined" ? null : c).refine((c) => !c && c !== null ? dayjs(c).isValid() : true, {
108
- message: message || "Invalid date"
109
- }),
110
- pastDate: ({ message } = {}) => z.coerce.date().refine((date) => date < /* @__PURE__ */ new Date(), {
111
- message: message || "Must be a past date"
112
- }),
113
- futureDate: ({ message } = {}) => z.coerce.date().refine((date) => date > /* @__PURE__ */ new Date(), {
114
- message: message || "Must be a future date"
115
- }),
116
- todayOrFutureDate: ({ message } = {}) => z.coerce.date().refine(
117
- (date) => {
118
- const today = /* @__PURE__ */ new Date();
119
- today.setHours(0, 0, 0, 0);
120
- return date.setHours(0, 0, 0, 0) >= today.getTime();
121
- },
122
- { message: message || "Must be today or a future date" }
123
- ),
124
- todayOrPastDate: ({ message } = {}) => z.coerce.date().refine(
125
- (date) => {
126
- const today = /* @__PURE__ */ new Date();
127
- today.setHours(0, 0, 0, 0);
128
- return date.setHours(0, 0, 0, 0) <= today.getTime();
129
- },
130
- { message: message || "Must be today or a past date" }
131
- ),
132
- adult: ({ message } = {}) => z.coerce.date().refine(
133
- (date) => {
134
- const eighteenYearsAgo = /* @__PURE__ */ new Date();
135
- eighteenYearsAgo.setFullYear(eighteenYearsAgo.getFullYear() - 18);
136
- eighteenYearsAgo.setHours(0, 0, 0, 0);
137
- const dob = new Date(date);
138
- dob.setHours(0, 0, 0, 0);
139
- return dob <= eighteenYearsAgo;
140
- },
141
- { message: message || "Must be at least 18 years old" }
142
- ),
143
- minimumAge: ({
144
- message,
145
- minimumAge
146
- } = {}) => z.coerce.date().refine(
147
- (date) => {
148
- if (typeof minimumAge !== "number") return false;
149
- const minYearsAgo = /* @__PURE__ */ new Date();
150
- minYearsAgo.setFullYear(minYearsAgo.getFullYear() - minimumAge);
151
- minYearsAgo.setHours(0, 0, 0, 0);
152
- const dob = new Date(date);
153
- dob.setHours(0, 0, 0, 0);
154
- return dob <= minYearsAgo;
155
- },
156
- {
157
- message: message || `Must be at least ${minimumAge ?? "the required"} years old`
158
- }
159
- ),
160
- withinDays: ({ message, days } = {}) => z.coerce.date().refine(
161
- (date) => {
162
- const today = /* @__PURE__ */ new Date();
163
- today.setHours(0, 0, 0, 0);
164
- const inputDate = new Date(date);
165
- inputDate.setHours(0, 0, 0, 0);
166
- const diffTime = Math.abs(inputDate.getTime() - today.getTime());
167
- const diffDays = Math.ceil(diffTime / (1e3 * 60 * 60 * 24));
168
- return typeof days === "number" ? diffDays <= days : false;
169
- },
170
- { message: message || `Must be within ${days} days of today` }
171
- ),
172
- weekday: ({ message } = {}) => z.coerce.date().refine(
173
- (date) => {
174
- const day = date.getDay();
175
- return day !== 0 && day !== 6;
176
- },
177
- { message: message || "Must be a weekday" }
178
- ),
179
- dateRange: ({ message } = {}) => z.object({
180
- start: z.coerce.date(),
181
- end: z.coerce.date()
182
- }).refine((data) => data.start <= data.end, {
183
- message: message || "Start date must be before or equal to end date"
184
- }),
185
- // String validations
186
- requiredString: ({
187
- message,
188
- min,
189
- max
190
- } = {}) => z.string().trim().min(
191
- min || 1,
192
- message || `String must be at least ${min || 1} characters`
193
- ).max(
194
- max || 255,
195
- message || `String must be at most ${max || 255} characters`
196
- ),
197
- email: ({ message } = {}) => z.string().email(message || "Invalid email address").max(254, "Email must be at most 254 characters"),
198
- url: ({ message } = {}) => z.string().url(message || "Invalid URL format"),
199
- phone: ({ message } = {}) => z.string().regex(/^[+]?[1-9][\d]{0,15}$/, message || "Invalid phone number format"),
200
- creditCard: ({ message } = {}) => z.string().refine((value) => isValidLuhn(value), {
201
- message: message || "Must be a valid credit card number"
202
- }),
203
- indianMobile: ({ message } = {}) => z.string().regex(/^[6-9]\d{9}$/, message || "Must be a valid Indian mobile number"),
204
- internationalPhone: ({ message } = {}) => z.string().regex(
205
- /^\+?[1-9]\d{6,14}$/,
206
- message || "Must be a valid international phone number"
207
- ),
208
- alphabetic: ({ message } = {}) => z.string().regex(
209
- /^[A-Za-z, ]+$/,
210
- message || "Must contain only letters, commas, and spaces"
211
- ),
212
- guid: ({ message } = {}) => z.string().uuid(message || "Must be a valid GUID"),
213
- nonEmptyOrWhitespace: ({ message } = {}) => z.string().trim().min(1, message || "Must not be empty or whitespace"),
214
- username: ({ message } = {}) => z.string().regex(
215
- /^[a-zA-Z][a-zA-Z0-9_]{2,29}$/,
216
- message || "Must be 3-30 characters, start with a letter, and contain only letters, numbers, and underscores"
217
- ),
218
- exactLength: ({
219
- message,
220
- length
221
- } = {}) => {
222
- if (typeof length !== "number") {
223
- throw new Error("Length must be provided for exactLength validator");
224
- }
225
- return z.string().length(length, message || `Must be exactly ${length} characters`);
226
- },
227
- minWords: ({
228
- message,
229
- minWords
230
- } = {}) => z.string().refine(
231
- (value) => {
232
- if (!value) return true;
233
- const words = value.split(/[\s\t\n\r]+/).filter(Boolean);
234
- return words.length >= (typeof minWords === "number" ? minWords : 0);
235
- },
236
- { message: message || `Must have at least ${minWords} word(s)` }
237
- ),
238
- maxWords: ({
239
- message,
240
- maxWords
241
- } = {}) => z.string().refine(
242
- (value) => {
243
- if (!value) return true;
244
- const words = value.split(/[\s\t\n\r]+/).filter(Boolean);
245
- return words.length <= (typeof maxWords === "number" ? maxWords : 0);
246
- },
247
- { message: message || `Must have at most ${maxWords} word(s)` }
248
- ),
249
- strongPassword: ({ message } = {}) => z.string().regex(
250
- /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/,
251
- message || "Must be at least 8 characters and contain uppercase, lowercase, number, and special character"
252
- ),
253
- noHtml: ({ message } = {}) => z.string().refine(
254
- (value) => !value || !/<[^>]*>/.test(value),
255
- message || "Must not contain HTML tags"
256
- ),
257
- noScriptInjection: ({ message } = {}) => z.string().refine(
258
- (value) => !value || !/<script|javascript:|on\w+\s*=/i.test(value),
259
- message || "Contains potentially unsafe content"
260
- ),
261
- noSqlInjection: ({ message } = {}) => z.string().refine(
262
- (value) => !value || !/('|--|;|\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|ALTER|CREATE|EXEC|EXECUTE)\b)/i.test(
263
- value
264
- ),
265
- message || "Contains potentially unsafe content"
266
- ),
267
- indianPinCode: ({ message } = {}) => z.string().regex(/^[1-9][0-9]{5}$/, message || "Must be a valid 6-digit PIN code"),
268
- usZipCode: ({ message } = {}) => z.string().regex(/^\d{5}(-\d{4})?$/, message || "Must be a valid US ZIP code"),
269
- ukPostalCode: ({ message } = {}) => z.string().regex(
270
- /^[A-Z]{1,2}[0-9][0-9A-Z]?\s?[0-9][A-Z]{2}$/i,
271
- message || "Must be a valid UK postal code"
272
- ),
273
- ipv4: ({ message } = {}) => z.string().regex(
274
- /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,
275
- message || "Must be a valid IPv4 address"
276
- ),
277
- ipv6: ({ message } = {}) => z.string().regex(
278
- /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::$|^::1$|^([0-9a-fA-F]{1,4}:){1,7}:$/,
279
- message || "Must be a valid IPv6 address"
280
- ),
281
- macAddress: ({ message } = {}) => z.string().regex(
282
- /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/,
283
- message || "Must be a valid MAC address"
284
- ),
285
- allowedFileExtension: ({
286
- message,
287
- allowedExtensions
288
- } = {}) => z.string().refine(
289
- (fileName) => {
290
- if (!fileName) return true;
291
- const extension = fileName.split(".").pop()?.toLowerCase();
292
- const lowerAllowed = allowedExtensions?.map(
293
- (ext) => ext.toLowerCase().startsWith(".") ? ext.toLowerCase() : `.${ext.toLowerCase()}`
294
- );
295
- return extension && lowerAllowed?.includes(`.${extension}`);
296
- },
297
- {
298
- message: message || `Must have one of the following extensions: ${allowedExtensions?.join(", ")}`
299
- }
300
- ),
301
- validImageExtension: ({ message } = {}) => schemaTools.allowedFileExtension({
302
- allowedExtensions: [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"],
303
- message: message || "Must have a valid image extension (.jpg, .jpeg, .png, .gif, .bmp, .webp)"
304
- }),
305
- validDocumentExtension: ({ message } = {}) => schemaTools.allowedFileExtension({
306
- allowedExtensions: [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".txt"],
307
- message: message || "Must have a valid document extension (.pdf, .doc, .docx, .xls, .xlsx, .txt)"
308
- }),
309
- panCard: ({ message } = {}) => z.string().regex(
310
- /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/,
311
- message || "Must be a valid PAN card number"
312
- ),
313
- aadhaar: ({ message } = {}) => z.string().regex(
314
- /^[2-9]{1}[0-9]{11}$/,
315
- message || "Must be a valid Aadhaar number"
316
- ),
317
- gstin: ({ message } = {}) => z.string().regex(
318
- /^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z]{1}[1-9A-Z]{1}Z[0-9A-Z]{1}$/,
319
- message || "Must be a valid GSTIN"
320
- ),
321
- ifsc: ({ message } = {}) => z.string().regex(/^[A-Z]{4}0[A-Z0-9]{6}$/, message || "Must be a valid IFSC code"),
322
- alphanumeric: ({ message } = {}) => z.string().regex(
323
- /^[a-zA-Z0-9]+$/,
324
- message || "Only letters and numbers are allowed"
325
- ),
326
- slug: ({ message } = {}) => z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, message || "Invalid slug format"),
327
- // Number validations
328
- positiveNumber: ({
329
- message,
330
- min,
331
- max
332
- } = {}) => z.number().positive(message || "Number must be positive").min(min || 0.01, `Number must be at least ${min || 0.01}`).max(
333
- max || Number.MAX_SAFE_INTEGER,
334
- `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`
335
- ),
336
- maxDecimalPlaces: ({
337
- message,
338
- maxPlaces
339
- } = {}) => z.number().refine(
340
- (value) => {
341
- if (value === null || value === void 0) return true;
342
- const decimalPart = value.toString().split(".")[1];
343
- return !decimalPart || decimalPart.length <= (typeof maxPlaces === "number" ? maxPlaces : 0);
344
- },
345
- { message: message || `Must have at most ${maxPlaces} decimal places` }
346
- ),
347
- currency: ({ message } = {}) => z.number().min(0, message || "Must be a valid currency amount (positive)").refine(
348
- (value) => {
349
- if (value === null || value === void 0) return true;
350
- const decimalPart = value.toString().split(".")[1];
351
- return !decimalPart || decimalPart.length <= 2;
352
- },
353
- {
354
- message: message || "Must be a valid currency amount (max 2 decimal places)"
355
- }
356
- ),
357
- validAge: ({ message } = {}) => z.number().int("Must be an integer").min(0, message || "Must be a valid age (between 0 and 150)").max(150, message || "Must be a valid age (between 0 and 150)"),
358
- nonNegativeNumber: ({
359
- message,
360
- max
361
- } = {}) => z.number().min(0, message || "Number must be non-negative").max(
362
- max || Number.MAX_SAFE_INTEGER,
363
- `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`
364
- ),
365
- integer: ({
366
- message,
367
- min,
368
- max
369
- } = {}) => z.number().int(message || "Must be an integer").min(
370
- min || Number.MIN_SAFE_INTEGER,
371
- `Number must be at least ${min || Number.MIN_SAFE_INTEGER}`
372
- ).max(
373
- max || Number.MAX_SAFE_INTEGER,
374
- `Number must be at most ${max || Number.MAX_SAFE_INTEGER}`
375
- ),
376
- percentage: ({ message } = {}) => z.number().min(0, message || "Percentage must be between 0 and 100").max(100, message || "Percentage must be between 0 and 100"),
377
- // Array validations
378
- nonEmptyArray: (schema, { message } = {}) => z.array(schema).min(1, message || "At least one item is required"),
379
- uniqueArray: (schema, { message } = {}) => z.array(schema).refine((items) => new Set(items).size === items.length, {
380
- message: message || "All items must be unique"
381
- }),
382
- noNullArrayItems: (schema, { message } = {}) => z.array(schema.nullable()).refine((items) => items.every((item) => item !== null), {
383
- message: message || "Must not contain null items"
384
- }),
385
- // Boolean validations
386
- requiredBoolean: ({ message } = {}) => z.boolean({
387
- message: message || "This field is required"
388
- }),
389
- // Object validations
390
- nonEmptyObject: (schema, { message } = {}) => schema.refine((obj) => Object.keys(obj).length > 0, {
391
- message: message || "Object cannot be empty"
392
- }),
393
- // File validations
394
- requiredFile: ({ message } = {}) => z.instanceof(File, { message: message || "File is required" }).refine((file) => file.size > 0, {
395
- message: message || "File cannot be empty"
396
- }),
397
- fileSize: ({ maxSize, message }) => z.instanceof(File).refine((file) => file.size <= maxSize, {
398
- message: message || `File size must be less than ${Math.round(maxSize / 1024 / 1024)}MB`
399
- }),
400
- fileType: ({
401
- allowedTypes,
402
- message
403
- }) => z.instanceof(File).refine((file) => allowedTypes.includes(file.type), {
404
- message: message || `File type must be one of: ${allowedTypes.join(", ")}`
405
- }),
406
- // Custom validators
407
- conditional: (condition, trueSchema, falseSchema) => z.union([trueSchema, falseSchema]).superRefine((data, ctx) => {
408
- const shouldUseTrue = condition(data);
409
- const schema = shouldUseTrue ? trueSchema : falseSchema;
410
- const result = schema.safeParse(data);
411
- if (!result.success) {
412
- ctx.addIssue({
413
- code: z.ZodIssueCode.custom,
414
- message: result.error.message
415
- });
416
- }
417
- }),
418
- transform: {
419
- toLowerCase: z.string().transform((val) => val.toLowerCase()),
420
- toUpperCase: z.string().transform((val) => val.toUpperCase()),
421
- trim: z.string().transform((val) => val.trim()),
422
- toNumber: z.string().transform((val) => Number(val)),
423
- toBoolean: z.string().transform((val) => val === "true"),
424
- parseJson: (schema) => z.string().transform((val, ctx) => {
425
- try {
426
- const parsed = JSON.parse(val);
427
- const result = schema.safeParse(parsed);
428
- if (result.success) return result.data;
429
- ctx.addIssue({
430
- code: z.ZodIssueCode.custom,
431
- message: result.error.message
432
- });
433
- return z.NEVER;
434
- } catch {
435
- ctx.addIssue({
436
- code: z.ZodIssueCode.custom,
437
- message: "Invalid JSON"
438
- });
439
- return z.NEVER;
440
- }
441
- })
442
- }
443
- };
444
-
445
- // src/utils/typeGuards.ts
446
- function isRecord(value) {
447
- return typeof value === "object" && value !== null && !Array.isArray(value);
448
- }
449
- function hasProperty(obj, key) {
450
- return isRecord(obj) && key in obj;
451
- }
452
- function isNonEmptyString(value) {
453
- return typeof value === "string" && value.length > 0;
454
- }
455
- function isArray2(value) {
456
- return Array.isArray(value);
457
- }
458
- function isNonEmptyArray(value) {
459
- return Array.isArray(value) && value.length > 0;
460
- }
461
- function isFunction(value) {
462
- return typeof value === "function";
463
- }
464
- function isString(value) {
465
- return typeof value === "string";
466
- }
467
- function isNumber(value) {
468
- return typeof value === "number" && !isNaN(value);
469
- }
470
- function isBoolean(value) {
471
- return typeof value === "boolean";
472
- }
473
- function isNull(value) {
474
- return value === null;
475
- }
476
- function isUndefined(value) {
477
- return value === void 0;
478
- }
479
- function isNullish(value) {
480
- return value === null || value === void 0;
481
- }
482
- function isDefined(value) {
483
- return value !== null && value !== void 0;
484
- }
485
- function isDate(value) {
486
- return value instanceof Date && !isNaN(value.getTime());
487
- }
488
- function isPromise(value) {
489
- return value instanceof Promise || isRecord(value) && typeof value.then === "function";
490
- }
491
- function isError(error) {
492
- return error instanceof Error;
493
- }
494
- function matches(value, validator) {
495
- return validator(value);
496
- }
497
-
498
- export {
499
- flattenObjectKeys,
500
- getTimezone,
501
- handleServerErrors,
502
- propertyExists,
503
- removeLeadingTrailingSlashes,
504
- schemaTools,
505
- isRecord,
506
- hasProperty,
507
- isNonEmptyString,
508
- isArray2 as isArray,
509
- isNonEmptyArray,
510
- isFunction,
511
- isString,
512
- isNumber,
513
- isBoolean,
514
- isNull,
515
- isUndefined,
516
- isNullish,
517
- isDefined,
518
- isDate,
519
- isPromise,
520
- isError,
521
- matches
522
- };
523
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWxzL2ZsYXR0ZW5PYmplY3RLZXlzLnRzIiwgIi4uL3NyYy91dGlscy9nZXRUaW1lem9uZS50cyIsICIuLi9zcmMvdXRpbHMvaGFuZGxlU2VydmVyRXJyb3JzLnRzIiwgIi4uL3NyYy91dGlscy9wcm9wZXJ0eUV4aXN0cy50cyIsICIuLi9zcmMvdXRpbHMvcmVtb3ZlTGVhZGluZ1RyYWlsaW5nU2xhc2hlcy50cyIsICIuLi9zcmMvdXRpbHMvc2NoZW1hVG9vbHMudHMiLCAiLi4vc3JjL3V0aWxzL3R5cGVHdWFyZHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBuZXN0ZWQgb2JqZWN0IChub3QgbnVsbCBhbmQgbm90IGFuIGFycmF5KS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIG5lc3RlZCBvYmplY3RcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgaXNOZXN0ZWQgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IFxuICB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIG9iaiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGFuIGFycmF5LlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5XG4gKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IGlzQXJyYXkgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIHVua25vd25bXSA9PiBBcnJheS5pc0FycmF5KG9iaik7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgZmxhdHRlbnMgYW4gb2JqZWN0IGludG8gYSBmbGF0IHN0cnVjdHVyZSB3aXRoIGRvdC1ub3RhdGlvbiBrZXlzLlxuICpcbiAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiB0YWtlcyBhIG5lc3RlZCBvYmplY3QgYW5kIGNvbnZlcnRzIGl0IGludG8gYSBmbGF0IG9iamVjdFxuICogd2hlcmUgbmVzdGVkIHByb3BlcnRpZXMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGRvdCBub3RhdGlvbi4gSXQgaGFuZGxlcyBib3RoXG4gKiBuZXN0ZWQgb2JqZWN0cyBhbmQgYXJyYXlzLCBwcmVzZXJ2aW5nIGFsbCBsZXZlbHMgb2YgdGhlIG9yaWdpbmFsIHN0cnVjdHVyZVxuICogYXMgc2VwYXJhdGUga2V5cyBpbiB0aGUgcmVzdWx0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyBvYmplY3QgZmxhdHRlbmluZzpcbiAqIGBgYHRzeFxuICogY29uc3QgbmVzdGVkID0ge1xuICogICB1c2VyOiB7XG4gKiAgICAgbmFtZTogJ0pvaG4nLFxuICogICAgIGFkZHJlc3M6IHtcbiAqICAgICAgIGNpdHk6ICdOZXcgWW9yaycsXG4gKiAgICAgICB6aXA6ICcxMDAwMSdcbiAqICAgICB9XG4gKiAgIH1cbiAqIH07XG4gKlxuICogY29uc3QgZmxhdHRlbmVkID0gZmxhdHRlbk9iamVjdEtleXMobmVzdGVkKTtcbiAqIC8vIFJlc3VsdDpcbiAqIC8vIHtcbiAqIC8vICAgJ3VzZXInOiB7IG5hbWU6ICdKb2huJywgYWRkcmVzczogeyBjaXR5OiAnTmV3IFlvcmsnLCB6aXA6ICcxMDAwMScgfSB9LFxuICogLy8gICAndXNlci5uYW1lJzogJ0pvaG4nLFxuICogLy8gICAndXNlci5hZGRyZXNzJzogeyBjaXR5OiAnTmV3IFlvcmsnLCB6aXA6ICcxMDAwMScgfSxcbiAqIC8vICAgJ3VzZXIuYWRkcmVzcy5jaXR5JzogJ05ldyBZb3JrJyxcbiAqIC8vICAgJ3VzZXIuYWRkcmVzcy56aXAnOiAnMTAwMDEnXG4gKiAvLyB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQXJyYXkgaGFuZGxpbmc6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHdpdGhBcnJheXMgPSB7XG4gKiAgIGl0ZW1zOiBbXG4gKiAgICAgeyBpZDogMSwgbmFtZTogJ0l0ZW0gMScgfSxcbiAqICAgICB7IGlkOiAyLCBuYW1lOiAnSXRlbSAyJyB9XG4gKiAgIF1cbiAqIH07XG4gKlxuICogY29uc3QgZmxhdHRlbmVkID0gZmxhdHRlbk9iamVjdEtleXMod2l0aEFycmF5cyk7XG4gKiAvLyBSZXN1bHQgaW5jbHVkZXM6XG4gKiAvLyB7XG4gKiAvLyAgICdpdGVtcyc6IFsuLi5dLFxuICogLy8gICAnaXRlbXMuMCc6IHsgaWQ6IDEsIG5hbWU6ICdJdGVtIDEnIH0sXG4gKiAvLyAgICdpdGVtcy4wLmlkJzogMSxcbiAqIC8vICAgJ2l0ZW1zLjAubmFtZSc6ICdJdGVtIDEnLFxuICogLy8gICAnaXRlbXMuMSc6IHsgaWQ6IDIsIG5hbWU6ICdJdGVtIDInIH0sXG4gKiAvLyAgICdpdGVtcy4xLmlkJzogMixcbiAqIC8vICAgJ2l0ZW1zLjEubmFtZSc6ICdJdGVtIDInXG4gKiAvLyB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBmbGF0dGVuXG4gKiBAcGFyYW0gcHJlZml4IC0gSW50ZXJuYWwgcGFyYW1ldGVyIGZvciBidWlsZGluZyBrZXkgcGF0aHMgKHVzZWQgaW4gcmVjdXJzaW9uKVxuICogQHJldHVybnMgQSBmbGF0IG9iamVjdCB3aXRoIGRvdC1ub3RhdGlvbiBrZXlzIHJlcHJlc2VudGluZyB0aGUgb3JpZ2luYWwgc3RydWN0dXJlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZmxhdHRlbk9iamVjdEtleXMgPSAob2JqOiB1bmtub3duLCBwcmVmaXggPSBcIlwiKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBpZiAoIWlzTmVzdGVkKG9iaikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgW3ByZWZpeF06IG9iaixcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRQcmVmaXggPSBwcmVmaXgubGVuZ3RoID8gYCR7cHJlZml4fS5gIDogXCJcIjtcblxuICAgIGlmIChpc05lc3RlZChvYmpba2V5XSkgJiYgT2JqZWN0LmtleXMob2JqW2tleV0pLmxlbmd0aCkge1xuICAgICAgaWYgKGlzQXJyYXkob2JqW2tleV0pICYmIG9ialtrZXldLmxlbmd0aCkge1xuICAgICAgICBvYmpba2V5XS5mb3JFYWNoKChpdGVtLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIGFjYyxcbiAgICAgICAgICAgIGZsYXR0ZW5PYmplY3RLZXlzKGl0ZW0sIGAke2N1cnJlbnRQcmVmaXggKyBrZXl9LiR7aW5kZXh9YClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYWNjLCBmbGF0dGVuT2JqZWN0S2V5cyhvYmpba2V5XSwgY3VycmVudFByZWZpeCArIGtleSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBFdmVuIGlmIGl0J3MgYSBuZXN0ZWQgb2JqZWN0LCBpdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIGtleSBhcyB3ZWxsXG4gICAgICBhY2NbY3VycmVudFByZWZpeCArIGtleV0gPSBvYmpba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW2N1cnJlbnRQcmVmaXggKyBrZXldID0gb2JqW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IFBpY2tlclZhbGlkRGF0ZSB9IGZyb20gXCJAbXVpL3gtZGF0ZS1waWNrZXJzXCI7XG5pbXBvcnQgdHlwZSB7IHVzZUxvY2FsaXphdGlvbkNvbnRleHQgfSBmcm9tIFwiQG11aS94LWRhdGUtcGlja2Vycy9pbnRlcm5hbHNcIjtcbmltcG9ydCB0eXBlIHsgRGF5anMgfSBmcm9tIFwiZGF5anNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWV6b25lPFREYXRlIGV4dGVuZHMgUGlja2VyVmFsaWREYXRlPihcbiAgYWRhcHRlcjogUmV0dXJuVHlwZTx0eXBlb2YgdXNlTG9jYWxpemF0aW9uQ29udGV4dD4sXG4gIHZhbHVlOiBURGF0ZVxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8ICFhZGFwdGVyLnV0aWxzLmlzVmFsaWQodmFsdWUgYXMgdW5rbm93biBhcyBEYXlqcylcbiAgICA/IG51bGxcbiAgICA6IGFkYXB0ZXIudXRpbHMuZ2V0VGltZXpvbmUodmFsdWUgYXMgdW5rbm93biBhcyBEYXlqcyk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBGaWVsZFZhbHVlcywgUGF0aCwgVXNlRm9ybVNldEVycm9yIH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHsgZmxhdHRlbk9iamVjdEtleXMgfSBmcm9tICcuL2ZsYXR0ZW5PYmplY3RLZXlzJztcblxuaW1wb3J0IHR5cGUgeyBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQC9jb3JlJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBoYW5kbGVTZXJ2ZXJFcnJvcnMgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5pbnRlcmZhY2UgSGFuZGxlU2VydmVyRXJyb3JzVHlwZTxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbj4ge1xuICAvKipcbiAgICogU2VydmVyIHZhbGlkYXRpb24gZXJyb3JzIG9iamVjdCBjb250YWluaW5nIGZpZWxkLXNwZWNpZmljIGVycm9yIG1lc3NhZ2VzXG4gICAqIEBleGFtcGxlIHsgZW1haWw6ICdFbWFpbCBpcyBhbHJlYWR5IHRha2VuJywgcGFzc3dvcmQ6IFsnVG9vIHNob3J0JywgJ011c3QgY29udGFpbiBudW1iZXJzJ10gfVxuICAgKi9cbiAgZXJyb3JzPzogVmFsaWRhdGlvbkVycm9ycztcbiAgLyoqXG4gICAqIFRoZSBzZXRFcnJvciBmdW5jdGlvbiBmcm9tIHJlYWN0LWhvb2stZm9ybSBmb3Igc2V0dGluZyBmaWVsZCBlcnJvcnNcbiAgICovXG4gIHNldEVycm9yOiBVc2VGb3JtU2V0RXJyb3I8VEZpZWxkVmFsdWVzPjtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgc2VydmVyIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBhcHBsaWVzIHRoZW0gdG8gcmVhY3QtaG9vay1mb3JtIGZpZWxkcy5cbiAqXG4gKiBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gdGFrZXMgdmFsaWRhdGlvbiBlcnJvcnMgZnJvbSBhIHNlcnZlciByZXNwb25zZSBhbmQgYXV0b21hdGljYWxseVxuICogYXBwbGllcyB0aGVtIHRvIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0gZmllbGRzIHVzaW5nIHJlYWN0LWhvb2stZm9ybSdzIHNldEVycm9yIGZ1bmN0aW9uLlxuICogSXQgc3VwcG9ydHMgdmFyaW91cyBlcnJvciBmb3JtYXRzIGluY2x1ZGluZyBzdHJpbmdzLCBhcnJheXMgb2Ygc3RyaW5ncywgYW5kIGJvb2xlYW4gZmxhZ3MuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHVzZXMgb2JqZWN0IGZsYXR0ZW5pbmcgdG8gaGFuZGxlIG5lc3RlZCBlcnJvciBzdHJ1Y3R1cmVzIGFuZCBlbnN1cmVzXG4gKiB0aGF0IG9ubHkgdmFsaWQgZmllbGQgcGF0aHMgYXJlIHByb2Nlc3NlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBzZXJ2ZXIgcmVzcG9uc2U6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgc2V0RXJyb3IgfSA9IHVzZUZvcm0oKTtcbiAqXG4gKiB0cnkge1xuICogICBhd2FpdCBzdWJtaXRGb3JtKGRhdGEpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaGFuZGxlU2VydmVyRXJyb3JzKHtcbiAqICAgICBlcnJvcnM6IGVycm9yLnJlc3BvbnNlLmRhdGEuZXJyb3JzLFxuICogICAgIHNldEVycm9yXG4gKiAgIH0pO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggZGlmZmVyZW50IGVycm9yIGZvcm1hdHM6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHNlcnZlckVycm9ycyA9IHtcbiAqICAgZW1haWw6ICdFbWFpbCBpcyBhbHJlYWR5IHRha2VuJyxcbiAqICAgcGFzc3dvcmQ6IFsnVG9vIHNob3J0JywgJ011c3QgY29udGFpbiBudW1iZXJzJ10sXG4gKiAgIHRlcm1zOiB0cnVlIC8vIEJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGludmFsaWRcbiAqIH07XG4gKlxuICogaGFuZGxlU2VydmVyRXJyb3JzKHsgZXJyb3JzOiBzZXJ2ZXJFcnJvcnMsIHNldEVycm9yIH0pO1xuICogLy8gUmVzdWx0cyBpbjpcbiAqIC8vIC0gZW1haWwgZmllbGQgc2hvd3M6IFwiRW1haWwgaXMgYWxyZWFkeSB0YWtlblwiXG4gKiAvLyAtIHBhc3N3b3JkIGZpZWxkIHNob3dzOiBcIlRvbyBzaG9ydCBNdXN0IGNvbnRhaW4gbnVtYmVyc1wiXG4gKiAvLyAtIHRlcm1zIGZpZWxkIHNob3dzOiBcIkZpZWxkIGlzIG5vdCB2YWxpZC5cIlxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKlxuICogQHBhcmFtIGFyZ3MgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGVycm9ycyBhbmQgc2V0RXJyb3IgZnVuY3Rpb25cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVTZXJ2ZXJFcnJvcnMgPSBmdW5jdGlvbiBoYW5kbGVTZXJ2ZXJFcnJvcnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4+KGFyZ3M6IEhhbmRsZVNlcnZlckVycm9yc1R5cGU8VEZpZWxkVmFsdWVzPikge1xuICBjb25zdCB7IGVycm9ycywgc2V0RXJyb3IgfSA9IGFyZ3M7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gZXJyb3JzKSB7XG4gICAgY29uc3QgaXNLZXlJblZhcmlhYmxlcyA9IE9iamVjdC5rZXlzKGZsYXR0ZW5PYmplY3RLZXlzKGVycm9ycykpLmluY2x1ZGVzKFxuICAgICAga2V5XG4gICAgKTtcblxuICAgIGlmICghaXNLZXlJblZhcmlhYmxlcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRFcnJvciA9IGVycm9yc1trZXldO1xuXG4gICAgbGV0IGVycm9yTWVzc2FnZSA9ICcnO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRFcnJvcikpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IGZpZWxkRXJyb3Iuam9pbignICcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmllbGRFcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IGZpZWxkRXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaWVsZEVycm9yID09PSAnYm9vbGVhbicgJiYgZmllbGRFcnJvcikge1xuICAgICAgZXJyb3JNZXNzYWdlID0gJ0ZpZWxkIGlzIG5vdCB2YWxpZC4nO1xuICAgIH1cblxuICAgIHNldEVycm9yKGtleSBhcyBQYXRoPFRGaWVsZFZhbHVlcz4sIHtcbiAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICB9KTtcbiAgfVxufTtcbiIsICIvKipcbiAqIFR5cGUtc2FmZSBwcm9wZXJ0eSBleGlzdGVuY2UgY2hlY2tlciB0aGF0IGFjdHMgYXMgYSB0eXBlIGd1YXJkLlxuICpcbiAqIENoZWNrcyBpZiBhIGdpdmVuIHByb3BlcnR5IGV4aXN0cyBvbiBhbiBvYmplY3QgYW5kIG5hcnJvd3MgdGhlIFR5cGVTY3JpcHQgdHlwZVxuICogdG8gaW5jbHVkZSB0aGF0IHByb3BlcnR5LiBUaGlzIGlzIHVzZWZ1bCBmb3Igc2FmZWx5IGFjY2Vzc2luZyBwcm9wZXJ0aWVzIG9uXG4gKiBvYmplY3RzIG9mIHVua25vd24gc3RydWN0dXJlIHdoaWxlIG1haW50YWluaW5nIHR5cGUgc2FmZXR5LlxuICpcbiAqIEB0ZW1wbGF0ZSBYIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdCBiZWluZyBjaGVja2VkXG4gKiBAdGVtcGxhdGUgWSAtIFRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eSBrZXkgKGV4dGVuZHMgUHJvcGVydHlLZXkpXG4gKlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIHRoZSBwcm9wZXJ0eVxuICogQHBhcmFtIHByb3AgLSBUaGUgcHJvcGVydHkga2V5IHRvIGNoZWNrIGZvciBleGlzdGVuY2VcbiAqXG4gKiBAcmV0dXJucyBBIHR5cGUgcHJlZGljYXRlIGluZGljYXRpbmcgd2hldGhlciB0aGUgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSBvYmplY3QuXG4gKiAgICAgICAgICBJZiB0cnVlLCB0aGUgb2JqZWN0IHR5cGUgaXMgbmFycm93ZWQgdG8gaW5jbHVkZSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkYXRhOiB1bmtub3duID0geyBuYW1lOiBcIkpvaG5cIiwgYWdlOiAzMCB9O1xuICpcbiAqIGlmIChwcm9wZXJ0eUV4aXN0cyhkYXRhLCBcIm5hbWVcIikpIHtcbiAqICAgLy8gVHlwZVNjcmlwdCBub3cga25vd3MgZGF0YSBoYXMgYSAnbmFtZScgcHJvcGVydHlcbiAqICAgY29uc29sZS5sb2coZGF0YS5uYW1lKTsgLy8gVHlwZS1zYWZlIGFjY2Vzc1xuICogfVxuICpcbiAqIC8vIENoZWNrIGZvciBuZXN0ZWQgcHJvcGVydHkgZXhpc3RlbmNlXG4gKiBpZiAocHJvcGVydHlFeGlzdHMob2JqLCBcInVzZXJcIikgJiYgcHJvcGVydHlFeGlzdHMob2JqLnVzZXIsIFwiaWRcIikpIHtcbiAqICAgY29uc29sZS5sb2cob2JqLnVzZXIuaWQpOyAvLyBTYWZlIG5lc3RlZCBhY2Nlc3NcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBzaW5jZSAyLjE4LjQ1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eUV4aXN0czxYLCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICBvYmo6IFgsXG4gIHByb3A6IFlcbik6IG9iaiBpcyBYICYgUmVjb3JkPFksIHVua25vd24+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJlxuICAgIG9iaiAhPT0gbnVsbCAmJlxuICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApXG4gICk7XG59XG4iLCAiZXhwb3J0IGNvbnN0IHJlbW92ZUxlYWRpbmdUcmFpbGluZ1NsYXNoZXMgPSAocm91dGU6IHN0cmluZykgPT4ge1xuICByZXR1cm4gcm91dGUucmVwbGFjZSgvXlxcL3xcXC8kL2csIFwiXCIpO1xufTtcbiIsICJpbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiBmb3IgTHVobiBhbGdvcml0aG0gdmFsaWRhdGlvblxuZnVuY3Rpb24gaXNWYWxpZEx1aG4odmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIXZhbHVlIHx8IHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBudW1iZXIgPSB2YWx1ZS5yZXBsYWNlKC9bXFxzLV0vZywgJycpO1xuXG4gIGlmICghL15cXGQrJC8udGVzdChudW1iZXIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG51bWJlci5sZW5ndGggPCAxMyB8fCBudW1iZXIubGVuZ3RoID4gMTkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgc3VtID0gMDtcbiAgbGV0IGFsdGVybmF0ZSA9IGZhbHNlO1xuXG4gIGZvciAobGV0IGkgPSBudW1iZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBsZXQgZGlnaXQgPSBwYXJzZUludChudW1iZXIuY2hhckF0KGkpLCAxMCk7XG5cbiAgICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgICBkaWdpdCAqPSAyO1xuICAgICAgaWYgKGRpZ2l0ID4gOSkge1xuICAgICAgICBkaWdpdCAtPSA5O1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1bSArPSBkaWdpdDtcbiAgICBhbHRlcm5hdGUgPSAhYWx0ZXJuYXRlO1xuICB9XG5cbiAgcmV0dXJuIHN1bSAlIDEwID09PSAwO1xufVxuXG5leHBvcnQgY29uc3Qgc2NoZW1hVG9vbHMgPSB7XG4gIC8vIERhdGUgdmFsaWRhdGlvbnNcbiAgZGF0ZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouY29lcmNlXG4gICAgICAuc3RyaW5nKClcbiAgICAgIC50cmFuc2Zvcm0oYyA9PiAoYyA9PT0gJ251bGwnIHx8IGMgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IGMpKVxuICAgICAgLnJlZmluZShjID0+ICEhYywgeyBtZXNzYWdlOiBtZXNzYWdlIHx8ICdEYXRlIGlzIHJlcXVpcmVkJyB9KVxuICAgICAgLnJlZmluZShjID0+IChjID8gZGF5anMoYykuaXNWYWxpZCgpIDogdHJ1ZSksIHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnSW52YWxpZCBkYXRlJyxcbiAgICAgIH0pLFxuXG4gIG51bGxhYmxlRGF0ZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouY29lcmNlXG4gICAgICAuc3RyaW5nKClcbiAgICAgIC50cmFuc2Zvcm0oYyA9PiAoYyA9PT0gJ251bGwnID8gbnVsbCA6IGMpKVxuICAgICAgLnRyYW5zZm9ybShjID0+IChjID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiBjKSlcbiAgICAgIC5yZWZpbmUoYyA9PiAoIWMgJiYgYyAhPT0gbnVsbCA/IGRheWpzKGMpLmlzVmFsaWQoKSA6IHRydWUpLCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ0ludmFsaWQgZGF0ZScsXG4gICAgICB9KSxcblxuICBwYXN0RGF0ZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouY29lcmNlLmRhdGUoKS5yZWZpbmUoZGF0ZSA9PiBkYXRlIDwgbmV3IERhdGUoKSwge1xuICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnTXVzdCBiZSBhIHBhc3QgZGF0ZScsXG4gICAgfSksXG5cbiAgZnV0dXJlRGF0ZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouY29lcmNlLmRhdGUoKS5yZWZpbmUoZGF0ZSA9PiBkYXRlID4gbmV3IERhdGUoKSwge1xuICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnTXVzdCBiZSBhIGZ1dHVyZSBkYXRlJyxcbiAgICB9KSxcblxuICB0b2RheU9yRnV0dXJlRGF0ZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouY29lcmNlLmRhdGUoKS5yZWZpbmUoXG4gICAgICBkYXRlID0+IHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgICAgIHJldHVybiBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApID49IHRvZGF5LmdldFRpbWUoKTtcbiAgICAgIH0sXG4gICAgICB7IG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ011c3QgYmUgdG9kYXkgb3IgYSBmdXR1cmUgZGF0ZScgfVxuICAgICksXG5cbiAgdG9kYXlPclBhc3REYXRlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5jb2VyY2UuZGF0ZSgpLnJlZmluZShcbiAgICAgIGRhdGUgPT4ge1xuICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgdG9kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCkgPD0gdG9kYXkuZ2V0VGltZSgpO1xuICAgICAgfSxcbiAgICAgIHsgbWVzc2FnZTogbWVzc2FnZSB8fCAnTXVzdCBiZSB0b2RheSBvciBhIHBhc3QgZGF0ZScgfVxuICAgICksXG5cbiAgYWR1bHQ6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LmNvZXJjZS5kYXRlKCkucmVmaW5lKFxuICAgICAgZGF0ZSA9PiB7XG4gICAgICAgIGNvbnN0IGVpZ2h0ZWVuWWVhcnNBZ28gPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIGVpZ2h0ZWVuWWVhcnNBZ28uc2V0RnVsbFllYXIoZWlnaHRlZW5ZZWFyc0Fnby5nZXRGdWxsWWVhcigpIC0gMTgpO1xuICAgICAgICBlaWdodGVlblllYXJzQWdvLnNldEhvdXJzKDAsIDAsIDAsIDApOyAvLyBOb3JtYWxpemUgdG8gc3RhcnQgb2YgZGF5XG4gICAgICAgIGNvbnN0IGRvYiA9IG5ldyBEYXRlKGRhdGUpO1xuXG4gICAgICAgIGRvYi5zZXRIb3VycygwLCAwLCAwLCAwKTsgLy8gTm9ybWFsaXplIHRvIHN0YXJ0IG9mIGRheVxuXG4gICAgICAgIHJldHVybiBkb2IgPD0gZWlnaHRlZW5ZZWFyc0FnbztcbiAgICAgIH0sXG4gICAgICB7IG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ011c3QgYmUgYXQgbGVhc3QgMTggeWVhcnMgb2xkJyB9XG4gICAgKSxcblxuICBtaW5pbXVtQWdlOiAoe1xuICAgIG1lc3NhZ2UsXG4gICAgbWluaW11bUFnZSxcbiAgfTogeyBtZXNzYWdlPzogc3RyaW5nOyBtaW5pbXVtQWdlPzogbnVtYmVyIH0gPSB7fSkgPT5cbiAgICB6LmNvZXJjZS5kYXRlKCkucmVmaW5lKFxuICAgICAgZGF0ZSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgbWluaW11bUFnZSAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgbWluWWVhcnNBZ28gPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIG1pblllYXJzQWdvLnNldEZ1bGxZZWFyKG1pblllYXJzQWdvLmdldEZ1bGxZZWFyKCkgLSBtaW5pbXVtQWdlKTtcbiAgICAgICAgbWluWWVhcnNBZ28uc2V0SG91cnMoMCwgMCwgMCwgMCk7IC8vIE5vcm1hbGl6ZSB0byBzdGFydCBvZiBkYXlcbiAgICAgICAgY29uc3QgZG9iID0gbmV3IERhdGUoZGF0ZSk7XG5cbiAgICAgICAgZG9iLnNldEhvdXJzKDAsIDAsIDAsIDApOyAvLyBOb3JtYWxpemUgdG8gc3RhcnQgb2YgZGF5XG5cbiAgICAgICAgcmV0dXJuIGRvYiA8PSBtaW5ZZWFyc0FnbztcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgbWVzc2FnZSB8fFxuICAgICAgICAgIGBNdXN0IGJlIGF0IGxlYXN0ICR7bWluaW11bUFnZSA/PyAndGhlIHJlcXVpcmVkJ30geWVhcnMgb2xkYCxcbiAgICAgIH1cbiAgICApLFxuXG4gIHdpdGhpbkRheXM6ICh7IG1lc3NhZ2UsIGRheXMgfTogeyBtZXNzYWdlPzogc3RyaW5nOyBkYXlzPzogbnVtYmVyIH0gPSB7fSkgPT5cbiAgICB6LmNvZXJjZS5kYXRlKCkucmVmaW5lKFxuICAgICAgZGF0ZSA9PiB7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcblxuICAgICAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgY29uc3QgaW5wdXREYXRlID0gbmV3IERhdGUoZGF0ZSk7XG5cbiAgICAgICAgaW5wdXREYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgICAgIGNvbnN0IGRpZmZUaW1lID0gTWF0aC5hYnMoaW5wdXREYXRlLmdldFRpbWUoKSAtIHRvZGF5LmdldFRpbWUoKSk7XG4gICAgICAgIGNvbnN0IGRpZmZEYXlzID0gTWF0aC5jZWlsKGRpZmZUaW1lIC8gKDEwMDAgKiA2MCAqIDYwICogMjQpKTsgLy8gQ29udmVydCBtaWxsaXNlY29uZHMgdG8gZGF5c1xuXG4gICAgICAgIHJldHVybiB0eXBlb2YgZGF5cyA9PT0gJ251bWJlcicgPyBkaWZmRGF5cyA8PSBkYXlzIDogZmFsc2U7XG4gICAgICB9LFxuICAgICAgeyBtZXNzYWdlOiBtZXNzYWdlIHx8IGBNdXN0IGJlIHdpdGhpbiAke2RheXN9IGRheXMgb2YgdG9kYXlgIH1cbiAgICApLFxuXG4gIHdlZWtkYXk6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LmNvZXJjZS5kYXRlKCkucmVmaW5lKFxuICAgICAgZGF0ZSA9PiB7XG4gICAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF5KCk7IC8vIDAgPSBTdW5kYXksIDEgPSBNb25kYXksIC4uLiwgNiA9IFNhdHVyZGF5XG5cbiAgICAgICAgcmV0dXJuIGRheSAhPT0gMCAmJiBkYXkgIT09IDY7XG4gICAgICB9LFxuICAgICAgeyBtZXNzYWdlOiBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgd2Vla2RheScgfVxuICAgICksXG5cbiAgZGF0ZVJhbmdlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIHN0YXJ0OiB6LmNvZXJjZS5kYXRlKCksXG4gICAgICAgIGVuZDogei5jb2VyY2UuZGF0ZSgpLFxuICAgICAgfSlcbiAgICAgIC5yZWZpbmUoZGF0YSA9PiBkYXRhLnN0YXJ0IDw9IGRhdGEuZW5kLCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ1N0YXJ0IGRhdGUgbXVzdCBiZSBiZWZvcmUgb3IgZXF1YWwgdG8gZW5kIGRhdGUnLFxuICAgICAgfSksXG5cbiAgLy8gU3RyaW5nIHZhbGlkYXRpb25zXG4gIHJlcXVpcmVkU3RyaW5nOiAoe1xuICAgIG1lc3NhZ2UsXG4gICAgbWluLFxuICAgIG1heCxcbiAgfTogeyBtZXNzYWdlPzogc3RyaW5nOyBtaW4/OiBudW1iZXI7IG1heD86IG51bWJlciB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAudHJpbSgpXG4gICAgICAubWluKFxuICAgICAgICBtaW4gfHwgMSxcbiAgICAgICAgbWVzc2FnZSB8fCBgU3RyaW5nIG11c3QgYmUgYXQgbGVhc3QgJHttaW4gfHwgMX0gY2hhcmFjdGVyc2BcbiAgICAgIClcbiAgICAgIC5tYXgoXG4gICAgICAgIG1heCB8fCAyNTUsXG4gICAgICAgIG1lc3NhZ2UgfHwgYFN0cmluZyBtdXN0IGJlIGF0IG1vc3QgJHttYXggfHwgMjU1fSBjaGFyYWN0ZXJzYFxuICAgICAgKSxcblxuICBlbWFpbDogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLmVtYWlsKG1lc3NhZ2UgfHwgJ0ludmFsaWQgZW1haWwgYWRkcmVzcycpXG4gICAgICAubWF4KDI1NCwgJ0VtYWlsIG11c3QgYmUgYXQgbW9zdCAyNTQgY2hhcmFjdGVycycpLFxuXG4gIHVybDogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKCkudXJsKG1lc3NhZ2UgfHwgJ0ludmFsaWQgVVJMIGZvcm1hdCcpLFxuXG4gIHBob25lOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVnZXgoL15bK10/WzEtOV1bXFxkXXswLDE1fSQvLCBtZXNzYWdlIHx8ICdJbnZhbGlkIHBob25lIG51bWJlciBmb3JtYXQnKSxcblxuICBjcmVkaXRDYXJkOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgei5zdHJpbmcoKS5yZWZpbmUodmFsdWUgPT4gaXNWYWxpZEx1aG4odmFsdWUpLCB7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgY3JlZGl0IGNhcmQgbnVtYmVyJyxcbiAgICB9KSxcblxuICBpbmRpYW5Nb2JpbGU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWdleCgvXls2LTldXFxkezl9JC8sIG1lc3NhZ2UgfHwgJ011c3QgYmUgYSB2YWxpZCBJbmRpYW4gbW9iaWxlIG51bWJlcicpLFxuXG4gIGludGVybmF0aW9uYWxQaG9uZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KFxuICAgICAgICAvXlxcKz9bMS05XVxcZHs2LDE0fSQvLFxuICAgICAgICBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgaW50ZXJuYXRpb25hbCBwaG9uZSBudW1iZXInXG4gICAgICApLFxuXG4gIGFscGhhYmV0aWM6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWdleChcbiAgICAgICAgL15bQS1aYS16LCBdKyQvLFxuICAgICAgICBtZXNzYWdlIHx8ICdNdXN0IGNvbnRhaW4gb25seSBsZXR0ZXJzLCBjb21tYXMsIGFuZCBzcGFjZXMnXG4gICAgICApLFxuXG4gIGd1aWQ6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6LnN0cmluZygpLnV1aWQobWVzc2FnZSB8fCAnTXVzdCBiZSBhIHZhbGlkIEdVSUQnKSxcblxuICBub25FbXB0eU9yV2hpdGVzcGFjZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnRyaW0oKVxuICAgICAgLm1pbigxLCBtZXNzYWdlIHx8ICdNdXN0IG5vdCBiZSBlbXB0eSBvciB3aGl0ZXNwYWNlJyksXG5cbiAgdXNlcm5hbWU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWdleChcbiAgICAgICAgL15bYS16QS1aXVthLXpBLVowLTlfXXsyLDI5fSQvLFxuICAgICAgICBtZXNzYWdlIHx8XG4gICAgICAgICAgJ011c3QgYmUgMy0zMCBjaGFyYWN0ZXJzLCBzdGFydCB3aXRoIGEgbGV0dGVyLCBhbmQgY29udGFpbiBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGFuZCB1bmRlcnNjb3JlcydcbiAgICAgICksXG5cbiAgZXhhY3RMZW5ndGg6ICh7XG4gICAgbWVzc2FnZSxcbiAgICBsZW5ndGgsXG4gIH06IHsgbWVzc2FnZT86IHN0cmluZzsgbGVuZ3RoPzogbnVtYmVyIH0gPSB7fSkgPT4ge1xuICAgIGlmICh0eXBlb2YgbGVuZ3RoICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMZW5ndGggbXVzdCBiZSBwcm92aWRlZCBmb3IgZXhhY3RMZW5ndGggdmFsaWRhdG9yJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLmxlbmd0aChsZW5ndGgsIG1lc3NhZ2UgfHwgYE11c3QgYmUgZXhhY3RseSAke2xlbmd0aH0gY2hhcmFjdGVyc2ApO1xuICB9LFxuXG4gIG1pbldvcmRzOiAoe1xuICAgIG1lc3NhZ2UsXG4gICAgbWluV29yZHMsXG4gIH06IHsgbWVzc2FnZT86IHN0cmluZzsgbWluV29yZHM/OiBudW1iZXIgfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKCkucmVmaW5lKFxuICAgICAgdmFsdWUgPT4ge1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3Qgd29yZHMgPSB2YWx1ZS5zcGxpdCgvW1xcc1xcdFxcblxccl0rLykuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgIHJldHVybiB3b3Jkcy5sZW5ndGggPj0gKHR5cGVvZiBtaW5Xb3JkcyA9PT0gJ251bWJlcicgPyBtaW5Xb3JkcyA6IDApO1xuICAgICAgfSxcbiAgICAgIHsgbWVzc2FnZTogbWVzc2FnZSB8fCBgTXVzdCBoYXZlIGF0IGxlYXN0ICR7bWluV29yZHN9IHdvcmQocylgIH1cbiAgICApLFxuXG4gIG1heFdvcmRzOiAoe1xuICAgIG1lc3NhZ2UsXG4gICAgbWF4V29yZHMsXG4gIH06IHsgbWVzc2FnZT86IHN0cmluZzsgbWF4V29yZHM/OiBudW1iZXIgfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKCkucmVmaW5lKFxuICAgICAgdmFsdWUgPT4ge1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3Qgd29yZHMgPSB2YWx1ZS5zcGxpdCgvW1xcc1xcdFxcblxccl0rLykuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgIHJldHVybiB3b3Jkcy5sZW5ndGggPD0gKHR5cGVvZiBtYXhXb3JkcyA9PT0gJ251bWJlcicgPyBtYXhXb3JkcyA6IDApO1xuICAgICAgfSxcbiAgICAgIHsgbWVzc2FnZTogbWVzc2FnZSB8fCBgTXVzdCBoYXZlIGF0IG1vc3QgJHttYXhXb3Jkc30gd29yZChzKWAgfVxuICAgICksXG5cbiAgc3Ryb25nUGFzc3dvcmQ6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWdleChcbiAgICAgICAgL14oPz0uKlthLXpdKSg/PS4qW0EtWl0pKD89LipcXGQpKD89LipbQCQhJSo/Jl0pW0EtWmEtelxcZEAkISUqPyZdezgsfSQvLFxuICAgICAgICBtZXNzYWdlIHx8XG4gICAgICAgICAgJ011c3QgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGFuZCBjb250YWluIHVwcGVyY2FzZSwgbG93ZXJjYXNlLCBudW1iZXIsIGFuZCBzcGVjaWFsIGNoYXJhY3RlcidcbiAgICAgICksXG5cbiAgbm9IdG1sOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVmaW5lKFxuICAgICAgICB2YWx1ZSA9PiAhdmFsdWUgfHwgIS88W14+XSo+Ly50ZXN0KHZhbHVlKSxcbiAgICAgICAgbWVzc2FnZSB8fCAnTXVzdCBub3QgY29udGFpbiBIVE1MIHRhZ3MnXG4gICAgICApLFxuXG4gIG5vU2NyaXB0SW5qZWN0aW9uOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVmaW5lKFxuICAgICAgICB2YWx1ZSA9PiAhdmFsdWUgfHwgIS88c2NyaXB0fGphdmFzY3JpcHQ6fG9uXFx3K1xccyo9L2kudGVzdCh2YWx1ZSksXG4gICAgICAgIG1lc3NhZ2UgfHwgJ0NvbnRhaW5zIHBvdGVudGlhbGx5IHVuc2FmZSBjb250ZW50J1xuICAgICAgKSxcblxuICBub1NxbEluamVjdGlvbjogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZmluZShcbiAgICAgICAgdmFsdWUgPT5cbiAgICAgICAgICAhdmFsdWUgfHxcbiAgICAgICAgICAhLygnfC0tfDt8XFxiKFNFTEVDVHxJTlNFUlR8VVBEQVRFfERFTEVURXxEUk9QfFVOSU9OfEFMVEVSfENSRUFURXxFWEVDfEVYRUNVVEUpXFxiKS9pLnRlc3QoXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICksXG4gICAgICAgIG1lc3NhZ2UgfHwgJ0NvbnRhaW5zIHBvdGVudGlhbGx5IHVuc2FmZSBjb250ZW50J1xuICAgICAgKSxcblxuICBpbmRpYW5QaW5Db2RlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVnZXgoL15bMS05XVswLTldezV9JC8sIG1lc3NhZ2UgfHwgJ011c3QgYmUgYSB2YWxpZCA2LWRpZ2l0IFBJTiBjb2RlJyksXG5cbiAgdXNaaXBDb2RlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVnZXgoL15cXGR7NX0oLVxcZHs0fSk/JC8sIG1lc3NhZ2UgfHwgJ011c3QgYmUgYSB2YWxpZCBVUyBaSVAgY29kZScpLFxuXG4gIHVrUG9zdGFsQ29kZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KFxuICAgICAgICAvXltBLVpdezEsMn1bMC05XVswLTlBLVpdP1xccz9bMC05XVtBLVpdezJ9JC9pLFxuICAgICAgICBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgVUsgcG9zdGFsIGNvZGUnXG4gICAgICApLFxuXG4gIGlwdjQ6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWdleChcbiAgICAgICAgL14oKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4pezN9KDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPykkLyxcbiAgICAgICAgbWVzc2FnZSB8fCAnTXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcydcbiAgICAgICksXG5cbiAgaXB2NjogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KFxuICAgICAgICAvXihbMC05YS1mQS1GXXsxLDR9Oil7N31bMC05YS1mQS1GXXsxLDR9JHxeOjokfF46OjEkfF4oWzAtOWEtZkEtRl17MSw0fTopezEsN306JC8sXG4gICAgICAgIG1lc3NhZ2UgfHwgJ011c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3MnXG4gICAgICApLFxuXG4gIG1hY0FkZHJlc3M6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5yZWdleChcbiAgICAgICAgL14oWzAtOUEtRmEtZl17Mn1bOi1dKXs1fShbMC05QS1GYS1mXXsyfSkkLyxcbiAgICAgICAgbWVzc2FnZSB8fCAnTXVzdCBiZSBhIHZhbGlkIE1BQyBhZGRyZXNzJ1xuICAgICAgKSxcblxuICBhbGxvd2VkRmlsZUV4dGVuc2lvbjogKHtcbiAgICBtZXNzYWdlLFxuICAgIGFsbG93ZWRFeHRlbnNpb25zLFxuICB9OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IGFsbG93ZWRFeHRlbnNpb25zPzogc3RyaW5nW10gfSA9IHt9KSA9PlxuICAgIHouc3RyaW5nKCkucmVmaW5lKFxuICAgICAgZmlsZU5hbWUgPT4ge1xuICAgICAgICBpZiAoIWZpbGVOYW1lKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZU5hbWUuc3BsaXQoJy4nKS5wb3AoKT8udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgbG93ZXJBbGxvd2VkID0gYWxsb3dlZEV4dGVuc2lvbnM/Lm1hcChleHQgPT5cbiAgICAgICAgICBleHQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCcuJylcbiAgICAgICAgICAgID8gZXh0LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIDogYC4ke2V4dC50b0xvd2VyQ2FzZSgpfWBcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gZXh0ZW5zaW9uICYmIGxvd2VyQWxsb3dlZD8uaW5jbHVkZXMoYC4ke2V4dGVuc2lvbn1gKTtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgbWVzc2FnZSB8fFxuICAgICAgICAgIGBNdXN0IGhhdmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uczogJHthbGxvd2VkRXh0ZW5zaW9ucz8uam9pbignLCAnKX1gLFxuICAgICAgfVxuICAgICksXG5cbiAgdmFsaWRJbWFnZUV4dGVuc2lvbjogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHNjaGVtYVRvb2xzLmFsbG93ZWRGaWxlRXh0ZW5zaW9uKHtcbiAgICAgIGFsbG93ZWRFeHRlbnNpb25zOiBbJy5qcGcnLCAnLmpwZWcnLCAnLnBuZycsICcuZ2lmJywgJy5ibXAnLCAnLndlYnAnXSxcbiAgICAgIG1lc3NhZ2U6XG4gICAgICAgIG1lc3NhZ2UgfHxcbiAgICAgICAgJ011c3QgaGF2ZSBhIHZhbGlkIGltYWdlIGV4dGVuc2lvbiAoLmpwZywgLmpwZWcsIC5wbmcsIC5naWYsIC5ibXAsIC53ZWJwKScsXG4gICAgfSksXG5cbiAgdmFsaWREb2N1bWVudEV4dGVuc2lvbjogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHNjaGVtYVRvb2xzLmFsbG93ZWRGaWxlRXh0ZW5zaW9uKHtcbiAgICAgIGFsbG93ZWRFeHRlbnNpb25zOiBbJy5wZGYnLCAnLmRvYycsICcuZG9jeCcsICcueGxzJywgJy54bHN4JywgJy50eHQnXSxcbiAgICAgIG1lc3NhZ2U6XG4gICAgICAgIG1lc3NhZ2UgfHxcbiAgICAgICAgJ011c3QgaGF2ZSBhIHZhbGlkIGRvY3VtZW50IGV4dGVuc2lvbiAoLnBkZiwgLmRvYywgLmRvY3gsIC54bHMsIC54bHN4LCAudHh0KScsXG4gICAgfSksXG5cbiAgcGFuQ2FyZDogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KFxuICAgICAgICAvXltBLVpdezV9WzAtOV17NH1bQS1aXXsxfSQvLFxuICAgICAgICBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgUEFOIGNhcmQgbnVtYmVyJ1xuICAgICAgKSxcblxuICBhYWRoYWFyOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVnZXgoXG4gICAgICAgIC9eWzItOV17MX1bMC05XXsxMX0kLyxcbiAgICAgICAgbWVzc2FnZSB8fCAnTXVzdCBiZSBhIHZhbGlkIEFhZGhhYXIgbnVtYmVyJ1xuICAgICAgKSxcblxuICBnc3RpbjogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KFxuICAgICAgICAvXlswLTldezJ9W0EtWl17NX1bMC05XXs0fVtBLVpdezF9WzEtOUEtWl17MX1aWzAtOUEtWl17MX0kLyxcbiAgICAgICAgbWVzc2FnZSB8fCAnTXVzdCBiZSBhIHZhbGlkIEdTVElOJ1xuICAgICAgKSxcblxuICBpZnNjOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVnZXgoL15bQS1aXXs0fTBbQS1aMC05XXs2fSQvLCBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgSUZTQyBjb2RlJyksXG5cbiAgYWxwaGFudW1lcmljOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLnN0cmluZygpXG4gICAgICAucmVnZXgoXG4gICAgICAgIC9eW2EtekEtWjAtOV0rJC8sXG4gICAgICAgIG1lc3NhZ2UgfHwgJ09ubHkgbGV0dGVycyBhbmQgbnVtYmVycyBhcmUgYWxsb3dlZCdcbiAgICAgICksXG5cbiAgc2x1ZzogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnJlZ2V4KC9eW2EtejAtOV0rKD86LVthLXowLTldKykqJC8sIG1lc3NhZ2UgfHwgJ0ludmFsaWQgc2x1ZyBmb3JtYXQnKSxcblxuICAvLyBOdW1iZXIgdmFsaWRhdGlvbnNcbiAgcG9zaXRpdmVOdW1iZXI6ICh7XG4gICAgbWVzc2FnZSxcbiAgICBtaW4sXG4gICAgbWF4LFxuICB9OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IG1pbj86IG51bWJlcjsgbWF4PzogbnVtYmVyIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAubnVtYmVyKClcbiAgICAgIC5wb3NpdGl2ZShtZXNzYWdlIHx8ICdOdW1iZXIgbXVzdCBiZSBwb3NpdGl2ZScpXG4gICAgICAubWluKG1pbiB8fCAwLjAxLCBgTnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgJHttaW4gfHwgMC4wMX1gKVxuICAgICAgLm1heChcbiAgICAgICAgbWF4IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICBgTnVtYmVyIG11c3QgYmUgYXQgbW9zdCAke21heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1gXG4gICAgICApLFxuXG4gIG1heERlY2ltYWxQbGFjZXM6ICh7XG4gICAgbWVzc2FnZSxcbiAgICBtYXhQbGFjZXMsXG4gIH06IHsgbWVzc2FnZT86IHN0cmluZzsgbWF4UGxhY2VzPzogbnVtYmVyIH0gPSB7fSkgPT5cbiAgICB6Lm51bWJlcigpLnJlZmluZShcbiAgICAgIHZhbHVlID0+IHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBkZWNpbWFsUGFydCA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICFkZWNpbWFsUGFydCB8fFxuICAgICAgICAgIGRlY2ltYWxQYXJ0Lmxlbmd0aCA8PSAodHlwZW9mIG1heFBsYWNlcyA9PT0gJ251bWJlcicgPyBtYXhQbGFjZXMgOiAwKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHsgbWVzc2FnZTogbWVzc2FnZSB8fCBgTXVzdCBoYXZlIGF0IG1vc3QgJHttYXhQbGFjZXN9IGRlY2ltYWwgcGxhY2VzYCB9XG4gICAgKSxcblxuICBjdXJyZW5jeTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5udW1iZXIoKVxuICAgICAgLm1pbigwLCBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgY3VycmVuY3kgYW1vdW50IChwb3NpdGl2ZSknKVxuICAgICAgLnJlZmluZShcbiAgICAgICAgdmFsdWUgPT4ge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICBjb25zdCBkZWNpbWFsUGFydCA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXTtcblxuICAgICAgICAgIHJldHVybiAhZGVjaW1hbFBhcnQgfHwgZGVjaW1hbFBhcnQubGVuZ3RoIDw9IDI7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgbWVzc2FnZSB8fCAnTXVzdCBiZSBhIHZhbGlkIGN1cnJlbmN5IGFtb3VudCAobWF4IDIgZGVjaW1hbCBwbGFjZXMpJyxcbiAgICAgICAgfVxuICAgICAgKSxcblxuICB2YWxpZEFnZTogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5udW1iZXIoKVxuICAgICAgLmludCgnTXVzdCBiZSBhbiBpbnRlZ2VyJylcbiAgICAgIC5taW4oMCwgbWVzc2FnZSB8fCAnTXVzdCBiZSBhIHZhbGlkIGFnZSAoYmV0d2VlbiAwIGFuZCAxNTApJylcbiAgICAgIC5tYXgoMTUwLCBtZXNzYWdlIHx8ICdNdXN0IGJlIGEgdmFsaWQgYWdlIChiZXR3ZWVuIDAgYW5kIDE1MCknKSxcblxuICBub25OZWdhdGl2ZU51bWJlcjogKHtcbiAgICBtZXNzYWdlLFxuICAgIG1heCxcbiAgfTogeyBtZXNzYWdlPzogc3RyaW5nOyBtYXg/OiBudW1iZXIgfSA9IHt9KSA9PlxuICAgIHpcbiAgICAgIC5udW1iZXIoKVxuICAgICAgLm1pbigwLCBtZXNzYWdlIHx8ICdOdW1iZXIgbXVzdCBiZSBub24tbmVnYXRpdmUnKVxuICAgICAgLm1heChcbiAgICAgICAgbWF4IHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICBgTnVtYmVyIG11c3QgYmUgYXQgbW9zdCAke21heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1gXG4gICAgICApLFxuXG4gIGludGVnZXI6ICh7XG4gICAgbWVzc2FnZSxcbiAgICBtaW4sXG4gICAgbWF4LFxuICB9OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IG1pbj86IG51bWJlcjsgbWF4PzogbnVtYmVyIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAubnVtYmVyKClcbiAgICAgIC5pbnQobWVzc2FnZSB8fCAnTXVzdCBiZSBhbiBpbnRlZ2VyJylcbiAgICAgIC5taW4oXG4gICAgICAgIG1pbiB8fCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixcbiAgICAgICAgYE51bWJlciBtdXN0IGJlIGF0IGxlYXN0ICR7bWluIHx8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSfWBcbiAgICAgIClcbiAgICAgIC5tYXgoXG4gICAgICAgIG1heCB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgICAgYE51bWJlciBtdXN0IGJlIGF0IG1vc3QgJHttYXggfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9YFxuICAgICAgKSxcblxuICBwZXJjZW50YWdlOiAoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pID0+XG4gICAgelxuICAgICAgLm51bWJlcigpXG4gICAgICAubWluKDAsIG1lc3NhZ2UgfHwgJ1BlcmNlbnRhZ2UgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMCcpXG4gICAgICAubWF4KDEwMCwgbWVzc2FnZSB8fCAnUGVyY2VudGFnZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwJyksXG5cbiAgLy8gQXJyYXkgdmFsaWRhdGlvbnNcbiAgbm9uRW1wdHlBcnJheTogPFQ+KFxuICAgIHNjaGVtYTogei5ab2RTY2hlbWE8VD4sXG4gICAgeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge31cbiAgKSA9PiB6LmFycmF5KHNjaGVtYSkubWluKDEsIG1lc3NhZ2UgfHwgJ0F0IGxlYXN0IG9uZSBpdGVtIGlzIHJlcXVpcmVkJyksXG5cbiAgdW5pcXVlQXJyYXk6IDxUPihcbiAgICBzY2hlbWE6IHouWm9kU2NoZW1hPFQ+LFxuICAgIHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9XG4gICkgPT5cbiAgICB6LmFycmF5KHNjaGVtYSkucmVmaW5lKGl0ZW1zID0+IG5ldyBTZXQoaXRlbXMpLnNpemUgPT09IGl0ZW1zLmxlbmd0aCwge1xuICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnQWxsIGl0ZW1zIG11c3QgYmUgdW5pcXVlJyxcbiAgICB9KSxcblxuICBub051bGxBcnJheUl0ZW1zOiA8VD4oXG4gICAgc2NoZW1hOiB6LlpvZFNjaGVtYTxUPixcbiAgICB7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fVxuICApID0+XG4gICAgelxuICAgICAgLmFycmF5KHNjaGVtYS5udWxsYWJsZSgpKVxuICAgICAgLnJlZmluZShpdGVtcyA9PiBpdGVtcy5ldmVyeShpdGVtID0+IGl0ZW0gIT09IG51bGwpLCB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ011c3Qgbm90IGNvbnRhaW4gbnVsbCBpdGVtcycsXG4gICAgICB9KSxcblxuICAvLyBCb29sZWFuIHZhbGlkYXRpb25zXG4gIHJlcXVpcmVkQm9vbGVhbjogKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSA9PlxuICAgIHouYm9vbGVhbih7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkJyxcbiAgICB9KSxcblxuICAvLyBPYmplY3QgdmFsaWRhdGlvbnNcbiAgbm9uRW1wdHlPYmplY3Q6IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIHNjaGVtYTogei5ab2RTY2hlbWE8VD4sXG4gICAgeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge31cbiAgKSA9PlxuICAgIHNjaGVtYS5yZWZpbmUob2JqID0+IE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID4gMCwge1xuICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnT2JqZWN0IGNhbm5vdCBiZSBlbXB0eScsXG4gICAgfSksXG5cbiAgLy8gRmlsZSB2YWxpZGF0aW9uc1xuICByZXF1aXJlZEZpbGU6ICh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkgPT5cbiAgICB6XG4gICAgICAuaW5zdGFuY2VvZihGaWxlLCB7IG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJ0ZpbGUgaXMgcmVxdWlyZWQnIH0pXG4gICAgICAucmVmaW5lKGZpbGUgPT4gZmlsZS5zaXplID4gMCwge1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICdGaWxlIGNhbm5vdCBiZSBlbXB0eScsXG4gICAgICB9KSxcblxuICBmaWxlU2l6ZTogKHsgbWF4U2l6ZSwgbWVzc2FnZSB9OiB7IG1heFNpemU6IG51bWJlcjsgbWVzc2FnZT86IHN0cmluZyB9KSA9PlxuICAgIHouaW5zdGFuY2VvZihGaWxlKS5yZWZpbmUoZmlsZSA9PiBmaWxlLnNpemUgPD0gbWF4U2l6ZSwge1xuICAgICAgbWVzc2FnZTpcbiAgICAgICAgbWVzc2FnZSB8fFxuICAgICAgICBgRmlsZSBzaXplIG11c3QgYmUgbGVzcyB0aGFuICR7TWF0aC5yb3VuZChtYXhTaXplIC8gMTAyNCAvIDEwMjQpfU1CYCxcbiAgICB9KSxcblxuICBmaWxlVHlwZTogKHtcbiAgICBhbGxvd2VkVHlwZXMsXG4gICAgbWVzc2FnZSxcbiAgfToge1xuICAgIGFsbG93ZWRUeXBlczogc3RyaW5nW107XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgfSkgPT5cbiAgICB6Lmluc3RhbmNlb2YoRmlsZSkucmVmaW5lKGZpbGUgPT4gYWxsb3dlZFR5cGVzLmluY2x1ZGVzKGZpbGUudHlwZSksIHtcbiAgICAgIG1lc3NhZ2U6XG4gICAgICAgIG1lc3NhZ2UgfHwgYEZpbGUgdHlwZSBtdXN0IGJlIG9uZSBvZjogJHthbGxvd2VkVHlwZXMuam9pbignLCAnKX1gLFxuICAgIH0pLFxuXG4gIC8vIEN1c3RvbSB2YWxpZGF0b3JzXG4gIGNvbmRpdGlvbmFsOiA8VCwgVT4oXG4gICAgY29uZGl0aW9uOiAoZGF0YTogVCkgPT4gYm9vbGVhbixcbiAgICB0cnVlU2NoZW1hOiB6LlpvZFNjaGVtYTxVPixcbiAgICBmYWxzZVNjaGVtYTogei5ab2RTY2hlbWE8VT5cbiAgKSA9PlxuICAgIHoudW5pb24oW3RydWVTY2hlbWEsIGZhbHNlU2NoZW1hXSkuc3VwZXJSZWZpbmUoKGRhdGEsIGN0eCkgPT4ge1xuICAgICAgY29uc3Qgc2hvdWxkVXNlVHJ1ZSA9IGNvbmRpdGlvbihkYXRhIGFzIHVua25vd24gYXMgVCk7XG4gICAgICBjb25zdCBzY2hlbWEgPSBzaG91bGRVc2VUcnVlID8gdHJ1ZVNjaGVtYSA6IGZhbHNlU2NoZW1hO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc2NoZW1hLnNhZmVQYXJzZShkYXRhKTtcblxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBjdHguYWRkSXNzdWUoe1xuICAgICAgICAgIGNvZGU6IHouWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICBtZXNzYWdlOiByZXN1bHQuZXJyb3IubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSksXG5cbiAgdHJhbnNmb3JtOiB7XG4gICAgdG9Mb3dlckNhc2U6IHouc3RyaW5nKCkudHJhbnNmb3JtKHZhbCA9PiB2YWwudG9Mb3dlckNhc2UoKSksXG4gICAgdG9VcHBlckNhc2U6IHouc3RyaW5nKCkudHJhbnNmb3JtKHZhbCA9PiB2YWwudG9VcHBlckNhc2UoKSksXG4gICAgdHJpbTogei5zdHJpbmcoKS50cmFuc2Zvcm0odmFsID0+IHZhbC50cmltKCkpLFxuICAgIHRvTnVtYmVyOiB6LnN0cmluZygpLnRyYW5zZm9ybSh2YWwgPT4gTnVtYmVyKHZhbCkpLFxuICAgIHRvQm9vbGVhbjogei5zdHJpbmcoKS50cmFuc2Zvcm0odmFsID0+IHZhbCA9PT0gJ3RydWUnKSxcbiAgICBwYXJzZUpzb246IDxUPihzY2hlbWE6IHouWm9kU2NoZW1hPFQ+KSA9PlxuICAgICAgei5zdHJpbmcoKS50cmFuc2Zvcm0oKHZhbCwgY3R4KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh2YWwpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHNjaGVtYS5zYWZlUGFyc2UocGFyc2VkKTtcblxuICAgICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgcmV0dXJuIHJlc3VsdC5kYXRhO1xuXG4gICAgICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgICAgIGNvZGU6IHouWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdC5lcnJvci5tZXNzYWdlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHouTkVWRVI7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICBjb2RlOiB6LlpvZElzc3VlQ29kZS5jdXN0b20sXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBKU09OJyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgfSxcbn07XG4iLCAiLyoqXG4gKiBUeXBlIGd1YXJkIHV0aWxpdGllcyBmb3IgcnVudGltZSB0eXBlIGNoZWNraW5nXG4gKiBcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgbm9uLW51bGwgb2JqZWN0IChleGNsdWRpbmcgYXJyYXlzKVxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNSZWNvcmQodmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBzcGVjaWZpYyBwcm9wZXJ0eVxuICogXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBjaGVja1xuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBrZXkgdG8gbG9vayBmb3JcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgdGhlIHByb3BlcnR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaGFzUHJvcGVydHkob2JqLCAnbmFtZScpKSB7XG4gKiAgIC8vIG9iaiBpcyBSZWNvcmQ8J25hbWUnLCB1bmtub3duPlxuICogICBjb25zb2xlLmxvZyhvYmoubmFtZSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvcGVydHk8SyBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgb2JqOiB1bmtub3duLFxuICBrZXk6IEtcbik6IG9iaiBpcyBSZWNvcmQ8SywgdW5rbm93bj4ge1xuICByZXR1cm4gaXNSZWNvcmQob2JqKSAmJiBrZXkgaW4gb2JqO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBzdHJpbmdcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBzdHJpbmdcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc05vbkVtcHR5U3RyaW5nKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBzdHJpbmcgd2l0aCBsZW5ndGggPiAwXG4gKiAgIGNvbnNvbGUubG9nKHZhbHVlLnRvVXBwZXJDYXNlKCkpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9uRW1wdHlTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIGFycmF5XG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyB1bmtub3duW11cbiAqICAgdmFsdWUuZm9yRWFjaChpdGVtID0+IGNvbnNvbGUubG9nKGl0ZW0pKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5PFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBub24tZW1wdHkgYXJyYXlcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIG5vbi1lbXB0eSBhcnJheVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzTm9uRW1wdHlBcnJheShpdGVtcykpIHtcbiAqICAgLy8gaXRlbXMgaXMgW1QsIC4uLlRbXV0gLSBndWFyYW50ZWVkIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGVsZW1lbnRcbiAqICAgY29uc3QgZmlyc3QgPSBpdGVtc1swXTsgIC8vIFNhZmUgYWNjZXNzXG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb25FbXB0eUFycmF5PFQ+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgW1QsIC4uLlRbXV0ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBmdW5jdGlvblxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICogICAvLyBjYWxsYmFjayBpcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duXG4gKiAgIGNhbGxiYWNrKCk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzICguLi5hcmdzOiByZWFkb25seSB1bmtub3duW10pID0+IHVua25vd24ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZ1xuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nIChpbmNsdWRpbmcgZW1wdHkgc3RyaW5nKVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBzdHJpbmdcbiAqICAgY29uc29sZS5sb2codmFsdWUubGVuZ3RoKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIG51bWJlciAoZXhjbHVkaW5nIE5hTilcbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIG51bWJlclxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzTnVtYmVyKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBudW1iZXIgKG5vdCBOYU4pXG4gKiAgIGNvbnN0IGRvdWJsZWQgPSB2YWx1ZSAqIDI7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIGJvb2xlYW5cbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIGJvb2xlYW5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc0Jvb2xlYW4odmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIGJvb2xlYW5cbiAqICAgY29uc29sZS5sb2coIXZhbHVlKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBudWxsXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgbnVsbFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzTnVsbCh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgbnVsbFxuICogICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZFxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIG51bGxpc2hcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc051bGxpc2godmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWRcbiAqICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAqIH1cbiAqIFxuICogaWYgKCFpc051bGxpc2godmFsdWUpKSB7XG4gKiAgIC8vIHZhbHVlIGlzIE5vbk51bGxhYmxlPHR5cGVvZiB2YWx1ZT5cbiAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbGlzaCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgZGVmaW5lZCAobm90IG51bGwgb3IgdW5kZWZpbmVkKVxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmlsdGVyZWQgPSBpdGVtcy5maWx0ZXIoaXNEZWZpbmVkKTtcbiAqIC8vIGZpbHRlcmVkIGhhcyB0eXBlOiBOb25OdWxsYWJsZTxUPltdXG4gKiBgYGBcbiAqIFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkPFQ+KHZhbHVlOiBUKTogdmFsdWUgaXMgTm9uTnVsbGFibGU8VD4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBEYXRlIG9iamVjdFxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZhbHVlIGlzIGEgRGF0ZVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAqICAgLy8gdmFsdWUgaXMgRGF0ZVxuICogICBjb25zb2xlLmxvZyh2YWx1ZS50b0lTT1N0cmluZygpKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRlIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBQcm9taXNlXG4gKiBcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBQcm9taXNlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNQcm9taXNlKHZhbHVlKSkge1xuICogICAvLyB2YWx1ZSBpcyBQcm9taXNlPHVua25vd24+XG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZhbHVlO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvbWlzZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFByb21pc2U8dW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSB8fFxuICAgIChpc1JlY29yZCh2YWx1ZSkgJiZcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnRoZW4gPT09ICdmdW5jdGlvbicpXG4gICk7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBlcnJvciBpcyBhbiBFcnJvciBpbnN0YW5jZVxuICogXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVycm9yIGlzIGFuIEVycm9yIGluc3RhbmNlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0cnkge1xuICogICAvLyAuLi5cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChpc0Vycm9yKGVycm9yKSkge1xuICogICAgIC8vIGVycm9yIGlzIEVycm9yXG4gKiAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBFcnJvciB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBtYXRjaGVzIGEgc3BlY2lmaWMgdHlwZSB1c2luZyBhIHZhbGlkYXRvciBmdW5jdGlvblxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqIEBwYXJhbSB2YWxpZGF0b3IgLSBGdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBtYXRjaGVzIHRoZSB0eXBlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSB0eXBlXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbnRlcmZhY2UgVXNlciB7XG4gKiAgIGlkOiBzdHJpbmc7XG4gKiAgIG5hbWU6IHN0cmluZztcbiAqIH1cbiAqIFxuICogY29uc3QgaXNVc2VyID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVXNlciA9PlxuICogICBpc1JlY29yZCh2YWx1ZSkgJiZcbiAqICAgaGFzUHJvcGVydHkodmFsdWUsICdpZCcpICYmXG4gKiAgIGhhc1Byb3BlcnR5KHZhbHVlLCAnbmFtZScpICYmXG4gKiAgIGlzU3RyaW5nKHZhbHVlLmlkKSAmJlxuICogICBpc1N0cmluZyh2YWx1ZS5uYW1lKTtcbiAqIFxuICogaWYgKGlzVXNlcihkYXRhKSkge1xuICogICAvLyBkYXRhIGlzIFVzZXJcbiAqICAgY29uc29sZS5sb2coZGF0YS5uYW1lKTtcbiAqIH1cbiAqIGBgYFxuICogXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzPFQ+KFxuICB2YWx1ZTogdW5rbm93bixcbiAgdmFsaWRhdG9yOiAodmFsdWU6IHVua25vd24pID0+IHZhbHVlIGlzIFRcbik6IHZhbHVlIGlzIFQge1xuICByZXR1cm4gdmFsaWRhdG9yKHZhbHVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxJQUFNLFdBQVcsQ0FBQyxRQUNoQixPQUFPLFFBQVEsWUFBWSxRQUFRLFFBQVEsQ0FBQyxNQUFNLFFBQVEsR0FBRztBQVUvRCxJQUFNLFVBQVUsQ0FBQyxRQUFtQyxNQUFNLFFBQVEsR0FBRztBQStEOUQsSUFBTSxvQkFBb0IsQ0FBQyxLQUFjLFNBQVMsT0FBZ0M7QUFDdkYsTUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHO0FBQ2xCLFdBQU87QUFBQSxNQUNMLENBQUMsTUFBTSxHQUFHO0FBQUEsSUFDWjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLE9BQU8sS0FBSyxHQUFHLEVBQUUsT0FBTyxDQUFDLEtBQUssUUFBUTtBQUMzQyxVQUFNLGdCQUFnQixPQUFPLFNBQVMsR0FBRyxNQUFNLE1BQU07QUFFckQsUUFBSSxTQUFTLElBQUksR0FBRyxDQUFDLEtBQUssT0FBTyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUUsUUFBUTtBQUN0RCxVQUFJLFFBQVEsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsRUFBRSxRQUFRO0FBQ3hDLFlBQUksR0FBRyxFQUFFLFFBQVEsQ0FBQyxNQUFNLFVBQWtCO0FBQ3hDLGlCQUFPO0FBQUEsWUFDTDtBQUFBLFlBQ0Esa0JBQWtCLE1BQU0sR0FBRyxn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