@nlabs/metropolisjs 0.1.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/copilot-instructions.md +167 -0
- package/AGENTS.md +13 -0
- package/CHANGELOG.md +112 -0
- package/GRAPHQL_VALIDATION_RESULTS.md +158 -0
- package/PERMISSION_GRAPHQL_INTEGRATION.md +293 -0
- package/PERMISSION_IMPLEMENTATION_SUMMARY.md +243 -0
- package/README.md +1123 -112
- package/SIGNIN_GRAPHQL_VALIDATION.md +125 -0
- package/VAULT_GRAPHQL_API_FINDINGS.md +312 -0
- package/docs/ACTIONS.md +63 -0
- package/docs/COLLECTIONS.md +1038 -0
- package/docs/CONNECTIONS.md +1367 -0
- package/docs/CRUD_INTEGRATION.md +702 -0
- package/examples/connections-usage.tsx +909 -0
- package/examples/content-actions-usage.ts +144 -0
- package/examples/crud-usage.tsx +847 -0
- package/examples/extensibility-usage.tsx +889 -0
- package/examples/i18n-import-examples.ts +86 -0
- package/examples/i18n-namespace-usage.ts +118 -0
- package/examples/i18next-singleton-demo.ts +187 -0
- package/examples/permission-system-usage.tsx +415 -0
- package/examples/project-details.tsx +397 -0
- package/examples/shared-i18n-usage.tsx +203 -0
- package/examples/signup-error-handling.ts +100 -0
- package/examples/translation-types.ts +86 -0
- package/examples/translation-usage.tsx +336 -0
- package/index.js +1 -0
- package/jest.config.mjs +28 -0
- package/lex.config.mjs +11 -2
- package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts +22 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.d.ts.map +1 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServer.js +197 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts +3 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.d.ts.map +1 -0
- package/lib/__tests__/e2e/helpers/testGraphQLServerSimple.js +52 -0
- package/lib/actions/appActions/appActions.d.ts +29 -0
- package/lib/actions/appActions/appActions.d.ts.map +1 -0
- package/lib/actions/appActions/appActions.js +159 -0
- package/lib/actions/connectionActions/connectionActions.d.ts +19 -0
- package/lib/actions/connectionActions/connectionActions.d.ts.map +1 -0
- package/lib/actions/connectionActions/connectionActions.js +131 -0
- package/lib/actions/contentActions/contentActions.d.ts +34 -0
- package/lib/actions/contentActions/contentActions.d.ts.map +1 -0
- package/lib/actions/contentActions/contentActions.js +314 -0
- package/lib/actions/conversationActions/conversationActions.d.ts +30 -0
- package/lib/actions/conversationActions/conversationActions.d.ts.map +1 -0
- package/lib/actions/conversationActions/conversationActions.js +225 -0
- package/lib/actions/eventActions/eventActions.d.ts +27 -7
- package/lib/actions/eventActions/eventActions.d.ts.map +1 -0
- package/lib/actions/eventActions/eventActions.js +436 -2
- package/lib/actions/groupActions/groupActions.d.ts +30 -0
- package/lib/actions/groupActions/groupActions.d.ts.map +1 -0
- package/lib/actions/groupActions/groupActions.js +229 -0
- package/lib/actions/imageActions/imageActions.d.ts +16 -10
- package/lib/actions/imageActions/imageActions.d.ts.map +1 -0
- package/lib/actions/imageActions/imageActions.js +593 -2
- package/lib/actions/index.d.ts +21 -9
- package/lib/actions/index.d.ts.map +1 -0
- package/lib/actions/index.js +22 -2
- package/lib/actions/locationActions/locationActions.d.ts +11 -9
- package/lib/actions/locationActions/locationActions.d.ts.map +1 -0
- package/lib/actions/locationActions/locationActions.js +388 -2
- package/lib/actions/messageActions/messageActions.d.ts +16 -32
- package/lib/actions/messageActions/messageActions.d.ts.map +1 -0
- package/lib/actions/messageActions/messageActions.js +235 -2
- package/lib/actions/permissionActions/permissionActions.d.ts +34 -0
- package/lib/actions/permissionActions/permissionActions.d.ts.map +1 -0
- package/lib/actions/permissionActions/permissionActions.js +330 -0
- package/lib/actions/personaActions/personaActions.d.ts +65 -0
- package/lib/actions/personaActions/personaActions.d.ts.map +1 -0
- package/lib/actions/personaActions/personaActions.js +572 -0
- package/lib/actions/postActions/postActions.d.ts +12 -32
- package/lib/actions/postActions/postActions.d.ts.map +1 -0
- package/lib/actions/postActions/postActions.js +447 -2
- package/lib/actions/reactionActions/reactionActions.d.ts +13 -27
- package/lib/actions/reactionActions/reactionActions.d.ts.map +1 -0
- package/lib/actions/reactionActions/reactionActions.js +413 -2
- package/lib/actions/sseActions/sseActions.d.ts +1 -0
- package/lib/actions/sseActions/sseActions.d.ts.map +1 -0
- package/lib/actions/sseActions/sseActions.js +148 -2
- package/lib/actions/subscriptionActions/subscriptionActions.d.ts +24 -0
- package/lib/actions/subscriptionActions/subscriptionActions.d.ts.map +1 -0
- package/lib/actions/subscriptionActions/subscriptionActions.js +329 -0
- package/lib/actions/tagActions/tagActions.d.ts +13 -31
- package/lib/actions/tagActions/tagActions.d.ts.map +1 -0
- package/lib/actions/tagActions/tagActions.js +347 -2
- package/lib/actions/translationActions/translationActions.d.ts +38 -0
- package/lib/actions/translationActions/translationActions.d.ts.map +1 -0
- package/lib/actions/translationActions/translationActions.js +189 -0
- package/lib/actions/userActions/userActions.d.ts +44 -95
- package/lib/actions/userActions/userActions.d.ts.map +1 -0
- package/lib/actions/userActions/userActions.js +870 -2
- package/lib/actions/videoActions/videoActions.d.ts +41 -0
- package/lib/actions/videoActions/videoActions.d.ts.map +1 -0
- package/lib/actions/videoActions/videoActions.js +532 -0
- package/lib/actions/websocketActions/websocketActions.d.ts +20 -21
- package/lib/actions/websocketActions/websocketActions.d.ts.map +1 -0
- package/lib/actions/websocketActions/websocketActions.js +377 -2
- package/lib/adapters/appAdapter/appAdapter.d.ts +8 -0
- package/lib/adapters/appAdapter/appAdapter.d.ts.map +1 -0
- package/lib/adapters/appAdapter/appAdapter.js +90 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.d.ts +3 -2
- package/lib/adapters/arangoAdapter/arangoAdapter.d.ts.map +1 -0
- package/lib/adapters/arangoAdapter/arangoAdapter.js +75 -2
- package/lib/adapters/contentAdapter/contentAdapter.d.ts +3 -2
- package/lib/adapters/contentAdapter/contentAdapter.d.ts.map +1 -0
- package/lib/adapters/contentAdapter/contentAdapter.js +107 -2
- package/lib/adapters/conversationAdapter/conversationAdapter.d.ts +3 -2
- package/lib/adapters/conversationAdapter/conversationAdapter.d.ts.map +1 -0
- package/lib/adapters/conversationAdapter/conversationAdapter.js +75 -2
- package/lib/adapters/eventAdapter/eventAdapter.d.ts +5 -2
- package/lib/adapters/eventAdapter/eventAdapter.d.ts.map +1 -0
- package/lib/adapters/eventAdapter/eventAdapter.js +162 -2
- package/lib/adapters/fileAdapter/fileAdapter.d.ts +3 -2
- package/lib/adapters/fileAdapter/fileAdapter.d.ts.map +1 -0
- package/lib/adapters/fileAdapter/fileAdapter.js +118 -2
- package/lib/adapters/groupAdapter/groupAdapter.d.ts +28 -0
- package/lib/adapters/groupAdapter/groupAdapter.d.ts.map +1 -0
- package/lib/adapters/groupAdapter/groupAdapter.js +66 -0
- package/lib/adapters/imageAdapter/imageAdapter.d.ts +9 -2
- package/lib/adapters/imageAdapter/imageAdapter.d.ts.map +1 -0
- package/lib/adapters/imageAdapter/imageAdapter.js +134 -2
- package/lib/adapters/index.d.ts +34 -16
- package/lib/adapters/index.d.ts.map +1 -0
- package/lib/adapters/index.js +19 -2
- package/lib/adapters/locationAdapter/locationAdapter.d.ts +3 -2
- package/lib/adapters/locationAdapter/locationAdapter.d.ts.map +1 -0
- package/lib/adapters/locationAdapter/locationAdapter.js +95 -2
- package/lib/adapters/messageAdapter/messageAdapter.d.ts +23 -19
- package/lib/adapters/messageAdapter/messageAdapter.d.ts.map +1 -0
- package/lib/adapters/messageAdapter/messageAdapter.js +82 -2
- package/lib/adapters/permissionAdapter/permissionAdapter.d.ts +41 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.d.ts.map +1 -0
- package/lib/adapters/permissionAdapter/permissionAdapter.js +120 -0
- package/lib/adapters/personaAdapter/personaAdapter.d.ts +28 -2
- package/lib/adapters/personaAdapter/personaAdapter.d.ts.map +1 -0
- package/lib/adapters/personaAdapter/personaAdapter.js +161 -2
- package/lib/adapters/postAdapter/postAdapter.d.ts +3 -2
- package/lib/adapters/postAdapter/postAdapter.d.ts.map +1 -0
- package/lib/adapters/postAdapter/postAdapter.js +115 -2
- package/lib/adapters/reactionAdapter/reactionAdapter.d.ts +5 -2
- package/lib/adapters/reactionAdapter/reactionAdapter.d.ts.map +1 -0
- package/lib/adapters/reactionAdapter/reactionAdapter.js +81 -2
- package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts +3 -2
- package/lib/adapters/reaktorAdapter/reaktorAdapter.d.ts.map +1 -0
- package/lib/adapters/reaktorAdapter/reaktorAdapter.js +58 -2
- package/lib/adapters/sessionAdapter/sessionAdapter.d.ts +3 -2
- package/lib/adapters/sessionAdapter/sessionAdapter.d.ts.map +1 -0
- package/lib/adapters/sessionAdapter/sessionAdapter.js +80 -2
- package/lib/adapters/tagAdapter/tagAdapter.d.ts +3 -2
- package/lib/adapters/tagAdapter/tagAdapter.d.ts.map +1 -0
- package/lib/adapters/tagAdapter/tagAdapter.js +98 -2
- package/lib/adapters/translationAdapter/translationAdapter.d.ts +21 -0
- package/lib/adapters/translationAdapter/translationAdapter.d.ts.map +1 -0
- package/lib/adapters/translationAdapter/translationAdapter.js +55 -0
- package/lib/adapters/userAdapter/userAdapter.d.ts +18 -6
- package/lib/adapters/userAdapter/userAdapter.d.ts.map +1 -0
- package/lib/adapters/userAdapter/userAdapter.js +302 -2
- package/lib/adapters/videoAdapter/videoAdapter.d.ts +8 -0
- package/lib/adapters/videoAdapter/videoAdapter.d.ts.map +1 -0
- package/lib/adapters/videoAdapter/videoAdapter.js +194 -0
- package/lib/config/index.d.ts +19 -6
- package/lib/config/index.d.ts.map +1 -0
- package/lib/config/index.js +97 -2
- package/lib/constants/Collections.d.ts +44 -0
- package/lib/constants/Collections.d.ts.map +1 -0
- package/lib/constants/Collections.js +40 -0
- package/lib/constants/MetropolisConstants.d.ts +1 -0
- package/lib/constants/MetropolisConstants.d.ts.map +1 -0
- package/lib/constants/MetropolisConstants.js +15 -2
- package/lib/graphql/message.d.ts +1 -0
- package/lib/graphql/message.d.ts.map +1 -0
- package/lib/graphql/message.js +6 -4
- package/lib/graphql/notification.d.ts +1 -0
- package/lib/graphql/notification.d.ts.map +1 -0
- package/lib/graphql/notification.js +6 -4
- package/lib/graphql/session.d.ts +1 -0
- package/lib/graphql/session.d.ts.map +1 -0
- package/lib/graphql/session.js +4 -3
- package/lib/index.d.ts +45 -22
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +248 -2
- package/lib/stores/appStore.d.ts +1 -0
- package/lib/stores/appStore.d.ts.map +1 -0
- package/lib/stores/appStore.js +23 -2
- package/lib/stores/contentStore.d.ts +36 -0
- package/lib/stores/contentStore.d.ts.map +1 -0
- package/lib/stores/contentStore.js +139 -0
- package/lib/stores/conversationStore.d.ts +38 -0
- package/lib/stores/conversationStore.d.ts.map +1 -0
- package/lib/stores/conversationStore.js +117 -0
- package/lib/stores/eventStore.d.ts +4 -1
- package/lib/stores/eventStore.d.ts.map +1 -0
- package/lib/stores/eventStore.js +47 -2
- package/lib/stores/groupStore.d.ts +37 -0
- package/lib/stores/groupStore.d.ts.map +1 -0
- package/lib/stores/groupStore.js +68 -0
- package/lib/stores/imageStore.d.ts +6 -1
- package/lib/stores/imageStore.d.ts.map +1 -0
- package/lib/stores/imageStore.js +53 -2
- package/lib/stores/index.d.ts +20 -11
- package/lib/stores/index.d.ts.map +1 -0
- package/lib/stores/index.js +24 -2
- package/lib/stores/locationStore.d.ts +2 -1
- package/lib/stores/locationStore.d.ts.map +1 -0
- package/lib/stores/locationStore.js +42 -2
- package/lib/stores/messageStore.d.ts +19 -4
- package/lib/stores/messageStore.d.ts.map +1 -0
- package/lib/stores/messageStore.js +137 -2
- package/lib/stores/notificationStore.d.ts +33 -0
- package/lib/stores/notificationStore.d.ts.map +1 -0
- package/lib/stores/notificationStore.js +55 -0
- package/lib/stores/permissionStore.d.ts +37 -0
- package/lib/stores/permissionStore.d.ts.map +1 -0
- package/lib/stores/permissionStore.js +117 -0
- package/lib/stores/personaStore.d.ts +26 -0
- package/lib/stores/personaStore.d.ts.map +1 -0
- package/lib/stores/personaStore.js +118 -0
- package/lib/stores/postStore.d.ts +2 -1
- package/lib/stores/postStore.d.ts.map +1 -0
- package/lib/stores/postStore.js +53 -2
- package/lib/stores/reactionStore.d.ts +1 -0
- package/lib/stores/reactionStore.d.ts.map +1 -0
- package/lib/stores/reactionStore.js +28 -2
- package/lib/stores/subscriptionStore.d.ts +41 -0
- package/lib/stores/subscriptionStore.d.ts.map +1 -0
- package/lib/stores/subscriptionStore.js +85 -0
- package/lib/stores/tagStore.d.ts +8 -5
- package/lib/stores/tagStore.d.ts.map +1 -0
- package/lib/stores/tagStore.js +87 -2
- package/lib/stores/translationStore.d.ts +42 -0
- package/lib/stores/translationStore.d.ts.map +1 -0
- package/lib/stores/translationStore.js +122 -0
- package/lib/stores/userStore.d.ts +5 -4
- package/lib/stores/userStore.d.ts.map +1 -0
- package/lib/stores/userStore.js +319 -2
- package/lib/stores/videoStore.d.ts +39 -0
- package/lib/stores/videoStore.d.ts.map +1 -0
- package/lib/stores/videoStore.js +132 -0
- package/lib/stores/websocketStore.d.ts +1 -0
- package/lib/stores/websocketStore.d.ts.map +1 -0
- package/lib/stores/websocketStore.js +51 -2
- package/lib/types/apps.types.d.ts +17 -0
- package/lib/types/apps.types.d.ts.map +1 -0
- package/lib/types/apps.types.js +6 -0
- package/lib/types/common.types.d.ts +31 -0
- package/lib/types/common.types.d.ts.map +1 -0
- package/lib/types/common.types.js +6 -0
- package/lib/types/conversations.types.d.ts +17 -0
- package/lib/types/conversations.types.d.ts.map +1 -0
- package/lib/types/conversations.types.js +6 -0
- package/lib/types/edges.types.d.ts +38 -0
- package/lib/types/edges.types.d.ts.map +1 -0
- package/lib/types/edges.types.js +6 -0
- package/lib/types/groups.types.d.ts +19 -0
- package/lib/types/groups.types.d.ts.map +1 -0
- package/lib/types/groups.types.js +6 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +12 -0
- package/lib/types/subscriptions.types.d.ts +32 -0
- package/lib/types/subscriptions.types.d.ts.map +1 -0
- package/lib/types/subscriptions.types.js +6 -0
- package/lib/types/videos.types.d.ts +61 -0
- package/lib/types/videos.types.d.ts.map +1 -0
- package/lib/types/videos.types.js +6 -0
- package/lib/utils/MetropolisProvider.d.ts +39 -15
- package/lib/utils/MetropolisProvider.d.ts.map +1 -0
- package/lib/utils/MetropolisProvider.js +31 -2
- package/lib/utils/actionFactory.d.ts +21 -19
- package/lib/utils/actionFactory.d.ts.map +1 -0
- package/lib/utils/actionFactory.js +95 -2
- package/lib/utils/api.d.ts +5 -4
- package/lib/utils/api.d.ts.map +1 -0
- package/lib/utils/api.js +252 -6
- package/lib/utils/app.d.ts +1 -0
- package/lib/utils/app.d.ts.map +1 -0
- package/lib/utils/app.js +15 -2
- package/lib/utils/baseActionFactory.d.ts +5 -23
- package/lib/utils/baseActionFactory.d.ts.map +1 -0
- package/lib/utils/baseActionFactory.js +72 -2
- package/lib/utils/configUtils.d.ts +11 -0
- package/lib/utils/configUtils.d.ts.map +1 -0
- package/lib/utils/configUtils.js +20 -0
- package/lib/utils/dateUtils.d.ts +1 -0
- package/lib/utils/dateUtils.d.ts.map +1 -0
- package/lib/utils/dateUtils.js +11 -2
- package/lib/utils/file.d.ts +3 -1
- package/lib/utils/file.d.ts.map +1 -0
- package/lib/utils/file.js +156 -2
- package/lib/utils/i18n.d.ts +7 -0
- package/lib/utils/i18n.d.ts.map +1 -0
- package/lib/utils/i18n.js +96 -0
- package/lib/utils/index.d.ts +20 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +26 -0
- package/lib/utils/location.d.ts +4 -3
- package/lib/utils/location.d.ts.map +1 -0
- package/lib/utils/location.js +82 -2
- package/lib/utils/permissionUtils.d.ts +22 -0
- package/lib/utils/permissionUtils.d.ts.map +1 -0
- package/lib/utils/permissionUtils.js +72 -0
- package/lib/utils/requestCache.d.ts +8 -0
- package/lib/utils/requestCache.d.ts.map +1 -0
- package/lib/utils/requestCache.js +53 -0
- package/lib/utils/session.d.ts +14 -0
- package/lib/utils/session.d.ts.map +1 -0
- package/lib/utils/session.js +107 -0
- package/lib/utils/useConversationTyping.d.ts +26 -0
- package/lib/utils/useConversationTyping.d.ts.map +1 -0
- package/lib/utils/useConversationTyping.js +117 -0
- package/lib/utils/useMetropolis.d.ts +67 -12
- package/lib/utils/useMetropolis.d.ts.map +1 -0
- package/lib/utils/useMetropolis.js +311 -2
- package/lib/utils/useTranslations.d.ts +16 -0
- package/lib/utils/useTranslations.d.ts.map +1 -0
- package/lib/utils/useTranslations.js +105 -0
- package/lib/utils/validatorFactory.d.ts +3 -2
- package/lib/utils/validatorFactory.d.ts.map +1 -0
- package/lib/utils/validatorFactory.js +95 -2
- package/package.json +58 -17
- package/temp_signin.ts +73 -0
- package/lib/actions/profileActions/profileActions.d.ts +0 -50
- package/lib/actions/profileActions/profileActions.js +0 -2
- package/lib/adapters/profileAdapter/profileAdapter.d.ts +0 -32
- package/lib/adapters/profileAdapter/profileAdapter.js +0 -2
- package/lib/stores/profileStore.d.ts +0 -24
- package/lib/stores/profileStore.js +0 -2
- /package/{FACTORY_PATTERN_GUIDE.md → factoryPatternGuide.md} +0 -0
|
@@ -1,2 +1,870 @@
|
|
|
1
|
-
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FjdGlvbnMvdXNlckFjdGlvbnMvdXNlckFjdGlvbnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5cbmltcG9ydCB7dmFsaWRhdGVQZXJzb25hSW5wdXR9IGZyb20gJy4uLy4uL2FkYXB0ZXJzL3BlcnNvbmFBZGFwdGVyL3BlcnNvbmFBZGFwdGVyJztcbmltcG9ydCB7dmFsaWRhdGVVc2VySW5wdXR9IGZyb20gJy4uLy4uL2FkYXB0ZXJzL3VzZXJBZGFwdGVyL3VzZXJBZGFwdGVyJztcbmltcG9ydCB7VVNFUl9DT05TVEFOVFN9IGZyb20gJy4uLy4uL3N0b3Jlcy91c2VyU3RvcmUnO1xuaW1wb3J0IHthcHBNdXRhdGlvbiwgcHVibGljTXV0YXRpb24sIHJlZnJlc2hTZXNzaW9ufSBmcm9tICcuLi8uLi91dGlscy9hcGknO1xuaW1wb3J0IHtjcmVhdGVCYXNlQWN0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvYmFzZUFjdGlvbkZhY3RvcnknO1xuXG5pbXBvcnQgdHlwZSB7Rmx1eEFjdGlvbiwgRmx1eEZyYW1ld29ya30gZnJvbSAnQG5sYWJzL2Fya2hhbWpzJztcbmltcG9ydCB0eXBlIHtQZXJzb25hVHlwZX0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvcGVyc29uYUFkYXB0ZXIvcGVyc29uYUFkYXB0ZXInO1xuaW1wb3J0IHR5cGUge1VzZXJ9IGZyb20gJy4uLy4uL2FkYXB0ZXJzL3VzZXJBZGFwdGVyL3VzZXJBZGFwdGVyJztcbmltcG9ydCB0eXBlIHtBcGlSZXN1bHRzVHlwZSwgUmVha3RvckRiQ29sbGVjdGlvbiwgU2Vzc2lvblR5cGV9IGZyb20gJy4uLy4uL3V0aWxzL2FwaSc7XG5pbXBvcnQgdHlwZSB7QmFzZUFkYXB0ZXJPcHRpb25zfSBmcm9tICcuLi8uLi91dGlscy92YWxpZGF0b3JGYWN0b3J5JztcblxuY29uc3QgREFUQV9UWVBFOiBSZWFrdG9yRGJDb2xsZWN0aW9uID0gJ3VzZXJzJztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQWRhcHRlck9wdGlvbnMgZXh0ZW5kcyBCYXNlQWRhcHRlck9wdGlvbnMge1xuICAvLyBVc2VyLXNwZWNpZmljIG9wdGlvbnMgY2FuIGJlIGFkZGVkIGhlcmVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZXJzb25hQWRhcHRlck9wdGlvbnMgZXh0ZW5kcyBCYXNlQWRhcHRlck9wdGlvbnMge1xuICAvLyBQZXJzb25hLXNwZWNpZmljIG9wdGlvbnMgY2FuIGJlIGFkZGVkIGhlcmVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQWN0aW9uc09wdGlvbnMge1xuICByZWFkb25seSB1c2VyQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gYW55O1xuICByZWFkb25seSBwZXJzb25hQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFBlcnNvbmFBZGFwdGVyT3B0aW9ucykgPT4gYW55O1xuICByZWFkb25seSB1c2VyQWRhcHRlck9wdGlvbnM/OiBVc2VyQWRhcHRlck9wdGlvbnM7XG4gIHJlYWRvbmx5IHBlcnNvbmFBZGFwdGVyT3B0aW9ucz86IFBlcnNvbmFBZGFwdGVyT3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQXBpUmVzdWx0c1R5cGUge1xuICByZWFkb25seSB1c2Vyczoge1xuICAgIHJlYWRvbmx5IGFjdGl2ZUNvdW50PzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGFkZD86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgY29uZmlybUNvZGU/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGRlYWN0aXZhdGU/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGZvcmdvdFBhc3N3b3JkPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBpdGVtQnlJZD86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5VG9rZW4/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGl0ZW1CeVVzZXJuYW1lPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBsaXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeUNvbm5lY3Rpb24/OiBVc2VyW107XG4gICAgcmVhZG9ubHkgbGlzdEJ5TGF0ZXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeVJlYWN0aW9ucz86IFVzZXJbXTtcbiAgICByZWFkb25seSBsaXN0QnlUYWdzPzogVXNlcltdO1xuICAgIHJlYWRvbmx5IHJlZnJlc2hTZXNzaW9uPzogU2Vzc2lvblR5cGU7XG4gICAgcmVhZG9ubHkgcmVtb3ZlPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSByZXNldFBhc3N3b3JkPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBzZXNzaW9uPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBzaWduSW4/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHNpZ25VcD86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgdXBkYXRlPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSB1cGRhdGVQYXNzd29yZD86IFBhcnRpYWw8Ym9vbGVhbj47XG4gICAgcmVhZG9ubHkgdXBkYXRlUGVyc29uYT86IFBhcnRpYWw8UGVyc29uYVR5cGU+O1xuICB9O1xufVxuXG4vLyBEZWZhdWx0IHZhbGlkYXRpb24gZnVuY3Rpb25zXG5jb25zdCBkZWZhdWx0VXNlclZhbGlkYXRvciA9IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4ge1xuICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZGF0ZVVzZXJJbnB1dChpbnB1dCk7XG5cbiAgaWYob3B0aW9ucz8uc3RyaWN0ICYmICF2YWxpZGF0ZWQudXNlcm5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXJuYW1lIGlzIHJlcXVpcmVkIGluIHN0cmljdCBtb2RlJyk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkO1xufTtcblxuY29uc3QgZGVmYXVsdFBlcnNvbmFWYWxpZGF0b3IgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBQZXJzb25hQWRhcHRlck9wdGlvbnMpID0+IHZhbGlkYXRlUGVyc29uYUlucHV0KGlucHV0KTtcblxuZXhwb3J0IGludGVyZmFjZSB1c2VyQWN0aW9ucyB7XG4gIGFkZDogKHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPiwgdXNlclByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8VXNlcj47XG4gIGNvbmZpcm1Db2RlOiAodHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsIGNvZGU6IG51bWJlcikgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgcmVtb3ZlOiAodXNlcklkOiBzdHJpbmcpID0+IFByb21pc2U8VXNlcj47XG4gIHNlc3Npb246ICh1c2VyUHJvcHM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxVc2VyPjtcbiAgaXRlbUJ5SWQ6ICh1c2VySWQ6IHN0cmluZywgdXNlclByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8VXNlcj47XG4gIGxpc3RCeUxhdGVzdDogKHVzZXJuYW1lPzogc3RyaW5nLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgdXNlclByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8VXNlcltdPjtcbiAgbGlzdEJ5Q29ubmVjdGlvbjogKHVzZXJJZDogc3RyaW5nLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgdXNlclByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8VXNlcltdPjtcbiAgbGlzdEJ5UmVhY3Rpb25zOiAodXNlcm5hbWU6IHN0cmluZywgcmVhY3Rpb25OYW1lczogc3RyaW5nW10sIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCBwcm9maWxlUHJvcHM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBsaXN0QnlUYWdzOiAodXNlcm5hbWU6IHN0cmluZywgdGFnTmFtZXM6IHN0cmluZ1tdLCBmcm9tPzogbnVtYmVyLCB0bz86IG51bWJlciwgcHJvZmlsZVByb3BzPzogc3RyaW5nW10pID0+IFByb21pc2U8VXNlcltdPjtcbiAgaXNMb2dnZWRJbjogKCkgPT4gYm9vbGVhbjtcbiAgcmVmcmVzaFNlc3Npb246ICh0b2tlbj86IHN0cmluZywgZXhwaXJlcz86IG51bWJlcikgPT4gUHJvbWlzZTxTZXNzaW9uVHlwZT47XG4gIHNpZ25JbjogKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGV4cGlyZXM/OiBudW1iZXIpID0+IFByb21pc2U8U2Vzc2lvblR5cGU+O1xuICBzaWduT3V0OiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBjb25maXJtU2lnblVwOiAoY29kZTogc3RyaW5nLCB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgZm9yZ290UGFzc3dvcmQ6ICh1c2VybmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICByZXNldFBhc3N3b3JkOiAodXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZywgY29kZTogc3RyaW5nLCB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgdXBkYXRlUGFzc3dvcmQ6IChwYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICB1cGRhdGVVc2VyOiAodXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LCB1c2VyUHJvcHM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxVc2VyPjtcbiAgdXBkYXRlUGVyc29uYTogKHBlcnNvbmFJbnB1dDogUGFydGlhbDxQZXJzb25hVHlwZT4pID0+IFByb21pc2U8UGVyc29uYVR5cGU+O1xuICBzaWduVXA6ICh1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sIHVzZXJQcm9wcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPFVzZXI+O1xuICB1cGRhdGVVc2VyQWRhcHRlcjogKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICB1cGRhdGVQZXJzb25hQWRhcHRlcjogKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFBlcnNvbmFBZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICB1cGRhdGVVc2VyQWRhcHRlck9wdGlvbnM6IChvcHRpb25zOiBVc2VyQWRhcHRlck9wdGlvbnMpID0+IHZvaWQ7XG4gIHVwZGF0ZVBlcnNvbmFBZGFwdGVyT3B0aW9uczogKG9wdGlvbnM6IFBlcnNvbmFBZGFwdGVyT3B0aW9ucykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSB1c2VyQWN0aW9ucyB3aXRoIGVuaGFuY2VkIGFkYXB0ZXIgaW5qZWN0aW9uIGNhcGFiaWxpdGllcy5cbiAqIEN1c3RvbSBhZGFwdGVycyBhcmUgbWVyZ2VkIHdpdGggZGVmYXVsdCBiZWhhdmlvciwgYWxsb3dpbmcgcGFydGlhbCBvdmVycmlkZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIHVzYWdlIHdpdGggZGVmYXVsdCBhZGFwdGVyc1xuICogY29uc3QgdXNlckFjdGlvbnMgPSBjcmVhdGVVc2VyQWN0aW9ucyhmbHV4KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3VzdG9tIGFkYXB0ZXIgdGhhdCBleHRlbmRzIGRlZmF1bHQgYmVoYXZpb3JcbiAqIGNvbnN0IGN1c3RvbVVzZXJBZGFwdGVyID0gKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogVXNlckFkYXB0ZXJPcHRpb25zKSA9PiB7XG4gKiAgIC8vIGlucHV0IGlzIGFscmVhZHkgdmFsaWRhdGVkIGJ5IGRlZmF1bHQgYWRhcHRlclxuICogICBpZiAoaW5wdXQuZW1haWwgJiYgIWlucHV0LmVtYWlsLmluY2x1ZGVzKCdAY29tcGFueS5jb20nKSkge1xuICogICAgIHRocm93IG5ldyBFcnJvcignT25seSBjb21wYW55IGVtYWlscyBhbGxvd2VkJyk7XG4gKiAgIH1cbiAqICAgcmV0dXJuIGlucHV0O1xuICogfTtcbiAqXG4gKiBjb25zdCB1c2VyQWN0aW9ucyA9IGNyZWF0ZVVzZXJBY3Rpb25zKGZsdXgsIHtcbiAqICAgdXNlckFkYXB0ZXI6IGN1c3RvbVVzZXJBZGFwdGVyXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29uZmlndXJhdGlvbi1iYXNlZCBhZGFwdGVyc1xuICogY29uc3QgdXNlckFjdGlvbnMgPSBjcmVhdGVVc2VyQWN0aW9ucyhmbHV4LCB7XG4gKiAgIHVzZXJBZGFwdGVyT3B0aW9uczoge1xuICogICAgIHN0cmljdDogdHJ1ZSxcbiAqICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nXG4gKiAgIH1cbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSdW50aW1lIGFkYXB0ZXIgdXBkYXRlc1xuICogdXNlckFjdGlvbnMudXBkYXRlVXNlckFkYXB0ZXIoY3VzdG9tVXNlckFkYXB0ZXIpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb21wbGV4IGFkYXB0ZXIgd2l0aCBidXNpbmVzcyBsb2dpY1xuICogY29uc3QgYnVzaW5lc3NVc2VyQWRhcHRlciA9IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4ge1xuICogICAvLyBpbnB1dCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBieSBkZWZhdWx0IGFkYXB0ZXJcbiAqICAgY29uc3QgdXNlciA9IGlucHV0IGFzIGFueTtcbiAqXG4gKiAgIC8vIEFkZCBidXNpbmVzcy1zcGVjaWZpYyB2YWxpZGF0aW9uXG4gKiAgIGlmICh1c2VyLnVzZXJBY2Nlc3MgPiA1KSB7XG4gKiAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIGFjY2VzcyBsZXZlbCB0b28gaGlnaCcpO1xuICogICB9XG4gKlxuICogICAvLyBBZGQgY29tcHV0ZWQgZmllbGRzXG4gKiAgIHJldHVybiB7XG4gKiAgICAgLi4udXNlcixcbiAqICAgICBmdWxsTmFtZTogYCR7dXNlci5maXJzdCB8fCAnJ30gJHt1c2VyLmxhc3QgfHwgJyd9YC50cmltKCksXG4gKiAgICAgaXNBZG1pbjogdXNlci51c2VyQWNjZXNzID49IDNcbiAqICAgfTtcbiAqIH07XG4gKlxuICogY29uc3QgdXNlckFjdGlvbnMgPSBjcmVhdGVVc2VyQWN0aW9ucyhmbHV4LCB7XG4gKiAgIHVzZXJBZGFwdGVyOiBidXNpbmVzc1VzZXJBZGFwdGVyLFxuICogICB1c2VyQWRhcHRlck9wdGlvbnM6IHtcbiAqICAgICBzdHJpY3Q6IHRydWUsXG4gKiAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJ1xuICogICB9XG4gKiB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVVzZXJBY3Rpb25zID0gKFxuICBmbHV4OiBGbHV4RnJhbWV3b3JrLFxuICBvcHRpb25zPzogVXNlckFjdGlvbnNPcHRpb25zXG4pOiB1c2VyQWN0aW9ucyA9PiB7XG4gIC8vIENyZWF0ZSBiYXNlIGFjdGlvbnMgZm9yIHVzZXIgdmFsaWRhdGlvblxuICBjb25zdCB1c2VyQmFzZSA9IGNyZWF0ZUJhc2VBY3Rpb25zKGZsdXgsIGRlZmF1bHRVc2VyVmFsaWRhdG9yLCB7XG4gICAgYWRhcHRlcjogb3B0aW9ucz8udXNlckFkYXB0ZXIsXG4gICAgYWRhcHRlck9wdGlvbnM6IG9wdGlvbnM/LnVzZXJBZGFwdGVyT3B0aW9uc1xuICB9KTtcblxuICAvLyBDcmVhdGUgYmFzZSBhY3Rpb25zIGZvciBwZXJzb25hIHZhbGlkYXRpb25cbiAgY29uc3QgcGVyc29uYUJhc2UgPSBjcmVhdGVCYXNlQWN0aW9ucyhmbHV4LCBkZWZhdWx0UGVyc29uYVZhbGlkYXRvciwge1xuICAgIGFkYXB0ZXI6IG9wdGlvbnM/LnBlcnNvbmFBZGFwdGVyLFxuICAgIGFkYXB0ZXJPcHRpb25zOiBvcHRpb25zPy5wZXJzb25hQWRhcHRlck9wdGlvbnNcbiAgfSk7XG5cbiAgLy8gQWN0aW9uIGltcGxlbWVudGF0aW9ucyB1c2luZyB0aGUgYmFzZSB1dGlsaXRpZXNcbiAgY29uc3QgYWRkID0gYXN5bmMgKHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPiwgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIHR5cGU6ICdVc2VySW5wdXQnLFxuICAgICAgICB2YWx1ZTogdXNlckJhc2UudmFsaWRhdG9yKHVzZXJJbnB1dClcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IFVzZXJBcGlSZXN1bHRzVHlwZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4gPT4ge1xuICAgICAgY29uc3Qge3VzZXJzOiB7YWRkID0ge319fSA9IGRhdGE7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHVzZXI6IGFkZCxcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuQUREX0lURU1fU1VDQ0VTU1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHt1c2Vyczoge2FkZDogdXNlciA9IHt9fX0gPSBhd2FpdCBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgZmx1eCxcbiAgICAgICdhZGQnLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICB1c2VyUHJvcHMgfHwgW1xuICAgICAgICAnYWRkZWQnLFxuICAgICAgICAnYWRkcmVzcycsXG4gICAgICAgICdkb2InLFxuICAgICAgICAnY2l0eScsXG4gICAgICAgICdjb3VudHJ5JyxcbiAgICAgICAgJ2dlbmRlcicsXG4gICAgICAgICdpbWFnZVVybCcsXG4gICAgICAgICdsYXRpdHVkZScsXG4gICAgICAgICdsb25naXR1ZGUnLFxuICAgICAgICAnbWFpbGluZ0xpc3QnLFxuICAgICAgICAnbW9kaWZpZWQnLFxuICAgICAgICAnc3RhdGUnLFxuICAgICAgICAndGFncyB7aWQsIG5hbWUsIHRhZ0lkfScsXG4gICAgICAgICd0aHVtYlVybCcsXG4gICAgICAgICd1c2VyQWNjZXNzJyxcbiAgICAgICAgJ3VzZXJJZCcsXG4gICAgICAgICd1c2VybmFtZSdcbiAgICAgIF0sXG4gICAgICB7b25TdWNjZXNzfVxuICAgICk7XG5cbiAgICBmbHV4LmRpc3BhdGNoKHt1c2VyLCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5BRERfSVRFTV9TVUNDRVNTfSk7XG4gICAgcmV0dXJuIHVzZXIgYXMgVXNlcjtcbiAgfTtcblxuICBjb25zdCBzaWduVXAgPSBhc3luYyAodXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LCB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10pOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZTogdXNlckJhc2UudmFsaWRhdG9yKHVzZXJJbnB1dClcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IFVzZXJBcGlSZXN1bHRzVHlwZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4gPT4ge1xuICAgICAgY29uc3Qge3VzZXJzOiB7c2lnblVwID0ge319fSA9IGRhdGE7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHVzZXI6IHNpZ25VcCxcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9VUF9TVUNDRVNTXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qge3VzZXJzOiB7c2lnblVwOiB1c2VyID0ge319fSA9IGF3YWl0IHB1YmxpY011dGF0aW9uPFVzZXJBcGlSZXN1bHRzVHlwZT4oXG4gICAgICBmbHV4LFxuICAgICAgJ3NpZ25VcCcsXG4gICAgICBEQVRBX1RZUEUsXG4gICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgIFtcbiAgICAgICAgJ2FkZGVkJyxcbiAgICAgICAgJ2NpdHknLFxuICAgICAgICAnY291bnRyeScsXG4gICAgICAgICdkb2InLFxuICAgICAgICAnZmlyc3ROYW1lJyxcbiAgICAgICAgJ2dlbmRlcicsXG4gICAgICAgICdpbWFnZUNvdW50JyxcbiAgICAgICAgJ2ltYWdlVXJsJyxcbiAgICAgICAgJ2xhdGl0dWRlJyxcbiAgICAgICAgJ2xhc3ROYW1lJyxcbiAgICAgICAgJ2xvbmdpdHVkZScsXG4gICAgICAgICdtYWlsaW5nTGlzdCcsXG4gICAgICAgICdtb2RpZmllZCcsXG4gICAgICAgICduYW1lJyxcbiAgICAgICAgJ3N0YXRlJyxcbiAgICAgICAgJ3RhZ3Mge2lkLCBuYW1lLCB0YWdJZH0nLFxuICAgICAgICAndGh1bWJVcmwnLFxuICAgICAgICAndXNlckFjY2VzcycsXG4gICAgICAgICd1c2VySWQnLFxuICAgICAgICAndXNlcm5hbWUnLFxuICAgICAgICAuLi51c2VyUHJvcHNcbiAgICAgIF0sXG4gICAgICB7b25TdWNjZXNzfVxuICAgICk7XG4gICAgcmV0dXJuIHVzZXIgYXMgVXNlcjtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVVc2VyID0gYXN5bmMgKHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPiwgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIHR5cGU6ICdVc2VyVXBkYXRlSW5wdXQhJyxcbiAgICAgICAgdmFsdWU6IHVzZXJCYXNlLnZhbGlkYXRvcih1c2VySW5wdXQpXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7dXNlcnM6IHt1cGRhdGUgPSB7fX19ID0gZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdXNlcjogdXBkYXRlLFxuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5VUERBVEVfSVRFTV9TVUNDRVNTXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qge3VzZXJ9ID0gYXdhaXQgYXBwTXV0YXRpb24oXG4gICAgICBmbHV4LFxuICAgICAgJ3VwZGF0ZScsXG4gICAgICBEQVRBX1RZUEUsXG4gICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgIFtcbiAgICAgICAgJ2FkZGVkJyxcbiAgICAgICAgJ2FkZHJlc3MnLFxuICAgICAgICAnYmlydGhkYXRlJyxcbiAgICAgICAgJ2NpdHknLFxuICAgICAgICAnY291bnRyeScsXG4gICAgICAgICdnZW5kZXInLFxuICAgICAgICAnaW1hZ2VDb3VudCcsXG4gICAgICAgICdpbWFnZVVybCcsXG4gICAgICAgICdsYXRpdHVkZScsXG4gICAgICAgICdsb25naXR1ZGUnLFxuICAgICAgICAnbWFpbGluZ0xpc3QnLFxuICAgICAgICAnbW9kaWZpZWQnLFxuICAgICAgICAnc3RhdGUnLFxuICAgICAgICAndGFncyB7aWQsIG5hbWUsIHRhZ0lkfScsXG4gICAgICAgICd0aHVtYlVybCcsXG4gICAgICAgICd1c2VyQWNjZXNzJyxcbiAgICAgICAgJ3VzZXJJZCcsXG4gICAgICAgICd1c2VybmFtZScsXG4gICAgICAgIC4uLnVzZXJQcm9wc1xuICAgICAgXSxcbiAgICAgIHtvblN1Y2Nlc3N9XG4gICAgKTtcbiAgICByZXR1cm4gdXNlciBhcyBVc2VyO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZVBlcnNvbmEgPSBhc3luYyAocGVyc29uYUlucHV0OiBQYXJ0aWFsPFBlcnNvbmFUeXBlPik6IFByb21pc2U8UGVyc29uYVR5cGU+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHBlcnNvbmE6IHtcbiAgICAgICAgdHlwZTogJ1BlcnNvbmFVcGRhdGVJbnB1dCEnLFxuICAgICAgICB2YWx1ZTogcGVyc29uYUJhc2UudmFsaWRhdG9yKHBlcnNvbmFJbnB1dClcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHt1c2Vyczoge3VwZGF0ZVBlcnNvbmEgPSB7fX19ID0gZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtwZXJzb25hOiB1cGRhdGVQZXJzb25hLCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5VUERBVEVfUEVSU09OQV9TVUNDRVNTfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHtwZXJzb25hfSA9IGF3YWl0IGFwcE11dGF0aW9uKGZsdXgsICd1cGRhdGVQZXJzb25hJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgW10sIHtvblN1Y2Nlc3N9KTtcbiAgICByZXR1cm4gcGVyc29uYSBhcyBQZXJzb25hVHlwZTtcbiAgfTtcblxuICAvLyBQbGFjZWhvbGRlciBpbXBsZW1lbnRhdGlvbnMgZm9yIG90aGVyIG1ldGhvZHMgKHlvdSBjYW4gYWRkIHRoZSBmdWxsIGltcGxlbWVudGF0aW9ucylcbiAgY29uc3QgY29uZmlybUNvZGUgPSBhc3luYyAodHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsIGNvZGU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4gPT5cbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgdHJ1ZVxuICA7XG5cbiAgY29uc3QgcmVtb3ZlID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICAoe30gYXMgVXNlcilcbiAgO1xuXG4gIGNvbnN0IHNlc3Npb24gPSBhc3luYyAodXNlclByb3BzOiBzdHJpbmdbXSA9IFtdKTogUHJvbWlzZTxVc2VyPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICAoe30gYXMgVXNlcilcbiAgO1xuXG4gIGNvbnN0IGl0ZW1CeUlkID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10pOiBQcm9taXNlPFVzZXI+ID0+XG4gICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgICh7fSBhcyBVc2VyKVxuICA7XG5cbiAgY29uc3QgbGlzdEJ5TGF0ZXN0ID0gYXN5bmMgKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcgPSAnJyxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW11cbiAgKTogUHJvbWlzZTxVc2VyW10+ID0+XG4gICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIFtdXG4gIDtcblxuICBjb25zdCBsaXN0QnlDb25uZWN0aW9uID0gYXN5bmMgKFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIGZyb206IG51bWJlciA9IDAsXG4gICAgdG86IG51bWJlciA9IDEwLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXVxuICApOiBQcm9taXNlPFVzZXJbXT4gPT5cbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgW11cbiAgO1xuXG4gIGNvbnN0IGxpc3RCeVJlYWN0aW9ucyA9IGFzeW5jIChcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHJlYWN0aW9uTmFtZXM6IHN0cmluZ1tdLFxuICAgIGZyb206IG51bWJlciA9IDAsXG4gICAgdG86IG51bWJlciA9IDEwLFxuICAgIHByb2ZpbGVQcm9wczogc3RyaW5nW10gPSBbXVxuICApOiBQcm9taXNlPFVzZXJbXT4gPT5cbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgW11cbiAgO1xuXG4gIGNvbnN0IGxpc3RCeVRhZ3MgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lczogc3RyaW5nW10sXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgcHJvZmlsZVByb3BzOiBzdHJpbmdbXSA9IFtdXG4gICk6IFByb21pc2U8VXNlcltdPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICBbXVxuICA7XG5cbiAgY29uc3QgaXNMb2dnZWRJbiA9ICgpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBleHBpcmVzOiBudW1iZXIgPSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24uZXhwaXJlcycpIGFzIG51bWJlcjtcblxuICAgIGlmKCFleHBpcmVzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwaXJlRGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZXhwaXJlcyk7XG4gICAgY29uc3QgZXhwaXJlZERpZmY6IG51bWJlciA9IE1hdGgucm91bmQoZXhwaXJlRGF0ZS5kaWZmKERhdGVUaW1lLmxvY2FsKCksICdtaW51dGVzJykudG9PYmplY3QoKS5taW51dGVzKTtcblxuICAgIHJldHVybiBleHBpcmVkRGlmZiA+IDA7XG4gIH07XG5cbiAgY29uc3QgcmVmcmVzaFNlc3Npb25BY3Rpb24gPSBhc3luYyAodG9rZW4/OiBzdHJpbmcsIGV4cGlyZXM6IG51bWJlciA9IDE1KTogUHJvbWlzZTxTZXNzaW9uVHlwZT4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZnJlc2hTZXNzaW9uKGZsdXgsIHRva2VuLCBleHBpcmVzKTtcbiAgICByZXR1cm4gKHJlc3VsdD8ucmVmcmVzaFNlc3Npb24gfHwge30pIGFzIFNlc3Npb25UeXBlO1xuICB9O1xuXG4gIGNvbnN0IHNpZ25JbiA9IGFzeW5jICh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBleHBpcmVzOiBudW1iZXIgPSAxNSk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIGV4cGlyZXM6IHtcbiAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgIHZhbHVlOiBleHBpcmVzXG4gICAgICB9LFxuICAgICAgcGFzc3dvcmQ6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogcGFzc3dvcmRcbiAgICAgIH0sXG4gICAgICB1c2VybmFtZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgIHZhbHVlOiB1c2VybmFtZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSk6IFByb21pc2U8Rmx1eEFjdGlvbj4gPT4ge1xuICAgICAgLy8gUm9idXN0bHkgZXh0cmFjdCB1c2VycyBmcm9tIHRoZSByZXNwb25zZVxuICAgICAgY29uc3QgdXNlcnMgPSAoZGF0YSBhcyBhbnkpPy51c2VycztcbiAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gdXNlcnM/LnNpZ25JbiB8fCB7fTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgc2Vzc2lvbjogc2Vzc2lvbkRhdGEsXG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fSU5fU1VDQ0VTU1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBwdWJsaWNNdXRhdGlvbiByZXR1cm5zIHRoZSByZXN1bHQgb2Ygb25TdWNjZXNzIGNhbGxiYWNrLCB3aGljaCBpcyBhIEZsdXhBY3Rpb25cbiAgICAgIGF3YWl0IHB1YmxpY011dGF0aW9uPFVzZXJBcGlSZXN1bHRzVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdzaWduSW4nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbJ2V4cGlyZXMnLCAnaXNzdWVkJywgJ3Rva2VuJywgJ3VzZXJJZCcsICd1c2VybmFtZSddLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBzZXNzaW9uIGRhdGEgZnJvbSB0aGUgZmx1eCBzdGF0ZSBzaW5jZSBvblN1Y2Nlc3MgYWxyZWFkeSBwcm9jZXNzZWQgaXRcbiAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJykgfHwge307XG4gICAgICByZXR1cm4gc2Vzc2lvbkRhdGEgYXMgU2Vzc2lvblR5cGU7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fSU5fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzaWduT3V0ID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT5cbiAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgdHJ1ZVxuICA7XG5cbiAgY29uc3QgY29uZmlybVNpZ25VcCA9IGFzeW5jIChjb2RlOiBzdHJpbmcsIHR5cGU6ICdlbWFpbCcgfCAncGhvbmUnKTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB0cnVlXG4gIDtcblxuICBjb25zdCBmb3Jnb3RQYXNzd29yZCA9IGFzeW5jICh1c2VybmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB0cnVlXG4gIDtcblxuICBjb25zdCByZXNldFBhc3N3b3JkID0gYXN5bmMgKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZSdcbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB0cnVlXG4gIDtcblxuICBjb25zdCB1cGRhdGVQYXNzd29yZCA9IGFzeW5jIChwYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB0cnVlXG4gIDtcblxuICAvLyBSZXR1cm4gdGhlIGFjdGlvbnMgb2JqZWN0IHdpdGggdXBkYXRlIGZ1bmN0aW9ucyBmcm9tIGJhc2UgYWN0aW9uc1xuICByZXR1cm4ge1xuICAgIGFkZCxcbiAgICBjb25maXJtQ29kZSxcbiAgICByZW1vdmUsXG4gICAgc2Vzc2lvbixcbiAgICBpdGVtQnlJZCxcbiAgICBsaXN0QnlMYXRlc3QsXG4gICAgbGlzdEJ5Q29ubmVjdGlvbixcbiAgICBsaXN0QnlSZWFjdGlvbnMsXG4gICAgbGlzdEJ5VGFncyxcbiAgICBpc0xvZ2dlZEluLFxuICAgIHJlZnJlc2hTZXNzaW9uOiByZWZyZXNoU2Vzc2lvbkFjdGlvbixcbiAgICBzaWduSW4sXG4gICAgc2lnbk91dCxcbiAgICBjb25maXJtU2lnblVwLFxuICAgIGZvcmdvdFBhc3N3b3JkLFxuICAgIHJlc2V0UGFzc3dvcmQsXG4gICAgdXBkYXRlUGFzc3dvcmQsXG4gICAgdXBkYXRlVXNlcixcbiAgICB1cGRhdGVQZXJzb25hLFxuICAgIHNpZ25VcCxcbiAgICB1cGRhdGVVc2VyQWRhcHRlcjogdXNlckJhc2UudXBkYXRlQWRhcHRlcixcbiAgICB1cGRhdGVQZXJzb25hQWRhcHRlcjogcGVyc29uYUJhc2UudXBkYXRlQWRhcHRlcixcbiAgICB1cGRhdGVVc2VyQWRhcHRlck9wdGlvbnM6IHVzZXJCYXNlLnVwZGF0ZU9wdGlvbnMsXG4gICAgdXBkYXRlUGVyc29uYUFkYXB0ZXJPcHRpb25zOiBwZXJzb25hQmFzZS51cGRhdGVPcHRpb25zXG4gIH07XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBSUEsT0FBUSxZQUFBQSxNQUFlLFFBRXZCLE9BQVEsd0JBQUFDLE1BQTJCLCtDQUNuQyxPQUFRLHFCQUFBQyxNQUF3Qix5Q0FDaEMsT0FBUSxrQkFBQUMsTUFBcUIseUJBQzdCLE9BQVEsZUFBQUMsRUFBYSxrQkFBQUMsRUFBZ0Isa0JBQUFDLE1BQXFCLGtCQUMxRCxPQUFRLHFCQUFBQyxNQUF3QixnQ0FRaEMsTUFBTUMsRUFBaUMsUUE4Q2pDQyxFQUF1QixDQUFDQyxFQUFnQkMsSUFBaUMsQ0FDN0UsTUFBTUMsRUFBWVYsRUFBa0JRLENBQUssRUFFekMsR0FBR0MsR0FBUyxRQUFVLENBQUNDLEVBQVUsU0FDL0IsTUFBTSxJQUFJLE1BQU0scUNBQXFDLEVBR3ZELE9BQU9BLENBQ1QsRUFFTUMsRUFBMEIsQ0FBQ0gsRUFBZ0JDLElBQW9DVixFQUFxQlMsQ0FBSyxFQTJGbEdJLEVBQW9CLENBQy9CQyxFQUNBSixJQUNnQixDQUVoQixNQUFNSyxFQUFXVCxFQUFrQlEsRUFBTU4sRUFBc0IsQ0FDN0QsUUFBU0UsR0FBUyxZQUNsQixlQUFnQkEsR0FBUyxrQkFDM0IsQ0FBQyxFQUdLTSxFQUFjVixFQUFrQlEsRUFBTUYsRUFBeUIsQ0FDbkUsUUFBU0YsR0FBUyxlQUNsQixlQUFnQkEsR0FBUyxxQkFDM0IsQ0FBQyxFQWlVRCxNQUFPLENBQ0wsSUEvVFUsTUFBT08sRUFBMEJDLEVBQXNCLENBQUMsSUFBcUIsQ0FDdkYsTUFBTUMsRUFBaUIsQ0FDckIsS0FBTSxDQUNKLEtBQU0sWUFDTixNQUFPSixFQUFTLFVBQVVFLENBQVMsQ0FDckMsQ0FDRixFQUVNRyxFQUFhQyxHQUFrRCxDQUNuRSxLQUFNLENBQUMsTUFBTyxDQUFDLElBQUFDLEVBQU0sQ0FBQyxDQUFDLENBQUMsRUFBSUQsRUFDNUIs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c0IsQ0FBQyxJQUFxQixDQUMxRixNQUFNQyxFQUFpQixDQUNyQixLQUFNLENBQ0osS0FBTSxhQUNOLE1BQU9KLEVBQVMsVUFBVUUsQ0FBUyxDQUNyQyxDQUNGLEVBRU1HLEVBQWFDLEdBQWtELENBQ25FLEtBQU0sQ0FBQyxNQUFPLENBQUMsT0FBQXVCLEVBQVMsQ0FBQyxDQUFDLENBQUMsRUFBSXZCLEVBQy9CLE9BQU9QLEVBQUssU0FBUyxDQUNuQixLQUFNOEIsRUFDTixLQUFNMUMsRUFBZSxlQUN2QixDQUFDLENBQ0gsRUFFTSxDQUFDLE1BQU8sQ0FBQyxPQUFRcUIsRUFBTyxDQUFDLENBQUMsQ0FBQyxFQUFJLE1BQU1uQixFQUN6Q1UsRUFDQSxTQUNBUCxFQUNBWSxFQUNBLENBQ0UsUUFDQSxPQUNBLFVBQ0EsTUFDQSxZQUNBLFNBQ0EsYUFDQSxXQUNBLFdBQ0EsV0FDQSxZQUNBLGNBQ0EsV0FDQSxPQUNBLFFBQ0EseUJBQ0EsV0FDQSxhQUNBLFNBQ0EsV0FDQSxHQUFHRCxDQUNMLEVBQ0EsQ0FBQyxVQUFBRSxDQUFTLENBQ1osRUFDQSxPQUFPRyxDQUNULEVBcVBFLGtCQUFtQlIsRUFBUyxjQUM1QixxQkFBc0JDLEVBQVksY0FDbEMseUJBQTBCRCxFQUFTLGNBQ25DLDRCQUE2QkMsRUFBWSxhQUMzQyxDQUNGIiwKICAibmFtZXMiOiBbIkRhdGVUaW1lIiwgInZhbGlkYXRlUGVyc29uYUlucHV0IiwgInZhbGlkYXRlVXNlcklucHV0IiwgIlVTRVJfQ09OU1RBTlRTIiwgImFwcE11dGF0aW9uIiwgInB1YmxpY011dGF0aW9uIiwgInJlZnJlc2hTZXNzaW9uIiwgImNyZWF0ZUJhc2VBY3Rpb25zIiwgIkRBVEFfVFlQRSIsICJkZWZhdWx0VXNlclZhbGlkYXRvciIsICJpbnB1dCIsICJvcHRpb25zIiwgInZhbGlkYXRlZCIsICJkZWZhdWx0UGVyc29uYVZhbGlkYXRvciIsICJjcmVhdGVVc2VyQWN0aW9ucyIsICJmbHV4IiwgInVzZXJCYXNlIiwgInBlcnNvbmFCYXNlIiwgInVzZXJJbnB1dCIsICJ1c2VyUHJvcHMiLCAicXVlcnlWYXJpYWJsZXMiLCAib25TdWNjZXNzIiwgImRhdGEiLCAiYWRkIiwgInVzZXIiLCAidHlwZSIsICJjb2RlIiwgInVzZXJJZCIsICJ1c2VybmFtZSIsICJmcm9tIiwgInRvIiwgInJlYWN0aW9uTmFtZXMiLCAicHJvZmlsZVByb3BzIiwgInRhZ05hbWVzIiwgImV4cGlyZXMiLCAiZXhwaXJlRGF0ZSIsICJ0b2tlbiIsICJwYXNzd29yZCIsICJzZXNzaW9uRGF0YSIsICJlcnJvciIsICJuZXdQYXNzd29yZCIsICJ1cGRhdGUiLCAicGVyc29uYUlucHV0IiwgInVwZGF0ZVBlcnNvbmEiLCAicGVyc29uYSIsICJzaWduVXAiXQp9Cg==
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/ import { validateUserInput } from '../../adapters/userAdapter/userAdapter.js';
|
|
5
|
+
import { USER_CONSTANTS } from '../../stores/userStore.js';
|
|
6
|
+
import { appMutation, appQuery, publicMutation, refreshSession } from '../../utils/api.js';
|
|
7
|
+
import { createBaseActions } from '../../utils/baseActionFactory.js';
|
|
8
|
+
import { clearPersistedSession, hydrateSessionFromStorage, isLoggedIn as isLoggedInWithStorage, normalizeSession, storeSession } from '../../utils/session.js';
|
|
9
|
+
import { getConfigFromFlux } from '../../utils/configUtils.js';
|
|
10
|
+
import { clearCachedRequest, getCachedRequest, setCachedRequest } from '../../utils/requestCache.js';
|
|
11
|
+
import { syncPersonaTagsToSession } from '../personaActions/personaActions.js';
|
|
12
|
+
const DATA_TYPE = 'users';
|
|
13
|
+
const DEFAULT_USER_QUERY_FIELDS = [
|
|
14
|
+
'userId',
|
|
15
|
+
'username'
|
|
16
|
+
];
|
|
17
|
+
const SENSITIVE_USER_FIELDS = new Set([
|
|
18
|
+
'password',
|
|
19
|
+
'salt',
|
|
20
|
+
'token',
|
|
21
|
+
'refreshToken',
|
|
22
|
+
'verifiedEmailCode',
|
|
23
|
+
'verifiedSmsCode'
|
|
24
|
+
]);
|
|
25
|
+
const INVALID_FIELD_REGEX = /Cannot query field "([^"]+)"/g;
|
|
26
|
+
const hasSessionIdentity = (user)=>!!(user && (user._id || user.userId || user.username || user.email));
|
|
27
|
+
const sanitizeUpdateUserInput = (userInput = {}, currentSession = {})=>{
|
|
28
|
+
const nextUser = Object.entries(userInput).reduce((user, [field, value])=>{
|
|
29
|
+
if (value === undefined || value === null) {
|
|
30
|
+
return user;
|
|
31
|
+
}
|
|
32
|
+
if (field === 'password') {
|
|
33
|
+
const password = String(value || '').trim();
|
|
34
|
+
if (password) {
|
|
35
|
+
user.password = password;
|
|
36
|
+
}
|
|
37
|
+
return user;
|
|
38
|
+
}
|
|
39
|
+
if (field === 'userId') {
|
|
40
|
+
user.userId = value;
|
|
41
|
+
return user;
|
|
42
|
+
}
|
|
43
|
+
const currentValue = currentSession[field];
|
|
44
|
+
if (String(value) !== String(currentValue ?? '')) {
|
|
45
|
+
user[field] = value;
|
|
46
|
+
}
|
|
47
|
+
return user;
|
|
48
|
+
}, {});
|
|
49
|
+
return nextUser;
|
|
50
|
+
};
|
|
51
|
+
const syncStoredSession = async (flux, sessionPatch = {})=>{
|
|
52
|
+
const currentSession = flux.getState('user.session', {}) || {};
|
|
53
|
+
return storeSession(flux, {
|
|
54
|
+
...currentSession,
|
|
55
|
+
...sessionPatch
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
const getSessionPayload = (payload)=>{
|
|
59
|
+
if (payload && typeof payload === 'object' && 'session' in payload) {
|
|
60
|
+
return payload.session || {};
|
|
61
|
+
}
|
|
62
|
+
return payload && typeof payload === 'object' ? payload : {};
|
|
63
|
+
};
|
|
64
|
+
const getFieldRoot = (field)=>{
|
|
65
|
+
const trimmed = field.trim();
|
|
66
|
+
const match = trimmed.match(/^[A-Za-z_][A-Za-z0-9_]*/);
|
|
67
|
+
return match ? match[0] : '';
|
|
68
|
+
};
|
|
69
|
+
const sanitizeUserProps = (props = [], fallbackProps = DEFAULT_USER_QUERY_FIELDS)=>{
|
|
70
|
+
const seen = new Set();
|
|
71
|
+
const sanitized = props.reduce((list, field)=>{
|
|
72
|
+
const root = getFieldRoot(field);
|
|
73
|
+
if (!root || SENSITIVE_USER_FIELDS.has(root) || seen.has(field)) {
|
|
74
|
+
return list;
|
|
75
|
+
}
|
|
76
|
+
seen.add(field);
|
|
77
|
+
list.push(field);
|
|
78
|
+
return list;
|
|
79
|
+
}, []);
|
|
80
|
+
if (sanitized.length > 0) {
|
|
81
|
+
return sanitized;
|
|
82
|
+
}
|
|
83
|
+
return fallbackProps.reduce((list, field)=>{
|
|
84
|
+
const root = getFieldRoot(field);
|
|
85
|
+
if (!root || SENSITIVE_USER_FIELDS.has(root) || seen.has(field)) {
|
|
86
|
+
return list;
|
|
87
|
+
}
|
|
88
|
+
seen.add(field);
|
|
89
|
+
list.push(field);
|
|
90
|
+
return list;
|
|
91
|
+
}, []);
|
|
92
|
+
};
|
|
93
|
+
const getInvalidFields = (error)=>{
|
|
94
|
+
const errors = error?.errors || error?.source?.errors || [];
|
|
95
|
+
const invalidFields = new Set();
|
|
96
|
+
errors.forEach((item)=>{
|
|
97
|
+
const message = typeof item === 'string' ? item : item?.message || '';
|
|
98
|
+
let match = INVALID_FIELD_REGEX.exec(message);
|
|
99
|
+
while(match){
|
|
100
|
+
invalidFields.add(match[1]);
|
|
101
|
+
match = INVALID_FIELD_REGEX.exec(message);
|
|
102
|
+
}
|
|
103
|
+
INVALID_FIELD_REGEX.lastIndex = 0;
|
|
104
|
+
});
|
|
105
|
+
return invalidFields;
|
|
106
|
+
};
|
|
107
|
+
const withInvalidFieldRetry = async (requestWithProps, props, fallbackProps = DEFAULT_USER_QUERY_FIELDS)=>{
|
|
108
|
+
const safeProps = sanitizeUserProps(props, fallbackProps);
|
|
109
|
+
try {
|
|
110
|
+
return await requestWithProps(safeProps);
|
|
111
|
+
} catch (error) {
|
|
112
|
+
const invalidFields = getInvalidFields(error);
|
|
113
|
+
if (invalidFields.size === 0) {
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
const retryProps = safeProps.filter((field)=>!invalidFields.has(getFieldRoot(field)));
|
|
117
|
+
if (retryProps.length === 0 || retryProps.length === safeProps.length) {
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
return requestWithProps(retryProps);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const defaultUserValidator = (input, options)=>{
|
|
124
|
+
const validated = validateUserInput(input);
|
|
125
|
+
if (options?.strict && !validated.username) {
|
|
126
|
+
throw new Error('Username is required in strict mode');
|
|
127
|
+
}
|
|
128
|
+
return validated;
|
|
129
|
+
};
|
|
130
|
+
export const createUserActions = (flux, options)=>{
|
|
131
|
+
const userBase = createBaseActions(flux, defaultUserValidator, {
|
|
132
|
+
adapter: options?.userAdapter,
|
|
133
|
+
adapterOptions: options?.userAdapterOptions
|
|
134
|
+
});
|
|
135
|
+
const clearUserRequestCaches = async (userId = '')=>{
|
|
136
|
+
await clearCachedRequest(flux, 'user.list');
|
|
137
|
+
await clearCachedRequest(flux, 'user.listByLatest');
|
|
138
|
+
await clearCachedRequest(flux, 'user.listByTags');
|
|
139
|
+
await clearCachedRequest(flux, 'user.search');
|
|
140
|
+
if (userId) {
|
|
141
|
+
await clearCachedRequest(flux, `user.itemById:${userId}`);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const addUser = async (userInput, userProps = [], requestOptions = {})=>{
|
|
145
|
+
const { username, email, password } = userInput;
|
|
146
|
+
const queryVariables = {
|
|
147
|
+
user: {
|
|
148
|
+
type: 'UserInput!',
|
|
149
|
+
value: {
|
|
150
|
+
email,
|
|
151
|
+
password,
|
|
152
|
+
username
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
const onSuccess = (data)=>{
|
|
157
|
+
const user = data?.users?.addUser || {};
|
|
158
|
+
return flux.dispatch({
|
|
159
|
+
type: USER_CONSTANTS.ADD_ITEM_SUCCESS,
|
|
160
|
+
user
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
const returnProps = sanitizeUserProps(userProps, [
|
|
164
|
+
'added',
|
|
165
|
+
'address',
|
|
166
|
+
'dob',
|
|
167
|
+
'city',
|
|
168
|
+
'country',
|
|
169
|
+
'gender',
|
|
170
|
+
'imageUrl',
|
|
171
|
+
'latitude',
|
|
172
|
+
'longitude',
|
|
173
|
+
'mailingList',
|
|
174
|
+
'modified',
|
|
175
|
+
'state',
|
|
176
|
+
'thumbUrl',
|
|
177
|
+
'userAccess',
|
|
178
|
+
'userId',
|
|
179
|
+
'username'
|
|
180
|
+
]);
|
|
181
|
+
try {
|
|
182
|
+
return await publicMutation(flux, 'addUser', DATA_TYPE, queryVariables, returnProps, {
|
|
183
|
+
onSuccess
|
|
184
|
+
});
|
|
185
|
+
} finally{
|
|
186
|
+
await clearUserRequestCaches();
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
const signUp = async (userInput, userProps = [], requestOptions = {})=>{
|
|
190
|
+
const { username, email, password } = userInput;
|
|
191
|
+
const queryVariables = {
|
|
192
|
+
expires: {
|
|
193
|
+
type: 'Int',
|
|
194
|
+
value: 15
|
|
195
|
+
},
|
|
196
|
+
user: {
|
|
197
|
+
type: 'UserInput!',
|
|
198
|
+
value: {
|
|
199
|
+
email,
|
|
200
|
+
password,
|
|
201
|
+
username
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
const onSuccess = (data)=>{
|
|
206
|
+
const user = data?.users?.signUp || {};
|
|
207
|
+
return flux.dispatch({
|
|
208
|
+
type: USER_CONSTANTS.SIGN_UP_SUCCESS,
|
|
209
|
+
user
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
const returnProps = sanitizeUserProps([
|
|
213
|
+
'added',
|
|
214
|
+
'modified',
|
|
215
|
+
'userId',
|
|
216
|
+
'username',
|
|
217
|
+
...userProps
|
|
218
|
+
]);
|
|
219
|
+
try {
|
|
220
|
+
return await publicMutation(flux, 'signUp', DATA_TYPE, queryVariables, returnProps, {
|
|
221
|
+
onSuccess
|
|
222
|
+
});
|
|
223
|
+
} catch (error) {
|
|
224
|
+
flux.dispatch({
|
|
225
|
+
error,
|
|
226
|
+
type: USER_CONSTANTS.SIGN_UP_ERROR
|
|
227
|
+
});
|
|
228
|
+
throw error;
|
|
229
|
+
} finally{
|
|
230
|
+
await clearUserRequestCaches();
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
const updateUser = async (userInput, userProps = [], requestOptions = {})=>{
|
|
234
|
+
const updateInput = sanitizeUpdateUserInput(userInput, flux.getState('user.session', {}) || {});
|
|
235
|
+
const { birthdate, dob, email, firstName, gender, lastName, mailingList, password, phone, userId, username } = updateInput;
|
|
236
|
+
const queryVariables = {
|
|
237
|
+
user: {
|
|
238
|
+
type: 'UserInput!',
|
|
239
|
+
value: {
|
|
240
|
+
birthdate: birthdate ?? dob,
|
|
241
|
+
email,
|
|
242
|
+
firstName,
|
|
243
|
+
gender,
|
|
244
|
+
lastName,
|
|
245
|
+
mailingList,
|
|
246
|
+
password,
|
|
247
|
+
phone,
|
|
248
|
+
userId,
|
|
249
|
+
username
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
const onSuccess = (data = {})=>{
|
|
254
|
+
const users = data?.users;
|
|
255
|
+
const legacyUser = users?.update || {};
|
|
256
|
+
const updatedUser = users?.updateUser || {};
|
|
257
|
+
const user = hasSessionIdentity(updatedUser) ? updatedUser : legacyUser;
|
|
258
|
+
if (user?.userId && user.userId === flux.getState('user.session.userId')) {
|
|
259
|
+
syncStoredSession(flux, user);
|
|
260
|
+
}
|
|
261
|
+
return flux.dispatch({
|
|
262
|
+
type: USER_CONSTANTS.UPDATE_ITEM_SUCCESS,
|
|
263
|
+
user
|
|
264
|
+
});
|
|
265
|
+
};
|
|
266
|
+
const returnProps = sanitizeUserProps([
|
|
267
|
+
'added',
|
|
268
|
+
'birthdate',
|
|
269
|
+
'city',
|
|
270
|
+
'country',
|
|
271
|
+
'email',
|
|
272
|
+
'firstName',
|
|
273
|
+
'gender',
|
|
274
|
+
'imageCount',
|
|
275
|
+
'imageUrl',
|
|
276
|
+
'lastName',
|
|
277
|
+
'latitude',
|
|
278
|
+
'longitude',
|
|
279
|
+
'mailingList',
|
|
280
|
+
'modified',
|
|
281
|
+
'phone',
|
|
282
|
+
'state',
|
|
283
|
+
'thumbUrl',
|
|
284
|
+
'userAccess',
|
|
285
|
+
'userId',
|
|
286
|
+
'username',
|
|
287
|
+
...userProps
|
|
288
|
+
]);
|
|
289
|
+
try {
|
|
290
|
+
return await appMutation(flux, 'updateUser', DATA_TYPE, queryVariables, returnProps, {
|
|
291
|
+
onSuccess
|
|
292
|
+
});
|
|
293
|
+
} finally{
|
|
294
|
+
await clearUserRequestCaches(String(userId || ''));
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
const confirmCode = async (code, { type, value }, requestOptions = {})=>{
|
|
298
|
+
const queryVariables = {
|
|
299
|
+
code: {
|
|
300
|
+
type: 'Int!',
|
|
301
|
+
value: code
|
|
302
|
+
},
|
|
303
|
+
type: {
|
|
304
|
+
type: 'String!',
|
|
305
|
+
value: type
|
|
306
|
+
},
|
|
307
|
+
value: {
|
|
308
|
+
type: 'String!',
|
|
309
|
+
value
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
const data = await publicMutation(flux, 'confirmCode', DATA_TYPE, queryVariables, []);
|
|
313
|
+
const confirmed = !!data?.users?.confirmCode;
|
|
314
|
+
await flux.dispatch({
|
|
315
|
+
confirmed,
|
|
316
|
+
type: USER_CONSTANTS.CONFIRM_SIGN_UP_SUCCESS
|
|
317
|
+
});
|
|
318
|
+
return confirmed;
|
|
319
|
+
};
|
|
320
|
+
const remove = async (userId, requestOptions = {})=>{
|
|
321
|
+
const queryVariables = {
|
|
322
|
+
userId: {
|
|
323
|
+
type: 'ID!',
|
|
324
|
+
value: userId
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
const onSuccess = (data = {})=>{
|
|
328
|
+
const user = data?.users?.remove || {};
|
|
329
|
+
return flux.dispatch({
|
|
330
|
+
type: USER_CONSTANTS.REMOVE_ITEM_SUCCESS,
|
|
331
|
+
user
|
|
332
|
+
});
|
|
333
|
+
};
|
|
334
|
+
try {
|
|
335
|
+
return await appMutation(flux, 'remove', DATA_TYPE, queryVariables, [], {
|
|
336
|
+
onSuccess
|
|
337
|
+
});
|
|
338
|
+
} finally{
|
|
339
|
+
await clearUserRequestCaches(userId);
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
const session = async (userProps = [], requestOptions = {})=>withInvalidFieldRetry(async (sessionProps)=>{
|
|
343
|
+
const data = await appQuery(flux, 'getUserBySession', DATA_TYPE, {}, sessionProps);
|
|
344
|
+
const sessionData = data?.users?.getUserBySession || {};
|
|
345
|
+
if (!hasSessionIdentity(sessionData)) {
|
|
346
|
+
await clearPersistedSession(flux);
|
|
347
|
+
await flux.dispatch({
|
|
348
|
+
type: USER_CONSTANTS.GET_SESSION_ERROR
|
|
349
|
+
});
|
|
350
|
+
throw new Error('invalid_session');
|
|
351
|
+
}
|
|
352
|
+
const nextSession = await syncStoredSession(flux, sessionData);
|
|
353
|
+
await flux.dispatch({
|
|
354
|
+
session: nextSession,
|
|
355
|
+
type: USER_CONSTANTS.GET_SESSION_SUCCESS
|
|
356
|
+
});
|
|
357
|
+
await syncPersonaTagsToSession(flux, String(nextSession?.personaId || ''));
|
|
358
|
+
return await syncStoredSession(flux, flux.getState('user.session', nextSession) || nextSession);
|
|
359
|
+
}, userProps, DEFAULT_USER_QUERY_FIELDS);
|
|
360
|
+
const itemById = async (userId, userProps = [], requestOptions = {})=>{
|
|
361
|
+
const cachedResult = getCachedRequest(flux, `user.itemById:${userId}`, {
|
|
362
|
+
userId,
|
|
363
|
+
userProps
|
|
364
|
+
}, requestOptions);
|
|
365
|
+
if (cachedResult !== undefined) {
|
|
366
|
+
return cachedResult;
|
|
367
|
+
}
|
|
368
|
+
const queryVariables = {
|
|
369
|
+
userId: {
|
|
370
|
+
type: 'ID!',
|
|
371
|
+
value: userId
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
const onSuccess = (data = {})=>{
|
|
375
|
+
const getUserById = data?.users?.getUserById || {};
|
|
376
|
+
if (userId === flux.getState('user.session.userId')) {
|
|
377
|
+
syncStoredSession(flux, getUserById);
|
|
378
|
+
}
|
|
379
|
+
return flux.dispatch({
|
|
380
|
+
type: USER_CONSTANTS.GET_ITEM_SUCCESS,
|
|
381
|
+
user: getUserById
|
|
382
|
+
});
|
|
383
|
+
};
|
|
384
|
+
const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'getUserById', DATA_TYPE, queryVariables, safeUserProps, {
|
|
385
|
+
onSuccess
|
|
386
|
+
}), userProps, DEFAULT_USER_QUERY_FIELDS);
|
|
387
|
+
return setCachedRequest(flux, `user.itemById:${userId}`, {
|
|
388
|
+
userId,
|
|
389
|
+
userProps
|
|
390
|
+
}, result, requestOptions);
|
|
391
|
+
};
|
|
392
|
+
const saveBillingCard = async (card, userProps = [], requestOptions = {})=>{
|
|
393
|
+
const queryVariables = {
|
|
394
|
+
card: {
|
|
395
|
+
type: 'CreditCardInput!',
|
|
396
|
+
value: card
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
const onSuccess = (data = {})=>{
|
|
400
|
+
const user = data?.users?.saveBillingCard || {};
|
|
401
|
+
if (user?.userId && user.userId === flux.getState('user.session.userId')) {
|
|
402
|
+
syncStoredSession(flux, user);
|
|
403
|
+
}
|
|
404
|
+
return flux.dispatch({
|
|
405
|
+
type: USER_CONSTANTS.UPDATE_ITEM_SUCCESS,
|
|
406
|
+
user
|
|
407
|
+
});
|
|
408
|
+
};
|
|
409
|
+
const returnProps = sanitizeUserProps([
|
|
410
|
+
'modified',
|
|
411
|
+
'stripeCardBrand',
|
|
412
|
+
'stripeCardId',
|
|
413
|
+
'stripeCardLast4',
|
|
414
|
+
'userId',
|
|
415
|
+
'username',
|
|
416
|
+
...userProps
|
|
417
|
+
]);
|
|
418
|
+
const sessionUserId = String(flux.getState('user.session.userId') || '');
|
|
419
|
+
try {
|
|
420
|
+
return await appMutation(flux, 'saveBillingCard', DATA_TYPE, queryVariables, returnProps, {
|
|
421
|
+
onSuccess
|
|
422
|
+
});
|
|
423
|
+
} finally{
|
|
424
|
+
await clearUserRequestCaches(sessionUserId);
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
const deleteBillingCard = async (userProps = [], requestOptions = {})=>{
|
|
428
|
+
const onSuccess = (data = {})=>{
|
|
429
|
+
const user = data?.users?.deleteBillingCard || {};
|
|
430
|
+
if (user?.userId && user.userId === flux.getState('user.session.userId')) {
|
|
431
|
+
syncStoredSession(flux, user);
|
|
432
|
+
}
|
|
433
|
+
return flux.dispatch({
|
|
434
|
+
type: USER_CONSTANTS.UPDATE_ITEM_SUCCESS,
|
|
435
|
+
user
|
|
436
|
+
});
|
|
437
|
+
};
|
|
438
|
+
const returnProps = sanitizeUserProps([
|
|
439
|
+
'modified',
|
|
440
|
+
'stripeCardBrand',
|
|
441
|
+
'stripeCardId',
|
|
442
|
+
'stripeCardLast4',
|
|
443
|
+
'userId',
|
|
444
|
+
'username',
|
|
445
|
+
...userProps
|
|
446
|
+
]);
|
|
447
|
+
const sessionUserId = String(flux.getState('user.session.userId') || '');
|
|
448
|
+
try {
|
|
449
|
+
return await appMutation(flux, 'deleteBillingCard', DATA_TYPE, {}, returnProps, {
|
|
450
|
+
onSuccess
|
|
451
|
+
});
|
|
452
|
+
} finally{
|
|
453
|
+
await clearUserRequestCaches(sessionUserId);
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
const updatePlan = async (planId, userProps = [], requestOptions = {})=>{
|
|
457
|
+
const nextPlanId = String(planId || '').trim();
|
|
458
|
+
if (!nextPlanId) {
|
|
459
|
+
throw new Error('A subscription planId is required to update a user plan');
|
|
460
|
+
}
|
|
461
|
+
const queryVariables = {
|
|
462
|
+
planId: {
|
|
463
|
+
type: 'ID!',
|
|
464
|
+
value: nextPlanId
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
const onSuccess = (data = {})=>{
|
|
468
|
+
const user = data?.users?.updatePlan || {};
|
|
469
|
+
if (user?.userId && user.userId === flux.getState('user.session.userId')) {
|
|
470
|
+
syncStoredSession(flux, user);
|
|
471
|
+
}
|
|
472
|
+
return flux.dispatch({
|
|
473
|
+
type: USER_CONSTANTS.UPDATE_ITEM_SUCCESS,
|
|
474
|
+
user
|
|
475
|
+
});
|
|
476
|
+
};
|
|
477
|
+
const returnProps = sanitizeUserProps([
|
|
478
|
+
'modified',
|
|
479
|
+
'planExpires',
|
|
480
|
+
'planId',
|
|
481
|
+
'planStatus',
|
|
482
|
+
'planSubscriptionId',
|
|
483
|
+
'stripeCardBrand',
|
|
484
|
+
'stripeCardId',
|
|
485
|
+
'stripeCardLast4',
|
|
486
|
+
'userAccess',
|
|
487
|
+
'userId',
|
|
488
|
+
'username',
|
|
489
|
+
...userProps
|
|
490
|
+
]);
|
|
491
|
+
const sessionUserId = String(flux.getState('user.session.userId') || '');
|
|
492
|
+
try {
|
|
493
|
+
return await appMutation(flux, 'updatePlan', DATA_TYPE, queryVariables, returnProps, {
|
|
494
|
+
onSuccess
|
|
495
|
+
});
|
|
496
|
+
} finally{
|
|
497
|
+
await clearUserRequestCaches(sessionUserId);
|
|
498
|
+
}
|
|
499
|
+
};
|
|
500
|
+
const list = async (userProps = [], requestOptions = {})=>{
|
|
501
|
+
const cachedResult = getCachedRequest(flux, 'user.list', {
|
|
502
|
+
userProps
|
|
503
|
+
}, requestOptions);
|
|
504
|
+
if (cachedResult !== undefined) {
|
|
505
|
+
return cachedResult;
|
|
506
|
+
}
|
|
507
|
+
const onSuccess = (data = {})=>{
|
|
508
|
+
const list = data?.users?.getUserList || [];
|
|
509
|
+
return flux.dispatch({
|
|
510
|
+
list,
|
|
511
|
+
type: USER_CONSTANTS.GET_LIST_SUCCESS
|
|
512
|
+
});
|
|
513
|
+
};
|
|
514
|
+
const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'getUserList', DATA_TYPE, {}, safeUserProps, {
|
|
515
|
+
onSuccess
|
|
516
|
+
}), userProps, DEFAULT_USER_QUERY_FIELDS);
|
|
517
|
+
return setCachedRequest(flux, 'user.list', {
|
|
518
|
+
userProps
|
|
519
|
+
}, result, requestOptions);
|
|
520
|
+
};
|
|
521
|
+
const listByLatest = async (username = '', from = 0, to = 10, userProps = [], requestOptions = {})=>{
|
|
522
|
+
const cachedResult = getCachedRequest(flux, 'user.listByLatest', {
|
|
523
|
+
username,
|
|
524
|
+
from,
|
|
525
|
+
to,
|
|
526
|
+
userProps
|
|
527
|
+
}, requestOptions);
|
|
528
|
+
if (cachedResult !== undefined) {
|
|
529
|
+
return cachedResult;
|
|
530
|
+
}
|
|
531
|
+
const queryVariables = {
|
|
532
|
+
from: {
|
|
533
|
+
type: 'Int',
|
|
534
|
+
value: from
|
|
535
|
+
},
|
|
536
|
+
to: {
|
|
537
|
+
type: 'Int',
|
|
538
|
+
value: to
|
|
539
|
+
},
|
|
540
|
+
username: {
|
|
541
|
+
type: 'String',
|
|
542
|
+
value: username
|
|
543
|
+
}
|
|
544
|
+
};
|
|
545
|
+
const onSuccess = (data = {})=>{
|
|
546
|
+
const list = data?.users?.listByLatest || [];
|
|
547
|
+
return flux.dispatch({
|
|
548
|
+
list,
|
|
549
|
+
type: USER_CONSTANTS.GET_LIST_SUCCESS
|
|
550
|
+
});
|
|
551
|
+
};
|
|
552
|
+
const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'listByLatest', DATA_TYPE, queryVariables, safeUserProps, {
|
|
553
|
+
onSuccess
|
|
554
|
+
}), userProps, DEFAULT_USER_QUERY_FIELDS);
|
|
555
|
+
return setCachedRequest(flux, 'user.listByLatest', {
|
|
556
|
+
username,
|
|
557
|
+
from,
|
|
558
|
+
to,
|
|
559
|
+
userProps
|
|
560
|
+
}, result, requestOptions);
|
|
561
|
+
};
|
|
562
|
+
const listByConnection = async (userId, from = 0, to = 10, userProps = [], requestOptions = {})=>[];
|
|
563
|
+
const listByReactions = async (username, reactionNames, from = 0, to = 10, personaProps = [], requestOptions = {})=>[];
|
|
564
|
+
const listByTags = async (username, tagNames, from = 0, to = 10, personaProps = [], requestOptions = {})=>{
|
|
565
|
+
const cachedResult = getCachedRequest(flux, 'user.listByTags', {
|
|
566
|
+
username,
|
|
567
|
+
tagNames,
|
|
568
|
+
from,
|
|
569
|
+
to,
|
|
570
|
+
personaProps
|
|
571
|
+
}, requestOptions);
|
|
572
|
+
if (cachedResult !== undefined) {
|
|
573
|
+
return cachedResult;
|
|
574
|
+
}
|
|
575
|
+
const queryVariables = {
|
|
576
|
+
from: {
|
|
577
|
+
type: 'Int',
|
|
578
|
+
value: from
|
|
579
|
+
},
|
|
580
|
+
tags: {
|
|
581
|
+
type: '[String!]',
|
|
582
|
+
value: tagNames
|
|
583
|
+
},
|
|
584
|
+
to: {
|
|
585
|
+
type: 'Int',
|
|
586
|
+
value: to
|
|
587
|
+
},
|
|
588
|
+
username: {
|
|
589
|
+
type: 'String',
|
|
590
|
+
value: username
|
|
591
|
+
}
|
|
592
|
+
};
|
|
593
|
+
const onSuccess = (data = {})=>{
|
|
594
|
+
const list = data?.users?.listByTags || [];
|
|
595
|
+
return flux.dispatch({
|
|
596
|
+
list,
|
|
597
|
+
type: USER_CONSTANTS.GET_LIST_SUCCESS
|
|
598
|
+
});
|
|
599
|
+
};
|
|
600
|
+
const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'listByTags', DATA_TYPE, queryVariables, safeUserProps, {
|
|
601
|
+
onSuccess
|
|
602
|
+
}), personaProps, DEFAULT_USER_QUERY_FIELDS);
|
|
603
|
+
return setCachedRequest(flux, 'user.listByTags', {
|
|
604
|
+
username,
|
|
605
|
+
tagNames,
|
|
606
|
+
from,
|
|
607
|
+
to,
|
|
608
|
+
personaProps
|
|
609
|
+
}, result, requestOptions);
|
|
610
|
+
};
|
|
611
|
+
const search = async (query, userProps = [], requestOptions = {})=>{
|
|
612
|
+
const cachedResult = getCachedRequest(flux, 'user.search', {
|
|
613
|
+
query,
|
|
614
|
+
userProps
|
|
615
|
+
}, requestOptions);
|
|
616
|
+
if (cachedResult !== undefined) {
|
|
617
|
+
return cachedResult;
|
|
618
|
+
}
|
|
619
|
+
const queryVariables = {
|
|
620
|
+
query: {
|
|
621
|
+
type: 'String!',
|
|
622
|
+
value: query
|
|
623
|
+
}
|
|
624
|
+
};
|
|
625
|
+
const onSuccess = (data = {})=>{
|
|
626
|
+
const list = data?.users?.search || [];
|
|
627
|
+
return flux.dispatch({
|
|
628
|
+
list,
|
|
629
|
+
type: USER_CONSTANTS.GET_LIST_SUCCESS
|
|
630
|
+
});
|
|
631
|
+
};
|
|
632
|
+
const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'search', DATA_TYPE, queryVariables, safeUserProps, {
|
|
633
|
+
onSuccess
|
|
634
|
+
}), userProps, DEFAULT_USER_QUERY_FIELDS);
|
|
635
|
+
return setCachedRequest(flux, 'user.search', {
|
|
636
|
+
query,
|
|
637
|
+
userProps
|
|
638
|
+
}, result, requestOptions);
|
|
639
|
+
};
|
|
640
|
+
const isLoggedIn = ()=>isLoggedInWithStorage(flux);
|
|
641
|
+
const currentAuthenticatedUser = async (requestOptions = {})=>{
|
|
642
|
+
const session = await hydrateSessionFromStorage(flux);
|
|
643
|
+
return session || {};
|
|
644
|
+
};
|
|
645
|
+
const currentUser = async (requestOptions = {})=>currentAuthenticatedUser(requestOptions);
|
|
646
|
+
const refreshSessionAction = async (token, expires, requestOptions = {})=>{
|
|
647
|
+
const result = await refreshSession(flux, token, expires);
|
|
648
|
+
return result?.refreshSession || {};
|
|
649
|
+
};
|
|
650
|
+
const signIn = async (user, expires, requestOptions = {})=>{
|
|
651
|
+
const { email, phone, username, password } = user;
|
|
652
|
+
let userInput;
|
|
653
|
+
let legacyVariables;
|
|
654
|
+
if (username && password) {
|
|
655
|
+
userInput = {
|
|
656
|
+
password,
|
|
657
|
+
username
|
|
658
|
+
};
|
|
659
|
+
} else if (email && password) {
|
|
660
|
+
userInput = {
|
|
661
|
+
email,
|
|
662
|
+
password
|
|
663
|
+
};
|
|
664
|
+
} else if (phone && password) {
|
|
665
|
+
userInput = {
|
|
666
|
+
password,
|
|
667
|
+
phone
|
|
668
|
+
};
|
|
669
|
+
} else {
|
|
670
|
+
throw new Error('Username, email, or phone number and password are required to sign in');
|
|
671
|
+
}
|
|
672
|
+
const config = getConfigFromFlux(flux);
|
|
673
|
+
const requestedExpires = Math.max(1, Number(expires || config.app?.session?.maxMinutes || 15));
|
|
674
|
+
const queryVariablesWithUserInput = {
|
|
675
|
+
expires: {
|
|
676
|
+
type: 'Int',
|
|
677
|
+
value: requestedExpires
|
|
678
|
+
},
|
|
679
|
+
user: {
|
|
680
|
+
type: 'UserInput!',
|
|
681
|
+
value: userInput
|
|
682
|
+
}
|
|
683
|
+
};
|
|
684
|
+
const onSuccess = async (data = {})=>{
|
|
685
|
+
const users = data?.users;
|
|
686
|
+
const sessionData = normalizeSession(users?.signIn || {});
|
|
687
|
+
const storedSession = await syncStoredSession(flux, sessionData);
|
|
688
|
+
return {
|
|
689
|
+
session: storedSession,
|
|
690
|
+
type: USER_CONSTANTS.SIGN_IN_SUCCESS
|
|
691
|
+
};
|
|
692
|
+
};
|
|
693
|
+
const performSignIn = async (queryVariables)=>{
|
|
694
|
+
const sessionResult = await publicMutation(flux, 'signIn', DATA_TYPE, queryVariables, [
|
|
695
|
+
'expires',
|
|
696
|
+
'issued',
|
|
697
|
+
'token',
|
|
698
|
+
'userId',
|
|
699
|
+
'username'
|
|
700
|
+
], {
|
|
701
|
+
onSuccess
|
|
702
|
+
});
|
|
703
|
+
const baseSession = await syncStoredSession(flux, getSessionPayload(sessionResult));
|
|
704
|
+
try {
|
|
705
|
+
const hydratedSession = await session([
|
|
706
|
+
'userId',
|
|
707
|
+
'personaId',
|
|
708
|
+
'userAccess',
|
|
709
|
+
'username'
|
|
710
|
+
], requestOptions);
|
|
711
|
+
await syncPersonaTagsToSession(flux, String(hydratedSession?.personaId || ''));
|
|
712
|
+
} catch (error) {
|
|
713
|
+
const fallbackSession = await syncStoredSession(flux, baseSession);
|
|
714
|
+
await flux.dispatch({
|
|
715
|
+
session: fallbackSession,
|
|
716
|
+
type: USER_CONSTANTS.SIGN_IN_SUCCESS
|
|
717
|
+
});
|
|
718
|
+
return fallbackSession;
|
|
719
|
+
}
|
|
720
|
+
const finalSession = await syncStoredSession(flux, flux.getState('user.session', baseSession) || baseSession);
|
|
721
|
+
await flux.dispatch({
|
|
722
|
+
session: finalSession,
|
|
723
|
+
type: USER_CONSTANTS.SIGN_IN_SUCCESS
|
|
724
|
+
});
|
|
725
|
+
return finalSession;
|
|
726
|
+
};
|
|
727
|
+
try {
|
|
728
|
+
return await performSignIn(queryVariablesWithUserInput);
|
|
729
|
+
} catch (error) {
|
|
730
|
+
flux.dispatch({
|
|
731
|
+
error,
|
|
732
|
+
type: USER_CONSTANTS.SIGN_IN_ERROR
|
|
733
|
+
});
|
|
734
|
+
throw error;
|
|
735
|
+
} finally{
|
|
736
|
+
await clearUserRequestCaches(String(user?.userId || ''));
|
|
737
|
+
}
|
|
738
|
+
};
|
|
739
|
+
const signOut = async (requestOptions = {})=>{
|
|
740
|
+
await clearPersistedSession(flux);
|
|
741
|
+
await flux.dispatch({
|
|
742
|
+
session: {},
|
|
743
|
+
type: USER_CONSTANTS.SIGN_OUT_SUCCESS
|
|
744
|
+
});
|
|
745
|
+
await clearUserRequestCaches();
|
|
746
|
+
return true;
|
|
747
|
+
};
|
|
748
|
+
const confirmSignUp = async (code, type, requestOptions = {})=>true;
|
|
749
|
+
const forgotPassword = async (username, requestOptions = {})=>{
|
|
750
|
+
const queryVariables = {
|
|
751
|
+
user: {
|
|
752
|
+
type: 'UserInput!',
|
|
753
|
+
value: {
|
|
754
|
+
email: username,
|
|
755
|
+
phone: username,
|
|
756
|
+
username
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
};
|
|
760
|
+
const onSuccess = (data)=>{
|
|
761
|
+
const success = !!data?.users?.forgotPassword;
|
|
762
|
+
return flux.dispatch({
|
|
763
|
+
type: success ? USER_CONSTANTS.FORGOT_PASSWORD_SUCCESS : USER_CONSTANTS.FORGOT_PASSWORD_ERROR
|
|
764
|
+
});
|
|
765
|
+
};
|
|
766
|
+
return publicMutation(flux, 'forgotPassword', DATA_TYPE, queryVariables, [], {
|
|
767
|
+
onSuccess
|
|
768
|
+
}).then((data)=>{
|
|
769
|
+
const success = !!data?.users?.forgotPassword;
|
|
770
|
+
if (!success) {
|
|
771
|
+
throw new Error('forgot_password_failed');
|
|
772
|
+
}
|
|
773
|
+
return true;
|
|
774
|
+
});
|
|
775
|
+
};
|
|
776
|
+
const sendVerificationEmail = async (email, requestOptions = {})=>{
|
|
777
|
+
const queryVariables = {
|
|
778
|
+
user: {
|
|
779
|
+
type: 'UserInput!',
|
|
780
|
+
value: {
|
|
781
|
+
email
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
};
|
|
785
|
+
const onSuccess = (data)=>{
|
|
786
|
+
const success = !!data?.users?.sendVerificationEmail;
|
|
787
|
+
return flux.dispatch({
|
|
788
|
+
type: success ? USER_CONSTANTS.CONFIRM_SIGN_UP_SUCCESS : USER_CONSTANTS.CONFIRM_SIGN_UP_ERROR
|
|
789
|
+
});
|
|
790
|
+
};
|
|
791
|
+
return publicMutation(flux, 'sendVerificationEmail', DATA_TYPE, queryVariables, [], {
|
|
792
|
+
onSuccess
|
|
793
|
+
}).then((data)=>{
|
|
794
|
+
const success = !!data?.users?.sendVerificationEmail;
|
|
795
|
+
if (!success) {
|
|
796
|
+
throw new Error('send_verification_email_failed');
|
|
797
|
+
}
|
|
798
|
+
return true;
|
|
799
|
+
});
|
|
800
|
+
};
|
|
801
|
+
const resetPassword = async (username, password, code, type, requestOptions = {})=>{
|
|
802
|
+
const queryVariables = {
|
|
803
|
+
code: {
|
|
804
|
+
type: 'String!',
|
|
805
|
+
value: code
|
|
806
|
+
},
|
|
807
|
+
user: {
|
|
808
|
+
type: 'UserInput!',
|
|
809
|
+
value: {
|
|
810
|
+
...type === 'email' ? {
|
|
811
|
+
email: username
|
|
812
|
+
} : {
|
|
813
|
+
phone: username
|
|
814
|
+
},
|
|
815
|
+
password,
|
|
816
|
+
username
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
};
|
|
820
|
+
const onSuccess = (data)=>{
|
|
821
|
+
const success = !!data?.users?.resetPassword;
|
|
822
|
+
return flux.dispatch({
|
|
823
|
+
type: success ? USER_CONSTANTS.RESET_PASSWORD_SUCCESS : USER_CONSTANTS.RESET_PASSWORD_ERROR
|
|
824
|
+
});
|
|
825
|
+
};
|
|
826
|
+
return publicMutation(flux, 'resetPassword', DATA_TYPE, queryVariables, [], {
|
|
827
|
+
onSuccess
|
|
828
|
+
}).then((data)=>{
|
|
829
|
+
const success = !!data?.users?.resetPassword;
|
|
830
|
+
if (!success) {
|
|
831
|
+
throw new Error('reset_password_failed');
|
|
832
|
+
}
|
|
833
|
+
return true;
|
|
834
|
+
});
|
|
835
|
+
};
|
|
836
|
+
const updatePassword = async (password, newPassword, requestOptions = {})=>true;
|
|
837
|
+
return {
|
|
838
|
+
addUser,
|
|
839
|
+
confirmCode,
|
|
840
|
+
confirmSignUp,
|
|
841
|
+
currentAuthenticatedUser,
|
|
842
|
+
currentUser,
|
|
843
|
+
deleteBillingCard,
|
|
844
|
+
list,
|
|
845
|
+
forgotPassword,
|
|
846
|
+
isLoggedIn,
|
|
847
|
+
itemById,
|
|
848
|
+
listByConnection,
|
|
849
|
+
listByLatest,
|
|
850
|
+
listByReactions,
|
|
851
|
+
listByTags,
|
|
852
|
+
refreshSession: refreshSessionAction,
|
|
853
|
+
remove,
|
|
854
|
+
resetPassword,
|
|
855
|
+
saveBillingCard,
|
|
856
|
+
search,
|
|
857
|
+
sendVerificationEmail,
|
|
858
|
+
session,
|
|
859
|
+
signIn,
|
|
860
|
+
signOut,
|
|
861
|
+
signUp,
|
|
862
|
+
updatePassword,
|
|
863
|
+
updateUser,
|
|
864
|
+
updatePlan,
|
|
865
|
+
updateUserAdapter: userBase.updateAdapter,
|
|
866
|
+
updateUserAdapterOptions: userBase.updateOptions
|
|
867
|
+
};
|
|
868
|
+
};
|
|
869
|
+
|
|
870
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy91c2VyQWN0aW9ucy91c2VyQWN0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt2YWxpZGF0ZVVzZXJJbnB1dH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHtVU0VSX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vc3RvcmVzL3VzZXJTdG9yZS5qcyc7XG5pbXBvcnQge2FwcE11dGF0aW9uLCBhcHBRdWVyeSwgcHVibGljTXV0YXRpb24sIHJlZnJlc2hTZXNzaW9ufSBmcm9tICcuLi8uLi91dGlscy9hcGkuanMnO1xuaW1wb3J0IHtjcmVhdGVCYXNlQWN0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvYmFzZUFjdGlvbkZhY3RvcnkuanMnO1xuaW1wb3J0IHtcbiAgY2xlYXJQZXJzaXN0ZWRTZXNzaW9uLFxuICBoeWRyYXRlU2Vzc2lvbkZyb21TdG9yYWdlLFxuICBpc0xvZ2dlZEluIGFzIGlzTG9nZ2VkSW5XaXRoU3RvcmFnZSxcbiAgbm9ybWFsaXplU2Vzc2lvbixcbiAgc3RvcmVTZXNzaW9uXG59IGZyb20gJy4uLy4uL3V0aWxzL3Nlc3Npb24uanMnO1xuaW1wb3J0IHtnZXRDb25maWdGcm9tRmx1eH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uZmlnVXRpbHMuanMnO1xuaW1wb3J0IHtjbGVhckNhY2hlZFJlcXVlc3QsIGdldENhY2hlZFJlcXVlc3QsIHNldENhY2hlZFJlcXVlc3R9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5pbXBvcnQge3N5bmNQZXJzb25hVGFnc1RvU2Vzc2lvbn0gZnJvbSAnLi4vcGVyc29uYUFjdGlvbnMvcGVyc29uYUFjdGlvbnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7Rmx1eEFjdGlvbiwgRmx1eEZyYW1ld29ya30gZnJvbSAnQG5sYWJzL2Fya2hhbWpzJztcbmltcG9ydCB0eXBlIHtVc2VyfSBmcm9tICcuLi8uLi9hZGFwdGVycy91c2VyQWRhcHRlci91c2VyQWRhcHRlci5qcyc7XG5pbXBvcnQgdHlwZSB7QXBpUmVzdWx0c1R5cGUsIFNlc3Npb25UeXBlfSBmcm9tICcuLi8uLi91dGlscy9hcGkuanMnO1xuaW1wb3J0IHR5cGUge0Jhc2VBZGFwdGVyT3B0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdG9yRmFjdG9yeS5qcyc7XG5pbXBvcnQgdHlwZSB7QWN0aW9uUmVxdWVzdE9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5cbmNvbnN0IERBVEFfVFlQRSA9ICd1c2Vycyc7XG5jb25zdCBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTID0gWyd1c2VySWQnLCAndXNlcm5hbWUnXTtcbmNvbnN0IFNFTlNJVElWRV9VU0VSX0ZJRUxEUyA9IG5ldyBTZXQoW1xuICAncGFzc3dvcmQnLFxuICAnc2FsdCcsXG4gICd0b2tlbicsXG4gICdyZWZyZXNoVG9rZW4nLFxuICAndmVyaWZpZWRFbWFpbENvZGUnLFxuICAndmVyaWZpZWRTbXNDb2RlJ1xuXSk7XG5jb25zdCBJTlZBTElEX0ZJRUxEX1JFR0VYID0gL0Nhbm5vdCBxdWVyeSBmaWVsZCBcIihbXlwiXSspXCIvZztcbmNvbnN0IGhhc1Nlc3Npb25JZGVudGl0eSA9ICh1c2VyPzogUGFydGlhbDxVc2VyPiB8IG51bGwpOiBib29sZWFuID0+XG4gICEhKHVzZXIgJiYgKCh1c2VyIGFzIGFueSkuX2lkIHx8ICh1c2VyIGFzIGFueSkudXNlcklkIHx8ICh1c2VyIGFzIGFueSkudXNlcm5hbWUgfHwgKHVzZXIgYXMgYW55KS5lbWFpbCkpO1xuXG5jb25zdCBzYW5pdGl6ZVVwZGF0ZVVzZXJJbnB1dCA9ICh1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4gPSB7fSwgY3VycmVudFNlc3Npb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBQYXJ0aWFsPFVzZXI+ID0+IHtcbiAgY29uc3QgbmV4dFVzZXIgPSBPYmplY3QuZW50cmllcyh1c2VySW5wdXQpLnJlZHVjZSgodXNlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFtmaWVsZCwgdmFsdWVdKSA9PiB7XG4gICAgaWYodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYoZmllbGQgPT09ICdwYXNzd29yZCcpIHtcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gU3RyaW5nKHZhbHVlIHx8ICcnKS50cmltKCk7XG5cbiAgICAgIGlmKHBhc3N3b3JkKSB7XG4gICAgICAgIHVzZXIucGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgaWYoZmllbGQgPT09ICd1c2VySWQnKSB7XG4gICAgICB1c2VyLnVzZXJJZCA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHVzZXI7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY3VycmVudFNlc3Npb25bZmllbGRdO1xuXG4gICAgaWYoU3RyaW5nKHZhbHVlKSAhPT0gU3RyaW5nKGN1cnJlbnRWYWx1ZSA/PyAnJykpIHtcbiAgICAgIHVzZXJbZmllbGRdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVzZXI7XG4gIH0sIHt9KTtcblxuICByZXR1cm4gbmV4dFVzZXIgYXMgUGFydGlhbDxVc2VyPjtcbn07XG5cbmNvbnN0IHN5bmNTdG9yZWRTZXNzaW9uID0gYXN5bmMgKGZsdXg6IEZsdXhGcmFtZXdvcmssIHNlc3Npb25QYXRjaDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgY29uc3QgY3VycmVudFNlc3Npb24gPSAoZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJywge30pIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIHN0b3JlU2Vzc2lvbihmbHV4LCB7Li4uY3VycmVudFNlc3Npb24sIC4uLnNlc3Npb25QYXRjaH0pO1xufTtcblxuY29uc3QgZ2V0U2Vzc2lvblBheWxvYWQgPSAocGF5bG9hZDogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgaWYocGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcgJiYgJ3Nlc3Npb24nIGluIChwYXlsb2FkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgIHJldHVybiAoKChwYXlsb2FkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5zZXNzaW9uKSB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICByZXR1cm4gKHBheWxvYWQgJiYgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnID8gcGF5bG9hZCA6IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG5cbmNvbnN0IGdldEZpZWxkUm9vdCA9IChmaWVsZDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdHJpbW1lZCA9IGZpZWxkLnRyaW0oKTtcbiAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKC9eW0EtWmEtel9dW0EtWmEtejAtOV9dKi8pO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFswXSA6ICcnO1xufTtcblxuY29uc3Qgc2FuaXRpemVVc2VyUHJvcHMgPSAocHJvcHM6IHN0cmluZ1tdID0gW10sIGZhbGxiYWNrUHJvcHM6IHN0cmluZ1tdID0gREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEUyk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBzYW5pdGl6ZWQgPSBwcm9wcy5yZWR1Y2UoKGxpc3Q6IHN0cmluZ1tdLCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgcm9vdCA9IGdldEZpZWxkUm9vdChmaWVsZCk7XG5cbiAgICBpZighcm9vdCB8fCBTRU5TSVRJVkVfVVNFUl9GSUVMRFMuaGFzKHJvb3QpIHx8IHNlZW4uaGFzKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgc2Vlbi5hZGQoZmllbGQpO1xuICAgIGxpc3QucHVzaChmaWVsZCk7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sIFtdKTtcblxuICBpZihzYW5pdGl6ZWQubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICByZXR1cm4gZmFsbGJhY2tQcm9wcy5yZWR1Y2UoKGxpc3Q6IHN0cmluZ1tdLCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgcm9vdCA9IGdldEZpZWxkUm9vdChmaWVsZCk7XG5cbiAgICBpZighcm9vdCB8fCBTRU5TSVRJVkVfVVNFUl9GSUVMRFMuaGFzKHJvb3QpIHx8IHNlZW4uaGFzKGZpZWxkKSkge1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgc2Vlbi5hZGQoZmllbGQpO1xuICAgIGxpc3QucHVzaChmaWVsZCk7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sIFtdKTtcbn07XG5cbmNvbnN0IGdldEludmFsaWRGaWVsZHMgPSAoZXJyb3I6IHVua25vd24pOiBTZXQ8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IGVycm9ycyA9IChlcnJvciBhcyBhbnkpPy5lcnJvcnMgfHwgKGVycm9yIGFzIGFueSk/LnNvdXJjZT8uZXJyb3JzIHx8IFtdO1xuICBjb25zdCBpbnZhbGlkRmllbGRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZXJyb3JzLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgPyBpdGVtIDogaXRlbT8ubWVzc2FnZSB8fCAnJztcbiAgICBsZXQgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSBJTlZBTElEX0ZJRUxEX1JFR0VYLmV4ZWMobWVzc2FnZSk7XG5cbiAgICB3aGlsZShtYXRjaCkge1xuICAgICAgaW52YWxpZEZpZWxkcy5hZGQobWF0Y2hbMV0pO1xuICAgICAgbWF0Y2ggPSBJTlZBTElEX0ZJRUxEX1JFR0VYLmV4ZWMobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgSU5WQUxJRF9GSUVMRF9SRUdFWC5sYXN0SW5kZXggPSAwO1xuICB9KTtcblxuICByZXR1cm4gaW52YWxpZEZpZWxkcztcbn07XG5cbmNvbnN0IHdpdGhJbnZhbGlkRmllbGRSZXRyeSA9IGFzeW5jIDxUPihcbiAgcmVxdWVzdFdpdGhQcm9wczogKHByb3BzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxUPixcbiAgcHJvcHM6IHN0cmluZ1tdLFxuICBmYWxsYmFja1Byb3BzOiBzdHJpbmdbXSA9IERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbik6IFByb21pc2U8VD4gPT4ge1xuICBjb25zdCBzYWZlUHJvcHMgPSBzYW5pdGl6ZVVzZXJQcm9wcyhwcm9wcywgZmFsbGJhY2tQcm9wcyk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdFdpdGhQcm9wcyhzYWZlUHJvcHMpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgY29uc3QgaW52YWxpZEZpZWxkcyA9IGdldEludmFsaWRGaWVsZHMoZXJyb3IpO1xuXG4gICAgaWYoaW52YWxpZEZpZWxkcy5zaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBjb25zdCByZXRyeVByb3BzID0gc2FmZVByb3BzLmZpbHRlcigoZmllbGQpID0+ICFpbnZhbGlkRmllbGRzLmhhcyhnZXRGaWVsZFJvb3QoZmllbGQpKSk7XG5cbiAgICBpZihyZXRyeVByb3BzLmxlbmd0aCA9PT0gMCB8fCByZXRyeVByb3BzLmxlbmd0aCA9PT0gc2FmZVByb3BzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3RXaXRoUHJvcHMocmV0cnlQcm9wcyk7XG4gIH1cbn07XG5cbmV4cG9ydCB0eXBlIFVzZXJBZGFwdGVyT3B0aW9ucyA9IEJhc2VBZGFwdGVyT3B0aW9ucztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQWN0aW9uc09wdGlvbnMge1xuICByZWFkb25seSB1c2VyQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gYW55O1xuICByZWFkb25seSB1c2VyQWRhcHRlck9wdGlvbnM/OiBVc2VyQWRhcHRlck9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFwaVJlc3VsdHNUeXBlIHtcbiAgcmVhZG9ubHkgdXNlcnM6IHtcbiAgICByZWFkb25seSBhY3RpdmVDb3VudD86IG51bWJlcjtcbiAgICByZWFkb25seSBhZGRVc2VyPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBjb25maXJtQ29kZT86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgZGVhY3RpdmF0ZT86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgZm9yZ290UGFzc3dvcmQ/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGl0ZW1CeUlkPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBnZXRVc2VyQnlTZXNzaW9uPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBpdGVtQnlTZXNzaW9uPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBpdGVtQnlUb2tlbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5VXNlcm5hbWU/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGdldFVzZXJMaXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3Q/OiBVc2VyW107XG4gICAgcmVhZG9ubHkgbGlzdEJ5Q29ubmVjdGlvbj86IFVzZXJbXTtcbiAgICByZWFkb25seSBsaXN0QnlMYXRlc3Q/OiBVc2VyW107XG4gICAgcmVhZG9ubHkgbGlzdEJ5UmVhY3Rpb25zPzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeVRhZ3M/OiBVc2VyW107XG4gICAgcmVhZG9ubHkgc2VhcmNoPzogVXNlcltdO1xuICAgIHJlYWRvbmx5IHJlZnJlc2hTZXNzaW9uPzogU2Vzc2lvblR5cGU7XG4gICAgcmVhZG9ubHkgcmVtb3ZlPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSByZXNldFBhc3N3b3JkPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBzYXZlQmlsbGluZ0NhcmQ/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHNlbmRWZXJpZmljYXRpb25FbWFpbD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgc2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgc2lnbkluPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBzaWduVXA/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGRlbGV0ZUJpbGxpbmdDYXJkPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSB1cGRhdGU/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHVwZGF0ZVVzZXI/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHVwZGF0ZVBhc3N3b3JkPzogUGFydGlhbDxib29sZWFuPjtcbiAgICByZWFkb25seSB1cGRhdGVQbGFuPzogUGFydGlhbDxVc2VyPjtcbiAgfTtcbn1cblxuY29uc3QgZGVmYXVsdFVzZXJWYWxpZGF0b3IgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBVc2VyQWRhcHRlck9wdGlvbnMpID0+IHtcbiAgY29uc3QgdmFsaWRhdGVkID0gdmFsaWRhdGVVc2VySW5wdXQoaW5wdXQpO1xuXG4gIGlmKG9wdGlvbnM/LnN0cmljdCAmJiAhdmFsaWRhdGVkLnVzZXJuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVc2VybmFtZSBpcyByZXF1aXJlZCBpbiBzdHJpY3QgbW9kZScpO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgdXNlckFjdGlvbnMge1xuICBhZGRVc2VyOiAodXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgY29uZmlybUNvZGU6IChjb2RlOiBudW1iZXIsIHt0eXBlLCB2YWx1ZX06IHt0eXBlOiAnZW1haWwnIHwgJ3Bob25lJzsgdmFsdWU6IHN0cmluZ30sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGNvbmZpcm1TaWduVXA6IChjb2RlOiBzdHJpbmcsIHR5cGU6ICdlbWFpbCcgfCAncGhvbmUnLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBjdXJyZW50QXV0aGVudGljYXRlZFVzZXI6IChyZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICBjdXJyZW50VXNlcjogKHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIGxpc3Q6ICh1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBsaXN0QnlDb25uZWN0aW9uOiAodXNlcklkOiBzdHJpbmcsIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBpdGVtQnlJZDogKHVzZXJJZDogc3RyaW5nLCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgZGVsZXRlQmlsbGluZ0NhcmQ6ICh1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgbGlzdEJ5TGF0ZXN0OiAodXNlcm5hbWU/OiBzdHJpbmcsIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBsaXN0QnlSZWFjdGlvbnM6IChcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHJlYWN0aW9uTmFtZXM6IHN0cmluZ1tdLFxuICAgIGZyb20/OiBudW1iZXIsXG4gICAgdG8/OiBudW1iZXIsXG4gICAgcGVyc29uYVByb3BzPzogc3RyaW5nW10sXG4gICAgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9uc1xuICApID0+IFByb21pc2U8VXNlcltdPjtcbiAgbGlzdEJ5VGFnczogKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgdGFnTmFtZXM6IHN0cmluZ1tdLFxuICAgIGZyb20/OiBudW1iZXIsXG4gICAgdG8/OiBudW1iZXIsXG4gICAgcGVyc29uYVByb3BzPzogc3RyaW5nW10sXG4gICAgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9uc1xuICApID0+IFByb21pc2U8VXNlcltdPjtcbiAgZm9yZ290UGFzc3dvcmQ6ICh1c2VybmFtZTogc3RyaW5nLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBpc0xvZ2dlZEluOiAoKSA9PiBib29sZWFuO1xuICByZWZyZXNoU2Vzc2lvbjogKHRva2VuPzogc3RyaW5nLCBleHBpcmVzPzogbnVtYmVyLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFNlc3Npb25UeXBlPjtcbiAgcmVtb3ZlOiAodXNlcklkOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIHJlc2V0UGFzc3dvcmQ6ICh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIHR5cGU6ICdlbWFpbCcgfCAncGhvbmUnLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBzZWFyY2g6IChxdWVyeTogc3RyaW5nLCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBzZW5kVmVyaWZpY2F0aW9uRW1haWw6IChlbWFpbDogc3RyaW5nLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBzZXNzaW9uOiAodXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIHNhdmVCaWxsaW5nQ2FyZDogKGNhcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgc2lnbkluOiAodXNlcjogUGFydGlhbDxVc2VyPiwgZXhwaXJlcz86IG51bWJlciwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxTZXNzaW9uVHlwZT47XG4gIHNpZ25PdXQ6IChyZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBzaWduVXA6ICh1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICB1cGRhdGVQYXNzd29yZDogKHBhc3N3b3JkOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHVwZGF0ZVVzZXI6ICh1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICB1cGRhdGVQbGFuOiAocGxhbklkOiBzdHJpbmcsIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICB1cGRhdGVVc2VyQWRhcHRlcjogKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICB1cGRhdGVVc2VyQWRhcHRlck9wdGlvbnM6IChvcHRpb25zOiBVc2VyQWRhcHRlck9wdGlvbnMpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVVc2VyQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9ucz86IFVzZXJBY3Rpb25zT3B0aW9uc1xuKTogdXNlckFjdGlvbnMgPT4ge1xuICBjb25zdCB1c2VyQmFzZSA9IGNyZWF0ZUJhc2VBY3Rpb25zKGZsdXgsIGRlZmF1bHRVc2VyVmFsaWRhdG9yLCB7XG4gICAgYWRhcHRlcjogb3B0aW9ucz8udXNlckFkYXB0ZXIsXG4gICAgYWRhcHRlck9wdGlvbnM6IG9wdGlvbnM/LnVzZXJBZGFwdGVyT3B0aW9uc1xuICB9KTtcbiAgY29uc3QgY2xlYXJVc2VyUmVxdWVzdENhY2hlcyA9IGFzeW5jICh1c2VySWQgPSAnJyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndXNlci5saXN0Jyk7XG4gICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd1c2VyLmxpc3RCeUxhdGVzdCcpO1xuICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndXNlci5saXN0QnlUYWdzJyk7XG4gICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd1c2VyLnNlYXJjaCcpO1xuICAgIGlmKHVzZXJJZCkge1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsIGB1c2VyLml0ZW1CeUlkOiR7dXNlcklkfWApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBhZGRVc2VyID0gYXN5bmMgKFxuICAgIHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPixcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3Qge3VzZXJuYW1lLCBlbWFpbCwgcGFzc3dvcmR9ID0gdXNlcklucHV0O1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogVXNlckFwaVJlc3VsdHNUeXBlKTogUHJvbWlzZTxGbHV4QWN0aW9uPiA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gZGF0YT8udXNlcnM/LmFkZFVzZXIgfHwge307XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkFERF9JVEVNX1NVQ0NFU1MsXG4gICAgICAgIHVzZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXR1cm5Qcm9wcyA9IHNhbml0aXplVXNlclByb3BzKHVzZXJQcm9wcywgW1xuICAgICAgJ2FkZGVkJyxcbiAgICAgICdhZGRyZXNzJyxcbiAgICAgICdkb2InLFxuICAgICAgJ2NpdHknLFxuICAgICAgJ2NvdW50cnknLFxuICAgICAgJ2dlbmRlcicsXG4gICAgICAnaW1hZ2VVcmwnLFxuICAgICAgJ2xhdGl0dWRlJyxcbiAgICAgICdsb25naXR1ZGUnLFxuICAgICAgJ21haWxpbmdMaXN0JyxcbiAgICAgICdtb2RpZmllZCcsXG4gICAgICAnc3RhdGUnLFxuICAgICAgJ3RodW1iVXJsJyxcbiAgICAgICd1c2VyQWNjZXNzJyxcbiAgICAgICd1c2VySWQnLFxuICAgICAgJ3VzZXJuYW1lJ1xuICAgIF0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnYWRkVXNlcicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIHJldHVyblByb3BzLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJVc2VyUmVxdWVzdENhY2hlcygpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzaWduVXAgPSBhc3luYyAoXG4gICAgdXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCB7dXNlcm5hbWUsIGVtYWlsLCBwYXNzd29yZH0gPSB1c2VySW5wdXQ7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBleHBpcmVzOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogMTVcbiAgICAgIH0sXG4gICAgICB1c2VyOiB7XG4gICAgICAgIHR5cGU6ICdVc2VySW5wdXQhJyxcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICB1c2VybmFtZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBVc2VyQXBpUmVzdWx0c1R5cGUpOiBQcm9taXNlPEZsdXhBY3Rpb24+ID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSBkYXRhPy51c2Vycz8uc2lnblVwIHx8IHt9O1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX1VQX1NVQ0NFU1MsXG4gICAgICAgIHVzZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXR1cm5Qcm9wcyA9IHNhbml0aXplVXNlclByb3BzKFtcbiAgICAgICdhZGRlZCcsXG4gICAgICAnbW9kaWZpZWQnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHB1YmxpY011dGF0aW9uPFVzZXJBcGlSZXN1bHRzVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdzaWduVXAnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICByZXR1cm5Qcm9wcyxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fVVBfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZVVzZXIgPSBhc3luYyAoXG4gICAgdXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCB1cGRhdGVJbnB1dCA9IHNhbml0aXplVXBkYXRlVXNlcklucHV0KHVzZXJJbnB1dCwgKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbicsIHt9KSB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGNvbnN0IHtcbiAgICAgIGJpcnRoZGF0ZSxcbiAgICAgIGRvYixcbiAgICAgIGVtYWlsLFxuICAgICAgZmlyc3ROYW1lLFxuICAgICAgZ2VuZGVyLFxuICAgICAgbGFzdE5hbWUsXG4gICAgICBtYWlsaW5nTGlzdCxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgcGhvbmUsXG4gICAgICB1c2VySWQsXG4gICAgICB1c2VybmFtZVxuICAgIH0gPSB1cGRhdGVJbnB1dDtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGJpcnRoZGF0ZTogYmlydGhkYXRlID8/IGRvYixcbiAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICBmaXJzdE5hbWUsXG4gICAgICAgICAgZ2VuZGVyLFxuICAgICAgICAgIGxhc3ROYW1lLFxuICAgICAgICAgIG1haWxpbmdMaXN0LFxuICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgIHBob25lLFxuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICB1c2VybmFtZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB1c2VycyA9IChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM7XG4gICAgICBjb25zdCBsZWdhY3lVc2VyID0gdXNlcnM/LnVwZGF0ZSB8fCB7fTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRVc2VyID0gdXNlcnM/LnVwZGF0ZVVzZXIgfHwge307XG4gICAgICBjb25zdCB1c2VyID0gaGFzU2Vzc2lvbklkZW50aXR5KHVwZGF0ZWRVc2VyKSA/IHVwZGF0ZWRVc2VyIDogbGVnYWN5VXNlcjtcblxuICAgICAgaWYoKHVzZXIgYXMgYW55KT8udXNlcklkICYmICh1c2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXNlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ2FkZGVkJyxcbiAgICAgICdiaXJ0aGRhdGUnLFxuICAgICAgJ2NpdHknLFxuICAgICAgJ2NvdW50cnknLFxuICAgICAgJ2VtYWlsJyxcbiAgICAgICdmaXJzdE5hbWUnLFxuICAgICAgJ2dlbmRlcicsXG4gICAgICAnaW1hZ2VDb3VudCcsXG4gICAgICAnaW1hZ2VVcmwnLFxuICAgICAgJ2xhc3ROYW1lJyxcbiAgICAgICdsYXRpdHVkZScsXG4gICAgICAnbG9uZ2l0dWRlJyxcbiAgICAgICdtYWlsaW5nTGlzdCcsXG4gICAgICAnbW9kaWZpZWQnLFxuICAgICAgJ3Bob25lJyxcbiAgICAgICdzdGF0ZScsXG4gICAgICAndGh1bWJVcmwnLFxuICAgICAgJ3VzZXJBY2Nlc3MnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uKFxuICAgICAgICBmbHV4LFxuICAgICAgICAndXBkYXRlVXNlcicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIHJldHVyblByb3BzLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJVc2VyUmVxdWVzdENhY2hlcyhTdHJpbmcodXNlcklkIHx8ICcnKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNvbmZpcm1Db2RlID0gYXN5bmMgKFxuICAgIGNvZGU6IG51bWJlcixcbiAgICB7dHlwZSwgdmFsdWV9OiB7dHlwZTogJ2VtYWlsJyB8ICdwaG9uZSc7IHZhbHVlOiBzdHJpbmd9LFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgY29kZToge1xuICAgICAgICB0eXBlOiAnSW50IScsXG4gICAgICAgIHZhbHVlOiBjb2RlXG4gICAgICB9LFxuICAgICAgdHlwZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgIHZhbHVlOiB0eXBlXG4gICAgICB9LFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcHVibGljTXV0YXRpb248VXNlckFwaVJlc3VsdHNUeXBlPihmbHV4LCAnY29uZmlybUNvZGUnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBbXSk7XG4gICAgY29uc3QgY29uZmlybWVkID0gISFkYXRhPy51c2Vycz8uY29uZmlybUNvZGU7XG5cbiAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtjb25maXJtZWQsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkNPTkZJUk1fU0lHTl9VUF9TVUNDRVNTfSk7XG5cbiAgICByZXR1cm4gY29uZmlybWVkO1xuICB9O1xuXG4gIGNvbnN0IHJlbW92ZSA9IGFzeW5jICh1c2VySWQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXJJZDoge1xuICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgdmFsdWU6IHVzZXJJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM/LnJlbW92ZSB8fCB7fTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHt0eXBlOiBVU0VSX0NPTlNUQU5UUy5SRU1PVkVfSVRFTV9TVUNDRVNTLCB1c2VyfSk7XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYXBwTXV0YXRpb24oZmx1eCwgJ3JlbW92ZScsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFtdLCB7b25TdWNjZXNzfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXModXNlcklkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2Vzc2lvbiA9IGFzeW5jICh1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxVc2VyPiA9PiB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgYXN5bmMgKHNlc3Npb25Qcm9wcykgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwcFF1ZXJ5KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnZ2V0VXNlckJ5U2Vzc2lvbicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAge30sXG4gICAgICAgIHNlc3Npb25Qcm9wc1xuICAgICAgKSBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgdXNlcnM/OiB7Z2V0VXNlckJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj59O1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gZGF0YT8udXNlcnM/LmdldFVzZXJCeVNlc3Npb24gfHwge307XG5cbiAgICAgIGlmKCFoYXNTZXNzaW9uSWRlbnRpdHkoc2Vzc2lvbkRhdGEpKSB7XG4gICAgICAgIGF3YWl0IGNsZWFyUGVyc2lzdGVkU2Vzc2lvbihmbHV4KTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX1NFU1NJT05fRVJST1J9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkX3Nlc3Npb24nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dFNlc3Npb24gPSBhd2FpdCBzeW5jU3RvcmVkU2Vzc2lvbihmbHV4LCBzZXNzaW9uRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtzZXNzaW9uOiBuZXh0U2Vzc2lvbiwgdHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX1NFU1NJT05fU1VDQ0VTU30pO1xuICAgICAgYXdhaXQgc3luY1BlcnNvbmFUYWdzVG9TZXNzaW9uKGZsdXgsIFN0cmluZygobmV4dFNlc3Npb24gYXMgYW55KT8ucGVyc29uYUlkIHx8ICcnKSk7XG4gICAgICByZXR1cm4gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbicsIG5leHRTZXNzaW9uKSB8fCBuZXh0U2Vzc2lvbikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIGFzIFVzZXI7XG4gICAgfSxcbiAgICB1c2VyUHJvcHMsXG4gICAgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEU1xuICApO1xuXG4gIGNvbnN0IGl0ZW1CeUlkID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyPihmbHV4LCBgdXNlci5pdGVtQnlJZDoke3VzZXJJZH1gLCB7dXNlcklkLCB1c2VyUHJvcHN9LCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICBpZihjYWNoZWRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXJJZDoge1xuICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgdmFsdWU6IHVzZXJJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgZ2V0VXNlckJ5SWQgPSAoKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUgJiB7XG4gICAgICAgIHVzZXJzPzoge2dldFVzZXJCeUlkPzogUGFydGlhbDxVc2VyPn07XG4gICAgICB9KT8udXNlcnM/LmdldFVzZXJCeUlkKSB8fCB7fTtcblxuICAgICAgaWYodXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgZ2V0VXNlckJ5SWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0lURU1fU1VDQ0VTUywgdXNlcjogZ2V0VXNlckJ5SWR9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgICAgKHNhZmVVc2VyUHJvcHMpID0+IGFwcFF1ZXJ5KGZsdXgsICdnZXRVc2VyQnlJZCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHVzZXJQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcj4oZmx1eCwgYHVzZXIuaXRlbUJ5SWQ6JHt1c2VySWR9YCwge3VzZXJJZCwgdXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXIsIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBzYXZlQmlsbGluZ0NhcmQgPSBhc3luYyAoXG4gICAgY2FyZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgY2FyZDoge1xuICAgICAgICB0eXBlOiAnQ3JlZGl0Q2FyZElucHV0IScsXG4gICAgICAgIHZhbHVlOiBjYXJkXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gKChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM/LnNhdmVCaWxsaW5nQ2FyZCkgfHwge307XG5cbiAgICAgIGlmKCh1c2VyIGFzIGFueSk/LnVzZXJJZCAmJiAodXNlciBhcyBhbnkpLnVzZXJJZCA9PT0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uLnVzZXJJZCcpKSB7XG4gICAgICAgIHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIHVzZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlVQREFURV9JVEVNX1NVQ0NFU1MsXG4gICAgICAgIHVzZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXR1cm5Qcm9wcyA9IHNhbml0aXplVXNlclByb3BzKFtcbiAgICAgICdtb2RpZmllZCcsXG4gICAgICAnc3RyaXBlQ2FyZEJyYW5kJyxcbiAgICAgICdzdHJpcGVDYXJkSWQnLFxuICAgICAgJ3N0cmlwZUNhcmRMYXN0NCcsXG4gICAgICAndXNlcklkJyxcbiAgICAgICd1c2VybmFtZScsXG4gICAgICAuLi51c2VyUHJvcHNcbiAgICBdKTtcbiAgICBjb25zdCBzZXNzaW9uVXNlcklkID0gU3RyaW5nKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbi51c2VySWQnKSB8fCAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uKFxuICAgICAgICBmbHV4LFxuICAgICAgICAnc2F2ZUJpbGxpbmdDYXJkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKHNlc3Npb25Vc2VySWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBkZWxldGVCaWxsaW5nQ2FyZCA9IGFzeW5jIChcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSAoKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8uZGVsZXRlQmlsbGluZ0NhcmQpIHx8IHt9O1xuXG4gICAgICBpZigodXNlciBhcyBhbnkpPy51c2VySWQgJiYgKHVzZXIgYXMgYW55KS51c2VySWQgPT09IGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbi51c2VySWQnKSkge1xuICAgICAgICBzeW5jU3RvcmVkU2Vzc2lvbihmbHV4LCB1c2VyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5VUERBVEVfSVRFTV9TVUNDRVNTLFxuICAgICAgICB1c2VyXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV0dXJuUHJvcHMgPSBzYW5pdGl6ZVVzZXJQcm9wcyhbXG4gICAgICAnbW9kaWZpZWQnLFxuICAgICAgJ3N0cmlwZUNhcmRCcmFuZCcsXG4gICAgICAnc3RyaXBlQ2FyZElkJyxcbiAgICAgICdzdHJpcGVDYXJkTGFzdDQnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJJZCA9IFN0cmluZyhmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykgfHwgJycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2RlbGV0ZUJpbGxpbmdDYXJkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICB7fSxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKHNlc3Npb25Vc2VySWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1cGRhdGVQbGFuID0gYXN5bmMgKFxuICAgIHBsYW5JZDogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBuZXh0UGxhbklkID0gU3RyaW5nKHBsYW5JZCB8fCAnJykudHJpbSgpO1xuXG4gICAgaWYoIW5leHRQbGFuSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzdWJzY3JpcHRpb24gcGxhbklkIGlzIHJlcXVpcmVkIHRvIHVwZGF0ZSBhIHVzZXIgcGxhbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgcGxhbklkOiB7XG4gICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICB2YWx1ZTogbmV4dFBsYW5JZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9ICgoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy51cGRhdGVQbGFuKSB8fCB7fTtcblxuICAgICAgaWYoKHVzZXIgYXMgYW55KT8udXNlcklkICYmICh1c2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXNlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICdwbGFuRXhwaXJlcycsXG4gICAgICAncGxhbklkJyxcbiAgICAgICdwbGFuU3RhdHVzJyxcbiAgICAgICdwbGFuU3Vic2NyaXB0aW9uSWQnLFxuICAgICAgJ3N0cmlwZUNhcmRCcmFuZCcsXG4gICAgICAnc3RyaXBlQ2FyZElkJyxcbiAgICAgICdzdHJpcGVDYXJkTGFzdDQnLFxuICAgICAgJ3VzZXJBY2Nlc3MnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJJZCA9IFN0cmluZyhmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykgfHwgJycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3VwZGF0ZVBsYW4nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICByZXR1cm5Qcm9wcyxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoc2Vzc2lvblVzZXJJZCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3QgPSBhc3luYyAodXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3QnLCB7dXNlclByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IGxpc3QgPSAoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5nZXRVc2VyTGlzdCB8fCBbXTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsaXN0LCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhJbnZhbGlkRmllbGRSZXRyeShcbiAgICAgIChzYWZlVXNlclByb3BzKSA9PiBhcHBRdWVyeShmbHV4LCAnZ2V0VXNlckxpc3QnLCBEQVRBX1RZUEUsIHt9LCBzYWZlVXNlclByb3BzLCB7b25TdWNjZXNzfSksXG4gICAgICB1c2VyUHJvcHMsXG4gICAgICBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTXG4gICAgKTtcblxuICAgIHJldHVybiBzZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdCcsIHt1c2VyUHJvcHN9LCByZXN1bHQgYXMgVXNlcltdLCByZXF1ZXN0T3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3QgbGlzdEJ5TGF0ZXN0ID0gYXN5bmMgKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcgPSAnJyxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyW10+ID0+IHtcbiAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdEJ5TGF0ZXN0Jywge3VzZXJuYW1lLCBmcm9tLCB0bywgdXNlclByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBmcm9tOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogZnJvbVxuICAgICAgfSxcbiAgICAgIHRvOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogdG9cbiAgICAgIH0sXG4gICAgICB1c2VybmFtZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgdmFsdWU6IHVzZXJuYW1lXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8ubGlzdEJ5TGF0ZXN0IHx8IFtdO1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2xpc3QsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1N9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgICAgKHNhZmVVc2VyUHJvcHMpID0+IGFwcFF1ZXJ5KGZsdXgsICdsaXN0QnlMYXRlc3QnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBzYWZlVXNlclByb3BzLCB7b25TdWNjZXNzfSksXG4gICAgICB1c2VyUHJvcHMsXG4gICAgICBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTXG4gICAgKTtcblxuICAgIHJldHVybiBzZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdEJ5TGF0ZXN0Jywge3VzZXJuYW1lLCBmcm9tLCB0bywgdXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXJbXSwgcmVxdWVzdE9wdGlvbnMpO1xuICB9O1xuXG4gIGNvbnN0IGxpc3RCeUNvbm5lY3Rpb24gPSBhc3luYyAoXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcltdPiA9PlxuICAgIFtdXG4gIDtcblxuICBjb25zdCBsaXN0QnlSZWFjdGlvbnMgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICByZWFjdGlvbk5hbWVzOiBzdHJpbmdbXSxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICBwZXJzb25hUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyW10+ID0+XG4gICAgW11cbiAgO1xuXG4gIGNvbnN0IGxpc3RCeVRhZ3MgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lczogc3RyaW5nW10sXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgcGVyc29uYVByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3RCeVRhZ3MnLCB7dXNlcm5hbWUsIHRhZ05hbWVzLCBmcm9tLCB0bywgcGVyc29uYVByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBmcm9tOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogZnJvbVxuICAgICAgfSxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgdHlwZTogJ1tTdHJpbmchXScsXG4gICAgICAgIHZhbHVlOiB0YWdOYW1lc1xuICAgICAgfSxcbiAgICAgIHRvOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogdG9cbiAgICAgIH0sXG4gICAgICB1c2VybmFtZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgdmFsdWU6IHVzZXJuYW1lXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8ubGlzdEJ5VGFncyB8fCBbXTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsaXN0LCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhJbnZhbGlkRmllbGRSZXRyeShcbiAgICAgIChzYWZlVXNlclByb3BzKSA9PiBhcHBRdWVyeShmbHV4LCAnbGlzdEJ5VGFncycsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHBlcnNvbmFQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5saXN0QnlUYWdzJywge3VzZXJuYW1lLCB0YWdOYW1lcywgZnJvbSwgdG8sIHBlcnNvbmFQcm9wc30sIHJlc3VsdCBhcyBVc2VyW10sIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBzZWFyY2ggPSBhc3luYyAocXVlcnk6IHN0cmluZywgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLnNlYXJjaCcsIHtxdWVyeSwgdXNlclByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBxdWVyeToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgIHZhbHVlOiBxdWVyeVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgbGlzdCA9IChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM/LnNlYXJjaCB8fCBbXTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsaXN0LCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhJbnZhbGlkRmllbGRSZXRyeShcbiAgICAgIChzYWZlVXNlclByb3BzKSA9PiBhcHBRdWVyeShmbHV4LCAnc2VhcmNoJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgc2FmZVVzZXJQcm9wcywge29uU3VjY2Vzc30pLFxuICAgICAgdXNlclByb3BzLFxuICAgICAgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEU1xuICAgICk7XG5cbiAgICByZXR1cm4gc2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLnNlYXJjaCcsIHtxdWVyeSwgdXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXJbXSwgcmVxdWVzdE9wdGlvbnMpO1xuICB9O1xuXG4gIGNvbnN0IGlzTG9nZ2VkSW4gPSAoKTogYm9vbGVhbiA9PiBpc0xvZ2dlZEluV2l0aFN0b3JhZ2UoZmx1eCk7XG5cbiAgY29uc3QgY3VycmVudEF1dGhlbnRpY2F0ZWRVc2VyID0gYXN5bmMgKHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGh5ZHJhdGVTZXNzaW9uRnJvbVN0b3JhZ2UoZmx1eCk7XG4gICAgcmV0dXJuIChzZXNzaW9uIHx8IHt9KSBhcyBVc2VyO1xuICB9O1xuXG4gIGNvbnN0IGN1cnJlbnRVc2VyID0gYXN5bmMgKHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxVc2VyPiA9PiBjdXJyZW50QXV0aGVudGljYXRlZFVzZXIocmVxdWVzdE9wdGlvbnMpO1xuXG4gIGNvbnN0IHJlZnJlc2hTZXNzaW9uQWN0aW9uID0gYXN5bmMgKHRva2VuPzogc3RyaW5nLCBleHBpcmVzPzogbnVtYmVyLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWZyZXNoU2Vzc2lvbihmbHV4LCB0b2tlbiwgZXhwaXJlcyk7XG4gICAgcmV0dXJuIChyZXN1bHQ/LnJlZnJlc2hTZXNzaW9uIHx8IHt9KSBhcyBTZXNzaW9uVHlwZTtcbiAgfTtcblxuICBjb25zdCBzaWduSW4gPSBhc3luYyAoXG4gICAgdXNlcjogUGFydGlhbDxVc2VyPixcbiAgICBleHBpcmVzPzogbnVtYmVyLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgICBjb25zdCB7ZW1haWwsIHBob25lLCB1c2VybmFtZSwgcGFzc3dvcmR9ID0gdXNlcjtcbiAgICBsZXQgdXNlcklucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGVnYWN5VmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCB7dHlwZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93bn0+IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYodXNlcm5hbWUgJiYgcGFzc3dvcmQpIHtcbiAgICAgIHVzZXJJbnB1dCA9IHtcbiAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgIHVzZXJuYW1lXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZihlbWFpbCAmJiBwYXNzd29yZCkge1xuICAgICAgdXNlcklucHV0ID0ge1xuICAgICAgICBlbWFpbCxcbiAgICAgICAgcGFzc3dvcmRcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmKHBob25lICYmIHBhc3N3b3JkKSB7XG4gICAgICB1c2VySW5wdXQgPSB7XG4gICAgICAgIHBhc3N3b3JkLFxuICAgICAgICBwaG9uZVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VybmFtZSwgZW1haWwsIG9yIHBob25lIG51bWJlciBhbmQgcGFzc3dvcmQgYXJlIHJlcXVpcmVkIHRvIHNpZ24gaW4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWdGcm9tRmx1eChmbHV4KTtcbiAgICBjb25zdCByZXF1ZXN0ZWRFeHBpcmVzID0gTWF0aC5tYXgoMSwgTnVtYmVyKGV4cGlyZXMgfHwgY29uZmlnLmFwcD8uc2Vzc2lvbj8ubWF4TWludXRlcyB8fCAxNSkpO1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzV2l0aFVzZXJJbnB1dCA9IHtcbiAgICAgIGV4cGlyZXM6IHtcbiAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgIHZhbHVlOiByZXF1ZXN0ZWRFeHBpcmVzXG4gICAgICB9LFxuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB1c2VySW5wdXRcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gYXN5bmMgKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pOiBQcm9taXNlPEZsdXhBY3Rpb24+ID0+IHtcbiAgICAgIGNvbnN0IHVzZXJzID0gKGRhdGEgYXMgYW55KT8udXNlcnM7XG4gICAgICBjb25zdCBzZXNzaW9uRGF0YSA9IG5vcm1hbGl6ZVNlc3Npb24odXNlcnM/LnNpZ25JbiB8fCB7fSk7XG4gICAgICBjb25zdCBzdG9yZWRTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgc2Vzc2lvbkRhdGEpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2Vzc2lvbjogc3RvcmVkU2Vzc2lvbixcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9JTl9TVUNDRVNTXG4gICAgICB9IGFzIEZsdXhBY3Rpb247XG4gICAgfTtcblxuICAgIGNvbnN0IHBlcmZvcm1TaWduSW4gPSBhc3luYyAocXVlcnlWYXJpYWJsZXM6IGFueSk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb25SZXN1bHQgPSBhd2FpdCBwdWJsaWNNdXRhdGlvbjxTZXNzaW9uVHlwZSAmIFVzZXJBcGlSZXN1bHRzVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdzaWduSW4nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbJ2V4cGlyZXMnLCAnaXNzdWVkJywgJ3Rva2VuJywgJ3VzZXJJZCcsICd1c2VybmFtZSddLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJhc2VTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgZ2V0U2Vzc2lvblBheWxvYWQoc2Vzc2lvblJlc3VsdCkpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoeWRyYXRlZFNlc3Npb24gPSBhd2FpdCBzZXNzaW9uKFsndXNlcklkJywgJ3BlcnNvbmFJZCcsICd1c2VyQWNjZXNzJywgJ3VzZXJuYW1lJ10sIHJlcXVlc3RPcHRpb25zKTtcbiAgICAgICAgYXdhaXQgc3luY1BlcnNvbmFUYWdzVG9TZXNzaW9uKGZsdXgsIFN0cmluZygoaHlkcmF0ZWRTZXNzaW9uIGFzIGFueSk/LnBlcnNvbmFJZCB8fCAnJykpO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBjb25zdCBmYWxsYmFja1Nlc3Npb24gPSBhd2FpdCBzeW5jU3RvcmVkU2Vzc2lvbihmbHV4LCBiYXNlU2Vzc2lvbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe1xuICAgICAgICAgIHNlc3Npb246IGZhbGxiYWNrU2Vzc2lvbixcbiAgICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX0lOX1NVQ0NFU1NcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFja1Nlc3Npb247XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbmFsU2Vzc2lvbiA9IGF3YWl0IHN5bmNTdG9yZWRTZXNzaW9uKFxuICAgICAgICBmbHV4LFxuICAgICAgICAoZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJywgYmFzZVNlc3Npb24pIHx8IGJhc2VTZXNzaW9uKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgKTtcbiAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe1xuICAgICAgICBzZXNzaW9uOiBmaW5hbFNlc3Npb24sXG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fSU5fU1VDQ0VTU1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmluYWxTZXNzaW9uO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHBlcmZvcm1TaWduSW4ocXVlcnlWYXJpYWJsZXNXaXRoVXNlcklucHV0KTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9JTl9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoU3RyaW5nKCh1c2VyIGFzIGFueSk/LnVzZXJJZCB8fCAnJykpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzaWduT3V0ID0gYXN5bmMgKHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgYXdhaXQgY2xlYXJQZXJzaXN0ZWRTZXNzaW9uKGZsdXgpO1xuICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe3Nlc3Npb246IHt9LCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX09VVF9TVUNDRVNTfSk7XG4gICAgYXdhaXQgY2xlYXJVc2VyUmVxdWVzdENhY2hlcygpO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IGNvbmZpcm1TaWduVXAgPSBhc3luYyAoY29kZTogc3RyaW5nLCB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJywgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPGJvb2xlYW4+ID0+XG4gICAgdHJ1ZTtcblxuICBjb25zdCBmb3Jnb3RQYXNzd29yZCA9IGFzeW5jICh1c2VybmFtZTogc3RyaW5nLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZW1haWw6IHVzZXJuYW1lLFxuICAgICAgICAgIHBob25lOiB1c2VybmFtZSxcbiAgICAgICAgICB1c2VybmFtZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhPzogVXNlckFwaVJlc3VsdHNUeXBlKSA9PiB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gISFkYXRhPy51c2Vycz8uZm9yZ290UGFzc3dvcmQ7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IHN1Y2Nlc3MgPyBVU0VSX0NPTlNUQU5UUy5GT1JHT1RfUEFTU1dPUkRfU1VDQ0VTUyA6IFVTRVJfQ09OU1RBTlRTLkZPUkdPVF9QQVNTV09SRF9FUlJPUlxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KGZsdXgsICdmb3Jnb3RQYXNzd29yZCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFtdLCB7b25TdWNjZXNzfSkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LmZvcmdvdFBhc3N3b3JkO1xuICAgICAgaWYoIXN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3Jnb3RfcGFzc3dvcmRfZmFpbGVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBzZW5kVmVyaWZpY2F0aW9uRW1haWwgPSBhc3luYyAoZW1haWw6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVtYWlsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE/OiBVc2VyQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAhIWRhdGE/LnVzZXJzPy5zZW5kVmVyaWZpY2F0aW9uRW1haWw7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IHN1Y2Nlc3MgPyBVU0VSX0NPTlNUQU5UUy5DT05GSVJNX1NJR05fVVBfU1VDQ0VTUyA6IFVTRVJfQ09OU1RBTlRTLkNPTkZJUk1fU0lHTl9VUF9FUlJPUlxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgZmx1eCxcbiAgICAgICdzZW5kVmVyaWZpY2F0aW9uRW1haWwnLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICBbXSxcbiAgICAgIHtvblN1Y2Nlc3N9XG4gICAgKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gISFkYXRhPy51c2Vycz8uc2VuZFZlcmlmaWNhdGlvbkVtYWlsO1xuICAgICAgaWYoIXN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZW5kX3ZlcmlmaWNhdGlvbl9lbWFpbF9mYWlsZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHJlc2V0UGFzc3dvcmQgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICBwYXNzd29yZDogc3RyaW5nLFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJyxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIGNvZGU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogY29kZVxuICAgICAgfSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIC4uLih0eXBlID09PSAnZW1haWwnID8ge2VtYWlsOiB1c2VybmFtZX0gOiB7cGhvbmU6IHVzZXJuYW1lfSksXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YT86IFVzZXJBcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LnJlc2V0UGFzc3dvcmQ7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IHN1Y2Nlc3MgPyBVU0VSX0NPTlNUQU5UUy5SRVNFVF9QQVNTV09SRF9TVUNDRVNTIDogVVNFUl9DT05TVEFOVFMuUkVTRVRfUEFTU1dPUkRfRVJST1JcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gcHVibGljTXV0YXRpb248VXNlckFwaVJlc3VsdHNUeXBlPihmbHV4LCAncmVzZXRQYXNzd29yZCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFtdLCB7b25TdWNjZXNzfSkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LnJlc2V0UGFzc3dvcmQ7XG4gICAgICBpZighc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jlc2V0X3Bhc3N3b3JkX2ZhaWxlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlUGFzc3dvcmQgPSBhc3luYyAocGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPGJvb2xlYW4+ID0+XG4gICAgdHJ1ZVxuICA7XG5cbiAgcmV0dXJuIHtcbiAgICBhZGRVc2VyLFxuICAgIGNvbmZpcm1Db2RlLFxuICAgIGNvbmZpcm1TaWduVXAsXG4gICAgY3VycmVudEF1dGhlbnRpY2F0ZWRVc2VyLFxuICAgIGN1cnJlbnRVc2VyLFxuICAgIGRlbGV0ZUJpbGxpbmdDYXJkLFxuICAgIGxpc3QsXG4gICAgZm9yZ290UGFzc3dvcmQsXG4gICAgaXNMb2dnZWRJbixcbiAgICBpdGVtQnlJZCxcbiAgICBsaXN0QnlDb25uZWN0aW9uLFxuICAgIGxpc3RCeUxhdGVzdCxcbiAgICBsaXN0QnlSZWFjdGlvbnMsXG4gICAgbGlzdEJ5VGFncyxcbiAgICByZWZyZXNoU2Vzc2lvbjogcmVmcmVzaFNlc3Npb25BY3Rpb24sXG4gICAgcmVtb3ZlLFxuICAgIHJlc2V0UGFzc3dvcmQsXG4gICAgc2F2ZUJpbGxpbmdDYXJkLFxuICAgIHNlYXJjaCxcbiAgICBzZW5kVmVyaWZpY2F0aW9uRW1haWwsXG4gICAgc2Vzc2lvbixcbiAgICBzaWduSW4sXG4gICAgc2lnbk91dCxcbiAgICBzaWduVXAsXG4gICAgdXBkYXRlUGFzc3dvcmQsXG4gICAgdXBkYXRlVXNlcixcbiAgICB1cGRhdGVQbGFuLFxuICAgIHVwZGF0ZVVzZXJBZGFwdGVyOiB1c2VyQmFzZS51cGRhdGVBZGFwdGVyLFxuICAgIHVwZGF0ZVVzZXJBZGFwdGVyT3B0aW9uczogdXNlckJhc2UudXBkYXRlT3B0aW9uc1xuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJ2YWxpZGF0ZVVzZXJJbnB1dCIsIlVTRVJfQ09OU1RBTlRTIiwiYXBwTXV0YXRpb24iLCJhcHBRdWVyeSIsInB1YmxpY011dGF0aW9uIiwicmVmcmVzaFNlc3Npb24iLCJjcmVhdGVCYXNlQWN0aW9ucyIsImNsZWFyUGVyc2lzdGVkU2Vzc2lvbiIsImh5ZHJhdGVTZXNzaW9uRnJvbVN0b3JhZ2UiLCJpc0xvZ2dlZEluIiwiaXNMb2dnZWRJbldpdGhTdG9yYWdlIiwibm9ybWFsaXplU2Vzc2lvbiIsInN0b3JlU2Vzc2lvbiIsImdldENvbmZpZ0Zyb21GbHV4IiwiY2xlYXJDYWNoZWRSZXF1ZXN0IiwiZ2V0Q2FjaGVkUmVxdWVzdCIsInNldENhY2hlZFJlcXVlc3QiLCJzeW5jUGVyc29uYVRhZ3NUb1Nlc3Npb24iLCJEQVRBX1RZUEUiLCJERUZBVUxUX1VTRVJfUVVFUllfRklFTERTIiwiU0VOU0lUSVZFX1VTRVJfRklFTERTIiwiU2V0IiwiSU5WQUxJRF9GSUVMRF9SRUdFWCIsImhhc1Nlc3Npb25JZGVudGl0eSIsInVzZXIiLCJfaWQiLCJ1c2VySWQiLCJ1c2VybmFtZSIsImVtYWlsIiwic2FuaXRpemVVcGRhdGVVc2VySW5wdXQiLCJ1c2VySW5wdXQiLCJjdXJyZW50U2Vzc2lvbiIsIm5leHRVc2VyIiwiT2JqZWN0IiwiZW50cmllcyIsInJlZHVjZSIsImZpZWxkIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJwYXNzd29yZCIsIlN0cmluZyIsInRyaW0iLCJjdXJyZW50VmFsdWUiLCJzeW5jU3RvcmVkU2Vzc2lvbiIsImZsdXgiLCJzZXNzaW9uUGF0Y2giLCJnZXRTdGF0ZSIsImdldFNlc3Npb25QYXlsb2FkIiwicGF5bG9hZCIsInNlc3Npb24iLCJnZXRGaWVsZFJvb3QiLCJ0cmltbWVkIiwibWF0Y2giLCJzYW5pdGl6ZVVzZXJQcm9wcyIsInByb3BzIiwiZmFsbGJhY2tQcm9wcyIsInNlZW4iLCJzYW5pdGl6ZWQiLCJsaXN0Iiwicm9vdCIsImhhcyIsImFkZCIsInB1c2giLCJsZW5ndGgiLCJnZXRJbnZhbGlkRmllbGRzIiwiZXJyb3IiLCJlcnJvcnMiLCJzb3VyY2UiLCJpbnZhbGlkRmllbGRzIiwiZm9yRWFjaCIsIml0ZW0iLCJtZXNzYWdlIiwiZXhlYyIsImxhc3RJbmRleCIsIndpdGhJbnZhbGlkRmllbGRSZXRyeSIsInJlcXVlc3RXaXRoUHJvcHMiLCJzYWZlUHJvcHMiLCJzaXplIiwicmV0cnlQcm9wcyIsImZpbHRlciIsImRlZmF1bHRVc2VyVmFsaWRhdG9yIiwiaW5wdXQiLCJvcHRpb25zIiwidmFsaWRhdGVkIiwic3RyaWN0IiwiRXJyb3IiLCJjcmVhdGVVc2VyQWN0aW9ucyIsInVzZXJCYXNlIiwiYWRhcHRlciIsInVzZXJBZGFwdGVyIiwiYWRhcHRlck9wdGlvbnMiLCJ1c2VyQWRhcHRlck9wdGlvbnMiLCJjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzIiwiYWRkVXNlciIsInVzZXJQcm9wcyIsInJlcXVlc3RPcHRpb25zIiwicXVlcnlWYXJpYWJsZXMiLCJ0eXBlIiwib25TdWNjZXNzIiwiZGF0YSIsInVzZXJzIiwiZGlzcGF0Y2giLCJBRERfSVRFTV9TVUNDRVNTIiwicmV0dXJuUHJvcHMiLCJzaWduVXAiLCJleHBpcmVzIiwiU0lHTl9VUF9TVUNDRVNTIiwiU0lHTl9VUF9FUlJPUiIsInVwZGF0ZVVzZXIiLCJ1cGRhdGVJbnB1dCIsImJpcnRoZGF0ZSIsImRvYiIsImZpcnN0TmFtZSIsImdlbmRlciIsImxhc3ROYW1lIiwibWFpbGluZ0xpc3QiLCJwaG9uZSIsImxlZ2FjeVVzZXIiLCJ1cGRhdGUiLCJ1cGRhdGVkVXNlciIsIlVQREFURV9JVEVNX1NVQ0NFU1MiLCJjb25maXJtQ29kZSIsImNvZGUiLCJjb25maXJtZWQiLCJDT05GSVJNX1NJR05fVVBfU1VDQ0VTUyIsInJlbW92ZSIsIlJFTU9WRV9JVEVNX1NVQ0NFU1MiLCJzZXNzaW9uUHJvcHMiLCJzZXNzaW9uRGF0YSIsImdldFVzZXJCeVNlc3Npb24iLCJHRVRfU0VTU0lPTl9FUlJPUiIsIm5leHRTZXNzaW9uIiwiR0VUX1NFU1NJT05fU1VDQ0VTUyIsInBlcnNvbmFJZCIsIml0ZW1CeUlkIiwiY2FjaGVkUmVzdWx0IiwiZ2V0VXNlckJ5SWQiLCJHRVRfSVRFTV9TVUNDRVNTIiwicmVzdWx0Iiwic2FmZVVzZXJQcm9wcyIsInNhdmVCaWxsaW5nQ2FyZCIsImNhcmQiLCJzZXNzaW9uVXNlcklkIiwiZGVsZXRlQmlsbGluZ0NhcmQiLCJ1cGRhdGVQbGFuIiwicGxhbklkIiwibmV4dFBsYW5JZCIsImdldFVzZXJMaXN0IiwiR0VUX0xJU1RfU1VDQ0VTUyIsImxpc3RCeUxhdGVzdCIsImZyb20iLCJ0byIsImxpc3RCeUNvbm5lY3Rpb24iLCJsaXN0QnlSZWFjdGlvbnMiLCJyZWFjdGlvbk5hbWVzIiwicGVyc29uYVByb3BzIiwibGlzdEJ5VGFncyIsInRhZ05hbWVzIiwidGFncyIsInNlYXJjaCIsInF1ZXJ5IiwiY3VycmVudEF1dGhlbnRpY2F0ZWRVc2VyIiwiY3VycmVudFVzZXIiLCJyZWZyZXNoU2Vzc2lvbkFjdGlvbiIsInRva2VuIiwic2lnbkluIiwibGVnYWN5VmFyaWFibGVzIiwiY29uZmlnIiwicmVxdWVzdGVkRXhwaXJlcyIsIk1hdGgiLCJtYXgiLCJOdW1iZXIiLCJhcHAiLCJtYXhNaW51dGVzIiwicXVlcnlWYXJpYWJsZXNXaXRoVXNlcklucHV0Iiwic3RvcmVkU2Vzc2lvbiIsIlNJR05fSU5fU1VDQ0VTUyIsInBlcmZvcm1TaWduSW4iLCJzZXNzaW9uUmVzdWx0IiwiYmFzZVNlc3Npb24iLCJoeWRyYXRlZFNlc3Npb24iLCJmYWxsYmFja1Nlc3Npb24iLCJmaW5hbFNlc3Npb24iLCJTSUdOX0lOX0VSUk9SIiwic2lnbk91dCIsIlNJR05fT1VUX1NVQ0NFU1MiLCJjb25maXJtU2lnblVwIiwiZm9yZ290UGFzc3dvcmQiLCJzdWNjZXNzIiwiRk9SR09UX1BBU1NXT1JEX1NVQ0NFU1MiLCJGT1JHT1RfUEFTU1dPUkRfRVJST1IiLCJ0aGVuIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiQ09ORklSTV9TSUdOX1VQX0VSUk9SIiwicmVzZXRQYXNzd29yZCIsIlJFU0VUX1BBU1NXT1JEX1NVQ0NFU1MiLCJSRVNFVF9QQVNTV09SRF9FUlJPUiIsInVwZGF0ZVBhc3N3b3JkIiwibmV3UGFzc3dvcmQiLCJ1cGRhdGVVc2VyQWRhcHRlciIsInVwZGF0ZUFkYXB0ZXIiLCJ1cGRhdGVVc2VyQWRhcHRlck9wdGlvbnMiLCJ1cGRhdGVPcHRpb25zIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxpQkFBaUIsUUFBTyw0Q0FBNEM7QUFDNUUsU0FBUUMsY0FBYyxRQUFPLDRCQUE0QjtBQUN6RCxTQUFRQyxXQUFXLEVBQUVDLFFBQVEsRUFBRUMsY0FBYyxFQUFFQyxjQUFjLFFBQU8scUJBQXFCO0FBQ3pGLFNBQVFDLGlCQUFpQixRQUFPLG1DQUFtQztB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
|