@kontur.candy/tools 2.210.1-cgroupv2.0 → 2.210.1-cgroupv2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/distr/Common/AsyncUtils.js +18 -0
- package/distr/Common/AsyncUtils.js.map +1 -0
- package/distr/Common/AutoValidationUtils.js +8 -0
- package/distr/Common/AutoValidationUtils.js.map +1 -0
- package/distr/Common/CandyApiClient/CandyApiClient.js +578 -0
- package/distr/Common/CandyApiClient/CandyApiClient.js.map +1 -0
- package/distr/Common/CandyApiClient/CandyApiClientContext.js +18 -0
- package/distr/Common/CandyApiClient/CandyApiClientContext.js.map +1 -0
- package/distr/Common/CandyApiClient/ClientDraftInfo/ClientDraftInfoResponse.js +6 -0
- package/distr/Common/CandyApiClient/ClientDraftInfo/ClientDraftInfoResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/ClientDraftInfo/FnsFormInfo.js +6 -0
- package/distr/Common/CandyApiClient/ClientDraftInfo/FnsFormInfo.js.map +1 -0
- package/distr/Common/CandyApiClient/ClientDraftInfo/GetClientDraftInfoUrl.js +12 -0
- package/distr/Common/CandyApiClient/ClientDraftInfo/GetClientDraftInfoUrl.js.map +1 -0
- package/distr/Common/CandyApiClient/ClientDraftInfo/PrintInfo.js +6 -0
- package/distr/Common/CandyApiClient/ClientDraftInfo/PrintInfo.js.map +1 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithCache.js +33 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithCache.js.map +1 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithDebouncedBatching.js +35 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithDebouncedBatching.js.map +1 -0
- package/distr/Common/CandyApiClient/DigestApiClient/DigestApiClient.js +20 -0
- package/distr/Common/CandyApiClient/DigestApiClient/DigestApiClient.js.map +1 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Fakes/Data/TaxRebate1152026.js +89 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Fakes/Data/TaxRebate1152026.js.map +1 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakeDigestApiClient.js +42 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakeDigestApiClient.js.map +1 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakePicklists.js +9 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakePicklists.js.map +1 -0
- package/distr/Common/CandyApiClient/DigestApiClient/IDigestApiClient.js +6 -0
- package/distr/Common/CandyApiClient/DigestApiClient/IDigestApiClient.js.map +1 -0
- package/distr/Common/CandyApiClient/DigestApiClient/React/DigestApiClientContext.js +18 -0
- package/distr/Common/CandyApiClient/DigestApiClient/React/DigestApiClientContext.js.map +1 -0
- package/distr/Common/CandyApiClient/DigestApiClient/TestDigestApiClient.js +15 -0
- package/distr/Common/CandyApiClient/DigestApiClient/TestDigestApiClient.js.map +1 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestQueryFilter.js +19 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestQueryFilter.js.map +1 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestRequest.js +6 -0
- package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestRequest.js.map +1 -0
- package/distr/Common/CandyApiClient/FakeCandyApiClient.js +248 -0
- package/distr/Common/CandyApiClient/FakeCandyApiClient.js.map +1 -0
- package/distr/Common/CandyApiClient/ICandyApiClient.js +6 -0
- package/distr/Common/CandyApiClient/ICandyApiClient.js.map +1 -0
- package/distr/Common/CandyApiClient/IsBuffer.js +15 -0
- package/distr/Common/CandyApiClient/IsBuffer.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Attachments/Attacments.js +6 -0
- package/distr/Common/CandyApiClient/Types/Attachments/Attacments.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Attachments/GetAttachmentsResponse.js +6 -0
- package/distr/Common/CandyApiClient/Types/Attachments/GetAttachmentsResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/ChangeSet/ServerChangeSet.js +6 -0
- package/distr/Common/CandyApiClient/Types/ChangeSet/ServerChangeSet.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/CreateDraft/CreateDraftResponse.js +6 -0
- package/distr/Common/CandyApiClient/Types/CreateDraft/CreateDraftResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/DiagResourcesResponse.js +6 -0
- package/distr/Common/CandyApiClient/Types/DiagResourcesResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/DraftActions/CombineFufResult.js +24 -0
- package/distr/Common/CandyApiClient/Types/DraftActions/CombineFufResult.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/DraftActions/ConvertDraftRequest.js +6 -0
- package/distr/Common/CandyApiClient/Types/DraftActions/ConvertDraftRequest.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/DraftActions/FileProperties.js +6 -0
- package/distr/Common/CandyApiClient/Types/DraftActions/FileProperties.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/DraftActions/FufSizeTooLargeError.js +9 -0
- package/distr/Common/CandyApiClient/Types/DraftActions/FufSizeTooLargeError.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/DraftFullId.js +6 -0
- package/distr/Common/CandyApiClient/Types/DraftFullId.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/ErrorLog/CandyPopdProtocol.js +12 -0
- package/distr/Common/CandyApiClient/Types/ErrorLog/CandyPopdProtocol.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/ErrorLog/ResolveInnerPathRequest.js +6 -0
- package/distr/Common/CandyApiClient/Types/ErrorLog/ResolveInnerPathRequest.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/ErrorLog/ResolvePathResponse.js +6 -0
- package/distr/Common/CandyApiClient/Types/ErrorLog/ResolvePathResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/ErrorLog/ServerErrorLog.js +17 -0
- package/distr/Common/CandyApiClient/Types/ErrorLog/ServerErrorLog.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/ExplanatoryNote/CreateExplanatoryNoteResponse.js +13 -0
- package/distr/Common/CandyApiClient/Types/ExplanatoryNote/CreateExplanatoryNoteResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/FeatureFlags/FeatureFlagsResponse.js +6 -0
- package/distr/Common/CandyApiClient/Types/FeatureFlags/FeatureFlagsResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Focus/FocusServerResponse.js +6 -0
- package/distr/Common/CandyApiClient/Types/Focus/FocusServerResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Focus/FocusTypes.js +15 -0
- package/distr/Common/CandyApiClient/Types/Focus/FocusTypes.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/GetInner/ServerInnerResponse.js +6 -0
- package/distr/Common/CandyApiClient/Types/GetInner/ServerInnerResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/GetInner/ServerRawResponse.js +9 -0
- package/distr/Common/CandyApiClient/Types/GetInner/ServerRawResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/GetInner/ServerRequisitesResponse.js +6 -0
- package/distr/Common/CandyApiClient/Types/GetInner/ServerRequisitesResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Guid.js +6 -0
- package/distr/Common/CandyApiClient/Types/Guid.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/InstancesDeleting/InstancesDeletingRule.js +6 -0
- package/distr/Common/CandyApiClient/Types/InstancesDeleting/InstancesDeletingRule.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/MassActions/MassActionParameters.js +6 -0
- package/distr/Common/CandyApiClient/Types/MassActions/MassActionParameters.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/MassActions/ValueForInstancesSettingRule.js +6 -0
- package/distr/Common/CandyApiClient/Types/MassActions/ValueForInstancesSettingRule.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Presentations/DraftPresentationType.js +24 -0
- package/distr/Common/CandyApiClient/Types/Presentations/DraftPresentationType.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Presentations/PresentationContent.js +6 -0
- package/distr/Common/CandyApiClient/Types/Presentations/PresentationContent.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Print/PrintResponse.js +6 -0
- package/distr/Common/CandyApiClient/Types/Print/PrintResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Print/PrintType.js +12 -0
- package/distr/Common/CandyApiClient/Types/Print/PrintType.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/AndExpression.js +15 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/AndExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/CompareExpression.js +19 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/CompareExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/CountCallExpression.js +15 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/CountCallExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/DecimalConstantExpression.js +15 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/DecimalConstantExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/InstanceIdCallExpression.js +13 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/InstanceIdCallExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/NotExpression.js +15 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/NotExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/OrExpression.js +15 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/OrExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/StringConstantExpression.js +15 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/StringConstantExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/StringMatchExpression.js +21 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/StringMatchExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/SumCallExpression.js +15 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/SumCallExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/TernaryExpression.js +19 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/TernaryExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/ValueReferenceExpression.js +15 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/Expressions/ValueReferenceExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/InnerQueryExpression.js +6 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/InnerQueryExpression.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/InnerQueryRequest.js +26 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/InnerQueryRequest.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/InnerQueryResponse.js +6 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/InnerQueryResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/SelectClause.js +16 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/SelectClause.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/SortingRule.js +16 -0
- package/distr/Common/CandyApiClient/Types/QueryCollecton/SortingRule.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Staff/EmployeeInfo.js +6 -0
- package/distr/Common/CandyApiClient/Types/Staff/EmployeeInfo.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Staff/ImportEmployeesOptions.js +6 -0
- package/distr/Common/CandyApiClient/Types/Staff/ImportEmployeesOptions.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Staff/ImportEmployeesRequest.js +6 -0
- package/distr/Common/CandyApiClient/Types/Staff/ImportEmployeesRequest.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Staff/StaffInfo.js +6 -0
- package/distr/Common/CandyApiClient/Types/Staff/StaffInfo.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Tasks/GetTasksServerResponse.js +6 -0
- package/distr/Common/CandyApiClient/Types/Tasks/GetTasksServerResponse.js.map +1 -0
- package/distr/Common/CandyApiClient/Types/Tasks/Tasks.js +14 -0
- package/distr/Common/CandyApiClient/Types/Tasks/Tasks.js.map +1 -0
- package/distr/Common/CollectionUtils.js +15 -0
- package/distr/Common/CollectionUtils.js.map +1 -0
- package/distr/Common/CommonConstants/SectionNames.js +11 -0
- package/distr/Common/CommonConstants/SectionNames.js.map +1 -0
- package/distr/Common/Comparers.js +63 -0
- package/distr/Common/Comparers.js.map +1 -0
- package/distr/Common/EmotionStorybookWorkaroundViaAliases.js +22 -0
- package/distr/Common/EmotionStorybookWorkaroundViaAliases.js.map +1 -0
- package/distr/Common/EndPoints.js +16 -0
- package/distr/Common/EndPoints.js.map +1 -0
- package/distr/Common/Enums/ButtonSettingsTypeEnum.js +12 -0
- package/distr/Common/Enums/ButtonSettingsTypeEnum.js.map +1 -0
- package/distr/Common/Errors.js +44 -0
- package/distr/Common/Errors.js.map +1 -0
- package/distr/Common/ExtractGFVPath/ExtractGFVPath.js +31 -0
- package/distr/Common/ExtractGFVPath/ExtractGFVPath.js.map +1 -0
- package/distr/Common/FSPrinterClient/FSPrinterClient.js +153 -0
- package/distr/Common/FSPrinterClient/FSPrinterClient.js.map +1 -0
- package/distr/Common/FSPrinterClient/FakeFSPrinterClient.js +19 -0
- package/distr/Common/FSPrinterClient/FakeFSPrinterClient.js.map +1 -0
- package/distr/Common/FSPrinterClient/IFSPrinterClient.js +39 -0
- package/distr/Common/FSPrinterClient/IFSPrinterClient.js.map +1 -0
- package/distr/Common/FormActionHandlers/ContextualActionNames.js +14 -0
- package/distr/Common/FormActionHandlers/ContextualActionNames.js.map +1 -0
- package/distr/Common/FormActionHandlers/ControlNamedContextualAction.js +6 -0
- package/distr/Common/FormActionHandlers/ControlNamedContextualAction.js.map +1 -0
- package/distr/Common/FormPathUtils.js +21 -0
- package/distr/Common/FormPathUtils.js.map +1 -0
- package/distr/Common/Funcs.js +11 -0
- package/distr/Common/Funcs.js.map +1 -0
- package/distr/Common/GFV.js +6 -0
- package/distr/Common/GFV.js.map +1 -0
- package/distr/Common/GetRngSchemaFileExtension.js +26 -0
- package/distr/Common/GetRngSchemaFileExtension.js.map +1 -0
- package/distr/Common/Hooks/UseLocalStorage.js +35 -0
- package/distr/Common/Hooks/UseLocalStorage.js.map +1 -0
- package/distr/Common/HttpClient/AuthenticationMode.js +31 -0
- package/distr/Common/HttpClient/AuthenticationMode.js.map +1 -0
- package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithOptionalPolyfill.js +9 -0
- package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithOptionalPolyfill.js.map +1 -0
- package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithPolyfill.js +9 -0
- package/distr/Common/HttpClient/FetchImplementation/BrowserFetchWithPolyfill.js.map +1 -0
- package/distr/Common/HttpClient/FetchImplementation/Fetch.js +6 -0
- package/distr/Common/HttpClient/FetchImplementation/Fetch.js.map +1 -0
- package/distr/Common/HttpClient/FetchImplementation/NativeBrowserFetch.js +8 -0
- package/distr/Common/HttpClient/FetchImplementation/NativeBrowserFetch.js.map +1 -0
- package/distr/Common/HttpClient/FetchImplementation/NodeFetch.js +36 -0
- package/distr/Common/HttpClient/FetchImplementation/NodeFetch.js.map +1 -0
- package/distr/Common/HttpClient/HttpClient.js +313 -0
- package/distr/Common/HttpClient/HttpClient.js.map +1 -0
- package/distr/Common/HttpClient/HttpClientAuthenticationProvider.js +6 -0
- package/distr/Common/HttpClient/HttpClientAuthenticationProvider.js.map +1 -0
- package/distr/Common/HttpClient/IHttpClient.js +6 -0
- package/distr/Common/HttpClient/IHttpClient.js.map +1 -0
- package/distr/Common/IndentString.js +16 -0
- package/distr/Common/IndentString.js.map +1 -0
- package/distr/Common/IntRangeUtils.js +32 -0
- package/distr/Common/IntRangeUtils.js.map +1 -0
- package/distr/Common/IterableUtils.js +288 -0
- package/distr/Common/IterableUtils.js.map +1 -0
- package/distr/Common/KCLangRuntimeUtils.js +266 -0
- package/distr/Common/KCLangRuntimeUtils.js.map +1 -0
- package/distr/Common/ModelPath/AbsoluteModelFieldPath.js +55 -0
- package/distr/Common/ModelPath/AbsoluteModelFieldPath.js.map +1 -0
- package/distr/Common/ModelPath/BuildIterationSequence.js +41 -0
- package/distr/Common/ModelPath/BuildIterationSequence.js.map +1 -0
- package/distr/Common/ModelPath/EachCurrentCollision.js +12 -0
- package/distr/Common/ModelPath/EachCurrentCollision.js.map +1 -0
- package/distr/Common/ModelPath/IEquatable.js +6 -0
- package/distr/Common/ModelPath/IEquatable.js.map +1 -0
- package/distr/Common/ModelPath/Map/AbsoluteModelPathMap.js +23 -0
- package/distr/Common/ModelPath/Map/AbsoluteModelPathMap.js.map +1 -0
- package/distr/Common/ModelPath/Map/Map2.js +99 -0
- package/distr/Common/ModelPath/Map/Map2.js.map +1 -0
- package/distr/Common/ModelPath/Map/ModelPathMap.js +23 -0
- package/distr/Common/ModelPath/Map/ModelPathMap.js.map +1 -0
- package/distr/Common/ModelPath/ModelPath.js +476 -0
- package/distr/Common/ModelPath/ModelPath.js.map +1 -0
- package/distr/Common/ModelPath/ModelPathBuilder.js +42 -0
- package/distr/Common/ModelPath/ModelPathBuilder.js.map +1 -0
- package/distr/Common/ModelPath/ModelPathHelper.js +34 -0
- package/distr/Common/ModelPath/ModelPathHelper.js.map +1 -0
- package/distr/Common/ModelPath/PathMatcher.js +95 -0
- package/distr/Common/ModelPath/PathMatcher.js.map +1 -0
- package/distr/Common/ModelPath/PathSplitHelper.js +21 -0
- package/distr/Common/ModelPath/PathSplitHelper.js.map +1 -0
- package/distr/Common/ModelPath/Set/AbsoluteModelPathSet.js +31 -0
- package/distr/Common/ModelPath/Set/AbsoluteModelPathSet.js.map +1 -0
- package/distr/Common/ModelPath/Set/AbsoluteResolvedModelPathSet.js +31 -0
- package/distr/Common/ModelPath/Set/AbsoluteResolvedModelPathSet.js.map +1 -0
- package/distr/Common/ModelPath/Set/ModelPathSet.js +31 -0
- package/distr/Common/ModelPath/Set/ModelPathSet.js.map +1 -0
- package/distr/Common/ModelPath/Set/Set2.js +59 -0
- package/distr/Common/ModelPath/Set/Set2.js.map +1 -0
- package/distr/Common/NidusClient/ContextualNidusClient/ContextualNidusClient.js +33 -0
- package/distr/Common/NidusClient/ContextualNidusClient/ContextualNidusClient.js.map +1 -0
- package/distr/Common/NidusClient/ContextualNidusClient/IContextualNidusClient.js +6 -0
- package/distr/Common/NidusClient/ContextualNidusClient/IContextualNidusClient.js.map +1 -0
- package/distr/Common/NidusClient/Fakes/CreateUniqueNidusEntryId.js +11 -0
- package/distr/Common/NidusClient/Fakes/CreateUniqueNidusEntryId.js.map +1 -0
- package/distr/Common/NidusClient/Fakes/FakeNidusClient.js +66 -0
- package/distr/Common/NidusClient/Fakes/FakeNidusClient.js.map +1 -0
- package/distr/Common/NidusClient/Fakes/LocalStorageBasedNidusClient.js +108 -0
- package/distr/Common/NidusClient/Fakes/LocalStorageBasedNidusClient.js.map +1 -0
- package/distr/Common/NidusClient/INidusClient.js +14 -0
- package/distr/Common/NidusClient/INidusClient.js.map +1 -0
- package/distr/Common/NidusClient/NidusClientContext.js +34 -0
- package/distr/Common/NidusClient/NidusClientContext.js.map +1 -0
- package/distr/Common/NidusClient/NidusClientImpl.js +55 -0
- package/distr/Common/NidusClient/NidusClientImpl.js.map +1 -0
- package/distr/Common/PathConstants.js +11 -0
- package/distr/Common/PathConstants.js.map +1 -0
- package/distr/Common/PicklistApiClient/IPicklistApiClient.js +6 -0
- package/distr/Common/PicklistApiClient/IPicklistApiClient.js.map +1 -0
- package/distr/Common/PicklistApiClient/PicklistApiClient.js +31 -0
- package/distr/Common/PicklistApiClient/PicklistApiClient.js.map +1 -0
- package/distr/Common/PicklistApiClient/PicklistRequestV2Builder.js +36 -0
- package/distr/Common/PicklistApiClient/PicklistRequestV2Builder.js.map +1 -0
- package/distr/Common/PicklistApiClient/Serializers/DigestFilterColumnSerializer.js +53 -0
- package/distr/Common/PicklistApiClient/Serializers/DigestFilterColumnSerializer.js.map +1 -0
- package/distr/Common/PicklistApiClient/Serializers/DigestLogicalFilterSerializer.js +37 -0
- package/distr/Common/PicklistApiClient/Serializers/DigestLogicalFilterSerializer.js.map +1 -0
- package/distr/Common/PicklistApiClient/Types/PicklistRequestV2.js +6 -0
- package/distr/Common/PicklistApiClient/Types/PicklistRequestV2.js.map +1 -0
- package/distr/Common/PicklistApiClient/Types/PicklistResultV2.js +6 -0
- package/distr/Common/PicklistApiClient/Types/PicklistResultV2.js.map +1 -0
- package/distr/Common/RngSchemeTypes/types.js +6 -0
- package/distr/Common/RngSchemeTypes/types.js.map +1 -0
- package/distr/Common/StringArrayKey.js +26 -0
- package/distr/Common/StringArrayKey.js.map +1 -0
- package/distr/Common/TextExtractor/TextExtractorTypes.js +6 -0
- package/distr/Common/TextExtractor/TextExtractorTypes.js.map +1 -0
- package/distr/Common/TypingUtils.js +118 -0
- package/distr/Common/TypingUtils.js.map +1 -0
- package/distr/Common/UUID.js +14 -0
- package/distr/Common/UUID.js.map +1 -0
- package/distr/Common/UseAsyncEffect.js +20 -0
- package/distr/Common/UseAsyncEffect.js.map +1 -0
- package/distr/Common/UseShowOnce.js +60 -0
- package/distr/Common/UseShowOnce.js.map +1 -0
- package/distr/Common/UseTypedSelector.js +10 -0
- package/distr/Common/UseTypedSelector.js.map +1 -0
- package/distr/Common/WellKnownDirectories.js +14 -0
- package/distr/Common/WellKnownDirectories.js.map +1 -0
- package/distr/Common/hashUtils.js +14 -0
- package/distr/Common/hashUtils.js.map +1 -0
- package/distr/Tools/src/BuildTasks/ClientJS/BuildClientJsTask.js +77 -0
- package/distr/Tools/src/BuildTasks/ClientJS/BuildClientJsTask.js.map +1 -0
- package/distr/Tools/src/BuildTasks/ClientJS/IsWebpack5.js +14 -0
- package/distr/Tools/src/BuildTasks/ClientJS/IsWebpack5.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Engine/AcquireFormEngine.js +22 -0
- package/distr/Tools/src/BuildTasks/Engine/AcquireFormEngine.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Engine/AcquirePublishedEngineTask.js +88 -0
- package/distr/Tools/src/BuildTasks/Engine/AcquirePublishedEngineTask.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Engine/BuildLocalEngineTask.js +82 -0
- package/distr/Tools/src/BuildTasks/Engine/BuildLocalEngineTask.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Engine/EngineSource.js +10 -0
- package/distr/Tools/src/BuildTasks/Engine/EngineSource.js.map +1 -0
- package/distr/Tools/src/BuildTasks/EngineStructureUtils.js +42 -0
- package/distr/Tools/src/BuildTasks/EngineStructureUtils.js.map +1 -0
- package/distr/Tools/src/BuildTasks/EngineVersionUtils.js +30 -0
- package/distr/Tools/src/BuildTasks/EngineVersionUtils.js.map +1 -0
- package/distr/Tools/src/BuildTasks/FSTask.js +67 -0
- package/distr/Tools/src/BuildTasks/FSTask.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Form/CompileForm.js +52 -0
- package/distr/Tools/src/BuildTasks/Form/CompileForm.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Form/GenerateForm.js +44 -0
- package/distr/Tools/src/BuildTasks/Form/GenerateForm.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Form/NullFormGenerator.js +37 -0
- package/distr/Tools/src/BuildTasks/Form/NullFormGenerator.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Form/WriteAttachmentPathFiles.js +25 -0
- package/distr/Tools/src/BuildTasks/Form/WriteAttachmentPathFiles.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Form/WriteFLangNormalizationFiles.js +31 -0
- package/distr/Tools/src/BuildTasks/Form/WriteFLangNormalizationFiles.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Generator/AcquireFormGenerator.js +27 -0
- package/distr/Tools/src/BuildTasks/Generator/AcquireFormGenerator.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Generator/AcquirePublishedGeneratorTask.js +95 -0
- package/distr/Tools/src/BuildTasks/Generator/AcquirePublishedGeneratorTask.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Generator/BuildGeneratorFromSourcesTask.js +126 -0
- package/distr/Tools/src/BuildTasks/Generator/BuildGeneratorFromSourcesTask.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/CreateAsyncGenerator.js +174 -0
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/CreateAsyncGenerator.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/GeneratorRequireUtils.js +121 -0
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/GeneratorRequireUtils.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ProcessSugarWorker.js +45 -0
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ProcessSugarWorker.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ReadSourcesAndProcessSugarWorker.js +52 -0
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/ReadSourcesAndProcessSugarWorker.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/RequireUncached.js +49 -0
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/RequireUncached.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/TypedProcessWorker.js +19 -0
- package/distr/Tools/src/BuildTasks/Generator/GeneratorWorker/TypedProcessWorker.js.map +1 -0
- package/distr/Tools/src/BuildTasks/ProcessUtils/ProcessUtils.js +64 -0
- package/distr/Tools/src/BuildTasks/ProcessUtils/ProcessUtils.js.map +1 -0
- package/distr/Tools/src/BuildTasks/ProcessUtils/ShellProcessHandle.js +84 -0
- package/distr/Tools/src/BuildTasks/ProcessUtils/ShellProcessHandle.js.map +1 -0
- package/distr/Tools/src/BuildTasks/PublishedVersionUtils.js +174 -0
- package/distr/Tools/src/BuildTasks/PublishedVersionUtils.js.map +1 -0
- package/distr/Tools/src/BuildTasks/ReadFormSource.js +112 -0
- package/distr/Tools/src/BuildTasks/ReadFormSource.js.map +1 -0
- package/distr/Tools/src/BuildTasks/ResolveFormInfo.js +107 -0
- package/distr/Tools/src/BuildTasks/ResolveFormInfo.js.map +1 -0
- package/distr/Tools/src/BuildTasks/Version.js +41 -0
- package/distr/Tools/src/BuildTasks/Version.js.map +1 -0
- package/distr/Tools/src/BuildTasks/WriteFormMeta.js +27 -0
- package/distr/Tools/src/BuildTasks/WriteFormMeta.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildForms/BuildCacheMode.js +28 -0
- package/distr/Tools/src/CLICommands/BuildForms/BuildCacheMode.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildForms/BuildFormsOptions.js +169 -0
- package/distr/Tools/src/CLICommands/BuildForms/BuildFormsOptions.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildForms/ClearSourceMapForProduction.js +24 -0
- package/distr/Tools/src/CLICommands/BuildForms/ClearSourceMapForProduction.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildForms/RunBuildForms.js +234 -0
- package/distr/Tools/src/CLICommands/BuildForms/RunBuildForms.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/BuildLogsWebsocketController.js +36 -0
- package/distr/Tools/src/CLICommands/BuildServer/BuildLogsWebsocketController.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/BuildServerServerOptions.js +112 -0
- package/distr/Tools/src/CLICommands/BuildServer/BuildServerServerOptions.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesController.js +158 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesController.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesUpdatesController.js +94 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesUpdatesController.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBuildFormsController.js +129 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBuildFormsController.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerCandyWidgetController.js +45 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerCandyWidgetController.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsController.js +76 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsController.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsFromResourcesController.js +67 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerClientJsFromResourcesController.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerFormInfoController.js +65 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerFormInfoController.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerLocalSourcesEngineController.js +117 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerLocalSourcesEngineController.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPrebuiltResourcesController.js +22 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPrebuiltResourcesController.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPublishedEngineController.js +96 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerPublishedEngineController.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/BuildFormDevServer.js +231 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/BuildFormDevServer.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/CandyWidgetDevServer.js +70 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/CandyWidgetDevServer.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ClientJsDevServer.js +57 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ClientJsDevServer.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/EngineDevServer.js +67 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/EngineDevServer.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ReportGeneratorErrorToPageBody.js +21 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/ReportGeneratorErrorToPageBody.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/RunFormCompilationViaWebpackDevServer.js +52 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/RunFormCompilationViaWebpackDevServer.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorker.js +80 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorker.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorkerFactory.js +31 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackDevServerWorker/WebpackDevServerWorkerFactory.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IInputFileSystem.js +6 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IInputFileSystem.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IWatchFileSystem.js +6 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/IWatchFileSystem.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/WebpackHybridFileSystem.js +184 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/WebpackInMemoryUtils/WebpackHybridFileSystem.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/Directories/FarmDirectory.js +213 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/Directories/FarmDirectory.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/GlobToRegexp.js +28 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/GlobToRegexp.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/IGeneratedServerSideSourcesProvider.js +6 -0
- package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/IGeneratedServerSideSourcesProvider.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/RunBuildServer.js +110 -0
- package/distr/Tools/src/CLICommands/BuildServer/RunBuildServer.js.map +1 -0
- package/distr/Tools/src/CLICommands/BuildServer/StdStreamsIntercepter.js +50 -0
- package/distr/Tools/src/CLICommands/BuildServer/StdStreamsIntercepter.js.map +1 -0
- package/distr/Tools/src/CLICommands/CommonOptions/BuildDebugOnlyOption.js +19 -0
- package/distr/Tools/src/CLICommands/CommonOptions/BuildDebugOnlyOption.js.map +1 -0
- package/distr/Tools/src/CLICommands/CommonOptions/CommonOptionDefintions.js +30 -0
- package/distr/Tools/src/CLICommands/CommonOptions/CommonOptionDefintions.js.map +1 -0
- package/distr/Tools/src/CLICommands/CommonOptions/CommonOptions.js +6 -0
- package/distr/Tools/src/CLICommands/CommonOptions/CommonOptions.js.map +1 -0
- package/distr/Tools/src/CLICommands/DevBuild/DevBuildOptions.js +163 -0
- package/distr/Tools/src/CLICommands/DevBuild/DevBuildOptions.js.map +1 -0
- package/distr/Tools/src/CLICommands/DevBuild/RunDevBuild.js +112 -0
- package/distr/Tools/src/CLICommands/DevBuild/RunDevBuild.js.map +1 -0
- package/distr/Tools/src/CLICommands/FormStats/FormStatsOptions.js +34 -0
- package/distr/Tools/src/CLICommands/FormStats/FormStatsOptions.js.map +1 -0
- package/distr/Tools/src/CLICommands/FormStats/RunFormStats.js +50 -0
- package/distr/Tools/src/CLICommands/FormStats/RunFormStats.js.map +1 -0
- package/distr/Tools/src/CLICommands/FormsHelper/FormsHelperController.js +54 -0
- package/distr/Tools/src/CLICommands/FormsHelper/FormsHelperController.js.map +1 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/autocalc/{gfv}./320/232/320/241.candy.js.kclang +0 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/converters/{gfv}.AfterMerge.xslt +11 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/converters/{gfv}.BeforePreload.xslt +11 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/converters/{gfv}.fufPatcher.xslt +11 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/converters/{gfv}.outer.inner.json +1 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/fetchfunctions/{gfv}.fetchfunctions.js +2 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/fetchfunctions/{gfv}.fetchfunctions.js.map +1 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/form.json +12 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/helpers/addPril1.txt +6 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/presentations.json +8 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/schemas/{gfv}.0.rng.xml +20 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/sugar/index.sugar.xml +10 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/browser/Smoke.test.js +16 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/browser/Smoke.test.js.map +1 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/ui/DemoTest.test.js +23 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/test/ui/DemoTest.test.js.map +1 -0
- package/distr/Tools/src/CLICommands/InitForm/EmptyFormTemplate/validations/validations.KC.kclang +0 -0
- package/distr/Tools/src/CLICommands/InitForm/InitFormOptions.js +34 -0
- package/distr/Tools/src/CLICommands/InitForm/InitFormOptions.js.map +1 -0
- package/distr/Tools/src/CLICommands/InitForm/RunInitForm.js +117 -0
- package/distr/Tools/src/CLICommands/InitForm/RunInitForm.js.map +1 -0
- package/distr/Tools/src/CLICommands/Localization/LocalizationOptions.js +44 -0
- package/distr/Tools/src/CLICommands/Localization/LocalizationOptions.js.map +1 -0
- package/distr/Tools/src/CLICommands/Localization/RunLocalization.js +73 -0
- package/distr/Tools/src/CLICommands/Localization/RunLocalization.js.map +1 -0
- package/distr/Tools/src/CLICommands/RenameFiles/RenameFilesOptions.js +25 -0
- package/distr/Tools/src/CLICommands/RenameFiles/RenameFilesOptions.js.map +1 -0
- package/distr/Tools/src/CLICommands/RenameFiles/RunRenameFiles.js +38 -0
- package/distr/Tools/src/CLICommands/RenameFiles/RunRenameFiles.js.map +1 -0
- package/distr/Tools/src/CLICommands/SugarExtractor/ExtractTextsFromSugarController.js +36 -0
- package/distr/Tools/src/CLICommands/SugarExtractor/ExtractTextsFromSugarController.js.map +1 -0
- package/distr/Tools/src/CLICommands/SugarExtractor/Utils.js +50 -0
- package/distr/Tools/src/CLICommands/SugarExtractor/Utils.js.map +1 -0
- package/distr/Tools/src/CLICommands/UpgradeForm/RunUpgradeForm.js +144 -0
- package/distr/Tools/src/CLICommands/UpgradeForm/RunUpgradeForm.js.map +1 -0
- package/distr/Tools/src/CLICommands/UpgradeForm/UpgradeFormOptions.js +78 -0
- package/distr/Tools/src/CLICommands/UpgradeForm/UpgradeFormOptions.js.map +1 -0
- package/distr/Tools/src/CandyCLI.js +144 -0
- package/distr/Tools/src/CandyCLI.js.map +1 -0
- package/distr/Tools/src/CheckNodeJsVersion.js +32 -0
- package/distr/Tools/src/CheckNodeJsVersion.js.map +1 -0
- package/distr/Tools/src/Commons/ApiClient/ToolsApiClient.js +28 -0
- package/distr/Tools/src/Commons/ApiClient/ToolsApiClient.js.map +1 -0
- package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplication.js +93 -0
- package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplication.js.map +1 -0
- package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplicationContext.js +24 -0
- package/distr/Tools/src/Commons/ConsoleApplication/ConsoleApplicationContext.js.map +1 -0
- package/distr/Tools/src/Commons/ErrorUntyped.js +6 -0
- package/distr/Tools/src/Commons/ErrorUntyped.js.map +1 -0
- package/distr/Tools/src/Commons/EventObject.js +74 -0
- package/distr/Tools/src/Commons/EventObject.js.map +1 -0
- package/distr/Tools/src/Commons/ExecUtils.js +38 -0
- package/distr/Tools/src/Commons/ExecUtils.js.map +1 -0
- package/distr/Tools/src/Commons/ExtractGfvsFromFileName.js +21 -0
- package/distr/Tools/src/Commons/ExtractGfvsFromFileName.js.map +1 -0
- package/distr/Tools/src/Commons/FormGlobsUtils.js +137 -0
- package/distr/Tools/src/Commons/FormGlobsUtils.js.map +1 -0
- package/distr/Tools/src/Commons/FormLocationInfo.js +6 -0
- package/distr/Tools/src/Commons/FormLocationInfo.js.map +1 -0
- package/distr/Tools/src/Commons/FsUtils.js +35 -0
- package/distr/Tools/src/Commons/FsUtils.js.map +1 -0
- package/distr/Tools/src/Commons/GetCpuLimits.js +64 -0
- package/distr/Tools/src/Commons/GetCpuLimits.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Actions.js +38 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Actions.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Methods.js +57 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Methods.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/NotFoundWebError.js +15 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/NotFoundWebError.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/CookieParamParamBinder.js +18 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/CookieParamParamBinder.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/IParamBinder.js +6 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/IParamBinder.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/JsonBodyParamBinder.js +14 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/JsonBodyParamBinder.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/StringBodyParamBinder.js +17 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/StringBodyParamBinder.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlParamBinder.js +22 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlParamBinder.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlQueryParamBinder.js +20 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/ParamBinders/UrlQueryParamBinder.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Params.js +46 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Params.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomActionResultHandler.js +13 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomActionResultHandler.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomContentResultHandler.js +18 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/CustomContentResultHandler.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/EmptyResultHandler.js +13 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/EmptyResultHandler.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/HtmlResultHandler.js +13 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/HtmlResultHandler.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/IResultHandler.js +6 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/IResultHandler.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/JsonResultHandler.js +13 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/JsonResultHandler.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/PlainTextResultHandler.js +13 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/PlainTextResultHandler.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/StreamResultHandler.js +113 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results/StreamResultHandler.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results.js +24 -0
- package/distr/Tools/src/Commons/HttpServer/AttributeRouting/Results.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/ExpressServerWrapper.js +106 -0
- package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/ExpressServerWrapper.js.map +1 -0
- package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/SingletonController.js +22 -0
- package/distr/Tools/src/Commons/HttpServer/ExpressWrapper/SingletonController.js.map +1 -0
- package/distr/Tools/src/Commons/Locks/Lock.js +24 -0
- package/distr/Tools/src/Commons/Locks/Lock.js.map +1 -0
- package/distr/Tools/src/Commons/Locks/LockHandle.js +17 -0
- package/distr/Tools/src/Commons/Locks/LockHandle.js.map +1 -0
- package/distr/Tools/src/Commons/Locks/ReadWriteLockCollection.js +31 -0
- package/distr/Tools/src/Commons/Locks/ReadWriteLockCollection.js.map +1 -0
- package/distr/Tools/src/Commons/Logging/ELKLogger.js +56 -0
- package/distr/Tools/src/Commons/Logging/ELKLogger.js.map +1 -0
- package/distr/Tools/src/Commons/Logging/ILogger.js +25 -0
- package/distr/Tools/src/Commons/Logging/ILogger.js.map +1 -0
- package/distr/Tools/src/Commons/Logging/InMemoryLogger.js +61 -0
- package/distr/Tools/src/Commons/Logging/InMemoryLogger.js.map +1 -0
- package/distr/Tools/src/Commons/Logging/Logger.js +78 -0
- package/distr/Tools/src/Commons/Logging/Logger.js.map +1 -0
- package/distr/Tools/src/Commons/Logging/StaticLogger.js +37 -0
- package/distr/Tools/src/Commons/Logging/StaticLogger.js.map +1 -0
- package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.d.js +2 -0
- package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.d.js.map +1 -0
- package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.js +152 -0
- package/distr/Tools/src/Commons/Options/CommandBasedOptionsParser.js.map +1 -0
- package/distr/Tools/src/Commons/PathPattern.js +42 -0
- package/distr/Tools/src/Commons/PathPattern.js.map +1 -0
- package/distr/Tools/src/Commons/TasksCore/AggregatedError.js +16 -0
- package/distr/Tools/src/Commons/TasksCore/AggregatedError.js.map +1 -0
- package/distr/Tools/src/Commons/TasksCore/BuildTask.js +6 -0
- package/distr/Tools/src/Commons/TasksCore/BuildTask.js.map +1 -0
- package/distr/Tools/src/Commons/TasksCore/ChainableValueProducer.js +668 -0
- package/distr/Tools/src/Commons/TasksCore/ChainableValueProducer.js.map +1 -0
- package/distr/Tools/src/Commons/TasksCore/DirectoryEntriesProducer.js +77 -0
- package/distr/Tools/src/Commons/TasksCore/DirectoryEntriesProducer.js.map +1 -0
- package/distr/Tools/src/Commons/TasksCore/EmptyProducer.js +20 -0
- package/distr/Tools/src/Commons/TasksCore/EmptyProducer.js.map +1 -0
- package/distr/Tools/src/Commons/TasksCore/FileSystemEntriesProducer.js +48 -0
- package/distr/Tools/src/Commons/TasksCore/FileSystemEntriesProducer.js.map +1 -0
- package/distr/Tools/src/Commons/TasksCore/FileValueProducer.js +45 -0
- package/distr/Tools/src/Commons/TasksCore/FileValueProducer.js.map +1 -0
- package/distr/Tools/src/Commons/TasksCore/FixedDirectoryEntriesProducer.js +25 -0
- package/distr/Tools/src/Commons/TasksCore/FixedDirectoryEntriesProducer.js.map +1 -0
- package/distr/Tools/src/Commons/TasksCore/Observe.js +35 -0
- package/distr/Tools/src/Commons/TasksCore/Observe.js.map +1 -0
- package/distr/Tools/src/Commons/TasksCore/SingleValueProducer.js +29 -0
- package/distr/Tools/src/Commons/TasksCore/SingleValueProducer.js.map +1 -0
- package/distr/Tools/src/Commons/TimingUtils.js +13 -0
- package/distr/Tools/src/Commons/TimingUtils.js.map +1 -0
- package/distr/Tools/src/FormWebpackConfiguration/CacheAssetsPlugin.js +180 -0
- package/distr/Tools/src/FormWebpackConfiguration/CacheAssetsPlugin.js.map +1 -0
- package/distr/Tools/src/FormWebpackConfiguration/createFormWebpackConfiguration.js +145 -0
- package/distr/Tools/src/FormWebpackConfiguration/createFormWebpackConfiguration.js.map +1 -0
- package/distr/Tools/src/FormWebpackConfiguration/variables.less +132 -0
- package/distr/Tools/src/GenerateReadMe.js +54 -0
- package/distr/Tools/src/GenerateReadMe.js.map +1 -0
- package/distr/Tools/src/Keys/localhost-key.pem +116 -0
- package/distr/Tools/src/Keys/localhost.pem +35 -0
- package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js +2 -0
- package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js.LICENSE.txt +49 -0
- package/distr/Tools/src/LocalServerFrontEndDist/favicon-16x16.png +0 -0
- package/distr/Tools/src/LocalServerFrontEndDist/favicon-32x32.png +0 -0
- package/distr/Tools/src/LocalServerFrontEndDist/favicon.ico +0 -0
- package/distr/Tools/src/LocalServerFrontEndDist/index.html +1 -0
- package/distr/Tools/src/LocalServerFrontEndDist/index.js +3 -0
- package/distr/Tools/src/LocalServerFrontEndDist/index.js.LICENSE.txt +60 -0
- package/distr/Tools/src/LocalServerFrontEndDist/index.js.map +1 -0
- package/distr/Tools/src/Options/CandyToolOptions.js +20 -0
- package/distr/Tools/src/Options/CandyToolOptions.js.map +1 -0
- package/distr/Tools/src/ReadFarmConfig.js +18 -0
- package/distr/Tools/src/ReadFarmConfig.js.map +1 -0
- package/distr/Tools/src/SelfUpdate.js +121 -0
- package/distr/Tools/src/SelfUpdate.js.map +1 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js +1722 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js.LICENSE.txt +1 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.js.map +1 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js +1076 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/client.min.js.map +1 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/jquery-1.11.3.min.js +3328 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/jquery-1.11.3.min.js.map +1 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/polyfill.min.js +6517 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/polyfill.min.js.map +1 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/testing.min.js +222 -0
- package/distr/Tools/src/StaticFilesForProductionResourcesDir/testing.min.js.map +1 -0
- package/distr/Tools/src/StaticFilesForResourcesDir/jquery-1.11.3.min.js +3328 -0
- package/distr/Tools/src/StaticFilesForResourcesDir/jquery-1.11.3.min.js.map +1 -0
- package/distr/Tools/src/StaticFilesForResourcesDir/polyfill.min.js +6517 -0
- package/distr/Tools/src/StaticFilesForResourcesDir/polyfill.min.js.map +1 -0
- package/distr/Tools/src/StaticFilesForResourcesDir/testing.min.js +222 -0
- package/distr/Tools/src/StaticFilesForResourcesDir/testing.min.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PathTokens = exports.ModelPathImpl = void 0;
|
|
7
|
+
exports.convertToAbsoluteModelPath = convertToAbsoluteModelPath;
|
|
8
|
+
exports.convertToLegacyPath = convertToLegacyPath;
|
|
9
|
+
exports.convertToRelativeModelPath = convertToRelativeModelPath;
|
|
10
|
+
exports.createAbsolute = createAbsolute;
|
|
11
|
+
exports.createAbsoluteFromMask = createAbsoluteFromMask;
|
|
12
|
+
exports.createAbsoluteFromTokens = createAbsoluteFromTokens;
|
|
13
|
+
exports.createAbsoluteResolvedFromTokens = createAbsoluteResolvedFromTokens;
|
|
14
|
+
exports.createFromMask = createFromMask;
|
|
15
|
+
exports.createModelPath = createModelPath;
|
|
16
|
+
exports.createRelativeFromMask = createRelativeFromMask;
|
|
17
|
+
exports.createRelativeFromTokens = createRelativeFromTokens;
|
|
18
|
+
exports.createRelativeResolvedModelPath = createRelativeResolvedModelPath;
|
|
19
|
+
exports.emptyAbsoluteModelPath = emptyAbsoluteModelPath;
|
|
20
|
+
exports.emptyModelPath = emptyModelPath;
|
|
21
|
+
exports.isModelPath = isModelPath;
|
|
22
|
+
exports.joinModelPaths = joinModelPaths;
|
|
23
|
+
var _IterableUtils = require("../IterableUtils");
|
|
24
|
+
var _TypingUtils = require("../TypingUtils");
|
|
25
|
+
var _EachCurrentCollision = require("./EachCurrentCollision");
|
|
26
|
+
var _ModelPathBuilder = require("./ModelPathBuilder");
|
|
27
|
+
var _PathMatcher = require("./PathMatcher");
|
|
28
|
+
const EachSymbol = Symbol.for("__EACH__");
|
|
29
|
+
const CurrentSymbol = Symbol.for("__CURRENT__");
|
|
30
|
+
class PathTokens {
|
|
31
|
+
static isMultiToken(part) {
|
|
32
|
+
return part === PathTokens.each || part === PathTokens.current;
|
|
33
|
+
}
|
|
34
|
+
static isSimpleToken(part) {
|
|
35
|
+
return typeof part === "string";
|
|
36
|
+
}
|
|
37
|
+
static isInstanceToken(part) {
|
|
38
|
+
return typeof part === "string" && /^\d+$/i.test(part);
|
|
39
|
+
}
|
|
40
|
+
static isInstanceTokenOrInstancesSpec(part) {
|
|
41
|
+
return typeof part === "string" && (/^\d+$/i.test(part) || /^\[(\d+\,?)+\]$/i.test(part));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.PathTokens = PathTokens;
|
|
45
|
+
PathTokens.each = EachSymbol;
|
|
46
|
+
PathTokens.current = CurrentSymbol;
|
|
47
|
+
function isModelPath(path) {
|
|
48
|
+
return typeof path !== "string" && path instanceof ModelPathImpl;
|
|
49
|
+
}
|
|
50
|
+
function convertToLegacyPath(path) {
|
|
51
|
+
return isModelPath(path) ? path.toLegacyPath() : path;
|
|
52
|
+
}
|
|
53
|
+
function convertToAbsoluteModelPath(path) {
|
|
54
|
+
return isModelPath(path) ? path : createAbsoluteFromMask(path, PathTokens.each);
|
|
55
|
+
}
|
|
56
|
+
function convertToRelativeModelPath(path) {
|
|
57
|
+
return isModelPath(path) ? path : createRelativeFromMask(path, PathTokens.each);
|
|
58
|
+
}
|
|
59
|
+
function emptyModelPath() {
|
|
60
|
+
return new ModelPathImpl([], false);
|
|
61
|
+
}
|
|
62
|
+
function emptyAbsoluteModelPath() {
|
|
63
|
+
return new ModelPathImpl([], true);
|
|
64
|
+
}
|
|
65
|
+
function createModelPath(path, absolute) {
|
|
66
|
+
const partPartStrings = path.split("/");
|
|
67
|
+
ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
|
|
68
|
+
if (absolute === "auto") {
|
|
69
|
+
if (path.startsWith("/")) {
|
|
70
|
+
return new ModelPathImpl(partPartStrings.slice(1), true);
|
|
71
|
+
} else {
|
|
72
|
+
return new ModelPathImpl(partPartStrings, false);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (absolute && path.startsWith("/")) {
|
|
76
|
+
return new ModelPathImpl(partPartStrings.slice(1), true);
|
|
77
|
+
}
|
|
78
|
+
return new ModelPathImpl(partPartStrings, absolute);
|
|
79
|
+
}
|
|
80
|
+
function createFromMask(path, absolute, multiplicitySymbol) {
|
|
81
|
+
const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
|
|
82
|
+
if (absolute === "auto") {
|
|
83
|
+
if (path.startsWith("/")) {
|
|
84
|
+
return new ModelPathImpl(partPartStrings.slice(1), true);
|
|
85
|
+
} else {
|
|
86
|
+
return new ModelPathImpl(partPartStrings, false);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (absolute && path.startsWith("/")) {
|
|
90
|
+
return new ModelPathImpl(partPartStrings.slice(1), true);
|
|
91
|
+
}
|
|
92
|
+
return new ModelPathImpl(partPartStrings, absolute);
|
|
93
|
+
}
|
|
94
|
+
function createAbsoluteFromMask(path, multiplicitySymbol) {
|
|
95
|
+
const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
|
|
96
|
+
if (path.startsWith("/")) {
|
|
97
|
+
return new ModelPathImpl(partPartStrings.slice(1), true);
|
|
98
|
+
}
|
|
99
|
+
return new ModelPathImpl(partPartStrings, true);
|
|
100
|
+
}
|
|
101
|
+
function createRelativeFromMask(path, multiplicitySymbol) {
|
|
102
|
+
const partPartStrings = path.split("/").map(x => x === "*" ? multiplicitySymbol : x);
|
|
103
|
+
return new ModelPathImpl(partPartStrings, false);
|
|
104
|
+
}
|
|
105
|
+
function ensurePlainPathPartsDoesNotContainMultiplicity(parts) {
|
|
106
|
+
if (parts.some(x => x === "*")) {
|
|
107
|
+
throw new Error("Path must not contain * symbol");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function createAbsolute(path) {
|
|
111
|
+
const partPartStrings = path.split("/");
|
|
112
|
+
ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
|
|
113
|
+
if (path.startsWith("/")) {
|
|
114
|
+
return new ModelPathImpl(partPartStrings.slice(1), true);
|
|
115
|
+
}
|
|
116
|
+
return new ModelPathImpl(partPartStrings, true);
|
|
117
|
+
}
|
|
118
|
+
function createRelativeResolvedModelPath(path) {
|
|
119
|
+
const partPartStrings = path.split("/");
|
|
120
|
+
ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);
|
|
121
|
+
return new ModelPathImpl(partPartStrings, false);
|
|
122
|
+
}
|
|
123
|
+
function createAbsoluteFromTokens(tokens) {
|
|
124
|
+
return new ModelPathImpl(tokens, true);
|
|
125
|
+
}
|
|
126
|
+
function createAbsoluteResolvedFromTokens(tokens) {
|
|
127
|
+
ensurePlainPathPartsDoesNotContainMultiplicity(tokens);
|
|
128
|
+
return new ModelPathImpl(tokens, true);
|
|
129
|
+
}
|
|
130
|
+
function createRelativeFromTokens(tokens) {
|
|
131
|
+
return new ModelPathImpl(tokens, false);
|
|
132
|
+
}
|
|
133
|
+
function joinModelPaths(...parts) {
|
|
134
|
+
let absolute = false;
|
|
135
|
+
let resultParts = [];
|
|
136
|
+
for (const joinItem of parts) {
|
|
137
|
+
if (typeof joinItem === "string") {
|
|
138
|
+
resultParts.push(joinItem);
|
|
139
|
+
} else if (isModelPath(joinItem)) {
|
|
140
|
+
if (joinItem.isAbsolute()) {
|
|
141
|
+
absolute = true;
|
|
142
|
+
resultParts = [...joinItem.getPathPartsAsArray()];
|
|
143
|
+
} else {
|
|
144
|
+
resultParts.push(...joinItem.getPathPartsAsArray());
|
|
145
|
+
}
|
|
146
|
+
} else if (Array.isArray(joinItem)) {
|
|
147
|
+
resultParts.push(...joinItem);
|
|
148
|
+
} else if (PathTokens.isMultiToken(joinItem)) {
|
|
149
|
+
resultParts.push(joinItem);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return new ModelPathImpl(resultParts, absolute);
|
|
153
|
+
}
|
|
154
|
+
function isAllTokensResolved(tokens) {
|
|
155
|
+
// Я что-то немогу сообразить как тут всё строго написать...
|
|
156
|
+
// @ts-expect-error
|
|
157
|
+
return tokens.every(PathTokens.isSimpleToken);
|
|
158
|
+
}
|
|
159
|
+
class ModelPathImpl {
|
|
160
|
+
constructor(pathParts, absolute) {
|
|
161
|
+
this.tokens = void 0;
|
|
162
|
+
this.absolute = void 0;
|
|
163
|
+
this.legacyPath = void 0;
|
|
164
|
+
this.cachedHash = void 0;
|
|
165
|
+
this.tokens = pathParts.filter(x => x !== "");
|
|
166
|
+
this.absolute = absolute;
|
|
167
|
+
}
|
|
168
|
+
get resolved() {
|
|
169
|
+
return isAllTokensResolved(this.tokens);
|
|
170
|
+
}
|
|
171
|
+
getPathParts() {
|
|
172
|
+
return this.tokens;
|
|
173
|
+
}
|
|
174
|
+
getPathPartsAsArray() {
|
|
175
|
+
return this.tokens;
|
|
176
|
+
}
|
|
177
|
+
*getSimpleTokensStrict() {
|
|
178
|
+
for (const token of this.tokens) {
|
|
179
|
+
if (!PathTokens.isSimpleToken(token)) {
|
|
180
|
+
throw new Error("Path must not contain spec tokens");
|
|
181
|
+
}
|
|
182
|
+
yield token;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
getSimpleTokensAsArrayStrict() {
|
|
186
|
+
for (const token of this.tokens) {
|
|
187
|
+
if (!PathTokens.isSimpleToken(token)) {
|
|
188
|
+
throw new Error("Path must not contain spec tokens");
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Проверка выше гараентирует что будут только SimplePathToken.
|
|
192
|
+
// Все map и filter убраны для производительности
|
|
193
|
+
// @ts-ignore
|
|
194
|
+
return this.tokens;
|
|
195
|
+
}
|
|
196
|
+
joinWith(...path) {
|
|
197
|
+
return joinModelPaths(this, ...path);
|
|
198
|
+
}
|
|
199
|
+
isResolved() {
|
|
200
|
+
return isAllTokensResolved(this.tokens);
|
|
201
|
+
}
|
|
202
|
+
resolveAll(instance) {
|
|
203
|
+
const tokens = this.tokens.map(token => {
|
|
204
|
+
if (PathTokens.isSimpleToken(token)) {
|
|
205
|
+
return token;
|
|
206
|
+
} else {
|
|
207
|
+
return instance;
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
return new ModelPathImpl(tokens, this.absolute);
|
|
211
|
+
}
|
|
212
|
+
isContainIteration() {
|
|
213
|
+
return this.tokens.some(x => x === PathTokens.each);
|
|
214
|
+
}
|
|
215
|
+
isContainCurrentIteration() {
|
|
216
|
+
return this.tokens.some(x => x === PathTokens.current);
|
|
217
|
+
}
|
|
218
|
+
isContainCurrentOrEachIteration() {
|
|
219
|
+
return this.tokens.some(x => x === PathTokens.current || x === PathTokens.each);
|
|
220
|
+
}
|
|
221
|
+
getLastListPath() {
|
|
222
|
+
if (!this.isContainIteration()) {
|
|
223
|
+
throw new Error("Path must contain iteration");
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Проверка выше гарантирует, что будет PathTokens.each
|
|
227
|
+
// @ts-ignore
|
|
228
|
+
const lastIterationIndex = this.tokens.lastIndexOf(PathTokens.each);
|
|
229
|
+
return this.tokens.slice(0, lastIterationIndex);
|
|
230
|
+
}
|
|
231
|
+
isEndsWithIteration() {
|
|
232
|
+
const lastItem = _IterableUtils.IterUtils.last(this.tokens);
|
|
233
|
+
return lastItem == PathTokens.each;
|
|
234
|
+
}
|
|
235
|
+
isEndsWithCurrentIteration() {
|
|
236
|
+
const lastItem = _IterableUtils.IterUtils.last(this.tokens);
|
|
237
|
+
return lastItem == PathTokens.current;
|
|
238
|
+
}
|
|
239
|
+
isAbsolute() {
|
|
240
|
+
return this.absolute;
|
|
241
|
+
}
|
|
242
|
+
toString() {
|
|
243
|
+
if (this.tokens.length === 0) {
|
|
244
|
+
return "";
|
|
245
|
+
}
|
|
246
|
+
return (this.absolute ? "/" : "") + this.tokens.map(x => this.pathPartToString(x)).join("/");
|
|
247
|
+
}
|
|
248
|
+
toLegacyPath() {
|
|
249
|
+
var _this$legacyPath;
|
|
250
|
+
return (_this$legacyPath = this.legacyPath) !== null && _this$legacyPath !== void 0 ? _this$legacyPath : this.legacyPath = this.tokens.map(x => this.pathPartToString(x)).join("/");
|
|
251
|
+
}
|
|
252
|
+
isEquals(modelPath, eachCurrentCollision = _EachCurrentCollision.EachCurrentCollision.AreSame) {
|
|
253
|
+
if (eachCurrentCollision === _EachCurrentCollision.EachCurrentCollision.AreSame) {
|
|
254
|
+
return this.toLegacyPath() === modelPath.toLegacyPath();
|
|
255
|
+
} else {
|
|
256
|
+
return this.isAbsolute() === modelPath.isAbsolute() && Iterator.from(_IterableUtils.IterUtils.zip(this.getPathParts(), modelPath.getPathParts())).every(([t1, t2]) => t1 === t2);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Всегда целое положительное беззнаковое 32-битное число
|
|
262
|
+
*/
|
|
263
|
+
getHash(eachCurrentCollision = _EachCurrentCollision.EachCurrentCollision.AreSame) {
|
|
264
|
+
if (this.cachedHash == undefined) {
|
|
265
|
+
let hash = 5381;
|
|
266
|
+
for (const token of (0, _IterableUtils.reverseArray)(this.tokens)) {
|
|
267
|
+
let currentStr;
|
|
268
|
+
if (PathTokens.isSimpleToken(token)) {
|
|
269
|
+
currentStr = token;
|
|
270
|
+
} else {
|
|
271
|
+
if (eachCurrentCollision === _EachCurrentCollision.EachCurrentCollision.AreDifferent) {
|
|
272
|
+
currentStr = token === PathTokens.each ? "*" : "!";
|
|
273
|
+
} else {
|
|
274
|
+
currentStr = "*";
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
let stringIndex = currentStr.length;
|
|
278
|
+
while (stringIndex) {
|
|
279
|
+
// tslint:disable-next-line:no-bitwise
|
|
280
|
+
hash = hash * 33 ^ currentStr.charCodeAt(--stringIndex);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/*
|
|
285
|
+
tslint:disable-next-line:no-bitwise
|
|
286
|
+
JavaScript does bitwise operations (like XOR, above) on 32-bit signed
|
|
287
|
+
integers. Since we want the results to be always positive, convert the
|
|
288
|
+
signed int to an unsigned by doing an unsigned bitshift.
|
|
289
|
+
*/
|
|
290
|
+
this.cachedHash = hash >>> 0;
|
|
291
|
+
}
|
|
292
|
+
return this.cachedHash;
|
|
293
|
+
}
|
|
294
|
+
isIncludes(modelPath) {
|
|
295
|
+
const targetTokens = modelPath.getPathPartsAsArray();
|
|
296
|
+
if (this.tokens.length !== targetTokens.length) {
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
for (let i = 0; i < this.tokens.length; i++) {
|
|
300
|
+
const leftPart = this.tokens[i];
|
|
301
|
+
const rightPart = targetTokens[i];
|
|
302
|
+
if (typeof leftPart === "string") {
|
|
303
|
+
if (typeof rightPart === "string") {
|
|
304
|
+
if (leftPart !== rightPart) {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
continue;
|
|
308
|
+
} else {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
} else if (leftPart === PathTokens.current || leftPart === PathTokens.each) {
|
|
312
|
+
if (typeof rightPart === "string") {
|
|
313
|
+
if (!isFinite(Number(rightPart))) {
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
continue;
|
|
317
|
+
} else {
|
|
318
|
+
if (rightPart !== PathTokens.current && rightPart !== PathTokens.each) {
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
getIterationRank(eachCurrentCollision = _EachCurrentCollision.EachCurrentCollision.AreDifferent) {
|
|
328
|
+
return (0, _IterableUtils.count)(Iterator.from(this.tokens).filter(x => eachCurrentCollision == _EachCurrentCollision.EachCurrentCollision.AreDifferent ? x === PathTokens.each : PathTokens.isMultiToken(x)));
|
|
329
|
+
}
|
|
330
|
+
isEmpty() {
|
|
331
|
+
return this.tokens.length === 0;
|
|
332
|
+
}
|
|
333
|
+
matchFor(modelPath) {
|
|
334
|
+
if (!this.isAbsolute()) {
|
|
335
|
+
throw new Error(`Cannot match non absolute path '${this.toString()}'`);
|
|
336
|
+
}
|
|
337
|
+
if (!modelPath.isAbsolute()) {
|
|
338
|
+
throw new Error(`Cannot match non absolute path '${modelPath.toString()}'`);
|
|
339
|
+
}
|
|
340
|
+
return _PathMatcher.PathMatcher.match(this.tokens, modelPath.getPathPartsAsArray());
|
|
341
|
+
}
|
|
342
|
+
startsWith(modelPath) {
|
|
343
|
+
const thisParts = this.getPathPartsAsArray();
|
|
344
|
+
const otherParts = modelPath.getPathPartsAsArray();
|
|
345
|
+
return otherParts.every((value, index) => value === thisParts[index]);
|
|
346
|
+
}
|
|
347
|
+
endsWith(modelPath) {
|
|
348
|
+
const thisParts = this.getPathPartsAsArray().slice().reverse();
|
|
349
|
+
const otherParts = modelPath.getPathPartsAsArray().slice().reverse();
|
|
350
|
+
return otherParts.every((value, index) => value === thisParts[index]);
|
|
351
|
+
}
|
|
352
|
+
*splitByMultiplicity() {
|
|
353
|
+
let lastSimpleParts = new _ModelPathBuilder.ModelPathBuilder(this.isAbsolute());
|
|
354
|
+
for (const token of this.tokens) {
|
|
355
|
+
if (PathTokens.isSimpleToken(token)) {
|
|
356
|
+
lastSimpleParts.append(token);
|
|
357
|
+
} else {
|
|
358
|
+
if (!lastSimpleParts.empty) {
|
|
359
|
+
yield lastSimpleParts.toResolvedPath();
|
|
360
|
+
lastSimpleParts = new _ModelPathBuilder.ModelPathBuilder(false);
|
|
361
|
+
}
|
|
362
|
+
yield token;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
if (!lastSimpleParts.empty) {
|
|
366
|
+
yield lastSimpleParts.toResolvedPath();
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
normalize() {
|
|
370
|
+
const resultTokens = [];
|
|
371
|
+
for (const pathPart of this.tokens) {
|
|
372
|
+
if (pathPart === "..") {
|
|
373
|
+
if (!resultTokens.pop()) {
|
|
374
|
+
if (this.isAbsolute()) {
|
|
375
|
+
throw new Error(`Path is invalid '${this.toString()}'`);
|
|
376
|
+
} else {
|
|
377
|
+
resultTokens.push("..");
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
if (pathPart === ".") {
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
resultTokens.push(pathPart);
|
|
386
|
+
}
|
|
387
|
+
return new ModelPathImpl(resultTokens, this.absolute);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/**
|
|
391
|
+
* @summary Спецификаторы множественности Each заменяет на Current
|
|
392
|
+
*/
|
|
393
|
+
toCurrentIteration() {
|
|
394
|
+
if (this.isResolved()) {
|
|
395
|
+
return this;
|
|
396
|
+
} else {
|
|
397
|
+
// NOTE Тут не получается наложить дискриминатор
|
|
398
|
+
// @ts-expect-error
|
|
399
|
+
const pathParts = this.tokens.map(x => x === PathTokens.each ? PathTokens.current : x);
|
|
400
|
+
return new ModelPathImpl(pathParts, this.absolute);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
toEachIteration() {
|
|
404
|
+
if (this.isResolved()) {
|
|
405
|
+
return this;
|
|
406
|
+
} else {
|
|
407
|
+
// NOTE Тут не получается наложить дискриминатор
|
|
408
|
+
// @ts-expect-error
|
|
409
|
+
const pathParts = this.tokens.map(x => x === PathTokens.current ? PathTokens.each : x);
|
|
410
|
+
return new ModelPathImpl(pathParts, this.absolute);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
toAbsolute() {
|
|
414
|
+
if (!this.absolute) {
|
|
415
|
+
throw new Error(`Path '${this.toLegacyPath()} is not absolute'`);
|
|
416
|
+
}
|
|
417
|
+
return new ModelPathImpl(this.tokens, true);
|
|
418
|
+
}
|
|
419
|
+
*getAllParentPaths() {
|
|
420
|
+
const result = new _ModelPathBuilder.ModelPathBuilder(this.isAbsolute());
|
|
421
|
+
for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
|
|
422
|
+
result.append(token);
|
|
423
|
+
yield result.toPath();
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
trimLastStarIfLastToken() {
|
|
427
|
+
const lastItem = _IterableUtils.IterUtils.last(this.tokens);
|
|
428
|
+
if (lastItem != undefined && PathTokens.isMultiToken(lastItem)) {
|
|
429
|
+
return new ModelPathImpl(this.tokens.slice(0, -1), this.absolute);
|
|
430
|
+
}
|
|
431
|
+
return this;
|
|
432
|
+
}
|
|
433
|
+
getParentPath() {
|
|
434
|
+
const result = new _ModelPathBuilder.ModelPathBuilder(this.absolute);
|
|
435
|
+
for (const token of _IterableUtils.IterUtils.skipLast(this.getPathParts(), 1)) {
|
|
436
|
+
result.append(token);
|
|
437
|
+
}
|
|
438
|
+
// Тут получается так, что по другому никак
|
|
439
|
+
// @ts-expect-error
|
|
440
|
+
return result.toPath();
|
|
441
|
+
}
|
|
442
|
+
applyInstancesDirty(instances, fillWithMultiplicityIfHasNoInstance) {
|
|
443
|
+
if (this.isResolved() || instances.length === 0) {
|
|
444
|
+
return this;
|
|
445
|
+
}
|
|
446
|
+
let instanceCounter = 0;
|
|
447
|
+
const result = new _ModelPathBuilder.ModelPathBuilder(true);
|
|
448
|
+
for (const token of this.getPathParts()) {
|
|
449
|
+
if (PathTokens.isMultiToken(token) && instanceCounter < instances.length) {
|
|
450
|
+
var _instances$instanceCo;
|
|
451
|
+
const instanceOrEach = (_instances$instanceCo = instances[instanceCounter]) !== null && _instances$instanceCo !== void 0 ? _instances$instanceCo : fillWithMultiplicityIfHasNoInstance == true ? PathTokens.each : (0, _TypingUtils.reject)();
|
|
452
|
+
result.append(instanceOrEach);
|
|
453
|
+
instanceCounter++;
|
|
454
|
+
} else {
|
|
455
|
+
result.append(token);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
// Тут получается так, что по другому никак
|
|
459
|
+
// @ts-expect-error
|
|
460
|
+
return result.toPath();
|
|
461
|
+
}
|
|
462
|
+
pathPartToString(pathPart) {
|
|
463
|
+
if (typeof pathPart === "string") {
|
|
464
|
+
return pathPart;
|
|
465
|
+
}
|
|
466
|
+
if (pathPart === PathTokens.each) {
|
|
467
|
+
return "*";
|
|
468
|
+
}
|
|
469
|
+
if (pathPart === PathTokens.current) {
|
|
470
|
+
return "*";
|
|
471
|
+
}
|
|
472
|
+
throw new Error(`Unknown path part specified: ${(0, _TypingUtils.ensureAndGetString)(pathPart)}`);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
exports.ModelPathImpl = ModelPathImpl;
|
|
476
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfSXRlcmFibGVVdGlscyIsInJlcXVpcmUiLCJfVHlwaW5nVXRpbHMiLCJfRWFjaEN1cnJlbnRDb2xsaXNpb24iLCJfTW9kZWxQYXRoQnVpbGRlciIsIl9QYXRoTWF0Y2hlciIsIkVhY2hTeW1ib2wiLCJTeW1ib2wiLCJmb3IiLCJDdXJyZW50U3ltYm9sIiwiUGF0aFRva2VucyIsImlzTXVsdGlUb2tlbiIsInBhcnQiLCJlYWNoIiwiY3VycmVudCIsImlzU2ltcGxlVG9rZW4iLCJpc0luc3RhbmNlVG9rZW4iLCJ0ZXN0IiwiaXNJbnN0YW5jZVRva2VuT3JJbnN0YW5jZXNTcGVjIiwiZXhwb3J0cyIsImlzTW9kZWxQYXRoIiwicGF0aCIsIk1vZGVsUGF0aEltcGwiLCJjb252ZXJ0VG9MZWdhY3lQYXRoIiwidG9MZWdhY3lQYXRoIiwiY29udmVydFRvQWJzb2x1dGVNb2RlbFBhdGgiLCJjcmVhdGVBYnNvbHV0ZUZyb21NYXNrIiwiY29udmVydFRvUmVsYXRpdmVNb2RlbFBhdGgiLCJjcmVhdGVSZWxhdGl2ZUZyb21NYXNrIiwiZW1wdHlNb2RlbFBhdGgiLCJlbXB0eUFic29sdXRlTW9kZWxQYXRoIiwiY3JlYXRlTW9kZWxQYXRoIiwiYWJzb2x1dGUiLCJwYXJ0UGFydFN0cmluZ3MiLCJzcGxpdCIsImVuc3VyZVBsYWluUGF0aFBhcnRzRG9lc05vdENvbnRhaW5NdWx0aXBsaWNpdHkiLCJzdGFydHNXaXRoIiwic2xpY2UiLCJjcmVhdGVGcm9tTWFzayIsIm11bHRpcGxpY2l0eVN5bWJvbCIsIm1hcCIsIngiLCJwYXJ0cyIsInNvbWUiLCJFcnJvciIsImNyZWF0ZUFic29sdXRlIiwiY3JlYXRlUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aCIsImNyZWF0ZUFic29sdXRlRnJvbVRva2VucyIsInRva2VucyIsImNyZWF0ZUFic29sdXRlUmVzb2x2ZWRGcm9tVG9rZW5zIiwiY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zIiwiam9pbk1vZGVsUGF0aHMiLCJyZXN1bHRQYXJ0cyIsImpvaW5JdGVtIiwicHVzaCIsImlzQWJzb2x1dGUiLCJnZXRQYXRoUGFydHNBc0FycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiaXNBbGxUb2tlbnNSZXNvbHZlZCIsImV2ZXJ5IiwiY29uc3RydWN0b3IiLCJwYXRoUGFydHMiLCJsZWdhY3lQYXRoIiwiY2FjaGVkSGFzaCIsImZpbHRlciIsInJlc29sdmVkIiwiZ2V0UGF0aFBhcnRzIiwiZ2V0U2ltcGxlVG9rZW5zU3RyaWN0IiwidG9rZW4iLCJnZXRTaW1wbGVUb2tlbnNBc0FycmF5U3RyaWN0Iiwiam9pbldpdGgiLCJpc1Jlc29sdmVkIiwicmVzb2x2ZUFsbCIsImluc3RhbmNlIiwiaXNDb250YWluSXRlcmF0aW9uIiwiaXNDb250YWluQ3VycmVudEl0ZXJhdGlvbiIsImlzQ29udGFpbkN1cnJlbnRPckVhY2hJdGVyYXRpb24iLCJnZXRMYXN0TGlzdFBhdGgiLCJsYXN0SXRlcmF0aW9uSW5kZXgiLCJsYXN0SW5kZXhPZiIsImlzRW5kc1dpdGhJdGVyYXRpb24iLCJsYXN0SXRlbSIsIkl0ZXJVdGlscyIsImxhc3QiLCJpc0VuZHNXaXRoQ3VycmVudEl0ZXJhdGlvbiIsInRvU3RyaW5nIiwibGVuZ3RoIiwicGF0aFBhcnRUb1N0cmluZyIsImpvaW4iLCJfdGhpcyRsZWdhY3lQYXRoIiwiaXNFcXVhbHMiLCJtb2RlbFBhdGgiLCJlYWNoQ3VycmVudENvbGxpc2lvbiIsIkVhY2hDdXJyZW50Q29sbGlzaW9uIiwiQXJlU2FtZSIsIkl0ZXJhdG9yIiwiZnJvbSIsInppcCIsInQxIiwidDIiLCJnZXRIYXNoIiwidW5kZWZpbmVkIiwiaGFzaCIsInJldmVyc2VBcnJheSIsImN1cnJlbnRTdHIiLCJBcmVEaWZmZXJlbnQiLCJzdHJpbmdJbmRleCIsImNoYXJDb2RlQXQiLCJpc0luY2x1ZGVzIiwidGFyZ2V0VG9rZW5zIiwiaSIsImxlZnRQYXJ0IiwicmlnaHRQYXJ0IiwiaXNGaW5pdGUiLCJOdW1iZXIiLCJnZXRJdGVyYXRpb25SYW5rIiwiY291bnQiLCJpc0VtcHR5IiwibWF0Y2hGb3IiLCJQYXRoTWF0Y2hlciIsIm1hdGNoIiwidGhpc1BhcnRzIiwib3RoZXJQYXJ0cyIsInZhbHVlIiwiaW5kZXgiLCJlbmRzV2l0aCIsInJldmVyc2UiLCJzcGxpdEJ5TXVsdGlwbGljaXR5IiwibGFzdFNpbXBsZVBhcnRzIiwiTW9kZWxQYXRoQnVpbGRlciIsImFwcGVuZCIsImVtcHR5IiwidG9SZXNvbHZlZFBhdGgiLCJub3JtYWxpemUiLCJyZXN1bHRUb2tlbnMiLCJwYXRoUGFydCIsInBvcCIsInRvQ3VycmVudEl0ZXJhdGlvbiIsInRvRWFjaEl0ZXJhdGlvbiIsInRvQWJzb2x1dGUiLCJnZXRBbGxQYXJlbnRQYXRocyIsInJlc3VsdCIsInNraXBMYXN0IiwidG9QYXRoIiwidHJpbUxhc3RTdGFySWZMYXN0VG9rZW4iLCJnZXRQYXJlbnRQYXRoIiwiYXBwbHlJbnN0YW5jZXNEaXJ0eSIsImluc3RhbmNlcyIsImZpbGxXaXRoTXVsdGlwbGljaXR5SWZIYXNOb0luc3RhbmNlIiwiaW5zdGFuY2VDb3VudGVyIiwiX2luc3RhbmNlcyRpbnN0YW5jZUNvIiwiaW5zdGFuY2VPckVhY2giLCJyZWplY3QiLCJlbnN1cmVBbmRHZXRTdHJpbmciXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9Db21tb24vTW9kZWxQYXRoL01vZGVsUGF0aC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaW5kaW5nUGF0aCB9IGZyb20gXCIuLi8uLi9FbmdpbmUvc3JjL0VuZ2luZS9Db3JlL0NvcmVUeXBlc1wiO1xuaW1wb3J0IHsgY291bnQsIEl0ZXJVdGlscywgcmV2ZXJzZUFycmF5IH0gZnJvbSBcIi4uL0l0ZXJhYmxlVXRpbHNcIjtcbmltcG9ydCB7IGVuc3VyZUFuZEdldFN0cmluZywgcmVqZWN0IH0gZnJvbSBcIi4uL1R5cGluZ1V0aWxzXCI7XG5cbmltcG9ydCB7IEVhY2hDdXJyZW50Q29sbGlzaW9uIH0gZnJvbSBcIi4vRWFjaEN1cnJlbnRDb2xsaXNpb25cIjtcbmltcG9ydCB7IE1vZGVsUGF0aEJ1aWxkZXIgfSBmcm9tIFwiLi9Nb2RlbFBhdGhCdWlsZGVyXCI7XG5pbXBvcnQgeyBQYXRoTWF0Y2hlciwgUGF0aE1hdGNoaW5nIH0gZnJvbSBcIi4vUGF0aE1hdGNoZXJcIjtcbmltcG9ydCB7IElFcXVhdGFibGUgfSBmcm9tIFwiLi9JRXF1YXRhYmxlXCI7XG5cbmNvbnN0IEVhY2hTeW1ib2wgPSBTeW1ib2wuZm9yKFwiX19FQUNIX19cIik7XG5jb25zdCBDdXJyZW50U3ltYm9sID0gU3ltYm9sLmZvcihcIl9fQ1VSUkVOVF9fXCIpO1xuXG5leHBvcnQgY2xhc3MgUGF0aFRva2VucyB7XG4gICAgcHVibGljIHN0YXRpYyBlYWNoOiB0eXBlb2YgRWFjaFN5bWJvbCA9IEVhY2hTeW1ib2w7XG4gICAgcHVibGljIHN0YXRpYyBjdXJyZW50OiB0eXBlb2YgQ3VycmVudFN5bWJvbCA9IEN1cnJlbnRTeW1ib2w7XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTXVsdGlUb2tlbihwYXJ0OiB1bmRlZmluZWQgfCBQYXRoVG9rZW4pOiBwYXJ0IGlzIHR5cGVvZiBFYWNoU3ltYm9sIHwgdHlwZW9mIEN1cnJlbnRTeW1ib2wge1xuICAgICAgICByZXR1cm4gcGFydCA9PT0gUGF0aFRva2Vucy5lYWNoIHx8IHBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzU2ltcGxlVG9rZW4ocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0luc3RhbmNlVG9rZW4ocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIgJiYgL15cXGQrJC9pLnRlc3QocGFydCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0luc3RhbmNlVG9rZW5Pckluc3RhbmNlc1NwZWMocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIgJiYgKC9eXFxkKyQvaS50ZXN0KHBhcnQpIHx8IC9eXFxbKFxcZCtcXCw/KStcXF0kL2kudGVzdChwYXJ0KSk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBTaW1wbGVQYXRoVG9rZW4gPSBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIFBhdGhUb2tlbiA9IFNpbXBsZVBhdGhUb2tlbiB8IHR5cGVvZiBFYWNoU3ltYm9sIHwgdHlwZW9mIEN1cnJlbnRTeW1ib2w7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsUGF0aChwYXRoOiBCaW5kaW5nUGF0aCB8IE1vZGVsUGF0aCB8IHVua25vd24pOiBwYXRoIGlzIE1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIHR5cGVvZiBwYXRoICE9PSBcInN0cmluZ1wiICYmIHBhdGggaW5zdGFuY2VvZiBNb2RlbFBhdGhJbXBsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvTGVnYWN5UGF0aChwYXRoOiBCaW5kaW5nUGF0aCB8IE1vZGVsUGF0aCk6IEJpbmRpbmdQYXRoIHtcbiAgICByZXR1cm4gaXNNb2RlbFBhdGgocGF0aCkgPyBwYXRoLnRvTGVnYWN5UGF0aCgpIDogcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0Fic29sdXRlTW9kZWxQYXRoPFIgZXh0ZW5kcyBib29sZWFuLCBBIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcGF0aDogQmluZGluZ1BhdGggfCBJTW9kZWxQYXRoPFIsIEE+XG4pOiBJTW9kZWxQYXRoPFIsIHRydWU+O1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0Fic29sdXRlTW9kZWxQYXRoKHBhdGg6IEJpbmRpbmdQYXRoIHwgQWJzb2x1dGVNb2RlbFBhdGgpOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIGlzTW9kZWxQYXRoKHBhdGgpID8gcGF0aCA6IGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aCwgUGF0aFRva2Vucy5lYWNoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1JlbGF0aXZlTW9kZWxQYXRoPFIgZXh0ZW5kcyBib29sZWFuLCBBIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcGF0aDogQmluZGluZ1BhdGggfCBJTW9kZWxQYXRoPFIsIEE+XG4pOiBJTW9kZWxQYXRoPFIsIGZhbHNlPjtcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9SZWxhdGl2ZU1vZGVsUGF0aChwYXRoOiBCaW5kaW5nUGF0aCB8IFJlbGF0aXZlTW9kZWxQYXRoKTogUmVsYXRpdmVNb2RlbFBhdGgge1xuICAgIHJldHVybiBpc01vZGVsUGF0aChwYXRoKSA/IHBhdGggOiBjcmVhdGVSZWxhdGl2ZUZyb21NYXNrKHBhdGgsIFBhdGhUb2tlbnMuZWFjaCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbXB0eU1vZGVsUGF0aCgpOiBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgZmFsc2U+KFtdLCBmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbXB0eUFic29sdXRlTW9kZWxQYXRoKCk6IEFic29sdXRlUmVzb2x2ZWRNb2RlbFBhdGgge1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihbXSwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2RlbFBhdGgocGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogdHJ1ZSk6IEFic29sdXRlUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kZWxQYXRoKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IGZhbHNlKTogUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2RlbFBhdGgocGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogXCJhdXRvXCIpOiBSZXNvbHZlZE1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2RlbFBhdGgocGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogYm9vbGVhbiB8IFwiYXV0b1wiKTogUmVzb2x2ZWRNb2RlbFBhdGgge1xuICAgIGNvbnN0IHBhcnRQYXJ0U3RyaW5ncyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICAgIGVuc3VyZVBsYWluUGF0aFBhcnRzRG9lc05vdENvbnRhaW5NdWx0aXBsaWNpdHkocGFydFBhcnRTdHJpbmdzKTtcbiAgICBpZiAoYWJzb2x1dGUgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgdHJ1ZT4ocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCBmYWxzZT4ocGFydFBhcnRTdHJpbmdzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFic29sdXRlICYmIHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KHBhcnRQYXJ0U3RyaW5ncy5zbGljZSgxKSwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCBib29sZWFuPihwYXJ0UGFydFN0cmluZ3MsIGFic29sdXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IHRydWUsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogQWJzb2x1dGVNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogZmFsc2UsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogUmVzb2x2ZWRNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogXCJhdXRvXCIsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgYWJzb2x1dGU6IGJvb2xlYW4gfCBcImF1dG9cIiwgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBNb2RlbFBhdGgge1xuICAgIGNvbnN0IHBhcnRQYXJ0U3RyaW5ncyA9IHBhdGguc3BsaXQoXCIvXCIpLm1hcCh4ID0+ICh4ID09PSBcIipcIiA/IG11bHRpcGxpY2l0eVN5bWJvbCA6IHgpKTtcbiAgICBpZiAoYWJzb2x1dGUgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3MsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWJzb2x1dGUgJiYgcGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncywgYWJzb2x1dGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWJzb2x1dGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIG11bHRpcGxpY2l0eVN5bWJvbDogUGF0aFRva2VuKTogQWJzb2x1dGVNb2RlbFBhdGgge1xuICAgIGNvbnN0IHBhcnRQYXJ0U3RyaW5ncyA9IHBhdGguc3BsaXQoXCIvXCIpLm1hcCh4ID0+ICh4ID09PSBcIipcIiA/IG11bHRpcGxpY2l0eVN5bWJvbCA6IHgpKTtcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWxhdGl2ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBSZWxhdGl2ZU1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIikubWFwKHggPT4gKHggPT09IFwiKlwiID8gbXVsdGlwbGljaXR5U3ltYm9sIDogeCkpO1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3MsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eShwYXJ0czogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAocGFydHMuc29tZSh4ID0+IHggPT09IFwiKlwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3Qgbm90IGNvbnRhaW4gKiBzeW1ib2xcIik7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWJzb2x1dGUocGF0aDogc3RyaW5nKTogQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gICAgZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eShwYXJ0UGFydFN0cmluZ3MpO1xuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgdHJ1ZT4ocGFydFBhcnRTdHJpbmdzLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGgocGF0aDogc3RyaW5nKTogUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gICAgZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eShwYXJ0UGFydFN0cmluZ3MpO1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCBmYWxzZT4ocGFydFBhcnRTdHJpbmdzLCBmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZUZyb21Ub2tlbnModG9rZW5zOiBQYXRoVG9rZW5bXSk6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8ZmFsc2UsIHRydWU+KHRva2VucywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZVJlc29sdmVkRnJvbVRva2Vucyh0b2tlbnM6IHJlYWRvbmx5IHN0cmluZ1tdKTogQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eSh0b2tlbnMpO1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPih0b2tlbnMsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zKHRva2VuczogcmVhZG9ubHkgc3RyaW5nW10pOiBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aXZlRnJvbVRva2Vucyh0b2tlbnM6IHJlYWRvbmx5IFBhdGhUb2tlbltdKTogUmVsYXRpdmVNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zKHRva2VuczogcmVhZG9ubHkgUGF0aFRva2VuW10pOiBSZWxhdGl2ZU1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPGZhbHNlLCBmYWxzZT4odG9rZW5zLCBmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqb2luTW9kZWxQYXRocyguLi5wYXJ0czogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuIHwgUGF0aFRva2VuW10+KTogTW9kZWxQYXRoIHtcbiAgICBsZXQgYWJzb2x1dGUgPSBmYWxzZTtcbiAgICBsZXQgcmVzdWx0UGFydHM6IFBhdGhUb2tlbltdID0gW107XG4gICAgZm9yIChjb25zdCBqb2luSXRlbSBvZiBwYXJ0cykge1xuICAgICAgICBpZiAodHlwZW9mIGpvaW5JdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKGpvaW5JdGVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc01vZGVsUGF0aChqb2luSXRlbSkpIHtcbiAgICAgICAgICAgIGlmIChqb2luSXRlbS5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICBhYnNvbHV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzdWx0UGFydHMgPSBbLi4uam9pbkl0ZW0uZ2V0UGF0aFBhcnRzQXNBcnJheSgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0UGFydHMucHVzaCguLi5qb2luSXRlbS5nZXRQYXRoUGFydHNBc0FycmF5KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoam9pbkl0ZW0pKSB7XG4gICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKC4uLmpvaW5JdGVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChQYXRoVG9rZW5zLmlzTXVsdGlUb2tlbihqb2luSXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goam9pbkl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHJlc3VsdFBhcnRzLCBhYnNvbHV0ZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1vZGVsUGF0aDxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuLCBUQWJzb2x1dGUgZXh0ZW5kcyBib29sZWFuPlxuICAgIGV4dGVuZHMgSUVxdWF0YWJsZTxJTW9kZWxQYXRoPGJvb2xlYW4sIGJvb2xlYW4+PiB7XG4gICAgcmVhZG9ubHkgcmVzb2x2ZWQ6IFRSZXNvbHZlZDtcbiAgICByZWFkb25seSBhYnNvbHV0ZTogVEFic29sdXRlO1xuXG4gICAgaXNFcXVhbHMobW9kZWxQYXRoOiBNb2RlbFBhdGgsIGVhY2hDdXJyZW50Q29sbGlzaW9uPzogRWFjaEN1cnJlbnRDb2xsaXNpb24pOiBib29sZWFuO1xuICAgIGdldEhhc2goZWFjaEN1cnJlbnRDb2xsaXNpb24/OiBFYWNoQ3VycmVudENvbGxpc2lvbik6IG51bWJlcjtcblxuICAgIGlzUmVzb2x2ZWQoKTogdGhpcyBpcyBJTW9kZWxQYXRoPHRydWUsIFRBYnNvbHV0ZT47XG4gICAgaXNBYnNvbHV0ZSgpOiB0aGlzIGlzIElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcbiAgICB0b0Fic29sdXRlKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcblxuICAgIGpvaW5XaXRoKC4uLnBhdGg6IHN0cmluZ1tdKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogUGF0aFRva2VuW10pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8UmVzb2x2ZWRNb2RlbFBhdGggfCBzdHJpbmc+KTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8QWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgVEFic29sdXRlPjtcblxuICAgIGdldFBhdGhQYXJ0cygpOiBJdGVyYWJsZTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+O1xuICAgIGdldFBhdGhQYXJ0c0FzQXJyYXkoKTogUmVhZG9ubHlBcnJheTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+O1xuICAgIGdldFNpbXBsZVRva2Vuc1N0cmljdCgpOiBJdGVyYWJsZTxTaW1wbGVQYXRoVG9rZW4+O1xuICAgIGdldFNpbXBsZVRva2Vuc0FzQXJyYXlTdHJpY3QoKTogcmVhZG9ubHkgU2ltcGxlUGF0aFRva2VuW107XG5cbiAgICByZXNvbHZlQWxsKGluc3RhbmNlOiBzdHJpbmcpOiBNb2RlbFBhdGg7XG4gICAgaXNDb250YWluSXRlcmF0aW9uKCk6IGJvb2xlYW47XG4gICAgaXNDb250YWluQ3VycmVudEl0ZXJhdGlvbigpOiBib29sZWFuO1xuICAgIGlzQ29udGFpbkN1cnJlbnRPckVhY2hJdGVyYXRpb24oKTogYm9vbGVhbjtcbiAgICBnZXRMYXN0TGlzdFBhdGgoKTogUGF0aFRva2VuW107XG4gICAgaXNFbmRzV2l0aEl0ZXJhdGlvbigpOiBib29sZWFuO1xuICAgIGlzRW5kc1dpdGhDdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW47XG4gICAgaXNJbmNsdWRlcyhtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IGJvb2xlYW47XG4gICAgZ2V0SXRlcmF0aW9uUmFuayhlYWNoQ3VycmVudENvbGxpc2lvbj86IEVhY2hDdXJyZW50Q29sbGlzaW9uKTogbnVtYmVyO1xuICAgIGlzRW1wdHkoKTogYm9vbGVhbjtcbiAgICBtYXRjaEZvcihtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IFBhdGhNYXRjaGluZztcbiAgICBzdGFydHNXaXRoKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogYm9vbGVhbjtcbiAgICBlbmRzV2l0aChtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IGJvb2xlYW47XG4gICAgc3BsaXRCeU11bHRpcGxpY2l0eSgpOiBJdGVyYWJsZTxSZXNvbHZlZE1vZGVsUGF0aCB8IHR5cGVvZiBFYWNoU3ltYm9sIHwgdHlwZW9mIEN1cnJlbnRTeW1ib2w+O1xuICAgIG5vcm1hbGl6ZSgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICB0b0N1cnJlbnRJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgdG9FYWNoSXRlcmF0aW9uKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIGdldEFsbFBhcmVudFBhdGhzKCk6IEl0ZXJhYmxlPE1vZGVsUGF0aD47XG4gICAgdHJpbUxhc3RTdGFySWZMYXN0VG9rZW4oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgZ2V0UGFyZW50UGF0aCgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBhcHBseUluc3RhbmNlc0RpcnR5KFxuICAgICAgICBpbnN0YW5jZXM6IFNpbXBsZVBhdGhUb2tlbltdLFxuICAgICAgICBmaWxsV2l0aE11bHRpcGxpY2l0eUlmSGFzTm9JbnN0YW5jZT86IGJvb2xlYW5cbiAgICApOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcblxuICAgIHRvU3RyaW5nKCk6IHN0cmluZztcbiAgICB0b0xlZ2FjeVBhdGgoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBNb2RlbFBhdGggPSBJTW9kZWxQYXRoPGJvb2xlYW4sIGJvb2xlYW4+O1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWRNb2RlbFBhdGggPSBJTW9kZWxQYXRoPHRydWUsIGJvb2xlYW4+O1xuZXhwb3J0IHR5cGUgQWJzb2x1dGVNb2RlbFBhdGggPSBJTW9kZWxQYXRoPGJvb2xlYW4sIHRydWU+O1xuZXhwb3J0IHR5cGUgQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8dHJ1ZSwgdHJ1ZT47XG5cbmV4cG9ydCB0eXBlIFJlbGF0aXZlTW9kZWxQYXRoID0gSU1vZGVsUGF0aDxib29sZWFuLCBmYWxzZT47XG5leHBvcnQgdHlwZSBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoID0gSU1vZGVsUGF0aDx0cnVlLCBmYWxzZT47XG5cbnR5cGUgUGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IFRSZXNvbHZlZCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBQYXRoVG9rZW47XG5cbnR5cGUgUGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbj4gPSBBcnJheTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+O1xuXG50eXBlIFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbj4gPSBSZWFkb25seUFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG5cbmZ1bmN0aW9uIGlzQWxsVG9rZW5zUmVzb2x2ZWQ8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbj4odG9rZW5zOiBSZWFkb25seVBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4pOiBUUmVzb2x2ZWQge1xuICAgIC8vINCvINGH0YLQvi3RgtC+INC90LXQvNC+0LPRgyDRgdC+0L7QsdGA0LDQt9C40YLRjCDQutCw0Log0YLRg9GCINCy0YHRkSDRgdGC0YDQvtCz0L4g0L3QsNC/0LjRgdCw0YLRjC4uLlxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICByZXR1cm4gdG9rZW5zLmV2ZXJ5KFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbik7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCBleHRlbmRzIGJvb2xlYW4sIFRBYnNvbHV0ZSBleHRlbmRzIGJvb2xlYW4+XG4gICAgaW1wbGVtZW50cyBJRXF1YXRhYmxlPE1vZGVsUGF0aD4sIElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+XG57XG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2tlbnM6IFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWJzb2x1dGU6IFRBYnNvbHV0ZTtcbiAgICBwcml2YXRlIGxlZ2FjeVBhdGg6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgICBwcml2YXRlIGNhY2hlZEhhc2g6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoUGFydHM6IFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPiwgYWJzb2x1dGU6IFRBYnNvbHV0ZSkge1xuICAgICAgICB0aGlzLnRva2VucyA9IHBhdGhQYXJ0cy5maWx0ZXIoeCA9PiB4ICE9PSBcIlwiKTtcbiAgICAgICAgdGhpcy5hYnNvbHV0ZSA9IGFic29sdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzb2x2ZWQoKTogVFJlc29sdmVkIHtcbiAgICAgICAgcmV0dXJuIGlzQWxsVG9rZW5zUmVzb2x2ZWQodGhpcy50b2tlbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXRoUGFydHMoKTogSXRlcmFibGU8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGF0aFBhcnRzQXNBcnJheSgpOiBSZWFkb25seUFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuXG4gICAgcHVibGljICpnZXRTaW1wbGVUb2tlbnNTdHJpY3QoKTogSXRlcmFibGU8U2ltcGxlUGF0aFRva2VuPiB7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICghUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiBzcGVjIHRva2Vuc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpbXBsZVRva2Vuc0FzQXJyYXlTdHJpY3QoKTogcmVhZG9ubHkgU2ltcGxlUGF0aFRva2VuW10ge1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRoaXMudG9rZW5zKSB7XG4gICAgICAgICAgICBpZiAoIVBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3Qgbm90IGNvbnRhaW4gc3BlYyB0b2tlbnNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC10L3RgtC40YDRg9C10YIg0YfRgtC+INCx0YPQtNGD0YIg0YLQvtC70YzQutC+IFNpbXBsZVBhdGhUb2tlbi5cbiAgICAgICAgLy8g0JLRgdC1IG1hcCDQuCBmaWx0ZXIg0YPQsdGA0LDQvdGLINC00LvRjyDQv9GA0L7QuNC30LLQvtC00LjRgtC10LvRjNC90L7RgdGC0LhcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IHN0cmluZ1tdKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IFBhdGhUb2tlbltdKTogSU1vZGVsUGF0aDxib29sZWFuLCBUQWJzb2x1dGU+O1xuICAgIHB1YmxpYyBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8QWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PE1vZGVsUGF0aCB8IFBhdGhUb2tlbj4pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PE1vZGVsUGF0aCB8IFBhdGhUb2tlbj4pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIGpvaW5Nb2RlbFBhdGhzKHRoaXMsIC4uLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Jlc29sdmVkKCk6IHRoaXMgaXMgSU1vZGVsUGF0aDx0cnVlLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgcmV0dXJuIGlzQWxsVG9rZW5zUmVzb2x2ZWQodGhpcy50b2tlbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNvbHZlQWxsKGluc3RhbmNlOiBzdHJpbmcpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2Vucy5tYXAodG9rZW4gPT4ge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHRva2VucywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkl0ZXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNvbWUoeCA9PiB4ID09PSBQYXRoVG9rZW5zLmVhY2gpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NvbnRhaW5DdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc29tZSh4ID0+IHggPT09IFBhdGhUb2tlbnMuY3VycmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkN1cnJlbnRPckVhY2hJdGVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5zb21lKHggPT4geCA9PT0gUGF0aFRva2Vucy5jdXJyZW50IHx8IHggPT09IFBhdGhUb2tlbnMuZWFjaCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExhc3RMaXN0UGF0aCgpOiBQYXRoVG9rZW5bXSB7XG4gICAgICAgIGlmICghdGhpcy5pc0NvbnRhaW5JdGVyYXRpb24oKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IGNvbnRhaW4gaXRlcmF0aW9uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC90YLQuNGA0YPQtdGCLCDRh9GC0L4g0LHRg9C00LXRgiBQYXRoVG9rZW5zLmVhY2hcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBsYXN0SXRlcmF0aW9uSW5kZXggPSB0aGlzLnRva2Vucy5sYXN0SW5kZXhPZihQYXRoVG9rZW5zLmVhY2gpO1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc2xpY2UoMCwgbGFzdEl0ZXJhdGlvbkluZGV4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFbmRzV2l0aEl0ZXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBJdGVyVXRpbHMubGFzdCh0aGlzLnRva2Vucyk7XG4gICAgICAgIHJldHVybiBsYXN0SXRlbSA9PSBQYXRoVG9rZW5zLmVhY2g7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRW5kc1dpdGhDdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBsYXN0SXRlbSA9IEl0ZXJVdGlscy5sYXN0KHRoaXMudG9rZW5zKTtcbiAgICAgICAgcmV0dXJuIGxhc3RJdGVtID09IFBhdGhUb2tlbnMuY3VycmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBYnNvbHV0ZSgpOiB0aGlzIGlzIElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFic29sdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuYWJzb2x1dGUgPyBcIi9cIiA6IFwiXCIpICsgdGhpcy50b2tlbnMubWFwKHggPT4gdGhpcy5wYXRoUGFydFRvU3RyaW5nKHgpKS5qb2luKFwiL1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9MZWdhY3lQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZ2FjeVBhdGggPz8gKHRoaXMubGVnYWN5UGF0aCA9IHRoaXMudG9rZW5zLm1hcCh4ID0+IHRoaXMucGF0aFBhcnRUb1N0cmluZyh4KSkuam9pbihcIi9cIikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFscyhcbiAgICAgICAgbW9kZWxQYXRoOiBNb2RlbFBhdGgsXG4gICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGVhY2hDdXJyZW50Q29sbGlzaW9uID09PSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVTYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0xlZ2FjeVBhdGgoKSA9PT0gbW9kZWxQYXRoLnRvTGVnYWN5UGF0aCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzQWJzb2x1dGUoKSA9PT0gbW9kZWxQYXRoLmlzQWJzb2x1dGUoKSAmJlxuICAgICAgICAgICAgICAgIEl0ZXJhdG9yLmZyb20oSXRlclV0aWxzLnppcCh0aGlzLmdldFBhdGhQYXJ0cygpLCBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzKCkpKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgKFt0MSwgdDJdKSA9PiB0MSA9PT0gdDJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRgdC10LPQtNCwINGG0LXQu9C+0LUg0L/QvtC70L7QttC40YLQtdC70YzQvdC+0LUg0LHQtdC30LfQvdCw0LrQvtCy0L7QtSAzMi3QsdC40YLQvdC+0LUg0YfQuNGB0LvQvlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIYXNoKGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWUpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5jYWNoZWRIYXNoID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGhhc2ggPSA1MzgxO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiByZXZlcnNlQXJyYXkodGhpcy50b2tlbnMpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRTdHI6IHN0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RyID0gdG9rZW47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVhY2hDdXJyZW50Q29sbGlzaW9uID09PSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVEaWZmZXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdHIgPSB0b2tlbiA9PT0gUGF0aFRva2Vucy5lYWNoID8gXCIqXCIgOiBcIiFcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdHIgPSBcIipcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgc3RyaW5nSW5kZXggPSBjdXJyZW50U3RyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoc3RyaW5nSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgICAgICAgICAgICAgaGFzaCA9IChoYXNoICogMzMpIF4gY3VycmVudFN0ci5jaGFyQ29kZUF0KC0tc3RyaW5nSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgZG9lcyBiaXR3aXNlIG9wZXJhdGlvbnMgKGxpa2UgWE9SLCBhYm92ZSkgb24gMzItYml0IHNpZ25lZFxuICAgICAgICAgICAgICAgIGludGVnZXJzLiBTaW5jZSB3ZSB3YW50IHRoZSByZXN1bHRzIHRvIGJlIGFsd2F5cyBwb3NpdGl2ZSwgY29udmVydCB0aGVcbiAgICAgICAgICAgICAgICBzaWduZWQgaW50IHRvIGFuIHVuc2lnbmVkIGJ5IGRvaW5nIGFuIHVuc2lnbmVkIGJpdHNoaWZ0LlxuICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLmNhY2hlZEhhc2ggPSBoYXNoID4+PiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlZEhhc2g7XG4gICAgfVxuXG4gICAgcHVibGljIGlzSW5jbHVkZXMobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0VG9rZW5zID0gbW9kZWxQYXRoLmdldFBhdGhQYXJ0c0FzQXJyYXkoKTtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCAhPT0gdGFyZ2V0VG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRQYXJ0ID0gdGhpcy50b2tlbnNbaV07XG4gICAgICAgICAgICBjb25zdCByaWdodFBhcnQgPSB0YXJnZXRUb2tlbnNbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxlZnRQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByaWdodFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnRQYXJ0ICE9PSByaWdodFBhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0UGFydCA9PT0gUGF0aFRva2Vucy5jdXJyZW50IHx8IGxlZnRQYXJ0ID09PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJpZ2h0UGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKE51bWJlcihyaWdodFBhcnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyaWdodFBhcnQgIT09IFBhdGhUb2tlbnMuY3VycmVudCAmJiByaWdodFBhcnQgIT09IFBhdGhUb2tlbnMuZWFjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlcmF0aW9uUmFuayhlYWNoQ3VycmVudENvbGxpc2lvbjogRWFjaEN1cnJlbnRDb2xsaXNpb24gPSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVEaWZmZXJlbnQpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY291bnQoXG4gICAgICAgICAgICBJdGVyYXRvci5mcm9tKHRoaXMudG9rZW5zKS5maWx0ZXIoeCA9PlxuICAgICAgICAgICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uID09IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZURpZmZlcmVudFxuICAgICAgICAgICAgICAgICAgICA/IHggPT09IFBhdGhUb2tlbnMuZWFjaFxuICAgICAgICAgICAgICAgICAgICA6IFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKHgpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIG1hdGNoRm9yKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogUGF0aE1hdGNoaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbWF0Y2ggbm9uIGFic29sdXRlIHBhdGggJyR7dGhpcy50b1N0cmluZygpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vZGVsUGF0aC5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1hdGNoIG5vbiBhYnNvbHV0ZSBwYXRoICcke21vZGVsUGF0aC50b1N0cmluZygpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUGF0aE1hdGNoZXIubWF0Y2godGhpcy50b2tlbnMsIG1vZGVsUGF0aC5nZXRQYXRoUGFydHNBc0FycmF5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGFydHNXaXRoKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRoaXNQYXJ0cyA9IHRoaXMuZ2V0UGF0aFBhcnRzQXNBcnJheSgpO1xuICAgICAgICBjb25zdCBvdGhlclBhcnRzID0gbW9kZWxQYXRoLmdldFBhdGhQYXJ0c0FzQXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG90aGVyUGFydHMuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IHRoaXNQYXJ0c1tpbmRleF0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbmRzV2l0aChtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0aGlzUGFydHMgPSB0aGlzLmdldFBhdGhQYXJ0c0FzQXJyYXkoKS5zbGljZSgpLnJldmVyc2UoKTtcbiAgICAgICAgY29uc3Qgb3RoZXJQYXJ0cyA9IG1vZGVsUGF0aC5nZXRQYXRoUGFydHNBc0FycmF5KCkuc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgICAgIHJldHVybiBvdGhlclBhcnRzLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSB0aGlzUGFydHNbaW5kZXhdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKnNwbGl0QnlNdWx0aXBsaWNpdHkoKTogSXRlcmFibGU8UmVzb2x2ZWRNb2RlbFBhdGggfCB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sPiB7XG4gICAgICAgIGxldCBsYXN0U2ltcGxlUGFydHMgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0aGlzLmlzQWJzb2x1dGUoKSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgbGFzdFNpbXBsZVBhcnRzLmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGxhc3RTaW1wbGVQYXJ0cy50b1Jlc29sdmVkUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2ltcGxlUGFydHMgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcihmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICB5aWVsZCBsYXN0U2ltcGxlUGFydHMudG9SZXNvbHZlZFBhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBub3JtYWxpemUoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBjb25zdCByZXN1bHRUb2tlbnM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYXRoUGFydCBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBcIi4uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdFRva2Vucy5wb3AoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBpcyBpbnZhbGlkICcke3RoaXMudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRUb2tlbnMucHVzaChcIi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGF0aFBhcnQgPT09IFwiLlwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRUb2tlbnMucHVzaChwYXRoUGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgVEFic29sdXRlPihyZXN1bHRUb2tlbnMsIHRoaXMuYWJzb2x1dGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCh0L/QtdGG0LjRhNC40LrQsNGC0L7RgNGLINC80L3QvtC20LXRgdGC0LLQtdC90L3QvtGB0YLQuCBFYWNoINC30LDQvNC10L3Rj9C10YIg0L3QsCBDdXJyZW50XG4gICAgICovXG4gICAgcHVibGljIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOT1RFINCi0YPRgiDQvdC1INC/0L7Qu9GD0YfQsNC10YLRgdGPINC90LDQu9C+0LbQuNGC0Ywg0LTQuNGB0LrRgNC40LzQuNC90LDRgtC+0YBcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0czogUGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPiA9IHRoaXMudG9rZW5zLm1hcCh4ID0+XG4gICAgICAgICAgICAgICAgeCA9PT0gUGF0aFRva2Vucy5lYWNoID8gUGF0aFRva2Vucy5jdXJyZW50IDogeFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ocGF0aFBhcnRzLCB0aGlzLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b0VhY2hJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBpZiAodGhpcy5pc1Jlc29sdmVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTk9URSDQotGD0YIg0L3QtSDQv9C+0LvRg9GH0LDQtdGC0YHRjyDQvdCw0LvQvtC20LjRgtGMINC00LjRgdC60YDQuNC80LjQvdCw0YLQvtGAXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSB0aGlzLnRva2Vucy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgIHggPT09IFBhdGhUb2tlbnMuY3VycmVudCA/IFBhdGhUb2tlbnMuZWFjaCA6IHhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8VFJlc29sdmVkLCBUQWJzb2x1dGU+KHBhdGhQYXJ0cywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BYnNvbHV0ZSgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT4ge1xuICAgICAgICBpZiAoIXRoaXMuYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAnJHt0aGlzLnRvTGVnYWN5UGF0aCgpfSBpcyBub3QgYWJzb2x1dGUnYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgdHJ1ZT4odGhpcy50b2tlbnMsIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZ2V0QWxsUGFyZW50UGF0aHMoKTogSXRlcmFibGU8TW9kZWxQYXRoPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNb2RlbFBhdGhCdWlsZGVyKHRoaXMuaXNBYnNvbHV0ZSgpKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBJdGVyVXRpbHMuc2tpcExhc3QodGhpcy5nZXRQYXRoUGFydHMoKSwgMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICAgICAgeWllbGQgcmVzdWx0LnRvUGF0aCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRyaW1MYXN0U3RhcklmTGFzdFRva2VuKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBJdGVyVXRpbHMubGFzdCh0aGlzLnRva2Vucyk7XG4gICAgICAgIGlmIChsYXN0SXRlbSAhPSB1bmRlZmluZWQgJiYgUGF0aFRva2Vucy5pc011bHRpVG9rZW4obGFzdEl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwodGhpcy50b2tlbnMuc2xpY2UoMCwgLTEpLCB0aGlzLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyZW50UGF0aCgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNb2RlbFBhdGhCdWlsZGVyKHRoaXMuYWJzb2x1dGUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIEl0ZXJVdGlscy5za2lwTGFzdCh0aGlzLmdldFBhdGhQYXJ0cygpLCAxKSkge1xuICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8g0KLRg9GCINC/0L7Qu9GD0YfQsNC10YLRgdGPINGC0LDQuiwg0YfRgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L3QuNC60LDQulxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHJldHVybiByZXN1bHQudG9QYXRoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5SW5zdGFuY2VzRGlydHkoXG4gICAgICAgIGluc3RhbmNlczogU2ltcGxlUGF0aFRva2VuW10sXG4gICAgICAgIGZpbGxXaXRoTXVsdGlwbGljaXR5SWZIYXNOb0luc3RhbmNlPzogYm9vbGVhblxuICAgICk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNvbHZlZCgpIHx8IGluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbnN0YW5jZUNvdW50ZXIgPSAwO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0cnVlKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLmdldFBhdGhQYXJ0cygpKSB7XG4gICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc011bHRpVG9rZW4odG9rZW4pICYmIGluc3RhbmNlQ291bnRlciA8IGluc3RhbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZU9yRWFjaCA9XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlc1tpbnN0YW5jZUNvdW50ZXJdID8/XG4gICAgICAgICAgICAgICAgICAgIChmaWxsV2l0aE11bHRpcGxpY2l0eUlmSGFzTm9JbnN0YW5jZSA9PSB0cnVlID8gUGF0aFRva2Vucy5lYWNoIDogcmVqZWN0KCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaW5zdGFuY2VPckVhY2gpO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnRlcisrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDQotGD0YIg0L/QvtC70YPRh9Cw0LXRgtGB0Y8g0YLQsNC6LCDRh9GC0L4g0L/QviDQtNGA0YPQs9C+0LzRgyDQvdC40LrQsNC6XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgcmV0dXJuIHJlc3VsdC50b1BhdGgoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhdGhQYXJ0VG9TdHJpbmcocGF0aFBhcnQ6IFBhdGhUb2tlbik6IHN0cmluZyB7XG4gICAgICAgIGlmICh0eXBlb2YgcGF0aFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoUGFydDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiKlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoUGFydCA9PT0gUGF0aFRva2Vucy5jdXJyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gXCIqXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHBhdGggcGFydCBzcGVjaWZpZWQ6ICR7ZW5zdXJlQW5kR2V0U3RyaW5nKHBhdGhQYXJ0KX1gKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxJQUFBQSxjQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxZQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxxQkFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsaUJBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUdBLE1BQU1LLFVBQVUsR0FBR0MsTUFBTSxDQUFDQyxHQUFHLENBQUMsVUFBVSxDQUFDO0FBQ3pDLE1BQU1DLGFBQWEsR0FBR0YsTUFBTSxDQUFDQyxHQUFHLENBQUMsYUFBYSxDQUFDO0FBRXhDLE1BQU1FLFVBQVUsQ0FBQztFQUlwQixPQUFjQyxZQUFZQSxDQUFDQyxJQUEyQixFQUFvRDtJQUN0RyxPQUFPQSxJQUFJLEtBQUtGLFVBQVUsQ0FBQ0csSUFBSSxJQUFJRCxJQUFJLEtBQUtGLFVBQVUsQ0FBQ0ksT0FBTztFQUNsRTtFQUVBLE9BQWNDLGFBQWFBLENBQUNILElBQTJCLEVBQWtCO0lBQ3JFLE9BQU8sT0FBT0EsSUFBSSxLQUFLLFFBQVE7RUFDbkM7RUFFQSxPQUFjSSxlQUFlQSxD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
|