@kontur.candy/tools 2.154.0 → 2.156.0

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 (272) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/distr/Common/AsyncUtils.js +1 -3
  3. package/distr/Common/CandyApiClient/CandyApiClient.js +25 -138
  4. package/distr/Common/CandyApiClient/CandyApiClientContext.js +1 -8
  5. package/distr/Common/CandyApiClient/ClientDraftInfo/ClientDraftInfoResponse.js +1 -1
  6. package/distr/Common/CandyApiClient/ClientDraftInfo/FnsFormInfo.js +1 -1
  7. package/distr/Common/CandyApiClient/ClientDraftInfo/GetClientDraftInfoUrl.js +1 -2
  8. package/distr/Common/CandyApiClient/ClientDraftInfo/PrintInfo.js +1 -1
  9. package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithCache.js +1 -16
  10. package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithDebouncedBatching.js +1 -12
  11. package/distr/Common/CandyApiClient/DigestApiClient/DigestApiClient.js +1 -12
  12. package/distr/Common/CandyApiClient/DigestApiClient/Fakes/Data/TaxRebate1152026.js +1 -1
  13. package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakeDigestApiClient.js +1 -13
  14. package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakePicklists.js +1 -3
  15. package/distr/Common/CandyApiClient/DigestApiClient/IDigestApiClient.js +1 -1
  16. package/distr/Common/CandyApiClient/DigestApiClient/React/DigestApiClientContext.js +1 -8
  17. package/distr/Common/CandyApiClient/DigestApiClient/TestDigestApiClient.js +1 -7
  18. package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestQueryFilter.js +9 -12
  19. package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestRequest.js +1 -1
  20. package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestResponse.js +1 -1
  21. package/distr/Common/CandyApiClient/FakeCandyApiClient.js +4 -72
  22. package/distr/Common/CandyApiClient/ICandyApiClient.js +1 -1
  23. package/distr/Common/CandyApiClient/IsBuffer.js +1 -2
  24. package/distr/Common/CandyApiClient/Types/Attachments/Attacments.js +1 -1
  25. package/distr/Common/CandyApiClient/Types/Attachments/GetAttachmentsResponse.js +1 -1
  26. package/distr/Common/CandyApiClient/Types/ChangeSet/ServerChangeSet.js +1 -1
  27. package/distr/Common/CandyApiClient/Types/CreateDraft/CreateDraftResponse.js +1 -1
  28. package/distr/Common/CandyApiClient/Types/DiagResourcesResponse.js +1 -1
  29. package/distr/Common/CandyApiClient/Types/DraftActions/CombineFufResult.js +12 -7
  30. package/distr/Common/CandyApiClient/Types/DraftActions/ConvertDraftRequest.js +1 -1
  31. package/distr/Common/CandyApiClient/Types/DraftActions/FileProperties.js +1 -1
  32. package/distr/Common/CandyApiClient/Types/DraftActions/FufSizeTooLargeError.js +1 -3
  33. package/distr/Common/CandyApiClient/Types/DraftFullId.js +1 -1
  34. package/distr/Common/CandyApiClient/Types/ErrorLog/CandyPopdProtocol.js +5 -6
  35. package/distr/Common/CandyApiClient/Types/ErrorLog/ServerErrorLog.js +9 -12
  36. package/distr/Common/CandyApiClient/Types/ExplanatoryNote/CreateExplanatoryNoteResponse.js +5 -6
  37. package/distr/Common/CandyApiClient/Types/FeatureFlags/FeatureFlagsResponse.js +1 -1
  38. package/distr/Common/CandyApiClient/Types/Focus/FocusServerResponse.js +1 -1
  39. package/distr/Common/CandyApiClient/Types/Focus/FocusTypes.js +5 -6
  40. package/distr/Common/CandyApiClient/Types/GetInner/ServerInnerResponse.js +1 -1
  41. package/distr/Common/CandyApiClient/Types/GetInner/ServerRawResponse.js +1 -3
  42. package/distr/Common/CandyApiClient/Types/GetInner/ServerRequisitesResponse.js +1 -1
  43. package/distr/Common/CandyApiClient/Types/Guid.js +1 -1
  44. package/distr/Common/CandyApiClient/Types/InstancesDeleting/InstancesDeletingRule.js +1 -1
  45. package/distr/Common/CandyApiClient/Types/MassActions/MassActionParameters.js +1 -1
  46. package/distr/Common/CandyApiClient/Types/MassActions/ValueForInstancesSettingRule.js +6 -0
  47. package/distr/Common/CandyApiClient/Types/Presentations/DraftPresentationType.js +5 -6
  48. package/distr/Common/CandyApiClient/Types/Presentations/PresentationContent.js +1 -1
  49. package/distr/Common/CandyApiClient/Types/Print/PrintResponse.js +1 -1
  50. package/distr/Common/CandyApiClient/Types/Print/PrintType.js +5 -6
  51. package/distr/Common/CandyApiClient/Types/Staff/EmployeeInfo.js +1 -1
  52. package/distr/Common/CandyApiClient/Types/Staff/ImportEmployeesOptions.js +1 -1
  53. package/distr/Common/CandyApiClient/Types/Staff/ImportEmployeesRequest.js +1 -1
  54. package/distr/Common/CandyApiClient/Types/Staff/StaffInfo.js +1 -1
  55. package/distr/Common/CandyApiClient/Types/Tasks/GetTasksServerResponse.js +1 -1
  56. package/distr/Common/CandyApiClient/Types/Tasks/Tasks.js +5 -6
  57. package/distr/Common/CandyApiClient/Types/TestClassification.js +1 -1
  58. package/distr/Common/CollectionUtils.js +1 -3
  59. package/distr/Common/CommonConstants/SectionNames.js +1 -3
  60. package/distr/Common/Comparers.js +2 -16
  61. package/distr/Common/EmotionStorybookWorkaroundViaAliases.js +1 -5
  62. package/distr/Common/EndPoints.js +1 -2
  63. package/distr/Common/Enums/ButtonSettingsTypeEnum.js +5 -6
  64. package/distr/Common/Errors.js +1 -19
  65. package/distr/Common/FormActionHandlers/ContextualActionNames.js +1 -3
  66. package/distr/Common/FormActionHandlers/ControlNamedContextualAction.js +1 -1
  67. package/distr/Common/Funcs.js +1 -5
  68. package/distr/Common/GFV.js +1 -1
  69. package/distr/Common/Hooks/UseLocalStorage.js +3 -10
  70. package/distr/Common/HttpClient/AuthenticationMode.js +3 -7
  71. package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithOptionalPolyfill.js +1 -3
  72. package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithPolyfill.js +1 -3
  73. package/distr/Common/HttpClient/FetchImplementation/Fetch.js +1 -1
  74. package/distr/Common/HttpClient/FetchImplementation/NativeBrowserFetch.js +1 -1
  75. package/distr/Common/HttpClient/FetchImplementation/NodeFetch.js +6 -11
  76. package/distr/Common/HttpClient/HttpClient.js +9 -80
  77. package/distr/Common/HttpClient/HttpClientAuthenticationProvider.js +1 -1
  78. package/distr/Common/HttpClient/IHttpClient.js +1 -1
  79. package/distr/Common/IndentString.js +1 -3
  80. package/distr/Common/IntRangeUtils.js +3 -10
  81. package/distr/Common/IterableUtils.js +3 -76
  82. package/distr/Common/KCLangRuntimeUtils.js +1 -87
  83. package/distr/Common/ModelPath/BuildIterationSequence.js +1 -5
  84. package/distr/Common/ModelPath/EachCurrentCollision.js +5 -6
  85. package/distr/Common/ModelPath/IEquatable.js +1 -1
  86. package/distr/Common/ModelPath/Map/AbsoluteModelPathMap.js +1 -8
  87. package/distr/Common/ModelPath/Map/Map2.js +2 -24
  88. package/distr/Common/ModelPath/Map/ModelPathMap.js +1 -8
  89. package/distr/Common/ModelPath/ModelPath.js +16 -140
  90. package/distr/Common/ModelPath/ModelPathBuilder.js +1 -14
  91. package/distr/Common/ModelPath/ModelPathHelper.js +1 -2
  92. package/distr/Common/ModelPath/PathMatcher.js +5 -24
  93. package/distr/Common/ModelPath/PathSplitHelper.js +1 -6
  94. package/distr/Common/ModelPath/Set/AbsoluteModelPathSet.js +1 -10
  95. package/distr/Common/ModelPath/Set/AbsoluteResolvedModelPathSet.js +1 -10
  96. package/distr/Common/ModelPath/Set/ModelPathSet.js +1 -10
  97. package/distr/Common/ModelPath/Set/Set2.js +1 -16
  98. package/distr/Common/NidusClient/ContextualNidusClient/ContextualNidusClient.js +1 -9
  99. package/distr/Common/NidusClient/ContextualNidusClient/IContextualNidusClient.js +1 -1
  100. package/distr/Common/NidusClient/Fakes/CreateUniqueNidusEntryId.js +1 -3
  101. package/distr/Common/NidusClient/Fakes/FakeNidusClient.js +1 -17
  102. package/distr/Common/NidusClient/Fakes/LocalStorageBasedNidusClient.js +1 -30
  103. package/distr/Common/NidusClient/INidusClient.js +1 -3
  104. package/distr/Common/NidusClient/NidusClientContext.js +1 -14
  105. package/distr/Common/NidusClient/NidusClientImpl.js +1 -18
  106. package/distr/Common/PathConstants.js +1 -3
  107. package/distr/Common/StringArrayKey.js +1 -8
  108. package/distr/Common/TypingUtils.js +7 -26
  109. package/distr/Common/UUID.js +1 -4
  110. package/distr/Common/UseAsyncEffect.js +3 -7
  111. package/distr/Common/UseShowOnce.js +1 -17
  112. package/distr/Common/UseTypedSelector.js +1 -3
  113. package/distr/Common/getRngSchemaFilename.js +21 -0
  114. package/distr/Common/hashUtils.js +1 -4
  115. package/distr/Tools/src/BuildTasks/ClientJS/BuildClientJsTask.js +1 -23
  116. package/distr/Tools/src/BuildTasks/ClientJS/IsWebpack5.js +3 -10
  117. package/distr/Tools/src/BuildTasks/Engine/AcquireFormEngine.js +1 -10
  118. package/distr/Tools/src/BuildTasks/Engine/AcquirePublishedEngineTask.js +5 -23
  119. package/distr/Tools/src/BuildTasks/Engine/BuildLocalEngineTask.js +1 -27
  120. package/distr/Tools/src/BuildTasks/Engine/EngineSource.js +1 -2
  121. package/distr/Tools/src/BuildTasks/EngineStructureUtils.js +3 -10
  122. package/distr/Tools/src/BuildTasks/EngineVersionUtils.js +1 -9
  123. package/distr/Tools/src/BuildTasks/FSTask.js +1 -19
  124. package/distr/Tools/src/BuildTasks/Form/CompileForm.js +1 -19
  125. package/distr/Tools/src/BuildTasks/Form/GenerateForm.js +1 -16
  126. package/distr/Tools/src/BuildTasks/Form/NullFormGenerator.js +1 -11
  127. package/distr/Tools/src/BuildTasks/Form/WriteAttachmentPathFiles.js +1 -10
  128. package/distr/Tools/src/BuildTasks/Form/WriteFLangNormalizationFiles.js +1 -10
  129. package/distr/Tools/src/BuildTasks/Generator/AcquireFormGenerator.js +1 -10
  130. package/distr/Tools/src/BuildTasks/Generator/AcquirePublishedGeneratorTask.js +5 -26
  131. package/distr/Tools/src/BuildTasks/Generator/BuildGeneratorFromSourcesTask.js +1 -38
  132. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/CreateAsyncGenerator.js +2 -42
  133. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/GeneratorRequireUtils.js +4 -39
  134. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ProcessSugarWorker.js +4 -7
  135. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ReadSourcesAndProcessSugarWorker.js +4 -10
  136. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/RequireUncached.js +9 -17
  137. package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/TypedProcessWorker.js +3 -5
  138. package/distr/Tools/src/BuildTasks/ProcessUtils/ProcessUtils.js +1 -13
  139. package/distr/Tools/src/BuildTasks/ProcessUtils/ShellProcessHandle.js +1 -20
  140. package/distr/Tools/src/BuildTasks/PublishedVersionUtils.js +3 -48
  141. package/distr/Tools/src/BuildTasks/ReadFormSource.js +7 -32
  142. package/distr/Tools/src/BuildTasks/ResolveFormInfo.js +5 -32
  143. package/distr/Tools/src/BuildTasks/Version.js +1 -10
  144. package/distr/Tools/src/BuildTasks/WriteFormMeta.js +1 -10
  145. package/distr/Tools/src/CLICommands/BuildForms/BuildCacheMode.js +5 -9
  146. package/distr/Tools/src/CLICommands/BuildForms/BuildFormsOptions.js +1 -5
  147. package/distr/Tools/src/CLICommands/BuildForms/RunBuildForms.js +34 -70
  148. package/distr/Tools/src/CLICommands/BuildServer/BuildLogsWebsocketController.js +1 -12
  149. package/distr/Tools/src/CLICommands/BuildServer/BuildServerServerOptions.js +1 -5
  150. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesController.js +1 -67
  151. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesUpdatesController.js +3 -28
  152. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBuildFormsController.js +3 -41
  153. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsController.js +3 -23
  154. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsFromResourcesController.js +3 -20
  155. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerFormInfoController.js +1 -23
  156. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerLocalSourcesEngineController.js +1 -37
  157. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPrebuiltResourcesController.js +1 -13
  158. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPublishedEngineController.js +1 -40
  159. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/BuildFormDevServer.js +8 -49
  160. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ClientJsDevServer.js +1 -13
  161. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/EngineDevServer.js +1 -17
  162. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ReportGeneratorErrorToPageBody.js +1 -4
  163. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/RunFormCompilationViaWebpackDevServer.js +10 -19
  164. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorker.js +12 -26
  165. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorkerFactory.js +1 -5
  166. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IInputFileSystem.js +1 -1
  167. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IWatchFileSystem.js +1 -1
  168. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/WebpackHybridFileSystem.js +10 -44
  169. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/Directories/FarmDirectory.js +1 -17
  170. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/GlobToRegexp.js +1 -5
  171. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/IGeneratedServerSideSourcesProvider.js +1 -1
  172. package/distr/Tools/src/CLICommands/BuildServer/RunBuildServer.js +1 -27
  173. package/distr/Tools/src/CLICommands/BuildServer/StdStreamsIntercepter.js +11 -16
  174. package/distr/Tools/src/CLICommands/CommonOptions/BuildDebugOnlyOption.js +1 -1
  175. package/distr/Tools/src/CLICommands/CommonOptions/CommonOptionDefintions.js +1 -1
  176. package/distr/Tools/src/CLICommands/CommonOptions/CommonOptions.js +1 -1
  177. package/distr/Tools/src/CLICommands/DevBuild/DevBuildOptions.js +1 -4
  178. package/distr/Tools/src/CLICommands/DevBuild/RunDevBuild.js +23 -34
  179. package/distr/Tools/src/CLICommands/FormStats/FormStatsOptions.js +1 -4
  180. package/distr/Tools/src/CLICommands/FormStats/RunFormStats.js +1 -15
  181. package/distr/Tools/src/CLICommands/FormsHelper/FormsHelperController.js +3 -19
  182. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/autocalc/{gfv}.calc.js +1 -2
  183. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/helpers/setKppValue.js +1 -2
  184. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/browser/Smoke.test.js +1 -6
  185. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/ui/DemoTest.test.js +1 -11
  186. package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/validations/kppValue.js +3 -4
  187. package/distr/Tools/src/CLICommands/InitForm/InitFormOptions.js +1 -4
  188. package/distr/Tools/src/CLICommands/InitForm/RunInitForm.js +1 -23
  189. package/distr/Tools/src/CLICommands/Localization/LocalizationOptions.js +1 -4
  190. package/distr/Tools/src/CLICommands/Localization/RunLocalization.js +7 -23
  191. package/distr/Tools/src/CLICommands/RenameFiles/RenameFilesOptions.js +26 -0
  192. package/distr/Tools/src/CLICommands/RenameFiles/RunRenameFiles.js +48 -0
  193. package/distr/Tools/src/CLICommands/UpgradeForm/RunUpgradeForm.js +1 -37
  194. package/distr/Tools/src/CLICommands/UpgradeForm/UpgradeFormOptions.js +1 -4
  195. package/distr/Tools/src/CandyCLI.js +7 -56
  196. package/distr/Tools/src/CheckNodeJsVersion.js +3 -10
  197. package/distr/Tools/src/Commons/ApiClient/ToolsApiClient.js +1 -10
  198. package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplication.js +4 -29
  199. package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplicationContext.js +1 -6
  200. package/distr/Tools/src/Commons/ErrorUntyped.js +1 -1
  201. package/distr/Tools/src/Commons/EventObject.js +10 -20
  202. package/distr/Tools/src/Commons/ExecUtils.js +3 -9
  203. package/distr/Tools/src/Commons/ExtractGfvsFromFileName.js +1 -7
  204. package/distr/Tools/src/Commons/FormGlobsUtils.js +1 -33
  205. package/distr/Tools/src/Commons/FsUtils.js +1 -12
  206. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Actions.js +1 -8
  207. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Methods.js +4 -15
  208. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/NotFoundWebError.js +1 -4
  209. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/CookieParamParamBinder.js +1 -5
  210. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/IParamBinder.js +1 -1
  211. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/JsonBodyParamBinder.js +1 -4
  212. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/StringBodyParamBinder.js +1 -5
  213. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlParamBinder.js +2 -5
  214. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlQueryParamBinder.js +1 -5
  215. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Params.js +1 -14
  216. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomActionResultHandler.js +1 -4
  217. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomContentResultHandler.js +1 -5
  218. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/EmptyResultHandler.js +1 -4
  219. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/HtmlResultHandler.js +1 -4
  220. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/IResultHandler.js +1 -1
  221. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/JsonResultHandler.js +1 -4
  222. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/PlainTextResultHandler.js +1 -4
  223. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/StreamResultHandler.js +1 -36
  224. package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results.js +1 -9
  225. package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/ExpressServerWrapper.js +5 -35
  226. package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/SingletonController.js +9 -11
  227. package/distr/Tools/src/Commons/Locks/Lock.js +1 -8
  228. package/distr/Tools/src/Commons/Locks/LockHandle.js +1 -5
  229. package/distr/Tools/src/Commons/Locks/ReadWriteLockCollection.js +1 -9
  230. package/distr/Tools/src/Commons/Logging/ELKLogger.js +17 -22
  231. package/distr/Tools/src/Commons/Logging/ILogger.js +1 -5
  232. package/distr/Tools/src/Commons/Logging/InMemoryLogger.js +3 -21
  233. package/distr/Tools/src/Commons/Logging/Logger.js +9 -29
  234. package/distr/Tools/src/Commons/Logging/StaticLogger.js +11 -15
  235. package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.d.js +1 -1
  236. package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.js +3 -37
  237. package/distr/Tools/src/Commons/PathPattern.js +1 -13
  238. package/distr/Tools/src/Commons/TasksCore/AggregatedError.js +1 -4
  239. package/distr/Tools/src/Commons/TasksCore/BuildTask.js +1 -1
  240. package/distr/Tools/src/Commons/TasksCore/ChainableValueProducer.js +13 -200
  241. package/distr/Tools/src/Commons/TasksCore/DirectoryEntriesProducer.js +1 -20
  242. package/distr/Tools/src/Commons/TasksCore/EmptyProducer.js +7 -10
  243. package/distr/Tools/src/Commons/TasksCore/FileSystemEntriesProducer.js +1 -15
  244. package/distr/Tools/src/Commons/TasksCore/FileValueProducer.js +1 -15
  245. package/distr/Tools/src/Commons/TasksCore/Observe.js +1 -13
  246. package/distr/Tools/src/Commons/TasksCore/SingleValueProducer.js +5 -11
  247. package/distr/Tools/src/Commons/TimingUtils.js +1 -2
  248. package/distr/Tools/src/FormWebpackConfiguration/CacheAssetsPlugin.js +13 -51
  249. package/distr/Tools/src/FormWebpackConfiguration/createFormWebpackConfiguration.js +4 -14
  250. package/distr/Tools/src/GenerateReadMe.js +1 -13
  251. package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js +1 -1
  252. package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js.LICENSE.txt +10 -1
  253. package/distr/Tools/src/LocalServerFrontEndDist/index.js +1 -1
  254. package/distr/Tools/src/LocalServerFrontEndDist/index.js.LICENSE.txt +10 -1
  255. package/distr/Tools/src/LocalServerFrontEndDist/index.js.map +1 -1
  256. package/distr/Tools/src/Options/CandyToolOptions.js +3 -11
  257. package/distr/Tools/src/ReadFarmConfig.js +1 -5
  258. package/distr/Tools/src/SelfUpdate.js +4 -28
  259. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js +1506 -1257
  260. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js.LICENSE.txt +1 -0
  261. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js.map +1 -1
  262. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js +843 -623
  263. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js.LICENSE.txt +1 -0
  264. package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js.map +1 -1
  265. package/distr/Tools/src/StaticFilesForProductionResourcesDir/jquery-1.11.3.min.js +777 -1117
  266. package/distr/Tools/src/StaticFilesForProductionResourcesDir/polyfill.min.js +1665 -2015
  267. package/distr/Tools/src/StaticFilesForProductionResourcesDir/testing.min.js +9 -55
  268. package/distr/Tools/src/StaticFilesForResourcesDir/jquery-1.11.3.min.js +777 -1117
  269. package/distr/Tools/src/StaticFilesForResourcesDir/polyfill.min.js +1665 -2015
  270. package/distr/Tools/src/StaticFilesForResourcesDir/testing.min.js +9 -55
  271. package/package.json +10 -10
  272. /package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/schemas/{{gfv}.rng.xml → {gfv}.0.rng.xml} +0 -0
@@ -12,40 +12,31 @@ exports.iterateKeys = iterateKeys;
12
12
  exports.iterateValues = iterateValues;
13
13
  exports.reverseArray = reverseArray;
14
14
  exports.toAsyncIterator = toAsyncIterator;
15
-
16
15
  var _TypingUtils = require("./TypingUtils");
17
-
18
16
  var _Errors = require("./Errors");
19
-
20
17
  function* reverseArray(array) {
21
18
  for (let i = array.length - 1; i >= 0; i--) {
22
19
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
23
20
  yield array[i];
24
21
  }
25
22
  }
26
-
27
23
  function toAsyncIterator(generator) {
28
24
  return AsyncIterator.from(generator());
29
25
  }
30
-
31
26
  function findLast(items, condition) {
32
27
  let result;
33
-
34
28
  for (const item of items) {
35
29
  if (condition(item)) {
36
30
  result = item;
37
31
  }
38
32
  }
39
-
40
33
  return result;
41
34
  }
42
-
43
35
  function* concat(...iterables) {
44
36
  for (const iterableItem of iterables) {
45
37
  yield* iterableItem;
46
38
  }
47
39
  }
48
-
49
40
  function* iterateValues(obj) {
50
41
  for (const key in obj) {
51
42
  if (Object.prototype.hasOwnProperty.call(obj, key)) {
@@ -53,7 +44,6 @@ function* iterateValues(obj) {
53
44
  }
54
45
  }
55
46
  }
56
-
57
47
  function* iterateKeys(obj) {
58
48
  for (const key in obj) {
59
49
  if (Object.prototype.hasOwnProperty.call(obj, key)) {
@@ -61,7 +51,6 @@ function* iterateKeys(obj) {
61
51
  }
62
52
  }
63
53
  }
64
-
65
54
  function* iterateEntries(obj) {
66
55
  for (const key in obj) {
67
56
  if (Object.prototype.hasOwnProperty.call(obj, key)) {
@@ -70,52 +59,40 @@ function* iterateEntries(obj) {
70
59
  }
71
60
  }
72
61
  }
73
-
74
62
  function count(items) {
75
63
  let result = 0;
76
-
77
64
  for (const _item of items) {
78
65
  result++;
79
66
  }
80
-
81
67
  return result;
82
68
  }
83
-
84
69
  const EmptySingleElement = Symbol.for("EmptySingleElement");
85
70
  const NoValueMarker = Symbol.for("NoValueMarker");
86
-
87
71
  class IterUtils {
88
72
  static isEmpty(iterable) {
89
73
  for (const _item of iterable) {
90
74
  return false;
91
75
  }
92
-
93
76
  return true;
94
77
  }
95
-
96
78
  static groupBy(iterable, selectKey) {
97
79
  const result = new Map();
98
-
99
80
  for (const item of iterable) {
100
81
  const key = selectKey(item);
101
82
  const keyList = result.get(key);
102
-
103
83
  if (keyList == undefined) {
104
84
  result.set(key, [item]);
105
85
  } else {
106
86
  keyList.push(item);
107
87
  }
108
88
  }
109
-
110
89
  return result;
111
90
  }
112
-
113
91
  static sortBy(items, selector) {
114
92
  const result = [...items];
115
93
  result.sort((aItem, bItem) => {
116
94
  const leftValue = selector(aItem);
117
95
  const rightValue = selector(bItem);
118
-
119
96
  if (leftValue === rightValue) {
120
97
  return 0;
121
98
  } else if (leftValue < rightValue) {
@@ -126,98 +103,75 @@ class IterUtils {
126
103
  });
127
104
  return result;
128
105
  }
129
-
130
106
  static last(items) {
131
107
  if (Array.isArray(items)) {
132
108
  return items[items.length - 1];
133
109
  }
134
-
135
110
  let lastItem;
136
-
137
111
  for (const item of items) {
138
112
  lastItem = item;
139
113
  }
140
-
141
114
  return lastItem;
142
115
  }
143
-
144
116
  static first(items) {
145
117
  if (Array.isArray(items)) {
146
118
  return items[0];
147
119
  }
148
-
149
120
  let firstItem;
150
-
151
121
  for (const item of items) {
152
122
  firstItem = item;
153
123
  break;
154
124
  }
155
-
156
125
  return firstItem;
157
126
  }
158
-
159
127
  static single(items, singleAssertMessage) {
160
128
  if (Array.isArray(items)) {
161
129
  var _items$;
162
-
163
130
  if (items.length !== 1) {
164
131
  throw new Error(singleAssertMessage !== null && singleAssertMessage !== void 0 ? singleAssertMessage : `Sequence must contain exactly single element, but got ${items.length}`);
165
132
  }
166
-
167
133
  return (_items$ = items[0]) !== null && _items$ !== void 0 ? _items$ : (0, _TypingUtils.reject)();
168
134
  } else {
169
135
  let singleElement = EmptySingleElement;
170
-
171
136
  for (const item of items) {
172
137
  if (singleElement !== EmptySingleElement) {
173
138
  throw new Error(singleAssertMessage !== null && singleAssertMessage !== void 0 ? singleAssertMessage : `Sequence must contain exactly single element, but got at least 2`);
174
139
  }
175
-
176
140
  singleElement = item;
177
141
  }
178
-
179
142
  if (singleElement === EmptySingleElement) {
180
143
  throw new Error(singleAssertMessage !== null && singleAssertMessage !== void 0 ? singleAssertMessage : "Sequence must contain exactly single element, but got 0");
181
144
  }
182
-
183
145
  return singleElement;
184
146
  }
185
147
  }
186
-
187
148
  static *iterateEntries(items) {
188
149
  let index = 0;
189
-
190
150
  for (const item of items) {
191
151
  yield [index, item];
192
152
  index++;
193
153
  }
194
154
  }
195
-
196
155
  static *skipLast(items, skipCount) {
197
156
  if (skipCount === 0) {
198
157
  yield* items;
199
158
  return;
200
159
  }
201
-
202
160
  const prevItems = new Array(skipCount).fill(EmptySingleElement);
203
161
  let resultItem = EmptySingleElement;
204
162
  let currentIndex = 0;
205
-
206
163
  for (const item of items) {
207
164
  // @ts-expect-error В общем, строка выше гарантирует длину массива
208
165
  resultItem = prevItems[currentIndex];
209
166
  prevItems[currentIndex] = item;
210
167
  currentIndex = (currentIndex + 1) % skipCount;
211
-
212
168
  if (resultItem != EmptySingleElement) {
213
169
  yield resultItem;
214
170
  }
215
171
  }
216
172
  }
217
-
218
173
  static minBy(items, compareFunc) {
219
174
  let minValue = NoValueMarker;
220
-
221
175
  for (const item of items) {
222
176
  if (minValue === NoValueMarker) {
223
177
  minValue = item;
@@ -225,17 +179,13 @@ class IterUtils {
225
179
  minValue = item;
226
180
  }
227
181
  }
228
-
229
182
  if (minValue === NoValueMarker) {
230
183
  throw new _Errors.InvalidArgumentError("items", "Items should be not empty list");
231
184
  }
232
-
233
185
  return minValue;
234
186
  }
235
-
236
187
  static minByOrUndefined(items, compareFunc) {
237
188
  let minValue = NoValueMarker;
238
-
239
189
  for (const item of items) {
240
190
  if (minValue === NoValueMarker) {
241
191
  minValue = item;
@@ -243,57 +193,46 @@ class IterUtils {
243
193
  minValue = item;
244
194
  }
245
195
  }
246
-
247
196
  if (minValue === NoValueMarker) {
248
197
  return undefined;
249
198
  }
250
-
251
199
  return minValue;
252
200
  }
253
-
254
201
  static *range(inStartOrCount, inItemCount) {
255
202
  const start = inItemCount === undefined ? 0 : inStartOrCount;
256
203
  const itemCount = inItemCount === undefined ? inStartOrCount : inItemCount;
257
-
258
204
  if (itemCount < 0) {
259
205
  throw new _Errors.InvalidArgumentError("itemCount", "itemCount must be a non negative number");
260
206
  }
261
-
262
207
  for (let i = start; i < start + itemCount; i++) {
263
208
  yield i;
264
209
  }
265
210
  }
211
+
266
212
  /**
267
213
  * @summary Вставляет между элементами массива заданный элемент и возвращает новый массив
268
214
  */
269
-
270
-
271
215
  static intersperse(items, item) {
272
216
  return this.intersperseFn(items, () => item);
273
217
  }
218
+
274
219
  /**
275
220
  * @summary Вставляет между элементами массива элемент, создаваемый функцией, и возвращает новый массив
276
221
  */
277
-
278
-
279
222
  static intersperseFn(items, item) {
280
223
  return items.flatMap((x, index) => index === 0 ? [x] : [item(x, index), x]);
281
224
  }
282
-
283
225
  static *zip(...iterables) {
284
226
  const iterators = iterables.map(it => Iterator.from(it));
285
227
  let hasUndoneIterators = true;
286
-
287
228
  while (hasUndoneIterators) {
288
229
  const resultEntry = [];
289
230
  hasUndoneIterators = false;
290
-
291
231
  for (const [i, iterator] of this.iterateEntries(iterators)) {
292
232
  if (iterator === NoValueMarker) {
293
233
  resultEntry.push(undefined);
294
234
  } else {
295
235
  const resultValue = iterator.next();
296
-
297
236
  if (resultValue.done) {
298
237
  resultEntry.push(undefined);
299
238
  iterators[i] = NoValueMarker;
@@ -303,42 +242,33 @@ class IterUtils {
303
242
  }
304
243
  }
305
244
  }
306
-
307
245
  if (hasUndoneIterators) {
308
246
  yield resultEntry;
309
247
  }
310
248
  }
311
249
  }
312
-
313
250
  static *distinctBy(items, idSelector) {
314
251
  const set = new Set();
315
-
316
252
  for (const item of items) {
317
253
  const id = idSelector(item);
318
-
319
254
  if (!set.has(id)) {
320
255
  set.add(id);
321
256
  yield item;
322
257
  }
323
258
  }
324
259
  }
325
-
326
260
  static reduce(items, reducer, initialValue) {
327
261
  let index = 0;
328
262
  return Iterator.from(items).reduce((acc, item) => reducer(acc, item, index++), initialValue);
329
263
  }
330
-
331
264
  static *batch(items, batchSize) {
332
265
  const iterator = Iterator.from(items);
333
266
  const safeBatchSize = batchSize > 0 ? batchSize : 1;
334
267
  let done = false;
335
-
336
268
  while (!done) {
337
269
  const batch = [];
338
-
339
270
  while (batch.length < safeBatchSize) {
340
271
  const current = iterator.next();
341
-
342
272
  if (current.done) {
343
273
  done = true;
344
274
  break;
@@ -346,16 +276,13 @@ class IterUtils {
346
276
  batch.push(current.value);
347
277
  }
348
278
  }
349
-
350
279
  if (batch.length > 0) {
351
280
  yield batch;
352
281
  }
353
282
  }
354
283
  }
355
-
356
284
  }
357
-
358
285
  exports.IterUtils = IterUtils;
359
286
  IterUtils.count = count;
360
287
  IterUtils.concat = concat;
361
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL0NvbW1vbi9JdGVyYWJsZVV0aWxzLnRzIl0sIm5hbWVzIjpbInJldmVyc2VBcnJheSIsImFycmF5IiwiaSIsImxlbmd0aCIsInRvQXN5bmNJdGVyYXRvciIsImdlbmVyYXRvciIsIkFzeW5jSXRlcmF0b3IiLCJmcm9tIiwiZmluZExhc3QiLCJpdGVtcyIsImNvbmRpdGlvbiIsInJlc3VsdCIsIml0ZW0iLCJjb25jYXQiLCJpdGVyYWJsZXMiLCJpdGVyYWJsZUl0ZW0iLCJpdGVyYXRlVmFsdWVzIiwib2JqIiwia2V5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaXRlcmF0ZUtleXMiLCJpdGVyYXRlRW50cmllcyIsImNvdW50IiwiX2l0ZW0iLCJFbXB0eVNpbmdsZUVsZW1lbnQiLCJTeW1ib2wiLCJmb3IiLCJOb1ZhbHVlTWFya2VyIiwiSXRlclV0aWxzIiwiaXNFbXB0eSIsIml0ZXJhYmxlIiwiZ3JvdXBCeSIsInNlbGVjdEtleSIsIk1hcCIsImtleUxpc3QiLCJnZXQiLCJ1bmRlZmluZWQiLCJzZXQiLCJwdXNoIiwic29ydEJ5Iiwic2VsZWN0b3IiLCJzb3J0IiwiYUl0ZW0iLCJiSXRlbSIsImxlZnRWYWx1ZSIsInJpZ2h0VmFsdWUiLCJsYXN0IiwiQXJyYXkiLCJpc0FycmF5IiwibGFzdEl0ZW0iLCJmaXJzdCIsImZpcnN0SXRlbSIsInNpbmdsZSIsInNpbmdsZUFzc2VydE1lc3NhZ2UiLCJFcnJvciIsInNpbmdsZUVsZW1lbnQiLCJpbmRleCIsInNraXBMYXN0Iiwic2tpcENvdW50IiwicHJldkl0ZW1zIiwiZmlsbCIsInJlc3VsdEl0ZW0iLCJjdXJyZW50SW5kZXgiLCJtaW5CeSIsImNvbXBhcmVGdW5jIiwibWluVmFsdWUiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIm1pbkJ5T3JVbmRlZmluZWQiLCJyYW5nZSIsImluU3RhcnRPckNvdW50IiwiaW5JdGVtQ291bnQiLCJzdGFydCIsIml0ZW1Db3VudCIsImludGVyc3BlcnNlIiwiaW50ZXJzcGVyc2VGbiIsImZsYXRNYXAiLCJ4IiwiemlwIiwiaXRlcmF0b3JzIiwibWFwIiwiaXQiLCJJdGVyYXRvciIsImhhc1VuZG9uZUl0ZXJhdG9ycyIsInJlc3VsdEVudHJ5IiwiaXRlcmF0b3IiLCJyZXN1bHRWYWx1ZSIsIm5leHQiLCJkb25lIiwidmFsdWUiLCJkaXN0aW5jdEJ5IiwiaWRTZWxlY3RvciIsIlNldCIsImlkIiwiaGFzIiwiYWRkIiwicmVkdWNlIiwicmVkdWNlciIsImluaXRpYWxWYWx1ZSIsImFjYyIsImJhdGNoIiwiYmF0Y2hTaXplIiwic2FmZUJhdGNoU2l6ZSIsImN1cnJlbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBOztBQUVPLFVBQVVBLFlBQVYsQ0FBMEJDLEtBQTFCLEVBQW9FO0FBQ3ZFLE9BQUssSUFBSUMsQ0FBQyxHQUFHRCxLQUFLLENBQUNFLE1BQU4sR0FBZSxDQUE1QixFQUErQkQsQ0FBQyxJQUFJLENBQXBDLEVBQXVDQSxDQUFDLEVBQXhDLEVBQTRDO0FBQ3hDO0FBQ0EsVUFBTUQsS0FBSyxDQUFDQyxDQUFELENBQVg7QUFDSDtBQUNKOztBQUVNLFNBQVNFLGVBQVQsQ0FBNEJDLFNBQTVCLEVBQTBGO0FBQzdGLFNBQU9DLGFBQWEsQ0FBQ0MsSUFBZCxDQUFtQkYsU0FBUyxFQUE1QixDQUFQO0FBQ0g7O0FBRU0sU0FBU0csUUFBVCxDQUFxQkMsS0FBckIsRUFBeUNDLFNBQXpDLEVBQXlGO0FBQzVGLE1BQUlDLE1BQUo7O0FBQ0EsT0FBSyxNQUFNQyxJQUFYLElBQW1CSCxLQUFuQixFQUEwQjtBQUN0QixRQUFJQyxTQUFTLENBQUNFLElBQUQsQ0FBYixFQUFxQjtBQUNqQkQsTUFBQUEsTUFBTSxHQUFHQyxJQUFUO0FBQ0g7QUFDSjs7QUFDRCxTQUFPRCxNQUFQO0FBQ0g7O0FBRU0sVUFBVUUsTUFBVixDQUFvQixHQUFHQyxTQUF2QixFQUEyRTtBQUM5RSxPQUFLLE1BQU1DLFlBQVgsSUFBMkJE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QUFJLEdBQUcsSUFBUDtBQUNBO0FBQ0gsU0FIRCxNQUdPO0FBQ0hZLFVBQUFBLEtBQUssQ0FBQzdELElBQU4sQ0FBV2dFLE9BQU8sQ0FBQ2QsS0FBbkI7QUFDSDtBQUNKOztBQUNELFVBQUlXLEtBQUssQ0FBQ25HLE1BQU4sR0FBZSxDQUFuQixFQUFzQjtBQUNsQixjQUFNbUcsS0FBTjtBQUNIO0FBQ0o7QUFDSjs7QUF2UGtCOzs7QUFBVnZFLFMsQ0FDS04sSyxHQUFRQSxLO0FBRGJNLFMsQ0FFS2xCLE0sR0FBU0EsTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1pbkxlbmd0aEFycmF5LCByZWplY3QgfSBmcm9tIFwiLi9UeXBpbmdVdGlsc1wiO1xuaW1wb3J0IHsgQ29tcGFyZUZ1bmMgfSBmcm9tIFwiLi9Db21wYXJlcnNcIjtcbmltcG9ydCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gZnJvbSBcIi4vRXJyb3JzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiogcmV2ZXJzZUFycmF5PFQ+KGFycmF5OiByZWFkb25seSBUW10pOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgeWllbGQgYXJyYXlbaV0hO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQXN5bmNJdGVyYXRvcjxUPihnZW5lcmF0b3I6ICgpID0+IEFzeW5jR2VuZXJhdG9yPFQ+KTogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICByZXR1cm4gQXN5bmNJdGVyYXRvci5mcm9tKGdlbmVyYXRvcigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiwgY29uZGl0aW9uOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIGxldCByZXN1bHQ6IFQgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24oaXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBjb25jYXQ8VD4oLi4uaXRlcmFibGVzOiBBcnJheTxJdGVyYWJsZTxUPj4pOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICBmb3IgKGNvbnN0IGl0ZXJhYmxlSXRlbSBvZiBpdGVyYWJsZXMpIHtcbiAgICAgICAgeWllbGQqIGl0ZXJhYmxlSXRlbTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZVZhbHVlczxUSyBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCB8IG51bWJlciwgVFY+KG9iajogeyBba2V5IGluIFRLXTogVFYgfSk6IEl0ZXJhYmxlPFRWPiB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICB5aWVsZCBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzPFRPPihvYmo6IFJlYWRvbmx5PFRPPik6IEl0ZXJhYmxlPEV4dHJhY3Q8a2V5b2YgVE8sIHN0cmluZz4+O1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzPFRWPihvYmo6IFJlYWRvbmx5PHsgW2tleTogc3RyaW5nXTogVFYgfT4pOiBJdGVyYWJsZTxzdHJpbmc+O1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzKG9iajogUmVhZG9ubHk8e30+KTogSXRlcmFibGU8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZUtleXM8VEsgZXh0ZW5kcyBzdHJpbmcgfCBzeW1ib2wgfCBudW1iZXI+KG9iajogeyBba2V5IGluIFRLXTogdW5rbm93biB9KTogSXRlcmFibGU8VEs+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIHlpZWxkIGtleTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVFbnRyaWVzPFRPPihvYmo6IFJlYWRvbmx5PFRPPik6IEl0ZXJhYmxlPFtFeHRyYWN0PGtleW9mIFRPLCBzdHJpbmc+LCBUT1trZXlvZiBUT11dPjtcbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlRW50cmllczxUVj4ob2JqOiBSZWFkb25seTx7IFtrZXk6IHN0cmluZ106IFRWIH0+KTogSXRlcmFibGU8W3N0cmluZywgVFZdPjtcbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlRW50cmllcyhvYmo6IFJlYWRvbmx5PHt9Pik6IEl0ZXJhYmxlPFtzdHJpbmcsIHVua25vd25dPjtcbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZUVudHJpZXM8VFY+KG9iajogUmVhZG9ubHk8eyBba2V5OiBzdHJpbmddOiBUViB9Pik6IEl0ZXJhYmxlPFtzdHJpbmcsIFRWXT4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgIHlpZWxkIFtrZXksIG9ialtrZXldIV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3VudDxUPihpdGVtczogSXRlcmFibGU8VD4pOiBudW1iZXIge1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGZvciAoY29uc3QgX2l0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgcmVzdWx0Kys7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IEVtcHR5U2luZ2xlRWxlbWVudCA9IFN5bWJvbC5mb3IoXCJFbXB0eVNpbmdsZUVsZW1lbnRcIik7XG5jb25zdCBOb1ZhbHVlTWFya2VyID0gU3ltYm9sLmZvcihcIk5vVmFsdWVNYXJrZXJcIik7XG5cbmV4cG9ydCBjbGFzcyBJdGVyVXRpbHMge1xuICAgIHB1YmxpYyBzdGF0aWMgY291bnQgPSBjb3VudDtcbiAgICBwdWJsaWMgc3RhdGljIGNvbmNhdCA9IGNvbmNhdDtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNFbXB0eTxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4pOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChjb25zdCBfaXRlbSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXBCeTxULCBUS2V5PihpdGVyYWJsZTogSXRlcmFibGU8VD4sIHNlbGVjdEtleTogKGl0ZW06IFQpID0+IFRLZXkpOiBNYXA8VEtleSwgVFtdPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8VEtleSwgVFtdPigpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHNlbGVjdEtleShpdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IGtleUxpc3QgPSByZXN1bHQuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoa2V5TGlzdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgW2l0ZW1dKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAga2V5TGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzb3J0Qnk8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCBzZWxlY3RvcjogKGl0ZW06IFQpID0+IHN0cmluZyB8IG51bWJlcik6IFRbXSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5pdGVtc107XG4gICAgICAgIHJlc3VsdC5zb3J0KChhSXRlbSwgYkl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRWYWx1ZSA9IHNlbGVjdG9yKGFJdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0VmFsdWUgPSBzZWxlY3RvcihiSXRlbSk7XG4gICAgICAgICAgICBpZiAobGVmdFZhbHVlID09PSByaWdodFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRWYWx1ZSA8IHJpZ2h0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGxhc3Q8VD4oaXRlbXM6IE1pbkxlbmd0aEFycmF5PFQsIDE+KTogVDtcbiAgICBwdWJsaWMgc3RhdGljIGxhc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVDtcbiAgICBwdWJsaWMgc3RhdGljIGxhc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsYXN0SXRlbTogVCB8IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBsYXN0SXRlbSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhc3RJdGVtO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZmlyc3Q8VD4oaXRlbXM6IFtULCAuLi51bmtub3duW11dKTogVDtcbiAgICBwdWJsaWMgc3RhdGljIGZpcnN0PFQ+KGl0ZW1zOiBNaW5MZW5ndGhBcnJheTxULCAxPik6IFQ7XG4gICAgcHVibGljIHN0YXRpYyBmaXJzdDxUPihpdGVtczogSXRlcmFibGU8VD4gfCByZWFkb25seSBUW10pOiB1bmRlZmluZWQgfCBUO1xuICAgIHB1YmxpYyBzdGF0aWMgZmlyc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zWzBdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaXJzdEl0ZW06IFQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgZmlyc3RJdGVtID0gaXRlbTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaXJzdEl0ZW07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzaW5nbGU8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSB8IEl0ZXJhYmxlPFQ+LCBzaW5nbGVBc3NlcnRNZXNzYWdlPzogc3RyaW5nKTogVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgc2luZ2xlQXNzZXJ0TWVzc2FnZSA/PyBgU2VxdWVuY2UgbXVzdCBjb250YWluIGV4YWN0bHkgc2luZ2xlIGVsZW1lbnQsIGJ1dCBnb3QgJHtpdGVtcy5sZW5ndGh9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbXNbMF0gPz8gcmVqZWN0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2luZ2xlRWxlbWVudDogVCB8IHR5cGVvZiBFbXB0eVNpbmdsZUVsZW1lbnQgPSBFbXB0eVNpbmdsZUVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlRWxlbWVudCAhPT0gRW1wdHlTaW5nbGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUFzc2VydE1lc3NhZ2UgPz8gYFNlcXVlbmNlIG11c3QgY29udGFpbiBleGFjdGx5IHNpbmdsZSBlbGVtZW50LCBidXQgZ290IGF0IGxlYXN0IDJgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNpbmdsZUVsZW1lbnQgPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNpbmdsZUVsZW1lbnQgPT09IEVtcHR5U2luZ2xlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzaW5nbGVBc3NlcnRNZXNzYWdlID8/IFwiU2VxdWVuY2UgbXVzdCBjb250YWluIGV4YWN0bHkgc2luZ2xlIGVsZW1lbnQsIGJ1dCBnb3QgMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaW5nbGVFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqaXRlcmF0ZUVudHJpZXM8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSB8IFRbXSB8IEl0ZXJhYmxlPFQ+KTogSXRlcmFibGU8W251bWJlciwgVF0+IHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICB5aWVsZCBbaW5kZXgsIGl0ZW1dO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgKnNraXBMYXN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiwgc2tpcENvdW50OiBudW1iZXIpOiBJdGVyYWJsZTxUPiB7XG4gICAgICAgIGlmIChza2lwQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHlpZWxkKiBpdGVtcztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2SXRlbXM6IEFycmF5PFQgfCB0eXBlb2YgRW1wdHlTaW5nbGVFbGVtZW50PiA9IG5ldyBBcnJheShza2lwQ291bnQpLmZpbGwoRW1wdHlTaW5nbGVFbGVtZW50KTtcbiAgICAgICAgbGV0IHJlc3VsdEl0ZW06IFQgfCB0eXBlb2YgRW1wdHlTaW5nbGVFbGVtZW50ID0gRW1wdHlTaW5nbGVFbGVtZW50O1xuICAgICAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yINCSINC+0LHRidC10LwsINGB0YLRgNC+0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC90YLQuNGA0YPQtdGCINC00LvQuNC90YMg0LzQsNGB0YHQuNCy0LBcbiAgICAgICAgICAgIHJlc3VsdEl0ZW0gPSBwcmV2SXRlbXNbY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIHByZXZJdGVtc1tjdXJyZW50SW5kZXhdID0gaXRlbTtcbiAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IChjdXJyZW50SW5kZXggKyAxKSAlIHNraXBDb3VudDtcbiAgICAgICAgICAgIGlmIChyZXN1bHRJdGVtICE9IEVtcHR5U2luZ2xlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdEl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1pbkJ5PFQ+KGl0ZW1zOiByZWFkb25seSBUW10gfCBUW10gfCBJdGVyYWJsZTxUPiwgY29tcGFyZUZ1bmM6IENvbXBhcmVGdW5jPFQ+KTogVCB7XG4gICAgICAgIGxldCBtaW5WYWx1ZTogdHlwZW9mIE5vVmFsdWVNYXJrZXIgfCBUID0gTm9WYWx1ZU1hcmtlcjtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAobWluVmFsdWUgPT09IE5vVmFsdWVNYXJrZXIpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmVGdW5jKGl0ZW0sIG1pblZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pblZhbHVlID09PSBOb1ZhbHVlTWFya2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJpdGVtc1wiLCBcIkl0ZW1zIHNob3VsZCBiZSBub3QgZW1wdHkgbGlzdFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBtaW5CeU9yVW5kZWZpbmVkPFQ+KFxuICAgICAgICBpdGVtczogcmVhZG9ubHkgVFtdIHwgVFtdIHwgSXRlcmFibGU8VD4sXG4gICAgICAgIGNvbXBhcmVGdW5jOiBDb21wYXJlRnVuYzxUPlxuICAgICk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgbWluVmFsdWU6IHR5cGVvZiBOb1ZhbHVlTWFya2VyIHwgVCA9IE5vVmFsdWVNYXJrZXI7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgaWYgKG1pblZhbHVlID09PSBOb1ZhbHVlTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSBpdGVtO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wYXJlRnVuYyhpdGVtLCBtaW5WYWx1ZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaW5WYWx1ZSA9PT0gTm9WYWx1ZU1hcmtlcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByYW5nZShpdGVtQ291bnQ6IG51bWJlcik6IEl0ZXJhYmxlPG51bWJlcj47XG4gICAgcHVibGljIHN0YXRpYyByYW5nZShzdGFydDogbnVtYmVyLCBpdGVtQ291bnQ6IG51bWJlcik6IEl0ZXJhYmxlPG51bWJlcj47XG4gICAgcHVibGljIHN0YXRpYyAqcmFuZ2UoaW5TdGFydE9yQ291bnQ6IG51bWJlciwgaW5JdGVtQ291bnQ/OiBudW1iZXIpOiBJdGVyYWJsZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBpbkl0ZW1Db3VudCA9PT0gdW5kZWZpbmVkID8gMCA6IGluU3RhcnRPckNvdW50O1xuICAgICAgICBjb25zdCBpdGVtQ291bnQgPSBpbkl0ZW1Db3VudCA9PT0gdW5kZWZpbmVkID8gaW5TdGFydE9yQ291bnQgOiBpbkl0ZW1Db3VudDtcbiAgICAgICAgaWYgKGl0ZW1Db3VudCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIml0ZW1Db3VudFwiLCBcIml0ZW1Db3VudCBtdXN0IGJlIGEgbm9uIG5lZ2F0aXZlIG51bWJlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdGFydCArIGl0ZW1Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICB5aWVsZCBpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkg0JLRgdGC0LDQstC70Y/QtdGCINC80LXQttC00YMg0Y3Qu9C10LzQtdC90YLQsNC80Lgg0LzQsNGB0YHQuNCy0LAg0LfQsNC00LDQvdC90YvQuSDRjdC70LXQvNC10L3RgiDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDQvdC+0LLRi9C5INC80LDRgdGB0LjQslxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJzcGVyc2U8VEksIFRTPihpdGVtczogVElbXSwgaXRlbTogVFMpOiBBcnJheTxUSSB8IFRTPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVyc3BlcnNlRm4oaXRlbXMsICgpID0+IGl0ZW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCS0YHRgtCw0LLQu9GP0LXRgiDQvNC10LbQtNGDINGN0LvQtdC80LXQvdGC0LDQvNC4INC80LDRgdGB0LjQstCwINGN0LvQtdC80LXQvdGCLCDRgdC+0LfQtNCw0LLQsNC10LzRi9C5INGE0YPQvdC60YbQuNC10LksINC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC90L7QstGL0Lkg0LzQsNGB0YHQuNCyXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpbnRlcnNwZXJzZUZuPFRJLCBUUz4oaXRlbXM6IFRJW10sIGl0ZW06IChuZXh0SXRlbTogVEksIGluZGV4OiBudW1iZXIpID0+IFRTKTogQXJyYXk8VEkgfCBUUz4ge1xuICAgICAgICByZXR1cm4gaXRlbXMuZmxhdE1hcCgoeCwgaW5kZXgpID0+IChpbmRleCA9PT0gMCA/IFt4XSA6IFtpdGVtKHgsIGluZGV4KSwgeF0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHppcDxUMSwgVDI+KGl0ZW1zMTogSXRlcmFibGU8VDE+LCBpdGVtczI6IEl0ZXJhYmxlPFQyPik6IEl0ZXJhYmxlPFtUMSB8IHVuZGVmaW5lZCwgVDIgfCB1bmRlZmluZWRdPjtcbiAgICBwdWJsaWMgc3RhdGljICp6aXAoLi4uaXRlcmFibGVzOiBBcnJheTxJdGVyYWJsZTx1bmtub3duPj4pOiBJdGVyYWJsZTx1bmtub3duW10+IHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3JzOiBBcnJheTxJdGVyYXRvcjx1bmtub3duPiB8IHR5cGVvZiBOb1ZhbHVlTWFya2VyPiA9IGl0ZXJhYmxlcy5tYXAoaXQgPT4gSXRlcmF0b3IuZnJvbShpdCkpO1xuICAgICAgICBsZXQgaGFzVW5kb25lSXRlcmF0b3JzID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKGhhc1VuZG9uZUl0ZXJhdG9ycykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0RW50cnkgPSBbXTtcbiAgICAgICAgICAgIGhhc1VuZG9uZUl0ZXJhdG9ycyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaSwgaXRlcmF0b3JdIG9mIHRoaXMuaXRlcmF0ZUVudHJpZXMoaXRlcmF0b3JzKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvciA9PT0gTm9WYWx1ZU1hcmtlcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRFbnRyeS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0VmFsdWUgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRWYWx1ZS5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFbnRyeS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcnNbaV0gPSBOb1ZhbHVlTWFya2VyO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RW50cnkucHVzaChyZXN1bHRWYWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNVbmRvbmVJdGVyYXRvcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc1VuZG9uZUl0ZXJhdG9ycykge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdEVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqZGlzdGluY3RCeTxUPihpdGVtczogSXRlcmFibGU8VD4sIGlkU2VsZWN0b3I6IChpdGVtOiBUKSA9PiBzdHJpbmcpOiBJdGVyYWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gaWRTZWxlY3RvcihpdGVtKTtcbiAgICAgICAgICAgIGlmICghc2V0LmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICBzZXQuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICB5aWVsZCBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWR1Y2U8VCwgVT4oXG4gICAgICAgIGl0ZW1zOiBJdGVyYWJsZTxUPixcbiAgICAgICAgcmVkdWNlcjogKGFjY3VtdWxhdG9yOiBVLCBpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBVLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFVcbiAgICApOiBVIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgcmV0dXJuIEl0ZXJhdG9yLmZyb20oaXRlbXMpLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiByZWR1Y2VyKGFjYywgaXRlbSwgaW5kZXgrKyksIGluaXRpYWxWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqYmF0Y2g8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCBiYXRjaFNpemU6IG51bWJlcik6IEl0ZXJhYmxlPEl0ZXJhYmxlPFQ+PiB7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gSXRlcmF0b3IuZnJvbShpdGVtcyk7XG4gICAgICAgIGNvbnN0IHNhZmVCYXRjaFNpemUgPSBiYXRjaFNpemUgPiAwID8gYmF0Y2hTaXplIDogMTtcbiAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaDogVFtdID0gW107XG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoIDwgc2FmZUJhdGNoU2l6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGJhdGNoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19
288
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfVHlwaW5nVXRpbHMiLCJyZXF1aXJlIiwiX0Vycm9ycyIsInJldmVyc2VBcnJheSIsImFycmF5IiwiaSIsImxlbmd0aCIsInRvQXN5bmNJdGVyYXRvciIsImdlbmVyYXRvciIsIkFzeW5jSXRlcmF0b3IiLCJmcm9tIiwiZmluZExhc3QiLCJpdGVtcyIsImNvbmRpdGlvbiIsInJlc3VsdCIsIml0ZW0iLCJjb25jYXQiLCJpdGVyYWJsZXMiLCJpdGVyYWJsZUl0ZW0iLCJpdGVyYXRlVmFsdWVzIiwib2JqIiwia2V5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaXRlcmF0ZUtleXMiLCJpdGVyYXRlRW50cmllcyIsImNvdW50IiwiX2l0ZW0iLCJFbXB0eVNpbmdsZUVsZW1lbnQiLCJTeW1ib2wiLCJmb3IiLCJOb1ZhbHVlTWFya2VyIiwiSXRlclV0aWxzIiwiaXNFbXB0eSIsIml0ZXJhYmxlIiwiZ3JvdXBCeSIsInNlbGVjdEtleSIsIk1hcCIsImtleUxpc3QiLCJnZXQiLCJ1bmRlZmluZWQiLCJzZXQiLCJwdXNoIiwic29ydEJ5Iiwic2VsZWN0b3IiLCJzb3J0IiwiYUl0ZW0iLCJiSXRlbSIsImxlZnRWYWx1ZSIsInJpZ2h0VmFsdWUiLCJsYXN0IiwiQXJyYXkiLCJpc0FycmF5IiwibGFzdEl0ZW0iLCJmaXJzdCIsImZpcnN0SXRlbSIsInNpbmdsZSIsInNpbmdsZUFzc2VydE1lc3NhZ2UiLCJfaXRlbXMkIiwiRXJyb3IiLCJyZWplY3QiLCJzaW5nbGVFbGVtZW50IiwiaW5kZXgiLCJza2lwTGFzdCIsInNraXBDb3VudCIsInByZXZJdGVtcyIsImZpbGwiLCJyZXN1bHRJdGVtIiwiY3VycmVudEluZGV4IiwibWluQnkiLCJjb21wYXJlRnVuYyIsIm1pblZhbHVlIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJtaW5CeU9yVW5kZWZpbmVkIiwicmFuZ2UiLCJpblN0YXJ0T3JDb3VudCIsImluSXRlbUNvdW50Iiwic3RhcnQiLCJpdGVtQ291bnQiLCJpbnRlcnNwZXJzZSIsImludGVyc3BlcnNlRm4iLCJmbGF0TWFwIiwieCIsInppcCIsIml0ZXJhdG9ycyIsIm1hcCIsIml0IiwiSXRlcmF0b3IiLCJoYXNVbmRvbmVJdGVyYXRvcnMiLCJyZXN1bHRFbnRyeSIsIml0ZXJhdG9yIiwicmVzdWx0VmFsdWUiLCJuZXh0IiwiZG9uZSIsInZhbHVlIiwiZGlzdGluY3RCeSIsImlkU2VsZWN0b3IiLCJTZXQiLCJpZCIsImhhcyIsImFkZCIsInJlZHVjZSIsInJlZHVjZXIiLCJpbml0aWFsVmFsdWUiLCJhY2MiLCJiYXRjaCIsImJhdGNoU2l6ZSIsInNhZmVCYXRjaFNpemUiLCJjdXJyZW50IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL0NvbW1vbi9JdGVyYWJsZVV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1pbkxlbmd0aEFycmF5LCByZWplY3QgfSBmcm9tIFwiLi9UeXBpbmdVdGlsc1wiO1xuaW1wb3J0IHsgQ29tcGFyZUZ1bmMgfSBmcm9tIFwiLi9Db21wYXJlcnNcIjtcbmltcG9ydCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gZnJvbSBcIi4vRXJyb3JzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiogcmV2ZXJzZUFycmF5PFQ+KGFycmF5OiByZWFkb25seSBUW10pOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgeWllbGQgYXJyYXlbaV0hO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQXN5bmNJdGVyYXRvcjxUPihnZW5lcmF0b3I6ICgpID0+IEFzeW5jR2VuZXJhdG9yPFQ+KTogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICByZXR1cm4gQXN5bmNJdGVyYXRvci5mcm9tKGdlbmVyYXRvcigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiwgY29uZGl0aW9uOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIGxldCByZXN1bHQ6IFQgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24oaXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBjb25jYXQ8VD4oLi4uaXRlcmFibGVzOiBBcnJheTxJdGVyYWJsZTxUPj4pOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICBmb3IgKGNvbnN0IGl0ZXJhYmxlSXRlbSBvZiBpdGVyYWJsZXMpIHtcbiAgICAgICAgeWllbGQqIGl0ZXJhYmxlSXRlbTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZVZhbHVlczxUSyBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCB8IG51bWJlciwgVFY+KG9iajogeyBba2V5IGluIFRLXTogVFYgfSk6IEl0ZXJhYmxlPFRWPiB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICB5aWVsZCBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzPFRPPihvYmo6IFJlYWRvbmx5PFRPPik6IEl0ZXJhYmxlPEV4dHJhY3Q8a2V5b2YgVE8sIHN0cmluZz4+O1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzPFRWPihvYmo6IFJlYWRvbmx5PHsgW2tleTogc3RyaW5nXTogVFYgfT4pOiBJdGVyYWJsZTxzdHJpbmc+O1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzKG9iajogUmVhZG9ubHk8e30+KTogSXRlcmFibGU8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZUtleXM8VEsgZXh0ZW5kcyBzdHJpbmcgfCBzeW1ib2wgfCBudW1iZXI+KG9iajogeyBba2V5IGluIFRLXTogdW5rbm93biB9KTogSXRlcmFibGU8VEs+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIHlpZWxkIGtleTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVFbnRyaWVzPFRPPihvYmo6IFJlYWRvbmx5PFRPPik6IEl0ZXJhYmxlPFtFeHRyYWN0PGtleW9mIFRPLCBzdHJpbmc+LCBUT1trZXlvZiBUT11dPjtcbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlRW50cmllczxUVj4ob2JqOiBSZWFkb25seTx7IFtrZXk6IHN0cmluZ106IFRWIH0+KTogSXRlcmFibGU8W3N0cmluZywgVFZdPjtcbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlRW50cmllcyhvYmo6IFJlYWRvbmx5PHt9Pik6IEl0ZXJhYmxlPFtzdHJpbmcsIHVua25vd25dPjtcbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZUVudHJpZXM8VFY+KG9iajogUmVhZG9ubHk8eyBba2V5OiBzdHJpbmddOiBUViB9Pik6IEl0ZXJhYmxlPFtzdHJpbmcsIFRWXT4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgIHlpZWxkIFtrZXksIG9ialtrZXldIV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3VudDxUPihpdGVtczogSXRlcmFibGU8VD4pOiBudW1iZXIge1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGZvciAoY29uc3QgX2l0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgcmVzdWx0Kys7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IEVtcHR5U2luZ2xlRWxlbWVudCA9IFN5bWJvbC5mb3IoXCJFbXB0eVNpbmdsZUVsZW1lbnRcIik7XG5jb25zdCBOb1ZhbHVlTWFya2VyID0gU3ltYm9sLmZvcihcIk5vVmFsdWVNYXJrZXJcIik7XG5cbmV4cG9ydCBjbGFzcyBJdGVyVXRpbHMge1xuICAgIHB1YmxpYyBzdGF0aWMgY291bnQgPSBjb3VudDtcbiAgICBwdWJsaWMgc3RhdGljIGNvbmNhdCA9IGNvbmNhdDtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNFbXB0eTxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4pOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChjb25zdCBfaXRlbSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ3JvdXBCeTxULCBUS2V5PihpdGVyYWJsZTogSXRlcmFibGU8VD4sIHNlbGVjdEtleTogKGl0ZW06IFQpID0+IFRLZXkpOiBNYXA8VEtleSwgVFtdPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8VEtleSwgVFtdPigpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHNlbGVjdEtleShpdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IGtleUxpc3QgPSByZXN1bHQuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoa2V5TGlzdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgW2l0ZW1dKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAga2V5TGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzb3J0Qnk8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCBzZWxlY3RvcjogKGl0ZW06IFQpID0+IHN0cmluZyB8IG51bWJlcik6IFRbXSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5pdGVtc107XG4gICAgICAgIHJlc3VsdC5zb3J0KChhSXRlbSwgYkl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRWYWx1ZSA9IHNlbGVjdG9yKGFJdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0VmFsdWUgPSBzZWxlY3RvcihiSXRlbSk7XG4gICAgICAgICAgICBpZiAobGVmdFZhbHVlID09PSByaWdodFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRWYWx1ZSA8IHJpZ2h0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGxhc3Q8VD4oaXRlbXM6IE1pbkxlbmd0aEFycmF5PFQsIDE+KTogVDtcbiAgICBwdWJsaWMgc3RhdGljIGxhc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVDtcbiAgICBwdWJsaWMgc3RhdGljIGxhc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsYXN0SXRlbTogVCB8IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBsYXN0SXRlbSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhc3RJdGVtO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZmlyc3Q8VD4oaXRlbXM6IFtULCAuLi51bmtub3duW11dKTogVDtcbiAgICBwdWJsaWMgc3RhdGljIGZpcnN0PFQ+KGl0ZW1zOiBNaW5MZW5ndGhBcnJheTxULCAxPik6IFQ7XG4gICAgcHVibGljIHN0YXRpYyBmaXJzdDxUPihpdGVtczogSXRlcmFibGU8VD4gfCByZWFkb25seSBUW10pOiB1bmRlZmluZWQgfCBUO1xuICAgIHB1YmxpYyBzdGF0aWMgZmlyc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zWzBdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaXJzdEl0ZW06IFQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgZmlyc3RJdGVtID0gaXRlbTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaXJzdEl0ZW07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzaW5nbGU8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSB8IEl0ZXJhYmxlPFQ+LCBzaW5nbGVBc3NlcnRNZXNzYWdlPzogc3RyaW5nKTogVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgc2luZ2xlQXNzZXJ0TWVzc2FnZSA/PyBgU2VxdWVuY2UgbXVzdCBjb250YWluIGV4YWN0bHkgc2luZ2xlIGVsZW1lbnQsIGJ1dCBnb3QgJHtpdGVtcy5sZW5ndGh9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbXNbMF0gPz8gcmVqZWN0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2luZ2xlRWxlbWVudDogVCB8IHR5cGVvZiBFbXB0eVNpbmdsZUVsZW1lbnQgPSBFbXB0eVNpbmdsZUVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlRWxlbWVudCAhPT0gRW1wdHlTaW5nbGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUFzc2VydE1lc3NhZ2UgPz8gYFNlcXVlbmNlIG11c3QgY29udGFpbiBleGFjdGx5IHNpbmdsZSBlbGVtZW50LCBidXQgZ290IGF0IGxlYXN0IDJgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNpbmdsZUVsZW1lbnQgPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNpbmdsZUVsZW1lbnQgPT09IEVtcHR5U2luZ2xlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzaW5nbGVBc3NlcnRNZXNzYWdlID8/IFwiU2VxdWVuY2UgbXVzdCBjb250YWluIGV4YWN0bHkgc2luZ2xlIGVsZW1lbnQsIGJ1dCBnb3QgMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaW5nbGVFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqaXRlcmF0ZUVudHJpZXM8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSB8IFRbXSB8IEl0ZXJhYmxlPFQ+KTogSXRlcmFibGU8W251bWJlciwgVF0+IHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICB5aWVsZCBbaW5kZXgsIGl0ZW1dO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgKnNraXBMYXN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiwgc2tpcENvdW50OiBudW1iZXIpOiBJdGVyYWJsZTxUPiB7XG4gICAgICAgIGlmIChza2lwQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHlpZWxkKiBpdGVtcztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2SXRlbXM6IEFycmF5PFQgfCB0eXBlb2YgRW1wdHlTaW5nbGVFbGVtZW50PiA9IG5ldyBBcnJheShza2lwQ291bnQpLmZpbGwoRW1wdHlTaW5nbGVFbGVtZW50KTtcbiAgICAgICAgbGV0IHJlc3VsdEl0ZW06IFQgfCB0eXBlb2YgRW1wdHlTaW5nbGVFbGVtZW50ID0gRW1wdHlTaW5nbGVFbGVtZW50O1xuICAgICAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yINCSINC+0LHRidC10LwsINGB0YLRgNC+0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC90YLQuNGA0YPQtdGCINC00LvQuNC90YMg0LzQsNGB0YHQuNCy0LBcbiAgICAgICAgICAgIHJlc3VsdEl0ZW0gPSBwcmV2SXRlbXNbY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIHByZXZJdGVtc1tjdXJyZW50SW5kZXhdID0gaXRlbTtcbiAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IChjdXJyZW50SW5kZXggKyAxKSAlIHNraXBDb3VudDtcbiAgICAgICAgICAgIGlmIChyZXN1bHRJdGVtICE9IEVtcHR5U2luZ2xlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdEl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1pbkJ5PFQ+KGl0ZW1zOiByZWFkb25seSBUW10gfCBUW10gfCBJdGVyYWJsZTxUPiwgY29tcGFyZUZ1bmM6IENvbXBhcmVGdW5jPFQ+KTogVCB7XG4gICAgICAgIGxldCBtaW5WYWx1ZTogdHlwZW9mIE5vVmFsdWVNYXJrZXIgfCBUID0gTm9WYWx1ZU1hcmtlcjtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAobWluVmFsdWUgPT09IE5vVmFsdWVNYXJrZXIpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmVGdW5jKGl0ZW0sIG1pblZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pblZhbHVlID09PSBOb1ZhbHVlTWFya2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJpdGVtc1wiLCBcIkl0ZW1zIHNob3VsZCBiZSBub3QgZW1wdHkgbGlzdFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBtaW5CeU9yVW5kZWZpbmVkPFQ+KFxuICAgICAgICBpdGVtczogcmVhZG9ubHkgVFtdIHwgVFtdIHwgSXRlcmFibGU8VD4sXG4gICAgICAgIGNvbXBhcmVGdW5jOiBDb21wYXJlRnVuYzxUPlxuICAgICk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgbWluVmFsdWU6IHR5cGVvZiBOb1ZhbHVlTWFya2VyIHwgVCA9IE5vVmFsdWVNYXJrZXI7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgaWYgKG1pblZhbHVlID09PSBOb1ZhbHVlTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSBpdGVtO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wYXJlRnVuYyhpdGVtLCBtaW5WYWx1ZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaW5WYWx1ZSA9PT0gTm9WYWx1ZU1hcmtlcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByYW5nZShpdGVtQ291bnQ6IG51bWJlcik6IEl0ZXJhYmxlPG51bWJlcj47XG4gICAgcHVibGljIHN0YXRpYyByYW5nZShzdGFydDogbnVtYmVyLCBpdGVtQ291bnQ6IG51bWJlcik6IEl0ZXJhYmxlPG51bWJlcj47XG4gICAgcHVibGljIHN0YXRpYyAqcmFuZ2UoaW5TdGFydE9yQ291bnQ6IG51bWJlciwgaW5JdGVtQ291bnQ/OiBudW1iZXIpOiBJdGVyYWJsZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBpbkl0ZW1Db3VudCA9PT0gdW5kZWZpbmVkID8gMCA6IGluU3RhcnRPckNvdW50O1xuICAgICAgICBjb25zdCBpdGVtQ291bnQgPSBpbkl0ZW1Db3VudCA9PT0gdW5kZWZpbmVkID8gaW5TdGFydE9yQ291bnQgOiBpbkl0ZW1Db3VudDtcbiAgICAgICAgaWYgKGl0ZW1Db3VudCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIml0ZW1Db3VudFwiLCBcIml0ZW1Db3VudCBtdXN0IGJlIGEgbm9uIG5lZ2F0aXZlIG51bWJlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdGFydCArIGl0ZW1Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICB5aWVsZCBpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkg0JLRgdGC0LDQstC70Y/QtdGCINC80LXQttC00YMg0Y3Qu9C10LzQtdC90YLQsNC80Lgg0LzQsNGB0YHQuNCy0LAg0LfQsNC00LDQvdC90YvQuSDRjdC70LXQvNC10L3RgiDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDQvdC+0LLRi9C5INC80LDRgdGB0LjQslxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJzcGVyc2U8VEksIFRTPihpdGVtczogVElbXSwgaXRlbTogVFMpOiBBcnJheTxUSSB8IFRTPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVyc3BlcnNlRm4oaXRlbXMsICgpID0+IGl0ZW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCS0YHRgtCw0LLQu9GP0LXRgiDQvNC10LbQtNGDINGN0LvQtdC80LXQvdGC0LDQvNC4INC80LDRgdGB0LjQstCwINGN0LvQtdC80LXQvdGCLCDRgdC+0LfQtNCw0LLQsNC10LzRi9C5INGE0YPQvdC60YbQuNC10LksINC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC90L7QstGL0Lkg0LzQsNGB0YHQuNCyXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpbnRlcnNwZXJzZUZuPFRJLCBUUz4oaXRlbXM6IFRJW10sIGl0ZW06IChuZXh0SXRlbTogVEksIGluZGV4OiBudW1iZXIpID0+IFRTKTogQXJyYXk8VEkgfCBUUz4ge1xuICAgICAgICByZXR1cm4gaXRlbXMuZmxhdE1hcCgoeCwgaW5kZXgpID0+IChpbmRleCA9PT0gMCA/IFt4XSA6IFtpdGVtKHgsIGluZGV4KSwgeF0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHppcDxUMSwgVDI+KGl0ZW1zMTogSXRlcmFibGU8VDE+LCBpdGVtczI6IEl0ZXJhYmxlPFQyPik6IEl0ZXJhYmxlPFtUMSB8IHVuZGVmaW5lZCwgVDIgfCB1bmRlZmluZWRdPjtcbiAgICBwdWJsaWMgc3RhdGljICp6aXAoLi4uaXRlcmFibGVzOiBBcnJheTxJdGVyYWJsZTx1bmtub3duPj4pOiBJdGVyYWJsZTx1bmtub3duW10+IHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3JzOiBBcnJheTxJdGVyYXRvcjx1bmtub3duPiB8IHR5cGVvZiBOb1ZhbHVlTWFya2VyPiA9IGl0ZXJhYmxlcy5tYXAoaXQgPT4gSXRlcmF0b3IuZnJvbShpdCkpO1xuICAgICAgICBsZXQgaGFzVW5kb25lSXRlcmF0b3JzID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKGhhc1VuZG9uZUl0ZXJhdG9ycykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0RW50cnkgPSBbXTtcbiAgICAgICAgICAgIGhhc1VuZG9uZUl0ZXJhdG9ycyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaSwgaXRlcmF0b3JdIG9mIHRoaXMuaXRlcmF0ZUVudHJpZXMoaXRlcmF0b3JzKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvciA9PT0gTm9WYWx1ZU1hcmtlcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRFbnRyeS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0VmFsdWUgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRWYWx1ZS5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFbnRyeS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcnNbaV0gPSBOb1ZhbHVlTWFya2VyO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RW50cnkucHVzaChyZXN1bHRWYWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNVbmRvbmVJdGVyYXRvcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc1VuZG9uZUl0ZXJhdG9ycykge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdEVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqZGlzdGluY3RCeTxUPihpdGVtczogSXRlcmFibGU8VD4sIGlkU2VsZWN0b3I6IChpdGVtOiBUKSA9PiBzdHJpbmcpOiBJdGVyYWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gaWRTZWxlY3RvcihpdGVtKTtcbiAgICAgICAgICAgIGlmICghc2V0LmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICBzZXQuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICB5aWVsZCBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWR1Y2U8VCwgVT4oXG4gICAgICAgIGl0ZW1zOiBJdGVyYWJsZTxUPixcbiAgICAgICAgcmVkdWNlcjogKGFjY3VtdWxhdG9yOiBVLCBpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBVLFxuICAgICAgICBpbml0aWFsVmFsdWU6IFVcbiAgICApOiBVIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgcmV0dXJuIEl0ZXJhdG9yLmZyb20oaXRlbXMpLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiByZWR1Y2VyKGFjYywgaXRlbSwgaW5kZXgrKyksIGluaXRpYWxWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqYmF0Y2g8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCBiYXRjaFNpemU6IG51bWJlcik6IEl0ZXJhYmxlPEl0ZXJhYmxlPFQ+PiB7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gSXRlcmF0b3IuZnJvbShpdGVtcyk7XG4gICAgICAgIGNvbnN0IHNhZmVCYXRjaFNpemUgPSBiYXRjaFNpemUgPiAwID8gYmF0Y2hTaXplIDogMTtcbiAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaDogVFtdID0gW107XG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoIDwgc2FmZUJhdGNoU2l6ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2gucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGJhdGNoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxu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